diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f84c303dd..537c02446 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -12,7 +12,8 @@ $ cd minio ``` ### Compiling Minio from source -Minio uses ``Makefile`` to wrap around some of the limitations of ``go`` build system. To compile Minio source, simply change to your workspace folder and type ``make``. +Minio uses ``Makefile`` to wrap around some of redundant checks done through command line. + ```sh $ make Checking if proper environment variables are set.. Done diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md deleted file mode 100644 index d0735ac00..000000000 --- a/CONTRIBUTORS.md +++ /dev/null @@ -1,10 +0,0 @@ -## Contributors - - -- Anand Babu (AB) Periasamy -- Anis Elleuch -- Frederick F. Kautz IV -- Harshavardhana -- Krishna Srinivas -- Matthew Farrellee -- Nate Rosenblum diff --git a/Dockerfile b/Dockerfile index 5ec2d24b2..34fb0e9f5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,8 +16,7 @@ RUN apt-get update -y && apt-get install -y -q \ curl \ git \ build-essential \ - ca-certificates \ - yasm + ca-certificates RUN curl -O -s https://storage.googleapis.com/golang/${GOLANG_TARBALL} && \ tar -xzf ${GOLANG_TARBALL} -C ${GOROOT%*go*} && \ @@ -34,6 +33,6 @@ RUN apt-get remove -y build-essential curl git && \ USER minio -EXPOSE 9000 9001 +EXPOSE 9000 CMD ["sh", "-c", "${GOPATH}/bin/minio server"] diff --git a/INSTALLGO.md b/INSTALLGO.md index 2f4af7a18..05bf4437d 100644 --- a/INSTALLGO.md +++ b/INSTALLGO.md @@ -2,9 +2,9 @@ ### Build Dependencies This installation document assumes Ubuntu 14.04+ on x86-64 platform. -##### Install Git, GCC, yasm +##### Install Git, GCC ```sh -$ sudo apt-get install git build-essential yasm +$ sudo apt-get install git build-essential ``` ##### Install Go 1.5+ @@ -39,7 +39,7 @@ $ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/maste ##### Install Git, Python ```sh -$ brew install git python yasm +$ brew install git python ``` ##### Install Go 1.5+ diff --git a/Makefile b/Makefile index 69efa7e8d..37fdf82fe 100644 --- a/Makefile +++ b/Makefile @@ -6,12 +6,13 @@ checkdeps: checkgopath: @echo "Checking if project is at ${GOPATH}" - @for mcpath in $(echo ${GOPATH} | sed 's/:/\n/g'); do if [ ! -d ${mcpath}/src/github.com/minio/minio ]; then echo "Project not found in ${mcpath}, please follow instructions provided at https://github.com/minio/minio/blob/master/CONTRIBUTING.md#setup-your-minio-github-repository" && exit 1; fi done + @for miniofspath in $(echo ${GOPATH} | sed 's/:/\n/g'); do if [ ! -d ${mcpath}/src/github.com/minio/minio ]; then echo "Project not found in ${miniofspath}, please follow instructions provided at https://github.com/minio/minio/blob/master/CONTRIBUTING.md#setup-your-minio-github-repository" && exit 1; fi done getdeps: checkdeps checkgopath @go get github.com/golang/lint/golint && echo "Installed golint:" @go get golang.org/x/tools/cmd/vet && echo "Installed vet:" @go get github.com/fzipp/gocyclo && echo "Installed gocyclo:" + @go get -u github.com/remyoudompheng/go-misc/deadcode && echo "Installed deadcode:" verifiers: getdeps vet fmt lint cyclo @@ -34,12 +35,11 @@ lint: cyclo: @echo "Running $@:" - @GO15VENDOREXPERIMENT=1 gocyclo -over 25 *.go - @GO15VENDOREXPERIMENT=1 gocyclo -over 25 pkg + @GO15VENDOREXPERIMENT=1 gocyclo -over 50 *.go + @GO15VENDOREXPERIMENT=1 gocyclo -over 50 pkg build: getdeps verifiers - @echo "Installing minio:" - @GO15VENDOREXPERIMENT=1 go generate ./... + @echo "Installing minio:" #@GO15VENDOREXPERIMENT=1 deadcode test: build @echo "Running all testing:" @@ -69,4 +69,3 @@ clean: @echo "Cleaning up all the generated files:" @rm -fv cover.out @rm -fv minio - @rm -fv pkg/erasure/*.syso diff --git a/README.md b/README.md index d53feeb49..a989a0fdc 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -## Minio Server [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/minio/minio?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +## Minio [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/minio/minio?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -Minio is a minimal cloud storage server written in Golang and licensed under [Apache license v2](./LICENSE). Minio is compatible with Amazon S3 APIs. [![Build Status](https://travis-ci.org/minio/minio.svg?branch=master)](https://travis-ci.org/minio/minio) +Minio is a minimal cloud storage server for Micro Services & Magnetic Disks. Written in Golang and licensed under [Apache license v2](./LICENSE). Compatible with Amazon S3 APIs. ## Minio Client @@ -11,64 +11,54 @@ Minio is a minimal cloud storage server written in Golang and licensed under [Ap - [Java Library](https://github.com/minio/minio-java) - [Nodejs Library](https://github.com/minio/minio-js) - [Python Library](https://github.com/minio/minio-py) +- [.Net Library](https://github.com/minio/minio-dotnet) -## Server Roadmap -~~~ -Storage Backend: -- Donut: Erasure coded backend. - - Status: Standalone mode complete. -Storage Operations: -- Collective: - - Status: Work in progress. +### Install [![Build Status](https://travis-ci.org/minio/minio.svg?branch=master)](https://travis-ci.org/minio/minio)[![Build status](https://ci.appveyor.com/api/projects/status/k61d0v3ritbwm2su?svg=true)](https://ci.appveyor.com/project/harshavardhana/minio) -Storage Management: -- WebCLI: - - Status: Work in progress. -- Authentication: - - Status: Work in progress. -- Admin Console: - - Status: Work in progress. -- User Console: - - Status: Work in progress. -- Logging: - - Status: Work in progress. -~~~ - - -### Install - -
-NOTE: If you happen to compile from source code, following options are not available anymore. Minio master branch is going through lots of rapid changes, documentation will be updated subsequently. -
- -#### GNU/Linux - -Download ``minio`` from https://dl.minio.io:9000/updates/2015/Jun/linux-amd64/minio +#### Linux, OS X, Windows ~~~ -$ wget https://dl.minio.io:9000/updates/2015/Jun/linux-amd64/minio -$ chmod +x minio -$ ./minio mode memory limit 12GB expire 2h -~~~ - -#### OS X - -Download ``minio`` from https://dl.minio.io:9000/updates/2015/Jun/darwin-amd64/minio - -~~~ -$ wget https://dl.minio.io:9000/updates/2015/Jun/darwin-amd64/minio -$ chmod +x minio -$ ./minio mode memory limit 12GB expire 2h +$ go get github.com/minio/minio ~~~ ### How to use Minio? -[![asciicast](https://asciinema.org/a/21575.png)](https://asciinema.org/a/21575) +~~~ +$ minio server +NAME: + minio server - Start Minio cloud storage server. + +USAGE: + minio server PATH + +EXAMPLES: + 1. Start minio server on Linux. + $ minio server /home/shared + + 2. Start minio server on Windows. + $ minio server C:\MyShare + + 3. Start minio server bound to a specific IP:PORT, when you have multiple network interfaces. + $ minio --address 192.168.1.101:9000 /home/shared +~~~ + +~~~ +$ minio server ~/Photos +AccessKey: G5GJRH51R2HSUWYPGIX5 SecretKey: uxhBC1Yscut3/u81l5L8Yp636ZUk32N4m/gFASuZ + +To configure Minio Client. + + $ wget https://dl.minio.io:9000/updates/2015/Oct/darwin-amd64/mc + $ chmod 755 mc + $ ./mc config host add localhost:9000 G5GJRH51R2HSUWYPGIX5 uxhBC1Yscut3/u81l5L8Yp636ZUk32N4m/gFASuZ + $ ./mc mb localhost/photobucket + $ ./mc cp ~/Photos... localhost/photobucket + +Starting minio server: +Listening on http://127.0.0.1:9000 +Listening on http://172.30.2.17:9000 +~~~ ### Contribute to Minio Project Please follow Minio [Contributor's Guide](./CONTRIBUTING.md) -### Jobs -If you think in Lisp or Haskell and hack in go, you would blend right in. Send your github link to callhome@minio.io. - - diff --git a/server-api-definitions.go b/api-definitions.go similarity index 99% rename from server-api-definitions.go rename to api-definitions.go index 4a890f033..ee2d65cb6 100644 --- a/server-api-definitions.go +++ b/api-definitions.go @@ -1,5 +1,5 @@ /* - * Minio Cloud Storage, (C) 2014 Minio, Inc. + * Minio Cloud Storage, (C) 2015 Minio, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/server-api-errors.go b/api-errors.go similarity index 97% rename from server-api-errors.go rename to api-errors.go index b5682b849..7c9e5bb09 100644 --- a/server-api-errors.go +++ b/api-errors.go @@ -65,12 +65,12 @@ const ( NotImplemented RequestTimeTooSkewed SignatureDoesNotMatch - TooManyBuckets MethodNotAllowed InvalidPart InvalidPartOrder AuthorizationHeaderMalformed MalformedPOSTRequest + BucketNotEmpty ) // Error codes, non exhaustive list - standard HTTP errors @@ -200,11 +200,6 @@ var errorCodeResponse = map[int]APIError{ Description: "The request signature we calculated does not match the signature you provided.", HTTPStatusCode: http.StatusForbidden, }, - TooManyBuckets: { - Code: "TooManyBuckets", - Description: "You have attempted to create more buckets than allowed.", - HTTPStatusCode: http.StatusBadRequest, - }, MethodNotAllowed: { Code: "MethodNotAllowed", Description: "The specified method is not allowed against this resource.", @@ -235,6 +230,11 @@ var errorCodeResponse = map[int]APIError{ Description: "The body of your POST request is not well-formed multipart/form-data.", HTTPStatusCode: http.StatusBadRequest, }, + BucketNotEmpty: { + Code: "BucketNotEmpty", + Description: "The bucket you tried to delete is not empty.", + HTTPStatusCode: http.StatusConflict, + }, } // errorCodeError provides errorCode to Error. It returns empty if the code provided is unknown diff --git a/server-api-headers.go b/api-headers.go similarity index 91% rename from server-api-headers.go rename to api-headers.go index 8564d2db1..fdeb64626 100644 --- a/server-api-headers.go +++ b/api-headers.go @@ -24,7 +24,7 @@ import ( "runtime" "strconv" - "github.com/minio/minio/pkg/donut" + "github.com/minio/minio/pkg/fs" ) //// helpers @@ -63,7 +63,7 @@ func encodeErrorResponse(response interface{}) []byte { } // Write object header -func setObjectHeaders(w http.ResponseWriter, metadata donut.ObjectMetadata, contentRange *httpRange) { +func setObjectHeaders(w http.ResponseWriter, metadata fs.ObjectMetadata, contentRange *httpRange) { // set common headers if contentRange != nil { if contentRange.length > 0 { @@ -77,8 +77,8 @@ func setObjectHeaders(w http.ResponseWriter, metadata donut.ObjectMetadata, cont // set object headers lastModified := metadata.Created.Format(http.TimeFormat) // object related headers - w.Header().Set("Content-Type", metadata.Metadata["contentType"]) - w.Header().Set("ETag", "\""+metadata.MD5Sum+"\"") + w.Header().Set("Content-Type", "application/octet-stream") + w.Header().Set("ETag", "\""+metadata.Md5+"\"") w.Header().Set("Last-Modified", lastModified) // set content range diff --git a/server-api-resources.go b/api-resources.go similarity index 84% rename from server-api-resources.go rename to api-resources.go index d71fd4eb7..41a930530 100644 --- a/server-api-resources.go +++ b/api-resources.go @@ -20,11 +20,11 @@ import ( "net/url" "strconv" - "github.com/minio/minio/pkg/donut" + "github.com/minio/minio/pkg/fs" ) // parse bucket url queries -func getBucketResources(values url.Values) (v donut.BucketResourcesMetadata) { +func getBucketResources(values url.Values) (v fs.BucketResourcesMetadata) { v.Prefix = values.Get("prefix") v.Marker = values.Get("marker") v.Maxkeys, _ = strconv.Atoi(values.Get("max-keys")) @@ -34,7 +34,7 @@ func getBucketResources(values url.Values) (v donut.BucketResourcesMetadata) { } // part bucket url queries for ?uploads -func getBucketMultipartResources(values url.Values) (v donut.BucketMultipartResourcesMetadata) { +func getBucketMultipartResources(values url.Values) (v fs.BucketMultipartResourcesMetadata) { v.Prefix = values.Get("prefix") v.KeyMarker = values.Get("key-marker") v.MaxUploads, _ = strconv.Atoi(values.Get("max-uploads")) @@ -45,7 +45,7 @@ func getBucketMultipartResources(values url.Values) (v donut.BucketMultipartReso } // parse object url queries -func getObjectResources(values url.Values) (v donut.ObjectResourcesMetadata) { +func getObjectResources(values url.Values) (v fs.ObjectResourcesMetadata) { v.UploadID = values.Get("uploadId") v.PartNumberMarker, _ = strconv.Atoi(values.Get("part-number-marker")) v.MaxParts, _ = strconv.Atoi(values.Get("max-parts")) diff --git a/server-api-response.go b/api-response.go similarity index 92% rename from server-api-response.go rename to api-response.go index 97fc7a613..d15ad634d 100644 --- a/server-api-response.go +++ b/api-response.go @@ -19,7 +19,7 @@ package main import ( "net/http" - "github.com/minio/minio/pkg/donut" + "github.com/minio/minio/pkg/fs" ) // Reply date format @@ -33,7 +33,7 @@ const ( // // output: // populated struct that can be serialized to match xml and json api spec output -func generateListBucketsResponse(buckets []donut.BucketMetadata) ListBucketsResponse { +func generateListBucketsResponse(buckets []fs.BucketMetadata) ListBucketsResponse { var listbuckets []*Bucket var data = ListBucketsResponse{} var owner = Owner{} @@ -55,7 +55,7 @@ func generateListBucketsResponse(buckets []donut.BucketMetadata) ListBucketsResp } // generates an AccessControlPolicy response for the said ACL. -func generateAccessControlPolicyResponse(acl donut.BucketACL) AccessControlPolicyResponse { +func generateAccessControlPolicyResponse(acl fs.BucketACL) AccessControlPolicyResponse { accessCtrlPolicyResponse := AccessControlPolicyResponse{} accessCtrlPolicyResponse.Owner = Owner{ ID: "minio", @@ -92,7 +92,7 @@ func generateAccessControlPolicyResponse(acl donut.BucketACL) AccessControlPolic } // generates an ListObjects response for the said bucket with other enumerated options. -func generateListObjectsResponse(bucket string, objects []donut.ObjectMetadata, bucketResources donut.BucketResourcesMetadata) ListObjectsResponse { +func generateListObjectsResponse(bucket string, objects []fs.ObjectMetadata, bucketResources fs.BucketResourcesMetadata) ListObjectsResponse { var contents []*Object var prefixes []*CommonPrefix var owner = Owner{} @@ -108,7 +108,7 @@ func generateListObjectsResponse(bucket string, objects []donut.ObjectMetadata, } content.Key = object.Object content.LastModified = object.Created.Format(rfcFormat) - content.ETag = "\"" + object.MD5Sum + "\"" + content.ETag = "\"" + object.Md5 + "\"" content.Size = object.Size content.StorageClass = "STANDARD" content.Owner = owner @@ -152,11 +152,11 @@ func generateCompleteMultpartUploadResponse(bucket, key, location, etag string) } // generateListPartsResult -func generateListPartsResponse(objectMetadata donut.ObjectResourcesMetadata) ListPartsResponse { +func generateListPartsResponse(objectMetadata fs.ObjectResourcesMetadata) ListPartsResponse { // TODO - support EncodingType in xml decoding listPartsResponse := ListPartsResponse{} listPartsResponse.Bucket = objectMetadata.Bucket - listPartsResponse.Key = objectMetadata.Key + listPartsResponse.Key = objectMetadata.Object listPartsResponse.UploadID = objectMetadata.UploadID listPartsResponse.StorageClass = "STANDARD" listPartsResponse.Initiator.ID = "minio" @@ -182,7 +182,7 @@ func generateListPartsResponse(objectMetadata donut.ObjectResourcesMetadata) Lis } // generateListMultipartUploadsResponse -func generateListMultipartUploadsResponse(bucket string, metadata donut.BucketMultipartResourcesMetadata) ListMultipartUploadsResponse { +func generateListMultipartUploadsResponse(bucket string, metadata fs.BucketMultipartResourcesMetadata) ListMultipartUploadsResponse { listMultipartUploadsResponse := ListMultipartUploadsResponse{} listMultipartUploadsResponse.Bucket = bucket listMultipartUploadsResponse.Delimiter = metadata.Delimiter @@ -199,7 +199,7 @@ func generateListMultipartUploadsResponse(bucket string, metadata donut.BucketMu for _, upload := range metadata.Upload { newUpload := &Upload{} newUpload.UploadID = upload.UploadID - newUpload.Key = upload.Key + newUpload.Key = upload.Object newUpload.Initiated = upload.Initiated.Format(rfcFormat) listMultipartUploadsResponse.Upload = append(listMultipartUploadsResponse.Upload, newUpload) } diff --git a/server-api-signature.go b/api-signature.go similarity index 81% rename from server-api-signature.go rename to api-signature.go index f0201eb4a..c94e81f9a 100644 --- a/server-api-signature.go +++ b/api-signature.go @@ -26,14 +26,13 @@ import ( "strings" "time" - "github.com/minio/minio/pkg/probe" - signv4 "github.com/minio/minio/pkg/signature" + "github.com/minio/minio/pkg/fs" + "github.com/minio/minio-xl/pkg/probe" ) const ( authHeaderPrefix = "AWS4-HMAC-SHA256" iso8601Format = "20060102T150405Z" - yyyymmdd = "20060102" ) // getCredentialsFromAuth parse credentials tag from authorization value @@ -92,38 +91,36 @@ func stripAccessKeyID(authHeaderValue string) (string, *probe.Error) { return "", err.Trace() } accessKeyID := credentialElements[0] - if !IsValidAccessKey(accessKeyID) { + if !isValidAccessKey(accessKeyID) { return "", probe.NewError(errAccessKeyIDInvalid) } return accessKeyID, nil } // initSignatureV4 initializing signature verification -func initSignatureV4(req *http.Request) (*signv4.Signature, *probe.Error) { +func initSignatureV4(req *http.Request) (*fs.Signature, *probe.Error) { // strip auth from authorization header authHeaderValue := req.Header.Get("Authorization") accessKeyID, err := stripAccessKeyID(authHeaderValue) if err != nil { return nil, err.Trace() } - authConfig, err := LoadConfig() + authConfig, err := loadAuthConfig() if err != nil { return nil, err.Trace() } authFields := strings.Split(strings.TrimSpace(authHeaderValue), ",") signedHeaders := strings.Split(strings.Split(strings.TrimSpace(authFields[1]), "=")[1], ";") signature := strings.Split(strings.TrimSpace(authFields[2]), "=")[1] - for _, user := range authConfig.Users { - if user.AccessKeyID == accessKeyID { - signature := &signv4.Signature{ - AccessKeyID: user.AccessKeyID, - SecretAccessKey: user.SecretAccessKey, - Signature: signature, - SignedHeaders: signedHeaders, - Request: req, - } - return signature, nil + if authConfig.AccessKeyID == accessKeyID { + signature := &fs.Signature{ + AccessKeyID: authConfig.AccessKeyID, + SecretAccessKey: authConfig.SecretAccessKey, + Signature: signature, + SignedHeaders: signedHeaders, + Request: req, } + return signature, nil } return nil, probe.NewError(errAccessKeyIDInvalid) } @@ -163,7 +160,7 @@ func applyPolicy(formValues map[string]string) *probe.Error { if err != nil { return probe.NewError(err) } - postPolicyForm, perr := signv4.ParsePostPolicyForm(string(policyBytes)) + postPolicyForm, perr := fs.ParsePostPolicyForm(string(policyBytes)) if perr != nil { return perr.Trace() } @@ -204,61 +201,57 @@ func applyPolicy(formValues map[string]string) *probe.Error { } // initPostPresignedPolicyV4 initializing post policy signature verification -func initPostPresignedPolicyV4(formValues map[string]string) (*signv4.Signature, *probe.Error) { +func initPostPresignedPolicyV4(formValues map[string]string) (*fs.Signature, *probe.Error) { credentialElements := strings.Split(strings.TrimSpace(formValues["X-Amz-Credential"]), "/") if len(credentialElements) != 5 { return nil, probe.NewError(errCredentialTagMalformed) } accessKeyID := credentialElements[0] - if !IsValidAccessKey(accessKeyID) { + if !isValidAccessKey(accessKeyID) { return nil, probe.NewError(errAccessKeyIDInvalid) } - authConfig, perr := LoadConfig() + authConfig, perr := loadAuthConfig() if perr != nil { return nil, perr.Trace() } - for _, user := range authConfig.Users { - if user.AccessKeyID == accessKeyID { - signature := &signv4.Signature{ - AccessKeyID: user.AccessKeyID, - SecretAccessKey: user.SecretAccessKey, - Signature: formValues["X-Amz-Signature"], - PresignedPolicy: formValues["Policy"], - } - return signature, nil + if authConfig.AccessKeyID == accessKeyID { + signature := &fs.Signature{ + AccessKeyID: authConfig.AccessKeyID, + SecretAccessKey: authConfig.SecretAccessKey, + Signature: formValues["X-Amz-Signature"], + PresignedPolicy: formValues["Policy"], } + return signature, nil } return nil, probe.NewError(errAccessKeyIDInvalid) } // initPresignedSignatureV4 initializing presigned signature verification -func initPresignedSignatureV4(req *http.Request) (*signv4.Signature, *probe.Error) { +func initPresignedSignatureV4(req *http.Request) (*fs.Signature, *probe.Error) { credentialElements := strings.Split(strings.TrimSpace(req.URL.Query().Get("X-Amz-Credential")), "/") if len(credentialElements) != 5 { return nil, probe.NewError(errCredentialTagMalformed) } accessKeyID := credentialElements[0] - if !IsValidAccessKey(accessKeyID) { + if !isValidAccessKey(accessKeyID) { return nil, probe.NewError(errAccessKeyIDInvalid) } - authConfig, err := LoadConfig() + authConfig, err := loadAuthConfig() if err != nil { return nil, err.Trace() } signedHeaders := strings.Split(strings.TrimSpace(req.URL.Query().Get("X-Amz-SignedHeaders")), ";") signature := strings.TrimSpace(req.URL.Query().Get("X-Amz-Signature")) - for _, user := range authConfig.Users { - if user.AccessKeyID == accessKeyID { - signature := &signv4.Signature{ - AccessKeyID: user.AccessKeyID, - SecretAccessKey: user.SecretAccessKey, - Signature: signature, - SignedHeaders: signedHeaders, - Presigned: true, - Request: req, - } - return signature, nil + if authConfig.AccessKeyID == accessKeyID { + signature := &fs.Signature{ + AccessKeyID: authConfig.AccessKeyID, + SecretAccessKey: authConfig.SecretAccessKey, + Signature: signature, + SignedHeaders: signedHeaders, + Presigned: true, + Request: req, } + return signature, nil } return nil, probe.NewError(errAccessKeyIDInvalid) } diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 000000000..acaa2a189 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,34 @@ +# version format +version: "{build}" + +# Operating system (build VM template) +os: Windows Server 2012 R2 + +clone_folder: c:\gopath\src\github.com\minio\minio + +# environment variables +environment: + GOPATH: c:\gopath + GO15VENDOREXPERIMENT: 1 + +# scripts that run after cloning repository +install: + - set PATH=%GOPATH%\bin;c:\go\bin;%PATH% + - rd C:\Go /s /q + - appveyor DownloadFile https://storage.googleapis.com/golang/go1.5.1.windows-amd64.zip + - 7z x go1.5.1.windows-amd64.zip -oC:\ >nul + - go version + - go env + +# to run your custom scripts instead of automatic MSBuild +build_script: + - go test . + - go test -race . + - go test github.com/minio/minio/pkg... + - go test -race github.com/minio/minio/pkg... + +# to disable automatic tests +test: off + +# to disable deployment +deploy: off diff --git a/assetfs.go b/assetfs.go deleted file mode 100644 index 08f4d16ae..000000000 --- a/assetfs.go +++ /dev/null @@ -1,291 +0,0 @@ -// Code generated by go-bindata. -// sources: -// dist/app.css -// dist/index.html -// dist/main.js -// DO NOT EDIT! - -package main - -import ( - "bytes" - "compress/gzip" - "fmt" - "github.com/elazarl/go-bindata-assetfs" - "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 -} - -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 _distAppCSS = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xac\x55\x41\x6f\xdb\x3c\x0c\xbd\xe7\x57\xe8\xeb\x87\x01\xed\x10\x05\x4e\x0a\x0f\x83\x73\xda\x6d\xe7\x9d\x76\x95\x2d\x3a\x12\x22\x8b\x82\x24\x27\x69\x8b\xfd\xf7\xd1\xb2\x9d\xda\x69\x3a\x34\x40\x1d\xc4\xb6\xa4\xc7\xc7\x27\x92\xa2\x8b\x1a\xab\x36\xb0\x17\x6c\xa3\xd1\x16\x0a\x8b\x16\xd8\x7f\xba\x71\xe8\xa3\xb0\x71\xfb\x67\x51\x14\xbc\xc1\x67\x9e\x70\x5c\x5b\x0b\x9e\xbd\x94\xe8\x25\xf8\x22\x9b\x23\x17\x5f\xd9\xcb\x82\xd1\xd5\x08\xbf\xd3\xb6\x60\xd9\x96\x39\x21\xa5\xb6\xbb\xee\x3d\x2d\xd5\x68\x23\xaf\x45\xa3\xcd\x53\xc1\xee\x7e\x61\x89\x11\xef\x96\xec\x27\x98\x03\x44\x5d\x89\x25\xfb\xe1\xb5\x30\x4b\x16\x84\x0d\x3c\x80\xd7\xf5\x76\x41\xd4\xab\x8a\x0c\xc1\xc6\xc1\xc3\x99\x76\x93\xb9\x53\x0f\x50\xd8\x00\x17\xce\x81\xf0\x03\x08\x9d\xa8\x74\x24\x3f\xd9\x2a\x5b\xf7\xee\xa3\x27\x5a\x1d\x35\x92\xba\x61\x99\xad\x1e\x03\x03\x11\x80\x36\xf7\x86\x69\xfa\xce\x45\x15\xf5\x01\x2e\xc9\xd7\xbd\x11\x49\x3d\x80\x0f\x9f\xa3\x60\x4e\x76\x31\xfc\x98\x0e\x03\xe2\x63\x98\xf9\xe8\x1d\xf2\x1b\xf5\x1f\x34\x41\xd0\x07\xb6\x0a\x4e\xf8\x7d\x57\x59\x03\x63\xad\x8d\x29\x58\x57\x65\x3d\x5d\x88\x1e\xf7\x50\xd0\x13\xc0\x94\xa6\x9d\x4d\xf3\xa3\x96\x51\x91\xec\x55\x3e\x66\x79\xe7\x85\x53\x9f\xc4\x55\x09\x2f\x07\x2a\xa9\x83\x33\x82\x36\x5a\x1a\xac\xf6\xbd\x1d\x52\x54\x6a\x83\xc7\x82\x29\x2d\x25\xd8\x7e\xd6\xe1\xb8\x7b\x0f\x46\x74\xb1\xea\xe7\xf9\x11\xca\xbd\x8e\xdc\x51\x28\x1d\xa4\x20\x92\xb3\x2c\x4b\xf5\xc9\x26\xd7\x55\xc0\x28\xa7\x50\x9d\xd7\x41\x54\xd5\xfa\x80\xbe\x60\x0d\x5e\x3a\x99\x26\x61\x1d\xe6\xfc\xd7\xd6\x66\x76\x35\xfa\x86\x87\xf8\x64\xc8\xbf\xf3\x90\xd2\xcf\x1f\xe5\x15\x96\x77\x91\x09\x5a\x8a\x6a\xbf\xf3\xd8\x5a\xc9\x2b\x34\x9d\xd0\xff\xeb\x3a\xdf\xe4\x9b\x9e\x69\x98\x3b\x2a\x1d\x61\xcb\xd2\x0e\xb5\x95\x70\xe2\x93\xb0\x8f\x76\x79\x9e\x6f\x2f\x10\x4b\x36\x85\x4f\x73\x15\xd1\x51\x41\x8e\x61\xf5\x7a\xa7\xe2\x64\xfc\xcc\x93\x59\x17\xda\x7e\x42\x41\x8f\x58\x7f\x3f\x63\x5e\x73\xa8\xad\xa2\x16\x13\x87\xd2\xc6\xb6\x52\xe9\x00\x74\x4b\xaf\x75\xd5\x77\x3b\xee\x85\xd4\x6d\xa0\x96\x33\xd2\x9c\x63\x44\x25\x57\x09\x03\xbf\xef\xd7\x0f\x17\x2b\x1c\x49\x5f\xd7\x0a\x93\x4c\x96\x67\x5f\x5e\x95\xbe\x8d\x9f\xdf\x95\xf7\x9b\x3c\x5f\xb2\xf1\xf6\x30\x4f\x5f\x89\x27\x1e\x94\x90\x5d\x4d\x92\x0a\xf6\x48\xff\xee\x49\x94\x9d\xad\xb8\xcf\x96\xe9\xb7\x1a\x75\xa4\xce\x7d\xb3\xd5\x4d\x06\xa9\x61\x82\x90\xe7\xaa\xed\x9b\x3f\x4f\x59\x5a\xe7\xe3\x66\xdf\x64\x7a\xb0\x51\x9b\x7f\x9c\xc0\xf4\xb1\x08\xfa\x19\xd2\xb1\x85\x66\x08\x2e\x9c\x22\x17\x46\xef\x28\xac\x15\x7d\x12\xc0\x5f\xd6\x0e\x53\xdf\x6e\x66\x9d\xca\xce\xcf\x39\xba\xee\xeb\x6f\x00\x00\x00\xff\xff\xa1\x96\xf3\xc1\x35\x07\x00\x00") - -func distAppCSSBytes() ([]byte, error) { - return bindataRead( - _distAppCSS, - "dist/app.css", - ) -} - -func distAppCSS() (*asset, error) { - bytes, err := distAppCSSBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "dist/app.css", size: 1845, mode: os.FileMode(420), modTime: time.Unix(1443253091, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _distIndexHTML = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x94\x51\xbd\x4e\xf4\x30\x10\xec\xbf\xa7\xf0\x67\x4a\x84\x8d\x90\xa0\x38\x39\x47\x41\x45\x71\x0d\x6f\xe0\xd8\x9b\x64\xb9\x8d\x37\xb2\x17\x74\x79\x7b\x62\xac\x93\x4e\x5c\x03\x4a\x91\xd5\x68\x34\x3f\x1e\xf7\x3f\x72\x90\x75\x01\x35\xc9\x4c\xfb\x7f\xae\xfd\x94\x72\x13\xf8\x58\x8f\xed\x14\x14\x82\xfd\x01\x13\xb2\x7a\xe1\x24\x99\x89\x20\x3b\xdb\xf0\xc6\x21\x4c\x47\x35\x65\x18\x3a\x3d\x89\x2c\x65\x67\xed\xb0\x51\x8b\x19\x99\x47\x02\xbf\x60\x31\x81\x67\x1b\x4a\x79\x1e\xfc\x8c\xb4\x76\x6f\xdc\xb3\xb0\x56\x19\xa8\xd3\x45\x56\x82\x32\x01\x88\x56\x35\x4f\xa7\x05\x4e\x52\xe9\xfa\x8f\x0e\x18\x38\x9d\x2d\x0e\x5e\x20\xa3\xa7\xdb\xd7\x0d\x2c\xd7\x56\x97\xd2\x57\x31\x9a\x97\xb5\x21\x26\xf3\x5e\x22\x10\x7e\x66\x93\x40\xec\x40\x70\xea\xf9\x34\x66\x8c\xf6\xc9\x3c\x98\xfb\x4b\xc4\xcc\x98\x4c\x8d\xfd\xb3\x86\xba\xee\xe1\x97\xa5\x51\x7f\xf3\x04\xce\x9e\x27\x71\x3d\xc7\x55\x7d\xd3\x3b\xdd\xfb\x70\x1c\x33\x7f\xa4\x78\x17\x98\x38\xef\xd4\xcd\xf0\x58\xbf\x73\xb9\x12\x32\x2e\xa2\x4a\x0e\x9d\x9e\x3d\xd6\x2e\x7a\xef\x6c\x83\x9b\x70\xd5\xdb\xb6\xb7\x6d\xfc\xaf\x00\x00\x00\xff\xff\xde\x72\x3f\xd6\x14\x02\x00\x00") - -func distIndexHTMLBytes() ([]byte, error) { - return bindataRead( - _distIndexHTML, - "dist/index.html", - ) -} - -func distIndexHTML() (*asset, error) { - bytes, err := distIndexHTMLBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "dist/index.html", size: 532, mode: os.FileMode(420), modTime: time.Unix(1443253091, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _distMainJs = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xec\xbd\xfb\x76\x1b\x37\x92\x38\xfc\xf7\xf8\x29\xda\xdc\x99\xa8\x69\x51\x14\x49\xdd\xa9\x38\x3e\x1e\x3b\x99\x78\xc7\x76\xf2\xb3\x9c\xb9\xac\xac\xd1\x69\x92\x2d\xaa\x2d\x92\xcd\x74\x93\xba\xd8\xd1\x9e\xdd\x73\xbe\x57\xfa\xbd\xc0\xf7\x00\xdf\xbc\xd2\x57\x55\xb8\x15\xd0\xe8\x26\x65\x3b\x4e\x26\xc3\xec\x8e\xcc\x06\x0a\x85\x42\x01\x28\x14\x0a\x85\x42\x78\x36\x9f\xf4\x67\x49\x3a\x09\xe2\x70\xd6\x98\x34\xb2\xfa\x7b\x9d\x92\x87\x69\x63\x5e\x7f\x9f\x9c\x85\xf7\x27\xc7\xe9\x89\xf8\x35\xa3\x5f\x97\x51\x16\x44\x0f\x67\x37\xd3\x38\x3d\x0b\xb2\xf8\xc7\x79\x92\xc5\x0f\x1f\xd6\x54\xd1\xda\x17\x5f\xc8\xc4\x43\x2c\x33\xff\xe2\x8b\xa8\x9e\xc5\xb3\x79\x36\x09\x22\x40\x7a\xbf\x55\xc7\xf4\x44\xa5\x25\x32\x0d\xb1\x9e\x3d\x9c\xc4\x57\xc1\xd7\x59\x96\x66\x61\xed\x49\x34\x99\xa4\xb3\xe0\x2c\x99\x0c\x82\x71\x3a\x98\x8f\xe2\x60\xad\xb6\x9e\xae\xd7\xd6\x6a\xf5\xc3\xd9\x79\x96\x5e\x05\x67\xcd\x7e\x3a\x88\x1f\xd6\x5e\x7c\xf7\xf4\x87\xe7\x5f\x9f\xbe\xfc\xee\xf5\xe9\x37\xdf\xfd\xf0\xf2\x69\xad\x71\x76\x8b\xf8\x46\x0f\x91\xf6\x87\xef\xe3\xeb\x69\x9a\xcd\xf2\xee\xfb\xdb\xdb\x43\x6c\xc3\x71\xeb\xa4\xd9\x8f\x46\xa3\x70\xd4\x94\x59\x0d\x45\x7d\x18\x8b\x06\x4e\x1e\x12\x60\xfb\xe4\x38\x3e\x39\x94\xa4\xe6\xe1\xe4\xd1\xa4\x1b\xd7\x6f\x1b\xa3\x86\x29\x19\x37\x04\xef\x6e\x25\x14\x56\xa9\x32\x89\x8a\x64\x29\x5e\x9d\x41\x9b\x11\x3a\x7d\xd8\x3a\x4c\xbf\xcc\x9a\xa3\x78\x32\x9c\x9d\x1f\xa6\xeb\xeb\xf5\x3c\xcc\x90\xf1\x9a\x8c\xdb\x7a\xf8\xbe\xdd\x3d\xd6\x24\x4b\x14\x0d\xc1\xa5\x86\xac\xbb\xfe\xfe\xde\xe6\x83\x7b\xc1\x83\xe0\x45\x32\x49\xd2\xe0\xc9\x28\x9d\x0f\x82\xa3\x59\x9a\x45\xc3\xb8\x11\x84\x4f\xea\x41\xa7\xd5\xde\x11\xb9\x8d\xe0\xd9\xa4\xdf\x04\x60\x84\x7f\x9e\xf4\xe3\x49\x1e\x0f\x82\xf9\x64\x10\x67\xc1\xec\x3c\x0e\x1e\x4f\xa3\x3e\xfc\x23\x73\x1a\xc1\x5f\xe2\x2c\xc7\x51\xd2\x69\xb6\x82\x10\x01\xd6\x64\xd6\x5a\xfd\x10\x51\xdc\xa4\xf3\x60\x1c\xdd\x04\xd8\x81\xf3\x3c\x06\x1c\x49\x0e\x3d\x09\x5d\x18\x5f\xf7\xe3\xe9\x2c\x48\x26\x41\x3f\x1d\x4f\x47\x49\x34\xe9\xc7\xc1\x55\x32\x3b\xa7\x7a\x24\x16\xa4\x24\xf8\xbb\xc4\x91\xf6\x66\x11\x80\x47\x50\x60\x0a\x5f\x67\x1c\x30\x88\x66\x92\x68\xfc\xef\x7c\x36\x9b\x76\x37\x37\xaf\xae\xae\x9a\x11\x11\xdc\x4c\xb3\xe1\xe6\x48\x80\xe6\x9b\xcf\x9f\x3d\xf9\xfa\xe5\xd1\xd7\x1b\x40\xb4\x2c\xf4\xc3\x64\x14\xe7\xb9\xea\x97\x41\xd0\xbb\x09\xa2\x29\x10\xd5\x8f\x7a\x40\xea\x28\xba\x0a\x52\x18\xea\xc3\x2c\x86\xbc\x59\x8a\x44\x5f\x65\xc9\x2c\x99\x0c\x1b\x41\x9e\x9e\xcd\xae\xa2\x2c\x46\x34\x83\x24\x9f\x65\x49\x6f\x3e\xb3\x78\xa6\x48\x84\x96\x73\x00\xe0\x5a\x34\x09\xd6\x1e\x1f\x05\xcf\x8e\xd6\x82\x3f\x3e\x3e\x7a\x76\xd4\x40\x24\x7f\x7d\xf6\xfa\xdb\xef\x7e\x78\x1d\xfc\xf5\xf1\xab\x57\x8f\x5f\xbe\x7e\xf6\xf5\x51\xf0\xdd\xab\xe0\xc9\x77\x2f\x9f\x3e\x7b\xfd\xec\xbb\x97\xf0\xf5\x4d\xf0\xf8\xe5\xdf\x83\x3f\x3f\x7b\xf9\xb4\x11\xc4\xc0\x31\xa8\x07\xba\x3a\xc3\x16\x00\x99\x09\x72\x33\x1e\x10\xeb\x8e\xe2\xd8\x22\x01\xc6\x16\x7d\xe7\xd3\xb8\x9f\x9c\x25\x7d\x68\xda\x64\x38\x87\x71\x10\x0c\xd3\xcb\x38\x9b\x40\x8b\x82\x69\x9c\x8d\x93\x1c\x7b\x35\x07\x02\x07\x88\x66\x94\x8c\x93\x59\x34\xa3\xa4\x42\xbb\xb0\xa2\xcd\x7b\xf7\xd6\xb0\x7b\xb1\x75\xfd\xd9\xda\xe1\xbd\x7b\x38\x82\x4f\xfb\x59\x1c\xcd\xe2\x27\xa3\x08\x28\x7b\x18\x18\x29\x13\xd6\x83\xf7\x81\xfe\x1a\xc4\x30\xb5\xe3\xef\xb3\x14\x6a\x9e\x25\x71\x1e\xce\xa2\x6c\x18\xcf\x1a\xc1\x14\x92\x72\x02\x05\xb2\x69\x4e\x24\x80\xa6\x75\x08\xff\x7c\x29\x32\xd5\xe4\x08\x12\x98\x1d\x00\x88\x30\x83\x38\xef\x67\xc9\x14\xc6\x37\x00\x13\xd4\x71\x72\x72\xc8\x92\x9b\xf1\x64\x3e\x8e\x33\xea\xda\x87\x25\xe9\x3f\xfd\x14\x9c\x45\xa3\x3c\xb6\xca\xf5\xd3\xc9\x59\x32\x9c\xab\x92\xb3\x6c\x0e\xf9\xc9\x59\x10\xae\x5d\x46\xa3\x79\xbc\x86\xe3\xc2\x80\xd7\x79\x51\x1c\x2e\x56\xb1\xef\x7a\x6f\xe3\xfe\xac\x69\xb5\xfd\x46\xb7\x9c\x95\xbc\x88\x6f\xf8\x77\xfd\x30\xb8\x85\xff\x93\x12\xc0\x70\xf4\x09\xf4\x0d\x60\xee\x03\x08\x31\x6e\x96\x22\xd2\x1c\xc6\x27\x76\x5c\xff\x7b\xc5\x4a\x24\xd7\x64\xd7\x8b\xcc\x67\x88\x9a\x04\x88\x32\x8b\xa3\xac\x8b\x36\x5b\x78\xab\xb0\xd8\x24\x1c\x2a\xd2\x19\x04\x34\x09\xfe\xbf\x1e\xd6\xd5\xb8\x01\x1e\x00\xa3\x74\xe3\xe0\x33\x3c\xbd\x6e\x04\xa7\xd7\x1d\xfc\xb3\xa5\x7a\xfa\x34\x1a\xa2\x40\x50\x2c\x3d\x55\x05\xba\xc1\xd5\x39\x8a\x98\x50\x00\x28\xf0\x94\x58\x0e\xe0\x88\x6b\x2a\x59\x4e\x9f\x80\x36\x8b\xfb\x71\x02\x53\x80\xbe\xb7\x44\xb7\xe3\xf8\x81\x99\x3d\xc1\x32\x40\xc3\x8c\x72\x71\xfc\x63\x63\x07\x87\xa6\x7e\x39\x54\x90\x2d\xaa\x92\x87\x0f\x83\xc9\x7c\x34\xaa\x9b\x5a\xbf\x91\xd4\x19\xae\x1e\xea\xf1\x0a\xd9\x72\x40\x40\x3d\xdf\x5d\x4d\xd4\x80\x78\xaa\xfb\x5d\x22\x36\x84\xcb\x6e\x10\xa5\x1f\x32\xba\x54\x73\x35\xe9\x06\xf3\xf7\xaa\xe6\xef\xce\x24\x3e\x89\x45\xc1\x6a\xaa\xdf\xab\x6e\x62\xcd\xbd\x0d\x62\x68\x26\x64\x9d\x5e\x6b\xce\x1c\x22\xf7\xe4\x3c\x43\xaa\xf0\x7b\x0b\xbe\x15\x3b\x0f\xdd\x4e\x82\x39\x04\x72\x73\x1e\x9b\xde\x12\x03\x9a\x50\x7b\xe6\x12\x23\x05\x3f\x9b\x94\xcb\x68\xc1\x96\xea\xbe\x21\x08\xf8\x12\x8d\x52\xc9\x2e\x73\x7c\x2d\x93\x69\xa2\x88\x50\x09\x54\x13\xe4\x8c\xbb\x85\xc1\xa9\x47\xe4\x69\x32\x01\xb8\x74\xfa\x4a\x2c\x18\x4f\xe3\xb3\x68\x3e\x9a\x21\x4f\x59\x05\xf0\x15\x7c\xf1\x05\xfe\xd3\x3c\x3d\x8d\xf3\x17\x42\x75\x79\x44\xe9\x5d\x00\x5b\x1b\x88\x62\x6b\x5d\x4a\xc2\x39\xc0\xab\xe8\xa3\xd8\x7c\x02\x94\x3c\x39\x8f\xfb\x17\x61\x02\xd3\x05\xd7\xc8\x06\x9f\x39\x6a\x46\xdf\xd7\xd9\x81\xfa\x01\xeb\x23\x07\x44\x48\xa1\x2b\xa1\x66\xf5\x1a\xc6\x80\xd0\xae\xd6\xa4\x76\x85\x4d\xc6\xa5\x95\x64\x75\x04\xff\xaf\xa7\xdf\x9a\x60\x80\xdd\x7a\x58\x73\x92\x59\x1e\xe6\xf3\x1e\x49\x77\x98\xe3\x73\xe8\x7f\xfa\xad\x68\x92\xba\x8e\xc9\x08\xee\x43\x4f\xac\x69\xb4\xc8\x1b\x27\x53\x8d\x3d\x2f\xa1\x47\x08\xab\x16\x3a\x24\x63\x3c\xcf\x67\x6a\xfd\xeb\xc5\x54\x98\x96\x69\x4d\x79\x83\xd4\x8e\xb5\x60\x3d\x28\xd0\x42\x6d\x52\xd4\x9b\x19\x69\x66\x8b\x58\xba\x42\x46\xa0\x45\x2e\x17\x8d\xef\x71\x50\x2b\x46\x77\x69\x4c\xc2\x18\xed\x06\x86\x39\x66\x61\xe9\x0a\x59\xd1\x08\xd4\x82\xd0\xa5\x79\xd1\x08\xf8\xda\x22\xd2\x90\xe9\x4a\xd6\x32\xe6\x4a\xfa\x72\x6b\x36\xc3\xa8\xf2\xa6\x97\x74\x90\xa1\x0d\x46\x26\xb5\xe4\xf4\x14\x9a\x6e\x40\x68\x28\x92\x88\x05\x36\x90\xf4\x92\xaa\x51\xb8\x46\x09\x6b\x5a\x54\xd3\x27\x4a\x80\x92\x29\x21\x00\x34\xf8\x18\x98\x9a\x25\xd1\xe8\x87\x84\xe3\x54\xa9\x1b\xf3\x64\xcd\x03\x5a\x85\xde\x40\xd9\x24\xbd\x4a\xe7\x42\x26\xd8\x84\x6f\x64\x94\xee\xd0\xff\x3a\x9a\x7e\x7d\x09\xd2\xec\xfb\xd1\x7c\x48\xb2\xca\x29\x34\x8b\xa6\x1b\x31\x02\x6c\x4c\x09\xa2\xb2\xf8\x42\x66\xd8\xe0\x3e\xb2\x17\xa2\x10\x60\x86\x55\x24\x5a\xf2\x6f\xd3\x71\xcc\x89\x6f\x6e\xca\x8c\xcd\x73\xc8\x59\xf3\x81\x57\xb2\xd6\x80\xb9\x45\x1f\xcf\x41\x4f\xf7\xd6\x14\x41\x4e\xa1\x26\x04\x5f\xa2\x26\x04\x73\x8b\xaa\x0d\x86\xb7\xb2\x4b\x91\x59\xa8\x4f\x16\x5a\xa2\x4a\x09\xe9\x22\x38\x8a\x33\xc4\xed\xaf\x35\x17\x99\x85\x5a\x65\xa1\x25\x6a\x95\x90\x2e\x82\x67\x93\xb3\xd4\x5f\x65\x02\x39\x85\xfa\x10\x7c\x89\xca\x10\xcc\x33\xa9\x9e\x27\xbd\x17\x20\x97\xf2\x67\x20\x79\xf0\x47\xc9\x7c\x84\x5d\x53\x6f\x73\x8c\x80\x9b\x09\x40\x6e\xe0\x4f\xdf\x1c\x75\xd1\x2d\x37\x67\xdd\x52\x15\x88\xf1\xcf\xb3\x59\x3c\x5e\x4c\x27\xfe\xdd\x48\x00\xb4\x8a\x4e\x85\xee\x6e\x74\xaa\x52\x7e\xc4\x47\x97\x43\x6c\x48\xfe\x98\x56\x9f\x23\xd0\x25\x60\x3f\x95\x57\x11\x9c\x5f\x0e\x37\x90\xad\x30\x6f\xa8\x0c\x8c\x2d\x51\xa8\x84\x74\x7f\x0d\x4b\xb7\xc1\x5f\xbc\xba\x2a\x50\x22\x66\x20\xac\xbe\x49\x46\x90\xf9\x1c\xf6\xaf\xcb\xb5\xa7\x2f\x8a\x6d\x9e\x51\xb9\x8d\x11\x14\x5c\xd0\xa6\x42\x45\x77\x6e\x56\x01\x43\x75\x85\x2f\xa3\xcb\x64\x48\xbb\xda\x17\x69\x16\x83\x24\x58\xb2\x69\x13\x5d\x0e\xe6\x67\x16\x6f\xc0\x54\x5e\xd4\xb6\x62\x55\x77\x6e\x5c\x11\x05\x56\xb9\xb9\x19\xfc\x09\x36\x4b\xe3\x79\x02\xda\xde\x78\x9a\x4e\xa0\xfd\xf9\xbd\x7b\x61\xab\xe1\x5f\x9b\x8e\xb5\xd2\x79\x62\xf6\x5b\xaf\xcf\xe3\x71\xfc\x22\x9a\x44\x43\x5a\x31\x51\xef\xe2\xab\x2f\x2b\xd3\x3c\x9a\xdd\x80\x48\x69\xf2\x12\x88\x06\xb1\x7c\x1f\x4d\xc5\xf6\xa9\xa4\x28\xe5\xcb\x1a\x1f\x4f\xa7\xb6\x41\xe0\xf4\x15\x12\xfb\x7b\xdd\x06\xd0\x02\xef\x05\x4c\xd1\x84\x02\xd0\x22\x17\x08\xb0\x05\x66\x9b\x08\x30\xa1\x32\x19\xdc\x43\x33\x90\xab\x42\xa3\xf1\xa9\x81\x60\xa2\x60\x40\x1b\xcd\xd0\xbf\x3d\x02\x28\xa3\xe3\xd5\x1b\xc1\x1a\xd3\xf1\xd6\x1a\x64\xc7\xaa\x8b\x7d\x82\xc0\x2a\x2a\x3e\x24\xb4\x98\xd2\x4c\x27\xcf\xe3\xb3\x19\x76\xdd\x1f\xe7\xb3\x59\x3a\x79\x9d\xce\xfb\xe7\xd0\x1b\xb8\x13\xaa\xca\x6f\xf6\x92\xc9\x80\x90\x12\xb6\x5b\xa4\x94\x1b\x52\x04\x2b\x8e\x45\x0b\x2f\xe2\x9b\x6e\xb0\x06\xa4\x3f\x81\x0d\xef\x80\xc6\xff\xf5\x6c\xad\x41\x79\x52\x0b\xe5\xbb\x68\x0e\x15\x2a\x2e\x05\x6a\xbf\xa2\x3e\x03\x1c\x4e\xd4\xc3\x5d\x6b\x68\x20\x8b\x9e\xcc\x33\xdc\xf6\x51\x72\x58\x97\x05\x6e\x45\xb3\x6f\x91\xdc\x46\xc0\x29\xeb\xab\xae\x7a\x9a\x0c\x5e\xa4\xf3\x49\x19\x6d\x05\x38\x46\x1d\xcd\x2a\xb2\x1b\x0a\xce\xc9\xbe\x0b\x82\x2b\x60\x54\x7a\xd5\x8c\x06\x03\x1a\xe1\x38\xe1\xe3\x09\x8c\x47\x50\xda\xf2\xe4\x5d\x0c\xbd\x64\x19\x9c\x74\xeb\x08\x19\x2a\xca\x47\x33\x54\xf1\xdf\xdf\xca\x6e\x0b\x02\xf5\xcb\xd3\x92\xb2\xee\x2a\x69\x50\x19\x78\x18\x1b\x4a\x62\x18\x60\xa4\x55\xaa\x89\x5f\x5e\x3b\xf0\x7c\x00\x5a\xab\xbf\x2e\x91\xe9\x70\x4c\xc8\x5d\x51\xf9\xd7\x23\xe8\x2d\x32\x05\x48\x75\x9d\x4f\x4b\x31\xb4\x24\x48\x68\x98\x64\x66\x71\xd3\x34\xa3\xa1\xf3\x71\xb7\x65\xbe\x16\xe2\x5d\x56\xe4\x33\x0c\xb8\xb1\xca\x51\xdc\x74\x69\x87\x35\xc2\xbd\xd5\xda\x7f\xec\xec\xec\xac\xd1\xce\x48\xd6\xad\xfb\x8e\xcc\x83\x9a\xd0\x5f\x6d\x93\x3d\x2b\xc1\xc7\xb5\x59\x69\x0c\xbf\xf2\x76\x3b\x1a\xcb\x87\xb7\x59\x0a\xab\xe5\x9b\xb7\x36\x48\x2e\xd7\x3e\xb8\x35\x1a\x32\x10\x0b\x5c\x83\x25\xbc\x0f\xde\x3d\x8d\xa7\xb3\xf3\x6e\xd0\xe2\xc9\x40\x63\x8a\xc6\xa5\x81\xda\xec\x5b\x79\xba\xa9\xbd\xa8\x7f\x31\x24\xc8\x27\xaa\xd1\xad\x56\xaf\x3f\xd8\x5e\xb3\x0b\x04\xc1\x34\xcd\x13\x61\xd7\x5c\x3b\x4b\xae\xe3\x41\x01\xe0\x3c\x4e\x86\xe7\xb3\x6e\xb0\xbb\x1d\xac\x07\x6b\xd3\xeb\x02\x40\x26\xf2\x5b\x25\xd9\xb3\x74\x5a\x9e\x79\x95\x0c\xb0\x89\x6b\xed\x56\xeb\x0f\x85\xcc\x77\xcf\xa0\xa1\xd7\xdd\x60\x1b\x24\x96\x95\x35\xcb\xa2\x89\xa0\xfa\xeb\x09\xda\x34\x06\xd2\xd0\x61\x01\xf5\x93\xac\xaf\x6d\x22\x2c\xc7\xc2\x75\x97\x2e\x2a\xf4\x36\xfe\xf7\x5e\x58\xb5\x5e\x46\xb8\xa0\xad\x9d\xc7\x11\x89\x52\xd3\x11\x8c\xbd\x51\x2f\x4f\x47\xb0\xb5\x86\xec\x11\xc8\x6f\xe0\x68\x0b\x07\xa1\x8d\xef\x6e\x04\x01\x49\xe7\x9d\x02\xdf\xec\x51\x28\xe1\xd4\x01\x1d\x48\xc5\x2c\x1d\x8d\x40\x9b\x5a\xb3\x40\xea\xec\xab\xfe\x2b\x60\x91\x1c\x55\xbb\xa0\x6c\xf6\x52\x90\x19\xe3\x6e\xd0\xfe\x04\xfc\xaa\xda\x55\x72\xb9\xe1\x14\x7b\x5f\x14\xff\xdd\x62\x52\x23\x48\xa7\xf1\xe4\x29\xa8\xdb\xf2\xa8\x60\x4d\x90\xbe\x81\xfd\xbd\xe6\x92\x7e\x67\x71\x67\xef\x2d\x1d\x29\x37\xcd\x92\x71\x94\xdd\xbc\x06\xed\x0b\xea\x45\xbb\x0a\x54\x58\xff\x7c\x35\xfe\x11\x24\xce\xe7\xad\xf1\x9b\x34\xbb\x8a\x32\x10\x58\x78\xf2\xc9\xc4\xc0\x67\x25\xe2\x55\xdc\x87\xf2\xa3\x1b\x18\xe3\x69\x1e\xff\xc2\xc4\xfc\x29\x4d\x87\xa3\xd8\x47\x83\x3d\xd5\x7f\x3d\x53\xc8\xa3\x49\xfe\x7a\x26\xd1\xab\xf8\x0c\xb4\xfd\xf3\xcf\x3b\xaa\x8f\x40\xe1\x0e\xce\xe2\x78\xd0\xfb\xec\x13\xea\xdb\x78\x34\xfd\xcc\x8d\x4d\x86\xb0\x9d\x99\x63\xb7\xfe\x6a\x87\xa8\x57\x07\xfe\xf5\x0c\xd2\xaf\xc9\x0f\x67\xf3\xd9\x18\xff\x09\x94\x0e\xfc\x79\xbb\xf1\xc9\x79\x34\x19\xc6\xa0\xc3\xe6\xf9\x55\xfa\x4b\x4b\xe4\x1f\x72\x74\x39\xf9\x16\x36\x7c\x69\x76\xb3\x58\x16\xde\xf3\xfd\xae\x7f\x98\x12\x5f\x50\x7e\xd8\xe6\x63\x1a\x0d\x06\xd0\x33\xaf\x51\x1b\x36\xaa\x34\x57\x7e\xa4\x3d\x6a\xcd\x55\x72\x16\xb3\x8a\x1d\xdb\x34\xe9\x9f\x6f\xa3\xc9\x00\x54\xbc\x86\x38\xf4\xbc\xe7\x36\x90\xdb\x02\x4e\x84\xbd\x4a\xee\x7c\x1e\x4f\xa7\x87\xf7\x6e\xeb\xa1\xa7\x4e\xcb\x32\x86\x16\xac\x3e\x33\xf8\xe0\x51\x2a\xda\x50\xd0\x4a\x60\x0c\x3c\x1e\x2c\xe8\x7c\x40\xc0\x4d\xe1\x23\x70\xef\x56\x61\x2b\x22\x12\xc7\x69\x0b\xd0\xa0\xa5\x82\x90\x48\xd3\x1f\xb5\x3f\x5f\x72\x8f\x5a\xe4\x1c\x32\x1e\x3b\x8b\x76\x25\x9b\xd0\x41\xe7\x82\x95\x5d\x32\x2b\x52\xbf\xdc\xad\x3f\xa4\xfd\x45\x20\x07\xd4\x1a\x9f\x75\x52\xc6\x90\xc9\xc9\xf2\x01\xbd\xde\x60\x94\xab\x73\xa4\x46\xb1\x42\x75\x94\xf4\xc9\xeb\x54\x27\x66\x9e\x3a\xd5\xa1\xd9\x27\xaf\x93\x0e\xaf\x3c\x15\xd2\xf9\xd5\x27\xaf\x8d\x0e\x20\x3d\xb5\xd1\x19\xa4\x5d\xdb\x3d\x9c\x26\xd6\xb9\x2b\xaf\x34\x9b\x4f\x42\x3d\x58\x1b\x41\x29\xdc\xb7\x51\x7e\xfe\x3c\xed\x47\xc2\xe3\xc0\x98\x1c\x5f\xa5\xa9\x32\x63\x17\x5b\x24\x6d\x76\x0b\xdb\x8a\x48\xa4\x88\x00\x31\x99\xf6\xe7\x98\xda\xec\xa5\x83\x9b\x3a\x0a\x01\xa0\xff\xb6\xf1\xbe\x66\x1f\xbf\xd6\xba\xdb\x8d\x9a\x7d\xf6\x5b\xeb\xee\xf2\x24\xec\x91\x5a\x77\x8f\x27\xc9\xc1\x58\xeb\xee\xf3\x54\x39\x5c\x6a\xdd\x83\x46\x8d\x1d\x88\x40\x0d\x7b\x56\x82\xef\x94\xb0\xd6\xdd\x39\x28\x03\xd2\x47\x74\x40\x58\xab\x08\x54\x7a\x2c\x06\x84\xb4\xab\xc0\x3d\xa7\x4e\x50\xa4\x53\x55\xc4\x77\x9a\x53\xeb\xb6\x5b\x5b\x8d\x1a\x75\x4e\xad\xbb\x75\xb0\x23\x7f\x4b\xef\x81\x5a\xb7\xd3\xda\x56\x49\xae\x6f\x00\x64\x76\x3a\xb7\x27\x8d\xce\xf2\x7e\xb9\xcf\xf2\x14\xaa\x9e\x9e\x27\xfd\xe0\x3f\xa3\xcb\x48\xb8\x7c\x05\x40\x66\x06\x4b\x26\x39\x3f\x16\x0c\x03\x8f\xbf\x7f\xf6\xc9\x5d\x77\x6b\x32\xab\xb6\x72\xdd\x5d\xca\x75\xb7\x46\xae\xbb\xb5\xdf\x9c\xeb\xae\xdf\x35\x55\x79\xb9\x07\x6b\xc6\x99\x6d\x4d\x9c\x52\xc8\x03\x09\xd4\xdd\x84\x4c\x5a\x39\xff\xae\x9c\x7f\x3f\xc4\xf9\xf7\xdf\xdb\xbf\x92\x66\xcd\xdb\x3c\x9d\x64\xd3\xbe\xed\x06\x24\x13\x8d\x93\x81\x4c\xa8\x72\x22\x90\x20\xaa\x08\x5b\x3b\xdc\xc9\xc8\xcf\xd0\x0d\x58\x08\x1a\xca\x34\x4d\xd4\x51\x7c\xd9\x69\xba\x29\xa0\x0e\xd5\xe9\xd2\x4c\x34\x8e\x73\x10\xdf\x38\xe4\xd7\x0c\xc8\x1a\x3b\x1f\xff\xcf\xa3\xef\x5e\x8a\x86\x92\xbf\x81\x6a\x11\x53\x85\xc2\xf7\x81\xa2\xa1\xab\x7f\x35\x0c\xee\x2e\xab\xe6\xb6\xe4\xb0\xdc\xd4\xed\x9c\x99\x8f\xa3\x8b\x18\xdb\x52\x72\xa6\xaa\xb2\xc3\x71\x3c\x3b\x4f\x07\x68\x4b\x20\x19\x5a\x38\x34\xe7\x6d\x11\xfe\x00\xaa\x04\xaa\xa4\x59\x34\xce\xbb\xc1\xb1\x2c\x7c\x52\x75\xc0\xfc\xa7\x78\xf6\x17\xa5\x9c\x7b\x49\x32\x00\xc5\xa3\x7b\xa2\x42\xd3\x5c\x33\xa0\xb5\xaa\x0a\x27\x20\xef\x66\xf1\x63\x52\x98\x4b\xaa\x34\x20\x21\x2c\x12\xd9\xe2\x8a\x4d\x81\x1a\xb2\x00\x0b\x75\xe9\x6f\x55\xdb\xbf\x89\x67\xfd\xf3\x0a\x3a\x74\xfe\x52\x44\x68\xe8\x3b\x50\xf0\x2a\x06\x15\xb3\x82\x02\x9d\xbf\x14\x05\x1a\xfa\x0e\x14\x3c\x1e\x0c\xc4\xae\xaf\x84\x02\x9d\x1f\xc2\x32\x51\x32\x0e\x0d\x05\x1a\x1a\x28\x20\xf8\xd2\x7a\xf1\xd8\xfd\x48\xed\x44\xbd\x35\x33\x88\x85\x23\x8f\xc1\x56\x0e\x3d\x09\xf4\x22\x1e\xa3\x13\x46\x59\xcd\x05\xb8\xa5\xda\x5e\x28\xb5\x90\x07\xba\xc4\xd3\x24\xbf\x58\x8a\x20\x0d\x78\x37\x8a\x74\xb1\xe5\x49\x3a\xba\xa1\x8d\xf2\x22\x82\x24\xd8\xdd\xc8\x91\x85\x96\x27\x66\xa1\x84\xb2\xc0\xee\x46\x8c\x92\x58\x8b\x88\x01\x1e\xf6\x51\xe3\xad\x1e\xb4\x0e\xd4\x52\xa4\x38\x65\x96\x61\x8b\x59\x5f\x5e\xc6\xb3\xea\x7e\x2a\x80\x2e\x23\xc6\x0b\x85\x2a\x66\x95\xbc\xd2\x59\x35\x7e\x39\x48\x78\x9e\xe6\xb3\x45\x24\xf0\x02\xc0\x0f\x2a\x52\x21\x44\x7b\xd1\x08\x75\xa3\x2a\x12\x6c\xa0\xa5\x88\x10\x45\xfa\xa5\x54\xd8\xf6\x51\xc3\x32\x32\x93\x62\x9e\xdc\xbb\x70\xeb\xcf\x43\x0b\x4e\x6c\xcc\xd5\x65\x5d\xc8\x2c\x96\xd0\xa6\x16\xa9\xa9\xd4\xba\x5b\xb0\xcb\xdf\x5a\xed\xf2\x57\xbb\xfc\xd5\x2e\x7f\xb5\xcb\x5f\xed\xf2\x57\x57\x7c\x57\x57\x7c\x57\x57\x7c\xff\xb5\x4d\x50\xab\x2b\xbe\xff\x86\x57\x7c\x29\x0d\x54\x8c\xc9\xec\xeb\x7c\x17\x30\x83\x72\x61\x5d\x23\x35\xf9\x1b\x71\xbe\xbb\x31\x15\x10\xc6\x18\xe9\x2b\x5f\x65\x99\xf4\xc1\x2b\x64\xc6\x2a\xc8\x2f\x07\xd1\xb8\x78\x3c\xf4\xdc\x0b\x92\xf0\xb0\x66\x30\x18\xda\x0d\x6c\x6e\xd2\xe8\x92\x00\xe1\x7b\x63\x4a\x5c\x6b\x36\x9b\x6b\x96\x1d\x91\x52\x6e\xeb\xd6\x6d\x22\x55\x50\x18\xf1\xaa\x8d\xa0\x12\x76\x89\x6b\x45\xca\x52\x78\xa7\xab\x45\x82\x02\xb1\xe1\xd1\x7a\x12\x28\x0d\x28\x40\x6d\xf2\x84\x6d\xf5\x18\xf2\x4e\x84\xfc\x86\x3c\xfa\x32\xbb\x25\x69\x7e\xbd\xd4\xf7\x6a\xd7\x40\xcb\x5e\xd3\xd6\x53\x60\x1b\x55\x8d\x9b\x5b\x54\xfc\x92\x41\x37\x78\xf9\xb2\x61\x6c\x99\xc0\xaa\x93\x5b\x73\xce\x8d\x7a\x9e\xe0\x9c\x65\x77\xd5\xfd\x62\x19\x5d\xfb\xe5\x06\xd7\x7e\xa5\xb1\x95\x04\x60\x21\x35\x50\x80\xe8\x8c\x72\xab\x2f\xf1\x78\xca\x34\x93\x81\xa7\x18\xa4\x42\xc9\x76\x65\x41\x97\xbf\xa6\xb0\xc8\x01\x04\xc7\x27\x2e\x06\x5a\xf3\xa3\x59\x04\x63\x40\xfa\xc9\x48\xcc\xc0\x4c\x53\xb7\x71\x20\x92\x5b\xca\xae\xd5\x35\x26\x5b\xf1\xde\xa9\xf9\x91\x9b\x00\xbd\xc3\xfc\xe5\x04\x33\x25\x4e\x63\x29\x7f\xe4\x26\xac\xc3\xf0\x47\x01\x2a\xe0\x01\x89\xf8\xa1\x9a\xe4\xde\xbb\xf0\xce\x76\xee\xc0\x30\x85\xdd\x39\x8d\xdc\xa6\x3e\x41\x40\x91\x15\xae\xc9\xdb\x3e\x1b\x28\xf0\x61\x68\xad\xc9\x0d\x1c\x1d\xbd\x23\x07\xd6\x10\x6e\x32\xa0\xb1\xd3\xc4\x8d\xca\x64\x98\x9c\xdd\x84\x92\x91\xf5\x7a\x13\x96\x81\x09\x13\x0b\xb0\x48\xf0\x7e\xa1\x6e\x83\xb4\x26\xfa\x28\xd5\xd9\x02\x23\xc3\x88\xa9\x2c\x5a\x31\x80\x20\x9c\x3d\xb8\x4b\x82\xf4\x69\xaa\x36\xc4\x81\xd5\x58\xa2\x04\x98\x9b\xc7\xa1\x46\xdc\x84\x5f\xd0\x50\xdd\xe5\xdc\xe5\x23\xc6\x9a\x5c\x9a\x28\x11\x4b\xe1\xf2\xa2\x3f\x2c\x2a\x59\x3d\x0e\x40\x93\xbe\x0d\x61\x02\xde\x4a\xbc\x2d\x37\x85\xc8\x59\x28\xdc\xc5\x16\x75\x5c\xa9\xa1\x44\x63\x59\xde\x4a\xe2\x5f\x32\xd0\x95\x62\xf7\xf6\xa4\xb1\xbd\x0a\x59\xf6\xaf\x6c\x11\xf9\xad\x86\x2c\x5b\x59\x44\x56\x16\x91\x95\x45\x64\x65\x11\x59\x59\x44\x56\x16\x91\x95\x45\xe4\xdf\xd9\x22\xf2\xb3\x05\x3d\x7b\x9e\xf4\xbe\x01\x59\x80\x17\x9d\xaa\x62\xcd\x9c\x01\x0c\xb9\x27\x97\x84\x95\x51\x38\x96\x0e\x22\xa3\x0a\xf8\xd1\x99\x4b\xff\x55\x44\x91\x63\x77\x8f\xc0\x4a\xc8\x32\x78\x96\x26\xcc\x14\x29\x09\xa0\x43\xf1\x66\xe8\x82\x7c\x75\x20\x25\x82\xdb\xa4\xf0\x01\xa5\xc1\x93\x18\xae\xe5\xc3\xef\xb0\x42\x7e\xb4\x78\xa7\xe9\x9b\x24\x1e\x0d\xaa\xe8\xc3\xcd\xdc\xc6\x19\x42\x95\x10\xa7\xb1\x2c\x4d\x99\x2e\xe1\x47\xf8\x2a\x82\x1d\xd7\x60\x71\xb7\x66\x04\x57\xdd\xb1\x1c\xd7\xd2\xf4\xf1\x42\x7e\xb4\x4f\xa2\x6c\x80\xff\xab\x22\xaf\x0f\xf9\xf4\xa7\x84\x34\x85\x63\x69\xb2\x54\x81\x6a\x74\xc8\xdc\xa5\xc8\xda\xa0\x88\x3b\x8b\x91\xdd\x99\x3e\x2c\xb4\x00\x6d\x32\x1b\xc5\x4b\x12\x89\xa0\x8b\xa8\x44\x98\xbb\x93\x89\xa5\x6c\xc1\xf8\x14\x76\xe9\x43\xa9\xf7\x3b\x81\x14\x07\x2a\x6b\xad\xa4\xc8\x42\xa1\xaa\x21\x35\x02\x68\xa9\xe5\xdc\x6a\xfc\x66\x9b\x82\x0b\xc6\xfd\xd4\x5f\xa6\xaa\x4e\x0b\x50\x15\xa7\x30\x54\x4f\x8e\x8e\x5e\xeb\x18\x17\x7f\xca\xd2\xf9\xd4\x7f\xa1\x2d\x1a\x0c\xd0\x44\x57\x04\x3f\x2c\xfa\xe5\x92\x27\xac\x4d\x1b\xf7\x87\xad\x6d\xa2\xdf\x89\xa2\x42\xc6\x60\xbc\x4b\x10\x2d\x28\xb1\x38\x8a\x16\x3a\x39\x2e\x13\x46\x4b\x06\x6b\x24\x88\x8a\x38\x5a\x00\xf6\x71\x81\xb4\x70\x23\x15\x33\x33\x2a\xda\x03\xd1\xd2\x79\x8f\x99\x27\x65\x44\xad\xa3\x79\x0f\x76\xfd\x26\xc2\x96\xf8\x76\x22\x6a\x69\xe8\x27\xa3\xa4\x7f\x21\x97\x62\x37\x69\x71\x14\x2e\xe2\xe5\xb1\x1d\x22\x4a\xd4\x57\x1a\x12\x4a\x64\x2f\x13\x02\x4a\x5a\x33\x89\xaa\x2c\x3e\xcb\x9b\x30\x32\xd0\x81\x14\xb9\xfb\x17\xc4\x1b\x82\x6e\x2b\x34\x6e\x1e\x0b\xc8\x0e\x93\x25\xd2\xcd\x58\x6a\x5a\xee\xbc\x95\xb8\x5d\x53\x2b\xf2\x9c\xdb\x35\xc9\xc7\x3b\xbe\x7a\x0a\xc9\x96\x81\x3b\x08\xd6\xd0\xb0\x0c\xca\xfd\x9a\x75\xc9\x76\x2d\xea\xf7\x41\x81\xfd\x73\x7c\xf3\x6c\x50\xcc\xcc\x63\xe0\xec\xec\xb1\x02\x21\x00\x9d\x7f\x6b\x8c\x9f\xb2\x46\xb2\x5d\xe3\xc6\x47\xfd\x2e\x42\xb0\xea\x14\x20\x4b\x2a\xc2\x3b\x14\xa8\x32\x4e\xb2\x29\xe7\x86\x10\xa3\xdd\x3e\xde\xa6\x35\x23\xb6\x49\x18\xa6\xf3\xfc\x3c\x94\xb5\xd4\x83\xdb\x82\x89\xd9\x18\x71\x8f\xd7\xfa\xd1\xac\x7f\x0e\xd3\xbc\xc2\x9e\xec\x1a\xb5\x05\x80\x6b\x09\x96\x23\xdc\xea\xdc\x5c\x75\xee\xda\x5a\x55\x90\x33\x3d\x01\x4a\x07\xb1\x86\x08\xed\x43\x27\x75\x3b\xb8\x29\xee\xc8\x35\x4d\x00\xa0\xd7\x69\xb8\xb6\x59\x51\xeb\xdd\x82\x9b\xdd\x39\xfe\x53\x89\xb4\x36\x23\xf0\x3d\x0b\x56\x24\x23\xe0\x98\xab\xb9\x26\xeb\xf1\x74\x1a\x47\x99\xda\xba\x98\xf4\xe7\x71\x74\xa9\x77\x2f\x3f\xc3\xa5\x74\x73\xfb\x3c\x8b\x47\xd1\x0c\x76\xe7\x40\x56\x31\x78\xd4\xd5\x79\x42\x41\x79\xc6\xc9\xe4\x5b\x19\x0e\x4a\x06\xc8\x4b\x26\x30\xed\x45\x5a\xb0\x81\x11\x8d\xf4\xc5\x76\x71\xdf\x1d\x0a\x6f\xb5\x20\xe1\xce\x97\xda\x19\xac\x2f\xca\x11\x6b\x04\x0e\x8c\xc7\xa3\x64\x88\xad\xc0\x60\x2c\xd0\xdd\xc5\x38\x41\x6b\x28\x97\xd2\x2c\x79\x47\x66\x5b\x1e\xfa\xe8\x23\x82\x1d\x95\xee\x50\x4a\x63\x4c\xf8\x79\x5f\x0c\x7b\xb4\xd6\xc2\xe1\x81\xb1\x02\xe0\x17\x8e\x69\x39\x37\xba\xc5\xf5\xe5\x93\x06\x44\xd2\x9b\xbf\xca\x28\x19\x3c\x9e\x93\xd6\x0b\xe9\xc6\xeb\x5a\x43\x45\x59\xab\xd8\x1e\x71\xda\x7a\x30\x23\x77\x5a\x2d\xf4\xbb\x85\x49\xf1\xe4\x4e\x65\xb3\x78\x00\x45\x8b\xc1\x36\xd6\x28\x22\xb5\x95\xf8\xb9\xa2\x5b\xa1\x9c\x8a\x12\x98\x12\x1b\x67\xa3\x79\x32\xe0\x61\xae\x64\xa8\xb3\x76\x7b\x4f\x4d\x92\x4f\x10\xfd\xab\x48\x8f\x4b\x11\xca\x74\x31\x2b\x36\xae\xf3\x0f\x89\x4c\xe2\xc0\x97\x54\x5a\x64\xc4\x08\xea\xdb\xd8\xf5\xd4\xf8\x21\x75\x42\xad\x67\x69\x36\xf6\x54\x8b\x15\x2b\xed\xa7\xeb\xe8\x6a\x9e\xaa\xef\x1c\x79\xc4\xec\x9d\x9d\xa8\x23\xb0\x02\x42\x3b\xe5\x12\x88\xb3\x15\x54\x50\x48\xa0\x2d\x9b\x27\xe0\xc9\x07\x54\x6d\xed\x8c\x9d\xda\x47\x51\x2f\x1e\x89\x9b\x3d\xc1\x0f\x16\x01\xb9\xd0\x13\xdd\x40\x27\xf8\x9f\x9b\x72\xf7\xa8\x2c\xa2\xef\xfd\x7d\xdd\xee\x7c\x50\xd4\x99\x9f\x61\x7c\xb9\x8a\xd2\x38\x9a\x32\xc5\x07\xc3\x18\xd4\x2d\xbd\x52\xfd\x77\xe7\xe5\xbf\xd8\x50\xb3\xd9\xac\x90\xa0\xaa\x41\xd1\x75\x92\x8b\xd0\x41\x18\x55\x62\x0c\x12\xf0\xbb\x09\x28\x7d\xd9\x4c\x04\xd4\x91\xa6\x4d\xff\x30\xfe\xb0\x59\x44\xe5\xfc\x36\x8e\x85\xf4\x52\x7c\xa4\x09\xac\x59\xb0\x9f\xba\xf9\xfa\x7a\x1a\x89\x30\x94\xae\x6e\x72\x47\x22\xab\xec\x05\xce\x98\x27\x43\x43\xd7\x59\xca\x83\x27\xb0\x0c\x00\x22\xc0\x80\xab\x0f\x8c\x7e\x09\x86\xdd\x2c\xb4\x79\xff\x64\xfc\x18\x16\x96\x31\x91\x8c\x31\x4b\x30\x72\xb1\xfe\xd2\x40\xbb\x3c\x70\x98\x5b\xaf\xcb\xb1\x7d\x78\x3b\x4a\xa7\x9b\xf9\xcf\x17\x4e\xd2\x42\xa0\xf7\x30\xcf\x9e\x82\x0e\x58\x89\x8b\x3a\x85\xed\x96\x2a\xf1\x56\xa3\x5a\x2c\xab\x7a\x28\x15\x45\x78\x93\xaa\x6a\x8e\x9c\xfd\xd9\x32\x4d\x70\x36\x6f\xa5\xe0\x45\x19\x5c\x95\xee\x4b\x65\xbb\x3a\xf5\x5f\x41\xb2\x2f\x15\xd2\xea\x9e\x85\xcf\x17\xfb\x09\x1a\xb6\x5c\xf0\x27\xe4\xc0\xc7\xc4\x6b\x6a\x26\xb9\xb4\x85\x0d\x28\x74\x93\xd7\x33\x48\x90\x73\x87\xcb\x53\xae\x45\xae\xd6\xf5\xc4\x66\xd1\x66\x4b\xc8\xdd\xae\xc8\x26\xd3\x2b\x86\x5b\xa9\x84\x41\x49\x03\x40\x5b\x45\x20\x7d\xca\x52\xeb\x6e\xef\x14\xb3\xd9\x79\x07\x00\xec\x16\x01\x2c\xcb\x79\xad\xbb\xe7\x0b\x33\xc3\x8f\x25\x6a\xdd\x7d\x0f\x88\x39\x19\xa8\x75\xdb\xed\x7d\x5f\xd4\x19\x6d\x35\x05\x88\x3d\x74\xa0\xda\x59\x39\x50\xad\x1c\xa8\x56\x0e\x54\x2b\x07\xaa\x95\x03\xd5\xca\x81\x6a\xe5\x40\xb5\x72\xa0\x5a\x39\x50\xad\x1c\xa8\x7e\xc3\x0e\x54\x34\xbe\xe8\xc6\x0a\xc7\x69\x52\xd7\x3c\x90\x55\xd8\x0d\x94\x0e\x8f\x85\xb6\x7a\xe9\x8b\x72\x87\x13\x75\x5d\x6c\xe1\xb1\xba\x86\x5c\xe6\x6c\x5d\x03\x2f\x71\xc0\xae\x61\x3f\xf6\xb9\xaa\xa7\xe9\x1c\x46\x11\xa1\x33\x07\xe2\x2c\x71\xe1\x91\x38\x63\x86\x73\x2e\xce\xb0\x94\x9e\x2b\x32\x18\xf7\x64\x51\x28\x6d\xf2\x11\xa5\x90\x25\xd1\x6e\xb6\xfc\x60\x11\xdf\xab\x52\xf6\xc8\x8a\x47\xb1\x14\x48\xf1\x90\x91\x9e\x51\x63\x43\xca\x7a\x3d\x6d\xad\x2f\x5e\x36\x60\xf4\x68\xeb\xe7\x2f\x76\xd8\xe9\x58\x8a\x2c\x83\x2c\x11\x6a\x37\xb8\x61\x33\xbe\xeb\x1b\x0b\x1f\x7a\xa6\x79\xbe\x6b\xd9\x68\x5c\x13\x95\x63\x3a\x62\x5c\xa4\x2d\xbb\x03\x7a\x07\x1b\x89\x1e\x86\x4b\x19\x4a\xac\xe9\x33\xe5\xa6\x12\x69\xa3\xac\xb4\x94\x88\x5b\x6a\x48\x2b\xe3\xf3\x92\x25\x68\xf0\x2e\x05\xcd\x6c\x31\x58\x50\x4e\x84\x4f\x65\xc4\x61\xfc\x5a\xde\x92\x63\x26\x05\x5a\x2d\xb8\xd1\xe2\xf6\xa4\xb1\xbb\x32\x4f\xac\xcc\x13\x2b\xf3\xc4\xca\x3c\xb1\x32\x4f\xac\xcc\x13\x2b\xf3\xc4\xca\x3c\xb1\x32\x4f\xac\xcc\x13\xbf\x61\xf3\xc4\xbf\xc0\x8d\xa5\x5f\xe2\x62\x46\x1f\x37\x16\x7d\xe7\x7e\x4f\x73\x53\x27\xaf\x15\x21\xab\x8d\x36\x12\xe8\x53\x5f\xc3\x20\x64\xf8\xc4\xcf\xdd\x6c\x3f\x58\x62\xa1\xd9\x07\x81\x96\xb1\xf8\x20\xdc\x12\xc6\x1e\x04\xfb\x58\x3b\x0f\x3e\xcf\x55\x7c\x8c\x9c\xa7\x2e\xb4\xf4\x88\xa6\x3b\x46\x1e\x8e\xa1\xd4\xca\xc3\x81\x42\x61\xbe\x59\xde\x8b\x7c\x81\xb9\xe7\x57\xe8\x47\x7e\x2e\xde\xf8\xfc\x64\x5e\xe1\x9f\xcc\x8f\xf5\x13\xfb\xd4\xe2\xca\x36\x4e\x06\x83\x51\x8c\x1e\xac\x8c\x92\x45\xde\xe8\x1d\xe3\x8d\x5e\x70\x69\x5f\xd2\xc5\x18\xb6\xc0\x37\xed\xd6\xa7\x78\xa7\x77\xb1\xa7\xae\x72\x69\x44\x0f\xea\x8d\x7c\xbc\xb1\x43\x3f\xc6\x83\x8d\x6d\xfa\x31\x1a\x6e\x6c\x7d\x12\xff\xdd\x3b\x39\x2a\x7e\x8c\x93\xe2\x07\xb9\xf9\x96\x79\xa3\x95\x79\xa1\x2d\x76\x30\x34\x0b\x80\xe3\x4f\xc8\x99\x9f\xe0\x53\xd3\x1b\xca\xea\x2a\x1d\x0d\x75\x44\x72\x65\x4f\xe3\x6f\x9c\x69\x4b\x99\x4f\xf4\x2d\xe3\x7c\x6b\x3b\x6d\xad\x86\xd7\xbf\xdd\xf0\xd2\x41\xe6\xcd\xf0\x32\x77\x83\x56\xc3\x6b\x35\xbc\x3e\x6e\x78\x3d\x19\xc1\x76\x2f\xce\xc4\xc3\x01\x66\x88\xc9\x17\x13\x57\xe3\x6b\x35\xbe\x3e\x6e\x7c\x89\x17\x6d\xcc\xc0\x92\x8f\x63\x7e\xe2\x81\xf5\x81\xce\xcc\xb8\x8b\x58\xea\x8c\x8e\x76\x3d\x3f\xbb\x33\xb3\x20\xe7\x2e\x2f\x41\xe8\x7e\xa9\x75\x3d\xfe\xc3\x1e\xdf\xdf\x25\x5c\x7b\xf7\x56\x67\x67\xab\xb3\xb3\xd5\xd9\xd9\xea\xec\x6c\x75\x76\xb6\x3a\x3b\x5b\x9d\x9d\xad\xce\xce\x56\x67\x67\xab\xb3\xb3\x7f\x97\xb3\xb3\x55\x6c\xc4\xdf\x58\x6c\xc4\x5f\x47\x84\xbf\xcf\x1f\x21\x4e\x5a\x28\xb6\xf4\x36\x36\xf7\x1c\xb9\x6e\x6d\xf4\x75\xb6\x7b\xec\xca\x4a\x2e\x3e\x79\x65\xc0\x3f\x47\x88\xba\xef\x93\xf8\xc9\x79\x94\xcd\x74\x61\x8b\x3a\x6b\xd7\x2d\x21\x3f\x36\xb4\x1d\x33\x8b\xdd\xd5\x1f\x5f\x17\x5c\xc2\x23\x5f\xc3\x2e\xe7\x93\xaf\xc1\x97\xf2\xca\xd7\xd0\x1f\x7b\x5e\x7b\x87\x30\x75\x95\x11\xf3\x4c\x34\x0d\x15\x98\x04\xb6\xaf\x17\x3f\xe4\xb0\x5d\x64\xf6\x2a\x5a\xaa\x72\x1d\x5f\x4f\xbd\x69\x72\x5b\xe6\xf2\xcf\xf8\x6d\x3f\xf5\xa2\xb8\xfe\xd7\x64\x34\x7a\x91\xce\x27\x65\x61\xf1\x8a\x80\xec\x90\x76\x89\xa0\x76\xd6\x93\xa6\x6b\xa3\x14\x98\x89\xef\x83\xae\x2d\x8c\x61\x47\x61\x47\x7a\xf3\xfe\x85\x88\xe2\x96\x3b\x21\x48\x44\x8e\x1d\x84\x64\xe9\xb0\x6f\x82\x8b\x22\xfa\xdb\xfb\xe0\xba\x1b\x08\x6c\x14\xeb\xa2\x11\xdc\xe8\xef\x39\x9a\x63\x6e\xed\xc0\x70\xb7\xf5\x9f\x25\x28\xdc\x2a\xdc\x9b\xfc\x6f\x15\xee\xed\x53\x84\x7b\x5b\xc5\x55\x5b\xc5\x55\xfb\xcd\xc7\x55\xab\x0a\xa5\xb5\xff\xf9\x23\x69\xed\x7f\xb2\x48\x6d\x1f\x16\x5f\xea\x8e\xb1\xa5\x96\x65\x6f\x69\xf8\x9f\x85\x08\x94\xbe\x89\x5d\x24\x94\x1c\x67\x21\xf6\x07\x09\x92\xc3\x71\x17\xe6\x9e\x37\xff\x5c\x0a\xd4\xed\x32\x80\x3c\xcd\x20\x1b\xe9\xf6\x64\x7f\xb6\xf3\x33\xa6\x7c\x2d\x79\xd5\xcd\xe8\xa4\x3f\xfb\x69\x9a\x45\xdc\x67\x8e\x10\xf4\xb1\x81\x7d\x96\x3b\xb9\xe3\xdb\x37\x3c\xbd\xc3\x9b\x6f\xfb\xab\xd3\xbb\xd5\xe9\xdd\xea\xf4\x6e\x75\x7a\xb7\x3a\xbd\x5b\x9d\xde\xad\x4e\xef\x56\xa7\x77\xab\xd3\xbb\xd5\xe9\xdd\xea\xf4\x6e\x75\x7a\xb7\x7a\x36\x6c\x59\xfa\x16\x3f\x1b\xf6\x1c\xf4\xf6\x1c\xff\x54\xd1\x37\x42\x20\xfa\x5b\x42\x9c\xc6\xb2\x34\x65\xba\xc4\x02\x84\xe8\x4d\xbb\x1c\x69\x1b\x09\x80\x2e\xa2\x0f\xd1\xdd\x9d\x46\x2c\xf5\xaf\x74\x6c\xfc\x4b\x5c\x50\xfd\x77\x7d\x39\x4c\x5e\x6a\xb9\xdb\xd1\xaa\x2c\xb4\xf0\x58\x55\xc2\x2d\x73\xa4\x2a\x41\x97\x38\x4e\x95\x90\x9f\xf6\x21\x31\x79\xea\xf3\xcb\xbf\x25\xa6\x59\xfb\x39\x9f\x13\x13\xad\xff\xb8\x07\xc5\x1e\x0f\x06\x82\xf6\xd0\x9c\x46\xae\x25\xf4\xc2\xd7\xee\x37\x9d\xbd\x27\x7f\x6c\xef\x6e\x6c\x1f\x6c\x3d\xdd\xd8\x6e\x7d\xf3\x78\xe3\x8f\xad\xad\x9d\x8d\xce\xe3\xce\xd7\x3b\xbb\xdb\xbb\xad\xdd\xdd\xc7\xcc\xee\xbd\x46\x67\xb6\xdd\xa0\x9a\x44\x7d\xa4\xf9\x11\xef\x93\xc9\x8a\x9c\x27\xc8\x04\xd1\x95\xaf\x8e\x25\xfa\x29\xb1\xc4\xf3\x82\x18\xa2\x55\xf9\xf8\xfb\x6e\x6f\x85\xe5\x6a\x7c\xe3\x81\xf1\xe0\x17\x7c\x2b\x4c\xb2\x7c\xf5\x5a\xd8\xea\xf8\xf8\xd7\xfe\x5a\x98\xba\x9a\xf9\x69\x8e\x37\x57\xe7\xd9\xab\xf3\xec\xdf\xfc\x79\xf6\x47\x9d\x3e\xff\x3b\xbc\x13\x26\x24\xf9\x2f\xfa\x52\xd8\x91\x43\xc2\xea\xad\xb0\x0f\xf3\x70\xb8\xcb\x1d\xe1\x8f\x7d\xe8\xeb\x03\x5f\x23\x2b\xb1\x47\x2c\xf1\x2a\x99\x96\x44\xbd\x34\x1b\xe0\xa1\xfd\x5a\x7b\x7a\x1d\xc0\xca\x03\x4a\x6a\x6f\x14\x61\x98\xe5\x60\x1c\x65\xc3\x04\xd4\x29\x5c\x78\xb6\x7d\x2b\xb6\xf9\xcf\xa3\x89\xda\xce\x90\x22\xb5\x11\x24\xfe\x47\xd9\xf0\xbf\x65\x35\xad\x2a\x2b\x87\x33\x2d\xa6\x59\x02\x8d\xb8\xc1\x69\xdb\x95\xbb\x35\xd2\xad\x1b\x42\x15\x4c\x2c\x1d\x99\xff\xe7\x99\x2b\xbe\x97\x9b\x7e\x1e\xb7\x0c\xa9\x97\x2c\xe5\x92\xa1\xf6\xb5\x3f\xbb\x3b\x86\x26\xea\x53\xbb\x62\x7c\xac\xaf\x85\x31\x86\xd5\xba\x3b\x9e\x47\x9a\x1c\x63\x19\x00\x79\x88\xf8\xe5\x5e\x62\x3a\x58\x39\x7c\xac\x1c\x3e\x56\x0e\x1f\x2b\x87\x8f\x95\xc3\xc7\xca\xe1\x63\xe5\xf0\xb1\x72\xf8\x58\x39\x7c\xac\x1c\x3e\x56\x0e\x1f\x2b\x87\x8f\x7f\x95\x73\xf7\x5f\xe1\x75\xed\xd2\x67\xbb\x97\x22\x8b\x5e\x05\x5e\x40\x1b\xbd\x01\x7e\x57\xfa\xb0\xd0\x02\xb4\x18\x75\x6d\x49\x22\x11\x74\x11\x95\xf4\xc0\xfa\x9d\xc9\xc4\x52\xbf\xfc\xd5\xf7\xcf\xea\xc9\xf1\xeb\x70\xab\x50\xbb\xf1\x3b\xb9\x55\xc8\x42\x0b\xdd\x2a\x24\xdc\x32\x6e\x15\x12\x74\x09\xb7\x0a\x09\xf9\x6b\xb9\xa1\xce\xfd\x30\x8a\x5e\x12\x9a\x53\xbf\xcc\x3d\xf3\x3f\xc5\x33\xd5\x07\x0b\xdd\x0f\x96\xbe\x27\xee\x3d\xef\x5f\x5d\xfb\x5e\x9d\xdb\xff\x5a\xcf\xed\x57\xc7\xe4\xab\x63\xf2\xdf\xfc\x31\xf9\x6f\xf7\xda\xf7\xbf\xda\xa1\xe8\xb2\x37\xd3\xef\x7c\x37\xfd\xce\xc7\xf7\xb6\x52\xee\x1c\x54\xba\x8f\x11\x94\x78\x0c\x7c\x28\x4f\xca\xb8\x42\xdb\x98\x85\x9c\x59\xec\x5a\xd5\x40\xab\x0c\xb0\x8c\xdb\x2e\xca\x70\xb9\x1a\x8c\x7d\x4e\xec\x2a\x42\xee\x7f\x77\x5e\xd6\x8b\xff\x95\xc6\xd7\x56\xff\x95\xc5\xd9\xd6\x08\x94\x9e\xbe\x11\x54\xe2\x11\x81\x7c\xa4\xd2\x59\x85\xaf\x1a\xcd\x62\x69\xd3\xcb\xaa\x82\x20\xe8\x6a\xfe\x38\x4f\x46\x83\xa7\xa8\x37\x2f\x43\x78\x4f\x41\xff\x1a\x48\x7f\x9c\xf5\x51\x6f\xe9\x43\xe7\x2f\x47\x7d\x04\x05\x7e\x0d\x84\x7f\x37\x8d\xb3\x08\x4f\x1a\x83\xa3\x9b\x1c\xaf\x75\x2c\x43\x7c\x9a\x97\x42\x94\xf8\x2b\x94\x78\x2c\xf8\x7c\x16\x3e\x9f\x1f\x83\x9c\x26\x4b\xf9\x31\xa8\x8d\xe4\xcf\xee\xc7\xa0\x89\xfa\xcc\x21\x25\x6c\xf3\x12\xc0\x54\xa1\x10\xd6\x1d\x00\xf2\xf8\x33\x7c\x9e\xd8\x14\xae\x9b\x42\xbb\xb5\x94\x9f\xc2\x66\x90\x9f\x27\x63\x3a\xae\x9d\xe7\x74\x1a\x9d\xa5\x7d\x3c\xd8\x4e\x26\x41\x0f\xd4\x2a\xd8\x30\x09\x53\x87\x4a\x7f\x18\x14\xfa\xe1\xfd\xad\xb0\xa3\xfc\x38\x8f\xe7\xb8\xc5\x3f\x3e\x11\xdf\x40\x53\x42\x27\xdc\xea\xb8\x8d\x52\xfb\xf3\x0c\x8f\xa1\xfe\x0f\x02\xb3\x72\xcf\xf0\x31\x03\x80\xdc\x68\xf3\x53\x9b\xfe\x28\x8e\x26\x3f\x4c\x5f\xe2\x08\xe3\xcf\xc4\x17\x51\x63\x2a\x1a\xde\x39\x7a\x79\xd6\xcc\x97\x27\x45\xa3\x05\x06\x3d\x00\xbb\xef\x90\xf2\xd4\xec\x90\xa7\x55\x76\x41\x4e\xa4\x9a\x43\xa2\xda\x1f\x4b\xea\x23\x42\xa9\x96\x50\xcf\x3b\x7e\x30\xc3\xf3\x65\x31\x3a\x23\x94\xed\xe3\xa8\xf8\x95\x80\x5b\xb9\xa7\xce\x40\x11\x19\xc7\x30\xdf\xf0\x2c\x20\x06\x1e\xd1\x47\xe8\xb0\x4d\xd6\xcc\x98\x46\x27\x7b\xf7\x34\x12\xa0\x1b\x12\x79\x1b\x44\x09\x3a\x94\x0d\x21\x85\xd3\xc1\x59\xa7\x4a\x1d\x16\x18\x8c\x83\x40\xa5\xc9\xb3\xdd\xf5\x75\xc6\xc4\x2f\x03\x07\xad\xaf\x03\x7d\x8a\x05\xcf\x3f\x36\x08\x61\xa7\x34\x9f\x84\x8e\xb4\xbd\xbd\x57\xfc\xe5\xed\x48\xfc\xaf\x8c\x09\xa2\xa8\xd3\x6a\x5c\x48\x0a\x5c\x65\x43\x11\x7b\x20\x53\xdd\x21\xfb\x08\x88\x83\xae\x97\x13\xa9\x39\x91\x9d\xc3\x8f\xcd\x51\xaf\x52\x6d\xc6\x7e\x89\xb2\x61\x2e\x6d\x92\x8f\xb3\x2c\xba\x09\x21\x61\x8e\xcb\x99\x72\xa3\x80\xd5\xa9\x5d\x37\x83\xbf\x90\xfd\x15\x64\x33\x1e\x5a\x5e\x19\x6d\xe1\x95\xe1\x96\x51\x9e\x19\x16\x23\x91\x90\xe3\x04\x6b\x43\x91\xac\x8b\xa0\x9b\x86\xc3\x62\xf1\x57\x70\x91\x6c\x5d\x48\x3c\xba\xfa\x61\xdb\x1a\x84\xa8\xce\x28\xe6\xec\xa6\x73\xdf\x36\x9e\xda\xdd\xf7\x8d\x7f\x36\xbe\xcd\xac\x69\x04\x2d\x33\xaf\x60\x44\x83\x40\xbb\xdc\x0f\x46\xc9\x05\xac\x46\x53\x58\x57\x12\x60\x2c\xda\xa4\xc5\xd9\x79\x6e\x26\x1e\x27\x09\x38\xab\x2a\x22\x65\x17\x92\x45\xaf\x30\xfb\x25\x41\x51\xdb\xe1\x5f\xec\x48\x44\x60\xcc\xa8\x38\xfa\xac\x9e\x74\x11\x36\xd1\xbf\xe9\x26\x24\x55\x95\x61\xc4\x31\x71\xa8\xc7\xc4\x4c\x1e\x27\xac\x49\xd1\xbb\x66\xb2\x64\x8a\x9e\xbb\x2a\x3d\x9e\x5c\x4a\x11\xac\x52\x80\xc5\x97\x72\x02\xaa\xa4\x4b\x6d\xa7\x5e\x5b\x3b\x0c\x80\x47\xf1\x78\x3a\xbb\x21\xef\x21\x18\xb8\xb3\x34\x88\x2e\xd3\x64\x00\x12\x66\x08\x52\x3d\x48\xf2\x7c\x1e\xe7\x6e\x61\x25\xe9\x0d\x0b\x27\x69\x3a\xc5\x76\xb2\x41\x4d\x75\x60\x3a\x23\x67\x30\x40\x6f\xcf\x78\x22\xcc\xeb\x56\x5e\x8a\xc7\xdf\x85\xc4\xb3\xb3\x42\x5a\x16\xe3\x4e\xb4\x14\x8f\xc8\x7e\x3c\x1a\x29\x88\xbc\x00\x12\x8b\xab\x7d\x22\xd1\x70\x35\x99\x0c\xe4\xdc\xd5\x3d\x87\x11\x3b\x4d\xef\xd9\x16\xd7\x35\xb7\x60\x92\xd3\x89\x75\x3e\x9f\xe2\x6a\x18\xd3\x11\xd9\x2d\xab\xa0\x7f\x35\x70\x87\x85\xd2\xb6\xd6\x36\xd7\x02\xd6\x6d\xfd\xf3\x41\x92\x59\xb0\xf0\xbd\x90\x0e\x51\xaa\x84\x0a\x05\x34\x1f\x47\x39\x97\x33\x9c\x8a\xd6\x21\xf9\x49\x80\xda\x84\x4a\x43\x7b\x39\xe7\xc6\xfb\xf7\xd0\x50\x3e\xbd\x21\x43\x1e\x88\x6c\xe9\xd1\xf8\x9f\xf1\x20\xf8\x6b\x34\xcb\x41\x2d\x04\x00\x8f\x37\xe3\x8b\x67\xaf\xb5\x6b\x5c\x08\x1f\xf5\x06\xcc\xea\xf8\x9e\x76\x20\x7c\x1b\x0f\xae\x44\xf9\x61\x32\x3b\x9f\xf7\x9a\x49\xba\x49\xe6\x11\xec\x93\xfc\x1e\xba\xbd\xd9\x2e\x69\xf7\x7e\xe7\xb8\xc1\xfd\x8e\xa9\x0e\xd2\xac\x92\x0b\xc8\x7b\xbf\xfb\x1d\xa9\x1f\x98\x4c\xaa\xea\x1a\xc1\xff\xce\xe7\xa9\x56\x2a\x13\x7f\x27\x90\x40\x7e\x41\x0c\x42\x16\xf9\x75\x40\x6a\x5d\xfb\xcc\x50\x0d\xaa\xc8\x6b\xe1\xae\x20\x3d\x1b\x20\x41\xe4\x92\x0b\x8d\x98\x8a\x6b\x24\x02\x15\xe8\x4f\x3f\x05\x6b\x93\xf9\xb8\x87\x3b\x76\x96\x2e\xe9\xf8\x9d\x6a\xc9\xfa\x43\xdc\x1c\x05\xeb\x06\x23\xf3\xcd\xa1\x65\x03\xf4\x6c\xbd\x7c\xd4\x4b\x8b\x1b\x86\x59\xb2\x0a\xcb\x14\xd0\xae\x09\x79\xea\xa5\x4b\x33\xf4\x22\xbe\x41\x35\x92\x18\x22\xb2\x7e\x27\x17\xa9\xe6\x79\x94\x33\x9f\xa9\x10\x20\xeb\x28\xf7\x21\xeb\x18\x7e\x9f\x68\xf8\x22\x95\x90\x7d\x28\xf2\x6e\xef\xe9\xbf\xf8\xe7\x16\x69\x94\x83\x5a\x96\x6a\xe6\xf3\x1e\x30\x36\xc4\x25\x92\xf2\x99\x93\x8b\x18\xd5\xc2\xc1\x45\xfb\x15\x91\x87\x8b\xad\xdf\x0a\x52\x0a\x3a\xaf\x61\x16\xa2\x36\x8c\x91\xd8\x05\x3e\xe2\x8e\xed\x3e\x63\xe5\x37\xa3\xf1\x40\xc0\x28\x76\x02\x84\xc9\xaa\x63\xcd\x20\xac\x1f\xbf\x78\xda\x0c\x5e\xc5\x43\x94\x6d\x19\x79\xfa\xa0\x27\x6b\x3a\xb9\x19\xa7\xf3\x5c\x91\x0b\xa0\xa2\xa4\x3b\x41\x6c\xa6\x28\x92\x7f\x77\x5b\x37\x84\x23\x94\x3c\x53\x60\xb3\xc6\x6d\x24\x08\x89\x10\x97\x6e\x25\x2b\x3a\xcb\xc8\x8a\xfb\x5c\xe6\xdc\x13\x5a\xcd\x60\x4b\x9f\x03\xca\xb5\xa5\x1b\xd4\xb6\x9a\x3b\xcd\xdd\xda\x3d\x79\x16\x28\xc0\x4e\x69\x89\x3c\x42\x3f\x62\x5a\xd0\x9a\x39\xfe\x6c\xe8\x1c\x2e\xd2\xd0\x5f\x5c\x49\x4b\xe5\x7d\xc6\x11\x88\x03\xcd\x91\x88\xe5\x60\xd7\x32\x48\xfb\x34\x8f\xd5\x59\xa6\xfa\x46\x10\xa3\xa8\x1b\x38\x65\x52\x98\xa4\x83\xd8\xa9\x12\x93\xb0\x13\x29\xaf\x99\x5e\xc1\x52\xf4\x54\x61\x87\xe9\x4c\xa9\x03\x27\xa1\xde\x74\x10\x8b\xc3\x50\xbb\x6e\xd1\x3d\x77\xad\x12\x92\x8b\xa9\x4d\xb9\x5d\xfe\x4b\x02\xcb\x49\x81\x28\x59\xc4\x64\x18\xe0\xba\x22\x8c\x76\x28\x86\x1f\x7a\x91\xca\x6e\xcc\xf1\xae\xe4\x3d\x87\x73\xdb\x09\x8b\x57\x32\x1a\xbc\x84\x5a\xf2\xfa\x71\xeb\xa4\x89\xf5\xa1\x20\x51\x3b\x30\x3a\x11\x0d\xf8\x6d\xf7\x45\x1d\xaf\xf4\x66\x14\xe5\x98\x2e\xc5\xb7\xd4\xf1\x2c\x4d\x3a\xa9\x17\xf6\x27\xc9\xc6\x46\x5d\x40\x82\x40\x97\x18\x2c\x0d\x57\x72\x5c\xaa\x80\x52\xeb\x65\xd6\x14\xc9\x9a\xfb\x68\x84\x83\xd6\x5c\xd5\x03\xf5\xcb\x59\x7c\x79\xff\xad\x23\x4d\x08\x17\x9a\x81\xb9\x1c\x83\x35\x5f\x6d\x4b\x57\xed\xe9\xb3\xbf\xd4\xea\x4d\x32\x1b\x48\xe7\x32\x21\x65\x6b\xe9\x34\xea\x27\xb3\x9b\x1a\x28\xcd\x8d\xa0\x56\xab\xbb\x8c\xb6\xcf\x9b\xe5\xec\x88\x05\xda\x53\xee\x71\x47\xd3\x44\xf5\x22\xf3\xab\x63\xe0\x50\xf1\xe3\x99\xf4\xbd\x47\x3f\x4f\x0f\xa2\x26\x87\x29\x2d\xfc\xf2\x68\x99\xe2\x2f\x8f\x08\x01\x35\xba\x48\xea\x93\xa3\x23\x3a\x60\x7b\x1a\x83\x48\xcb\x22\xdb\xa7\x97\x15\x64\xdc\x12\x95\x3a\xf8\x38\x3b\x0f\x4d\x47\x54\x93\xc6\xfb\x5e\x44\x83\xa7\xb3\x70\xcb\x4a\xe0\x6f\x3a\x77\xc2\x60\x25\x61\x15\xd4\x9d\xc7\xe2\x16\x2c\xc1\x23\x4e\x4a\x0e\x83\x01\x30\x52\xf8\xfc\xe5\x49\x7a\x79\xc4\x89\xf2\xe0\x28\x27\xae\x82\x97\x25\x2c\x42\xd7\x93\x24\xcd\x60\xc8\x3a\x94\x15\x7a\xab\x8a\x53\x0c\x4b\xc9\xa4\x1d\x6c\x35\xa3\x1c\xb4\x52\xb9\x15\x40\x29\xa3\x3e\xdd\x35\x40\x67\x84\x51\x23\xe8\x39\x53\x39\x02\xd5\xb1\x17\x3c\x0a\x36\xda\x41\x17\x3e\xbe\xa2\x0f\xf9\xfb\x21\x7d\xb4\xe0\xe3\x65\xf4\xf2\xd0\x54\x8c\x0e\xd0\xb1\xbb\x09\xf1\x21\xef\xa1\x5e\xaa\x90\xf7\x00\x79\x24\x91\xf7\x10\x79\xe4\x20\x3f\x14\xd8\xc7\xc9\xc4\x42\x8b\x92\xab\x11\x9c\x71\x1b\x43\x42\x66\x10\x60\x9b\xda\xdc\x1a\xa1\x09\x44\x54\xd8\x16\x68\xb7\x6e\x3a\x46\x1b\x79\x50\x81\x9e\xd4\xa9\x4c\xd8\x53\x48\x41\x8e\xd6\x41\xd9\x12\x2e\xbf\xb0\xc6\x10\xd1\x3d\xde\xad\x18\xb6\xa3\x67\x64\x6d\x0f\x64\xda\x85\xee\xaf\x0f\xaa\x83\x7a\xa0\xce\x11\x3b\x56\xbd\x52\x74\x67\x62\x3c\x49\x76\x29\xe4\x78\x19\xf2\xe7\x6c\xc4\x92\xb5\x7a\x9a\x65\x0d\x42\xab\xff\xa3\xeb\x7f\xdf\xfe\xa7\x49\xf2\xdb\xeb\x7f\x4f\xb3\x4a\xfb\x3f\xbe\x9e\x09\xc5\xf6\x23\x86\x40\x23\xe8\x7f\xde\x51\xd0\xff\xa4\x23\x81\x63\xa7\x16\x14\xa6\x8f\xca\xe9\xa3\xf8\xae\xdb\xd5\xdf\x7e\xbe\x71\xf3\x51\xcd\x5e\xa2\xe6\x4f\xc2\x08\x3e\xd2\x8e\x71\x78\xf4\x83\x13\x3d\xe0\xf8\x42\x29\x0c\x17\xe1\xb5\xb3\x8a\x5d\xeb\x1b\x4b\xb0\x60\xc1\x62\x05\x4b\xd6\xfa\xb5\x6f\xc3\x43\xf7\x2f\x92\x7e\x01\xc1\xfd\x04\x76\xa4\x2f\x21\x99\xad\xa1\xf9\x7c\xbc\x68\x88\xe3\x76\xb6\x55\x32\xc2\x13\x76\x10\xf0\xa1\x63\x9c\x51\x8c\x0c\x5d\xd7\xc3\xb0\x1e\x90\xf1\x22\x5a\x5a\x00\xb9\x98\x2a\x7a\xd6\xc1\xcd\xd9\x94\x5b\xab\x40\x1c\x2d\x54\x03\x16\x33\xa8\x11\xbc\xc5\x1d\xd4\x27\xe5\x93\x19\x28\x86\x61\xba\x55\x82\x57\x1b\x1b\x6f\x3f\x94\x77\x06\x7b\x15\x13\x4b\xeb\xd3\x0d\x7d\x5b\xd7\x6c\x0d\x36\x83\xb7\x9c\xb5\x3f\xce\xa3\xc9\x2c\x19\x59\x4a\xbe\x78\x0a\x0a\xd4\x4e\xce\xdf\x6f\xd1\x49\x5c\x3e\x12\xc5\xce\x6e\x82\x07\xc1\x14\xb4\x54\x60\x2e\xb0\x2f\x78\x11\xcd\xce\x9b\x67\xa3\x34\xcd\xc2\x6f\xeb\xa0\xc3\x62\xff\x8b\x32\xc7\x04\x0e\x14\x63\x4d\xdf\xc2\x6f\x79\x38\x25\xe9\xc2\x4b\x6a\x97\x80\x27\x06\x7c\xa1\x2a\x71\x02\x60\x97\x78\x75\xe8\xd2\x1e\x0c\x83\x64\xf1\x70\x10\x7c\xcb\xc9\xec\xf2\xf9\xa6\x8d\x7f\x38\x48\x5a\xc4\x71\x52\xe4\x3f\xa0\xfd\x84\xa3\xc1\x5f\x9d\x6e\xa6\xca\x56\x67\xbd\xda\xd8\xa4\xc7\x82\x06\xc1\x47\x43\x42\xbe\x69\x80\x3e\x6d\xee\xd4\x79\x6f\x00\xaf\xc5\x4d\xfc\x45\xfd\x51\xe8\x81\xb1\x98\xb0\xd0\x11\x83\x86\x9a\xbd\x7c\xa2\xb6\x3e\xbc\x67\xec\x75\x62\xa9\x3e\x32\x45\xa0\x59\x48\x2b\x8c\xbd\xf1\x21\x4b\x1c\xe3\x1c\x1b\xc0\xf4\x59\x5f\x7f\xcb\xd3\x73\x91\xfe\x00\xd7\x23\x28\xc2\x5f\x45\xbb\xcb\x12\xbc\x24\xc9\xd5\x3d\xff\xf3\x37\xc2\x88\x14\x71\x34\xcb\xc4\x0a\x24\xa9\xc3\x5c\x35\x38\x06\xf1\x65\x42\xc6\x0a\x9f\xf9\x08\x47\xc5\x25\x35\x4e\x0f\x22\x69\xb7\x17\xdb\x60\xdd\xe9\x75\x4b\x52\x5c\x82\xa4\x20\x31\x93\xff\x08\x83\xd3\x11\x0f\x7c\x01\xee\x25\x79\x8c\x37\x42\x42\xbc\x46\x11\x65\xae\xd9\x51\xf1\x6a\x14\x9f\xcd\xba\xd6\xc6\xf5\x1a\x0d\x02\x20\xcf\x92\x82\xc2\xe1\x0e\xc3\x2f\x83\xad\x3a\xc0\x9a\xc1\x5a\x01\xb9\x5d\x07\x8c\xd8\x27\xd6\xd9\x3c\x1b\x0a\x80\xe7\x4b\xa7\x52\xc1\xa4\x31\x85\x71\x84\xec\x75\xc4\xf0\xd5\x57\xc0\x78\xde\x77\xa4\xf0\x88\x26\x86\xd1\x31\x00\xc3\x70\x00\xa5\xe3\xcb\xa0\x25\x69\xc3\xf2\xeb\x78\x5a\x4e\x03\x90\x88\x18\xf3\x78\x90\xc6\xb5\x40\xb2\x66\x94\x6a\xa5\x49\x79\x8e\x49\x8f\xf7\xdf\x1e\x9b\xbe\x42\x36\x69\x9e\x08\x16\x59\x5c\x5b\x8a\x4d\x62\x72\x28\x8d\x4e\x1a\x1e\xc5\x00\x14\xd3\x57\x0f\x46\x4b\x9a\xca\x69\x22\x32\x9f\xc3\x40\xe4\xc0\x4d\x1c\x99\x16\x84\x98\x2c\xe2\xf7\x2b\x3a\xb9\xe4\xe0\xd4\x45\x16\x7c\xca\x8f\x63\xc3\xb3\xe2\xe9\x82\xa6\xea\xcc\xf6\x60\x78\x64\x4a\x0d\x88\x4b\x8a\xd7\xec\x60\x42\xdb\x91\xce\xc2\x41\x1d\x81\xd4\xb2\x06\xa3\xc4\x12\x02\xf9\xf9\xfc\xec\x6c\xe4\x5b\x20\x12\x94\xf8\x6d\xee\x36\x14\x8e\xf9\xb1\xa4\x5e\xa2\x68\x00\x29\x1a\x92\xb6\xb3\x94\xa8\x5e\x40\x04\x63\x80\xed\xc0\xea\xd9\x32\x83\xcd\xb8\x1a\x21\x72\x28\xbd\x41\x15\xcf\xa0\x6e\x01\x20\x07\xd6\x98\x55\xa1\x54\x99\x2c\x9a\x0c\xd2\x71\x88\x5a\xce\x78\x63\x23\xf8\xc9\x0c\xe0\x99\xde\xaa\x81\x4c\x05\x84\x27\x0d\xfb\xd3\xec\xe4\xec\xec\x44\x67\xcf\x7c\x7b\x5f\x65\x99\x57\xcc\xc3\xd8\x2a\x8e\x09\x56\x31\x0f\x3d\x80\xe2\xdc\xdd\x06\xcb\x64\xbd\xca\x4a\x04\xb9\xf7\xec\x80\x9f\x1b\x28\x40\x71\x74\x20\x89\x15\xc8\x20\xe9\xc4\x92\xc1\x0a\xd6\xa2\x34\x4a\x48\xdd\xb2\xe9\x74\xc9\xf3\x68\xe8\xb8\x6a\x00\x9d\x90\x33\xd5\x3d\x7b\x8c\x0c\x53\x18\x0d\xdd\x13\x94\x6a\xd2\x50\x38\x71\xda\x20\x96\x51\x2a\x23\x9a\x70\x0c\x38\xe1\x9f\x69\xdb\x42\x0c\x0b\xee\x49\xe0\xb4\x06\xcb\xf0\xa6\xbc\x4b\xa6\xbe\x05\x4b\x44\x3d\x98\xf8\x46\xa8\x5e\x08\x95\xd7\x98\x75\x28\x8f\x1a\xcd\x58\x4c\xde\x71\x32\x31\x52\x8f\x0c\xf7\x50\xd9\x73\x81\xa4\x11\xc0\x6f\xbb\xc1\xb0\x12\x07\x42\x45\x18\x1f\x06\x66\x7c\x6a\xec\x6f\x95\xe1\x83\xca\xc2\x07\x62\x10\xcd\x67\x5c\x23\x24\x6f\x91\x41\x1c\x49\x80\xc0\xc7\x6f\x6d\x7f\xa8\xb7\x27\xec\xc0\xc8\xb3\x65\x46\xfc\xde\xd5\x56\x37\x23\x1c\xb8\x72\x86\x4d\x53\xb9\xdf\xa5\x3b\x6a\xd3\x34\xb7\xc6\xf5\x38\x9a\x65\x89\xbb\x5b\x16\xbd\x21\xf5\x82\xc1\x16\x86\x88\x23\x28\xde\x5d\x17\xf1\x4d\x6e\x23\xb2\x36\x2e\x32\xbb\xd0\x33\xf2\x74\x9f\xa0\x11\x46\xe8\xcb\x78\x92\x6f\x8d\x0e\xcc\xb2\x15\x5e\xdc\x9c\x54\xd4\xa7\x01\x2a\x6b\xe4\xcf\xed\x42\x82\xf0\x1a\xb0\x15\x1d\x82\xe0\x55\x43\x0f\x65\x49\x65\xdd\x06\xa2\xb2\x72\x09\x26\x1f\xfb\x95\xbd\x4d\x77\x1e\x31\xf4\xcf\x3d\xb5\xa6\xd2\x85\x47\x45\x9c\x18\x0b\x36\x89\x12\x8f\xbd\x3b\xcb\x86\x45\x71\x95\x7b\xb7\x02\x46\x4a\x8d\x1d\xd5\x1f\x52\x10\xcf\xa0\xc1\xcf\x2a\x5d\x95\xf9\x2d\xed\x7a\x09\x11\x0c\x5a\x6b\x31\x10\xa5\xad\x59\xf0\xd6\x96\x17\x1b\x1b\x13\x34\x62\xb5\xcc\x7c\xb0\x1c\xe4\xf2\xe3\x89\x9e\x06\xe3\x92\xf5\x46\x63\x1a\x3b\x98\x54\xfd\xc7\xb0\x15\x37\xc2\x74\x5c\x35\xaf\x44\x01\xcd\x48\x72\xb8\xe9\xe5\x6a\x19\x82\x9f\x92\xbd\x19\xde\x61\xe2\xec\xcd\x67\xf4\x98\x64\x3e\x4b\xa7\xf8\x37\x9e\x72\x69\xe5\xd7\xc4\x14\x99\x08\x1d\x3c\x34\x2a\x4e\x49\x89\x8e\xe5\xc3\x08\xf5\x40\x19\xaa\xf5\x90\xa5\x8a\xb7\xd6\x5b\xbe\x16\xd2\xba\x4e\xe5\x36\x04\x60\x1d\x36\x0b\xa2\x6e\x50\x36\x9e\x4d\xce\xf0\x16\x14\x2c\x14\xae\x8b\x58\x2d\x11\x59\x71\x40\x8d\x56\x67\x72\xc8\x1a\xc5\x05\xdc\xda\x5f\x08\x25\x88\x92\xe8\x0a\xfe\x30\xce\x8e\x60\x93\x04\x5a\x5e\x2f\x0f\x89\x23\x75\x36\xba\x04\x12\x41\xf0\x83\x87\xc1\x85\x60\x9d\xfe\x19\x8b\x9f\x66\xeb\x49\x49\xa4\x4b\xcb\xee\x0e\xdf\xaa\xf6\xc3\x4a\x2e\x0a\xa0\x88\x46\x4d\x12\x31\xd5\x05\x71\x62\x6a\xbd\x85\x96\x5e\xd4\xa5\x56\xb9\xa8\xfc\x97\xa5\xe5\xf9\x40\xa1\x5c\xaf\x04\xf6\x70\xe0\xda\x92\x83\xa6\xaf\x25\x29\xd7\x50\xf5\x45\xf0\x07\xdc\xc7\x5d\x60\xb3\xdb\x2d\x5b\xf2\x29\x89\xcd\x6b\x21\x97\x9a\x50\xc7\xfc\x92\xc1\xb7\x54\x3d\xae\xb4\x29\x42\x04\x25\x61\xc8\xdc\xe0\x5f\x14\x83\xcc\x8c\x3b\x29\x8c\x0c\x3e\x92\x49\xe6\x5e\x4b\x21\xdc\x8d\x1a\x88\xfc\xb2\x88\x94\x50\x91\xb5\xba\xab\x20\x57\x96\xb5\x42\xc0\xe0\x58\x84\x26\xbf\x88\xa6\x21\xf3\xf8\x95\xd1\xb5\x58\xd0\x23\x01\x63\x5a\x28\x20\x9a\xc0\x8c\xaf\xa3\xfe\xb9\xf6\x67\x0a\xa9\x4d\x85\x83\x6a\xa8\x0b\x8f\x92\x79\xee\xa1\x4b\x7d\x99\x3f\x9c\x8c\xa8\x65\xfb\x3c\xf0\xd3\x10\x49\x8a\x92\xb3\x69\xe5\x5c\x97\x56\x15\x57\xce\x2a\x02\x93\x86\x44\x87\x26\x13\x7b\x50\x17\x60\xa5\x9d\x42\x31\x37\xd5\xa4\x48\x6b\x05\x24\xf9\xed\x60\xee\x08\x92\x2d\xb4\xb9\x24\x51\xb1\x35\xd3\x16\xa6\xd1\xd4\x3b\x43\xa8\x23\xb9\x5b\x33\x46\x20\xb2\x83\x2f\xd1\x39\x83\xb3\x8f\x03\x74\xe2\xd4\x1f\xa0\x6b\x3a\x78\x51\xad\xa1\xf2\xde\xc5\x19\x65\xbd\xb9\x6e\xb5\x6a\x42\x4e\xcb\x69\x22\xea\x54\xe3\xf8\x3c\xca\xbb\xaa\x0c\xfc\x16\x83\x77\x18\xf3\x6d\x35\xf9\x11\x3a\x9b\x2d\x41\xe9\xb1\x2c\x18\xe7\xfd\x68\x1a\x13\xa0\x5c\x4f\xe4\x1e\x3d\x77\x11\x15\x86\xda\x42\x7c\xd0\x08\x11\xeb\x8c\xe3\x15\xae\xc9\x9a\x70\xf1\x29\xb2\x50\x35\xd2\x19\xf8\xc1\x22\x25\xe4\xdd\xa2\x02\x5d\xa2\x1f\x15\x3b\x5d\x90\x68\x2b\x49\x92\x6c\xd6\xe7\x1e\x4d\x49\x53\x2d\x35\x93\x52\x22\x8a\x8a\x52\x39\x15\x5e\x6d\x49\xea\x4b\xb2\xf1\xf3\x09\xe3\x63\xc3\x95\x5a\x8c\x74\x67\x62\xfb\x34\x29\xd3\xa3\xc9\x3b\xc3\x77\xfc\x90\x4d\x43\xd7\x77\x9d\x4e\x5f\x0d\x25\x7c\x51\xde\x74\x3d\x5b\xfe\xf2\xc6\x9d\x71\xcf\x13\x6f\x6b\x82\x22\xe7\x49\x9a\xd6\xdd\xe9\xe5\x0c\x27\x5b\x91\xc7\x24\xd4\xd7\x6a\xb5\x3a\xc9\x19\x6b\x5e\xfd\xf4\x13\x92\x75\x8c\xdb\x62\x93\x45\xd3\xea\x91\xf5\x45\xde\xb3\x41\x57\xf8\xd0\x16\xd7\xa6\x02\xed\xa5\x24\xf8\xab\x82\x7c\xe1\xa1\x19\xb6\xeb\xd5\xb5\xc0\xf4\xf5\x54\xe0\xe1\x81\xe6\x74\x19\x26\x31\x9f\xca\xa8\x7d\xe8\xc1\xc9\x90\x0a\x77\xdb\x51\x3c\x8b\x79\x27\x95\x55\x85\x33\x34\xbc\xc3\xce\x48\x0d\x11\xb3\x39\xf2\xf1\xb8\x64\xb7\xe4\xa9\x1f\x87\xb0\x55\x3f\x26\x18\xad\xb1\xac\xfa\xf5\x75\x84\xb3\x6a\x51\x09\xbe\x5a\x68\x42\x84\x65\x0a\x89\x42\xaa\x82\x99\x9a\x0b\x4f\x4a\x3a\x66\xf3\x98\xed\x54\xa1\xa5\xb3\x32\xe3\xb5\xcc\x7b\x7f\xdb\x30\x9c\x6c\xd0\x43\xeb\x7f\xb6\x3f\xff\x22\xcf\xd3\xf0\x2e\xe7\x7c\x2a\x5b\xab\xc8\xc6\xdb\xe8\xf0\xbf\xd7\xa4\xf5\x48\xdb\xce\x20\x9e\xf2\x5b\x78\x22\xe8\xe6\x14\xaf\x43\x3d\x14\xbd\xe1\x9c\xdd\x08\xc4\x30\x82\xc5\x0f\x31\xa5\x91\x3c\x7d\x39\xa8\xcb\x08\x01\x38\xb1\x9d\xa1\xe3\x1d\x93\x8e\x50\x96\x6b\x68\xb5\x6b\x85\x18\x9f\x48\xce\x31\x11\xb7\xbe\x7e\x42\x89\x7f\x11\x9e\x6f\x6a\xe9\xcf\x29\xbe\xa5\x5c\x8c\xf2\x3f\xde\xfc\x39\xbe\x71\x54\xab\x86\x25\xc0\x17\x1d\x8d\xe8\xe5\x83\x21\xc4\x20\x51\xa1\xaa\x5a\x10\xa5\xa3\xa2\x06\x65\xa7\x3c\x7c\x71\x51\x91\x49\x75\x76\xe1\xfa\x64\x60\xd5\x97\xb3\xfa\x1a\xc1\xb1\x8a\xb8\x7a\x52\x7a\x70\x22\xad\x93\xa2\x9f\x39\x1d\x9a\x4c\x99\xc7\x6f\x00\xe6\x2a\xc8\x28\x5f\xd6\x65\x9d\x97\xb2\xcb\x38\x85\xa9\x8e\xc7\xc8\x00\xad\xf1\xa5\x4e\x76\xc5\x00\xe3\xd4\x6a\x95\xd3\x6d\xb8\x26\xf0\xfd\xed\xc7\x52\x76\xac\x80\x4e\x44\x7b\xcb\xe8\xf2\x91\x75\xaf\xd8\x09\x4a\xbf\x16\xc4\xb8\x2b\xaa\xa8\x92\x6b\x87\x7a\xca\xc9\xc5\x16\xab\xbf\xfb\x5c\x93\xca\xa5\x9a\x1f\xca\x6a\xc0\xa6\x3e\xee\xef\xa4\x10\xd0\x33\x43\xdb\x12\x40\x8d\xf5\xef\x0b\xe0\x8f\xb5\x89\x90\x06\x09\x57\xeb\x28\xda\x69\x0c\x5b\xba\xba\x65\x02\x99\x6a\x9c\x61\xa7\xe7\x2d\x2d\x25\x52\x25\xed\x96\x6c\xf0\xba\x73\x16\x0b\x85\x91\x08\x19\xdd\x6b\x1a\xeb\x19\x56\x61\xcb\x13\xd1\x09\x28\x95\xdc\x2d\x98\x94\x7a\x85\xd9\x61\x38\x5e\x90\x90\xfa\xd2\xe4\xa1\xc1\xea\x31\x8f\x59\x36\x68\x57\xd9\x42\xa4\xa1\xd8\x10\x32\xbc\x7e\xdc\x42\xd8\x99\x53\x11\x83\x93\xad\x8e\x2e\x4f\xb1\x64\x11\x15\x5b\x20\xcc\x26\x14\x9f\xc4\x60\x96\x19\x35\x7c\xd8\x00\x54\x77\x57\x09\x74\xe9\x8a\xfe\x52\xb0\x56\x7a\xaa\xd2\x40\xcb\xe3\x96\x2b\x8e\xef\x78\x29\x08\x4c\xe6\x22\x5c\x4e\xba\x3e\x32\x8a\x8b\x2e\x7f\x96\xe2\x40\xf9\x72\x0d\x39\x8a\x67\xa1\x75\x85\x98\x80\xed\x5b\x71\xc5\xf5\x4b\xdc\x93\x9b\x1c\x0a\xdb\x0b\x20\xc4\x7b\x9e\xc6\x23\xc0\x56\x37\xe2\x99\x77\x3f\x49\x35\xdf\x61\x3f\xc9\xf7\x85\x47\x18\x73\xbd\x62\x5f\x08\xd4\x94\xed\x0b\xcb\x36\x70\x52\xb7\xa5\xb3\xa5\xcc\x5c\x69\x37\x9a\xd9\xb2\xfb\x3a\x25\x4d\x0a\x3b\xbb\x5f\xc7\x8e\xa4\xb0\x09\xc1\x03\xcf\xf8\x3c\xba\x4c\xe8\xc0\xf3\x7d\xa1\x9f\x92\x01\xcc\xf8\x04\xb4\xc2\xc2\xd1\x04\xd3\xf4\xb2\x18\xaf\xc4\xf2\x61\xa7\x22\xe3\xe7\xe9\x3c\xeb\xc7\xee\x49\x96\xd6\x89\x6c\x23\x0a\x5a\xae\x67\xe7\xa9\x3c\x5e\x77\x55\x19\x81\xf2\x58\x80\x04\xf6\x0d\xcc\x13\x69\xc8\x8c\x45\xf8\x49\xab\x72\xf5\xaf\x2c\xe9\x8c\x4f\x01\xeb\x1d\xa2\x25\xd8\x04\x1a\x87\x1b\x55\xfb\x75\x5c\xb0\xa9\x8c\x3c\x8a\x51\x88\x5c\x27\x0d\x7b\x4f\x4e\x7b\x2c\x01\x0a\x0b\x8b\x20\x02\xfd\x35\x98\x91\xc1\xa7\xc6\x5f\xc6\x93\x41\x9a\x1d\xdd\x8c\x7b\xa9\x31\x21\xf1\x5b\xcd\xe4\xc6\x04\xdf\xdc\x40\xa4\x44\x09\x24\x4b\x39\x85\x00\x0f\xe9\x9f\x66\xff\x3c\xca\x1e\xcf\xc2\x56\xbd\x39\x4b\x7f\x98\x62\xc8\xe9\x28\xc7\xbd\xc8\xba\xc8\x56\x9b\x3e\x67\x23\xc2\x44\x87\xa6\xea\xfb\x2c\x3e\x4b\xcc\x01\xab\x2d\x46\x38\xdb\xa6\x04\xf8\x52\x10\x51\x28\x8e\x67\x74\xeb\x8c\xd8\x40\xbe\x92\xa0\xcb\x14\x5b\x66\x32\xd9\xf8\xbf\xa7\xad\x54\x36\x7e\x3a\xff\xac\x5d\xc5\xbd\x8b\x64\x56\x6b\x04\xb5\x71\x4e\x7f\xd3\x77\xf8\xcf\x0b\xf1\x4f\x8a\x7f\xbe\xab\x89\xd3\x50\xcb\x75\x55\xdf\x8b\x17\x5e\x3c\x49\x3e\xa5\x0b\x56\x25\xfb\x20\x96\x2f\x45\xb2\x4a\x09\x99\xe5\xdd\x37\x59\xfc\x93\x44\x95\x3e\xf6\xcc\x0e\x95\x77\x4a\x6f\xc6\x86\xea\xd3\x9e\x0f\x2a\xd5\x3b\x23\x0c\x6d\xaa\x81\x3a\x89\x45\x43\xb0\x5d\x96\x84\x49\x7a\x24\xef\xe6\xbb\x92\x80\x0a\xd0\x51\xf9\x77\x67\x61\xad\x59\xab\x37\xd4\xd8\xab\xd5\xcc\xba\x94\x38\x87\x44\x12\x44\xdc\x24\xa2\xf1\x87\xae\x01\x6d\xf3\xc6\xa9\xb9\x6c\x2d\xf3\xd1\x5b\xa2\xe0\xcd\x47\x21\x70\x8d\xfb\x40\xf1\xf4\x06\x27\x1e\x88\xd2\x63\x04\x3c\x69\xca\xfb\x49\xa8\x9a\x15\x53\x59\x13\xf9\x7a\xea\xb1\x12\x77\x6c\x85\x79\xa4\xe3\x1a\x28\x4f\x6d\x9a\x43\xd4\x04\x29\xd9\xdd\x6d\x1c\x49\x7b\xe7\x16\x35\xb5\xa5\xee\x25\x4c\xaf\xa3\xa6\xf5\x96\x41\x93\x4d\x89\xb2\x0e\x77\x87\x0c\xeb\xc5\x11\x8b\xba\x80\x8a\xbc\xfa\xfe\xe3\x8d\x9c\xbf\xc5\x93\x00\xb3\x99\x20\xac\xf6\xdc\x7f\x17\x3c\x34\x38\xed\x29\xf0\x4e\xaf\x13\xa3\xb2\xfd\x2e\x71\x14\x41\xf1\x54\x33\x85\x84\x51\xa5\x5f\x9c\x77\xd8\x2b\x26\x11\x75\xce\x68\x76\xba\xda\xa2\x7c\xc4\x28\x17\xad\xa7\xbd\x35\x8d\x19\xed\x30\x53\x75\x54\xa8\x7c\xa3\xd0\x34\x35\x6a\xa6\x13\x5e\xc2\xf2\xe0\x1f\xc9\x58\x1b\x3a\x0e\x0d\x25\xb2\x8e\xd0\xbf\xd9\xf0\xb7\x92\xd5\x94\x1b\xd5\xeb\x2a\x02\x92\x5b\x46\x4c\xa9\x7a\xb1\x02\xd9\x36\x69\x7d\xa3\xe6\xb9\xa3\x8b\x0f\xec\x3a\xab\x96\x74\x7d\x07\x4f\x2e\x79\xc4\x8f\xac\xf0\x56\xb8\x02\xd3\x5b\xa2\x05\x7d\x66\x89\x31\xea\x3b\xa6\xa1\xd0\x37\x63\x19\x1f\xe4\x94\xf7\xbd\xf3\x92\xb6\x24\x46\x15\xf5\xbe\xb4\xed\xae\xbd\x04\x71\x44\x4b\xb6\x25\xe4\xc5\x2a\x26\x10\x35\x82\xdc\x92\xdc\x14\xcb\xac\x29\xd6\xf9\xaf\x2f\xe9\xbe\x2f\x82\xe7\x76\x6b\x4a\x6b\x7b\xaa\x24\xb2\x50\x10\xee\xb6\xb4\xb4\x3e\xcf\xca\xa2\x97\x88\xf4\xcc\x5a\x18\xce\x93\x77\x66\x46\xbe\x2b\xec\x34\x35\x60\x6c\x85\x31\xe2\xf7\xa0\x35\x83\xd1\x59\x29\x6e\x73\x36\x32\x96\x1f\x32\x68\x00\x92\xaa\xd4\x43\xa6\xfa\xa9\xff\xd8\x40\x89\x2d\x07\x48\xdd\x78\x2c\x4f\xd2\x55\x4b\x15\xab\x0d\xcc\xfa\x12\x9c\x25\x13\x0c\x4f\x6a\x3b\x16\xb3\x0a\x98\x3f\xa7\xb6\x77\xf9\x86\xb2\xb5\x22\x2b\x7d\xfb\xc7\x79\x6a\x7b\xb6\xe5\x8e\x42\x8a\x71\x71\xa6\xa3\x08\x46\x22\x69\xb2\x04\x0f\xff\x82\xd6\xf2\xe6\xcd\xef\xbf\xa8\x15\xe2\x20\x18\x10\xc0\xba\x79\xfc\xe6\xcd\x9b\x7f\xbc\xf9\xfd\x9b\x07\x6f\xd6\xdf\x3c\x7a\xf3\xd3\x9b\xe3\x37\x27\x6f\xc2\x37\xf5\x37\xcd\x37\xef\xdf\xdc\x9e\x6c\x0e\x59\xc1\x7c\xde\xeb\xcb\x17\xc3\xde\xdf\xb2\xf7\x49\x1e\x15\x8f\x89\x4d\xdc\x79\x49\xab\x34\xba\xf1\x47\x4d\xcc\x6b\x4b\xf7\xa4\x43\xe4\x42\x2c\x5a\xe7\xd4\x8f\x44\x89\xd3\x73\x05\x25\x0d\x68\x2a\xf7\x84\xd7\x62\x52\xbd\x0a\x4f\x1e\x8f\x62\x51\x3b\xc6\xe5\x36\x91\xf8\x59\xbb\x65\x4e\xc3\x02\xd7\x51\xf7\x6d\xe5\x4a\x80\x1e\xda\xca\xa7\x28\x64\xf5\x65\xc3\x98\x6e\x95\x6a\xde\xfc\x71\x1e\x67\x37\x47\x04\x9b\x66\xa1\x58\xc0\x6e\x59\xad\x8f\x47\xa3\xbb\xe1\x80\x02\x1e\x34\x2f\x70\xa8\xd9\x56\x8f\x09\xc8\x2c\x4b\xb0\xd8\xb0\x14\x91\xa9\x39\x96\xe5\x30\x74\xc4\xb1\xbb\x0f\x99\xa0\xfe\x2c\x00\x54\xed\x35\x75\x04\xbb\x6c\xcd\xfc\xa4\xc8\xaa\x5e\x5a\xec\x11\xd4\x3b\x7d\x1c\xfc\x06\x52\x47\x5b\x90\x71\x59\x8e\x92\x77\xef\x46\x62\xdf\x55\x53\x24\xd4\x78\x8f\x57\x76\x94\x79\x10\x94\xd0\x88\x3c\x3c\x2b\x43\x8e\xe8\x85\xfa\xd6\x69\xb4\xe8\x35\x51\xa4\x94\x1f\x22\xbb\xe9\x70\x90\xc9\x03\x3d\xee\x7c\xdb\x0c\xe3\x0d\x28\xc0\xaa\xa2\x72\x14\xc4\x42\x71\x44\x0b\xc1\xaa\xd3\xad\xc7\x98\xc4\x69\x98\xb7\x58\xd3\xc3\x3d\xd9\x10\xcb\x3a\x35\xef\x89\x49\xa2\xcc\xc2\xf2\x9b\x7e\x61\x8c\x90\x46\x20\xbf\xf1\x43\x70\x4c\xe1\x11\x6b\x91\xae\xfa\x34\xd7\x93\x45\x55\xe4\xec\x51\x95\x07\x28\x3a\xa9\x91\x4e\xad\xf6\xa5\xc2\xe3\xd3\x72\x1b\xd5\x84\x09\x1d\x46\x7d\x12\x99\x5a\xec\xab\xd4\xa6\x78\x6d\x0d\xa3\x9b\x00\x40\xa8\x20\x49\x39\x7f\x7b\x52\x67\xd9\xaa\x64\xc1\xe7\x15\xbb\x52\xe0\x32\x44\x25\x45\x37\x54\xda\xcd\x8b\x6a\x08\x9a\x2e\xbf\xf2\x15\xc7\x90\x24\xc9\x96\xd0\x8a\x27\x72\xf6\x10\x67\x29\xe6\xcb\xe9\x29\x46\xb5\x3d\x3d\x05\x15\xa1\x11\xbc\xad\x5b\x41\x15\xc5\xe3\x56\x3d\x15\x75\xa6\xa6\x60\x6b\x28\x71\x45\x78\x1a\x99\xad\xd1\xa0\x70\xe0\xdf\x7c\x85\x2c\x1c\x13\xd9\xc4\x5a\xfb\x16\xff\x6d\x1a\x77\x8e\xd3\xb0\x52\x3d\x55\xaf\x16\xe9\x9e\xf1\x61\xcf\x18\xf5\x0a\x99\x1e\x5e\x96\x60\x80\x05\x4e\xe7\x78\x5d\x25\x5c\xda\x74\x35\xf2\x95\x15\xc7\x88\x53\x35\x6b\x5c\xd9\x7e\xa7\x89\xb3\xfc\x44\xa1\x15\xe1\x13\xcc\x15\x5d\xc8\x19\xf8\x8d\x9f\x6d\x74\x17\x67\xe5\x40\xc5\x20\x5a\x7a\xa0\x5b\x23\xdd\x3f\x93\x27\x6c\xc6\xfe\x8c\x03\xd2\xea\x87\x9f\x75\x4c\xf2\x9a\xfc\xc3\x52\xae\x03\x93\x5c\x58\xc7\x02\x15\xbc\x2b\xbf\x1c\x76\x83\x1a\x7b\xfb\xf7\x6a\x8b\xde\xfd\xed\xb4\x5a\xad\x4d\xc8\xac\x09\x2b\xf6\xf5\xf9\x6c\x3c\xf2\x02\xb6\x0f\x0e\x0e\x36\x29\x5b\x81\x8e\x92\xc9\x45\x05\x28\x66\x2b\xd0\x12\x9c\x7f\x7b\xf1\x1c\x81\xf7\x37\x29\x64\x20\xc6\xa7\x31\x05\x26\x79\x39\xbd\x94\xbd\xa9\x03\x90\xa1\xef\x42\xae\x5b\x2a\x6c\x87\x5d\xce\x05\x81\xf4\xc7\x79\x34\x4a\xce\x6e\xba\xb6\x75\xa0\xe8\x4f\x48\x66\x52\x6d\xe3\xea\xa2\x8d\x6b\xaa\x98\xe9\x5a\x31\x5d\x4b\x57\x60\x83\x16\xad\x59\xf8\x1f\xb7\xd6\xfa\xcc\x61\xb7\x85\xde\x57\x0d\x71\xad\x48\xa2\xb2\x3a\x8c\x23\x43\x00\xf1\xd1\x6a\xfe\xb1\x00\x63\x2e\xa4\x14\x04\xa8\x4b\x14\xa8\x3a\x83\x2e\x6b\xdc\xad\x61\xad\x4f\xca\x45\xb3\x59\x56\xb4\xb2\x58\x2e\x78\x8b\x1d\xac\x99\x26\x27\x18\x82\x53\x43\x84\x56\xac\xd5\x2d\x77\xd8\x2c\x90\x42\x85\x04\x19\xfe\x0e\x8b\xdc\xa4\x41\xd0\x94\x7d\x6c\x5b\x39\x02\x6e\x30\x6f\x52\xdb\x81\x63\x24\x54\x86\x56\xb8\xa4\x50\x74\x89\x08\x94\x64\x80\xd1\x82\x58\x80\xf6\x1b\x52\xa4\x28\xc5\xf3\x80\x64\x22\xed\xf8\x44\x75\x8c\xa7\xe0\x96\xf4\x40\x26\x86\x32\x74\x12\x02\x1e\xd3\xef\x93\x82\xd9\xc4\x36\xf9\xd9\xae\x8d\x25\x58\x79\x7f\x2c\x12\x62\x85\x02\x92\xf5\x8b\xd8\xaa\xb1\x21\x82\x97\xb0\xf4\xbb\x4f\x51\xc9\x38\xaf\x3e\x7e\xdd\xfa\x31\x40\x07\x54\xe3\x28\xef\xa1\x52\xbc\xf4\x48\x6b\x64\x59\x2d\xd5\xeb\x5f\x36\x69\xb6\x3f\x72\x05\xa6\x22\x95\xf9\x32\x83\x68\x21\xfe\x6f\xfc\x47\x52\xd7\xca\xfd\x67\x81\x61\x14\xa7\xd3\xb5\x31\x4a\x57\x74\x81\xd0\xe3\xca\xb8\x70\xbd\x98\x42\x8b\x03\x9f\x98\xc6\x8a\x2e\x2e\xa1\xbb\x82\xe3\xd7\x3e\x8f\x69\x75\x5a\xa7\x02\x9b\x58\x42\xc1\x0c\x45\x74\xe8\x90\x1f\x78\x80\x20\x04\x95\x39\xe9\xb3\x16\xf1\x02\x0a\xc3\x29\x89\x46\x25\x48\x29\x6b\x01\x9b\x81\x25\x81\x55\x82\xcf\x8a\xd8\x4f\x47\xa3\x68\x9a\xc7\x1e\x03\x12\xf0\x63\x1c\xd6\xb5\x1d\x69\xf3\x4d\xbe\xbe\x39\x84\x9d\x7c\x50\xab\x57\x2b\xad\x22\x02\xeb\xe0\x17\x96\xe8\x42\xcb\x0c\xb5\xdc\x61\x32\x4a\x86\x88\x15\xe3\xb7\xae\x4f\x15\x78\x50\x0b\x55\xbf\x3a\xc1\x25\x79\x4d\xe5\x9e\x3b\x31\x27\xfd\x87\x10\xf7\xc5\xf8\x95\xcf\x65\x89\xaa\x44\x48\x98\xa2\xfb\x24\x0d\xa9\x12\xa7\x39\x55\xb5\xb5\x54\xd4\x88\x90\x9a\xa5\xb1\x7a\x89\xf0\xb4\x7a\xf0\x2a\xd6\xc4\x34\x67\x71\x3e\x0b\xa5\x5c\x2f\x23\xcc\x5d\xf4\xb8\x7f\xc4\x07\x2c\x53\x92\x8a\x4f\xbf\x52\x29\xc4\x77\x59\xac\x6c\x96\xb8\xf6\xb2\xf8\x0a\x23\xef\x7e\x7d\x3d\x0d\x6b\xe1\xa3\xee\x3f\x7e\x7a\x03\x33\xa0\x5e\x03\xd5\xca\x98\x60\x65\xb9\xf5\x00\x21\x30\xff\xa7\xdf\xd7\xf1\x68\x78\x58\xf3\x9e\x10\x94\x0c\x41\xc7\x7b\x99\x86\x2c\x85\x52\x54\x73\x30\x9f\x8e\x92\x59\xb8\x09\x24\xc0\x1c\x5c\x0a\xf3\xa0\x72\x0d\x2e\x23\xa4\x29\xdc\xba\x8a\xd8\x5e\x9a\xc5\x56\x5d\x43\x14\x72\x87\x9d\x18\x68\x72\x64\x19\xcf\x52\x69\x2c\x1c\xaa\xab\xdd\x61\x2b\x87\xa6\x14\xf9\x15\x4b\x9c\xac\xa4\x64\x95\x53\x1b\xcd\x65\x57\x92\x6a\x32\xbc\x72\xbf\x5a\x84\x3b\xe4\x81\x24\x76\xb8\xb2\x54\x27\x22\xdb\xad\x21\x42\x37\xf8\x4a\xfa\x50\x0f\x63\xcb\xfe\x69\x44\x30\x6d\x7d\x9d\x7b\x2d\x22\xe2\x57\x51\xbc\x59\x6b\x1b\xb4\x86\x3c\xbc\xd4\xe9\x77\xdf\x7b\xf6\x47\x01\xd6\x2b\xc5\x15\x9a\x42\xd5\xb1\x3e\x93\xae\xb6\x73\x64\x13\x60\x67\xea\x89\x0e\x27\xe6\xc5\x7d\xc8\x26\x91\xd5\xc7\x50\x3d\x58\x4f\xee\xa9\xa7\x61\xad\x6b\x7d\x9c\x49\x41\x4d\x7a\x8c\x18\x19\x53\x10\xb8\xcb\xe2\xd3\x0b\x22\x9d\xa6\xc0\x62\x58\x77\xb4\xf6\x45\x26\x1d\x8c\x5f\x5a\xb2\x36\x16\x83\x9e\x9a\x4b\xbf\xbe\x43\x3a\x32\x90\x38\x21\x1e\x9c\x45\xf3\x7e\xc9\xa2\xa9\x8a\x76\xea\x7a\xa1\x31\x7d\x23\x25\xba\x22\x66\xa1\x50\xa7\x36\x69\x70\x29\xd5\xd5\xe7\x89\x25\x8d\x4b\x24\xbc\x7d\x76\x3c\x71\xef\xce\x2e\xda\xb4\x99\xad\x2d\x0f\x96\x8d\xc3\x10\x1f\xae\x82\xce\x1c\x50\x0c\x60\x65\xff\x41\x75\x51\xbe\x8e\x4c\x1b\x5f\xf2\xe2\xf4\xef\xc0\x34\x0f\x0c\x7f\x96\x59\x8d\x04\x47\xfc\x5d\xbb\xd0\x0e\x54\x51\x56\x9d\x79\xa9\x82\x04\xeb\xdb\x2e\x89\x10\xd0\x62\xa2\xea\xfd\x7d\xf9\x9e\x89\xc0\x4b\x37\x37\x85\x70\xd2\x7e\xe2\xca\x31\xff\x0c\x9b\x91\x8a\x06\x72\xcd\xbe\x84\xf4\xeb\x12\xb2\x4b\x94\x7a\xcd\xe6\x85\xba\xbb\xd5\x5c\xbc\x3b\xc2\x19\x5b\x2d\x19\xa6\xd5\x11\x91\x3f\x95\xe2\xcc\x07\xae\x98\x47\xc7\x08\xe5\xde\xe5\x5b\x46\x99\x53\x14\x7f\x7a\x6d\x6e\xea\x19\x69\x0b\x27\x8e\xb7\x90\x3b\x63\x14\x90\x33\x69\xd8\x5d\x30\xce\x8e\x5b\x7f\xe1\x92\x99\x22\x4a\x06\xf6\x5d\x50\x3f\x86\x4f\x3b\x23\x8a\xd4\x9b\x39\xa0\x89\xba\x5e\x62\xa0\x73\xee\x2c\x1c\xeb\x6e\x5b\x82\x6e\x81\x41\xd5\x23\x1e\x5f\xd7\x0b\xdc\xe8\x89\x8e\x3a\x5c\x18\xea\x8f\xd8\x98\xa9\xa6\xaf\xcc\x2b\x77\x49\x1e\x53\x35\x48\x22\xbe\x0b\x2f\xbc\x36\x2e\x19\xab\x6a\x35\x15\x3f\x4d\x98\x3b\x5d\x56\x7a\x6a\xf7\x60\xd4\x8b\x8a\xdf\x62\xef\xa3\x81\x8d\x2d\xe5\x8c\x28\x27\x32\x87\xd4\x73\xc5\xcf\x7a\xb4\xbc\xff\xca\x59\x2f\xde\x38\x7f\xfd\xe2\xf9\x27\x62\x3c\xc7\xb7\x0c\xdb\xad\xfa\x2b\x98\xae\xe1\x16\xb0\x1c\x9a\x1c\x4f\x0a\x66\x91\xca\xcd\x19\xde\x84\x48\x33\x8f\x5a\x2f\xcd\x56\x74\xb0\x58\x7e\xd0\x23\xde\x1a\xa3\x6a\x9f\xe0\x7b\x1b\xc2\xb2\xe5\x67\xbd\x5a\x06\x17\xee\x99\x39\x4d\xae\x70\x95\x57\x37\xec\x4e\x77\xdf\x58\xb1\x5e\x24\x11\x8b\x06\x19\xdb\xb4\x72\xa7\x12\x7e\x78\xf5\xcc\x59\x44\x0c\xec\xa3\xc0\xff\x04\x86\x34\xdf\x31\xeb\x1d\x76\x57\xc9\x73\x19\xe5\xfa\x90\x80\xb3\x2c\x93\x9c\xa7\xf6\xa3\x2a\x3e\x02\x16\x18\x95\xed\x4d\xa4\x59\xa5\x5d\x33\x20\xd0\x1e\x96\x9b\xce\xeb\xda\xf0\xa7\xe8\xc5\xed\x19\xfd\xac\x16\xbc\xc9\x24\x8f\xb3\x59\x51\xd1\xe8\xc5\xb0\xfa\xdf\x75\x48\x8a\x42\xa5\xee\x17\x12\xe7\x87\x0e\x5f\x41\xea\x1f\x09\x49\xd5\xf8\x55\xc4\x97\x64\x2b\x3f\x9c\xe2\x30\xf7\x73\x48\x28\x96\x15\x0e\x35\x7e\xc5\xe5\x15\x15\x5b\x30\x87\x04\x90\xe5\x23\x2a\xce\x99\xd5\x0c\x70\x1d\x44\xe8\x82\x03\xa5\xd5\x25\xa4\xa4\x4f\xcc\x6a\x7d\x70\x5b\xde\xe1\x78\xd6\x5d\x10\xf7\x74\x73\xd2\x75\xc9\x57\xe7\xf3\xec\x94\xdf\xe3\x74\xa3\x9e\x3b\x73\xa2\x0d\x9a\x69\x2f\x6d\x97\x2c\xfe\x9c\xeb\x09\xd3\x3a\x51\xa6\xd7\x52\x33\x8c\xb3\x5d\xad\x72\x05\xa0\x1a\x65\xf8\xb6\x12\x87\x13\x67\x67\xc7\x35\x20\xaf\x0c\xa0\xeb\x3f\xb2\xe5\xf4\xcf\x53\xeb\xbd\x73\x62\x58\xd1\x97\x41\xf8\x48\x68\x78\x9d\x3a\x41\x27\x55\x0a\x49\x85\x81\xec\x26\x00\x06\x43\x76\x3e\x1d\xe0\xb4\xc5\x67\x90\x02\x3b\x78\x5d\x03\xaf\x5a\xc6\x59\x49\xd6\x75\x32\x2b\xe6\x4c\xea\xa2\x87\xc4\x5f\xac\x9c\x6b\x8b\xd6\x3d\x38\xb3\xa3\xa6\xfb\xc0\x7f\x61\xdd\x65\xae\x96\xab\x2b\xc7\xc5\x5a\x54\x8e\x63\x2f\x90\xa6\x3d\xbf\x33\x87\xe9\x43\x53\x65\x53\x06\x83\x60\x97\xcf\x8d\x9f\x06\xeb\xea\xa2\xcb\x86\x7b\x23\x3d\x30\x3c\x31\x83\xe0\x90\x01\x78\x0c\xec\x81\xc3\x00\xe7\xf6\x37\x99\x10\x2c\x14\xec\xb7\xe6\x8d\xa8\xad\xc8\x90\xdb\x2a\xd6\x8c\x7d\xac\xb9\xaf\x5a\xed\x50\x55\xbc\xa0\x2f\x78\xa4\x87\x98\xe9\x6f\x3e\xf0\x4a\x62\x1b\x07\x6c\x5c\x09\xda\x2d\xa9\x8d\x0c\xc6\xbc\x50\xa1\xac\x7b\x98\xa8\x27\x23\x1a\x97\xf0\x3c\xc0\xad\x82\x0d\x6b\x7f\x6f\x04\x81\xcf\x4b\x8c\x0f\x59\x97\xe1\x95\x5d\x45\x34\x2c\xc9\xfb\x65\x86\x25\x67\x79\x2e\x1f\x94\xf0\xb7\xd4\x19\x75\x6a\xc0\xfa\x5b\xa1\x25\x90\x3b\x16\x7d\x64\xb6\x5c\x3a\x9d\x39\x71\xe8\x64\x79\xfa\xff\xd0\xd3\x4a\xb7\x01\xcb\xf4\xc3\x12\x1d\xea\x9d\x5e\x1f\x33\xd2\xca\x3a\xf3\x50\xce\x1f\xeb\xd2\xe0\xf2\x95\x71\xf6\x94\x8f\x98\x43\xdf\xcd\x44\xaa\x64\x51\x77\xbb\x8b\x8c\xa1\xaa\x29\x78\x08\xa5\x18\x33\x0f\x8b\x60\x96\xc7\x19\x03\xb5\x33\x34\x21\x76\xb2\xeb\xb4\x66\xe1\x17\x4e\x72\xa6\x2a\xdd\x7e\x51\x8b\xc8\x66\x35\xea\x7c\xac\x4c\x16\x56\xd5\x5a\xca\xac\x8c\x0a\x15\x17\x3c\x0b\x29\x31\x3c\x3e\xd1\x2b\x9d\x03\x20\xb2\x10\xa9\x27\xc3\x28\x1a\x15\x5b\x4d\xd3\x3d\xe5\xba\x83\x59\xc7\x95\xea\x91\x28\x9b\x34\x93\xa4\x8d\x02\xf3\xec\xf5\xc6\x36\x0c\x2f\x1d\x92\xbe\xa2\x72\x17\xe5\x3d\xd6\x17\x8a\x9d\xe5\xca\x31\x41\xc8\x5e\x38\xb4\x8a\x0a\x76\x56\x94\x04\x00\xab\xa0\x4c\x17\xe5\x17\x6c\xff\xf4\x4c\x1a\x30\x65\xc8\x89\x0b\xaf\xf8\x06\xfb\x2e\xf8\xd7\xd4\x54\xa9\x9e\xda\xef\xb8\xdc\xc5\x1c\xa1\xcd\x7e\xc6\x21\x59\x1b\xff\xba\xa5\x20\x8b\x36\x00\x67\xc9\xc8\xe9\x02\x91\xb2\x9c\xd7\xad\x57\x61\x96\xe3\x58\x62\xbe\xef\x0c\x64\x5d\xa1\xc5\x6f\x91\xaa\xea\x16\xb8\x2c\xaf\xdc\x96\xc7\x29\x57\xba\xe4\xbe\xe5\x8f\xb9\x7f\x4e\x0f\xf6\x96\xcf\xc5\x57\xca\x54\xe7\x85\x79\x0a\x71\x5a\xd0\xec\xbf\xf8\x42\xb2\x63\xa1\xdb\x6e\x95\x03\xb9\xad\xc0\x7d\x72\x7f\x5d\xd9\x35\x25\xae\xba\x4b\xb8\xdf\xaa\x2b\x29\xf2\x41\x45\xdb\xf5\x7a\xc1\x8c\xa1\x78\x23\xbe\x69\xfe\x33\xb8\x6c\xf3\x7e\x14\x21\xc7\x27\xc2\x70\x6b\xeb\xe7\x87\xc1\xc6\x86\x70\x60\xbd\xa3\x1b\x37\x01\x20\x46\x7c\x80\x16\xff\xc5\xa9\x41\xbd\x8d\x5f\x47\x49\x6f\x84\x11\xff\x29\x8b\x8b\x67\xdb\x32\x20\x86\x08\x80\x58\x7a\x84\x24\x74\x69\xcf\x6d\x75\x4a\x51\x21\x18\x30\xec\x0b\x67\xbc\x78\x19\x21\x62\x23\xc0\xa4\x14\x8c\x22\x50\xf6\x89\xce\xad\x34\x82\xde\xa9\x1f\x65\x77\x89\xd0\x43\x8c\xa0\xa2\xd1\x85\xc6\x4d\xb8\xf0\x08\xd2\xa2\xd3\xd3\xc4\x92\xfd\xbf\xdb\x72\xeb\x2d\xcd\xe2\xd4\xb0\x63\x23\x29\x31\x2f\x9e\x49\x7b\xc4\x90\x85\x11\x9b\xf7\x3d\xfd\x1b\xc5\xfb\x7d\x7c\x75\xe5\x7e\x6f\xa9\x39\x83\xd6\x1a\xab\xe7\x40\xb6\xf4\xa2\xfe\x45\xe1\xaa\x14\x57\x61\xc8\xd6\x4d\x3d\xe4\xb8\x52\x90\xfc\xd1\xc4\x2b\x5c\x8b\x04\xd6\x92\x56\x56\xaa\x56\x5d\x2d\x74\xe9\xf4\xc9\x7f\x29\xdb\xab\x56\x80\xc2\x24\x17\x65\xf4\x34\xf7\x48\x6d\x35\xb1\xcb\x65\x77\x61\x62\x2b\x62\x39\x97\x7c\x8a\x8e\xf7\x4e\x64\x89\x43\x61\x64\x5f\x80\x71\xf9\x21\xdf\xd8\xcf\x03\x76\xef\xc3\x9d\x4e\xba\x7f\xc4\x9c\x43\xf0\x63\xf1\x96\x84\x9a\x7d\x79\x71\xb6\x2c\x90\x04\x14\xae\xa7\xc2\x44\x78\xdf\xf1\x55\xa8\x40\x25\xd9\x58\x2d\xcd\x97\x5d\xea\xab\xa5\xf9\x1d\x16\x67\xe6\x76\x51\xdc\xea\x98\x1d\xa5\x32\xce\x33\x21\xeb\xe9\x69\x75\x0b\xb2\x4a\xb4\x8a\xa8\x96\xde\x50\x29\x13\xe3\x0f\xb4\x70\x82\x9a\x36\xac\xaf\x4f\xf8\x8c\x33\xc4\x2c\x9a\x7f\x13\xb3\xb4\x27\xe9\xc4\x77\xf1\x57\x67\x36\x3c\x45\x4b\x6e\x00\x6b\x28\x35\xe0\xdd\x7b\x96\x4e\xe9\xc0\x5c\xaa\x64\x77\x2e\xcb\xf7\x5a\x7e\x50\xeb\x92\x66\x45\x6d\x6e\xc7\x38\xd9\xe6\x00\xab\xea\x7c\x6b\x11\x12\x35\x69\x2a\xa6\xd4\x22\x14\x72\x48\x96\xcf\xa4\x45\x08\xa4\x40\x29\x97\x36\x8b\x10\xc8\x81\x5a\x3e\x8a\x17\x22\xf8\x54\xd7\x61\xe7\xd3\xb2\x1d\xc7\x07\x29\x82\x12\x9d\x57\xe9\x37\xfb\x43\xfc\xef\x23\xf6\x13\x65\x56\x8a\xcf\x74\x0b\x56\xb6\x51\x98\x70\xca\xae\xc4\xba\x34\x2e\x71\x3d\xf6\x57\x79\xf7\xb5\x6a\x10\x2e\x77\x0a\x58\xee\x6f\xe4\x3f\xf8\xa3\x4a\x9e\x71\xdd\x9c\x5d\x2c\xf4\x50\xed\xd2\x53\x7c\xcf\x9d\x9d\x20\x2e\x12\xd9\x56\xbd\x94\x62\x9d\x6f\xc1\xda\xf7\xb6\xe5\xd7\x45\x07\xae\x46\xc7\x17\x50\xc2\x84\x0a\xb6\x98\x03\xa5\x8a\xd2\x3d\x33\x20\xdf\xc2\x2e\x06\x2a\xab\xc3\xff\x00\xf6\x6d\xc3\x7a\x58\x8b\xdd\xf6\x4b\x5a\xf2\xcd\xad\x84\xbf\x99\x26\x0d\x4a\xf7\x9d\x71\xdd\x12\x7b\x63\x98\x05\x2d\x61\x68\x3a\xb4\x75\x67\x43\x04\x53\x85\x3d\xc2\x86\x5b\x82\x75\x3b\x0b\x86\x0a\x51\xb7\xd7\x81\x54\xcf\x75\x76\xc1\x59\x08\x24\x16\x5e\xa0\x1e\x68\x75\xc1\x23\x05\x2a\xe2\x10\xc8\x26\xd8\xb3\xc4\x54\x49\x74\x2d\x89\x5a\x1f\xf5\x1b\x63\x40\xf9\xfc\x39\x96\x95\x9c\xf0\xf9\xe3\xbf\x84\x3d\x21\x2b\xe8\x52\x2c\xcc\x17\xf0\x50\xeb\xac\xd6\xbd\x5c\x2a\x69\xb3\xb3\xfe\x33\x70\x73\xc2\xcd\xd0\xbe\x3b\xcf\x26\x76\xc5\xdd\xd8\xe6\x35\x5a\x54\x84\x86\xc3\x6d\xce\x14\x70\xc7\x9f\xc2\xf5\x99\x74\x9d\x25\x5c\x9f\x4d\xf4\x35\xf7\xde\x0b\xad\x45\x92\x22\x0a\xc4\x46\xb1\x64\x4a\xbc\x15\x69\x4f\x42\xa0\x0d\x02\x3c\x96\x5f\x2c\x1e\xda\xdd\xbd\x9f\xf5\x75\x90\xc0\x72\x7a\x3e\xae\x9d\x9e\xa2\x7f\xc8\x3a\xd5\x24\xe4\xc1\xa4\xa9\x17\x17\x45\xb2\xd5\xa0\x65\x3c\x2e\x2b\x3a\x64\x91\xe4\x5d\xb2\x2f\x65\x60\x3f\x4e\x7e\xa3\x2c\x0a\xe0\x55\x16\x4d\xdd\x85\x25\x9d\x3c\x97\xf8\xcd\x10\x48\xc4\x2b\x94\x95\x11\xff\xb0\x72\xbf\x71\x35\x9d\x7c\x43\xe9\x39\x9d\xf8\x31\x75\x1d\x51\x2b\x73\xaf\xc4\x2d\x3e\xcb\x28\x13\x78\xa4\xe2\xa5\x98\x54\xf0\xf4\x30\x81\xe2\x5c\x3f\x53\x4f\x94\x37\x76\x9d\x91\x42\x5a\xa9\xc6\x2b\x5e\xc3\xff\x37\x7f\xcf\x46\x55\x89\x07\xab\xad\x35\x30\xda\x1e\x0f\x06\x1e\xc2\xb0\x79\xa1\xe9\x47\xcf\x7e\x5a\x57\xa9\x9a\x67\x16\x6c\xdb\x7f\x2f\x1a\x0c\x7c\x84\x5b\x3e\xa9\xa2\x15\xf0\x43\x0d\x18\x85\x61\x44\x11\x81\x47\x56\x87\x3b\x4d\x90\x57\x3d\x2d\x37\x5e\x7d\x41\x86\xdf\xde\xfa\x07\x0e\xb9\xf0\xf8\x1f\xcd\x93\xc2\xfd\x2d\x31\xad\xd7\x83\xda\xef\x71\xd4\x8d\x4d\x3c\x39\xa6\x8d\x4e\x64\x50\x51\x5f\x2c\xc6\xb1\x0a\xb1\x86\x8e\x49\xf4\x11\xe2\x84\x71\x5c\x53\xca\xfa\xbc\xb2\x9b\x09\xdb\x31\xbe\xfb\x5d\xe8\xea\x8a\xce\xae\x54\x16\x93\xe0\x91\x11\x79\x8f\xc4\x18\x08\xba\xba\x23\x83\x2e\xcf\x1d\x88\x68\xa6\x90\xa8\x19\x5d\xba\x6b\xd5\x13\x29\x10\x4f\x35\xc2\x18\x12\x1c\x18\xa7\xf3\x3c\x26\xed\xa9\x8b\x31\x54\xe1\x03\x30\x65\x32\x2c\x03\x7d\x8f\xe2\x08\x63\x29\xcb\xcc\xf9\x8c\xc2\x30\x50\x5b\xe5\x6b\xce\x46\x9b\x78\x5f\xdc\xfd\x9b\x19\x5c\x0c\x0d\x6f\xaf\x0c\x35\x21\x75\x2e\xb0\x27\x2d\xac\x25\xf8\xd4\xeb\x22\xb6\xc5\xae\x42\x06\xea\x8e\x33\xb3\xa7\x10\xdd\xae\x10\xdb\xce\x1e\xb9\x69\x50\x0c\x5b\xc7\x63\xc6\xa9\x34\x8d\xd7\x98\xb0\x0a\xbb\x0c\x3b\x50\x9e\xa2\xc9\x6b\x72\x7e\xc7\x6e\x45\x15\xc3\xd6\x31\x02\xca\x5e\xed\x2d\x63\x89\xe0\x65\x15\x43\xd4\xdc\xb8\x0b\x2f\xfd\xfa\xbb\xc3\x4a\x13\xe6\x8f\x9a\x9a\xc5\x23\xd0\xdb\xd1\x76\x81\xae\x7d\xf4\xfb\xb5\x15\xff\x4f\xde\x2f\x13\x50\x3f\xfd\xa4\x0b\x90\xe3\x87\xc0\x05\x0b\xed\xfd\x50\xa6\x37\xe5\x7b\xc8\xca\x07\xf4\xfb\x34\x4f\x84\x52\x23\x03\x31\x7e\x11\xec\x5b\x62\x60\x24\xa5\xa4\x8c\x26\x5d\x38\xfc\x75\xa6\x16\x71\xfc\x74\x90\x45\xc3\x23\x62\x4b\xc3\x4e\x7c\x36\x50\x7b\x89\x42\x48\x48\x51\x68\x3e\x9d\x66\x71\x9e\x17\x14\x7d\xb5\x08\x37\x11\x2a\x97\x50\x1b\x38\x31\xd6\xd7\x9d\x1a\x60\x11\x87\x95\x14\x9f\xbe\xab\xd1\x0f\x75\x87\x0e\x96\xc0\x80\x05\x01\x0b\x9d\x4b\x57\x75\x8c\x3c\x5b\x9b\xa5\xf3\xfe\x39\x4e\x20\x53\x6a\xe0\x0d\xb5\x29\xc0\x89\x1a\x7c\xd8\x6f\x39\x70\x51\xf3\x72\x05\xcc\x82\xee\x61\xab\xb9\x41\xf1\x5e\x4f\x37\x0f\x50\x00\xc2\xc3\xaa\x53\xc6\xbb\x42\x67\x73\xd4\xb2\x02\x8a\x8f\x62\xc7\xbc\xa3\xeb\x84\x78\xf9\xa7\x11\xd4\x40\xb2\x65\x02\x57\xcd\xda\x83\x94\x50\x65\x8f\x64\x75\x61\xb0\x6c\x53\xa3\x6a\xd1\xbb\x3c\xfa\x3e\xf6\xe0\xd5\x8b\x44\x39\x04\xb6\x75\x92\x4e\x62\xdf\x55\x37\x63\xaa\x92\xe3\xe6\x09\x0e\x0b\xe6\x81\x51\x12\x73\xb8\xb4\x95\x95\x64\x88\xe6\x70\x1c\x25\xd5\x4a\xd1\x79\x76\xe6\x77\x7a\xd0\x94\xd1\x20\x76\x48\x0b\x02\xf6\x32\x0b\x87\x2a\x41\xe4\x1f\x63\xa1\xb5\x34\x03\x25\x3c\xe1\xb6\xe0\x9e\x96\xc7\xb3\xd7\xc9\x18\xd7\xba\x10\x60\xcd\xa3\x19\x05\x59\x80\x2b\x29\xae\x8a\xf6\x69\x23\x45\x14\x88\xdd\xe3\x66\xa0\x8c\x60\xbf\x4f\x93\xc9\xcc\x40\x99\x69\xa1\x02\xd3\x1a\x65\x5e\xbd\xd1\x87\xc5\x4e\x7b\xf3\xe1\xf6\x76\x6b\x7f\x4b\x6f\x36\xa2\xcb\x64\x48\x07\x79\x20\xf6\x36\xff\x1a\xf7\xfe\x9c\xcc\x36\xc5\xed\x5b\x3b\xbf\x89\x83\xfb\xf1\x90\x96\xd2\x47\xc1\x46\x1b\xe6\x42\x41\x30\xf9\x29\xb3\x2c\x4c\x14\x68\x7e\x32\x04\xb1\x8c\x92\x03\xb7\xd6\xe4\xe6\xe4\xa4\xc2\x7a\x67\x74\xfa\xfc\x72\x88\x8a\xa3\x42\x28\x9c\xf2\x8f\xfe\xf2\x27\x39\x3b\x50\x8a\xeb\x4c\x23\x05\xa0\x94\x74\xd8\x07\x50\xa2\xc9\x9e\x6e\x53\x4c\xc2\xf1\x57\x80\x0b\xdd\x11\xed\x70\xee\x4b\x3b\x72\x13\x22\x13\x82\x51\x4c\x5e\x29\x24\x4d\x07\x1e\x5a\x9a\xa4\xc8\x6e\xe6\x7d\x7c\x02\xe4\x6f\x48\xbc\x95\xf2\x77\xc7\xa2\x49\x6d\x37\x42\xb8\xd6\x4b\x07\x37\xb5\xba\xb4\xc1\x83\x84\xbc\x84\x3d\xaf\x90\x0c\x21\x2f\x17\x40\xfb\xc4\x4a\x05\x2a\x57\xd4\xcb\xd3\xd1\x7c\xa6\xa2\x64\xa9\xff\x66\xe9\x14\xfa\xd0\x4e\xc3\x07\xf5\x0b\x89\x63\x58\xcc\x92\x49\x21\x79\x0a\x8a\x3f\xec\xb9\x0b\xe9\x3d\x3a\x7b\xee\x4a\x01\xc3\xb2\x60\x8a\xd4\x92\xf1\x34\xcd\xf0\xc6\x98\x1d\xd6\x82\x6e\x95\xcf\xc6\xa2\x3f\xa0\xf7\xe1\xff\x71\xaf\x76\x04\x3d\x13\x4f\x9e\xbc\x7e\x61\x4f\x3d\xdf\x68\xbe\x1f\x42\xf9\xe6\x19\x8d\x06\xf8\x61\xbb\xf4\x62\x27\x4b\x45\xaf\xd4\xdc\x5a\xd2\xdd\x75\x31\x52\x9a\xd7\x34\x4c\xa7\xd1\x30\xfe\x5b\x43\x26\xdd\xe8\xa4\xbf\xcb\x7b\x78\x1c\x14\x24\x0c\x8c\x4e\x00\xbe\xa7\x3a\xc4\x94\x11\x79\x7f\x3f\xe4\x59\x90\x21\x40\xc4\xfb\xdd\xaf\xf1\x01\x70\x50\x76\xc7\x66\x24\x39\x1c\x81\xad\x34\xe8\xd8\xb9\x9a\xeb\xf8\x9f\x14\x12\xc7\x8a\x10\x43\xa9\x75\xcf\x51\xec\x9e\x68\x11\xb1\x90\xff\x31\x9d\xd3\x29\xfe\x13\x22\xef\x15\x0e\x38\x5b\x0b\x3b\x36\xed\x0a\x36\x08\x45\x13\x47\x0c\xfc\x36\x78\x44\xfe\x73\x48\x6e\x98\x96\x2a\x68\xf1\xc6\xb1\x0b\xfc\x1a\x52\x4f\x98\x34\x24\xad\xc2\x2b\x0d\x41\xc8\x0a\x09\x01\xdb\x7e\x7a\xb2\xe4\x2c\x89\xb3\x05\x16\x6c\xe8\x42\x03\x8b\x72\x4f\x61\x90\x3f\xc4\xb4\xb5\x84\xa7\x23\x8e\x98\xb9\x4f\x49\x2d\x9f\x1f\x94\xcc\xd4\xa6\x62\xfa\xf6\x3f\x7f\x41\xee\x50\xaa\x99\xb2\x1c\x85\x6a\xe1\x94\x82\xd2\x52\x6c\x24\xeb\x8d\x52\x89\x4b\x08\x3d\xa7\xf1\xca\xd2\xa9\x9e\x82\x21\xed\xb0\xec\x20\x36\xd6\xf1\xb5\x9d\x18\xe4\x58\x08\x66\x32\xfe\x53\x93\xff\x0a\x75\x49\x7e\x80\x60\xc2\x4d\x76\x9a\x25\x20\x35\xa4\x69\xb1\x21\x36\x81\x20\xe7\xe8\xa9\x10\x55\x24\x94\x9b\xcf\x86\x5e\x03\x1b\x46\x84\x36\xe4\x66\x91\xd4\x4b\xf5\x31\x9f\x22\x6e\x6a\xa0\x7a\x52\xdb\xc2\xa6\x9a\x46\x5a\x06\x75\x1f\x6a\xb8\x6a\x4c\x11\x76\xf5\xd6\x0d\xa0\x34\xea\xab\xfa\x20\xe2\x1d\xfb\x0e\xa2\x72\x2f\x0d\xa2\x7a\xaa\x9b\xd4\x94\xbc\xd0\x09\x4c\x39\x26\xca\x14\x80\x49\xf1\x5f\x47\x33\x4d\x49\x06\x0d\x2d\xc2\xe9\x18\x50\x44\xc5\xa6\x17\x88\x02\x20\xb2\xe0\x4e\xe3\xd5\x64\x68\x87\x74\x1e\x99\xfd\x91\xde\x2e\xe9\x88\xf7\x6a\xa7\xc2\x6e\x26\x45\x33\xeb\x40\x8c\x45\x98\x97\x6f\x25\x9c\x85\x08\x64\xdf\xca\x42\xd2\xc5\x83\xf2\x2d\xf1\x41\x7b\x97\x64\x10\xca\xbc\x97\x7c\x47\x82\xda\x7c\xa8\x80\xec\x0b\x9f\x35\xda\xa5\x88\x3c\x59\xf4\xbb\xb3\xb3\x1c\x49\x14\x3b\x1e\xf5\xd8\x9e\x59\x14\x25\x77\xd4\x9e\x8c\x98\x4f\x76\x8e\x75\x5d\xb3\xe0\xdc\x80\xb2\xf0\x6c\x9b\xe7\xc0\x77\xac\xaa\x7a\x05\x8a\x8f\x3e\xeb\xf2\xec\xb3\x64\x15\xa6\x6f\x5a\x24\xb6\xe5\xa6\x50\x70\x4d\x35\xdf\x59\xf8\xc5\x7c\x70\xf4\x4c\xdd\x3a\xdc\x75\x13\x80\xde\xb9\xdb\x0c\x3e\x2c\x2b\x75\xcc\x3e\x61\xe5\xd9\x30\x94\xc1\x1a\xca\xf9\x07\x8b\x00\xcf\x6c\x9f\x04\xdc\x98\x54\x3c\xa9\x74\x6a\x81\x5e\x6d\x05\x1e\xf3\x93\x89\x9a\x6f\x29\x20\x68\x70\xeb\x72\xe1\x60\x0a\xb2\xb6\xe8\x81\x4f\xbd\x13\x16\xed\x69\x8a\xde\x76\x05\x9b\xe1\x07\x2c\x74\x83\x1b\xce\x22\xda\xe6\xeb\xc2\xca\xc8\x6e\x31\xf1\x9a\xa1\x6c\xa3\x81\xc5\x66\x9d\x05\x7b\x63\xc1\xb6\x4f\x1c\x4e\xba\x9d\x83\xf3\xe0\xa7\x87\x58\xc5\x4f\x0e\x5d\xbe\x61\xe3\x7d\x82\xc0\xd1\xe6\x18\x3b\x1d\x2d\xee\xba\x6b\xb7\x62\x9d\x75\x1c\x8e\x00\x0b\xf8\xa6\x6b\x37\xc3\x02\x6e\x3b\xc0\x03\x8c\x86\x7a\xed\xa4\xe1\x23\x66\x37\x5c\xa7\xf3\xdf\xae\x50\xfd\x4a\x73\x2b\xf4\x5c\x82\x2a\xeb\x4c\x6f\x57\x99\x79\xef\x9d\xda\x22\xce\x8b\x67\x66\x3b\x7b\xc0\x80\x4f\xf1\x50\x75\x14\x3e\x10\x6c\x0b\x43\x5a\x79\xe5\x4c\xbf\x5b\xdf\xe0\xea\xb1\x80\x39\xb7\x5c\xf0\x63\x99\xa6\x5e\x28\xb5\x08\xbf\xb6\x15\x05\x8f\x03\xa6\x7a\xc1\x93\x8a\x6a\x43\xbd\x42\x74\xed\xe8\x83\x58\xcd\xe1\x3d\x56\xbb\x09\x16\x2f\x5f\x3f\x13\x6b\xba\x7c\xba\x04\x4d\xa8\xfe\xb3\x20\xdf\xea\xea\x89\x40\x2f\x98\x59\xd8\xd2\x31\xe5\xc6\x55\xf6\xec\x07\x01\x8a\xea\xde\x62\x27\x85\x0a\x65\x6e\xc6\xb5\x38\x75\x3a\x26\xc1\x1f\x99\xa3\x0f\x55\x15\x99\xb5\xcd\xe9\x25\xe9\x52\xde\xad\xe3\x92\xfa\x97\x50\xc1\x8b\x2a\xa8\xc3\x0e\x46\x1c\x95\x50\xf6\x68\x58\x13\x8f\x4f\xac\xcd\xfc\xff\xf7\x7f\x01\x45\x3b\xde\xd8\x6d\xc0\xcf\x0e\xfc\x86\x84\x07\xf0\xa7\x11\xfc\xf3\x7f\x02\x79\xf9\xf4\xfb\x67\xf0\xf5\xff\xc0\x57\x07\xb2\xfe\xf9\x3f\xf8\x41\xc5\x20\x6d\x83\x40\xcf\xa3\xd1\x19\x81\xc3\x9f\xcd\xa0\x43\x9a\x51\x16\x0d\x92\x88\x62\x22\x53\x62\x7b\xbf\x25\x0e\xa6\xe3\x21\x6c\x3a\x30\x19\x52\x20\xfd\x9f\xff\xe3\x8e\x8b\x7c\xc8\x06\xad\x6c\xc4\x35\x1e\xd9\x01\x7f\xd1\x52\x70\x8d\x9b\x66\xcb\x6c\x50\x08\x50\x99\xa5\x79\xde\x19\x90\xab\x70\x23\xe8\x3b\xb8\xc2\x9e\x10\xd0\x11\xde\x26\x86\x06\x85\x7d\x21\x84\x23\xf8\xa7\x0e\xff\x42\x3e\xfb\xa6\x7c\x03\xef\xab\x2e\xea\xa7\xb9\x97\xe2\x36\x50\xd9\x92\x14\x6f\xe0\x07\x70\xa2\x2b\x58\x2a\xcb\x78\xd1\xe5\x89\x9f\x01\x88\x41\x72\x9a\xe1\xdc\xd0\x49\x02\xb1\x28\xed\xb5\xb2\x27\x93\xf3\x02\xe2\x10\x43\xc2\x88\xa2\xf1\xf5\x14\xb2\x91\x05\x6d\xe8\x18\x00\x84\xae\xf4\xb2\x37\xcd\x97\xc2\xb3\xbe\x00\x0f\xec\xdc\x17\xe2\xc1\x11\x27\x69\x42\x3c\x90\xa9\xa2\x54\xbb\xd8\x40\x98\xc0\x06\xd6\xc3\x3a\x83\x90\x72\x91\x9a\x3a\xf6\xeb\x35\x37\x9f\xff\xf3\x7f\x15\xd0\xd1\xff\x79\xf5\x1a\x46\xf0\x3f\xff\x17\x27\x03\xfd\xd8\x86\x1f\xdb\x72\xb7\x93\xe0\xb1\xd4\x34\x45\x7b\xfe\x7f\xa5\xa9\x75\xfd\x68\x0a\x03\x7c\xda\xe6\xbb\x9e\xf9\x35\x2d\xcd\x42\x79\x9a\xdf\xc8\x0f\x3c\x9d\xbb\x92\xbf\x3b\x98\x71\x4d\x0a\x49\x5b\x42\xc9\x0f\x82\x92\xbf\x3b\xcc\x80\x45\xaa\x06\x16\xd9\x40\xf4\x0d\xa1\x4e\x60\xa9\x0d\xac\x01\xbe\x91\x6c\x00\x7a\x80\x7f\xd6\x31\x1b\x7e\xe1\x1b\xe7\x6d\xcd\x85\x1f\x71\x77\xd3\xc1\xe0\x07\x48\x45\x08\xb5\x3c\xc0\xaa\x36\x90\xaa\x07\xf8\x67\x9d\x1a\x0d\xe5\x3a\xc4\xf3\x8e\x48\x7d\x40\x3c\x81\xd4\x36\x16\x6d\xfb\x8b\x6e\x78\x8a\xb6\xed\xa2\x99\xbe\xd4\x3e\x4a\x87\xa1\x21\xa9\x87\x28\x7a\x2d\xea\x60\xc0\xd3\xc3\xb7\x81\xb3\x76\x09\x2c\xe2\x84\x3f\x0a\xb6\x4d\x2a\x37\xc0\x66\x48\x4c\x06\x7c\x38\x42\xfa\x20\xe9\xa7\x9f\x4c\xf9\x2b\x1c\x8f\x57\xad\x3a\x92\xf6\xcf\xff\x75\x36\x66\xac\x67\x43\xd7\x9a\x8e\x52\x16\x2a\x3c\xb2\x6c\x79\x99\xbb\x39\xc2\x79\x41\x8d\x53\x73\x24\xc3\x26\xcc\xf1\x80\x1c\x25\x5d\xa8\x79\x40\x42\x45\x00\x3f\xd0\x13\x01\x46\xe0\x03\xa8\x69\x1d\xa8\xc7\x26\xa9\xf9\x0a\x5f\x45\x2f\x90\x63\x1a\x5a\xeb\x80\xfb\x01\xe9\xab\x38\xb6\xe4\xd7\x4d\x43\xf4\x85\xc4\xbf\xa9\x89\xb1\xf0\x3b\xe7\xfc\x05\xc4\x33\x0b\xf1\x8c\x23\xd6\x53\x53\x20\xac\xdb\xd6\x20\xc6\xc5\xe6\x60\x9e\x45\xc4\xda\x87\xd0\x1b\x0f\x60\x91\xd9\xb2\x56\x4d\x06\x7a\xe8\xb3\x27\xbc\x73\xe6\x17\x9f\x59\x97\x49\x8c\x16\x52\xc5\xff\x6b\x66\x37\xbc\x61\xbf\x2f\xba\x41\x5b\x10\x87\x06\x75\x58\x8d\xb0\x32\x18\x1c\x7d\x3a\x5d\xd6\x3f\x1a\x81\xf4\xcd\x3d\x0e\x0e\x76\x21\x75\xa7\x05\xbb\x13\x48\xec\x47\xa3\xf8\xeb\xeb\x99\x36\x5d\x68\x8d\x05\x49\x7b\x36\x39\x4b\x26\xb4\xf3\x67\xed\xec\xec\x40\x71\xcc\x4d\x26\x43\xb1\x7b\xe5\xa6\x0a\xb6\xc9\x47\x18\xb5\xc9\x97\x41\x43\x8c\x81\xc2\xca\x25\x8f\x2b\x65\xaf\xb0\x72\xae\xce\xe3\x78\x84\xa7\x02\x99\x63\xc4\xe0\xc6\x02\x59\x80\x52\x66\x09\x6d\x51\xcb\x6c\x31\x08\x0a\x0a\x1b\xfe\xa3\x6d\x30\xb2\x38\xfd\x2b\x6d\x31\x28\x75\xae\xdb\x8d\x00\xa5\xcd\x4d\xdb\x98\xb3\xee\xbb\x1c\xfa\x2b\xd2\x67\x9d\x92\x15\xb3\xc5\x39\x19\xb5\xa4\xe6\x9c\xb2\xc3\xda\x16\xba\x65\x9e\xc6\x23\x3b\x26\x89\xc7\x92\xb5\xa1\x95\xc6\x01\x42\xff\x1d\x67\x9b\x9d\xf4\x42\x1c\xc3\xb5\x3b\xb8\x38\xb3\x37\x0f\xa0\x9d\x82\x12\xd4\x93\x80\x2c\xc3\xe5\x4f\x45\x9b\xa6\x83\xb0\x52\x09\x5e\x3b\xab\x10\x49\xf8\xe8\xe6\x83\x0e\x39\xe2\xf8\x5f\xa4\xef\x5e\x90\x92\x99\x5c\xc7\xa3\x23\x3a\x23\xa8\xf9\x8d\x47\x58\x5b\x38\x64\x7e\x87\x62\xb3\x24\x87\x2f\x1b\xd6\xd2\x0e\xe2\xef\xdc\xf5\xa0\x56\x1c\xb1\xb2\x44\x6d\xd0\x1b\xd1\xc1\x99\x82\x50\xdf\x32\xdf\x8c\x61\x3e\xba\xe3\x81\x45\x2f\x16\xd5\x9e\x06\x9a\x2b\x16\xdd\xb1\xe5\xe0\xe1\xca\x6c\xbf\x3d\xca\x8d\x12\x84\xe2\x06\x57\x22\xfc\xd7\x36\xc4\xa0\xf4\x46\xc1\x42\xfb\xcf\x67\x93\xf3\x38\x4b\x66\xcf\x06\xee\x01\xa0\x32\x2e\x91\x37\x50\xd3\x14\x80\xfd\x04\x91\x57\xb3\xe6\x6a\xc9\x39\x62\xa0\xa4\x9e\x74\xdd\xc0\x47\x96\x67\xa7\xa7\xb8\xc2\xd9\x60\xb6\x3c\x54\xff\xdd\x78\xd2\xb4\x7c\x54\xff\xdd\x1e\x5a\x9f\x5a\x14\xc0\xbe\xdb\x79\xa1\x51\xc2\x43\x6b\xae\xe2\x18\x7a\x13\x41\xbb\x0b\x1b\xa0\x14\x18\x94\xb7\xc2\xa4\x74\xa3\xbe\x50\xe1\xe9\x63\x9e\x14\xce\x78\x99\x4f\xfc\x42\xf5\x1b\xad\x07\x62\x6b\xd1\xbf\xf1\xc2\xb4\x09\xe6\x46\xc0\x24\xc2\xa4\xe7\x28\x6b\xe1\x31\x2c\xbb\x68\xd5\x42\x3e\x36\x49\x2f\xa5\x5f\x17\x0d\x48\xbf\x51\xe9\x37\x3c\x9d\x2a\x15\x1f\xb8\x22\x70\x04\x6d\x83\xa1\x6d\xa3\x68\x1b\x1c\x6d\x0b\x49\x1b\xb1\xd4\x6d\x16\xbb\x16\xd7\x99\xcb\x33\xe3\xef\x92\x84\x68\x2c\xbc\x10\xfa\xdd\x66\x30\xd2\x7a\xa1\xf9\xcf\x19\x1a\x0f\xdd\x85\xd2\x1a\x22\xd4\x94\x11\x72\xf7\x41\x70\xe1\x0e\x0d\x1a\x30\xd4\xa4\x11\xf2\xd6\x0b\x01\xc3\xe7\xc2\x49\xbc\x75\x29\xa2\x85\xa3\x64\xf4\x38\xe0\xb7\x6a\x36\x50\xbf\x65\xf3\xe9\xe2\x19\x21\x97\xa5\x8a\xe1\x29\x30\x02\xcc\xc7\xe3\xaa\xb4\x70\x7a\x39\xcf\xcb\x2f\x9c\x4b\x55\x9c\xaa\xa4\x4d\x5b\x83\xea\x96\x5d\x86\x64\xa3\xd6\x7a\xb8\x7c\x3c\x5d\xd6\x24\x74\x2c\xa7\x4a\x43\x4e\x0d\xa3\x37\x16\xc6\x15\x8c\xa7\xf5\x53\xcb\x46\x78\x43\x29\xdc\x10\x08\xe3\x45\xcc\xa5\x7b\x4e\xef\x67\x31\xe9\x5a\xa1\x7b\xf6\x88\x4d\x28\xb6\x89\x60\x3f\xa8\x3d\xa2\xf6\xaa\x36\xc8\xf6\xf2\x46\x88\xa6\x5b\xad\x58\x3f\xfd\x04\x2d\xd0\x9a\xe5\xdd\xdb\xc1\xca\xab\xfa\x6c\x94\xa7\xec\x24\xa4\x4c\x71\x45\x5b\x90\xec\x33\xd1\x51\xa6\x77\x2b\x89\x17\x12\xf7\x83\xe8\x16\x45\x55\x2d\x1a\xd1\x29\xda\x4d\x3f\x88\x16\xf7\xf2\xe7\xf2\x1c\x94\xf7\xed\x88\x75\x02\xc9\x87\x53\xc1\x36\x00\x77\xa7\x44\x15\x56\x35\x31\x64\xeb\xa7\x4b\x55\x7f\xcd\xeb\x7d\xb7\x6c\xbd\xd7\xfa\xa8\x80\xec\x0f\xef\xf4\x17\xee\x60\xdf\x35\xfb\xe9\xf4\xc6\x8c\x66\xdf\x54\x69\x59\xb3\xa4\x65\x4d\x90\x76\x71\x7e\x54\x34\xe0\xe6\x83\x1a\x70\xa3\x1b\x70\x63\x35\xe0\xe6\xb3\x36\x40\x6b\xcc\x18\x55\x53\xd8\x81\x0a\xc7\xa9\xa0\x36\x4c\x85\x0d\xd1\xa3\x79\x4c\x85\xb5\xd1\xd5\x3d\x82\x92\x60\xd2\x64\x1e\x1e\x79\xaa\x90\x0b\xb9\x2c\xbd\xae\x25\xb7\x5c\xbe\xed\xf4\x9b\x12\xf4\x24\x45\x5e\xa7\x21\xf3\x59\x97\x05\x55\x1c\xc2\xe8\x3a\x64\xa2\x86\xa6\x8a\x0e\x50\xc8\x33\x50\x9d\x33\x01\x62\xed\x5a\xf4\xa2\x04\x35\x4d\x81\x42\x53\xd9\x48\x39\xae\x84\x23\xab\xeb\x60\x8c\xaf\x43\x8e\x60\xe2\x88\x9d\xa8\xc9\xd6\x50\x66\xfb\x44\x6a\x2b\xa5\x3b\x1a\xa8\x4f\x9c\x85\x4e\xc9\x41\xfe\x82\x9f\xc3\x47\x33\x6b\xf9\xfe\x80\x55\xc1\xbf\xb6\x29\x96\x12\x97\xa6\xe9\x55\xd8\xc1\x8a\xcd\xad\x07\xc6\x0b\xa5\xd5\x3e\x24\xfa\xd8\xc5\x88\xc8\x3e\xa3\xc6\x04\xdb\xaf\x4c\xc9\x0c\x71\xb1\x45\x1d\xd2\x43\x93\xac\xbd\x86\x02\xd3\xf0\x56\x15\xc2\xd9\xd8\xec\xa8\xfc\x7d\xa7\x17\x3a\x6b\x96\x5e\xb7\xeb\x20\x46\x9a\x83\x74\x1c\xa1\x8d\xb5\xd5\xcc\xf0\xb8\x26\x74\x8e\x3f\xae\x3d\xdb\xd5\xd0\xa7\x90\xeb\x3d\xab\x40\x00\xf8\xc8\x3d\x89\xdd\x66\xc3\x4a\x6f\xa0\xd2\x1b\x5d\xe9\x4d\x49\xa5\x37\xbe\x4a\x7d\xda\xbe\x53\xe9\x8d\x5b\xa9\x67\x3c\x15\xf4\x39\x5b\x74\x49\x43\x10\xc6\x47\xf0\x1c\xf7\xc9\xa3\x3e\x63\x6e\x71\xd5\xb8\x62\x7d\xde\xaa\x0a\xaa\x47\x75\x5d\xec\xc8\x97\xca\xa9\x71\x6b\x92\xf5\x90\xec\x7a\x14\xc0\x25\x88\xb4\xf5\x54\x9b\x25\x1b\x1b\x92\x29\x8b\x58\xc2\x4e\x3f\x6f\xeb\xda\x62\x17\x14\x2f\x17\xb2\x63\x7f\x6d\x92\x70\x2e\xf7\x2c\xe9\xb5\xf2\x01\xbe\x29\xb9\xc7\x83\xc4\xb8\x6d\xd2\x3c\xad\x6b\xcb\x89\xf0\xb7\x31\xbe\x23\xd2\xa6\x67\x9c\x46\xd4\x12\x82\xcd\xd4\xcb\x89\x72\x66\x92\xd8\x96\x74\x2d\xe1\x12\xc2\xba\x27\x61\xf6\x56\xf2\x06\x16\x03\xac\xdc\xa2\x54\xb8\x57\x18\x96\x30\xf7\x03\x2e\xd8\xec\x36\xb0\x86\xb2\x5d\x4c\xd9\xf6\xe7\xd6\xad\xbf\xe8\x06\x90\xf3\xf3\x7c\xcd\x68\x7d\x92\xaf\xf9\xec\x1c\xe1\x7f\xcc\x01\x7e\xc5\x86\xcc\x7b\x75\x8e\x5b\xb0\xaa\x46\xe7\x72\x63\x50\xf1\x2f\xc7\x91\xf2\xfe\x96\x8a\xcd\xa2\x49\x3f\x6e\xc9\x61\x89\x13\x5b\x5a\xa2\xb5\xaf\x14\x7e\x6c\xc8\xab\x6c\x8b\x0f\xd5\xa5\xd1\x4d\xd9\xa6\xad\xbb\x19\x0a\xad\x3a\x51\xa7\xf8\x1e\xc6\xe5\xcd\x86\x20\xce\xb1\x60\x14\x85\xf9\x22\xc7\xc4\x9d\x87\xb5\xe6\xe6\x52\xc3\xd7\x1d\x23\xc2\x8c\xa9\xc7\x08\xb7\x36\xda\x86\x46\x6b\xed\x23\xc6\xc7\x45\xb7\x38\xe6\x2f\xa0\x3c\x04\x6c\x62\xa5\xb0\x6d\x49\xc3\x80\x59\x6d\x02\xed\xe9\x59\xb8\x8c\x36\x2b\xba\xba\x58\x47\xff\xc9\x84\x0d\x84\x3a\xfb\x7d\xcc\xc1\x4e\xb8\x30\xe1\x04\xdd\x7a\x6e\x17\x73\xe7\x06\xcf\xd4\x2b\x0e\x60\xe7\xe2\x94\x33\x77\xd8\x5c\x33\xdd\x2d\xa6\x92\x66\xba\x2b\x15\xd5\x30\x52\x62\x91\x31\x4a\x0c\x25\x11\xed\xa2\x30\x23\xe9\x04\x4e\x0c\x68\x4e\x88\xcf\xf9\x96\xda\xe4\xf1\xb9\x95\xb0\x6e\x80\xa3\x42\x44\x57\xc6\x69\x59\xe4\x38\x39\x71\x58\x6e\x96\x29\xce\x49\x77\xb8\x98\x11\x85\xc1\x20\x70\x87\xf2\x14\x4f\xce\xe0\x67\xe8\x78\xfc\xd9\xfe\xc0\x24\x94\xda\x9e\x88\x78\x80\x63\xc3\x1c\xf6\x00\xfd\x3b\xad\x96\xcf\x0a\x3b\x0d\x8c\xab\x70\xcb\x31\x23\x16\x34\x65\xd3\xdc\x29\x6f\xa5\xd4\xfc\xcf\x46\x69\x9a\x85\xfa\x90\x55\x0c\x6f\x54\xab\x28\xe9\xf9\xcb\x4e\xdd\x7a\x59\x5a\x8d\x87\xc5\x97\x62\x78\x28\x67\xd3\x24\x0c\x3f\xc0\x0c\x6b\x2c\xbc\xb4\xc3\xa2\xaf\x5c\x06\x15\xdb\xdd\x08\x7e\x64\xdf\xb8\x65\x11\x9e\x7c\x62\x9f\xf1\xa3\xb1\x50\xcb\xcd\xc5\x8f\xae\x7f\x1e\x13\xbb\x85\x33\x77\x8f\x81\x6e\xf1\x52\x5a\x2d\x4d\xa0\x3b\x60\xa8\x8e\xc8\xd1\x00\xfe\x6d\xf3\xf9\xb5\xe4\x1a\xef\x1f\xf9\x36\xeb\xf8\xc8\xc7\x6a\x02\xf7\xc2\x1b\xfe\x37\x6d\x07\xdc\xdb\xfc\xd0\x19\x89\x54\x8a\x8f\x9c\x36\x1f\x3a\xee\x90\xa4\x12\x30\x50\x7b\x59\x1c\x5d\xd8\x23\x65\x4a\xfb\x21\x6c\x2e\xa9\x45\x6d\xff\x08\xb9\xbd\x67\x57\x5e\xec\x79\xd5\x57\xe4\xb8\xc0\x3f\xa6\xca\x61\xb3\x25\x1d\x82\x4c\xe6\x7a\x01\xb2\x2d\x21\xdb\x36\xa4\x5c\x72\x11\xc8\x8c\x09\xd0\x25\x98\xc3\x85\xc6\xb3\x69\x40\xac\xe1\x4e\x0d\x45\x53\x41\x4b\xb8\x5e\x12\x5d\x75\x71\xa0\x11\x52\x95\x22\xb1\x2d\x12\x03\x8b\xe5\x23\x59\x78\x24\x0b\x8f\x78\xe1\x91\x2c\x3c\x2a\x29\xac\x77\xfd\xa2\x0d\x0f\xe4\x5a\xe5\xf5\xc6\xb4\x26\xa2\x25\xe3\xac\x5d\x3d\x0d\xd3\x4f\xa3\xdd\x89\x63\x36\xb5\xae\x58\x03\xb5\xd8\xcb\x77\x58\x01\x3e\x6e\x0d\xd0\xd7\xe9\x17\x2e\x06\x65\x22\xcd\xd4\x5e\xba\xa4\xdb\x15\x2a\x23\x76\x9a\x0c\xd8\xc2\xb1\x68\x3e\xf0\x60\x34\x72\xd5\xcc\x69\xa1\x35\x3a\x9a\xa3\x17\xfb\x55\x25\xf7\xc4\x77\xc1\xf9\x2c\x55\xcd\x14\xec\x8f\xd0\x9d\xf9\xd1\xb1\xfb\x4c\xd0\x12\xc7\xb7\xdc\x64\xe0\xf8\x4d\xd4\x83\xfe\x28\x8e\x32\x75\xb3\xd2\xcd\x95\x17\xb1\xaa\x65\x6b\x82\x0a\xb9\x6b\xcc\xb1\x76\x70\x66\xef\x2a\x2d\xde\x3f\xfd\x14\xb0\x1d\x11\x20\xa8\x37\xaa\x95\x57\x87\x30\x3c\x32\x35\xf7\x41\xbd\x07\x5a\xc5\x12\xf6\x64\xad\xea\x03\x74\x80\xe1\x9b\xc7\xca\x85\xda\x67\xde\xf2\xba\x2d\x84\x28\x30\x9b\xad\x56\xa7\xae\xad\x91\x55\x46\x30\xee\xb0\x63\x69\xf8\x45\x92\xdd\x7b\x2f\xda\x8f\xc0\x19\x2c\x22\x04\x0b\xe7\xbb\x38\x4d\xad\x50\x5d\x78\xc5\xa4\x12\xe1\xd0\x62\x2a\x51\x38\xad\x37\x8c\xa4\xc9\xcf\x93\xb3\xd9\x9f\xe3\x9b\xe0\x91\x40\xd0\x8f\x93\x11\x86\x94\xd8\x20\xbf\x55\xa6\x2c\x5d\x70\x95\xc8\x89\x91\xa4\xbc\xa8\x85\x37\x8e\xd7\x8b\x5a\x5e\xc2\xf5\x9f\xea\xc8\xfb\x15\xfa\xfb\xa4\xa4\x3f\x8a\xc9\xe4\xb3\x81\xf8\x81\x88\x7e\x3a\x52\xf1\x78\xe9\x27\x26\xdb\x3e\xa0\x90\x88\xfc\x95\x11\x58\xe9\xdb\xc4\x8c\x04\x39\x7d\x44\x41\x94\x7c\xce\x2a\x3c\xa6\x50\x36\xec\x85\x14\x4b\xa5\xa6\x5b\x07\xb5\x9f\xe7\x32\xbe\x03\xfc\x70\x6b\x86\xa4\xf0\x1c\xd6\x5b\x66\x37\x66\x08\x41\x82\x8a\xb5\x35\x3d\x93\xc0\xd0\x19\x24\x31\xc5\x15\x64\x94\x14\xeb\xe7\x0d\xf9\x98\x14\x7e\xe4\xf2\x03\x6b\x5c\x1f\xa1\xdb\x8d\xcf\x27\x1c\x5d\x6f\xbd\xb8\xe5\xf3\x37\x44\x55\x13\x10\xc3\x72\x8f\x7f\x08\x11\x7a\x41\x0f\x7b\xa7\xd3\x08\x2f\x56\xd6\x70\x5f\x2c\x2e\x8d\x61\x22\x14\x68\xc8\x82\x08\xca\xd1\xc8\xc6\x11\x43\x4c\x6f\x43\xd6\xf7\x76\x48\x4e\x48\xb1\xa2\x74\x4a\x1c\xb2\x6b\x04\x2b\xad\x62\xcd\x5e\x96\x0c\xcf\x9d\xc3\x3b\x6d\x04\xd7\x53\x01\x67\x71\x73\xaf\xe1\x8b\x9d\x7f\xc1\x1c\xa6\xd8\x93\xe7\x92\x72\xc1\x61\xc5\x5c\xcd\xd7\xcd\xe0\xa2\xce\x7a\xd7\x26\x69\x10\x65\x17\x9f\x8d\xa0\x0b\x10\x3d\x82\xa8\x72\x82\xa0\x73\x2a\x06\xad\x80\xc6\x1e\x2c\x69\xad\xff\xae\x83\x2a\xe3\x0c\x5c\xec\xda\x31\x46\xd9\x94\x82\x06\x47\x67\x92\xbf\x8c\x5e\x86\xe7\x75\xe9\x3b\x1e\x9e\x07\x7f\x78\x18\x6c\xed\x82\x36\x20\xdc\xde\xcf\x61\x18\xc1\x27\x64\xc9\xa8\x43\xb9\x2e\x94\xab\x42\xb9\x84\x15\xbf\x85\xe7\x38\x8a\x20\xa9\xfd\xe0\x50\x1f\x31\x90\x11\x03\x91\x6b\xc4\xb8\x23\x60\x1e\x06\xcd\x1d\x0c\x00\x84\x4e\x74\xa8\x0f\xe7\x75\x82\x87\x1f\x78\xd6\x82\xaa\xa2\x84\x47\xd5\x17\xdd\x5b\x47\x90\xae\x9a\xa3\x39\x70\x19\x3a\x76\x60\xdc\x9d\x51\x9b\xce\x83\x0d\x6a\xdd\xa1\xd9\xc6\x9d\x8b\x4b\xf1\xe7\x78\xa8\x83\x39\x56\xb1\x2f\x03\x2c\x25\x3b\x63\x4c\x1a\x3a\x90\x0a\x55\x92\x57\xed\x39\x8c\xb5\x62\x89\xf6\x3e\x2b\xd2\x71\x73\x3b\xdb\x15\x08\x43\xc8\x85\x8f\xf3\xba\x85\x58\x43\x7b\xd7\x9f\x4b\xab\xb5\x12\x96\xc6\x71\x86\x57\xa2\x43\xca\x7e\x10\x74\x76\x76\x7c\x0b\x80\x1c\xbd\x38\x58\x10\x11\xae\x13\x1d\x74\x23\x26\xac\xe2\x1f\x5c\x4f\x3a\xd2\x2d\x58\xde\x7b\x39\xef\x2b\x81\xd9\x2f\x0a\xcc\x3e\xc9\x94\xfe\x72\x02\xb3\x5f\x25\x30\xf1\xad\xf6\xf5\xfe\x07\x0b\xcc\x3e\x17\x98\x7d\x2d\x30\xfb\x5a\x60\xba\x25\x46\x51\x4f\x38\x30\xc0\x0f\x59\x62\x84\xc0\x11\xfe\xe9\x49\x11\xab\xf2\xc2\x73\xc1\x02\x94\xae\x90\xa6\xbe\x69\x89\x39\xaf\xd7\x9b\x19\x16\x1a\x8a\x92\x75\x17\x0f\xa7\x4a\xf2\xca\x95\xbf\xfd\x82\xfc\xed\x2f\x23\x7f\xfb\xcb\xca\x5f\x47\x7c\xf5\x1d\xf1\xd5\x67\x07\xad\xed\x56\x4b\x77\xc2\xba\xe2\xc1\x9f\x71\xbc\x96\x8a\xc8\xba\x2d\xf1\xfa\xcb\x89\xe0\x65\x69\x8a\xae\x43\x43\xd1\xc6\x47\x53\xb4\x58\x06\xf7\x47\xd4\xc7\x2e\x35\x52\x06\x0b\xb5\xc2\x2f\x89\x65\x49\x67\x46\x50\x5c\x40\x29\x79\xeb\x24\x87\xe5\x6c\x37\x19\x7d\xc8\xe8\x9b\x0c\x9b\x35\x88\x72\x24\xb9\x81\x57\x7b\xce\x83\x07\x0f\xd9\x2d\x28\x9c\xf0\x8a\x59\x78\x0b\x85\x24\x40\x9f\xcf\x60\x1c\xea\x0f\x25\x26\x97\x66\x89\x9c\xbf\x7c\x50\x3e\x83\xc5\x9c\x61\x33\x58\xcc\x53\xc9\x1b\xf4\x1e\x5e\x8f\xe4\x07\xd6\xb8\xde\xab\x98\xc1\x23\x2f\x6e\xde\xe4\x26\xc5\x99\x8b\xf0\x4f\x4f\x2c\x0d\xbe\x39\xcf\xf8\x3e\xc2\xee\x1a\x61\x5f\x8d\x2c\x25\x89\x66\xec\x48\xcf\xe0\x70\x24\x66\xec\x08\x67\xec\xc8\x9a\xa3\x9c\x1b\xce\x1c\x15\x83\x0e\xaf\x96\x1d\xda\x89\x7f\x83\xc4\xe6\xc1\x4e\x6b\x7b\xaf\xa1\x92\xfe\x8e\x70\xfa\xeb\xbf\xf0\xab\xd9\xda\xdf\xdf\xdf\xb2\x8b\x3a\x73\x1e\x52\x16\xcf\x79\x5e\xec\x2e\x73\x1e\x5b\xf6\x51\x73\x5c\x75\xb2\xea\x5f\x6b\x86\x59\x54\x2d\x3d\xe7\x0d\x4d\x1f\x34\xc7\x97\xa7\x68\xe1\x9c\xc7\xda\xb4\xde\x35\x2a\x47\xec\xcc\x1c\x31\x9a\xec\xd9\x83\xdd\x8b\x3b\xa5\x10\x59\xdb\xde\xc5\xd5\xbd\xdd\xde\x6d\xd0\x4b\xea\x37\x90\x14\x41\xc2\x0e\xf2\xff\x1d\x25\x6c\x04\x3d\x34\x9a\xb5\xe4\xcc\xbf\xd6\x43\xe1\xf4\xfa\xe6\x1d\x7a\x35\x3c\xd0\xe3\x4c\x40\xdc\xd8\x10\x37\x0c\x42\xc6\x69\x79\x67\x43\xbc\x63\x10\xff\xe5\x93\x2f\xd8\x08\xf8\x07\x60\xe9\xe7\x56\x13\x14\x93\xed\x9d\x6d\xba\x1e\x87\xfa\x40\x73\x67\x6b\xaf\xbd\xb5\xbf\x03\xdf\x48\x6f\x73\xfb\x60\x7f\x67\xab\x8d\x37\xb1\xde\xd1\x0e\x55\x97\xdc\x68\x1e\xec\x1e\x74\x76\x77\xa9\x20\x34\xbe\xb9\xbf\xb7\xdb\x6a\xb7\xf6\xa9\xe0\x3a\x6c\xd0\xb7\xdb\x3b\x3b\xbb\xc5\x72\xcd\x16\x24\x6f\x6f\x6d\xcb\x0a\x9b\x9d\xd6\x76\xab\xb3\x73\x20\x8b\xc1\xd4\xd9\xd9\xeb\x74\x76\x3a\x54\xd0\x7b\x3f\x4f\x2d\xd3\x7e\x41\x36\x92\x17\x3c\xd9\x4a\x23\xae\x33\x82\x2c\xe9\x84\x3d\x28\x23\x39\x24\xef\x8f\x36\x98\x69\x35\x82\x9c\x08\x88\xe8\xe1\x9d\xb0\x3a\x09\x75\x6b\x41\x07\xe1\xdd\x08\xe8\xcf\xa8\x94\x32\xd9\x91\x16\x4d\x78\xe7\x12\xda\xb9\xbb\x7f\xb0\xd5\x82\x86\x3f\x0a\xae\xa9\xf1\xf8\xbf\xae\xf0\x5b\xd9\xc6\x61\x71\x80\xc3\x67\xaf\xb9\xb7\xbf\xd7\xda\xda\xf3\xe1\x47\x16\xe2\x34\xf2\xe2\x6f\x81\xcc\x01\x7e\x3f\x32\x3b\x9d\xeb\x06\xdd\x9b\xdc\xc2\x56\x28\xb4\xb2\xb7\x44\x7d\x65\x75\x60\x37\xb9\x21\xbe\x98\xde\x09\x0a\x27\xce\xd5\x8c\x94\xfa\x56\x6b\xab\xb5\x4d\x77\x60\x9a\x07\xd8\x69\x19\x4e\x57\xec\x63\x75\xc3\x0b\x29\xc9\x04\x25\x9d\xe6\x36\xda\x30\x30\xd7\x52\x3a\xc5\x8c\x15\x83\xd3\x9d\x78\x44\x4b\x23\x18\x2e\xb5\x64\x21\x22\x6b\xc9\x42\xc1\xf4\xdf\xff\x9d\xc9\xb9\x3d\xa4\xaf\x21\x5b\xb4\xfe\xfb\xbf\xab\x56\xad\xcc\x8b\x9e\x4d\xa4\x0c\x57\x96\x0c\x57\x96\x4c\x6b\x91\xce\x46\x3d\x53\x1b\xf5\x06\xdb\xbe\xb1\x71\xc5\xdb\xe7\xeb\x0f\xc8\x7f\x39\x1f\xf7\xe2\xcc\xfb\x2a\x1d\x57\xf2\xe9\x81\xc2\xaf\x60\x03\xb6\x2b\x1f\xa0\xc3\x8f\xfd\xe0\x0b\xdc\x20\xa8\x94\x2f\xf4\x6e\xc1\x53\x8f\x30\xb4\x78\xeb\xf1\x11\xa2\x6d\x2d\x66\x99\x03\x18\x67\x99\x83\x94\xc5\xcb\x1c\x2f\xf6\x69\x4d\x0b\x14\x53\x4a\xfa\x44\x60\x5f\x0d\xd5\x6f\xe4\xb7\xfa\xdd\x13\xf7\x3c\xb6\x98\xa2\x76\x9f\x22\xcf\xdd\x1f\xd2\xdf\x5e\xdd\xc3\xee\x84\x22\xf6\xab\x28\xcf\x58\x86\x8a\xc0\xa4\x80\x44\xaa\x33\x31\x59\x84\x67\x28\xb2\x86\x76\x56\x4f\x3c\x38\x45\x59\x3d\x93\x55\xac\x50\xaf\xe7\xd4\x9d\x19\x19\x43\x98\x26\x4f\xa9\x43\x6f\x6a\x8f\x52\xad\x05\xd3\xe2\xf8\xcf\x66\x39\x41\xb2\xb5\xa5\x24\x63\x56\x93\x21\xfb\xdd\x2b\x27\x4c\x58\xef\x2a\x56\x72\x69\xff\x0a\x55\x05\x0a\xf9\x22\xc4\x4b\x18\x15\x6b\xff\x21\x3c\x5c\x44\x1d\xf1\xb5\xac\xa3\xee\x49\x1c\xfa\x12\x4b\xf4\x08\x05\x73\xe9\x54\x77\x89\xe6\x05\x94\xde\xb5\x16\xd6\xcb\x15\xa5\xcb\xba\xa6\x37\x44\x15\xa3\xeb\x74\xaf\x93\x5f\x32\xb9\xa5\x4c\xc2\xd8\x6d\x78\x1a\x4f\x02\x89\x4c\x86\x82\x0c\x91\x8e\xfc\xa0\x1f\x80\xf1\x79\x7a\x15\x67\x4f\xa2\x5c\x9f\xb8\xa8\xb9\xd4\x12\xd3\xa8\x25\x66\x10\xde\x4c\x25\xc3\x13\x6c\x83\x94\x7d\x57\x5a\x71\x36\xc3\xe3\x68\xe3\xdd\xc9\x7a\xfd\x4d\x18\x36\x1f\xd4\xdf\xd4\x37\x9b\xf1\x75\xdc\x97\x34\xb0\x99\x33\x66\xa7\xac\x64\x2f\x1a\xe3\x55\xf5\x66\x3e\x1d\x25\xb3\xb0\xd6\x30\x41\xf9\xf2\xab\x04\xcf\x68\xa0\x00\x9d\x3f\xaa\x32\x41\x1f\xc8\x0c\x6a\xd0\x9c\x5a\x57\x25\x59\x47\x5e\x92\xc9\x38\x54\x88\x0d\xdf\x8c\xd2\x68\x16\x8e\x3b\x78\xb4\x49\x41\xa6\x58\x92\x38\xd8\x24\xa5\xd9\xce\xe8\xa8\x0c\xeb\x38\xd3\x26\x01\xd8\x5a\x4d\x82\x54\xbf\x74\x87\x48\x91\xaa\x48\xf1\x67\xb5\xcb\xb3\x80\x28\xdf\x05\x1e\x66\x0e\x42\x06\x33\x23\x3c\xe2\xc0\x30\xa9\x22\xea\xbc\xec\x8a\x82\x95\x09\xc9\x14\x96\xf8\x4c\xf6\x2b\x4e\x2b\xf1\xa3\x67\x59\x9b\x28\x58\xbd\x18\x3c\xf7\xe5\x4d\x11\x7c\x3f\x53\x8c\x22\xf4\x82\x7e\x3c\x0b\x5b\x75\xf1\x08\x05\x4c\x29\x94\xa7\x72\x17\x2c\x69\xa2\x06\x3d\x9b\x28\x5a\x64\x04\x7d\xbc\x87\x0f\x83\xb9\x6e\x5b\xfb\x24\x08\x73\x5d\xd9\xb6\x9c\x72\x51\x13\x17\x78\xbf\x08\xb6\xf6\xd1\x1e\x07\x4b\xe0\xf6\xa1\x05\x90\x51\x5a\xf0\x53\x90\x99\x74\x11\xca\x53\x94\x03\x7d\xd8\xce\x18\xaa\x02\x43\x93\xde\x63\x05\xda\x3b\x76\x3a\x08\xf3\x2f\x09\xbe\xa7\xd2\x99\x6b\x49\xb1\x05\x7b\xa5\x2d\x68\xef\xee\xc1\x66\x62\x5f\xb4\xa2\xbd\x6b\x53\xa5\xa1\x76\x77\x3a\x12\x64\xdf\x4f\x1f\x08\x89\x43\xcf\xb8\x60\x3d\xbd\x40\xff\x20\x11\xeb\xe8\x60\x64\x70\xa6\xb0\x3e\x5a\x18\xc1\x92\xf4\x30\x50\xcb\x90\xfc\xd5\x93\xbf\x28\xbc\xbd\x0e\x9f\x81\x82\x4d\xe1\x83\x81\x8d\x13\x3e\x42\x2d\x18\xb0\x34\x02\x69\xd9\xc6\x26\x62\xea\x3a\xa6\xea\xc8\x1f\xf2\x10\xdf\xb0\x2c\x97\x16\x68\x32\x2e\x0f\x30\x38\x02\x2b\xd4\x15\x29\x64\x85\x55\x15\x58\xa7\xb8\x18\xce\x10\xb3\x84\xa1\x06\x96\xe9\x0d\x6c\xe1\x66\x80\x01\x9b\x42\x5c\xaf\x51\xdf\xdb\xc5\xe8\x30\x75\x66\x57\x1e\xda\xa5\x7a\x18\x28\x42\x95\xea\x48\x38\xca\xc9\x20\x67\xa8\x72\xf4\x30\x24\x8b\x8e\xb2\x01\x3b\x17\x00\xb1\x18\x4c\x8e\x43\xab\x75\xb8\xa1\x81\x79\x83\xcd\x54\x81\x60\xce\xcb\x0d\xbe\xbe\x93\x1f\xb7\x43\x71\x13\xe1\x2a\xd5\x46\x3c\xe0\x16\x46\x05\x88\x1d\xda\xc9\x43\x99\xdc\xb3\x93\x7b\x6c\x89\x90\x9b\x5a\xb5\x57\x09\x9b\xdb\xed\xce\x36\xec\xf8\x68\x6f\x00\xfb\xc2\xad\x9d\xbd\x9d\xbd\x5d\x74\x0e\x19\xe2\x67\x7b\xbf\xb5\xbd\xb5\xb7\x43\x3b\x2e\x11\x64\x82\xb6\xbf\x30\x2e\x6e\x5c\x44\x9d\x76\x67\x77\xaf\x73\xa0\x10\xed\xb5\x77\xda\x3b\x9d\x8e\x42\xd4\xda\xeb\xb4\x0b\x78\xfe\x5e\x6f\xa8\x1d\xb2\xc1\xd3\x6a\x1f\x6c\x6d\x6d\x69\x3c\xed\xf6\x41\xfb\x40\xa3\x39\xd8\xc1\x0d\x4d\xdb\xc1\xf3\x5f\xb6\x7e\x23\xcd\x19\x30\x3b\xe5\x36\x19\x75\x6e\x0c\xf6\xf0\x40\x6c\xe7\x6e\xa0\xda\x8e\xf8\xc4\xdc\x92\x8d\xac\xe1\xb5\x13\x67\x46\xcd\xa4\xba\xd8\x61\xe1\x06\x9d\x76\x23\x9b\x72\x97\xd5\x35\x3a\x59\x48\x4d\xc0\x0d\x15\xe6\xe2\x8f\x06\x6d\xb3\x2a\xb5\x00\xb9\x7c\xf4\xf9\x64\x3e\x53\xa2\x58\xac\x77\x7d\xbb\xc1\x7d\x25\xca\xfb\xec\x25\x5e\x29\xd5\xff\x50\x53\x9b\x4e\xb1\x3d\x3c\xc3\x33\x89\x26\x52\xd4\x0d\xce\x8a\x1b\x04\xb1\xfa\x04\xce\x53\x0d\x11\x4a\xfd\x1e\xec\x2b\x40\x97\xdc\xd9\x3b\xe8\x6c\xed\x6f\x89\x7b\x04\xd1\x64\x96\xfc\x38\x8f\xaf\xce\x13\xbc\x46\xd0\xde\xdd\xde\xc6\xe1\x22\xf3\x7e\x9c\x47\x5d\x10\x80\x3b\x5b\x2c\x61\x1c\x81\x26\x04\xa0\xfb\x5b\xb8\x1f\xde\x96\x19\xef\xe6\x99\x44\xbd\xdd\x56\xc5\x7b\x71\x32\x24\x9c\x30\x02\x3a\xbb\xf2\xda\x56\x2f\xc9\x7f\x24\x2a\x76\xf7\xf6\x5a\x9d\x6d\x59\xbe\x37\x8a\xfa\x17\xfa\x6a\x17\x7c\x4d\xfa\xe7\xf1\x20\x1a\x8d\xd3\xc9\x40\xc0\x76\xa0\x93\x54\x2e\x96\x47\xf1\xa7\x3f\x2f\x93\x74\x14\xcf\xba\xc1\x01\xf4\x4f\xa7\xd5\x91\x19\x59\x7a\x35\x81\xc2\xad\xfd\xce\x76\x67\x4b\x55\x34\xcf\x46\x37\x57\x69\x8a\x58\xb7\x77\x0e\x76\x3b\x5b\x6d\x91\xd1\x8f\x06\xf1\x4c\xa0\xde\xed\xec\xa2\xd0\x97\xe9\x78\xd1\x28\x8b\xe7\xb9\x6c\xf2\xd6\x4e\x47\x65\xa4\xfd\x54\x5c\xbe\x68\x6f\xed\xed\x1f\x6c\xef\x49\xea\xfb\x69\x16\x8d\x88\xe8\xed\xed\xce\x5e\x47\x27\x4e\xce\x46\xa8\xf2\xc9\x3a\x76\x60\x52\xec\xb7\x4d\x66\x9e\x8c\x2e\x44\x4b\x77\xa0\x16\x99\x9e\x25\xe3\x1c\x83\x39\xb7\x01\xd3\x16\xaa\x4c\x22\xf9\x26\x9a\x58\xdd\x82\x1b\x0c\xd9\xb7\x5b\x07\x26\x49\xc0\x81\x3c\xe8\x6c\x99\xc4\x61\x3a\x1a\xc4\x93\x8c\x18\xd0\x69\x1d\x74\x0e\x78\x89\x61\x16\xdd\x40\x3a\xfc\x77\xd0\x6a\xef\xf1\xf4\x38\x9e\x20\xcf\x77\x15\x0d\x32\xd5\x0b\x7d\x71\x1e\x5d\x24\x88\x7e\x7b\x6b\xab\xb3\xc3\xd0\x8f\x31\x56\xde\x0c\x86\xd4\x41\xbb\x75\xb0\xbb\xcd\xa8\x4a\x47\xc9\x65\x2c\x6b\xd9\xd9\x39\xd8\x3b\x38\x60\xc5\x52\xba\x2e\x24\x38\xba\x07\xfd\xcb\x73\xfa\xe7\x09\xb6\xa4\x05\x93\xb8\xd5\xee\x98\x9c\x2c\x1e\x88\x6a\x76\x5a\xdb\x26\x35\xa7\x11\x85\xe3\x74\xab\xb5\xbf\xdd\x66\x98\xf2\x38\x92\xd5\xc3\x00\x3e\x80\xbe\x61\x59\xd8\xc9\x82\xbd\xdb\x7b\x5b\xdb\x5b\xdb\x7b\x4e\x9e\xe0\x1a\xf6\xcf\xf6\xc1\x4e\x21\x2f\xf6\xe5\xc1\xa4\xff\x71\x9e\x26\x38\xa8\x76\x3a\x07\xdb\x2c\x47\x0f\xe5\xdd\x83\x83\x1d\xdd\x37\x71\x3c\x9d\x26\x13\x31\x40\xda\xbb\x07\x9a\x04\x48\xcf\x2f\x6e\x24\x71\x07\x20\xb0\x65\x7a\x32\x16\x44\xed\x1e\xc0\xe8\xdf\xdd\x61\xa9\x71\x21\x35\x1d\x0c\xd5\xa8\x04\x99\xba\xd5\x56\xac\x3f\x4b\xb2\xb8\x97\x25\x38\x2f\xdb\xc8\xfa\xf6\xf6\xae\xcc\x18\xe1\x08\xd7\x12\x03\x46\xec\x81\xea\x14\x7c\x99\x2f\x9f\xa9\xe1\xd2\xd9\x05\x25\x51\x76\xca\x19\x3a\x9e\x25\x91\x68\x01\x2c\x10\xb2\xf6\x61\x94\x4c\xf2\x5e\x9a\xa5\x34\xc8\x61\xc6\x28\x39\x31\x3c\x4f\xf3\x99\xae\x63\xab\xbd\x0b\xc5\x64\x0e\x8c\x60\x42\x03\x49\xaa\x5e\x3e\xaa\xb7\xb7\x3a\x07\x6d\x9d\x41\x6c\x00\x2a\xda\x7a\x20\x48\xea\xb6\x3a\x7b\xbb\xfb\x2c\xe5\x26\x1e\xc1\xfc\xc4\xb6\x6e\xc3\x0a\xa5\xa4\x8b\x60\x98\x55\xfe\x3c\x9d\xc4\x37\x83\xf8\x4a\x89\x3b\x45\xf1\x79\x3a\xd3\x7d\xb4\xb5\xbf\xb7\x2d\x93\x93\x09\x1e\x2c\xd1\x78\x6c\x6f\x6d\xef\xec\xef\x74\xb6\x4d\xc6\x30\x15\xfd\xb6\xb5\xa5\xa0\x2f\xd3\xec\x46\x70\x15\x1a\x27\x13\xd5\x84\xda\xd9\xdb\x87\x46\xcb\xc4\x51\x84\x4f\x52\x60\xc8\x75\xe8\xf6\xad\x8e\x1e\xcd\x2a\x1d\x7a\x34\x3f\x17\x98\xb6\xb6\x54\x67\x8f\xa2\xab\x89\x6c\xff\x3e\xcc\xda\x83\x3d\xd9\xa5\xa3\x18\xe6\x05\xcc\xa5\xb3\x33\x9a\x1e\xd8\xa7\x20\xdd\x65\x1e\xda\x8b\xa4\x78\x01\xf9\x02\x53\x7a\x9b\x65\x28\x69\x87\x3a\xc7\xce\xd6\x2e\xcf\x21\xf1\xd3\x86\x4e\x85\x19\x7d\xc0\x32\x74\x67\x69\x96\xc3\xaa\xb3\xdf\xd1\x0d\x20\x18\x21\x89\x40\x14\x76\xb6\x94\xf8\x92\x19\x72\x96\x1e\xec\x83\x38\xb2\x33\xfc\x25\x74\xa7\xec\xec\x6f\xef\xf2\x36\x69\x69\x00\x59\x30\x18\x3a\x3c\x4b\x8b\x83\x4e\x7b\xbb\xb3\x7f\xc0\x49\xd3\x13\x0e\x92\x5b\x5b\xdb\x9c\x06\x26\x0e\xf6\xf6\xb7\x60\x1d\xdd\x2a\x66\xc6\xfe\xcc\x59\x1c\x8f\x14\x93\x81\xd0\xbd\x2d\xce\x64\xc3\x28\x18\x16\xed\x7d\x9d\x35\xa6\x95\x04\xf6\x27\x26\x41\x8d\x6e\x98\x04\x7a\x50\x8d\x60\xc1\x9e\x08\x36\xef\xec\xaa\x65\x4a\x0b\x63\x7b\x42\xc2\xf2\x9e\x22\x53\x70\xad\xdb\x6d\xc9\x09\x32\x8e\x07\xc9\x7c\xcc\x57\x7f\x18\xe2\x7b\x5b\x9d\x0e\xcf\x56\x22\x64\x87\x27\x6a\x09\xdd\xe9\xb4\x71\x0e\xf3\xbc\xe9\x3c\x9b\xe2\xb5\xc6\x83\x5d\x58\x71\x95\x3e\x22\xb2\x0c\xff\xb7\x0e\xf6\xf6\x61\x9c\x5a\x99\x46\x20\xef\xb7\xf6\xf7\xf6\x54\xef\xc8\xdc\x29\x5a\x6a\x64\xe9\xdd\xed\xb6\x1a\xad\x22\x97\x09\xde\x6d\x98\x61\x5b\x2d\xab\xac\x10\xbe\x72\xae\xb6\xb6\xf7\xda\x7b\x8a\xaa\x64\x30\x61\xd3\x00\x18\x79\xa0\x56\x1b\xd8\xf3\xcc\xf0\x29\x89\x31\x69\x3a\x9d\xf6\xfe\x8e\x42\x99\xe4\xb3\x9b\x2c\xcd\xb5\xb2\xa3\x91\xa5\xfd\x3e\x46\x7f\x54\xe9\x1d\x39\x39\x26\xd1\x65\xf4\x36\x35\x72\x75\x77\x7f\x57\xcd\x41\xc8\xc2\xc1\xad\x94\x12\x98\x40\xa0\x30\x11\x14\x2c\xa3\x3b\x3b\x3a\x39\xc1\xd7\xb6\x50\x5a\x6d\xa9\x99\x4d\x69\x83\x2c\xea\xc1\xa8\x6b\x6d\xef\xef\xa9\x25\x85\x2d\xaa\xb0\xcc\x28\x71\x29\x52\x05\x03\x70\x2f\xb0\xa5\x14\x34\xdd\x8f\xdb\x5b\x30\xd5\xd5\xe0\x9c\x46\xa3\x98\x8b\xde\x9d\xdd\x9d\xbd\xb6\x1a\x75\x94\x29\xba\x01\x96\xbf\x0e\x08\x14\x96\xc1\xfa\x01\xc6\x7b\xe7\x00\xc6\x80\xc9\xe4\xdd\xb0\xbd\xb5\x0f\xc2\x7c\x4b\x65\x4e\xa3\x9b\x08\x38\x34\x95\x82\xad\xb5\x27\x47\xc6\x14\xc3\xc7\x4c\xe7\x67\x67\x82\x73\xf0\x7f\xaa\x48\x9c\xcd\x49\xf2\xee\xee\xc3\xb2\x2e\xd3\x94\x44\xd8\x6d\xb7\xd4\xb8\x9f\x8e\xe6\x63\xd2\x09\x3b\xdb\xbb\x5b\x0a\x69\x7a\x35\x50\x4b\x23\x50\x09\x5a\x81\x92\x51\x6a\xe8\xe2\x2c\xd9\x53\x52\x0f\x96\xcb\x18\x7a\x56\xe5\xed\xee\xc2\xd0\x55\x2a\x9e\x62\x29\x19\x1c\x64\x52\x9a\xdf\x28\x1d\xb5\x83\xbb\x36\xa5\x74\x64\xe9\x4d\x24\x65\x01\xc8\x9e\x5d\xad\x1e\xe4\xd1\x60\x30\x8a\x65\x11\x18\x7f\x20\x09\xf6\x54\x8e\x92\x64\xb0\x1c\x81\x00\x54\xa9\x93\x81\xae\x61\xb7\xb5\x05\xb8\x64\xbf\xb1\xe9\xd5\x82\xfd\x58\x67\x4f\x27\xe7\xe7\x20\x6a\x04\x73\x81\x0f\x72\x5c\xe5\x49\x3c\x99\xa0\xa4\x00\xe0\xdd\x3d\x35\x19\x41\x63\xbd\xa4\xe5\x07\x96\xf9\x8e\x96\xc5\xb6\x74\x54\xda\x35\x9b\xb2\xc0\x95\x56\x6b\x97\xa7\x4b\x81\xb9\x05\xe3\x4d\x0d\x37\x2e\x2b\xad\xf4\x89\x12\x83\x3b\x07\x6a\x9c\xd9\x13\x7e\x67\xbb\xa5\xe8\x33\x22\x75\x7b\x17\x54\x5d\xc5\xf7\x19\x2d\x4b\x5b\x28\x3a\x74\x52\x8c\x6b\x18\x30\xe8\x40\xb6\x02\x4d\xcc\x33\xec\x44\x90\xfe\x30\x6b\x94\x42\x3e\x4b\xc7\xd1\x2c\x15\x2b\xfc\x5e\x4b\x29\x74\x5c\xa6\x74\x76\x40\x00\x48\x24\x4a\x95\x83\x69\x01\x0a\xe0\xbe\x4c\xbd\x3a\x8f\xa3\x99\xd8\x15\x6d\x69\xfe\x30\x65\x0a\xb6\xd9\x3b\x2c\x31\x1f\xa7\x17\x7a\x13\xa5\xc4\x01\x5f\x0f\x76\x0f\x94\x46\x20\x52\xf5\x94\x83\xb1\xdc\xda\xdb\xbe\xa7\xee\x0f\x5a\xb6\xc9\xe2\x7b\x7a\xf1\x8d\x3c\xc3\x52\x9b\x56\x0b\x3e\x8f\x67\x02\xc4\x73\x50\x25\xf6\xc2\x75\xd7\x12\x4f\xbf\xd3\xac\x60\x89\x97\x8f\xb8\x5e\x8a\xcd\xad\x2a\x81\x7b\xdc\x4b\xdc\xd0\x16\x7d\xe4\x95\x05\x5f\x9a\x64\xd8\xb9\xa6\xac\x42\xd8\x1f\xe4\x87\x68\x6a\xf3\xfa\x5c\x26\xc3\x8f\xd7\x50\x23\x1a\x85\xd5\x13\x10\x05\x52\x15\x0c\xe8\xae\x53\x7c\x0b\xcc\xa1\x58\xd3\x04\x7b\xc7\x06\x88\xf5\x71\xfc\x9a\xde\xba\xc4\x7b\x05\xbd\xa8\xef\x3c\x45\x58\x38\xc1\xc1\x76\x76\xd0\xc0\x24\x5b\xae\x10\x38\x0c\xa8\x6b\x7c\x68\xaf\xd3\x95\x48\xcc\xa6\x90\x75\x3f\xc0\xd8\x4b\xa0\x0d\x2e\x7d\xaa\x39\x8c\x52\x87\x87\x0e\x13\x96\x40\xc0\x2c\x1a\x82\xc5\xf2\x52\xb3\xba\xdc\x01\xac\xd7\xe1\x02\x6a\xe2\x69\xef\x1c\xaf\x1a\x37\x82\xda\x34\x4b\x87\x78\x39\x18\x7f\x8f\xd2\x88\xd2\xe2\x2c\x4b\x33\x8c\x55\x09\x93\x62\x20\x5e\x98\x44\x84\xf8\x80\x27\xec\x23\xe4\x79\xe6\xdf\x5e\x3c\xff\x76\x36\x9b\xbe\x12\x89\x78\x03\x53\x11\x56\xe0\x08\xdd\x2e\xc4\xe3\xa1\xbf\x3d\xa5\x60\x13\xb2\x8c\x78\xdd\xaf\x76\x95\xcc\xce\x9f\x80\x24\xc6\x61\x10\x8d\x72\x8a\x15\x29\xab\xa2\x97\x76\x37\xff\x11\x9e\x43\x45\x61\x5e\x7f\xd4\xad\x3f\x7a\xb3\xf9\x66\x53\x3e\x8a\x05\x7c\xa1\x18\xf5\x16\x55\x56\x0d\xea\x10\xa7\x96\x4e\xa8\x6d\x0c\x35\x9a\x96\xc4\xaf\xa6\xc8\x44\x23\xb9\x4e\x20\x0e\x50\x0a\x36\x69\x40\x0f\x72\xaa\x3c\xd0\x2a\x06\x37\xf9\x0c\x44\xa1\xb8\xb0\xe4\x3b\x4e\x0b\x34\x3c\x41\x1f\x21\x34\xfa\xec\xd2\x61\xa9\xc0\x19\xda\xe1\xc6\x78\x84\x10\x91\x6d\xc7\xd0\x05\x0c\xf3\x9c\xd1\x28\x12\x88\xe9\xf3\x91\xfd\xa4\xa2\x84\xa5\xbb\xf8\x38\x80\xbe\x8d\xf2\x57\xb2\x6b\x42\xcd\xd8\x9f\x7e\x52\x38\xbf\x7a\x48\x56\x3b\x00\x97\x09\x5f\xc2\xfa\xd3\x62\x00\x38\x23\x40\xef\xe2\x16\x7b\xfb\xa5\xcb\x40\x52\xa1\x19\x96\xcb\x07\x6a\xa1\x72\x3d\x6c\xac\xf8\x6f\x7d\x1a\x98\xfc\x01\x49\x12\x6e\x72\x8c\x36\x89\xfd\x0c\x85\xfd\x82\x94\xfb\x2a\x41\xf1\xf9\x8b\x26\x76\xa8\x45\x42\x6e\xde\x25\xf4\xc4\x9f\x2b\xad\xd8\xa5\xdd\x3e\x4a\x50\x23\x42\xcd\x21\x3e\x12\x44\x0c\x18\xab\x0f\x17\x3d\x35\xca\xd3\x6d\x06\x6b\xfa\x54\x4d\x55\x24\xde\xfd\x3d\xd1\x00\xa5\x46\x53\x4c\x76\xde\x06\xf1\xb0\xa0\xb5\xfe\x04\xea\x39\x4b\xca\x24\x6f\x88\xba\xef\xd8\xb4\xea\x79\x00\x75\x2e\x29\x84\x4b\xf1\x49\x66\xe1\xb4\xa1\x9f\x89\x94\x17\x05\x6d\x70\x79\xde\xc0\xd3\x80\x28\x51\x52\xb9\x68\x98\xb1\x82\xed\x3b\x74\xdb\xcb\x84\xb7\x6e\xb1\xd3\xd6\xea\x08\x5a\x0a\xc1\x61\x71\x35\xb0\x9a\x80\xde\x33\xf8\x4f\xf7\x6e\xf4\x39\xe2\xf4\xc3\x68\xe4\x48\x4c\x9d\x16\x62\xc2\x77\x07\x7a\x2a\x68\x61\x20\xcb\x60\x3d\x0e\x6a\xc3\x98\xe2\x24\x4f\xd3\x7c\x56\x0b\x4e\x8a\x1a\xd0\x38\x9e\x9d\xa7\xec\xe4\x0b\x50\x1c\x8b\xb4\x13\xbf\xdc\xe5\x95\x35\x71\x91\x93\x8f\xf8\xd0\x5c\x39\x0e\x44\x59\xa8\xa9\x9f\x4e\x40\x08\xa1\x02\x52\x78\x6c\xdb\x4c\x25\x49\x6d\xdd\x30\x21\x17\xd1\x3a\x1c\xfa\x60\xb1\x8d\xf0\x4a\xd8\x07\xea\x1e\x58\xb8\x4a\xef\x10\xc8\x05\x94\xa3\x68\x48\x11\x34\x8d\x0d\x29\xa4\x2e\x58\xef\x5f\x92\xb7\x81\x1a\x9c\xec\xbc\x1a\x16\xdf\xa8\xdf\x8f\xa7\xe2\x75\x55\x39\x99\xd0\x7f\x5b\x4e\x2b\x95\x7b\xc2\x74\x1f\x1c\xbd\x8d\x07\x9b\x0f\x6a\xd6\x89\xa2\x5a\x94\xe2\x99\x5c\x79\xbf\x25\x14\xf5\xe2\x8b\xde\xaa\x96\xa0\xac\x8c\x94\x3a\xd6\xd4\x5e\xd8\x12\xcd\x08\xd8\xfb\x64\xa0\x51\xbe\x90\x30\xf5\xd2\x1c\x8d\xc6\x3e\x1a\xe5\x53\xe3\xbe\x92\x40\x66\x2d\xb7\x26\x8e\x6f\x6e\x91\xdf\x81\xea\x39\x8d\x00\x47\x0e\xc6\x6c\x16\x8a\x15\x1b\x27\x94\x2a\xd5\x2e\x3d\xa6\xf4\x1a\x6d\xc6\xb4\x2a\x10\x8a\x07\xdc\x0a\x32\xbf\x10\xbc\xaa\x69\xb4\xbc\x8a\xb5\xc2\xf4\x01\xbe\x3b\x23\x46\xa1\x23\xb2\x30\xb5\xbe\x84\x74\x88\x7a\x69\x36\xab\x56\x85\x08\xa4\x10\xe2\xd3\x45\x66\xae\x70\x12\xc9\xaa\x41\xec\x12\xa7\x39\x9f\xd3\x53\x44\x53\x8d\xea\x6f\x97\x08\x42\x47\x0f\xa1\xff\x9c\x9e\x25\xd7\x4f\x14\x03\x35\xeb\xbd\x87\x85\xa5\xd0\xf6\xde\x43\x25\x5b\xe1\x44\xf0\x65\x62\xbd\xfa\x63\x47\x1b\x7e\x6b\x56\xe8\x7e\x94\x0a\xa6\xa6\x5b\x69\xa5\x5d\x7e\x9b\xfc\x16\x3e\x55\x89\x12\x6a\xbd\xba\x9d\xd9\x0d\xcc\xd4\x48\x2d\x0e\xe0\x43\x77\xfb\xa7\x04\x52\x80\xef\x6f\xd7\x66\xf1\xf5\xac\xc6\x94\x64\x2d\xda\xbb\x45\x6c\x00\xca\xf6\x7f\x83\xfc\x92\x8f\x03\x58\xbe\x93\x71\x42\xcf\x04\xe8\x29\xc7\x28\xcc\xe2\x6f\x94\x13\x16\xea\xef\xaf\xe2\xe1\xd7\xd7\xd3\x70\xed\xb8\xb6\x86\xee\x65\xaa\x2c\x4a\x9d\x37\x93\x13\xdc\x93\xe8\xb4\x27\x18\x86\xfe\xa1\xf9\xa6\xc3\x5a\x4c\x24\xdf\x1b\x47\xab\x06\xa2\xc4\x3e\x2a\xc3\xc7\x0c\x97\x94\xd3\xf4\x5e\x25\x93\xc3\x54\x36\xa3\x38\x33\x5c\x0a\x9b\x6d\x57\xc9\x86\x0d\x4b\xb0\x9e\xd6\x8c\x44\x6e\x0f\x4c\xf7\xa5\x57\xf5\xc2\xa6\x50\x2e\xbd\x54\xa7\x2f\x38\xaa\xee\x41\x8f\x8b\x22\x5f\xb4\xc3\x50\xe0\x38\xad\x2f\x43\xca\x69\x1d\x8f\xb1\x33\x13\x28\xc6\x8d\xe3\x69\x26\xad\x6f\xf3\x52\x1c\x8b\x66\x4f\x9c\x5f\x36\x85\x4f\x9e\x6f\x14\xf9\x6f\xa4\xdb\xb4\x9d\x15\x70\x56\x09\xce\xa5\xaa\x05\xd9\x5b\x58\xf3\x85\x2c\x52\xc5\x38\xf7\x67\xb2\x84\xad\xdb\xbb\x7b\x7f\x55\xf2\x55\x7a\x95\xab\x22\x9a\x4e\x1c\x47\x89\x1b\xa4\x23\x35\x4f\x89\x49\x08\x72\x37\x30\xfb\x1c\xac\x27\x92\xf3\xe4\x1b\x85\xab\x46\x3b\x76\x59\xf0\x3d\xf9\x5e\xa7\x57\x76\x08\x47\xb1\xa0\x3a\x01\x38\x64\x89\xff\x3c\xfa\xee\x25\xec\x25\xd1\x56\x97\x9c\xdd\x10\x28\xf9\x38\x83\xe0\x3f\x46\x64\x09\x7e\x9c\xd4\xd8\x66\xab\xde\x7c\x9b\x26\x13\x72\x50\xc4\xbc\x5b\xfe\x78\x30\xee\x70\xce\xb8\x1c\x2c\xb6\xd4\xf4\x5a\x18\xc9\x21\x9f\x58\x5b\xc3\x6e\x10\xb9\xcb\x9a\x5a\x19\x38\x4f\x17\xf6\xc8\xd7\xdf\x3d\x97\x76\x8b\xaf\xbf\xfb\x46\x59\x30\x44\x41\x0c\xa5\xf6\x12\xfd\xa0\xa1\x9c\x7e\x21\xf6\x59\xa0\x83\x98\xe0\x3d\x1d\xd8\x74\xa6\x7a\x86\xb3\x38\x74\x17\xf1\xa4\x10\x5e\xe5\x19\xee\xa1\x5f\xea\xee\x83\xfa\x0e\xad\x7c\xc0\xa4\x33\xe1\x37\x92\x8e\x4f\xd8\x23\x65\xcf\xed\xee\x7d\x0b\x79\xcf\xec\xc2\x44\x24\x13\x6d\x6f\x85\x03\xca\xd6\x76\x31\x7a\x0b\xfa\x73\xbf\xe5\x3b\xe5\xab\xf3\x64\x14\x07\x61\xb2\xbe\x0e\xb2\xec\xa5\x2f\x6a\x90\x8b\x3d\xf1\x63\x2f\x05\x17\x4f\x08\xdd\x97\x45\x3c\xf1\x87\x02\x8c\xfd\x62\x27\xf1\x28\x2e\xfc\x37\xf6\x40\x42\xde\x64\x4e\xbb\xfa\xaa\xaf\x0a\x35\x73\x48\x52\xbd\xc4\x52\xbc\xe5\x52\x2f\xb8\x8e\x4a\xf1\xe1\x62\x16\x20\x09\x82\x0d\xed\x16\x8c\xf1\xf5\x67\xbc\x0c\xf3\x6a\xec\x6b\x98\x65\x2a\xbb\x2d\x4e\x01\xaa\x59\x78\x7e\xbe\xc5\xe6\xe0\x54\x00\xc1\x34\xc5\x53\xa4\x70\xb3\x56\xdb\x1c\x36\x82\xb5\xda\x9a\x37\x90\x90\xec\xda\x67\xc5\x8e\x2d\xe3\xd8\xb3\xf5\x75\x19\xb1\xa3\x5d\xc2\x36\x68\x09\xa3\xbd\xd0\xd0\x8f\xe2\xea\x33\x8b\xa3\x0d\xf8\x73\x51\xca\x56\x1c\x4e\xd6\x32\x5f\xa7\x67\xaa\x93\x89\x5d\x91\x87\x8b\x38\x8d\x37\x82\x0b\x2f\xc7\x3c\xe0\x85\x38\x4a\x92\xab\x21\x45\x94\x14\x73\x5d\x8c\x6e\x98\xd3\x6e\x9c\xb1\x88\x24\xc9\xa1\xdb\x23\x33\x09\xff\x9c\xf4\x29\x5f\xe1\x20\x88\x64\x10\x3e\x6b\xfc\xb2\x3a\x7d\xe4\x93\x1f\x2d\xe2\x0c\xe9\x09\x1b\x7c\x9d\x6f\x02\x3d\x5a\x37\x86\x92\x22\x8f\x50\xde\x89\xaa\xa2\x42\x53\x95\x81\x00\x40\x0a\x52\xd6\xf8\xc5\x33\x41\x9e\xdb\xda\xd2\x63\xdc\x36\x37\x93\x9c\xfe\xa5\x7c\x74\xe6\xae\xf3\x05\x50\xa0\xa1\x15\x90\xca\x73\x85\xe9\x2c\x89\x47\x83\xa3\x78\x66\x6e\xc7\xc0\x07\x5a\x91\x29\x23\xb7\x78\x4b\xcd\x28\x98\x06\x70\xf1\x60\x5c\xd5\x3b\x4d\x42\x40\x96\x5e\x1b\x40\x9a\x4a\x54\xc5\xcd\xf3\x28\x0f\xe9\xa3\xee\x8e\x6b\x41\x82\x60\x9c\x06\x8f\x06\x03\x05\xee\x9f\xd6\xee\x3b\x12\x2c\xb8\xb8\x44\x48\xab\x32\xf1\xe4\x2f\x64\x37\x11\x2b\xa9\x1e\xe9\x75\x63\x96\xa0\x16\x5b\x8b\xb8\xd3\x18\xb5\x88\x32\xc4\x0a\x52\x10\xe9\x5d\x72\x4d\xdd\x88\xef\x98\x20\x4f\xea\xc5\xc5\xdd\x90\x64\x96\x62\xb5\xee\xbf\xd1\xbb\xb0\xc2\x80\x71\xd7\x65\x7b\xd0\xb0\x01\xc7\x38\x01\x65\x4a\x31\xeb\x65\x57\x83\xda\x6c\x30\x18\x17\xb2\xd6\xab\x58\x72\x7e\xa0\x58\x28\x62\x96\x9b\x13\x71\xde\x20\x40\x1e\xa1\x48\xc6\x57\xdd\x50\x8e\x68\x61\xfd\x46\x0a\x6b\x90\xd6\x90\x87\x10\x5d\x82\xe0\xf5\x9a\x99\x41\xbb\xa5\x43\xb1\x5d\xea\xd3\x76\x49\xec\x9b\x50\xab\x6a\x88\xbd\xd7\x26\xa4\xd7\xe4\x11\x61\x73\x66\xc1\xfc\x4e\xc3\xcc\xa2\xde\x46\x1e\x83\x4e\x14\xcd\xe2\xc1\x06\x99\xdc\x72\x51\x48\x7a\x9e\x62\xa4\xb9\xec\x14\x34\xde\x79\x8c\xd6\x95\x86\x93\xf6\x3a\x4a\x46\x2c\x8d\x82\x73\x01\x16\x96\x34\x13\x51\xb2\x58\x4a\x04\xbc\xbb\x8c\x59\xc2\x59\x26\x2c\xc2\x78\xc2\x73\x0c\xa9\xe8\xe8\x94\x66\x47\x37\xe3\x5e\x3a\x92\x21\x9f\x6a\x52\xeb\x7e\x3c\x49\xc6\x14\xf8\xe9\x1b\x2c\x53\xab\x9f\xe0\x29\x83\x1e\x2e\xee\xae\x8c\x05\xe9\x52\x59\x8d\xa0\xbd\xc7\x2f\x38\x35\x67\x32\x3c\x57\x01\x09\x6d\x14\xa3\x1b\xbc\x15\x15\x4f\xf8\x86\x13\x15\x3c\x77\xb3\x24\x7a\x89\x22\x80\x0a\x13\x35\x95\x0d\xac\x28\x06\x13\xb1\x1d\x44\x74\x41\x31\xce\x28\x6d\xb6\x13\xc9\x07\x80\x58\xd7\xd5\x4b\x02\xb5\x05\xc0\x6c\xe9\x1b\x32\x69\xd6\x25\x28\xf5\x79\xd6\x95\xea\xa1\xfc\x9e\x08\x9b\x00\x9f\x18\xea\xe9\x2c\xbb\x27\xeb\x9e\xde\x6d\x52\x78\x4a\x4c\x33\xd1\xd8\x9c\x41\xa1\x01\xc4\x6c\x2e\xa0\xb0\xf3\xd5\x53\x75\xf6\x88\x31\x33\xc7\x1d\x39\x78\x25\x83\x07\x89\x73\xf3\x79\xa4\x34\x1b\x27\x57\x54\xec\xc1\x66\x90\xe4\xb3\x78\xca\xe6\x76\xe1\xe2\x99\x81\xb2\xde\x3f\x14\xb1\x62\x75\xfe\x38\xca\x2e\xc2\x7a\x43\xf7\xba\x29\x78\x15\x53\xc9\x0d\x13\x34\x95\x58\x4f\x70\x5f\x05\x9d\x6d\x7b\x49\x4c\xf2\x6f\x30\x68\x58\x2c\x00\xac\x65\x65\x39\x1e\x78\xd9\xc7\xa6\x81\xd5\x22\x49\x6f\x61\x61\xf7\x31\xd2\x7f\xef\xe2\x93\xb0\x9c\xcd\xc3\xe6\x19\x7a\x37\xfa\x8c\x80\x0e\xab\x9d\xa1\x26\xd9\x7c\x58\xde\x83\xa2\x58\xa1\x07\xdd\x59\xe8\x08\x29\xde\x95\x7a\xb8\x0b\x48\xa9\xac\x39\x05\xec\xee\xc4\x3a\xbe\x7a\xe8\x22\x6d\xce\xea\x85\xa4\xb3\xa0\x08\xd6\x97\xd1\x84\x8b\xc5\x0b\x1c\x2e\x52\x2b\x61\x27\x9e\xe5\x43\x8e\xc4\xc2\x6b\xc0\xd6\x80\x35\x8c\x9a\xe1\x66\xb6\xed\xe5\x44\x43\x49\x2c\x15\xec\xce\x62\xcd\xac\x6d\x73\x63\xd6\x6e\x9e\x59\x47\xc0\x14\xc0\x16\x83\x0e\xcc\x5a\x42\xca\xb4\xe1\x9f\x6e\x89\x80\x69\x37\xf5\x81\x6d\xe1\xf4\x55\x62\x9f\x81\x80\xc5\x92\x75\x2d\x48\x21\xed\xd0\xae\x2f\x9c\xb5\x28\xa3\xce\xd0\x31\x16\xf9\x85\x97\x1d\x71\x06\x01\x7c\x0c\x14\xca\xc0\xe9\x34\x8b\xfb\x49\x4e\xcf\x6d\x34\x82\xa9\x63\xf7\x9d\xe2\xfb\xd6\xd7\x56\x7c\x42\x1d\xfd\xf0\x9a\x05\x3e\xc4\x5d\x4e\x97\x3d\xb4\x8c\x36\x6d\xbc\x25\xc2\xa7\x06\xa0\x9f\xb8\xf7\xda\xed\x2b\x25\x18\x2b\x21\xd4\x97\xcd\xf0\xde\x4b\x1b\x0d\x14\x75\x7a\x80\x77\xa2\xee\xc3\x48\xd8\x42\x78\x43\xd1\x9e\xef\xb3\xf8\x2c\xb9\xa6\x9b\x27\xc7\x41\xed\x86\xde\x22\xc5\x3f\x11\xfe\x39\xa3\xa3\x37\xfc\x33\xc1\x3f\xff\xef\xff\xc5\xbf\xf4\x5e\x29\xfe\xef\x02\xff\xbc\xc0\x3f\x7f\xc2\x3f\xaf\xf1\xcf\xf7\xf8\xe7\x6b\xfc\xf3\x5f\xf8\xe7\xef\x78\x66\x87\xaa\x97\x53\x9f\xd2\x5b\x78\x5a\xe1\xd8\x10\xd8\xab\x78\xcd\x07\x6c\x62\x2f\xbb\x9e\xd3\x4e\x71\x8a\x4a\x51\xce\xc4\xcf\x07\x0f\x83\x0d\x2d\xb7\x10\x82\x21\x96\x27\xb1\xba\x0b\x54\xdd\xbe\x1e\x2f\x90\x65\xce\x86\x50\x32\xaa\x1b\xca\x22\x08\x65\x3b\xde\x68\x77\x54\x12\x85\xbf\x14\x94\xf2\x41\xc0\x8b\xeb\x3b\x80\x1b\x9d\x6d\x7e\x57\x7d\xdb\x8a\x03\x1e\x26\xea\xad\xee\x2d\x8c\xd8\xb1\x55\xf7\x47\xb9\x74\x7a\xf7\x78\x9f\x4c\x75\x50\xe8\xc4\x2b\x44\x39\x74\x38\x60\x16\x39\x64\xf8\x85\x3b\xc2\xa2\x5e\x1e\xee\x03\x19\x89\xa0\xc0\x9a\x3d\xaa\x1f\xe4\xdb\x27\x49\x80\xc1\x16\x98\xc1\x6f\xe0\x33\xbe\xe2\x4d\x7c\x33\xfb\xbb\x8b\xa0\x1f\x30\x68\xa5\x04\xe5\xa4\x4e\x82\x74\x31\x6a\x50\x21\x0e\x49\x8a\x34\x9d\x4e\xc8\x0b\x4e\xe8\xed\xa1\x48\xe3\xad\x95\x50\x03\xe8\xe2\x31\x2d\x78\x22\xa1\x29\x13\x1a\x0a\x60\x76\x9e\xce\xd1\x55\x33\x37\x20\x3a\x49\x03\x0d\x61\x48\x4d\xc5\x8d\x7a\x09\xa3\x52\x34\x48\x7f\x9e\x65\xf1\x84\x5e\xdd\x94\x20\x2a\xa5\x21\xf7\x1f\x7f\xc2\x22\x3a\xdb\xe0\xc4\xcb\x8f\x2e\x2d\x8f\x0a\x73\xe8\x2a\x19\xf0\x40\xce\x6a\x06\x51\xae\xb6\x6d\xce\xa4\xd1\xf3\x6d\xa0\x2f\xb2\x3b\xb5\x51\xac\x76\x75\x9a\x15\xe8\xbb\xc0\xca\x80\xa8\x6e\x63\x0e\xc5\x13\x49\xb6\xec\x96\xc5\xd6\xe9\x2a\x61\x1b\x20\x24\x4d\x43\x3e\xea\xdb\x92\x54\x8c\x7b\x28\x5c\x14\x98\x68\x17\x5b\x6d\x41\x73\x3e\xef\x09\x7b\x34\x4e\x85\x87\x78\x5b\x13\x0d\x72\x43\xbe\xeb\xc6\x4a\x75\xad\x0f\x45\xb5\x75\x53\xaf\x63\x85\xf4\xb5\x16\x19\x21\x6c\x6e\xf5\xe0\x0f\x6e\xae\x64\x5b\xd9\x23\xdf\xb8\xeb\xc3\xb7\xf2\xf1\xa9\x24\xda\x65\xba\xbd\xc4\x4e\xef\x98\x7f\xa3\x35\x8d\x74\x2f\xe6\x53\x18\x77\x18\xbb\xda\xee\xc2\xb1\x76\xdc\x53\x52\x2a\x8b\x45\x18\x01\x53\x00\x4d\x25\x23\x1c\xc1\x04\x8c\x21\xca\x61\x33\x55\x0b\x40\x2e\x47\xa3\x64\x38\xd1\x19\x1d\x91\xf1\x55\x0d\xdf\xe9\x66\xe9\x5b\x22\x7d\x03\xd3\x69\x76\xe9\x9c\x6d\x91\x03\x19\xef\xac\x2a\x76\x4e\x54\x27\x3e\x0c\xd6\x45\xd2\x2e\x3e\x3b\x9b\x8e\xc7\x91\x06\xda\x3b\x61\x12\x54\xa7\xee\x43\xaa\x3c\x8c\x14\x09\x07\xea\x85\xf0\x80\xe2\x88\x4d\xd5\x1a\x81\xb5\xe6\xf3\x33\xf3\x81\xba\xe9\x50\xec\xf1\x84\xd1\x3c\xbe\x9e\xa6\x13\xe1\xcc\xc4\x4d\x8f\x8e\xdc\xe7\x24\xac\xeb\x0f\x36\xba\xda\xd6\xc1\xbf\x68\x28\xee\x46\xa9\xc1\x78\x02\xda\xa2\x7b\xfb\x92\x97\x98\xf0\xb0\xc6\x47\xbe\x62\x8d\xfc\x07\xc0\xcd\x90\x53\x1d\x00\x45\xdc\x41\xa4\x82\x39\xcc\xd8\x39\x68\xa0\x02\x29\x4c\x58\x18\x05\xc5\x55\xdb\xbc\x2a\x79\x58\x1b\xb2\xda\xe4\x78\xb7\x51\xfd\x81\xa1\xd2\x7c\x6e\xb1\x4b\xfe\x86\xc9\x7f\xa8\x15\xf1\x9f\x2d\xc2\x3f\xfd\x38\xfc\xd9\x22\xfc\x2c\xa2\x84\x48\x48\xdd\x84\x6b\x37\xe1\x6f\x8c\x24\xec\x53\x35\xaa\x45\x10\x86\x3a\x1b\x63\x14\x6d\x44\xc6\x44\xb1\x5c\xd7\x6c\x84\x7d\x86\x90\x8d\x3a\x1a\x87\x2e\xec\x80\x57\xae\x87\xac\xdd\x79\x7c\x4c\xb6\x16\xb4\x3f\xf7\xf0\x77\xa3\xbd\x14\x23\xc5\xc7\xed\x3d\x3f\x27\x7e\xcf\x39\xe1\x2c\x52\xb4\x0a\xe8\x8e\x73\x33\xdb\x96\x97\x9e\x20\x80\x28\x20\x5f\x22\x36\xf7\x8a\x83\xd4\x9a\x9c\xc6\x2f\xc6\xd9\x03\x28\x8c\xc3\x9a\x3d\x7f\xf9\x22\x62\x14\xa7\xb6\xad\xa9\xb1\x87\x4c\x14\x9e\xb8\x86\x33\x5a\x7f\x9e\x95\xa1\x6d\x71\xb4\x2d\xaf\x02\xa8\xb8\x69\x62\x3c\x49\xb9\x8c\x09\x22\xaa\x88\x98\xd1\x14\x9c\x9e\x67\xca\x90\xef\xdc\xf6\xfd\x4e\xcd\x6d\x21\x43\x80\x7b\x94\xe0\x98\x8d\xcb\x9c\xec\xa4\xfd\x1c\x18\x78\xa4\x7a\x4a\x74\x99\xbd\x40\xaa\x41\x08\xd8\x85\x0e\xfc\x07\x5c\xec\x54\x9c\x1f\x36\x6a\x68\x3b\x1d\x0f\x23\xb9\x07\xd5\xda\x35\x36\x45\xf9\x31\x3e\x14\xcb\x3f\x86\x33\x33\xf9\x8f\xb4\xab\x66\xb0\x21\xb5\x11\x58\x4d\x70\xe7\x93\x6b\x99\xb9\x81\x3e\x24\xb5\x9a\x4c\xb3\x29\x14\xc3\xfa\xcb\xa0\x55\x3c\xbf\x9a\xc3\x76\x54\x28\xed\x96\xea\x5a\x50\xd0\x0f\xad\x72\x82\x16\x2c\x2b\x9e\x08\x96\x9c\xe3\x40\x16\xdb\x04\xa4\x98\x1b\xeb\x05\x26\x7a\x5e\xa9\xd6\xdb\x0d\x42\xcf\x40\xef\xb9\x44\x60\xcf\x57\x91\xeb\xe8\x69\x51\x3e\x7b\x36\x19\xc4\xd7\xdf\x9d\x85\xb5\x26\x7a\xb9\x08\xf7\x2d\x58\xca\xcf\xd8\x8b\xbf\xb2\x63\xfd\x2c\x43\x95\x46\x0b\xa9\x47\x3e\xc4\x31\xf5\xcd\x46\xe1\xf4\xef\xad\x40\x28\xaa\x54\x34\xc9\xaa\x69\x11\x96\x73\xcb\x06\x60\x4b\x29\x4c\x99\xb7\x75\x53\xc0\xcd\x7e\x5b\xaf\x64\x6a\x15\xda\xc4\xea\x3c\x55\x81\xa3\xc3\xaf\x17\x4a\xba\x87\xc3\xf6\x29\xda\x7d\x7b\xda\xb1\x96\x33\x85\x3c\x54\x3d\xa0\x8c\x23\x4e\xe7\x69\x5d\x59\xc8\xd2\xa6\x56\x82\x45\x39\xf3\x4d\x44\x9b\xcf\x50\x4e\x7e\x11\xd1\x44\xcd\x3b\xe5\xb6\x8b\xd1\x97\x06\x03\xb9\xa3\x50\x4e\x48\x42\xe5\x12\x21\xf8\xc4\x69\x9b\xae\xdc\x56\xa9\xa9\xd5\x42\x27\xc5\x16\x62\x6f\xf3\x89\x4e\x7a\x4e\x55\x93\x55\xdd\xeb\x7a\xf8\xc9\x14\xe3\x53\xa4\x2a\xb4\x5a\xd5\xf5\x31\x49\x8b\x94\x75\xc5\xa3\xc3\xc2\x2c\x91\x54\xac\xbb\xc3\x5c\x85\x04\x61\xca\xd7\x97\x35\xe2\x80\xc2\xa9\x5d\xa9\x15\xcd\x5d\xae\xa9\x7d\x85\xc0\xa6\x35\x85\x62\x16\xf0\x3f\x18\xb0\x3d\xfa\xd4\x4b\x58\x5f\xd1\x63\x61\x1e\x3c\xeb\x9e\x72\xca\x01\xbb\xcb\xc1\x4d\xaf\x2b\x02\x0c\x75\xf2\xbe\x16\xfc\x32\xc2\x49\x2f\x3b\x87\xf6\x7e\xd7\xb2\xed\x9c\x52\x07\x6e\x86\x8f\xba\xe1\xf1\x3f\xde\x9f\xd4\x1f\x85\xc7\x5f\x7e\xf5\xf0\x1f\x27\x75\xfc\xb5\xfe\x66\x23\xa0\xa4\xdf\xff\x07\xfe\xd3\x82\xff\xbd\x19\xac\xc3\xdf\x06\xfe\x6a\x6e\x3c\x12\x5f\x18\xab\xec\x0f\x00\xb0\x99\x14\x4c\x47\x62\x69\x0b\x9c\x90\x25\x3d\xb6\x7d\xbf\x2e\x1c\x98\x5d\x9b\xa0\x6c\x1d\xb5\x0d\x12\x5b\xf8\x7e\x65\x39\x51\xa6\x79\x96\xa5\xe3\x27\xd2\x67\x40\x9a\xb4\x34\x82\x74\xd9\x8a\xf7\xed\x72\xd7\xcb\x96\x93\x51\xe4\x74\xc1\xbf\xdd\xa1\x20\x7c\xfc\x30\x9d\xda\x57\x20\x24\x9a\x61\xd7\xb2\xf9\x15\x9f\xb7\x46\x4c\xdf\x6b\x1b\xd4\xd4\x2e\x1d\x2f\x53\xfa\x6b\x29\xf6\x93\x68\xe4\x96\x3f\x5b\xa6\xfc\x37\xc9\x75\x3c\x70\x4b\x66\x8b\x4a\x86\xd7\xdc\xac\x76\xed\x37\xa9\x51\xc9\x7a\x5d\x57\x52\xaa\x73\x79\x0b\xab\x67\x13\xd0\xd6\x86\xd1\xb4\x10\x15\x3f\x7b\x28\x5e\x6f\x2c\xe8\x5d\x9e\xb0\xb1\x9e\x10\x9e\xd2\xe2\x2c\x0f\x32\x02\x79\x81\x6e\xeb\x74\x80\xf7\xb6\xc4\x39\x83\x5b\x15\x66\x9d\xce\x67\x7d\x6d\x6d\xa7\x1b\x6e\xa7\xd2\x9f\x01\x4b\x14\x1d\x4a\xc5\x3b\x11\x74\x6a\xf1\xc3\xeb\x27\xf2\x66\x82\xfb\xe0\x12\x8f\xcc\x8a\x2e\x15\xc6\x88\xac\xeb\xb4\x82\x8b\x8a\xda\x41\x03\x7d\x4a\x61\x6f\xca\xef\x6a\x0a\x02\x51\x57\x85\xca\x9f\xb2\xd7\xaf\xd4\x48\x45\x14\x37\x77\xc0\x70\x53\x44\xf0\x0d\x88\xb0\xbf\xc7\x51\xb6\x34\x16\x55\xa0\x88\xea\xdb\x74\x9e\xe5\x4b\xe3\x21\xe8\x22\x92\x17\xb0\x0e\x26\x79\xdc\x4f\x27\x83\xe5\x71\xf1\x42\x3e\x94\x93\xf9\x2c\xbe\x0b\x36\x82\xf7\x20\x4a\x27\xb3\xf3\xe5\xd1\x20\x74\x11\xc9\xd1\x1d\xdb\x76\x54\xd6\xac\xd7\x14\xb7\x62\x19\x2c\x08\xe9\x2f\xff\x0e\xc4\xd0\x77\x67\x67\x39\xde\xaf\x2e\xc7\xd4\xb2\x8a\xd2\xf2\xf7\xdd\xd9\x12\x55\x4b\x48\xa7\xea\xbc\x62\xe0\xcb\x99\x7d\x6a\x1e\x56\xca\xf5\xe0\x67\xb3\xaf\x79\x5a\x7c\xf0\x8c\x63\xf7\xcf\x89\x72\xe4\x37\x4b\xe3\xae\x9c\x2e\x65\x15\xa8\x42\x4b\xd7\x52\x3e\x93\xca\xaa\xa0\x12\x4b\xe3\x5f\x38\xc9\xca\xaa\xe1\x05\xef\x50\x5b\xf9\xfc\x2b\xaf\x88\xca\x2c\x5f\x47\xe9\xd4\x2c\xad\x01\x4b\x2c\x8d\xbf\x6a\xd6\x96\xd5\x70\x74\x47\x3e\x95\x4e\x68\x6f\x05\x08\xbd\x08\xf5\x3d\xfb\x84\xd1\x46\xa2\x8e\xe3\x75\x82\xbb\x60\x12\xb8\xf2\x34\x10\x46\x73\x7c\x2c\x3a\xa6\x97\xc5\xf1\xcc\x46\x47\xe5\xd5\xb7\x09\x48\xb3\xc0\x45\xcf\xb6\x8e\x0f\xd4\xfb\x80\x23\x91\x09\x4b\x35\x1e\x0e\xa7\x24\x79\xc2\x01\x68\x13\x6d\xd7\x07\x8f\x16\xf2\x0d\x2c\xf9\x25\x02\x6f\x88\x84\x47\x98\xd0\x85\x04\xd3\x40\x56\x3d\x9d\xef\xda\xb5\x93\x27\x89\x54\x0a\x04\x01\xd2\x79\x11\xd3\x42\x59\x09\xbd\xdb\xe0\xa5\xc0\x5b\x8d\x22\x1b\xf2\x1b\xc1\x85\xbf\x2e\x5e\xcb\xba\x6c\xf3\xc5\xd2\x35\x50\xf8\x98\x50\x78\x02\x00\xaf\x9c\x6b\xc9\x52\xe3\xa1\xd6\xce\xf0\xad\x24\x4c\xb0\x1d\x30\xc9\xe9\x65\xe6\x3e\x09\xac\x1c\x05\xc4\x4b\xc9\x33\xcf\x7b\xca\xf7\x43\xd1\xb3\xa1\x38\xd7\xff\x03\xd6\xfd\xff\xb3\xf7\xf6\xcd\x6d\xde\xc6\xa2\xf8\xff\xf9\x14\x8f\x75\x6f\xce\x90\x16\x49\x93\xb2\x9d\x26\x92\x65\x8f\xe3\xb4\xa7\xbd\xe3\xa4\x9e\xb8\x39\xb5\xa3\xaa\x9a\x87\x2f\xb2\x68\xf1\xcd\x24\x25\x93\x6e\x3c\x73\xce\xcc\x99\x7e\x82\xfb\x4d\x6e\xef\x5f\xfd\x0e\xc9\x57\xfa\x61\x5f\x00\xec\xe2\xe5\x21\x29\x25\x3d\x3d\x73\x7f\xed\xc4\xe2\x03\x2c\x16\x8b\x05\xb0\x58\x2c\x16\x0b\x3a\xde\x67\xef\x4a\xa7\x2a\xed\x23\x84\xda\xed\x63\xfb\xd1\x31\x2a\xb9\x97\x8f\x2c\x09\x31\x39\x15\x15\x35\xd2\xe8\xc3\xa3\x1e\x40\x90\x67\x29\xaa\x7f\x29\xb6\x06\xb7\xb7\x9d\x1e\x29\x54\x38\x6d\x4d\x30\x09\xba\x97\x49\xb3\xf4\x40\xa0\xf4\x9d\x09\x67\x06\x41\x24\xf5\xae\x01\x70\x74\xb8\xd6\x24\xaf\x82\x87\x4a\xad\x6f\x1d\xfd\x8b\xe3\x9a\x8e\xa3\xed\x28\x3f\x12\x19\xd6\x91\x01\xff\xca\x0c\x18\x40\x3c\x8e\x64\x32\x0d\x6f\x37\x3d\x15\x2a\x0e\x9f\x80\x7f\x8f\x3e\xd1\xcc\x20\x10\xfa\x1d\x4a\x0f\xe4\x0e\x02\x70\x5b\x81\x3d\x96\x62\xc7\x5c\x48\xb4\xd4\x26\x31\x60\xa6\xc0\xc0\x2d\x48\xc2\x42\x9e\x00\x75\xad\x4a\x02\x53\xae\x00\x57\x2d\xf5\xdd\x6f\x5f\xef\xb0\x3c\x4e\x39\xf5\x68\xcc\xfa\x3e\x74\x68\x29\x8e\x64\xc8\x2f\x37\x10\xfb\x62\xf4\xf8\x27\xdd\x90\x3a\x1a\x8b\x97\xf5\xd6\xd9\x8d\x07\xa2\xd8\xf3\x00\x0f\x5a\x6b\xa3\xee\x24\x98\x5d\x53\x2d\x77\xce\x66\xae\x8d\x58\xb6\x6f\xf6\x29\x98\x7d\xe4\x72\x5b\x76\x89\xaf\x89\xb5\x22\x90\xa2\x1f\x1b\x21\x5f\xb9\x57\x45\x2d\x2d\xa1\xc2\x21\x50\x4b\x6c\x81\xf0\x61\x4e\x31\x12\x42\x84\x41\x27\xc6\xc5\xb1\x10\xbb\xd2\x78\x36\x2c\x44\xd3\xe0\xbb\xe5\x66\x8f\x82\xd2\x33\x87\x20\xdd\x48\x94\xd0\x7d\xe9\xf2\xb8\x81\xb3\xb8\xf8\x22\xbc\x5c\x90\x0e\x06\xf7\x1b\x45\xdb\xb1\x77\xbd\x81\x2b\x0d\xd7\x54\xde\xd2\xf8\x04\xda\x94\x86\xfd\xb1\xde\xa5\x3b\xbe\xb2\x0b\xb1\xc7\x77\xa3\x6e\xe0\xa2\x4d\x72\x88\xd4\xdd\x60\x48\x5a\xe8\x01\x96\x64\x6b\xd8\x07\x00\x97\xeb\x82\xdf\x9f\xbf\xa6\x21\x9e\xe5\xbb\x9e\x02\xd8\xa1\x72\x58\xcb\x07\x6b\xd8\x95\x88\xd5\x11\x2c\xd8\x2c\x1c\x53\xf4\x46\x0d\xdb\x88\xa3\x23\x91\x05\x0e\x40\x9f\x0d\x1e\x80\x3b\xd2\xe7\x9f\x3d\x18\x3c\xf4\x4e\x66\x27\xc5\xde\xc2\x08\xcf\x12\x3d\xca\x20\x1e\x30\xfd\x5a\x5e\x0d\x16\xfc\xf3\xfd\xa0\x3f\x71\x1f\xcb\x0b\xb3\x9f\xe0\xdf\xe7\xf3\x21\xff\x5a\x94\x86\x66\xf8\x9d\x8a\xfc\xd0\x07\xef\x69\xe7\xa8\x04\x67\x25\xbf\x02\x9f\x24\xbf\x4c\x08\xa7\x55\x66\xca\x89\x29\x73\xba\xf5\x60\x2e\x8a\x5a\x4e\x52\xd4\x73\x23\x49\xb0\x11\xcd\x1f\xe0\x76\x05\x7a\xcd\xaf\x2a\x74\xb1\x0d\x03\x77\xd3\xd0\x15\x3d\x6a\x0b\xde\x75\xf5\xe5\x06\xb3\x9c\xaa\xf1\x88\x71\xe4\x07\x44\xab\xc1\x13\x8e\x4d\xc6\x0f\x6f\xfa\x97\x6b\xdf\x6e\x78\xbc\x89\xf9\xb2\xc6\xcb\x4e\xf6\xc8\xe6\xa3\xf6\xc9\x3d\xa1\x52\x7b\x0b\x8c\x26\x61\x7b\xa6\x25\x96\xfe\x18\x90\xe7\x8f\x03\x56\x93\x27\x2a\x40\x64\xee\x9d\xe6\x26\xd1\x3f\x98\x27\x47\x62\x25\x53\xd2\xe3\xfd\x60\x70\x29\x48\xa0\x69\x14\x02\x2c\x22\x88\x58\x6c\x20\x5c\x20\x63\x18\x36\x29\x66\x00\xde\xc9\x19\x5d\x80\x92\xc3\x1d\x9b\x75\x6c\x32\x70\x1b\xfd\xe9\xe0\xf5\x71\xda\x48\x58\x87\x3a\x4e\x69\x48\x10\x9d\xed\x9d\xed\x54\xc9\xa5\x2c\x35\x1b\xcc\x87\x53\xe9\x85\xc7\x09\x02\xed\x7a\x21\xd1\xae\x7d\xd6\xe2\x62\x3a\x87\x4e\x15\xf9\x2e\xc9\x01\x8d\x61\x11\x12\x10\xf4\xad\x71\x7c\x1d\xc0\x88\xc4\x23\xbd\x2f\xb0\xa2\x87\x0c\xd1\xb5\xe5\x60\x3c\x1b\x45\x63\x10\xbd\xa5\x39\x47\xdd\x40\x89\xee\x26\x05\x03\xd8\xc6\x02\xe3\x57\x7c\xc0\xa5\x6f\x88\x7e\x21\xce\xb5\xaf\x87\xef\xab\x9f\x1f\x85\xbb\xa2\xfd\x7d\x38\x36\x9e\xc4\x5b\x34\x47\x47\xe2\x12\xf0\xaf\xc2\x8b\x71\x54\x33\x5f\x5e\xb4\x05\xdd\xd5\xcb\xa1\xde\xbf\xb1\x9f\xde\x4c\x08\x64\x3e\xcc\x2f\xfb\x8b\x93\x9e\xe4\x01\x87\xd9\x37\x44\xd6\x4f\xeb\xde\x3d\x24\x07\x13\xd7\x72\x1e\x55\x62\x6a\x38\x25\x0c\xe7\x2c\x76\x67\x22\xf2\x01\xdd\x68\x05\x07\x91\x27\xe0\x32\x07\x07\xa5\x6d\xf8\x77\x16\xe0\x96\x0d\xee\x05\x79\xc0\x71\x3c\x68\x96\xc9\xf1\x75\xc0\x9d\xb8\xc6\x42\x87\x4b\xd0\xb5\xb8\xbd\x68\x77\xca\xcf\xa9\x44\x91\x09\xa8\x58\x38\x5c\xfa\xc5\xb1\xea\x46\x08\x59\xfb\x85\x8d\xb0\x4b\xff\x1b\xbb\x20\xff\xf4\x3f\x88\x8a\x2a\xbf\x7f\x1b\xe4\x7f\x1d\x7c\xbf\x0c\xbe\x9f\x07\xdf\xdf\x8b\x2b\x4c\xd8\x10\x1a\xb7\xce\x86\x84\x91\x19\xe0\x3e\x02\x73\xa7\xc1\x1c\xf0\x6a\x25\xfc\x8f\x9c\x1f\xcc\xe8\x60\xf6\x04\xa1\xae\x64\x48\x0e\x02\xde\x9b\x61\x60\x23\xb3\x5d\xea\xb7\x7e\x0b\xf5\x99\x7f\x3f\x2d\xd0\x6b\xbb\xdf\x9a\x99\x65\xb4\x73\xa0\x77\x3f\x38\xbd\xbf\x47\xc8\xef\x0b\x11\x5e\xc8\xee\x55\xf0\x62\xb2\xdf\x17\x35\x0a\x61\x9e\xa9\x71\xe1\x27\x12\x82\x5c\x40\x71\x12\xd7\x82\x96\xec\xbd\x75\xc4\x45\x3b\x89\x96\x51\x7d\xe0\x4c\xac\xf5\x56\xfa\x35\xed\xbd\xa7\x12\x78\x09\x78\xef\x8f\xfc\x01\x9e\x9a\xdf\x31\x2a\x3d\x5f\xb3\x78\xf5\xbd\xf9\x2c\x98\xab\xe2\x89\x59\xdf\x5a\xef\x0d\xd7\x3e\xc3\xf5\x0d\xd9\xf7\x47\xd0\x42\x52\xfa\xd0\x43\x82\x31\x0d\xc7\x22\xfd\xd6\x77\x39\xc8\xcf\xb4\xe6\xe4\x4c\x3a\x69\x82\xfa\xad\x31\xfc\xd3\x97\x97\xa5\x18\x90\xce\x7e\xa0\x77\x61\x25\x36\x5d\x87\x0f\x56\x15\x3f\x14\x60\xcd\xea\xb7\xbe\x46\x32\xbe\x87\xae\x6f\x23\x57\x5f\xc2\x3f\xcf\xe3\x69\xe7\x7b\x10\x10\x9f\x51\xf4\x23\xbf\x35\x3d\xd2\xd3\xaf\xea\x39\x35\x81\xd4\x8e\xe9\x08\x8d\xba\x94\x9b\x34\x32\x05\xf3\x03\x27\x46\x3c\x45\xde\xea\xc5\x85\x56\x80\x25\xcd\x30\x0e\x68\x11\x2c\x36\x8d\x62\x5c\x04\xb3\xc8\x12\xe5\x1c\xbe\x83\xc5\x82\xfc\x84\x1e\x1f\x17\x63\x37\xdf\xa4\x23\x51\x24\xa9\xed\x4a\xb2\xbf\x1f\x0c\xfb\x5e\x72\x69\x59\x26\x24\xbd\x2e\x5b\x14\xb3\x50\x62\xcc\x17\x27\x4b\x1c\xa0\xd1\xea\x02\x97\x92\x12\xd8\xe0\x4e\xee\xe9\x51\xb0\x00\xde\x99\xc1\x14\xaa\x81\x34\x9f\x31\x8f\x3d\x67\xeb\xe4\x1a\x95\x68\x71\x10\xb0\xc0\x72\x53\x06\xea\xc0\xdb\xf9\xb2\x95\x29\x34\x81\x68\x67\x90\xb7\x72\x3c\xe8\xf6\xb1\xc2\x27\x82\x9f\xa4\x54\x0c\x1c\xca\xd1\xa2\xe8\x81\xb7\xd5\x37\xc2\x40\x9f\x1b\x4c\x48\x19\x23\x52\x4d\x75\x64\xda\x84\xa4\x67\x21\xd8\x90\x94\x64\x88\x0d\x48\x39\x13\x52\xcc\xd4\xed\xd7\xcb\x1b\x35\x57\x2a\xb6\x1c\x65\x88\x31\x27\x5a\x87\xc0\xb0\xa4\xa0\x88\xb9\x75\x0b\xf3\x32\x89\xc8\xb1\x09\x55\x42\xe7\x28\x35\xca\xc6\x57\xa3\xe5\x30\x1a\x40\xb8\xb1\x48\x67\x7d\x0d\xa9\x7e\x77\xee\x66\x2a\xaa\xeb\xcf\xa7\xd3\xcb\xab\x99\xf7\x25\xaa\xbb\xfb\xe3\xa0\xbf\x7f\x3b\x88\xb0\x7d\x3b\xa8\x09\xfd\x5e\x83\x0b\x64\xb2\x08\x25\xe7\x8b\x3d\xed\x76\xe7\x83\xeb\xca\xba\xdc\xee\x20\x55\x72\xab\x6a\x53\x18\x70\x47\x51\x59\x2f\xed\x39\xc2\x22\x5b\x55\x98\x2e\xba\x6d\x5b\xbf\xae\x28\xbd\x7d\x7b\x19\x0b\x75\xbe\xde\xb7\xc5\x76\x9d\x99\x0a\x08\x95\x1a\x26\x18\xd7\x7c\xa6\x5d\xf3\x1b\x91\x5d\x41\x0e\x32\x56\xf9\x85\xa2\x5b\x6e\xb8\x65\x16\x76\xd7\x49\xdf\x69\x26\xfe\xde\x8f\x55\x61\x9f\x6e\x87\xac\xbf\x09\x4f\x77\x07\xa2\x88\xa7\x84\x8e\xed\xa4\x31\xc2\x2f\xb7\x43\x38\xde\x06\x57\xef\x30\x5c\x2c\x82\xad\x7d\xdd\x42\xf6\x65\xad\xca\x33\x4c\xde\x50\xd4\x4b\x72\xad\xef\x8d\x5a\xa8\xa0\x1c\xd4\x23\x0a\x06\xbf\x10\xde\xdf\xde\x18\x2f\x3b\x15\xe5\x10\xff\xee\xb6\x88\x69\x37\x62\xd4\x8f\xce\x41\xae\x8e\xb7\x37\xa9\xa3\x43\x4f\xf3\x86\xc6\x2a\x6a\xc8\xfd\xb8\x92\xe7\x37\x6e\x88\x76\x95\xca\xe1\x1f\xdf\x1c\x3f\x0d\x57\x8a\x8e\x95\xe6\xd0\xd7\xb7\x20\x9e\x3d\xb3\x72\xa8\x67\xdb\xcd\x2f\x96\x75\x27\xfb\xba\x73\xc1\x6d\xf8\x20\x31\xd3\x5e\xde\x98\xe0\x97\x8a\xd1\x09\x82\xbf\xbb\x11\xea\x84\x29\xd0\x0e\x96\x44\x1d\xef\x37\x5d\xe0\x8d\x4c\xa9\xae\xe8\x1f\x6f\x43\x1e\x9d\x32\x6c\x24\x6f\x55\x25\xc7\x9c\x0c\x7b\x95\x83\x5a\x4a\x49\xb7\xbe\x71\x4f\x89\x43\x40\xde\x76\xa6\xa9\x7d\xfd\x33\xd5\x30\x78\x80\x35\x3c\x88\x6b\xf8\xde\xb7\x14\x8e\x76\x6c\x32\x5c\x10\xac\xdc\xb7\x8a\x6b\x7b\x2a\x54\xbc\x52\xee\x68\x1b\xa6\xd7\x5d\x95\xf9\xc7\xc1\xe0\xd2\x69\x50\x62\x3d\x4d\x01\x89\x65\x52\x65\x7f\xed\x75\x12\xb1\xf0\xc5\x20\x89\x95\x0c\x33\x9f\x63\xcf\x02\xbf\xc4\x0a\xa6\x20\xbe\xf2\x95\x0f\xf2\x59\xbf\x0d\xb2\x60\x9e\xdb\x67\xe3\x70\x31\xa8\xc8\x7d\x1b\xa3\xa5\x91\x2c\x44\xb0\x6e\x91\x10\xac\x42\x8c\xc6\xad\xa6\x57\x5f\x84\x30\x0c\xd0\xa0\x88\x13\x02\x4d\x65\x3f\x1d\xbf\x18\x0b\xb1\xa4\xf2\x5e\xea\xca\xbf\x4b\x74\x1a\xd5\xfd\x12\xe5\x86\x10\x0f\xa9\xce\xd5\x64\xfe\x31\x8b\xec\xeb\xa9\x44\xb6\x4a\x76\x25\x2c\xf7\x89\x89\x2c\x20\xf0\xe0\xc1\x4f\x62\x05\x21\xb9\xfe\x3a\xc8\xb3\x93\x2a\x31\x79\x30\xff\xfb\x70\x06\xe9\xba\x21\xd4\x58\x39\x7a\x31\x98\xf7\x06\x93\xa5\x9c\x34\x69\x93\x8e\x9a\x1c\x81\xed\x21\xa1\x23\x8b\x3d\x8c\xbf\xd8\x55\x88\xab\xa4\xf6\x6c\x21\x55\x80\x2e\x8f\x93\x91\x82\x6c\xcf\xc2\xf0\x2c\xe2\x8f\x90\x95\xee\x7d\x0a\x0b\x6b\xe7\x70\xd7\x71\x72\xd2\x3e\xd5\x0a\x7a\x9d\xee\xe9\x63\x86\xbf\x02\xd3\x4c\x7b\xd6\xa5\xb8\xb0\x55\xfb\x77\x68\xf9\x6d\xdb\xfc\x0b\xb5\x56\x08\xb3\xcd\x2d\x56\x7b\xb9\xed\x5a\xae\x8b\xec\xc6\x81\x71\x1a\xcf\x2f\xc9\x89\x2d\x79\xb0\x53\xeb\x6f\xdf\xee\x5f\xa8\xc5\x7e\x21\xca\x37\x3b\x58\xf4\xa5\xe9\x37\xd8\xed\xb6\x7a\xfe\x0a\x52\x5d\xe2\xda\x96\x10\xe7\x6f\x70\x5b\x42\x56\xb7\x24\x04\xa4\xf5\xcf\x42\xc8\xab\x1b\x13\x02\x0b\x61\x9e\x84\x70\x98\x29\x6b\x05\x8c\x12\x3d\xd4\x70\x80\x1c\x1b\x75\x2f\x18\x38\xd1\x00\xf4\x07\x92\xcd\x8e\x19\x43\x34\x1a\xc1\xe4\x32\x09\xa9\x4e\xea\x82\x00\x10\x5c\x62\x92\x46\x70\xab\x95\xed\x35\xf7\xe0\x22\x28\xad\x5b\x67\x87\x18\x23\x84\x32\xda\x7b\x78\xf0\xf9\x09\x9e\xc8\x59\x0c\xe4\xb2\x8b\xb6\xa3\x7b\x7f\xfe\xd3\xe2\xee\x9f\xfa\xfb\xf7\x1a\xb2\xe9\xb0\xb8\x71\xf6\xa7\xf7\x80\x86\xcc\xe9\x37\xa8\xaa\x7c\x97\x18\xae\xa3\x06\xb1\x6a\xf0\x24\x9b\xc2\x64\xc8\x2b\xe5\x70\x63\xfc\x90\xa2\x80\x58\x4b\x66\x0d\xc1\x9e\xf0\x25\x73\xfb\x8c\x0e\x46\x1f\xdf\x13\x41\x6b\x12\xe7\x19\xf6\x38\x15\xca\xef\xbb\x40\x35\xa9\x1b\xb5\x1b\x2e\xd2\xee\x5b\x6a\x0e\x0b\x61\xda\x4d\xba\x6b\x3a\x3b\x1b\xbe\xd1\x17\x46\xf8\xf2\x4f\x1c\xec\xfd\xb9\xf6\xe4\x10\xe2\x50\xd0\x5b\x7e\x14\x45\xab\x05\x81\x32\xa7\x4b\x1b\xbf\x74\xef\x07\x0a\xb2\x5e\x07\x6f\xa9\xe1\xde\xa6\x4a\xd9\x34\xa7\x2a\xa6\x68\x32\x33\x6f\x8f\xff\x9a\xcc\xaf\xd6\x6f\x00\xf8\x4f\x14\x48\xc6\x85\x5e\x03\x06\x03\x5a\xe5\x10\xf2\x64\x78\x9a\x33\xce\x59\x3f\xd0\x72\x96\x25\x35\x56\x0a\x73\xf3\x2e\x1c\x90\xa9\x25\x20\x9c\x99\x0e\x36\xb1\x02\x90\xdc\xee\x04\xfe\x85\x5a\x01\xd8\x9f\x60\x0c\x8c\xac\x80\xaf\x6e\x92\xd4\x87\xff\x51\xad\xca\x36\xe7\xbb\x9f\xa9\x39\xa4\x91\xff\x97\x37\xe7\x8f\xb7\x6a\x8e\xf2\x47\xfd\x87\x8d\xb5\x07\xd9\xd6\xac\x6f\xd5\x9a\x7f\x7c\x4b\x0e\x2a\x5b\x62\xf1\x0c\x56\xb3\x72\xd2\x47\xea\xb0\x71\x55\xaa\x52\xbe\x75\xb0\xc9\xca\xb5\x8e\xab\xbf\xf7\xe7\x93\xfd\xe6\xe9\x9f\xfa\x7f\x79\xf0\xf1\x7f\xf2\x6b\x90\x6e\xb9\x48\x91\xff\xb0\x5e\x77\x04\x83\x7f\x47\xd3\x22\x46\xa4\x04\x51\x4d\x99\x68\x5a\xe8\x7e\xdf\x47\xb7\x83\xe2\x71\xf1\x19\x84\xc2\x03\xdf\x1a\x83\xea\x60\x70\x3f\x2f\xae\xc3\xdd\xfb\x3f\x4b\x5f\x82\x22\x0c\x9d\x05\x6e\xcf\x37\xea\xba\xaf\xfe\x71\x82\x62\x53\x5b\xfa\xb7\x9a\x61\x5f\x29\x17\xcf\x7f\x58\x73\xee\x67\x9b\xf3\xf6\x56\xcd\x21\x63\xd4\x3f\x4b\xd7\xfc\xf6\x56\x6d\xb1\x56\xfb\x7f\x92\xc6\x7c\x7d\xab\xc6\x58\x8b\xfe\x3f\x49\x63\x5e\xde\xb2\x67\xc4\x61\xd0\x3f\xc9\xbc\x79\x7e\xd3\x16\x7d\xc0\x55\x48\xaa\xd1\x1f\xd0\x31\x30\x71\x4d\xa2\x51\x7c\x80\xdd\xd6\x07\x8c\x92\xe9\xb6\x30\xfb\x10\x3f\x11\x36\x26\x10\x4f\xf5\x03\x38\x85\x7f\x86\x3e\x69\x26\x75\xec\x53\x3f\x35\xa9\x8a\x74\x83\x6a\x3f\xb1\x91\xfa\x00\x2f\xe0\xb5\xf7\xe0\x10\x21\x9d\x3f\x76\xf9\xd5\x9d\xa4\x8d\x94\x9b\xba\xc9\x6d\xf7\xb6\xe9\x27\x0f\xbc\x93\xf6\x1d\xf4\x4b\x75\xb7\x08\x67\x13\x7e\xf0\x41\x6d\x75\x80\x1c\x6b\x0d\xb0\xce\x6e\xb4\xd5\x49\x6f\x6c\xac\xb3\xf0\xf0\x14\x96\x3d\x7a\xc4\xa0\xa6\x12\x35\xbd\x15\x37\x0b\xd8\xdf\xee\xdc\x53\x60\x10\xd8\x2d\x3f\xd7\x7b\xe7\xfc\xa4\x73\xca\x77\x4c\x14\xa4\x21\xe8\x34\x30\x0f\x9c\x9b\xca\xe5\x0d\x1f\xf9\xc6\x3a\x1d\x56\x49\x5f\x26\xed\x99\x1f\x44\xeb\x95\x31\x71\xd1\x66\x5d\x11\x2b\xd7\xbd\x4a\x30\xb4\x5e\xff\xb2\x84\x4f\xb5\xf0\x82\xb6\x23\x6f\x8b\x60\xf0\xc1\xe4\xbb\x97\xe4\xf5\x43\x09\x35\x1e\x5d\x14\xb9\xcb\x4c\x92\xd6\x9e\x7d\xda\x9f\x83\xa7\x9a\xb4\x06\xa7\xd9\x78\xac\x87\xc5\x49\x71\xbf\x38\xe5\x38\x42\x1c\x8d\x10\x12\xf7\xfe\x27\xc6\xaa\xb6\x59\xd6\x51\xc1\xa0\xf8\xb4\x2c\x3e\xed\x16\x9f\x0e\x8a\x4f\x5f\x15\x9f\xbe\xde\xf3\xf9\x90\x37\xbe\xf7\x69\xff\x9e\x4b\x5d\x72\x89\xdf\x1e\x7e\xfa\xf5\xe1\xa7\x2f\x39\x95\x8f\x74\xb1\x96\xa7\x18\x04\xfb\xc5\xd7\xa2\xa2\x35\xe5\xbc\x74\x57\xa0\xbe\x76\x57\xa0\xfe\xe0\xaf\x40\xfd\x51\x5e\x81\xfa\x83\xb8\x02\xf5\x1b\x77\x05\xea\xa5\xbf\x02\xc5\x17\xf7\xad\x47\x8a\xad\x80\xb1\x33\x6a\x46\xcb\x08\x19\x17\x23\x72\x38\xc8\xdf\x03\x11\xfc\xaf\x72\x72\x55\xce\xa9\xd2\x41\x77\x6e\x7f\x7f\x5d\xce\x7b\x17\xf0\xe3\xe9\x6c\x3e\x1c\x51\x0a\x66\xfc\xaf\xab\xc9\x80\xfe\x8e\xf0\xfb\xe9\xd5\x9b\xab\x05\x3e\xd1\xfb\x72\x30\x5b\x0e\x60\xb8\xc0\xc7\xef\x7b\xcb\x29\xff\xfc\x66\x7a\xed\x92\xbf\x1a\xf4\xe8\xb7\x6a\xcd\xd7\x8a\x1c\x26\x85\xa9\x60\x1a\x34\x05\x4c\x00\xd7\xcf\x95\x73\xb5\x5c\x25\xd7\x66\x2a\xfa\xc4\xdf\xaf\xf1\xef\x16\xe9\x11\xd8\x92\xe3\x9c\x41\xdf\x0c\xe0\xb1\xba\xbf\x44\xa1\xb2\xcb\x3e\xbc\x41\x6b\xe6\x11\x5f\x3f\xc5\xef\x44\xbc\x9d\x85\x73\x71\x5f\xba\x5f\x06\x56\x9c\xa9\xae\x95\x2d\x1b\xf1\xbc\xbc\x1a\xd7\xf0\x49\x92\xe1\xa2\x45\x6f\xaa\x60\xf2\x1f\x06\x63\x7f\xf1\x40\xc2\x4a\x80\xd6\x82\x0b\xf2\x5f\x57\xc0\xbd\xae\xbf\xa8\x33\x66\x30\x3e\xaa\xa2\x4b\xf6\x22\x27\xb0\x22\xca\xa5\x39\xcc\x71\x9f\x06\xb9\xf0\x2d\xae\x34\xd7\x72\x7c\xc3\x48\x2e\xe2\x46\xbd\x14\x19\x8e\x20\x6f\xab\xe2\xce\x48\xf6\x11\xf0\xa7\x6c\x14\xdd\x46\x31\x95\x0b\x00\x2c\x4f\x53\xa4\xb2\x84\x38\x76\x06\x00\x9e\xce\x59\x41\xc8\xba\x46\x51\xda\xdf\xdd\x6b\xa2\x61\x8a\xcd\x28\x21\xf7\x1a\x76\x71\x5d\xcc\x13\x21\x97\x60\x9c\xc0\xfb\x88\x83\x72\x2c\xa5\xed\xb4\xfb\x76\xd0\x33\x3d\x68\xd4\x9d\xe5\x60\xe2\x43\x57\xe0\x3b\x8e\x98\xc7\xd7\x06\x4c\xf1\x33\x2a\xfe\x7b\x4c\x86\x17\x41\xe1\xe5\xa9\xdf\xbf\x9f\xbc\x98\x4f\x8d\x94\x59\xae\xb9\x40\x0b\xe3\x87\xaa\x31\x93\x2a\x7c\x22\xa0\x4f\x63\x3a\x98\xb5\xd1\x3b\x1f\x1e\xd5\xbf\x0e\xa6\xe3\xc1\x72\xbe\xce\x96\xb5\xdd\x22\x39\x9e\x28\xfe\x86\x7f\xa4\x99\x60\x73\x23\x36\xd8\xf2\x29\x46\xd8\x42\x95\xac\x90\x08\x4e\x54\x89\xd3\x14\x4d\xa2\x51\x7e\xa8\xa5\x18\xeb\x66\xf6\x6f\x06\x20\x93\xa5\x33\xda\x39\xa5\xc4\x2d\xcd\xb1\x96\x0b\xb4\xf2\xf4\x34\x64\x55\xcf\xa6\xa3\xd1\x00\xab\x3a\xdc\x3c\xc4\x38\xfc\x2b\x95\x84\x71\xce\x03\xc2\xa6\x68\xd3\xae\x4d\x4d\xbb\xf9\x3b\x35\xa8\xb2\x19\x68\xf0\xad\x66\xed\x51\x8a\xb7\xb2\xa7\x1c\x77\x5f\xce\x2e\x06\x8a\xb9\xf9\x76\xda\x94\xd6\x02\xcb\x04\x71\x9f\x5e\x4c\x87\x93\xe5\x56\x78\x78\x42\x3a\x4e\xf5\xa6\xd3\x79\x7f\x38\x31\xda\xc0\xe2\x28\xac\x6a\x06\x58\x19\x17\x6e\x1a\xf8\x67\xc7\xff\x3c\x38\xd5\x84\xa0\x2e\xba\x3d\x35\x78\x47\xc3\x53\x90\x24\x4b\xf7\xa1\xc8\xd8\xd0\x8d\xae\xa5\xa2\x88\xe9\xbc\xc6\xad\xda\xf7\x7c\x38\x19\xd0\xa1\xda\x56\xed\x53\x43\x00\xca\xd6\x52\xed\xb3\xe5\xfc\x0d\x2f\xc9\xcd\x1d\xab\xfc\x25\x59\x1a\x37\x27\xc7\xdb\xa8\x29\x2f\xa6\xa3\xf5\x9b\x2d\xe7\xb4\xaa\x86\x0b\x56\x32\x2e\x39\x06\xb7\xaf\xef\x1f\xc6\x32\xdb\x96\x1c\xd7\x74\x3b\xac\xc8\xb8\x81\x44\x64\x01\x35\x94\x8d\xf1\x69\xba\x2d\x3e\xfd\x46\x72\xd1\x17\x4f\x36\xa5\x7a\x01\x0d\xc7\x90\x1c\x40\xbd\xd1\x74\x31\x50\x36\x87\xea\x1e\x30\xda\x0a\x15\x69\x88\x4c\xa2\xc2\xcd\xf8\x11\xce\xa5\xd2\xbf\xbc\x1f\xb6\xd1\x97\xdc\x2c\x38\x7c\x36\x0a\x0f\xf1\xd9\xd1\x9f\x4e\x88\x28\x3a\x7e\x3d\xe9\xd7\x92\xe6\x89\xca\xf1\x12\xf7\xf8\x66\xce\x04\x95\xcf\x08\x6b\x25\x1f\x76\x99\xe9\x9d\xb0\x75\x5c\x81\x6a\x20\x6b\x8f\xa5\xc1\x17\xeb\x8e\xc2\xd0\x02\xb5\x02\x90\xd1\x68\xbd\x4e\xad\x54\x4f\x37\xf4\x05\x74\x10\x25\x45\xa1\x09\x77\xe3\x22\x4b\xe1\xf8\xd6\x48\x58\xaa\x35\x56\xb8\x83\xa2\x7e\xe3\x13\x2e\xe0\x91\x10\xb3\x6d\x31\xbb\x90\x07\xc5\xdd\xe2\xa7\x7f\x57\x53\x7c\x46\x2b\xa5\x81\x9d\x4c\xa7\xb3\x06\xb3\x91\xc7\x68\x22\xdd\xb0\x34\x48\x95\x9d\xb9\x89\x0e\x6e\x61\x0b\x77\x35\x35\xb9\xc9\xb2\x10\x7e\x82\xd0\xbe\x48\x95\x84\xe4\x80\x7a\xdb\xcf\xc9\x9a\xf1\x5d\x60\xe2\xd6\x81\x69\x7a\x4c\x48\x82\x00\x66\x15\x16\x23\x1f\x08\xe2\x1a\x84\xc5\x86\xb4\x43\xfc\xb3\x03\xe5\x76\xaa\x05\xa9\xc8\x78\x4a\x03\x5e\x6e\x10\x56\x8a\x05\xea\x45\xb9\x1f\xff\x0e\xee\xcc\x3f\xfd\x15\xfe\x35\xbf\x61\xda\x2f\xcc\x17\xbc\x2e\x33\x31\x7f\x8f\xc2\x61\xed\x2a\x76\xfc\xfa\xf1\xef\x50\x3e\xd9\x5f\x0e\x78\x32\x58\x2d\x51\xa9\xb2\x0d\x37\x55\x81\x2f\x08\xd4\x6e\xfe\xfe\xf8\xf7\x3a\xf1\x77\x5e\xf6\x87\xe5\x64\x61\xa9\x28\xf8\x59\x07\xf3\x55\xfb\xe9\xaf\x50\x00\x08\x35\x7f\xa1\x3e\x59\xa0\xb8\x57\xc0\x3d\x70\xc3\xe6\x7b\xc5\x83\x3a\x1f\x04\x16\xdc\x06\x8b\xc5\x7c\x99\xf2\xd2\xfe\x26\x18\xe5\x28\x8c\xda\xf3\xe3\xdf\xe1\x8d\x00\x5f\x97\x6d\x02\x12\x64\xfe\xc9\xd2\x71\x24\x86\x51\xdf\x60\x81\x76\x1a\x19\x8f\x5c\x5e\x50\x02\xfc\xfb\xf8\x18\x87\x49\x07\x2d\xa5\x66\x57\x4b\x39\x08\x70\x17\x00\x98\x19\x9a\x17\x75\xee\xa0\xa0\x6d\xf4\x22\x38\x37\xfb\x2e\xfd\x68\x14\x57\x28\x54\x17\x94\x46\xc8\xf6\x0d\xe0\x5d\x8f\x10\x2a\x35\x85\x61\x43\x0d\xe9\x5c\xb9\xc3\x8c\xd9\x89\x31\x6b\xe7\x23\xbc\xa6\x8c\xc0\xe5\xb2\x9c\x1c\xd4\xae\x4d\x95\xde\x3f\x8a\xba\xda\xb5\xa3\x6d\x89\x69\xf8\xee\xc1\x1f\x7e\x08\xc7\xf3\xe2\xd7\xfa\xb5\x3d\xdf\x39\xb2\xdb\xec\x40\x0e\x2d\xac\xe1\x64\xe8\x99\x39\x30\x58\x98\xee\xaa\xa1\xf4\x1b\xf6\xfc\x8b\xa7\x34\x23\x80\x22\x9b\x83\x2b\x23\xf2\xd9\x27\xd1\xea\x18\xf7\x89\x92\xe1\x27\x0c\x22\xb8\x8c\x3c\x56\xa9\xc0\x5c\x4c\x95\x9d\x58\x9c\x6e\xa4\xfc\xab\xe9\x12\xcd\x25\x81\x85\xb8\x04\xb3\xf7\xdd\xa2\x0b\x7f\x8c\xbc\x81\x57\xa4\xe0\xab\x43\x5f\x07\xf4\x75\xb0\x19\xfd\xb3\xf9\x74\xb1\x48\x55\x70\xe2\x91\x1e\xc0\xb9\xb2\x43\x0a\x2c\x71\x1f\x6d\xca\x6a\x5b\xc0\x86\xff\xe8\x50\x56\xc7\x01\x6e\x26\xe6\xa9\x19\x5c\x92\x14\xc4\x65\x44\x2c\x14\x3f\xe2\x94\x0e\xa7\x74\x5c\xca\x01\xa7\x6c\xd1\xda\x97\xf4\xba\x88\x59\x92\xa7\x73\x11\x6f\xcf\x35\x99\x72\xa8\x05\x97\x0d\xfb\xd9\xd1\x9f\xd8\xf4\xcb\x2d\x9a\xf3\x0d\xd8\x2d\x47\xc3\x0f\xc1\x71\xd4\xc8\xcd\xe4\x77\x46\x42\xf7\xa9\xb6\x3e\x75\x64\x9f\x2a\xeb\x53\x47\xf6\xa9\xae\xbe\xd7\xca\x10\xec\xde\x71\x31\xb2\x9f\x1d\xfd\x79\xe0\x3f\x93\xaa\x9a\x1d\xd8\x35\x47\x64\xc4\x03\x31\xbb\x1d\x10\xcd\x03\xf7\x85\x0e\x22\xa0\x75\xc0\x30\xf6\xc9\x86\xca\x3c\x57\x5c\xd5\xbf\x7e\x77\x65\xea\x4f\x0d\xe9\xae\x19\x88\x34\xa2\xa0\xc3\xe1\x0a\xff\x8f\xff\x17\x9f\xf2\xc2\x8c\x0e\x65\x74\x38\x23\x50\xd6\xba\x10\x12\x72\x91\x92\x1c\xbc\xf4\xa1\xc0\x80\x85\xaf\x03\xbf\x3a\xf0\xeb\x0c\xff\x39\x83\x6f\xf8\x77\x06\x31\x26\x7e\xfc\x3b\xea\x5a\x18\x83\x69\xd1\x08\x23\x5c\x76\x39\x2a\xa5\x95\x49\xac\x13\xe1\x9f\x86\x33\x49\x38\x9d\xc8\xfd\x94\x79\xa8\x82\xf0\x0f\x77\xbd\x63\x93\x66\x54\x50\xd5\x6e\x95\x85\x2d\xb6\x5a\x65\x2d\x80\x54\x2d\xe6\x5a\x13\xd2\x40\x24\x67\x01\xe4\xd7\x36\x1c\x28\x0e\x21\x64\x40\xa1\xde\xb9\xd2\xcb\x7c\xac\x90\xcb\x8b\x77\xd5\x6a\x56\x12\x97\xd3\xbd\x53\x0d\x9d\x6d\x6a\xa4\xfb\x9d\x6f\x24\xff\xf2\x00\xfc\x0c\x77\xa8\x4d\x63\xc8\x08\x5a\xc3\x9a\x46\x56\x43\x68\xe2\xce\xe7\x10\x8a\x84\x96\xae\xa6\x91\xd8\x90\xf6\x45\x5b\x06\x77\x61\x86\x3d\x36\x43\xb2\x5e\x58\x80\x38\xff\x51\xd1\x24\x00\xc4\xf4\x85\x8c\x06\x0b\x43\x8c\x0e\x31\x71\x98\xd2\x77\x87\xbe\x5d\xc4\x89\x8f\x49\x55\x66\x96\x54\x63\x68\xf0\x52\xdc\x22\x1b\xc0\xf4\x44\x2c\xce\xd4\x34\xb3\xf8\x9d\xaa\xb3\x08\xb3\x56\x3d\x02\x02\x2d\x95\x76\x9d\x76\xb9\x8f\xa1\x7d\xb6\x91\x7a\x15\x77\x14\x01\xaf\xd3\xca\x15\xcc\x9f\x99\x57\x6d\xfd\xd2\x7c\x52\x90\xfe\x23\x74\xc2\x50\xd7\xd2\x84\xce\xda\x61\xa8\xa4\x09\x4a\xda\x04\x72\x5a\xde\x60\x66\xcf\x4c\x3f\x0e\x8c\xe8\x31\x12\x7c\x88\xa0\x27\x5c\x0a\x65\x5b\x93\x7f\x83\x0a\xd0\x2e\xc0\xe7\x60\x72\xce\x86\x8c\x2c\x56\x8f\xad\xc1\xa8\xea\xd1\x9c\x49\xac\x05\x1e\xb3\x8c\xb0\x92\xa8\xce\x0b\xeb\x64\x91\x48\xd7\x34\x22\x6c\x61\x15\x4d\xa5\x67\xfe\xf8\x77\xd8\x73\x7b\x24\xbc\xe2\xdc\x3f\xeb\x0f\xde\xcc\x07\x83\x05\xa8\x81\x66\xe1\x9e\xc0\x89\xea\x7c\x08\x1c\x67\x37\x07\xd0\x05\x21\x78\xf4\xe7\x6d\x3d\x77\x14\xe8\x9f\x8b\x1a\x60\x30\xf5\x83\x5c\x36\x55\x19\x89\x0d\x7f\x1e\x15\x94\x1c\xc4\x52\x01\xb2\x7f\xfa\x6b\x40\x50\x47\x13\x74\x24\xe0\x69\xec\x0d\xc3\xc1\x37\xf4\x30\x22\xa2\x0b\xb5\x14\xff\xec\x17\xf7\x3f\x6b\x83\x9b\x86\xf9\x03\x6e\x71\x9f\xb7\x83\x26\xde\x98\xee\xe6\x6e\x84\x07\x73\x2a\x26\xfc\x2f\x51\xa1\xdc\x3c\xdc\x34\x17\xfd\x7c\x4c\xf5\x54\x1c\x43\xce\x8c\x14\x68\xfa\x59\x18\x2e\x8e\x4a\xbe\x31\xaa\x12\x4a\x24\x1a\x05\x2a\xa1\x53\xaf\x3b\x31\x22\xa9\x4b\x34\x49\xa3\xa3\xc2\x69\x74\xed\x18\xdd\x26\x5e\x01\x0d\x8f\x51\x70\xa6\xda\xc0\xed\x6b\xa7\x91\x3b\x98\xc7\x44\xd3\x4e\xed\xe1\x62\x11\xeb\x6e\xc3\xbc\x4c\x75\xb7\x61\xa0\x64\x61\x91\x08\x72\x17\x55\xa8\x56\x14\xbd\xf8\x98\x4c\xa8\x60\x86\x5a\x93\xa8\x29\xb1\x02\x68\xe3\x43\xb8\xa6\xbb\x35\x22\x5b\x1e\x55\x02\xbd\x9e\x6d\x5c\x21\x2b\xf4\x06\xa4\xdb\x87\x99\x0b\x43\xc2\x5b\x5d\x2a\x5a\xb2\xd2\x8b\x8d\x16\xba\x91\xea\xb4\x1f\xca\x4e\x88\x4b\x66\xa0\xf7\x51\x17\x60\xd1\x0c\x42\xc9\x08\x67\x14\x51\x87\x90\x7d\xa4\x3b\x04\xf4\x52\x5e\xad\x41\x39\x55\x73\x3c\xb2\xba\x84\xdd\x15\xad\xc1\xd9\x66\x87\xfd\x94\x34\x52\xd5\xf2\xe5\x83\x7e\x12\x8c\xb4\x6a\x75\xd6\x72\xa7\xb4\x3e\x1c\xe0\xc4\x34\xc3\xc2\x3a\x6b\x53\xb1\x2a\x76\xb4\xd3\x88\xa8\xee\xf6\x60\xfe\x84\x1e\x0f\x58\x6b\x93\x45\x0b\x99\xf7\x20\x65\x9f\xbb\xce\x55\x13\xbe\x3d\x31\x1d\xcf\x4c\x1b\xbf\x45\x15\x4c\xed\x72\xf4\xd6\xbd\x29\x36\xb5\x01\x8a\xf7\xc3\xe5\xc5\x70\x82\x18\xe0\x19\x2e\x6c\x5b\x84\xc4\x71\xe0\xd1\xb1\x6f\xfd\x13\x95\xbc\x82\x15\x6d\xa5\x00\x0e\xe1\xdb\x03\xfd\xf0\x83\xcf\x7a\x54\xac\x24\x35\xa1\xdb\x1c\x1f\x29\x7b\x3a\x68\xe5\xa1\xae\x81\x2e\xa2\x95\x0a\xfe\x8d\xde\x14\x24\x7d\xb4\x90\x0f\x53\x68\x2b\xb9\x3b\xa7\xef\x8a\xc0\xfe\xde\x2f\x90\xf5\x59\x7d\xe2\x03\x43\x46\x2d\x69\x0c\xb5\x98\xce\xe1\xb8\x43\xf4\x82\xd0\x99\xce\xa7\x73\x78\xfb\x94\x0e\x21\xc0\x02\xe7\xb0\xa3\xe6\xd7\x6d\x14\x66\xb1\x7c\x33\xe8\xa3\x7a\x58\x9a\xcd\x6c\x81\x67\x0c\x47\x05\x44\x2f\x55\x62\xb9\xeb\x4b\x0e\xa3\xd0\x74\xb2\x07\xbb\x88\xb9\xc4\x07\x66\x75\x3a\x1a\x52\xea\xf9\xb5\xb7\x24\x9a\x70\xc7\x6b\xc5\x3d\xa5\xc1\x66\xd8\x14\x2c\x69\xc4\x77\xc5\x03\xbf\x21\x8e\xae\x87\xcf\xe1\x68\x13\x8e\xf6\xe9\xc6\x75\x8f\x78\x43\xfb\x0a\xe0\x5c\xb7\x9e\x59\xab\x95\xb8\xec\x0e\x16\x20\x90\x9b\x76\x58\x34\xa4\xb8\x13\x5d\x82\x6f\x8e\x53\x0d\xee\x90\xac\xe3\xa2\x21\x96\x2e\xf7\x64\x02\x5c\xc1\x9e\x39\x86\xae\x41\x4a\x1a\xe9\x1e\xe2\x12\x71\x0f\xd5\x48\x88\x5b\x86\x74\x90\xd1\x6d\x60\xc8\x63\x24\xb8\x6e\xc9\xee\xd3\x8a\xdb\x66\x1e\xd9\xcd\x53\xa9\x78\x1e\x05\x03\xb4\x03\xde\xee\xbe\x64\x88\x53\x9e\x59\x88\xf3\xd8\xcf\x16\x18\x1f\x38\x7f\x64\xda\x13\x33\x0c\x4f\x8a\x6f\xca\x6f\x1a\xf0\x0f\xec\x4b\xe4\x57\x01\x13\xfa\x84\xb6\x76\xb4\x49\x45\x00\x6b\xe2\x28\xd8\xe4\x66\xed\xa3\x35\xeb\x6d\x07\x33\x0f\xfc\x7d\xe7\xd3\x61\x7f\xe3\x01\x97\x05\xfc\x63\x5b\x6c\x84\x6c\x5a\x27\x4e\x7b\x95\x80\x7b\x9d\x48\xfb\x3e\x91\xf6\x2a\x81\xef\x75\x22\xed\xfb\x54\xbd\x07\x89\xb2\x89\xb4\xef\x0f\xb6\x3c\xab\xb3\x05\x44\xd8\xb2\x55\xaa\xda\x46\xb1\x4e\xd5\xdc\x20\xb7\xf3\xb0\x72\x0a\xe1\x09\x0f\x24\xc2\x7b\x86\x6b\xf3\x17\xe2\x8f\x7f\x30\x7f\x3f\x50\x3d\x30\x3a\xc7\x68\xe1\x3a\xf0\xe3\x39\x55\x71\x27\x5d\x71\x27\x5d\x71\x47\xca\xcd\xb8\x1b\x1f\xe1\x82\x9b\xaa\xa6\x9d\xae\xa6\x9d\xae\xc6\x6d\x14\x37\xb4\x32\x68\xa7\x33\x3e\xfa\xc1\x9d\x58\x8c\x94\x6d\xd2\xc8\x91\x55\x5d\x6d\xbe\xbc\x49\xf2\x43\x71\x4f\x58\x58\xc7\x75\x0d\xc7\x36\x4a\xf8\x47\x9c\x95\xfa\x71\x1e\x8d\x80\x3f\x76\xa2\xa4\x57\x31\xd4\xeb\x38\xe9\xfb\x38\xe9\x55\x8c\xeb\x75\x9c\xf4\x7d\xa2\xc6\x83\xb8\x60\x9c\xf4\xfd\x41\xa6\x59\x45\x78\x0c\x1c\x9c\xcc\xda\xb3\x5d\x59\xe6\x85\x37\x6b\xea\x83\x5e\x09\xf4\x5c\xdb\x38\xe5\xc9\x6f\x08\xe6\x0c\x9e\xdb\x1e\x04\xdb\xc2\xa9\x03\x53\x9b\x77\xa3\xe3\xde\x1d\xf0\x3f\xd7\xf6\xc5\xec\xb9\xab\x62\x5a\xb0\x93\x48\x9f\x2b\x92\x2b\x4f\x74\xb6\xa4\x41\xfd\x63\x0c\x51\x25\xaf\x5e\x7f\x5f\xbb\xe9\xc1\x53\xd6\x99\x23\xaa\xc1\x68\xa0\x66\xaa\x7d\xb0\x4d\xd9\xdf\x8f\xe6\x4b\x92\x42\xb3\x0c\x98\x8d\x50\x0d\x7c\x76\xa3\x1c\xb8\x52\xb3\x1d\x96\xd7\x84\x65\x1d\x63\x79\xbd\x03\x96\xef\x09\xcb\x87\x18\xcb\xf7\x79\x2c\x55\xcc\x79\x1e\x6d\x71\x71\x75\x00\x51\x09\x72\x31\x4d\xc5\xe6\xe3\xf4\xdc\xf1\xf3\x2e\x03\xc5\xac\x15\xee\xd8\x35\x18\x17\x16\x60\x1d\x01\xf0\x10\xb1\x00\x1f\xd2\xe7\xe8\xf9\x16\x45\x67\xfe\xd9\xc1\xe4\x58\xf4\xb3\x9d\xcd\x6f\xc7\x9c\x06\xae\x6d\xe9\xd9\xb2\xce\xb0\x83\x56\x38\x7d\xe6\xfe\xde\xa6\xd0\x22\xe4\x17\x99\x1a\xe4\xac\xe1\xd4\x1d\x86\xd9\x07\xf8\xb1\x86\x65\x07\x42\xa9\x63\x1e\x26\xc1\x74\x58\x21\x90\xca\xc3\x24\x18\xe4\x88\x00\x97\xb5\xf7\x40\x72\xdb\x2e\xa0\x6d\xbb\x82\x52\xd9\x0c\x9b\xcd\x3a\x6e\xc6\xf9\xfb\x4c\xee\x2b\xca\x85\xa7\x99\x0d\xe2\x7d\xfc\xd7\x54\x5d\xcf\x61\x7b\xed\xe1\xd7\x08\x8f\xe3\x66\x9d\x85\xff\xde\xc3\x7f\x40\x78\x1c\x46\x1f\xb2\xf0\x15\x83\x62\x8b\xe9\x27\x2d\x0f\xb9\x61\x99\xaa\x70\xd3\xd4\xde\xec\x3a\xf3\x33\x4c\xf3\x76\xdb\xd9\x76\xda\xed\x94\x6d\x67\xf3\x0c\xfb\xef\x26\x2b\x36\x8a\x80\xd4\x92\x7c\x13\x5f\x90\x2a\x4c\xe9\x71\xb4\x89\xf7\xb9\x61\xf4\xdf\x4f\x7a\xf5\x56\xb1\x90\x32\xa9\xeb\x58\x3c\x99\xd4\x0f\xb1\x60\xa2\xcd\x8b\x17\x7a\x3d\xd0\xf0\x7b\x20\xa1\x7a\xa0\xe3\xf7\x40\x44\xf5\x40\xcb\xef\x7d\xa8\x93\x2f\x52\x4e\x84\x91\x03\xd2\x18\x2c\x54\x4d\xd0\xda\xa1\x39\x57\xb0\x16\x8f\x23\x19\x3b\x06\x17\xa3\x9c\x4c\x3b\x00\x99\x73\x8d\x54\xe4\xc4\x98\x07\x59\xe7\x24\x97\x07\xf9\xf0\xff\xaa\x68\x9d\x8e\x67\xd3\xc5\x40\x19\x2c\x95\x4d\x13\x32\x41\x15\x8c\x0c\x91\x30\xa4\x4a\xca\x32\x65\x6b\x2b\x34\x92\xac\xc0\xb8\x24\x77\x70\x68\x91\x6a\x0d\x27\xd7\x83\x39\xde\xb0\xea\xf2\xef\xba\x45\x6e\xf3\xc4\x74\xcf\x56\x67\x0b\xdb\x5a\xd1\xd0\x59\xba\xc4\x88\x82\x23\xb9\x89\xe4\xfa\x52\xeb\xc0\x72\x7e\x35\xa8\x05\x4e\x29\x90\x96\x5d\x33\x46\xc3\x99\x75\x7b\x5e\x0c\xde\xe0\x93\xcb\x0d\x6b\x01\x06\xa7\xf0\xe1\x0c\x97\x92\xdf\x4d\x16\xc3\xfe\xa0\x41\xef\xa1\x99\x9d\x09\xde\xdc\x4e\xb9\x46\x2f\xae\xec\x3d\x10\x78\x21\x0a\xca\x0b\xa3\xa9\xad\x21\x8e\xcc\xce\x39\xfa\xdc\xa2\x06\xf6\x34\xce\x11\x06\xb5\x3a\x58\xcd\xdc\xcb\x18\xca\xd2\xda\x20\x83\x39\x97\x41\x2e\xce\x3a\x22\x61\x72\x9a\xb0\x21\x04\x6e\x3d\x78\xd2\xde\x51\x46\xcd\xbc\x43\x3b\x0e\x32\x69\x91\x6d\x6b\x7b\x6b\xe0\xc3\x5e\x53\xe4\x0d\x4f\xeb\x44\x62\xdb\xf7\x74\x54\x5d\xe0\x5a\xa2\x1b\xfd\x51\x34\xbe\x2c\x9c\x2b\x75\xd0\xb3\xbf\x83\x4e\x5b\x0c\x38\x06\x3e\xf8\x73\x12\x01\x0d\x34\xea\x35\x70\x80\xc0\xc8\xdf\x1e\x01\x95\x33\x33\xed\xbc\x1c\x2d\xfc\x8b\x1e\x65\x0b\x2e\xb6\x76\xed\x27\x8f\x05\xb6\xb6\x3a\x28\x40\x4c\x69\xde\xfa\xba\x2d\xf1\x9d\x88\x78\x4d\xc1\xb6\x6d\xe8\x88\x36\x60\xf3\x6f\xdb\x04\xfb\x34\x00\xe6\x48\x03\x7e\xb0\xfb\xf5\x04\x99\xa5\xfb\xf2\xd9\x70\xde\xbb\x1a\x95\xf3\x1a\xd7\xb3\x1d\x30\xa4\xd7\xbd\xa9\xed\x8e\x25\x52\x3f\x4a\xc5\x0b\xbb\x1a\x9c\x8d\x02\xc4\x2b\xae\xb7\xe1\xcc\x9e\x70\xa2\x3d\xa3\x48\x1e\x1b\x00\x00\xdc\xc8\x03\x83\xb0\xc5\x74\x07\x7f\x48\x49\x49\x0f\xc5\x91\x29\x82\x69\xa3\x71\x0e\x73\x60\xd1\x90\x07\x9b\x7c\x11\xa2\x13\xdc\x0e\xc2\x8b\xf6\x58\x1c\xcd\x32\xc5\x70\xf1\xd2\xc9\x15\x2b\xce\x44\x71\x86\x6f\x5d\xd7\x49\x6e\xf8\xf2\x36\x67\x42\xcf\xca\x21\xba\x50\x72\x10\x59\x02\xd8\xad\xa0\x55\xf3\xbe\x3f\x15\x02\xc2\x11\x20\xb0\x4c\xf1\x4b\x52\xcb\xaf\x10\x71\xfe\x20\x76\x66\x70\xcd\x0c\x4f\x54\xc2\x5e\x84\xce\x22\xb2\x93\xdd\x15\x49\x1d\x79\xa2\xbc\xf0\x72\x07\x3e\xb5\xe8\xc9\xb9\x0b\x78\xb1\xef\xe8\x37\x2b\x97\xe3\x2e\x7c\x74\xa2\xdb\x48\x8c\x50\xfc\x4e\x74\x8c\x07\xcd\xf8\x47\x64\x99\x12\xf5\xdb\xcc\xf7\x5c\x82\x6d\x8a\x5f\xf8\xb8\xae\x49\x7e\x8c\x12\xbb\xd9\xfc\x2f\x60\xda\x0c\x3e\x9a\x37\xe3\xda\x4c\x70\x2d\x1c\x84\x72\x08\x7a\xb0\xfc\x20\x2f\xd4\xec\xba\xe3\x3e\xdc\x1a\xe3\x02\x88\xf8\x69\x96\x9c\x20\x62\xa5\xca\xea\x68\x19\x89\x56\x42\x20\x4c\x79\x87\xfb\x0e\xae\xfd\x98\x6c\xc5\x9a\x9e\xb6\xbc\xdc\x8b\xa3\x35\x04\xa6\xf3\x46\x25\x5b\xa2\xe7\x27\xcb\x16\xe0\xee\xba\x22\xfe\x68\xad\x8b\x01\x50\x4b\xb9\x28\x75\xa5\x60\x0b\x4b\xda\x03\x47\x51\x6e\x43\xab\xf5\x2a\x84\xc6\x69\x27\x16\xa7\xcb\x0b\xb8\xdf\x85\xe2\xd4\x52\x8b\x41\x0b\x56\x85\x72\x06\xc1\xb4\x0f\x6e\x64\x8a\x44\x58\xba\x10\x8b\x48\x73\xa2\x5a\xa4\x81\x60\xc2\x75\x53\xa4\xe1\x5b\x6d\xf0\x63\x26\x0e\xfb\x72\xad\x21\xd2\xff\x6d\xb8\x18\x76\x47\xac\x26\xc2\x4e\x34\xd0\x0f\xdd\x1a\x13\x28\xa4\x4e\xeb\x9b\x4f\x97\x49\x45\x92\x9d\xcc\x0d\x46\x5e\x94\xf0\x4a\x9c\x83\x6a\x14\x54\xb0\xff\xcc\x56\x60\xc0\x28\xc9\x6a\xd0\xae\x6a\xba\x2b\xe8\xbe\xc4\xbc\xc5\x85\x86\xf4\xd3\xbf\xe8\x69\x12\x78\x43\x57\xfb\x43\xe7\x3d\xa2\xb7\xf2\x89\xb6\xba\x84\x14\x36\xdf\x8a\x47\xb3\x1c\xc4\x06\xaf\x68\x01\x95\x71\x8b\xf6\xea\x77\x21\xdd\x18\x04\x9d\x41\xfa\xc7\xa8\x21\x79\x9f\xe8\x54\x33\x2a\x9b\x90\xf0\x79\x8e\x9a\x10\x39\x3d\xab\x26\xc0\x73\x5e\x70\x36\xee\xf6\x2d\x4a\x7e\xda\xde\x15\x3a\x8e\xb7\x83\x20\x79\xbf\x9b\xd8\x8d\x4f\x38\x9a\x1a\xb6\xbd\x0a\x23\x88\x25\xb7\x81\xb1\xaa\x56\x20\xf1\xf1\x4d\x3f\xd1\xe9\x70\xa1\x36\x73\x11\xb4\x51\x68\xc0\x48\x57\x80\xff\x55\xee\xd2\x44\xe6\xcb\x29\x50\xbd\xe5\x6e\x2d\xb1\x70\xa1\x5e\xa2\x4b\xff\xe2\x6d\xab\xde\x54\x61\x95\x62\x01\x25\x6d\x9d\xfe\xcd\xad\x99\xd5\x3b\x27\xbd\xa6\xa2\x5f\xdc\x86\xd6\x20\x82\x44\x5b\x84\xe8\x8c\x46\xa5\x9f\x4a\xfa\x4d\x58\x31\x99\x2a\x6e\xb1\xaa\x36\xa4\xef\x29\x6c\xc3\xba\x5d\x19\x57\xcd\xb6\xec\x45\x63\xcd\x55\xff\x1e\x60\xb5\x6b\x3f\xbb\xd1\xdb\x5b\x20\x38\xf7\x42\xf7\x3f\xdb\x3f\x7e\x91\xa9\xa1\xb3\x0b\x29\x5f\xee\x92\x9b\xd3\xc5\x22\xed\x2d\xe3\xfd\xa9\x49\xc3\x55\xe5\x66\xe4\x01\xa3\xb8\x2a\x4f\x53\xa4\x1a\x46\xd5\xa6\x1c\x4b\x53\xa2\x13\x28\x0b\x2a\x4b\x74\x75\x12\xbd\xf6\x67\xac\x96\xcb\x0e\xb1\xea\x52\x69\x54\xb0\x23\x5b\x2e\x9a\xdd\xab\xf3\xf3\xc1\x5c\x58\x95\x4d\x0d\x5f\x62\xda\x73\xee\x04\x98\x35\xb0\xfe\xd8\x6f\xb9\x8a\x53\xe9\xec\xb4\x72\xe9\x84\x21\x3d\xa6\x60\x81\x4c\x74\x9c\x7f\xea\xfa\x84\x8f\x26\x8a\xd3\xe0\xb6\xc1\xa6\x7e\x95\x54\xdf\xa0\x7f\x53\x0e\xa9\x01\xd2\xe4\x94\x75\x8f\xaa\x57\x62\x0e\xbb\xd6\xf3\x02\x72\x0d\x89\x48\xa5\xfd\xad\xb6\x28\x11\x09\xc1\x24\xa6\xe5\x72\x80\xd7\x26\x14\x2c\x26\xda\xfe\x7c\xe9\xe5\x1c\x75\x63\x8b\xfe\xe0\x8b\x07\xce\x2c\x63\x15\x14\xbd\x56\x1e\x05\xdd\x34\x9d\xc9\xfa\xb9\xd3\xf9\xc2\x8f\x7e\xbf\x94\x99\x13\xbf\xb1\x7d\x67\x12\x6e\xe5\x79\x87\x8d\x0d\xf9\x97\xa2\xa3\x05\x2b\x53\x18\x90\x17\x78\x0d\x5a\x37\xbe\xd8\xec\xe8\xc3\x78\x44\xda\x0d\x3a\x72\x82\x5b\xf4\x3f\xc1\xa2\x19\xee\x7a\x72\xdb\xda\xc8\x08\x99\xda\xd7\xee\xb2\xa2\x86\x3d\xa1\x6f\x71\x00\x7b\x3a\x60\xe4\xb6\x9d\x03\x2e\x53\x72\x94\xb8\x9e\xf7\x29\x30\x44\x5a\xbd\xe9\xa4\x57\x2e\x75\xce\xe2\x62\x78\x6e\x1a\x2e\x5f\xaf\x5f\xe4\xf1\x9c\x0f\x47\x4b\x88\x73\x2d\xd4\x25\xca\x7a\x8e\x7d\xdb\xa9\x47\xf3\xd9\xda\xd9\x0d\x28\x6f\xff\xaa\x36\x43\x1a\x5b\x68\xca\xb6\xef\x40\xe8\xf1\xf4\xb8\x48\x86\x19\xcd\x89\x53\x79\xf5\xd6\xf4\xc3\x82\xcd\xeb\x23\xb7\x4c\x04\x41\x37\xc5\x86\x25\xa9\x65\x20\x12\x62\x15\xef\xb2\x4e\x4e\x53\x37\x21\x75\x60\xa9\x58\xe2\xd2\x32\x98\x91\xb8\x1f\xa3\x2b\xa3\xca\x61\xab\x60\x19\x92\x21\x51\xad\x34\x48\xaf\x5e\xb7\xc2\x5d\x0c\xb7\x43\x4b\x09\x66\x0b\xe1\x89\xe8\x9a\x0f\xe0\xa5\x8b\x4c\xfd\x30\x68\x89\x4d\xbe\xcb\xea\x21\xe3\x82\x41\x4a\x49\xd1\xe8\xfc\xb8\xc5\x18\x02\x8b\x71\xe2\x42\x71\x0d\xbd\x94\xcb\xd6\xaa\x8e\x1e\xf1\xe8\xc3\xcf\xf7\x88\x2f\xca\xd1\xf9\x4f\xff\x0e\x37\x38\xfe\x6f\x71\xe8\xbf\xc8\x51\xba\x69\x4a\x76\xf1\x9c\x49\x96\xec\x56\x96\xec\xda\xd9\x1f\x44\xab\x03\xfa\x9e\xea\x9b\x75\xd2\x14\xc0\xa7\x4e\x8d\x1c\x38\x19\x06\x32\x99\xbf\x93\x3b\x94\x93\xa2\xf9\xd3\xbf\x37\xe0\x1f\x8c\x4c\x41\xc4\xa4\xb8\x15\xa2\xaf\xa5\x4e\xa2\xc8\xe3\x19\xbd\x31\xc9\xa9\x1f\x7f\x2e\x44\x32\x8a\xa2\x1b\xce\x9f\x2a\x31\x6c\x17\xd2\xce\x16\x33\x8a\xfc\x9c\xc3\x81\xbf\xb0\x77\xab\x3a\x7c\xd9\xc6\xb0\xe4\x90\xb8\xc3\x5e\xdf\xdd\x05\xdd\xee\xc0\xcb\x1d\x7a\xf9\xe3\x5b\x28\x26\xef\xa7\x7f\xaf\xb3\x5b\x6c\x66\x83\xc1\xee\x07\x96\x43\x10\xb0\x04\x02\x82\x00\x41\xd0\x03\x54\x37\x0f\x10\x53\x3f\xfd\xca\x6d\x0e\x00\xd9\xc2\x62\xbb\xc9\xfe\x22\xb3\xa6\xc5\x55\x74\x2a\xaa\xb0\x8d\x4a\xc0\xd8\x7e\x11\x57\x41\xc5\xfe\x17\x47\xc6\x1d\x38\x24\x00\xc6\x42\xec\x48\x0a\x77\x02\x4c\xfc\x4b\xb0\xd8\x13\xfb\xe1\x52\xe6\x82\x2f\xd7\xd8\xcb\x3e\xcd\x63\x1a\x62\x77\xf9\x7e\x7f\x5c\xaa\x43\xa5\x3a\xbe\x54\x87\x4b\x75\xa2\x52\xd4\x2d\x55\x73\x07\x6c\x89\xb5\x38\x36\xc0\x3f\x65\x1f\xa5\xf8\x1f\x4f\x29\x37\x2a\x69\x02\x34\xdc\x15\x52\xd9\x28\x9e\xc6\x0b\x79\xbd\x3c\x5a\x6e\x36\x4f\xdd\xa0\x9d\xf2\x0a\x90\x91\x10\x11\x66\x6c\x40\xf5\xd3\xa5\x07\x18\x17\xcd\xc9\x95\xad\x84\xff\xd6\x9d\x2a\xa4\x9b\x0d\x7c\x84\x7f\x3b\x18\x9d\xc6\x14\x38\x23\xb9\x21\x9c\x68\xda\x28\x22\x3a\x3a\xda\x0b\x0c\x44\x5f\x80\xee\xaa\x99\x89\xee\x3c\x56\x6a\x35\xe1\x74\xd3\x06\x5f\x3e\xf2\xd2\x75\xb8\xc9\xc5\xa7\x83\x5e\xe9\xa2\xb2\x0e\x2c\x3c\xa2\x68\xc7\x17\x0d\xa2\x23\xb5\xc3\xa2\x90\x70\xcf\xc1\x72\xe0\x9f\x0e\x45\x05\xb2\x74\xc2\x3d\xc3\x40\x44\xed\xc4\x56\xb6\x88\x9c\xcf\xa7\xe3\x46\xb1\x9c\x1a\x59\x3a\x9c\x93\x29\x3e\xed\xcb\x60\x7d\xda\x60\xee\x42\x21\xfb\x66\x9a\xbc\x41\x06\xd3\xd3\x62\x31\xd4\x92\x84\x3c\xfa\x24\x39\xa6\x51\x7e\xab\x4b\x8e\x2a\xbb\x5d\x95\x59\x5d\x14\x72\xdb\x55\x99\xcd\xca\x6a\x2b\x72\x9b\x1b\x4a\x37\x2b\xab\xd6\x2d\x16\xc2\x16\x46\x20\xb0\x94\xee\x11\x2e\xa7\x18\x2c\xe5\xb1\x5a\xaa\x70\x1d\x04\xb3\x00\x83\x3d\x22\x30\xb1\x18\x1e\xe5\x7a\x61\x61\x87\x46\x8a\xa4\xc5\x8d\xfb\x60\x11\xb7\xe5\x2f\x69\x48\xa4\x14\xc6\x98\x76\x22\x4a\x8d\xd4\xc0\x16\xed\xce\x84\xc8\x00\x2d\x46\xa3\x50\xbf\x84\x49\xa2\x9c\x97\xa3\xd1\x60\x24\x8c\x61\x0d\x07\xf9\x8d\x0d\x29\x71\xe2\x67\x9a\xbb\x49\x6f\x7a\xd5\xcd\x47\x91\x88\x17\xb0\x60\xa2\xcc\x9f\xc2\xc5\x32\x3a\x5e\x7b\x3f\x9c\xf4\x69\x13\x1e\x87\x58\x4b\x46\xb9\x4b\x9f\x57\xd3\x16\xbf\xca\xbf\x00\x8a\xf0\x76\x9f\xc1\x31\xf8\xe1\x98\xf7\xec\x89\xfb\x93\x77\xc6\xe0\x7f\x65\x66\xfa\xc4\x6f\x95\x9d\xa1\xa7\xcd\xe5\xf8\xd6\x5b\xdb\x72\xa9\xcd\x26\x44\x91\x00\x41\x88\x44\x34\xb4\x46\x32\x1a\x5b\xbb\x9e\x8e\xf5\x06\xe9\x6f\xa5\xc2\xc7\x9b\x70\xf4\x2c\x09\xf6\x14\x6f\xd1\x11\xc1\x50\xfd\x56\xaf\x84\x32\x2c\xce\xc9\xdb\x53\x6d\x9a\xa9\x32\x7e\xa6\xe8\x2e\x22\xb7\xc9\x64\x50\xb6\x5b\xc5\x79\x0b\x83\x6d\xd0\xcd\x70\x98\xf0\x71\x54\x37\xdf\x9a\xc4\xc8\x09\xe2\xb1\x65\x43\xba\x35\xb6\x09\x0b\x57\xd7\x46\x25\x3b\x8c\xe1\x46\xbb\xa4\xd7\xde\x67\xe7\x8a\x7e\xfa\x4f\x7d\x85\x3d\x19\x23\x04\x06\xd0\xe3\xe3\x42\xa5\xc8\x84\x38\xd8\x46\x39\xef\x15\xb9\xd0\x2b\x61\x2a\xcd\xfc\x76\xbd\x11\xc1\x53\x4e\x5d\xa9\x52\x21\x8c\x8f\xcd\x62\xea\x8c\x0e\xc2\x86\xe2\xd4\x39\x4b\x90\x96\x1a\x8d\x22\x44\x94\xaf\x52\xa2\x8f\xea\xfe\xe9\xaf\xc4\x85\x90\x9b\x62\x90\xe1\x03\xa4\x1d\xbe\xe1\x86\xb7\xdf\x24\x46\x1f\x39\xcc\xf7\x8c\x13\x7b\x8f\x19\xff\x0f\x3f\x08\x51\x78\x7c\xcc\xa9\x46\x89\x07\x7e\xf0\x3d\x71\xf8\x85\x67\x05\xda\x46\x67\x85\x5b\x38\x44\xfe\x1c\xcf\x83\xb4\xe9\x4b\x1b\xba\xee\xbc\xdd\xdf\xaf\x17\x5d\x33\xbe\x2f\x43\xc5\x12\x66\x8d\x8e\x22\x18\x47\x19\x74\x72\x4b\x19\x19\x3f\x7e\xe2\xff\xb5\x96\x01\x31\xba\x31\x32\x13\xf2\x40\xa6\x51\xe4\xb1\x78\xc2\x51\x90\xa8\x3f\xbb\x86\xff\x4b\xb5\x2d\x0a\x9c\x34\x46\x83\x1a\x38\x72\x5f\xa9\xf7\x6e\x7a\x73\x29\x50\x38\xdf\xb4\xd0\x8c\x8a\xd1\xb7\xf8\x05\xcd\x9a\xc3\x2e\x12\xa2\x0b\x2d\x7f\x3b\x18\x0f\xe9\xec\x8b\x37\xb0\xbd\x39\xad\xf9\xea\xa0\x52\x8c\x4f\xac\x58\x6a\x6e\x54\x47\xa3\xf8\x4c\x85\x56\xd2\xba\xad\x34\x4d\x5c\x6f\x70\x50\x90\xa4\xc2\x3d\x65\x50\x85\xa8\x0e\xbe\x97\x8c\xfa\x0b\xa7\xc0\x76\xda\x59\xb7\x1c\xa3\xae\xdd\xf1\x54\x10\xc0\x8a\xa8\x91\x8e\xee\x52\x56\x01\xe8\x63\xc3\x9c\x23\xd1\xb1\xde\x59\x39\xf2\x78\xd0\x11\xa8\x70\x88\x98\x46\x99\xff\xae\xf1\xbf\x76\x43\xef\x39\x02\x6b\xc6\x66\x7b\x46\x01\x48\x0c\xe7\xaf\xdb\xa9\xe3\xcd\xc8\x9e\x11\xf8\x06\x6c\xb2\x12\x0a\xb2\x3b\x05\xc5\xf1\x22\x53\x21\x0f\xf7\x03\x72\xa5\x0f\x58\x69\xda\x04\xd3\x44\x75\xd1\xb5\xf9\x0f\x42\x57\xf4\xa6\x7d\xcf\xf2\x43\x4c\xe6\x24\x70\x2d\xc7\x98\x39\xd2\x6a\x52\xb7\x80\xed\x50\x90\xdc\xe1\xf9\x06\x92\x42\xb0\xe0\x5a\x9e\x28\xe6\x0e\x59\x4d\xf1\x6b\x34\x18\x5c\x47\x76\x7f\x6a\x56\x71\xec\x25\x6f\xcd\xf6\x1a\xb1\x21\x3c\xe9\xce\x7b\x23\xcb\x62\x07\x18\x82\xa1\x02\xb0\xe3\x00\xe3\xa0\x3e\x04\xc0\xe1\x28\xb5\x99\x41\x64\x77\x32\xd9\xb2\x83\x1c\xa6\x86\x2f\x15\x34\x28\x1d\xb2\xa7\x9a\x69\x09\xf3\x80\x2b\x12\x37\x67\xf3\x49\x48\xbe\x1b\x2c\x9b\xda\x51\x89\x51\xe2\xec\xef\xc0\xb7\xf4\x20\xd1\xd2\x74\xbc\xa3\x5d\x47\xc0\x4d\xaa\xde\x64\xb4\xd1\xac\x2f\x82\xb5\xe5\x40\xad\x66\x7e\x6b\xa6\x25\xb5\x99\x18\x7e\x8a\xc8\xc9\xf8\xe7\x22\xea\x14\x98\xe5\xcb\xb8\xf3\xee\xd4\xcc\x4a\x6c\xa4\x55\x1d\x67\xd9\xb2\xa2\x3b\xd8\x17\x3b\x31\x78\x33\x63\x83\xbd\x72\x3c\x59\x71\xc9\xed\x46\x4a\xbc\x83\xb3\xc7\xa9\xcb\xe8\x2c\x35\x5b\xa2\x63\x4b\x74\x36\x95\xc8\x74\x57\x76\x34\xfd\x32\x95\xfd\x52\xac\xf9\xb8\x83\x28\x80\x21\x61\x85\xb0\x91\x6d\x77\xb6\x90\x82\x9d\x78\x80\xa4\xe6\x4e\x95\x80\x92\x74\xe8\x59\xd1\x69\xf0\x0a\x00\xeb\x2b\xe8\x2f\xc9\x35\xaf\xda\xc4\xc8\x6d\x6b\xd7\x37\xf4\x81\xab\x39\xeb\x2a\x54\x65\x70\x14\xc7\x94\x30\x37\x7e\xa0\x05\xcc\xf0\x13\x2a\x7e\xf4\x48\xad\xd6\x56\x8d\x4c\xaa\x1b\x7e\x36\xd2\x9b\x56\xcb\xf7\xd3\x40\xe1\x28\x13\x9b\x86\x5a\x09\x27\xd6\xdd\x54\x4e\x57\xf9\x58\x4e\x68\xcd\x37\x8c\x6d\xb3\x79\x61\x72\x90\xdd\x84\xcc\x4a\x40\x5a\x07\x98\x24\x14\x84\x92\x9e\x1c\x40\x36\xc0\x74\x10\x66\x42\x52\xb2\x3f\x30\xcd\x18\x0f\x27\x25\xdd\x36\x85\xf2\x4d\x02\xb9\x8b\x7f\x94\xd5\x40\x00\xbb\xd0\x1d\x77\x4c\xc3\xf1\x1a\x96\xa4\xbe\xd7\x21\x25\xf6\x2e\x61\xbc\x27\xab\x31\x43\x04\xea\x6f\x52\x76\x27\xce\x9e\x74\x56\x15\x6d\x9d\x74\xb8\x1d\x4f\x13\x20\x14\xe6\x19\x40\x7a\x1d\x03\xf2\x65\x1e\xe4\x00\xc8\x88\xae\xd1\xc9\x78\xd4\x4f\x4d\x79\xd5\x25\x70\xad\x11\x69\xa3\x9b\x8a\x29\x26\x3f\x85\x2b\x8b\xe6\xbf\xab\x4c\xfe\x15\xe5\xe3\x12\xf7\x1e\x2f\x82\x37\x01\xf8\x6e\x11\x6d\x6c\x19\xdb\xd3\x3a\xde\xdd\x92\xbd\x60\x0a\x3f\x4a\x5f\xe4\x5a\x16\xf2\x8e\xe6\x12\x98\xf4\x2e\xcb\x01\x43\x4a\xad\x09\xf5\x2f\xc1\x24\x7c\x15\xdf\xb4\x94\xbc\x78\x07\x94\x58\x00\x81\xd3\x47\x2a\x7d\xa7\x68\xbc\x83\xb3\x81\x47\xc8\x3b\x49\x23\xed\xe9\x4a\x11\x51\xa9\x2b\xcc\x4a\x14\x90\x89\x4c\xe6\x14\x27\x4b\x85\x8d\x81\x02\x1c\xd7\xf1\x43\xc1\x11\xe0\xc4\x91\x07\xe1\xfb\xa0\xaa\xfb\x1b\x1b\x6b\x3a\xd6\x5a\x83\x9b\x3d\x7b\x16\xf8\x37\x75\xe0\xd7\xd0\xd6\x42\x80\x33\xc2\x15\x81\x1e\x09\xe5\xce\xba\xa7\x98\x6c\x33\xee\x81\x58\x8e\xda\xf9\x81\x8e\x41\xc4\xd9\x8b\x6d\x8b\x0e\x7e\xe3\xcd\x29\x84\xe5\x49\xe1\xcc\xf3\x78\x78\xf8\xe7\xe2\x1d\x05\x66\x43\x83\xef\x3b\xb2\xf6\xba\x13\x33\x06\x3f\x24\x6b\xfe\x21\x7e\x3c\x3a\xa6\x22\x86\x1e\x2a\x8a\xb5\x43\xb4\xba\xbf\xb1\x7d\x09\xa2\x9e\x02\xab\x10\xb2\xcd\x90\x14\x2e\x8e\x0e\x09\xfe\xa2\x4c\x67\xef\x3a\x9b\x06\xce\x7e\x34\x70\x32\x43\xa7\x23\xc7\x8e\x08\xe9\xf3\xae\x91\x18\x45\x9d\x7a\x71\x9a\xda\xbe\x8b\x2b\xa9\xfd\x78\xdb\x88\x06\xd0\x68\xdb\xc3\x3b\xd0\xc3\x02\xcf\xe9\xed\x2e\x18\x10\x48\x95\xc8\x85\x0b\x6d\xce\xeb\x94\xf9\x03\xec\xd9\x64\x68\x59\xc3\x40\x91\xa7\x44\x22\x86\x6c\x95\x25\x1f\x88\x92\x18\xad\x55\xe4\x7d\x1e\xec\x34\x21\xbd\xd2\xcc\x3d\x3e\x73\x9b\x5a\x7b\xa1\x77\x05\xd1\x9f\x3a\xb9\xab\x01\xb0\x60\x06\x6f\x9b\xb0\x1f\x48\xab\xa4\xab\x8a\xf8\xdb\x2c\x57\xe5\x8a\x3c\x24\xcc\xaf\x35\xfe\x5a\x9b\x7c\xba\x63\x6b\xd2\xba\x6b\xfc\x05\x2f\x5f\xb6\xc9\x16\x8d\x7b\x50\x08\x4e\x84\x30\xf8\x3a\xa3\x81\xeb\x23\x1c\xdc\x13\x2f\x0d\xac\xf3\x15\x81\xbe\x58\xb5\x11\x46\xaf\x1f\x78\x61\x77\x4e\x3e\x5f\x5a\x7e\xcd\x21\x7c\x7d\x5f\x81\xf7\x57\x24\xe8\xb4\x25\x78\x0e\x47\x1a\x51\x71\x91\x67\x98\x83\xc4\x7a\xcf\x15\x11\x93\x7b\x15\xfa\x9b\x51\xb1\xc7\x58\x2c\x8d\xf2\x31\x56\x47\x56\x71\x3d\x34\xb9\xa1\x9d\x7c\x43\x13\x82\x7a\x87\x86\xee\x4c\xd5\xe6\x86\xee\xcc\x3b\xd1\xd0\x35\xf6\xe8\x5a\x37\x74\xbd\xa1\x47\x15\xb8\x81\xfe\xd9\x7b\x74\xfd\xf3\xf7\xe8\xba\x93\x6f\x68\xb6\x47\xb7\x6a\xe8\x6d\x7a\x34\xd3\xd0\x9b\xf6\x28\xaa\x12\x6d\xc2\x49\x02\xa2\x90\x57\x7a\x56\x87\x20\x22\xf6\x81\x9e\xbb\x66\xb8\x7a\xe5\x7a\x7d\x08\x12\xc3\x66\xac\xb5\x8e\xcc\x68\x61\x45\x64\xb7\xaf\x56\x37\x8d\xb6\x93\x43\xdb\x49\xa2\x65\x41\xe7\x5d\xf7\x9c\x6b\x40\xe0\x72\xf5\xeb\x95\xd9\x3a\x2c\xbf\x7e\xfa\x0a\xc4\xd5\xe0\x0b\x80\xb2\x81\x0f\x5d\x6e\x91\x79\x2c\x42\xcb\x58\x7c\x63\x7d\x50\x8e\xc9\x0e\x4a\xff\xba\xf2\xb6\x45\x04\x22\x9f\xbc\xbb\x5a\xce\xae\x96\x61\x37\x11\x58\x9d\xc1\x5b\xd7\xe5\x68\x98\xb8\x12\xe1\x5e\xad\x45\x33\x2c\x63\x0a\xb3\x5d\x61\xed\xe6\x6a\x1d\x26\x11\xc6\xf5\xb5\xe5\xef\x00\xe9\x16\x64\x9e\x85\x14\xde\x29\xe7\x6f\xae\xf4\x2d\x1d\xb7\x52\x9f\x30\x67\x28\xca\x24\x71\xc7\xc7\x98\x84\xff\xf1\x8d\xb0\xa8\x1f\x28\x1e\xc6\xfe\x99\xdd\xfb\xae\xfd\x27\x28\x77\xab\x0e\x7d\xf2\xae\x7c\xed\x3f\xd5\xce\x73\x13\x07\x1b\x9e\x73\x49\x47\x46\x4f\x4f\xa0\x5a\x1c\x7d\x92\x84\x6a\x11\xbb\x6a\x27\x64\xdc\xe6\x76\x7f\xf1\x99\xf9\xfd\xd0\x6c\x16\x4f\xd9\x9e\x9d\x8e\x06\x27\xdb\xbe\xdd\x92\x9d\xbe\xc5\x47\xa9\x67\xb8\x64\xdb\x47\xec\xba\xca\xc1\xb5\xd8\x70\x97\xc0\xea\x0e\x0e\x2e\xaf\x4e\x38\x47\xf4\x45\xe6\x26\xc1\x3f\xcb\xb5\xbf\x91\x6f\xbb\x66\x86\xb4\x10\xec\x78\x63\xcf\xdb\xc9\xf4\x94\xda\xed\x26\x9f\xa0\xcc\x75\x5e\x86\xa8\x9b\xdc\xc1\x1b\xe2\x0f\xeb\xef\xc0\x33\xd2\xcc\xc2\x7a\x83\xb3\x50\x6c\xa0\x93\xf8\xbf\xc4\x57\xda\xd8\x06\x5d\x1c\x17\x8b\xdc\xfd\x02\xbe\x36\x4e\xb8\xcc\xb6\x87\x8b\x54\xd8\x8c\x72\xf7\xac\x24\xa6\x9b\x59\xa0\x77\xbf\xc2\xb6\xab\x51\x17\x4d\x4d\xe9\x16\x6e\xb8\x3f\xb8\x6b\x94\x97\x2a\x2a\x36\xdc\x11\xd3\xe0\xc9\xeb\x72\xc9\x5b\x1e\xf9\xbb\x65\x7a\x14\xcd\xc2\x5d\xdf\xfb\x49\x91\x71\x3c\xa1\x70\x53\x33\x15\xfc\xb8\x2a\x82\x8b\x64\xa9\x83\x7b\x4b\x5b\x88\xeb\x22\xf6\x53\xb9\x76\xf5\x80\x1a\x72\xcd\x17\xd2\x4d\x89\x47\xc5\x18\x50\xbe\x0d\x7b\xa9\x8b\x60\x6f\x53\xf1\xaf\x79\x03\xbc\x4e\xbf\xd0\x80\xde\xdc\x8f\x0b\xfb\xce\x79\x0f\x8c\x4a\x07\x7d\x36\xe2\xcd\xea\xa4\x10\xed\xef\xbf\x9f\x04\x1d\x97\x7f\xa0\xa1\x6b\x2b\xcc\xa1\x44\x55\xb0\xd9\x8c\x50\xaa\x2f\x71\x6d\x3e\xcc\xfe\x18\x2e\x68\xa6\x9f\xe0\x30\xa8\x1d\xea\x74\xda\x38\xb9\x8b\xe3\x9e\x1d\x01\x25\x0d\x80\xb2\xa3\x4f\x0d\x42\x5f\x3e\x10\x10\xe8\x63\xdf\x9b\xce\x61\xb5\xa1\x3a\x1c\xfe\x7a\x1d\xe9\xab\x21\x1a\x06\x51\x04\xd4\xf1\x48\x8e\xa7\xd2\x0b\xbc\x90\xef\xe8\xa4\xa0\xfb\x7f\x16\xae\x69\xd1\x15\x21\x15\x45\x04\xfe\x17\x58\xb2\x4b\xf4\x66\x40\xd3\x38\xfd\xbc\x5f\x3c\x81\x0d\xe9\x21\xae\x77\x25\x5e\xaa\x79\x02\xe2\xf3\xd0\x2c\x82\xc1\xcd\x5e\x76\x42\xc2\xd6\x99\x7f\xf6\x05\x1d\xfb\xc5\x03\x78\x57\xe6\x01\xb5\xae\x94\x87\x51\x89\xe1\xb1\xd9\xb9\x4d\x76\x5d\xfa\xae\xa5\xbd\xc6\xa9\x23\x62\xf9\x98\x58\x6d\x1d\xee\x7f\x85\x1e\xd8\xeb\xb6\x1b\x8d\x6b\xfc\xd5\xc9\x8e\x13\x22\x2d\xc4\x1e\xdd\x22\x45\x80\xe8\x52\x14\xa6\x86\xa8\x51\x8f\x86\x37\x20\xd6\xf0\xcf\x35\xfc\xb3\xc2\x2f\xf8\x68\x14\xe7\xc3\xf9\x62\x19\x9c\xbb\xef\x72\xcf\x33\x78\x41\xc4\x53\xcb\x8e\x7f\xd1\x8d\xb8\x42\x5d\xd2\x29\x88\x80\x68\xa9\xbf\x3e\x8b\xb5\xf1\x15\xa4\xad\xe1\x1f\xe9\xd4\x9c\xa2\x39\xbc\x61\x28\xef\xbc\x87\x4a\x82\x7d\xa0\xc3\xf2\x28\x3e\x1c\x3f\x3b\xc3\xe3\x08\xa3\xa1\x6b\x0d\xa7\x45\x17\x6f\xf4\x02\xa1\x2f\x70\x05\x05\xec\x35\xc3\xc4\x70\xab\xbe\xe1\x4a\x74\x54\x1d\xc4\x24\xf9\xf0\x22\x39\x9a\x56\xd6\x2a\x3d\x2e\x57\xb5\x66\x6a\xab\xc6\x11\x8a\xc7\xa6\x71\xe9\xec\x95\x6c\xc2\xfa\xf6\xf8\xd6\xf5\xe0\x12\xe7\xb5\xe5\x81\x1a\xf1\x99\x31\x26\x2f\xcc\x02\x5c\x11\xee\x55\x70\x8c\xe9\x8e\x5f\xe1\x53\x2e\x2b\xec\x72\x18\x56\x38\x35\x60\x09\x93\x9d\x69\xc7\x66\xe4\x4a\x92\x3c\xcc\xdf\xac\x48\x55\xcd\x57\x3d\x18\x32\x41\x84\xae\xed\x48\x4c\x62\x4a\xad\x88\xf6\x99\xcb\x70\x9d\x2c\x0f\x13\xa7\xb3\xab\x43\x90\x0d\x51\xf2\xda\x48\xe5\xb3\x20\xf5\x63\x08\xd6\xcd\x21\x4c\xe3\x0b\xd1\xe9\x85\x38\x56\x22\xbc\x33\x51\xe2\x58\x1d\xf7\xcb\xd7\x89\x17\xa0\x6e\x78\x34\x3c\x6a\xa1\x21\x16\xfe\xac\x37\x1c\x0b\x27\xca\x76\xa9\x6c\x37\x51\x96\x08\xdd\x74\xa0\x0a\xff\xb3\x3b\xa0\x68\xe8\x29\x1b\xd4\x0d\x1d\x4a\x36\x8d\xc3\x4d\x04\x6c\x50\x8a\x56\x6e\x6a\xd9\x99\x25\x27\x56\xf5\xed\x54\x75\xb2\x80\x7a\xca\x4c\xaa\x29\xa1\x63\x1a\x9c\xc7\xcc\xe8\x3c\x66\xe5\x8f\x63\x94\xa6\xc2\xbe\x56\xf7\xe1\x15\x70\x01\xdd\xc9\x42\x1f\x80\x1b\xa7\x83\xc6\xab\x86\xeb\x3c\x6e\x80\x04\xfc\x61\x3a\xd4\xc7\x27\x13\xe9\x87\x89\xd2\x4f\x12\x69\x15\x0c\x87\x21\x5c\x7e\xac\x42\x64\x61\x15\x3a\xdc\xb4\x0a\x85\xb0\x84\x17\xf7\xcd\x3a\xdf\xf5\x49\xdd\x86\x38\xc8\xb4\xd5\x97\xa8\x4a\x19\xb0\x27\xf0\xbb\x09\xbf\x0e\x11\xd1\xf1\xb1\xbc\x7b\x59\xd2\x1b\x46\x9c\xd1\xc1\xeb\x9c\xee\x2d\x25\x9f\x71\xe0\xef\x79\x76\xa9\x84\x78\xa8\xd8\xb7\x29\x1d\x07\x75\x32\xec\xd5\x66\xf3\x29\x04\xf1\x7a\xba\xd4\x17\x5a\xf8\x0c\x84\xdf\xdc\x03\x97\xf1\xfb\xb4\x6d\xb1\xb7\x11\xa8\x98\x41\xf7\xf5\xd5\x12\x9e\x86\x14\x88\x1a\xf8\xf6\xe5\xb8\xc6\x07\x83\x96\x05\x66\xed\x65\xcf\x5b\xf5\x76\xed\x99\x8e\xe5\x59\x65\x95\x03\xb2\xee\x01\x35\x77\xe9\x8d\x43\xa0\xce\x7f\x7b\xeb\x1c\x17\x40\x0a\x4c\x55\x67\xf4\x08\x24\xb6\xc2\x95\x83\xe4\x8e\x4c\xae\xab\x39\xc2\x28\x66\x47\x55\xcc\x43\x9f\x93\xa7\xf3\x41\xe9\x9b\x2a\x98\x98\xbb\x18\x00\x73\xbe\xc6\x99\xfb\xfa\x16\x14\x5e\x55\x6a\x14\xcf\x60\xd7\x08\x4e\xe7\xd6\x37\xbe\x86\xbe\x09\x70\x1f\x10\x53\xc0\x4d\xf1\x3f\xda\xea\xe8\xfb\x19\x14\x9d\x04\xf3\xdb\x6c\x43\xdf\x97\xf3\x7e\xf2\xf0\xf0\xa7\xff\xd0\xe5\x0d\x72\xaa\xe4\xae\x7e\x3c\xc1\xa3\x15\x07\x99\xa6\xb0\xba\x94\x05\x31\x9c\x27\x4c\x55\x53\xe4\x5a\x87\x56\xfd\xf8\x17\x51\xb5\x31\x0a\x2e\x51\xd9\x3e\x03\xed\x87\x10\xaf\x23\x42\xc4\x75\x80\x55\x83\xa0\x91\x62\xff\x3e\x0a\xb6\xac\x66\x9f\x67\x21\x7c\x77\x2d\x24\xb5\x77\x82\x37\xca\xb0\xf5\xf5\xba\x7a\x47\xc8\xdb\x2e\x89\x66\x3b\x1a\x6a\xd6\xc0\xae\x46\x41\xca\xc8\x1e\x38\x1b\xe3\x94\x4b\x0e\x21\xb2\xaf\xd6\x5b\xf3\x52\x7a\x5a\x28\x10\x80\xe0\x8a\xcb\x51\x77\x30\x4f\x3e\x01\xed\x2a\x4c\x10\x58\x33\xe8\x29\x9e\x09\xd8\x76\xd1\xcc\x5b\xc7\xd7\x91\x8c\xac\x3a\x29\x9a\x2d\x93\x74\xff\xf3\xd6\xaf\x20\xd5\x4d\x55\x93\x71\xf0\x45\xeb\x61\xa3\x78\xf0\xb0\xf5\x10\x72\x16\x78\x24\xde\x69\xff\xaa\xed\x4d\xc2\x8a\xaa\xef\x16\x49\x4e\xa0\x9e\x34\x7d\x3f\x98\x3f\xf8\x9c\x0c\x82\xbe\x84\x5d\x3f\x71\x3b\x3e\x2a\x17\x97\xa5\x87\xc8\xb7\xa0\xf3\xf0\x41\xd4\x04\x33\x79\x1e\x7e\x4e\x74\xca\x16\x3c\x34\xf4\x7f\xf6\xd0\x69\xad\x50\xcf\x45\xf9\xbe\x1c\x0e\xb7\xab\xe7\x57\x51\x3d\x46\x18\x76\xbe\x68\x7d\x11\xd6\xf3\xb9\x49\xfe\x5c\x55\xe3\xae\x69\x99\x3f\x2f\xad\xc9\xde\x8e\xf0\xd0\x23\x3a\xdc\x47\xd8\xbd\x8a\x55\xba\xf5\x02\xff\xb1\x61\xf9\xf9\x82\x2a\x21\xd6\xf1\x07\xb5\x4f\x6c\x1c\xfd\x63\x80\xb6\x97\x6a\xbd\xe9\x74\xde\x1f\x4e\x4c\x33\x17\x7a\xda\x51\x08\x76\x97\x49\x47\x15\x41\x9a\xb7\x8b\x59\x32\xa5\x49\xae\x26\x49\xb3\xc1\xab\xe9\x7e\x0a\x59\x52\x3c\xad\x71\xae\xa0\x5d\xab\x4e\x56\x2a\xfb\x56\x71\xbc\x45\xdb\xa4\x84\x50\xc9\x36\x12\x6e\x1f\x31\x95\x3c\xa8\xc1\x4f\x49\x24\x2e\xe7\xe5\x64\x81\x06\x25\x8e\x4a\x5f\xd3\x3c\x01\x4f\x22\xbc\x8f\x78\x0f\x5e\xcc\x5f\x87\x00\x1d\x02\xe8\x10\x40\xd0\x84\xda\x1a\x6e\x8c\xb4\x3a\x07\x6c\xb3\x28\x5a\x07\xf7\x1f\x90\x55\xc3\xa4\x37\x5b\x0f\x0e\x1e\xb2\x8d\xc3\x7c\x1c\x74\x1e\xc0\x32\x4f\x33\xc3\xa8\xf6\x54\xf4\xb3\xcf\x32\x65\x01\xdc\x95\xed\x74\x1e\xe2\xd5\x7c\x1c\xed\x87\xb6\x6d\x75\x17\xff\x50\x70\x47\x09\x3e\xcf\x52\x77\xd2\xe4\x83\x70\xf3\xc9\x94\xe4\x26\x23\x76\x63\xdc\x71\x96\x1e\x1c\xe3\x22\x76\x90\x3a\x30\xfa\x8c\xa0\x88\x5e\x07\x45\x9f\x01\x54\xc0\xd1\x60\xda\x54\x4c\xab\x42\x13\x9b\xd3\xd1\x25\xa5\x39\x18\x49\x67\x1a\x66\x87\x78\x6e\x8a\x28\x02\xae\xe5\x29\x4a\x01\x28\x72\x62\x80\x8f\xc9\x23\xab\xad\xc8\xc9\xec\x75\x14\x45\x19\x18\x45\x54\x12\x66\x07\x87\xd9\x98\xaa\x68\x73\x17\xd1\x14\x41\x44\x14\x85\x91\xea\x76\x3d\xa2\x0b\x86\x53\xee\x98\x28\x18\x51\x39\xb0\x60\x50\xa5\xc1\x76\x3c\xaa\x4b\x51\x58\xcd\xb9\x1c\x50\x8a\xba\xea\x48\x7f\x91\x44\x99\x99\x8d\xdc\x70\x41\x77\x0c\x77\xdf\x07\x58\xc9\xe2\xb0\xf8\xaa\xe3\x2c\x6f\x6d\x64\x49\x93\xca\x62\xf1\x92\xca\xb2\xbb\x60\x4b\x7b\x4e\x46\xc2\xfa\x71\xab\xd6\xf0\x0a\x14\xb6\x84\x92\xa3\x56\x70\xb2\x51\x59\x5b\xf7\x1f\x86\xed\x08\xcb\x84\x6d\x10\x0b\x5b\x62\xa9\xcb\x2d\x03\x0e\xe4\x56\xcd\x14\x15\x1d\x6d\x5a\x8b\x57\xd6\x73\x82\x16\x57\x74\x93\x08\xf8\xf3\xc2\x1a\xc9\x23\xf4\x67\x75\xe1\xfe\x82\x7e\x0d\xe0\xc1\xd7\x7a\xf0\xf0\xa1\x61\x1a\x2e\xd7\x4d\x58\x37\x3f\x87\x2f\xf6\xf2\x30\xfb\x03\x99\xbf\x2f\xf2\x51\xf1\xa5\xd5\x47\xa8\x72\xf5\x96\xb2\x22\x0b\x9d\xc6\xaf\x6c\x9e\x22\xa6\xe0\x7e\xfb\x57\xb2\x86\x76\x87\x6a\xc8\x90\x7b\x80\xe4\x18\x48\xf0\xd5\xc5\x12\x9d\x03\x97\x62\xe9\x86\x96\x98\x35\x1f\x92\x9b\x1e\x10\x94\x02\x9b\xb4\x65\x0b\x84\xe2\xe5\x57\xdd\xa8\x05\x07\x6d\xc5\x23\x26\x28\xd3\x02\x4b\x98\x6c\xc1\x67\x9f\xa5\x9a\x00\x9a\xca\xed\x9b\x50\x39\x61\xa3\x99\x90\xda\xcc\x08\xf7\xaa\x99\xd9\x5e\xc2\x76\xe0\xe5\xd5\xb8\x11\xa6\xbd\xb0\x4e\x23\x41\xba\xd3\xef\x59\x0d\x51\xb1\xcc\xf4\xdb\x92\x3a\x3d\x8e\x7c\xb6\xed\xdb\x91\x01\x49\xf2\x20\x33\x80\x48\xbd\xfe\x68\xf3\x6e\xf3\xba\xe4\x36\xf8\xe3\xc7\xa9\x5c\x8e\xdd\x41\x70\xeb\x33\xc4\xcb\x17\xe7\xd3\x0d\xbf\x57\x1c\xc8\x28\x1a\x47\x09\xc3\x4d\xd4\xda\xc0\x1f\x0e\xbd\x84\xdc\xd3\x67\x84\x2c\x47\x6e\x46\xc3\xcc\x81\x47\x0f\x9b\xad\xf0\x22\x29\x3d\xa0\x84\xd5\x92\xcb\xe9\xb1\x35\x74\xe4\xdf\xdc\xaa\xac\xd0\x72\x63\x9f\x1f\xc0\x72\x4f\x5d\xad\x7d\xc5\xb6\x4a\x51\x59\xb2\xa9\x5b\x3e\x4d\x66\xf9\x26\x17\x8f\x8f\xf1\x5c\xfa\x12\xde\x3c\x5f\x88\x07\x65\x7d\xe2\xeb\x54\xa2\x78\x41\x56\x40\x76\x12\xb3\x94\xb2\x12\x73\x4f\x03\xbc\xf0\x8e\x5b\xb7\x99\x8a\xa9\x2c\x59\xa6\x6a\xf0\x09\x42\x54\x37\xc2\xfa\x09\x5b\xb6\x04\xbb\xea\xa9\x44\xe8\xc1\x23\x51\xf2\x71\x8a\x7d\xa9\x92\x1d\x5d\x72\x9d\xaa\xf3\x75\xaa\xce\xd7\x62\xb4\x50\xc9\x44\x9d\xaf\x53\x75\xe2\xc3\xd6\xeb\x9c\x2d\x15\xe1\xf8\xe0\x56\xcc\x45\xec\x43\x0a\x2a\xa0\x45\x06\xc1\x72\xb8\x81\x07\xad\x87\xf5\x86\x0f\x00\x69\xbd\xdc\xe8\x69\x99\xb4\xbd\x45\x79\xef\x6d\xda\x08\x2d\xc4\xde\xae\x10\x51\x97\x55\x4c\xfa\x38\xa4\x58\xe0\xeb\xb7\xc5\x36\x62\xa1\xb6\x23\x85\x8b\x6a\xcf\xb3\x39\xaa\x6a\xa3\xd6\x9f\x43\x78\x54\xd9\xb6\x44\x3d\x26\x95\x6e\x98\xe4\xbc\x69\xb7\xeb\xa9\xb3\xf8\x4a\x4c\xc6\x77\x77\x3e\x58\x5c\x8d\x72\x7c\x42\xff\x23\x0a\x2a\x9c\x0a\xae\x8f\x17\x63\xb0\xbc\x73\x98\x6c\xa1\x13\xc1\xde\x9e\xda\xc6\x44\x23\x46\x11\x46\x18\x12\x3b\x9a\xa4\x5c\x4e\xf9\x94\x70\xd5\x78\x68\xbe\xf7\xf5\x5e\x03\xc4\xed\x5e\x63\x0f\x5f\x18\x16\xfc\x4a\x9f\x3b\xe9\x51\xb6\x35\x66\xd7\xc0\xdc\xa0\xad\xae\xac\xaa\x9e\xe7\x89\x7a\x02\x3c\xb1\x5f\x48\x7e\x7c\xa5\x8b\x5a\x2f\xbd\x0c\x0d\xdf\xef\xa9\x8a\xa3\x31\x54\x2d\x5b\x92\xe1\x49\x18\xc7\xde\xb8\xdd\xd8\x33\x0a\x27\xdf\x9f\xda\x2f\xf6\x4a\xfd\x19\xe4\x16\xed\xa2\xd3\xe8\x14\x54\xa8\x09\xfa\xef\x8d\x4a\xea\x82\x1f\xf6\x32\xab\xe6\xb3\x41\xf0\xae\x79\xbc\xba\x3d\x1b\x6c\xf1\x8c\xb9\x04\x7c\x3e\xac\x7c\xca\x3c\x04\xdd\xf9\x39\x73\x89\x20\xa7\x14\x3e\x0b\xdf\xa1\xbd\xa1\xe2\xf9\x2c\xf3\x8a\x69\xc4\x98\x84\x5e\xb9\x2d\x8d\x91\xc8\xcf\xe1\x88\x14\xdc\x67\xa9\x17\x58\x2b\xd5\x53\x45\xb3\x9a\x94\x7d\xfd\xf6\x25\x3d\x3c\xbe\x3a\x4a\xe5\xd1\x73\xe2\xbc\x5a\x47\x2f\x99\x7f\x9f\x7d\xf7\x3b\xd9\xe8\xc4\x9d\x91\x48\x33\x8e\x7a\x61\xb3\x76\x1c\x15\xc9\x3d\xae\x9d\xe0\x8a\xd2\x60\xeb\xbb\xe9\xcb\x38\xbf\xc0\xba\x40\x9a\x31\x5f\xea\xa3\xb7\x5f\xe5\x5b\xb2\x70\x30\xda\x5f\xe1\xb5\x1d\xf0\x8a\x5c\xe3\x3d\x9d\xe8\xd6\xb0\x7a\x18\xf5\x83\x7b\x18\x75\x55\x97\xc1\x05\xc3\xde\xf1\xc0\xf8\x2a\xea\xba\x0a\x98\x9e\x44\x0d\x9f\x6b\xdd\x96\x27\x5b\xf6\x73\xe2\x91\xe9\x9d\xe7\xd6\xa6\x7a\x6e\xb8\xe7\xfa\x47\x8f\xac\xdc\xa6\xec\xff\xa9\x51\xf6\xa1\xc8\xee\x1e\x43\x92\x0e\x42\x92\x72\xe4\x1c\x84\xe4\xe4\x48\x71\x80\xf7\x6f\x3e\xe8\x37\x89\xe8\x1b\xed\x67\x93\xa3\x7b\x3a\x59\x9a\x82\xb5\x1e\xfd\x8d\xb6\x30\x2e\xc4\x99\xd9\xaa\xfc\xff\x9b\x93\x0d\x08\x7f\xa1\xcd\x89\xeb\x83\xb3\x5d\xf7\x20\x7e\x47\xbf\x9d\xde\xcf\xa3\xa0\x35\x9e\x5e\x0f\xfe\x30\xad\xc1\x94\x16\x14\x48\x25\xdd\x42\x96\xf3\x1e\xe2\x68\x68\x40\x70\x28\xfa\xcf\x1b\x6c\x0f\x42\x02\x7e\xf6\x7d\x81\xad\x00\x7a\x4c\x57\xf0\x0f\xd8\x10\xd8\xca\x7b\xa3\xe9\x62\xf0\xc2\xcc\xbe\xda\xee\x7b\x02\xd3\xb5\xe5\x78\x06\xf1\xc9\xc8\x65\x4d\xce\xd8\x1f\xff\x06\x81\x4a\xc0\xdf\xa5\x37\x5d\x7c\x3d\x9c\x7c\x35\x5c\x2c\xcb\x49\x6f\x50\x88\x08\x86\xf7\xdb\x3a\xac\x60\xa3\x18\x97\xab\xaf\x06\xb3\xe5\x05\xf8\x6d\x7d\x16\x0c\x12\x57\x5b\x78\x6a\x6e\x3d\x01\x5c\xe1\x27\x0e\xf6\xdb\x41\xef\x6a\xbe\x18\x5e\x0f\x8a\x43\x97\xf6\xcd\x74\x32\xa8\xeb\xb3\xef\x8f\xe9\x9a\x00\x32\x57\x1b\xb3\x00\x6d\xfa\xe7\xd3\xf9\x98\xc4\x9d\xbd\xf6\x9b\x3d\x32\xc7\x97\x25\x89\x5b\xe1\x01\xf7\x42\x1d\x7e\x87\x0f\x92\x17\xee\xc1\xe3\x0c\xb1\xae\xa9\x49\xaf\x82\x1f\xff\xde\xa6\xe0\x22\xa8\x1d\x58\x3d\xa1\x84\x7f\xba\x18\xcd\xb0\x4d\xf1\x50\x1a\xee\x26\x73\x89\x59\x90\x73\x24\xf0\xd8\xda\x8a\xff\xe2\xcb\x9c\x8b\x4d\x67\xbf\x96\xd0\x4d\xcf\x38\xee\x76\xfc\xbb\xa8\x3e\xd2\x4d\x56\x3a\x0a\xd7\x91\xaa\x5b\x76\xe9\x5b\x35\xb7\x19\x35\x61\x0d\xe9\x9b\x32\xab\x20\x02\xbf\x68\x4b\xc5\xfd\x99\x45\xd6\x17\xa1\xe2\x92\x47\xfa\xfd\xb7\x54\xdc\x5e\xf9\xc6\x0d\xf9\xc2\x5a\x26\xc4\xcf\x88\x31\xb5\xcf\x59\x96\xf2\x20\xc6\x11\xed\x47\x72\x83\xda\x39\xf3\x17\xca\x67\x78\x99\xdc\x47\x8b\x2d\x31\x04\x19\xdd\x21\xa4\x9f\x90\x4f\x81\xc9\x4e\x0e\x4e\xbd\x84\xb2\x17\xc7\xb3\x5d\x81\x14\x54\xf3\x23\xbc\xfc\x13\xb1\x7c\x96\x65\x77\xf5\x8d\x9a\xf4\xab\x68\x49\x97\x91\xa8\x4e\x28\x1b\x74\xb3\x1a\xd6\xc9\xc7\x4e\x93\x14\xe4\xba\x5b\x0e\x85\xb6\x65\x3c\x88\x26\xf0\x4f\x85\x30\xa4\x76\xe7\xe0\x77\x0d\x28\xaa\xe0\x2c\x98\xe4\x15\x58\x24\x49\x68\x41\xbf\xb4\x77\x19\xb4\x5b\xbd\xf3\xb6\xfd\x68\xb2\x92\x94\xe4\x6b\x20\x4f\x2b\xc6\x4a\x82\xa5\x91\xe2\x96\xed\x67\x6f\x5b\x45\x1c\x95\xcb\xc2\xc6\x26\x70\xc0\x0a\x8c\x82\x55\x9a\xff\xba\x18\x01\x0d\xa2\xbb\x49\xca\x13\x9b\xb1\x8e\xda\x8d\x75\x78\x3b\xd6\xc7\xf0\x6b\xe1\x2e\xcc\xb6\x00\xa3\x91\xc0\x33\x37\x70\x1c\x0d\x2a\x02\x5c\x7b\x85\x8a\x9a\xcd\xd4\x75\xd2\x12\x76\x37\x48\x14\xf6\xb8\xf9\x40\xea\xb0\xd3\xcd\x07\x90\x39\x56\xdb\xbf\xd2\xa0\x85\x8b\x97\x5d\xf3\xb7\x0b\x10\x10\xba\x1c\x83\xd1\x1e\x58\x38\x74\x66\xee\x41\xdc\x15\xf0\x8f\xfb\xf1\xef\x90\x01\x27\xa1\x18\x1f\x99\x42\xa6\xd1\x05\x0a\xb8\x01\xea\x5e\x9d\x71\xcf\xc7\x18\xe5\x02\x93\xf6\x29\xe9\x1e\xde\xc1\x10\xde\xd3\x10\x1f\x29\x12\x56\x07\x48\x01\x8c\xec\x03\x2f\x7e\x0e\x9c\xf8\xe9\x63\xf2\xea\xc0\x31\x14\x3e\xd7\x07\x96\xa3\xb0\x83\x24\x3e\x22\x08\x31\x77\x2d\xa2\x89\x22\x57\x61\x97\x67\xfe\xb9\x57\x20\x7f\x81\xb7\xdc\x00\xbb\x27\x3e\xf0\xdd\x71\x50\x27\xb8\xa6\x51\xd0\xe0\xda\x72\xeb\x3e\x02\x83\x3a\x56\x82\xbf\x7c\x17\x7e\x75\xe1\x57\x0f\x83\xbf\x43\x50\x16\xad\xc6\x85\x71\x11\xb7\x1c\x6c\x07\xd0\x6e\xe4\x3a\xdc\xa5\x85\x3e\x80\xbe\xa5\xbf\xbd\x70\xcc\x1d\xa5\x16\x5e\x94\xad\x88\x26\xb9\xf2\x5a\x0a\x54\x45\x78\x99\xba\xb7\xf5\x58\x4f\xac\xd3\x4a\x33\xb6\x22\xe6\x56\xce\x57\x7e\xcc\x9a\xae\x72\x55\x0a\xfd\xb7\x46\x1a\x34\xb8\x26\x9d\xe1\xd5\x72\x98\x2b\x56\x29\xce\xc9\x80\xa3\x4f\x32\x79\x40\x3b\x3b\x68\xc3\x56\x3b\xb5\x6d\x4f\xee\xb3\x1b\x85\xbf\xa0\xd2\xb0\x9b\x06\x97\xf8\xd2\x46\xb9\xa1\x74\xf7\x59\xf6\x2e\x06\x2f\xc5\x76\xd0\xab\x37\xb0\xd1\x98\x76\xe5\x66\x81\x18\x15\xa6\x71\x34\xa0\xf5\x6c\x30\x3d\xd7\x54\x1d\x1f\x17\x7b\x16\xdf\x5e\x5d\x57\xdd\x12\x90\xb5\x7d\xf1\xd1\x2a\x67\xb3\xd1\xba\x06\xcf\xad\x43\x9c\x7d\xee\x93\x7a\x70\xf9\xf2\x8e\x20\x1c\x63\xa3\x8a\x6f\x0a\x1b\x53\x97\x6d\xf3\x53\x9c\xbe\x6b\x8a\x16\x15\xdb\x0e\x19\xcf\x2e\x37\xd4\x54\xc5\xa5\x9c\x84\xd7\x8d\xa3\x9d\xb4\xde\xa7\xcd\x50\xf2\x04\x77\x26\x42\x66\x26\xdc\x3f\x94\x67\x4b\x8a\x3a\xdd\xb2\x00\x43\x3d\x74\x89\x8b\x6b\x50\x03\x12\xa9\xec\xf9\xd3\x97\x4d\x94\x0a\xbb\xfc\x71\xc2\x1e\x1f\xa5\x7d\x9f\x48\x7b\xd5\x49\x94\x4d\xa4\x7d\x9f\x48\x7b\x75\x90\x28\x9b\x48\xfb\xfe\xe0\x16\x8c\xb4\xa6\xb4\x1c\x33\x45\x25\x10\x2a\x3f\x26\xf1\x5e\x0c\xd9\x48\x50\x9d\x00\xc3\x60\xfb\x31\x1f\x52\xd5\x74\x12\xe5\x3b\x71\x35\x49\xb0\x64\x35\xed\x64\x35\xed\x44\xf9\x76\x5c\x4d\x12\x8c\x9f\x0e\xc0\x17\x06\xcd\x3f\xc1\xc5\x23\x1c\x7b\x5d\xeb\xd5\xb2\xcd\x1c\x11\xee\x1d\x69\x07\x8c\x66\x2d\xed\x46\x92\x76\xf4\xf8\xdd\xe4\x7c\x38\x19\x2e\xa5\x91\x76\xa7\x71\x42\xa8\xa2\x51\x72\xe2\xb9\xb8\xd1\x23\x88\x9c\x03\xb7\xf5\x0a\xf2\xf1\xb9\x24\x0b\xfd\x3a\x70\xa3\xf5\xce\x17\xb7\xed\x50\x0d\x86\x05\x4f\xd5\x60\x10\x3f\x29\xce\xec\x9d\x09\x1f\x84\x1f\x68\x79\xa1\x58\x75\x56\xa7\x51\x36\xec\x9b\x7a\x0d\x9f\xe3\x15\xd2\x3f\x93\xa4\xe4\x11\x09\xd7\x1b\xb5\x86\xcb\x06\x16\x48\xdf\x14\x8f\xdb\xa0\xb4\x81\x4f\x9e\x14\x93\xc1\xfb\xa4\xaf\xce\x61\x98\x63\x4d\xe1\x67\x2a\x34\x6e\x62\x39\xbc\xb3\xf5\x72\x28\x7e\x87\x43\x29\xcb\x22\xad\x0e\xdc\xa0\xd3\x7d\x79\xd7\xeb\x0a\x25\xb7\xe8\x2c\x58\xd6\xa1\xeb\xe1\xe9\xb9\x8a\xc5\xfd\xcc\x68\xd3\xfb\x91\x6b\x36\x50\xad\x9a\x21\xf7\x43\x03\xb9\x1d\xd6\xeb\xb8\xbc\x71\x15\xa3\xfa\x24\x48\x16\x73\xa1\x16\xde\xd8\xab\xd5\xeb\x76\x64\x61\xfc\xa9\x7c\xb8\xb7\x78\x24\x27\xcc\xa8\xc2\xde\x16\x1a\x5d\x33\x36\x46\x3d\xdf\xd0\xd5\x18\x8d\xac\xfd\xc1\x9b\xf9\x60\x00\x86\x73\xf5\xed\x2e\xd9\x59\xf3\x62\x18\x64\xae\xda\xfe\xe9\x39\xf1\x2d\x19\x71\x6b\xa1\x99\x36\x3c\xf9\x61\x86\x39\xc3\xa9\x1c\x58\xe3\xc1\xf2\x62\xda\x0f\x9d\x4a\xb4\xd1\xfb\x30\x4f\x1a\x87\xb2\x16\x98\xc5\xb4\x72\xc9\xe1\xb5\x27\x11\x65\xea\xb2\x18\x4e\x0a\x47\x84\x2b\x71\x72\x79\x5a\x1c\xdb\x74\xf3\x21\xb7\xf1\x48\xa1\x83\xd4\x7a\xdc\xc7\x6c\xdf\x47\xc4\x70\x1b\x40\x41\xf5\xf7\xc4\xb4\xf5\x3d\x2c\x0a\xa3\x70\x39\x85\x19\x14\xfa\xb3\x64\x46\x86\x40\x1e\x5f\xb1\x62\x3b\x68\xc5\xd5\x2a\x59\x5c\x5f\x89\xfa\x18\x39\xca\x6c\x28\x1e\x59\xa2\x3e\x06\xde\x33\x5b\x94\x17\x96\x91\x8f\x5b\xba\xd4\x68\x06\xc4\x96\xe3\xed\x1c\x66\x12\x58\x24\x2d\x1b\xbb\x5c\x9f\x14\xf0\x65\xcd\xe4\x80\x4f\xd9\xd5\x2b\xef\xbe\x25\x7b\x27\x38\xb8\xdc\xf2\x74\x32\xb4\xe7\x6e\xf7\xd6\x6b\xd6\x42\xb9\xfb\x11\x69\xda\xb4\xbf\xf3\xc1\x68\xca\x54\xff\x31\x29\x91\x94\xfa\x11\x89\xb7\xa3\x14\x20\x87\x6c\x48\xc1\x73\x56\x52\xf0\xfb\xd5\x23\x90\xf8\x39\xd9\x6a\x43\x43\x24\x1a\xaa\xc5\xbd\x15\xe5\xd4\xd6\xe4\x41\x7b\x45\xbc\x09\x69\x08\xa0\xc4\x46\x41\xb7\xb7\x9d\x7a\xfa\x6d\xf0\xb9\xf3\xf2\x94\x3d\xca\x70\x6a\xed\x8a\xa2\x4c\xe0\xb5\x96\xbf\x19\x90\x1f\xff\x06\xae\x1e\x2b\x0a\x32\x71\xe9\x54\xd3\x3a\x3d\x7b\xd8\x79\xd8\xa6\x0b\x4e\x0f\x20\x20\x05\x98\x22\x0f\x1e\xa2\xe9\xa9\xe0\xb8\x1b\xf4\x97\x83\xf9\xe3\x2f\x91\xf6\x7f\xec\x2f\xaa\x07\xda\x35\x88\x03\xd2\xca\x77\x6d\x61\xc6\x2e\x96\x1e\xc6\x6a\x9d\x14\xd4\xd1\x3e\xe1\x49\x31\x27\x55\xd8\x5f\x4a\x5a\x24\xad\x22\x62\x40\x48\x71\xe0\x6f\x84\x2b\xee\x13\x10\x71\xc9\x9f\x9e\x36\xfc\xfb\x94\x89\xb7\xda\x04\x7f\x45\xe9\x80\xc7\x02\xc1\x65\x10\x6a\xc2\x47\x07\xc4\xdb\xce\xdb\x90\x69\x6f\x46\x7b\x72\x9b\x50\x19\xdf\xf2\xae\xe9\x2a\x31\x35\x79\x3d\x1d\xcc\x5e\x8a\x68\xa9\xcb\xe8\x26\x3b\x95\x46\x59\x48\x1c\x73\x13\x17\xb0\xc3\x90\xcb\xdb\x06\x5c\x76\x98\xb2\x6a\x10\x0f\xa4\x5a\x38\x7f\xdc\x91\x39\x8f\x22\x4b\x82\x78\x47\xb3\x22\x58\x73\xc2\xd5\xc2\xea\xeb\xbe\x99\x72\x20\xde\x60\x6b\x63\x4b\xfb\x7d\x9a\x9d\x12\x67\x62\x2b\x53\x93\xb5\x9c\x35\x72\xd3\xa5\x2e\x2c\x00\xfe\x69\x43\x55\xd8\x68\xf1\x95\x23\xd6\x0c\x23\xe0\x84\xb8\xea\x98\x6e\x72\x1c\xa0\x7b\xa7\x36\xeb\x28\xcf\x0a\xe1\x99\xdf\xbc\xb8\xa9\x7f\x06\x01\x96\x7c\xc3\xf8\xb6\x9e\x8b\x56\xed\xe2\x54\xbb\x08\xd5\x36\x36\x75\xe5\x66\x75\x9b\xb6\xde\xfc\x8a\xac\x8b\x9d\x70\x89\x6c\xdf\x66\x17\xe8\xab\xbd\xdd\xb5\xd5\x30\xf2\x86\xbb\x92\x6a\x13\xa2\x8b\xa9\xdb\x51\x45\x91\x44\x6e\x48\x12\x3d\xad\x2b\xc4\x89\x59\x19\x52\x82\xa4\xa0\xe5\x04\xc3\x1f\x7d\x5a\xdc\xff\x4c\xbb\xad\x58\x18\x5c\x56\x30\x16\x52\x1e\x66\xbb\x46\x91\xcc\xb8\x69\xa3\xfe\x16\x35\x0b\x97\xbc\x30\xc9\xac\x7d\x99\xb6\xfe\x6d\x9b\xd6\xf2\x32\xba\xa1\xbd\xbc\xc4\x9e\x31\x99\xc5\x63\x8c\xb3\x75\x76\x72\x90\x2a\x24\x9f\x8b\xac\x60\x94\xd1\xc2\xe6\x83\xee\xd0\x28\x74\xf2\x68\x22\x90\xaf\x8d\x62\xcf\x9d\xcf\xd8\xdb\x0e\x59\x5b\x80\x5a\xb6\xc4\xd2\x3f\x1d\x9b\x09\x3f\xa8\xcd\x83\x74\xfc\x86\x5e\x01\x4e\x11\x77\x89\xa1\x75\x47\x86\xba\x93\xed\xc6\x68\xc6\x7b\xc1\x2c\x8a\x05\x39\xb7\x12\x24\xaf\xcd\x3e\x9b\xdc\x5d\xf7\x6d\x76\x47\x65\xe7\x25\x47\xb4\x72\x3b\x80\xad\xd7\xbb\x4c\x78\xfc\x8c\x4d\x4f\x19\x4a\x12\xba\x2a\xc3\x7b\x4e\x3c\x5d\x66\x0e\x66\x8e\x74\x09\x98\x14\x2e\x20\x0d\xa7\xd9\x04\xa3\x1e\xd0\xaf\x8d\x43\xa7\x5a\x1d\xb6\x0b\xb7\xde\x90\xdf\xc6\xdb\x4b\x6f\xb5\x03\x65\x6d\x9d\x5a\xf3\x3e\x66\xd5\xf6\xc1\xbb\x2b\x8c\xda\x57\x4e\xde\x5c\x8d\xca\x79\xe0\x55\x21\x24\x1a\xb9\xcb\x58\x34\xd6\x3c\x15\x14\x4f\x1d\xff\xe5\xf6\x1e\xb5\x34\x05\xc9\x30\x5b\x01\x8c\xef\xb3\x74\xbe\xd8\x53\xd9\x39\x25\x29\xa3\x79\xe7\xe8\xcb\xcd\x42\xca\x48\x4b\x2b\xbb\x7f\x09\xb5\x62\x9b\xae\xe5\x12\xc3\x1e\x9c\x46\x62\x29\x94\x20\x36\x20\x5c\x32\x26\x92\x48\x04\x4f\x19\xd2\xd9\x83\x88\x47\x9a\x98\x20\xda\x51\x95\x36\x14\xe2\x39\x56\x62\x3d\x44\x94\xcd\x55\x22\x22\x1b\x47\x6e\xeb\xe6\x25\xa2\x20\xfd\x13\xb5\xf2\x48\xc9\x25\x11\x81\x2e\xb5\x3b\xb7\x9a\xd9\xb7\x4e\xca\xe7\xa6\x1a\x3d\x8e\xf6\x84\x9e\xf3\xc7\x07\xed\xe9\x31\x30\x9b\xb8\x6f\x13\xf5\x9c\xcc\xd4\xb3\xcd\x64\x89\x1c\x70\xb3\x2b\x91\xa6\x16\x97\xf4\x27\xb4\x66\xd3\xb3\x74\xff\x47\xa8\xaf\xbc\xcc\x05\x38\x7f\xfc\x3b\x62\xf5\xcf\xe3\xdb\x8c\x9f\xfe\xfa\xe3\xff\xa9\x89\xaa\x84\x8a\x1f\x96\xc5\x57\xe4\x52\x75\xe6\x70\x79\x54\x21\x7b\x72\x82\x91\xbb\xf3\xdb\xb0\xe6\xbf\x24\xd7\xa2\xcc\xa3\xe1\xd0\x59\xc7\x05\x31\xf1\x86\x3d\x5b\xb1\xc6\x44\x5c\xf1\x66\x16\x21\xf6\xaa\xdb\x73\xe4\x65\x60\x6a\xac\xc4\xa5\x9a\xb2\x18\xaf\x88\x1b\x58\x99\xed\x14\x4f\x6f\x6f\xba\x60\xc5\xcf\x87\xa5\xfc\x1b\xfa\xec\x2d\x86\x13\x99\x83\xe1\x2c\x29\x07\xcb\xa0\x1a\x28\xca\xa0\xb2\x84\x65\x7c\x0e\x95\x31\x39\xa1\xba\x96\x9e\x89\x8e\x22\x4d\x0f\x79\x10\xaa\xda\xf0\x25\x78\x7e\xee\x7f\xad\x6a\x93\x39\x1f\x0a\x15\x61\x94\xed\x4b\x1f\x08\x00\xdb\xb6\x8f\x67\x29\xdc\xd2\xc8\xae\x22\x9c\xc0\xd6\xb6\x90\x69\x5c\xd3\xa0\xb9\x6b\x9b\xda\x40\x0c\x16\x5f\x13\xb1\x33\xbe\xba\x0f\xb5\x79\x29\x8a\xef\xa3\xa6\xc0\xc5\x83\x00\xa0\xf1\x70\xc8\x0e\xf4\x7f\x28\xab\xb0\xd5\x82\xec\x6d\x59\xb5\xef\xf9\x11\xb2\x6a\xdf\x73\x31\xcd\x2a\x64\xa7\xe8\x9e\x4c\xfc\xd1\x70\x0e\xd8\xa0\x95\xf6\xce\x7d\xd2\x2b\x6a\x3a\x1f\xbe\x19\xe2\xd3\x3f\xee\x4d\xa7\x12\x8c\x17\x64\x2e\xb4\x3e\x60\x9f\xa9\x67\x5c\x82\x31\x4c\x15\xd4\x82\x0e\xb1\x1b\x03\x3e\x06\xb5\xf5\x84\x67\xa1\x94\x9e\x51\x95\x8d\x1c\xa2\xfc\x46\x5e\x45\x6a\xca\x8d\x85\x5c\x92\x9b\x72\x4b\x21\x33\xda\x36\xb0\x61\xa3\x70\x4f\x21\xd8\x6e\x1c\xe6\x9f\xd8\xf1\xe6\xf7\xea\xa3\x28\xec\x11\x17\x0b\x7f\xe5\xd5\xa4\x55\x10\x61\xbf\x60\x73\xb0\x5e\xe2\x57\xd1\xb2\xef\x4b\x38\x9f\xbd\x50\xa7\xf0\x75\x03\xbb\x0f\x8b\x3d\xbe\x14\xb3\x27\x5e\x7f\xf6\xaa\x03\x78\x94\x60\xcb\x4f\x2d\x3e\x39\xf3\xa8\x3b\x5b\x6e\x60\xf8\x66\x6e\xbb\x51\xa7\xa2\x96\x44\x87\x68\x15\x2a\x42\x58\x91\x1a\xc9\x5c\x77\x19\x5a\xf8\xb6\xae\xba\x94\xd6\x3d\xd1\x99\x62\xe7\x8b\x55\xfc\x4e\xf4\x73\xcd\x56\xb7\xbf\xaa\x87\x66\x67\x37\x07\x2a\x35\xba\x6c\x43\x6e\xe7\x47\xe9\x4a\xef\xd8\x20\x6a\x8f\x6e\x49\x4d\x92\xb2\xc9\x2c\x99\x68\x90\xca\xa1\x0e\xaa\x7d\xd1\xce\x7b\x00\xc4\x54\xd9\x97\x66\x1d\x21\x6a\xf1\x9d\x4b\x51\xcd\xf1\x17\xcc\x2a\x3a\x97\xd2\x78\x2e\x3d\x3c\x42\xf5\x67\xcb\xf7\x7c\xe8\x5a\xe5\x00\x4f\x38\x5c\xac\xf8\xbb\x09\x56\xdb\xa7\x7d\xee\x90\x79\x40\xce\x6f\x7a\xf2\x47\xb7\x14\x2d\xbe\xb5\xde\xbc\x81\xb9\x62\x96\x2f\xa7\x79\xd0\xe5\x34\xf0\xd2\x0c\xc3\xd7\x63\x4d\x8f\x00\xc7\x21\xfd\x7e\x8c\x2f\x01\xe1\xcf\x7d\xdd\x82\x9f\xfe\xd3\xa2\x8a\x5e\xad\x60\x7a\x5d\x14\x89\x74\x31\x26\x95\xa1\xc0\x7d\x1a\x56\x1c\xc3\x2a\x87\x97\xff\x3a\x97\x02\x3a\xbc\xc5\x70\xb8\x50\xc5\x51\x14\x7d\x7f\x89\xf4\x1a\xda\x97\xd8\x88\x23\xf3\xb7\x79\x8c\x38\xf5\x9d\x09\xf5\x0e\x42\x2d\xb8\x45\xee\x9f\x41\x3e\x29\x80\x69\xcd\xc5\x5c\x86\x0e\x87\x50\xf2\x22\x09\xc6\xc9\xd2\x2c\x90\xf5\xba\x7f\xb1\x3f\xbe\x33\x94\xd5\x67\xc3\x1e\x52\x87\x41\xd6\x75\xbf\x1f\xde\xe5\x21\x28\xaa\x82\x22\xf0\xc3\x33\xef\xd6\xa4\xa7\x81\xbf\x99\xce\xc7\xe5\x68\xf8\xc1\x4c\x53\x2e\x81\x68\x59\x04\xc1\xda\x0f\xad\x6a\x96\x9e\x68\x7b\x07\x10\x12\x0f\x4e\xf1\x19\xa8\x27\x45\x93\x4a\x1c\x52\xc9\x3a\x07\x0a\x41\x16\xbc\xf8\x1d\xc6\xc2\x83\x37\x99\x6a\x22\xb1\x1e\xe8\x05\x7d\x7f\x6b\xd1\x4d\x22\xf9\x7a\x01\x5e\xad\xfb\xdf\x68\x2f\xad\x89\xf7\x02\x42\x11\xe9\x5f\x28\x8f\x32\xec\x73\xe5\x41\x06\x68\x31\x84\xd7\x6b\x60\xff\x1b\x77\x63\xa0\xed\x88\x1c\xd4\xda\x28\x27\x17\x27\x1f\x95\xb6\xb6\x56\xfc\xda\x16\xbe\xa3\xe1\x3b\x16\xbe\xa3\xe1\x21\x7d\xa9\x58\x2d\x74\x38\xef\xcb\x5e\x83\x31\xc9\xe5\xef\xda\x46\x00\x37\x96\x86\xf9\x3e\xb3\x4d\x99\x00\xd5\xf4\xc1\xf9\x5d\x39\x6e\x22\x96\xf3\xed\x72\x45\xf6\x3d\x92\xa8\x88\x93\xb5\xdc\x81\x6f\xe6\x46\x03\xea\x5d\xe5\x75\x3b\xb8\x13\x00\xf7\x15\xc0\x17\xf2\x55\x9b\xee\x07\xc0\xdd\x85\xd7\xe6\x2f\x86\x52\x03\xe5\xa4\x63\xaf\xb9\xf4\x8d\x7e\xf2\x15\xbc\x0f\xfb\x85\x49\xf9\xea\xb5\xf9\x71\x1f\x9e\xf6\xa4\x5b\xc7\xaf\x4c\x09\xad\x12\x1e\xd8\x8b\xea\x6e\x0a\x39\x7a\xe2\x23\xfc\x48\x3f\xf9\xfa\x6a\xb4\x1c\xd2\xed\x64\xd0\x44\x72\x7a\x0a\x38\x5b\x2c\x6a\xf5\x94\x9a\xa2\x6e\x9b\x2d\xe2\x2a\xc1\x94\x6e\xe6\xc6\x80\x7a\xb0\x37\x18\x8e\x6a\xe8\x89\xfb\xd5\x2b\xe0\xfd\x57\xaf\x88\x2d\xe6\xab\x35\x2e\x67\xb5\x57\xe8\xd9\xd6\x2b\x97\xb5\x44\x39\x74\xcd\xfd\xea\x35\x96\x7b\x4d\xec\x33\x5f\x58\xee\x75\xbd\xaa\xe0\x0a\x7d\x7a\x49\xab\x58\xd1\x1d\x0d\xf3\xd5\x3a\x1f\x8e\x20\x44\x7c\x4a\xbb\x51\x4f\xaa\xac\xcc\x0c\x06\x72\x1f\x8b\x57\xf6\x3f\x52\xbd\xab\xca\x7a\xd7\x58\x2f\xbe\x5d\xd0\x5f\x53\xbf\x9b\xaf\xa8\xde\xd4\xdb\x69\x50\xef\x1a\xea\x7d\x9d\xac\xd7\x29\xb0\xd4\x09\xae\xcb\xd1\x2d\x26\xf9\xd6\x80\x7a\xa4\xd8\xf4\x13\xa2\xa9\xb6\xc2\x25\x86\x8d\x1b\x38\xc9\x31\x13\x8c\x1a\xf1\xe1\x55\xe7\xa3\x40\x77\xe6\x04\xdf\x82\xe9\xd5\x72\x44\xcf\xc2\xe6\xdb\xb0\xbb\x9e\xfd\xca\x8c\x3a\xd7\x55\xaf\x6b\xaf\x3b\xf5\xd6\x62\x34\xec\x0d\x6a\x20\x75\x4c\xa6\xf9\x9e\x0f\xcc\x66\x64\x61\x66\x8d\xc8\x31\x90\xed\x54\x4e\x3d\xd2\xd9\xc3\x66\x0c\x6e\x7e\x54\xec\x91\x8c\x87\x93\xe9\x9c\xcf\x7d\x43\xe5\x50\x40\x95\x6f\x1d\xd4\x59\x5d\x15\x3a\xcb\x71\x59\x94\xb9\xe1\x21\xe0\x09\xca\x32\xeb\xf8\x0d\x93\xf8\xb5\x7a\x76\xf9\x95\x7e\x5b\xf9\x95\x7c\x4c\xd9\xc2\xbc\xd6\x0f\x2e\xbf\x96\x2f\x2c\x4b\x0d\xf0\x15\xbc\x04\x0e\x11\x12\xe1\xed\x24\xa8\x16\x91\xa3\x3c\xed\xc8\xc3\x73\x80\x7d\x0d\xb0\xaf\x19\xf6\x35\x91\x78\x4c\xb2\x56\xc1\x46\x6c\xf4\x21\xa5\xbd\x6a\x9c\xe3\x9e\x67\xf1\x8d\xb9\x57\xfd\x68\x75\xf0\x32\xf5\x2a\xc5\xbd\xe0\xb9\xea\x75\x8e\x7b\x2b\xe0\xc8\x8a\x39\xb2\xb2\x37\x94\x71\x55\x8a\xb8\xb7\x06\xd8\x35\xc3\xae\xdb\x36\x56\x4b\x87\xd1\xff\x2c\xdc\x63\xbd\xff\xd6\x13\xe3\xa5\xc1\xb3\x69\x5a\x20\x8c\x9d\x14\xfc\x51\x35\x25\x5e\xde\x94\xb6\x13\x5c\xcb\xcc\x7a\xed\x58\x8f\x8b\x38\xc7\xc4\xc6\x75\x3c\xe5\x7b\xe0\xaa\xaf\x1a\x69\xb7\x20\x0a\xd6\xbb\xbe\x70\x8a\xe8\x8b\x40\xdd\xfd\x9c\x43\xc4\x26\xa2\x7e\xe6\xed\xb4\xde\x12\xbb\x19\xe0\x35\x7c\x57\xf3\xab\xda\x9a\xf5\xa7\x2f\xfc\xbd\xf7\x75\x02\xf0\x35\x5e\x10\x85\x21\x1e\x8e\x46\x23\x98\x92\x88\x5f\xb3\x42\x26\x10\xbf\x4e\x22\x7e\xc5\x9a\x5c\x8c\xb8\x92\x7b\x95\x52\x1b\xe4\x41\x13\x9f\xbb\x6a\x7e\xd1\x16\xb1\xb6\x31\xe9\x8b\xb6\x88\xa9\x2d\x85\xbb\x28\xf5\xb9\x85\x71\xa5\x3e\xb7\x78\xaa\x9e\x83\x4f\x30\xb6\xbf\x96\xaa\x2b\xf1\x96\x15\x1b\x02\xe1\x98\xdf\xa0\xc8\xf0\x72\xba\xee\x64\x6c\x01\xab\x68\xe1\x5e\x6b\xb5\x23\xa5\xf9\x44\x0f\xe8\x6c\x3a\x5f\x4f\x74\x7a\x7f\xa5\xf4\x6f\xd9\x08\x02\xb1\x8d\x58\xb9\x46\xac\x72\x8d\x88\xef\x3d\xac\x74\x23\x52\x6a\xe3\x4e\x8d\x58\x4c\xaf\xe6\x46\xab\xe8\x87\xc7\xe4\x2d\xca\x48\x15\x59\x9a\xd9\x35\x58\x26\x8a\x50\x46\xb0\xc5\x7c\x33\x1f\x94\xcb\xa7\xf3\x5e\x6e\x83\x42\xf5\xd0\x68\xa7\xdf\x0d\x4e\x3b\x33\x5b\x32\xc4\x48\x99\xf4\xdb\xa6\x9d\x45\x1b\x0f\xaa\x66\x0b\x7d\x6d\xf3\x96\xe3\xc4\x52\x00\x27\x7b\xf4\x33\x63\x9d\x76\xe4\x00\x24\xfd\xcc\xd9\xb1\x93\x86\x56\x4b\x76\x72\x27\x9e\xda\xcf\xc8\x5d\x7b\xed\xe7\xa7\x32\x5c\x9f\x98\x3a\xd7\x49\xbb\x4b\x5c\x3f\x8e\xe0\x7f\x0e\xd1\x99\xeb\xe5\xa2\xea\x9a\x14\x7a\x63\x1e\x26\x96\x7e\x22\x2c\x4d\xad\x1b\x35\xbb\x53\xeb\x87\x30\x0e\x18\x8b\xe8\xcc\x73\xf0\x67\xa7\x36\xb9\xa0\x45\x5d\x1f\x52\x6c\x6a\x73\x33\xcb\xf9\x95\x85\xe2\xde\x57\x2b\x6d\x06\xda\x82\xec\x6f\x1b\xf1\xe4\xa3\x86\xa6\xdd\x66\xe4\xd1\x08\xc1\xc7\x67\x2e\x9c\x1e\x99\x7c\x08\x6f\x0c\xcf\xe9\x29\x8f\x89\xb4\x03\x83\xa0\xc1\x46\x62\x20\x1d\x56\x19\x93\xd7\xca\x22\xb4\x46\x83\xd0\x5a\x59\x8f\x30\xad\xb7\x56\x96\xa0\x75\x07\xe1\x94\xd5\x08\xd3\x2e\x51\x6f\xed\x61\xa4\x43\x07\xbd\x02\x0c\x97\xeb\x20\x07\xca\x50\x0e\xaa\xb8\x50\x83\x2c\x83\xd8\xd6\x41\x0e\x96\x81\x1c\x70\x4d\x73\x06\x3b\x3c\x02\x14\xc1\x1f\xef\x9f\x5d\x94\xb0\x1b\x44\xa2\xf8\x31\xd4\x7d\xae\x9a\x90\x49\x10\x8e\x60\x52\xaf\xdb\xab\x04\xc5\x3d\x5f\x59\x5f\x18\x1e\x83\x23\x05\xb0\x39\xdb\x41\xb1\xd4\x56\xf3\x2f\x25\x5f\x96\x78\x44\x05\x06\x86\xcb\x46\xf1\x54\xe6\xf4\xe1\x41\x33\xce\x80\x05\xf0\x29\xfc\xc4\x98\x8f\x5f\xe2\xaf\x0e\x1d\xbe\x62\xf2\xda\x25\x83\x06\xf0\x81\x93\x17\x2e\x79\xe1\xdf\x68\x4f\x9e\xaf\xc2\x13\xd8\x81\xf3\xa7\xc8\xfe\xd0\x10\x91\x28\xec\xe3\x8e\x70\x26\x0b\x8f\xb6\x27\x9d\xea\x8b\xe4\x7d\x1b\xbf\xb4\xb6\xc3\xeb\x86\xed\x34\x1e\xfa\x23\x58\x2b\x45\x7c\x5f\x4d\xd4\xe0\x58\x55\x2c\x9e\x3c\xd7\xb3\xf7\xba\x79\x4a\x10\x98\x8a\x7b\x90\xbe\x84\xad\xe0\xb5\xce\x11\xa2\x72\xf3\x4f\x04\x99\x56\x99\x51\x7a\x61\xaf\xe9\xd9\x3b\x5c\x7d\xfd\xfa\xc1\x70\xc3\x2b\x27\x1e\x53\x45\xd0\xe9\x9f\xfb\xa5\x85\xa0\x42\xa5\x9a\x60\x7c\x17\xb2\xce\x5a\x2b\xf3\x51\xcc\xf6\x38\xda\x6c\xe8\x9c\x60\xc3\x6f\xc5\x36\xf0\xc8\x9e\xcd\xa7\xbe\x3e\x62\x60\xca\xb8\x1d\x86\x43\x0d\xe8\x08\x42\xd8\x7e\x4c\xd1\x5c\x19\xde\x34\x8d\x36\x87\xa0\x2f\xdf\x62\xc9\xc7\xbc\x4d\x79\x6c\x20\x07\xb6\x61\x40\x11\x7a\x75\xe0\xc3\x49\x10\xfc\x87\xde\x94\x15\x25\x30\x98\x51\x3b\x7d\x90\xb0\x4c\x73\x8e\xdf\x8b\xd9\x60\xf1\xd7\xa7\x4b\x15\x46\xff\xc8\xe6\xbf\xc9\xe4\x1f\x59\xfc\x03\x83\xbf\x1c\x43\x62\xd8\xe0\x0f\x31\x42\xf0\x87\x57\x2e\x53\xdb\x95\xf2\xc3\x70\x7c\xb5\xbc\x28\x47\x35\xbc\x65\xd1\xb0\x27\x47\x7f\xd1\xbd\xe6\xc1\x32\x7e\x36\xc1\xf9\xcc\xdf\xb3\xfd\x04\xeb\x0e\xbd\x9d\x44\xa5\xb8\x81\xf1\xad\xad\x4b\xd1\x76\xe9\x94\xd3\xc0\x1c\xe9\x8c\xa3\x7d\x84\x1c\xa9\x5b\x3e\x13\x5c\x1c\x67\x17\x04\x8a\xbc\x45\xc7\xda\x3f\xfd\x07\xf5\x52\x4f\x8e\xce\x1e\x35\xb3\x27\x5b\xd9\x8b\x9b\x22\xdf\x1a\xa6\x2e\xee\x35\xe8\xad\x63\x28\x5c\x6f\x88\xb5\xdd\xa4\xe2\xd3\x9c\x04\x05\x6f\x54\xff\x47\xc6\xb1\xc7\xb5\xd3\xae\x10\x42\xfc\xba\x3c\xf9\xc2\x70\xd4\xe3\xc2\xde\x6e\x7a\x82\xba\x41\x2b\x79\x9e\x31\x10\x55\xa5\xc6\x27\x51\x16\x96\x34\x32\xe1\x0d\x0e\xb4\xaa\xf2\x5a\x6f\x31\x6d\xb3\xcf\x2c\xd1\x0e\xd4\xc5\x12\x48\x91\xbb\xb3\xbf\x76\x8c\x25\xe9\xb2\x1d\x83\x1d\xe5\x99\x37\xa4\x25\x7a\xb9\x23\xfb\x6c\x7c\x47\x6a\x3b\x8e\x0a\x0f\xa3\x7a\xb1\x07\xdd\xdd\x93\x7a\x58\xcf\xb2\x55\x5c\x9a\xca\x72\x4b\xd0\x77\x2b\x7e\x59\x3c\x1b\x39\x66\x01\x53\x2b\x27\x3e\x84\xfc\x6c\x3a\x39\xc7\xc3\xec\xe4\xcb\xe6\xb9\x93\x59\xd5\x80\x84\xbf\x2a\x82\x9b\x7a\x6b\xf8\xe6\xfa\x03\xf0\x47\xfd\xab\x7c\xb3\x8b\xde\x46\x47\xd4\xc7\xc7\x78\xc8\xfc\x44\x1f\x0a\xdb\x98\x75\xa3\xe9\x9b\x1a\x13\x71\x4f\x1f\xf7\xd6\x6d\x02\x80\x2c\x31\xc9\xa4\x2c\xb1\xb4\xa1\xf0\x37\x52\xaa\x7f\x4d\xb1\x42\xde\xd7\x96\xf6\x65\x76\xf1\xda\x39\xee\x27\x27\xf5\x80\xff\xe3\xc1\xbc\x67\xef\x47\x6f\xf1\xd0\x3a\x20\xf9\x0d\x38\x4c\x84\x11\xc2\x4c\xbb\x1f\x15\x4d\xd3\x19\xe7\x86\x15\xfb\x78\xa2\x8f\x52\x56\x26\x39\x3b\x4f\xe8\xf3\xc1\x08\x1e\x17\x0c\xdc\xf4\xe5\x45\x8a\x2b\x1e\xca\xc9\xdf\x58\x16\xd9\xa6\x63\xcb\x23\x71\xa7\xdf\x78\x07\x7f\x12\x14\xdb\xbf\x89\x1e\x78\xe7\xac\xdb\x3f\xf2\x0e\xa8\xd7\x0d\x22\x12\xac\x46\x6f\x4c\xb5\x75\x47\x84\x14\xec\xfa\x19\xf7\x4a\x49\xad\x5f\x85\xf7\xa2\x0c\x86\xa1\xe3\xc2\x6f\x50\x44\x37\x70\x2b\x05\x6f\xc0\x37\x2d\x23\x77\x7e\x0c\xde\x4d\x9c\xcd\x73\x39\x7e\x0c\xde\x15\x4e\x4e\x60\x0d\x92\x9d\xba\x62\x7a\xef\x34\x79\x37\x4f\x3d\x3b\xe5\x9a\xf1\x94\xab\x91\x4f\x04\x61\xfa\x57\x3f\xc9\x0c\x3b\x71\x96\xb7\xfd\xa4\x02\xf5\x6e\x42\x41\x29\xc3\xd9\x95\xb8\x3a\xb0\xc5\x24\x73\x03\xfb\x5f\x91\x82\x6d\x07\xf2\xbf\xfe\x72\x03\x19\x50\x87\x57\x64\xab\x46\x25\xc0\xef\x32\xe0\x77\x1f\x96\x3b\x2d\x32\xf1\xc0\xdc\xb4\xb6\x84\x40\xc1\x5a\xfc\x66\x32\x1d\x03\xc4\xcd\xd4\x17\x98\x94\x3e\x93\x97\x55\xc7\x4c\xb5\xa8\x8a\x8a\x76\x5e\x48\x6d\xd9\x64\x03\x6d\x66\x6a\xd6\xd9\x35\xa1\xea\x72\x9b\x5b\x92\xb2\x4b\x60\x3d\xba\x69\x63\xf1\x6e\x18\x7a\xf2\x74\x20\x21\xde\x06\x2b\xf4\xec\x08\x44\x5a\x72\xcf\x6c\x2b\x7c\x91\x0d\xf4\x01\x7d\x9a\x0c\x1f\xe0\x00\x1b\x85\xbd\xe7\x3d\x6e\xf1\x5e\x44\xde\xc0\x1e\xfb\xfb\xd8\x41\x9c\x89\xb1\xb8\x0c\xcf\x41\x29\xae\x96\x53\x1a\xe0\xe3\xf8\xf2\xb8\x9e\x78\xd7\x76\x3b\xc2\xe6\xef\x71\xea\x52\x26\x33\xea\x1a\x25\xdc\xd8\xc8\x37\x5b\x89\xf9\x29\x6b\xa7\xf8\x57\x46\xde\x8d\xcd\x7f\xd7\x6a\xa6\x8d\xd3\xd7\xc9\x63\x62\x1c\xd8\x2f\x4e\xd0\xc6\x10\x02\x96\x24\x0f\x58\x45\x13\x48\x68\x26\x28\xd4\x59\x1c\x75\x22\xa2\x82\x76\x8d\xb7\x2f\x39\x9b\x51\x76\xb7\x70\xcf\x38\x2f\x25\x3f\x74\xe0\xf9\xe0\xc1\x60\x8e\xb6\x71\x69\xca\x80\xdd\xb8\x69\x5f\x66\xc6\xf4\x7d\x97\xbe\xcf\x2f\x32\x7b\x4c\x1f\xb5\xaa\x24\xa9\x55\x61\xb6\x0a\x7d\x1f\x38\x08\x5b\x7a\x9d\x92\xaa\x71\x47\x84\x02\xd6\x4e\x9b\xcd\x42\x27\x31\xc1\x82\x9c\xa4\xf0\x91\x4a\xa7\x90\xaa\xd3\xf9\xf2\x62\xfa\x66\x5e\xce\x2e\x36\x48\xd6\x50\x9e\x2a\x11\x6a\xd6\x44\x25\x42\x03\xac\x3b\x8b\x51\x59\x3e\xd9\x1a\x09\x10\xb4\x68\xb1\x1c\xcc\x07\x5b\x35\xa9\x72\xb1\x08\x77\xb8\x3b\x6c\x70\x51\x32\xff\x47\x62\x73\x1b\x92\xb6\x33\x5f\x14\x82\x24\x63\x14\x44\x4a\x3e\xe3\x24\x42\xaf\xb1\xaf\x37\x2c\x39\x5b\x2c\x37\x8d\xa2\xf9\xe3\xdf\xa3\x35\x27\xae\x62\xdb\xd5\xa7\xb9\xce\x2e\x3f\xab\xf4\xf2\x53\x93\x21\xf5\x54\x9d\xb9\x33\xe5\x54\xa8\xab\xfc\x9c\x8a\xf1\x82\x9d\x27\x08\x6a\x30\x74\xc1\x38\xc4\x3d\xa4\x28\xa6\x05\x49\x84\x6d\xe3\x77\x30\x4f\x20\xd4\x0a\xc1\x19\xe1\xd6\x3c\xe3\xb0\x2a\x6d\x90\x5c\xa0\x4c\xc3\x91\x23\x67\xd7\x41\xc8\x11\x40\x93\x21\x94\x28\xda\x36\xc6\x86\xa8\x98\xef\x25\x9d\x14\x67\x2e\x8a\x4b\x23\x19\xcf\x62\x1f\x7c\x41\x0e\xe1\x1f\x4f\x16\x17\x36\x64\x31\xe2\x00\x0d\x94\x6b\x52\x91\x94\xc8\x74\x75\xb7\xf1\x15\x23\x07\x17\x0e\xf8\xb8\x83\x8e\x3e\xb1\x27\x1c\xf8\x32\x56\x4a\x4b\x19\x9f\xa1\xe1\xfa\x55\xec\xa7\xc0\x5e\x6c\x09\xfb\x28\x97\x79\x9d\x28\xd3\x11\x33\x00\xeb\x6d\x5d\xc0\x61\xaf\xe0\x2f\x8c\xfe\x61\xcf\xfb\xb0\x7a\xef\x0f\x49\x4e\x43\xb8\x0c\xd9\xea\xc4\x9e\x27\x77\x2e\x0d\x95\xf9\x1a\x82\x0d\x0f\x66\xf6\xcd\x5c\xd2\x06\x05\x48\xb1\x1d\xf9\xa8\xb8\xef\x1d\xb3\x9c\x67\x08\x90\x78\xce\x34\x22\x36\x23\x29\x56\xa6\x37\xcf\xd7\x3a\x0d\x6c\xa3\x43\xda\xf9\x09\xa4\x7c\x33\x02\x3c\x7e\x4f\x4c\x6f\x9f\x9b\xe5\x6f\x36\xa0\xd7\xd6\x28\xcd\x56\x83\x97\x45\x86\x78\x36\x55\x0c\x0d\x29\x13\xf3\x67\x7f\xbf\x1e\xde\xa6\x5b\xd0\x6d\xb9\x93\x62\xff\x7c\xd5\x32\x4a\xc1\x88\xbd\x13\xa0\xca\x93\xa1\xa9\x61\x08\x31\x51\xcf\xd7\xd9\xbc\x61\x11\xbf\x0b\xc3\x98\x17\x53\x3a\x3f\x45\xae\x03\xbf\x7e\x3f\xef\x0f\xe6\xf5\x4d\x14\xaa\x36\x59\xf2\x08\xa5\xa9\x15\x87\x7a\xd3\x7f\x76\xa4\xb2\x01\xbc\xbd\x32\x85\xe7\xa2\xbb\xa1\xe2\xef\x20\x8d\x6e\x8b\xc0\xf1\xc6\x68\xfa\x3e\x03\xa2\xea\x56\x68\x17\x97\xc3\xd9\xf3\xc1\x39\xbe\xff\x01\xc5\x41\x12\x80\x26\x86\xd5\x21\x51\x00\xf1\xed\xf0\xcd\x85\x07\xc1\x7f\xed\x68\x68\x16\x1d\x59\x02\xff\x95\x79\x0d\x7b\x82\x96\xee\xc6\x10\x1e\x78\xf6\x18\x79\xd7\x6c\x0e\xeb\xb6\x2c\xb1\x0b\x3b\x88\x59\x44\xb5\x0d\x4f\x4f\x8d\x5c\x38\x8d\x79\xbf\x6f\xdb\x45\x7d\x10\x50\xec\x9a\x74\x54\xec\xef\x57\xd5\x42\xed\x0d\x6b\x71\x21\xd7\xc4\x3b\x74\x34\x46\x80\xe3\xad\x55\xb5\xa4\x4c\x78\x5f\xe0\xad\xce\xb3\x06\x16\x07\x81\xb8\x52\x12\x0e\x91\xae\x77\x47\xba\xd6\x48\xd7\x29\xb1\x79\xc1\x9a\x69\x5a\xea\x45\x63\x4c\x88\x23\xe8\x4f\x9e\x10\x76\x0a\xb3\x14\x43\x19\xdc\x01\x2d\xfa\x02\xe6\x2e\x3f\xbe\xe1\x6e\x79\x0d\x31\x2d\x39\x79\xdf\x5f\x0c\xcd\x8e\xab\x66\x8a\x3d\x36\x08\xe0\xbd\x93\xfb\x67\xbd\xf9\x74\xb1\x38\xe8\x33\x05\x27\x50\xc7\xc9\x05\xdc\x27\x33\x3d\x62\xa5\x86\x48\xed\x88\xd4\xa1\x59\x5d\x1e\x1d\x83\x21\xb4\xd9\xbc\x70\xd7\x5e\x19\x76\x7f\x1f\x02\xd5\x0e\x65\xef\x09\x9e\xb0\x83\x7c\x1b\xda\x90\x0b\x34\x23\x26\xbf\xba\xe8\x64\xbb\x84\x36\x16\x78\xd5\x09\x5e\x0c\xa1\xdd\x45\x37\x21\xfd\xfd\x04\xa9\xba\xc7\x00\xc6\x9a\xab\x6e\x6f\x54\x2e\x16\x32\xbb\x21\x16\x00\x44\xf3\xc2\x86\xba\x0d\x8e\x0b\x74\xa8\x8f\xe0\x38\x3e\x2e\x8d\x72\x44\xd1\xa7\x82\xe8\xd2\x54\xce\x15\x8e\x9e\x59\x90\x23\x07\x06\x40\xb3\x43\x4b\x00\x06\x88\xb5\xe3\xa7\xa4\xc7\x6b\x20\xed\x64\xc2\xc2\x83\x11\xb1\x2d\x8f\x07\x88\x99\xb4\x30\x7a\xfc\xc0\x01\x90\xae\xed\x60\x87\x63\xe8\xc4\x0d\x62\xd9\x77\xd7\xca\xc4\xf5\x33\xfc\xea\x9c\x26\x86\x01\x96\xb9\x5b\xd0\xb5\xa4\x8f\x95\xad\x4d\x3d\xd7\x70\xb9\x55\x93\x61\xe2\x73\x2c\xce\x76\x9a\x01\x3d\xbf\xa2\x27\x5c\xcd\x2e\x11\x31\xec\x3f\x3e\x83\xe3\x60\x40\x0d\x74\xd7\xac\xf3\xdd\x4d\x19\x86\xa7\x97\x9e\x3d\x76\x1c\xdf\x45\x0e\x5a\xa0\x15\xb0\xb4\x56\xd2\x46\xb9\xcb\x77\xf9\x7a\x36\x77\xcd\xb9\x1d\xca\xed\xc8\xdc\x8f\x81\x15\x89\xdc\x7b\xc0\xd8\x78\x29\x94\xf5\x3c\xbf\x29\xae\xa0\x77\x37\xbb\xea\x86\x16\xa3\xe1\x64\x76\x85\x36\x9d\xe9\x62\xd0\x57\x5a\x12\xe2\x7a\x86\xe9\xae\x60\x23\xd7\x43\x64\x24\x4d\x94\x04\x18\x53\xec\x6d\x03\x9e\xe3\x29\xc3\x4e\xa3\x37\x74\xfa\xd5\x7d\x80\x24\x82\x11\x89\x88\x60\x91\xe3\x43\x5b\x72\xb2\x73\x88\x69\x6f\xe8\x2f\xc4\x77\x52\x1b\xdb\x9f\xbe\x09\xc4\x05\x7c\xb0\xc9\x95\x78\x8b\x0d\x3e\xd2\x92\x77\x7f\xff\xad\xa1\x51\x59\x61\xfa\x0e\xf3\x5b\x11\xcc\x1b\x75\x42\xcd\x98\xdf\x4d\x16\xc3\xfe\xa0\xd6\xa7\x61\x5c\xd7\x56\x1a\x1c\xbe\xe9\x02\xbd\x64\x01\xdf\x7e\x5a\x94\xc3\xa2\x4b\x50\xe1\x7b\x4b\x28\xed\x6a\x94\x56\x9e\x8f\x9f\xe4\x30\x49\x13\x8e\x37\xdd\xec\x42\xdb\x6d\x28\xf3\x74\xa1\xb1\x21\x54\x31\xc9\x8a\x44\xbd\xa5\xaa\xe1\x0f\x98\x64\x47\xf1\x1c\xd6\x0f\x91\x12\x68\x7e\x59\xd7\x6d\x9c\x31\x91\x7a\xf5\x0a\xaf\xe8\xd6\x66\x24\x06\xf0\x1e\xb1\x19\x23\xb5\xae\xfc\xc6\x7c\x0f\x5f\xb1\x25\xca\x33\x49\x5d\x34\x2d\xec\xcb\x82\xab\xfb\x2c\x89\xe0\x45\x2c\x7c\x66\x84\xea\xc1\x5b\x3f\x0f\x20\x93\x09\x5d\xdd\xe7\xab\x3d\xf4\x0c\xe1\x9a\xca\xe1\x4f\x2e\x87\xf4\xe2\x0d\x20\x2e\x47\x09\xa6\xdc\x15\xb0\xb2\x06\xe8\xe0\x99\x68\xf4\x86\xbc\x0f\xb3\x65\x4d\x29\xe4\xfc\x78\x9f\x0e\x9d\x28\x0d\x68\x69\x16\x54\xc2\xe0\xd7\x4b\x2d\xdc\x83\x32\x32\xef\xaa\x24\x40\xa4\x8b\x3f\x81\x96\xaa\x1d\xa3\x14\x31\x09\x1d\xc0\xde\x18\xd7\x31\xbf\x68\xd5\x90\x69\xe2\xb7\xd4\xc5\x15\x95\x77\x6a\x79\x0d\xc5\xf5\xa0\xd4\x10\xae\xa7\xf3\xe9\x64\x3a\xfc\x75\xff\x8d\xd4\x3a\x38\xf5\xd9\x60\x34\x8a\x53\xbf\x1c\xc0\xd3\x11\x99\xf4\x17\xd3\xe9\x88\xf7\x7b\x41\xf6\x6f\x86\xf3\xc5\x92\xe2\xdf\xc6\x15\x61\x72\x82\x00\x4c\x77\x38\x93\x03\x5f\xd6\x1e\x3c\x3c\xef\x32\xbf\x1d\xf4\xbf\x1c\x95\xbd\xcb\x6f\xa6\x66\x6e\xa0\x94\x27\xae\xe1\xa2\x30\x30\x6d\xb7\x0b\xc4\x62\xb8\x74\xbf\x5d\x4c\x1c\x6b\xe9\x4d\x76\xaf\xa5\x14\x7c\xa9\x07\x44\x04\x20\x91\x9d\xdb\x85\x54\xb1\x5c\x85\xfc\x32\xba\xd8\xcc\x50\x6e\x7a\xcb\x3f\xd7\x10\xb6\x8b\xe8\x45\x4c\x96\x48\xf8\xa3\x3a\x1f\x73\x37\x11\xfa\xd5\x60\x69\xa0\x08\x2b\x16\xc8\xb0\x8c\xe0\x38\x5e\x31\x01\x1e\xa5\xe0\x78\x34\xb4\xe6\x03\x78\x27\x7a\x23\x24\xb5\x17\x84\x5f\x05\xa4\xea\x2e\x0f\x57\xd5\xac\x6f\xb1\xfa\x44\xb3\xf0\xa4\xda\xf6\x24\xf1\xaf\xc7\x83\x10\xf4\x34\x8e\x55\xb2\x22\x75\x8d\xbf\x7a\xeb\x46\x01\xb6\x94\x01\x40\xd8\x45\x62\x65\xb6\x70\xf6\x3a\xc8\xda\xec\xbc\x48\x46\xe3\x55\xab\xeb\xe1\x14\x5f\x73\x21\xf4\x2f\x1a\xe8\xd5\xe8\xbe\xbf\x81\x68\x23\x8b\xd2\x6c\xb9\x4a\x1b\x4a\x88\x87\xc4\x69\xb2\xf5\x71\x0f\x1d\xb9\x96\x8c\xe8\xa2\x8c\xad\x53\xe9\x22\x90\x67\x07\xad\xd9\x66\xd1\xe5\xf0\x66\x21\x92\x5b\x2b\x7e\xc3\x91\xb3\xd7\x41\x76\x6f\x6d\x8f\xd3\x6d\xa3\x45\xe3\x10\xf0\x85\x5d\xa7\x64\x8b\x5a\x57\x93\xc5\xc5\xf0\x7c\x89\x14\x04\x1e\x94\xc9\x56\x29\xb8\x64\x93\xf8\xdd\xfd\x0d\x95\x54\x0d\x59\x01\x86\x81\xe6\xa8\x96\x89\x7b\xb4\x88\x99\x36\x4f\x33\x6d\x5e\xcd\xb4\x79\x25\xd3\xb8\xf7\x11\xe8\x9b\x24\xc3\x70\x02\xcc\xb7\xe4\x96\x82\x8b\xda\x91\xe0\x54\x88\xbd\x8a\x4d\x73\xcd\xa6\x89\xf9\x84\xce\x56\xf8\xec\xbe\x66\xe8\xae\xa8\x90\x49\x86\x48\x01\xeb\x0e\xfc\x7a\x44\x85\xd1\xfa\x02\x48\xbd\x35\x83\xe0\x24\xca\x13\x80\x38\x0d\x46\x40\x04\xa0\x54\xdb\xa0\x11\x2f\x07\x4b\x58\xb3\xe0\x59\x0b\xe4\x33\x08\xf1\x06\x8d\x51\x90\x8b\x0d\xe2\x3e\xfd\xa4\xa9\xac\x62\x12\xa4\xaa\xb4\x77\x97\x53\xf4\x12\x5f\xc4\x72\x6b\xeb\x8c\xc5\x3a\xad\x04\x40\x5c\x2d\x4d\x0e\x05\x0b\x53\x44\x05\x28\x9e\x2e\xd3\x03\xb9\x0a\xcc\x75\x64\x95\x94\x7c\xda\xef\xa7\x97\xa8\x15\xaf\x27\x20\x08\x29\x40\xcf\x7c\xe8\xd2\xd6\xc4\x58\x6a\x04\xdc\x4b\x1c\xc1\x3f\x73\xd3\x12\x23\x9f\x33\xeb\x9a\x59\x11\xce\xd4\x44\x03\x58\xe1\x41\xbe\x1a\xc5\x05\xc1\xb4\xf7\xa5\xe1\xde\x25\x39\x84\x43\x09\x41\x0d\xe8\x6e\x2e\x3a\x18\x6a\xf7\x06\xc7\x63\x9c\x78\x4c\x07\xfc\x69\x3d\x3f\x0a\xbd\xdc\x0c\xa9\x05\x85\x97\x0e\xd7\x0c\xb0\x16\x56\x54\x18\xec\x8c\x0c\x9a\xc7\x6a\x9e\xdb\x9c\x3b\x58\xf1\xb7\xe1\x5e\x87\xc7\x18\x64\x1e\xa9\x8c\x2e\x54\x99\xdb\xd7\xc8\xb6\x7c\x1b\xed\x6a\xc2\xaa\x89\x07\xcd\x90\x2a\x55\xb9\x17\xda\x6a\x3e\x86\x74\xc9\x7d\x13\x36\xb5\x1a\x6b\x16\x67\xeb\x9b\x04\xd6\x24\x9a\x1c\x21\x9f\x64\x59\x95\x7a\x8f\x16\xc5\xd6\xe0\x3d\x4f\xda\x0d\x5a\x59\xa5\x0a\x33\x9c\x2c\x20\x86\x2f\x8d\x75\x42\x59\x17\x86\x1a\xa4\xda\x2c\x02\x77\x70\xaa\xb1\xd2\xe5\xf3\xa9\x51\xc7\xd4\xac\xf0\xae\xc4\xc6\x35\xca\x8b\x9d\x7c\x0b\x9c\x38\xc9\xad\x1a\x41\x43\xa8\x09\x34\x6d\x5d\x11\x4a\xb4\xb2\x6b\x67\x39\xc6\xc5\xab\xa8\xc8\x49\xaf\x2d\xe5\x17\xf2\x42\xf0\xf6\xa3\xef\x01\xcd\x59\xdd\x92\x1b\x53\x1f\xd7\xb5\x65\x97\xed\xb0\xac\x8e\x5e\x92\xca\x2e\x48\x29\x41\xbc\x62\x3a\xc8\xdc\x72\xed\xbe\x8c\xb4\xed\x7a\x71\x0c\xbb\x6f\x93\xdf\x5d\x3b\x61\x0c\x29\x06\x66\xce\x28\xc5\xc2\xd2\xc3\x38\x92\x2f\x65\xb9\xde\xda\x25\xd9\x82\xf6\x02\x61\xad\x8b\xf1\x45\x21\xb9\x8b\x41\x48\xe1\x60\xef\x02\x1f\x1a\x87\x8c\x2e\x78\x0b\x62\x46\xd7\x14\xba\xc0\x37\xc7\xb1\xc0\x0a\x6f\x14\x62\xd1\xb4\x96\x5c\xc3\x5c\x83\x89\x11\x5f\xf4\xf0\xb5\x6d\x78\xc9\x5c\x2a\xd0\x54\xff\x05\xac\xf2\x88\xf8\xa2\xeb\xc0\x58\xb7\x4e\xb2\x39\xb3\xf0\xbf\xa4\x55\xf6\x65\xbc\xe0\x6f\x3d\x4c\xa8\x6c\x76\x8d\xde\x6e\xaa\x2c\x24\x1d\xff\x85\x2b\x7d\xb0\x96\x96\xb8\x70\xfb\xa5\xd4\xaf\xfc\xbc\x99\x2c\xbd\xa6\x72\x3e\xed\x49\x75\x00\xbe\xd7\x42\x15\x98\x75\xf1\x79\x76\x4a\x6e\x7a\xa4\x42\x52\x02\x88\x3b\x4d\x46\x7c\xd1\x0e\xa6\xf4\x9b\x09\x27\x5c\x5d\x91\xa6\x7d\x32\x96\x00\x16\xc1\xe4\x11\xc8\x02\x5a\x47\x21\xad\x23\x22\x76\x54\x45\xec\x48\x52\x3b\xd2\xd4\x5e\x8c\xb8\x34\x6e\x0a\xe0\xaf\x99\xab\x84\x13\x0c\xf4\xc8\x8b\x26\xfd\x04\x34\x64\xb4\x31\x85\xf8\xdb\x57\x53\xca\x4a\x6a\x4d\x78\x9b\xdf\x3b\xe7\xd2\x6b\xfd\x4d\x9c\x96\x88\xdd\xcc\x4e\x83\xe4\x2e\x61\xaa\x35\x21\x81\xc9\x6c\x72\x5b\xf6\xb9\x6d\xf0\xfe\xfe\xbe\xeb\x8c\x19\x27\xd5\xd1\xac\x85\xa8\xf6\x65\x07\xd8\xfa\xa9\x8f\xf7\xa9\x65\xf8\x88\xff\xc6\xfd\x75\xa0\x2b\xe5\x07\xd4\xdc\x77\xf0\x37\xbe\xfd\x72\xcd\xdc\x30\x56\x59\xcb\x0c\xd4\xb0\xc4\x58\x55\x6d\x62\xe1\x08\x0b\xb0\x57\x60\x9f\x58\x29\x7a\x58\xc8\x21\x55\x69\xc8\x19\x8c\x46\x4a\x3d\x96\x76\x21\x5f\xab\xb3\x1c\x79\x4f\x06\xef\xfd\xa4\x90\xf9\x13\x36\xb8\xc9\x3f\x2b\xe7\xd9\x50\x7c\xe0\xd8\xf4\x6b\x46\xe9\xf1\x9b\x7d\xd7\x6f\x39\xa3\x38\xf6\x30\x6e\x57\x06\x40\x4a\xd3\x76\xe0\xcd\xa6\x5f\x2c\x07\x41\xf1\x13\x07\x75\xda\xf2\x18\x78\x4a\x40\x42\xab\x8b\x2f\xc0\xe3\xcf\xb2\x2e\xea\x5d\xcc\xf0\x48\xc3\x95\x6f\x14\x1d\xb5\xb5\x12\x90\xd2\xa7\x82\x39\x62\x4b\x49\xf7\x0a\x7b\x44\x1b\x34\x2d\x6f\xeb\xb6\xdc\x05\x93\x2a\xda\x28\x6b\x14\xd0\x4c\xed\x68\xe0\x66\x02\x25\xab\x38\x55\x9c\xc4\x8f\x52\xad\x35\x94\x8b\x54\xe5\xa1\x3a\x68\xa4\x06\x83\x73\x83\xcc\xd1\xf7\xc1\xf7\xcb\xd4\x99\x58\x06\xc8\x5c\x8a\x7f\x61\xb9\x84\x4f\xd7\x4d\xf0\x25\xba\xb2\xe1\x9b\x6b\xd6\x89\xdf\xfa\xdf\x0b\xbc\xd6\x5c\x0c\x26\xfa\xa0\x09\x91\xca\x0e\xed\x89\x4a\x4e\x30\x57\x85\xd5\xba\x83\xf9\xf8\x86\x3f\x8d\x41\x1c\x79\xb5\x3a\xbd\x90\x3c\x9c\xf8\x27\xd5\xe4\xa8\x43\x58\x1c\x75\x4e\x5d\xfc\xad\xc8\x4e\xf5\x10\x56\x28\x06\xa8\x3b\xd0\x0a\x47\x23\x18\x08\x1c\x32\xb9\xb1\x18\xe0\x2d\xe1\xf4\xc8\x84\x57\x2b\xf9\xbc\xc0\xfc\x46\x33\x9d\xfd\xbd\xf6\xdb\x02\xe4\x99\xc2\xb1\xbf\xef\xeb\xfd\x54\xd4\x7b\xda\x5a\xd0\x2d\x6e\xe8\x54\x98\xd0\xf0\x85\x68\xfd\xd7\x5a\xef\xfb\xd0\x24\x74\x1f\x36\x9f\x07\x14\xed\x10\xcd\xea\x60\x08\x82\xc4\x35\x27\xea\x9d\x52\xd5\x6c\x69\x37\x52\x66\x5e\x9b\x1f\xce\x17\xd6\xff\xa7\x30\x5d\x30\x1f\xbb\x88\x56\x6a\xc3\x85\x46\xe1\xc9\x6b\x7b\x3b\x15\x1f\x77\x10\xb9\x4f\x82\xdd\x17\x18\x32\xdb\x0d\x95\x64\xd4\x31\xc4\x73\x20\xf1\x3c\x01\xa6\x1c\x1a\x5c\x6a\x3b\x77\x28\xda\xde\xf1\x35\xf2\x71\x4a\xb6\x46\x2c\x74\x20\x0b\x3d\x81\x1e\x38\x84\x33\x9f\x90\x94\x64\x8d\xd4\x46\x51\x23\x91\xd0\xce\xb7\x31\x46\xec\xdb\xd8\x09\xda\xd8\xce\xb6\x51\x70\x95\xd9\xbc\x45\x1b\xdb\x41\x1b\x63\x76\x47\x35\xa2\x47\x38\x89\x09\x61\x27\xd2\xe7\x9f\xfb\xfb\x7e\x24\x57\x6d\x8a\xab\xd6\x37\x25\x80\x53\x2e\x2e\x5d\x8e\xac\x6e\x76\x0b\x2d\x17\x29\xbd\x72\xc5\xd4\xa1\xfd\x77\x39\x7a\x59\xd9\x95\x6e\x6d\x7f\x94\xa8\x3c\xc4\x67\x31\xeb\x2d\xcf\x61\x94\xa6\x5c\xfa\xed\x62\xa8\x7a\x36\x32\x7a\x0a\xed\xf2\x41\x6e\xc6\xbb\xfc\xcc\x4e\xae\xf7\x32\x52\xa1\xc3\xbd\x99\xb0\x12\x50\xd6\x31\xef\xca\xe2\x0a\x70\xef\xd7\xb3\xfb\x42\xdc\xf7\xf5\xec\xbe\x50\xee\x19\x61\x77\x15\x6c\x1c\x71\xc3\x15\x6d\x03\xbb\xf1\x36\xb0\xbb\xf6\xf5\xb9\xed\x60\xe9\xb6\x83\x25\x6f\x07\x3d\xd5\x7d\x70\xdf\x6b\xfe\xf8\x7f\x0f\x62\x7a\x2f\xe0\xe8\x12\xcb\x96\x2b\xdc\xbb\xc1\xaf\x8a\x1d\x23\x10\xc7\x3b\xc4\xd2\xd6\xc5\x3b\x44\x3a\x83\x21\x42\xc4\xbe\xb0\xe4\xcc\x9e\x7d\x06\x4e\x92\xef\x8e\x76\xb2\x27\x87\x95\xa7\x6b\x76\xec\x12\x42\x1b\xb8\xde\x0e\x0c\x95\xca\xc3\x11\x3b\x43\x65\xd0\xe3\x75\x86\xac\x95\x4a\xc6\x9e\x5b\x2b\x3d\x5f\x87\x13\x50\xd0\x3d\x02\xa7\xb4\xd2\x9f\x49\x1c\xab\x38\xfb\x74\x9a\x78\x3e\x9d\xfb\x37\x76\xd3\x36\x58\x3e\x50\xad\xb4\xc1\xa2\x5b\x82\xa5\xf5\x11\xd9\xee\xd6\xc0\x27\xdf\x80\xe3\x63\x9b\x0c\xd7\xd2\x6d\x73\x1f\x71\xea\x2a\xbc\xd8\x43\x06\xd8\x4d\xf6\xd8\x42\x34\x21\x32\x4f\xe6\x0c\x7e\xa9\xab\xcb\xd6\xec\xaa\x4d\xa6\x1b\xaa\xdb\xa6\xb2\xbc\x2d\xc8\xf2\x95\x2d\x6c\x84\xb9\xc1\xac\x91\xc6\x42\xca\xa9\x57\x1c\x82\xab\xae\xdd\x7c\x62\x9b\x16\x69\x6e\x94\xf8\x21\xe3\x89\x60\xaa\x74\x64\x33\xee\xc5\x17\x5b\x91\x26\x8e\xaf\xd2\x7c\xe0\x53\x5f\xd5\xfe\x0c\xb0\x3f\xf9\xad\x86\x56\x0b\x46\x00\xaa\x26\x86\xbf\x80\xb5\x69\xcd\x7b\x06\x17\xaf\x60\xd1\x4c\xec\x13\xec\x1e\x2e\xed\x10\xa1\xde\xc2\x1e\xe3\x4b\xb7\x10\x0a\xa8\xa6\x37\x16\x7a\x03\xa1\x77\x18\x72\x27\xc1\x2e\x69\x03\xbd\x7f\xd3\x7a\xbe\xda\xb4\x59\x60\xe1\x14\xa6\x9c\xae\x6c\xfb\xa6\x93\x89\xd9\xf1\xa2\x7e\x38\xb0\x55\xd6\x49\xfb\x87\x27\x96\x07\x75\xab\xb3\x1a\xe1\x86\x8b\x82\xd9\xde\x85\xe7\x9a\x90\xb5\xe6\xac\xe8\x48\xd3\xd0\xd2\x02\x41\x0f\xdb\x42\x7d\xf5\xad\xe0\xe6\x58\x45\xd7\x6f\x07\xb7\xd5\x48\x14\xf5\xa8\x22\xc7\xbd\x74\xdd\x65\x56\xb4\xba\x7e\x7c\x5f\x77\x7d\x58\x3e\xf7\x46\x34\x42\x97\x16\xba\x6c\xfc\xac\x1b\x41\xbb\xfa\x23\xee\x91\x5f\xe8\xf1\x7b\x6e\xf2\x95\x51\x77\xa4\x8c\xba\x73\xb1\x2c\x9b\x2f\xb1\x22\x37\xe8\x8e\x45\x6d\x04\x6b\xc3\x9c\xec\x31\x7c\xc7\xa2\x36\x82\x15\x64\xbe\xb6\x69\xf0\xd8\xa6\xe0\xc0\x9c\x64\xf4\x68\xad\x27\xb9\x41\xf7\x08\xda\x6d\x3a\xdd\xfc\x7c\x7c\x8c\xfa\xae\x5c\xb8\x59\x17\x31\x79\x58\x9f\x16\xab\x77\xae\xcd\x8a\x8b\x2c\x94\x42\xd4\xe8\xb7\xe7\x2b\xa9\xc6\x6a\x25\xf6\xe3\x91\x3f\x3e\xba\x86\x81\xf4\xf8\x18\x55\x7d\x5d\x6b\x41\x1d\xb9\x11\x6f\x47\xe0\xad\x5a\x01\x76\x20\xb5\x93\x27\xf5\x11\x2a\xec\x37\xa3\xb4\x9d\xa0\xf4\x93\x04\xbd\xe7\x63\xee\xe1\x26\xf7\x30\xf4\x5d\x13\x7a\xce\x16\x3b\x87\xfa\xce\x21\xd1\xc0\xde\x35\x55\xc9\xae\x3a\x87\x17\x5e\x9a\x1d\xec\x51\x78\xe0\xa5\x13\x76\x5a\xa2\x2f\xab\x58\x44\x86\xfa\x35\x84\x60\x38\x47\xbb\xbb\x19\x59\xd5\x5b\x94\x2d\xfb\x37\xc1\x37\xae\xab\x53\x59\x97\xda\xf2\x89\x25\x39\x7d\xec\x59\xd9\xa8\x5d\x2a\xda\x6a\x24\xe4\xdb\xb4\x0b\xff\xb6\xd3\x69\x46\x40\xc4\x7c\xbd\x53\x3f\x26\xb6\x97\x38\x84\x30\xa0\xe2\x79\x37\xdf\xe0\x8c\x6c\xc8\xb7\x38\xb1\xa7\xa6\x9a\x3a\x71\x4d\xb7\xe8\xc3\x5d\xaa\x09\x1a\xf4\x08\xed\x17\x5b\xb7\x67\x07\xce\x55\xaa\x89\xb4\xd8\x98\x2a\xae\xcb\x23\x9f\x00\x75\x5e\x77\x95\x91\xd3\x2e\x54\x55\x0b\xa2\x3c\x8e\xe2\x5d\xa2\x30\x45\x8f\xec\xa2\x22\xf6\xd1\x73\xbb\x98\x88\x34\xeb\xbf\xae\x56\xec\xcd\x2e\x8c\x51\xe5\x0d\xd3\x26\xf3\x5f\x37\x54\x9a\x00\x6b\xbc\xa1\x8a\x69\x3f\x4a\xe9\xd1\x64\x1c\x43\x6d\x10\x70\x09\xcd\x19\x46\x45\xfe\xc8\x2f\x79\xda\x57\xd6\xb5\x4e\xb0\xa9\x38\x97\x63\x2c\xa6\x44\x92\x44\xb4\xe6\x9e\xd0\xf2\x3d\x24\x23\x39\x53\x5c\x65\xbe\x8b\x09\xac\x57\xa1\x9f\xdf\x08\xbd\x6c\x40\x5d\x1b\xd1\xad\x2d\x7f\x0b\x5f\x55\x6f\x53\x1c\xdd\xae\x9f\x5d\x30\x83\x6d\xe6\xc1\x56\x03\x61\x87\xc6\x6c\x1a\x1c\x74\xf8\xca\x6d\xf2\xa7\x1b\x25\x7a\x72\x10\x75\xfa\x94\x84\xc8\xc7\x62\x47\x32\x39\x98\x77\x9c\x1a\xcc\x3c\xe1\x44\x63\x0b\x79\x53\x8f\xaa\xa5\x1b\xd4\x12\x48\xc9\x24\x25\xdb\xda\xf6\x52\xa3\x50\x2a\xd3\x52\x3d\x8e\x34\x6b\xe9\x13\xed\x4f\x86\xa4\x45\x2e\x94\x3e\xf6\x5d\x32\xd2\x86\x9f\xc8\xf8\x44\xde\xe6\xe4\xf5\x60\x67\x99\x62\x45\x19\xee\x31\x0a\x66\x8d\x62\x2c\xd7\x5d\x84\x07\x01\x0f\xa3\x14\xf1\x5d\xe3\x2e\xe5\x50\x81\xd1\xde\x06\xa0\x1b\x98\x4f\x65\xd6\xee\xb0\x3c\xc3\x2e\x75\x07\x8e\xd8\xb4\xa0\xa0\xb1\xf9\x40\xbf\x8e\x4b\x4c\xb5\xe7\xcf\x13\x91\x57\xc2\xb3\x76\xee\xcb\xde\xeb\xa0\x35\x67\x00\xc1\x67\x6f\x5b\x41\x57\x55\x50\x8a\x61\x72\x54\x31\x4e\xec\x16\xfb\x0f\xf3\x81\xb7\xdb\x22\x9a\xb3\x2d\xd7\x0a\xb5\x49\x97\x66\x25\x34\xc2\x7c\x67\xad\x31\xcf\x9c\x15\xc8\xd9\x67\x9c\xd5\xc7\xfe\xf8\x26\xa8\xb2\x82\xd6\x44\x47\x91\x21\x46\x30\xb2\x3c\xc7\x10\x0c\xda\xd4\x85\x31\x1f\xca\x39\x46\x04\x7a\x33\x2f\x27\xfd\x99\x19\xf9\xa6\xc4\x48\x9d\x7b\x62\x51\xa9\x79\x39\x42\x31\xe7\x48\xa7\x7f\x63\xd3\xa5\xc3\x9b\x43\xd3\xfa\xa6\x6e\x73\x5d\x53\x3d\x18\xe7\x44\xe9\xbe\x78\xe0\x4d\x88\x89\xae\xc2\x6f\xa5\x66\xc3\x86\x03\xca\x79\x5e\x0f\x40\x9f\x1f\x85\x58\x5c\x5f\x54\x6a\x68\x5c\x51\x0c\xea\x7e\x11\x3f\x43\xe6\x08\x01\x48\x03\x4a\xb6\xc3\x92\x96\xe9\x62\xb4\x40\xd9\x62\x47\x71\x2f\x68\xb3\x83\xee\x84\x90\xb7\x2f\x3c\x07\xa2\x36\x54\x52\x9e\xe8\xfd\x68\x98\xd2\xff\xfc\x84\x49\x63\x4f\x05\x08\x4a\x4c\x06\x01\xe5\x26\x0f\xe1\x50\xc9\x30\x95\xbc\x95\xc3\xf3\x52\x56\xce\x43\x81\x29\x30\x0b\x1c\xfd\x6a\x3d\x93\x9d\xc0\xe3\xdf\xd5\xd2\xfa\x4e\x8f\x3f\x4b\xbf\x91\x39\x0c\x0a\xa3\x4a\x8e\x0d\x9c\x38\x85\xcf\x56\xc3\x11\x50\x10\x80\xa9\x1f\x7f\xe8\xea\x3d\x8b\xb0\x49\x0c\x01\x5b\xdf\xd2\xb0\xff\x48\xc1\xd9\x0a\xc2\xb6\x6b\x0e\x30\x94\xcc\x4c\x7a\x9d\xba\xc9\x85\x6d\x63\x1a\x22\xaf\xdd\xac\x00\xc2\xb7\xe5\x07\xe0\xab\xc2\xa1\x25\x08\x43\xfd\x28\x28\x6e\xc9\xd2\x7d\xa8\x9b\xee\x06\xe7\x77\x3a\xff\x63\x8e\x4d\x3b\x33\xa7\xb2\x11\xe8\xcc\xc3\xad\x60\x34\x99\x7b\x96\x09\x46\x86\xbd\xff\xfc\xbf\x71\xef\x3f\xdf\xb1\xf7\x25\xe3\xfe\xfb\x76\xbf\x18\xc3\x1b\x7a\x3f\x23\x32\x3d\xdd\x16\x82\x64\x61\x48\x2b\x6b\x3a\x74\x48\x20\xd6\xe8\xf8\x1c\x8a\x44\x6c\x9d\x45\xad\x97\xba\x2f\x8e\x42\xa0\x17\x0c\xf4\xc2\x2d\x9f\x7e\xfd\xf5\x82\x3a\xb5\x64\x78\x25\xc0\x42\x7c\x07\xee\x9e\xdd\xd1\x70\xf2\xc6\x28\xcb\x14\x2f\x85\x04\x34\x3c\xfa\x4e\xc1\x51\x48\x4e\xd3\x8d\x2e\x93\x3a\xe8\x4b\x82\xee\x40\xa1\xba\xbb\xef\x43\xc1\x47\xdc\xfa\x77\x07\x13\x5c\xf6\x08\x03\x97\x60\x2e\xa7\x54\x2e\x83\x54\x58\xd6\xc6\x03\x2e\x30\x18\xd9\x91\xec\x0e\xeb\xea\x85\x4f\xa2\x7b\x42\x54\xa9\x15\x78\x85\xbc\x3d\x94\x98\x2c\x7e\x59\x93\x50\x82\x0e\xe4\x94\x99\xde\xdc\x3c\x5f\x72\x8e\x97\xf2\xa1\x58\xeb\x99\x58\xa7\xf1\xdb\x69\x84\x41\xc6\x73\xcb\x19\x97\x0c\x5f\xa4\x41\x8a\xfa\x79\x00\x00\xdf\xee\x1c\x1f\xc7\x55\xcb\x65\x17\xd0\xaa\x89\x45\x29\xae\xd3\x55\x16\x1f\x1d\x02\x84\x5a\xc6\x24\x0f\x83\x53\x43\x02\x76\x1d\x2e\x72\x30\x21\x41\x7b\x42\x20\x39\x9a\x62\x39\xa1\x5a\xb2\x05\xb1\x59\x7b\x22\xf7\x47\xc8\x76\x8f\x25\xd5\xbb\x34\x84\x32\x9a\x08\x9e\x39\xc0\x35\xf6\xf8\x30\x01\xd1\x9a\x51\x41\xd5\x45\x5a\x74\x42\x8a\x69\x1c\x96\x86\xfe\x34\x71\xca\xeb\x77\x40\x46\x9f\x0c\x4e\x6d\x15\x4c\x5a\xae\xf3\x24\xf7\x2a\x4f\xa4\xb1\x30\x44\xbc\x58\xb9\x8c\xb4\x14\x16\x32\xfa\xe6\x42\x38\xb9\x92\x54\xd3\xfc\x31\x43\xff\x73\xe8\x02\xf7\x61\xe8\x82\x97\xbf\xf8\xf3\x5b\x99\xf7\x6d\xdc\x54\x94\x59\x1e\x18\x4e\x0f\x2b\xa0\x0b\x55\x4d\x92\x39\x9a\x7b\x31\x7f\x76\x58\x6c\x19\x51\xb4\xda\x56\x73\x29\x5c\x51\x25\x39\xb6\xe7\xb2\xfd\x29\xda\x9e\x6e\xde\xad\xba\x97\x67\x21\x8d\x69\x9d\x55\x71\x3d\x2c\x21\x48\x22\x0e\x44\xfa\xd8\x3f\x7e\x6c\x6f\x54\x93\xaa\x89\xfe\xc5\x07\xf7\x73\x35\xb8\x9f\x57\x0d\xee\x6c\xef\xdf\x72\x70\x8b\xf1\xb1\xf5\xd8\x7e\xfe\xb3\x8f\xed\xec\xd4\xbd\x5d\xf7\xde\x70\x70\x7f\xb2\x99\xb3\x8c\x39\x5c\x34\xdd\x92\x19\x6e\x69\x3f\xda\x3d\xf1\x1d\x5e\x97\xc2\x25\xab\x9e\x5c\x9e\xb6\xb6\xa0\xc9\xce\x9c\x0f\x06\xda\xee\x84\x0a\x27\xaf\xc0\x8d\xe2\x9d\xd0\x26\x3d\xbd\x96\xd4\x94\x82\x17\xa9\x77\x33\xa5\xdb\xbd\x8b\x15\xbb\x77\x4c\xbe\x16\x13\x40\x19\x6a\x74\xef\x7c\xeb\x8a\xe2\x5d\xb4\xbe\xcf\x30\xe5\x9d\xfd\x40\x84\x76\xd0\x21\x2d\xb0\x5b\x36\xff\x50\xc1\x23\xc6\xf2\xdc\x7e\x6c\x63\x2f\x54\x03\x68\x5b\x86\x3d\xff\x6f\xc2\x30\xac\xc3\xae\x40\xc4\xb0\xe7\xc0\xb0\xe7\x9a\x61\xdf\xee\xc2\x30\xda\x0c\x48\x26\x09\x5f\xbe\xd8\xd7\x8e\xf7\x5b\x68\x41\xb6\x7a\x6b\x55\x35\x78\xd3\xc5\x4c\xe3\x6e\x77\x9a\xba\x15\x86\xb9\xc9\x7b\x1c\xff\x86\xc7\x12\x74\x8b\x83\x3c\x2c\x1b\x85\x7d\x6c\x51\xfa\xa1\xa5\x8e\x7b\x0a\x1f\x34\x32\x75\x28\x56\xd0\x81\xd3\xd3\xf9\xbc\x5c\x13\x7d\x2d\xf5\x1e\x5d\xfa\xd2\x6b\x91\x3c\xa6\xd2\x96\xee\x74\x9d\xe4\xca\xb6\x7d\x79\xee\x00\x10\x4c\xe2\x3a\x46\xc6\x0f\x55\x78\xd5\x49\xd1\x83\xfc\x35\x2b\x96\xf5\xc7\xa3\xa5\x6c\x49\x9e\x98\xce\xff\xd2\x27\xc2\x60\x76\xc9\xb8\xd2\xe1\x19\x8a\x83\x5d\xd5\xc3\x7d\x21\x43\xc0\x6e\x89\x3c\x81\x18\x13\x24\xac\xdb\x7a\xc1\x4b\x1e\x4d\x2e\xe8\x64\x32\xcd\x17\x7f\x4b\xea\x28\x8f\x47\x47\x1b\x90\x80\xab\x76\xe1\x2f\xed\xad\xdd\xc7\x3a\xde\xd4\x14\x7a\x28\xe2\x48\x0b\xb6\xae\x29\x57\xc7\xc4\x0a\xe6\xe3\xc3\x78\x37\xdf\x10\x95\x2f\xae\xd6\x29\x79\xd2\x0f\xb5\xd1\x6c\xc9\x3a\x19\x62\x76\x1c\xcb\xc8\xdf\x56\x42\x80\x23\x37\xd9\xfa\xc3\xf2\xcd\xbc\xc4\x40\xc5\x76\x34\x01\xd8\x61\xfa\x7e\x11\x83\xe0\x81\x71\x04\x82\x04\x10\xb5\x1b\x26\x4b\x76\x16\x64\x66\x6c\x6e\xa6\x3a\x03\x8b\xbd\xdb\x47\x8d\xd9\x24\x78\x84\xfc\x48\x5f\x42\x40\x47\x74\x9a\x03\x74\xfa\x57\xb6\x56\x16\xa9\x8d\x61\xc9\xb8\x0a\x71\x9f\x2e\x8e\x69\xba\x5d\x88\x65\xf6\xc1\x5b\xb1\xdf\xdd\x3a\x78\x54\x22\xd5\xd7\x98\x27\x84\x3d\xd7\x6c\xdf\x00\x60\x01\x3b\x93\xe1\x79\x1d\x37\x6c\xae\x0e\xca\x8c\xeb\x1f\x85\x0b\xd3\x52\x50\x04\x55\xae\xb3\x47\xa3\x27\xcf\x7a\x35\xae\xe3\xe4\x8e\x75\x76\x14\xc9\xd6\xe1\x31\x4e\xce\x06\x5b\x21\x29\x4c\xc4\x4a\xc6\xd4\x5b\x74\xc7\xed\x7c\x3a\xff\x35\x4c\x2c\x1f\xe9\x94\x2e\xbb\xa9\x27\x13\x84\xaf\xad\xbf\x66\xd6\xb0\xd3\x5b\xdc\x7b\xf1\x91\x53\x2d\x2f\x4e\x50\x0c\x49\xb7\xd9\xe2\x09\x7f\xaa\xc7\xce\x07\xf1\x2b\x12\x50\xdd\xc0\x5e\xfa\x52\xb6\x1a\x1b\xd6\x6d\x01\x32\x08\x6e\xa0\x88\x48\x88\x1f\xe1\x64\x99\x25\xe8\x63\x14\xa0\x42\xe6\x82\xcb\x94\xfb\x26\x47\xb8\xb6\xf8\x7e\x04\x8e\x71\x86\xbe\x13\x7c\x0c\x16\x19\x8d\x6f\x4f\xd0\x13\xc4\xe2\x77\x9b\x7f\xb7\xe9\xb7\xf9\xff\xa1\x08\xa6\x5c\xf8\x00\xc6\xf6\x7d\x4d\x0a\x65\xed\x84\x52\x26\x74\xb1\x8a\xa0\xe4\x06\x9c\xe8\xc1\xf0\xa4\x19\x07\x97\xe2\x63\x3f\xe8\xbb\xe8\xa1\x74\x74\x9e\xc2\x93\xf7\xf9\xf4\x6a\xd2\xaf\x9d\xaf\xb8\xcc\x3d\xf4\x1a\xbe\x0b\xef\xd7\x0b\xe0\xb5\x06\x5e\x57\x02\x0f\x0f\x8b\xa1\xef\x88\xb0\xb5\x1c\xf3\x83\xc6\x25\x3c\x32\x7a\xb9\x90\xd3\x3f\xdd\xc0\xfc\x68\xae\xb3\xe3\xcd\xf9\x70\x04\xf1\xf3\xfd\x48\x02\x5f\x94\x98\x03\x7c\x1e\x6f\x3a\x9b\x9c\x3f\x3c\x75\xc1\x40\x4c\x17\x57\xfb\x76\x7c\x05\xfb\x90\x7a\x95\xf0\x9a\xd5\x56\x32\x82\xde\xbd\x96\x10\x73\x03\x51\xc1\x9a\x23\xc5\x9b\xe5\x7c\x88\x8e\x19\x15\xfc\x81\x09\x22\xc1\x4e\xb6\x11\x00\xbb\x4e\xfa\x78\x82\xc7\x62\x60\x8b\xab\xc2\x0d\x0e\x6e\xda\xc0\x77\x83\x02\x17\x7a\x78\x86\xd7\xfc\x37\xe8\xd8\xac\x93\x31\x06\x6b\xe2\xe8\x10\x0b\x4c\xef\xb0\x27\x05\x3b\x51\x98\xef\x39\x78\x9e\x98\x64\x3f\xe7\xf2\x21\x53\xcd\x8a\x8b\x2e\xe2\x1d\x29\x44\x16\xa8\xba\xa8\x24\x41\xc3\x5b\x7d\xb5\x1a\x0b\x6c\x4d\x09\x2d\x2a\x10\x5d\x76\xd1\x6e\x0d\x61\xc8\xe1\xef\x0e\xfd\x0e\x58\xf5\x07\xee\x44\x78\xbe\x92\x43\x50\x00\x3f\x16\x78\xcd\xb1\x1d\x5a\x37\x5c\x97\xdb\x80\xf5\x2e\x48\x3e\xfe\x80\xfa\xdc\xef\x0e\xa8\x80\xa7\x1b\xce\x87\x22\x51\xe4\x6a\x48\x8e\xcc\x1b\xc4\x52\x8f\x1e\x21\x30\x9f\x67\x66\x4c\x30\xca\x38\xbe\xba\xad\xeb\x06\x21\xd6\xa3\xc7\x0d\xe2\xba\xd6\xc9\xba\x36\xbe\xa0\x94\x89\xf7\x6c\x83\x79\x8b\xe2\xc7\x15\x2a\x87\xa1\x11\xb4\x2e\x43\x46\x2f\x50\x43\x0a\xad\xb4\xb8\xc7\x95\x4c\x89\x3c\xb6\xc3\xe2\x2c\xe8\x3d\x86\x49\xb6\x71\x31\xfc\x90\x7b\x34\xe4\x97\x6b\x1d\xde\x3e\x93\xaa\x4a\x9a\x60\xf9\xc0\xd2\x19\x94\x39\xa1\xb0\xf5\xb8\xd0\x9e\x65\xde\x18\x11\x8d\x8d\xc2\xa7\xc7\xc4\x1d\x23\xce\x66\x67\xf0\x59\x03\xff\xa5\x25\x1c\x3f\xf1\xab\xa8\x8c\x51\xaa\xa6\x69\x49\x11\xa5\xc3\x10\xbd\xe4\xc3\xd6\x6b\xe1\xa3\xf5\x35\xa7\x07\x43\xe4\x0f\xce\xeb\x72\x5e\xcf\xe5\x85\x7a\x71\x7f\x30\x2a\xaf\x26\xa5\x1a\xfb\xe1\xeb\x23\x6e\x6d\x54\xaa\x74\xad\xee\xd7\x0d\xfd\x9c\x08\x07\xef\x26\xe8\x77\x57\x65\x1f\x8c\x24\xb1\xe6\xdd\x60\x3d\xc7\x06\x4d\xb8\x89\x26\xde\x9b\x8e\x67\xa5\xd0\xac\xe9\xbb\x38\x8e\x66\xab\x1f\x7b\x12\xb5\x25\xee\x19\x16\x7b\x65\xc7\xca\x3a\x0b\xf2\x5a\xee\xcc\x6d\x65\x66\x8c\xde\x97\x82\x13\x03\x04\xac\x85\xa8\xc7\xf8\x01\x2b\x91\x80\x1a\x35\x6a\xdb\x6d\xbd\x71\x74\xcc\xb6\xd5\xea\x4d\x41\xa0\xa9\x39\xa0\x78\xad\xee\x37\xb6\x7e\x8d\x65\x65\x7a\x62\xbd\xa0\x57\x59\xa0\x4f\xce\xa0\x53\xce\xa0\x57\xe0\xd7\xc1\x99\x6c\xb2\xa1\xf9\x4e\xfc\x0a\x9b\x29\x83\xed\xc1\x82\xd8\x76\x2c\x0d\x69\xd8\xb3\x98\x76\x90\xdd\x40\xaf\x18\x00\xfe\x6d\xd6\x56\x8c\x02\xfe\xb5\x91\x58\xc4\xa2\xb2\xb2\x6f\xc4\xac\xb5\x1a\x52\x84\x4f\xca\x1c\x29\x1b\x07\xf5\x55\x3d\xf5\x3a\x0b\x3e\x01\xa2\x6c\x1c\xb1\x06\x6d\xd1\xf4\xe9\xde\x40\xc7\xc8\x32\xa2\xb3\xdf\x5a\xc5\x30\x78\x3b\x04\x60\xd6\x0c\xb3\x4e\xe1\x79\x0c\x0d\xaf\x73\xeb\x33\x78\x1e\x03\x5b\xea\xcc\x9b\x00\xcf\x8a\x17\x65\x53\x54\x2d\xba\x6b\x97\xbe\x8e\x63\x9d\x6f\xd3\x7e\x9c\x80\x50\xe1\x3e\x28\xeb\x9e\x19\xf4\x32\xce\x9a\x72\x58\x33\x0f\x89\x36\xe5\x14\x7f\x56\x67\x21\xc4\xfa\x4c\x73\x67\x1d\x41\x18\x1c\x8a\x37\x49\x1c\x8a\x33\x1a\x87\x65\xcc\xea\x2c\xc9\x97\xf5\x59\x22\x1e\xbb\x7c\xb1\xb8\x8f\xdb\x7b\x83\xb8\x49\xb3\xa1\xbf\xe6\xe1\x09\x21\x29\xd4\x74\xe8\x43\x2f\xf6\xd7\x8e\x0c\xd3\xa0\x7d\x53\x9c\x8d\xc7\x4c\x3d\x25\xba\xae\x73\xb3\xd7\x86\xde\xc3\x10\xe8\x60\xdc\xca\x09\x44\x5b\xdb\x70\xf1\x4d\xf9\x8d\x99\xc6\x60\xe8\xa0\xdf\xf0\xc8\x66\x78\x81\x05\x8f\x2b\xcc\x1c\x28\xcf\xe3\x5e\x9d\x40\xcb\x26\xb0\x8b\x9d\x60\x94\x84\x78\x60\x4e\x56\xa9\x09\x6e\x73\xf1\x1d\x5d\x58\x58\x0c\x11\xfb\x78\x15\x74\x02\x0b\x0b\xde\x01\x6d\xb5\x3b\xf1\xd9\x18\xb5\xf1\x99\x51\x95\xfb\x55\x0d\x3d\x52\xc5\x92\x4e\x59\xdc\x80\x17\xbc\xc3\xe5\xbd\xee\x51\x00\x33\x69\x51\x0b\xd7\x1e\xa4\x08\x9d\x31\x93\x94\x11\x62\xf3\x17\x79\xb3\x81\xc0\x9b\xb6\xeb\x93\x0d\x6d\x24\xea\x81\x82\x16\x5b\x96\xc4\x96\x3e\xa3\x57\x27\x6e\x4c\xed\x4a\x5b\x38\x07\x82\x11\xba\x11\x53\xb0\x8b\x5b\xe1\xfd\x45\xbc\x80\x05\x71\x70\xe0\x09\x15\x03\x86\x89\x18\x08\x7f\xed\x12\xad\xe7\x14\x59\x4e\xc6\x46\xcb\x19\x8c\xa6\xf0\x58\x1b\x99\x4a\xc6\x74\x07\x9a\x12\x1f\x3d\x2a\x3a\xc5\x0f\xa1\x23\x0d\x0d\xf4\x22\x3a\x98\x9c\x60\xff\xc3\xb1\x06\x5a\x84\xcc\x84\xa9\x89\xcf\x78\x75\x47\xe7\xf4\x7a\x10\xc6\x95\x5d\x87\x70\x9d\x5e\x8d\xdd\xa4\xa6\x2f\x05\x89\x24\xd6\x69\x59\x5f\x5b\x48\x52\x03\x24\xe4\xc6\x09\x1f\x2a\x03\x18\x24\x6d\x3a\x5d\x66\x29\x76\xda\xad\x01\x6a\x95\x7d\xf5\x02\x4d\x5f\xc9\x0f\xaa\x1b\xe0\xb0\xfa\x7d\xb2\xc3\x80\xec\x6f\x78\x69\x9e\x5a\xfe\x3d\x51\xaa\xb2\xeb\xa1\xd9\x3c\xca\xea\xce\x53\x26\x75\x4b\xed\xbf\x01\x74\xed\xbc\x51\x10\x01\x5b\xd7\x62\x96\xff\x7e\xa4\x39\x26\xcc\x25\x61\x7d\xbf\x19\x42\xd0\x47\xac\x0b\x8b\xa0\x1d\x93\x7e\x91\xa1\x73\x73\xfd\xf4\x22\x4c\xa0\xfc\x24\x9e\xa0\xcd\x3d\xef\x12\x73\xdd\xae\xa2\xab\x05\xfe\x59\xd3\x9f\x0a\x5a\xe4\x44\x6f\x36\x87\x81\x02\x85\xba\x8e\x35\xad\xd8\x01\xe0\xca\xa2\x9e\x84\x3a\x12\xc0\xc1\x9f\x40\x10\xba\x87\x13\xa7\x2a\x3c\xb8\xe5\xe0\x2d\x9e\x31\xb3\x28\xe2\xad\xb6\x43\x7e\xf3\xe7\xcc\x24\xf2\x75\x1a\xf9\xe0\xe6\x1b\x6b\xdf\xc5\x7e\x73\x79\x12\x5a\x64\x71\xae\xda\x0d\x9c\xc5\x29\x9e\x27\x46\x81\x41\x2a\x3e\x8a\x80\x03\xcb\x79\x96\x20\x90\xb3\x7f\xe6\x6c\xf1\xfe\x93\x02\xc8\xd1\x27\xdb\xde\xed\x8e\xc4\xa7\x46\x5b\x5a\xdb\xee\x34\x33\x6e\xbc\x0b\x4f\xb3\x82\x63\x62\x21\x07\x9a\xc8\x92\x5b\x30\x01\xb3\xdb\xbe\xcd\xc8\x0e\xd7\xd2\x6d\x9a\x99\xc8\x4b\x3b\x63\x04\x3b\xbd\xf8\x55\x4e\x7f\x64\xb4\xa1\x6c\xe2\x45\xcf\x56\x3e\x54\xa4\x16\xd7\xba\x9c\xed\x07\x58\xc2\x0e\xd1\x7b\xc5\xda\x74\x71\xa5\x02\x13\xbf\x4d\x40\xd1\x45\x91\xbf\x6c\xd2\x4a\x7f\xae\xe9\xd3\x33\xa7\x92\x1c\x27\x8f\xc9\x7f\x22\xbd\xa0\xe3\xf8\x38\xaf\x25\x41\xf4\x6e\x73\xb1\x4a\x2c\xf9\x8b\x75\x62\xc9\xef\x81\x32\x31\x1f\xe0\xfa\x0c\x7e\x08\xd8\x52\xb5\xa9\x66\x00\x7c\x77\x28\x4b\xb6\x80\xf2\xa4\x2d\xe0\x74\x66\x5d\x4f\x62\xeb\x6c\x85\x0d\x26\x20\x60\xb1\x0d\xcd\x61\x3b\xd8\x0a\xdb\x01\xd3\xb6\x58\x33\xd6\x83\x34\xb6\xfb\x5b\x61\xbb\x7f\x6a\x5b\x18\xa8\x0b\xd9\xab\x9e\x89\xc5\x90\xb5\x0e\xf6\xbe\xa0\x20\x95\xd2\xee\x32\x1e\x4e\xbe\x1a\x2e\x96\xe5\xa4\x37\x38\x10\xfb\x6f\x7e\x48\x6d\xb1\x7c\xe1\x95\x6e\x67\xcd\x2f\x60\x91\x4e\x8f\x12\x25\x6a\xcc\xf0\x78\x0c\x81\xf1\x8c\x32\xb6\x86\x9f\x6b\xfc\x69\xe6\xbe\x0d\x40\xb2\x3e\x48\x46\x55\x70\x27\xa6\x76\xcc\x44\x4a\x00\x1d\x86\xa2\xfe\x4e\x7b\x37\x23\x9a\x28\xec\x94\xdd\xbc\xd9\x84\x35\x3e\xb0\xe2\xda\xd7\x87\x30\x5b\xfd\x15\xee\xcf\xe0\x57\x10\xcf\xd1\x83\x3e\x52\x9c\x89\x37\x56\x16\xd2\xe0\xf4\x31\xbc\x02\x66\x3a\x6c\xb1\x7f\x03\xbe\x38\xc0\xd9\x7c\x3a\xbb\x16\x49\x0a\xfe\x7e\x41\x31\xc4\x04\xfc\xfd\x82\xa2\x9d\xa5\xe0\x65\xc7\x15\xfc\x64\x67\xf5\xf6\x37\x39\x45\x1b\x3f\xa3\x5a\xef\x76\xc2\xf2\x49\xd0\x58\xcb\xa7\x63\x9c\xa1\x41\xfd\x80\x6c\x15\x6f\x23\x5b\x85\x77\xe8\xf6\xf3\x64\x58\xfc\x4b\x01\x33\x6a\xf1\x7e\xb8\xec\x5d\x80\xb1\xe3\x5f\xb4\x79\xae\xe8\x95\x66\x01\x6a\x1f\x0a\x26\xa5\x46\xf0\x18\x5a\xa7\xba\x8a\x1d\x3d\x02\x44\x9d\x1c\xa2\xb1\x98\x0a\xdb\x20\x3a\xa8\xa2\x68\xcc\x08\x0f\xb6\x40\x74\xbf\x8a\xa2\x71\x72\x73\x5a\x1d\xde\xac\x6e\xa5\x87\x96\x1b\x6a\x09\x0e\x05\x04\x1b\x99\x87\xf0\xd4\xdb\x6c\x3a\x02\x57\xbe\x37\x5d\xda\xc7\xe8\xb4\x70\xb9\xd6\xb9\xca\xe3\x03\xd5\xd8\xfb\xad\x39\x24\xdb\x67\xae\x7c\x52\x57\xf8\xc9\x94\x78\xad\x15\xe2\x2c\x95\x6f\xf0\xd7\x1b\x08\x7f\x8a\xbf\xba\x06\x21\xe4\x76\x5b\x73\xb0\x89\x1b\x90\xee\x1b\xfc\x7c\x03\x9f\x6f\xc0\xc1\x0d\x3f\x21\xca\x76\xa9\x23\x72\x38\x25\x6a\x19\x69\xac\x7b\xff\x63\x0f\x26\xe0\xfd\x33\x43\xc9\xd9\xc5\x60\x55\x13\xa7\xd8\x86\x98\x7d\xa8\xf3\x6e\xb1\xac\xd7\xf3\x50\x6f\x00\xea\xcd\x26\x28\x08\x07\xde\xed\x12\xd4\x91\x5e\xed\x35\xbb\x7f\x8f\xaf\x00\x46\x1c\xff\xbd\x7b\x1c\x30\xc3\x74\x02\xa8\x85\x6f\xf2\xc1\x1c\xfd\xcb\xc7\x06\x3e\x5b\x08\x7f\x79\xb4\xe0\x1c\xbe\x34\x1b\x9d\x22\x78\x31\x1c\xd3\xba\x6a\xb2\x9e\x5c\x9e\x46\xe4\xd4\x4a\x93\x6a\xaa\x32\xff\xe6\x3d\xac\x7a\x54\x12\x40\xf5\x0e\xf9\x63\x40\x43\x37\x50\x6e\x2d\x65\xf5\x18\x59\x37\x83\xac\xa2\xab\x7d\x3d\x46\x08\x31\x1a\x68\x54\x6d\x19\x1e\x6a\xf6\x2a\x7b\xe6\x9b\xab\x71\xd7\x5e\x6e\x8e\x92\x2b\x7a\x86\x00\xa2\x19\xb1\xcf\xcf\xc6\xee\x6f\x3d\x58\xe1\x25\xc2\x1a\xc4\x3e\x5a\xc2\x40\xc3\xc1\x54\x49\xf0\xcb\x25\xbf\x46\xa6\xe9\xa1\xe4\x0a\x82\x09\x20\x1a\x4a\xdd\x61\x84\xea\x6c\x82\x6d\x7b\xda\x1a\x95\x8b\xe5\xef\x26\xfd\xc1\x2a\x07\xf2\xa5\x02\x81\x47\x73\x61\x81\x81\xff\x16\xfe\x15\x57\x7b\x46\xf0\x4e\x1c\x11\x60\xf0\x51\xd3\xdc\xbd\x3d\x62\x57\x17\x7f\x53\x1e\xef\xe1\x6b\xe8\x59\x97\xa1\x6c\xb0\x1a\xf4\x6a\x30\x94\xc0\x17\xb3\x9b\x05\xfc\x92\x00\xbb\xf5\xba\x1e\x8b\xb5\x2e\x3e\xfb\x36\x36\x7c\xed\x43\x94\x91\xc7\x86\x0d\x72\x58\x52\x36\x3f\x02\xdb\x1d\x42\x7b\x02\x73\x14\x3d\x68\x8d\x06\xac\x7d\x03\xba\xe0\x9d\x14\x46\xb0\xc6\x11\xbd\x08\xcd\x47\x58\x2f\xb6\xa9\x1c\xa3\x3e\x0d\x47\x55\x44\x7b\x17\x13\x22\x4f\x50\x5d\xc5\x38\xaa\x62\x9c\x9d\xa3\x0e\x46\x1b\x5b\xdf\x91\xcd\x5d\x19\x45\x0e\x8b\xa1\x74\x5e\x59\x1d\x66\xc6\x39\x76\x6c\xdd\x2f\x4a\x91\x79\x2c\x3f\x90\xc4\x28\x91\xc6\x0d\xb4\xd5\x81\x2a\xd1\x8d\x8e\x05\x03\xfe\x2b\x4d\x7d\x5b\xce\xeb\x67\x58\xad\xed\xe2\x51\x71\x60\x76\xd0\xef\xe0\x95\xcd\x27\xa6\x7a\x03\x0f\xbf\x41\x37\xad\x98\xa2\xdd\x1a\xce\x4d\x3b\x40\xd1\xcb\x2c\x1f\x01\xc4\x86\x0b\x29\x0e\xb9\x02\xe7\xef\x92\x95\x63\x56\xa6\x9b\x19\x34\x25\xf5\xaa\xcb\xea\xd5\xe2\xa4\x36\x45\x22\x4d\xa3\xc9\xab\x77\xda\x5a\xc5\x32\x6e\xd1\x7a\x6b\xd6\xfa\xda\xde\x9e\x5d\x86\xdc\xd9\x32\x9f\x8b\x27\x26\x91\xc1\x75\xef\xa4\xb9\x7f\xfa\xa4\xf6\xe4\xf0\x4f\xfd\xfd\x3f\xb5\x9e\xfc\xa9\x7f\xf7\x07\xfc\xb3\x5f\x37\x69\x27\x83\x5f\x9f\x62\x3e\x7c\x3f\xb9\xf7\xa6\x91\xe9\xdd\x82\x3c\x1e\xbf\x1d\xbc\xf9\xf5\x6a\x56\xcb\x4c\x58\x72\x9b\x6a\x14\x7b\x6f\x88\x44\x2d\xd3\xa2\x91\x53\x21\xc7\x92\x8b\xa1\x42\x37\x9d\x7b\x17\xa3\x73\x25\x53\x9a\xcd\x21\x68\xbd\xe8\xf6\x77\xa7\x76\x9e\x28\x68\xf8\x4c\x15\x98\xe9\xa8\x25\x78\x52\x1a\x9b\x12\x20\xd5\x44\x18\x93\x80\x38\x58\xf3\x21\xf0\xc9\xf4\xbc\xd0\x2b\x42\x8d\xce\xaa\xf7\x16\x28\x96\xf7\xc8\xd5\x03\x74\x8c\x49\x39\x1e\x2c\x5a\x17\xe5\xa2\xd6\x6d\x2d\xa7\xcf\xa7\xef\x07\xf3\x67\x46\x91\x84\x27\x00\xcc\xb6\xec\xde\x9f\x6b\xff\xe3\x07\x03\xf6\xa7\xda\x0f\x17\x8b\xd1\x9f\x6a\xf5\x7b\xc3\xd6\xd2\xa8\x7a\x46\xc6\x11\x8a\x40\xc7\x0b\xa7\x33\xaf\x1e\x87\x46\xe2\x0e\x27\xb4\x41\x31\xa4\x19\x98\xde\x74\x64\x46\x62\x1a\x05\x3a\xb3\xb6\x86\x0b\x72\x6a\x4d\xd4\x84\x19\x10\xd2\x86\xda\x34\x45\xad\x65\x0f\x9d\x9f\xf0\x68\x2c\x51\x84\x35\xa2\xb4\xb8\xa9\x13\x1f\x91\xe5\xc5\x69\x3c\x5e\xa8\xbe\x70\xd0\x60\x6a\xc5\xc8\x21\xf2\xa3\xf7\x8d\x79\x79\xea\xf1\xdf\x09\xae\x4d\x6e\x00\x4d\x48\x01\x75\x9f\x6d\xbb\xab\x34\x1b\xca\x9a\x07\xeb\x7a\x37\xdf\xa1\x50\xc6\xe4\xe1\x6e\x9b\xa7\xf4\xca\xbd\x55\xad\x55\xaf\x21\xaa\x5e\x66\x9e\xd7\x05\x82\x23\x2c\x5a\x72\xd1\x1e\x1d\x98\xf8\xc3\x70\x01\xd3\xd5\x30\x5d\x07\xb3\x49\x89\x4a\xd1\xc8\x48\x56\x30\x1d\x36\x2a\x54\x2c\x62\x06\x66\x94\x9e\xf5\x07\xe7\xe5\xd5\x48\xd9\x7b\x23\xcf\x95\xb3\x61\x7f\x30\x59\xda\x37\x5d\x8e\x34\x06\x9a\x93\xe0\x95\x49\xa5\x46\xc3\xc9\xa0\x9c\x1f\x86\x15\xd0\x9a\x05\xae\xb3\x3e\x0b\xbe\x28\x1d\x8c\x2d\x55\x22\xda\x96\x00\x38\x6e\x0c\x15\xec\x5d\x75\x87\xbd\x6d\x4a\x22\xa0\x2a\xba\x18\x4e\xb6\x29\x68\xc0\x54\xb1\xc1\x6a\xb6\x4d\x31\x03\xa6\x09\x45\xbf\xff\xad\x28\x15\x97\x58\x6c\x9d\xb0\x1e\x43\x3b\x1d\x76\x4a\xa0\xdc\x6e\xd9\xbb\xf4\x59\xf0\xc5\xe9\x66\xcf\xd3\xdb\xaa\x4a\x82\x14\x06\xb1\x7a\xd0\xc9\x67\x63\x1b\xfd\x5c\xf4\xf4\xde\x70\xb2\x77\x28\x87\x07\x55\x3b\xbd\x5a\x7a\x6a\xe6\x83\x6b\x78\xac\xbc\x61\x0b\x34\x4d\xee\x9e\xcc\x3e\x1f\x19\xa9\xc2\xd9\x26\xaf\x89\x38\x53\xc7\x62\x01\xc9\x5c\xb2\x16\x54\x64\x4a\xd4\xc3\x76\x18\xa2\x79\xa0\xfa\xc0\x18\x46\x66\x87\x4b\x12\xa4\x91\x7e\xf9\xfb\xf3\xda\x5e\x73\xcf\x48\x86\x25\x9a\x50\x70\x01\x7a\x42\xf9\xa4\xe1\xb4\xd1\xfd\xf6\x10\x93\xc8\x4f\x36\x05\x05\xc6\x97\x0e\x80\x01\xa3\x88\x28\xde\x51\x02\x39\xad\x37\x83\x65\x8d\x82\x47\x07\x53\x85\x40\xc7\x1e\x14\xb9\x8f\xf0\x63\x0b\x2f\x67\x64\x3c\x82\x46\xe5\x78\x56\x1b\xd7\x96\xad\x72\x36\x1b\xad\x6b\x14\xc0\xde\xe4\x96\x20\x50\x5f\x02\x71\xad\x5e\x39\x1a\xd5\xdc\xf1\x05\x04\x93\xae\xd7\xbd\xff\x99\x14\xc8\x02\xe5\x79\x20\x1a\x2a\x54\xb0\x25\xf8\xe7\x03\x43\xda\xb8\xcc\x3c\x86\x77\xbc\x9e\x98\xff\x4c\xe7\x3a\x01\x95\xb4\xb4\x07\xbd\xb9\x75\x85\x18\x8d\x96\xf7\x65\x9b\xd1\xd3\xe0\xd9\x01\x7d\xeb\x21\x6c\xfb\x96\xe0\xaa\xf1\xd0\x34\xe4\xbc\x76\x80\x56\x04\xd3\x9e\x03\xac\xf8\x80\x9f\x15\x8b\x0d\x0b\x51\xed\x20\xc4\x7c\x0d\x8e\x5f\xbc\x8f\x4c\x16\x41\xe9\x95\x2e\xb3\xb9\xdc\xef\x26\xbf\xbf\x5a\xfa\xc2\x18\x32\x0c\x7b\xc7\x9d\x56\xb1\x1f\x1d\xe5\x40\x57\xb9\x9c\x8e\xb7\x0a\x2d\xc1\x0c\x8b\xd5\x99\x89\x01\x46\xd3\xe5\x81\xdf\xfb\x32\xf8\x03\xc5\x24\x03\x75\x58\xdc\xa7\x24\xd3\x2d\x07\xa0\x93\x2f\xe1\x6d\x97\xd6\xaf\x1e\x26\x1f\xd6\x73\xab\x82\xbf\x61\xb2\xb9\x67\x70\x71\x9f\x4d\xdf\xd7\xe0\x35\xa7\x8d\xcc\x37\xe2\x3c\xe2\x23\x0c\x1a\xc4\xd2\x9b\x2e\x6a\x4b\x7c\x0a\x63\x74\xfe\xd3\xbf\xe7\x49\x34\xc2\x3d\x42\xe2\xc8\x38\x30\x93\xa9\x6d\x1b\xdd\xa9\xe7\xb1\x90\xa0\xcf\x53\x83\x66\x70\x1c\xd0\x38\xae\xf2\xd4\xd0\x62\x00\x8a\xd2\x4c\xdd\x2d\xf5\xbd\x1a\x1d\x09\x9b\x6d\x55\x1d\xaf\x00\xb7\x1e\x3c\xcc\x83\xd5\xd1\x16\x30\x2b\xee\x15\x3f\xfd\xa7\xa1\x81\x42\x40\x02\x07\xe1\x21\xbe\xb2\xce\x3b\x39\xd0\xbf\xd8\x6c\x00\xa0\x0f\xb6\x35\xa4\x80\xdd\xbb\xb4\x68\x99\x73\x4d\x64\xdd\xb2\x6e\x93\xa1\x32\x64\xe4\x02\x92\x0c\x15\xf7\x4c\x1b\x37\xf5\x31\x2c\x81\xb5\x85\x3a\x88\x5b\x50\x53\x3a\xad\x5f\xb5\x3b\x0f\x3f\xdf\x96\x42\x3b\xc1\x6a\xb5\x05\xc9\x72\xf8\x04\x5a\x36\x52\x80\x0b\x6a\x62\xc2\x3e\xc2\x37\x0c\x0f\xcc\x04\x30\xf3\xe3\x57\xad\x87\x9f\x1d\x3c\xb4\x93\x18\xe5\x24\x6c\x77\xe3\x7c\xe0\x00\x10\xff\x90\xf3\x88\x90\x7d\x98\x47\xb6\x94\xcb\x8b\xcb\x1d\xb4\x0e\xa2\x82\x5f\xdc\xc7\xa2\x11\xe4\x67\x09\xd0\xcf\x1f\x18\xe0\xb4\x6d\xeb\xb7\xbd\x51\xa4\xd5\x9b\xb4\x0a\x9d\xde\xe4\xa6\xac\xd2\x17\x90\xac\xad\xd2\x90\xa4\xac\xd2\x17\xa8\xe7\x1b\xdd\xbd\xc4\x67\x63\x5a\x3d\xf3\x6b\x44\xba\xbf\x41\x78\x81\x6a\xff\x05\xd8\x9d\x41\xbd\xef\xe1\x27\x3c\x6e\x53\x1a\xb8\xee\x88\x36\x05\xf0\x39\xf2\xe3\x9d\x37\x3b\x3d\xb3\x55\xc3\x02\x6d\xc6\x4d\xe9\x65\x0f\x76\x41\x80\xe4\xd0\x24\x47\xa5\x2e\xa0\xd4\x05\x97\xba\xf0\xa5\x2e\xa8\xd4\x05\x94\xba\x10\x61\xaa\x0c\xec\xe3\xa2\xf3\x79\x1b\x4b\x19\x66\xdf\xff\xac\xad\x73\x21\xf0\x3c\x67\xef\x53\xf6\x96\xc3\xd4\x70\xd8\x30\xeb\x6c\x54\x76\x4d\xed\x60\x93\xbc\x20\x29\x6d\xda\xb2\x0f\x0d\xa3\x8f\x11\x7c\x8c\x68\x76\x09\xdb\x48\xa6\x63\x17\x89\x8e\x5d\x54\x76\xec\x22\xdd\xb1\x8b\xb8\x63\x17\xd9\x8e\x5d\xe0\xaf\x45\x55\xc7\xb2\xa5\x09\x3e\x17\x9b\x3a\x76\x01\x5d\xb4\xe0\x2e\x5a\xf8\x2e\x5a\x50\x17\x2d\xa0\x8b\x16\xff\xe4\x1d\xbb\x18\x9d\xe1\x91\x8d\xea\x58\x10\x47\xa6\x61\x37\xe8\xd8\xe7\x65\x7c\x8e\xf4\xbc\xac\x3a\x47\x7a\x5e\x26\xcf\x91\x70\xb4\xe9\x8e\x85\x24\xd5\xb1\xae\x13\x4b\xda\xa3\x97\xea\x1c\x49\x76\x9d\xf9\x2c\xf1\x13\xdf\xaa\x2a\x6f\x78\x8e\x64\x08\x37\x34\x10\xbf\x3c\x57\xb0\xfa\x7d\xa8\x80\x3e\xc4\x21\xd0\x66\x7e\x7d\x0b\x07\x47\xf1\xc9\x1b\xa4\x56\xf0\xec\x5b\x3a\x6e\x12\x5c\xeb\xc2\xc8\x28\xb7\x6d\x88\x3c\xb3\xb2\x87\x0c\x89\x03\xab\xe5\xbc\x9c\x2c\xce\xa7\xf3\xb1\xdc\xdb\x90\x81\x4a\x2a\x02\x7c\xf8\xd0\x9f\xf6\x70\x75\x6f\xf5\x28\x00\xfd\x68\x00\x5f\xdf\xbc\x34\x7b\xa8\xd6\x64\x01\x4f\x57\x9e\x0f\x57\xad\xc5\xf5\x1b\x6f\xf5\xf3\xd6\xaf\xed\x6a\x63\x8b\x2f\xd9\xac\x12\xae\xd0\x6f\x5a\x8b\xc1\xf2\xe9\xd2\xe4\x77\xaf\x96\x83\xda\x9e\x43\xb9\x07\x0f\x72\xce\x75\x74\x1e\x6b\x8e\x7b\xe3\x6b\x6e\x75\xcd\xea\xfa\x6f\xe5\xc8\x68\x6a\x93\xc5\x74\x34\xec\x83\x25\x26\xb2\x6c\xdb\xb8\x1c\x14\x4e\xc1\x15\xae\xc1\x9d\xa7\xa5\xd9\xc0\xe2\x93\xb5\x87\x2a\xef\x77\xbc\x9f\x72\xe6\xd8\x9a\x20\x27\xda\x12\x79\x94\x63\xc9\xe7\x79\x1b\x6d\x8b\x63\x18\xe7\x86\x54\x70\x78\x9b\x77\x38\xa9\x07\x49\x7d\x48\xba\xe4\xd3\x19\x87\xe4\x1b\xf3\x5f\x39\x1a\x7e\x18\xd4\xe6\x6d\xb3\xe9\xbc\xfc\x10\xe4\x7f\x35\x5d\x9a\x1c\xc0\x05\xb9\xeb\x6c\x69\x99\xfa\x6c\x3a\xee\xc2\xfb\x49\x73\xa3\x98\x41\xd9\xe6\xe5\x07\xb2\x47\x0a\x55\x7f\xde\x06\xab\xfa\x5d\x83\xf7\xa4\x73\x0a\xaf\x61\x74\xf8\xbb\x8d\x0e\x3f\x6e\x48\x12\x98\xf4\xe7\x44\x08\x9d\x64\x5a\xa5\xbf\x3f\xc8\x6f\xea\x19\x7a\x42\x01\x23\xd3\x98\x46\xd4\x2e\x57\x41\x0c\xf3\x36\xba\x10\x61\x7d\x41\xc4\xf1\x26\xd2\xd6\x20\x52\xeb\xa0\x9a\xc0\x78\x1e\xbc\x99\x0f\xac\xff\x13\xe2\xc6\xe6\xb3\x7d\x1a\x98\x0e\x9b\xf3\xd6\xb9\xf5\xb2\xa3\xc8\xde\x66\xe3\x4b\xd9\x97\x2b\xe4\xa6\xca\xbc\x1c\x80\xa7\x85\x49\x55\x84\x5d\x7e\x00\x48\x5d\xab\xa1\xaf\xed\x67\xa2\x67\xbc\x78\x85\x78\x39\x75\x47\x7f\x39\xdb\xda\x9e\xa3\xb8\x06\x27\xe0\x41\x23\x8c\x70\xaa\x13\xbb\x7c\x2e\xb3\x0f\xb2\x80\xda\x57\x3e\x07\x89\xc7\x74\x68\xa2\x48\xc7\x16\x43\xc6\x5e\xf5\x60\x86\x71\x96\x08\x11\x51\xd2\xa8\xe8\xc2\x1f\xa3\xb0\x63\xcf\x9b\xaf\xce\x69\x4a\xfb\x4d\x0c\xcb\x52\x4e\x91\xcb\x42\xfa\xf8\x24\x6a\x2f\xeb\xe2\x91\x89\x4b\x3f\x0a\x91\x8a\x7b\xc7\x85\xf3\xb3\x40\x42\x7c\x82\x3a\x3d\xba\xac\x24\xcd\xce\x0d\xba\x18\xe8\xea\xc0\x1a\xcc\xfa\x7c\xc9\x8d\x3d\xfa\xc4\x55\xe3\x52\x3b\xda\x44\x5b\xda\x7a\xd8\x54\x16\x89\x93\xc2\x86\x1a\x29\x0f\x0b\x7e\x6b\xa5\x6b\x06\x0e\x9b\x04\xdd\xaf\xbe\xcb\x1d\xb8\xb4\x73\xf3\xeb\x13\x7f\x1d\x50\x2c\x2e\x7f\x10\x72\x58\x2f\x3b\x2e\xa7\x62\x69\x72\x30\x91\x61\x5d\x9f\xfb\xe2\x7d\xb6\xa7\xb4\xb0\x7b\x79\x07\x71\x29\xbe\x0c\x13\xbb\x60\x2a\x83\xe5\xfb\xa9\x1f\xbc\x26\x05\x56\xf0\x2f\x65\xca\x9c\x60\x68\x08\x9b\x4f\x02\xb0\x9f\xef\x29\x17\x86\xb1\xf9\xa0\x3c\xfa\xb8\xe4\x1c\x18\xc8\xe6\x8b\xb3\xe0\x4b\xd8\x2d\xb0\xfb\xcc\x92\xb3\xc4\x81\x6a\x24\xdd\x12\xbb\x8e\x52\xa4\x3c\xe3\x8b\x4c\x72\xea\x35\xf8\x8d\xc7\xbd\x86\xff\x59\xdf\x73\xeb\x4a\x74\x0c\x3b\x74\xfd\x05\xff\xcb\x1d\xc1\x22\x49\x0d\x22\xc8\x1e\xc4\x7e\x6c\x14\x0a\xcd\xfd\xad\xd0\x74\x08\x4d\xc7\xa3\xb1\xeb\x94\x88\x02\xef\xda\xbd\xb1\xb9\x20\x19\xba\x24\x11\x34\x9e\xb0\xcc\x9e\xba\x39\x89\x6b\x46\x09\x1c\x9d\x07\xae\x22\x73\xd0\xda\x4c\x77\xb2\x1a\x6c\x7e\xed\x87\x6a\xf0\x1c\x34\x39\x03\x67\x41\x4a\xa5\x0a\xa7\x79\xcc\x64\x70\x34\x22\x20\xd8\x4a\x43\xd9\x4b\x60\x78\xdb\xcc\xc5\x79\x09\x03\xae\x82\x7f\xb2\x4d\xf9\x8a\xe1\x91\xb8\x80\x75\x8e\x37\xef\x91\x37\xef\x05\x9e\xed\x1a\xc5\x72\x7c\xf7\x36\xbd\x2f\x61\xa2\x54\xb4\xe9\x7d\x65\x9b\xfc\xfa\xf1\x3e\xd7\xa4\x4b\x3b\xab\x2e\xed\xe8\xba\xb4\xb3\xea\x52\x0f\x33\x70\x78\x4c\x54\x41\x4b\xd1\x0d\xe6\xd7\xc4\xb0\xe0\xc1\x66\x16\x5c\xd2\x1c\xbb\xac\x9a\x63\x93\xed\xb8\x79\x49\xf3\xec\x72\xc3\x3c\x23\x4e\xdc\x01\x7b\x36\xb0\xa3\xcb\xec\xe8\x54\x72\xda\xad\xc8\x97\x29\x4e\x4f\x84\xd3\xc1\xc6\x1d\x82\x3d\xae\x00\x4f\x9d\xa9\xe5\x60\x78\x8d\xe6\xa6\x5e\x08\xa9\x75\xf3\x6a\x52\xed\x45\x05\xe2\xb8\x46\xdb\x9b\x02\xfc\xa9\x50\xcd\x04\x2b\x57\x66\xdb\xb6\x8a\x76\x3b\x35\x0c\x3b\x55\xf7\x45\x36\xd3\xf1\x0c\xcf\x23\x7e\x5e\x32\xe8\x94\xb8\x5c\xc1\xf1\x8e\x3b\x31\x36\x5c\x16\xe4\xa5\xbc\x06\x47\xe5\x7a\x7a\x05\xfb\x94\xbf\xd8\xb5\x9a\x52\x5a\x5d\xb3\x7d\x1b\x0d\x2a\xb4\x3f\x97\x8e\xe1\x75\x74\x17\xcf\x0c\x01\x76\x41\xb6\xdd\x0d\xe3\x04\x41\x83\x4b\xda\x61\xef\x63\x59\x77\x68\x4d\xd4\x9c\x11\x35\x2f\x4c\x16\x55\x27\x0e\xae\x7d\x64\x23\x28\x28\x5b\x18\xea\x11\x69\x5c\x4a\x89\x80\x08\x50\x4c\xa7\x73\x22\x19\xe0\x16\x1a\x93\x28\xd8\x4e\xa3\x18\xf5\xc8\x8e\xa0\x51\x3e\x1f\x94\x8b\xa5\xd1\xcf\xc6\xd3\xc9\xd3\x49\x6f\xb0\x80\x5b\xf6\x88\x11\x71\xd4\xf9\x16\x1a\xb9\x70\x50\x4d\xac\x90\x31\x0b\x28\x0d\x42\xef\x19\xfc\x62\x46\x32\x51\xf8\xb7\xa5\x83\x9a\x12\x46\x9e\xb2\x90\xaf\x03\x20\xb1\xce\xca\x50\x92\xef\x5c\x25\xb4\x2d\xaa\x90\xc1\xf9\xad\xd6\xcb\x06\x98\x92\xa0\x01\xb6\x52\x62\x88\xf9\x57\x11\xa3\x74\x58\x42\x91\x9a\x08\x8a\x63\x96\x4d\x8b\x5a\x18\xe0\xb3\xb4\x39\x3c\x8a\x74\x48\x7e\x59\xaf\x7e\xce\x24\xda\xb6\x3b\x44\xfc\x6c\x1a\xd4\x63\x1b\x92\x8c\x13\x1b\x46\x89\x8d\xdb\x98\x47\x69\x35\x6b\x0b\xb0\x91\x01\xa9\x21\x23\xe5\x02\x9e\x6b\xa0\x9b\x8b\x7f\xc5\xb6\x14\x36\x2a\xb8\x5b\xb4\x48\x0c\x45\xcf\x58\xd0\x79\xbb\x9b\xc1\x40\x0b\x46\x6c\x60\xe0\x42\x70\x1b\xaf\xb3\xcb\xa9\x5d\x95\xba\xb8\x30\x6c\xe9\x73\x96\xf7\xfb\xb3\xcf\x0c\x7d\x63\x43\xad\x63\x29\x31\x96\x65\x31\x84\x72\x3b\xa2\x44\xe5\x36\x2f\x45\x42\x62\xd0\x79\xe4\x91\x80\x6b\xf5\x2e\xa6\xf3\x7e\x4a\x9a\xd1\xb5\x07\xca\x44\x27\x67\xf8\x8d\x6f\x5e\x4c\xaf\x66\xe6\x2f\x19\x5c\x70\x3f\x31\x2b\xfb\x7d\xda\x11\x43\xd4\xa4\xe9\x7c\xf9\xaf\x0c\x03\xbf\x5f\x5e\x75\xdf\x88\xcf\x67\x88\x86\x88\x74\xbd\x3f\x1f\x10\x35\xb5\xe0\x0a\x95\x2d\xca\x24\xe0\xc7\xcb\xab\xb1\x1d\xfb\xf8\xed\x3d\x63\x5b\x46\x17\x7e\x33\xa8\x4d\xa0\x17\xb8\xa4\xcd\x04\xe8\x4b\xbc\xea\x03\xfe\xfa\xc3\x46\xf1\xd6\xb2\x90\x9a\x55\xc8\xb0\x19\xae\x4e\x9f\x74\x49\x6d\xd3\xf7\x5f\xf3\xb7\x5c\xd9\x0d\xf7\xad\x02\x0f\xc2\x63\x05\xd7\x62\x57\xa0\x39\x13\x4f\x8d\x0c\x3f\x79\x2b\xc3\xe9\xb9\x5f\x8e\x01\x1c\xcc\x41\x98\xd5\x54\x8b\xed\x2a\xe1\x38\x22\x00\x2f\xa1\xa2\x55\x68\x5c\x43\x03\x9f\xeb\x39\x65\xdc\xf3\x58\x31\xcc\x58\xd2\xc7\x8e\xfe\x67\x87\x9b\xc3\x53\x73\x04\x9f\x94\xa7\xa2\xff\x4e\xba\x32\x26\x56\xec\xc4\x6a\xa9\x71\x63\x47\xd6\xa3\x5b\x1a\xc5\x51\x0b\xa3\xef\x99\xc1\xbe\x91\x70\x45\xba\xab\xb4\xe6\xbb\x03\xa8\xf7\x5f\xdd\x20\xa2\x57\x65\x5b\x60\xe8\xd4\x7e\xfa\x4f\xa3\x6c\xd8\x69\x72\x17\xfa\xfe\x9e\xb7\x79\xac\x76\x1c\x5c\x78\x3b\x6a\xb7\xd1\x45\xf7\xb1\xc0\xea\xea\x38\x47\x11\xcb\x00\x89\x62\xe8\x49\x1f\x47\x5f\xa3\xb8\x2e\xdc\x78\x84\xa4\x3e\xa4\x95\x5c\x75\x89\x77\x58\x61\x20\x5d\x9b\xd6\xa8\x80\xe4\x6e\xce\x9a\x52\xa0\x14\x37\xf1\x0e\xc8\xdb\xd3\x22\x7c\x3f\x16\x7d\x72\x8c\xd2\x3e\xd4\x6f\xc8\x9a\xf2\x36\xe7\x6d\x90\x03\xcb\xf8\x53\x88\xad\x74\x68\x08\xd1\x79\x66\xcd\xb5\x39\xc1\xe3\xb7\xd7\xe5\xe8\xca\x24\x5f\xcb\xfe\xca\x4e\x2d\x20\x3a\xa4\x34\x49\xa7\xa4\x45\xbf\x82\xeb\x29\x51\x8f\x5d\x33\x19\xa8\x74\xc2\x13\xbb\xa6\xfb\x3f\x49\xd0\x83\x3c\xe5\x71\x12\x4d\x8a\x2d\xc7\x07\xdd\x10\x6b\x16\x3b\x0c\x0d\xd2\xe8\xc4\x50\x30\x7a\xa4\xeb\x3c\xe8\x78\xd2\xef\x14\xc0\x5b\x07\x10\x87\x04\x22\x7c\x2d\x6c\x34\x19\x6d\xa0\x38\x7d\x87\x33\x8f\x04\x30\x6b\x6a\xb2\xdc\x23\x55\xac\x78\x12\x94\xf3\x31\x20\x59\xf9\x0c\x72\x6d\xfc\x47\x82\x52\x99\xe0\x13\x9e\x43\xc6\xca\x6d\x06\x19\xfd\xd5\xc8\x36\x45\xf7\x0b\x64\x1a\x2d\x80\xa0\xb4\xa0\x54\x4a\x47\xb1\xb2\x99\x8e\x4c\xe6\x52\xb5\x20\x13\x42\x8c\x6a\xa9\xd5\xca\x96\xe2\xe9\x7e\x51\xb6\x74\x67\xe0\xc3\xf8\xb5\x6e\x08\xd6\x8d\xc1\xbc\x64\x53\x34\x23\x65\xf6\xf8\xe5\x38\xb9\x13\xab\xbe\x54\x4f\x45\x9d\xea\x09\xe2\xd2\x61\x5b\xe1\xd5\x12\xfa\x0c\xb6\x47\x6e\xe1\x76\xcb\x75\x22\x92\x03\x02\x89\xad\x8f\x25\xd7\x6b\x2c\xbb\xd3\x1b\x4c\x4f\x8f\x6a\xf5\xb3\x90\xe6\x57\xcf\x1b\x51\xe7\x8b\xdb\xfa\x14\xc2\x9f\x8f\xc6\x97\x42\x39\xbb\x19\x99\x0e\x83\xa4\x54\xa2\x8d\x89\xdd\x91\xc6\x67\xb6\xdc\xcd\x08\x94\xba\x6a\x51\x28\x84\x8e\x34\xba\xb5\x9e\x9a\xd2\x1b\x29\xec\x45\xd4\x05\xc4\x79\xbc\x56\x3d\x4e\x61\x5e\x24\x50\xc7\x3d\x13\xa0\xb6\x6a\x55\x16\xb5\xec\x19\x1d\x58\xc2\x35\x27\x30\x8c\x18\x4d\xac\x97\xb4\x8b\xc0\x0a\x63\x33\x41\x8d\x1f\x5c\xdb\xa8\xe0\xad\xfe\x70\x31\x2b\x97\x46\x7d\xdb\xc3\x15\x75\xaf\x51\xec\x2d\x87\xbd\x4b\xf8\x6b\x16\x52\x70\xd6\xe5\x58\x1d\x27\xe0\x8b\x86\xc1\x46\xfa\x73\xb8\x90\x5a\x8e\x66\x17\x46\xfc\x9d\xcf\x87\x24\x30\x8f\x8b\xd6\x17\x0d\xb4\x45\x7c\xe5\xaf\x9d\xfb\x5d\x1d\x56\xff\x5c\xe4\x12\xec\xcb\xe5\x9c\x1c\xe7\x92\xb0\x36\x17\xf6\x3e\x20\x0c\x61\xfd\xbd\xdf\xb6\x5f\xea\x1a\xbb\x2e\xfc\x4c\x03\xe0\x3b\x81\xd7\x74\x6e\xd4\x32\xcd\x58\x5e\x0c\x96\x25\x14\x6b\x7d\xf6\x80\xa2\x4d\xd8\x0d\x8d\x0d\xc8\x0c\xbf\xed\xc5\xf5\x05\x9e\xa1\x23\x21\x0b\x5b\x77\xbc\x7f\x9a\x5d\x8d\x16\x83\xe0\x65\xc0\xd0\x1e\x05\x1e\xaa\x74\x75\x1a\x03\xeb\x84\x17\xdd\x20\x9b\x43\x6b\xdd\x71\x8f\xe1\x45\x4a\x24\x48\x65\x84\xec\x45\x11\x05\x28\x59\xc5\x15\x80\x73\x57\x17\x1e\xa5\x8f\xd1\x08\xf3\xe1\x05\x38\xc0\xc0\x7b\x48\x7e\x6f\x56\x1c\xe6\xd3\x23\x53\x30\x54\x1a\x10\x70\x02\x0f\x38\x68\x56\x87\x70\xde\xd4\x43\xc4\x51\x3f\xde\x33\x18\x8f\x02\x38\x32\x9f\xac\xc0\xd2\x88\x24\x5e\xa6\x01\xd6\x08\xb0\x8e\x01\x3e\xa6\xb6\x13\xe1\xbb\x46\xe1\xd3\x4c\x82\xe5\x10\x95\x78\xc2\xff\x6e\x6c\x96\x6a\x14\x96\x7f\x96\x6b\xd9\x86\x76\x55\xb6\x2a\xf5\xb8\x10\xb7\xec\x8e\xe0\xa7\xd3\x0b\x94\x2a\x03\x13\xa1\x05\x93\x39\x2f\x85\x6a\x38\x8b\xc1\xa3\xa0\xf5\xc5\x17\x14\x2f\xaf\xfd\x50\xb6\x15\x25\x45\xcb\x48\x02\x75\x59\x12\x8e\xe1\x0f\x49\x40\x48\x3d\x0d\x91\x1d\xd2\x1f\xd8\x51\x25\xf6\x64\xc9\x8e\x91\x71\x1e\x6c\x80\x07\x7f\x73\x6d\x1c\x58\x67\x1b\xc5\x3b\x34\x20\x4c\xcd\xb4\x6c\x80\xe3\xd1\xc8\x5a\x16\x7c\x34\xc3\xe0\x3a\xcf\x38\x8a\xd1\x30\xb5\x48\x55\x38\xcd\x05\x1a\xf4\x49\x11\xf3\xa9\x4b\x4c\x25\x6d\x4c\x6e\x14\x8e\x8b\x25\xc6\xb3\x5d\xc8\x28\x99\x6b\x4c\x5e\x63\x72\x10\xb8\x63\x84\x5b\xb6\xbb\x18\x27\x03\x7a\x7a\xad\x07\x15\x3a\x75\x51\x77\x78\x79\x03\xd7\x8f\xc0\x4f\x76\xa4\xce\xf7\x47\xf5\xba\x08\xc4\x41\x17\x41\xef\x15\x2a\x9a\x20\xba\x8d\xa8\x94\x75\x94\x82\xe4\x13\x4d\xb5\x4b\x3c\x67\x7a\x3f\xc0\x28\x19\xf7\x8a\xda\xd2\xfe\xde\x77\xc9\xf5\xba\x2e\x8c\x63\x36\x1a\xb2\x86\x1b\x68\xdf\xb0\x48\xc1\xd1\xfa\xb2\xae\x21\xd6\x00\x11\x94\x4c\x69\xeb\x97\x82\x25\x2c\xc1\x43\x23\x0f\xac\x4e\xe8\xc2\x50\x1c\xe8\x4e\xc0\x8c\x4e\x90\x31\x0c\x76\xec\xec\x0c\x51\x15\x2d\x6d\x6a\x07\x64\x10\x78\x75\x4a\xed\xc4\xfd\xe4\x94\x22\x1a\x5f\xea\x7c\x6c\x65\x6d\x8d\xf9\xeb\xfa\xe6\xd6\xd2\x5c\x96\xb5\x07\xab\xda\xd3\x5e\xef\x6a\x7c\x85\x67\xcd\xef\x68\xf5\x56\xc1\x8c\x71\xf1\x59\xd4\xdd\xd2\xcc\x2b\x55\x3d\xdf\xfc\xca\x28\x71\x18\xaa\x40\xb6\xbe\xde\x3a\x1f\xae\x06\xfd\x50\x14\xbe\xa3\xa8\x7b\x35\xbb\x04\x4e\xeb\xdb\xee\xc7\xb6\xdc\x4e\xa7\x7b\x00\xe8\x9b\xa6\x28\x9a\x62\x90\xb8\xa9\x11\xb9\x61\x77\x60\xaa\x7c\xa3\x27\x0e\x53\x39\xa5\x29\x51\x9b\xa2\xc4\xe6\xbf\x78\xca\x87\xde\x51\x56\xdb\x09\x31\x73\x91\x35\x17\xa1\xaa\xd6\x99\x22\x21\x1f\x48\xc6\x82\xa0\x16\x42\x96\x45\x2c\xe9\x62\x2e\x55\x4a\xd8\x70\x2f\x78\x24\xa4\xbe\x55\x69\x76\xd7\xba\x55\xe8\x2b\x8b\x66\x15\xa8\xa6\x58\x49\xa2\xda\xe8\x39\x8b\xad\xab\xc5\x92\xb6\x16\x8b\x66\xdb\x6a\xc3\x68\x72\xdb\x6f\x31\x4c\x41\xb7\xb9\x20\x24\xbb\x34\x55\x28\xba\x37\x6b\xf1\x57\x41\x68\xa4\x00\x29\xdf\x97\x5e\xd1\x65\x62\x5b\x05\x5c\x91\x06\x37\xcb\xfd\x6d\x49\x15\x61\xa0\x62\xda\xc3\x36\x09\x85\xfc\x66\x6d\xb2\x08\x64\x9b\x04\xd2\x9f\xa9\x4d\x62\xdb\xb1\x3b\x99\xe1\x94\x14\xc8\xb6\x26\xc0\x6d\x48\x76\xaf\x5e\xeb\x6c\x0e\xd1\xcf\xc4\x19\xad\xb8\xde\x88\x40\xaf\x68\x84\x5a\xb0\x26\x5a\x6e\xc0\x50\xb1\xd9\x92\x44\xbf\x19\xdb\x9d\x36\x2e\x6b\x6b\xf2\xa8\xb6\x66\x10\x6e\x6a\x6e\xc9\x17\xda\x18\x39\x76\xb8\xfd\xe4\x2e\x5c\xb0\x6a\xf2\xee\x74\x60\x49\x5b\xcb\x4a\xb5\x1d\x4f\x65\x21\x3b\xdc\x5b\x42\x4c\xf0\x76\xdd\xe9\xe6\x36\x1a\xb8\xd3\xd5\x9d\x2e\xee\x3d\x72\xb8\x48\xb8\x19\xa0\xb7\xa8\x12\xdb\x01\x36\x20\xe4\x37\x04\xab\xe4\x86\x00\x5c\x1e\x87\x63\x78\xbc\xc8\x6d\x58\x72\x9e\xe7\xd9\x05\x80\xfd\x10\x12\xbb\x1c\x74\xeb\x69\x6c\xb5\xad\x78\xef\xd5\xc9\x46\x71\xe1\x55\x48\x78\x3c\xdf\xe8\xbf\xdd\xe9\x7c\x21\x5c\x83\x36\xc7\xac\x0f\x94\xa7\x21\x9f\x84\x0e\x7d\xd3\xa7\x56\xc9\x4e\x3c\xb9\x70\xd3\x3d\x0c\xfa\x2c\x92\x28\xb1\x5b\x19\x88\x7f\xba\x47\x01\x48\xf6\xea\x22\x95\x89\xb3\x09\x39\x24\xf6\xe8\x41\x23\x71\x07\x12\x16\x09\x25\x08\x24\xfb\xfb\x16\x33\x37\x53\x67\xb1\x79\x5b\x67\xe5\x5a\x1f\x73\x37\xaf\x15\xd2\xb5\x22\x52\xd9\x48\x19\x9c\x4d\x8d\x82\x0a\xe3\x62\x6f\xb5\x67\xfa\xb9\x9e\x86\x5f\x23\xfc\x5a\xc1\xaf\x0d\xfc\x45\x06\x7e\x46\x15\x58\x05\x31\x03\x44\x58\xad\x4a\x18\xb6\xd3\xed\xe1\x0a\x79\xd8\x2d\xd8\xaf\x55\x02\xb5\x32\xc4\xef\x46\xd8\x31\x22\x77\x86\x20\x1e\x24\x12\xba\xa1\xfe\xff\xb1\xf7\xb6\xdb\x6d\xdc\xc8\xa2\xe8\x7f\x3f\x45\x9b\xeb\x24\x26\x2d\x8a\x66\xeb\xcb\xb6\x14\x39\x2b\x71\x26\x37\xb9\x27\x71\x72\xe2\x4c\x66\xb2\xb5\xb4\xbd\x5a\x64\xcb\x6a\x9b\x22\x39\xdd\x94\x45\x26\xa3\xbb\xce\x5a\xf7\xbc\xd2\x7e\x81\xf3\x00\x67\x5e\xe9\xa2\xaa\xf0\x51\x05\xa0\x9b\x4d\x49\x49\x66\xdf\x3d\xd9\x7b\x2c\x36\x3e\x0a\x85\x42\xa1\x50\x28\x14\x0a\xf4\xf8\xb1\xe1\x1e\x7c\x33\x21\xfe\x14\x43\x0d\xc8\x98\xf6\x62\x37\xad\x4d\x7d\x71\xaa\x40\xcb\xbe\x88\xad\xb0\xee\x8b\x01\x72\xcb\xbe\x78\x20\x63\x5a\x8b\xde\x3b\xd5\xf5\xc4\x2c\xda\x6b\xfa\x60\xb8\x56\x43\xd3\x3d\xa0\x2f\x8e\xbb\xe1\xe3\x06\xdc\xa3\xa0\xa4\x26\x61\x8d\x91\x96\x7d\xc7\x4a\xae\x4e\x2b\xf5\x8b\xac\xb8\xfe\x9a\xf0\xd0\xca\x35\xb9\x83\xb2\xc9\x09\x7f\xc3\x71\x2a\xb6\x75\x88\xdf\x3b\xc2\xef\x9d\xc1\xef\x9d\xbf\x37\xb4\x90\x4e\xf0\xfc\xf9\xe4\x34\xbe\x33\x0c\xc1\x5d\x46\xc1\x81\x30\x77\x52\xef\x9d\x80\xc6\x1b\xb3\x72\x07\x65\xee\x29\x1d\x6d\x1a\x89\xd3\xab\xaf\xa5\x45\x92\xac\x45\xa0\xd6\xec\x69\xb5\xb7\x4e\x36\x1d\xe3\xdd\x29\xa2\x9c\x01\x0c\x03\x6b\x1e\x7f\x03\x43\x8e\x2b\x66\xd7\x9e\x65\x64\x53\x0e\x74\x98\xf4\x68\xa4\xf4\x2b\x1b\xa2\xb2\x22\xc0\x89\x1d\xe1\xd3\x9e\x8b\x91\xed\x60\x89\x6b\x6f\xaa\xe2\xec\xb2\x0b\x7b\x52\xbe\xef\x89\x2d\xb1\x83\x32\xaf\x94\xea\xd1\x8d\x6d\x2d\x29\x2b\xbe\xd8\x0a\x18\xb8\xea\x77\x07\x69\x0c\x48\xb5\x98\xcd\x5b\x83\x18\xc6\x20\xc0\x21\x44\xc3\xe9\x0a\x64\xf7\x12\x5d\x48\x69\x18\x67\xf9\x85\x52\x14\x67\x25\xd6\xeb\xf6\x06\xb3\xb2\x78\x5b\x4c\xbb\x2c\xe2\x87\x4a\x53\xf2\x1e\xb2\xc9\x9b\x11\x9b\xe9\xf4\x7d\x1b\xcc\x17\xa6\x80\x2b\xef\x8a\xaa\x0f\x78\xa5\xd7\x65\x81\x27\x62\x03\x20\xee\xba\xd8\xac\xf2\x01\x30\xa7\x6d\x16\x15\xb6\x70\x39\xbb\xaa\x72\xd5\x5e\x59\xd7\xc6\xb7\xa6\x40\x8f\x95\xbf\xaa\xed\xdb\xb7\x3a\xbf\x47\xb2\x09\x69\x28\x49\x6f\x9d\x05\x75\x4f\xf9\x73\x0e\x63\x5a\x09\x21\x2a\x0c\xea\x89\x70\x28\x41\xeb\x9e\x4d\xe2\x06\xda\x90\xcb\x1e\xb0\xf1\x07\xcf\xa9\x1c\xfc\x50\x48\x2b\xd4\x47\x56\xfd\xa4\x03\x72\x16\xca\xd7\xb9\xd0\xca\x41\x72\xf8\x8d\xc9\x54\x94\xfc\xfd\x98\xec\x81\x35\xbe\x8f\x7c\x68\xc2\xca\x1f\x1f\x27\xff\xcf\xc1\xba\xda\x96\xe8\xd1\xc6\x75\x14\x07\x43\x2c\x4e\xa5\x78\xc0\xf6\xd8\x00\xc5\x31\xdb\x5b\x57\x9d\xdb\x0f\xf1\x24\xca\x33\x14\x72\xbf\x43\xed\x12\x35\x5a\x39\xdd\x94\x1f\xe0\x1c\xf3\x0b\x8f\x74\x14\x21\x1f\xf7\x41\x5b\xbe\x36\x1f\x61\xb6\x0e\xd8\x1c\x2a\xe2\xc6\x0b\x7b\x64\x98\xa3\xde\x12\x38\xaa\xd5\xf9\x46\x2e\xc6\xff\x68\xa6\xe6\xf3\x94\x1f\xfb\xd4\x93\x61\xd4\x60\x2c\xe5\xdd\xdd\x52\x72\xd7\x3b\x6b\x49\x80\x46\x2c\x5d\x89\x55\xf5\x93\xc9\xde\xd1\x2a\xcc\xf6\xf4\x3f\x77\x21\xc4\x9d\x23\x79\x82\x2c\x42\xda\x84\x9d\x3a\x91\x11\x5a\xca\xf7\xed\x64\xb0\x7f\x14\x2b\xbb\x6a\x2e\xcb\x8f\x61\xb8\xe5\xdd\xa8\x1c\x0c\x12\xad\x90\xa6\xa2\x47\xa9\xe0\x4c\x8c\xdd\x2e\x24\x9a\xc1\xa5\x3f\xde\x07\x9b\xbb\x8a\xe4\xae\xb8\x78\x30\x07\x9f\xc7\x00\xe9\x49\x12\x9c\x81\x99\x13\xd0\x63\x80\x15\xe4\xb3\x2b\x85\x75\xc7\xd2\xaa\xe6\xce\x30\x90\x8c\xdf\x48\x23\x56\x1a\x14\x78\x19\x18\x44\x4c\x94\x7a\x68\xd7\x1d\xd1\x5f\x14\x79\x99\x95\xa3\x8b\x55\x6c\xed\x22\x47\xb0\x52\x07\xb3\xd2\xe0\x6d\x8d\xd7\x33\x70\xd7\x67\x71\xd0\x23\x65\x5e\xea\xdc\x3e\xb9\xbb\xc5\x0b\xfd\x04\x59\x9e\x40\xb7\x99\x18\x54\xdb\x73\x02\x5e\x64\x78\x86\x78\x42\xaf\xfe\x9c\xca\x13\xf3\x29\xf3\x94\xc6\xf7\x5e\xc6\xf9\x1c\x89\x34\xf4\xe6\xb3\x89\x89\x8e\xe0\xc8\x53\xba\x17\x3a\xc5\x6b\xa3\x73\xc4\x25\x5e\x9f\x58\x22\x01\xf0\xf5\x5d\xdd\x57\x5a\xac\x6c\x07\xcc\xeb\x11\x78\xae\x8a\xb8\xe8\xe8\xb8\x53\x53\xc7\x2e\xae\xe1\xe1\xfa\x54\x13\xb8\xd2\x7f\xb9\xd2\x67\x43\x67\x4e\x31\x26\x99\xaf\x9b\xea\x6e\x01\xda\x58\xd5\xb6\x76\x32\x3d\xf5\x54\x4e\x4c\x1f\x88\x7b\x03\xb1\x02\x86\x90\xae\x27\x10\x2c\xa7\x4e\x83\x06\xe2\x68\x57\x31\xac\x60\x18\x60\xc8\x2b\x60\x0e\x63\x21\xc2\xd0\x95\x88\x3d\xdc\x55\x03\x77\x0b\x7f\xac\x27\x3e\xbb\x1c\x4f\xff\x8d\xf3\x49\xbe\xc8\x25\x2a\x47\x81\x42\x6d\x37\xc8\x11\xfe\x85\xe3\xa6\xcf\xce\xe1\xbd\x6b\x8a\x00\xef\xc2\xcf\x79\x1e\x13\xf6\xe1\x80\xaa\xef\x5d\xa5\x70\xde\x80\xc8\x1b\x96\xa9\x04\x56\xbd\x9e\x61\x18\xf4\x2a\x82\x7f\x3c\x6e\x24\x62\x00\x84\xd8\x2d\x90\x5e\xcf\xdc\xd4\xd0\x4e\x7d\xc7\x8c\x84\x56\xea\xfa\x7e\x3f\xec\x04\x86\x88\x60\x3b\x3e\xd0\xc2\xe1\x76\xbe\x54\x76\x9b\x4e\x40\x7c\x33\xa5\x6d\x45\x68\x7c\xae\x6d\xc6\x35\xb7\x31\x79\xcb\x71\x66\xc0\x36\xc5\xc3\xf0\xdf\xe6\x48\x08\xb2\x1b\x30\x9b\x36\x5f\xe6\x01\x02\x52\x62\xb2\xf9\xf2\x6b\x44\x03\x91\x5c\xfc\x79\xae\x56\x8f\x7c\x1d\x1b\xbb\x27\x25\x1c\x6b\xd6\x4e\x72\x69\x5a\xbd\xc3\xe4\x31\xf7\xe5\xe4\xb4\x31\x96\x83\x06\x64\x6e\x2d\x19\xf0\x4d\x95\xd8\x3c\x6a\x31\x8d\x62\x8e\xff\x7a\x48\xd9\x63\x62\x47\x0f\xea\x86\xba\x6e\x3f\x61\x0b\xfd\x40\xdb\x11\x0a\xe9\xdb\x77\x95\xad\x26\x6e\x77\x2c\x41\x11\xb5\x6d\x81\x49\x07\x3e\x75\x86\x64\xf0\x1b\xf1\x37\x57\x44\xa9\x92\x3d\xb8\x9d\xd9\x07\x11\x6c\x96\x39\x15\x8d\xe0\xf6\x8d\x3b\x3d\xd5\x7d\x73\xf5\x6b\x36\x04\x51\x3e\xa4\x21\x82\x81\x83\x50\x6f\x5c\x2d\xb1\x2b\x3e\xdd\x4c\x93\xb7\x03\xcd\xca\x3e\x75\x77\xa0\x22\x2b\xbb\x01\x2b\x57\x75\xb7\xa6\xb3\xc7\x5d\x1c\x63\x89\x85\x1b\x16\xfb\xc8\xd2\xcd\x17\x6e\xb1\x96\x04\x2b\x36\x53\x2d\xec\xcb\x2c\x6c\x75\x76\x4a\x79\x2b\xa2\xd1\x2c\x6a\x4f\x33\xad\x37\xed\x30\x43\xd8\x46\x04\xa4\xda\x11\xcd\xe8\x9e\x68\x68\xaf\xc3\x36\xd0\xd2\x6e\xca\x62\xa4\x2c\x62\xa4\x8c\x77\x72\x67\x23\x36\x69\x33\x24\x46\xf5\x8d\x3c\x84\xc6\x7b\xb3\x76\x64\x61\x52\x46\x60\x58\x61\xb3\x0e\x00\xa8\xe9\xb1\x70\x2f\x67\x5a\x7a\xc1\x8b\xe7\xad\x81\xe1\xc4\xd6\x7e\x3d\x1e\x46\xbb\x83\xcb\xbc\x7c\xab\x9d\x7e\x30\x7a\xb0\x95\xe4\x46\x6a\x7a\x36\x35\x9d\xee\x56\x72\x25\x7f\x4f\x4e\x7b\xb2\x2e\x66\x46\xae\x34\xf0\x75\xc1\xdc\xd4\x20\x78\xfc\xc0\xcf\xdc\xd2\x40\x28\x4e\x32\xfb\xba\xce\x8d\x8b\xde\xe9\xb6\x46\x0a\xda\xa2\xf0\xcf\xf4\xf9\x7c\xe2\x7b\xa7\xc8\x8e\xaa\x1b\xfa\x2a\x7b\x9b\x1c\x6b\x17\xd7\x2f\x0f\xc1\xc3\x5c\x7d\x7c\x29\x99\x6f\x77\xea\x26\xd2\x11\x9b\x86\xf4\x24\xae\x48\x59\x49\x4d\x9d\x3b\xd6\x52\x32\xda\x7b\x64\x1d\x74\xda\x75\xe5\xf8\xfb\x6b\xb7\x9a\xb5\x7d\xfe\x20\x2f\x36\xc8\x16\xe6\x4f\x21\xe5\x09\x4f\x39\xe4\xcb\x6f\x93\x2f\x98\x25\xdc\x28\xe1\x6f\x5a\x9d\x12\x0d\x21\x4d\x43\x7c\x6c\x28\xca\x97\x75\xdc\xf2\x8f\xeb\x54\x7c\xef\xde\x0d\x52\xcf\xd3\x45\x9a\x46\x85\xda\x1f\xde\x0f\x09\xeb\xa9\x01\x8d\xd8\x38\x06\xe3\xbe\x46\x93\x4b\xbe\x3a\xed\x03\xa2\xb1\x8e\x8f\x62\x5d\xb5\x0c\xef\xdd\x98\xe4\x6b\x07\xd3\xbf\xdd\x71\x91\x78\xe3\x5c\x30\x75\x85\x67\xd7\xc3\xbe\x3b\xc7\x76\x6e\x90\x8e\xb2\x15\xbe\xb2\xb2\x6e\xdb\x61\xd1\xfb\x4d\xfd\xab\x6c\x2b\x31\x0d\xad\x5e\x0d\xb3\xd5\xb8\x26\x66\xf5\x38\x26\x54\x8a\xda\x0b\x11\x46\x5d\xa5\xd0\x1b\xfd\xd0\xf2\xa2\xea\x82\x30\xff\x9c\xd6\x84\x3e\xbb\x72\x48\xb6\x51\x73\xd1\x50\x7d\xfd\xe3\x7f\xe1\x1d\x6c\x9b\xe9\x0b\x9e\x42\x2d\x29\xd9\x22\xf3\xc6\x38\xa1\x67\x70\xad\x25\x14\x31\x32\x8f\xe3\x4a\xb1\xec\xdf\xa9\xd5\x04\xe2\xaa\xb6\x6a\xc4\x63\x8d\x1b\xf0\x05\x05\x85\xdc\x1c\x5b\xf2\x1e\xf8\x4e\x46\x2e\x4f\x47\x37\x27\x5e\xb3\x63\x0b\x91\xe3\x5c\x99\x1e\xbc\x1c\xac\x40\x1b\xc8\x8e\x16\x3e\x5c\x93\x53\x0f\xd5\x94\x00\x6b\x24\xc4\x5a\x4e\xd8\xc3\x12\x14\x2d\xee\xac\x52\xe4\x03\x17\x67\x35\xdc\xb6\x33\x8e\xde\x7e\x93\x26\xa7\xbe\x49\x53\xa2\x07\xa1\x2f\xa0\x1f\x73\x70\x57\x56\x3d\xfa\x04\x63\xab\x6f\x43\x3c\x75\x8c\x0a\x08\x5d\x1c\x43\x14\xa6\xa9\x2a\x30\x47\x1c\x14\x73\x55\x57\x97\xb4\xc7\x03\x6f\xdb\x22\x76\xfd\x5d\x31\xa4\x31\x90\x7d\xe0\xb2\x09\x99\xcc\xea\x3c\x85\xbb\xd4\x4d\xdc\x77\x5c\xcf\x7f\x10\x1c\xdd\x70\x03\x5c\x9f\x8f\x70\x03\xa1\x04\x47\xad\xdb\xe6\xb7\xb3\x93\xdf\xf0\xb7\x7a\x6a\x00\x20\x26\xf6\x45\x68\xfc\xf1\xee\x34\xb8\x75\xa8\x6f\xe4\x86\x17\xbf\x05\x87\x02\x05\x4e\x82\xbb\xbc\x00\xf3\xd0\x3e\x3a\x2d\xf6\x9a\x74\x4b\x58\x95\xb7\xa8\xd7\xdd\xf7\xcd\xe2\xd7\x7d\x33\x7b\x1d\x5a\x89\xdc\xb9\x28\x64\xc6\x5b\x8d\x7c\xbd\x56\xe2\x82\x64\x28\xd4\x85\x24\x2c\xf2\xd0\xec\xd0\xfa\xc9\xe2\xa8\xd9\xe1\x8d\x2f\x06\x0b\xe9\xd7\x04\x4d\xfa\xd6\x9e\xd6\x2d\x46\xac\x3d\xad\xda\xe3\xf2\xed\x16\xad\xda\xea\xb6\x6d\x0e\xb0\x0d\x06\x4c\xa2\x6e\xde\xbe\xa9\x6c\xda\x61\xc0\xda\xb4\xcd\xc4\xf7\xe6\x6d\x9b\xca\x76\x51\xce\x5a\xb7\x2d\x93\xf9\x2b\x30\x71\x31\x10\xc6\x43\x32\xf6\xf9\xfa\x55\x4e\x9b\x0d\xec\x7b\x22\xc9\xac\x1c\x9b\xb7\xfe\x74\x2b\x08\xe4\x3b\x48\xfe\x42\x3f\x2c\x93\xcc\xce\xcf\xab\x7c\x11\x29\x85\xe9\xff\x96\x97\xb3\x7e\x42\x11\x9a\xfc\x02\x57\xf0\x2c\x67\x98\xfe\xd7\x7e\xb2\x0a\x53\x7f\xf6\x16\x4b\x4c\x44\x29\xa4\x65\xab\x37\x08\x5d\x6f\xdd\x74\x8e\x0f\x90\x78\xc4\x16\xd8\x2a\x2f\x8b\xcd\xd6\x53\xa2\x16\xad\xa7\x88\x47\xb0\xa2\x72\xf8\x36\x68\x12\x35\xe4\xb5\x10\x01\x3f\x96\x45\x3e\x04\x81\x32\x74\xb9\x93\x64\x29\x70\xc0\x82\x8a\x78\x61\x62\x72\x1a\x35\x80\x09\x34\x71\xb0\xd1\xa8\x04\x3f\x04\x0c\xea\x81\xa1\xb3\x9d\xb7\x96\x6e\xbb\x83\x79\x5e\x5e\x42\x48\x61\x4a\xd3\x9c\x53\x31\xed\x53\x93\x80\x15\x35\x40\xbd\xa2\x88\x0a\xb2\x0e\xe2\x82\xbf\x5a\x20\x83\x0f\x40\x5b\x1a\xc3\x1b\x75\xf6\x09\x2a\x8a\x23\xe3\xfb\x64\x36\x7a\x11\x61\xc0\x1d\xd6\xa6\x85\x8a\x11\x37\x66\x16\xb1\x0a\xbf\x09\x23\xca\x85\xe8\x75\x8e\xd6\xd6\x3d\x2b\xad\xf3\x4f\xac\x6d\xab\x30\x6d\x6d\x99\xf0\x57\x27\x18\x2c\x42\x37\x62\x5b\x2d\xc2\x56\xfd\xc3\x91\x80\xef\x29\x83\x8e\xa2\xec\xcc\xbf\xa5\xa5\xbc\x12\x6b\x56\xec\x3e\x06\xb6\x23\x84\x19\xb5\x6c\xa4\xcb\xe6\x0d\x63\x4d\xd3\x8a\x01\xd3\xec\x18\x1f\x13\x61\x15\x3e\xea\xb3\x34\x8f\xfa\xd4\x89\xb8\xb6\xdd\x31\x72\xf0\x16\xfd\xc1\xaa\xb6\x43\x06\xd0\x66\x3d\x22\x86\x6c\xe8\x92\x95\xc7\x2d\x3b\x24\xa2\x44\xfc\xd2\xb6\x2f\x76\xf4\xa1\xfa\x2f\x2d\x9b\x5a\xdd\xaa\x29\x6b\x11\x59\x6d\xd0\x14\x2d\x45\x9b\x37\xa6\xea\xd9\x01\x42\x10\xeb\x1b\xf4\x33\xea\x0e\x0f\x68\xd5\x8b\x58\x13\x91\x96\x35\xc6\x3f\x5a\x14\x23\x95\x9a\xdc\x83\xcc\xba\x0b\x0b\x1b\x3c\x86\xed\x8e\x25\x06\xf4\x70\xbb\xde\x92\x8e\x71\x44\x2c\x24\xa9\x69\xb0\x09\x94\x84\x6f\x92\x55\x4a\x7d\xd0\xcf\x8c\xb9\x45\x6e\xfd\xa6\x96\x44\xf4\x65\xb6\xe4\xeb\xb0\xd7\xe6\xb7\xd9\x12\x43\x1f\x61\xdc\xb0\xcb\xaa\xa1\xe4\x0f\xf9\xf8\x6a\x94\xbf\xbe\xba\x8c\x6f\xbc\xda\x85\x67\x51\xc8\x9c\x64\xb0\x49\x82\x1f\x67\xa7\x7c\xbb\x4c\x7e\x89\x8a\x80\x67\xb3\xc5\x62\x76\x49\xbf\x55\xa2\xd9\xcc\x51\xb2\xf4\x0b\x5e\xef\xab\x8e\x01\x81\x74\xc8\x27\x27\xcd\xd1\x9f\x58\xb5\xf7\x89\x86\x2a\x57\x0f\xc8\xd9\x3a\x46\x7a\x78\x9e\xae\x80\x0e\x59\xde\xdf\xf1\xb5\x21\x3c\xba\xd7\x7d\x88\x43\xd1\x3d\x89\x00\x8a\x2f\x32\xa6\xbc\x79\x42\xac\x07\x6f\x05\x8c\xb2\x05\x74\xc1\x3e\xdc\xd3\xd7\x1c\x8b\x45\x6a\xf9\x84\xf9\xf8\xe1\xb8\x71\x65\xce\xc1\x17\x20\x3b\xfa\x0d\xb7\x4e\x5c\xe0\x6b\x81\xfe\x20\x91\x4f\xec\x45\xc4\xa8\xcf\xd8\x55\x31\xb9\x98\x5d\xe5\x8b\x45\x3d\xba\x51\xb6\xbe\xd4\x09\x5c\x21\xa9\x5c\x60\x3c\xe2\xf7\xa1\xd5\x50\x60\x56\x86\x4c\xd3\xa8\xaa\x38\xb6\x22\xc5\xc4\x71\x57\xb1\xb5\xd5\x23\xfd\x41\x6f\xa4\x49\x51\x90\x9c\x35\x4b\x5e\x00\x16\x3d\x8d\xca\xcc\xe5\x56\x36\x7c\xdd\x2c\x30\x5a\xae\x47\x6b\x35\x24\x5f\xee\x2e\xc0\xdd\x36\x9c\xd5\xe3\xf7\xac\x3d\xce\x31\xb2\x47\x0f\xe5\x75\xf1\xf6\xed\x64\x43\x6a\x2f\x1d\xb5\x89\xf4\x4b\x4f\xbe\x80\x7a\x05\x6f\x65\xed\xa8\xff\xed\x92\x5d\x1f\x76\x27\xc3\x80\xee\x2b\x7c\x75\xe1\x98\x54\xbd\x21\x37\x1d\xdb\xae\xa7\x6d\x46\xa4\x4a\xc3\x09\xaf\xd2\xea\xc7\x44\x54\xde\xa1\xbf\x68\xa2\x5f\x42\xc9\x21\x88\x23\xf5\x8b\x14\xc1\xe1\x69\xbd\x56\xa9\xdf\x7b\x27\x38\xbb\x64\x9f\x62\x0d\x42\x5c\x00\xf3\x4d\xc0\x52\x1c\x1c\x7c\x57\x6f\xac\xd4\xea\xe4\xbd\x02\x5c\x00\xe0\xf7\x81\x0b\xd3\x2e\xde\x58\xc7\xfa\xef\x3d\x78\xef\x3d\x78\x63\x71\xbb\x9a\x3b\x22\xa9\xce\x81\xc4\x81\xf7\xe9\x6a\x48\x71\x13\x30\xd3\x0c\x6e\x50\x57\xf0\x92\x61\x05\xef\x74\xa9\x5f\x18\xa2\x44\x1c\x50\x10\x53\x7f\xa2\x46\xad\x47\x23\x37\x6b\xcb\xbc\xd4\xca\x36\x0c\xf8\x51\x23\x6b\xe6\xcb\x79\x36\x1d\xdf\x5d\x10\x50\xdc\x83\x27\x6c\x87\xf2\x07\xcc\xff\xe8\x75\x14\xac\x2a\x19\xe6\x09\x50\xb2\xf6\xd2\x49\xa4\x02\x73\xe7\x6c\x47\x79\x36\xc9\xe2\x74\xff\x45\xe9\xae\x35\x7a\x2f\xa8\xb5\x56\xac\xd7\x2a\x3e\x6c\x0d\x10\x63\xd6\xb4\xd2\xac\xd5\xa6\x6c\xfb\x02\x24\x30\x81\xb9\xcc\x11\x1b\x7b\x31\xce\xe2\x2e\xc7\x65\x40\x0f\x41\x8d\x26\x5c\x8c\x82\xd4\xc5\x97\x46\x39\x2a\xb8\x07\xa5\xeb\x25\x43\x0a\x19\x89\x45\x60\xcf\x9a\x52\xc8\xd5\xa9\x49\x13\xe1\xdb\xd8\x83\xc9\x9e\x90\x41\x6f\x82\xf7\x16\x50\x41\x33\xfe\x45\xf2\x21\xd0\x68\x1c\xc3\x7d\x08\x99\x42\xb8\xf3\xbf\x5b\xd7\x41\xab\xd7\x45\xf4\xde\x12\xf3\x7c\x4d\x50\x95\xed\x27\xc3\xb5\xa3\x08\x20\xe7\x4a\xd2\x7a\x50\xe7\x70\x2a\xc7\xde\x5a\xe1\xe7\xc9\xd5\x62\xf6\xb6\xcc\x2e\xeb\x2c\x6a\xe7\x65\xfe\xb7\xab\x7c\x8a\x4e\xc6\x10\xc5\x46\x9f\xdb\x94\xec\x28\x09\x99\x4d\xda\xd7\x2c\xd8\x1f\x20\x4f\x29\x92\xc5\x74\x5a\x57\xe4\xf3\x62\xfa\x5a\x61\x19\x46\x99\xb2\x25\x8c\x79\x4c\xca\x26\x05\xd3\x1e\x3a\x04\x47\x49\x84\x64\x1f\x6f\x8f\xf4\x34\x8a\x2a\x9f\x50\xe5\xa7\x8b\x54\x95\x2c\x4e\x8b\x8b\x32\xaf\x2e\x66\xe4\x1b\x49\x28\xf3\xa2\x25\xf5\x85\xd7\x50\x85\x64\x60\x75\x6d\x52\xe3\xe2\xd2\x41\x35\xcf\x66\x6e\x03\x0f\xa3\x0d\xd3\x12\x97\x1e\xb5\xd5\x52\xd4\x2e\x36\xe2\x5c\x56\x68\xcc\xaa\x61\xc2\x51\x9f\x3a\xf0\xbb\x66\x2a\x95\xce\xdf\x5d\xcb\x18\x5e\x13\x97\xb7\x2e\xe4\xfa\x99\xdc\xea\x02\xf9\xab\x24\x72\x45\x17\x66\xca\xa5\x7f\x49\x7a\x93\x18\x2b\x4b\x7e\xda\xc1\xd7\x53\x7d\xfd\x5a\x0f\x0f\x68\x07\x1f\x7f\xac\x4a\x7f\x62\x12\xf8\x0b\x11\x41\xf7\xe1\xba\x53\x51\xc1\x3b\xbc\xae\x47\x78\x52\x0f\x12\xab\x87\x8b\xf8\x91\x5f\x97\xee\x06\xbc\x0f\xd3\x29\x8e\x31\xc9\xff\x96\x71\x5d\xcc\x86\x41\xe1\xc2\xad\x52\x96\x79\xef\xea\xc2\x59\x0a\xc3\x54\x19\x31\x4c\xd9\xa6\xc4\xae\xdd\x21\x60\x98\x7f\x73\x04\x68\xba\xd8\xe6\xd8\x3c\x47\x58\xb3\x92\x85\x84\x6e\x89\x8c\x9e\xb5\x9b\xe3\x42\xf3\xd1\xb4\x66\x05\x8a\x34\x2e\xe9\x1b\xdb\xfc\xf4\x10\xb1\x8e\x59\xa7\xa3\x92\xe8\x4b\xb8\x5f\xd4\xd5\x33\xdd\x75\xee\x86\x0c\x55\xb7\xee\x35\x97\xa2\xb7\x89\xe0\xa1\x6b\x5b\x75\x8a\x81\x7b\xf8\xb0\x1d\x3f\xc4\x32\xeb\xdd\x40\x03\xd9\xdc\x15\xd2\x2f\xd0\x38\xd6\xd2\x92\x5e\x46\xce\x8b\x09\x1d\x72\x4f\x66\x6f\xbb\x42\x56\x82\x96\x8d\x39\xdf\xbc\xda\xc1\x57\x72\x9b\xd6\xba\xda\x56\xa6\x7c\xe9\x5a\x6a\xb9\x0c\x6f\x7a\x6c\x19\xd1\x42\x32\xb9\x6b\x04\x8b\x92\x0f\x67\xfa\xa8\xfd\x3c\xa6\xc9\xa0\x14\x52\x50\xcf\x4f\x96\x20\x66\x2f\x75\x40\x33\xef\x35\x90\x36\xa8\xe2\x4a\xd8\x8d\x92\xef\x04\x37\xe9\xc5\xd4\x9d\xb2\xe3\xa6\x7d\x69\x4b\x47\x16\xee\x79\xc3\x29\xd8\x5a\xd7\x31\x32\x1c\xb1\x43\x37\x50\x1d\xc0\xdf\xdf\x8f\xad\xef\x07\xc3\x2c\xb3\x71\x71\xe5\xaf\xd3\x73\x3c\xc1\xba\x85\x53\x4f\x9f\xae\xd8\x98\x5b\x6e\x30\x38\xf5\x51\x29\x4a\x5c\xbe\xa1\x79\x73\xf9\xcd\x3c\xaf\x07\x31\x4a\xe0\x01\x63\x92\x04\xb6\x8c\x67\x6b\xd6\xe9\x87\xb1\x4b\xb4\xce\x79\x9a\xf5\x8f\x9d\x99\xe3\x4d\x1f\x60\x27\xfc\x21\x56\xc7\x8d\x9c\xce\xc5\x29\x99\x52\xf5\x90\x31\xbb\xda\xdd\x32\x72\x9e\xd5\x06\xb8\x37\x8a\xc5\xd9\x44\x0d\x5f\x25\xbc\x65\xf5\x98\xfa\x8e\x60\x63\x68\xdf\x05\x89\xef\x6a\x0a\x91\x2a\x62\xdd\xbf\x60\x27\x8d\xdd\x2e\xd5\x34\xb9\xee\x27\xe2\x1b\x8e\x23\x45\xc8\xb9\xdb\x93\x83\x08\x02\xbb\xbc\x92\xed\x9d\x37\x74\xef\x5f\x43\x8c\xbb\xe3\xb7\x5d\x87\x5f\x78\x83\x07\x30\x70\xcf\xe4\x11\xe8\x6b\x8a\x7f\x7d\x41\x7f\x04\xc1\x53\x23\x00\xdb\x10\xdd\x93\xf8\x11\x6f\xb6\xd1\xfb\xc0\x91\xad\xbd\x6f\x43\xe8\xc8\x16\x9c\xeb\xfb\x87\x04\xd8\xa2\x99\x7b\xb7\x68\x53\xce\x3c\x0b\xe8\x8d\x9d\xec\x10\xd6\x9d\x66\xf8\x9b\x70\x72\xbf\x81\x98\x51\xed\x70\x8c\x84\xe2\xde\xc4\xf1\x21\x1e\x8a\x7b\x7d\xdb\x2d\x7c\xfc\xe0\xd4\x34\xe2\xde\x17\x59\x54\x8c\xbc\x8e\x3e\xb4\x69\x3d\xaf\xcf\xd6\x7a\x5e\x03\x9c\xaf\xa7\x55\xee\x41\x42\x0f\x54\xd8\x12\x0f\xb0\xc4\x9b\x69\xbe\xd4\x87\x46\x3c\x05\x14\x70\x4a\x3d\xd3\xa9\xf3\x32\xc7\x2d\xb9\x4c\xd5\x65\xf5\x85\xe7\x91\x2c\x7b\xb6\x06\xbb\xd7\xf4\xf6\x91\x78\x39\xba\x35\x0e\x8d\xbd\x5e\x80\xdd\x7d\xb4\xa8\x82\x9e\xe3\xd6\xe9\x0c\x63\x9d\x66\x36\xd6\xf0\x19\x06\x39\xcd\x30\xc8\x70\x89\xa4\x29\x31\x6a\x7d\x29\x46\x77\xf0\xfc\xf9\x73\xb0\xe5\x95\xf4\xcf\x8b\x78\xf4\xe1\xa6\xee\x6a\x89\x25\x5c\x82\xb5\x1f\x88\x5e\x4e\xbd\xeb\x0e\x6a\x5a\x90\x8f\x08\xbf\x66\x6e\x9d\x44\x8e\x6c\xaf\xf4\x85\xf4\xe5\xb7\xb8\x73\x32\xd7\x75\x21\x01\x0d\xe6\xdb\x2e\x65\xe5\x17\x59\x05\x45\xe8\xcd\xd3\x11\x33\x47\x4f\x3d\x9d\xe0\x0c\x5f\x9d\x96\x8e\xcd\xba\x6d\xeb\xed\xa8\x5d\xcb\x75\xf8\xe6\x92\x90\xb3\xa2\x4d\x23\x66\x45\xa2\x2e\xbd\xc5\x4a\x67\x4e\x0f\x5f\xc5\x60\xaf\x18\xec\x15\x87\xbd\x8a\xc1\x5e\x31\xd8\x2b\x07\x5b\x3f\xae\x87\xd4\x35\x3e\x80\x72\xd0\xe0\xda\x82\x2e\x9c\x31\x65\xc6\xcc\x18\xa4\x5d\x66\x38\x25\xe3\xea\x03\x51\xc9\xbc\x7f\x8e\xd7\xde\xe0\x69\x4b\x47\xb2\x33\x0b\xcf\xed\x62\xcf\x06\xc4\xa0\x6e\x2f\x24\x35\x12\x02\x7a\x26\x34\x00\x00\xbb\x13\x8f\x2d\xb0\x73\x1a\x5b\x1d\xa1\x5f\xdf\x4f\xb2\x91\x79\xdf\x76\xc4\x2d\x04\xd8\xc0\x28\xba\xaa\x4a\x89\xc2\xcb\x64\x72\x82\x8e\xd6\xd4\x1e\xc1\xac\x64\x6d\x46\xc5\x11\xb2\x9c\xb1\xe2\xee\x4a\x2b\xae\x58\xb9\xeb\xfb\x95\xb0\xa0\x65\x7c\xc3\x8f\xd6\x46\x10\x10\xec\x00\x24\xd5\x67\x19\xe2\x56\xb2\x35\x06\x73\x79\x07\x76\x61\x08\x6a\x7e\x76\x84\xb6\xc3\x77\x2c\x0b\x60\xf9\xf8\xe9\x00\xe3\x75\x12\xea\x1d\x50\xd2\xaf\x91\x58\xf4\xd2\x23\x2f\xe3\xac\xcc\xb3\x86\x70\xe1\xfe\x3d\x6a\x0d\x47\xbc\x3e\xc9\xfa\xf6\x9e\x91\x1e\x06\x0f\xce\x54\xa0\x6f\xef\xbc\xb4\xe3\xe4\x3d\x4b\x01\x52\x85\xdd\x5c\xd3\xd1\xf7\xf1\x8e\x46\x7b\x94\x78\x21\xd0\xd7\xf6\x30\x46\x72\x35\xac\x9f\xc0\x98\x2a\x29\x0a\x23\x7c\x0c\xbf\x3f\xfe\x18\x26\x97\x4a\x57\x73\xb6\x57\xbf\x1c\xc1\xb0\x9a\xf0\x55\xf1\x42\x40\x11\xc9\xc5\xd8\xec\xf6\xb6\x30\x2c\x85\x07\xd9\xed\xe6\x13\x92\x45\x4e\x24\x4c\x0a\x26\x67\xbd\xf1\xca\x3d\x4e\x88\x31\x26\xba\x28\xa0\xb7\x48\xb0\x92\x86\x8a\x16\x86\xee\x8a\xd2\x57\x2c\xbd\x74\x12\xa7\xee\x18\xc5\x74\x29\x16\xc6\x64\x44\x81\x87\x5d\x00\x91\x11\x85\x15\x76\x26\x0e\x6c\xc1\x0a\xe8\x91\x92\xc9\x23\x5c\x72\x59\xb4\xce\xc1\x12\xc3\x8c\xc0\x9a\x00\xd5\xe1\xf7\xaa\x17\x48\x6d\xdc\x65\x8d\xb4\xb0\x6c\x12\xe3\x7f\x9e\x4e\x8c\x20\x6f\x58\xa1\x41\xd8\x8b\x75\x0d\xdb\x10\x1a\x09\x4b\xd1\xc2\x6e\xca\x9e\xc2\xab\x81\x4b\xad\x0b\xc8\x3c\x74\x80\x2f\xf9\xc2\x3c\x9c\x86\xcd\x6d\xb8\xdd\x88\xbd\x12\xb6\x62\x4f\x97\xaf\xbf\x0e\xe6\x2e\x83\x99\xc8\x25\x94\xc2\x72\xd1\xe1\x46\xe4\xae\x8e\xf8\x58\x3c\xb6\x76\x57\x7e\x79\x49\x5a\x0e\xb8\x41\xdd\xbb\xcd\x64\xd8\x23\xb8\xb1\x54\xd3\x51\xff\xfa\x16\xf6\xd7\xb1\x48\x03\xb1\xe4\xea\xc7\xf5\xc3\x33\xab\xff\x8d\x40\x57\x68\xd6\x17\x5d\x5f\x55\x3d\xb8\xa2\xa5\x8a\x83\x53\xdb\xaa\x27\xfb\x8c\xf7\x4b\xce\x18\x54\x98\x36\xb5\x8f\x57\x8c\xf1\x15\x83\xb1\xf5\xff\x55\xb0\xe1\xfb\xec\x88\x41\x04\xb4\x06\xfb\xaa\x2e\xb4\x0c\xe7\xda\xee\x60\x7c\xd4\x23\xdf\x64\x37\x99\xf8\xab\xb5\x58\x24\xc3\x2b\x22\xf0\xce\xb0\x2a\x0d\xe7\x06\x63\x7c\x15\x17\x3e\x1e\x27\x1a\x20\x96\xeb\x71\xb0\x7c\x7e\x1f\xa3\xee\xb3\x95\xd8\x3e\xc8\x2e\x8c\x90\x55\x32\x54\xbb\xb0\x08\x10\x0c\x8b\x68\x76\xf2\x24\x23\x07\xe9\x3a\x6a\xa1\xc8\x31\x75\x56\x2f\x08\x15\x7f\x47\x3b\x19\xde\x5e\xa1\xbd\x14\xfd\x06\xe7\xd6\x79\x56\x66\xfa\xfa\xa6\xe3\x1b\x68\xec\xb5\xcd\x8a\xd8\xcf\x60\x12\xbc\xa6\x44\xf7\xb4\x90\x65\x40\x0c\x6b\x7f\x7b\x43\xda\x50\x58\xd2\x20\x05\x94\x96\xeb\x32\x9b\xff\x08\x80\xb1\xc8\x06\xa6\x25\x85\xf3\x79\x51\x56\x8b\xbf\x64\x93\xf7\xba\x85\x54\x87\x28\x18\x80\x0d\x75\x9b\x52\x7e\x59\x07\x91\x45\x7d\x00\x05\x2a\x1f\xcd\xa6\x63\x84\x29\x14\x54\x4d\x98\x5e\x1b\x30\xda\x32\xf9\x0a\xaf\x4c\xfb\xeb\x27\x50\x6c\x92\x9f\x2f\xb4\xb5\x4e\x95\x2d\x75\xd0\x59\xfd\x69\x7d\xdd\xf0\x7b\xbd\x69\x48\x36\xdc\x26\x6c\xc5\x12\x42\x19\x2a\x14\xe0\x9d\x04\x8d\x8a\x1f\xf5\x86\x95\x7d\x41\x08\x42\x61\x83\x69\x6d\x69\xba\x6d\xfb\x42\xf7\xc1\x44\x96\xb0\x3d\x92\xf5\xb8\xf1\x0c\xa8\xb2\xc0\x17\x24\x2c\x7b\x76\x01\x35\x4d\x1d\x5c\xd6\xd5\xfc\x23\xac\x95\x8c\x94\x8f\x4d\x74\x35\x86\xf0\x3c\x86\xab\x8f\x89\x7d\xac\x43\xf5\xb7\x54\x13\x70\x8d\x4c\x3e\x48\xd1\xe5\xc8\xe2\x73\xda\x2d\xec\x71\xad\x89\x6e\x97\x24\xb7\x41\x5c\xd0\xf3\x14\xc2\x65\x27\x7e\x69\xf9\xfd\xaa\xc9\x94\x57\x67\x5c\xb3\xf3\xd5\x9b\x5a\x62\xd2\x9a\xe9\xe7\x70\xfd\xec\x90\x1e\xad\x77\x7b\x30\xbd\x36\x1d\xea\x58\x53\xc3\xe4\xd4\x60\xd0\x4f\xfe\x76\x95\x5f\x91\xec\x20\x48\x5a\x78\xf8\x0f\x48\x60\xaf\xa1\x1d\x2c\xdf\x10\x67\x0a\xb5\xb4\xc8\x0a\x9f\xb2\xbb\xc5\xf8\x8b\xce\xb3\x87\xf1\xd5\xb7\xd6\x4f\x4b\x37\x0f\xc7\xa7\x7c\xcd\x35\x20\x12\xff\x35\xce\x37\x87\xe2\x66\xb5\xc8\x23\x19\x73\x48\xe8\xc9\x2c\x47\x32\x19\x76\x8a\xc0\xc8\x28\x10\x14\x56\xaa\x42\x5d\xbc\x47\xb7\xff\x25\xb0\x60\x40\xe0\xbf\x2c\x96\xf8\xcb\x61\xe2\x3d\x00\x7a\x19\xa4\x8c\x82\x94\x2a\x48\x59\xc4\x80\x17\x87\x49\xc1\x95\xf5\xde\x20\x33\xdd\x5a\xef\xa7\x4a\x32\xd8\xd2\xc0\x58\x1d\x3c\x46\xb5\x72\xbc\xfb\xa1\xf6\x9e\xf9\x07\xc6\x08\x95\x36\x43\x61\xb2\x17\x47\x81\xce\x68\x3e\x0c\x0a\x70\x5f\xd3\xe5\x4e\xe0\x13\x4e\xda\x93\x43\xf1\x64\x1e\x57\xf1\xac\x2d\xf5\xd7\xc8\xe4\xc7\x85\xf3\xa2\x38\x5f\x28\x04\xa5\xd0\xba\x2c\xc6\xf4\x60\xd5\xb1\x03\x05\x0e\x48\xbf\x80\xa2\x64\xbe\xbd\x36\x10\x95\xc1\x2f\xde\xd1\x04\x20\x73\xed\x85\xfc\x51\x60\xd4\x0a\x89\xc0\x98\x60\xfb\x30\x78\xa3\x7a\x39\x78\x23\x0d\x02\xb8\xe8\x41\x8d\x6d\x8b\x14\x1b\x9e\x70\x1b\x47\xc0\x23\x45\x1f\x88\x2a\x01\x5a\x6d\x91\xb2\x01\x0c\xcd\x08\x7d\x06\x9a\xd0\x7c\xae\x54\x16\x7d\xdd\xea\xba\xcf\x33\x61\x8f\x6b\xc6\x6b\x78\x1a\x7f\x07\xd4\xad\xce\x82\x53\x06\x6f\x50\xc4\x7e\x40\x9c\x2c\xc8\x4b\xab\x6d\x0e\xd0\xed\xda\xcf\xf0\x60\xfb\xa8\x99\xc7\xd9\xa5\xf1\xfd\xda\x3f\xa5\xfa\x50\x80\x8f\xba\xaa\xf2\x61\x66\x7e\x14\x30\x12\xd0\x39\x5c\xf4\x54\x01\x9f\x47\x75\x2c\x80\xb9\xce\xbd\x84\xeb\xee\xf8\x31\xa3\x8f\x82\xea\x5d\x52\x0e\x7e\xcc\xe8\x03\x78\xd0\x0d\x95\x16\xb2\xd4\xa0\xe4\xd6\x1f\x60\xf1\x83\x9c\x5e\x5f\xa3\x28\xf3\xbf\xc9\x81\x99\x8b\x79\x8f\xf0\x55\xf2\x08\x3e\x24\x83\xcc\x42\xb0\x54\x6d\x76\x29\x59\x6f\x16\xc2\xd7\xed\xcf\xe6\x7e\x49\x94\x1e\x1f\x78\x22\x76\x4a\x77\x18\x99\x4a\xe1\xb3\x8d\x84\x01\x5e\x06\x32\x49\x46\x53\xc5\xde\x60\xa7\xbc\x19\x80\x06\x13\x84\xf5\x22\x0c\x08\x28\xb1\xfb\x16\xa3\xe5\x8a\x24\xfb\xac\xbe\x82\x8f\xd7\xf9\xec\xf8\xe3\x17\x02\xf6\xcc\x1b\x88\xda\xb1\x3f\x28\x98\x33\x8b\xe7\x08\xcf\xdc\x82\xb8\x12\x86\x59\x90\x83\xa0\x22\x63\x88\x74\xba\x3c\x80\x9c\x20\xd3\xa9\xfc\x4c\x94\xbf\x11\x72\x45\x0f\xf1\xc3\xba\x31\xf2\x07\x7e\x3e\xd0\x03\xe2\x0f\x1e\xdd\x5f\xc0\x01\x52\xed\xd6\x37\x37\x8f\x34\x67\x79\x27\x60\x33\xdd\xda\xfc\xc8\x4b\xd6\xad\xcd\xb1\x35\x81\x8b\x19\x1c\xc9\x4b\x35\x8b\x90\x29\x1c\x17\x29\x5a\x53\xf7\x74\x37\xad\xad\x3d\xb6\x6a\xe6\x11\xcf\x08\x34\x35\xad\x4e\xf2\x16\xa0\xcb\x03\xb1\x11\xbb\x45\xc8\x0e\x5b\xdd\x34\x2f\x00\xfa\x9e\x35\xd0\xa4\x46\xe1\x88\xe1\x70\xdb\x80\x21\x76\x37\xf8\x29\x1d\x71\x1e\x8a\x93\x57\xb6\x57\xec\x9a\x70\x22\x3d\xe6\xfb\x60\x08\xeb\xad\xb9\x8d\xa8\x32\x98\x77\x42\x17\xf1\x91\xed\xae\x43\x97\xf5\xf0\x15\xdb\xa6\xd4\xa1\xbb\xf6\xbc\x14\x6a\xb4\x3d\x2f\x95\xfb\xf2\xf8\xa9\xa9\x09\xc5\x07\x56\x18\xfd\x9b\x0e\xe6\x9b\x02\x68\xbb\x69\x57\x63\x44\xfb\xe0\x59\xd0\xbc\x08\x91\x46\x61\xf9\x34\x61\x4b\x97\x6a\xf3\xc3\xa0\x29\x9a\x1d\x93\x2d\x6b\x9b\xb5\x47\x73\x26\x2c\x56\x2c\x44\x10\x6f\x7f\x6a\x14\xb9\xf5\x38\xa0\x94\xbf\x56\xd2\xfc\x7a\x6e\x04\xb8\x40\x47\xfb\x1d\xd2\x9a\xa1\x36\x82\xd7\x73\x54\x13\xaf\x2f\x07\xe6\x8e\xb9\x4a\x19\xa1\xdd\x17\xcb\xda\xb4\xca\x13\xee\xaa\xc6\x08\xc3\x4b\xcb\x62\xbf\xf8\xc5\x8c\xfc\x34\x49\x0d\xb8\x1b\x6d\x93\x21\x6c\xd6\x49\x7a\x72\x97\x70\x1f\xf6\xeb\xc8\x5a\x84\x74\x54\x84\xd0\x88\x98\x50\x7c\x85\x17\x3c\xf7\x5a\x6e\x58\xec\x66\x2e\xe8\x0a\xa4\x5d\x06\x69\x84\xe1\x16\x68\x87\x15\x18\xf6\x34\x9a\x98\x30\x5a\x6f\xd6\x6c\x5e\x86\xe5\x84\x80\x65\x93\x4d\x0a\xa7\xdd\x29\x5e\xc1\x3c\xc5\x21\x5c\xee\x4b\xab\xdb\x68\x72\x55\x2d\xe4\xad\xe8\x7f\x1a\xc3\xdb\x79\xa6\xd4\x6e\xcf\xf2\xa6\xf1\xbd\x2f\x2f\x36\xb0\xc5\x17\xb3\xab\xea\x15\x99\xd9\x93\xdb\xfa\x8b\xf9\xe6\x8e\x36\x01\xdb\xc2\xa8\x60\x0d\x3b\x30\x66\x3f\x71\x88\x69\x62\xfc\xd5\x59\xe7\xa3\x96\x94\xa0\xc2\xcf\xb1\x0a\x91\x8d\x91\x6d\x92\x93\x09\x6f\x83\x6f\x09\xfb\x14\x1d\x52\xf0\x42\x3d\x79\x47\x8a\x21\x23\x52\x05\xdc\xc0\x2a\x66\x74\x18\x11\x73\x41\x9b\xe9\x82\x3e\xa1\x70\xc7\x90\xb7\xce\x8e\x18\x14\x22\x59\xac\x4b\x2d\xc1\x0c\x4b\x76\x34\x50\xab\xea\xcd\x6d\xf0\x34\x36\x58\x21\xdb\x98\xd6\x36\xe1\x1e\xb6\x4c\xd7\x32\x52\x60\x35\xdb\xd6\x3e\x8e\xe6\xbd\x14\xa6\x90\x31\x2a\x77\xb5\xff\xa3\x79\x71\xbb\xe7\x6b\x66\x89\x0c\xbc\xd4\xa2\xd9\xe5\x10\xcf\x0f\x96\xa9\xfe\xdd\xd8\x3c\x14\x32\x38\x7c\x6a\xd2\x9f\x18\xaf\x4c\x08\x62\x15\xc3\x68\xad\xb7\x9c\x1e\xc6\xdf\x59\x99\xd4\xad\x0a\xad\xc7\x62\xf2\x07\xa8\x94\x1b\xa0\xf7\xbb\xab\x91\x0f\x5b\xa3\xb8\x56\x6f\xd4\x95\xda\xaa\x8e\xa1\x6c\x93\xeb\x24\x06\x3c\x24\x6f\x6d\xa7\x1b\xd4\xc5\x17\xe5\xda\x9f\x3d\xb2\x6a\x3a\x71\x0e\x45\xb1\x6c\xdd\x8a\x76\x7d\x6b\xcc\x8d\x86\xd6\x5b\x82\xb6\x97\xc6\x6e\x66\x4e\x6d\x6f\xe0\x5e\x99\x9a\x44\x91\x83\xd6\x66\xa4\x50\x34\xf2\x19\xbe\x7e\x75\xf2\xb0\x8e\x2c\x4e\x10\xb7\x33\xda\x10\xd3\x8f\x61\x15\x58\x73\xa2\x2e\x04\x73\x5b\x1c\x7d\x55\x79\x6d\x64\xcd\x18\xb2\xd4\xa4\xa7\x4d\xfb\x18\xcb\xe3\xc9\xcb\x2c\xfa\x3a\x54\xcb\x20\xb0\x25\x38\x7c\x98\xb3\x5c\xfc\x88\xa8\x3f\xce\x53\x15\xed\xcf\xf0\x1d\xe8\x4f\x0a\x8d\xef\xb3\xf1\x2b\xcc\xaf\xe0\x5d\xca\x95\x51\x96\xf4\x37\x46\x44\xba\xa4\x35\xb5\x53\xfd\xed\x2a\x2b\x8b\x73\x78\x31\x10\x25\x1c\x1d\x36\x3f\x06\x19\xcd\x9d\x34\xf6\x8d\x43\x86\xb3\x07\x28\xfd\x29\x67\x73\xe5\x7d\xeb\xb3\x7f\x7b\x40\xa1\xf4\x50\x7b\xf2\x5d\x7f\xe1\x0c\x4a\x59\xab\xb1\xd4\xbb\x7b\x36\x80\x6b\xf7\xbd\x0e\x82\x38\x54\x43\xc4\x1f\x6e\xa7\x39\xa2\x61\xd0\x7b\x64\xf0\x81\x07\x09\x98\xfa\xc9\xb1\xad\xc7\xf1\x89\x86\x79\x35\xc4\xda\x20\xd2\xeb\x11\x93\xa5\x2d\x95\x39\x3c\x76\x22\x97\x30\x35\xbe\xd4\x16\xf0\x07\x6c\x3a\xe0\x96\x64\xa9\x86\xb8\x98\x12\x1b\x58\x30\xfa\x7c\xc4\xd2\xf6\x4c\x69\xf4\x09\xf7\xfe\xac\x46\xb3\x52\x71\xc0\x15\xd8\xb2\x71\xec\xc1\xf7\x1a\x6b\xe1\xad\x0a\x88\xd5\x8e\x77\xd7\x5d\xe6\x58\xe4\xad\x44\x1e\x56\xdc\x36\x25\x98\x89\xe7\xe3\x24\x15\x55\x1c\x60\xeb\xd3\xa9\x93\xfa\xa6\x54\x4f\xc4\xb0\x25\xbe\xb2\x7d\xec\x5b\x08\x8f\x2d\x54\x1e\x0e\x98\x0d\xb5\xa2\x90\x19\xe8\x30\x42\x30\x4e\x7c\x0b\xd5\x52\x3d\xb0\x80\x02\x10\xf1\x1c\x8a\xad\x63\x64\xc0\x91\x57\x1a\x9b\xdc\x3a\x66\x9c\xc6\x4b\xe0\x6d\x4b\x20\xdb\xc3\x63\x3e\xdb\x80\xfd\xba\x38\x24\x60\x02\x9f\x95\x15\xe8\x9d\xd7\x6a\x78\x94\xe6\xa3\x38\x12\x46\xcf\xb7\xcc\x3a\xe4\xf1\x74\xf0\x48\x64\xea\xe1\x46\x88\x3c\x27\xea\x96\x66\xb1\xde\x3e\xa6\xfe\x02\xbc\x00\x73\x16\xa4\x97\x50\xa3\xa1\xe8\x93\x2c\xf1\xda\xbf\x4a\x8e\x1b\x06\xf8\x28\x68\x7e\x62\x1e\x25\x8a\x0f\x1a\xeb\x12\x7f\x91\xc8\xf6\x2a\xd8\x05\x10\xa1\x1d\x64\x49\xbc\x9a\x8e\xc0\x3d\xe8\x60\x38\xd7\x60\x76\x23\x25\x0b\x4c\x3d\xe3\x86\x66\x06\x37\x1a\x4e\x9e\x05\x0a\x04\x11\xfc\x07\xc9\x90\x36\x92\xc3\x08\x9a\xdf\x7c\x4a\x06\x33\xcc\x1c\x7b\xd7\xcf\xc7\x5b\x4c\x3e\xca\xf9\x25\x76\x96\x1e\xb2\x86\x29\xcc\x05\xa2\xee\xa2\x61\x9a\x87\x81\x10\xb9\x05\x77\xc7\x18\x38\xe4\x27\xcd\x29\xcd\xfc\x24\x84\x87\x60\xa7\x8a\x21\xa0\xb0\x57\xff\x6f\xe3\xfb\x94\x97\xde\xdd\x00\xbe\x5c\xbb\x1e\xac\x5f\x9c\xe9\x4e\x43\x49\xb5\xe0\xe8\x1e\x17\xd7\xd8\x73\x76\x38\x3f\x55\x75\x68\xba\x67\x10\x28\xfd\xfc\x17\x88\x64\xcf\xa0\x5a\xca\xae\x2b\x56\xc4\x93\x06\x93\x7a\x05\x5f\x57\xde\x6e\xa2\x32\xf7\x09\x41\x97\xbf\x02\x1e\x05\x58\x8f\xb5\x7a\xf3\x24\x51\xca\x4f\x05\x5b\x55\xca\x2a\xa6\x26\xab\x07\xda\x9d\x94\x36\x7e\xe8\xf3\x1a\x79\xa8\x34\xc6\x8b\x7a\xed\xc7\x91\x93\x4c\x48\xc8\x4f\x4b\x72\xdc\xc3\xdf\x2b\x8a\x80\x71\x05\x5c\x87\x5e\xbf\x96\x6b\x9e\xc0\x90\x1e\x62\x28\x15\x2e\x03\xae\x60\xab\xa7\x19\xd4\x1f\x0c\x44\x06\x56\x97\x0f\x40\x4b\x2d\x7f\x11\xbe\xfe\x08\xa6\x61\xf4\x8e\xff\xcc\x8e\x28\x67\xdb\x99\x7c\x41\x80\x92\x6c\x68\x36\x97\x84\xae\x93\xe2\xec\x12\x6d\x42\x33\x0a\x67\x20\xd7\x09\xd8\xc8\x98\xc9\xb6\x0d\xae\x9d\x1f\x2c\x1d\x66\x86\x0a\x1f\x90\x0a\x11\x2f\x0a\x68\x0c\x4e\xd9\x41\x92\x1f\xb1\xb4\x31\xb6\x17\x83\xcf\x64\x13\xd2\x1e\x8f\x04\xbd\xc4\x31\xfa\x30\x7f\x70\xa6\x10\x6f\x0d\xad\xa1\xf3\x92\xd3\x39\xf6\x34\xee\xfd\xd3\x79\xe9\xd3\x79\xa5\xe9\xbc\x0a\xe8\xbc\xb2\x74\x40\x07\xcd\xdb\xd1\x99\xd9\x5c\xed\x48\x1b\x42\x7b\x0d\x78\x34\x5d\x46\x09\xbd\x94\x84\x8e\x4d\x3a\xbd\xa5\xe1\x97\x38\xb9\x3d\xd7\xec\x68\x60\x28\xdc\x7e\x6a\x1c\x5a\x73\xad\x94\x30\x77\x80\x87\x22\x65\x15\xa4\x8c\x99\xef\x9c\xcc\x60\x7e\x71\x7c\x5a\x1a\x54\x7a\xe1\xc3\x5b\x64\x54\xb4\xe6\x24\x5c\x4f\xdd\xc3\x84\xa6\xb9\xc7\x16\xbe\xb6\x85\xc9\xe5\xd4\x36\x80\x71\xef\x69\x6d\x00\xc3\x90\x51\x3b\x64\x23\x16\xa3\x55\xcf\x11\xe9\x98\x1b\xcd\xea\x0d\x69\x9a\xe6\xbf\xe9\x13\x0a\xba\x0d\x61\xf4\x31\xed\x46\xee\x76\xb6\x6e\xda\xbb\xdb\xc9\x6e\xb7\x8f\xbf\x6c\xb2\xc7\xc3\xde\x5d\xc7\x2f\xd6\x68\x44\x1e\xff\xe2\xfc\xab\x23\xf2\xb8\x93\xd1\xba\x6d\xb8\x6e\xee\x30\x5a\x40\x5b\xc7\xcd\xeb\x00\x7e\xf8\x8b\x93\x44\xa1\xa1\xff\x3f\x81\xd3\xbc\x79\x18\xfc\x8e\xf5\xf0\xe5\x6c\x0a\x6f\x79\x2e\x82\x1e\x06\xe6\xb4\x00\x83\x65\xe8\x90\x04\xbe\xa6\x0a\x2f\x93\x4e\xc6\x86\xae\x1b\x1c\x71\x2e\x5c\xd7\x7b\x85\x33\xbe\x7d\x90\xb8\x18\x1f\xbd\xe8\xe3\x07\x66\x74\x74\x08\x00\x9f\x12\xf8\x8c\xf8\x09\x2c\x10\xfa\xff\x61\xe6\x38\xcc\x4c\xcf\xf5\x3b\x09\xe6\x73\x03\xa6\x33\x06\x98\x5b\x84\x57\xc1\x9a\x0f\x4d\x24\x25\x27\x2c\x08\xe0\xd2\x28\x24\x94\x70\xe8\x17\x5b\x8f\x9a\x33\xe3\x6c\x3e\x13\xb1\xaa\x9d\x8b\x06\xd0\x52\xa4\x68\xd1\x10\xf7\x3e\xa8\xa5\x97\x36\x17\xdd\x26\x1c\x8d\x2a\x6f\x5b\xd2\x60\x36\x91\x0f\xda\x78\xb5\x79\xcb\x97\xec\x08\x49\x03\x01\xfd\xa0\xd3\x69\xd1\x78\x2b\x4f\x06\x14\x1b\xed\x9d\x19\x02\x21\xf1\x2b\x6f\xca\xf4\x69\x79\xa8\x4f\x5c\x8c\xc3\xe9\x4a\x27\xac\x4c\xc2\xd8\x14\x19\xdb\x32\x63\x53\x68\xbc\x72\xbd\x68\x38\x50\x16\xc2\xc0\x8b\x34\x61\xae\xa1\x58\xd7\x6c\x9d\x7f\xb2\x7b\x4a\x7a\xac\xbd\x78\x6b\x32\xe0\xf4\xd4\x3d\xe5\x84\xaa\x97\xc9\xc2\x60\x2d\x1c\xc0\xd8\x79\x09\xad\x58\xd6\x90\x97\x33\xb7\x5b\xf1\x02\x0e\xf8\xe5\x33\xb3\x0d\xbd\xd4\xb4\x14\xe7\x6b\x6c\x81\xbf\x71\x15\x57\xb2\x22\xea\x2e\xb8\xda\xba\x8a\x2b\xbf\x62\x38\x16\x7c\x18\xc4\x08\x48\xe2\xfb\x74\xa7\x70\x7e\x63\x74\x16\x24\x68\xd3\x99\xda\x9a\x4c\xd8\x39\xdb\xff\xfe\x8f\x7e\xf2\x8f\xff\xd7\x53\x74\x92\xe3\xc4\xe7\x67\xbe\xc6\x4f\x55\x9f\x76\x7a\xaa\x5a\xc2\x6e\x90\x9a\x8c\xb4\x97\xfc\xef\xff\x48\xc2\x48\x86\xd1\xd8\x29\x38\xca\x78\xb5\x8a\x6d\xcb\xc6\x33\xa1\xaf\x5a\xfd\xdd\xbe\xc5\xfd\x18\x2f\x1c\xa4\x52\x09\x6d\x51\x08\x23\x60\xe9\x30\x3c\x70\x5d\x88\xbb\xf0\x1b\x95\xf9\x61\x09\x6a\x5d\x89\x77\xa9\x83\xa5\x57\x75\x6c\x0b\xba\xfd\x18\xc1\x38\x53\xf5\xf6\x8e\xf9\x84\xe0\x44\x25\x9c\x89\x94\x6e\x6d\xd3\x43\x4b\x03\xa5\x0a\xbc\xf2\xc7\xc0\x73\xff\x37\x23\x66\x47\x6f\x40\xa3\xa6\x5f\xe9\x19\xef\xf2\x37\x7a\xda\x50\x59\xe7\x21\x82\xf9\x72\xde\x35\x34\xaa\x41\xf1\x2c\x5b\xe4\x15\x43\xef\x72\x2d\x7e\x45\x79\x5d\x4c\xbf\x02\x3d\xe6\x72\x13\x84\xec\x58\x3d\x49\x2e\xe3\xa8\x58\xc0\x71\x74\x9a\xda\xb0\xb7\x16\x2a\xb2\x3f\xc8\xa0\x9b\xef\xe0\x9a\x69\x15\x3c\xf3\x1e\x8c\xb8\x1f\xd0\xe7\xc6\x48\x57\x78\xdc\x08\x74\xea\xc4\x3c\x33\xc2\x65\x1c\xe6\xfc\x69\xb9\x50\x23\xd4\x55\x70\xb3\x42\x04\x97\xc2\xd7\x5e\x80\x7e\x98\x43\x0e\xc7\x14\x4e\x5b\xa7\xd0\x1f\xee\x91\x2e\x96\x03\xaa\xff\x09\x55\x02\x7d\x0d\x13\x34\x10\x50\xd8\x4e\xf0\xa7\x7e\x87\xcb\x45\x80\x0a\x30\xa4\xb8\x52\xf8\xd3\x5b\x06\x30\x8d\xa2\xbf\x51\x37\x40\xff\xf7\xd3\xba\x5a\xc1\xe4\xbd\x65\x85\xba\xf1\x38\x5c\x58\xe2\xcd\x59\x31\x29\xa6\x79\x56\x6a\xf2\xd8\x08\x89\x57\xd3\x02\xee\x74\xcf\x67\x13\xc5\x84\x10\xb9\xdc\x7e\x70\x0a\x82\xe9\x57\x94\xec\x32\x5a\xea\x9f\xe9\x69\x8f\x6c\x4c\xbc\x98\x0b\xe5\x65\xc3\x03\x0a\xd2\xc6\x96\x77\x9d\x55\x74\xaf\x54\x6a\xef\xa8\x7e\x65\xa3\x9e\x4d\xc1\xb4\x69\x7a\x05\x1f\x1c\xf1\x62\x48\xcc\x58\xa4\x76\xb4\x45\x64\x47\xf4\x00\xd1\x1d\x28\x00\xcd\x65\xca\x12\x52\x5c\xe1\xdc\xaa\xb4\x84\x2b\xe8\x4b\xb6\xba\xe0\x1a\x54\x00\x7c\x80\x53\xa4\xa6\xa1\xa5\x58\xa4\x96\x43\xdd\xd0\x32\x35\x0d\x2c\xf9\xf2\xe3\xda\x87\x45\x52\xf5\x60\x70\x3e\x99\x41\xe8\x3a\xb3\x4d\x77\xf8\x98\x02\x18\x9d\x6d\x99\x4a\x62\x52\xb1\x66\x4a\xbd\x5e\xe4\x73\xb5\x67\xcc\xe7\x3e\x03\xaa\x24\xc5\x73\xa6\x63\x88\xc0\x61\x74\x78\xa4\x78\xd3\x98\x82\xcd\x0d\x81\x3e\xc6\xbf\x76\x12\x9b\xc5\x12\xf0\x6d\x03\x8e\xfa\x55\x07\x8d\x68\xc6\x26\x01\x76\xe9\x6b\xfd\x78\x90\xe9\xb8\x0e\xb1\x1e\x16\xb0\x8b\xb2\xee\x1d\x7f\x78\xe8\x81\xc3\x92\x25\xc7\x54\x3b\x82\xab\xf8\x7b\x75\xd7\x19\x05\x07\x7d\x85\xfe\xab\xc3\xe4\xbe\xe7\x36\x1d\xc1\xaf\x1a\xbe\xd5\x76\xed\x52\x8b\x5a\x0f\x31\xc8\xfb\x53\xc5\x9f\x76\x66\x32\x36\xc5\x24\x37\x03\xf4\x71\x80\x1f\xd1\x3e\x91\xb1\x57\xeb\x8a\xd1\x30\xf0\x00\xc2\xc7\xfc\x64\xf8\x8a\x6c\xf9\x51\x71\x41\x81\xba\xad\xc8\x78\xc7\x1e\x7b\x2c\xa8\x5a\x28\x3c\x4c\x1d\xfd\x75\x2a\xc3\x06\x34\xc8\x11\x13\x0f\xd9\x45\x1d\x35\x23\x45\x11\x47\xdf\xf7\xb8\xbe\x62\xa4\x8e\x6a\xa1\x7b\x05\xff\x84\xb2\xc7\x2c\x41\x03\x1a\xf8\x24\xe2\x08\xe0\x36\x10\xc4\x26\x9a\x45\x4e\x60\x6c\xf1\x74\xdf\xfd\x02\x36\xe3\x8c\xe2\x8e\xdc\x6a\x58\x2e\xce\x6e\x02\xc6\x68\x92\x5d\xce\x39\x9b\x29\xcd\x7f\x0e\x6f\x5e\x15\xd3\xb9\x79\x4c\xc4\x02\x2e\x73\x32\x52\x49\x8a\xd9\xbe\xb5\x63\xc3\x17\x4a\xeb\xfb\x34\x36\x2d\xf8\x2c\x35\x8b\x8f\x37\x39\xe0\x84\x0a\x10\x26\x00\x22\xeb\x25\xa6\x1f\x06\xe9\x72\x5b\x4d\xbd\x53\x60\x36\x9e\x89\x96\xeb\xa6\x02\x80\xae\x68\xe0\x78\x00\xe4\x88\xf9\x8a\x17\x76\x95\xb3\xa6\xe7\x46\x11\xae\x70\x84\x7e\x57\x46\x2f\x22\x0e\x2b\xa6\x6a\xca\x89\x57\x63\x56\xe1\x02\x09\xb8\x77\x57\x3d\xb1\x83\xa5\xea\x76\xc2\x6f\xbe\x7d\x76\x8b\x88\x90\x1c\x4b\x0c\xd5\x4c\xe4\xf7\x7b\x6e\x19\x29\x82\xc9\x1d\x03\xda\xfa\x82\xc9\xb7\x20\xac\x6d\xfa\x87\x06\x8b\x4f\xa8\x7b\xa9\xdc\x81\x10\x5b\x62\xc4\x11\x56\xac\x25\xe2\xe2\xdb\x74\x12\x6b\x9a\x3e\x19\x30\x9b\x74\x52\x4e\xa7\xcd\x11\x60\xf5\xdd\x9c\xe0\x20\x37\x41\x06\xec\x4c\x22\xa4\x60\xb8\x75\xf0\xa4\xd9\x8f\x50\xc3\xce\xdb\xcb\x3a\xa0\x5f\xc2\x7e\x4c\x4c\x87\xcb\x3e\x6c\x38\x54\x62\x9b\x16\xa8\xba\x6b\xc6\xd6\x8d\x34\x07\x0a\x43\x4d\x17\x3c\xc8\xaf\xb8\xe2\x19\xec\xc3\x9a\xe8\x34\x9a\xcd\x57\xb1\xd5\xa3\x76\xfd\x58\x2f\xf3\x45\x2b\x31\x14\xe2\x2a\x21\xc1\xd7\xc6\x2d\x4c\xea\x6b\x59\x18\xac\x68\x4a\x0d\x08\x4b\xf5\x93\x0e\xe2\xd4\x31\x3f\x70\x8e\xc0\x17\xc3\x11\x3e\x11\xcb\xce\x5a\x4c\x3c\x9a\xd6\xac\xaa\x42\xe5\x0f\xd5\xdb\x08\x07\xd0\xce\xcb\x01\x3e\xd9\x39\x6d\xda\x2d\xd5\x57\xd4\x18\x51\x80\xf5\x63\xe3\x6f\x00\xbb\xf3\x54\x1b\x60\x60\x11\xcd\x69\x0f\x77\x5c\xb3\x37\x55\x3b\xc5\x79\x06\x52\x95\xca\x91\xb9\x4c\xff\xa6\xdd\x69\x6e\xdf\x1a\x9e\xcf\xae\xbb\xe9\xb0\xcf\xb5\x6d\x6b\xf8\x40\x28\x4f\x00\x2b\x1b\x90\x39\x1d\xc2\xcb\xc1\x79\x09\x2b\xf8\x25\xe8\xd1\x50\x84\xab\xd1\x80\x39\x64\x2b\xa5\x6d\x90\xee\xf7\xa8\xad\xc7\x88\xbe\xbb\xe4\x6c\x0a\xec\xb2\x02\xfb\x91\xfc\xa7\x2c\x5f\xdb\xd7\x6c\x37\x4c\x07\x50\xa5\x77\xa9\x31\xd5\xde\x91\xe1\x98\xf7\xd3\x25\xcb\x4a\xe0\x7f\x8f\x8d\x26\x83\x7d\x01\x60\xe7\x14\x4f\x0b\x0d\x58\xcd\x36\x94\xd9\x66\xb0\xab\x06\xd6\xa3\x05\x82\x99\x84\x5a\x30\x4b\x2b\x0e\xab\x15\x4e\x4c\x8d\x33\xcb\x5f\x8b\x36\xdd\x28\xfb\xf2\x11\xaf\xe8\x67\x8b\xd1\x05\x01\xa2\xec\x37\x65\x3e\xc8\x97\xf9\xa8\x2b\x24\x62\x42\x05\x07\x78\x89\xa9\x2b\xce\x1b\x31\xe3\xe4\xd9\xa9\xf6\x11\xec\x04\x67\x6c\x65\x7e\x5e\xe8\xc7\xcf\x08\xe6\xf7\x98\xe2\xc2\x16\xc1\xa3\xd9\xc6\x2e\x00\x0f\x52\xdb\xcf\x54\xcd\x49\x66\x11\xc2\x85\x8b\x9a\x7b\x7a\xda\x4b\xcc\x2f\x05\xba\x33\xe8\xa0\x2b\xb7\x20\x86\x6a\x66\x54\x54\x20\x4e\x09\x85\x81\x76\x69\x42\xd0\x3b\xa7\x1c\xb2\xeb\x43\xd2\x39\xef\xb8\xf4\x73\xb3\xcc\x58\xdc\xa9\xbb\x83\x77\x33\xa5\x07\x77\x3a\xbd\xd0\x5e\x55\x17\x80\xd8\x64\x13\x14\x81\xd1\xb8\xd7\x03\x2b\xba\x4e\x5a\x5d\x9e\xcd\x26\x0e\xec\x8d\xdc\xec\x6e\x4c\x85\x2f\x0d\xc9\x35\x2d\x4c\x57\xf5\xda\x61\x3b\x60\xbb\x2a\x3b\xa8\x97\x11\xe9\x0d\x61\xcb\x76\xfa\xcd\x84\xb7\xb4\x86\xf3\x16\x43\xd8\x1b\x6f\x1e\x69\x92\x30\x7e\x0b\x36\xed\xbc\x2b\xaf\x8b\xb7\xd3\xe2\xbc\x18\x65\x28\x4f\x09\xa5\xea\x30\xd1\xc1\x46\xde\xda\x5f\x73\xfb\xab\xb4\xbf\x72\xf5\x6b\xdd\x7e\xca\x61\x4f\x27\xf1\x72\xde\x6f\xc7\xc4\xae\x2e\xc8\x64\xae\xea\xef\x60\x98\xae\x9d\xee\xfe\xe0\xc0\x19\xa8\x19\x18\x36\xdb\xe7\xe1\x4c\x8f\xd0\x58\xc8\x38\x3c\x4d\x2d\x6a\x1a\xe4\x24\xd4\xc7\x94\x30\xe9\xe0\x2a\x79\x6d\x33\x2d\x67\x2b\x8c\x34\xbd\x7b\x4f\xce\xaf\x79\x07\x0f\x67\xe1\xee\x8f\x3b\xe0\xfd\xa8\x83\xa7\x03\xe1\x36\x7a\xf6\xb6\xd5\x1e\x5a\x91\xdc\xdb\x7a\x77\x7b\x7a\x8b\x63\x77\xd6\x0a\x35\x58\x25\xe9\xd9\x1b\x72\xa6\x1f\x26\xa7\x8d\xdb\x69\x05\xd6\x28\x31\x67\x19\x78\xce\x93\xef\xd7\x07\xbb\x01\x34\x08\xd9\xba\x50\x25\xdc\x3f\x74\x4d\x3d\x43\x5c\x2c\xc6\x7c\xd5\x97\x40\x93\x6d\x96\xf5\xc2\x66\x6d\x2f\x7b\x96\x91\x20\x0f\x10\x89\x87\xfb\x00\x3d\x20\x6c\xdb\x6f\x1a\x4a\x51\x67\x58\xa3\x2e\x71\x7b\x59\x13\x4b\xa4\x66\x87\xaa\xa9\x4d\xfd\x6e\xb5\x4d\x8d\xa1\x78\xad\xe9\xac\x8b\x7b\x96\x95\x7b\xdf\xb3\x5a\x9a\xc0\x0b\x76\x4a\xe3\x78\xc1\xce\xc6\x34\x22\x9a\x79\xba\xf1\xed\x6d\x0f\x3f\x54\xa7\x83\xe0\xed\x7c\x8f\xcf\x71\x07\xea\x26\xb7\x89\x52\x0e\x15\x4d\x1b\x1a\x88\x8b\x4f\x2e\x91\xd5\x66\x98\x4d\x51\xf3\xf7\x33\xde\xc9\xa3\xca\x1d\x73\x71\xc3\x54\x6b\xdb\x54\xdf\x67\x33\x6e\xdb\x81\xf3\x35\x55\xe7\x55\xfe\x36\x83\x12\xbd\x38\xf2\xd8\x4e\x2f\xb0\x2a\x60\x32\xb6\xa3\xb8\xa4\x6d\x8f\x82\x5d\xa6\xec\xd2\x5a\xdd\xdb\xd4\x07\xb3\xeb\x95\x53\xc2\x41\xf1\xfe\xc0\x75\x72\x32\xce\xb2\x05\x00\xa6\xc1\x15\xa8\xd7\xef\x84\x6e\x8b\x4b\x02\x24\xe3\x3b\x47\x30\x88\x1f\xe1\x05\x89\x1d\x45\x26\x3e\xbe\x14\xdd\xf6\x4b\xf0\x3d\xcd\xbb\x60\xd5\x2c\x7a\xbe\x67\xa7\xa1\xb3\xd4\x25\xdc\x8b\x68\xef\x74\xbc\x56\x7b\xd6\x86\xef\xf9\xd1\xcb\x89\x53\xf5\x07\xf2\xb0\x7b\x64\x4c\x85\xa9\x57\x60\x80\x35\xe1\xc0\x1c\x94\x68\xbe\x03\xdc\x54\xdc\x22\xb7\xb5\x45\xe8\x79\xb8\xe1\x7d\x0a\xc0\xef\x05\x9c\x05\xbe\xdf\xde\x5e\x8f\xdf\xcd\x03\x01\x5a\x47\xab\xc5\x5a\x10\xa5\xec\x93\xe4\xca\x04\xad\xf5\x4a\xc2\xa8\x10\x70\x13\x01\x8d\x2a\x91\x01\x19\xde\x89\x3b\x4a\xde\x01\x06\xac\xa2\xe1\x05\xaa\x47\x06\x6f\x08\x94\x5e\x17\x60\x0e\xcb\xb5\x36\x52\x4c\x43\x23\xc5\x1a\x41\xc6\x66\x15\x81\xe3\xcc\xe3\x57\x23\xaf\x00\xa6\xb4\x06\x95\xdd\x8e\x4d\xfb\x65\xe9\xc2\x0f\x85\x6f\x56\x2f\xa6\xf8\x7a\xfb\x01\x33\xa0\x56\x2f\x18\xa0\xeb\xf3\x13\x3e\x27\xd5\xaa\xac\xfb\x43\x2f\xf4\x30\xa9\xd1\x05\x19\x94\xe6\xdb\xe9\x0e\x7b\x5e\x08\x56\x28\xcc\xd8\xd6\x39\xba\x2d\x37\xe5\x60\x2b\xeb\x49\x85\xb8\xc2\x6d\xe8\xa7\x10\x02\xa6\x3a\xc7\x49\x39\x06\xed\x24\xa7\xdb\x36\xef\xe1\x8a\xb5\xde\x69\x41\xbb\xce\x1d\xe8\xe6\x6e\x06\x1a\xab\x45\x60\x25\xb8\x63\x51\xa3\x4c\xc4\x2c\x34\x6d\xec\x30\x71\x0d\xd9\x0c\xb1\x18\xb3\xce\x60\xa8\x14\xb0\x7e\xad\x70\xf6\x0f\xc0\x1a\x56\xed\x6d\x27\xdf\x9c\xd2\xc0\x4f\xc9\xd6\xd6\x25\x99\x29\x34\x0e\x71\x90\x0f\x6a\x49\x1b\xf5\x0f\xc6\x33\x50\xff\xf0\x00\xc7\xea\x7e\x0d\x5a\x9e\xd3\x3e\xfa\xf0\x88\xea\x6c\xaa\xe6\x8f\xaf\xdf\xa1\xce\x3d\xbb\x16\x6a\xb7\xfa\xfe\x5e\x55\x35\x55\x70\x0d\xbc\x3e\x8b\x94\x80\xb7\x60\x6c\xa9\xa3\x8d\xd4\x2a\x68\xf3\x4e\x7a\xd5\xd9\xef\xab\x58\x6d\xa0\x3c\x41\xd7\x5a\xab\x28\xff\x3f\x37\x1b\x8b\x63\x06\xa3\xcc\x35\x9a\x3d\x63\x0d\x18\x1e\xbb\xd5\x38\x9a\xca\x4e\x45\x6e\xe4\x76\x18\xd3\x1e\x2b\xdb\x92\xef\x1b\x34\xd6\x8d\xf8\xa1\xbd\xf4\x65\x7b\x0b\x23\x7d\x83\x49\x7e\x57\xb9\x1b\x95\x29\x48\x2d\x4f\x62\x35\xcc\x55\xb3\x1b\x74\xfb\xb1\xed\xa5\x42\xb5\x67\xae\xcc\xe2\xe6\x0e\x12\x18\xb2\x62\xab\x8c\xef\xa6\x35\x09\x4b\x27\x53\xd5\x2a\x6c\x68\xd0\x1d\xec\x3b\xd9\x68\xcb\xcc\xca\x71\x31\xcd\x26\x6d\x64\xaf\x2e\xda\x05\x55\xd9\x74\x69\x71\x68\x6d\xfe\x3a\x25\x03\x0f\xa8\x93\x53\x1d\x12\xf7\xa6\x49\x1c\x1b\x80\xe2\x40\xa3\x14\x1e\x3b\xf0\x9a\xb0\x3d\xe9\xc0\x3f\x9f\x67\xd3\x71\x4b\xc9\x4a\xa6\x89\x6e\x17\xa1\x0c\xde\xe6\x20\x13\xf1\x1e\xae\x7e\x4d\x96\xe2\x23\x69\xfc\xd5\x80\x50\xb9\x0a\xca\x19\x86\x21\xd5\x74\x89\x57\xc5\x5e\x65\xaf\x7a\xe8\x25\xd0\x53\x3a\x3d\x3f\xf8\x8e\xc7\x6e\x05\xd3\x73\xd5\xb5\xde\x61\xf9\x3c\xc2\xb9\xe6\xbd\x67\x7e\xa8\x4e\x32\xd3\x8e\x46\x11\xd1\x6c\xc8\xb5\xcc\x1a\xbe\x0b\xab\xbd\x44\x56\x8f\xfb\x3f\xfd\x75\x37\x45\x91\x60\xa0\xd8\xe7\xd7\x30\xaa\xdf\x66\xec\x9a\xb2\x7f\x2b\xce\x3d\x85\xbf\xb4\xf8\xfa\x17\xa5\x10\x1d\x1a\x85\x8b\xac\xea\x2e\x0b\xdc\xb5\x17\xa7\x8a\xec\x6c\x6c\x0a\x6f\x70\x8a\xb8\x2c\x39\x31\xa3\x7c\xaa\xed\xf4\x7a\x46\xeb\xe4\xec\x77\x3d\xa0\x36\x9c\x2b\x5c\x73\xcd\xb3\xac\x6e\x7c\xc3\xe9\x84\x13\xca\xb6\x2a\xb5\xd4\xb5\xb2\x13\x41\x7d\x0f\x51\x6c\xe5\xd3\xad\x81\xbf\x77\xd3\x96\x82\x3d\x2c\xc9\xc7\xd6\xf8\x51\x2e\xb9\x0b\xe5\x12\x77\xca\xfa\xc4\x4a\x7a\xd8\x7d\x82\xbe\x21\x5d\x53\xad\xeb\x78\x78\x36\xd7\x61\x95\x34\xf4\x21\x6e\x05\x10\xe2\x36\x35\x83\x91\x86\x02\x87\x3d\xe7\x7d\x1e\xb8\x2c\xb1\xb9\xe7\xa6\x89\xe9\x08\xb6\x85\x13\xf2\xd6\xc3\x43\x34\xbd\xc7\x41\xc2\x93\xd2\x7f\xce\x91\xd2\x15\xdc\x85\x96\x6e\x38\x76\xbd\xbb\x0c\x5e\xf2\x77\x8f\xe8\xc1\x00\xb2\xb6\xc3\xb1\x84\x78\x7a\xbc\x3d\x7c\xf3\xa2\xa9\xb9\xc7\x5a\x1a\x13\xde\x77\x63\x04\x36\x6e\xf7\xc8\x0d\x80\x41\x0d\x1f\xf4\xc1\x51\x28\x2f\xbf\xbf\x13\x57\xd4\x14\xde\xed\x09\xe0\xc9\xb1\x7f\xb7\x8e\x82\x0c\xa0\xff\x9f\x66\x21\x70\x81\xd5\x6c\x65\x98\xcc\x14\xd8\x4e\x24\xbb\x41\xa8\x32\xca\x72\x8c\xb7\x9e\x51\x0c\xf6\x5b\xf8\xba\x89\xe8\x7b\xab\x49\xcf\x6b\x78\x83\x8d\x17\xd0\x09\xa3\x9e\x5e\xcf\xe3\x3e\x90\x9a\x21\x34\x44\x0c\x66\x16\x15\x3c\x35\x3c\x82\xa3\x79\xdf\xb2\xe2\xbf\x0c\x8b\x30\xf3\xc1\x9d\xb8\x65\x0d\xbb\x48\xf1\xd6\x2c\x4d\xda\x48\x92\x4d\x99\x2b\x14\x71\x82\xcf\x5a\x31\x9a\x63\x8c\x7b\x96\x45\x8d\xfb\x2f\x4f\x2b\x0f\x21\xfc\xc9\xd8\xe0\xd7\xef\xe1\xb4\x75\xde\xa8\x68\x2c\xdc\xfd\xed\xb6\x84\x35\x3b\x8c\xd8\x2e\x50\xee\xc8\xdd\x6e\x51\xec\xbc\x46\xd9\x22\x7f\x3b\x2b\x57\xe9\xb0\xcd\xfe\xcb\xb4\xde\x33\x6a\xfe\xee\x1b\x07\x20\xb2\x17\x33\x99\x3b\x77\x85\xbe\xd3\x0c\xfd\xec\xce\xe0\xcf\x1a\xe1\x8f\xee\x0c\x7f\xe4\xe0\x6b\x4b\xa7\xa0\xfc\x49\xb2\x33\x3c\xd8\xd9\x39\x00\x8b\xdf\xc1\xd3\xbd\x3d\xf5\xd5\x4f\x76\x9e\xef\xec\xed\x3f\x7b\xa6\x92\xf6\x86\xbb\x7b\x4f\x77\xd4\xaf\xe7\x4f\x77\x54\xca\xbe\xfa\x91\x3e\x7f\x9a\xee\xc2\x39\xf0\xde\xf3\xe1\xd3\xdd\x5d\x55\xf1\xd9\xee\xfe\xfe\xd3\x14\x92\x76\x76\x0f\x9e\xa7\xcf\x14\x84\x74\x7f\xff\x20\x7d\xba\x9f\x9c\xe2\x0e\x4c\x35\x5a\xbe\x3d\x7b\xbd\x28\x8d\x9c\xf7\x30\xd9\xf1\x31\x49\xf7\xf6\xf7\xf6\xf6\x04\x4e\xea\xd7\xfe\xf3\x83\xa7\x3b\x1c\xbb\xe1\x50\x35\xf6\x5c\xe0\x09\xc5\x86\x4f\xf7\x76\x18\xc6\xe9\xce\xf3\xfd\xfd\x67\x07\x29\xc7\x7d\x47\xe5\xa4\xd8\x80\xed\x45\x7a\xb0\xb3\xbb\x97\x3e\xdf\xe3\xfd\xd9\x1d\x3e\xdf\x79\x36\x7c\x2a\x7a\xa6\xf0\x7a\xb6\xff\xec\xb9\xed\x23\xe0\xb1\x97\x0e\x55\x6b\xad\x7b\x7b\x86\xdd\xdd\x05\x4c\x9f\x2a\xe0\xfb\xbb\xcf\x15\x24\x05\xf1\xe9\x70\x6f\xf8\x14\x7e\xa4\xc3\x9d\x83\xbd\x1d\x68\xee\x60\x3f\x7d\x3e\x7c\xae\x0a\x3d\xdf\x49\x0f\xf6\x01\xbb\x34\x7d\x9e\xee\xa7\x29\xb4\xab\xf0\x3c\x38\xd8\x3d\x80\xcc\xe1\xce\xf3\xe7\xbb\x80\xe7\xde\xce\xc1\xb3\x21\x62\xa7\xd0\x55\x7d\xc4\x5f\x0a\xc4\xae\x22\xc9\xb3\x83\x83\x83\xf4\x00\x32\x55\xd5\x03\xd5\x73\xa4\xdc\xde\xf3\x83\xbd\x5d\x2c\xf6\xf4\xe9\x2e\x10\x58\xf5\xf8\xe9\xc1\x33\x48\x1a\x3e\xdb\xdd\xdb\xdd\xd9\xc3\xa6\x76\x9e\xed\x23\x5c\x45\xfb\xe7\x07\xfb\x7b\xad\x3b\x3b\xa2\xce\xee\xec\xed\x29\x3a\x43\x1f\x81\xb6\x43\xa4\xda\xf0\xe0\x60\x07\xfb\x31\x54\xd9\x38\x2e\xaa\x89\xfd\xe1\x3e\x34\x0d\x98\x3e\x3d\xd8\xc3\x5f\x3b\xfb\x3b\xfb\xcf\xf1\xd7\xee\x9e\x1a\xf2\xbe\x82\xb6\xbf\x3b\x7c\xaa\x3a\xfe\xf4\x60\x7f\x67\xef\x29\x42\x3b\x18\x3e\x1d\x0e\xa1\xe6\x6e\x3a\x54\x70\xf6\x20\xf3\xb9\xc2\x1a\x5d\x16\x76\x9f\x2b\xf8\x3b\x7a\x1c\xb1\x93\xe9\xde\xae\xa2\xf0\xf3\x14\x49\xbc\xbb\x0f\x83\xfc\xfc\xd9\xc1\x33\xd5\x3c\x52\x71\x77\xef\x19\x0c\x4d\xba\xb7\xf3\xf4\xe9\xf0\x59\x5a\xd7\x5b\x3b\x07\xff\x76\x95\x4d\x17\xc5\x24\x7a\x24\xec\x8b\x52\x53\x16\xcd\x3f\x27\x8d\x66\x76\x5b\x54\x88\x5d\x6e\xd7\x59\x5c\x94\x79\x75\x31\x9b\x8c\x2b\xcf\x94\x13\xbf\x86\x00\x67\x4d\xaa\x87\x7f\x4b\x8e\x85\xdd\xc5\x2c\x63\x0e\x9a\xb0\x4e\x58\xeb\x02\x1c\x88\xfe\xad\xc7\x8a\x9d\xbc\xa7\x53\x40\x3c\x2e\x09\xb0\x7d\xaf\xd6\xf3\xbf\xdd\xc1\xa1\x9f\xac\x18\x18\x79\x10\x8c\x23\x5b\xcb\x9e\xb4\x12\x9c\xb8\x3b\x28\x0e\x25\xf0\xd1\x38\xfd\x3d\xac\x37\x4b\xc3\x13\x14\x69\xa1\x37\x38\x2f\x26\x18\x41\x1b\x53\xf2\xb2\x18\xe9\x20\xde\x2a\x21\xab\x46\xf9\x54\xea\xb9\xff\xd4\x4e\xfe\x66\x28\x6b\x1c\x02\xcc\xb1\xad\xc7\x7c\x9e\x0b\x3d\x1c\x9e\x84\x2a\xcb\x8a\xdf\x22\x37\x6c\x88\x46\xa9\xef\xce\xbb\x2b\x9f\x3e\x2b\x6d\xe2\x3d\x01\xa3\x61\x1f\xfe\xd1\x57\x43\x57\xda\xdd\x87\xf1\xe2\xca\xc4\xed\x67\xb7\x28\xa1\xbe\x2b\xe2\x42\xac\xf2\x6a\xac\x4a\x78\x65\x35\x39\xbd\x93\xde\x54\x33\x83\x63\x7a\x53\xe0\x57\xee\x49\x97\x5f\x36\x90\x2e\xbf\xe4\xf0\x8c\x65\xcb\xc3\x3c\x5b\x05\x6f\x54\xa6\x11\x29\xf3\x5e\xed\x89\x8a\x8d\x6c\xc5\xfc\x35\x4d\x7b\xe5\xa9\x10\xfe\xd6\xef\xe1\xf2\x79\x57\x47\xc0\x56\xff\xc5\x8d\xbf\xa1\x1c\xc3\x97\xf9\xb8\xf4\xe2\xd1\xb3\xed\xae\xc1\x2f\x13\xde\x49\x0b\x04\xd1\x9d\x05\xc5\x09\xdd\x49\x4d\x13\x2b\x39\xf1\x7e\xea\xd6\x92\xc5\x41\xc2\x8b\xaa\x2a\x65\x19\xde\x8b\xfe\x67\x17\x0a\x77\x9c\xd1\xf4\x2e\x2e\x4d\x67\x98\xc7\x87\x09\xc4\x8f\x78\x8f\x0f\xa4\xfa\x51\x16\x4e\x20\x96\x02\x44\xc5\x48\xa9\xc8\x7d\x4c\xc2\x80\xc1\x37\x9b\x84\x56\x62\xb4\x99\x85\xb6\x70\xf7\x04\x82\x02\x9f\xb6\x9b\x88\xae\x56\x74\xbd\x6f\x5e\x28\x97\xe0\x8f\xb1\xac\x5d\x20\xed\x25\xcd\x76\x8b\x63\x6b\x57\xbb\x9a\xc5\xf1\xcd\x26\x3b\xe3\x5b\x35\x1c\x65\xe7\xb6\xcd\xde\xcf\xe2\x74\x62\x96\x8d\x95\xbc\x80\xbb\xba\xeb\xaa\x51\xc7\x08\xb5\xdb\xed\x80\x5b\x0b\x77\x39\x7b\x2d\xb3\x9a\xb2\xdd\x36\x3c\x6a\x0b\xd7\x38\xf3\xda\xfc\x70\x65\xd8\x12\xd7\xf3\x4d\x41\xe7\x95\x51\xb0\x1b\xe7\x2c\xdf\xf2\x94\x4d\xb9\xbd\x0c\x6c\x54\xe5\x0c\x7c\x7f\x98\x25\x5e\x37\x1e\x7a\xf7\xec\x66\x21\xe0\xfe\x2e\x9e\x16\xb6\xc5\xf6\xfc\xe9\x33\x41\x8c\x2f\x0b\x2f\x7e\x00\xb0\xe6\x07\xb0\x73\x86\x71\x46\x7e\xc9\xcb\x99\xcf\x9d\x43\x59\x6f\x90\x95\x51\x63\x08\x9d\x6d\x4f\xf3\xf2\x87\x6c\x5c\x5c\x55\xda\xa3\xe2\xc3\xdb\x37\xaa\xfc\xd7\x2e\x5d\x5b\x72\x23\x85\xbe\x73\xe9\xfd\x64\x34\x2b\x3d\x50\x80\x1a\xda\x83\x23\x55\x3f\xbb\x5a\xcc\xb4\x31\xf6\xb3\xe9\xdb\x49\x2e\x32\x5f\xdb\xe4\x7e\xa2\x54\xff\xb0\xc0\x9f\x74\x22\x42\x0f\xb3\xbf\xd7\x89\x9e\xd6\xa5\x72\xfc\x38\x3b\xc3\x84\xf9\x0f\xaa\x09\xbc\xc5\xe8\xa1\x0f\x6c\xe9\xad\x1e\x17\x6d\x07\x62\x3c\xa6\x7e\x35\x46\xa1\xfa\x6a\xd9\x10\x0d\xbe\xa6\x6f\x35\x05\x95\x38\xbc\xc8\x26\xe7\xff\xf8\x9f\x2a\x11\xda\x31\x04\x58\x5f\x1c\x1f\x81\xb7\x77\x29\x32\xd0\xea\xb2\x21\x44\x58\x06\xa7\x36\xd5\xf8\x0b\x00\x48\x4e\xfe\x22\x64\x53\x09\x31\x44\xca\xa1\x9a\xe8\xc0\x26\x65\xaa\x3b\x58\x42\xc4\x5e\x40\xb9\x1c\xf1\xd2\xaa\x95\x17\xc7\xc9\x3f\xfe\xd7\xff\xf9\x0f\x77\x65\xb8\x28\x47\x93\xfc\x75\xfe\xf6\x12\xed\xa6\x29\x34\x09\x8e\x8e\xdd\x12\xf4\x15\x2f\x17\xc5\xe4\x36\x96\x00\x9f\x47\xbc\x98\xf3\x6f\xd6\xf5\x11\x47\x65\xa4\x00\x40\xe0\xe0\xb9\xea\x28\x84\x20\xd4\x11\x53\xe6\x29\xfd\x05\x4d\x64\xa5\xb5\x91\x15\xc4\x2f\xd9\x51\x7f\xe1\x41\x9c\x5d\xf5\x77\x17\x78\x02\xa3\x20\x9f\x88\x30\x99\xf8\x4a\x42\x77\xcb\xf0\x4b\x1d\x35\xff\xfe\x77\x7a\xcf\x62\x47\x38\x3c\xcc\xe9\x88\xc1\xf0\xf1\xb1\xcf\xc9\xe6\xae\x03\x46\x82\x52\x9d\x7e\x0c\x84\xdb\x02\x32\xaa\x5f\x29\x74\x74\xcb\x56\xaf\x69\xf9\xc8\xb6\x86\x52\x18\xc8\xa3\xfa\xfb\x18\x5c\x17\x64\x16\xc0\x43\x4a\xe0\xd6\x18\xe2\xac\xce\x21\xd6\x54\x6a\xa3\x51\xa9\xa4\x6c\xee\xdf\x5a\x83\xe1\x45\x3a\xca\x5a\xc3\xba\x5a\x37\x0f\x64\x8b\x8e\x18\xa8\x96\xbb\xe6\x46\x33\xc5\x6a\xd0\xd9\x39\x0f\x96\xb5\x92\x85\x10\x7a\x50\x88\x1e\x30\x92\x90\xf0\xb8\x41\x40\x4a\x43\x48\x41\x21\x8c\x12\x91\x46\xb8\x5f\xfd\x03\x67\x30\xaa\x30\x68\x78\xff\xf8\x9f\x3e\xfb\x6b\x1f\xf7\x14\xe2\x9a\x33\xf9\x73\x9d\xe7\xf3\xae\x64\x33\x8a\x1e\xa9\xa6\xd2\xbf\xab\x96\xa4\x33\x3c\x3e\xb5\x01\xad\x53\x1f\xb3\xd4\x7b\x3a\x38\x4a\xb3\x8b\x54\xf8\xac\x47\x08\xe6\x95\x40\x6a\x21\x35\x78\xc4\xc4\xc4\x7f\x10\xd8\x1b\x28\x84\x3b\x8c\x8e\xaa\x78\x82\x60\xb9\x83\x33\x3e\x1c\x0b\x1e\x97\x77\x25\x0b\xb9\xb1\xe0\x85\x96\xbb\x21\x24\x1c\x7a\x01\x69\x37\x84\x14\x14\xc2\x51\x1d\x8a\x51\x85\x01\xcd\x52\x7d\xb2\xa6\x0a\x37\x8e\xea\x30\x3a\xaa\x42\x58\xd0\xa8\x92\x3c\x82\x91\x1d\x46\x46\x76\xd8\x38\xb2\x21\xdd\x2e\x86\x72\x64\x43\xa2\x79\x25\x90\x62\x48\x91\xb6\x23\x0b\x20\x11\x6e\x74\x64\xbb\x28\xc7\xad\xe5\xc0\x52\xaf\xc4\xa3\xcd\xa1\xf6\x73\xd9\xe2\x0b\x76\xdd\xa2\x05\xd1\x54\x06\xc3\xa1\x60\xf8\x51\x49\x1d\xfa\x04\xf8\xf5\xdf\x81\x70\x01\xf9\x31\xce\x0b\x20\x01\x5d\xb3\xb1\x5a\x4f\xb4\xa4\x46\x2b\x14\xb0\x33\xcf\xc1\xc9\x86\x39\x6a\xc4\xde\xe6\xb3\x4b\x0c\xdc\xf2\x76\x36\xfd\x1a\x6e\xed\xe3\x36\xcc\x95\x82\x2d\x21\x0d\xa0\xfe\x8d\x53\x54\xff\xd6\x6d\xc0\x82\x4b\xa1\xae\x54\xaf\x67\x23\xb4\x68\x65\x2b\x9a\x12\x98\x00\x9b\x8e\x33\x2c\x91\xba\x12\x67\x2b\x9a\x65\xb6\xc4\x7b\xe8\x46\x6a\x2e\xc4\x55\x96\x9e\x30\xd2\x5d\x8c\xf0\x7e\x06\xbb\xf0\x0c\x82\x09\x9e\xad\xf0\x3c\xd8\x2d\x05\x98\x9f\xd9\xfc\x0c\x9f\x3c\x73\xd9\x67\xb6\xfa\x99\xae\xde\x33\xc7\xb8\x13\x3b\x84\x58\x12\xb1\x83\xc3\x64\xfc\xbb\x45\xc8\xd1\xb7\x78\x1b\x44\x87\x04\x8b\xbe\x3a\x40\x4b\x6b\xca\x59\x03\x56\x5a\x62\x8b\xc9\x08\x51\x57\xbd\xdd\x82\x77\xd0\xfa\xc9\x62\x77\x28\x74\xaa\x97\xc8\x2d\x3f\xc2\xee\x41\x71\x46\xb7\x7e\x60\xbd\x91\xb1\x23\x86\x7a\xc5\x88\x74\x03\x05\x3e\xdd\x69\x02\x1f\x1f\x52\x09\x84\x4f\x21\x14\x68\x23\x9c\xcc\x2a\x5b\xf6\x3b\x41\x85\x80\xdc\xf4\x3a\xdf\x76\xb0\x6b\x38\xd6\x9d\xcf\x3a\x1a\x5a\xa7\x6f\x7f\x29\x56\x1e\xc2\x17\x28\x20\x9d\x44\x97\x4e\x6d\x69\x5b\x58\x97\xed\xf4\x9d\xf4\xf0\x45\x0d\xd5\xc4\xa6\xf4\x4f\x80\xa3\x7a\x6e\x53\xe9\x27\x86\xa9\x43\xa8\xa3\x6b\xd3\x28\xe6\xb4\x46\x51\x95\x1e\xca\x27\x62\xa2\x2f\xb0\x6c\x48\x87\x74\x6d\x23\x0f\x1a\x9a\xf3\x1a\x03\x46\x40\xf0\xab\x78\xa4\x77\xe4\xdc\xdd\x26\xce\x1d\x86\x9c\x3b\x14\x9c\xbb\xad\x39\x77\xb8\xbb\x86\xb5\xa2\x52\x04\x14\xd3\x6d\xd5\x8a\x61\xd0\x9d\x74\x0d\x14\xcb\x94\xf5\xa2\x8c\xb3\xb1\x80\x5f\xcb\xbb\xc1\xcb\xe8\x8c\x8c\xdf\x74\x10\x2d\x3e\x66\x43\x3b\x66\xc3\x28\x63\xa8\xd2\x8e\x8d\x6c\xe1\xa1\xe5\xdd\x38\xdf\x62\x2d\xe2\x50\xfa\x89\x7c\x3b\xdc\xb5\xa9\xf4\xd3\xf1\x2d\x4d\x01\xd3\x28\xe6\xb6\x46\x51\x95\xde\x90\x77\x6f\x41\x87\x48\x23\x2d\x79\x17\x1a\x83\xa1\x26\xde\xdd\x89\xf0\x6e\x50\xbf\x15\xe7\xfb\x92\x9a\x55\xaa\x13\x34\x93\xd4\x17\x13\x4b\x93\xb2\xe2\xba\x62\x2b\xec\xfd\xf9\xe6\xb7\x1f\x61\x96\xc9\x30\x36\xdc\x30\x83\x08\xfc\x6e\xb0\x7b\x60\x40\xff\xad\xe3\x9b\x86\x30\xd3\x8b\xf2\x20\x37\xec\xf1\x7d\xa5\x67\x58\xe9\x7c\xab\xc6\x9a\x36\x5b\x5b\xc0\x0e\xf6\x27\x4b\x25\x61\x06\x6f\x17\x5e\xd3\x27\x7e\x6c\x6f\x5e\xa5\x4c\x39\xa2\x6a\xc6\x0c\xa4\x01\xc5\xda\x58\x3e\xb4\x8f\x76\x65\xeb\xdb\xed\xaa\x6f\x93\x41\xa8\xf0\xe8\xb2\x4f\xc2\xcc\x6c\xcd\xb5\xf9\x08\x10\x92\xc6\x9a\xcd\x11\x62\xf5\x4d\x6b\x81\xfd\x67\x23\x84\x3c\xc3\xd0\xe6\x18\x71\x00\xa6\xbd\xd0\xda\xb4\x11\x4e\xdc\x28\xb5\x39\x42\xb6\xf6\x91\xe5\x73\x07\xee\x43\x12\x33\x0f\x78\x09\x87\x1b\x63\x2c\x4c\x65\x9b\xa3\xec\xaa\x9b\xb6\x7c\xdb\xdb\x46\xd8\x30\xab\xdc\xe6\xb8\x98\xca\xa6\x1d\x69\xe2\xdb\x74\x1c\x6f\x8f\xc7\x3c\x93\x78\x48\x5b\xe2\x66\x3c\xae\xe0\x97\xb3\xa2\xc6\x47\x11\xf5\x17\x34\x3f\xad\x37\x2f\x42\xf4\x92\x16\xd6\x44\xda\xc3\xe1\x0b\x95\x5b\xeb\x4d\x8a\x0a\xe6\x1a\x33\x22\x02\xb4\xb6\x44\xaf\xc7\x27\x6c\x2b\x0f\x3b\x98\xb2\xcf\xb6\xed\x98\xe0\x9d\xd9\x48\x4a\x71\x0f\x3a\x3e\x09\x8e\x93\x4e\xa6\xfe\x76\x7c\x93\x76\x68\x82\x76\x37\xab\x8d\x35\x7d\xe0\xc9\xcd\xe0\x5a\x5c\x60\xa1\x8e\xc0\xf0\x44\x5d\x0d\x0c\x67\x8d\x8e\x80\x90\xf3\xaa\x06\x82\x31\x57\x47\xea\xf3\xb9\x50\x53\xdb\x58\xb3\xc3\xda\x68\xdf\x18\x70\x36\xae\xeb\x42\xd4\xa0\x25\x80\x75\x71\x9f\xbc\x4c\x61\x38\x71\x87\xdc\xc5\x7f\x57\x98\xb0\x1c\xb2\x00\x31\x69\x43\x43\x9e\x96\x3c\x47\xab\xad\xd9\xb6\xf1\xe5\x1b\xa3\xfe\x0f\x41\xc5\x9e\x0f\xf5\x9b\x0b\xa4\xd0\xad\x4c\x62\xaa\x13\x41\x95\x9c\x00\xb3\x74\xd1\xd2\xa0\x34\xe5\x43\xd0\xa3\x6d\x8c\x1a\xdc\x1f\x03\xa8\xc7\x08\x70\x0b\x21\x40\x1f\x52\xa5\x9d\xce\x60\x7f\xaf\x6a\xe3\xb7\xfa\x84\xdd\xfd\x36\x7e\x2f\x87\x26\xf2\x35\x21\xa0\xf6\xd4\xcb\x3e\xd9\xd7\xa8\x71\x95\xb0\xea\x93\xa9\x05\x51\x33\x25\x74\x82\x2b\x01\xbb\x0d\x50\xe5\xb6\x54\x61\x3d\x2f\xd1\x98\xd3\x5d\x21\x36\x26\x8d\xe2\x6e\xef\x20\x91\xf5\xeb\x13\xab\x1d\xa4\xb0\xfa\xc2\xcd\x30\x58\x03\xe0\x09\x31\xc8\x54\xbf\xe0\x45\x04\x32\x0a\x6e\x23\xf1\xbe\x20\x53\xc5\x63\xaa\xb6\x04\x0b\x18\xd6\x85\xa6\xc6\xc6\x39\x60\x3b\xc5\x87\xcc\x85\x99\xa1\xc4\x19\xfa\x18\x5a\xd9\x56\x50\x1e\x27\x5f\xc0\xa1\x00\x9a\x07\xbb\x5f\x60\x4b\x10\x76\x09\x5b\x07\x5c\xc7\x0a\xd9\x11\xda\x0d\xbb\xdb\x5f\x10\x4a\xdb\x1a\x25\x9b\x8d\x84\x33\x95\xb7\x82\xca\x29\xaf\xbc\xe5\x55\x1e\x63\xcb\x23\xe2\x37\x88\x5a\x87\x6d\x8d\x88\xdd\xe0\x1b\x81\x8f\xc8\x2b\x05\xf3\xf1\x1b\x8d\x32\xab\x5d\x12\x30\xf4\x20\xc7\x10\x1b\x18\x62\x0b\xf8\x7b\x05\x7c\x3a\x46\x22\x8d\x71\x44\xa0\x2e\xa4\x2b\x8a\x8c\x74\xb3\xa9\xe9\x9d\x82\x28\xa4\xd5\x89\xfa\x3f\xc2\x0a\xc6\x99\xf0\x51\x0c\x83\xdb\xc4\x11\xb6\x55\x82\x1d\xa8\xa4\x3c\xf3\x95\x9c\xd6\x44\xd7\x57\x13\x02\x4e\x13\xbb\xf3\x72\xf6\x2e\xc7\x64\xc1\xfb\xb4\xc8\x68\x43\x57\x31\x5d\xfc\x95\x9e\x34\x11\x69\x3f\xab\xce\xe7\xe7\x0a\x88\x8e\x87\x43\xa1\xa4\x64\x30\x54\xd6\xd4\x37\x3a\xa8\x00\x2b\xf0\xdf\x73\x00\xca\x12\x06\xef\x73\xc5\x57\x8b\x7c\x0a\x21\xb5\x12\x88\x97\xe8\x1d\x92\x21\xce\xe3\x6c\x91\xc9\xe5\xab\x22\x25\xdc\x04\xa9\x99\x9b\x4b\x62\x26\x60\xb8\xb9\x60\x09\x35\xed\x1d\xcb\x71\x3f\x39\x5f\xca\xd5\x74\x09\x81\x38\x56\x32\xcd\x1d\x1a\x3b\x2f\x0d\xad\xf3\xf3\xdd\xb0\x41\x81\x6d\xad\x78\x60\x5c\x47\xe7\x2e\x61\xd7\xb3\xfd\x0c\x8f\x35\x9a\x9f\x96\xd4\x44\xd7\xcf\x72\xe1\x4a\x39\xd6\x7d\x3b\x29\xa0\xc3\xde\x6b\xa1\xd4\x1e\xe1\x75\x92\x6c\x9d\x2f\x45\x4d\x28\xdf\x57\xa9\xab\x20\x35\x39\x0d\xc3\xdc\x50\xcc\x9d\x82\xab\x2b\xbc\x29\x4b\x98\xa3\xa0\xfd\x44\x3e\x9f\x7a\x13\xb1\x0c\x7b\x80\x03\x60\x46\x59\x34\x94\xb6\x2e\x7f\x36\xc5\xec\xd7\xc4\xbb\xfb\xd4\x04\x70\x0e\x3e\x71\xb7\xb9\x3f\x8a\xf5\xa4\x82\xea\xbe\x1f\x0a\xc0\x15\xda\x05\x36\xb4\xba\x55\x43\xf6\xb9\x97\x55\xeb\x86\xdc\x0c\xbc\x85\x83\x0f\xd5\x35\xed\x38\x50\xed\x9a\xae\x89\xa4\xdc\xba\x79\x29\x08\x8e\x58\x1d\x1d\x7b\xe7\x8d\xf7\x24\x5a\xaf\x51\x76\x20\xde\x9a\x4b\xfd\x62\xdd\x5a\xa9\xf4\xb5\xcd\x98\x95\x15\xde\x7f\x7f\x83\xc7\xac\x81\xe0\xea\x81\x6c\x6a\x45\x17\x27\xbe\x36\xa7\x89\xae\x6b\xda\x71\xa0\xd6\x0e\x89\x97\xce\xfc\x2b\x20\x29\xa6\xf9\x33\xd7\x0f\xb3\x1a\x8c\xdd\x4b\x0e\xc1\xed\x92\x28\xc5\x90\x98\xe8\x62\xf3\xab\x25\x40\x46\x2f\x45\x78\x72\x1f\xb3\x3b\x94\xbf\x3d\x9a\xcc\xaa\x7c\xdc\x89\x94\x7b\x89\x39\x54\x1a\x2e\x79\x89\x22\x10\xac\x58\x03\x82\xbc\xed\xb3\xfc\x7c\x56\xe6\x9d\xa0\xcc\xe7\x98\xce\x4b\x66\xe7\x0a\xe9\xb0\xe0\x67\x90\x6c\xde\x14\xaa\x8a\x4a\x14\xf8\x1c\x52\x34\x10\xcc\xdd\x9e\xcd\xf3\x69\x27\x2c\xf3\x9d\x4a\x16\xe5\x62\xdd\xc3\x92\xbc\x77\x67\x57\xd3\xf1\x24\x97\x65\x30\x49\x07\x0d\xca\xe8\xf2\x8f\x28\xf0\x52\x27\xea\xd6\x4c\x99\x08\x62\xa6\x24\xc3\xcd\x96\x8e\xa1\x67\xca\x73\x0c\x2f\x67\xd3\xd9\x62\x36\x95\x38\x7e\xab\x13\x1f\x98\x50\x0a\xb5\x93\xc9\x3c\xd9\x6c\x19\x0f\x17\x77\x11\x34\x14\x3f\x60\x62\x29\x3e\xb2\xd3\x8b\x12\x09\x49\x95\xfe\x44\xe3\xfb\xdf\x9e\xa8\x99\x55\x2d\x00\x0a\xf1\x66\x2f\xb6\x33\x73\x9c\x64\xd6\x59\xc9\xed\x7a\x8d\xa1\x85\xe2\x9b\x9a\xf8\xda\x11\x8e\x8c\x43\xab\x6f\xd4\xba\x8d\xd4\x01\xc7\xc0\xdb\x12\xa8\x09\x07\x31\x24\x65\x45\x2c\x87\x7d\x0c\x72\x4a\x49\xb8\x13\x31\x6e\x24\xc9\x9c\x2c\xcd\x60\xe3\x9c\x9f\x38\xaf\x76\x5f\x87\x60\xc6\xce\xaf\x54\xd1\xee\x9c\x36\x0d\x5d\x06\xb6\x38\xed\xe1\x2b\x28\xb8\x21\xe8\xfc\xa4\x01\xf6\x9c\x4e\x3b\xc5\x47\xc7\x7c\x50\x73\x67\xbc\xae\xb3\x9d\x36\x11\x81\x26\xeb\x1f\x44\x8a\x9f\x90\x14\x92\x04\x78\x3a\x70\x0f\x1d\x43\xe1\xf2\x87\x0e\xb1\x3f\xb4\xe1\xa8\x6e\xda\x2f\x2e\x56\x74\xd7\x9c\x1e\x1b\x9d\x69\xf6\x5a\xf4\x9e\xb3\x33\x46\xe6\xcb\xa1\xc1\x14\x77\xae\xac\xdc\x57\x79\x79\x09\xf1\x1f\x35\x38\x8a\x38\xa8\xd4\xf9\xed\x54\xc7\x6d\xf3\x30\x73\xbb\x7b\x0f\xbb\x56\xfd\x12\x93\xbd\x6d\xcf\x76\xdb\xf5\x6c\x58\xd3\xb3\x2e\x57\xd0\x6d\x59\x13\x2e\xc2\xee\x16\x9a\xfa\x7a\x62\xda\x90\xa8\x6d\x27\x3b\x8a\x59\x06\xa3\xd9\x74\x04\x31\xb5\x75\xa7\x4e\x18\xa9\x4f\xfd\x6d\xc8\x3a\x02\xfd\xbe\xa4\x31\x8d\xdd\xdb\x38\xfb\x80\x17\x1a\x8a\xe9\x06\x6a\x9f\x3a\xcd\xf5\x22\x05\x8d\x50\x76\xed\xe1\x71\xe2\x97\xfb\xf8\xe3\xf5\x65\xb6\xb8\xeb\xde\xba\x45\x84\x6f\x5f\x40\x70\xfc\xed\x0a\x1f\x1b\x5e\xd7\x88\x15\x1c\x9d\x8e\xf6\x4e\xe4\x32\xc5\x7d\xd2\xb1\x69\xe2\xea\xd3\xe9\x29\x24\x80\x61\x0c\xc4\x14\x7b\x31\x0b\x1a\x77\xa8\x63\x0b\x5b\xaa\x89\xff\xd1\xc1\x45\x84\x8c\x64\x8b\x21\xf9\x81\xec\xa8\x25\x64\xb7\x67\x8f\xac\xba\x73\x32\x97\x2d\x86\xe4\x16\xe2\x65\xeb\x95\xc8\x7c\xb8\x3b\x33\x1c\x77\x96\x0a\x88\xed\x70\xda\xc4\x06\x0d\x17\x2a\x83\xed\x82\x77\x92\x41\x72\xe0\xe7\x05\x83\xbf\xb5\x75\xe4\x77\xf3\x25\xf5\x43\xdb\xe2\xb0\x9f\xbc\x7f\xda\x24\x87\x1d\x14\xfd\x26\xb2\x78\xa5\x35\x35\x44\xd9\x5a\x22\xd8\xe8\xb0\xd4\xed\x04\x64\xbd\xd7\x59\x0c\xef\xda\x47\xc4\xf9\x76\x3c\xde\x3d\x8f\x1a\x3c\xc3\xf6\xf6\xf5\xbd\x61\x7f\xe3\x0d\x93\xe4\x22\x74\xa1\xab\x19\x85\x08\x83\x6d\x21\x2e\x75\xfc\xb5\x85\x38\x85\xb9\x13\x81\xdc\xc4\x61\x77\xe3\xaf\x80\x6d\xe4\x5f\xad\xd8\xe1\x37\x77\x75\x19\x6d\x80\xc2\x63\x10\x30\x0f\xda\xa2\xa8\x60\xcd\x8d\xcf\x30\x9f\x9d\x3b\x72\x7a\xe2\x1c\x8c\xa8\x0a\xf1\xf5\xff\x57\x31\x6f\xac\xc3\x1b\x35\x62\xfd\x02\x79\x1b\x8e\xde\x96\xa5\xb4\x99\x28\x83\x1b\x7c\xf3\x1d\x6d\xfc\x1e\xea\x58\xf6\x3a\x31\xd5\x89\xc0\x02\xa7\xbd\x08\x35\x0d\xb4\x26\x8a\xe2\x86\xc8\x53\x8f\x02\x2b\x10\x85\x53\x69\x27\x28\xcd\x24\x89\x11\x4c\xcb\x33\x46\x6a\xb4\xb7\xce\x0b\x6d\xd5\xa7\xdf\x40\xf2\xb9\x7e\x52\x5d\x7b\x72\xc3\xff\xba\xbc\x6e\x8a\x9a\x14\xd8\x5d\xf1\x4a\xc5\x09\x9e\x59\x98\xff\x21\x8c\x84\xab\x6e\xcc\xbd\x42\xfd\x00\x87\x07\xd6\x8b\x2f\x66\x8b\xbd\xae\x4f\x92\xcf\xf3\x5f\x8a\xbc\x04\x47\xf1\xa5\x71\x60\x69\x5f\x65\xd5\x33\xca\x61\x44\xa9\xc0\xd8\xd2\x66\xbc\x38\xf3\x1c\x0b\xee\x29\x62\xfc\x31\x5f\xfa\x6f\x9b\xa8\x14\x02\x5e\x70\xe7\x95\xf9\x2a\x28\xb7\xb2\xe5\x98\x33\x60\xbc\x0b\x5d\xa0\x1b\xf4\x1c\xbb\xc2\x19\xcb\x74\x67\x66\xc3\xe7\x79\x7e\x24\xf3\xe2\x96\x2a\xad\xdd\xc2\xb7\xe0\xc5\xbd\x4d\x78\xd1\x3a\xfa\x4b\x1b\x74\xc0\x97\x96\xe7\x86\x8c\xab\x86\x51\x25\x7f\xb7\xc5\x30\xc5\x07\x25\x18\x82\x1b\x8f\x88\x9b\xb0\xa5\x95\xa6\x9b\x30\xa6\x6e\x77\x7b\xbb\x58\x23\xbd\xfe\x29\xf9\xef\x56\x5c\x15\x35\x1d\x18\xd6\x68\xe4\x0a\x78\x1f\x6b\xaa\x08\xbc\xc7\x19\xc4\x72\x47\x8c\x35\xf6\x6a\x28\x98\x7c\x94\x4c\xef\xc4\x1e\xc8\x8e\xbf\x93\xd0\x8a\x33\xc7\x65\xcb\xae\xfd\xe7\x62\x10\xb4\xf5\x35\xa9\x11\x01\x5b\xc8\x27\x6c\xa7\x52\x8f\x5a\x0a\x45\x9f\x2d\x6b\x36\x89\x1e\x67\x76\x49\xd3\x53\x5a\xdd\x61\x89\xc2\x03\x5f\x97\x8e\x0b\x3c\xac\x58\x86\x45\xe7\x0a\x43\x43\x99\xda\x95\x43\xa8\x9c\xbe\xc6\x59\x28\xad\x67\xca\x74\x4d\x7a\xf0\xcc\x18\xb8\x1f\x1b\x15\x52\x2a\x4a\x8f\xf1\xe0\x5f\x69\x76\x78\x64\xca\x9d\x08\xe9\xed\x33\x5e\x3d\x8d\x56\x5f\xd9\xea\xab\x5e\x4c\x29\x0d\xc5\xb9\xd0\x4b\x9a\x46\x10\xb9\x3a\xeb\x27\x67\xde\x1e\x38\x23\x25\xf5\x8c\x3a\x94\x91\x52\x7a\x46\xf8\x65\xf0\xe4\x1a\x7c\xed\xd0\xd7\x2e\x7d\xed\xda\x43\x5a\xcf\xd8\xce\x58\x2f\xa5\x75\xa1\x4f\xfa\x6d\x1f\xbd\xfe\xd5\x9f\xa1\x7e\x1a\x37\x52\x63\xc7\xd4\xd0\x45\x77\xd6\xd6\xd8\xe5\x35\x0e\x44\x53\x07\x34\x47\x6b\x65\x9d\x98\x1f\xe0\x89\x60\xa8\xc2\xd6\xe9\x97\xad\xc5\x02\x78\x3f\x6c\x26\x48\xc0\x6b\x64\xb3\x1a\x3b\x1b\xb7\xb1\xb3\x71\x1b\xbb\x1b\xb7\x01\x1e\xdf\xcd\x36\x8c\xd7\x93\xd9\x3c\xd7\xce\x2b\xbe\x9b\x0c\xb9\x7e\x58\xe5\xfc\x09\xa6\x30\x1d\xbe\x09\x2e\x3d\xb4\xf2\x45\x71\x7e\x9e\x97\xf9\x74\x94\xfb\xca\x39\xb3\x5d\xbe\x8b\x89\x26\x5a\xb5\x70\x95\xf2\x8d\x0e\xa9\xdc\xd6\x80\x15\xe3\x92\x04\x40\x5d\xbf\x22\xcb\xc0\x3b\x27\x69\x2e\xe1\x61\x13\x70\x2c\x81\x29\x3f\x8e\x83\xc1\x3d\x90\x6c\xbb\x80\xeb\x23\xa7\xfa\x1a\x0b\x17\xde\x1a\xde\x58\x68\x90\x97\x4d\xc4\x32\xc7\x20\xde\x7e\xb0\x61\x1b\x38\x56\xfb\x27\x25\x2c\xfa\x49\x45\x84\x6a\x43\x79\x27\x80\xa3\x14\x6f\x26\x52\x9c\x2e\x46\x3a\xf7\x3d\xa2\x18\xe1\x88\xb7\x51\xcf\xd0\x1f\xed\x93\x04\x6e\xd1\x3a\xe9\xae\xa9\x74\xa9\xab\x24\xfc\x82\x97\xef\x65\x9e\x51\x41\x78\x89\x72\xec\xc4\xf6\x19\xaf\x2e\x72\x80\x4a\xb0\xbd\xcc\xe0\xba\x11\xc8\x44\x97\x05\x18\x55\xc9\x8b\xe4\xb9\xe7\x6b\x00\xdd\x53\x25\x77\x85\xab\x55\x25\x5c\x0f\x34\xc6\x15\x00\xf6\xd2\x4d\x17\x2a\xd9\xd8\x4d\xcc\x70\x91\xb8\x7b\xae\x72\xf1\x63\xd4\x06\x74\x0c\x75\xed\x3d\x90\x77\x30\x80\x70\x65\x49\x2f\xb5\x22\x9f\x2e\x67\x17\x78\x31\xe4\x54\x1f\xbc\x74\x0f\x28\xaa\xe5\x16\xa1\xfe\x18\xff\x38\x07\x11\x7f\x97\x5e\xe1\x8d\xe0\xbe\x29\x4c\x9f\xb7\xdf\x92\x1b\xa6\x6e\x3c\x3a\xfb\x0d\x6d\xbb\x75\x93\x4a\x84\x6c\xd1\x27\xda\x83\x32\x1b\x17\xf1\xa0\xfc\xe6\x55\x76\xc9\xff\x5c\xde\xfe\x80\x75\x35\x99\x2c\x34\x74\x90\x26\x3f\x11\x70\x6d\x9a\xe4\x8b\x5c\x7f\xb2\x82\x99\xf6\xc1\x25\x37\x0f\x59\x6e\x25\xe4\x87\x3d\x8a\xaf\x5b\x37\x09\x8b\xd8\xf6\x00\x52\x1a\xf7\x07\x65\xdf\x30\x74\xed\x36\x0a\x2a\xc4\xd4\xb1\xd2\x24\xb2\xd0\x45\x99\x4d\xc3\xd5\x43\xba\xd9\x9a\xc2\xaa\x4c\x29\xee\xcd\xf6\x64\x89\x54\x94\x20\xef\xdb\x98\x86\x8c\x08\xd5\xb1\x61\x56\xe6\x59\x9d\x53\x9a\xbe\xf2\x27\xbc\xd2\x96\x69\x24\x71\xa5\xaf\xe4\xaf\x82\xcc\xdf\xcc\x67\x8d\x25\xfc\x60\x43\xfb\x16\xfc\xd9\xe9\x6f\xc0\x22\x8f\x97\x83\xea\xdd\xdb\xb0\xf7\x2d\xdd\xdb\x86\xe2\x2b\x8d\x58\x1a\x42\x6f\x37\x4d\x41\xeb\xee\x36\x44\x7f\x37\x2f\x75\x85\xa9\x48\x58\xa8\x70\x8c\x7e\x9d\x9f\xc6\x3c\xc7\x93\xc0\x43\xea\x46\xde\x1d\x58\xa6\xd8\x00\xde\x0d\x27\x50\xab\x75\xa0\x56\x35\xa0\x56\x00\x0a\xf4\x4a\x93\x7f\xaf\xde\x78\x29\x3b\x07\x53\x43\x15\x1b\xcf\xb0\xd2\xd0\x85\x2b\x16\xd5\xf9\x6d\xa2\xdf\xd2\xa5\x6f\x68\x96\x01\x0c\xa1\xa8\x46\x37\xe2\xd8\xb7\xc2\xac\x55\x98\x95\x9c\x46\x9c\xf4\x52\xe6\x25\x98\xc6\xdd\x04\xc3\xe4\x66\x3f\xc1\xe1\xa6\x8e\x82\xc3\x44\x7a\x0a\x26\x82\xc3\xeb\x56\xea\x24\xda\xe4\xfd\xba\x10\xc2\xec\xbc\xad\x0b\xa1\xb5\xc6\xe3\x1c\xc4\xc9\xe5\xbb\x74\x01\x78\xdd\xdc\x11\x6b\x6f\x78\xbb\x06\x87\xa2\xc1\x96\x6d\xa5\x77\xed\x5c\xfb\x7e\xdd\xd2\x43\xd2\x36\x85\x52\x6b\xb5\x41\x7b\xb7\xa3\xe3\x6a\x28\x1a\x6c\xd9\xd6\xed\xe8\xc8\x3a\xd7\xbe\x5f\xbf\x8b\x03\x68\xbc\xe9\xe2\xbf\xae\x03\xe8\xba\xe5\xde\xac\x0c\x00\x89\x25\x9b\xea\xdf\x78\xa5\xb5\xb3\xdb\xa7\x89\x5a\xa9\x20\xee\xd0\x37\x9d\x56\x03\xf0\xbb\x78\x9a\x06\x4d\x7b\xe9\xa4\x97\x47\x5c\xba\x06\xee\x8d\x83\x98\x67\xd4\x51\x58\x0f\xd3\xeb\xab\x11\xd8\xa3\x07\x2c\x72\x58\x9e\xc5\x36\x00\xd2\xa8\x47\x4a\x55\xcc\xb3\x95\x81\x59\xb3\x9d\xd0\x2d\x79\x10\xa3\xdb\x09\x0b\x0d\xb7\x13\x24\x57\xed\x36\x81\x3e\xc5\x1c\xe2\x17\x45\xb5\xc4\xf7\x8a\x0f\x59\x79\x79\xd9\x55\x4b\x6d\xaf\x7c\xca\xca\x9b\xed\x0a\xc9\x25\x59\x70\xc5\xca\x89\xfb\x96\x5a\x60\x7a\xa5\x39\x1a\xec\x52\xa4\x96\x78\x5e\xe1\x34\xce\x2b\x8c\xea\xa3\x8b\x59\x19\xbd\x91\x88\x1a\xef\xec\xaa\x1c\x19\x16\xc0\xdf\xe0\xab\x53\xaa\xe9\xa9\xf5\x76\xfc\x0d\xc1\x13\x65\xec\x36\x04\x6a\x62\xbe\xdd\x35\x7e\x9b\xa7\x9c\x23\xec\x2e\xa9\x3c\x42\x3b\x07\x2b\xc2\xd5\xd9\xdb\x72\x76\x35\xd7\x7a\x91\x41\x59\xab\x4d\x8b\xb0\x84\xe9\x00\x96\xf0\x66\x1c\x08\x81\xad\x44\xe9\xae\x18\xd5\xa7\x1c\x75\xab\x81\xda\x83\xa8\xef\x14\xfe\xc5\x98\x46\xea\xcf\x10\x63\x98\xe5\x7f\xbb\xca\x26\x55\x17\x20\xf6\x20\x9a\xd9\x55\xf9\x21\x97\xe5\xe9\x27\xbe\x39\x14\xe4\x2e\xe0\xe7\x02\x73\xa9\x25\x93\x80\x79\xd8\xd2\x42\xb7\x44\x75\x59\xbe\x83\x2c\x82\xa4\xf9\x91\xbf\x4d\xb7\xab\x7c\x72\xae\xf6\x02\x46\x67\x14\x04\xd4\x65\x80\x19\x48\xbb\xa4\xc2\x9a\x7a\x78\xcd\x8c\xae\x9b\xb2\x4c\x53\x89\xca\xf8\xc1\xeb\x6a\x0a\xd6\x46\xaf\x5b\x57\xde\x1b\x21\xb6\x6b\x39\x4c\x4a\xf6\x90\xc8\xf0\x50\xfd\x8f\x7d\xa7\xea\x3b\x75\xdf\xf3\x21\x44\xdd\x90\xbb\xe8\x21\x76\x51\x84\x9a\x52\x2a\x35\xab\x93\x86\x75\xd2\xa0\x4e\xda\xd3\xaf\x09\x5a\x31\xed\x0d\x84\x66\x14\x7e\x5e\xe1\xa6\xe7\x00\xe8\x77\x9c\x9c\xc1\xdf\x8f\x3f\x86\xef\x54\x7f\xa7\x51\x60\xc0\x2a\x25\x9e\x0a\x65\x61\xc4\x03\x8a\x58\xe0\x02\x16\xe8\x78\x05\xf0\x7b\xab\x9b\x25\x2f\x92\x7f\xfc\x4f\x3a\x41\x4e\x31\x6d\x1e\x6d\x81\xd8\x0d\xc2\x3b\x80\x41\xb8\x4c\xb9\xb1\xdb\x35\xf5\x3f\xd4\x2e\x9f\x20\xcf\x05\xa2\x38\x55\x9d\x10\xde\xfc\xf2\x75\x29\x2e\xd0\x97\x6d\x2e\xf2\x63\x9b\x62\xa1\x24\x2c\xac\x28\xbb\xc5\xb5\x78\xac\x6a\xda\xe1\x32\x71\x63\x2c\xac\xf0\xdc\x1c\x0b\xaa\x6a\x15\x05\x26\x85\x37\xa7\xc5\x1f\x16\x26\xa0\x0e\xa3\x3f\x22\x54\x40\x88\x8b\x9f\x11\x35\x19\xb2\xb5\x2d\x72\x55\xbb\x14\x17\xc5\xf5\x1a\xab\xd4\x92\xb7\xb3\x9a\xa7\x4b\x37\x59\x66\x9d\xe9\xc3\x2d\x94\x06\xf6\xf7\x36\xcf\x5b\x2f\x4d\x81\xc8\x92\x89\xa7\x33\xd4\x60\xc4\xca\x30\x87\x63\x48\x6a\x3a\x92\x7b\x89\x86\xf6\xe1\x00\x6e\xf6\xce\x77\x07\x2b\xe3\x4e\x87\x47\x97\x20\x2c\x9c\x70\x5e\x1e\xaa\x04\xa5\x7d\xd9\x84\xd5\x61\x72\x69\xa4\xa4\x5f\x70\xb7\xbe\xa0\x42\x48\x3a\x8d\xd2\x13\xbd\xce\x4a\x19\x5d\xc0\x8d\xdf\xe1\x4b\xe3\x14\x89\x82\x90\x3e\x76\xf8\xc7\xae\x70\x48\x34\x64\x8b\x08\x8e\xd6\xc1\x90\xd7\x0b\x8e\xa5\x8f\xb3\x69\x56\xf0\xa5\xc5\x25\x14\x1f\xad\x71\x59\x2f\x3e\x36\xc4\x45\x30\xe3\xe6\xf8\xcc\x3d\x7e\x4d\x24\x77\xfb\x61\xf3\xa3\xb8\x44\xf2\xa2\x53\x36\x9c\x23\xc1\xcc\x3d\x51\x73\x17\xf6\x07\x8a\x9f\x4f\x6b\x66\xef\x9a\xbd\x09\x9b\xe4\x5e\x45\x78\xde\xb9\xdd\xd4\xe5\xe5\xde\x40\xc1\x90\xd8\x9b\x8e\x82\x55\xfd\xbd\x07\xf2\x3e\xe5\x4d\x75\x3d\x8c\x68\x27\xc5\xc8\x25\xc7\x06\xdf\x18\xf6\x51\xba\xe5\x98\x34\x34\xe5\x0d\x51\x4d\xcc\x14\xf4\xc5\xb7\x75\x6a\x22\x97\x90\xfa\x3a\xa6\xf8\x8e\xf8\x2b\x72\xc2\x62\x59\xc1\x3b\x5f\xf1\x95\xbc\x9e\x08\x64\xc2\x38\xa5\x5a\x5d\x9e\xcd\x6a\x19\x04\xac\x29\x6e\xf0\xa9\xec\x8f\x2a\x4d\xe9\xba\xf4\xf4\x88\xc8\x79\xad\xd2\x3c\x49\x4e\x19\x9e\x1c\x37\x2e\x07\xa2\x32\x59\x50\xa0\xc1\x40\x72\x73\xab\x0a\x15\x7e\x89\x01\xb4\x7a\x5d\xc0\x22\x2c\xce\x65\x22\x95\x1f\xe8\x8e\xdc\x42\x06\xa9\x8a\x56\x02\x59\x6a\xd4\xca\x1f\x6a\x4e\x70\x97\xc6\xa0\xf2\xde\x6a\x69\x2f\x91\x2d\x55\x13\x46\xf5\x4d\x30\x08\x72\xa2\xdc\xed\xc6\xd0\xb7\x86\x1c\xec\x19\xa6\x89\xd7\x01\x8e\xf0\xeb\x74\x28\xc6\x59\xed\x45\x46\x3e\x8e\x38\x8c\x9c\xed\x80\xf1\xd9\xc1\x3c\x74\xfa\x09\xe8\xfe\xa2\x3b\x36\x3e\x9a\x8b\x75\x16\xec\x1c\x52\xb5\x53\x30\x31\xd1\x5a\x15\x2b\xe5\xf5\x4b\xe6\x53\xa5\xb9\x34\xf1\xae\x2d\x53\x37\x0f\x63\xdd\xd2\xb7\x71\xcb\x59\x55\x1d\xba\x71\xe7\x7d\x6d\xe8\xed\xbe\x88\xc8\x2b\xb4\x83\xed\x5d\x8c\x7b\x62\x3a\x41\x3d\xfb\xca\xfd\xfc\x49\x16\xfa\xca\xf6\xeb\x27\xaf\xb8\x2d\xf2\x93\x2d\xe2\x15\x96\x40\xb6\x63\x85\x5d\x43\x76\x1f\xdf\x37\xf2\xfe\x72\x36\x1d\x37\x77\x7d\x15\xeb\x7b\x17\x42\xc0\x48\x0e\xcb\xa6\xbb\x43\x8c\x50\x8f\xef\xfc\xac\xa2\xf9\x01\xb1\xcc\xc8\x83\xbe\xd7\xf9\x06\xd1\x5e\x22\xd9\x86\x9d\x84\x85\xbe\x5b\x59\x85\x6a\x5b\xe4\x7b\xfd\xa9\xd4\x36\xb8\xcc\x37\x1c\xc9\x86\x51\xf4\x47\xf0\x1b\xc9\x9b\x94\x98\xc4\x18\xd6\xab\x1e\x23\x7e\x67\x51\x16\x68\xc0\xdb\x1e\xcf\xae\xe1\x82\x77\x13\xd6\xcb\xd8\x20\x48\xa9\xa0\x32\x76\x81\xfc\xf8\x00\xca\xd2\x27\x3f\x66\x47\x7b\xca\x49\xcc\x47\x80\x0d\x8c\xa0\x3c\x4b\xaf\xed\xd1\xd5\xfc\x8f\xee\x4f\x84\xa5\x6a\x38\xc9\x25\x73\x2b\x97\xb9\xfe\xce\x56\x60\x90\xa1\x95\xbf\xa0\x56\x70\x70\x50\xd1\x19\x64\x20\x8a\x08\x49\xde\xd3\x5d\x77\xd7\x93\x4d\x0b\x53\x64\x91\x4d\xbb\xbb\x43\xea\x2a\xaa\x85\xd3\xca\xde\xc2\xcf\x27\xa4\x8a\x28\x9d\x66\x31\xc3\x35\x78\x51\xaa\xfc\xc2\x57\xd2\xa6\xd9\xa5\x10\xd4\x85\x75\x86\x30\xa5\xbf\x9e\x5e\xe4\x65\xb1\xf8\x7a\x0c\x6b\xf6\xd6\x96\xcc\x53\xcb\xf3\xb4\xf2\x6b\xbc\x52\x30\xab\x79\x36\xca\x09\xba\x33\xa3\x19\xa7\x05\x67\x56\x9b\xce\xc6\xb0\xcd\xe4\xa8\xc5\x1a\x87\xa6\x0d\x43\x2c\x8a\x4b\x35\x67\xbf\x80\xa3\x92\xe9\xec\x5a\xa9\xb5\x66\xc3\x9d\x55\x24\xb5\xe1\xc7\x9b\xd1\xd5\x59\x31\xfa\x7a\xfa\xdd\xd5\xc2\xe4\x8f\xf3\x49\xa6\xb6\x72\xd6\x22\x37\xbe\x2a\x33\x68\xe2\x30\xd9\xd9\x1f\xf2\xc5\xd5\xde\xb2\x7b\xa7\xfd\x27\x60\x97\x09\xda\x88\xbd\x62\xb7\xb5\xf5\x0e\x5c\xd1\x8f\x12\xe6\xf2\x65\xba\x48\xa7\xe6\xcc\x8c\x79\xe2\x8e\xc4\x2d\x64\x93\x07\x50\x4f\xde\x79\xae\x1a\x98\xc9\xda\x42\x2f\x01\xde\x96\xf6\xf9\x56\xa4\x33\xa5\xc1\x31\xcc\x1b\x03\x95\xdb\x25\xea\x16\x30\x46\xea\xcf\x98\x13\x9a\x1d\xb6\x1b\x5c\x09\x73\xa8\xb3\xc6\x3b\xda\x41\xb1\xfd\xac\x4c\x1b\xfc\x40\x25\xc6\x85\x78\xd2\x55\x5e\xcd\x17\x75\x4c\x68\xb4\x34\xa0\x77\x0e\x21\x23\x20\x93\x45\x2d\xe6\x60\xdf\x38\x68\x87\x35\x19\xaf\x5e\x77\x9b\x78\xb3\x17\x86\x36\x89\x00\x3f\xde\x18\x78\x2f\x0c\x48\x11\xad\x3e\xf5\x1d\xeb\x6a\xf6\x17\x93\xd9\xe8\xbd\xda\x34\xa8\xac\x0f\x56\x75\xc4\x00\xfa\x90\x61\x18\x69\x5a\x29\x2e\xf8\xf8\xe3\xa4\x4b\xe5\x92\x63\xac\x76\x02\xff\x0c\x28\xe9\xb4\xe7\x73\xd1\xf6\x36\x66\x8f\x66\x57\xd3\x45\xcf\x3a\xb0\xf9\xd5\xf4\x51\xaa\xce\x36\x8d\x39\x16\x62\x65\xe1\xa2\xe6\x60\xdf\x65\x51\xea\x20\xff\x00\x6f\x70\x81\x3d\x99\x7d\x3b\x6e\xe0\x2a\x3f\x0e\xfd\x9b\x37\xe0\xf0\xf2\xe6\x8d\xe9\x34\x3d\xcf\xe5\x33\x66\x4c\x17\x65\xdc\xe9\xb1\xa6\xee\x3a\x0c\xc6\xd5\xd9\x68\x92\x55\x95\x2d\x21\xea\x59\x6e\xd5\xcd\xe9\x89\x3d\x35\xa3\xab\x08\x3b\xad\x44\x16\x4a\xcd\x42\xba\x0c\x53\x96\xa7\x77\x46\x1a\xd1\x32\xd1\x93\xab\x09\x3a\xad\xc5\x05\x71\x3c\x5d\xcf\xb9\x48\x0b\x48\x5c\x8f\x89\x65\x66\x43\xdd\xfc\x72\xbe\x58\xd5\x56\xc6\xdc\x86\xda\x5a\x48\xc5\x2b\x43\x66\x43\x5d\xb6\x21\x0d\xeb\x9a\x3d\x94\x5a\x72\xe3\x0b\x9b\xad\xa3\x86\x3f\x14\x2f\x36\x17\x58\xd2\x7e\x70\x50\x9f\xd6\xad\x82\x9f\x46\xcb\x6b\x19\x76\xc8\x20\x1f\xa2\x3e\x60\x3e\xbb\x3d\x5e\xda\x26\x8b\x03\x68\x57\x00\x4c\x2a\x96\x3d\xe2\xf4\x69\xa2\x1c\x42\x0f\xa9\x31\x2b\x83\xa5\x1e\x27\x5b\x61\x96\x71\xfc\xb2\x7c\xde\xb4\x70\xab\x5f\xb4\xba\x98\x41\x4c\x12\xd3\x86\x2f\x2e\x4d\xba\x43\xe2\x3f\xd5\x3a\x1b\x2e\xb4\x20\x62\x75\xff\xc1\x74\xad\x7b\x45\x22\xcc\x11\x85\x89\x30\xb5\x02\xbf\xeb\x79\x6e\x7b\x00\xba\x63\x8a\x74\x92\x62\x8a\x95\x7a\x86\xb0\xb6\x36\x08\x1b\xfe\x7d\xc4\x60\x84\x2b\xbe\x1d\x16\xb6\xe8\x43\x02\x88\xeb\x93\x62\x2c\xfd\xfc\xe4\xc2\xaf\xab\x86\xfe\x7b\xbf\xd6\x56\xc1\x78\xec\xac\xfc\xfd\x68\x0d\xf5\x1c\xfd\xd9\x64\xf2\x7b\x30\x75\x65\xf4\x52\x4b\x4d\x87\x52\x3b\x56\xff\x8c\x4e\x90\xef\xcc\xed\xbf\xad\xc2\xc8\x07\x56\x08\x51\xce\x31\x1e\xc3\x20\x7d\x36\xe0\xfa\x18\xbf\x35\xce\x5d\xd1\xed\xf7\xba\x97\x33\x72\x9a\xc0\xc6\x59\x47\xe1\xa1\xf2\x99\xec\xa8\xe9\x2c\x9b\x9f\xba\xde\xc9\xfb\xa8\x8e\x6c\xc7\xf8\xfd\x1a\x35\xb9\xcd\x8c\x49\xf8\x63\x0d\xbf\xdd\x6c\xa0\x27\xc8\xf9\x54\xa0\x14\x71\x9c\x57\xcb\xe5\x6c\xeb\x45\x98\x33\x2f\x3b\x0d\xf9\xa1\xe7\x6a\x67\x1b\x14\xdc\xae\x5f\x42\xd7\x6d\x47\xd8\x7c\x18\xe1\x72\xcd\xe3\xef\x78\x7c\x92\x7b\x10\xea\xc3\xd8\x54\xd0\x13\xc1\x8b\x85\x52\x2b\xd4\xa9\x23\x6b\xe5\x78\x93\x40\xf4\x04\xe8\x2d\x58\xc0\x97\x56\x5a\x96\xad\xe5\x89\xc5\x75\x9e\x07\x3b\x7b\x55\x1d\x92\x37\x12\x90\x8e\x27\x82\xe3\x9a\x4f\x20\x62\x11\xdf\xa0\x41\x7f\xbb\x3d\x23\x2a\x08\x07\xb4\xfa\xa3\x36\x74\xe4\x75\xd8\x71\x0e\x6e\xec\xb4\xb6\x4f\x78\xdb\xfd\x9d\xc3\x1f\x97\x43\x43\x6b\x2e\x92\x74\x3b\x65\x7e\x39\xfb\x90\xf3\xa6\xe0\x9a\x40\xfb\xfa\x95\xc6\xd3\x10\x49\xc3\xe8\x45\xed\xe9\x8e\xe4\x6f\xb0\xb4\xdb\x5b\x20\x04\x8c\x53\x58\x47\x6d\xbb\x49\xd0\xf4\xf6\xf7\x13\x6b\xe8\x64\x39\x83\xa6\x28\x36\xe5\x39\xc3\xfa\x74\xd3\xac\xba\x41\xef\xbb\x3a\xd2\xe2\x3a\x1d\xc6\x11\xba\xab\x11\xe1\xf5\xe1\x86\xc7\x2d\xe8\x4f\x75\x0d\xfd\xd9\x0d\xaf\x28\xa7\x67\x8b\x45\xe9\x33\xfa\xab\xd7\x5e\x34\xc9\x7a\xfe\xf5\xd6\x56\xe8\x03\x28\x5f\x08\xa4\x47\x6c\x0d\x2d\x74\xf5\x90\x52\xc6\x09\x7e\x9d\xfa\x47\x33\x50\xfa\x88\x4d\x6e\x7a\xa7\x96\x7b\x17\x53\x75\xe0\xef\x0e\xf6\x05\x9e\xe6\xed\xd0\xe6\x82\x15\xfc\xd1\x64\x91\x1d\x43\xdc\x15\x22\xfb\x07\x6c\x0f\xa6\xd5\x00\x1c\xb7\x8a\xf3\x95\xee\xb3\x91\xb9\xd6\x15\x4b\xe1\xfd\x4a\x4d\x23\x66\x3c\xc0\xfe\xd0\x4c\xf9\x4c\xe5\x16\x67\x57\x0b\x39\x65\xe2\x10\x5e\xbd\x5e\x03\x03\x6c\x17\x0a\xca\x40\x4b\x29\xfc\x3d\x99\x8d\xac\xe7\x6b\x04\xee\x8f\xc8\x27\xa1\xc7\xd9\x19\x9b\xfd\xa6\x7d\xe0\xaf\x33\x8c\xf9\xd4\xe9\xc7\xaf\x08\xa1\x27\xae\x11\x5e\x4a\xe4\x78\xbd\x53\x0c\xeb\xe4\xb0\x39\x7e\xc6\x75\xed\x0c\xf5\x77\x58\x33\xf8\x2d\x20\xf4\x85\x63\x4d\x2d\x3c\xf5\x08\x5a\xa9\xfc\x56\x54\x23\xaa\x20\x17\xf8\xce\x40\xb1\x86\x0e\x8a\x7e\xed\x28\xa1\x98\xe7\xf6\xb4\xa8\x1f\xa5\xdf\x9a\x3e\xb5\x2d\xb7\xa6\x59\x6c\xa1\xd4\xb2\x97\x56\x8e\x0e\x90\x68\x00\xf6\x78\x21\x01\x78\x63\x9a\x8e\x9a\xe2\x8a\x90\xf6\x6b\xed\x7a\x6a\x4b\xc6\x44\x4d\x20\xe7\x37\x9c\xa4\x34\x15\x42\x5f\xa8\x73\x23\x4e\xfd\x23\xf0\x7e\x1d\x9f\xfb\x12\xe9\x1c\x15\x99\xe8\x28\xd5\xf1\xf0\x39\x1f\x8f\xb8\xc3\x28\x67\xdb\xbb\x61\x5d\xcf\x91\x77\xe9\x49\x03\xb7\xd5\xf7\x8e\x2b\x32\xc4\x57\x21\x47\xdd\x0b\x2b\x55\x8b\x95\x74\x2a\x14\x3a\xc3\xbc\x2c\x66\x25\x5c\x45\xe0\xec\x94\x1c\x07\xce\x32\x4e\x2f\x9b\xca\xe8\x4f\x4c\x7d\x47\x36\x44\xe5\xbd\x52\x94\x99\xbe\xed\x04\x7b\x40\x5a\x03\xcd\xd2\xdd\xe9\xb8\x79\x88\xeb\xa1\x41\xc6\x2c\x89\x7a\x41\xc4\x1e\xd8\x4c\x22\xcb\x89\xf9\x3c\x95\x0b\xb8\x47\x5a\x69\xb1\x4d\x6c\x77\x59\xeb\xbe\x9b\x38\x34\x16\x5b\xc6\x30\x43\x2f\x44\x8a\xba\xf3\xbc\x5c\xac\x1a\xd6\x32\x2c\xfe\x1a\xe9\xb0\x46\xd6\xda\x16\xdb\x8b\x5a\x35\xd4\xd7\xc5\x74\x3c\xbb\x46\x76\xef\x01\x8f\xbf\x9c\x5d\xce\x15\x2f\x8e\x5f\x23\xb1\x68\x16\xa0\x85\x04\x32\x0d\xbe\x3f\x01\xa5\xda\x2f\x51\x52\x19\x68\x27\x85\x91\x4a\x95\x6b\x92\x2d\x55\x8c\xdb\xee\x43\x00\x53\x53\x66\xbe\x58\x8e\x66\x84\x6f\x37\x37\xa2\x72\x56\x4b\xd9\x70\x82\xd4\xa8\x76\x6a\x46\x44\x78\x4b\x72\xc3\x2d\xe4\xee\x3d\x0c\xf4\xc6\x92\xad\x66\x04\xcf\xe3\x23\xb8\x4e\xa8\xf9\xa3\xe4\x28\xb1\x7e\x53\x99\x2f\xa5\x9f\x38\x57\xb1\xd7\xf3\x07\x54\xef\x58\xb6\xf0\x0a\xaa\xbc\xf5\x5b\x2d\x55\xc8\xcd\x5d\x18\x78\x3b\x6d\x7b\x18\x40\xc4\x0c\x73\xfd\xe9\x19\x51\x42\xc1\x79\x39\x53\x13\x09\xc3\x20\xe8\x10\x1f\x37\x6b\xf6\x19\x24\x68\xea\x1c\xe9\x6a\x77\xce\xc1\x01\x66\x27\x9f\x8e\x99\x69\x3f\x2e\x59\xd0\x13\xfa\x88\x4b\x74\x7d\xc8\x46\x47\x73\x20\xb6\x51\x28\x18\xc3\xc7\x60\x9e\x95\xaa\x37\x60\xc2\xea\x29\xc6\xd7\xc8\xbe\xbc\x28\x26\x63\x62\xd4\x60\x37\x5b\x77\xbe\x93\x55\x79\xed\x10\xdf\xdd\x60\x90\x36\x1a\x0c\xa0\xf1\xc0\x06\x45\x8b\x93\x6f\x82\x32\x4b\x96\x52\xb1\xa0\x96\x76\xb1\x1c\xef\x72\x07\xcb\x56\x06\x87\x36\x1b\x54\x4d\x14\x6c\xb3\x2d\x21\xd1\xbf\xe0\x0f\xa3\x24\xb6\xde\xce\xe0\x72\x4f\x66\x04\xd3\xdf\xad\x56\x96\x83\x88\xdd\x60\x4b\xcb\x85\x36\x03\x62\x1a\x13\x23\xb2\x7e\x48\xb4\x8b\xc7\x1f\x37\x2a\x1a\x81\xdf\x77\x60\x5c\xaf\x6d\x70\xa1\xb4\x9f\xb4\x33\xf0\x44\xc6\x29\x00\xd2\xd2\xca\xc3\xf0\xd8\x6c\xd8\x80\x26\x7c\xc8\x16\xe8\x9f\x3c\x29\x2a\x25\xbf\xf3\xcd\x4e\x7b\xd6\x19\x33\xb9\xf8\x2d\xb4\xaf\x51\xdc\x05\xa9\x6f\xf2\xbf\xae\xf7\x90\x32\xf2\x7b\x51\xae\xd8\x9a\x5e\x73\x8e\xec\x1c\x06\x74\xa1\xf5\xd2\xca\x1f\xf6\x3a\xe8\x0d\x47\x38\xce\x1d\xbb\xcd\x99\x0d\x53\x0d\x93\x73\x08\x79\x3d\x59\xd7\x31\x34\x1b\x58\x7f\x84\x75\x04\xf0\x09\xa7\x0d\xe5\xf2\xdc\x71\x43\x41\xae\xfd\xdc\xd7\x9f\x67\x75\xd9\x71\x3b\xb9\xa7\xfc\xfd\xef\x91\x44\x5c\x72\xc6\x85\x62\xa7\x05\x2c\xe6\x78\xcb\x4c\xad\xe1\xb0\xaa\xc3\x1f\xeb\xc2\xd2\xe9\xf5\x7a\x83\x90\x5b\x1b\x75\x6b\xb3\x41\x6a\xd4\xc1\xa2\xee\x0d\x72\x16\x0c\xf9\x34\x28\xc6\x70\x9d\xb5\xce\x53\xaf\xfd\x69\x68\x8d\x8b\x9e\xd6\xab\xff\x73\x9c\xf3\xdc\xea\xcc\x73\x28\x66\xcc\x5a\xb7\xba\xb4\xef\x9d\x3f\x92\x87\x22\x63\x24\x48\xe8\x8b\x22\xe4\xac\xc8\x79\x4d\x25\xc8\x22\xda\x5f\x91\x95\xa1\x45\x70\x4b\x24\x69\x19\xeb\x55\xb5\xae\x8d\x91\xa2\xac\xe4\x4d\xe4\xac\xea\x9e\xfd\x01\xd3\x75\x3a\xbe\xe7\x90\x27\xf7\x16\x9e\xef\x5f\xe7\x0d\xdf\x1c\xbc\xc1\xf0\x18\x22\xc9\x6c\x72\xc0\x3d\x57\xe5\x1b\x05\xbf\xa6\xe5\xa8\x8b\xa4\x96\x49\x7c\x7e\x69\x1f\x3b\xc3\x21\x28\x26\xec\xc7\xb1\x1d\x7c\x72\x54\x63\x1e\xa6\xa8\xb9\xab\x6f\xbd\xee\x79\x7e\xae\xe8\x64\x67\x05\x12\xde\x18\x61\xe7\xce\x62\x65\x02\xfe\x71\xe2\x12\xd9\xc9\x2d\x35\x11\x90\x0c\xa9\x84\xf6\xb5\x87\xc9\x34\xbf\x86\xee\x7f\x9b\xcd\x9d\xcb\xac\x65\x55\xc1\x9f\x9a\xf1\x4c\x6b\xf8\xc9\x72\x2d\x6f\xd9\x02\x01\x0f\x12\x77\x9b\x7c\xc9\xda\xe8\xc7\xa7\x32\xe5\xe6\x35\x61\xab\xaf\x0b\xb5\x94\x28\x29\xe6\xdc\x13\x8f\xec\x7a\x80\x14\x28\xdd\x63\x62\x0a\xc3\x79\x95\x8f\xfd\x35\xc0\x28\x8d\xfe\x14\xea\xdb\x4e\xf4\x11\xd5\x3e\x12\x40\x1f\x6f\xe3\xcf\x37\x34\x96\xda\x04\x81\x61\x70\x78\xb8\x29\x2c\x33\xc0\xa5\xc1\x4c\x49\x36\x24\x26\x8c\x17\xe4\x7c\x72\x9c\x58\xe4\xf8\xc5\x65\x83\x32\xbc\x57\x0b\x05\x7b\x3e\xf0\x51\xa2\x63\x18\x30\x03\x9d\x33\x65\x30\x08\xa1\x57\x11\x77\xc6\x7c\x81\x7e\x8f\xb6\x65\x17\x31\xdf\x51\xa9\xde\x59\xf4\xc8\x03\x4c\xc9\xbe\xb7\x05\xf7\x20\x3d\xf2\x25\x58\xdc\x9b\x54\x94\xda\xc4\x41\x34\xaa\xb3\x44\x1d\x44\x91\xb7\xd8\x6f\x4e\x14\xa9\x79\x25\x49\xb0\xe4\x2b\x2c\xfc\x34\xba\xae\xde\xa4\x39\xf5\x6a\x40\x92\x5d\xa9\xc5\x03\x78\x9c\xd4\x46\xf7\x5e\xab\xb4\xf7\xfc\xda\x89\xe1\x59\x12\xdf\xbe\x65\xd6\xa7\xcb\x8d\xc8\xd3\xfb\x5e\x6f\x5d\x12\xab\xa1\x53\xea\x23\x6b\x8b\x5c\x37\xfd\x69\xea\xa3\xea\x38\x7d\x51\x8c\xde\xdb\x29\xa1\xc4\x6b\xda\x33\xfe\x97\x8a\x0a\x87\x98\x2d\xbb\xa0\x39\x3a\x15\xc3\xdd\x07\xed\x00\x80\x46\x97\x35\x3b\x7d\x78\x63\xcd\xb3\x07\x6c\x10\x6c\xfe\xa4\xfe\xd4\x01\x09\x60\xb0\x7e\xc2\x85\x0a\xa4\x2b\xc2\xa1\xbd\x6e\x6a\x6c\x8b\x6a\x48\xb8\x25\x9f\xfe\xd3\xb1\x00\xe1\x35\xbd\x61\x40\x1f\xaa\x75\xb2\xbd\x3d\x3d\xe5\x3c\x50\xe7\x71\xa4\xad\x28\xc9\x8b\x63\xfe\xe0\x91\x86\xd5\x86\xc7\xc1\x50\xd5\x96\xc3\x93\x7a\xa9\x12\xfa\x40\x09\xe1\x05\xc5\x03\xb2\xd7\xfb\xa1\xc3\x12\x29\xdc\xcf\xcd\xd2\xcb\x9b\x0c\x47\xc8\xfa\xde\xf8\x5c\x71\xf3\x40\x5c\x97\xcd\x96\x45\x55\xa7\x58\x57\x8a\x18\xda\xe6\x84\x3f\x07\xf4\x64\x29\x5c\xa5\x9e\x95\x85\xd9\x1c\x50\xa8\x20\x05\xe6\x8b\xfc\x3c\xbb\x9a\x2c\xbe\xc3\x2c\xd0\x24\xe0\x81\x79\xc5\x6c\xaf\xc9\x91\xf9\x40\xd5\x82\x88\x4d\x32\x09\xb8\xf1\xfb\x6c\x3c\x2e\xa6\x6f\x55\xc2\x2e\x25\x7c\x66\x36\xab\xe0\xfe\x79\x92\xa4\x18\xa6\x1d\x32\xd0\xaa\x5c\xe9\x45\x92\x92\xbe\x9c\x95\x97\xd9\x42\xfb\x85\xba\x13\x3b\x85\x4f\xf7\xad\xa3\xf3\x5b\xb2\x45\xd6\x9e\x69\xbc\xd5\xdd\xc4\x8d\x16\xb7\x20\x0a\x5a\xd8\x7d\xc6\x9b\x37\xa3\x0b\x25\x0f\xdf\xbc\x81\xd9\x8a\x59\x7d\xfa\x93\x86\x25\x8e\x29\x47\x8d\xed\x7c\xd5\xf5\xa0\x42\x07\x2a\x2d\x00\x4c\xdf\xdc\xb1\x0c\x02\x1c\x50\x19\xf9\xa9\xcd\x7f\x94\xe4\xd3\x0c\xdd\xb0\xa9\xf0\x78\x76\x99\x15\xd0\xdb\x43\xd6\x04\xa7\x9b\x6e\x5b\x13\x31\xde\xb8\x2e\x19\x49\x5b\x8b\xc6\xd8\x85\x1a\xd3\x28\xe8\x96\xa8\x30\x6c\x4d\x9c\x6f\x6b\xb7\x83\xa0\x3b\xbd\x01\x4c\xb9\x2e\x76\xd4\x90\xb5\x47\x15\xfe\x34\x25\x3f\x3c\xf8\xad\xa6\x2b\xb8\xdf\xf5\xd4\xca\x57\xe5\x4a\x21\xe8\xbc\x85\xfd\xa8\xee\xb2\x02\x82\x5e\x2c\x1d\xbc\xe7\x00\x19\x1a\x34\x1d\xe5\x75\x66\x4a\xe5\x56\x48\xa9\x8c\xff\xf3\x1f\x06\xf6\x52\x1b\x3f\xb8\xa3\x3a\x35\xa4\x72\xba\xbd\x78\x5d\xe3\x86\xa5\x81\xfc\x79\x3e\x36\x61\xf5\x02\x30\xb3\x72\x0c\xf8\x46\xe0\x98\xee\xbd\x86\x14\x9c\x08\xd6\xe8\x24\x66\x51\x3f\xc1\xf8\x53\x6c\xce\x50\x3d\xeb\x3f\x23\xb9\xab\x84\xd8\xd1\x7a\x8e\x02\x15\x7f\x80\xef\xae\x25\xa8\x7e\xd1\x44\x8e\x80\x25\x1f\x8e\x01\x3e\xbe\xa3\x8b\xda\xae\xe1\xc3\x06\x96\xfa\x8a\x05\x94\xdc\xec\x76\x20\x31\xa4\xba\x01\xa7\x5f\x70\x84\xff\x24\x65\xa0\x5a\x4f\xa8\x7f\x7a\x94\x2d\x60\x10\x3a\x9d\xc6\x12\x78\xce\xe2\xcd\x2c\xa8\xc5\xb9\x85\x6a\xe8\xf9\xad\x61\xf6\xb1\x94\xed\x97\x1b\xbf\xa0\x9c\x3e\x08\xc2\x61\x34\x79\xd4\x2a\x9e\xad\x74\x1d\x67\xeb\xc2\xf5\x4d\x53\x35\x2a\xd5\xd4\xb4\x29\x57\x15\x6f\x61\x09\x35\x02\x17\x3d\xa9\x66\xf3\x0e\x08\x1e\x9e\x36\xc9\xcf\x17\x60\x27\xdd\x4e\xd5\x44\x83\x27\x23\xe0\x7f\xf0\x48\x03\x3c\x06\xb1\x23\x75\x73\x5e\xef\x6c\xb6\x58\xcc\x2e\x03\x70\xd0\x84\x67\x2d\xe0\x7c\x26\x05\xbf\x89\x3d\xdd\x59\x76\x74\xa0\xe9\x0e\x70\xf5\x72\x07\xd3\x76\x20\x11\x7f\xae\x76\x3a\x42\x49\x54\x3d\xd4\xfc\x32\x86\xf2\xd8\xd3\x4f\x14\xc7\xa9\x9d\xee\x30\xbf\xc4\xed\xed\xe0\x69\xaa\x7e\xd9\x29\x03\x55\xb6\xb3\x29\x84\xff\x01\xee\xba\x2c\xc6\xe3\x89\x60\x8e\x84\xb1\xaa\x81\x0d\x25\xf1\x86\x32\xce\x07\xfe\x02\x1e\xb6\xf8\xd8\x5b\x96\xe0\x46\xf8\xf0\x2b\x57\x9e\x82\xd5\xfc\x54\x57\xbe\xf9\xc2\x40\x03\xd5\x7e\x36\x54\x5b\x59\xaa\x2d\x2d\xd5\x56\x8e\x6a\xcb\x66\xaa\x75\x06\xbb\x3b\xf5\x24\xe2\x34\x05\x8b\x1d\xd0\x94\x4c\x78\x6d\x89\x56\x47\xa3\xbe\x4f\xd1\xaf\x86\x3f\xf9\x44\xfb\xaa\x0d\xd1\xec\x2f\x3b\x65\x09\x87\xd5\x4e\xdf\xd4\x15\x42\x90\x8b\x02\x33\xd3\x74\x8d\xd4\xd6\x60\xd2\x94\x95\x77\xd3\x9d\x2a\xc0\x04\x19\xf6\x36\x6a\x4e\x54\x4f\x59\xf5\x75\x6d\xa3\x57\x3e\x2d\xa0\x48\xa2\xcf\xb3\xa9\xa7\x7e\x63\x60\x77\xa3\x2e\xa4\xfa\x81\xa2\xa5\x2b\xdd\x15\x77\xef\xe1\x3f\xab\x94\x58\xdd\xc3\x2a\x38\x63\x5f\x03\x36\x01\x8a\x21\x67\x4b\xc1\x16\x1a\x6b\xc0\xc3\x16\xdb\x61\x1d\xb6\x5e\xdb\x6b\x67\x01\x2c\xaf\xda\xbd\x80\xcf\x89\xbe\xed\x2e\x01\x8c\x72\x86\x93\xa2\xb5\x00\x86\x56\x53\x90\x2b\x85\x1e\xaf\xb5\x0d\xa7\x35\x96\x6a\x98\xa9\x03\xa3\x08\xdf\x22\xd6\x09\xd4\x34\x90\x0d\x18\x3f\xae\x12\xb4\xa1\xdb\x3c\x72\x8d\x5a\x15\x7b\xf3\x56\xa9\xaa\x69\xc5\x02\x5a\x82\x5b\x13\x93\x40\xa4\xa9\x83\x6e\x89\x77\xfb\x3b\xc9\x61\xad\x3a\xdf\x0a\x63\xa3\xcd\x46\xb4\xec\x35\x31\x69\x84\xe2\x68\x6d\x7b\xfe\x4e\xc0\xd6\x6f\x8d\x8d\xdd\x2f\xdc\x22\x4e\x8e\xad\xce\xf1\xb1\x00\xdb\x8d\xa1\x50\xb4\x6f\x87\x83\xd8\xdf\x24\x52\x5b\xdf\x00\x8b\xd7\xf5\xd1\x7a\x9a\x3d\xee\x34\x8e\x53\x16\xaa\x9a\x49\x47\x67\xbe\x94\x9b\xbd\x2d\x8b\x99\xbf\xe7\xdb\xb2\xcd\xe8\x47\x38\x5b\x75\xc1\x87\xbf\x39\x2d\x37\x44\xbb\x79\x6a\x7a\x7d\xba\xc5\x0c\xe5\x10\x6a\x49\xd5\x7e\x78\xdd\x16\xfa\x76\x5c\xa6\xeb\x73\x2e\x73\x20\x37\xc0\xe3\xf5\xd5\xd9\xb8\xf8\x50\x8c\xa3\x7e\x43\xf5\x81\xd0\xc0\xee\xe9\xc3\xf4\xda\x12\x41\x0a\x62\x22\x2a\x71\xda\x6c\x3f\x26\xe5\xcc\xa1\x80\x52\x6d\x41\x43\xa6\x36\x8a\xb7\x17\x0b\xfb\x45\xb5\xed\x27\xa8\xd4\xea\xe3\x41\xe4\xfc\xc6\x6a\xbe\xfc\x9e\x35\xbe\x91\x6b\x2d\x4f\xee\x96\x34\x69\x54\xee\xfa\x43\x3f\xba\x4a\x43\xd7\x3e\xe0\x83\x08\xc3\xee\x38\x88\xa2\x88\xb5\xd1\x07\x12\x5f\x79\x2e\x2a\x7a\x27\xab\xfb\x61\x08\xa6\x42\x55\xef\x50\x35\xad\xea\x51\x34\xd9\x61\xcf\xb8\x96\xda\xcb\x24\x31\xec\x7f\xe6\xd8\xe3\xbb\xbd\x77\xc7\x7e\xd5\x8c\x3d\x85\x9b\x89\xe2\xbf\xb2\xf8\x87\xd8\x6b\x63\xd5\x59\x79\x55\x5d\xd4\x59\xab\xdc\x71\xf5\x1b\xfc\xf9\x85\x39\xb3\xc6\x5a\x4a\x9d\xc5\xbf\xf6\xfc\x1a\xbf\xec\x0f\xd0\x8d\xe1\x51\x15\x6b\x5a\x5a\xd9\x5f\xcb\x3f\x2d\xb5\xe3\x1c\x3e\x07\x88\xb6\xa8\x55\x24\x4d\x97\xfb\x02\x77\xbc\xb6\x88\xf9\x5c\xbe\x9c\x64\x97\x78\x9c\x8b\xcf\xec\xac\xe4\x67\x99\xc3\x85\x7e\x16\x2e\x07\x91\xfa\x81\x52\xed\xe3\x44\x76\x0c\x31\xf7\x8e\xe6\x2d\xb3\x5f\xc0\x77\x42\xf2\x72\x1b\x69\x86\x7b\x76\xa5\x2a\xb9\xed\xc4\xf6\x75\x7e\xf6\xbe\x58\x6c\x2f\xb2\xf9\xf6\x85\x9a\x2d\x13\x98\x31\xdb\xa3\xd9\x84\x76\x60\xe5\xdb\xb3\x4c\x0d\x2a\xfe\x5f\xaf\x83\x0e\x00\x9d\xcb\xd9\x55\x95\x43\x94\xa6\x81\xa1\xb1\xa3\x3c\x95\x58\xcc\xae\x46\xf4\x1d\x2b\x22\x37\xf2\x67\xd9\xe8\x3d\x9c\xa9\x4e\xc7\x81\xad\xc2\x65\x49\x7b\x85\x03\xe0\x4a\x04\xf6\x8a\x52\x81\x09\xed\x15\x02\xa4\x26\xc1\x87\xa2\x2a\xce\x8a\x09\x99\x6a\x3a\x17\x6a\xcf\x99\x4f\x5d\xee\xe8\xaa\xac\x88\x16\x18\x18\xed\x22\x2b\x4a\xbe\xb7\x92\x18\xe7\xc8\x13\x12\xdb\x96\x98\xd9\xaa\x41\xbb\x60\x7f\xf2\xcd\x1f\xc4\x50\x01\xc5\x28\xd9\xb4\xaf\xb9\xae\xcf\xcd\x74\xc2\x8b\x1d\xa3\x11\x92\xf5\xcb\xda\xb9\xc2\x7c\x0f\xfd\xb7\x01\xee\x75\x9b\x12\x23\x1e\x34\xb2\xf8\x8a\x32\x53\xff\xc3\xae\xae\x01\xc4\xe7\xce\x4b\xac\x73\xc2\x1d\x5e\x6e\x6a\x48\xbc\x5c\x0f\xf9\xc9\x49\x7e\x7d\xfa\xdf\x9e\x0c\x16\x79\xb5\x80\x22\x9f\x42\x94\xb8\x43\x71\x54\x4b\xf0\x11\xe0\xaa\x05\xc0\x7f\x07\x13\x7e\x5b\x80\xd7\xc5\x78\x01\x93\xe4\xc0\x24\x5c\xe4\x30\x0d\x29\xa5\x91\x4b\x83\xd1\xd2\xa5\xc1\xa1\x67\x92\xad\xcc\xc4\xa3\x40\x26\x5d\xc0\xa3\x33\x9d\x4d\xf3\x8e\xc6\xc5\xe3\xaa\xb7\x35\xe6\xcd\xb7\x4a\x74\xba\x99\x53\x53\xc8\x15\x80\x38\x65\xb0\xa9\x94\x9b\xe3\xa5\x47\xa8\xa8\xf1\x52\x9e\x70\xfa\x6d\xb2\x01\x35\x96\x09\x9f\x84\xd6\x3c\xb1\xed\x8a\xc8\x93\x94\x71\x99\x5d\xff\xb5\xab\xbb\x1a\xdd\x8e\x02\xb6\xab\x36\xd8\xae\xda\x60\xbb\x8a\x60\x6b\xc7\xb7\x1d\xba\x3f\x37\xa2\x4b\x65\x82\x22\x72\x9f\xab\xd9\xe0\x83\xb7\xe5\xdc\x60\x8d\xc1\xba\xb0\x29\xa1\xc3\xb4\xd9\x79\x24\x00\x2c\x09\xb1\x54\x38\x68\x60\xc8\x69\xbd\x78\x72\x3f\x9e\xd5\xa1\x59\x43\x79\x6a\x71\xe8\x2d\xb4\x2c\xef\xdd\xa1\x5c\x75\x1d\x2d\x4c\xcb\xf1\x03\x1c\x8d\x15\x33\x1c\xf8\x27\x38\x41\x09\x74\x71\x88\xfa\xf5\xf9\xee\x89\x72\xd1\x65\xf3\xa1\xa7\xdd\xe3\xe5\x3a\x58\x7b\x5a\x2c\x7a\x6d\x51\x1a\x0e\x8a\x23\x51\x6c\x55\x53\xec\xdd\x51\x0c\x1a\x2b\xb0\x8c\xc2\x61\x05\x56\xb2\x00\x0d\x77\x57\x22\x49\x0e\x96\x87\x42\xd7\x12\x05\xe4\x79\xbb\x12\x70\xfa\x92\x06\x96\x3f\x5c\x4b\x04\x34\x91\x85\x17\x83\x3e\x2b\xcb\x6c\xd5\x35\x3c\x64\x46\x6b\x00\xcf\x0d\xaf\xea\x4a\xaf\xfc\xd2\xab\x5e\x94\x44\x96\x92\x3e\x65\xa5\xac\x86\xff\xfc\x5b\x18\x8b\xd0\x39\xc1\xa7\x7b\x8a\x8f\xa8\x2d\xe1\x72\xd2\x91\x57\xd4\x1f\x81\x14\xdf\x09\x5b\xc5\x8a\xd6\x8c\x85\x1c\x8d\x4e\x3f\xc8\xbe\x9c\x8d\x21\x5b\x6b\x05\x5e\xf6\x8d\xef\x36\xe1\x8d\x9c\xbb\xdc\x71\x4b\xde\x4d\xdb\xf1\x6e\xea\xf3\x6e\x0b\xce\x0b\xfa\xda\xd0\x53\xbf\x9f\x2d\xc0\xc3\x6e\xa1\x91\xad\x99\x18\x0e\xad\xa1\xd1\x06\x1a\xe7\x8d\xe7\xa5\xb2\xae\xbe\xd7\xfb\xda\xbe\x6f\x08\xd6\xeb\x75\xcc\x7b\xd2\xae\x29\xde\x86\xc5\x2c\x41\x7c\x35\x89\xea\xa5\xed\x76\x9b\x75\xfb\x62\xcd\x67\x27\x5b\x4f\x72\xa7\xac\xb9\xe3\x9e\x95\xcd\xfe\xf7\x4a\x66\xf7\x3a\xf1\x55\xd1\xeb\xc0\x5f\x63\x3d\xe0\x6a\xbd\xd3\x3f\x0c\x2a\x6c\xbd\x8e\x6d\x05\xfa\x83\xe9\x0b\x50\x46\xfb\x83\xea\x85\x50\x4a\x8d\xbe\x62\xe0\xa0\x0a\x10\x00\x8d\x62\xf9\x73\x3b\x2c\xf1\xd8\xa9\x2d\x96\xb9\xc6\xf2\x5a\x62\x69\xf5\x94\x15\x47\x33\x80\x7a\x13\xd9\xbe\x92\x17\x9f\xe7\xe8\x69\x5e\x44\x20\xcd\x01\x39\xf2\x47\xf7\x4a\x82\xe9\x0a\xdc\x81\x42\x1d\x83\xca\xf7\xfa\x31\xdd\x43\x3f\xd7\xc1\xb5\x0f\x6f\x17\x6c\x2a\x23\xf3\x91\xa5\x8b\xb5\x08\x5b\xa4\xab\xcb\x2e\xcb\xff\xab\x2a\xf0\xf0\xc9\xbf\x77\xa7\x7f\xaf\x7a\x86\xbd\x4c\x1e\x06\xd0\x59\xba\xb2\x3f\xeb\xb2\xf9\xdf\xaf\xe3\x65\xc1\x0b\xb3\xcc\xde\xbe\x0d\xdb\xc5\x5d\x53\xae\x36\x29\x66\xbc\xa8\xe4\x0f\x0a\xc4\xac\xcc\x99\x81\xe3\x0d\x24\xbf\xbe\x9a\xcf\x15\xe0\xca\x75\x67\x84\x1b\x32\x74\xd1\x79\x5b\x50\x44\xd9\x01\x6e\xc9\x5d\x91\xd9\xf9\x79\xe5\xde\xa1\x00\xca\x5f\x7b\x04\xb6\x97\x3e\xa9\x0a\x6d\xdb\xdf\xe7\x2b\xb1\xad\xd7\xdf\x36\xf3\x6a\xce\xb3\xae\xe6\x3d\x6e\x41\xb6\x83\xa6\xb4\x2a\xa5\xc8\x8e\x7f\x04\x1b\x40\x5e\xf1\x49\x7d\xed\x8c\x03\xb0\xd7\x94\xb6\x01\x48\x61\xd6\x03\xbe\xee\x18\xe9\xc4\x6e\x6b\x78\x42\xf7\xda\x19\x26\x9a\x20\x63\x01\xd6\x8b\x10\xb0\x9d\x24\xd6\x33\x53\xe9\x71\x6c\xc2\x3c\xee\xf4\x78\x96\x20\x80\x1e\x6e\xde\x63\x1a\x23\x7a\x50\xda\x4d\x6e\x35\x85\x6c\xc6\x91\x5f\x16\x9f\x96\x5e\x45\xca\x3a\x4b\x3a\x3b\xc3\x73\x3c\xe7\x29\xeb\xf8\x4e\xee\x93\xeb\x80\x37\xd5\x5c\xc2\x5b\x6d\x4f\xfe\x7d\xea\x67\x31\x54\x90\x7f\xd0\xfa\x65\xe5\x93\x42\x24\x5f\x0a\xd4\x99\x54\x80\xcc\x95\xc0\x35\x09\x7b\x26\xa8\xa0\x60\x35\x77\x5d\xc1\x8b\xf4\xd7\x72\x59\x36\x59\xfc\xf7\x5c\x6d\xd2\x68\x36\x90\x03\x85\x82\x31\xa8\x26\xc5\x88\x59\x31\xde\xd6\x9b\xc1\x70\x1f\xdc\x8b\x2f\x53\xc1\x2e\x5a\x6c\x96\xdd\x44\xea\x9c\xcd\xc6\xab\x88\xcd\x86\xcf\x77\x99\xe7\x7c\x61\x82\xf5\xb8\x56\x45\x70\x2b\xb1\xe5\x67\xd7\x43\x2b\x75\xf5\x6c\xed\xfa\x77\x44\x2c\xc9\x54\x81\x97\x78\x5f\xe4\x38\xd9\xdd\x09\x5d\x14\x1f\xc6\x18\x18\xfe\xb3\x24\x0e\x35\x62\x37\xb2\xdb\xc7\x6c\x29\x8b\x16\x4a\xb1\xd0\xaa\xa6\x10\x13\x96\xe2\x08\xfc\x46\x6c\xb6\x48\x30\x7e\x5f\x92\x01\x98\x4e\x07\xba\x31\x3d\x25\x42\x9c\xab\x79\x4b\xd2\x80\xf8\x76\xe8\x1c\x27\x1e\xad\x5c\x9f\xb7\xea\xfa\xec\x7a\xbc\x55\xd7\x63\xd6\xdf\xe1\xd1\xfd\xf4\x91\x31\x87\x27\x0d\xcc\x03\xf9\xe1\x4a\x01\xc5\xf1\x65\xca\x6c\x52\x79\xf6\x1a\x12\x02\xb2\xef\xf6\x7d\x7c\xd5\x2f\xca\x3f\x19\x86\xef\x57\xeb\x8e\xeb\x02\x69\xe4\x21\xeb\x46\x8e\x8b\xce\x73\xc9\x92\x58\x9b\xf8\x92\x89\x80\x93\xa4\xcb\x84\xec\x16\x1b\x1c\xfd\x70\x56\x77\xc5\xb3\x57\x32\x3b\x89\xb3\xad\x90\x5a\x5b\x5d\x4b\x81\x4f\x74\xbb\xa0\x05\xd5\x32\xbc\x1b\x7d\x53\x33\x65\x35\x53\xaf\xa6\x96\x73\x35\xf3\x4d\xd2\xce\x29\x2d\x8a\x5b\x61\x14\x53\x6a\x00\x1f\x8e\x1f\xf6\x7c\xa3\xa4\xd1\x6e\x79\x73\x66\xec\xe1\x88\x62\x5d\x33\x3f\x07\xcd\xac\xc0\xad\x31\xd6\xcc\xcf\xb7\x68\x06\xcb\xc4\x80\x79\xb0\x6e\xb7\x35\xb2\x73\xed\x53\x6d\x4c\x4f\xd6\x6e\x97\x6a\x27\x99\xa0\x81\xf6\x0c\x2e\xfc\xf9\xd6\xe0\x98\x09\xfa\x26\x58\xa9\x8c\xb5\x0f\x1e\x7c\xb4\x9f\xa9\xfa\x9c\xcf\xec\x7d\x27\xcd\x47\xf0\x2a\x7e\x6e\x6c\x05\x85\xea\x84\xb1\x1c\x38\xb3\x9a\x79\x67\x27\x67\x5a\x7a\x6e\x58\x5d\xcd\x72\x38\xa1\xba\xcc\x96\x9e\x7d\x2b\x3a\xfb\x14\x76\x4a\x4c\x1b\x2c\x84\x2d\x32\x85\x9c\x8a\xfc\xc3\xc2\x02\x6e\x44\x2f\x51\x2d\xed\x22\xaa\x74\x0e\x76\xa8\xcf\xc7\xc0\x00\x6d\x5d\x5f\xe1\xc5\x4b\xfa\x28\xa6\x5d\x7c\xf6\x12\x67\x48\x71\x4a\x4f\x5f\xe9\x8f\x36\x38\x2b\x68\xd0\x20\xb4\xbb\xe5\x70\xef\xa1\x73\xda\x2f\x79\xe3\x66\x1d\x80\x1a\x41\xc2\x48\x5f\x8f\x24\x3c\xf5\xa2\xe7\x6f\x01\x64\x56\xe9\x3d\xc1\xa3\xf4\x38\xbf\x86\xf4\x09\xe6\x7b\xd2\x8b\xd0\x55\x19\x52\x6c\x10\xd9\x62\x94\x8f\xe0\x6d\xa0\x44\x8b\xd7\xcc\x32\xcb\x11\xc9\x43\x6c\xde\xd9\x46\x81\x63\x20\x2d\x5b\x86\xa2\x58\x71\x77\xd4\x34\x46\x38\xf9\xa6\x1f\x5f\x47\x70\x6d\x06\x3d\x76\x4d\x1f\x4b\xe6\x74\xf7\x87\xa3\x22\x23\xbe\xf0\xe5\xe8\x40\xe7\x90\x8f\xa8\x4a\x8d\xea\xa0\x3e\x15\x6d\xa5\x0d\xb6\x3d\x53\x59\xaf\x28\x7a\x15\xea\xf6\x31\x14\x7e\x27\xb6\x85\x71\x39\xe1\xbe\xca\xcb\xe3\x5b\x2a\x97\xe5\x6f\xfa\x44\x8e\xdf\x10\xeb\x9a\xdb\xb2\x72\x02\x47\x04\x74\xad\x89\xe9\x26\x7a\xef\x96\x68\xbb\xe4\x87\x14\xbf\xb4\xf5\x74\xb1\x3c\x04\xd5\x7f\x31\x1f\xcd\x87\xef\x0f\x97\xc9\x27\x9f\x24\x69\xf2\xf7\xe4\xe1\xca\xf7\x55\xc2\x82\xc2\xe2\x45\xd8\xad\x6e\x85\x9d\x35\xb0\xaf\x7e\x5b\xec\x46\xda\xf5\xe0\x16\xf4\x43\xcb\x85\x62\xe8\x13\x2d\xaf\xad\x23\xc3\x29\x88\x70\x70\x24\x34\xf2\x7c\xc5\x85\x3b\x9f\xf4\x78\xd4\x87\x70\x7a\xce\x29\xe2\xe1\xc3\x5f\x68\xc3\xc8\x13\x52\x73\xf1\x49\x9f\x0e\xf2\xd2\x2c\x47\xc1\xe1\xd5\x5a\x12\xc1\x2e\x98\x31\x2a\xe0\x31\xc3\x90\x9c\xe8\xc9\x2f\xa6\x9f\x2c\x8e\x9a\x49\x24\x77\x0e\x11\x39\x29\x24\x61\x60\x21\x1f\x3a\x2d\x92\x4a\x20\x3d\xd0\x41\x5c\x26\xa7\x31\x95\xb0\x1e\x58\x00\x26\xd8\x59\x21\x6e\x83\x62\xfa\x21\x2f\x95\x36\x4f\x75\xf5\x67\x77\x09\x2f\x72\x53\x6d\x9b\x94\xf6\x22\xf5\x53\xb5\x92\xa9\xc2\x78\x25\x10\x29\x87\x60\x52\x5d\x79\xd1\x66\xf5\x59\x85\x24\x5b\x35\x91\x6c\x35\xf4\x0f\x65\x88\x85\xd2\x20\xb9\x05\xc9\x38\xb0\x00\x4c\x94\x64\x2b\x4b\x32\xaa\x6b\xe8\xb3\x02\x92\x51\x6d\x9b\x14\x23\xd9\x0a\x48\xb6\xd2\x24\x43\x26\x43\x30\xa9\xae\xbc\x96\x64\xe1\x94\x3c\x41\xca\xaf\xd0\x19\xe9\x84\x78\x37\x55\x13\xd3\x4c\xcd\x13\xcd\xd2\x98\xb0\x82\x6a\x27\x9a\xb9\xdd\xce\xe6\x86\x4f\x52\x4e\x70\x1c\xcf\x5f\x1c\x33\xfd\x22\x68\xa2\x87\x8f\x06\x7d\xc8\x58\x2e\x15\xdb\x3f\x5f\x17\x70\x18\x49\x50\x3e\x37\x72\x36\x94\xfc\xb7\x19\xef\x61\xe9\x21\x28\x32\x6c\x1b\xa8\x74\x1c\x55\xee\xe1\xb1\xd8\x0d\x72\x9f\x2f\x1f\x47\x4e\x23\xc1\xb3\x2b\x47\xa3\x55\x9c\x46\x4b\xc3\x2c\x43\x54\xe5\x89\x4b\x52\x51\xcc\x57\xa5\xc2\x31\x8a\xb3\x1f\xe7\x3b\xc9\x70\x9b\x31\x1b\x96\x46\x1a\xad\x04\x8d\x56\x29\x4f\x03\x1a\x71\x1f\xb8\x3a\x3e\x5a\xbb\x12\xe5\x99\x88\x65\xed\x2d\x44\x42\x8f\x12\xec\xd8\xca\x27\xaf\x9e\xf3\x9a\xce\x72\x5b\xe2\x6e\x1e\x06\xaa\xf7\x72\x7d\xf8\x10\x27\x27\xe3\xb5\x63\xce\x65\x40\xd5\x87\x0f\x71\x22\xae\x44\x11\x5f\xea\x78\x8f\xfa\xee\x2a\xc5\xf3\xac\x50\xda\xac\xf6\x6b\x44\x95\x4a\x29\xa8\x33\xed\xee\xe3\x3b\xca\x32\x77\x28\xeb\x77\x31\x55\x0a\xd7\xb4\xda\xd6\x1a\x2c\xed\x89\x41\x09\xcb\xaf\x65\x5a\x15\x29\x77\x1d\x29\x37\x85\xc4\xe9\x75\x95\x7b\xc9\x00\x73\x9a\x57\x3e\xd4\x3c\x5a\xba\xba\xf6\x4a\xd7\x75\xe6\x07\xab\x12\x81\xd0\xeb\x4c\xd1\x3d\x0e\xfe\x41\x45\xfd\x1a\x8d\xb7\xf4\x2f\xa5\xd2\xbf\xd7\x1d\x12\x8c\x54\xd4\x7e\x4d\xa9\x22\x7e\x69\xab\xb4\x79\xac\xaa\xb8\xcc\xdf\x9c\x1b\xef\x7d\x9d\x30\xe0\x09\x18\x19\x37\x7f\x93\x4f\xff\xfc\x1a\x2f\xfb\x93\x63\x7e\x1c\xc4\x9f\x17\x23\x07\x45\xa7\x0d\xae\x16\xa3\x78\xe9\xaf\xab\x59\x50\x5a\x41\xe8\x76\x3e\xfa\x79\xfb\xa3\xcb\xed\x8f\xc6\x3f\x7e\xf4\xd5\xe1\x47\xdf\x1e\x7e\xf4\x7a\xf0\xd1\x37\xff\x46\x03\xef\xc1\x2e\x10\x04\x3e\x14\x38\x77\xd1\x94\x66\x5f\xbf\xfe\x8e\x62\x93\x02\xe3\x6d\x41\x58\x94\x2f\xf0\xf8\x74\x67\x38\x1c\x6e\x0f\x53\xf5\xff\x3f\x0e\x87\x87\xf8\xff\x03\x95\xa4\x60\xeb\x58\x04\x02\xb9\x57\x19\x46\x08\x38\x0c\x73\x00\x13\x11\x70\x26\x52\xaf\x8b\x8e\x48\x5e\x1c\x4d\x40\x94\xa1\xd7\x65\xce\xbf\x51\x20\x10\x02\x52\xc6\x6e\xa4\xa0\xbf\xdc\x27\x58\x3b\xa2\xd9\x5e\x56\x2e\x2a\xab\x6d\xb8\xa8\x5e\x65\xaf\x34\x46\x9f\xd2\xf5\xe7\x43\xac\x68\x27\x53\x1d\x02\x8b\x99\xa6\xa4\x3f\x52\xaa\x88\xcd\x64\x00\xd4\x66\x6f\x34\x9b\x8e\x59\x71\xdc\x64\x7e\xc8\x26\xce\xab\x2a\x42\x19\x1d\xba\x06\x72\xba\x68\x6a\x38\x9f\xcc\x66\x25\x96\x4c\x9e\x24\x69\xbe\xdb\x4b\x1e\xe3\x1f\x44\x98\x9f\x98\x63\x00\x7d\x69\xa7\xd5\x77\x4c\x17\x3f\xaa\xe6\xb1\x00\x04\x6d\xc5\x0f\x30\x87\x30\xf0\xa6\x5a\x3d\xe8\xd8\x00\x2a\x60\xaf\xb1\x93\xfa\x91\xcf\x9b\x5e\xd8\xff\x8a\xcd\x26\x4a\x19\x58\x77\x40\xaf\x24\x4c\x90\xb0\xb4\x4a\x0c\x6b\x5c\x16\xd3\xab\x45\x7e\xbf\xb4\x3d\xc8\xf7\x80\x00\xf0\xe7\x37\xa2\x6d\x1d\xe8\x1a\xda\x7e\x8b\x9d\x8c\xd2\x96\xfa\xcf\x69\x4b\x29\x75\x94\xf2\x69\xab\x4b\x47\x69\x7b\x31\xbb\x2a\x5b\x53\xd6\x44\x6c\xfa\x65\x36\xc5\xe1\x60\x74\x80\xa4\xef\xb0\xef\x78\x97\xf1\x60\x78\x54\x37\x16\x91\xc1\xd8\x3d\xc8\xf7\x93\x6d\x0b\xba\xa7\xc3\x0e\xd1\xef\xc7\x98\xfd\x5b\x8d\x52\x2d\xec\x9a\x61\xfa\x4a\xd1\x2b\x3a\x48\x40\x48\x3e\x44\xf0\x1d\x27\xb7\x3f\x3c\x58\x32\xce\xf8\xb3\x29\xde\xe3\x6f\x37\x3a\xd6\x35\x97\x2a\x8f\xb3\x55\x97\x79\x85\x1a\xda\xa0\xb0\x4c\xa5\x9c\xb4\x22\xb1\x25\x7d\xbf\x05\xbc\x2c\x81\xe9\x0b\x28\xac\x4b\x6f\xc2\xf5\x54\x37\xc2\xf3\x90\x21\x58\x1e\x12\x6a\x48\x14\x30\x3c\x96\x15\x24\x0d\xd6\x2d\x34\xc9\x77\x29\xec\x49\x3f\xb9\xcc\x17\x17\xb3\x31\x84\x5e\xa4\xab\xfe\x1a\x5b\x17\xdb\x05\x4b\x2f\x03\x45\x50\x87\x4d\x59\x0a\x6f\x18\x0a\x0a\x42\x4a\x7c\x12\xbf\xb6\xc5\x42\xcc\x59\x64\x70\x64\x08\xa0\xdd\x91\xf7\xa4\xd7\x15\x41\x1e\x1b\xdd\x76\xf3\x0b\x61\x1a\xbc\x09\x1e\x82\x8f\xc3\x07\x48\xd8\x1d\x86\x2c\x1d\x3e\xdf\xef\x6e\xc0\xfa\x5e\x61\x70\x61\xec\x5b\xa4\xa9\x36\x3d\xf7\x13\x1d\x00\x87\x1b\x62\xaa\x79\x36\xad\x3f\xba\xb0\x2e\x43\x58\xec\x09\x01\xa0\x58\x89\x4a\x53\x3e\x2b\x2a\xed\xcf\xe2\x90\x7f\xbd\xc8\xf1\x39\x21\x3a\xe2\xf4\xb0\x2d\x40\x01\x0f\x8b\x9b\x7b\x6a\xb0\x8b\xd6\x5c\x30\x58\x21\x4f\x98\x23\x9c\x37\x44\x06\xb8\xbd\x47\xa7\x39\x84\x23\xd2\xae\xd1\x85\x0d\x42\x27\xed\xa6\xfb\x4a\xc4\x1c\xd8\x1d\x48\xcf\x10\xe2\x64\x87\xf6\xef\x0f\x0b\x6c\x5a\x20\xf6\x6d\x31\x99\x14\x7a\x9d\x5c\x8b\x87\x0f\x50\x77\xe2\x44\x93\xef\x49\xa4\xcf\x27\x05\x5e\xcf\x54\x1b\xc7\x58\xde\xa9\xaa\xa3\x2b\x7f\x9a\x60\x49\x05\xd5\x9c\xc6\x70\x0e\x9f\x16\x23\xa1\xa4\x19\xf1\xd4\x4f\xaa\xf7\xc5\x5c\x0e\xb5\xe5\x59\xce\xc2\xdd\x1e\x3b\xde\x32\xdd\xa4\x2d\x52\x97\x4a\xf4\xcc\xd4\x4c\xf4\xa3\x2d\x0a\x3c\x0b\x65\x13\x61\xb3\x74\x88\x21\x71\x28\xe2\x30\xab\x72\xac\xf6\x03\x57\x97\x67\x79\xd9\xc1\x00\x51\x61\x45\x53\x56\x78\xf6\x50\xe3\x3d\x06\x48\xe3\x83\x1c\x0a\xdd\x74\x29\x6e\xaf\xef\xc4\x86\x2a\x30\xcf\xc7\x42\x02\x32\x06\x79\xc8\x15\x54\x85\xd5\x43\xd3\x0c\xc9\x2d\x2d\x83\x43\x21\xb1\x85\xa2\x7e\x0b\x83\xcb\x20\xa9\xbd\x6b\xbd\x37\x91\x79\x6a\x48\x6e\xb9\x09\x46\x4f\x53\x59\xf7\xe4\x85\x1a\xe9\x4f\x19\x96\xb8\x56\x1e\xc6\xe5\x38\xfd\xa7\x63\x7c\xf1\x6e\xb2\x81\x62\x8b\x3c\xbc\x11\x2a\xd7\x27\xd6\x1d\xcc\x50\x6c\xe6\x5d\x7f\x10\x4b\x93\xee\x98\x3b\xe3\x1d\xe5\xc5\xe4\x2e\xb8\x41\xfd\xf5\xa8\x39\x4a\xaf\xc7\xcd\x10\x1f\x66\x8b\xe1\xa5\x98\xf8\x0e\xee\xd2\x37\xcd\x9b\xba\xe9\x21\xa7\xd1\x6f\x32\x4d\xa2\xf5\x6c\xcf\x50\x74\x09\x76\x25\xbb\x23\x63\x72\x48\x74\xb4\x30\xe4\xd1\xcc\x76\x7a\xf7\x69\x66\xaf\x7f\x8b\x49\xc3\x56\x90\xc8\x78\xba\xb5\xc6\x4d\x1f\x08\x76\xae\x7a\x0b\x62\x0e\x07\xa0\x66\xcc\xc2\xdb\xfe\xc1\x7a\x7e\x6e\xad\x04\x5e\x7d\x88\x10\xd6\x58\x33\xa6\x96\xe8\xb8\x62\xa1\x76\x12\x37\x1e\x89\x55\xe2\x07\x32\x24\x69\x37\x05\x4a\x8b\xde\x18\xf6\x08\xb4\x88\xec\xa2\x74\x86\xa9\xcd\x4d\x1a\x6e\xdd\x40\x93\x8d\xda\x4f\xf6\x93\x7d\xf8\x27\xc5\x7f\x77\xf3\xbd\x3e\x6c\x84\xe0\xd7\x7e\x3f\x79\x0e\xff\xa4\xcf\xe0\x5f\xd0\xbb\x81\x0b\xf1\x63\x27\xc5\xaf\xbd\xdd\x1d\xf8\xf3\xec\x60\x0f\xf3\x9e\xee\x60\xe6\xc1\x70\x8f\x0a\xed\x3f\xdf\xc9\x0f\xfa\xc9\xd3\xa7\x4f\x0f\xe0\xaf\x5e\x59\x43\xbb\x0e\xe2\xf4\x0d\xd8\x6f\x88\x77\x8d\x35\x49\x6e\x35\x55\x03\x64\x26\xf2\x93\xf7\xe3\xc9\x69\x4d\xfa\xee\x50\xa6\xd3\x66\x2b\x80\x6e\x92\xf7\x6b\x4a\xd7\xa4\xfb\xd0\x61\xaf\x10\xc0\xa6\xc4\xdd\x58\xe2\x41\xb4\xfa\x8e\x4c\x1d\x43\xe0\xd8\x34\x92\xe6\x95\xbb\xce\xf3\xf7\x61\xc7\x40\xd7\xae\x4b\xf5\x70\x22\xbd\x0a\x4f\x2e\xea\x07\xed\x4b\xcf\x2c\x67\x8c\x5e\x97\x57\x93\x45\xd1\x45\xb3\xe0\xe0\xa3\x6f\xa2\xd7\x07\xcc\x54\xa0\xfd\xb4\xd3\xa1\xf4\x06\x43\x9b\x05\x0f\x3f\x7a\xbd\xb6\xf6\xeb\x58\xc5\x8f\xbe\x3e\xfc\xe8\xdb\x16\x0d\xf3\x8d\xbc\xad\x9a\x7c\x34\x5f\x5b\x95\x6f\x2e\x4d\xc5\x2c\xf9\x68\xbc\xb6\xe2\x17\x19\x78\x23\x80\xf3\x22\x7d\x2d\x60\xc7\xfb\xf0\x98\xa2\x46\x5a\x50\x67\xed\x40\xc5\x2b\x7f\xbe\xbe\xe3\x6c\x2f\x67\x6a\xfd\xdc\xd1\xaf\xe3\x5c\xe5\x30\xea\xbd\xe8\xb0\xf3\xa1\xb2\x76\x6c\xbd\x7a\x30\x0b\x60\x56\x82\xb7\xd3\x62\x06\xcf\x59\x2b\x89\x13\x11\xa1\x7a\x05\xc0\x8d\x3e\xae\xef\x58\x49\xa9\xb3\x54\xfe\x31\xfe\xed\x27\x5b\x0c\x48\xe3\x0e\x48\xab\x1b\x5a\x0f\x62\x57\xa9\x29\x9d\x54\x10\x96\xec\x5b\x15\x03\x49\x84\x33\x80\x6d\x54\xe1\x53\xd8\xc6\xfc\x68\x44\x3e\x9d\xc5\x2a\x11\x09\xde\x59\xdb\x72\x2c\xeb\x4b\xb7\x9a\xdc\x44\x07\xe6\xcf\x8b\x91\x13\xa1\xf5\x9d\x12\x1b\xa1\x4b\x0f\x65\xb5\xab\x52\x6b\x31\x6c\xc6\xd5\x3a\x66\xbd\xc3\x6f\xe2\x9c\xa0\x1a\xac\x99\xfe\x2a\x67\x53\x09\xf0\xe7\x1f\x5f\xde\x4d\x08\x28\x00\x77\x90\x03\xd8\xfc\xad\x45\x81\xaa\x7d\x6b\x69\xa0\xea\x4a\x81\x80\x09\x77\x90\x09\x0d\xf5\xd7\x8b\x05\xa0\x43\x4b\xc9\x50\xc3\x7c\xb1\x59\x63\xce\x57\xc4\xcc\xd1\x66\xa0\xfb\x99\x3d\xae\xfd\x30\xc3\x9f\x39\x70\x1d\x3e\x5f\x6a\xae\x5d\x5e\x94\x3f\x2a\xbd\xda\x4d\x89\x32\xff\xdb\x55\x5e\xf9\x9a\x95\x4e\x05\x5f\xb3\xf9\x6c\x5a\xe5\x3f\x2a\x00\xdc\x0e\x36\x78\x57\xc9\x87\x31\xae\x4a\xb5\x43\x80\x68\x67\x70\xdb\x3c\xec\x9a\x6a\x96\x8a\x74\x20\x74\x6b\x31\xc2\x88\xcd\x4f\x00\x08\x51\x1a\x7e\xb1\xfa\x16\x77\xae\x0c\x42\x99\x1a\x74\xff\xef\xd7\xdf\xbd\xa2\x73\x99\x6e\x0c\x73\x1e\xcf\xe5\x62\x71\x39\xb9\x15\xe2\x40\xc3\x27\x50\x9b\x30\x86\x5f\xeb\x30\x86\x32\x3e\xc6\x9e\x1f\xee\x78\x36\x42\x63\xd8\x60\x54\xe6\x8a\x8b\xc9\x76\x62\x0c\xa0\xf0\xa1\x3d\xf5\xf0\xd5\x04\x5e\x1e\x1c\xf7\xa4\xa1\x94\x8a\x13\x1c\x7c\x75\x6d\xb9\xb8\x52\x72\xb4\xcc\xde\x42\x85\xb5\x84\x59\x22\x5d\x6e\xcf\x22\x7f\xfd\xf6\x1b\xc7\x21\xec\x5d\xb1\x71\x7e\x5e\x4c\x83\x97\x95\x60\xf6\x63\xc6\x20\xbb\x1c\xf7\xf4\x6f\xd5\xc1\x1e\xf3\xb0\xd2\x00\x2e\x67\xe3\xab\x89\x06\x30\x3b\x7b\x07\xf7\x00\xc9\xeb\x1b\x92\x07\xf9\x72\x3e\x2b\x17\x55\xcf\xfb\xc6\xae\x00\x26\x78\xa7\x7e\xbc\xab\xbf\x6f\x80\xb6\x37\xfd\x5f\x6f\x4e\xfb\xe9\xee\xe1\x89\xe8\x62\x51\xe6\x7d\x02\xd2\x37\x40\x7f\x7d\x60\xa9\x00\x8f\x74\xce\x46\x79\x05\x89\x8f\xae\x14\x86\x70\xa6\x37\x5a\x3c\x3a\x7a\xf0\x00\x86\xf4\x87\x3c\x1b\xc1\x14\xd3\x80\xba\x8f\x4a\x48\x78\xa4\x5a\x83\x5c\x7c\xb2\x10\x9e\x15\xcc\xce\x70\x09\xb5\xa5\x06\x4f\x2e\x8b\x65\x31\xad\x9e\xa0\x03\xe6\xf6\x5c\x17\x31\xf5\xd4\x38\xcc\xde\x96\xd9\xfc\x62\x25\x2b\x61\xe9\xea\xc9\xc2\x66\x9b\x0a\x5f\xab\x15\xe1\xf3\xab\xc5\x02\x27\x27\xab\x50\xa8\xf4\xed\x33\xcc\x30\x45\x5f\x65\x1f\x8a\xb7\x38\x0f\xbf\xcd\xa7\x57\x1e\xfc\x0f\x6f\xb7\xa1\x4a\xf5\x64\x6a\x4b\x3d\x51\x5c\x74\x65\x2a\x7f\x9f\xcd\xf1\x2a\x00\xab\x33\x87\x24\xc8\xc7\x02\x9f\xcd\xe7\x9f\xa3\x5c\x44\xc2\x18\xae\x84\x2b\x86\xe8\x84\xa9\x7d\x56\xe1\x15\x92\xc3\xe4\x11\x15\x7e\xd4\x7f\xf0\x00\xbc\x8d\x81\x1e\x87\xc9\x89\xa0\xd9\x29\xe6\x8d\x88\xab\x81\x3b\x55\x09\xe2\xc6\xcb\xab\xe2\xc7\x8b\x1c\xc0\x50\x4b\x50\x03\x0b\x0c\x88\x57\x1e\xa0\xa6\xf4\x00\x5e\x40\xd5\x19\xa6\xe6\x6c\xfa\x4d\x7e\xbe\x70\x14\xc3\x9b\x81\x3f\x66\xf3\x10\x12\xf0\x40\x5f\xd7\xf9\x01\x6e\x9e\x6e\x56\xa9\xba\x98\x5d\x03\x8d\x5d\xad\xb0\xf4\xd9\x6c\x36\xd1\xa5\xa1\xdf\x75\xbd\xa1\x22\x30\x34\x48\x4b\xa0\xdf\x37\x18\x2e\xcc\x2f\x4e\x27\xce\x91\xe2\x3f\x50\xe8\xb1\x75\xe5\xff\x34\xc9\x41\x6a\xc4\x81\xe7\x94\x19\x94\xae\x81\x1d\x14\xc7\xa1\xad\x29\xcc\xfb\xa9\xd4\xd6\x18\x29\x30\x4c\x3e\x16\xf8\xe5\x8b\x7c\xbe\xb8\x88\x94\x40\x2b\x91\x1d\x7a\xd8\x39\xd0\x85\x25\x28\x52\x39\xc5\xdd\xcf\xf1\x17\x65\xa3\xc4\xc7\x46\x10\x23\x68\xe9\x7c\x8d\xe8\xa3\x47\x26\xc1\x20\x96\x3a\x63\xc8\x8d\x66\xe1\x4b\x25\x2d\xc1\x07\xa8\x18\x7f\x4b\x0f\xd5\x58\x64\x82\x3c\x8b\x0e\xfa\xee\x93\xf8\x19\xe4\xd3\x0f\x83\x57\xdf\x7d\xf1\xa7\x37\x7f\x7a\xf5\x53\x02\x4f\x25\x3c\x52\x39\xe3\x2b\x04\xf1\x48\x1e\xb5\xd0\x8b\x95\xd0\xb1\x81\x37\xa6\x68\x66\x96\xb9\x82\xa1\xb8\xb5\x12\xe4\xc0\x4c\x49\xd6\xeb\xac\x9c\x76\x1f\xe9\xc7\x51\x8b\xbc\x0a\xd9\x30\xc9\xa6\x63\x9f\x7b\xd4\x12\x39\x9d\xce\x16\xc9\x99\x92\x98\x05\x28\xc9\xd9\x34\x9f\x5d\x55\x93\x55\xf2\x28\xd9\x4a\x1e\x91\xe0\x1f\x0f\x92\xef\x27\xf8\x0a\x06\x48\x56\x38\xc0\x9d\x95\x0a\x3f\xf5\x47\xfd\x53\x0e\x1e\x31\x8f\xec\xb5\xdd\x43\xbe\x6a\xea\x1f\x16\xd8\xbc\x83\x04\xd7\xeb\x21\x25\xde\x73\x17\xcd\xbf\x96\x79\x71\xbe\x78\x6c\x4b\x69\xf2\xdd\x04\x1b\xc6\x1d\xbb\xae\xa5\xe5\xc0\x48\xc8\x81\xce\x3f\xb2\x15\x16\x90\xfc\x53\x56\x16\x20\x62\xab\xda\x7a\x96\x2f\x21\x8e\xd5\xe7\xb4\x29\xd4\x4f\xa0\xd9\xf9\xa0\x43\x47\xae\x03\x40\x4b\xd0\x40\xd6\x73\xf0\xce\x27\xd9\x42\xc0\xdb\x3d\x70\x99\xb4\xe8\x25\x2e\x86\x4f\x39\x9b\x2d\x0e\xd9\x38\xfe\xf2\x35\x3d\x72\xb4\xef\x0c\xf1\x18\xce\x40\x4d\xcc\x74\x38\xfc\xe8\x11\x7b\x4d\x89\x96\x1f\x95\x61\xe2\xcc\x9d\xcd\x96\x47\x2e\xd9\xa4\x9e\x4f\x72\x9e\x0c\x9f\x0c\xca\x65\x31\xfd\x2a\x27\x29\x26\x29\x39\xa0\xf8\x04\xae\xa4\x0b\xc1\xf4\x12\x22\xd8\x05\xe5\x31\xae\x9d\x2b\x3e\xa7\x10\x98\x24\x7c\xf5\xa8\x0d\xc6\x79\xf5\x7e\x31\x9b\xff\x5f\x8a\x3c\x79\x58\x56\x4b\xd3\x68\x61\xc3\x58\x9e\xb4\x72\x84\xbb\xbe\x28\x16\x39\x84\x8e\x06\x19\x36\x9d\x5d\x2b\x95\x82\x75\x73\xf6\x21\x2f\xcf\x27\xb3\x6b\x95\x47\xe1\xbd\x58\x1e\x8c\xf3\x77\x2e\x3f\x57\x3b\xda\x79\x55\x54\x9c\x48\x59\xf9\xb6\x98\xb2\xe7\xb9\x2c\xca\x3f\x42\x40\x4c\x96\x3c\xc9\x01\x59\x1d\xc1\x5a\xe4\x9c\x2b\x86\x02\x86\x38\x4c\x76\xf6\x64\xea\x5f\x34\xfd\x9d\xa2\x34\x70\xc9\xaf\x60\x23\x34\x61\xa7\x32\x51\xda\xd3\x23\xc5\x82\xfe\xb0\xe9\x6a\x1c\x59\x98\xd6\xf3\xe5\x23\x9f\xb0\x70\xde\xa1\x05\x03\x27\xaf\xe2\xad\x2f\x27\xc0\x98\x29\x43\x1e\x13\x1e\xa5\x01\x8c\x82\x2d\x31\x0e\x84\x56\x0a\xf8\x11\x12\x11\x16\x89\xd8\x8d\x23\xb9\xed\xcd\x4f\xba\x6d\x1a\x80\xd0\xac\xf3\x2c\xcc\x21\x06\xdc\x4e\x0f\x6c\x0e\x3b\xe3\xb2\x0b\xb9\x44\xeb\xbc\x98\x4c\xda\xd0\x78\xed\x70\xb8\x36\x7d\x12\x39\x29\x71\x28\xa4\x78\xcb\xd1\x0d\x26\xe3\x23\x8c\xe6\x42\x2f\x3b\x07\x9c\x4b\x04\xf6\x04\xdd\xb6\x27\xa9\xe8\xa2\xee\x56\xb2\x23\x65\xf8\xd1\x03\xae\x4c\x90\xfc\x72\xaa\x80\x6a\x6e\x9c\xb3\x23\x4c\x9d\x20\x44\x3a\x2e\x5f\x46\xae\xe2\x87\x93\x87\xa0\x8f\xf3\x85\xf6\x38\x51\x5d\xa2\xb5\x26\x5a\x88\xd6\xaa\x68\x29\x2b\x5a\xb1\x1d\xb6\xba\xb0\xb5\x02\x84\x86\x2a\x41\x0b\x2a\x7e\xc9\x75\x00\xc1\x63\x3d\x03\xe7\x32\x2f\xdf\xe6\x9f\x4d\xc7\xdf\x97\xaa\xbd\x65\x97\x1a\x61\xb2\x9f\x6e\x9d\xb9\x67\x1c\x05\x3b\x2a\xae\xeb\x3f\x08\x99\xf1\x51\x76\xb5\x98\xd1\xa4\xb9\xe9\x27\x6e\x75\x77\x2a\xa5\x8f\xb3\xee\xbd\xec\xb8\xd5\xaa\xb0\x88\x53\x06\x9e\x3c\x49\xbe\x3e\xc7\x65\x99\xfa\x5b\x54\x49\x96\x68\xdd\x38\x01\xb9\x08\xa1\xcc\xb3\x69\x72\x91\x26\x8b\xec\xed\x40\xd4\x52\x2a\x40\x3f\x79\x77\x55\x2d\x70\x85\x2f\x94\xae\x00\x95\xf1\x35\x27\x2e\x78\x1d\x3e\x7a\x7f\xab\x29\x0b\x9a\x1c\xb5\xf4\x08\x5c\xb4\x75\xfb\xd3\x4a\x69\x13\x23\x28\xa6\x7d\x3e\x3f\x15\x3b\x2a\x0d\xac\x6b\x99\xf6\xd1\x45\xca\x58\xf8\x57\x23\x38\x1a\xc6\x03\x1b\xd2\xcf\xd3\x83\xb9\xd4\x8a\xb0\x1e\x9f\xed\x58\x4a\x7f\xc1\xf1\x6a\x33\x12\xe3\xe2\xc3\x86\x58\xb4\x6a\x57\x1b\xbe\x1f\x70\x9d\x58\x8d\x7f\xa8\x9d\xcb\x63\x6a\x5f\x23\x3d\x4e\xa2\x3a\xf1\x11\xd7\x2d\xbd\x3c\xae\x2e\x56\xd7\xc5\x62\x74\x11\x14\x19\xd0\xdb\xd7\x6e\x63\x2b\x4f\xfc\x47\xa0\xfa\x3d\x72\x28\x3e\x3a\x64\x99\xc1\x9e\xcb\x6d\x9c\x27\x4a\x71\x32\x04\xf6\x0a\xf9\x0f\xa0\x0a\x99\xdc\x6e\x06\xda\x0a\x3d\x01\xc9\x8f\x4d\x76\xa6\xc6\xf9\x3d\xf7\x26\x70\x42\x32\x10\x42\x8d\x9c\x11\xf0\x06\xe3\x8e\x1a\xf9\xc0\xb9\x21\xa0\x93\xcd\xa9\x8f\xc1\x03\x1c\x30\x82\x07\xfa\xc5\xb8\xcb\x7d\xcb\xa7\x6a\xeb\x56\xc3\xd4\xd2\x4c\xd2\x6f\xc5\xcc\x51\x02\x0b\xa2\x6e\x4c\x36\xc7\x38\x82\x76\x62\x94\x36\x42\x0c\x53\x7a\xfd\x80\x09\x6f\xc9\x3e\x21\x20\x4b\xe1\xc3\x3a\xb2\xcb\x3a\xdc\x96\x42\x81\x30\xeb\x0c\x34\x92\x23\x70\x6c\x23\x7c\x10\x97\x15\xfe\xde\xad\x56\x52\x98\xd5\x32\x5e\xcd\xca\x8a\x88\x30\xc0\x02\x8d\xd2\xa0\x51\x16\x44\x70\x68\x16\x05\x58\xca\x97\x05\xf7\x23\x09\xa4\x1c\xd0\x52\xc0\xeb\xc6\x97\x56\x13\xfa\x0d\xba\x11\xb0\xb4\x56\x4c\x34\xfe\x4e\x0b\xeb\x07\x0d\xea\xad\x7f\xd5\xaa\x4f\x86\x67\x8c\xc6\x11\x6a\x4d\xb7\x5a\xf0\x3c\xbd\xc8\xd3\x9e\x79\x0b\xde\x12\xe7\x8c\xe0\xeb\x0d\x18\x2d\x91\x65\x12\x24\xdc\x58\x48\x44\xa3\x4a\xfe\xed\x25\xc2\x7a\x69\xf0\x83\xdc\x2e\xc7\x44\x41\x8d\xdd\x95\x05\x4e\xe4\xba\x76\xc3\x68\xa1\xe9\xda\xb4\xe5\x08\x81\x1b\x82\x7c\x7c\x48\x21\x87\xd8\xa6\xd1\x47\xdc\x26\xf4\x7d\x22\x36\x50\x08\x4c\x15\x46\x5d\xf5\x25\xaf\xb1\x15\x52\x2e\x7d\xb1\x3d\xa5\x5c\x29\xfa\x11\x55\x32\x52\x54\x10\x54\xe3\x0d\x72\x52\x6d\x31\x1e\x58\x3e\xa3\x6d\x48\xad\x98\x65\x3b\x93\xda\x32\x5d\xbc\x05\xc8\xcd\x94\xcc\xea\x56\x57\xc9\xb1\x6e\x8b\xc2\xba\x05\x33\xc8\x0c\xeb\x5a\x4b\x3c\x47\xbb\xa6\xd0\x1a\xbc\x6b\x6a\xd5\x20\xde\xdc\x06\xc3\xfc\xc1\x03\xe0\xd6\x07\xc1\x49\xd5\x67\xda\xac\x76\xd3\xd3\x0f\x46\x41\x18\x4a\x7b\xb4\xf2\x46\x5b\x7e\x1f\xf5\x7a\x70\x74\xd5\x11\xa7\x39\x9d\xc3\xbd\x83\x7e\xa7\xe6\x18\xa9\x73\x78\xb0\x0f\x99\x78\x34\xa3\x3e\x9e\xc3\x47\x70\x76\xd4\x39\x7c\x46\x19\x75\x87\x3e\x9d\xc3\x74\xb8\xd3\xef\x18\x3c\xe0\xb3\xdf\xc1\xf3\xad\xce\xe1\xee\xf3\x7d\x38\x4b\xdb\x6b\x73\x96\xf6\xbb\x1c\x9b\x99\xd3\xa7\x97\xd9\xf4\x43\x56\xb5\x3f\x80\xa2\xf2\xbf\xf1\x19\x54\x9b\x2d\xff\x1b\x18\x7d\xbd\x85\xd6\x8b\x6d\xd4\xfa\x79\xa1\x0d\x54\xd2\xb6\x19\xb1\x34\xc6\x2c\xb2\xf3\x0c\xad\x6d\x8a\xdd\xa0\xd7\xc2\x40\xf2\x17\x34\x7d\x7e\x09\x26\xb7\x4b\x25\xb5\x2e\xd0\x18\xf7\x28\x9b\x2e\x8a\x6c\x52\xa8\x15\x7f\xfc\x48\x18\x37\xf0\x15\xa7\xfc\xfa\xa5\x96\x2e\x96\xe0\x26\x01\x1d\x70\xd8\x74\x31\x62\xc8\x79\x66\x24\xdd\xd1\x55\x09\xb6\x17\xac\xe2\x5d\x16\x89\x67\x99\x2d\xb7\xdd\xd1\x6b\x5f\xd9\xc2\x6d\x08\x8c\x8b\xa8\xb8\x61\xed\x29\x6d\x1c\x78\x0b\x85\x4d\x1f\x53\x72\x2d\x47\x2e\x37\x5c\xb3\xe1\xb0\x6b\xb4\x9a\x37\x81\x5a\xe3\xef\xe7\x4c\x14\x25\x35\x00\x6a\x31\x31\xa4\x37\xff\xdd\xf4\x13\xd1\x83\x16\x0a\xcf\x98\x0e\xbb\x22\x5d\xe0\x90\x3c\x1d\xba\x9f\xe8\x87\x89\x5b\xae\xb0\x42\x1b\xf2\xb6\x77\x6e\x61\x63\x4c\xc3\x96\xa4\x06\x11\x49\x33\xf4\x48\xcb\xc0\x06\x81\x27\x45\xd3\xfe\x2d\x45\xd3\x1b\xf4\xc6\x46\xef\xb2\xef\x70\x16\x0f\x94\xec\x80\x97\x16\xff\xfe\x77\xc6\xba\xfa\x3a\x8f\xea\xe6\xf9\xac\x84\x07\xe4\x4b\xbc\x03\x94\x1e\xa9\x3f\x9f\x84\x4f\x9b\x25\xc5\xd6\x16\x14\xc6\x19\x3d\xbb\x2a\xf1\x8e\x8a\x7b\x99\xac\x38\x3d\x72\x70\xde\xe7\x2b\xb0\x36\x51\x31\xa8\x04\x13\x42\xa3\xe2\x6e\x56\x5f\x64\xd5\x77\xd7\x53\x7d\x68\xb5\xa2\xf5\x83\xaa\x60\x34\x5c\x08\x5f\xa0\x2f\xcc\x9c\xbc\x87\x58\xa8\xc7\x1a\x20\x7e\x1d\x29\x4d\x13\xfe\xcf\xc4\xb5\xc2\x72\x47\x38\xb7\xd9\x22\x8a\x4d\xfe\xa5\x58\x5c\xcc\xae\x16\xee\x74\xac\xab\xd2\xb1\x89\xca\x74\xc8\xde\x89\xfa\xf5\xe6\x88\x93\x43\x75\x42\x95\x35\x3d\x80\x1a\x83\x02\x4e\x6a\xbe\x3b\x87\x20\x5e\x2f\x8e\xe1\x75\x61\x90\x50\xc5\xf4\x2a\x3f\xa2\x69\xdf\xaa\x9b\x88\x00\x3c\xc5\xef\x2a\xeb\x9e\x16\xd0\x4f\x95\x8d\x04\x0d\xbb\xd7\xb4\xf6\x3c\xc9\xc6\x63\xb5\x06\xde\xd5\x73\x03\x45\x6a\x15\xf5\xda\x40\x43\x75\xe5\xd6\xaa\x0f\xd9\xa2\xbd\xa7\x04\x16\xfe\xbd\x3d\x25\x82\x45\xa5\xc9\x7b\x60\xb4\xbe\x08\x68\x19\x6b\xdc\x04\x2a\x3c\xee\x89\x9f\xeb\xeb\x12\xe5\xa8\xb9\x95\x46\x47\x8a\x07\xf7\xe6\x1b\x10\x10\x87\x86\x7e\xf0\xb6\xcc\x57\x7b\x43\x7b\x8a\x35\x12\x99\x78\xe2\x66\xb2\xa8\xaf\x7b\x43\xb3\xae\x6e\xa4\x2d\x34\x9d\x10\x78\xa8\xa9\x52\x54\x7c\xe0\x65\xb8\x1a\x23\x59\x6e\x24\x73\x61\xdc\x5c\x26\x7c\xb1\x23\x04\x3a\xb0\xd5\x79\x95\x38\xd6\x55\x43\xc5\xb2\xca\x91\x77\xf0\xc0\xf2\xe0\x93\x29\x16\x78\x36\x0e\xd9\x75\x32\x88\xea\xf5\x93\x93\x47\x5e\x97\x1e\xf5\x93\x47\x23\xf3\x03\x30\x85\xbf\x80\x15\xfe\x2d\x47\xf8\x07\x5a\x7b\x74\xda\x6b\xd2\xb2\xfc\x33\x66\xa3\x75\x01\xa8\xe0\x98\x59\x26\xaa\x25\xa5\x7c\x8d\xce\x7b\x78\xaa\x3a\xcd\x99\x85\xe0\x0c\x1f\x65\xff\x21\x1b\x17\x57\x8a\xe5\x1e\xed\xd7\x9c\x4e\x17\x53\x38\x8a\xdc\x3e\x9b\xcc\x46\xef\x1f\xc9\x45\x99\x9d\x61\xa8\xee\x48\x33\x16\x41\x37\x63\xbe\xf6\x50\x1f\x65\xca\x80\x55\x12\x96\x70\x96\xde\xf3\x0d\x07\xb4\xb1\x15\xe7\x3d\xd2\x40\x43\xfb\x5e\xae\xd6\x70\x02\x26\xdb\xf2\x3c\x92\x91\xd1\xcf\x22\x2c\x14\x49\xaa\xd9\xa4\x18\x27\xe9\x7c\x89\xce\x15\x0c\x39\x5b\xf8\x26\xf4\x16\x69\xd0\x59\x1e\x15\x97\x6f\x15\x33\x98\xd5\xbe\xfb\xab\x52\x77\x90\xed\xd0\xd4\x0b\x32\x46\xfd\xd3\x6f\xbd\xc5\xaf\x8c\xad\x57\x5a\x72\xac\x23\xd1\xad\xa8\x16\x88\x18\x2f\x41\x9e\xc7\x7f\x36\x51\x5a\x8a\xa2\x14\x45\x03\x7d\x14\x3f\xd6\xd6\xe1\x52\xe1\x14\x3b\x76\xce\x8e\xd9\x74\xa6\xb9\x17\x1c\xa0\x8f\x18\xb9\x6f\x7a\x96\x59\xec\xfc\xf9\x9a\xc4\x84\xc3\xdf\xf8\x00\x3c\x33\x95\x44\x1d\x66\x0a\x83\x1b\x82\x50\xf9\xd3\x3a\x5b\x61\x3f\x3c\xf0\xf5\x7c\x27\x1a\x2d\x86\x5f\x8f\x8c\xa5\x30\xa6\x2c\xdf\xf4\x6c\xcc\xc0\xf5\x7c\x63\x1b\xf4\x6c\x7f\x35\x8c\xb4\x29\xfb\x44\x2d\x85\x6c\x9c\xc3\x0d\x95\xce\x13\xf6\x86\x1a\x5d\x1a\x27\x7c\x0b\x45\xda\x53\x59\x3a\x87\xcf\x76\xb4\x76\xad\xb5\xa4\xce\xe1\xce\xce\x2e\x28\xd9\x07\xb7\x50\xb2\xff\xab\x6a\x98\x77\x55\x2d\x3f\xbb\x5a\xcc\x88\x77\xa2\xea\x25\x1c\x90\xab\x3a\x90\x8f\x3a\xe6\x93\xc7\x8f\x1f\x24\x8f\x93\xe4\xf3\x5c\x11\x2c\xff\xec\x5c\xc9\x84\xbf\x94\xf0\x20\x61\x89\xc9\x49\xf2\xd9\x34\xc9\x26\x2a\x75\x4a\xb1\x95\xce\xb5\x5f\xda\xe1\xe1\x19\xd6\x40\x97\xb7\xc3\xc3\x0c\x2a\x26\xa3\xaa\x4a\xe6\x55\x7e\x35\x9e\x6d\x6b\x75\xad\x82\x0a\x1a\x92\x5d\x53\xaa\xe4\xfa\x62\x86\x83\x8d\xcb\x69\xa6\xa0\xe8\x8d\x3a\x0c\xd5\x3b\xb5\xe2\x54\xa3\xb2\x98\x2f\xf0\x7c\x3b\xcf\xc6\xc9\xec\x1c\x40\x0f\x14\x1c\x04\xf5\xe7\x2a\x83\xfb\x55\x5f\x6a\x54\x74\x53\xea\x77\xb6\x48\xae\xf3\xe4\x3a\x83\x8f\x59\x02\x77\x09\x56\x09\x43\x93\x90\xb4\x98\x2d\x66\x7d\x8d\x19\x1d\xdd\xab\x24\x33\x5b\xd4\x5a\xb3\xb8\x88\xd0\x64\x80\x8d\xe6\xcb\xec\x72\xae\x26\xac\xc1\xa7\xfd\x7f\x9f\xa0\x79\xf9\x05\xd6\xd2\xbf\xdb\xd5\x53\x52\xe4\x05\x58\x35\x5e\xe7\x39\x78\x12\x14\xa3\x5c\xb7\xfc\x49\x88\xa4\x05\x49\x0a\x61\x25\xa0\x3c\x41\x30\x9a\x28\x9a\x14\xb6\x13\x27\xb6\xff\x8a\xe2\x68\x16\x3c\xd5\x55\xb7\xf1\x3f\x87\x6c\xa4\xa4\x41\xe8\x49\x03\x46\x91\x6e\x11\x42\x62\x68\x88\x3c\x4f\xda\xd3\xe7\x93\x27\x40\x9f\x4d\xc7\xe2\x89\x1d\x0c\xac\xf9\x0a\xc9\x7a\xa8\xff\x12\x37\xa1\xb1\x4d\xc1\x4e\xce\xd4\x62\x0a\xbc\xba\x98\xa9\x19\x0c\x5a\x27\xc4\x1e\x32\x9c\x34\x30\x5e\x21\x92\x9e\x9b\xf2\x23\x7a\x93\x7c\xf5\xe3\xb7\xdf\x80\xf3\x48\xd2\x2d\x06\xf9\x20\xc9\x34\x2c\x85\x43\x3f\x99\xc3\xf3\x39\x09\x59\x76\xa1\x4c\xaf\x0f\xe0\x47\x99\x9a\xa1\x1f\x66\x4a\xed\x41\x6c\xd5\x02\x53\x66\xc9\x34\xaf\x16\xe0\x0f\x72\xb6\x52\xa3\x53\x55\xf0\xf3\x0a\xfe\xb5\xa8\xe5\x11\xee\x86\xd9\xa7\x54\x4b\xd5\x79\x35\xa8\x55\x06\x10\x15\x22\x93\xe2\xbd\x9a\xaa\x33\xcb\xed\x9f\xcc\x5f\x34\xf3\xde\x78\x46\x98\x98\xd9\x1b\x2d\x68\xba\x0d\xbb\xae\xe3\x47\xf3\x47\x2f\x6a\x98\xf0\xd4\x0d\x58\x33\x0f\x6e\xcc\x7f\xd1\x82\x9a\xf5\xe6\x96\x2b\x22\x98\x9f\xab\x85\xfe\xaa\x54\xcc\x50\x29\x39\xaa\xfa\x67\x56\xaa\x0c\x9e\x39\x1d\x24\x3f\x42\xdf\x2f\xf3\x6c\x5a\x59\x0e\x50\x43\x84\xc0\x60\x28\xdc\x08\xcf\x9d\x2b\xf1\xb8\x80\x07\xac\x26\x60\xd1\x59\xcc\xea\x46\x87\x5c\x8a\x08\xad\xbf\x5c\xa8\x6e\xe3\x88\x46\x4a\xf6\x93\x7c\x5a\x29\x0c\x0d\x0f\xe7\x09\x79\xaf\x01\x9d\xe0\x8b\x58\xf0\x4f\x8c\x59\x2d\x37\x1a\x4d\xeb\x22\x53\xb2\x3e\xb3\x62\x99\x36\x62\xc6\xde\x08\x58\x3c\xa1\x35\x2c\x82\x66\x3b\x53\x45\x58\x71\xbd\xd9\x22\xb4\x3c\x20\x90\xd7\xeb\xaf\x44\x60\xdf\x5a\x94\x13\x94\xf9\x11\x43\x80\x37\xd9\x10\x38\xc9\xd6\x97\xce\xd7\x17\xbc\x47\xbb\x43\xd8\x13\xa1\x8a\x86\xa8\x8b\xec\x3c\xc8\xb9\x7f\xf3\x83\x1b\x3c\x66\x7a\x70\x89\xae\xa4\x1b\x3d\x57\xd0\xa5\xf9\x10\x59\xa7\x7c\xb8\x2c\xcb\x83\x1e\xad\xe4\xe7\xb8\x3a\x79\xac\x78\xce\x4b\xde\xca\x48\xe1\x3a\x0f\x06\x08\xd7\x45\xf8\x0a\x7a\x60\x8b\x78\x69\x0c\x0d\x69\xbd\x10\x10\xb8\xc3\xa3\xdb\x38\x08\x19\x10\xba\x44\xca\x21\x73\x9a\xe6\x00\xb4\xe1\x5f\xc1\x93\xf9\x35\xbe\xbb\xa2\x58\x86\xb6\xde\xe0\x38\xff\xc8\x6e\xb9\xc5\x38\x6e\x54\xdb\x1a\x33\xd8\xce\x86\x21\xd3\x0b\xfa\x16\xdb\x93\x05\x75\x19\xe1\xfa\x72\x0f\x1e\xdf\x8b\xb1\x16\xfb\x49\x0d\x26\x86\x96\x6a\x97\x71\x98\x74\x8c\x96\x4c\xcf\x07\x18\x3a\x78\x1d\x71\x64\xe9\xf9\x03\xb0\xa6\x1b\xfe\xf0\xb7\xea\x85\x6b\x4e\x74\x82\x61\xe1\xf7\x01\xb3\x5c\x17\x9c\x39\xd0\x9d\xea\x9d\x08\x8a\xf6\x63\x3b\xd0\xbe\xe8\xdc\x29\x83\x63\xa4\x04\x4e\x15\x22\x11\xdb\x7f\x0b\xf1\x21\x6c\x80\x0d\xfb\x6f\x56\x23\xe7\xf4\xd1\x73\xcd\xe0\xd4\x7c\xaa\x14\xae\x51\x9b\xec\x8a\xd9\x4e\x4b\x6d\x8d\x53\xff\xe0\xe9\xe9\xbd\x9e\x89\x7b\xe7\x12\xdf\xab\xd5\xff\x07\x94\xc7\xdf\x02\xa6\x96\x93\xa8\xd4\xc0\xcb\x66\x1b\x4e\x79\x26\x31\x78\x72\xb5\x28\x26\xba\x9f\xee\x4c\xc2\xf9\x74\x7d\x93\x9d\xe5\x93\x96\x2b\xbe\x57\xcb\x5b\xee\x3d\x94\x7e\x8b\x73\x8a\x09\x34\xdb\x74\x5f\xb0\xf5\x91\x80\xbe\x3f\x1d\x59\x9a\x79\x8e\x58\x0a\xf1\xe2\x41\x9d\xb9\x55\xf2\xb3\x9d\xc3\x74\xd7\xe5\x0b\x7e\x59\xe7\x9b\xbc\xaa\xf4\x2d\x86\x41\xf4\x36\x0f\x14\xb8\xf7\xa5\x7a\xa2\x87\x59\x2f\x74\xf8\xd9\xda\x4a\x3f\x62\x24\x61\x77\x08\x24\xa5\x58\x79\x14\x57\xe3\x1f\x66\xb3\x85\xe5\xc8\xd7\xda\x0b\x5c\x0a\x32\x43\x27\x76\x0c\x5e\xe6\x13\x34\x53\x58\x3d\x46\x5f\x26\x52\x59\x43\xb4\x08\x73\x64\x06\x75\x04\xe6\xf7\x77\x6e\x8c\xd5\xad\xfd\xf9\x36\xc4\x7c\x0c\x0f\xb8\x83\x6e\xd9\xa3\x6e\x24\x27\xfe\x6e\x16\x47\xde\x04\xd2\xb2\x48\xce\xd1\xce\x61\xba\xbf\x5b\x63\x85\x7b\xf6\xaf\xa3\xee\xdb\x1c\x75\xdf\xc5\x54\xb7\xce\x13\xe9\x65\x56\x8e\x3f\x43\x02\xb6\xf5\x45\x62\x35\xd6\x6f\x98\xda\x5d\x0e\xf5\xc4\x8e\x7f\xa6\x65\xa7\x10\xbb\x02\x16\x9b\x72\xf6\x54\xc5\x93\x3e\x81\x1c\x56\xcc\xa6\xf6\x9b\x80\x65\xe3\x45\xf7\x8b\xd9\xf5\x9f\x6c\xc9\xa6\x8b\xf1\x1b\xc9\xb9\x86\xbb\x4c\x31\xbd\xe6\x16\xde\x4a\xd2\x17\xa9\xc1\x05\xc8\xf7\xfd\xd1\x82\xe2\x57\xef\xe2\x5d\xf8\x8c\x79\x28\x2d\x5f\x8b\x5e\x35\x1d\x21\xf8\xaa\xd4\x2d\xfd\x76\xc4\x39\x86\x83\xd9\xf7\xe5\x9d\x91\x75\x56\xa7\x8c\xf8\x99\xd6\x88\x3b\xc6\xe9\x56\xd4\xb5\x76\xeb\x79\xfe\x9b\x78\x1c\x62\x00\xcb\x71\x54\x45\x22\x7a\x98\x82\xdf\xcd\xf3\xa9\x3e\xe7\xe2\x45\x9d\x0f\xe5\x85\xea\xdc\x75\x56\xe6\x4f\x94\xf0\x39\x9b\xa9\x8f\xed\xac\x2c\x67\xd7\xdb\x57\x73\xeb\x22\x32\x99\x55\xf9\xad\x60\xc0\xc3\x68\x6b\x22\x7e\x44\x43\x7e\xdc\x4d\x8c\xb9\xb9\xba\x81\x24\x73\x95\xee\x4b\x98\xdd\x46\xe3\x20\xeb\x5b\xa1\x5d\xd3\x55\x0d\xa1\x25\x14\xd5\x0f\x8b\x09\x0b\x2e\x3b\xc1\x9b\x86\x7b\x34\x15\x13\x27\x29\x4b\x9a\xaf\x7b\x46\xfe\xd5\xcb\x56\x62\x23\xe6\xce\xb7\xf0\xee\x3a\x9f\xcd\xd4\xb8\x5c\x8a\x24\x73\x48\x4a\x37\x1c\xa3\x92\x38\x3b\xab\x66\x93\xab\x85\x93\xc4\x7d\xaf\x67\x3d\x5f\x34\xdf\x77\xc4\x14\x1a\x4e\x5c\x2c\x62\xf1\x4e\x80\x94\xc4\x53\xda\xe4\x40\x2b\x01\xb8\xd5\x37\xca\xf5\xdf\x4d\xe3\xc6\xa1\x36\xea\x35\x7e\xf8\x14\x7b\x23\x3a\xc9\x5d\xc9\x6d\x72\xb7\xc6\x6f\xdc\x74\x16\xef\x72\x42\x78\x90\x9e\xf4\x13\x77\x00\xf0\x8e\x41\xef\x08\x5d\x03\x6a\x8a\x60\xfd\xcd\x34\xfc\x36\x2b\x5f\xce\x27\xb1\x77\x13\x78\x7d\x77\xf2\x3a\x11\x60\x56\x12\x23\x16\xcd\xbb\x8c\xd8\xc3\xb5\xb5\xac\x24\xb4\xcf\x39\xde\xfb\xea\x27\xfb\xfe\xf9\x62\xda\x7c\xa5\x27\xbc\x6e\x17\xac\xe2\x1c\x33\x7e\x75\xe5\xe5\xa4\x18\xbd\x77\xf7\x56\xec\x88\xba\xed\x80\xc3\xc3\xac\x91\x9c\x55\x05\x96\xeb\x96\x4f\x27\x5e\xed\x0a\x1a\x5e\x0e\x68\xb6\x66\xb4\x5d\x70\x3a\x87\xcf\x77\x5b\x16\xbf\x9a\xab\xc2\x7b\xfd\x8e\xb7\x76\xaa\xad\x0b\xe0\x23\xd6\xf1\x9d\xe1\xbf\xf6\x2c\xbf\xe1\x9e\xc5\xb7\xf6\x38\x3b\x8f\x70\x3d\xe5\x45\xc8\x1d\xec\x7e\x54\x86\xaf\xf2\x6c\xdc\xfa\xc0\xc8\x55\xb8\xc5\x41\x51\x4d\xa8\x28\x7e\x3a\x83\x45\x5a\x38\xb0\x62\xb9\x16\x47\x49\xd5\xd5\x59\x8b\x56\x4d\xa9\x16\x0d\x9b\xa2\x2d\xda\x86\xa5\xae\x45\xb1\xdf\x6c\x23\x76\xe7\xd3\x2b\x4e\x13\x6d\xfc\xd1\xae\xb1\xe3\xac\x7c\xff\xf9\x24\x1b\xbd\xb7\xee\xb1\x92\x82\xb2\xf4\x04\x74\x32\x2c\xee\x2f\xe4\xf7\xb2\x35\x36\xde\x8a\x4f\x77\x82\xf0\x35\x87\x89\x8b\x50\x21\x83\xd1\x68\x0c\xa3\x31\x69\xbe\xcd\xc7\xc5\xd5\x25\x57\x04\xa3\x67\x22\xed\x36\xe2\xf6\x32\xa0\xe2\x06\x8e\x75\x8d\x03\xa9\x03\x0a\xef\xb7\x14\x4a\x16\x19\x57\x41\xa5\x9e\x06\x40\x49\x0e\x1c\x06\x6e\x7c\x7a\xd7\x6a\x83\xc2\xd4\x87\x15\x1a\xb1\x1b\x48\xb4\x24\xbb\x71\x8c\x79\xbb\xfa\x58\x3a\x77\xc4\x74\xdf\x6f\xcc\x4d\xbe\xa6\xf6\x04\xeb\x6c\xd8\xe4\x5e\x9d\xb9\xe3\x8e\xaa\x98\x29\x52\x1a\x43\xe1\x2d\xd5\x1a\x03\xc7\x8a\x82\x66\x38\x50\x4c\xc0\xb1\xf5\xfc\x80\x29\x6d\x80\x51\xcc\x10\x7f\x64\x7d\x70\x42\xa0\x35\x43\x34\x45\xfb\xb1\xe1\x7b\xed\x6b\x72\x99\x59\xb8\xf8\xf1\x96\xf6\x6a\x84\x32\xb0\x14\x93\xfc\x2a\xaa\x9f\xb2\x49\x31\x8e\x1d\xad\x61\xf9\x9e\xf4\x9c\xa6\xc4\x6f\x9d\x6a\xd7\xe0\xa5\x4b\x65\xfb\xba\x4e\x64\x74\x12\x87\x67\xc4\x3a\x64\xaa\x5b\x7b\x4a\xd8\xf6\x8d\x74\x22\xf6\xa1\x09\xc5\xf5\x33\x07\x0e\x9c\x96\x83\x8e\xf6\xbd\x30\x1b\x1a\xd8\xcd\x6f\x66\x1e\x72\xfc\xed\x6c\x43\x1a\x15\xfd\x75\xbb\x18\x32\x96\xdd\xd9\x6d\xfa\x75\x31\x47\x84\xc1\x5e\x82\x73\xfc\x29\xa2\x4a\xf8\xac\x6d\xb3\x7a\xf7\xd1\xaa\x9c\x18\x75\x0d\x9b\x52\xae\xed\x07\x1e\x0e\x75\x6e\xc0\x6b\xcd\x6e\xa4\x67\xd9\x3d\x03\x8d\x0b\x1c\x2d\xb4\xd9\x2e\xe8\x73\x88\x67\xbb\xbe\x2e\x9f\xfe\x4b\x97\xff\xc3\x74\xf9\xbb\x29\xea\xa0\x96\x64\x1b\xe8\xe9\x58\xfe\x16\x6a\x3a\xc4\x12\xc4\x95\xf7\x96\x67\xb4\x7d\x0e\xa5\x85\x02\xac\x4b\x82\x09\x29\x53\x8a\x50\x1b\x0f\x31\x56\x45\x31\x4a\x8b\x0a\x97\x40\x8b\x7b\x50\xc6\xef\x57\x73\x6d\xa3\x37\xfa\xd4\xa9\xa9\x6f\xcd\x8e\xec\xfe\xc1\x7a\x7b\xa6\xb6\x96\x8a\x00\x8f\x60\x57\x1d\xd6\x60\x11\x53\xbb\xfd\xb8\x9d\x1b\x76\xca\x8b\xc3\xd8\xdc\xa5\x4d\xba\x10\x6c\x06\x30\x4a\x20\x3b\x3e\x73\x17\x74\xd6\x6c\x58\x78\xf4\x48\xe0\x23\x85\xaf\x4c\xc0\x93\x29\xde\x8b\x98\xee\xce\xad\xc8\xcb\xbf\xc4\x63\x9e\x5e\x16\x53\x91\x73\x17\xf5\x76\x5d\x8c\x82\xdf\x5e\xeb\x75\x93\xae\x19\x10\x96\x13\x90\x5c\x4d\x06\x2e\x2a\x27\x9a\x21\xfb\x55\x44\x23\x51\x78\xf1\xf6\x8c\x90\x69\xdd\x9a\xef\x7e\x15\x81\x15\xb6\xd4\xbe\x89\x18\xec\x40\x01\xff\x7d\x0f\x50\x23\x01\x13\xe2\x03\xad\xa3\x2d\x8c\x82\x70\x08\xf1\xa3\x55\x43\xb9\xb6\x9d\xb1\x14\xaa\xed\x0b\xe8\x0d\xa3\x68\x38\x09\x0a\xf0\xc8\x6c\x5c\xa0\xdc\xac\x2b\xfa\x23\xa8\x7f\x8f\x22\x8f\x33\xb6\x39\x6d\x5e\x67\x64\xf9\x0b\xbf\x83\x0c\xff\xad\x37\xb4\x60\x15\x5b\xe3\xc6\x0f\xba\xd7\xa6\xf7\xf0\xec\xc4\xed\x7b\x34\x6a\xec\x4c\x3d\x66\x41\x73\xa3\x48\x9c\x8b\xdf\x75\x2b\x74\xab\xcd\x0f\x93\x7a\xfc\xb5\x49\xef\x06\x60\x64\x77\xa0\x39\x77\x6d\xf4\xd0\x9a\x76\xe3\xe2\x71\x83\x0d\x58\x6d\xd0\x47\x21\x9e\xc4\x46\x68\x0d\xc8\x08\xd0\x38\xc2\x56\xbe\xde\xc8\xb2\xde\xe4\x67\x79\xbd\x70\xc3\x95\x40\x70\xff\x76\x5b\x2b\x54\x8d\xdb\xf8\x33\x34\x6e\xa5\x76\xfe\xb5\x95\xfa\x4f\xba\x95\xfa\x91\xde\x5a\x6a\xbb\x93\x42\x79\xb8\xf9\x46\xaa\x45\x94\x8d\x16\x1b\xa9\x4d\xb6\x24\x77\xb3\xf7\x47\x05\xf7\x6f\x64\xb4\xaf\x35\xd0\x93\x65\xf7\x51\xba\x27\x6e\xbd\x87\x66\x63\x71\xc1\xfd\x36\xfa\xf1\xef\xa0\x08\xff\x7e\x2b\xd5\xad\x8d\x4c\xf4\x68\xd8\x1d\x05\x61\xab\x57\x9a\xfe\x25\x08\xff\x19\x05\xa1\x8e\x18\xdf\x5a\x12\xa2\xb2\xfb\xaf\xa3\xdf\x7f\x9d\xe9\xfe\xb6\x67\xba\xd1\xe5\xa1\xd5\x31\xab\x7f\xe0\x18\x7f\x97\xe4\xae\xc7\x9e\x3c\x4c\xcb\xa3\xdd\x83\xc8\x3b\x23\xb1\xc3\x4f\x7e\x72\xd9\x84\x4b\xcb\x23\xd1\x7f\xf2\xd5\xcf\xc0\xf9\xcf\x70\x60\xf9\x4f\xb0\x9d\xf4\x4e\xa2\xd6\x9c\x7e\xd5\x9c\x7d\xdd\xb1\xad\xda\x33\xaf\xfa\x13\xaf\x7b\x50\x41\xe8\x9d\x92\x3b\xea\x20\xb7\x8d\x6e\xfb\x5f\x5c\x07\xf9\xaf\x1e\xe0\x27\x7c\x24\x93\xbd\x92\x79\x6b\xfd\x2a\xea\x8e\xcf\xc2\x00\x8d\xc0\x0f\xd3\x29\x09\x42\x25\xdb\x40\x1b\x6b\xe5\xae\xff\xf5\xb4\x80\xb0\xc0\xaf\x17\x0a\x98\x5c\x92\x79\x4e\xb0\x30\x33\xb7\x70\x36\xb3\x0b\xaa\x32\x59\xfd\xc9\x38\x1e\x7f\x8a\x6e\xc7\x89\x8e\xc9\xde\x78\xe5\xe8\x1e\x36\xbb\x54\x2a\xc0\xa2\xa9\xb0\x71\xef\x7d\x79\x41\x0f\xc2\xc7\x7c\xe2\x1f\x04\x9e\xe5\x84\x42\xe8\x5a\x0e\xe9\x8a\xdf\x27\x57\x36\xf6\x30\x52\xa7\x82\x05\x14\xc8\xc8\xe9\x86\xc5\xea\xee\x9b\x4b\xb4\xa2\x5e\xe8\x94\xa5\x5b\xbb\x97\xc3\x1f\xc5\x4b\x8b\x68\x60\x01\x53\xe0\x0f\x88\x12\x1d\x0d\x02\xed\xea\xd1\x79\x42\x05\xc4\x95\xde\xee\xc4\x6f\x1f\x7f\x1c\x8b\xaf\xcc\xbd\xd9\xad\x63\x3c\x35\x74\xc4\x60\xc7\x22\x33\x47\x74\x72\x06\xc3\xa1\x2d\x49\x19\xb3\x8c\xcb\xe0\xd2\xf1\x40\xd0\x8e\x86\x51\x9f\x7b\x21\x42\xfa\x62\x52\xc6\xe8\xd2\x97\xb7\x3f\xde\x48\xff\x76\x24\x87\x0d\x7a\x18\x31\xbb\xcb\x2e\xd5\x07\x9b\xb6\x63\xc6\x2a\xe8\x93\x1b\x19\x86\xda\xbd\xd4\x05\x25\x6d\x88\x30\xc5\x99\xf8\xd8\xb9\x5a\x3a\x32\xfd\x86\xd6\x75\x0e\xbb\xa1\xab\xc9\x38\x51\x8a\xbf\xa9\xfb\x6c\xbe\x34\x1b\x81\x44\x07\xe4\xa1\x03\x60\x13\x42\x07\xc4\xa8\x65\x5d\x55\xf0\x73\xcc\xfd\x5e\x57\x39\x16\x1d\x52\x8c\xd2\x65\xdf\xf1\xd3\x8f\x8e\x31\x89\x74\x60\xf9\x6f\x59\x1c\x3a\xd0\x61\x0a\x6a\xe3\x25\xee\x4a\x6b\xad\x77\x0f\xa6\x8a\x55\x65\x6c\x91\x16\x17\x31\xcc\x68\xd7\x3f\x18\x69\x5e\xe8\x4c\xcd\x88\x6e\x68\xcd\x12\x6f\x77\x34\x46\x5a\xac\xb9\x9c\x78\xab\xd3\x8f\x5f\x0d\xa7\x7c\xae\x5d\x04\x02\x76\xf8\x34\x79\xa6\x56\xa9\x21\x28\x42\xae\xbe\x1f\xe0\xdc\x1c\x27\xac\x55\x5a\x5b\xea\xab\xe2\x55\x07\x6f\xd5\xef\x1c\xa6\xcf\x7d\x2d\xf6\x5f\x81\xd0\xff\xa5\xc5\xde\x42\x8b\xfd\xd3\xf4\x02\x5e\x20\xfc\xff\xd8\x7b\xd7\xed\x36\x6e\x64\x51\xf8\xbf\x9f\xa2\xcd\xb5\xf6\x21\x99\x21\x29\x92\x92\x6c\x47\x1a\x4f\x96\x23\xdb\x13\x7f\x63\xc7\x5e\x96\x9d\x4c\x4e\x3e\xaf\x9c\x16\xd9\xb2\x7a\x4c\x91\xdc\x6c\xca\xb2\xe2\xed\x77\xf9\x9e\xe5\x7b\xb2\x83\xc2\xb5\x0a\x28\xf4\x85\xa2\x9c\xec\x3d\xca\xd9\x67\x2c\x02\x05\x34\x2e\x05\xa0\xee\x35\x3d\x56\x49\x13\x08\xad\x99\xe9\xba\xbe\xca\xa8\x70\xed\x74\xf7\x90\x87\x33\x37\xce\xf2\x4c\xbe\x7b\x57\x6f\x29\xe1\xb3\x6c\xf2\xe1\x64\xf1\xe9\xe5\xc5\x1a\xe4\x26\x49\x24\x8d\xfd\x7a\xf1\xfe\xfd\x2c\xdb\x99\x00\x34\x18\xd8\xf7\x17\x0a\xbe\x7f\x32\x4b\xe7\x1f\xfc\xce\xe4\xbf\xd9\xb4\x6e\x67\x8e\xc4\xd6\xed\xeb\x92\xd9\x1a\xfc\x6b\x87\x73\x9f\xa8\xe9\x95\x11\xb6\x1a\xe4\x59\x75\xa0\x76\x9d\x51\xe2\xa8\xba\x4f\x94\x4b\xaa\x8c\x4c\x97\xc1\x32\xea\xd8\xe9\xcd\xe5\x37\xcb\x12\xef\x5f\xcc\x8f\x6a\xcc\x03\x4b\x17\x37\x64\x68\x8c\x5c\x4e\x9e\x02\x8f\xad\xd1\x4b\x29\x73\x7a\xba\x52\xba\x6c\x5e\xa5\xa4\xca\x9f\xe7\xf3\x0f\x5e\x1a\x73\x5b\xae\xfe\x92\x17\x30\x50\xaa\x8c\x98\x54\xa3\x06\x9e\x81\x2c\xf2\x87\x5e\x15\x1c\x7c\xa2\x71\xb4\xa9\x0c\x56\x19\x09\xa9\xb6\x3a\x97\xf7\x78\xef\x30\x14\x11\x5a\x32\x7e\x42\xb3\xf9\x1a\x0b\x40\xdc\x87\x7b\x5a\x75\xa0\x70\x5c\xe9\xcb\x48\x27\x0a\x39\xea\x5a\xff\x2d\x20\x52\xcc\xfa\x8a\xd8\xf6\xc9\xeb\x46\x5c\xdf\xe7\x10\x76\x5c\x5c\xb4\x59\x67\xd8\x6d\x7b\xd5\xb2\xcb\x97\xab\x5c\xb9\x6e\xef\x0f\xff\x23\xa1\xb1\xdc\x1d\xd0\x01\xbe\xde\x06\x90\x09\x5e\xdc\x59\x9d\xf6\xde\xfe\xf0\xbc\x80\xa8\x6e\x7a\x04\xf0\x27\x94\x74\x21\x46\x4d\x4f\x86\xb4\x61\xdb\xe9\x56\x76\x8c\xf0\x43\xf5\x85\x2c\xd4\x4d\x32\x66\x25\x86\xd5\x08\x60\x30\x12\x47\x4d\xb7\xcb\x26\x56\x73\x83\x45\x1b\x55\x7d\x12\x2e\x55\x2f\x52\x79\xd5\xc2\x8c\x61\x7e\xc0\xb9\x89\x89\x8d\x87\x72\x62\xec\x1e\x43\xa0\xcc\x63\x7b\xf0\x3e\x97\x0e\x2e\xdc\xd1\x11\xbf\xa3\x91\x31\x6d\xb6\x55\x0f\x86\xdc\x66\xb1\x33\x12\xeb\x14\x9b\x4f\xe5\xe0\x46\xfa\x33\x7a\xcd\xae\x8d\x0a\x76\x75\x1f\xe7\x05\x3c\x45\x64\x34\x7c\x77\x53\x0d\x19\x43\xad\x2d\xf6\xa6\x63\x7d\x95\x79\x7f\x99\xf6\x20\x47\xf2\xba\x96\xad\x1f\xe3\xfe\x93\xf0\xfb\x12\xe8\x88\xb3\x05\xc0\x37\xa8\xba\xca\x1a\x8a\x50\xca\xd8\x38\xfb\x4e\x26\x24\xd5\xc6\xb1\x62\xe7\x0c\x94\x7e\xfe\x1c\x8c\x2e\x38\xa4\xd7\xaf\x7a\xfb\x1c\x14\x2a\x74\x90\xe4\x9d\x74\xb0\xa4\x78\x33\x46\xd2\x0e\x5c\x1e\x1b\xd5\x9f\x4c\xcd\xe1\x3a\x86\x9f\xe4\x4b\x91\x8c\x1c\x71\x65\x12\xbc\x00\x65\x7c\xa9\xd6\xd8\x08\x30\xad\x50\x51\x92\x0d\xf3\x5a\xc3\x23\xeb\x40\xf0\xf1\xeb\xb9\xbd\xe8\xb1\x88\x15\xb4\x34\x28\xd5\xf5\xb6\xa1\xce\xf8\x24\x60\xd5\x08\x83\x2b\xaf\xc1\x18\x83\x03\x4d\x2d\x7a\xe5\x06\x20\x19\x0d\x42\x09\x36\x1f\x03\x02\xa8\x15\x96\x12\x2d\x44\x0f\xf7\x1e\xa6\x62\xf8\x12\xcb\x30\xee\x11\xe8\xc1\x67\xd1\x27\x74\x47\x68\x86\x16\xc9\xb0\x94\xf2\xa8\x6a\x96\x04\xa4\x5e\x10\x51\x83\x8e\x3d\xda\xff\x06\xf3\xd4\x5c\x4d\xf0\x59\xfb\x89\x70\x96\x86\x26\x2a\x0f\x31\xaa\xbb\x23\x12\x0f\xf9\x6e\xe8\xbf\xfd\xb5\x22\x6f\x82\x2d\x35\xe2\x0c\xfb\xf1\x55\xbe\x5c\x6a\xd5\xb2\xc1\x75\x0f\x93\xbf\xc3\x7b\x34\x80\x7b\x3f\x41\xd3\x91\x05\x87\x9e\xcc\xe9\x19\xba\x0f\x4b\x8e\x4f\x6e\x73\x7b\x04\xd6\xea\x8e\xa5\x28\xef\x42\xc2\x91\x53\xe4\x5a\x92\x40\x22\x84\x25\x7e\xa5\xef\x72\x67\xcf\x7e\x7a\x90\xb4\x28\x4c\xcb\x2c\x60\x3e\x5f\x5e\xe8\xa0\xcb\x2d\xb3\x55\xb6\xd2\xe3\x1f\xe8\xd2\x51\x20\xbd\x03\x07\xfe\x7e\x1b\x28\xb4\x13\x07\xf8\x47\x0f\xd1\xdb\xc7\x58\x54\x66\x57\xd9\xfa\xd1\xe8\x2b\xc6\x84\x32\x11\xd3\x99\x8a\x4e\xe4\x25\x85\xdf\x60\xdd\x8b\xfb\xdb\x75\xf0\x4a\x06\x25\x3f\x96\xc2\xd7\xb7\xcb\xa9\xe4\xa9\x70\x67\x92\x99\x52\x9a\x08\xd3\x48\xf3\x45\xc7\x1c\x27\x45\x79\x26\x32\x88\x57\x96\x4e\xf5\x37\xcf\xd4\x18\x22\x80\xab\x12\x7b\x21\x5d\x7d\x5a\xdc\xfb\xce\x1d\x1f\x2a\x13\xe1\xb3\x07\x31\x48\xd2\x45\x9a\x96\xbc\xb0\x2c\xb3\xa5\x14\x6c\x19\xcb\xa5\x09\xbc\x12\xd4\x1e\xe9\x75\x90\x17\x66\xa5\x3a\xa8\xef\x22\x5b\x87\x9d\xbb\xc2\x8e\x94\x4c\xca\x3f\x7f\x0a\xb4\x4d\xdc\x57\x40\x03\x65\x3e\xe3\xb7\x75\x5f\xc5\x18\x82\xd5\x5b\xa8\xb8\x23\xae\xb2\xbc\x78\x06\x67\x40\x77\x12\x4d\xc1\x2b\xeb\x3d\xd5\x55\xac\x8f\x60\x0c\x08\xb1\xc2\x91\xa0\x4a\x98\x8d\x99\x59\x4c\xe7\xe6\x0e\x25\x02\xd6\x9a\xb7\x68\x24\xcf\x23\xcb\x36\xab\x70\xc2\x9e\xa0\xac\x75\xb0\x37\xaa\xcc\xda\x1b\x0a\xbd\x5a\x07\x0f\x1e\xd0\x4c\xbd\xbe\x28\x0a\x72\xf3\xee\x97\x83\x50\xd1\x17\x34\xd8\xf3\x25\xc5\x9b\x64\xf3\xb9\x95\x14\xff\xdb\x4b\x8a\x37\x15\xfb\x36\x4b\x68\x14\x17\x14\xf3\x67\xc6\x0a\x67\xf3\xd5\xe4\x62\x96\xae\xc4\x00\xdf\xaf\x20\x06\x70\x4d\x21\xad\xd7\x6c\x03\x03\x55\x71\x74\x38\x59\xe6\x3c\x13\xbb\xf9\x6b\x6b\x9a\xad\xb3\xd5\x79\x3e\x17\x63\x68\xf5\x92\x16\x6c\xb3\x2b\x78\xa7\x39\x78\x29\xef\x2b\xcf\x87\x79\x9e\x33\x22\x4e\x02\x90\x7e\xaa\xc8\xa8\x59\x99\x73\xb3\x4e\x6e\xcf\x79\x95\x9b\xf5\x9d\xad\x04\x27\xfc\x4d\xe0\xe5\x6b\x6d\xa9\xf9\x93\x5a\x1d\x77\xfe\xfc\x3a\xc2\x7c\x2b\xd9\xe9\xc3\x40\xb0\x8a\xe8\x4e\x19\x50\x1d\xfb\x8c\xe6\x88\x5b\x16\xeb\xe8\xd5\xa6\x9f\x30\x01\x3e\x4b\xcf\x97\xfa\x75\x14\x70\x2f\xd2\xf5\x19\xb4\xef\xa8\x3f\xd2\x4f\x1d\xf1\xa3\xa7\x06\xd1\xed\x41\x67\xd8\x2c\x12\x1e\x25\xd3\x12\xbe\xd3\x4f\xc8\xa7\x57\xd9\x8c\xf4\x2b\x3d\x8c\x3b\xe4\x8b\x3b\xb8\x93\x6f\x92\xd1\x50\xfc\xd7\x15\xa5\xf2\x8f\x43\x4c\x54\xd8\xce\x24\xd4\x21\xda\x16\x2d\xfc\x7d\x9c\x4f\x5f\x88\x0f\xac\xd1\xca\x06\x75\x64\x65\x2f\xbd\x04\x31\xa7\x02\x99\x1f\xbf\x7c\xf1\xa3\xc0\xff\x8e\x23\x2e\x34\x14\x9a\xf6\x52\xcc\xa5\xa2\x11\x80\x18\x12\x5c\x91\x90\x52\x7e\xf7\x4a\x14\x77\x74\x9d\xab\x12\x57\xa0\x38\x3c\x3a\xa2\x7f\x07\x7f\x4f\xe3\x8e\x6d\x8b\x91\x86\x76\x08\xba\xe9\xcc\x66\xfc\x87\xbf\xe1\x1d\x80\x7f\xc4\x63\xa6\x17\x52\xfe\xfc\x8f\x87\xc9\xae\x1e\x98\xa0\x1a\xde\xe4\xe7\x99\xb8\xf3\x3b\xde\x18\x07\x27\x62\x56\x2a\xaf\x7f\xe2\x7a\x4f\xfe\x92\x8c\xba\xfa\xcf\xef\x92\xfb\xfb\x43\x41\x89\x8e\xf7\x87\x5d\x94\x0e\xe3\xae\xec\x28\x2f\xe4\x62\x03\x95\x47\x6d\x4d\x3c\xb2\x09\x6e\x9a\xe4\x2e\x58\x0f\xd0\x6b\xc4\x35\xb2\xad\xd4\x8c\x1e\xca\x97\xc4\x70\x2e\x30\x32\xc5\x9f\xc2\x91\x5e\x7c\xc8\x1e\xa7\xc5\x59\xba\x5a\xa5\x57\x62\xee\xad\x51\x2f\x19\x0f\x87\xad\xc3\x32\xe0\xc5\xe9\x69\x21\xdf\xb3\x21\x03\xe6\x6e\xe5\xc7\x17\xab\x54\x2e\xba\xe8\x76\x78\x5e\xe8\x3e\x91\x17\xa9\x1d\xdd\xa8\xee\xe8\x1e\x7c\xdb\x64\x78\xfd\xdd\xfd\xda\x03\xbc\xbf\x1f\x0c\xb1\xf6\x90\x1a\x8c\x68\x64\xf4\x23\x35\x86\xf4\x00\x0f\xc9\xa1\x35\xc1\x7b\x8c\xda\xfc\x81\x30\xb8\xed\x63\x2d\x81\xc6\x98\x6b\x1a\xf6\xe0\xc2\xf8\x0a\x78\x8a\x32\xc8\x88\x41\x9a\x71\xab\x95\x11\x4f\xa5\x15\xa7\xb7\x6c\xdc\xd0\x86\xad\x5a\x6a\xaa\x9d\xe1\x34\x7b\xdf\x35\x76\x36\xa4\x41\x29\xd2\xfa\xcb\xe7\x68\x5c\x87\xb5\x1b\x8c\x66\xf4\x60\x48\x06\x54\x6f\x48\xa3\x61\x61\x51\x6d\x67\x87\xb6\xb8\xcc\x4e\x3e\xe4\x6b\x47\x35\x89\x01\x8b\x07\xfb\xa9\x19\xae\x68\x0d\x1c\x41\xba\xb2\x1d\xd4\x19\x35\xd3\x13\x4c\x42\xf7\xd4\xb5\x56\x5b\x12\x51\xb6\xe6\x64\xa2\x88\x29\x0f\x6f\x8c\x2c\x40\x93\x49\x56\x87\x27\x69\x22\xf7\x0b\x08\xa0\x91\x4b\xc9\xad\xe8\x9d\x91\x61\xfa\xb7\xa6\x3d\x5d\x8a\x4b\x7f\xbd\xce\xea\xaa\x4c\x7f\x5f\x2c\xce\x4d\xbf\xf0\x77\xf2\x8d\xb8\xf6\x06\x58\x59\xaa\xf4\xa7\xad\xfd\xe1\xf2\x53\x0b\x9b\x64\xc9\x78\x7c\x94\x16\xe8\x88\x47\xe4\x1b\xd5\x4d\x1f\x56\x1e\x92\xf8\xe2\x73\xaa\xdb\xfc\x15\xae\x7d\xdb\x7e\xd8\x24\x03\xb6\x53\x09\xb6\x8c\xa7\x4c\x0b\xc7\x1f\x51\x51\xac\x75\xdf\x7f\x49\x5a\xcb\x4f\x2d\xc6\xcd\xa4\x85\x23\x13\xb6\x02\xcd\x2e\xcd\xa4\x8d\x73\x46\xeb\x42\xab\x07\xba\x34\xb7\xdd\xe7\xfa\x7d\x84\xc3\x6d\xed\x37\x1b\x66\x4c\x19\xa7\x78\x89\x0e\x3d\xd6\x63\x71\x32\x8d\x5a\xce\x1e\x0f\x7f\x1e\x82\x61\xaf\xce\x33\x5e\xbe\xf6\x48\xbb\xd9\x52\xda\xcd\x96\xd8\x00\x89\x0b\x62\x1f\xba\xfc\x2a\xfb\xe3\x58\x4a\xaa\xc8\x0d\xc4\x7b\xd7\x0e\xec\xb3\xd6\x63\x40\xd4\x6b\x46\x94\xe8\xaa\x32\x74\xaf\xb5\x26\x0f\x48\xe1\xb6\x5c\xe5\x62\x43\xae\x46\x47\x7e\x4a\x67\xe8\xe2\xb9\x58\xb8\x49\xba\x84\xa9\x03\xa6\x37\xd8\x0c\xc1\xf8\xc2\x36\x8c\x06\xfb\x68\x1f\x40\x6d\xda\xcf\xe7\x20\x0d\x71\x9b\x41\xe4\x7f\xde\x1d\xa8\x65\xc4\x97\x26\x03\x63\xcd\x4b\x30\xfa\xfc\x49\x23\x4f\xfa\xf8\x7d\xb6\xd7\x98\x21\xf5\x0d\xa3\xc1\x70\x34\xe6\xaa\xd6\xe3\x92\x34\x83\x1b\x92\x68\x58\xb2\x14\xc3\xc1\x2e\x83\x92\x5c\x8f\x21\x59\x83\x2e\x1b\x3d\x46\xc1\x3f\x0c\xc6\xfb\xa0\x05\x6f\x21\x82\xe7\xcb\xcd\x6a\x49\x79\x63\x57\x53\xeb\xb8\x50\xa4\x44\xb5\x65\xc1\xd5\x6a\x3a\x11\xbf\xae\x63\x30\xdb\x83\x80\xab\x73\x94\xd2\x0f\x3a\xac\xa7\xce\x94\x03\x11\x47\x62\xb4\x0d\xaf\xb1\xeb\xa7\x1d\x6f\x66\x27\x2b\x35\x1e\xed\x4b\x93\xe5\xb3\xc6\x67\xed\x29\x72\xeb\xd5\x6d\x14\xd0\xf1\xe3\xfb\x48\x3c\xc7\x12\x8f\xbd\x8f\xef\xbb\xd5\x21\x46\xda\x93\x7c\x35\x91\xbb\x67\xe6\x05\xe7\xa0\xd6\xa4\x24\x1f\xda\x4b\x26\x82\xca\x68\x8f\xf7\x45\x93\xc9\x95\xfe\x0b\x7d\x53\xec\x2c\x14\x0e\x45\xb5\xb2\x7a\x68\xcf\x05\x43\x2d\xfb\x87\x93\x66\x42\x74\x8d\x07\xfb\xb6\xec\x45\x2e\x2e\x89\x99\xb8\x63\x54\x44\x34\x48\x98\x68\x3b\xb4\x11\x4a\xe4\xbf\xe5\xa6\xc5\x9e\x24\xeb\x5a\xa9\xee\xe2\xe2\x69\x2a\x4a\xde\x34\x09\xde\xad\x28\xf9\xdf\x5a\x94\xcc\x66\x1d\x46\xa2\x61\x95\x8c\xb2\x2f\xf3\x4d\xf6\xcd\xc5\x63\x25\xbd\x33\xf1\x9c\x3d\xcd\x6b\x9b\xe1\x6a\xf0\xf6\x4d\x3e\x4c\x9b\x3f\x2a\x4c\x86\x57\xd1\xdc\x0e\x4f\x95\x74\x82\x70\x6a\xd8\x30\x4a\x47\x42\x6c\xb5\x93\x36\x47\xe4\xb6\xd7\x52\x1a\x6f\x88\xa0\x43\x42\x05\x49\xf7\x17\x99\xc6\xfc\xa1\xfd\x96\x82\x90\xa5\x83\x09\xac\x9e\xa8\x6b\x9f\x88\x99\xb5\x6b\x3f\x5e\x4c\x4e\xeb\xb2\x97\xcc\x0e\x9a\x24\x84\x36\xe3\x71\x73\xc2\x69\xa0\xe5\xdf\x98\x8a\x74\xf7\x37\xda\x9a\x6b\x07\x3a\xd1\xd8\x63\x6e\x53\x0e\x33\x5b\x07\xa3\x20\xef\xc5\xa6\xb9\xfa\xca\xcf\xcd\x63\xb1\xd2\x20\x8d\x48\xb8\x0c\x56\xa0\x80\xef\xaf\x45\xad\x83\xbe\x62\x52\x47\x09\xb8\x2b\x2f\x71\x14\x3a\x51\xb8\x5b\xb9\xf7\x5a\x2d\xa3\x7d\x4c\xc5\x4d\x3b\x4d\x57\x2f\x04\xca\x9d\xd5\x76\x36\x45\x6d\xda\xbc\x06\x45\xb7\x78\x2c\x2d\x08\x78\xc5\x40\x90\x7a\x68\x31\x17\xd3\x7b\xb3\xb8\x98\x9c\xbd\x01\xae\x21\x6e\x25\x5e\x64\x33\xd1\x3e\x9b\x36\xea\x5d\xd0\xec\x65\xf0\x56\xe3\x52\x0d\xa4\x7c\xd3\xb4\x49\x16\x0f\xee\xc6\x0a\xef\xf0\x4b\xc6\xe6\x7d\xf3\x2c\x79\xe6\x68\xd1\xa8\x13\x63\x14\x21\x09\x84\x1b\x26\xd8\xe8\x44\x1c\x61\x99\x9f\x43\x55\xb9\xe4\x9b\xe0\x4f\x07\x71\x95\x92\xa1\xfc\xa7\x4d\xee\x90\x86\xb4\xec\x67\x1a\xaa\x1c\x05\xe0\x30\xac\xd0\xcf\x59\xf6\x41\xf7\x50\x74\x30\xe9\xa3\x4d\x2b\x8e\xd1\x96\x3a\x7b\x53\x64\x67\xc1\x01\xb0\xc2\x9d\xdf\x0a\x06\x12\x69\x12\xbc\xc1\x78\x4a\x28\x3a\xce\x6a\x1f\xda\x4b\x01\xff\x48\xf3\x59\xe6\x28\x0f\x74\x3f\xb2\xbc\x43\x2d\xfc\xcc\xa1\xf0\x98\x06\xdb\x8d\x74\xab\x75\xe4\x12\x94\xc3\x9b\x1d\x09\xbd\xc9\x53\xdb\xe6\xec\x63\x82\x5f\xe6\x8d\xce\x31\x31\xfd\x9b\xdd\x1b\x71\xea\xec\x94\xcd\x07\x0d\x91\xea\x7b\x72\xe2\x65\x44\xed\xbc\x55\xe4\x7a\xf4\xd7\x72\x4c\x17\x13\x2d\x84\xb7\x06\x53\x88\xdf\xf9\x2f\xca\x6b\x0b\x7c\x10\x77\x11\x2c\x24\x5e\xf7\xbc\x78\xf2\x9f\x17\xe9\x0c\x7e\x2b\x4f\xe1\xb1\x79\x37\x10\x4a\xf4\x12\xd1\xa1\xe5\x9c\xa1\x33\x6b\x78\xf9\x50\x8f\x4c\xe0\x90\x7f\xc4\x3b\x7e\x23\xd3\xa5\x68\x74\x17\x5b\x6e\xba\x91\xe9\x89\x29\x59\x82\x2b\xc6\x6e\xc3\x50\x63\x1a\x77\x49\xd8\x4c\x3b\x10\x06\x99\x13\xe5\x7f\x7c\x68\xc1\x03\xdf\xdd\xca\xf6\xd2\x09\x05\x75\x60\xc5\x29\xd5\x68\x66\x9f\x20\xfc\xc8\x4b\xf4\x6a\x4f\x4f\xc0\xa2\x3e\x17\xff\xff\x5f\x88\x68\x91\x17\x24\x6c\xa2\x2d\x5a\xcc\xdd\x2d\x6f\x06\xaa\x2c\x7d\xd0\x03\x80\xe8\x00\x3d\x87\x03\xfb\x17\x21\x89\xf4\x5d\x61\x37\xe1\x4b\x1c\x69\x83\x8f\x84\xb6\x46\xa8\xb2\x23\x71\xc5\xed\x58\x60\xf1\x84\x60\x3d\xbb\x27\xae\x17\xac\xcd\x0c\x5f\x10\xa4\xd5\x64\x71\x0f\x8d\x61\x0a\xb7\xcd\xc3\x87\x4a\x83\x62\xb6\x0a\xed\xa8\x87\xd3\x77\xd1\xf9\xf8\x3e\x5b\x8b\x13\x26\x1f\xc2\x42\x1d\x2c\xaa\x33\x57\x07\x84\x6a\xca\x1f\x9b\xc1\x6b\xbd\x11\xc6\x76\x4c\x9b\xf9\xc3\xee\xe2\x41\x94\x01\xea\xb3\x85\xaf\x81\x29\xbe\xb7\xa3\x26\x5b\x98\x0e\xb1\x2e\xb8\x86\xc4\x69\x1d\x8c\xef\xa3\x84\x66\x96\x94\x82\x9c\x66\x90\x16\x0d\x11\x4d\x82\xc4\xf3\xb3\x95\x8e\x6f\x26\x5b\x69\x33\x6a\xaf\x49\xa6\xd0\x37\x82\x9e\x38\x49\xfd\xe0\x25\x6b\x55\x6a\xfe\xf5\x80\xff\xbe\x5a\x5c\x2c\xcb\x5b\xf4\x21\x26\xba\x4d\x80\xfa\x63\xfa\x31\x7f\x2f\xf5\x57\x47\x67\xd9\xc7\xd5\x62\xfe\x3c\x3b\x5d\x27\xb1\x64\xa8\x73\x0b\x0d\xb6\x6c\x00\xde\x87\x68\xec\xa5\x9d\x3d\x5e\x5c\x84\x91\x55\xb8\x2e\xfb\xb8\xcb\xfe\x54\x36\x8b\xf6\x2c\x33\x20\x35\x19\xa7\x34\x2e\x2d\xef\xae\xf9\x48\x65\xa7\xde\x50\x8f\x67\xf9\x34\x7b\x36\x77\x92\x5f\x76\x4f\x6c\xad\xda\x8e\x62\xa7\x80\x66\xfd\x7c\x1e\xd0\xf1\x0e\x0d\x9a\x50\xf2\xba\xd5\x56\x69\x79\x79\x2a\xcb\xc2\xac\x18\xc0\x5f\xc4\x79\xad\x86\x5b\xae\xb2\x8f\x00\x59\xe6\xaf\x3a\x17\x74\x6f\x15\x0c\xf4\x23\x87\x56\xd5\x51\x25\xd0\x99\xd8\x02\x37\x76\x75\x4e\x8b\x9b\x8e\xd8\xe7\x96\x01\x48\x00\xeb\x08\x60\x27\x8e\x4b\xd1\x54\x7d\x60\xa6\x38\x32\x9d\x98\xbb\xea\xf5\xfc\x6e\x91\x42\xdc\xa4\xc3\x15\xe8\x78\xb1\x6c\xfb\x5f\xb2\xe6\x4b\x3f\xe7\xb3\xd9\xeb\x6c\x92\xe5\x1f\x33\x7f\xe9\xa2\x30\x9d\xb9\xc9\x42\x8b\xa9\x4f\x9b\x80\x37\x21\x41\x6f\xec\x03\x67\x1b\x61\x7a\x5d\xda\x3e\x44\x48\x79\x3b\x2b\xdc\x33\xdf\xcb\xdf\x22\x7d\x24\xdf\xc9\xd9\x43\xd0\x6a\x99\x2a\xfa\x10\xf3\x4f\xce\xb4\xd9\x92\x3d\xec\xfa\xd9\xcf\x1b\x6a\xae\x1b\xd8\x9b\x14\xbe\x52\x5b\x97\x5c\x27\x47\x09\x52\x76\x1a\xe6\x12\xe7\x19\xb1\x79\x35\xb4\x6b\x43\x3b\x9f\x9f\x65\xab\x7c\x8d\x62\x24\x9a\xc9\xfa\x11\x12\x6b\x64\x34\x69\x8f\xee\x93\xd0\xc0\x84\x29\xf6\xc2\x06\xc7\x03\x0a\x9f\x45\x5a\x5c\xf2\x89\x39\x70\xea\xc0\xf6\xfe\x70\x88\x07\x15\xb2\xde\x96\xb6\xf6\x50\xbb\x0e\xd3\x7f\xae\xc5\x32\x98\xb5\x7c\x2a\xc8\x3e\x79\x7e\xe3\xac\xa5\x69\x7e\xa5\x24\x7d\x3c\x9c\xe9\x0b\x0e\x3d\x76\xce\x33\x57\x0c\xbe\x08\xb0\x56\xf3\x15\x53\x8f\xdb\x9b\xcb\x28\xd6\xfe\x47\xa6\x1e\xb7\xa7\x0a\x37\x8b\xa0\xb5\x25\x13\xfa\x31\x73\xb2\x89\x09\xbc\x7e\xfa\xc5\x3b\xbf\xc8\xfb\x92\xce\x5a\xe6\x93\x0f\xd9\xaa\x3f\xd1\x2f\x60\xdf\x50\x48\x7e\xd6\x35\xa5\x6e\x9b\x2f\xfe\x2e\xc6\x99\xe9\x0b\xd6\xb1\xd1\xa5\x7c\x38\xff\xb6\x23\xae\x1c\xf1\x6b\xf4\xa3\x2a\x4e\x25\xaa\x9e\xba\x53\x8e\x1c\x8d\x98\x5b\xe0\x7a\x21\xfe\x25\x1b\xa7\x70\xee\x2f\x49\xfb\x37\xe0\xe6\x24\x0a\x11\x1d\x9c\xac\xc7\x05\xed\x84\x74\x03\x2d\xec\xcf\x20\x01\x5a\xe9\xa0\x30\x5d\x1a\x48\x2f\x86\xbd\xe4\x74\xb6\x48\xe1\xcc\x49\x32\x12\x8f\x8a\xc3\xd9\xda\x0b\x11\xa6\x8e\xf6\x77\xc7\xdf\x9f\x93\x00\x1a\x73\xa2\x77\xd1\x79\xb3\x6f\x30\x05\xc6\x1c\xb0\x42\x73\x0b\x68\x2a\xaa\x15\x9f\x2c\x01\xad\x0d\xeb\x6e\x62\x03\x46\x6e\x03\x14\x7d\xdc\x00\xd9\x6e\x72\x8d\x2d\x41\x53\xb5\xc6\x16\xf0\x1a\x6b\x2c\x69\xff\x60\x91\x5d\x37\xdc\xed\x77\x07\x6f\x85\x27\x44\xe3\x6e\x53\x4f\x9a\xc6\x5f\xb8\xbe\x68\x18\x49\x86\xad\x9e\x08\x2d\x12\x4b\xde\x01\xd9\x21\x95\xd9\x2e\x5b\x46\x7d\x09\x70\x8d\x8c\xeb\x05\xf6\x2e\x2c\x3b\x22\x30\x32\x5e\x3e\xe4\x4e\x07\xc0\x84\x1b\x57\xfb\x60\x28\x7e\x0d\xef\x9c\xb7\x13\xdc\xbb\xe4\xed\x04\xff\x74\xfd\x8f\xd9\x09\x83\xbb\x65\x3b\x61\x60\x36\xdc\x09\xc4\x3a\xc7\xb6\xc2\xdf\x6b\xbc\x07\x7e\x5d\x27\x2a\x9b\x73\x2b\xec\xc9\xa9\x4c\x17\x9e\xc4\xce\xc1\x77\xfa\x23\x3c\x1c\x7f\xc2\x78\x38\x7e\xdd\x06\xc3\x31\x5d\xc4\x87\x33\xf2\x17\x87\x5c\x61\xfe\xea\x90\xca\xf8\x78\x10\x77\xce\xac\x8f\xac\xf5\x46\x84\x5a\x30\x2b\x14\x1d\x53\x50\xb9\xc9\x98\x6c\x27\x25\x63\x1a\x55\xf8\x77\x52\x51\x87\x15\x17\x22\x51\x5a\xeb\x60\xef\x9e\x8a\x2b\x5d\x53\xde\xd4\x3a\xf8\x76\xbf\xba\x01\x16\xfb\x88\x16\xf1\x4f\x10\x29\x19\xb8\x79\x0e\xab\x41\x95\x17\xb4\x80\x1d\x49\x58\x4f\x7a\x27\x2a\x76\xf7\xb8\x0a\x25\x47\x82\x6a\xdd\x2e\x2a\x61\x02\x98\x6f\x4b\xe4\xa8\x44\x6a\xba\x3b\xbc\x35\x1e\xba\xc1\xdc\x1f\xac\xa7\x66\x55\xe0\x69\x99\xa1\xc1\x17\x53\x2a\x4b\x30\x69\xd6\x5b\x6c\x26\x9b\x86\x0b\x8a\x33\x45\x00\xea\x1f\x89\xa6\x89\x70\xf2\x97\xac\xb1\x64\x12\x9a\x6c\xe0\xc0\xb9\x99\xc8\x92\x5e\xf3\x7f\x42\xfb\x83\x50\x2c\xd6\xc8\xe3\xcf\xb8\xb8\xad\x16\xb3\xd9\x9b\x85\xd1\xa8\x3b\xfe\x3f\xec\xdb\xc4\x80\x60\x3b\x57\x95\x0d\x7b\xaf\x23\xf5\x00\x1c\x2a\xb0\xc8\x00\x3a\x29\x58\x19\x81\x95\x8b\x96\x08\xa6\xac\x74\xc7\x48\x9e\x6c\x20\x8a\x20\x6f\xc7\xb5\x2c\x28\x0c\x44\x20\xf2\xd2\x59\x52\x2e\x71\xfa\x46\x13\x72\xf7\x9f\x61\xcc\x5d\x53\xf5\x8b\x8c\x79\x06\xcb\x79\x33\xc6\x19\x72\x99\x39\x4a\x58\x2e\xb7\x47\xfa\xea\x2d\xc0\xb2\xa9\x7c\xfe\x4b\x20\x5f\xd2\x58\x1e\x93\x2d\x09\xfc\x66\xda\x28\xa4\xf7\xdb\x04\xe8\xf0\xeb\x3b\xa4\xdf\x94\x11\x21\x54\x38\x2d\x2b\x1c\x93\x61\x80\x30\x4d\x81\x0f\xaa\x1e\x85\xbd\xf1\xb5\x6c\x4c\xcf\xe2\x50\xfd\xfe\xeb\x43\x33\x44\x55\x20\x1f\x10\x43\xcb\x9b\x4f\x82\x40\xd6\x0e\x14\xa0\xac\x61\x80\xd4\x8f\xc6\xd5\xad\xba\x7d\x6d\xa5\x2b\xb2\xd4\xd4\x1f\xf0\x2c\x0f\x22\x53\xa5\x2b\x29\x75\xc5\x30\x4c\xae\x93\x57\x26\x14\xce\x17\x3c\x07\x53\x8b\x6d\x12\x82\x16\xda\xd8\xba\x40\x07\x5d\x3d\x08\xed\xc4\x76\x66\x0d\x0a\xcc\x8a\xdb\x27\x83\xc3\x5e\xd7\x05\x0e\xd0\x62\x47\xa0\x8c\x0c\xae\x4e\x8c\x58\xca\xb1\x29\x57\x52\xf7\x71\x55\xc1\xba\x28\x05\x3f\xbe\xe4\xcb\x6c\x0c\xcc\x0c\x7a\x74\xe6\xdd\xae\xb5\xeb\x90\x78\x39\x58\x5e\x14\x67\x1d\x37\xb5\x2e\xe7\x4b\x21\x21\xb1\xfe\x9f\xb9\x24\xa9\x63\x33\x77\x89\xfa\x74\xb3\x74\xb3\x0e\x97\x5f\xee\xb7\x55\x6c\x78\x0e\x9a\xd2\xdf\xdd\x24\x05\x45\x4e\x0d\xc6\x7f\xdb\x13\x1e\xab\x1e\x7f\x94\xde\x2f\x49\xd9\x47\xbd\x3e\xc2\x6f\xa9\x7b\x56\xf4\x62\x4b\xc4\x71\xcd\xc5\xae\xab\x8a\xd8\x67\x6d\x33\x5a\x4c\xda\x02\x91\xb8\x3b\xc6\x2e\x1b\x72\xf9\x7e\x79\x69\x3c\x75\xbd\xb6\xca\xe7\xe9\xcd\x62\xa9\xf1\x28\xf8\xda\x4e\x32\x4e\xfa\xc1\xd0\x45\xa9\x1a\xa5\x9b\x81\xd9\x27\xe9\x69\x8e\x3f\x1a\xd8\x9c\xc4\x38\xc8\xb0\x16\xec\x45\xe4\xa5\x52\xc6\x4a\x46\xcc\x4e\xd8\x7e\x6a\xb1\x45\xf2\xca\x6b\x92\x75\x47\x13\x8f\xad\x83\x07\xe3\x52\x2b\x0b\x44\x0f\x0a\x2e\xc1\x37\xaa\xdd\x1d\xdd\x88\x99\xc5\xc6\xd4\xf2\xcf\xf9\x7c\xba\xb8\x7c\x9e\x17\xe2\xee\x89\xb7\xbd\x94\x50\xfd\x99\x05\xdb\x8c\x84\xfe\x47\x76\x75\xa4\x4e\x56\x08\x2c\xee\xba\xfe\x44\x54\x56\x05\xda\x2e\x8d\xb4\xed\xd9\xf6\x92\x94\x33\x5a\xed\x21\x85\xf9\x7e\x03\xfd\x44\x73\xf0\xb0\x9d\x3e\x38\x67\x7a\xb2\x13\x28\x56\xd0\x12\x3d\x56\xd4\xb9\x6f\xc3\x2c\x96\x47\xd3\xed\x5b\xb4\x8e\xd8\xc4\x18\xba\x21\x8f\x52\xc6\x9f\xf4\x02\x94\x8a\x70\x2c\x3a\x8b\x4d\x35\x8b\x90\x17\x8f\x26\x40\xde\x96\x99\x26\xfc\x41\xb6\xce\x20\xd9\xd4\xc8\x50\x66\xd4\x41\x72\x1e\x8a\xde\x8f\xcf\x16\x97\x12\x47\x1f\xa7\x57\xaf\xa4\x5a\xee\x69\xbe\x2a\xd6\xf5\x1a\xc2\x87\xea\x37\x92\xe0\xea\x55\xe5\xc2\xe2\xe0\x3c\x41\x95\xb6\xe8\xf6\x8a\xbf\x44\x3b\x9c\xad\xec\x8e\xb6\xc5\x19\x96\xca\x7c\x81\x2a\xfa\x9e\x57\xb8\x20\xce\xfd\x63\x28\xbf\xb3\x35\xab\x10\x82\x3c\xf3\xec\x52\x9e\x32\xe7\x65\x61\xd1\xc1\x92\xa6\x82\x87\x51\x04\x3d\x02\x4e\xfa\xa3\xe1\xd0\xb5\x31\xd8\x51\xde\x06\x37\x89\x6c\xbf\xb4\x20\xb1\x4e\xd3\xe5\x3b\x8e\x0d\x52\x4a\xf6\xd8\xef\xd2\xdb\xd6\x9b\xb1\x59\x21\x32\x05\xa2\x90\x87\x41\x89\x99\xbc\x3c\x0d\xd4\xf2\x68\x63\xec\x32\x51\xe9\x01\x0f\x6c\xf9\x50\xd6\x4e\x46\xaa\x3f\x7b\x74\x58\x66\x39\x0f\x42\x53\xcb\xc8\x6a\x7b\x21\xec\xa3\xcb\x2d\xe1\xd0\xbe\xb8\x31\x3d\x99\x5b\x95\xb8\xbf\xda\x5b\xb6\xdb\xa1\x76\x39\x68\xa1\x7c\xbb\x1c\xbc\xe0\xc4\x62\x7c\x4a\x6c\x72\x70\x0f\x62\x7a\x0e\xa3\xab\x0c\x6f\x6a\x23\xc1\xb4\x1b\x32\x17\xaa\x95\xe5\x2c\x28\xab\x40\xa7\x58\xba\x73\x6e\x66\x7e\xe8\xc3\x00\x19\x6a\xf6\xc8\xd8\x0a\xd5\x15\xd4\x1c\x81\x88\x09\x73\xe1\x50\xf8\x38\x3f\x3d\xed\x84\x1c\x2d\xc7\xf9\x82\x17\xfa\xc8\x91\xff\xe0\x00\x10\x74\x19\x3a\x54\x28\x03\x08\x6c\xf5\x62\xa4\xbe\xb6\x27\x4d\x78\x3c\x03\x24\x4d\x27\x86\x74\xb2\x32\xa5\x37\x61\x35\xe6\x7e\x78\x2d\xdd\x43\x5f\x91\x17\xdc\x77\x80\x4e\x77\xe9\xb1\x22\xb7\x93\xfb\x42\x5e\xbc\x10\xf7\x7a\x0e\x95\xaf\x65\xcb\x87\x68\x3d\xff\x26\x98\x0d\xc8\x7a\xf5\x73\x2a\x7e\xa4\x4a\x38\x21\xc3\x84\x25\xef\x25\x4d\x22\xa6\x27\x3e\x97\x8c\x06\xc9\x93\x4f\x83\xe4\xd7\xf1\x70\xb4\xd7\x13\xff\x73\xef\x5d\x72\x96\x16\xa2\xc1\x44\xf6\xb2\x38\x4d\x76\xd1\xf7\x9e\x8b\x47\xa8\x98\xa4\x4b\x2f\x96\x9a\x0d\x6e\xd0\x9e\x19\x80\x76\x89\xa8\xcd\xb7\x09\x43\x79\x6c\xc7\x96\x69\xd6\x7f\x18\x2a\xf0\xc8\xb0\x4c\x4c\xd4\x0f\x3c\xae\xef\x92\xf1\x03\x88\xa9\xe5\x5b\x5c\x19\x11\x1e\xc2\x0e\x31\xde\x7d\x80\xbf\x07\x89\x9c\x68\xf9\x3d\x51\xbe\x3b\x84\xf2\xf1\xf8\x01\x32\xdb\x52\xc6\x0b\xf4\x7b\xc6\x94\xc1\xba\x75\x5b\xf0\xea\xf0\xfd\x26\x11\x84\x1a\x1d\x8e\xdd\x1f\x26\xd4\xf2\x57\x46\x6d\x75\x7c\x55\xc4\x3a\x94\x75\x17\x2e\x8d\xc3\x9d\xbf\xca\x05\x70\xbf\xbf\x49\xf6\xef\xc1\x21\x1b\x06\x0b\x75\x13\x0b\xe8\x4f\x74\xea\x08\xfe\x6b\x6e\x7e\x60\x86\xc7\x0e\x47\xd9\x06\xc5\x46\x03\xf3\x7c\x13\xd8\x19\x5a\x91\xae\x27\xc9\xf5\xed\x09\xc7\xa4\xce\xe6\xab\x68\x0f\x07\xfb\xcc\x78\x47\xe3\x5a\x26\x83\x26\xa2\xcd\x30\x3a\xd6\xc7\x74\xe9\x80\xef\xd4\x1e\xb3\x3e\xce\x12\x03\xa9\xc0\x8e\x71\x77\x5c\x6a\xa8\x18\x0e\x49\xac\xc7\x18\x65\xb3\x36\x8f\x3c\x95\x4b\x90\xab\xd8\xbc\x2d\x55\xd7\x60\x97\x06\x48\x2f\x06\xe4\x3c\x98\xde\xc0\x4b\x59\xce\x50\x3f\x4e\xd4\xcf\xc9\x04\xc9\xf7\xef\x98\x58\xeb\xba\xd2\x73\xdf\x7f\xae\x6e\x54\x8e\x6e\xb9\x2d\x04\xe2\x7c\x7b\x11\x03\x0d\xc8\xbb\xee\x80\x22\xf4\x03\x8e\x34\x8e\xfd\xda\x1c\xfe\x49\x5e\xc3\xec\xc4\xd1\x2c\x87\xe8\xce\x58\x04\x4a\xaa\xfc\x76\xf2\x29\x0b\xdb\xd8\x62\x2a\x75\x55\xfb\x29\xee\xc5\x47\x1f\xd3\x7c\xa6\xf2\xa4\x96\x6c\xbb\xf2\x90\xa3\xef\x1e\x42\x3b\x3d\xae\x63\x2b\x8c\x8d\x23\x18\x6e\x35\xa5\x1f\x85\x02\x84\xfb\xe6\x66\xc3\x97\xdc\x35\xf3\x0b\xc6\x30\xaf\xca\x20\xce\x93\x98\xf4\x88\x01\x1c\x21\x2d\x79\x22\x07\x5b\xab\x79\x1e\x16\xc1\xfe\xd2\x28\xed\xaa\x05\x66\xcb\x82\xcd\x0d\xe0\xb1\xff\x40\x48\x2c\xf1\xa6\x8d\xd8\xb9\x80\x69\xc3\x9a\xea\x21\x9f\x86\xc8\x67\xa8\x51\x12\xf1\x77\x88\x7c\xc4\x6f\x11\xf1\x6e\xe0\xa9\xbc\x2f\xdd\xda\x76\x8d\xa1\xaf\xad\x6f\xd5\xa8\x73\x96\xa9\x0c\x02\xed\x8b\x99\x17\x5b\x86\x62\x94\xbd\xf2\xab\x2d\x13\x49\x2f\xed\x59\xee\xf5\xeb\xe3\x2a\x7e\x4c\x68\xe7\xa2\xf5\x71\x1b\xfd\xee\x7e\xcd\x2f\xbf\xf8\xc3\xbe\xfc\xe6\x0f\xfb\xf2\xcf\xff\x86\x73\x7e\xfa\x87\x7d\x99\xe2\xf6\x1d\x66\x0c\x15\x23\xa8\x32\xe3\xf7\x0f\xfc\x46\xb6\xfa\xe5\xef\x85\xba\x32\xbd\xef\x48\x75\x28\xff\x4e\x0c\xd6\x0b\xf8\xe7\x58\x46\xf9\xee\x74\xe9\x8a\x28\xb5\xed\xc4\x09\xaf\xe9\xe0\x1b\x3d\x42\x81\xa0\x14\xbf\x2a\xac\x33\x37\xfc\xd7\x90\x9e\x81\xff\xac\x08\x93\x51\x9d\x53\x40\x23\xb7\x64\xa4\x0f\x74\x10\xa1\x64\xbb\xcc\x49\x99\x0d\xe1\xb5\x0d\x22\x82\x10\xbe\x18\x25\xd4\x52\x5e\x21\xea\xa9\xc3\xc5\x0e\x53\x5a\xc6\x2b\x2a\x00\xb5\xfa\x45\xda\x9c\x57\x29\xc6\x69\xf3\x12\x5a\x19\xeb\x8a\xc2\x48\x00\x52\xe1\xdd\x26\xf6\xc6\xf5\xd1\xca\x37\xc4\xaa\xaf\xbd\xaf\x89\x50\xb5\x90\xa9\x04\x91\x18\x69\x19\xc4\x05\x24\x83\x20\x61\x63\x51\x0d\x1b\xb3\x24\x1c\xac\xdb\xda\x6d\xc6\x46\x91\xca\x7b\x73\xf2\x07\xb1\x86\x08\xad\x04\x63\xec\x60\xae\x88\x4d\x90\x57\x05\x4e\xfc\x85\x67\x0a\xe6\xcd\x1c\x6b\x12\x64\x93\xd8\x46\x25\xb2\xaf\xc8\x38\xe4\x5d\x18\x1b\x89\xaa\xec\x48\x46\xa2\xc1\x68\x74\xb3\xe8\x78\x74\x7f\x91\x11\x05\xe6\x52\x7e\x9d\x34\x0f\x69\x30\x1c\xd5\x28\x3a\x1a\xd5\x1b\x89\x27\x91\xad\x1f\xe3\x13\x86\x2c\x49\x48\x4d\x67\xda\x93\x39\x71\xb0\x59\x14\x12\xe7\x8a\x2a\x04\xec\xbb\x1d\x06\x02\x6e\x64\x8d\x45\x1c\x5f\x49\x27\x7f\x8b\x1c\x77\x22\xaa\x51\x22\x24\xe2\x83\x4b\x3a\xb1\x42\xfe\x50\xec\x1b\x13\x85\xf3\x57\x0f\xed\x97\x93\xf5\x71\xfe\xb4\xb1\x8b\xc6\x5b\x4a\xab\x50\x09\x37\xcd\x48\x50\x18\x8f\xdc\xe8\xc5\x11\xa0\xc8\xd4\xdb\xae\x74\xfa\xaf\x8b\xc2\x7c\xfb\xa1\x14\xb4\x1d\xda\x15\x24\x56\x68\x10\xe0\xcc\x76\xc1\x0a\xe1\xdd\x3a\x7a\xbd\x86\xb0\x44\x16\xe3\x7d\x4a\x86\x87\x8b\x7c\xc9\x1a\xb5\xd5\xf8\x92\x82\x25\x72\x9b\xc6\x08\x8a\xbb\x47\xf1\x4b\x36\x45\x2d\xff\x28\x79\xa8\x94\x30\x9f\xf3\xe4\x55\x31\x0c\xa5\x48\x85\xfb\x89\xa3\xcd\xf5\x22\xd9\xf0\x57\xd0\x94\x2e\xd4\x76\x42\xdd\x04\x12\x89\x70\xa0\xd8\x8b\x83\xbb\xb9\xa3\xf7\x3b\x6b\x65\x15\xfb\x0a\xf2\xa8\x61\xae\xe3\xc8\x95\xbd\x45\x3b\x2e\x63\xb5\x1a\x31\x58\x0d\xef\x0c\xbd\x15\x53\x55\xce\x5a\x9c\xc6\xf7\xb1\x97\x64\x9e\x51\x2f\xa3\xef\xf2\x4c\x7c\x59\x8d\x58\x3c\x0c\x85\x16\xf3\xd8\xc9\x28\xe9\x9d\x55\xfc\x71\x2f\x17\xa7\xfd\xfb\x9b\x8b\x16\x80\x84\x47\x9b\xf6\xaa\x2f\x19\x08\x97\xdf\x43\x63\x55\xc2\xa2\x88\x8a\x72\xc3\x91\x5e\xab\x4f\x34\x4e\x75\xb4\xf9\x23\xe3\xe4\xb7\xec\xa1\x31\xd5\x9d\x58\x2a\xbc\xd0\x38\x40\xba\xaf\x47\x4e\x0e\xff\x25\x5b\x55\xff\x2b\xd2\x00\x83\xfb\x0c\x31\x80\x09\x3f\x45\xaa\x3b\xb1\xc0\x5b\xc6\x02\x0a\xaa\xf5\x7e\xa8\x24\x7d\x49\x27\x1b\x7c\x50\x46\x75\xd8\x72\x79\x92\x8a\xc1\x68\x63\xbb\xc1\xdb\x57\x07\x88\x0d\x84\x9e\x05\xc9\x35\x5b\x8b\x6a\x90\x4d\x8b\x2d\x3b\xcb\x4f\xe1\x57\xd7\xe3\xb6\x23\xd7\x84\xf6\x84\x33\xff\xa1\x57\xb1\x41\x57\xfa\x56\xe3\xfb\xaa\x68\x2b\x09\xe9\xfe\x7d\xda\x12\xfd\x7d\x22\xb8\xb6\x0f\xd6\x64\xd9\x5b\x8c\xc7\x2f\x7f\xfe\x71\xab\xcb\xb1\xc5\xd5\xd8\x78\x31\x36\x5c\x8b\xd7\xcf\xfe\xfe\xc3\x9b\xff\x71\x8b\x31\xda\x6c\x31\x9e\x3f\x79\xba\xdd\xb5\xf8\x93\x9c\x93\xca\xe5\xc0\x15\x92\xdc\xaa\x32\x9c\x8e\xc7\x9d\x2b\xb7\xa2\x8e\x99\x12\x0b\x80\xfb\xd8\xcc\x3a\x4c\x26\x7a\x1d\x6f\xcd\xc0\xbe\x18\xca\xa1\x81\x67\x11\x2c\x26\xf1\x80\x94\x5a\x87\xd2\x31\x85\x86\x57\xaf\x75\xb0\x3b\x54\x01\xf5\x9c\x05\xaf\x28\x1b\xfb\xb6\xde\xe3\x5b\xe7\xd0\xdb\xc8\xf2\xdb\x4c\x52\x5a\x61\xcc\x6f\x48\xb3\x7a\xd6\xf8\x9b\x58\xd8\x47\xf2\xa0\x96\x25\x42\xdd\x56\xc0\x3f\x64\x4d\x50\xd3\x5c\x1d\xb5\xa8\xf6\xa8\xbd\x56\xa6\xcf\xc0\xb8\x7d\x23\x87\x59\xa4\xb8\xf7\x5b\xe0\x0c\xa7\x31\x2b\x84\x12\xeb\xf8\xc0\xcc\xe0\x66\x63\xf6\xa1\x89\xec\x61\xf3\x2f\xd6\x76\x02\x19\xda\x32\xe6\x10\x8c\xa5\xed\xcd\xc5\xe2\xf3\x0d\x96\x15\xc3\x73\x97\x58\x5a\xd0\x11\xfa\x63\xfb\x43\xa3\xf7\x61\xa4\xf3\xcd\x84\x0b\x46\x02\x1a\x8b\xdf\x47\xfa\xf9\x5b\xac\x97\x1b\x8e\xe0\xc7\xcc\xcf\x5f\x7c\x39\x47\xe4\xf7\x17\xb3\x11\xf6\xb6\xb3\xa4\x43\x56\xcd\x71\xbd\x4c\x7b\x76\xb7\xa5\xa5\x93\xb2\x40\x76\xf8\x72\xfd\x54\x1e\x78\x47\x5c\x46\x0f\x4f\xb1\xb2\xf5\xb4\x1f\xa8\x7f\x99\x44\x2a\x4c\x03\x32\x05\xb9\x24\xd8\x30\x7b\x42\xcb\xc7\xa6\xbc\xc2\x6d\x39\x16\x0c\xf0\xf8\x4c\xd0\x4d\x81\xdb\x41\xa4\x03\x19\x38\xba\xcc\x69\x58\x29\xa8\x5c\x83\xab\xc0\x57\x3b\xee\x66\x8c\x26\xbb\xa1\xa5\x31\x60\xc4\x2f\xaf\x16\x36\x1d\xda\x90\x8c\x1c\xd7\xec\x0e\xe9\x18\x71\xdd\xb7\xfb\xe8\x36\x40\x23\xa1\x8e\xdc\xb8\x05\x1a\x60\x68\x1e\x3b\xda\x4b\x0e\xe2\x10\xd2\x50\x16\x20\x1e\x1c\xa2\x8b\xbd\x56\xe7\x7b\xd0\xb9\xec\x7d\xb4\x6f\x73\xef\x7a\x92\x0e\xd7\xe2\x6f\xc9\x5e\xd7\x5f\x05\xd3\xec\x4b\x83\x5c\x90\xa5\x66\x9f\x5c\x10\x05\x73\x13\xd9\x28\x9d\xb0\x7a\xac\xe1\x72\x10\xf6\xc0\xf8\x16\x9b\x64\x81\x13\x9a\x24\xd0\x98\xc9\x52\xfb\x5d\x76\xf6\xdf\x24\x7b\xc3\xe4\x2f\xc9\xee\x3d\xb5\x5a\x68\xc4\xd6\x72\x77\x74\x0f\x02\x31\x34\x30\xdf\x46\x56\x11\x27\x8b\x4f\xc7\xf9\xef\xaa\x9f\x93\xc5\x4a\xdc\x38\x7d\x51\xc4\x4f\xbd\x7e\x34\xd4\x09\xbf\x0a\xb0\x03\x5e\xba\xc4\x06\x43\x45\x19\x23\xdb\xf2\x6f\xf1\xd9\x6c\x77\xda\x19\xf6\xc0\x2b\x9e\x62\xf6\x5f\x92\xf6\xf2\x53\x6f\xd8\x65\x26\xb2\xb8\x64\xb7\xd0\x6c\x09\x36\x14\xae\xdc\x56\x75\x25\x78\x53\x52\xcb\xf8\x3a\x9d\xe6\x17\x45\x60\xa2\x3d\x96\x31\x33\xc4\xff\x93\xcf\x25\xfc\xd2\x25\x61\x2c\xd9\x37\x10\xe4\xf5\xdb\x0d\xb6\x0a\x8c\xe5\x59\x1f\x85\xdd\x98\x71\xf7\x6e\x24\x24\x2c\x35\x3a\x8f\xec\xaa\x5a\x84\x37\x66\x6f\x19\xd4\x21\x26\xdc\xfe\xb1\xac\x8a\x75\x4b\xc7\xea\x2d\xe7\x7d\x88\x5c\x02\x2b\xb9\xff\x80\x4c\x01\x4f\x9b\x36\xb9\x0f\x07\x69\xff\x01\x31\x90\x64\xfb\x66\x00\x23\x31\x71\x91\x39\x3c\x23\x00\x97\x1e\xc5\xdf\x25\xc3\xc1\x7d\x38\xc1\x83\x21\x6e\xd7\x00\xfb\xab\xf1\xff\x2a\x8e\xfe\x78\x3b\x98\x60\xc3\x76\x66\x28\xdf\x30\xfc\xa7\x6c\xe1\x21\x82\x20\x6c\x8d\x60\xe8\xda\x61\xed\x6b\x8d\x2b\x41\xf5\xe4\x62\x55\x2c\x2c\xd1\xcc\xae\x49\x7b\xaa\x58\x08\xb9\x83\xcb\x45\x8e\x63\x06\xa3\xcc\x1c\x76\xe8\xe7\x4a\x41\x72\x1d\x5c\x92\x91\x93\xe9\x46\x83\xdf\xc5\xa8\x0e\xea\x8c\xef\x49\xaf\x90\x9a\xa8\x39\x36\xa8\x39\x1e\x7b\xa8\xc9\xe3\x1b\xd3\x7b\x14\xdf\x24\x7f\x8a\xd0\xe1\x02\x12\x77\x81\x14\x73\x63\xac\xfc\x9f\x85\x28\x2a\x28\xca\x75\xf0\xc4\x7a\xa6\xfc\x9b\x22\x86\x40\x09\xf1\x55\x81\x1e\x37\x74\x5d\x51\x5a\xf1\xcf\x77\x5f\x29\x32\x8c\x17\x55\x44\x8c\x5d\x9a\xe1\xaa\x91\x17\x60\xbe\xb1\x6e\x58\xab\xeb\xe5\xcf\xc5\x2c\xcd\xf5\x52\xe9\x7a\xfe\x3b\x88\xb2\x6a\x10\x1e\xb9\xa9\x8d\x71\xf0\x51\xdf\x8a\x77\x6b\x26\xc8\xa4\xdf\x20\x64\xb8\x8d\x0d\xed\xf8\x5b\xcf\xfe\xda\x56\xa0\xd2\x6d\x5b\xd2\xa2\xbc\xdf\x52\xe8\xee\x5c\xa9\xec\x5e\x34\xca\x55\x1c\x06\x46\xaf\xfc\x50\x8d\x3c\xc5\x64\x59\xaa\x37\xdc\xdf\x72\x7f\xd3\x25\x1d\xa0\xb0\xd9\x83\xdb\x70\xf7\x6b\x8c\x9a\xc5\x00\x1a\x38\xde\x8f\x9f\xaf\x86\xa9\x02\xda\x47\x63\x72\x11\x63\x06\x7f\x54\x9a\xe4\x21\x65\x5d\x8c\x4d\x5f\x79\xe1\x05\x46\xff\xa9\x96\x5d\xa6\xf1\x0a\x87\x78\xbd\x25\x17\x3d\xfc\x69\x16\x1c\x1e\xa0\x3f\xd5\x8a\xcb\x40\x73\xdc\x20\x2b\xd6\xdc\x5a\xd2\x84\xeb\x0d\xcd\xe3\x0b\x1e\xde\x97\xf2\xdf\x88\x9d\x5d\x53\xa3\x21\x4f\xe8\xc4\xe1\x87\x09\xc7\x1c\x3e\xf6\x9e\x9c\x39\xda\x45\x27\x14\x65\x57\xd2\x18\xdd\x0a\xd9\x75\xd4\xcc\xa8\x91\x35\x13\x3b\x7d\xb7\x55\x62\xea\x51\xa2\x9c\x46\xa9\x8e\x4d\x22\xba\x40\x68\x2c\xdb\x5f\x1c\x6c\xe9\x15\x33\x62\x40\x2a\xc1\x66\xc1\xdf\xc2\xec\xf2\x37\x64\xb0\x40\x2d\x08\x76\x6f\x2d\x08\x6e\x2d\x08\xbe\xa2\x05\xc1\x35\xc3\x01\x1e\x15\xc5\x93\x8f\xd9\xdc\xcf\x3c\xa8\x30\x7d\x52\x14\xfd\x0c\x6a\x37\x09\x07\x88\x22\xd5\x31\x31\xf7\xac\x01\x44\x9e\xce\x16\xef\xbd\x0e\xa7\xb2\xd0\x80\x3c\x15\x0c\x29\x9b\x62\xf2\x54\x54\xf8\x71\xbc\x1f\x5b\x95\x9d\xed\xb9\xae\xe1\x01\x6e\xb6\x49\xbc\xbc\xed\xda\x23\xd4\x0e\xb6\x27\xee\xdb\xc9\x24\x5b\x32\x26\x08\x38\x83\x21\x04\x55\x2a\x87\x10\x97\xec\x79\x5e\x30\xd9\x01\x31\x90\x7c\x0a\x1e\x5d\x82\xa4\x38\x0e\xf6\xdf\x28\xb4\x5f\x8d\x60\x7b\x77\x2a\x62\xe8\x09\xbc\xbf\x58\x32\xf1\xf3\xde\x2e\x49\xf4\xbc\xeb\x19\x40\xe4\x85\x39\x4e\x26\xb2\x62\x10\x5f\x8e\x86\xcc\xe2\x0d\x31\xae\xad\xbc\xc6\x41\xc9\xac\x5a\x1a\x15\x3a\x48\x83\x96\x0e\xcc\x94\xdc\x84\x7a\x1b\x0d\x01\xb4\xdb\xe6\x53\x11\x4d\x77\x93\x78\x51\x7b\xbc\x5e\xa5\x96\xd5\x80\xf5\x63\x2c\x51\xba\xc8\xeb\x06\x64\x00\xd9\x7c\xcd\x04\x1f\xaa\xd0\x4c\x27\xdf\x25\xfb\xf7\x40\x02\x38\x7e\x30\x8c\xf4\xfd\xfd\x62\x7a\xc5\xf4\xef\x12\x21\x06\xed\xac\xeb\x85\x83\x26\x32\xb9\x07\xac\x6c\x4c\xba\x7b\xd9\x18\x66\xbf\x72\xfc\x8b\xbb\xc9\x9d\x3b\xae\xce\x9b\xa6\x7f\x09\xb2\x31\x9b\xc9\xb8\xa5\xf3\x49\x36\x43\xe6\x3d\x62\xbd\xc5\x3a\x5e\x79\xe1\x17\x09\x7b\xa3\x3f\x6e\x2a\x63\x1c\x8e\xea\xda\xe5\x06\xea\xbe\x43\xca\x78\x2c\x54\x04\x02\xf2\xe5\x07\xe4\x0b\x66\xa2\x7d\x40\x34\xed\xba\xd3\x4b\x4c\x5e\x32\xfb\xdb\x4c\xf1\xe5\x3f\xda\xd8\x69\x8f\x9d\x20\xce\x82\x14\x7a\xc7\x52\x6b\x1a\x4b\xe9\xd7\xf3\xa0\x45\xdf\x2e\x5b\xc5\xf8\x3a\xbe\xfc\x07\x5a\x43\x36\xa4\x78\x09\x0b\xab\x5e\xd9\x52\x39\xa9\x1d\x80\x0a\x06\x30\x35\xef\x32\x3f\x6c\xca\x7b\x4f\x14\xbe\x1f\x53\x89\x03\x3e\x6a\x58\x5d\x3b\xbd\xe2\x00\xd1\xb9\x71\xc0\xf6\x68\x30\xcb\x64\x1f\x50\x12\x60\x40\xf6\xa5\xab\x30\xb4\x7a\x90\x43\x50\x28\xc7\x70\xe8\xc5\x0d\x81\x6d\x65\x0f\xad\x96\x51\x99\xbc\x9c\xdb\xd4\x18\x9a\x09\x2d\x93\x60\x9a\xf7\x25\x5c\x79\x26\x0c\x03\x1b\x51\x81\x14\x3a\x58\x42\xc8\x60\x17\x99\x30\x94\x28\x8e\x1c\x8c\xf8\x59\xff\xf1\xdb\x9e\x97\x3c\xc2\xa6\x66\xa1\x16\xfc\x86\xf1\x68\xb1\x88\x2d\x0f\x60\x90\x2a\x9f\xa7\x5d\x30\x3b\xce\x41\x90\x61\x78\xb4\x4c\x49\xf4\x04\xb4\x36\x5c\x60\x2a\x13\x47\x02\x09\x2d\x0a\x89\xad\x96\x6c\x80\x9f\xd4\xd5\x4a\x5e\x3a\xea\xe0\x0c\x54\xad\x6b\x3c\x35\x07\xc3\xb6\xd7\x25\xf1\x2e\x2c\x00\x92\x9b\x78\x48\x87\x38\x46\xe2\xe0\x19\x91\x99\xf8\xb7\x39\x84\xd7\x17\x3c\xbc\x20\x28\x3a\xfc\xad\xd6\x4b\x76\x87\xc3\x98\x57\x2b\x7d\x44\x42\x11\x0e\xad\xa7\xf3\xe4\xe6\xe6\x7f\x3c\xec\xd1\xd5\xc5\xb3\x93\x69\x8a\xcb\x8a\x83\xea\xbd\x04\xac\xf4\xc7\x74\xd6\x61\x3a\x0a\xc2\x45\xd0\xdb\xbf\x62\x92\xee\x9a\x63\xfc\x81\x6d\x5d\xcc\x91\x2f\x4a\x0f\x3b\x72\xb7\xeb\x47\xff\x33\x33\x82\x7e\x3d\xcf\xe0\x63\x0f\x55\xb9\x5b\x3b\x36\xcc\xc7\x1e\x12\x4b\xe2\x19\x7a\xd7\xb4\xb3\x1e\x86\xe1\xb0\xc5\xd7\xde\xa0\xb0\xc4\xd3\x4e\x80\xf4\x38\x3f\x45\x0f\x09\x7d\xdc\x06\xfd\x16\x33\xd5\xad\xe0\x0f\x2a\x38\x04\x64\xc5\x1b\x5d\x3c\x3d\x5b\xdf\xb3\xba\x62\x9b\xd1\xeb\xc5\x2f\xa2\x05\x08\x97\x71\x7c\xc3\xeb\x38\xfe\x63\x16\xd2\xce\xd8\x5b\x4a\xb4\x12\xc1\x62\x22\xa6\xb2\xc4\x23\xf5\xed\x92\xf1\x47\xe5\x9f\x50\x74\x0f\xd6\x76\x4b\x7d\xf2\xe3\x9b\x27\xaf\xb1\xc7\x1d\x7f\x6f\x76\x88\xff\x5a\x53\x9f\x35\x5f\x10\x63\x65\xbe\x6a\x6f\x5b\x07\xbb\xca\xf5\x0c\xc9\x7e\x5a\x07\xda\x6d\xec\x9a\xde\x6c\x9e\xcc\x0b\xa4\xbb\xe3\x3a\xee\x68\x62\x4c\x23\x5f\x0a\xbc\x57\x47\x0a\xdc\x71\xa8\x29\x46\x3b\xc9\x8a\x5b\xd1\xf0\xad\x68\xf8\xcf\x23\x1a\x6e\xe6\x9b\xc6\x08\x5e\xfd\xcc\x29\x3a\x9f\x3d\x95\xee\x82\x68\xe4\x69\x9e\xcd\xa6\xbe\x7f\x99\x28\xef\x9f\x42\x05\x23\xdb\x6d\x2c\xd5\xdd\x4a\xfe\x13\x45\x42\x96\x49\x14\xb5\x49\x51\xb5\x60\x13\xec\xad\xd2\x08\xdc\x35\x24\x9a\xb5\x84\xaa\xf5\xc4\xb3\x92\x31\x08\x20\xe6\x99\x38\x2a\xbf\xb6\xe1\x06\x5b\xa5\xb9\x94\xaf\x39\x61\x54\x0f\xd2\x17\x82\x41\x5d\xfb\x5d\xb7\x99\x54\x39\x32\x31\x0c\xf3\x74\x31\xb9\xa8\xe8\xa6\x5a\xc6\x5d\x2b\x73\x66\x13\x99\x73\x93\x7c\x2d\x5a\x60\x51\xb6\xea\x6b\x73\x18\x8e\xcb\x60\xef\x6c\x47\x22\x7d\x3d\x8f\x41\x8c\xc1\xd6\xdb\x47\x15\x1a\x62\xc9\x9c\x97\x3f\x26\x15\x8a\xe3\xe1\x7f\x13\xd4\x8f\xb8\x97\x21\xf7\x99\x0c\x3a\xa7\x3d\x38\x20\x9e\x8c\x2b\x57\x9c\x0c\x75\xa4\x41\xc7\xd9\x0c\x5f\x5d\x5e\x36\xb6\x96\x4e\xc9\xe1\x8f\xfe\x06\x52\x8b\x70\x33\xa1\xe9\x43\x20\xda\x53\xea\xc2\x54\x31\xd3\x73\x1d\x63\x67\x1e\x9c\x0d\xf2\xc9\x7f\x5e\x28\x91\x0c\x89\x9b\x0e\xf3\x37\xdd\x77\x31\x7d\x18\x63\x47\xcc\xf2\xeb\x36\xb6\xfc\x4b\x97\x21\x05\xb7\xa3\x99\x50\xc8\xe6\x94\x09\xea\x37\x72\xcf\x72\x7b\xe9\x80\x50\xa1\x83\x74\x98\xed\x00\x5d\x19\xf2\x75\xd3\x91\x16\x2d\x10\x09\x09\xa6\xd3\x8f\x7a\x10\x38\x3c\x99\xf2\x97\x9b\xe2\x6a\xf1\x0b\x6b\x50\xf4\xe5\x89\x55\x28\xba\x08\x43\xc9\x9b\x11\xc3\xc8\x02\x0c\x01\x17\x23\x06\x80\xdf\xb8\xde\x0a\x72\x11\x8c\x29\x43\xda\x1a\x3f\x50\xba\x53\xdc\x44\x13\x88\xf0\x1a\x1e\x53\x4b\xaf\x3b\x07\x46\xcb\x1d\xfc\xc7\x74\x76\x91\x3d\xcf\xe7\x68\x9b\x6d\xd1\x66\x7a\x23\x85\x25\xf0\x72\x21\x54\x80\x9f\x6e\xc3\xe1\x97\xde\x59\xf9\xa7\xda\x42\xf9\x27\x68\xbb\xa5\xb6\x49\xef\x8a\xfa\x21\x97\x5f\xfd\x09\x0b\xad\xfe\x32\xcb\x29\x35\x52\xde\x72\x39\x2d\x95\xf8\x83\xce\x1d\x4a\xec\x14\x9d\x12\xeb\x5a\xe9\x75\xcb\x53\x00\x58\x7a\xac\x57\x21\x96\x37\x66\xcc\x64\xbc\x58\x0e\x7d\x2a\xd3\x19\x2f\x2f\x70\x96\x07\x39\x17\x1a\x5e\x35\x95\x8e\xc9\x6e\xbd\xfd\x9b\x07\xee\x64\xab\xe4\xc0\x22\x68\x4d\x11\x60\x2e\xf4\x19\x7c\x4e\x96\x57\xeb\x2f\x24\x2c\x56\x61\x94\xad\x8a\x4f\xdd\xc6\xf4\x13\xea\xad\x6d\xfb\x02\x56\x1a\xee\x3f\x94\x88\x9b\xc0\x7e\xe6\x6d\xc1\xa3\x37\xda\xfd\x50\xfa\xaf\x6a\x42\xa5\x82\xfa\x77\x53\xd5\x84\x25\x0f\xe3\x82\xf4\x40\x7a\x6e\x5e\x7a\xf5\x6f\x99\x54\x3a\x2e\x8a\xde\x58\x02\xbf\xa1\xec\x9c\x91\x72\x6b\xf7\x62\x8f\x18\x62\x88\x0c\x0f\x45\x91\x9c\x3c\xe8\x41\x97\x74\xa6\xf8\x31\xd7\xec\xfe\x20\x9b\x7f\x1c\xfc\xf8\xf2\xf1\x93\xdf\x9e\xfc\xf8\x93\xd4\xe6\xb5\x45\xcd\xf4\x42\xb6\x6c\x5b\x85\x5e\xf4\xd5\x17\xdc\x66\xb1\x00\xf1\xc9\x6a\xb5\x58\x75\x40\x69\x3a\x5f\xac\x21\xa1\xd1\x0c\xf1\x4a\x03\x3d\x82\xe4\xf2\x2c\x9b\xab\x03\x98\x2c\xf0\x5d\x9a\x17\x89\x51\x21\xca\xbc\x4c\x4b\xc3\xda\xb6\x91\xf4\x3b\xf6\xd6\xab\x77\x7e\x6a\x65\x5e\x66\x21\x76\xbe\xf9\x06\xca\xbe\x49\x5e\x2e\x33\x58\xaf\x2c\x41\x2c\xa0\xa6\xa2\xe0\x4b\xef\x57\xe9\xb9\x38\xf8\x39\x0c\xfa\x2a\x39\x5d\x2d\xce\x61\x04\xe9\x0a\x04\x7d\xb2\x83\x9d\x3b\xe0\x07\x93\xcd\x15\xb6\xa2\x85\x75\x85\x15\xb2\x62\x4c\xb2\x19\x9f\x48\x4c\xb6\xf5\x02\xf5\x83\x3a\xc5\xf2\x59\xe3\xa6\xf4\x68\x96\x8b\x85\x02\xb1\xc2\xff\xc1\x83\xf8\x3f\xb2\x28\x9d\x27\xe9\x32\x97\x5b\x23\xe9\xf2\xb5\xa0\xd2\xd7\x67\x8e\xcd\x75\xb3\x3a\x55\xf7\x97\x9d\x90\xfc\x4d\xe7\x82\xbb\x8f\x48\x58\xcd\xf5\xc0\x8b\x57\xb5\x10\x9f\x20\xdf\xdd\x72\xa4\x32\x8b\xa8\xb1\x16\xa3\x40\x28\xcb\x94\x27\xc9\x17\x64\xaa\x08\x96\xf3\x8b\xd9\xac\x97\x4c\xf9\x68\x9d\x16\xfb\x48\x5b\x5b\x3a\x00\x49\x40\x56\xac\x75\x57\xd3\x2d\x49\xe8\xaf\x2d\xd4\x76\xef\x4b\xf8\x49\x57\xe7\xa4\xb0\xd9\x40\x49\x7a\x06\x27\xb3\x0b\x9b\x64\x3e\x18\x85\x6c\xe4\x8d\xc1\x74\xc4\x0f\x21\xae\x26\x22\xd5\x9d\xac\x14\x9b\x98\xa1\x44\x02\xa8\xa2\x0e\x37\x97\x4d\x9b\xb1\xec\xec\xbc\x79\x99\x3c\x7e\x79\x20\x4f\xb0\xba\x1a\xd4\x75\x20\x46\x23\xe9\x05\x99\x1f\x4e\x9e\x06\xf7\x2d\x8c\xad\xf8\x33\x1e\x6b\x17\xde\xd2\xc6\x98\x19\x0b\xed\x3a\x8a\xa6\x6a\x77\xbd\xfc\x92\x2c\x94\xa4\xbc\xbc\x40\xa5\x94\xaf\xf2\x62\x94\x06\x3c\xa5\xe3\x60\x0c\x03\xe3\x4b\x63\x21\xa9\xff\x10\x06\xe3\x04\xb0\xc3\x77\x34\x49\x3a\x89\x3b\x20\x48\x22\x0c\x89\x54\x0d\x88\x97\x83\x3f\x95\xf4\xb2\x83\x8e\x57\x37\x08\x9d\x8f\x2a\xf5\x61\x77\x91\xef\xbc\x73\x09\x4f\x52\xe5\x17\xe4\x01\xae\xfe\x96\x03\x43\x3a\xd6\x6a\xb5\xc0\xa1\x80\x50\x42\x57\x58\x8e\x9e\x15\x19\xfe\xa6\xdf\xd4\x76\xb7\x5b\xcf\x4c\xbc\x52\x1f\xe0\x24\x90\xad\x83\xd1\xe8\x41\x69\x0a\xf1\x50\xbe\xd9\x3a\xd8\x15\x35\x66\x54\x02\x70\xe8\xeb\x08\xf6\x6f\x2d\xc5\x6f\xd5\x01\x5f\x51\x1d\xe0\xb4\xa6\xb5\x83\xc7\x35\x53\x01\x3c\x99\x9f\x81\xd9\xc3\x94\x35\xd6\xce\x74\x65\x68\xb0\x7d\x65\xe1\xeb\xc9\xf4\x35\xfc\xd7\x0e\x10\x37\xad\x61\x89\x5d\x4b\xbe\x5c\x1a\xd2\x4d\xeb\x11\xac\xd5\xdf\xcd\x86\x7d\x73\x63\x21\x32\x5a\xf7\xf9\x9b\x91\xcd\x9e\x41\xb2\xd0\x78\xe7\x7f\xea\xf0\x5d\x53\x2a\x40\xf4\x6c\x9e\x6b\x4a\xd2\x4c\xf4\xb2\x20\xfc\xd7\x66\x52\xac\xa9\x35\x7b\x26\x62\x26\xdd\x67\x43\xdb\xe7\x48\xf8\x1a\xc7\x6f\xff\x9c\x9d\x7c\xc8\xd7\xe2\x23\x3f\xe4\xef\xcf\x66\x60\x12\xac\xa3\xee\xb4\x57\xef\x4f\xd2\xce\xb0\x27\xff\x5f\xb7\x22\x68\x93\xab\xad\x48\x08\x7a\x0f\xf5\x63\x43\x29\xed\xa9\x80\x3c\x61\x50\x1d\x6d\x5d\xfb\xb9\xe6\xb7\x4b\x4d\xba\x97\xe9\x2c\x5b\x83\xb7\x66\xd4\x7a\x5b\xdd\x65\xfa\x14\xb0\xdf\x64\x82\x56\x70\x11\x8c\x98\xec\xa7\x36\xf8\xc3\x10\xdb\xaa\xe2\x90\x45\xed\x7d\x12\x55\x02\x07\x72\x28\xc0\x38\xa1\x43\x36\x81\x0f\x0a\xc1\xc6\x9a\x6a\x10\x4e\xc9\x2c\x89\x39\xc6\x94\xad\x50\x22\x12\x79\xdc\x83\x6c\xaa\x72\xa7\x54\xc0\x2d\x73\xd4\xe2\xc1\x8a\x0e\x69\x5b\xb4\xee\x03\xbd\x4e\x90\x49\x75\x38\xb8\xd7\x2e\x81\xb4\x0b\x04\xb0\x6a\x85\x46\x5d\x9a\x79\xd5\x4f\x3b\xa5\x8f\xd0\x57\x18\xfc\x68\xd3\x81\x3b\x62\x1d\x6b\xae\xf4\x0d\x1e\x0c\x1c\x4e\x3b\xbf\x64\x5f\x58\x26\xc2\x53\x08\xb9\x5b\xaf\x87\xd4\x5f\x5d\x67\x72\x78\xad\x75\x9b\xb8\xd5\xa2\x96\xe4\xde\xb7\x05\x2f\x54\x22\xfa\xa6\x64\x48\x3d\x1b\xf3\x32\x63\x72\x89\xbe\xd4\x42\x5c\x16\x45\x8d\xf4\xe9\x16\x04\x60\x92\xb5\x7f\x9d\x2f\x97\x7e\x30\x55\x0b\x21\x6f\x71\x1e\x02\x52\xaa\x0a\x96\xe0\x09\x44\x2b\xf1\xbd\xe5\x4d\x79\x00\xfd\x3c\x4b\x3f\x06\xf9\x57\x4d\x79\xb5\xa4\x3c\xb4\xe9\x5e\xcc\x05\x4b\x7f\xb2\x48\x57\x53\x46\x08\x4f\xaa\x2a\xac\xce\x95\x9a\x22\x08\x51\x82\x90\xbf\x76\xd0\x93\x62\x99\xce\x4b\xa2\x9e\x48\xcc\x0b\x72\xd7\x39\x9c\xf2\xa4\x82\xd6\x7f\x3d\x39\xe0\x07\xae\x3e\x17\x7c\x06\x50\x87\x73\xf7\xc6\xbb\x16\xba\xbc\x9b\xba\x4e\x28\xa7\xf3\xcf\xb3\xef\x51\xad\x69\xa9\x58\xd2\x0c\xbc\xff\xec\x77\x65\xdd\xe6\xdf\x8d\xfa\xb7\xc7\x45\x54\xa1\x74\x2a\xf6\x55\xcf\x79\xbd\x86\x78\xaa\xe7\x6f\x6b\x38\x30\x0f\x73\xfd\xd1\x91\xea\x8e\xe2\x55\x5d\x41\xc6\x48\x52\x2b\xc6\x4c\x3a\xec\x96\xd4\x31\x1f\x8b\x4c\x27\x2e\x25\xd1\xbc\x91\xb5\x9a\xf4\xb8\xae\xd6\xc1\xde\xb0\x86\xa9\x64\x89\x9b\x7c\x1d\x17\xf8\x7b\xb7\x82\x8d\x5b\xc1\xc6\x57\x14\x6c\x6c\x24\x77\x00\x45\x60\x23\xc1\x83\x6b\xf0\xb5\x25\x0f\x2a\x4a\x5e\x59\x80\xf9\x6d\x48\x1e\x6e\x4c\xaa\x70\x2b\x3e\x40\xe2\x83\x09\x60\x17\x60\x94\xe3\xfd\x6d\x91\x83\xd2\x41\xad\x35\x00\xfc\xfa\xe3\x85\x0c\x76\x98\x20\x5b\x80\x21\xfd\xf7\x95\x38\xe8\x83\x0d\x9f\x9b\x2d\x26\x1f\xb0\xb9\x86\x0e\x27\xd9\x1e\x26\x5e\xe0\x41\x46\x1c\xc1\x7b\x89\x3b\x21\xc5\x83\x2d\x09\x29\x64\x2c\xd4\xfe\xe8\xdf\x52\x6a\xf1\xdf\x55\x16\x21\xf8\xea\x86\x0c\xfd\x60\x9f\x91\x45\xfc\x89\x05\x10\xec\x78\xd5\xc5\xf5\xf0\x21\x12\x0e\xd0\x10\xfc\xbc\x40\xa2\xb1\x40\xe0\x2b\xb2\xff\xff\xdd\xb9\xf6\x3f\x2f\x07\x8e\x02\xca\xc5\x83\xc5\x35\x62\x9b\x6f\x96\x39\xbe\x69\x16\xf8\x1a\xac\xae\x4d\xb8\x1a\xe5\x0d\x1d\xf9\x7a\x1d\xe6\x90\x32\x7a\xf7\x6f\x19\xbd\x5b\x46\xaf\x3e\xa3\xb7\x23\x28\x23\xa4\x5c\x2e\x75\x4f\xdb\x2c\x70\x59\x93\xb8\x65\x91\xb0\x65\xb1\x1c\x6b\x25\x5a\xf2\x38\xe3\x5a\xce\xb7\x46\x02\x9b\xf9\x71\xcd\x00\xf4\xa5\xb8\x69\x54\x1a\x35\x04\xb7\x50\x85\x06\xe6\x55\xba\xcc\xbc\x68\x6b\x4b\x28\xb2\x2c\xaf\xdc\x95\x30\xab\x9b\xba\xd4\xd5\xde\x0c\xbc\x6a\xdd\xd2\x95\x3e\x5b\x67\xe7\x35\x19\x66\xda\xe8\x86\x99\xe6\x6b\x33\x95\xfa\xad\xfa\xfc\xc5\xe7\x28\x89\x9f\x8e\xff\x14\x85\x95\x1d\x38\x3f\x40\xb5\x62\x96\xb0\x00\x2a\x6b\xfe\xde\x50\x38\x01\xcd\xae\xeb\x0f\xef\x70\xef\x8c\x37\xc0\x90\xd4\x1e\xf1\xd4\x34\x0d\xe6\x9e\x40\x34\x77\xfd\x9d\xc1\x34\x2b\x3e\x08\xae\x42\x1c\x0b\x70\xd7\x7b\x36\x17\x1b\x09\xb7\xa4\x8e\xef\x9e\xa0\x7c\x2c\x6a\x35\x0c\x3b\x87\x82\x66\x98\x69\xf6\x92\xbd\xfd\x61\xf7\x30\xd9\xd9\x11\xcc\xd3\x7a\x72\x26\x38\x3d\x77\x44\x92\xe9\xc5\x2a\x85\x3f\xf8\xd5\xf4\x9f\xde\xb0\x92\x5d\x4d\x26\xc8\x42\xd3\x25\x1b\xd6\x5a\xb2\x61\xbd\xa5\xe8\x70\x21\x06\xe0\xae\x55\xe1\x1a\xf2\xe2\x05\x64\x08\x52\x56\xb6\x66\x3e\x36\x9c\x6a\x77\x70\x92\xeb\x20\x06\xdd\x86\x6b\x79\xfd\x54\x64\xdb\x4b\x2f\x46\x83\xac\xdd\x74\x9c\x7c\x1c\x55\x47\xba\x9d\x24\x41\x84\x7c\x44\x1c\x4d\xce\xf2\xd9\x54\xac\x0d\xa2\x31\x15\x91\x44\x02\x50\xd6\x32\x3e\xe2\x82\x43\xfa\xef\x58\x2f\xb9\x71\x89\xa0\x0d\x43\xe5\x37\x4c\x57\x2b\x13\x0c\x0a\xe4\x17\x8f\xb3\xb5\xdc\x38\x18\xa0\xc9\x72\x11\xb7\x3a\x82\x16\xc7\x13\x30\x5d\x25\x31\xe3\xe2\x0d\x50\xe8\xac\x32\xbb\x28\x1d\x8d\xeb\xc8\x08\x90\x42\x68\x20\x0f\xe7\xef\x09\x74\x8d\x7e\x05\xa9\x99\xce\xca\xc6\x07\x06\xc6\xcf\xce\xcf\xb3\x69\x2e\xf6\x74\xc6\xc4\xac\x44\xa0\xf5\x42\x5b\xd6\x74\x68\xae\xf2\x44\xe6\x82\x74\xc5\xc7\xa6\xf3\x6a\x04\x02\x60\x41\xb5\xdc\xd9\xdc\x15\xd8\x8c\xa4\x90\x12\xac\xf6\x6f\x66\x44\x1a\xc7\xef\x6c\x4d\x1c\x1c\x43\x44\x62\x72\x16\xc1\x3d\x0a\x63\xb0\xfe\xd7\x77\xa6\x48\xa3\x00\x01\xe3\x16\xf7\x46\xb2\x92\x02\x7a\x11\x95\xbf\x87\x6f\x92\x9d\xe1\x84\xd4\xf6\x9d\x7b\x9c\x4f\x5f\xa8\xac\xab\xe1\x1b\x68\xea\x28\xfb\xe9\x6d\x53\xcc\x90\x9f\x0e\xc4\x73\xee\x40\x9e\x2e\x9a\xae\x14\xcd\x24\xbd\xac\x76\x40\x1c\x45\x17\xc4\x45\x7d\x15\x47\x4a\xc2\x6e\xbb\x78\xb4\x36\xda\x1c\x37\x15\x55\x59\x63\x2e\x76\x6f\xe4\x05\xe0\xa1\x9b\x2a\xeb\x6c\x4e\x5a\x29\xbf\xdd\x7c\x8e\xa4\xd1\x48\xec\x29\x9e\x96\x6c\x6a\x5f\xa5\x0a\xb1\x74\x53\xa1\xf4\xef\xcf\x80\x31\x83\x5c\x38\xf6\x89\x02\xb9\xae\x0b\x7d\x29\xd3\xe1\xf4\x47\xc3\xa1\x4b\x96\xc3\xe6\x0f\xe2\xd3\xbe\x55\xe5\xfc\x69\x0f\xcf\xa5\x53\xaa\xb2\xb2\x4b\xda\x82\xd2\x10\x05\xd6\x73\xdd\xae\x8e\xbe\x7e\xd1\x02\x6d\x79\x1d\x6a\x27\x27\x2a\x13\x8a\x9b\x85\xb9\xbf\xef\x56\xe0\x3c\xfd\xf4\xb3\x2a\xae\x22\x73\xbf\x49\x46\x63\xd7\x8a\x97\xf8\xbb\xed\x0a\x96\x08\x9e\x3d\x8c\x40\x46\xe0\xef\x7d\xf6\xef\x82\x83\x73\x62\x3d\x60\xd6\x4e\x67\x8b\xcb\x5f\xc8\x8d\xc1\x5e\x7b\x90\x9c\x48\x8e\x05\x32\x13\x9d\xe5\xd3\x69\xe6\xc4\x6a\xa6\x9b\x7f\xba\xaa\x60\x7c\xef\xe5\x87\x41\x1c\xc1\x0d\x48\x11\xf9\x09\x4a\x6a\x2a\xdf\x17\x34\xa1\x20\xa7\x96\x9d\xe1\x7b\xd3\x83\xfd\x43\x2c\x5b\xdb\xfe\x36\xf0\xcd\xf4\x13\xa6\x95\x53\xa7\x8c\xad\x3a\x85\xa4\x3f\xdc\xc5\x79\xb8\x00\xfa\x67\x53\xb3\x37\x1c\xd2\x65\xf0\xa4\xfe\x70\x1f\x76\xd1\xfc\x72\x9b\xf6\xd4\x23\x2c\xa1\x0a\x0b\x86\xd5\xa1\xf4\xb9\x85\x06\xc7\xcc\x1d\xb2\xc4\x4f\x95\xec\xbd\x26\xf0\x69\x9e\xda\x55\x83\xc2\xe6\x75\x92\xd8\x75\xab\xad\x1f\x4b\xae\xad\xae\x24\xcd\x31\x85\xe5\x4e\x1b\x88\x0a\xf8\x5c\xa9\xd1\x90\xc7\xe9\xfc\x63\x5a\x78\x3a\x26\x73\x67\x4c\xaf\xf0\x80\xf4\xc5\x0d\xc5\x64\x28\x96\x82\x74\x74\xbb\x22\x76\x82\xa6\x3a\x6f\x09\x6a\x2b\x4b\x54\x63\xff\x81\xad\xc3\x19\x59\xb5\xa4\x51\x3a\x98\xc7\xc5\x1d\x0c\x17\xce\xd8\x46\xd4\x78\xa4\x8a\x6c\xd2\x26\x12\x62\x52\xd5\x75\xc3\x93\x85\xb2\x80\x13\xec\x44\x13\x71\xe8\x29\xb8\xbf\x67\xa7\xd2\x2f\x4e\x35\xcf\xc1\x29\x57\x53\xc8\xc9\xe5\x2a\x5d\x82\xd4\x2f\x9d\x27\x67\xbb\xc9\x3a\x7d\x3f\x20\xad\xe6\x90\x38\xec\x5f\x17\xc5\x3a\x01\xa9\x6b\xbe\x56\x1e\xbd\x40\x29\x0e\xf0\xfa\x3a\xc1\xab\x13\x03\x8a\x8b\x48\x7e\xc3\x39\x57\xd1\xe1\xc9\xc8\xd3\xbf\x2a\xfa\x3b\x51\xa0\xef\xda\xe5\x96\x98\x82\xcd\x3b\xdb\x2d\xd1\x08\xa8\xb1\xf0\x36\x79\xb2\x4e\x57\x78\x61\x59\x64\x55\x43\xad\x90\x17\x0f\x41\x47\xb6\x35\xbb\xd8\x0e\x52\x42\xc1\x15\x51\x1a\x27\xc1\x8e\x99\x93\xaa\xe1\x29\x5b\x2a\xe8\x40\x0f\x82\x0b\x18\x10\x2c\x82\xbb\xb7\xc0\xa0\xac\x22\x19\x10\x95\xb4\xf5\x50\xcd\x67\xf4\x77\xe2\x8c\x0f\x0e\x98\xeb\xc0\xb2\x67\x3d\xd2\x86\xae\x8b\xa1\x0e\x9a\x65\x12\x93\x92\x49\xda\x2d\x1d\x98\xff\x99\x65\xd8\x40\xbc\xc8\x8f\xb3\x25\xbc\xee\x7b\x7e\x6a\x22\x75\x35\x90\xa2\xcd\xb3\x27\xe1\xcd\xd1\xef\x71\x80\x1d\x92\x00\x08\xf2\x23\xc5\x24\x0e\xe6\xbf\x2e\x6d\xa0\x6f\x0b\x54\xd6\x30\xe7\x9c\xa6\xdd\x63\xa1\x28\x74\x75\x9b\x46\x63\x38\xf0\xd1\xcb\x55\x03\xc9\xf1\x7c\x31\xf9\x60\x99\x80\x20\xf6\x65\x34\x14\xb8\xfa\x14\xd2\x38\xca\x26\x88\x9e\xcf\x8b\x97\x92\x59\xb2\x17\xb2\x2a\x28\x89\xab\x00\x63\x73\xed\xab\x43\x08\x6f\x16\x36\x94\x86\x0a\x65\x05\x79\x3a\x56\x28\xc3\x34\x89\x7b\x72\x71\x19\xb0\x4c\x44\xa2\xd7\xe5\xe5\x93\x9a\x75\xc4\x9a\x43\xc7\x69\x31\xee\xe7\x4d\xc2\x2f\x57\xb1\x74\xfc\x50\x94\x8a\xb4\x47\xd8\x3d\xcf\xe9\xf9\x91\xce\x63\x46\x9c\x9d\x55\x61\x47\x21\xf3\xff\x73\xfc\xf2\x47\xa5\x1a\xf3\x37\x65\x97\x6e\x0a\x35\x0b\xf2\xb2\x0b\xa8\x87\x9c\x3a\x4c\x9b\xcd\x90\xc1\xf4\xc5\xff\x18\x9c\x8c\xc4\xcd\xd7\xd2\x1c\x13\xa6\x1d\xc6\x65\x22\xac\x3a\x10\x46\x3d\x8b\xf4\xab\x38\xcc\x15\xbc\xd7\xa4\x27\xa7\x9c\xc5\xf7\x18\x0b\xa2\x9e\x53\x4b\x00\xa0\xe0\xa8\x5f\x48\xff\x77\x3b\xe1\x58\xa5\x47\x38\xfb\x5d\xfa\x61\xb5\xc4\x34\xe6\x32\xfd\x86\xbd\xac\xb4\xe9\x11\xea\x15\x68\x3a\xbb\x9c\xf8\x9a\x73\x44\x55\xb0\x02\x02\xdd\xdc\x08\xd4\x95\x27\x8a\x40\xdf\x4a\x60\x0e\x09\x84\x67\xdb\x1c\x40\x4b\x0a\x23\x20\xa7\x50\x30\xab\xea\xc7\x1e\x67\x60\x90\x9d\xb0\x28\x5c\xa0\xc4\xf2\x0c\x32\x23\xe2\xce\x50\x74\x08\x9d\x55\x91\x4b\xa0\x1a\x10\x77\x0e\x48\x91\x58\x32\x1b\xc6\x3b\xbf\xce\x44\xbc\xba\x21\x26\xdb\x72\x6c\x0f\x28\x9f\xfb\xfd\x42\x2c\xce\x39\x2a\x66\x25\x0c\x80\x12\x8f\xc4\x57\x24\xeb\x0d\x1f\x0b\x99\x2b\x93\x0c\x43\x29\xdf\xbb\x38\x2c\xa0\x53\xd5\x0f\xb5\xaa\x9e\xc0\x1a\x45\xbd\xc5\x51\x29\x75\xb8\x58\x41\xc8\x17\xb5\x01\x16\x33\xa4\xd6\xfe\x8e\x05\xdc\xd9\xc9\x15\x5d\xac\xa1\x35\x94\x78\x4b\xe6\x6d\xf1\x23\x91\x4a\xe6\x44\x4b\x88\x13\x85\x19\xe2\x48\x67\xf4\x9c\x29\xbc\xc9\x8b\x9f\xd2\x59\x3e\x35\x88\x43\xbe\xef\x9d\x2e\x7f\x6c\x1e\x2f\x40\xdb\x82\xd6\x1c\x1f\x3f\xf7\xba\x62\x94\x50\x39\x44\xe8\x47\x4d\xab\x2f\x34\x0d\x0b\xc6\xb4\x72\x52\x3b\x92\x79\x16\xe3\x1b\xa2\x59\xc8\x78\x0c\xb9\xc1\x9d\x33\x6f\x18\xe8\x40\x51\xf1\x1d\x3e\x4b\xbe\x60\x8f\x0f\x4a\x4d\xb9\x72\x65\x1d\x9b\x8b\x39\x29\x86\x5f\xcc\x57\x09\xb5\x07\xf9\x5c\x7c\x57\x17\x8a\x1b\x71\x2a\x6e\x84\x73\x69\xa0\xab\xff\xd0\x4b\x31\x20\xad\x31\x20\xd0\x6b\xa4\xf6\x10\x7f\x13\x2d\x70\x40\x13\x60\x40\x4c\xb0\x1b\xd8\x30\x68\x50\x79\xeb\x23\x2b\x5d\xf3\x9b\xeb\x9a\x68\xfb\xf3\x7c\xfe\x4a\x1d\xea\x37\x0b\xd0\xda\x8f\xee\xd9\x93\xb1\xb3\xf3\x3a\x13\x0f\xba\x3c\x1a\x4a\x38\x08\x1c\xa2\x8c\xdd\x0d\x45\x6a\x15\x93\x4b\xc1\x0a\x2a\x69\xff\xd4\xf0\x82\x34\xda\x11\x60\xc8\xe0\xcc\xac\x7d\xdb\x7a\x52\xd2\xf1\x31\x60\x91\x35\xb2\xdb\x48\x3e\xb3\x38\x3d\x15\x63\x0d\xb7\x61\x89\x27\xd7\x21\x5b\xd9\x67\xba\xed\x26\x3b\xc9\x58\xd4\xdc\xdb\x33\x9d\xc8\x70\x25\xae\x93\xbf\xd2\x15\xeb\xd2\x0f\x90\x3a\xb4\x90\x3f\x81\x66\x53\xc5\xa2\x9a\x64\xa0\xce\xc7\xf1\x69\xd4\x42\xf6\xc0\x7e\x56\x5c\xa7\x1f\xb2\xa4\xb8\x58\x49\x26\x7b\xba\xc8\xe0\x0a\xb2\xbd\x20\xa5\xed\x7a\x21\x7a\x48\xd7\x56\x98\x39\x40\xa3\x45\x6f\x5d\xa8\xb3\x00\x04\xbe\x6b\x71\x53\x2f\xfb\x12\xcd\xc7\x5d\x51\x71\x28\x31\x53\xf4\x43\x0a\xfe\xda\xc1\x3d\xb3\xb3\x93\x3c\x5d\x80\xb9\x54\x6a\xb1\xe7\x94\x84\xe5\x29\x92\xb5\x58\x11\xb9\x16\xe9\x9c\x9c\x51\x7e\x32\xbc\xc2\xc7\x8b\xb5\xc3\x4a\x3e\xfd\x67\xa1\x42\x46\x63\xcf\x46\xfa\xe9\x31\x46\x52\x8b\x79\x1e\x1a\x8d\x93\x6f\x92\x0e\xe2\xe1\xcc\x4a\x89\x95\xb9\xb7\xd7\x45\x2f\x0d\x2f\xa0\x89\x7c\xa6\xff\xd0\x3b\x22\x40\x79\xe7\x8b\x8b\xe2\x38\x3f\x01\xc2\x9b\x45\xf9\x70\xd1\x0c\xa9\x51\xf7\x2b\x10\xcc\x95\xff\x82\xfd\x04\x77\x72\x45\xf7\x76\x79\x22\x9f\xf2\xf1\xc4\xfc\xaf\xcd\xc3\xe2\x27\xef\x30\xda\xa1\x98\x2d\x63\x9d\xc4\x1b\x48\xb3\x4a\x32\xbb\x6c\x3b\x84\x97\xc7\xab\x32\x89\x56\x28\x40\xd4\x44\x53\xaa\x1e\x1d\xc2\x82\x25\xc2\x62\x29\x95\xfe\xef\xa5\x99\x86\xe5\x07\x95\x83\x36\xd1\xc0\x05\x94\xfa\xa6\x59\x22\x92\x30\x35\xcd\x66\xb9\x22\x6c\xfa\x07\x49\x85\xdb\x94\x0f\xc7\x47\xbe\x6b\xb7\x37\x6d\x6e\x3a\xe5\x91\x9c\x70\x5a\x07\x26\x8d\x43\xa9\x6b\x62\x55\xd0\x26\x63\x12\x27\x7e\x82\xbb\xa2\xb2\x7f\x13\x3f\x64\xbe\x86\xa8\x57\x63\x2c\xf3\x03\x9f\xf8\x01\x9b\x32\xb6\x0e\xc6\xe3\x5d\xb0\x84\x7d\x70\x6b\x09\x7b\x6b\x09\xbb\x4d\x97\xc7\xba\xa1\x9c\x6a\x1b\xa9\xda\x8b\x23\xfa\xa9\x09\x40\xf4\x53\x0d\x62\x8d\x54\xc5\xb4\x9f\x4d\x02\x13\x55\x51\xda\xcf\x27\xce\x40\xf5\x45\x36\xbf\xf0\x7a\x15\x25\xf2\x7f\x5c\xa8\x27\x31\x8b\xc7\x8b\xcb\xb9\xee\xae\x96\xc1\x15\x6a\x52\x9e\xc3\x81\xcc\xef\x26\x6c\xae\xea\xa4\x29\x80\xe9\x82\x08\x3e\x66\x99\x25\xd8\xce\xd7\x6a\x85\x74\x58\x88\xc9\x6c\x51\x64\x2f\xe7\x2f\x74\xbb\xb8\x17\xa7\xb3\x06\x82\x55\xaf\x61\x1c\x05\x60\x35\x2d\xae\x00\xf4\x79\x2e\x5e\x2d\x41\xce\xc6\x20\xef\x6c\xd9\x6a\x26\xe6\xbc\x79\x3d\x53\xa3\xe8\x72\x72\xf6\x3f\x9b\x59\xe1\x08\x6a\xf9\x0d\x98\x9f\x5a\x08\xc1\x68\xcd\x93\x13\x41\x2d\x67\x82\xee\x9b\xa4\xe0\x71\xb9\x98\x8b\x2b\x17\x9d\x00\x19\xd0\xf2\x24\xcb\xe6\x08\x68\x60\x7a\xab\x1d\x0f\x18\x8d\xc0\x85\xfe\xbd\x4c\x57\xf3\x0e\x39\x26\xec\xc7\x92\xb7\xe2\xe9\x81\x5a\x79\x4e\xc5\x01\x5a\x67\xe9\xd4\x06\xf8\x15\x3d\x32\x26\x3d\x5c\xee\xae\xb0\x32\xea\x1d\x13\x8a\xb8\x6f\xcc\xb4\xc7\x34\x00\x44\x96\x26\x20\xa2\xc9\xde\x03\xcf\xce\xb5\xcc\x03\xd5\x39\x84\xaa\x04\x26\x7d\xdf\x2f\x54\x8b\xc9\xdc\x07\x94\x11\xc5\xdd\xfc\x1c\x1e\xf7\x74\xbe\xae\xed\x7b\x6a\xac\x77\x3c\xdb\x0c\x1d\x9e\x5a\x51\xe0\x9c\x8b\xa9\x07\x6f\x76\x1c\xf6\xf3\xa9\x06\x42\x0e\xa2\x17\xab\x42\x4a\x07\x97\x8b\x1c\xb8\xd8\xb6\x2f\x06\x06\xac\xc4\x0b\x50\xdb\x28\x47\xac\x9d\xb6\xb9\xe8\x8f\xf6\x62\x2b\x20\x0d\x9b\xda\xdf\xc6\xaa\xad\x15\xb6\xaf\xe9\xfc\x2e\x19\x25\x24\x21\xb1\x1b\x2c\x1c\x67\x31\x60\x40\xd5\x22\x3f\xcf\x67\x69\xbe\x02\xde\x7a\x2a\x96\x41\xb0\xdf\x97\x73\x09\xd4\x2e\xe4\x3f\x82\x25\xcf\xce\xb1\x10\x5b\xee\x8a\x62\xf5\x5e\xd3\xd5\x97\x97\xa9\x58\xba\xd0\x36\x5e\x19\xcb\x3c\x17\xa7\x52\x30\x8d\xe3\xca\xfd\xc3\xfb\x01\x63\xf5\x37\x12\x1b\xb2\xd4\x6a\xaa\xb9\x30\xca\x84\x1d\xe2\x4b\x4f\x4d\xb0\x99\xd1\xc3\x06\xe6\xe0\xa6\xd6\xe8\x34\x91\xe3\xba\x2e\x71\x30\xf6\xfd\x73\x40\xb6\x08\xf5\xc4\xdf\xd2\xd8\x23\x9e\x05\xa0\x07\xdd\xcb\x19\x61\x8b\x28\xd4\x51\xe8\x6f\x4f\x8a\xaf\x63\xee\xde\x4b\xda\x66\x09\x64\x3a\x08\x33\x53\x59\xc1\x4f\x41\xe6\x48\x32\x23\x35\x3f\xec\x60\x22\x7e\xf3\xa1\xf0\x03\xa3\xc1\x8d\x19\xd9\x63\x6f\xd8\xd0\xfa\xa8\xb6\x57\xa8\x2f\x96\x0e\x95\xc8\x4a\xba\xbc\x5a\xcc\x94\xd2\x0b\x09\xa9\x2b\xd4\xf8\x86\x36\xad\x65\xf1\x40\x56\x9a\xb5\x71\x70\x58\x45\x74\xfb\x68\xea\x98\x52\xb2\x10\x5d\xd6\x7e\xc5\x33\x01\x28\x5d\x2c\xc0\x92\x50\x8d\x8f\xf0\xe9\x8e\x37\xd2\x92\xed\x82\x56\x68\x44\x88\x22\xb5\x7f\x86\xb5\x34\xba\x99\x29\x45\x97\x5e\x3e\xcd\x80\xae\xf6\xfd\x9a\x3f\xe6\x45\x7e\x32\xcb\x4a\x8c\x0a\x94\x49\x0a\xd9\x6c\x73\x26\xf4\x6e\x87\xae\xbf\x14\x1f\xa8\x3c\x08\xd7\x54\x90\x1e\x77\xfd\xe7\xe5\x0b\xfd\x08\x19\x07\xfd\x0a\xa9\xd2\x71\x99\x7a\xe2\x09\xb9\x9a\x2d\xd2\x69\x54\x14\x55\x16\x0d\xdf\xef\x83\xcf\x0e\x1a\xb9\x35\xc2\xe0\xfc\x65\x76\x04\x4a\xfc\x12\x91\xbe\x20\x42\xd1\xca\x60\x0c\x2f\xd7\x3a\xd8\x53\x42\x16\x43\xb7\xb6\x0e\xf6\xef\x23\xa9\x0b\x65\x10\x5b\x07\xf7\xc6\x95\xf2\x9a\x98\xcc\x85\xfa\x11\x7f\xbb\xcd\x6c\x99\x7f\x1a\x8e\xbb\x81\xd3\xa9\xd9\x96\x47\xab\x95\xd4\x2d\xe1\xfe\x3f\xbe\x97\x9b\x53\xec\xcc\xd3\x8f\xb9\x12\x2d\xee\xa4\x00\xd7\x07\xe2\xa7\x0f\xc4\x4f\x1d\x0f\xd0\x1a\x4c\xba\x12\x13\x64\xe9\xea\x69\xfe\x89\x82\x4d\xa0\x54\x5c\x32\x01\x2b\xaf\x7b\x6c\xc2\xca\x43\x93\x1b\x76\x06\x95\x3c\x5a\x96\xcc\xb3\x02\xb8\x31\xfd\x8e\x82\xac\xc8\xae\x58\x5f\xd2\x89\xe9\x2a\x03\x0f\x92\xfc\x34\x17\x60\x27\x57\x82\xa0\x94\x44\x78\x92\xce\xa7\x40\xc5\xc3\xdd\x76\xa5\xba\x53\xb4\x81\x40\xb6\x95\x63\x81\x04\x25\x50\x2c\x40\xfd\x73\x99\xcf\x66\xc9\x7b\x41\xe6\x8b\x3b\x44\xfc\x95\x4e\x00\x39\x81\x3a\xcd\xc5\x99\xfb\x57\x61\x06\xb0\x4a\xa1\x13\xd5\x9f\xd4\xa4\x48\x3b\x4d\x50\xb4\xb8\x7c\x27\x81\xd4\x61\x52\x8f\x85\xd7\x4b\xfd\x22\x83\x98\x50\xe5\xa0\x32\xe4\x7e\x1d\x40\xd0\xd0\x68\x83\xfa\x4d\x23\x55\xf7\x6e\x4e\x72\xe2\x3d\x5d\x65\xa2\x10\x30\xd0\x58\x01\x01\x5e\x53\x6c\x52\x03\x4c\x9a\xd1\xd4\x80\x33\xf1\x5b\xb4\x33\x01\x1f\xc3\x6b\x7b\xf2\x0f\xb4\x65\xf8\xa1\xf6\xe2\x79\x9b\x62\x82\x09\x6d\xfd\x32\xb5\x51\x23\x8c\x52\x32\x31\x59\x9b\x91\xd8\x6c\x4d\x1a\xe4\x6c\xba\xc8\x9a\x29\xb2\x21\x48\xe1\x08\xe9\x65\xa8\x59\x30\x69\x07\x02\xf4\xe1\x76\x24\x3e\x8c\x76\x53\xae\xb1\x7e\xe8\x7f\x13\xcf\xb1\xfc\x1d\xf1\xc5\xf2\x93\x8a\x90\x61\xb6\xbb\xa8\x97\x63\x5c\x83\xba\xe8\x32\x33\xd8\x72\x62\xc9\x06\x53\xb3\x9d\x94\x25\x55\xa9\x00\x52\x39\x55\xfc\xec\x20\x44\x5f\x56\xfe\xa9\x60\x11\x09\x81\x14\x2e\xa6\x9f\xf9\xf2\xcb\x06\xe2\x28\x1b\xe1\xf3\x21\x17\xe6\x17\x31\x6e\xca\x75\x48\x80\xed\x4b\x57\xee\x47\x45\xf2\x68\xb9\xfc\x5e\xc7\xba\xd9\x48\xb0\x05\x4f\xca\x5c\x99\x7c\x45\x1b\xa1\xc0\x75\xe8\xa5\x1d\xa0\xa6\xae\x3f\x2f\xaa\x56\x8d\x3e\xe1\xba\x1d\x78\xcd\x1a\x08\xd8\x1a\xc8\x97\xea\x86\x6e\x8b\x48\xea\x22\xf2\x99\xe3\x8b\x93\xb3\x2c\x9d\x66\xdb\x92\xb0\x2d\x2e\xd6\xf0\x79\x31\x8e\xb9\x58\xa0\x40\xbe\x36\x51\x97\x15\x5e\x02\x23\x93\xb3\x68\xf4\x1d\xb4\x5d\xf7\xa5\x15\x71\x36\x95\xce\x5e\x46\x5c\xc7\xae\x06\x70\x32\xf9\x84\x99\xaa\x32\xde\x8b\x0c\xe1\xfb\xf7\x1b\xee\x43\x10\x79\xcd\x2b\x88\x8d\x23\x10\x9a\xfa\xc5\x2e\x08\x83\x3f\x64\x78\x7c\xeb\x47\xa4\x93\x52\xc6\x4e\x99\x1c\x15\x4c\x3e\xf6\xa4\xa5\x50\x20\xbe\x8c\x4a\xfb\x10\x66\x88\xeb\x33\xea\xfa\x54\x79\xd8\xfc\xb9\x05\x31\xff\x1a\x6c\x45\x89\xf0\x90\xce\x57\xc9\x0c\x59\xec\x61\x16\x50\x8b\x44\x9f\x4b\x1f\xb7\x52\xe7\x45\xdf\x57\x95\x0f\x3e\xa2\xdd\xfe\x10\x82\x97\x7b\x00\x1a\x40\x75\x07\x6d\x10\xcf\x50\xfd\x61\xc9\x3b\x1a\x53\x12\x6c\x68\xdf\x48\x41\xb4\x98\x78\x3e\x4d\x46\xe0\xf4\x28\x56\x08\xed\x11\x12\x84\x18\x2f\xd0\xbe\x01\x2b\xf1\x9d\xac\x94\xa6\x1b\xdf\x51\xfd\x10\xfc\x25\x19\x71\x2d\xb4\x48\xdb\xdf\x8e\x4d\x24\xd4\x91\xba\x17\xf9\x3c\xff\xc3\x24\xd7\xe8\x1e\x38\xcb\xd7\xd9\xb1\x68\xaa\xae\x4b\x70\x61\x0b\x96\x10\x1e\x8c\x9f\xcf\xb2\xb9\x72\x13\xf9\xcc\xe0\x19\x7b\xa0\x4a\x9b\x0c\x3d\xf4\x2d\x3d\x3a\xe2\x92\xf0\xbf\xa0\x8d\x49\x70\xdf\x0d\xaf\xba\xa8\x6f\x79\x78\xa0\x02\x4f\x53\x8a\x44\x66\x6c\x86\xa4\xc5\xb4\xb4\xaf\x08\x90\xa4\xf7\xf2\x62\xfd\xa3\xcc\x3d\x4b\x29\x72\x5d\x4c\x08\x1b\x19\xb3\x1e\x5b\xa4\x42\x01\x12\xa3\xab\x90\x4f\xd8\x06\xc8\x30\x6b\xbf\xe2\x40\x2c\x98\xe0\x7a\xe7\xe8\x45\x68\xde\x25\x84\x81\xca\xfa\x26\xba\x84\xaa\x5f\x29\x2d\xe5\x58\x8e\x77\x9c\x31\xb2\x19\x59\x03\x8d\x07\x09\x16\x64\x4a\x6b\x38\x7f\x52\x76\xe2\x61\x1d\x3e\x84\x59\x88\x43\x4c\x3e\xc2\xe4\x7e\xd2\x73\x6f\xb5\xdc\x12\x91\x16\x34\x84\x50\x23\xcd\x30\xfc\x67\x14\xc3\x69\x51\x08\x52\xb9\x73\xf7\x2e\xbb\x6f\x74\xb3\x7a\x49\x9b\x90\xcb\xc9\xe2\x54\xdd\x81\xa4\x50\x1c\x6b\x69\xe9\x0a\x4e\xa6\x49\xf6\x29\x2f\xa4\x99\xb1\xed\xd3\x6a\x93\x2d\x96\x52\xc3\x37\x2e\x03\xa8\xda\xe9\xea\x44\xb7\x28\xfd\x37\xc5\xc4\x18\x0b\x82\x93\x25\x6a\x74\x3b\x08\x8a\xfc\x0c\x84\x66\x94\x2a\x77\x21\xd1\x24\x70\x6e\x0d\xdc\xc2\xc6\x7c\x1c\x98\x05\x70\x9b\x91\xbf\xfb\x95\x5f\x18\x95\x02\x92\x19\x0e\xfc\xe7\xe3\x67\x7e\x48\x00\xbe\xdc\xe1\xfe\xfe\x42\x77\xe8\x4e\x88\xed\x25\x87\x3d\x76\xc2\x71\x5b\x37\x4e\x0f\xdf\x31\x50\xcd\x33\xef\x6b\x14\xd9\x05\x3f\x4f\x97\x48\x32\x4c\x2f\x1b\xf8\x25\xe9\x06\x73\xd7\xfc\x56\xf1\x61\xdd\x44\x8b\x42\xb8\x56\x78\x77\x0e\x09\xf7\x2a\x61\xf5\xf8\x37\xcd\xd3\xee\xa8\x54\xa9\x01\x82\xdb\x0e\x13\xce\x90\x2f\x02\xde\x5b\xa7\x4b\xd1\x05\x18\x06\x67\x64\x31\x4a\x88\x20\x25\xfa\xf7\xb3\x8b\x95\x07\x03\x45\x88\x96\xe3\x5d\x85\x43\xfd\x59\x23\x05\x22\xf5\x6a\x46\xf5\xe6\x1d\x67\x15\x8d\xb5\xf4\x8c\x46\x70\xcd\x78\xc0\x94\x8c\x4d\x33\x49\xdd\xde\xb5\xd5\x92\xca\xc7\xb9\xc9\x47\xbf\x7f\x2f\x3e\x6b\x9c\x9a\x87\x48\x9f\x5a\xa9\xf7\x0c\x5c\x97\xeb\x7c\x55\xd2\x4b\x65\xfb\x40\x08\x2a\xb2\x11\x4e\xda\xd9\xa5\xaa\x51\x7c\xc6\x6d\x71\xc5\x3c\x88\xae\xa3\xde\x82\x01\x0d\xdc\xf3\xf5\xb0\xc7\xbe\x1a\xba\x5e\x7c\xe3\x92\xcf\x58\x46\x82\x7c\x8b\x4a\x8f\xbb\x46\x61\xb9\x35\x95\x2e\x96\xd9\x32\xa2\x38\x74\xd2\xa8\x5c\x94\xfc\xac\xab\xf0\x2d\x02\x45\x6f\x54\x19\x5c\xa1\x63\x96\x0a\x62\xee\x4a\xa6\xe1\x3c\xae\xa7\x3b\x7e\xad\xd3\x80\x83\x5a\x94\x2a\x90\x71\x4d\x23\x6d\xb3\xf5\x71\xac\x17\x65\x21\x12\x1e\x7b\x61\x7c\xef\x37\x77\x89\xb7\xc2\x55\xac\x7a\x76\x02\x57\x44\xc2\x66\x33\xab\x62\x3b\xcd\xe7\x53\xe3\x1e\x26\x1d\xcc\x19\xdb\x9b\xc7\x8b\xf3\x28\xbc\xa2\xef\x2d\x28\x12\xeb\xde\xf5\x2f\x5e\xe9\x80\xe4\x17\x06\x04\x97\x64\x7c\xb0\x00\x36\x9b\x69\xc8\x4b\x6d\x88\xa7\x42\x19\x1d\xc6\xaa\xf1\xb0\xb5\x1f\x0b\xb2\xb0\x6b\x07\x4e\x0e\xbe\x68\xd7\x5b\x3d\x2a\xf6\x5d\x62\x61\x37\x47\xd4\x33\x9a\x03\xa4\x99\xaf\x45\x7c\xcb\x1b\x94\x74\xfb\x57\xb0\x35\xb7\x26\xa9\xc4\x50\xf3\x28\x9d\x03\xf5\x0c\xde\x7a\xb4\xcd\x7a\x01\x71\x5a\xb2\xf7\x52\xde\x99\x48\xcb\xf5\x01\xc4\x9d\x20\x9c\x01\xa1\x8e\x7c\x53\x80\xb2\xeb\x21\xf9\x5b\xd2\x1f\x09\xa2\x98\x16\xaa\x57\xe7\x3a\x86\x17\xf1\x74\x61\xe5\x06\x0b\x11\xd3\x0c\xcf\xcd\xc8\x52\x3b\x78\x1c\xba\xd0\x79\xaf\x14\x97\xf9\x7a\x72\x06\x1e\x2c\x97\x67\xf9\x04\xb9\x22\x4b\x07\x48\xe3\xc9\xf2\xf6\xd5\x01\xa1\xf1\xfd\x11\x50\xfa\xda\x68\x11\x60\xb5\x5e\x69\x6f\x2e\x40\x52\xe2\x5a\x4f\xd9\x1b\xd3\xb1\xe0\xbc\x66\xeb\x7f\x64\x57\x3e\xc1\x5e\xc7\x72\x43\x77\x1c\x50\xeb\x49\x72\x22\x2e\xa5\x0f\x87\xdc\xc4\x1e\xbf\xfc\xf9\xc7\x26\x53\x6b\x3e\x46\x14\x3d\xbf\x64\xee\x74\xd1\x7e\x14\x44\xb7\xbf\x60\x4d\x67\xf6\xe4\xc7\x37\x4f\x5e\x1f\x70\x35\xc7\xaf\x1e\x1d\x3d\x71\x93\xae\x39\x6c\xf2\xa5\xa9\xd2\xa6\x1e\xa0\x07\x5a\xaa\xa0\xc0\xc9\xdc\x98\xac\xde\x71\x23\xcd\x4c\x38\x0d\xad\x85\xed\x7c\x15\x53\x22\xcb\x18\x33\x82\x05\x79\x0f\x7d\xc0\x7b\x58\x97\x8d\x93\x3e\x39\x88\x29\xe7\xd9\x37\x98\xb3\xf2\x65\xb1\xe2\x9a\x18\x0b\xc7\xf1\x44\xd6\xbb\x94\x63\xfb\x81\xf1\xc6\x5f\x62\x19\xf3\x95\x7e\xe1\xb5\xfd\x14\x19\x8c\x93\x34\xf8\x88\x58\xcf\xf6\x0a\x23\x21\x7f\x9d\x6a\x10\xef\x52\x45\x91\x47\xe4\x38\x0e\xbc\x45\xb2\x92\x43\xdf\xc7\x21\x44\x17\x4a\xda\xf8\x18\x83\x6b\x1b\x5b\xd8\x33\x17\x17\x7d\x25\xc3\x6b\x2d\xf2\x05\x6f\xfa\x2f\xd2\xf5\x19\x38\x90\x76\xa2\x48\xd9\x4f\x46\x10\x33\x9b\x1b\x8e\xb9\x12\xc2\xa1\xb8\xcb\xa2\xc9\x30\xf2\x79\x7c\x18\x7f\x81\x61\x94\xc8\x67\x60\x9c\x5d\x2e\x65\x47\x63\xef\xd0\xc8\x90\xeb\xe0\x01\x16\x76\xe1\x0f\x79\x22\x46\x62\x36\x51\x43\xf4\x45\xdd\xac\x4b\xd4\xef\x72\x28\x51\x37\x4d\x24\xda\x3f\x14\x30\x2e\x2a\x5c\xcf\xda\x85\xfd\xa6\xe9\x23\x41\xfe\x69\x53\x42\x63\x27\xd6\x3a\x18\xdf\x2f\xb3\x24\xe4\x8d\x05\x6b\x7a\x6b\xd6\xb1\x88\x6b\x1d\x7c\x7b\x3f\xea\xc1\x69\xc6\x2d\x7e\x0e\x3d\x53\xc4\xbd\xe1\xad\x23\xe7\xad\x23\xe7\xc6\x29\x4d\x5e\x5d\xac\xb2\xd7\x52\x07\xf1\x02\x10\xdd\x4f\xae\xe1\x55\x5f\xcf\x22\x55\x6a\x30\x79\x63\x54\xa9\x88\x75\x9e\x9f\xce\x71\x23\xcc\x94\x62\xfc\x17\x4c\x2a\x4d\xa0\x71\x0a\x0e\x52\x52\x3f\x9b\xd8\xb6\xa2\xc4\x59\x14\x7c\x25\xcb\x8a\x9d\x53\x00\xe8\xab\x5f\xd6\xdc\xd6\xe5\xd2\xe2\x1b\xad\x01\x00\x35\xba\x63\xb5\x3a\xcf\xe6\xff\x32\x79\x0f\xe5\xc5\xab\x3a\x54\xae\xe2\xca\xe8\x06\x15\xaf\xd3\x13\xf1\x10\x16\x05\x06\x77\xc8\x9c\xcb\xae\xe4\x06\xe9\x8b\x58\xa2\x1b\xf9\x0c\xf2\xca\x7b\x9d\x9d\x2f\x24\xf3\x06\xc1\x64\x4c\x68\x09\xb0\x25\x55\xca\x68\xc0\xec\xa7\x62\x1a\xa7\x8b\x4f\xc9\xde\x5f\x06\x8e\x27\xd5\x8e\x2c\x36\x5c\x0d\x95\x40\xb4\x64\x7d\x4b\x53\x2d\x8a\x79\x56\x11\x71\xde\xbc\x78\x0e\xfc\xf5\xff\x3b\xd7\xf4\xad\x74\xa3\x3f\x38\xe8\x9f\x2f\x7e\xef\xab\x45\x95\x70\x3d\x03\x90\x83\xf6\x2f\xac\x4f\x3e\x1b\x00\xa3\x36\x17\x8c\xe1\xa1\x2b\xb3\xb1\xa4\x5c\xe1\x17\xf5\x87\x89\xfd\x42\x03\xed\xa4\x4b\xf1\xea\x4d\x25\xd6\x29\x81\x11\x1e\x3a\xda\x1d\x20\xd0\xd5\x1b\xf4\x05\xad\xb9\xda\xa8\xa7\x8b\xd5\x1b\xb3\x35\x05\x5e\x7b\xbb\x8f\x66\xdd\x15\xc6\x0a\x62\xaf\x63\xc2\xb3\xb4\x05\x06\x4a\xab\xe8\x1e\xba\x79\x91\x02\x85\xec\x39\x1f\xf7\xe0\xcd\xa3\xef\x0f\xd1\x83\x9d\x10\xf4\x21\xe3\x96\x87\xc6\xcf\x3f\x5b\xc7\x1c\x9a\x36\xf2\x0c\xa2\xbd\x8b\xe2\x2b\x64\x94\x50\xd1\x6e\x4c\xf6\xba\xb8\x2d\xaf\x8d\x35\xa3\xd1\x93\xf9\xd2\x3c\x7b\x79\x0a\x7f\x76\x7e\x8d\x58\x17\x07\x4d\x32\xd5\xd7\xbb\x6e\x7d\x9b\x62\x2e\x2b\x5f\x25\xb4\x97\xfa\xbb\x12\x9e\x64\xf4\x8b\x43\x7b\x81\xed\xca\x40\x67\x82\xf2\x52\x3b\x5e\x06\x75\xea\x66\xa5\x6d\xaf\xca\xec\xb4\xd7\x6e\x94\x35\xa0\x51\xdf\x2f\x8d\xa1\x04\x6f\x96\x1c\xf4\x5e\x0b\xde\xe8\x96\xca\xd2\x63\x44\xd6\x1f\x83\x54\x6c\x95\x07\xaa\xc4\x44\x15\x40\x6f\x4b\x93\x23\xd7\x4b\xa1\x2c\xee\x8e\xaf\x64\xca\x1d\x1e\xb4\xf6\x89\xb9\x2a\x34\x73\xa1\x57\x1a\x45\xaf\x84\x02\xe8\xd0\x99\xb0\xcc\xfd\x34\xf7\xba\xc4\x83\x8a\x25\xc5\xf7\x53\xd4\x07\xad\x3c\x01\x9d\x93\xcf\x05\x90\x6f\x97\x3e\xdc\xdb\xa5\x07\x55\x19\x91\xd3\xc2\xba\x7d\x70\xd9\x14\xc4\x36\xb8\x45\x52\xb7\xb7\x67\x13\x73\x1d\x43\xf5\xbc\xf8\x87\x7f\xcc\x6b\xa4\xff\xf7\x63\x5e\x7a\xc1\x74\xb8\x7b\xc9\x1f\xf9\x0d\x98\x7c\x23\xc3\x6a\x3b\x6e\x62\xb4\xcd\x8d\xab\xeb\x49\xa3\x82\x05\x89\x0b\x7d\x99\xb5\xf3\x05\x9f\xd4\xdc\xdb\x43\x3b\x2c\x2b\x8a\x02\x75\xc0\x12\xa7\xa7\x3a\x0e\x44\x3c\xd7\xf4\x00\xc0\x74\x20\x26\x08\x3c\x32\xa5\xa1\x65\x92\xc4\x81\x88\x2f\x36\x7e\x8f\x91\x63\x34\x2a\x45\xb0\x35\x3c\xb3\xfd\xeb\x04\xc1\x7a\x35\xc4\x62\xc9\x18\xbc\xff\xe6\x1b\xbb\x7b\x30\x94\xc8\xa7\xd0\xa8\x2e\x68\x47\x76\x30\x68\x49\x6a\x83\xb6\x94\x47\xa0\x2d\x51\x9d\x6b\xe7\x3f\xab\xae\x95\x5f\xc3\xb6\x79\x69\x53\x25\x87\xad\x74\x9d\x6b\xe7\x1e\x7a\x07\xef\xca\x1c\x9c\xff\x78\x3b\x68\xbf\x86\x6d\x13\x8c\x29\xac\x73\xed\xd4\xfb\x90\xa0\xac\xf1\xf0\x1b\xd7\x7b\xdb\x40\xa2\xef\x2a\x08\x79\x6d\x63\x08\x59\xe0\x41\xc0\x03\xe0\xc1\x40\x11\x86\xaa\x99\xc3\xbe\x34\x22\x81\x79\x04\xd0\xec\x75\x09\x82\x11\xaf\x02\xaa\x17\xbf\x36\xcc\x7e\x8f\x4e\x9e\xef\xf8\xef\x9f\x20\x28\x33\x27\x05\xfd\x8d\xce\x01\x2a\x25\x38\x8e\xca\x11\x06\x43\xa9\x8f\xa1\x5e\x99\xde\x6b\x99\x79\xc4\x62\x19\xfc\xf2\xb1\xc8\x2b\x43\xed\x14\x36\xa8\xbf\xec\x60\xf4\xfe\xda\x3f\x1f\x2b\xbe\xca\xcf\xfb\x6f\xa2\x19\x98\xf5\x97\x7f\x8b\xb5\xa6\x01\x0d\xa4\x31\xc1\xf4\x98\x98\x5e\x7a\x06\x06\xe6\x9e\x37\x7c\xa8\x4b\x96\x84\xd3\x91\x28\x9f\x0b\x5b\x53\x1e\x3a\xb9\xc2\x63\x04\xfc\x3f\x64\x9d\x40\x85\x7c\x4d\x8a\x9f\xa6\xe7\xf9\xec\x2a\xee\x02\x20\x63\x26\x3e\xb5\x80\x8e\x36\x09\xa2\x34\x2b\x59\x8d\x4a\xa3\xae\x9c\x3d\x0d\x30\x30\xcb\xe9\x0a\x38\xc1\x03\x7c\x67\x58\xbb\x52\x9f\xe8\xe3\xbc\x48\xb4\x2e\x8b\xf5\x20\x81\x31\x3f\xce\x26\x0b\x95\x3a\xd2\x5f\x3a\xce\x8b\xe5\x8b\x49\xa6\x88\x14\xe1\x98\xba\x71\xa3\xf4\xfd\xb7\x9a\xa5\x07\x2f\xcf\xc8\x6e\x4d\x55\x08\xd2\x60\x63\x1f\x3f\xc0\x42\x60\x3a\xa8\x56\xee\x95\x7e\x64\xcb\x3e\xc7\x7c\x2a\x74\x9d\x34\x7f\xf9\xe4\x37\xb6\xfa\xc0\x36\x74\xd4\x12\x4f\x03\x10\x43\xbc\xaa\xcc\xed\x01\xf9\x8c\x81\x64\x11\x43\x8a\x7b\x30\xd8\x3a\xd0\x11\xcd\xe6\x2f\x4a\x3b\xc3\xff\x12\xa9\x87\x5b\x45\x24\x43\x54\x1f\x50\x9b\xfc\x3d\xa9\xe4\x23\x93\xf8\x91\xb6\xbd\xcb\xb2\xeb\x52\xc8\xcc\x04\x0e\xc6\xc0\x7a\x78\x3b\x7b\xde\xa8\x20\x3f\x0c\x87\x7b\xe4\x40\xb5\x53\x38\x20\xcd\xfa\x75\x04\x1d\x47\xc2\xba\x5c\x16\x5e\x5d\x49\x5a\x8b\x00\x16\xd3\x8c\x20\x3e\x8c\x71\x62\x4c\x2d\x13\x9a\xf4\x26\x48\x73\xa2\x52\xf5\x06\x40\xe9\x6d\x47\x67\x8b\x2f\xc4\x26\xe2\x57\xd1\x59\xdc\xdd\xda\x34\x3c\xfd\x7f\xf9\x2c\x00\x38\x34\x41\x99\xc0\xbd\x3c\x93\x40\x3a\xd7\x2f\xd6\xd3\x85\xb5\xa1\xcb\xf0\x6f\xa7\xa8\x1a\x99\xa6\x80\x9e\xcc\x34\x62\x00\xc9\xa0\x49\x95\x38\x80\xf0\x32\x84\x43\x65\xce\x23\x19\x2c\x7b\x5e\x03\x6e\x64\xdc\x84\x1d\x19\xd7\xe5\x47\xc6\x0c\x43\x12\x30\x17\xe3\x66\xdc\xc5\x78\x73\xf6\x62\xbc\x39\x7f\x31\xde\x8c\xc1\x18\x6f\xc6\x61\x8c\x4b\x59\x8c\x28\xeb\x30\xde\x8c\x77\x18\x97\x32\x0f\xc1\x09\x33\x98\x12\xbd\xd7\x64\xd3\x9d\x1d\xb5\xf6\xaa\x57\x6e\xd2\x60\x65\x1f\xf4\x0d\x72\x12\x4c\x74\xdc\x65\x30\x01\x15\xd3\x7d\xe6\x73\x92\xa1\xa6\x3d\x24\x65\x93\xf4\x99\xbf\x3b\xce\x8e\x43\x4b\x3c\xc3\x7d\xb0\xd1\x0a\x64\x2c\xec\x60\x06\xfa\x1d\x15\x2f\x0e\x4a\x0f\xa2\x57\x44\xe2\x8e\xbf\x22\x6b\x82\x6d\xec\xe4\x31\x42\x96\xe6\x5d\x43\x80\xa1\x6b\x01\x95\xf4\xe3\x5f\x81\x27\xa7\x8f\x46\x8c\xfb\x27\x83\x4f\xce\x03\x99\xe4\xdd\x66\x96\x42\x3f\x8f\xe6\x3e\xd2\x93\xb1\x4c\xc0\x29\x16\xee\xa3\x1f\x96\x6a\xc1\xe2\xf9\x75\x38\xe7\x89\xbd\x07\xd7\x64\xe5\xec\x30\x80\x1e\xc0\x63\x64\x0c\x42\x18\x1b\x44\x52\xc1\xbd\x5e\xa1\x44\xb0\x4a\xe6\x47\x7d\xbe\x22\xb1\xb8\xc1\x1c\xae\xbe\x0c\x2e\x61\x49\xca\x0e\x27\x1a\x0b\x1f\x47\x3d\x33\x6e\x35\xb8\xa8\xe2\x4c\x3c\xf1\xd8\x4a\xf0\x73\x93\x06\x7d\x0d\xe5\x8b\xb1\x99\xf1\x33\x7a\xbb\xe4\xe6\xe3\x09\xd0\x51\xa9\x9b\x8d\xa6\x77\x99\xc7\xfe\xd0\xd5\xf3\xd4\xd9\x61\x38\x14\xdd\x77\x30\x12\x9f\x4a\xc2\xc5\x6e\x2c\xa1\x43\xe3\x16\x51\x6f\x67\x47\x10\x54\x86\xcc\x10\x9f\x98\x67\xd9\x14\xe2\x22\x65\x93\xf4\x42\xa7\x12\x91\x87\x30\x91\xa6\x00\xc9\x69\xbe\x82\xa8\x4a\xf9\xaa\x70\x89\x2f\x7e\x4e\xf3\x35\x04\x45\x92\x29\x2f\x2e\x33\x19\x1a\x77\x92\x2e\xd7\x32\x4f\xc6\xa9\x1c\xb2\xcc\x43\x92\x5a\x9d\x99\xea\xd2\x76\xb0\xd0\x17\x21\x29\x66\xa9\x20\x37\x56\x36\x6b\x9b\xa6\xc1\xac\xaa\x97\x49\x98\x35\x60\x28\x51\x67\x2d\xea\x32\x67\x25\xa3\xfd\xa1\x4b\x0e\x11\xfa\x55\x75\x18\xca\x91\xe2\x66\xb8\xaf\x61\x76\x81\x2a\x34\xab\x61\x6a\xcd\xd8\x32\xa0\x31\x97\xa1\xa8\x37\x2d\xf6\x4c\x45\x4d\xc5\xa8\x26\xdb\x44\x95\x2b\xb5\xf4\xe2\x4c\x3f\x5a\x07\xf7\x49\x1d\xb6\xf0\x10\x75\xf7\x91\x51\x98\xb2\x6f\x69\x1d\x3c\x40\x51\xfa\xcd\x45\x0e\x36\x5e\x43\x57\xac\xcc\x56\xa0\x70\xbf\x51\x44\xff\xbd\xd1\x36\x63\xd2\xdd\x5a\x87\xfd\x5b\x5a\x87\x6d\x60\x2d\xf5\x15\xe3\x13\xbe\x9d\xe7\xff\x79\x91\x3d\x9b\x72\xc3\xba\x90\x75\xfd\x7c\x6a\x80\x55\xe2\x90\xe7\x36\xe1\x06\x3b\xb4\x20\x2d\x47\xfd\xa8\x82\x5f\xcf\x52\xac\x2a\x50\x22\x31\xe9\x39\x56\xce\x25\xcd\x4c\x7a\x54\x23\xcf\xa4\xc7\x5f\xc0\xaf\x60\xd3\x93\x33\xa6\x28\x24\xee\x3f\xd8\x83\xbd\x91\xa2\x3f\x1e\x2c\x08\xba\xa7\x7c\x6d\xa2\xa6\x3f\xda\x8e\x27\x68\xb6\x98\xbf\x92\x42\xef\x63\x71\xea\x67\x53\x95\xdf\x8a\xb7\xb2\x88\x7c\x31\x66\x54\x13\x80\xab\x6d\xae\x11\x98\x6f\x55\xd7\x5e\xa6\x66\x40\xc0\xf5\xd9\xc5\xf9\x49\x1d\xb8\x55\x3a\xf9\xb0\xc5\x00\x83\xf3\xca\xd0\x90\xda\x51\xa1\x0c\x44\xc7\x26\x2a\x03\x11\x8b\x20\x77\xa2\xcc\x38\x46\x9f\xa6\x3a\x76\x5b\xe5\x30\x4a\x9f\x71\x5c\xba\xf5\x68\xe4\xaf\x6c\x94\x15\xd6\x16\xad\xf3\xab\xcd\xc6\xaf\x92\x59\x7a\x76\x66\xcd\x6c\xc8\x2a\x6d\xc2\xec\x79\xbc\x44\x27\x3e\x5b\xd9\x53\xa9\xad\x13\xc5\x7d\xe1\xe7\x64\x52\x46\x8b\x06\xe8\x62\xc9\x80\x5c\xc8\xc8\x39\x37\x67\xd2\x42\x02\x31\x2a\x4d\x95\xf6\x51\x1d\x0d\x83\x70\x8a\xe2\x33\x60\x7d\xe9\x3b\xb1\xe2\x62\xff\xd3\xa2\xcb\x22\x7b\x36\x5f\x6b\x63\x4d\x88\xbc\x72\xb4\x38\x17\xd7\x90\xd6\xbb\x74\xca\xdc\x56\x21\x50\x40\xb7\x0b\x6d\xcc\xdb\x2d\x1d\xcf\xad\x13\xaa\xa0\xd4\x87\x5c\xac\xc4\x46\xb6\x1e\x92\xcc\x30\x61\x72\x2a\xfc\x68\x05\x76\x4e\x3e\x9c\x2c\x3e\xc5\xdc\x68\x35\x02\x03\x95\x67\xbb\x54\x8d\x44\xe1\x5d\x9a\xed\xd6\x00\x7b\x5c\xae\x21\xc9\xc3\x0b\xb4\x13\x74\x49\x55\x60\x7a\x85\x05\x59\x2b\x4d\x64\x0d\x1e\x76\x5a\x2a\x09\x64\xab\x47\xd8\xe8\xd7\xb2\xb0\x8b\xd3\x55\x93\x9a\x4e\x2c\x08\xe5\xdb\xf9\x79\x6c\x6d\x51\xb5\x5d\x5e\x3d\x2a\xc5\x8c\x34\x1a\xd8\x0d\xd9\x43\xc1\x7e\x0b\x82\xf0\x48\x2d\x21\x78\xc6\x40\x35\x88\xd9\xa3\xc1\x27\x27\x0e\xb6\x8d\x34\x65\xae\x97\xba\x3d\x78\xad\xdf\x2c\xde\xbf\x9f\xd5\x68\xbd\x56\x70\x5e\xeb\x1f\xb3\x4b\x64\x57\x58\xda\x81\x77\xc1\xb6\xa5\x69\x17\xb2\xfe\xa2\xd5\x3e\xa6\x7a\xd5\x6e\x10\xf3\xec\x52\xde\x37\x8a\x6a\x77\xa2\x09\xba\x30\x0e\xc1\x0d\xbc\x3b\x28\x78\xd0\x7a\x8d\x34\x4e\xbb\xa0\xa0\x74\xa1\xea\xf6\xa6\xd7\x8c\xeb\xcd\xdb\xfa\x86\xe3\xf3\x83\x08\xd1\xbe\xe9\xa6\xd4\xed\x9a\x5d\xe1\x2f\x6e\x41\xc3\xd6\xb0\x45\x4e\xac\x29\x77\x93\x03\xb9\xd6\x7d\x13\x74\xc9\xc5\x52\xd5\xa4\x2a\x7e\x0c\x64\x11\xab\x12\x8d\xc5\xfa\x23\x4f\xcc\x4d\x25\x0b\x52\xb3\x30\xe9\x82\xee\x0d\x93\x7e\x3c\xc0\x1e\xb2\xeb\x92\x41\x52\x4c\x68\x03\xc1\x3a\x4e\x3a\x10\xf3\x0d\x32\xd1\x0e\x97\x9f\xba\x6d\xcf\x76\xa9\x2c\x26\x6a\x79\xa0\x53\x63\xe8\xc1\x89\xf5\x2a\x6c\x3e\x54\xe4\xba\xd3\x19\x28\x26\xda\x3a\xcc\x06\x1b\x42\x75\x9d\xd2\x1a\x1b\xdd\x4e\x86\x6c\x88\x44\xb7\xb3\x72\x31\x43\x45\x48\xaf\x92\xda\x51\x3b\xaf\x35\x2f\x5d\xa2\x7c\x3e\xa0\xff\xd9\x8c\x0d\x2c\x5a\x19\x98\x2f\x16\xc7\xcf\x04\xdd\x1b\x97\x04\xe6\xab\xb0\x37\xc2\x0e\x33\x28\xb8\x8a\x0e\x30\x19\xc4\x3c\xd5\xc1\x80\x0a\xbc\x82\xb5\x06\xed\x77\x14\x04\x18\x15\x08\x90\x02\xb4\x22\x7e\x6b\xa2\x9d\x43\x8e\x48\x0a\x2c\x77\x00\xd0\x12\xa1\x10\x91\xed\xf1\x1e\x09\xfe\x68\x54\x49\xb0\xdd\xee\x32\x88\x47\xf3\x84\xe8\x90\x1b\x86\x49\xbd\x99\x09\xa3\x7b\xc2\xdf\x4e\x1d\xaa\xd3\x8f\x94\x64\xf8\x11\xa9\xe2\xd0\x3c\x07\x04\xdf\x88\x86\xef\x64\x30\x45\x05\x65\x2d\xef\x59\xce\xb3\xaa\x63\x7f\x7d\x57\x9a\x75\xf9\x1c\xa2\xd5\x98\x8f\x69\xe9\x15\xcb\xc0\x95\xfd\x51\x70\x42\x44\x91\xf9\x96\x61\x14\xf0\x85\xbf\xf5\x6c\x55\x9c\x65\xa7\xa9\x9b\x93\x84\x4f\x73\x99\xe7\xc9\xd4\x99\x68\x06\xba\x12\x3d\xdd\xf6\x7e\x47\x26\xbb\xf0\x13\xdb\xad\x5a\x81\x90\xb5\x5a\x55\x25\xc8\x7a\xc0\xa3\x9e\x9c\x69\x72\x8c\x6e\xda\x86\x5d\xae\x60\x62\x8a\x8c\x5a\xe6\xea\xa2\x00\xca\xb7\xce\xb5\x85\x01\xe4\xf3\x2c\xfd\x98\x05\xa0\xb2\x34\xb0\xe5\x15\xa4\xc1\x6a\x1d\x58\xf3\xca\xd2\x00\xf6\xc9\x7c\x1a\x40\x8a\xb2\x5a\x16\x18\xa5\x06\x18\x9b\x5a\xa3\x4f\xc2\x2c\x61\x93\xeb\x65\x08\x93\xd6\xaf\xbd\xa4\x0d\xb8\x07\xff\x2a\xef\x7c\x30\xcf\x05\x8c\x52\x26\xb4\x46\x4e\x98\x04\x04\x79\xdc\x1c\x57\x6f\x2a\xfa\xe1\x4c\x72\xdd\xee\x20\x13\x5d\xb9\x03\xe8\xb7\x58\xe7\xb8\x95\x31\x6f\xa9\x3c\x69\x9c\x9f\xcc\x80\xc0\x65\x5e\x6a\xef\xab\xc3\x69\x01\x5c\x24\xc0\x9b\xeb\x0c\xc9\xf6\xca\x7b\x5b\x69\x23\x0f\xd4\x1f\x6a\x1b\xf4\x48\x42\xe0\x2f\x59\x86\x09\x01\xfa\xc1\x45\x71\x1f\xe1\x33\xb7\x5c\xe5\xe2\x3e\xbf\x1a\x69\x2b\x1c\x4b\xc1\xa3\x0e\x9c\xe4\xd0\x91\xe2\x6e\xdd\x06\xee\x39\x48\x76\x1e\x26\xe3\xc3\x18\xc4\x6b\x15\xc5\xd8\x82\x20\x43\x58\x49\xa1\x3d\xf3\xf2\x16\xe4\x52\x2c\x61\x74\x00\x62\xcc\x82\x05\x97\xb2\x22\xb4\xc3\x4e\x08\x59\xbe\xe0\x38\xb4\x20\xba\x37\xfd\xe5\x96\x85\xce\xff\xc4\x07\x2f\xb7\x69\x31\x07\x47\xff\xb4\x01\xd9\xdc\x97\x7a\xc9\xd9\xfa\x7c\xf6\x14\xa8\x0d\x33\xe3\x2f\xbd\x90\xb7\x91\x0d\x64\x31\x98\xa4\x28\x63\x3a\xba\x54\xc6\x64\xd8\x12\xee\x10\xbb\xaf\x65\x84\x3d\x2d\xcf\x68\x16\x2d\xa9\x91\xa7\x5b\xdb\xa0\xea\xc8\x86\xd0\xc4\x92\x30\x73\x3f\xde\xe6\x1c\x85\xda\xd4\x72\x5c\x3f\x56\x8e\x35\x54\x56\x57\x88\x66\x66\x0f\x4a\x18\xf6\xeb\x1b\x30\x93\xf7\x5d\x8a\x1f\xf2\xa9\x77\x59\x73\xe4\xbd\xc0\x37\xee\xf2\xb6\x87\xe2\xae\xd7\x0d\xb2\x8a\xb1\xdb\x32\xc0\x4f\x1d\x1e\x18\x79\xed\xb8\x16\xfa\xd9\x0b\xda\xb8\x97\x8f\x6b\x65\x9e\xc0\xa0\x19\x7a\x05\xbd\x76\xe4\x39\x0c\x4c\x55\xd0\x8b\xc8\xb5\x53\x4f\x63\xd0\xca\xbe\x8e\x5f\x78\x8b\x8f\x52\x11\x55\x64\x1d\x75\x8c\x29\xfa\x35\x55\xc8\x5f\x21\xee\xe8\xb2\x91\x12\x25\x8c\x78\x2f\x38\x4b\x7b\xf7\xe1\x2e\xbe\x60\xa8\xd1\x1b\xd7\x2b\x36\x65\xa3\x07\x12\xbb\xb1\xd8\x6b\xe1\x43\x76\x15\xa9\xd1\x67\x11\x3d\x04\x8e\x03\x93\x1c\xca\x2a\xb4\x73\xa3\xa6\x72\xd6\xa0\xd8\x0e\x9f\x5a\x31\xd6\x36\x3a\x54\x83\x3c\xc5\x8f\xac\xdd\x1f\x71\x0b\x1f\x6f\x30\x52\x65\x85\x58\x66\x3d\x45\x47\xae\x95\xa3\x62\xd4\xbf\xfa\x67\xd7\x85\x34\xc7\x4b\x5f\x7e\x9e\x31\xc1\x65\xdb\xa3\x09\xbe\xb3\xb6\x8f\xc9\xb3\xd3\x44\xc9\xe2\x50\x06\xed\x4e\x3e\x9f\xe6\x2a\x75\xf6\xc9\x55\x72\x79\x96\x49\x3a\x0b\x0c\x8e\x94\x03\x58\x3e\x9f\xcc\x2e\x04\x77\xa3\xb4\x6c\x5d\xc1\x22\xcd\x2f\x04\xeb\x7f\x25\x2e\xff\x2b\xf0\x61\x31\x7d\x6b\xfd\x63\x21\xad\x04\x64\xc8\x8d\xf5\x42\x66\x81\xd3\xf3\xb5\x00\x9e\x10\xc8\x21\xf6\x5d\xf6\x61\xae\x78\x99\x48\x08\x67\x83\x68\x88\xf4\xe1\x5e\x21\xf2\x61\xca\x9b\x15\xf6\x71\xda\xca\x47\x6b\x07\xc5\xd5\xb3\xb6\x0a\xca\xba\x19\x5e\x55\xe4\x63\xfb\x93\xed\xd4\x2e\xa5\x8b\x78\x3c\xea\x25\x93\x7c\x35\x71\x27\xcb\x75\xd1\x4e\x10\xbf\xa9\x17\x85\xd4\xea\xbf\x6d\x4c\x55\x4a\x62\x18\x2e\xf9\x89\x8c\x51\x1f\x12\x1a\xa6\xde\x21\xa5\xe5\xab\xf3\x42\x72\xb3\x70\xbf\x42\x9c\x4e\x23\x50\x5d\xc0\x0d\xf8\x11\xdc\x58\x5c\xd8\x16\x83\x4b\xcf\xe6\x2f\x25\xaa\x3d\xe4\x3e\x4e\xbd\xc1\x09\xc0\x60\xbd\x78\xbb\x14\x2b\x77\x94\xca\x10\x6f\xc0\xd1\xb7\x5e\x3f\xfb\xfb\x0f\x6f\x5a\xe5\xe8\xe6\x07\xba\x6e\x10\x71\xba\x40\xe1\x9b\x59\x04\xc4\x14\x5a\x1d\x2c\xdc\xd2\x58\xf0\x67\xd9\xf1\x91\x7d\x6e\x1a\x54\x9d\x04\x53\xc7\x81\xcd\x5d\x34\xf3\xeb\xa4\x41\x26\x72\x50\x6f\x12\x1e\x8e\x98\x69\x38\xa7\x22\xa7\xe3\x46\xde\x44\xa6\xd0\x97\x99\xd7\x52\x45\x62\xbd\x89\xcd\x86\x39\x5f\x24\x60\xe5\x04\x3e\x94\x89\xb8\x5a\x33\x6c\xd4\x09\xa6\x99\x90\xd3\x41\x99\x75\xde\x91\xbe\x3b\xcc\xb0\x50\xa9\xd4\x04\xe8\xbf\x7f\xc2\xc9\x09\x6a\x52\x25\x41\x90\x3a\xa3\x12\x85\x33\xa0\xfc\x89\x1a\x29\x25\xc8\x50\x0e\xc9\x95\x55\x73\xb1\xa4\xf6\x85\x76\x14\x68\x73\x96\xcd\x32\x71\x28\x87\xd7\xa2\x48\x25\x89\x65\x02\xff\xc2\x2e\xc8\xe8\xbf\xe7\xe2\x8d\x5b\x4c\x21\x35\x0e\xbc\x84\x7a\x14\x62\x1f\xcc\x8d\x23\x8d\x64\x97\xc6\x44\xcd\x86\x4f\x36\xd1\x84\xb3\xd5\x6a\xb1\xea\xe8\xfe\x39\x3d\xcc\x4f\x8a\x5b\xc0\x4a\x13\xa5\x2c\xdf\x08\xa7\xac\x90\xec\xab\x39\xc3\x11\x72\x34\xb4\x9f\x35\x91\x3d\xa9\xf5\x6c\xcc\x02\x96\x0f\xce\x18\x33\x7f\x50\x8b\x89\x5f\x95\xbc\x90\x89\x73\x8e\x2c\xb2\x34\x3c\x89\xcd\x0e\x47\x03\x0b\x00\x32\x2e\x62\xff\x1e\x44\x94\x55\xc8\x1d\xe9\x5b\x55\x82\x23\x5c\xb4\x4b\x7b\x97\x1c\xe9\xf9\xa9\x0b\xaf\x10\x6c\xa2\x20\xc4\xe0\x2e\x51\x46\xfc\x82\xe2\x9a\x28\xc6\x42\xdc\x2d\x39\x48\x89\x60\xa7\x93\xb7\x05\x28\xe7\x94\x0f\x03\xe4\xcb\x55\x7d\x5d\xc8\x79\x48\x4a\xef\x22\x07\xe7\x4b\xf9\xea\xc2\x4f\xd9\xf9\xc0\x21\x02\x31\x92\x09\xf1\x81\x54\x53\x4f\x84\x68\x84\x2f\xdf\x9f\x80\x60\x8f\x09\xf2\x85\xd7\x73\xeb\xbe\x0b\x16\x8b\x23\xf6\xe3\xc8\xec\xa7\x64\xca\x17\xcb\x3a\x13\xbe\x89\x61\xee\x7c\xf3\x0d\x94\x7c\x93\x7c\xaf\x9f\x93\x13\xc1\xee\xc9\xed\x33\xfc\x05\x44\xbf\x83\xdf\x13\x82\x34\xe0\x17\x20\xc3\xa0\x9f\x41\x06\x66\xad\xd4\x53\x3d\x29\x7b\xed\x1e\xd7\x68\x9d\x7e\x10\x3d\x6a\xf2\x01\x52\x14\xe9\x86\xba\x8d\xfc\x16\xdc\xaf\x85\xea\x49\x93\xfc\xe9\x3c\x3f\x4f\x95\x5d\xac\x61\x1b\x24\x0d\xf7\xcd\x8e\x5b\x67\x2b\x07\x08\x57\xd9\x56\xb9\x35\xde\xd9\x91\x28\xaf\xac\x5c\x01\xdf\x25\xc5\x28\x93\xa3\x17\x68\x13\x4e\x74\xf4\x8f\x87\x0f\x71\x38\x78\x77\x4f\x20\xf6\x0a\xb6\x63\xb5\x8e\xe3\x81\x96\x6d\x44\x46\xf7\xd6\x8b\x42\x1b\xf4\x2e\x98\xf1\x4e\xe8\x71\xe2\xa4\x18\x91\x7e\x65\xdd\x46\x5d\x3b\x41\x47\xc4\xf3\xe1\x58\xcf\xb7\xb4\x6f\xbc\x28\x61\xf7\x4f\xe6\xd3\x48\xe7\x4f\xe6\xd3\x8d\x46\x5d\xdb\x19\x68\xc3\x97\x24\xb8\x92\xa1\xeb\xc8\x85\x8c\xdc\x84\x18\x7c\xb8\x96\xb3\x50\xdc\xcd\xe7\x22\xad\xe1\xe6\x73\x4d\x27\x1f\xd6\xc5\xa7\xc2\x97\x07\x16\xee\x37\xff\x8e\xc6\x0e\x3d\xbf\xf1\xdb\x12\xd9\x1a\xb8\xda\x2d\xc4\x17\xdf\x1f\x8e\xb8\xfb\x04\x5b\xe6\xb9\x4c\x35\x71\x06\x52\x86\x6c\xe1\xae\x19\xfb\xba\x48\xec\x6b\x62\x84\x69\xd4\x0b\xd8\xbe\xf2\x4b\x79\x20\x67\x6a\x94\x7e\x8d\x50\xce\x65\xfe\x3c\x31\xfb\x7f\x51\x7f\x3f\x88\xec\x7c\x4d\xe7\x1f\x26\x22\x34\xeb\xd5\x13\xb8\x32\x88\xf2\xfd\xbd\xf2\xe8\xcf\xe3\xdb\xe8\xcf\xb7\xfe\x3d\xcd\xfd\x7b\x36\x75\xda\x79\x74\xb1\x5e\x28\x29\x03\xeb\xb3\x03\x56\x58\xa2\x4d\xa6\x5d\x64\x88\x63\xca\x1b\x81\x71\xe2\x66\x48\x1b\xba\xa6\x98\x66\x9e\x73\x0a\xe3\x8a\xb2\x5c\x79\xde\x24\x46\x61\x50\x1e\x44\x53\x99\x01\x55\x43\xae\xf5\x40\xea\xb8\x6a\x2c\x2e\x99\x08\xa0\xdb\x8e\xb7\xa9\xbe\xa2\xb2\xcc\x6e\x33\x6e\xa4\xb1\xae\xc1\x2a\x63\xf1\x29\x41\xa0\x8e\xf7\xfc\x8f\x6d\x66\xb1\xae\x5e\xc6\xe2\x6a\x3e\x51\x8b\x0f\xa7\xef\xf8\x2c\x15\x37\x31\x26\x72\x1a\x58\x52\x56\x19\x2e\x46\xcc\xd3\x56\xfa\x81\xa3\x21\xa6\x88\x31\xe2\x59\x3e\x9d\x66\x38\x08\x54\x24\xfa\x16\xb6\xa1\xa3\xcf\xf3\x21\x5e\xe3\xad\xdb\x14\x21\xa5\x98\xb5\x4e\xc1\x1a\x31\x05\x83\x71\x1c\x43\xe2\x72\x64\x64\x00\xbb\x6d\xa1\xe0\x97\x67\x23\x1a\x8f\x6f\x87\xcf\x08\x32\x75\xc2\xc5\x9e\x5d\x13\x28\xfc\x3c\xdb\x26\x28\xda\xcc\x86\xc5\xcc\x5d\x59\x8f\xe0\xd9\x49\x5f\x1a\x31\x13\x1a\xfc\x0d\x8f\xcb\xda\xbc\x48\x15\x64\x3d\xbb\x11\x9d\x77\x98\xcc\xff\x91\xe9\x10\x23\x24\x8b\x80\x3c\xfa\xc5\x91\x2f\x82\x7a\x1e\xe2\x7d\xf1\x8d\x03\x6a\x98\xb3\xf4\xf8\xc3\xaf\x78\xee\x33\x9c\x23\xdb\x63\x10\x2a\xfb\x47\x10\x3d\x8a\x1e\x5d\xa7\xcc\x78\xa9\xa7\x9c\x08\x16\x64\x61\xc8\x7b\xc1\xa6\x4a\x51\xaf\xf8\x57\xf9\x5e\x48\x42\x5f\xf4\xb0\x4a\x01\x43\x4d\x5b\x31\x79\x05\x6c\x3a\x2f\x50\xd4\x7a\x14\xb2\x5e\x5e\x2f\xa5\x43\xa5\x9b\xe7\x96\xa4\xcc\x3a\xd8\x19\xf0\x96\x72\x4e\x25\x39\x4d\x1c\x69\x2e\xf1\x7c\xc0\xa4\x0c\x66\x53\xff\xb2\x42\xb3\xd0\xc5\x5e\x45\xdf\x57\x26\xcc\x20\xd5\x35\xd6\xca\x44\x5f\xde\x58\x3f\x11\xea\xcb\xd4\xbd\x50\xae\xc2\x5b\xdb\xa7\x1c\x5d\xcd\x4a\xd5\xa1\xb6\x07\xdd\xa6\xfa\x0b\x8e\xde\x18\x48\xd2\x0f\xed\x22\x32\xa3\x75\x61\xe2\xda\xfd\x11\xbe\xdf\xe5\x0b\xe9\xbd\x63\xc8\x90\x56\xad\xc5\x4f\x81\x99\x0a\xae\xc0\xaf\x45\x3a\x7d\x39\x97\xe1\x15\x69\x5a\xc8\x72\x33\x97\xc4\xdd\x73\x7c\x42\xe7\x0a\xad\x25\x5e\xb6\xf2\x08\x84\x6a\x29\xb5\x51\x43\xdd\x45\xe0\x17\x1a\x1d\x5b\xb4\xce\x8e\xa0\x0a\x85\x6d\x62\x16\x41\xc2\xc8\x26\x69\xdd\x6b\x48\xf7\x95\xe9\x91\xeb\xbe\x08\x95\x06\xa6\x88\x66\xc4\x36\xd7\x36\xfa\xaa\x3d\x67\xe8\x48\x95\x90\x25\x2e\x87\x97\xc9\x10\xc5\x40\x91\x3c\x51\x5c\x2f\xf3\xec\x52\xe1\x54\x42\x44\x1e\x0a\xab\x2b\x84\xf4\x0a\x08\xd9\xa6\x89\x33\x0d\x7c\xb6\xfa\x08\x0d\x6d\xa5\x6e\x6c\x64\x5c\x9c\x5d\x5a\x30\x3f\xa2\x91\xf6\xce\x51\x49\xaf\x89\x53\x0e\xba\x44\xe4\xb7\xed\x92\x19\x70\x7c\x11\xe1\x4f\x68\xf0\x62\x02\x19\xa1\x7e\xd0\x63\xb1\x1f\xa3\xe3\x86\x2f\xda\xb6\xf1\x68\x79\xe6\x59\x72\x9f\xa1\x81\xb8\x89\x58\x03\xbf\xfb\x91\xa4\x6d\x14\x08\xd4\x08\x6e\x10\x9e\x78\xc5\x97\x8a\x34\x53\xf0\xb0\x78\x10\xa4\x86\xdb\xf8\xcd\x60\x5f\x89\x1a\x79\xe8\xbe\x44\xa4\x45\xfe\xa2\x31\x95\x8c\xbc\xe8\x06\x02\xbe\x3b\xd7\xb2\x8f\x16\x33\xfd\xc9\xfa\xb2\xff\xc8\x99\x23\x1d\x91\xf0\x30\xe5\xf2\x27\xc3\x79\xd6\x8a\x0f\x13\x32\xc0\xad\x83\x07\x23\x5f\x5a\xb3\x7b\x2b\xad\xb9\x95\xd6\x7c\xd5\x5c\x5d\x1b\x44\x59\x69\x92\x7d\x4b\x9a\xf4\xbd\x48\xe7\xf9\xf2\x62\x96\xae\x17\x2b\xb6\x0d\xc0\xf4\xcf\x1d\x90\x69\xfc\xec\xfc\xfc\x42\x90\x6e\xf9\x4c\x50\xd0\x3f\x64\xb3\x20\xc0\x89\x6a\x9e\x23\xa8\xfe\x99\x04\xb3\x91\x54\xae\x96\x8b\xf7\xab\x74\x79\x76\xc5\xcf\xcd\x56\xdb\x64\x61\x7e\xde\x23\xd4\x28\xd3\x75\x7d\x1d\xbf\xda\x84\x78\x11\x43\x56\xe0\xcf\xb5\xa3\x0d\x6a\xa3\x40\x8b\x9d\x53\x01\xa4\xdb\xf5\x95\xd5\x77\x17\xa3\xad\xb4\xc3\x12\x0f\x99\xec\xa1\xa3\xb9\x55\xf8\x47\x99\xf2\xd8\xab\x11\x7e\xa2\xcc\x51\xc6\xd4\x44\x6f\x07\x84\x46\x43\x56\x59\x1e\xe1\x24\xde\xaf\xe4\x89\xb4\xb1\x68\x9b\x00\x23\xf2\x13\xda\x3f\x68\x81\x82\x9c\x82\xaa\x03\x94\x99\x6d\xe0\xe9\x8a\x65\x36\xc9\x4f\x73\xb0\xe5\x98\xcb\x12\x32\x1a\x80\x18\x98\xc4\x8b\x1a\x57\xdd\x8a\xd4\x14\xe5\xb9\x06\xe5\x49\xa3\x6e\x22\xa2\x4c\x9d\xe8\x1d\x67\xc0\x72\xd7\x08\xac\xa2\xfd\x15\xc9\x6e\x36\x0a\xea\x71\x22\x78\xd2\x95\x14\x34\xa4\xa7\xe0\x26\x6a\xc2\x7a\xd4\x0d\x9d\xd2\x28\xc9\x90\xd4\x88\x3e\x01\x75\x73\x0d\x38\xad\x55\xad\x4c\x36\xa4\x55\xa4\x71\x38\xed\x3e\x52\xb6\xdc\xb5\x03\xd9\x14\x99\xc0\x85\x69\xb4\xb7\x3b\x5b\x93\xa4\xe2\xf5\xff\x4c\x6d\xfc\xdc\xa6\xda\xdd\x33\xec\xfa\x86\x29\x88\xf0\xbe\xa0\x26\xae\x98\x83\xf7\xb5\xde\xb8\x98\x4b\x49\xe4\xab\xb2\x71\xb1\x84\x77\xb2\xc9\x6d\x49\x8d\xe1\x10\x05\x01\x59\xaa\x02\xb6\x48\xad\x19\xd1\x3d\x93\x21\x1d\xa9\xbb\x80\xd9\x56\x5c\x43\xa4\xa5\x6b\xb8\x27\x62\x3e\xf5\x8e\x25\x52\x97\xf5\x1b\x0b\xac\xf2\x23\xe8\x9b\x4f\x5b\x42\x38\xe8\x53\x7b\x83\xc5\x5a\x38\x08\x6a\xf3\x69\x96\x47\x87\x69\xd7\xc1\x7b\x69\x77\x83\x09\x36\x8c\x57\x90\xc6\x39\x19\x8d\x53\xb3\x75\x14\xee\x45\x6e\xa2\xd9\x60\xc8\x73\x5d\x6a\x5d\x6d\xf4\x2d\xf8\xc6\xf8\x30\x87\x63\x08\x40\xac\x78\x51\x9d\xe8\x92\xa6\x3e\x84\x35\x88\x35\xe7\xb7\xa4\x6d\x08\x63\x51\x23\xde\x88\xba\x62\x7f\xd9\xa2\x38\xbd\x4e\x62\xa2\x3a\x49\x86\xdc\x93\xe2\xa0\x5c\x99\x83\x2b\x77\xde\x25\xde\x6c\xbf\xf9\x7e\x6a\x1e\x9c\xf3\xb4\x26\xa0\xce\x74\xdc\x40\x7b\xd7\x53\x42\xd3\xde\x70\xe1\xc5\x9b\x39\xd7\xba\x9b\x2c\x80\x95\xa5\x18\xb6\xbe\x23\xae\x46\x32\x07\xa6\x0b\x90\xda\x82\xcb\x49\xb4\xe2\x42\x8a\x5b\xa4\x43\x8a\x0c\x53\x54\xa5\xea\x70\x83\x6f\x90\x8a\x07\xa5\xde\xc1\x69\x76\x1c\x46\x10\x3f\x5b\xb7\xc5\xf6\x97\xd9\x45\x9b\xd6\x86\x66\xe0\x09\x3d\x69\xdd\x72\x73\x9e\xb5\x7a\xed\x54\x80\x31\x92\x69\xc7\xae\x83\x53\x94\x10\x55\xc8\x04\xdd\xbb\x48\x21\x42\xaf\x63\x04\x6f\x9c\xfc\xf4\xae\xa0\xc0\x19\xb8\xa7\xf0\xf6\x49\x0e\xec\x8e\x7b\xa0\xfe\x6d\x23\x20\xdd\x7e\x7a\xb0\xe1\xed\xa2\x13\x6a\xb8\x28\x3b\xa6\x22\x1c\xf3\x0f\xf8\x0c\xfb\x8c\xce\xe0\x34\x9d\x66\x9d\xa0\x54\xa6\xd0\xc9\xe6\x1d\x3c\xed\x5e\x32\x1c\xec\x75\xe1\x7f\x47\xfb\x48\x7e\xa7\x41\x68\x38\x7c\xfe\x33\x7e\x6f\x0f\x82\x6c\x27\x64\xac\xe8\xf2\x01\x87\x27\x7f\x36\x7e\x5b\x3a\x02\x7c\x8a\x5c\x6b\x36\x32\xbf\x7e\xf2\x45\x23\x9c\xca\xc3\x94\x1a\x83\xf9\xa8\xe1\x26\x8e\x98\x1f\xe4\x5c\x7a\xbd\x58\x38\xc5\x52\xc8\x28\x2a\xdd\x8d\xb5\x9b\xd2\x6e\x66\x64\x9d\xcc\x33\x52\x37\x1a\x07\x68\xd7\x8e\xa5\x3e\xce\xb1\x95\x03\x59\x08\xc3\x50\xcf\xcf\x53\x0d\x63\x49\x44\x88\xfd\xb3\x3a\x56\xd1\x2c\x70\x66\x47\x60\x60\xe0\x63\x82\x62\x3c\x17\xa4\xe3\x05\xb8\xcd\x4c\xc4\x17\x89\x2e\xef\x67\xfd\xc6\x7b\xdf\x53\xc5\x2f\xb2\x69\x7e\x71\x6e\x1f\x7b\xe9\x1c\xf6\x3a\x15\x65\x05\x8a\xf5\x22\x16\x72\x75\x9c\xcd\xc4\xf5\xe3\x6b\x11\xcb\x42\x88\xc4\x35\x8c\x2e\x65\x95\x7e\x79\xcd\x66\x7e\x17\xe2\x99\x77\x90\x10\x81\x63\x57\x07\x05\x59\x61\x60\x7f\xc0\x7a\x45\xd3\xe6\xdc\xd2\x33\x4c\x8b\x17\x1e\x59\x13\x86\xad\xb1\x41\x6b\x4c\xc1\xce\xce\x1b\xb0\xee\xd3\x56\x83\xd6\x08\xd0\x58\xfb\x4e\x17\x92\x13\x16\x28\x08\xec\x72\x5a\xac\x4d\xe6\xeb\x95\x5c\xea\x81\xed\xe5\x38\x13\x88\x71\xb6\x5e\x2f\x0f\x76\x76\x04\x46\x4f\x3e\x98\x45\x04\x1a\x70\x47\xca\x5b\x01\xad\x76\x46\xf7\xc7\xdf\x3e\xb8\xbf\xfb\x2d\xc6\x3e\x8d\x04\xf2\x6f\xb1\x15\xd9\xee\xb4\x33\x14\xc7\x58\xfc\x5f\x97\x4f\x60\xc5\xb8\x9e\x97\xf9\x9b\x7b\x22\x0a\xf0\x92\xd3\xac\xaa\x76\x73\x0f\x1c\xcf\x83\x3c\x0f\x6a\x92\xc9\xab\x59\x3a\xc9\xf4\xb7\x14\xbb\x03\x82\x03\xc9\xac\x5a\xd2\x68\x10\x10\x4b\x4f\x57\xe9\x7b\x3c\x4c\x1a\xf3\x45\xb3\x4d\x62\xec\x9f\xc9\xa4\x0e\xa8\x13\x15\xca\x7d\x60\x89\xb0\x2f\x62\x90\x9f\x99\x8a\x5e\x49\x47\xc6\xe0\x42\x3a\xbc\x11\x71\x0f\x92\x6b\xf9\xf9\x1b\xfc\x99\xd4\x77\xdc\xa2\x12\x25\x83\x75\xe5\x7a\xba\x78\x86\x2e\x2e\x91\x72\x70\x49\x63\x7d\x9c\xc7\x82\x62\xb5\x1c\xa9\xc2\x6d\x30\x43\xc9\x3b\x89\x07\xd0\x9a\x5d\x0d\xa0\x65\x39\x86\xc6\xcc\x27\xef\x48\x1e\x68\x1e\xfd\xfb\x1e\xc7\xed\xf1\xd3\x44\x87\x0f\x96\xd3\x9d\xf2\x9b\x2d\x2b\xd9\xb4\x10\x2c\xeb\xce\x55\x2b\x27\x93\x88\xdf\x81\xaf\xa8\x62\x18\x5e\xde\xb1\xd9\x36\x66\x69\x6f\xfe\x9b\xbc\x45\xbc\x2f\x4b\x08\xea\xb0\x23\xc0\x91\x0c\xd7\xaf\xee\x75\x63\xd7\x72\x6a\x0d\x9c\xa7\xd9\xc7\x7c\x92\x39\x9f\x00\x9c\xdb\x4a\x42\x74\x43\xcd\x9c\xe1\xfb\x49\xf6\x2a\x32\x33\x32\x92\x4d\xad\xfa\x63\x06\xed\x9e\xe0\xa1\x64\x04\xa6\x9f\xed\x18\xff\xa3\x11\x68\x21\x46\x7c\x01\x48\x27\xa5\xb6\xcf\x4f\x91\x18\x41\x69\x9d\xa2\x22\xe6\xd6\xc1\x48\x1a\x19\x7b\x72\xeb\xd6\x81\x4a\x26\x10\xb7\x3d\x0e\xa4\xe3\xa2\xe2\xdb\xca\xb4\x04\x81\x14\x1f\xea\x47\xae\x9e\x11\xd3\x03\xc4\xfd\x48\xb2\x82\xbd\xdb\x64\x05\xb7\xea\xb1\x3f\xd8\x98\x79\x13\xdd\xd8\x75\xf4\x5d\x9b\x68\x9f\xc4\x72\x3d\x9b\xf8\xc0\xc0\x25\xf4\x21\xe0\x54\x9d\xec\x00\x4d\x54\x7a\x12\x58\x2c\xfc\xff\x96\x11\x0f\xc0\x25\x15\x89\x5c\x55\x61\x87\xda\x98\x41\x83\xdf\x0d\x34\xe2\xee\x87\x82\x74\x93\x71\x9d\x88\x1c\xd4\x44\x52\x50\xff\xaa\x97\x3b\x57\xc2\xe5\xff\x4d\xaa\xee\x48\xb1\xde\x97\x43\xa3\x71\x5a\x08\x0e\x66\xfe\xfe\x91\x1c\x4b\x43\xdd\x53\xd8\xb4\xda\x94\x7c\xbb\x3a\xa8\x80\xab\x2a\x53\x7a\xd4\x0a\x37\xaf\x61\x6a\x26\x03\x38\x72\x01\x04\xb6\x90\x37\x40\x70\x68\x79\xd9\xe0\x50\xf0\xa2\x1a\x8a\x27\xf0\x11\xdc\x9a\x76\x4a\x7a\xd8\x5d\x5f\x87\xd5\x40\xef\xd4\x50\x67\x42\x4e\x0b\x17\xa0\x06\x1d\x9c\xba\x1a\x16\xee\xf8\x70\xea\x15\x53\xf6\xbb\x7f\xd0\x78\x83\x7e\x30\xd3\x89\x5a\xf4\xdb\xca\x88\x13\x98\xbb\x2d\x38\xe3\xd4\x2d\x86\x46\xbf\x64\x0c\x87\x2e\xa9\x48\x31\x08\x06\x1e\xa6\xa1\x8a\x8c\x3d\xe8\xaa\x1b\xb7\x7c\x6a\xe4\xff\xb0\x41\x70\x06\xcf\x52\x8b\x1c\x6b\x2f\x66\xcb\xc4\xe6\x18\x76\x2c\xa7\x0c\x6d\x98\xae\xe6\x2a\xde\x74\xfb\x97\xc5\x45\x72\x06\xc2\x7c\x08\xec\x20\x5d\xa0\xd3\x39\xbd\x2a\xa4\x6f\x72\xaa\x38\x6e\x59\x33\x50\xe6\x02\xcf\xa4\x07\xe6\x4a\x9c\x90\xf3\x73\xd0\xad\x4c\x93\x2b\xd1\x17\x90\x64\xd2\xc5\x58\xcc\xd7\x05\x8a\x10\xef\x8d\x12\xd0\xa8\xa6\xd0\x4b\x01\x96\xda\xdc\x9d\x5c\xb8\x88\x11\x2e\x66\x04\x8c\xb8\xa3\x87\x1d\x37\xcb\x13\x1b\xf6\xbd\x7f\xc3\x3a\x92\x28\xac\x65\xc3\x3b\x04\xe7\x90\x29\xb5\x42\x51\x23\xf5\x36\x31\x13\x29\x00\x31\xb6\xf5\xee\x7e\xda\xb1\x5f\x49\x2d\xaa\x91\x50\xdb\xff\xa0\xad\x8b\x45\x71\x9c\x18\x49\xed\x96\xc2\x9c\x63\x45\x67\xb8\x79\x87\x64\x33\x80\x5e\xe1\xb6\xc1\x96\x37\xd8\x00\x66\x91\xb1\x28\xbf\xe9\x72\xd9\x21\x30\x4b\x96\x9b\xba\x4d\x3c\x90\xa4\x3a\xf8\xa7\x74\x95\xc3\x10\x8b\x98\xfa\xb9\x72\x19\xa9\xee\xa9\xcc\xa3\xa9\x41\x90\x69\x17\x2f\x3a\x9f\x83\x48\xb6\xaf\xc2\x46\x9b\xe3\xe4\x42\xb5\xe9\x3c\xe3\x1b\x7e\xa6\x3c\x68\xb5\xf3\x2b\xc1\x0b\xa5\xe5\xba\x58\xa4\x6e\x7d\x65\x6a\x40\x72\x61\xcb\xcb\x7c\xb7\x02\x42\x4c\x89\xa8\xb8\x2b\x02\x35\x22\xa2\xf7\xf6\x3e\x0d\x2d\x0d\x3e\x23\x33\xc1\x6a\x8a\x1a\x15\x7b\x0f\x55\x7e\x04\xee\x4b\xb0\x3f\x06\x40\x5c\xb4\xeb\xc5\x39\x02\x68\x20\x9c\x46\x6d\xe2\x62\xea\x4d\x04\xd5\x3b\x93\xa2\xe8\x1b\x98\xbe\x5a\xb2\xbe\xf8\x6c\xff\x72\xb1\xfa\x20\x16\xb7\x9f\xcf\xfb\x93\xb3\xd5\xe2\x3c\xeb\xc3\x8d\xde\x57\xde\xdd\x7d\xc1\xe4\xf5\x75\x28\x79\x35\x86\xbe\x78\x30\xfa\xf0\x5c\x50\xdc\xa9\x94\x7d\x73\x18\xf8\xb3\xf8\xd0\x0b\x49\x66\x7e\xae\x42\x20\xa0\x46\xeb\xa0\x8f\x81\xf3\xbf\x09\x33\x97\x87\x63\x23\x9c\x97\x91\xc5\x83\x80\xe5\xba\x4f\x98\xc5\x0f\x86\x66\xfb\x1c\x47\x42\x5e\xe7\x67\x51\x13\x5d\x9b\x4a\x93\xe8\x7f\x0e\x2e\xae\x1a\x2b\xc5\x1d\x20\xac\xa1\x89\x82\x7b\x1a\x9a\x24\x39\x15\x74\x58\x00\x6f\xaf\xcf\x1e\x7a\xc6\xe9\x21\x43\x33\xe1\xe6\x70\xad\x5d\x2f\x99\x89\x01\xc6\x1e\x6c\x5f\xc9\x3b\xb3\x8e\xa9\x08\x0c\xcf\xd5\xc3\xaf\xa6\x86\x0a\x96\x71\x73\x50\xb6\x88\x42\x1d\x85\x51\xc3\x49\xf1\x66\xe6\x0d\xd8\xa4\x01\xc6\x1f\xd8\x11\xd8\xd1\x98\x1f\x47\x8d\xe3\x73\x93\x69\x38\xb5\x98\xa7\xc2\x02\x2a\x99\xf4\x8f\x08\x68\xd2\x8e\x8f\x7c\xaa\x64\x2d\x58\x55\x83\x62\xef\x91\x7e\x03\x2d\x46\x49\x1c\xbe\x5c\xf6\x29\xb7\x59\x10\xea\xa8\xd0\x20\x7c\xcf\xed\x60\xd7\x0a\x90\x51\x28\xdb\x09\xa3\xb8\x52\x12\xcf\x0e\x43\xf6\xf7\xa8\xef\xdf\xf6\x86\xa6\x86\x85\xf7\x42\xdd\x11\x32\xb7\xc9\x0f\x52\x5a\xbe\x2a\xa8\x14\x48\xc7\x55\x35\x03\x22\xa2\x81\x40\x99\x04\xc5\x9e\xd9\x23\x48\x07\x02\xb8\xb7\x4b\xde\x38\xb2\x5c\x97\xd5\x44\x93\xd5\x44\x8f\x85\x45\x0f\x01\xa4\x28\x8d\x9a\x8b\x46\x75\x75\xe6\x62\xc2\x37\x53\x89\x06\x92\x04\x33\xfd\xdc\x00\x2f\x23\xf1\x21\x1d\x6a\x1b\x49\x01\x52\x02\x51\xf1\x42\x12\x89\x87\x5a\x1a\x7c\x95\xd7\x98\xf2\x3a\x53\x06\xc1\xf0\xe9\x34\x2e\x8f\x96\x70\x40\x8f\x54\xb9\x9a\xb5\xce\xfa\xd8\x5e\xc9\x22\x79\x87\x25\xa0\x59\xba\xf8\x23\xa1\x36\x17\x9d\x31\x6a\xf6\x09\xff\x85\x0a\xcf\x00\x1c\x29\x3c\x2b\xd6\xd9\x73\xda\xa5\xd8\xe1\xd6\x4e\x13\x2b\x04\xae\xce\xea\xe8\x76\xbd\x84\x31\xfd\xe1\x93\xb8\x4f\xd1\xb2\x85\x24\x52\x17\x87\xd3\x25\xd7\x35\x2e\x9e\x60\xb5\x2e\xfc\x67\x28\x89\xc0\xf7\xf4\x0f\x0a\x94\x86\xd4\x82\xcc\xf1\x21\xc2\x3a\x41\x8f\x8c\xd0\x75\x6f\xba\x0f\x15\x97\x30\xc6\x2e\xa3\xd0\xd4\x63\xe7\xe7\x5c\x16\x7c\x2d\xaa\xc9\xac\x1c\xf2\x17\x94\x38\x32\x1c\xd0\xdb\x25\x37\xcc\xb7\xcb\x6d\xa8\x7d\x9d\x3a\x5a\xc5\xac\x34\xe7\x2e\xb4\x2c\xeb\x74\x43\x2d\x75\xd5\xc4\x7a\x31\x35\x32\x3f\x51\x39\x36\x6e\xae\x51\x1d\x73\x53\x4d\x7d\x93\xe9\xba\xf3\x46\x34\xf5\x31\xbc\xe4\x35\xf6\x65\x08\x28\xc7\xc6\x4d\x37\xaa\xd4\xbf\xa6\x4a\xfd\x0e\xba\x0f\xa9\xbb\x7d\x9d\x43\x65\x09\x15\x76\x46\xee\xf3\xdd\x2a\x2d\x7d\xc3\x10\x7e\x37\x70\xac\x4c\xdf\xdc\x50\xd5\x27\xaf\x6d\xda\xf2\x81\x37\x6c\xd1\xfa\x5f\x62\xb7\x12\xb9\xd7\xb7\x74\x05\x96\x47\x40\xd6\x2f\x46\x57\x51\x29\x81\xe8\x34\x66\x3a\x1b\x44\x6c\x41\x2f\xaf\xe4\xa6\x35\xf6\xbb\xa8\xc9\x77\xc3\x07\xed\x1a\x13\xdc\xd2\xe4\x94\x00\x45\xc9\x5e\xda\x48\x09\x11\xb7\x23\xe1\xc4\x8b\x75\x23\xe9\x45\x4c\x4a\xac\xda\x59\x14\xec\x57\x46\xd8\x23\x11\xf4\xaa\x22\xe1\x35\x34\x3a\x29\x8b\x88\xb7\x7f\xeb\x63\x7d\x6b\x44\xf2\xa7\x35\x22\xf1\xad\x3a\x6a\xd9\x30\x68\xf0\xaf\x6d\xb7\x30\xa9\x36\x2f\xa8\xeb\x3a\x5b\x5f\x91\x5f\xe5\xb6\x7a\xe7\x86\x3c\x16\x9d\x38\x70\x5b\xae\x64\xd4\x11\x69\xc2\xf8\x4e\xd4\x70\x10\xbb\x29\xd7\xab\x2d\x3a\x37\x19\xd7\x21\xea\xcd\x54\xe5\x92\xc4\xf8\x16\x35\x4e\x88\xbc\x38\x3d\x35\x4b\x38\xd1\xda\xd5\x89\x71\x09\x92\xf3\x33\x0c\xe7\xc0\x54\xe3\x5f\x07\x91\xcf\xe8\x94\xce\xd8\x35\xc8\xad\x30\xe3\x63\xf3\x1d\xfe\x71\x60\x07\x15\xb8\xb4\x94\x06\x1f\x33\x48\x59\xa6\x45\x73\x1e\x2a\x26\x7f\xaa\x14\xce\x21\x39\x78\x44\xd5\x57\xed\x2e\x52\xa9\xf3\x50\xc7\x43\xbb\x12\x38\x19\x0c\x16\xf1\x53\x19\xc0\x77\x89\x53\xb5\x9a\x25\xa1\x12\xc4\x12\xd1\x56\x5b\x4c\x70\x5e\x11\xef\xea\xa6\x84\x7f\xc4\x2c\xdd\xa4\x26\xea\x5e\x9f\x81\xdd\xd9\xd1\x56\xd7\x2e\x82\xb5\x14\x36\x28\x3b\x09\x8c\x43\x2e\xa9\x06\xc7\x14\x20\x40\x2f\x5c\x53\x4d\xcb\xe8\x52\x96\x96\x10\xba\x51\xd6\x36\x16\xf1\xbd\x91\x29\xfa\x1f\xb6\x1c\x84\xef\x2d\xe5\x78\xe3\xab\x81\x39\xdf\xf2\x70\x42\xe6\xf5\x6e\x12\x46\x28\xa0\x93\x29\x89\x7b\xef\x96\xc4\xbd\x25\x71\xff\xb4\x24\xae\x34\x48\x36\x34\x1b\x67\x71\x0c\xfd\xf7\x61\x09\x8a\x9b\xb7\x8c\x7e\xb3\x58\xcc\xd6\xf9\x92\x42\xad\x55\xe1\x46\xd6\xd1\xf0\xcd\x46\x16\xc8\xae\xc1\x57\xa7\xdf\xeb\xd9\xfd\xd6\xb1\x38\xde\xbe\x19\xb1\xc9\xe5\x5a\xc6\x0b\xd4\x88\x72\x53\x3b\x20\x8e\xde\xf3\xf2\xb1\x6b\x20\x63\xf4\x55\x36\x7e\x0d\xea\xe2\xc3\x38\xb0\xc9\x62\x35\xcf\x56\x85\x20\xee\x8e\x32\x47\x59\x68\x61\xe6\x96\x2d\x8a\x3d\x9e\xc6\x4c\xe0\x4c\x69\x3c\x22\x61\x55\xae\x17\x2d\x07\x6d\xb0\x8b\x3b\x13\x2c\x87\xb6\x76\xea\x6b\xab\x28\x66\x14\x75\x83\x7b\x37\xe5\x0a\x34\xfd\x1e\x6d\xa0\xeb\x9b\x58\xdb\x95\xdb\xb6\x9d\x2c\x3e\x09\x22\x5c\x1a\xa2\xb5\xb5\x4d\x94\x28\xc2\x56\x62\x0d\xac\xe8\x8c\x49\x9b\x4f\xe2\x27\x3b\xce\xed\xdb\x1a\x39\x05\x40\xdf\x60\x20\x63\x3c\x53\x0e\xe5\xb8\x8a\xc0\x90\xc9\x9e\x99\xcf\x55\x73\xf5\x5b\xfa\x36\x49\x9a\x4f\x08\x58\x2b\xdf\xa8\x28\x00\xf0\x3b\x66\xec\xb5\xca\x37\x47\x99\x68\x05\x2b\xe7\x87\x82\x37\x6b\xe5\x97\x3b\x51\xac\x1b\x1c\x31\xf7\xf5\x07\xe8\x6e\xd3\xe8\xec\x49\xfb\xd8\x0a\xb0\x1f\x31\xa7\x08\x1f\xcb\x3f\xc4\x68\xa9\x9e\x31\x91\x81\x5e\xdb\x47\xd8\x04\x84\x57\x05\x18\x02\xdc\x4f\x51\xfd\x05\x64\x7e\xc1\x5f\x8b\x1b\x38\x6d\x22\xb4\xc0\x26\x4b\xd4\x20\x09\xc2\xc2\x6b\xf2\xa0\xa7\xf3\x32\x53\x13\x26\x22\xb2\x80\xc3\x93\x2b\x2a\xc4\x0f\xac\x5b\x61\xd0\xe4\xad\x0d\x8a\xde\x83\x98\x0d\xaf\x52\xdc\x75\xb3\x5c\x70\xc7\xfd\x76\x97\xa4\xa4\x96\x40\x28\x4d\xbd\x5e\x6e\x3e\x5a\x80\xa6\x88\xc2\xdc\xd4\x7a\xd2\xba\x54\x47\x10\xd0\xc5\x96\x39\xf6\xb3\x36\xe3\x07\xc7\xf3\x3a\x91\xff\x78\x5c\xb5\x13\x7d\xe8\x95\xd0\xf6\x00\xe6\x33\xcc\xe4\xbd\x28\xd4\xc6\xa8\xd6\xbd\x34\xde\x22\xfd\x3a\x7c\xd7\xb3\x12\xbe\x55\xfe\x3b\x68\x4e\x4b\xa0\x47\xef\x54\x30\x04\x94\x56\xbf\xc4\x8a\xcc\x60\x23\x89\xb7\x62\x71\x63\x40\xab\x74\x77\x1e\x0e\x23\xc2\x35\x8a\xa8\x16\x18\x70\x95\x76\xea\xf0\x2f\xc1\xd8\x57\x6a\x0a\x62\x2d\xdb\x6c\x09\xb6\x04\xa9\xb6\x71\xa3\x72\xde\xd0\xbe\x8b\x8e\xb0\xd4\xca\x86\x6e\xbb\xb2\x3f\x43\x1d\xea\x72\x5b\x22\x49\x8c\x70\xed\x88\xb1\x08\x63\x03\xa7\xeb\xe2\xa6\x74\xe6\x36\xf1\xfd\x0d\xf0\x18\xd1\x26\x78\xc3\xea\xea\x39\xe3\x0b\xe8\x66\x42\x45\xa8\xb3\x79\x62\xd8\x07\xbb\x65\x41\x9a\x77\x62\xee\x1f\x35\x7b\xaa\xd8\x8e\x4a\x8b\x30\x43\xb4\x63\x09\x1a\x94\x60\x08\xc6\xbc\xed\xab\x86\xa0\xa8\x6b\x66\x87\x2c\xa9\xe8\x0d\xda\xf3\x4e\x97\xf9\xdd\xc8\xf6\xd2\xae\x35\xc1\x38\xf3\x8e\x07\xd6\x4a\x45\xb6\x8e\xe9\xed\xfd\x2a\x26\x53\xa0\xc2\x8f\x41\x08\x89\x84\x96\x70\x73\xbf\x31\xf4\x1c\x8a\x53\xef\x8a\x3b\xb1\xa4\xc8\xd8\x7e\x2b\xbc\x9f\xe3\xca\x71\xca\x8c\x04\xd6\x26\x46\x7c\x28\xb3\xf9\x07\x03\x43\xc5\x64\x60\xdc\x00\xca\x3f\x8c\xa5\x9f\x9b\xa5\x4f\xa4\x83\x89\xc8\x0d\x55\x6e\xc4\xa0\x88\x33\xd1\xa8\x97\x0d\x51\x7d\x9a\x6c\x50\xe4\xd3\x3a\xc7\x5f\x58\x76\x03\x86\x57\x1a\xd7\xe2\x56\x57\xb5\x16\xeb\x2b\x59\x51\xd5\x5f\xc2\x0d\xed\x9c\xfe\x70\x63\x1b\x6e\x72\x1b\x60\x48\x43\x0b\x18\x6e\x8f\x1b\x1f\x89\x78\x16\x02\xb2\x6c\xdd\x8a\x30\x39\xfe\x92\xca\x3d\x8a\xd9\xc5\x38\x61\xdc\xe1\x36\x6d\x5d\xe2\xe6\x2d\xfa\x2a\x6a\x1d\x8c\x76\xf7\x2b\xcd\x5d\x9c\x60\x14\x32\x3f\x8e\x7d\xb1\xff\xfd\x0d\xc4\xfe\xc1\x0a\xc0\x3e\x3e\x5a\x2e\xbf\x4f\xc5\x11\x42\xd2\xce\x74\xb9\xec\x9f\xa4\xab\xb6\x7c\x13\x45\xfd\x51\x3a\xff\x98\x16\x01\xc8\x44\x16\x6b\xa8\x8f\xe9\xda\xef\x45\x16\xa9\xea\xef\x65\xdc\xaf\x47\x10\x3b\xec\xe7\x55\x0a\x01\xf0\x08\xa8\x0a\x0b\xd6\x97\xb1\xc5\xfa\x97\x0a\x40\x35\x3c\x12\x9b\x49\x40\x27\xa2\x40\xfe\x8f\xab\x57\x76\x4d\x05\x0f\xd6\x4f\x27\x5a\x18\x6d\xc0\x9f\x7c\x5a\x8a\xf3\x08\x3b\x16\x69\x91\x59\x00\xd7\xe8\x87\x2c\x9d\x7a\x83\x76\x0d\xce\x64\xa5\x03\x86\x70\x7d\x69\x04\xf6\x1c\xea\x1c\x28\x38\xb0\x46\x20\x41\xec\x81\x00\xf3\x75\x74\xc0\x6b\xa8\xd3\xa0\x3a\xe9\x34\x85\xd4\x85\x1a\x24\x5f\x4d\x2e\x66\xe9\x4a\xb0\x18\xef\x21\x19\x2d\x05\xd5\x95\x80\xd5\xb2\x56\xb7\x81\x74\xaa\x4f\x73\xaf\x5b\x9d\x63\x55\x81\x3c\x16\x37\xc4\xab\x7c\xf2\xc1\x5b\x25\x08\x8e\xde\x5f\xca\x72\xfc\xb7\xdf\xe6\x71\x9e\xce\x16\xef\xeb\xb4\xec\x4f\x25\xa8\xee\x80\x69\x86\xab\xc5\x19\x02\xc3\xe8\x67\x52\x02\x85\x81\xe0\x70\x41\xb2\x75\xad\x1f\xc0\xc0\x2f\xb2\xf9\x45\x04\x58\x50\x84\x17\x0a\x98\xd2\xef\x07\xa5\x3a\x0a\x80\x77\xb1\x9c\x08\x2c\x0a\xe4\x64\xe0\x42\x5b\x3d\xaf\x85\x02\xd0\x78\x4d\x1b\x6b\x8e\xe8\x20\xa2\x05\x01\x18\x77\xe9\x11\x28\x00\x20\x7d\x01\x5c\xb0\x12\x30\xff\x42\xc1\xba\xa5\x78\x9e\x9d\xae\x7f\x4c\x3f\x12\x40\x30\x95\xef\xcf\xd3\x8f\x1a\x22\x9f\x67\x11\x7c\x9b\xc9\x2a\x0f\xdb\x9e\xe7\xc5\xda\x83\x2a\xd6\x85\xfc\x5f\x07\xf0\x38\xff\x98\xfb\x47\xd2\xc1\x09\x2c\x91\xd5\x0e\xfe\xd9\x3a\x3b\x8f\x01\xe7\xa2\x4e\x41\xb2\x53\xde\x71\x93\x85\xfa\xa0\x27\x0b\x83\x3b\xd2\x9a\x9d\x50\xaf\xa6\xea\x5f\x1a\xd9\x25\x02\x30\xee\x17\x12\x40\xba\xf2\x1c\x30\x51\x7c\xa0\x12\x3c\x90\x17\xcc\x36\x82\xfb\xed\x82\xec\x23\x82\xfc\xfb\x6a\x01\x99\xf8\x23\xe0\x7d\x90\x6c\x2e\x4d\xa3\xbc\x60\x71\x7b\x25\x2b\xe8\x07\xb2\x53\xb1\x73\x67\xcf\xe6\xd3\x7c\x02\x56\x99\x14\x5e\x55\xf6\x73\x53\xab\xdb\x28\xa7\x66\x0a\xaa\x73\x27\x2b\x08\x65\x99\xf2\x34\xcf\x66\xf4\xfa\x2f\x64\x79\xff\x14\x2a\x34\xe4\x2c\x40\x83\x62\xe6\xb6\xfe\xf8\xe3\xfb\xe0\x48\x14\x1f\xdf\x7b\x27\xc2\xaa\xc9\x04\x22\xe7\xef\x65\xc2\xfd\x00\x13\x4c\xab\x62\x67\x6e\x81\x10\x66\xe0\xb6\xe2\x16\xfe\xb8\x5a\xcc\xe1\x64\x54\x77\x31\x51\xc0\x7d\x38\x33\xd1\xae\x5e\x2b\x89\x74\xdd\xbe\x56\x00\xde\xee\xde\xd1\xb2\x68\xa3\x5d\x09\xd5\xb5\x7a\x91\xe6\xa9\x78\x20\xbc\xf7\xbb\xd0\x85\x0a\xe4\x4d\x7a\x42\x6a\xd7\xe9\x49\x01\xff\x63\x6b\x0b\xb6\xba\xb0\xf5\xde\xeb\xb5\x86\x12\xf5\xbf\x08\xe4\xfb\xc5\xf4\x2a\x06\xd6\x3f\x11\x95\x08\xf6\xe9\x62\xb1\xf6\x36\x1e\x43\x9f\xca\x6a\x04\xcf\x3c\xe1\x18\x1e\x3f\xe2\x08\xfe\x68\x31\xbb\x38\x9f\x57\xb4\xea\x4f\x24\x14\x6a\xfc\x1a\x44\xa3\x91\x36\xab\xc5\x25\x85\xac\xf8\x86\x80\xa7\x1f\x50\x1a\x60\x0c\x0d\x25\xba\x72\xf1\xfe\xbd\xbf\xd4\xb2\x48\x57\xe7\xe7\xdc\x2b\xbd\x16\xc5\xe4\x65\x06\xba\x24\x3c\x7d\x40\x92\xe0\xb3\x07\x54\xbf\x8f\x36\x6b\x55\x66\xfe\x25\x80\xe1\x0d\xe4\x41\xe3\x4b\x48\xb7\x39\xce\x96\xe9\x2a\xb8\x58\xfc\x76\x85\x81\x22\x6d\x43\xa2\xc9\x6f\x87\x48\x27\x2b\x77\xe0\x8c\x03\x00\xe0\x2d\xd0\xe5\x07\xa1\x59\x80\x38\x67\x5f\x0c\x07\xa1\x49\x67\x20\xf1\x7b\x2d\x4c\x26\x03\x75\x2f\x4b\x24\x55\x0c\x24\x3d\xfc\xe2\x08\x5f\x51\x77\x0f\xea\x2c\x7d\xd7\x3a\x18\xef\x91\x02\x43\xd3\x0a\xc8\x07\xb4\xc2\x91\xae\xa2\xee\x5b\x5a\xa7\x50\x55\x74\x36\xa4\xe5\x92\x22\x15\xc5\x23\x5a\x0c\x7b\x0d\x11\x1a\xbd\x52\x58\x2f\x51\x2c\x67\x67\xe8\x4a\xf1\x5b\xce\x26\x20\x1e\x45\x85\x9a\x8a\x97\x8d\x3f\x42\xda\x09\xe6\x66\xaf\xa4\x5a\x53\x7e\x02\x4a\x7e\xdd\xfe\x52\x5d\x12\x8a\x4e\x94\x3e\xa0\xa5\x70\x51\x03\xf3\x54\x12\x25\x13\x11\x63\xa2\x68\x57\x15\x71\xd4\x96\xa8\xdd\x63\xf9\x42\x44\x45\x89\x22\x39\x75\x43\x09\x89\xdf\xf2\xdb\x1e\xc1\xd3\x3a\xd8\x1f\xaa\x62\x43\x8c\x88\x92\x5d\x5a\x62\x68\x19\x51\x33\xf2\x6a\x80\xde\x10\xc5\x72\x93\x2c\x15\x22\x0a\xee\x93\x02\x03\x76\xcf\x94\x22\x1a\x4e\x14\x7f\x8b\x58\x5a\xc1\xc4\xca\xa9\x69\x52\x44\xfc\x7c\x10\xf8\x6f\x60\xaa\xa1\x75\x70\x7f\xe4\x97\xa9\x43\x2c\x6a\x86\xaa\x06\x91\x0c\xa2\x50\x8e\x35\xa0\x0b\x44\x85\x9c\xb5\xa1\x02\xc4\x6f\x39\x5a\xfc\xde\x8b\x32\x15\xb3\x74\xa6\x56\xe3\xbe\xf2\x26\xd1\xcf\x94\x60\xb2\x71\xac\x53\xf1\x53\x76\x68\x9e\xc9\xd6\xc1\xb7\x43\xfc\x3b\xfa\x04\x83\x1b\x49\x35\xa4\x7c\x60\x01\x74\x14\x05\x55\xab\x3b\x1a\xca\x09\xa3\xfb\x5c\x94\xa9\xab\xc0\x7f\xdb\x00\xf8\x81\x5f\xa1\x9e\x31\xa8\xfa\xd6\xaf\x32\x07\x7a\x34\x1a\xf1\x55\xfa\xd5\x00\x88\xa1\x0f\x21\x1e\x15\x28\xdf\x65\xca\x51\x33\x33\x76\xf9\x96\x43\xc1\x3e\x2e\x80\x0b\x48\xc5\x9d\x75\x0f\x03\x14\xa9\x49\xc0\x9b\x04\xbf\xd4\xb8\xdd\x03\x23\xca\xd4\xad\xa0\xde\x25\xb8\x2a\x87\x46\x3a\x82\xae\x66\x28\xdf\x63\xca\x0d\x76\x8d\x76\x47\x5c\xad\x7d\x08\x00\x62\xcc\x41\xe8\x2b\x6c\xa4\x6e\x11\x5e\x26\x03\xb7\xf5\x03\x10\xb3\x3c\xd8\x40\xcc\xf2\xef\x6e\x5a\xb8\x81\x89\xe0\x26\xd6\x88\xca\x02\x6f\xfe\xe1\xfb\x74\x55\xd7\xfa\x4e\x02\xb7\xff\x18\xef\x98\x99\x64\x06\x78\x88\x41\x5e\x98\x3c\x7d\x0a\x58\x1b\xa6\x54\x42\xdb\x11\x95\x19\x12\xde\xb0\xf7\x8a\x74\x8b\x77\x79\x86\xc4\x2f\x57\x27\xe7\xe1\x2a\xe5\xcf\x1b\xf5\x3b\x91\x4c\x94\xf8\x57\x7e\x29\x9a\xb6\x46\x00\x1b\xa5\xaf\x71\x06\xf9\x1c\xc6\x62\xd2\x31\x16\xc2\xe4\x08\xa1\x35\x47\xc4\x81\x43\xed\x39\xfc\xaf\xd1\x1b\xea\x8d\xbd\xc4\x99\x2b\x94\x71\x1c\x32\x4c\x72\x9e\x1b\xd4\x65\x83\x0f\x59\x56\x12\x58\x2e\x97\x08\xef\xbb\x90\x5a\x8b\x08\x6d\xe6\x64\xed\xbf\x54\xc2\x8c\x37\x60\x24\xd5\xb7\x85\x65\x16\x55\x55\xb6\x6c\xed\x51\x61\x37\xc5\x7a\x8d\xf8\x2a\xe5\x1e\xda\x90\xfa\xb9\x16\xf8\x24\xf4\x7a\x57\xac\x41\x40\xfb\xff\xff\xff\x94\x39\x5a\x85\x26\x40\xae\xd3\x16\x8d\xf2\xbf\xdd\xd0\x28\xbf\xfc\x62\xfd\x47\x76\x75\xb4\x98\x66\x9c\x69\xb2\x78\x1a\xc4\xb3\x3d\xcd\xae\x6b\xde\xed\x52\xbf\xb3\x57\x37\x4a\x69\x7c\x8d\xdb\xfe\x67\xf1\x86\x2d\x2e\x9f\xcb\xc0\x1a\xd1\xf1\x5d\x4a\xa0\xfe\xcc\x42\x99\xd6\x5a\x72\x46\x1b\x59\xd1\x59\xbd\x18\xd8\x20\xdc\xf1\xbe\xea\xe4\x7c\x7a\x2f\xc4\x35\x33\xff\x31\xfd\x88\x03\xce\x88\x26\xda\x34\x08\x00\xb4\xe0\xb3\xe6\xe3\xa3\xa1\xcb\xec\xbe\x7b\xc1\xca\xfc\xf1\x96\xe0\xc7\x97\xf9\x32\x7b\xb3\x78\xb9\xcc\x98\x08\xce\x28\x0a\xb5\xb8\xa7\x2a\x12\xab\x6a\xf1\x8b\x0f\x91\x61\x43\x8b\x73\x2d\x5e\x65\xec\xad\xd3\xd5\x2a\xbd\x0a\x1e\x4a\x93\x88\xbc\xdc\x30\x5c\xac\x3b\x3f\x01\x0f\xe8\x68\xb6\x28\xca\xbb\x12\xbd\x68\x51\x5c\x7c\xa6\x8a\x67\xc9\xa6\xcf\x80\x52\x0b\x01\xe7\x17\xe7\x27\xc6\x4a\xc5\xcc\xb7\xa6\x39\x7d\x00\x7e\x7c\x71\x12\x5b\xd7\xd2\x76\x90\x1a\x3e\xd6\xc4\x62\xce\x25\x42\xc6\x6c\x65\xf1\xa7\x2d\xee\x9a\x8b\x65\x5b\xa0\xf4\x6f\x8b\xb9\x42\x58\x71\x31\xbd\x35\xd6\x82\xe2\xca\x2a\xf2\xdf\x33\x52\xff\x5a\x15\xdd\xd9\x9a\xd9\x39\x87\x9c\x24\xb0\xb5\xc1\x47\x30\x34\x51\x0f\x0f\x31\x37\x6f\x68\x58\xaf\xf4\xdc\xe7\xe9\xd5\x89\xfc\xa4\xb2\x40\x97\xdf\x3b\x44\xf5\x6b\x1b\x33\xe4\x9f\xf6\xa2\xe0\x6a\x7f\x61\x6a\x0b\x98\x89\xd7\x96\x9b\xf8\x42\x4e\x15\x9b\x02\xc8\x89\x5a\xcb\x4a\x35\x3a\x65\xc1\xe8\xcf\x7b\xb3\xf8\xd4\x6a\x7c\x17\x4b\x10\xc4\xc0\xb5\xa9\x02\x2b\x76\x70\x6a\x93\xdf\xd4\x65\x25\x77\x43\xde\x94\x62\x08\x1d\x2e\xb0\xb7\xe8\xfc\xad\xec\x28\xf2\x65\x55\x79\x23\x9f\x86\x78\xe1\x6f\xe7\xe7\x65\x41\xcc\x75\xb5\xf7\x79\x8c\x6a\xdc\x17\xd6\x5a\xe0\x6a\xfb\x54\x05\x91\x60\xe8\x9f\xf5\x0e\x62\xb3\x0a\x28\xb1\xc6\x50\x28\x0c\x32\x9a\x85\xba\x97\xdc\xb0\xe1\x77\xc5\x17\x2a\xfc\x3c\xcd\x6d\xe7\x59\x54\x98\xe2\x4e\xd9\x70\xf4\x07\x6c\x3e\x61\xf1\xb3\x62\x30\xe5\x5e\x96\xfa\x7a\x0e\x87\xf2\x52\xf6\x5c\x32\x12\x13\xb2\xf9\x95\x32\x94\x67\x42\x5a\xeb\x9a\x7a\x91\xad\xad\x37\xc8\x0d\xc4\xca\x9e\xa9\xf7\x7f\x13\xaf\x97\x4f\x86\xcd\x80\xc0\xa9\x6f\x4c\xf4\xdc\x17\x17\x20\xb8\x98\xe5\x92\x93\xfb\x86\xa4\x5d\x94\x18\xa5\xd2\x07\xd8\x76\x2f\xd2\x4f\xb6\xe9\x3f\x3b\xdd\x2e\xc3\xca\xc4\x3c\x5e\x62\xfe\x10\x36\xba\x6e\x4e\x82\x67\x13\xe6\x86\x30\x10\x82\x6c\x04\x33\x7b\x5b\xf5\xbb\x7e\x22\x47\xc8\x27\x43\xf1\x4c\xc3\xb8\xd3\x46\x2c\x94\x30\xc4\x95\xff\xa4\xe2\xba\x9a\xa0\xc2\x5e\x23\x3d\x0c\x7c\xf6\xf4\x85\x09\x06\x56\x15\xce\x38\x3c\xf3\xe5\x87\x59\x47\xc6\xa7\x41\xec\x69\x5d\x65\x99\x93\x73\xa9\x61\xfc\x1c\xb4\xf8\x45\x34\x01\x42\xbb\x1d\x76\xf6\x4f\x2e\x92\x75\xd4\x5d\x85\x06\xab\x1e\xb2\x03\x50\xca\xec\x70\xaf\x4b\xfd\xab\x06\xd3\xac\xf8\x20\xf6\x45\xd3\xb4\x46\x29\xfe\x03\xc9\x49\xed\xc7\xe1\xdd\xb4\x3f\x2f\x54\x6f\x0f\x21\x29\x84\x0c\x7c\xe9\x48\xb2\xcf\x1e\x12\xf9\xab\xb8\x52\x60\xd6\xb5\xc9\x3d\x90\x89\xb1\xea\x36\x4b\x02\x04\x52\x84\xb9\xf7\x20\x7b\x98\x28\x61\xd9\x76\x98\xf2\xe3\x6c\xb2\x58\xa5\xfa\x18\x90\x68\x0b\x13\x06\x9b\xec\xa5\xe5\x67\xb7\xee\xb2\x83\xb5\x54\x60\xd3\x11\x47\x70\xd4\x8f\xca\xb0\x89\x57\x11\x21\x82\xa9\x23\x0b\xa9\x72\xd7\xd0\xc2\xf2\x75\x1b\x78\xcf\x04\x66\xca\x92\x2c\xea\x92\x99\xaa\xce\x39\x99\xc2\x4b\x13\xbf\xd2\x37\xb6\x0f\x03\x62\x06\x4e\x2f\xf2\xae\xfd\xaf\xff\x4a\xee\x32\xd7\x0a\x77\xff\x3c\x99\x6b\x8b\xfc\x52\x78\x1d\xd6\xed\x4d\x6a\x83\xde\x2e\xe6\x7a\x94\xa6\xc2\x60\x31\xb5\x9f\x6c\x2c\x39\x41\xec\x20\x36\x62\xb7\xfe\x5c\xbe\xb7\x9d\xf9\x59\xea\x64\x42\xe2\xd0\x26\x5c\x94\x56\x08\xa3\xf9\xe8\x32\xbd\x82\xc5\xd0\xcd\x49\xd8\x51\x13\x4c\x6d\x8c\x0b\xe5\xf5\x1b\x64\xbd\xd9\x64\x7d\x37\x8a\x89\x6b\xb9\x3f\x14\xbc\x34\xb8\x86\x18\x9f\x89\x88\x83\x8a\x3a\xb3\xae\x8a\x5b\x51\xb8\x0a\xb9\x28\xb7\x96\x51\x6e\x37\x9b\x13\xb4\xeb\x72\xeb\x3c\xc4\x85\x88\x0d\x47\xe3\xb5\xa5\x1c\xe8\x71\xad\x4f\x03\x64\x37\xda\x5c\x71\xa5\x35\xba\x00\xc0\x78\x37\x88\x29\xae\xd1\x97\x85\x66\x3b\x3c\x62\x4f\x47\x50\x5b\xda\xd4\x1f\x4f\xa4\x0f\x0b\x56\xda\x19\x5a\xa3\x48\x3f\x00\x41\x90\x82\x8a\x23\xc8\x4f\x0c\xb7\x98\x43\x37\xe4\xc6\x79\x61\xfb\x16\xa7\xd5\x78\xaa\x70\xf1\x75\x7d\x1e\x0d\x5b\xbf\x87\xfc\x1b\xef\xc1\xa1\x77\x81\xb8\xd7\xd9\x50\xa7\xf6\xe2\xe6\x63\x26\x72\xd7\x89\x35\x45\x57\x51\x97\xa4\xc0\xaf\xac\x0f\x8b\xde\x41\x43\x4d\x87\x3c\x74\xc3\x81\x0f\x82\x58\x50\x55\xf4\x25\xd4\x60\x71\x7a\x2a\x18\x9f\x37\x8b\xe5\x21\xa2\xaf\x74\x14\xc7\x33\xd3\x05\xea\x4f\xd1\x35\x81\x0f\x8c\xb7\xec\x78\x29\xbd\x2a\x6d\xf1\xde\x4b\x96\xe9\xd5\x6c\x91\x4e\x23\x0b\x6b\x64\x64\x9e\xcb\x0e\x7d\xa1\x21\x5e\x0e\xc4\x53\xe1\xc3\xdc\xa8\x0e\x82\xef\xb9\xb1\xc7\x5f\x60\x45\xf8\x39\x9e\xd2\xce\xd2\x7b\xce\xe8\x3c\xbd\x4a\xca\x5e\x72\xbd\x21\x41\x14\xed\x09\x55\x50\x3f\x96\x6c\xf0\xc1\xc8\xd3\xc5\xdc\xb5\x6c\x7d\xf0\xe4\xf8\x28\xf0\xb6\x90\x33\xb1\xab\xe7\x9e\x7d\x6f\xb1\x26\x98\x71\xfe\x12\x0e\x4e\x49\xc1\xb8\xd1\xa9\x9a\x5a\x72\x0f\x97\x5a\x89\x30\x74\x5e\x7a\x25\x8f\xd9\x63\x38\x55\x9f\x5f\x83\xe8\xab\x43\xfa\x01\x86\xd3\xf4\x3e\xc3\xf3\xa2\xe1\xc7\xfc\xe7\xf3\xbb\x64\x24\x58\xd3\xfe\x08\x7d\x8f\x91\xe3\xe0\x8f\xb1\x62\x9e\x98\x8b\x9a\x47\xfb\x89\xdf\x32\xfe\xd0\x00\x8c\x2c\x06\xe9\x74\x2a\x45\xfa\x46\xae\xd9\x51\x7e\xdd\x05\xc8\xde\xda\x3d\x7b\xf5\x81\x25\x22\x8a\x0e\x8c\xdd\x5a\xee\x32\x9a\x01\x9c\x5f\x8d\x57\x1c\xf0\x1d\x1f\x52\x5e\x44\xf9\xdd\x50\xf7\x9a\xb8\x00\x8a\x60\x19\x07\x86\x57\x90\xef\x46\x7f\x8b\x2e\xd1\x2a\x3b\x17\xc4\xde\xc6\xab\x04\x6b\xc4\xae\xc1\xc3\xd8\x2a\x74\x89\x7c\x33\xa6\x74\x09\x8e\x15\xed\x84\x1e\x2c\x5a\xc7\x79\xb0\x21\xf2\x5d\x1c\x6d\x76\xc4\x77\xa3\x23\xb6\x99\xdf\x88\x43\x16\x92\x47\x77\xbb\xc8\xa7\x1e\x4e\x02\xa1\xd2\x6d\x98\x03\x2b\xf2\xd5\x91\xba\xb3\xe2\xd7\xe1\xbb\xc1\x32\x7d\x9f\xfd\xf3\x90\x81\xfc\x85\x83\xfc\x45\xb3\x49\xac\x94\x1a\x24\x6f\x71\x21\x35\xfa\x15\x97\x55\xa3\x5f\xfa\x4b\xb5\x4e\x14\xe0\x10\x87\x2a\x2f\x44\xb9\xc6\x94\x5a\xfd\x08\xde\x92\xeb\x06\x02\x61\x37\xe8\x65\x22\x73\x9d\x97\x75\x64\x7c\x63\xb3\xb5\x0b\x10\x80\x7c\x63\x5d\x71\xc7\x4a\x9d\xfe\x89\x39\xde\x99\xa7\x0e\x6c\x4c\xa9\xe8\x0e\x14\xc5\xf0\xab\xd3\xc4\x0e\x0a\xb1\x95\xb3\xac\xd3\xb6\x92\xaf\x76\xf7\x9d\x8d\x03\x8d\xa4\x5f\x95\x32\x42\x37\x70\x2a\x27\x43\x7b\x8f\x43\x50\x83\x1c\xf7\x25\x48\x68\xd6\x57\x9d\x91\xa0\x72\x50\xf3\x9d\x72\xc1\x22\xf3\x88\xf8\x4f\x14\x6a\x33\xb9\x58\x41\x2c\xeb\x7f\x7a\x4f\xc7\x8b\x74\x7d\x06\x29\x36\x3a\xea\x8f\xf4\x53\x87\x11\xdc\xc1\xa5\xd2\x86\x97\x57\xfc\x68\x1b\xcf\xfd\x52\x39\xa9\xf9\x1a\x4c\xc8\xd7\xbd\x74\x4b\x24\xa6\x16\xbe\x52\x08\x4b\xb4\x39\xfd\xc4\x4e\x0f\xd6\xba\x57\x6b\xe1\xbc\xe3\x12\xb9\xda\xa0\xca\xdd\x6c\x92\x5e\x36\x73\x2b\xbf\x50\x34\x58\xe9\x6d\x62\x89\x48\xb2\xde\xee\x56\xcb\xc4\xd5\x97\xc1\x41\xd3\xfa\x3a\xe7\xfa\xa9\xd7\x00\x1f\x98\x60\xdd\xd0\xa6\x87\x3e\xa7\xe1\x45\x46\xb9\x82\xe9\x3f\x1f\x9d\x80\x28\x48\xe2\x45\x7a\x52\x84\x5b\x8a\xee\x35\x42\xcd\x4f\x7f\xe1\x5b\xfe\xc2\xb4\xfc\xc5\xb6\xdc\xd9\x49\x9e\x9d\x8a\xfa\x4c\x06\x4d\x4d\xce\xd2\x22\x81\xcb\x6d\x9a\x88\x16\xa2\xf8\xe2\xfc\x24\x81\x14\x21\xcb\xfc\x93\x98\x02\xd8\xec\x65\xb9\x34\x5d\x9a\xe6\xab\x4c\xee\x5a\xcf\x75\x74\x99\x25\xe2\x2a\x4a\x8a\xf4\x34\x9b\x5d\x25\xe7\xe9\x07\xc8\xae\x9a\x08\xd6\xed\xe2\x7c\x29\x37\x38\x3d\x59\x5c\xac\x21\xf2\xa5\xec\x42\x7c\xf3\x32\x85\x3e\x21\xca\x80\x52\xce\xea\x8e\xd6\x0b\xa9\xed\xcb\x92\xc5\x2a\x29\x26\xab\xc5\x6c\x36\x40\x13\x5d\x9f\x81\x7d\xed\x62\x06\x81\x7b\x80\xae\x43\xe4\x8b\x5a\xbd\xbf\x21\x10\xf1\xfc\xa9\x85\xf9\xeb\x43\x57\x8a\x29\x1a\x4e\x47\x69\xd6\xfc\x90\x42\x05\x79\x1b\xe0\x3f\xab\x96\x0c\x75\x14\xee\xec\x82\xb8\x4d\x94\xc1\xdf\xb6\xa9\x8b\x98\xbf\x29\x5a\x11\xc4\x52\x53\xc7\xb3\x74\x73\xff\x5b\xd9\xd4\xe9\x73\xd1\x89\xe7\x9f\xa5\x80\x91\x73\x4b\xf2\x43\x54\x9d\xb3\xe0\x58\x4f\x24\x2f\x36\x7d\xc3\x9e\x6e\xbd\xfb\x66\x3d\x5e\x83\xc8\x99\xd5\x1e\xe1\x5b\x37\x7e\x99\x5b\xc4\xa9\xd2\x80\x6b\x21\xad\x23\x3b\x82\x19\x91\xdb\x81\xc1\x92\x50\x75\x8d\x04\xd1\x12\xe3\x7f\xce\x54\x9e\x62\x81\xf9\x12\x79\x04\xe2\x4b\x96\x2b\x91\xee\x13\x10\x1b\x03\x4c\xf5\xed\x20\x04\x18\x74\x85\xce\xde\x49\x36\x49\x6d\x76\xe2\x35\xc4\x96\x3d\x3a\x3e\x46\xa2\x43\x88\x2e\xab\x18\x8d\xe9\x00\x1d\x18\x6f\x35\xff\x96\x0c\x07\xfb\x18\x45\x00\x86\x3c\x47\x06\x8d\xbb\x44\x70\x57\x82\xbf\xbc\x6e\x0e\x21\x6f\xd0\x0f\xe1\x35\x1d\x26\x32\x0d\x9a\x8c\x6e\x81\xf4\xad\x65\x5f\x27\xb3\x18\x72\xa3\x88\xb3\x33\x71\x1c\xfa\xc2\x11\x97\x71\x5e\xa4\x31\x7d\x19\xef\xaa\x21\x89\x19\xef\xa8\x06\x95\x19\xb3\x41\x7c\x6e\xf4\xc3\xda\x08\x31\xf0\xe6\x28\xb3\x4a\x8c\xd9\xcc\x89\xfa\xfb\x55\xee\x1c\xa1\x69\x5f\xeb\xe0\xc1\xa8\x4e\xa2\x0e\x63\x74\x08\xd6\xf2\xdf\x7a\x26\x90\xfb\xc3\xdb\xb8\xc4\xb7\x71\x89\xff\xe8\xb8\xc4\x3c\x12\x1b\x0b\x4f\xea\x97\x5e\xd7\x8e\x93\x34\xaa\x0e\xe3\x1b\xd8\x5f\x8a\x43\xc0\x59\x6d\xce\x33\xb1\x2f\xbf\xb6\xa6\x99\x78\xcb\x04\xd3\x23\x46\xd0\xea\x25\x2d\xd8\x30\x57\xf0\x4e\xeb\x28\x3e\xa6\xb3\x0b\xa6\x0f\x62\x59\x98\x33\xe6\x8e\x04\x20\x8d\xda\x26\xde\x71\xd6\x53\xd7\x30\x3c\x85\x87\xed\xb5\xb6\x18\xff\x49\x0d\x98\x30\x80\xa4\x8e\xe8\x8e\xe5\xf4\xa8\xce\x58\x16\x39\x06\x46\xcc\x8e\xd6\x8b\x02\x54\x9b\x7a\x1a\x67\x51\x80\xed\xff\x67\xe9\xf9\x32\x9b\xfe\xa4\xbf\x12\xb2\x99\xe2\x47\x4f\x0d\x42\xb0\x6b\xa2\x00\xd9\xca\xac\x80\xf6\x32\x2d\xe1\x3b\xfd\x84\x7c\x7a\x95\xcd\x48\xbf\x52\x63\xd9\x21\x5f\xdc\xc1\x9d\x7c\x23\xa8\x73\xf1\x1f\xd0\x60\xf2\x0f\x62\xeb\x64\x3b\x93\x50\xc8\x1c\x6c\x23\x43\x3e\x79\xb9\xc2\xa2\xe8\xb5\xc1\xb9\x5b\xd3\xd5\xa8\x42\x6e\x01\x20\x68\x1d\xc4\xcf\x71\x75\x8b\x71\x97\x88\xa6\x44\x89\xb6\xf0\x1b\xf6\xe4\x37\x7b\xc9\xaf\xbf\xf6\x77\xf7\x7b\x30\xbd\x77\xe2\x07\x78\xde\x25\xfd\x6f\x87\xef\xac\xbf\x06\x28\x54\xf2\xf3\x4c\xdc\x80\x1d\x77\xf9\x3b\xca\xe5\x37\xbe\xe3\xb1\xec\x78\x0c\xbd\xd9\x9e\xef\x8b\x9e\x1f\xc8\x8e\x25\xad\xd1\x4b\x1e\xec\x0f\x31\xcb\x6d\xfb\xc0\x68\xea\x3a\x16\x2f\xea\x52\xf6\x6d\x02\xc3\x25\x50\x22\xb7\xa7\x30\xe3\x81\x12\xb8\xe8\xe1\x1f\xf1\x5a\x0d\x0f\x5d\xe9\x7f\x3c\x4c\xf6\x0e\xfd\x19\x79\x83\x1f\x9c\xe4\x3a\x92\x9c\xea\x1c\x44\xf2\xd1\x4f\xf6\x92\xbd\xf1\x30\x30\x7e\xc8\x0b\xb9\xe7\x2a\x02\x17\x96\x3b\x7a\x2a\x21\xb8\x83\xa4\x74\xd3\xbb\x60\x5c\x23\xdb\x4a\x4d\x8a\x66\xb7\x74\x63\xd2\xea\x2d\xed\x03\xe4\xc6\x27\xd8\x12\xf1\x7f\x62\x06\xad\xff\x68\x1d\xc6\x5a\xad\xb4\x4e\x8c\x36\x1b\x91\x66\x88\x7b\xb3\x23\x19\x95\x8c\xc4\xdd\xf3\x8f\x2f\x94\xc1\x8d\xf8\x40\xeb\xc1\xde\xf0\xbc\x28\xe9\x71\xdc\x68\x6e\xa3\xcd\xe6\x36\xaa\x33\xb7\xdd\xc6\x73\x43\x33\xbb\xb3\x35\x03\x6b\xf5\x48\x79\xd8\xd1\xb3\xac\x9e\xbc\xcd\xad\xc9\x80\x7c\x6b\xdc\xaf\x54\x5a\xf4\x29\x2b\x2b\x6a\x76\x7d\x3d\x5b\x4a\xce\x3a\xb3\x6e\xdc\xf0\xfa\x41\xbd\x5b\xc6\xcb\xa9\x15\x5a\xd8\xed\xb9\x22\x6b\xec\xd5\x92\xc6\x5e\xad\xc0\x2a\xb2\x05\xd6\x78\xad\x06\xf6\x83\xcb\x55\x7e\x9e\xae\xae\x76\xbd\xb8\xa9\xd4\x8a\x0f\x99\xc3\x28\x6f\x2d\x62\xb9\xe1\xec\xb9\x5a\xca\x9e\xab\x65\xf8\x31\xe7\x42\xb6\xe2\xac\xfd\xd4\x60\x19\xe0\xa7\xab\xf4\x3d\x60\xe0\x08\xc7\x77\x47\xe5\x63\x28\x37\x3b\x1d\xbd\x69\x1e\x72\x37\x8d\x19\x85\xb6\xc7\xc0\x1f\x43\x1b\x45\xb6\x26\x3d\x29\x16\xb3\x8b\x75\xb6\xc1\xb2\x8e\xbc\x65\xf5\xad\x4a\x03\xb3\xd3\xc0\x2b\x2f\xee\xee\xa6\x08\xc6\x4e\x4b\x10\xc7\x40\xb3\xa9\xcb\xa6\xa7\xa4\x0f\x49\x6b\x72\x71\x92\x4f\xfa\x27\xd9\xef\x20\x24\x1e\x0e\xee\xed\x83\xcc\x7d\xf0\x60\xb4\x0f\xff\xdc\xdf\x95\xff\x08\x9e\xa9\xdb\x32\xe6\x15\x5f\xac\xd0\x23\x5c\x9a\xf1\xff\xe4\xa5\x19\xdd\x93\x8b\x21\x80\x64\x3a\x4e\xf8\x67\x34\x00\xea\x08\x2f\x8d\xfc\x87\x0a\x16\xdc\x32\x31\xd9\x32\x4b\x27\x7d\x18\xf6\x80\xc4\x41\x0f\xd9\xa9\xc8\xf3\x0d\x93\x19\xec\xa2\xa9\xa8\xb8\x0e\xad\x2e\xd3\xa3\x71\x82\xb5\xe2\x1e\x9f\xf2\xc5\x4f\xc2\xcd\x86\x73\xdf\x9e\xc7\x2d\x97\xb2\x2d\x6e\xa2\x89\x27\x55\xd7\x34\x91\x0d\x86\x5c\xdb\x6c\xcf\x58\xde\x75\x6b\xd9\x2b\x7a\xd9\xd1\xeb\x7c\x46\xec\x2c\x31\xec\x63\x53\x97\xc9\x6e\x45\x77\x3a\x74\xb3\x20\x79\xdb\xbd\x7a\x7d\xdb\xbb\xb0\x5b\x99\xe5\x3d\xfc\xca\xb8\xe9\x57\xc6\x5d\xde\xba\x2b\x26\xab\x22\x3c\xf0\xf6\xfc\x66\xf7\x47\xb7\x42\xa3\x5b\xa1\x51\x7d\xa1\xd1\x4e\x3a\x9d\xd6\x8a\x22\x51\x15\x46\x02\x05\x14\xac\x2d\x06\xb2\x2d\xbe\x76\x2a\x27\xf1\x99\x2c\xe2\x80\xba\xbd\x97\x42\x7e\x04\xa5\xd8\x80\x9f\x37\xf1\x8e\xc8\x8e\x23\x81\x1a\x1a\xa4\xca\x0c\x88\x61\x1c\xcb\x60\x44\x0b\x55\x58\x3e\x35\xc1\xef\x92\xfb\xe3\x04\x35\x33\x04\xf1\xc8\x05\x67\x58\xc9\x85\xa4\x4e\x1b\x35\x23\x31\x98\xfc\x2d\xaa\x13\xe4\xc7\x61\xde\xa7\x1a\xd9\x2f\xcf\x56\xb1\xdc\x97\xa5\xd9\x29\xa3\x37\xb7\x45\x5b\x7d\x6d\x97\xde\xdb\xf8\x94\x41\x30\xb0\x5d\xb8\xa4\xc7\xb7\x97\xf4\xed\x25\xbd\xf1\x25\xfd\xea\x62\x95\xbd\x96\x97\x91\x0c\x91\x6a\xaf\x5b\x05\x35\xf0\xaa\x75\x52\x3e\x2f\x9d\xbf\x77\xb7\x47\xf2\xc3\x5f\xeb\x59\xb0\x9f\x2d\xbc\x16\x9a\x90\x91\x5f\x2b\xaa\x82\x60\x94\x45\xc1\x10\xb7\xb6\xa0\x9f\xd2\xe5\xd9\x55\xa4\x89\xad\xaf\x91\x19\x31\x9a\x1a\x91\xa4\x28\xc4\xf0\x24\xe2\xaf\x8e\xac\xb1\xcc\xe6\x41\x1a\xc5\x48\x74\xb3\x74\x05\x91\xc2\x64\x7c\xbd\x0b\x97\x3c\x11\xb4\xd2\x1b\xf4\x00\x11\xfa\x4c\x1f\x3f\x66\xc5\x3a\x9b\xc2\x3d\x45\xb5\x3f\x73\x59\xde\x57\x41\x80\xd1\xb3\x0d\xd6\xf0\x0d\xde\x6c\x00\xf7\x1e\x6c\x0f\xe5\x7a\xc9\x8d\xbf\xe0\xa0\x6b\xfd\x3b\xa8\x8d\xc5\x60\xd5\x7c\x51\xf8\xdc\x92\x20\x1b\x35\x92\x33\x6a\x98\x8a\x54\x88\x28\x99\xa3\x8a\x77\x30\xbb\xaa\x8a\xf0\x91\xcf\xe7\x10\xa6\xfb\xa3\x76\xf4\x29\x4b\x87\x28\x9f\x56\x93\x21\xa5\xb2\xcf\x1a\x1d\x82\x04\xc2\x44\x98\x2f\x8d\x1f\x02\x80\x2e\x04\x7a\x25\xa8\x8a\x0c\x5c\x0a\xa6\xd0\xee\x79\xf6\x11\x12\x60\x95\xe9\xd3\x14\x60\x59\xf0\x12\x71\x3b\x47\x3e\xd5\x35\x31\x48\x6a\x67\xb0\xac\xce\x8d\x4f\xe0\x6a\xe4\xda\x77\xe7\xce\x84\x90\x2d\x83\xc6\x66\xd7\x71\x38\x29\x04\xaf\xb5\x71\x12\xb2\xc6\x76\x58\x38\x13\x9c\xba\x1a\x3a\x36\x1d\x02\xa9\xa5\x42\x2a\x1c\x7f\xb0\xcd\x8b\x69\x66\x42\xbb\x88\x4f\x4f\x9b\x02\x02\xbb\xcc\x65\x10\x55\x2a\xdf\x51\x2f\x19\xbf\xeb\x6e\x4f\x74\x5f\x7a\xb9\xe0\xf4\x50\xde\xd1\x27\x3e\x95\x04\x9b\x7f\x7d\x47\x8b\xf5\x69\xb0\x44\x73\x80\xb7\x2e\x34\xc4\x3c\x48\x57\xe4\xfc\x49\xe7\x6c\x06\x17\x92\x65\x85\x81\xf7\xb3\xd5\x90\x34\x31\x14\x3e\x44\x69\xd4\xca\xaf\xf4\xda\xb2\x7e\x05\xb8\x98\xc0\x73\xdb\x3d\x32\x62\xf1\xad\x25\x74\xa5\x39\xdc\xed\x36\xfa\xd9\x77\xbc\xfa\x20\x64\x0c\xd9\x77\xeb\x4e\x4f\x0f\xd6\x0f\xec\xa7\x3c\xa0\xf2\xef\xea\xcc\x7f\x6c\xde\xd9\x6b\xb3\xa7\x25\x48\xee\xd8\xd2\x12\x20\x64\x0b\xed\x12\x3e\x9b\xf8\x86\xba\xc4\xc1\xd4\xc9\x82\xc9\x3d\xbc\x01\x3c\xa9\xc5\xcc\x36\x7a\x5b\x31\xd3\x8d\x8a\x3d\xd6\xfc\x28\x18\x36\x29\x76\xd0\xee\xed\x4c\x48\x90\x46\x55\x46\xe1\xcc\xd3\x49\x21\x4d\x29\x85\x35\x69\x0b\x1d\x9c\x4a\x6c\x6f\x60\xd0\x0d\xe2\xc0\x50\xa1\x0f\x29\x2f\x15\x1f\x52\x16\x3a\x48\x0f\xe5\x1c\xb4\x57\x81\x5b\xb8\xdb\x01\x83\xbb\xd2\x00\x56\xde\x3c\x01\xac\x2c\xc5\xb0\xc8\x17\x08\xc1\xfa\x9e\x5d\xd2\x26\xc4\xbd\x82\x0e\x14\x15\x7a\x90\x74\x61\x6d\x11\x03\x65\xe9\x7a\x1f\xd6\x64\x35\x22\x2d\xd4\x35\xe7\x41\xab\x42\x07\x89\xde\x41\x07\x89\x0a\x91\x08\x08\x5f\x79\x48\x14\x84\x8b\x23\xd0\xf2\x82\x8c\x34\x91\x75\x37\x21\x68\x2a\xb9\x0c\x40\xfc\x64\x73\xbb\xf7\x12\x92\x10\x96\x3b\xb8\x32\x07\x2c\x3e\x9b\xaa\x00\x1d\x3f\x13\xf5\x52\x6d\xb0\xf9\x65\x0e\x92\xf9\x0d\x5b\x05\x7f\xa3\x53\xe1\x7e\x4a\xd4\x87\x9f\x1e\x6e\xab\x22\x87\xbf\xe8\xb7\xc4\x51\xf5\xdb\xe1\x21\xfc\x46\xc8\x66\x7f\x9a\x8f\x7b\x48\x63\x8b\x14\x66\xc0\x4f\xb4\xfd\x52\x50\x87\xb7\x2b\x28\x90\xfb\x17\x91\xe7\xd9\x60\x26\x49\x45\x3a\x6e\x17\xf6\xc4\x61\xc2\x19\xce\xb2\xea\x0b\x04\x06\xa7\x29\xd8\x1e\xd9\x4c\xd2\xc9\x70\x80\xad\x95\x94\x03\x95\x3d\x82\x77\x29\xee\x82\xf7\x1f\xba\x25\xff\xeb\xbf\xf0\x89\x0d\x7a\xf9\x71\x51\xd2\xcf\xdd\x5a\x1d\xad\x2f\x17\xb0\x4c\x20\x39\xf2\x3b\xe0\xce\x09\x58\xbc\xa0\xc6\x67\xab\x2c\x6b\xd0\xfc\x6f\xb8\xf1\x59\x5a\xa0\x3b\x9e\x5c\xf9\x66\xb4\xe6\x46\x08\xd5\x7a\x31\xdb\x89\x40\x18\x8a\xfd\x19\x02\xea\xc4\x7a\x4e\x7a\x39\xe5\xac\xd3\xb5\x2a\xe7\xe9\x91\x0a\x28\xff\x53\xdf\x61\xac\x39\x20\xee\x00\x2e\xf0\x4e\x98\x7e\x3c\x16\xc8\x07\xe7\x47\x1f\xdd\xe3\xe3\x1c\xb5\x47\xf7\x96\x38\xdd\x7b\x45\x42\xf2\xaa\x64\xf0\x1a\x52\x51\x4d\xf0\xdf\xce\xce\x1b\x30\xe1\x93\xd7\x8f\x18\xe8\x47\xf0\x59\x98\x67\xd9\x54\xcc\xb6\x58\x88\x85\x4d\xd7\x89\x8e\xa1\x9f\x5c\xe6\xb3\x19\xe4\x7b\x9f\x4b\xd7\x25\xc1\xea\xe4\xab\xcc\x85\x30\xb0\x4c\x80\xba\xc7\xf0\x86\x62\x31\x39\x7e\x9c\xbf\xa9\x0e\x72\xa6\x25\x2c\xf8\xf9\x96\x01\x46\xd0\x82\xa8\xa4\xf6\xcf\x6d\x68\x64\xf9\xde\x09\xa4\xa0\x27\xc7\xc7\x4d\x4a\xf4\x68\xb1\x3d\xde\x04\xdd\xaf\x49\x94\x63\x5f\x52\x7a\x0a\xed\x4f\xf4\x7e\x7e\x97\xec\xdf\x4b\x0e\xc8\x23\x19\xef\xff\x7b\x6d\xfb\x40\xae\x94\xef\x92\xf1\x90\x07\x97\x0a\x08\xef\xe2\x90\x07\xc0\x1c\xe2\xef\x44\x2b\xd1\x74\x3c\x2c\x47\x99\x00\x0f\x72\x9c\xb5\x08\xfe\xb3\xd1\x9c\xf7\x02\x53\xa4\x31\x67\xb7\x14\xe0\x36\xfa\xac\x31\x26\xf1\x53\xe7\x9b\x8b\x4b\x0c\x1a\x96\xc7\x5b\x83\xbd\x84\x98\x84\xe8\x15\x10\xcb\x32\x0e\x46\xef\x84\x2f\x9f\xfd\xf3\xa8\x84\xae\x83\xf7\xab\xec\xea\xde\x10\x75\xa7\x32\xe2\xc7\x6a\x95\x8d\xca\x5e\xf0\x21\x24\x57\x28\xfb\xd2\x5e\xe9\x97\x48\xad\x0e\x22\x16\x7e\x4a\x65\x76\x29\x78\xab\xb2\xe8\x92\x7a\x6b\xf8\x40\xa2\x51\xb8\x5e\x2a\x01\x3b\x9a\xc2\xc5\xaa\x80\x39\xb4\x97\x8b\x5c\xbe\xfa\xec\x12\x1b\xd1\xcb\x67\x6f\x9d\x98\x2f\x10\x51\xcd\x67\x7f\xb6\xdc\x90\x88\xa8\xad\xee\x9c\xe3\xe8\xc7\xe0\xaa\x87\x73\xe3\xbd\x10\xe7\xe4\xe1\x19\x8d\x7d\x44\x60\xc6\x4b\x24\x3c\xfe\x5d\x87\x82\xc2\x85\xa8\x63\x44\x4d\xd7\x9f\x63\xf3\x43\x14\xc5\x36\x22\xda\xda\xda\xea\xef\x97\xac\xfe\x3e\xb3\xfa\xf7\x61\xf5\x77\x83\xe1\x3e\x08\x86\xeb\x09\xce\x3e\x73\x2f\xea\x1e\xff\xa2\xe2\xbb\xb2\x3d\x7a\x20\x5e\xd7\x24\x7c\x66\xcf\x18\xe0\xdd\x7b\xde\x9d\xcc\x58\x4c\x22\x35\xf1\x5e\x40\x1a\x38\x0d\x8d\x24\x48\x9f\xc3\x27\xbe\x9f\x09\x6a\xc7\x4e\x0b\xde\x63\xfd\xfa\x82\x7a\x6e\x9c\xa4\xf3\x69\xb2\x2b\x87\x9f\x64\xb3\x59\xbe\x2c\xf2\xc2\x82\x86\xd1\xf6\xd0\x62\x8b\xfe\x5f\xba\x7a\xd3\x16\xef\xd0\x59\xbe\xce\x8e\x97\xe9\x24\xa3\xb3\xd4\x69\xf7\xdb\xf3\x05\xe4\x8f\xe2\x36\x9b\x2c\x60\xff\x32\x3b\xf9\x90\xaf\xfb\xc0\x86\x04\x24\xd1\xcf\xb2\x0e\x40\x8f\xc0\x63\x81\x36\x1d\x47\xc0\xbf\x5f\x7c\x7a\xb9\x82\x68\x48\xde\x97\x3e\x02\x0b\x36\x49\x67\xe6\x33\x06\x27\x8c\x2c\xc8\x49\x60\x80\x9e\x98\x63\x89\xc6\xaf\xef\x90\x31\xa9\x79\x2b\xfc\xb4\xc3\xcb\x8b\xe2\xcc\x68\xc9\xbd\x2e\x7a\xf6\x81\xe9\x21\xab\x01\x9a\xdf\x5e\x3e\xa0\x36\x9b\xbf\xfd\x48\x98\x8d\xd8\xde\x03\x8d\x06\x60\x5b\xd5\x1d\x81\xfb\x4c\x38\x04\x77\x97\x37\x5e\x04\xd5\x2c\x3e\x08\xfd\x6a\x91\x85\xd0\x9f\x8a\x2c\xc5\x06\x03\x41\xed\xea\x8f\x04\x7f\x8c\x5f\x12\xf3\xfc\x34\x5e\x14\xd3\x30\x3e\x18\xd2\x3d\xfd\xfa\xce\xce\x6b\xfa\x32\xe8\x4f\x61\x26\x0b\x04\x0c\x46\xdb\x08\xac\x13\xe2\xf0\x8d\xe1\x02\x06\x97\x1d\xea\x6e\x40\xeb\x19\xa1\x57\x39\xe2\xd5\x67\xdb\x4c\xaf\x70\x2b\x15\xa1\x64\x34\x18\x9b\x60\xa8\xca\x64\xa9\xc0\x6f\x79\x03\x3c\x64\x8e\x86\x1b\x0c\xf7\x5d\xea\xcc\xbe\x62\x57\xcf\x4c\xdb\x17\x5f\xb1\x6d\x74\x7c\x9e\x82\x18\x43\x07\x5a\x08\x85\x0c\x2a\xf9\xfa\xeb\x12\x46\x11\xd9\xcf\x13\x95\x44\x49\x7b\x07\x16\x34\xd6\xfa\x89\xaa\xc6\x12\x0c\x37\xf6\xe3\x7d\xb2\x4d\x0d\x50\xf0\x55\x48\x5c\x5c\xfd\xd1\xb7\x61\xc3\xb7\xe5\x1f\xd4\x30\xe6\xee\xc6\xee\xf8\x47\x52\xd7\x9e\xa4\x1a\xb9\x13\xe0\xfd\x12\x9b\xd0\x4d\x32\x28\x80\x24\x97\x59\x32\x5d\xcc\xdb\x6b\xe5\xbb\x2f\x98\x51\x59\xb1\x50\x4c\xa9\xdc\x57\xc3\xd1\x08\x84\x2a\xc7\x9e\x80\x26\x73\xb8\x13\x06\x96\x28\xb5\xf7\xc5\x79\x90\x71\x0c\x44\xfa\xbe\xf1\xe6\xb6\xc6\x4a\x42\x99\x7e\x77\x2d\x34\xc4\x8e\xb9\xb1\x8f\x5a\xcb\x8a\xe0\xab\x87\xb1\xc5\x31\x87\x64\xe0\xd0\xc6\x1a\xa1\xab\xbd\xf6\x55\x60\x87\xf6\x89\xde\xe0\x9d\x23\x3b\x12\xbf\x58\x3d\xf8\x6e\xd0\x83\x19\x76\xe4\xf5\x51\x23\x6d\xfe\xfa\xa8\x76\x15\xe3\xd2\x9d\x87\x9f\x46\xcc\x03\xbd\xcc\x08\x5d\xeb\xa1\xe3\x6f\x6a\x0b\x51\x8d\xf9\x18\xea\xae\x97\x90\x1f\x44\xd8\x6a\xf7\xd6\x9b\xd2\x00\xa6\xdb\xe1\x3e\x1d\x8e\x9c\x40\x6d\x63\xec\xa4\x55\x2f\xf1\x7e\x7a\xd2\xe1\xeb\xce\x00\xa9\x87\x94\x41\x50\xf8\x90\x96\x1f\x75\x87\xe2\xe6\x84\x7d\xa6\x4a\x6c\x2c\xdf\x92\xfe\x96\x48\x5d\x8a\xd3\x33\x30\x8a\xf1\x3b\xe6\xd4\xfb\xf1\xaa\xb5\xda\x16\x0b\x5b\xbf\x23\xcb\xfa\x1c\xd8\x79\xba\xae\x3d\x7f\x89\xa0\x63\xab\x77\xa4\xcd\x1f\xeb\xe2\x1a\x3d\xd4\x75\xb6\xc0\x77\x50\xe9\x25\x46\x6d\xd0\xdc\xb5\xc5\x5a\xa8\xa2\x4b\xcd\xd9\x2e\x99\xbf\x7a\x61\xad\xf7\x80\xb3\x2a\x55\x2a\x3e\x2e\x17\x00\xe3\x4f\xcc\x20\x19\x9a\xe6\xe4\xb1\x15\x04\xfc\x57\x4a\x3a\x44\x68\x85\xb2\x07\x9f\x7b\xe1\xcb\xa8\x0b\x8e\x9c\xf0\x8d\x10\x30\xbc\x2b\xc7\xf0\xca\xfd\x23\x23\x1b\xd4\x30\x3c\x74\xc4\x77\xa6\x02\x27\x02\xff\x99\x7a\x1e\x34\x46\xf4\xdc\xa3\xfa\x6f\xe2\x55\x13\xdc\x1c\xee\xe1\xd3\x7f\x75\x3d\xdb\x14\x71\xd4\xd5\xc1\x74\xd6\x06\xe9\x72\x39\xbb\x92\xdb\xe7\x1b\x5e\x78\x35\x9d\x53\xfb\x27\xb6\x44\x38\x31\x7a\x56\xe7\xdc\x4e\x57\xf9\xd0\x03\x7d\x32\x63\x7d\xe3\x55\x65\x17\x11\xd0\xba\xc4\x79\xb2\x5d\xe6\xeb\xc9\x59\xc2\x8c\x43\x2e\x45\x5a\x64\xda\x10\xfd\x00\xad\x90\xf9\xe6\xe0\x64\x76\xb1\xc2\xe1\x7b\x44\x95\xd8\xb0\x0f\x87\x5e\x07\xa7\xea\x70\xf0\x7d\x9c\x2a\x3b\x9d\xca\x4e\x3e\xe8\x53\xd1\x8f\xf7\x06\x51\x9e\x3c\xf3\x9f\xc3\x4d\x3e\x19\x04\xd9\x62\x6f\x41\xec\xb6\xdf\xf0\x9a\xf4\x6d\x4e\xc6\x51\x9f\x08\xce\x4c\x63\x1c\xb3\xd3\x28\x3c\x30\x5f\x79\xad\xec\xf6\x4d\xbb\x98\x87\x43\x78\x32\xa3\x27\xa7\x81\x57\x81\x71\x19\x23\x2e\x04\x6e\x28\x5f\xc2\x55\x3a\xf4\xd7\x1f\x3f\x62\xe1\xe2\xd7\x7b\xe2\xfc\x95\xdf\x6d\xb4\xf2\xbb\xf5\x56\x7e\x37\xb2\xf2\x72\x88\x5b\x5e\x7b\x41\x95\x40\xaf\x0d\x76\x42\xc2\x87\x7b\x81\x07\x57\x67\x37\x10\x09\x15\x6e\x46\x48\xc6\xf5\x92\x69\xba\x4e\x7b\x38\xe4\xb7\x5c\xe7\xe2\x11\x62\xaa\xd4\x78\xf3\xe2\xa7\x74\x96\xdb\x53\x04\xed\x90\x2e\xdb\xf3\xd1\xc1\x1d\x7c\x17\x23\xb6\xd5\xc7\x69\x8a\x84\x03\x26\xe9\x19\xed\x4c\xaf\xde\x4c\x5c\x7f\x78\x2c\x8e\xcc\x10\x73\x39\x90\xf1\xc9\xcd\x65\x1a\xba\xc7\xa8\x9b\xa4\x09\x61\xf4\xd9\x75\x1b\x4b\x32\x0a\xa3\xf0\x9f\x1c\x8e\x76\xc0\xfb\xc2\x54\x43\x74\xf5\x40\x5b\x1e\x4b\xab\xc5\x18\xfd\x85\x9a\xf6\x2f\x38\x53\x1a\x6b\x28\xc5\x7f\x33\x98\x06\x6b\xa8\x19\xd4\xc5\x83\x2c\x4b\x53\xc0\x6e\x30\x09\x6b\xcf\x48\xd2\x83\x91\xd1\x92\xde\xf9\x71\xf9\x06\xa1\x41\x9d\x1b\x57\x74\x00\x34\x59\x5a\x38\x02\xd3\x4f\x30\x82\x12\x13\xd3\x08\x84\x1b\x4d\x26\x56\x67\xb1\x94\x7e\x06\xca\x25\x82\x64\xb6\xab\x9f\x32\x8e\x0c\x37\xf8\x1c\xd4\x86\xe3\x2e\x93\x87\x85\x73\x28\x83\x2e\x45\x5b\x79\xa7\x60\x4b\x35\x34\xd6\xa8\xb5\xda\x3c\xbb\x94\x33\x57\x7e\x4f\xea\x46\x30\x65\x55\x16\x1f\x0f\xc3\xb1\x1c\x5a\x94\x64\x86\x69\xfb\x0d\x4f\x4f\x98\xe1\xd1\x6e\x89\x69\x85\x49\x39\x34\xcd\xff\xf5\xbf\xd0\xa4\xf9\x83\xd7\xad\x84\xa8\x79\x34\x39\x79\x9d\x12\x06\x56\x6c\xa2\x85\xa4\x11\x84\x1b\xed\x56\x14\x83\x6b\x2d\x88\x1d\x01\xbb\x18\x78\x7c\xb5\x66\x1d\xb9\x07\xa2\xa0\xd7\x98\xb7\x7f\x40\x4b\x8d\xa7\x49\xde\xc3\x7a\x8b\x22\xc7\x17\x5f\x95\xe8\x6d\x14\x95\x52\xd7\x5b\x16\xef\x16\xbf\xb1\x65\x09\xb2\x41\xd6\x5b\x15\x39\xbc\xf8\xaa\x44\x5f\x09\x5e\xa4\x5d\x6f\x49\x70\xd2\x90\x3f\xe2\x78\xbc\x5d\xc6\x27\x2c\xc7\x56\x35\x5b\x2e\xbd\x4a\x29\xe0\x86\xf3\x95\x2d\x76\x76\x8e\xc5\x84\x95\xb9\x19\x44\x47\x4d\x4e\x57\x8b\x73\xc1\xe8\x9d\x9c\x40\xb6\x89\xe4\x62\x09\x41\x79\xa1\x16\x74\x05\xfd\x7c\x9d\x9d\x6f\x61\x9d\xcc\xc0\xd9\x85\x42\xb3\x0a\x56\x8a\x4f\x1d\xe1\xd7\xc5\xa9\x07\xed\xe0\x10\x27\x5e\x48\x27\xe8\xf3\x48\x5a\x8d\xbf\x4c\x84\xd8\x56\x7a\x6d\xdc\x94\x92\x13\xc1\x77\x1f\x6b\xfa\x19\x4c\xab\xa0\x51\x3a\x93\xae\x40\x24\xad\x8d\x96\xa3\x52\x51\x6f\xc8\xe5\x68\x8a\x1c\xf7\xaa\x9b\x12\xc2\xdc\x0a\x70\x89\xe4\x96\xa1\xc5\xed\x38\x9d\x24\xd0\x32\xf4\x92\x84\xb6\x3d\x28\xb9\xad\x93\xf1\x10\xb2\xda\xf0\xfc\xe1\x1c\xbb\x38\xe7\x49\x34\x8a\xae\x56\x6c\x5a\xe7\x76\xcf\x2d\xb6\x75\xb0\x37\xec\xb5\xa8\xfb\xab\x28\xbb\xd7\xab\x70\x84\xf7\x1d\x7f\x5b\x07\x0f\xc6\xb8\x34\x8c\x91\xcb\xf8\xf1\x8a\x9a\x6f\x55\x4d\x0d\x7f\xd8\xd6\xc1\xb7\xf7\x6b\x01\x5f\x2c\x05\xa8\xfa\x62\xc4\x11\x1a\xe2\xf3\xca\x80\xbe\xc8\x87\xb6\x75\xb0\xbf\x17\xf1\xef\xdf\xbd\xf5\xef\xbf\xf5\xef\xff\xaa\xfe\xfd\xd6\x27\x92\x75\xec\x87\x93\xd8\x87\x39\x5d\x2f\xd0\xcb\x66\x3e\xf7\x32\x93\xa5\x07\x2c\xc3\x67\x13\x27\xf4\x06\x0e\xe8\x7f\xb8\xf3\xb9\xb4\xa4\x46\x39\x09\xe3\xee\xd9\x45\x1c\x08\x4e\xbe\xc9\xa7\x69\xc1\x6a\x78\x72\x9b\x74\x93\xae\x56\x95\xdc\xd9\x9a\xfb\xab\x4d\x68\xa9\x1e\x0b\xf7\xec\x5e\xdb\xe7\xb0\x8e\xa7\x20\x5d\x5c\xcf\x39\xcf\x96\x57\xf9\x37\xd9\xda\xb0\xa3\x82\xe9\x83\xac\x3f\x03\xea\x49\x47\xd5\x0a\x39\x38\xf5\x7b\x33\xaf\x2a\xec\x36\x45\xe7\xe8\x7c\x80\xe0\x0f\x52\x4a\xc6\x05\x25\x6a\x04\x91\x68\x72\x31\xb7\x13\x6b\x5f\x1e\xda\x9c\x1b\x23\xfd\x07\x11\x7b\x7c\xbb\xac\x2a\x47\x3a\x63\xae\xea\x30\x3f\x30\x1b\x2f\xb1\x0a\x35\x90\xbc\x51\x2b\x94\xfe\xac\xed\x54\x51\x27\xae\xf8\x45\x36\xcd\x2f\xce\x23\x7e\x25\x7b\x0f\xa8\x5f\x09\x76\xa3\xf0\xb0\xce\x7a\x2f\x98\x79\x99\xa3\x10\xa2\x8c\x13\xf6\x22\x25\xb6\xbc\x25\xc0\x76\xc0\xa6\x46\x25\xc4\xa4\x16\xa8\x92\x5d\xac\x90\xa0\xdb\x9e\x7a\x1e\xb6\xba\x78\x89\xe1\x88\x36\x8a\xd8\xc7\x0f\x0e\x69\x14\xed\x87\x74\x09\x35\x38\xa8\x8e\x51\x48\x52\x1b\x97\x6b\xbd\x03\x15\xa8\x67\x72\x82\x94\xad\x6e\x7c\xe6\xfe\xd2\xa7\xd4\x29\x61\xfd\x15\xea\x79\x94\x39\x12\x41\x97\x10\xc7\x75\xa2\x3e\x0d\x68\x86\x88\x32\x4a\xd6\x7f\xa1\x05\xa9\xb9\x3f\x8e\xd0\x95\x7b\x1b\xd2\x95\xe5\x09\x03\x9e\x9d\x9f\x5f\xac\xd3\x93\x7c\x96\xaf\xaf\x7e\xc8\x66\xe1\x6b\xad\x86\x98\x23\xb0\xfe\x99\x84\x33\x3d\x84\xb1\x66\x48\x90\x19\x12\x90\xa6\xce\x2b\xef\x1a\xb4\xf9\x17\xb8\x76\x4c\x91\x45\x34\x26\xcb\xf6\xde\x4b\x32\x98\x11\x0d\x1a\x70\x33\xbe\xfb\x75\xde\x51\x29\xe0\x76\x7e\xd5\xcb\x2c\xf0\x2c\xaf\xe3\x2f\x5e\xe1\x3d\x5c\xf9\xc4\x58\x13\x7a\x6d\x53\xe8\x6c\xed\xe7\xce\x25\x8b\x5c\xae\xd5\xf7\x07\xb5\x45\xd2\x57\x44\x88\xc4\xea\xc2\xe0\xed\x32\xa8\xa1\x8e\xb5\xa9\x3a\x4f\x97\x48\x6e\xe0\x38\x2e\x59\x46\xac\x28\xf1\x20\x3d\xf5\x9e\x06\x66\xd5\x6d\xb2\x8e\x9a\xf5\x94\xd9\x52\x59\x30\xa9\x70\x93\x8d\xad\x4a\x9f\x04\x19\x8d\x5c\x57\xee\x1c\xd9\x4b\x2b\x7a\x96\x81\xc5\x95\x99\x6e\x34\x6f\xbb\xeb\x47\x16\xdd\xbf\x65\x6a\x37\x61\x6a\xab\xef\xdf\xeb\x04\xdd\x9c\x7f\x30\xf9\xac\x6b\x33\x50\xae\xc9\xd7\x0f\xbb\x29\xf3\xa7\xf3\xf7\xb5\x38\x46\xaf\xd5\xc4\xb5\xd1\x99\x4e\x91\x1d\xe3\x9c\x02\xf8\x35\x1b\x50\x28\x06\x2c\x77\xa8\x9c\x2b\x13\x35\x39\x17\xf3\xa9\x59\x38\xb1\x89\xcb\x7f\xcf\x7f\x6c\x7b\x0f\x91\x19\x30\x09\x22\xe3\xc6\xc8\xbe\x45\x5b\x0e\xa9\xc3\x74\x7f\xbd\x94\x05\xce\x33\xda\x64\x97\x27\x9d\x2b\x7a\xb0\x5e\xf6\x82\x92\x67\x0a\xb2\x52\x1e\xcb\x6c\xee\x7e\x9c\x52\xc6\x51\xb4\x8e\x37\x20\x75\xbf\xa3\xf1\xd3\xcf\x70\xf2\xfa\x08\x3f\x12\xc4\x5c\x57\x95\x31\x67\xed\x08\xb8\xe3\xca\xdc\xb4\x7f\x3e\xcb\x9c\x1e\xc9\xad\x40\x65\xa8\x7b\x17\x07\x20\xd6\xeb\xb1\x4e\x87\xcf\x70\x7c\x7e\x67\x26\x73\xfe\x1b\x13\x3a\x20\xd6\xe7\x63\x8b\xbd\x9f\xc3\x0d\x99\xaa\x33\xd1\x0e\x23\x12\x94\x86\xc6\x30\x27\x82\x7c\x98\xa3\x41\xac\x2c\xa1\x3e\xd9\xb6\x98\x1f\x41\x7a\x62\x2f\x69\x39\x8d\x78\x64\x6d\x91\x41\x67\x03\xf7\x31\x35\x80\x86\xae\x76\x76\x92\x57\x2a\x37\xac\xb9\x82\x13\x40\xff\xa4\x0d\xae\x13\xc9\xb3\xb9\x78\xd9\x2f\x93\x37\xe9\xc9\x8e\xca\x7e\xdf\xb6\xdf\x07\x1b\xdd\x47\x6b\x71\xaf\x9c\x5c\xac\xb3\xe8\xe7\xdb\x60\x70\xd3\x3f\x13\x0c\xa6\xf4\x04\x95\x7f\x1c\x92\x3e\xb4\xe5\x80\x46\xe5\x0f\xbf\x92\x7e\xdf\xd1\x8e\xf5\x45\xdd\x20\x8e\xbd\xf9\x4a\x7d\xd3\x31\xf4\x39\x83\x3b\x32\x5a\x87\x83\xc1\x18\x78\x2d\x78\x75\x8b\xba\x38\x19\xde\xea\x85\xbd\xe8\xd3\x44\x3f\xaa\x2c\xda\xea\x75\x60\x90\xbc\x41\x98\xff\x94\x09\xf2\x6f\x4f\x81\x54\x16\x91\x70\x65\xe2\xdd\x45\x9e\xb2\xfa\xed\x43\x10\xaa\x28\x50\x28\xa1\x3d\x12\xdc\x39\xfc\xc2\xb4\x2b\x7a\xd9\x50\x57\xb6\x14\x3b\x4a\xc9\x43\x71\xe0\x9d\x8e\x3a\x5e\x63\xcd\xdc\xc4\x50\xa4\x2a\xc7\xf5\xe3\x69\x8a\xb5\x42\x64\xb3\x4e\x57\xae\x4f\x21\xc9\x55\xae\xcb\x3a\xf2\x0c\x5a\x73\xa3\x8f\x4a\xb7\x17\x26\x6d\xbe\x96\xad\x57\x3d\xa3\x2e\x67\x11\x16\xe2\x53\xc4\xe0\xab\xfb\x27\xb0\x04\x6b\x36\x6c\x6d\xb6\x51\x61\x3e\x16\xcf\xa9\x60\x49\xdb\xda\xa1\xb9\x2d\x7b\x73\xef\x96\xbd\xb9\xd5\xd9\x6d\x33\xdb\x66\x85\x22\xed\xa9\x18\x0c\x13\xe8\x19\x64\xd9\x52\x59\x6d\x15\x6e\x26\xe8\x1c\x86\x5a\xab\xd0\x62\x86\x0f\x34\x9a\x3f\x38\x99\xcf\x9f\xfd\xf8\x0f\xe0\xf3\xc4\x3f\xf2\x8d\x38\x7e\xfb\xfd\x0f\x4f\x1e\x3d\x7e\xf2\x5a\x14\xda\xbf\x65\xcd\x8f\x4f\x8e\xdf\x3c\x79\x0c\xe2\x36\xf9\x47\xfb\x8e\x61\x57\x1b\xb2\x94\xff\x3d\xd8\xc9\x4a\x3e\x4c\x81\xc1\xd2\x1f\xd5\x07\x95\xf4\x77\x03\xf8\x1a\x0a\x3e\xdb\x6d\x0d\xd8\xd4\x90\x64\xe5\x5f\x56\x4b\x52\x0e\x03\x24\x61\x39\xc4\x3a\x12\x06\xb8\x19\x3f\x8c\x0d\xaa\xca\xe3\x23\x57\xc5\x50\x2e\x2c\xbf\x11\xff\x5a\x19\x0f\x6f\x31\x0b\x2c\x82\xf3\x89\xc5\x2b\x8d\x64\xf2\x9f\xed\x31\xe7\x66\xf5\xca\x98\xf3\x1e\xc7\xc8\x7f\x75\x96\x7a\x99\x4e\xa4\x56\x90\xf0\xd4\xaa\xb0\xde\x07\x0a\x05\xbc\x31\xa3\x5e\x26\x50\xde\x90\x53\xff\x73\xf0\xe3\x0d\x19\xd5\x75\x8c\x3b\x36\xe7\xd9\x2d\xcb\xa9\xe0\xc0\x60\x45\xa4\x55\x61\x45\x4c\x28\xd1\xeb\xa3\x99\xa0\x50\x04\xf8\x24\xf3\x42\x5f\x69\xfc\x73\xd7\x4a\xec\x13\x7e\x13\x7b\x6b\x91\x58\x59\xcd\x57\xbd\xfa\x2b\xdc\x98\x20\xd8\xc8\xf5\x76\x5b\x85\x31\xf2\xb6\xcf\x62\xfd\x60\x9a\x15\x1f\x04\x4f\xf0\xf7\x0b\xb1\x2f\xc1\x76\xa8\xab\x93\x51\x7a\x84\x11\xe2\x38\x9c\x8a\x7c\x25\xf9\x06\xe7\xaa\x2c\x9b\x12\x7c\xff\x07\x7e\x5a\x67\xcd\x9b\x98\xa8\x43\x06\x47\xc4\x80\xfc\x00\x5c\x7d\x1c\x2f\xac\x3c\x3e\x23\x56\xd9\xef\xe2\x28\x70\xd7\x3b\x01\xeb\x20\x6e\x17\x8a\x43\xd5\x89\xec\x79\xbf\xf2\x42\x5c\xa5\xd3\x7c\xa1\x0d\x60\x8b\xfc\xf7\x0c\xb2\x4a\x8f\x63\xc8\x19\x9c\xb2\xbd\x71\x4c\x8c\x75\x2b\x70\xab\x2f\x70\x6b\x98\xad\x31\x57\x34\xb4\x27\x40\x93\xf1\xc4\x05\x8e\xf3\x35\xf6\xb2\xe2\xab\x53\x24\x40\x63\xaa\xd5\xed\xcb\xd7\x29\xbc\x8c\xda\x84\xd4\x11\x8e\x79\xe9\x5f\x09\x41\xda\x35\xd3\xe5\x64\x43\x86\xa3\xa8\x97\xe4\x31\x77\x91\xb5\xdc\x87\x8e\x03\xb1\x55\x0d\xe9\x59\xb7\x17\x11\x05\x91\xa1\x13\x89\x80\x07\x44\xa9\xe8\x2e\xd9\x9f\xed\xcc\x54\xf6\x16\x4c\xd7\x91\xd9\xa5\x73\xa0\xc3\x8b\x4d\x44\xba\x75\x1a\xa4\x2b\x93\xdd\x41\x40\xd9\x76\xa0\xc0\x2e\x99\x80\xea\xf9\x0b\x23\xd0\xa2\x8e\x93\xc1\x90\x34\xa6\x42\x9a\x72\x8b\x88\x5d\x87\xbf\x5b\x1d\xa4\xea\x95\x1f\xa6\xaa\x2b\x19\xa8\x3b\x71\xde\x58\xf1\x51\xdc\xea\x70\x7d\x4b\x00\x6e\x30\x25\x03\x06\xb4\xb0\x87\xd1\x2b\xe7\xcf\xf1\xda\x0b\xbb\x53\x6a\xe4\x81\x2f\x13\x67\x7d\xb1\x26\x31\x86\x50\x10\x7d\x15\x98\x88\x86\xd0\x17\x65\x3e\x24\xed\xcd\x94\x50\xa8\x7a\x01\xfc\x9b\xa5\x06\xa8\x67\xb4\xa2\xd5\x02\xe0\xb5\xed\x40\xe4\x4f\x5c\x5f\x62\x90\xd2\xd8\xf4\x72\x6d\x03\xb4\xbb\x35\x33\xbf\x5c\x8d\x1f\x18\x9e\x06\x8e\xc7\xe6\x9b\xc6\x11\xdd\x8f\xdc\x9e\x04\xcf\x02\x87\xca\x26\xbe\x12\x9f\xa9\xd0\x31\xc4\x34\x8c\x89\x6a\x43\x1c\x40\x34\x9e\x98\x44\x86\x0d\x2c\xf3\xa8\xdf\xb6\x7d\xe4\x2b\xf4\x09\x0d\xf4\x00\x7c\x88\xb6\x68\x4c\xb6\x2d\x2a\x04\x02\xdd\xc6\x4d\xaa\x9c\xfe\x40\x15\x12\xe5\x95\x98\xdb\xcd\xda\x37\x21\xe6\x25\xe0\xfb\x28\xa3\xd9\xe3\xb0\x38\x60\xfc\xdc\x6d\x19\xfa\x88\xb1\xee\x73\xa1\xbf\x5c\x6d\x65\x81\xf3\x58\x63\x8b\x3b\x74\xdd\x24\xbe\x72\x23\xe3\xfd\xcd\x8d\x97\x79\x4f\x4f\x78\xba\xc1\xf0\xd4\x5d\xcf\x14\x72\x43\x73\x1f\xba\xb6\x2e\x69\xbb\x5a\xa2\x3a\xab\xd8\x54\x6f\xb4\x5d\x85\x50\x6c\x84\x11\x15\x51\xa0\x1e\xb2\xe2\xf6\xd6\xc1\xde\x7e\x0d\x17\x36\xb5\x51\xad\x83\xd1\xee\xd0\x57\x20\xdd\xbf\x55\x20\xdd\x2a\x90\x9a\x2b\x90\x8e\x8a\xe2\xc9\x47\x1d\xbe\x35\xcc\xc8\x5a\x14\x7d\xa9\x6d\x36\xd0\xff\xc8\xae\x74\xe6\x92\x10\x58\x4c\xb8\x0f\x62\x22\x04\x7b\xb4\x98\xc6\x61\x27\xa2\xf2\xfa\xfe\x60\x1b\xe4\x6d\x95\x46\x00\x8f\x2e\xd3\xab\xf8\xc7\x26\x00\xd2\x4f\x35\x4c\x2d\x57\x32\x4f\x73\x85\x8c\xd1\x41\xcc\x2d\x7d\xa5\x9d\xbd\x3a\xb1\x9b\x24\x76\xeb\xf3\x0f\xfd\x00\xde\x3a\x43\xf0\x8d\xac\x5f\x01\x6d\x79\x67\xe7\x1b\xfe\xbf\x3b\xdf\x68\xcb\x5c\x39\xde\xe4\xc8\x88\x9f\xee\x44\xe0\x77\x90\x15\x7d\x43\xdd\x1c\x6d\xe4\x69\xe8\xc8\x3e\x7c\x15\xbf\xb9\x26\x0a\xbb\x32\x7b\x4e\x05\x61\xd4\x17\xb1\x74\xa1\x41\x97\xc6\x33\xa4\xcc\x63\xa0\x8e\x0e\xab\xda\x32\x74\x31\x87\x81\x55\x28\xb9\xcc\xf8\x4b\x15\x7d\x77\xb6\xa6\x81\xba\x69\x4b\xd0\x45\x98\x04\x53\x2d\xd4\x33\xb5\xef\x81\x3f\xa1\x95\xbb\x5a\x44\x44\x1f\x0d\x2b\x3b\xc4\xf4\xe4\xb7\x09\x04\xf4\x75\xf8\x8d\x0d\x71\x6c\xdb\xc7\xf9\x54\x50\x0b\x24\x48\x40\x50\xe7\x75\x6b\xc4\xd9\x7e\xcf\x8a\xbb\x94\xbc\xa9\x11\xdc\x99\xa8\x84\xba\x3e\x23\x81\xf8\xc2\x91\xbc\x5d\x4e\xe9\xba\x86\x95\x35\xc7\x72\xab\xab\xf3\x74\x16\xd7\x53\x26\xfc\x39\xb5\x4a\xb7\x2a\x8e\x7f\x07\x15\xc7\x8d\x6a\xf3\xeb\xe8\x4f\x4a\xd4\x11\x00\xc2\xc4\x3d\xa9\x96\x97\x6c\x2e\xff\x30\x3b\x12\xcd\xe0\xf5\x25\x94\x91\x60\xab\x62\xa9\x72\xb8\x28\xd6\x8b\xf3\x47\x10\xdf\xe3\xb1\x80\x32\x8a\x04\xd3\x75\x93\x33\xf9\x22\x9f\xe7\xc9\x37\x49\xdf\x7a\xf5\x95\x22\x83\xdb\x0a\x08\x2b\x02\x91\xb7\xe0\xca\x16\xab\x01\x6a\x76\x87\x19\xd8\x8d\xb8\xd4\xcd\x4f\xd2\x4b\xd8\x03\x5e\xfc\x74\xb5\x84\x7a\x70\x50\xa4\x78\x33\x97\x74\xf9\x21\x90\x63\x92\xbe\xfe\x2f\x7b\xef\xfe\xe6\xc4\x8d\x34\x8c\xfe\x7c\xf8\x2b\x3a\xf3\x7e\xef\xda\x4e\x6c\x8f\xef\x97\x61\x59\x3e\xae\x0b\xcf\x42\xe0\x61\x48\xb2\x59\x1e\x0e\x4f\xdb\x6e\x33\xfd\xe2\xb1\x7d\xdc\x1e\x86\x49\x96\xff\xfd\xa8\x4a\xb7\x2a\x49\xdd\x6e\x7b\x86\x6c\xf8\x3e\x20\xc1\xb6\x54\xba\x95\x4a\x52\x55\xa9\x54\x65\xf5\x99\x07\x2b\x12\xa5\x7f\x65\x98\xf4\x8a\xa7\x8f\x53\x8e\x2d\x0b\x55\x80\xc0\x61\xd8\xb3\xb0\x58\x01\xe8\xb0\x07\x1e\x30\xc4\x0a\x0a\x28\x0b\x21\xd9\x87\xbd\xd8\x86\x40\x2f\xb6\xee\x4b\xc2\x9c\xa7\xd6\x9a\xff\xb6\x15\x5b\x9c\x18\xb6\xd8\xd1\xaa\x12\xef\x9b\x64\x12\x68\xbe\xe5\xe7\x02\x8b\x8c\x02\xba\x16\x65\x79\x8b\x24\x58\x86\x18\xb7\x55\x04\xa5\xcf\x56\xd3\x0c\x15\x26\x8d\x29\xd6\xd0\x20\x7e\x74\xdc\x33\x23\xa4\xf1\x5d\x2d\x5f\xc6\x62\x17\xda\x2a\xf6\x98\xbe\x2b\x0f\x19\x6a\x13\xef\xd4\x21\x0c\xe3\xcc\xee\x78\x43\x2e\x89\x6e\x69\x28\x81\x1e\xcf\x56\x80\x20\x8d\x9b\x54\x1f\xf0\xb4\x70\x4a\x08\xd3\xaf\x07\xab\x67\x9e\x69\xb7\xcf\xd2\x59\x02\x93\xe4\xba\x51\xff\x98\x66\xe9\xc4\xe8\xa6\xad\x9f\x4a\xda\x02\x08\x34\x62\x28\x18\xcd\x62\x27\xa9\x6b\x79\x87\x0c\x4e\x3d\x8a\xff\x21\x6a\xc3\xfd\x00\x42\x12\x96\x52\xf2\x1c\xb6\x2a\x72\x74\xb8\x59\xd5\x5d\x0a\x3d\xdf\x5b\x69\xa1\x17\x4e\xd9\x81\x34\x53\xa1\xf4\x75\xb3\x32\x21\x78\x14\xda\x2a\x88\x52\xd2\x67\x99\x99\x83\xb0\x00\x43\x4d\xce\xc2\x24\xec\x75\x1c\x5a\x23\x32\x80\x25\xa5\x5c\x68\xe9\xe2\xdc\x02\xaa\xd2\x36\x41\x9e\x5c\x18\x24\x49\x54\x22\x24\x87\xd5\x7c\x2e\x30\xf5\x0b\x70\x59\x8a\x8b\x24\x83\xe2\xfb\x1e\x1d\x10\xcf\x39\x78\x4e\xc8\x4b\x03\xed\x13\x99\xd3\x14\xf3\x88\xec\x0a\x5e\x39\x2f\x02\x88\x3c\x68\xee\xcc\x73\x90\xeb\x0b\x4e\xee\x46\xc1\x06\xcd\xb3\x78\x07\x7c\x3a\x65\x95\x92\x05\xc9\xab\x24\x19\xe8\x38\x54\x2a\xe6\xf5\x4a\xa7\x88\x65\xca\x68\x55\xc4\x51\x51\x17\x54\x74\xbb\x84\x08\xcb\x95\xeb\xf2\xa4\x0a\xea\xd6\x21\xeb\x50\xd5\x3a\x94\x0d\x69\xd6\x65\x9d\xa5\x55\xff\x78\x36\x86\x3b\x77\xb1\x3d\xb8\x6f\x17\xdb\x60\xd7\xa0\xc6\x5c\x95\xbf\xd4\xf9\x7b\x4a\xb7\x5b\xdf\xef\x52\xb3\x1d\x1b\xdd\xe1\x1e\x16\xef\x7f\xb4\xb5\x3b\xc4\x18\xfb\x45\x0a\x61\xd7\x54\x3b\x95\xb1\xad\x76\x0f\x9a\xdd\x4a\xac\xd2\x4a\x38\x2d\xa7\x3d\x2d\xd2\x06\x4a\x50\x7b\x50\xe6\x0f\xd9\x1c\x9a\xf9\x20\x65\xd4\x7e\xa5\x74\x71\x01\xd0\x02\x37\x60\xb9\x65\xe4\x6b\xb3\x32\xe0\x25\x5f\x16\x78\xe0\x05\xbd\x2a\x2c\x17\xee\x99\xff\x4e\xfd\x7a\x8a\x42\x7b\x0c\x9e\x9e\x49\x47\xcb\xe5\x75\x86\xd7\x7f\x24\x6f\xd7\x11\xe5\xbe\x2c\xa9\xb1\xce\x58\x96\x8c\xc0\x6a\x7a\xb2\xbe\x5e\x9c\xd5\x62\xfa\xc4\x33\xa0\x4b\x9f\xdd\x01\x1d\xa6\xab\xdc\xcd\xad\x20\xd8\xf1\xf1\x69\xb2\x8d\xc0\x5f\x2c\x3e\x1f\x46\x25\x0e\x39\x7f\x64\x78\x11\xc4\x46\x35\x59\x90\x42\x62\x5a\xa2\xd5\x26\x7a\x22\x90\x62\x4b\x0b\x39\x76\xb5\x01\xf3\x65\xf0\x41\x8b\x88\x41\xff\x21\xa4\x3e\xa9\x5e\xf8\xd9\x64\x5d\x47\x13\x0a\xcf\x2c\x71\x22\x73\x8e\x5e\x35\x33\x68\x30\x66\x60\x4d\xaa\x8e\x71\xe4\x70\xf4\x3a\xe2\x15\x2f\xe4\x66\xbb\xb1\xd1\xc2\xc3\xa2\x01\x55\x4c\xff\x7f\x49\x17\x8b\x57\xc9\x34\x11\x14\xec\xd2\x67\x2e\x8c\x99\xd4\x3d\x66\x2b\x67\xda\x6b\x5f\x4c\xb1\xf4\x15\xa9\x9d\x77\xaa\x1d\xa7\x3a\x82\xff\x7d\x0e\xe9\xd9\xe9\xa3\xaa\xb5\x84\x8a\xc8\x2b\xa8\xdd\xe7\xed\x55\xd6\xde\x94\x9e\xd0\x6b\xd5\x66\x12\x4b\xce\x07\x23\x8c\x45\x15\xa9\xe9\xad\x10\x87\x67\xab\x8b\x2d\xe8\xa6\x95\x92\x3d\xfa\x2e\x3d\x07\x73\x83\x78\xe9\xbf\x9f\x08\x7a\xe5\xf3\x1f\x25\xec\xa0\x05\x73\xba\x94\x7a\x06\xb3\x6f\x65\x6e\x9f\xed\xce\x6c\xbb\x5c\x14\x08\xba\x44\xc8\x78\xf2\x0c\xe1\x37\x75\xd0\xb4\xdd\x66\xe1\x16\x97\x36\xa9\x5f\x52\x74\x4d\x24\x71\xbd\x93\x53\x6a\x3f\xc4\x82\x7d\x87\x06\x76\x4f\x87\x7a\xae\xe2\x03\xef\xc7\x1f\x68\x8a\xa7\x98\x88\x27\x6a\xec\x95\x56\x85\xaa\x18\xc4\x26\x43\x83\xa1\x9a\x84\x12\x7a\x85\x6b\x59\xd9\xe9\x89\x26\xfa\x61\x9d\x14\x50\xfa\x3a\xa6\xbb\xef\x04\xde\xb4\x1f\xaf\xaa\xa7\xd7\xa0\xb9\x54\x5a\x61\x85\xc8\x94\x9c\xdb\x5b\x76\x63\x8c\x6c\xc7\x06\xa4\x61\xa4\x89\x1c\x90\x4c\xdf\x32\xf0\x47\x00\x65\x26\x9d\x0a\x88\x3c\xa2\x37\x64\x1c\x1f\xbf\x16\x59\x11\xf2\xd6\xa2\x99\x08\x23\x6d\x88\x03\xf9\x43\x92\xac\x61\x0b\x99\x7e\x88\x56\xf3\x28\x5e\x2c\x74\x54\x59\x3c\x4b\x40\x1f\x41\xea\x95\x59\xa1\x78\xe1\xcc\xba\xa8\x25\xad\x8b\x0a\x4e\x52\x6d\x68\xa4\x06\x4e\xf0\x16\x2a\x04\x66\x32\xb7\x02\x08\xd2\x00\x56\x2a\xbc\x43\xcd\xc0\xa3\xbb\x4a\x8b\x70\xe2\x43\x32\xdb\xdf\x77\xa4\x7d\x7a\x1b\xa2\xf3\x95\xbd\xb6\x01\x53\xe6\xda\x16\x40\x59\xef\x5b\x00\x48\xa0\x00\xd4\x1e\xdd\x42\x99\x54\x0a\x6a\xcc\xec\x2d\x9c\x4c\x0a\x9b\x78\x1b\xa0\x5d\x56\xde\x06\x90\x1a\x7a\x53\xe8\x9d\x8a\x7e\x5d\x03\xea\xfa\xe1\xa9\x79\x5d\x7a\x84\x81\x4f\x33\x14\xf8\x21\xfb\x0b\xdf\x82\xa6\xd2\xc4\xc0\x59\x87\xdd\xb3\xa3\x10\x92\x03\xd0\x85\x59\x11\x18\xf4\x4e\x2b\x59\x9a\x52\xb0\xc0\xb7\xea\x06\xc2\x5f\x58\xa1\x3d\x8f\xda\xee\x70\x4f\x7a\xca\x50\x39\xad\xb3\x34\xad\x5d\xe7\xa9\xda\x82\x83\x28\x12\x89\xdc\x81\xe4\xe7\x94\x90\xe6\x28\x76\x7c\x10\xac\x95\x01\x58\x75\xbc\xa5\x6d\x0e\x11\x36\x94\x0e\x0a\x61\xbc\x20\xdd\x4c\x03\xb7\x3c\x7e\x01\xe3\x3b\xcd\xf4\x57\xa5\x38\x63\x52\x9e\x60\xec\xa8\xa4\x65\xdd\xe7\x50\x28\xc1\xc2\x99\xb4\x5e\x06\xf6\x9c\x4e\xcf\xb4\xea\xf0\x39\x2d\x89\x5e\xd3\x62\x3e\x8e\x77\xba\xe0\xcd\x9b\x09\x53\x77\x8d\x57\x3e\x4f\x37\x99\x3c\x69\x4e\x60\x63\x15\xd4\xd5\xda\x49\x5d\x07\xcc\x82\xf2\xe8\x40\x4a\xd9\x3b\x46\x1e\x92\x91\xb7\x8e\xbc\x42\x64\xe3\x2c\x8a\x5f\x2e\x00\x18\x89\x5a\x00\x12\x23\x8e\xcd\x49\x44\x43\x3a\x3a\xd7\x59\xf0\xc7\x71\x9c\xdd\xf1\xd8\x06\xf9\xa7\xe4\x5d\x65\x07\x36\x30\xf0\x5d\x55\xc7\x68\x9a\xd2\x83\xb6\xba\xba\x74\x1d\x62\xab\x4e\x96\xa0\x48\x6e\x32\xb7\xeb\x76\x49\x21\xcf\x23\xc6\xf2\x64\x2b\xcf\x62\x3f\xa4\xee\x7f\x68\x93\x22\xfa\x3c\x7b\x4c\xf2\xdb\x30\x0a\x76\x5a\xbc\x35\xf1\x42\x25\xf8\x46\x9c\xfe\xd0\xd5\x2f\x6a\x36\xef\xc1\xf0\xe3\xad\xdb\xe7\xd0\xfd\xaf\x2c\xf0\x30\x89\xf3\x8a\x78\x77\x75\x3f\x9a\xc0\xd4\x78\x31\x59\x63\xcb\x2f\xc4\x37\xc9\x48\x2e\x69\xe1\x32\x55\xf6\x24\xfb\x6e\x8b\xac\xaf\xfe\xf5\x31\xfc\xd9\x4d\x97\xd4\x45\x46\xe0\x35\x4b\x2e\x15\x85\xa9\x37\x8f\x7e\x0f\xa1\x53\x6d\x73\xc5\x18\x31\x17\x44\x3e\xab\x67\xac\x98\x0b\x52\x72\xcb\x77\x8b\xed\x38\x4f\xbd\xf1\x59\x77\x08\x3e\xcb\xe7\x02\x6b\xdf\x0c\x0e\xd3\xe7\x82\x69\xeb\x2e\x87\xed\xf3\x76\x42\xfe\xec\x8b\xbf\x25\xf1\x10\xb6\x73\x71\x87\x6f\xe4\xbd\x0b\x6a\x0d\xba\xe7\x32\x2c\xb9\x10\x59\x99\xcf\xb5\xf0\xbe\x42\x4d\x00\xe0\x8f\x59\x64\x9f\x99\xd4\xc7\x83\x2a\xb1\x95\x15\x7c\xfc\xc6\x4b\x11\x01\x91\x28\xd7\x98\x23\x38\xae\x21\x35\x8a\x3a\xa9\xa4\x0c\xe9\xea\xb4\xf8\x28\xaf\x72\xef\x44\x95\x76\xab\xf5\xdf\x95\xf0\x9b\x50\xa3\x8b\xb6\x12\x54\xb2\x50\x57\xc3\x97\xba\x3c\x00\x55\x6e\x13\x01\x4b\xd7\xac\xde\x02\x34\x51\xeb\x2e\xb6\x0f\xd8\x38\xe2\xc5\xc3\xf4\xbc\xca\xef\x93\x6b\xe4\x42\xd9\xe0\xc3\x6b\xc7\xd4\x4c\x90\xe2\x2a\x3e\x29\x66\x7c\xa5\x68\x58\x4f\xab\x45\x78\x3b\xc4\xb0\x22\x57\xdd\xf7\x89\x5d\x6d\x1d\x2f\x67\x4f\x54\x29\x75\x2d\x9a\x80\xf4\xa7\xe6\x6e\xb5\x58\xc4\xeb\x2c\x71\x20\x6e\x69\xda\x50\x5d\xf7\xab\xa1\x9d\x0f\x35\x42\x9d\xaf\x43\x53\x8a\x5f\x22\x32\x7b\x39\xf3\x00\xa3\x5d\xdc\x61\x1d\xc0\x15\x33\xa4\x02\xa5\x07\xa3\xba\x81\x7c\xf5\xa1\x2d\xa6\x2c\x40\xef\x58\x7d\xc8\x13\x54\x8d\xc1\xe8\xa4\xd9\x6a\x15\xc2\x2a\xab\xda\xad\xb2\xff\xde\x6c\x46\x54\x8f\x66\x0a\xbf\x33\x14\x62\x33\x03\x64\x6a\x33\x45\xcb\x21\xad\x25\x5f\x86\xfa\x18\xfd\xb4\xbd\xb7\x4c\xcf\x31\x12\xd7\xe3\x8d\xd8\xa1\xab\xf6\xa5\x93\x6d\xc4\x60\x52\xb5\xa5\xb5\x7e\xb0\x2a\x94\xda\xcf\x9c\xb4\xc7\xc7\xd1\xaf\x89\x58\xd5\x3a\x3e\x9e\xc0\x37\xb0\xe9\x89\x8a\x50\xaf\xb1\x23\x66\x5d\x63\xa0\x19\xa1\x22\xe5\x3c\xfe\x90\x64\x58\x84\x0c\x25\x3b\x5f\xe1\x89\xda\x74\x87\x6b\x15\xc3\xa2\x13\x7a\xa2\xe8\xf2\xf2\x61\xa5\x2e\x78\x37\xb8\x99\x3f\x66\x4b\xec\x81\xad\x80\x16\xb6\x57\xf8\xf6\xcb\x0e\x5e\x5f\x1c\x18\x14\xe9\x2b\x9a\x45\x12\xc5\x73\x78\xcd\x0d\xb9\xb1\xc6\x39\x28\x8e\x66\xa0\x2b\xce\x56\xa6\x8a\xed\x59\xbc\x55\x9c\x37\xd1\x1c\x65\x42\xd0\x58\x46\x13\x01\x09\x57\x75\x0a\x58\xbf\x59\x82\x93\xc8\x20\xed\xd1\x72\x86\x04\x16\x9a\x49\xa8\xff\xb9\x40\x74\x94\x5d\x6c\xc8\xae\x29\x7a\x81\x16\x40\x93\x64\xbe\x12\xe9\x62\xc3\xda\xe2\xf5\x12\x19\x48\x93\xd4\x80\xf3\x25\xfe\x13\x63\x83\xbb\xa8\x8b\x2d\x6a\xab\xe6\x71\xb6\x8d\xf0\xbd\x50\x66\xd5\x6f\x82\x80\xdf\x85\xf6\x98\x22\x92\x52\x40\x15\xcb\xce\x85\xa9\x5c\x86\xd9\x26\x30\x4e\xf8\x7d\x2d\xb7\x7d\x76\x14\x90\xee\x72\x74\x14\x91\x85\xab\xd5\x1c\x3c\xb0\x5a\x35\x21\x29\x52\x97\x5b\xbd\x22\x9b\xba\x40\xe6\x34\x86\x57\x86\xe9\x16\x70\xb5\x5c\x6d\xa3\x2b\x91\x0b\x10\xe9\x12\xe1\xe5\x90\xfc\x7d\x43\x57\xfb\x7d\xd4\x31\x9b\x83\xb9\x01\x54\xc1\x09\x71\x01\xc5\x0b\xa4\x30\x91\x3a\xd9\xac\x2e\x33\x20\xae\x15\xde\xab\x02\x71\xc1\x8b\xb9\x2b\x71\xdc\x82\x6d\xb9\xe8\x43\x93\x9f\x36\xf6\xda\x90\x2d\xe2\xf0\x42\xd0\x47\x9f\xea\xcb\xc3\x44\xd0\xf1\x39\xbc\x7e\x83\xa6\x15\xd4\x6a\x6e\xc8\x49\x36\xa5\x57\x0f\xb1\xaa\x92\xf8\x34\xf5\xfc\xb4\x3c\x63\xf7\x9a\x97\x42\xbc\xa4\x55\x02\xaa\xe0\x0e\x09\x46\xf5\x5b\xb2\x59\x35\xf3\xba\xd7\x32\xeb\x33\x67\x7c\x96\xa2\x28\x0f\x72\xa6\xba\x63\x6d\xad\x02\x47\x1a\x33\xb8\x0a\x1e\x79\x7b\xdb\xad\x5d\xfb\x60\x5a\x6d\xd2\xf7\xe9\x32\x5e\xbc\x30\x5b\x90\xbb\x2b\x1d\x72\xa8\x80\xba\xdf\xad\x19\xee\x67\x2b\x95\x3f\xf8\xb8\x09\xef\xa2\x92\x46\xc5\x46\x19\xe1\x06\x69\xb7\xd0\xcb\xd5\xe6\x43\x86\x76\x3a\xc9\x66\x71\x75\xd0\x91\x85\x56\x01\x86\x10\xf3\x77\xfa\x56\xfe\x61\x41\x88\x30\xef\x98\x2a\x04\x31\xa7\x93\x82\x52\x60\x48\x55\x4b\x0c\xe1\xad\x31\x25\x7e\xb2\x1d\x7d\xf7\xe6\xf8\xd9\x54\x07\x73\xef\x51\x8f\x9a\x63\xac\x57\x72\x78\x85\xe7\x8a\x80\x0b\x6d\xac\xfe\xe4\xd2\xa5\x93\x33\xf5\x94\x57\xbd\x44\x17\xea\xcd\x8d\x34\xd4\xe0\xc0\x76\xbc\x6a\xed\x16\x01\xcb\x9a\x2d\x27\x6a\x2f\x05\x93\xed\xeb\xf4\x3c\x11\x07\x16\x82\xd4\xa3\xf6\x80\x1b\x25\x32\xcd\x03\x37\x4b\x64\x59\x5f\xdc\x30\xd1\xf4\x28\xd8\x17\xb7\xf0\xb5\xdb\x0e\xdf\x11\x41\xde\xdb\x40\x77\x3c\x77\x0d\x34\x9d\xd6\xea\x7b\x6d\xf0\xfb\x11\xf2\xd0\x10\xae\x2d\xbf\x8f\x9e\xdf\x06\xd3\x57\x23\x20\xfb\xdd\x35\x59\x1e\x1a\x5d\xfb\x59\x66\x08\x25\xd5\xab\x9f\xbd\x96\x88\x5c\xed\xb7\x45\x32\xf3\x27\x8d\x2a\x6c\xfe\x91\xc8\x75\xa9\x20\x0b\x7b\xd4\xe2\xeb\x90\xdc\x1b\xd3\x6e\xa8\x44\xc7\x10\xb4\xea\xda\x80\x73\x7b\x1d\xcd\xae\xd5\xd4\x0a\x22\x32\x98\x62\x4d\xef\x38\x92\xfc\x9b\xb0\xee\x49\x5d\x37\x42\x9b\xaa\xa0\x38\x6c\xe4\x37\xed\x9a\xca\x24\x9b\x03\x30\xaf\xae\xa6\xb6\x45\x77\xba\xa5\xef\xbe\x84\x2c\x7d\x96\x4e\x89\x2c\x8f\x2a\x7a\xf5\x0a\xbf\xf9\xd3\x4b\xab\x03\x94\x7d\xd7\x73\x03\x91\x1e\xd2\xd5\x45\x06\x33\x56\x25\xca\x44\xa5\x4a\x0c\xd4\xf5\xf0\xc5\x2f\x3f\xe6\xd5\xf6\xa3\xd8\xf1\xca\xd7\xf4\xea\xe9\xdf\x9f\xbc\x76\xab\xda\x6e\xae\x5e\x13\x2b\x6a\x9f\x4c\x9e\x1a\xab\xdb\x5d\xf5\x3f\x7b\xf4\xd8\xab\x7e\x2a\x6d\xe1\xca\x14\x7f\x74\xfa\xe0\x1a\xa5\x5f\xdf\xbb\xbf\xb3\xb4\x9a\x49\x90\x1f\x33\xc9\x4e\x6f\xe3\x09\xde\x76\x80\xdc\x83\xde\x0e\xde\xc7\xca\x15\x98\xdb\xb9\x1f\x5f\xdb\xfb\x2e\x96\x73\xfa\xf2\xde\x83\x47\xb6\xe9\x50\x74\x76\x68\x70\x99\x24\x33\x90\xaf\x16\x70\xe3\xad\x64\x20\xe8\x01\x76\xd2\x9b\x93\xf4\xfd\x7b\xfd\x9c\x16\xaa\x48\xf2\x50\xe0\x69\x9c\xed\x10\x8d\x61\x10\x39\xa3\x92\x60\x40\x83\xdc\x90\xf2\x6a\xb5\x87\x68\x97\x2e\xfc\x30\x6d\x13\x96\x55\x3d\x11\xbc\x93\xa7\x34\x16\x1b\x82\xe2\x7a\x0c\xe4\xf3\x78\x7b\xd6\x3c\x8f\x3f\x55\x55\x4a\x23\x6a\xd7\xa3\x16\x35\xa8\xcf\xdb\xaa\x54\x81\xcf\xa1\x11\xe8\xf5\x12\xea\xbd\x5d\x4b\x37\xd1\xf3\x74\xa9\x7b\xfe\x03\xf4\xdc\x51\x60\x2a\xcb\x44\x31\xa8\x43\x47\xe4\x92\x08\x1d\x51\x80\x7c\xa8\x0f\x4d\x75\x77\xb7\x73\x44\x8e\xc6\xd8\x1e\x2a\x54\x9a\x71\x6c\x60\xf5\x9a\xa3\xa7\x9c\x3e\x71\xb9\x75\x2c\x1b\x0b\xdb\x82\xf8\x50\xf8\xee\xc4\x4e\x35\x1c\x0d\x31\x40\xc1\xfd\x3c\x75\x8e\x02\x04\x10\x3b\x7e\x6a\xf5\xee\xf6\xd2\xaf\x16\x4e\xae\x16\x47\xda\x7b\x8e\x26\x92\x3c\xe6\x04\xf7\x61\x72\x74\x32\xe8\x94\x70\x30\x14\x0e\x1b\x1a\x88\x8d\xef\x38\x88\x81\xf0\x7d\x1d\x92\xa1\x1d\xbc\x40\xfa\xd8\x49\x07\x63\x41\x08\x33\xda\x92\xe1\xfe\xa8\xc7\x93\xa3\x93\x3e\xf4\xe3\x98\x26\x40\x68\xff\x90\x8f\x13\x91\x35\x72\x9d\x20\x8d\xbe\x48\x84\xd2\xc3\xbd\xd3\xec\x15\xad\x3c\xd7\xd7\x4b\x99\x37\x21\x5e\xb9\x3f\x77\x38\x84\xbd\xa2\xe5\x51\xf3\x85\x1b\x8a\x74\x77\x93\xb6\xc9\x2c\x2a\xf8\x9f\xc3\x48\xf9\xbd\x7d\x3e\xbe\xa7\x1a\xdf\x2c\xb4\x27\x4c\x9f\x1f\x2a\x7e\xca\x41\x49\x1d\x3b\x4d\xa4\x57\x9f\x4e\xd3\xdf\x10\x3b\x95\xc9\x6a\x03\xcb\x5a\x24\x39\x6e\xbb\x65\xfc\xed\x4a\xbb\xcb\x5c\x5a\xa0\xbf\x83\x8d\x41\x6e\x8b\x97\xd9\x2b\x3a\xb7\x7c\x89\xcf\xea\xd0\x56\xb6\x2e\x16\x7e\x20\x18\x0d\x7b\xe4\xf0\x4b\xe4\xbb\x08\x21\xb6\xe0\xc6\x29\x48\x9d\x20\x07\x10\x82\xb6\xdf\x95\x6c\xb5\x48\x67\x51\x7b\xfd\x29\xaa\x88\x1a\xdd\xc2\x12\xb2\xc0\x76\x3c\xd4\x69\xe2\xc5\xc3\x66\x6b\x8d\x89\xeb\xab\xe2\x31\x59\x79\xbe\x2d\xb2\x33\xe6\xf0\x10\x1c\xc7\x2b\xb4\x7b\xad\x60\xaf\x5a\xba\x33\x92\x4b\xbc\x9e\x81\xf3\x7f\xdc\xe9\x68\x81\x5d\x97\x6b\x7a\xeb\x9b\x24\xdb\x8d\xcf\x48\x88\x2e\x3c\x9f\xa5\xdd\x86\xca\xce\x03\xf7\x62\xb6\xc2\x3b\x54\x4a\x06\x1f\xf7\x8e\x37\x19\x6e\x9c\x9f\xd5\xe3\x6f\x0e\x0b\xbf\x39\x2c\x2c\xef\xb0\x50\x05\xa3\xd7\xac\x15\x02\x59\x2d\xed\xdf\x37\xab\x8b\xb5\x61\x95\x24\x68\xd3\xc9\xbe\xa6\xf7\xbf\x83\xb9\x40\xd4\x29\xbb\xee\x09\x25\x3b\x8c\xbc\xb3\x19\x93\x61\x58\x82\xb0\x50\xad\x8c\xd1\x4f\xdd\x0d\xba\x1d\x81\x3b\x53\xfc\xd7\x70\x94\xe0\xa9\x7e\x8f\xc7\xc5\x1a\xbc\x88\x7f\xac\x73\x2c\x7e\x09\x76\x12\xa5\xb6\x17\x4a\x27\x9a\x17\xb0\xc9\x32\x7f\x60\xc0\x25\xbd\x4a\xa9\xed\xdd\x07\x56\x57\x88\x1e\x77\x09\x0a\xc0\x87\xe2\xa7\x12\x5a\x6d\x81\xe9\x6a\xb3\x4c\x36\x19\x7b\xda\x5c\x2a\x76\xd4\x3f\x92\xab\xc9\x2a\xde\xcc\x1e\xc3\xc5\x6c\x31\x28\xda\x2b\x49\xb5\xe5\x4e\x30\x65\xd6\xb4\x13\x4e\x59\x4c\xed\x84\xfb\x69\xe7\x33\xed\xdd\x83\x45\xfe\x77\xf7\x9b\xe5\xad\xaa\x0a\x25\xed\x87\x09\x46\xa7\x09\x4b\x0a\xb7\x6e\xec\xa5\x6d\x90\x82\xa8\x95\xab\x33\xf1\x82\x13\x85\xbb\xa8\x06\x73\xbb\xe6\x4e\x3b\x79\x5a\x4b\x33\xf0\x69\xad\x2d\xe3\x10\x00\x29\xc4\x72\x9c\x52\x84\x16\x48\x09\x93\x1a\x82\x76\x1d\x1f\x33\xef\xc4\x01\x78\xd7\x95\x33\xf3\xb7\x1c\x80\xff\x69\xed\x03\xff\xe4\x8e\x36\x88\x9d\x20\x66\x42\x64\xd0\x69\x85\x1e\x59\x5f\xef\x85\xb7\xdd\x0d\x5e\x81\x6d\x34\x65\xe3\xdc\x7d\x42\xa5\x83\x01\xba\xe0\x1f\x2a\x36\xdf\x90\x00\x5e\xbb\xc8\x46\x17\x57\x6c\xfe\xbc\xc0\x69\xc4\xe5\x88\x3b\x26\xf6\xfc\xf6\xa7\xe5\x79\xde\x53\x6b\x92\xed\x9b\xb4\xbd\xdb\xca\x7b\x3c\x71\xb2\x2e\x92\x78\xa3\x6f\xf5\x78\x5e\xa0\xcd\x43\x1c\x5c\x4e\x5d\xa5\x58\x99\xb7\x84\x39\x96\x6b\x85\x6e\xc6\x02\xeb\xd4\xba\x13\x0b\x64\xda\x92\xde\x64\x12\x67\x65\x6e\x16\x31\x23\xa0\xcb\xde\x96\x60\xc9\x04\x3a\xa7\x63\xab\x9c\x3e\x39\x4b\x9c\x16\x60\x19\xb4\x84\x59\xe2\x91\x1b\xc5\x02\x12\x3d\xc8\x9d\x01\x2f\xf6\x09\xa5\x41\x60\x7f\x5a\x7b\x80\x3f\xb1\x91\xed\x0e\xf6\xa1\xad\x4f\x03\x4e\xe1\x94\x43\x38\x0d\x55\x10\x48\x63\x4f\x77\x71\x01\x12\xc1\xa7\x18\x2e\x05\xe0\xeb\x31\x3a\xc9\xf2\x39\x99\x5b\xce\x99\x27\x12\x74\x03\x26\x23\x14\x83\x23\x27\x46\xc7\x4f\x6b\x3f\xb4\x87\x41\x44\x20\x4c\x87\xa6\x4d\xae\x08\xd7\xfe\xa5\x08\xed\x4a\x42\x61\x43\x69\x0a\x0e\x2e\xdd\x56\x2b\x8d\x4a\xed\x4d\xeb\xad\xb4\x6d\x90\xc7\x59\x85\x17\x7e\x26\x3d\x3e\xe5\x16\x6e\xab\xc2\x78\x08\x86\xde\x8b\xe6\xa9\x74\x6c\xd0\xb9\x74\x09\x7a\x91\x86\x17\x7b\x2e\xcf\xa5\xa2\xde\x5f\xf4\x5e\x4b\x6b\xc5\xe7\xd2\x66\xd0\x77\xa3\x76\x27\x3a\x41\x1b\x0f\xaa\x6b\x90\x6f\xdd\xbf\x2b\x06\x5b\xe0\xf3\xf2\xef\x0c\x0e\x82\x40\x1b\xa9\xd7\x08\x01\x05\x95\x12\x92\xdc\x85\xf0\x32\x7b\x25\xd0\x71\x5a\xda\x57\xa5\xf6\x1b\xc9\xeb\x78\xae\x89\x83\xd7\xa1\xc4\x7d\x55\x01\x60\xa8\x6e\xd7\x98\xeb\x7c\x52\x52\xbc\x65\xf5\x17\x62\x8b\xd7\x0a\x0f\x6f\x45\xd8\x07\x1b\x1e\xcb\xc2\xae\x49\x58\x5e\xe8\xdc\x27\xf6\x4c\x09\xb5\xd1\x91\x36\x90\x80\xce\xaa\x14\x82\x04\xf3\xad\x2b\x13\x90\xe4\x0a\x11\xef\x45\x72\xce\x66\x1a\x6f\x63\x37\x0c\xb9\x99\xfc\x5c\x6b\x4e\x84\x40\x2b\x0d\xd1\x8c\x6a\xcb\x70\x04\x72\x81\x31\x5e\x41\xce\x6e\x8d\x4d\x2f\x4a\x4e\xb8\x30\xef\x16\xe9\x91\x60\xf6\x74\x1b\xc5\x6f\x63\xa4\x0d\x97\xff\xe6\x2a\xcd\x65\x32\x48\x77\x8b\xb8\x11\xfa\x8a\xfe\x51\x36\x75\x1e\xd2\x2b\xd7\x58\xa2\xbc\xcd\xa3\x25\x1c\x46\x99\x94\xa1\x39\xa4\x04\x67\x9f\xd9\x4f\x4f\xff\xe5\x51\x78\x30\x40\xbe\xbe\x8d\x94\xaa\x29\xb5\xf2\xae\xeb\xf5\x93\x31\xd6\xe4\x47\xdd\x85\x50\xcc\x34\xfd\xe5\xc1\x28\x06\x9a\xfe\xf2\x60\x80\x69\x36\x5f\x69\xae\xc5\xae\xfd\x9e\x83\x29\xb2\x9f\x30\x3f\xd1\x92\x52\x75\x4a\xe1\xd3\xad\x90\x86\xc4\xb6\xc6\x37\x3e\x62\xff\xe7\x39\x2f\xb8\xae\x4f\x44\xf7\x42\x56\x32\x96\x76\x23\xf0\xf8\xc7\x0e\x67\x20\x1d\x4b\x21\xa8\xdc\xf1\x90\x93\xe7\xf4\x2f\xdf\x18\x1c\x2c\x2d\xd1\x6c\x3a\x5a\x49\xa3\x64\x7c\x9a\x3f\x91\x9b\xe7\x25\x98\xed\x1b\xf3\x5c\x6e\x0d\x81\xfb\x94\xd7\x75\xf9\xc7\xdb\x83\xe5\x68\xe4\x25\xb0\xfa\x1e\xd8\x73\xde\xde\x26\x75\xf8\x86\xb1\x16\xb6\xe6\x5a\x7a\x73\xa2\x68\xca\xc7\x42\x54\xbc\xb4\x80\x9f\xcd\x96\x68\x0d\x04\xe5\xf4\xac\xf8\xe4\xe2\x66\x5d\xb4\xc9\xf8\x1e\xf5\x4a\xcc\x0b\xdb\x34\xdc\x7d\xaf\x58\xc0\x2a\xca\xcd\x1d\x54\x60\xe3\xf2\xbd\x04\x32\x01\x3e\xa9\xcb\x08\x71\x1e\x35\x76\x73\xa8\x31\x57\x3e\xb1\x48\x08\x9a\xf9\x2a\x3a\x31\x34\x24\xaa\x0f\x9d\x8d\xe4\x0d\xa7\xec\x86\x11\xf0\x40\x53\xcc\x2d\x3a\xfd\x26\x4c\x21\x6f\xb1\x11\x92\xa8\x6b\x20\x75\x27\xe0\x09\xe7\xe4\x20\x0d\x19\x36\x87\x04\x21\x8b\xc7\xdb\xee\x64\xf0\x93\x27\xe0\xb4\x91\xe5\x87\x84\x51\x20\x9b\xe2\x0b\x0b\xad\xbc\xb4\xf7\x14\x46\x1f\x7a\x74\x32\x68\xd7\xaf\x6b\x1e\x41\xb5\xb6\x60\xda\x40\x53\xad\x7e\x16\x8c\x1b\x3a\xea\xba\x43\xa9\xad\x8f\x4e\x3a\x9d\xee\xe7\xb7\xf5\x41\xeb\xdb\xad\xc7\xb7\x5b\x8f\x83\x6f\x3d\x5e\x5e\x6c\x92\x57\xa8\x76\x79\x0e\x74\xea\x5e\x78\x38\xd9\xd7\xbc\xb7\xc0\x8b\xe5\x9c\xb0\x4a\x78\x9d\x6d\x23\x2a\x9d\x25\xd3\x0f\x4f\xa5\x77\x1b\x06\xfc\xf1\x3d\x3a\xeb\xce\x8e\x97\xf1\xc7\x54\xda\xf1\x1d\x4f\x01\xd8\x86\x42\xca\xb6\xca\xca\x85\x16\x5c\x88\xe4\x0c\xff\xb5\xe1\x8c\x9c\x00\x4b\x65\x1d\xa5\x06\x6c\x61\x1c\x34\xfd\x01\xa1\x87\x70\xcc\xc5\x41\x7d\x94\x51\x45\x21\x48\x89\xd8\x40\xe9\x72\x99\x6c\x1e\xa6\x1f\x4b\x28\xe5\x05\x32\xa8\x5b\xaa\xfc\x3a\x91\xed\x50\xaa\x58\xaf\xc2\x65\x22\x16\xce\x1b\x75\xcd\x1f\x55\xe6\xf2\x64\x56\x3e\x31\xf0\xcc\x69\xe8\xb4\xb7\x8a\xe7\x07\x59\xfc\x29\x3e\xc0\xcf\xb9\xa3\x91\x60\x28\x8d\x97\x80\xcb\x12\x01\x33\x8b\x37\x57\xaf\x83\x46\x45\x4b\xc1\x45\xd5\xd5\x99\xbe\xb8\x28\x65\x1d\x74\xbd\x8b\x07\x8a\x2e\x89\x17\xad\x34\xb8\x89\x00\x41\xf8\x9e\xf4\xb1\x69\xe2\xe6\xa2\xfd\x14\x54\x5c\x4a\xf5\x5b\xa8\xe3\x95\xf4\x4f\xf4\xba\x32\x81\x42\x14\x87\xe7\x45\xf7\x58\x72\x89\x58\x10\x95\x40\x20\xac\x53\x2f\x0d\x62\x1c\x75\x69\x18\x3b\x3d\x16\xca\xa6\x11\xed\x32\x5d\x49\x44\xb3\x4c\x93\x29\x34\x59\x4c\x14\x9a\x24\x5b\x68\xbd\x02\x2c\xa0\x4e\xb1\x30\x86\xfc\x2d\x90\x49\x22\x7a\x54\x4a\xfc\x44\x9f\x4a\x93\x77\x69\x5d\x75\x2e\xae\x0f\x9b\x8b\x3f\x0f\xd4\xc9\xca\xe9\x75\x23\x14\xab\xf9\xc2\xaf\x6a\x5e\xcc\x9e\x81\xd8\x97\x3e\x74\x08\x82\x65\x02\xc1\x21\x06\x3a\x56\xb8\x82\xef\x06\x25\xa8\x51\xa5\xa3\xb6\x2a\x56\xf1\x05\xc7\xc2\x75\xad\x2c\x66\x8e\xa6\xdb\x72\x11\x76\x2c\xca\x8c\xfd\xd6\xce\x0a\x0c\xa4\x43\x05\x62\x21\xe1\xc5\x85\x26\xee\xbb\xd1\xa0\x17\x9d\x44\xc3\x0e\x99\xb5\x74\x96\xbc\x34\xaf\xf2\x2d\x60\x07\x00\xdb\x83\x7d\xd4\xb4\xca\x0c\xcd\xac\x93\xbb\x0e\x1a\x4e\xa2\x80\x45\x1a\xb5\x73\xb3\xad\x57\xba\x9d\xf5\xa7\x8a\x28\x51\xe9\x8d\xd6\x61\xe3\x3d\x0b\xdc\xee\x63\x57\x2d\xd0\xe5\x99\x38\xd8\xc1\x8c\x4f\x6e\x92\x97\x9b\x78\xed\xab\x83\x9d\xc3\xcc\x0e\x83\xf9\x0c\x35\x8b\x49\xb0\xc2\x7c\x19\x8a\x04\xbd\xf3\xdc\xa5\xd8\x3e\xa1\x28\xf5\x6c\xd3\x94\xf7\xd0\x22\x10\xed\x60\xb5\x95\x63\xd8\xe6\x8d\xc4\x39\xa3\xec\x48\x78\xc0\x2b\xaf\x9c\x1e\xdb\x43\xcd\x1d\x78\x38\x60\x9d\x90\x5a\xee\x4e\xcf\xa6\x60\xa1\x9e\x57\xaf\x59\x36\x25\x2b\x56\x9a\x71\xbf\x66\x32\xed\xe9\x62\x71\xa2\x98\xc6\xe6\xfb\x4d\x72\x35\x68\x85\x4d\xf9\x76\x6a\xcd\xb9\xc6\xbb\x48\x65\xfe\x94\x12\x48\x51\x25\x8c\x92\xea\x9c\xb0\xac\x2f\x0a\x54\xfa\x03\x56\xbc\x8d\xda\x5e\x30\x1a\x6a\xbb\x6b\xbf\x9e\x10\x32\x0b\xe9\xe4\x0c\x7f\x5c\x47\xbd\x9b\xd5\x6c\x22\x91\x0b\x09\xc3\x6d\xe6\x2f\x7f\xd1\x6b\x87\x47\xec\x97\xa3\x7e\xa6\xa0\x77\x8e\xda\xa1\x9e\xba\x3b\x1c\x27\x8c\x15\x27\x39\x2f\x5c\x3c\xbd\x4b\x70\x80\x20\x44\x3c\xd3\x5f\x3a\x5d\xfc\xcc\xd5\x07\xc7\xc7\x32\x2a\x16\x43\xb5\x21\x49\xdb\x30\xf1\x5c\xaa\x31\x65\xa0\x42\x88\x79\xa5\x33\x0d\x66\xec\x0e\x94\x4b\x5e\xce\x4a\xa8\xdb\x8e\x70\x3b\xca\x13\xf6\xb8\x38\xd0\xdb\x00\x9a\x0c\x94\x87\x20\xb7\xab\x1e\x86\x4e\xf5\x8e\x11\xbd\xd6\xc6\x9a\xde\x79\x5f\x88\x29\x06\xc9\xb1\xc5\xb2\x9e\x66\xf7\xbc\x41\xa4\xd9\xcf\xf1\x22\x9d\xe9\x61\xf0\xaa\x6e\x7b\x78\x3f\xa5\xf9\x06\xf7\xb9\xad\xe4\x4f\x06\x2b\x52\xe7\x35\x84\x67\x23\xb4\xbf\xda\xd1\x14\x74\x21\x30\x5b\x4e\xeb\xce\x8c\x85\x06\xf9\x19\x3a\x52\xa8\x85\x67\x97\x12\x91\xad\x33\x34\x60\x1a\x8d\x8a\x65\xa8\xd4\xa0\x4b\xa9\x82\xd6\xb5\x70\x5d\xee\x5a\xca\x4a\x97\x7e\x10\x2f\xe7\x20\x0e\x6d\xbe\x14\x98\xc9\x95\xec\x27\x3f\xaa\xa4\x70\xe7\xee\x25\xf6\xd0\x41\x0f\xd2\x0b\x35\x8a\x8a\x73\x1a\xc9\xc2\xee\x3a\x2c\x71\x9f\x62\x6e\x9e\xa6\x4e\xa7\x42\x44\x74\xcb\x20\x5e\x3f\xdc\xe3\x62\x12\x7b\xb7\xe7\x4a\x50\x54\xbe\x42\xdf\x16\x7a\x2c\x4d\x17\x94\x1a\x7d\x9b\x54\xa5\xeb\x2c\x19\x4b\xde\xd1\x99\x1c\x9d\xf4\xcb\x68\x34\x99\x3e\xe7\xe8\x64\x24\xcb\xe4\x2b\x6e\x8e\x4e\xc6\xe3\x1c\xd5\x66\xfb\x9b\x6a\xf3\x9b\x6a\xf3\x60\xd5\xe6\x85\x74\x69\xe7\x68\x34\x65\xaa\xd6\x47\x2e\xb7\x1b\xf0\x45\x93\x6f\xb8\x4d\x20\xae\x6d\xb6\x7d\xef\x62\xbb\x92\xc6\x1b\x61\x15\x28\x78\x07\x12\x85\x00\xe0\x3a\xd1\xe8\xf7\x09\x93\xbf\xaf\x81\x38\x1c\x00\xb9\x9a\xd5\x52\x51\xed\x6f\x3a\x34\x55\x9d\xcd\xe2\x17\x09\x54\x65\xac\x2b\xf2\x15\x9a\xa5\x82\x59\x95\x50\xc8\xe6\x5b\x6c\xe4\x97\x01\xd4\x97\x50\xce\x9e\xc7\x9f\xb4\xc8\x5d\x18\x37\xea\x62\xb1\x4d\xd7\xc5\xf1\xa7\xb8\x31\x48\x91\xc5\xf7\x5e\x26\xee\x3b\xab\x2b\x65\x57\xaf\xbd\xc1\x3e\x2f\x1f\x00\x4b\xc5\x82\x76\x15\xb8\x2f\x36\x3f\x12\xc4\x68\x5f\xbf\x16\x4a\xa6\xdc\x9c\x9a\xd7\x12\x1a\x8f\x1f\x15\x0e\xf0\x44\xe6\x93\x9a\x5e\xf0\xb9\x21\xf6\xd3\xfc\x26\xf4\xf3\xb5\xed\xd1\xbd\x06\x82\xb5\x97\xb0\x88\x37\xd1\xa7\x5c\xa5\xf6\xfe\x56\xdb\x52\x14\x61\xde\x80\xad\xf7\xc8\x53\x9a\x41\xf8\xa3\x1a\xb7\x07\x62\x4a\x77\xe5\x9d\x80\xd7\x09\xc7\x9e\xe0\xf7\x79\x22\x51\x6e\xd8\xcb\x71\x6e\x6f\xa5\x15\xb8\xc5\xb6\x56\x1f\x8c\xd7\x56\x52\xc8\xd1\xe5\xf5\x07\x2e\xae\xa8\x32\xde\xb5\xc9\xf7\xf2\x5c\x3d\xbd\xa4\x3b\x69\x83\x73\xdd\x3b\x85\x7c\x8f\xb0\xb2\x31\xed\xc4\x55\xdf\xff\xbb\x71\x14\xf5\x22\xa8\xe5\x75\x8e\x44\x8f\x3a\x05\x47\x72\x2f\x95\x19\xe8\x4d\xdc\x5b\xec\xd7\xf9\x80\x1d\xbe\xfb\x7c\xc2\xcf\xac\x02\xff\x03\xde\xf8\x4a\x58\xb9\x6f\xb4\x8c\x11\xe5\x7a\xc3\x63\x76\xce\x96\xc1\x00\x4b\x99\xaa\x29\x0e\xf1\x2e\x0c\x9f\x50\xa9\x07\xfd\xcc\x55\x3a\xfd\xd6\x39\x18\x27\xbf\xa9\x28\x3f\x6d\x15\x5d\x4c\xf0\x83\xe7\x95\xb7\xda\xb8\x72\x57\x23\x08\xad\x7f\x2c\x04\x76\xbb\xb3\x6a\xab\xde\x18\xad\x3f\xd5\x5b\xb5\x8a\x8e\x01\xa4\x4b\x71\xa7\x70\x6a\x03\x37\xb6\x28\x41\x63\x14\xeb\x0b\x33\xcd\x90\xf6\x92\x19\xb8\x30\xd2\x78\x35\x86\x25\xcc\x56\x33\x12\xc3\xcb\x9b\xb4\xbd\xe3\x9b\x81\x13\x36\xfc\x76\xc0\xbe\x63\xcb\xd2\xc0\x38\x9e\x61\xd3\xe1\xbb\x8f\xdd\x3f\x4c\x53\x79\xdb\xc7\x21\x6f\x31\x3a\x7b\x3e\xc6\xd0\xeb\xd9\xde\x02\xe9\x14\x02\xa3\xd7\x19\x01\xd2\x49\x37\x7d\xa1\x97\xb7\xfd\xd2\x1b\xb6\x30\x04\xb9\x66\xd1\x1c\x17\xb9\x6d\xd3\x49\x44\xa1\xac\x0f\x68\xf2\x6c\x41\x27\x11\x28\xc5\x6f\x11\x20\x95\xe2\x18\xe9\x97\x7e\x60\x12\x64\x80\xe8\x45\x5e\x20\xfb\x7a\x17\x7a\x2c\x17\x82\xb7\x38\x10\x90\x64\xa1\x2e\xf9\x4c\x5f\xf2\x59\x76\x22\x6a\x28\x26\xeb\xb0\x4b\x43\x4d\x69\x18\x07\x48\x13\x54\xc1\x15\x62\xde\xcc\xe3\x15\xa1\x9e\x60\x7c\x75\xa1\xe7\x11\x7f\xa8\xf9\x0a\x3e\x07\x09\x62\x3b\x70\x91\xa8\xbf\x00\xaa\xe0\xc7\xa5\xee\xaa\x1b\xf7\xe3\xcf\xfd\x68\xe3\xf8\x58\x7a\x18\x12\x42\xdc\x47\xf0\x39\x8b\x8e\x7b\xc1\xf2\x15\x05\xc7\x4c\xec\xd1\xa2\xf8\x27\x74\x71\x8c\x2e\x9c\xe3\x25\x29\x9a\x1a\x88\x2b\x93\x4a\x63\x08\x9a\xad\xe4\x6e\xf1\x09\x46\xce\xa1\x9a\xf7\x22\xa3\x38\x9a\x9e\x89\x9e\xd7\x72\xae\xa5\xc8\x5b\x90\x56\xa9\x17\x23\x3e\x94\xff\x60\xc4\x87\xf1\xdf\x8b\xf8\x30\x66\x74\xe0\xce\x03\xf0\xf5\xcf\xaa\x38\x58\x03\xf9\x2f\xd0\x41\x29\xab\x4d\xdd\x0a\xc2\x1d\x2b\xce\xad\x2a\x44\xae\x07\xc5\x3c\x85\x5f\xe1\x6c\x41\xbe\x6e\x4c\x93\xc5\xc2\x77\xbe\xa1\x6f\x2f\xc9\xf5\xec\x40\xb4\x31\x0a\x5f\x66\xe6\x43\x09\x6a\x51\x2e\xbd\x7c\x3f\x1f\x4a\x48\xb3\x81\x09\xdc\x67\x3e\x18\x21\x43\xbb\xab\x65\x6f\x7e\xca\xd3\x90\x0a\x49\xa9\x39\x20\x9f\x7c\x54\x4e\xe8\x46\x16\x55\x1c\x07\xb6\x5b\xe9\xb7\x34\xf7\xc5\x98\x28\xdd\x91\xb7\x7e\x4f\x3c\x32\xf8\xb5\x04\x19\x28\xe2\xac\xc0\x86\x17\x19\x79\xac\x12\x1a\x1f\x75\xa5\x62\x24\x4d\xf3\x95\x94\x50\x1e\x81\x7f\x25\xb9\xd0\x44\x36\x05\xa5\x4c\xc5\x79\xed\x44\xee\xaf\xf9\xc6\x18\xb0\x29\x28\x36\x7f\x88\xa7\x53\xc1\x9b\xb5\xf1\x7a\x58\xd7\xae\xa5\x22\x7b\xba\xde\xd8\x5b\xaa\x67\x7a\xff\x2f\xbc\x1e\x15\x40\x75\xcb\x1e\xd8\x7b\xe0\x07\xb1\x98\xa2\x59\x62\x79\x18\x85\x67\xcb\xdc\x5c\x88\x63\x04\xdf\xb0\xa1\xa1\xb4\xde\x9c\xd5\xeb\xb3\x21\x18\x3b\x74\x3b\x7d\xc2\x0c\xc9\x0a\xf5\x2d\xc8\x03\xe0\x83\x29\xd3\xf9\x20\x90\x5f\xa5\xbe\xb3\x79\x7b\x26\xde\x46\xa4\x9c\xfb\x09\x6e\x77\x51\x6d\xf7\x5b\xd1\x71\xb0\x29\xf7\x41\x13\xcc\xa0\x66\x7c\x5b\xb6\x95\x65\x72\x49\x2c\x98\xa4\x08\x63\x82\x0d\x9d\xc7\xeb\xaa\xb9\x30\xa1\xa6\xed\xc6\x6c\x5e\x4d\xab\x61\xfe\x9e\x66\xf7\x1e\xa6\x1f\xd3\x19\x9e\xff\x98\x82\x61\xf9\x9a\x44\x63\x28\xcf\x2d\x20\x2a\x05\x59\xb9\xed\xd7\x42\x22\x35\xca\x5a\x42\x96\x5d\x9c\xe9\x34\x1b\x8b\xa1\x81\xdf\xb9\x37\x68\x2b\xb7\x72\xbb\x7c\xcb\xc8\xdb\xf7\x1b\xf2\x7d\x83\xcd\xb9\xcd\x4a\xd8\x6d\x43\x93\x42\x8b\xd8\xee\x1f\x1f\xbf\x58\x2e\xae\xf4\xa4\xe0\xd9\xaa\xe3\x22\xc8\x10\x04\xe0\xcf\xd7\x40\x43\xcf\xf8\xfc\x08\xf1\x81\x74\xa9\x11\xb5\xc1\x34\x80\x83\xfc\x95\x81\xfc\x10\xa6\x35\xf0\xeb\xc8\xde\x07\x14\x52\xb0\x9b\xf9\x43\x3e\x01\x9e\x78\xc0\x8d\x5c\x60\xfa\x6e\xc5\x47\x9b\x53\x8a\xbe\x5d\xb1\x5b\x4d\xee\xfc\xaa\xb9\x0a\xef\x14\xde\x79\xc3\x43\x55\x39\x7d\x39\xf1\x3a\xf7\x83\x60\x1b\xb3\x8a\xed\x10\x89\x06\x44\x89\x0f\xee\x92\x65\x74\x2e\x4d\xaa\x64\x09\xdc\x95\x29\x68\x2b\xc2\xc9\x3a\x78\x17\x3d\x95\xee\x9c\x7e\xb7\x6a\x68\x7d\x0e\xe3\x9d\xb3\x1a\xee\x3b\x2c\xa3\x37\x65\x5d\x88\xd1\x87\xda\x21\xb3\x1a\xa3\xff\xef\xdc\xee\x09\xb2\xfa\xce\xe9\x58\x8d\x57\xf4\xc3\x0f\xa6\x06\xa5\x7b\x23\xa7\xe4\x41\x77\xe0\x79\xb3\xf9\x99\xfa\xd9\x32\x38\x55\x69\x30\x7a\x92\x1a\xd0\x1e\xd4\xae\xff\x62\x30\xf8\x74\xd2\x7b\x33\xb9\xf3\xc5\x5e\x21\x56\x58\xd8\xe4\x88\x11\xa4\xbc\xf8\x96\x47\x72\x28\x76\x72\xe4\x58\x11\xac\x79\x55\x56\x49\xab\xc4\x33\x82\xd0\x1d\xd1\xde\xe0\xdc\xa4\x15\x95\x8c\x3e\x88\xf2\x16\xeb\xa0\x83\x1d\x72\x1e\xf3\x90\x5b\xe4\xcc\x31\xa9\xb5\x5b\xf4\x93\xa8\x3d\xdc\x17\x6e\xcc\x33\xab\x9f\x59\xfd\x10\x7e\xba\x16\xd6\xe1\x04\xf4\xc0\x1f\x02\xcf\xcd\xb8\x17\x5f\xab\xee\x64\x86\x00\x54\x0b\x4a\x54\x32\x7b\x68\x08\x75\x11\x87\x08\x8a\x4b\x4b\x23\x03\xa7\x88\x57\x25\xac\x6a\x93\x9b\xed\xa8\x0c\x26\xb6\x26\x55\x37\x90\x93\x95\xd4\x5d\x6a\x8e\x58\x49\x3c\x6d\xa3\x4a\x74\x0a\x86\x86\x17\xac\xe3\x57\x52\x47\xa8\x50\x20\x30\x51\x28\x96\x34\x1f\xbb\x31\x16\xf8\xe1\x87\x94\x47\x91\xb6\x30\x6f\xd2\xb7\xa1\xd0\x47\x48\x0a\xb7\xa8\xd7\x61\xbb\x0f\x3b\xde\x87\xfd\x0d\x5a\x6e\xb4\x6c\x77\xde\xf1\xec\xd0\x2a\xee\x3a\x39\x9a\x3b\x57\x97\xd6\xf1\x95\x69\xc5\xaa\xa6\x4e\x9e\xae\xc9\x2b\x6f\x38\xd7\x34\xc3\xb5\xab\x55\xa6\x7a\x78\xec\xb2\xc6\x2d\xac\x57\xbb\xcf\x99\x49\xa3\x35\x09\x65\x67\x23\xb7\x5c\xbe\x0d\x19\x1f\x45\x3d\x3c\x6e\x6e\x4c\x65\x25\x87\xdd\xed\x50\x26\x54\xea\xdf\xfe\xfd\x6f\xb8\x44\xcb\xe9\x2a\x73\xd1\x90\x59\xfd\xa5\x25\x02\xe4\x82\xc9\x53\x5a\x97\xd5\xf4\x5e\x2d\x48\x61\xdb\xde\xc8\x98\x6a\x6b\x81\x47\x28\x11\xab\xdb\xdb\xe5\x40\xf8\xf3\x5e\xea\x80\xb0\xa9\xbf\x17\x18\x9d\x85\x18\x16\xd5\xbe\xcb\xb6\xd4\xbd\x7e\x9d\x90\xef\x65\x9d\x49\xf9\xde\x25\xba\xd4\xb1\x41\xfe\x4b\x54\xb5\xc5\xcf\x23\x36\x7b\xd4\xb3\x44\x38\x9d\x7a\x93\x60\x1e\x24\xec\x4c\xde\x35\xa8\x32\xcf\xcd\x1c\xe9\x9f\x9d\x84\x9c\x38\xfc\x23\x65\x96\x28\x6e\x99\xcd\x93\x52\x74\xd9\x7d\xa5\x00\xac\xba\xc3\xb7\x3a\x25\x2f\x49\x42\xf0\xbd\xd1\x20\xf4\x24\x05\x0b\x30\x17\x4a\xad\x98\x68\xcf\x4e\xb8\x59\x23\xed\xe9\x50\x25\xe6\x79\xae\x89\x39\x16\x92\x6b\x9d\xb8\x63\x61\xd1\xd7\x7b\x58\xd4\xcd\x7d\x59\xe4\x5c\x33\x74\x4b\xdc\x33\x74\xfd\xbd\xd1\x57\xff\x77\xa9\xfe\xdf\xb6\xa7\x44\xf7\x36\x15\xce\x37\xa2\xb5\xad\x29\xee\x2a\xcc\x6e\x7b\xb2\x77\x00\xb4\x0b\x8e\x66\x7a\x23\xa3\x82\x78\x6e\xfa\x93\x66\xcb\x8a\x8c\x0a\xd6\x30\x72\x64\xbc\x58\xe8\xd0\x63\xcc\x67\x06\xb2\xf6\xa6\xdb\x35\xbe\x5c\x8d\x28\x8f\x63\x30\xc2\x3c\x51\x7b\xe0\xd8\xa0\x6e\x5a\xb1\x0c\x3c\x75\x99\x8a\xe4\x39\x04\x75\x5b\x66\x2a\x7c\x99\x2a\x25\x9a\x93\xb2\xac\x74\x0b\x8c\xa9\x4e\x83\xe2\x24\x7e\x14\x4f\xcf\x88\xfe\x20\xa0\x3e\x20\x4b\x94\x21\xf4\xaf\x11\x19\x10\x97\xd6\xaf\xa3\x66\xb0\x22\x06\x6b\xed\x87\x90\xe4\x86\xf3\xc8\x27\xef\x36\x51\x7f\x09\xac\x81\x70\xa4\xb6\x09\xb3\xa4\xe9\x86\x89\x40\x7c\x6d\x3c\x37\x42\xa9\xbf\x28\x58\x1e\x5b\x0d\xe7\x34\xc7\xaa\x6f\x72\x10\x1e\xf0\xad\x52\x80\xfb\xff\x94\xe6\x66\x7f\x81\xf4\x01\xc5\xb9\x16\xc7\x15\xaa\x19\x0c\x47\x39\xbb\xdb\x75\x50\xce\xef\x7d\xd7\xee\x7d\x31\x1e\x36\x3d\x9f\x29\x23\xfb\x8f\x7b\xcb\xe9\xb1\x3e\x5a\xaf\xd4\x68\xfb\x5b\xc2\x53\x67\x9f\xdd\xb9\x82\x42\x1a\xb8\x1b\x5d\x19\xe6\xe2\xbe\x97\xcb\xe8\x49\x2c\xd5\xbc\x01\xb2\x41\x15\xcd\x72\x40\xc5\x20\x67\x34\x5f\x9c\x67\x6d\x91\xe9\x65\x32\xba\xef\x5d\xc2\x0b\x04\x65\xc3\x26\x7d\x90\x16\x98\x39\x81\x93\x78\xb0\xa3\xbc\x70\x35\xf6\x68\x4c\x97\x05\x07\xb3\x05\xde\x27\xe8\x90\x66\x4a\x88\x4d\x58\x6e\xf8\x9d\xfc\x08\x44\x45\x5d\x87\xb9\x49\x9a\xd9\x59\x3a\x87\x6e\x73\x4d\xa1\x1c\x56\x21\xbf\x41\x74\x75\x11\x46\xd2\xf3\xcb\x97\x44\xcb\xe7\x12\xa3\xa2\xa1\xac\x76\xcf\x47\xc9\x8e\x93\xe6\x3e\xdf\xf2\x30\xcf\xd1\xee\xb9\x35\x29\xf6\x33\x13\xe2\x4c\x53\x12\x3b\xcf\xb1\x2b\x20\x0d\xfb\xb6\x05\xf4\xce\x5e\xfb\x83\xff\x59\xa7\x55\x83\x82\x17\xac\xb0\x9f\x95\x21\x80\x29\xee\xda\x02\x40\x7f\x34\x10\x06\xa0\xf1\x9f\x00\xa3\x72\x5a\x75\x88\x6f\x36\x29\x59\xf6\x58\x89\xb5\x3a\xd7\xd5\xb2\x47\x43\xcb\xe4\xf2\x39\xe9\x54\x6a\x64\xa0\x46\x5b\x1c\xb6\xd2\xe4\xbb\x6a\x2a\x03\x25\xe8\xff\x82\xf8\xea\x27\xd1\x1b\x53\xdf\x5b\xa9\x06\x0d\xc2\xc2\xcd\x38\x3c\x2b\x7d\xf3\x46\x31\xa6\xed\xb7\x6f\xed\x81\x1c\x11\x24\xa8\x38\x8a\x0f\xc4\x3c\xbd\xc7\xa0\x7b\xb4\x67\x5a\x40\x94\x14\x2d\x39\x2b\x3d\x4b\x2a\x7a\x8f\x1c\x01\x44\x0b\x35\x3d\xa0\x98\xc9\x6d\xc6\x45\x4b\x19\xaf\x3a\xa9\x13\x24\xb1\x60\x41\x51\x12\x2c\x5c\x77\xe5\xe5\x04\x43\x4c\xf1\x27\xcf\x62\xca\x65\x56\x1a\x46\x03\x93\xd2\x4d\xdd\x0a\x16\x7f\x33\xd5\x58\xf9\x42\xa7\xec\x2f\x66\x38\x67\x13\x1b\x7c\xd1\xb1\x15\x5e\x7d\x79\x0b\x8f\xae\x22\x7f\xe1\xc9\x1a\xdd\x45\x85\xcd\xe9\x42\x94\x01\xa2\xcb\x4a\x73\x2d\x84\xb4\xec\x3a\x52\x51\xb9\x58\x9a\x5e\x5b\xb6\xf6\x1a\x92\xa0\x58\x3c\xff\xfe\x77\xf4\x5d\xb0\x22\xfe\x03\x96\x9a\x2d\x4d\x50\xc9\xf0\x4d\x11\xc9\x27\x42\xac\x12\xa5\xbc\xf2\xb4\x09\xc5\x2a\x56\x6a\x26\x67\x2a\xd1\xec\x81\xaf\x7e\xf5\x92\x7c\x69\xd9\x35\x2b\x75\x3a\xed\x98\x9c\x92\x29\xb7\x22\xa1\x6f\xb7\xeb\x68\x5d\xac\x60\x1f\x91\xb0\x5e\x4d\x27\xef\x00\x29\x0f\x56\x84\x53\x8b\xfb\x4e\x53\x12\xee\x8b\xf9\xfc\x34\xd9\x06\x35\xb5\x6e\x79\x15\x73\xfa\x35\x8c\x42\xd5\xa4\x62\x9f\x83\x4c\xa7\xa0\x65\x8c\xb2\x89\x4c\xeb\x2c\xd5\x6f\x15\x9f\x1b\x34\xbe\x46\xbc\x83\xd2\x60\xe6\x21\xba\x92\x64\xb4\x67\xa8\x82\x95\x01\x7e\x9d\x5e\x36\x72\x24\x25\x54\xef\x99\x62\x7f\x75\xa0\x6a\xac\x4a\x7b\x85\xba\x9f\xa2\x9b\xf6\x4a\x7f\xf7\x74\xb5\xda\x2c\xd8\xa1\x15\x65\x2a\xbc\x77\x5c\x6b\xc0\xd7\xa3\x7c\x48\xa2\x46\xbf\x4d\x6a\xd6\x06\x94\x26\x4a\xb8\x63\x3e\xa9\xed\x42\xf9\x96\xac\x53\x09\xb1\xa5\x4b\x0d\x67\x8a\x7c\x1f\xb5\x9b\x7d\x56\x95\xb9\x82\xcd\xb0\x49\x09\x76\x1c\xf9\xd5\x89\x55\xa9\xab\x23\x4f\x8a\x31\xdb\xad\x86\xff\xfe\xeb\x1d\x68\x14\x64\xe5\x26\x58\x3f\x58\xab\x04\x06\xa6\x50\x40\x5a\xe1\xb5\x7c\x4f\xba\x64\x96\x88\x81\xfe\xab\x19\x6d\x8d\x56\xa1\x13\x55\x11\x13\x18\x5a\x5b\x2e\x1a\x50\x19\x93\x49\x76\x41\xce\xda\x6e\xc8\x72\x21\xf7\xec\xab\xaa\xa3\x93\x7e\x97\xb9\x99\x23\xcf\x9d\x8e\x4e\x06\xdd\x43\x63\xf0\x91\xd7\x66\x47\x27\xa3\x76\xb9\xf0\x7c\x79\x51\xf8\xec\x4b\xb1\x22\x57\x75\x9d\x2f\x12\x4c\xaf\x74\x34\x94\x87\x2b\xd7\x2b\x98\x84\x9a\xad\xa4\x3f\x30\x6f\x46\xd0\x02\xe5\xf8\xf8\x17\xed\xbe\xd3\x58\x84\x47\xe8\x4e\x3f\x93\xa6\x3e\x90\xb9\x8a\xd0\xfb\x5f\x24\x1b\x8c\x04\x97\x2e\x1d\x38\x00\xb9\x5d\x26\x18\x18\x55\x00\xdd\x92\xa6\x40\x5a\x1d\xe6\xf9\xcb\x37\xdb\x07\x44\xe8\x3f\xfc\xf9\x85\x7c\x4e\x71\x1e\x2f\x2f\xc0\x96\xf5\xbe\xd8\x3e\x4c\x0b\xfa\x21\xc3\x84\x26\xe6\xbe\x66\xd8\x33\xaa\x80\xac\xfa\x62\x99\x5b\xf9\x3b\xc4\x49\x28\x76\x80\x93\x53\x45\x3c\x96\xdf\x39\x95\xe2\x50\xba\x8d\x03\x1c\xc8\xb8\xb7\xf8\xa6\x35\xcd\x88\x86\x51\xeb\xe6\xec\x40\x0c\xd6\xb0\xc9\xa6\x2a\x04\xec\x8f\x68\x12\x54\x46\x82\x6a\x9a\x69\xf6\x30\xc9\xa6\xc9\x72\x16\x8b\xe1\x62\xec\x76\x02\x5c\x43\xe7\x1a\xe2\x1c\x44\x07\x18\xfa\x8b\x76\x88\xa1\x02\xe8\x67\xac\xfe\x1a\x57\x4f\x2a\x43\x37\x97\x1c\x6a\x51\x4e\x46\xd5\x77\x4f\xca\x70\x4e\x11\xeb\x4c\x86\x6a\x57\xe0\xea\xc5\x52\x46\xcf\x68\x24\x4b\xa9\x52\x9b\x25\x1f\x85\x94\x23\x88\x7a\xb2\x12\x1b\x96\xa2\xe4\x39\xac\x51\xa4\x67\xc0\x9e\x14\x3f\xe1\xd6\x49\x47\xf9\xdd\x5e\x8a\x32\x75\x5d\xe7\xe4\x42\xe0\x7b\x5b\x81\x62\x4b\xb1\x88\x85\xa8\xa0\x34\xcb\x62\xff\x89\xe5\x2b\x56\xb8\x43\xc5\xb0\xd2\xd2\x21\x2e\x3a\x1d\x14\xd5\x19\x66\x4c\xd4\x12\x6f\x84\x74\x34\x4b\xc4\xa8\xb7\x80\x32\x4c\x56\x1e\x4d\xc5\xc6\xa1\x11\x0c\x96\xd7\xe0\x11\xf9\x02\x4c\xb7\x25\xe9\x71\x22\x52\x48\x0a\x96\xc4\x91\x8b\xf9\x2c\x2a\xaa\x30\xeb\xd0\x33\xc5\xad\x47\xea\x0a\xbb\xba\xc9\xf9\xfc\xe0\xde\xf2\xa2\xa5\xba\x2b\xce\x15\x73\x7c\x98\x8d\x0d\x36\xea\x5e\x9e\xa7\x51\x16\x3e\x6d\xd0\xbd\xd1\xdd\x99\x3c\xc6\xce\xd9\x58\xbd\x87\xb6\xab\xa5\x14\x68\x8b\xde\x80\xe6\x78\xdc\x43\xa7\x81\xf0\xb5\xfa\x26\xec\x8c\xaf\xee\x15\x89\x37\x9b\xf8\x4a\x3b\x10\x34\xa2\x75\xc0\x99\xdf\x99\x38\x3d\xab\x4c\x06\x2f\x1d\x67\x34\x8a\x98\xa4\x1e\x1e\x18\x29\xa5\xc4\x91\x5b\x37\xf6\xa4\xd4\xa2\x94\x5c\x7e\x2a\xb5\x01\xbc\xd3\x94\x0d\xde\xa6\x0d\xfe\x6c\x51\x41\x5b\x73\x45\x53\xde\x9e\xf3\xd8\x03\xef\xaf\x39\xc6\x08\x44\x0e\x6e\xb4\x9e\x42\xfe\x26\x3d\x33\x84\x1d\x64\x2a\x7a\x07\x90\x6d\x80\x20\x23\x1e\x81\xec\x84\xf0\x09\x5e\xf8\x36\x18\xc0\x2f\x62\xe5\xaf\x2e\x9f\xe1\xf9\xef\x15\xb8\xc4\xcc\xc6\xc2\xe4\xca\x32\xec\xe1\x3a\x2b\xe0\x3a\x0c\x30\xd0\xaf\x92\x2c\xfd\x2d\x07\x7c\xa3\xf3\x2a\x35\xb3\xf4\xc3\x5e\x88\xc3\x8c\xa1\x5b\x8d\x48\xc6\xd0\xc8\x5e\xef\x45\xc6\x10\x50\xdd\xff\x22\xfc\xdb\xd3\xf3\xf3\x8b\x6d\x3c\x49\x17\xe9\xf6\xea\x49\xb2\xf0\x7d\x07\xc8\x9d\x2b\x25\x60\x8d\x33\x84\x63\x1e\x19\xc2\x1c\xa0\xe4\x68\x71\x17\x12\x27\xcb\x6b\x78\x66\xa9\xcf\x1c\xb8\x04\x5d\x26\xe2\xc4\xcb\xc0\x27\x12\x1c\x71\x78\x25\x29\x84\x58\x21\x3c\xac\x3e\x82\x50\xbb\x8c\x3e\xb6\x9a\xed\xb6\x28\xfb\xfd\xf7\xb7\xa2\xef\xff\x9f\xff\xbd\x8e\x37\xf1\x79\x76\x02\xdf\xcd\x5b\x98\x07\x8a\xa5\x50\xd6\x22\x22\x4f\xee\x6d\x90\xf7\x63\x72\xa9\x5e\x54\xad\xcd\x03\x25\x72\xfd\x09\xb6\xf3\x1b\x97\x35\x91\x12\x84\xa8\xe6\xb8\xec\xc6\x99\x15\x3d\x71\x37\x6b\x5b\x48\xed\x38\x2a\x7c\x6b\x6a\x96\xb6\x60\x5d\xfd\x09\x90\xd6\x29\xb7\xa2\x88\x58\xa9\x90\xed\x80\xda\xae\x38\x1b\x41\x5e\x5d\xd2\x3f\x0d\x72\x3a\x75\xeb\x35\x85\x9c\xb3\xb9\xbd\x63\x13\xd9\xfc\x9f\x4c\xf7\xca\xd8\xe4\xba\x1d\xb3\xc6\xba\x4e\xdf\x4e\xb5\xed\x2e\x05\x2a\xea\x98\x77\xa0\x06\x68\x10\x8e\xd2\x21\x39\x60\x65\x3f\x41\x0a\xea\xba\x07\xec\xe0\xc0\xe5\x53\x4a\xc0\x91\x0b\x21\xfd\xcd\x3c\xcf\x3a\x7d\x7e\xef\xd9\xb3\x93\xa8\x0d\x5b\xc9\xf3\x47\x0f\x9f\xfe\xf4\xfc\x24\xea\xc0\x8f\x67\xf7\x5e\xfd\xfd\xd1\x49\xd4\x85\xd1\xe5\x50\x18\xe8\x06\xd2\xa9\xa1\x2f\xac\xf6\x44\x7e\xdc\xba\xb1\x98\x6a\x92\xdf\x94\x7e\x1d\xb1\xea\x26\x76\xd9\x3d\x92\xae\xe3\xda\x56\x6a\xf3\x1f\x9a\x86\xfc\x47\xe7\x54\x4a\xc2\xbd\x36\xa1\x22\x92\x4c\xf9\x12\xf2\x91\x5f\x33\xc8\x18\x16\x21\x24\x36\x06\xe9\xfe\x4c\x94\x12\x6c\xc2\x29\x76\x93\x21\x95\xa8\x74\x2c\x5e\xc1\xd8\x9f\x14\xa1\x4c\xad\x83\x18\xc6\xd5\x7a\x48\x23\x72\x98\x56\x6c\xc8\x33\x42\x7a\x41\x24\x1a\x1f\x40\xac\x04\x11\x4d\x8f\xc7\x9d\x9a\x17\x4f\xc3\x9f\x75\xa4\x47\x50\xc2\x9a\x6b\x11\x53\xc3\x70\x30\x2a\x53\x83\x24\x6f\x53\xc5\xee\x02\x48\x68\x00\x0f\xe2\x86\x69\xad\x3b\xec\x73\x81\x4a\x4e\x92\x2b\x4d\xe9\xa9\x73\x98\xfd\x65\x55\xe2\x04\x5c\xc8\x22\x84\x61\xd6\x5d\x84\xfa\xd2\x85\xdf\x10\xa7\x12\x5f\xae\xd8\xaf\x2d\x6f\x23\x23\x62\x00\xec\x4c\xc3\x2f\xba\x33\x85\xf7\x98\xc3\xd6\xb5\xd6\x8f\x26\xca\xd2\x18\x47\x7d\x49\x78\x31\x91\xec\x5a\xeb\x62\x57\xd0\x36\x41\x1c\xe8\xa6\xb0\x63\xde\xa0\xbc\x07\x48\x13\x06\x0b\xf5\xc6\x14\x36\x51\x55\xfc\x09\x37\x30\x72\x16\xde\xd0\xca\xde\x7a\xb2\xfa\x75\xb6\x90\x3f\xd1\xf0\x09\x11\x96\x1e\xbf\x2f\xa2\x3a\x84\x38\xfa\xe6\xf1\xed\x9b\xc7\xb7\xf2\x1e\xdf\x76\xbb\x64\x2b\xf6\xc8\x96\xe7\x5e\xad\xc0\xbb\x5a\x20\x86\x85\x1f\xc2\x02\x21\x5f\x08\xe6\x5e\x3e\x44\x2b\xe3\xe7\x4c\x41\x4b\x57\x67\xef\x56\xf8\x66\x37\x5e\xdc\x5f\xcd\xae\x5e\xa8\x07\xb6\x02\xa8\xc8\x11\xda\xdb\x1c\xef\x65\x17\xdb\xd5\xb3\xd5\xf4\xc3\x29\xde\x5e\xa1\x17\xe6\x7c\xc7\x5e\xd9\x19\x34\x93\x9f\x6f\xf1\xf1\x68\x59\x10\x38\xe2\xe6\xf4\x17\x81\xde\x53\x1f\x58\x81\xfe\x40\xf6\x4d\xb2\x90\xa1\x99\x80\x1b\x58\xad\xef\x15\x03\x51\xaa\xde\xec\xfe\xd5\xeb\xf8\x3d\x4c\x67\xb5\x32\x11\xd0\xe8\x84\x41\xbf\xf4\xf8\x98\x40\xc1\x70\x97\xae\xe9\xa1\x88\xe1\x27\xa0\x58\x56\xef\x0a\xc4\xd4\x52\x33\x2c\x39\x3a\x65\xeb\x64\x8a\x5b\x03\x26\xcf\xee\x4a\xb9\x63\x5a\x88\x61\x84\xc0\x6f\xf0\x90\xcb\x6f\xc9\x3c\xda\x7a\xa1\x9f\xa9\xd3\xc7\x5a\x2a\xb1\xaa\x9e\xd5\xd0\x33\x73\xe5\xac\xc5\x9c\xdb\x57\x05\xe6\x3d\xcf\x51\xdf\x98\x9e\xcc\x93\x8a\x4d\x1a\x77\x47\xb6\xcb\x65\x06\x71\x48\x21\xc4\x51\x70\x36\x62\xb2\xce\xd4\xab\xfb\x4a\xbb\xd5\xfa\x6f\xdf\x15\x82\x9b\xac\x9d\x57\x8c\x1d\xdf\x15\x9e\x3b\xf7\x4a\xc3\x29\x19\x7a\xf5\x0f\x07\xf8\xfb\x8d\x98\x18\xe9\xc8\xdf\x38\x62\x5f\x40\x9f\xee\x2f\x44\xae\x85\xfd\x25\x99\x7c\x48\xb7\xaf\xe3\xf5\x13\x91\x89\x00\xaa\x4c\x65\xf3\x7e\x12\x57\x5b\xf5\x48\xfd\x57\xab\xd4\xe9\x53\xe6\xe8\xf5\xe5\x2a\xba\x8c\xaf\x32\x10\xf4\x05\x9d\x9e\xaf\xb6\x89\x99\x2b\x91\x94\x0a\x76\x11\x1e\x10\x4b\x67\x44\x91\x48\x4d\x36\x04\x0b\x8b\x85\xd6\x1d\x5a\x9f\x55\x76\xe8\xc4\x3f\x82\xf1\x45\xf5\xaf\x2a\xef\x02\x75\xd1\x40\x16\x8b\xb7\xaf\xc0\x15\x4f\xd0\x6f\x83\xf2\x38\x22\x1d\xda\x45\x95\x1e\xba\x71\xa8\xc1\x75\x6f\xbd\x22\xfe\x0d\x96\xe9\x29\x5f\x0f\xd6\xcd\x84\x5e\x44\x75\x42\x23\x70\xeb\x78\x7a\x86\xa6\xa7\xbf\xbb\xf3\xd7\x0a\xcd\x5d\xbb\xfe\x65\x86\x75\xf0\x68\xec\x36\x6c\x6d\x6d\x71\x35\xd8\x75\x74\xed\x38\x30\xb0\xad\x45\xd6\x5b\xd1\x99\xdc\x63\x8b\x5c\x19\xd9\x3d\xa1\xbc\x23\x21\xa8\x37\x27\xc0\x72\x56\xe4\x57\x42\xdb\x75\xe9\x7d\x41\x79\x98\xa0\xdb\xb2\x7c\x9f\xe8\x6c\xd4\x30\x2f\xc1\xb2\x86\x28\x4a\x3c\x49\x96\x6f\x91\xc3\x0f\x6e\xf9\x73\x5f\x21\x09\x93\xed\xd5\x3d\x13\xc8\xec\xf8\xc7\x85\x77\xed\x9c\x7b\x2e\x15\x1d\x38\xb2\x61\xbe\xe3\x93\x66\xdd\xa3\x60\xdf\x46\xf3\x8f\x12\xaf\x3f\x54\x06\xcf\x1d\x2d\xcc\x3b\x9c\xf0\x7b\xf0\x01\x92\x2a\xe1\xa7\xe5\x08\x34\x2f\x51\x39\x4b\x67\xb3\x64\x59\x21\xdd\xca\x45\x85\x37\x96\x2f\xd3\xa5\x02\xde\x47\x48\x54\x95\x62\x43\x16\xc5\xca\xea\x1b\x89\x22\xdb\x94\xa0\xb7\xf0\x5c\x33\x14\xae\x4e\x1d\x7f\x93\x15\xbf\xc9\x8a\x7f\x92\xc0\x87\xc5\x62\xa6\x91\x8e\x78\x99\x3c\x27\xdb\x7b\x4a\xa5\xcc\xe7\x76\x19\x51\x13\x61\xff\xf3\x11\x0c\xd3\xcd\xb4\xd8\xcd\x34\x32\x9f\xc5\xbe\xaf\x4b\x0a\xa4\x7f\x94\x07\x67\x3d\x26\xe6\xbf\xd9\x0c\xa3\x84\xe4\xba\xd3\x27\xf2\x0d\x04\xce\xdb\xed\x45\x53\x0e\x83\x40\xe0\x6f\x9b\xaf\x46\x64\x01\x54\xc2\x2e\xd6\x4b\xe7\xfa\x7c\xa8\x81\xf4\xb2\x6c\xa9\x9b\xf4\x0c\x49\x1d\x40\xca\xd1\x61\xe8\x37\x39\x0c\xe6\x9e\xd1\xeb\x50\x9e\x53\x46\x4f\xd0\xf3\x04\xa8\xb0\x3f\x33\x23\x0a\x4b\xa7\x2b\x4d\xa7\x98\x4f\x30\x27\x01\xfc\xe5\xf0\xf1\xc6\x31\xca\x64\xf5\xe9\x34\xfd\x0d\x59\x09\xc1\x00\x6c\x04\xc5\x34\x44\x52\xc5\xbe\xa1\x5f\x6e\x1f\xc7\xe7\xe9\xe2\x2a\xbf\x97\x4b\x30\xc6\x7a\x6c\x00\x75\xd1\x9d\xa2\x1f\xfe\xb5\x8e\xe9\xa0\x27\x67\xf1\x0c\xf4\x4c\xe6\xbd\xc7\xbf\x10\x9d\x32\x39\xab\x4a\xe4\x92\xae\x43\x77\x5f\xc5\xb3\xf4\x42\xac\x48\x45\x9a\x77\xa3\x4a\x5f\x48\xb0\xd1\x89\xa1\x45\x91\xa2\xa3\xc7\xb5\xc4\xa7\x5e\x37\xbb\x98\x64\xd5\x08\xf3\xdb\x53\xc8\x31\xe7\xbb\x8f\xd3\x9e\xe3\x02\xf1\x60\xf0\xa7\xf3\x92\x9d\x0d\xda\x79\x3a\x1a\x44\x08\x55\x2a\xc8\x1c\x41\x6c\x6f\x94\xc7\xc2\x56\xd4\x5e\x7f\x8a\x06\xe2\x7f\x47\xe2\x6e\xb6\x3b\x35\xf1\x81\xd9\xbd\x40\x76\xa7\x57\xab\x60\xf9\xae\xc8\x6c\xb7\x42\x15\x0c\xb0\x82\xdc\xfc\x4e\x57\xd5\x80\xb9\xdd\x60\x15\x63\xac\x62\xb0\xbb\x0a\xe8\x62\xaf\x1f\x02\xe9\xcb\x61\x40\xf1\xf6\x28\x04\xd0\xd1\x75\x8c\x01\x13\xa1\x66\xba\x2d\x59\x07\xd4\xdf\x09\xf6\x43\xd4\xf1\xd6\x79\x1d\x2a\x51\xfd\x46\x4e\xc2\xdb\x42\xc6\x17\x0f\xd6\x7d\xd8\x5e\xdf\xd0\x7a\x1f\x7b\xea\x61\xa9\xd0\xdf\xe4\x59\xaf\xa8\x15\xcc\x5d\xbe\xb1\xc5\xdf\xd8\x62\xef\x0a\x05\x36\xd8\xd5\xfd\x8b\xed\xd6\x89\xb9\x7d\xbc\x81\x8c\xc6\x04\x73\x0c\xbb\x49\xa0\xff\x2e\x76\xe0\x75\x49\xce\xd3\x2d\x56\x09\xb3\x86\xcb\x38\xc4\x50\xe6\xd8\x58\xa2\x49\xa1\x7d\xab\x97\x63\xfe\x89\xa0\x33\xc9\xc2\x95\x03\x5e\xc4\x93\x84\xbc\x02\xcb\x0b\x53\xad\x35\x7f\xd2\xb1\xae\xb6\x27\x2d\x36\x65\xbd\x45\x5e\xfc\x66\x68\xb3\x7e\x6f\x2b\x5a\x16\x38\x4e\xf8\x63\x5f\x27\xb3\xba\xb1\xf8\x73\x38\x50\x92\xa3\xb4\x21\x9c\x82\xaa\x26\x82\x2e\x9a\xab\xfb\xe0\x24\x7e\xf2\x0d\xd9\xf7\xc8\xa8\x32\x0f\x64\xbd\x64\xe6\x33\xa2\x66\xce\xcc\x54\x10\x3d\x0e\x9b\x51\xd8\x7e\xd8\x83\x3a\x36\x85\x52\x1b\xe1\x32\xc9\xec\x76\x21\xf7\xc2\xc7\x64\xfa\x4e\xee\x03\x5e\x19\xb4\x6f\x0c\x4c\x39\xcc\x39\xc6\x6a\x0d\x9f\xa1\x40\x06\x81\xa9\x56\xc0\x35\x68\xd9\x78\x31\x90\x8a\xc2\x9c\xc8\x01\x45\x08\x87\xee\x7f\xfe\x72\xf1\x0f\xe4\xa3\x2a\x1d\x6d\xc0\xa5\x3c\x36\x9f\x15\xf2\xf6\xc1\x1d\x80\xa5\x06\x5b\x19\x27\x86\xcf\x9e\x35\xc5\x75\x02\x17\x48\x1c\x5b\x87\x75\xcc\x35\xed\x9e\x93\x89\xed\xc8\xc4\xff\xa5\xe5\x2f\xf9\x93\x4a\x60\xea\x4d\x9c\xb4\xb2\x60\xe0\x4d\x48\xa4\x40\xc6\xd5\x3e\x83\x22\x0f\x82\x95\x35\x08\x6c\x53\x1e\x18\xa6\x52\x30\xd8\x90\xe0\x6d\x8c\x0b\xa8\xd2\x6f\x53\xb7\xa3\xbb\xe5\x28\x5a\x05\x88\x53\xd0\x77\xe6\xcb\x1e\xdb\xc7\x4b\x01\x59\xbf\x15\x95\x0a\xb9\x71\x42\xb4\x39\x8a\x6b\x73\xc5\x81\x3e\xb3\x28\x82\xb9\x6d\xb9\x3e\x44\x94\x5b\x53\x8b\x62\x0b\x20\x0e\xe6\xe2\x1a\x94\xe5\x7a\x11\x08\x8e\xd3\x01\xc1\x34\x07\xc4\x9e\x23\xac\x43\x2c\x8f\x5c\xe9\x48\xa4\x59\xa7\xac\xfa\x38\x21\x6e\x4c\xe5\x2a\x0f\xf5\x0e\x5f\x63\x33\x4f\xc3\x99\x5d\x3e\xb5\xe0\x4e\x72\xb0\x63\x53\x2a\x14\xd1\x0b\x0d\xdb\x4f\xe0\x04\xe4\xe9\x4f\x17\x94\x4e\x95\xfb\x77\x44\xe2\x45\xe1\x8a\xf4\xe4\x25\x69\xd6\xc6\xf7\x34\xd7\x62\x91\xe6\xc2\x13\x4f\xb9\x69\x90\x45\x6a\x6e\xc4\x25\x56\x72\xb7\x4b\x44\x60\xab\xdc\x36\x65\x5b\xb1\x7b\x93\xf5\xef\xa0\x18\xee\x66\xb2\xfc\xd8\xfc\xf1\xc5\xc3\x47\xef\x1e\xfd\xf8\x33\xbe\x2d\xab\x88\x9c\xd9\x85\x8c\x12\xe1\xc6\x1d\xce\xb2\xf8\x3d\x2c\xfc\xa3\x07\xf1\x72\xb9\xda\xaa\xe6\xa2\x58\xf0\x52\xf3\x79\x82\x26\xe2\x78\x7c\x47\x92\x27\x83\xd7\x54\x42\x22\x8e\x97\x72\xd9\xb2\xac\xa3\xe8\x87\xe8\x48\x6c\xc7\x68\x5f\x6e\x38\x00\x6d\x8b\x7e\x85\x3e\xc0\xb6\x2b\xd4\x3c\x35\x8f\xf4\x76\x01\x51\x3a\x57\x20\xd7\x6c\x36\xab\x4d\x55\xf5\xc7\x7f\x71\x16\x78\x5a\x62\xd2\x94\xe7\x0b\x6f\x06\xa8\x8d\x62\xfe\x74\xd9\xf7\x7c\xa7\x17\x53\xc0\xdf\xfc\x62\xa1\x1c\x73\x5c\x6b\x1e\x1d\x8b\x08\xdd\xd9\x5a\x14\x48\xf4\x46\xe0\x8e\x9f\x38\x78\xfa\x59\xee\x13\xcc\x10\x80\x66\xb9\x0c\x12\xe9\xbb\x26\x25\x66\xdc\x90\x57\xaf\x9b\xc5\xb0\xc6\x7c\x85\x94\xc2\xb3\xf5\x17\xa2\x78\x82\x45\x12\x6f\xdc\x36\x6d\x62\xd5\xf3\xc4\xc0\xfa\x52\xa9\xd4\x0a\x65\x63\x97\xf5\x17\x62\x72\x4d\x8a\x35\x68\x7a\x6f\x04\x8e\x77\x6a\xcd\x08\x3e\x41\x09\xd2\x54\x00\x39\x3a\x19\xb6\xeb\x47\x1a\x46\xc8\xc6\x2d\xe7\x56\x68\xf8\x2d\x66\xec\x37\xf1\xf7\xcf\x6d\x41\xf8\x68\x29\x76\x98\x69\x32\x3b\x95\xfe\xc2\x58\xa9\x44\xe5\x35\xa4\x33\xb1\x80\x70\xfe\x62\x3e\x77\x1a\x32\x91\x95\xb7\xab\xf7\xef\x17\x09\x5b\x2f\x0d\x31\xad\x5a\xee\xf3\xab\x5a\xee\x53\x13\xa9\x27\xa0\x30\xd8\x53\xfa\xdf\x6d\xc8\x78\xb3\x97\x4d\xa9\x8e\x8b\x5f\x1c\x08\x14\xf9\xb1\x12\x70\x86\x41\x2b\x94\xee\x05\xf5\xa9\xee\xd2\xa3\x01\x93\x82\x47\x42\xc1\xd5\x00\x91\xd7\x6f\xc4\x08\x2d\xc5\x50\xe7\x96\x8f\xd3\x96\x66\xda\xe8\x44\x75\xb2\x09\x6f\x0b\x3c\xbb\xb3\x10\x90\x82\x31\x8c\x9c\x5c\x7c\x79\xd1\x70\x0a\xef\x2a\x76\xc5\x68\xca\x35\x78\xa2\xc1\x70\xc0\xb9\xb7\xcd\x9e\x0b\x09\xd6\xef\xb7\xbc\x59\x60\x01\x64\xcc\x85\x08\x16\x08\x1a\xe9\x1d\xdc\xa3\xe2\xe8\x3c\x70\x9f\x11\xf5\x99\x55\xde\x1e\x18\x0b\x0f\x50\x2d\xd9\xe0\x08\xe5\x04\x81\x3d\xd1\x03\x2d\x4a\xfc\xee\x0f\xa8\xb5\x63\x40\x21\xbc\xed\xaa\x73\xd7\xb4\xe5\xf7\x54\xbb\xed\xa4\xd5\x86\x47\xae\x1d\x82\xe6\x4e\xee\x0d\x56\xa7\x64\x40\x5b\x07\x0d\x5f\xa4\xb4\x56\x36\x32\x87\x5b\x35\x96\x7e\x48\xeb\x8f\xfc\xf6\x11\x28\x3f\xd2\xd1\x97\x32\xae\x23\x4a\x83\x90\xb6\x60\xcf\x3b\x57\x4f\x15\xe0\x9b\xcf\x91\xdd\x8b\xf6\xa2\x4c\xec\x26\x49\x25\xcc\x92\x4e\x91\x3f\xe8\x3b\x19\x10\x21\x50\x06\x6f\x0e\x89\x7a\x70\xee\x42\xd5\x18\x47\xb2\xa4\xbb\xf3\x79\x99\xfe\x02\xa1\xed\xe8\xad\xb3\x98\x0e\xeb\xab\x4b\xec\x14\xf9\xe4\x54\x51\xe2\xbe\x73\x92\x17\x29\x01\xa8\x3f\xf2\x1d\xba\x1c\xc1\xb3\x90\x1b\x54\x33\x9f\xf6\x9e\x74\x57\xf9\x25\x2d\x6e\xf0\xfb\xd9\x84\xf3\xb0\x23\x4a\xd7\xeb\x45\x22\x97\xd1\x9d\x10\x76\xfd\x05\x48\x37\xc9\xc0\xd2\x23\x87\x04\x75\xbb\xaf\xd1\x5f\x3c\xc9\x00\x16\x9e\x36\xda\x69\xcb\x75\x14\xd7\x26\x15\x4b\xb4\x3a\x5b\x92\xd6\x97\x30\x06\xf3\xa5\x5a\xe0\xc6\xfe\x1c\x14\x67\x47\x1c\xe6\xc8\xf8\xcc\x5b\xae\x2f\x90\xe7\x12\x20\x48\x1d\x26\x47\x32\xa4\x8e\xa6\x5e\x63\x15\x64\x24\x6a\xf2\x22\x81\xd5\x4c\x9e\x04\xe8\xcc\xd8\xc6\xd8\xf9\x3a\xa1\x3f\xea\x84\x4f\x51\xfc\x98\xa5\x78\xba\xef\xaa\x4c\xfb\xdd\x3a\xfe\x97\x43\xe3\x11\x77\x70\x29\x59\x90\x97\x31\xa8\x53\x4e\xc5\x96\xb5\x30\xaf\x30\x28\x38\x6a\x7c\xb8\xea\xcd\x51\xe7\xb9\x93\xa1\x73\x34\xa1\x85\xb2\x00\xb7\xc0\x6e\x1d\x85\x36\xf1\xd0\x52\xe0\x12\x43\x58\x33\x1a\x98\xf4\x1a\x7b\x5e\x1f\xa9\xb8\x61\xe8\xb6\xe7\x12\x5c\x5a\x69\xe5\x43\x3d\x02\x35\x13\x26\x5d\x2c\x75\x22\xb8\xdd\xa1\x48\xf3\xbd\xd0\x62\xb2\x75\x7f\x1c\xd0\xae\x24\x10\xe5\xda\x4f\xab\xf2\x4d\xeb\xa3\xa3\x87\xf0\x71\xef\xb7\x4d\x32\x55\xbc\xf9\x5b\xf0\x82\xda\xb0\x1d\xe4\xf9\xb4\x4a\x0b\x72\xdc\xe8\x49\x8f\x63\xae\x99\x66\xa7\x8a\xd4\xab\x1c\x7f\x3f\x65\x89\xa7\xc5\xf0\xf5\x20\x01\x9d\xcc\x76\x85\x8a\xb6\x58\x56\x43\xa5\xa0\x4c\xeb\x71\xa5\xae\xb9\x29\xf5\x3f\xfe\x28\x6c\x62\x15\xc3\x1b\xe1\x57\x5f\xe3\x13\x1a\x0e\x74\x50\x8f\xc7\x2d\xcb\x44\x89\x80\x16\x2b\x5f\x7b\x15\x6a\xc9\x16\x28\xab\x08\xd2\xa6\x12\x8e\xd4\x7b\x74\xd2\x03\x77\x74\x87\x5a\x50\x94\x12\x63\x41\x75\x34\xd8\x0d\x6d\xc4\x67\x80\x1f\xba\xba\xa6\x43\xfd\xd9\x7d\xd3\x35\x7d\xd3\x35\xfd\x31\xba\x26\x3c\x4c\x9f\xc7\xcb\x74\x0d\x91\x10\x57\x9b\x90\x01\x32\x8a\x2b\x8d\x73\x0b\x64\xda\xbb\x5a\xaf\xde\x6f\xe2\xf5\xd9\x55\xb8\x39\x93\xed\x6a\xb6\x42\x66\x24\x66\x8d\x5b\x4b\x12\x6a\xb7\x4c\x20\xd1\x0c\x12\xd5\x4c\x86\x50\xc4\xee\x98\xc2\xe9\xfc\x0c\xce\xd1\xaa\x92\x28\xe0\x43\x3e\x3a\x37\x7a\x12\xf8\x29\xb7\x2b\x9c\x6a\x7e\x7b\x8b\xde\xfc\xc8\x79\xec\xec\x6b\x62\x73\x8c\x1e\xe1\x95\x47\x45\x1b\x98\x60\x13\xea\x86\x75\x45\x4c\x67\x2f\xe3\x0c\x8f\x4c\x78\x13\x55\xc9\xd6\xc9\x34\x9d\xa7\xd2\x5d\x10\xa4\xb0\xde\x00\x44\x53\xab\xc6\x35\x75\xc4\x69\x46\x90\x54\x4e\x75\x66\x8b\xfc\xd1\xba\x33\x72\x85\x57\x68\x5c\x63\xa4\xe9\x7c\x0b\x6c\x25\x2a\xb3\xe9\xd4\x1a\xb5\xe7\xe0\x1e\x4f\x86\x5a\xc8\x77\xff\xa6\xc0\x7e\x5a\x97\x00\x7a\x96\xc4\x1f\x0b\x7d\xc9\xa9\xa0\x4c\x8f\x96\x81\x3e\x7b\x50\x82\xe3\xd8\x6c\x8b\xe0\xd6\x9b\xf4\x3c\xde\x5c\x15\x3e\xaf\x4e\xc4\xcc\xcc\x76\x00\x95\xd5\x41\x7a\xe6\xc5\x3b\x8d\x99\x4a\xc0\xe9\x49\xbc\xbf\x4f\xe5\xba\xd0\xb3\x92\x8d\xcc\x85\xe4\xa8\xfc\x25\xef\x7a\x3d\xbe\xa7\x05\x12\x33\x13\x0f\xeb\x5f\x20\x9e\x7a\x9b\xbd\x49\xd4\x82\xd1\x19\xbc\x7f\x42\xb6\x8b\x8a\x32\xd2\xf5\xa2\x9b\x9a\xca\xd6\xff\xc5\xa2\x62\xba\xc6\xfb\xe6\x75\x41\xbe\x71\xd2\xf5\x4d\x6f\xd8\x90\xad\xd9\x4c\x78\xc4\xce\x4d\x76\xb0\xbf\x85\x43\x94\x83\x71\x2c\x99\x3d\x62\x61\xb6\xcc\x4e\x2e\xf7\x99\xce\xf4\x5e\xc1\x29\x73\x8a\x73\xb9\x2a\x0f\x68\x87\x06\x8f\x4b\x5c\x61\x3a\x99\x85\x54\x72\x12\x6a\x52\xd4\x25\x37\x93\x95\x54\x7b\x44\x40\x0b\xa1\x72\x02\x65\xcc\xa6\x11\x28\x65\xf2\xf2\x86\x3d\x95\xc3\xa5\xb3\x45\x57\x29\x9b\x28\x9b\xb1\xef\x1c\xd9\x92\xe1\xe9\x21\xf9\xf9\x33\xf3\x5a\xd0\xee\x4d\xcc\xce\x22\xa7\x33\x0b\xaf\x13\x25\xe7\xc4\x74\xec\x80\x79\xf1\xca\x12\xa0\xad\x1d\xb0\x7b\x63\x24\x0f\xfa\xc0\xbd\x91\xcc\xd8\xf7\xf6\x68\xe2\x5f\x1c\xdd\xdc\xc5\x94\x65\x4c\x0e\xb9\x99\x8a\xcf\x69\xe4\x7a\x3e\x23\xdc\xf2\x93\xe2\xbb\xd5\xec\x09\x84\xb6\x9a\xad\xd1\x6d\x5f\x93\x6c\x14\x5d\x8e\xa3\x05\xef\xc0\x94\x41\x2f\xed\x6d\x84\x62\xb9\x44\x46\xba\x5c\xa4\xcb\xa4\x31\x59\xac\xa6\x1f\x08\x80\xf6\x0b\xcf\xe8\xc0\x9c\x66\xf0\x04\x05\xfd\x2a\xb8\x73\xad\x27\xad\xa9\xcb\xfb\x1e\x1e\xc2\xf0\x32\x77\x8f\x0b\x21\xf7\x6a\x62\xaa\x23\x19\xe4\xdc\x65\x6d\x12\x19\x1f\xfd\x70\x9f\x13\xeb\x78\x36\xc3\x67\x45\xe4\xa6\x68\x65\x1d\xd6\xa8\x97\xcd\xc4\xab\x04\x7b\xcd\xd3\x39\xe8\xb2\x2b\xfc\xb0\x2a\x78\xd6\x30\x6f\x13\xaf\xc1\xb2\x57\xfc\x87\xde\xd8\xb3\x95\xf4\xc3\x29\x95\x8e\x59\x34\x5b\x21\x4b\x2f\x36\x95\x64\x46\xca\xac\xe3\x6c\xab\x3a\x8d\x6a\xcc\x8b\xac\x49\x72\x4f\x13\xb1\x86\xce\xb6\xdb\xf5\xc9\xb1\x90\x8a\x44\xe3\x7a\xe8\xb0\x42\x8e\xd1\xbb\x2d\x0c\xe2\xb8\x3d\xec\x8c\x47\xc3\xee\xf8\x78\x9a\x65\x0d\x0d\xd3\x90\xc8\x69\x88\x66\x1b\x97\xab\xcd\x07\x81\xc6\x46\x0a\x0a\x8a\xcd\xea\x3c\x69\x80\x3a\xae\xb1\x46\xfd\x64\x43\x48\xa8\x0d\xf5\x6a\x4b\xf6\xa1\x11\x2f\x67\x0d\x10\x47\x38\xfa\x5c\x6f\x17\xdd\x59\xd5\xf8\xdd\x70\x49\xc3\xbb\xb5\x2a\x26\x8b\xd0\xed\x1d\xbc\x1a\x93\x5e\xf5\x2a\xf0\x6e\xa7\x42\xdd\x8c\x6c\xb7\xc9\xe6\x14\xca\x38\xb4\x81\x72\x09\xe9\xeb\xc5\x5a\x08\x7b\x10\x8c\xab\xc2\xeb\xfd\x45\x91\xa1\x95\x41\x9b\x36\xf9\x79\x22\x90\x70\x4e\xd6\xa5\x90\xbe\xe1\x0e\xb5\x15\xa0\x4b\x78\x0d\x86\x62\x59\x78\x27\xcb\x64\x1f\x75\xa0\x96\xbf\x5f\x40\xc7\x9f\x25\x59\xa6\x22\x36\xd8\x1a\x21\x68\x89\xd4\xec\xf9\x3b\x07\xec\x16\x4f\xe8\x52\x26\xb6\x90\xc6\x97\x03\x49\x53\x2b\x9b\x1f\x50\x2c\xa7\x78\x4b\xf0\x3a\x37\x75\x16\x02\x3d\xcb\xdd\x99\x57\xfe\x55\x0e\xbc\x9b\x97\x1e\x65\x72\xea\x84\x8b\xa6\x27\x9a\x8d\x2e\xd8\x79\x5d\xb5\x44\x73\x1e\xeb\xe0\x26\x6e\xef\xeb\xea\x88\xf8\x43\xbd\x8a\xcc\x6c\x98\xc9\x77\x9c\xf7\xb0\x30\xc6\xf0\xda\xb3\xb8\x86\x5c\x7d\x86\x99\x7c\x95\x40\xce\x2b\x73\x9e\xd9\x67\xb2\x3a\xe9\xb0\x0b\x56\xdd\x47\x66\x80\xad\xda\xc5\x37\xad\xba\xfa\xd2\x57\xb0\x7c\xb0\xf6\x8e\x90\x44\x72\x01\x08\x50\xb6\x30\x95\x4a\xe4\x16\x28\xb8\x54\x8c\x40\x85\x12\xd3\x33\xa2\xc4\x5b\xcb\xe2\xbb\x30\x4b\x97\xaa\x23\xea\x17\x0f\x8e\xe6\xdf\x17\xd2\xba\x2d\xeb\x4c\x21\x5f\x18\x97\x50\xdf\x55\x09\x9b\x62\x30\x5b\x43\xe6\xa4\x8d\xcc\x49\x7b\x40\x10\x28\x59\x30\xf4\x9d\xf8\x44\x06\x51\x00\x8c\x13\x8e\x16\xae\x53\xa3\x13\xe2\xb8\x9d\xe8\x43\xe8\x95\x94\x49\xae\x73\x48\x50\x89\x78\x70\x3f\xad\x1d\x28\xa5\x13\xf1\x00\x31\xdd\x81\x7d\x24\xb6\xca\x4d\x00\x16\xd3\x2d\x2c\xd5\x8e\x50\x58\x9b\xee\xc0\xa2\xbe\xc5\x83\x14\xa9\x16\x8e\x45\xe9\xe2\xc0\x2c\x4b\xef\x05\x74\x33\x28\x20\x35\x54\x36\x16\x1b\xb1\x87\xa9\x2d\xec\xb6\x87\xec\x8a\x5a\x84\x26\xa6\xbd\x4a\x28\xff\x5c\x74\xc7\x6d\xca\x73\xcd\xa9\xad\x37\x74\xd3\x17\x20\x25\xfa\x30\x42\xdd\xf0\x56\x0c\xef\x47\x56\x16\xd5\xd2\xe9\x6f\x34\x77\x37\x26\x4c\xad\x35\x5a\x0e\xa3\x80\xbd\xda\x71\x97\x0b\x7f\x50\x9b\x52\x06\x90\xd4\x68\x7c\xbd\xb1\x25\x98\x53\x6b\x18\x98\x98\x1a\xec\x98\x08\xc7\xc8\x01\x09\x45\x21\x74\xa5\x3d\x34\x96\x40\x93\x82\xad\x53\x82\x50\xfa\x25\x54\x43\x17\xdb\x6c\xf8\xa7\x29\xdb\xd2\xf8\xee\xca\x10\xe1\xbf\x59\x32\xb9\xfa\x00\x35\x46\x13\x6e\xd8\x51\xbb\xdf\x78\xf1\x46\x75\x96\xbd\xed\x3d\x3e\x5e\xc1\x75\xb2\x8d\x7f\x04\xef\x20\x65\x10\xa4\xcc\x9c\x09\x89\x92\x3c\x77\x3d\xa8\x08\xac\x1e\xa6\x7d\x12\xec\x4e\x9b\x3d\xfd\x0a\xdc\x36\x9b\x3e\x3a\x37\xce\xb4\xef\xe1\x31\xff\x14\x8a\xb0\x2a\x33\xaa\x49\x4e\xf8\xc1\xdd\x5d\xfe\x4c\x5c\x8d\xfb\x1d\xfa\x69\x1d\xea\x26\x36\x18\xee\xa4\xda\xb8\x83\xfd\xc4\x3c\x7e\x11\xff\x9d\xbd\xa5\x35\x2b\xb6\xe9\x45\x3f\xac\xd6\x7c\xef\xda\xbb\x06\x56\x77\xf4\xa4\x3b\x06\x8a\x7d\x0b\x8d\x55\x77\x3a\x3c\x5c\x75\xf6\x04\x87\x8b\x79\x87\x0d\xd7\xae\x3d\x39\x32\xdc\x38\xf2\xe9\xd2\x8c\x14\x1e\xc8\x94\x22\x40\xec\x5b\x68\xb8\xba\xd3\xde\x70\xe9\xf1\xe9\x0e\xd7\xe6\xe5\x12\xe2\x2d\xb2\x03\x86\x5d\xc8\x14\x2d\x2a\x39\x9e\xbc\x09\xb4\xcd\x3b\x23\x62\xfd\x0a\x8f\x08\x0f\xf9\xe0\x78\x44\xce\x97\x58\x56\xba\xee\x50\x57\x65\x93\x5e\x47\x1d\x2e\x23\x10\xe0\xdb\x66\x57\xe5\x9d\x77\x28\x32\xa9\xba\x79\xa6\x59\x79\x7b\xfc\x0d\x6d\x81\x37\xa9\x3a\x2b\x0e\x88\xa9\x4e\xa2\x9a\x12\x4e\x5d\xe5\xf6\x9d\x22\x49\x6e\x97\x2f\xc4\x42\x16\x5e\xb2\xdf\x46\xf8\xf3\x5e\xd6\x7d\xe7\x1f\xac\xd7\x40\xae\x45\xec\xb5\x90\x21\x35\x2f\x52\x69\x53\x21\x0f\xc6\x72\x2d\x61\xa8\xee\xd4\x31\x85\xd1\xef\x9d\x7a\xad\x9d\xa6\x30\x34\xbc\x63\x91\x5d\x8c\x7b\x6d\x2f\x32\xc6\xd6\xe5\x88\x67\x06\x00\x4e\xd9\xdb\xae\xc9\xcb\xa1\x41\xc2\xde\x65\x10\x42\x7b\xf6\x7a\x75\x0f\xc2\x6e\x89\xc1\x13\xb7\x24\x68\xe2\x62\x4c\x9d\x00\xee\xe9\x16\xe2\xc5\x09\xf1\x3f\xde\x6c\xc0\x0e\x43\x59\x81\xbc\x13\x3f\xc1\xe7\xcd\xdb\xdb\xf2\x27\xdc\x9e\xc3\x96\xa7\x7e\x82\xb8\x8e\x67\x92\xfa\x9d\x30\x49\x55\x40\x5e\x51\x5b\x9a\x77\x29\xda\xc7\x6c\xde\x9c\x5e\x9d\x4f\x56\x8b\x66\xaa\xda\x7c\x0b\x3a\x87\x77\xd9\x6d\x21\xe1\x61\x03\xd5\x77\x30\x57\xef\xd2\x26\x5c\xae\x89\x13\xb3\x39\x5b\x2d\xc5\x66\x62\x5b\x87\xde\x41\xcf\x9a\x10\x52\x5c\x40\x6b\x83\x36\x19\x9f\x1a\xb6\x02\xcc\x55\x91\x97\x81\x15\x12\x03\x92\xd1\xe1\xd1\x42\x66\x1a\xc3\x33\xa0\x6a\xb2\xd9\x60\x4d\x33\x33\x28\x1c\x80\x48\x06\xb0\x39\xf8\x61\x5c\xc0\x00\xe4\x30\x70\x0d\xbc\x43\x9b\x86\x77\xe9\x9b\x8a\x94\x7d\x84\x5c\xcf\x7e\x09\x11\x9e\x15\x45\x87\x03\xb8\x43\x6e\x56\x97\xa2\xfa\xdb\xd4\x42\x07\x3a\x49\x2c\x5a\xec\xf4\xd8\x39\x80\xf2\x38\x7f\xe2\x6c\xc5\x4f\xc8\x43\x33\x20\x55\x48\x55\x61\x56\xa9\x83\x5a\xb0\x90\x90\xe6\x37\x6e\xc1\xe0\xac\x9b\xaa\x7e\x57\x3d\x06\x13\x0d\xb8\x27\x56\x66\x1a\x4f\x97\x68\x48\x10\xc5\xdb\x6d\x72\xbe\xc6\x97\xac\xb3\x44\x90\xdd\xc5\x54\xd4\x99\x44\xcb\xd5\xb2\x81\x2d\x83\x95\x8d\x58\x3d\x5b\x58\x58\x15\xac\xf5\xb3\xf8\xa7\x56\xad\x7d\x33\xc7\xe2\xe6\x58\x29\x30\x29\xab\xb5\x32\x7f\x51\x0e\xef\xaa\xca\xc0\x4a\x95\x14\xbf\x80\xe8\xc4\x47\xf3\xdd\xbb\x24\x7b\x8e\x6b\x5f\x9c\x2b\x90\x7e\x22\xc0\x2a\xca\x43\x47\xe5\x04\x93\x3e\x1b\x9b\xa8\x77\x9b\x5c\xa3\x28\x92\xdf\xc1\xb5\x16\xec\x87\x04\x30\xa1\x8e\x0e\x34\xa2\xba\x77\xb1\x5d\xc9\x13\x29\x68\xd4\x44\xa2\xe2\x16\x9b\x5d\x85\xb7\xda\x32\x56\x4d\x00\xf0\xf3\xd3\x47\xbf\xdc\x7f\xf1\xcf\x77\xa7\x4f\xff\xf5\x48\xc0\x75\x3b\xea\x71\x5e\x32\xdf\x24\xd9\xd9\xd3\xe5\x2c\x9d\x2a\x73\x2d\x85\x96\x37\x06\xaf\x6f\x77\x99\x0a\x39\x75\x1c\x10\x33\x40\x7a\x99\x0e\xb4\x6c\x0d\x35\xe4\xa3\x6b\xcf\x19\x0f\x28\xf3\x05\x7d\xc7\x60\xb3\x5b\xa2\xbc\x32\x8b\xc1\x3b\x84\xf2\xe0\xe2\x00\x07\x7e\xad\xb0\x80\x76\xcf\x23\x60\x66\xa8\xfc\x5c\xac\x62\xb8\x10\x80\xaf\x67\xe9\x2c\x31\x9e\x7a\x94\x2c\x5f\x5c\x19\x31\xbb\x41\xfd\xf7\x7e\xa8\xb9\x75\x63\xfe\x25\x29\x7a\xad\x0f\x1d\x44\x5f\xcf\xfe\x56\xf8\x91\xe3\xb4\xea\xf2\xcf\x25\x6c\xc3\x4a\xa0\xe1\xd6\x0d\x44\x55\x08\x05\x38\x08\x58\xc8\xec\x19\x1b\x41\xaa\x09\xf1\x1d\xd9\xcb\x78\x7b\x56\x0d\x0c\x26\xcc\xd8\xad\x63\xf0\x37\x18\xb5\x6a\xc4\x4a\xe6\x9d\xd8\x77\x45\xe5\xbf\x08\x4e\x49\x60\xbd\x7c\x5d\x97\xb2\x00\xb5\xbd\x2f\x73\x1d\x01\x1a\x46\xf6\x04\x04\xee\x41\x5e\xe9\x44\xfd\x1c\x4a\x1f\xd5\x79\x7b\x42\x39\x7d\xa7\xf6\x52\x4a\xa5\xc5\x42\xdd\x9f\xe9\x5c\xa1\x0e\x54\x6a\xc9\x52\xbd\xef\x3c\xd8\xfa\x2f\xf9\x24\x62\x71\xf4\xda\xd7\x4e\xd5\xd7\x47\x71\x00\x2a\x98\xb9\x45\x09\x02\x71\x7f\xc5\xa0\x67\x04\x81\x2f\x75\x22\x7d\x4f\xa6\x35\x63\x0f\xce\xc1\x6d\x19\xe8\xdd\x83\x22\xa5\x5c\x46\xd2\x5b\x87\xdc\x45\x9c\x90\x49\x88\x45\x6f\xce\x1e\xd8\xe4\xaa\xe9\x93\x11\x2f\x78\xdb\x65\xe7\xd1\x53\x4a\x6a\x95\xa4\x22\xb6\x62\x95\x24\x55\x0d\xe7\x5f\xf5\xc9\x86\xab\x15\x73\x91\x0c\x3b\x65\xa7\x05\x9e\xfd\x95\x8b\x49\xb8\xe4\x8c\x37\x15\xa6\xf8\xcd\xb5\x0b\x80\x3f\xdc\x94\x80\x64\x7d\xae\x99\x1f\x44\xad\x59\x1e\x1b\x70\x65\xf4\xf1\xbd\xa3\xa4\x55\x18\xe0\xa3\x35\xfd\x33\x53\x51\x77\xf2\x75\x27\x0d\x00\xcb\xff\xcc\xc1\x3f\xa6\xc9\xe5\xfd\xd5\x27\xb8\x55\x8e\x5a\x78\xab\xcc\x0e\xf2\x1f\x44\x92\x9b\x78\x2b\xa7\xb2\x9d\xa3\xb5\x7e\x69\xed\x25\x80\x9a\x76\xd8\xaf\x1c\x5c\x17\xcc\x3f\x21\x54\x1d\x6e\xc0\x45\xd2\x2e\xa2\x10\xac\x26\x90\x43\xbb\xd9\x27\xf4\x00\x97\xc3\x60\xb0\xb0\xba\xd8\x56\x6a\x1c\x6b\x35\x36\x6a\xba\x54\x9a\x82\x59\x17\x9b\xa3\xaf\x95\x66\x12\xfe\xb5\xd7\x19\xee\x08\xab\xc5\xd5\x7b\xe7\x99\x1e\x6e\x0a\x24\xfd\x26\x97\x28\x27\xc9\x1c\x82\x2c\x26\xc7\x22\x62\x64\xd4\x73\x1d\x42\xdc\x67\xc9\x85\x88\xf0\xd6\x61\x54\x47\xd7\x7c\x80\x22\xf6\xe9\x94\x9a\xd9\x03\x7a\x45\x69\x22\xd0\x2d\x96\xcd\x28\x95\x5f\x1d\xab\x73\x98\x90\x0a\xb7\xb1\x74\xad\xeb\xde\x1d\x6c\x5e\xe7\x30\xf3\xbc\x99\x97\xd2\xc8\xc5\x0d\xe0\xc9\x73\x9c\x53\x12\xd3\xb9\xd2\x10\x18\xc8\xe8\x7b\xb8\xb1\x66\x5c\x86\x82\x75\x9b\x54\x94\xe9\x35\x68\x4e\xda\xc0\x08\x49\x3b\x0d\x7a\x3a\xd3\x4e\x7e\x1f\x75\x78\x53\x72\x85\x83\x47\x44\xa7\x2d\x9b\x91\xc7\x27\xa3\x95\xd4\x09\x5f\x13\xc7\x51\x47\x34\xde\x37\x97\xcc\xe8\x77\xe1\x9f\x3e\x10\x07\xf8\x35\x1f\x20\xdb\x6e\x56\x1f\x12\x65\x10\xd8\x75\xf9\x6c\xe8\xe8\xbd\xcd\xf4\x61\xf2\xde\xe9\xbd\x4c\xe4\xb3\xe2\x28\x71\x0d\x97\x2f\x9a\x13\x67\x27\x35\x23\x48\x44\x9f\x44\x71\x51\x60\x2d\x30\xd6\xee\xb4\x2c\x5f\x23\xd6\x81\xcd\xe9\xb5\x5b\x6c\x32\xdf\xe8\x92\x75\x05\xf7\x96\x77\xf5\xb1\x58\x72\x9e\x45\xb0\x4c\xdc\xaf\xab\x06\xb0\x2d\x20\x9f\x8b\x83\x0a\xac\x1e\xab\x6d\xb1\xb6\x04\x44\xab\xd9\x73\x5c\xce\xad\xdb\xbc\x1f\x86\xe5\x75\xba\x42\x58\xe1\x7c\x72\xf6\x88\x2a\x68\xe7\x6f\x0d\xdd\x8e\xb4\x2f\x0f\xf3\xca\x59\x87\xd0\x32\x93\x7c\xe9\xd9\x7b\x52\x97\x28\x67\x01\x9b\x2f\x92\x6d\x8c\xd0\xd4\x17\xfb\xa6\x40\xc8\x90\x10\x83\xab\x65\x84\x36\x29\x72\xf3\xb4\x3c\x9b\x3e\xd8\xd9\xab\x08\xa9\xcd\xda\x94\xfa\x5c\xd4\x51\x93\xa6\x61\xf5\x28\x0f\x48\xb4\x6d\x60\x88\x47\x12\x63\xdf\xe7\x73\xc0\xa0\xb1\x94\xb2\xa4\x7e\x4c\xc0\x3a\xe8\x3f\x84\x0e\x95\x2b\xe0\x2a\x9a\x5d\x0c\x1f\x85\xec\x04\xf2\x12\x91\x36\xb0\x0b\xad\x29\x72\xee\x07\xb7\x05\x9f\x48\xd2\xec\x99\x94\xfd\x9d\x5d\x8f\xf4\x52\x2b\x07\x1c\xf2\xb5\x25\xef\x46\xed\x88\x98\xd7\xe9\x85\x41\x84\x0a\x1d\x32\xc1\x61\x50\xe4\x2e\x45\xea\x4d\x36\xe9\x79\xb2\x45\xed\x10\xae\x8e\x97\x4f\x61\xe7\x13\xff\xcb\x1a\xd0\xd3\xcf\x05\x59\xf1\x76\xcb\xe8\xd0\xda\xf5\x2e\x12\x86\x44\x2d\x1a\xd3\xb8\x57\x49\x6e\x3d\xea\xd4\xc2\x7b\x0a\xad\xc2\x44\x08\x62\x7b\x0b\x83\x68\xbf\x25\xd5\xc4\x9b\xe9\x33\x0c\x2b\x51\x55\xc0\x0d\x53\x33\x6c\xee\x76\xe0\xc7\x51\x77\x40\x36\x8a\x59\x9c\x9d\xbd\x98\xcf\x33\x7c\xde\xd9\x30\x9d\x09\x94\x30\x45\xb6\x70\x4a\x52\x6c\xa8\xb3\x35\xb8\xdc\x3d\x36\x4c\xee\xdb\x0f\x45\xb3\x31\x60\xe6\x44\xf7\x1c\xa2\x9c\xc9\x65\x63\x5b\x6e\xa8\xcc\x5a\x3d\x50\x7c\x85\xbd\x3e\x21\x23\x70\xa1\x4e\x08\x09\xf1\x2b\x39\xb2\x71\x02\x05\x8a\x85\x8a\xc6\xa0\x70\xfa\x2b\x62\x3c\xc5\x1a\xec\xe3\x01\xb4\x56\xb5\x69\x6e\x53\xcf\x84\x74\x36\x8d\xd7\x27\x2a\x8a\x45\xc8\x74\x77\xdd\x76\x0b\xa9\xc3\x4b\x91\x1e\x49\x03\xf4\x53\x4b\x5f\xf4\x8a\x43\x16\x25\xe1\x22\x63\x3c\xa0\x89\x76\xe1\x93\xa9\x50\x9d\xb1\xc4\x4c\xf5\xca\xc9\xfb\x95\xa8\x0f\x4e\xd8\x12\xd0\xcd\x84\xf6\x00\xca\xc1\xbb\x7c\x08\x65\xee\xd9\x51\xd1\xa6\x04\xb3\xff\x02\xb6\xc4\xb7\x49\xe3\xe5\xfb\x45\xf2\x00\x14\xc8\x7c\xa0\xf0\xf8\x93\xad\x62\xaf\xcc\x95\x5b\xe6\x57\xb2\x10\x48\x85\x7c\x2a\x86\x62\x05\xf4\x70\x4a\xfc\x2a\x41\xd3\x85\x37\x46\xa6\x57\x0d\xa8\x49\x87\xec\x23\x2d\x6b\xa1\xa0\x4a\x60\x7f\x10\xb0\xb5\x22\x60\x06\x2b\xa1\xaa\x0c\x4c\x94\x0f\xee\x41\xdd\xd2\xbb\x55\xb7\x70\xb7\xea\x3a\xbb\x55\x60\x27\xea\x3a\x3b\xd1\xf5\xb6\x07\xe2\x01\xea\xc6\x97\x2a\x3d\xd1\xa5\x7e\x11\x0f\x73\x35\xa6\x1f\xe0\xf2\xe4\x7d\xa1\x97\x30\x8f\xde\x2a\xca\xba\x9d\x13\x95\x67\x1f\x4e\xf6\x80\x5d\xeb\x77\xbd\x4a\x97\x5b\x30\xba\x24\x04\x96\xbb\x18\x8d\xb2\x95\x2e\x43\xab\x81\x05\x45\x05\xe8\xa6\x92\x75\x8e\x97\x10\xaa\x64\xd3\x87\x30\xec\x94\xf2\x7a\x3f\xcd\x50\x77\x2c\x0d\x95\xe4\xbc\x51\x97\xec\x17\x9b\xcd\xa9\xa8\x1a\x8e\x1c\x68\x02\xca\xb5\x6a\xd1\x7f\x47\x5d\x05\x84\xbe\x4b\x5f\x8b\x9d\x5c\x70\x15\xca\xb8\x7c\x2b\x7e\x6d\xda\x4c\xcf\x2b\x93\xe0\xb6\x4c\x10\x0a\x03\x36\xe3\x68\x42\x2c\x7e\xe9\xa7\x34\x92\x43\x32\x6d\xff\x10\xb5\x6b\xe4\xe7\xdd\x68\xd8\x07\x16\xa9\xd3\x6f\x51\xa2\xbd\x69\xee\x40\xc3\x9b\x33\xd7\x16\x04\x39\x6e\xd0\x53\x6d\x03\xb6\x2d\x9a\xb8\x11\x1e\x0c\x44\x59\x32\x38\x27\x22\x58\x32\x08\x86\xbd\xd3\x6a\x55\x6e\x17\x01\xaf\xf4\xa9\xdd\xf2\xc1\xde\xa8\x49\x4e\x30\xa6\x6d\x95\x84\x51\x7a\x78\xb1\x89\xa5\xdf\x63\xb8\xa2\xc4\x48\xa3\x9e\x75\x07\xeb\x73\xbb\x64\x9f\xe9\x31\x5e\xbe\xef\x8d\x76\xff\x1a\xbd\x17\xb3\xed\xf6\x7f\xdf\xbe\xee\xd1\x55\xc6\x98\xb4\x6b\xd7\xe8\xf7\x88\xf6\xdb\x2e\x67\x76\xe7\xc1\x14\xef\xec\x32\x44\xdf\x71\x14\x87\x4d\xb8\xa1\xa5\x9e\xb7\x8a\x3b\xfe\x2a\xee\x84\x56\x31\xeb\x3a\x5d\xc9\x7a\x14\x75\xd8\xd2\xed\x7a\xb5\x17\xc4\x60\x42\xa4\xc7\xaa\x35\xa7\x47\x66\x4b\x3e\x92\x8a\x50\xd5\x8b\x3d\x4a\x1d\xa9\x9d\xbf\x05\x9b\xfd\xd1\x1e\xe5\xd9\x44\x42\x45\x62\x0e\x8f\x74\xb7\xc9\xb8\x99\x65\x8d\xa2\x11\x1b\x6b\x82\x61\xda\x6e\xfb\x07\x0c\xa0\x3d\x6a\xb1\x31\xc0\x1f\x56\xae\xe9\x77\x5b\xcc\xd0\x51\xbb\x95\x1d\xdd\xde\xab\x61\xac\x42\x0c\x4f\xd0\xcc\x63\x35\x38\xe8\x87\xbc\x91\xb0\xcd\xab\xf3\xa9\x1e\xf5\x5b\x3c\x9e\x2d\x2e\x07\x1e\xc7\x56\xae\x10\xb0\x9b\xe0\x2a\x24\xda\x9d\x14\xce\x3f\x84\xc1\xda\x72\x3d\x1a\x79\x4a\xba\x12\x11\xa0\x42\x46\x5b\xc4\xf8\xe0\xe8\x64\xd4\x2e\x1d\x0a\x75\xd8\xfb\xe6\x88\xe8\x9b\x23\xa2\x3f\x49\x28\xd4\xc3\xec\x6f\xf6\x37\xc0\x21\x65\xf2\x1c\x1f\xe5\x80\xcb\x60\xc3\xc6\x16\x47\xb2\x62\xf2\xf9\x48\x49\x77\x3c\xb4\xc8\x01\x81\x54\x7d\x17\x3b\xbb\x9d\xa6\x18\x0e\xde\x05\x92\xe6\x26\xb7\x6e\x2e\x86\x29\x8b\xf6\x3f\x8b\x37\x1f\x58\xb0\x7f\xeb\x1a\xb8\xd9\x1e\xb8\xf2\x00\xf3\x5b\x72\x4f\xec\xe3\xf1\x26\xcf\xab\x89\xcc\xad\x02\x91\x83\x21\x2d\xb7\xe1\x50\xd6\xb9\xe9\x6f\xc9\xbd\x65\x7a\x8e\x07\x87\x85\xcc\x69\xce\x7d\x32\xe0\x67\xde\x50\x63\x0f\xd3\x59\xfe\xd0\x4c\xa6\x63\x95\x12\x63\xd5\xb9\x66\x2e\xb9\x9d\xd7\x79\x7b\x54\x07\xe3\x75\x9f\x8b\xf8\x99\x1e\x32\x72\xb8\x38\xf3\x42\xd4\x2c\x0d\xd7\xee\xa5\x46\xc3\xbb\xca\x73\x7f\x65\x9e\x49\x2a\xd1\x80\x70\x27\xfb\xb0\x27\xba\x8f\x5a\x46\xfa\x5c\xb3\x0c\x5c\x0d\xb9\xfc\xd6\x9e\x76\x36\xc5\xb1\x71\x95\x1d\xb7\x0e\x7b\xcb\x5f\x80\xda\x41\x69\x6f\xc8\x32\xe1\xb6\x87\x27\x1e\xf5\xd6\x56\xb0\x47\x7c\x5a\x68\x1a\xe3\x27\xc9\x36\x6c\x48\x5a\xf6\x74\x17\x6f\x37\x67\x85\xee\x86\xfd\x5b\x0f\xdf\x83\xb9\x7c\xd3\xcd\xaf\x22\x5a\xee\x1d\x07\xb7\xf0\x08\x9a\x7d\x70\xe7\x0e\x15\xea\xcd\xdc\x7b\x02\x3e\x35\xde\xac\x3f\xeb\xc0\xa9\xbb\xdf\x71\x4a\x33\x98\xe2\x00\xad\x0c\x27\x9f\xa9\x1d\x96\x5e\x35\x2c\x9c\xbe\x5e\x48\xae\xb7\xfc\x72\xe4\x2e\x35\x71\xfa\xf4\xf9\x59\x85\xec\x0a\x3d\xa1\xaf\x74\x32\x3a\x9f\x56\xe9\x16\x04\x6e\x67\x26\xf6\x30\xda\xe2\x84\xa5\x04\xc5\x23\x13\x31\x4f\x94\x72\xba\x53\xa2\xa4\xb6\xf6\x31\x1e\xd8\x29\xce\x02\xbb\x23\xc5\x5f\xe1\xe6\x59\x22\x04\xdb\x35\xb6\x16\xfa\xce\x87\xae\xc4\xf2\x43\x6d\xd5\x34\x62\x4b\xef\x4f\x9d\xbd\x36\xa8\x56\xb1\xe0\x40\xd9\x08\x25\x34\x14\x4b\x0d\x05\x92\x82\xc3\xdd\x88\xd4\x0e\x4d\x0d\x0b\x10\x6e\x40\xd9\xfe\x81\x72\xc4\xff\x11\x6c\x66\x39\x96\xf1\x50\x86\xf4\x14\x28\xee\xe9\xd2\x16\xd5\x71\x53\x69\x71\x5b\xae\x01\x9b\xe5\x5a\x8c\x0e\x8a\x35\x52\x1b\x79\x75\x7d\xb1\xc8\xc4\x86\x45\xe4\xe9\x61\xbf\xa5\xf2\x1e\xdb\x47\xd3\x25\x19\x59\x52\xe2\x0f\xe2\x63\xd3\xe5\x32\xd9\x94\x70\x6f\xb8\x83\xdf\x55\xc6\xdb\x67\xe0\x65\x68\x97\x13\xc1\x2f\xc2\x0f\xe7\xb2\xbe\x7b\x59\x43\xbb\x3a\x32\x31\x1e\xe7\x19\xdb\x3b\xb1\x35\xc9\x09\xa2\x26\x0d\x3a\x53\x51\x43\xb5\xe6\xaa\xf2\x0e\xb5\xa1\xbe\xe9\x0e\x71\x9d\xa8\xa9\x1d\xf5\x75\x62\xb7\xad\xe5\xa9\xf7\x20\xcf\x1d\xd3\xb5\xf9\x3b\x18\x0d\x61\xcf\xc4\xaf\xd2\xbc\x9b\xe4\x2a\x8c\x15\x0a\xe7\xb6\xd4\x93\xc6\xdf\xf7\xe7\x98\xf6\xe6\xca\x82\x1c\x93\xf5\x4f\x02\xaa\x0f\x18\xe4\x5d\x62\x44\x8e\x19\x9a\x83\xb2\x68\x01\x33\x0b\x69\xfc\xbc\x8b\xeb\x52\x3d\x08\xef\x60\xbe\x79\xf9\x79\xfc\x09\x41\x41\x44\x1c\xf5\x3d\x03\x73\x0f\x93\xe6\x26\x4a\x0e\x01\x7f\x38\x1e\x26\xd9\x18\x5c\xcb\x20\x36\xbe\xb5\xeb\x1b\x53\xf3\xf4\x41\x96\xde\x6e\x46\x06\xc2\x26\x85\x38\x7f\x87\xdd\x08\x54\x74\x1d\x3e\xfc\x66\x58\x6d\xb3\x73\xea\x6e\xdf\x35\xdf\xa4\xd4\x5e\xcc\x93\x87\x8c\x7b\x42\x3c\xaa\x7b\x10\x09\x7e\xf6\xdc\xe1\x5a\xb5\xa9\xb0\x5b\xfc\xe9\x52\x54\xa0\x15\xb9\x35\x4d\xd2\x16\x87\xe5\x25\x81\xdf\xcd\xab\x03\x51\xf6\x81\xb6\x55\x55\x94\x46\x27\x85\xf9\x2c\x55\x5d\xa7\x84\x64\xf6\x2d\xcf\xab\x40\xf1\x25\x24\x69\x38\x97\x8b\x95\x0f\x43\x08\x24\x79\xc3\xfe\x1d\x4d\xf6\xab\xcf\xe0\x91\x3d\xae\x26\xb8\xb5\x31\x0c\x3a\x33\xcc\x71\xb2\x61\xd1\x51\x08\xb8\x4b\x83\x20\x17\x0a\x8a\xb4\xa7\xee\x8c\x7c\x8d\x37\x15\x3c\x88\x11\x10\x3c\x80\xd5\xd5\x10\x0f\x50\xf2\xe4\xe7\xad\xb0\x9f\xe0\x20\xc9\x8c\x43\x56\x47\xab\xe2\x45\xef\xdc\xa1\x83\xbe\x6b\x07\x78\xc2\x2a\xb1\xbc\xc4\x3e\x63\x89\xee\xd8\x96\xdd\xdb\x23\x71\xe2\x84\xae\x8f\x14\x61\xd4\x5d\xc6\x8b\xd2\x13\x3b\x11\xd9\x4d\x38\x3f\x2a\xc9\xb6\x84\xae\xc3\xf6\x23\x17\x28\xa6\xdc\xbf\xdd\x11\xe5\x9b\xf2\x5e\x50\xba\x9d\xb3\x10\xb8\x5b\x50\x00\x34\x22\x21\xe7\x9c\x7c\x22\x23\x2d\x33\xe3\x4f\x55\xe5\x63\x52\x96\xa3\x07\xca\x6a\x31\x7b\xbd\x5a\x5b\x15\xce\xf1\xb1\xe0\x2f\x37\xd1\x64\xb3\xba\xcc\xc0\x7b\x15\x7a\x4f\x14\x9c\x7b\x65\x1b\x65\x17\x6b\x10\x0e\x60\xae\x32\xd0\x6a\xa8\x37\x3d\xe8\x02\x66\xa1\xaf\x82\x56\x6b\xa3\x11\x47\xdb\x84\x88\x65\xa9\xd7\xd1\x8d\xa8\x53\xc3\x2b\xc2\x06\xb9\xf5\x35\x3d\x59\xc7\x1b\xd8\x3c\xb6\xac\x56\xe6\x95\xc3\x64\x18\x44\xe1\x78\xa5\x39\xc4\x6d\x0e\xb2\xc5\x3a\x15\xa0\xb4\x0e\x46\x60\xf8\xfa\x83\x6e\xd4\x96\xcc\x95\xe2\x08\x0f\xfd\x47\x0b\x71\x85\x22\xc3\xd1\x49\xbb\x3b\xcc\x11\xf4\x06\x07\x08\x7a\xde\xc0\x61\x7e\xa8\x08\x7b\x42\xdf\xbb\x4a\x83\x85\x86\x3c\xd3\xe5\xa3\x21\x82\x28\x06\x8a\xbe\x9e\x18\xe4\x6b\xeb\xd0\x89\x41\xa2\x9b\x13\x03\x79\xeb\xb3\xbe\x69\x63\x8d\x1d\x9d\x0c\x7b\x70\x75\x46\xab\x15\x69\x78\xeb\x46\x2b\x10\x69\x43\xc0\xc5\xf0\xcf\x26\xf4\x22\x84\x2f\x28\xb2\x82\x4e\xf6\x35\xa5\xe5\x87\xab\x73\x07\x5c\xfa\x84\x98\xad\xce\x35\xc8\xd3\xf3\xf3\x8b\x6d\x3c\x49\x17\x82\x8f\x78\x92\x2c\xdc\xf7\xcd\xba\x44\x4a\xc0\x1a\x67\x08\x67\xe4\x6b\x7e\xcf\x92\x4f\x2b\x0a\xbf\x84\x08\x4a\x4a\xb3\xa4\xc4\x8d\x48\xb3\x09\x68\xde\x35\x19\xe6\x7b\xec\xbf\xd9\xdb\x9b\x3d\x5d\xde\x3b\xd2\xaa\xf2\x72\x0b\x63\x89\xe2\xc5\x42\xec\xd5\xd1\x45\x06\x9e\x11\xd0\x5d\x97\x14\x98\xc0\x42\x2d\x48\x64\xa6\x8e\xd5\x12\x61\xe6\xe9\x26\x53\x4e\xbd\xa2\xd5\x1c\x93\x8c\xe8\x58\x17\x7c\x3e\xb8\xac\xc5\x54\xd0\x02\xc6\x0b\x53\x5c\x35\x33\x8f\xb3\x6d\xa2\x23\x16\x9e\xc5\x6a\xe9\x67\x8e\x2b\x7d\x38\x90\xff\x91\xd0\x58\x93\x1b\x0d\xf7\xe6\xad\x2b\x65\x5f\x5f\xc5\xaf\x63\x78\x58\x2d\xbf\x4a\xd9\x25\x0a\x9a\xea\xd1\x81\x8c\xae\x1e\x7f\x90\xf3\xd9\x8c\x12\x6d\x1a\xa5\x7b\x1a\x93\x76\xdb\x91\xd6\x08\xd0\x46\x43\x38\x20\x7a\xf1\x07\x3c\x6e\xda\x7a\xdd\x08\xf2\xa5\x2f\x05\xf6\x77\xf7\x5c\x18\x07\x95\x4b\xac\xde\x4d\x42\xc8\x33\xb4\xca\x72\x25\xda\xc8\x19\x7e\xa1\xcf\xbe\x10\x29\x07\x1e\xe2\xf1\x8b\x01\x62\x78\x2c\x91\xa8\x7e\x07\x1f\x7a\x95\x8d\x89\x68\xf1\x5a\xce\x2b\xe7\x3e\x7e\x3e\xf7\xf3\xe1\xb9\x9f\x67\xce\xdd\xbe\x39\x5d\x29\x9d\x21\x99\xf9\x1a\x24\x8c\x71\xe6\xb8\x35\xcb\xa4\xcb\x30\x21\xea\x29\xca\xc5\xda\xff\x9e\x2c\xc1\xef\x8b\x75\xe0\xc4\x17\x08\x71\xda\xc4\x17\xc9\xf1\xf1\x43\xf4\xd9\x7d\x06\xbb\x90\x58\x10\x97\x89\x38\x81\x65\x1b\x90\x12\xcb\x8d\xab\x91\x80\xa3\xcc\xc6\x7b\xdd\x08\xd5\x32\x1c\x1f\x5f\x8a\x9e\x27\x62\xd5\x7e\xc4\x9d\x0c\x99\x03\x17\x32\x23\xb2\x5a\x61\xb7\x23\x6e\x1e\xd3\x92\xe6\x31\xaa\x12\xc7\x38\xc6\xe0\x1d\xea\x55\x20\x6f\xd2\xb7\xe6\x8d\x0e\xaf\x5f\x8b\x85\x6a\xad\x50\x02\x3d\x3e\xbe\x37\x9b\x89\xb1\x2a\xf5\xcf\x76\x85\xfb\xb1\xc6\x1e\x9a\x1b\xde\x22\x44\x2e\xfa\xe5\x1f\xe4\xd2\x71\x91\x82\xa8\x07\x89\x9d\x9e\xdd\xf6\xf9\xf0\x87\xe4\x8a\x39\xd5\x52\x5b\xb9\x7d\x20\x87\xeb\x8e\x3a\x42\xa3\x47\xaa\xaf\xa4\x92\x56\xfb\x09\x68\xa6\x7e\x27\x3e\xec\xdd\x68\xba\x4c\x4d\x11\x7a\xb8\xb4\xe2\x2e\x42\x39\x3a\x4f\x72\xa8\x4f\xde\x15\x5a\xa1\xd0\xf3\xb1\x47\x4f\x30\xea\x3a\xc1\x1c\x60\x3e\x26\xc0\x3c\xd8\x3b\xd5\x28\x59\x51\xb5\x44\xc2\x5c\xe6\x89\x5f\xec\x54\x53\x52\xf2\xab\xc2\x75\x91\xdf\x79\xd3\x7a\x60\xfa\xb3\xb3\x74\xbe\xad\xf2\x06\x6a\x5e\xf7\xfe\x38\x37\xa1\x7a\x64\x72\xaf\x40\x66\xe1\x00\xd7\x9d\xcc\x60\x02\xb1\x19\xae\x63\xb7\x67\xcd\x12\x35\x1d\xe6\xc5\x51\x0f\x11\xbd\x88\x85\xeb\x2c\xf6\xa3\x58\xd8\x33\xbe\xac\x82\x5a\x53\xb3\xe0\xfc\xcb\xef\xdf\x3f\xdf\x2e\xa3\xac\xa8\x51\xa8\x27\x3b\xb5\x13\x89\x0a\x95\x91\xaf\x9f\x30\xd6\xce\x42\x26\x51\x10\x42\xdc\x27\xcd\xa4\x99\x1c\xfe\x47\xe9\x59\x5c\x39\xf1\x14\x4b\xe2\x2f\x7f\xb1\x3f\xf4\x76\x6b\x4a\xad\xe3\xf7\xc9\x3f\x41\xfd\x45\x4b\xdf\xb5\x05\xde\xb4\xc4\xe6\x8b\x30\x27\x22\x11\xbf\xf1\xc2\xbf\x96\x28\xfc\xab\x29\x4c\x9e\xf5\xe0\x7b\x8a\x64\xf3\x4f\xd4\x5f\x40\x03\x0d\x35\x46\x7c\xaf\xe9\xc1\xfd\xaa\xe0\x7e\xb5\x70\x82\xad\x22\xd6\x06\xab\xf5\x33\x51\xee\x61\x1a\xdb\x67\xaf\x42\xe0\x9f\x42\x42\x55\xb7\x55\x37\xb5\xd5\x58\xc9\x57\x30\x1b\xe1\xa2\x7a\x66\x1a\x51\x61\x25\x93\xd5\x76\xcf\x4a\x0c\x59\x34\x72\xea\x2b\x33\x9c\xe2\x4a\xe4\xe6\x26\x95\xe1\x54\xb7\x45\x70\x55\x67\xc3\xaf\xb3\x71\xd4\x69\x2f\xbc\x6a\x95\x4f\x19\xd6\x86\x7a\xab\xae\x7c\xe3\xc3\x96\x76\xc7\xce\x73\x83\xc1\x32\xfc\x5b\xb0\x5f\x3d\xb0\x5b\xe6\xc8\xb4\xca\x2b\xd2\x03\xaa\xc2\x92\x50\x5a\xd3\x57\x08\x24\x1b\xdd\x32\x4d\x96\xce\x53\x1d\xc7\x0f\x9d\x4b\xb9\x5e\x23\xf8\xa8\x0d\x45\xcf\x0b\xdd\x4a\xcc\x5c\xc5\x02\x8b\x8e\x4c\x8a\xf3\x90\xfd\x7f\x62\x8f\x8b\x05\xc6\x62\xd1\xc6\x44\x7c\x4e\x8a\x6d\x22\x88\x0c\x5f\x52\x9b\x66\x54\x15\xe0\xb0\xb2\x47\x92\x02\xba\x08\x00\x19\xd6\xc3\x1a\xa3\xa0\xa2\x6c\xf4\xcd\xb2\xfa\x9b\x65\xf5\x1f\x18\xe2\x55\x90\xcd\xe3\x34\x59\xcc\x78\x19\x70\x0f\xd2\x98\x43\xba\xd1\xd8\x89\x82\xc0\x6a\x3d\x4f\x96\x17\x1c\x76\x26\x72\x1a\x33\x91\xd5\x10\x54\x71\x61\xb4\x69\x32\x74\x8d\xae\xbb\x8c\x36\x8d\x94\xf8\xa3\x43\x8e\x26\xe0\xe0\x13\x70\xb1\x23\x90\xe4\x62\x15\x83\xac\x87\xf1\x62\x76\x83\x67\x76\x40\xaf\x30\x36\x58\x11\x30\x28\x5c\x36\xf0\xc0\xa4\x84\xad\x4a\xd9\x90\x9d\x38\xac\x12\x70\x42\xa2\xdd\xee\x1e\x4e\x1a\x08\x5b\x4a\xf3\xcf\x2f\x16\xdb\x14\x9e\x85\x17\xe9\x2e\x57\xcb\xfb\x8b\x8b\x80\xf2\x92\xc6\x3f\xd5\x41\xd8\x8b\x60\x94\x0f\xed\x22\x10\x21\x0f\xed\x0e\xef\x8a\xc6\xce\x25\x20\x61\x59\x17\x0f\x1f\xee\xa9\x8a\xad\x87\xd2\xe5\xfa\x62\x5b\x62\x3a\x20\x3c\x78\x09\x30\x46\x8d\x25\xe0\xe1\xfa\xa7\x20\x0c\xaa\x9a\x44\xb1\x86\x9f\x6e\x93\xf3\xc0\x50\x62\xe5\x89\x97\x7b\xe0\xd4\x05\x4a\x74\x40\x87\xfa\x57\x3e\x4f\xbe\xf4\xc3\x02\x12\xf6\x15\x65\x3a\x29\x61\xde\xbe\xb5\x7f\xd0\xc0\x4c\xeb\x36\x8d\x74\xeb\x84\xfa\xd3\x5a\xcd\xde\x20\xa8\xba\x0c\xc4\x37\xcb\xd1\x77\xa2\x46\xb3\x4d\x6a\xb1\x31\xcf\xd4\xeb\x87\xc2\x90\x6a\xd2\xed\xcb\x33\x57\x0d\x8a\xb5\xf6\x72\x1a\x77\x6b\x05\xea\x63\xb1\xba\xa0\x70\xa7\x45\xf5\x97\x38\x56\x2f\x26\x97\xd9\xc1\x58\x28\x2e\xb4\x1b\x79\x0d\x75\x84\xdd\x39\xe0\xa2\xa0\xfa\x17\xdc\xb4\x20\x41\xcf\x97\xd5\x87\x11\x95\x8b\xb7\x15\xd7\x7c\xa3\x2f\x09\xa9\x37\xb7\x9a\x1b\x81\x47\x86\xd9\x51\x1c\x6b\xc3\xbc\xca\x8d\x78\x58\x26\x99\xdd\xf6\x72\x01\x4d\x3a\x73\x68\x54\x65\xdc\xfc\x2c\xd8\xd0\xc8\xd1\xab\xf1\x22\xaa\x00\x22\x41\x2c\xcb\xed\x16\x6f\xca\xcc\xa3\xe1\xcf\x3e\xc3\xbc\x67\x1c\xb2\x8c\xe9\xe9\x59\xf4\x2d\x0d\x52\x6c\xd3\x56\x78\x59\x61\x4f\xa6\x88\x47\x2a\x73\x2c\x9c\xcc\x16\x67\xc1\x4c\x92\x85\xe2\x67\xa2\x05\xe5\xe9\x44\xda\x37\xe7\x9d\x85\xb5\x69\x64\x0c\xfc\x60\x26\xa3\xe1\x19\xb6\x84\xd9\x16\x2d\xac\x49\xb2\x50\x65\xc2\xb8\x79\x84\x6b\x81\xbd\xac\x9c\x52\xce\x08\xfd\x3c\x72\x3f\xa4\x88\xdf\x42\xeb\x14\x52\xb7\x09\x28\x6a\xab\xd4\x49\x0e\x6e\x79\x55\x26\xe9\xb0\x37\x27\xf2\x7d\x89\x8e\x1d\x77\xaa\x7f\x19\x3a\x80\x1f\x7c\xa6\xd1\x6d\x93\x99\x4f\x19\x62\x8e\x4d\x18\x24\x99\x79\x81\x1f\x34\x44\x9d\x87\x5e\x2f\xd1\x54\xab\x91\x84\x10\x1a\x17\xa6\x75\xcc\x61\xef\x62\xb6\x9a\x8d\x7e\xa9\x56\x0e\x5b\xce\x85\x91\x9b\x70\xff\xd3\xb7\x51\x7a\x0f\x0c\x30\x9a\x5e\x52\x10\x56\xab\xde\xbc\x34\x63\xf2\x67\x58\xbd\xef\x0c\x6d\x40\xf0\x10\x9f\x2c\xef\xa2\x47\x96\x13\x53\xa2\x1e\x38\x56\xf5\x57\xb6\x77\xcb\xea\xcd\x57\x96\x77\xba\x13\x1f\x08\x56\x27\xd0\x35\x7b\x6e\xab\x55\x46\x44\x11\x17\xdf\x84\x7d\x31\x5f\x75\x07\xf2\x43\x91\xed\x9e\x25\x19\x90\xcd\xa1\xb6\x1a\x3b\x88\x77\x0f\x4d\x05\x20\x21\x51\x47\xe8\x99\xbb\xbb\x3c\x40\xd5\x2d\x6c\xcd\x3b\x78\x77\x57\x61\x40\x4d\x61\xc2\x15\x32\x2e\x89\x9e\x33\x05\xd7\x91\x46\x80\x34\x97\x1f\x6c\x29\xe8\xd4\x50\x0d\x54\xa4\x74\xde\x58\x79\x53\xac\x9e\x5d\xd5\xa8\xf3\xe6\x1c\x85\x0e\x11\x23\xb5\xb9\x0e\x17\x51\xe1\x15\xfb\xce\x18\x27\x56\x02\x3e\x3a\x69\xb7\xbd\x07\xf0\xe3\x6f\x6a\x9a\x6f\x6a\x9a\x3f\x4e\x4d\xf3\x70\x13\xbf\x7f\xef\x96\xc1\x9a\x1b\x33\x9d\xd5\xd9\xf5\x5a\xa8\xe0\xb1\x10\x7f\xc8\x43\x8a\xa8\x6b\x3c\xc7\x64\x4e\xcc\xe4\xf1\xf7\xdf\x8b\x35\xf8\x7d\xf4\x73\xb2\x49\xc5\x32\xc9\x20\x56\xf9\xf1\x79\xfc\x29\xda\x80\xec\xde\xc4\xbc\xff\xbd\x8e\x37\xf1\xb9\x58\xaf\xbf\x4b\xcc\x7f\x96\xe6\xec\x91\xfe\x63\xa7\x5d\x5b\xfb\x48\xec\x59\x77\xb4\x4e\x35\xa7\x28\x6e\xcb\x6a\x40\x69\x24\xab\xc1\x6f\xaa\x82\xb5\x9a\x4b\xb8\xfa\xc3\x60\x2d\x70\x5d\x99\x53\x8b\x69\x06\x2b\xa0\xb5\x98\x9c\xe8\xf2\x6c\x95\x91\x5a\xd3\x2c\x9a\x24\x70\x75\xaf\xeb\x9e\xa9\xca\x25\x31\x64\x76\xa4\xaf\x54\x42\xbc\x8c\x30\x7a\x0c\x50\xa0\x40\x11\x10\x26\x60\x09\x77\xb3\xcb\x54\xd4\x0d\x16\xeb\x58\xc9\x31\xce\x84\x80\x79\x1e\x7f\xd2\x42\xb1\x98\x0c\xb3\x64\x78\x4e\x55\xb1\x51\x1a\x15\x75\x3e\x1c\xc9\xf1\x1b\xbe\xcd\x68\xe0\x5c\x69\x7b\x57\x35\xb0\xd1\xe2\x95\x29\xd6\x02\x86\xb2\xe8\x83\x46\x13\x3f\x26\xe3\x59\x01\x40\x8a\x2f\x96\xa3\x54\x3f\xe2\x4f\xcc\x0a\x19\xe0\x9f\x67\xef\xd5\xcb\x06\xc4\x39\x3a\xc4\x14\x85\xc0\x6b\x27\x7c\xc2\x83\x92\x8b\xc5\x4c\x20\x3a\x5a\x40\x5c\xec\xed\x99\xc0\xa1\xa8\x07\x78\x91\x0a\xe0\xce\xe6\xbf\xc7\xf3\x64\xa3\x40\x44\x15\xb7\xe9\xa9\x05\xd1\x7b\x64\xe4\x1e\xdd\xac\x3e\x37\x42\xf4\x8b\x41\x94\x60\x82\x2f\x53\xb0\xf0\x40\x3a\xf8\x46\xd3\x3b\x69\x1a\xaa\x36\xa8\x83\x80\xf6\x04\x7d\x88\xb6\x7c\x52\xc7\x62\x4f\x97\xaf\x00\x2a\x44\xf0\xa1\xfc\x3f\x1b\xd9\x9b\x71\xe8\xb7\x3a\x6f\x74\x95\x6f\x75\x1d\x32\xfb\xaf\x91\x5d\x1d\xe2\xac\x37\xab\x43\x64\xc8\xf0\x5d\x5c\x87\x65\x69\xd7\xd0\x05\x78\x48\xb4\xa4\xef\xa1\x39\x5b\x27\x53\xa0\x64\x91\x7b\x85\x3b\x4d\xbc\x9c\xe1\xb2\x21\x44\x8f\x47\x90\x98\xe4\x64\x53\x56\x25\x8f\xc0\x7f\xb4\x36\x7e\x19\x87\x4a\x49\x5d\xab\xa7\x7f\x54\x4e\xdb\xf1\xed\xf9\x49\x90\x66\x34\x5c\x36\x15\xe7\x97\xd4\xc8\x15\xe9\x71\xad\x98\x90\xaf\x25\x55\x3a\xaa\x42\x6d\x78\xfc\xe9\xc4\xd9\xb3\x55\x06\xf8\x55\x0c\x65\xa8\x63\xb7\xb0\x61\xf0\x3b\x58\xac\x64\xbe\x29\x05\x3b\xb0\x1c\xca\xc0\x64\x37\xd8\x2a\xd0\xa9\xbd\xb4\xf5\x1f\xf3\xa7\xef\xd6\x8d\x29\x84\x39\xa9\xb4\x7c\xb9\x90\xd9\x09\xe3\x04\x1a\x6b\x2a\x9c\x35\x6b\x31\x6c\xa6\x8a\x1a\x66\xc9\xc9\x69\x35\x5b\x6d\x2b\xb2\x1e\x6a\x66\x4d\x37\x16\xa2\xcc\xc4\x24\x6b\x92\xab\x20\xee\x10\x7b\x5d\x6a\x9b\xeb\x15\xa7\x18\xa0\xcf\x58\xd0\x1e\x44\xba\x1d\x15\x05\x54\xb5\x0d\x5a\x52\x8c\xbf\x16\x1d\x33\xc5\x2a\xec\x5e\x1e\x8c\xed\x5b\x9a\xfd\x18\xff\x58\x55\xb5\x0a\x7e\xda\xd6\xdf\xe2\xd2\xa5\xee\xaf\xa0\x8d\x14\x2d\xa3\xe8\x2c\x20\x7b\x8b\x3e\xcd\x59\xf2\x5c\xc6\x3d\x75\x52\x79\xa4\x60\xf3\xe6\x55\x36\x7c\xa2\xbf\xd4\x29\x7e\x14\xcd\xb9\x13\xc6\xfc\xd7\xbc\x4a\xa6\x89\xe8\x99\x4b\x75\xb9\x30\x55\xb0\xc6\xc3\x6f\xf4\x75\x9f\x49\x94\x93\x88\xa7\x4a\x60\xd6\xb4\x39\x1d\xce\x91\x5b\xc8\x7b\xa2\x1c\x88\xfd\x70\x68\xe8\x87\x0c\xf7\xfa\x43\xae\x47\xc0\x83\xed\xdf\x2f\xb6\xd2\x8d\xa8\x56\x2b\xab\x3e\x34\xa5\x05\xd9\xa9\x7a\xe8\xe4\xeb\x4a\x73\x0b\x0a\x31\x65\xfa\x41\x59\x99\xe4\x57\xfa\x50\xab\x5c\x59\xe5\xd2\x4a\x44\xe6\x9c\x82\x71\xa6\xeb\x8c\xdd\x68\x6a\x41\xcb\xd5\x40\x8f\xb6\x4e\x87\xa4\x81\x0a\xf0\x9c\x95\xdb\xbe\xf2\x3c\xef\x22\x08\x0d\xb4\x1e\xc0\x43\x08\xb8\xd4\x90\x37\x1e\xf6\xe6\x44\x90\xec\x46\xaa\x27\xfc\xbc\xe9\xc5\x26\x83\x33\xc5\x44\x21\xb1\x59\xcc\xeb\x7f\x10\x0b\xf7\x70\xe9\x94\xbd\x7b\x3a\x17\x22\x6b\xba\xc4\x3b\x99\x4e\xcf\x4d\xbe\x8f\x77\x0e\x27\x51\x6f\xa4\x32\x3e\x93\x07\xba\xd3\x0f\xdc\x73\xef\x4e\xe3\xfc\xea\xae\x3e\xeb\x1d\x24\x34\xf1\x35\x1a\xfd\x22\x60\xdd\x9f\x73\x87\x96\x87\x2e\x53\xaf\x3b\x30\xa0\xdf\x64\x76\x6f\x39\x7b\x95\x9c\xc7\xe9\x12\x77\x9b\xbd\x46\xd9\xf2\x1b\xf7\x2e\xf6\x76\xbc\x6e\x56\x31\x8e\xe4\x1c\x98\xf0\x46\xa6\x8b\x12\x6d\xfc\x62\xed\x93\x18\x0b\xf6\xb5\x22\x2f\xd9\x1a\x22\xa9\xf4\xd3\x09\x43\x6e\xca\x3e\x8c\x15\xc4\x14\xb4\x3a\xcc\xf0\xad\xb3\x60\xe0\xd3\xed\xcd\x4f\xad\xe7\x35\x5a\xce\x70\x85\x21\x4e\x47\xc8\x68\xbb\x84\x5a\x30\xc1\xb6\xf2\x08\xc2\x15\xb5\xfc\x7b\xd7\xfc\xbe\xef\xb3\xec\x2c\xac\xf7\xb4\xdd\x2d\x24\x55\xc7\x62\x3a\x1c\x0f\xdd\xa4\xe0\x22\x5d\x63\xac\x2d\xbc\xc3\x75\x26\x53\xce\x30\xe0\x46\x8c\x49\x4c\x66\x3a\x8b\x68\xec\x67\x17\x30\xf8\x4e\x3f\x27\xc0\x47\xb5\x21\x80\xea\x11\xfc\xeb\xb9\x02\x2f\x20\xd8\x4a\x0f\x5d\xfa\x0a\x9a\xb5\x43\xd8\xe5\x65\xca\x16\x91\x04\x2b\xbd\x8e\x95\x2d\x84\x53\x57\x1a\x5a\xce\x1e\x8d\x1e\x47\x1e\x03\x7d\x4c\xb3\x14\xd4\x6b\xe1\x65\xf6\xcb\x59\xb2\x7c\x68\x98\xc2\xf0\x92\xc3\x83\x74\xb9\x75\xa6\xc9\xac\x2a\x21\x09\x37\xf0\x39\x5c\x42\x23\x23\xec\xa4\x12\xa4\x60\x87\x42\x76\x52\xec\x43\xe7\x36\xa3\x0c\xe5\xfa\x65\x0c\x85\x05\x6f\xe9\x2d\x62\x5e\x4a\x26\xea\x5f\xc9\x66\xe5\xdf\xf3\x17\xad\x49\xb9\x1e\x25\xed\x56\x72\xcf\x74\x1c\x3c\x54\xbe\x07\xd6\x64\xc9\xc7\x62\x17\x77\x17\x97\x98\xb0\xb3\x78\x86\x53\x5e\x7e\x58\xe2\x20\x08\xcd\xfe\x8e\xb9\xfd\xa2\xd3\x54\xb6\xdf\x8f\x35\x5b\x7c\x93\x13\x63\x89\xf2\x54\x19\xf0\xe4\x77\xe7\x9e\xe2\xe1\x7f\x2f\x8f\x17\x97\x77\x29\xcb\xed\xb8\x9d\xd8\xa8\x77\xb3\xbe\x55\x4e\x99\x0d\x7c\x8f\x73\xa1\xc4\x3e\x22\xfb\x52\xb0\x5c\x64\x44\xa6\xdc\x39\x71\x8f\xc4\x7c\xc8\x70\xcb\x4f\xc1\x99\x43\x08\x15\x95\x6e\xf8\xd9\x65\x37\x60\x86\xe4\x35\x1a\x42\x46\x4e\xff\x2c\xa8\xee\xa0\x95\xb0\x8c\x91\x8b\xe4\xbb\x72\x9e\x8c\x32\x18\xca\x9b\xd9\xe7\x60\x0e\x43\x18\xde\x27\x3c\x7e\x3f\x9f\xbc\xa3\xb2\xc7\xb6\x64\x40\x5e\x49\x94\x5a\xe9\x47\x67\x6b\xa4\x82\x14\x52\x35\x2b\x4a\x3e\x9d\xd2\x52\xf0\xf7\x18\xd7\x43\x2c\xbd\xff\xc6\x68\x1a\x01\x79\x45\xe4\xd5\x54\x44\xaa\x1a\x43\xdb\x46\x63\xe2\x70\xcc\x69\x13\xae\x62\xd4\x15\x1e\x4c\x12\x07\xd2\xd4\xac\x04\x0a\xaa\x6d\xcd\x0e\x32\x3c\xd4\xf6\x46\x04\x15\x69\x0f\xb1\x7f\x42\x75\x74\x56\x64\xa1\x62\xc9\xa6\x1e\xbd\x61\x66\x1e\x56\x85\xe1\x8f\xc4\x2a\x3e\x34\xd4\xdf\x20\x92\x84\x2d\xd2\xbe\x6d\xc2\x4d\xe8\xc4\xbf\xc2\x25\xa5\xaf\x17\x29\x69\xa6\x25\x05\xf6\xc2\x77\xd7\xcc\x7a\x81\xba\x59\x53\x6f\x9f\x75\x55\x6a\xb9\xea\xaa\x4c\x97\xe0\x7d\x9c\x5e\x32\xe1\xaa\x65\xc9\x7a\xc4\x7e\x3a\x1b\x5f\x9d\xa2\x4b\x6a\x79\xc0\xe6\xc4\x2b\xa2\x4e\x02\x0a\xad\xf4\x3c\x00\xfe\x7b\x24\xa6\x49\x9a\x17\xca\xc3\x1c\x1e\x71\x57\x09\xac\xd2\xfe\x98\xc0\x57\xac\x86\x1a\x5a\xb9\x84\x76\x84\x50\x4f\x82\xa7\x6a\x3d\xb8\xa1\xec\x2e\xae\xe9\xb9\x16\x15\x9a\x66\x68\x4c\x7e\x31\x5c\x95\xed\xbd\xe9\xaf\xf7\x32\x49\xd9\x9d\x15\x51\x9a\x7a\xb1\xcb\x29\xc8\xb6\x12\x3c\x18\x69\x43\x7a\xaf\x32\xb4\xe8\x6e\x7a\x76\x9d\x5d\x7f\xee\xad\xd6\xcd\x69\xb7\xe9\x6c\x88\x79\xea\x29\xc6\x15\x31\x0b\x4d\x82\xb5\xb3\xd5\xe5\x83\xd5\x72\x96\x2a\xf7\x99\x87\x74\x9b\x92\x83\x3b\x2b\xac\x83\xfc\x90\x61\xeb\x37\x9f\xd5\x0e\x9c\x7b\xa4\x6a\x62\x28\xc8\xac\x04\x02\x1e\x22\xf2\xd6\x57\x20\x9d\x58\x1c\xd0\xf7\xec\x79\xfe\x44\xb5\xcd\x10\x29\x46\xa3\x4a\x4b\xa7\x6c\x73\xe6\x5c\x54\xe7\xe1\xa3\xf1\x9c\x3c\x65\xf8\x45\xc8\xdb\xe6\x51\xc7\xa1\x8c\x7a\x91\xb9\x22\x75\xa0\x4f\xd0\xc0\x5c\x13\xb1\x50\x1e\xaa\x74\xbe\x3e\x33\x37\x52\x7b\xba\x7d\xf0\xfd\x51\x67\xc4\x21\xb5\xbb\xcf\x8b\xb6\x8a\xcc\xb0\x2a\xd9\x3a\x5e\xa2\x6b\xbb\x29\xdc\x02\xaa\x9b\xbf\xf3\x8b\xb4\x81\xa6\x89\x8d\x33\xc1\x2b\x2c\x50\x96\xbe\x66\x45\x93\x78\xb3\xab\x0a\x83\x31\x55\x97\xf9\x9d\x57\x27\xb9\xd5\xab\x50\x1f\x1b\xec\xce\xc3\x80\xa8\xec\x9b\xed\x02\xde\x05\xe6\x35\x8e\x99\xfb\x35\xeb\x46\xde\x57\xb3\x4a\x4f\x7b\x9b\x4d\x2e\xd7\xe4\x5b\x56\xf5\x93\x43\xc8\x1b\x41\x0d\x00\xbf\x78\xbe\xe7\x12\x84\x24\x05\x20\x55\xf0\x00\x06\x8a\x69\x01\x58\xe6\x3c\x84\xa6\x05\x60\xad\xf3\x12\x93\x40\xd1\x5a\x88\x36\x0f\x71\x91\xf1\xd5\x88\x3b\xb5\xf5\xd2\xa8\xd6\x32\xa6\xf2\x20\xe7\x85\x7e\x1f\x79\x69\x25\xba\x7c\xae\xed\x5b\xde\x3d\xe0\x76\xd7\x40\xb2\x23\x6b\x08\x56\x67\xc9\xbf\x47\xf1\xa7\x14\xf4\x7d\xe0\xe7\x6e\x02\xc7\x96\xd6\xec\x3a\x61\xfb\xc5\x5e\x14\x2f\xa7\xc9\x22\x4f\x38\xaa\x7c\x5f\x51\x6e\x5a\xdd\x72\xca\xb7\xca\xef\xd1\x27\x73\x91\xc6\x78\xf7\xcf\x5e\x43\xab\x65\x26\x90\x6c\x14\xb5\xef\x4c\x42\xb5\xe6\xc2\x82\x45\x2b\x71\x1b\x43\x6e\x9f\x43\x90\xab\xb5\x0b\xb8\x5a\xfb\x70\x90\xc3\xe1\xa4\xeb\x61\x1f\xb2\x88\xfc\xff\xb1\x5c\x4d\xdc\xb1\xed\x9c\xa5\x00\x31\xca\x59\x52\x44\x40\xd9\x6d\xc1\x97\xc5\x13\xa5\xe3\x6e\xf9\x58\x24\xe7\x16\xcb\xa9\xdd\x0a\x7d\xaf\x95\xd9\x6a\x2a\xb8\x6f\x31\x67\xa6\xf2\xb7\x7c\xe3\xa6\x3d\x25\xd9\x9e\x48\x7b\x0c\x42\x30\x90\x60\xb3\xd5\x3d\x2a\xe1\x3f\x30\xa5\x4e\x4e\x67\x73\x5b\x6e\xeb\xd8\x30\x2b\x0e\xf8\x73\x9e\xf2\xb0\xce\xe2\x37\xd5\xf9\x7f\xe2\x99\xf1\x27\x7a\x8c\x27\x6b\xe7\xdc\x4b\xc4\xd6\x41\x8d\x85\xf5\x95\xa6\xba\xfc\xa7\x37\x9a\xf2\xa6\x35\x74\x5b\x4a\x46\x63\x2b\xc9\xfc\x4a\xcc\x75\x6d\x6a\xfd\x90\xa0\x28\x7b\x01\x0a\xf6\xc8\x06\xf4\x0c\x48\x92\xd5\xf4\x8b\x5e\xb4\xab\xce\x5c\x20\xe9\x47\x38\x20\x4c\x0b\x7b\x6d\x51\x53\x99\xe6\x5d\x9d\x13\x75\x84\xc1\xe8\x4b\x0d\x43\x71\xaa\x12\x0b\xb0\x4a\xc4\x66\x83\x57\xbf\x2a\x9b\x68\x06\x98\x67\x20\xf1\x2e\x16\x5c\x8a\x8c\x41\xa1\x5d\xa9\xca\x12\xaf\x57\x32\xd1\x60\xe8\x76\x08\x03\xcc\x1c\xa0\xee\x8d\x9c\x8d\x1a\x7d\x88\xbb\x44\x60\x13\xb9\x9b\x14\x43\x1c\x81\x09\xd4\x71\x42\x4c\xcf\x59\xa8\x10\x3b\x1e\xd1\xa9\xf2\x4e\xc7\x65\x88\xd2\x77\x76\x25\x90\x67\x4c\x29\x71\x44\x77\x9e\x52\xcf\xbf\xa2\x89\xe7\xab\x99\x8e\x6f\x2a\x7e\x09\x92\x43\x5a\xfc\xef\x88\xd7\x61\xbb\x25\x00\x25\x9c\x2d\x4b\x5e\xeb\xa1\x37\x86\x78\x92\x55\x6d\x6e\x0d\x83\x8b\xfe\xed\x0e\x8b\xd0\x1a\xd1\x1a\x7f\xb8\x43\x3b\xf2\x37\x94\x5e\x70\x40\x27\x51\xc3\x76\x83\xbf\x82\x43\x2f\xad\x8f\xe1\xfd\x4a\xd5\xd6\xd4\xdc\xae\x1e\x63\xc4\xbd\x3e\x8b\xc8\x42\x0e\x25\xe2\x53\xc2\x1e\x4c\xbb\x63\x13\x49\xe4\x75\x72\x90\x4f\x11\xdc\x91\x18\x36\x59\xf1\x27\x9a\x15\x7f\xca\x99\xb2\x8e\x9a\x33\x3a\x44\xfb\x34\x60\xbd\x72\xbc\xef\xad\xc5\x28\x17\xcf\xb1\x6e\xdf\x63\x8e\x0c\x71\x84\xfe\x7d\x91\xdf\xa9\x35\xa7\x8b\x14\x2d\x56\xcc\xdb\x2e\x52\x8b\x9a\x7c\x53\xa3\xd8\x85\xaa\x72\xef\x51\x9b\x12\x4e\x9b\xf1\x98\xa7\xbc\x44\x65\x28\x7d\x9a\xa1\xaa\xf7\x7d\xbe\x80\xa8\xdc\x95\x11\x57\x65\x7e\xe5\x9e\xbb\x32\x65\x29\xb2\x05\xa6\x05\x9d\x99\x64\xd2\x8b\x48\x43\xb5\x7c\x9b\x41\x82\xb5\xcc\x43\x0b\xad\x3a\xf7\x03\x19\x5d\xc3\x54\x61\x4b\x32\x62\xd5\x8d\xd5\x04\xf1\x99\x44\x5a\x2f\x0b\x62\x19\x99\x36\xee\xd8\x46\x6c\xcd\xde\x73\xd0\x28\x9a\x88\xa3\xf8\x03\x81\xb8\xa5\x3f\x8d\x22\x82\xd9\x44\x69\x25\xb7\x6c\x46\x03\xab\x55\x40\xe8\xda\x48\x01\xe4\x85\x85\x4c\x72\x7d\x40\xd9\x0d\xcf\xd8\x50\x81\x0d\x9b\x11\x48\x9d\xd7\xb3\xaa\x96\x5a\xe4\xa7\x55\x99\x0f\x29\x2d\x65\xd0\x0e\x40\x4a\x89\xf6\xa5\xb5\x16\xb7\xff\xca\xef\x0f\x54\xea\x74\x47\xb5\xc3\x7a\x13\xf4\x1b\x46\x92\x6d\xbf\xf2\x34\x17\xaa\x91\x77\x82\x62\xd0\xef\x93\x5c\x3a\xff\xf4\x5b\x71\x83\xa9\xb1\x74\xef\x30\xd0\xc3\x37\xc6\x6a\x04\xfd\xbc\x5e\xcf\x53\x18\x4d\xdf\x5d\x2f\xc5\x23\xaf\x98\xbb\x31\x33\x89\xa5\x51\x42\x5a\xcb\x9f\x34\xaa\xb9\xd2\x56\x7c\xa0\x0c\x32\xab\xca\x62\xb7\x61\xb1\x5b\x13\xfb\x42\xdf\xd9\xe1\x38\xfe\x05\x74\x5e\xf0\x26\xc1\x78\xdc\x07\xe1\x47\xb4\xf4\x00\x81\x5f\x25\x53\xc1\x83\xb0\xf5\x2e\x5b\x85\x0e\xfd\x13\x5c\xa1\xc1\x7e\xca\x0e\x15\x3a\xe7\x6c\x07\xf3\x29\x0b\x64\x83\x1c\xea\x82\xac\x80\x6f\xff\xb2\xd8\x0c\x91\x04\x31\xc8\xa5\x4d\x9a\x64\x18\xcd\x45\x9a\x43\x15\x6a\xf0\xd6\x9a\x92\xda\xad\xd2\x56\x09\x87\x17\x58\x7b\xa6\x31\x67\x01\xba\x9d\x08\x74\x7c\xb5\x0e\xf5\x7b\xb5\xde\xaf\xdb\xcc\xb0\x93\xd1\x5e\x99\x8e\xaf\xd6\xc1\x7e\x9b\x4e\x78\xdd\xf6\x22\xd9\xb0\x74\xde\xf5\x3c\x9a\xe7\xee\x34\x77\x6d\x36\x86\x30\x2f\xd2\xa6\xb6\xe0\x42\xfa\xa5\x9d\x43\x20\xda\x2b\x46\xce\x84\x87\x39\xcf\xe1\x0b\x76\xb3\x05\x78\x4d\x25\x16\x81\xbc\xa2\xc2\xd5\xd0\x22\x17\x58\x22\xe1\x6f\x11\x3e\xee\x91\x79\x86\x9d\xd1\xb9\xa0\x7a\x76\xa5\x9a\xdf\xf9\x19\x27\x07\x2c\x25\x13\xb8\x85\x93\x56\xe9\x68\x76\x06\x43\x69\x31\x0d\xe9\x0e\x60\x68\xf2\x18\x3b\x44\xd0\x14\x84\xa6\x68\xcb\xaf\x8e\xcb\x1a\x86\x9c\x7c\xf5\xba\x81\xa4\x93\xac\xa9\xd8\x15\x5d\x6e\xdf\x8c\xe4\xe2\x51\xb7\xec\xbd\x43\xdb\x32\x11\x46\x63\x4d\x87\x75\x3c\x12\x56\x3d\x0b\x4b\x12\x6e\x98\x4b\x71\x56\xfd\xb3\x53\x4a\xd5\x97\xdf\x44\xe2\x28\xf0\xc5\x76\xaa\x4c\x90\x4b\x84\xb3\x0e\x3d\x4c\xd4\x4e\xf7\xf3\xa2\x17\xd8\x27\xbc\xea\x3b\x79\x3c\x79\x74\xd2\xee\xc3\xcb\xde\x51\xeb\xdb\xcb\xde\x6f\x2f\x7b\xf7\x7f\xd9\xfb\x20\xcb\xb4\x87\x50\xf2\x7c\x56\xfa\x05\x9c\x66\x99\xf4\x0a\x7d\x6d\x6f\x6d\xfb\xbf\xec\x7d\x00\xae\x6f\xef\x5d\xc6\x57\xb9\x4d\x49\xaf\xd5\xb1\x02\x31\x2f\x82\x17\xf1\xf6\xbe\xf2\x92\xcb\x62\x67\x88\xf4\x86\x74\x9f\x6b\x5d\xbd\x2d\xc5\x19\x32\x89\x4b\x3f\x2a\x53\xe0\x45\xcf\xca\xea\xbc\xe3\xf2\x95\xd9\x79\xbc\xbc\x10\x13\x79\x75\x3f\x45\x6b\x59\x99\xad\x59\x99\x5b\xa8\xe7\x7a\xfa\x50\xbf\x77\x54\x77\xe7\x10\x69\x67\xd3\x44\x25\xcb\xc5\x76\xf5\x44\xec\x2f\x10\x6e\x67\xf3\x54\xf0\xc7\x86\xbb\xfb\x02\x4f\xd8\xce\x93\x2c\x8b\x43\x4f\xac\x72\x5e\xb1\xc5\xd3\xdd\x0f\xd3\xf4\x00\x74\x44\xa0\x5d\xef\xc0\xee\x61\x9d\xe8\xdf\xf2\x75\xbc\xe3\x81\xd6\x69\x30\xb0\x21\x7b\xe8\x95\x66\xe7\x69\x56\xec\x72\x6d\x9d\x2c\x5f\x2c\x55\x30\xc2\x5d\x41\x12\xaf\x17\x76\x02\x9a\x72\x5c\x70\x9b\xb6\x71\xc7\x0d\x39\xfc\xba\x91\x90\x89\xa4\xa1\x40\xa0\xc2\x7b\x94\xc8\xdc\x58\x85\x13\x4a\xb7\x05\x21\x14\x09\x6d\xfb\xfd\x23\x15\x50\x9e\x79\x26\xa7\x27\x2f\xde\x77\x99\x90\x8c\xeb\x4d\xf2\xf1\xa5\x7e\x17\x9b\x7c\x44\xfc\xef\x50\x88\xc9\x57\xdf\x0a\x16\x51\x83\xcf\x9a\x08\xaf\x04\x69\x01\xd7\x5c\xa1\xcc\x22\x34\x1a\x90\xe3\xe3\x17\xe0\xe0\x1b\xb6\x00\xe9\xd6\x1b\x36\xae\x28\x9e\xe3\x33\x70\xb3\xfd\x45\x62\x5d\xa7\xd9\x99\x09\xb2\x10\x99\xfd\x59\x30\x46\x76\x17\x05\x97\xd6\x39\xb2\x64\x3d\x0a\x85\xe5\x85\x3f\xef\x0a\x26\x93\xca\x20\x01\xf5\x8f\x62\x62\x97\x39\x65\x3f\xe7\x11\x04\x3c\x30\xfb\x69\x79\x9e\x47\xb2\x24\xdb\x09\xdb\x8e\x3a\xe9\x20\x4d\x16\x74\xe5\xe6\x5f\x96\xa9\x0d\x9f\x55\xae\xac\xfb\x9c\xc7\x65\x32\xb1\x5c\x03\x99\x04\xe6\xb5\xde\x90\x43\xbf\x69\x8e\x19\xa4\xe8\x40\xfe\x03\x8e\x70\x19\x07\x20\xef\xa9\x06\x79\xe8\xa4\x9e\x80\xa8\xd7\x1e\xd4\x24\xdb\xe0\x07\xac\x1a\x3e\x08\xc1\x95\x3d\x56\xcb\xb7\xa1\xf6\xca\x9d\x5e\x4c\xce\x92\x58\x34\x2f\xdd\x5c\x13\x7b\x5e\x71\x20\x3e\xd9\xb3\xb4\xd7\xbc\xe0\xf3\x95\x4b\xa1\x8e\xe0\xbb\x6d\x72\xfc\x49\x25\xf7\x07\xa3\xba\x5d\xd3\xe4\xa5\xd2\x1c\x74\xf6\xa1\xd7\x3f\x2d\x8a\x37\xf9\x42\x6d\x07\x52\xdc\xf7\x42\xd2\x54\x75\x67\x21\x8b\x09\x2f\x98\x8c\x8e\xfc\x40\xd2\xd0\x00\x1c\x1d\x3e\x87\x2e\x4e\x83\xef\x6d\xba\xb3\x6a\xab\x1e\x75\xc4\xd4\x82\x8c\xbb\xcf\x8b\x1b\xf5\xb2\x05\x3a\x06\x9f\xbd\x16\x24\xec\x7a\x0f\xd3\x52\xa5\x4a\x06\x82\x37\xf0\x24\x8c\x61\xc9\x12\x16\x17\xfe\xfb\x35\xcd\xdf\xec\x5c\x61\x71\xe8\x91\x14\x3a\x27\x83\xb7\x8c\x68\x86\xe4\x4e\x2c\x3e\x64\x1c\xb8\xa9\xca\x3a\xbb\xd1\xf6\x72\x4a\x12\x82\x21\x37\x77\x81\x57\xe8\xcb\x2b\x77\xa0\xb0\x91\x80\x79\xe3\x0b\x64\x50\x7e\xf7\x89\xa7\x9d\x43\x3c\xfa\x29\x41\x29\xea\x69\x5d\x93\x74\x0e\x21\x9c\x3d\x8b\xb1\xf0\xf7\xfb\x14\x24\x64\xa4\x4b\xf2\xf3\xf1\xfa\x36\xe0\x85\xf7\xa7\x92\x02\xed\x35\xa9\xfc\x4d\xee\xf1\x24\x6b\x4f\x1d\x41\x62\x82\x85\x70\x59\x6f\x0b\xea\xe6\xdc\xe6\x27\x92\xe7\x56\xd3\x56\xb9\xd3\x6a\xdd\xfa\x55\x94\x1d\x96\xae\x10\xb1\x67\x38\x8b\x4e\xcb\xe8\x3c\x11\xdd\x1d\x32\x0b\xf7\x02\xb3\x73\x03\xb3\xf1\x82\x52\x5b\x6e\x8e\x19\x8b\xab\xb2\xdc\x85\x9e\xfd\xa1\x97\x89\x76\x7e\xc8\xcc\xa3\x73\xcb\xd2\x9e\xc8\x91\x1a\x31\x35\x60\x91\x2a\x21\x6a\xcc\xc7\x00\x29\x11\x34\x31\x35\x92\x6f\xdd\x75\xe4\x6a\xcc\xbf\x64\x35\xe4\xd4\x94\x9e\x78\xdd\x64\x2a\x7d\x79\x44\xf1\x79\xef\xc8\x5f\xcc\x20\xb1\xd8\x06\x94\xcc\xd1\x81\x16\x97\xdc\x06\x4c\x51\x92\xfa\x5d\xab\x07\xd0\x89\x49\x34\x18\x17\x8a\x94\xd6\x92\x43\xfc\xcc\xbd\xb3\x52\xe2\x5c\xe1\x3d\xe4\x29\x86\x86\xf7\x92\x28\xcf\x3a\xd3\x32\xaa\x69\xd5\x88\x45\xfb\xb0\xc5\x5e\xc7\x76\xdc\x48\x2a\xd1\xd8\xbd\x5b\xf0\x25\xb2\x40\xc3\xcc\x0e\x21\xd0\x2d\x57\x08\x75\xd5\x18\x85\x6e\x24\x3c\xe0\x3b\xa1\xf0\xf7\x0e\x90\x27\x97\x7a\x02\x99\x13\x71\x38\xdc\x63\x23\x31\x76\x7c\x91\x91\xe0\xc9\x55\x6a\x80\xcd\x87\x3b\x8a\xfc\xe9\xca\x1f\x27\x89\xab\x1c\x16\xe4\x64\xdf\xb8\xdc\x8c\xe3\x66\x0f\x25\xdc\xee\x51\xe4\xe4\x6a\xb1\x8d\xb8\x23\xf5\xd8\x44\x65\x76\x74\xd2\xeb\x12\xd7\x93\x5c\xf5\x76\x74\x32\xe8\xec\xf4\x4b\x99\xa7\xdb\xf6\x74\x8d\x10\x79\xa4\xe3\xb8\xad\x1c\xb5\x0f\x54\x6e\xa7\xd9\x7d\x19\x86\x19\xe6\xf2\x6a\x9d\xac\xe6\xd1\xa5\x10\x1c\x57\x97\x48\x7e\x15\x43\x7f\x15\xa9\x3c\x7c\x2e\xc4\xe8\xcd\x32\xfd\x0d\xc0\x6d\xd1\xbb\x81\xf0\xad\xe7\x1a\xb2\x39\xbd\xc8\xb6\x10\xfd\x35\x3a\x61\xb1\xbe\x8f\x8f\xff\x91\x24\x6b\xe9\x7b\x02\x54\x7b\xf1\x42\x8c\x68\x76\x15\xc9\x30\xc6\xc9\x0c\x35\xca\x51\xb6\x8a\x2e\x13\x30\x6d\x8d\xb2\x0f\xe9\x9a\xb4\x2f\xc1\x04\x7f\x87\xfd\xd2\x85\xfe\x01\x65\x64\xc8\xa9\x50\x94\xe1\x5b\x60\x92\xb4\x20\x54\x8e\x4a\x72\x44\x3c\xa5\x6e\x5d\x9b\x7e\x16\xa3\x23\x58\x79\x1a\x79\x56\x32\xe2\xe5\xde\xc8\x1d\x47\xc6\x0e\x07\x05\xfc\x5b\xf3\xe6\x45\xaa\xdc\x0d\xbd\xd9\xeb\x17\x5a\x9e\xec\xb7\x89\x63\x38\x27\xbb\x8c\x3a\xf7\x3a\x77\x32\x96\xe5\xb6\xec\xda\x3a\x62\x2e\xad\xd6\x82\x4b\x44\x81\x46\xe6\xa9\x98\x16\x1d\xa7\x3b\x9a\xad\x92\x0c\x62\x74\x27\x9f\xd2\x0c\xc2\x7c\xe3\xb4\x88\xdf\xb2\xd7\xe8\xb7\x8c\xcc\x4f\xb6\x52\x75\xfc\x8f\x98\x7e\x2b\xee\x27\xd0\x69\xb3\x5d\x7c\x67\x68\xc8\x78\x60\x13\xd9\x26\x2a\xe3\x83\xb3\x44\xd0\x86\x0c\xc8\xf8\x31\xb1\x94\x81\xea\x2a\x98\x83\x49\x22\xa6\x44\x20\x82\xb6\x91\x6e\xa9\x02\xcb\x50\x85\x73\x71\x50\x95\x57\x22\x0e\xe2\x01\x50\x4d\x8e\xea\x02\x84\xde\x13\x25\x61\x9c\x93\x24\xb1\x90\xd1\x55\xb2\xad\x87\x87\xce\xc8\x08\xca\xdf\xb1\x79\x4d\x5d\x1e\xdb\x37\xad\x44\xbf\xe0\x9a\xcb\xa2\x61\xf4\x58\x2c\xa3\xf9\xea\x13\x34\x0a\xee\xf8\xc4\x0e\x76\x21\x7d\xc2\x21\xf2\xd2\xf3\xb5\x3c\xde\xe5\x96\x2a\x96\x8d\x5f\xb5\xae\x13\xdc\xc4\x09\x3c\x4d\xe3\xb5\x18\x23\x98\x68\x54\xf0\xb4\xab\x44\x71\x86\x75\x3d\x38\x3d\xb5\xbe\x02\xc1\xf0\x57\x90\x74\xb6\x15\x6b\x50\x2b\xda\x97\xab\x65\xc3\x8c\xf7\xa3\x60\x43\xe0\xc6\x9a\x21\x17\x47\x27\xf6\x09\x19\x59\x2f\x34\x85\xa7\x31\xa8\xea\xe5\xb4\x43\x14\x32\x5c\x43\x18\x11\xf8\x42\xc0\x26\xd8\x49\x42\x1c\x74\xf1\xdf\xa2\x4b\xca\xcc\x0c\xba\xe3\xc3\x96\x6f\xbb\x4b\x47\xa5\x51\x02\x7f\x72\xb5\x16\xbc\x68\x32\xf3\x08\x5d\x67\x68\x82\xd7\x73\x26\x76\x47\xc3\xfb\xda\x15\xc1\x05\x93\xef\x00\xe8\x2e\x8e\x08\xf8\xc6\x4d\x73\x93\xac\x17\xf1\x34\xa9\x1e\x57\xdf\xdc\x6b\xfc\xeb\x6d\xed\xf8\x3d\x55\x32\x0a\x88\x7a\x74\xde\xf6\x6e\xc9\x2b\x0d\x10\x99\xce\xdb\xcd\xed\xea\xd9\xea\x32\xd9\x3c\x10\x02\x93\xd1\x1d\xd7\x6c\xa5\xff\xef\x79\xd6\x38\x16\x4c\x7d\x43\x7c\x56\x4c\xc8\x2b\x13\xd2\x2a\xbc\xdd\xc2\xad\x67\x1b\x0e\x86\x4e\x99\x83\x41\x50\xcb\xeb\x95\x98\xfe\xe9\xe2\x62\x96\xc8\xe5\x35\x87\x70\xa6\x62\x8f\xbb\x5a\x5d\x00\x25\xaf\x40\x36\x39\x01\xc0\x45\xb2\x85\xeb\x13\x7a\x79\x24\x7e\x42\xc7\x54\x26\x0a\xd3\x68\x3a\x70\x91\x36\xd5\xab\x3b\x99\x26\xd0\xb8\x3b\x12\x3c\x4a\x7a\xb3\x7e\x4b\xc8\xc6\xff\x35\x9f\x27\x62\xd5\x21\xef\x2a\xd2\xda\x2d\x95\x38\x9d\xcd\x3a\x3a\xb1\x23\x13\x93\xf9\x38\x1e\xc7\x3a\xb1\xab\x12\xfb\xc3\xee\xb0\xab\x13\x7b\x1a\xb2\xdf\xed\xb7\x74\x62\x5f\xd5\xd9\xeb\x75\xbb\x03\x9d\x38\xd0\xc5\xbb\xe3\x6e\x5f\x27\x0e\x65\xe2\xac\xdb\x99\x77\xe6\x3a\x71\x24\x13\xa7\x83\xce\xa8\x33\xd2\x89\x63\x99\x38\x19\xb6\xa7\xed\xa9\x4e\xbc\x67\x7a\x3f\x8a\x47\xa6\xf9\x7b\x1d\x9d\xda\xef\xf4\xcd\x98\xee\xf5\x74\x6a\x7b\xd8\xeb\x99\x54\xdd\x03\xd1\xe7\x56\x4b\xde\xb1\xad\xd3\xe5\x07\x85\xaa\x69\xd2\x4b\x64\x6b\x90\xa8\x5b\x1b\x4d\x26\xb3\x96\x49\xd5\xad\xf5\x46\xf3\x49\xdb\xa4\x2a\x6c\xcd\x5b\x83\xce\xb8\x63\x52\x35\xba\xa6\xbd\xd6\x30\x36\xa9\x0a\x5f\xc9\xb8\x9d\x0c\xba\x26\x55\x21\x6c\x36\x6a\x4f\x06\xb6\x35\xd5\xdf\x69\xa7\x3d\xea\x4f\x4c\xaa\x42\x59\x3c\x6b\xf7\xfa\x43\x93\xaa\x70\x36\x1a\xb5\x92\xde\xdc\xa4\x12\xa4\xb5\x62\x5b\x85\xc5\x5a\xaf\x35\xb2\xe3\x30\x68\x13\x9d\x24\x55\x6b\xbc\x4d\xfb\xed\xf6\xa0\xa3\xf0\x76\xb1\x11\x1b\xa9\xc2\x5c\x37\xe9\xcf\xe5\x34\xcb\x64\xd5\x68\xd2\x16\xb4\x37\x24\xe9\xaa\xd5\x69\x32\xee\xce\x46\x24\x5d\xe1\x6f\x12\x0f\x46\x53\x9a\xae\xba\x13\x4f\x7a\xc3\xc9\x94\xa4\x2b\x1c\x8e\xa7\x9d\xe1\xa4\x45\xd2\x15\x16\x47\x49\xa7\x17\xc7\x24\x5d\xf5\x7f\x38\x69\xcf\xe3\x0e\x49\x57\x98\x1c\xc4\xed\xc9\x98\xc2\x2b\x5c\xf6\xe2\x76\x6f\x44\xdb\xd5\xd8\x4c\x04\x01\xce\x59\x86\x5e\x44\xad\x5e\x6b\x3e\xa1\x19\x3d\x4b\x72\xf3\x31\xcd\x50\x7d\x8a\x63\x91\x31\x97\x38\x9d\x09\x76\xee\x25\xc1\x6b\x32\x4b\x86\x73\xb9\xa6\x6c\x96\xea\xc2\xac\x3d\xed\x25\x63\x27\x4f\xf5\x62\xd2\x1d\xcf\x66\x13\x27\x4f\xe1\x78\xdc\x1f\xf6\xa7\x33\x27\x4f\x75\x72\x28\x96\xfb\xb4\xe3\xe4\x29\x5c\x0f\x86\xdd\x78\x32\x74\xf2\x14\xbe\xfb\x49\xb7\xaf\x56\x83\xcd\x53\xe3\xeb\xb7\x3b\xb3\x78\xe4\xe4\x29\xbc\xf7\xfa\x9d\x61\xdc\x72\xf2\x14\xee\xbb\x6d\x31\x27\x6e\x5f\x34\xfe\x27\xdd\xd1\x68\x3e\x77\x33\xd5\xe8\x87\xd3\xde\xcc\xcf\x54\x43\x1c\xf4\xdb\x73\x3f\x53\xf5\x75\x20\x6a\x48\x62\x39\x17\x82\x9d\x48\xdf\xaf\xd4\x3c\x8c\x92\x58\xcd\x83\x4c\x6e\xeb\xf5\x30\x8d\xd5\x1c\xc8\x74\xd5\x83\xf1\x3c\x1e\xcd\x62\x92\xae\x70\x3f\x1c\x8f\x06\xd3\x09\x49\x57\x9d\xea\x4f\x07\x93\x69\x8b\xa4\x2b\x9c\x77\xe7\xfd\xf6\xa4\x4f\xd2\x15\xbe\xbb\xe3\xde\x38\xa6\xf5\xa8\xfe\x77\x5b\xdd\xf9\x78\x4e\xd2\x15\x9e\x3b\xa3\x6e\x7f\xdc\x25\xe9\x0a\xc7\xed\xb8\xd3\x1d\x26\x24\x5d\xe3\x77\x34\x1d\x27\x73\x5a\x91\xc6\x6d\xbf\x3b\x98\xcd\x59\x09\x35\x84\xee\xac\x1f\xf3\x0c\xd3\xa7\xde\x1c\x33\x44\xce\x44\x30\xd0\x0a\xa3\x5d\x71\x04\x48\x2a\x84\x44\x3d\xad\x13\x21\xdc\x4c\x4c\xaa\xc6\x66\x6b\x1a\xab\xa5\x03\xa9\x0a\x97\x83\xde\xa4\xaf\xe6\x04\x52\x55\x37\x7a\x9d\x58\xef\x44\xb2\x31\x39\xfe\xf6\x78\x30\xef\x9a\x54\x85\xc5\x76\x32\x1a\x25\x16\x56\xf5\xb7\x3d\x1e\x0e\xd4\xd9\x08\xa9\x0a\x83\xed\xfe\xa0\xaf\x66\x08\x52\x15\xfe\x5a\xb3\xde\x30\x6e\x9b\x54\x83\xbd\x8e\xd8\x67\xe6\x36\x59\x8d\xa3\xd7\x1b\xc5\x34\x59\x75\xb9\x33\x1e\x8e\x69\xf2\x50\x27\x0f\x3a\x7a\x5f\xc0\x27\xc6\xf7\x2d\xf2\xda\xf3\xbe\xc2\xb5\xc9\x31\x0b\x43\xec\xc4\x53\x9e\xa5\x9a\x1f\xb5\x67\xbd\x79\xcc\xb3\x14\x2e\x7b\xf3\x69\x77\x3e\xe4\x59\xa6\x77\x93\x81\x42\x33\xe9\x85\x1c\x7d\x37\x1e\xcf\x7b\x3c\x6b\xa0\xb3\xc6\x13\x85\x5a\x93\xa5\xc6\xd5\xea\x8c\x46\xb3\x36\xcf\x1a\xe9\xac\xe1\x70\x32\xe3\x59\x1a\xd3\xed\xfe\x70\x3c\xe1\x59\x06\xdd\xad\x99\xde\x0c\x6c\x9e\xc6\x79\x6b\xda\xf3\xf2\xd4\xd0\x5a\xad\x49\xcb\xcb\xd3\xbd\x6c\x89\xe3\x59\xed\x04\xd3\xab\x78\xa9\x10\xdf\x9a\x0f\x15\x0a\x21\x51\xe3\xbc\x93\x4c\xe6\x1d\x93\xda\x31\xbd\x4a\x12\x0b\xab\x31\x3d\x9b\xb5\x92\xb6\x49\xd5\x48\x1e\x4c\x07\x33\x0b\xdb\x37\xfd\x9b\xce\x7a\x26\x55\xa3\xb6\x15\x4f\xa7\xb6\x06\xdb\xdf\x61\x3c\x34\xa9\x1a\xa1\xad\x51\x77\x34\x37\xa9\x1a\x97\xad\x41\x6b\x60\xeb\x35\x68\x14\x88\x9a\x5b\x60\x8d\xc1\xf6\x88\x27\x1b\xe4\x09\x42\x23\xc9\xa6\x1f\x93\x11\xf6\xf9\x16\x44\x3b\x89\x17\x06\x6f\x9d\xb9\xec\x33\x24\x1a\xbc\xcd\xe6\xea\x94\x82\x54\x83\xb7\xe9\x64\xda\x33\xa9\x06\x6f\x93\x41\x3c\x35\xa9\x06\x6f\xf1\x40\x9d\xdb\xb2\x31\x8d\x8b\xc1\x68\x64\x52\x0d\xde\x46\xe3\xa1\x6d\xcd\xf4\x77\x38\x1e\xd8\x54\x83\xb7\xc1\xb8\x6f\x5b\x33\x78\xeb\x09\x0e\xd8\xa4\x6a\xbc\xc5\x43\xe0\xb1\x6d\x72\x47\xef\x4f\xf3\xf9\xcc\xf6\x4d\xe3\xad\x3d\x4b\xc4\x8a\xb2\xc9\x16\x6f\xf3\xb8\x2f\xf1\xf6\x7e\x23\xc4\x64\x7d\xf0\xcc\xfb\xea\x80\xc1\x54\x7d\xee\x8c\x92\xc1\x94\x24\xab\x26\xe3\xfe\x6c\xa0\x88\x00\x93\xbb\x7a\xe1\x4f\x87\xa3\x9e\x4d\xd6\x27\xe1\x60\x22\x70\x6a\x93\x15\xf6\x7a\x62\xb3\x55\xcc\x3d\x26\x2b\xf4\xf5\xba\x71\xab\x47\xea\xd6\xbb\xbb\xd8\x42\xbb\x53\x9b\xac\x0f\x9c\x64\x28\xb8\x7c\x9b\xac\xcf\x9b\x49\x5f\xec\x46\x36\xd9\x1c\xe7\xe3\xf9\x60\x4a\xba\x62\x70\x38\x9e\xb7\xe2\x84\xa4\x5b\xe2\x1b\x0c\x07\x24\xdd\x60\x71\x3a\xea\x77\xc9\x9e\xf9\x77\x8b\xca\x79\x7b\x3e\x52\xa8\xb4\x59\x9a\x97\x9a\x26\x33\xc5\x77\xda\x3c\xcd\xab\xf6\x93\x76\xdc\x77\xf2\x14\x66\x63\x21\xfd\x8c\xda\x4e\x5e\x4f\xf3\xa6\xd3\xe9\xc0\x2d\xa7\x70\x3c\x9a\x4c\xbb\xbd\xd8\xc9\x1b\x68\xee\x65\xd2\xed\x75\x9c\x3c\xcd\x9f\x8c\xc6\xf3\xae\xdb\x4f\x85\xf2\x7e\x7f\x34\xe9\xcc\x9d\x3c\xcd\x4b\x75\x07\x62\x3b\x73\xf2\x34\xf2\xa7\xd3\xf9\x7c\xdc\x72\x33\x35\x27\x29\xce\xa0\xbe\x8b\x35\x3d\x0d\xc3\xc1\x7c\xde\xea\xba\x99\xba\xaf\x62\xab\x6b\x0f\xf5\x5c\x9c\x6b\x49\x61\x3c\x9f\x24\xfa\xa4\x39\xd7\xa7\xd6\xbc\x35\xef\x4d\xbb\x26\x55\xf3\xd2\x83\x24\x19\x4f\x4d\x6a\xd7\xcc\xd5\x70\xd8\x37\xa9\x9a\xbd\xee\x25\xed\xbe\xad\x57\xe1\x59\x48\xb9\xd3\xee\xd8\xa4\x2a\x0c\x4f\x05\x3f\xd1\xb5\xad\x69\x3e\x7c\x3e\xe9\x75\x26\x26\x55\x61\x75\x9c\x8c\x67\x9d\x9e\x49\xd5\x32\x96\x38\xa8\xda\xb6\x35\x23\x63\x89\x25\x6f\xc8\xe1\xdc\xca\x04\x82\x95\xea\x91\x64\xd5\xe5\x29\x60\xaf\x65\x93\x75\x3f\xc4\xa9\xa1\x65\xd3\xab\x04\x5c\x29\x6a\x41\x7e\x3e\x53\x98\x93\xc9\x46\xb0\x9b\x8f\xd5\x7e\x29\xd3\x8d\x64\x27\x26\x6e\x46\xd2\xbb\x26\xbd\xad\xd6\x8e\x4c\x37\x92\x72\x92\xf4\x47\x24\xbd\x6f\xd2\x27\xdd\x09\x49\x57\x58\x9c\xcf\x66\x23\x25\xda\xcb\x74\xd5\xff\xb9\xe0\x64\x3b\xb4\x5d\x85\xc9\xf9\x38\x1e\x75\x28\xbc\xc2\xe5\xbc\x3f\x9c\xb7\xe9\xb8\xac\xc4\x2a\xb0\x49\x2b\xb2\x32\xab\x41\x9c\xca\xb0\x43\x88\x79\x86\xee\xd3\x1c\x14\x12\x12\xa7\x31\x98\x81\x1a\x94\x8e\xd4\x61\x8c\xa9\xa6\xe1\x44\xac\x41\x9b\x6c\x9a\x4d\x5a\xa3\x8e\x4d\x36\xf8\x9c\xf5\x95\xbc\x8d\xc9\xa6\x2f\xd3\x58\xe9\x33\x54\x8b\x3a\xb9\xdd\x1a\xda\x64\x8d\xcc\xf9\xa4\xab\x7a\x8e\xc9\xa6\xdf\x71\x8b\x26\x6b\x54\xce\x47\x73\x9a\xac\x31\x39\x1f\xb0\x64\x8b\x48\x21\xd6\x91\x1e\x5a\x3c\xce\x86\x3d\x0a\x6f\xbb\xde\x63\xf5\xd8\xde\x4c\x34\x16\x57\x18\x58\xc3\xa0\xb1\x9b\x48\x78\x99\x6c\xdb\x6d\x4d\x3a\x24\xdd\xb4\x3b\x9d\x8e\x28\xbc\xc1\xe4\x64\xd8\x9b\x91\x74\xd3\x9f\x78\xd8\x19\x90\x74\x83\xcb\xf1\xa8\x45\xeb\xd1\xc8\x9c\x8c\xa6\x2c\x7d\x68\x28\x8d\xa7\x2b\x74\x26\xe2\xf0\x61\xe9\x63\xbd\xff\xf4\xdb\x2c\xdd\x22\x74\xd6\x66\x03\xb0\x18\x8d\x27\x3d\x96\x61\x86\x30\x76\xaa\x32\x38\x1d\xcc\x34\x4e\x41\x1e\x7d\x41\xf1\x3a\x49\xc6\x89\x95\xb8\x5f\x70\xdc\x4e\xa7\x4a\x23\x62\xf3\x48\x2f\xc6\x6d\x27\xcf\xe0\x78\x14\xab\x53\xc9\xe6\x99\x4e\x0e\x5b\xbd\xae\x93\x67\x70\xdd\x1f\x76\x3a\x4e\x9e\xc6\x77\xaf\xdf\x56\xa7\x8b\xcd\x1b\x6a\x1c\xf6\xe2\xf6\xd8\xc9\x53\x78\x9f\x8d\x7a\xdd\xb6\xdb\x17\xad\xf9\x9b\x77\x07\x2d\x77\x7c\x16\xff\xe3\x64\xd4\x72\x33\xcd\xe8\x07\x49\xcf\xcb\x34\x43\xec\xce\x5a\x5e\xa6\xd6\x0a\xce\x3a\x53\x3d\x17\x70\x63\xa3\x79\x30\xd0\xa0\x2a\xf1\x13\x52\x35\xcf\x30\x14\x07\xfc\xc8\x26\xeb\x03\x73\x1a\xc7\x71\xcf\x26\x6b\x4e\xa1\x3d\x1a\xa9\x35\x88\xc9\xaa\x3f\xa3\xd9\x40\x2b\x01\x55\x8b\xf2\x60\x1d\xf7\xfb\x3d\x52\xb7\x42\xf4\x60\xd6\x9b\xaa\x83\x04\x93\xb5\x86\x45\x70\xa5\xdd\xa1\x4d\xd6\xca\x95\x44\xf0\x11\x89\x4d\xd6\xbc\x40\xd2\x19\x76\x14\x8f\x04\xf2\xa6\x38\xb4\xaf\xd4\x40\xa7\xe2\xa0\xb2\xd2\x2c\x64\x68\x16\x61\x3e\x1b\xcd\xa6\x2c\x47\x0f\xb7\x35\x49\xa6\x7d\x96\xa3\xf5\x4c\xad\xb8\xa7\x78\x37\x9d\xa3\xd9\x86\xd1\xb8\x35\xe6\xb5\x69\x1d\x53\x6b\x38\x1b\x4d\x58\x8e\xd6\x30\xf5\x06\x89\xd2\xa1\xea\x1c\x35\xfa\x5e\xbf\x1f\x2b\x69\x46\xe7\x28\x04\x74\x87\xbd\x61\x6f\xce\x72\xc6\x5a\x6e\xe8\x76\x90\x8f\x92\x0c\xa4\x1a\xff\x3c\x86\xbf\x9a\xab\xd4\x63\x17\xa2\xb6\xd6\x28\xbc\xb7\xe3\x4e\xf0\x8f\x49\xd5\xda\xf2\x16\xfc\x35\xa9\x6a\xbc\x93\x19\xfc\x35\xa9\x7d\xc3\x59\x88\xbf\x26\x55\x73\x7f\x7d\xf8\x6b\x52\x35\x2f\xd5\x86\xbf\x26\x55\x4f\x70\x07\xfe\x9a\x54\x3d\xb6\x36\xfc\xd5\xf3\x8b\x51\x09\x80\x31\x6e\xe9\x83\xe4\xf2\x2c\x05\x63\x77\x79\x8c\x6a\x05\x03\xb1\xda\x13\x59\x9b\xf7\x93\x58\x5b\xd2\x19\x63\x3a\x88\x67\x7a\x5f\xd5\xc7\x01\xda\x12\x60\x16\x6f\x3e\x84\x01\x5a\xcd\xd1\xb0\x66\xd9\xc4\x3c\xa0\x7e\x4f\x02\x9d\xa7\xcb\x3c\x90\xce\x40\x75\x26\x4e\x97\xb9\xf5\xb4\x3b\xb6\xc7\xbf\xa8\xd1\x22\x4c\xa7\xdf\xaf\x47\xf6\x1f\xd2\xef\x22\x30\xa7\xf7\xc5\xa0\x30\x06\x7d\xb5\x04\x77\x47\xdd\x03\x8c\x0a\x02\x37\x3a\x51\x04\x26\x1e\xd2\x9d\xe4\x09\x7d\x72\x04\x36\x18\xea\x86\x51\xba\x73\x97\xd7\x44\x0c\x06\xad\x49\x33\x99\x6d\x2c\xcb\xe9\x03\x29\x99\x26\x01\xd0\xd6\xf4\x79\xbc\x8c\xdf\x83\x2d\x0b\x81\xda\x42\x46\xe3\x5c\xe6\x28\x58\x6b\x68\xc1\x41\xe9\x53\x2b\x04\xbc\x5a\xaf\xde\x6f\xe2\xf5\xd9\x15\x87\x33\xc9\x95\x9a\xb9\x8e\xa3\x43\x3a\x3a\x19\xb5\xc1\x7c\x43\x8e\x40\xfc\x42\x1b\x10\xd5\x5f\xf1\xb3\x87\xd1\x48\x69\xc7\x44\xa2\x0c\x51\xea\xdb\x80\xd8\xd6\x44\xca\x18\x26\xa7\x57\x66\x72\x8e\xec\xe4\x1c\xe5\x4d\x0e\x86\x9d\xc5\x40\xf4\x10\x33\x04\x0f\x17\x62\x2e\xab\x23\x89\xb0\xc4\xe7\xab\x8d\x00\xef\x76\xbc\x8c\x67\x09\x18\x69\x49\xcb\x5c\x5e\x22\x5d\xa6\x27\xd1\x88\xa4\xff\x23\xb9\x02\x93\xf4\xa7\xcb\xe9\x06\x6f\xb4\x4f\xa2\x01\x6d\x88\xc6\x90\x85\x60\xbf\xda\x74\x9d\x35\x4a\x81\x1e\xdb\x78\xfa\x7d\x02\x02\x36\xc1\x3f\xc6\x1f\xdd\x6a\x7a\xb4\x2b\x8e\xd5\xbb\x93\xfb\x7a\xb5\x5a\x4c\x62\x93\xd7\x1f\x90\x15\xd2\x3f\xd0\xec\xe6\x11\x9a\xf8\xb1\x07\x78\xfa\x26\x57\x5a\xff\x99\x27\x78\xf8\xc6\x4a\xcd\xd4\xb3\xa7\x7f\x7f\xf2\xda\xa7\xeb\xec\x18\xd7\x76\x03\x7f\x48\x9a\x7d\x78\xef\xd5\x3f\x42\x80\xb0\x5d\x68\x38\x13\x38\x8e\xae\x1a\x1a\xa6\x8f\xa6\x2b\x0b\x2b\xf3\x58\xeb\x96\x32\x10\x59\x46\xe7\xab\x6c\x1b\x4d\xe3\x0c\x1d\x9e\x41\x09\xb8\x47\x4f\xc1\xb2\x29\x53\x3e\xf1\xd0\x39\x55\x3a\x8d\xc0\xb0\xf5\x3d\x18\xb7\xe2\x55\xff\x22\x9d\x63\x08\xc3\x78\xa9\xea\x8a\xd7\xeb\x66\xf4\x74\x0e\x37\xce\xd1\x7a\x11\x2f\x23\x08\x8d\x79\xb1\xc5\xe0\xd5\x5e\xcd\xea\x5d\xd0\x59\xa2\x72\xc0\x5c\x02\x0c\x34\x54\x5d\x62\x83\x4d\xe3\x85\xa0\x86\x19\xc4\x76\xde\x9a\x1e\xac\xa4\xa9\x42\x53\x8c\x0d\x03\x42\x2e\x16\x11\x3a\xfc\xb7\x4f\x6e\x32\x00\x92\xcf\xc7\x55\x5d\x97\x67\xc9\xd2\x6b\x7f\x8a\x6f\xb0\x9b\xd1\xe3\xd5\x46\x60\x60\x03\x57\xe5\x60\x12\x1d\x2b\x13\x9d\x44\x19\x6e\xfc\x57\x5b\x88\xab\xb7\xa4\x15\x26\x76\xa1\x42\x5e\x35\x46\x68\x71\x25\xd6\x0b\xce\x71\x5d\xa6\x24\xe7\xeb\x05\x3e\xe8\x92\x8f\xeb\x70\xca\x15\x74\xa6\xb7\x3f\x92\xa5\xdf\xca\xc8\xd2\x2a\x76\x05\x2c\x85\xc7\xf1\x79\xba\x00\xf3\xf3\x57\xab\xc9\x6a\xbb\x12\x68\x10\x7b\x4a\x23\x83\xa0\x98\x15\x55\xdf\x3a\x5e\x24\x5b\xa7\x29\xb0\x0c\x7e\x29\xd3\xb5\x33\x3f\x83\x1a\x0f\xf0\x81\xce\x41\x4a\xc9\xaa\x79\xf5\xd4\x54\x83\x50\xe4\x62\xb3\xd1\x05\xf8\x63\x1e\x9a\x53\x0d\xba\x14\x50\xa6\x11\x75\x63\x35\x63\xda\x87\xf2\x99\x9a\xb5\x19\x4c\xa0\xd8\x80\xc1\x75\xaf\x1e\xa2\x9a\xae\x4c\x5a\xaf\x64\xfe\x03\x28\x9d\x54\x5d\x26\x97\xf8\xc5\x0f\xdb\xa5\x9f\x13\x68\x08\x8d\x79\x6e\xb0\x98\x01\x56\x9c\x49\xb0\x45\xbc\xf9\xf1\x0a\x6b\x9c\x99\x22\x0c\x8f\x7e\x53\x7c\x02\x68\xa9\xa2\x3c\x5b\x63\x8d\x23\x35\x0b\x3d\xdf\xe2\x83\x57\x5f\x5d\x04\x99\x58\x5c\x72\x6b\xab\xd2\xd4\x7a\x44\xca\xb1\x31\xd8\xd8\xa5\xbc\xa0\x49\x57\x36\x9b\x7a\x59\x84\x06\x26\x8d\x3a\xe5\x88\xea\xac\x37\x81\xd1\x79\x93\xc3\xc7\x19\x9c\x3b\x2f\xd1\x79\xf6\x28\xcd\x26\x43\x80\x68\x44\x79\x64\xac\x1e\x8f\xc0\x4b\x4e\x2e\x9c\x0c\x44\xea\xbc\x29\xf4\x28\x46\x20\x2a\x54\xc3\x6d\xb7\xd8\x1f\x81\x57\xf3\x70\xc3\xe2\xf7\xa5\xde\x53\x98\xa3\x3f\x4b\xd4\xea\xab\x43\x3d\x7a\x99\xf2\xce\x9a\xb6\x49\xb9\x2f\x4a\x3d\x41\x7a\x61\xe0\x2e\xb5\xf0\xba\xc0\x3f\xd3\x26\x9d\x51\x93\xd0\xb2\xfd\xb4\x45\xbd\x2e\x3c\xcd\x5e\x6d\x17\xbc\x61\x4c\xaa\xa6\xf0\xaf\xd3\x14\xa6\x89\x66\xbe\xfb\x0e\xbf\x11\xa3\xe6\xdb\xb7\x82\x46\xb1\xf4\x90\x77\x6c\xca\x24\x27\x02\xe6\xc6\x03\xc3\xaa\x52\x16\x42\x70\xa2\x34\x83\x30\x21\x22\x67\x08\xec\xd1\xe0\x40\xf6\xc8\x98\x90\x51\xf6\x48\x4b\x02\xb7\x2d\x88\xe8\x77\xba\x06\x57\x9c\xe8\xa9\x8e\x02\x9b\x41\x60\x29\x60\xb0\x35\xa0\xe1\xac\x1e\x8a\x81\xe0\xe8\x15\x77\xf5\x3e\x44\xbd\x74\xb3\x0c\x3f\x58\x37\x2f\x47\x4f\x54\xb7\x9b\x46\x74\xab\x2b\x90\x69\xbc\xfc\x18\x67\xfa\x91\x19\x18\x3a\x88\xbf\x15\x9d\x2b\x5f\x8b\xd2\x2a\xc8\xb0\x9a\x73\xc1\x97\x56\xbd\x8a\x85\xb0\xd6\xad\xd5\xc1\x44\x56\xe6\x28\x31\x5e\xd5\xa8\x5d\x0f\x1d\x52\xa7\xaa\x62\xbd\x49\xcf\xe3\xcd\x55\x9b\x8f\x4c\xdd\x74\x4a\xa2\x52\xb6\x96\xf2\x58\xcf\x5d\x26\x81\x25\xb7\xe6\x7b\x80\x0c\xeb\xb8\x31\xfe\xf8\xc9\x90\x46\xad\xd6\xed\x10\xce\xe3\x8f\xf1\x36\xde\xf8\xc1\x90\x34\x8a\x3d\xe1\xbc\xe6\x3d\xe7\xc3\x97\x87\x62\x2f\xbb\x47\x1e\xba\xd0\x0a\x4b\xe1\x50\x8d\x84\xbc\x1e\x96\x12\xbc\xdb\xd8\x42\x0a\x21\x81\x57\x92\x66\xe0\x6e\x11\x21\x12\x5d\xb0\x01\xba\x8f\x15\x4d\xc9\x3a\xa9\x73\xb9\x15\xfc\x76\xb2\xb9\x9f\x0b\x1c\x6a\x06\xe4\x22\x16\x52\x08\x36\x23\x86\x4a\x47\x53\xd0\x6c\x75\x7d\x84\x42\x4d\x46\x90\xda\x31\x35\x9e\xe6\x21\x50\xdf\x3a\x5e\x3b\xf5\x94\x1e\xd4\x26\x4e\xb3\x64\xe6\xcf\xe9\x94\x11\xb3\x52\x67\xb9\x85\xb7\xab\xf7\xef\x79\xb4\xa9\xed\xd9\xc5\xf9\xe4\xc5\x92\x2f\x05\x65\x2c\x51\x77\xa0\xe6\xf3\x07\x5e\x23\x3d\x0f\xec\x61\x80\xb8\x0c\xc5\x3b\xb0\xda\x9d\xc8\xae\xe6\xe1\x1d\x05\xef\x64\xde\x92\xd7\x65\x71\x61\xb8\x35\x98\x01\xe4\xcf\x94\x53\xc4\x19\x4c\x4e\xb9\xb6\x3f\xc3\x82\x49\xdf\x24\xd9\xd9\xd3\xe5\x2c\x9d\x42\x27\x4f\xd8\xab\xbc\xcd\xea\x43\xe2\xe3\x67\x48\xc7\x2c\x96\xf0\x0c\x1d\xae\xfb\xb0\xca\xfa\xc2\x6d\x52\xfa\xda\x67\x93\x6b\xa2\x7d\x98\xb2\x5a\x85\x67\x1b\x72\xc2\x6a\x04\x17\x9f\x13\xab\x2e\x08\xc3\x83\x4e\xb9\x93\xc9\x79\x2a\x69\xe8\x1d\x3c\xb3\xcd\xc9\x65\x0e\xec\xfc\xe3\x0e\x8e\x6f\x50\x43\x51\x3d\x14\x1c\xcd\xc3\x2f\x77\x34\xdb\xb8\xbc\x14\xc6\x28\xea\x6e\xe2\xfc\x3e\xfe\xfe\xfb\x5b\xd1\xf7\x51\xf4\x0c\xbd\x14\xc8\x53\x3c\x95\xcf\x1a\x54\x94\x5d\x25\xb1\x63\xdc\x9c\x74\x19\x09\xc9\x5c\x88\xbe\xf1\xa2\x71\x91\x36\xa3\xa7\x5b\x00\x7e\x7f\x11\x6f\x62\xc1\x46\xa3\xc4\x88\xb5\x9d\xc1\x63\x85\x78\xb1\xf0\xa4\xfd\xa5\x00\x12\x60\xf0\x76\x21\x11\x7b\xe3\x95\x95\x89\x9b\xd1\xcf\x16\x6a\xb5\x8d\x14\xa7\x8f\xd5\x41\xa8\xfe\x48\x9a\xe3\xab\x1a\x51\xe1\x60\x3a\xb8\x82\xd4\x2c\x91\x4f\x73\x40\x36\xfd\xfe\x58\xe2\x18\x47\x45\x59\x13\x23\xf9\x9f\x5a\x69\xbf\xb4\xac\x7f\x30\x67\x13\xe6\x01\x94\x8d\x97\xc3\x28\x74\x7c\xa0\xa1\x07\xd4\xf5\x81\xda\x16\x28\x9e\x82\xef\x39\xa7\x35\x6d\xee\xcd\x81\x3a\x01\xa0\x9e\x0b\xd4\x0d\x00\x91\xe6\x7c\xbe\xcd\xdc\x01\x04\xf9\x36\x05\x74\x49\x19\x3b\x9f\x75\x33\xac\x58\xfd\x00\x5e\xcc\x76\x00\x37\xda\x9b\x61\xb3\xea\x9a\x7a\xcc\x1b\x31\xb3\x3c\xf5\xb7\x7f\xff\x5b\x13\x16\x79\xea\x3e\xf9\x1f\xe2\x45\x25\x5e\xaf\xef\x73\x86\x4b\x9d\xa5\x9a\x03\x62\xb4\x42\x0e\x88\x20\x92\x19\x73\x6c\x7d\x9a\xa8\xee\x34\x73\x14\xc4\xee\x5e\xbe\x2f\x13\xd8\x1a\xf9\x47\xd0\xc4\xe3\x11\x74\x67\xba\xd4\xbb\x84\xf1\x7a\x42\x9d\x9e\x80\xde\x5c\xf2\x18\x52\xed\xac\xbb\xaf\xf5\xe9\xe0\x12\xdd\x6d\x6f\x0a\x2f\xda\x26\xab\x4f\x4e\xf0\xd9\x07\x1c\x99\x01\x67\x34\x58\xd0\x50\xd1\x0e\xac\x6f\x38\xcb\xb0\x03\xda\xa1\x50\x0d\xcd\x92\xc9\x99\x0b\x0f\xe2\x77\xf7\x17\xc1\x1e\x96\xa8\xd9\xc5\x10\xa8\xf0\x5e\xa6\x62\xac\x37\x42\x6d\x97\x9c\xd2\xa6\xa2\xfc\x52\x50\xe0\x6b\x0b\x58\x30\x06\x79\x5a\x87\x91\xd8\x09\xc2\xbe\x0e\x77\xc0\x1b\x23\xb9\xb6\xa0\xa3\x94\xfb\x96\xd3\x20\x21\x6a\x5f\x86\xd1\x0e\x0d\x0a\x70\x45\x36\xb1\x20\xa6\x0a\x10\xa0\xc6\x1a\xc0\x16\xdd\xab\x29\x12\x04\xe9\xcf\xc2\x25\xd8\x94\xed\x2b\x8c\x4d\xc8\x32\xeb\xf3\x85\x99\xca\xd4\x5e\xab\x9e\x87\x80\x70\x5f\x61\x95\x16\xd2\x8a\x19\x4c\xb9\x55\x64\xc0\x9f\x86\x2b\x76\x87\x2c\x4e\x23\x67\x47\xf5\xe4\x9b\xd0\x00\x4a\x48\x96\x2a\x42\xe7\x8e\xdd\x54\xec\x4e\x3d\x0f\x65\x45\x1d\x5e\xa4\xd9\xd6\x95\x14\x97\x49\xb6\x4d\x66\xcf\x04\x4f\xb4\x78\x98\xac\xa1\xd5\xf6\x68\x6f\x41\x36\x67\xa9\xe6\xca\xb2\x45\x9d\x0c\x89\xb3\x62\x47\x89\xf9\xed\xa1\xfc\x73\xc6\x2e\xfb\x54\x9a\x27\xfa\x9a\x03\x44\x08\xbd\x7d\x2a\xfb\x18\x5f\x5e\x0e\xa2\x5d\x2f\x43\x99\x0a\x22\xb8\x63\x15\x95\x16\xa7\xcb\xb6\xcb\x0e\xc3\xc0\x66\x52\xb8\x19\x14\xae\xd6\xdd\x92\x79\xd1\x14\x6d\x84\xcc\xb6\x0a\x2c\xf1\x50\x77\xcb\x78\x65\xcb\x21\x9f\x3f\xcb\x79\x99\x99\x9b\x75\x9d\xf2\xa5\x4f\xd0\x72\xda\x0f\x07\x5f\x7b\x1d\x08\xa5\x0e\x03\xff\xf0\xb8\xd9\x7d\xb6\xe4\x59\x7b\x88\x92\xa1\xbb\x4b\xc9\x50\x6a\x99\xe4\xe8\x1a\x94\xa9\x45\x7d\x3f\x0d\x84\x1f\x94\xd4\xd5\x63\xb9\x9a\x08\x65\x0b\xd1\x09\xa5\xdb\x28\xf8\xa3\x50\xb6\x8e\xf5\xde\xf6\x72\xb1\x49\xa9\x02\x21\xad\xf7\xfc\xd6\x89\x1e\x24\x6f\xda\xb9\x2a\xc4\x41\x69\xd7\x5d\xa2\x36\xc2\x66\x59\xf4\x2b\x67\x2d\x6c\x02\x76\x11\xa3\xef\x12\xee\xbf\xba\x1d\xf8\x4b\x36\xfe\x38\xd4\xed\xa2\xad\x7c\x0b\xb8\x3e\x78\xbf\xc4\xd2\x4f\x8a\xb5\xaa\x25\x78\x45\x52\x8d\xc8\xbf\x38\x5f\x16\xe3\xc5\xda\xba\xf9\x07\x26\xe5\xc0\x8c\x66\xa2\xd3\x0b\xb6\xf8\x78\xb5\xda\xee\xd7\xf1\x22\x76\xde\xf6\x2a\xd8\xd8\x2b\xf0\x4b\x15\xd6\x63\x13\x6a\x65\x6a\x53\x50\x6e\xad\x93\x3c\xe1\x1c\xdb\x4b\x96\xd5\xf0\x9e\x04\xfa\x53\xaa\x40\xd5\x27\xfd\x8e\x0d\xa5\x84\xe2\xe1\xc0\xe9\x7d\x05\x31\x6a\xdd\xb9\x0d\xb1\x39\x45\xb3\x96\x9e\xe7\xcb\x5f\x3b\xcf\x0e\x32\xe6\x01\x1d\x73\x50\xb2\xc9\xd9\xe1\xa7\x8b\x95\xbb\x1f\x4e\x38\x72\xbe\x98\x60\xb6\x4b\xf7\xbf\x4b\xfe\xcc\xbd\x02\xe8\x97\xbf\x01\xf0\x6f\x0b\x5e\xed\xc5\x9e\x94\xb9\x08\xc8\xa7\xe7\xfc\xfb\x80\xe2\xa3\x29\x3c\x1e\x6b\xe9\xfa\xc7\xb1\x3f\x5b\x69\xae\xb7\x7b\xbf\xa5\x58\x81\x15\x28\xd6\xb9\x35\x8d\x06\x7d\x11\x45\x46\x68\xef\xdb\xa6\x5b\xd8\xe0\xb4\xd9\x61\xa7\x15\x94\x2e\x5d\x31\xa2\xc7\xfc\x7b\x66\xc9\x3a\xde\x40\x17\x72\xa0\xdb\x43\x26\x74\x80\x54\xf0\xa4\x40\x46\x69\xb7\x7c\x1d\x97\xd8\x1a\xb2\x52\x72\x66\xe1\x71\x0a\x53\xf4\x38\x4d\x16\xb3\x9c\x73\xa3\x60\x2a\xcf\x52\x6f\xe9\xe7\x30\xcb\x5a\x0f\xf0\xac\x1c\x8d\xe8\x5a\x02\xa2\x55\x4e\x03\x18\xb5\x99\xd3\xa8\x74\x02\x43\xfa\x00\x71\x47\xca\x2d\xb5\x62\x07\xb2\xfb\x6f\xe6\xf8\xf9\xd9\x7a\x85\xb2\x4e\x40\x45\x53\x70\x91\xb1\x42\x47\x47\x1f\xd3\xd5\x45\xa6\x5d\x37\xa5\xca\x15\xfa\x6a\xf2\x3f\x4d\xab\x0f\x6a\x7a\xa8\xd1\x17\xeb\xde\x5e\xe0\x14\x64\x57\xd9\x5d\x65\x8d\x22\x61\x7c\x1d\x0d\x47\x73\xa8\x09\xb5\xb0\xd8\xc1\x81\xb7\x81\x25\x2b\xde\xdd\xff\xe0\x1d\x3c\xed\x38\x95\x87\x4a\x77\xd8\x2b\x38\xd5\x55\xb7\x77\x55\x5d\x0e\xe5\xac\x68\x6e\xdf\xe5\x81\x24\x63\x39\xb1\x63\xa0\xb0\x6e\x5d\xca\x3b\x3c\xe4\x16\xcf\xbd\x59\x89\x02\x05\x57\x8d\xf6\x2a\xea\xc0\xbb\x46\xfc\x49\x8c\xde\xe1\xee\x71\x74\xe0\xdd\xa3\x7d\x46\xc0\x43\x97\xb0\x77\x04\xb9\x5e\xa5\x94\x43\xe2\xc7\xaa\x65\xb1\x5a\xa7\x17\x93\x74\xda\x98\x24\xbf\xa5\xc9\xa6\xda\x6a\x76\xba\xf5\xa8\x8d\x33\xd0\x31\xef\x2b\xa0\xd0\xd3\x65\x61\xb1\x5e\xaf\x2f\x8f\x0b\xc9\x10\xc2\xbf\x63\xdc\xb4\x6d\x9b\xe4\xa2\x46\xbb\x45\x9e\x29\xbf\x93\x75\xe3\x83\xad\x1e\xcd\x92\x45\x2c\x3e\x00\x44\x37\x67\x9c\xf1\xd1\x44\x08\x9a\x47\x7f\xfe\xfb\xdf\xd2\xf8\xcb\x19\x21\x0b\xe5\xa0\xfc\xbc\xfd\xe5\x2f\x91\x17\x52\x67\xbb\x3a\x95\xb1\x4b\x30\x98\x8e\x06\xad\xa1\x67\xb7\xca\x1b\xe9\x96\x38\xba\xb7\xd9\xc4\x57\x6f\x2b\xa6\x3f\xf2\x96\x68\xcb\xe2\xd6\x54\x2a\xda\x3c\x8f\xc5\x40\x52\x41\x41\x75\xc5\x4e\x08\x24\x7b\x66\x82\x2d\xa5\xad\xaf\xc6\x2a\xff\xe1\x0e\xb8\x98\xbe\x4d\x99\x0e\x9a\x27\xcd\xe9\xd0\xff\x6d\x00\xb3\x6f\xd2\xb7\x61\xe4\x72\x33\x46\x6b\x6c\x6c\x2b\x57\x06\x74\x3c\xde\x03\x0b\x5e\x90\xd7\x68\x51\x8b\x24\x12\x04\x16\xa7\xb1\x1f\xf6\xab\x4f\xf5\x49\x83\x0b\x6c\x9b\xaf\x82\x2a\x2a\xbd\x3e\xb8\xd9\x96\x8d\x1a\x1a\xb8\x63\xbf\x02\x8c\x98\x74\x05\x81\x0d\x40\x15\xf8\x09\x79\xb6\xf4\x0e\xfa\x3b\x02\xe5\x72\xbc\x39\xe2\x7b\x8b\x5d\xb0\x4d\xc7\xed\x9e\xa5\xb2\x1f\xa2\x0a\x46\x42\x30\xfd\xd6\x09\xac\x09\x03\x05\x5d\x33\xfb\x55\xf0\xcd\x0d\xec\x30\xe3\x03\x76\x18\xea\xae\x37\xce\xb2\x07\x02\x2f\xe8\x80\xb2\x0a\x6e\x11\x21\x40\x6c\x5d\x6c\xb9\x10\x4f\xf8\x62\x2a\xf6\x3a\x1d\xc5\xea\x3b\x93\x1d\xe9\x2f\xab\x39\x03\xc4\xc0\x5b\x67\x9b\xd5\x25\xd8\xb1\xa2\x09\xfd\x23\xe0\x42\xaa\x95\x07\xf1\x12\x4c\x06\x60\xd5\x81\xa1\x00\x34\x0a\xbe\x19\x63\x43\x0c\x62\x33\x83\xa8\x5c\xb9\x86\x17\xc4\xee\x42\xbf\x15\x51\x8f\x84\xd8\x33\x0e\x93\xaa\x2e\xfa\xdd\xf1\x01\x1d\xd7\x09\x98\x3c\x20\x04\xff\x01\xc7\x92\x14\xfd\x80\xc7\x50\xa6\xb4\x82\x0d\xd4\x8f\xe9\xac\xb1\x9e\x79\x5f\x77\x9b\x02\x3e\xd4\x72\xad\x05\x34\xa2\x2e\x03\x7c\x66\xe4\x7a\x0b\x69\x65\x7d\x06\xfa\x5c\xc9\x1f\x16\x50\x4b\x24\xb7\xdd\x3e\xe2\x35\x33\xef\x23\x26\x79\x7d\x74\x00\xcd\x15\xb5\xdf\x47\x07\xd2\xbe\xa9\xd3\x28\x9b\x0b\x71\x20\xba\x44\x61\x41\x17\x86\xa4\x5f\x30\x45\x5a\xab\xdc\x89\xba\xd2\xac\xd1\xc9\xfd\x11\xde\x8f\x80\xed\x6e\x2f\x98\xfd\x3c\x99\xa5\x17\xe7\x22\xbb\x0f\xd9\x34\x1f\x7d\x2c\x4a\x4e\x42\x4b\x23\x10\x79\xae\x97\x63\xf1\xab\xa8\xd0\xd0\x84\x5e\x46\xf6\xcc\x16\x2b\x68\xfc\x2d\x5a\xde\xb7\x68\x79\x07\x44\xcb\xfb\x83\x02\xe0\xc9\xb6\x3e\xbe\x87\xcb\xd6\xb2\xc1\xe9\x24\x74\xa5\x20\x36\xdd\xdb\x2f\x10\x2f\x4e\x69\xce\x8a\xc2\xbf\x51\x3d\x65\x11\x1c\x0f\x4a\x5d\x14\xd2\x8d\x06\x99\xce\x87\xfb\x98\x26\x97\xf7\xc1\x16\x25\xdc\xe8\xad\x1b\x8b\xe9\xc6\x03\x57\x6b\x29\x97\x54\xff\x50\x9a\xc4\x61\x8c\x32\x5e\x3d\xcd\xc9\x0d\x19\x17\x0e\xd6\xed\xc6\xea\x36\xaa\x8c\x9c\x20\xdc\x6e\x0c\x6e\x03\x6f\xf0\x54\x69\x45\xad\xa8\xd3\x13\xff\x55\xdc\x41\x5c\x3b\x38\xc9\xf4\x2c\x5d\xcc\x44\x21\x1b\x29\x44\xa7\x10\x18\x25\xf9\x69\x00\xf8\x69\x73\x2d\x19\x59\x10\x9b\x46\x2c\xbb\x08\x5e\x68\x00\x13\x9b\xea\xc1\x22\x4e\x3c\x58\x4c\xb5\xb0\xe1\x40\x27\x3a\x57\x21\xd1\xe6\xab\x04\x37\x14\x4a\xb9\x48\x28\x1a\x37\x10\xec\x04\xd1\x00\x5f\xec\x60\x65\x5c\x14\x3b\x20\xf2\x1b\x3b\x6d\x63\xa4\x60\x58\x1a\xec\x08\x0f\x97\xb2\x52\x7a\x4f\x08\xac\x80\x9f\x77\xd5\xa7\x8a\x14\x02\x82\x14\x7e\x69\xce\xc1\xa6\xf3\x2e\xfd\x71\x92\x13\xd6\xcc\xd3\x54\x50\x3c\xeb\xd6\xc8\x2c\xde\xa5\x3f\x4e\x4c\x97\x48\x2f\x31\xa0\xca\x8c\x87\x6c\xc1\xb4\x7b\xcb\x99\xe4\xbb\x6d\xa4\x6d\xb9\x19\x0a\x22\x4e\x97\xc0\xab\x37\x26\xa0\x66\x37\x4a\x2a\xad\xdf\xb4\x17\xd5\xca\x8c\xc4\x26\x08\xe4\xa9\xcb\x47\x51\xc9\x72\xb5\xb4\x11\x8d\x76\x05\x29\x52\x96\x8c\x2a\xce\x8b\x0d\xbe\x22\xf8\xa5\xe7\xf1\x07\xc1\x41\x80\x27\x70\xf0\x33\x8d\xe8\x93\x78\x36\x0f\xa2\x64\xa2\x98\xf9\x8f\xe9\x4c\xda\xf2\x12\xfa\xd2\xe2\x66\x0a\x5e\xfd\x49\xc4\x1a\xb5\xe3\x08\x14\x6a\xcc\x5a\xfc\xc9\xce\xd0\xc9\xc6\xb0\x0a\x99\x8b\xfc\xf0\xf6\x22\xc3\x52\xc8\x4b\x4e\x9b\x1e\xde\x5a\x3c\x58\x4c\x57\x12\xe5\x89\x8c\x52\x40\xf6\xb3\xc2\x08\x31\x1f\xdf\x1b\x74\xfb\x01\x62\xea\x6a\x08\x81\xb8\x36\x94\x44\xac\x46\xd2\x6c\x69\x7a\x59\xda\x58\x32\x7a\x69\xe1\x4f\x1a\xe2\xc4\x1d\x07\x0d\x16\xe2\xe6\x55\x93\xbc\x80\x30\xfc\x2c\x30\xa1\x57\x58\x80\x15\x56\x4f\xb8\x07\xee\x66\xef\xe5\x95\xe8\x01\x8b\x4a\xe3\x77\x40\x57\xa3\xa4\xcd\x70\x44\x10\xc9\x54\x94\x0a\x6c\xbd\x3b\x78\x35\xf0\xdd\x87\x06\xf2\x08\xb3\x65\xc7\xf1\x6c\x46\x62\x06\xbf\x14\x0b\xed\x15\x1e\x4c\xcf\xa1\xa7\x86\x73\x92\x50\x4d\x27\xfb\xb6\xc3\x65\x39\xf6\xf9\x82\x24\x1b\x70\xcf\x61\xf8\x31\xa9\xc0\x3d\x15\x7b\x9c\xe0\x1e\xb2\x92\x6c\x19\x2f\xe4\x70\x67\x4e\x87\xde\x96\x3a\x6a\x77\xaf\x26\x35\x24\xb3\x7d\x99\xa9\xd7\x29\xa1\xb2\x95\x75\xbc\x3d\xab\x40\x24\x26\x41\x3a\x95\xe7\xed\x71\xb3\xd7\x8d\xda\x9d\xe6\x78\x34\x6d\xb6\x7a\x8d\x66\xb7\xd3\x6c\x0d\x1b\xcd\x41\x0f\x3f\xc6\xa3\xac\xd1\x6c\x75\xc5\xef\x41\x43\x25\x2c\x3a\xcd\x76\xbb\xd1\x6e\x0e\xfa\xd3\x66\x7b\xdc\x68\xb6\xfb\xcd\x8e\x28\xd7\x13\xc9\x1d\x28\xb7\x68\x74\x1a\xdd\x66\x6f\x30\x6d\x60\x42\x47\xfc\xdf\x15\x60\x50\x47\x1b\x7e\x8a\xfc\x66\x6f\x1c\xb5\x45\x7e\x5f\xe4\xf5\x44\x55\xad\x51\xa3\x39\xec\x42\x9d\x63\x6c\x41\x40\x8f\x04\xd4\xa0\xff\xa0\xdd\x13\x35\x45\xa2\xea\x91\x10\x04\x9b\x9d\x7e\xd4\x11\x9f\x51\xe7\xac\xd1\x13\xc5\xc5\xcf\x96\xa8\x60\x20\x72\xc5\x87\x18\x48\x07\x4b\x46\x50\x72\x0a\xcd\x09\x08\x51\x69\x7b\xd8\xec\x8f\xb1\x72\xac\x1b\x5a\x6f\x40\xeb\x1d\xd1\xa5\xd6\x18\x4a\x42\x35\x00\x0d\x7d\x8b\x74\xdf\xbb\xd8\xf5\xd6\x10\x6a\x16\xf8\x11\x03\x83\x81\x47\x6d\x59\x79\xab\x27\x30\x85\xd9\x83\x3e\x7e\x08\x4c\x09\x44\x09\x3c\xc9\x1f\xd0\x8e\x85\x16\x58\x6e\x0b\xb0\x8e\x18\x4d\xa7\xa1\x6b\x93\x2d\xc1\xaf\x4e\x47\xa0\xa8\xd9\x55\x7d\x50\x1d\x14\xd8\x69\xf6\x22\x40\x8e\xc0\x4d\xa4\xbb\x6f\xc6\x07\x8d\x89\xfa\xb0\x4a\x39\xf8\xb3\xde\x14\x51\x12\x89\x6a\x45\x23\x23\xa8\x06\x70\xa2\x91\x39\x95\x13\xd0\x8f\x00\x25\x02\xf9\xe3\xc8\x20\x5c\xcd\x88\x40\x89\xc0\x08\x22\x24\xd2\xb3\xa5\x26\x53\xcd\x25\xd2\x00\xd4\x6b\xe6\x5a\x13\xc3\x6f\xcf\xdb\x62\x6e\xfa\x4d\x31\xdc\x76\x73\xdc\x15\x28\xed\x36\x01\xfb\xfd\x21\x7e\x11\xff\x67\xfa\x47\xa4\x12\xe0\x33\x82\xc4\x48\x27\xea\x1f\x3a\xf7\xb7\x8a\xd8\xd8\xc8\x0e\x9e\x17\xd1\x88\xaf\x3e\xaa\xe2\xd7\xab\xfb\xe8\x64\xdc\x52\x7b\x94\xda\x4c\x8e\x4e\x3a\x9d\x2e\x6c\x55\xa5\x42\x4b\xfc\x39\xb7\x2a\xfd\x7e\x3e\x5d\x80\xd3\x9a\x34\xdb\x96\xdc\xad\xbc\x72\x5f\xd1\x86\xd5\x8a\xda\xa3\xb3\xde\xc7\x06\x6c\x02\x1f\x3b\xbf\x3d\xef\x46\x83\x8f\x9d\xb3\xf6\xe8\xe7\xc1\x93\xee\x6f\xe7\xdd\x68\x78\xd6\xee\x88\xdc\x27\x22\xb5\x2c\xf9\x78\xe8\xd8\x93\x82\x0e\x71\x30\xf5\x27\xa1\xa0\x27\xf1\x66\x76\x19\x6f\x92\x7f\x24\x57\x93\x95\xf8\x7e\x6f\xb3\x59\x5d\x82\x51\x7f\x49\x4a\xca\x2d\xff\xf5\x50\x94\xd8\xe1\xdb\xd1\xb0\x39\xea\x3d\x83\x1d\xac\x03\x5b\x66\x0f\x4e\x0c\xf1\xcf\xe8\x99\x38\x78\xc6\x62\xcf\x5c\x34\x06\xd1\xa0\x21\xfe\x96\x25\xa9\x5c\xbc\xec\x49\x5a\xa5\xdc\x63\x7d\x45\xa4\xf5\xd3\xfa\x3a\x84\xf5\xd3\xfa\x2b\x23\x2b\x71\x20\xf6\xda\x48\x57\xad\xe6\xa8\x8b\x74\x15\x69\xba\x6a\x8b\xe3\x13\x69\x2a\xba\x1e\x55\xfd\xb4\xde\x93\xa6\x0e\xf5\xf6\xb5\x43\x65\x1a\x24\x0c\x8f\x2a\x7e\x8c\x3f\xa6\xef\xf1\x86\xec\xc1\x59\xf2\x71\xb3\xc2\x68\xc7\x0f\x57\x17\x52\xcf\x5a\x86\x32\x0a\x6a\xa8\xfc\x89\xe6\xbf\xdd\x96\xfb\x8a\xf8\xe7\x99\x38\xb4\x06\x11\xee\x21\xf8\x17\x72\x1a\x98\xfd\x6c\x20\xc8\x42\x6c\x3a\x48\x00\xfb\x54\x3e\x22\x95\x0f\xf3\x2a\x17\x3c\xac\xad\xbd\x04\x79\x15\x60\xd6\x90\x58\x80\xbe\x8c\xd0\x77\xa8\x9f\x94\x2f\x43\x58\x18\x60\xfb\x7a\x94\x45\xaa\xf8\x33\x91\x16\x4c\xf3\x33\xdc\x4b\x24\x09\x08\xe9\x62\x28\xa6\x59\x10\x01\xec\x2d\x11\xe6\x3c\x13\x94\x30\x8a\x16\x83\x48\x9d\x59\xfb\x10\x57\x17\xea\x17\xf4\x2b\xaa\x91\xbb\xd8\x20\xd4\x80\x00\x63\x2d\x1c\x42\x60\x04\xc1\xa5\x28\xec\xd0\xe7\xfe\x7f\x82\xe3\xd0\x8e\x5d\xf2\x02\xea\xf1\xe4\xde\xa4\xc9\x4a\x7f\x45\xc7\xa1\x38\x02\x17\xfd\x48\xfc\x6d\x94\x16\xeb\x72\x06\xbd\xe7\x71\x77\xa8\x99\xd6\x9f\x93\x66\x4a\x33\x50\xc1\xb2\x5f\x15\xbd\xf4\x16\x82\x56\x80\x62\xae\x41\x2f\x7b\x33\x47\x87\x98\xdc\xfc\xe9\xa8\x45\x46\x9c\x3d\xe0\xd0\xc3\xab\x94\xaf\x84\x42\xc6\xf2\x5c\x12\x07\x21\x32\x39\x0b\x60\x7a\x3a\xc8\xfe\x3c\x13\x59\xe3\xa8\x23\x18\x24\x4c\x94\xec\xd0\x41\x67\x14\x98\xe3\xec\x43\x3e\xe0\xaf\xfc\xff\x0c\xfa\xd1\xec\xdf\x75\x98\xf2\xaf\x87\x96\x50\x4e\x43\x66\xe7\x59\xbb\x17\x0d\x02\xdc\xf4\x33\x94\xe0\xae\xcb\x4c\xef\x4b\x4d\x5f\xf1\x35\x4a\x98\xd7\xbb\x16\x27\xfe\x15\xd1\x93\x10\xf8\x9e\x8d\x2c\x03\xdd\x95\x0c\x34\xe1\x9f\x9f\xa1\x22\x73\xb1\x87\x4a\x29\x8c\x93\x7d\x29\xea\x2b\xd6\x76\x5b\x04\x80\xc7\x91\xbd\x29\x09\x0a\x7d\x3d\x14\x04\xc2\xd5\x59\x7b\x04\x9a\xec\xee\xc7\xce\x6f\xe7\xad\x46\x9f\xff\x1c\x5a\xad\xf7\xde\x04\x04\xa8\xd8\x97\x70\xbe\x62\x25\x37\x19\xf8\x6a\x93\xfc\x9c\x6c\xf6\xdf\x86\x74\xc1\xaf\x87\x80\x84\xb8\x3e\x9a\xb6\x9b\x6d\xb0\xf5\x6a\x34\x05\x3b\xd4\xe8\x64\xe2\xb3\xd1\x91\x7f\x23\xf8\x1a\xc1\x47\x04\x1f\x40\x52\x51\x07\xee\xee\x44\x01\x93\x9b\xe9\x5c\x53\x85\xa9\x01\xe0\x07\xfb\xc0\xef\x4f\xa4\x0a\xe5\xfb\x12\xea\x57\xac\x32\x7f\x8d\x2f\x9e\x90\xef\xbc\xbf\xfa\xf4\xe2\x62\x0b\x26\x4e\xf7\x17\xf1\xb2\x2c\x33\x9f\x5f\xc1\x57\x44\xb8\xe3\xa8\xff\xb1\xdd\x7b\xd2\xff\x59\xec\x78\x3d\xb1\xd3\x75\x9e\xf4\x5d\x42\x13\xf9\xd3\x16\x5c\x64\x6b\x82\x13\x90\x0e\xb1\xff\xdc\x9f\xb6\xa0\xd4\xde\x14\x98\x8f\xc3\x7d\x29\xf1\x66\x15\xed\xff\x41\x4a\x3c\x88\xfa\xbe\x2a\x8a\xeb\x2a\x1a\x0b\x13\xd9\x88\x53\x59\x98\xcc\x46\x66\x67\x6c\x8c\xf1\x72\x07\xb4\x17\x54\x7e\x00\x13\x96\xf6\x70\x81\xe6\x28\x43\x64\x01\xc7\xd1\x68\x21\x80\xc7\x87\x91\xe6\xbe\xe4\x78\xb3\xea\xf9\xff\x00\x39\xbe\xb2\x3e\x97\x1e\x48\xc7\x48\x7b\x11\xa6\x5f\xfc\x2b\x22\xd1\x4e\x34\x9c\x36\x3a\xcd\xe1\x40\x10\x68\x3f\xea\x80\xcd\x55\x3f\xea\x67\xf0\x25\xea\xcb\xbf\x0d\xf9\xa3\x21\xbf\x00\xf9\x35\xfa\xc8\x38\x3e\x18\x34\x7b\x23\xa4\x60\xf5\xa5\xdd\xc9\x7a\xf0\x0d\x68\x52\xfd\xd7\x50\x09\x8d\x76\xeb\x14\x2c\xa6\x3a\x08\x26\xf9\x82\xf6\x68\x0a\xd9\x1d\xd1\xf4\x08\x4c\x73\x46\xe2\x63\x94\xc9\x2f\x11\xfe\x0f\xc6\x3a\xf0\x21\xb3\x65\xda\x7e\x44\xed\x4f\xce\xbe\xe4\xfd\x15\xdf\x0d\x78\x28\xf8\x69\x39\xbd\x1e\x81\x9b\x0a\xbe\x2a\x12\xef\x7c\x65\x94\x6a\xb0\xbc\x2f\xad\x1e\x7a\x27\xf1\xed\x59\x9a\xb2\x93\xde\xae\xe0\x6d\xea\xc5\x39\x58\x26\xe3\x9b\xee\x6a\xbc\x31\x8f\x59\x31\xa1\x99\x66\x36\xc3\xc3\x45\xab\x2e\x46\xb8\xe9\x80\xed\xa0\x06\x52\xe8\xa8\x69\x2c\x6d\x38\x7e\x00\x5c\x3e\x2d\x13\xdf\x10\x29\xaa\x83\x90\x71\xdb\xbc\xad\x36\x6f\x86\xb1\x0f\xf3\xcd\xea\x1c\x3b\xa0\x5e\xc0\xfe\xdf\xfe\xae\xee\x81\x72\x1c\xec\xec\x89\xda\x9f\xb0\x79\x46\xc7\xdc\x40\xf1\x97\x74\xe8\x22\xaa\xb1\x59\x5d\x36\xa6\x98\x6b\xaa\x5e\xa4\xd3\x0f\xf7\x2e\xe3\x2b\xef\xc9\x9e\x31\x68\x9f\x02\x48\x23\x56\x30\xbb\xdf\xfa\x15\x3c\xf6\xb3\xdd\xbc\xbf\x9a\x5d\x95\xdd\xa5\x35\xbc\xb3\x29\xb3\xae\xd7\xa3\xc0\x63\x3e\xef\x3d\x9e\x98\x29\x81\x9f\xcc\x7a\xd1\x7b\xe5\x3c\x7e\x9b\xac\x56\x0b\xb9\xf9\xce\x12\xe9\x3c\xea\xc5\x12\xdb\x81\xe1\x17\x82\xcb\x2e\x03\xf6\x8d\x97\xe7\x7c\xe8\xf3\x8b\xc5\x36\x95\xbd\x90\xee\xe1\xf2\x41\xc5\xc1\x9e\x2c\x16\xd8\x87\xe2\x67\x7f\x00\x86\xde\x81\x4a\x82\x3d\xfa\x94\x6e\x8b\x41\xc5\x60\x4a\x54\xa8\xa1\x4a\xd5\x77\xaa\x1d\xff\x15\x41\xae\x37\xc9\xe9\x34\x06\xf0\xac\x08\x33\x59\x29\xfc\x65\x67\xab\xcb\xfc\x81\x10\x38\xf4\x05\x37\xdb\xd9\xa8\x7c\x58\xe3\x02\x38\x0f\x41\xaf\xfd\xaa\xd1\x23\x54\x7c\x30\xa3\xd9\x82\x20\x6d\xca\xc8\x82\x0a\x20\x40\x8d\x34\xdf\xa3\x3f\x56\x3d\xc3\x3f\x2d\x46\x31\x0e\xe9\x98\xcc\x1f\x73\xfe\xff\xec\xbd\x7b\x7f\x1b\x37\xae\x30\xfc\x7f\x3e\xc5\xd4\x7b\x76\x25\x35\x92\x6c\xc9\x76\x2e\x76\xd3\x9e\x5c\xb7\x79\xb7\x69\xf2\x8b\xdd\x76\xfb\xe6\xf1\x93\x1d\x4b\x63\x5b\x1b\x59\xa3\xa3\x91\xe2\xb8\xd9\x9c\xcf\xfe\x10\x00\x2f\x00\xc9\x19\x8d\x64\x27\xed\x9e\xe3\xec\x36\xd1\xf0\x0a\x92\x20\x08\x80\x00\x78\x35\x5f\x51\x13\x44\x4f\x77\x8d\x1e\x54\x8a\xbc\x0e\x20\xc2\x8c\xda\xdb\x19\xcf\x6f\x3a\x76\xa9\xe5\x03\x62\x5f\x68\xf8\x65\xa4\x26\x32\x1b\x64\xa3\xf7\x99\xbf\x12\xa5\x65\x9a\x13\xc5\x2e\xe0\x2f\xee\xbf\x09\x8f\xd8\x01\xe8\x74\xa4\xb8\xe0\x2a\xcc\x75\xc8\x5b\x34\xf0\x12\xfc\xca\xb6\xe5\xe7\xba\xe0\x27\xd0\xba\x22\x7d\xf3\x03\x37\x38\xe3\xce\x47\xfe\x6c\x7c\xd4\xfa\x74\x4d\xbe\x2b\x2b\xf0\x66\x49\xc5\x4e\xd2\x3b\x4a\xf6\x12\xfb\x2c\xdd\xbe\x89\xe8\x62\x06\x28\x6a\x29\x40\xde\x78\xb0\x1d\x45\xa3\xa2\x94\xd5\x5e\xb2\x86\x6e\xaa\x4d\x6c\x94\x5b\x96\x13\xb6\x5e\x5b\xa6\xed\x56\x64\x81\xed\x21\x10\x5b\x59\x9b\x69\xf1\xcd\x5b\xb1\xc8\x46\x82\x55\xab\x9e\xc2\xc8\xeb\x90\xda\xb9\x4c\xa2\xef\x9b\x23\xeb\x5f\xe6\x42\xbe\x5c\xdd\x55\x18\x4e\x49\x38\x19\x99\x2b\xb0\x49\x5a\xe6\x8e\x6b\xb3\x57\x71\xb6\x35\x8d\x3b\xb7\x59\xe1\x2b\x8b\xf9\xe8\x80\xda\x38\x5f\x8c\x3a\xc4\x67\x1c\xc3\x69\xbd\x6f\x67\xdc\xb6\xd1\xb2\xc5\x21\xa4\x0f\xc6\x74\x61\xc0\xdb\x36\x67\x02\x77\x90\x39\x40\x6c\x69\xd5\x77\x99\x9c\x1f\x13\xc3\x40\x9f\x1f\x5d\x37\x7b\x06\x84\xb6\xa1\xe5\x34\x57\x2e\x66\xb0\xea\x89\x49\x35\xe4\x7c\xe8\x80\xe0\x6e\x87\x1c\x34\xbe\x7e\x00\xb8\x86\x9f\x8d\x6a\xb2\x38\x7f\xec\xfc\xbc\x09\x78\x93\xd0\x1d\xe4\x0b\x05\x3d\x43\x4d\xe3\x89\xd9\xda\xe7\xd3\xf2\xe3\xe2\xfc\x18\x57\x6e\x8b\xb9\x7e\xa3\xf3\xe3\xcc\xbc\x13\x1c\x30\x0d\x34\x8d\x2c\xa9\x2d\x4a\xe9\x93\x91\x97\xc2\xa4\x48\x29\x3a\xe2\x83\x92\x90\xec\x4a\xbb\xc3\xd6\x14\x34\x29\x61\x19\xd9\x20\x4f\x15\x65\xbd\x81\x98\x14\x43\xf5\x43\x9c\xb0\xd3\x7a\x9e\x4e\x63\x93\xda\x66\x62\x1f\xa6\xc9\x47\x3d\xa9\x91\x51\xf1\x73\x3a\x1e\x0d\x0d\x66\x51\x39\x1e\xb3\x0a\xd7\x7a\x86\x52\x46\xd3\xb5\xc7\x4b\x50\x19\xb3\x9d\x79\x7a\xfc\x8c\x7e\xcb\x69\x53\x90\xdf\x16\xf5\xd1\x93\x95\xce\x62\x5e\x8d\xf3\x3b\xb2\x42\x61\x99\x09\x2a\xff\x76\x54\x58\x8e\x2c\x1b\x36\x2d\x76\xb5\xbc\x6a\xc4\x18\x79\xbd\x38\x6e\x09\x08\xa6\xc3\xcc\x3f\x27\x7d\x0c\x1d\xb6\x25\x1b\xb1\x05\xf6\xdc\xcf\xdb\xb7\x59\x91\x4f\xfb\xde\xa4\x19\xe1\xc6\x0a\x33\x6f\x3d\x72\xf0\x58\x14\x68\x4e\xf5\x29\xc2\x9a\x81\xa5\x64\x7b\x06\x5f\x59\xb5\x5b\xb0\xe5\x2d\x87\x98\xf4\x47\x18\x9e\x51\x75\x8a\x7c\x11\x07\xed\xd3\xad\x00\x4e\xbb\xa5\xdf\x48\x98\x8f\x78\x3d\x0f\x2f\x95\x44\xfa\x34\x1d\x9c\x11\x52\xd5\x47\x4e\xfa\x63\x0a\x76\xa7\x8b\x42\x37\xd1\x12\x30\xca\x69\xf0\x78\x2c\x0d\xba\xe1\x61\x07\x63\x75\x54\x0a\x1c\x6f\x4b\x1f\x73\x7d\x12\x18\x2a\xd3\x6a\xdb\xfe\x5b\xf1\xf5\xfb\xd4\x6a\x72\x00\xd8\x2b\xb9\xb4\x59\x20\xb0\x1c\x9d\x3b\x8d\x96\x01\x0e\x72\xba\xef\x4d\x1b\x3a\x16\x66\x94\x00\xcb\x65\x8f\x52\x63\x0f\x33\x14\x0a\x08\x6e\x0e\x85\xfa\xca\x8d\x66\xc1\x82\x57\x79\x19\x05\x07\x35\xce\x83\xc4\xb4\xd7\x75\xb8\x75\x3b\x69\x74\x06\xc7\x0d\x1e\xd0\xc3\x4a\xec\xb1\x53\xca\xee\x68\x16\x55\xee\x04\x02\xba\x9a\xfd\xf8\xf8\x91\x3d\xbb\x26\x78\x68\xa9\xae\x6d\x44\x12\x78\x31\x4c\x15\x36\xfb\xb9\xc1\xb8\x7e\x1d\xd8\x9d\x0f\xcf\x31\xed\xce\xc9\x1f\xb5\x6f\x7b\x6e\x24\xa6\x29\x87\x3a\xcb\x8f\x58\xa9\x6d\xb0\x27\xad\x5d\x77\x05\xb1\x00\x1b\xa3\xe1\xa8\x92\x86\x0e\x88\x38\xdc\x78\x10\x7f\x74\x61\x27\x40\xef\x23\xc0\x55\x93\x15\x1e\xca\x25\x5c\xa5\x40\x8a\x32\xce\x73\xca\x51\x62\x73\x33\x79\x92\xcd\xb3\xd9\xb9\xe2\x88\x93\x8b\xb3\x74\x4e\x2c\x48\x3a\xcb\x92\x86\x92\x86\x3a\x76\xaa\xbb\x76\x85\x41\x48\xf2\x18\xe5\x23\x2f\xe6\x22\x9f\x7b\xa0\x92\x94\xc6\xa4\x2b\xb7\xb1\x4b\xce\x0f\xd4\x59\x81\x7a\xca\x9d\xf8\xf0\xa7\x84\x98\xac\x44\x46\x56\x38\xe7\x4c\x71\x4e\xac\x0a\x26\xe4\x34\xbd\xb9\x30\xa2\x06\x9e\x03\xa0\x63\xa5\x2a\x9e\xd0\x19\x74\x91\xf8\x73\x4a\xf4\x0d\xc7\x2f\xe8\x9b\x47\x85\x13\x9a\xa2\xdb\xb7\x25\x9d\xb6\xbf\x5c\xa0\x47\x24\x4c\xac\xbe\x46\x72\xaf\x5b\x86\x61\xe2\x84\xe4\x68\x55\x76\x74\xc6\xc5\x8c\x52\xd1\xcf\x86\x9c\x5c\x64\x02\xb0\x58\x04\xcd\x6a\xa1\xc4\x0b\xa8\x89\x32\x80\xd1\xb5\x94\x4b\x93\xa0\x93\xbc\xc5\x18\x1f\x4d\xa7\x59\x4d\x41\xac\x3f\x4a\xa2\xae\x99\x88\x9f\x81\x1e\x3d\x9f\xbc\x86\x47\xf6\xdd\x54\xb4\x5d\x2b\xad\x56\x38\xd0\x40\x80\xa4\x36\x65\xcf\x6c\x5e\x63\x0d\x44\x96\xd2\x9e\xd7\x76\x01\x39\x74\x72\x05\x05\xdc\x48\x54\xdb\xc9\x0c\x3e\xc4\x41\xa1\x53\x64\xfb\x36\x1b\x73\x61\x62\x67\xf3\xe4\x9b\x07\x44\x9a\x61\x4b\xd0\x0f\x95\x42\x05\xd4\x61\x0a\xfb\xc0\x7d\x54\x94\xc5\xc6\x96\xa3\x48\xc9\x80\x39\xbf\xcc\xd4\xe6\x36\xb5\x09\x83\xf4\xd1\x15\x3a\xcd\xa7\xa8\x3b\x25\x23\x22\x7b\x80\x7b\x88\xec\xe8\x59\x8b\xc7\xf1\x51\xb4\x15\x22\xd0\x50\xc8\x48\xb7\x84\x17\x8a\x5e\x64\xe6\x7b\x72\x8a\x34\xb5\xab\x6b\x5d\xa8\x3d\x9b\x5f\xc0\x9b\xec\x56\x25\xd8\x6c\x75\x67\xd9\xb9\xe2\x5b\x1f\xaa\xed\x02\x53\x51\x34\xed\xd6\x25\x5c\x53\x40\x0c\xb2\xa2\xe0\x7a\x44\x39\x1e\x5f\xda\x8e\xd5\xe0\xf3\xb2\xb4\x41\x26\xd5\xc5\x14\x1b\xe1\x8e\x62\xf3\xa6\x32\xce\x46\x27\xf3\xbf\x65\x4e\xa7\x10\x25\x84\x18\x4d\xaa\x4a\xcd\x60\x14\x44\xcf\xf5\x49\x50\xa2\xd6\xd9\xf7\x8a\x1f\xb0\xfd\x2f\x36\xbd\x6d\x2b\xba\xf9\xbd\xaa\x25\x04\x40\x94\x42\x94\x66\xdb\xb5\x74\x8b\x0b\xc8\x15\xd7\x35\x1a\x64\x4d\x0b\x0d\xc6\x5f\xfe\x98\x20\xfe\xef\xc9\x0e\xda\x89\xea\x81\x89\x0e\x9c\xa8\xdf\x62\x3d\xc1\x30\xd4\xbc\x0f\xe6\xb3\xb1\x9e\xf6\xaf\xb2\xee\x79\x36\x4f\xe1\x4b\x6d\x40\xf7\x41\x59\xba\x60\xab\x7a\x81\xe4\x4a\x8c\x86\xc1\x1a\x98\x1b\x24\x1f\x11\x69\x5e\xa1\xc2\x37\x70\xaf\x24\xcf\xf5\x13\x08\x1d\x8f\x78\x1e\xca\x19\x31\xfa\xbf\x9c\xe8\x9b\x96\x67\xba\xd1\x80\xd2\xbb\x62\x6c\xbd\xa9\xf4\x57\x62\x9d\xed\x25\x96\x2f\x4e\x2d\xa3\xf9\x44\x2d\xfd\x93\x1d\x05\xe5\xc8\x2e\x71\xc3\x65\x53\xc1\x49\xbc\xab\x4e\xcf\xe4\x5a\xa5\x10\xe0\xce\x5c\xf7\x0e\x7f\x87\x44\xc0\xfc\x69\xbe\xf5\x36\x2e\xff\x6c\x69\x24\xec\xa6\xd3\xe9\xf8\x52\x16\x6d\x27\x6f\x46\x0a\x25\x8f\x20\x94\xdb\x20\x9d\x37\x23\x97\xa7\x04\x54\xab\xd5\x2a\xe1\x3c\xa4\x10\xf4\x95\x1b\x66\x4b\xae\x26\xf2\x39\xe1\x00\x6a\x6d\x1f\x85\x5d\x10\xaf\x3c\xba\x1d\xb8\x4e\x23\x46\x34\x60\x73\xf7\x7c\xf2\xf3\x66\xeb\xc8\x3f\x7c\xe3\x10\x68\x96\xb7\x06\xac\x50\xd2\x36\x77\x14\x3d\xbf\xab\x55\xa9\xa2\x31\xb3\xf7\xbd\xb3\x49\xde\x2f\xb5\x92\xd2\x2c\x8d\xc4\xf0\xec\x81\x92\x72\xf5\x49\x23\xb0\x82\x0b\x19\x0e\xd3\xf8\xc1\x11\xe2\x1f\xa6\xbc\xca\x47\x93\xb9\x38\x34\x20\xf5\x67\x83\xbb\x66\xba\x48\x43\xab\xc8\xdc\xcb\x93\x93\x02\xf5\x47\x9c\x8f\xe8\xb0\xb6\x5c\x79\x45\x00\xbd\xd2\x40\x74\x65\x59\x23\xcb\xbc\xa2\x63\x8d\xfa\x50\x92\xfb\xf8\x04\x73\x18\x30\x88\x72\x1a\xeb\x59\x72\x3b\x66\x22\x40\xd3\x75\xaa\xa7\xea\xe5\x09\x15\x6d\xba\x8e\xdb\x7c\x30\xb8\x1b\x7c\x40\x00\xd4\x2f\x00\x86\x9d\x23\x07\x84\x66\x93\x58\xe3\x6c\x6d\xfd\xc6\xf8\x0a\x87\x1d\xc1\x18\xdb\x10\x48\xb0\xc8\xc4\x1a\xbf\x8f\x2d\xef\x70\x04\xea\x23\x2a\x9c\x7c\xab\xc4\xa0\xef\x92\x4e\x2f\xd9\x03\x6b\x12\x35\x2f\x87\xa0\x20\x56\x44\x5e\x4d\x8e\x29\x33\xcf\xe1\x9d\xe5\x59\xae\x04\x39\x55\x1a\x2c\x20\x92\x6c\x84\x6a\x7a\xd5\x94\x3e\x66\xb1\x75\xe2\xaa\x9a\xba\x1a\xd0\xed\x2d\x7e\x40\xd9\x69\x25\x80\x93\xdb\x06\x62\xb3\xed\x74\xc5\xdb\x0f\xa0\xe1\x18\x4b\xf9\xde\x9f\x26\xb1\x53\xf8\x1c\x55\x6c\x21\x36\x3f\x33\x49\x2b\xf0\x30\x18\x29\x61\x1b\x1e\x8d\xa0\xb0\xd7\xf0\x78\xf5\x38\x33\xa2\x8a\xa5\xff\x58\x72\x38\x1a\x3e\xd7\x85\x31\x72\xba\x3c\x2c\x45\x63\x26\xdf\xbf\xdb\x9a\xcf\x2e\xed\x04\xd9\x93\xd5\xd6\xf2\x0f\xca\x83\xcb\xf3\xe3\x7c\xdc\x35\xd9\x47\xcd\x96\x42\xc7\x62\x9e\x4d\xf7\x93\xaf\x9a\x55\x80\x37\xb1\x14\x68\x2a\x4d\xa1\x2e\x5c\x6f\x35\x5b\xad\xee\x30\x9f\x64\xad\xfd\xa5\xc3\xf6\x59\x04\x2e\xc1\x61\xe3\x5d\x5c\x9b\xb8\x72\x6d\xb9\xd0\x16\x3d\x49\x43\x3c\xe7\x5c\x1d\x93\xe2\x1c\x75\xe2\x05\xc4\xd1\x37\x33\x87\x99\xde\xd2\x33\x3a\x46\x45\x85\x15\xcf\xd3\xe0\x5c\x61\xbd\x38\x50\x79\x05\xef\x20\x54\x5d\xa9\x1d\xd5\xcc\x66\xec\x1c\x8b\x21\x15\x67\x3b\x02\x8c\x52\xb5\xcd\xad\xa7\x42\x2c\x25\xce\x3b\x84\xe2\xc8\xa5\xcf\xf9\xf2\x65\x56\x47\xad\xcd\x7c\xd3\xa0\xfd\xd6\x38\x92\x6b\x14\x29\xd0\x8c\x8d\x2f\x80\x84\x7a\x0f\xc6\x26\x5b\xa7\xb7\x08\xe4\x00\x4b\x27\x4f\x90\x05\x9c\xf6\x22\x9f\xcd\x9b\x2d\x21\x6f\xb2\x9b\x26\x2e\x70\xda\x64\x21\x50\xb5\x85\x12\xb0\x52\xfe\xb4\xe8\xcd\xcf\x71\xdb\xaa\x77\xbe\xbb\xde\x58\x57\x06\xc1\xe7\xa4\xa2\x7c\x3e\x6c\x8a\xce\xc3\x61\xe8\x7b\x2b\x7f\x18\x98\x5c\x63\x18\x51\x68\xb1\x72\x04\x5a\x6a\x74\x45\x68\x93\xe0\xae\x2c\x94\x7f\xc3\x11\xd1\x2d\x5b\x74\x54\x90\x75\xa5\x91\x41\x03\x65\xa3\xc3\xc6\xaf\x3c\xc2\x00\xc4\x96\xaf\xee\x88\x2c\x5b\x7c\x7a\xca\x46\x63\x4a\x87\x4c\xa3\xb7\x4a\xf1\xae\xc3\xf9\x2d\x87\x7d\x19\x08\x91\xf9\x14\x8d\x45\x41\x61\x53\x2a\x59\x98\x92\x99\x66\x87\xf3\x40\x17\x48\x1e\x88\x85\x8f\x6e\xbf\xd8\x45\x89\xa9\xdf\xe9\x48\x86\xcb\xa4\x23\x94\xa5\x96\xc1\xc6\xb2\xcf\x1a\x02\x1b\x5d\xff\xc6\x5e\x7f\x17\x1f\x8f\x8a\xda\x20\x6e\xec\xdd\xe9\xf3\xdc\x78\xc8\x5d\xdf\xe4\x71\x63\xaf\xd7\xeb\x7b\xa1\x71\x7a\x5b\xeb\x46\xae\xb8\xb1\x29\xfe\x5f\x6d\x92\xbb\x8e\xad\xed\x15\x4d\x66\xe9\x35\xdd\x55\x8c\x66\xa9\xc6\x97\x7e\xf4\x22\x1d\xfe\x73\x51\xcc\x9f\xe5\xb3\x3a\x96\xb0\x5f\xca\x9e\x32\x84\xa9\xc4\x80\x51\x0f\x9a\x77\x80\x49\x7e\xcb\xf1\x28\xff\xd6\xf4\xac\xcb\x1e\x40\x16\xed\x53\x30\x76\xd9\x01\xa5\x09\x1b\xa2\xc2\x84\xf5\x37\x23\x18\x64\x10\xe5\xde\xb1\x72\xf4\x82\xe4\x61\x3e\x55\x8b\xdd\x9b\x7e\x50\xdb\x76\x3c\x1a\xa2\x45\x15\x42\xe6\xc0\x8e\x3f\xaf\xfc\x1e\x76\xa9\xda\x26\x0f\xc7\x8a\x66\xa9\x26\x8e\xf3\xf9\x3c\x3f\x67\xcf\x56\x4e\xd3\xe1\x90\x5e\x09\xf6\x5e\x2f\x36\x35\xc6\x14\xaa\xc4\x64\xe1\xeb\x8e\x07\xd3\x74\x90\xe1\x03\x01\x17\xb3\x74\xda\x90\xdc\xa4\x27\x91\xe3\x00\xdd\xd4\x7c\x66\xc3\x38\x5b\x6c\x2d\xd3\xb7\xe5\x16\x6f\x27\xb4\xd5\xdc\xb9\xb9\xaa\xcd\x1b\x35\xf0\xfa\x1a\x2c\xdf\xa0\xa5\xc8\x73\x01\x11\x13\xb8\xc4\x3c\x21\x60\x4d\x7e\x1c\x14\x98\x70\xdd\x26\x70\x11\x0b\xb6\xeb\xb2\xdb\x32\x86\x24\xde\xd4\x19\x93\x16\x66\x75\x64\x6e\x89\xa2\x83\x8b\x8e\x2d\x68\x24\xba\x53\xcd\xbe\x33\xbb\xd9\xa1\xa6\x6f\x00\xc6\x56\x22\x40\x21\x38\x37\x1a\x9e\x1d\x37\x99\x23\x79\x56\xda\x68\x5f\xd1\x38\xe9\x00\x42\x39\x26\xdb\xcc\x46\xc4\xde\xca\x5a\x71\x13\xc9\x8d\xbd\x17\x42\x63\xe9\x02\xad\xd1\x66\x3e\x5d\x66\x40\xda\x12\xfb\xd8\x37\x7e\x72\xdc\xbd\x26\xb1\xaf\xc6\x8a\x18\x9c\xe5\x63\xd8\xc5\x64\x6d\xa1\x35\x40\xd7\x63\x0b\x55\x6e\x05\x55\x62\xc4\x12\x31\x74\xd2\x5b\x5d\xd8\x5a\x32\x9e\x3a\x1c\x88\xcf\x5e\x97\x0e\xb5\xc4\xd6\x28\x38\x87\xaa\x4d\x8d\x1a\x27\xd3\xc1\x31\x2c\xf0\x54\x1a\x1c\x45\xb6\x8e\x24\x06\x9e\x71\x8e\xe2\xad\xac\x39\x4e\x89\xb5\xcd\x12\x1f\x3e\x7e\x9a\x69\x5e\xfd\xea\xcc\x77\xef\xe6\x9d\xb9\x1b\xe6\xfb\x5a\xdf\x99\x5b\xf6\xd0\x9c\xe2\x3b\xe7\xa3\xa9\x57\x65\x4e\xa9\x92\xdb\xfe\x3e\x4b\x89\x6b\x22\xf6\xbe\x36\xcf\xcd\xeb\xfd\x0e\xcf\xcd\x31\x03\x3b\xbf\xf6\x84\x9d\x02\xf9\x64\xa9\x47\x59\x25\x67\x4e\x45\xf4\xc4\x55\x3f\x5c\xa7\x0b\x1d\xd4\x65\xf4\x3f\xf3\x6b\x73\xd7\xca\xdf\xf3\xc5\x5e\x87\xcb\x9f\x43\xa3\x8c\x75\xd0\x90\xec\x97\x8b\x01\x33\x45\x83\xb9\x18\xe0\x9e\x08\x45\xb6\x1b\xf4\xcd\x8d\xb6\xc8\x85\x17\x41\xf7\x12\x45\x7c\x7d\xd6\x1e\x22\xeb\xed\x11\x08\x5d\xfd\x46\x77\x50\xe6\x35\xb5\x5c\x52\xc8\xbc\x1b\x46\xd9\xf4\xb5\xb6\xb0\x20\x2b\xbe\x54\xcb\x78\x32\x06\x7e\xac\xa1\x98\x91\xd1\xb4\x18\x15\x0d\x61\x49\x9a\x1b\x07\x03\x26\xe9\xb8\x97\xd4\xdd\x38\x72\xf3\x36\x99\x22\x21\xe3\x74\x3e\x7a\x9f\x59\xb1\xc4\xfa\xdd\x1b\x34\xe6\xd2\xd5\x07\x35\x6f\x28\xff\x34\x48\x7e\xea\x1c\x63\x6c\x16\x53\xe0\x5c\xd1\xab\xd1\x04\xc5\x2f\x3e\xfa\x64\x33\xe9\x5f\xb7\xd4\x53\x83\xc1\x8c\xba\x80\x84\x0f\x97\xf1\xb4\xaa\x47\xcb\x78\x1a\x73\x03\xf1\xdc\x49\xb8\x0b\x86\x01\xe4\x1a\x5c\x97\x38\x11\x4b\xf8\x73\x87\x9e\x72\x12\x85\x39\x82\x22\x61\x8f\x13\x62\x82\xb7\x81\x02\x47\x28\xbb\xff\xec\x79\xa0\xf3\x75\x42\x50\xe2\x40\x36\xc3\x53\xaf\xc1\xad\x8a\x0f\x8e\x5e\x2b\xc4\x51\x88\x87\x0a\xcd\x21\xe5\x7e\x1e\xd4\x74\xc6\x3a\x43\x22\x65\x74\x51\xeb\x49\xa8\x9e\x26\xd8\xcc\x1b\xdc\x3e\xdb\xdb\x56\xe6\x17\x67\xa7\x35\xca\x9b\x52\x6e\x5b\x58\x93\x1d\x67\xe6\x0d\x3f\xd1\x03\xb3\x11\x3f\x03\x62\x10\xbe\xf2\x17\x58\x91\x57\xc8\x35\xa6\x51\xb1\xaa\x2d\xe6\xa5\x57\x5b\xc6\x3e\x8b\x08\xd8\x16\x10\x64\xb5\xd9\x58\xa4\x11\x7c\xe8\x88\xb6\xc2\x08\x80\xfc\x6b\x0e\xbe\x65\xc9\x98\xdd\xfe\xbe\x34\xef\x4d\x62\x44\xa0\x0e\xa4\xfc\x92\xe7\x54\xdf\xfa\xef\xa9\xae\x80\x15\x75\x9e\xe0\x93\xbd\x07\x2f\x0c\xfa\xaf\xb3\x5e\x47\xef\xfc\x09\x42\x77\x67\x16\xb9\xc8\xa4\x4b\xcc\xf2\xab\xb0\xd8\x75\xa4\xb9\xf8\xe4\x53\xce\x6f\x60\x96\x0b\x5b\x92\xb5\xa8\x21\x72\x59\x3e\x56\x89\x5a\xdb\xbb\x81\xa8\xb5\x4e\x4c\xdc\xff\xed\x72\x46\xcd\xb8\x1b\xeb\x8b\x23\x11\x41\x23\xb8\x47\x90\xe4\x3b\x22\xa3\xac\x2e\x9d\xfc\xa1\x6f\x04\x34\xd4\x64\xae\xf7\x10\x94\xde\xe5\x65\xb3\x09\x80\x5c\xab\x28\x3c\x74\x57\x5a\x8c\x49\x3d\xa6\x50\x9d\x18\x21\xbf\xef\xe5\x85\xa7\x24\x64\xc3\xe3\xb9\xc1\x14\x85\x01\x1d\xc4\x68\xbf\xa0\xdc\x74\x2d\xf7\x22\xbe\x40\x44\xdc\xfa\x23\xbc\xce\x58\xe5\x6a\xe4\xba\xb9\xf6\x7f\x7f\x27\x7e\x22\x3c\x57\xb8\xd2\x28\x16\x0a\x12\x5a\xea\xc8\xbd\xc6\x81\xcc\xe5\xe2\xcc\x71\x5a\x64\x36\xc7\xab\xf6\x88\xe7\xad\x74\x2f\x02\xe3\xa9\x17\x11\x20\xc6\x80\xf9\xc2\x97\x60\xc5\x9c\x2c\xe9\x8d\xd9\x24\x8b\x11\x05\x4c\x57\x74\x42\xc2\x9b\x88\x60\xc6\x78\x78\x92\xab\x04\x17\x80\xc5\x15\x0d\x80\x5d\xb8\xd5\x4c\xfb\xe6\x94\xde\xd2\x72\xdb\x4e\x77\xe0\x5b\xa7\x45\xfd\xf3\x1b\x01\x61\x07\x95\xb0\xe4\xb5\x27\xbd\x2b\x10\x32\xb1\x6b\x2c\xb0\x6f\x46\xa1\xcf\xca\x57\x95\x2e\x8c\x81\x1b\x43\xdc\x1b\x3f\x7e\x1d\x83\x43\x34\xa7\x2f\xbf\x94\x89\xbb\xee\x8b\xbb\x19\x73\x3b\x53\x9c\xc1\xde\x40\xb8\x5d\x16\xbb\x9b\xc1\x1c\x43\x79\xf6\x43\x14\xd2\x76\x8e\xe5\xdb\x46\x5c\x64\xb4\xa4\x1c\x83\x56\xff\xbc\x2d\xe3\x57\x64\xa8\x1a\xcb\x5b\x82\x8c\xcb\x70\x51\x82\xc1\xcd\x8b\xd8\x05\xd1\x51\xd4\xa8\x28\x72\x23\x12\xbf\xe1\xa9\x71\xbf\xc4\xfc\xbf\xfe\x4d\x6e\x99\x22\x34\x2d\x9c\x6b\x8f\xe4\x5d\xd7\xae\xe7\xdb\x2d\xd8\xfd\x26\xc0\x90\xac\x99\xec\x45\x37\xa6\xb7\xb5\x8f\x56\xbd\xf9\x8c\x6c\x32\xda\x3f\xb8\x7d\x58\xeb\x91\xeb\x4d\x96\x2b\x8e\xee\xd2\xeb\x49\xcb\x0a\x45\x03\x48\xdc\x5c\x51\xae\x7a\x45\x79\x76\x95\x2b\x4a\x2e\xfc\xd4\xbf\xa5\xb4\xc3\x2f\x59\x4b\x6f\x0a\xaa\x57\xbc\x3a\x2a\x84\xad\xdb\x12\x0c\x6e\xf5\xcc\x0a\x14\x5c\x31\x10\x84\x3e\x38\xc8\xf9\x70\x3c\x56\x73\x2b\x03\x41\x44\xb3\x56\x0c\x09\xe1\xc9\x04\x41\x5c\x88\xc0\xe3\x97\x49\x08\x4c\x1f\x0c\xc5\x9d\x3e\xd8\x36\xb7\x72\x10\x09\x81\x04\x96\x3f\x5b\x33\x28\x84\x90\xf3\xb8\x1e\xc7\x26\x83\x5e\x46\x0f\xb5\x54\xa9\xc3\x96\x3d\x9e\xde\x34\x2d\xd4\xd5\xe4\x2c\x35\x71\xad\xba\x47\x17\x3a\x00\xb8\x4a\xf7\x9f\x78\xec\xf5\xd6\x7d\xa1\xe6\xe6\x2a\xfd\x7f\xb5\x8a\xeb\x8a\x36\xa9\xdc\x02\xb6\xb6\x12\xca\x56\xfa\xe3\xde\x8f\xb3\xe0\x5a\x95\xa1\x59\x97\x87\x65\xad\x11\x41\xb5\x56\xf8\xd4\x2f\xa4\x6b\x62\x03\x2f\xd3\x04\xfd\x3b\x5d\xd0\x5b\x54\xfb\x7d\x6e\xe7\x7f\xff\x9b\x76\x66\x01\xb0\xed\x52\x73\x77\xbb\x7e\x36\x1a\x0e\xb3\xc9\x95\xef\xe6\xa3\xea\x33\x17\x63\xa8\x86\x50\xe2\xbc\xd1\xbf\x1a\x29\x11\xe1\xc7\x68\x21\xc7\x5b\x9b\x2b\x3d\x33\x74\x60\x45\x67\xf8\xdc\x5d\xec\x32\xef\x77\xd2\xe0\xad\x72\x97\x6d\x77\x9e\x2b\x68\x93\x56\xb9\xf1\xd6\xf4\x84\x97\xc0\x84\xa0\x04\x50\x9c\xa0\x14\x24\x7e\x76\x0d\xa4\x7f\xdf\x6d\xc7\xe9\x5d\x7e\x6b\x98\xd8\x4f\x00\xaf\x44\x87\xb9\xae\x99\x44\xcc\xac\xc1\x33\x8e\xb8\xb2\x11\x85\x23\x73\x15\xfa\x56\xe6\x30\xb2\x9e\xce\xb5\x8e\x12\x74\xf8\xef\x71\x71\x5d\xeb\xa6\xfa\x8b\x5e\xd6\xae\x70\x3d\x5e\xd6\xbd\x45\xf3\xf2\x08\xc2\xb1\xbb\xf1\xe8\x40\x62\xfe\x8a\xd6\xe3\xb1\x6a\x20\x22\x3c\x52\xad\xfb\xf6\xeb\x18\x0e\xbf\x6c\x2f\x1f\x4f\xc4\xf9\x51\xb8\x51\xd6\x18\x57\xa5\x24\xc6\xb8\x81\xe5\x17\xea\x9e\x7c\xb5\xee\x43\x8e\x37\xf2\xd5\x8d\x7c\x75\x25\xf9\x6a\x45\xc9\xea\x4b\xcb\x54\x9e\x8b\x4a\xb9\xb4\x54\x57\xa4\xfa\x1d\x5f\xbb\xa8\xd1\xef\xeb\x6b\x7d\x13\x83\xe9\xb1\xab\xa4\xd1\x9a\x2f\x5d\xd4\xb2\x58\xd0\xc1\x9c\x7f\x77\xa3\x06\x0f\x6f\x56\x79\xbd\xc2\x97\x51\xcb\x9e\xa7\x90\xe9\xc1\x2b\x1a\x76\x2e\xfe\x87\x08\xba\x9f\x45\xc4\x05\x57\xb0\x47\xa7\x68\x21\x01\xdc\xea\x68\xa2\xd8\xb4\xd1\xbc\xe1\x5d\xe5\x09\x8b\xcc\x96\xf0\x59\x75\x95\xb5\xec\x0a\x85\x30\x49\x9f\xda\x2e\x72\x5f\xa0\x76\x5e\xd6\x96\x29\xb5\xbc\x39\x5a\xea\x25\xad\x61\x21\xde\x56\x44\xb8\xb8\x6e\xb3\x93\xfa\x36\xed\x96\x6b\x66\x43\x10\x10\xa4\x83\x77\xa7\x33\x08\x31\xf7\x98\x5a\x62\x63\x2c\x95\xce\x23\x37\x1e\xb4\x23\x03\x41\x1b\x06\xdc\xe5\xa3\x04\x74\xf8\x23\xc9\xda\x7e\xe8\xf6\xb7\x91\x51\xad\x21\x6d\x9b\xe3\x48\x48\xdc\x26\xd1\x2f\x19\x48\xde\x36\x31\x5a\xd2\x97\xc0\x45\x06\xaf\x61\xce\x26\x5e\xd8\xa4\x79\xe5\x02\x10\x4c\x5a\xac\x9c\x0f\x00\x4f\x77\xe5\xb9\xd7\xee\xdb\xe8\x35\x9f\x0b\x56\x25\xa7\xd4\xa5\xf9\xe5\xf0\x8d\xc6\xb7\x72\xb3\x73\xbd\x03\xee\x57\xae\x79\xc0\x84\xcf\xae\x99\x10\xd8\x12\x53\x4d\x98\x95\x77\x9f\x4c\x45\x21\xd6\x8f\x92\xcc\x2a\xd9\x2f\x56\x9c\xcf\x36\xa4\xd8\x49\x45\x0d\x87\x9d\x3a\xf7\x05\x17\x7b\xa0\xfb\xc0\xb9\x58\xc5\x94\x0b\x6e\xd6\x57\xd6\x29\xb0\xe5\x27\xa9\xc9\xb7\xe0\xd2\xa9\x2b\x19\x61\xcd\xaa\xf4\x0f\x6b\xaa\x18\x2a\x4d\xb3\x9c\xb2\x41\xaa\x18\xdc\xa8\x02\xcd\x82\x18\x5d\x68\x8e\x61\x87\xbd\xdc\xdf\xdd\xd3\xff\xf5\x22\x97\xe2\x5f\xe6\xa9\x92\x98\x77\xbc\xbe\x05\xd7\x76\x06\x1c\x54\xeb\x23\x9f\x94\x3f\xc5\x50\xf6\xfe\x42\x79\xab\x7c\xbe\xc8\x76\x80\x0d\x77\x26\xde\x52\x40\x4c\x8c\x6a\x49\xaf\x4b\xcb\x17\xbe\x85\xb3\xfc\x1d\x9c\x65\x6f\xe0\x88\xd3\x75\xa9\x61\x47\x80\xff\xf2\x76\x8a\x7f\x45\x18\xdf\x98\x1e\x46\xd8\xce\x70\x53\x95\x77\x14\xfd\x98\xa9\xf3\xae\x1a\x03\x80\xbd\x07\x12\xc4\xc4\xaa\x8c\x3e\x5e\x15\x00\x2b\xa6\x9c\x7b\xcd\xe2\x96\xc7\xd0\x65\xb5\x60\x60\x6b\x47\x00\x5b\xa9\xf7\x65\xf1\xc0\xae\x1c\x04\xac\x16\x34\x75\xe2\xf2\xe9\x28\x5d\xf8\xc2\x42\x1c\x28\xf9\x82\x45\x10\xe7\xad\x3a\x16\x5f\x09\x9c\xb2\x5f\xda\xb8\x2e\x68\x37\x0f\xc5\xc8\x62\xc1\x19\xfc\x09\xc6\xb8\x2c\x68\xdf\xf2\x31\x5e\xa7\x5e\x76\x79\xc8\xbf\x15\x26\x25\x16\xee\x2f\xa6\xc4\x5d\x25\xd2\xdf\xf5\x4e\xc7\x52\xbd\x6e\xfd\x40\x81\x57\x9a\x17\xbd\xb1\x56\x50\x04\xaf\xa1\x02\xde\xb9\x71\xa1\xfa\xd2\xfa\xcf\x55\x94\x9f\x5f\xdc\xab\xa9\xfe\x63\xc2\xea\x5c\xcd\x86\x14\x3e\x65\x69\x31\x32\x17\xab\xd4\xa4\x6a\x63\x80\xaa\xa8\x0b\x37\x2f\x0c\x2f\xf7\xf2\x5a\xaa\x50\xfd\x23\xbc\xf5\x2b\x50\x87\x6b\x35\x05\xb2\x08\xf5\xa8\x09\x07\x61\x94\x75\x26\xa3\xfa\xd5\x5f\x5f\x7b\x6a\xb8\xd9\x6b\x53\x88\x06\xe3\xe4\x46\xc7\x32\x2f\xd2\xf7\xb5\x6a\x4b\xd7\x51\x95\x2e\x57\x01\xfa\x0a\xb8\x40\xed\x27\x0b\x44\x62\xed\x35\xb6\x9c\xbe\x30\x18\x83\x36\x0a\x82\x47\x6b\xdf\xcd\xf3\xe9\x5f\x17\xf3\x39\x89\x4b\x53\x1e\x98\x42\x5b\xcb\x36\x7a\x5b\x5b\x7f\x66\xc9\x56\xe5\x38\x4e\xa7\x05\x90\xcc\x81\xfe\x19\x94\x39\xa0\x6e\xc4\x03\x6d\x38\x69\x3f\xa4\x97\xea\xe4\x82\x98\x63\x80\x79\x41\x14\x0d\x78\x70\xf5\x90\xd0\xc7\xcd\x89\xb3\x5b\xb2\x4b\xcd\xf0\x16\x84\x12\x3f\x47\x47\xb9\x14\xee\x07\x3a\xb6\x86\xea\x3a\x5d\xcc\xf3\x46\x68\xc7\xf4\xf7\x98\x21\x93\xc9\xfc\xd5\xd4\xf3\x21\xc6\x51\xfd\x32\x4b\xa7\x53\xd8\x42\xd7\x02\x34\x75\x24\xdd\x24\x7c\x6b\x2d\x66\x7c\x25\xc0\x8a\x89\x8f\xd7\xaf\x4b\x75\x2e\x11\x6f\xa5\xa2\x61\x55\x7d\x2b\x1f\xb8\x2d\xc7\x12\xbd\x92\xd6\x57\xf9\x6d\x30\xa3\x9f\x45\xab\xa7\x47\x85\xe6\x46\x5c\xc3\xc7\x20\xb4\x9f\xc6\x2b\xba\xb6\x42\x6d\x7d\x65\x5a\x85\xfe\xc2\x96\x99\x03\x3c\x09\x8b\x62\xc0\x36\x22\x40\x5e\x92\x05\x81\x94\x13\xf1\xfa\x81\xc5\x88\x3f\xd6\x73\x0b\xd6\x6f\xe8\x0f\xf4\xd4\x82\x71\x84\x2a\x7f\x66\x61\x45\x57\x43\x71\x29\xa1\x37\x13\x69\x53\x90\x11\x67\x19\xfb\xa2\x1b\x51\x03\x1e\x72\xb0\x41\xb2\xbd\xb7\x1c\xcc\x7a\x73\x95\x9e\x2d\x1b\xbc\x0a\xcb\xee\xc5\xe2\x3d\xe8\x3d\xe0\xf5\xa1\x31\x31\xe8\x83\x4a\xaf\xde\x8b\xde\x78\x5e\x2f\x1a\xa9\x83\x5e\xa8\x74\xd8\x8b\xa5\x98\xfa\xc7\xe6\x66\xf2\xfc\x24\xb9\xc8\xd4\x2a\x2c\xd4\x2a\x4e\x54\x6b\x0a\x21\x87\x49\x9a\x70\xf7\x89\x24\x65\x49\x70\x5a\xb5\x93\x61\x8e\x85\xe1\x15\x93\xf3\x29\xbe\xc1\xa2\xc1\x56\x65\x2f\x15\x38\xea\xb4\x25\xaa\x7c\xf3\x8c\xc4\x95\x9f\x91\xa0\xeb\x46\x44\x5a\xb0\xf1\x45\xd4\x2a\x73\x2d\x43\x95\xe4\x10\x71\xc0\x44\x5e\xaa\x69\x5b\xc8\xd4\xc0\xb8\xe8\x46\x8a\x8c\x10\x4c\x8a\xb7\x1a\x14\x70\x2d\x8c\x26\x63\x95\x60\x0f\xae\x48\x13\x54\xc2\x1e\x82\x5e\x1b\x30\x62\x76\xbe\xb8\x19\x94\xa0\x55\xdc\x97\x24\x70\x23\xf5\x9e\xf1\x34\x1f\x03\x0f\x4a\xed\x1a\x44\xc7\x92\xe3\x6d\x92\xea\x66\xe1\x2a\x46\xcb\xcc\x2e\x29\xf4\x89\x87\x9f\xd6\x15\x2f\x58\x94\x4f\x6d\x9f\x54\xd8\x6f\x73\xed\xd2\x12\xb7\xf2\xf6\xe2\x42\x4e\x2c\x56\x75\xaa\x1b\xad\x45\x42\xa2\x50\x12\x60\xca\xce\x2c\x4d\x7d\x4b\x04\xc4\xe3\xab\xba\x6c\x12\xe4\xec\xc6\xe6\x57\x47\xe5\x0d\xe7\x77\xe9\x0c\x47\xe7\xf8\x8a\xb3\xac\x89\x25\x4b\x71\x8f\x70\x97\xbf\x1b\xe7\xa1\x29\x36\xb1\x1f\xdb\xa3\x35\x6e\xf0\xf8\x8c\x85\xb3\x45\xc4\xf5\x82\x78\xea\x86\x1d\x94\x31\xd6\x67\x0c\xb7\x1b\x17\xdb\x0d\x26\xe9\x6a\x5b\x02\x68\x7b\xc7\x5c\x9d\x4a\x08\xac\x90\x72\xdd\x3b\x85\x45\x8f\xa8\x5e\x41\x8e\xfb\x61\x3a\xad\x51\xdb\x3f\xe6\xc3\x7d\x65\xb5\x00\x0e\xdd\x6f\x59\x24\x10\x17\x75\xec\xbc\x0e\x6f\xeb\xf8\x61\x0e\x31\x2a\x3c\x61\x3a\x72\x7b\x05\xa5\x9c\xb7\x6a\x10\x5d\x06\xb2\xe3\x5e\xa6\xde\xfd\x41\xe9\xc5\x82\xa7\xa5\x70\xd7\x6f\x3c\x86\x8d\xef\x73\x5a\x11\xd0\x86\x19\x28\x45\xb5\x0c\x25\x33\x06\xd3\x5e\x32\x5f\xc8\x60\xad\x33\x5b\x71\x0d\x48\x14\xb6\x52\x9d\x4d\x9d\x99\x62\xfa\xbc\x8a\x0b\x4f\xa6\xce\xab\xb8\xf4\xf4\xb4\x79\xd1\x8b\x4f\x57\xda\x29\xf4\x7c\x0d\x7d\x58\x46\x36\xc8\x53\x45\x59\xa6\xd0\x63\x65\xdd\xd3\xb0\x62\xe5\x83\x39\x2a\x82\xe9\xa9\xb8\xfa\xfc\x18\x13\xfd\xb5\xf2\xe1\x53\x9b\xe3\x36\xbf\x0b\x2d\x41\x20\xa3\xb3\x8b\xa2\x90\xe6\x6c\x23\x48\x04\x49\xab\xdd\xe3\xad\xf3\x76\x53\xed\x37\xb4\xca\x1d\x21\x96\xde\xbd\xad\xfd\xa6\x54\x9d\xd7\xb2\x6a\xc0\xb5\xec\x32\x6c\x6d\xf8\x56\x79\xf3\xaa\x1c\xce\x25\x77\xd5\xbf\xf7\xab\x55\x9f\xf9\xc9\x2a\x7f\x6b\x7b\x70\xb8\xc7\x5a\x63\xaf\x4a\x7a\x76\xa7\xc1\xf3\xfa\xfe\x75\x65\x5c\xc3\x7e\xf5\x87\x64\x05\x6c\x62\x70\x4b\x63\x10\x54\xcd\xaa\x7b\x7d\x1b\x05\xa5\x65\x03\x8d\x82\xd6\x50\x65\x1b\xfc\x45\xb5\xaa\xe9\xa8\xe8\xa3\xd6\xc3\x00\x6b\xdc\xa5\xee\xde\xb8\xd3\xdc\xb8\xd3\x7c\xe1\xeb\xe4\xfa\x97\xc9\x5f\xfa\x2a\x39\x9f\x1c\xe6\x8b\xc1\xd9\x61\x1a\x89\xa5\xef\x6e\x2d\x75\x94\xe4\xaa\x6b\xdf\x7c\xf2\x70\x00\x31\xce\x97\x5f\x7e\x56\x5f\x58\xeb\x5b\xa4\xaa\xae\x74\xcc\x99\x78\x91\x5b\xd7\x76\x3b\xea\x46\x64\x6b\x9a\x24\xa8\xf2\xc9\xf1\x8a\x6e\x0a\x59\x49\x93\x88\x65\x89\x5f\xbb\xc6\xdb\x14\x5c\x11\x77\x5f\x81\x9f\x2e\xd7\xc0\xc9\x2d\xac\x29\x85\x97\x31\x10\xf2\x52\x26\x8d\xdd\x1b\xd4\xb2\x9a\xae\x8a\x75\x8e\xeb\xe5\x72\xb5\x8a\xdb\xe4\xe2\x82\xbb\x5c\xfc\x5c\xef\xe6\x05\x27\x81\x0c\x9c\x69\xb0\xf4\xdb\x0c\x29\xb4\x66\xd6\x01\xce\x11\x20\xf8\x81\x7d\x57\xf9\x76\xfb\x5c\xbb\xc6\x00\xbd\x8b\xf7\xb4\xc0\xde\x01\x0b\x46\x2b\xb5\x0f\x16\xb3\x02\xee\x64\x1b\x53\x78\x2a\x3c\x73\x66\xc8\x3c\x76\xc2\x20\x13\x59\xfe\x1b\x69\xe7\xa3\xe1\x90\x29\x02\x8c\xac\xb0\x73\xcf\x76\x42\xf7\xbe\x76\xad\xbe\x4b\x1a\xb3\xd3\xe3\xb4\xd9\xdf\xdd\x6d\x9b\xff\x7a\x2d\xb8\x1e\x0c\xd3\xb7\xba\x77\x5a\xb6\x69\x35\xb7\xa0\x0d\xc0\x00\x0c\x13\xd7\x23\x0b\xe6\xb0\xc3\xd3\xcc\x03\x10\xbb\x5b\xf6\xce\x56\x44\x71\x18\xd1\xed\xbc\x68\xe7\x59\x7a\x3e\x1a\x1b\x77\xef\xc8\x7d\xb9\x4a\x50\x85\x6c\x41\x77\xcb\x5b\xf9\x30\x82\xa6\x1b\xf8\x0f\xed\x36\xa7\x98\x5d\x47\xc3\xe4\x8c\x64\x8d\x01\x37\x0f\x1b\x2f\x74\x3b\xec\x82\x95\x91\x02\x12\x19\xc9\x58\xd5\xee\xb4\x4f\x56\x7d\x82\xc8\x1a\x28\x4e\x64\x71\xce\xc2\xc9\x1c\x67\xca\x29\x18\x31\x9b\xcd\x52\x11\xbb\xdb\x89\x36\x72\x5b\xca\x53\xad\xc1\x51\xdd\x59\x93\xa3\x2a\x3f\x70\xcd\xb9\x79\x98\x9d\xab\x8d\x35\x5f\xc1\x18\xcb\xd4\x68\xac\xfe\xc8\x85\x59\xdd\x06\x6d\xaf\x06\xb3\x43\x68\x98\x9b\xf3\x46\x78\xdd\xaf\xa9\x86\x6f\xf8\xd0\x30\xef\x7f\x34\xf8\x03\x20\x36\xd7\x6e\xfe\x06\xdb\x25\xe6\x94\x88\xf1\xe7\xa1\x5f\xda\x50\xa5\xcc\x33\xa3\x5f\x24\xa0\xf7\xa3\x79\x06\x7a\xa3\xe9\x5e\x67\x3f\x7c\x94\x38\xcf\x6c\x19\x2a\x23\x26\x94\x23\x9a\x59\x29\x42\x38\x0f\xa5\xee\xd6\x41\xa9\xa6\x63\xbb\x55\xff\x83\xac\xb8\xe1\xdc\x6f\x38\x77\x47\x48\x36\xd3\xe1\x30\x9f\x14\x2c\xe4\x3d\x23\x27\x32\xd8\xbd\xa5\x1a\xba\xec\xf3\xc9\xbb\x47\xe9\xcc\xe3\xf2\x47\x93\x77\x9d\xe3\x74\x76\xe5\xd8\xfb\x8f\xd5\x18\x67\x60\x03\x55\x5a\x6f\xc0\x4a\x70\x72\x58\xd4\xa7\x83\x45\x95\x20\xd1\x16\x30\x7c\x9e\x78\x67\x78\x8a\x43\x37\xa9\x62\x27\x66\x95\x6f\x70\x11\x25\xd1\x44\xd0\x88\xff\x68\x75\x5d\xed\x9c\x3e\xc2\x55\xaa\xd1\xb4\x5a\xe1\xe7\xf3\xec\xbc\x1e\x34\xd7\x27\x40\xc4\x47\xb4\xe5\xcb\x02\xab\x9b\x37\x5a\xa6\xfa\x07\x35\x05\xcc\xa2\xe7\x67\x93\xc6\x0e\x8e\x16\xbf\x55\xc6\xb6\x9e\xeb\x08\xd9\x8c\x70\xc7\x20\x95\x6c\xd3\x47\xa1\xec\xb6\x83\xb1\x50\x10\x9b\x61\x8c\xe7\x5c\xec\x53\x5d\x92\x03\x94\xec\x49\x48\xbe\x71\xe6\x8a\xe9\xf1\x63\x8c\xd2\xd5\x52\x0d\x89\x32\xf1\x69\x7b\xfa\x3e\x9b\xfc\x42\x7c\x1f\x9f\x33\x9b\xec\x2f\xcc\x34\x9d\x15\xd9\x73\xd5\xfe\x85\xa2\x5a\xf9\x45\x17\x9f\xa9\x3f\x9f\x2e\x14\x94\x88\x12\xda\xa7\x0d\x2c\x38\x9e\xbc\x7c\xf1\x63\x3e\xcc\x10\xee\x56\x0b\x4a\x1a\x8a\x85\x93\xdc\xd4\xa7\x7e\xab\x9d\xf4\xb6\x5a\xd2\x5c\x54\x0f\xc2\xb3\x18\x75\x43\x8b\xdc\xdc\xd4\x8c\x9c\xfc\x49\xef\x54\x6d\x51\xfa\xcb\x68\x3c\x7e\x9d\x0d\x32\xc5\x58\xf8\x18\x5a\x5a\xa6\x39\xc9\x2e\x5e\xd1\x32\xd4\xc5\x25\x5b\x83\x31\x26\xde\xba\x97\xfb\x6b\x78\xf8\x52\x82\x1d\x0e\xa8\x4f\x81\x97\x49\x2d\x51\x39\xee\x04\x79\x75\x7b\xc4\x18\x19\x63\x15\x62\xd9\xc1\x7e\x13\x43\x75\x95\xe3\x7b\xce\xd5\xb5\xb4\x8d\x57\xb1\x89\x75\x65\x6f\x45\xfa\x7e\x91\x02\xb6\x49\x11\x65\x42\xf2\x28\x2a\x84\xd9\xd7\x60\x1b\x19\x9b\x3c\xc8\x88\x4d\x0c\xa5\xdb\xd1\xcb\xf7\xc9\xf4\x80\xf4\xef\x10\x56\x29\xd1\x63\xc8\x85\x9f\xd3\xd9\x08\xce\x3e\x8b\x1c\xd5\x76\xdb\x45\xc4\x8c\xd2\x62\xbc\xd7\x25\xb7\xe7\xa5\xb7\xfa\x84\x41\xb3\xb5\xb8\xde\x5a\x6a\x39\x1d\x8a\xf9\x51\x53\x6f\x3e\x9c\x72\x4b\xef\xea\xe0\x8a\x9e\x06\x23\x6e\x19\xbc\xe6\xb1\xa3\x5a\xfc\x59\x6b\x80\x3c\xb2\x21\xca\x3c\x26\x7c\x48\x28\x5e\x7f\xa0\x1e\x52\x73\x93\x6c\xc6\x4e\x8a\xdb\x49\xe3\xcf\x0d\x56\x01\xc2\x50\x82\xc9\xac\x62\x2c\x07\x4d\xb0\x85\xa5\x16\x54\xb1\xaf\xad\x85\x3b\x5d\x38\x08\xda\x04\x05\x5a\xbc\x9d\x39\xe7\xb7\x84\xaf\x74\xcc\x41\x5a\x95\x6e\xd3\xa3\x0a\xd2\x56\x48\xa5\x07\x66\x97\x68\x95\xb8\xa1\x86\xb0\xd1\xf2\x2d\xef\xa0\x38\x13\xdb\xd1\x40\xc1\x4c\x9f\xfa\xad\xc5\x9c\x6e\x36\x79\xdf\xfd\xf1\xe5\x93\xa7\x6f\x9f\xfe\xf8\x33\x5a\x2a\x35\x54\xce\x70\x81\xb0\x78\x26\x8e\x0a\xb1\x8b\x1c\x64\x2f\x30\x94\x6b\x22\x6b\xa8\x15\x72\xd0\x4f\xa2\xb8\xf1\xe4\x38\xcb\xe0\x6c\x2c\x8a\x6c\xd8\x4e\x8e\x17\x73\xd4\x58\xdb\xe7\x23\x60\x62\x92\x61\xae\x70\x1e\x0c\x16\xcf\xd2\xf7\x59\x92\xb2\x16\xba\xc9\x8f\x59\x36\x34\x6d\xaa\x41\x60\x0f\x8a\x1a\x9f\xe6\x0a\xcd\x1b\x58\x7b\x9e\xab\x3e\x54\x2d\xc3\xd7\x66\x43\x77\x40\x75\x1b\xc2\x36\xd0\xfe\x74\x18\xa1\x1f\x61\xb0\x33\x63\x09\xf7\x77\x65\xd1\xdd\x0d\x3b\xdf\x16\x33\x81\xce\xc9\xde\x8b\x18\x5c\x27\xfd\x36\x38\x9c\xf8\xaa\x3a\x18\xdb\x49\x08\x0b\x30\x35\xce\x5a\x8c\x99\xe2\x96\x1b\x68\x60\xdb\xd7\x07\x9f\xb0\xdc\x51\x24\x89\xce\xdb\xa0\x39\xae\x26\xe3\xe9\x5c\x73\xf5\x56\xa8\xae\xd4\x74\xea\x1c\x37\x05\xe5\x06\x5f\xb8\x73\x14\xbe\x03\x79\x88\xa1\x3e\xb8\x30\xe8\x74\xb7\xec\x31\x1c\xcd\x27\xe3\xcb\x24\x1d\x0c\xb2\xe9\xbc\x40\x84\x7c\x6c\x30\xa6\x48\x14\xce\xda\x07\x0e\x92\x67\x40\xec\xc8\x79\x05\xfa\x05\x7c\x33\xf9\x09\x49\x0b\x98\xd9\x34\xc8\xdc\x43\x92\x91\xe4\x84\xa9\x0d\x3f\xde\x80\x55\x93\x79\x47\xb1\xa1\x77\x31\xd2\x01\x3b\xb0\xd3\x2b\xc1\x47\x92\x25\xdd\x52\x8f\x31\x24\x2f\xfc\x1d\x53\x5d\x7a\xb6\x22\x9c\x0d\xf8\x04\x48\xe6\x99\xab\x52\xbe\x3d\x7b\xcc\x51\x1f\x3f\xd1\xbf\x8b\xa7\x93\xca\x3d\x31\xe7\xcf\x67\x54\x97\x96\x5a\xd2\xb6\x98\x62\x74\x35\x0b\xbc\xe5\xe1\x04\xfc\x31\xb7\xe3\xb3\xd0\xe2\xc6\x72\x40\xfb\xf5\xc7\xd5\xe0\xb2\x6f\x08\x44\x17\xea\x13\xef\x93\x4a\x5c\x4b\xaf\xb1\xd9\x88\xb2\x5b\xfe\xa0\x35\xc5\x35\x40\x30\x3d\x9e\xf7\xf0\x85\x65\xe8\x23\xcf\x5d\x18\xa6\x7e\xba\x9a\x98\xe1\xb3\x0d\x85\xc7\x36\x77\x7a\x1a\x33\x5f\xc7\x5f\x48\x91\x04\xb9\xce\xd9\xec\x0b\xaf\x70\x2c\x7b\x07\x30\x3f\x4b\x7d\x80\x46\x8e\x63\xe7\xd1\x4a\xf8\xee\x29\x7c\xe6\x5e\xaa\xf9\x1d\x69\x8d\x68\xfa\x5d\x66\x93\xa9\xf0\xd3\xe3\x2b\x2a\x01\xcc\xd9\x90\xf0\xb1\x9a\xc4\x72\x09\x0f\xb8\x0f\x3f\x09\xc8\x1e\xfd\x32\x8e\x69\x65\xc4\xd1\xb4\xcf\x5f\xdc\x32\x6d\x81\xfe\x2b\x2b\xe6\x8f\xd5\xb0\x4f\x33\x6f\xa8\x42\x61\xbd\x4c\xb4\x34\x03\x33\xa7\x93\x1b\x9e\xbd\xb6\x35\x6d\x86\xe8\x5c\x82\xc9\x11\xdc\x59\x63\xde\x35\x36\x84\xca\x92\x1a\x18\x98\xec\x95\x4f\x2d\x14\xb7\x58\x58\x75\xa9\xa3\xe4\x97\x4f\x2d\x52\xb5\x42\x63\x6d\xab\x73\x7c\xab\x39\xca\x46\xab\x65\xee\x7d\xb4\x9a\x73\x63\x4f\x89\x1d\x1b\x71\x9d\xe4\xc6\xde\x9d\xed\x5a\x0f\x88\x18\x46\x0c\x1e\x0e\xb9\xd3\xde\x30\xbd\xa9\x4f\xf3\x8c\x88\x56\xd2\x6e\xec\xf5\xfb\xdb\xa8\xf9\xbf\x77\xa3\xf9\xbf\xd1\xfc\x5f\xd7\x2b\xba\x20\x02\xbf\x48\x27\xa3\xe9\x62\xac\x3d\x00\x99\xde\x7f\x31\x1f\x8d\x01\xaf\x55\x99\xce\xb9\x2b\xb4\x5c\xbf\xbf\xe4\x69\xdd\x59\x3a\xa1\x9b\xbf\x42\xd6\x22\x7e\x64\x73\xee\xf2\x4d\x95\x9f\x26\x23\x45\x03\x9f\x0f\x63\xf0\x2d\x30\xaf\x33\x1a\x9a\xc2\x4f\x27\x8a\x52\x0e\xb2\xe1\xa1\xc2\xed\x54\x0d\x57\x56\xca\x74\x6e\x67\xae\xb3\xf1\xfe\x60\xf3\xeb\xaf\x6f\x25\x5f\xd3\xab\xc2\xb0\x38\x46\x80\x1b\xa1\xdc\x36\x1a\x6a\x09\x4d\x33\xea\x4a\x3c\x53\xc3\x1b\x0d\x95\xc8\x36\x51\xbf\xa6\x8b\x79\x57\xd5\x86\x06\xfe\x73\x9a\xce\xd2\xf3\xe4\xf0\x2c\xd3\x0d\xa8\x7a\xf8\xaa\x50\x17\x73\x69\x8d\x14\xbb\x3e\x23\x51\x50\xb1\x81\x09\x59\xe5\x80\xa8\xf8\x5e\xb5\x38\xb4\x5d\xb6\xb5\x29\x24\xf2\x8a\x17\xa3\x22\x83\x26\x36\x1d\xca\x6a\x6f\xc7\x26\x3b\x86\x39\x19\x85\x1d\xec\x68\xe6\x96\xa2\x6f\xfa\x96\x44\x0d\xfb\xd9\x28\x43\x8f\xca\x5a\x57\x25\xa6\xfc\x97\x36\xbc\x42\x59\xa7\xc6\xdd\x05\x96\x03\x28\xab\x6d\xa2\x4e\xc6\x79\x3a\x87\x07\x3f\xc0\xac\xa0\x46\xb3\xa2\x7c\x8d\xe6\x95\xd8\xf1\x4b\xdc\x32\x8b\x45\x07\x19\x4d\xe6\xf1\xa6\x94\xdc\xf6\xf2\x04\x7e\x36\xdf\x94\xf4\x12\x54\xc9\x88\xd9\x3d\xd2\x9c\xf0\x28\x62\x34\xc6\x01\x44\x34\xad\x31\x6e\xf4\x5c\xf8\x01\x2d\x5c\xaa\xe2\x92\x3c\x1a\x2f\x96\xc5\x1a\x41\x7e\xa5\xba\x0c\x06\xe5\xff\x5b\x76\xf9\x24\xbf\xa8\x0c\x0a\x92\x4f\x9e\xe5\x83\x45\x51\x5d\xa4\x46\x3b\x33\x7c\xbc\xb5\xea\xca\x0c\xe8\x70\xf5\x44\x82\x16\x63\x06\x26\x40\x35\x26\xd3\x96\x45\xf0\xbf\xd0\xad\x1a\x43\x45\x11\x45\x84\x86\x86\x86\x15\x56\x26\xa2\x09\xe9\x19\x2d\x26\x83\xe1\x31\x6d\xe6\x08\x0c\x3c\xa7\x3c\x62\xb1\xaf\x2f\x8e\xdf\x96\x8d\x8a\xd7\xf3\xb1\x79\x3b\x07\x3f\x22\xa0\xac\x71\xf9\x17\xde\x6b\x70\xad\x58\x24\x95\x3e\x45\x74\x88\x38\xc4\x8c\xdc\xb0\x66\x6c\xaa\xb5\x40\x4b\x8b\x9f\xc9\x0a\xd3\xd0\x69\x21\x34\x29\xe2\x2c\xd3\x87\xb4\xb0\x3f\xdb\x6c\x56\x1c\xf9\x68\x25\x5e\x44\x5a\x62\x37\x4c\x91\x89\xbb\xb6\xc0\x2c\xe6\x0c\x88\xdc\xb1\x3d\x19\x0d\x5f\x78\xb7\x79\x41\x5e\x53\xd8\x62\xbd\x5d\xb8\xd3\xdc\x1c\xec\x4a\x3e\x98\x80\xbf\xb2\x0e\x70\x7d\x3d\xf7\x78\x1a\x47\xc5\xab\xac\xd9\x05\x22\x0b\xf1\x6f\xb4\xc0\x26\xcd\x2d\xa2\xca\xb5\xb5\x5d\xaa\xf3\x48\x70\x99\x16\xa9\xd4\xf2\x84\xa9\x5d\x21\xe1\x27\xae\x84\xe8\x40\x96\x16\x12\x1d\xc5\xcc\x2c\xac\xe4\x04\x15\x44\x5d\xc9\x31\x36\x1b\x16\x29\x1a\x22\xea\x26\xb5\x50\xaf\xb6\x57\xf3\xc7\xec\xe2\x09\xc3\x4d\x51\x9f\x23\x2d\x89\xb1\x6e\x47\xf0\x3c\x26\x35\xfb\xa3\xe1\x93\xa3\x97\xc1\x14\x01\x0d\x82\xc6\x78\xd7\xa5\x8f\xf5\x7a\xba\x5c\x70\x03\x3e\xd8\xb5\x1a\x8f\x36\xe9\xcd\xc2\xaa\x0d\x8b\xdd\x2d\x56\x98\xd0\x89\xda\xf0\xbd\x63\x6c\xba\xd8\xd4\x35\x63\x22\x55\xdd\xec\x2e\x0f\x2d\xcf\x48\x3c\x2b\x27\x29\x7f\xcc\x08\xf8\xa3\x3d\x57\x64\x00\x26\x66\x1e\x7b\xc7\x29\xd4\xc8\xdd\x56\x87\xc4\xea\xef\xc4\x82\x25\x11\x32\xd9\x23\x0d\xec\x76\x51\x09\xab\x28\x75\x7f\xf7\x4e\x78\x15\xa8\x89\x23\x9c\x6b\xf0\xde\x71\x4b\x71\xdd\xfd\x1d\xd0\x6e\xeb\x86\x7c\xae\x4e\x35\x78\xb7\x9f\xc0\x15\x62\x2b\x76\xd9\x47\xae\xbf\x9d\xe3\x71\x0e\x71\xa2\x6d\x01\x63\xba\x18\xb3\x5c\xbc\x92\x0d\x2f\x44\x9b\x30\xd2\xcf\x1e\x97\x94\xba\x59\x5a\x64\x2f\x17\xf3\x66\xa3\xbf\xb5\x75\x5e\x60\xfc\x6b\xb2\xc2\x74\x61\x94\xf9\x09\x25\x9e\xba\xab\x84\xf6\x58\x07\xc6\xdf\x6d\xc7\x56\xab\x5f\xb2\x5a\xbd\xbe\x58\xad\x01\xbb\x6b\x25\x8a\xe9\xdd\xae\x2e\x1b\x56\x30\x0a\xe0\x95\x4b\x06\x91\x1e\x17\xf9\x78\x31\xe7\x83\x90\x98\x24\x61\xcb\x21\x6a\xd6\x5c\xad\x45\xaf\x04\x5e\xe8\x6a\x55\x70\xc3\xf9\xeb\xf5\xfd\x21\x20\xcb\xcd\xc7\x30\x4f\xa7\xdf\x2b\x18\xc7\x00\xa7\xbe\x9d\x26\x6b\xf3\xad\x36\xfe\xaf\xd5\xa8\xbe\x06\xaf\x5e\xc8\x25\x97\xe4\xf1\xb0\x63\xbe\x1d\x7b\xa9\x81\x7b\xd9\xcd\x7a\xf9\x85\xba\x9e\x63\x7d\x1c\xe8\xd7\x8e\x91\xfb\x82\x6a\x26\xe1\xd0\x3c\xa2\x90\x98\x06\xed\xb3\x0a\x12\x21\x59\xd4\x3c\x7f\xa2\x2d\x9b\x1d\x3e\xfb\x10\x19\x86\x7c\x0e\x82\x9e\x82\x80\x47\x21\xe8\xf2\x1b\x87\x14\x7b\x04\xa2\x1a\x01\x4b\x63\xbb\x51\x37\xcc\x40\x21\x62\xf2\xf0\x22\xff\xed\x11\x33\xde\xd7\xd4\x41\x58\xef\x4b\xf3\xfe\x78\x09\xb3\xd2\x5b\xa5\xf3\xf3\xf0\x64\x9e\x95\x91\x86\xfa\x83\xaa\x7a\xa2\x72\x51\x64\x33\xd2\x0d\x87\x33\x6f\x1d\x3d\xf4\x71\x58\x3d\x4f\xde\x3a\x0d\xd5\x0f\x85\x3e\x7d\xb1\x50\x01\x12\x95\x8e\x5c\xcb\x8f\x3e\x7a\x78\x68\x20\x09\x07\x43\x03\x83\x9b\x27\xd0\x4c\x8c\x56\x9c\xe4\x33\x6c\x66\x90\x8e\xb3\xbf\x37\xc5\x4e\xae\x4d\xfa\x0c\x07\x8f\xff\xea\xcb\xb9\xcc\x04\x2f\x2a\xbf\xbf\xc3\x22\xfa\x35\xfa\xae\xd3\x9a\xe8\xe3\x5c\x17\xb2\x13\x51\xdd\x96\x2d\x66\xda\x93\xd2\x6e\x4b\x02\x27\x4e\x53\xd1\xb0\x66\x48\x8c\xe9\xbd\x22\xb0\xec\x7e\xb7\x94\x56\xcf\xf3\xe9\x5e\xb2\x7d\xcf\x39\xb4\xe8\xc5\x11\x78\x14\x92\xf3\x60\x01\x9a\xea\xdc\xc7\x44\x50\xad\x6f\x0f\x15\x79\x4d\xe0\xff\x6e\x51\x6c\x8d\x97\xb3\x11\x6e\x46\xce\xf0\x90\x1c\x8a\x1e\x42\x18\x5e\x40\x41\x85\x7e\x41\x68\x37\x03\x1f\xb4\x4e\xde\x5c\xcc\x9d\xb6\xb1\x6c\x1a\xf0\x3c\x70\xf3\x40\x84\xe0\x10\xc6\x5c\xce\x9c\x6c\xdf\x49\xf8\x29\x4c\x75\x0c\xd6\x96\x57\xeb\x60\xbd\x8e\xab\xb8\xc4\x39\x28\x46\x60\xfd\x11\x22\xee\xff\x14\xc5\x23\x39\x4e\x86\x44\x7e\x0a\x6e\xc3\x00\xb7\x9c\x76\xa4\xe5\xfb\x76\xd0\xad\xce\xa8\xc0\x22\xdc\xb9\x23\x86\x82\xdd\x81\x78\x35\xc8\x6d\xd6\xfd\xaa\x4a\x16\x19\xc0\x28\x4a\x49\x42\xc5\x34\xa3\xcb\x30\x75\x28\xb4\x12\x42\xa8\xad\xee\xdd\x5d\x89\x53\x0a\x6f\xdb\x49\xa7\x7f\x0f\xfe\xd9\x6a\x35\xfc\x1e\xc4\x5c\xc9\x2e\x34\x8d\xe8\xb5\x1a\x81\x24\xc0\x86\x6c\xe4\x89\x9a\x23\xf6\x35\xf9\xdd\x93\x74\x98\x35\x57\x3e\x7b\x45\xe3\x44\xe7\x92\xad\xee\x6e\xeb\x8b\x4f\x20\x90\x8c\xae\xde\xea\x09\xea\xaf\xbd\xa9\x2a\xc1\xfd\x60\xba\xe2\x0d\xd9\x6c\xd2\xde\xdb\xdd\x01\x23\x60\xdb\xc3\x14\x2e\x43\x47\x3f\x0a\x80\x5b\xb4\x78\xef\xbd\x92\x61\x90\x89\x2a\xd9\xaf\x99\x4f\xed\xb0\x14\x1f\x90\xa3\xa1\xaa\xd5\xb0\x52\x15\x62\x39\x2d\x87\x09\xee\x13\xec\xb1\x4a\x4c\xe3\xa7\x0e\x25\xee\x2f\x5b\x14\x9c\x26\xca\xb3\xea\xe5\x96\x5c\x01\xcd\xee\x1e\xa2\x86\xa2\x7f\x27\x4e\x06\x2c\xe8\xe1\xa6\x90\xfb\x8d\x9d\xdc\x15\x10\x5f\x65\xb7\xfe\xbe\x0f\x6a\xb9\x53\xde\x15\x73\x69\x5e\x39\xad\xd1\x7a\x3b\x8d\xa9\xb3\x30\x08\x6c\xb0\x5e\x2e\x14\xac\x9f\xc5\x6a\x59\x99\xdc\x95\x36\x49\x4c\x83\xa4\xaf\x3c\x5c\x21\x93\xc2\x4c\xb9\x99\xeb\xf4\x88\x39\x4d\x5b\x5c\x71\xd9\x36\xc9\x95\xa2\xbb\x08\xee\xa2\x0d\xdf\x3c\x9f\x6e\x22\x78\x09\x4a\xe1\x65\x10\xf7\x79\x11\x4c\x60\x2a\x13\x32\xd9\x33\x16\xdf\xd6\x3a\x0f\xf2\x50\xd9\xc0\xdf\xdf\x2a\xae\xe1\xb9\x2b\xb7\x9c\xf6\xeb\x10\x35\xf7\x49\x23\x58\x14\x4c\x34\x73\x8f\xaa\x01\x3d\xc7\x68\x15\x8e\xbe\xdc\x76\xe2\xc8\xe5\x1b\xa6\x48\x3f\x8c\x85\x53\x41\xbf\x71\xcc\x68\x25\xae\xc6\xa7\x9f\xbd\x2a\x6a\x3f\xe5\xed\xd6\x13\x76\x34\xaa\x77\xd5\xca\x1a\xcb\x17\xab\xf5\x65\x05\xed\xa8\xb4\xe1\x96\x34\x21\x74\xc8\x1b\xb7\x1b\xd4\x7b\xb8\xca\x09\x53\xb3\xcf\xd2\x15\xd3\x6b\x1d\xb3\x22\x96\x83\x66\x0e\x1d\x6c\x16\x97\xd7\x80\xa7\x82\xe7\x86\x66\x5b\x52\xf1\x51\x05\x57\xb0\xfa\x0e\xc0\x18\x27\x58\x05\xa9\x8e\x07\x60\x60\xb5\x12\xcb\x72\x98\x45\x4f\xe2\x75\x90\xf0\x9e\x95\xe9\x4a\xce\xe6\xe7\xe3\x67\x20\x4d\x19\x14\xb1\xa3\x0e\x40\x2f\x1b\x3e\xd6\x34\x8a\xc9\x68\x64\x50\x95\xef\xa6\xc4\x8f\x80\x2c\xaa\xdb\x5b\xa8\xa1\x85\xc8\x5e\x8c\x65\x27\xcc\x19\xe7\x75\x76\xe2\x54\x3e\xcb\x67\x47\x33\xfa\xc2\x7f\xcc\xdc\xbe\xda\x66\xcc\x1d\x2a\xb7\x25\x7e\x0e\xc5\x20\xd9\x15\xd2\x82\x6b\x50\x8a\x38\x69\x5d\xcc\x30\x74\xe2\x4e\xca\x24\xba\xb6\xec\x0d\x69\xd0\x9a\xce\x11\x12\xa8\xff\x08\x65\xc5\x5d\x03\x33\x1b\xb4\xf3\xdb\x65\x84\x37\xe8\x8f\x13\xe0\x4f\xf2\xa8\xf7\xed\xc6\x45\xcb\x6e\x61\x63\x06\xe3\x61\xf5\xb6\xb4\xbb\x75\xd0\xb5\xcb\x2f\x01\x5b\x65\x91\x51\x45\xff\xee\x70\x8a\xef\x31\xdf\x0a\xa5\x1d\xb5\x00\xe6\x00\xb9\xfd\x47\xb7\xb2\xf0\x37\x8f\x9c\x40\xfc\x9e\xb9\x56\x17\x26\xe8\xe0\x2b\xaf\xfa\xe0\x25\x98\xfe\x41\x43\x70\xb0\xdc\x12\x58\x97\x04\x6b\x63\xd8\x7a\xb1\x71\x35\x10\xe4\xc6\x2a\xc3\xa1\x8b\x67\x3c\x41\x3f\xb5\x5a\xc1\x05\x97\x15\x03\xbd\x53\x20\x10\x5e\xa2\xe0\x20\xb5\xad\x45\x67\xa5\x16\xac\x45\xe6\xe2\xd1\x36\xcf\x66\xab\x36\xe9\xfc\xf2\x90\x44\x0b\x7e\x32\xc0\xd9\x35\x3b\x93\xad\xb6\x02\x5b\xda\xb5\x42\xc3\x86\x51\x6e\x2b\x20\xa0\x68\xce\x3c\xe6\x82\x67\x23\x5d\x76\x36\xf9\x67\x9b\x97\xcc\xb7\x56\xa0\xb9\xf3\xd2\xa3\x73\x2b\xae\x3e\x58\x07\x74\x88\x38\xf6\xfc\x18\x29\xae\x65\xce\xe1\x33\x0c\xf7\x36\x2a\xf0\xd2\x3a\x1b\x36\x5b\x2d\x77\x04\x20\xd9\x42\x8f\xd7\x56\x97\xea\xb1\x8b\xea\x71\x96\xce\xf4\x75\xbf\xbb\x99\xb6\x89\xf2\xfa\xbb\xd0\x96\xb0\xcd\x46\x83\x35\x71\x42\x64\xde\xd6\xc6\xef\x75\x60\xd3\x15\xc5\x95\xa1\x0f\x9a\x49\x8a\xda\x01\xb0\x2e\xb8\xb7\x32\xef\xc3\xd8\xdd\x8a\xe3\x97\x7a\x53\xa3\x7b\xea\x2c\x24\x6c\x8f\x3c\x19\xee\x35\x9f\xfa\x92\x9c\x96\x1e\x97\x3b\x6f\x79\x21\x69\xfd\x43\xc9\x31\xca\xec\x50\xf2\xdc\x67\x1e\xa7\x13\xf0\xd4\x02\xf3\x4a\x67\x0e\xd7\xe5\x20\x26\x17\x67\xd9\x84\x49\x4f\xa3\x22\xd1\x23\x05\xd7\x99\x14\x25\x6e\x34\xd1\x6c\x84\xb7\xc5\xe1\x3a\x7d\x14\xdc\xa7\xb3\xcf\x66\xa6\x24\x7c\x4a\x22\x2e\xbe\x45\xb8\x86\x16\x8d\x54\x55\xa1\x28\x5a\x7d\x26\xdf\x8e\x8a\xc7\xd6\xf1\xac\xb9\xc6\xbc\xd1\xc5\x37\xce\x19\xa1\x46\xce\x2d\xc0\xaf\x67\xf2\x3c\xfe\x80\xe9\x11\xd8\x41\x03\xf9\x8a\x62\x15\x6f\x24\xe7\x76\xd4\x0d\x67\xcb\xfa\x25\xf8\x0e\x5a\x15\x18\x0f\xb6\x0f\x17\x3f\x3b\xc7\x4c\xe6\x8f\xe7\xaf\x6d\x68\xff\xe3\xd6\x29\x5c\x5f\x0d\xa9\x67\x63\x8f\xb0\x47\x76\xa8\x96\x33\xb3\x13\x69\xca\x04\x09\xa8\xc3\x85\xf3\x59\x1a\xf1\xdb\xa1\x78\x3d\xb0\x21\x96\xf6\x63\x4d\x5c\xe4\xe3\x3a\x9c\xff\x29\x9f\x77\xaf\x0f\x73\xde\xfa\x01\x04\xa2\x95\xc3\xb0\x4f\x96\x3d\x0e\xbd\x41\x6c\x96\x17\xf8\x89\x2d\x89\x55\x70\x2d\x0d\x32\x0a\xed\x78\x11\x3c\x75\xd3\x71\x90\x0c\x4f\x16\x05\x4a\xfb\x6d\x94\x82\x15\x62\x4a\xd6\x25\x23\x6e\x63\x2c\x56\x0a\x27\x35\xed\xc7\xbb\x35\xfd\xc5\x61\x7d\xe6\x1d\x34\x41\x5e\xe9\x23\xa8\x86\x13\x33\x2f\x43\xec\x2f\x9b\x65\xf1\x20\x67\x00\x3c\x16\xf3\x60\x37\x00\xc4\x41\xb7\xe2\x4b\x14\x78\x9d\x2b\xc1\xcf\xe0\x81\xdd\xc7\x0a\xcd\xd0\x0a\xba\xb7\x1d\xbc\x94\xca\x2d\x50\x5b\xe5\x59\xf6\x01\xcb\x60\x18\xf1\xba\xb2\x9a\x74\x6a\x8a\x30\xeb\x11\xef\xa6\x48\x29\x78\x87\x53\x2a\x85\xb5\x49\x9b\xd5\x04\xeb\x80\xd8\xb7\x93\xfe\x4e\x14\xdc\x88\xba\xdc\x55\xbf\xfd\xc0\x56\x2b\x09\xf3\x21\x74\xcc\x44\x0d\x4d\x5d\x7c\xea\x8c\x8d\x95\x1f\x29\x7c\x74\xf2\xa8\x29\x25\x3a\x25\x96\x69\x1e\x0d\x5a\x62\xfd\x56\xee\xf0\xe3\xec\x19\x6b\x7a\xfd\x84\x6e\x03\x1b\x7b\x3b\x7d\x70\xe2\xa9\xf4\xf0\x09\x3d\x1a\x36\xf6\xee\x81\xd7\x50\x99\x6f\xc5\xc6\x5e\x6f\xa7\xe7\xf2\xad\x6f\x83\x4a\xdf\xdd\x89\xfa\x07\xb9\x90\x60\xf7\x6f\xe2\xf6\xae\xe3\x03\xb4\xdc\x4b\x06\x6d\xb6\x5e\xa4\x93\xf4\x34\x9b\xc5\x3d\x56\xa0\x00\x2c\x23\x94\x70\xf1\xa8\xb4\x95\x5d\x2d\x2f\x0b\x28\xdb\x88\x3b\x42\xcc\x6b\xf9\x4f\xe0\x31\xfd\x78\x0d\x0f\x0c\xb8\xee\xa6\x11\x0d\xdb\xa2\x82\x1e\x71\x8d\x7a\x5c\xd6\x78\xcc\xe0\xf0\xec\xc6\x59\x4e\x99\xed\xba\x03\x16\xb7\xf9\x9c\xc1\x81\x06\x88\x8b\x99\xe2\x44\x8c\xbd\x62\xdb\xab\x64\x01\x0e\xea\x1a\xbd\x56\xd4\xb2\xb8\xd4\x7c\xd9\x66\x4a\x01\x6e\x2e\xd1\x41\x11\x41\x81\x21\xcd\xe0\x0e\x5b\xdf\x19\x40\x19\x4f\x18\x10\xe3\x2b\x8c\x21\x66\x50\xc9\x67\x17\x97\xdd\x32\x95\x33\x71\xcd\x2f\x32\xd1\x3c\xb2\xa1\xf0\x5e\x70\x38\xdf\xb4\xd1\x0a\x84\xeb\x92\x4d\xf5\x63\x22\xb8\x8c\x89\x4e\x69\xd8\xa4\x06\x3a\x37\xd9\x8e\x10\x9e\xa6\x62\x24\xe6\xf9\xf9\xa1\x9b\x74\xdd\x83\xa3\x68\x1e\x04\x51\x3d\x8a\xd9\xaf\x4e\xcf\xea\x6f\x5a\x8c\xa0\x52\x3e\x36\x0c\x9a\xd2\xbe\x65\xb5\xca\xd5\x0b\x57\x02\x45\xe4\xe5\x1b\xec\x9b\xc7\xa7\xf8\x68\xe8\x04\x1b\xb8\x7c\xde\x46\xfa\x84\x72\xbb\xf4\xa5\x1d\xdb\x01\x79\x6a\x3f\x87\x61\xda\xa6\xa3\xc5\x62\x95\x00\x22\x74\x8f\x15\x0f\x41\xcc\x83\x4d\xf7\x03\x4a\x10\xb6\xe0\x1a\x86\x27\x35\xb9\x8e\xc8\xf4\xae\xb3\x5f\xc6\x5c\x3a\xa1\x63\xb4\x58\x9d\xb6\x41\x34\xd6\xfe\xd6\xcd\x39\x79\xe3\x2b\xfb\x85\xe2\xdb\x73\x7f\xd4\x47\x8b\xf9\x1c\x1f\xb9\xe4\x35\x2d\x5f\x79\x8c\xb9\xcb\x7c\x64\xcb\x9c\x64\xc9\x9b\x17\xac\xd4\x6d\x2f\x75\xd8\x0e\x56\xe3\x4b\xbb\x77\x3a\xcb\xd3\xa8\x2f\x64\xf3\x0d\xda\xdb\xe1\x25\x34\x9a\xb9\x1f\xb5\x6e\x5d\x9b\x87\x9c\xeb\x7b\x03\x3a\xd9\xf0\xd9\x83\xfa\x51\xa6\x4b\x84\x7a\xdd\x8f\x0b\x4d\xe4\x5e\xed\xe6\x0f\x7f\x18\x69\xd1\x35\x27\xd4\xb6\xd7\xe6\xbe\x35\x3a\xcf\x5e\x8d\x06\xef\xe8\x39\xdf\x2f\x62\xa8\x62\x8b\xad\x65\xfe\x10\xb7\x38\x30\xb3\xea\xfb\x96\xb0\xd5\x34\x36\xcc\x1b\xa1\x65\xf1\x9d\x5d\x6e\xca\x8d\x81\xe6\x21\x0c\xe6\xbc\x80\x6a\x8b\x79\xbe\x11\xda\x51\xef\x86\x11\xe8\x78\x12\x19\x19\xbd\x4e\x87\x23\x50\xa8\x6c\x80\x91\xf4\x86\x39\xd9\xec\x89\xaf\x1f\x86\xa8\x0b\x2d\x5a\xc0\xf6\xee\x32\xc7\x06\x0c\x86\xd4\xdb\x09\x1a\x2e\xb4\x91\x75\xac\xe5\x98\x2d\x77\xcd\x41\x21\x00\x5b\x7e\xff\x5b\x11\x6f\x8a\xd2\x99\x68\xec\x0a\x6b\xf1\xd0\x3a\x77\x35\xeb\xe8\x4a\x07\x04\xe1\xbf\xd4\x85\x68\x58\x13\x69\x08\x6e\xb6\x76\x8c\x23\x0f\x23\x86\xeb\x7b\xae\xb1\x67\x4c\x2a\x7b\xa1\x6a\xd6\x76\xd2\xb3\x25\xa3\xdc\xd0\xe6\xcf\x2f\x10\x1a\x99\x95\x5b\x84\x12\xb8\x66\x7d\x29\x3a\x1e\x52\xc5\x8d\x00\x74\xd8\x1c\xdd\x99\xd6\xcf\x6c\xec\x4e\x3f\x6c\x44\x2f\xb3\x79\x69\x1d\x0f\x90\x17\xae\x7b\xaf\x28\x8f\x36\xb3\x52\x57\x0b\x75\x45\x50\x49\x6f\x2c\x7a\x97\x4d\x71\xb6\xaf\x47\xd3\x29\xd6\x56\xf4\x34\x28\x81\x64\x34\x5e\x62\x85\x77\x07\xa2\x97\xb4\xc5\x34\x9d\xd4\xbc\xa6\xa5\xf5\xad\x1f\xb0\x8b\x9a\xb6\xdf\x75\xba\x40\xfc\x94\xa1\xa9\x42\x51\x4f\xe7\xf1\x18\x55\x25\xea\x30\xc6\x05\xd8\xc7\x0d\x3c\xbe\x64\x63\x6f\x67\x6b\x69\x40\x9b\x72\x7d\x97\xc7\x81\xf7\xae\xfd\x3d\x84\xab\xc5\x1b\x87\xf1\xd3\x3b\x68\xac\x9a\x12\x29\x06\x90\xd1\xa1\xf0\x00\x1b\xbc\xf0\x2b\x3a\x40\x62\xa5\xf5\xd9\xb2\x21\x64\xdf\x59\x3a\xec\x0f\xb3\xd3\xe6\x2c\x1d\x0a\x61\x54\x7d\x27\x5f\x27\xbb\x77\xbb\xfd\xfb\xbb\x77\xef\xde\xdf\xed\x6d\x6f\xdd\xeb\x6f\xf7\xa5\x3c\x0b\xa4\x07\xd0\x14\x8f\xab\x97\x27\x27\xe6\x2e\xcb\x6a\xea\xd1\x94\x0e\xfc\x2f\xcc\xc5\xc1\xbe\x4e\x3c\x06\x5a\x39\x9a\x9c\xbe\xce\x70\xda\x14\x4d\x53\x99\x8f\x74\xe2\xe3\xf1\x48\xb5\x07\x59\x5a\x63\x81\xc7\x35\x36\x6f\x0f\x5b\xfa\xfc\xfb\x9e\x6a\x79\x80\xc5\xff\x9e\x74\x44\xab\x5d\x17\xa6\x8f\xca\xfe\xea\xca\xfe\xea\x97\x55\x67\xcb\x2d\x43\x8c\xf5\x04\x50\x25\x1b\x9c\x04\x27\xf7\x7b\x25\x8e\xd4\x0d\xe4\xee\x2a\x2c\xe7\x5f\x03\x16\x54\xc7\xd1\xc5\xea\xd5\x51\x21\xea\x44\xb3\x00\x5a\x9e\x96\x85\xf6\x50\xec\x6c\x7a\x3e\x3d\x07\x76\xb6\xbf\x73\x36\xe3\xdc\x2c\xbd\x6c\x03\x91\xf0\x20\xf6\x79\x3b\x81\xa3\x95\xb6\x36\xbc\x37\x89\x98\x16\x66\xde\x82\xd0\x09\x2f\x72\xb5\x45\x14\x65\x28\x0a\xa1\x63\x97\x19\xde\x75\x8e\x02\x29\x3f\x51\x4b\x44\xdb\xba\xa0\xb3\xc4\xde\xe3\xb3\xf3\x44\x2f\x50\xd6\x9d\xa0\x9f\x21\x22\x5f\xf7\xe2\x6c\x34\x38\x8b\x9d\x11\xb6\xc1\xfd\xeb\xe3\xd2\xe5\xf2\x80\x9a\xed\x09\x06\x08\x00\x24\xc6\xc4\x26\xb3\xa5\x0b\xee\x51\xec\x45\x18\x7f\x89\xca\xac\x11\x2d\x86\xcf\xf6\xaf\x17\xd3\x80\x98\x61\x85\x86\xbe\x9d\x4f\xf4\x92\xb3\x7b\x9e\x16\xef\x0c\x7b\x4b\x8c\x7b\xa6\x49\x89\x19\xf7\x87\x3d\xd1\x5e\x97\xf6\x08\x99\x5a\x6f\x26\xd6\xa3\xe7\x32\x5a\x4c\xdf\xc7\xa8\x72\x82\xf3\xc1\x9e\x2c\x3e\xc9\xce\x18\x14\xdd\x0f\xac\xf5\x20\xa0\x3c\x1d\x99\x3f\x71\x79\xc8\x24\x39\x2c\x83\x67\x58\x33\x40\x16\xbd\xc4\x4d\xef\xa5\x43\xdc\xb1\x4d\x81\x56\x6d\x3c\xac\x5b\x7e\x47\x2f\x72\xf1\xb4\x98\x4b\x5c\xde\x99\x34\x25\x10\x7b\x01\xac\x20\x7a\xf1\x2b\xcc\x28\x68\x78\x55\x1c\xc0\x86\x04\x39\x0a\xa0\xcd\x59\x7d\x4a\x06\x88\xb0\x43\x6c\x21\x2b\xde\x6c\x1d\x55\xf6\xfe\x74\x32\x8c\x77\xae\x32\xae\xa5\x6f\x6f\x51\x4c\x61\x69\x83\xa2\xeb\x2b\x48\xd5\x76\x2d\xce\xa2\xb4\x46\x9f\x22\x48\x6b\x1a\x96\xd6\x34\x78\xac\x43\x76\xf2\x54\x1d\x77\x36\x6e\x30\x6b\x54\xd7\x34\x09\xfb\x5e\x89\x5f\xfd\x12\xbf\x0a\xfa\x85\x96\xde\xfa\xc0\x31\x8c\x3e\x11\x17\xdb\x45\xdb\xb5\x25\x36\xae\x77\xe1\x8e\xad\xd8\x79\x10\x74\x50\x93\x30\x4e\x00\xa9\x0f\xdb\x83\x69\x9f\xd1\x94\x62\x9e\x81\x2f\xcc\xf6\x96\x93\xb9\x3f\xd8\xb1\xc0\x39\x2c\xf6\xad\x2b\x74\x69\x0b\xfd\xea\x15\xba\x64\xd2\xbb\x7d\xdf\xc2\x12\x85\xee\x87\xf2\x36\x07\x97\x61\xf1\xcb\xb0\x75\x5b\x3e\x9d\xa7\xa0\x82\x7a\x91\xce\xcf\xba\xf0\xbb\xdf\x1c\x7c\x68\xab\x56\x5a\xaa\x0e\x4b\x54\x69\x97\x5c\xd4\x57\x2c\x12\xb0\x54\x9a\x59\x82\x32\x1a\x5b\x29\x03\x6b\xa2\xfc\xd7\x84\x84\x4d\x9c\x22\x88\xf0\x00\xff\xba\x82\x7f\x56\x93\x76\x67\xcb\x0f\xc9\x6e\xea\x9f\x8c\xf3\x7c\x26\xea\xff\xeb\x5f\xc9\x96\x00\x62\x3c\x4f\x4d\xe9\x69\x7e\x01\x50\xf6\x41\x91\x6f\x13\x2e\x21\xc1\x4d\x8e\xe2\x48\xe6\xc0\x2b\x9b\x3a\xc5\x7f\xcd\xe6\x4d\x6c\xc5\x8d\x8d\x45\x77\x87\xfe\x7a\xfd\xf8\xf5\x3c\x1e\x4f\x74\x26\x03\x9b\xb0\x21\xcd\x9f\x6c\x47\xdf\x24\xf7\xb7\x5a\x22\xa6\x34\xb4\x7b\xfb\x81\x6d\xd7\x25\xfe\xd9\x5d\xea\x5b\x69\x58\x8a\x82\xb6\x9c\xa9\x2c\x4f\x76\x1b\x87\xbe\x7e\x48\x50\x8e\xc5\xb0\x2b\x92\xd8\x53\x2a\xb8\x01\xe2\x72\x39\x9f\x06\x38\xa8\xd9\x34\x60\x73\x7f\xe6\x03\xd5\x1d\xe0\x3f\x6c\x66\xe5\x20\x20\x57\x8e\x01\xba\x27\x96\xbf\xf0\x86\xc1\x72\xea\x3c\xa1\x61\x5e\x97\x70\xba\x45\xa9\x5b\x02\xdf\x65\xa6\x60\x74\xb3\x02\x01\x36\xe4\xcc\xb0\x71\x13\x83\x92\x7c\xa7\xc6\x03\x91\x4e\x76\xf6\x43\x6a\x05\x8f\x00\x40\x5a\xe4\x9a\xe1\x81\xed\xc0\xdc\x2f\xb0\xc9\x2a\x28\x5c\xfc\x28\xf9\xb3\x6a\xb7\x55\x36\x5b\x05\x06\xf2\x77\xd7\x1a\x90\x26\x09\xf6\xc8\x3d\x44\xfc\x20\x16\x7a\xbd\x85\x03\x31\x33\xcf\x9a\x8f\x5e\x30\x39\x11\x0c\xa4\x6c\x8c\xf4\x0e\x55\xdb\xc2\x9f\xa7\xcd\x3a\xdd\x63\xbf\xdb\x26\xb6\x19\x54\x61\xb2\xb4\x7e\x07\x15\x71\xc3\x1a\xdd\xb5\x56\x53\x82\x2e\x55\x3f\x1a\xc5\x1a\x29\x00\x03\xe5\x9a\x9f\x1c\xd3\x1a\xc6\x82\x4c\x6c\x98\x08\x1f\x1b\xe5\x7a\x4b\xc4\xad\x68\x84\x88\x0d\xe7\xc4\x1a\xea\x24\xcf\x46\xf3\x17\x8a\x0b\xbd\xc2\x20\xa2\x0a\x54\x49\x64\x22\x18\x1b\xc1\x11\xb7\x25\x48\xdc\x12\xc5\xc4\x4e\x5c\xd7\xd6\x1d\x1d\x79\x1a\x03\x0a\xe0\x53\x57\xf9\xe4\x54\x2b\xa5\xc8\xaa\x55\x00\x80\xad\x67\x29\xc3\x4a\xd4\x3b\x71\xcc\x2b\x24\x76\x32\xbd\x90\x1e\x72\xa5\xe2\xc9\xb8\x37\xd0\x30\x40\x78\xa8\x35\x0a\xbd\xc4\xad\xb6\xd1\x7c\x11\xaf\x8a\x35\x3c\x3e\x35\x50\x92\x21\x63\xe9\x97\x54\x89\xd0\x16\x72\xd3\x3f\x4d\x45\xfe\x4f\x53\x9b\x13\xf4\x02\x09\x6a\xc4\xd8\xc5\x72\x1d\x94\x3e\x13\x96\xbf\xaf\xe9\xa9\x66\xf6\x7a\xfd\xed\x76\xa0\x81\x51\xa9\x3b\x81\xea\xa9\x7f\xa3\x7a\xba\x51\x3d\x95\xaa\x9e\x5e\x8c\x26\x8b\x79\xb6\x92\xf2\x49\x57\xf9\xd2\xd7\xa7\x9a\x8b\xd2\xbd\x5f\x45\x7b\x75\xeb\x8b\x2a\xa2\x42\xe9\xf0\x1a\x34\x51\xa2\xd4\x67\x53\x44\xd9\xb9\x96\xaa\x28\x9d\x5c\x5f\x19\xe5\x98\xc1\x1b\xb5\xd3\x8d\xda\x69\x75\xb5\x53\x5c\xeb\xf3\x59\xd4\x4d\xff\x73\x75\x3e\xe7\x96\xd2\x1b\xad\x8f\xd9\xc7\xab\xea\x7d\x74\x4b\x71\xcd\x8f\xa5\x19\x9c\xe6\x98\x9e\x6a\x68\x7f\xee\xdc\x28\x7f\xbe\x98\xf2\xa7\x5c\xe1\x41\x0b\x16\x57\x17\x88\x3c\x41\x9d\x1d\x8a\x45\x45\xf5\x2d\xb2\x08\xec\xf5\x3d\x19\x5d\x57\x33\x52\xba\xe2\xd1\x5a\xfc\x9c\xe3\x2f\xff\xbc\x90\x48\x2c\xf4\x2b\x3a\x8f\xe9\x1c\x52\x2e\xb0\xe3\x4e\x67\xd3\xe4\xc4\x2f\xd3\xbf\x94\xff\x29\xb5\x42\x03\x10\xc0\xf4\xc0\x34\x65\x76\x27\xd0\x07\x57\xa5\xe5\x01\x04\xb4\x78\x4d\x45\x01\x75\xb3\x54\x39\x40\xc5\x1a\x56\x38\xa3\x6f\xa1\x18\x88\x9d\xfe\x13\xb3\xec\x9e\xb8\x26\xa4\x3e\xf6\x61\xc3\x44\xd8\x4c\x6f\x6a\xfc\xf3\xed\x46\x0b\xb1\xe6\x20\x56\xd3\x42\x78\x14\x3f\xb2\x77\xff\xc0\x2a\x06\x81\xb2\xce\x72\xc9\xc7\x6d\xa6\x5c\x30\x45\xbf\x88\x92\x41\xec\x05\xd3\x73\x64\x4f\x24\xd5\xea\x88\x76\xa5\x0a\x82\x37\xf2\x79\xf5\x10\x96\x76\x7e\x4e\x4d\xc4\xf6\xba\x66\xe8\xc5\x78\x04\x71\x45\xf2\x87\xb3\x59\x0a\x47\x33\xa3\xd2\x68\x76\x6e\x39\x35\x28\xf7\x7c\x0e\x61\xf5\xd5\xa1\x97\xce\x20\x3e\x87\xb1\xcc\x7e\xab\x3e\xe9\x60\xa2\xcf\x89\xa1\xc0\xf4\xe9\x4e\x08\xfa\xce\x44\x24\x1d\x55\xf2\x92\xdb\xb7\xbf\x1d\xa1\xcd\xfa\xec\xcd\xc1\xe5\xf9\x71\x3e\xee\x8e\x74\x9f\x47\x4a\x26\x52\xe0\xee\x27\x5f\x35\xb1\x83\xe6\x5b\x0c\x93\x35\xea\x4e\xd0\x03\xa8\xd5\x1d\x2a\xca\xd1\xda\x77\xbd\x03\x74\x00\x19\x9d\x7d\x6f\x6d\x40\x76\x3a\x3a\xc0\x77\x13\x73\xc9\x74\x9e\x1e\xf7\x6a\x25\xc7\x6a\x5e\xdf\x91\xdd\xfa\x20\x9d\x0f\xce\x92\x66\x36\x9b\x61\x4b\xf6\x58\xa1\x01\xa8\x64\x28\xa6\xc6\x90\x8e\xc7\x30\x00\x1a\x06\x9a\x97\xbf\xc5\x08\xfe\x6f\x47\x6f\x1a\xb4\xfb\x1b\x47\x2d\xf1\xa5\x88\x83\xa8\x0a\x95\xde\x0e\xc1\xe9\x73\x96\x5f\xa8\xe6\xf7\xb9\xd5\x3c\x00\xc9\xac\xcc\xdd\xf2\xb8\x35\x80\xfa\xb8\x7e\x4a\x54\xc0\x7f\x21\x0f\x4d\xf3\x75\x25\xdd\x84\x75\x8c\xf7\xa6\x16\x4c\xe8\xc9\x24\xde\xaf\x18\x5d\x75\xdb\xd4\x47\x0d\x31\x3a\x2d\x29\xd2\xf1\x94\x3c\xfb\x9f\x4f\xe8\x95\xa3\x74\x3e\xcf\xce\xa7\x10\xe5\x54\x31\x53\x0a\xed\x16\x03\xd5\x66\x96\x28\x0a\xdf\xc1\x9e\x41\xbb\xa5\x76\x02\xde\x42\x35\xb0\xd5\x4f\xea\xaf\x56\xb3\xf5\xf9\xb4\x64\x11\x35\x59\x6d\xdd\x0c\xd5\xf8\xd2\xaa\x19\x4d\xab\x57\x7f\x65\xc6\x58\x0a\xd1\x2d\x86\x25\xea\xe6\x85\x9f\x7c\xe2\x68\x6c\xb9\x19\x12\x67\x82\x62\x0f\xf8\x5c\x9f\x5a\x44\x8f\xd3\xda\x01\x7b\x6c\x96\xe1\xfa\x18\x3c\x48\x52\x7c\xf6\xe7\x0f\x60\xe8\xae\xf8\x1d\xc9\x43\x7b\x8f\x6f\x8f\x26\x13\x44\x3c\xce\x34\xfb\xde\x7d\x18\x1f\x10\x54\x58\xb0\x7a\xfc\xe2\x56\xd7\x85\x3e\x14\xb7\x8f\x4f\xbb\xa8\x9f\xdf\xb2\x2b\x4c\xf8\xe6\xf7\xaf\xf2\x7e\x96\x80\x83\xbf\x37\x93\xdd\x40\x8e\x35\xac\x1a\x8a\x19\x6f\xb6\xda\xc9\xae\x12\xe3\xdf\xec\xee\x74\x77\xdb\x49\xef\x4e\xf7\x0e\x7c\xdd\xdf\xe9\xee\xa8\x8c\xfb\x5d\xcc\xeb\x6d\xdd\x57\x59\xbd\x1d\x97\xd3\xbb\x73\xaf\xcb\xaa\xf5\xb7\xee\x75\x31\x57\xb5\xd6\xef\x6f\xc3\xaf\x8e\x97\xd3\xf1\x2a\x76\x78\xa3\x1d\xd9\x9f\xae\xdb\xbb\xaf\x80\x39\x12\x81\xdc\xd4\xc4\xbc\xf2\xc1\xdf\x01\x35\xc4\x9b\xed\x3b\x5d\xd5\xde\xce\xfd\xee\x7d\xf8\xba\xa3\x5a\xbb\x7b\x17\x7e\xdd\xdd\xb1\xbd\x40\x62\x6f\xb7\x87\xa5\xef\xaa\x9f\x77\xef\x69\x90\x7b\xf7\xf0\x57\x87\xa5\x76\x58\xe1\x0e\x6b\xa3\xe3\x5a\xc6\xe2\xbb\x5b\x02\xc2\xa5\x4c\xb7\x7d\x27\x62\x83\xbf\x13\x11\x67\xa4\x23\xc6\xfe\x9a\xad\xdd\xee\x87\x56\xfa\x3c\xad\x9a\x57\x27\x03\x7d\x7a\xcc\x7d\x77\xeb\xcf\xf0\xe8\xc5\x9d\xe9\x07\x61\x61\x8f\x3e\x05\x5b\x32\x20\xd8\xc3\xf1\xe8\x14\xc0\x22\xf9\x9d\x83\x6c\x03\xb1\x8a\x27\x21\x78\x5c\x77\xcd\xf1\x27\x9b\xf0\x60\xde\x2c\x3f\xcf\x12\x88\x08\xb3\x99\x1c\xa4\x27\xe9\x6c\x84\x1f\x5f\x6f\xda\x9a\xee\x31\x89\x8d\x5e\xb7\x97\x9d\x5f\x9b\x24\x21\x38\x7c\x6f\x3b\x72\x39\xd3\xac\x17\xb7\x79\xf7\x5c\x09\x22\x56\xfe\xcc\x97\x60\x3f\xd2\xc0\x4a\xce\x01\x6c\xbf\x5a\xb3\xff\x57\x66\x5b\x13\xfe\xbf\x51\xbf\x8e\xd8\x58\x70\x77\xc4\x61\x37\x0f\xfe\x6f\x40\xec\xe4\x8d\x18\x70\x36\x40\x43\x79\x11\x6d\xf4\x2f\xf0\x66\x07\xf0\xc6\x14\xf6\x00\x95\xbb\x55\x43\xeb\x8d\xed\xad\x57\x87\x7f\xee\x97\x14\xeb\x03\x47\x28\x38\xda\xa6\xc8\x27\x53\x1b\xa1\x04\x93\xf5\xdf\x6c\x1d\x49\xf5\x97\x97\xdd\x3b\x92\x51\xcc\x71\xf4\xdc\xf9\x62\xc3\x06\xa5\x6e\x6e\x24\xb7\x13\x78\x01\x7d\x03\x62\x52\xc3\xc7\x25\x7d\xb4\x36\xea\x8b\x86\xc2\x9c\xbf\x8e\x31\xbf\x27\x0d\xfa\xa7\x50\x4d\x91\x85\x58\x9d\x3a\x12\x8b\x27\x86\xec\xfc\x71\x2e\x44\x63\x97\x9c\xb5\x79\x3d\x5d\xe5\xdf\x9f\xd9\xe3\x8c\xd1\x8a\x2f\xdf\x05\xf7\x56\x13\xeb\xa4\x3f\x2a\x9e\xc3\x57\xd3\x47\xaf\xd8\xb3\x71\xd7\xc2\x16\x42\xd8\xd6\x6a\xce\x50\x28\x0d\xa2\xac\xe1\x35\x3f\x00\x17\x77\xd2\x8c\xcd\x92\xff\x24\x18\x01\xc6\x54\xfb\xba\xa0\xb8\xec\xa4\xaa\xef\xfd\x58\x6c\x3e\x93\xf8\x55\x84\x49\x34\x92\x22\xf1\x97\xee\x74\x13\x0f\xba\x6a\xee\x91\x3e\x0c\xff\x68\x17\xed\xe1\xe4\x74\xec\xe1\x08\x26\x85\x31\x04\x97\x30\xac\x82\xd7\x56\xa7\x03\xb5\xe2\xe3\x8d\xe2\xa1\xfa\x51\xe3\xb1\xa5\xf5\xee\x6c\xf1\xc8\x89\xa6\x20\x5f\x51\x5b\x59\xd7\x80\x6b\x87\x16\xdf\x6f\xc0\x2d\x43\xa2\x23\xfc\x29\x94\x4f\x50\xf7\xaf\x18\x11\xc8\x4b\xbe\x4e\x18\x17\x6f\xa4\x6a\x28\xf6\x87\x11\x3d\xbc\x15\x71\xaf\xf5\xc2\xde\x09\x16\xa4\xca\x2f\x0d\x2b\x04\xe7\xb1\x99\x14\xc3\xa3\x68\x7c\x58\x85\xc3\xb5\x1a\xd9\x6d\xa9\x3e\xb6\xec\x53\xa5\x13\x66\xc0\xea\xf6\x2b\xf9\x56\xc9\xb6\xd6\x73\xeb\xdd\xd8\x15\x80\x05\x0f\xbb\x6c\x50\xc1\xfa\x4c\x27\x73\x57\xdd\x98\xe5\x40\x29\xfe\x7f\xe4\x0b\x68\x32\x15\x3b\x30\xcc\x4e\x5b\x4c\x9b\x4d\x3f\xce\xd3\x99\xd0\x64\x57\x4d\x90\xc7\x22\xfa\x8c\xbe\xea\x57\x31\x62\x09\x3d\x48\xb4\x81\x4f\x1d\xd5\x9f\xe0\xbb\xa1\x28\x71\xb7\xee\x94\xa2\x9c\xd0\xd9\xf5\x97\xa8\x73\xa7\x9e\xcb\x73\xc0\x8e\xf3\x87\x31\x2a\xd8\x59\xc7\xac\xee\xa8\xd6\x04\x12\x7b\x1b\x84\x1d\x18\x41\x53\xb0\x00\x26\x66\x0c\xb4\x85\xab\x1a\xa3\x4f\xd7\x19\xb9\xbd\x86\x22\xdf\x8f\x4f\xcc\xc0\xad\xaf\x8f\xd6\xbc\xcd\x1a\xdc\xdd\xee\x1f\x87\xbb\xc3\xb0\x16\x8a\x4a\x3e\xb1\x8b\xc4\x0c\xd8\x80\x7c\x76\xf4\xf2\x09\x73\xb7\x20\x68\x86\x55\xae\x6b\xc7\x54\x5e\xd8\x78\x0e\x06\x65\xd1\x0e\x53\x14\x75\x57\xa7\x41\x61\x7d\x7f\xb1\x21\x38\xd2\x55\x58\xd1\xf5\x5d\x11\x61\x7e\x96\x3c\xcf\x8d\x41\x3c\x57\xd4\x1c\xae\xe8\x9a\x68\x14\x89\x0f\xf1\x15\x9f\xcf\xad\x46\x14\x43\x77\xa6\x55\xbf\x0b\x2f\x68\xee\xd5\x0c\x30\xf6\x45\x30\x07\x63\xc0\x0a\x5e\x99\x4d\x97\x9d\x86\x37\xf9\x90\x6e\xcf\x19\x5c\x7e\x5a\x67\x7f\x86\xde\xaa\xe1\xbc\xf0\x62\xbc\xea\xa4\x26\xd4\x5b\xe2\xcc\x00\xe1\xc7\x54\x4f\xf9\x62\x2e\x2f\x94\x74\xcf\x6f\xe3\x33\x66\x40\x82\xbf\xcd\x49\x60\x38\x11\xc5\x23\x6e\x71\x66\x0f\xa0\x79\x78\xa2\xe8\xa7\x07\x21\xa6\x35\x53\xf8\x9b\xb3\x46\x98\x80\xfc\x90\xbd\xb0\xa5\x92\x2d\x67\x47\x65\x07\x24\x6c\xcc\xe9\xcc\xe1\xf3\xca\x7c\x46\xd9\x09\xe5\x7a\xd8\x48\xb9\x97\x09\xbb\x38\x24\x23\x1f\xaa\x4a\x7d\x74\xe0\x39\xb6\x84\xa0\x95\x06\x0b\xe2\xb8\xa9\x6c\xe3\xb6\xd7\x86\x33\x35\x09\xe6\xc7\x8d\x3a\xce\x35\x6a\xa7\x91\xaf\x98\xb3\x8c\xc6\xaf\x8d\x8d\x35\xe7\xc7\xf4\x42\x75\xc0\x44\x25\x60\x46\x61\xbe\x62\xa7\xeb\xc6\x94\xd2\xdd\x80\x88\x80\xfb\x56\x33\x3a\x55\x68\xe1\xad\x21\xa8\xb5\x97\x21\x23\x93\x87\x2f\xf8\x9d\xfd\x73\xf5\x5d\x16\x62\x2f\x70\xa0\x71\x70\xb3\xc6\x2b\xc3\x31\xb0\x43\x87\xc7\x64\x60\xb1\x55\x74\x58\xa2\x30\xa2\x84\xc1\x64\x17\xf3\xac\x4d\x78\xd5\x66\xb6\x20\x38\x1c\x16\xb8\x61\xe3\xe1\x0b\xc3\x41\xa9\x72\x57\x04\x8d\x22\x25\xd5\x86\x6d\xea\xc1\xf6\x55\x00\xdc\x2b\x07\xdc\x51\x44\x2e\x0d\x4c\x6d\xcd\x02\xf9\x61\xa6\x71\xcd\x22\x02\x15\xc7\x6e\xb3\x0d\x57\xbb\xba\x19\xe8\xc3\x99\x5e\x89\x09\x51\xc9\x76\x63\x31\xae\x86\xf8\xe3\x8c\x54\x40\xe2\x4b\x47\x13\xf9\x68\xaa\xe1\xac\xfb\xf7\xb6\x02\xbd\x39\x68\xda\x4b\x39\x62\xb6\xf9\xce\x4d\x4c\x62\x5f\xfc\x1e\x44\xb8\x0d\x61\x15\xf2\x3d\xf9\x94\x68\xdb\x27\x3c\x0a\x0a\xf1\xf8\x34\x9d\xf5\xc1\xb6\xe0\xe6\x13\xe2\x11\x91\x80\x48\xb9\x92\xd2\x05\x7f\x39\xed\x70\xb4\x5f\xde\x61\x2d\x1d\xd4\x0b\x63\x44\x69\x86\x75\x6e\xcd\xea\x6b\x40\x6d\x6a\xfb\x70\x5b\xeb\xcb\x0a\xc8\xad\xf9\x36\x0b\xcb\x7e\x25\x79\x81\xc9\x06\xd5\xa2\x01\x63\x86\x45\x7c\x9c\x90\x1d\x08\x21\x6f\x7b\xc7\xaf\x87\x59\x2b\xa1\x43\x4a\x47\x8e\xbf\x21\xf9\xcc\x93\xd8\x05\x8b\xcc\x08\x0a\x30\x16\x9c\x9e\x10\x57\x12\xa9\xf7\x62\x34\xa9\xaa\xa6\x99\xd5\xfa\x11\x73\xf8\xb4\x87\x13\x6f\xb7\x2c\xa7\x64\x88\x80\x96\xce\xca\x33\x81\x09\x61\xcc\xd4\x9a\xed\x87\xc0\xe0\x3a\x38\xd0\x8d\xf1\xaf\x13\x4c\x2d\x93\xd5\x0f\x5d\x46\x41\xd8\x49\x1e\x38\x5e\xb7\x64\x8d\x99\x73\x9c\x66\x54\xc2\xd7\xac\x9c\xc9\xb5\x01\x80\x4e\x3f\x90\xe6\x26\xa7\xec\xfc\x33\x2d\x98\x62\x86\x73\x71\xd5\xfc\xc7\xb4\xdc\xb3\x4c\x5f\x09\xd6\xcc\xb5\xe5\x63\x8c\x5f\xcf\xb1\x57\x0d\x70\x66\xfd\xcb\x5f\x92\x18\x47\xa1\x39\xa2\xc0\xff\x18\x66\x09\xf8\x4d\x36\xcd\x9e\x21\x7b\x15\xef\x3e\xe7\xac\xba\x85\xc8\x5f\xa5\xa5\x5c\xaf\xe6\x7b\xfb\x31\xc6\xd7\x72\xe3\x1a\x81\x6d\xc6\x27\x17\xe1\xd4\xb1\xc0\x09\x8b\xdf\x1b\xa1\x5d\x25\x38\x66\xa8\x93\x26\x87\x1c\xbb\x56\xc3\x22\x33\x9b\x7e\x83\x6b\xce\x28\x13\x7e\x0e\x44\x29\x2e\xfc\xf0\x9c\xe8\xf1\x1f\x42\xbb\x54\x15\xb2\x8a\x4d\x9e\x09\x5d\xd5\xeb\x6f\xb5\x3d\x55\x80\x4a\xeb\xb5\x03\x89\x5f\xa5\x62\x4c\x77\xa1\x8d\x50\x89\x77\x03\xbd\xca\x9d\x35\xf4\x2a\xc1\x80\x58\x20\x71\xec\x71\x8a\xfa\x63\xd0\x95\x50\x44\x5b\x96\x08\x50\xdc\xc7\x9e\xef\xde\x44\xaf\x5d\x37\xca\xfb\x8d\xe5\xe4\x8d\xe5\xe4\x1f\xd1\x72\xf2\x26\xb2\xf2\xba\xc6\x02\x52\x9f\x5c\xeb\xa1\x05\x57\xe3\x4b\x9b\x0a\xc8\xe3\xb4\xe6\x63\x0c\x6b\xa9\x6e\xd7\x52\x12\x6b\x31\xa0\xac\x16\xd4\xa0\xae\xd2\xf3\x6b\xb5\x52\x70\xc1\x22\x9f\xa8\x61\x0f\xb4\x2a\x63\x31\x0d\xf4\x9b\x57\xd6\x34\x73\xe5\x69\x9b\xf3\xb2\x2a\xb1\x3c\x18\xdc\xf5\xe8\x9b\x29\x50\x90\x1e\x5f\x09\x27\xef\xf4\xcd\x1c\x55\x50\xb5\xc7\xc4\x37\xc1\xdc\xd9\xb1\xf1\xb6\x4b\xda\xf9\xb6\xac\x95\xe4\x3b\x9c\x6f\x78\x3c\x6c\x98\x5f\x4c\x1a\xd6\xe3\xb2\x4c\xe5\x1b\x5d\x32\x0b\xc1\x2d\xc9\x05\xb3\x57\xec\x52\x40\x87\xdf\x32\x8f\x53\xe4\xc9\x4b\x62\x07\x55\xaa\x2c\xb5\x93\x4f\x75\x0d\x2b\xee\x77\xe7\xf9\x01\x0a\x49\x35\x94\x89\x57\x8d\x42\xc4\x72\x45\xb7\xa6\x57\xcc\xd0\x67\xf3\x37\x10\x6c\x4a\x57\xd8\xd8\x82\xfb\x5f\x17\x42\x07\xca\xaa\x11\x8a\xa2\x34\x62\x2a\xa9\x7e\x4b\x43\xb5\x37\x14\x43\x47\xa5\x1f\xfd\x61\xac\x1e\x96\x46\x16\x17\xa8\x69\x83\x8b\xfb\x52\x82\x5e\x6f\x54\xa3\xd9\xd7\xe1\xd5\xd7\x7a\xb1\xc7\x79\xeb\x48\x1b\x55\x4b\x2b\x86\x21\xaf\xb6\xaa\xad\xf4\xa8\x33\xd6\x11\x5c\x9f\x28\x7d\xe1\xac\x3c\x69\xb7\x26\xee\x21\x76\x0b\xa3\x0e\x5c\xb4\x77\xb8\x33\xfd\x90\x6c\x71\xfb\x60\x45\x64\xbe\x37\x6d\xed\x82\x39\x68\xd8\xc7\xee\x3d\xae\x30\xb2\xe6\xba\x58\x3a\xe8\xf9\x38\xff\x20\xa2\x8e\x1b\xbd\xe7\x46\xcf\xef\x7a\x69\xbc\xee\x81\xb4\x61\x18\xc4\x4b\xcd\x8d\xa5\x44\x00\xca\x19\x2a\xa4\x98\xba\x96\x8e\xb4\x3d\x16\x64\xc1\xa1\x1c\x27\x33\xf6\x22\x44\x90\x9e\xb2\xd2\x31\x1b\x55\x9e\xef\xd9\xa8\xea\xcd\x2b\x9b\x10\x66\xaa\xb4\x67\xbd\x02\x9e\xa1\xea\x1b\x40\xc1\xa3\x52\x3b\x63\x61\x9e\xcc\xb7\x6c\x5d\x7d\x65\x34\x48\x77\x7d\x9b\x87\xab\xa9\xea\x2a\xda\x57\xe8\x25\x22\x5b\x2f\x79\x07\xc7\xeb\xa1\x5e\x1f\x73\x3c\x3a\xc5\xe3\x38\x4b\xba\x09\xe3\x74\xd7\xed\x0b\x03\xa7\x45\xae\x64\x4c\x14\x01\xa7\x5a\x95\x00\x11\x76\xb3\x84\xd6\x95\xc1\xe5\x26\x99\xba\xd4\x5e\xe3\x5a\x7b\xa8\x33\x21\xda\x93\x7c\xe9\x94\xa8\x93\xda\x9f\x11\x55\x95\x83\x7b\x2b\x02\xf8\x32\x74\x09\x80\xd6\x17\x0e\x1b\xc8\x08\x6e\xc8\x1e\x19\x54\x98\xad\x0e\xef\x9f\xa6\xea\xf0\x78\x9c\x16\xc6\x42\x81\x03\x22\xcc\x79\xca\x9e\x1e\x74\xf2\xc7\x1a\xe6\x3c\xf7\x6e\x94\x3f\x37\x4f\x17\x7d\xc1\xa7\x8b\x7e\x51\x63\xcb\x2f\x7e\x18\x15\x0a\x7b\xca\xeb\x5e\x60\xa9\xce\xd8\x16\x33\xd5\xff\x66\xde\x5e\x15\xb5\xe8\x69\x4b\x35\x75\x9d\x01\x70\x59\xdc\x2a\x4b\x2a\x45\xc9\xa3\x5e\xe7\x3f\x51\x72\x64\x7e\xea\x35\x35\xc4\x44\x53\xe4\x99\x62\xac\xa2\x8f\x2c\x9d\xa8\x0c\xf6\xc0\x92\x55\x1d\x10\xeb\x6a\x5b\xae\xab\x3f\xe0\xd5\xaa\x94\x08\xed\x60\xfe\x3e\x63\x24\xb0\xe5\xa6\x63\xf9\xe4\xa1\x62\x1a\xa6\x11\x65\x82\xf3\x1e\x55\xc4\xf7\x2c\xbf\xa8\x2e\xa1\xc8\xd7\xf9\xa8\x88\xc4\x1c\x13\xd1\xc4\x2e\xd8\xd0\x31\x7c\x06\x41\xab\x96\x7d\xa1\xe8\x7d\x43\xbf\xbf\x41\x13\xa4\xf0\xe4\x27\x94\xf7\xff\x3d\x04\x14\x36\xe3\x4e\xf6\x60\x89\xae\xa4\x99\x72\x57\xcc\xa4\xb8\x32\x46\xce\x34\x25\xe8\x7b\x3d\x31\x86\x01\x01\x52\x8c\xe9\x0c\x7e\x53\xb3\x2b\xca\x34\x4e\x18\xe8\xed\x2c\xe5\xd3\x71\xbb\x7a\x8c\x3a\xfd\xa0\x6d\x8a\x4f\x7f\x4e\x44\xfb\x4e\xf0\xf1\xab\x1c\xe7\xc3\xcb\xa8\x98\x11\xb7\xae\xc0\x4b\xd2\x81\xf5\x24\x8d\x71\x01\x8e\x3a\xb8\xdb\x76\x3c\xfa\xad\xd0\xa5\xdf\x6a\x82\x77\xee\x07\xd9\xb8\xe1\x02\xb9\x28\x04\x1b\xa6\xb3\x4b\xf9\xa8\x4c\xd9\x93\x32\x54\x9b\x3f\x2c\x13\x65\x4a\x4a\xc1\xe9\xf9\xe0\xbc\xfc\xdb\xba\xa0\xbc\xfc\x1b\x03\xe3\xa8\xb6\x9c\x40\x94\xad\x52\x50\xb0\xeb\x42\x21\x43\x68\x81\x69\x33\x33\xee\x6a\xe5\xa7\x7e\x60\xd5\x0f\x6a\x88\x08\xc3\x4b\x56\x49\xaf\xfb\x9e\xf9\xc1\x11\x15\x31\xee\x40\xd8\x07\x08\x64\xe4\xc6\x0a\x96\xae\xf1\x29\xa4\xb9\xd0\x59\xc2\xb4\x01\xe9\x64\x58\x14\xd2\xdb\x6c\x7a\x8c\xe4\xff\x72\xf2\xd3\x74\x48\x0a\x52\xfd\xf8\xfc\xd2\xf8\x2f\xe1\x3c\xeb\x18\x33\x6c\x7f\x92\x76\xd8\x37\xe9\x10\x67\x02\x27\x57\xc2\xe4\x9c\x94\x72\x38\x0e\xa7\x8c\x53\x9f\xf2\x55\x3b\x0c\x1f\xc8\x17\xb8\x4b\x65\x5c\x13\x43\x33\x71\xb6\x15\x9d\xb2\xac\x21\x5b\x8c\x59\x90\xc5\x36\x51\xf8\x00\x9f\xcc\x97\xfd\x94\xb7\xea\xf6\x43\xd8\xa2\xcb\xab\x68\x2d\xf2\xfe\x3b\x51\x58\xcf\x76\x54\x66\xb2\x30\x8c\xb8\x80\xdd\xe0\x6e\x3c\x50\x95\x06\x28\x15\x02\xec\xf2\xca\x4c\x43\x09\x49\x4b\x40\x3b\xb0\x8b\x58\xda\xef\x93\x60\x5d\x63\xd9\xe5\xbd\xeb\x02\x25\x00\x3c\x91\x13\x1b\xc0\xc0\x58\x83\x10\x02\x96\xd9\x0c\xbd\xed\x42\x4c\x1b\x15\x2f\xa7\xd9\x04\x2c\x87\xad\x71\xc3\xc5\x88\xae\x3c\xbb\xef\x88\x4b\xe5\x46\x1f\x03\x70\x20\xd3\xdc\x6b\xf7\xe9\x8f\x87\x4f\x5f\xef\xf9\x62\x61\x04\x6d\xf6\x59\x19\xba\x5b\x95\x67\xd5\x32\xb9\x90\xf3\x95\x56\x38\xa4\x61\x28\x11\xf0\x2e\xbe\xb0\xc5\x58\xd9\x8d\xbd\x9d\xed\x1a\x6f\x72\x95\x31\xe9\xaa\x00\x35\x29\xf9\x71\x78\x81\xfe\xbe\x35\x8d\x00\xbb\x83\x50\x0c\xbd\x79\x69\xfe\x46\x0c\xfd\x37\x12\x43\x23\xa2\x5e\xdc\xf4\xa6\x23\xe5\x49\x70\xd1\x7b\x36\xca\xc6\x43\xaf\x3f\x10\x36\x3a\x27\x90\x61\xa5\x49\xb8\xfb\xbf\x3c\xf4\x2c\xb2\x54\xa6\x4d\x77\x96\x6c\x5b\x7e\xb2\xb9\x92\xda\x0a\x45\xd3\x95\x85\xd2\x75\xc4\xd1\x40\xa2\x1c\xd2\x5d\xea\x72\x89\x72\xad\xcb\xe9\x69\x36\x4c\x15\x6e\x0d\xe2\x7e\x45\x46\xc8\xc4\xd7\x1e\xab\xe5\x50\x77\x96\x57\x95\x5a\xfe\x70\xdb\x67\x97\x79\x1b\x28\xf4\x36\x96\x4b\xbd\x57\xbb\xde\x16\xcb\xc6\x75\xbd\xf2\xd5\x33\x93\xea\xd6\xa1\x2c\x2c\xd3\x15\xef\xf5\x7d\x77\x26\x06\x1f\x10\x7c\xbb\x07\xa4\x94\xb8\xcc\x0f\x8c\x06\xe3\x5d\x21\xbb\xc4\x26\xf0\xd8\xfe\x25\x32\x1c\x38\x90\x5e\x76\x65\xcc\xf3\xaf\xe5\x82\x98\x39\xae\x38\x93\x57\x7e\x57\x5c\xd8\x9c\x3f\xb3\x1c\x94\x62\x95\x9c\x0b\x63\x4a\x21\xaa\x3e\xb6\xf1\x5d\xb2\x91\xa4\xe7\x1b\xc9\x9e\xfa\x77\x7a\xbe\xe1\x37\xa3\xdd\x74\xf0\xd6\x39\x02\xb4\xbd\x35\x2e\xfc\x6b\xe3\x82\xdf\x1b\x17\xa2\x38\x1b\xa5\x41\x13\xce\x1e\x6d\x6e\x26\x87\x40\x90\x54\xc5\xe1\x30\xbd\x54\x04\x78\x38\x41\x27\xde\x62\x9a\x0d\x46\x68\xe8\x75\x36\x9f\x4f\xf7\x36\x37\x2f\x2e\x2e\xba\x13\xb5\x1f\xba\xa7\xf9\xfb\xcd\xe9\xf9\x58\xb1\x33\xef\xef\xdc\xbb\x87\x44\x57\x71\xc3\x27\xe7\x4e\x64\xb1\x0e\x47\x38\xa1\xbd\xfe\x06\xd8\x95\x11\x98\x90\xb0\xb5\xb5\xc1\x41\x70\x2e\xfd\x6c\xbe\xa0\x1c\x4c\x11\x4c\x59\xaf\x9f\x4c\x72\xc5\x24\xc1\xb4\xa9\xdf\x06\xc4\x0d\xc7\xa4\x7d\xb2\xdc\xd9\x2d\xd1\xa2\x71\xd1\x6a\x8a\xce\xa1\x4d\x6c\x6c\xcf\xcc\x18\xbc\x09\xe5\x7a\x0f\x2e\xfc\xed\x12\xc7\x11\x89\xb2\xfc\x4b\xff\x42\xdc\xfa\x17\xe2\xda\xbf\xde\x02\x7a\x83\x70\xe0\x5e\xa3\x02\xac\x4c\x65\x65\xf2\x35\xf9\xe6\x5a\x2f\x4c\xe0\x25\xac\x66\x82\x15\x32\x69\xbc\x1c\xd0\x66\x5e\x06\xbe\x79\xbe\xa6\xcc\xbc\x88\x4e\x5a\x4f\x85\xa6\xf5\x64\xa8\x3d\x43\xa0\xe9\xa7\x01\x8d\xbe\x00\x08\xfa\xa5\xfb\x92\x7a\x35\x4d\xe9\x9e\x4f\xa6\x0b\x8a\x63\x5e\x66\xba\x1f\x25\x8e\x2d\x9f\xa2\x8b\x76\xb0\x0e\xa3\x77\x25\x6d\x5c\xc5\x95\x85\x9f\x1d\x51\xc7\x15\xc3\x17\xb5\x6b\x29\x87\x46\x00\x3e\x53\x5a\x68\x30\x7f\xa6\x38\x31\xc1\x18\xb9\x92\x45\x73\x01\x5c\xe0\xc2\x82\x98\xce\x0b\xc6\xf5\x5f\x58\x96\xa9\xc0\x2a\x55\x2e\x3e\x97\x58\x5b\xcb\x25\x94\x2d\xcc\xae\xdd\x9d\x67\x1c\x52\xa3\x83\x0f\x35\x47\x94\x13\xea\x98\xe8\xdf\xa8\xa6\xca\xfe\x2c\x53\x09\x45\x14\x3e\xa7\x99\x7f\x7a\xea\x94\x0a\x13\xfd\xb9\x31\xcd\x37\xaf\x02\xf8\x26\x5c\xba\x85\x79\xb5\x7b\xb5\x66\x09\x08\x35\xb9\xeb\x01\x0a\xec\x88\x27\x5d\x13\xfa\xbf\x19\x20\x7a\x2b\x54\xe8\xf0\x89\x2b\x53\x53\x18\x1d\x8c\x0f\x9a\x6e\xb4\x44\xad\x43\x6c\x63\x2b\x1a\xf1\x1f\xf7\x47\x32\x0f\xc1\x71\xb8\x19\x02\xe3\xf2\xf8\x4b\x0d\x24\x3f\x75\x8f\xc7\x8b\x59\xa9\x86\x09\x2b\x79\x90\x98\x86\xe2\x20\x94\x6b\xb9\x44\x76\xf5\x93\x11\x15\xeb\xc8\x39\x35\x7b\x0b\x80\x18\x64\x97\xd6\x5b\xdb\x12\xfd\x61\x64\xb4\x06\x38\x6f\xc0\x0c\xe6\x2a\x1f\x91\x43\x76\xdf\x53\xc3\x51\xa4\x86\x76\xc4\x09\x7b\x1b\x7b\xbd\xde\xbd\xf6\x46\x4c\x62\x04\x35\x49\xf0\xcc\xf9\xf6\xd6\x8d\x9a\xe4\x46\x4d\x72\x9d\x6a\x92\x25\xc1\x55\xdc\xab\xfb\xb2\x56\xf8\x2a\xbf\xa9\xf2\x2a\x9d\x8a\xa7\xc4\x54\xe1\x29\x24\x99\xfc\xa7\x93\x33\x50\xb4\x0f\x0f\x48\x59\x2a\x0a\x66\x3a\xaf\x43\x9a\x54\x77\xb1\x9e\x9f\x52\xd8\xa9\x5a\x9a\x0b\x2c\xfc\xa5\x2d\xf1\x33\x3a\xf2\xf5\xbd\x50\x95\x86\x03\xef\xe0\x6a\x94\x03\x02\x75\x7a\x1a\x2b\xe5\xb4\x08\x73\x2c\x51\x12\x96\xb9\x2d\x34\x2f\x55\x25\xaf\x4f\x42\xa7\x85\xcb\x86\x42\x4a\xd7\x50\x02\xad\x89\xb0\x96\xd1\x4c\xf4\x35\xfa\x61\x34\x79\x07\x12\x5b\x2c\xbd\x6b\x1f\xbe\xfd\xec\x11\xa0\x11\x40\xd1\x34\xae\x9e\xa7\x4e\xa1\x34\x21\xf0\x50\x4d\xfd\x28\x6b\x9f\x3d\xba\x4c\x19\x6a\x73\x0d\xde\xfd\xa2\x23\xaf\x6e\xb3\x67\x79\x82\x3b\xf4\xd1\x00\xcc\x7c\x83\x3b\xee\xed\x3b\x91\x58\x01\x0d\x88\xf4\xb5\xa5\xfe\x03\xd3\xd9\xfe\xf4\x83\xb1\xc6\x73\xd1\x40\xb1\x73\xcd\xa2\x46\x5a\xf5\x81\x0b\xea\x43\x8e\xb0\x52\xb6\x44\x60\x8f\x13\x8c\x6e\x96\x16\xd9\xcb\xc5\x9c\xbb\x7d\xeb\x2e\x1a\x60\x80\xdc\x08\x8d\x86\xb9\x45\x80\x8c\x0b\xb6\xbd\xb5\x82\x0d\x30\x42\xf8\xf2\xe4\x24\x6a\x38\x30\x3f\x5b\x9c\x1f\xaf\x09\x3e\x8b\x8b\x61\x82\x9d\x05\x41\x91\xfd\x58\x67\x5b\xc1\xe8\x1d\x5a\x84\x33\x10\xcb\xe3\xe6\xd6\x8d\xbe\x5a\xde\x46\xd9\x2c\x35\x76\xc5\xb4\x2e\x9f\x28\x98\x8b\xd2\x89\x42\x0c\x38\xcb\x26\x07\x76\x4f\x7f\x5c\x75\x0d\x26\xe5\x4b\xb0\x7e\xcb\x08\xf4\xc4\x0b\x56\xa7\x63\xff\x21\x62\x95\x8e\x44\x49\x36\x40\xff\xd7\x18\x89\xa9\x59\x3d\x9e\xf5\xda\x87\xda\x95\xed\x6b\xab\x0d\x76\x97\xc8\x5a\xd2\xc4\x54\xd7\x4f\xbe\x0b\xda\xc7\xda\xa2\xfd\x24\x04\x02\x0b\x89\xce\x0d\x45\xe5\xa4\x92\x08\xd3\x35\x6a\x7d\xcc\x19\x27\x35\x36\x44\x6f\xd7\xd1\xb4\x98\xda\x25\x36\x49\x66\xd4\x86\x56\xf3\x00\x0a\xb0\xca\x07\xa2\x60\x89\xa1\x37\x14\x6c\x8b\xe3\xcd\x56\x6d\x0b\x1f\x74\x8d\xdc\x70\x82\xf1\xba\x1c\xf1\xdb\xd1\x35\x8c\x54\x30\xeb\x27\x40\x06\xc4\xa9\x05\x32\x14\x94\x20\xdb\xaa\x4b\x41\xf6\xf7\xea\x52\x90\xfd\xcd\x10\xa8\xba\x65\x5f\xfc\x2a\xdf\x8e\xa7\x4b\xbe\x27\x3f\xe8\x88\xe2\x9d\x06\xc6\xac\x74\xd9\x48\x49\x85\x3e\xca\x1d\xab\x4f\x19\x27\xb6\x6c\x62\x78\x05\x31\x30\xce\xce\x89\x39\xe7\x35\x4a\xa2\xcf\xc4\xf4\x5f\xce\x8a\x3d\x02\xe3\x4a\xd1\x1e\x39\xa2\x56\x1b\xfc\x20\x27\x2e\x3c\x30\xec\x04\xb6\x93\xc1\x68\x36\xa0\xe6\x20\x1c\xee\x6f\x4f\xb2\x29\x1c\x4d\x3d\xa6\xdc\xb1\x63\x1e\x2c\x8a\x79\x7e\xfe\x7a\x34\x9d\xaa\x93\x49\x3f\x4d\x1f\x9b\x54\xbb\x8e\x18\xf4\xd3\xbd\x0e\xa0\x63\x7e\xea\x20\x46\x9f\xc4\x3c\xcf\x5c\xab\xbc\x4b\x4a\x16\x71\xf4\x3d\x0c\x0d\xe9\x1c\x3f\x17\x0c\x85\xab\x62\xeb\x5c\x3c\x7d\xdb\x2d\xf0\x59\x55\x23\xd4\x68\x03\xc5\xc4\x28\x6c\x3d\x3e\x06\xc7\xe7\x57\xb7\x86\xe5\x44\x73\xae\x26\x6f\x2f\x13\x82\xd3\x2b\x4d\x55\xad\x99\x25\xa8\x13\x37\x64\x19\xeb\x37\x85\x6a\xb0\x43\x8c\x98\xbd\xa1\x66\x6f\xf0\x0e\xde\x3c\x68\x0b\x96\xdd\xf2\x83\x72\x4f\x98\xd6\xdd\x32\xed\x85\xf8\x20\x4b\xe9\x63\x8e\x7d\xb4\x19\x1b\xab\xdb\xb0\x3f\xc5\x19\x7d\x10\xa0\x78\x3b\xa0\x0d\x12\x8f\xf9\x09\xa9\xb3\xdd\xef\x76\x5c\x28\x91\x98\xe4\x0c\x1e\x69\xd2\xa4\x1a\x95\x8e\x13\x57\xe6\x55\x3a\x83\x7d\xab\x0e\xa0\xf1\xd0\x18\xdf\xf1\xf2\x28\x1c\x91\x4e\xcf\xde\x41\x92\x9c\x73\x10\x93\x8c\xa4\x0c\x24\x46\xf3\xca\xf2\x9a\x3e\x66\x98\x1c\xb3\x07\x62\x59\x6a\xa1\x61\xdb\x6d\x88\x53\x3c\x8c\x7d\xcb\xb4\x10\xcd\x86\x16\xd3\x1a\xad\x56\x0c\xd7\xba\x88\x38\xf4\xae\x62\x20\xda\x2d\xb7\x03\x95\x62\x7f\x5c\xcb\x1f\xe9\xb5\x25\x02\xa4\x5b\x21\x96\x85\x48\xd7\x69\x51\xa9\x0e\xf5\x84\xb2\x55\x78\xc6\x43\xaf\x04\xb7\xe6\x03\xe5\x6d\xd0\xb8\x4b\x6c\x4e\xb2\x0b\xfd\xf3\x67\x1e\x8c\xbd\xb4\x17\xd0\x6f\x9a\x6e\xfc\xba\x81\x82\xd5\xc8\xf9\xbe\x66\x95\xd2\x9b\xf8\x0c\x25\x6a\x59\x1f\xd3\x12\x94\x5a\xc7\x51\x85\x40\xcd\x59\xd2\x4a\x00\x07\x43\xde\x10\x18\x96\x09\x23\x3a\xf0\x8e\x6f\x4f\xab\xcb\xf6\x1c\x2b\x6c\xe2\xfc\x94\x5a\xac\x69\xd6\x8f\x62\xd5\x78\xda\xa0\x8d\xbd\x1d\x8c\xaf\x53\x19\xa5\x07\x55\x4d\xea\x03\xcd\xcd\x42\x25\xd5\xc6\xde\xbd\x50\xa7\xda\xfb\x2c\x01\x8d\x91\xf2\x15\x9e\x99\x8f\x86\x08\xf9\xf7\xe2\x1a\x62\x55\xe4\xf9\xf8\x38\x9d\xfd\x55\x89\x17\xd3\xda\xda\x31\x57\xe5\x4b\xeb\xc8\x06\x00\x13\xc1\xe1\x57\xa5\xe0\x62\xda\x04\x68\x9c\xc7\x2c\x80\xa8\xc8\xad\x6b\xb3\x6d\xd1\xdd\x50\xf0\xcd\xcf\xaa\x3f\xc2\x19\x97\x0a\xa4\x69\x3a\x40\x6d\x8d\xd0\x20\x51\x62\xbd\xf6\x0b\x2a\xac\x4e\x90\xe2\x9d\x62\xb8\xfe\xba\x98\xcf\xb3\xd9\x3a\x4a\x2a\xe2\xb4\xbf\xcf\x67\xa3\xdf\x20\xca\xdd\x98\x8b\x49\x06\xa0\x7d\xaf\xf4\xcf\x20\x78\x0d\xb0\x6c\xd3\x67\xc3\x74\xec\xf5\xce\xd2\x79\x21\x8b\x53\x5d\xbe\x05\xef\xbc\x57\x68\xc0\x7c\x2f\x12\x1e\xa1\x54\x3b\xbf\x73\x1b\x76\x5a\x5a\x6e\x58\x03\x29\xbe\x5c\x3d\x54\x59\x4f\xf2\x8b\xc9\x8b\x6c\xb2\xe0\x8d\xfb\x9d\x79\xb8\xc2\xdd\x39\xb5\x24\x4e\x9b\xbd\x3b\x86\xa1\x3c\x1a\xa3\x80\xb8\xb9\xa9\x16\xf0\x3c\x7f\xaf\x86\x71\xa6\xfe\x9e\x51\xd1\x84\x5e\x48\x6f\x27\x17\x59\x72\x91\x4e\x30\xb8\xcf\xbb\x2c\x9b\x26\xa3\x39\x6b\xd5\x3e\x02\xd6\xe0\x8f\x80\x89\x8e\x69\x21\x5e\x6b\xad\x91\xbf\x60\xb6\xe0\x27\xe9\xb9\x30\xcb\xc7\x8f\x4e\xe5\xd0\x96\xea\x27\xd4\xf1\xbd\xf8\x1e\x46\xe0\x69\x5c\x7c\xe5\xd3\x56\xac\x53\x30\x51\x98\xc1\x10\x64\xa7\x6e\x80\x10\x54\x9f\x85\xb9\xf3\x97\x88\x90\x44\xf8\x0f\xc5\x97\xc2\x04\x2b\xf0\x10\xf4\x76\xd2\x98\x7e\x48\x40\x7c\x0c\xf0\x1c\xb3\xa2\x8f\x43\x38\x94\xf2\xc1\xf1\x15\xb1\xab\x60\xca\x62\x56\xc0\xf4\x36\xa6\xf6\x55\x21\x96\x19\x9f\x7a\xe8\x2e\x98\x75\xae\x0e\x2c\xd9\x7c\xfe\xd0\xac\x7a\xf8\x07\x14\xc5\x6a\xa1\x0b\x22\xad\x1c\x9b\x44\xf6\x61\x3a\x7b\x87\xb8\x5e\xbe\x7a\xe0\x19\x5d\x63\xed\xea\x8f\xbe\xf6\xd8\xaf\x5d\x8b\x05\xbd\x25\x41\xd8\xcd\x65\x9a\x25\xdf\xbc\x6f\x34\x2b\x14\xfb\x35\x1a\x2b\xb6\xa9\x88\x28\x3a\x3a\xfd\x9d\xe8\x15\xb6\x3a\x37\xa3\xd5\x5e\xeb\x67\x2e\xb0\x9e\x05\x4a\x31\x5c\x58\x58\x0d\xc3\x32\x05\x26\x01\x9f\x60\x67\x2d\x0f\x74\x7a\x9b\xdd\x02\x2b\x4c\x05\x21\x47\x77\x68\xef\x20\xe0\x26\x33\x9e\x65\x67\xd6\x45\x4c\x76\xc8\x60\x9c\x22\x78\x55\x7c\x29\xa8\xcb\x18\x93\xc0\x51\xa2\xf1\x84\xd1\xe6\x06\xf7\x94\x90\x32\xc6\x58\x91\x0f\x23\x62\xf0\x1e\xda\x02\x71\xad\xdb\xd8\x5b\x27\x87\xeb\x95\x32\x1e\x5c\xac\x3b\xf4\x20\x6b\x27\x02\x60\x9a\x2d\x2c\xdc\x6a\x87\x2d\x3f\x76\xb4\x35\xd6\xa0\x25\xbd\x91\xaa\x3f\x39\x0a\x19\xab\x6a\x09\x28\xab\xf9\x89\xb9\x85\xc8\xd9\x7a\xae\x7a\xfa\x9c\xb3\xf5\x51\x6e\x61\x50\xe6\xd4\x9c\x26\x26\xfb\x33\x2d\x0a\x4d\xb5\x28\xa8\x9f\xdb\x7e\x0a\x34\xd2\x80\xf0\xd6\xbc\xb8\x6d\x32\x38\x76\x44\xab\xff\x90\xa5\xef\xb3\x58\x75\xcc\xe0\xd5\x2b\xe7\xf5\x75\x3a\x2a\xb2\x21\xf9\x54\x36\xf6\x28\xcd\x79\x59\x7e\x01\xbc\x3c\xd6\xee\x9c\xa5\xb3\x5c\x09\xfe\x33\x85\x77\x9f\x1b\x25\x82\xd5\xac\x8b\x11\xb5\x16\xda\x8c\x60\x8d\x45\x36\x55\x2b\x67\x48\x8b\x43\x07\xd9\x34\xc5\x18\x8d\x66\x91\x75\xfa\xe1\x68\xae\xc4\xad\xcf\x3f\x7b\x70\x50\xae\xbe\xc8\x5a\x7b\x14\x01\x8f\xb7\xe4\x79\x8c\x91\xa6\xb1\xb5\x5e\x84\x9f\x8f\x5c\x86\xe3\xc7\x88\x49\xad\xf3\xc6\x3f\x61\x09\xab\x4d\x83\x74\x6c\x03\x3b\xc0\x30\x25\xd4\x54\xc4\x29\x41\xa8\xb4\x88\x97\x8b\x58\xcb\x21\x08\xdd\xdf\x9e\x83\x25\x4f\xe4\x38\x27\xf4\x46\x96\x48\x17\xda\x8f\xd5\xf7\x23\x2b\xc5\xaa\x0f\xcc\x1b\xae\xe1\x80\x02\xda\x54\x32\xa0\xa0\xdc\xf2\x01\x35\xd2\xc5\x3c\x6f\xac\x01\xb4\x7b\x99\xb6\x62\x11\xcc\x56\xab\x5a\x00\x53\xe6\x0f\x3d\xf9\x4b\x06\x22\xca\x7c\xb9\x49\x2f\xd5\x96\x39\x55\x4e\x4d\xd3\x44\xa1\x7f\xda\xd8\xbb\xd7\x0f\x94\x61\xfd\x3f\xce\xeb\x5e\x5c\xc5\x65\x09\xf4\x6a\x6a\x2e\x47\xd7\x3f\xaf\xaa\xeb\xdf\x45\x5d\xb4\x9a\xd0\x53\x54\x5d\xa1\x9a\x03\x6e\xa9\xfe\xa0\x30\x6b\x20\x64\xb9\x25\x2a\x8e\xb3\xac\x44\xb3\x21\x15\x5e\x2f\xf2\x99\x7b\xc7\xca\x4a\x52\x4b\xab\x59\x7f\xb5\x0a\x2d\x12\xde\x62\x2e\xd1\x6e\x55\x03\x86\x3a\x2d\xd3\x9c\xb6\xfd\xe9\xf1\x43\x58\x1c\x7f\xcb\x0f\x64\xf3\x32\x67\xfd\x43\xb8\x30\xd7\xc4\x4b\xb4\xee\x72\xaf\xac\x1e\x44\x6c\x7b\xfb\xc6\x2c\xf9\xc6\x2c\xf9\x8b\x46\xe9\x66\xfc\xf9\x6a\x47\x02\xb1\xf4\x5f\xf8\xe6\x03\x9a\xaa\x73\xa3\xf1\xd9\x0e\x91\xab\x47\xd0\xd5\x86\x0c\x6f\x19\xcd\x62\x06\xad\x0a\x0e\x97\x09\x5f\x6b\xc6\xcc\x85\x66\xc1\x0b\x0e\x9a\xa8\x32\xe2\x2a\x39\x8c\xb4\x9a\x93\xab\xc5\xeb\xdd\x9c\xfc\x90\x39\x87\xa7\x95\x15\xac\x2e\xa4\x55\x60\x93\x02\xc8\xf6\x4c\x67\x7b\xb5\x96\x9c\x80\xa5\xea\xe8\x4f\x9a\xbc\xaf\x20\xc2\x89\x08\x95\xee\xe6\xdd\x3f\x26\xf4\x45\xbc\x95\xd3\x61\xde\x98\x00\xb6\xe4\xfc\xc0\x8d\xb5\xc6\xd9\xb1\xf3\xc7\xe4\x38\x57\xa3\x2a\x7f\xd0\xab\xd4\xa2\xca\xcd\xe0\x8b\x71\xaf\xcb\x2f\x22\x79\xeb\x65\x7c\x66\xfe\x41\x6d\x22\x32\x71\xa7\x8b\xa7\x8e\x4a\xb2\x58\xfd\x4b\x76\xfc\x6e\x34\x3f\x4c\xa7\xdf\xab\x0d\x8a\xf7\x70\x9a\x1d\x6d\xcc\x4e\x8f\xd3\xe6\x56\x1b\xff\xe7\x1e\x03\x5f\xca\xb6\x7a\x05\xca\x18\x53\x49\x18\x3c\x6e\x4f\xda\xb9\x5b\x13\x7d\xc6\xb3\x4d\x72\xa2\x3f\xc9\x77\xc9\x16\x04\xcb\xdf\xd2\xb7\x55\x2b\x90\x2e\x7e\xe3\x11\x67\x2c\xeb\x1e\x02\x9f\x57\x19\xc4\x57\x9d\x99\x4e\x07\x57\x11\xf5\x29\xce\x1a\xc4\x66\xdd\xc7\xab\x6f\x18\xd5\x1b\x46\xf5\xcb\xf8\xcf\x45\xec\x86\x42\xb3\x21\x7b\x50\xcd\x47\xab\x18\xfe\xa8\xd2\x7f\xd0\x83\x4a\xbb\x38\xc4\x8b\x04\x2f\xd8\x14\xd1\xe0\x3a\xce\xe7\x6d\x0e\x9e\xbd\x55\x05\xde\x6b\xfb\x00\x67\x64\x59\x16\x6f\x48\x91\x59\xe0\x47\x8f\xf3\xf9\x3c\x3f\xb7\x01\x87\xce\xac\x19\xc1\xf2\x16\xf4\xe3\xbe\xf6\x25\xdd\x06\xbd\xe4\xc0\x1f\xbc\xb1\xe7\xe7\x93\xd1\xf0\x85\x3a\x72\xe6\xb1\x07\x61\x4c\x9e\x8c\x25\x08\xcf\x5f\x6a\x53\x5c\xc5\x62\x36\xb9\x07\xfc\x5b\xb4\x5f\xc4\x55\x37\x50\x72\x93\xc7\xab\xbd\x46\x13\x00\x51\xa7\x27\x35\x04\x1b\xb1\x32\x36\x3e\xca\x5c\x3e\xc0\x6b\x72\x56\xcc\x4f\x4e\x54\xe3\xbf\xd0\x59\x0d\x77\xd7\x74\x86\xae\x63\x45\xe5\x23\x94\xb4\x92\xf5\x73\x9d\xe0\x14\x22\x92\xac\x19\xe6\x73\x2f\x42\x85\xe5\x2f\x50\xeb\xf5\x12\x47\xe2\x9b\xe6\xaa\x6c\xc5\x57\xf4\x80\xb1\xd8\xf2\xaa\x51\x85\xc3\x7c\x1a\xaf\xd3\xe9\x43\xa5\x4e\x8f\x55\xcb\x4d\x17\xe1\x50\xe1\x35\x4e\xbd\x41\xa0\xbf\x1d\xe0\x5f\x02\xd8\xa0\xb9\x1d\x50\x9c\xf9\x39\xab\x04\x0f\xae\x76\xc0\x03\x39\xec\x59\x7a\x3e\x1a\x5f\x96\x9b\xff\x63\x88\xd6\x67\xb6\xa0\xac\x4c\x42\x9c\xe2\xda\x84\xf5\x8c\xf4\xbf\xeb\x4b\xa3\x21\xeb\x76\xb9\x95\xdc\x13\x39\xd2\x58\xe6\xe2\x6c\x34\xe7\x31\x3b\xd4\x24\x9e\x8c\x81\x88\x35\xce\x46\xc3\x61\x36\xf1\xdd\x08\xd5\xd4\xab\x3f\x65\x7e\x7e\x7d\x66\x60\x55\x64\x33\x0a\xfc\x69\x8c\xa9\x58\x2f\xc0\x2e\xce\x2f\x85\x0f\xe2\x8c\xc6\x11\xc3\x3b\x58\x46\xba\xd6\x57\x8b\xd8\x4f\xf6\xbc\xc7\x1d\xc8\x8d\xa3\xac\xa2\x26\x6a\xaa\x2a\x77\xf2\x61\x3b\x4c\x2d\xfd\xce\x3d\x54\x89\x26\x5f\xab\xe1\x05\xcd\x2f\x73\xc3\x6c\x6c\x9d\x63\xdc\x1c\x4d\x90\x77\x76\xe1\x1b\xe2\x25\x35\xda\xc0\x30\x47\xab\x50\x21\xa8\x04\xb9\x10\xf8\x03\x3e\x56\xa9\xa8\xa7\xd0\x56\xd3\xe0\x96\xbb\xe6\x55\x1b\x26\x22\x1a\x80\xca\x38\xc3\xd5\xba\x98\xa5\xd3\xc0\xc6\x8c\x1c\x27\xea\x63\x7d\xdd\x75\x41\xe7\xd0\x64\xf9\xd2\x93\xd0\x82\xc2\xc8\x9f\x7d\xb4\x5c\xb6\xf7\x51\x86\xf1\x9c\x7b\xed\xdc\xef\xe9\x75\x18\x03\x49\xee\x28\x68\xda\x09\xfc\xdd\x5a\xdb\x9d\x95\x9a\x9b\xa2\x4b\x86\xdf\x61\x0d\x4c\x42\x21\xad\x36\x2e\xe9\x4a\x24\xe7\xad\x8e\x81\x1e\xf0\xa5\x08\x05\x14\x0f\xdd\xed\x14\x8b\x23\x6c\xe7\x2a\xe6\x1f\xb6\x04\x38\x83\x48\xc2\x2e\xfd\xc3\x1d\x2d\xe8\xde\x5f\xb2\x36\xdb\xc3\xa6\x22\x80\x6d\x94\x43\x35\xd5\x47\x11\xb3\x0d\x6e\xe5\xad\x35\x26\x5a\x6f\xd9\x3f\xc4\x86\x35\xf3\x8b\xc1\x5f\xa4\xa7\x2e\x3f\x01\x76\xca\x4f\x80\xed\xf2\x13\x00\x9e\xab\x2a\xd9\xcf\xd1\x35\x0d\x30\x5a\x9f\x16\xa7\xb3\xec\xf2\x2e\x27\xff\x4b\x67\xda\x8e\xdf\x22\xf5\x2a\x93\xe6\x90\xfa\x3a\x51\xda\x70\x53\x9c\xf5\x5a\xcb\xf6\xb2\x4a\x2f\x8d\x04\xd8\xa9\x9e\xf1\x73\x3d\xdd\x33\x56\xad\xed\x38\xcc\xc6\x74\xa5\xe7\xb1\xec\x12\xaf\x63\x37\x03\x71\xec\x9c\xe7\xad\x20\x1d\xed\x90\xad\x0b\x4b\xea\x4d\x10\x35\xc6\xa9\x74\x2d\x35\x4e\xa9\x8e\xad\xc0\x68\x66\x84\xea\xab\x45\xeb\xc7\x2a\x95\xc3\x92\xfb\xa7\xfe\x43\x61\xde\xbb\x4c\x75\x1e\x92\x42\x1c\x10\xcf\x78\xf9\x1e\x76\x3a\x23\x08\x81\x26\xc5\x14\x6e\x3f\xe2\xc9\x2f\x0c\xb1\x69\x64\x56\x7e\x3f\x19\x4d\x86\x4f\x5e\xbe\xf8\x31\x1f\x66\x2c\xe6\x38\x15\x6a\x71\xfe\xdd\x88\xfd\x14\x61\x0a\xf0\xf2\xb1\x12\xa2\x14\x57\x30\x44\xfc\x6c\xc6\x9b\x6b\x85\x6d\x98\xe0\x23\xea\x08\x2d\xb2\xe7\x6a\xf2\x74\x3a\x34\x69\xb4\x2b\x14\x39\x6d\x03\xe9\xca\x46\x0b\x1e\x9f\x07\x26\xae\x59\x29\xa3\xf8\xac\x07\x30\x93\xbd\xb0\x7b\x22\xa9\xf5\xfa\x27\x12\xa5\x01\x08\x3c\x85\x9f\x8c\xd2\xf3\x6c\x8e\x3b\xfd\x45\x3a\x3f\xeb\x2a\x41\x75\xdc\xc4\x5f\xc5\x7f\xcd\xe6\xf4\x6b\x9a\x5f\x34\x45\xc7\xf0\xc6\x9e\x22\x72\x7e\x26\x4e\x0a\xe4\xb5\x14\xa3\xda\x8f\xc7\x14\x2b\x44\x10\x7c\x82\x41\x5b\xf6\x9c\x99\x41\x79\x90\x91\x96\x76\x3f\x56\xe5\x42\x2f\x43\x45\x0d\xf3\x62\x74\x55\x75\x50\x1e\xc7\x3b\xb0\x30\xb1\x22\x9f\x04\xea\x7a\xd2\xbb\x87\xbf\x81\x6c\x2f\x82\xdc\x48\x2d\x54\x80\x76\x4c\x23\xc1\xfc\x03\x85\xec\x6d\x96\x9d\x8b\x0b\x35\x8c\x16\x54\x15\xe3\x2b\x58\xe9\x14\x18\xb1\x7a\xaa\xed\x1c\xb8\xce\xab\xfc\x37\x0a\xe3\xff\xb5\x0a\xe3\x4d\xc5\x0d\xf2\x60\x68\x8b\x59\xf6\x1a\x39\x9a\x17\x80\xa0\x76\x93\x50\xa9\xae\x97\x7d\xc5\x90\xf6\x0f\x17\xf3\x9c\x8e\xb3\xb8\xd7\x29\x58\x23\xaa\x4a\x50\x60\x99\x7e\xba\x4c\x41\x4d\x00\xaa\xe9\x53\xd4\x1a\x4d\x74\x6b\x2a\x9f\x79\x15\x4f\x03\xed\xcd\x41\x3b\x89\xa8\xa4\x03\xad\x32\x9e\x2c\x4f\x32\xbc\x3e\xf7\xf5\xae\x93\xc5\xf9\xb1\x31\xf1\x3a\x4f\x3f\x60\xd7\x4b\x4a\x8d\x26\x95\xa5\x6e\x5d\x9b\xcf\x29\x87\x7b\xcb\x19\xae\x19\x20\x6d\xf0\x28\x07\xd1\x96\xaf\x93\x14\x2a\xd9\x87\xd3\x69\x96\xce\xca\x14\xb6\x94\xdb\x04\x6c\x07\x5e\x5d\xaa\x55\x75\x88\x59\xc5\x93\x3c\x9c\x8c\xce\x53\x24\x70\xb6\x64\x49\x77\xda\x56\x3f\xde\x1b\x66\x5e\x53\x67\x4f\x46\xc3\xf2\xa1\xd9\x4c\x4f\x51\x9c\x62\xd3\x59\x99\xe6\xb9\x14\x78\x93\xb7\x42\x73\x30\x5e\xed\x7d\x10\x9f\x0c\xcc\x0c\x26\x63\x99\x27\x59\xf9\x21\x6a\x0c\x6e\x6e\x59\xae\xba\xab\x25\x5d\x3c\xd5\xf5\x99\xee\x28\x00\x1c\xb5\xc4\xd4\xfa\xc2\x74\x01\x78\xd5\xb4\x77\xcc\xc4\xcf\x18\x7c\x03\x9e\xa3\xd5\x30\xfc\x95\x8e\x68\xab\xe8\x76\xb3\xe9\xce\x2c\xe9\x12\x46\x2e\x0d\xa3\x02\xaf\x26\x20\xa6\x82\xa2\xa7\x7a\xd4\xf6\x19\x9e\x56\xf7\x58\x8d\x87\x06\xd2\x4e\x94\xfc\xb8\xc2\x9d\xf4\x52\x01\x70\xe0\x5c\xdd\xde\xca\x8b\x64\x57\xc6\x6d\x3b\x57\xca\xa5\x2d\x33\x72\x5a\x47\x98\x34\x30\xc0\x8c\xbb\x9e\x70\xfe\xd1\xc4\x49\x88\x99\x28\x8b\x0c\x5f\x2b\xa1\xec\xa0\x96\x91\x53\x85\x3a\xd0\x98\x27\x48\x25\x5c\xd4\x1c\x01\x15\x4a\x5e\x90\x9e\x2d\x16\x8e\xa5\x52\xe1\x40\xf1\x8a\xdf\x48\xd4\x32\xba\x97\x23\x1d\xb3\x77\x75\x43\xa5\xda\xaf\x49\x07\x53\xe6\x84\xc2\x88\x1d\x01\xb1\xb9\x7a\x43\x73\xde\xd6\xee\x71\xdf\xea\x79\xdd\x9d\xd8\xbb\xf2\x4e\xd4\x87\x81\xdd\x89\x16\xfc\x08\x0d\xe5\x43\xa9\x24\xb1\x3e\xfd\xe9\xff\xee\x04\x68\x6b\x0d\x32\xd3\x5f\x89\xce\xb0\x49\x75\x3b\xb0\x5a\xa8\xe0\x6c\xca\x6a\x1e\x15\x8c\xb7\x52\x62\x44\x8f\x67\xc5\x25\x0c\xcd\x28\x6e\xec\xf5\xfb\xdb\x28\x68\xdc\xbd\x11\x34\x6e\x04\x8d\x2f\x2a\x68\x60\x09\x47\xdc\x65\x14\x19\x5d\xd1\xcb\xbe\xa2\x84\xe2\x49\x0e\xdc\xc2\x05\x72\x3a\xa3\x49\x07\xa9\xb7\x2f\x6a\xac\x26\x65\x5c\x87\x80\x81\x60\x1c\x54\x59\x4f\xb6\xff\xe7\x08\x22\xbe\x88\xf1\x45\x78\x32\x37\xc3\x5e\xa9\x03\x69\x5a\x5e\x97\x77\xb3\x07\xa7\x2d\x65\x52\x58\x19\xc3\xe6\xba\x32\x3a\xe5\x73\xf3\x80\x6e\x64\x21\x47\x68\xe0\xc4\xdf\x1a\x9e\x6b\xe7\x14\x83\xcb\xe8\x72\x13\x04\xc9\x43\x46\x59\xb9\x5a\x61\x26\xa2\xb1\x25\x64\xe4\x88\xe5\x2c\x61\x22\x88\x06\xd3\xe6\xdb\x5f\xfa\x8d\x63\x6c\x19\x1e\xde\xe4\xae\xe2\x1c\xcd\xdd\x6f\x19\x47\xc7\x6c\x4c\xf3\x4b\xe4\xda\x0d\x69\x7e\xf1\x5c\xcd\x8b\x32\x4c\xe6\xe1\x76\x20\xd5\xdc\x16\x18\x06\xa5\x36\x27\x1c\xa3\xcd\x2b\xdd\x23\xf9\x98\xc2\x0d\x53\xb4\x9c\xba\x47\xfc\x36\x63\x9d\xe3\x8e\xd7\x4b\xb8\xa5\x5a\x8c\x92\x47\xe0\x37\xf6\x7a\xdb\x77\xca\x38\xa1\x7b\x37\x9c\xd0\x0d\x27\xb4\x36\x27\xf4\xc7\x57\x9f\x8e\x47\xc3\x55\xd5\xa7\xac\xca\x72\x03\xde\xb5\xb5\xa5\x9b\x9b\x87\xa0\x9b\x32\x72\x55\xa2\x7e\x4f\xb2\x6c\x98\x0d\xc1\x50\x21\x5d\xe8\x57\x16\x36\x37\x15\xc9\x51\x00\xce\x32\xa3\xf7\x5a\xa8\x81\x50\x5c\xb3\xe4\xe2\x4c\x9d\x06\xe3\x2c\x7d\x3f\x9a\x9c\x26\x58\x2e\xa7\xf7\xf8\xd4\x3a\x52\xd8\x02\x53\x2f\xfe\xac\x05\x33\xf5\xfd\x42\xcc\xce\x55\x15\x9c\x57\xd7\xe9\x99\xe2\x1f\xa4\x2d\xa6\x9b\xe1\xb8\x79\x56\x79\x51\xb2\x34\x86\xb2\x1d\x67\xcb\xd5\x70\x1d\x5d\x56\x76\xb4\x98\xd6\xec\x66\x98\x5f\x4c\x22\xbd\x5c\x5d\x43\xc0\x2d\x91\x40\x3d\xf2\xc1\x1a\xa4\x5c\xe2\xaf\x75\x74\x07\xd7\xa5\x3a\xb8\x82\x5a\x79\x45\x94\xb8\x92\x6e\x49\x18\x73\x91\xe7\xd3\xe7\xd0\x63\xaf\xaf\x47\x32\xc5\x19\x4e\xf1\x69\x0f\xc8\x05\x0f\x42\x09\x1b\xa5\x6c\x77\x58\x5c\x2c\xdd\x13\xa5\x5b\x22\xbe\x0f\xca\x1a\xb4\xd8\xff\x6f\x80\xfc\xab\x29\xce\xfe\xc0\x0a\xfa\x00\x2d\x5c\xf1\x20\xeb\xcb\xaa\xf5\x83\xee\x6f\x74\xfd\xbf\x8f\xae\xbf\x54\x5a\x61\x3c\xd4\x97\xd6\xed\xde\xbf\x91\x68\x6e\x24\x9a\xb5\x25\x9a\xdf\x41\x4f\x2b\x45\x14\xae\xa7\x85\x9c\x88\x9e\x96\x2a\xac\x26\xce\x7c\x46\x49\xa6\xae\xfa\x76\x58\x2e\x8d\x94\xba\xef\x2d\xd0\x98\x1d\x8f\x7f\xe6\xc2\xf7\x79\x4c\x43\x18\x7c\xf1\x38\xe5\x57\x88\x5d\x5b\x79\x68\xd7\x3d\x90\xaf\x53\xd3\x3b\x0c\x0f\xf5\xe1\xe7\x3c\xcc\xe5\x01\x5e\xae\xad\x1d\x7e\xb6\x23\xfd\xdf\x58\x29\xcb\x28\xc4\xaa\x4a\x59\x86\xd4\xf6\xe7\x6a\x4a\xdb\x88\x32\x41\x07\x01\x0d\x72\xae\xa4\xaf\x5d\x35\x56\xe6\x1f\x49\x6b\x4b\x46\x03\x91\x99\x72\xa7\x6a\x44\xc8\x8a\xc4\xe3\x88\xec\xc4\x65\x4c\x56\x4d\x95\xb0\x38\x4b\x40\x25\x5c\xc6\x40\xed\xac\xfb\xec\x71\xad\xf3\x95\x96\xf2\xd9\x2c\x3d\x15\x8f\x7a\xe9\x93\x55\xe6\xc6\x06\xfd\x11\x45\x6a\x2c\xc6\xc5\x68\x4c\x68\x9e\xe8\x8a\x05\xa7\xc8\x6a\xc5\x4c\x83\x05\xf1\x2a\x36\xeb\x7d\xaa\x66\xc5\x2c\xe7\x63\x90\xd9\x54\x01\xe6\x86\x8b\x21\xc4\xff\x96\x01\x59\xf6\x9f\xff\xdf\xdc\x7c\x39\x19\x5f\xea\x8e\x93\x49\x3e\xe9\x64\xe7\x53\x25\x80\x02\x13\x67\xc1\xc0\x92\x3e\x7f\x17\x00\x69\x1e\xfe\x72\x51\x64\x55\x7f\xb6\x14\xf1\x6d\xb7\x98\x94\x59\x16\x17\x1c\xf2\x62\x23\x7a\x80\x0c\x17\x1b\x8b\x6a\x71\xdf\xd6\xe2\xd3\x63\x38\xc6\x58\x44\xdb\x24\x32\x5b\xb7\x6f\x9b\x5c\xed\x7f\xe4\x02\xb1\x97\x03\xa2\xd1\x9d\x4d\xe8\x92\x3a\x3d\x5b\x47\xc0\x6a\x06\x74\x24\xfc\x83\x24\x06\x35\x79\x0d\xb6\x55\x89\x3c\x30\x04\xa2\x04\x46\xb0\x29\x21\x1b\xbe\xa2\x03\xcc\x7c\x1a\xe8\x5a\x84\x88\x1e\x9d\x1a\x15\x3f\xc3\x10\x6c\x90\x62\x5b\xf8\xbb\x95\x4f\x07\x86\x19\x6a\x0c\xaf\x0c\xf7\xa0\xb8\xa5\xfc\x44\x02\x47\x1a\x12\xd3\x04\x68\x49\x44\xb6\x69\x72\x4f\x26\xef\x7b\x3d\xb0\x83\xcc\xeb\xc4\xe5\x94\xf5\x63\x4a\x84\x5d\xd9\xba\x61\xe1\xc4\x1c\x58\x3e\x27\x13\x3d\x18\x45\xec\x67\x0a\xfa\x6c\xa6\xa5\xcd\xc1\xb7\x4a\x16\xd3\xbc\x66\x8e\x80\x88\x12\xa1\x8c\xd3\xbc\x75\x9e\x25\x8a\xd3\xa6\xcd\xaf\xbf\x06\x10\xbe\x4e\x0e\xcf\xb2\xc4\xf0\x1c\xc9\x31\x72\xb4\x93\xac\x28\x12\x35\xb5\xe9\xe4\x32\xc1\x97\x29\x80\x1e\xa4\xe4\xbd\x0e\xe1\x86\x94\x08\x37\x51\x22\x3f\x1a\x96\x0d\xe1\xb5\x92\x2d\xa0\x1e\xd4\x1c\xbc\x00\x91\x15\xf3\xe4\x18\x5e\x81\x50\x2d\x0c\x93\x1e\x92\x16\x0c\xbf\x04\x19\xe8\xee\xdc\x4d\x5e\xff\xf5\x91\x6e\x30\xc9\x15\x85\xea\x26\x4f\x72\xc5\x25\x4d\xf2\xb9\x12\x87\xde\x65\xd4\x96\xea\x39\x4f\xd2\xc1\x00\xb7\x58\x3a\x9e\x9e\xa5\x09\xbe\xf0\x5c\x74\x31\x5f\xc3\xff\xf2\xc9\xcb\x3d\xfa\xd9\x49\x0e\x55\xdd\x65\xd5\x54\xb1\xe7\x8a\x8b\x9a\x8f\x4e\x2e\x15\x30\x97\x70\x23\x31\xcb\x94\xb0\x9b\xc1\x7d\x6e\x0e\x2c\x67\xa1\x76\xe7\x34\x9d\x0c\x14\x6b\x88\xb0\x17\xf9\x79\x06\x4e\xf5\x18\x1f\xbc\xa0\x46\x92\xa4\x39\xea\xaa\x71\xfc\xe9\xd9\xd6\xb3\xe4\x2f\xea\x9f\x67\xcf\x5a\xdd\xe4\xc7\x5c\x51\xd9\xf9\x59\x3a\x87\x56\x4d\x85\x64\xa6\x1a\x57\x44\x38\x1f\x28\x82\xc5\x41\x7f\xa6\x26\x71\x31\x4e\xf7\x92\xb3\xf9\x7c\xba\xb7\xb9\x79\x71\x71\xd1\xbd\xd8\xee\xe6\xb3\xd3\xcd\xc3\xd7\x9b\xfd\xad\xad\x7b\x9b\xaf\x9f\x3e\xee\xfc\xf2\xf8\xe1\x5f\xfb\x5b\x1d\xf8\xee\xf5\x7b\xbd\xcd\x3f\x99\xe5\x1a\x2f\x14\xc4\xf8\x1c\x56\x76\x82\x2d\x6e\xc2\xf1\x6e\x53\xf9\xb1\x6e\x13\x9b\x38\xe9\x86\x1e\x8b\x90\xc3\x6f\x87\x19\x72\x14\x05\xbd\xd0\xa7\x4b\xb2\x57\x2b\x30\x81\xde\x69\x30\x82\x32\x44\xd2\x6a\x28\x61\x39\xe9\xf4\xe4\x39\xa1\xd2\x81\x42\x63\x0d\x3d\xfb\x40\x4c\x1c\x09\x51\x89\xfc\x54\x50\x9f\xc9\xe6\x83\xa4\xbf\xbb\xbb\x0f\xcf\xe4\x38\xfc\xb2\x25\xf4\x4e\x83\x82\xdf\x28\x0a\xdd\xdd\xda\xbe\xdf\xbf\xa7\x76\x2c\xd6\x4c\x7a\xfd\xee\x7d\x70\x29\xb3\x9e\x5b\xd0\x41\x72\x1b\xca\xed\xee\x82\x77\x5a\x0f\x7e\xb4\x93\x7e\x77\xc7\x46\x4b\xb7\x77\xef\xb6\xf1\xad\x6e\xbf\xd7\xbf\xa3\x96\x46\x81\xff\x66\xeb\x08\xeb\xdf\xed\xed\xf6\x75\x4a\x8f\x52\xb6\xee\xf6\x4d\x4a\xff\x28\xea\x8b\x45\x22\x40\x51\xa4\xa7\x20\x96\x34\x1e\xa7\xe3\xc1\x02\xd6\x4c\x5f\x80\xd9\xfd\x66\x97\x05\xef\xd5\x14\xf2\xa7\xef\xd3\xd1\x18\x45\x73\x40\x3c\xd0\xf0\x36\xbe\x3f\xf8\x01\xf7\x91\xfa\xf7\x61\xd7\xfa\x72\x0d\x14\x5d\xc8\x61\x5b\xcf\x66\x6a\xa9\x74\x5f\x76\x64\x7a\x38\x9d\x9e\xef\xd7\x65\xb7\xfd\x7f\x42\x60\xd7\xf3\x42\xef\x1c\xf0\x57\x86\x65\x49\xc7\xe8\x5a\xa7\x60\x7e\x88\x87\xcd\x4c\x6f\x1d\xc2\xe9\xb3\xb4\x48\x8e\x33\x45\x13\x07\x7a\x3c\x70\x0b\xb8\x98\x23\xe0\xa3\xc9\x60\xbc\x18\xd2\x72\x7d\x9d\x84\x7f\x2e\x94\xd0\x85\x63\xcf\x15\x89\x51\x63\x1e\x6b\xdc\xd3\x92\x77\x52\x80\x37\xaa\x6a\x3f\x9d\xf0\x2d\xdb\x75\x68\xad\x06\x0c\x9e\xee\x88\x9a\x87\xf9\x01\x06\x01\xe2\x18\x1e\xcb\x27\x8c\x6d\xd3\xf0\xec\xe8\xe4\xdd\xcb\xcc\xa2\x29\x20\x36\x4c\x38\xaa\xd8\xad\xfb\x21\x47\x61\x85\x12\xce\x11\x3a\x5e\xa2\xb7\xb4\x44\xff\x88\xef\x29\x09\x5a\xf2\xd5\x03\xc6\xc3\xb9\xfd\x01\x60\xde\x7e\xa0\x9b\xf5\xaa\xa0\x51\xb0\xc0\x42\xb7\x57\xf5\xce\x23\x2d\x1f\x9e\x8c\x3b\x25\x8d\x0a\x10\xb7\x8f\x22\xad\xfa\xd5\x6c\xb6\xe7\xcc\xcd\x02\xfd\xa9\x8d\xfc\x98\x96\xa5\x30\xe7\x87\xe2\x18\xf3\x73\x25\xb9\x7e\x00\x04\x3f\x4f\xf1\xb1\x2b\xa0\x15\xf4\xd5\x65\x2b\xfd\x7d\xf6\xe1\x30\x57\xc7\x44\x64\x91\x4d\x96\x24\x66\x6e\xd8\xf1\xf1\xa2\x0e\xc3\x1c\xef\x9a\xf0\x35\xfe\x64\x77\x54\x4c\x51\xca\x9b\x33\x4a\x52\x4b\x90\x64\x5b\xb7\x0d\x1a\x0d\xce\xd2\xd9\xc3\x39\xa8\x10\x6f\xfb\x29\x92\x0d\x75\xe4\x57\xb4\x24\x66\x55\xb3\xff\x0b\x19\x01\x67\xcf\x47\xad\x62\x71\xac\x26\xbe\xd9\x03\x17\xd5\x76\xd2\xbb\x63\xe5\xc0\xd3\xb2\xa2\xdb\x41\xd1\xe3\xb2\xa2\xbb\xb6\xa8\xd1\x34\xf1\x05\x87\x13\x00\x77\x8c\xc6\xb5\x99\x45\x7f\x9d\x70\xea\x27\x1c\x3b\xe4\xb2\x68\xf2\x1a\x1b\x2b\x90\x42\xe0\x3e\x04\x8a\xa7\x07\x0e\x9c\x88\xa1\x16\xc4\x94\x9c\x2a\xda\x39\xc1\x72\x88\x30\xf2\xdc\xe2\xf8\x12\x3d\xd1\x02\x74\xd1\xeb\xa3\x98\x7e\xe4\x1d\xff\xd4\x08\xf4\x1e\xd1\xf3\x91\x12\xe3\x28\xd9\x0a\x56\xf1\x1c\x18\x23\x47\x6c\xec\x01\xda\x6c\x70\x27\x68\x18\xba\x29\x42\xd3\x0f\x64\x6c\xab\xad\xab\xb7\xf6\x43\xac\xf0\x0b\xeb\x8e\x6e\x27\x0a\x1b\xc4\x76\xe8\x28\x11\xa5\x5b\x4c\xc7\xa3\x79\x53\xad\x87\xa7\xc1\xf8\x88\x7d\xef\xe1\xdf\x6d\xdd\xf8\x9e\xe9\xe4\x93\x58\xab\x83\x0c\xd9\x9b\xc4\x5c\x3e\x25\x2e\xe4\xca\xe0\x92\xad\x56\x97\x8a\x3f\x54\x0b\x96\x7d\x18\x15\x78\xfa\x71\x76\x0c\x79\x2e\xd0\x6e\x5d\xcc\x46\x73\xb5\x01\xa0\xfc\x49\x3a\xe4\x7c\x0b\x7c\x5a\x22\x7e\x0e\x0c\xdd\x4a\x9c\x8b\x5c\x66\x9a\x5c\xbc\xf8\x55\x4c\x0b\xdc\x97\xf8\xe9\x67\xc5\xb8\xd1\x12\xa7\x01\x3c\xd8\xd0\xd8\x0f\xf4\x1f\xd5\xa7\x0d\x01\x2a\xe6\xec\x49\x56\xa4\xaa\xba\x3a\x32\x0b\x24\x77\x80\xde\x45\xa6\xc8\xa2\xb9\x11\x06\x2e\xba\xdb\xdb\xbd\x95\x68\x4e\x99\x2b\x65\x74\xca\x15\x26\xa2\x92\x85\xa3\x51\x4b\x16\xce\x3b\xb1\x60\x22\xa8\xdb\xfd\x55\x37\x46\x64\x8a\xec\xee\xf0\x8f\xab\xe5\xac\xa5\x20\xd2\x5b\x44\xa4\xb7\x03\xca\x2c\xa0\x1f\x1d\x25\x5f\x2b\x82\x0e\x07\xa7\x18\x41\x12\x9c\x93\x50\xf4\x5b\x60\x41\x5b\x41\x0b\xc4\x99\x96\x69\x11\x62\xd0\xa7\x0a\x76\xc5\xa7\x02\xf0\x11\x84\x5a\x0d\xa3\x1a\x80\x1a\xdc\x58\x03\xa5\x2c\x8e\x22\x94\x70\x83\x21\x57\xc2\x90\x4e\x2d\x0c\xf9\x86\xee\x05\x7d\xfc\xd8\x8a\x62\x47\xcd\x25\x96\xc4\xc2\x88\x0b\x19\x9d\x87\xf8\x52\x5c\xaa\x44\xe7\x19\x78\x70\x29\x0e\x7c\x7e\x01\x4c\xf8\xfc\x22\xd7\x12\x34\x11\x5a\xaa\xbb\xae\x4c\x69\x3a\xe9\x60\x27\x24\x50\x9a\xb4\xd7\x90\x24\xac\x81\x58\x7a\xd3\x85\xfc\x69\xc3\xe4\x67\xf4\x9b\x33\xd9\x4a\xca\x79\x68\xf1\xcf\x49\xa2\xae\x22\x3b\xd6\x54\xf6\xa3\x48\x59\xd6\x30\xc3\x55\x6c\xf8\xdb\x07\x58\x29\x38\xb3\x9b\x94\x4d\x22\x20\xc6\x27\xc1\xb6\xf5\x77\xab\x3b\xcf\x9f\x8d\x3e\x64\xc3\x66\xbf\x15\x65\x73\x79\x2b\x8f\xbc\x56\x1e\x56\xb4\x12\x8a\x5a\x4f\x20\x72\x87\x1a\x08\xbe\xfa\x7a\xa1\x1a\x4e\x87\x28\xe1\x19\xa6\x46\xed\x8c\x63\x35\x4c\x9c\x5a\x25\x06\x1e\xa7\x85\x92\xab\xe0\xb7\x3a\x1e\xc6\x99\x12\xf3\xb5\xde\xe2\x07\xf8\x4d\xa7\xa6\x16\x10\x88\x99\xfe\xcf\x1f\xb2\xf4\xe7\x4c\x4d\x8e\x16\xe6\x60\xe5\x0b\xb5\xf4\xa7\x4a\xe4\x5a\x1c\x43\x20\xee\x4d\x53\x62\x53\x2e\xf3\xe6\xf1\x38\x3f\xde\x3c\x3d\xeb\x4c\x95\xf0\x58\x78\x99\xdd\x7f\x16\x56\xfa\x12\x2b\x8e\x70\x94\xa1\x03\x66\xd6\xc1\x09\x1a\x8c\x63\x6a\x1b\x27\x4a\xf2\x6d\x88\x87\x54\xe9\xd1\xf1\x37\x8a\xfb\xd9\x3e\x0a\x82\x28\x02\x51\x02\xc6\x08\xee\xbe\xda\xc9\x0e\xc4\x8c\x33\x1b\xd0\x94\x6d\xa4\x69\x67\x0c\x97\xeb\xd1\x66\x15\x07\xbc\xd3\xdd\x2d\x69\x78\xc7\xb5\xbc\x1b\x6f\x39\xda\xa6\x6a\xb0\x9d\xdc\x2d\x69\xf3\x9e\x6a\xf3\x4e\x55\x93\xf1\x36\xef\x2a\xf6\xbb\x5f\xd2\xe4\xfd\x5d\xd3\x64\x8f\x35\x29\xd8\x74\x54\xc6\x20\xe1\x78\xe0\x02\x60\x2e\xdd\xbd\xba\xb2\x25\xa6\xb8\x5c\xa0\x06\xa4\x75\xf3\x74\x3d\x68\xe6\xfb\x40\xe7\xbd\xc1\x7f\x8e\xba\x98\x6a\x88\x22\xec\x56\x82\x42\x6d\x57\xcc\x01\xf5\xca\x5f\xfe\xa2\x41\xfb\xc6\x24\x82\xf8\xac\x77\x1e\x36\xc3\x36\x95\xd6\x8c\xa2\x1e\x74\xdd\x17\xa9\x9e\xbe\xd7\xd7\x2b\xcc\x7c\x21\xc3\xb4\x46\xf4\xee\x0a\x55\xa5\x6f\x41\x6f\x79\xb0\x98\x42\xa2\x56\x4b\x73\x19\x23\xcc\x6d\xa2\xae\x98\x63\xfb\x88\x5f\xcd\xb8\xa5\xc4\x28\x65\xc3\x7c\x80\x66\x36\xb1\x70\x5a\x62\x1d\xd0\x62\x45\x34\x4d\xf3\xaa\x23\x2e\x09\x4b\x14\x10\x3f\xd5\xec\x2a\xda\x81\xf7\x6c\x70\x44\x95\xa8\x16\x2c\xa5\xc3\x66\xc0\x32\xc5\x3b\xc7\xdc\xc1\xc4\x85\xb4\x41\x3e\x83\xcb\xbf\x04\x67\x2f\x99\xa4\xe7\x19\xb0\xb0\x64\x0f\xee\x2c\xa0\x9e\x4e\x86\x38\xe5\x64\xe4\x61\xe7\x2c\x5e\x20\x7a\xd3\x18\x9b\x5e\x4b\x32\x5c\x3b\x8d\x3d\xfe\xa5\x84\x69\x7b\x49\xde\x78\x79\x28\x4a\xe5\x25\xc5\x5e\xe4\xbf\x1d\xd6\x69\x4e\x3f\x2a\x20\x8a\x5e\x78\x69\x6a\x54\xfa\x3a\x9e\x1d\xec\xa9\x71\xc1\x2e\x99\x94\x68\xfe\xea\x73\x62\x9b\x01\xc0\xec\x87\x18\x42\x27\xef\x88\x52\xf9\x43\xd6\x35\x2b\x76\x9e\xff\xd6\xa9\xd3\x1c\x0d\x5f\x16\xa5\x34\xd1\x70\x30\x23\xf9\x44\x4c\x19\x9b\x0b\x2f\xa7\x99\x8d\xdb\x49\xcc\xe0\x58\x20\x92\x21\x70\x65\xd8\xa5\xf7\x12\xd1\x80\x6e\x0e\x6c\x05\xb4\x2b\x8a\xf3\x4b\xae\x80\xa3\x08\x6d\x64\xf9\x58\xf8\x58\xc5\x50\x78\x46\xe9\x48\xf8\xea\x9b\x81\x94\x60\x44\xc9\x38\x78\xe9\x75\x86\x61\x6e\x9e\x0c\x45\xdc\xd8\xeb\xed\x60\xbc\xab\x9d\x75\x5e\xf2\x8a\x93\xd2\x74\x38\x7c\x92\x5e\x72\xf2\xa9\x53\x9a\x0a\xe4\x61\x7a\xe9\xdf\x88\x3f\x81\x5b\x6b\x73\x6e\xc1\xe5\x5a\xd3\xf0\x8a\x3a\x13\x6c\xa6\xe1\xdf\xe6\x10\x8c\x7d\x9f\x50\xdc\x86\xdb\xd4\x94\x10\xdb\x75\x79\xb6\x1d\x87\xc3\x17\xea\x24\x3c\xf3\x80\xa1\x34\x00\xe7\x1c\x7f\xad\x03\x10\xb6\x41\x10\xd1\x4f\x00\x49\x37\xb7\x14\xa8\x5f\xb3\x74\xe6\xc1\x84\x49\x00\xd2\x25\xfc\x58\x07\xa2\x67\x8b\xf1\x18\x5a\x21\xa0\xec\x17\xc0\x45\x6d\x56\x83\x85\xed\x72\x8e\x4f\xf7\x23\x69\x93\xaa\x96\xb8\xb5\x00\x2b\xf4\x66\xab\xe5\x35\xf2\xb0\x78\xe2\x99\x44\xb8\xd4\xa6\x60\x10\x31\x63\x58\x3e\x3a\x97\x0f\x03\xfc\x3e\x5f\xa8\x29\x52\x0c\x96\xfe\xbf\x1c\x90\x2b\xeb\xc0\x41\x74\xb9\x2c\x9e\x4f\x70\x89\x3c\xdb\x3c\x97\x21\x81\x9a\x65\xc5\x62\x3c\xe7\x40\xc1\x74\xc2\x0d\xbf\xaa\xf2\xf2\xc4\xd4\xb0\xf2\xbd\x29\xed\xb0\x82\xa5\x09\xf4\xe8\x59\x88\x79\x1d\x9c\x16\x59\x45\xe3\x78\x07\x6b\xf0\x41\xc6\x8a\x89\xe1\x7a\x70\xca\x21\x87\x83\xa8\x5a\x5c\x87\x41\x6a\xdb\xb2\x81\xb4\xf5\x38\x5c\x9f\xaa\x60\xac\x37\x93\x2c\xa7\x17\xf7\x08\xb0\x44\xac\x49\x9a\x16\xf3\x62\x3c\x96\x60\x4a\x08\x78\x98\x79\x6b\xcf\x67\x65\x1a\xff\x5f\x3a\x59\xa4\xb3\x4b\x77\x5b\x06\xe5\x7a\x61\xb9\x67\xd9\xf1\x2c\x2c\xd8\x0f\x0b\xbe\x48\x67\x83\x33\x59\x6a\x3b\x2c\xf5\x70\x3a\x53\x32\x8c\x28\xb5\x13\x6b\xcb\xeb\x6f\x37\x32\x80\xc5\x24\x93\x85\xee\xc4\x0a\x8d\xbd\x96\xee\x46\x60\x5a\x9c\x2e\x8a\xb9\x2c\x76\x2f\x2c\x76\x90\x4d\xe7\x19\x18\xcb\xca\x92\xf7\xc3\x92\x2f\x07\xf3\x3c\x28\xd7\x8b\x2c\xc2\x8f\xf9\xfb\x48\x8b\xbd\xc8\x32\x3c\xc9\x06\xbc\xe4\x27\x8e\x41\x07\x67\xea\x00\x89\xa0\x90\x4b\xff\x7c\x38\x54\x07\x7f\xea\xa0\x4e\x1d\xc4\xb9\x2e\xb4\xa9\x83\x35\x75\x90\xa6\x0e\xc6\xd4\xc1\x95\x5a\x78\x52\x0b\x45\x62\xd8\x81\x14\xeb\x97\x2c\x7b\x17\x10\x70\x4a\x96\xb8\x31\xcc\x2f\x0c\x66\xa8\x12\x3e\x5e\x0c\x79\xfc\xd6\x32\xac\x38\x50\x22\x94\xbf\x10\x11\x70\x15\xe2\x05\xc5\x22\xb8\x71\xb8\xc8\x8a\xa0\x5c\x04\x3f\x7e\xc9\x86\x93\x48\xc9\x08\x96\x1c\x9e\xa9\x83\x30\x28\x18\x41\x95\x67\xb3\x51\x50\x2c\x82\x2d\x07\x70\x6d\xe1\x0a\x8a\xc9\x87\x09\x7e\x38\x9b\x81\x4d\x2e\x9f\x7c\x9b\xec\x4d\x7e\x7a\x89\xa9\x6a\x05\xde\x1c\xed\xf3\x64\x73\xd6\xb2\x33\x55\x9e\xc0\x7e\x69\xe8\x41\x1a\x3b\x9a\x7c\xb4\x6e\x84\xca\xf1\xec\x13\x7b\xca\x95\x37\x71\x51\x99\xc3\x87\x80\x19\x91\x6b\xe3\x07\x7c\x50\x9e\xea\xd9\xcc\x42\x77\xba\x28\xce\x9a\x75\x4f\xd5\x91\x77\xa1\x78\x71\x36\x1a\x67\x0a\x63\x4d\x63\x74\xc3\xc7\x94\xe0\xfe\x38\x4d\xc9\x37\x5b\x47\x1e\xf6\x27\x72\x4e\xef\x2a\xce\x42\xd6\x36\xc5\xf8\xd4\x42\x29\x57\xcd\x94\xb8\x90\x7d\xe1\x5d\xa3\x12\x4e\xb6\xda\xac\xac\x33\xb9\x89\x29\xea\x6d\x1f\x81\xc2\x1e\xda\xee\x2e\x26\xc5\xd9\xe8\x84\xbc\xcf\xd8\x65\x3a\xeb\x9e\xcd\xed\x05\xf5\xc6\x8a\x68\x9c\xb6\xe5\x1c\xa7\x42\xd6\x07\xfc\xe2\x11\x13\x9a\xf0\xf4\x90\x38\x5c\x70\x78\x01\xef\xc6\xf0\x93\x15\x70\x2c\x18\xf3\x27\xd5\x79\x6e\xa9\x05\xa3\x7a\x0e\x57\xe3\x9b\x70\x57\x3e\xb4\xbf\x18\x98\xa3\xe2\xe9\x7f\x2d\xd2\xb1\xc7\x42\xb3\xd4\xe6\xb0\xa7\x26\xbb\xef\xf1\x6e\xc3\x1e\xe8\x82\x86\x7d\xfc\xbb\xe7\x49\x00\x70\xf1\x39\xec\x7b\x89\xb6\xa0\x19\xa4\x2b\x65\x52\x6c\x11\xcd\x90\xba\x12\x3e\xeb\x39\x2a\x1e\x65\xa0\x5a\x0c\xc0\x76\xc9\x1e\xdc\xb4\xd3\xe7\x59\x4f\xb0\xfe\x46\x4a\xe8\x09\x7a\x30\xcf\xfa\xd1\x52\x7d\x8f\x3d\xc6\xf6\x9c\x60\xa2\x90\x0d\xeb\xba\x14\x0e\xf0\xc3\x13\x70\x31\xf0\xe1\xb5\xa9\xbf\x03\xb8\xdf\x56\x81\xfb\x88\xae\x84\xa0\xa5\xc2\x9b\x61\x97\x81\xc8\x7c\x98\x3f\x3e\xcb\x06\xef\xc0\x4b\x24\x9d\xe1\x4a\xb5\x93\x6c\x82\xa2\x91\x87\x34\x5f\x69\x0f\x79\xbe\x48\xd1\x06\x10\x15\x4c\x69\x36\x45\xbc\xb0\xe9\x82\x03\x0d\x09\xe4\x4f\x27\x40\x76\xc9\x81\x0c\x32\x4c\x46\x13\xd5\xed\x64\x00\x76\xbf\x52\x9a\x43\x9e\xee\xc9\xe8\xe4\x84\xb5\x65\xd3\x22\xcb\x75\x1e\x52\x78\x48\x6a\x06\xdb\xa3\x13\x6c\x0e\x08\x01\xdf\xeb\x9b\x3a\xb7\x1f\xc8\x9d\x62\xd2\x3b\xde\x7e\x91\xdb\xdc\x01\x0e\xe2\xb7\x07\xb7\x49\x8a\x6f\xe6\xff\x4e\xfe\x9b\xae\x4f\xc3\xe1\x81\x15\xa4\x75\x78\x75\xca\xf2\x75\x1e\xd3\x8d\xab\x6f\xd4\xea\x64\xc5\x40\x2d\x66\x3a\xf1\x16\xcd\x26\x37\xe9\xe9\x9d\x76\x22\x1c\x88\x50\x57\x91\x0f\xd1\xb6\x85\xac\xa9\xb1\x14\x84\x00\xd8\x17\x27\x1a\x16\x02\x4d\x35\x92\x78\xa1\xe6\xa6\xfa\x0f\xf0\x65\x80\x0c\x6e\xb7\x8d\x4a\x74\xb6\xb0\xd7\x0c\xba\x0f\xf8\x47\x74\x11\x1e\x02\x27\xe9\xb8\x60\xf8\x43\x51\xe6\xb9\xda\x0e\x13\x9a\xd9\x58\x8a\xff\xe8\x39\x92\x8d\x61\x61\x1f\xc1\x45\xc9\x68\x72\xfa\x78\x3c\x52\xfd\xbc\x06\x84\x95\xab\x6c\x80\x47\x47\x6b\xa8\xda\x55\xbf\x80\xb4\x1b\x85\xff\x71\x3e\x54\x87\xe4\x60\x96\x8f\xc7\x87\xf9\x54\x7a\x62\x63\x79\xf8\x59\x52\xe1\x07\x95\x45\xc3\x12\xf2\x36\xba\x08\x3d\x9c\xab\x75\x3c\x5e\xcc\x15\x71\xf9\x11\x1d\x20\x23\x4f\xd5\x05\x65\x48\x87\xa8\x52\x85\x56\x52\x7d\x1b\x2f\x3d\x7b\x97\x00\x89\x8c\x81\x83\x4f\xd5\x84\xbb\x02\x47\xb3\x46\x5b\x51\x11\x07\xfb\x11\xf0\x29\xae\xae\x35\x3d\xb3\x85\xa3\x67\xb7\xae\x20\x34\x66\xe8\x52\x2a\x35\x66\xe4\x65\x8a\xba\x56\xf3\xd6\x24\x37\xfb\x52\x43\xc1\xf4\x1f\x46\x85\xc2\x23\xfe\x05\x1e\x3e\x4d\x57\x67\x1f\xaf\x84\x4d\x01\x48\x42\x0b\x0e\x34\xcc\xb5\x49\x0e\x98\x59\x76\xae\x64\x5e\x1f\x1e\x96\xba\x16\x48\x54\xbf\x1a\xaa\x07\xe2\x53\x55\x99\x8e\x53\xc5\x7a\x01\x7f\xf9\x3a\x3b\x7d\xfa\x61\xda\x6c\x34\xff\xef\xbf\xfe\xcf\xff\x39\x6e\x09\xd0\x8d\x39\x58\xd2\x68\x75\xff\x99\x8f\x26\xcd\xc6\xbf\xe8\xa9\x9f\xa6\x2a\xfa\xaf\xff\x68\x61\x14\x83\x51\xa3\x05\x0f\x3f\x71\xfb\x93\xb3\xb4\xf0\x47\x69\x92\xea\x0e\x51\x2f\xa8\x18\x29\x5c\x4d\xa6\x8a\xc6\x07\x63\x65\x4a\x28\x36\x9c\x44\x0e\x06\xe1\x4e\x18\xd4\x5d\xb8\x27\x69\xf2\x89\x61\x43\x98\xe7\xa7\xa7\xe3\x60\xad\x58\x6a\xf9\x40\x90\xfc\x96\x8c\xb7\x95\xe8\x67\x5a\xca\xd6\x9c\x06\x44\xfa\xfd\x38\xa2\x0a\xb6\x74\x90\xbd\xce\x86\xb3\xf4\x42\xf2\xa6\x26\xd5\xa3\x4f\xc6\xb6\xfa\x09\xb9\x56\xb3\x4d\xdb\xd5\xde\xd6\x9a\xda\xfa\xc9\x60\x09\x8b\x0f\x05\xee\x97\x65\x7b\x4d\x3b\x18\x2f\xc8\x9b\xf6\x90\x05\x8c\xb0\x90\x06\x79\xa5\xd7\x1f\xa6\x79\x57\x94\x03\xef\xae\x68\xac\x5b\x1b\xe2\x83\x22\xd2\xec\xfa\x46\x82\x3e\xe7\x2d\xc1\x69\xa2\xab\xf2\xdb\x0f\xdd\x16\x4e\x68\x92\x2a\x2c\x83\x39\xc5\x44\x5c\x1f\x6f\xa2\x6d\xf9\xe9\x82\x0c\x20\x59\x17\xd0\x62\x45\xff\xe1\xf0\xc2\x63\x7a\x9d\x67\xa8\xe3\xc7\x74\x2e\x9d\x3f\xdc\x4d\x17\xda\x76\x46\xef\xd1\x54\x8e\x91\x6c\xd1\xc4\xca\xd1\x85\x7d\x7e\xfa\x2d\x66\xc5\xe8\x7d\xf6\xcc\xb4\xfc\x80\x13\x39\x2f\xb3\x99\x39\x32\xaf\x66\x03\x63\x1c\xe8\x6d\x81\x37\x57\xb0\xe1\xb3\x09\x9c\x3b\x5d\x82\x2b\x68\xc1\xf7\x66\xb0\x2b\x67\x8f\x86\x98\x08\x6e\x87\xc2\xcc\x5e\x41\xb8\xfc\x96\x84\xcc\x4e\xc7\x81\x85\x8b\xac\x91\xd2\x56\x7b\x33\x3a\x2a\x87\xc5\xa9\x3f\x04\x9e\xb3\x36\xc2\xf9\xd5\xa4\x4f\x6d\x76\x31\x6e\x36\x3b\x61\x66\xd3\x6b\x4a\xf7\x2e\x2d\x94\x36\x37\x93\xe7\x4f\xef\xdd\x4e\xf4\x4d\x30\x6b\x6d\x3e\x4f\x07\x67\xd8\x60\xb3\x01\x3e\x70\xb7\x35\x68\xb1\x4b\x41\xb7\x23\x28\x7a\x45\x36\x16\xfe\x31\xde\xa8\x05\xa3\xaa\xbe\x96\x8f\x3b\xb2\xe4\x62\xe8\x31\x94\xb8\xd2\xe8\x87\x59\xc9\xe8\xfd\xf6\x98\x2c\xf2\xb7\xec\xf2\x38\x4f\x67\x43\xc1\xd4\x9a\xc4\xa6\x2f\x1a\xbd\x69\xbc\xcb\x2e\x31\xd8\x83\x3a\x68\xd4\xcf\xe9\x2c\x2b\x0a\xfd\x7b\x31\x6d\x1c\x59\x03\x45\x42\xed\x16\x32\xb4\xe4\x8b\x23\xac\x58\xd6\x79\x47\x88\xc1\xa7\xa5\x24\x8a\x61\x72\xcb\x99\x08\x90\x5f\xa4\x4a\x26\xa3\x66\xf2\xb0\x69\x00\x23\x06\x69\x86\xb9\x56\x60\xdc\xba\x05\x36\x6a\x5f\x27\xc9\x43\x87\xf0\xe4\x6e\x2e\x8c\x0c\xa9\x81\xa2\x7b\x0b\xcb\x92\xe3\x10\x5a\xa9\xe1\x8c\x77\xc8\xab\x07\xcb\x28\x2e\x3e\x57\xc9\x53\x1b\x59\x01\x8d\xd5\xe6\x60\xb3\x28\x0c\xbd\x93\xe7\x73\x68\x2a\xfc\x53\x9c\x61\xe0\x40\x55\x3c\x1b\x61\xd0\x06\xf4\x96\xca\xf3\xb9\x36\x40\x32\xce\x78\x13\x75\xb0\x67\x43\x63\x1d\xe7\xa0\x82\x4e\x66\x23\x25\x03\x74\xc0\x91\x48\x03\xa5\xb9\x0a\x30\x3f\x67\x90\xad\x0e\xd5\x59\xfa\x3e\x43\x80\x0a\x60\x36\xd4\x92\x2c\x06\x6a\xc2\x33\xf0\x5a\x62\x53\x40\xff\x28\xa0\x36\x6f\x39\x87\x13\x4e\x29\xb5\x0f\x2f\x4c\x60\xdb\x02\xac\x7d\x69\x5d\xe8\x08\x5a\x5c\xed\x08\x7e\x0b\xd0\xfd\x87\x5c\x49\x0f\xf3\xb3\x59\xbe\x38\x3d\x4b\x32\x85\xe2\xc6\x53\x1b\x3a\xc7\xe5\xb0\xef\xae\xeb\x30\x35\x10\xd2\x06\xfb\x69\xc1\x51\xf6\x54\x55\x61\xfe\x77\x10\x84\xc7\x38\xf0\x42\xb7\x50\x0e\x4c\x49\x54\x97\xf0\x53\xfb\x73\xdb\xf3\x59\xc3\xa9\x4b\xf8\x6e\xe6\xb0\xd7\x1d\x42\x9a\x31\xb5\xfc\x6a\xe6\x93\x3b\x8b\x83\x59\x91\xc1\x3d\xd8\xa1\x66\xc6\x54\x93\x30\x30\x58\x31\xb0\x8a\x4c\x27\x14\xc5\xc3\xf8\x8b\x21\x2d\xf8\xe7\xa2\x80\xe5\x9d\xaa\x69\x98\x63\xe3\x24\x7c\xb3\x09\x34\xae\xe2\x16\x38\x33\x4c\xd2\x5a\xd0\x41\x31\x2a\x48\x5d\xed\xf2\xbe\xe3\xab\x04\x49\x6d\x31\x14\x70\xdb\x35\x39\xb8\xab\x5b\xa5\x6b\x64\x31\x12\x16\x0b\xac\xfe\x6d\x82\x19\x5d\xa1\xd7\x10\x1b\x90\xeb\x58\x36\xad\x7a\xd9\xf8\x32\xdb\xdc\xc8\x52\x9b\xbc\xbf\xb1\x25\x8f\x2e\xab\x5d\x1f\x56\xc3\x39\xf5\x9b\x58\x02\x30\xdf\x50\x40\x43\x8f\xae\x81\xb0\xcf\xc1\x0d\x50\xd3\x0a\x26\xb6\x7f\x15\x0c\x80\x66\xf0\x5f\xff\x4a\xe4\xec\x8b\x6c\x7e\x3e\x89\xf5\xe4\x90\x31\x88\xcd\x4a\x18\xc2\xee\xac\x5a\x1c\x61\xe4\xed\xec\x03\x1d\x0e\xd9\x27\x5a\x75\x47\xa1\xd7\x7d\x80\xa1\x56\x8c\x89\x05\xbe\x6c\xef\xc7\x96\xa0\x54\x4e\xe9\x11\xee\x03\x45\xbe\xc6\x19\x10\xfb\x87\x6d\x98\x65\x6d\xef\x8c\x33\x0c\x89\x56\xa0\x82\xbc\x7d\x96\xf3\x88\xe7\x3c\xdc\x77\xd3\x41\x1d\xe9\x16\x3f\x26\xff\x81\xdd\xec\x61\x7d\x9c\xbc\x4f\x65\xec\xa5\x2e\x28\xe1\x13\xd1\x85\x14\xb3\x07\xa5\xb5\x32\xde\x06\xcb\x2a\xe0\x3a\x80\xb8\x0c\x1b\x5b\xcc\xd9\x6a\x18\x22\x44\x91\xc7\xc0\xd7\xb2\xfc\x86\x05\x4b\xc4\xfd\xf2\x50\xfb\x00\xf5\x47\x47\x1c\x89\x74\xcb\x7c\x2e\x89\x02\x9b\xb2\x1e\xf6\xf0\xf3\x1e\x0a\x32\x55\x23\x34\xf1\x7c\x9e\x9d\xfb\x53\x00\x69\x36\xfa\x18\xba\xfb\xa3\x83\x26\x21\x9c\x30\x6d\xc9\xcf\xcf\x53\x3c\x14\x4c\x94\x0f\x9d\x62\xa8\x95\x5b\x0d\xd9\x48\xf2\x49\x28\x98\xdc\x0a\xb6\x4d\x0b\x4c\x78\x84\x4b\x10\x06\x22\xde\x89\xa4\xb0\x22\xed\xc4\xb2\x0c\xd6\x8a\xe8\x25\x70\x0b\xfe\x86\x84\x52\xdf\x21\xd3\xb0\x97\xbc\x51\xff\x1c\xc5\x7a\xd7\x4d\x2a\x90\xa9\x43\xdd\x18\xb7\x8d\xc3\x4b\x1b\x06\x0a\x5d\xe2\x60\x45\x8f\xb3\x0a\xda\xa4\x2b\x24\xd5\x3d\x58\x81\xf7\x8e\x8e\xd8\x13\x90\x55\x71\x12\xd6\x09\x17\x1e\x41\xf6\x84\x1e\x5f\x7e\x91\x4e\x46\x53\x70\xc8\x00\xbb\x6b\x66\x39\x8c\x96\xd8\x9d\x73\x97\xdb\x40\x67\xca\xc7\x45\x81\xdc\xa7\x2c\x5b\x14\x1d\xb4\xab\xa3\x32\x4f\xf2\x73\x91\x3d\xcc\xcf\x29\x83\xac\xfa\xf6\x62\x06\xca\x98\xad\x23\x82\xf0\x6c\x4c\xa2\xec\xe7\xe7\xe7\x8b\x79\x7a\x3c\x52\xc2\xdb\xe5\xf7\xd9\x78\x9a\x49\x80\x47\x2c\xbb\x73\x86\xf9\x54\x4f\x51\xd3\xc7\x39\x78\xde\xb1\xc2\x0a\x17\x3b\x03\x95\x68\x4b\xfc\x30\x9a\x84\x25\xe0\x19\x6c\x2a\xf1\xd3\x64\xf4\x5f\x8b\xec\xb9\x04\x6e\x81\x89\x9d\x91\x86\x8f\x22\x18\x89\x12\x14\x35\xb1\xd1\x72\xe6\x87\xc1\xb4\x82\x25\x22\x84\x58\x74\x93\x08\x29\xf8\x62\xa7\x9a\x37\xf8\xbd\xd3\x96\x66\x8b\xf8\x89\xf3\x02\x9f\x77\xe0\x33\x32\x76\xc8\xbb\x0b\x79\x66\xa8\x90\x70\xdf\x24\xc0\xc8\x54\xc2\xee\x96\x7b\x19\x14\x3e\xb7\xe1\xd3\x0e\x0b\x52\x76\x10\xe5\x6a\xc5\x73\xdc\x70\x28\xb7\x51\x86\x72\x4f\x5e\xfe\xf2\xe3\x5e\xb2\x83\xf1\xde\x9e\x1e\x3c\xde\x4b\xfa\x77\xf1\xe7\x8f\x87\x4f\x5f\xef\x25\xbd\x6d\xf8\xf8\xe1\xe9\xb3\xc3\xbd\x64\x1b\x33\x5e\x3f\xff\xeb\xf7\xf0\x81\x4f\xb8\x1f\xbc\x7a\xf8\xf8\xa9\xfa\xe8\xc3\xc7\xe1\xc3\x47\x7b\x09\x26\xff\xf4\x4a\xa5\xdd\x63\xb2\xc7\x6e\xad\xe8\x49\xcb\xc1\x05\x78\xb3\xe2\x1d\xaa\xb8\x69\x27\xff\xf5\xa7\x43\x04\xb4\xbf\xd3\x66\xdf\x6f\x7f\x78\x7a\x70\xa0\xa0\xd7\xaf\xcf\x3f\xff\xf1\xf1\xeb\xa7\x2f\xd4\x90\xf6\x92\x3b\xba\x9c\xfa\xfa\xe9\xed\xf3\xc3\xa7\x2f\xde\x7e\xff\x54\x8f\xa8\x7f\x8b\x69\xb6\x9f\x4f\x06\x33\xb4\x8c\x07\x1d\xd4\xb9\xd4\x68\xcb\xbc\xe6\x70\x74\xee\xd1\x15\xf7\x00\xb0\xca\x4b\x36\x49\xf2\xd7\x80\x77\x2d\x30\x70\xb3\x13\xcf\xf1\x45\xb7\xdd\x5a\x81\x58\x36\xbf\x4e\x5e\x28\xac\x9a\x4d\x46\xbf\xcd\x92\x7e\xf7\x5e\x77\x3b\x69\x3e\x56\x2c\x6b\x7e\x9e\x3c\x5a\xe0\xed\xc8\xbf\x92\x17\xcf\x0f\x93\xbf\x24\x8f\x0e\x9e\xdc\x52\x9d\x63\xaa\x75\xdd\x3a\x37\x75\xd1\x85\x07\xe4\xcd\x71\x9e\x0e\x37\xff\xd4\x39\xce\x67\x2a\x67\x96\x0e\x47\x8b\x42\x7d\x7c\x28\xce\x52\x95\xdb\xd1\xae\xa4\x1d\xb5\x4b\x6c\x58\xd6\x42\x7e\x6d\x0f\xed\x37\x45\x28\xd5\x31\x4c\xb3\x61\x07\x74\xa5\x84\xe5\xf8\x13\x78\x3b\xfc\xa1\x4e\x6b\xe4\xf3\x4c\xc9\xa2\xa3\xf6\x9c\xf9\x7d\x0b\xdc\x83\x96\x12\x52\xc6\x8a\xd2\xf3\xd4\x6d\x7b\xa5\xd1\x96\x2e\x09\xf6\x48\x52\x6c\x5d\x41\x1a\xa6\x06\x4e\x1c\x7b\xb3\xdb\x4d\x29\x9c\x9f\x2e\x5d\x35\xa9\x7d\x27\xb8\x53\x85\xf9\xa1\xb3\x5c\x71\x05\x25\xb4\x6e\x27\xb9\x21\xb2\xa0\x78\xb9\x6f\x86\x2a\xd0\x62\xc5\xcd\x0d\x89\xae\x47\x0a\x40\x97\x6f\x26\x0b\xba\x4b\x8c\xb1\x7c\x82\xd6\xf5\x49\x27\x87\x5f\x45\x27\x69\x30\x95\x9b\xab\x9a\x9f\xbf\x62\x95\xc9\xf5\x40\x4d\xc0\x6f\xc9\xcb\x04\xde\xdb\x77\x2a\x9c\xa2\x10\x45\xdd\x47\xb4\xd9\x61\x59\xe1\x79\xfe\x43\x7e\x91\xcd\x1e\x2b\x86\xa7\xd9\x8a\x56\x45\x34\xf1\x66\x1e\x55\xd7\xd8\xd4\x1b\xe6\xa7\x84\xdc\x1e\x5c\xf8\x51\x2e\x71\x7f\x2e\xfb\x24\x03\xcb\xa2\x4c\xdf\x5e\x44\x9c\x63\x46\x13\x60\x79\xf4\x94\x43\xcc\x46\x1b\x49\xd1\xe9\x40\xe2\x45\x9a\x33\xd8\x87\x56\xdf\xd3\xc6\xfb\x40\xc5\x69\x02\xec\xe0\xa9\x52\x30\x29\x48\x06\x90\x8c\x80\xa1\xa9\x48\x79\xa6\xbe\x73\x2c\xc9\x55\x18\xf4\x52\x07\x70\xac\x28\x34\x7a\xbf\xcc\x11\x48\x56\x80\x8b\x40\x5e\x03\xbe\x65\x89\x93\xf4\x5d\xf6\x88\x4a\x61\x61\x25\x6e\x95\xb5\x0f\xf9\x0d\x67\x97\xa3\x9d\x8a\xcc\x7d\x9c\x9e\xbb\xde\x96\x90\xc9\xe0\x0f\xbb\xb2\x2d\xb8\x5a\x35\x98\x9a\x25\x1e\x4e\xb1\x5a\xdd\x11\x7a\x41\x98\x05\x53\x6c\xa8\xfd\xfd\x06\x3b\x3c\x52\x3c\x29\x6c\xe1\xdb\x1a\x00\x66\x42\xed\xcd\x6c\x37\x9d\x4e\x15\x23\x80\xa1\xb7\xb0\xac\x57\xec\xd3\x2d\xf7\xcb\x21\xaf\x46\x88\x37\x8d\xbf\xfc\xa9\x77\x77\x7b\x1f\xb4\x7b\xdf\x50\xe2\x68\xf8\x60\x03\xb4\x7d\xaa\x77\x95\xb8\xf1\xad\xfa\x49\xf8\xd6\xf8\x86\xd8\x84\x6f\x1b\x47\xfa\x32\x8d\x8f\x0e\x20\xc1\x41\xa9\x7a\x2e\xb5\x89\x8b\xf3\x1d\x62\xc0\x9e\x5d\xb4\x56\x77\x34\x99\x64\xb3\xef\x0f\x5f\xfc\x00\xf7\x8d\x2c\x3c\x3e\x5f\x5a\x31\x30\xd5\x00\xeb\x0c\x85\x3f\x68\xda\x5f\x15\x5b\x97\x2e\x29\x9c\xf7\x1f\xd0\x97\xc6\x7e\x55\xd9\xdc\xa1\xb1\x09\x44\xba\x5f\x81\xea\x8e\x1c\x7b\xf5\x83\x4a\xf1\x62\x55\xdd\x98\x1a\x7c\x02\xec\xdc\xed\xc7\xd6\x93\x76\xb0\xbd\x41\x50\xb3\x45\xab\xb6\xd2\x9c\x39\x8b\x02\x73\xbf\x57\xd6\xf3\xb2\x91\xb1\xa9\x62\xe0\x4a\x05\xb7\x43\x9b\x92\x7e\xe5\x92\xcb\xc1\xa2\x05\xcf\x57\xea\x87\xd6\x75\x3b\xe2\xf0\x56\x3a\x0a\xc2\xf1\xfc\xf1\x53\xcb\x73\x1f\x74\xc5\x5d\x7a\x44\xed\xc7\x94\xd1\x24\x85\x92\xba\xfb\xa3\x0f\x89\xa7\x92\x86\x4f\x71\xb9\xaf\xf5\x44\x4d\x0f\x36\x08\xac\x6c\x7a\x6c\x90\xc2\x2e\x2c\x84\xfa\x04\x59\x92\x43\x20\xe0\x67\x2a\x31\xad\x46\xd4\x0a\xe1\x60\xcd\x35\xe0\xb1\xbe\xc2\xba\x6c\x11\xa2\x57\x15\x57\x85\xc2\x64\xeb\x88\xe5\xa0\x08\x50\x73\x41\x73\x0e\x0a\x40\x88\x05\x86\xda\xe8\x7c\xe6\xb4\x2d\x6f\x4c\xad\x23\x39\x39\x21\xb0\x6c\x0d\xcc\x75\x17\x53\xda\xc0\x2b\x10\x1c\xae\x92\x22\x7c\x5c\xfa\xe1\x88\x74\x2e\xce\x59\xf8\x23\xc2\xb1\xb3\xd8\xd3\xe6\x0f\xde\xae\x13\xb2\xe8\x62\x5f\x3d\x48\x36\x4c\xc3\x1b\xb1\x33\x06\xb4\xad\x17\x68\x19\x00\x31\xba\x9f\x62\x38\xb4\x80\xc2\x07\x40\x68\x0d\x55\x5c\x23\xd5\xf3\x4e\x5b\xf8\x73\xac\x89\xa4\x1b\x24\x24\x34\x83\x11\xda\x51\x40\x7c\x6d\x66\xae\x76\x6c\x1c\xe0\x83\xd2\x06\xa4\x67\xbc\xf5\x67\xd0\xf2\xa7\xf0\x3c\xc3\x15\x70\x53\x0f\xb3\x48\x37\xab\x36\x29\x5e\x07\x83\x7b\x17\xd9\xf8\x04\x2e\xc3\xd5\x5c\x3d\x6b\xb6\xf6\xcb\x41\x21\x57\x22\xd7\xb8\xa2\xb3\xe3\xcb\x26\xd6\x27\x85\x19\xa0\xdc\x20\x9d\x37\x63\xf3\xd7\x6a\x45\xce\x61\x33\x2d\x5a\x15\x4c\x1d\x90\xd1\xa8\xf9\x1d\x2e\xad\xf9\x23\x1c\x9c\xe2\x6d\x7f\x8a\xa6\x9a\x5d\x0c\x80\x87\xf5\xec\x2e\xad\xaa\x2b\x66\x00\x70\x7a\xcd\x09\x90\x00\x7e\xf2\x26\xdf\x28\x1a\x01\x49\xca\x36\xa8\x53\x9f\x65\xf3\xc7\x45\xd1\x2c\xe6\x33\xa1\x25\x27\x0b\x2b\x25\x09\x1c\x66\x1f\x60\xed\x74\x24\xb6\xb2\xfa\x0f\xe1\x41\x86\xf9\xac\x07\x96\x9c\xb3\x7e\x84\x68\xeb\x6e\x8c\xf4\x42\x2c\x0d\xd4\x00\x3b\x9b\x7d\x34\x13\x82\xcf\x3e\xb0\x96\x8a\xd3\x69\xc5\x3b\xb3\x26\x3d\xaa\x28\x44\xf9\x3b\xf6\xc0\xb6\x67\x55\xf2\xdf\x8a\x5f\x52\x6d\x42\xbe\xbd\x40\xd5\xe5\xe3\x4d\x03\x47\xc8\xfc\xed\xdb\x46\xd0\x12\xe4\x4a\xbe\xf7\xe0\x79\xcf\xd3\x1f\xc8\x9d\x12\x69\xf6\x7d\xe0\xe9\x0f\x92\x46\x3b\x90\x29\x5e\x07\x6d\x74\x36\xf0\x44\xa2\x69\x47\x62\x5b\xe1\x62\xef\x8d\xd6\x00\x9a\xc0\xfd\xec\xf4\xe4\x03\x44\xa9\x45\x08\xf6\x84\x35\xa3\x8f\x39\x9f\xfc\x59\xb3\x46\x8c\xf1\xc9\x79\xf2\xf2\x85\x98\x1f\x3c\xa2\x33\xc5\x93\xac\x31\x41\xa3\x39\x0a\xc4\xf0\x78\x85\x99\xa4\xc8\x2c\x61\xa9\x60\x16\xa2\x04\x32\x43\x09\x5b\x15\xc5\x41\xb4\xc2\x28\x04\xd1\x5a\xea\xd0\x83\x3e\xda\x2c\xc2\x6f\x20\x97\x78\x93\x04\xe5\xe9\x2d\x23\xec\x52\x61\x2b\x28\xb6\x63\x3b\xb4\x6c\xb9\xa0\x85\xeb\x5a\x13\x5c\x10\xd8\x7b\x84\x46\x06\x13\xdc\xba\x08\xb9\x74\x31\x78\xe5\x10\xd3\xc5\xa9\x53\x72\xfa\x4f\x8a\xf5\xd5\x72\x3a\x44\x9a\x84\x6c\xa4\x45\x4d\xff\xf0\x32\x2f\x3a\x60\x87\xb0\x75\xc9\x78\x91\x2b\x0c\x68\x6b\xeb\xbe\xb0\x04\xb4\x49\xdf\x2d\x61\x0a\x74\xcb\x5b\x0b\x07\xfe\x06\x45\x9f\xdb\xc0\x8b\x3d\x99\x63\x71\x61\x23\x58\x2a\x43\x64\x4b\x77\xf2\x12\xee\x38\x3e\xb8\xe1\x3a\x43\x2b\x01\xcb\xdf\x43\xde\x82\xed\x7b\x88\xa0\x97\x1c\xb5\x24\x5d\xae\xa7\x13\x7c\x5f\x8c\x45\xe6\xb8\xd1\xa0\x9a\xaf\xb1\x66\xc3\xb3\x76\x32\x6d\x6b\xb5\xdf\xaa\x0d\x7f\x38\xc0\x6a\xf1\x56\xdd\xfb\x64\xf1\x36\xdd\xd1\x61\x1e\x7b\xda\xeb\xee\xee\x0a\xcc\x30\x71\x93\x36\xff\xef\x96\xca\xfa\x8f\x4d\x32\xc2\xd4\xa7\x93\xae\xd4\xb2\xa5\x1d\x14\x0e\x08\xa1\xb1\x5c\x36\xbc\xaf\xbe\x92\x03\x74\x0f\x52\x45\x07\xe8\x69\x43\x83\xd6\xc5\xee\x23\xa1\xd1\xef\x41\xed\xbb\x62\x0a\xef\x1e\xbc\xcf\x82\x2d\x01\x35\xd4\xa1\xa0\xa3\x5f\xbc\x62\x25\x81\xb8\xfa\x12\x61\x40\x1b\xcb\xf4\x59\x8d\xff\x3c\xcf\x86\xa3\x54\x71\x95\x06\xf6\xce\xf6\xb0\xd5\x6e\x1a\x65\xa2\x48\xfe\xf8\x27\xab\xd3\xfc\x88\xb6\xe4\xf7\xa7\x1f\xf6\xed\x03\x23\x26\x68\xe3\xbe\x7e\x3c\x64\x5b\x65\x7e\xfa\xd4\xe0\xb6\x61\xa8\x23\x89\x1f\x5e\xc6\xb6\x9e\xac\xe3\xc1\x06\x1d\x49\xf8\x7d\x18\x34\xcb\xf8\x1e\xdb\xc6\xac\x6d\x8f\x70\x06\x3b\x86\xad\xa5\x13\x57\xa3\x6b\x66\x1f\x55\x5d\x01\xdf\x59\x84\x98\x32\xa3\x41\xad\x88\x44\x2b\x0c\xe8\x8f\xb7\x09\x6b\xea\x64\xb7\x26\xe6\xb7\x4d\x8d\x80\x9a\x49\x95\xa6\xfe\x92\x3a\x55\x39\x1b\x56\x95\xfd\x86\x55\x3d\xd2\x8a\xaf\xc2\x24\x1e\x05\xbc\xba\x51\xa9\xe2\x9d\x6e\xb3\xa4\x95\xef\x14\x57\x06\x4f\x10\x4e\xf2\x0e\x12\x3d\x96\x59\x46\xb6\x6c\x4b\x60\x8c\x70\x08\xd1\xda\xf9\x64\xeb\x06\x48\x8f\xea\xcf\x92\x96\xda\xcc\x64\x32\xc3\xb3\x60\x96\xfc\x87\x26\xf4\x6c\x46\x30\xce\x9b\x7e\x0b\x80\x7e\x40\x2c\x7a\xea\x07\x63\x68\xe2\x6d\xbc\xae\x8b\x37\xec\xcb\xd9\xf3\xf0\xd4\x89\x2d\x74\xf9\x22\x07\x8c\x51\xb0\x46\xf5\x99\x45\x5b\xb5\x52\xa8\x9d\xd3\x6a\x19\xe1\x19\xbf\xbc\x77\x10\x90\x10\x83\xe9\x12\xfc\x28\x17\xbc\xb3\x09\x44\xa7\x7b\xac\x75\xfa\x00\x25\x3b\xc1\x31\xa8\x14\x2f\x10\x03\x9c\xd1\xb9\x88\xdf\x04\xee\xa2\x32\xec\x2c\x63\xb3\xc4\xca\xba\x39\x7c\xa0\xc7\x12\x99\x94\xf8\xec\x7d\x72\xcf\x64\x82\x70\xd3\xb0\x14\xdc\xa1\xcd\x5b\x77\xf7\xa4\x7f\x85\x45\xd8\x95\x8e\xf9\xb9\xef\x97\x91\x97\x2c\xec\x2b\x28\xe9\xdf\xde\x88\xef\xa0\x73\x43\xe0\xc4\xde\x9c\xa2\x4d\x55\x39\x31\x6c\x92\x84\xe2\xd1\x40\xd9\xa8\x22\x98\xf6\x01\x0f\x46\x44\xa3\x65\xed\x5d\x4c\xc9\x91\xe5\x8f\xd1\x49\x3c\x1e\xd0\x25\x52\x89\xb1\x5e\x5a\xc6\x30\x3a\x4e\x1a\xe5\xa8\x65\xfc\x62\x79\x75\x07\x45\x40\x1b\xa5\x63\x26\x43\xa8\x4f\x2d\x7b\x9f\x49\xff\xda\xdb\xc6\x96\xbb\x29\x5e\x37\x54\x5d\xdc\x84\xac\x22\x4c\xdd\x20\x9f\x4d\x32\x08\x1d\x54\xf6\x6a\xdd\x71\x3e\x9f\xe7\xe7\x1d\xf3\x78\x9d\xfe\xb4\x6f\xd8\xcd\xf3\xa9\xcd\x83\xdf\x94\x71\xd4\x6a\xb3\xc6\x1f\x4e\x86\x8f\x33\x7a\xdc\x78\x49\x2f\x03\x2c\xc6\xfa\xa9\xea\xd6\x15\xae\x04\x82\x44\x8c\x97\x33\xe3\xd4\x16\x05\x01\x7e\x36\xdf\xf8\x59\x54\xb5\x5d\xf2\x40\xa0\x6e\xff\xb7\x27\xd9\x14\xc2\x8c\x94\x0c\x0d\x2c\x90\xda\x49\xbf\x9d\x40\xe4\xc8\x76\xb2\x7b\xd4\x92\x56\x48\x1b\x7b\xdb\xf7\x31\x60\xd6\xee\x3a\x01\xb3\x60\xcd\xd7\x78\x6e\x3e\xb4\xf8\xf1\xaa\x2e\xe6\xa3\x71\x11\xb7\xfc\x29\x45\x25\xf9\x4a\x9d\x6f\xe7\xe6\x9e\xaf\x13\x1e\xb5\x68\x5d\x69\xe9\x42\x08\x17\xbd\x7d\x67\x35\x69\xa3\xa2\xed\x5e\x18\x95\x8e\x93\xec\x49\x64\x50\xac\xf1\x96\x3d\xeb\xaf\xea\x07\x59\x4b\x87\x8e\x86\x3f\xb8\x52\xb5\x7c\x63\x3d\x33\x18\x54\x87\x80\x82\x8a\x5c\x1e\xe3\x56\x3c\xa7\xe0\xc8\x20\x1d\xc8\x4d\x92\x1f\xd3\x6f\xe3\x7c\x31\xea\x8c\x86\x9d\x0d\x75\x0c\x62\xbb\xf4\x5e\x95\xb0\x37\x59\xc7\x39\xa8\xb6\x21\x2a\x46\x5d\x88\x39\xf5\x68\x25\xf4\xad\xcd\x4d\xe4\xda\xd2\xc1\x20\x2b\x0a\xb0\xa3\x3f\x9e\xe5\x17\x85\x42\xb5\xd3\x71\x7e\x9c\x8e\x0b\x6c\x05\xcd\xf4\x2d\x07\x42\x04\x11\xd9\x07\x76\xfb\xa0\x8e\x7d\x9d\xb1\xa7\xd5\xff\x68\xf5\x99\x0f\x2f\xf5\x09\xb2\x7f\x8b\x71\x22\x86\x9a\x06\xad\x80\x88\x85\xb7\xd6\x5a\xaa\x22\x9a\x8b\xb3\xca\xda\xf2\x2f\xc8\xd1\xa4\xd5\x8e\x8d\x4c\x0d\xd1\x89\xf7\x60\x0e\x76\xb8\xcd\x62\x8e\xee\xf0\xc7\x2e\x54\xad\xbe\x12\xc4\x6f\xfb\xbe\x85\xf6\x3b\x37\x17\x02\x3a\x8c\xf3\xb1\x8d\x63\x4c\x23\x52\x5f\x87\x78\x46\x7f\xf5\xd5\x7f\xe3\x97\x8b\x5a\xad\xe8\x5a\x43\x96\x7c\x4d\xe2\x52\xa4\x2c\xd1\x3f\x59\xfa\x11\x52\xd0\x68\x71\x22\xae\x5e\x79\x12\xd3\x22\xa5\x91\xd0\xca\xb2\xea\x40\x8c\x16\x55\xfb\xb0\x01\xaa\x1d\xc4\xdb\xaf\x9a\x76\x7c\xff\xfa\x17\x1f\x81\xf9\xd2\x10\x9a\x4f\x00\xc0\x1f\x02\x6c\x9e\xa0\x17\x7c\x6c\x8a\x20\xc2\x79\xee\xb2\x79\xb4\xe0\x99\x56\x0f\xc9\xe2\x9b\x15\x34\xd3\x18\x14\xc5\x0c\xaf\xb0\x9d\xc5\xa0\x34\xe5\x78\xc5\xf5\x24\x06\x85\x21\x3d\x68\xf9\x83\x29\xa9\x7e\x42\xa6\xc4\x1d\xf1\x8c\x31\x99\x44\xfc\xf4\x9c\xfc\x95\x86\xb3\xf4\xf4\x14\xb8\x6b\xe1\xd1\x43\xd4\xc2\xbd\x11\x6a\x78\x1a\xb4\xba\xb3\x55\xba\x04\x02\x49\xe0\x81\x3f\x79\xbc\x98\xf3\x22\xbf\x85\x8c\x0e\xdf\x20\x83\x74\xf2\x44\x55\xfa\xb5\x04\x28\xd7\x20\xc5\x9f\x4d\x3f\x8c\xf4\x1b\x6f\x0a\x09\xcf\x1a\x06\x57\x92\x8a\x82\x10\x54\x28\xd2\xe3\xdf\x3f\x5f\x8f\x1f\xbc\x1e\x47\x85\x75\x57\x84\xb4\x98\x1f\x15\xa4\xfb\x6f\xca\xa9\xc5\x0f\x5e\x82\x9e\xeb\x80\xee\x74\x19\x44\xad\x61\xb5\x37\xfa\xca\xd6\xf4\x74\xd4\x40\xcf\xab\xcd\xe4\x3f\xd5\xda\x0f\x21\xc8\xb7\x0b\xd8\x5d\xcc\xbb\x2c\x6a\xf7\x2c\x3f\xcd\x7f\x3b\x9b\x8c\xde\xa9\xc5\xda\x4c\x77\xb6\x07\x27\xd9\xb0\x7f\x77\xb0\xd3\xcb\x76\xb2\x3b\xf7\x06\xc3\x81\x1b\x88\x22\x8c\xc3\xe7\x13\xb2\xdb\xd6\xd6\xd3\xd2\x1f\x4f\x46\xdb\x69\x27\xe6\x89\x9c\x24\x65\xbe\x92\xc4\x01\x13\xe9\x44\x1f\x31\xb4\xb5\x0f\xf3\x52\xed\x28\x29\x4c\xef\x31\x56\xbe\x71\x25\xa4\x53\xde\x59\x60\xbd\xd1\x95\xdb\xc9\xa8\x4d\xd5\x8f\x5a\xcc\x07\x5c\xd3\x7e\x3c\xf4\xb8\xe7\x43\x3a\x1f\x9c\x65\xc5\x81\x2a\x00\x97\xdb\xe8\x6c\x58\xe8\x0f\xea\x96\x38\x8f\xf9\x19\x1a\xf3\xf1\x49\x78\x83\x30\x35\x74\x0b\xda\x54\x4e\xeb\xe5\x5e\xc8\x66\x4d\xe6\x79\xfe\x5b\x59\x4e\x51\x92\x91\xfb\xe9\x2a\xf9\xc8\xe9\xd2\x9a\x04\x5a\x4b\x1c\xf7\x0c\xe7\xb2\xf1\x1b\x2a\x41\x82\x99\x76\x23\xb2\xb3\x62\x32\x8d\x63\x26\x1b\xfc\xbe\x87\x43\xd6\x68\x54\xed\xee\xc1\x3b\x63\x69\x82\x58\xf4\x5f\x0b\x25\xed\x80\xe6\x6c\x73\xe7\x5e\xef\xee\x56\xff\xfe\xe6\xc5\x59\x3a\x2f\x3a\xf3\xb3\xac\x73\xac\xb2\x3a\x17\xe9\x65\x47\x31\x4f\xc3\x6c\xae\xda\xee\xa4\xea\xf7\x62\x70\xd6\x81\x47\xf0\xb2\x89\x4a\x7d\x3f\x1a\x64\x9d\x05\x1c\xfb\x9d\x7f\xa6\xef\x53\x95\x3e\x9a\xce\xa1\xad\xfb\xf7\xee\xdd\xf9\x93\xfe\x97\x98\xa2\xe2\x10\xaa\x3e\xc1\x2a\x60\xbf\x93\x4f\xb0\x2d\x0c\x15\x83\x67\x35\xf2\x08\x0a\xec\x8b\x7c\xf6\x0e\x1e\xfe\x4b\xce\x73\x78\x2b\x90\xb8\x89\x22\xd4\xe7\xc0\xd5\x62\x3e\x39\x2f\x4e\x15\x9c\x4a\xe0\x1f\x9c\x41\x90\x70\xdb\xd2\xbe\x68\x6a\x94\xf5\xb6\xb0\xc9\x22\x29\x16\xb3\x93\x74\x90\xe1\x0c\x8d\xf3\xfc\x5d\xb2\xb7\xa7\x6a\x0e\xc7\x19\x90\x97\x03\x80\x46\xe5\x30\x22\xf0\x62\x31\x9e\x8f\x10\x76\xf2\xf5\x54\xd5\xec\x2a\x74\x71\x08\x8a\xa7\x55\x4c\x87\xf4\x8f\xb0\x59\x14\x6a\xdb\x7c\x19\xbf\xe3\x6f\x93\x9e\x6a\x48\x3b\x59\x26\x5f\x27\xc5\xe8\x7c\x3a\xc6\x57\x73\xe6\xb3\xd4\x7a\xf2\x13\xb1\x02\x9e\x8a\xcc\xd7\x31\x94\x36\xd8\xd5\x26\xda\x81\x10\xf2\xf1\x70\x78\x86\x8f\x78\x34\x7d\xe5\x27\x32\x70\x58\x95\x0a\x10\xae\x21\x2c\xee\xa4\xc0\x15\x80\x98\xd6\x6e\x39\xcc\xf1\x00\xf6\x44\x26\x07\x7e\xdb\x0c\xf4\x33\xa0\xf4\xcc\x46\x6f\xa6\xcc\xf3\x5c\x71\x9a\x61\xeb\x98\x4c\x7e\xb1\xb2\x71\xcc\x88\x34\x8e\xe9\x8b\x69\x83\x1f\x41\x6e\xe6\xcd\xa0\xde\x48\xbc\xfa\x4e\x03\x85\xea\x23\x6c\xa1\x71\x84\xb2\x38\xec\x1e\x3d\xd7\x60\x39\xf2\x71\x80\x81\x59\xfe\x0e\xa1\x15\xe0\xc7\xaf\x9f\xec\x11\x8a\x6f\x4a\x61\x1c\xfc\x7c\xac\xa7\x9a\x9b\x93\x3f\xa6\x9c\x57\xb9\x09\x5a\xe0\x66\xda\xb4\x00\x2b\x21\x50\xc3\x7e\xe0\x1b\x71\x0a\x6f\xb3\x7d\xff\x00\xd7\xf0\xec\xd9\x46\xba\x06\x42\x96\xfd\x6b\x90\xfd\x6b\x40\x16\x8d\xb7\x38\x92\x04\x9c\xa6\x76\x42\xf8\x3d\x63\x7c\x2b\x86\x86\xd0\x10\xec\xe3\xec\x1a\x4f\x74\xe7\x1e\x6e\x68\x77\xdc\x69\xdc\x6b\x1a\x49\x94\x7b\x90\xa5\xc2\xa7\x3d\xe6\xd1\x2e\x1b\x6b\xe3\x45\x37\x6f\xd2\xd4\x7c\xc3\x3b\x07\x0d\x9f\xae\x11\x9e\x0e\xcc\x73\x7c\xcd\x99\x60\xae\xe2\x0c\xf4\x88\x03\xf9\xd2\x99\xa8\xf0\x72\x2f\xf1\x71\x5f\x7b\x3e\xc8\x79\x5b\x4f\x46\x20\x7b\xf2\x97\xc8\x29\xb8\x08\x34\xa4\xe3\x78\x50\xc4\xf9\xc6\x13\xc3\x1f\xe1\x76\xa4\xf7\xb8\xf7\x92\x37\xc2\x0d\xf1\x95\x22\xb7\xaf\xe1\x51\xba\xd9\x0b\xc8\x3f\x22\x97\x32\xa3\x12\x31\x7b\x5f\xbf\x71\x02\xaf\x8e\xfc\x03\xb8\xac\x7f\x24\x43\xf7\xd8\xc9\xc5\xd9\x08\xde\x74\x04\xe6\x0b\x7c\x5d\x2d\x57\x06\x7c\x1e\x52\x86\xae\xae\x6b\x9a\xd0\x7c\x9c\x3a\xec\xd4\x79\x80\x25\x90\xdf\x38\xcb\x67\xa3\xdf\xc0\xfa\x62\x3c\x26\x17\x5a\x78\x44\x67\x04\x67\xe2\x65\xd7\x56\xfd\xd0\x48\xc6\xa3\x73\xe0\xa6\x6c\xbd\x79\xce\xaa\x22\x1c\xae\xf8\x65\xb4\xb8\x69\x58\x14\x36\x75\x9e\x64\x27\xa9\x3a\x27\xd0\x73\x9c\x20\x35\x25\x36\xf1\x5f\xa8\x53\xa9\x16\x3b\x03\xa5\xd6\x07\xf8\xeb\xd2\x68\xb4\xe4\x0c\x12\x2e\xfc\x23\x81\x4b\xc3\xd1\x09\xba\xcf\xdb\x13\x5f\xfb\xab\x03\x81\x35\x0e\xe7\x54\x9c\xfc\x6f\x47\x13\x45\x32\xf0\xc5\x20\x98\x66\x1f\xf4\xa7\x1f\x52\x38\x7b\xf6\xbc\xe4\x7f\xfc\xe3\x1f\xff\x2c\x3e\x98\x2f\xa4\x6f\x0f\xa7\xd3\x52\x24\x4a\xec\xcb\x9e\x33\x44\x8c\xbd\xd8\x45\xdc\xd7\xe6\xe8\x36\xf7\xc0\x5e\x72\x92\x7c\x63\xd1\x4f\x8f\xe0\xc1\x46\x97\x7e\x6c\x7c\x1b\x14\x56\xc5\x87\xa3\xf7\xb1\x74\x93\xe7\x02\xe7\x3c\xd8\x30\xcd\x3c\x1e\x8f\x06\xef\x12\x7a\x92\x02\xe6\xe3\x9b\xcd\x25\x8d\x7c\x7b\x88\xe6\x7a\x05\x45\x17\x20\x4f\x73\x38\x1f\x14\x5e\x94\xd6\x2d\xc9\xf8\x66\xd3\x8e\xcf\xcf\x34\xaa\x65\x9d\xf0\xc9\x7e\x7d\x72\x39\x6a\x4d\x04\x56\xd1\x90\x42\xbc\xd2\x0a\xcd\x10\x89\x06\x60\x70\x38\x5e\x8e\x44\xea\xe7\x74\x46\xaf\x77\xc0\x14\x69\x0c\x1a\x8f\x7e\xc3\x37\x04\xfe\x08\x18\x64\x70\x28\x44\x21\x9c\xe7\x27\x9c\x9e\xa8\x21\x2b\x34\xa2\x1f\x51\x34\x62\x6b\x5d\x9a\x1b\x22\x94\x69\xf0\xd7\x7c\x01\xbd\x34\xf4\x5c\xe9\x37\x4c\x67\x59\x39\x72\x40\xfa\x13\xc3\xda\xe1\x0b\xd3\xc4\xa8\x82\x06\xab\x12\x1d\x4b\x11\x8b\xb2\x4a\x91\x6b\x3d\xf4\xa2\x01\xae\x80\x5e\xa8\xd6\xf0\xc8\x7c\x46\xa1\x3a\x72\xad\x13\x03\xda\xc4\xa9\x2a\x06\x3a\x40\x13\x76\x55\xe0\x83\x8f\x59\x87\x67\x99\x33\x70\x86\xb7\xbf\x01\x61\xc7\xea\x94\x04\x1e\x0d\x5f\x1b\xef\x14\x19\x44\xf7\x80\x80\x1f\x04\x56\xd1\xc5\x5a\x76\x2a\x4c\x53\xf0\x78\x16\x40\x00\xcf\x12\xe3\xbb\xde\xc9\x24\x53\xfd\xaa\xa6\x9e\xbc\x7c\xf1\xa3\x33\x4f\x78\x85\xc0\xa8\x46\x72\xb8\x07\xa4\xe0\x1d\x98\x61\x1a\x32\x31\x0c\xe1\x9d\x51\x08\x2d\x91\x3a\xbe\x8f\x9e\x43\xce\x75\x70\x12\x75\x90\x35\x40\x9f\x32\x1a\x34\xfc\x71\xbd\x9c\x42\x79\x3c\xb3\x06\x67\x39\x84\x45\x51\x47\x01\x04\x30\x39\xcf\x15\x32\x20\x9c\x05\x22\xd2\x9e\x3d\x94\x40\x31\x68\x72\xfc\x09\x84\xd0\x81\xd9\xf0\x14\x20\x2d\x99\xd0\x44\x2b\x0b\xcb\x5a\xc0\xdc\xa5\x6d\x68\x0d\x62\x59\x23\x94\xbd\xb4\x15\xd4\x2c\x96\xb5\x81\x51\x0d\x97\xb5\x00\x0a\xc7\x58\x03\x18\x21\x44\xd5\x2d\x92\xe6\x90\x0e\x64\x60\xc1\x20\xf4\x84\x21\x78\xc3\x56\xbd\xa5\x50\x98\x7f\xa6\xdf\x23\x76\x4b\x40\x1a\x48\xe8\x88\x8c\xea\x53\x30\xb9\x87\xa8\x17\x7a\x0d\xf0\x72\x4a\xdf\x86\xf1\x49\xfb\xe0\xd5\x81\xe2\xf0\xc6\x3c\x2e\xf5\x87\x15\x60\x05\x4a\x73\x9e\x5e\xe2\x73\xf3\x88\x29\x88\x64\x00\xef\x31\x3d\xd2\x95\x75\x4f\xbb\x88\x2a\x34\x8f\x04\x70\x97\x1e\x65\x55\xd3\x63\xda\x01\x33\xc4\x4b\xf3\x78\x77\x0e\x0c\x20\x2a\xc4\xaa\x78\x1a\x98\x5a\x18\x89\x64\x6b\xb0\xdb\x15\x08\xc4\xe9\x6c\x34\xe4\xa7\x0f\xcc\xc4\x07\x64\xdb\x2e\x89\x55\xb1\x02\xaf\x0e\xab\x53\x4c\xd2\xa9\xea\x7f\xbd\x13\x67\x85\x23\xa7\xe6\x99\x53\xce\xb8\xc0\x1f\x76\xea\xc0\x40\x1f\x7c\x7c\xd3\x87\xe7\x91\x77\x8f\x3e\x55\x1c\x2b\x78\x18\x3c\x37\x03\x55\xd4\xa4\xbf\xab\xa6\x44\xfd\x05\x4d\x54\x1d\x06\x95\xe4\xbe\x9c\xde\x57\x11\x7c\xe8\x32\x5c\x4d\xd4\xc8\x29\x3e\x35\x7e\x3d\x1a\xe3\x55\x2d\xaa\xff\xc3\x12\x6d\x16\x44\xd1\xdb\x09\x66\xc9\xd7\x5c\x63\x6e\x4c\xae\x5b\x6d\xc2\x64\x46\x96\x2f\x2c\xfa\x12\x29\x7b\xd2\x24\x0a\x8f\x06\x9c\xef\xa3\xeb\x0e\x7f\x50\xe1\x92\x8d\xe7\x29\x98\x3a\x53\xc5\x0e\xd6\xd8\x8f\x97\x47\xd3\x1e\xf0\x2d\x4f\x8f\x8b\x26\x56\x6c\x41\xa0\xb9\x12\xe0\xf8\x1f\x67\x09\xfe\x1e\x6c\x62\xa8\xd3\x6f\x92\xad\xe4\xbb\xa4\x83\x88\xb2\x47\xad\x94\x74\xfc\x29\x9e\xcc\x5a\x0d\x2a\x06\x55\x8c\xc1\xb2\xb3\xc7\xc8\x8b\x52\xa8\x65\x4c\xdb\xf8\x98\xf0\x3e\xc2\x9b\x78\x68\x14\xe2\xde\xb6\xe1\x08\x05\x33\x90\xf7\x87\xf9\xd4\x98\x28\xc7\x9b\xa1\x0b\x8b\x58\x3b\x90\xe3\x1a\xc2\x6b\xa5\x92\xe9\x09\x47\xcf\x52\x3e\xfd\x6e\xe4\x43\x70\xad\x66\x80\x0f\x3e\xda\x9f\xbf\x3f\x15\xa9\x49\x46\x2c\xc4\x21\x2d\x81\xf9\x89\x10\x0c\x54\x12\x56\x1e\x0c\x96\x52\x28\xfe\x0d\x1d\x09\xcc\x01\x01\x35\x93\x74\xbe\x16\xf1\xf8\x3c\x22\xc9\xf2\xd3\x01\x81\x7e\xf0\xf1\xe3\x87\xbd\x04\x4e\x88\x4b\xf8\xe7\x53\xc5\xf2\x9a\xd5\xc5\xb1\x42\xdc\x54\xbd\x0d\xfa\xbb\xd3\x0f\xfb\xb4\xb3\xf0\xe7\x97\x14\x0e\xb4\x5e\x37\x50\x69\x90\xd7\x62\xb8\xc4\xbf\x3d\x87\x8b\x5c\x7f\x8d\x29\x55\xbf\x0e\xa9\x9d\xc6\xaf\x76\x20\xfc\x5e\x6b\x4a\x23\x79\xf0\xb1\xb7\xb5\xb5\x7c\x25\x31\x5a\x60\xaa\xeb\x7c\xc9\x55\xa3\x1e\xc3\x65\xa3\xb3\x3c\xb2\x6c\x6a\x59\xd0\xa1\xb8\x4c\xaa\x5b\x14\x14\xac\x0e\x9f\x05\xa1\xf8\xed\xa0\x82\x82\x1b\x18\x7f\xfd\x9e\x9f\x90\xff\x4b\x5b\x8d\x1c\x44\x69\x25\x91\xd1\xe2\x0c\x41\x64\x1b\xc1\x73\xf7\xfa\xca\xc5\x58\xa4\x60\xa0\xbf\x74\x72\x49\xed\xaa\xf5\x32\x4d\xe9\xf9\x9b\x65\x27\x55\x4c\x2b\x68\x4d\x25\xbf\x6a\x46\x13\x4e\xc0\x71\x9e\x8f\xc3\xe1\x3f\x56\x6c\xaf\x82\x42\x8d\x77\xc2\x58\x53\xc0\xfc\x40\x03\x58\x85\x9d\x76\x65\x1c\xaa\x69\x0d\xef\x62\x04\x56\x34\xe1\x6a\xd9\x14\x2c\xf7\x8f\x44\xab\x49\x51\x4b\x4c\x04\xf1\x02\x14\x7d\x4a\x6c\x3b\xcd\xd4\x3c\x75\xdd\x7a\x8d\xfe\x41\x11\x11\xb5\x33\x70\x35\x3c\x1c\xdd\x99\x09\x01\x52\x14\xbc\x07\x06\x2a\xb3\xc5\x30\xab\x0c\xaf\xf2\xc9\x41\x9c\x1e\xc4\x09\xbe\x9d\xd7\x75\xf7\xfb\xff\x86\x19\x85\xad\xbf\xf2\x84\x4a\x44\x05\x03\x87\x9b\x59\xf5\xf0\x14\x2a\xd5\x9b\xd5\x87\xa8\x97\x4b\x29\x06\x86\xa6\x4e\x74\x71\x01\xb7\x14\xc7\xa0\x9c\x28\x0a\xa2\x52\xf9\xe4\x05\xdc\x36\x3e\xc9\x2f\x20\x12\x7d\x36\x34\x31\x64\xc9\x2c\x0e\x5c\xc2\x8a\xd1\x64\x00\x0a\xa3\x86\x92\xa4\xd3\xf1\x05\xbc\x95\xa4\xf2\x8f\xc7\xf9\xe0\x9d\x6a\xa2\x39\x24\x59\xdc\x30\x3b\xb3\xac\x01\x2e\xe2\x8a\xe4\x4e\xd2\x31\x52\xd9\x5c\x74\xd2\x92\xf3\x65\x46\x67\xf3\xe3\x43\xbc\xc5\x62\x66\x69\x4a\xe9\x3f\x59\xed\x1b\x20\x9a\x7b\x5c\xba\xc1\xd0\x57\x15\x3a\x4d\x8b\xff\x70\xe9\x64\x92\x8c\x4a\x9a\xa7\x19\x3d\x22\x4f\x23\x51\x93\xa7\x68\x86\xc2\xc5\x0e\x32\x67\xd5\x8f\xe9\x8f\x26\xc9\xd1\x6f\xa0\xed\x26\xd5\x12\x1f\x61\xab\xe8\x72\x69\x23\x95\x64\x12\x3e\x94\x64\xb2\xe9\x14\x25\xb0\x80\x7c\x5c\xe3\x39\xa9\xc8\xd1\x5c\x30\x36\x9d\x14\x49\x88\x62\x7a\x9a\x39\xdd\xdc\x4c\x7e\xd1\x47\x69\x3e\x43\xdd\xcf\x60\x31\x03\x75\xd7\xf8\xd2\xee\x62\x5d\xd4\x7c\xee\xe9\x33\xf4\x96\x6b\xe2\x55\x8e\x78\x62\x64\x52\x70\xe2\x46\xf3\x0c\x33\xfb\xe6\x66\x79\xab\xed\xae\x91\xb7\x78\x03\x5a\x01\x6a\x1a\x98\x65\xe3\x14\xdc\xd2\xf0\x16\x00\xb5\x6f\x66\x3e\xac\x59\x18\x19\x68\x6a\x0b\x2a\x5c\xb8\xee\x07\xb8\xd7\x56\x5d\x58\x13\xb3\x48\x19\x8c\x34\xb4\x65\x26\x8f\x4e\x64\xcf\xd2\xd2\x18\x5a\xb2\xba\xc7\xfc\xd1\x79\xdf\xd2\x52\x3f\x1f\x9b\x9f\x4f\xe1\xe1\xe9\xf9\x2f\xa3\xf1\xf8\x75\x36\xc8\x14\xf8\x01\x62\x4f\xb2\x0f\x84\xed\xb1\x25\x09\xe0\x50\x78\x98\xd8\x1a\x5d\x67\xc1\xa9\xdf\x9b\xb1\x39\x38\x32\xef\x31\x1a\x99\xa9\xa6\xe6\x2b\xff\xcd\x1a\x63\x13\xc8\x7d\xe5\x92\xb0\x1e\x4c\x97\x71\x39\xf8\x54\xd1\xc3\xe5\xb2\x1e\xc8\x4c\x32\xac\x16\x76\x40\x7f\xe3\xf4\x17\xf0\x1c\x8c\x5d\x93\x56\xc9\x74\xff\x34\x39\x57\x93\xc3\x42\x78\x5a\x94\x57\xa8\xf5\x1a\x2f\xb7\x91\x87\x03\x22\x8d\x91\x81\xe9\x5e\x49\xdf\x6d\x17\x7a\x55\xdd\x6d\x3d\xb0\x8e\x6d\x61\xd9\xf2\xa6\x81\xe6\x21\x47\x1a\x2b\x9c\xb5\x8e\xb5\x0c\xaf\xae\x0d\x16\x2a\x61\xe5\xa7\x22\x20\xaa\x67\x02\xc4\xf1\x26\x63\xe3\x99\xe7\xc3\x7c\x2f\x81\xa0\xe0\x46\x67\x8e\x86\x3b\x18\x5e\xd0\xa8\xb7\xcc\xcd\xd9\x39\x18\x0e\xa1\xe1\x07\xc2\x63\x9a\x10\xd9\x64\x4f\xa5\xcd\x59\x4c\x09\xf2\x9f\x16\x76\x47\x0c\x04\xbb\x3c\x62\x28\xda\xa8\x2e\x0b\xed\xe6\x75\x15\xda\x38\x26\x45\xfb\x42\xa9\x5f\x2f\xd2\x77\x78\x8d\xa1\x8e\xd5\x62\x04\x82\x0c\xa8\x0f\xd0\xdc\xc3\x5b\xa8\x04\x47\x37\x25\xbd\x3c\x70\xeb\x93\xcc\xa1\x0a\xed\x54\x46\x30\xf1\x1d\x06\xd3\x07\x3e\xc7\x9a\x0c\x46\xb3\xc1\x62\x84\x6a\x6e\x7d\x3b\xad\x88\x1e\x9d\x0d\x14\xe0\x00\x58\x05\xf5\xe3\xfd\x08\x2e\x69\x40\xf6\xb7\x57\x93\xc3\x3c\x2b\xe0\x82\x0d\x2d\xf6\xec\x26\x6c\xb2\xae\x75\x8b\x10\x06\x28\x30\x0c\xd4\x0f\x4c\x08\xa2\x42\xe5\x5b\x2d\x67\x18\xca\x5b\xd3\x50\x41\x08\x87\x3a\x8d\x51\xf1\x16\x73\x3b\xd4\xf6\x24\x7a\x47\x59\x6a\x03\x78\x80\xe4\x5a\x6d\xc6\xa8\x2d\x91\x9b\xb3\xe7\xfa\xd2\x5e\x1e\x04\x72\x5f\x7e\x0c\x0e\x07\x7e\x2c\x5a\xc2\x6f\x7b\x95\x36\x45\xcc\xaa\xc8\x2f\xf1\x2b\x01\xce\xc0\x79\x8c\x77\x2b\x1c\x21\xc2\xc5\xc7\x9d\x03\x28\x28\xed\x96\xa1\x4c\x8b\x35\xf5\x70\x38\x8c\xd1\x00\x6b\xb8\xb4\x3a\x01\xa8\xac\x5a\xb5\xfb\x39\x48\x96\x6d\xc6\x2b\x5e\xba\xb1\x1c\x5e\xfe\x3f\xf6\xde\xfc\xb1\x89\x23\x59\x1c\xff\x19\xff\x15\x83\x77\xdf\x47\x12\x91\x65\x1b\x42\x0e\x9b\xe3\xcb\x95\x17\xde\x87\xeb\x81\xb3\x09\x5f\xc7\x4b\xc6\xd2\xd8\x9e\x87\xac\xd1\x6a\x24\x6c\x85\xf8\x7f\xff\x74\x5d\xdd\xd5\x3d\x3d\x23\xd9\x18\x42\xf6\xc1\x66\x41\xd3\xf7\x51\x5d\x5d\x55\x5d\x87\xe8\x9f\x5a\xa0\x53\x36\x04\x1d\x6d\x50\x10\x5a\x33\xa2\x2d\xc5\x9a\xd5\x6b\x59\x93\xe6\x5b\x31\x9c\xf3\x68\x34\xa8\xc3\x38\x95\xb3\xd3\x40\x26\xa0\x42\x13\x81\x08\xe2\x7e\xc9\x6c\x84\x4b\xd3\xc7\x8e\xc4\xcb\x39\x17\xac\x21\x21\x72\x41\x40\x29\xc6\x8b\xe1\x84\xef\x8e\xcf\xea\xba\x08\xc6\x16\xc0\x0c\x3e\xfd\x2f\x86\x1a\x59\x4a\x8a\x64\xef\xa2\x74\x45\xa1\x69\xdb\xd2\xda\x31\x50\xbb\x6d\x6f\xfb\x6a\x7c\xaf\xf5\xf6\xdd\xad\x7f\xfe\xf1\x6b\xf9\x55\xa7\x0e\x16\x7f\xdd\x5f\x77\xc1\xbb\x12\x15\xf4\xc4\x4d\x3b\x0a\x96\x4b\xa2\x32\x29\xea\x11\x39\xb8\xac\x6f\xa6\xc5\x8b\xfc\x34\x1b\x96\x6d\x05\xad\xae\x58\xa5\x2e\x91\x2f\x8b\xaa\xc2\xe3\xc1\xf6\x4a\x2d\xb5\xad\xc9\x57\xf7\xbb\xeb\xe5\x22\xdd\x6a\x7f\x7a\x94\xaa\xd9\xf5\xff\x34\xd4\x31\xbf\x47\x1b\x9a\x19\x9d\x1a\xd8\xde\xd8\x9d\xa5\x8d\x51\x4c\x34\x75\xbb\x32\x15\xd2\x2f\xf0\x7d\x25\x50\x5a\x58\x92\xad\x8d\xcc\x3e\xa1\x97\x77\x15\x4d\xc3\xda\x42\xd0\x91\xd1\xfc\x84\x39\x7e\x7d\x70\x8c\x9d\x31\x45\x3b\xb0\xfc\xb2\x37\x4f\xfb\x84\xf5\x84\xa3\x08\x86\x57\x04\x86\x6e\xb1\xeb\xcb\x89\x2a\xda\x43\x82\xa4\xb2\xf7\xfa\xee\x5e\xea\x15\xa5\xaa\x1a\x71\xe6\x3e\xda\xf5\xbe\x9e\x22\x3a\xa6\x0a\xc8\xe2\xb5\xd0\xa9\xc4\xb6\xad\x0b\xed\xf3\x74\x6e\xf9\x0d\xf9\x96\xc1\x76\xca\xc1\x7a\x4a\xfe\x59\x84\xc2\x0e\xc7\x8d\x56\x42\xf5\x03\xff\xea\xb6\xb7\xbd\xbc\x60\x3f\xe7\x83\xe9\x91\x3f\xde\xb0\xdd\xfb\xc5\xa9\x3f\x58\xbf\xdd\x35\x0f\x4e\x82\xf6\xce\x62\x2b\x71\xe7\x32\x57\xc2\xec\xf3\x4f\x14\x88\x62\x28\xc6\x40\x51\xce\x85\x3e\xbc\x6b\x45\xc1\xe9\xeb\x4b\x80\xd3\x1d\x8a\x8e\x19\xd2\x29\x31\x30\x7d\xbd\xfd\xc1\x50\xba\xe3\x1b\xcc\x37\x01\x29\x0c\xcc\x83\xd1\x1d\x17\x6c\xe4\xd3\x82\x28\x99\xa6\x9d\x17\x46\xc9\x1d\xcb\x25\x02\x69\xd8\xe0\xa7\x84\xd2\x29\xe3\xec\x18\xf3\x1b\x81\x51\x8a\xb7\x21\x6a\x03\xb7\x3d\x92\x5e\x92\x1d\x56\x06\x91\x95\x5f\x08\x52\xdc\xed\x70\x3f\xed\xbf\x3d\x49\x27\x83\x72\x0d\xf8\x63\xc3\x0e\x92\x59\x31\x1a\x72\xc8\xc3\x2c\xd4\x70\xa4\x9a\xeb\xbb\x62\x3f\x02\x05\x3b\x01\xa9\x10\x68\x2d\x78\xce\x42\x95\x02\x43\xd7\x57\x31\x48\x16\x6b\x2e\x24\xcb\x29\x2b\xe0\x1f\x5f\x37\xc1\x7a\x82\xa6\xe6\xd7\xb1\x02\x3a\x84\x4e\xae\xe1\xef\x18\x1c\x54\x15\x11\xec\x0b\xbc\xb7\x1d\x71\xe5\x83\xa4\x22\x9a\x84\x3f\xe7\xd1\x0b\xe8\xe2\x36\x80\x2d\x86\xf6\x86\xb6\xb4\x82\x02\x57\xdf\xdc\x73\x9e\xaa\xce\x82\x79\x38\xd2\xfa\x81\x9d\x4f\x7e\xe0\xc5\x43\x4d\xf6\x21\x84\x9a\xb0\xbb\x16\xc8\xac\x15\x8a\x93\x35\xd9\x31\xf9\x08\xd4\x36\x6c\xab\x70\xa6\x33\x64\xb9\xed\xe6\xd3\x76\x8b\x25\xcb\xb0\x95\x44\x89\x2f\xcf\x37\xfd\x3b\x27\xc8\xab\xb1\x20\x95\xa5\xaf\x6f\x06\x17\x36\xa8\x2d\xcb\x65\x1d\x6a\xa0\x5b\x71\x19\xb8\xde\xeb\xe8\x15\x44\xe5\x59\x93\x50\x2f\x01\xfb\x01\x7e\x96\x3e\x73\xad\x21\x04\x04\x2e\x81\x22\x77\x98\x5f\x3e\x06\xb7\x31\x3c\xc3\x23\x41\xed\xcc\x85\x03\x99\x06\xc1\xab\x62\x68\xca\x2b\x5d\x87\xf3\x1c\x7c\xbd\x82\x97\x50\x70\xda\x8a\x2d\xad\xb8\x36\x85\x8e\xbb\x1d\xa1\xe3\xc8\x3b\x67\x85\xd0\xaa\x10\xe0\xde\xad\x1a\x6b\xe9\x75\xd8\x12\xdd\x86\x9a\x1c\x47\x08\x88\x4a\x13\xcf\xc3\x31\x02\x19\x51\xcf\x31\x26\x36\xee\x26\xca\xcb\xea\x25\x78\x59\x8f\xa5\x6f\xfc\xf8\x61\xc8\x73\x2d\x92\x43\x4c\x8d\x11\xb4\x99\x51\x24\x5b\x5f\x9f\x11\xc4\xd6\x1b\x3c\x55\x48\xb4\xe7\x3a\xe5\x02\x1d\x52\x40\x40\x61\xba\xe8\x94\x0d\xeb\xcf\x6b\xc8\xa4\x80\xb2\x27\xab\x55\x18\xd0\xac\x4a\x0a\x50\xb2\x86\xf2\xb6\x38\x16\x0a\x08\x00\x5b\xcd\x01\xb4\xda\x19\xea\x48\x01\x35\x79\x33\xe7\xfe\xbd\xcb\x92\xd2\x2a\xf7\xaf\x78\x69\xf4\x1a\xd8\x4a\xbc\x30\x19\x96\xb7\xdd\x4a\x5a\x01\x2f\xdb\xb2\x0f\x19\xde\x6b\x4d\x6c\xcf\xdc\xb3\x8e\x86\x12\x8e\xf3\xea\x92\xc2\x06\x7f\x1a\x57\x9a\x7b\x34\x1a\x04\x8d\xa1\x00\xa7\x5a\x2a\xdc\x9b\x97\x99\xe8\x4b\x90\xa6\x84\xb7\xf0\x20\x88\x01\xc1\xea\x31\xaa\x4c\xe6\x06\x1c\x87\xd9\xa9\x88\x64\x49\x3d\xc6\x6c\x08\x4a\xd0\xd9\xd8\xda\x14\x3e\x49\x47\x53\x7c\x3e\x04\xa7\xf5\x33\x30\x74\x9b\xf6\x3b\xfe\x3e\xd2\xf2\xcb\xd3\x59\x28\x0b\xf2\x03\xcc\xf5\x87\xc5\x28\x03\x4f\x4d\xe4\x18\x8a\xf2\x1e\xb0\xf6\x45\x0f\x94\x9d\x3d\x31\x29\x67\x74\xba\xec\x1b\xd6\xdb\x5d\xaf\x7d\xc3\x0f\xf7\xcc\x18\xc5\x53\x66\xac\x11\x77\x78\x2c\x8f\xaf\xcf\xcf\x3b\x21\x14\x2d\xa0\x53\x70\xd7\x64\x9c\x4d\xc0\x47\x50\x7a\x98\x95\x6e\xe2\x64\x9f\x4f\x2a\xce\x60\x68\x4f\x2a\xc9\xe8\x1d\x04\x13\xd9\x21\xea\xda\x66\x07\xb3\xff\xa3\x55\x59\x17\x4b\xda\xb4\xbf\xa2\x1a\x22\x57\x31\x85\xbb\xe0\xd4\xd8\x50\x3b\x9b\x1b\x40\xe8\xb8\x9b\x2e\x64\xfe\x7b\x75\x4c\x21\x91\x48\xee\xf5\xe5\x4c\xc9\x7d\x4d\x6f\x86\xd0\xc4\x3e\xe1\x7c\xf6\xc1\xea\xe8\xf7\x6c\x52\xd8\x23\x03\x56\xfa\x76\x74\x58\x0e\x9b\x73\x14\x03\x1d\xd3\x1c\x3b\x30\x67\xf6\x07\x30\xdf\xc9\xcc\xb7\x35\xaa\xdf\xf0\x5f\xd3\x72\x5c\xfa\x95\x15\x94\xe3\xd5\x06\x4e\xbb\xb9\x54\x48\xda\x88\x3f\x9c\xd0\xcf\x0c\x7b\x44\xea\x88\x63\x23\x7c\x22\x2f\xc8\x96\x10\x31\xc1\x15\xcf\x96\xf0\xca\x95\x61\xba\x1f\xb3\x43\xa1\x47\xfb\x2b\x57\x68\xa9\xea\xf3\x23\xfa\x4e\x92\x35\x6f\xc8\xda\xa8\x79\x43\xbf\x02\x40\x7a\xa5\xfe\x05\x3d\xc8\x41\xc4\x7f\xe5\x8a\xa5\x59\xaf\xd8\xf9\x38\xd8\x46\xc3\x7c\x2a\x67\x4b\x62\x5a\x0f\x8b\x6e\x43\xfa\x19\x0c\xca\xce\x75\x99\xba\x54\x56\x55\x3e\xad\x5c\x8a\xaa\x4e\xd6\x3b\x55\x45\xe7\xcd\x45\xe7\xba\xe8\x46\x53\xd9\x0d\x2a\x69\xfe\x32\x78\xf0\xca\x59\x3c\xb4\xa6\x07\x02\x51\xaf\x59\x4b\x05\xdb\x8c\xc0\xde\x1b\x8a\xf4\x06\x9d\xb0\x57\x0e\x73\x95\xe4\x87\x23\x38\x1a\x6e\xd0\xf4\xa6\x03\x86\xc0\x35\xf1\x24\xe9\x7e\x0f\x82\x4a\xd2\x55\x5e\xcc\x26\x7d\x8e\x4b\x49\xa5\xd0\xf7\x45\xe8\xc8\x92\x8a\x41\x25\xe7\xe9\x5e\x39\x08\x89\x85\x92\xa0\x2a\xd6\xa1\x25\x7b\x9b\x97\x30\x90\x94\x4b\xc1\x72\x93\x33\xfc\x9f\xe7\x95\x7e\x1b\xef\x9d\xe6\xe3\x87\x7c\xe1\x0d\x9d\x35\xb8\x61\x8f\xe5\x83\x23\xd0\x36\x55\x79\xbd\x75\x4c\x92\x8a\xf7\xd0\x71\x8a\xce\x86\x14\xc9\x7d\x91\xa2\x03\x11\x95\x0b\x29\x92\xbb\x53\x14\xc3\x69\x3e\xf6\x0b\x70\xa2\x1d\x80\x3e\x44\x82\x1b\x54\xf1\x4a\xb6\x34\x4e\x02\x08\x44\xb3\x91\x6a\x61\xae\x9d\x0e\xb0\xdd\xf9\xc1\x3c\x52\xc5\xcb\x92\xf2\xaf\xe0\x88\x85\xa8\x4b\x55\xaa\xe6\x7b\x35\x1f\xa6\xd3\xb4\xae\x96\xcd\x93\x1a\x3c\xd5\x57\x06\x2c\xb2\x86\xa5\x50\xf9\xc1\x42\x47\xea\xe8\x1c\xb7\xe4\xa6\xe7\x57\x28\x5a\x88\x29\xcf\x5e\xf1\x2c\xc5\x57\xb9\xf0\x2a\x60\xc3\x00\x61\x1b\x26\x29\xad\x31\x24\xe9\xe5\xe5\x4b\xd6\xee\x04\xec\x61\x6e\xc6\x48\x49\x38\x99\x41\xc1\x21\x06\x98\x5c\xa2\x20\x46\x88\xc4\xa5\x58\xaa\xb8\x41\x17\xc5\xdb\xc5\x45\x19\xeb\x57\xc8\x7a\x4a\x60\x1c\x8f\x08\x47\x08\x5a\x47\xe2\x6c\x73\x16\xac\x8a\xc9\xa0\x12\x3d\xf8\x92\x1c\x58\x05\x97\x03\x5f\x92\x03\xd3\x76\x39\xf0\x25\x39\x6e\x9e\x2e\xdf\xa5\x49\x29\x9a\x9e\x2b\x41\xdf\x92\xcb\x44\x86\xcd\x75\x37\x06\xf6\x0d\x77\x8f\xea\x5c\xae\x22\x7c\xa2\x20\xe2\xf8\x11\x6a\x1e\xd9\x22\x3a\x35\x28\xf9\x24\x03\x4e\x35\x2c\x89\xa9\x06\xf8\xdc\x32\xa0\x3f\x54\xb3\x34\xbd\xe3\x74\xdc\x0e\x6e\xb9\x2e\xb9\xc0\xe3\x1b\xc6\xa3\x2f\xfd\xe8\x61\x80\x6b\xba\x7c\x0f\x19\x0c\x69\x80\x15\xfc\xe7\xe1\x04\xe4\xbe\xfc\x2a\x59\xed\x59\xa7\x7a\x78\x8f\x5d\x51\x6c\xc6\x2a\x0c\x65\x95\x92\x05\x42\x56\x47\x86\x36\xe6\xb4\x83\x7c\x38\xdc\x52\x5b\xd0\xd6\x6d\x77\xa8\x8c\xe1\x08\xa0\x15\xa2\xd0\x4a\x3f\x4f\x2f\xd4\x96\xb7\x98\x5e\x3e\x2e\xcf\x96\xb7\x84\xdc\x36\x1e\x30\xf8\x1b\x6f\xd7\x0e\x2c\x36\x52\x6f\x0e\x6a\x9a\x16\xf2\x7c\x2b\xa8\xd7\x05\x03\x9f\xda\xf9\xc1\x57\x74\x7e\xb2\x66\xf4\xaf\xbf\x3a\x95\x11\x37\x0c\x03\xca\xae\x1e\x52\x87\xa4\x2c\x78\x85\x70\x46\x69\x7e\x74\x88\xa0\xb0\x74\xa4\x49\x96\x4b\x6b\x09\xf4\x65\x8b\x23\x02\xb3\x8e\x2e\x2a\xd7\x4a\xb7\x72\xa1\x74\xfd\xcb\xa2\x1b\xb9\x0b\xba\x01\x96\xef\x46\x70\x78\xd7\xc3\xce\x7b\x11\x34\x8a\x7a\x7d\xe3\x62\x88\x2a\x85\x75\x46\x96\xcd\x28\xec\x12\xa8\x55\x6f\x14\x08\x00\xe9\x84\x76\x44\x3a\x1e\xdc\xe8\x95\x30\x2f\x43\xb7\x4c\xb3\xc3\x62\x32\xbf\xbe\xd1\xee\x08\xc5\x07\xdd\x1b\x86\x0e\x67\xfa\xe3\xf4\x58\xd3\xbd\x3a\xb9\x3d\xe8\x5a\xd9\xd7\x52\xd8\xf4\xd4\x21\x93\x53\x49\x9b\x6f\xb8\xc4\xf9\x86\x4d\x55\x89\x1f\x8e\xf9\x4e\x05\xe7\xd2\x73\xf4\xa9\x87\x6e\xe7\x7e\xe6\x9c\x33\xa5\x2a\x3e\x64\x3c\x98\x4d\x4a\xf4\xc6\x44\x55\x7b\xf9\x08\x5c\x8b\x58\x31\x21\xc8\xa5\x5d\x8d\xfb\x79\x49\x2a\x50\xb7\x61\x95\xf7\xf9\xab\x5d\xa5\xb7\x79\xc7\x4e\xf1\xe5\x1d\x8e\x56\x6f\x42\xef\x30\xdc\x90\x48\x64\x6c\x8b\x72\x6e\x49\x10\xde\x30\x18\x6c\xcf\xd5\xe7\x1f\xb7\x13\x5d\x5f\xfc\x5a\xdd\x95\xfc\xb5\x64\x33\xd9\xe2\x0f\x37\x1b\xfc\x14\x4f\x8c\x17\x6a\x49\x2f\xa4\x6d\xc8\x9b\xca\xae\xea\x45\xaf\x24\xa6\xb2\xac\xd7\x75\xbd\xe1\x3a\xda\x52\x3d\xfa\x1d\x49\xad\x58\x3f\x90\xc7\xdd\x78\x6f\x28\xde\x5e\xaf\xe9\x11\x77\x0c\x4b\xd1\x5c\xec\x89\x08\xac\xaf\x54\x16\xfe\xa5\x6c\xaa\xf5\x04\x54\x2d\x43\xaf\xe4\xc0\x74\x09\x54\xfa\x70\x37\x8f\x6f\xf5\xa6\x5a\xad\xf9\x79\xe1\x6e\xbe\x21\x8b\x93\xc9\xca\xec\xc1\x25\x3b\x8f\x24\x33\x7c\x0e\x79\x98\xd8\x9f\xcc\xc0\x76\x0c\xf8\x40\x8f\x1b\x6b\xb9\x62\x76\x03\x07\x0e\x60\xe6\x1a\x60\xe6\x3e\xe8\xcd\xe5\xed\x76\xee\x36\x71\xce\xe3\xf1\x06\xa6\xd7\xeb\x78\xc6\x9a\xd0\xb7\xd5\xfc\x06\xbb\xb6\x4b\xd3\xd3\x5e\x7c\xb6\xb5\x85\xf4\x85\xa7\x84\x60\x1a\x11\x52\xef\xdd\xca\x28\x3a\xdb\x97\x41\x84\x1e\x71\xf8\x0d\xc1\x6d\x47\x99\x46\x13\x27\x70\xc9\xb9\xcc\x13\x52\x38\xa0\xbc\x63\xc3\x57\x22\x17\xc1\x99\xf4\x7d\x3e\x72\x54\xdd\x25\xae\x98\x4a\x5c\x8e\x6c\xb5\x0f\xc4\x42\x4c\xf2\xd3\xee\x07\xa3\xf6\xd8\x95\x12\xb9\x3c\xe2\xd7\xcc\x29\x73\xc4\xd2\x02\x7c\xda\x1a\x7e\xde\x5c\xe7\x31\x5b\x40\x37\x86\xe6\x0a\x30\xce\xeb\xcf\xbc\x23\x94\xed\x92\xbc\x42\x12\x53\x45\x97\xfa\xd1\xdb\xd8\x8b\xdc\x5a\x16\x71\x4e\x41\xc2\x3a\x76\xed\xbb\x24\x75\x7e\xc3\x42\x73\x55\xc8\x67\x66\x80\x5c\x78\x77\x88\xcc\x4c\xbb\xd3\x3b\x6d\xb8\xcc\x88\xb6\x86\x3b\x4d\x90\xc6\xbc\x01\x05\x51\x69\x73\x52\x33\x3a\x8b\xae\x96\x82\xb0\xb6\xfa\xdd\xf1\x38\x0f\x37\x32\x24\xdb\xcf\x3d\xb2\x8d\xc5\x43\x23\xc4\x3b\x28\x8e\xe1\x45\xb6\x63\x6e\x11\x18\xe7\x86\x6e\x64\xf3\xf2\xe7\xb7\x88\xbc\x1e\xe4\xef\x02\x02\xbb\xae\xe8\x15\xa4\x97\x89\xc2\x7f\xcf\x98\x64\x8b\xff\xed\x12\xee\xd8\xa2\x7f\xba\x8c\x2d\xb6\x04\x6b\x90\xa8\x30\xda\x32\xcb\x11\x84\xdb\x50\xbc\x0d\xd5\x61\xd6\x1f\xfe\xe6\x04\x12\x1a\xc0\xdf\x9c\xa0\x79\x7e\xf7\x9b\x33\x7d\x5e\x44\xda\x24\x11\x2c\xfe\xc3\x49\x22\x5a\xa5\x7f\x39\xd1\x67\xd4\xf8\xb1\x28\xe4\xd6\x02\x76\x4d\x97\xc2\x24\x2c\x74\xd6\xa9\x5f\x02\x40\x07\x5d\x2b\xab\x6c\xf3\x42\x68\xbe\xeb\x14\x0d\xb0\x56\xa5\xbf\x49\x2e\x16\x07\x26\x8f\xfc\xee\x48\x5e\x49\xcb\x70\xaa\x97\x40\xb6\x4a\x21\x06\xce\xe1\x4d\x73\x78\x85\xc6\xda\x25\x6c\xd6\xf9\xa0\x31\xcf\x1b\xc6\x0c\x97\x7f\x30\xe2\xf9\x07\x8e\x78\x4e\x23\x86\xcf\x4e\x2d\x18\x33\xcb\x25\xc0\x46\x41\xa4\xbd\x97\x55\xbe\x8a\x7b\x94\x45\x9d\x86\xef\xb3\x52\x06\x54\x43\xb0\x40\xe5\x7d\x56\x4a\xa0\xf6\x09\x75\x85\xbc\x4f\xac\x23\x93\x91\x9c\x75\x7c\x86\xb6\x2a\x22\x17\x76\x95\x83\x1b\x04\x52\xc9\xad\xcd\x9b\xdf\x75\x45\x06\x6b\x3e\xbe\xef\x5a\x79\xed\xd6\xe6\x37\x37\xba\x51\x81\xa9\xc9\xf9\xba\x1b\x97\x1f\x9a\xac\x9b\xdd\x98\xb8\xd4\x64\x7c\xd3\x15\x71\xae\xf9\xc0\x5e\x23\xc2\xce\xad\xcd\x6f\x37\xbb\x55\x89\xa6\x49\xbe\xde\x55\xc2\x5e\xf3\x7d\xa3\x1b\x8a\x23\x4d\xa2\x19\xd7\xe0\x86\xf9\x61\x0a\x07\x2f\x01\xdf\x5d\xf0\x25\x20\x14\xf0\x1a\x00\xf0\xec\x98\x9e\xfa\x56\x4c\x49\x35\x93\x09\x2c\xba\xde\x52\x6e\x4e\xbd\x87\x5a\x02\x6d\x19\x73\xb4\xda\x32\xbe\x9d\x5a\xa5\x3b\x97\x6b\x99\x6b\xc9\xd3\x9c\xb5\x2d\x3f\x76\x2d\xa1\x8e\x8d\x95\x3d\xa2\x03\x72\xb1\x19\xbb\x22\xfd\x30\x31\xb2\x4b\xc7\x83\xb1\xe4\xea\xb3\x82\xa8\x94\xf4\x5d\x9a\x0f\xe1\xd9\x9d\x8f\xae\xa0\xcc\xdd\xf7\xc9\x69\xbc\x18\x38\xb7\xd8\x4c\xce\xf6\x50\xe8\xb3\xa7\x18\x17\x54\x80\xf3\x75\xde\xdc\xd8\x3a\xd1\x31\xb9\xfc\xbd\x90\x03\xf2\x0a\xfa\xf2\xd5\xb3\xfa\x57\x27\x0d\x11\x2e\x9c\xc6\xf7\x97\xfe\xcc\xd9\xf8\xce\xc2\x94\xe1\x32\x12\x2b\xc2\xa6\x15\x31\xd1\x34\x37\x87\x4f\x5e\x9f\x6a\xc4\xee\x5d\x2e\xf7\x8f\x9a\xb7\x52\xaf\xd0\x0f\xc5\xe4\x38\xad\x35\xe6\x07\x89\x90\xc1\xbd\x3b\xa6\xe0\xab\xfc\xf7\x88\xdc\x49\x9c\x49\x50\x63\x2f\xd2\xc1\x00\xed\x45\xea\x8b\x15\xb3\xe9\x72\xed\x95\x4b\x8b\xf5\xd5\x3d\x54\x2f\x38\x83\x57\xf5\xc6\x71\xe9\x2b\xab\xc6\x79\xeb\xaa\xb9\x03\x0c\x98\xdb\x4b\x58\xae\xb6\x64\x15\xe5\x2f\xab\x7b\x9d\xf0\x21\x23\xfe\x98\x4d\xa3\xba\x04\x71\x5d\x00\x0d\xbb\x9b\x1b\x7b\x5d\x49\x97\xdd\xb7\x94\x9e\xde\x6d\x9b\x18\x6c\xef\x37\xb6\xa4\xdd\xca\x1b\x98\x14\x6c\x1b\x95\xf3\x84\xe8\xf6\xfa\xa7\x95\xde\xc0\xdf\x82\x54\x56\x57\xb4\x84\xd0\x4c\x6c\x07\xe2\x31\x02\xdd\x4a\xc1\x12\x34\x3a\xab\xe6\x2e\xc7\xed\xaa\x1d\x54\xec\xa2\x4b\xfc\x70\xae\x18\x66\xe6\xb2\xe0\xcb\xca\x82\xbc\xce\x21\x54\x1e\x80\x8a\x4f\xd3\xaf\x4e\x65\x56\xed\x0d\x03\x32\x86\xac\xc7\xf6\xbe\x4a\x56\x3b\xab\x01\xb2\xac\xb4\xc6\x10\xb7\xa8\xc1\x36\x8d\x90\x44\x5d\x3c\xcf\x2d\xec\xa6\xb3\x5c\x3f\x08\xcf\xb5\xbd\xe8\x31\x77\x93\x8d\xc5\xcd\xd1\xb1\x68\x6c\xcf\x1b\x32\x2d\xbe\x1a\x71\xd8\x8b\xd7\xd0\xaa\xa0\xfc\x3f\x51\x50\xe2\x9d\x40\x57\xc6\x4b\xd6\x65\xff\x11\x08\x2c\x5c\x9a\x2e\x45\xc7\xd4\x2f\x45\x69\x9e\x28\x40\xce\xa3\x16\xaf\xa8\x64\xdd\x22\x1f\x67\xbf\x49\x4e\xb4\x07\x48\x9f\x71\x75\x84\x74\xb2\x15\xda\xf8\xd2\x9f\x52\x4b\x11\x96\x3d\x88\xda\x1e\x4e\xa4\x48\xce\x14\xae\xfe\xc8\x35\x09\x77\xd4\x94\x71\xab\xd5\x92\x13\x05\x64\xa0\x8c\xde\x2f\xa8\x88\xf7\xc5\x9a\x9e\x98\xd2\xf5\xb7\x16\xc2\x65\x96\x1e\x47\x0f\x91\xab\xd4\xe6\x31\x1e\xb8\xea\xb6\x8a\xc1\x1e\x52\x5d\x1f\x5e\xd6\x15\x6f\xaf\xc3\x42\x4d\xa3\xd9\x46\x1a\x4b\x9d\x09\xbf\x29\x27\x57\x90\x07\x54\x27\xcd\xd8\x26\x1e\x8a\x5a\x58\x61\xc9\x31\xe8\x23\x3e\x7f\xf8\x7c\x8b\x9d\xba\x4c\xc0\xe3\x52\x7f\x98\xa5\x06\x9a\x92\x93\x74\x7e\x97\x0d\x29\xc9\xe3\xcb\x06\x0e\x06\xfd\x35\x41\x9c\x4a\xc3\x9b\x27\xfd\x49\x81\x01\xc1\x78\x15\x70\xd7\xae\xde\x96\x73\xf5\x7f\xfe\x4f\x22\x29\x74\x96\x54\xc2\x46\xc7\x5d\x65\xb2\x63\xe6\x96\xcf\x87\x06\xe8\xb4\x7c\xc4\x86\x8d\xc1\x37\x5c\x0a\x1d\x13\xaa\x2a\x49\x5c\x1a\x42\x26\x68\xb3\x6a\x23\xe9\x5f\xb1\x0f\x91\x1a\x46\x5e\x41\x1c\x6a\x3c\x16\x28\xa5\x3f\x4e\x4f\xdb\xde\x11\x02\xfc\x63\xf0\x90\x77\x58\xe4\x04\x80\x66\xd1\xed\x24\x8a\xf8\x31\xb8\x7c\x14\xb7\x82\x5b\x47\x10\x59\x6f\xda\x76\x26\x10\xca\xc4\xc9\x04\x6f\xbc\xc1\x0d\x7f\x09\xa9\xb4\xf7\x4a\x72\x85\x21\xa4\x45\x80\x47\xf0\x82\xd5\xef\x83\x9e\xef\xdd\x88\x66\x96\xe8\x88\xa1\x34\x09\x45\x49\x41\xad\x36\xa8\x36\x5e\x27\x0c\xcb\x10\xee\x0e\x91\x44\x93\x4e\x54\x80\x5a\xb8\xd6\x41\x9d\xf0\x34\x96\x38\x8f\x96\xbc\x1e\x2d\x1a\x4d\x1d\x44\x5b\x98\x1a\x3e\xe8\x1e\x79\xe9\x8d\xd5\x89\x25\x22\x3a\x70\xf1\xdf\x6c\xfe\x76\xdd\x7d\xcd\x37\x6c\x74\xe7\xd4\x5d\xae\xd7\x44\xdd\x64\xe0\x41\x84\x6f\xaa\x2b\x1c\x0e\xd0\xfc\x82\xc9\x20\x98\x5c\xd3\xc0\x46\x85\xae\xbb\x52\xd7\x5d\xb1\x0a\xfe\xbe\x32\xb0\x8d\x90\x53\xd0\xd5\x8d\xcc\x8c\xd2\x90\x54\xbd\x6f\x37\xcd\x2f\x2c\xe3\xad\xcf\xea\x71\x3e\x00\xe7\xf7\x54\x1b\x12\x9e\xc2\x3d\x8b\x3b\x4e\x52\xc8\x55\x22\x16\xb8\x4b\x1f\xeb\x9b\xdc\x7f\x6c\xfc\xe8\x2a\x6c\x62\x85\x7f\xd4\x95\x47\x58\xb9\x12\x2c\x76\xad\x48\x71\x15\x06\xba\x2a\x32\x45\x4d\x3d\x42\xfb\xca\xa8\xde\x8c\x0f\xdb\x5c\xed\xaa\xbd\x37\xc5\xcc\x95\x6e\x92\x4e\xad\xe0\xd1\x30\x9c\x6b\xdf\x88\xbc\x11\x6b\xa0\x44\xa8\xc2\x31\xc6\x37\xcd\x10\x4d\xef\xcf\xd4\xa6\xd5\x6c\xd5\xdc\xee\xd4\x69\xe3\x4e\xcd\xdd\x96\xe2\xa6\xad\xf6\x6e\x5c\x8f\xee\x90\xde\x4d\x98\x11\xec\x26\x3a\x69\x09\xf7\xac\x6e\x87\x68\xff\xf4\x8e\xfe\xb8\xf1\x8f\x70\xcf\x7e\xfc\xac\xf6\x6c\x0e\x3c\x83\x39\xde\x08\xb8\x37\x33\x60\x9e\xec\xae\x98\xb4\x49\x81\xe6\x22\x6b\xdf\x9b\x43\x54\xb3\x9f\x1a\x6d\xf3\x08\xdd\x7d\xe1\xeb\xbd\x40\x9a\xaf\x3f\xa4\xcd\xad\x4c\x25\x85\x48\xb1\x30\xdd\xa7\x16\xe7\xf1\x93\x95\x1d\xa0\x55\x07\x5f\x7d\x7f\xb6\xaa\x54\x17\xb6\x15\x8a\xad\x5f\xc0\x43\xbb\x7a\x4e\x3d\x09\x2f\x50\x5f\x2d\xc9\x5b\x5b\xc8\xf7\x97\xc8\x0d\xac\x41\xbc\xce\x2a\x3b\xc9\x7b\x83\x74\xb7\xcc\xff\xcd\xba\x9b\x7f\xe7\xe6\x5f\xab\xd8\xf4\xb7\x34\x4d\xcd\x12\x37\x08\x7b\x89\x5c\xd0\xfb\x7e\x05\x45\x3e\xa7\xb8\x8b\x73\xda\xc5\xc1\xdc\xdf\x66\x05\xe0\x3c\x3e\x45\x91\xd0\x1a\x63\x6a\xc7\x6d\xa8\xbb\xd7\xc6\xe6\xee\x6d\x06\xc5\x55\x28\x82\x13\xd3\xab\x44\xa4\x98\x49\x1e\x98\x01\x75\x13\x52\xd4\x62\xd5\xad\xea\x8c\xcf\xa3\x7f\x04\x51\x82\x0e\x2c\x57\xab\x3b\xb5\x3f\xfd\xdd\xc1\xcb\x3b\xc6\xb9\x76\xc5\xca\xe5\x7d\x52\x1e\xa5\x63\x8e\xa5\x83\x2c\xef\x6a\x7f\x92\x97\xe3\x47\xe0\xc4\x7e\x15\x94\x7a\x2d\xef\x2d\xe0\x8d\x09\x6a\x71\xba\xe1\xc1\x5d\x61\x39\x32\x72\xd5\x42\x3a\x3c\x02\x29\xbd\x96\x6e\x06\x39\x6d\x5a\x36\xc7\x18\x91\xaf\x59\x0c\x4d\x6e\xd2\x77\x49\x86\x40\xf6\x39\x68\xa6\xc6\xe9\xf4\x8f\x7e\xea\xde\x5e\xd1\x5a\xe8\x13\xb0\x7b\xc6\x2a\x77\x93\x5d\xfc\xee\xe2\xe7\x9e\xc1\x6f\xbb\x25\x5a\x56\x62\xea\x5e\x65\xc4\x48\xec\xc4\x06\xac\xa9\x20\x2d\xfc\x50\x44\x0c\xcd\xc9\xd2\xf1\x2a\x8d\x48\x74\x8f\xaa\xe2\x0c\x55\xb4\xdd\x69\x14\xc4\xe3\xd3\x2d\xc8\xe0\xe3\x02\xea\x6f\x36\x3e\xad\xfc\xf0\x7e\x3a\x59\x4e\x7c\x78\x1f\xd5\xb6\x2a\xd2\x43\x7e\x4f\x89\x4b\xc1\x02\xd9\x95\xbc\xca\x2c\x55\xb8\xd6\xcd\x6c\x50\x2e\x62\x83\x11\x2d\x47\x47\x39\x2e\x37\x0b\x8a\xc6\xf5\x8f\x1b\x42\x80\x73\x58\xcc\xb8\x37\xe3\x8a\x08\xcf\x7f\x14\xac\x93\x92\xfa\x8f\x82\x0d\xca\x79\x1f\x24\xa6\x58\x56\x67\xa1\x49\x60\xd1\x2c\xea\x80\x75\x77\x79\xf0\x15\x68\x2e\x44\x14\x9a\x2f\x5d\x3d\xb8\x01\x47\x9b\x73\xd2\x07\x81\x2b\x5e\xea\xfa\x2a\xd8\x17\x3d\x45\xbc\xa8\x90\x1c\x83\xbb\x6a\xc5\x3d\x22\x12\xc9\xb8\xa2\xde\x1b\x8f\xdc\x53\x23\xc1\x1b\xfc\x4d\xd2\x4e\x1a\xd2\x53\x8c\x5a\x18\xb1\x77\xd1\x93\x03\x53\x55\x7c\xc7\x20\x1e\x53\xd7\x67\x70\xa8\x6f\x00\x0b\xb0\x16\x1f\x31\xe3\x4d\xd8\xc8\x1c\xea\x46\x64\xb4\xf9\xc5\x6e\xe6\x2f\x65\x37\x43\xd8\x5c\x65\x02\xd6\xfe\x62\x35\xf3\xc5\x6a\xc6\xbf\x5a\x97\xb7\x6f\x99\x2f\x5f\xf4\x9c\x96\x33\x4d\x66\x97\xcb\xbd\x79\x45\x4a\xd6\xd8\x6a\x2e\x26\x19\x62\xa5\x6a\x2c\x38\x3f\x99\x59\xcf\x69\xa0\x0f\x59\xa3\x75\x27\x57\xb5\x97\xbb\x9c\x3e\xe5\x9f\xa5\xeb\xf8\x51\xcc\x7f\xcc\x7d\xbd\xbc\xd1\x8a\x67\x75\x12\x14\xcf\x7c\x46\xbf\x89\x78\x30\xe8\xd5\x2a\x9e\x2d\x6f\x29\x24\xf4\x03\x2b\xcd\x2b\xc9\x69\xa0\xbe\x54\xab\xf8\xd7\x31\xcc\x92\x64\x82\x22\x1f\xd7\x3b\xdd\xf2\x54\x0b\x39\x75\xbe\x15\x55\xfe\xe3\xdc\x65\x6c\x91\x18\xb7\x64\x51\xad\xb6\x85\x0a\x6d\x11\x5d\x36\x2d\x3c\xbf\x98\x15\x0f\xec\xf6\x4a\xc5\x88\xc7\xec\xc7\x39\x6c\x78\xa4\xf4\x67\x64\xc2\x73\xd1\xa7\xfb\x0f\xb3\x95\x69\xd6\x28\x57\xc9\xa7\xed\x41\xc7\x73\xbf\x60\x20\x2a\x4c\x31\x09\xff\x0e\xba\xe6\x17\xc7\x8d\xe7\xd0\xf9\x8e\x60\xd1\x7f\x3b\x3d\xf0\x25\x0e\xf7\x67\xaf\x43\x2c\x14\x93\xa7\x16\x2b\xb4\x91\xa7\x79\xda\xa8\x4b\x1c\xd5\x11\x8e\xe8\x12\x5b\x46\x93\xa8\x90\xf9\x86\xc2\xef\x5f\x34\x8b\xbf\x68\x16\x7f\x4e\x9a\xc5\x72\x89\x9e\x43\xb1\x18\x98\xd2\xad\xcd\x6f\x36\x3e\xb6\x92\xf1\x27\xd4\x2b\xfe\xe6\xfa\x17\x49\xc9\x5f\x46\x52\x72\x41\x89\xc5\x0a\xba\x7a\x4f\xc7\xe0\x31\x0b\x96\x8f\xc6\x4d\x01\xbb\xa7\x53\x43\xac\xad\xaf\x1f\xe6\xd3\xa3\xd9\xbe\xa1\x26\x8e\xd7\x8f\xf7\x8b\x72\x5a\xf4\xdf\xae\x0f\x6e\xac\xef\x0f\x8b\xfd\xf5\xe3\xb4\x34\x88\x79\xbd\x9c\xf4\xd7\xcb\x77\x87\xeb\xfb\x93\x59\x79\xd4\xfb\x9f\x72\xc5\x2a\xca\x80\x1b\xf9\x87\x37\x92\x27\x79\x3f\x1b\x95\x19\x41\x07\x3c\x33\xbc\x3b\x7c\x83\x85\xad\x05\xa6\x41\x11\x80\xaa\x46\xe5\xda\x24\x2b\xf3\xdf\x51\x9d\x1a\xf0\x5a\x76\xa2\x12\xca\xb0\xc4\x49\x58\x62\x04\x29\xa3\x93\x32\xd3\x69\xe8\xa9\x20\x2b\xbd\x96\xb2\x6a\xb9\xf2\x24\x28\xb7\x22\xbb\xe9\x0d\xf9\x25\x66\xc2\x36\xec\xee\xae\xc2\xb3\xda\x2a\xbc\xa3\xad\xc2\x03\xd8\xea\x09\xfc\x35\xa2\xbf\x29\x95\xfe\x3e\x59\xdd\xeb\x26\xbb\x54\x90\x7f\x8f\xa8\x12\xfc\xde\xdb\xa3\x8d\xa0\x25\x4b\x07\x10\xe2\x11\xb0\x79\x52\x92\x3f\x2f\x62\x03\xa0\xef\x25\x79\x00\x28\xea\x33\x00\xe1\xde\x0b\x61\x5e\x13\xa3\x27\xc8\x89\xe8\xd4\xd2\x12\x4d\x4c\xdb\xb1\xc5\xe1\xd7\xb1\x2b\xa7\xf2\xca\xb6\xbb\xd1\x4d\x38\x6d\x1e\x49\xe3\x72\x0f\x91\x1b\xdc\xf2\xf5\x54\xa4\x42\x25\x73\x45\x29\xcb\x7e\x88\x7a\xb0\x10\x42\x96\x50\x9b\xab\x04\xdd\xc9\x87\x18\x47\x64\xf4\xa6\xa6\x98\x0a\x4a\x21\x4e\x31\x0c\x2c\xb0\x78\x81\xaf\x6a\x0e\x86\x88\xd4\x5b\xb7\x92\xcd\xe4\x8f\x44\xe7\xd0\x4c\xf6\xac\xc8\xfc\xd2\x4d\x31\x0c\xd4\x62\x84\xb5\x5b\x08\x73\xeb\x77\x40\x33\x6e\x86\x01\xc0\x46\x65\x3e\x40\xfd\x38\x69\x8a\x4b\x67\x12\xa7\x14\x03\x7b\x73\x3c\x79\x5a\x0b\xf2\xc1\x68\xba\x07\x97\x7e\x73\x83\xba\x06\x93\xf4\xc4\x8f\x7a\xde\x05\xf7\x6f\x29\x5c\x39\x39\xc4\xfd\xc4\xfd\x31\xad\xe2\x7b\xea\x8c\xc3\x0d\x98\xf3\x31\xc3\xe8\xe5\xa6\xf5\x29\xa8\xad\xa9\x1e\x30\x54\x28\x46\x66\x47\x54\xb5\x42\x6a\x4e\x2e\x0a\x10\x2f\xe5\xd5\xdb\x9e\xa3\x46\x4a\xf5\x2c\x30\x78\x3f\x5d\x4d\x4a\xd0\x11\x92\xb8\xd6\xb6\xad\xe4\x6f\xf0\x65\xef\xb0\x55\xdc\x5b\x9a\x4d\xc5\xa0\x35\x34\xd1\x6d\x4f\xbd\x91\xd4\x18\x15\xfd\xa4\x16\x43\xb8\xa6\x97\x5a\x21\xcf\x1b\xe5\xdd\xa8\x92\x5e\x64\x39\xe9\x84\x59\x56\x2b\xd2\xe2\x7c\xc9\x16\xe7\x41\x8b\x56\x7c\xd6\x7f\x7b\x48\xb1\xea\x6a\x14\x26\xea\x1f\xca\xa4\xa6\xf8\xf5\x60\xed\x84\x77\x79\xc9\x5e\xac\x4d\x29\xfc\x40\x9b\x9e\x3e\xde\x63\xa8\xac\x50\x94\xe5\x51\x9a\x4f\x44\x41\x07\xf8\x1b\x9a\xd9\x5d\xfe\x01\xca\x48\x20\x55\xd3\xcf\x6e\x61\x91\xcd\x3d\x70\x7d\x50\x2d\x0e\x5c\x94\x14\x9d\x57\xb3\xad\x90\x2d\x28\x83\xcd\xe9\xf2\x15\x6e\x58\x3f\xc8\x29\x87\xa1\x6f\x54\xd2\x7d\xbb\x26\x4e\xc4\xe5\x34\x62\xe1\x30\x67\xc7\x65\x32\xcc\xdf\x66\xee\x08\x9a\xe3\x0e\x81\x01\x31\x3a\x29\x04\xca\xb3\x21\x8c\x71\x1f\xcb\x84\xe3\x18\x97\xa0\x1b\x35\xcd\x8f\xb3\x1e\x86\x0a\x04\xf7\x9e\x06\xc5\x0f\xcc\xa9\xc5\xd0\x8c\x3d\xd9\x50\x3e\xc5\x11\x4d\xc5\xba\xd3\x6a\x6b\x2c\xdc\x7e\x6f\xff\xa9\x9a\x75\x77\xc4\x9b\x6f\x77\x19\x8e\x87\xd5\xc0\x3a\xf5\x38\x0d\xbe\xca\xe4\x06\x94\x0d\x8e\x94\xc0\x4d\x69\xa8\x29\x9b\x19\xdf\xab\x05\x9b\x45\x6d\x69\xb4\xc0\x4b\x28\x58\x27\xf1\x9c\x17\x4b\x6a\x28\x36\x5e\xec\x16\x09\xc7\xe2\xb4\xb7\x88\x6f\x44\xb9\xb1\x15\x1f\xa8\x75\xa5\x7e\x50\x31\xcf\x19\x23\x07\xab\x1b\x21\x10\x77\xb3\x3d\xa7\x30\xa5\x14\xe2\x7c\x23\x89\x37\x91\xc5\xfc\x6a\x3d\xfb\xfb\x7a\x6f\x9a\x95\x53\x33\x19\xa5\xd6\xa9\xcb\xce\x6d\xd9\x7f\x96\x7e\xd9\xce\xaa\x2f\x74\xa0\xc5\x0e\x62\x81\x5a\xdd\xf1\x2b\x6f\x2a\xdb\x40\xc8\x7c\x22\x41\x43\xf9\x36\xa0\x57\x6c\x79\x06\x8f\xeb\xa8\x79\xa0\x09\x30\xb6\xbe\x9b\x9d\xec\xb9\xb9\x80\x8a\xf4\x8d\x44\x51\x2d\x88\x1c\xd6\xff\xb9\x3b\x2a\xf7\x9a\x0a\x31\x3c\xae\x7e\xb3\x1a\x70\xff\x6f\x6a\xe0\xac\x06\xf7\x11\xcb\x0e\x5a\x65\x44\x7b\xda\x06\x30\x2c\x64\x1b\xba\x26\x1d\x33\xee\x3e\xe1\x29\x57\x54\xdb\x3e\xb6\x20\x4d\x61\x86\x40\xa6\xa6\x72\x02\xf1\x9a\xca\x59\x2c\x69\xa3\x55\xb2\x47\x40\xce\x80\x5b\xb7\x31\x85\xa3\x44\x0f\xdd\xc0\xc2\x18\xcc\x68\x91\x87\x05\x2d\xeb\x54\xf9\x8d\x4d\x08\x4a\x90\x9e\x85\x57\x06\x92\x18\xa0\xb8\xb0\xbb\xb8\x38\x81\xe9\x12\xfa\x90\x63\x8e\x5f\x9f\x56\x46\x56\x41\xd0\x01\xf8\xd5\x41\x9f\xde\xab\x37\x55\x41\x94\x6e\x56\xc9\xa4\x56\x94\xca\x9f\xbd\xa3\x1e\x40\x40\xa2\xc1\x6c\x3c\xcc\xfb\x18\x5f\xc5\x6c\xab\x16\x86\x18\xc6\xf5\xb4\x8b\x91\x51\x40\x13\x18\xc8\xd7\x1e\x59\xe1\xe1\x52\xbf\xb0\x41\x76\x3d\x1b\x3c\x2f\x4f\xf0\x25\xca\x28\xde\x1d\x26\x91\xe0\x47\xf0\x21\x8a\x8b\xf7\xe7\x3b\xe9\x21\xac\x67\x7b\xd5\x94\x5e\x85\x47\x30\x21\x86\x94\x16\x6e\xe5\xaa\x03\x7f\x1c\xb4\x5d\xaf\xfe\xf1\x9f\x18\xfb\xc5\x53\xdf\xa5\x00\x54\xd5\x42\x6d\xc2\x3d\x58\xa0\x07\x52\x7a\xeb\xfc\xbe\x4b\xb5\x7a\x73\x95\xf8\xda\x15\x4e\x6e\x73\xfe\x71\x3a\x9d\xe4\xa7\x3b\x82\x7f\x71\x20\x66\x3a\xaf\x30\xb6\xea\x83\x9d\xa7\xed\x0e\x79\x50\x2a\x59\x5f\x10\xea\xdb\x69\xec\x4a\xc7\x6b\xd5\xd3\x65\x23\x52\xd0\x28\x62\x25\x40\x43\x32\x54\x58\xa7\xeb\xac\x2f\xd3\x35\x43\xb9\xcf\xe1\x51\x1e\xe0\x1c\x0c\xe3\xe2\x66\xed\x06\x92\xa9\x88\x4e\x50\x1d\x7b\x37\xbf\x71\xc9\x30\x87\xbd\xff\xd7\x8d\x33\x53\xb1\x76\xb0\x81\x29\xfa\xf8\x77\xf5\xc9\xe7\x7f\xbc\xfa\x9e\xbd\x8d\xc5\xab\x36\x0f\xcd\xbe\x76\x45\x49\x2e\x0d\x76\xd1\x02\x02\x7b\x11\x87\xfe\x2b\x8b\x4d\x68\xaa\xe4\x93\x83\x44\x02\x01\xab\xbb\x1b\x42\xbc\x32\xf5\xf9\x3d\xf3\xa9\x8a\xc5\x94\x0e\xdd\x00\x96\x46\xbd\x8d\x8d\xd8\x16\x8f\x51\x84\x65\x6d\x8e\x44\x95\xbf\xcb\x49\xf9\xa8\x2d\x55\x19\x78\xac\x73\xb6\x80\xdf\x4a\x9c\x20\xe2\x18\xde\x28\xa1\xe1\xaf\xb0\xaf\xbd\xe4\xac\x8a\x28\x80\xbf\xc4\x38\x21\x29\x68\xcf\x1b\x56\x76\x9a\xa5\x03\x60\x44\x49\xb5\xb2\xf4\x37\xa9\xaa\x49\x5c\xc9\x6c\xde\x1c\x5a\xda\x63\x42\xe8\x18\x33\x6d\x15\xbc\xf9\xaf\x3a\xcd\xef\xc5\x7b\xc0\x0f\x66\x39\x8c\xb9\x9f\xfd\x60\xf8\xe0\xfb\xc5\x64\x80\xaa\x08\xb2\x32\x8d\x7b\x40\x4d\xa3\xe6\xf1\x0b\x77\x56\xaa\xed\xc5\xa0\x94\x89\x9c\x9a\x15\xb0\x24\x10\x90\x0a\x93\x73\xae\x03\x4b\xe2\x5c\x2e\x25\x3c\xcc\xd1\x0d\x5b\xae\x87\x13\xc4\xe6\x7b\x23\x21\x32\x1c\x4a\xfe\xdf\x71\x00\xa4\x27\x7f\x33\x3b\x51\x41\x53\xc3\xb9\xe8\x26\x81\x50\x8e\x88\xb8\x8e\x5a\x71\xda\x59\x7f\xcd\x29\xed\x93\xac\x3a\x72\x9f\x0f\x0b\x88\x82\x3b\xf4\xe5\x48\x87\x85\xdc\xe0\x70\x68\xf3\x29\x70\xa5\xc7\xe6\x1f\xcd\xb0\xb2\x6c\x15\x2c\x15\x8e\xc7\xf6\x21\x01\xca\x3f\xbc\xf1\x81\xe8\x47\xb3\xa4\x1a\x60\x6f\x83\xf0\x57\xd9\xbb\x42\xfb\x77\xe2\xe0\x62\x4d\x5f\x6b\xf7\x2b\x5a\x0d\x77\xb0\x69\xeb\xae\xc4\xce\xd1\x2a\x9b\xc1\xf9\x96\xb2\xcd\x90\x12\xed\xbe\xb9\xe7\xb3\x15\xcf\x0c\x3e\xb6\x3c\x59\xb8\x3c\xb7\xe2\xa7\x66\xf1\xf2\xd4\x0d\x72\x63\xc1\x20\x63\xcb\x73\x72\xae\xe5\x89\x73\xf4\x8b\x37\xe6\x4c\x09\xef\xde\xc4\x55\xab\x75\x72\xd3\x95\xe2\x01\xa0\xc2\xa7\x0e\xa1\x7a\xb2\x4c\x75\x6a\xb7\x63\x7b\xe4\xb7\x80\x57\x53\x50\x9f\x31\xed\x76\x64\x0a\xc0\xd7\x54\x26\xf0\xd3\x78\xc1\xf0\xab\x57\x81\x15\xec\x29\x9c\x51\x8c\x0c\xc7\x67\xf1\x88\xc8\x64\x9d\xaa\x0e\xa7\xe8\x01\x70\x99\xdf\xc5\xbd\xab\xc3\x53\xe8\x2d\x94\xe4\x8d\x7f\xfc\x51\x65\x57\xb4\x26\x4c\x45\xf2\x28\x99\x6f\x24\xc2\xaa\x03\x02\xab\x66\xf2\x48\x24\x51\x6f\x3c\xe0\xb0\xed\x86\xf9\x73\x3f\xdf\x83\x9c\x4a\x2b\x94\x1c\xb4\x15\x96\x9d\xfb\x65\xa5\xe1\x0d\xb3\x16\x9b\x5d\xd0\xc8\x48\xe6\xe6\xdf\xa9\x08\xf6\x1e\xa3\x37\x54\x12\xbe\x43\xec\x19\xc1\xae\x53\xf2\x69\xb4\x56\x8e\xd3\x7e\x26\x22\xf4\xab\xe1\x83\xad\x3a\xc8\x56\xeb\x10\x3f\xf4\x20\xac\xe8\xe4\x14\x74\x89\xbc\x2c\x3c\x34\xa7\x9b\x95\x64\xb2\xa7\x0a\x4e\xa3\x57\xbf\x52\xd3\xd6\xa1\x01\xb0\x9b\xd7\x4e\x42\x95\xc4\xeb\xeb\xe9\x46\x47\xaa\xd9\xa4\xcd\x8e\xae\xb8\x69\xd0\x91\x29\x95\xa0\xe7\x5b\x58\x35\xac\xbf\xc9\xb5\xa6\x3c\x2e\x39\xcb\x58\x67\xae\xa7\x3e\x8f\x4e\x1d\xd5\xa8\xe6\x95\xa9\xcf\x37\x2b\xc9\xf1\xa9\xeb\xfa\x95\x9a\xfe\xd4\xe7\x76\xea\x54\x49\xe6\x39\x87\xa9\x53\x35\x9b\xe4\x4d\x7d\x0e\x53\x9f\xf3\xd4\x11\x50\xb0\xfe\x26\xd7\xaa\x4c\x5d\xbc\x28\x80\x0b\x83\x39\x18\xba\xed\x9e\x62\x25\x78\xed\x44\x58\x33\x77\x05\x78\x17\x86\x2c\x82\x3f\xf8\x9c\x43\xf1\x5d\x82\x43\xc7\x26\x41\x5c\x23\x3c\x95\x00\x88\x0e\xf0\x14\x34\x22\x74\x96\x02\x89\x02\x6d\xb8\x3b\xbf\x3b\x60\xf8\x5d\xd6\x82\xf7\x85\x76\x6f\x43\x41\xcb\x26\x33\xe0\x57\xc2\xb3\x26\x63\xb4\xd5\x43\x18\xd2\xc0\x63\xa1\x66\x69\x98\xc1\x82\x1b\xe0\xe6\xc1\x41\x30\xe0\x20\x53\xe4\xaa\x06\xe2\x8e\x42\x22\x76\x48\x10\x21\xa9\x5f\x8c\xe7\x6b\xc5\x68\xed\x64\x92\x4f\x33\xc2\xc1\x1e\xf4\xcd\xdd\x52\xcc\x2b\x4b\x71\x2a\xd0\xb0\x81\x04\x04\x81\xc1\xa6\x94\x08\x51\x89\xde\x9e\x28\x4c\x69\x60\xb2\x50\xb4\x34\x0c\x61\x41\x5c\x8a\xb9\xb7\x14\xf3\x4d\x9d\x06\x4b\xe1\xf0\xa5\x1d\x52\x7c\x29\x9a\xa8\x5e\xfe\xd1\x4d\xec\xa3\xf4\x5c\x52\x82\x9b\xda\xfb\xec\x26\xc1\x9b\xb4\xbf\x4a\x8a\x48\x46\x61\xa8\x77\xff\xb0\x74\x54\x3d\x42\x5f\x8d\xbc\xf4\x99\x83\x10\xa5\x23\x92\xdb\x75\xfc\x05\x04\xb6\xaa\x3e\x0c\x06\x0d\xcd\xeb\x1a\xf2\xd0\xc5\x42\xa9\x19\x08\xda\xe2\xd2\xb2\x2f\xd6\xb5\x97\x6e\x5d\x8b\x2f\xeb\x56\x13\xad\xde\x99\x65\x8d\xca\x58\x8d\x6e\xd7\x8d\x8f\x13\xb9\xec\x1c\x9a\xea\x4e\x4d\x3d\x30\xfa\x39\x97\x49\xed\x79\x6c\x75\x45\xba\x5f\x31\x98\x05\x8b\x73\x12\x72\xa3\xf2\x61\xbd\xfb\xbb\x2b\x24\xda\x6e\x2c\x42\xea\x89\x0d\x05\x26\x4d\xd3\x5b\x21\xef\xc5\x97\x6a\x8e\x73\x71\x43\xd7\x05\x4a\xe7\x1c\xa7\x50\xa9\x9c\x73\xca\x52\x0f\x3b\x20\xf3\xf6\xdc\x08\x60\x42\xa0\xf0\xec\xab\x43\xf3\xab\xc9\x32\x5e\x24\xea\x9f\x09\x95\x30\xd6\xbd\x07\x3a\x31\x33\xbd\xfb\xc9\xfb\x8c\xcc\x68\x45\xbf\x2a\xd4\x9c\x54\xa5\x33\x1a\x9c\xb6\xaf\x3f\xad\x01\x7c\xcc\xe2\xf1\xfd\x92\xc6\x75\x0d\x26\xe1\x64\xfb\x5d\xb5\x09\x47\x7b\xbc\x8a\x49\xf8\x97\x63\xbc\xc8\x2e\x71\x91\x31\xe2\x32\x16\x88\x97\xa0\xff\x46\x70\xf0\x3e\x69\x70\x6d\x9b\x2c\xef\xd6\x96\x0f\x8e\x6c\xd2\x7b\x8a\xe4\x6b\x28\x34\x59\x73\xf3\x93\xd6\xd6\xfc\xe0\x35\xdc\x10\x5d\x99\x26\x4d\x3c\x4c\xd0\xcb\xd1\x18\x63\x27\xee\xdf\xb6\x72\x30\x1a\x2d\xc5\x6f\x5e\x54\xff\x19\x23\xa9\x0e\x76\x0a\xd4\x1b\x4f\xb4\xa3\x39\x73\x54\xba\x49\x2e\x2a\xc9\xbe\xb3\x5f\x93\x87\x3a\xc7\xbc\x37\xe6\x13\x94\x8c\xad\x2c\xe6\xd5\xfc\x78\xbf\x18\xf6\x0c\x59\x3b\x49\x21\x0c\x89\x39\xd5\xa4\xd2\x6c\x2b\x62\xdf\xe6\x03\x68\x62\xad\x0e\xfd\xc6\xd6\x01\x8d\xe9\xc9\x6e\xd0\xd2\x1e\xb8\x5f\x79\x53\x4e\xb3\xf1\x76\x72\xb5\x8d\x3f\x00\xa3\x4b\x76\x0f\x34\xda\x0c\x89\xd2\x1b\x18\xd4\xb0\x0d\xfd\x40\x1f\xbd\xb1\xa1\x4a\xa8\x30\x99\x11\x75\xb6\x29\xd0\x2a\x50\x9c\x58\x80\x69\x34\x70\x0d\x66\x26\xbc\x6f\xd6\xf6\xed\xb6\x53\x98\x7e\xa3\xa7\x67\x80\xe4\x68\x52\x9c\x60\xd4\x6e\x00\xed\x47\x93\x49\x31\x69\xaf\x4a\xe0\xd7\x74\x3a\x05\xb2\x19\x05\x0f\x99\x59\xea\x59\xdf\x34\x91\x25\x23\x43\xe6\xe3\x20\x21\x20\x70\x3e\xa2\x97\x0a\x83\x03\x41\x2f\xfb\x52\xf0\xa7\x6f\x27\x5d\x45\xa0\xfb\xe9\x64\x81\x2b\xdf\x4b\x38\x9d\xba\x93\x8d\xde\xcd\x95\x4b\xd2\x47\x85\x90\xca\x34\xbf\x4f\xe4\xae\x5b\x75\x18\x71\xd8\xed\x72\x35\x09\xae\xea\x8c\x5d\x7b\x9e\xd1\x56\x4c\x44\xe7\xc5\xe7\xe0\x02\xd5\xf8\x1c\x7e\x0b\xbe\x1c\x6f\x5e\x6d\x21\x08\xde\x81\x32\x2f\x4f\xd3\x0c\x4f\x9a\x21\x64\xec\xa3\x05\x8c\xfe\x17\xb2\x3f\x25\xa1\xa6\x2d\x72\x1d\x65\x72\x1a\x49\xb4\x21\xb9\x9b\x5c\xe7\x82\xda\x14\x0d\xca\x42\x1d\x11\x4e\x70\x9e\x1e\x21\xe5\x6f\x46\x1f\xc8\x21\xef\x06\x0a\x0c\x48\xeb\x42\xad\xce\x9e\x3f\xaa\x1b\x35\xc3\xba\xd1\x38\xae\x1b\x8b\x06\x76\xc3\x8e\xcc\xae\xdb\x3c\xb6\x6e\x5f\x7b\x0b\xf7\x3a\xba\x70\x5f\xd7\x0c\xf1\xeb\x70\x88\x73\x3d\xc4\xaf\x83\x21\xce\xc3\x21\x7e\xdd\xb4\x78\x37\x51\xc4\xc0\x8b\x37\xaf\x5b\xbc\x9b\x35\x23\xbb\xd9\x38\xb2\x9b\x8b\x46\x76\xd3\x2d\x9e\x3a\x29\xbf\xf0\x0d\xe8\x9f\x14\x81\xb5\x8b\xfa\xc8\xa9\xb3\x0e\x5d\xa9\x35\xc6\xe4\xfd\xe4\xd0\xe2\x2e\x18\x98\xc9\xc4\x78\x60\xf0\x50\x83\xae\x21\x09\x1b\x06\x2e\x8e\xdd\x66\x3f\xc1\x08\x7a\xee\xac\xf8\x6f\x10\x0d\xad\xf7\xf0\x61\x70\xc4\xd7\xcc\xaa\xac\x47\x6d\x47\x3b\xf9\x71\x16\xe9\x26\x5e\xf8\xf9\xc4\x60\xdd\x74\xe8\x95\xd7\xbb\xa0\x47\x1d\xee\x85\x3f\xa3\xcb\xde\x91\x0f\xb3\x8e\x5d\xd1\xba\xb4\xe8\x5e\xe0\x06\x6b\xaf\x33\x41\xe2\x4c\xa4\xfa\xc5\xa8\x6f\x5d\xec\xee\xee\x75\x2f\xc3\x13\x41\xe0\x82\xe0\xd4\x3a\xf6\x61\xa5\xc0\x8e\x7a\x50\xe7\xa3\x62\x29\x3d\x0a\xb5\xd8\xee\x88\xdf\x00\x9e\x43\x87\xe5\x28\x60\x51\xe2\x66\xaa\x82\xb7\xb1\x7f\x64\xd3\x0e\x3c\xe4\x42\xb1\x32\x74\x3f\xe0\x62\x9d\x79\x18\x8c\x7c\xc2\xa2\xa7\x6d\xcd\xd4\xee\x96\x11\x64\xaa\x60\xc3\x83\x9d\x10\x38\x02\xc0\xfa\x38\xd0\xe1\xe8\x06\x57\xc2\xa5\x5d\x12\x0c\x55\x36\xa8\xa0\xa9\xb9\x1d\x0a\x0e\x6d\xb3\x7e\xb1\x0b\xd5\xc8\x3b\xfa\x12\x34\x9b\xc0\x8d\x44\x19\xee\x6d\x57\x4d\x30\xba\x33\x1b\xfe\x86\xb8\x93\x1f\xee\x86\xc6\x09\xff\x1e\x5b\x81\x8a\xf4\x04\xb8\x97\xb4\x0f\xf1\x93\xd5\xbc\xe2\xaf\xa3\xab\xfd\xfa\x1c\x2b\x7d\x9e\x28\xa5\xcb\x5e\x52\xf3\x0f\xbc\xa4\x5e\x9f\xf3\xf6\x78\xdd\x7c\x7b\xc4\x17\xc9\xef\xea\xa2\x4b\x15\xf7\xcf\xf0\x21\x77\x4a\x93\x33\x85\xcf\xeb\x56\xd1\x5e\x61\x62\xb7\x8b\x1b\xe6\x2e\x5c\x0a\xe6\x80\x00\x84\x73\x2a\xde\x06\xee\x6b\x73\x6f\xef\xe2\x37\x92\x56\x68\x4e\x36\x2e\x7a\x25\xcd\xcf\x71\x25\xcd\x9b\xaf\xa4\x38\xc4\x05\xd0\x6a\x41\xee\x83\xe1\xa1\xe1\x86\x58\xb4\x42\x91\x49\x6f\x2c\x33\xe3\x46\xd1\x8f\xe2\xe9\x1b\x65\x3f\xdf\x5c\x50\xf6\x13\x31\xc1\x7e\xff\x61\x9c\xba\x19\x70\x1f\xe2\x9d\x66\x8f\x61\xa1\x3e\x11\xb7\x1e\x74\x1a\xe1\xd8\xfd\x12\x1a\x9e\x82\xba\x01\xe7\x6e\x1f\x1c\x62\xef\x0d\xf2\x52\x11\x79\xa8\xb0\x4f\x11\xfe\x4b\x84\x1d\xb1\x0f\x90\xdc\xcb\x9a\x96\xeb\xdb\x0f\x92\x44\x6e\xfb\x55\xe5\x82\xa5\x21\xac\x79\xaf\x04\xf6\x4b\x02\x48\xd7\xc0\x58\xb8\xf9\x36\x82\xd6\x37\xdf\x7e\x71\xa5\xf0\x97\x71\xa5\x00\xb9\x10\xcb\xcf\xcf\xc5\xe8\x7e\xff\x3e\x6e\x27\x1b\x3c\x4e\x46\x9d\x4d\xfe\x1b\xbb\x8e\xa4\x60\xaa\x97\xeb\x0d\xf2\xcf\x7d\xb6\xad\xf7\xbf\xc8\xf1\x86\xc5\xc5\x97\xf9\x92\x1c\x72\x04\xff\xb3\xdf\xa7\x4a\xf4\xcb\x01\x85\xda\x4f\xc7\x61\x49\x4e\xf6\xcb\x3e\x4c\xcb\xa3\x94\x5f\x42\xbc\xd2\x36\xc3\x3e\x28\x7f\x64\x2f\x66\x1f\xc5\x47\x23\x2c\x62\x93\x93\x46\xdf\xf3\x62\xc3\xa3\x38\x60\x18\x31\xf8\x5c\xde\xf1\xa2\x36\xca\xa3\xb8\x06\x98\x3c\xa0\xf0\xc0\x6d\x8f\x68\xee\x88\x3d\x33\xf9\xfc\x6f\x76\x90\xa8\xf6\x7e\x2b\x61\xee\xc9\x03\x12\x4f\xe2\x06\xca\x2f\x2e\xd3\x6f\x2f\xd9\xd2\x79\xba\x75\x86\x97\xa0\x7d\x0b\x5c\xf1\x1e\x38\xbb\xa6\x0f\xce\xd5\xbd\x58\x38\x0b\xfa\x51\x80\x19\xef\xc9\x16\xa8\xe9\xcb\xe6\xf3\x9a\x23\xca\xf1\x56\xdc\x33\xd5\x7e\x54\xe7\x5c\xb2\xde\xb7\x64\x68\x80\x3e\xcc\xc7\x00\x26\x66\xaf\x67\x93\x61\xfb\x6f\xb0\xc5\x0f\x4c\x1a\xe8\x2b\x68\x2e\x87\x54\x78\xaf\xad\x24\x49\xb2\x73\x94\x25\xb7\xc0\x4a\xed\x4e\x62\xa6\x50\x9c\x80\x87\x0e\xb0\xb1\x27\x4d\xae\x7e\x6a\x48\x8e\x13\xf3\x5f\x4a\xaa\x94\xe5\x91\x29\x01\x8a\x96\xec\x30\x2b\x19\x15\x86\xf6\x99\xc2\x79\x39\xc1\x80\x57\xc5\x08\xb3\xfb\x78\xbb\xc2\x2f\xd4\xd1\x36\x8d\xf6\xa0\xb3\x67\xe0\xd3\x03\xde\xe6\xf2\x03\x44\x68\xe2\xeb\x63\x3f\x43\xaf\x20\x58\xe6\xda\xfa\x8a\x67\xba\x47\x47\x81\x10\xe3\x4e\xc1\x01\x21\x1a\x4d\xa2\x17\xa8\x88\x90\x05\xd8\x79\x9d\x6f\x46\x7b\x3c\xc4\xee\x06\xc0\xa8\x4c\xcc\x3c\x87\xf3\x57\xe0\x18\x07\x08\xcd\x9d\xa7\x4f\x60\x43\xde\xbc\x21\x57\x63\xab\xb7\x06\xd9\x41\x79\xe7\x96\x6c\x50\x92\x0f\x6e\xff\xba\x2a\xdb\xf3\xeb\xea\x1d\x8c\x3b\x03\x13\x3e\x93\xa8\x22\x88\x37\xea\xbb\x5e\x6a\xb2\xb5\xd1\x3c\xec\xf7\x12\x26\xc8\x75\x6e\xdc\xdf\x39\xcb\x76\xdf\x93\xfb\xbb\xa9\xf6\xe5\x7e\xe5\x2c\x06\xc4\x8d\xed\xb0\x43\xf7\x77\x53\x69\x81\x60\x77\xa5\xe2\xfb\x14\x0e\xf3\x39\x54\xca\x6c\xf1\x0f\xf7\x7e\x1a\x38\x3e\x5d\xca\xd1\x69\x40\x81\xa8\xb0\xf3\x1f\x31\xb8\xa9\xd7\xcb\x2a\x89\x23\xd8\x67\x09\xe8\xc3\x80\x4b\x92\x7c\xd2\x97\xf8\xc4\x98\xf6\x00\xf0\x7e\xd5\xbd\x11\xe2\x0b\x40\x17\x7d\xd0\xf8\x24\x64\xc1\x56\x52\x25\xba\xe3\x10\x5f\x3a\x48\x5e\xf0\x2d\x0c\x8c\x02\xa4\x21\x61\xd1\x1f\x16\x65\x56\x22\x22\x71\xa8\x81\xdc\x3a\xc0\xd1\x7f\x95\x8f\xfa\xe8\xb8\xc7\xcc\xaa\x4c\x0c\x08\x26\x68\xf9\xc1\x6e\x7b\xa0\x06\x58\xec\x26\x06\x0e\x27\x66\x4f\xa5\xb7\x07\x16\xd5\x08\x4e\xc2\xea\x80\xa9\xd8\x53\x10\x62\x26\xe8\xe0\x07\x33\x98\x91\x19\xf5\xe3\x64\x80\x66\x61\x82\xd5\x60\x18\x88\x8e\x8e\xb3\xe9\x51\x81\x68\x08\xb0\xd0\x52\x7e\x65\xc1\x61\x66\xe0\x5a\xf6\x02\x02\xe2\xb8\x2c\xee\x3c\x02\xce\xc5\xd4\xcd\x05\x1d\x99\x62\x55\x8c\xcf\x68\x9d\xb1\xb1\x13\x67\x36\x05\x90\xc9\xef\x6e\x28\x81\x94\x5f\x61\x1e\xaf\xb0\xa9\xa4\x39\xa7\xf7\xf3\xd2\xec\x2e\x16\x1f\xdc\xe8\xed\xf3\xd7\x32\x42\x68\x64\xc2\xfd\xf5\xb9\x37\xfd\xa5\x81\xe4\x52\x2f\xcb\xf9\x00\xed\x7a\xa4\x73\x9f\x1e\xea\x7a\x13\x57\x6f\xcd\x48\x5f\xbd\x64\x12\x1b\x9b\x30\x04\x82\x2f\x7f\x64\xf5\x96\xbb\x98\xbd\x96\x40\xb4\x42\xf3\x6b\x5b\x5a\xc0\xc2\xd2\xc2\xa9\xdf\xed\xae\x6b\x7e\x2f\xec\x14\x4d\xcf\x5d\x9f\x1b\xdc\xc1\x96\x74\xe3\x77\xc0\xa5\xa3\xed\x43\x5e\xa5\xf9\x24\xf0\x27\x80\xa2\x71\x34\x67\x4c\xf7\xcb\xb6\x07\x06\x6b\x6a\x0e\x9d\xe4\x56\xd2\x58\x0a\x3a\xeb\x58\x5b\x17\xee\xc9\x4d\x93\x44\xb0\xda\x6c\xc5\x2b\xf3\x84\xf7\x97\x54\x04\x2c\x7a\x4b\xb4\x1b\x59\xbb\x65\xd8\x5f\x40\x66\xd1\x8c\xf7\x92\x33\x45\xfe\x58\x40\xe9\x99\x71\x4e\x15\x88\x98\xf3\xbc\xef\x83\xda\xbc\x9d\xb2\x12\x13\xb8\x49\x6a\xef\x8b\x46\xd3\x8a\x17\x7f\x6b\x7e\x5e\x08\x9e\xb7\x33\xaf\x25\x0f\x8e\xe7\x8f\x79\x05\xe6\x01\x6c\xde\x03\x87\x0c\xf3\x0a\x5c\xba\x3a\x02\x55\xd2\x82\x05\x4d\x98\xab\x05\x4b\xce\x25\xc8\xa4\x0f\xbf\x6b\x86\x1d\xd5\xca\x86\xab\xb6\xa5\xea\xbb\xee\xff\xa1\x81\x7a\xee\xc6\xbb\xab\x06\xb6\xa7\xa6\xec\x2a\x49\x67\x95\x3a\x08\xa5\xb6\xca\x4a\x03\xa8\x7a\x90\x3a\xf7\x61\x50\x8d\xcc\x03\xd5\x68\x31\x0d\xab\xd2\x93\x9a\x40\xf8\xb2\xe3\x17\x11\x50\x75\x76\x25\x72\x5d\x3c\x24\xa6\xdb\x4d\x90\x60\x52\x0b\xac\x95\x79\x86\xbe\x63\xc2\x2a\x84\xd6\xbb\x95\xa6\xdc\xca\xda\xfb\x7a\xc1\x5d\x95\x5c\x01\xcb\xe8\xf7\xa7\x6c\xdd\x27\x4d\x76\xe9\x48\x9d\x05\xd7\x17\x95\xb6\x8a\x42\xec\x5a\x0e\xde\x48\xf4\x8d\xd2\xf5\xae\x90\x3d\xa8\x86\xf5\xce\x71\x87\x50\x47\xe7\xb8\x43\xa4\x8b\x9a\x13\x68\xee\xb5\x3b\x4e\x71\x12\x2f\x8e\xc4\x1e\x37\xea\xec\x54\x8e\x9b\xbb\x0a\x68\xb9\xea\xc7\xe9\xfa\xf5\xae\x03\x69\x89\xaf\x1f\x7b\xe0\x4e\xf5\x81\x3b\xe5\x03\x47\x9d\x07\x97\x01\x3e\x3d\xfa\x77\x80\xee\x48\x90\xba\xed\x67\xc3\xb5\xbe\xa5\xba\xf1\x5a\xb7\x37\x81\x6b\x5c\x2e\x00\xdd\x36\x7c\x5d\x36\xca\x4f\xe2\x18\x3f\x71\xa7\x28\x2c\xf1\x84\x37\xe6\x4c\xc6\x46\xa0\x80\x08\xc2\x8d\xdf\x41\x0a\x91\x90\x52\xc6\xec\x3c\x79\x3c\xa9\x87\x18\x52\xba\x4a\x16\x1d\x3c\xea\xb6\xab\xdb\x87\x6a\xe6\x74\x21\x81\x48\x47\xec\xca\x15\x66\xab\xba\xea\x37\x4b\x32\x5c\x82\x15\x3b\xb8\x24\x25\x1d\x20\x7a\xf3\x02\x2e\x19\x17\x90\x9a\x7f\x6e\x38\x01\xc5\x7a\x24\x2a\xb6\xba\x4d\xf4\xc5\x80\xa1\xf4\xef\x12\x08\xde\x18\xa1\x1d\x21\xa9\x2f\x1a\x7e\x00\x99\x25\x35\x6c\xf8\xf4\xf2\x90\x91\x0a\x0a\x60\xda\x87\xea\x74\x2c\xf9\xc6\x7a\x71\xba\x3f\xa2\xe9\x14\xaa\x6f\x46\xdf\x9e\x43\x35\x45\x4f\x0a\xca\xcf\xbc\xef\x0e\x51\xb0\xdc\xee\xf4\x4e\x1b\xa8\x7b\x92\x3b\x62\x4c\x17\xa6\x8e\xe6\x0d\x94\x14\x95\x9e\xab\xd2\x0a\xce\xda\xea\xb7\x23\x22\xf8\xa0\x93\xb2\x7b\x8c\x98\xb8\xaa\xec\x1f\x7d\x47\xf4\x8a\x7f\x28\xa5\x3a\xcf\x8c\xbe\xcd\xdc\x40\x92\xd8\xc6\x1d\xef\x6c\xfb\x85\x05\x2a\x14\x88\xdc\xd5\x1f\x9e\xe0\xb5\x42\x42\x10\x88\x2b\xba\xdd\x8b\xb5\x5b\x21\x38\xee\x86\xd6\x4d\x76\x61\xab\x2d\x13\xf9\xd0\x71\x46\x4f\x76\x59\x1b\xcb\x76\x30\xf4\x32\x47\x68\x0e\x16\xb5\x76\x09\xcd\xc0\xd0\xb9\xc5\x56\x73\xa0\xda\x8a\x08\x7b\x50\x4c\x9d\x04\x5b\x16\x9b\x03\x03\x44\xc2\xfc\x52\x0e\x09\xc1\xd4\xea\xc7\xc4\xae\x71\x89\x14\x39\x2d\xbc\x2c\xf9\x96\xd7\x5a\x8d\x94\xcb\x52\x8f\x7f\x99\x08\x22\xa1\x1f\xc0\x73\xc4\x8b\xe0\xf4\x4a\xf0\x11\x7a\x73\x83\xbf\x2f\x33\xc6\xc8\x25\x06\x10\x11\x59\xea\x87\x45\xe5\xf8\x64\x91\x44\x38\x1d\x94\x82\xb6\x14\xc6\x96\xb9\xfc\x75\x02\x8c\x78\x13\x39\xad\x4c\x64\xae\x27\xe2\x21\x23\x48\xf9\xcb\x85\x22\x21\x8c\xb0\xd2\x6c\x56\x6a\xa5\xda\xd6\x08\x3c\x08\xff\x71\x13\x23\x83\x2c\x11\xa4\xe4\x63\x06\x26\x41\xfd\x08\xf3\xf1\xdd\x87\xc5\x1c\xf9\xee\xd3\x5a\xca\xb2\x9e\xc7\x12\x6f\x0b\x38\xbf\x88\x94\x5f\x9d\x91\xb8\x8c\x1f\xc0\x40\xde\x65\xe2\x25\x02\x35\x83\xe0\x69\x74\x51\xab\x3f\xc7\x4d\x67\xc3\x62\xea\x11\xb4\xbe\x68\x53\x40\x69\xc8\x1f\x7c\x50\xb4\xe9\x50\xf9\xe2\x12\x5e\x3f\x34\x86\x22\x9a\x62\xc5\xd2\x03\xfc\x08\x06\x09\xde\x4a\xad\x5e\xd7\x89\x76\x9d\x57\xf7\x67\xd3\xa9\xce\x51\x2b\x46\x4d\xad\xa8\xc7\x92\x0f\xd2\xec\xb0\xa3\x56\xdc\x95\x24\x2d\xc7\x34\x7d\x0e\xda\x1a\x0d\x51\xb0\x95\xf2\x89\x6b\x7d\x3e\xf4\xa6\x33\x77\x7c\xc8\x67\x12\x35\x5b\x13\xa5\x0a\xb0\xec\x4f\x05\x1b\x5b\x56\x26\x10\x42\x57\xa8\xe9\x10\x40\x59\x55\x49\xa1\x02\x6c\x31\xdd\x82\x20\xf2\xb6\x39\x87\x03\xed\xb1\xbf\xe1\xed\xb6\x89\xb4\x5d\x10\x86\xbb\xd2\x48\x40\xd1\x9e\xf1\xf8\xf1\x8d\x19\xff\x59\x59\x10\x9b\x1b\x90\x68\xa3\xda\xed\xf7\x9f\x16\xfd\x2f\x52\x12\xfc\x1c\x15\xfd\xce\xa9\xb8\x77\x4e\xf5\xbb\x9f\xb3\x01\x7a\xeb\x5c\xe2\x46\xc4\xa2\x51\xd5\xbb\x25\x6f\x89\xa6\xdb\xe6\x92\x75\xe9\xce\x87\xab\x3e\x43\x7c\xf4\x79\x22\x80\xe0\xbc\x5f\xa6\xfe\xe6\x38\x8f\xd0\x4b\x31\xf5\xcd\x74\xd2\x5f\x4a\x7b\xb3\x98\x99\x05\xb8\xb7\x64\xe1\x73\x06\xfe\x9e\xa4\x83\x7c\x16\x09\xfc\x1d\xf5\x5f\xd2\x48\xb6\x39\x07\x23\xcd\x34\xe3\x32\xd4\x5a\x31\x4e\xfb\x18\xac\xa1\xbe\x93\xc5\xc1\xc5\x2f\x81\x48\xf3\x26\x7c\xdd\xbb\x45\x57\xff\xb6\xb1\xb1\x51\x43\xb4\xd9\xe1\x6f\xf4\x6e\x5c\x1a\xe9\x65\xc0\xca\x9d\x46\xf3\x21\xe9\x06\x8a\x5c\xba\xf9\xb0\xc7\x98\xa1\x46\x1d\x61\x4e\x39\x9f\xac\x9c\x20\xc4\x95\xa0\xef\x8b\x91\x73\x75\x44\x61\x3d\x92\xe3\xa5\x54\x93\xa0\x84\xf3\x4a\xd2\x3f\x8a\x02\xed\x09\xdc\x23\xb0\x34\x66\x3b\x9a\xc3\x96\xdb\x8c\xe3\x7c\x70\x6f\x74\x38\xcc\xda\x83\xc0\xee\x6b\xd0\x43\xf7\x6e\x98\x99\x7c\x95\xb4\x07\x3d\x03\x1b\xf4\xb5\xe6\x65\x76\x92\xf5\xe4\xba\xd2\x39\x90\xab\xc0\x6c\xbd\xb8\xf4\x76\xef\x0f\x2f\x0a\x18\x9e\x6c\x7c\xaf\x6f\xb0\xf3\xa4\xc8\x07\x62\x5b\x26\x65\xd0\xad\x9e\xec\xf4\x35\x70\x60\xcc\xa3\xcc\xec\x63\xda\x8b\xc7\xc9\x5d\x7c\x20\x5c\xdb\xd4\x22\xde\xec\xd4\x8c\xaa\x7f\x84\x62\xe3\xba\x5a\xab\x38\x78\x94\xc5\x9a\x39\xad\xaa\x21\x1a\x62\x72\xd1\x08\xa9\x48\x30\xc0\x8d\xde\xf7\x37\x97\x1e\xe7\xf2\x21\x80\x12\xa7\xbc\x7c\xda\xce\xf0\xfa\x74\x9a\xcb\xf3\x4a\x0a\xe9\x32\x27\x9a\x93\x33\x9b\xb0\xda\x24\x99\x44\xca\x23\x88\x6c\x4c\xcd\xb2\xf8\xa8\x12\x00\xde\x0e\xc4\x46\x7f\x97\x0b\xf4\x32\x42\xbf\xd7\x8f\x74\x75\x5c\x0c\xe7\xa4\x96\x6d\x75\x20\x05\xad\xf1\x0f\x91\x9b\x35\x31\x11\x51\xb6\xa3\x42\x14\x70\xbc\x0e\x50\x79\x4c\x7d\x20\xe8\x46\x41\xa3\x2b\xa0\xb3\xb7\x70\x1e\xd4\xfc\x2a\x00\x6a\x18\xe6\x66\x00\x9b\xdd\xbb\x71\x33\xb3\xb2\x4c\xb8\x55\xd4\x99\x90\xd4\xb9\x4a\xdd\xb4\xa9\x0e\xf6\xb7\xf4\x39\x90\x78\x36\x76\xe3\xf0\xf3\xdc\xc1\x83\x42\x2d\x5f\xc2\x35\x2b\x15\x45\xd3\x17\xf9\x79\xf4\x4c\xa5\xf4\x45\xd4\x4c\x7d\xbd\xd2\xc5\x3a\xa4\xa3\x6c\xf2\xb2\x91\xba\xb0\xb4\xcd\xe2\x62\xb8\xfc\x8b\x8b\x8d\xd3\x41\x5d\x21\x47\x5c\xf4\x8b\xc9\x52\x43\x03\xe5\xab\x08\x21\x37\x9a\x5f\x8a\xee\xab\x1a\x82\xdd\x63\x6f\x31\x6c\xaa\x37\x77\x9b\xaa\xa6\xba\x9a\xce\xa6\xc5\x2a\x7b\x19\xd3\x73\xa3\x48\xe5\x34\x8f\x68\xf0\xd1\xa5\xf4\x48\x43\x25\xd2\x66\xcd\x04\xed\x11\xd6\x5c\x72\x5e\x9c\xa3\xb9\x49\xe8\x5c\x0a\x31\x54\xcf\xe7\x7c\x34\x97\x91\x4b\x2a\x16\xd8\xe5\xd7\x8a\x05\x36\xd1\x23\xce\xc2\x72\x2a\xd1\x53\x22\x08\xcb\xa9\x44\x4b\x1c\x0a\x34\x28\x12\x51\x92\xdc\x0c\x26\x91\xc1\xe9\x54\x4b\xac\x15\x13\xb5\x4a\xf0\x75\x5e\x72\xab\x59\x35\xe2\x72\x74\x08\x3c\xba\x78\x70\xc3\x2c\xcb\xdc\xac\x20\x90\xc6\xed\x0e\x75\xd8\xa8\xe0\xa8\x91\xb1\x72\xb3\x80\x73\x87\x28\xaa\xab\xf6\xc4\x88\x63\x05\xea\x09\x68\x3d\xd4\xcb\x84\xbf\xdc\x9b\xa8\x47\x2a\xdb\x30\x1b\xea\x79\x48\x4f\xc8\xd2\x70\xf8\x9a\xaf\xe0\xa3\x53\x41\x0f\x3e\xd9\xf3\x9d\xed\x0f\x6b\x2a\x88\xe1\x9a\x3e\x60\xa9\x9a\x5f\xfb\x35\x15\x0c\x71\x4d\x1f\xd4\x34\xa9\xe5\xcd\x91\xd8\x0d\xd6\x29\x00\x9a\xb3\xa3\xe1\xbb\xad\xe7\xa2\x01\xba\xad\x87\xea\x60\xb3\x6d\x7f\x75\x3c\x48\x6c\xeb\x0f\xa7\x19\xa1\x78\x9a\xda\x11\xe8\x99\x79\x23\xd0\x19\x1a\x7a\x58\xfd\x11\xe0\x46\x79\xd8\x50\xce\x7c\xe4\xcd\x9e\x22\x0b\x05\x5a\x0b\x0a\x96\xcd\x9e\x3a\x0d\x05\x0d\xbe\x9c\xd1\x41\x4d\x84\xcf\xfd\xf1\x9c\x09\x26\x17\x14\x30\x89\xa8\x2f\xc0\x52\x08\xa1\xd3\xf8\x02\x2f\xb4\x56\xdd\x73\x69\xc3\x0b\x6b\xf3\xcb\x3a\x89\x59\x78\xfb\x24\x0d\x25\x2a\xe6\x2f\xf9\x76\x92\x13\xf9\x25\x39\x22\xf7\xa0\x7f\x15\xf9\x77\xaa\x88\xbe\xb9\x6d\x67\xa9\xe7\xf9\xa5\xde\xe7\x39\x8e\x24\x13\x84\x7f\xb5\x67\xdf\x64\xe1\x9b\xaf\x50\x98\xcd\x4f\xbe\xcb\xbe\xe7\xd6\x3e\xda\x5e\xf8\x9d\xf6\xdb\x8d\x2f\x0e\x0d\xfe\x52\x0e\x0d\x3e\xc7\x97\x8c\x2f\x2e\x0b\x26\x17\x74\x59\x40\xaa\x6e\x4b\x89\xa6\x9b\x1c\x50\x07\x45\x9b\x7c\x51\x7f\x98\x7c\xdc\xc7\xfc\x75\xbe\xae\x7d\xc4\xdf\xe0\xed\xfa\x23\x31\x3d\x56\xd7\x53\x48\x76\xfc\xb6\x44\x7b\xc0\xb6\xd4\xe8\xd9\x0a\x0d\xef\xe5\x2e\xc7\xf6\x34\xe9\x3a\x37\xb3\x02\x7f\xaa\xfc\x96\xec\x4b\x9b\x5c\x20\x9c\xc3\x8f\x97\x2f\xf0\xad\x28\xc0\xd6\x29\xbb\xc6\xd5\x5a\xad\x02\x2b\x29\x60\x2e\xfb\xd6\x76\x1e\xf7\x0b\x35\xca\xab\x55\xed\xd5\x06\xf5\xd5\xaa\xb8\x32\xe2\x8e\x41\x4e\xc7\xf3\x77\xf5\xca\xac\x91\xb7\x3e\x17\x71\x3c\x2a\xcc\x6c\x6e\x27\xd4\x60\x95\xb0\xe5\xbe\x4b\xb5\x0b\x09\xe2\x18\x68\xaa\x92\x38\xb3\x00\xe0\x6e\xe0\xc5\xb0\x58\x12\xa1\xaa\x0a\x9f\x85\xd9\x77\x13\x5a\x44\xdc\x4d\x66\xd9\x1f\xcd\x20\x7c\x12\xfa\xcc\x0f\xec\xc0\xff\x2d\x24\x57\x7f\xae\xe1\x4b\x58\xc2\xcf\x6d\x32\x1b\xf9\xf8\x28\xfe\xa2\xc6\x2e\xff\x7b\x4c\x55\x96\x33\xe9\x60\x11\xcf\x44\xbb\x2a\xb7\x35\xe9\x47\x0f\x83\x66\x72\x09\x2b\xde\xf9\xdc\x25\x13\x5f\xb4\xd6\xff\x5c\xad\xf5\x65\x04\x3d\x15\x7b\x09\xa1\xe2\xbd\x95\x16\x7a\xdd\x1b\x75\xa3\xb8\x47\xf8\x06\xfa\x97\x13\x23\x86\x14\x51\x83\x0b\x25\xd6\x51\x52\x9d\x4b\xb4\xb9\xf8\x77\x15\xe6\x28\x0a\xe5\xb3\x56\xe1\xbf\xb8\x34\x68\xf3\xe3\x44\x93\x7b\x05\x04\x70\xc8\xf6\xbf\xaf\x50\x5c\x0c\xc0\x75\x04\x97\x00\x73\x5d\x7e\x8d\x0e\x14\x72\xc4\x0d\x59\x1b\x1f\x2d\x20\x13\xcf\x27\xce\x44\x5d\x71\xc1\x0e\xfb\x6f\x1d\x01\xc1\xf4\xbd\xcc\x75\x99\xba\x8e\xbe\xe0\xca\xa7\x1e\x3f\x10\xd4\xc9\x88\xec\xe0\xa2\xf3\xe6\xa2\x73\x5d\x74\x63\x41\xd9\x0d\x56\xc3\x69\x8c\xdc\x54\x05\x85\x58\xa0\xb5\x6f\xaf\x7f\x5a\xfd\x61\x1c\x15\x20\xef\x7a\xe0\x2c\x0e\x0e\xca\x2c\xf2\x02\x7e\x69\xf4\xbe\x74\xb0\x0a\xb7\x0f\x6b\xce\x4d\x90\xb2\x5e\x1d\x50\x4d\x8f\xe4\xff\x10\x57\xc4\xa5\x4c\xf7\x13\x79\x21\x76\xfd\x45\x1c\x10\xdb\x4c\xcd\xb8\xb8\x1a\x63\xd7\x18\xca\x33\x70\x95\x12\x71\x1f\x4c\x9f\x56\xd8\x01\xeb\xe5\xf2\xe0\x4b\x93\xdd\x11\xaa\xbb\xee\xa1\xd6\xa7\xdc\x85\xe0\x84\x41\x79\xaf\xab\x98\x62\x28\x4e\x1a\x46\x9b\xfe\xe9\x50\xcf\x6d\xfc\x1b\x8c\xa7\x4f\xc1\x26\x7a\xce\xaf\xb0\x25\x3f\xab\x75\x94\xcf\x63\xa6\xd9\xa9\x35\x97\xd4\x59\x70\x8c\x2c\xc0\x36\xa9\xe2\x7f\x7b\xf9\x11\x42\x1b\x8f\x92\x13\x50\x2f\xc1\xf3\xcb\x4d\x15\x61\xbf\x1b\x42\xff\x85\x7e\x5f\x1b\x22\xfc\x85\xb1\x0c\x91\x00\xf8\x68\x47\x18\xc7\xbc\x79\x93\x14\x4d\x68\x58\x9b\x1b\xf4\xc5\xee\x05\x2f\xcf\xf6\x88\xc2\xe9\xbe\x11\xc6\xdd\x5a\xff\x0c\xc9\x81\x88\x30\xa6\xca\x53\x11\x1b\x74\x3b\x5e\x1b\xbf\x6d\x2e\x90\x40\x2e\xcf\x7c\x29\xb8\x27\x93\x1f\x9c\x23\x6f\xe0\x56\x62\xed\xc3\x49\xd5\x17\xf4\x19\xf7\x87\x45\xff\x2d\xa1\x2e\x11\x35\x98\xd4\x83\xfc\x34\x1b\x50\x2a\x11\x71\x4c\xb1\xd1\x02\xc1\xdf\xb4\x28\xe7\xe1\xb9\xde\x7b\x7a\x86\x53\x01\xa3\x44\x1b\xb1\x30\xf3\xc4\xf6\x99\x4d\x84\x1d\x83\x61\xe3\x31\xfa\xc4\xa1\x3f\x83\xa7\x8b\xea\x7d\xe4\x49\x7c\x9a\x09\x98\xc7\x23\xb3\x15\xe9\x10\xa3\x66\xfb\xf0\xac\x73\xa2\xf0\x8c\x7d\x6c\x85\x94\xfa\x64\x96\x79\x57\xfd\x87\x9f\x1b\xec\xe7\x39\xdf\x80\x1c\x6b\x72\xed\xba\x0d\x31\xb9\x79\x93\x37\xd3\x9b\x75\xe8\xf8\xd0\xde\x4a\x0f\xf3\x41\xed\x8d\x28\x79\xfe\x85\xf8\xee\xf0\xcd\x08\xbc\x25\xf2\x49\x83\x21\x3f\x7f\xfa\xcc\xa4\xb4\x31\x36\x15\x03\x61\x79\x7f\xbe\x93\x1e\x02\xd0\xb5\x31\xc8\x6d\x67\xd7\xc5\x4a\xa9\x71\x52\xe0\x4b\x72\xd9\x66\x83\x54\x02\xad\xeb\x8a\x8a\xf0\xcd\x93\xb3\x5b\x81\x44\x66\x0a\xa2\xa3\x45\x5e\xcd\x76\x67\x19\xd7\x32\xcd\x72\x32\xd5\xa9\xc6\x26\x36\xd1\xe1\x80\x77\x87\x56\x16\x23\xab\x25\x8d\xc8\x59\x4f\x22\xce\x39\x40\x30\x43\x07\xf9\xd5\x3f\xfe\xf3\x05\xa8\xb5\x2a\xa7\x1c\xa8\xe6\x0a\x17\x5f\xa5\x10\x05\x5a\x21\x3d\xd8\x1e\xdc\xdd\x59\xaf\x3f\x04\xa6\xff\x97\x2e\xd5\xea\xcd\x55\xe2\x6b\x57\x18\xee\x6e\xcc\x3f\x4e\xcd\x31\x3c\xdd\x11\x61\x3d\x0e\xc4\xec\xe4\x2b\xd3\x4f\x36\x7a\xb0\xf3\x14\xf5\x64\xde\x65\x93\x92\xc3\x76\x3b\x94\x65\x9a\xd8\x95\x8e\xbd\xf8\x01\xae\x6b\x1d\x8f\x20\x1a\x70\x8e\x7d\xe2\x72\xa7\xf7\xc1\xcd\x91\xb9\x62\x1e\xe0\x68\xc1\x39\x66\xbb\xda\xa5\x9d\xa1\x69\x1d\xaa\x4b\xc8\x02\x5c\x1c\xcc\x79\xe2\xc5\x30\xa0\x11\xd9\x25\x90\x5a\x14\x21\xc1\x55\xda\xd1\x11\x13\xec\x70\x2d\xed\xe1\xa2\xe9\x47\x0e\x3c\x1e\x43\xd7\xc3\x57\x11\x59\x31\x9d\xd9\x90\x0b\x77\x73\x69\xa8\xa3\xf8\x72\x46\x2c\x07\xa9\x59\xc4\x0a\xab\xde\xe4\x1b\xcd\xa2\xa1\x4e\x70\x0e\xc3\x77\x11\xff\x25\xe4\x72\x4f\xe0\xe2\x85\x8c\x62\xce\x06\xf2\x4e\x63\xff\xc6\x5b\xe9\xa2\xa1\x6d\xef\xa7\x93\x88\x1e\x82\xa4\xda\xe8\x09\x4e\x9b\x5a\x47\x50\x10\xad\x69\x2e\xe5\xbf\xf4\xa8\x82\xfa\x45\x87\xcb\x6a\x47\xc0\xaa\xa4\x73\xf8\x6b\x75\x0a\xb2\x34\x52\xce\x26\x4b\x39\x0c\xaa\x1f\x4c\x02\x92\x56\xa3\xf7\xbc\xd9\x0c\x99\xe2\x96\x5d\x02\x03\x6f\x32\xa3\x2d\x3b\x63\x93\xa8\x46\xbf\xa5\xe7\x68\xb2\xec\x70\xb7\xdc\x84\x4c\xb2\x1d\xdd\x96\x1b\xbf\x49\xc6\x01\x6d\xd1\x50\x61\xbb\x59\x72\x64\xa7\xb2\xb5\x79\xf3\xdb\xae\x5e\xfd\xad\xcd\x6f\x36\xbb\x76\x26\xe6\xeb\x7a\xd7\x5b\x23\x93\x82\x15\xec\x46\x98\x04\x14\x2a\xe9\x05\xdf\xda\xfc\x76\x03\x41\x64\xa9\x08\x38\x95\xa5\x92\x05\x6d\xf5\xd6\x87\xf9\xfe\xfa\x60\x92\x1e\x1e\x42\x80\xde\x16\x2c\x2c\xcd\xc0\x4b\x87\xfe\xbe\xc5\xfe\x96\x0a\x91\xd2\x72\x20\xd9\xaa\x21\x94\x5a\x08\xea\x2d\xde\x68\x08\x1c\x3c\xff\x41\x4e\xb3\x0b\xc5\xdc\xee\xbc\x3f\xa3\x12\xac\x7f\xa4\x1a\xa0\x38\xe7\x6b\x94\x21\x0d\x59\xba\xd1\x9b\x25\xa6\x8e\x20\x15\x27\xb8\xbe\x6e\xfe\x4b\x7e\xcc\x86\x63\x73\x41\xf4\x92\x57\x59\x96\x30\x09\x90\xe0\xfd\x46\x48\x9b\x5c\x2b\x93\x7f\xf4\x0c\x47\xd3\x83\x9a\x2b\x8e\xe8\xc0\x3b\xed\xa7\xc7\xe8\xae\xbb\x6d\xd7\x0a\x9d\xed\x25\xa6\x03\x44\x18\xe0\x83\x7d\x04\x86\x53\x29\xb8\x65\x3f\x98\x1a\x9a\xba\xbd\x3f\x9b\x26\x23\x73\x9c\xd2\xe1\x49\x3a\x2f\xaf\x76\xcc\xe4\xe6\xa3\x7e\x2f\xf9\x59\x3c\xbc\x83\xa7\x66\x53\xb7\x64\xaf\x81\xe0\x09\x99\x39\x54\x7c\x5e\xb7\x5d\xf5\xde\x8c\x33\xbc\x7a\xa8\xab\x3f\xfe\x50\x59\x58\x78\xdb\xd4\xb4\xa4\x58\x62\xfe\xc0\xc5\xbe\xa5\x4a\x69\x52\xa8\x8b\x25\x1c\x69\x4f\x35\x12\x22\xd7\x48\xa2\xca\x77\x45\x97\x73\xe8\x3a\xd0\x59\xbf\x60\xce\x99\xf9\x1b\x8e\x82\x5e\xac\x74\xf4\xd0\xf4\xfa\x3a\x5c\x27\xb1\x08\xb3\x23\x22\x64\x9d\xe2\x13\xd8\xed\xdb\x49\x6b\xbf\x98\x1e\xb5\xcc\xd4\xb8\xcb\xfa\x82\xf3\x56\xb4\xc7\x5f\x3e\x5e\x8f\xa7\x41\x8f\x79\x29\x20\x8c\xba\x12\x5e\x77\xac\x71\x0d\xe9\x54\x59\x6a\x41\x4f\x49\x45\xb3\x6d\xca\x2e\xf6\x49\xa7\x8d\x5a\xc3\x6a\xbb\x04\xf6\x89\xf4\xb4\x47\x63\x30\xe0\xf6\xff\x19\x78\x1c\xe4\xe6\x78\x1f\x4d\xa7\x86\x42\x5f\x5f\x3f\xcc\xcb\x69\xef\x30\x9f\x1e\xcd\xf6\x7b\x86\x40\x5e\x9f\x14\x87\xc5\xef\x47\xa3\xfc\x6d\x71\x70\xb0\x9e\x7e\x7d\xa3\x7f\x90\x0d\xae\x7f\xdb\xff\x7a\x33\xfb\x3a\xfb\xe6\xbb\xfe\xa0\xef\x66\x02\x7e\xc4\x1f\x8f\x6c\xc0\xf3\x74\xde\x4d\x60\x20\xfb\x2c\xa4\x4c\x7c\x85\x3f\x24\xe4\x29\x8c\x78\x42\x7a\x50\x56\xe3\x2f\xb9\x95\xf8\xda\x7f\xb8\xa8\x70\x35\x4b\x7b\x1c\x60\x4e\x3e\xbb\x60\x15\x65\x9a\xd8\xcd\xf7\xba\x49\xde\xa5\xf6\xf6\x3a\x1d\x15\x6f\x1d\x33\x01\xb2\xcf\xbc\xd5\x37\x24\x61\xff\x28\x2b\x5f\x65\x43\x76\x37\x3a\x34\x0c\x23\x7f\x50\xc7\x48\x30\xa3\x6f\x71\x40\x31\x6a\x8a\xbb\x38\xaa\x16\xb7\xd0\x22\xf0\x6e\x9d\x64\xfb\x6f\xf3\xe9\x53\xbf\x59\xc9\x3c\x2e\x7e\xaf\xcb\x29\x6b\x32\x8a\x30\xdd\x24\x9b\x49\x5a\x5c\x47\x43\xeb\xd0\x12\xf1\x74\x15\x48\x65\xc3\x5d\x2a\x81\x1e\x37\x13\xe4\x75\x6d\x39\x97\x49\x10\xe3\x4d\x9e\x20\xe4\xda\xb5\x95\xe4\x5a\x52\xe6\xc7\x63\xc3\x3c\xa7\xfb\x06\x3d\xa7\xbc\xd9\x66\x2f\x11\xc8\xc1\x97\x3b\xfb\x7a\x47\x64\x09\xe5\xaf\xad\x13\x82\xc6\xe4\x1f\xd0\xf4\x11\x06\x38\x2d\x66\xfd\x23\x41\x11\x68\xf2\xb8\x95\xb4\x30\x11\x3f\x78\xca\xc7\x68\xef\x4e\xe9\xf0\x9b\x93\x0d\xce\x92\x54\xf3\x13\x96\x01\x7d\x79\xa2\x23\xfa\xb0\x4d\x4c\x1c\x14\x27\x23\xbf\x49\x4c\xae\x34\x89\xa9\xb3\x71\x8b\x60\x03\x31\xbd\x28\x87\x80\x83\x79\xf2\x74\x4f\x53\x21\xfe\xdc\xcc\x1a\xb1\x37\x4d\xcc\x4e\x72\x97\x5a\x6a\x81\x5b\x60\x5e\xb7\x43\xf0\xd0\x6b\x99\x14\xc6\x83\x67\x16\x5b\x96\x06\xb7\x1b\x2e\x14\x8c\xf6\x86\xbc\x6c\x9a\x43\x7e\x40\x39\x2f\xb8\x74\x3b\x73\x00\xa9\x98\x84\x36\x9c\x7b\x58\x94\x12\xc2\xf3\xdb\x0f\x8c\x7d\x69\x90\x44\x15\x9b\xf3\x78\xb6\x6c\x23\x96\x8d\x52\xd9\xaf\x2b\xd9\xaf\xab\xe8\x39\x1d\x0c\xe8\x1a\x03\xc0\xc1\x75\xe8\x26\xe6\xe2\x1a\x0c\x33\x3e\x3b\x48\x4d\x67\x40\x39\xf3\x10\xb6\x11\xcb\x43\x72\x36\xec\x19\xc2\x24\xed\x1f\x61\x0b\x72\xc6\xfd\x54\x73\x5d\x1b\x4c\xf7\x55\xd8\x34\x02\xb2\x0b\x22\x0d\x75\x78\x20\x4f\x0c\xf2\xca\x46\xd2\x3b\x35\x17\x64\xb5\xfd\xc6\xba\x48\x7f\xeb\x26\xa5\xe6\xae\xee\x1c\xb4\x80\xb9\x46\x15\x87\x4c\x10\xa6\x3e\x64\x25\x06\x59\x6c\x25\x54\xea\xd2\x2b\xa1\xc6\x12\x59\x8c\x48\xee\xc5\xd7\x03\x44\x2d\xd5\xc5\x40\x33\x02\x7a\x86\x6c\x03\xdd\x60\x09\x9b\x1d\xa0\x89\xcc\x7f\x83\xcc\x10\x89\xd9\xc4\xdc\xfe\xc3\x79\x92\x9d\xf6\x87\x33\x0c\x3e\xc1\x32\x09\x40\x2b\xc5\x6c\x92\x48\xa0\x41\x38\x25\x06\x29\x61\x74\x89\x93\x0c\xe9\xa1\x59\x09\x92\x59\x6c\x93\x84\xeb\xc0\xce\x9e\x1c\xe5\xfd\x23\x68\xde\x94\xf4\x5a\x24\x4a\x4d\x18\x6e\x39\x4b\x7c\x8c\xac\xaa\x11\x8c\x94\xe1\x5c\xb4\x5a\xa8\x04\xc8\x88\xcc\x8c\x06\xaf\x58\xde\x79\x62\x2e\x80\xe2\xa4\x87\xa7\x53\xe5\xd0\x54\xa1\x12\x37\xf9\x15\xb8\x43\x9e\xb6\xbd\xea\xbd\x7d\x14\xff\x9b\xe1\xe2\x03\xed\x92\xc5\xef\xa3\x56\x86\xab\xc1\x67\x59\xb4\xa2\x2a\x6b\x4f\x41\x9a\x3e\xd1\xd2\xa3\xf8\xe1\x62\x6b\x2f\x8a\x5c\x6a\xe9\x59\xed\xe8\x82\x2b\x4f\x0d\x36\xac\x24\x0c\xd6\xad\xe3\xc2\xe2\x2f\xed\x53\xba\x5e\x77\x56\x38\x3b\x53\x04\x9c\xd3\x21\x51\xcb\xfe\x71\xc1\x6b\x2d\x36\xec\x31\x05\x9d\x36\xf0\xb5\x6c\x51\x82\xad\x45\x60\xe5\x74\x61\x82\xf9\x7d\xa4\x2d\x6c\x1a\x31\x7a\x26\x5f\xae\x28\xb9\x3a\x8f\x6d\x9d\x26\xbe\x9f\xcd\x8e\xdb\xa3\xd9\x71\x8c\xec\x36\xc9\x44\x3e\xd3\xbb\x51\x0b\xee\xd7\xab\xa6\x46\xfa\x0c\x6b\x84\x8b\x34\x6d\xa7\x5e\x2b\xe3\x74\x52\x66\x8f\x21\xb9\x9b\x6c\x6e\x04\xc5\xc3\x43\xe1\xf8\x0d\xa1\x13\x1c\xc1\xe0\x16\x7c\x1f\xaa\x00\x93\xfa\x5f\xaf\x9e\x3f\xeb\x61\x07\x6d\xfc\x49\xcf\x55\xf9\xc1\xbc\x1d\x32\x1e\x54\x05\x1d\xde\x63\x13\x2c\xd2\x8e\x33\x73\x52\xc8\xb4\x9c\x8d\x2c\xe0\xd2\xd7\x33\x94\xee\xf2\x9d\x25\x03\x81\xd5\xa1\xec\x96\x5c\x33\xd2\xc9\xd2\x9b\xae\xbb\x5c\x54\x89\x4a\x71\x35\x83\x85\x38\x97\x17\xa6\x67\x31\x5d\x6a\xda\xcb\x61\xc7\x0d\x8c\x30\x38\x24\xe6\x82\x63\xac\x55\x26\xc0\x4c\x23\x93\x8e\xf1\x86\xf2\xa9\xc1\x86\x86\xae\x35\x58\x11\xa3\xc0\x62\x2c\x33\xb7\xd8\xef\x3d\xc6\x75\x0d\xd7\x44\xa1\xbf\xaf\x70\xef\xd5\xf8\x3d\x58\x4d\xbe\xe2\xda\xf4\x07\x8a\xda\xd5\xa9\xe0\x25\x6e\xcb\x15\x20\x3c\x8a\x0d\x75\x35\x63\xad\x07\x01\xd7\x5f\xed\x18\x00\x19\x2c\x31\x04\x7b\x27\xd5\x8c\x00\x9a\x91\x01\x4c\x94\xea\x1c\x61\x05\xde\x95\x64\xad\x7a\x03\xad\x25\xc1\x72\x49\x2b\xa4\x6c\xe8\x69\xe0\x85\xed\x78\x38\xd5\x6b\xc8\x0c\x87\x44\x06\x44\x7f\xd0\x8d\xf4\x7f\xb3\x6c\x9c\x9c\xe2\x36\xcf\x59\x0e\x83\x43\xc5\x14\xea\x2e\x19\xe6\xc7\x86\xd9\xed\xf5\x7a\x0c\xc7\x74\xfe\x19\x7a\xb0\xb4\x61\x1a\x45\x4e\xad\xac\x94\xed\x91\xf4\x8a\x6e\xc7\x5a\xa1\x9e\x6c\x33\xaf\xab\xcd\xbc\xb6\xcd\xec\x0b\xfe\xa5\x19\xdc\x37\x50\x99\xee\x1b\x0a\x8d\x5e\x6c\x61\xdc\x20\xba\xe7\x41\xc7\x3a\x1b\x52\xa0\x86\x70\xc4\xe9\x69\x65\xc4\x43\x41\x9c\x95\x36\x4c\x17\x91\xd1\xda\x26\xdc\x68\xa7\x78\xb1\x38\x04\xb7\x1b\x22\xaa\x3d\x1f\xc7\x95\xa3\x74\xbc\x53\xfc\xe7\x24\x1f\xb4\x0f\xcd\x5f\xdd\x84\xe5\x4e\xbf\xd8\x5f\x0a\xb5\x9d\x4a\xcf\x14\xff\x41\x8a\x26\xeb\x09\xd4\x45\x6e\xe6\x9a\xfc\x14\x34\x35\x8f\xd6\x79\x2d\x75\x36\x5d\x9d\xcd\x3d\x75\x0f\xec\x42\xcc\x94\x3d\x91\x80\xfc\x54\x66\x07\xb3\x21\x52\x3f\x2c\xc9\x07\x64\xb1\x0f\xf1\x28\x8e\xcc\x2e\x0f\x61\xa7\x29\xa2\x19\x04\x2f\xa3\xa8\x64\x06\x75\x98\x32\x27\x86\x11\xb5\x3c\x70\x0f\x79\x43\xc3\xff\x4d\x88\x53\x17\x4c\xd6\xda\x86\xb4\x35\x62\xab\xb7\x12\x78\x17\xdf\x5e\x23\x21\xc1\x9a\xce\xa1\x8c\xe3\xe2\xf7\x6a\x6a\x0b\x0f\x70\x6b\xad\x88\x55\x28\x23\xe5\xb7\x7d\x1e\xed\x27\x7f\x50\x65\x28\xdb\x42\xde\x24\xbc\x37\xb2\x11\x7c\xb8\xaa\x3f\xa2\x14\x47\x1e\x3f\x44\xb4\x48\x73\x1c\x14\x7d\x34\xc7\x34\xf0\x3c\x98\x03\xd2\xbe\x37\x35\xf7\x91\xc1\xb1\x59\xbb\x85\x65\x5a\xc8\x8a\xb6\x5a\x50\xd1\x2f\x5c\x46\x0a\xf3\x93\xbd\x41\x45\xc1\x72\x06\x77\x28\x71\x33\x7f\xd1\xd9\x19\x5e\x6c\x3c\x4c\xfb\x59\x3b\x98\x63\xd7\x34\xd4\x09\x26\xca\xfa\x32\xaf\x5e\xa9\xa7\x4b\x5c\x0f\x21\xf0\x5f\x52\x5b\xc9\x6c\x94\x4f\xcd\x12\xc0\x8d\x96\x1d\x97\x7c\xfd\x9d\xaa\x13\x46\x5d\x9f\x9a\xa5\x6d\x8d\x4f\x5b\xfa\x1c\x51\xce\x5c\xe5\x78\x42\x03\x65\xe1\xd4\x72\x76\x5a\xc0\x0f\x62\x63\x5d\xf8\x85\x95\x3b\x2c\x5b\xf9\x19\x41\x7c\xe7\xbc\xd5\x9e\x9f\xbb\xc6\x71\x79\xee\x2a\x4f\x8b\xdf\xcf\x51\xc7\xca\x3d\xf8\x09\xe0\x91\x41\xcb\xf2\x0c\x80\xb2\x7d\x4a\x7e\x88\x8f\xdc\xc9\xad\x87\x02\x6a\x77\x30\xb3\xf2\x8a\x12\x53\x81\x32\x70\xa3\x75\xa0\x5a\xb6\x0d\x33\x60\x93\xe9\xa9\x79\x20\xe5\x73\xed\x1a\x5d\xa3\xd7\x92\xdf\x40\xb2\xfc\x9b\x61\xed\xcc\x85\x79\x8c\xe1\x8a\x89\x1d\x43\x81\x33\x46\x74\x94\xb6\x40\xb6\x8d\x92\xb0\x1e\xd7\x95\x26\x58\x76\x6d\x50\x5c\x71\x52\x62\x09\x7c\xd5\x38\x2a\x26\xf9\xef\xc5\x68\x6a\xd2\xe7\x78\x17\x41\x28\x9e\x1c\x04\x85\xf3\x9e\xad\x7a\xda\xe2\xeb\xc9\xd5\x9b\x16\xaa\x2a\x8e\xc3\x15\x9f\x47\x8b\x4b\xc3\x5e\x61\xa9\xc3\xa2\xb8\x12\x0a\xd2\x48\xa5\xc4\x3a\xfe\x0b\x75\xaa\xda\x2e\x06\x0f\x3e\x3f\x68\xef\x52\x85\x2e\x8c\xb3\x0b\xbd\xef\x75\x70\x41\xfd\x15\xa4\xeb\xcd\x5b\x43\x58\xb8\x09\x3c\xc1\x80\x84\xce\x0e\x35\x7d\x97\xe6\x43\x5c\x4a\x8e\x82\x99\xd1\x03\x90\x9d\xdf\x3d\x5b\x80\xb5\x06\x0d\x41\xb3\x15\xae\x36\xd3\xcb\xe6\x7c\xd1\x63\x97\x5a\x0b\x38\xb0\x39\x45\xe1\x75\x20\x50\x0a\x39\x8e\x04\x50\xd0\xda\xbd\xa1\x19\xf3\xc8\x30\xeb\xef\x0c\x4f\x6f\xee\x55\x03\x4f\x66\xaf\x12\x96\xf7\x23\x02\x80\xd6\x0e\x0a\xd8\x5c\xb8\xb4\xc6\x64\xf7\x9e\x43\xa4\x30\xbc\xd4\x0e\x04\x60\xe0\xa9\x69\x0c\xf8\x26\x1d\x86\x63\x7e\x4f\xa4\xef\x93\x47\x3f\xec\xbc\xb9\xff\xfc\xa7\x67\x0f\xbb\x42\x05\xbe\x7c\xfc\x9f\x3f\xda\x34\xa1\xe9\xee\x3f\xdf\xd9\x79\xfe\x54\x52\x91\x60\xdd\x79\xfe\x82\xbe\xcf\x2a\x13\x18\xaa\xc5\x02\xf3\xfd\xf1\x69\x38\xc9\x47\xa7\x29\xc8\x9f\xc3\x51\xfd\xf6\xdb\x6f\xff\x53\x9e\xca\x17\xa1\xb2\x7b\xe3\x3a\x35\x43\x5b\x0c\x69\xd8\x50\xcd\xae\x2d\xec\x8b\x2d\x62\x11\x60\x3b\x4c\x37\x7f\xdc\x29\x67\xe2\xe8\xf6\xfb\xf7\xbc\x22\x37\x36\x36\xdc\x4a\x98\x8f\xb3\xb3\x3b\x91\x06\x4c\x13\x83\xfc\xdd\x1d\x10\xf1\x9a\xad\xbd\xb5\x0e\x1f\xd5\x62\xb7\xd6\x15\x36\x09\x72\x99\x09\xb2\x29\x67\xee\xf3\xcc\xe5\x99\x35\xf2\x4e\x0b\x8d\xb6\xe6\xbc\xc0\x4f\x7e\xd6\x48\xaa\x1a\x91\x60\x3c\x25\xeb\x98\x08\x37\x14\x96\x7a\xc6\xce\xc1\xec\x1a\x32\x98\x2c\x28\x16\xd5\xec\x0c\x0b\xc9\xa2\xc6\xcb\x71\xb1\x33\xcb\xa7\xd4\xa1\x04\x3e\x7f\x5d\x52\x2d\xd9\xeb\x60\xf1\x18\x62\xb8\x3f\x4f\x58\xcb\xba\x8b\x02\xb0\xc1\x20\x69\x85\xc4\x96\x41\x9b\x72\xc1\x97\x82\x15\x84\x06\x48\x80\x06\x90\xc6\x4c\x1e\x93\x97\xc9\xec\xd0\x20\x54\xf0\x87\xc7\x8f\x2d\x00\x7f\x83\x19\x30\xf0\x88\xac\x7b\xc9\x63\x8e\xb0\x6d\xfe\xeb\xa7\x28\x73\x83\x63\x6b\x80\xe0\xb8\x94\xe6\x80\x5c\x9d\x83\xb4\x2e\x1d\x8f\xe1\xd1\x86\xd9\x59\xd3\xcb\x6f\x38\xad\xdf\x7c\x24\x19\xa3\x77\xaa\x0b\xb9\x5f\x80\xe1\x50\x05\x3f\x92\x68\xf8\xb7\xa4\x1c\x67\xfd\xfc\x20\x87\x93\x6a\x9f\x89\xa0\x47\x8e\x00\x9e\xa4\x84\x37\xa9\xb8\xf9\x99\x42\x60\x3a\x50\x26\x84\xb5\xc1\x99\xfd\x95\xce\x35\x4d\xe3\xf6\x6a\x8f\x7e\xac\x36\x9c\xe2\x68\x8e\xe4\x3a\xed\x82\xdb\xab\xd2\xd4\x83\x61\xde\x7f\x9b\x1c\xe3\x3d\x02\x0b\x53\x77\xfe\x75\x27\x22\xda\x28\x0b\x53\xcf\xdc\x6a\xd9\x04\x9f\x8e\x1a\xb0\x07\xd4\xfc\x64\x88\x85\xa6\x56\xef\x55\xb0\x02\x55\x86\x1a\xe9\x67\xc3\xc5\x50\xa5\x0e\x0e\x2c\x15\x83\xd4\x30\xff\x3d\x25\xed\x0a\x6a\xef\x4f\x06\x29\x01\xaa\x18\x4c\x25\x1e\x58\xd1\xb4\x0d\x58\xd1\x8f\x1a\xb0\xa2\x5a\x8d\x40\x91\x54\xc1\x4b\x9a\x7c\x5d\xcc\xa0\x9f\x16\xaf\x18\x86\xe0\x86\x38\xda\xb5\x80\x82\x3d\x3d\x94\xd7\x5c\x28\x9a\x9c\x14\x93\xb7\x18\x1a\xbc\xbe\x96\x54\x6e\xc8\x6f\x82\xb3\x8b\x42\x1a\xcd\xf2\x1c\x90\x06\x12\x00\x0d\x67\x80\xa4\x44\x4e\x84\x58\xca\xbe\x63\x97\x47\xc5\x6c\x38\x40\xc1\x85\x81\xbb\xcf\x0c\xb6\xa2\x08\x2b\xf1\x80\x0b\x66\x7a\xfb\xfd\xee\xf5\x9b\xdd\xe4\xfa\xcd\xbd\x1a\xc2\x83\x2a\xc1\x9e\x3d\x96\x99\x9a\xa3\x77\xfd\xa6\x59\x13\xf3\x17\x34\xf1\xa9\x77\x14\xfa\xac\x71\x8e\x63\x6e\xec\xb8\x15\x47\x8c\x90\xc7\xe7\xff\xc6\x9d\xb6\x0c\x91\x41\x2c\xc0\x23\xdb\x1d\x87\x9a\xe6\x2a\xbf\xd8\x8e\x9f\x6f\xd3\x93\xa5\xf7\x3d\x59\xb4\xf5\x89\xb7\xfb\x38\x09\x43\x88\x9e\x6e\x25\x00\x01\x73\xf8\xa7\x8e\xfa\xb4\xd5\x19\x0e\x70\xfe\xc4\x2e\x08\x67\xfc\x0b\xd4\x1f\xd3\xf2\xd9\xc4\xd7\x94\xb8\xbd\xe8\xc6\x6a\x84\x92\xa4\x0a\x28\x89\x07\x2b\x49\x23\xb8\xb0\x96\x47\x33\x81\x1a\xb1\xfc\x1c\x79\xf4\x64\xad\xef\xfc\x15\xea\x3e\x02\x5f\xc0\xa7\x3d\x1f\xbd\x82\xee\x1f\xa0\x82\xde\x6f\x5d\x10\x2f\xc1\x8b\x79\xd2\x66\x52\x91\xa8\xca\x8e\x59\x4b\xc3\xd8\x40\x05\xcd\x28\x62\x69\xf3\xc9\x90\x2a\x0d\x33\x4f\x36\x17\xb5\x3f\x9f\x76\xab\xf4\x5a\x4b\xb8\x55\x06\xfc\x3b\x06\x14\x0e\x4f\x04\xa5\xc2\xb1\x07\xcd\x16\xc3\xfd\x0d\x33\x25\xc6\xa4\xba\x7f\x1d\x9c\x47\xb3\xb9\xfd\x7e\xd3\xb0\x5a\x8b\x11\xde\x11\xf8\x3c\x4a\xb9\xd2\xa7\xc6\x73\xd4\x6b\x3d\x60\x86\xfb\xf7\xc0\x30\xe8\x06\x51\x79\x72\x66\x82\x7e\x27\x52\x11\x5e\x41\x49\x45\x61\xe1\x68\xa7\x01\x2e\xb2\x74\xc4\x4a\xf4\xae\x0d\x04\xce\x7d\x21\x46\xb2\xc1\x79\x76\xdd\xce\x54\xfb\x17\x42\x15\x92\x59\x6e\x76\xf2\xac\x3a\x79\x9b\x82\xe5\x7e\x4b\x58\x30\x85\x6a\x28\x84\x96\x4f\x80\x75\x30\xac\xe2\xa1\xa1\x3c\xec\x60\x92\xdf\x66\x39\x16\xb6\xf2\x8c\xe6\xf1\x68\x20\x52\xfa\xa8\xc8\x5a\x5a\xab\xa1\x0d\xb7\x53\x91\x91\xd2\x36\x15\x74\xd8\xea\xec\xc3\x6b\x77\x29\x76\x8e\xbe\xec\xcf\xc7\xd8\x1f\x38\x9a\xe7\xde\x1e\xff\x10\xc1\x2b\xc0\x97\x55\x0d\xa0\x3e\x26\x85\x89\xaf\xea\x3d\x64\x10\x52\x7c\x78\x63\xb1\x21\xcb\x11\x41\xca\x6c\x40\x17\x24\x91\x40\x64\x1d\x88\x99\xcd\xc3\xe2\x64\x94\x8c\xb2\x6c\x50\x32\x77\x97\xa2\xc5\x3f\x18\xe1\x72\x9b\xa4\x6a\x94\x4f\x5b\x06\xf8\x49\xcb\x1d\x8a\xa1\x01\xa9\x69\xa9\x3d\x98\xb1\xdc\x95\xe8\xb8\x09\x48\x46\x31\x3a\xf4\x28\x1d\xe2\x4d\x56\x78\x7d\x75\x82\xd9\xd9\x8c\xba\x29\xa2\x42\xa9\xf9\x7b\x09\x63\xf7\xf6\x28\x3b\xb1\x16\xed\xb8\x32\xeb\x6c\xab\x60\x06\x28\xba\xfb\x2c\xc8\x6d\x91\x6e\x2b\x08\x71\xd3\x63\xda\x65\x78\x92\x92\x16\x7a\x95\xeb\x1d\xd4\x4c\x6c\x2e\x56\xee\x38\xad\x7a\xcf\xac\x48\xec\x12\x3d\x93\x4d\x3b\x34\xbe\x87\xce\xe2\x13\xfb\x69\x74\xec\x9b\x43\xb6\xbd\xb9\x20\xe5\x92\x8e\xe6\x08\x40\xf2\xf0\x09\x8f\x02\xa4\x26\x48\xf0\xa7\x15\x1f\x45\xe8\xd5\xf5\xf4\x63\x41\x27\xf6\x5d\xd6\xda\x63\x57\x61\x54\x1b\x4e\x2f\x0f\x6e\x99\x16\x40\xdb\xb7\xda\xc0\xa3\xd1\xc0\x6b\xa3\xf2\x0c\x08\xe5\x49\x8f\x11\x27\x5f\x6f\x8b\x6a\x27\xee\x3d\x78\xc9\xc3\x02\xbf\x20\x70\x9a\x88\x4f\xd9\x2a\x8d\x12\x45\xf4\x41\x4e\x9f\x28\x4d\x98\x54\x9d\x46\x6c\x8e\x4e\x89\x90\x76\x5e\xcb\x4c\xe9\x02\x45\xbf\x81\x04\xfd\xc6\x99\x64\x09\x2d\xf1\x2c\x7d\x26\x49\x71\x21\x1f\x50\xa7\x52\xc2\xde\x6c\x9e\xe9\x8c\xcb\x25\xbc\x5a\x93\x49\xe8\xa1\x26\x53\x9d\x2e\xaf\x04\x81\xa0\xb7\x0d\x35\xa6\xc7\xce\xab\x03\x03\xe1\x8f\x24\x47\x84\x07\x27\x12\x61\x3c\xf8\xf9\xe5\x0b\xcc\x14\xcb\x56\xfa\xf7\x8f\x3f\x3c\x13\xd7\xc8\x4e\x9a\xc6\x7e\x3e\xca\x50\x64\x56\x4c\xd0\x88\x86\xf5\x19\xfb\xb3\x09\xc8\x82\x87\xf3\xf0\xde\xb6\xdf\x76\x43\x5c\x53\x64\xaa\x68\x50\xd3\xf4\x24\xcb\x46\xcc\x3a\x99\xb5\x59\xb7\x4a\x1b\xa4\x32\x6e\x93\xa2\x94\x01\xab\x22\xfd\x82\x3b\x4b\xbf\x5f\x63\x3c\x0a\xd7\xd1\x03\x1a\x9d\x63\xbe\x84\x97\x95\x26\x9c\x26\xb7\xc3\x15\xbd\xd3\xae\x52\xe1\x56\xe9\xf3\x70\x2b\xdc\x59\x62\xa0\x08\x3c\xb9\xf0\x28\x9e\xa6\x6f\x01\x29\xc3\xe5\x52\xe6\xfc\xf6\x45\x3a\xda\x01\x4a\x30\x50\x80\xea\x2a\x05\x53\x3c\x06\xd5\xac\x58\x9c\xe5\xf9\x18\x05\x38\xa1\x48\x4c\xdc\xc7\xab\x23\x88\x29\x00\x4e\x0c\x67\x39\x32\x49\x2c\x43\x2e\x26\x7c\x90\x70\x26\x78\x61\x9a\x1f\xef\xf2\x01\x48\x9b\xcd\x4a\x58\x79\xe1\xa0\xc8\x4a\x90\x77\xa1\x31\x86\xc5\xb1\xda\x61\x21\xb7\x08\x2a\x7c\x15\x9b\x8f\x1e\xb9\x71\xf6\xfc\x19\x52\xf9\x4e\xc7\x99\xf4\xe8\xd6\x78\x54\xa6\xb5\xa5\x1a\xa3\xe2\x9d\x8e\x43\xe4\x4e\xd5\x80\x15\x98\x68\xc7\x01\xd6\xbd\x55\xc5\xc7\x00\xb3\x26\x42\x35\x66\xa7\xe3\x61\xde\xcf\xa7\x42\x32\x52\xcb\x04\x10\xe4\xa0\x10\xe4\x19\xb8\xa1\x9e\xe9\x77\x8f\x8f\x3e\xd8\x9b\xfb\x26\x68\x88\x27\x19\x95\xa2\x75\xb6\x6e\xe1\xf6\x6d\xe1\x67\x65\xc0\xb6\x27\x80\xe7\x17\x6c\x5e\x1d\x35\x56\x70\xdb\x7b\x6f\x30\x00\xe1\x2e\xea\x53\xf0\x1b\x09\x3c\x8d\xa0\xf4\x3b\x2f\x91\x8b\x53\xef\x2a\xac\xc5\xc7\x42\xdf\x92\x5e\x4a\x00\x01\x48\x73\xfb\x19\x92\x70\x58\x18\x00\x41\x54\x73\xa0\xdd\x71\x7a\xc8\x6f\xa4\x31\xc5\x17\xbe\x13\xa4\xa1\xc7\xfc\x3a\xe1\xce\x66\xf2\x2a\x23\x21\x11\x63\x06\x2b\x3d\x4a\x4b\xd1\x1d\x94\xca\x65\x01\x58\xe4\xed\xa8\x38\x49\x8e\xcc\xff\x8f\x67\xe6\x40\x9c\x64\x2d\x73\x6d\x02\x56\x1f\xc8\x8b\x8e\x48\x9c\x78\x56\xfc\xc8\x3e\xb3\xcd\xf0\x0b\x80\x48\x08\xe0\x15\x14\x69\x2a\x98\x3c\x8b\x0b\xe6\xc4\xb5\xee\x03\xb6\xc1\xb6\xbb\x28\xa9\x29\x66\xe6\xa8\x94\xe5\x8c\xe7\x1b\x5a\x1c\x87\x78\xcc\xbb\x07\x04\xf7\xd8\x4d\x54\x86\xe6\xca\x17\x9a\x67\x18\x92\x38\x34\x15\x56\x7b\x1d\xab\xf6\x9a\x80\x1b\xd6\x5b\x03\x42\x84\x8e\xb0\x76\x24\x17\x23\x22\x16\x56\x6f\xa6\x20\x42\x6c\xf8\x08\xac\x82\xe2\xb8\xb0\x82\xa7\xe0\x2e\xa9\x5e\x22\xf6\x2c\x5d\x55\x8b\x22\x99\x8d\x38\xa0\x99\x96\x91\x61\xec\xc0\xe5\x66\x36\xc3\xef\x70\x11\x00\xe0\x41\x76\x7b\x52\x8b\x72\xaa\x48\x1b\x6e\xfe\x7a\xc4\x11\x10\x8d\x9f\x29\x9d\x18\xee\x72\x74\x8b\xcf\x89\xd7\x1e\xb0\xa5\x44\x96\xfc\x82\x68\xe2\xb5\x6d\xc4\x29\x64\x2e\x38\x61\x7c\x12\xb7\x83\x9a\xaf\x23\x35\x5f\xc7\x6a\xbe\x56\x97\x28\xcb\xf2\x81\xcc\x04\xe8\xc3\x2b\xf3\x28\x2d\x09\x71\xc8\xbd\x69\x61\xf3\x1e\xfb\x9e\x27\x63\x46\xb5\xdf\x50\x5f\xdd\x54\xa4\xc8\x5f\x4c\x50\x15\x5a\xa9\x74\x06\x35\x22\x6a\xeb\xdb\x3e\x99\x62\xaa\x53\x3b\x10\x37\x4e\xcd\x93\x13\x49\x45\xd3\x9e\x04\x0c\x38\xe4\xba\x60\x35\x76\x6f\x54\x63\x0c\x8c\x58\xd1\xa4\x87\x5a\x4b\x8d\x66\x5c\x84\x43\x19\x17\x95\x71\x5c\xe2\xad\xfc\xd3\x78\x40\xa6\xd8\xde\xe1\x02\x60\x5c\xf6\x56\x96\x16\xc2\x6b\x39\x02\xf4\x6d\x05\xa7\x5c\xcd\xd2\x91\x0d\xe8\xc2\x92\x94\x01\xea\xb7\x24\x65\x88\xdb\xe5\x64\x79\x2c\x80\xe5\x29\xb3\x77\x0a\x7b\xbe\xe0\x67\xdc\xd6\xe1\x51\x51\x4e\xa1\xa5\xfe\xdb\x16\x4b\x0d\x8e\xd2\xf1\x38\x33\x2b\x79\x63\x63\xe3\xd8\xdc\x81\x07\xe0\xc4\xde\x59\x86\x8a\xdc\x9c\xea\xe7\x48\xea\xd1\x1a\x5b\xe1\x18\xd0\xf8\xa0\x7a\xe1\xb2\x54\x0d\xa4\x4c\x6d\x63\xfb\x19\x68\x55\xa0\xbc\xe0\x6f\x37\xbe\xdd\x86\x6b\xfc\x18\x15\xc5\xc9\x8e\xbe\x30\x34\xdd\x5b\x10\x12\x97\x7d\x73\xf0\x49\x9d\x0b\xdf\x8a\x9c\x12\xa9\xa5\x8d\x0b\x50\x9a\x1a\x25\x6a\x42\x86\x39\x04\x53\xea\xad\xf5\xf5\x74\x02\xb4\xc5\xf1\x18\x8d\xf2\xd1\x96\x7a\x7f\x58\x1c\xae\x5f\xdf\xd8\xfc\x7a\x7d\xe3\xe6\x3a\xd6\x59\xa3\x3a\x6b\xf9\x68\xed\xb8\xd8\x37\x6c\xc2\xda\xfe\xc4\xd0\x07\x06\x71\xae\xdb\xad\xf7\xed\x4d\x3d\x83\x53\x9c\x54\x6b\x2f\xbc\x52\x4c\x91\x88\x57\x12\xef\x9a\x89\x41\x0d\xd2\x7c\x6c\x59\x4d\x87\xc8\xc6\x59\xf1\x36\x7a\x07\x7a\x0d\x78\x06\x7f\xa7\x7f\xce\x5a\xb4\x30\x29\xad\x7b\x32\xc8\xde\xe5\xfd\xcc\x5c\x97\x27\x5d\x20\x9c\x48\x44\xa2\x36\xc8\xbb\x2e\xea\x0d\x6c\x79\xbe\xdb\x1f\x3e\x0b\xa4\xfe\xc0\xb5\xb0\xa1\xd4\x40\x97\x06\xe0\x61\x7f\x8e\x76\x23\x48\xf7\x59\x59\x49\xcf\xdc\x6b\x68\x32\x62\x45\x4d\xe4\x50\xa1\xa0\x8e\x75\x41\xa7\x49\x4e\x1d\xdc\x32\x35\xf3\xdf\xf1\x05\x81\x8c\x4f\x58\x69\x83\x2b\xa0\x84\xa8\x9f\x02\xa7\x08\x0d\xd9\x27\xa2\xd2\xc0\xdf\x68\x86\x5a\x97\x13\x68\x40\x78\x1d\x98\xd7\x7a\x45\x62\x40\x5d\x11\xdc\x83\x48\x4e\x34\x83\x00\x46\x27\x99\x9c\xef\x88\x98\x27\x7e\xfe\x6b\xb8\x52\x87\x17\x36\x14\x7b\xb9\x51\xc1\x02\xf5\x8f\x3b\x80\x47\x11\xc3\x31\x1f\x40\xb2\x4d\x74\x5f\x41\x3e\x9e\x89\xc7\xcf\x4e\xf3\x72\x4a\x12\x5a\xa0\x7c\x98\xca\xc6\xe9\x49\x33\x13\x2b\x9c\x22\x35\xfc\x74\x68\xda\x35\xdc\x04\x30\xe5\xed\x61\x6e\x8e\x2e\xb8\x04\x38\x44\x32\xba\x4b\x7e\x92\xbb\x49\x36\xed\x77\x1c\x3e\xee\x1b\x8e\xdc\x5a\xa5\x69\x3e\x0d\xd2\xcd\x1c\x7a\xc2\x38\x43\x89\x3f\xfe\x48\xc0\x9f\x88\xcf\xcc\x3c\x78\xf5\x4a\xf1\xe5\x68\x26\x1e\x3c\xf5\x11\x1d\x1f\x92\xfd\x0d\x45\xa5\x03\xa1\xed\xcd\x6e\x4e\xe6\x38\xc1\x7d\xfc\xf4\x25\x18\x39\x42\xca\x24\x1b\xb2\xee\x27\xa4\xa7\xfb\x65\x31\x9c\xa1\x75\xa7\x88\x82\x15\x7a\x7c\x4c\x38\x14\x51\x99\x01\x10\x14\x80\x58\x81\xb8\x2c\x22\xd0\x0b\xa9\x9a\x59\x09\x9c\xec\xc9\xc4\x50\x16\xd0\x21\x1c\xe8\x5b\xe5\x38\x1d\xdd\x81\x8d\xb9\x15\xbc\x90\x99\x3e\xa8\x7a\x1f\x1f\x35\x50\xa5\xda\xad\xb9\x6b\xf3\x76\x4c\xa1\x5d\xc9\x6a\x80\x07\x43\xc1\x09\x08\x02\x9c\x26\x31\x69\xff\x94\x2c\xe6\x1a\x70\xf9\xd3\x2d\xe7\xb3\x03\x2f\xcd\xe4\x2e\xe7\x24\x11\x4e\x26\xd9\xb2\x99\x9e\xa8\x05\xd9\x3e\x43\x2e\x99\x1e\xad\x32\x72\xbc\xbf\xf9\x96\xf3\x4a\xb2\xb0\xbf\xd7\xba\xbf\x0a\xe9\xfd\xb3\x93\xa0\x3f\x7e\x44\x7e\xc4\x44\xce\x5a\x6e\x9b\x95\xcf\x92\xbf\xdd\xdc\xb4\x2b\x6b\xfd\x73\x58\xd7\x1c\xc7\x06\xb7\x4c\xf2\xf2\x6d\x9e\xad\xa3\x5f\x9c\x35\x7b\x41\xad\x23\x5f\x58\xae\xdf\xdc\xfc\x1b\xfe\x32\xa5\x01\xd0\xd6\x36\x37\x6e\x7c\xfd\xdd\x77\xd7\xbf\xfd\xce\xed\x0a\x60\x54\x10\x14\x6a\x43\x37\x4c\xbc\xd7\xa7\xa7\x84\x16\xaa\x39\x8a\xf0\xc8\x91\x34\x7c\x7a\xc8\x93\x4e\xfb\xfd\x59\x57\x9d\xaa\xae\xdb\xed\xae\xea\x42\x4b\x7c\xcc\x82\xf3\x3b\xb4\x59\xf3\x2a\x0b\x85\x28\x6f\x01\x05\x1b\x61\xae\x94\x89\xa6\x3a\xd6\xd4\x91\xa2\x69\xc9\xd8\x81\xfb\xf7\x30\x00\xa5\x79\x97\xa5\xe7\x21\x08\x80\xd7\x7a\x0b\xf2\x04\x4c\x01\xee\x70\x35\xd0\x36\xa4\xd3\x4d\x5a\xc1\x26\xb5\xba\x76\x3c\x61\xd6\x9a\xcc\xa7\xe5\xb9\x26\x97\xd4\x6e\x63\xb5\x6c\x10\xa9\xc5\xcb\x76\xe6\xf1\x6b\x28\xa5\x04\x61\x07\x0c\xdd\x5f\x5f\xb1\x1a\x07\x52\x08\x0d\x24\x0f\x86\x06\x35\xb3\xf8\x8f\xd4\x06\x4c\xdb\xf8\x2e\xe0\xee\x2d\xa0\x9f\xf0\xa5\x26\x7f\xd7\x4d\x66\x43\xc2\xba\xfa\xaa\x66\xe5\x80\xa1\x81\x28\xf1\xe1\x49\x49\x0f\x64\xf1\x8a\xd1\x70\x1e\x5b\xd5\x4e\xd7\xdf\x3c\xf6\xe7\xe9\xc8\x53\xeb\xf9\xd3\xfe\xb4\xe7\xdb\x23\x4d\xb5\x7f\x7a\x48\x71\x22\x6c\x4d\xd6\x70\x29\x97\x14\x48\xba\x7f\x12\xc7\xf3\x1e\xcd\x1d\xb4\x85\x82\x84\x6a\x29\x7d\x69\x92\xf3\x51\xf0\x9d\xe5\xbc\x4d\x81\xdb\xac\xef\xba\xab\x9e\xa7\x2a\x48\xfb\xbe\xe2\xe9\xed\xbb\x65\xdc\x6a\xad\x5f\xbb\x6a\x7a\x7a\x50\x8c\xe7\x64\x0d\xd9\xee\x77\x12\x43\x83\xde\x4c\xfe\xcb\x6c\xd5\xcf\xe9\xb4\x24\x25\xca\x27\x86\x3e\x1b\xc1\x8b\x1d\xb8\x6b\x24\x59\xda\xd3\xc7\x3b\x92\x9c\xb4\xcd\x47\x07\x14\x8d\x81\xe0\x60\x02\xf7\x7f\xb2\xc1\x09\xd5\x67\xa4\x94\x17\xeb\x6e\x1a\x2b\xd7\x3c\xb7\x57\xee\xd0\xa0\x1f\x3d\x7b\xa8\xd0\xe7\x16\xd8\x4e\x71\xec\xd4\x43\x70\x9f\xe7\x3b\x0a\x6a\x8e\x0c\xb8\x02\x41\x2d\x0f\x93\x20\x28\xa0\xb8\xf2\x33\x89\xec\xb7\x0f\x94\x65\xf3\xd1\x2c\xb3\x9e\xfb\x20\xbf\x45\x4a\x83\x2d\x64\xa9\xd8\xec\x1b\x5a\x83\x33\x2b\x56\xdf\x7e\x96\xb4\xc6\x63\xff\xca\x0c\x3e\x01\x63\x21\x1c\xb9\x75\xfa\x18\x0d\x3c\xe8\xbb\x67\xc2\xb6\x3c\xef\x4c\xc8\x89\xef\xb5\xea\x7a\x70\x4b\xc8\xd4\x2d\xbe\x24\xe1\x98\x82\x9e\xd9\xcb\x59\xcd\xd0\xc3\x70\x89\x2e\xc7\x2e\x59\x10\x23\xb1\x0d\x61\x11\x61\x4d\x20\x0f\xc3\x20\xda\x70\x52\x7a\x55\x25\x86\x54\x65\xe4\xa6\x86\xf3\x03\x0f\x0e\x0e\xc5\xd3\x2b\x97\xec\x95\x33\xf0\x2c\xd4\xde\xec\x88\x51\x66\x99\x1e\x90\x8f\x8a\x31\x0a\xdc\x9c\x7f\xb6\x83\x82\x4d\xd8\xd7\x13\xe6\x94\xf2\x83\xf9\x8a\x8a\x4e\x4c\xf0\x8f\xf1\x89\x5b\xd6\xf3\x28\x9a\xee\xfb\x96\x58\x38\x83\x8a\x71\x96\xeb\x69\xa9\x91\xb0\x1f\xe9\xff\x7a\xa5\x47\x40\x7d\xc6\x46\x40\xbf\x7b\xe9\xf1\x00\x7b\xa7\x4f\xcf\xd1\x5c\x37\xd9\xd5\xce\x9d\x3c\xb7\xb8\x7a\x6c\xe8\x29\xf2\x0c\x31\x07\x62\x82\xef\x2f\xe0\x60\xcf\x9e\xcd\x9d\x82\x40\x15\xbc\x90\x63\x8f\x30\x19\xf3\x1b\x98\x4d\x80\x31\xf1\x8a\x6b\xd6\x1b\x1e\xa6\x13\x78\x34\x7f\x34\x99\x14\x93\x76\xcb\x8f\xf3\x69\x08\x23\x20\x4d\xf7\xe9\xd1\x0e\x94\x2e\x40\xa1\x10\x9a\x00\xea\xd4\xad\x05\x79\xb9\xb4\x50\xa0\x7a\xc7\x49\x55\x76\x65\x61\x34\xd1\xae\x8b\xf9\x49\x78\x04\x78\x09\x46\x29\x06\xf8\x4a\xfe\x69\xae\xae\xdb\x6e\xb6\x1c\x88\xd4\xc3\x37\xd0\xdb\xa6\xa1\xbd\xa2\xf8\xa6\x14\x7c\x83\x9c\x8a\x46\x38\x25\x22\x1c\xe8\xc9\x8d\x16\xbe\x18\x07\xb4\xa1\x02\x87\x4b\x8e\xa1\x36\x28\x5a\xc5\x6a\x57\xa6\x05\x9c\x35\x40\x67\xe0\x6e\x07\xda\xb0\xdf\xdb\x72\x92\xec\x22\x4e\x8b\x6d\x74\x5e\xc5\x10\xf1\xdd\x52\x41\x5c\xd9\x4d\xd5\xcb\x6c\x0c\xac\x22\xbe\x3e\x88\x5c\x25\x65\x77\x78\xa8\x83\x6f\x38\xe3\x51\xfa\x2e\x3f\x4c\x91\x35\x4b\x4f\xd2\x39\x54\xdb\xcf\x0e\x40\xfe\x81\xcf\x2e\x13\xc3\xe0\x17\xc0\xde\x00\xdd\x47\xae\xa9\x80\x70\x33\xfc\x30\xb1\xb1\xc5\xf0\x1d\xb2\x22\xe6\x52\x08\x5c\x8f\xda\xbd\x7c\xa0\x3a\x6e\xa3\x4e\x4d\x15\x12\x74\x99\x6d\x3b\xd7\xa5\x42\x94\x44\xdc\x4b\xe6\xa3\x77\x20\xa4\x19\x55\x5d\x4c\xa2\x23\x4b\x9b\x6d\xfd\x44\xa6\x23\xc3\xe3\x3f\x7c\xfe\x34\x5e\xfe\xd1\x69\xd6\x9f\xc1\x20\x1e\x8d\xde\xe5\x93\x62\x04\xb0\xd1\xea\xf4\x6c\x2d\xee\xf5\x47\xc3\xe1\x16\x93\x39\xd2\xdb\x2b\x56\xa9\xe6\x9a\xa1\xb7\xdc\xb3\x13\xdd\x3d\x20\xa1\x32\x5f\x93\xdc\x69\x93\x1c\x51\x65\x64\xab\xb8\xde\xb3\x02\xf8\x7b\x7e\x33\x63\x45\x52\x64\x0d\xd3\xc1\x1a\x90\x53\x54\x16\xe4\x49\x04\x62\x5b\xc9\x66\xd7\xeb\xf8\x15\x06\xed\xc5\x57\x39\x42\xa9\xc8\x40\xc3\xfb\x2d\xf6\x3e\x8f\xf6\x0d\xed\xed\xa3\x82\x81\xdd\xc0\x7d\x0c\x7c\x20\xde\xfa\x64\xf1\xda\x76\xfe\x86\x04\x7e\x40\x18\x02\xb6\x82\x97\xa1\x87\x7d\x09\xcf\x9b\x26\xa6\x5c\x4b\x11\xa9\x0f\x0b\x56\x9f\xcb\x27\xe5\x14\x98\x4e\x54\xff\x91\xba\xec\x40\x10\xd4\xe5\xa4\x02\x29\x16\xcd\xc0\xc9\x11\x8c\x7b\x58\xf4\x19\x92\x49\xe4\x34\x64\xb7\x57\xac\xfc\x15\x34\xb4\x06\xa7\x9f\xfa\x66\x0f\x24\x47\x6a\x94\x6d\xa6\xd9\xe2\xfe\x79\xb9\x29\x15\xba\xa4\x16\x28\x56\xb7\xae\x7f\xfd\x75\x77\x35\x02\x69\x86\xb6\xfb\xf6\x06\xc2\xf4\x52\xd1\x4e\x22\x30\xfd\x06\xaf\x09\x10\x59\x3f\x38\xca\x30\x34\x85\x43\x96\xf9\xc8\x70\x04\x23\x88\x73\xfc\xa0\x30\x3f\x27\x33\xf6\x72\x48\x6f\x55\x36\x3b\x91\x1f\x06\xfc\x74\x41\x0c\x8c\x1c\xbb\x05\x78\x57\x51\x53\x23\xa5\x7b\x2a\x41\x41\x80\x75\x57\xd9\xc1\xb8\xc9\x76\x88\x4e\x3b\x18\x1c\xd8\x79\xc2\x22\x37\x5c\xba\x2d\x5e\x58\x7b\x55\x8b\xeb\x45\x51\x24\x89\xe1\x52\x89\x71\x50\x09\x1e\x3d\xc8\xca\xfe\x24\x1f\x4f\x0b\x1b\x0d\x04\x83\x47\xbb\xe4\x5e\x66\x4e\x5d\x36\x41\x79\xef\xed\x9a\x74\xb8\x7b\x40\xf0\xee\xd5\x33\x34\xd0\x41\x7e\x38\x93\x9a\xf0\xd0\xba\x4d\x74\x18\x1a\xb6\xb6\x00\x0e\x5d\xf1\x8e\xae\x7a\x32\xc9\xa7\x5e\x35\xbe\x3c\xbc\xb9\xcf\xed\xcc\x55\x4d\x73\x13\xe8\x6f\x5a\x60\xe1\xb3\xdc\x8a\xaa\xfd\xc3\x85\x9b\x16\xa8\xfe\xd4\x45\x29\x66\xde\x17\x25\x36\x1c\xae\xcb\xee\x54\x17\x5f\x35\xe4\x48\x5a\xdd\x64\x87\xe6\xec\xb5\xdb\xd4\x8a\x3f\x84\x6d\x19\xba\x2a\x01\x61\xb5\x0d\xa3\x84\x2f\x19\xeb\xd7\x92\xff\x29\x8f\xe0\x55\x6e\xed\xe7\x8d\xef\xbe\x16\x0f\x93\x2f\xd2\xe9\xd1\x4f\xd3\x7c\x18\xb8\x27\xb6\xc9\x88\x4a\x14\x44\x65\xe3\x57\x59\x3a\xe9\x1f\xb5\x27\xe0\x61\x06\xec\xa5\xa7\x47\x40\x79\x75\x93\x7f\xcd\xb2\xc9\xdc\x3a\x54\xa0\xb3\x03\x48\xcf\x90\xa6\xd3\x49\x96\x31\x02\x32\x14\x04\xb8\x00\xc5\x9c\x63\x90\xf9\x43\x93\xc3\xf9\xda\x28\x2b\x81\xf3\x45\x65\x10\x71\xbc\x8b\xac\xeb\xcb\x02\x2d\x43\xcd\xe8\xe0\x47\x4f\xa5\x89\x2f\x16\x95\xa4\x9f\x21\xb1\xa9\xae\x6a\x84\x64\x12\x11\x17\xaa\x40\xb6\xba\x36\x42\x2f\xaa\xdb\xc9\x57\x5f\xe5\x4e\xf2\xe1\x4a\xfa\xd5\x90\x67\xe2\x32\xfe\xa8\x7a\x79\x29\xde\x30\x0d\xf4\x7b\xe9\xe6\xe6\xf9\x01\xc4\x57\x9d\xc4\xb2\x01\xde\xe2\x95\x88\x82\x29\x02\x0f\x08\x03\x27\x3d\xdd\x05\xce\x10\x4f\x9a\xdd\x15\xd7\x7a\x75\x6b\xdc\x1c\x48\x0c\x4b\x2b\x2a\x77\x93\x6c\x13\xa9\xe3\x0c\xae\xa2\x98\x16\x6f\x0e\x2a\x06\xe2\xa4\x13\x7c\x95\x18\x98\x7b\xad\x67\x5b\xa2\x1d\x9b\xd0\xd2\xcd\x46\x06\xc4\x0e\xa6\x04\x1c\xf6\xc1\xd0\x4a\x2f\xb0\xac\xa4\x9e\xad\xc8\xdf\xe2\x7f\xe8\x59\xc1\x82\x14\x6a\x4d\x86\xb2\x9d\xc0\x15\x8a\x6a\x20\xbc\x8c\x04\x0a\x0c\x25\x9c\x28\x5b\x42\x79\x3a\x51\xe0\xc4\x2b\x68\x98\x89\x36\x2a\x94\x02\x68\x59\x68\x37\xb7\x11\xfa\x67\x7d\x81\x39\x5e\x8d\x1e\x2c\xa7\x5b\x54\xa7\x8a\xc4\x73\x03\x8c\x8e\x9e\x66\xdb\x6e\xdd\xa9\x03\x5e\x7f\xc3\x99\xf0\x99\xd1\xcd\xb2\x57\x59\xba\xa9\xd9\xbc\x64\x15\xee\x82\x03\x80\x8b\x55\x5e\x7c\x5c\x89\xbb\x2b\xe2\x1b\x8c\x80\xc6\x9f\xb1\x97\x2a\x53\xf6\x8b\x2e\x35\x67\xaf\xca\x25\x4e\xda\x6b\x57\xcd\xfa\x49\x5a\x82\xdd\x18\xbc\xf3\x4d\xb7\xcc\xfe\x13\xe4\x0b\xd8\xc9\x26\x2f\x1c\xf6\x24\x36\x5c\x59\x06\xaa\x7d\xd1\xb1\xf3\x60\xa5\x1a\x3a\xed\x3c\xa3\x8b\xf8\x29\x9f\xc0\x76\xf8\x5c\x63\xbf\x17\xf4\x30\xf1\xd0\x56\x40\x7a\xf0\xeb\x1b\x36\x21\x14\x1d\x49\xf6\xb8\x39\xb8\x87\xf9\xe7\xb6\xce\xe5\xb5\xa2\x1f\x2a\x07\x3b\x35\x19\xf8\xaf\x4a\x9f\x78\x38\xb6\xb4\x3e\xc1\x34\x9d\xd1\x7e\x4a\xf8\x94\x64\x26\xbb\x34\x60\x0c\x05\xde\x02\x84\x8e\xb9\xad\x88\x9a\x3b\xed\x2c\x3d\xdb\xe0\x6a\x0d\xb2\xf1\xf4\x68\x8d\x6e\x83\xd4\xc7\x41\x87\x39\xe8\x6c\x61\x52\xcb\x2a\xe8\x0b\x62\x4a\x0f\x53\x20\xab\x54\x41\x98\x3b\xe2\x25\x6d\x11\x42\x9d\xe4\xa0\x5d\xe0\x5a\xe8\xf7\x41\x6d\x9e\x06\x4f\x5a\x47\x5c\x8e\x75\xed\x8f\x53\xe7\x18\x64\x9d\x6f\x10\x43\x78\x28\xd2\xdc\xce\x91\x20\xad\x24\x28\x0b\xd4\x29\xdc\xb6\x38\x30\x65\xc2\xfc\xbf\x61\xc9\x11\x0e\x2c\x5a\x84\x2a\xb2\x23\x15\xb0\xae\x29\x2f\x28\x9f\xa0\x90\x33\xe2\x57\xda\xc4\xbf\xcd\xb8\x26\x55\x05\x54\xe0\x5f\x6f\x91\xbb\x64\x22\xf7\x5a\xf5\x2a\xb1\x5d\x57\x11\x3b\x22\xf4\x3d\xcf\xcd\xd9\x53\xca\x65\x42\xa4\x42\xf7\x4b\x36\xc6\x3f\xb0\x0b\xb1\xba\xb5\xf9\xdd\xd7\x48\xc8\x2f\x15\x6b\x2d\x42\xc8\x5b\xf3\x84\x80\xb4\x91\x64\x0a\x4a\x40\x0c\xfc\xbd\x04\x23\xa3\xe3\x52\xaa\xf7\x65\xe4\x95\x4c\x5f\xf9\x01\x5d\x40\x3f\xbd\x7c\x02\x2c\xf8\x8a\x67\xeb\x82\x9f\xb4\x3d\x4f\xe7\x4f\xf2\xd1\xdb\x3a\x23\xbe\x6b\x74\x61\x4a\x08\xf6\x04\x51\xe1\xa4\xf7\x8c\x05\x03\x06\xca\xf6\xba\x52\x8a\x04\xde\xe8\xe6\x80\xec\x64\x10\xd4\xae\xf1\x7d\x8a\x29\x31\x0d\x05\x29\x80\xc7\xda\x89\x12\x76\x8a\x76\x2b\xc5\xee\xe0\xcd\x04\xa6\xb2\x85\x6e\x74\x0c\x7a\x68\x25\x67\x2e\x09\x77\xb7\x45\xb2\x75\x6a\xea\xcc\x8e\x48\xc5\x51\x53\xa6\x88\x62\x63\x28\x29\x49\x72\x2b\x35\x8c\x2f\x0e\xfc\xf6\x7b\x25\xbb\xc7\x94\x33\xeb\xb8\xe1\xea\xad\xf5\xf4\x8e\xab\xa6\x3a\x5c\x71\x46\x80\x4c\xa3\xaa\x05\x62\x96\x1f\xfd\x36\x9c\x4e\x3d\x97\x4e\x08\xae\x93\x2d\xb7\xed\x84\xd6\x74\xb4\x3a\xfb\xca\x6e\x39\xf7\x97\x8c\x39\x0c\x1a\x90\xb7\x5f\xd8\x64\x42\x2d\xb4\x7d\xfc\xae\x1e\xe0\x27\xaa\x4e\x67\x82\x2a\x98\xc5\x04\xf7\x47\xa0\x2e\x61\x50\x12\x1d\x6c\xf2\xcb\xe3\xf8\x7d\x78\x0c\x02\x08\x57\x88\x45\x92\xda\xd3\x22\xb8\x1d\x82\xfb\x0a\xd7\x92\x27\x2e\x53\x6b\xa8\xbc\xdd\x30\xd9\x84\x84\xf6\x0c\xde\xe9\x5c\x64\xb4\xa1\x1f\x92\x49\x76\x00\x12\x94\x94\xaa\x0f\x01\xb4\x59\xfb\x98\xd0\xb6\xf5\x8e\x44\x0b\x03\xab\xe1\xcf\xf5\x47\xd3\x42\x30\x57\x48\xba\xf0\x5c\x6b\x2a\x47\xe6\xba\x63\x61\xdf\x7a\x95\x81\x6d\x12\x3b\xde\x81\x5c\x39\x56\x04\x09\x22\xba\xf1\x0c\x38\xa4\x43\x6a\x21\x45\x0a\x01\x2a\x99\x71\x14\x5a\x7e\xc3\x21\x62\xed\x4c\xf5\x39\x53\xb3\xf5\x8e\x5f\xed\x8c\x63\x53\x5d\x50\xf3\xb2\xa6\x4b\x0e\xf4\xec\x84\xb5\xd6\x36\x54\xf6\x85\x56\xe1\xa4\xd9\xfb\xde\xcf\xb9\x07\xcd\x2a\xf5\x7c\x53\x6e\xae\xb8\xdc\x8c\xad\x0c\x95\xd0\x34\x0f\xf4\xb0\xb8\xef\x4b\xd9\x28\x21\x34\x5a\x8a\x0d\x4a\x4a\x36\x49\xad\x1c\x72\xb2\x57\x98\x20\x20\xb8\xc2\xf0\x9d\xf1\xbb\xa5\xe2\x1c\x5e\x82\x7c\x75\xc9\x70\x3d\xff\xf2\xae\xc4\x7f\xd1\x4d\x68\xc9\x6c\x70\x09\x9c\x0f\x33\x0a\x9b\x01\xb2\x9e\xf5\xad\xf6\x6e\xba\xf6\xfb\xbd\xb5\xff\xff\xcd\xdf\xf7\xf8\xd7\xc6\xda\xf7\xe6\xe3\x5a\xe7\x8f\xdd\x6b\xbd\x76\xe7\xd7\xdd\x5f\xf7\x7e\xfd\xf5\xab\x3f\xde\x9f\xfd\xf3\xef\x7b\xeb\x87\xdb\xae\xb1\xc7\x23\xe8\x7f\x89\xb6\xee\xee\x5d\xdb\xbd\xbb\x77\x17\x1a\x8c\xb5\x60\xb6\x3b\x1f\x42\xc8\x1d\x73\x99\x1e\xa9\xe6\x7e\x85\xff\xdd\xfd\x03\xfe\xfa\x75\x1d\xff\x91\xca\x08\x39\xba\xe4\xdd\x76\xef\x5a\xe7\xef\xeb\x56\x86\x46\xd3\x1c\xbc\xc0\xf0\x4e\x23\x54\xdf\x38\xd3\xc2\x0e\x2e\xc0\xf9\x40\x8b\xc1\xbf\xca\x27\xa6\x24\xc1\x49\xa9\x34\xd7\xd1\xb2\x08\x9c\x88\xc4\x47\xda\xdd\x73\xca\xca\xf4\xea\x42\x74\x3c\x54\xb3\x4e\x2d\x23\x3b\xd1\x55\x52\x29\x16\x6e\xd8\x76\x1d\x21\x6a\xf9\x1d\x3f\x39\x51\x63\xe8\x01\x9e\x53\x85\x2a\x7c\x7a\xab\xbd\xfb\xcf\xf5\xbb\x7f\xdb\xfb\xaa\xd3\xb2\xdc\xba\x7b\x1c\x15\x4a\xf2\x76\xd2\xba\xd6\x6a\xea\xa1\x05\x1e\x19\x11\x36\x2b\xed\xf7\xae\xdd\xad\xb4\xfd\xbe\x52\xec\xd7\x5f\xe1\xf1\x33\x26\x35\x10\x0a\xb4\xb2\xec\xbb\xbc\x90\x7b\x4a\x1b\x87\xe4\x08\x86\x34\x00\x84\xfe\x32\x3b\x7c\x74\x3a\x6e\xb7\xfe\x09\x4d\xf3\xf2\x7f\x95\xb4\xfe\x0e\xee\x0d\xf3\x96\xf5\x7d\xe6\xe6\xb2\xa5\x7e\x53\xe7\x96\x3f\xe2\x71\xd6\x0f\xc2\x32\x8a\x5a\xcc\xf6\x3e\x7a\x29\xa3\x0f\x0c\xd6\xd2\x55\xec\x0d\xa8\xbe\x31\x61\xe2\x50\x5a\x5e\xde\xe3\x34\x85\xd6\x5c\x62\x5b\xb3\x26\xd6\x97\xfa\xf4\xa8\xd7\x3f\x4a\x27\xf7\xa6\xed\x0d\x7e\x36\x5f\x6f\x45\xf0\xea\x7f\x15\x39\x8c\xe6\xa4\xb0\x74\x10\xe0\xd7\x43\x54\x9d\x73\x23\xf8\x1f\x53\x4a\xf5\x0d\x9f\xe0\xa5\x7d\x3f\xe8\x35\xb5\xf0\x6c\x8e\xe9\xb5\xbf\xaf\x77\xa1\x53\x70\x91\xbd\xdf\x44\x9e\x70\xb8\x21\xb2\x83\xcb\x28\x28\x0e\xd2\x21\x86\x71\x71\x74\x96\xcf\x34\xca\xf9\xb1\x23\xd4\xe2\x01\xde\x47\x3b\xdc\x4a\x9e\x7f\xb8\xed\xf0\x6b\x30\x40\xcf\x01\x44\x64\x1a\x8f\xa8\x71\x22\xa1\x00\xb7\x4b\x9c\x1a\x37\x58\x4b\x61\x32\x01\x06\xe7\xa9\x32\x15\xa6\x42\x14\x7b\xeb\xdc\x52\x9a\xd6\x70\x0c\x09\xb1\x9b\x77\x88\xd0\x04\x97\xed\x10\x59\x4d\x16\x52\xb8\x5d\xd3\x34\x35\x26\xf8\x0a\x8c\xfd\x50\x07\x32\xd2\xf5\x51\x7c\x09\xeb\x96\xcf\x2e\x9d\xcf\x10\x6b\x0c\xcb\xcb\x87\x86\x0a\xd1\xf5\x54\x4a\x71\xc7\x16\x5f\x07\xb5\x7b\x9c\xb3\x1d\xc7\xa9\x61\x69\xbd\x43\x7e\xe3\x2c\x33\xa1\xf6\xda\xdc\xaa\x0c\x01\xd1\x3a\xa6\x55\x34\xc2\x25\x58\x8b\xd9\x6f\x4f\x20\x65\x35\x5b\x15\xf6\x33\x5c\xe4\xa3\xd4\xb4\xae\x4c\x73\x25\xb3\x6b\xc0\x16\x54\xe9\x6c\xf3\xd4\xd0\xae\x2d\x00\x88\x0b\x47\xb0\x8b\x05\xcd\x59\xb1\xf6\x14\x1d\x5f\x6d\xdb\x89\x77\x6a\xe9\x7c\x08\xc5\x8a\x71\x4d\x0e\x42\xfe\x85\xe0\x8f\xdd\xfb\xe3\x54\x50\x79\x72\x5c\x80\x98\x19\x95\x6e\xe1\x25\x93\xda\x23\x10\x02\xdf\xa2\xd0\xe6\x60\x6e\x80\x2e\xef\x27\x65\x76\x88\x6a\x6b\xdc\xb6\x6a\x15\x98\x68\x32\x4a\xb0\xd5\x46\x85\x32\xdf\x27\x1c\x86\xd7\x7a\x05\xb6\x74\xb2\x06\x2d\x2d\xc0\x0b\x04\x5c\x9e\x7e\x31\x5e\xaa\x70\xed\x88\x6a\xe2\x46\xb8\x68\x91\x7b\xd6\x23\x52\x96\xbb\x66\x6d\x92\x0c\xc3\x6a\x2a\xd2\xa5\xb7\xad\x74\x63\x1f\xcb\x69\x05\x9b\x5e\x76\x10\x2b\x86\x16\x28\xef\x84\x05\x43\xbd\xed\x6c\xd4\xcf\x62\xf7\x78\xaf\x34\x6c\x73\xd6\x5e\xdb\x64\xcc\x7d\x37\x7e\xef\xea\xb1\x70\x95\x8d\x6e\xb2\xb6\xe9\xe4\x35\x5a\x1e\xea\xc1\x9c\x28\xaa\xc8\xd5\x5b\x7f\x39\xbb\x77\xe9\x6a\x33\x57\x6f\xb3\x7c\xb0\xf5\x34\x2f\xd1\xed\xe6\xea\x7f\x94\xab\x0e\x69\x93\x93\x78\x80\x11\x48\x6f\xa9\x95\xed\x26\x0e\x1b\xc8\x4d\xaf\xe4\x5e\x0c\x6c\xdb\xb1\xc5\xa1\x25\xa1\x65\x07\xc1\x96\x6f\x97\x55\x19\xa4\xf7\x0e\x22\x40\x7c\xbb\x7a\x0e\x77\x1d\x18\x7d\xf5\xd5\x9e\x5e\x41\xbb\x00\x52\xbb\x3a\x6d\xac\x9b\xfc\x2d\xf9\x8f\xb2\x32\x65\xd7\x6c\x64\xce\xe1\x62\x37\x8c\xaf\xb2\x4e\xbc\x75\xde\x52\x9d\x75\x62\x90\x1e\x23\xa6\xe9\x6a\x6e\xbe\x96\xf9\xf6\x21\xc7\xa4\xec\xe3\x39\x2b\xe1\x45\x86\x2e\xa4\x92\xf4\x8e\xe7\x2c\xfd\x60\x29\x03\x30\x55\x29\xa8\x2d\x31\x36\x09\xae\xed\xa3\xae\xbe\xa8\x58\xf2\x42\x55\x10\x6f\xe8\xb6\x2a\x77\x13\x8a\x49\xab\x57\x93\x92\x9e\x86\x2f\x82\x3e\xfe\xd7\x4c\x82\xb5\x94\x74\x22\x4d\x00\xa7\x7f\x95\x1c\x27\x86\xb0\xf2\xe6\x5e\xb3\x68\x25\x8a\x72\x2d\xb2\x2d\x66\x24\xc0\x8e\x4f\x4a\xcb\x8a\xd5\xa4\xaa\x22\xe4\x08\x6d\x27\xdb\xac\x67\x84\xae\xf0\x3f\x60\xb4\xbc\x21\x51\x8a\x8b\x5a\xa2\x79\x1c\x67\x13\xf4\x07\x28\x72\x92\xfa\xd9\xc5\xa6\xe6\xe6\x15\xc8\x09\x30\x02\x22\x9b\xb3\xfc\xf7\x52\x82\x72\x7b\x89\x7b\xd5\x3a\x89\xf7\xf0\x91\xdc\x15\x9d\x7b\xaf\x94\xed\x7c\xcb\xef\x54\x5d\x2c\x58\x80\x54\x50\xa1\xb1\x52\x45\x0d\xe2\xf7\x9c\xf7\x44\xba\xfe\x50\x4c\x0c\xb4\x80\xef\x13\x33\xc4\xb7\xd9\xb4\x6c\xb9\xdb\x1b\x86\xa7\x1a\xaa\x10\x1a\x4d\x4f\x07\xc0\xa9\xdc\x05\xc6\x45\x35\xc0\x07\x7d\x89\xda\x4d\x62\x0c\x5b\x8f\xa4\x18\x81\xee\xf4\xf5\xcd\x1b\xdd\xd5\x7f\x95\xf0\x63\x91\xda\xcd\x52\xc1\xb3\x23\xa2\x8e\xaa\xe8\xc2\x75\xe3\xa9\x2f\x8a\x10\x03\x45\xec\x51\x19\x3f\xc7\x38\x76\xfe\x89\xb8\x82\xbc\x97\xba\xb7\x00\x12\x89\x77\x22\x0f\x06\xca\x2a\xc3\xef\xa8\x1b\xf0\x6f\x06\x93\xe7\x7d\x74\xd0\x8c\x68\x31\x25\x9b\x0b\xf6\x8a\xb9\x9f\xa1\xb6\x8b\xd2\xf8\xc2\x4f\xfd\xae\x04\xdf\xe4\xb9\x85\xf4\x72\xe8\x32\xb4\x6f\x10\x9a\xea\x60\x15\x93\xb1\xb9\x05\xb8\x60\xd5\x70\x11\x58\x5c\x56\x2a\xba\x85\x3a\xcf\xba\x21\x00\x9f\x3b\x32\x36\xa0\xff\xd9\x99\xdf\x2a\x94\x94\x36\xa1\xd0\x2a\x7e\xb5\x2a\x0e\x90\x96\x9e\x75\xca\xab\xcd\x46\x6a\x4e\x6a\x58\x20\xd3\xea\x2f\x69\x4f\xd4\xa5\xc0\x57\x29\x6a\x0e\x5c\xa8\xb3\x49\xa5\xb7\xf5\x75\x79\x14\x58\xd0\xe1\xa4\x83\xf6\x1a\xcf\x1f\x3e\x5f\x71\x0f\x09\x41\x1d\xd8\xb2\x15\x32\x37\xa8\x9e\x1e\x07\x69\x24\x03\xc4\x56\x41\xfe\xf7\xad\xb6\x39\xd0\x47\xc7\x83\x69\x73\xb0\x6e\x6e\xe2\xf1\x59\x2a\xb0\x38\x3f\x5a\x3d\x1a\xf5\xd3\x71\x89\xf6\xf3\x80\xcb\x21\x0e\xf1\x24\x23\x17\x5a\x01\xb5\xdf\xac\x37\xfa\x92\x2b\xd6\x49\x6c\xe9\x31\x09\x54\x7f\x41\x47\xb6\xfe\x95\x39\xf6\xc6\x1c\xd3\x41\x95\xfe\x9c\xfe\xe9\x45\xc3\x9b\x7f\xd1\xd5\xfb\xa2\xab\xf7\x6f\xa8\xab\x77\xa1\xfb\xf0\xbc\x6f\x05\x27\xe9\x64\x44\x84\x4c\xa4\x34\x67\x4a\xd9\xa5\xb4\x04\x09\xda\xe9\x01\x89\xb5\x90\xbc\x7b\xb7\x5e\x49\x06\x4b\xb4\x45\x41\x06\xe8\x40\x33\xaf\x62\x92\xbd\x42\xff\x01\xf7\x33\x73\x4d\xe5\xb0\x86\x56\x91\x0e\x7e\x8a\xee\x5c\x37\x01\xd5\xe0\x29\x50\xbb\xc5\xe8\x49\x66\x6e\xb4\x20\x72\x70\x9d\x5e\xcd\x4b\x56\x52\xc3\x22\x88\xbb\x58\x79\xa3\xa2\x4f\x33\x15\xae\x21\xd4\xb2\x11\xf1\x53\x5c\x2b\x89\x44\x8b\xb6\x8d\x8e\xaa\x1d\x9b\x9f\x69\xe7\xea\xd5\x58\x86\xae\x67\x55\x09\xb1\xb0\x7c\x79\x25\x64\x61\xb8\x88\x7c\xaa\x32\xbc\x60\xa6\x00\xff\xf2\xf2\x70\x0d\x31\x0f\x7f\xa9\x3c\x5e\xd6\x24\x08\xe5\xbc\x12\x68\x0a\xb1\xfe\xa1\xa7\x23\x84\xde\x29\x06\x68\xa5\x18\xd3\x12\xc2\xdc\xb2\x22\xa4\x9a\x16\x4a\x17\xac\x55\x7a\xea\x81\xcd\xfa\x3a\xaa\x3f\xd6\x46\x74\x2f\x24\x96\x7f\x17\xe5\x23\x7b\x01\xf0\xc8\x5b\x74\x69\xaa\x36\x92\xe3\x59\x49\x5a\xf7\x29\x74\x95\x0f\x12\x47\x3a\x3a\x91\x04\x79\x2b\xf2\xf4\x51\xc3\x14\x7e\xff\xe1\x4a\x61\x2e\xbd\x9b\x68\xed\x49\xa2\xbd\x12\xbd\x94\x62\x05\xc7\x3e\x15\xc3\x99\x4b\x76\xdb\x57\x4e\x2a\x85\x6d\x69\xdd\xa2\xa1\x7b\x23\xb7\xe0\xdf\x91\x82\x68\x7b\x36\xc2\xa8\x08\x40\x1d\xba\xf3\x01\xe4\xa1\xab\xac\x4b\x03\x90\xab\xd2\x78\x6e\xa0\xf4\x9d\x56\xa8\x2f\x54\x6a\xce\x05\x66\xb8\x17\x80\x0b\x81\x13\x6b\xac\x54\x3d\xd2\x62\x6e\xe9\x0b\xc7\xf1\x9e\xa6\x8d\x4b\x9e\x8f\x49\xea\x0e\xba\x0d\x48\x20\x8a\xc4\x1d\x67\x40\xbd\x4b\x63\x24\x03\x05\xde\xf9\xa8\x18\x0e\x80\xcd\x45\x13\x39\x53\x70\x20\x02\x46\xf0\x0c\xe0\x87\x84\x02\x21\x07\xf3\xcc\x36\x32\x94\x34\xe8\x02\x44\x85\x8e\x67\xd7\x48\x5e\x1f\xfb\xb3\xc3\x0f\x1d\x9e\x38\xd5\x85\x63\x95\x40\x1e\xc3\xa2\x78\x3b\x1b\x93\x46\x46\xdc\x4d\xb7\xfd\x43\xc0\x2d\xfe\x0d\xa0\x32\x44\x0d\x63\xef\x1c\x4e\xa7\xd7\x92\xd1\x4b\x34\x39\x1b\xe5\x86\xac\x4b\xd2\xe3\x02\x1d\x1e\x0c\x7d\x75\x5d\x1e\x79\x09\xb3\xa0\x6e\xdc\xbc\x11\x16\x62\x7f\xee\xc5\xb6\x86\xd6\xd8\x8a\x4a\xf5\xe6\x2c\x31\x4a\x64\x12\x48\xf3\x61\xee\x3f\x20\xf1\x76\x9a\xa5\x60\x34\xed\xbc\xe2\x2d\x6a\x92\xf4\x29\xd0\x07\xb2\x95\x52\xb1\xe7\xc2\x9e\x17\x61\xed\xb7\xf5\xbf\xbf\x87\x0e\xcf\x7e\x5b\xa2\x5d\x69\x4f\x64\xeb\xb8\x06\x88\x00\xbb\x00\x74\xb6\xa7\x42\x64\x63\x7a\x55\x1b\xfe\xb0\xce\xad\x69\x62\xdd\xed\x41\xf4\xce\x81\x3f\x3b\x13\x72\x0c\x8c\x5e\x7b\x94\xca\x77\x1b\xe0\x03\xb6\x19\x28\x2f\x83\x09\x53\xf0\x00\xc3\xcd\x2c\xb9\x68\xe4\x01\xc8\x40\x17\x77\xa7\xa1\x7b\xa2\x86\x66\xaf\xb5\xe0\x4f\xdd\xd0\x2a\xda\xe0\x0e\x28\x97\x18\x19\x1c\x04\x70\xc5\x69\x40\xad\xd4\x83\xb0\x37\xe7\xf2\x83\xa8\xea\x6a\xe3\x40\x96\x18\x04\x2c\x6c\x7c\x20\x72\x3d\x57\xfe\xdc\xf3\xac\x03\x0d\x2a\x20\x58\x77\xce\xce\x9d\xa3\x6e\x7e\xf3\x5b\x06\x4e\x26\x00\x7b\x87\x05\x2a\x84\x15\x60\xb0\x86\xd6\xeb\x32\x4b\x3d\x2c\xa2\x0c\xfe\x94\x61\x0d\xb1\xeb\xd8\xb0\x84\x28\x89\x0c\x8b\x3c\x4a\x5b\x11\x88\x3f\x2c\xd2\x67\xe4\x81\x2d\x05\xce\x76\xe3\xe1\xac\xf6\x01\xab\x6a\x04\x67\xc9\x5e\xbf\xda\x8e\x3d\xb7\x8e\xa6\x01\x3a\xe2\xa0\xd0\xab\xcc\x98\x9e\x50\xde\x32\x10\x6c\x46\x30\x9b\x16\xc7\x29\xc7\x93\x4c\xca\xd9\x78\x3c\xcc\x65\x99\xf1\xfa\x84\x95\x63\xd4\x6c\x48\x9c\x7c\xb0\xec\x99\x85\x06\xd1\xa6\x10\xfc\xd4\x8e\xc8\xe7\x92\xa1\x99\xc4\x0e\xd0\x1c\x61\x75\x3b\xf7\x92\xd7\xc5\x6c\x89\x86\xc1\x8e\x12\x43\xff\xa2\x07\x73\x59\x04\x5c\x00\x72\x2c\x9f\x19\x1a\x7d\xe2\x86\xbc\xcc\x1a\x98\xfd\x03\x02\x8d\xfc\x9e\xa0\xef\xf2\xcc\x0e\x18\x8f\x2b\x3b\x81\x1a\xe7\x59\x3f\xb3\x4a\x0c\x4b\xae\x02\x6d\xd6\x51\x6e\x78\xe1\x49\xff\x68\x1e\xdc\xe4\x3b\x7a\x9d\x98\xca\x90\x3b\x9a\x38\xba\x99\xc1\xe9\x18\x5f\x2e\x68\xa8\x97\xdc\x33\xb4\x03\x4a\x0f\xa6\x85\x34\xa7\x16\x54\xfc\xd8\x3d\x54\x46\x22\x92\xf6\x4c\xdb\x50\x20\x7a\xe7\x8a\x2c\x50\x91\xe6\x68\xbb\xfd\xcd\xf4\xc1\x65\x56\xa2\x34\xcd\x59\xf7\x94\x8a\x3a\x68\xa6\xac\xd5\x58\xdb\x04\xaf\xe0\x2c\x90\xbb\x71\x34\x27\x67\x01\x1f\xc1\xbf\xf4\x33\x2d\x53\x9d\x64\xef\x6f\x8b\xe2\x3b\x1e\xd1\xb6\x1d\xd5\xc0\x7b\xbc\x04\xb7\x6c\x8a\x6b\xc4\xc5\xbd\x17\x26\x33\x64\x40\x5d\x67\xaa\x9c\x7e\x01\x64\x4e\x57\xa6\xd2\xf3\x9a\x63\x6d\x79\x33\xf2\x78\xf6\x6d\xdd\xbb\xe1\x1b\x20\x6e\x98\x12\xaf\x02\x88\xeb\x0a\x48\xd6\xa8\xf5\x93\x8d\x12\xa0\xc5\xbd\xf8\xd5\xf2\x39\xb2\xa8\xdb\xec\xab\x8a\x6e\xde\x41\xab\xfe\xb9\xd0\x5f\x8b\xc8\x98\xa3\x8f\xab\xcc\xf6\x4a\x71\xc7\xfe\x3a\xb3\x06\xaf\x35\xf3\x69\x56\x84\x8a\x79\x0b\x3c\xc5\x07\xb3\xab\x76\x2d\x3d\xc3\x37\x97\x68\xad\xde\xf4\x3e\x40\x0b\x8e\x8d\x0e\x95\x99\x74\xc9\xc6\xed\x24\xc4\xe0\x5e\xa8\xa7\x47\xe1\x36\xd9\x09\xf8\x69\x56\x79\x83\x2d\x99\xa1\xd6\x06\x6f\x29\xbb\x65\x00\x1b\x45\xf7\x94\x2b\x9b\x07\xbf\xb7\x15\x79\x26\x02\x92\x32\xd0\x0b\x6f\x89\x6c\x23\x1c\x8b\xd2\x8f\xb3\xd1\x25\x12\x4f\xe3\xae\x76\xae\xe8\x84\x88\x09\x7c\x52\xd5\x62\x57\x70\x66\x38\xf9\xc4\x3f\xce\x0c\x20\xb8\x97\x6e\xa1\x51\x73\x2b\x1c\x11\xeb\xf2\x6c\x87\x63\x79\x5f\x6d\xa9\xb5\x8e\x6f\x07\x56\x36\xa2\xe7\x10\x01\x4f\x96\xa4\x38\x28\xbd\x5b\xdd\x9a\x2d\xd1\x4c\xf3\x00\x15\xd6\xa1\x0a\x42\x08\x6f\xeb\xbf\x5e\xfb\xfb\x7a\xcf\x5c\x1a\x53\x01\x16\x62\x3d\x51\x41\x11\x0d\x2a\xef\x19\xe4\xb7\x46\xec\x7c\x72\xcd\xaa\x0b\x33\x65\x6d\x29\x38\x2b\x58\x50\xc0\x3f\xe1\xb3\x84\xaa\x83\x15\x31\x95\x1d\x50\x54\x5c\x55\x39\x06\xdd\xc8\x21\x70\x69\x4e\x8c\x65\x13\x58\x9c\x25\x09\x22\xd6\x5a\x06\xaf\x41\x16\x91\x16\xb6\xfb\xe0\x10\x69\x3d\x0e\xbb\x03\xbe\x35\xa5\xd5\x6b\xf8\x0f\xe2\xa5\xed\x9b\xd1\x31\xf9\xad\x00\xae\x78\x14\x50\xe2\x2d\x0f\xc2\xb5\xea\x89\x87\x9f\x7a\x31\xbb\xcd\x0a\xc4\xe9\x59\x38\x63\xd9\xc5\xd3\x08\x6c\x24\x97\x9c\x47\x00\x09\xcb\xce\x24\x6a\x90\xa9\x8f\x43\x0c\x3f\xf7\xaa\x12\xaa\x0a\xcc\x03\xe4\x1a\x62\x81\x89\x38\x31\x47\xe1\x57\x78\xb9\x1d\x5c\x59\x4b\x51\xd9\x3b\x3d\x86\x06\xd4\xc5\x6b\x89\x03\xbc\x79\xdd\xfb\x85\x5a\x60\xb4\xc3\x56\x57\x6a\xf5\x8a\x95\x92\x6f\x82\x62\xc1\x2a\x48\x5f\xe4\xbb\x89\x19\x54\x7f\xde\xd5\x36\x62\x3d\x85\xfa\x2e\xaa\x9f\x88\xb0\xac\x4a\x4c\x2d\x2d\x4f\x12\x26\x2f\x65\x47\x91\x8a\x5d\xd0\xa2\x14\x96\x02\x48\x5b\x81\x15\xc5\x32\xb4\x94\x1e\x9d\xe0\xb8\xca\xc3\x2e\x01\x8d\x26\xbe\xd4\x13\xb5\xa5\xc3\xde\x3b\x56\x9a\x1c\xd6\x27\x67\x9d\x7a\x49\x62\x84\xaa\xfc\xb4\xab\x93\xec\xcf\x20\x2a\xfb\x08\xc5\x5e\x9a\x19\x4e\x06\xc5\x32\x2b\xe7\x0d\xfd\x12\x96\x4e\xda\x5b\x7a\xed\x84\xf2\xbe\xc8\xb2\xf9\x14\xb9\xbc\xde\x92\x10\xdc\x31\xd4\x76\xe5\x0a\x9f\x4c\xec\x25\x8f\x47\xe0\xb8\x3f\x67\xa1\x2f\x49\xba\x40\xef\x64\x68\x09\x65\x88\xa5\xa4\x39\x0b\x40\x0e\xd2\x9e\x93\x94\xf7\xfb\xd9\x98\xbb\x75\x51\xee\xb9\x89\xaa\x04\x13\x8d\xe1\xe4\xcf\x3d\x53\x7d\x98\xa7\x25\x73\xb3\x59\xf2\x1b\xdc\x8b\xbf\x71\x6d\x5f\x30\xa6\xda\x30\x5f\xee\xcf\x0e\x5f\xc5\xf4\x56\x4f\x7f\x13\x49\x6a\x8a\xa9\x37\x6d\x8f\xd7\x06\x31\x9e\xae\x2e\x72\xbd\x59\x69\x8d\x89\x6d\x55\x38\x85\x76\x24\x35\xdc\x1f\x56\x95\x68\x13\x02\xa0\xd4\xac\xeb\x97\x9e\xb6\x55\xbf\x94\x70\xd9\xdd\x62\xab\xcb\xb0\x60\xf2\x6c\xff\x81\x70\xef\x91\x67\x5b\x15\x3a\x5f\xbe\x71\xe3\x41\xc1\xf5\x5a\xcb\x45\x94\x67\x9a\x45\x8d\x8d\x53\xda\x0e\x82\x6b\xac\xc0\x78\x05\x6c\xb1\xde\x24\x98\x4f\x0f\xd4\x11\x14\x0f\xc3\xaa\xbe\xd2\x98\xe4\xd0\x26\x98\x0c\x67\x2a\x46\x7f\x2c\x19\xea\x9d\x62\xdf\x34\x99\x6f\x96\x3a\xd3\x64\xc9\x8e\x98\x26\x37\xeb\x72\xd4\x2b\x49\xe9\x1c\xe6\x3d\x41\x37\x84\x4c\x9d\x97\xf2\x47\xf9\x39\xf8\xe1\x82\x46\x0e\xb3\xe9\xcf\xe8\xe3\x89\xe8\x5e\x09\x1f\xe0\x3f\x11\xd7\x14\xf2\xdd\xca\x68\xdf\xfc\x54\x0e\x5f\xd6\xf1\xc5\x3d\x7b\x87\xfe\xb5\x95\xd9\x55\x90\xe6\x2c\xf8\x40\xa7\x60\xc5\x3a\xd3\x00\xf5\xea\x19\xf9\xed\x67\x29\xb4\xb8\x74\xa6\x4b\x0a\x25\x52\x4e\x5b\x11\x9c\xad\x91\x8b\x2b\x74\xf8\x2c\xaf\xfb\x99\x72\xb6\x00\x7c\xa4\xf4\x6d\x93\x83\x41\x90\xc2\xc4\x0a\x5b\x09\x4c\xe4\xcd\x8f\x9a\xa2\x4f\xc8\x45\xbe\xda\xb4\x65\x1f\x05\x5d\xc3\x52\x68\x45\x22\x1f\x98\x8b\x74\x70\x6f\xd4\xcf\xc0\x0c\xd3\x96\x67\x56\xe5\x20\x1f\xc2\x61\x73\x2f\xeb\xde\x5b\xa7\xe8\x87\xda\x8e\x7a\x68\x53\xf0\xfc\x40\x8a\x81\x8b\xc5\xb5\x4d\x1c\xae\x77\x2c\xae\xc6\x7a\xed\x41\xe0\xfc\x05\x5d\x31\xad\x5e\xf3\x88\xcd\x3e\x17\x59\x7d\xe9\x05\xb9\xcb\x2d\xd5\x8b\x80\xd3\x3a\x4d\xf7\xf3\x61\x3e\x9d\xb3\x1c\x2f\x3d\xcc\xd8\x9f\x58\xb8\x97\xd0\x90\xb9\xc1\x8a\xc9\x80\x05\xc5\x48\x45\xf8\xaf\x0e\x3d\x6b\x49\x4e\x43\x0a\xfc\xc7\x91\x66\x06\xda\x91\x87\x77\xf8\xcb\xac\x8f\x71\x3b\x0c\x6a\x06\xcc\x1c\xc2\x11\xdb\x49\x0f\xc1\x85\x09\xc4\x31\x1a\xb9\x2c\xb9\x10\x7d\x83\x1f\x9f\xa6\x99\x60\xeb\xfe\xc1\xf0\x6c\x69\xab\xd9\x6d\xdf\xeb\x84\x0a\x91\xa3\x67\xc6\xcf\xce\x65\x38\xdb\x33\xff\xe1\xd9\xcb\x07\x9b\xb5\x23\x30\x3e\xa9\x39\xb1\x36\x00\x42\x95\xd2\x79\xa9\xdc\x6f\xa8\xb5\x08\x57\x6b\x99\x25\x31\x9d\xd7\xae\x47\x25\xef\xb2\x16\x43\x5b\x00\xc7\xd6\x04\x84\x5d\xce\xfa\x67\x65\x25\x1a\x0e\xf2\xa9\x1f\x0c\x32\x92\x19\xf1\xec\x27\x46\xc7\x56\xd9\xc8\xce\x51\x8e\x4d\xbb\xa3\xa5\x90\x35\x9e\x00\xc3\x57\xb6\x8a\x33\xc0\xca\x88\x1f\xe6\x83\xda\x01\x4b\x9e\x1f\xe8\xe0\xcd\x4c\xa3\xe7\x9a\x36\x09\x85\xd7\x34\x4a\x99\x6d\xc0\x46\x2f\x44\xdf\x35\xc0\xe4\x91\x9e\x5c\x19\xd7\xa5\x57\x42\xf5\x56\x57\x53\xe9\xcf\x5e\x8d\xdc\x35\xce\xd5\xb7\x1e\x52\x4d\x98\x29\xc4\xc9\xa1\xde\xce\x32\xfb\xa8\xd4\xbf\xfd\xfa\x9d\xa0\xbd\x9e\x9e\x85\x17\x94\x27\xde\x85\x5f\xc4\x5d\x5a\x1d\x0e\xe5\x44\x29\x29\x2e\x51\xa3\x0e\xb8\x87\x1d\x85\xea\xa9\x41\x07\x86\xca\xd9\xf0\x68\x99\x8b\xba\x69\xbc\x88\xe3\xdd\xcb\xf4\xee\x22\xcf\x51\x18\x87\x4e\xc4\x82\xe2\x98\x09\x7d\x7b\xac\xa0\xe5\x24\x92\x9f\xce\xb3\x07\x71\x70\x5e\x04\x4c\x7a\x12\x6c\xf4\x0f\x73\x0f\x02\x51\x5c\xc0\x45\x0c\x42\xa4\xf2\x0e\x13\xf3\xc5\x12\x7a\xd9\xd7\x3e\xe0\x25\x79\xdb\x8e\x46\x40\x91\x75\xc6\xee\xe1\xd8\xdb\x2d\x8c\x94\xd1\xea\x74\xb4\x43\x17\xd7\x28\x6a\xf9\xe4\xe5\x1a\xcd\xb4\xe5\xb7\xe6\x79\xa8\x37\x78\xa7\x97\xb6\xdf\x47\xdd\xca\x03\x27\x1d\x73\x50\xbf\xdd\xe0\x02\x86\x16\xe0\x63\x79\x7f\x09\xa5\x12\xbe\x19\xac\x39\x01\x81\xcf\x16\x4e\x59\xca\x85\x44\x36\xe5\x28\xa4\x54\xa3\xc1\x1a\x27\x36\x8a\x25\x8c\x86\x78\x30\x23\x5c\xe4\x70\x88\x90\x7a\xfe\x61\x52\xad\xa5\x6c\xc1\x58\xa1\xc3\x3e\x75\x94\x8d\x27\x43\x0f\x39\x30\xfc\xb4\x69\xe7\x1d\x2e\xd5\x39\xcf\x60\x69\x1d\xcf\x35\xdc\xd0\x6e\x49\x92\xce\x37\x58\xae\xd2\x3c\x56\xcf\xf6\x9d\x19\x88\xe5\x06\x49\x64\xba\x3f\x4a\x4a\x3b\xdf\x30\xa5\x4e\x64\x9c\xf7\x92\xa3\x6c\x38\x36\x84\xfa\x71\x66\xe0\x12\x11\xe7\x00\x5e\xb7\x8e\xc1\x61\xbb\xc1\x27\xa9\x56\xdf\x74\x8c\xbf\xc5\x9b\xd4\x0a\xcc\x24\x1c\xbf\xe0\x20\xdf\xa3\x01\xa1\xa5\x8b\xb8\x0b\x6a\xa8\xdc\x78\x07\x02\xa2\xa9\xf7\xe4\xf2\xfd\x92\x5e\xc1\x95\xaf\xd5\x9b\xdf\xc1\x04\x63\x57\x98\xf6\xc5\xed\xdf\x62\x3a\xc7\xd9\x3b\xb1\x60\xc9\xb7\x60\x12\x01\xa4\xba\xee\x02\xbb\x10\xa5\x9c\x03\x42\x44\xdf\xd4\x1f\x2b\x80\x2c\x0b\xd4\x62\x76\x94\xdf\x21\x72\xf8\xe9\x25\xfe\x00\x12\x20\x1b\xac\x78\x42\x81\xdd\x91\x01\x1b\x59\x25\x5a\x1b\xbc\xd8\x1a\x46\xd0\x1b\x04\xfb\xfb\x63\xf7\x43\xc4\x91\x39\xff\xf9\xb6\x0b\x36\x03\x34\xfb\xea\x19\x9f\x04\x2a\xd8\x98\x66\xae\xaa\xc9\xd4\xdc\x36\x25\x2e\x9e\x10\xe8\x6c\xc6\xb3\x95\x3c\x90\x08\x69\x39\x0a\x06\x19\x2a\xb0\x61\xd5\x9d\x5b\x9b\x8e\xb4\x8b\x45\x70\x91\xa7\xe0\xb6\xda\xd0\x3e\x12\x3d\xd4\xc0\x8c\xab\xaa\xc2\x52\xe0\x48\x3c\xdb\x93\x09\x0e\xcb\xc9\x2c\xaa\x03\x16\x7b\xeb\xc8\x54\xa8\x32\x8a\xda\xee\xdd\x7f\xfe\x72\xa7\x45\x7e\xe9\xa3\x5d\x4f\x1c\x50\x28\x97\xfe\x0d\x66\x3c\xd8\x55\x9b\x1c\xa1\xd4\x5a\xfd\x74\x1a\x7a\xe4\xd0\x80\xb7\x2b\x11\xca\x82\xe6\x7d\x67\xf4\xd5\x16\x39\x04\x80\x1a\xb5\x12\x18\x0a\xf5\xe5\x88\xb5\x50\xc5\x84\xe5\x1f\x66\xfe\xb3\xbe\x16\x4a\x48\xa9\xae\xa0\x20\xcf\xdd\x42\xc5\x62\x24\x03\x9b\x1e\x9f\x85\xc4\x24\x8c\x89\xee\x06\xab\x36\x48\x8b\x2f\xa5\x33\x6e\x26\x50\xcb\x70\x6f\x97\xfc\x90\xab\xab\x02\x8c\x69\x39\xa8\x57\xd0\x5b\x0b\xb7\x06\xe4\x11\x62\x4f\x2d\x85\xf7\x24\x69\x23\x94\x59\x97\x0b\xf6\x7d\x2f\xf0\xfe\x85\x4e\xdc\xa9\x19\x50\x2d\xf1\x1e\x22\xb4\xb6\x40\x65\x06\xa2\x1c\x71\x2b\xb9\xd1\x71\xb3\xf7\x14\x05\xfa\x68\x37\xdd\x0e\x14\x15\xdc\x4a\xc5\x04\xb4\xa1\x9e\x40\xb5\x65\x76\xfb\x43\x37\x92\x9b\x7f\xbb\x0a\x57\x68\xa7\xd6\x0c\x55\x63\xdf\x07\x6b\x03\x60\xbd\x84\x80\x3f\xf5\xd0\xf5\xa7\x83\x15\x8a\xda\x97\x01\xab\x05\x32\xf9\x3f\x07\xa4\x70\x50\x0e\xa4\xbe\xfe\xac\x40\xaa\x42\x19\x38\x18\x13\xf2\x40\xa3\x38\xa0\x10\x36\xba\xab\xee\x42\x86\x84\x6f\x90\x64\x58\x2a\xb8\x86\x70\xaa\x7d\x7e\xb9\x8b\x3b\x1e\x5d\x8f\x91\x11\x4f\x58\x33\x53\xea\x86\x1e\xa6\x9c\xf9\x2c\xd9\x48\xd8\x88\x0e\x79\xc9\x91\xe0\xc1\xea\x84\xb8\xe0\x06\x87\x7f\x2f\x7e\x7a\xf5\x23\x78\x0d\x35\x65\x5b\xf5\xf6\xb9\x8e\x85\xb1\xdd\x38\x43\x5d\xf6\x51\x30\x70\x8d\xbe\x7c\xf4\xe2\xc9\xbd\x07\x8f\xb6\x20\x12\x1b\xe6\x35\x36\x8d\x0e\xe3\x81\xee\x30\xcd\x53\x60\x0d\xdd\x36\x45\x8d\xb7\xce\x3a\xeb\xa6\xf1\xfc\x05\xcc\xa2\x18\xb7\x6a\x28\xc0\x60\x39\xad\x91\xea\xf7\x17\x0d\x28\x51\xdd\x1f\x47\xbf\xf5\xd6\x49\x2e\x53\xae\x07\xa5\x7c\xf1\x45\x28\xe0\x23\x7e\x40\xb9\x56\xce\x8f\x73\xe4\x90\xb5\x5e\xbc\x94\x86\x26\x28\xae\x13\x78\x61\x92\xf0\xb8\x4e\x28\xfe\x98\xea\xde\xa7\x0c\x25\xd5\x42\x30\x8a\x09\xa3\x14\x8d\x1e\x95\x55\x89\xc8\xb7\x9b\xd0\xec\x80\x86\x96\xc3\x5b\x1a\x8e\x16\x4e\x73\x35\x27\xa1\x58\xae\xc1\x42\xf4\x10\xee\x9a\x0a\x08\x0c\xd9\xb3\xce\x91\x47\x68\xd1\x76\x0a\xf0\x81\xb3\xa1\x70\xc4\xbe\x21\xb0\xde\x6e\x37\x76\x69\x60\x64\x45\x63\x2c\x99\x90\x8f\x81\xc2\x7e\xa4\x54\x0f\x3c\xbb\xc8\xef\x79\xb3\x1a\xdd\x82\xb1\x9e\xc5\x46\x7d\xd6\xc0\xbf\xc4\x37\x93\x31\x56\x2d\xb4\x19\x64\xf5\x3d\xda\x9f\x7f\xbf\x94\xb3\xe5\x05\x70\x39\x3c\x49\xe7\xf2\x08\x63\x9d\x73\x42\x70\x50\x6b\xc6\x72\x48\x6c\x03\x06\xa9\xd6\x0c\x4a\xd4\x4e\xdd\x3d\xdc\xec\x14\x3b\xc5\xf8\x32\x00\x54\xf6\xb1\x76\xf5\x9b\x45\xa4\xde\x38\x1c\x82\xb8\xa8\x97\xcf\x2f\x56\xec\x5f\xac\xd8\xff\x4d\xad\xd8\xdf\xe4\x23\x43\x3c\xe6\x78\x76\xdc\x0c\xcb\xd9\x3e\x42\x52\x17\xcc\x56\xb2\x09\xfe\x96\x19\xb1\x6a\xa2\xcb\xa0\x38\x80\x16\x2c\x41\xe3\x37\xc8\xe4\x10\x7b\x71\x40\x7f\x05\x65\x21\xfa\xe0\x24\x2b\xd1\xd5\x11\x5a\xf2\x66\x39\x6a\x52\x19\xba\x41\x82\xeb\x39\xc8\xc7\x58\x15\x18\x76\xb1\x32\x16\xdc\x32\x19\xbd\x5b\xd3\xc4\xc6\xac\xa3\x63\xd2\x56\x03\xf4\x86\xab\xb7\xe1\x7d\xa2\x5e\x73\xb6\x10\xe2\x51\xcb\xc7\x2d\x8e\x03\xe2\x2d\x02\x61\x08\x24\x4d\xc0\x47\x0a\x6a\xc0\x1c\x3a\x38\x16\xa5\x35\x10\x9c\xd3\xbe\xaa\xc5\xb5\x83\x7e\xf3\x06\xc7\xf0\xe6\x0d\x68\x25\xd8\x02\xdb\x78\xd2\x19\xaf\xef\x78\x61\xd9\x91\xf0\x37\x34\x57\x59\xa6\xa4\xec\x64\xc0\x9a\x03\x6e\x03\xe6\x20\xa9\x9b\x98\x51\xe0\x5b\x09\x85\xc2\x83\x23\x44\x06\x58\x1b\xbd\xcd\x1b\xbd\x8d\x5e\xf2\x18\xe2\x8f\xbd\x1b\x8a\xe5\x09\x38\xdc\x46\x15\x00\xf4\x1a\x96\x94\x19\xb0\x24\xf2\xa6\xbf\x9f\x4d\x4f\x32\x36\xb6\x5c\x2d\x4e\x46\xd9\x64\x15\x25\x52\xab\xa4\x57\xb8\x2a\x1d\x33\x1d\xe3\x3c\x02\x45\x1c\x01\x89\xb8\x8d\x6a\xfc\x3c\x01\xcd\xdb\x89\x8f\xc5\xde\x60\xdd\xbf\x3f\x90\x49\x07\x0e\x0a\xfc\xaa\xed\x66\xbf\x02\x7e\x61\xfd\xee\x17\xf6\x22\x8e\xe3\x1c\x59\x11\x96\x68\x08\xc3\xaf\x62\xe7\xd8\x53\xd6\xf6\xfb\xee\x56\xda\xa3\xd1\x78\xd6\xfa\x61\x15\xcf\x0e\x9b\x1e\x9a\x6a\x2c\xcd\xf5\x2b\x14\xfe\xd1\xe2\x58\xff\x71\xa7\x56\x01\xcb\xef\x1d\x35\xb1\x38\xa0\xb1\x1e\x72\x35\x8c\x61\x58\x4d\x42\xc6\xd9\xd8\xbe\xdf\x5f\xd4\x11\xd5\x5f\xe1\x36\xfe\x82\x55\xff\x42\x58\xb5\xfe\xb5\x3a\x78\xae\xb6\xce\x52\x7e\xb4\x7e\x36\x42\x5f\x65\x9c\xe3\x95\xae\x73\x69\x66\xa9\xf4\x5b\x5a\xc1\xfc\x8e\x8f\xd9\x53\xb2\x94\x4f\x87\xc9\x5b\x08\xcb\x66\xf6\xe5\x16\x17\x03\x5a\x1e\xea\xd3\x29\x2f\xeb\x34\xbb\x17\xa8\x70\x5f\x4b\x9e\x83\x9e\x1d\xe4\x97\x33\xc3\xf7\x91\x7a\xaf\xb6\x98\x04\x8e\x61\x34\xe7\x57\x89\x61\xf6\x2e\x1b\xb2\x6c\x09\x3b\x2f\x7c\xe3\x49\x87\xec\x1f\xfa\xe6\x23\x1e\x2e\x77\xb2\x39\x9b\xea\xe9\xd8\x37\xe3\x6f\x5d\xd4\xc7\xde\xd8\x57\x04\x67\x8b\x3d\xc7\x79\x30\xb5\x6f\xdf\xf9\x46\xf5\xc6\x98\xf1\xa1\x17\xc2\x0c\xf0\xa2\x14\xb1\x6f\x1c\x8f\x47\xfd\xe1\x8c\x0c\x3d\x9d\x02\x72\xba\x5f\xbc\xcb\x18\x87\x20\x31\x47\x7a\x72\xa6\x52\x01\xa8\xe9\x24\xc3\xa0\x47\x80\xf7\x1e\xbd\xfa\x56\x05\x3c\x85\x72\xe9\x30\xff\x1d\x65\x03\xa6\x34\xc4\x28\x2f\xb7\xd6\xd7\x39\x34\xb9\x81\x9a\xf5\xfd\x74\x3f\x1b\xf2\xdf\x79\x59\xce\xb2\x72\xfd\x9b\xcd\xef\x57\x56\x1e\x7a\x71\xd2\x14\xa8\xc3\x12\xd1\xc3\xb4\x7b\x97\xa7\xf7\x6b\xb8\x51\x48\xdf\x58\x79\x58\x03\x5f\x78\x90\x21\xb7\x46\x34\x93\x1f\xa0\xbc\x3c\xb3\xcb\xfa\xa1\x1f\x4e\x9d\x37\x26\x16\x89\x20\xdd\xca\xc3\xb2\xcd\xe8\x73\x15\x67\xfa\x82\x9d\x20\x4e\xda\x7f\x1b\xec\x2a\x9f\x6f\xdf\x7f\x6f\xbf\xb8\x59\x50\x96\xd9\xc0\x4b\x69\x29\xf7\x6e\x7f\xd1\x4b\xe9\x0b\x8b\xf8\x85\x45\xfc\xc2\x22\xfe\x2f\x20\x66\xea\xf9\xac\x0b\x39\xae\x5b\x8a\x36\x5a\x51\x5a\x21\x4f\xb2\x83\x29\xc6\x11\x7b\x04\xe1\xcf\x54\x78\x34\x81\x36\x0a\x8f\x66\x08\x93\x29\x3e\xb5\xa3\x13\xf8\x33\xaf\x89\xa7\xf0\xb4\x92\x67\x83\xba\x16\xae\x5e\xa5\xc4\xde\x71\x36\x4d\xff\x6f\x86\xf6\x25\x94\x90\x0e\xa7\xde\x77\x7f\x3a\x19\x7a\x09\x18\x01\xd5\xa4\x78\xba\xee\xb7\x40\xe9\xef\x8e\x56\x3e\x04\x1d\x18\xf1\x18\x41\x20\x01\x6a\x14\xb7\xd2\x3b\x49\x36\xcc\x8e\xad\xb7\x12\x08\xba\x55\x92\xde\x06\x3d\x9b\x41\x6b\x3f\x93\x2b\x95\x74\x1a\xfa\x23\xe9\x92\x0e\x36\x28\x18\x1a\xcc\x82\xea\x44\xab\x94\xb3\xca\x08\x1c\x2d\x19\xda\xa4\x89\x0d\x4d\x51\xe0\x08\x26\xdd\x7e\xa3\xb2\x0f\x44\x53\xef\x37\xc4\xa8\x1d\x51\x13\xf9\x01\xdd\xd4\xa3\x5a\x63\x17\xb6\x79\x76\x0c\x9c\xfb\xbc\x98\x91\x2d\xad\x6f\x40\x86\x23\x73\xda\x8f\x44\x55\xb2\x43\xb1\xf2\xa8\x38\x79\x51\x94\xd3\x55\x76\x19\xb6\x3e\x36\x1f\xe5\xfa\x16\xfc\xf3\xf8\xe1\xaa\xdc\xcd\xb7\xdf\x43\xa1\xb3\xf5\x3b\xdc\x0a\x9a\xe2\xe3\x7b\x0f\x59\xba\xea\xee\x94\x93\x97\x42\x45\x2a\x93\x25\x52\x03\x79\x42\x99\xfe\x28\xe0\x2d\xf4\xf6\xfb\xf7\x09\x8d\x60\x2b\x59\xdd\xbc\x7e\x63\x35\x39\x3b\x4b\x6c\xe7\x81\xb5\x9d\x3c\x9f\xd2\xfe\x00\x3d\x3b\xc6\xfb\x71\x08\x5e\x88\x3c\xf7\xe7\xce\x03\x00\x34\xe3\xcc\xbd\x7e\xc3\x52\xb4\xc4\xbd\x8b\x0e\x0f\xdb\x80\x1c\x28\xbd\x45\x87\x9b\x16\x8c\xc9\x64\x56\x36\x5d\x5e\xd4\x01\x15\x16\x10\xc8\x50\xe4\xd3\x8a\x35\xa0\xc7\xa5\x84\x19\x54\xd0\x13\x61\xa8\xf0\x83\x35\x72\x8c\x78\xac\xc5\x84\x8a\x4e\xc0\x51\x53\x71\xe2\x5e\x7f\xe5\x52\x57\x25\xfa\x50\xf5\x25\x7a\xc2\xaf\x7a\xd5\x23\xd2\x85\x43\x22\x76\x74\x59\x5f\x49\x97\x4b\xf0\x08\xbc\x76\x6a\xf0\x95\x41\x39\x57\x6b\xb0\x61\xa7\x12\x4d\xc9\x3e\x7b\x63\x70\x6a\x3d\x08\x83\x1f\xf1\xea\x70\x28\xcc\x92\xcb\xf8\x69\x70\x14\x94\x81\x49\x77\x22\x8b\xc1\x16\x4f\xdc\x7c\x5d\x64\x4a\x35\x9b\xa0\x89\x4e\x54\x7d\xcf\x0f\x81\xe7\x56\x09\x94\x95\xd4\xa7\x1c\x43\x95\xa4\xcd\x00\x23\x76\xbb\x06\x2f\x42\x14\xc1\x88\xc1\xae\xd6\xc3\xb5\x68\x11\xe5\x8f\x10\x08\x71\x15\xde\x5b\x27\xf9\xfe\xcc\xb9\x70\x2a\x88\xe1\x02\x33\x3a\xc6\xd9\xcd\x36\xcb\xdc\x75\x8d\xc0\xac\x36\xdc\xe1\xe5\x4e\xde\x22\xf7\x73\xad\x00\xe2\x81\xa5\x96\xa0\xcb\xa1\x5f\x24\x84\x83\xb4\x5d\x69\x33\xb8\x6b\x1c\x27\xca\x8e\xc2\xcc\xa5\xc6\xb7\xa6\xbd\xde\x16\x2e\xaf\x6d\x2d\x70\x7e\xb9\x58\x2f\x3e\x3c\xb5\xa6\x31\xd2\x1f\x45\x85\xd0\x76\xa7\x13\xaa\xc1\x3b\x37\x97\xd8\x54\x30\x9b\xd0\xb6\x48\x6b\xe0\xd7\x6e\x8d\xea\xb0\x06\x53\x85\xa3\x5a\x06\x90\x9c\x22\xec\x25\x02\xd2\xf9\xe4\xc2\x64\xed\x48\xbc\xb7\x32\x41\x76\xdd\x69\x2b\xe4\x23\x8c\x19\x2a\x9b\x40\x07\xc6\x19\x1c\x2b\x83\x02\x29\xa2\x36\x5d\x1b\x26\x23\x4e\xe4\x52\x0a\xc3\x2b\x8d\x4e\xc1\x88\x81\x3f\x15\xb5\x9f\xaf\xa6\xf3\x21\xc6\x4d\xaf\x81\x09\x2a\x5b\x62\x29\x66\x3f\x75\xcd\x10\x0a\xb4\x6d\x04\xcf\xbb\xc6\x10\x22\x89\x0a\xcb\xe1\x38\xd4\x89\xc8\x3f\x3b\xa1\x10\x0c\xb6\xa7\x4d\x35\x58\xf0\xb2\x8c\xa5\x06\x70\x1a\x58\x3f\x14\x26\x05\xc7\xac\x2a\x57\x52\xad\x00\x30\x4c\x0b\x5d\xc4\x2c\xd6\xf3\x03\xf8\xd9\xde\xad\xc8\xa3\xc2\xf1\xec\x75\x82\xa6\xc6\x6c\xb1\xa0\x9a\x43\x6e\x06\xf2\xfe\x45\xe6\x01\xb1\x2c\x05\x0e\xf1\x02\x16\x52\x83\x50\x03\x76\x0d\x22\xc2\xab\xca\x32\xb4\xd8\x24\x07\xa5\x67\x2a\xb9\x55\xa3\xe3\x44\x80\x14\x97\x64\x9d\x27\x5e\xc1\xf7\xff\xce\x9e\xfb\xbf\x08\x26\xfe\x62\x82\x89\x3f\xf7\x95\xc5\x73\x46\x73\xe7\x02\x8f\x2b\x80\xa8\xf7\xb3\xc3\x7c\x84\x7e\xf9\x99\x27\xa7\xd7\x96\x56\xe9\xb9\x1c\xc6\x17\xf2\xfa\x77\x17\xd0\x7a\x87\x4b\x40\xc2\x71\xf9\x0f\x40\x1f\xf3\x55\xe6\x59\xe0\x0a\x6b\xd1\xb3\x8c\xef\xc0\xa7\x99\xed\xf4\xca\x7e\xbc\x87\x99\xc0\xc9\x66\xe4\x65\xc6\x2b\xf1\x99\x3f\xcd\x78\x63\xfd\x5c\xde\x66\xfc\x41\x7d\xd8\xe3\x4c\xb8\x19\x1f\xf2\x3a\x73\x51\xf7\x2b\x5f\x2e\xb3\x2f\x97\xd9\x9f\x7c\x99\x2d\xbe\x9e\xc4\x30\xe1\x5c\x0a\x00\xac\xcc\x4b\x57\x95\x75\x50\x16\xb8\x22\x13\xd5\x00\xeb\x10\x5f\xab\x64\x59\xfb\xb4\x45\x57\x81\xb5\x47\x5b\x10\xb5\x85\x8b\x7d\xbc\x0b\x40\x7a\x88\xe2\x7e\x15\xbb\xea\x73\x46\xfb\x32\xcc\x0a\xc6\x0f\xf1\xba\xc3\xf8\x60\x38\x11\xc9\x41\x27\x94\xd6\xc7\x9b\x58\xc6\xfb\x7c\x95\x6b\x24\x76\x01\xc0\xe5\x80\xb8\x1b\xbd\xd5\x0a\x10\x55\xa3\xd0\x89\xdd\x02\xb7\xe1\xe6\x10\x5e\x10\xd1\x7b\xc0\x0b\x2a\xb6\xe8\x0a\x40\x6c\x7f\x51\xcf\x13\x7f\x05\x6c\xff\xe5\x2d\xfe\xcb\x5b\xfc\x97\xb7\xf8\xff\x05\x54\x42\xf3\x5b\xfc\x79\xfd\x02\x7e\x04\x06\xda\xbe\x80\x87\xda\x87\xa5\x8d\xd1\x13\xba\xe4\x81\xa7\x71\xeb\x50\xd6\x3a\xeb\x3e\xcc\x54\x08\x91\x6b\xe8\x71\x44\x54\x10\x95\x4f\x03\x0c\xee\xce\xaf\xa9\xec\x2c\x0f\xbd\x4d\x4c\x26\xe8\xda\x0f\x10\x45\x8a\x8e\xdc\xa1\xe9\x49\x96\xb9\x68\x0d\x3d\x7a\x56\x27\x1b\x49\x68\x1d\xdd\xda\xfe\x6b\x86\x65\xd1\xf3\x0e\x39\x66\xcd\xf0\xbd\xbd\xcc\x80\xf5\x35\x8d\x0c\xb2\xf1\xf4\x68\x8d\xdc\x1b\x98\xb1\x1e\xe4\xa8\x16\x2f\x74\x51\x51\xfa\xb1\x82\xb4\x31\x27\xf5\x07\x3c\x78\x5e\x92\xdb\xe9\x2e\x06\x85\x61\x9f\x1f\x4c\x3c\x60\x87\xa4\x0a\x90\xa5\x03\xf2\x70\x47\xae\x40\x0a\xf4\x3f\x8f\x8e\x6d\xae\xb9\x67\xfe\xd4\x7a\x7f\x0f\x94\x0d\xec\x8a\xda\x30\xcd\xe8\x47\x8c\xd7\x82\x7b\x83\xe0\x4d\x68\x2f\x38\x19\x80\x69\x16\x8e\x77\x8e\xd5\xd5\x70\xb4\xdb\x08\x73\x4e\x0f\xb2\x09\x7a\xfe\x4d\xd1\x3a\x40\x40\x3c\x93\x55\x98\x50\xfc\x2a\x90\x45\xfc\xd7\xab\x5f\x7a\x58\xeb\x97\xa7\x4f\xd6\x86\xf9\x5b\xd3\xdf\x7c\x34\x4d\x4f\x93\x1c\x29\x4c\xb3\x8d\x70\x1e\xa5\xa5\x77\x79\x39\x43\xf2\x27\x39\x2a\x4e\x64\x55\x60\x28\xc3\x34\x37\x84\xea\x0c\x2d\x0c\x52\x0c\xf5\x36\xcc\xc9\x9c\xad\xe7\x79\x5b\xb2\xde\x17\x77\xc5\xb3\x10\x6b\x21\x58\xfd\x82\x7b\xe3\xf1\xd9\x1d\xe7\xc2\xc8\x53\x52\x18\x16\x87\xf9\x48\xe9\x22\x3c\x81\x6f\x7a\x5b\xaf\x29\x6e\xbe\xfc\xf2\x26\xa1\xbe\x02\xba\x5a\x52\xe5\xd1\x37\x94\x2a\x7e\x8b\x8e\x12\x7f\xef\xb1\x77\x24\xfa\x9b\xdd\x42\x4d\x66\xa3\xb6\x18\xb5\x3b\x74\xfd\xa3\x0a\x7e\x48\x4d\xd1\x73\x01\x3f\xcb\xdc\xe2\xfc\xf5\x3b\xe6\x76\x2b\xfa\xe4\x8f\x63\xbf\x18\xcc\xc5\x01\x13\xf9\x5d\x82\xdf\x3f\x8a\xaf\x0f\x20\x03\x68\xec\xe1\x59\xe5\x67\x3e\x2b\x16\x40\x52\x96\x7a\x62\x30\x94\x48\x39\xd7\x74\xb4\x30\x06\x88\x94\x97\x84\x3b\xba\xa3\xde\x51\xb5\xd7\xac\xf1\xb8\xd9\x5f\x16\xf5\xb7\x15\xba\xa4\x90\x65\xe7\x7b\xaf\xad\x9d\x5a\xdd\x1a\xe4\xef\x88\x8e\x32\x3b\xe1\x00\x68\xf5\xce\x8a\xe7\xa5\xd7\x1b\xde\xba\x97\x79\x6b\xdd\x34\xa1\x52\x6a\xfc\x57\xa1\xee\x08\x04\x19\xb0\x81\x8a\xcc\x71\x20\xbb\x17\xb0\x56\x66\x9f\x88\xe2\xac\x82\xc3\x13\xf1\x02\xa6\x8c\x36\x06\x7a\xe9\x34\x77\x15\x93\xb2\x35\x6a\x77\x2c\x23\x67\x8b\xc8\xd7\x3e\xb6\x7e\x87\x95\xb5\x2d\x54\xf0\xe0\x92\x1f\x60\xa4\xe2\xbc\x2f\xf2\x25\x0d\x41\x01\x18\xee\x08\xbf\xc0\xa6\x30\xea\xb2\x17\x36\xb6\x85\x2e\x63\x55\xd0\x3c\x20\x3c\x54\x24\xa9\x56\xb7\xea\x08\x10\x5d\xc4\xd6\x3e\xe8\x29\x09\xe2\x5f\xe0\x45\xef\x43\x65\x88\xcd\x6c\xa2\xd9\x30\xc8\x8a\xf9\x8e\xd5\xe5\xf6\x8b\x62\x88\xdc\xe4\x65\x08\x0f\x97\x12\x1a\x6a\x31\x61\xdd\xeb\x58\xc5\xb1\xa1\x29\xfb\x85\xbd\xfc\xc2\x5e\x7e\x61\x2f\xbf\xb0\x97\xff\xbe\xec\x65\xc5\xa2\x56\xbb\xb0\xf3\xf2\x3e\xb2\x72\x38\x0e\xf5\xd1\x0f\x6f\x9e\xdd\x7b\xfa\xc8\x14\x6c\xbd\x79\x33\x51\x98\xfb\xcd\x9b\x96\x2f\x09\xf7\x48\x4e\x27\x0d\x97\xc7\x58\xa7\x9d\xe6\x91\xac\x22\x97\x34\x8d\x20\x23\xaa\x38\x12\x62\xa2\x42\xca\xcc\xf1\xc7\xe7\x24\xd0\xb8\xe2\x32\x74\xda\x8f\x7e\x48\xa8\x4f\x48\xae\x71\xcf\xcb\x53\x6d\xb6\xc2\x6e\xa8\x92\x08\x8b\xcc\xf0\x52\xaf\xf8\xa6\x4b\x55\x35\xdf\x94\xba\x2b\xf4\xf5\x10\xb8\xf2\xad\x88\x3e\x1c\x66\x98\xc3\xbc\x29\xca\x5f\xb5\x2a\x6e\x15\x7f\xd8\x35\x43\xab\xf7\x9b\xed\xfb\xb3\xc6\x35\xb0\x8b\xd4\x66\x5f\x83\x07\xe5\xae\x00\xee\x5e\x43\xb0\x99\x8a\x1b\xed\x25\x06\xc3\xfe\xb6\x3f\xe2\x68\xc0\xb5\xf9\x4f\xa3\xe3\x65\x16\x47\x15\x5d\x6e\x44\x08\xb1\xb5\x43\x88\xd6\xa9\x19\x43\xbc\xfd\xbe\x7f\x00\xed\x68\x02\xed\xc9\x92\x5d\xa8\xda\x8a\xf7\xa6\x08\x42\x56\x4b\xf4\xa5\x85\xaa\x76\x47\x39\xeb\x6b\xd4\xc1\x75\x75\xea\xc1\x5d\xb7\xbb\x58\xcd\x13\x0b\xd6\x6f\x18\x1d\x45\x1b\x67\x5e\xc4\x73\x35\x7b\x16\x2f\xdd\x16\xaa\x4d\x29\x75\x4e\x98\x01\xad\xf1\x27\x8b\xd5\x9b\x16\xcc\xd7\xbc\xe4\xd6\x42\x6c\x65\xa7\xed\x9c\xf0\xb3\x1f\x76\xc4\xce\x2f\xaa\x8a\xa5\xa4\x6b\x0a\xbe\xf6\xa2\x1a\xa6\xa8\x60\x2a\x70\xee\x54\x46\x45\xc1\x6f\x39\x87\xc3\xae\x1e\x2b\xff\x2d\xe5\xfa\xb7\xaa\x72\xea\xa9\x86\xd2\xd2\x3f\x22\x66\x94\xfd\xe4\x1d\x09\xda\x74\xb3\xbd\x4c\xbd\xdc\x23\x7b\x49\xd1\x04\x6a\x36\xdf\xfa\xa4\x32\x2c\xe3\x2d\xa2\x59\xd7\xef\x48\x10\x63\xd0\x3a\x42\x71\xde\xad\x07\xaf\x5e\x39\xcd\xfe\xff\x34\x13\x18\xaf\xf3\x43\xf2\x00\x03\xb2\x60\x29\xd8\x47\x7f\xf6\x32\x88\xbb\xd1\x75\xb0\x2b\x1d\xb8\xaa\xb0\xe9\x18\xdc\xcf\x7e\xd9\x7b\x1a\xff\x74\x92\xad\x68\xa3\x2d\x9a\x84\xe1\xd9\x43\x4c\x13\x61\xd1\x79\x15\xfe\x5a\x9c\x3a\x0f\xba\x56\x07\x97\xef\x48\xc7\x5a\x1b\x02\x73\xdf\xd3\xc3\xed\xae\x2c\xaf\xae\xeb\x77\xa9\xee\xea\x0b\xf4\xdb\xc0\xac\xbb\x9d\xa8\xe3\xd9\x7d\x20\x81\xe7\xde\xaf\xcf\xa5\xd3\x7a\x7d\x63\x29\x87\x8d\x8a\xa4\x33\x5b\x06\xee\x71\xe2\x8e\x9f\x23\x1c\x7e\x33\x51\xcd\x9e\x74\xe2\x34\x32\x67\x5e\xf4\x7d\xe7\x52\xe2\x3e\x35\xf9\x33\x6c\x72\x67\xd8\xe8\x6b\x50\x35\x21\xde\xe4\xca\xf5\x78\x69\x69\xeb\xc7\xb4\x3c\x92\x6e\xfc\x16\xc4\xf5\x64\xb9\xae\xcb\xd8\x7a\xe4\x18\x72\x61\x55\xbf\x98\x73\xc3\x7d\x60\x78\xc7\x85\x1d\x07\xc5\xa4\xf6\x2b\xe4\x98\x17\x55\xf6\x4b\xd9\xba\x41\x04\x1b\x55\xd5\xcb\xb2\x9b\xed\x02\xbf\x95\xe0\xba\x1b\xc1\xee\x81\xc8\xe9\xbd\xfa\x8d\x45\x2d\xb0\x95\x0d\x2d\x04\x99\x52\xc7\xb3\x14\x53\xc5\x5d\x7a\x33\xa3\x17\x79\x79\x5c\xe8\x06\x5d\xed\xb1\x5f\x28\x58\x9f\xf3\xb9\x5f\x7f\x8a\x4e\x68\xbd\x62\x98\xb4\x8c\x16\x16\xc6\x8c\x99\x8d\x11\x75\x44\x47\x16\x64\xda\x35\x91\x88\x73\xc1\x9a\x48\xb2\x7e\x5f\xdd\x51\x9e\x3f\xad\xeb\x55\xb8\x9f\x41\x02\x42\x28\x5b\xf9\xfc\x7c\xf8\xe8\x87\x7b\x3f\x3d\xd9\x79\xf3\xe4\xf9\x83\x7b\x3b\x8f\x9f\x3f\x33\x1d\x38\xdc\x70\xd7\x3f\x5a\x1c\x8f\x39\xd6\x51\xe8\xff\x71\x61\x7f\xaf\x1e\xbc\x7c\xfe\xe4\xc9\x9b\xfb\x8f\x7e\xbc\xf7\x8f\xc7\xcf\x5f\x06\xdd\xd6\x60\x87\x2d\xa6\xfc\x56\x94\xc5\x66\xa9\x64\x52\x6c\x4b\x21\x57\xa7\x49\x62\xa6\x5a\xa4\x8b\x72\xa7\xa2\xf5\x56\x3e\xf2\x0a\x8a\xc9\x0f\x7d\x1b\x6a\xab\x7c\x7e\x32\xb2\x72\x3b\x5d\xb3\x03\xd2\x1b\xea\x6b\x57\xa7\xef\xa1\xd8\xc9\xb5\xe1\x67\xd6\xc6\x87\xf3\xa2\xd6\x9d\xf9\x93\x43\xc8\xb2\x4f\x7b\xfc\x38\x84\x81\x93\xd8\x52\x6b\x64\x6e\x38\xf9\x0d\xe9\xff\x4d\x5e\x9c\x21\xf9\xbf\x9d\xc7\x77\x1d\x94\xad\x1a\xbe\x4d\x87\x45\x9a\xe0\x1c\x26\xa4\x96\xe7\x0f\x75\x45\x28\x45\x17\x23\x3d\xe1\xa2\x2a\x6c\xfa\x76\xb5\x18\x57\x35\x94\xcb\xa3\x51\x39\x9b\x48\xd4\x53\x08\x09\x26\xa1\x37\xf8\xe1\xcb\x00\x01\xc4\x4b\xc7\x17\xd1\x64\x90\xd3\xc3\x0a\x05\xe3\x23\x93\x3f\x5f\x4e\xdc\x4d\x86\x88\x7e\x2a\x41\xdb\x49\x80\x6c\x7e\x6f\x27\x5f\x7d\x95\x3b\x3a\xd7\x16\xf4\x2a\x81\xf4\x58\xb3\x1f\x6e\x4d\x77\x6d\x21\xd9\x5b\x59\x79\x95\x13\xae\x13\xd1\x8f\x95\x29\xab\xf8\x82\x40\x00\xab\x10\x83\x8a\xfa\xd5\xd0\x1c\xdf\x4e\x03\x7a\x7e\x31\x9b\xa7\x00\x80\x5c\x97\x76\x7c\x70\x4a\x07\x44\xc9\x97\x3b\x05\x8c\x9b\x3f\x2c\x70\x8d\x5c\x1a\x2d\x98\xe5\xeb\xb6\x57\xea\x16\x9e\x01\xaa\x69\xd1\x85\x33\xa4\xa2\x6e\xa9\x9d\xff\x6f\x1d\x3c\x51\xbf\xca\xa9\x01\xed\xba\x92\x7b\x2a\x88\x37\xf8\x01\x68\x88\xe2\x3d\xb1\x8f\xec\x03\x0c\xce\xdf\xe2\x13\x24\x6f\x71\xdc\x63\x6d\x3f\x7e\x44\xe9\x60\xd4\x7d\xcb\x19\x99\xe5\x6a\x5a\x5a\x5d\xd2\x5f\x65\xf2\x2f\xab\xb7\x08\x2b\x3c\x16\x3b\x4d\x12\x3d\xbe\xd4\x87\xff\x99\x5d\x2b\x06\x19\x5d\x66\xf9\xb8\x8c\x36\x8c\xa5\x6d\x34\x06\x30\x74\x3a\xef\x4d\x32\x6f\x3c\x16\xdb\xe0\xbf\x35\x08\x16\x91\x2b\x17\x80\x35\x7b\x85\x2f\x7e\x5e\x0b\x16\x3b\xee\x51\xf8\x49\x2e\x32\x0e\x33\xcf\x8f\x37\xf1\x9c\x05\xab\xc8\x27\x44\x45\xc1\x88\x8e\x99\xf3\x2b\x43\xc6\xea\x35\x23\xfe\x57\x90\xb7\xf4\x80\xf9\x1e\x8d\xc7\x87\x76\xb7\xa7\x72\x15\x41\xda\x4d\x12\xf0\x36\xb9\xc7\x25\xa0\x15\xd4\xe0\x26\xd2\xcb\xca\x7b\x89\xd5\x44\x6c\x0b\x51\xcd\x4a\xd4\x9f\xc1\x60\xca\x29\x46\x52\x66\x24\x54\x2a\x8b\x1e\xd0\x77\x82\x81\xbc\xcd\xb2\x31\x79\x71\x07\x2e\x0a\x1e\xc4\x95\xcf\x66\x28\x5f\xce\x47\x7d\xd1\xce\x78\xce\x61\xa6\xd9\x6e\x08\xec\x85\xb8\xb4\xf5\xcb\x21\x7e\x37\xd6\x44\x5a\xee\xfe\x08\x6b\x35\xe8\x20\x49\xc1\x17\x01\xbe\x60\x50\x0d\x4b\xc5\xc8\x1f\x28\x66\x13\xc9\x00\xdd\x0f\x31\xed\x91\x2d\x20\xa3\x5f\xa9\x86\x5c\x86\x3f\x62\xb2\x0e\x8b\xf7\x2e\xcd\x87\xf0\x5e\xd2\x4d\x56\xd7\x57\x13\xd4\x6a\x3f\xc9\xcb\x8c\x86\x10\x04\xfa\xa3\x21\x54\x9c\x5e\x47\x46\x12\xa7\x64\x6a\x86\x63\x8d\xbf\xaa\x63\xa2\xf7\x28\x7f\x50\x86\x3d\xc3\x58\x12\xf6\xcf\x3d\x27\xe2\x91\x78\xec\xe2\x59\x86\x64\x21\x09\x06\x92\x28\xa5\xfa\x3d\x8c\x57\x73\x8e\xea\x18\xa7\x02\x15\xe6\x84\x6a\x2f\x79\x5f\x51\x85\x8d\xe4\x4a\x00\xac\xa8\x5d\x67\x26\xfc\x2e\x9b\xac\x81\x72\x5a\x92\x39\x46\x92\x7d\xd3\x04\x51\x01\xca\xfc\x78\x3c\x9c\x93\xc7\xd7\xc4\x45\x12\xc3\x28\xb0\xa8\x0a\xc6\x83\xb1\xd1\xb5\x51\x21\x4f\x1b\xb8\x45\x22\xa3\xe9\xd8\x42\x8a\xb5\x99\xf8\x91\xb2\x25\x4a\xfa\x6d\xfb\xeb\x8f\x3f\x24\x2c\x28\x79\xdd\xf0\x58\x1a\x5b\xb9\xa3\x6a\xbe\x67\xb8\xb6\x61\xb3\x93\x33\x1b\xb9\x17\x85\xdd\xd9\xe0\x81\xd3\x98\xba\x9d\xec\x82\x1e\x17\xe6\x0e\x1d\x0f\x28\x07\xdb\x26\x99\x71\x84\x04\xba\x54\xab\x84\x9e\x94\xca\x41\x86\x6a\x22\xa0\xb9\x6d\x4b\x12\x52\xef\x4c\x52\x80\xa4\x78\x55\x49\x1d\x9b\xdd\x35\xcb\xea\x71\x72\x22\x89\xc5\x67\xf9\xbc\x1c\x03\xb9\xea\x5e\xbb\x98\x5a\x4f\xf4\x0b\xae\x9b\x2e\xbc\xdf\xd2\x4e\xb5\x3a\x7a\x15\x00\xf3\xf9\x8c\x6f\x5b\x72\x3b\xb6\x35\x17\xbb\xc2\x69\x38\xf8\x95\xac\x6b\x77\x92\x94\xb4\xaf\x3a\x06\x03\x82\x87\x93\xa8\xa6\x67\xe0\xb2\xf7\xec\xf9\xc3\x47\x6f\x1e\x3d\xfb\x07\x0d\xc9\x6c\x22\x08\x03\x91\xb8\x50\xea\x3d\x20\xbd\x49\xf9\xa1\x5b\x45\xce\x18\x51\x6c\x55\x0d\xdf\x06\x80\xfb\x29\x14\x87\xb7\xe2\x96\x17\xd3\xd8\x9c\x61\x56\x15\x7a\x9b\x8d\xa7\x82\x46\x5d\xb0\x63\x15\xf5\x8f\xa3\xb5\xea\x40\x01\x8e\x34\xf2\xa6\x22\x83\xe9\x41\x04\xcb\x12\x65\x3a\xe2\xc9\x85\xa7\xd1\x77\x11\x62\xff\xa3\x0c\x82\xc2\x76\x13\xb5\xb8\x4c\xe7\x80\xa5\x87\x8e\xdb\x02\x8d\x19\x3c\x07\xd1\x5e\x40\xb3\x75\x86\x94\xfb\x21\x1c\x42\x94\x6d\xe0\x05\x42\xd5\x24\xa8\x84\x16\xf5\x32\x4f\x8b\x13\xfc\x71\xe7\xe9\x13\x1b\x90\xe3\xde\x8b\xc7\xbd\x70\x3b\x61\xe8\xa1\x5c\xc6\x90\xbc\x57\x03\xc6\x18\x7c\x2e\x28\x90\x09\x84\x2c\xf6\xe4\xd1\x69\xaf\xd1\x19\xc4\x35\x05\xa0\x1d\xa6\x73\xb6\x92\xa7\xf2\xe2\x10\x25\x8c\x07\x0d\xb1\xe9\x5e\xce\xd0\x28\x57\x5e\xde\x25\x83\x82\x61\xbd\x08\x4f\x88\x7e\x4c\x89\x97\x68\xeb\xe7\x0d\x64\x41\xc3\x12\x7e\xa8\x89\x4a\x36\xc7\xe1\xd2\x81\x72\x22\xa5\xd4\x51\xa5\x3f\x36\x3e\x8e\x9b\xc2\x30\x4b\x27\xf7\x86\xc3\x97\x8c\xc7\xdc\xc8\xbd\x0c\x6f\xc0\xac\x7e\x5a\x3b\xb7\xed\xb0\xa4\x22\x7f\x2d\x6e\xf1\x0a\x38\x55\xdd\xbd\xed\xca\x10\xad\x87\x1a\x8c\x40\x38\x18\x94\x36\x2c\x62\x41\x7e\x62\xf8\xa0\xd9\xd0\x2f\x44\x2f\x59\x95\x54\x8e\xfe\xd8\x2e\xb3\x2c\xf1\x50\x7a\xc7\x46\x26\x62\x97\x32\x89\x23\xe9\xd5\x4a\xd8\x34\x66\x9a\xc2\xbd\x0b\x2f\x0a\x2e\xd5\x71\x0a\xc8\x8d\xf2\x35\x29\xaf\x22\x2f\x2d\xe0\xd9\xaa\xab\xaa\x2b\x7b\x4b\xda\x83\x78\x3d\xfc\xbe\xef\x65\x48\x38\xac\xce\x82\xf5\x7e\x49\x71\x79\xec\x9a\x4b\x7c\xbf\x4b\x5c\x73\x0e\xfd\x53\x59\x77\x2f\x3d\xb2\xf6\x02\x86\x01\xa0\x56\x80\xab\xb2\x7f\x55\xf0\x23\x44\xd2\x5e\xb4\x18\x2f\xb2\x89\xe1\x1f\x20\x10\x30\x69\xe6\x0a\xbd\xeb\x42\x2a\x26\xe9\x21\x78\x3d\x9a\x7a\x8b\xe4\x91\xf8\xb2\x36\xae\x55\x7b\x0f\xbc\xaf\x84\x28\x1b\x73\x34\x56\x66\x61\xcc\xc5\x40\x91\xa1\xa0\xf3\x9e\xf5\xd7\x84\x54\x62\x0e\x4a\xc6\xae\x51\x1a\x1f\xbc\x2c\xed\x83\x65\xff\x20\xab\xae\x3b\x16\x51\xeb\x8d\xdf\x41\x50\x75\xcb\xcf\xa0\x48\xaa\x07\xe6\x0d\x24\x9c\x0a\x80\x09\x6b\x2d\x04\x25\x17\xe4\x74\xbf\x2c\x86\x40\xf0\x5b\x72\x8f\x8e\xc8\x20\x04\x28\x6c\xdf\x35\x41\x6b\x61\xa3\xcd\xa2\x5b\x3d\x15\x5e\x34\x36\xc7\xb7\x59\x10\xbd\x57\x92\xea\xc3\x8a\xc2\x1f\x12\x65\xc9\xa3\x3a\xfc\x81\xa3\x6e\x45\xaf\xe0\x56\x89\xe7\x60\xda\xe9\x04\xd8\x9a\xc2\x55\x4e\x0b\x85\x78\xab\xa1\x7f\xbc\x07\xf4\x42\x53\x34\x24\x4b\xbe\x0b\xa9\x5b\x91\xc3\xbe\x3b\x2d\xf6\xbc\x30\x6d\x8e\x42\xa0\xf6\xc2\xa6\x5c\xb4\x78\xcf\x3c\xc5\x13\x91\x98\x49\x78\x6d\xf2\x1c\x44\xce\xa7\x17\xe2\x6c\x25\x04\x0e\xb7\x2c\x00\xcb\xf4\xd6\xad\x96\x6a\x04\xf0\xce\x0f\xe7\x14\xe0\x93\x85\x04\x3a\x22\xeb\x32\x80\x23\x3e\x15\xf9\x10\x18\x92\x3f\x3d\xc8\x86\xca\x6b\x05\x09\x15\xc1\x85\x14\x1c\xcd\x14\xdd\x33\xba\x76\xd8\xee\x85\x66\x6f\x4f\x1d\x01\xda\x85\x20\xeb\x47\x54\x25\xf0\x20\x8b\x7c\xb6\x2d\x03\x59\xf2\xa4\x49\xbe\xde\x6a\x20\x72\x3b\x5c\x6a\x9f\x64\xd2\x0c\xef\xdd\xa4\xf5\x37\xa0\x3d\xb1\xed\x2d\x0f\x78\x6b\xd6\xd5\xdd\xd9\x36\x4c\x13\x2c\x00\xd9\x65\xe5\x8e\xeb\xb2\x2a\x61\x18\xb3\x63\x06\x2f\x9c\x87\xae\x15\x67\x31\x55\x8c\x6a\x43\xc8\x79\x4b\xa7\x9d\xfb\xa9\xe5\xf3\x7d\xfe\x5d\xe2\x12\x9e\x87\xd2\x42\x23\x65\xbc\x77\x92\xb2\x10\x8a\xca\xad\xfa\xa0\xc8\x4a\x24\xe6\xcd\xd4\x50\x74\xc4\x53\xd5\x31\x0e\x2d\x65\xce\x17\x58\xdb\x43\x8e\x51\x5c\x60\xab\xc0\xea\x56\xca\x7f\x84\x5d\xa4\xa1\x79\xfb\x18\xc6\x1f\xe7\x6a\x0b\xf6\x92\xe7\xf8\x73\xee\xe1\x58\x95\xda\xbc\x93\x95\xb5\x5a\xbc\x9f\x8b\xb0\x45\x64\x3d\x40\x42\x9e\x17\xb3\x92\xe6\x75\x20\x46\x77\x56\xd0\xe2\xae\x52\x54\x9a\xcd\x0f\x48\x2e\x26\x2d\x0a\x23\x07\x2a\xf1\xa0\xeb\x0d\x41\x70\x8a\x84\x02\x81\x92\xeb\x4c\x2b\xa2\x71\x0b\xe4\xaa\x3f\x2b\xa6\x86\xcb\xd8\x71\x1c\x21\xda\x91\x18\x68\xef\xbf\x2d\xed\xf2\x42\x3c\xc3\x9c\x64\x72\xf3\x62\x36\xd1\x56\x6d\xa4\x82\xec\x8d\x48\xf6\x89\x19\xaf\xa4\x24\x75\xe6\x2e\xc0\xec\x9c\x58\x3f\xc1\x8d\xa8\xd4\x8f\xd4\x88\xdd\x1d\x61\x05\x0f\x67\xe9\x64\xe0\x9f\x65\xa6\x5e\x4a\x86\x7b\x58\xbc\x19\x74\x20\x5c\x20\xc8\x9a\x69\xb6\x89\x59\x63\xb3\x70\x3f\x16\x27\xd9\x3b\x50\x4f\x42\x29\x16\xca\x2c\x35\xe2\xf6\x1f\xcb\xdb\xe4\x1b\x32\x27\x34\x7d\x20\xb1\x44\x41\x26\x1b\x72\x7f\xf9\xc8\xe7\x2a\x5d\xa3\x3e\x7b\x09\xac\xe5\x4d\x59\x45\xf2\x25\x2a\xc1\xc9\x91\xf1\xbe\x46\x1e\x2c\xae\xe1\x94\x08\xc6\x87\x39\x2e\x9d\xe9\xd9\x35\x2a\xcc\x3b\x69\xe3\xc0\x7a\x4f\xb2\x61\x6e\x76\x9b\x37\xca\xee\x13\x3d\x7a\x54\xcf\xc1\x61\x71\x3f\x05\x2f\x6e\x4e\x87\x0f\x13\x2a\x8c\x1e\xcf\x53\xc2\x9e\xde\x49\x36\x35\x33\x8f\x58\x3d\x58\xb5\x4e\x0d\xa6\x28\xc6\x3e\xf7\xe7\xc9\x99\x1d\xee\xb0\x3f\x45\x22\x22\x22\x02\x3b\x40\x80\x6b\x32\xbb\x19\xd8\x75\xd0\x31\x5f\x19\x6a\x8f\xdc\xe3\x74\x78\x29\xa9\x27\x30\x7d\x2c\x49\x7c\x88\xe2\x46\x2b\x20\xeb\x89\xfc\x11\x2c\x31\xec\x9b\x45\x4d\x24\xdc\x65\x45\x3e\x4e\xd7\x9f\xf5\xfc\x7f\x1a\x51\xdf\x83\x88\xec\xf2\x6a\x42\x1d\x6d\xa1\xa4\x46\xf7\x1c\xdc\x14\x3a\x2c\xb7\xb6\xa8\x51\xda\x01\xfe\xde\xf8\x9e\x76\xbd\x88\xbd\x35\x6d\x59\x6f\x26\xf1\x3d\xae\x43\x8a\xaa\x35\xf4\xe5\xa9\xbf\x6d\xcc\x7d\x95\x16\x20\xce\x05\x57\x90\x0f\x58\xd5\xdb\x87\x96\x16\x57\x5a\x6f\xeb\x23\x89\x70\x5c\x1b\x07\x99\xc2\xb3\xe3\x5e\x19\x3c\x65\x8e\x1a\x1f\xe5\xdc\x1c\x86\xa9\x39\x69\xe5\x09\xfa\x06\x36\x64\x1c\x88\xc7\x48\x68\xed\x2e\x56\xda\x64\x4c\xdd\xa6\x86\x0c\x78\x52\x58\xe5\xf1\xa4\xd8\xc7\xb3\x5a\x4c\xf2\xc3\x7c\x94\x4e\xc5\xd2\x5b\xc5\xbe\x3f\x2a\x0a\x7b\x7d\x85\x73\x11\x48\xa2\xa0\xf1\x15\xd7\xd0\x7e\x76\x9b\x9e\x4f\x22\x9c\xa8\x88\x42\xb9\x44\x8f\x68\x5d\xfe\x00\x41\xe8\x39\xf8\x4b\x3f\x6a\x7f\xc8\x64\x1a\x54\x06\x78\xbd\x0c\x62\x45\x7b\xbb\xde\x51\x1c\xa6\xbc\x30\xa8\x56\xe1\x42\xc8\x47\x39\x44\xfe\xed\x81\x85\xea\x7e\x01\x0d\x5b\x1a\x01\xcd\x1a\x66\x78\x75\xc8\xbd\xd5\x2a\x49\x68\xac\xda\x05\xf1\x3c\x6a\x57\x9b\x36\x9e\xcb\x1d\x18\xf6\x64\x5f\xf4\x0b\x70\x1d\x3f\x8d\xde\x91\x8f\xfd\xdd\xea\x3a\xeb\x71\x32\xad\x1f\x00\x41\x7e\x9c\x8f\xb2\x92\xfd\x0b\xb3\x38\x82\x4c\xd3\xdf\x15\x43\x88\xfd\xbb\x3f\x77\xfe\xf3\x22\xec\xb5\x5c\x9a\xac\x4f\x31\x1b\x2b\x6e\x80\xcc\xec\x69\xa1\xa9\x47\x0e\x73\xc4\xd9\xfc\x30\x52\x1e\xa5\x68\x70\x5f\x69\x7b\x90\x95\x53\x00\x3c\xfb\x9c\x4b\xbc\x03\x5e\x6f\x83\xe2\x44\xdb\xf2\x17\xf1\x0a\x68\x19\xaf\x5b\x1e\x0e\x1d\x25\x03\x42\x23\x84\x60\x18\x04\xcc\xf7\xad\x99\x2e\x88\xa6\xc4\x5f\x80\x68\xbd\x9a\xe5\xc9\x5a\x13\xbd\xfc\x68\x67\x6d\xae\x40\xd7\x34\xb0\xd8\xf0\x82\x92\x80\x97\xee\x49\x49\xe6\x2b\xe8\x72\x10\xac\xfe\x7b\xc9\x93\xfc\x6d\x06\xfb\x48\x2f\x36\xfe\x40\x76\x8a\xc8\x30\x14\xfd\xb0\xdc\x78\xa6\x45\x0c\x06\xee\x03\x04\x46\xe6\x0d\x0b\x19\x1d\x05\x3d\x3d\xb2\xf5\x16\x42\x3e\xd8\x6e\x89\xa3\x2a\x9f\x62\x52\x41\x66\x93\x1d\x78\x0b\x2d\x01\x66\x08\xd5\x18\xc4\x32\x32\xd4\xe1\x70\xde\x25\x7f\x07\xd0\xaa\x84\x18\xb0\x01\xcf\xe5\x68\xf4\xc8\x9c\xdb\xb5\x4c\x23\x39\x49\x73\x7e\xe2\x0a\xce\xd8\x0c\x24\xe9\xaa\x97\x2a\xe9\x20\x68\x43\xe1\x1d\x8b\x49\x08\x85\x90\x56\xe5\xf9\x44\xb0\x3e\xb3\x84\x1a\x2c\xc8\x30\xe1\x11\x0e\x38\x7a\x51\xef\x43\xba\x83\x94\x4f\xa9\x4b\xd1\xba\x08\x79\x28\xdb\x1c\x68\xc7\xc0\x0f\x10\xd6\xeb\x16\x16\x5d\x8c\x06\x7f\x1b\xb2\xf8\x88\x80\xc1\x9c\x90\xab\x2b\xfa\x8e\x78\x99\xf5\x0d\x2c\x92\x47\x0a\x7a\x6d\x95\x78\xca\xc0\xe2\x67\xe9\x04\xec\xb0\x4b\x48\x04\xaf\x97\x70\xa6\x74\x6d\x08\x50\x99\xc3\x73\xcb\x01\xe8\x85\x38\x2a\xd2\x50\x6f\x84\xac\x1a\x22\xd4\x7b\xb3\x33\x93\xb2\xcb\x50\x09\x0c\x8e\x81\xa9\x3b\x4e\x82\x08\x23\x0e\xe3\x60\x73\x43\xe1\x6e\x1c\xb3\x2e\xa1\xbd\xd6\xad\xdc\x6d\xbb\x4a\xae\x51\xe1\xab\x56\xfb\xe5\x59\x61\xdd\x75\x92\x4b\x11\x5c\x7f\x90\xe2\xf4\x92\xa7\x29\xf8\xd4\x00\xc5\x23\x1b\x95\x83\x7d\x4e\x50\xa0\x0d\x53\xe8\x0e\x92\xf0\x27\x44\xde\x31\xaf\x41\xb8\xb4\x45\x52\x3c\x2b\xcb\xf3\xd6\x84\x87\x2c\xb6\x19\x32\x03\x7e\x2e\xf5\x01\xcd\x0a\xfa\x09\xd4\x18\x53\x1b\xc2\xc0\x09\xf7\x35\x54\xa2\x2e\x98\x83\x4b\xfc\xe4\x97\xd8\xb0\x30\x4a\x96\x6c\x59\x12\x89\xba\x47\x5b\x57\x16\x5e\x32\xed\x28\x48\x58\x5a\x3f\x0a\xa7\xf7\x65\x0b\xd7\x8f\xc2\xaa\x5d\xd9\xb2\xf5\xa3\x00\x3c\x2b\x6a\x3c\xd3\x82\x7e\x6d\x57\x20\xed\xa5\x56\xa6\xf2\x8f\x8d\x6b\x20\xb9\xad\x56\xb6\x77\x90\x0f\xe1\x35\xbb\x46\xe5\xc7\x3f\x74\xc9\x55\xab\x4f\xe8\x56\xe5\x62\x3a\x85\x9a\xd9\x38\xf3\xa5\x85\x32\x3d\x7c\xc7\x95\x5e\x2e\x3a\x4e\x37\xd3\xcb\x19\xa7\xfd\x5d\x25\x7a\xbd\x15\xd6\x80\x51\x33\xa5\x28\x63\x05\x7b\x3d\xf5\xde\xdc\xc0\xe8\xd8\x21\x63\x3a\x55\x16\x51\x58\xc9\x08\xb9\xa2\xa7\x74\x3e\x75\x6a\xb4\xb1\xc7\x3c\xd7\x4b\x04\xd4\x3c\x45\x83\x8a\xf2\x41\xaf\x1c\xe6\x20\x8a\x0a\x21\x2e\x59\x53\x8b\x20\x50\xa8\x5a\x57\x4f\x8e\x50\xae\xad\x69\x34\x0d\xe0\xfe\x08\xba\x4d\x4c\x00\xc1\x7e\x26\xec\x82\xba\x99\x3d\x36\x90\xe1\x22\xd0\x2f\xe8\x01\xc2\xb6\x8b\xc6\x54\xaf\x6b\xa2\xb3\x4d\x57\x4b\x02\xaf\xe2\xec\x8f\xc8\xd0\x36\x33\x43\x74\xaa\xfe\xd5\xa4\xa6\x85\x37\x25\xd9\x75\x1f\xcc\x94\xb2\x65\xe3\xbc\x92\x73\x8e\xb6\x1b\xd4\x16\x9f\x19\x08\x31\x41\x0e\xdd\x44\x5b\xfc\x6f\x98\x2b\x0f\x45\x5b\x16\x83\xf1\xc3\x51\x50\x4e\xd4\x55\x14\x2e\xa8\xb4\x44\x66\x70\x6a\xfe\x41\x09\x36\x78\xb3\x8b\xe2\x65\x9f\xd5\x1f\xbf\x45\xdc\x8f\xe1\xea\x27\xd3\xb2\xf2\x72\x16\x30\x3a\x13\x5e\x4c\xbc\x03\x3a\x8e\xb5\x61\x05\x32\x52\x6d\x8b\xb2\x18\x07\x3e\x2f\xe3\x04\x0b\xa5\x28\x78\xb4\xf3\x9e\xa1\xc3\x53\xf7\x2a\xa5\x14\x9a\xb4\xae\x47\x27\x90\x9a\x0a\x8d\x98\xd3\x38\x91\x28\x46\xff\xda\xfd\x4c\xf1\x45\x71\x0d\xa8\xfd\x2c\x61\x2f\xde\x1e\xbd\xca\xe8\xe2\x9a\x15\x88\xd1\xab\x61\x69\xe0\xae\x77\xd8\x93\x6c\xef\x01\x40\x9c\x34\x99\x64\x5f\x98\x16\x7b\x73\x9d\x69\x2d\x05\x70\x24\x25\x93\xf0\xe4\x2f\xf6\x61\xe9\x2a\xb7\x6c\x55\x21\xba\xa2\x36\x81\x82\xd4\xe1\x24\x4b\x07\x73\x68\x47\xcc\x93\x6c\x1b\x55\xfd\xa0\xe0\x08\xf9\x07\xc2\xe0\xce\x57\xb4\xb3\x51\x84\x61\x09\x2e\x25\x84\xe0\x1c\xff\x49\x2c\x26\xe9\x47\xf5\x4d\x85\x2b\x2c\x5d\xaa\x2a\xd6\xeb\x50\x04\xad\xd7\xa1\x2d\xff\x44\x7b\xa3\x45\xc1\x57\x5d\x45\xef\xd8\x54\x6f\xaa\xc4\x42\x99\x8f\x53\xe4\x5f\xad\xbc\x65\xd7\xd0\x6b\xd3\x1d\xc4\x80\xb6\xbb\xba\x8c\x8c\xad\xba\x1f\x56\x60\x94\x0e\x06\x24\x19\x79\x62\xc0\x2e\x1b\x81\xeb\xb1\xfa\xbc\xb6\xb7\x22\xbe\x64\xc5\xdf\xc2\x10\xe2\x92\xdb\xf5\xb2\x4d\x83\xf3\xef\x17\xc5\xb4\x34\x6b\x3b\x56\x8a\xb3\xc2\xf1\x8b\xdb\x5a\xaf\xe1\x86\x47\x7f\xce\xf2\x1e\x34\xb8\x70\x83\xd4\xc7\x4e\x5a\x5b\x0b\x93\x5d\xb8\xb2\x31\xd5\xfd\x98\x53\x3a\x56\x9d\xc0\xe7\x39\x15\x6d\xa2\xa2\x52\x33\xb5\xe3\xe2\x5d\x56\xbb\x29\xb1\xec\x65\xf7\x25\xb2\x2b\x35\xd2\x5f\xb3\x0a\xd2\x8c\x6f\xda\x6e\xf5\xfb\x22\x6a\x06\x43\xab\xcb\x15\x69\x2e\xf4\x0a\xa5\x1b\xf5\xf3\x62\x4d\xfb\x1a\x92\xd1\x0e\x70\x72\x6c\xb0\x1e\x31\xc7\x17\x53\x76\xbc\x42\xf0\x67\xf8\x28\x39\x89\xb1\x3e\x95\x37\x5c\x2e\x65\xd8\xcb\xff\xc7\xde\xdb\xf7\x37\x71\x24\x8b\xc2\xff\xfb\x53\x0c\xdc\xb3\x2b\x09\x64\x19\x30\xd9\x04\x39\x84\x6b\x6c\xb3\xf1\x4d\xc0\x5c\x6c\x92\xdd\xc7\xf1\x46\x63\x69\x6c\x4f\x90\x34\x3a\x1a\x09\xe3\x93\xf8\xbb\x3f\x5d\x6f\xdd\xd5\x3d\x3d\x92\x6c\x48\xb2\xf7\x1c\xf2\xfb\xed\x62\x4d\x77\x57\xbf\x57\xd7\x7b\xd1\x5f\xc7\x0e\x60\xc4\xfc\xa9\x2e\x04\x81\x3e\x38\x75\x51\x0a\x1c\x60\x1d\x9b\x40\x0d\xba\x42\x27\xea\xb1\x80\xe5\x92\x14\xac\xa8\xa2\x0f\x95\x88\xf8\x8a\xde\x0f\x0d\x74\xb9\xd5\x86\x5b\x79\x75\x5f\x82\xb0\x1f\xfa\x22\x45\x36\xb5\x22\xcd\xb8\xcd\x00\x45\x21\x16\xb1\x25\x5e\x38\x54\xa2\xb8\x6a\x86\x3b\xf6\xf3\x90\x45\x86\x3c\xb6\x09\xc1\x56\xb1\x99\x61\x93\x2a\x36\x39\xe2\x39\x80\x20\x84\x42\xd5\xf8\xa6\x0b\x8b\x47\x4e\x14\x5e\x74\xdc\x14\xdd\xa0\x7e\xd4\x50\xfe\xc9\xc6\x4c\x6b\xbd\xda\xa8\xff\x2f\x51\x9d\x91\x41\x73\x6c\x85\xba\x31\x63\x27\x37\x30\x4d\x9a\x4e\xd3\xab\xda\x11\xb3\x55\xdd\x82\x71\x56\xcc\xd8\xc2\xa2\xfa\x91\xfa\xe8\x62\xd9\x41\x76\x9a\x6a\x6d\x2b\xe5\xb4\xe5\xd6\x76\x85\x22\xe0\xf6\x55\x06\x3d\x35\x70\x49\x0f\xa7\x06\xec\x32\xc6\x2d\xd2\xdc\xaf\x6e\x0e\x25\x8a\xc9\x02\xc5\x68\x31\xf9\xe3\xb5\x46\x8c\xd6\x85\x47\x2f\x0a\x1a\x28\x01\xc6\x0c\xbd\x93\xf4\xb9\x74\xde\x49\xa6\x22\x39\xe8\x88\xc8\x0a\x18\x4d\xdf\x41\x48\x1d\x8e\xaa\x65\x01\xad\xbc\xec\xc0\x28\xff\x60\x08\xa3\x6e\x72\xec\xf9\x59\x9f\x70\xa9\x0d\x88\xd8\xb5\xb3\xae\x4d\x92\xe2\x81\xad\x44\x49\x70\x00\x1c\x12\x5e\x1a\xa0\xc1\x56\x5f\x12\xa4\x41\xf7\x1c\x84\x53\xfa\xf8\x40\x4b\x0f\xdb\xfe\x67\x89\xbe\x28\x51\x38\x24\xcc\x92\xeb\x7f\x9f\xc2\x5b\x20\x9d\xea\xf7\xaf\x4b\xaa\xfd\x97\x96\xc6\x65\x7a\xd7\x87\xec\x05\x1c\x7a\x93\xf5\x33\x70\x3c\x83\x98\x29\x75\x41\x89\x74\x9d\x30\x32\x91\x79\x56\x69\x14\x95\x4e\x5b\x0b\x7a\xe5\x30\x47\xab\x47\x41\x62\x92\x8a\xa8\x3f\x1f\x70\x25\xb2\x6d\x34\x86\x8b\x58\x11\x32\xa0\x90\x5c\x79\x60\xcf\xb5\xbe\x66\x35\xc1\x56\x48\x17\x65\x83\xce\xb8\x08\x3a\x2d\xeb\x87\x6d\x6f\x08\x0b\x01\x6b\xed\x70\xd7\x08\x4b\x88\x8a\x58\x2c\x78\x2b\x66\xb9\x41\x85\x4a\xf8\x95\x29\xfa\xcd\x55\x02\x82\x68\xd7\x1e\x08\xcd\x42\x8c\x11\x46\x31\xb3\xde\xf2\x3f\xb3\xc7\x47\xa3\xd5\xa2\x90\x21\x9e\x73\x3f\x04\x0d\x79\x00\x41\x43\xf8\x4a\xc3\xef\x87\xf0\x1b\x05\x91\xf0\xeb\x11\xfc\xb2\x68\x0e\xbe\x3c\xc6\x2f\xd5\x50\xa1\xac\x75\x82\x0f\x7f\xd3\xd9\x26\xbe\xfa\x12\x7e\x79\x98\x03\xbe\x7e\x05\x5f\x1d\x2d\x0f\x71\x4a\x70\x24\x35\x01\x34\xa0\x1c\x47\xb6\x2c\x3a\x06\x54\xc4\x41\x2f\xb4\x39\x87\x60\xa6\x58\x2b\xb0\x5d\x87\xef\x38\x9d\x78\x08\x0d\x28\xfe\x5b\x50\xec\x8b\x1a\xa0\xc6\x97\x7e\x8d\xc0\x9c\x05\x6a\x7c\xe5\xd7\xf0\x59\x4d\xa8\x80\x49\x9a\x02\xe7\x0f\xf3\xfd\xa1\x19\xb3\xec\xa8\x99\x68\x6d\x38\xd6\x58\x20\x13\xd3\xfc\xf1\xe3\xfa\x98\xad\xba\x84\x55\x2f\x00\xf6\x31\x46\x84\x79\xb4\x4a\x44\x18\x2f\xf8\xcb\x57\x8f\x6f\x15\xfc\xe5\xc6\xf1\x11\x6f\x12\x2d\x46\x67\x81\x0b\xe2\x7f\x58\xf2\x7f\x43\x57\x92\x86\x61\x56\xb7\x78\x4b\xaf\xd6\xe2\x70\x1d\xaa\x55\x18\xb9\x23\xd2\x87\x05\xa8\xbc\xfa\x20\x0e\xa2\xbd\x84\x2e\x98\xdb\x2b\xb4\xe2\xb5\x2f\xb2\x0b\x35\xbb\xa6\x90\x34\x47\x02\xf0\x7f\x1b\xfa\xa0\xf1\x76\x0c\xfe\xb2\x63\x17\x50\x0e\x31\x91\xe7\x31\xac\x43\x48\x60\x17\x3a\x8a\x82\xfd\x18\x0b\x23\x81\x3e\xdc\x3e\xde\x26\x11\xf8\x53\x07\xec\x58\x2a\x9e\x48\x7e\x58\xf9\xd0\xf6\x87\xeb\x07\x4e\x23\x38\x4a\x76\xb3\x47\xa2\xb2\xc0\xe2\x0b\xab\x75\x46\xe6\xee\xa4\xe7\x5e\x50\x6a\xcf\x8d\x5a\xe1\x0d\x76\xf0\xd5\x91\xdf\x60\xd8\xce\xfd\x31\x8c\xb9\x86\x40\xfd\xa8\x62\x82\xdb\x2f\x24\x70\x13\x3f\x0a\x17\x2a\x4a\x7d\x92\x68\x33\xa2\x31\xf9\x6e\x71\x85\x4e\xa8\xf9\xdf\x0a\xea\x7f\x9f\x81\x9a\xb3\xae\x3e\x60\xbe\xad\x35\x7e\xaf\xf8\x4d\xe1\xb6\x5b\x75\xd3\xb6\xd8\x52\xde\x44\x8e\x0e\x4e\x63\x45\x89\x19\xbd\x9c\x79\xf9\x43\x3a\xcc\x07\x61\x35\xdf\x13\x1c\x7b\x47\x15\x11\xc5\x86\x95\x10\xf7\xf0\x53\x96\x6b\x52\x8d\x61\x07\xc5\x5e\x74\xeb\xb6\x6d\x29\x4b\xbd\xe6\x3c\x2c\x3b\xea\x3c\x06\x77\x83\x00\x39\x7f\x37\x06\x5d\xb9\x23\x1e\x3c\xa4\xd4\x35\x2a\x08\xbc\xdb\xf1\x1b\x53\x0e\xba\x5a\xb3\xf6\xf4\x90\x9b\xa1\x07\xdf\x4f\xe8\x58\xdf\x81\x9f\x24\xf2\x26\x3d\x84\xe6\x75\x11\xe0\x36\xed\xd8\x12\xb8\xb1\xa6\x8b\xc7\xd3\x0e\xf3\x11\x24\x3a\xc1\xb4\xcd\xf6\xbc\xc4\x39\x2c\xa8\xbd\xb5\x66\x03\x36\x2c\x8a\x23\xa0\xd8\x58\x16\x36\xc5\xfd\x6b\x30\x4d\x8a\xee\x8f\x52\x90\x98\x66\x64\x65\x55\xd1\x51\x70\x1a\x97\x76\x90\x53\x14\xf3\xa3\x04\x19\x50\xdb\xa0\x90\x70\x69\xe7\xcc\xf9\xed\x9c\x77\xba\x5e\x66\x87\x5f\x17\x4f\xbe\x2d\xee\x2b\xf6\x15\xb9\xae\x3c\x74\xeb\xac\xcf\xb1\xc9\x16\x02\x41\xdc\xe2\xd5\x0d\x12\x83\x90\x95\xc4\xc6\xdd\xd5\x32\x84\x80\x61\xf4\x5d\x69\x03\x3f\x36\xba\xf0\xff\xfb\x03\xd5\xfe\xad\xf9\x70\xed\xe7\x8d\xd0\x20\x66\x69\xf9\x4e\x40\xc0\xdf\xe5\x46\x17\xfe\xf1\x40\x1c\x99\x0f\xd7\x41\xee\x09\xbb\x20\xb0\x9d\xa6\x69\x31\x28\x54\xd3\x59\xc1\x90\xbd\xe4\x23\x5e\x3e\x91\xf0\x37\x2e\x5f\xdc\x6d\x3e\xb2\x6c\xee\xf0\xca\x9b\x30\xd5\x4a\xf4\x35\x49\x39\x22\x0d\x3a\xe6\x0d\xdd\x4b\xd1\x30\x52\x76\xd6\xdd\x0d\xfc\xa6\x2f\x08\x05\x5d\x7e\xba\x10\x25\x53\x23\x71\xb1\x24\xb7\x09\xfa\xb6\xe5\x18\x13\x4f\xdc\xba\x94\x87\xa8\xce\x93\xa3\x0c\x06\xa4\x7c\x0d\xb1\x04\x84\xf7\x17\x41\xb9\x77\x21\xa0\x42\x08\x40\x71\x0d\x4f\xbe\x5a\x3d\x4c\xe1\x42\x62\x75\xf3\x96\x89\x07\xfe\xf0\x60\x82\x82\xc1\x62\xa2\xd9\xd0\xec\x8b\xe5\x71\x97\xf9\x78\x80\x06\xc2\x06\x75\x7c\x68\x27\x57\xc9\x75\x10\xee\xc1\xf0\xbe\x3f\x62\x9d\xc0\x14\x8b\xdf\xee\xaa\x2b\xbd\xf3\x8d\x03\xb3\xb1\xba\xee\x7d\xe7\x79\xef\x74\xd1\xb9\xfd\xd0\xe5\xb1\x75\xc0\x45\xfe\x1f\x07\x67\x67\x65\x86\x36\xee\x36\xc5\x8e\xfc\xc1\x27\x98\x03\x36\x7c\x9f\x9d\xcd\x48\x76\x72\xe5\x41\xf8\xe7\xca\x10\x8e\x8a\xc9\x1a\x0a\x58\x62\xc7\xbb\x66\x39\xe8\x60\x7f\x14\xbf\x84\x47\xed\xf1\x2d\x8e\x1a\x17\x74\x6e\xc5\x8d\x48\x63\x48\x60\x5f\xdb\x08\x0a\x75\xe5\x5b\xb2\x2f\xd2\xfc\x46\x2c\x8c\x6d\xb4\xb0\xaf\x4a\x1f\x24\x93\x8c\x26\x54\x0b\x9b\xa9\xdc\x6a\x5e\x67\xae\x71\x14\xa8\x5a\xf9\xdb\x04\xce\xb4\x6d\x6f\x1d\x3c\xd3\x2d\xe7\x6d\x03\x68\x0a\x84\xdb\x06\xd1\x94\xf6\x47\x59\x39\x5b\xd6\x5a\xd7\xc1\xfb\x2e\x8d\x3f\x55\x04\x53\x3b\x19\xbe\xc4\xe6\x1a\x2f\x03\x16\xa9\xea\x0d\x6d\x59\xd0\x4b\x7b\x1f\x4c\xd3\xf3\xc8\xec\xdd\xf7\x70\xb5\x83\x93\x8c\x9f\xbc\xae\xd5\x33\x1a\xe5\xdd\x75\x85\xad\xa0\x55\x3d\x22\xf0\x1b\xeb\x7a\x21\x8c\x05\x57\xdc\x07\x12\xa4\x0b\x0f\xc6\x1f\x8f\x2d\xea\x4f\xc1\xe6\x99\x8d\xcc\xfd\xa3\xe3\xac\x06\x40\x6b\x5b\x7b\x47\x68\x3a\x0f\xba\x31\x1f\x5c\x2d\x22\x61\x42\x01\xa7\xdb\x6b\xf8\xb4\x19\x11\x58\xc2\x1e\xc3\xaf\x27\x37\x92\x3a\x2e\x3c\xad\x50\x6b\xf3\x86\x24\x14\x20\x73\xf8\xfe\xb7\x8f\x24\xad\xaa\x88\xd4\x26\x83\xaf\xc1\xb0\x9c\xf0\xc9\x5f\x77\xf8\xf8\x70\x75\xf1\xea\xbf\x83\x18\x35\x8e\xd4\x40\x9a\x8a\xb3\xb3\x87\x05\xbe\x50\x00\xec\x2f\x6e\x49\x41\xd6\xcb\x36\xd7\x94\x72\x11\x65\x26\xb8\x52\x1c\xb9\xd5\x8b\x6c\xc8\x1a\x63\xa5\xb6\x8b\xca\x5a\xb8\xa5\x2f\xc3\xa9\x44\xec\xaa\x82\x8f\x76\x6f\x3a\xd9\x06\x76\x19\xb4\x98\xf0\xaf\x2d\xb0\x01\x5f\x3b\xe0\x29\x73\xd5\xd4\xad\x5b\x71\x8a\x2b\x18\x83\xa2\xb4\x90\xae\xc7\xf5\xfd\xdb\x2d\xd7\x77\x51\xe4\xed\xa5\xa1\xb7\x63\xaf\x83\xf7\x3c\x50\x8a\xa6\x21\xdb\x03\x09\x2f\x47\x79\x9b\x4a\x32\x13\xf2\xec\x7d\xb0\x84\x3a\x3d\x42\x59\x96\xdb\x08\x43\x4e\xe7\x67\x57\xec\x2e\x87\x8e\x6f\x56\x74\x66\x65\x33\x71\x77\x8a\xc0\x3d\xf6\xfe\xd3\xe4\xa1\x0d\xeb\x44\xb6\x9d\xc9\x53\x26\xb9\xc9\x54\x56\xdf\xab\xaa\xe1\x15\x56\x84\x2e\xbb\xf8\xff\x6b\x62\xfc\xe6\xa6\x69\x59\x53\xc7\x90\x0e\xad\xc5\x14\x75\x24\xbf\x49\xbf\xa4\x3b\x14\xe7\xbe\x68\xe0\xd5\x0c\x43\xc0\x1e\x0e\x53\x6b\x36\xa6\xc2\x16\x2c\x1c\xb6\x15\xc5\xa1\xdd\x9a\xe9\x62\xba\x3d\x6b\x3e\x68\x51\xa0\xb2\x8d\x46\x20\xcd\x12\xa3\xb8\x6b\x0f\xa6\xb8\x8e\x9a\xfa\x1c\x13\xc2\xe3\x5a\x78\x0f\xf5\x78\x8b\x31\x00\xe0\x4d\x73\x1b\xe6\x4d\x43\xba\xde\xd8\x00\x73\x5a\xeb\xc1\x49\x19\xdc\xc7\xfa\x38\x00\xbb\x46\xfe\x69\xa6\x16\x88\xd5\xc5\xeb\xfb\xc2\x00\x12\x18\x12\x0d\x37\xd9\xa7\x50\x7f\xd6\x8f\x13\x9d\x90\xd1\xa1\xcf\x7a\xa0\xf7\x87\x79\xff\x9d\x18\xf6\x3d\x17\xe7\x6d\x08\x3e\x36\x9f\xcd\x60\x2b\xcc\xbf\xe8\xb9\x45\x83\x19\x96\x45\x72\x9a\xb1\x6d\xf0\x8b\x62\x6a\xd8\xe4\x01\x57\x05\xb9\xd4\x28\x1d\xcf\xd3\xa1\x80\x30\xbf\xf2\xc9\x9c\x74\x82\x9d\xe4\xb0\x48\x7e\x81\xb4\x60\xe7\xf3\xac\x2c\x93\xc6\xa4\x98\x34\xc8\x6e\x02\x0f\xe1\x7c\xba\xed\x26\xf9\xd4\xbf\x01\x50\x49\xaf\x81\x0e\xbf\xe5\xdd\x09\x1f\x8a\xc1\x3f\x95\xdb\x70\xf0\xda\x05\x8a\xb5\xa9\xab\x2c\xd5\x8a\xfe\x88\x66\x59\xca\xa4\xc7\x4c\xa3\x35\xee\x83\xf5\xed\xb9\xc8\xdb\x01\xb1\x8f\x31\xcd\x2a\x46\x99\x7e\xb0\xab\xc0\x30\x30\xbc\x0e\xea\xee\xa0\xd8\xc5\x96\xbb\x80\xcf\xbb\x1c\x98\xeb\xf9\xde\x8b\x83\x37\x7b\x7c\x81\x60\xef\x40\x97\x02\x03\xd4\xc1\x9d\xbd\x03\xa6\xc2\x04\xdf\xd1\x68\x47\x45\x0a\x36\x45\x3c\x67\x33\xd6\xbd\xf7\xe6\xd6\x7c\x1f\x8c\x10\xfe\xab\xa9\xd2\x6c\xb8\xee\x1b\x6d\xef\xcc\x73\x2c\x07\x67\x04\x12\x1a\xe1\x0a\xc8\xd9\xcc\xe0\x0b\x84\xda\x6c\x14\xe3\x5a\x78\xa1\x35\x49\x12\xe2\x51\x67\xcd\x4a\x99\x5c\xe8\x7a\x56\x4d\x33\x3d\xf5\x7f\xc4\x72\xb3\x7e\x83\xe0\x7c\x2a\x4c\x17\xba\xe3\x0c\x2b\xd6\x15\x43\x34\x91\x96\x26\x3c\x38\xbd\x29\x0a\x1c\xa3\x68\x40\x4a\x0f\xa2\xdb\x43\x83\x5d\xb6\x43\x91\x5a\x9f\x60\x93\x14\xd4\x8f\xdb\x24\x2f\xba\xb7\xec\x12\x9c\x7b\xb5\x2b\x2e\x68\x8b\xec\x80\x87\x03\x62\x2f\x1d\x41\x8c\xdd\xdd\xe4\xa9\x0d\xdd\x23\x47\x02\x31\x79\x35\xba\xca\x0d\xba\x7c\xb3\xf7\xfa\xfb\xed\x9d\xbd\x78\xaf\x02\x2e\xfc\x2e\x26\x8a\xe6\xfd\x08\x8b\x28\xfd\x39\x04\xba\xfc\x5f\xea\x79\xb1\xcb\xe3\x59\x35\x4f\x94\x51\xf3\x92\x85\x39\x78\x4d\x23\x14\x2a\x00\x1d\x3e\x14\xe0\x9b\x1a\x8a\x8a\x0b\x51\xd6\x2f\x06\xd9\xdb\x37\xfb\x4d\x41\x50\x3f\x62\x98\x8f\x06\x05\xc7\x8c\xee\x02\x3a\x48\x4a\x34\x8c\x7c\xd6\xc0\xa8\x3f\xf6\xdd\x82\xdc\xeb\x70\x46\x66\x49\x6a\xd8\x1c\xf3\x4a\x58\x2f\xd3\xf5\xe4\x85\xa1\xad\xce\x8a\x0f\x14\x7e\x64\x32\xcd\xd6\xa9\x7b\x03\xe4\x4e\x7c\xd3\x4d\xf5\x4e\x39\x19\xe6\xe6\xa4\xfe\xaf\x46\xeb\xf8\xe1\x09\x2a\xa3\x1b\x6a\xde\xb3\x82\x82\x4e\xeb\x60\x49\xfc\x29\x9c\x6b\xe3\x6b\x8d\xf1\xbf\x69\xb0\xf2\x33\x9a\x51\x47\xd7\xb4\x19\x75\x02\x4e\x71\xb1\x45\x0a\x92\xb3\x5f\xfe\xb7\x20\x67\x97\x52\xaf\xf5\x24\xa8\xcf\xbb\xfd\x31\x54\xa8\xdf\xe7\x42\x42\xb4\x18\xbf\x2e\x26\x64\xc8\x96\xbd\xf7\xf4\xd8\xf8\xb3\xc3\xd6\x6d\x06\x8f\x1b\x7e\x1a\x13\xbe\x0e\x22\x2a\x6c\xa4\xf9\x30\x4a\x4c\x92\x7d\x00\x1f\x96\x0c\x02\x2a\x99\xcb\x4d\xcd\x11\x14\x86\x2f\xfa\x31\x3b\xfd\x2e\x9f\xa1\xbf\x9d\xb7\x92\x71\x12\x67\x09\x79\xe3\x85\xf7\x51\x54\x4d\x45\x0c\xf9\x07\x10\x36\xbf\x23\x51\x22\xcb\x88\xaf\x93\xec\xd6\x2d\x09\x92\x28\xac\xff\xf1\xc4\xc8\x0a\xdb\x12\xa5\x44\x3e\x6a\x67\x02\x2a\xe4\x76\x3b\x73\x2b\x0a\x84\x07\x20\x17\x07\xca\x09\x03\xfc\xaa\x5c\x4c\x21\x7b\x60\xa3\xe1\x05\xef\x8c\xf2\xdf\x50\xb0\xf8\x2a\x03\xef\x7e\x53\x8a\x25\x18\x22\x57\x59\x69\x94\x0b\x07\xc3\xb4\x4e\x48\x8f\x68\x9a\xe2\xd3\x10\x13\x37\xa6\x97\x6e\xfd\xa2\xfb\xd8\x6e\xc9\xa3\xee\x57\xfe\x88\x77\xfd\xab\x5b\xbe\xeb\x0b\x75\x44\x35\x69\xd5\x96\x3f\xe7\x8b\x5e\x89\x48\x6c\xf2\x0e\xc5\x87\x92\x64\x06\x29\x66\x3f\xb8\x71\xd4\xb9\x64\x50\x10\xdd\x77\xaf\x12\xcf\xfc\x8b\x20\xa0\x39\xbf\x4c\x55\xf5\xd6\xaf\x37\xb8\xaf\x2a\xb8\xf9\x6d\x98\x80\x3a\xca\x3e\x46\x9f\x2f\xbd\x0f\x8b\xc9\x9a\x9b\x9f\xe2\x60\x65\x16\x9f\xe2\x4a\x68\xf7\xf8\x29\x8e\xca\xcd\xf1\xf0\x3e\xb9\xe5\xe1\x0d\x72\x6d\x7b\xee\xca\x62\x61\xd9\xd6\x49\xee\x5b\x9c\xaa\xfe\x8e\x2d\xf6\x82\xc5\xa9\x8a\xad\xba\xac\xf4\x6c\x80\x80\x91\x1a\x53\x4e\xdf\x02\xb1\x26\x6d\xd7\x0d\x4c\x35\x7f\x6d\x87\xe8\x02\xda\x27\x5e\x72\x71\xe8\xc1\xc5\x10\x0a\x73\xf7\xcf\xd2\xa9\xd9\x43\x67\x13\x1b\x64\x77\xa2\x44\x4e\x64\x6f\x66\x53\x3b\xdd\xbf\xdf\xc2\x64\xf4\x53\x08\x58\x85\x19\x53\xad\xc5\x2a\x66\x75\x52\x9f\x3b\x2e\x43\xbd\xa9\x11\xff\x0e\xd1\xe1\xf0\x39\xd3\xe5\x3a\x6d\xbd\x50\x22\xb8\xa4\x0d\xcc\x60\xdb\x80\x5b\xe9\xaa\xb7\x74\x53\xc9\x80\x6f\x9b\xb1\xad\x8c\x37\xf7\x2b\x3b\x73\xd5\xf2\x5d\x76\xa5\x7f\xd3\x02\x5b\xe9\xa8\x5d\x51\xb5\x7f\xb8\x70\xb3\x82\x8d\x31\x29\x62\xc0\x6b\x59\x4a\x36\xec\xe3\xe2\x56\x75\xf1\x15\x20\x9d\xf7\x5f\xb5\xe1\x34\xfd\x1a\xee\x22\x28\xfe\x10\xb6\x64\xe8\xaa\x06\xa4\xf1\x37\x04\x53\xb3\x75\x0b\x03\x9f\x35\x95\x13\xc6\x9c\x58\x3a\xa1\x2f\x8b\x81\x79\x76\x2b\xb6\x34\x91\x9c\x13\x23\xac\x59\xcd\x9c\xd1\x08\x28\xfe\xa1\x87\xcb\x31\x68\x02\x68\x5a\x30\x6a\x07\x44\x22\x05\x08\x06\x99\x0c\xc9\x34\xaf\x93\xbc\x2d\x33\x83\xeb\x31\xef\xc4\x3d\x72\x05\x1a\x82\x8c\x56\x85\x66\xe0\x4c\xc4\x14\xb3\x01\x82\xc5\x65\x53\x3f\x9a\x25\x92\x14\x8c\xba\xd1\x6c\x91\xa2\xb1\x5e\x64\xcb\xd3\xce\xa8\x04\xff\x15\x1b\x84\x66\x68\xec\x69\x7f\x07\x49\x4d\x3c\xa1\x4d\x34\xb1\x7f\xe0\x79\xcf\x04\x2f\x79\xe2\x90\xf6\xc0\xbe\x0d\xc8\x45\xea\xfc\x16\x7e\xdb\x48\xae\x7d\x87\xc1\x17\xa4\xda\x8f\xfa\xdc\xea\xe4\xe3\xce\x7d\x2f\x92\x84\x5a\x9e\x80\x9a\x0e\x2a\x2f\x84\x7a\x23\x82\x65\x25\xc3\x48\x90\x30\xb9\xd9\xdf\x4f\x1a\x77\xe9\xed\x48\x62\xf9\x9a\x7d\x08\x98\xb1\xb9\xf5\xef\x98\xa2\xd9\x1f\xa7\x43\x09\x48\xaa\x03\x3a\x0b\xaf\xdd\x56\x7d\x13\x7e\xe6\x6f\xd8\xca\x50\x01\xf1\x16\xd5\xd7\xb8\xb2\xa8\x9e\xf5\x58\xd5\x30\xec\xe1\x83\xcf\xaf\xef\xe7\xd7\xf7\xf3\xeb\x7b\xdb\xd7\xf7\x0f\x90\x8e\xd6\x3c\xc1\x10\xc1\xa8\x18\xbf\xcf\xc6\x18\x23\x1b\xf3\xfb\x73\x70\x50\xf0\x2f\xb0\xd1\xef\x19\x2a\xd9\xc3\xaa\x67\x31\x30\xad\xab\x7f\x14\x75\xc5\xa6\x8d\xde\xbd\xe8\x55\xd4\x2d\xbc\x37\xf1\xc2\xce\x55\xfe\x52\x41\xfe\xb0\x46\x28\x04\xb6\x05\x3f\x53\x3c\x48\x61\x22\xf0\xda\xb1\xbe\xa1\xf2\xb2\xea\xfe\x83\x77\x55\x32\x70\xf1\x83\x67\x0e\x7b\x37\xe2\xfb\x11\x8b\x96\x1d\x79\x3d\x63\x63\xaa\x79\x49\xe3\xc3\xb7\xdd\x05\xb2\x9c\xa7\xde\x72\x09\x92\xa9\x1d\x86\x96\xb1\xd4\xf5\x5f\x23\x29\xa7\xba\x15\x69\x39\xfc\x47\x62\x1d\x1c\x48\x5c\x4c\x8e\x7b\xa3\x45\xe5\x38\x3e\xeb\xee\x16\x4f\x48\xeb\xef\x72\x4d\x62\x5a\xbf\x92\x41\x9f\xca\x5f\x58\x8b\xcf\xa3\xcb\x51\x91\x1e\xd7\x2c\xc9\x72\x29\x73\x78\x26\x2b\xb2\xe6\x9a\x11\xc4\xa4\xad\x35\x83\x58\x49\x30\x1b\xb9\x1b\xc1\xc0\x16\x89\x68\x17\x0a\x69\x5d\xac\xb7\xc8\x3c\x60\xba\x35\xe3\xae\x48\x45\xfc\x1b\x1e\x49\x8e\xb1\xe4\x16\xbb\x2a\xab\x89\x2f\x6b\x16\x1e\xa9\xab\xda\xb5\xae\x8a\x61\x34\x73\x14\xb9\x73\x3e\xab\x24\xc4\x5b\x18\xaf\x8a\x62\x4b\x1b\x86\xa5\x1a\x77\x5f\xc3\x3c\x8e\x74\x90\xac\x27\x0f\x4f\x2c\x9b\xb0\xfa\x3a\x68\xc9\x69\x7c\xef\x8a\x49\xdd\xd6\x79\x91\xab\xfc\x5d\xd3\xf1\xe4\x3f\xd1\x86\xb1\x75\x4c\x74\x90\x9f\x8e\xcb\x59\xb6\xc4\xbf\x07\x07\xa4\x9f\x99\x05\x6c\x8e\xae\x66\x99\x9c\x0a\xdd\x1e\xd4\xba\x85\x20\x78\xb1\x03\xc8\xc3\x87\xb7\xa4\xf3\xb5\x49\xed\x62\x23\x67\x47\xa8\x5c\xe4\xe7\x17\xeb\xc3\xec\x7d\x36\x74\x24\x8a\xb9\x37\x9c\xec\x03\xa9\x17\x6a\x0c\xe8\x9c\x89\xda\x8c\xe2\xe0\x00\x80\xe9\x1c\xc5\x09\xe4\x2e\x08\x44\x2d\x78\x34\x96\x17\xc5\x0c\x03\xaf\x0b\x18\x70\xb1\x4a\x67\x73\x94\x16\x38\x5f\x45\x89\x18\x37\x97\x64\x7d\xc7\x2e\x7f\x66\x72\xd2\xb6\xa1\xf9\xac\x13\xe2\x5b\x0c\x41\x17\xb7\xcd\x82\x40\x38\xa3\x74\x0c\xd2\x6a\xce\xd5\xd3\xa6\x9c\x2d\xe8\x6a\x39\x28\x16\x74\xab\xdd\xe6\xbe\x55\x0e\xd4\xf7\xf0\x0c\x91\xa1\x2c\x47\x08\xf9\x9a\xcb\x37\xbe\x69\x3b\x0f\xa2\xd3\x62\x80\xe1\x71\xef\x09\x8a\xbe\x97\xb8\xd1\xfa\x42\xed\x14\x13\x85\xf5\xe7\xe6\xd7\x28\xb9\x6b\x10\x53\x59\x80\xb3\xa3\x21\x77\xbb\xd2\x2c\x3a\x40\xfe\x54\xd1\x4f\xdf\x78\xe0\x09\xf5\xf9\xf4\x57\xfa\xf7\x7a\xc9\x44\x42\x47\x32\xc3\xe4\x81\x1d\x21\x7b\xbd\x72\x38\x1c\xae\x47\x09\x79\xf6\xcf\x70\xd9\x25\x50\x2c\xe5\x4b\xba\x32\x03\x9d\x62\x3c\x79\xf1\x72\x07\x8a\xc3\x45\xc9\x9e\x26\xe5\xbc\x7f\x01\x40\x52\x4e\x3e\xb1\x41\x81\xe7\xd1\x5d\x93\x82\xe8\xcb\xaa\x05\x89\xa2\xdb\x28\x40\x90\x60\x29\x38\x30\xcc\xe0\x6d\x38\x86\x2c\x1d\x74\xaa\xee\xab\x53\x17\xd2\x85\xaa\xdb\x14\xc4\x3c\xf3\xa9\x5b\xfe\x45\xcb\xbb\xb1\x91\x74\x3a\x1d\xbd\x58\xca\x61\xce\x9a\x7f\xdb\x1d\x1c\x3a\x9b\x02\x2f\x24\x68\x6d\x36\x5f\xc7\x27\x33\x3a\xb3\xf1\x50\x9f\x06\xf1\xfc\x94\x7a\x43\x0c\x23\xaf\xc5\xba\xd7\x4e\xd9\xcb\xd8\xcc\x3a\x04\x8e\xa9\xc5\x43\xf4\x60\x75\xed\x5f\x6b\xce\xf1\xd3\x2d\x8c\xba\x9a\x6b\xbe\x47\x68\x4d\x54\x19\xbb\x20\xe2\x3a\x51\x31\xff\x47\xcc\xb7\x52\x48\x90\x00\xf3\xb9\x78\x7d\x61\x5a\x5b\x5c\xb8\x8d\x7b\x77\x92\x59\xfa\xce\x50\xb4\xe8\xa4\x6d\xa0\x65\xd3\x71\xfe\x5f\x18\x43\xe9\x5e\x4c\xb6\xf4\x52\x6a\xa8\xbf\x4e\x87\xc5\xe9\xc6\x28\x35\x67\x6a\xba\xf1\xfd\xfe\xce\xde\xab\xc3\xbd\x5b\xb7\x3f\xcb\x10\x15\xae\x43\xf2\x8d\xfe\xac\xdc\x90\x27\xf0\x97\x92\x40\xb2\xf9\x2e\xdc\x9e\xf4\x7d\x91\x0f\x38\x19\xd6\x38\x03\xcf\x92\xf7\x19\xdd\x1d\xf2\x3f\x2c\x93\xd7\x17\x06\xe1\x9a\x3d\x8c\x8c\x03\x12\x2c\xcd\x36\xb4\x3b\xb7\x88\xca\xbe\xf8\xea\x6f\xd8\xd5\x06\x1f\x92\x79\x0a\x47\x87\x7c\x57\x0c\x2b\x0f\x86\xc1\xdb\xe7\x1c\x9d\x10\xce\x67\x73\x9e\x76\x4c\x7f\xd9\x87\x83\xb3\x66\x63\x7b\x3c\x98\xc2\xa8\x1e\x75\x1a\x94\xb9\x7f\x1d\x73\x2d\xc5\xaa\x3c\xee\x3c\xb0\x75\xd0\xec\x5f\x57\x7a\x59\x9c\xe6\xc3\x2c\x39\x4c\xcf\xcc\xf3\xe7\x40\x05\xb5\x76\x2e\xcc\xa6\x65\x0d\xb2\xd2\xae\x16\x7b\xcb\x60\x6b\x05\x4a\x32\xcb\x19\x5e\xbb\xb3\xea\xab\xc9\x01\x6c\xc3\x6a\xf3\x51\x38\xe3\x57\x88\x1f\xea\xe0\xc0\xe1\xd1\xc6\x63\xbc\x92\xb3\xb0\xcd\x0a\x73\xfc\xf8\xe4\xf8\xe1\x97\x4f\x4e\x8e\x1f\x9c\x70\x4e\x59\xae\xd4\xb6\x55\x28\xcc\xd2\x60\x3e\x31\xe4\xc3\x97\x4f\xb0\x8f\x95\xbc\x44\xab\xf7\x50\xb9\xe5\x19\xe2\x03\x69\x01\xba\x90\xf0\x13\x9c\x55\xd0\x99\xe2\xe1\x4a\xce\x2a\x06\x05\x7e\x5f\xa4\x83\x84\x0a\x4a\x91\xe1\x03\x11\x06\x38\xdf\xeb\xad\x94\xcf\x22\x4c\x79\x9d\x42\x92\x14\xaf\xce\x04\x3e\xe1\x90\x00\xf4\x6e\xd6\x1f\x52\x22\x1a\x73\x74\xc7\x66\x0f\x45\xe2\xc3\x3f\x13\x4e\x94\x50\x9d\x24\xed\xbe\xed\xb1\xeb\xc6\x44\x48\x0e\xfb\xe9\xd2\x08\x50\x51\x4a\x2b\x80\x9f\x61\x09\xd0\x8b\xc8\x36\x87\x2f\xa8\xfd\x7c\xb8\x92\x87\x49\x74\x51\x30\xce\x95\x3f\xd9\x39\x7c\xba\xd1\x64\x71\xec\x83\x6c\x98\x8f\x72\x8c\x05\xd7\xf8\x2b\x53\xc2\x03\x0a\x17\xf7\x05\xfd\xc2\x18\x15\xdf\x43\xa5\x6e\xf2\xe8\x81\x9d\x31\x05\x83\xe4\xef\x0f\x1f\x3c\x78\x80\x33\x5f\xb3\x3d\x74\x70\xfa\x3f\x00\x51\x5d\x7a\x12\x62\xb3\x10\xed\x44\xe5\xf8\x67\xe2\x7b\x0a\x4e\x3c\x89\xcb\x3b\x4d\x6e\x18\x7c\x31\x66\x53\xb6\xbd\x94\x88\x32\x76\xd8\x16\x54\xc7\x1f\x13\x5e\xdd\xfd\x31\x6a\x09\xae\x92\x67\xce\x68\x2e\xe9\xd6\xb4\x10\xce\x2d\x14\x5e\xe4\x43\x64\xd2\xc0\x87\x4f\x8b\x2c\xf2\x21\x4b\x2c\x1c\xb3\x2d\x43\x96\xfa\x20\xfc\xf5\x0b\x8b\x92\xcb\x1c\xca\x39\x79\xea\xb0\xd1\xb3\xa0\x0c\x8a\xba\xb1\xfa\xf7\xd9\xe1\x86\xf9\x58\x10\xac\x02\x68\x0f\x5b\xc9\x7f\x66\x59\x8f\x29\xfc\x23\x19\xc5\x34\x01\x5e\x0b\x38\xcf\x46\xc3\x0d\xcf\x05\x9e\x8e\x04\xb5\x86\xb1\x1b\x9e\xc9\x34\xa9\x00\xe2\x8c\x05\x66\x9d\xcc\x08\x74\x66\x04\x69\x67\xd8\xaa\x05\xed\x60\xd8\x66\x32\xad\x96\x17\x54\x9a\xa6\xc4\x72\x6a\xa7\x0b\x09\xe2\x35\x99\x11\xb5\xc2\xc9\x22\x61\xc3\xc9\x04\xfc\xb1\x5c\x57\x3b\xb8\x63\x96\x66\x55\xa0\xb0\x8a\xa6\x0c\x96\xcd\xcc\x28\x04\xad\x7f\x45\xd6\x2f\x00\x70\x7c\x02\xf2\x7c\x43\x0e\x35\xe5\x63\x4b\x3e\x18\xd8\xad\x3a\xe0\xd7\x6b\x6a\x1e\xce\x11\x6f\x2b\x7a\xf1\x0e\xd8\x43\xcf\x0b\xe1\x91\xe6\x86\x5e\x34\x5d\x54\xef\x1f\x2e\x07\x56\x88\xe4\x38\xe1\xbe\xec\xbc\xaf\xdd\x9d\x9d\x16\x05\x74\x42\x2d\xcb\x8b\xfc\x6c\x66\xbd\x43\xaa\x57\x1a\x3a\xa1\x06\x40\x90\x1e\x9f\x34\x74\x27\x54\x55\x67\xf7\xa0\x2f\xb0\x47\xbc\x38\xd1\x29\x46\xa7\xa5\xe4\x0e\x95\x0d\x41\xce\x76\x98\xa5\x86\x80\xc4\xb1\xc3\x88\xcc\x53\xc9\x83\x6a\x50\xc0\x67\xf3\x09\xfe\xcf\x17\xd5\x40\x85\x93\x86\xb9\xa5\x58\x44\x07\xf8\x61\x3b\x09\x2a\xc2\x95\x85\x4f\xfe\xd5\xc7\xfb\x4b\x97\xbf\xcc\xf6\x21\xb6\x85\x0c\xa1\x6d\xb0\x67\x2b\x52\x99\x1e\x19\xbc\xa6\xe6\x8a\xe0\xa7\x2d\xef\xca\xdf\xc9\xcb\x57\xe9\xab\x26\x96\x00\x39\xe4\x1d\x1b\x5c\x67\xa0\x81\xdc\x54\x83\x1a\x5e\x27\x4b\x2b\x26\xdf\x18\x64\x18\x2f\xf9\xda\xc5\x0f\x73\x6f\x85\x3d\x59\xf5\xfb\xcb\x5f\x8f\x11\x0a\xdc\x8b\xd5\xf7\x77\x45\xbc\x05\xd0\xed\xb4\x3e\xae\x87\x15\xaf\xdd\x77\xd9\x95\xff\xda\xa1\x0e\xad\xfe\xca\x01\xba\xa9\xdc\x34\xef\x96\x61\x0e\x45\x30\x6e\x38\x37\x4b\xdd\xbf\x98\x8f\xdf\x95\x6b\xfa\x81\xcc\x50\x57\xb5\xf1\xaf\xe6\xf1\xbf\x7e\x3a\xfe\xe9\xe4\xe4\x5e\x6b\xc3\x3d\xa0\x12\xa4\x67\xa3\xf9\xd3\xb1\x94\xff\x74\xd2\xda\x38\x77\x5e\x60\x7f\xcf\x66\x6c\x57\x01\xa0\x1c\xe8\x32\x3b\x1f\x11\x6c\x2a\x31\xf4\x50\xd6\x47\xf4\xa8\x3d\xc8\xc0\x3b\x83\xd2\x41\x1a\x18\x23\xe0\x31\x8a\xf7\xd9\x14\x54\x8e\x99\x38\x09\x5b\xfc\x2d\x2a\xf9\x3c\x2b\xdd\x0a\x2c\x43\xf2\x3c\x8c\xe3\x87\x27\xad\xe5\x0b\x65\xc8\xed\xf2\x42\xcd\x06\x7a\x30\xa4\x40\xf6\xc1\x10\xd4\x6a\xd5\xde\xd1\x26\xc9\x59\x44\x95\xa2\xeb\x46\xf5\x02\x15\x49\x9e\xad\xca\xc3\x4e\xbf\x2f\x8a\x09\xea\xac\xe7\xe7\x17\x36\xa6\x30\x64\x06\x96\xec\xbc\x05\x27\x76\x86\x50\x5f\x73\xf3\x34\xa1\xb3\xe5\x45\x3e\x23\x3a\xcb\x0d\x8b\x34\xcc\xf8\xf3\xf2\x02\x78\x99\x66\xd3\x6d\x02\x02\x76\x7b\x40\xfc\x0d\x3a\x5f\x1b\x7c\x05\xf4\x88\xa3\x8c\x38\xe2\xbd\x9d\x85\xa1\x52\x02\xc4\xb1\xfa\xa2\x5b\xe3\xc4\x8d\x9f\x8e\x7f\xfb\xe9\x64\x03\x32\x8a\x34\x5a\x95\x17\x72\xc1\x42\x55\xae\x10\x79\xa5\xa2\xb1\x4f\x03\x65\x7d\xd9\x28\x05\x14\x60\x48\x39\x74\xe8\x4c\x07\x03\x33\x7f\xc3\x37\xbd\xa7\xb4\x25\xc3\xec\x6c\xb6\x16\x6e\x54\x7c\x97\x00\x7d\xdf\x87\xdf\x8c\x9c\xb9\x72\x87\x51\xe4\x7d\x40\xdf\xfe\xfe\x89\xc3\x79\x14\x2f\x00\xe0\x0a\x5a\x88\xb3\x08\x4b\xc8\x5b\xd2\x5a\x4f\xe9\x09\x69\x18\xfe\xd6\x0e\x5e\xbe\xb2\x1f\xbd\xfd\xce\x32\x1c\xdb\xc8\xd2\xaf\x0d\x6f\x6f\x25\xbc\xd1\xb5\x37\x2b\x17\xfb\x51\xfe\x52\x49\xd2\x2a\x24\x34\xe8\x94\xa8\xb7\x48\x11\xf4\x4d\xac\x0b\x0c\x3b\x91\x38\xe2\x6f\xb2\xf3\xbd\x0f\x93\x2a\x39\xde\x32\xaf\x63\x15\x4a\x57\x2d\xb0\xfd\x1a\x8e\x66\x42\xda\xcf\x70\x24\x13\x76\x18\x68\x50\x5c\xed\x86\xd7\xc1\x04\x93\xe8\x6b\xe0\x13\xd1\x96\x56\x9f\xa4\x2a\x74\x5d\x16\xef\x42\xd5\xd0\xfd\xb8\xcf\x7e\x67\x21\x0f\x12\x76\x18\xe1\x51\x22\x9d\x06\xb5\xba\xfe\xf1\x54\x45\x8a\xd2\x9a\x65\xa3\xc9\x01\x3e\xb1\xe1\xc9\x91\xdd\x7b\x16\x9e\x72\xe2\xcd\x82\x03\xdb\x85\x86\x5b\x11\x02\xce\xde\x5d\x03\x03\x5c\x89\x00\xcf\x23\x62\x43\x6c\x0a\x82\xe8\xd2\x9c\xc5\x89\x88\x75\x19\xfb\x57\x90\x2e\xa3\x1e\xf8\xd5\xe4\x31\xf3\x8d\x8c\xf2\x5d\x78\xb7\x57\x60\xbb\x88\x3b\x81\xda\x15\xa6\xcb\x0c\x86\x16\x26\xf2\x54\xd3\xf3\xcc\xe3\x40\x4a\x3c\x46\x01\xd0\x22\xd0\xd1\x1f\x65\xd3\xf3\x0c\xe8\xf6\x36\x03\x8e\xe2\x13\xaa\x0b\x21\x4b\xd2\x3e\x52\xf9\x8c\x38\x48\x30\x30\xa7\x28\xd5\x8f\x1e\x7e\x85\x62\x80\x95\x3c\xf3\xfe\x04\x31\x00\x1e\xf2\xd7\x53\x83\x76\x3e\xfc\x1d\xd4\xc6\x20\xcc\x53\xd1\xef\x93\xe4\x14\x44\x82\xd9\x4c\x47\x6d\x87\xd4\x75\xa6\x7e\x3b\x09\x08\x1b\xb5\x36\x54\x03\x90\xb1\xe1\x00\xd4\x1b\xe1\x2c\x0b\x0c\xba\x36\xd8\xfb\xf6\x60\xf9\x11\x20\x7c\x1f\xed\xc1\xbc\x6a\x59\x3a\xbb\x4d\x07\xd5\x47\x2d\x20\x03\x4b\x25\xaf\x72\xe0\xf1\xc0\x48\x1f\xe7\xb4\x9a\xd9\xb6\x5b\x60\xef\xa5\x10\x24\xfb\x7c\x7e\x76\x96\x4d\xf1\xf8\x54\x39\x25\xe0\x8b\x9c\x8a\xb2\xc2\xef\x60\x48\x77\x53\x51\xd9\xd9\xed\x06\x09\xbb\x34\x9c\xfd\xc3\x83\xa5\xa0\x9e\xda\xc4\xa2\x21\x8c\x46\xc3\xbb\x04\x4a\x07\x21\xed\xd4\x1b\x12\x3e\x71\xb6\x8a\x20\xc2\x05\x55\x4e\x8b\x02\xc8\xf9\xe8\x1b\x78\x9c\x8d\xd9\xe7\xc7\x86\x86\xe6\x5d\xc5\x97\xff\x29\x9c\x8a\x48\x15\x58\xdd\x93\x0a\x5f\xfb\x5e\xe4\x56\x1c\x29\x33\x3e\x29\xff\x51\x0e\xc6\x43\x20\x2a\x90\x4d\xe3\xef\xaa\xa8\xb0\x58\x8c\x06\xb9\xd1\xea\x98\x90\x1b\x78\xc8\x10\x66\x50\x89\xa0\x53\x21\xe5\xec\xcc\xe9\x8f\x2a\xef\x6d\x0f\xb8\x95\x5e\x44\x4f\xb4\x77\xa3\xe2\x67\x7e\x55\x36\xee\x56\x43\xaa\xc3\x07\x2b\x0e\xc5\xc7\xe7\xb2\x97\xcb\x88\x3f\xbc\xe6\x21\xf1\xb7\x90\x1a\x23\xb3\xd1\x55\x29\x31\x77\xe0\xbc\xe7\x5c\x53\x5a\x95\x96\x5b\x51\xc6\x27\x76\xa6\x81\xa5\x68\xd0\xbb\xed\xdd\xc2\xf0\xf2\x87\x27\x3d\xb8\xfe\x18\x22\x1f\xd6\xf6\x45\x31\x1d\xa5\x33\xc7\x64\x79\x44\x15\x15\x82\x6a\x24\x20\xab\xc2\x17\x47\x1f\x50\xdd\x32\x90\x3a\xe8\xce\x02\xe4\xd5\xe0\x07\x05\x15\x31\x6a\x77\x16\x43\xe5\x46\x66\xa1\x5d\x7b\x32\x34\x32\x4f\x47\x63\x81\x80\xc9\x07\x67\x1b\x57\xd6\x28\x72\x0e\x3d\x2a\x25\xba\x1a\xc7\x0a\xfa\xc9\xd6\xbf\x03\x5a\xe1\x43\x85\x94\xda\x4a\x37\x13\x69\xae\x05\x97\xd0\xbf\x7a\x08\xf7\x97\x22\x1f\x37\x1d\x93\xb1\x80\x98\x5a\xc9\x1d\xb2\x42\x4c\xdd\x48\x3f\x24\x11\xfd\x70\x27\x8e\x8a\x88\xa4\xb5\x2c\xe6\xd3\x7e\xb6\x40\xb9\x11\xdd\x0d\x6a\xb5\x6c\x33\xd4\x9d\xa5\x06\x66\x33\xe8\xe6\xd6\xb0\x88\x7c\x83\xa1\xda\x53\xd7\x64\x55\xf9\x96\x4c\x16\xe9\x5e\x6f\x92\x62\x30\x1e\x4c\x16\x05\x0c\xee\x5b\x80\x2a\xa8\x51\x1d\xb5\x40\xcd\x3c\x3c\x14\x4e\xdd\x7f\xc0\x08\x5c\xe5\x0d\xa3\xcf\x2c\x90\xa0\xa1\xac\xf8\xd4\x50\xcb\x63\x6a\x74\x92\x2c\x48\x66\xb9\xd2\x84\xa8\xb4\x76\x42\x5c\x6c\x30\x32\xfd\x65\xf5\x02\x95\x41\x2f\xee\x2d\xba\x28\x5a\x58\x7b\xc7\xaf\xc1\xe0\xbd\x63\x62\xc7\x12\x3d\xde\x02\xb4\x82\xc4\x22\x6c\x9d\x37\x78\x7b\xd2\xdf\xd1\x49\x7f\x57\xe1\xea\xde\x99\x73\xfe\x0e\xcf\xf9\xbb\x05\x5c\xdd\xbb\x80\xab\xc3\x17\xd9\x1d\x68\xc0\x2c\x61\xc2\x54\xde\x4b\xd4\xaf\xc4\xb7\xd9\x29\x74\xfc\x4d\x5e\x7e\x40\xb8\xa5\x77\x3b\x9a\xaa\xac\x4d\x40\x97\x90\x15\xb2\x9d\xde\x4d\xe3\x40\x34\x81\x4c\xc9\xee\xd5\x6c\x7a\x55\xbd\x56\xd6\xdd\xdd\xd1\xb5\xa0\x33\x75\xc2\xbb\xfb\x28\xb9\x4b\x1a\x16\xc7\x26\x7d\x48\x9e\x94\x34\x63\x97\xd4\x4a\x00\xae\xfd\x91\x31\x3f\x5b\xa5\x78\x0c\xfa\xf6\x65\x5d\x9f\x80\xa8\x40\x14\xe4\x2d\xd9\x19\xb1\xba\x67\xa5\x76\x1d\x80\xb3\x30\x2c\x8a\x77\xf3\x09\x17\x5a\x4d\xa9\x7b\xfb\x28\xeb\x2a\xd6\xb9\x53\x51\x91\x8a\xb1\x91\x69\x7a\x4c\x95\x4e\x2a\xfd\x12\x26\x21\x80\x35\x97\x2e\x24\xa5\x51\xfa\x4e\xeb\x95\x0d\x34\xcd\xe5\x5d\x8a\xe0\x31\x5e\x86\xfb\xab\xcb\x5b\x83\xfc\x93\xe0\x3f\x3b\x12\x3b\x13\xd3\x70\x81\xa2\x31\x5c\x1d\xdb\x7e\x95\xfb\x1f\x10\x1d\x9f\x50\x9c\xa3\x74\xa8\xc1\x99\x54\xe4\x05\x1e\xc6\x18\x25\x51\x7d\xd4\x44\x8e\x19\x9e\xe8\xc0\xe0\xa7\x22\x2e\x17\xbe\x9b\x7c\x13\xb0\x01\x69\x0f\x59\xe5\x41\x50\x41\xf6\x10\x74\x47\x1c\x7d\xac\x3b\x47\x24\xab\x7b\xb1\x88\x15\x5e\x2c\x10\xf6\xbc\x57\xf4\x5c\xee\xdc\x69\xb2\x46\x55\x5c\xa0\xf4\x3b\x11\x14\xb9\x11\xaf\x50\x87\xae\x80\x25\xcd\x90\x1a\x5b\xc9\xbf\x5f\x52\xa4\x14\x93\xab\x69\x7e\x7e\x31\x4b\x1e\x3d\x78\xb8\xb9\x6e\xfe\xef\x71\x3b\x79\x61\xd0\x97\x61\xfa\xdf\xb5\xc1\x25\x14\xad\x23\xb7\xcd\xb2\x60\xb5\xd2\x4c\x09\x1d\x88\xad\x55\x26\xc6\x92\x60\x1a\x82\x82\x79\x81\x9f\x71\x3f\x1b\x83\x93\x30\xac\x17\x09\x2c\x9f\x1f\xee\xae\x97\xb3\xab\x61\x26\x85\xe6\x9c\x9a\x52\x76\x33\x05\x40\x6c\x92\x97\x9c\x81\x16\x46\xbc\x8b\x41\x33\x4a\xc1\x8a\xc1\xc2\x0b\x53\x1d\xb8\xee\x66\xd3\x2c\xeb\x24\xdb\xe8\x5a\x82\x6e\xa9\xe9\x30\x39\x9f\xa6\x63\x0c\x4a\x61\xea\x4e\x52\x8c\x43\xc6\x03\x07\x3f\xd5\x53\xbf\xdb\xe4\xf5\xf6\xd1\xde\xab\xa3\x43\xaf\xcf\x12\xe2\x94\xd8\x3e\x65\x9a\xff\xdb\x1c\xc4\xf7\xf9\x20\x2b\x5f\xe2\x4a\x9a\xd3\x56\x1a\x9c\x6f\x66\x87\x21\x6c\x5e\x0f\xe7\xe7\xe8\x79\xbd\xb1\xb6\x76\xd7\x59\x36\xde\x65\x9b\x6e\xac\x83\x0e\x70\xe9\xd8\xb7\xe0\x52\x89\x06\xbc\x3a\x62\x60\xa5\xa0\x57\xe4\x8e\x41\x5b\x55\xcb\x6f\x3d\x2d\x26\x29\x1a\x05\x2e\x6c\xed\x6a\x49\xeb\xc3\xab\xb1\x59\x8f\x59\xde\xc7\x0a\xf1\xb6\x7e\x1d\x1b\x5c\x2c\xed\xf7\xe7\x23\x88\x1a\x0a\x5a\xf7\x22\xde\xd4\xaf\x23\x9d\x1a\x74\x72\x70\x16\x6f\x80\x45\xb6\x8b\xbc\x3c\x34\x2f\xf9\x2c\x47\x97\xe0\x70\x01\x3a\xae\x74\x8b\x6b\xbf\x2c\xde\x67\xb5\x95\xb9\x50\xea\xee\x19\xee\xb1\xae\x2a\x95\x51\xcd\x0c\x93\x43\x64\xbb\x78\x58\x76\x39\xd9\x79\xac\x59\xb4\x22\xc1\xb8\x48\x4b\xf9\x80\xe2\x96\x4a\x5b\xaf\x42\xd0\xaf\x7c\xde\x1f\x1f\x4c\xcd\x59\x3c\x9c\x15\x93\xed\xd9\x11\xa4\xbf\x7d\x6a\x50\x47\xfd\x30\x6a\xdb\x39\xaf\x82\xfd\x5d\xb8\x42\x9c\x58\x8b\x7c\x08\x38\xe5\xd1\x94\x8e\x3e\xea\x58\x8b\x79\xff\x62\x03\x5c\xaa\x10\x55\x96\xd0\x04\x79\x37\x76\x9c\x68\x73\x74\x19\x64\xc7\xd1\xdc\xdc\x60\x20\x83\x00\x72\xc8\x1b\x7c\x7a\x65\x40\x0d\xb3\xf7\xe0\xf8\x29\xb6\xc8\xa5\x0b\x17\x33\x95\x1b\x66\x46\x22\x46\xd1\xb4\x3d\x86\x73\x2d\x4b\x3f\x42\x1d\xae\x0a\x4c\x17\x13\x77\xb1\x84\x9d\x93\x03\xdf\x4b\x0e\x0c\x8a\x48\x7a\x38\x58\x3c\x16\xbd\x8d\xde\xa8\x30\xd7\x74\xb7\xb8\x1c\xf7\xda\x80\xb1\x50\x31\x5c\x42\x36\x58\x9a\x2a\xa2\x19\x99\xfc\xa9\x21\xf4\x46\x19\xe1\x29\x00\x67\x47\xf6\x0c\x7f\x83\x05\x6e\x09\x60\x0f\x71\x7d\x0e\xb3\x99\x45\x0e\x22\xb8\x9f\x98\x4d\xcc\x06\xe6\x85\xca\x21\x0f\x3f\x2c\x0d\xe4\x1b\x53\x72\xfd\xd3\xf9\xe9\xe9\x30\x1b\x74\xe9\xfc\x37\x7f\x2d\xc6\x87\x75\x10\x61\x25\xae\xad\x4b\x60\x3f\x9d\x80\x21\xf2\x0a\x2d\x77\xa8\xa6\x00\xb0\xa2\x14\x0a\x7c\x13\xac\x15\x19\xe8\xdf\x68\x6d\xd4\xb2\xe0\xa3\x40\xe0\x30\xca\xd0\xdc\xec\xee\x15\x7a\xc7\x82\x4b\x41\x36\xa0\x88\xc4\x2e\x83\x16\x06\x94\x30\xc7\xc9\x3c\x97\xd3\x82\xd2\x31\x0f\x21\x86\xc0\x19\x3e\x1e\xa6\xcb\x94\x80\xe9\x2d\x34\x17\x67\x90\x14\x06\x87\xc0\xb8\x06\x73\xb4\xa8\x19\x15\x30\xa6\xb9\xf8\x17\x74\x92\x5d\xfa\x9e\x86\x25\x6d\x82\x97\xd2\x01\xa6\xdd\xa3\xa8\x94\x66\x34\xf9\x68\x94\x0d\x72\x08\xa0\x71\x65\x5e\x0b\xb0\xb3\xa0\x78\xcb\xa9\xb8\x2d\xe0\x41\x93\x04\xd3\xef\xf3\x0c\x02\x38\x13\x40\x97\x14\x9b\xaa\x4a\xa2\x74\x3a\x23\xf8\xe9\xd3\x1e\x92\x5a\x90\xcb\x4f\x49\x4d\xd3\x1b\x1d\x13\x5c\x3e\x40\x9e\x72\xa3\xf0\xef\x4f\x72\xa3\x00\xa9\x7c\xd2\xb5\x7a\x59\x03\x70\xe9\x4a\xc5\x1b\xae\xb8\x4e\x84\xf2\xdd\x04\x25\x1a\xe4\x40\x70\xf0\x80\x69\x0d\x88\xb4\x52\xb8\x7a\x1d\x88\x14\x0d\x37\x86\x26\xe2\x4e\x91\xad\x01\xc3\x32\xf3\x9d\x06\x6b\xa0\x06\xfe\xc6\xaf\x4a\x03\x45\x85\x9c\x05\xf2\xc6\xec\x48\x5a\xae\x0a\xc7\xd6\x8e\x81\x3a\xca\xa6\xa3\x7c\x8c\xed\xdf\x50\x50\x98\xae\xa5\xe8\x97\x83\x8e\xb5\xb6\x2b\xeb\x77\xf4\x77\x20\xf1\x56\x1c\x31\xd7\x8d\x4f\x1d\xd8\x86\x95\x67\x4e\x95\x17\x4d\x7c\xd5\x55\x54\xf5\x19\x1c\x92\xef\xfc\xee\xbe\xce\xa6\x86\x83\x1b\x95\xe0\x2b\x52\xcc\x72\x72\x0a\x3a\xcd\x66\x97\x10\xb1\x3d\x1d\x5f\x91\x61\x95\x41\x2c\x1b\xe2\x12\x6b\x07\xd2\xa6\x04\x97\x25\xfa\x6c\x65\x20\x86\x47\x6f\x2c\xd3\x06\x6c\x03\x4c\x55\xb0\xca\x86\xab\x09\x2f\xb4\x59\x61\x8a\xe2\x83\x77\x11\xb0\xa4\x82\x33\x91\x41\xe0\xd5\x05\x07\xae\xf2\x22\x7d\x97\x11\x38\x9d\x4c\xf1\x4a\xce\x33\x56\x1c\x81\x29\x91\xc1\xa0\xd9\x28\x9f\xcd\x08\xa5\x93\xb3\x2a\xbf\x0f\xfc\xd8\x83\x29\x72\x9e\x95\x42\x5a\x6f\x43\x25\x8c\x34\x63\x1e\x05\xc2\xad\x05\x50\x25\x30\x26\xa6\xc9\x7b\x8a\x94\xf9\x76\x7e\xda\x93\xa6\x87\xe0\xbc\x61\xc8\xed\x09\x96\x94\x09\x89\x92\x61\xab\x5c\x84\x22\x42\xe1\xe4\x7f\x06\x17\x9e\x9b\xf6\x8e\xdf\xb4\x93\xc3\x76\xb2\x73\xd2\x13\x4e\xa6\x48\x2e\xb2\xe1\xc4\xb0\xc7\xc3\x39\xee\x21\x3d\x6b\xd9\x87\x74\x34\x31\xbc\x13\xa4\x20\x9d\x1b\xa4\xd5\x3b\xec\xc1\x22\xf6\x0e\x73\xf8\xac\x06\xd6\x4b\x9a\x66\xd1\x10\x76\x31\xde\x81\x98\xfc\xbd\x24\x9b\xf5\x5b\xb8\x64\xbd\x37\xd4\x2a\xc6\x37\xd8\xe9\xdc\xdd\xcd\xcc\x93\x67\xb0\xcf\xfa\xae\x43\x0f\x58\xb1\xbc\x2b\xe3\x5e\x47\xcb\x44\xd9\x7b\x5a\x2e\x9a\x7e\x52\x5e\x99\x3d\x1d\xd1\x3b\x66\xc6\x0f\x51\x9e\x68\x0a\xe0\x83\x4e\xa4\x19\x2f\x0d\xaf\x57\x9b\x3c\xdf\x40\x41\x33\xc5\x7d\x87\x91\x62\x08\xdb\xfe\x4c\x36\xd6\x3c\x7c\x7d\xb3\x82\xa6\x9d\x64\x18\xa0\xc6\x8d\xd2\xd3\xd3\x19\xf0\x04\xac\xc7\xed\x69\xd8\xcd\x16\x4e\x8e\x46\x5d\x66\xde\x69\x81\xcd\x22\x10\x92\x7c\xd3\x6f\xdb\xc3\x1a\x77\x07\xbc\x26\x04\x5e\xe1\x4d\x82\x75\x97\xe1\xff\x08\x49\x15\x16\x82\x83\xb0\x2a\xbc\xbc\x15\x28\x12\x56\xcb\xac\x00\xf5\x73\xd7\xb2\x27\xe6\xfe\xdd\x85\xc5\x93\xc6\x6e\x08\xa5\x37\xb5\x48\x39\x4e\xc0\xf1\x39\x83\x0d\x5e\x49\xa0\x27\xb2\xb3\x82\xc2\x6f\x5d\x41\x2d\xf6\x5a\xe4\xe1\x13\x7d\xc4\xd9\xbc\x21\x44\x23\xa4\xd7\x03\x08\x86\x1c\xca\xcd\x11\xe4\xe4\x0f\xe1\xad\x48\x9a\x17\xe8\xf7\xcb\x0c\x75\x82\x99\x34\xed\xb8\x5a\x72\xca\xf6\xe9\x5e\x30\x78\x4c\x84\x8a\xfd\xf2\xfe\xe6\xd3\x05\xeb\xd4\xf6\x4e\x9c\x44\x8e\x1c\x95\xd9\x10\x9c\xda\x80\xc5\x96\x26\xb2\xb0\xc5\x78\x7d\x90\x8d\xe0\x60\x49\xa6\x40\xaf\xb7\x11\x6e\x15\x5e\x1a\x7f\xb7\x3a\xc9\x6b\xbe\xd4\x23\x94\x4f\x5c\x02\xe6\x30\x08\x65\x40\x09\x14\x40\x05\x22\x84\x45\x76\x65\x83\x50\x61\xa7\x00\x4d\x86\x81\xe4\x5f\x89\x94\x5e\x31\x64\x74\x66\x2e\x79\x49\x7d\x0f\xb2\xbe\xe1\xe9\x39\xa3\x2b\x0f\xd8\x91\xa5\x3c\x20\x3a\x7a\x82\x4d\xf2\x69\x09\xd3\x4f\xfb\x99\xbd\xb5\x07\xe3\xf5\x5d\x9c\xe2\xc2\x6b\x7b\x20\x0b\x11\x39\x7d\x70\x4e\x28\xe2\xc1\x82\xf3\xdb\x59\x0d\x8e\xa6\x2c\x88\xfc\xad\xdb\x6d\x3a\x24\x50\x5a\xbf\xe1\xee\x88\x5f\xc9\xca\xc0\x40\x31\x93\x48\x09\x6b\x97\x9d\x9d\x81\x07\x64\xa4\x9e\x59\x41\xf4\x7d\x84\xf3\x6c\x86\xbb\x51\x30\xf1\x43\xdc\xc0\x69\x26\xf1\x1d\xe8\x64\x98\x2a\x05\xd8\xa7\xd2\xa0\xd2\xd3\x72\xc6\x4c\x24\x23\x0b\x40\xe2\xa5\x7f\xfa\xe0\x38\xf0\x4b\x65\x9e\x9e\xe1\x2c\x37\xf8\x38\xb9\x3b\x05\x01\x4f\x89\x57\xd6\x9e\x86\x44\xf6\x12\x5c\xcd\xad\xe0\x2a\x9b\xe2\x25\x6c\x93\xd8\x07\xa8\x0e\xb8\x3d\xd2\x4e\xdf\x63\xa2\x57\x4b\xb7\x99\x06\x9d\xeb\xa3\xcd\xcb\xdf\x34\x3c\x81\x79\x13\x5b\xa6\xbf\xa6\x5a\x49\x73\x5d\x01\xfd\xdb\xea\x2d\x86\x71\x78\x43\x18\x87\x11\x18\x3b\x37\x84\xb1\x13\x81\x01\x73\xb1\x67\x7d\x05\x18\x01\xda\xd1\xd3\xf9\x04\x60\x76\x3e\x1e\x8c\xc2\x72\x7d\x43\xaf\xc2\x96\xc6\x1f\xde\x2e\x5b\x45\x1b\x86\x37\xce\x34\xf7\x28\x0c\xa2\xac\xaf\x45\x6e\x42\x01\xf5\x40\x55\x69\x10\x2f\x9a\x62\x02\x4b\x83\x67\xd8\xdc\x27\xf3\x98\x0c\xe9\x3e\x96\xe6\x09\x29\xcf\x72\x88\x1c\xcf\x88\xb9\x17\x12\xa8\xbd\xc8\xe3\x31\x10\x36\xb3\xf4\xb1\x42\x14\x55\x1e\x05\x07\xd8\x21\x61\x49\x5f\x5a\x12\x02\x83\x20\x56\x66\x45\x00\x08\x92\x09\x60\x31\x0f\xf2\xba\x92\xc9\x24\x7d\xc4\xeb\x96\x24\x69\xc6\x17\x53\x5f\x98\xca\x19\x73\x9c\x3b\x33\x4e\x3d\x96\x6c\x37\x2b\xaf\x98\x7e\x3f\x59\x7a\x50\x85\x22\xcd\x6f\x03\xc5\xe7\x24\x36\x88\xb6\xef\xdd\x04\x0a\x49\x84\xc1\x2c\x38\xf9\x95\xac\x2d\xae\x0d\x32\x9a\x7c\x0f\x21\x38\x30\x83\xc7\x1b\x83\x30\xa6\x82\xc6\x7d\xd1\x2e\xe1\xf1\xda\xd6\xa8\x9d\xdc\xdf\x65\xf9\xdb\x20\xcb\x26\x86\x52\xe7\xfc\x71\x14\x07\x02\x8e\x06\xe7\xb9\xd5\x90\x48\x0d\x72\x9d\x8c\xd1\xc3\x9c\x64\xb6\xaf\xf0\x6f\x09\xdc\x4c\x27\x8a\x1a\x89\x0d\xfb\xbd\x6b\x14\xa0\x2b\x62\x07\xba\x2d\x45\xac\xab\x5e\x01\x15\x19\xa1\x54\xc7\x61\x7b\x3c\xd8\xa3\xd3\x78\x64\x56\xb3\x04\x9d\x04\xa9\x4c\xd5\x72\xb4\xfd\x2f\x3c\x45\xfa\xaa\x86\xeb\x92\x49\x94\x72\xea\xf6\x44\xa6\x87\x02\xcd\x44\x49\x7d\x9b\xba\x03\xb0\x80\x77\xe2\xbf\x4e\xcd\xc9\x4d\xba\x0c\x83\xc5\xbd\x8b\x40\xc4\xc5\x0f\x0c\x41\x77\x55\x23\x46\xb1\xa9\xd9\x88\x7f\xb7\x15\x20\x21\x22\x8a\xb7\x9d\x70\xf3\xb7\xdf\x2a\x4b\xb3\x15\x5d\x07\xd3\xce\x97\xb7\x43\xa0\xb0\xd7\x60\x9d\x39\xa0\x35\xaf\x2e\x1b\xad\x71\x64\x0c\x95\xc5\x5f\xa3\x4c\xe7\x15\x9d\x41\xc7\xd1\xaf\x47\x97\xc5\x6b\x90\xbb\x38\xf9\x71\xd3\xef\xb1\x25\xe3\x06\x62\xad\x7c\xe3\x09\x70\x97\xcb\x9e\x63\xc0\xc8\xb0\xc5\xfb\xde\xc9\x4b\xc3\x23\x73\x92\x19\x97\x77\x2d\xa8\xa4\x95\x65\x53\x12\x5b\xc4\xe0\xa3\x9e\x0e\x3b\xa9\x0c\xd9\x6c\x4b\x75\x1a\x4f\xbd\xad\x0b\x54\x96\x2e\x70\x07\xad\x82\x7d\xc5\x64\x59\x50\x39\xb5\xda\x56\xaa\x23\xe6\xa3\x2b\xda\xb8\x70\x64\x35\xdb\xb9\x78\x3f\x7d\x75\x84\xd9\x4d\x37\x3e\xbb\xf8\x91\xd9\x92\xe7\x43\x28\xae\x59\x6d\x5a\xf1\x89\x55\x85\x3f\x22\x8e\x9b\x86\x53\x0c\x27\xc9\xa7\xf6\x66\xf3\xac\x19\x7d\xcb\x59\x37\xf0\x51\x31\x84\x29\x2a\x74\xee\x78\x4a\x98\xda\xf6\x4e\x75\x1c\x55\xf8\x2c\xe9\x97\xec\x67\xe2\x55\x6a\x0e\x7d\x52\xb7\x11\xd1\xf3\xbf\xb8\x7b\x65\xda\xa4\x67\xef\xc7\x2d\x14\x10\x19\xe7\xa9\x5a\xb4\x9b\xd6\xba\xc7\x6b\xb8\xea\x39\x49\xfc\xbe\xb4\x1b\x41\xe5\x48\x54\x0f\x85\x3d\x16\xb7\x3b\x18\x99\x5e\x98\x44\x91\xa3\x4f\x03\xd5\x66\xd3\x16\xb5\x93\x63\x77\x7d\xda\xc1\x7c\x9d\xd9\x87\xaf\xd5\x0a\xaf\xb1\xd8\x09\x79\x36\x50\xa4\x0c\x83\xc7\x7d\xf5\xb5\x8b\xed\x0b\xd1\x39\x6e\xcd\xe2\x38\xe4\x13\xae\xa6\x1a\xf4\x0d\x97\xb2\xda\x12\x45\xeb\x7a\x5d\x56\x03\x14\x60\xb4\x55\xd6\x5f\x05\x98\x51\x08\x5c\x87\x66\x9f\x31\xa1\x03\xb4\x79\x1a\x97\xd3\x6a\x4d\x50\xa6\xc5\xff\xc0\x28\x90\xb7\xd6\x07\xe4\x4c\xad\x82\xb5\x80\xf8\xca\xf9\x48\x55\x85\x30\xba\xf3\x12\x0c\x1c\xae\x58\x43\x45\x1c\x01\x45\x43\x33\x74\xe3\xf9\x39\x00\xb4\xc3\x61\xab\x07\x35\x43\x6a\x8b\xea\xd9\xc5\x4d\x51\x9a\x32\x2c\x48\x56\x22\x21\xe1\xd7\x3c\x85\x56\xaa\x47\x66\xa6\xd4\x04\xa9\x21\x32\x3b\x97\x86\xd2\x45\xf2\x58\x01\xa0\xc4\xa4\x39\xe4\x2d\x25\x5d\x2d\xca\x64\x8a\xcb\x71\xab\xf3\x69\xc8\x67\xa1\x5f\xd9\x39\xe5\x3a\x41\xad\x37\x70\x89\x6e\x7b\xf4\x62\xf0\xd4\x27\x85\x19\x0d\xa4\x51\x45\xcd\x61\x40\xd6\xf6\xd3\xf1\x11\x2d\x8d\x25\x65\x7d\x0a\xf1\x57\x77\x34\xbc\xe1\x02\x59\xe0\x8f\xb2\xa3\xcb\xf1\x17\xe9\xdb\xb4\x71\x51\x3d\x31\xab\x2b\x35\x95\xbe\x1b\xbc\x8e\xe3\xc4\xab\x97\x3c\x60\x4f\x0b\x85\xc1\x1c\x0c\x24\x24\x10\x8c\x5d\x84\x41\xb1\x23\x8b\xa7\x0f\x2a\x0c\x0b\x50\x21\x14\x28\x07\x35\x17\x3a\xcb\xdf\x93\x43\xf5\x5c\x24\x9e\x92\xcd\xa5\xca\x02\x26\x9c\xd2\xe5\x5c\x11\xc2\xfb\xbb\xce\xe3\x2b\xcc\x7c\x32\x0d\x6e\x1e\xaa\xce\x1c\xea\xea\xaa\xbf\x7d\xad\xda\xc7\x1c\x1e\xdd\x7e\xf7\xe0\x25\x91\xca\x48\x77\x87\x5c\x18\xb2\xd5\x2e\x43\xab\x4d\x86\x4e\x66\x49\xe3\x62\x90\x75\x96\x0c\xc7\x67\xe6\x7a\xfe\xf7\x70\x30\x37\x60\xe0\x92\x5b\xb1\x70\xd8\x0a\x14\x43\xbf\xfa\x6c\x6e\xc7\x13\x27\x5c\x5b\x55\xa3\xf7\x59\xed\xa2\x90\x1e\x15\x0e\x2f\xe4\xf1\xe2\x5f\xa3\xa4\x9c\x26\x2e\x3d\xba\x19\xfd\x5f\x5f\x82\x62\x09\x65\x8e\xa3\x9c\x24\xe2\x90\x44\x5a\x44\x24\xeb\x68\x94\x46\x11\x15\x28\xe5\x1e\x60\xb0\x8e\x25\x67\x34\xce\xc7\x2b\x14\xbf\x76\x3a\xe4\x68\xd5\xf4\x44\x1e\x21\x02\xb9\x1c\x86\x67\xa6\xa2\x52\xc8\x39\x0f\x19\xb1\x25\x5a\x09\x42\x10\x19\x9b\x46\xb1\x0c\x61\x05\xb4\x9b\xe0\xc5\xa7\x2b\x31\xf0\x75\x5b\x5c\xbf\x9d\x0b\x09\x07\x34\xa1\xe5\x0e\xb4\xe5\xe9\x6a\xef\xb8\x6d\x29\xe0\xae\xd5\x52\x98\x03\xf2\x0a\x83\x61\x40\x7e\x12\x4e\xa9\xed\x19\xa4\xc0\x43\x04\x07\xc4\xe0\x05\x52\xb5\xb7\x25\x71\x85\xc8\x77\x04\x8e\x6b\x82\xc1\x33\x44\xfa\xa8\x55\xf4\x1e\xe4\x96\x4b\x7f\x4d\xe9\xdb\x57\x93\x2e\x78\x4a\x7c\x16\x2a\x24\x49\xfc\x40\xd4\xb4\x64\x5d\xbc\x6a\xbc\x8a\x64\xc4\x36\xc7\xca\x49\x57\x1d\x6e\xb1\x71\xf6\x0f\xcd\xb9\xe1\x12\x20\xe6\xeb\x4a\x04\x7b\x1d\x9d\x4e\x59\x5b\x3f\x39\x7d\xc9\x63\xbb\x21\x6d\xe9\xb7\xba\xf6\xe6\x8e\x2f\xf9\x82\xd5\x5e\x15\x45\x54\xe9\xc7\x45\xf9\xbc\xaa\x0f\x29\x3b\x5a\xd5\x59\x87\xde\xed\x3e\xda\xfc\xaa\x1d\x16\x2b\x4b\x3f\x53\xe1\xf1\xa3\x6a\x05\xb7\xac\x50\x61\x53\x57\xf0\x77\xf7\x6e\x77\x73\xd3\x0b\x70\xec\x2f\xa7\x29\x7e\xec\x15\xa3\x91\x83\xf9\xfa\xd5\x03\xb0\x40\x7e\xb4\x52\x8e\x93\x7a\x0b\xe4\xaa\x01\x32\xda\x07\x57\x8d\x8a\xb7\x27\xa9\x39\x08\x52\xd2\x4e\x7e\x00\x16\xd9\x3c\x7f\x8f\x3a\x0f\xcc\x7e\x9a\x92\xbb\x5c\x74\x97\xe2\xc2\x42\x50\x5b\xc8\x83\x0f\x1a\xac\x39\xea\xc6\x0d\x62\x40\xdb\xdf\xec\x43\x3f\x9b\xa0\x63\x24\xbc\xf2\xc3\x1c\xd3\xa5\xa0\x5a\x6a\xe6\x3a\x40\xca\xf3\x9f\x0c\xa3\x38\x25\x7d\xb1\x69\x30\x61\xcb\x64\x5b\x31\x49\x67\x3c\x68\x08\xe9\xd9\xdd\xd8\xb8\xbc\xbc\xec\xa4\x38\xd8\x4e\x31\x3d\xdf\x60\x13\xe8\x52\xc2\x90\xae\x9b\x01\x4b\x78\xe4\x31\xa6\x6d\xe2\x55\x23\xbb\xb3\x09\x98\x4c\x62\x36\x91\x61\x7a\x09\x51\x74\xd3\xf3\x29\x87\xe6\x85\x20\x97\xd3\x1c\x54\xf3\x40\xc2\x9f\xcd\x2e\x59\x97\x3c\x00\x2b\x94\xfc\x74\x3e\xf3\xd6\x4b\x86\x97\x97\x5e\x05\x08\xce\x3f\x4e\xee\x6e\x1f\x26\xfb\x87\x77\x93\xe7\xdb\x87\xfb\x87\x68\x19\xf0\xe3\xfe\xd1\xb7\x07\x6f\x8f\x92\x1f\xb7\xdf\xbc\xd9\x7e\x75\xb4\xbf\x77\x98\x1c\xbc\x49\x76\x0e\x5e\xed\xee\x1f\xed\x1f\xbc\x32\xbf\x5e\x24\xdb\xaf\xfe\x99\x7c\xb7\xff\x6a\xb7\x9d\x64\x39\x72\x03\x66\x83\xa7\xa8\x68\x34\x58\x17\x56\x92\x2c\xc5\x93\xc3\x2c\xf3\x86\x80\xf9\x33\xe0\xbd\xc6\xd8\xc2\x90\x07\x2b\x1d\x9f\xcf\x21\xf2\xf3\x39\x04\xb9\x40\x82\x6b\x02\x3c\x74\x59\xa2\xf6\x82\x43\x55\xa3\x33\x62\x4a\x0a\x8d\xca\xbc\xea\x6c\xb5\x8f\xd2\x89\xba\x20\x58\x03\x2e\x3b\x1b\xcb\x50\xb6\x92\x75\xc8\x75\xf5\xdf\xd5\x80\xfb\xed\xbe\x48\x0e\x16\x99\x70\x73\x2d\x69\x7d\x04\x14\x3f\x7e\x89\x44\xbc\x08\x0a\xa5\xcd\x0f\x79\x76\x09\xf7\xfb\x65\x06\xcb\x57\x33\xdc\xa0\x92\xb5\xe8\x5e\xc5\xf4\x1b\x1f\x5a\xcd\x5a\x25\x8b\x39\xaf\x5b\x1a\x8b\xaf\x62\x00\xce\x55\x71\x25\x94\x73\x49\x84\x65\xa4\x41\x9b\x6a\x32\xe2\xe3\x8a\x86\x04\x87\x8d\xa0\x76\x00\xf5\x0c\xdb\x0b\x6a\x98\x01\x2c\x2a\xc6\xb9\x2c\xaa\x00\x34\x87\x29\x46\x17\x1f\xcb\xcd\xca\xe8\xac\x27\x97\x3f\x8d\x6f\x30\x4a\x96\x63\x31\x5f\x61\xd8\x08\x74\xb2\xc8\x3f\x18\x8a\xd6\x59\xf4\xcc\x0c\x4d\x30\x4d\xad\x6d\x99\xc8\x43\x3c\xd5\x1d\x1a\x44\xcd\x78\x2e\x3d\xb6\xae\x40\x13\x24\x34\x5d\x9b\xb1\x21\x2e\xe6\x92\x27\x85\x57\x9a\x34\x66\xe9\xa4\xe1\x34\x58\xc4\x84\x9a\x6f\x30\x9b\xa3\x0b\xc8\x88\x59\x60\xd4\xb5\x87\x0f\x78\x13\x31\x21\xf7\x4b\x30\x4a\xd5\xc5\x5f\x7e\xc1\xe5\x28\x51\xd9\x29\x50\x76\x61\xd8\xd6\x0f\x44\x0a\xb5\x93\x2b\xb6\xca\xa3\x5a\xc3\xb4\x9c\xb9\xb3\x6e\x5f\x7a\x2c\xdb\xfe\x90\x8b\xa5\xb9\x69\xfd\x2b\x24\x59\x85\x44\x10\xe6\x9f\x7f\x34\xda\x86\x9f\x86\x3c\x41\xe6\x03\xfd\x01\x9f\xb2\xf1\x7b\x92\x02\xc0\x57\x49\xb1\x70\x9e\xd1\xb7\xef\xb3\xb3\x59\x03\x0d\x0b\xaf\x7c\x60\xff\xac\x02\xfb\xe7\x32\x60\x47\xc5\xa4\x41\x56\x85\x3a\xad\x03\x0c\x18\x67\x7c\x70\x86\xd3\x69\xa6\x1f\xc0\x90\x26\xae\x81\xc3\xdc\x82\x72\xb8\x83\xeb\x2e\x0c\xe3\xa1\xab\xd4\xd4\x50\x44\x79\xa0\x80\x04\x9c\xbf\x2a\x39\x86\x51\x74\x60\xa6\x27\x81\xf8\xcd\x16\xc0\xf1\xd0\x5c\xf1\xb3\x50\xdb\xa1\x60\x30\x41\x5c\x29\xa4\x95\x3b\x49\xee\x87\x48\x8a\x8a\xed\x72\x9e\xf8\x19\xe2\xcd\xb2\x19\x8a\x13\xa3\xb9\x34\xfb\x78\x5a\x6a\x16\x0c\xf7\xdd\x2c\x55\x6c\x9d\xe1\x43\xe7\x83\xdf\x70\x4b\xb5\xfb\xe7\xa2\x76\x57\xd5\x76\xbc\x3e\x2f\x21\xf1\xe3\xa4\xb8\x24\x0a\xdc\xfe\xa2\x91\xac\x27\x34\x5c\xe8\xf7\x11\x04\x63\xf1\xca\xff\xe9\xca\xaf\xa0\x9c\xf0\xc5\x83\xce\x17\xa4\x37\xba\xa6\x13\x3e\xc8\x20\x9e\x5e\x36\xee\xe7\x16\x6d\x55\x50\xca\x4b\x71\xa4\x68\xd7\x96\xc2\x15\xad\x2f\x7d\x3b\x59\x03\x37\x4d\x38\x2f\x15\x6c\x0b\x97\xd7\x1e\x3d\x0e\x1f\xa1\x07\x45\x9e\x95\xbf\x3f\xae\x74\x4b\xe2\x98\x03\xbe\xfa\x84\x3a\xd3\xc9\x47\x58\xa6\x1f\x59\x10\x4b\x6d\xd1\xa5\x6a\xd4\xfa\xdc\x06\x92\xb6\xeb\xd3\xf5\x7e\xad\x89\x73\x31\x46\xe8\x32\x4c\xf2\xd3\x50\x32\x07\x9b\x00\x11\x8b\x3a\xa6\x34\xb8\xb1\xf2\x99\x93\x80\x69\x51\x3c\x04\x28\xdb\xfb\x4a\x22\xa9\x77\x85\xe8\x35\xb7\xa6\xff\x0e\x88\xb9\xb3\x61\x71\x89\xd1\xec\x51\xe7\x84\x09\x55\x9e\x3c\xde\x7c\xb0\xf9\xc5\x97\x1b\x13\x64\xab\xd6\xc1\x2b\xc8\x50\xd3\xeb\x97\x17\x57\xeb\x60\xd9\x76\x51\x5c\xae\x8f\xb3\xcb\x75\xc8\x85\xb3\x7e\x59\x4c\xdf\x95\xeb\x69\x89\x7f\xa4\x68\xde\xb5\x6e\xc8\x47\x2a\x34\x23\x5a\x07\x9a\xce\x0d\xf4\x3e\x18\x3b\xef\xb2\xfa\xe9\x5a\xf6\xcd\xa7\x01\x45\x50\x19\xbe\x1f\xdd\xca\x17\x94\x3b\xc6\xde\x92\x6e\xf4\xeb\x67\x09\xe6\xff\x68\x09\xa6\x92\x0f\xd2\xab\x58\x23\x8e\xab\x92\x15\x72\xb1\x2a\xda\x3f\xf4\xa3\xf7\xab\xff\xf5\xaf\x49\x13\x1b\x18\x24\xee\x17\xb5\xc0\xbb\x3b\x72\x2c\x23\xbe\xf7\x4e\x64\x11\x84\x49\xe0\x28\xc7\x35\xd2\x24\xd3\xf7\x9d\x65\x82\xcb\x4a\x0f\xd7\x4e\xb4\xeb\x91\x51\xf2\x75\xc0\x2f\x2c\x3d\x83\xf6\xbd\x55\x24\x5a\xf5\x0d\x4c\x16\xc8\x50\x61\x94\x16\xe6\xd7\x95\x3b\xed\x46\x9a\x85\x0a\x55\xe6\x81\x96\xa8\x54\x05\xe7\x7f\x94\x48\xf4\x26\xc2\x64\xb5\x12\x9d\x0f\x37\x24\x32\xc2\xf6\x57\x37\x24\x36\x6e\x24\xb3\x0e\x07\xfa\xa0\x6e\x04\x0f\xf4\x22\x2c\x10\xfa\x45\x6c\x8e\x32\x4f\x9d\x4b\x82\x36\xf8\xb4\x48\xc8\xe6\xa3\x7f\x1b\xc7\x28\xa0\x6b\xef\x76\x1f\x3d\x7a\x58\x11\x9b\xfd\x21\x62\x37\x3e\x78\x20\x78\xfb\x52\x57\x08\x88\x55\x90\xbc\x3d\x58\x20\x79\x5b\x29\xeb\xd8\x67\xc9\xdb\x67\xc9\xdb\x1f\x24\x79\xf3\xef\xd7\x9a\xcb\x86\x5b\x11\x2e\x79\x0e\xdb\xf0\x11\x9c\xd5\x2c\x1b\x06\x83\x36\xe7\x63\x84\x5a\x7a\xb2\xe8\x16\x8b\x7e\x70\xec\x9a\x73\x38\xf5\x69\x3e\x4a\xa7\x57\xec\xd5\x8b\xe4\x13\x7b\x0e\xd3\x17\x4d\x7c\xac\x2b\x09\x84\xe8\x79\xc4\x53\x79\x50\x38\x27\x07\xb4\x0e\x67\xed\x77\xcf\x26\x38\x67\x20\xc9\x2a\xb4\xee\xe6\xdf\xfe\xf6\xb7\x27\x8f\x9e\x6c\x48\x93\x11\x26\x4d\x5a\x2f\x0d\xcd\x94\xaf\x13\x64\x43\xd1\xe2\x10\x0c\x39\x3b\x5b\x3f\xcb\x81\x06\x33\xb4\x70\x36\x5e\x87\xe7\x9d\xea\xac\xe7\xe5\x3a\x65\x2f\x1d\x20\x20\x9f\xf2\xc2\xa5\x8c\x12\x5e\xf4\xc4\x91\x7b\x1e\x5c\x9e\xa9\xbd\x87\xe0\x9f\x41\x0b\x13\xd2\x63\x47\x34\x5d\x0a\xc1\xf2\xec\x1a\xce\x28\x07\x59\xc1\x8b\x49\x0c\x26\x08\x71\x88\x95\x34\x30\xe1\x3d\xef\x84\x64\x97\x12\x0f\x28\xda\xab\x46\xe9\xcb\x4b\x0c\xb4\x81\xab\xd0\xe1\xaf\x8e\x54\xe0\xc4\x5a\x47\xd1\xda\x7e\xa1\x6b\x64\x1e\x10\xd7\x40\x3a\x32\x34\x82\x18\x35\x70\x1e\x89\x6f\xe4\x55\xe2\x36\x3b\x61\x5f\x41\xe7\x06\x82\xff\xc5\x03\xa4\xdf\xa7\x3b\x6a\x04\xa6\x55\x15\xf6\xb3\x00\x12\xe4\xc6\xe8\x5a\x1a\x02\xce\x99\x03\xf0\x4c\xc6\x5d\xa9\xa4\xd6\x62\xcb\x32\x7b\xd5\xb7\xd0\xbf\x7b\x2e\x72\xcc\xa3\x95\x32\xb7\xd5\x47\xe2\x24\xf7\xc2\x80\xd3\x6a\x3a\x11\x09\x19\xb1\x3b\x01\x2f\x3d\x63\xf8\x42\x70\xa2\x43\x48\x1c\x94\x83\xa5\x8a\x66\xfb\x9b\xa0\x3d\x97\x24\x75\x8b\x44\xe7\x86\x11\x68\xb4\x3a\x34\x0a\x70\xf4\xa1\xbf\x54\x85\xf2\xf9\x15\x30\xe3\x9c\x3a\xef\x6e\x4c\xf3\x76\xb7\xab\xc5\xdc\xb1\x1a\x9d\x5f\xca\x06\xb3\xe8\x77\xfd\xb9\x9a\xb6\x42\x00\x3b\x41\xb9\x57\x03\xdb\xae\x51\x32\x3e\x17\x4d\xb1\xa6\x17\x88\xaf\xf8\x04\xb2\x58\x55\x60\x00\x9d\x22\x54\x80\x79\xfb\x9f\x7c\x51\x43\x94\x98\x05\x01\x8a\x83\x48\x83\x95\xf2\x99\x2d\xcb\x35\x86\xdb\xf4\xa3\x41\x02\xdb\x83\x01\x27\x55\x57\xa9\xc7\x82\x52\x33\xb4\x47\x98\x0c\xf5\xd1\x4a\x79\xce\x6a\xc9\x92\x2f\x3e\x87\x24\x5a\x25\x24\xd1\xf6\x7c\x56\xbc\x28\xfa\xf3\xf2\x65\xfe\x61\x05\x35\x57\x24\xf7\xec\x19\xb4\x7e\x45\x81\xf0\xec\x25\xed\x6c\xd8\xcf\x77\x45\x55\xe3\x77\xc5\xaf\xb7\x95\x2e\xec\xe6\x03\xc3\x7e\x8e\x67\x11\xc3\x2f\x54\xb4\x43\xce\x60\x78\x48\x0d\x9d\x2f\x70\x1c\x07\x61\x3b\x6b\x4a\x2a\xf4\xdd\x83\x97\xf8\x5b\x27\x18\xaa\x41\x6d\xfe\xb8\xec\xd9\x74\x13\xe8\x6e\x7e\x81\x69\xe0\x1e\xad\x96\x1b\xaf\xf6\x44\x7e\x3e\x90\x2b\x1c\xc8\xe7\xe8\x5e\xb9\x3f\x9e\xcc\x67\x37\xd1\xbf\x46\x0e\x66\xad\xfe\xd5\x6c\x6e\xc0\xa3\x2d\xd7\x9c\x4a\x1b\xcd\x97\x49\x2b\x71\x97\xdb\x1b\xbf\xcf\xa7\xc5\x78\xe4\x6b\x4d\xa1\x65\xa4\x86\xb4\x7e\xc1\x41\x8c\x30\x1e\x64\x89\xab\x8d\xb9\x28\x7d\x08\x75\xb5\xee\x86\x5a\x5b\x55\x21\x54\xdf\x1a\x30\xb5\xd5\x2a\x70\xdc\x06\xd4\x40\x70\x15\xee\xd6\xe9\x62\x4d\x75\xe2\x34\xa5\xc2\xde\xab\xdd\x9f\xbf\xdb\xfb\xe7\xce\xc1\xae\xe1\x4d\x9e\x26\xc7\x4f\xda\xc9\xc3\xcd\x76\xf2\xe8\xcb\x76\xb2\xf9\xe8\x64\x0b\x33\x28\xa5\xa7\x6d\x4e\x3c\xdc\x4e\xf6\xca\x7e\x3b\x39\x34\x8c\x58\x46\x83\x3b\xda\x7e\x73\x24\x00\x4c\xfb\x47\x8f\x9e\x48\xfe\xeb\x74\xfc\xb6\xcc\x22\x73\x07\x49\x4c\x6c\xf5\x3b\xd4\xc2\x60\x09\x0a\x98\xd7\x08\xdb\xaa\x54\xa0\x6b\x32\x7c\x49\x97\xfc\x92\x90\x1d\x89\xa3\x50\x05\xb1\xac\x87\xa4\xa1\xdb\x22\x6c\xf9\xc0\xfa\x09\x1f\xb4\x4d\xcc\xac\xbf\x93\x2a\x75\x23\xf9\x31\x3b\x7d\x97\x43\x68\x86\x33\xc3\x3f\x1b\x6a\xdc\x30\x10\x57\xc0\x1f\x9f\xcd\x87\x86\xe9\x30\x64\x34\x6e\x4d\x4f\x13\xf1\x7c\x45\x39\x64\x12\x00\xb1\xc6\x69\xd3\x0c\x18\x40\xa8\xd9\x3b\x75\x57\x8f\xdd\x43\xf7\xf7\x08\x62\xae\x21\x1a\x3c\x01\x9c\x40\x5a\x02\x1c\xea\x17\x4d\xc1\x2f\xcd\xed\xc6\x34\x53\x70\x15\x73\xc3\x32\xb9\x9d\x39\x92\x51\xdd\x78\x5f\xa0\x65\xb8\x21\x54\x74\xc7\x5b\x33\xfa\x44\xd6\x8f\xb3\xa2\xd9\xc2\x4d\x03\x1d\xc3\xd8\x4c\xe2\xc9\x7d\xb4\xdd\x43\xd6\x2c\xed\xa3\x4b\x3b\x98\xce\xbb\x2d\xb7\x81\x0a\x4e\x99\x29\x1c\xa4\xb3\x14\x75\x13\xc0\x11\x03\x1c\x8e\x9e\x40\xc4\xb2\x6e\xea\x2c\x4a\x81\x45\x82\x48\x50\x63\xb6\x18\xec\x24\xff\x27\x9d\xa4\x63\x08\xf3\x60\xf0\x5b\x61\x10\xe8\xe4\x22\xef\x03\xb0\x12\x8e\x34\x64\x1f\x07\xae\x9b\xd3\x3e\x24\xcd\x9f\xe6\x9b\x0f\x1e\x3c\x68\x29\xbf\x7e\x10\xe8\x9b\x1d\xb3\x16\x88\xb4\xa4\x66\x79\x23\xe8\x60\x17\x46\xbc\xfa\xc2\x92\x88\xb2\x79\xa7\xe6\xe6\xfc\xf6\x5b\x12\x2c\xaf\xff\xfb\x9b\xe4\xab\xca\xb7\xaf\x9f\x26\x0f\x1f\x02\xa1\xca\x8b\x4f\xef\xe0\x81\x61\x7d\x53\x2c\x7b\x04\x4b\x33\x9c\x1b\x54\x9f\xd8\x5d\x75\x9b\x4a\x6b\x3f\x28\x32\x3a\x5d\x86\x9f\xc5\xc7\x0b\x4e\x5f\x82\xc7\x4f\x04\xfa\x06\x3b\x80\x29\x3e\xc6\x1b\x27\xd9\x85\x4a\xf9\xad\x0c\xf3\xdd\x59\xb0\xbc\x44\x81\x63\x79\x2a\x29\x7e\xf1\xa7\x52\x8d\xb2\x4e\x50\xe2\xfa\x63\x5d\x1d\x13\x97\x43\x6b\xea\x0a\x9d\xf7\x2c\xc3\xf2\x33\x77\x4b\x55\x9b\x43\xd0\xab\xdc\x6c\x61\x26\x41\x5a\x14\x4f\x51\x78\xf8\x7a\x7b\x67\xef\xf9\xf6\x9b\x9f\x19\xc3\x6d\x3e\xda\x0a\xbe\x7f\xbb\xfd\x06\x44\xcf\x14\xd4\x14\x84\x15\x86\x27\x9c\xee\x00\xa5\xe3\xb5\x15\x94\x75\x43\xb3\x17\x73\x36\x89\x7d\x12\x97\x93\x7c\x4a\xa7\x0f\x79\x0d\x14\xf2\xb0\x2c\x03\xc3\x84\x94\x9d\xb8\x7a\x53\x21\x92\x8f\xd0\x70\x3e\xd7\x50\x96\x2a\x39\x55\xed\x95\xf5\x9c\xc7\x11\x95\x0e\x2e\x8a\xbe\x0f\xa2\x0c\x8e\x54\xfb\x2e\xbb\x42\x6b\xeb\xda\x0a\x16\xef\xd5\xd6\x78\x0d\xa9\xc1\xb1\xf0\x64\x8d\x47\xd9\xf7\x3a\xff\x88\x05\xdc\x09\x00\x2d\x5d\x43\xbf\xc1\xc7\x2f\xe3\xf3\xe1\x7c\x5a\x3b\xf3\xd5\xd7\x58\x0c\x05\x6e\xb7\x07\xa6\xc2\xdb\x49\x6d\xa9\xb5\x44\xa8\xdd\x03\x54\xb3\x7c\x9a\x5d\x60\x50\x37\xd9\x07\x1d\xfd\xe0\x0f\xd8\x09\x65\xdb\xf0\xef\xb8\x17\x6f\x27\x03\x0a\x99\xf6\x09\x36\x43\x60\xdd\x64\x37\xa8\xcd\x1f\xb7\x1d\xd4\xdf\xbf\xd1\x7e\x50\xd0\x39\x43\xa6\x43\x42\xb1\xe4\xd2\x70\x02\xe8\xcc\x97\x35\x48\x68\x3c\xc5\xb0\x6f\x43\xb4\xbd\xb3\xcf\x73\xc1\xec\x1f\x10\x3d\x98\xf2\x51\x42\xd8\x22\x65\xff\x9d\x54\x73\x71\x59\x99\x72\x78\xc3\x09\xfb\xb9\x93\x54\x88\x2f\x0b\xd8\x92\xa3\x14\x64\x0d\x35\x2c\x28\x9f\x06\xa1\xbf\x19\x47\xc7\xb2\xd1\xb9\x56\xd1\x64\xfd\x14\x28\xd4\x17\x39\x44\xf2\xf9\x80\x94\x46\x99\xf4\x04\xaa\x95\xeb\x03\x71\x06\xd1\xcd\x19\x18\x7a\x36\x36\x0d\x5d\xd5\x46\x15\x92\xa1\x78\x33\x88\xca\xb5\x9e\x82\xfd\x5f\x36\xeb\x77\x5a\xd8\x30\x81\x70\x55\xe7\x17\x86\x86\x01\xe1\x2c\x1a\xf2\x4f\x29\x7c\x9e\xe1\xee\x67\x59\x95\x48\x91\xf9\xef\x50\x37\x55\x49\xb7\x47\x9c\x34\x3d\xc9\xf5\x6c\x3a\x34\xcd\x81\x58\xd3\x9f\xd3\xe1\x2c\xf2\x75\x94\xcd\xd2\xef\x20\x65\x1a\x93\x26\x66\x13\xa5\xbd\x21\xe4\xb8\x0d\x44\xdb\x34\xcb\xf4\x3e\x1d\x66\xe4\x5e\xba\x3d\x9c\xfd\x9d\x43\xbc\x09\xd9\xaf\x56\xd7\xfc\x77\x27\x3a\x22\x03\xb1\x3a\xa2\x96\x25\x75\x64\x87\xd1\x77\x08\x14\xb6\xb2\xb5\xe6\xd0\x25\x43\x38\x83\xb2\x09\x39\x44\x82\x66\x46\x06\x8f\xe5\x0a\x8e\xa0\x9e\xab\x27\x5b\x97\xf8\xab\x7e\x9e\xcd\x42\x8a\x17\x1a\x46\xac\x70\x4b\x72\xe6\x8f\x94\x24\xa4\x53\x5a\x8a\x4c\x45\xd6\xae\x95\xce\x54\x39\x7c\x63\xb6\x56\x83\x0a\x4f\xf9\x2a\x30\x4d\xbd\x15\x21\x32\x26\x5c\x05\x28\x55\xb5\x46\x52\xbc\x8f\xbb\x40\xb5\x17\xf3\x29\xdc\x60\xe4\x4b\xcc\x25\x2b\x67\xeb\xe7\x73\xb8\xa5\x23\x43\x9c\x42\x10\xb5\x7c\xfc\x8e\xe3\xb9\xe2\x76\x96\xf9\xf9\x38\x3f\x03\x1b\x41\xe0\x50\xd1\x6d\x58\xf1\x63\x06\x3b\x18\x18\xe7\xf3\xf1\xb3\x55\x37\xbc\xde\x9a\x28\xea\xfa\x1b\x5e\xc3\xb8\x80\x65\x3a\xf3\x76\x3e\x62\xc5\xe9\xb3\x0e\xa1\x7f\x6f\x1d\xc6\x96\x4b\xa8\x2f\x89\xc1\x35\x3b\xc8\xfd\x9b\x76\x9e\xa4\xc3\x5e\x9b\xda\xd5\x86\x25\xb6\x2b\x6c\xc3\xe6\x0a\x76\xc4\x78\x94\xe6\x02\x1b\x9e\x45\x2d\xf1\x9f\xb8\xb0\xe6\x64\x2e\x5b\xd6\x9b\xdf\x3b\x7c\xca\xe4\x0c\x1b\xe4\xc6\xf8\x94\xd2\x5e\x10\xf6\x05\x9d\x23\x24\x19\x9f\x26\xfb\x2f\xf7\x88\xa9\xec\xf8\x87\xbe\xa9\x25\x54\xd6\xaa\x3d\xb2\x4b\x2d\xc9\x4f\xb2\xe8\x8a\xf1\x66\xab\x41\xed\x7d\x98\x80\x42\x14\xba\x97\xed\x06\xe1\x43\x6a\xa6\x6a\x7e\x83\xab\x7b\x07\x82\x8b\x5d\x66\x80\xa2\x30\x52\x2a\x87\xb7\x13\x00\x28\x08\x36\xc5\x23\xeb\xdb\x9a\x7d\xc8\x31\xe4\x59\x3a\x1d\xe6\xd9\x34\x9c\x4f\xec\x80\xdd\x09\x0f\xd8\xb2\x49\x20\x0d\xd1\x5d\x50\xc7\x12\x0a\x8b\x2a\x01\xcd\xa3\x97\x82\xf9\x4c\x16\x76\xb0\x8f\x7d\x66\x03\x3e\xf6\xd1\xa5\x01\x82\x61\xc3\x72\x05\xf3\x72\xae\xb1\x83\xec\x2c\x9d\x0f\x43\x2c\x6b\x1d\x5f\x35\x96\xfa\x7b\x51\x9c\x9b\x0e\x90\x1f\x4b\x8e\xcc\x71\x85\x40\x03\x24\x7b\xf6\x70\x0f\xca\x7e\xde\xe7\xa9\x79\xea\x76\xcc\x32\x17\x23\x1c\x6a\x9b\xc2\x9f\xb1\x89\x49\x0f\x2a\x39\xcd\xbe\x19\xfe\x84\xa2\x75\xda\xe0\xb3\x14\xcd\xad\xc7\x3a\xf0\x0e\xc5\x8c\xa3\xf8\x08\x40\xb1\xbc\x37\x85\x68\x23\xc2\xd4\x11\xdd\x56\xaa\xdc\x16\x09\x1a\x34\x32\x8b\xd3\xa6\x0b\x8d\x81\x23\xd0\xe4\x35\xc4\x96\xd4\x18\xc3\x65\xb2\x94\x0b\xc2\x22\xc2\xd2\xa1\xbd\x46\x3a\x84\xa7\x9c\xf5\xeb\xe1\x0b\xba\xec\x5e\x3f\x63\xc4\x50\x79\x41\x41\xe0\x04\x41\xa1\xd4\x1a\x55\x89\x17\x32\x08\x87\x95\x08\xb4\xee\xf4\x51\x6c\xfe\x59\xa4\x22\x35\x7d\xa1\x4b\xd2\x80\xc5\x26\xa1\x29\x56\x08\x8c\x8c\xe9\x63\x07\x2a\x05\xbe\x00\x24\xa1\xbd\x56\x14\xeb\x4c\x85\xc1\x85\x5b\xa8\x57\xd1\xa2\x53\xd9\x05\x0a\x1f\xc8\x72\x4c\x6a\xa4\xb0\x98\xf3\xeb\xe0\xf3\xf5\x69\x62\xbb\x7d\x02\xdb\xdc\x8f\xb1\xcc\xfd\xd8\xd0\x70\xcf\xa4\xd9\x76\xbd\x4e\x22\xa0\x81\xf9\x60\x86\xb5\xe0\x49\x0d\x6d\x6d\xab\x76\xb6\x31\x1b\x4a\x7d\x94\xdd\x31\xb4\x04\x8d\x38\x51\xc8\x7e\xef\xe2\xc1\x59\xb3\xde\xf1\x11\x79\xa8\x9c\x38\x0b\x83\xcc\x21\x97\x13\x91\xca\xec\x1d\x4d\x64\xab\xc7\x48\x2b\x39\x6f\x45\x86\x04\x86\xa9\xd5\x18\x4b\x71\x3a\xf3\x7a\x2d\xb0\xd1\xbc\xf1\x43\x1d\x5b\x94\x85\xa4\xa8\x8b\x9b\x66\xab\xd5\x06\x43\xe3\x9a\xf5\xb2\xee\x96\xf3\x23\xd0\xb1\xad\xf5\x85\x06\x85\xe6\xac\x00\x9e\x8f\xd4\x85\x68\xa6\x05\x58\x12\x5f\x4f\xb2\x66\x12\x18\x60\x86\x05\xa6\x79\xe6\x62\x41\x64\xdf\xa1\x27\xe3\xc7\x40\xcf\xf9\x78\x9e\x95\x2e\x3e\x44\x64\x2b\x01\x57\xa9\xc5\x78\xba\x70\x17\xdc\xb6\x45\x51\x4b\x9d\xc2\x4f\x19\x19\xfb\x47\xbf\x6a\x76\xbb\xca\x50\xcc\xce\xb4\x3c\xab\xf1\xfa\x03\x0a\xff\xe9\x2b\x03\xa6\x4d\x95\xca\x1d\x7e\x18\x9a\x91\x98\x0b\xd7\x6b\x6b\xbe\x3d\x77\x3d\x82\xa8\x8b\x6b\xb7\x62\x4c\xc8\x35\x89\x63\x07\x33\xd2\x63\x56\x87\x66\x1f\xed\x7c\xe8\xb1\x97\x14\xa7\x8c\x9f\xed\x43\x30\x49\xcd\x73\x8f\x2c\x28\x0a\x30\x7c\xd7\x82\x8e\x3b\x7e\xe6\xa0\x8d\x38\xe0\x27\x87\x4d\x26\xaa\xc0\xa0\x58\x66\x6c\xc3\x19\xee\x43\x34\xfd\x33\x8a\x07\x2d\x13\xc4\x17\x8c\xc4\x20\x0a\x2f\x05\xb6\xfd\xf4\x16\xc1\x8b\xcb\x7b\xb0\xc2\x4b\xec\x2c\xdf\x55\xcb\x3b\x95\x1c\xe1\xde\x20\x5c\xcd\x2d\x7f\x03\xf7\x6e\x69\x76\xed\x1b\x5d\x5f\x7f\xe2\x57\xf3\x96\x8f\x95\x74\x8a\xa1\x70\xf1\xef\x40\xdd\x31\xa3\xc0\xe1\xbe\x6e\x54\x3b\x94\x6a\x8a\x88\x3a\xd4\x8a\x88\x8b\x74\x5a\x7e\x7a\x56\x67\xa1\x30\x60\xe5\xf3\xb0\x0a\xb9\x6f\xad\x6b\xe1\xbf\x7b\x48\x8e\xd2\xa2\x56\xf4\xcc\x1c\xb6\x5e\xc8\xda\x36\x32\xa8\xe7\x85\x21\x3d\x73\x54\xb6\x8e\x30\x13\x84\x00\x9a\x93\x35\x2e\x84\x53\xef\x24\xdf\x16\x97\x20\x3a\x6c\xdb\x18\x62\x90\x34\x87\xe9\xd6\x3e\x66\x0e\xb1\xe2\xc3\x53\xb2\x32\xe8\xa8\x21\x8d\x59\x1f\x8e\x79\xc4\x61\x24\xb0\x6d\xcc\x15\xa0\xa9\xb4\x6b\x59\x19\xb4\x03\x43\xdc\x46\xa9\x65\x76\xc8\x32\x9a\x25\x26\xc5\x64\x3e\x4b\xee\x19\xa6\xa2\x80\xaa\x66\xf4\x74\xd1\xf9\x68\x39\x30\x66\xa2\x70\x7b\x13\xc4\x1e\x60\xef\x0d\x49\x5b\x78\x2c\x76\x18\xa7\x99\x21\xd1\xf3\x02\x1d\xa1\x6d\xc6\x1f\x49\x6b\x43\x70\xc0\x44\xd6\x4d\xd2\x7d\x47\x22\x16\xa3\xd3\x5b\x8e\x87\xad\xd6\xcb\xee\xc6\x06\x30\x87\x9d\x73\xe4\x72\xd0\x9a\x78\xb2\xd1\xbf\x30\xc7\x20\x9f\x8f\x36\xf2\xb2\x34\xaf\xd7\x06\x91\xca\xcf\xf2\xc1\xd3\xcd\x2f\xbe\x78\xf8\x60\x33\xd6\x45\x41\x01\xd8\x85\xe7\x30\xed\xda\x6c\x7d\x5f\x11\xbd\xa6\x25\x60\x95\x71\xa1\x57\xd6\x41\x72\xe2\x59\x39\x15\x6e\x4a\x1b\xfc\x17\xc6\x7d\xc5\x40\xfa\x3e\x7b\x80\xdf\x74\x14\x20\xaa\x84\xac\xab\xa7\xe7\x5c\xe6\xa3\xc4\x7f\x44\xa4\xcd\x3a\x5f\x30\x37\xf5\xd4\xac\x6c\x8c\x1b\xbf\x26\x56\xb1\xa7\x38\x5a\x46\x56\xc8\x62\xc8\x31\x2a\x45\x26\x3d\x18\x90\x7c\x1a\x4a\x0d\x89\xdf\x51\xf3\x87\xca\xa1\x51\xf2\x40\x68\x52\x86\x6d\x6e\x5e\x3e\x6b\x94\xfa\x34\xdb\x3e\x6c\x92\x11\x89\x65\x44\x76\x0e\xc3\x69\x96\x0e\xae\x44\x20\xef\x40\x99\x93\x4c\x09\x10\xdc\x6e\x92\xc8\x15\x28\xa3\x53\xe0\xbf\x54\x2e\x2b\xb0\x02\x1b\x4c\xe1\x38\xec\xc0\x51\xca\x1c\x18\xd0\xd4\x83\xb1\xc7\x39\xa0\x83\x79\x09\xc0\xe0\xfc\x95\x62\x0a\x32\x66\x97\x87\xd3\xa1\x39\xb2\x98\x4b\x24\xb7\xd2\x16\x7c\x8a\x68\xd6\xde\x86\x82\x72\x9b\x2c\x9d\xbd\xcd\x5a\x75\x93\x25\x05\x2a\x40\xe6\xc5\x0b\xc4\x03\x66\xdc\x2f\xe0\xe2\xa1\x42\x61\xec\xd9\xba\xa3\xb7\x25\x1b\xf1\x5f\x48\x0a\xae\x6a\x87\x5a\xa0\x00\xa0\x18\x05\x70\x2c\x03\xf6\x01\x60\xb1\x02\xbb\x01\x04\x48\xa7\x6d\x93\xa5\xb0\x7d\x5e\x3a\x01\x82\x61\x0a\x0b\x2e\x8f\x90\x59\xb7\x39\x7b\x5d\x44\x0c\xae\x3e\x51\x34\xc4\x4f\xf7\x74\x5a\x82\x89\x87\x4f\xde\x22\xab\x3e\x9b\x42\xea\xde\xf4\xe1\xa4\x6b\x61\x8e\x1a\xbc\x3c\x2e\xe6\x24\x53\xb7\x66\x18\x4d\xc3\xe1\x53\x22\x9d\x79\x49\x19\xdd\xec\x40\x29\x27\x48\x59\xb4\x09\xce\x0c\xfd\x3f\xf4\xc6\x30\x18\xb0\xbe\x71\x77\x19\x17\x73\xa6\x27\xcc\xd2\x9d\xb5\x65\xc4\x33\x94\xf2\x81\x5a\x2e\x24\xf6\xdf\x77\x17\xd8\xf1\x16\x3c\x1a\xb6\xf4\x83\x73\x09\xba\x59\x85\x78\xaf\xe5\x42\x24\x3a\x70\x64\xc6\x5b\x8b\xd8\x1a\x7d\x6f\xfd\xeb\x4a\x37\x39\x7a\xe3\x6e\x45\x24\xa1\x61\x45\xd7\xc3\xa0\xa9\x79\x57\xcd\x47\x91\xb5\x41\x30\x4f\x83\x51\xcf\x66\xa8\x5c\x14\x64\x08\x64\x88\x39\xf6\xd6\x3d\x08\xc5\xc4\x4a\x00\x0b\xa3\xed\x24\xaf\x1d\xa0\x52\xa7\x38\x31\xab\x82\x58\x4f\x9d\x65\xed\x88\x1c\x43\x60\xb7\xa0\xc3\xb6\x31\x25\xcb\x7b\xb0\x9b\x14\x2d\x26\x18\x9f\x81\x26\x33\x78\xa2\xe9\x1f\xd0\xa1\x8e\x3d\x95\xa4\x83\x65\x13\x18\x8a\x82\x32\xd9\x4e\xce\xb2\x4b\x16\xc8\x82\x47\x55\x9e\x95\xdd\x08\xa1\xb0\x9e\xf4\xf0\x51\xa6\x14\x55\x0f\x7a\xa6\xe1\x14\x16\x0e\x04\xee\x68\xba\x09\x7f\x91\x6a\x74\x59\x6b\x62\x9a\x28\x6d\x11\xa9\x5c\x07\x19\x91\x5d\x3c\xe6\x1a\x2a\x22\x01\x5b\xb7\x6e\xd2\x40\x2d\x65\x72\x3f\x19\xf4\x40\x48\xf8\xba\x30\xcf\xcd\x45\x87\x72\xb5\x90\xda\x12\x34\x24\xa0\x6c\x52\xb7\x39\xc1\xb4\x5b\x0e\x10\xe2\x2b\xd6\xf7\x9e\x72\xc0\x6b\xc4\x1d\x75\x9a\x5c\xcb\x18\x6a\x28\x62\x10\x47\xa3\x7f\xf1\x82\xb5\xcb\xde\x6b\x8b\x6e\x69\x17\x98\x75\xdc\xbc\x11\xbd\x87\x0f\x1e\x40\x70\x9b\xab\xcb\xf4\xca\x9b\xd9\x2b\x43\x56\x79\x76\x97\xb8\x53\x12\x82\xf6\xb6\x0b\x6a\xd5\xb7\xde\x3c\x29\x15\xa5\xf4\x7c\x9a\x01\xb6\x04\x63\xd1\x0e\xae\x6f\x6f\x67\x34\xb8\xbf\x63\x36\xf8\x55\xcd\x52\xb4\x79\xa1\x34\x90\xe5\x63\xdf\x50\xd4\x40\x85\xf6\x63\x9f\xf1\x45\xda\xf1\x08\x59\x10\xb3\x8b\xab\x80\x0e\x44\x13\x2b\x5f\xc9\x85\x6c\xd7\x02\xa3\xcc\x67\x94\x21\xbc\x1b\x21\xf0\x00\x40\x5c\x83\x11\xa3\x37\x38\xe2\xa6\xd9\xc3\x98\x99\x36\x1c\x2b\xef\xbd\x35\x1b\x0e\xf6\x31\xa8\x61\xca\x15\xc5\x03\xa0\x34\x55\x52\x78\x7a\x5b\xe2\x4d\x3e\x2d\x89\xf1\xdf\x50\xa6\xed\x53\x63\x55\x69\x76\xe8\xc6\xf0\xa9\xa5\xd9\x8e\xc8\x75\x52\x6b\xdf\xca\xda\x3e\x8f\xfc\xde\xdf\x46\x40\x51\x11\x3f\x29\x60\xb7\x20\xdb\xec\x73\x4e\xef\xb1\xc6\xac\x24\x3f\x20\xcc\xe3\xd0\xca\x38\xf2\x92\xf2\x73\x4b\x50\x4e\x31\xb9\x1a\x9a\xd5\xb0\x54\x16\x86\xb0\x48\xaa\x1c\x15\x40\xaa\xdd\xac\x4f\xa9\xa1\xee\xd6\x4d\xe5\x90\xbe\x68\x4d\x08\x9e\x4f\x2d\x4a\xdb\x31\x1c\x1f\xe4\xc4\x1c\x43\xb2\xa8\xe7\x15\xca\x9b\xc4\x30\x18\xb7\xd6\xf3\x74\xbf\xdc\x44\x2f\xf7\xa3\x37\x1b\xe0\xa9\xb4\xf1\xe3\xee\xba\xb9\xaf\xeb\x38\xb3\xf5\xcd\x75\x1c\x64\x09\xfe\x4b\x9b\x0f\x1f\x3e\xf8\x62\xe3\x7f\x11\x5d\xb1\x8e\xe8\xdd\x92\x36\xce\x63\x89\xba\xe2\x38\xe2\xe6\xb7\xc5\x41\xca\x7c\x3e\x22\x88\xb9\xa7\x54\xa2\xa6\x21\x71\x9b\xed\xe4\x30\x3d\x4b\xa7\x79\x9b\xac\xc8\xe9\x99\xd9\xdf\xeb\xe8\x9e\xe8\x81\x45\x2a\x0e\x11\x5b\x31\x16\xd2\x89\x43\xc6\x85\x66\xad\x3d\x7a\x08\x39\x97\xa2\x29\x66\x87\x07\x9e\x84\xcf\xb2\x80\x0a\x61\x92\xf5\x1b\x03\xa6\x46\x66\xe8\x25\x8f\xd1\xf7\x49\xd7\x0b\x3a\x7a\xe1\x01\xdb\xe2\xf6\x8e\x7c\x9f\xf7\xfe\x59\xbb\x76\x61\x0d\xa1\x1d\xfb\x6c\xe4\x63\x0c\xb5\x4e\x04\x07\xe6\x33\xbd\xa4\x04\xaa\xa8\x2c\x36\xb7\x43\x72\xdf\x65\x63\x92\x23\xb4\x51\x1f\x31\x25\xa7\x75\xeb\x96\x0f\xab\x32\x37\x63\xd0\x8b\xcb\xa4\x00\x58\xe3\xf8\x4b\x6c\x0f\x84\x19\xcb\xd8\x26\x5b\xd5\x62\x0b\x1a\x02\x3a\x4c\xe8\x01\xc8\xdd\xa4\xf8\x7b\xdc\xfd\x8c\xf0\xb8\xa0\x6a\x7b\x16\xdc\x29\x00\xd1\x19\x87\xbf\x25\x35\x3f\xbc\x56\x98\xf1\x15\x2e\x7c\x4f\x69\x24\x7a\xd6\x17\x63\x66\xa6\x83\xa3\x96\x54\xac\x73\x4a\x52\x7b\x81\xfc\x5e\x4c\x71\x8b\x04\x15\x40\x3e\x35\x3c\x7c\xb0\x93\xbc\x35\x91\xae\x9c\x65\x19\xc5\x07\x8c\x7b\xa0\x49\xf4\x27\x87\x10\x3e\xc7\x69\xfa\x37\x8e\xd3\x14\xbe\xb5\xf1\x18\x4d\x2b\x61\x70\xff\x31\x11\x9b\xde\x05\x5a\x6b\xfa\xaf\x3a\x82\xba\x51\xd4\x8f\xa4\x3a\x1a\xf8\xcf\x1a\x2b\x2f\xa0\x35\x7e\xf7\x31\xe0\xbf\x27\x0b\x22\x06\xc4\xaf\x91\x75\xaf\xf5\x4f\x3e\x47\xc9\x89\x38\x59\x52\xf0\x9b\x1a\x1f\x4a\x53\xf8\xb8\xbd\xc8\x3d\xd2\x54\xf8\xa2\xbd\xd0\xf1\xb1\xbb\xf9\xe8\x49\xbb\xc6\xb1\xb1\xbb\xb9\x89\x7d\x07\xf1\x72\xfe\xb6\x8a\x1b\x70\xd3\x52\x84\x4d\x4e\xa3\xfa\xd9\x5b\xfd\xa3\x9d\x83\x77\x0e\x0f\x77\x0a\x72\x0c\x53\xde\xc0\x2e\x42\x4c\x3e\x36\xff\x9f\xa7\xa1\xd3\xaa\xfd\x7c\x57\x39\xa6\x01\xf6\x64\x78\x09\xed\x9e\x44\xb7\x61\x86\x7d\xfb\xf5\x3e\xe5\xe8\xb4\x4f\x3e\x18\xb3\x52\x52\x6c\x28\x1f\x65\xb3\x8b\x62\x50\xb6\xe8\xc5\x4f\x67\x2a\x85\x2d\x3a\x5a\xa2\xd0\x65\x90\xa5\xa8\xde\xb1\x96\x63\x90\x3c\x60\x98\xe2\xaa\x66\x02\xb5\x09\xd6\x66\xe8\x6d\x85\xa7\xe3\xf0\x10\x12\xab\x94\xa0\x65\x82\xee\xdf\xe7\x2c\x88\x41\xaf\xb7\xb2\x6f\xd6\x1f\xcc\x04\x49\xb5\x32\xc6\x61\xa2\xaf\x3a\x91\x59\xa3\x39\xd8\x3a\x88\x42\xe9\x9e\xed\x8f\x38\x74\xf0\x2a\x4c\x51\xb3\x99\xa3\xfa\x66\x0c\x19\x7c\xce\xc1\x34\x82\x93\x60\xa8\x44\xc6\x63\x38\x58\xfa\xac\x44\x86\xde\x71\x6b\x2f\x6b\xc9\xef\xa4\x7d\x0c\xb7\x07\x03\x5a\x4f\x9c\x13\x88\xe0\x4a\x86\x4a\xc4\x83\x24\x33\xca\x41\xc5\x61\xd5\x0a\x4e\x7d\xf1\x3e\x13\xcd\xc1\xbd\xea\xeb\x48\x6d\xaf\x5d\x46\x24\x05\x10\x13\xda\xcf\x54\xd7\xc5\x38\xfe\x1e\x62\x29\xb8\x8e\x60\x5d\xbb\xfc\xf0\x25\x78\xcb\x74\x97\xba\x2b\x3b\x29\xfb\x38\x99\xcb\xb1\x03\x40\xd4\xbb\xc4\x95\xdb\x0e\xba\x3c\x2d\xcd\xbb\xe6\x9c\x0f\xe6\x58\xed\x2e\x2a\xb9\x18\x65\x40\x84\xd9\xce\xab\x83\xdd\xbd\x9f\xf7\x5e\xfd\x90\x3c\x73\xe7\x5b\x50\xfc\x9d\x8d\x9f\xca\x8d\xce\xcc\xd0\x77\x4d\x07\x55\xf0\x76\x83\xb7\xa4\x23\x83\x31\x84\xda\x3b\xcc\xb3\x8a\xa9\x99\x28\x9c\x2e\xaf\x0d\xb8\xf3\x75\x92\xbb\x7f\x29\xef\x4a\x56\xf3\x32\x69\x24\xf7\x05\x92\xcd\x94\xcc\x07\xb3\xd3\x68\xfb\x8b\x64\x9e\xc9\xae\x1a\x5e\x74\x5c\xad\xd6\x96\x8b\x16\x58\x59\x04\xfa\x2c\x49\x4a\xb1\xf8\x7b\x43\xdc\x78\x69\x3f\xc2\x42\x98\x99\x82\x64\x05\x3b\xca\xe2\x4a\xd6\x00\xc2\xe7\x40\xc5\xd8\x36\xd4\xf6\x81\x87\xe2\x69\xe4\xdb\x7d\xb3\x38\x66\x79\x1c\x8c\xaa\xb9\x8b\xe3\xd3\xa8\x35\x3e\x95\x3e\x9d\xf8\x06\x43\x33\xc5\x6f\x87\xd5\x35\x70\xf3\xff\xd7\x2e\x00\x85\x9d\xfa\xf7\xb9\x03\x6a\x3c\xff\xfd\xae\x01\x4d\x6e\xf1\x4d\xf8\x5d\x2e\x82\xad\x9d\x24\x1d\xce\xcc\xde\x84\x50\xba\x6f\xb2\xf3\xbd\x0f\x93\x66\xa3\xf9\xaf\xdf\x7e\xfa\xa9\x6c\x79\x57\x05\x2e\x4f\xf3\x59\xd7\x7c\xff\xed\x3f\x5a\x66\x01\x1b\xe7\x8d\x96\xf9\xff\xff\x78\xd8\x68\xc5\xc0\x99\x25\xbc\xbf\x71\xde\x86\x0b\xd7\x02\x91\x8f\xdd\x03\xf2\xa2\x87\x53\x6e\xd8\x9e\x68\xcb\x7f\xfd\x54\xde\xfb\xcd\xfc\xef\x3f\xb0\x7d\xa3\xb5\x45\xba\xbe\x7c\x24\x3e\x11\xe5\x6d\x6e\xed\xb7\xd9\x70\x42\x41\xe7\x0d\xf6\x01\xe9\x29\xad\x3e\x88\xd6\xf1\x0c\x51\x08\x39\x0b\xc1\x49\x40\x40\xf6\x3e\x26\x9a\xe9\x4f\x7e\xcf\xb8\x81\x61\xcd\xc0\x6d\xc3\x0d\x0b\xfa\x10\x7f\xbb\xca\xfc\x6c\xc7\xb7\xc6\x09\xb6\x9f\xe5\x68\xa1\x8d\x23\x0b\x78\xaf\x26\x8e\xf6\x59\x52\x79\xd7\xba\x49\xe4\x9a\xb7\x62\x27\x3c\xb2\x9f\x47\xe6\x7a\x96\x6e\xda\x6a\x06\x17\xa9\xc6\xcd\x42\x1d\x0e\x6a\x36\x0f\x62\x05\xfd\x66\xfe\xfd\x11\xa3\x0b\xfc\x61\x28\xd9\x26\x33\x9c\x71\x32\xc3\xda\x19\xb4\xc9\x2f\x82\x6c\x76\x66\x76\x57\x04\x21\xfc\xd9\x68\xda\x62\xa6\x65\xf8\xb9\x71\x13\x4c\xbb\x02\x46\x95\x78\x7b\x77\xdc\xa2\x83\x25\x6f\x05\xcb\xca\x8b\x50\xc1\xb3\x1e\xe2\x68\x12\x65\x50\x43\x33\xb4\xac\x57\x51\x40\x40\x70\x71\xf2\x4d\xb2\xfe\x70\x51\x50\x5a\x3e\xe8\xc0\x47\xb7\x3a\x60\xd2\x8c\x21\xaf\xda\x36\xe4\xda\xcf\xbc\x1f\x8d\x56\x8b\x39\x6d\xc7\xfd\x74\x37\xbf\x34\xfc\xac\xd4\xb8\xdb\x7d\x48\xfc\xec\x97\x9f\x03\xad\xfd\x21\xac\xeb\x6b\xb6\x0b\x8e\x46\xac\x92\xf5\x35\x37\x9d\xed\x87\x81\x0f\x25\x5d\x28\xc4\xac\x99\xcc\x92\x31\xe6\x4f\x29\x49\x8f\xcb\x7e\x53\x66\x0c\xf3\x31\x98\x19\x9a\xe1\xdf\x9d\x7c\xb8\xeb\xc4\x98\x79\xf9\xd6\x14\x40\x78\x5a\xce\xbb\xc2\xb1\x39\x8a\x0f\x2f\x86\xd9\x87\x2e\xa2\x8b\xb6\xfb\xf0\xf7\x69\x31\x9f\xb8\xaf\xfd\x62\x38\x1f\x8d\x77\x28\x22\x9b\x7c\x3c\xf3\x1a\x9e\x51\xab\x4b\xff\xcb\x6b\x94\xae\xbc\xcf\xfc\xaf\x87\x17\x06\xad\xbd\xf3\xbf\xbd\xca\xce\xd3\xa0\xa6\xb9\x60\x3f\x66\xb0\xfa\xee\x9b\xe1\x9e\x01\x9d\x8f\x26\xfe\xa7\x6f\x83\x6a\x85\x21\x06\x0c\x87\xac\x3e\x40\x66\x18\xfd\x73\x72\x91\x8e\x4b\xf7\xe1\x32\x37\x48\x5a\xfd\xfe\xaf\x7d\xb8\x97\xea\x77\x51\x8c\xe4\xd7\x1a\xea\x9a\x0e\x7f\xf8\xfb\xfa\x34\x23\x2f\x2f\xb7\x45\x30\xec\x7c\x38\x3c\x08\xfb\x37\x3b\x5b\xbc\xcb\x76\x53\xc3\x50\x9f\x9d\x19\x9c\x1f\x96\xd4\x34\xf8\x31\x1f\xcc\x2e\xe8\x23\xf9\xda\xc7\xad\xa4\x27\xd3\xec\x2c\xff\x90\xbc\x37\x34\x4c\x31\x5d\xb7\x51\x79\xe9\x73\x3b\xc9\xce\xbb\x6c\x16\x1b\x6b\x0c\x16\x01\x74\xb5\xc6\xf8\xd2\x42\x6d\xcc\x95\x48\x3a\xeb\x39\xc5\x52\xf0\x54\xa0\xd2\xd4\x35\xe3\xbe\x40\xce\x01\xa2\x8d\x1e\xfd\xec\xb5\x79\x69\xc0\x10\xcb\xd4\x1a\xee\x00\xf1\x83\x5d\x00\x3c\x1a\xd3\x51\xac\x2f\xa5\x42\x25\x50\xdf\x65\x57\x4d\x99\xcf\x3b\x70\x5c\x57\xee\xb6\x3c\xfd\xfb\x68\x0c\x0c\x5a\x8b\xed\x59\xf3\x41\xab\x33\x2b\xde\x4e\x4c\xdf\xd0\x67\xb3\xc5\xa5\xe5\xfc\x94\x06\xdf\x7c\xe8\x79\xd1\x1e\x52\xe2\x09\x35\xa3\xd2\x05\xbc\xed\x17\x30\x41\xcb\x8b\xd9\xa9\x42\x78\xe7\xc1\x40\x82\x1d\xcf\x39\xb4\x31\x63\x0f\xda\x0c\xa9\xac\x14\x0a\xf2\x05\x42\x9e\x35\x68\x09\x80\xec\x1d\x95\xf0\xff\x2f\x8b\xff\x82\x7f\x0e\x1a\x27\x14\x59\xe1\x2d\x9a\xaa\x51\x14\xdd\x0e\x3a\xaf\x82\x19\x4b\x1b\xe8\x30\x24\xe5\x01\xe3\xbc\x4f\xc7\xe6\xc8\xa5\xa0\xea\x58\x37\xc3\x1b\x16\xc5\x04\x0d\xac\x4b\x4c\xa9\x71\x5e\x90\x66\x26\x1d\x03\xbc\x7c\x7c\x06\x01\x52\x33\xac\xd5\xb6\xd1\x0f\x72\xb0\xc7\x44\xa7\x87\x12\x7d\x5f\x48\x3d\x97\x5d\x0e\xaf\xd8\x56\x15\x63\x2d\x1a\x7a\xa5\xe8\xac\xa9\xc1\x34\x43\xac\xd2\xea\x98\x41\xec\xa5\xfd\x0b\x2b\xef\x04\x71\xe7\x84\x76\xcb\x2e\x45\xa4\x0e\x94\x58\xeb\xb8\x00\xe8\x71\xf5\x04\x20\xd0\x13\x4c\x95\x59\xa9\x5b\x4c\x48\x0e\x0d\xfb\xab\x04\x7c\x2f\x41\x56\x47\xdb\xab\x30\xaa\x84\x42\x1b\x03\x1d\x76\x0a\x61\x9b\x61\xbd\x3b\x58\x8f\x60\x99\x4e\x1a\x0d\x44\xb2\x66\x35\x51\xee\xc5\x32\xa9\x61\xfe\x2e\xe3\xfa\x64\x6a\x0b\x07\xdf\xdc\xef\xe9\xec\x02\xe3\x1a\xbb\x4e\xca\xc2\x46\xcc\x56\x5f\xc5\xd1\x1d\x36\xe9\x74\x9a\xa5\x98\x31\xb9\x2d\x38\x7e\xca\xca\x9c\x01\x6f\xf8\x65\x26\x81\xad\x78\xb0\xe8\x26\x4c\xb2\x47\xd2\xbe\x0d\x72\xf3\xc0\xcc\xcd\x1b\xe6\xfa\xe8\x60\xe4\x6e\x56\xee\x9e\xce\xcf\xcb\xce\x2f\xff\x39\xcf\xcc\xab\x04\xf6\xe0\xb3\xbc\xff\x2e\x9b\x6d\x3c\x7c\xb4\xf9\xd5\x17\x1d\x11\x81\x3e\x5e\x7f\x9f\x0e\x0d\xe1\xd8\xe8\x43\x0e\xe7\x86\x1e\x2f\xce\x77\x94\x4e\xcf\x73\x33\xca\x09\x1d\x7c\xa0\xcb\x01\xb3\xae\x5f\x02\xa2\x32\xc4\x6c\x36\x82\x88\x72\x06\x18\x9a\x8e\x38\xff\x5d\x50\x70\x1a\x58\xa7\x86\x0c\x32\xa3\xda\x99\x4f\xf3\x62\x5e\x42\x12\x55\x98\x24\xbf\xec\x98\xa4\x05\xce\x98\x6e\x05\xb0\xc4\xfc\x1f\x68\xcd\x01\x19\xe3\xf2\x5d\xb2\xcb\x2d\x8f\xa9\x61\x33\x01\x9b\x40\x84\x71\x7e\xe0\xd2\xfe\xbb\x73\x4c\xf8\x22\x81\x60\xdc\x97\xfd\x11\xa6\xc8\x12\x94\xab\x8b\x5e\xb3\x56\x20\x5e\xfa\x26\x9b\x64\xe9\x2c\x5e\xb6\x53\x0c\x0b\x7e\x69\xd6\x38\x10\xcc\x29\xbf\x3e\xdc\x3f\xfe\x52\x98\xbd\xad\x3e\x1f\xc2\x4a\x54\x3f\xd7\x02\x7d\x5e\xcc\x66\xf0\x32\x69\xd0\xf4\xad\xa6\x03\x2a\xac\xe9\x86\x0a\x6b\x3b\x83\xfc\x62\x7e\x57\xf0\xa5\xa6\x23\x28\xaa\xe9\x06\x8a\x6a\x3b\x79\x43\x2f\xb9\xee\x05\x3f\xd5\x74\x83\x65\x35\xfd\x60\x59\x6d\x47\x47\xc5\xc4\xef\xc6\x7c\xa8\xe9\xc4\x94\xd4\x74\x71\x04\x86\x60\x95\x0e\x80\x72\x11\xd8\xf0\x77\xa5\x31\x7c\xfc\x81\xc8\xf0\xf0\x73\x48\xf1\x30\x84\xfc\xbf\x3c\x00\x31\xa2\x87\x6a\xbe\x48\x47\xf9\xf0\xca\x8d\xc7\x66\x6b\x52\x24\x27\xdf\x8d\x10\x79\x76\x2b\x5f\x90\x12\xa9\xbf\x63\xdd\x45\x85\xb5\x0c\x8b\x54\x55\x51\xc3\xbf\xfa\xac\x43\xfb\xf3\x19\x11\xb4\xaa\xb1\x24\xcc\x4d\xe3\xeb\xfa\xc7\x4b\xa9\xdb\x54\xc1\xc7\xc7\xc8\xe5\x28\xa2\x86\x94\x34\x17\x02\xaf\x15\xcb\x22\x55\xdb\x4a\xb1\x74\x3b\x80\xf0\xf8\x06\x49\x97\x58\xf2\x03\x3e\x74\x5e\xcb\x48\x05\x69\x7b\x71\x35\xb9\xc8\xc6\x66\x23\x6a\x3a\xad\x96\x4b\xcb\x51\x36\x2a\x70\x34\x40\x76\x1e\x80\x14\xc3\x6b\x58\x29\x96\x76\x97\x29\x25\xd2\xf0\x6a\xf3\x47\xbb\x14\x7c\x11\xf4\xa0\x2a\x00\x1d\x9d\x55\x4a\x35\x8f\x7c\xae\x0e\x5d\x55\x64\x22\x8a\xd2\x5d\x9a\x8f\x2f\x86\x45\x3a\xdb\xc6\xa8\xa9\x05\x30\x91\x8d\x7e\x59\xe2\xb7\xc6\x2a\xc1\x6f\x9d\xab\x86\x21\x7a\x50\xa2\xc3\x19\xdf\x4a\x8e\xc4\x8a\xa6\x2b\x0c\x31\x81\xec\x4d\xe3\x41\x3a\x1d\xb4\x40\x39\xe9\xba\x5f\x23\x19\x4e\x25\x2c\x2e\xcb\x1d\x89\x7a\xeb\x58\x30\xe0\x55\x01\x17\xd8\x50\xbe\x99\xf5\x6f\x8e\x4f\xc6\x7d\x6d\x58\x73\x5b\xe8\x6a\x25\x31\x97\x9d\x9c\xa1\xe5\x29\x0f\x7e\x31\x1d\x35\x00\x8f\x70\xc8\x56\x17\x50\x96\x5c\x8e\x2c\x27\xe0\xd4\xac\xfd\x74\x92\xcf\x30\x7b\x01\x98\x34\xc2\xaa\x9f\xa6\x83\x1f\x90\x95\xc8\x06\x76\x7f\x5e\xa7\x33\x43\xad\x83\x11\xd2\xc6\xbf\x9a\xcf\xba\x97\xc8\x44\xfc\x36\x2a\xfe\xeb\xb7\xa2\x75\xbc\xbd\xfe\xff\x9d\x6c\x6c\x31\x97\x4a\xa8\x0a\x69\x3a\xe9\x06\x68\x57\x96\x5d\x81\x3c\x2d\x1b\xe5\x86\xbb\x47\xc1\x23\x77\xe7\x0e\x3f\xc4\xe1\x3f\x94\x0a\xaa\xd3\x2d\x94\xa2\x6f\x89\x01\x25\x1c\x4a\x35\x3a\x24\xbd\xae\xb7\xaa\x85\x3f\xd0\x30\xa8\x54\x15\x7f\x2b\x07\x70\xa0\xcf\xb1\xca\xf6\xe1\x04\x8e\xe8\xfc\x17\x74\x07\x92\xc2\x83\xcb\xb1\x20\x19\xae\xff\xd7\xbf\x56\xc6\x75\x0c\x25\x27\xa1\xa4\x4f\x84\x76\xf8\x4f\xbc\x89\xe7\x1f\xb8\xb2\xcc\x93\xef\xaa\x48\x3c\x51\xda\x6a\x25\x9c\x6f\xc7\x7c\xf2\x31\x1e\x81\xe2\x4a\xae\x92\xbf\x18\x0a\x79\x37\x1f\x50\xc2\xa3\xcc\x60\xfb\xbf\x94\xcf\x1a\x2e\x5b\xdc\x28\x73\xd1\x09\x03\x44\x47\x53\xb7\xf2\x50\x74\xe8\xc6\x73\xec\x2d\xf7\xf3\xc8\x89\xfa\x1f\xb5\xde\x2c\x27\xb1\x7c\xfc\x6d\xd7\x1f\xc5\xcf\xf5\xf2\x06\x2c\x2e\x81\x4c\x68\x3e\x5c\xba\x29\x35\x97\x2e\xdc\x97\x36\xdd\xe5\x9a\xed\xa1\x0b\x16\xee\x0f\xb7\xf0\x37\x88\xaa\x1e\x63\xd9\xca\x5b\xe4\x35\xfa\x1d\x36\xe9\xd0\xdf\x08\x1f\x6d\xfd\x14\xc7\x5b\x1d\xad\x91\x3d\x32\xc4\xd5\xdd\xbf\x18\xba\x14\x54\xb6\x12\x08\x3a\xba\x77\x08\xdb\xea\x06\x97\x62\x3d\x54\x18\xd6\xed\x61\xad\xa5\xe7\x38\xa6\x63\xc3\x9e\xf1\xeb\x86\xda\x7f\xd3\x73\x4e\x63\x58\x61\xcb\xf1\x64\x59\xcd\xc1\x3a\xeb\x09\xdc\x2e\xd6\x20\x55\xba\xa9\x95\xc8\x20\x0b\x5e\x18\x52\xa1\x8c\x7d\x65\x70\x1d\x0e\xa9\x07\xbf\x78\x6d\xa9\x13\x9a\xa4\xdf\x4b\x4d\x3b\x6f\x59\x54\x40\x0a\x2d\xd0\x73\xc4\x2c\xca\x5e\x3c\xc3\x2b\x5f\xaa\xee\xa4\x09\x51\x5a\xb8\x62\xc1\x74\x98\x4d\x29\xbf\x10\xf8\x5f\x8f\xd2\xc9\x04\xd3\x87\x9d\x55\x65\x4b\xd0\x2f\xd0\xc9\xe0\x17\x3f\x06\x86\x8d\xaa\x90\xfb\x1c\x03\x4b\xcc\xce\xf5\xd1\x50\xff\x65\x3a\x7d\x37\x9f\xbc\x28\x48\x04\x50\x36\x7f\xbd\x24\x5e\xb4\xf1\xe8\xc1\x83\xc9\x87\x46\x3b\xb9\x60\x76\xef\x01\xc5\x98\x85\xb6\x77\xa9\x0e\xd6\xd8\xe2\xf2\x07\x5b\x77\x15\xfc\xb7\x42\xf7\xc8\x65\x02\xc1\x12\xa5\xf7\x1c\x80\x5c\x8a\xfc\x94\xb3\xfe\x30\x9d\x92\xf1\xae\x19\xbf\x61\x3d\x46\x23\x34\x0a\x2b\x93\x2c\x2d\x25\x8e\x1c\x09\x88\x0c\xdb\x84\xe1\x0b\x2c\xc5\xf2\xed\xd1\xcb\xef\xd7\xb3\xd2\x10\x2e\x18\x4d\x15\xcd\xe8\x6d\xb4\x04\x67\x14\x2e\x5e\xee\xc1\x4d\x11\x33\x62\x5a\x19\x2e\xab\x06\x1b\x13\x8d\x71\x6c\xa5\x94\xa2\x92\xa0\xe8\x94\x60\xa5\x6c\xd6\x00\xe5\x78\x5b\xcc\x26\x4f\x93\xa6\xa5\x68\xf1\xf9\x33\x38\xc5\x6f\xcc\x0e\x24\xf4\x31\xc4\xa8\x8e\x3c\xd6\x26\x12\x12\x16\x28\x74\x28\xb3\x3d\x09\xc7\x41\x40\x8f\x2d\x94\x13\x1d\xda\xe0\x06\xa4\xa6\xbb\x28\x0e\x7b\xb8\xb1\xb5\x55\xa7\x15\x27\x37\x4c\xad\xee\xc6\x74\x27\x8c\xfe\x92\xe8\x95\xbb\xff\xb4\xc2\x67\x68\x56\xe2\x7e\xd2\xe8\x36\xb6\x6a\x1a\x46\x58\xaa\x9a\x21\x02\x9c\xad\xc6\x02\xcb\x29\x05\x18\xa2\xd9\x8a\x1b\x4f\x3b\xb8\x9d\xb3\x92\xa5\xe2\x30\x31\xd8\x6a\x67\x22\x82\xeb\x4e\xb6\x17\x68\x10\x9f\x90\x1f\x30\x55\xcd\x95\x4e\x1f\xd2\x59\x20\xb8\x46\x23\x69\x66\xa3\xc9\xec\x8a\x9d\xd9\x5b\x6d\x76\x07\xd7\x61\x61\x02\xfa\x41\x7c\x68\x51\x4e\xbb\xcc\xb4\x03\xc6\xb1\xf4\x4a\xc0\xd9\x37\xb0\x70\x9d\x62\xe7\x7e\x8c\x0e\x9d\x91\xd3\xcf\xef\x09\x4e\x16\x7f\xfc\x29\x17\xe0\xf7\x38\xd6\xfa\xfa\x54\x4e\x77\xe5\xc6\xad\x72\x0a\xa3\x10\xed\x3d\x21\x22\x19\xd3\x3a\x20\x7b\xe8\x5d\x15\x45\x45\x57\xf9\xca\xc5\x57\xaf\x02\x47\x8d\x42\xc0\x61\xc5\xc0\x86\xcb\xb5\x42\x17\x36\x91\xba\xf9\x12\xb6\xce\x02\xf1\x5c\x04\xfd\xb0\x69\x84\x54\xd1\x43\x23\x95\x67\xa8\xdc\xb8\xa2\xf7\x03\x98\xf9\xcb\xc2\xea\x44\xf0\xdc\x4b\x56\x53\xa5\xad\xf0\x81\x39\x07\x15\xf3\x42\x00\x15\x06\xf6\xc6\xf9\x4c\x55\xb2\xa7\xd4\xe9\x36\x0e\xf5\x79\xad\x19\xa8\xac\x63\xa4\xd5\x89\x7a\x04\xfc\x4d\x89\xac\x6b\x74\x3f\x74\xeb\xeb\x0a\xaa\x5a\x60\xa5\x51\x25\x2c\x6e\x60\xb3\xa1\x45\x68\xdd\x47\x8f\xbe\x5c\xea\x01\x51\x15\x81\x75\x37\xa9\x24\x26\xe2\xea\x6e\x7e\xf1\xb0\x1d\x97\x61\x75\x37\xbf\xc4\xa2\xaa\x94\xaa\xbb\xf9\xd5\xa3\xb6\x92\x48\x75\x37\x9f\x3c\x8e\x58\x93\x3c\xf9\x2c\xd9\xfd\xb3\x24\xbb\xec\x05\xf3\x7f\xe7\x19\xf0\x1b\x35\x62\x5b\xf2\x6e\x25\x43\x2b\x4f\xd2\xa8\x0a\xac\xb4\xd1\xfc\x6d\x68\x47\xbf\x1e\xab\x83\xa9\x48\x64\x97\x37\xf1\xbc\xd8\x16\xfd\x1e\xbe\xec\x93\x32\x9b\x0f\x0a\x4a\x65\x2b\x8e\x18\x06\x41\x5c\x64\xc3\x49\xf2\x2e\xcb\x26\x60\x9a\x00\x91\x56\xce\x1c\x02\x29\xcd\x5b\x91\x93\x93\x03\xab\x1e\xc1\x16\x86\xde\x71\xf4\xba\xa0\xcc\x35\x90\xec\xc8\xa6\xb7\x62\xda\xde\x8b\x52\x26\x04\xbb\x77\x6e\x94\xb7\x47\x4f\x2d\x49\x0f\x71\x1b\x48\x08\x24\xdc\x07\x04\x2d\xb3\x61\x8e\x28\x8d\xd3\x0c\x83\xf8\x60\x0e\x42\x54\xf4\x12\x3f\x4a\xf1\xb3\x7a\xde\xf6\x28\x3f\xe3\x96\xf5\x3d\xfd\xdf\x64\xe4\x86\x19\x31\x31\x19\xe2\x1b\xf0\x81\xc0\x12\x35\x2a\x35\x28\x2a\x82\x58\x82\xe6\x9c\xf9\x46\x14\x5e\x6f\x9c\x03\x09\x07\xf6\x73\x9f\x4b\x4a\x15\x8f\x85\x4b\xcc\x73\x9e\x7d\x98\xb9\x02\x83\xde\x68\x9b\x9b\xfe\xe0\xcd\xc1\x9b\x15\x33\xf4\xef\xf6\x59\xa5\xbd\xf1\x7f\x42\x05\x60\x94\xfa\x2a\xd6\x0e\xc6\x17\x79\x5f\xbc\x93\xfd\xe9\xe1\x76\x5d\x99\x2b\xdc\xa3\x38\x12\x58\x16\xa3\x9c\x64\x3e\xd7\x0e\xde\xfe\xaa\x90\x2c\x10\xeb\xc0\xcf\x13\x34\x28\x86\xfe\x85\x2c\x60\x10\xaf\xad\x27\xc0\x7b\xc8\x2f\x4a\x73\xb7\xb2\xe2\x72\x48\xd3\x53\x84\x98\x34\x6c\x0b\x6c\x79\x9a\xaa\x6b\x1d\x7e\x31\x24\xed\x31\xbf\xc4\x95\xe5\x0f\x3e\x54\xab\x0a\x94\xce\x64\x5e\x5e\xd8\x51\xb4\x62\xe0\xb8\x0a\x0f\x2f\x42\x41\xd3\x82\x82\x93\xee\x50\x66\x38\x48\xdc\x38\x31\x58\x08\x84\x4d\x27\x32\x1b\xcb\x3b\x36\xaf\x86\xec\x2b\x7b\x60\x27\xec\xfe\x5c\xbd\x7b\x70\x83\x53\x45\x04\x50\x88\x7f\xb3\x85\xc4\xe3\xa1\xa5\xf1\x1c\xd3\x0b\xf8\x07\xa1\xb2\x09\x76\xc7\x23\xa9\x42\x49\x59\x54\xbb\xe6\x5b\xae\x52\xdd\x5a\x3b\x8b\x51\xdb\xca\x51\x1b\xb7\xb7\x7e\x4d\xdc\xb0\x24\xe1\x33\xd0\x96\x76\x8f\xe8\x9b\xf3\xb8\x6c\xbc\xcc\x4b\x8a\x29\x3a\x40\x8b\x09\xc2\x7f\x3c\x66\xc8\x7b\x2f\xb7\x01\xb7\xa3\xc1\xed\x7c\x9b\xd8\x55\x7a\x6c\x59\xc2\xb7\x1e\x39\x44\x4f\xa8\x2e\x74\x74\x9b\x29\x78\xd0\x4e\x20\xd8\x77\xd8\xf9\x96\x29\xfc\x3a\x19\x9a\x7f\xee\xdf\xf7\x58\x08\xa9\x77\x9c\x9f\x10\x6d\x24\x9d\x98\x0f\x15\x3a\xbf\x3a\x25\x49\xbf\x9d\x84\x33\x73\x45\xd7\xd5\x23\xff\xc6\x9c\x4b\x66\x1b\xe5\x7c\xf1\xc1\x5e\x78\xf4\xe0\x38\xc7\x32\xd4\x2e\x5a\xbb\xda\x95\x0b\x86\xe4\x3d\x36\x60\xad\xf5\xae\xb4\x81\xd4\x5c\x96\x74\xf3\xda\xcf\xa6\x73\x20\x03\xea\x86\x81\x63\x6c\x4a\xac\x0d\xd4\xe5\x29\xc8\x60\x33\x0f\x3f\xcd\xe3\x79\x54\xf8\x58\xbd\x15\x25\x64\x75\x8d\x1b\x10\xb0\x3e\x91\xd0\x7d\x44\xf4\xa6\x26\x31\xcc\x37\x24\x27\x97\x99\x27\x6f\x3e\xf8\x6c\x9e\xfc\x07\xd0\x8e\x98\x49\x5e\x39\x6a\xd7\xd2\x8f\xbe\xe3\xf6\xea\x69\x75\xc5\x9d\x3f\x96\x54\xd7\x26\x1e\xff\x13\x13\xf1\x22\xd5\x45\xf9\x6d\x82\xfe\x74\x49\x25\x51\xee\xde\xfb\x4a\x2f\x7e\x99\xa5\xa5\xf3\x12\x7f\x1f\x5a\xad\x94\x4f\x29\x07\xa5\x96\xb0\x2e\x5d\x58\x1f\x76\xea\x08\xda\x85\xe5\xd2\x72\x69\x3a\xde\xd9\xcd\x92\x43\x46\x53\x3d\xf6\xf1\xdc\x7c\x4c\x46\x36\x06\xb0\x3c\x0d\x1b\x56\xfc\xbd\x73\xaf\x61\x27\xf5\xc5\xe6\xb2\xbf\xab\x2d\xc5\x24\xe2\xb5\xa5\x8b\xf3\x40\xae\x90\xca\x6d\x41\xa6\xb6\x43\xcc\x45\x96\xcb\x22\x61\x35\x95\xaf\xcd\x85\x2b\xdd\xdf\x33\xec\x4b\x3e\x2a\xad\x06\xc4\x9c\x6c\x88\xec\x60\x4f\x16\x3d\x4e\x95\x92\xfd\xdd\xfa\x32\x11\xb9\x2d\x2a\x86\xdb\x5a\x49\x98\x71\xb8\xb7\x73\xb4\x7f\xf0\xaa\xcb\x31\x6a\x0d\x15\x8e\xa3\x77\x31\x81\x14\x3b\x43\x4c\x17\xa4\x66\x70\x88\x0a\x7d\x7a\x22\x69\x98\xe0\x73\x07\x24\xa0\x4e\x84\x77\xb8\xf7\xbd\xe9\xac\x21\xb1\x34\x9b\x91\x2a\xfb\xaf\x5e\xbf\x3d\x6a\x88\xe7\x4f\x67\x26\xe1\x39\x1b\x80\x4c\x1b\x2e\x79\x19\x65\x82\xce\x4a\x35\x90\xe7\x78\xaa\x5d\x06\xbb\x1b\x98\xc5\x80\xb9\x6e\x8f\xe6\xbf\xc3\xb3\x87\x00\x7d\xe8\x37\x98\x0d\x8b\x4b\x78\xf2\x6b\x3a\x0b\x31\x46\xb3\x41\xeb\xd7\x40\xcd\xaf\x24\xf8\x6d\x2e\x4a\x3d\xad\xd2\xfc\x76\xc2\xfc\xbe\x6e\xc6\x76\x13\x46\xe9\x78\x9e\x0e\x25\x26\x95\xde\x89\x68\xe2\x97\x4a\x98\xad\x65\x11\xb6\xfa\xea\xf6\x05\xc7\xaf\x26\xb6\xd6\x6d\x83\x68\xad\x49\x0c\x32\xea\x32\xd1\x22\x4e\xfe\xc4\xa8\x0a\x0c\xb1\x1b\x83\xe4\x17\x48\x19\x71\x9a\x8f\x89\xd9\x67\xb9\x27\x30\x4c\x14\x00\x12\x32\x48\xa0\x85\x0f\x47\xdd\x04\x78\x1c\xba\x00\xec\xf1\x21\xa4\x28\x64\x05\xc4\x97\xe4\x39\x45\xcb\xc1\x81\xef\x41\x08\xa4\x6c\xda\x49\x0e\x73\xc8\x01\x8d\xd2\x50\x17\x5c\x19\x8d\xc0\x69\xd1\x87\x57\x1c\xea\xc7\x1a\x96\xab\x9e\x28\xe2\x32\xf6\x07\x51\x6c\x89\x85\xa3\x88\x47\x00\x8d\x09\x2a\x6c\x95\x82\x37\x04\x04\x11\x64\x79\x0b\x03\xef\x60\x4d\xaa\xfe\x1c\xd6\x8a\xb5\x81\xe3\x0c\x5a\x42\xa4\x29\x0a\xa6\x39\x26\xbf\x1a\xea\xa6\x34\x88\x98\xe4\xc1\xc8\x39\xbe\x27\xae\x0e\x8e\xb2\x79\xb1\xa7\xf3\xf1\x1a\x87\x68\x43\x0d\x21\xf9\x17\x7c\x80\x00\x14\xd3\x0c\xc9\xa8\x26\xa5\x83\x86\x9e\x82\xb6\xe9\x6c\x96\x22\xe7\x83\x5e\x0c\x7d\xc8\xe2\x3c\x25\x60\x36\x64\x86\x98\xc6\x43\xd6\x20\x49\x65\xce\x41\xc6\x30\xf0\x56\xab\x93\xfc\xc8\x36\xe5\x48\xaa\x52\xc8\xac\x62\x48\xa1\xb0\xb5\x34\xba\xe4\xac\xe5\x60\x8c\xee\x9c\x57\x72\x4c\xfa\xf1\x8b\x9c\x7c\xd4\x22\xd3\x28\xf1\x5c\xc0\xa0\xd9\x95\x82\xc0\xd9\x90\xc1\xc8\xdb\x62\xbe\x49\x9a\x26\xb0\xc6\x94\x4b\x99\xb5\x4e\x10\xa5\x1e\x9f\x7f\x5e\x18\x3e\x44\x36\x22\xbd\x01\x66\x17\x02\x68\x3c\xb3\x90\xce\xaa\x1f\xc2\xbc\x9f\x9b\xb1\xcc\x4f\xd1\xa2\xff\x8c\x29\xdb\x8d\x29\x1c\x2c\x89\xf2\xfe\xe5\x83\xaf\x60\x3f\x35\xd9\xd2\x39\x25\x5e\x92\x7f\x36\x0d\x50\x3c\x7f\xfb\x63\xdc\xed\x76\x22\x17\x43\x5f\xf7\xa0\x12\x5f\x1e\xbc\xde\x61\x84\x26\x3a\x72\x14\x8a\x49\x45\xaa\x0b\xaa\xf1\x41\xc4\xaf\x2c\x97\xf2\x7b\x2c\x21\x33\xca\x8f\x7c\xfe\xcc\x7b\xa5\x50\xcc\xfe\xde\x57\x4d\x8a\x33\xd6\xe6\x78\x63\xfb\xbb\x34\x96\xf0\x09\xa3\xd2\xad\xb0\x04\x9f\x30\x69\x59\x29\xed\xd0\x99\x23\x6c\xd6\x28\xc6\x8c\x4a\xdb\xf5\x38\xaf\x32\xf4\x62\x52\x3f\x72\x1a\x29\xea\xd7\xbc\x6e\x7d\x07\x67\xe2\xd9\xc2\x91\x41\xd0\xfe\x9b\x8e\xac\xba\x2a\xc2\x75\xd6\x3d\xeb\x7a\x2e\x66\x89\x24\x06\x94\x3f\x95\x8f\x89\xad\xe5\x96\x60\x85\x08\xd8\xd8\x65\xe0\xfd\x1d\x02\x14\x7b\x4d\x3b\x6c\xba\x36\x74\x08\xab\x5b\xf0\x07\x0d\x1d\x89\x40\x95\x67\x46\x9f\x0b\x73\x0c\x9c\x19\x05\x68\xa4\x0d\x51\x84\x78\x15\xac\x44\x2f\x33\x92\x45\x9a\x17\x03\x1f\x1b\x14\xf2\x94\x90\xed\x4f\x40\x8d\x72\x74\x48\x4b\x93\x53\x43\xc2\x4a\x30\xcc\x62\x94\x5d\x14\x97\x14\x55\x77\xc9\x19\xdc\xe2\x4a\x8b\xef\x98\xbf\x1e\xd5\xb5\xc0\x65\x77\xc6\x3e\xcb\x57\x04\x08\x6e\x67\x84\xbb\x74\x84\xd7\x3a\x43\x6c\x85\x44\xcc\xfd\xa8\x91\xe2\xea\xea\x82\x76\x69\xf6\xea\xe6\xe4\xd8\xfe\xde\x13\x70\xc9\x36\x14\x32\xba\xea\xb3\x8f\xa0\x7d\x55\xec\x13\x30\x33\xb0\xf3\x21\x56\x32\xcc\xf1\xf9\x39\xc4\x43\x9e\xa1\x44\x9a\x1f\x70\xf3\x50\x91\x82\xc2\x3c\x79\x92\x12\x81\xac\x70\x30\x29\x88\x82\x06\x0a\xff\xba\x09\x54\x49\x3c\x6c\xf8\x69\x28\xbc\x27\x8e\xc2\xe3\xd5\x6e\x62\x72\x84\x21\xc6\xd8\x6c\x99\xf7\x03\x4d\xe5\x10\x7f\x98\xad\x37\x64\xca\x46\x89\xff\x58\x12\xa4\x87\x2f\x5a\x2f\x50\x0e\x9b\xba\xa8\x98\x00\x2d\x30\x3f\xc9\x84\x74\xac\x4f\xbc\xdd\xb8\x71\x76\xa9\xd9\x03\xdc\x85\xf3\xa8\x84\x8d\x71\x40\x9c\xb3\x00\x92\xd2\x89\xa5\x44\xc4\x8d\x16\x14\x0a\x94\x19\xac\xba\x97\x3b\x69\x89\xf2\xff\x54\x92\x16\xd0\x1e\xc1\x8b\x3b\x28\x20\x0b\x72\x8a\x11\xb7\xc8\x1f\xa2\x53\x25\x49\x85\xeb\x69\x80\x17\xbf\x01\xbd\x55\x53\x05\xc7\x57\xea\xf1\xa1\x1d\x9b\x1c\xf5\xad\x9a\xc5\xc7\x1c\x61\x25\xe9\xbe\xd0\xdf\xd4\x27\x4e\x99\xf8\xe3\xe5\x25\x4f\x55\x70\x05\xb5\xc1\x82\xee\x21\xd5\x01\x9e\x9d\x53\xc9\x44\x41\xe4\x87\xdd\x2b\xb1\x05\x93\x49\x1b\xea\xd2\x74\x34\xcf\xcb\x0b\x50\x57\x59\x4a\x16\xa2\x99\x00\x38\x6a\x4d\xdd\xa3\x04\xfa\xff\x1c\x06\x91\x8f\x43\xc4\x82\xd3\xa7\x1b\xfe\x7b\xbe\xdc\xb2\x11\x54\xa1\xf3\x5e\x4c\x27\x6a\x99\x50\x16\x4d\x9a\xca\xca\xc0\x65\x37\x2b\xfb\xd3\x7c\x62\x08\x4d\x7e\x28\x08\x5a\x1f\xa4\x21\x24\x6f\x55\x4a\x2f\xac\xd1\xc0\x9e\x1a\x6b\x12\xe3\x97\xc1\x92\xf5\x9d\xb5\x9b\xf1\x46\xd1\x96\x46\x6d\xef\xe4\x57\xdf\xeb\x90\x1a\xf1\x77\x1f\x4c\x03\x11\x1d\x4a\x2f\xfc\x5c\x2e\xba\xca\x2e\xd0\x14\xa1\x30\x62\x26\xbc\xa4\x16\x36\x85\xc6\x3a\x9e\x3a\x48\x2a\xcb\xc3\x46\x77\x53\x4c\x86\x09\xe9\x66\x4b\x09\xfb\x56\x47\xfb\xe8\x8d\xbf\x09\xe1\xa3\x50\x27\x9a\x1d\x42\xee\x3e\x1a\x73\x61\x70\x6c\x3e\x76\x9e\xae\x57\x09\x2e\x73\x4e\xbe\xe3\xd2\xc4\x5f\xc2\xf8\x41\x08\xa9\xa9\x55\x57\xf6\x16\x14\x55\xcd\x39\xad\x2f\xf4\x84\x24\x75\x5b\xf9\x2d\x8e\x0f\x53\xc1\x46\x50\x02\xa4\xa5\x27\x13\xb5\x34\x10\xa7\x98\x3d\x90\xd0\xc4\x74\x95\x39\x8a\xa1\x8f\x9a\x51\x2b\x47\xed\xc2\x54\xf5\xb1\x85\xa9\xf2\xfd\x61\x30\x7f\x19\x24\xca\x59\x40\x61\xc6\x37\x20\x4e\xf8\xc2\x9b\xf0\x5e\xd6\x49\x41\x29\xa7\xfd\xca\xb6\x42\x4f\x5c\xd7\x80\xad\xae\xe6\x0a\xa4\xb5\x6c\x09\xc3\x34\xc5\xab\x49\x38\xf4\xee\xa0\x3d\x61\xb0\xd4\x8e\xc8\xc3\xe0\xe4\x6d\x1e\x43\xa9\x82\x25\x37\xca\x64\x7f\xb7\x9a\x0b\x47\x91\xdd\x61\x3c\xd7\xdf\x9f\x74\xc5\x1e\xbd\x14\x89\x98\x59\xdc\x3c\xbb\x36\xcb\x51\x33\xef\x64\x9d\x36\x46\x1e\x41\x87\x2e\x90\x28\x3e\x61\x13\x49\x4d\x21\x81\x21\xf1\x87\x14\xb8\x72\x01\x76\xc9\x6f\xcd\x65\x8a\x54\x2b\xe5\x49\x13\xb9\x08\x12\xc1\xc8\x26\x33\x31\x95\x8e\x03\x49\xc5\x2a\x8c\xc0\x1a\xa7\x77\x82\x91\x51\xa4\xf0\x27\x9d\x5a\xee\xc0\x2d\xef\xfe\xde\x9f\xc5\x1b\x98\x05\x36\x63\x6d\xcb\x13\xcc\x42\xef\x24\x1d\x62\x98\x51\x58\xa0\x8e\xff\xec\xba\xf8\x13\xa9\xc0\x08\xb0\x00\x8b\x0e\x70\xfe\xa0\x43\x94\x74\x4c\xfc\x9a\xa3\x1c\x43\xdf\x49\x01\x83\x04\x0f\xd0\x43\xee\x59\x73\x43\x7c\xd2\x0e\xbb\xa1\xa8\xeb\x68\x6b\x5b\x20\xaf\xe2\xc8\x59\x4a\x97\x07\xff\x9c\x9f\x5f\xb1\x10\xca\xcb\x18\x86\x69\x6a\xc8\x4c\x07\xe4\x41\x79\xc9\xf8\x7b\x40\xde\x72\xe6\xc9\x35\x70\x72\x7c\x89\x00\x9d\xb1\x64\xbb\xef\x24\xdb\x06\x56\x3a\x99\x90\x41\x42\x41\xe0\xc0\x43\x04\x32\x8c\x10\x4e\x9b\x66\xa3\x34\xa7\xa0\xd8\x69\x49\xe1\x18\x70\x89\x21\x85\xd0\xec\xa2\x28\x33\x3d\x2c\x33\x89\xcb\x94\xf3\xb6\x09\xa6\x54\x68\x52\x21\x44\xb5\x26\x9c\x50\x03\xc0\xe3\xf6\xb1\x08\x29\x1d\x3b\x9b\x12\x07\x4f\xf6\x44\xc3\x15\x58\xb9\x85\x4e\x0f\xf1\xff\x39\xe4\xd1\x1a\xbc\x81\x94\x04\x7a\xbe\x58\xaa\xbb\xd7\x61\x92\x1b\x49\x37\x32\x97\x28\x05\x16\xa4\x5c\x8c\xe0\x37\x54\xaf\x62\x4e\xc6\x20\x92\x3a\xf3\x23\xb4\x22\x7c\xc4\x18\xd6\xbf\x01\xf7\xea\x51\x11\x71\xd6\xd5\xa3\x30\xff\x48\xbe\xb5\x32\xb6\xe5\xe8\xa7\x0e\xb9\xff\x71\xd8\x27\x50\x12\xb9\xbc\x62\xcb\x9b\xa2\xf6\xe9\x86\x0d\x40\x9d\xa5\x70\xdd\x01\x6b\xa3\xfd\xfb\x2c\x54\x8b\xca\x22\x60\x6e\x04\x9e\x20\xe1\x56\x39\x3e\x4a\x0e\xb8\x43\x80\x81\x71\x20\xa4\x4e\x20\xfb\x3d\xb8\x31\xd8\x04\x99\xb5\x80\x4e\x13\x9f\xb0\xe0\x60\x3f\x79\xf2\x17\xc1\x16\xb3\x1c\x2c\xc2\xdf\x65\x57\x03\x33\x62\xdc\x39\xf3\xf7\x7c\x02\xa6\x82\x70\xa9\xad\x08\xbc\x83\x3b\x6b\xf9\x7e\xc0\x3b\x35\x48\x98\xd9\x32\x53\xc3\xc7\x8d\x9c\x6c\x8c\x8d\xa5\x2d\xfb\x4c\x01\x23\xed\x95\x43\x3e\x04\xc7\x41\x58\x16\xbd\xa6\x79\x78\x6d\x95\xa7\x0c\x47\xd9\x31\x8c\x2c\x8b\xeb\x69\xd4\xf3\x12\x05\xfa\x02\x0d\x98\x71\x8c\xf5\x0c\x46\x5c\xaa\x26\xce\x75\x08\x85\x66\xfd\x10\x85\xa6\x63\xc9\xa8\xc1\xdc\x3d\x0e\x5f\xe0\x40\xf0\x1f\x0c\x50\x05\x87\x0d\xf9\x43\x4c\x69\x81\x79\xd3\xc0\xd0\x2b\x03\xef\xed\x7c\xd6\x20\x47\x88\xd4\xf0\x17\xb3\xd9\x30\x03\xcc\x9e\x5e\x81\x1a\x17\x8d\x16\x04\x98\x52\x09\x94\x19\x04\x85\x74\xe0\x5b\x9d\xe4\x00\x51\x2b\x2d\x1b\xc7\xd8\x4e\x9a\x59\xe7\xbc\xd3\xa6\xfc\x6d\x2d\x17\x75\x86\x31\x38\x0c\x3f\x3c\x58\x63\xc8\xa9\xc1\x9a\x0d\xba\x21\xfe\xb9\xf8\xeb\x5f\x63\xfc\x02\x92\xa8\xf5\xb4\x64\x0d\xfd\x58\xc3\x78\xd4\xc9\x2d\x88\x62\x11\x03\xf2\x45\xd2\xae\x3e\xe8\x9b\x97\xe8\x43\xa1\x4a\xa8\x0e\xc5\x38\x52\x9c\x7f\x52\xc3\xc0\xbc\x87\xe6\xa9\xed\xcf\x2c\x49\x01\xcf\x15\x5c\x9b\xd3\xe2\x03\x1e\x92\x69\x3a\xc8\x0b\x5a\xfd\x92\xb4\x42\x64\x12\x83\x59\x2a\x21\x02\x11\x05\xed\x49\xfb\xd3\xa2\x24\x93\x41\x97\xfe\xe4\x12\x9e\x03\xf3\x5e\x5a\x72\xd8\xa6\x3d\xe1\xcb\x62\x80\xcd\xc7\xb3\x7c\x98\xf4\xe0\x11\xc0\x6c\x6d\xe6\x4e\x41\x37\xcb\x14\xb8\x56\x3b\x4b\x42\xaf\x40\x45\x2b\x33\x00\x05\x6f\xa8\xbe\xc5\x09\x35\x22\xda\xcc\x40\xca\xed\xd6\xf1\x8f\x12\x72\x43\x8f\x2b\xca\xb8\x5d\xd0\x7a\x97\x56\x85\xec\x26\x4b\xce\xf7\xb3\xe3\x71\x20\x48\x1e\xd0\x15\x40\xbf\x45\x4f\x6c\x44\x69\x65\x70\xff\x20\x60\x81\x0b\xe6\x1e\xc9\xab\x03\xd9\xc6\x00\x41\x12\xc1\x86\x39\x68\x29\x33\x20\x5a\x69\x03\x24\x06\xad\xa2\x8e\x9a\x3a\x74\x99\x24\xaa\x93\xb9\xaf\x9c\x7f\x13\xa6\x9c\xd9\xec\x62\x4e\xd4\x69\xf5\x7a\x06\xe9\x62\xa4\xb8\x75\x46\x00\x4d\x48\x08\xd2\xab\x1a\xb9\xf4\x5a\x54\x0b\x48\x48\xd3\x26\xa5\x5f\x84\x04\x9c\x7b\x67\x68\xd4\xf4\x39\x89\xcb\xff\x53\x49\x5c\xe2\x09\x4c\xe2\xe9\x4b\xea\x92\x97\x04\x12\x0a\xfc\x0a\x67\x43\xdf\x7e\xd3\x69\x5b\xf3\x87\xf0\xc1\xd9\x01\x47\x4d\x4f\xfc\xee\x5a\xbe\x0f\x5d\xd4\x62\x43\x1b\xbd\x06\x9d\x53\x42\xb5\xb8\xca\xad\xd6\x0b\x2c\x18\xaf\x81\xb1\x50\xff\x15\xb8\x59\x3a\x42\xb8\x7a\xb7\x16\x4f\x2e\xaa\xab\xb8\xc9\xe4\x5c\xf3\xda\xb9\xad\x0e\x62\x7f\x6f\x6b\xf5\x15\x89\x35\xab\xac\x47\xec\x65\xad\x5d\x90\xa5\x1b\x69\x61\xc8\x93\x6f\x8f\x55\xd0\xd4\x4f\xd2\x2b\xd2\xee\x00\xa0\xa9\xf7\xa9\x92\xfb\x70\x81\xe7\xf7\xe8\x4b\xe7\xdd\x68\xb2\x95\x0c\x79\xe8\xbf\x2c\x6e\xce\xc3\x83\xa8\x64\x16\x8a\xe5\x16\x52\xa3\xba\x7d\x92\x3c\xfa\xcf\x4f\x95\xe7\xed\xb8\xdb\x89\xe0\xdc\xb8\xd9\x07\x05\xbf\xcf\xd2\x2f\x74\x23\x0c\x1f\xb0\xd5\xd2\x27\x59\x73\xda\xee\xa3\xc7\x0f\x6e\x9f\x55\xc9\xb3\x7b\xed\x6e\x3e\x7a\xd4\xae\x1a\xb7\x76\x37\x37\xd1\xb2\xbb\x62\xbe\xda\xdd\xfc\xf2\x71\x3b\x6e\x9f\x6a\x8a\xfe\x56\x4d\xab\xb4\xf9\xf0\xb3\x9d\xf7\x1f\x60\xe7\x3d\x04\xc9\x1a\xee\xec\x1b\x33\x48\x0c\x7a\x1c\x4d\xa7\x14\xb1\xfc\x06\xf3\x2d\xbf\x25\xf9\x58\x10\xad\x15\x01\x2c\x36\xc2\x48\xa8\xfa\x45\xf5\x2a\xde\x6a\x2f\xf7\xef\x3b\x65\x69\xf5\x8a\x44\xfa\x75\x71\x06\x37\x1f\x7d\xf6\x46\xfd\x93\x4e\x9a\xa1\x7b\x77\x2e\xf2\xe1\x60\x9a\x8d\x3f\x2e\xce\xe0\x2e\x3a\x30\xfb\x86\xec\xf4\xcd\x33\xdd\x7f\x09\x41\x1f\xb0\x47\x42\x59\x62\xa5\x1e\x1a\xf2\x47\xeb\x59\x9b\xf8\xd2\xbc\xb6\xe6\x00\xa2\x83\x60\x68\x6a\xef\x97\xdd\xc6\xf3\x75\x1f\xc3\xa4\x20\x83\x6c\xfa\x87\x84\x11\x3d\x08\x16\x93\x26\xf8\x1b\xe9\xf7\x09\x88\x9d\x66\x5c\x44\xa6\x27\x3d\x0c\xfc\xd3\x0b\x73\x32\xeb\xa0\x12\xae\x55\xf2\x1a\xff\x44\xd6\x01\x36\x8c\xa4\x67\xe4\xa1\x6a\xfa\xae\xe4\x65\x16\x08\x76\x44\x09\xae\x0d\xb5\x8f\x37\xa3\x38\xf4\xd7\x09\x0e\x2b\xa1\x9b\x9e\xce\xc2\x9e\x48\xa7\x0c\xb0\x3a\x0b\xdc\x54\xa9\x2e\x76\xb9\x3d\x6b\xba\x69\xb4\xdd\x80\xda\xd4\x91\x95\x6c\x3c\x07\x2d\xf4\x64\x58\x90\x07\x70\x3a\x9d\xa6\x57\x25\x23\x0f\x94\xaa\xd9\xc8\x7f\x3d\x14\x65\xa5\x63\x17\x0b\x90\x20\x89\xc2\x85\xc0\x4d\xb3\x21\x00\xec\x0f\xe7\xa5\xa1\x43\xc8\x8c\xb4\x47\xc3\xa2\x14\x86\x1c\x6c\x03\xc3\xa5\xf4\xb4\xe1\x29\x26\x35\x9d\x43\x04\x43\x82\xd4\x03\xad\xc4\x78\x80\x93\xc1\x46\xad\x5e\x27\xf9\xb6\xb8\x34\x6f\xff\xb4\x4d\x15\xbd\xd1\xe5\x24\x1b\x41\xa9\x3c\x07\x17\x1f\x0e\x09\x94\x55\xb8\x91\x32\x60\x04\xd2\x4d\x0e\x5d\x85\x86\x46\x18\x72\x1d\x46\x84\x0c\x9e\x5b\xb6\x8e\x37\x70\x44\xab\x6e\x1d\xf1\xa7\xaa\x6b\x4b\xca\x63\x5c\x97\x13\x89\xb2\xb2\x16\xd8\x05\x05\xa1\x95\x50\xed\x60\x63\x2b\x81\xa7\x67\x9f\x2f\xba\xb3\xec\x89\xde\x7e\x61\xbf\x6d\x48\x82\xe1\x15\x1b\x19\xc1\x28\xc0\x5e\x97\x22\xfd\x74\xf9\xce\x77\x96\x55\x44\x8e\x9d\xb4\x20\xea\x66\x76\x83\x5b\xec\xf3\xf5\xe2\xe2\xa3\x7c\x51\x1b\xa5\x9d\x01\xec\x02\xbf\x01\x24\xb2\x80\x18\x34\x19\xa6\x57\x60\x6d\x0b\x48\x49\x38\x80\x0b\x7d\x01\x8d\xd5\x59\x7e\x3e\x9f\x2a\x17\x73\x8c\xd5\x6d\x4e\xa9\x41\x91\x64\xc6\x4c\xa9\x74\xfd\xeb\x2d\x52\xe3\x98\xdf\x33\x1e\xeb\xaf\x89\x5d\xff\xe6\x5a\xfa\x4e\xbe\x67\x57\xd0\x68\xcf\x9d\x18\x08\x92\x17\x18\x10\x23\x5c\x31\x04\x20\x50\xe8\x13\x1b\x40\x95\xb5\x5e\xcf\xbc\x1e\xbc\x70\xea\xe5\xe6\x51\xb5\x15\x6c\xed\x88\x4b\xc5\x5b\x22\xa6\x7d\xc9\x91\xb3\x50\x68\x42\xeb\x90\xec\xef\x92\x26\x0a\x4c\x39\xcc\xdb\xc4\x68\x10\x4c\xcc\xed\x88\x12\x42\xb2\x58\x41\x8e\x94\xe7\x60\x69\x40\xcb\x84\xec\x2e\x72\x7c\x76\x92\x46\x83\xed\x8b\x4a\x64\x34\xe8\x04\x23\x1c\x54\xc0\x62\x05\xdf\xab\x95\xfc\x57\xe5\x0c\x58\x9f\x56\xed\xcc\xca\x9b\xf2\x54\x6a\x1d\xe7\x5e\x9c\x27\xfa\xea\x24\x93\xf5\xaf\x51\xe7\xe5\xc1\x0f\x7b\x3f\xef\xfd\x63\xff\xf0\x68\xff\xd5\xdf\x9d\xde\xc5\x75\xb2\x12\x94\x37\x7b\x08\x07\xdc\x92\x43\x8e\x8e\x27\x2e\x54\x1a\x03\x85\x9d\x61\x02\x2a\x52\x99\xde\x05\x5b\x39\x8e\x48\x34\xe0\x13\x1f\x0c\x35\x40\x9e\xd6\x03\x01\x52\x4e\x5b\xf1\x63\x3c\xac\x13\x6f\xa4\x9a\xc7\x6c\xf8\x47\xb8\xd9\xea\x26\x6f\xc7\x29\xc9\x30\x0d\x69\x03\xba\x11\x9c\xdc\x5f\x4a\x95\xdc\x92\xc5\xa1\x2e\xd8\xa0\x40\x3a\x35\x2d\xaf\x30\x50\x64\x69\x7d\xdd\x2f\xcd\x33\x3e\x1f\xcb\x8d\x87\x62\xc8\x0e\x61\x8e\x1d\x6b\x2e\x4e\x29\xc3\x76\x00\x8c\xd1\x7c\xab\x2d\x6a\x9b\x64\x30\xa7\x31\x15\xc0\x2a\xd2\x03\x97\x7c\x3d\x3b\x2d\x06\x57\xdf\x90\x08\x96\x9e\x91\x19\x0c\xbe\x6c\x87\xf0\xc6\x59\x49\x56\xa7\xe9\x39\x87\xef\xff\x1a\x24\xbc\xdf\xb4\x93\xaf\x27\xdf\x60\x0e\x89\xaf\x53\xfa\x97\xc0\x8c\x8b\xf1\xfa\xe1\x0f\x7f\x77\xe2\xd7\x00\x1e\x26\x38\x4f\xbe\x2e\xdf\x9f\x7f\xc3\xdb\x67\x16\x65\x0a\xde\x11\x10\xc1\x43\xd2\x8c\xf2\xe2\xc1\x8b\x57\x8a\x52\x4d\xec\x89\x02\x80\xf8\x62\xe0\x91\x05\x79\x65\xef\x2f\x65\xcf\x05\x6b\x54\x1b\x88\xc7\x47\x7f\x97\x93\xe2\x24\x04\x9e\xa7\xbb\xde\x77\x9b\x5e\x0f\xef\x5d\x05\x6f\x84\x5f\xcc\x93\x47\xa1\x6b\xa3\x0d\x8e\xa5\xe3\x93\x6a\x53\x55\xa6\xe2\x33\x2c\x04\xe2\x5f\x0f\x7b\x11\x68\xe0\x6a\xd8\x55\xbc\x14\x7e\x09\x7a\x0c\x8a\x29\xe4\x83\xb7\x2a\x51\xe9\x07\x5c\x4b\x71\x53\xa1\x17\xd5\x74\x15\x7b\x7b\xa1\x0a\x55\x68\x2a\x5c\xcf\x23\x36\x08\x98\x0c\x0c\x65\x18\x0e\x0f\x93\x0a\x54\x4c\x4d\x7b\xb3\x02\x67\xde\xa3\x10\xc9\xe3\x12\xe5\xde\x33\xa7\xa2\x0b\xa6\xe1\xb0\x96\xc5\xc5\xbf\x10\x2e\xfe\xc5\xe2\x62\x37\x67\xc1\xc9\xbf\xf8\x01\x06\x82\x6a\xc7\xbf\x9c\x68\xd4\xc5\xf9\xe2\x90\x64\xab\xd6\x8c\xaf\x9a\x1d\xcc\x3b\x1a\xcc\xbb\xc8\xc3\xf0\x6e\xe1\xc3\xf0\xce\x6e\x5d\x69\x6e\x84\x21\x15\xf4\xe3\xe0\x47\x47\x28\xb3\x45\x28\x7e\xdf\xf0\x83\x6f\x8e\x7e\x7e\xb9\xfd\xe6\xbb\xb7\xaf\xbb\xea\xc2\xf8\x74\xb5\x2a\x48\xaa\xf8\xbb\xed\x15\xfb\xe7\x81\x4f\x6c\x87\x76\x9d\xce\x6d\x3b\x06\x8e\xb7\x56\x15\x29\x31\x5c\x42\xf9\x4e\xb6\x56\x9e\x97\xf7\x00\x7e\x9a\x79\x85\x97\x32\x78\x83\xe4\x6e\xba\x47\xf0\x8f\x98\xe7\xd1\xde\x3f\x8e\x7e\xde\x39\x78\x05\x4c\xb6\x9e\xa6\x4f\xc0\xde\x68\x9e\x32\x4e\xd7\xfc\x13\x8d\x55\x91\x13\x7a\xa8\xe6\xf6\x6f\x73\xb2\x66\xa6\xaf\xe4\xb1\x83\xf4\x44\x98\x9b\x28\x3d\x35\x9f\x3b\x75\x3d\x2f\x8f\xa6\x16\x65\x26\x6e\x10\x8c\x82\xa5\x05\xdd\x47\x9b\x5f\xb4\x17\x8b\x01\xba\x9b\x0f\x1e\xc6\x82\x52\x54\x98\xff\xee\xe6\x57\x5f\x45\x62\x55\x6c\x7e\x16\x37\xfd\x79\xe2\x26\x95\x5f\x6f\xb1\x90\x69\xe3\xde\x2f\xe5\x30\x07\x47\x9e\x7c\x76\x99\x97\x9c\x67\xa5\x4e\xfe\xb4\x92\x80\xc7\x6e\x29\xf6\xf9\x32\x2d\xdf\x91\x71\x72\x1b\xfa\x18\x99\x9f\xbe\x9f\x3a\xe9\xc7\xff\xea\x0a\x81\x94\xe7\x1f\xd6\xcb\x5c\x4d\x69\x7f\xfc\x0b\x59\xb7\xb0\x48\xd5\x72\xb3\x1e\x53\x65\x15\xfe\x83\x36\x85\x8a\xef\x63\xea\x59\x6b\x34\xcf\x59\xce\x0a\xca\x44\xeb\x38\x47\xce\x4c\x95\x48\xe6\x25\x4c\x81\x7f\x51\x5c\x92\x81\x78\x59\x16\xfd\x1c\x9f\x75\x20\x74\x9d\xff\x88\xb3\x05\xc4\xb8\x97\xc2\x62\xd1\xeb\xe1\x22\xd6\xbc\x7c\x7b\x78\xf4\xf3\xdb\xc3\xbd\x9f\xb7\x8f\x8e\xde\xec\x3f\x7f\x7b\xb4\xd7\x4d\x1e\x7c\x78\xd8\xd6\x45\xaf\xdf\x1c\xbc\x36\xef\xd8\x3f\xa1\xe4\x11\x94\x7c\xbb\x7d\xf8\xf3\xe1\x3e\x10\xfb\x2f\x5e\xec\xed\x1c\x1d\x42\xc1\x63\x29\x78\x7e\x70\xf0\xfd\xde\xf6\xab\x9f\x7f\xd8\xfe\xfe\x2d\x02\xfb\x4a\x4a\x5e\xbd\x7d\xb9\xf7\x66\x7f\xc7\x95\x3c\x7c\x20\x45\xaf\x0f\x0e\xf7\x8f\xf6\x01\x7f\x85\x75\x1e\x3d\x48\x7e\xf3\xaa\x1a\x2c\xf7\xe6\xfb\x83\xed\xdd\xbd\xdd\x6a\x57\x8f\x1f\x84\xb1\xb3\x60\x63\xd0\x90\xd1\x8b\x6a\xf7\x6e\x5c\x5c\x0e\xb3\x01\xb8\x96\x9f\x16\x9c\x03\x02\x22\x22\xd3\xf5\xa4\x04\xa7\xb2\x0b\x09\xb1\xf9\x04\x10\x29\x64\xc2\x9e\x62\xad\xe9\x22\x4c\xeb\x40\xd2\x79\xb9\x33\x2f\x67\xc5\x68\x7b\x66\x4e\xeb\xe9\x7c\xa6\xa2\x92\xb1\x1f\x56\xfe\x3e\x43\xfa\x3d\x95\x1a\x94\xb8\x0f\xd9\x62\xb1\x37\x99\x72\x64\x72\x4e\xbf\xcf\x77\x92\x5e\x59\x94\x97\xb9\x68\xce\xc9\xfb\x6c\x7a\x6a\xce\xcb\xa8\x03\xc6\x45\x62\x7e\x67\x70\x67\xba\x7e\x0f\xb6\x1e\x6e\xc3\x3a\x0f\xce\x76\x59\x92\x51\x10\x59\x8e\xe4\x23\x65\x3b\x92\x64\xe3\xf9\x08\x33\xd0\x69\xd3\x5d\xa9\x10\x80\xa1\xa3\xdb\x56\xd3\x7f\xed\x16\x85\xd7\xcf\x86\xe6\xf6\x8e\x29\x4e\x99\x72\x44\xdb\xe4\x69\xd0\x3e\x7a\xb9\xfa\x36\xac\x8d\x99\x0f\x88\x02\x3a\x60\xdf\x7f\x85\x86\xb5\x76\x28\x68\x89\x08\xc8\x09\xf3\xb4\xf1\xea\xcd\x38\x1e\x2a\x98\x74\x5c\x4e\xc1\xa9\x1f\x93\x29\x47\x02\x61\x9b\x9f\x76\xcb\x38\x3a\x4a\x30\x7e\xe2\x8f\x82\x5d\x73\xc0\x62\x4b\x63\xb0\xae\xbf\x54\x28\x59\x74\xd1\x8d\xe7\x6c\x0d\x76\xef\x1e\xc8\x1a\xa7\x80\x17\xe4\x04\x3b\xa4\x41\x90\xfc\xa1\xbe\x56\xb6\xe2\x90\xfd\x29\x1f\xe5\x43\x0c\x1d\x53\x9d\x07\xb9\x45\x16\x53\xbd\xfe\x14\x6d\x5d\xed\xd7\xd5\xc2\xe1\x2d\x1e\xcb\x4b\x4e\xb8\xf8\x92\x8c\x02\xbb\xea\x0c\xd0\x89\x67\xec\x6c\xd3\xc7\x49\x86\x46\x31\x23\x84\xdd\x24\x68\x62\x7a\x99\x97\x4e\x38\x4c\x56\xa8\x41\x1b\x41\x73\x14\xd4\x56\x25\xf4\x8b\x4a\xed\xc4\xbc\x66\x50\x8c\xac\xa3\x0c\x5d\x71\x8a\x0f\x80\x7f\xa6\x60\xf0\x0e\x56\x9e\xa7\x60\x0e\x6d\x49\x23\x44\x96\x39\x1e\x45\xb5\xee\xd4\x5c\xc9\xdc\x2a\xa0\xb5\xc4\x4d\x2d\xc8\xd3\xea\x20\x3a\xaa\x58\xb1\xbd\xfc\xd4\x04\x9b\x19\x6b\x5f\xad\x55\x05\xe3\x1d\x98\x3a\x28\x7e\xa5\x2a\x90\x60\xa7\xeb\xc0\x84\xd5\x18\x90\x65\x27\xab\x8d\x2a\x48\xd3\x31\x5b\x6a\x58\x9d\x9f\x2b\xf5\x5e\xf0\xfa\x73\x34\x45\x4b\xcb\xae\xd0\xc5\x9a\x47\x7a\x87\x3c\x24\x1c\x27\x89\x6f\xec\xf6\xe7\xd3\x84\x1c\xbc\xa3\xe7\x94\x97\x87\x9c\x5c\x09\xba\x0b\xe3\x7b\xcb\x30\x5a\x2a\x04\x61\xcd\x61\x6c\x76\x3a\x9d\x56\x37\xf9\x67\x31\xff\xa9\x01\x56\xbc\xd3\x2b\x8a\xc4\xca\x87\xd7\x47\xbf\x5a\xfe\xd3\xf8\xa9\xf1\x97\xf2\xa7\x06\x2b\x8a\xc0\xb1\x22\x65\xc6\x01\xe3\x40\x52\x73\x43\x3a\x00\x68\x4c\xc3\x4a\xb4\x85\x21\xf2\xc6\x33\x14\x8e\x79\xc0\xa8\xba\x88\xa0\x90\x48\xf4\x7a\xe6\xdb\x66\x08\xbc\x3e\xa5\x4f\xbd\x72\x50\xeb\x00\x5d\x16\xdc\x8c\x11\x0a\x4a\xed\xe1\x8b\xa1\x91\x67\xda\x0d\x97\xb0\x98\x96\x5d\xc9\x02\xca\x6e\xfb\xd9\xc9\x6f\xb1\x11\x4a\x8e\x55\xdf\xfa\x58\xaa\xbb\xe4\x2c\xdc\x06\xce\x16\xe2\x7a\xcc\xc0\x9b\x3c\xb5\x03\x34\x1c\xec\xf7\xf2\xbd\x69\xf9\x41\xdd\x05\xda\xf5\xd0\x33\xec\xf5\xe5\xc0\x9d\x28\x78\xb6\x47\xb8\x71\x15\x0c\x51\x3f\xbd\x40\x22\x9d\xea\x66\xc4\xf3\xf9\x90\xdc\x54\x1d\xcb\xba\xca\xa8\x3d\xc0\xfe\xc0\x6b\xc0\x78\xfd\x7a\x2b\xec\xc1\xaa\xb5\x5e\x5b\x19\x9c\x5b\x50\xc7\x0b\xd7\xec\x87\x42\x98\x1a\x44\xac\xcf\xc5\xeb\x9e\x3c\x53\x7c\x78\xd8\x4a\x81\xd6\x2c\x7e\xdd\x56\x07\xf8\x77\xa5\xbd\x0e\x26\xe6\x83\xf0\x56\xa7\xda\x41\xf5\x08\x2c\x5b\xfb\x05\xe0\x75\x00\xd3\x6b\x7d\x6b\xa0\x12\xbf\xda\x4f\x15\x4a\xae\x76\xae\xfb\x02\x0d\xad\xa1\x8a\xed\x5e\x47\x37\xc9\xf1\x86\xae\x8f\x76\x94\x12\xed\x54\xb9\xa6\xe8\x55\xe5\x6e\xe5\xf7\x27\xeb\x55\x18\xb2\x68\xa7\x66\x9b\x0f\x0d\x52\xde\x3b\x3b\x33\xcd\xca\x8f\xed\x33\x64\xf5\xea\xba\x7c\x0e\xa6\x86\xe9\x18\x7d\x2e\x3e\x45\x9f\x1e\x6b\x57\xd7\xe9\x2b\x60\x51\xf2\xfe\x27\xeb\xd4\x63\x3e\xeb\x3a\x95\x14\xfa\x9f\xba\xf3\x38\x0b\x5c\x37\x8a\x03\xc3\xee\x0d\x8b\x74\x90\x0d\x3e\xf5\xca\xd7\xf1\xd7\xee\xc1\xfb\x64\x44\xcf\x82\x6b\xe9\x69\x55\x63\x8d\xaa\x97\x4a\xd1\x46\xaa\x7e\x37\xd9\x49\xc7\xc0\xcf\x08\xfb\x41\xba\xb5\xd3\xc2\x30\xf2\x8e\x4b\xd3\x11\xe6\x20\x5b\xd9\xad\x48\x87\xd5\xa6\xb3\xda\x64\x5c\xe4\xe7\x8f\x59\xed\xd5\x90\x51\xfd\x5a\xd7\xe1\x92\xba\xa5\x0e\x59\x3e\xa4\xd0\x4a\x08\x71\x92\x11\x08\xb2\x95\x01\x86\xf2\x36\xab\x7d\xe3\xe9\xac\x34\x99\x4f\xb3\xd4\x77\xc2\xbe\x6a\xee\xa5\x56\xb8\x56\xda\xd4\xe0\x94\x85\x6d\x96\x62\x82\xaf\x9f\x26\x0f\xeb\x36\x8c\x7c\xe4\x58\xae\xc4\x42\x98\x53\x02\xd3\xc6\xf8\x34\x04\x59\x7d\x9b\xfa\xe4\xf9\x98\x46\x9c\x88\x38\x75\x3e\x23\xab\x29\x30\xdf\x39\xcd\xc7\x29\x25\x6d\xbf\xc1\x85\xba\xf1\x32\xde\x7c\x11\x6f\xb7\x84\x2d\xcf\x22\xfc\x9a\x53\x18\x67\x67\xe9\x7c\x48\xae\x86\x3b\x10\x15\x51\xb2\xa9\xb2\xc2\x40\x75\x94\x88\xc6\x04\x1c\xff\xe7\x13\x16\x2b\xf1\x45\xe1\x1d\x98\x97\x18\x50\xfe\x5d\x66\x25\x0a\x20\x54\x44\x48\x90\x99\xce\xe7\x34\x30\x1b\xd3\x71\x23\x1f\x34\x4e\xa8\x02\x89\x0b\x17\x54\x3d\x2b\x8a\xd3\x74\x2a\xd5\xad\x68\x85\x7b\xd8\x1e\x82\x3f\xd8\xf9\x05\x29\x0d\x98\x17\x03\xf6\x0a\x31\x66\x1b\xa4\x68\x06\x1e\x58\x2c\x40\x6a\x00\x74\x7a\xcf\xc1\x4f\x6f\x9c\x4d\xd3\xa1\x15\xfc\x97\x1c\x0b\xb1\xbb\xb1\xf1\x4b\x09\xf5\x31\x14\xe2\xbb\xec\x6a\x9d\x82\xd3\x2c\xa9\x04\x7e\xe8\x68\xb2\xe7\x2c\xd5\xec\x02\xb2\x7d\xda\xfe\xae\x23\xbb\x7e\x7e\xb5\xfd\x72\xaf\x9b\x34\x50\xce\x89\x61\x16\xcd\x72\xf8\x32\xe0\x1d\x52\x33\x5c\x5e\x64\xe8\xb9\x9a\x06\xc2\x47\x70\x9e\x4c\x24\xb1\x71\x20\x3e\x22\x3d\x45\xf2\x2b\x05\x0f\x72\x6e\x51\x3e\x97\xd7\x35\x3b\xee\x77\xe9\x89\xfd\xad\x48\x2f\x22\xe9\x77\x12\x2b\xc3\x3f\x93\x3a\xc0\x1c\x45\xc8\xa1\x84\x59\x49\x06\x04\xce\x54\x84\xac\x3e\xa2\x71\x41\x58\x60\x1f\x46\x4b\x55\x15\xe6\xd5\x8c\xba\x86\x05\x5b\x32\xfc\x40\xe8\x47\x0a\x8a\x40\x9a\x49\x59\x0b\x73\x83\x58\xa7\x4a\xd4\xc9\x02\x4c\xac\x91\x4e\xf9\x70\xa3\x95\x0c\xa9\x21\xa0\x0b\xb6\x71\x33\x58\x85\x8c\x26\xef\xd9\xd6\x94\x78\x65\xf1\x74\x3c\xde\xed\x16\xf3\x70\x2b\x07\x66\xa5\x20\x9f\x60\xbb\x5c\x38\x0f\x7d\xbb\x9e\x4d\xca\xa6\x81\xf1\x50\x4d\xd5\x49\xf0\xc8\x91\x2d\x91\xd8\x06\x65\x1f\x38\x61\xc1\x59\xda\x47\x8f\x98\xd6\xd2\x4d\x51\x3c\xde\x2d\x26\x51\x15\xa3\xe2\x70\x51\x8f\x80\xce\xe9\x78\xef\x30\xc0\x10\xc0\xb3\xd5\xfb\x44\x16\x9d\x66\x18\x0a\xae\x84\x14\x36\x57\xa2\x1b\xb6\x27\x15\x82\x5a\x94\x6a\xa1\x57\xd9\x15\x9f\xab\xab\xce\xe8\x47\xbe\x89\x5e\x47\x48\x17\x68\x6d\x15\x50\x64\x62\xa5\x95\xa2\x1b\x2d\xcb\xe1\x57\xbb\xa2\x21\x2d\xf6\x29\x86\xc1\x36\xc2\xb1\x33\x1a\x1c\x91\x74\x7c\x35\xbb\x20\xe1\x57\x2a\xc1\x08\x7b\x5f\xcb\x7b\xf2\x0d\xdc\xe4\xaf\xd9\x06\xeb\x9b\xde\x92\x13\x12\x10\x3a\xf5\x13\x01\xa5\x08\xc8\xed\xad\x65\x1a\x47\xa7\x81\x30\xb8\xa5\x4f\x85\x95\xf3\xfe\x05\xac\x2a\x07\xf4\x21\x1b\x69\x03\x6a\x9a\x91\xae\xb8\xe4\xb4\x40\xfc\xfa\x43\xc8\x01\x08\x06\x63\xbd\xf8\xc5\x3f\xbd\x93\xfc\xc8\xe6\xcf\x2a\xde\x30\x23\x2d\x1b\xa3\x25\xe7\x20\x09\x70\xcc\x48\x8f\xe5\x87\xb1\x5a\x30\x77\x9f\x64\x5b\x71\x0f\x9d\xea\x53\x2c\x1e\x10\xe9\xa0\x86\x00\x94\xab\x18\x77\x92\xb3\x19\x2f\xed\x5e\x13\x04\x37\x3c\x43\x42\x1a\x15\x68\x5c\x49\x89\x67\x53\x46\x8a\x5c\x84\xe1\xa1\x3f\xe5\x70\x35\xed\x73\xc3\xe1\x4e\x98\xaf\x8d\x8f\xdb\x16\xff\xce\x13\x88\x71\xd7\x2b\x4e\x44\xd3\x50\x38\xe4\xb3\x61\x8a\xfa\x9c\xcb\xcc\xa0\xc2\x94\xc3\x2b\xf1\xb5\xe8\xb0\x51\x1c\x3f\xb1\x34\x62\x34\x2c\x00\x8c\x29\xe1\x96\x28\x44\x69\xc2\x89\x92\xac\xc7\xbc\x5c\xad\x48\x2b\xfb\x62\xa3\xb8\xd7\x6b\x69\x9b\x61\x2c\x72\xb0\x6c\x58\xba\x1a\x71\xc2\xb4\xba\x1e\xdb\x4e\x45\x5b\x51\x70\x34\x5b\x8e\x98\x54\x5c\x99\x2f\xd4\xb7\x9d\x2e\xd0\xad\x74\x93\xe3\x93\x9b\x93\x56\x7d\x84\xe6\x48\x06\x99\x33\xbd\x56\x8a\xa4\xaa\xd5\x97\x37\x3d\xb9\xae\x48\x2b\x63\xf6\xdf\xab\x2a\x89\xa2\xf6\xe1\x14\xaa\x36\x6c\x33\x26\x51\xe7\x2a\x60\x03\x83\xf2\x08\xac\x60\x26\x5a\xf0\xaa\x34\xfe\x55\xcb\x2b\x5b\xcc\x21\x73\x23\x09\x93\x5c\x04\x3b\x66\x49\x82\xb4\xed\xe4\x6c\xe3\xeb\x60\x54\xb8\x38\x74\xb7\xd1\x7a\xeb\x56\x27\x79\x09\xb1\xc3\x04\x9a\x4a\x57\xdd\x68\x00\x6a\xa0\x4c\xf1\x8e\xe1\x03\x6d\xfc\x8f\x05\xa0\x8b\x2b\xf6\xae\xbd\x47\x76\x17\x4d\xf3\xd8\x19\x3c\x32\xcb\xfb\xf3\x61\x3a\x6d\x27\x3d\x38\xed\xbd\x16\xac\xf7\x15\x67\x05\xc1\x8c\xdd\x44\xdc\xe2\x55\x50\x56\xde\x08\x88\xa0\x1d\x1d\xec\x1e\x74\x93\x7d\x0c\x98\xc3\xfc\x87\xb9\x67\xe7\xd3\xf4\xd4\x46\x69\xb7\x06\x0c\x8a\x46\xc3\x4b\x8a\x4e\x8e\xf8\x2a\xf2\x44\xc5\x02\x1a\x30\xd4\xfb\x22\xc7\x7c\x00\xac\x28\x23\x87\x48\xa7\xb7\xb2\x55\x41\x57\xf5\x4c\x53\x3a\xbb\x8a\xfb\x7b\x51\x4c\xdd\x13\xed\x65\x02\xa6\x9c\xb6\x30\x22\xad\x0c\x86\x12\x6e\x8f\x1a\xd4\x90\x91\x3c\x96\xa6\x27\x4e\xf7\x0a\x89\xd9\xd9\x25\xcc\x05\x40\xb8\xa3\x21\xb9\x23\xb5\x00\x20\x67\x20\x56\xbd\x8b\x82\xf7\xda\x41\x45\x61\x21\x10\x2a\x1e\x78\x07\x5f\x8d\x05\x15\xc0\x1c\xc5\x98\x16\x4f\x42\x15\x48\x97\x56\xc2\xa2\x81\x21\x7f\x8d\x9a\x31\x07\x8a\xbe\x6d\x55\x4f\x7e\xb5\xa1\xbb\x06\xb9\xc8\x2f\xbb\x51\xa9\x66\xad\xd5\xa2\xd4\xbc\x81\xad\xe2\xd2\x74\x58\x8f\x3f\x9b\x18\xfe\xf9\x26\x86\x1f\xe9\xd1\xea\x89\x1c\xb4\x5b\xab\x2b\xb0\x1e\xa9\xff\x39\x2f\x66\x8e\xcb\x10\x4c\xc0\x49\x44\xfc\xe6\x0b\xab\x8a\xbf\x2a\xa7\xef\xf5\x5b\x4a\x4e\x5f\xcf\x94\x91\xc8\xae\x7d\x8c\x12\x48\x19\xb4\xc7\x88\x68\xde\xbb\x90\x58\x7c\x77\x24\x0e\x2b\x2a\xd5\x6c\x92\x9d\x45\x72\xb6\x31\xa2\x89\xbf\xfe\x35\xb9\xc3\xd0\x6a\x1a\x79\xa2\x36\xdb\x28\x2f\x5f\xa5\xaf\xc8\x88\xb2\x55\xdb\x34\xaa\x46\xb1\x20\xd8\x04\xf3\x6b\x10\xbb\xd5\x41\xa8\x91\xda\x59\x18\x2e\xfc\x2c\xbe\x55\xe4\x33\x79\xc3\xdc\xe7\xe4\x82\x61\x38\x79\xe8\x58\xb2\x6a\x25\xd6\x83\x82\x4c\x53\x39\xc1\x95\xf3\xc8\x38\xcc\x66\xfb\xe3\x71\x36\xfd\xf6\xe8\xe5\xf7\xba\xca\xbb\xec\x4a\xff\x9c\x66\x67\x5d\xb1\xf1\x43\x04\x2c\x07\x20\x1b\x28\x41\xfa\x53\xb1\x9a\x91\xd2\xb7\x63\x30\x5f\x1c\xab\x33\xea\x9e\x1b\x45\x20\xc1\x4c\xdd\xd0\x43\xed\x2f\xd5\x34\xab\xe4\xaa\xf0\xca\x29\xf1\x79\x38\x96\x5a\x20\x61\x45\x02\xe5\x1e\x0b\x17\xe5\xd7\x6a\x73\xe3\x4d\xac\x9d\x84\x3c\x79\x4e\x09\xcf\x96\x07\xe3\x88\x91\x04\xd6\x86\x18\xa6\x64\xed\xa8\xcc\x1b\x1d\x6f\x62\xc5\x70\x5b\x86\xfb\x35\x4c\x6f\x49\xf6\x62\x4e\x3a\xc7\x82\x37\xdb\x73\xa9\x64\x64\xa6\x5f\x91\xf4\xfb\x82\xd5\x90\xd6\xf6\x87\xab\xd5\xf9\xc1\x44\xba\x11\x70\x35\x02\xba\x70\xd5\xeb\xfb\xb8\x99\x99\x48\x68\x49\xc0\xbe\xc5\x12\x31\x1d\x57\xf4\x05\x0a\x15\x2e\xdb\xc4\xc1\xa3\x14\x12\xe9\x29\x49\x68\x94\xca\x62\x82\x5b\x51\x31\x9d\xb2\x1e\x91\x23\xa1\x4d\x6d\x0a\x05\x04\x36\x2c\xce\xcf\x89\xc6\x02\xa9\x15\x04\xab\x53\x2e\x73\xe6\x95\x28\xcf\x32\xa4\xa1\xca\xa3\x82\xdc\x11\x56\xd6\xc7\x30\x82\x94\x3d\xf2\xb7\x8e\xf0\x9e\xe8\x1f\x1a\x7c\x7d\x7c\x52\xf8\x2f\x65\x27\xd9\x35\x54\x20\x5a\x21\x19\x54\x62\x3e\x3c\x6b\xb8\x20\x55\x23\xeb\xc5\xa1\x41\xd3\x62\x25\x94\xed\x8e\x16\xed\x7a\x81\x63\xf6\x20\x4b\x87\x9e\x5f\xb6\x27\xb8\xad\xca\xbb\x55\xf3\xa7\x41\x22\xe7\x1d\x0e\x2e\xc7\xe2\x53\x89\x09\xb9\xbf\xbb\xd0\xfe\x51\x82\x93\x99\x79\xbe\x1d\x67\x65\x3f\x9d\x98\x5d\xc3\x38\xd7\x5e\x34\x31\xa9\xf6\x52\xfb\x1f\x3b\x0e\x91\x28\x3c\x2a\x84\xa8\x4d\xbb\x8a\xdc\xcd\x07\x41\xb8\x10\x7d\x22\x2b\x72\xfb\xe4\x7e\xd2\x78\xea\xb4\x49\x0b\xdf\x47\x00\x1d\x61\x7c\x22\x0b\x91\xae\xb4\x06\x63\xde\x3f\x57\x72\xef\xda\xc5\xfe\x55\xab\xf1\x2c\xba\x1c\x6d\x31\x41\x96\xb0\xc1\xf6\x24\x81\xab\x29\x50\x89\xc3\x7c\x50\xbb\x66\x31\x46\x21\x7c\xbb\xad\x19\x8f\xc2\x36\x8b\xb0\x82\xe0\xe2\x28\x32\x08\xcc\xd2\x02\xec\xec\xe2\x6a\xd5\x51\x13\x11\x4e\xb5\xd1\xf0\xf9\xd4\x5a\x3b\x31\x8d\x91\x7c\x63\xab\xb1\x36\xd7\x09\x67\x1b\x27\x49\x3c\x55\xf5\xed\x09\x02\x78\x63\x62\x93\x8a\x5b\x90\xad\xd5\xd7\x91\x23\xbc\xe4\xf0\xd2\x2a\xf2\xfb\xe7\x82\x99\x2d\x7e\x4b\xc6\xbe\x8c\x40\x47\xd4\x27\x8c\xb3\xca\xa6\x08\xfb\xf4\xd1\x63\xbd\x01\xd1\x04\xff\x45\x08\x15\x9a\x50\x8c\xb7\x8b\xa7\x5c\x3e\x94\x1c\xd0\x5a\x80\xe1\x34\x13\x63\x8c\x72\x3d\xc8\x62\xb7\x5c\x87\x4e\x81\x3a\xb7\xc2\x01\x70\x71\xcb\x6c\x19\x77\xdf\x4e\xfe\xcc\xab\x0b\x77\x6e\xe4\xe9\x5b\xaa\x97\x2e\xb0\xb2\xab\xdc\x3a\xbf\xbd\x3e\x55\x7e\x09\x4f\x57\x9f\x8f\x48\x68\xbe\x55\x50\x08\x66\xc2\xa6\xb0\xf2\xe1\xea\xaa\x35\x8d\xf5\xb1\xd0\xdc\x26\x58\x1b\x8a\xfa\xa2\xb5\x57\x3d\x7a\x7b\x45\xf3\x7e\x9a\xf5\x8b\x91\x84\x70\xee\x1d\xd3\xe7\x13\x89\x7b\xbb\xf1\xa4\xad\x01\x35\x25\x95\x10\xec\xf2\x08\x3d\x84\xf2\x59\x52\xcc\x67\x13\xf6\x1f\x62\xf2\xc7\x50\x37\x87\x78\xbe\x9a\xad\x75\x27\xf2\xc6\xff\xf0\xb4\x7a\xda\xb4\xe5\xe8\xb1\x9d\xa8\x7e\x6b\xed\x2a\x3d\x53\xf5\xca\x01\xd0\x0a\x46\x7f\xfb\x29\xf2\x07\xea\x6f\x3e\x4c\x86\x79\x3f\x9f\x91\x1e\xda\xca\xfb\xe0\xd2\x85\x26\x80\xeb\x5a\x01\x5a\x88\xcf\x8e\x40\xb3\x17\x14\x25\x79\x1c\x4b\x1a\x62\xb9\xa4\xb0\x28\x5b\xbc\xd8\xec\xe0\x41\x51\xaa\x81\xfb\x2f\x35\x9d\x61\x8f\xe6\x22\xfb\x9d\xc8\x83\x90\xf0\x2e\xc1\x42\x2b\xfb\x1e\x44\x57\x7a\xff\xf4\x19\xa1\x74\x53\x90\x7e\x12\xe4\x91\x66\x3e\xfe\x89\x69\x07\x6a\xc7\x9c\x85\xa0\xa2\xb5\xf7\xe1\xf4\x64\xf3\x7b\xe4\x67\x8b\xc7\x48\xbb\xd6\xfa\x23\x73\xc9\x4d\xa4\xfc\xda\x43\xdf\xbf\xcb\x53\x31\x76\x8e\xf5\x01\x80\xda\xe3\x55\x3d\xb8\x74\xb3\x63\x47\xf3\xf7\x7f\x37\x82\x67\x62\x17\xf1\xc8\x1f\xf4\x52\x50\x92\xff\x18\xe2\x8a\x3e\x0b\xff\x13\xde\x03\x6b\x46\xf4\xf1\xf8\x3a\x7a\x34\x97\xe3\xc8\xdf\x03\x2f\x86\xc6\x5d\xd5\xd6\x35\xc2\xff\x66\x70\xdb\x6d\xa4\x74\x2f\x60\x8a\x6f\x02\xe7\x79\xfe\x7f\x62\xbc\xa7\x27\xe1\xe3\xbd\x0a\x2e\xd2\x55\x3f\x35\x4a\x5a\x86\x75\x7e\x5f\x8c\x51\x1f\xb9\xa0\xca\x6c\xdf\x24\x72\x81\x12\x08\x77\x1f\x6d\x62\x24\x82\xc5\x52\xde\xee\xe6\x57\x18\x5c\x55\x24\xba\xdd\xcd\x27\x8f\x23\x5a\x84\x2f\x3e\x6b\x11\xfe\x2c\x2d\x02\x4a\x71\x57\x8f\x51\x90\xbd\xcf\x87\x2c\xd3\x4d\xca\xf9\xe9\xe2\x58\x05\xb1\x78\xbe\xbe\xa4\x3f\x1a\xf1\x57\x74\x0d\x24\x45\xc0\x48\x5e\x2f\xa6\xc5\xc8\x86\x04\x52\xed\xa3\x55\x44\xb7\x90\x8d\x26\xb3\x2b\x51\x57\xfb\xed\xbc\x22\xa9\x0f\x6f\x05\x02\xf8\x71\x9a\x06\xfd\x78\x45\x37\x8a\xb5\x09\x15\x0f\x5e\xef\xbd\xfa\xf9\x68\xfb\xef\x28\x05\xfa\x79\xef\x1f\xaf\x4d\x83\x8d\x7f\x35\xbf\x3e\xfe\x57\xf2\xd3\xc6\x37\x27\xf7\x5b\x1b\x1c\x39\x74\xef\xf0\xed\xf7\x47\x3f\xef\xbf\xda\xdd\xfb\x07\xca\x8e\x20\xa3\x27\x0a\x79\x49\xd8\xbe\x8e\x81\x11\x1b\xce\xdc\x76\x8f\xe2\xd5\x13\x31\xd0\x13\xcc\x2b\x39\x5c\x24\x97\xa8\x8d\xad\x27\x87\xe0\xd5\x01\x84\x3d\xe0\xc6\xe2\xb3\xa8\x9a\xdb\x44\x19\xe2\x43\x90\x9a\xbf\xce\x41\x9d\x0d\x74\x33\xe4\x7b\xa1\xfc\xfb\xb3\xfe\x05\x80\xe3\xd4\xe3\x94\x1e\xfe\x1d\xc6\x68\x98\x9b\xf5\xa5\xf0\x83\x18\x6f\x00\x7d\xc8\xd7\xc9\x74\x16\x44\xa7\x2c\xbe\x42\x85\x3c\x74\x0e\x5d\x4c\xc1\xe1\x1a\x33\xb5\x4e\x52\xb0\xc8\x2a\xe7\xd3\x29\x9c\x71\x19\x9f\xc1\x3b\x63\x8e\x26\x26\x39\xcc\xa7\x64\x73\x31\x4b\x86\x19\xd0\xf0\x60\xcf\xad\x14\xfa\x41\x80\x52\xa1\x6d\xb8\xef\xc3\xc8\xda\x54\x65\x82\x18\x82\x14\x85\x09\x6c\x6e\x02\x49\x78\x87\xb9\x9d\x42\x67\x81\x79\x2f\x27\x13\x58\x87\x75\x25\x82\x2a\x48\xaf\xf7\x8a\x17\x9c\x83\x58\x79\x3a\x2c\x06\x6f\xae\x18\x0d\xa5\xf9\x50\xe2\x1a\x76\xf0\x10\x1c\x9c\x35\x1b\x49\xa3\xd5\x72\xe1\x39\x24\x2e\xed\xaf\x81\xa5\x04\xa0\x2e\x2b\x30\xc4\x08\x0a\x10\x84\x01\xa2\x31\xc2\x9c\x30\x4c\x1a\x06\x91\xb4\x55\x4a\x2f\x54\x24\xd9\xae\x12\x30\x6a\x8d\x09\x22\xa0\xad\x4d\x0a\x61\x00\x6c\x0f\xcb\x82\x5c\xd6\xc9\xd8\x04\xa3\xc7\x9a\x93\x62\xde\x57\x08\xce\xd5\x93\x1c\x67\xf7\x92\x9e\x0b\xd9\xd5\x53\xfa\x0a\x41\x59\xf5\xe1\x27\x57\x8f\x1d\xe9\xc6\x1d\xca\x7a\x09\x92\x23\x82\x0d\x34\x01\x61\x13\xe4\xd3\x8c\xb8\x61\x25\xfc\x64\x4d\x20\x32\x45\x0e\x57\xc3\x4f\xde\xde\xcf\x62\x71\xa2\x68\x2b\xe3\xaf\x8b\x8e\x46\xbe\xd1\xd6\x21\x08\x5f\x31\x7b\x12\xcc\x4e\x42\xf6\x9c\x4c\x7b\x38\x34\x66\x17\xe0\x03\xdd\x49\x5e\xc2\x45\x46\x13\xc7\xde\xa5\x39\x70\xc5\x25\xee\x60\xd2\x13\xc3\x87\x1e\x5e\xd8\xf4\x7d\x9a\x0f\x31\x72\xe1\xf9\xb0\x38\x0d\xbc\xa2\x1b\xcc\x0c\x13\x12\x71\xa1\x24\x48\x0b\x32\xce\x67\x68\x08\x81\x97\x70\x8a\x2e\x32\xaa\x29\xd6\xec\xd0\x88\x8f\x98\xc7\x44\x3e\x07\x1f\xed\xa9\xb3\xa8\xee\x50\x6e\x40\xdf\xa9\x62\x49\x7a\xed\x96\x53\xb7\x09\xce\x73\x5f\x68\x79\x9e\x5f\xbd\xb2\x09\x7f\xac\xb5\x88\x61\x78\xff\x6e\x16\x79\x22\x4b\x68\x18\x5e\x85\x34\x21\x25\x6d\x72\x09\x2f\x07\x44\xd2\x95\x34\x5d\x6d\xa2\xf3\x4c\xd5\xc6\xbd\x06\x71\xc6\x31\x4b\x2e\x77\x66\xe2\xc6\x5a\x1f\xe3\xa9\xe3\x60\x1f\xe7\xda\x93\x69\xf1\xa1\x79\xc9\xd6\xf6\x8c\x74\x1a\xdc\xce\x5f\x68\x0f\x74\xcb\xb3\x7a\xe1\xb5\xab\xa2\x39\xa9\x1d\xaf\xec\x5e\x59\x67\x4c\x63\xa6\x65\x2b\x75\x61\x1d\xa5\x69\xb8\x57\x9e\xc9\xcf\x82\x42\x2f\x5c\x61\x7d\x3d\x33\x4a\x0b\x87\x47\xad\xa5\xb9\xa4\x2b\x17\x0c\x67\x6a\x1e\x2b\xd3\x25\x57\xb0\x6d\xd6\xf1\x1c\x8f\xe0\x8e\x79\xce\x66\x14\xa4\xde\x9e\x03\x3b\xb1\x7c\x5c\x19\x89\x2f\xe0\xb8\x13\x16\x57\xd8\x68\x69\xe6\x85\xec\x2b\xc6\xe6\x8a\x85\x46\x76\xfa\xa8\xc3\x18\xbd\xe3\x5e\xbf\x20\xd6\x23\x52\xd2\x70\x41\x4c\x35\x33\x70\x0c\xab\x56\xbe\xcb\x27\x44\x88\x5c\x14\x43\x17\x7a\xb3\x64\x9b\x5a\x40\xbc\xf4\xce\x60\x40\x5d\x53\xec\x60\xe5\x33\x66\x46\xe4\x3d\xa0\x68\x43\x9c\x6c\x99\x6a\x03\x55\xc1\xeb\xd8\xb6\x31\x1b\x20\xc2\x35\x39\x05\x10\x2d\x22\x00\xd9\x5c\xd7\xd0\xd1\x14\x15\x1c\x81\xb4\x25\x35\x24\xa5\xc7\x9c\x72\x74\x6d\x30\x11\xed\xa8\x55\xa1\x9d\xf3\x02\xcf\xe2\x4e\xa9\xef\x6e\xb3\xfc\xc5\xd3\x0b\x8f\x92\x85\x48\x9d\x70\xd7\x14\xd8\x40\x4e\xe7\xb6\xc8\x3b\x85\x6a\x63\x54\xdb\x13\x15\xaf\x13\x97\xe0\xf5\xbc\xbc\xe0\xf4\xa3\xff\x39\x27\x85\x35\x03\x23\xdb\x5c\x8f\xdb\xa8\x10\x9e\x3e\x2c\x67\xcc\x9a\x40\x04\xa2\x99\x23\x16\x2c\xa5\x88\xc9\x30\xc5\xec\xf7\x6b\xb0\x76\x07\xda\x07\x16\x3d\x9f\xf9\xc0\x24\x0e\xf2\x20\x2f\xfb\xe9\x14\x9d\xed\x32\xd8\xec\xa6\x1d\x17\xe4\x76\x9b\x4c\x73\x0e\x29\x5d\x16\xc0\xc3\x1a\x5a\x70\xda\xd2\x92\xc5\xa5\x0b\x62\x17\xad\xc3\xa1\xca\xfd\xb8\x85\x15\x9a\xdc\x8f\x5b\x28\x27\x9c\xce\x8f\x8c\x19\xcf\xb2\x19\x70\xda\x7f\x07\xa2\x70\x1a\x79\xc7\x6b\xd8\xf8\x8f\x87\xf0\x90\x45\x68\x79\x50\x47\xdd\x85\x22\x7d\x92\xcc\xc7\xbb\x49\x43\x41\x68\xc5\x24\x11\xee\x64\x13\xa6\xa6\x88\xde\xe7\xf8\x18\x39\xea\x07\x17\x50\x62\x22\xc1\x4b\x84\x8e\x34\xee\x89\xf2\x4f\x39\xc0\x41\xc6\xc9\x2c\x54\x94\x8d\x8a\xbd\x20\xea\x1c\xff\x52\xe4\xe3\x66\xa3\xa1\x42\xb4\xf8\xfc\x96\x19\xec\x6e\x01\x67\x03\x1d\x43\x24\x08\x12\x8e\xf1\x6b\xca\x2a\xf9\x0d\x46\x06\x96\x51\x39\x7f\xeb\x58\x78\x55\x35\x5e\xfb\x42\xde\xbf\xff\x4b\x18\xb7\xc3\x55\x43\x9e\xcc\xb6\x39\xfe\xe5\xc4\x97\x38\xb9\x32\xb8\x90\x2e\x5c\x95\x92\x42\xc2\x7f\x35\xd5\x9a\x95\xdd\x6d\xd9\x74\x5e\xd2\xd0\xed\xf1\xd3\xe4\xbe\x82\xa3\x65\x7a\x11\x38\x5b\x6b\xd1\xde\x43\x51\x52\xac\xa1\x6a\xf9\x71\x81\xab\x93\xe4\x8e\x7b\xbf\x16\x21\x2c\xff\xce\x34\x88\x07\xe9\x26\xf4\xe4\xb1\x79\x31\xdc\x68\x0a\xac\xb3\x5e\xf4\xfb\xf3\x09\x30\x4f\x04\x83\x2e\x57\xc7\x3b\xfd\xbe\x73\xec\x6a\xa3\x68\xf9\x73\x77\x8d\x42\x7c\xe0\xd6\x33\xc4\x96\x24\xfd\xa1\xc7\x07\xdf\x12\x05\x85\xcf\x1b\xb9\x46\x85\x74\x1a\x52\xb3\x01\x82\xcb\x20\x10\x91\x79\x64\xbc\x20\xa3\xf5\x04\xc1\xfd\xa7\xc9\x43\x35\x9e\xdb\x4b\x06\xe1\x3f\x0f\x61\x36\xe3\xdb\xb3\x4b\x98\x17\x53\x2f\xdb\x20\xe1\x48\x62\x75\x1b\xb1\xe8\xbb\xaf\x58\x4f\x20\x7b\x54\x2b\x2b\xb5\x66\x54\xd6\xb5\x56\xd1\x47\x60\x28\x32\x29\x26\x98\x2b\x6b\x80\xd8\xd3\x60\x2e\x7e\x98\x73\x9b\xa5\x7e\x6c\x5e\x02\x4c\xd9\x3a\x00\xe1\x9a\xc0\x23\xea\xe1\x23\x79\xa9\x05\x24\xd9\xd3\xa7\xd5\xfd\xb6\xcc\x95\x5b\xb6\x01\x99\xfe\x63\x6b\xf4\x7d\x34\xac\xc8\x95\x90\x18\x67\x1a\x44\x8c\x2b\xb9\x61\xff\xf6\x54\x7f\x8a\x19\xcb\x69\x85\x9e\x2a\x67\xb8\x32\xd3\x3d\x39\x13\xfc\xb0\x58\x76\x1a\x42\xd2\x23\x7b\x4c\xb4\x94\x65\x99\xff\xa2\x82\x4f\xd5\x82\xaf\x8c\x66\xe1\x1a\x2d\x1c\xb1\x5d\x1b\xe6\xeb\x5d\xb3\xa8\xb3\x08\x3e\xff\x25\x6b\xc5\x84\x48\x09\x85\x63\x20\x47\xca\x41\xbe\x3a\x9f\x62\x32\x08\x72\x00\x33\x0f\x19\xd4\xcf\x21\xdb\x68\x49\xf0\x6c\xe8\x79\x47\x06\x71\x46\x14\x5c\x22\x16\x92\x00\xf3\x34\xcc\xc2\xc4\x99\xf5\xca\xb8\x62\xc8\x29\x0d\xfc\x84\x37\x4c\xbb\xd4\xa4\xdd\xe4\xee\x5f\x86\xdb\x04\x2e\x28\x98\x9d\x85\x89\x70\x17\x12\x7f\x35\xb9\x46\x34\x0b\x8a\x15\x70\xc8\x50\x45\x22\xf5\xe7\x88\x39\x22\x63\x5c\x2a\xef\x50\x12\x06\x16\x7d\xdc\x56\xde\xa1\x20\x59\xd1\xc7\xbf\xb9\xbc\xe3\x16\xdb\x43\x6b\xd7\x5e\x79\xe5\x43\xa1\x41\x4c\x5a\xf0\x11\xc3\xe1\xd5\x92\xf3\xd7\x31\xe4\xe3\xab\x8a\x79\x34\x82\x6a\x5c\xcc\x46\xc3\xc6\xad\x0f\x0e\x5d\x1e\x71\xd6\x3f\x0b\x92\x65\x34\xbe\x06\xe8\xdf\xd0\x7d\x62\x36\xa1\xb4\x52\x70\xc9\x5c\x0b\x87\xe0\x5d\x49\x12\x71\xd4\xf6\xcc\xc7\x86\xe5\xcc\xc3\xd3\x63\x4e\xd9\x06\xec\x33\x30\x12\x1c\xde\xd5\x3c\x95\xe4\xa9\xc5\x27\x98\x03\x27\x20\x2a\x41\x83\x5d\x89\x29\xa3\xc0\x54\xce\x49\x72\x98\x71\xfc\xf4\xe0\x58\x35\x5b\xd1\x33\xb4\xf2\xa2\x5a\xdc\x4b\x49\xf8\x2e\x25\x11\x4b\x9c\x87\x90\x13\xe4\xf1\x06\xad\xe3\x07\x4c\x8e\xdb\x5e\xbd\x24\x08\xb8\xfc\x9c\xb8\x8a\x3b\x68\xdb\xaa\x64\x16\x5b\xa7\xe1\xc4\x8d\xbe\x81\x4a\x73\x61\xca\xc9\xb8\x76\xa9\xbb\xf9\xf8\x49\xbb\xa2\x43\xea\x6e\x7e\x81\x19\x29\x7d\x4d\x51\x77\xf3\x6f\x5f\xc4\x22\xb8\x57\x34\xa0\x7f\xfb\x9c\x6e\xf2\x0f\x50\x76\x92\xc2\x5f\xa5\x25\x3d\x98\xa2\x72\xa3\x46\x7f\x89\x29\x41\x7d\xe5\x1e\x65\x09\x55\x49\xf4\x18\x34\x3a\x1a\xa3\xbc\x00\xac\xa7\xf0\x92\x23\x21\xd0\xf3\x73\xa0\xf6\xda\x54\xd3\x05\x36\xc7\x5c\xe1\x90\x05\x7f\x3a\xca\xc7\x86\x80\x41\x47\x74\x8e\x16\x02\x3a\x14\xd5\xbe\x07\x7a\x16\xa0\xf0\xcd\xa7\x1c\xbd\xac\xd3\x2b\x42\x13\x69\x09\x46\x3f\xa0\x6a\x03\x68\x94\x91\x1d\x32\xe0\xb3\xff\xb6\xf3\xf5\x9c\xa4\xfd\x77\x29\xa5\x5e\x87\xad\xb1\x51\xa8\x47\x1a\x8f\x91\xab\xe9\x05\xb8\x8e\xde\x93\xb6\x0c\x13\xc3\x26\x4d\x89\xe8\xd3\x4b\x4f\x52\x3a\x9c\x9a\xf9\x76\x85\x8f\xa5\x38\x5b\x0b\x66\x5c\xc3\x28\x09\xa6\x86\x9d\xdf\xa5\x28\x7f\xf2\xf1\xd9\x70\x9e\x8d\xfb\x2e\x5b\x03\x0d\x94\x1e\x4b\xd2\xe3\xdc\x4b\x7a\x6f\xb2\x72\x52\xc0\xe9\xd4\x8b\x42\xe8\x10\x58\xcb\xa9\xbc\xc0\xbd\x43\x88\xee\x91\x79\xb5\x38\xeb\x0b\xae\x0f\xf9\x69\x00\x70\x71\xf7\x2d\x38\x2b\x6f\xc9\xb9\x60\x64\x85\xcd\x1c\x63\xc0\x28\x15\xef\x54\xfb\x31\xc4\x8f\x16\x48\x85\xd7\x12\x3a\x48\xcd\x5f\x63\xe3\x27\x6f\x8a\x6b\x64\xa5\xb9\x5a\xa5\xc3\x48\x9d\xa3\x74\xb2\xb8\xc2\x1e\x10\x78\xdf\x67\xe9\xfb\x25\x80\x2a\x49\x7d\x63\x03\xc2\x38\x18\x8b\xeb\x50\x92\x3f\x97\xd3\xba\xb6\xe2\xb6\xb9\xf1\x57\xe6\x98\x97\x8b\xab\xbd\x2c\x4e\xcd\xfd\x3e\x4c\xcf\x0c\xde\x74\x79\xab\xfd\xea\x6b\x27\xd1\x37\x20\xbe\x15\x36\x59\x71\x90\xe8\xf7\xcb\xcf\x98\xf7\xf7\xc7\xbc\xd1\xd3\x78\x1b\x67\x55\x3f\xd3\x74\x60\x4c\xe2\x67\xa1\x66\x2b\x8d\x30\xdb\x74\xa4\x8d\x2a\x95\x56\x36\xb1\xf4\x4b\x43\x35\xd2\xa0\xfd\x86\x91\x0a\xd6\xde\x83\x52\xba\xb0\xb6\xa7\x92\xf1\x15\xbe\x4b\x37\x0b\x5f\x18\x74\x81\x57\xb9\xbd\x61\xe8\xfe\x1c\x3b\x5e\xb1\xb5\x62\x79\x01\x79\xae\xb0\x33\x70\xbb\x7a\xaa\xc6\xd3\x09\x4b\xb9\x1b\x97\x27\x9d\x7d\x3e\x47\x38\x2b\xd8\xb5\xae\xf5\x70\x3a\x37\xcf\x13\xe9\x69\x28\x74\x13\xdf\xd4\x62\xfc\x52\x55\x76\x17\x39\xe1\x68\x07\x06\xaf\x63\x5e\x84\x63\xa6\x55\xbd\x31\xc3\x0c\xb0\xf9\xc1\xdc\xe6\x28\xaf\xa9\xf0\x9e\xcc\x10\x92\x13\x62\xf1\x79\x8c\x78\xa8\x56\x1d\x23\x57\xfe\x83\xc6\x88\x24\x2a\xae\x2e\x59\x82\x64\x03\xca\xfd\x0f\x8f\x02\xba\xe8\xe1\x40\x4e\xe4\x64\xc7\xae\x88\xd8\x73\xb8\xfd\xe9\xaa\xbf\x7d\x39\x07\xf8\x2e\xa6\xc3\x11\x44\xb1\x10\xc1\x14\xe8\xd5\x48\x1a\x8f\x39\x66\xa7\x9c\xff\xa3\xcd\xc6\x33\xa2\xd6\xa0\xe0\xa0\x30\xa7\xf5\x21\x4c\x8a\xe0\xf5\x70\x7d\x21\x28\x22\xf3\xc2\xf4\x7b\x6e\x78\x61\x4a\xc1\x4f\x8f\x39\x3c\xbc\x86\x30\x39\x00\x3b\x77\xb8\xaf\xaa\x9a\x7d\x73\x31\xe4\x0c\xc8\x44\x51\x80\xc6\xcb\x91\x0c\xe6\x60\x83\x0f\x6a\x1e\x7a\x7b\x55\x7a\xda\x51\xf1\x5e\xec\x7e\x10\x9c\x4d\xfd\x41\xb0\x84\xc7\x42\x3b\x27\xd3\x15\x06\x7b\xc2\xd9\x00\xfc\x33\x32\x59\x0a\xc7\x6b\xd8\xab\x31\x21\x44\xf0\x7f\xc5\xb4\xbb\xf3\x92\x01\xa2\x01\x94\x9a\xaf\x5d\x0a\x6e\x1a\x11\xde\x88\x0c\x46\x9f\x04\x73\xd3\xfa\x86\x5e\xa1\x71\xf5\xfc\xbb\xda\xeb\x54\x85\x3f\xb8\x93\x98\x87\xff\x3a\xc8\xcb\x8f\xd2\xa5\x21\x66\xa4\x83\x85\xb0\xc9\x61\x43\x81\x52\xfd\x70\x38\xbd\x3f\x38\x49\x02\x1d\xe9\x7f\x0f\x07\x23\xa9\x22\x20\x80\x25\x1f\xc0\xe4\x15\xfe\x6d\xd7\x5a\x2d\x84\xb3\xa7\xb9\x77\x8d\x0f\x8a\x39\x03\x23\x10\xec\xc2\x49\x33\x9d\x95\x82\x1b\x65\x63\xb9\x15\xd8\x49\xfd\xea\x13\xc4\x1d\x3e\x0c\x74\x33\x5c\x30\x20\xef\xb3\x92\x3d\x45\xae\x5f\xe5\x4a\xe2\x0c\xe3\x5f\xf7\x77\x9d\x93\xab\x9d\xa9\xb6\x5a\xf7\x76\x13\x5d\xe7\x6a\x2f\xba\xd6\x15\x35\x15\x38\xc3\xc0\xa2\x8c\x9b\x37\x12\xb2\x18\xab\x42\x38\x1a\x2c\xf4\x6b\x85\x0e\xe3\x2a\x0a\xf8\x75\x7c\x44\x77\xea\x47\x64\xe8\x7c\x35\xa0\x55\x5b\x99\x79\xb8\x51\x88\x73\x0c\xc7\xc9\x4b\xed\xdd\x03\x89\x15\xfd\x0d\xec\xc4\x7a\x92\x83\xd3\x93\xf2\x5e\x89\x0c\xdf\x8a\x08\x2e\xf3\xf1\x56\x75\x32\xb8\x36\x1d\x12\xb5\xf9\xeb\x8c\x25\xde\x98\xc2\xb3\x9b\xa0\xaf\x35\x27\x3e\x4d\x13\x06\x42\x47\x58\x46\x74\x89\xb8\xd3\x6f\xe8\x59\x5e\x2b\xf8\x14\x68\xe7\x05\x24\xa0\xa2\x09\x5e\x5e\x5c\x25\xbd\xe2\x72\x9c\x4d\x77\xad\xf8\x0f\xe9\xa8\x91\x39\xd4\xe0\x41\xa5\x53\x78\x83\xd3\x8b\xd6\xac\x0e\x8a\x7e\xa5\xe7\x8e\x07\x4c\x3b\x1f\x98\xda\x5a\x81\x43\xc3\x36\x1f\x3b\x62\x9c\x9e\x67\x97\x70\x84\xe0\x13\xc9\x48\x7e\xc4\xe9\xd6\xba\x00\x10\x84\x4b\xbf\x52\xb8\x27\x70\x08\xcd\x23\x50\x44\x36\x66\xc9\xb9\x9f\xab\xad\x41\x2c\x17\x5f\x64\x38\x80\x2a\x24\x77\x48\x75\xac\x7e\x5d\x66\x85\x5c\x16\x2f\x50\x83\x9c\xa9\x60\xfa\x3c\x22\x5b\x4c\xc3\x88\x1f\x03\x97\x98\x85\x5a\xe1\x9c\xbd\x73\xf7\x8a\x75\xd7\xa0\x71\x4c\x73\x32\x34\x81\xe4\x4b\xa3\x74\x6c\x78\xe8\x81\x43\xca\xe5\x2a\xf7\x00\x33\x39\x42\xba\x61\xec\xee\x59\x40\x94\xed\xef\xe2\x30\x40\x26\x27\x4e\xad\x44\xfe\x61\x13\xd3\x71\xa4\x01\x0c\x97\xaa\xdb\xfa\x43\xa0\x1f\x4c\x83\x08\x75\x4a\x11\x12\x8a\x61\x36\x10\x24\xea\x08\x89\x8e\x23\xa5\xda\x6a\x29\xa3\xd8\x92\x64\x87\x34\x44\xec\x8e\xb3\x3f\x27\x0d\x04\x82\x9f\x1a\x5e\x31\x6d\x2c\x4d\x5c\x17\xf8\x1b\xff\x14\xcf\xa3\x9d\x49\x06\xc4\xcb\x6d\x67\x82\xb4\x94\x7b\x01\x96\xce\x03\x3b\xf3\xe7\x81\x9f\x1a\x5e\xb1\x1e\xa7\xfb\x1c\xce\x82\x66\x89\x15\x42\xe6\xa2\x63\x1f\xca\xcc\x51\x7b\xbb\x79\x39\x01\x8d\x73\x56\x36\x71\x59\xda\x04\xb7\x2d\x3b\x80\xe3\x17\x99\x6b\x40\x49\x1e\x3f\xc0\xc4\x1d\xd0\x6c\x2b\x5a\xfe\x10\xca\x11\x9e\xaf\x30\x0b\xea\x2d\x12\xa9\x46\xe9\x52\xcb\x4c\x07\x3c\x57\xf7\xd1\xe6\x57\xed\x18\x5b\xd5\x7d\xf4\x78\xb3\xed\xb3\x40\xdd\x47\x4f\x50\x8e\x1a\xe3\xa4\xba\x9b\x94\x1c\x33\xe0\xd5\xbf\xfa\xcc\xab\xff\x01\xbc\xba\xb7\xa5\x8b\x84\xa3\x2f\x73\xb0\x32\xa8\xb0\xaf\xf4\xd9\xb2\xb0\x72\x0c\xcc\x2c\x5e\x5f\xa4\x25\xb2\x98\xb6\x56\xf3\xd7\xd3\xf9\xe9\xa9\xb9\xca\xc4\x95\x41\xa6\xc8\x89\x39\xa1\xf2\xfb\x5a\x49\x5a\x89\x3d\x05\x3d\x7b\x7a\x99\x80\x02\x3d\x1d\x96\x84\x4c\x61\x6e\x42\xa6\xf6\xd3\x39\xec\x39\x09\x22\x01\xf3\x27\x48\xc7\x3b\x49\x5d\xc8\x51\xab\xa1\xac\x21\xdd\xf4\x7c\x38\x67\x3e\xb6\x4d\x1f\x48\x44\xe6\x7f\x02\x89\x94\xff\x05\x1e\x03\xd2\x18\xef\x8d\x07\x75\x45\x87\x60\x26\x57\x57\x48\xa9\x5f\x83\xd2\x31\x44\xa2\x7d\x99\x8d\xe7\xc1\xf7\xc9\x95\xff\x61\xee\x83\xdd\x2d\xe6\x66\x55\xab\xc3\xdc\x9d\xa6\xe7\x95\x0f\xe1\x80\xe9\x9b\x65\xe7\xf5\xd7\x0f\xf9\xac\xf2\x51\x71\xd5\xea\x2b\x90\x96\x95\x8f\xd5\xf9\xef\x9a\xd3\xe1\x7d\xd8\x83\xbd\xf0\xbe\xbc\x30\x74\x53\xe9\x7d\x41\x31\xa3\xf7\xe5\xbb\xec\x6a\xd7\x10\x59\xe1\xb7\xd7\xe0\xac\x12\x7e\x7c\xeb\x77\xf8\x7d\x91\xfa\xd3\x47\x3c\x54\x81\x86\x5f\x5f\x16\xc1\x4c\x85\x2a\x8a\x7c\x0c\xe7\x8f\x5f\x83\xbe\x5f\xa7\x65\xb0\xe3\x6f\x0c\x12\xf2\xa1\x1d\xf6\xa7\xc5\x70\xe8\x7f\x92\xc0\xc4\x91\xa3\x79\x38\x3f\x1d\x05\x9b\x04\xa9\x82\xab\x4b\x76\x54\xcc\xfb\x17\x3b\x10\xf8\x7b\x58\xfd\x1e\x1e\x09\xfc\x58\x99\x3d\x7e\xad\xee\xe9\x8f\x17\x99\xc0\x5c\xbb\x6e\xd5\x49\xee\xf8\xba\xb9\xcb\xd8\xf5\x7f\x02\xb0\x0a\xee\xe8\x56\x3f\xd5\x3c\x5b\x5e\x77\x5a\xf8\xcb\xe8\xa9\xbb\xf9\xe5\x13\x7c\x54\x9e\xfc\x31\xce\x87\xf8\x10\x54\x5f\x8f\xed\x09\xa6\x51\xe0\x92\x76\xf2\x03\x85\xe5\x4a\x1e\x75\x1e\x18\xaa\xdc\x94\xdc\xe5\x22\xc0\xa7\x06\x84\xe4\x8d\x03\x1e\x8d\x12\x55\x82\x1d\x36\x20\xf9\xec\x43\x3f\x9b\xa0\xca\x02\x08\xd3\x61\x0e\x3b\xeb\x12\xb8\x32\x14\x7c\xf3\x24\xa3\x5d\x71\x0a\x74\x2d\x26\xaf\x98\x5c\x89\x9e\x9b\x2b\x26\xa8\x2b\x41\x0d\x10\x79\x36\x5d\x5e\x5e\x76\x52\x1c\x6c\xa7\x98\x9e\x6f\xf0\x5b\x57\x6e\xf0\xe3\xb6\x6e\x06\xcc\x0d\xde\x8e\x87\x66\x7d\xe4\x51\x40\x95\x4e\x3a\x41\x51\x0f\xa8\xc5\x86\x06\x7b\x83\xa4\xea\xdc\x3c\x71\x03\x4a\xd4\x87\x39\x4a\x31\xca\x50\x59\x9c\xcd\x2e\x0d\x9b\x83\x4a\x31\x10\xe5\xa1\xb5\xa3\x5e\x2f\x19\x9e\x99\xb5\xae\x50\x60\x6e\xd9\xbb\xdb\x87\xc9\xfe\xe1\xdd\xe4\xf9\xf6\xe1\xfe\x61\x1b\x80\xfc\xb8\x7f\xf4\xed\xc1\xdb\xa3\xe4\xc7\xed\x37\x6f\xb6\x5f\x1d\xed\xef\x1d\x26\x07\x6f\x92\x9d\x83\x57\xbb\xfb\x47\xfb\x07\xaf\xcc\xaf\x17\xc9\xf6\xab\x7f\x26\xdf\xed\xbf\x32\xa4\x56\x96\x63\x60\x5f\x76\x72\x83\x61\x82\x2a\x26\x27\x92\x00\x35\xea\x7a\x08\x12\x86\x8a\x95\x79\x7d\x33\xb5\xf1\xf9\x1c\xd4\x6b\xe7\x20\x45\x1a\x33\xef\x80\x79\x0b\xd0\x17\x0e\x5c\xa0\xee\x19\x2a\xc1\xdc\x4f\x0e\x74\x55\x99\xd7\xc2\x47\xf9\x7b\x94\x07\x55\xdc\x35\xe9\x89\xbe\xa9\xc7\xa3\x9c\xde\xb7\x13\xb3\x8a\x59\x3a\x92\x80\x70\x18\x8d\x16\x05\x40\x43\xee\xae\x93\xec\x8a\x99\x37\xa4\x0a\x66\x0b\xa7\x7e\x1f\x05\xdc\x32\x79\x00\x65\xa8\x6b\x64\xa1\xcf\xc0\xfa\x68\x06\x99\x33\xdc\xb3\xeb\x4d\x20\xcc\x1b\x4d\xdf\x39\x8f\xab\x68\xe2\x06\xf3\xa9\xc8\x00\x89\x46\x48\x26\x70\xdf\xeb\x0c\xa9\x3c\x59\x1a\x11\xe3\x08\xcc\x05\xbe\x25\xe9\xb0\xe9\x5d\x26\x66\x4e\x4d\x8d\x14\xcd\x32\x14\x34\x6e\x0c\xee\x61\x8e\x47\xe7\xbc\x93\x34\xfa\xf0\xa8\x62\x4c\xe0\x86\x95\x18\x36\x02\x38\x82\x2d\xae\x13\xb0\x42\x40\x7b\xf1\x1d\xf9\x43\xca\x42\x59\x9a\xc8\xe0\x28\x2e\xb6\x98\xa9\xf5\xc8\xf2\xb7\xc7\xe9\x0e\x5c\x8c\x2d\x9a\x84\x12\x8d\xd1\xa4\xdb\x6e\xec\x6d\xdb\xb9\x27\xe1\x22\x89\x84\x21\x2c\xbd\x2d\x51\x91\x6e\xe3\x15\x9a\x11\xb8\x6d\x1b\x6a\xd2\xe3\x7f\x75\x9c\xa6\x11\xbe\x19\x76\x90\xbe\xb5\x2a\x77\x45\xb5\x6e\xdc\x9b\xb2\x3f\xad\x38\xd5\xcb\x24\x66\x33\x83\xb1\x3c\x29\x9f\x9b\xa0\x2b\x6b\x36\x8a\x31\x58\xe6\xc7\x96\xee\x23\xe7\x36\xc8\x6e\xd4\x4b\x75\x4e\x6b\x15\x83\xc6\x65\xb7\x85\x49\xe8\xcf\xd7\x45\x5f\x17\x5e\x94\x9b\xdf\x97\x3b\x4b\x2f\xcc\xad\x4c\xb5\x6b\x0d\xb5\x1b\xdb\xb3\x19\x20\x6b\x7a\x1c\x87\x76\xaf\x97\xec\x33\x85\x7d\x69\x78\xb9\xb3\x1a\xc2\x14\x51\xc2\x1a\xeb\xab\x33\x9f\x00\x59\x13\x39\x2b\x40\x19\x4c\xe5\xb1\xc6\x37\x24\x00\x68\x75\x2c\x86\x87\xcc\x40\x3b\x80\x21\xcf\x59\xca\xef\x0c\xf9\x5b\xa1\xbb\x59\xed\xe5\xf1\x9e\xa5\xe8\x6d\xbe\x15\x5a\xc2\x80\x77\x7f\x14\x56\xf2\x3a\x5b\x70\x81\xe5\x42\xb1\x81\x82\xdf\xff\xf5\x02\x32\x56\xba\xbf\x81\x5d\x5b\xcc\x38\x2d\x34\x3a\x7b\xfc\xe0\x73\xd8\x8d\x3f\x53\xc6\x62\x95\x60\x8b\xad\x1d\xa8\xda\x1b\x52\x6d\x5f\xc5\xcc\x17\xbc\x0a\xbe\xdd\x03\x16\xbd\x9d\x41\x42\x9e\xba\x86\x58\x6a\xa5\x35\x4e\x44\xb9\x3f\x46\xe1\xb9\x6a\xe4\x97\x49\x47\x86\xce\xdb\x33\x4f\xdc\xb6\x2d\x1c\xf8\xad\xaa\xe5\x37\x0a\xa0\xc1\x47\x6d\x9f\x0d\xd6\xcd\x0a\x81\x89\x17\xd0\xde\x3e\x95\x5a\x5a\x52\x53\xbe\x3c\x4f\xc7\xef\x82\xfc\x74\x16\xca\x7f\xce\xb3\x79\x66\x49\x5d\x9d\x28\x24\x55\xf3\x30\x1b\x9a\x4f\x81\xcf\x60\x09\x2d\xea\xc1\x99\x3d\xb9\x4c\xf3\x19\x5b\xd5\x61\xbb\x4a\xdd\x0c\x4d\x4b\xe9\xa8\x6f\x38\x2b\x8b\xff\x8b\x3d\x4b\xc6\x5f\x9b\x38\x4f\xf7\xc1\x33\x83\xce\xa6\x20\x50\x2f\x29\xf8\x1e\x3e\x87\xa2\x08\x4f\x26\x45\x31\x84\x68\x54\xc8\x6b\x4d\x80\x76\x87\x59\xcf\xc2\xb0\x17\xcf\xe4\x9d\x24\x98\x87\xbe\x6a\x96\xf3\x1e\xd9\x51\x13\xa3\x63\x4e\x6b\xfe\x3e\x9d\x65\x6e\xe0\x34\x15\x37\xc8\xed\xf1\xe0\x0d\x8d\x4c\x87\xe3\xce\x1c\x9d\x05\x6f\x62\xa6\xc9\xae\x08\x18\x41\x6f\xea\x18\x76\x82\x2a\xd6\xf1\xfe\x35\xdb\x1f\xc2\x35\xe4\xbb\x24\xa9\x56\x4e\x33\xb0\x51\x84\x94\x6a\x60\x68\x2f\x53\x81\xad\x51\xda\x67\xec\x9f\x80\xf0\x15\x7c\x1a\xbb\x5d\xa8\x5a\x50\xb5\x5e\x14\x64\xab\xc7\x73\x71\xfa\x32\x0f\xd4\x5f\xff\xea\x81\x0e\x27\xe1\x5e\x97\xea\x02\x2c\x6a\xa7\x35\xc1\xcb\x16\x2a\x2b\xf7\xc9\xcc\x8d\x46\xda\x0e\xbb\x12\x05\x02\x52\x34\xa4\xca\xcf\xcb\xd7\xf6\xd4\x34\x95\x2e\x9a\x4a\x81\x3e\x31\x0f\x1b\x60\xb1\x0e\x1f\x42\x6f\x11\x6c\x5a\x48\x39\xc1\xeb\x49\x6f\x9f\x13\xc9\x7d\x8b\xe6\x91\xbd\x6e\x72\x2c\x32\x80\x13\xcf\x4e\xd6\xa6\x55\x1c\x16\xe7\xe8\xa5\x3d\x9b\xa6\xc0\x7d\x82\x40\xd7\x5c\x49\x43\x87\x52\xc6\xc6\x8b\x3c\x9b\xa6\xd3\xff\x9f\xbd\x37\xff\x6f\xe3\x48\xf2\x05\x7f\xe7\x5f\x51\xf2\x7b\x7e\x00\x64\x08\xd4\x61\xbb\x6d\xd0\x6a\x2f\x4d\x52\x36\xa7\x2d\x51\x2b\xd2\xf6\xcc\x6a\xf4\x88\x22\x50\x20\xab\x05\xa0\x30\x28\x80\x14\x6d\x71\xff\xf6\xcd\xb8\x32\x23\xb3\xb2\x70\x90\x92\xdd\xb3\x4f\xfa\xcc\xb4\x89\xca\xfb\x8a\x8c\x8c\xe3\x1b\xfd\x8b\xeb\xe4\xdc\xf0\x1a\x93\x24\x1f\x58\xb7\x72\x29\xa9\x78\x56\xc4\x21\x2e\x46\x97\xfa\xc4\xf9\x3d\x72\xa7\xce\xde\x69\x08\x5c\x8c\x04\x4d\x67\x6c\x3a\x34\x7c\xcc\xc0\xaa\xcc\xa0\x36\x56\xb7\xfb\x5f\x3b\x3c\x96\xec\xe4\xaa\x40\xf9\xd4\x8a\x6c\x4e\xbd\x02\xf3\x7a\x5b\xa7\x08\xec\x25\x29\xb9\x1a\x41\x2f\x81\x5b\x53\xa6\xb8\x68\x20\x6b\x6e\x9a\x7b\xc0\xad\xf9\x2e\x00\x58\x09\x43\xca\x88\xcc\x9d\x8d\x82\x53\x70\x60\x19\xe6\xa8\xf0\x36\xfd\x1d\x82\x7b\x84\x23\xc1\x62\x1c\x4c\xc4\x04\xc3\x09\x8e\x46\x1c\x4c\xae\x8f\xf1\x97\x41\xa2\x2f\x94\xe9\xc0\x2b\x03\x07\x1a\xed\x5d\xe9\xd9\x71\x91\xb1\xf3\xbf\x1f\xe9\xd1\x45\x05\xed\x79\x96\x21\x3d\xf7\x76\x68\x0a\x52\xb5\xff\xba\x69\x3b\x04\x6b\x24\x84\xad\x6e\x72\xff\x86\xaa\x4a\x92\x57\xbc\x3d\x3b\x10\x61\x6b\xa2\x4d\xa0\x78\x64\x28\x5b\x33\x19\xda\x1c\x24\x94\x20\x06\x7d\x88\x1c\xa9\x4c\xcc\x9a\x42\xeb\x17\xda\xf3\xc8\x39\x03\x8f\x00\xac\xa8\x99\x25\xbc\x80\x68\x8a\x7c\xea\x2b\xc3\xb4\x2a\xcd\x9e\x7d\xeb\x48\x4b\x47\x53\x62\x57\xda\x6e\xe6\x31\xee\x1e\xd8\x3d\x71\x9b\x68\x14\x3d\x5d\x9c\x99\xbb\x10\x9e\x45\x63\x76\x06\x47\x2f\x45\x67\x23\x27\x15\x72\x70\x45\xa8\xc4\x46\xae\x8c\xbd\x00\xcb\x0e\x45\xd0\x2d\x2d\x2f\x25\x15\x43\x7b\x52\x1b\xd8\x88\x7b\xc1\x5e\x8b\x09\xca\x19\x7b\xa1\x79\x5e\x0f\xe3\x2d\xe2\xd3\x63\xf0\x2a\x48\x43\x7b\x29\xb7\xe6\x1e\x31\xd3\xab\x4e\x2d\xb5\xed\x25\x24\xeb\xdd\x8a\xcc\x56\x0a\x1b\xab\xd4\xdb\x15\x1e\xa3\x33\xb8\x4b\x2e\x8a\x2b\x77\xf1\x9e\x03\x12\xb3\x5a\x95\xe4\x87\x6b\xa9\x8c\xcd\x32\x18\xea\x48\x1e\xc6\xc0\x54\x52\x40\x49\x20\x41\x6f\xd5\x5e\x07\x3f\x7d\x6a\x2f\x70\x11\xa0\xa3\x24\x0e\x02\xa5\xf3\x10\xc0\x2c\xe3\x71\x36\x00\x00\x04\x80\xa8\x00\xa4\xbe\xb3\x91\x92\x0c\xc2\xaa\xf6\x7d\xc1\x9a\x2d\x5e\x01\x80\x22\xec\x4a\x42\xb6\xe5\xc0\x41\x68\xf7\xee\xac\x1e\xdd\x1b\x59\x05\x16\x62\x67\x76\xae\x26\x66\x2a\x76\xc8\xc3\x40\x65\xae\xcb\xc4\x9d\x4b\xa4\x4e\xa9\x15\xb3\x75\xab\xf7\x98\x6d\xb3\xa3\xf2\xb5\xd7\x6e\xdd\x27\x76\xab\xbb\xe1\xe7\x57\x4f\xb0\x78\x85\xee\x56\xac\xdc\x24\xf1\x02\x3b\x77\x91\x09\xd4\x5d\x46\x81\x1d\x0f\xcf\x0e\x18\x81\xd4\x8d\xe6\x8e\xc2\x89\xf5\x3a\x62\x5f\xd6\xb1\x29\xb8\xa9\x5f\x43\xf4\xe6\x76\x4b\x78\x10\x18\xea\xaf\x5e\xc4\xb0\x44\x37\xca\xca\xc5\xf3\xae\xde\x5a\x72\x3e\x91\x0a\x9d\x14\xc2\x79\x3e\x4f\xa7\x1c\x94\x36\x95\x70\xba\x74\xae\xe9\xc5\x2c\x36\x40\x75\x1d\x2d\x7f\xe0\x80\xb7\x6b\x75\x95\x73\x6f\x59\xd9\x01\x12\x26\xf8\x24\x34\x70\x0f\xef\xd5\x32\x5e\x5f\x5d\x6e\x25\x86\x70\x94\x96\x38\xb3\x9a\x9a\x6a\x32\x07\xc8\xf5\xf0\x24\x2b\x93\x9e\xd0\xc3\x1e\xa8\xdf\x7b\xfa\x19\xf6\x3a\xac\xe7\xcd\xeb\x7c\xf0\xa6\xd7\xc1\xf0\x76\x83\x6c\x3c\x2d\xf8\xed\xb2\x2c\x88\x07\x59\xb2\x02\xe1\x55\x5c\x5f\x8d\x44\x32\x6c\x2f\x79\xc1\x20\x7e\x96\x66\x37\x51\x3c\xd9\x2b\x26\xa8\x24\xef\xb5\x82\x8a\xbe\x77\x32\x49\x5b\xe4\x04\x05\x66\x2c\x97\x34\x1b\x00\x9f\xa2\x8e\x7c\x4e\x17\x56\x52\xe3\xc5\x08\x69\x57\x7a\xd3\xb6\x75\xde\xdd\x77\xfa\x9e\xed\xde\xfb\xf7\x28\x78\xd5\x83\x04\xab\xb6\x86\x74\xc5\xf9\xc3\x5a\x07\xff\xcf\x4b\x97\x97\xb8\xb7\x54\xdd\xa4\xc0\xc9\x65\xe9\x20\x39\x2f\x48\xa4\xab\xe3\xda\x57\x87\x14\xb4\x8d\xf9\x02\x3c\x8f\xf5\xbb\xea\x79\x99\x9e\x99\x1d\x64\x5e\x62\x21\x8b\x60\x0d\x0c\x97\xef\x34\x68\xac\xb9\x22\x0b\x48\x09\x98\xba\xd5\x34\x06\xfb\x15\x6c\xad\xac\x28\xae\x22\x96\xff\xcb\x76\xac\x0d\xdd\xe2\xb6\x2c\xec\x54\xdc\x9d\x03\xbb\x61\xdd\x3e\x35\x17\xc7\x9a\xfb\x54\x3f\xde\x6b\x17\x61\xc5\xf4\xd3\xac\x72\x1f\xeb\x2a\x31\x2f\xe8\x25\xf3\x1e\x99\x6c\x41\x41\x4f\xdd\xf4\x58\x53\x20\xdd\x05\xac\xf6\x5f\x80\xae\x38\x20\xf5\x3f\x7d\xea\x81\x03\xa8\xa9\x41\x87\xcf\x84\xbe\xad\x5a\x84\xa5\x80\xf4\x10\x94\xd4\x3e\x14\xac\x72\x5c\x2b\x95\xac\x31\x82\x45\x51\x95\x68\x4c\xb7\x59\x1b\x37\xa5\xbb\xa3\x91\xcc\x6a\x19\x8d\xce\x64\x11\xa5\x2a\xcb\x07\xe8\x75\x6a\x0e\x2b\x13\xb2\xfa\x12\xab\x9d\x97\x5d\x7a\x6d\xc8\x23\xca\x8c\x56\x1e\x1e\x10\xdc\x1d\x55\x30\x80\x0a\x71\xcd\x51\xf4\xf1\xed\xc8\xaf\x37\xda\xca\xbe\x3b\xce\x24\xe2\x8e\x51\x7e\x72\x4c\xf9\x20\x8e\x29\x15\x34\x94\xbf\xc2\xfd\xc4\x4a\x88\x4b\x67\xff\x2d\x3b\x26\x2e\xac\xe4\xd4\x1d\x7f\x8f\x23\xac\xa8\xe1\x30\xcc\x7f\x38\x83\xc3\x14\x4d\xbe\x4b\x46\x01\xb4\x28\x19\xba\xb3\xcb\x18\xb3\xb4\xac\xcb\xb0\x8e\xda\x60\x2c\xe4\xc2\xe3\x1b\xe6\x6e\x66\x1e\x69\xf9\x38\xd3\x7e\x0f\x12\x8b\xd8\x3a\xae\x71\xe3\x41\x98\x68\x3f\x5b\x88\xdf\x56\xf5\x94\xf3\xf3\xfb\xee\x42\x5a\x6d\x1a\x5b\x92\xfa\x65\x59\xb6\x34\xc1\xf2\xd8\xaf\x41\xcc\x82\xa0\xab\xbe\x0a\x31\x93\xee\xfb\x2a\x13\x92\xa0\x96\xed\x70\x9c\x4b\x20\xb5\xe0\x7f\xc5\x68\xdb\xd9\x6a\xfb\x94\xe6\x60\x82\xd2\x24\xb8\x0d\xcb\x50\xbe\x8f\x68\x03\x16\x65\xd9\x09\x35\x2c\x70\xd9\xfd\xa4\xc7\xac\xe6\x81\x55\x4f\x90\x10\xc2\x8a\x32\x2a\x24\xe6\xfe\x8d\x8c\xf0\x4e\x87\x8c\xba\x5d\x39\x64\x99\x37\xa1\x56\x93\x50\x06\x22\x6a\x51\xa4\xc4\xa6\x18\xd3\x58\xb5\x5f\x2e\x89\xa5\xa2\xb4\x2e\xe6\xf6\xaa\x48\xee\x38\x48\x37\x4d\x25\x76\xd6\x9b\x8d\xca\x88\x2a\x13\x19\x79\x92\x9b\xf3\x76\x6c\xc8\x68\x2f\x53\xb3\x6d\x6e\x00\x0c\xae\xc7\xe2\x59\xae\x06\x4e\x1e\x20\xa3\x15\x2c\x41\xcc\x50\x58\x3a\xcf\x28\x0a\xdf\xb8\x98\x59\x7c\x34\xee\x2e\x90\x67\x9e\x54\x58\xdf\x7c\xa4\xab\x72\x6a\x10\xf7\xed\x40\xcf\xa3\xeb\x10\xfb\x12\x54\xb5\x55\x4c\x67\x02\x75\x5e\x33\x56\x61\x45\x03\xa1\x95\x46\x77\x86\x00\xba\xa7\x56\x59\x1e\x35\x95\xc9\x6f\xb6\xba\xc9\xae\xd3\xed\xf2\x24\x5d\x81\xe7\x6b\xed\x2c\xf9\xd0\x3c\xde\xca\x27\xc7\x6c\x37\x41\xac\x8d\x39\x21\x17\x29\x19\x54\x5c\x67\xe0\x2f\x97\x29\x41\xb6\x39\x36\x31\x90\x1d\xd5\xed\x56\x2c\xbc\xa3\xb9\x5b\x4b\x86\xc2\xcf\x32\x20\xb5\xd8\x54\x56\xce\x29\x68\x57\x87\x11\x35\x51\x7e\x6f\x37\xdd\xe9\xe9\x74\x31\x3b\x8f\x6d\xb5\x88\x22\x54\x9a\x3c\x3d\x55\xaf\x00\x48\x8f\x14\x67\xb2\xa3\x6b\x59\xea\x28\xe2\x09\x22\x37\xc1\xe0\x89\x28\xb1\xbb\x8f\xbf\x7c\xd4\x8e\xe9\xa9\x4d\x02\xe2\xec\x04\xba\xe8\xee\x13\xca\x1f\x51\x36\x77\x9f\x7c\xf5\xcd\x3a\x18\x3c\x5f\x3e\xfa\x64\x0e\xf1\xd7\x9b\x43\xc8\x0e\xb8\x0d\x38\xc4\x66\xf6\x04\x16\xa8\x47\xe3\xed\x78\x0a\xad\x4e\x4c\xc8\x2e\xb8\x2e\xbe\xfe\x5e\x55\x27\x2a\x11\x5f\x58\xa8\x2b\x56\x22\x43\xae\x7f\xe2\xcb\x1a\x7d\xa3\x05\xe0\xdd\xc7\xd3\x85\x04\xfd\xe2\x3a\x30\x0a\x03\x07\x13\xbe\x50\x68\x3b\xee\x91\x21\x7f\xdb\x01\xaa\xe9\x77\xfa\x7d\xbb\x9f\x67\xd2\x8c\x1a\x27\xe2\x85\x59\x85\xfe\xbd\x70\x1a\xd4\x9d\xf6\x5b\x6a\xae\x2a\xe0\x0a\x47\xf0\xbc\xe9\x85\x39\x7b\x5a\xf3\xd1\x51\xe4\x85\x28\x8a\x62\x5f\xa9\xcf\xf2\x38\xf3\x27\x46\xb3\xca\x81\x32\xdf\xcf\xf8\xda\xd5\xf2\x26\xe4\xa6\x05\x94\x37\xec\xa2\x0d\xac\xe1\xca\xde\xf9\x9e\xd2\x2d\xfe\x3d\x79\xf0\xc8\x49\xe0\xaa\x3b\xde\xe2\xcf\xd1\x34\x85\xba\x55\x32\xe1\x63\x00\x05\x58\xfb\x7c\xe2\x07\x6e\xc8\xc2\xe5\x6e\x27\xbd\xcf\xcd\xeb\xce\x8a\xec\xdc\xb8\x22\x57\x53\xd8\xd3\x96\x32\x76\x58\xf2\xf6\x78\xad\xca\xa9\xd8\x66\x3e\xec\xfc\xcd\x1d\x67\x31\x30\x92\x50\x2f\x80\xe5\xf3\xe9\x6b\x9a\x51\x25\xea\x54\xcd\xb0\x4b\x03\x5d\xb2\x9a\x4e\xd2\xf4\x12\xcc\x29\xcc\xa2\xb5\x9e\x5c\x73\x3a\xeb\xbb\x2c\x13\xbb\xee\xa4\x06\x46\x22\x6a\x37\x93\x76\x57\xbd\x95\xfc\x46\xad\x02\x39\x78\x1f\x5a\xe5\x00\xc2\x84\xfa\x95\x7c\x98\x88\x13\x5c\x29\x56\x09\xa1\xe2\xb0\x5b\xfa\xb1\x16\xb4\xfa\xda\x76\xe9\x8d\x7e\x84\xe9\xe1\xb4\xc3\xc7\x95\x1f\x4e\x4e\x85\xb5\x88\xee\x84\x67\x69\x3e\x22\x9d\xb6\xe8\xc4\xe9\x74\xe1\xd2\xc2\xcc\xf0\xd1\xf1\x0f\x8c\x6a\xca\x7d\x0a\x96\xbd\x72\x8e\x96\x8f\x7d\x9d\x91\xc7\xc7\x1d\x8e\xba\xd5\xf2\x2d\x71\xec\x75\xf1\x92\x9b\x50\x96\x64\xf2\x84\x30\x24\x9a\x2f\x6e\xf5\x10\x64\xc4\x35\x2b\x93\xa3\x01\x86\x76\x64\x22\x88\x19\x78\x1a\x25\xfb\x82\xb2\x76\x1e\xf4\x0c\x14\xe9\x9f\xc8\x66\xaa\xf5\x78\xe4\x9b\x65\x06\x3c\x39\x72\xa5\xa9\xc2\x22\xd6\x39\xa3\x40\xd7\x37\xc9\x09\x84\x1d\xe3\x58\xe4\x34\x46\xc0\x97\x2e\x17\x7d\xd8\xa2\xc3\x05\xc0\xb1\xda\xa9\xae\xda\xb4\xd9\x3b\x2f\xbe\x5a\xfe\x18\xdb\xfe\x82\xb8\x85\xa0\xc3\x72\xdb\x83\x72\x6f\x13\xc5\x5d\x08\x7f\xee\xfa\xc0\x46\x3f\x3e\xf3\xdd\x4d\x9e\xc3\x3b\x12\x30\xfc\x10\xe4\x8f\x77\x77\xaa\x2d\xcb\xe5\x20\x58\x2e\x4d\xa8\x5f\x83\xe6\x93\x42\x9e\xea\x03\xa1\x77\x60\xf0\xae\xf9\x30\x63\xa1\x1d\xbd\x49\x5d\xea\xfc\x00\x6e\x86\x97\x88\x0a\x24\x24\x94\x71\x03\x93\x4a\x81\x4e\x4d\xc6\x1d\x66\x7f\x6a\x92\x2b\x42\x66\xcc\x67\x09\xec\xf2\x42\x4b\x6b\x0e\x67\xca\x56\xdc\x0a\xe5\x66\xf1\x0a\x40\x7c\x16\xaf\xf9\xb5\xad\x4a\xc5\x45\xe0\x1d\x11\x66\xf6\x08\x77\xb4\xba\x5b\x12\xed\x10\x9e\x04\xfe\x97\x0f\x3a\x98\xd4\x23\x67\xe8\x3c\x7a\x82\xb5\xaa\xd3\x97\xac\x18\xc4\x8a\x5a\xda\x11\x8e\xa3\xbd\x15\x1b\x41\x6b\x27\xda\xdf\x2d\xfb\x09\x7d\x95\x76\xe2\x74\xd9\x57\x51\x61\x7c\x39\xb1\x0e\x12\xdb\x2b\xf3\x3a\x32\x2c\xd4\xf0\x5a\x53\x6a\x96\x60\xb0\x1f\x21\x53\x72\x2c\x80\x9a\x95\x00\x6b\xb4\xa3\xf4\xd1\xbd\x1a\x73\xae\xad\x78\x8c\xbc\x8a\x9a\xe4\x55\xb5\xbf\x05\x3c\x14\x3f\x00\x69\x5f\x46\x97\x2b\xab\x58\xd5\x3a\xff\x79\xb4\xb9\xc6\x14\xa2\xaa\x15\xfa\x08\x24\xb9\xb2\x5f\x7c\xca\x1c\x76\x61\x3d\x02\xbd\xf6\x80\xea\xe9\xf2\xda\x55\x44\xb8\xd8\x75\xea\xdb\x57\x76\x6a\xb1\x4a\xb7\xc2\xc3\xaa\xd8\x5e\x75\x37\x74\xb4\xbd\x9b\x3e\x93\xaf\xf8\x48\x38\xa3\x40\x61\x95\x10\xc6\x16\x8e\x98\xa8\xe6\xb4\xa5\xa6\x93\x6c\xd3\xf1\x89\x00\x9b\xdd\xc4\x64\x07\xca\x89\xc3\xb7\xd2\x3b\x62\x4c\x5d\x09\xad\x18\xbe\xe6\x95\x91\x09\x7d\xe8\x26\xaf\xdf\xf8\xb2\xc3\xe7\x5a\xec\xe0\xae\x70\xd8\x57\x03\x9f\x49\x73\x02\xf8\x5a\xa3\xa2\x3f\x6e\x96\x54\x1e\x21\x5e\x81\x31\x94\x6d\xa1\xd6\xd6\x68\xf3\x06\xdc\x90\x6a\x6b\xdf\xf7\xb0\x1c\xc3\x26\x48\x44\x43\xda\x57\x25\xf1\x91\x85\x6f\x9e\x59\xf5\x17\x34\xd2\x62\x44\x64\xb6\x19\xd5\xea\x30\xaa\x8e\x3d\x27\xb2\x7e\xb1\x98\xc2\xdb\x02\x7b\x6e\xad\x19\x45\x6b\x6d\x76\xce\x22\x1d\x55\x76\x97\xed\x40\xce\x41\x25\xd2\xd1\x55\x7a\x5d\x06\x40\xd0\x66\x7c\xe9\x6c\x80\x0e\x1e\x28\x80\x63\x48\xe4\xb6\x21\x20\x0f\x4c\xe5\x0f\x86\x68\x70\xca\x2d\x1a\xe2\x37\xef\xd7\x46\xcf\x5c\x6e\x6e\x17\xea\x32\xe2\x50\x7d\xa1\xa9\x66\x58\x93\x43\xef\xab\x33\xd3\xab\x58\x5b\xd6\x09\x94\xee\xa0\x19\x08\xab\xbc\xad\xc8\x45\x69\x3f\x2d\xe1\x56\x02\x82\x62\xd2\x27\x7f\x49\x14\xd7\x8f\xf2\xb7\x60\xab\x6b\xaa\x64\x97\x20\x50\x95\xaa\x82\x40\xf1\x05\x64\x81\x40\xf9\xa3\xea\x81\xca\x74\xb4\xac\x03\xcc\xde\x08\xea\xf0\xb4\xb2\x66\x33\xd1\x83\x8e\xf1\xfa\x06\xd7\x66\xe3\x82\x57\x84\xe9\x09\x86\xae\x17\x49\x5b\x44\x7a\xb9\x8b\x11\x75\xcc\xa4\xce\x0b\x10\xb2\x76\x4a\x10\x24\x93\xb8\xbe\x76\x6d\x84\xe3\xa9\x11\x13\x46\xf4\x19\x72\xe4\x7c\x07\x01\xe4\x58\x20\x78\xa6\xbf\xbf\x7a\x14\x52\x45\x9d\x41\x96\xd9\x9c\x31\x48\x67\xa8\x95\x76\x5e\x0d\xa6\xae\xf8\x96\xeb\xe9\x03\xf1\x52\xb9\x1c\x9c\x29\x89\x29\x04\x26\x82\xe8\x75\x78\xc6\xce\x21\x21\x9f\xe7\xe9\x28\xff\x9d\x55\x9a\x33\x75\xde\x62\x07\xec\x43\x18\x8e\xde\xf9\x04\xb2\xc5\xe8\x92\x33\x68\x2d\x50\x9d\x81\x4c\xb4\xc3\x5a\xc8\x9a\x97\xb2\xbe\xfb\xb9\x79\x81\x80\xb3\x17\xb1\xb5\x90\xa1\x46\x64\xbb\xbc\x56\x96\x24\xc7\x33\x55\x1e\x3c\x4e\x12\xbb\x6e\x50\xcb\x40\x2c\x1c\x6f\xa7\x2a\x1e\xe6\x6e\x4d\xd6\xed\x8e\x46\x23\x4c\x96\x08\x9f\x91\x76\xe9\x3e\xe9\x71\xdc\x2d\x4a\xdb\xbd\xfa\x56\xf5\xc3\x6b\x1d\xba\x37\xbf\x02\x26\x61\x38\xcc\x30\xf2\x91\x2f\x78\x0e\x3c\xc0\x9d\xc6\x01\x39\xd4\x2a\x2f\x4a\xff\x2a\x52\xb2\x0a\xad\xab\xef\x7d\x4b\x99\x43\x2c\x99\xd9\x98\x5c\x14\x17\xb2\xb2\x67\xe5\x75\xe6\xf6\x8a\x83\x57\x0d\x72\x6b\x48\xd6\x25\x74\x2e\x8e\xcb\x50\x14\x6f\xcd\x03\x6e\xaa\xb5\x34\x16\x23\x46\xa4\x6b\x99\xb3\x56\x8a\x53\x11\x9a\xfd\xdd\xd0\x18\xa1\x62\xec\x29\xf9\x15\xcd\x24\x6f\x1b\x0c\x5a\x32\xa8\x6d\x35\x62\xb6\x50\xe3\xf4\x18\x9a\x64\x68\xc2\x10\x88\x01\xd9\x7a\xa0\x13\x4a\x60\x64\x96\xd7\x7c\xbc\xdb\xc7\xf3\x26\x6f\x0d\xbb\xf0\x2b\x1a\xe1\x7c\x68\x0f\x1c\x02\xed\xfa\xb2\x1b\xa0\x62\xeb\x89\x86\x02\xaa\xb6\x5e\xa1\xa8\x58\xe7\xb6\x04\xee\x43\xcc\xd4\x52\x21\xd1\x1b\x99\x37\x4d\x28\xeb\x28\x1a\x2f\x5f\xec\x60\x46\xa4\x3c\xb2\x0a\xa1\x39\xd3\xbb\x69\x51\xb2\xf1\x83\x8e\x9b\x65\x4d\x03\x45\x62\x20\x06\x10\xa0\x45\xf7\x6e\xba\x88\x31\x43\xad\x06\xd7\x5f\xfe\x35\x94\x8f\x34\x03\x6b\xdf\x14\x7a\x7a\xd8\xa8\x74\x95\xae\xd2\x9f\xac\x25\x8a\x22\x1b\x24\x0f\x62\x4a\xdb\xb3\x59\xf7\xac\xab\xd9\x2d\x75\xd9\x97\xa9\x8d\xea\xca\xf8\x73\x74\x0b\x09\x70\x75\xb2\xd6\x10\xfd\x86\xb3\x66\x67\xa2\xe6\x20\x6c\x76\x6c\x82\x79\x88\x99\x10\xd7\x94\xf4\x67\xa3\x26\x53\x35\xb2\x69\x40\x1b\x23\x73\xb2\xb6\xd8\xa5\xba\x9f\xd6\xb0\xde\x91\x09\xd9\xc0\x84\x67\xa5\x6d\xcd\xe3\x4f\xb6\x35\x7f\xbd\x6d\x0d\x5a\x50\x7d\xa0\xd0\x2a\xb7\x34\xb8\x31\x53\xed\x45\xdc\xa0\xde\x38\x08\x01\x74\xff\xac\x47\x0e\x80\xa9\xc1\xf0\x4c\x33\x78\x16\xce\xaf\xc0\xe8\x8e\xa2\x2c\x0e\xcc\x03\xeb\x70\xdf\x0a\xc7\x13\x91\xbc\x60\x20\xcd\x59\x86\xac\x6d\x5f\x9b\xdc\x38\x51\x0d\x81\xd1\xb1\x83\xaa\xc0\x58\x7a\x5e\xab\x15\xb9\x05\x7e\xb7\x16\xaa\xf6\x55\x26\x31\x5f\xbc\x6c\x8e\x0b\xda\xd0\x0f\xf3\x2e\xcf\x03\xaf\x07\xe0\x5e\xe3\x7d\x00\x98\x0b\x08\x6b\x17\x57\x9b\x2f\x71\xcc\xe5\x40\x89\x76\x2d\xa9\x7a\x3a\xc8\xde\x4b\xa1\x01\xbe\xe1\x1c\x0d\x92\x1b\xb3\xf8\x50\xfe\x43\x60\xbd\x9e\xb6\x2a\xb0\x13\x9b\x47\xc7\x71\xea\x85\xbc\x3c\x98\x18\x1e\xe8\xc2\x83\xbd\xa7\x89\x17\x85\xce\x7a\x78\xf8\xbf\x4c\xbd\x87\xe0\xea\x52\x02\xae\x7a\x9b\x62\x84\xd5\x8a\xe2\x6b\x35\x12\x00\x65\xfd\x10\x43\x81\x7a\x6e\xd3\x2b\x28\x07\x7d\x52\x5d\x42\x44\xd8\x0f\xd1\x27\x00\xe1\xbd\x4d\x9f\xb0\x03\x38\x51\x5b\x16\xc3\x03\x40\xd7\x61\x7b\x38\x7b\xe4\x9d\xad\x0d\x0f\x65\x4d\x3d\x35\x10\x38\xfe\x43\xc9\x3a\x28\xd9\xb7\xd2\x69\x25\x69\xa7\x52\x0a\x28\x5a\x25\xbf\xf9\xa8\x21\xff\xa5\xf4\x61\xb9\x3b\x73\xa2\xbd\xbc\xc4\xff\x36\x2b\x8d\xb4\x5c\x2b\xf9\x60\x45\x21\xd3\x92\xca\x6e\x7e\xfd\x9c\x01\xb9\xb4\xe5\xbe\xd7\x1d\x15\x66\xb4\xeb\xf5\xfe\xfb\xe4\x91\xf9\xf2\x70\xa7\xda\x5f\xaa\x2b\xe8\xfe\xf7\xbc\xd6\x95\x6e\xdb\xda\xeb\x32\xb8\x96\xee\x28\x41\x76\xb3\xf2\xb4\xd2\x3d\x20\x4f\x3c\x0b\x3a\xd1\x7c\x88\x89\x99\x91\x90\x02\xb5\x24\x10\x19\x32\xf9\xef\x45\x45\xbf\xb7\x6b\x94\x8d\xc8\xb5\x46\xeb\x10\xbd\x36\xca\xa4\xd7\x3f\x13\x28\x20\x29\xd1\x36\x43\x6b\xf5\x0c\x1f\x72\x59\x00\x92\x0e\x49\x72\x80\xbd\x83\xcb\x69\x52\x24\x65\xdf\xb0\xa0\xa8\x91\xb8\x2f\x18\x4b\x03\x92\xc9\xf6\xac\xff\x6c\x1b\xaa\x30\xfc\x4a\x6e\x1e\x04\xc3\x21\x5c\x10\x97\x20\xf8\x26\x38\x1f\x84\x2b\x96\x85\xf9\x0c\x6d\xe7\x18\x2c\xeb\x2d\x20\x13\x97\x19\x88\x3a\xe6\xa8\xcd\x01\x78\x21\xe0\xce\x92\x71\x36\x66\xe6\x45\xa9\x7f\xd9\x8a\xdb\x3b\x67\x32\x9a\xfe\x99\x03\xe7\xd9\xf4\x70\xad\x77\xb4\x6e\x71\x59\xd7\x50\x06\x85\x98\x74\xc3\xd5\xae\x3a\x9d\x15\x6b\x12\x74\xe7\x22\xd7\xad\xba\x43\x11\x78\x74\xd9\xa7\x17\x40\x3c\x39\xb4\xec\x63\x43\x1d\xa7\xd9\xa0\xe9\x3d\x28\xce\x66\x59\xfa\x36\x14\x33\x6c\x6f\x27\x6e\x46\x41\xef\x89\x8c\x15\xe8\x32\xae\x20\x84\xe8\x0c\xd0\x7d\x46\x14\x94\x5f\xa1\xc6\xb0\x0a\xcb\x30\xa7\xe5\xf5\xa4\x2f\xae\x61\x6e\x1b\x56\x7a\xff\x3a\x7f\xd3\xd6\xcb\x61\x7e\xeb\x5b\xbe\x6a\xfa\xe1\x66\x89\x47\xb0\xa4\x72\xaf\x66\x5e\x01\x77\x4a\x18\x82\xd1\x99\x83\x5a\xef\xa5\xc0\x70\xd3\x73\x61\x69\xb6\x3c\x7b\x07\x8b\xa5\x86\xab\x7e\x93\xf8\xbf\x09\x18\x8e\x50\x49\x62\x48\xa7\xbb\x0e\x65\x93\x21\x87\xc4\x53\x3b\x66\x91\x31\xc0\xe0\x31\xe0\x03\x9b\x93\xa9\x40\x5a\xa2\x2a\x61\xae\x20\x09\x82\x43\x14\x76\xbe\x42\x0d\xb0\x4e\x9a\x4a\xda\x2e\x1c\xfa\xde\x86\x32\x09\x18\x5b\xe1\xc5\x9a\x54\x50\x0e\x14\x5d\xe9\x88\x0b\xa4\xe8\xb9\x5d\x18\x9b\x37\xde\x86\x08\x61\x6c\x24\x7f\x5b\x99\xa6\x6a\xe6\x42\x9f\x0c\xd2\xd9\x60\x1b\x61\x76\xcc\xae\x80\xc8\x76\x38\xca\xf9\xc5\xac\x58\x9c\x5f\x58\x5b\xc7\x06\xc4\x6f\x1d\x8d\xf8\xa9\x61\x4f\xe2\xf2\xb9\xa9\xa0\xa7\x09\x91\x59\x41\x88\xdc\xb0\xaa\xf4\x46\x8d\xad\x4a\x64\x6c\xe2\x07\x1c\x22\x19\x2b\x97\xe6\x94\x23\x05\xe7\x08\x18\x43\x88\xbb\xa4\x0c\x17\x24\xde\x35\xcf\x34\x0a\xf3\x67\xe0\xae\x45\x68\x83\xf0\x8d\xcf\x74\x6e\x5f\xce\x22\x74\x36\x5b\x8f\xd5\xda\xb5\xb5\x5e\x5d\x14\x0d\x85\x29\x61\x2b\xc4\x26\x0a\x44\x2e\x47\x4f\x37\xba\x71\x82\x7c\x20\xb5\x9e\xa1\x8f\xdd\x3a\x6b\x05\xf4\x6c\x77\x0e\x86\xa0\x87\x66\xc2\x34\xe7\xf5\xe9\x6a\xf8\x6f\x71\x35\x44\x49\xbb\xb9\x04\x42\x9a\xce\x57\x43\x44\xce\xec\xe7\x88\x08\xbb\xd6\xb8\x43\xa2\x89\x91\x2e\x54\xa3\xf5\x05\x3b\x43\x1e\xa7\x81\x78\xdb\x9d\x70\x54\xe9\xae\xb7\x9b\x37\x3d\x01\xe1\xee\x9f\x21\x6d\xdd\xe8\xe4\xac\x20\x54\x6b\x11\x3a\x47\xc4\xf5\xb8\x6d\x8c\x7d\xa0\x1e\x29\x70\x88\x20\xb2\xfa\xcc\x91\x8f\x07\x1c\x8f\x94\xb5\xfd\x40\xba\x30\x8c\x29\x58\x3c\x48\x26\x24\x69\x0a\x9a\xd5\x73\xcd\x05\x6c\xb3\x39\x87\xee\x86\x58\xa0\x33\x44\xd6\x4b\x10\x5b\xbb\x93\x1c\x12\xf6\xf5\xa4\x01\xb0\xd5\x64\x1d\x91\xbe\xc5\x5b\xb9\xb4\x71\x1c\xac\xa9\x3c\x5a\x52\x9a\x46\xe6\x39\x10\x61\x05\xe7\xda\xe4\x40\x45\x2d\xb8\x76\xdf\x66\xd9\x14\x50\x2b\xfb\x6f\x99\x22\x42\x6d\x3c\xfa\x4b\x42\xc8\x33\x83\xc8\x00\xfd\xad\x4a\x24\x89\x50\xe7\x8c\xc8\x6d\x26\x11\x6f\x74\xe8\x13\x77\x88\x5c\xb3\x21\x2c\xbc\xa1\x1d\x10\x27\x1d\xfa\x54\x99\xb6\xac\x0c\xe9\xf3\x09\x82\x9f\xb8\x4e\xa0\x43\x1b\xb5\x2a\x3a\x5b\xf3\x87\x1a\x56\x1d\xa5\x85\x86\xfc\xeb\xce\x39\x81\x7d\x04\xe2\x17\xa3\xd7\x1b\x91\xeb\x5a\x6a\x7d\x6b\x03\xd0\xe5\xb4\x58\xac\xee\xe3\x13\x26\x32\xb2\xea\xab\x2f\x50\x81\xaf\x68\xa4\xa5\x58\x2c\x6d\xad\x6e\xa7\x88\x1e\xcb\xe1\xe7\x2a\xed\x6a\xf1\xab\x79\x83\x93\xbc\x94\x12\xd8\x63\xee\xd9\x52\xd6\xb1\xc5\x58\x55\xc5\x8b\xc3\xba\x70\x18\x46\x60\x31\x3e\x83\xe8\x02\x43\x0f\x69\x59\x9d\x75\x73\xb0\xcf\x51\xab\x3d\x23\x6b\xaa\x87\xc1\xbe\xbd\x48\xcb\xca\xde\xd2\xd2\xa6\x7b\xf7\xea\xb7\x92\xeb\xff\x8f\xf0\x25\x1d\x25\xe6\xb4\x8c\x72\x00\x1d\xf5\x00\x31\x87\x0b\x84\xef\x44\xed\x3a\xbe\x9b\x09\x7c\x98\x58\xfd\x97\xd6\x4a\xb3\x6a\xf3\x29\xe0\xdb\x78\x7e\x58\xee\xd8\xb5\x7f\xa1\xa8\x59\x64\x78\x5d\xf7\x27\x7d\x17\x41\x5a\x57\xfd\x4d\x70\x70\xb1\x8d\xd7\x8d\x7f\x6e\x6f\x55\x80\x87\xbb\xe1\x87\x48\x1e\x7b\x5b\x54\x32\xdb\x94\x65\xa5\xdc\x1d\x53\x5f\xde\xe5\x81\x9a\xbc\x55\xec\xfa\x3f\x9d\x44\x3e\x07\x74\x4a\x67\xf4\x68\xbe\x9b\xc5\x21\xa9\x2a\xda\xe4\x76\xc9\x42\x69\xa5\x92\x0b\x97\x65\x53\x27\xf5\x6a\xa0\xc3\x95\x8a\xaf\x27\x9f\x14\x5f\x7f\xa9\xe2\xcb\xc5\xa0\xfc\x40\x8a\xaf\x28\xe6\x6a\x1c\x59\xdf\xa4\xfd\xe9\xb8\xfa\xb5\x21\x17\x03\xdd\x48\x25\x0b\x35\xaa\x50\x21\x2a\x90\x0e\x1d\x95\xe8\xf4\x7a\xc7\x36\x02\x08\x42\xfa\x95\x8c\xa2\x0f\xbe\xb2\xcc\xf2\x39\xcb\xb2\x8a\x61\x37\xe1\x84\xd9\x0c\x50\xdf\x67\x68\x75\x52\x7e\x86\xdb\xc3\x75\x92\xcd\xb1\x87\xf9\x64\x50\x2a\x98\x31\x88\x2d\xc6\xe8\xe0\x12\xee\x46\xdf\x0c\x92\x71\x77\x8e\x83\x44\xa4\x35\xbe\x1e\xa7\xc1\x04\x68\xe6\x39\x8a\x33\x18\xb3\x70\xaa\x37\x9d\x09\x6a\x7f\xa3\xee\x4d\x35\x8d\x71\xe8\x37\x0f\x81\x3b\x3d\x07\x87\xa1\x9e\x7f\xab\xf6\x88\x27\x54\xbe\x41\x0a\xa2\x79\x4f\xee\x28\x8a\x0d\x67\x83\xab\xdc\x4f\x80\xcb\xb6\x30\xc8\x0b\x14\x20\x81\x15\x20\xc5\x2f\x28\x92\x33\x33\xb9\xc0\x4b\x93\x09\x99\x2d\x49\x8b\x84\xcc\xac\xd8\x91\xdd\x4f\x9e\x83\x81\xb1\xe7\xce\xd3\x00\x7c\x6c\xb8\xc9\xcb\xfa\x16\xb8\xe6\x34\xb9\x9a\x91\xc1\x3f\xae\xb8\x13\x19\x93\x51\x1b\xa3\xc4\xa7\xf9\xac\xd4\x0e\x9e\x82\x1e\x67\xe3\x92\xf9\x6b\xed\x4e\x11\xdd\x7f\x48\x6d\x14\x5f\x30\xa0\x70\xba\x8b\xe9\x55\x3a\x1b\x94\xbc\x0f\x6e\xc9\xd7\x92\xb5\x97\x93\x9f\xa1\x6e\xea\x62\x56\x5c\x25\x93\xec\x2a\xc1\x10\x96\xcd\x86\xb4\x8d\xb6\xca\x03\x7a\xdd\xb0\xa9\x36\x70\x52\x8d\x96\xff\x6a\x74\xe6\x67\x4f\xa5\x93\x86\x31\xad\x9c\xd3\x0e\xbf\x43\x92\x48\x28\xc4\x8e\x44\x4f\x15\xc6\xd1\xa1\x6b\x56\x8e\x02\x4f\x87\x9c\x86\x0b\x81\xe5\x81\xa1\x85\xe8\xa4\xf5\x0c\x23\x8f\x3d\x86\xc1\x14\xc9\xaf\x70\x4f\x77\x62\x15\x13\x9b\xb9\xbc\x32\x93\x47\x4b\x15\xb5\x54\x77\x8f\xa4\x62\xde\xab\x4d\xde\x94\xa6\x0e\xb3\x2b\xcc\xdb\xcf\x89\xce\x18\x6d\x69\xa0\x96\xe9\x41\x02\x6f\x74\x30\x3a\x83\xfa\x10\x79\xa7\xd5\x49\x7e\x4e\x7f\xcf\x21\xd4\xbc\xd9\xd5\x7d\xd4\x5f\x80\x63\x07\xf0\xec\x31\x4d\x46\x92\xfc\xc6\x2f\xd9\x51\x51\x4c\x45\x78\x07\xd5\xb9\x13\x44\xe0\x1c\x14\x05\x81\xe2\xd4\x4a\x00\x04\x77\xd4\xcc\xe3\xb7\x03\x55\xc1\xa5\x08\xbb\x46\xb2\xa7\xf8\x70\xa5\x77\x9c\x5f\x0c\x8f\x0a\x0e\x53\x06\x99\xab\x70\x7e\x86\x56\x66\xfd\x14\x6e\x3f\xd5\x8f\x71\x8a\x40\x2b\x4c\xb2\x1d\xa1\xe6\x10\x48\x75\x07\x4c\x62\x1b\xb8\xd3\x75\x8c\x1d\x8a\x46\x00\x01\xfd\xd5\x26\xb4\x33\x62\xb1\xe7\xdb\xbe\x57\x80\xaf\x9b\xad\x4a\xd4\x05\x2f\x32\xb8\x6d\xf8\x79\x3a\x7b\xeb\x3c\x42\x56\x10\x0c\xcf\xef\x93\x54\x76\x76\xc3\xc9\x8e\x73\x97\x6f\x89\xf4\xa9\x58\xcc\xd9\x6b\x87\xfc\xae\x66\xe2\x9b\x63\x83\x6f\x99\x4d\xf1\x96\x10\x07\x70\xf4\x24\x37\x08\x6f\xc5\x4e\x72\x0c\xf7\x4e\x5a\x26\xbd\xb0\x93\xe1\x94\xf7\x50\x98\xc0\x6d\x53\x6d\xc0\x21\x10\x65\x66\x19\x70\xcf\x1f\x7f\x0f\xce\x83\xe5\xa3\x52\xa2\xb1\xea\x2a\x41\x50\xce\x3a\xca\x6a\xc9\x29\xdc\x5c\xf9\xf9\x04\x30\x66\xf7\xdd\x38\x37\xda\x00\xcb\x30\x4f\xab\x97\xf0\x7a\x75\x54\x15\xcd\xa6\xe4\x1a\x37\xae\x50\xf5\x90\xf4\xad\x41\xfc\x6e\x4f\xfe\x6e\x4f\x00\xf3\x41\x0d\xfa\x83\xde\x91\x8a\x0e\x52\x7c\xd4\x90\x8b\x20\x49\x14\x60\x2a\x09\x01\x81\x2a\xc2\xed\xb2\x54\xe9\x25\xaf\xfb\x25\x17\xf1\xdd\xa8\x44\xdd\x26\x89\x6e\xca\xe8\x71\xe7\xc8\xe2\x5a\xe6\xa4\x4d\x68\x96\x91\x35\x0f\x79\x30\x82\x7c\x47\xc9\xed\x35\x48\x63\x6b\xa7\xa6\xd1\x03\x1b\x00\x46\x35\x8b\x21\xfd\xdb\x14\xb9\xbf\x8d\xde\x43\x70\x57\xcf\x0b\xe1\x37\x6e\x45\x1b\x5d\x4b\x44\x1d\xb9\x5a\xfc\x1b\xaa\x6e\xd7\xce\x2b\xa5\x50\xa7\xe8\xde\x86\xaa\xb6\x90\x22\x02\x35\x5c\x63\xe9\x37\x9f\xc9\xf8\xe6\xe1\x16\xed\x76\x4f\xca\x31\x42\x37\x66\xf3\xe0\xc1\x00\x6f\x4b\xf0\x73\x00\x4e\x0f\xef\xd3\x21\x80\xfd\x99\x3f\x30\x12\x8b\x69\x06\x4c\x12\x52\x2e\x9e\x8e\x29\x8a\xc5\x7d\x72\xbe\x85\x8b\x36\x25\x82\x06\x37\xf5\x39\x4a\x86\x90\x6f\xe5\x76\x2c\xcb\x0a\x12\xe5\xc1\xb5\x88\xa1\x29\xea\xc9\x67\x86\x8d\xc0\xa6\x50\x66\x3d\x03\xa9\xee\xbc\x8c\xc7\x1a\x1b\x51\x71\x04\x0f\x44\x8f\x1c\x7c\xe6\x71\x2c\x4b\x6e\xcb\x51\x66\xa8\xcf\xc1\x5d\x0b\x77\xbe\x9d\x0f\x4a\x32\xd3\xd8\x7d\x79\x88\x71\x91\x33\x88\x8e\x8f\x2e\x20\xe6\xd7\x15\xb1\x29\xa6\x96\xbe\x79\x93\x83\x7f\xdb\x1c\x50\x06\xd9\xc8\xc3\xce\x16\x1e\x31\x73\xd4\x32\x46\x1f\x26\xf3\x49\x43\x18\x7c\x01\xb2\x56\x37\x1a\x26\x04\x22\x4c\x63\x55\xac\xe1\xb9\x4a\x49\xf1\xcd\xfc\x87\x66\x49\xc2\xd1\x94\xc2\x7f\xb9\x06\x98\x37\x52\x0c\x0e\x30\x41\xf2\xbc\x57\x11\xa9\xe2\x6f\x7b\xf7\x32\x77\x09\x2c\x78\x5b\x76\x3e\xbb\x4b\x53\xdb\x5b\x55\x46\x21\x5e\x36\x4c\xf3\x4b\xc6\x8e\x79\x77\x45\xfa\x32\x21\x96\x1b\xe2\xdd\x85\x58\x81\xc8\xa2\xfb\xf8\xcb\x87\xb7\x81\x58\xac\xc8\xbe\xbe\x5c\x47\xf6\xf5\x49\xcc\x75\x47\x31\x97\xa8\x95\x0e\x26\x97\xf9\xac\x98\x8c\xe5\x3e\x36\x33\xfb\xcf\x72\x94\xa3\x43\x5f\x3e\xea\xa2\x6a\x1d\xbf\x7f\xe6\x44\x60\x9f\xb1\xc0\xc8\x74\xe9\x17\xb3\xeb\x8f\x9e\x9b\xfd\x75\xef\x1e\x5c\x0f\x4d\x8e\xcf\x70\x95\x4f\x06\xe6\x59\x0b\x0f\xe2\x06\x4c\xe2\x30\x37\x94\xa5\x41\x41\xcd\x28\xad\x33\x28\xcc\x4e\xe0\x2b\x3c\xf8\xd4\xa1\x07\xff\x01\x19\xd9\xb4\xb6\x94\x3d\xf8\x31\x9a\x39\x00\x4b\x64\x26\xe5\x2a\xc3\xa5\x67\x43\xe2\xb4\x84\xb0\x74\x56\xf3\x85\x74\x27\x9b\xf3\x7b\x86\x83\x8a\xcd\xb3\x77\x40\x4f\xa0\xa6\xdf\x0a\xb8\xe6\x3b\xc9\x4f\xd9\x68\x5a\x26\x29\x58\xb7\x25\xfd\x7c\xd6\x37\x9b\x73\xe6\x59\x9b\x53\xf8\x46\x92\x4d\xe0\x0e\x41\x50\x94\xb4\x84\x5a\xcf\x98\x7d\xbe\x32\xcc\x0d\xc4\x80\x37\x44\x06\x03\x9e\x03\x0c\x04\xd0\x70\x8c\x93\x4f\x2d\x11\x2b\xc1\xe8\x53\xd7\xe6\xc5\x7f\x09\x21\xa0\x26\xfd\xd1\x62\x40\x7c\xf5\x38\xcd\x51\xdc\xd2\x43\xd3\x74\x2a\xd4\x73\x3d\xb9\x56\x7a\x82\xc8\xe2\x09\x38\x84\x5d\x93\xae\xfb\xb3\xed\x12\xa8\x5a\x43\x43\x78\xa1\xe8\x77\xb8\x50\xaa\x00\x9e\x72\x87\x93\x4f\x06\x54\x76\xdd\xcd\xda\x99\x85\xe7\xe5\x0b\x83\xec\x82\xcb\x9c\x24\xa9\x88\xda\xaa\xf2\x5f\xf3\xec\x0a\x4e\x74\x37\xac\x92\x8b\x95\x66\x23\x80\x91\x24\xaa\x35\x0e\x27\xd4\xd9\x6e\x72\xcf\xe5\xde\xde\x4e\x9e\xe1\xa4\x5f\x71\xb0\xb5\x9c\xcc\x46\xcc\x65\x3a\xc6\xcd\xd1\xbf\x48\x27\xe7\xf6\x70\x0c\x17\x20\xe8\xe8\xd4\x79\xb3\x44\xe6\x15\xe8\x64\xfb\x0f\x24\x4c\x5f\x7d\x22\x4c\x1f\x9f\x30\x3d\x63\xb3\xb4\x3d\x08\x11\x50\xe6\x64\x67\x42\x48\x3f\x1b\x23\xbb\xbe\x04\xdc\xb7\xc1\xde\x08\xac\xde\x3c\x21\xb8\x4a\x70\xa2\xf6\x12\xf8\x1f\x3f\x1f\x45\x09\xef\x50\x92\x48\xd8\x0d\xb3\x7c\x62\xc8\xc8\x1e\x50\x93\xc9\x7c\x17\xb1\xe3\x8a\x99\x5f\x30\x9e\x47\x3b\xb6\xe0\xf2\x5e\x18\xda\x63\xd6\xb1\x8f\x3d\x2c\x29\x1e\x92\xe2\x23\x89\xbe\x24\x48\xb4\xfa\x54\x15\x19\x43\x70\xe8\xf5\x09\x39\x63\xdc\x27\xea\x24\x81\x15\xd2\x59\x5e\x92\x04\x47\xca\x30\xcb\x84\x74\x6c\x08\xfa\x50\x11\x7e\x5b\xc1\x2c\xda\x00\x0b\x76\x14\x2c\x16\x3a\xc0\x5c\xa1\x7d\x45\x99\x89\x50\x88\xad\xf0\x46\xc0\x7a\x82\xe6\x12\xe3\xd9\x99\x96\xce\x70\xe7\x42\x1d\x67\x85\xa1\xbc\x39\x70\xab\xba\xcf\xd0\x30\x7c\xe4\xf2\x89\x2c\xac\xec\x0c\x73\x90\x3b\x86\xb2\x03\x5f\xc8\x7b\x56\xa2\x34\x40\x08\x01\x42\xd5\x37\x8d\xce\xb2\xe9\x28\xa5\x3c\x7a\x06\x24\xb8\x79\xdf\xed\x98\x36\xc3\x9e\x43\x55\xb0\x2d\xa0\x71\xdb\xa8\x21\xdf\xa0\x0f\xc0\x8f\x5c\xe5\x38\xab\x86\xc0\x0d\x03\x5a\xc0\x91\xf1\x5f\xac\x75\x5b\xb5\x09\x59\xe9\xc9\x02\xa7\xaa\x73\x8a\xa7\xed\x29\xd6\xb0\x63\x3f\x96\xa0\x99\x85\x4d\x02\xae\xe6\xf0\x85\xf7\x0c\xb9\x8a\x53\x9e\x21\xb7\xc0\xd9\xac\x69\x10\x6d\xc8\x66\x5d\x07\x1c\x42\x47\x1b\x7b\x61\x7d\x64\x7f\x34\x53\x26\x8b\xc0\x57\xa1\x59\x83\xe9\xc2\x77\x2d\x17\x85\x3b\x5b\x91\xe2\x57\x76\xf8\x86\x8e\x44\xdc\x64\xe1\x3d\xde\x40\xe3\x91\x06\xad\xa9\x8c\xba\x62\xfd\xe4\x92\x3a\x97\x64\xae\xe9\x6c\xaf\x2a\x59\x5e\xc7\x8f\x51\xb3\x15\x8f\xed\x43\x20\x38\x19\xbf\x38\x40\x28\x89\x78\x27\x8b\x33\x1a\x88\x75\xfd\x22\xe0\x63\x44\xeb\x30\xbb\x8a\x02\x1e\x51\x1d\x95\x5d\x8b\x86\xb2\x3c\x61\xfc\x7d\xdd\xa9\xda\x4f\xe7\x69\xcd\x54\x55\x17\xb7\x66\x9e\x74\x16\x99\x29\x2b\xa9\x2a\xc9\x5d\xc5\xfb\x29\xf6\xb4\xc1\x16\x0b\x72\xfd\x2c\xfe\xbf\xae\x8c\x18\xfe\xd9\x8c\x86\xe9\xf0\x7e\x78\x35\x7b\x5b\xd5\x66\xb1\xd5\x4a\x76\x5b\x29\x09\x0e\xc0\x00\x11\x5b\x24\x03\x44\xfa\xf3\x3b\xdd\x25\xfe\x18\xda\x1e\xba\x6e\xbe\xc6\x3f\x09\x1f\x43\x5a\xe1\x6f\x2b\x8c\x10\xd5\xc4\x99\x4d\x02\xbe\x54\x4f\xbd\xc9\x78\xa0\xe7\x13\xbb\x9a\x61\x9e\x47\x3b\xd0\x50\xf2\xdd\x53\x2e\x86\x3f\x57\x75\xd0\xd6\x69\xf2\x06\x9d\x75\xf3\x44\xa9\xeb\x77\x1b\xc1\x76\x4e\xd2\x7c\x44\x33\x9c\xfc\x3d\x79\x84\xde\x2b\x58\x4f\xd2\x4d\x2c\xfb\x46\x35\x44\x29\x88\x5d\x19\xac\x8c\xfa\xdd\x76\x35\x07\xf0\x84\xd1\x3d\x78\xb3\x05\x31\xcf\xb6\xd4\x15\x0a\x8c\x1f\xfc\x34\x27\xe0\xa4\xa8\x25\x4a\xad\x18\xc7\x55\x97\x99\xb8\xae\xca\x0d\xdc\x7d\xfc\x15\x3e\x26\xf5\xfd\x6d\xbe\x21\xb4\x7f\xcd\x95\xdb\x7d\xf2\xf5\x37\xc8\xbd\x7d\xfd\x89\x7b\xfb\xf8\xdc\xdb\x4f\x27\xcf\x7f\x36\x17\xa7\xb8\xa5\xef\x31\x72\x9c\xf7\xae\x3c\xcb\xe7\x57\x79\x99\xd1\xd3\xb2\x86\x73\x53\x75\xf8\x8c\x95\x4a\xb0\x66\x15\xf1\xd7\x90\x36\xae\x88\xe4\xb0\x7c\xdf\xf3\x5f\x8e\x4f\x4e\x7f\x39\x3e\x38\xdd\x3d\x39\x79\x75\xf8\xc3\x2f\x27\x07\xa6\xb0\x6a\x46\x89\x49\xab\x59\x77\xfc\x2a\x5e\xbe\x3a\x7a\x79\xf0\xea\xe4\x3f\x56\xd7\x20\x39\xa9\x82\x9f\x76\x8f\x4f\x7f\x38\x3a\xfa\xf9\x60\xf7\xc5\xe9\xaf\xbb\x3f\xff\x52\xdf\x85\x4a\x4e\x57\xc1\xf1\x21\x68\x9b\x9f\x3d\x3b\xd8\x33\x4b\xb7\xac\xbc\xce\xe8\x8a\xbf\xf8\xe5\xf9\xc1\xab\xc3\xbd\x35\xda\xf7\x72\xba\x0a\x5e\x1e\x1d\x1f\x9e\x1c\xfe\x7a\x10\xd6\x64\x68\x46\x7d\x5d\xf1\x42\xae\xd2\xa3\x5f\x0f\x5e\xfd\x7c\xb4\xbb\x7f\xb0\x1f\x4e\xd0\xd2\x6a\xeb\x8a\xf1\x9a\x5f\xa4\xe5\xf1\xaf\x3f\x92\x27\x67\x6c\x73\x74\xec\x03\xd3\xd9\x77\x04\x4e\x3f\x4f\x13\x2b\xad\xf0\x53\x76\xc8\x28\xcd\xd4\x6f\xf2\x90\xc8\x3c\x28\xca\xa1\xdd\xfd\xaf\x00\xe8\xf0\x2c\x4b\xe1\x79\xba\x32\x83\xa8\x29\x1b\x17\xf3\xf9\xb4\xbb\xbd\x7d\x75\x75\xd5\xb9\x7a\xd2\x29\x66\xe7\xdb\x27\xaf\xb6\x4d\xcb\x8f\x1e\x6d\x0f\x29\xeb\xff\xf8\x21\x2d\xf3\xfe\x31\x4a\x40\xcd\x4f\x17\xcc\xf3\x51\xe7\x11\x7b\x14\x3a\x81\x3c\x4e\x7a\xec\x04\x5b\x43\xc4\x3d\xb4\x5f\xdc\x9d\x9b\xc3\x7a\xb6\x98\x9b\x33\xfc\x2a\x3b\x3f\x78\x37\x55\x90\x70\xa0\xfd\xee\x80\x49\x08\x75\x72\xfb\x7f\x37\x07\x86\x11\x7a\x0f\xe6\x6e\xad\x07\xaf\xd3\x07\xbf\x9f\xbe\x81\xff\xfd\xcf\xc1\x69\xe7\x3f\x1f\xbc\xb9\xff\x3f\x81\x5b\x42\xc3\xd8\x97\x2e\x6c\xbb\xc4\x87\x70\xd1\x76\xc5\xcd\x45\xe5\xe2\xa4\x6d\x51\x3f\x64\x53\xe5\x87\x2f\x5f\xf6\x2e\xd2\x59\x99\x55\x12\xca\xf2\x1f\xd9\xb5\xff\x91\x4c\x04\xd5\x17\x78\x52\x3d\x33\x3f\x8f\x51\x06\xd1\x8d\xd1\x89\xf7\xd5\x83\xab\x0a\x9f\x18\x9a\x5b\x9a\xc7\x04\xc8\x6e\x62\xc5\x25\xab\xdf\x3b\x70\x75\xe8\xd6\xd6\xbb\x98\x17\x70\x55\x02\x9c\x87\x2e\xb5\xbd\x8d\x49\xcf\xcc\x8e\x44\x09\xc8\xb4\x18\x5d\x1b\xe2\x6d\xee\xc8\xed\x09\x3c\x26\x47\xf9\xef\x04\x78\xb7\x2b\xb9\x9e\xe7\xef\xf2\x49\xa5\xec\xd2\x86\x5f\x8e\xd2\xeb\xda\x0c\xfd\x6c\x34\x7a\x09\x17\xce\xe4\x5c\x77\x0c\x3e\x1f\x4f\xd3\x7e\xf8\xd9\x2c\xcb\x31\x2c\x4b\xdd\xac\xe0\x23\x3f\x1b\x74\x23\xa4\xb5\x76\xd2\xf1\x15\x7d\xb8\x5f\x5f\xa9\x19\xe9\x49\x81\x1a\x05\xcc\x8a\xfa\x61\x73\x1c\xe1\xa4\x72\x88\x48\x50\x91\x82\x45\xd2\x24\x83\x3d\x92\xce\x50\x07\x02\xb7\x53\xc7\x94\xb2\xbb\x7e\x47\x6a\x23\x4d\x49\x31\x7b\x8b\x9a\x52\x38\x39\xb6\x22\x53\xb0\x40\xe9\x1f\xc4\xe7\xa2\xc7\x2c\x84\xff\x47\xf5\xd1\xe1\xc1\x37\x1d\xc3\x62\x4c\xcc\xeb\x32\xc7\xe7\xb4\xed\x9e\x49\xb1\x4e\x07\x25\xc7\x8d\x82\xee\xc1\x53\xa4\x2c\x24\x96\x17\x07\x8d\x87\x7e\xa1\x4d\x89\xf4\x2b\x71\x2b\x6a\x9b\xa4\x48\x6e\x41\x55\x88\x34\x26\xd7\xab\xe9\xa4\x9f\x7b\x50\x98\xe6\x6d\x97\x7c\x34\x51\x91\x73\xa2\x86\x86\x43\x62\x98\x39\xc0\xa1\x1b\x9e\xd9\x34\xd0\x71\x6b\x41\xb8\x81\x4c\x0b\xbf\x8f\x1d\xa0\xc8\xfa\xf2\x5a\x16\xe0\x02\x5d\x7b\xe4\xe2\xb7\x86\x2d\x6a\x76\x9c\x77\x96\xf9\xe5\x16\xf9\x74\x60\x38\x24\x08\xbf\x53\x49\x7a\x37\x7f\x9e\x4d\x16\x4b\x36\xa8\xc9\x34\xf3\x3b\xb9\xc6\x0e\x2d\x8a\xd9\xa0\xf4\xda\x9a\x15\x65\x79\x64\x58\xb1\xdc\xeb\xf0\x00\xdf\x8e\xa4\x80\x66\x09\x67\xef\x3b\xb6\x72\xdb\xfe\x7b\x0f\xc8\x55\x89\x76\x1e\xe5\xac\x4f\x60\x95\x50\x24\x3b\xc9\x61\xc2\xeb\xba\x3c\x00\x38\x93\xda\x03\x6c\x58\x3b\xaf\x07\x79\x09\xf3\x32\xd8\x8c\xee\x0d\x8a\xab\x09\x60\x98\x76\x97\xde\xdd\x9c\x77\x96\x9e\x9f\x87\x73\x6f\x68\x25\x60\x32\xe8\x4f\x20\x0d\xab\x1f\x14\xa4\xee\x32\xf1\x5e\x96\xe7\x40\x2a\x5e\x96\xe9\x39\x86\x6f\x59\x9e\xe7\x45\xf1\x2b\x7b\xa7\xd4\x4e\x25\x64\x23\xa9\xd1\x92\xaa\x66\xe6\x70\xfc\x50\x90\xa5\x7c\x5d\xa6\x8b\x2c\x1d\xa0\xb0\xde\xcd\xc6\x05\xaa\x3c\x96\x14\xc9\x07\x83\x4d\x6f\xab\x0b\x53\xa5\xd7\xc6\x2c\x1b\x86\xbf\x7f\x4e\x7d\x0a\x7e\x31\x1f\x8f\xcc\xb6\xf4\x3f\xcd\xa7\x07\x86\xe7\xbe\xd4\x1f\xf3\xbe\x7f\xad\xe6\x31\x9a\xce\x86\x02\xe9\x59\x36\xd2\x79\x47\x41\x9b\xa0\xc4\xae\x1f\x39\xd8\xcd\x6d\x74\x1a\xcd\x15\xad\x6b\x1f\xa7\x93\x7c\x98\x2d\x6b\x61\x6c\xd6\x34\x9f\xfc\xc4\x2b\xa0\x4b\xc2\xf7\xdf\xf2\xc1\xfc\xc2\xff\xfc\x2e\xf8\x49\x0f\xff\x25\x0d\x64\x83\x3c\x5d\x91\xfc\xe3\xac\x58\x4c\xbd\x7a\x79\xd3\xaa\x2f\x3e\x31\x11\xb7\xb4\x8d\x26\x67\x6c\xee\x93\xcd\xae\xdf\x09\x52\x7b\xd7\xec\x64\xf5\x41\x31\x37\xd0\x64\x49\xe2\x3c\x1f\x2f\xc6\xba\x4a\xb6\xcd\xf0\x3e\x81\xf8\xf6\xa2\x18\xe1\x39\x52\x9f\x0b\xc0\x67\xf7\xbe\xcc\x32\xa2\x4c\xee\xd3\x2c\x1d\xe4\x45\x65\x3e\xc1\xb6\xe2\x68\x32\xba\xde\x68\xf0\x33\x7f\xe7\x0a\x0c\x55\xed\xe0\xcc\xd5\xb1\x84\x16\xc1\x75\x7c\xcb\xdb\xcf\x14\x0d\x6f\xbf\xd2\x5c\xf9\x67\x85\xb7\x17\x11\xb3\xa3\xf2\xa1\xbe\xbb\xa5\xb9\xa7\x46\xa3\x80\x89\x2b\xb3\x74\x0c\x7c\xc1\x66\xc4\x86\xb4\x09\x1b\xee\xad\xf2\x22\x0d\xfa\x6b\x18\xda\x5b\xce\x10\x14\x8d\xf6\x99\x93\x71\xf6\x56\x56\x32\x35\x8c\xed\x1e\x30\xa9\x5e\xaf\x66\xfd\xe0\xe7\x7e\xd1\xaf\xa5\x77\x26\x79\x29\x0f\x8c\xc2\xb9\x6e\xf5\x6d\x2e\xa9\x99\xb7\x6d\x51\x8a\xa4\x3f\x18\xbe\x06\x43\x81\xf9\xdf\xe8\x56\x52\x5f\xf2\x79\x50\x2c\xb8\x7e\x01\xe3\x29\xf5\x5a\x42\xb9\x7d\xfd\xf2\x69\xe9\x02\x15\xb8\x22\xca\x58\x37\xce\xab\x71\x31\xa8\x39\x0c\xe1\x33\xf0\x45\x31\x79\x50\xae\x78\x0a\xf2\x7b\x66\x2f\x9d\x1a\xd6\x0e\x1e\x3e\xa4\xf7\xc2\x97\xd3\x0c\xc4\x57\x64\x5c\x45\x2c\x71\x86\x32\xaf\xe7\xc5\x19\x48\xba\x8e\xd3\xa1\x79\xa6\xc2\xf5\x2d\x15\xbd\xcd\xae\xcf\x0a\x68\xeb\x22\x97\x90\xc4\x41\xe5\xde\xdb\xcd\xb5\x11\x3c\xce\xf2\x79\x36\x86\xee\xb6\xf1\xaf\x63\x38\x6c\xf4\x27\x22\x52\x41\x7f\x54\xa3\xcf\x73\x73\xda\x80\x03\x94\x4e\x76\x92\xe3\x2c\x4b\xf8\xad\x5f\x9a\xa7\xd1\x38\xc5\xb7\xfe\xa0\xe8\x97\xdb\x80\x8b\x69\xee\x62\xba\x5c\xb9\x99\xfa\xb9\xb6\xcd\x6f\x76\x68\xa5\xab\x4b\xdf\x56\x90\xe9\x70\x9f\x95\x7d\xd9\xf8\x55\x36\x94\x91\x55\x87\x04\xcc\xeb\x15\x84\x24\x3e\x5b\xcc\xa5\x3c\x1a\x94\x9a\x83\xd5\xcf\x87\x79\x66\x65\x91\xf0\xff\xbf\xfd\xb4\x7b\xf2\xdb\x8f\x98\xe6\xa4\x2e\x30\x29\x52\x14\xe6\xa6\x34\x93\x03\x33\xd1\x81\x6c\x9d\x2b\xf3\x92\xb9\x3a\xc7\x69\xa2\xfb\x2f\x3d\xcf\xb6\xc7\xd2\x0d\x9c\xb2\xff\x61\x7f\x3e\x18\x14\xe3\x07\x66\x49\xed\x58\x97\xbd\x22\x79\x6c\x4b\xa7\xc2\x3d\xae\x4a\xb5\xd3\x60\x26\x8e\xcc\x95\xf7\xe3\x2c\x9d\x5e\xc0\xf8\xcc\xd5\x0d\xba\xdc\x73\xde\x59\x52\x2a\xd8\x3c\x87\x07\xa8\xe5\x56\xef\x3c\x02\x35\xe4\x17\x88\xa9\x16\x5e\xfd\x67\xd9\x45\x7a\x99\xf3\x2e\x5a\x4c\x88\xcc\x12\x7b\x5d\xed\xe8\x16\x6a\xcf\x50\x80\x66\x5f\xb5\x68\x45\xdf\x75\x66\xb2\x5a\x7a\xd2\xa0\xdf\x0f\xfa\xf4\xa1\xd1\x0e\x1f\x79\x0d\xfc\xbb\x11\xf0\x86\x0d\x33\xe2\x46\x85\x39\x44\xa9\xd5\x03\xb8\x21\x2f\x1b\xaa\x23\x22\x71\xf2\xfb\x11\x1c\xb6\x06\x7c\xe8\xdb\x0f\x8d\x98\x58\x84\xf2\xf0\xcf\x46\xe4\x68\x72\x06\xfc\xa5\xd2\x59\x02\x82\xa9\x38\xa7\x8d\x50\xf6\x81\x49\x86\xe3\xb8\x6e\xd8\xc5\xe9\x99\x17\x4b\x01\x52\x0f\x0c\x55\x8a\x83\x4a\x47\x19\x99\x33\x42\x1a\x90\xd3\x5e\x1b\x1f\xf6\x86\x53\x79\x5b\x52\x00\x49\xfe\x0e\xb2\x88\x39\x7a\x24\xb9\x6d\x5c\x11\xe7\xc1\x6c\x7e\xb5\x8d\x50\x59\xb4\x6d\x61\xb3\x0e\xcb\x07\xd2\xb0\xff\x6e\x6a\xc8\xe7\x46\xc8\xbb\x37\xe0\x4f\x60\xa9\x1b\x55\xee\xa7\x81\x3f\xce\xe1\x47\xa3\x7a\xc1\x35\xf0\x07\x8a\x64\x1a\xfe\xcd\xd6\x30\x7f\x98\x03\xd9\xf0\x2f\x34\xf8\x0a\xbb\x64\x4b\x40\x17\x2b\x6a\x9f\xa8\x90\xd1\xea\x7c\xb4\x8c\xbf\xfb\xf8\xc9\x93\x76\x9d\x08\xbf\xfb\xf8\xcb\x2f\x51\xb7\xf3\xb7\x4f\xba\x9d\x8f\xaf\xdb\xf9\x39\x9f\xbc\xcd\x06\xa8\x9e\x63\xe9\xe1\xe6\x16\x39\x68\xda\x06\x15\xf9\x0a\x1a\xfb\x59\x74\x3a\xf8\x01\x9b\x3a\xc6\x23\x52\x46\xf2\xeb\x64\x6d\x59\xb3\x9b\x30\x16\xd2\x18\x7a\x69\xee\x20\x1c\xbe\x6d\xa2\x63\x8e\x12\x99\x69\xb4\x9c\x45\x5d\x38\x36\x16\x78\x5b\xe3\x82\x3d\xf1\x40\x74\x03\x00\x22\x8c\xa0\x45\x50\x92\xc0\xb5\x28\x1a\x08\xae\x17\x1a\xa3\x4c\xc8\xbf\xb1\x44\x9b\x0c\xb0\xb5\xa6\xca\x5c\x1d\x68\x54\x4e\x5e\x8e\xca\xd0\xc0\xa2\x70\xa0\x02\x16\x4b\xbf\x36\x9c\xc8\x1b\xbc\x5a\xb1\x08\x98\xed\x52\x5d\xe6\x9c\xf1\x60\x10\xff\xc3\xf4\x50\x0c\xde\x4a\x9c\x30\xf3\xa0\xe5\x78\x2e\x41\xe0\x00\x81\x08\x33\x15\x53\x07\xf1\x2f\x10\x77\x4e\x07\xd8\xdd\x17\x05\x10\xd3\xeb\x62\x81\x46\x38\x62\xa2\x0d\x4b\x6a\x32\x1e\x0d\x9b\x2d\xaa\x2f\x1f\x42\x9e\x06\xc2\x1d\x80\x91\xc5\x8f\x45\x01\x26\xd8\x7b\xa3\xa2\x04\x55\x06\x90\x65\xb3\xd3\x66\x66\xc3\x5e\x82\x7b\x01\x84\xb7\x19\x64\x61\x58\x02\x3b\x23\x37\x6a\x72\x72\xf6\x48\xc0\x29\xe6\x00\x39\xb8\x5b\x71\x3a\xb7\x84\xe3\x83\x54\x9c\x02\x65\x6c\x61\x7a\x18\x84\xa3\x07\x07\x4b\x5b\xb5\xe8\x4f\x82\xf9\x6d\xf3\xe7\xca\xee\x62\x7b\x54\xfc\xf4\x8f\xec\x9a\xbe\x92\xd9\x34\x4c\x06\xce\x84\x75\xf3\x8a\xd1\xbb\x70\x7b\x59\x52\xe7\x36\x7e\xf7\xf1\xb7\x7f\x6b\x47\xb7\x76\xf7\xc9\xa3\xaf\x91\xca\x7d\xf3\x09\x14\xe0\x2f\x25\x7d\x68\x39\x21\x68\xd8\xb7\x23\x7d\x70\xaf\x09\xec\x70\x48\xcf\x6c\xda\x66\x40\xd9\xac\xcf\x7c\xc5\x62\x0b\xb1\xd3\x81\xdd\xdf\x30\x7c\xdd\xbc\x98\x34\x48\xd5\x0e\xdb\xbb\x81\x1d\x3e\x2b\xde\xe9\x6f\xf9\xd8\x30\xc7\xfa\x03\x09\x11\xf5\x17\xe4\x0f\xbc\x0f\x10\x3c\x41\x7f\x28\x17\x67\xe3\x5c\xbe\xe0\x29\xb0\x1b\xf1\xd4\xb0\x86\xe6\x32\x27\x4f\x1c\x3c\x7f\x68\x73\x76\xb7\x60\x8b\x64\xb6\x06\x2c\xb3\x39\x9e\xa4\x2d\xa2\x7b\x85\xcc\xe4\xc0\xf6\x58\x67\x41\x9a\xaa\x33\xd0\x61\x6f\x70\x44\x1b\x5e\x6f\x24\x9f\xae\x2e\x7c\x38\x26\xb6\x68\x27\x39\x44\x62\xe7\x11\x43\x1b\x6c\x51\x15\x6c\x63\x2e\x53\xe7\x99\x61\xc0\xaf\x41\xa1\xf2\x9f\x8d\xb9\x57\xca\x75\x07\xda\xb8\x34\x87\x24\x41\x97\xdc\x08\xde\xcf\x5d\x07\xda\x6a\x79\x38\xcb\xbc\x18\xbf\x4a\x36\xbd\x16\x75\x0b\x75\x17\x4c\xa4\x4a\xdf\x6c\xc7\xff\xd7\xff\xf2\x12\x8b\xc9\x1e\xdd\x5c\x2b\x16\xc8\x9f\xba\x54\x6e\x4b\x08\xb7\xc5\x15\x90\x55\xab\xb7\x58\x76\x95\xf4\xfc\xeb\x42\x1b\x2c\xd9\x8a\x35\xda\x68\x90\xad\xc0\xc1\x8f\x57\x60\xcf\xad\xf3\x9f\xb9\x3e\xbc\xbd\xee\xba\x42\xd5\x23\x24\x15\xdb\x77\x71\x64\xb9\xec\x12\x45\x0e\x99\x94\x5f\x7b\xc1\x6c\x65\xaa\x34\xf4\x67\xad\xe3\xb5\xe1\xe2\xad\x02\xb2\x12\x8e\x2c\xab\xe0\xbb\x2a\x5b\xe2\x53\xfa\xa8\x2e\x1a\x6a\xab\xc9\x9e\xab\x60\x3d\x05\x42\x28\xc2\x46\x83\x7b\xb1\x2b\x9e\x39\xcc\xc7\x04\xc7\xbf\xc3\xdc\x9f\x54\xd3\x61\xe7\x7c\xcc\xa0\x3a\x7e\xab\x9e\xd7\x77\x1d\x77\xee\xed\xba\xae\x96\xa9\xae\xf3\x9c\xc5\x9b\xf7\x97\x76\xdf\x31\x2b\xde\xc3\x21\xf6\x94\xbc\x04\x04\x2f\x2c\x2e\x19\x91\x1c\xc6\xbc\xa5\x31\x0a\x63\x79\x51\x2c\x46\x03\xf4\xd9\x59\x90\x77\x23\xb2\x1c\xc5\x62\x0e\x80\x80\x82\x5b\x8a\xd7\x33\x78\x9b\x04\x95\x38\x2e\xbf\x0c\x9f\x12\x8e\x57\x90\x40\x11\xc0\xf7\x89\x58\x63\x2a\x57\x7d\xd7\x5a\x7f\xb2\x54\xd5\x32\x78\x38\x27\x84\x37\x43\x21\x8b\x6d\x5b\x7e\xe8\x2b\x46\x15\xc1\xec\xaf\x25\xf7\x1b\x3f\xd0\x5c\x52\x61\x10\x5e\xd3\x94\x03\x0b\x53\xc9\x1b\x6c\xf6\x68\xaa\x28\x49\xe2\xa9\xa2\x3c\xd6\xbd\xac\x84\x6f\xa2\x7f\x37\x5b\x61\xb2\x45\x42\x51\x45\x1b\xff\x41\x67\x1d\xc1\xc5\x01\xd7\x86\x97\x18\x9a\xc3\x98\xd2\xb4\x1c\xc3\x3c\x1b\x0d\x2c\xa2\x82\x17\x79\x13\x6b\xe9\xc9\xa0\x7a\xbc\x93\x67\x8c\x0f\x84\x8f\xaa\x59\x86\xfc\x6b\x8a\x1a\x20\x12\xb9\x61\x85\x78\x93\x04\x35\x11\x9a\x2d\xb4\xc6\x3b\xe8\x2c\xc3\xe0\x99\x66\xd4\x48\xb0\x7a\x03\x82\x8a\xc6\xc9\xee\x75\x92\x23\xb0\x9a\x00\xab\xc7\x76\x58\x13\x98\xa3\x64\x39\x1a\x55\xa8\xee\x81\xc2\x5f\xe6\xb8\x67\x43\x60\xe8\xe8\xe7\xf2\x58\xb1\x96\x32\x1f\x69\xe7\xfc\x77\xd8\x0d\x3c\x07\xff\x0d\xf6\x03\x5f\xec\x1f\x75\x47\x48\x99\x6e\xf0\xe4\xe8\xc0\x0e\xd9\x92\x69\x0e\xbc\x27\xe4\x0e\xc0\x22\x7b\xb2\x61\x6e\xe8\xfe\x03\x03\x14\x45\xec\x82\xc7\xfb\xfd\x9b\x98\xe4\x22\xe3\xa2\x3c\x12\xf4\x0e\xa7\x64\x5c\xa4\x62\x86\xe4\xda\x3d\xe3\x0d\x79\xff\x35\x20\x81\x8a\xf3\xe1\xa8\x8b\x31\x3e\xd7\x6d\xab\x1a\xd6\x56\x26\x48\xe0\xa8\x63\x95\xd4\x3a\xa3\x54\x72\x47\x3c\x4f\x3e\xcc\xdc\x09\xf3\x01\x6f\xc9\x45\x59\x3f\x89\x9a\x97\xa2\xda\xf4\xbf\xd8\xbc\xee\x55\x48\xc4\xd2\x99\x55\xf7\x70\x65\x6e\xab\x8c\xe9\x92\xd9\xd5\x17\xfa\x3a\xf3\xcb\xf9\x3f\xec\x0c\x3b\xe8\x7c\x66\x66\x04\xf7\xde\x9b\x54\x4b\xdf\x6a\x37\xe7\x91\x3d\x55\x1f\x79\x7f\xd6\x71\x82\x3c\x79\x0e\x9b\xfa\x83\xad\x59\x1d\x03\xb7\x62\xb9\x64\xce\x56\xca\xbd\x1c\x2f\xb4\x01\xe8\x40\x20\x12\xe9\x3e\x79\xb8\x1e\x72\xe6\xb7\x1f\x54\x48\xf6\xe5\x27\x21\xd9\xfa\x42\xb2\xc2\x2c\x2c\xb9\x4c\xce\xd2\xa9\xa8\x08\x96\x08\xc3\x7e\x20\xb3\x53\x2c\x72\x30\xce\x41\xda\x19\x11\x8b\x45\x72\xfd\xe9\xf0\x98\x6b\x0b\xe3\xec\xbe\x9a\x65\xe3\xe2\xd2\xc3\x2c\xa2\x67\x2e\x7f\xa7\x17\x0c\x3e\x17\xaa\xb3\xc6\x2f\x86\xb9\xf9\xfd\x03\xa1\xf6\x61\x7a\xd7\xee\x6b\x1d\xbe\xaa\x2d\xac\xcb\x0f\x69\x99\x69\x06\xef\x16\x02\x01\x7c\x8c\x01\x98\xf0\x62\x02\xe0\x3a\x2d\xc3\x9a\x3c\x67\x20\xbc\x31\x7d\x43\x19\xbc\xe9\x17\x83\xd2\x34\xfc\xb7\x74\x58\x5e\x05\xa2\x3f\x04\xb7\x65\x4b\xa3\x99\xb7\x22\xa0\x47\x78\x69\x03\x14\xbb\xc9\x61\xde\x61\x40\x92\x5d\xbe\x61\x3a\x4f\x47\x84\xc0\x80\x28\x74\xa5\xd4\x67\x15\x01\x72\x51\xc2\xce\xe7\x48\xf1\xa0\xda\x5d\x4c\x4d\x0f\xda\x49\x0f\x1c\x84\x7b\x88\x60\x29\xbb\x1d\xda\x23\x8d\x2b\x4c\x3f\x3a\x10\x3b\xaf\x46\xf3\xc8\xc3\x58\x25\xdc\xf1\xdb\x87\x83\x9a\xa8\x38\x79\x8d\xc8\x1a\x77\xc2\xd5\x65\xfc\xef\x57\xb4\xb3\x4a\xea\x18\x8d\x87\x26\xcb\xd0\x97\x58\x08\xa8\x89\x0a\x73\x17\xe0\x97\xd5\x1d\x9f\x6a\xdb\xa2\x0f\xd1\xfb\x8a\xbf\x05\xbb\xab\xad\xc6\xb7\xa5\xf8\x4f\xf2\x15\x1c\xd9\x81\xae\x04\x7b\xac\x2d\x10\xc0\x9d\x31\x27\xb0\x8d\xdb\x6e\x8f\x81\x2a\x09\x3f\xfb\x0a\x39\x6d\x84\xc6\x9b\x64\xe9\xcc\xf0\xe7\x39\xba\xb0\x9b\x2a\x11\x03\x11\x0d\xd9\x9d\x17\x0d\x6a\xec\xa8\x2e\xb2\x99\xb4\xd0\x86\x18\x05\x00\xf2\x3a\x07\xf7\x49\x96\x41\x1c\x2b\x84\xaa\x90\xdd\xf8\x9b\x79\x15\xfc\x32\xc1\x93\xd0\x5d\xe2\xd7\x1b\x19\x93\xbb\x93\x23\x18\x56\x4b\x66\x82\xa8\x45\x25\x88\x61\xf5\x9e\xad\x6e\xb0\x4d\xaf\xda\x18\x99\xed\x3e\xfe\xea\xab\xdb\x40\xfa\xac\xbe\xa6\xbf\x7a\xf8\x49\x63\xff\xf1\x6f\x64\xb2\x6b\x23\xb3\xb6\x3d\x33\xa4\xb7\x0a\xb2\xe9\x36\x2a\xac\xcd\x20\xaf\xb1\x48\x36\x9e\xce\xaf\x9f\xc9\xad\xe8\x95\xf0\x92\x6c\x81\x0d\x83\x73\xf2\x16\xf1\x2d\xf8\x2c\x6c\xe6\x10\x20\xc4\x48\xe8\x0c\xa0\x15\x48\xf2\x92\x3e\xcc\x84\xa0\xaa\x01\x76\x66\x31\x79\x80\xc1\xed\x53\x8c\x4b\x87\x98\xab\xd6\x1d\x88\xc0\xdf\xc6\x59\x3a\x29\x31\x8c\xf2\x39\xb2\x0c\x54\x85\xc3\x93\x1e\x14\xb6\x39\xc2\x54\x03\xa7\x20\x32\x3c\x80\xea\x08\x25\xd1\xec\x89\xb3\xc5\x39\x90\xee\x62\x74\x89\xa1\x3e\x00\x13\x07\x14\xdb\x10\x46\x04\x26\x23\xa8\x57\xa2\x95\x28\xac\x0b\x6f\x43\x83\xc1\x41\x4e\x78\x45\x1c\xca\x9f\x7c\x91\xd8\xe2\x01\x8a\x42\x83\x67\xd7\xb5\x4d\x79\xd0\x70\xa6\xb5\xde\x1c\x20\xf1\xd1\xf0\xb4\x97\x34\x69\xec\x38\x99\x38\x91\x05\x02\x86\x98\x2d\xce\xd3\xa3\xec\x27\x96\xed\x34\x41\x26\xc2\x19\x67\xa9\x27\xa9\x0f\x62\x4f\x3c\xb1\x4b\xf0\x62\x76\xbe\xca\xcc\x9d\x3e\xa0\xa7\x5a\xcf\xdf\x11\xbd\x8e\x5f\x3e\x84\xed\xb0\xf5\xd0\x24\x9e\x58\x24\x68\x0b\x19\x42\x0c\x09\x1c\xe2\x89\x32\x4d\xa8\xeb\x0e\x56\x73\xb8\x9f\x98\xff\x33\xa7\xb7\xe7\x7f\x0f\x3b\x43\x2e\x3b\x37\x0c\x61\x42\xb7\xd6\x0b\xfc\xdb\x22\x9c\x08\x04\x4b\x28\x16\xd8\x55\xb0\x88\x0c\xc8\x5b\x8a\x7c\x9e\x37\xaf\x94\x02\xf0\xe1\x3f\x02\x6c\xc7\xec\x1d\xc4\x99\xa1\xf0\xf6\xa5\xc3\xa5\xf0\x3e\xab\xa7\xec\x12\x06\xc0\x1f\x61\xfc\xab\xa0\x40\x26\x7a\xa4\xde\xcd\xb8\x41\x04\xd6\x96\x92\x89\xcf\x64\xf3\x3f\xd5\x35\xb3\x3a\x40\x9e\xb1\xd8\x00\x65\x03\xf0\x28\xd6\x15\x14\x13\xdc\xe2\x5a\xea\xe8\xa7\x00\x1c\x82\x26\x41\x21\xf0\x42\x7d\xd4\xf3\x65\xbb\xdd\x9a\x76\xd4\xa0\xe6\xf9\x54\xcf\xdc\x97\x8f\xf1\x3e\x7c\x74\xdb\xfb\xf0\xd3\x0b\x75\xfd\xfb\xd0\x03\x93\x60\x54\x02\x67\x3c\x3c\xcd\x0a\xc3\x29\x76\xc6\xc5\xef\x86\xcf\x23\x0b\xeb\xff\xf7\x9f\x05\x30\xdf\xc5\x6c\x38\xdc\xce\xca\xaf\x1f\x0c\x66\xe9\x70\x4e\x56\x98\x65\x66\x2e\x4b\xaf\xbe\xf0\xc6\x74\xf0\xa6\x84\xd6\x43\xbb\xaf\xcd\x13\x51\x3a\x24\x5b\xd9\xe2\xac\x55\xe4\x0d\xeb\x80\xe1\xe1\x8c\x30\x38\xbc\x37\x02\x39\x1b\x7d\x52\xc0\xf2\xdb\x06\xde\x52\x0e\xc9\x8d\xad\x92\xb6\xf8\x30\xc1\x1b\x99\xea\xe0\x56\x6d\xb0\xa0\x8b\xb4\x3c\xba\x9a\x28\xd0\x05\x6e\xca\x79\x76\xfb\x39\x10\xd4\xc5\xc6\x94\x9b\x18\xc2\x82\xde\x06\x84\x98\xe2\x7e\x7e\x67\x6e\xa3\x73\x34\xd8\x76\xb1\xe5\x6c\xaa\x83\x51\x91\x3a\x8e\x69\x93\x3c\x75\xa5\x5e\xdb\xdc\x6f\x1c\xdc\xb2\xce\xea\xcf\x1a\x79\x66\xe6\x13\x27\x6c\xb4\xf5\xe3\xed\x61\x87\xef\xaa\x68\x31\x3e\x8d\xd9\x0a\xf6\xd1\xe0\x1e\x02\xd6\x60\x9d\x01\x45\x80\xb1\x98\x01\x4f\xf1\x2e\xcf\x08\x40\x75\x46\xe8\x5a\xb0\xc9\xa5\x9e\xbe\x39\xa1\xb2\x2c\xb8\x8e\xa8\x33\xb8\x42\x4d\xea\x4c\x59\x84\xe3\xc1\x40\x0c\xad\x2b\x46\x7f\xb7\x1a\x56\xac\x87\x1c\x86\x31\x98\x02\xba\x00\x9b\xbd\xfc\x80\x02\xe8\x96\xea\x85\x23\x5d\x2c\xaf\xc7\x67\x60\x10\x5e\x16\x04\x31\x78\x05\xa9\x52\xd5\x19\xe2\xbe\x4f\xca\x61\x36\x9b\xf1\xc3\x46\xad\x1f\xd8\xfe\x99\xa3\x04\x53\xe4\x23\xdb\xf8\x8b\x4e\xef\x09\xc8\x45\x86\x6f\x1e\x71\x2d\xc8\x48\xf1\x29\xd6\x82\x7f\x47\x29\xaa\x8a\xe6\x8d\x42\x90\x0a\x75\xa5\xcd\xed\x70\xf7\xbe\x7a\xfc\xc9\xee\xed\x2f\x22\x98\x0a\x67\xa7\xf6\x51\xb0\x96\x5c\xcc\x45\x2b\x05\xf6\x65\x0a\xd5\x42\xcc\x91\x63\x38\x0f\x66\x3c\x1c\x16\x0b\x4c\xa0\xfc\xc8\x21\xd3\x02\x06\x97\x9b\x2c\x36\xdc\x17\xc1\x23\x0b\x4d\x49\x76\x13\x31\xf5\x37\x87\x15\x21\x97\x6d\x03\x68\x91\x9f\x96\x68\xd5\x6a\xa5\x00\x04\x5e\x8e\xa2\x83\x2d\x8b\x7b\x9f\xf1\xf1\x16\xbc\xe2\x9e\x6d\xa0\xc7\xf0\xcc\xe6\x00\x4f\x2c\x22\x34\x42\x21\xb7\x0d\xf3\x67\x96\xa9\x67\xaa\x18\x92\x28\x8b\xcc\x07\xc0\xf6\x15\xe0\xfc\xf2\x79\x99\x8d\x86\x6d\x7c\x18\xa4\x13\x6b\xcd\x8a\x94\x20\x9d\x98\x65\x06\x51\x17\x45\xc1\x24\x61\x43\x5b\x1c\xfb\xcd\x42\x43\x3d\x63\xa8\x8f\x62\xaf\x80\x78\x0c\xd7\x2d\x37\x33\x70\x35\xc1\x95\x54\x26\x07\x86\x85\xdd\xe5\x0e\xbf\xa4\x91\xab\xd8\xf2\x40\x8b\x9e\x81\x6a\xb2\x7c\x66\x4f\x37\x14\xfa\x07\xc3\x22\xc2\x20\x24\x82\x07\x7e\xeb\x48\x57\xa1\x2e\x26\xda\x9a\x4e\x5b\xbb\xdc\xa7\x49\x24\xff\xb4\x98\x8a\xf4\x8c\x52\x91\x64\x48\x96\x76\x12\x74\x67\xc7\xd7\x2e\x50\x2e\xbc\xb3\x48\xd1\x51\x31\xe2\xc5\x4a\xc3\x41\x39\x15\x04\xde\x72\x57\x45\xfd\x74\xa4\x8f\xda\x49\xfa\xf8\x2f\x9f\x06\xee\xc6\x2d\x87\xaf\x4a\xab\x61\x5f\x18\x4a\xb1\x6a\xe0\xe6\xff\x9f\xfc\x8b\x0c\x1e\xbb\x72\xa7\x09\xb0\x35\xb8\x49\x18\x9a\x37\xc2\x3a\x73\x60\xfe\xff\x4b\xf3\xff\x5f\xfd\x0b\xcd\x85\xed\xd2\x9d\xe7\xc4\xab\xc9\xcd\x8d\x78\x4e\xbe\x32\xef\xf7\xb4\xf4\x67\x46\x9a\xa9\x9f\x8f\xdb\x1b\x18\xf2\xf4\xc8\x1f\x86\x80\x62\xdd\x6c\x3e\x78\x32\xbb\x66\xe3\xfe\x19\xf5\x4b\x53\x4b\xf3\x07\x9a\x73\x00\x41\x27\xe8\x53\x15\x6d\x06\x98\xd2\x98\x41\x5f\x4d\x7b\x2d\x1b\xa8\xc8\xd2\x62\x73\xd3\x31\x36\xbc\x7d\xac\x56\x93\x9a\x5e\xb8\xe5\xda\x2d\x61\x58\x5d\x4a\x83\xbe\x1e\xe7\xbf\x5b\x45\x4c\x6c\x53\x2c\xca\x0b\x37\xe5\xfe\x2a\xed\x1f\x3c\xdb\xfd\xe5\xe7\x93\xd3\x97\x47\x47\x3f\x9f\x1e\x1f\xfe\x3f\x80\xc5\xf5\xe8\xe1\x4e\x25\xed\xe0\x95\x49\xa8\x50\x7e\xe5\x06\xb3\x38\x27\x24\x9a\x1e\xb0\x3f\x7b\x0e\x06\xbf\xc7\x6a\x05\x9a\xd5\x94\x44\x62\xb0\x1e\x49\x4a\x45\x60\x39\xd0\xdc\x05\x9d\x52\xf8\xf2\xe7\xfb\x0c\xb1\x0e\x51\xc4\x3e\xba\x6e\xd1\xdd\x86\xa0\x3f\x78\xa5\xc9\x5b\x01\x92\xc9\x1c\x06\x2e\x68\x93\x10\xf4\x00\xaa\x03\xeb\x4d\x00\xa1\x25\x5e\x07\x5c\x4c\x38\x9c\x50\x4f\xe6\xaf\x67\xcd\x45\xdb\xce\xf3\xc5\x06\xc2\x41\xbc\x7f\xaf\xc1\x9e\x5b\xb2\x5e\x52\xb8\x3d\x54\x26\xcd\x62\x4a\x8c\x53\x2b\x04\x79\x7d\x66\xad\x03\x82\x2e\x26\xfa\x6f\xf2\xb7\x24\xce\x6a\x51\x92\x16\x0c\x0d\xe0\x3b\xf1\xba\x98\xfd\x20\xb0\xac\xfc\x77\x9c\x62\xfa\xe6\xee\x6c\x8d\x99\xa8\x0f\x62\xd0\x8f\x36\x17\x74\xe7\xf2\x45\x76\x25\x47\x33\xc8\x0b\xfb\x48\x52\xbd\xfd\x66\xb2\xbe\x7e\xe3\xa5\x9a\x97\x1f\xf1\x76\x26\x89\x7b\xfb\xfe\x7d\xb0\xbd\xe4\xb4\xdc\xb3\xa5\xc2\x9d\x5d\x49\x00\xd8\xb8\x70\xfb\xca\xe1\xb1\x99\xe5\x98\x3f\xad\x10\xa4\x1d\xf7\x38\x90\xdc\x3b\xf6\x5c\xf8\x60\xce\xd0\x01\x3d\x85\x5d\xef\x17\x90\x96\xca\xd1\xe8\x56\x3f\x41\xbe\x0a\xb7\xd0\xad\x7e\xc2\x7c\xd5\xeb\xb5\x1b\xfb\x08\x79\xab\xb7\x50\x37\xf2\x2d\x2e\x5c\x52\xe3\xdc\x40\x87\xb3\x52\xe1\xf2\x29\xa2\xe8\x5f\xf5\x88\x42\xf5\x9a\x60\x60\x26\xe7\xa3\xe2\x0c\x54\xda\xa7\xa7\xaf\x0e\x76\xf7\x4e\x4e\xf7\x0f\x7e\x3d\x31\x47\xe5\xf8\xf4\xc7\x9f\x8f\x7e\xd8\xfd\xf9\xf4\xa7\xa3\xa3\x7f\x9c\x9e\x2e\x53\xc0\xf8\x01\x82\xe3\x31\x44\x31\xd5\x73\xa6\xdc\xbb\xc8\x47\x03\x73\x6f\x46\x2c\x2c\x24\xc9\xcf\x6f\x45\xe3\x91\x02\x92\xe6\x97\xa8\xe2\xac\xbb\xef\x41\xdd\x14\x88\x21\x56\x33\xa6\xf8\xb9\x49\x16\x73\x74\x35\x89\xda\x87\xe8\x64\xaf\x1c\x87\x8f\x88\x14\xe1\x94\x58\x6e\xc6\xac\x09\xf1\xdc\xa3\x59\xbc\xf2\x14\x05\x23\x2c\x62\xbe\x86\xb9\x08\xa4\xb6\x7e\x72\xc3\x2c\x7e\x79\x32\x23\x3d\x14\xb0\xcb\x58\xf9\x20\x8b\x57\xde\x8f\xf2\x14\x5b\xad\x20\x87\x57\x1a\x0d\x3b\x22\x65\xf0\xbb\x97\xf3\x65\x36\x1b\xc6\x5c\xdc\xcc\x67\x3f\xdf\xba\xfe\x70\xb6\x04\xa8\x82\x26\xfd\x7c\x14\xdd\x0b\x2e\xd1\x77\x24\x06\x32\x34\x7b\x85\x66\x14\xc0\xab\x44\x7c\x89\xfd\x1c\x9b\x07\x05\x00\x44\x79\x36\x1e\x09\x0c\x8a\x5c\x82\xe4\x05\xde\x0a\xcf\x9c\x9f\xd3\x7e\xc6\xd6\xa3\x6b\xc9\x28\xa7\x4d\xe9\x9e\x17\x27\x45\x2c\x3e\xf8\xa7\x1f\x44\x65\x47\xe5\x37\x44\x1b\x69\x64\x34\x3f\x27\x72\xfe\x91\xd9\x82\x75\xd5\xab\x34\xd3\x9d\x0d\x83\xa1\x2e\xeb\xb9\x3d\x60\xe1\x10\x92\xa5\x03\x08\x8b\xd9\x91\x24\xcb\xc6\xa1\x4a\x79\x03\x62\xf3\x2c\x36\x02\x7f\xea\xb6\x75\x67\x6c\x78\x15\x00\x61\x6d\xe0\xa7\x46\x1b\x9c\x21\x21\x93\xf9\xcb\x9d\x86\x0e\x7d\x6b\x69\x7b\x37\x66\x5b\x84\xdc\x8a\xef\xc7\x18\xe0\x75\x3c\x42\xdc\x31\x9f\x2c\x94\x1c\x98\x58\x84\xe9\xfc\x99\x61\x38\xd0\x20\x25\xc8\x81\x1f\x19\x48\x0b\xc1\xac\xec\xee\xda\x62\x53\x71\x4b\x60\xba\x01\xc1\x67\x3c\x8e\xae\xa5\x58\xf0\xe1\xa5\xf3\x58\xf1\x0f\x27\x24\x32\x98\xbe\x61\x00\xfd\x90\xea\xc2\x6f\x90\x4d\xfc\x2f\x1c\x71\x3d\x12\xa9\x13\xaf\xab\x8e\x1f\x92\x1d\xf8\x43\xaf\xdc\x8e\xf4\x9c\x96\x17\xaf\x95\xae\xba\x7a\x3a\xea\x7b\x3b\xdc\x62\x5d\xff\x67\x3b\xd8\x14\x5d\xef\x57\x3b\xdc\x69\x5d\xff\xa7\x4b\x67\xaf\x1e\x3b\x52\x84\x1c\x90\x01\x6e\x6f\x27\x7b\x56\x8f\x00\xa1\xad\x8b\x69\x27\x01\x23\x22\xfd\x8e\xb8\x64\x90\x34\x02\xe6\x9c\x41\x7c\x0b\xac\x84\x31\x61\x98\x1d\x1e\x93\x49\x8f\x4c\x80\xf0\xfc\xbb\x93\x01\xd1\xac\x70\x31\x69\x0f\x2e\xc9\xb7\xa2\x9a\x1f\xae\x01\x02\x67\xbd\xaa\x20\x2f\x31\xbd\x96\xd2\x75\xf5\x8f\x36\x72\xf5\x13\x44\x68\xa3\xff\xba\x2f\x27\xc5\x31\x2a\xd8\xbb\x51\x42\xdd\xf1\x33\xf9\xc5\xe0\x15\x0a\xa1\x1a\x17\xd3\x95\x85\x5d\x56\xa8\x62\x41\x26\x5c\xb6\xff\xbb\x73\xea\xb2\x1a\x6d\x3c\x0b\x6e\xf5\x12\x09\x86\xdd\x36\x1e\x49\xf4\x13\x21\x3b\xf8\x9e\x30\x4f\xd3\xf5\x78\x9f\x8e\x4a\x11\x0b\xb7\x9f\xe4\x6d\xfb\x6f\xc7\xff\x9e\x94\x53\xf0\xf6\x68\xb3\x8a\x87\xb0\x5e\x73\x92\x8c\x9b\xa7\xf6\x1c\x8d\x39\x40\x1a\x04\xdb\xe4\xf4\x94\x72\x77\xf9\xbe\xc2\x87\x05\x18\x5d\x4e\xfe\x29\xe1\xf4\x66\x66\x38\xf9\xd8\xca\x53\x06\xd9\xe5\xbc\x00\x5d\x11\xb1\xa3\xc9\x05\x34\xed\x43\xbd\xb2\x81\x42\x07\x2a\xda\xa5\xe8\x57\x18\x75\x3d\x3b\x5b\x9c\x9f\x63\x94\xad\x0b\x8e\xa5\x81\x85\x21\xf4\x12\x36\x07\x6e\x9a\xf4\x1d\x30\x97\x3a\x78\x31\x6c\x25\x12\x6f\x6a\x39\xdb\x1b\x0f\x18\xb6\x56\x51\xbe\x1a\xd1\xb8\xa0\x21\xe7\xb1\xc1\x7e\xb3\xeb\x94\x6c\xd2\xa1\xd5\xec\x64\xb7\xca\x80\x12\x49\x0d\x98\xa4\x6e\x94\xb9\xa2\xac\xcf\x15\x75\x7e\xee\x88\xb2\xe3\x54\xba\x21\x5f\x43\x19\x3c\x1e\xb0\x1b\xe7\x1e\x81\x1e\x90\x25\xf1\x86\xb7\xef\xdd\x60\xf3\x49\x2c\xb0\x1c\x37\x5d\x45\x75\x9b\x17\x53\x5c\x15\x89\xe9\x95\x8d\x86\x2d\xb2\x08\x12\xcb\xe0\xab\xac\x41\xb1\xd2\xf6\x2e\x66\x05\x78\xac\x59\x29\x0f\x05\x71\xe3\xbd\x3a\xc6\xc0\xac\x14\x05\xdb\x3a\x7d\x0a\xe4\xac\x54\x37\x42\xe8\x90\x21\x8a\xa6\x50\x06\x02\xde\x9a\x1d\xa7\x39\x4e\x2f\x73\x0c\x80\x08\xb7\xcd\x6c\xf7\x1c\x8f\x2d\x68\x97\x8f\x86\xcd\x06\x35\x6f\x36\xcd\xdf\x93\x07\x8f\x7c\x3d\xe8\x7a\xdb\xf7\xa9\xbf\x7d\xb5\x7a\x14\x08\xa8\x79\xd8\x77\xf0\xfc\x78\xde\x6c\xfb\x3c\x02\xe7\x6a\x9a\xec\x67\x97\x27\x05\x61\x7b\x81\x03\xda\x19\x22\x81\xc0\x44\x64\xa3\x62\x8a\x0b\x65\xde\xec\x86\xca\x65\x66\xb7\x75\x43\xff\x31\xb1\x67\x18\x9e\x19\x56\x65\x7b\x06\x15\x3e\x90\x39\x8c\xf9\x8d\x85\x7a\x72\xa8\x1a\x8e\x31\x83\xcd\xc3\x45\xfc\x9a\xf3\x9a\xf9\x2d\x2f\xf2\x31\x03\xee\x25\xbb\x10\xcd\xdc\x50\x3d\xfc\x6f\xdb\xfb\xe8\xcc\x06\xd0\x64\xac\x2e\xd1\x63\x64\xaa\xc9\xbc\x32\x75\xc9\x96\x4d\x32\x0c\x0b\x60\xc2\x40\x14\x38\xfe\x2d\xc2\x38\x95\x1b\x40\xe9\x25\x99\x79\xf8\xb7\xd9\xb5\x0d\xd8\x4d\x77\x8c\xca\x5f\x4e\x47\xf9\xbc\x36\xd5\xfc\x1e\x33\x40\x21\xcf\x4b\x6a\xe7\x85\x6b\x27\x16\x21\x68\x72\x38\xcb\xb2\xdf\x49\xc1\xff\x66\x27\xd0\xc2\xe7\x14\x18\x27\x4f\xbe\xab\x2c\x82\x35\x9e\xc8\xc3\xd8\x33\xf7\xc2\xac\xaf\xf3\x37\xb1\x8d\x97\x55\xdc\x28\x8f\x26\x08\x81\x30\x06\xeb\x85\x83\xe3\xaf\x70\x69\xb7\x71\x1c\xb6\x79\x30\x1e\xa4\x2d\x89\x7a\x4a\x10\xf7\x5e\xa6\xf9\x88\x70\xe5\xd6\xd8\x77\x57\xe9\x0c\x0c\xed\x1e\x08\x20\x7d\x6c\x03\xd6\xc4\xbd\xe1\x80\xcb\xd8\x7a\x87\x35\xc3\x66\x7e\x1a\x0f\x3b\x8f\x9e\x74\x9e\x34\x62\xa2\x33\xcc\xbb\x69\x60\x53\x2d\x30\xe9\x3e\xfe\xf2\xf1\x52\xb4\xb1\x76\x6d\x48\x1a\x5f\x92\x62\xbe\x7e\xdb\xf6\x05\x20\xdd\xc7\x5f\x3f\x6c\x57\x25\x28\xe6\xb3\x2a\xcf\xe2\x0f\xf3\xf1\xeb\x76\x54\xc0\x61\x52\x1c\x4c\x10\x48\x17\xcc\x87\x6f\xda\xb5\xb2\x83\xee\xe3\xbf\xb9\x7e\x54\x24\x03\xdd\xc7\xdf\x3c\x6e\x87\x42\x11\xf3\xf1\xab\xf0\xa3\x13\x79\x98\x54\xd7\xb3\x50\x56\xd0\x7d\xfc\xed\x97\x6d\x5f\x28\x60\x3e\xb9\x0e\xe0\xf3\xbf\xfb\xe4\xa1\xcb\x54\x75\xf0\x0a\xdf\xf1\xdd\x27\x8f\xdc\xfc\x84\xcf\x74\x93\x88\x75\xe9\x47\x76\xf7\x09\x19\xad\xbb\xe7\x74\xf7\xc9\x37\x31\x89\xe8\xa7\x38\xb3\x7f\x96\xf0\x93\x7d\x0b\xec\xb6\x5c\xee\x1b\xb6\xae\x28\xa5\xe2\x48\xe6\xd7\x1f\x42\xb8\xbd\xc2\x97\x14\x9a\x5b\xc1\xf3\x96\x1c\x6c\xc4\xb5\x06\xe8\x9c\x8f\xdb\x16\x0d\xf3\x06\xc6\xc5\x74\x22\x6e\xd0\x92\xd8\x5a\x0d\x57\x71\xdf\xc4\x38\xd7\x74\x3a\x65\xac\x36\x98\x9b\x39\x92\x55\xfc\x2d\x71\xe2\xec\x93\x29\x74\x29\xe1\x56\xd5\xb0\x91\xa2\x2d\x03\x1a\xab\x9f\x0e\x6b\x97\x1a\x9e\x15\x3c\x0b\x9f\x42\x9b\xfe\xc9\x67\x41\xfb\xd9\x7c\x7c\x57\x8c\x40\x77\xf0\xd3\xe2\xac\x56\x73\x00\xa1\xbc\xab\x25\x5e\x65\xe7\xb9\xe9\xc0\x75\x6d\x31\xc9\xe0\xcb\xd4\xd5\x20\xe5\x4c\x56\x84\xea\x61\x1e\xa9\x41\x62\x03\x3f\xcf\x60\xe0\xc1\x10\x83\xc4\xcd\xe5\xb5\x79\x89\x0d\x1f\x5b\x53\x4c\xdf\x78\x2d\x48\xf5\x6c\xd8\x16\xe3\x71\x4a\x1b\xab\x57\xb7\xa2\x3d\x86\xcc\x41\x6b\x4e\x10\x6f\xf0\x8e\x48\x1e\x24\x27\xc5\xf4\xc1\x08\x18\x79\x71\x27\xc1\x38\xa8\xa5\x95\x07\xa1\x77\xe5\xb8\x28\xe7\x6c\xf0\xee\x3b\x0a\x94\x04\x50\xb1\x45\x5e\xff\xa0\x35\x47\x45\x7d\xd1\xef\x2f\xc4\x44\x0c\xe3\x48\xa3\x62\xd2\x3c\x29\x10\x8c\x99\x68\x9e\x39\x84\x86\x1c\x94\xf9\x59\x6e\xd8\xda\x6b\x36\xa4\x4b\x12\xb5\x52\xe2\x78\x26\x5e\x2f\xfa\x49\x4f\x1e\x98\xd8\x00\xdb\xbb\x8a\xd5\x29\xb8\x9e\x60\x1c\x0f\xae\x8f\x46\xce\x46\xce\x8c\xa7\xc1\x5d\xc0\xbe\x82\x8f\x0a\x69\xd4\xb1\xd7\x65\xa4\xdb\x1d\x37\x5d\xbf\x01\xd7\xc9\x11\x8c\xb0\x13\x83\xec\xc1\x60\x61\x38\xf3\x3e\xc8\xcc\xd8\x89\x07\x44\x1a\x7d\x94\x78\x22\x2f\x2d\x33\x06\xcb\xf9\xb6\x3a\x63\x67\x68\x37\x6b\xcf\xee\x15\x45\xc0\xae\xb4\xfc\xac\x98\x5d\x01\xf4\x37\x1a\xfb\xc9\x62\x70\x83\x4d\x1b\x61\xdc\xec\xaa\xa2\x9f\xa7\xe4\x1a\x2b\x2b\x0b\x67\x59\x16\x94\x1b\xc6\x65\xcd\xe7\x2d\xc4\x05\xf6\x8f\x5b\xcf\xce\xb7\xe9\x10\x10\x7c\x34\x74\x48\xcb\xb7\xec\xd5\x53\xda\x98\xe1\x57\x4c\xa7\xa0\xbe\x42\x7c\x39\xd0\xf2\x22\xe2\x1a\x62\x37\x1c\xd8\x33\x06\x2d\x52\x13\x68\x78\xcc\x5c\x11\xd9\x36\xd2\xda\x81\xc3\x10\x98\x2e\xa7\x73\xb6\x87\x1c\xa3\x1c\x8b\x5b\xfe\x6c\x90\x97\x86\x4a\x1a\x5a\x55\x7e\xd6\x36\x8f\xd3\x12\xa0\x9a\xc0\xde\xc6\x1c\x08\xe7\x11\x05\x4b\x75\xb8\x5f\x8a\xe9\x04\x58\x58\x52\x2c\x63\xf8\xed\x85\x1d\xae\xeb\x22\xf6\xce\xb5\x45\x21\x87\xbc\xc1\x1d\x19\x5e\xf0\xd2\x10\x02\x68\x99\x1f\x29\xec\xf6\xc4\x7b\xf0\xda\xf4\x66\x2c\x67\xef\x8b\x07\xea\xdf\x17\x30\x12\xbc\xa6\xde\xe3\xeb\xd1\xf0\x03\xf0\xef\xbd\xfd\x5c\x93\x3b\x71\xd9\xf8\x9f\xfa\x7c\x19\x7e\xae\x6d\xd2\x9d\x39\xd5\xa4\xf9\xcb\x46\x4e\x5f\xde\x93\xa4\xee\x9f\xce\xfb\x45\x4d\x7f\xeb\x8a\x7c\xf1\x9e\x62\xeb\x63\xb7\xde\xaf\x57\xd8\xa5\xbd\x67\x5f\x2f\xfc\xdb\x75\xfb\xfd\x92\x6e\x5f\xd6\x77\xfb\xbd\xae\xfd\xbd\x2d\xec\x4d\x05\xd7\xba\x6c\x0a\x74\x65\xfa\x7b\xc7\xfc\xff\xdf\xdf\xfb\x1b\xee\x7d\xac\x32\xfc\x48\xeb\xc4\xc3\x7a\x5f\x49\xee\x84\x93\x64\x7f\x7e\xe1\xf7\xf5\x3d\x2a\x51\x52\x94\x3e\x95\xef\x6b\x36\x42\x6d\x65\xef\x4f\xd2\xa9\xed\x89\xf9\x3f\x3d\x4c\xe9\x99\x80\x28\x2c\xeb\xd9\x77\xb8\xd4\x7a\xb5\xcc\xff\x91\xdb\x3d\x91\x9b\xbb\x0f\x33\x31\x4f\x67\x73\xc7\xe4\xe6\xd0\xbe\x5f\xb6\x00\xb1\xca\x82\x7f\x75\xab\xb9\x72\x6b\xac\xb7\x05\x93\xff\x1d\x6b\x68\xcd\x93\xe3\x12\xdf\x1f\x80\xfb\xe8\xf6\xcf\x59\x7a\x99\xa9\x93\xf3\xc5\xb2\xc2\xd2\xe0\x17\x35\x27\x47\x6f\xf2\x0d\x0e\xfc\xfb\x24\x9d\xd2\xed\x08\x7c\x05\xf4\x90\x68\x8b\x57\xa7\xfb\x5c\x19\xcf\xb2\xcf\x91\x8e\x6d\x05\xf0\x43\x3c\x58\xcd\x5a\x98\xf7\x82\xa1\xfe\x3c\x07\x3f\x02\x75\x33\x2c\xf7\xcb\xc5\x6c\x5a\x98\x6b\x95\x76\x34\xcf\xc0\x31\xd2\x6b\x62\x79\x91\x99\x1b\xc1\x95\x7c\xfd\xb3\xb8\x6b\xa2\xa1\xdc\x1f\x37\xc2\xc0\x3d\x2f\x26\xb9\x39\x4a\x26\xe1\x18\xc3\xd3\x08\xf2\xed\x30\x1d\x95\xd9\x0e\x6b\x6f\x4d\x07\x0c\xc7\x65\x5d\xea\xf7\x10\x9a\x62\x86\x72\x36\x54\x91\x40\x68\x35\xbe\xd4\x47\xf9\xdb\xcc\xe2\xd8\x26\xe2\xfc\x8a\xde\x40\xc0\x37\x41\x0d\x73\xe7\x45\xcc\xde\xb1\x57\x19\x5d\xed\xe6\x56\x4b\xa1\xbe\x51\x71\x95\x31\xaa\x84\xb9\xea\x26\x49\x4f\xe2\x55\xf4\x5a\xed\x04\x24\x90\x68\x2b\x39\x57\xdf\x19\xc6\x80\x90\x08\x2c\x6b\x03\x75\x71\xbf\x28\xf0\x1f\x83\x19\x4c\xfa\xa3\x05\xd6\x6d\x2e\x65\x60\xc5\xc4\x67\x1a\x27\xf2\xb9\x59\x7b\xb2\x6f\x40\xfc\x90\x62\xfa\xc3\x68\x01\x61\x18\xce\xcc\x7f\x10\xa3\xdf\x7c\x12\x14\xa3\x06\xc1\x21\xd9\xcf\xe0\xc6\x88\x71\x1c\x72\x46\xf9\x87\x8f\x2e\x2a\xf3\xc1\x64\x00\xa9\xee\x83\x79\x38\x47\xb2\x1d\x53\xcc\x1a\x9d\x11\xbd\x89\x23\x59\x7f\x99\x52\x6c\x28\x9d\x97\xb0\xc7\x5d\x66\x15\x88\xaf\xc1\x61\xf9\xcc\x9c\x2d\x5c\x86\xe9\x35\xa6\x4c\xaf\xed\xa7\x05\x36\xbf\xb0\x2d\xee\x17\x0b\xb3\x5c\x32\xbc\xc1\xd9\xc8\x1b\xe1\xfe\x2c\x85\xd0\x08\x10\x8b\x4e\x7f\xa2\xd1\xc2\x57\x35\x4c\x4a\xc0\xb0\x52\x9c\x34\xcf\x66\x5e\xe2\xbb\x7c\x2e\x69\xe6\x4f\x9d\x84\xa4\x81\xd3\x46\xf0\xb7\x4e\x04\x3e\x86\xd3\x8a\x4b\xbf\x4a\x99\x4f\x48\xf3\x26\x72\x1f\xc3\xbc\x98\xef\xc5\x54\x3e\x49\xfc\x0a\x17\xbb\xc2\x7c\x3c\x04\xc0\x26\xf3\x11\x81\x9b\xe4\xe3\x3f\xb2\x6b\x50\x3a\x98\xcf\x6f\xb3\x6b\x50\xa0\xa8\x84\x97\x33\x0c\xe9\x04\x29\x53\xf8\x53\x25\xfd\x32\xa5\xef\x0b\xdb\xe4\xf3\xc2\x6c\x5a\xae\x6a\x0c\x7f\xeb\xca\x30\xf1\x79\x81\xe3\xc6\x44\xc0\xb2\xf0\x12\x8f\xb0\x6b\x98\x56\xb8\xde\x51\x12\xcd\x09\xa5\xa9\x49\xc1\x44\xec\x08\x26\xb9\xae\xbc\x4c\x4b\xdc\x4d\x53\xf8\xaf\x7c\x24\xc2\x00\x11\x29\xf0\x0f\xfb\x19\x83\xa3\xe4\x0e\x28\xaf\x51\xca\x17\xff\x54\x9c\xa0\xef\x21\xcd\xe0\x5c\xfe\xb6\x89\x60\x94\xb0\x07\xf2\x4f\x68\x01\x3d\xe7\xfb\xf8\xcb\xcb\x40\x5b\x09\x53\xd5\x5e\xc2\x24\x9e\x1b\x4c\xd3\x73\xe3\x5c\xa1\x25\xd5\x5b\xfa\xdf\x2e\x32\x6c\xf1\x0a\xfe\xdb\x20\x5d\x2f\x3d\x4d\x0d\x81\xcc\x26\x08\xbb\x3f\x29\x80\x68\x0d\xcd\x56\x9f\x97\xc8\xbc\x27\x7c\xc5\x5b\x7f\x2a\xa2\xcd\xce\x46\x5a\xe9\x6c\xad\x8d\xf2\x5c\x51\xce\xc3\x7d\xb3\x03\x40\xfe\x7e\x3a\x23\xcc\x7a\xfb\xbd\x61\x2e\x3a\x52\x8f\x34\x9f\xa7\xf3\x8b\xce\xcc\x70\xe1\xc5\xb8\xd9\x6a\x71\x90\xf9\xc7\x1e\x30\xd2\x79\x36\xb7\x04\xdd\x10\xdf\x7d\x26\x83\x4d\x54\xb8\xef\xb2\xf3\x37\xea\xae\x21\x68\x4a\x3b\xe9\x71\x02\xc6\x57\x49\x93\x0b\x78\x19\x73\x24\x4c\x7c\x0e\x72\xb4\x54\x34\x1e\xef\xf9\xde\x8a\x3d\xaa\x89\xe4\x32\x23\x10\xcb\x90\xc2\x64\x85\x67\x2b\xe9\x0e\xb8\xd9\x76\x75\x12\xac\xd7\x23\x67\x79\x5d\xc9\xf1\x06\xa5\x09\xf1\xab\xe7\x8b\x2f\x48\xd1\x51\xbd\xdc\x5e\xd7\xd7\xf7\x86\x2f\x3e\xd2\x8b\xb0\x5c\x70\xb3\x1a\x34\x64\xee\x12\xb9\x85\x92\x44\x10\x68\x84\x7a\xd6\xd2\xab\xca\xbe\xf1\x3a\x70\x79\x22\x5a\xc6\xbb\x14\x1e\x0e\x56\xc8\x51\x0f\x3c\x64\x4e\x8f\xf4\xab\xd9\x18\x5f\x9b\xbd\xd3\x4e\x1a\xe6\x18\x12\x49\x4e\xc6\xd6\x31\x1e\x64\x9c\x4e\x54\x48\x37\x24\x04\x55\xee\x53\x14\x8e\xcf\x66\x24\x6e\x4a\x49\xd9\x0d\xa2\x98\x66\xbc\x1e\xf4\x04\xa0\xa6\xac\x58\x0e\xc1\x3e\x50\x2a\xcb\xfb\xbc\xae\xbf\xd6\x19\xb5\xf9\xc7\x4d\xbb\x46\xa4\xd5\x26\x55\xb6\x15\x33\x93\x76\x05\x4d\xfe\xf9\x35\x9d\xf6\xdf\x66\x13\x27\xf2\xad\xca\x5b\x14\x1c\x86\x8d\x62\x1e\x89\x81\x1d\x82\x4a\x54\x2b\xe2\x9c\x14\x07\x8d\xaa\x8a\xb5\x66\x25\xbd\xd5\x44\xa7\x38\xac\xa6\x41\x0c\x64\xd2\xf4\x9c\x30\x78\x83\xd3\x26\xd6\xae\xf8\x85\x57\x80\xf3\x5b\xd5\x5f\x6d\xb1\x6a\xeb\xd6\x6c\x4f\x7f\x54\xc0\x48\x3e\x9a\xc8\x71\x06\x74\x8f\x83\x15\x17\x33\x76\xc2\xbc\x66\xab\xad\x81\x05\x81\x2c\x15\x5e\x6b\x36\x41\x98\xda\x58\xb0\x94\x33\xb0\xc9\x4f\x27\x37\x92\x27\x39\x01\x00\x6b\x43\x4c\x56\xd6\x03\x6b\x61\xe6\xed\x60\xc2\xd1\x74\xed\xdc\x73\x2e\x0d\x92\xb1\xc1\x6c\x04\xeb\xb4\x5e\xa1\x8e\xeb\x88\x6d\xbe\x76\x06\xad\xce\xc3\x8e\xbd\x3a\x66\x10\xeb\x54\x46\x9b\x97\xd5\xc1\x06\x1a\x8d\x7b\xf7\x64\xe7\x6c\x32\x66\x30\x29\xd9\x64\xb4\xb6\x23\xe6\x2a\xda\xb2\xdb\x2e\x18\xe6\x6f\x02\x07\x43\x92\x43\x02\x45\x4b\xf0\xd2\x55\x10\x41\x68\x86\xc2\x37\x95\x38\x04\xab\x6d\xf2\x2c\x07\x99\xe8\xbb\xe4\xf2\x9b\xce\xc3\x47\x49\x13\x0d\x54\x0a\x43\x38\x00\x98\x9e\xdc\x7c\x5b\x86\x48\x5e\xe4\x67\xf9\x1c\x01\x5e\x67\x08\x35\x2a\x11\xdb\xd0\x90\x8a\x2a\x42\xfa\x0d\x1c\x7c\xaf\x98\x58\x96\xa9\x27\x1d\x81\x48\xde\xc5\x38\xb3\xaf\x0b\x80\xbb\x27\x9c\x23\xdd\x3f\xaa\x89\x21\x7a\x08\x8d\xa8\xbc\x1e\x4f\xe7\xc5\x18\x42\xee\xcd\xb8\x24\x85\xed\x01\xe5\x3f\x02\xa0\x51\x35\xa6\x35\xf4\xfd\x42\x90\x82\x02\x40\xd2\x38\xbe\xd8\x7d\x44\x55\x48\xc1\xa8\x05\xb9\x09\x14\x9d\xa6\x73\xea\xaf\x19\x2b\xa0\xbb\x37\xd1\x69\x9b\xae\x02\x99\x33\xd8\x26\xe7\x88\x46\xd4\x22\x95\x0d\x54\xe5\x2e\x14\x27\x2e\x84\xb2\xfe\x98\x11\xbc\x00\xd1\xfc\xc8\x82\x27\xf9\xc9\xbc\xac\x2e\x41\x38\x4d\x5d\xa7\xba\xe8\x1e\x60\x7d\x51\x4f\x15\x8f\x2f\x5a\x9b\xa4\x8a\xf9\x9c\x04\xa0\xe6\xde\xe8\x9b\x49\x28\xb9\x63\x7d\x90\x34\x62\xc4\x76\x55\x93\x88\xb0\xd3\x51\x01\x36\x6f\xc0\x4a\xe5\x47\xc7\x2c\x5b\x6e\x27\xff\x5c\x94\x73\x88\x57\x88\x4a\x2e\xd4\xd0\xd8\x29\x8b\x8d\x93\x43\x18\x05\xdd\x42\xc1\x78\x1b\xd6\x17\xfc\xa0\xe6\x62\xf9\x24\xfd\x82\x7e\x10\x80\x1d\x5a\xca\x9b\x5e\xcb\x86\xd0\x1b\x0d\xfa\xad\x71\x81\xf8\x18\x97\x2e\x74\x24\xc4\x95\xa3\x7e\x63\x0c\x26\x00\x38\x39\x1b\x15\xe7\xdb\xe9\xac\x7f\x91\x5f\x66\xe5\xf6\xe3\x87\x8f\x1e\x6e\x3f\xfc\x76\x1b\x9f\x48\xa7\x58\xd9\xe9\x20\x1b\xd9\x00\x93\x5c\xe7\xee\xa8\x2c\x0c\x63\x86\x2f\x81\xde\x76\x4f\x5e\x0a\xf4\x27\xbc\x00\x7a\x02\x88\xc5\x6f\x65\x1e\x35\x19\x80\xc1\xd2\x1c\x1e\xb4\x25\xf2\xe3\x7d\x12\x6d\xbb\x9c\x36\xc0\x63\x84\x0e\x0b\x1a\x93\xbe\xfe\x31\x8c\x3f\xc5\xf2\x77\x02\xe8\xa4\x99\x75\xce\x3b\x88\x9f\x0d\x63\xe9\xb5\x6a\x80\x99\x38\x0c\xbc\x70\xa1\x74\xbd\x25\xf2\x93\x85\x00\x66\x44\x24\x7e\x96\x43\x30\xb3\xc4\x8e\xda\x03\xf7\x33\xa5\x3e\xf5\xfb\xd6\x8e\x37\xa2\x3d\x88\x99\x6d\x33\x57\x5c\x34\xab\x03\x77\xcc\x4b\xcb\xed\x99\xcc\xab\x58\x69\x57\x6e\x90\x4d\x41\xd1\x3d\xe9\xe7\x0e\x53\xcd\xd7\xdb\x75\x98\x20\x87\xbd\xdf\x57\x25\x5f\x87\x89\x62\xc0\xb4\x39\x6e\x1b\x94\xf2\xcd\x9e\xda\x09\xb8\x29\xea\x8e\x3a\x93\xa7\xe4\xbb\x64\x14\x58\x3e\x79\xa3\xba\x0e\x4a\xbe\xce\xdf\x68\x6c\xa8\x7b\xda\xea\xc9\xdc\x39\x6a\x16\x03\xd6\xbf\xe9\xaa\x6c\x61\xf4\x0f\x97\xf3\xb5\x4b\x7a\xd3\x52\xf5\xb5\x42\x40\x7d\xdd\xab\x18\xd0\x15\x3e\xdf\x7c\x2c\x7c\xf4\x49\x0e\x54\x8e\x4d\x7e\xdf\xb5\xfc\xac\x9b\x5d\xf8\x75\x40\x9f\xf2\x2f\xde\xb9\x76\x90\x8b\x7b\x12\x7e\xe6\x6d\xe6\x7d\x55\x46\x5d\x3e\x56\x75\x65\x74\x48\x61\xff\x75\x86\xa8\xba\x73\xdb\x71\xfa\x63\x00\xd9\x22\xb3\x05\x00\xef\x81\xa4\xbf\x4f\xf0\xa5\x9e\x17\x3b\x5d\xc0\x24\x9f\x50\x60\x70\xba\x9e\x15\x34\xdc\x3c\xb6\xb7\x89\xf0\x6f\xcf\xcd\x1d\x54\x6e\x53\x65\x2e\x2c\xf0\x5f\x38\xad\xfb\x47\xcf\x51\x62\x73\xec\xe4\x2f\x9b\x4d\xed\x56\x30\xc9\xeb\x9c\x30\x6a\xcc\xda\x18\xd3\xbf\xf8\x2e\x14\xb9\x10\x46\x2d\xbb\xf3\x3e\xf4\xe0\x69\x57\xce\x18\x75\xb3\x32\x65\xe5\x6d\xa7\x2a\xb6\x0b\x3f\xea\x92\x6f\x36\x80\x4d\xba\xf2\xdb\xe1\x8b\xfd\xa3\xdf\x4e\x7f\xda\x7d\xb1\xff\xf3\xc1\x07\xde\x1d\x28\x26\x0d\x23\x95\xac\x2a\x04\x82\xf4\xb5\x36\x14\x0b\x5f\xff\x8a\xfd\x84\x03\xab\xac\x86\x8e\x64\xec\xfe\xad\xdc\x4d\x1f\xbb\xb3\x30\xa1\x95\xbe\x5a\x3d\xc5\x46\x5d\x5d\x7a\xcd\xe0\xf0\xf3\x49\xf5\x8e\xc1\xc0\xda\x80\x7a\x97\xf4\x38\x4f\x0f\xf9\x69\xfa\x55\x2c\xe6\xf6\xd9\x45\x4c\x20\x31\xa8\x9b\xd2\xe6\x90\xbf\x7e\xf8\xcd\xf6\xc3\x2f\xb7\xc5\xf2\x67\x72\x7e\x6a\xd8\xca\x3f\x99\x50\x2f\xd9\x26\xf9\xe4\xcf\xd8\x28\x1b\xf5\x36\xba\x4f\x64\x89\x6e\x73\x9f\x6c\x79\xcb\x67\x2e\xe5\x71\xfa\x16\x8c\x99\xcc\xb5\x0c\xdb\x0f\xf7\x00\x45\x54\x0f\xc4\x9d\x28\xed\x90\x40\xec\x69\xff\x02\xfd\x9c\xfa\x99\xa6\x08\x8a\x5b\x8c\x0e\x04\xc4\xb8\x40\x18\x76\xd6\x2d\x84\x6b\x55\x2d\xa5\x76\x7c\xa0\xfa\x5b\xc2\xcf\xfa\x07\xe0\xc3\x2d\x9a\x6b\xc2\x5f\x8d\xa0\x67\x9a\x7f\xf6\x33\x56\x17\x4d\x2d\x99\x5a\xb0\x1a\x66\x3c\x98\x9d\x9b\x40\xa0\x55\x89\xa2\x90\xac\x17\x46\x41\x3e\x04\xa2\xab\x0f\x31\x6f\x1b\xc0\xec\x2b\x38\x48\x25\xbd\xaa\x90\xdb\x3f\x79\x50\x51\x52\x7f\xe7\x51\x59\x99\x1c\xb5\x85\x1c\x33\x8b\x0c\x98\x3d\x86\xb3\x39\xcb\x4a\x30\x05\x64\x49\x07\xc8\xef\xfa\x70\x18\x25\x0b\x86\xdd\x61\x08\xcc\x94\x05\x0c\xda\x22\x02\xcd\x8d\xc1\x90\x91\x00\xff\x9c\x75\x1b\x1a\xa7\xcd\xf2\xf3\x73\x82\x08\x80\x58\xf9\x66\x3e\xb4\x10\xe2\xc5\xd1\xc9\x41\x37\x39\x56\x9c\x7a\xe9\xcb\x39\x36\x90\xbb\x28\x9e\x3d\xe0\xd6\x09\xa6\x19\xb5\x78\xca\xac\xc1\xd9\x3a\x44\xa4\xaa\xf8\xc6\xad\xb1\x87\xf0\x5f\xcc\x66\x54\x66\xfe\x2e\xcc\x91\x09\x0c\x68\x3b\x9c\xa2\x4a\x96\xb7\x10\xd2\x77\xc6\xd4\x07\x55\x4d\x93\x6b\xb6\x67\xba\xde\x70\xc3\x1d\x63\x77\x7c\x71\x92\x50\x10\xc1\x96\x80\x7b\xc5\x64\x98\x9f\x97\xdd\xc0\x9e\xb9\x53\x97\xb1\x4d\x88\xa3\xbe\xe0\x82\x0c\xb2\xab\x95\xd4\xe4\xc3\x3a\x94\xee\xaa\x52\x4e\xa5\x61\x5e\x2b\x99\x89\xe4\x55\x69\x98\x17\x98\x81\x79\x56\x9b\xdd\x4f\x56\x25\x76\x47\x23\xab\xe3\xab\x29\xa5\xb3\x80\x57\xd4\x2a\x8f\x01\xbd\xba\xab\x70\xac\xfd\x06\xc1\x39\xea\x61\xbb\xc6\x24\xdc\xa4\x3d\x5a\xe1\x38\x55\x51\xab\x81\xa3\x11\x3a\x0e\x85\x96\xde\xdd\x27\xd4\x50\xc5\x44\xbb\xfb\xe4\x6f\x5f\xa2\x2f\xc3\xd7\x9f\x7c\x19\x3e\x82\x2f\x83\xf3\x4f\xa8\x75\x6d\xd8\x3b\x3e\x3e\x01\x88\x61\xec\xcb\x8f\xb3\x62\x31\xad\x75\x5f\x10\x3c\x8c\xd0\x1b\x60\x33\x43\x7e\x57\x55\xd0\xae\xec\x6b\x1f\x09\xa4\x89\x94\xc0\x6f\x30\x28\xf8\x59\x6b\xcb\x83\x1e\xaa\x8c\x48\x70\x5b\xd6\xac\xbe\xa6\x02\x6a\x66\x59\x3b\x41\x13\xe8\x42\x88\x1e\xea\x60\x11\x3d\x4a\xaf\x81\x3a\x75\x93\x46\x4d\xe9\x06\x51\xac\x30\xca\xec\xdc\xe6\xa2\xe2\xd4\x82\x0b\x10\x49\xe2\xf5\x4e\x5e\x72\x14\x22\x76\x97\x75\xc5\x76\xa7\xd3\x2c\x9d\x55\x0b\x82\x8e\x30\xcc\xcb\xa6\x52\xeb\x64\x65\xeb\xa8\x58\x56\x7b\x11\x80\xa7\x14\xf9\x2f\x42\x86\xb2\x5e\xb9\x28\xf7\x5d\xb5\xd7\x68\x18\xd8\xae\x24\x73\x47\x25\x92\x7d\xb4\x6b\x18\xd4\x1e\x6f\x26\xc7\xaf\x9c\x5e\x01\x2b\x04\xcb\xa9\x3a\xd3\x87\xdf\x0a\x00\xe4\x37\x42\xf7\x05\x5e\x46\x7c\xd6\xc9\x4f\x0c\xf2\x09\x8e\x8d\xe2\x56\xa0\xcc\xd2\xad\x07\xc7\xd8\x9c\xcd\x0c\xbc\x11\xc8\x5c\x8e\xa2\x68\x21\x77\x87\x26\x69\x88\x96\x28\x75\xa1\xb1\x19\x3c\x61\x47\x1c\xe6\x08\xbf\xc0\x2a\x57\x18\xc0\x9a\x16\x85\xbf\x73\xaf\x87\x09\x6e\x1e\x15\xb9\xd9\xdf\x57\x8e\xbb\x4f\x79\xe2\xa3\x59\x69\x55\x5c\xe6\x8c\x97\x21\x96\x17\x97\xc8\x65\x1d\xf1\xa2\xc4\xb2\xe2\x82\xc9\x5b\xc0\x05\xc9\x25\xe0\x1b\x8f\xdf\x14\x4c\x92\xba\x8d\xd4\xd4\xfc\x4f\x30\x33\xee\x09\xa4\x0c\x44\x5c\x7f\xda\xc9\x1f\x7a\x81\xb9\xab\x6e\xc3\xdc\x88\x06\x41\x2b\xa6\x97\x5d\xd0\xd5\xb5\xb1\xf7\xf3\x92\x5b\x15\x7e\x3d\x69\xaf\xa2\x45\x26\x93\x73\x29\x0e\xe9\x61\xf7\xc9\x63\xf2\x96\xfd\xdb\x27\xfc\xc0\x7f\xe9\xab\x96\xb1\x9d\x6e\x7b\xdf\x9a\x0a\xd1\x4e\xdb\xcb\xc2\x1f\x3d\x9f\x3e\xd7\xec\x01\x3d\x81\xaa\x95\x86\x59\x6c\x23\xeb\x00\x9f\x41\x3e\x46\x0d\xf0\x73\xf1\x47\x72\xc5\x53\xa1\x1a\x28\x46\x1a\xb9\xfd\x30\xc2\x17\x46\x7a\x10\x3f\x5f\xb0\xa8\x18\x81\x05\xb5\x50\x4d\x78\xfc\x4d\xf2\x71\xca\x56\xcc\x49\x31\xdb\xa2\xf0\x72\x13\x6b\xd9\xcc\x8a\x18\xc0\x26\x81\x6a\x00\x2a\x04\x1e\x98\xd9\x55\x69\x68\x2e\x8b\x88\x20\x7a\x06\xb9\x9e\x0d\x06\x5e\x9d\x5b\x14\x9e\x30\x67\x33\xf0\x2b\x06\x7c\x2a\xe7\x8b\xfe\x5b\x59\x79\xe8\x18\x78\xd1\xa1\x41\x03\x1b\x78\x67\xe0\x1b\x4c\x61\x10\xfd\xca\x6c\x38\x2b\x34\x03\x25\x9f\xbe\x21\x50\x73\x36\x7e\x6c\x43\x71\x30\x44\x40\x5b\x09\x9a\x09\x93\xc7\xea\xc2\xf3\xf1\x38\x1b\x80\x8f\x1a\xd8\x40\xc2\xfc\x9e\x1c\xee\xfd\x03\x50\x85\xff\x46\xd3\xfd\xe2\xe8\xf4\xe0\x57\xb3\x39\x4f\x4f\x0e\x9f\x1f\x1c\xfd\x72\x62\x92\xbe\x7a\xf8\xf0\x21\x2f\xda\xa4\x08\xed\xb0\x28\x66\xf7\xc6\xa0\x33\xd5\x8a\x2a\x94\x77\x6d\x8c\x69\xde\x0c\x42\x86\xbd\x9b\xbd\xe1\x96\xb2\xd9\x82\xab\x3b\xe7\xfb\x37\x9b\x61\x54\x70\x3d\xbd\xf6\xe9\xef\xb0\x2c\x1a\xd5\xfd\x11\xdb\x1c\x49\x3a\x44\xbb\x93\x7c\x0c\xb6\xcb\x49\x53\x55\xf0\x79\x39\x2e\x5b\x9d\x04\xa2\x94\xb3\x55\x18\x87\x1a\xe6\x48\xe8\x44\x59\x54\x01\x57\x3d\xec\x8f\x7f\x3b\x86\x26\x71\x57\xc1\xb1\x74\x9d\xd9\x76\xf9\x3a\x56\xf4\x19\x2e\x1e\x5d\x28\x09\xd9\x14\xd2\xc5\x62\xc1\xec\x36\xe0\x69\x37\x64\x38\xb1\x8a\x86\x08\xa7\x38\x45\x5d\xad\x76\x0c\x24\x96\x1a\xe6\x93\xbc\xbc\xd8\x63\x43\x32\x2f\x08\xcc\xd2\x78\x9c\x84\x49\x68\x7a\x86\xf6\x1e\x4f\x35\x07\x00\x4c\x49\xf2\x45\xd2\x78\x00\xe6\xc8\x5e\x73\xae\x68\x8a\x01\xde\xf6\x54\x05\xae\x32\x28\x4a\xe9\x8d\x1d\xd5\x1b\xdc\xb2\x27\xbc\xc8\x76\xeb\x4b\xba\xd9\x0d\xb1\xed\x9c\xf9\x08\x2d\x19\x98\x12\x64\x1c\xb4\x0a\x77\x35\x06\xed\x54\x1c\x15\x71\x1c\xbe\x08\x93\xca\x6e\x70\xbe\x98\xd5\x31\xcc\xd1\x8c\x3b\xdc\xf4\xfb\xaf\x20\x7f\xf8\x0f\x26\xf0\x1c\x95\x96\xd6\x1c\x23\x97\xba\x89\xb1\x85\xea\xf3\x06\xd3\x2a\xf1\x74\x2a\x9c\x13\xdd\x06\x5c\xc1\xc1\x64\xe0\x91\x03\xae\x4b\xcd\xa8\xab\xc7\xd0\xc0\x5f\xca\x05\x40\x8e\xd3\xd1\x11\x38\x6f\x17\xcb\x5b\xcc\x96\x87\x18\x29\x03\x8e\x39\x07\xbb\x2b\x10\x35\x16\x9c\x9d\xa5\xa6\x94\x79\x62\x47\x03\xd0\x6b\x34\x1b\x81\xa3\x36\x50\x55\x04\xf7\xb6\x77\x0a\xf2\x71\x1d\xb5\x22\xf1\xbd\x8b\x54\xc8\x4b\x69\x86\x08\x4b\x3c\x9c\xf8\xa4\x98\xe3\xbe\xfe\x8c\xc8\x52\x98\x42\x75\x6b\x26\xfc\xff\x0b\x7e\x7c\x0c\x0a\x0e\x36\x04\xae\xd2\x73\x9e\x4b\x12\x77\x9a\x19\x51\x84\x85\x9e\x66\x70\xae\xfe\x6b\x91\x2d\x78\x9d\x6b\x56\xf8\x16\x1b\xb4\x72\xa2\xca\x6c\x1e\xec\x56\xe7\x86\x1e\xd2\xb6\x8a\xb5\xaa\xeb\xa2\x7e\x82\xd9\x6e\xda\x48\x5a\x66\x34\xf6\xeb\xff\x0d\x65\x08\x81\xbf\x32\x61\x28\x49\xc5\xec\x4c\xd7\x5d\xc7\xf5\x57\xbf\xdb\x98\x32\x1c\x99\x0a\xf7\xbc\x36\xda\x78\xcf\x56\xfa\x1c\xc9\x59\x23\xd3\xad\x84\x53\xf6\x3b\x13\x8c\x88\xa1\xb4\xdc\xcb\x24\xdc\x25\x08\x80\xd5\xe4\xaf\xed\x2a\x89\xb5\x6f\x12\xd7\xe3\x78\x4b\x1c\xef\x00\x7d\xe8\x22\x53\x43\x34\x52\x86\xeb\x45\xcf\x65\x30\xbc\xca\x68\x23\xad\x58\xcc\xfa\x48\x35\x12\x84\x77\xc9\xb4\x55\xd6\xcf\xa3\x8b\x5e\x96\x70\x81\xbc\xa6\xac\xec\x40\x5a\x02\xe8\x80\x4a\x6b\x74\x05\xd1\x73\x37\xdc\x32\x8e\x19\x69\x50\x86\x06\x82\x3a\xda\xa8\xbe\xbe\xd9\x06\xa4\x34\x97\x77\x89\xe5\x15\xeb\xf4\x08\xdf\xd4\x4b\x3a\x94\x91\x0b\xdb\xdd\xfa\xc3\x22\x92\x75\xfa\x83\x94\x77\x49\x7f\xd8\x35\x6e\xe3\xfe\xac\x7a\xca\xdb\x17\x86\xee\x4c\x9f\xc1\xba\x6e\xf3\xfa\xc6\xca\x36\x40\x1a\x93\x97\x54\xf7\xf1\xe3\xaf\x6b\x9e\xe7\x95\x57\x53\xf7\xc9\xa3\x6f\x63\x40\x56\xee\x29\xd4\x7d\x02\x78\x5b\x15\x60\xab\x6f\x3e\xc5\x92\xfc\x93\xc0\x7c\x70\x59\x1c\x58\xd9\x6d\x80\x7c\x02\xbc\xb3\x95\xa0\xe6\x04\x91\x35\x4a\xe7\x66\x68\x71\x4c\xff\x20\xd1\x22\xde\x90\x06\x07\xde\x81\xaf\x3c\x08\xba\x30\x6e\x5b\x4d\x36\xa9\x87\x41\x99\x51\xf4\xb8\xac\xa2\xfa\x7c\x1a\x4d\x27\x36\x8d\x22\x29\x2d\x93\x8b\x6c\x34\x15\xf7\x00\x0b\x32\x8d\x2e\x0a\x33\x12\x7e\x22\x97\x07\x97\x31\xe3\xd9\xc8\x99\x36\x4f\x77\xf0\xdc\x58\xcc\xa7\x0b\x14\x7a\x96\x8b\x9c\x7c\xb2\xa0\xa6\x69\x4a\x91\xde\x72\x30\xbc\x37\x0c\x11\xc1\xd5\x2d\x46\xf3\x9c\x5e\x42\x68\xf0\x03\xb5\xe1\xc3\x1b\x4d\x35\x41\xef\x5c\xcc\x18\x3e\x1e\x1f\xe0\x66\x07\xcf\x98\x61\xd2\x5e\x64\xe1\x50\x9e\x06\xee\x61\xe4\x00\x0f\x42\xdb\x34\xf9\x8c\xdc\x27\x0c\x1b\x7a\x9e\x7d\xe6\x62\xde\x51\x80\x39\xc4\xd7\x19\xc1\xd3\x55\x8d\x89\x36\x68\x3f\x15\xcf\x00\x8b\x41\x64\x2e\x71\x3b\xbd\x3d\x40\x65\x51\x55\x93\xe3\x24\xc9\xf6\xa1\xc4\x18\x91\x90\x63\xe6\xf5\xdf\xdb\x78\xc5\x99\x61\xc1\x06\x38\x16\xe0\x0d\x4a\xc3\x46\x96\x73\xe9\x0a\x00\x96\x97\x61\xc4\x62\x5b\x74\x97\x57\x83\xf3\x5a\x07\x53\x29\xe0\x9c\xef\xc4\x5f\xc8\x6d\x38\x87\x8c\x6e\xe9\x57\xd8\x93\x36\xf1\xaa\x29\xa6\xb2\x69\xfd\xbb\xb9\x7e\x41\xf6\xdd\xa1\x08\x4e\x42\xa5\xb2\x56\x60\x88\x8e\x6f\x48\x43\x05\xec\xcd\xe0\x3d\xe3\xec\x3a\x04\x36\x36\x50\xca\xb3\xae\xb1\xbd\x80\x07\x26\x17\x7a\x3d\x21\x7b\x79\xc9\x63\x58\x73\x04\x90\x13\xfc\x39\xdb\x6b\x8c\x02\x0a\xc1\x3a\xcd\xb4\x66\x03\xc2\x6b\x76\x5e\xba\x29\x5a\x2c\x5c\x37\x66\x99\xae\x69\x4c\x1c\x62\xa7\xda\x83\x43\x17\x9b\xac\xf6\x60\xd3\xc0\xda\x4e\x60\xc0\x0c\x93\xd7\x73\x19\xca\xa1\x0a\x47\xe6\xb8\xc4\x1b\x7d\xd9\x4a\xc1\x88\x65\xc7\x2f\xa2\xb0\x88\x0e\x9d\xcc\x3b\x08\xa5\x2f\xc5\xc0\x66\x7a\x2b\xc1\xcc\x2f\xdb\xb3\xd3\x59\x76\x69\x09\xe2\x4b\xf3\x23\x2f\x16\xe5\xe8\x5a\x81\xd3\x0f\xe2\xf5\xc5\xb6\xff\xbb\xf9\x8b\xb5\x8f\x00\x97\xf6\x69\xf5\x89\xdb\xa5\x37\x7a\xcb\xfa\x65\x3c\x37\x94\x77\xf3\xfa\x33\x15\x4e\xc6\x1a\xe7\x8a\x94\x43\x91\x23\x85\x6b\xa5\x67\x8b\x44\x49\xb1\x41\x2b\x45\x1d\x9f\x38\xfc\x10\x9c\x3a\x92\xc6\xba\x90\xb9\x24\x97\xe5\x70\x5e\x57\xe9\x35\xc3\x9a\x99\x67\x3a\xbc\xaa\x4b\xc4\xad\xc0\x28\x9c\x39\xc6\xc4\x45\x07\x34\x08\xbf\x0f\xb8\x38\x52\x21\x8c\x0f\x00\xcc\xcc\x80\xcd\xf1\xec\x74\x72\x0c\x91\x0b\x57\xf8\xef\xf9\x14\xf7\x8f\x2d\x42\xd8\x64\x70\xe3\xb2\xf0\xd4\xa4\x8c\xc1\xb2\x73\xcb\x1e\x8f\x4b\x39\x1c\x70\xec\x8e\xf6\x8f\xba\x20\xd9\x9d\x14\x84\xa2\x0e\x36\xa0\xe4\xf6\x6f\x0e\x81\xc4\xa6\x05\x57\x78\xbd\xa1\xd8\x51\x8b\x35\x75\xa6\x2f\x52\x1d\x74\xc9\xdc\x79\xfd\xb7\x00\x0d\x92\xe6\xa3\x82\xc6\x15\xa9\xbc\xe3\xc4\x4a\x80\xd1\xba\x8c\x4c\x55\x57\x82\x0f\x26\x3e\x50\xbd\xe2\x10\xf1\x5c\xf7\xd4\x11\x22\x09\x10\xc8\xcf\x31\x39\xa5\x42\xe8\x14\xed\x13\xba\xa7\x2b\x0e\x40\x86\x75\xd2\x4a\x02\xe8\x87\x60\x76\x02\x2d\x68\xda\xf6\x15\x22\x8f\xe9\x19\x36\x03\xd1\xbf\x7d\x82\x29\x25\x5d\x0c\x0f\x57\x8f\x2e\xd8\x39\xe5\x6d\xa8\x62\x86\xe8\x59\x77\xe5\xf5\x80\xfc\xb6\x60\xbc\xf5\xcc\x4b\x53\x75\xa3\xad\xeb\xf4\x66\x20\x60\xdc\x3a\xac\x7b\x70\xb5\xd8\x9c\xea\x28\x7a\xd5\xc5\x2f\x3a\x5b\x4c\x11\xea\xea\x48\xf4\xf4\xd8\x35\x08\xdd\x03\x60\x98\x36\x57\xc4\x38\x54\xf5\x3e\x0c\x87\xd0\xd4\x5d\xd6\x32\x42\x6d\x92\xcf\x37\x1c\xd3\x4b\xbe\xd5\xd4\x25\x04\xbe\xd2\x08\x24\x98\xcf\x1b\x65\xfc\x0a\xb3\x23\x5b\xeb\x1a\x53\x03\xd0\xf3\xa8\x3f\x9b\xa3\xb0\xf6\x0c\x56\x1a\x8f\x5d\x79\x20\x99\xa4\xc9\x71\xd7\x18\x12\x08\x82\xcb\x4e\xc0\x69\x14\x19\x5a\xf3\x68\x12\xcf\x1e\xef\xc8\xc5\x8f\xae\xb7\x36\x75\x27\x8e\x82\x23\xc8\xbf\x7b\xcd\x90\x2c\xac\x3e\xb2\xcb\x76\x6c\xfd\x9a\xdb\x49\xaa\x40\xc8\xc3\xff\xda\xb0\xa4\xae\xf1\x18\x23\x40\xb5\x97\xe8\xb5\x5a\xe1\x04\xd8\xe5\xd6\xb9\xd4\x0b\x24\x05\x08\x71\x26\xa0\x82\x93\x9c\x54\x1b\x47\xa2\xd0\xf0\xbb\x28\x11\x9e\xe8\x5d\x55\xc7\x37\x48\xeb\xb7\xe4\x1d\xaa\xf7\x2e\x4f\x5c\xf5\xe2\x0d\x5b\x92\xe9\xaf\xf0\x9f\x75\x19\xc5\x88\x53\xa5\xe2\x9b\xcb\xcf\xed\x53\xb3\x95\xeb\xea\x15\xd7\x92\x95\xad\x25\x10\xc3\xc1\x33\xc7\x1a\x23\x84\x0f\x56\x41\xef\x0e\xdf\xa4\xdd\x27\x5f\xa1\x1c\xa4\xfe\xb5\xd9\x7d\xf2\x37\xc4\x26\x5f\xf2\x8c\xec\x3e\xf9\x96\x04\x1e\xdf\x7e\xb2\x4d\xf8\xcb\xa5\x20\x78\x18\x6b\x64\x1c\x7e\xe8\x4e\x25\x23\x50\x09\x9e\x91\xc1\xb3\x59\x7a\x5e\x13\xbb\x4f\x92\xac\x2c\xc4\x5c\x93\x10\x1d\x00\x8c\x5d\xe3\xf2\x90\x48\x86\xb5\x0d\x0d\xea\xc2\x89\xab\x8e\x77\x2a\xe9\x3b\x4b\xc2\x71\x7b\x05\xab\x39\x9c\x60\x44\xcf\xd9\x2c\xe3\x0b\x44\xe2\xd3\xc3\xb6\x7c\x9b\x65\x08\xf6\xa6\x10\x68\x11\x9d\x80\xd5\xdc\x24\x19\x61\xc3\xa7\xfb\x32\x4b\xe9\xa8\x23\xc1\x7c\xd2\xcb\x22\x47\x34\x3a\x41\xa5\xb3\xb8\x1e\x76\xb1\xfb\x2a\x06\xee\x33\x52\x2f\xfc\x60\x5a\xfe\x07\xb5\xbc\xa5\xa8\xe9\xbd\xa1\x0d\x7e\xcb\x7a\x08\x41\xe0\xb1\x91\x38\xb4\x0a\xde\xf6\x06\xbb\xec\x45\xd1\xfd\xfe\xbe\xad\x42\xc2\x44\xca\x7f\x55\x05\xcc\x0e\xd9\xe2\xdb\x0e\x60\xaa\xda\xd1\x66\xd0\xa5\x76\xd0\x00\x91\x57\x52\xe3\x04\x9d\x7f\x1a\x0e\x67\x27\xc8\xe9\x42\x59\xfa\x1f\x40\xe7\xae\xd7\x5a\x47\xa7\x6d\x56\xbb\xd8\xae\xee\x32\x0f\x35\x8b\x2b\x3f\x36\x59\x47\x19\x4b\xb2\x79\x5b\x4b\x10\xa9\xa4\xef\x18\xb2\x76\x92\xbb\x40\x3f\xc3\x4a\x6b\x68\x6b\xef\x95\x86\x61\x55\xf3\x85\xd3\x41\xb2\x6e\xb9\xb3\x6a\x32\x87\xfd\xc9\x5b\x1a\x7a\xea\x70\xce\xe2\x2f\xb3\xf9\x8b\xc5\xf9\x45\x84\x6d\xe2\x78\xce\xe6\xfa\x2d\xa7\x59\x1f\xc0\x35\x06\x20\xf7\xe8\xf9\x52\xfb\x9e\xa3\xbc\x99\x08\x0c\x07\x7a\xb5\x44\xac\x81\x31\x64\x5a\xd6\x0c\x87\xe0\x44\xac\xb4\x0d\x6a\x30\x4c\xc5\xd0\xea\x79\xef\x87\x9b\xd1\x76\xd0\x52\x17\x20\xb8\x0e\x0b\xc2\xdb\xbd\xf6\x1a\xba\x0f\x0d\xcf\x5b\xde\x71\xf0\x72\xd6\x6f\x73\xe8\x9a\x9f\x14\xec\x70\x49\x94\xf7\xa2\xf4\xb0\xad\x1b\x8b\x6f\x72\x2d\xc7\x4a\x9e\x92\xae\x2e\xd0\x95\x78\xe2\x9b\x2d\xde\x43\xc1\x76\x49\x9e\x62\x89\xea\x3e\x76\x81\xa5\x9b\xcb\xfa\x82\xa7\xa8\x4a\x96\xab\x23\x51\x1b\xbe\x1d\x76\x02\x6b\x89\x74\x81\xe3\x4b\x87\x07\xc4\xdb\x86\x1f\x98\xba\x8e\xd9\xfb\xee\x96\xb4\xf5\x79\x3a\xad\xa3\xab\x66\x9b\x98\xca\x5f\x65\xe5\x62\x34\xe7\x10\x42\xb2\xf5\xa4\xbb\x28\x97\xce\x50\x26\x05\xd7\xfd\x0c\xf3\x96\x9d\x1a\xf2\x6c\x72\x2d\x25\xcd\x3c\x94\x38\x61\x36\x89\x4b\x88\x72\x58\x54\x6d\x59\x7f\x84\x4d\x3b\xa4\xb6\xee\x4f\x5b\xd5\xaf\x68\xb2\x1b\xff\x53\x37\x17\x3b\x2a\x55\x51\x6b\xf5\x4b\xe7\x70\x54\xda\xfd\x58\x4a\xa1\xfd\xfe\xb6\x63\x97\xb9\x47\x9f\x4d\xb5\x6a\xab\x1e\x4e\xe6\x05\xb7\xb2\x3e\x99\x1e\x7b\x4d\xc6\x49\x34\xe7\xd3\xd3\xa1\x77\xbe\x9a\x1d\xce\xfc\x36\xbb\xfe\x65\x92\xff\x17\xaa\xd3\xef\xd9\xe4\xe8\x6b\x70\x67\xeb\x16\x06\x1d\xb7\x35\xd8\xb3\xfd\xb2\x46\x7b\x1e\x27\x09\x23\x69\x76\x3a\x9d\x56\x37\x39\x98\xf4\x09\x38\x11\x5e\x80\x57\x85\x23\xc7\x16\x82\x1f\x39\x55\x53\x61\x5b\x9b\xd4\xf5\x3e\x2f\x7b\x1d\x22\xd9\x90\x56\x5a\x09\xc4\x02\x9b\xdd\xe1\x37\xa3\xae\xb0\xbc\x40\x98\x7a\xaa\x0a\x1d\x7d\xb5\x89\x9e\x69\x68\x98\xcf\x4a\x7e\xe7\xdb\xeb\x04\x5e\xa6\xce\x18\x0f\x26\x12\xff\xf4\x0d\xf0\xb6\x78\x6a\xed\xa8\x3d\xf0\x1f\xb0\x0a\x90\xc7\x1c\xd7\x53\x5d\x57\xff\x0a\xae\xa6\xc7\x6e\x5d\xae\x89\xd6\xdc\xca\x35\x54\x7b\xac\xf8\xb6\x54\xd1\xec\xfa\xf2\x03\x5f\xc8\xaa\xeb\x72\x21\xe3\xfc\xde\xe6\x56\x26\xc9\x2d\xbe\xb4\x20\x8e\x03\xe0\x35\x83\xd0\x75\x96\xa5\x6f\x09\xdc\xcf\x54\x82\x16\x4e\xbd\xca\x66\xea\x89\xd8\x76\x86\x8f\xac\xa9\x7b\xe2\x9b\xdb\xe2\x1a\x15\x63\xf4\xec\x19\xa6\xfd\xb9\xe4\x4d\xce\x17\xe9\x0c\x06\x91\x9e\xa7\xf0\x50\xc5\x15\xd5\x02\x80\x0f\xcd\x2b\xe8\x75\x0e\x78\x85\x08\xe5\x85\xc9\xaa\x94\x10\xdd\x81\x48\x37\x36\xbd\x32\xb6\x3d\x9a\x16\xbb\x98\xf1\x3e\xef\x7f\x08\xa6\x42\x53\x32\x42\x37\x8d\xb2\x1a\xc1\xe5\xa1\x58\x0c\x75\x8d\xf8\xdd\x5a\xcd\x5f\xd4\x12\xec\x38\x9b\x11\x74\xa1\x9e\xc5\xf0\x5d\x6a\xe4\xb1\xca\x46\xb5\xae\xc3\xc4\x8c\x2c\x61\xef\xf7\x17\xe3\xf1\xf5\x7a\x97\x87\x27\xe7\x77\x87\x19\xf1\x66\x71\xb5\x27\x8b\xf1\x19\x1a\x41\xae\x7d\xb6\x11\x24\xb6\xe6\x78\x6f\xbe\xdf\x65\x4f\x52\x3f\x28\x72\x56\xb5\x4f\xc1\xee\xeb\x6b\x21\x9a\x5a\x38\x6f\xe7\x89\xb6\x66\x43\x56\x12\x27\xd7\x2a\x3c\x3d\xe3\x68\x27\x41\xf8\x63\x4b\x85\xdf\x0e\x58\x6e\xa0\xf7\x18\xb6\x5b\x9d\x11\x8a\xa8\x8c\x66\x69\x5e\xdf\x57\x49\xd1\xf0\x54\xac\x6d\x48\xa4\x25\x26\xdd\xc7\x5f\xb9\xf0\x7d\x56\x2e\xd2\x7d\xfc\x2d\x8a\xdc\x62\x62\x8f\xee\x93\x6f\x1f\xaf\x36\x20\xfa\xfa\xe1\x27\x79\xda\x5f\x2a\x4f\x83\xd5\x5d\x6e\x30\x54\x63\x73\x13\xb7\xd8\xa1\xaf\x2a\x8a\x64\xac\x90\x0e\x32\xe9\xc5\xf0\xb2\x1a\xb3\x4a\xe4\x2e\x0e\x18\xe9\xe5\x86\x20\xa3\x18\x4b\x33\x56\xc0\x26\x7a\x65\x44\xbf\x62\x68\x6c\xa4\x90\x4a\xf5\x4a\xfd\x9c\x0f\xb3\xbd\xeb\xfe\x28\x8b\x94\xb1\x69\x5e\x09\x71\x2c\xfd\xb9\x20\x2c\x88\x58\x17\x2b\x79\x96\xd6\x00\xc6\xaa\xeb\xd4\x82\xf9\xbc\x9a\x48\x9e\x2d\x86\xae\x61\x79\x95\x7a\x8b\xc8\x66\x13\xf3\xbf\x79\x5a\xb5\xeb\xe2\xcf\x92\xcf\xb0\x61\xcf\x73\x58\x11\x3f\x9f\xfd\xac\xf2\x1d\x0d\x2b\x79\x8e\x86\x1b\xc9\x50\x9f\x1f\xfe\xfb\xe1\x8b\xe3\xd3\x7f\x1c\xfc\x87\xc9\x87\xc5\x9b\x7f\x50\x98\x7b\xe2\x93\x6f\x5a\x5a\xf2\x69\xce\x72\x9e\x71\xec\x28\x73\x36\xfa\xb3\xdc\x9c\x30\x80\xa3\x2d\x06\x18\x2e\xac\xe7\x8e\xc9\x21\x3c\x0d\x0c\xd3\x96\xf5\x9c\x21\xd6\xb1\xb9\xc9\xb0\x92\x6b\x6a\x8c\xc6\x83\xce\x2c\x56\x01\x75\x82\x51\xbd\xa4\x4e\x09\x0b\x46\x71\x9b\x39\xa6\x1a\xe8\x1b\x31\x2c\x64\x46\x96\xf5\x72\x43\x32\x92\x08\x70\x5f\x30\x02\x87\x7c\xbc\x7f\xf0\xec\xf0\xc5\xc1\xe9\xd1\x8b\xbd\x03\x81\xf4\x5e\xb7\x45\xd3\xce\x59\xc1\xef\x99\x58\x63\x60\xe2\x40\xf3\xc5\x7a\xa7\xe3\xc5\x19\x05\xde\x9a\x53\x1d\x14\x6a\xc3\xf1\xd3\x17\x08\xd6\xdb\x09\x5b\x85\x47\x10\x5f\x9a\x20\xa2\xa8\xf4\xfd\xf9\xee\x8b\xff\x58\xd9\x77\x04\x42\x32\x77\xcb\x8c\x64\x1c\x04\xf4\x5b\x72\xc7\x5d\x95\x47\xbf\x1e\xbc\x7a\x75\x68\x5e\x80\x3f\xec\x1e\xaf\x9e\x10\xa8\xb4\xcc\xc7\xf9\x08\xb1\x44\x75\x7f\xda\x49\xf6\xae\x9f\x4d\x91\x23\x37\x0d\x98\x27\x38\x41\xc6\xd2\x38\xa8\x2e\x62\x77\x09\x0f\x06\xc2\x14\x02\xae\x53\x36\x3b\x27\x17\x0e\x7c\xff\xb1\x55\x9d\x0c\x9e\x60\x62\xcc\x47\xf1\x98\x33\xb3\x8b\xe6\x56\x54\x9f\xdc\x6d\xa5\xf8\x00\xce\xd8\x8c\xce\xd4\x65\x23\x2b\x60\xf0\x97\x8b\x59\x71\x15\x9d\xc6\xd3\xe7\x07\xaf\x7e\x3c\xd8\xa7\x81\x93\x75\x31\x9f\x4f\x0a\xa9\x87\x30\x17\x25\x9b\xb9\xbb\x8b\x93\x62\xa1\x64\x4e\x93\x49\x53\x73\x61\x6e\x9b\x6c\xc6\x78\xc2\x2a\x8d\xe2\xab\x61\xa9\x8c\x63\x3c\x48\x3c\x15\xbc\xfe\x00\xfb\x9c\x42\xd7\xb9\x42\xf6\x8e\x2d\x18\x0f\x9d\xad\xad\x30\x6c\x9d\x35\x29\xc4\xe3\xd5\x6b\xa3\xb5\x24\xd8\x0f\xfa\x9b\x1f\xad\x2d\x11\x41\x1a\x4a\xd2\x96\xb5\x2f\x2f\xed\x43\xd6\x23\x08\x6a\x3c\x52\x4c\x20\x08\xf9\x98\x01\xa8\xfb\x7c\xd9\x05\x0d\xe4\x3c\x34\x93\x27\xc1\xb0\x64\x58\x28\x4d\x7a\xa4\xae\xec\xf1\xbe\xb1\x41\xe4\xf0\xe9\xf0\xfc\x5a\xdf\x8b\x51\x77\xb6\xfb\x09\xbd\x4a\x62\xf6\xe2\xf7\x59\x15\xce\x7b\xe4\xbb\x41\x7e\xf9\xf7\x9f\xb2\xd1\xa8\x48\x7e\x2b\x66\xa3\xc1\x77\xdb\xf0\x61\x47\xf2\xdd\xd0\x1f\x37\x2a\x54\x41\xfc\xec\x72\xa0\x44\x3d\x89\x09\xc6\x9e\xe8\x17\x08\x41\x2d\x27\x00\xc7\x7b\x81\xde\xeb\x3c\x1b\x86\xf1\x18\x67\x29\x52\x57\xc6\x33\xe6\xd1\xb7\x3a\xc9\xb1\xe1\xb3\xa3\x74\x10\x78\x55\x94\x49\x16\x33\xf6\x60\x32\x73\x32\xcb\x2e\x0c\x77\x04\xdb\x40\x5a\x06\x0e\xe7\x5a\xa2\x82\x90\x20\x08\x68\x2e\x12\x1a\x47\x69\x99\x89\x8a\x0d\x8b\xa2\x14\x4a\x34\x70\x1b\x3f\xc4\x06\xd5\xf0\xa2\x2d\x40\xcf\x92\x48\x6f\x97\xc4\x63\xf0\x33\x56\x0c\x69\x81\x3f\x83\x70\xf0\x30\x83\x14\x5b\x94\x69\x40\x82\x06\x93\x14\x26\x09\x85\x3c\x44\x1f\xcd\x1c\xd2\x7e\x8b\x06\xf8\xc5\xad\xff\x07\x56\x78\xc3\x9f\xc4\xc9\xcc\x9e\x6d\xb9\xaf\xdc\xf5\xd2\xd1\x54\x2a\xec\x5d\x51\x79\x79\xd7\x4c\x33\xae\xbb\xb3\x75\x70\x97\x10\x55\x25\x4b\x88\x9d\x6e\x94\x89\x16\x1c\x2b\x2b\xb9\xdc\x8c\xdc\x4e\x7e\xd2\x24\xd3\x73\x69\xa3\x15\x19\x2c\x4b\x08\xea\x46\x4b\x15\xac\x39\xdc\x7d\x7b\x05\x21\x83\x6c\xc6\xc9\x58\xe5\x84\x64\x5e\x1b\x57\x79\xad\x9e\x28\x18\x93\xcd\xfb\x22\x8a\xc2\x0f\xd7\x1d\xae\xf1\x03\xf5\x28\xb0\x5a\x29\xc1\xa7\x1c\xad\xdd\xe7\x65\xdc\xec\x75\xbd\x3e\x42\xc9\xbd\xb5\x3b\xba\x0d\xa0\xa7\x4f\x75\x3f\x65\x6f\xc2\xf7\x20\xbc\xc9\x65\xf1\x16\x94\x21\x64\x72\x93\xf9\x16\x37\x62\x6f\x93\x10\x82\x98\x0b\xed\x2a\x8a\x01\x76\x85\x07\x53\x1a\xde\xde\x3d\xe7\x91\xd3\xa3\x40\xa7\xe6\x34\xe0\x0e\xe2\xa0\x04\x4e\x2e\xd1\xcc\x3b\xe6\x61\xb6\x28\xd9\xb5\xb3\x07\x90\x9d\x68\xf7\xe9\x6d\x6f\x92\x0f\x62\xff\x29\x82\x2d\x75\x98\x8d\xcd\x7a\xe7\x99\x79\x52\xa0\x55\xcf\xb1\xd9\xe1\x59\x4f\x62\x86\x72\x54\xdb\x3e\x46\x3e\x45\xa9\x20\x73\x16\x13\xee\x62\x49\xd9\xc1\xf3\xc0\x5c\xb5\xfc\x2d\x9b\x53\x2d\xd1\x68\xe1\x2b\x16\xa9\x82\x68\x13\x5f\x22\xe6\x23\xda\xd1\x65\x20\x26\x95\xba\x5e\xbf\x1a\x27\x01\xe3\xe3\x49\xaf\xa9\x42\x32\x2c\x17\x83\x27\xce\x06\xbc\x80\x1a\xbb\x1e\x24\x76\x5f\x4f\x64\xd5\xf9\xea\xbe\xbe\x4c\xd5\x17\x80\x80\x3b\x9a\x68\x38\x1e\xf9\x3e\x2c\x8a\x1f\xd2\xdf\xbb\xc8\x52\x98\x3f\x9e\x15\x45\xb3\xe5\xd2\x6f\xe4\xcf\x9b\xdb\x4d\xb6\xdf\xdb\x0d\x26\x7b\x83\x36\xf6\xd4\xc1\xdb\xa8\x8d\x5f\xca\x0c\xe9\xf7\xb4\x24\xf4\x0a\xef\x58\xc0\x16\xc5\x25\xd0\x69\xbc\x1f\xd1\x5b\x59\xe4\x21\x54\x17\x5d\x0f\x80\x68\xca\x4c\x6f\x94\xda\xbd\x28\x50\xbe\x6d\x5e\x84\x59\x46\x3c\xe6\x38\x1d\x48\x98\x5e\x3c\xde\x66\xab\x5f\x40\xbc\x86\xe1\x5c\xcc\xeb\x2a\xc7\x0a\xc0\x2b\xa8\xba\x7c\x4e\xaf\x0b\x38\x3d\x68\xfa\x5d\x02\xd6\x51\x36\x1c\x22\x5f\xee\xed\x9c\x3a\x6f\x3d\x5a\x66\x6b\x08\x57\x71\xef\xdf\xa9\xec\x2a\xc7\xa2\xb5\x93\x3f\x20\xcb\xcd\x3d\xcb\xa5\x2d\xd9\x2b\xbe\x98\x44\xd6\x73\x52\x40\x97\xb9\xc7\xb6\x04\x01\x61\xd9\x35\x96\xbe\x57\x97\x16\x9e\x7d\x66\x4d\x7d\x82\x8a\x38\xbf\xd9\x6d\xc9\x29\x9f\xc6\x91\x8b\x5b\x04\x3b\x81\x03\x29\x17\x70\x80\x3d\x03\x47\xa7\x1a\xa9\x2c\x00\x86\xdb\x40\x25\x89\xd9\x98\xc8\x6c\x19\xb6\xf4\x0c\x5e\xd6\x53\x7a\x38\x9a\xb5\x1e\xa4\xf3\x54\x1a\xa2\xfa\xce\xae\xbd\x65\x17\x15\x1a\x5a\x61\x82\x18\x6e\x8a\x8f\xf1\x98\x6b\xae\x4f\x10\x23\x77\x68\xd5\x29\x78\x9d\x9b\x74\xc9\x74\x81\xa1\xfd\x59\x06\x0e\x34\x34\x25\x38\x55\xf0\x31\x45\xb0\x15\xab\xe4\x4f\xad\x97\xfb\x7d\x17\x52\xc6\x3e\xf0\x26\xea\x50\xd0\x55\x24\x68\x2d\x13\x16\x42\xe6\x7e\x60\x19\x3d\x4e\x73\x86\x69\xbe\xa0\x55\x73\x7c\x90\xed\x5f\x4c\x20\xda\xba\x59\x2d\xe0\xfd\x60\x2f\x14\x0e\x01\x26\x3e\x0c\x9e\x7b\x3d\x96\xa6\x36\x44\x25\x37\x19\x32\xda\x6c\x49\xac\x18\x56\x4e\x82\x4f\x73\xcc\xda\xd5\xb4\xc6\xe2\xba\x1b\x94\x7e\x82\x4f\x01\x76\x41\x20\x73\x2a\x46\x10\x01\xcd\x58\xb6\x88\xfb\xf9\xe0\x16\x6b\x18\xbd\xb5\xd8\x4e\xbe\xc4\x2b\x80\x4e\xfe\xda\x13\x3c\x43\x8c\x23\x00\x38\x60\x0e\xd4\xa1\xaa\x98\x8d\x6c\xdd\x05\x15\x99\x84\xe5\x20\x76\x22\xbc\xce\x13\x96\x87\x32\x49\x46\xc5\x30\x02\xc6\x9a\x8e\x5f\xe6\xa9\x47\x9e\x7d\xe2\xe6\x6d\xed\x57\x34\x9c\x10\xb1\x0e\x8c\xa3\x5f\x12\x4e\x18\xda\x49\x7b\xee\x34\x44\xe0\xbc\xfe\x34\xbd\xdb\x13\xf4\x9e\xe6\x61\x04\x27\xb5\x44\x40\x58\x5b\x5d\x07\x92\x48\xef\xf3\x77\x4d\x3c\xed\x67\x75\x99\xb6\xa2\x24\x92\x30\x6e\x4f\xd4\x71\x00\x02\x68\xb8\x01\x98\x8b\x5e\x6c\x6c\x32\x61\xbb\x80\x5d\x63\x32\xc8\x43\x87\x1f\x2f\x6e\x0d\x80\x2e\x51\x90\xdb\x94\xa7\x9e\xfc\x62\x88\x34\xa1\x56\x72\xca\xb2\x0f\xe6\xfc\x00\x74\x0f\xe5\x2f\x36\xdc\x13\x42\xe9\xe5\xf3\x36\x8a\x05\x60\x51\x4c\x4b\x67\x29\x44\x3f\x1a\x15\xc5\x5b\x68\x1a\x03\x49\xf9\x14\x09\x85\xa9\xbd\xd8\xa9\xd0\xfe\x5e\x38\x81\x6b\xd1\x2b\x7f\x51\x37\x23\x5b\xa0\x10\x18\x18\x7e\x16\x05\x67\x79\x70\x3b\x6b\x83\x77\xec\x34\xaa\xd9\x53\x56\xcf\x32\x88\xc9\x7d\x3e\x23\x50\x81\x3d\x24\x6d\x9e\x51\x43\x1a\xb6\x8b\x99\x3c\x31\xd6\x3f\x3a\x3d\xbe\x19\x91\x25\xeb\x11\x5d\x32\x53\xdc\x00\x86\xd8\xbc\x58\x53\x89\xf7\xe5\x62\x78\xb9\x75\xe5\xe0\x4e\xb6\x2f\xdb\xd8\x95\x6d\x67\xa1\x69\x58\x4d\x62\xa9\xf1\x2a\x05\xb3\x29\x19\x30\xd5\x45\x63\xf5\x4f\x11\xcd\x84\xbd\xa2\x25\x56\x70\xdd\x09\xc2\x4d\x58\x7f\x98\x24\xec\x9c\xe9\x41\x3a\xd2\x65\xdd\x19\x69\x71\x44\x08\x39\x64\x2a\x2f\x57\xee\x98\xae\x25\x79\x9d\x12\x19\x11\x2d\x94\x5a\xb8\xca\x8d\xac\xd8\x84\x31\xa7\x44\xec\xca\x92\xf4\xbd\xa8\x1f\x61\x25\x82\x5f\x74\xd7\xe9\x65\x88\xc9\x03\xe2\x2b\x52\xcb\x07\xad\xcd\xe4\x58\x76\x86\x3a\x90\x0c\x16\x19\x11\x71\xb5\xc7\x80\xed\xa5\xba\x34\xe1\x6d\xfb\x9c\x30\x46\x6f\xd0\xf3\x8e\xcc\x71\xcf\xce\x2b\xe4\xb7\x93\xd8\xe3\x67\x0f\x94\x51\x33\xd7\x5b\xff\xcc\x88\xd5\x9b\xb9\x37\x61\x29\xe8\x9e\xa1\x3b\x0d\x7d\x54\x70\x30\x45\xbf\xbf\x98\x45\x50\xc4\x01\x1b\xec\xfe\x7d\x7a\x6c\xde\xbf\x1f\x79\x51\x36\x5b\x3d\x62\x35\x2c\xfb\xb5\x09\x01\xbb\xfb\xde\xb9\x8d\x53\xeb\x72\xb2\x59\xbf\x63\x36\xe1\xf3\x1a\x65\x84\x9d\x73\xcc\x1f\xd3\xcd\x8f\xcb\x95\x45\x1a\x09\x17\x04\x0c\x8c\x96\x2d\x08\xa4\x2f\x5b\x10\x74\xb6\x8a\x2d\xc8\xc7\x66\xe4\x3e\xcc\x2a\x79\xe7\xfa\x2c\x63\x3c\xad\x01\x3d\x5f\x51\x52\x99\x22\x77\x45\x3c\xfa\x65\x26\x4f\xc8\xe8\xe2\x0e\x20\xb0\x62\x71\xbd\xc9\xaa\x0e\x32\x17\x2c\x58\xbf\x79\x4c\xb5\xa8\xe3\x8f\x9c\x48\xcd\xf3\xf4\xbc\x19\xe1\x17\x8d\x79\x4f\x81\xb0\xc5\x17\x22\xd3\xf5\x86\xcf\x2d\xd8\x1a\x54\xa1\xed\x30\x3d\xa0\x52\x8e\x90\xb9\xc1\x93\xc8\x02\x1c\xd5\x2e\x83\x7e\x66\xee\x0e\x2e\x41\x43\x3e\xa8\x7f\x66\x6a\xbf\x7b\x4f\x96\x6c\x7d\xb6\xe5\xa5\x51\xf7\x56\xa2\x7a\x7e\xb8\x06\xf1\x74\x8a\x16\x57\x38\xfb\x56\x35\x53\x92\xd0\xbe\x51\xf2\xd3\x44\x70\x32\x66\x4c\x3b\x72\xd6\x63\x8e\xce\x8b\x59\x3e\xbf\x18\x8b\x1a\xb3\x98\x9a\x6a\xe6\xa0\x53\x00\xff\xbf\x51\x8e\x55\x01\xab\x78\x95\x97\x17\x78\x40\x49\xd1\x48\xab\x1d\x3b\x72\x1b\x91\x28\xcf\x5b\xcf\xac\x02\x55\x0e\x0a\x0c\xbb\x10\xec\x37\x2f\xb3\xe4\xad\x81\xa7\xd2\xdc\xd2\xa1\xd7\x39\xca\x09\xed\xf0\x98\xba\x04\x95\x90\x66\x3c\xa2\xd8\x61\x9b\x19\x2c\x63\x95\x8d\xac\x33\xd9\x1d\x01\x28\xe5\x39\xaa\x83\x81\x5f\x9e\x21\xd3\x38\x4a\xc1\x64\x0f\x78\x79\xeb\xfd\xaf\x55\x0a\x62\x67\xa2\x5b\x85\xca\x7c\x1d\x08\x76\x2d\x2b\xe5\xd9\x53\x55\xd7\xb5\x49\xb9\x4a\x2f\x1e\x06\x8a\x23\x5d\xc0\x16\xdf\x97\xee\x31\x94\x2b\xc5\x4f\x8d\x5a\xc2\xd7\x09\x25\xfb\x59\x39\x65\xcd\xe4\x59\x06\x3d\xa0\xaa\xb9\x51\x11\x30\x58\x15\xc8\x62\x8e\x42\x0c\xae\xe7\x33\xd6\x49\x7c\x86\x5a\x58\x34\x02\xa2\x01\xe6\x1c\xb6\x95\xb4\x59\xbe\xea\x83\x67\x0f\x2b\x54\x58\x2d\x07\xc7\x07\xaf\x7e\x3d\xd8\x3f\x3d\x7e\x79\xb0\x07\x66\x09\xc7\x6c\xf1\xe5\xa1\x5d\x5a\x76\x73\xcf\x0d\xae\xad\xb3\x88\x95\xa3\x4a\xef\xa8\x64\x08\x4b\xe9\x7e\xb1\x1b\xac\x53\x24\xc5\xab\xa7\x54\x0d\xa0\xe5\x7f\x09\x03\x67\x52\x7c\x4c\x36\x0e\xb0\x21\x33\x75\xac\x4c\x6c\x11\x76\x31\x99\x39\x8a\xe3\x67\xa4\xd5\xd7\x79\xcc\xa9\x17\x3b\x1d\x51\x29\xc4\xfb\x5f\xc9\xa8\x87\xb2\x21\x5a\xa0\x79\x78\xe6\x70\x1a\xa1\x9e\xfd\x6c\xa8\xb0\xed\x54\x8b\xf6\x63\xa5\x65\x97\x14\x37\xee\xe9\xe8\x12\x9c\xd7\x43\xbf\xd3\xeb\x5a\xa9\xdd\x45\x87\xe7\xa2\x7f\x58\xbc\xf1\xa5\xe5\x3c\x50\x72\x9d\xb0\x65\xdb\xa7\x19\x5f\x67\xb2\xff\x92\x79\xde\x68\x8a\xd7\x9c\xdd\x5b\x4c\x6c\x6c\x4e\xeb\xa7\xd3\xc5\x86\x67\x0a\x0c\x30\x4a\xa1\x12\x86\x89\x09\x3f\x89\x10\x04\x14\x11\x78\x98\xf2\xa0\xa8\x82\x1f\xb2\xcc\xda\xa5\x8b\x79\x31\x66\x82\x33\x3b\x17\x60\xfd\xb8\x82\x27\xbe\x86\x41\x36\xbd\x8c\x7a\xb8\x35\xd9\xfc\x39\x09\x87\xf3\x94\x05\xba\xcf\xc1\x18\x66\x40\xb6\xc7\xcf\x3c\x20\x98\x15\x35\xb8\xf5\x0d\x12\x82\x05\xf5\xd1\x25\x96\x77\x29\xf8\xb2\xe3\x13\x1a\xa5\xee\x8d\xcf\x97\xcd\xf0\xa7\x6d\x78\xdb\xe2\xca\xdd\x2e\x92\xaf\x65\x5b\xdd\xd6\xb6\xe6\x3e\xaf\xb4\x6e\x3f\x04\x3b\xdc\xaa\xec\xe3\xf3\xc6\xc9\x32\x09\x70\x27\xe0\x97\x15\x37\x83\x14\x63\x67\x11\xed\xf5\x14\xce\xa2\x57\x6e\x4e\x1f\xdb\xc9\x88\x67\xa7\x25\x26\xd5\x74\x79\xc1\x28\x5e\x30\xe0\x01\xe7\xf5\x50\x23\xe9\x53\xe8\xaa\x24\xa5\x14\x76\x85\x61\x83\x49\xaa\x28\x96\x88\x8a\xfd\x00\x34\x20\x6b\x0f\x59\x16\xca\x08\xca\x15\x26\xb8\xa2\x12\x54\x5d\xa4\xd1\x80\xad\x84\x27\x1d\xc4\x56\xe6\xf7\xe9\xe9\xfe\xc1\xaf\xa7\xa7\x5c\xe2\xb6\x2e\x4f\x09\x8e\x12\x58\x19\x1a\xd9\x6b\x19\xca\x1b\x0c\x39\xda\x90\x59\x55\x41\x0d\x1b\x9f\x9b\xc5\xfc\xbc\x24\xc3\x2c\xf0\x68\x62\xcd\x1b\x4c\xfb\x8e\xd5\xb8\x9d\xc1\xd8\x87\xd6\x87\x6e\xc1\x48\xc9\xc8\x89\x3a\x0f\x26\x71\xb1\x52\xf1\x55\x54\x4b\x75\x0c\xcc\xfb\xf7\xe2\x99\x05\xcc\x61\x63\xc5\xfe\x47\x3b\xd7\xd7\xb2\xde\x6f\xfc\x03\xf4\x42\x7c\xa3\x02\xef\x28\x41\x9b\xb8\x89\x6c\xac\xe7\xc8\xc3\x1d\xf1\x13\xa0\x89\x8c\x24\x43\xce\x58\xbf\xb9\x52\x5b\x7b\x46\x2c\x87\xe2\xd8\x29\xdf\x6f\xd9\x51\xf8\xd9\xd9\x4f\xaa\x8b\xe9\x16\xee\xdb\x6c\x93\xfd\xbc\x84\x47\xe5\x95\x36\x7d\x34\xab\xe9\x2c\x1f\x2d\xc7\xb9\x98\x8c\x20\xb4\x5c\xf6\x0e\xc2\xce\xe5\x73\x8a\xcd\x5f\x5c\xd1\x03\x16\xf6\xb6\x6b\x16\x2d\x97\x96\xe2\x29\xad\xbd\xdd\xec\x3e\x97\x0d\xa7\x27\xc6\x14\xab\x7b\xc6\x04\x1e\x78\xde\x64\x90\xa0\x0a\x19\xfe\xf9\x3c\x1b\x4f\x49\xa8\xa0\x1e\x65\x81\xc7\x1d\x6d\x3a\x67\xd7\xe7\xbf\x46\x3a\xc9\x01\xc6\xb5\xb3\x96\x7d\x33\xd1\x2c\x4e\xd0\x90\x5a\x55\xc6\x71\xf5\xa0\x9d\x51\x3a\x25\x5f\x3f\x8a\x61\xc1\x93\x5c\xe3\x73\xe7\x26\x61\xcd\xd1\xb7\x9c\x87\x9e\x5e\x63\xfb\x5e\xb2\x96\xb3\xa4\xab\x02\x51\x03\xbc\xbb\x56\x2e\x31\x6e\xd5\x3f\x7d\x61\x95\x8c\xc0\x45\x38\x5e\x2b\xbb\x35\x4a\xd8\x7c\x33\xd0\xe3\xaa\xb2\x15\x8a\x49\x28\x2b\xf1\xe7\x90\x41\x7e\xac\x31\xad\x58\x44\x2f\xbc\xaa\x50\x12\x4c\x76\xd6\xb7\x5f\xf1\xc8\xb4\x6c\x32\x29\xb2\x47\x94\xa3\x24\x1a\x1c\x12\x3a\x29\xb3\x8c\x14\xd3\xb2\x4c\xa6\x54\x29\x53\x30\xb1\xdd\x16\xf7\x96\xaa\xa1\x2b\xca\x05\xf0\x8d\x7e\xb6\x30\xef\x01\x98\x53\xda\xe8\x78\x80\xca\xac\xe2\x95\xb7\xf2\x29\x07\xf5\x3b\xc7\xbc\x7b\xee\xa7\x8e\x33\x80\x3b\xfe\xb6\x5b\x90\x2f\x32\xa8\x19\x4b\x85\x77\x97\xda\x3d\xb8\x69\xfe\xb3\x51\xd9\x34\xb2\xc4\x0d\xba\xba\xdd\x26\x21\xba\x81\x7a\x2f\x5a\xf6\xe4\x90\xae\xf3\x36\x85\x38\xa1\xfc\xb3\xec\x7c\x01\x96\xe2\x24\x2f\xed\x34\xb6\xc2\xcd\x50\xdf\x45\x5a\xcd\xdb\x0e\xfd\x9e\x76\x7d\xe9\xe4\xe5\xaf\xb0\xce\xfc\x13\x77\x60\xeb\xee\x53\x70\xe7\xc1\xaf\xee\x64\xab\x65\x5d\xc4\x91\x52\x99\xab\x33\x60\x39\x49\x62\x23\x97\xdf\x0f\xd7\xb4\xc1\x91\x24\x92\xe1\xba\xd5\x75\x54\xad\x88\x31\x20\x4d\x26\xb4\x9e\x7c\x9f\xa8\x1e\xf4\x4b\x20\x00\x5f\x30\x59\x02\xf9\x2d\xa3\xdc\xa2\xc5\x3e\xd1\x5a\xa4\xf6\xfa\xcc\xd2\x99\x6a\xc3\x31\x81\x96\xa8\x2a\xee\x06\xd0\x23\x8c\x74\x63\x2d\x0a\x20\x78\x0a\xc5\x66\xf1\x1c\x0c\x94\x7c\x4c\x88\x34\xfe\x1d\xd0\x68\xe7\xa9\x62\x29\x75\x55\x58\xd4\xa1\xc6\xab\xe7\x8e\x13\xdc\xa5\x52\xc1\xf6\xd2\xc7\xd1\x9e\xcf\x15\x88\x8a\x3e\x9e\x22\x47\xef\x80\xc2\x64\x27\x65\x36\xaf\xea\xb5\xe6\x8b\x7f\xcb\x18\x86\x73\x64\x5e\x81\x03\x5e\xc3\x4c\x5c\x49\xa0\x3b\xa9\x15\x48\xe2\x73\x38\x3d\x2b\x6c\xf4\xb4\x68\xab\xc2\xb9\x43\x37\x21\x0c\x82\x29\xac\xf1\xc6\xd6\x60\xdc\x54\xa8\x85\xc8\xc4\x2e\x9f\x88\x6a\x01\x6a\xbc\xfa\x40\x84\xd2\xf1\xb7\xa9\x99\x96\x63\x43\x06\xa7\x76\x63\x14\x13\x27\xa1\xec\xba\x4c\x60\x34\x39\x2c\xe0\x56\x27\x3e\x00\xfd\x55\xa5\x0c\x0b\x08\x30\xf6\x6f\xe6\x64\x00\xc8\x78\x9f\x81\x2b\xa0\xaa\xe8\x91\xe1\x7b\xde\x4d\xd1\xe7\x43\x31\x9c\xb6\xaa\x26\x6f\xcc\xcf\xac\xa1\xfc\x67\xad\x8e\x2b\xfd\xb8\x93\xf0\x34\x0e\x32\x67\x97\xdb\xb4\xee\xec\xd6\x71\xc5\x16\x42\xc9\x60\xa9\x78\x4c\xe2\xb1\x9e\xfa\xbc\xfb\x1a\x4c\xf2\x8e\x57\xe1\x2e\xed\xa1\x7d\x96\xcd\x3e\x4d\xea\x59\x1c\x5d\x10\xd0\xa6\xb3\xc1\xbe\xd9\x4b\x3f\xe4\x13\x2e\x46\xbb\x07\x71\x3b\xe9\xef\xce\xe9\x29\x5a\xef\x48\x36\xbf\x65\x85\xef\xc1\x64\xdd\xed\x40\x8f\xb4\xeb\x62\xb4\x42\xbb\x66\x65\xa8\x5d\x3b\x7a\x55\x9f\x02\x50\xbc\x17\x99\x31\x3f\x39\x18\xbf\x4e\xf4\xc7\x68\xc3\xd6\x38\x20\x51\xe9\x46\x2b\xc0\xdf\xbc\x47\x73\xc8\xa3\x97\x5c\xcf\xd3\xa9\x8f\xc7\x59\x97\xcb\xfa\xcd\xd3\xbf\x9b\xad\x55\x05\x14\x3c\x28\x4d\xe0\x8e\x5f\xa4\x36\x3d\x8a\x1e\x1a\xce\x89\xdf\xe9\x75\xde\x66\x42\x3a\x54\x31\x3a\x79\x25\xa1\x9c\xdb\x83\x26\x04\x0c\xa1\x22\x16\xe0\x58\x7c\x76\x5d\x43\x6c\x54\x5d\xb7\x67\xb1\x65\xab\x44\xf6\x44\xe2\xe7\x49\x92\xf5\x18\x4f\xe6\x25\xe1\x45\xbd\x56\xfe\x96\xd7\x4a\xcb\x0f\x99\xef\x71\x17\xbf\x4c\x32\x21\x2f\xc8\xee\x30\x07\xfa\x39\x39\x12\x80\xaa\xe4\xf3\xd2\x13\x04\x60\x0d\xc8\x72\xe2\x3d\x70\x8e\x90\xe7\xce\x1c\xc4\xd4\xe1\xc9\x06\xe0\x9f\xeb\xb2\xff\x7d\xe2\x1e\xf5\xd8\x4d\x8f\x0d\x59\x67\xfa\x3e\xfe\xe4\x09\xaf\xa3\x36\xd8\xb3\xc2\x51\x72\xd6\x1e\x39\x25\x51\xf0\x4c\x69\xab\xa0\x7a\xef\x40\x55\x09\x00\x4d\xba\x32\xa9\xe8\x4c\x1c\x08\x28\x90\x94\xb6\x89\x82\x93\xd4\x16\xf9\x30\x82\x54\x4f\xe1\xf3\x2c\x17\x83\x1b\xd9\x6f\xc3\xcd\xe6\xc3\x3f\x70\xe1\x19\x5e\x22\xf9\x55\x19\x2b\xd7\x25\xfd\xe3\x03\xbf\x76\x8f\xd6\xe9\xca\x1e\x39\xa5\x6e\xd2\x8b\xad\xa0\x3f\x15\xaa\xb8\x84\xa2\xdd\x32\x80\x1a\x2f\xeb\xee\x60\x90\x18\x8a\x72\x06\x7e\x95\x5a\x22\xc6\xe6\x6e\x4e\xde\xc6\xcf\x3f\xf3\x16\xe4\x77\x1c\x9b\x22\x86\x15\x92\x5b\xcb\x30\xa7\xdd\x51\x14\xa3\xb2\xe3\x13\x1b\x16\x7a\xd6\x5f\x6f\x70\x7a\x90\x5b\x8c\x68\x20\xa3\xd3\x12\xe8\x22\xc3\xb2\x10\xf3\xee\x14\xc2\xe5\x39\x38\xf0\xea\xc4\x7b\x8b\xb0\xa5\xff\x5b\x15\xdb\x6d\x2a\x52\x56\x8f\x54\x5f\x36\xad\xdf\xa9\x31\x1e\xda\xcf\x1d\xf2\xa4\x94\xaa\xd9\x52\xdd\xc6\x6d\x78\x6d\x61\xa9\xe8\x11\x0f\xe0\xd0\xdc\x93\x2a\x43\xba\x73\x47\xe1\xce\x3d\xd7\x4e\x44\x18\xb3\x42\x06\x93\x5a\x41\x83\x96\xa1\x38\x12\x04\x82\x99\xb6\x76\x38\x9c\xfc\x67\x03\x39\x58\x56\xe2\x7b\x1a\xf6\x0e\x39\x84\x61\xdc\x68\x1d\x1e\xb3\x24\xa9\xba\x6f\x81\x70\x2d\x52\x77\x94\x4b\xa3\x55\x8c\xa1\x95\xe4\x65\x54\x35\x16\x50\xd5\x29\xbb\x81\x95\x12\x1e\x35\x37\x96\xa8\xd3\xd2\x1c\x4e\xcc\xbb\x30\x9f\x7b\x6b\xa3\xb6\xdc\x07\x58\x14\xdb\xc2\xe6\xab\xf2\x81\x24\x63\x5a\x3c\x2a\x36\x92\xeb\x49\xc6\x74\xf7\x5b\x4c\x60\xd5\xec\x44\x69\xa8\x27\xee\x22\x57\xfa\xab\x42\x7c\x6c\xc5\x66\x7b\x56\x5c\xc1\xd9\x42\xe8\x02\x76\x74\xf5\x20\xd9\x42\xcc\x20\x31\x6f\x33\xa3\xa6\xf7\x15\x3a\x2d\xd0\x57\xa1\xa4\x60\xf0\xb8\x98\xb3\x81\x5d\xb5\x28\xf4\x02\x8a\x96\x60\xf1\x33\xe0\xb2\x51\xe8\x2b\x68\x84\x04\x01\xb9\x76\x0f\xa1\xba\x11\x4d\x9c\x7b\x0c\x3e\x20\xd7\x14\xae\x21\x47\x4c\xb8\x50\xe4\x06\xc3\x07\x72\xf6\x5b\x3e\xbf\x78\x51\xec\x2f\x40\xe8\x6b\x2a\xf9\x47\x76\x5d\x36\x4d\x2b\x08\xde\x4a\x14\xe4\xb6\x5b\x0c\xfa\x6a\xa8\x3b\x0c\x0e\xfe\x43\xd7\x00\x7c\xc4\x1b\x80\x46\xd4\x50\x49\x90\x51\x27\xb1\xd0\x69\x69\x4f\x5b\xdd\x64\x8f\xbc\x1b\x09\x1a\x61\x52\x4c\x1e\x08\x6e\x42\x55\x86\x74\xd7\x1e\xf1\x01\xb5\xb4\x1b\xf8\x50\x9a\x5d\x4f\xcb\x77\x55\x79\x41\x9a\x8c\x8a\x1c\xdf\x85\x85\x37\xbd\x7d\x6d\x6a\x23\xfd\x1a\x98\x0b\x21\x7f\xa7\xd4\x6b\xab\xa6\xcb\xd3\x9e\x9d\xcc\xac\x98\x2a\x38\x0d\x55\x28\xc2\x6e\x42\xf8\x83\xfe\x39\xf6\xaa\x53\xe2\x6e\x77\x92\x77\x50\xfd\x98\xce\x0c\x0d\x06\x09\x1f\x1b\xd9\x71\x56\x74\x9e\x20\x9b\xc2\xab\xc2\xaf\x2c\xf0\x6e\x6c\xb6\x40\x08\x16\xa8\xd9\xcd\x47\x61\x55\xe9\xa4\xa0\x18\x8e\x47\xe0\xd5\x86\xc3\x01\x39\x2c\x1e\x09\x10\x50\xeb\xe7\x80\xf9\xcd\x7f\x57\x36\x4c\x64\xb6\x5b\x96\x9f\x73\xe9\xd0\x7f\xfc\x53\xab\xff\x54\xac\xbe\xcc\x83\x31\x43\xd6\xb1\x54\x2a\x4e\xba\xbf\xc8\x01\xb1\xc4\xb9\xb0\x06\x74\xec\x57\x6f\xd6\x07\x6d\x1d\xf3\x99\x8f\xf7\x11\x92\x23\x87\x8a\x0a\x1b\x5b\xa3\xa1\x52\xed\x44\x9f\xa2\xa0\x7d\x44\x88\x22\x45\x88\x2e\xf9\xc0\x67\xae\xd0\xb3\xf8\x18\x2e\x68\x3f\xa5\x0c\x30\xea\x5b\x04\x02\x48\x54\x7e\x89\xb6\xc2\x1e\x40\x5a\x3d\x7b\xef\xd3\x24\xf1\xed\xf0\xc8\x19\x17\x69\x6a\x1e\x2a\x35\x4b\x63\x8a\x42\x1c\xcb\xd1\x35\x21\x91\xd9\x2e\x95\x2a\x02\xf3\x19\x2d\xe1\xd2\x7c\x70\xb8\xd3\x10\x0c\xd0\xf6\xe5\xcc\x93\xcc\x41\xde\xb3\xda\xbc\xa9\xb6\xa3\xc0\xc0\x56\x4a\xec\xb1\xf4\x04\xf7\x4d\xb7\x5a\xeb\xe5\x3b\xe3\x7c\x02\x57\x88\x37\xe0\xdd\xb6\x61\x7e\x3e\x31\xb7\x7a\x75\x1f\xfe\xff\x72\x1b\x86\x4f\xbb\xe5\x3b\xb0\x1f\xe4\x96\x35\x5f\xb5\xf9\x96\x6f\x3a\x6f\xbd\x40\xe0\x85\x6a\x14\x92\x3b\xf0\xab\x4d\xdb\xc2\x47\x19\x13\xc7\x92\x39\x24\x99\xab\x8b\xc2\xaa\x11\x80\x3b\x39\x2f\x98\xbd\x3b\xcb\x48\xd6\x5b\xb3\x32\x5c\xe2\xb9\xed\x81\x9f\xbf\xba\x2a\x27\x17\x9c\x41\x81\xdb\xa8\x99\x06\x2c\x69\x2b\xcb\xc3\x0c\x4d\xdb\xdd\x36\x17\x71\x66\x11\x58\x91\x88\x7e\xa5\x42\x8c\x00\x6c\x0b\xdd\x0e\xf2\x57\x55\x2c\x12\xc6\x1f\xe0\x93\xc3\xeb\xb4\x0d\xec\x2c\x2d\x10\x74\x6e\x79\x66\xc1\x5e\x2e\x55\x80\x61\x26\x07\xd2\x9a\x84\x74\xb7\x6b\xdc\x8f\x1b\xb5\xb8\xa2\xa7\x67\x24\x92\xd6\x8d\x9e\x59\xf1\xf3\xf6\xfd\x24\x2b\xcd\x6b\x7d\xfe\x40\xe2\xf6\x9f\x8d\x8a\xfe\xdb\x07\x65\xdf\x70\x2a\x83\x07\x97\x70\x3f\x4f\x8a\x07\x78\xd5\x91\xc1\x5f\x52\xa9\x49\x47\x85\x9f\x64\x57\xc8\x0f\x98\x89\xb4\x5c\x91\xd9\xc1\xe5\xd3\xd7\x6f\xda\xff\xf3\xf4\xf4\xe1\xd3\x47\xf0\x9f\x47\x4f\xed\xae\x16\x6b\x5e\x48\xfc\x0e\x92\xf0\x2f\xb0\xec\x85\x62\x14\xc2\xda\x66\x7e\x0d\x69\xce\x7a\x17\x43\xa6\x93\x86\x6d\x3e\xbb\x96\x0d\x0b\xcb\xdf\x82\xe7\x1b\x68\x2c\xf4\x56\xdb\x41\x8d\x1d\xfa\x8a\xe7\x97\x80\xaa\x0b\x2f\x38\x57\x15\xd1\x32\x3c\x42\x16\x19\xe2\x33\x38\x83\x9f\x39\x27\xe9\x45\xa5\x39\xf3\x45\xf0\x01\xa8\x9a\x51\x06\x0e\x02\x60\x17\xa5\x03\xaa\xcb\xbc\xc0\xc6\x73\xe7\x0f\x03\x18\xb9\x04\xff\x6a\xb8\x8b\x15\x56\xa2\x80\x27\x84\xe3\xa1\x89\xe9\x8a\xe6\xdd\xbd\xcb\x14\x5a\x1b\x22\x58\xc9\x11\x16\x82\xe2\x8b\x55\x1b\xca\x01\x86\xdf\xc7\x04\xd4\xf4\x79\xe9\xc9\x53\xbd\x2d\x6b\xbf\x07\x56\x51\xde\xf5\x78\x0f\x57\x9c\xf6\xc3\xc7\x9f\x06\x79\xcd\x0a\x7a\x7d\x5a\x99\x92\x2a\x41\x0d\xa7\x82\xa6\x12\x23\xa8\x22\x13\x0b\x5b\x1e\xbd\x76\x3d\x5d\x19\x6a\x20\x01\xdb\xec\x01\xbb\xd3\xa1\x4c\x21\xa8\xea\x2a\xbd\x86\x7d\x84\xc5\x01\x6e\xb3\x4c\x87\x19\xa2\x89\x71\x90\x7e\xe0\xb1\x4d\x6d\x77\x99\x6a\xc7\x99\xb8\x03\xec\x1b\xc2\x4b\xec\x25\x9f\xae\x22\x05\xe1\x3b\x49\xa5\x54\xaf\xae\xc4\x2f\xba\x1e\xe5\x5c\x56\x28\x4a\x3d\x97\x15\xd0\x14\x14\x76\xd3\x8e\xcf\x66\x79\x05\x2d\x15\xb1\x24\x30\x9b\x20\x05\x64\x32\x77\xb3\xe3\xf3\xec\x5e\xd1\xca\x25\x0c\x38\x61\x66\xd5\x1f\x68\x82\xc3\xca\xe7\x8f\x77\x21\x2f\xbd\x38\x4b\x75\x09\xfa\x56\xa9\x29\xe7\xfb\x07\x3d\x57\x5d\xff\xea\x75\x74\x08\x7f\xbd\x24\x5f\xf8\xc0\x55\x4d\xb4\xfc\xc8\x5e\x63\x59\xd3\x65\xd5\xbd\x56\xe5\x6d\x94\x2f\x5b\xc0\x4b\x85\xab\xad\xca\x34\x6c\x55\xce\x46\x60\xd6\xe9\x70\x5a\x3b\x88\x80\xae\x89\x06\x75\x31\x7a\xc2\xea\xee\x5b\x10\x33\x77\x40\xcc\xac\xba\xe6\x4e\xa2\xbc\x25\x03\x53\x50\x44\x02\x47\x43\xd9\xe9\x2c\x23\x53\xa9\xfd\x8c\xf0\x4a\x8a\x19\xfb\xea\x64\x13\xb3\xa1\x67\xb0\x2f\x15\x98\x90\x79\xf5\x46\xe2\xc0\x43\x75\xbe\x30\x1c\xdd\xc9\x02\x53\x57\xfc\x36\x11\xbb\x57\xbb\xe1\x1a\x1b\x8a\x0f\x03\x5a\xeb\xd1\xd9\xc6\xe7\x65\x07\xcd\x79\xcd\xbe\x1d\xf0\xd8\x00\xa2\x09\xfc\x19\x3f\x2f\x19\x20\x78\x84\x4e\x8c\x24\x36\x75\x90\xa0\xee\x11\xae\xba\x1d\xf9\xb4\x15\xa1\x70\x8c\x14\x4b\x8f\x72\xbb\x13\x89\x8b\x6e\x40\x7f\x1a\x6d\x6d\x1b\xbf\x30\x33\x0a\x89\xb4\x26\xfe\xdb\x08\xbe\x3b\x5b\x70\x3e\xe9\xa0\x2d\x21\x21\x26\xdd\x0b\xca\xce\x41\x41\x83\xb2\x66\x17\x05\xa5\x86\x28\x00\x38\x4e\xff\x3a\x19\x9a\x07\xc4\x62\x46\xa0\x78\x18\xaa\xca\x82\x71\x81\xac\x4a\x34\xbf\x20\x15\x11\x47\xb0\x71\x31\xc8\x04\x62\x7d\x4f\x53\x90\x10\x3e\x90\xec\xf4\x42\xe8\x40\x15\x47\x40\x80\xb0\xdc\x52\x98\x5f\x84\x52\x41\x88\x0a\x56\xff\x6c\x2e\xa1\x32\x81\xa8\x30\x48\xb5\x26\x25\x98\x1c\x09\x82\x01\x2e\x28\x18\xf2\xe3\x40\x04\x51\x8c\x38\x86\x05\xab\xb2\x2d\xf6\x5c\x1b\x99\xa4\x82\x62\xc4\x20\xfb\xe4\x3c\x46\x66\x99\x59\xc4\x7e\x16\x02\x6a\x19\x46\x88\x41\x08\x24\x8e\x8c\x35\x4d\x0a\xe0\x82\xcd\x56\xfc\x2f\xf8\xef\x2b\x55\x11\x2f\xb3\x54\xa2\x1e\xe8\x61\x6d\xf5\xf5\xed\x71\x4e\xae\xcb\x16\xf4\x7c\x37\xf4\x1c\xef\x51\x04\x7c\xb6\xd8\x42\x18\x52\x40\xf4\xb0\x68\x77\x3e\xc6\xa9\x46\x2b\xa3\xf2\xf5\xe0\x05\x9c\xaf\x4d\xe7\x8a\x6c\xcf\xae\xf2\xd2\x22\x17\x80\xfe\x0b\xb5\xe1\xfc\xdb\xec\x78\x1d\x6d\xbc\x7c\x4e\xe5\x23\x44\xe2\x56\x7e\x24\x66\x6c\x0c\xa9\x5d\xc1\xd1\xee\xb0\x7b\xed\x8e\x62\x76\x29\xf3\x87\xe6\x68\xb1\xd6\xce\x29\xa4\x64\x83\x5d\x70\xbc\x7e\x95\x0d\xcb\xc3\xc9\x2b\xf4\xc5\xf5\x78\x3c\x43\x64\xc0\xea\xae\x2f\xce\xa7\x76\x42\x80\x65\x05\x93\xee\x7c\x2e\x3e\xbc\x66\x62\x64\x8e\x2a\xec\x9d\xcd\xe1\x30\x4b\xd2\x64\x0a\xbb\xdf\x5e\xbb\xac\xc8\x2c\x1d\x7c\x19\x44\xe5\x97\x02\x41\x7d\x13\x10\xc2\x0b\xc9\x2b\x0b\xb8\x66\x48\x8b\x9e\x3a\x87\x2b\xa8\x04\xf0\x53\x00\xa7\x0a\x0d\xcd\x25\x4a\x33\x84\xf2\x88\x77\xd0\xf0\x8d\x0b\x50\xef\xc3\x90\x86\x86\x00\x3d\xb7\x1c\xe3\xa8\x38\xcf\xfb\xa4\x05\x08\x60\x8c\xb0\xbf\x75\x8c\xbd\x75\x91\x17\x7d\x97\x6f\x29\x41\x0b\x61\xee\x20\x20\xc4\xcd\x16\xde\x23\xbb\xca\xe5\x7a\x19\x07\xba\x7c\x11\x31\x20\x50\x18\x52\xd9\x09\xc5\xc4\xb1\x59\x45\xca\x0d\xe1\xd3\xa1\x5b\x78\x7e\x7d\x7a\x2e\xfb\xa8\x52\x83\xb5\x70\xaa\xa4\xc0\xe6\xf4\x81\xd6\x3b\xd6\x93\x1c\xa7\xd0\x2c\x9d\x64\xa6\xdb\x68\xa7\x4a\x21\x8e\x33\x82\xc4\x05\x20\xeb\xb9\x72\x15\x9e\x46\xbd\xbc\x2d\x30\x02\x08\xc7\xd3\x11\xb9\x92\x1d\x7b\x65\x01\xc4\x42\x57\xe0\x50\x15\x9c\x88\x45\x08\x57\xb2\x47\x01\x67\x48\x3f\x34\xb5\x20\x4f\x1e\xb4\x83\xa6\x1d\xa6\xb2\xc5\xd9\x08\x9c\xa0\xf1\x87\xbb\x2f\x2c\x65\x31\x3d\x09\xdd\xfc\x74\x67\xd7\xa7\xdd\xc7\x5c\x11\xd3\x5a\x5d\xc9\x9f\x43\xbb\xf9\xf2\xb0\xd0\xd8\x2b\x17\xc5\x5c\x2d\xff\x82\x0b\xc2\x97\x69\xb8\x28\xd2\xd9\x8d\x2f\x53\xbd\x28\x52\xc9\xc7\x5a\x10\xe4\xad\x7c\x5e\x46\x43\x5b\xeb\xab\xcb\xe4\x74\x5e\x84\x91\xec\xce\x98\xbb\x6d\x33\x2c\x4b\xb3\x7c\xd3\x96\xc2\xe4\xe7\xf0\x14\xc0\xc3\xa0\xc0\x17\xa1\x04\x22\x58\xe5\x2e\xbc\x1d\xf2\x7e\x41\x38\x0b\x7f\x40\x15\xbe\xcc\xc9\xd8\x63\x2c\x02\xd5\x78\x9e\x5f\x66\xf8\x70\x8c\xb8\x17\x2d\xd9\xa1\x68\x18\xb7\x17\x81\x65\x68\x92\xd2\x19\x1d\xe9\x58\x5d\xef\x40\xb6\x03\x56\xc4\xed\x5a\xb7\x16\x1a\xf6\x60\xe8\x22\x31\x85\x1b\x14\x11\x3e\x1c\xca\x82\xda\x8e\xda\x1e\x1c\xe6\x47\xe9\xe5\xf5\x42\x4f\x79\xcb\x7a\xe8\x56\x09\x9b\x4b\xe6\x01\x2a\x74\x29\x0e\x5a\x60\x32\x7c\x06\xe0\x1e\x10\x79\x10\xe5\xcb\x56\xb6\x0f\xf1\xb1\x19\xfd\x95\xaa\x91\x7c\xc8\x9b\x96\x65\x06\xec\xf6\xc4\x30\x70\xe6\x02\x3e\x07\x52\x6d\xf9\x33\xc5\xcd\x6c\x6c\x5c\x75\x17\x26\x87\x00\x47\xf8\x5a\x31\x24\x26\xea\xaa\x6b\xee\xea\x63\xcb\x3d\xb0\x60\x88\x44\x58\xa1\x6c\x4f\x9e\x5a\xf4\xf6\x4a\x31\xf2\x17\x46\x83\x99\x85\x97\xff\xbf\x1d\xff\xbb\xbd\xed\x41\xc6\xd4\x4d\x2e\xe6\x73\x43\x53\xb6\xb7\x87\x67\x9d\x71\xb6\x8d\x2f\xf4\x07\xf4\x9a\xe1\x5a\x96\x5c\xf4\x37\x5b\x6e\xce\x7f\xcb\x91\xc4\xb1\x78\x84\xa4\x6d\x6a\x7a\xf1\x3d\xba\xdc\x38\x38\x26\xdb\x50\x77\xbc\x6a\xce\x01\x67\xb1\xa5\x87\x95\x00\x69\xcc\x2c\x14\x3e\xd8\x78\x83\x36\x95\x1e\x43\x4f\x9d\x43\x24\x0f\xc0\x9d\x66\x73\x6e\x41\xd8\x07\xae\xb4\xe8\x72\xa0\x36\x64\xa9\xdc\x58\x10\xe7\x63\x81\xe0\x3d\x99\xab\x26\xd0\x5f\x23\x07\x56\xc5\x08\xb5\xa2\x23\x04\xc8\x16\x44\x4c\x3e\xfb\x8a\x21\xcf\x75\x55\xfc\xd2\x0f\x5b\xf8\x3e\xfa\xb9\x29\xab\xb5\x73\x97\x4d\x4e\x8e\x17\xe4\x48\x88\x2b\x6b\xcf\x15\x96\x24\x58\x3f\x82\x61\xbb\x06\xb7\x20\xa7\x8e\x87\xa6\x9d\x55\xa0\xb2\x08\xf4\x87\x04\x66\x16\x56\xc3\xde\xd0\xa6\xe8\x76\xc1\x82\x81\x75\x4e\x81\xcf\xef\xbf\x15\x95\x9b\x6f\x36\x28\x44\x24\x2f\x1d\xa0\xe2\x59\x3a\x30\x3f\x00\x3c\x07\x84\xd8\x70\xd6\x72\xe0\x42\xc5\xc7\x1a\xd1\x92\xf0\xc1\xae\x6b\x91\x5b\x98\x58\x77\x22\x4b\x86\x5e\xe7\x19\x48\xc2\x55\xd6\x60\x85\xf4\x8c\x87\x56\x86\x77\x33\x01\xa9\x9d\x3e\x65\xc0\x72\x6f\x17\x60\xff\x3b\x79\x89\xff\x6d\xea\xbc\x2d\xcf\x17\xbb\xba\x5b\xba\x5e\x44\x95\xd4\x82\xfe\xc3\x73\xd7\x8c\x69\x23\x07\x6b\xb9\xf2\xf6\xc2\xc7\x42\xd4\xb1\xed\xd6\x23\x52\xd6\xd0\xde\xc9\xd6\x99\x98\x11\xa9\x18\x8a\x39\x76\x01\x16\x2d\xbb\x8a\xb1\x1b\xcd\xaa\x7d\x99\x2b\xa6\x45\x84\xbe\xcb\x99\x78\x05\x79\xc1\x51\x24\xa4\xb4\xac\x67\xcc\xf7\x91\x74\x9a\x18\x5c\x46\xd7\xd7\x92\x77\xc7\x56\x5d\xc1\x88\xd3\x24\xe7\x36\x1b\xf9\xd0\xe2\xed\x12\xda\xaf\x06\xb0\xb0\x16\x8f\xc4\xab\x02\x97\xcc\xfe\x54\x16\x07\x8c\x6d\x2c\x2c\x6f\xb8\x31\x8e\xc7\xc0\x47\xcc\x58\x52\xbe\xd9\xaa\x78\x85\x6d\x48\xb0\xd4\xe9\x4f\x93\x79\x7a\x4e\x56\x04\x03\xb4\x8f\xf0\xd4\x7b\xcc\xd7\x3b\xd9\x3b\xb9\x6d\x03\xbb\xf1\xb6\xed\x2a\x23\x9c\xb4\x1c\x54\x7d\x68\xb0\x44\xe6\x44\x8e\xf9\x41\x48\x57\x4c\x9e\x14\x88\x23\x66\xe6\x0b\x7f\x72\x40\xcf\xd4\x55\x35\xce\xcd\xf6\x04\x6b\x86\x22\xb9\xca\x1a\x66\xa2\x81\xfc\xa0\x1e\x88\xd4\x8b\x64\x74\x45\x78\x4f\xce\xca\x55\xfe\x72\xf5\x38\xf8\x64\x14\x45\xe9\x5d\x38\xcb\x60\xe9\x49\xeb\xa9\xb5\x92\x6b\x2d\xd9\x52\xa4\x93\x8e\xf6\x7f\xd8\x05\x8b\x7f\xb2\x1d\x76\x2e\x3b\x37\x35\xed\xb9\xf3\x12\x50\x9c\xba\x96\x6b\x0b\xac\xdb\x07\xde\x3d\xb7\x27\xb5\xf1\xde\xcc\x3c\xf9\x53\x43\xc7\xe2\xa1\xe8\xbe\x31\x96\x1c\x49\xea\xb2\x98\x3f\x44\x18\x7d\xb2\xb8\xac\xfd\x96\xf6\x39\xdc\xf0\x70\xdc\x9e\x61\xbd\x57\x47\x01\x99\xfe\x1c\xa3\x1c\x8c\x9e\x87\xde\x35\xc3\xa8\xe5\x7c\xc6\x38\x32\xae\x67\xa0\x17\xad\xa3\xd9\xea\x24\xfb\xf9\x00\x4f\x07\x44\x0d\x8a\x23\xb6\x36\x5b\xdf\x07\x66\x8d\xf0\x50\x47\x8b\x69\x43\xd9\x2e\x66\x69\x29\xa8\xc3\xe6\xa9\x5a\x32\xa8\x29\x09\xc4\xb5\xdb\x03\xe4\xf6\xaa\xb1\x2e\x48\x08\xc4\x4d\xd7\x21\x69\x12\xb4\x80\xac\xe2\x81\x50\x23\x1f\xab\x00\x84\x08\x5d\x7e\x95\x99\xb5\xc8\x10\xe6\x1c\x2a\x03\x36\x1e\x95\x7f\xe0\x73\xb1\x30\xa4\xd2\x3c\x62\xca\x6c\x2e\xd8\x97\x65\x34\x2c\x51\xa2\xd4\x7d\x34\xc9\x02\x43\x13\xf1\x50\x73\x3b\x01\xd5\xf0\xd1\x35\x7d\xed\x6a\x79\xb3\xf2\x84\xea\xcc\x01\xeb\x73\x13\x0c\xf6\x67\xd2\x8f\x5c\x98\xb1\x55\xae\x54\xbe\x84\x2b\x36\xee\xb7\xd8\xe2\x10\x2f\xcd\x75\x3a\xae\x29\xf2\xee\x4a\x51\x18\xd5\xea\xe7\x94\x05\x83\x49\x32\xcf\xeb\xe6\xbb\x80\x3f\x3e\x3c\x20\xd5\xcb\x30\xcd\x47\x49\xc1\xf8\x84\xb6\xb9\xa4\x99\x95\x5f\x3d\x28\x2f\xf2\xf1\x76\x79\x61\x9e\xf1\xf3\xa2\x68\xc5\xe6\x88\x37\x5a\x30\x09\x24\xcd\x22\x4e\xc2\x74\xab\x2b\xd2\x7d\xfc\x80\x8c\x85\x7a\x7e\xe3\xcd\xad\x16\xd9\xe7\x3f\xd0\xc4\x86\xb2\x68\xe1\xcc\xb2\x90\xae\xb0\x7b\x36\x88\xe7\xea\x87\x70\xec\x3e\xfe\xea\x51\xbb\x1a\xc7\xb3\xfb\xf8\x6b\xf5\x59\x47\xea\x34\x29\x7f\x6b\x87\x01\x39\xbb\x8f\xbf\xf9\xaa\x1d\x09\xba\x69\xbe\x7f\xd3\x8e\xc5\xd5\xec\x3e\xfe\xd6\x15\x70\xc1\x33\xcd\xe7\xaf\xdb\xcb\x63\x5a\x76\x9f\x3c\xac\xcf\x82\xc9\xae\x7b\x3a\xaa\x65\xf7\xc9\x63\x1c\x91\x8b\x4a\xd9\x7d\xf2\xb7\x27\x6d\x2f\xfe\xa4\xf9\xf2\x6d\xdb\x46\x9b\xec\x3e\xf9\xe6\xe1\x1a\xa1\x6b\x1f\x7d\x0a\x5d\xfb\x97\x86\xae\x75\xd0\xee\xcb\xc2\xd7\x6e\x1e\xfe\x74\xdd\xa8\xa6\x2b\xa3\x91\x8a\x69\x8a\x83\x6d\x22\x18\x97\xd2\x46\xd2\xb0\x91\x22\xe8\x69\x04\x28\x62\xbe\x9d\x8a\x32\x2d\xf1\x07\x1d\x95\xd2\xc5\xe5\x2e\x75\x32\x17\x67\x3c\x13\xd5\x8f\xb0\x1a\x6d\x97\xd4\xd1\x0b\x01\x41\x06\xaf\x84\x05\xc1\x49\xdf\x97\x3c\x60\xc4\xc5\xba\xb6\x39\xf0\x5d\x01\x58\x3a\x60\xf7\x42\x99\xb3\x51\xa6\x02\xf7\xd7\x45\x41\xf1\xca\x8a\xd2\xdc\x54\x90\x0d\xc0\x87\x75\x74\x2d\x72\x7a\xb2\xf7\xbb\xaf\xf4\x8b\x7e\xab\xf8\x62\x72\x2e\xb2\x2a\xb6\x4c\x7a\xed\x0c\x0c\xcc\xa4\x9b\x5e\x13\xf7\xb0\xba\x6f\x2e\xec\xbf\x8d\xdf\x41\x5d\x9c\x2d\x0c\x13\x74\x3d\xe9\x5f\xcc\x8a\x09\x06\xfb\x6f\x63\xd7\x4a\x06\x9b\x35\x2d\x66\x97\x66\xd5\x08\x2e\x0d\x6c\x87\xe0\xae\x42\x16\xe6\x1c\xb5\xd6\x9d\x04\x27\x11\x8e\x09\xef\x75\x82\x9a\xa6\x83\x85\x71\x11\x45\x7b\x41\x70\x0c\x3c\x2f\xd9\xbb\xac\xbf\x98\x7b\xc0\xd8\xa8\x4a\x29\x12\xe9\x20\xa9\x60\xa9\x65\xac\xa7\x00\x76\x77\xee\x68\xc8\x6f\x17\x28\xe5\xd6\xec\x16\x77\x61\xa0\xeb\x69\x5b\x67\xbb\xb3\x4c\x38\x45\xf0\xed\x2b\xcc\x81\x45\xcc\x69\x0c\x68\x7a\x9f\x59\x37\x34\x4e\x68\x62\x4c\x35\x3d\x2b\x2d\x54\xcb\x06\xb5\x58\x97\x96\xc5\x14\x3d\xd9\x78\x6f\x29\x90\x1a\x6b\x4e\x86\xb1\x06\xb3\x76\x12\x6c\x7e\xb1\xf6\xe0\x50\xab\x4c\x6c\x06\xf9\x70\x98\xcd\x88\x40\x88\x12\xd7\xec\x8f\xfb\x96\xcb\x44\xcf\x38\xe7\xab\x20\xae\x2f\x4a\x39\x34\x53\xf1\x37\xd0\x0f\x8d\x3c\xaf\x71\xeb\xc7\x58\xde\x36\x1b\x64\xe4\x14\x55\xc6\xef\x2d\x49\x1a\x83\x50\x15\xd7\x19\x54\x4a\x9b\x05\xee\xe5\x8c\xed\x1d\xf3\x8a\xe9\x3e\x09\x5d\xde\x3b\xcd\x00\x6b\xeb\x68\x95\x5f\xa0\x02\x8c\xbe\x08\x35\x51\x83\x9b\x17\x2e\xe6\x68\x42\x3c\x9b\x28\xcd\xbc\x32\x1c\xea\x09\x45\x0a\xfc\x9a\xe6\xe8\x34\x74\xd4\xb7\x36\x51\xad\x95\xb2\xff\x9c\x66\xcd\xe9\xd5\x7c\xf3\x09\x43\xe8\xea\xd4\x45\x36\x4e\x81\xa7\xa3\x50\x63\x0f\xb5\x6b\x77\x84\x9a\xf2\xa6\xd5\x13\x77\x31\x9e\x57\x6d\x3e\xe7\x3d\xcd\x39\x83\x2c\x36\x2e\xb1\x79\xc4\xd8\xe0\x0b\xf4\x38\x05\xd1\x43\xa9\xa5\x7a\x43\x9e\x3d\xec\xe1\x19\xa0\x7d\xb9\xb0\x15\x80\x3a\xe4\x20\x9d\xec\x1a\x93\x7a\x89\x28\xdb\xf2\xba\xea\x41\xac\x56\x0c\x7e\xdd\xa1\xc7\x06\xde\xba\x9d\x0f\xc0\x6d\x5f\xc5\x5e\x17\xee\xe9\xb9\xaf\xce\x3e\x90\x5e\x88\x3d\x8c\x11\xaf\x9c\x43\x99\xc8\x56\xe5\x3c\xe1\x4c\xec\x68\xe7\xd8\x5c\x74\x0d\x0b\xb2\xba\xea\x67\xf6\x81\xec\x24\x07\xf6\x75\x79\xb3\xb5\x54\x13\xaf\x2d\xa8\x74\xef\xed\xbc\xad\xab\x44\x5e\xa6\xf4\xf5\x4c\xe9\x9e\x41\x8f\x4b\x17\x43\x84\xbd\x08\xf9\x2a\x17\x2b\xf4\x5c\xc7\x5e\xc8\x51\x9d\xf7\x76\x52\x5c\x4d\x90\x3e\x20\xa5\xa6\xb8\x3d\x73\x8e\x40\x70\x45\x66\x77\xf7\xef\x53\xc0\x11\x34\xbe\x05\xac\x7f\x05\x91\x2f\xb4\x0d\x26\x1e\x11\xf8\x81\xdb\x02\x03\x19\xb2\x03\xc8\x4b\x1b\x17\x08\x9b\x62\x37\x72\xb8\x6a\x06\x59\x06\x40\x78\x29\x4a\xd2\x98\x55\xf1\x6e\x8b\x46\xc9\xcb\x05\xa2\x0d\x0a\xfb\x44\x08\xab\xfa\xca\x4e\x29\xea\x13\xd1\x7a\x8f\x99\xb6\x84\x99\x9d\x9b\x7a\x51\x3a\xdf\x23\xaf\x64\xb9\x11\x29\x2f\xd4\x11\x8d\x07\x45\xa1\x5f\xaa\x76\x3d\xbd\x90\xc4\xaf\xa4\xa8\x4c\x00\xd8\xb2\x0d\xae\xf1\x5b\xd2\x54\xb5\x57\x35\x59\xf5\x77\x58\xdd\xfe\x7a\xa6\x36\xba\x55\x00\x7e\x94\x0d\xba\xef\x6c\x25\x77\x5f\x1e\x5a\xab\x4e\xf8\x9b\x04\xbe\x66\xcf\x20\x54\x0a\x3c\xec\x91\xc5\xce\xfb\x1a\xd3\x30\xa3\x5b\x1b\xc5\xc4\x88\xdf\x9f\x25\x57\xb8\xb7\x31\xb4\x01\xba\xcd\x73\x03\xb0\x8f\xc6\x00\x26\xd7\x60\x63\x50\x6b\xe9\xcd\x96\xff\xd9\x18\x35\xdd\x72\x3b\x53\xd8\x6b\xb4\x0d\xd5\x56\xa7\x56\xf9\x78\x95\x39\xa0\x04\xc3\xe2\x11\x46\x1c\x1c\x8e\x14\x88\x73\xce\x52\x69\x09\xf4\x46\xac\xfe\x86\xb4\x11\x0d\x8d\xed\x04\xe1\x9c\x3c\xe5\x89\x07\xf1\xf0\xd1\x73\x08\xd8\xd2\x4d\x5e\x0b\xb1\x72\x1f\xad\x98\xac\x01\xfa\x68\xc2\xea\x35\x7d\x1d\x70\xb2\xb6\x58\xb7\xa6\x67\x58\x82\x71\x76\x95\x65\xa3\xad\xdd\x7e\x73\x95\xdb\xc9\x18\xa3\x60\x7d\x41\x36\xbb\x18\xd2\x11\x78\x3d\x3f\x2a\x24\x9c\x91\x69\x46\x4e\x20\xf0\x9e\xca\xca\x39\x1a\xee\x7b\xf8\x0d\xd5\xb8\x25\xa4\xea\x44\xe6\x1a\x80\xd3\xe0\xa1\x6a\xea\x7f\x5b\xfa\x1d\xf6\xed\x73\x6c\x9f\xf5\xe7\x48\xb7\x91\x1a\xd1\xec\x70\xdc\xd3\xf4\x1c\x9c\xf8\x59\x4d\x31\x2f\xa6\x09\x06\xc9\x8f\xb6\xc5\x86\xb5\x61\x5b\xf8\xb9\xa1\x80\x1d\x48\x8b\x2f\x28\x0d\x83\x4c\xd4\x0d\x8e\x7f\x67\x88\xe9\x66\x99\x79\xc0\x0c\x62\x18\x70\x6e\xa8\xf0\xe2\x0c\x84\xbd\xdb\x43\x96\x1d\x90\x99\xc0\x76\x5e\x96\x66\x1a\xb7\x9f\x3c\x7e\xf2\x75\xcb\xef\xa3\x33\x20\x7b\xad\xae\xc4\x0f\x35\x0f\x5b\xac\xd0\xa3\x0d\x0a\x87\x40\x89\xee\x7e\xb3\xaf\x66\x27\x18\xb3\x62\x4a\xf3\xc8\x98\x0c\xad\xd7\xbe\x96\x16\xc6\x65\x85\xb5\x26\x46\x89\xae\xd3\x89\x03\xe3\x16\xfb\xf4\xef\x2e\xf6\x22\x11\x0f\x27\x94\xaf\x23\x7f\xe1\xdb\xdf\xa3\xdb\xfd\x08\xa6\xef\xdf\xd2\xcb\xf4\x18\x0f\x80\x4f\xb2\x3a\xa1\x63\x51\x82\xb3\xf2\xfa\xe1\x9b\xc8\xc7\x47\x6f\xd4\xb7\x88\xa5\xa7\x95\x5c\x5a\xae\x26\xa2\xfd\xb6\xe8\x85\x55\x11\xea\xed\x05\xa8\x37\xb2\x0d\xac\x04\x7c\x38\x11\xe9\xb7\x4f\xb6\xb4\x51\xb4\x9f\x12\xfa\xb3\x50\x0d\xca\x95\xa5\x6e\x7b\x71\xce\x76\xd0\xd2\x6b\xfa\xfc\x26\x74\x01\xa9\x11\xb0\x3a\x17\xa9\xb5\x85\xac\x1b\x88\x1f\x57\x88\x17\x1f\xaf\x23\x5e\xfc\x24\x49\xfc\x90\x92\xc4\x1f\x66\xc5\x95\x99\x96\x83\xc9\x65\x3e\x2b\x26\x63\x2b\x5b\xdc\xbe\xff\x4f\x74\x4d\x4b\xb2\xcb\x7c\xd4\x45\xe3\xe8\xa5\x32\x47\x73\x8f\x1e\xee\x1f\x61\xb8\x37\xbc\xdb\xaa\x72\xc7\x20\x87\x88\x14\x31\x8d\x0c\x90\xaa\x65\xf0\xbb\x16\x2c\xee\x9e\x99\xb6\x53\xc0\xd4\x48\xaf\x52\x84\x05\xb7\xb4\x2d\x1d\x41\x78\x32\x96\xe4\x49\x60\x2c\xe1\x41\xac\x91\x3b\xf0\xd6\x86\xb9\x3c\xcf\x30\xe0\x27\xc9\x6e\xce\x68\x0e\x6c\x60\x4f\xeb\xc2\x42\x40\x89\x86\x19\x9d\x95\xca\x12\x7f\xc6\x17\x18\xf1\x62\xe2\x68\x82\x3b\x01\x23\xa8\x8a\x2b\x8a\x53\x92\x84\xce\x33\xf5\x93\x2f\x56\x9b\x7c\x32\x30\xe0\xb9\xb9\x80\x38\xc2\x58\xd7\xb1\x98\xc1\x6c\x76\x06\xc0\xf5\xcf\x50\xe2\xf4\x32\x5a\x16\xd5\x36\x7c\x23\x03\xc7\x03\x50\x0d\xcf\xd3\xd9\xdb\xc5\xf4\x87\xeb\xc3\xfd\xf5\x6a\x7e\x55\x57\x3c\x88\x5c\x07\x32\x5d\x87\xb3\x92\x64\x6a\x7c\x76\x21\xdc\xfb\xc6\x86\x8d\xf3\xa3\x5f\x73\xec\x7a\xd2\x5e\x5f\xcb\x8c\x26\x14\x47\x9f\xf4\x48\x84\x14\x0e\x2c\x68\xc2\xe1\x05\xdb\x3e\xbf\x3b\xb2\xef\x2c\xaa\x6c\xba\x00\x70\x19\x00\x55\xee\xa7\x28\x8c\xc4\xb8\xd3\x87\xfb\xa2\xe1\xf4\x8d\x5c\x05\x90\x41\x42\x97\x11\xfb\x75\xb8\xff\x6c\x56\x8c\xd5\x9a\xa9\xeb\x55\x62\x06\x1e\xee\x7b\xef\x01\xdc\xc6\x1d\x6c\xfc\x70\x5f\x67\xda\x59\xa9\xf0\xaa\xdf\x2a\x40\xa1\x1d\xfd\x0d\x4f\x57\xf7\xf1\xdf\x1e\xb7\xfd\x63\xd4\x7d\xfc\xed\xb7\x48\x66\x9f\x7c\x50\x2d\xce\x97\x9f\x68\xef\x2d\x69\x6f\x85\xe8\x46\x88\xeb\x3a\x9a\x19\xce\xc8\x67\xe2\x29\x31\x66\x9e\x85\x7b\xa4\xc5\x8a\x7d\xf8\x11\x4b\xde\xd1\x6f\x1c\xea\x42\x97\x64\x7d\x76\x0d\x63\x01\xbc\x30\x5a\x8b\x9b\x53\x6a\xde\x33\xa0\x3c\xef\x00\x9b\x3e\x83\x77\xe2\xa5\x78\x22\x08\x41\xcd\xe6\xfd\x16\xc0\x33\xa7\xf0\x70\xef\x26\xbb\x36\xa1\xbc\x36\x7c\xf6\x98\x0e\x61\x69\x03\xc0\x93\x37\xe3\x00\x1f\xb6\x7e\x10\x63\x73\x42\x11\x7b\x88\xcc\x01\xf9\x79\x8a\xca\x89\x3e\x20\x87\x4e\x80\x6d\x66\x75\x80\xb2\x62\x46\x39\xec\xc4\xf3\x7c\x5b\x7e\x8e\x49\x60\xb6\x7a\x52\x60\xd8\x48\xe6\xcb\x2b\x0e\x4c\x08\xc1\x38\xe9\x71\x96\x8f\xd3\x73\x17\x2f\x70\x9c\x0f\x06\xa3\xcc\x06\x97\xc6\xb7\x03\xec\x3f\xdb\x99\x7a\x8a\xbc\x79\x6f\xa6\x2e\xe8\x21\x1a\x98\x10\x92\x04\x06\x42\x63\x31\x8a\x61\xb4\x7f\x63\xe8\x89\xfb\xc9\x28\x85\x27\xba\x8b\xc2\xf5\x7c\x31\x9a\xe7\x7b\x14\x36\x4d\x79\x1c\x70\x47\x6b\x6e\x24\xd7\xcb\x1a\x93\x80\x38\xa1\x54\xdb\xea\xc3\xa0\x91\xdd\x93\xfd\xaf\x8c\x7d\x6a\x2c\x3f\xbb\xd5\x9e\x99\x77\x51\x1f\xe1\x01\x47\x5a\x21\x82\x68\x81\x71\x3b\x51\xdb\x9c\x43\xe0\xaa\x3d\x69\x9d\xba\x0d\xa7\x60\xb3\xb3\x35\xb2\xaf\x6e\xa8\x76\x33\xd5\xb4\x54\x9b\x7f\x75\x53\xf1\xed\x50\xd3\x4e\x3c\xf3\x4e\x60\x15\xe2\xf9\xe0\xad\x36\x05\x89\xf4\x6a\x83\x47\x4b\xf8\x36\xa9\xbc\x45\xbe\xfc\xf4\x16\xf9\xc0\xf7\xe1\xaa\xeb\x10\xb6\xe0\xcb\xc5\x2c\x23\x8f\x4c\x72\x92\xaa\xb9\x15\xcd\xb3\x1b\xec\xff\x0f\x20\x32\xbc\x7f\x31\xea\x14\xfd\x70\x30\x3c\x29\xca\x9b\x02\x3f\x15\x1b\x51\xd7\x53\x06\x7f\x06\xae\xb6\x9f\xb5\x93\xac\x73\xde\xb1\x12\x6f\xce\xc7\xf3\x8c\xe3\x9b\x21\xca\x1b\x7b\x4d\xd9\x51\x07\x6e\xb9\x6d\xab\xde\xc6\x59\x27\xa7\x79\x20\xd7\x29\x09\xf1\xc9\xf4\x1f\x29\xb9\x46\x69\x31\x5b\xa7\xb4\xb8\x1d\xcf\xcd\xdf\x61\xd7\xd9\x20\x1a\xbd\x82\x83\x31\x58\x45\xaa\x5c\xbd\xfc\x93\xe4\x53\x2b\x67\x1d\x4e\xf1\x7d\x16\xa4\xf0\x01\x5a\x59\xa6\x01\x74\xf0\xbe\x90\x0c\x1d\xf3\xb6\xf9\x87\xd4\x26\x91\x59\x5f\xaf\xac\x0d\xc4\x3e\xf7\x5d\x27\xe0\x7b\x28\xc4\xba\xef\xcb\x7a\xbe\x1b\xe4\x97\x24\x4d\x02\x69\xc7\xd3\x3f\x9c\x5d\x48\xc7\x7e\xbd\xf9\xfb\xb0\x28\xbe\xdb\x36\x39\xff\xbe\x23\x15\xdc\xd0\x1f\x28\x0f\xc2\x16\x5f\x14\x20\xc3\xc4\xf3\x88\xd7\x41\x9f\x5c\xed\x79\x5f\x25\x19\x6c\x2c\x78\x68\xf2\x85\x1b\x38\x60\x8b\x09\x37\x83\x9f\x3a\xeb\x83\x77\xe4\x58\x4d\x96\x74\x8b\x99\xe0\xf6\xe0\x94\xa0\x3e\x08\x17\x13\x39\xb7\x07\x93\xec\x3c\x05\x93\x69\x32\x9a\x21\xf5\x0f\xd4\x24\xda\x7d\x88\xb0\x9d\x1c\x41\xe7\xa8\xb8\x76\xb3\x2e\x6d\xc0\xa4\x4b\x00\x4d\x80\xa6\xab\x1b\xb2\xc0\xea\x30\x2c\xbe\xa7\xc1\xeb\x05\x3a\x28\x68\xba\xd2\x6f\xf2\x3f\x22\x2d\x53\xdd\xc3\x36\xba\xa9\xf0\x9e\x8f\xea\x96\x3c\xff\x51\x8e\xb5\xdf\x76\x61\xf5\x7d\xdc\xea\xe4\x9e\x3e\xe3\x4d\xb7\xd0\x6d\x17\xa8\xbf\xe5\xe2\x73\x11\x77\x50\x2d\xc2\x53\xe1\x1a\x71\x9a\x98\x15\x17\x4e\x64\x70\xf6\x2d\xe6\x91\x9f\xee\x93\x6f\xe8\xc1\xf5\xd5\x27\xb3\xb9\xbf\xfc\xc1\xe5\xb1\x80\xcb\xed\xe7\x6a\x9e\x4b\xa1\x70\x2a\x96\xcd\x93\x6a\x39\xe4\xa9\x6a\x51\x4c\xf1\x73\x2b\xcb\xd3\x58\x11\x6d\x98\xaa\xcb\xb1\x5d\x6a\xa4\x88\x58\xac\x46\x72\xff\x4a\xc1\x3d\x8a\x58\x4b\x61\x16\xaf\xbc\x32\x6c\x8d\x14\xd5\x66\xaf\xba\x94\xb5\x7a\x8d\x94\x71\x16\xb1\xba\xc4\x0b\xa4\x80\xda\x2b\x3b\x2c\x17\xe4\xf0\x4a\xbf\x34\x17\x69\xa4\x08\x7c\xf6\xf3\x85\x36\xb5\xb1\x42\x15\xbb\xdb\x65\x35\xa0\xe1\xee\x1a\xb5\x90\x81\xaf\xae\xe9\x95\x13\x59\x56\x8b\xbb\x44\xaf\x8c\x65\xbb\x6b\xac\x3c\x4b\x2b\x1e\x20\x53\x2b\x3f\xa3\x6f\x1d\xcd\xf5\x02\xc0\xfa\x35\xa5\xf8\xb9\x55\x82\xe4\x5d\xd7\x6c\xb4\x54\x8e\x14\xfe\xd1\x09\x99\xb7\xba\x7c\x6b\x1b\xa0\x5a\x22\x8a\xee\x42\x10\xd5\x1f\xa7\x1b\xed\xb4\x77\xc1\x63\x7b\xb0\x18\x87\xf0\x64\x1a\x66\x46\x61\x83\xb1\x19\x98\x04\x7a\x3b\xa5\x2c\xef\xdf\x5b\xaf\x02\x8b\x38\xa3\x3d\xcc\x29\x68\x58\x08\x55\xe2\xdc\x07\x26\x5e\x58\x09\xbe\xd2\x1a\x84\xe8\xc3\xa2\x6b\xa4\xc6\x6c\xb9\x69\xe8\x63\x4f\x82\x48\x00\xd4\x57\xaf\xd3\xd0\x0f\x24\x57\x43\x43\x5b\xb7\x3e\xa8\xfc\x43\xf7\x74\x38\x6a\x0f\xe8\x1c\xa2\xdd\xad\x25\x8c\xca\xe5\xbe\x5a\x94\x49\xeb\x03\xed\xd8\xd5\x75\x3e\x7c\xa9\xc0\xd1\x30\x0f\x74\x72\x91\x79\x12\x18\x60\x24\x4c\x27\x11\x93\xb6\x43\xdc\xd6\x83\x88\xfb\xb1\xa4\xd0\xf0\xe5\xd7\xeb\x3e\xbf\x19\x1b\x9e\x13\x7e\xf9\x46\xf8\xb7\x30\x4b\xc5\xab\x99\xe2\x43\x42\x9d\xab\xca\x08\x42\x8d\xca\x57\x49\x53\x6c\x69\x92\xb0\x31\xc9\xcb\x0b\x88\xa5\xd4\x75\xdf\x83\xe1\xbd\xd2\x16\x95\x4d\x62\x2a\x49\xc0\x90\xa3\x5d\x19\xcc\x3a\x9b\x0b\xb6\x74\x25\x51\x56\x49\xd9\x34\x86\xed\x54\x33\x84\xf3\xe9\xbe\xd6\xcd\x6b\x52\x58\x0b\x50\x66\x1b\xa7\x38\xba\x37\x35\xed\x5a\xc3\x1e\x35\x31\x61\xb7\x48\x9c\xb1\xc6\x82\x71\xce\x37\x95\xc5\x37\x8c\xa8\xe9\x61\x71\x9d\x0d\xde\xd0\x4e\x6c\xda\x0f\xad\x6e\x74\xc3\x9d\x8d\xd2\x89\x61\x8c\x66\xd9\x28\x4b\x19\xd6\x9d\x9e\x4f\xb4\x1d\x00\xf2\x0c\x78\xeb\x1f\xf7\x84\x71\xa8\x6e\xfb\x3b\xfc\x13\x15\x1a\xa9\xac\x20\x9c\x87\x79\x0f\x01\x11\x01\xd2\x05\xb2\x4c\x65\xf7\x6a\x7a\x75\xa1\x0c\x7f\x95\xc5\x99\x08\x2e\xc5\x7f\x94\x79\x76\x2a\x35\x41\xc6\x9d\xac\xb9\x29\xd8\xa3\x58\x43\xf6\x34\xfd\xef\x89\xe0\x0f\x58\x25\xf3\x6a\x89\x60\x89\x68\xdc\x69\x24\x60\x86\x31\x79\x4e\x02\x28\x43\xc7\x1e\xb9\x27\xf4\xff\x35\xca\x00\x70\xf2\x8f\x1a\x9e\xca\x99\x22\xdc\x44\x5e\x05\x5e\xd6\x38\x70\x1c\x39\x0d\x68\xc4\x8f\x82\xfc\x7f\x23\x78\x25\x31\x34\x12\xcd\xbc\x00\xb8\x6b\x36\xb6\xf2\x63\x0f\xd9\x46\x00\x97\xac\x68\xd3\xb6\xa9\x05\x94\x54\xdc\xda\x65\x20\x56\x84\x7f\x23\x98\x01\x70\xae\x1d\x95\xc7\x69\x77\x3c\xff\x33\x4a\xcc\x1d\x7e\x94\xc2\x7a\xc0\x98\x89\x59\xc5\x74\x4c\x95\x63\x2b\x21\xd7\x70\x58\x31\x67\xc0\x97\x8c\x38\x7e\xd4\xe4\xd1\xe0\x75\x4e\x59\x50\xc9\xf6\xcc\x37\x97\x63\x95\x82\x1a\x27\xd2\x95\x6c\xa0\xaf\x72\x35\x26\x9e\x30\xcb\x01\x87\x9d\xc1\xcd\x7d\x34\x23\xe8\xad\x87\xde\x1c\x95\x27\xc5\xf4\x67\x30\xae\x09\xda\xad\x4e\x13\x3d\x6a\x2b\x26\x77\xd5\xc1\x88\xf5\x9d\xc6\xb7\x0e\x60\x99\x9c\x4f\x3a\x83\x42\x3a\xf0\x6f\x1a\x6a\x89\xc1\x16\x17\xd3\x36\xd3\x90\x73\xc0\x28\x34\x5f\xc9\x10\x0b\x83\xa4\x9a\x2b\x3f\x8a\xe4\x04\x6f\x8c\xc9\xf9\x0d\xbe\x93\xcc\xbe\x00\x7d\x87\xf9\x8f\xa8\xaa\xe1\xf1\x04\xea\x8f\x4e\x64\x3b\x5b\xbe\xef\xc4\x59\x92\xbe\xc7\x94\x63\xd4\xb9\xd0\x1b\xd4\x54\xae\xd2\x6f\xb4\xd9\x29\xd7\x29\x20\x3b\xdf\x4b\x57\x5e\xf1\xf2\xf1\xa0\xd8\x0a\xde\xec\xcf\x6c\x46\x16\x3b\x0c\x35\x69\xfa\x1a\x43\x87\xaa\x9c\x21\x5c\x4f\x25\x62\xf7\x54\xa2\x87\xfb\x6d\xdd\xa7\x0a\xd0\x4e\xb8\x59\x3c\x8c\x94\xc8\x7e\x51\x24\xea\x8b\x2f\x6a\x0f\x1f\xb5\xac\x02\x19\x11\x62\x90\x78\xfd\xf3\x06\xa1\xa7\xb6\x43\x9f\xaa\xf0\x7d\x53\x85\x44\xe5\x6a\x71\x6f\x3b\xaf\x1e\xfe\x1c\xaf\x49\x46\xa8\x83\x2b\xe9\xe3\x13\x7b\xd6\x00\x0b\x69\x7f\xa0\x3c\xcd\x1c\x4c\x09\x36\xcc\x4c\x64\xac\x31\x4c\xaa\x87\x5c\xa0\x41\x90\xc0\xcc\xf6\x05\xa8\x13\x43\x4f\x28\xa7\x2b\x37\x69\x6d\x7f\xec\x77\xf0\xfb\x16\x50\x04\x14\xac\x52\xa0\x23\xd2\x46\x99\x6b\x81\x29\x0b\x3f\x3f\x15\x81\x21\x03\xe4\x74\x80\x16\xeb\x59\x3a\x1b\x29\x08\x02\x79\x17\xa0\xe5\x74\x81\x4e\x67\x86\x69\x38\x5b\x9c\x9f\x3b\xcc\x9f\xdb\x5b\xbb\xc1\xc4\x88\x1d\x60\x60\x57\xef\x6c\xde\xba\xc9\x8b\x22\x74\xa6\x67\x31\x06\xbb\x49\xd3\x21\xcc\x14\xf8\x8e\xef\xe5\x2d\xb7\x43\x97\xbc\xcc\xad\x50\xb0\x98\x9d\x17\xf3\x79\x36\x51\x41\xaf\x6c\x3b\x39\x47\xbb\x8a\x7b\xb0\x27\x0c\x0b\x6e\xeb\x4a\xfb\xfd\x1c\x34\xb8\xa8\x43\x9c\x4b\xcc\x1d\x31\x71\x9c\xc8\x85\x16\x44\xac\x41\x44\x68\xc1\xd5\xad\xc4\xe8\x28\x31\xcc\x59\x05\x02\xaa\xe3\xe1\xb3\xc8\xc7\xc0\x3d\xdd\x25\x44\x80\x81\x95\xe6\x2d\xea\xae\x4e\x06\x3a\xce\x30\x07\x3c\xf9\x0c\x29\x63\x01\x51\x5f\x3b\x55\xe3\xce\x21\xec\x33\x0b\x99\x03\x13\x2b\x55\x91\xa4\x74\x26\xf1\xd1\xd9\xca\x08\x5e\xfb\x68\x51\x02\x35\xa3\x3d\x34\xa0\x49\x49\xf4\x6b\xc4\xb4\xea\x6c\xd9\x0d\x62\xbd\x10\xdd\x89\xd9\x71\xa9\x8e\xba\x79\x87\x48\xe5\x00\x0c\x4d\xe0\x29\xdc\x3b\xdb\xbb\x4b\x15\xef\x00\x7f\xaa\x4b\x71\x8e\x91\xc2\xc1\x2e\x89\xa4\xc3\x0e\xbe\xd3\x96\x21\x37\xba\x82\x3f\x12\xed\x06\xdd\x33\x88\x09\x27\xf3\x54\x6e\x8a\x2a\xaa\xa5\x19\x79\x13\x6a\xa1\x60\x49\x77\x38\xf2\x34\x08\x38\x5a\x87\x43\x1e\x7b\xb9\x8f\x02\xed\xe5\xc4\xd2\x5d\x16\x1f\x00\x89\xe5\x18\xc1\x53\xd8\x16\xf5\xd8\x1a\xcc\xeb\xf8\xa4\xe0\xe1\x01\xda\x7c\x30\x12\x92\xe0\xdd\x3e\x1a\x96\xab\x0e\x51\x4e\x71\x83\x80\xd4\x92\xdc\x2b\xe6\xc4\xce\x8f\xcd\xf1\xc8\x40\xe8\x50\x12\xa9\xea\x90\x8f\x25\xb8\xd2\x61\x01\x3c\x8d\x73\x15\xbd\x81\x4a\xe2\x26\x83\x8c\xed\x04\x43\xc7\x78\x6f\x6c\xc0\x65\x68\x5b\xf3\xf4\x3b\x53\xb5\x7b\xb8\xeb\x42\xe8\x2e\x25\x38\x8f\xa5\x47\x21\x4f\x14\x31\x0c\xab\x03\xbf\x13\xeb\x5b\x34\x49\x3e\x07\xa7\xc0\xaa\x31\x30\xbb\x12\x04\xd0\x19\x84\x9a\x83\x0f\xe6\x72\x31\x05\x39\x39\x5b\xd7\xc9\xba\x91\x96\x69\x60\x5e\x45\x40\xfb\x2b\x9a\xa7\xa0\x42\x0f\xbe\x43\x47\x75\x24\xe7\x99\x69\x10\x6a\xf1\x7b\x45\xbf\x04\xf4\x4b\xe1\xce\xa6\x2b\x71\x35\x3e\xc8\xda\x68\xc8\x9b\xd8\xda\xac\x84\xc4\xf1\xd7\xc6\xab\xee\x5f\x68\x6d\x08\x24\x30\xc0\x1a\x52\x8b\xe4\x21\x36\x45\xb0\x81\xff\xa2\x05\x9a\xb2\x54\xb7\x54\xb3\x6c\xbf\x79\xf3\x5b\x17\xd7\x13\xe7\x5d\x40\x12\x79\xfc\xde\xcc\x44\x26\xc3\xb5\xf0\xaf\x33\x13\x4c\xa4\xc3\xc9\xd0\x9f\x37\x9f\x0f\x6f\x22\xea\x37\x87\xd7\xc8\xbf\xc2\x94\x58\x14\x39\x9c\x98\x08\x9a\x10\xd6\xe6\x3c\x48\xff\x4f\x01\x28\x6a\x46\x56\x42\xe3\x13\xb5\x96\x72\x7c\x11\xf0\x49\x9c\xe1\xd2\x81\xea\x61\xdc\xfc\x10\xbb\xcf\x45\x4b\x54\x40\x34\x52\x2e\xc0\xe6\xf3\x24\x15\xe4\x2c\x72\x7b\xab\xb4\x0f\x05\x8f\x08\xe0\x88\x25\xf9\x56\xa1\x05\x24\xb3\xba\x60\x7c\x5e\x8b\x89\x18\x99\xe9\xa5\x40\x88\x1f\x09\x06\xf1\xcf\x97\x4e\x61\xd0\x32\x32\x62\x54\x0c\x36\x45\x17\x22\x91\xc7\x81\x08\xed\xdc\x93\x9e\x51\xee\x1d\xbe\x7a\xb2\x3e\x04\xfb\x8e\x63\x9c\xd7\xc8\xcd\x02\x03\x1e\x92\xf2\xf6\xa2\xad\xab\x09\x86\xd5\x61\x68\xa7\xad\x9a\x2c\x4d\xe5\xff\x04\x00\xa9\x20\x45\x1e\x73\xd3\xed\x28\x86\xc7\xd9\x75\xe0\xb9\x8b\xf5\x30\xb6\x87\xc9\xa6\xab\xeb\xd5\x2c\x63\xcf\x72\xcb\xe6\x29\x79\x7e\x8e\x82\x28\x7c\x88\x3c\xa0\xb9\x0e\xc0\x56\xe3\x95\xf8\x2e\x69\xde\xc9\xf4\x45\x34\xaa\x60\xd3\x3d\xb8\xda\xde\xf3\xaa\x15\x03\x3a\xe5\x3f\xf4\xae\xb0\x95\x9b\x23\xe2\x24\x0d\x2a\x43\x33\xac\x30\xd8\x3d\xb6\x82\x3a\x69\x45\x53\x37\x67\xbd\xcd\x50\x86\x36\xba\xf6\x41\xcc\xd7\xdb\x36\xd5\x4d\xea\x51\xc7\x7a\xa9\xac\x7e\x3e\xce\xf3\x8a\x6a\xb5\x19\x1f\x60\x7b\x89\x70\x89\xf0\xd1\xe8\x05\x9e\x5c\xcd\xd8\x06\x1a\x3e\x7a\x62\x27\x84\x80\x23\xf1\xe2\xd3\x50\xc7\xdd\xf1\x05\x86\xbe\x28\xab\x32\x0a\xe9\x0c\x0b\x13\x25\xb3\x12\x29\x7a\xe5\x11\xcc\x23\xb6\x9a\x6d\x6f\x13\x58\x14\xd3\xf8\xf9\x13\x9d\x9f\xc6\x72\x73\xee\xfc\x66\xe3\x38\xdf\x8a\x57\xa0\x51\x32\x37\x30\x3b\x7b\xd7\x54\x44\x5b\xd5\xbf\xd4\xf8\xb2\xa4\x69\x8a\x88\xa5\x5f\x91\x06\xab\xc4\xf7\xa8\xf3\x94\x01\x2b\x23\x0e\xa8\x63\xce\xb1\x3f\x97\x3d\x4f\x04\xbd\x54\x6a\xcb\xa6\xc6\x31\xb9\xad\xd6\x69\xb3\x60\xd0\x97\x43\x28\x51\x40\x95\x28\xb1\x2a\xcf\x0f\xe5\xe2\x76\x30\x27\x2f\x27\xb4\x2e\x93\x4f\x6a\xeb\x4f\x4d\xb5\x84\x47\x6e\x43\x30\xbe\xda\x6e\x37\x15\xc4\x5e\x78\x62\x37\x6c\x3d\x36\xe6\x28\x22\x61\x78\x3e\xc2\xa5\x69\xd6\x1c\x8d\xd6\xce\x8a\xe3\xef\x2b\x9a\x20\xc2\xff\xdc\x7a\x9d\x0f\xf3\x6c\x34\x28\xff\xfc\x9b\xba\x92\x2b\xa6\xa0\x59\xa1\xfc\xf2\xa5\x80\x34\x92\x64\x50\xa0\x18\xc6\xbc\x33\x61\xcd\xd0\x1d\x8f\x34\x1b\x33\x1c\x37\x81\xe7\xa2\x71\x1a\xf3\x4d\xa8\x2f\x96\xaa\x46\x05\xb8\xba\x09\xbc\x16\x61\x77\x25\xab\x75\x59\x11\x95\x9f\xd4\xb8\x9f\x01\x62\x05\x4b\x7f\xeb\xc5\x73\x8c\xb0\xb0\x54\x34\x07\x52\x6e\x54\xf0\x92\x21\xaa\x96\xe4\x95\x3c\x48\x7a\x1b\x81\x7d\x81\xf5\xa2\x43\xf5\x14\xc3\xa1\x63\x10\x51\x3b\x56\x80\x0c\xf0\xa4\x86\x2c\x1e\x64\xd5\x80\x0d\xb1\x19\x97\x0b\x92\x17\x4e\x93\x09\x9a\x15\x45\x82\x3f\x1f\xa2\x53\xd8\x10\x16\x64\x94\x3a\x03\x57\xbc\x62\xa2\x05\xa5\xd8\x31\x2b\x4c\xbd\x6e\x30\xb8\xb3\x54\x65\x35\xfc\x40\x5e\x58\xc9\x76\x91\x4e\x06\xe0\x8c\x49\xb1\x23\x70\xf1\xd1\x53\xd3\x13\xbf\xba\xd5\xf1\xd3\xcb\x0a\x7f\xef\xa7\x57\xd7\x37\x0c\xa9\x03\x1e\x83\x60\x54\x98\x5a\x04\x29\x06\x27\x91\x99\x43\x21\x0c\x59\xe6\xa2\xa2\x9e\x90\xf4\x79\x49\xe7\x19\xce\xca\xbf\x66\xf8\x9d\xca\xcd\x70\x2a\xe0\x08\x87\x9c\xb2\x76\xe0\x1d\x0f\xf0\x7a\x90\x01\xa0\xdb\x38\xff\xdd\x74\x67\x9a\xce\x2f\x3a\x80\xdd\x2f\x9f\x58\xc1\x8f\x60\x7b\x17\xe9\x25\x32\x8f\x56\x05\xd1\xf1\x2a\x23\xc9\x11\xca\x0c\xcc\x44\xcc\x52\x37\xad\x5e\x76\x34\x60\x0b\x18\xb4\x80\x7c\x48\x20\xc2\x80\xa5\x59\x4a\x70\xb4\x65\x41\xa7\x6f\xa8\x44\xb6\x3b\x19\x78\x71\x6b\x98\xa2\x67\x3e\xef\xc4\x91\x63\xfe\xb8\x69\xdb\x6e\x32\xcf\xea\x85\x1d\xd2\x6c\x88\xd6\x6e\x0b\x3b\xa1\x70\x67\x42\xe4\x18\x7f\x87\x3e\xcb\x47\xa8\x92\x66\xf5\x07\x6e\x67\xa6\x73\x66\x8b\x92\xe5\x11\x19\xa6\x27\x6f\xb3\x6b\x8b\x0c\xfd\xff\xb1\xf7\xef\xed\x4d\x1c\xd9\xa2\x38\xfc\xbf\x3f\x45\xc3\x39\x19\xc9\x89\x10\x60\x72\x15\x21\x39\x0e\x98\xc4\x7b\xb8\xbd\xd8\x4c\xf6\xbc\x1e\x0e\x6e\x5b\x6d\xbb\x07\x49\xad\x51\x4b\x18\x4f\xc6\xdf\xfd\xb7\xae\x55\xab\xaa\xab\x25\x19\x08\xc9\x3e\x0f\x3c\x4f\x62\x75\x77\xdd\x6b\xd5\xaa\x75\x5f\xa4\xef\xe5\x16\x0e\xad\x2c\xe5\x70\x09\xa8\x4a\x39\xf9\xe8\xd4\xcb\xf2\x59\xeb\x44\x1e\xb4\xaf\xc6\x79\xfd\x5a\x88\x2f\x03\x4f\x91\x36\x98\xc9\xc6\xfa\x75\x61\x88\xf5\xf0\xd0\x22\x44\x08\x8a\xf7\xda\x9f\x53\x1f\x99\xb8\x91\xd7\x46\x83\x4f\x06\xfb\x83\x59\x59\x16\x14\xbb\xc9\x07\x5c\x4a\x04\xc3\xa1\x4b\xa4\x9c\x53\x1b\x47\x0b\x58\xe1\x1b\xe5\xa4\xee\x3b\xda\x47\x58\xe5\x76\x32\x99\xf8\x66\x56\xbb\x77\x1a\x86\x7f\x81\xb2\xc7\xd3\x04\x9c\x79\xdb\x48\xb5\xee\xb5\x77\x10\x88\xde\x3c\x2d\x7b\xcd\xbe\x5e\xb7\xdf\x78\xd9\x35\x90\xb9\x8b\x67\x21\x8d\x6a\x50\x8b\x74\x1f\x41\x2b\x07\xa6\xca\x4b\xaf\xdb\x0f\x5e\xdb\x21\x38\x82\xd8\xb4\xf1\x11\x40\x9d\xad\x3a\x38\x33\x8f\x38\xa7\x53\x1c\x4b\xc4\x9b\x6f\x90\xb9\x5b\x86\xb7\xdf\xed\x30\x84\x26\x03\x57\x3b\x0f\xc2\xe7\xf8\xe3\x14\xf1\xab\xef\x98\x6c\xf1\x43\x58\x23\x2c\xb1\x47\x70\x58\x4e\x83\xf2\x6b\xb3\x69\x38\x72\x2d\xa1\x6d\xac\x1a\x50\xd7\x36\x08\x4d\xba\x05\x1b\x33\x26\x58\x38\xfb\x21\x6d\xdb\xdd\x37\x5b\x19\x0e\xf8\xf2\xea\x30\xda\x00\x13\x5e\x91\xfb\x49\x68\x59\x01\x2c\x6d\x72\x0a\x0b\x36\x41\xf3\x6b\xf0\x6f\x0e\xd3\x84\x82\x11\x55\x2d\xd9\x6e\x50\xe0\x97\x7a\x6f\x2d\x9b\x03\xd6\xfa\x83\x38\xf5\x86\x72\x74\x1f\x9e\xdd\xf6\x24\xf8\xd1\x08\x27\x1b\x59\x65\xc2\x01\x0f\xb2\x66\x75\x15\xab\xaa\x76\x02\xb0\x06\x5b\x55\x02\x2e\x09\xe4\xdc\x28\x08\x6f\xb4\xb8\x42\xd7\xb0\x54\xee\xda\x2a\x79\xbd\xd2\x94\x37\x83\x73\x75\xe5\x94\x4a\xab\x8e\xd9\xea\xd1\x04\x29\xab\xcd\xc7\x75\x4e\x9c\x29\xde\x76\xec\xcc\x0d\x34\xd1\xab\x27\x09\x6d\xef\x07\x6f\x99\x6b\xfd\x6a\x33\x6e\x81\x33\xb8\x78\xb2\xeb\x9f\xd5\xd7\x99\xc9\x9c\x5b\xe8\x6a\x34\x17\x26\x3a\xbd\x02\x14\xf5\xa2\xd1\xfb\x25\x0c\xe0\x6a\xfd\x89\x6d\x36\xd6\x5e\x50\x54\x53\xaa\x1e\x60\xc3\x90\x6b\x6a\xca\xe0\x5a\x31\x55\x2f\xb9\x97\xed\x18\x45\xf5\x4b\x9e\xb8\x5e\xda\x5e\x62\xa8\x61\xf9\x04\xe6\x96\x10\x3a\x45\x2d\xdc\x93\x49\x7c\x21\x9a\x68\x0d\xbc\x8c\x70\xb9\x98\x78\xea\xc2\xf9\x5a\x72\x43\x4c\x50\xb8\x5c\xbb\x8e\x4b\x34\x74\x45\xf6\xa0\x2a\x18\x3e\x38\xc8\x38\xa5\x08\xd6\xf8\xcf\x77\x35\xb8\xad\x34\x47\xc6\x79\xdc\x82\x50\x3b\x14\xb1\x58\x06\x55\x6b\x18\xe3\x72\x69\xba\x46\x4d\xaf\x79\xb5\x1b\xc8\x5a\x4a\x26\x12\x7e\xbe\x67\x9a\xe7\x3f\x8a\xf2\x70\xba\xf4\x77\x23\x3b\x12\x06\x00\x99\x5b\xdf\x35\x90\x1f\xd6\x5f\x8b\xd6\xd0\x36\x13\xc0\xba\xcd\xe9\x24\xdb\x00\x6c\x09\x20\x78\x43\x02\x74\xe7\x93\x8c\xd2\x8c\x03\x51\xb9\x18\x0e\xba\xbd\x89\x3a\xfc\xa4\x26\xc6\x23\x99\x25\xbb\xd1\x23\x4c\x4c\xaf\xf7\xb2\xeb\x42\x61\xd1\x4f\x0a\x4d\xa2\x2f\xda\x00\x2f\xdc\x87\x41\x98\xb5\x93\x17\x5f\xe3\x8d\x6b\x97\x56\x16\x41\x12\x9e\x3d\x8c\xd8\xf8\x86\x09\x28\x3c\x8d\x34\xd1\x39\x4d\x5d\x73\xed\xf9\x84\xf2\x86\x53\xd4\x56\xb4\xaa\xa4\x1f\x15\x06\x4d\xa0\xe0\x09\xbb\x7c\x85\x48\x3b\x62\x9c\xb0\x43\xe5\x9a\x12\x30\x87\x40\xe9\x5e\xc7\x21\x00\xb5\xee\xa6\x85\x51\x12\x75\xa0\x81\x99\xd7\x78\x85\xd2\xed\x40\x12\x83\xe2\x92\x89\x0b\x1e\x43\x96\x17\xea\xba\x37\x77\x39\x48\x8f\xf3\xc5\xe9\xd9\x1c\xe3\xd5\x77\x6a\xe7\x63\x1b\xb6\x77\x54\xa0\xa0\x06\xc5\x36\xb5\xd7\xfd\x91\xaf\x2f\xa2\x2e\x12\x97\x14\x6f\x8f\x8b\xa9\xe0\xa5\x1c\x2a\x50\x20\xd8\x31\x9c\xfe\xfc\x34\xc8\x52\xf8\x7e\x17\xb5\x0f\xcc\xad\xab\x76\xa0\xcb\xf4\x32\x8a\xcf\xdd\x08\x51\x39\xc8\x3e\xab\xd9\x9c\xf5\xf0\xb3\xfa\x90\x97\x87\x36\xf8\x2e\xf2\xf9\x4a\x0b\x7a\x3b\x57\x8c\x75\xcd\x69\x0c\xc2\xd4\xa5\x18\x89\x1c\x45\xb9\x6c\xdc\xe4\x20\xb4\x1f\xf5\x18\xc2\x89\xbb\xcb\x59\x34\x11\x95\x6d\xf7\x15\x3d\x50\xd8\x8e\x42\x62\xea\xac\xcd\xcb\x74\x98\xf3\x95\xeb\xb4\x19\xc4\xd0\x24\xd8\x92\x9c\x1a\x51\x3d\x4d\xc4\xa1\x2f\x7a\xe1\x14\xcd\x31\x34\xda\x58\x0d\xb4\x59\xbc\x0d\x15\xbe\xda\x4f\xf1\xb6\xa9\xba\xe5\x73\xc1\x25\x4c\x6a\x5a\x72\xe6\x6c\xe4\xd8\xfc\xb5\x08\xe2\x6a\x03\x46\x29\x34\x31\x01\x67\xa3\xa7\x80\x4d\xe5\xb8\x1c\xe9\xc9\xa9\x45\x16\xe0\xdb\x08\x22\xbe\x92\xd6\x1c\x53\x6e\x64\xbb\x9d\xb1\xb7\x09\xc6\xcc\xb7\x73\x0e\x3f\x88\x5e\x12\x61\x03\xd6\x38\xba\xca\xc6\xe5\x84\x05\x9d\x1a\x32\x90\x2a\x4f\x32\x9f\x30\xc2\xd4\x26\x2f\x5d\xf1\x50\x85\xf5\x58\xe6\xbf\x6a\x4d\x71\xfd\x3a\x39\x7c\x7b\x4f\x13\xc8\xa7\xef\x9b\x70\xe5\x68\xd8\xcf\x68\x80\x05\x45\x32\xc1\x30\xd3\x14\x98\x6f\x7e\x26\x12\xb0\xa3\x51\x7e\xfc\x1a\x1d\x5c\xc8\xc9\x4c\x2c\xed\x39\x7e\x41\xd0\xd0\xfb\x85\x93\x4d\x06\x94\x85\x23\xf6\x30\x2f\x51\x98\xed\x7d\x55\x15\x22\xf1\x18\x37\xc2\xc6\x0a\x40\xf5\x05\xe1\xc4\x1f\x75\x81\x83\xd7\xc9\x18\xb2\xe8\x41\x06\x77\xc1\x6f\x1f\x73\x86\xcc\x6a\xcb\x35\xf7\xbb\x4e\xae\x71\xd4\x3c\xc9\x71\x29\x91\x22\xc9\x09\x34\xa5\x19\x46\x55\x84\x1a\x09\x84\x6e\x3d\xf8\x25\x21\x7e\x40\x1d\x68\x6c\x36\x91\x92\xbe\x6b\xd9\x58\xcc\xe5\xdc\x81\xa8\xd4\x6a\xa5\x20\x95\x60\x65\x47\xd3\xc0\xa0\x69\x33\x60\x86\xa7\xaf\xec\x14\x4d\xa9\x88\xa9\x35\xd3\xa5\x37\x29\x91\x3c\xc6\xc2\x9c\x50\x48\x8c\xc3\x68\xcc\x87\x3d\xff\xca\x98\xd4\x60\x74\x16\xff\xc1\x68\x4f\x59\x1a\x8f\xb7\x15\xb0\x22\x3d\xa7\x7a\x3a\x5b\xc7\x2b\x32\xe5\x46\x96\x72\x13\x6b\xa8\x81\x24\x22\x11\x8f\x60\xf7\xe4\x49\x81\xc0\x9e\xcf\x2e\x0c\x38\x98\x56\x2c\x0f\x90\xdc\x26\x71\x9e\x89\x92\xf8\x1b\xad\x77\x0c\x76\x21\x69\x1f\x89\x59\xd6\x54\xed\x98\x5a\xcd\xcd\x8f\xb4\xbb\x21\xb3\x60\x7c\x0d\xda\xd4\xe3\xd7\x24\xd5\x87\xef\xbc\xb9\x73\x21\x99\x77\x65\xe9\x4c\x32\x28\x47\x9f\xa8\xe2\xed\xc9\x10\xa3\x3f\x43\x5f\x8f\x89\x77\x1c\x06\xda\x28\x33\xbb\x14\x47\x14\x30\x1c\x1b\xa6\x78\xcb\xd1\x59\xbe\x7e\x6d\x4b\xbe\xce\xd7\x58\x56\xb4\x74\x4b\x1a\x47\x0c\x07\x8a\xdc\xce\xfc\xbc\x52\x5e\x02\xbd\x76\xe4\x9e\x92\x4c\xe0\xec\xe3\xe1\xd3\x23\x61\x45\x66\x0d\x9e\x6b\x3c\x49\x54\x33\x52\x14\x06\xf2\xc1\xa6\x00\x0e\x37\x54\xb5\x40\x0a\x27\x2c\x37\x74\x47\x23\x4b\x3a\xb3\x98\x83\x41\x2d\xa0\x53\xb3\x13\x86\x89\xb7\xbf\x7d\xa7\x1b\xdd\x28\x9c\x14\xf2\x37\x4a\xc9\xaa\x34\xdb\x4d\x56\x4f\x74\x6f\x30\x2f\x7d\xfc\x2b\x2a\x4b\xee\x69\xec\x79\x54\x9d\xa4\x6a\xf5\xeb\x6a\xe6\x64\xbf\x14\xf3\xde\xb8\x75\xc5\x9c\xd0\x52\xf1\x55\xc4\x26\x95\xe4\x0d\x0c\x7f\xbe\x37\xe3\xe9\x8f\x8a\xc9\xe9\xfc\x0c\x5e\x7f\xf1\x45\x28\x35\x40\x09\xdb\x3d\x53\xf2\xa0\x7c\xf9\xfe\xd6\xdb\x8d\x45\x3e\x80\x6e\x98\x58\x6e\x2e\x05\x7d\x33\x12\x67\x06\x1b\x8e\x63\x4a\xf9\x1d\xa8\x86\xbc\x50\xe8\x14\x40\x04\x76\xc2\xca\x96\xbb\x2c\x52\x1a\x30\x57\xf2\xa6\xa6\xbf\x9b\xb4\x36\x38\xcf\xee\x67\xc0\x2f\x9e\x9f\x61\x08\x24\x67\x3c\xf5\x59\x64\x86\x8d\x09\x13\x06\x19\xa6\x49\x18\xdc\xbc\x79\x72\x04\x84\x02\xe7\x45\x50\x38\xbe\x71\x74\x71\x83\x47\xb4\x69\x48\x8b\xf4\x84\xfd\xf7\x95\xb3\x86\x27\xff\x60\x40\x41\x8f\x6e\x6c\xce\xdd\x94\xb7\xf1\x35\xe3\xd3\xf2\xb0\xfc\x41\x22\x20\x98\x0b\x8e\x2c\x0e\xdb\xa3\x6b\x38\xb9\x5b\xd2\xf8\x5d\x6c\xea\x59\x36\xc2\x86\xf5\x92\x20\xbb\x0b\x9c\xd8\x62\xac\xda\x63\x97\x72\x66\xd2\x11\x4c\x51\xbf\x2e\xa7\x53\x34\x20\x67\x43\x9e\x71\x5e\x12\x6e\x91\x82\xa3\xf2\xa4\x38\xa6\xa8\x2a\xcd\x0e\x24\x3b\x1a\x39\x52\x73\x5b\xa1\x69\x4f\x98\x2b\xcc\xdd\xde\x3f\x5d\xa8\x4c\xaf\x27\x96\x41\x9a\xb1\xb9\xe6\xfb\xc0\x05\x2e\x64\xab\x89\xa1\x8b\x78\x5e\x72\xb3\xf9\xe8\x14\xd8\x8d\xf9\xd9\x58\xac\x3d\xf6\xaa\xe9\x19\x9a\xe5\xb0\xd1\xe0\xf1\xa8\xa4\xa6\x88\x61\x2a\xeb\x33\xd2\x99\xbe\x01\xe2\x52\xc3\x14\xbe\x37\x25\x91\x8c\xc9\x80\x34\xd4\xb3\x3c\xba\x89\xda\x0a\x53\x30\xb7\x44\xe1\x80\x46\xc9\xfe\x8f\x0c\x1b\xe3\x27\x3a\xd4\x1c\x5d\x60\x06\x27\x6f\x24\xaf\xb1\xc6\xb8\xf8\x75\x63\x04\xbe\xf4\x8b\x49\x42\xb1\x88\xe5\xa3\x0f\x1b\x08\xfd\xeb\x19\x52\x6a\xec\x8d\x48\x11\x77\x1c\x9b\xb1\xbb\x20\x77\x5a\x62\xca\x72\x41\x2a\x80\x26\x67\x6c\x7d\xb5\xc0\x6d\x3d\x2a\xe6\xe7\x05\xe5\x3a\x64\xa1\xa0\x00\x2c\x2c\x59\xbd\xa0\xf4\x97\x1c\x20\x90\x4d\xa3\x16\x12\xc8\x25\x53\x71\x54\xb4\x28\x4c\xeb\xc4\x6b\xe2\x11\x72\x38\xf8\xa4\x5b\x7c\xa3\xb6\xf5\x89\xf7\xad\x3c\x6b\x77\xd1\x6f\xb6\x30\x15\xff\xfc\xf7\x21\xb1\x28\x30\x53\x73\xf7\x9a\xf4\x2a\x81\x4f\xbb\x27\x6b\xc0\x79\xb5\x4f\xb6\xd7\x28\xd7\x04\x1b\xfd\xb7\xcc\xa2\x1d\x76\x7b\xdb\x61\x4c\x92\x63\xb2\xf5\xbe\x33\x54\x73\x1f\x29\x75\x97\x49\x28\xea\x0d\xfc\xa1\x8d\x04\x59\xcb\x96\x86\xd4\x5a\x31\xe1\x34\x46\x28\x26\x24\xa7\x58\x03\x2c\x35\x09\x0e\x7d\x4b\xb6\x0b\x97\x82\x61\xa8\x3e\x59\xc8\x05\x9d\xe7\x25\xdd\x5c\x6a\x91\x43\x76\x6d\x94\x1a\xb4\x6f\x77\xb0\x69\x9a\x6b\xf1\xfc\x72\x87\x08\x5b\x32\x8e\x27\x79\x3f\x82\xb6\xc0\x04\x57\x4f\xd7\xde\x4a\xf7\x83\xd6\x56\x5d\x3b\x36\x94\x99\x8b\x8a\xdc\x6a\x18\xeb\x1c\x3b\xd9\x99\x2e\x7d\x7b\xb9\x42\xed\x65\x92\xe1\x33\x93\x63\xfc\xa8\xc9\xfa\x45\x04\x59\x37\x3c\xe0\x9c\x6b\x56\xa4\xb4\x6f\xf1\x5d\x43\x62\x5d\x42\x28\xf8\x8c\x85\x06\xb8\x22\x8f\xc1\xa3\xaa\xa2\xc4\x5b\xec\x87\x96\x3d\xb6\x29\xb9\x34\x1b\x2e\xe6\x35\xc1\x50\x43\x28\x98\x79\x7f\x3d\x7e\xd3\x69\x0d\xd7\xd9\xce\x3b\x76\x88\x5f\x65\x25\xcd\xa2\x4d\xf1\xc9\x11\x47\x1c\xc2\x78\x28\x3e\xf0\x81\x4c\x25\xe1\x1e\xbd\x10\x24\x73\xd8\x8f\x3a\x22\x12\x2b\x5e\xd3\x8d\x56\x6c\xd5\x0b\x3f\x85\x0a\x2d\x0f\x5c\xc1\xab\x86\xd6\x3f\xc9\x31\xb6\x23\x3c\xe7\x27\x13\xc8\xde\x30\x7c\x89\x64\x8f\x1b\x16\x70\xf9\x8f\x69\xdf\x19\x21\x19\x53\x3f\x31\x05\x44\x4d\xea\x42\x52\xd3\x62\xe8\x86\x39\x2e\xde\x79\x3e\x31\x08\x8f\x73\xfc\xc6\x71\x71\xd5\x1a\x10\xda\x99\xcd\x8f\x17\x73\x21\xf6\x6a\x67\x83\x2b\x19\x23\x83\x65\x6d\x84\x84\x6a\xac\xe3\xdd\xb0\xbc\x37\x69\x6c\xae\xc2\x5d\x7b\xc0\x9d\x3d\xb3\xae\x7e\xf0\xd5\x59\x33\xeb\x46\x04\x5f\xc3\x5e\x1a\x3a\x7b\x51\xd1\x27\x30\x5b\xa4\x5d\x8b\xb3\x6d\xaf\x65\x4e\xf4\x2f\xf1\x1b\x68\x11\x99\xf8\x82\x12\x7e\x3e\x2e\x6a\x1d\x0b\xde\xdd\xef\x20\xe1\xc2\xe0\x0e\xe4\xb5\x7f\x85\x8e\x67\x82\x0c\x62\x6f\x52\x73\x84\x75\xa8\x7f\xf9\x0b\x4f\x4f\x58\x52\x62\x0a\x6f\x37\x1a\xa2\x22\x07\xb7\x5e\xde\x5d\x76\xbb\x18\xfb\x05\x6d\xfd\x47\x57\x33\xb3\x46\xeb\xb1\x2e\xb1\xa4\xf0\x97\x5a\xe5\x36\x94\x15\x96\xd9\x0e\x2d\xc1\x2d\xab\xd5\xfa\x3d\xe9\xc6\x33\xcb\x32\x96\x65\xc7\x3b\xcc\x83\x1b\xa7\xc0\xfd\xd1\x50\x2c\x52\x84\xe3\xf0\x73\xec\x10\x73\x17\xc5\x60\x35\x68\xd6\x8c\x25\x3e\x1b\x66\x69\x03\x78\x8f\xb8\xc8\xc7\x68\xfc\x50\x1b\x13\x09\x13\xf2\x1a\xb0\x02\x1a\x68\x20\x06\x19\x61\x78\x6d\xcf\xab\xc1\xa4\x84\x48\x72\xdc\xa3\xe0\xca\xda\x9e\xf8\xa5\xc1\xe6\x8c\xbc\x98\xd3\x52\x17\x29\xfe\xc6\xdb\x5f\x28\x89\xcb\x29\xac\xd9\xe1\xc2\x5b\xaf\x22\x6e\xca\x6b\xf5\x74\x87\x41\xc7\x26\xff\xb6\x21\x93\x0b\xbb\xd1\x82\x26\xb0\x6e\xad\xac\x74\xee\xd2\x71\xc8\x56\xad\x1b\x9e\x6c\x09\x37\xe8\xfa\x5e\x34\xb1\x7f\xd2\xe4\x24\x79\x67\xc5\xec\x5c\x43\x58\x1f\xdd\x57\x11\x30\x37\xee\xa9\xc6\x1d\xd5\x1c\xdd\x55\x78\x38\xe2\x9b\x12\xfc\x99\xfd\xde\xe6\xbf\xde\xd4\x80\x84\x3c\xa0\xc3\x47\x09\xd7\xb5\x58\xd4\xdc\x52\x62\x2d\x12\xd1\x9c\xbb\x25\xd7\x5c\xc2\x75\xc2\x5f\x3c\x8b\xd4\xd5\xb6\xec\x62\x5b\x76\xad\x2d\xbb\xd4\x4c\xef\x0b\x89\x1c\x1c\x39\xc1\x75\x03\x25\x55\x34\xb0\xcd\xd6\x55\x75\xb1\x4d\xdf\xc1\x01\xb4\x85\x3d\x71\x4d\xf6\x8f\xca\xc9\x50\x90\xa3\x03\x98\x9e\x87\x8d\x9e\x05\x83\xcd\x5e\xd0\x5c\x8c\x1e\x9b\x02\x71\x4e\x29\x5d\x04\x69\x2e\xe2\xc8\x64\x88\x1b\x8d\x0e\x09\x63\x12\xe6\xc7\xc7\xd5\x0c\xef\xce\xd1\xc5\x87\xd7\x24\xb5\x6d\x4e\x5a\x93\x94\xa4\x3b\x78\x49\xa4\x5e\xe4\xe1\x99\xf0\x7d\x0c\x8f\xd4\xf3\x86\xff\x76\xb2\xb9\x76\xcd\xe4\xd5\xdc\xc7\x37\x43\x81\x4d\xb3\xf7\xab\x7b\x8f\xc7\xac\x44\xe4\xc6\x9d\x98\x64\x2f\xd5\xf7\xe6\xbb\x68\xdf\x92\x6b\x15\x52\xf4\x71\xdf\xcb\x79\x80\x77\x70\xd4\x5e\xc2\x1e\xb0\x0f\x28\x2a\x80\x76\x1f\xb0\xf4\x15\xfa\x63\x93\x1d\xb5\x63\xba\x96\xfd\xb4\xc0\x38\x9b\x6c\xd5\x20\xbc\x82\xba\x25\x22\x2f\xd1\x37\x94\x12\x8e\x8e\xbc\x39\x63\x07\xcf\xbb\x96\x9c\x0a\xd6\xe4\x41\x3b\x44\x35\xab\xaf\x74\xf6\x4d\xb6\xe4\x85\x5c\xef\xed\xec\xbf\x6a\xcb\xda\x9c\x8d\xc2\x8d\xf0\xf0\xfd\xf8\x6a\x6e\xfe\x2b\x1d\xfd\x33\xd9\x82\xdf\x11\x8a\xfc\x18\x5a\x92\x60\x45\x9b\xf0\xa0\x67\x66\xda\x8e\x7c\x6d\x3a\x7a\x45\x7d\x4b\x92\xbc\x19\x76\xab\xbd\x33\x9b\x4b\xd2\x95\x59\x2b\xf1\x97\x2e\x78\xdc\xfa\x86\x07\x02\x2e\xbc\xe1\x56\x66\xad\xf9\xa4\xb1\xd6\xaf\x6c\x11\x48\x39\x2a\x9e\xce\x9a\x76\xdf\x57\x60\x22\x53\xb0\x6d\xc2\x70\x76\xdf\xdd\xcf\x89\x4d\xc5\xd8\x89\x3a\x5f\xcc\xab\x1b\xe3\x0a\xfd\xce\x29\xa9\x3a\xd4\xe3\xf8\x47\xa2\x35\xee\xcc\x34\x6a\x27\x05\x17\x05\x2e\x52\xb1\x84\x71\xfd\x4b\x0c\x35\x94\x6d\x01\xd7\x68\x98\x1c\x33\x0b\x0c\x76\xfc\x18\x7a\x7f\x28\x0b\x64\xe5\x9a\xc6\x78\x13\xc6\x75\x94\x1f\x61\x6a\xba\x1c\x0d\xcc\xf1\x10\x00\x5a\x41\x7b\x21\x4a\x1d\xe5\x54\xdd\x6a\xc9\x6a\xdb\xd0\x64\xd0\xac\xdb\x2a\x6b\x1b\x00\xd3\x5b\x63\xb6\xc7\x0d\xe0\xef\x97\x09\x4e\x2c\x79\xdf\x36\x81\x27\x22\xe9\xdb\x40\xc7\x7a\x07\x24\xac\xfe\x93\x20\x11\x5e\xf0\x18\x65\xc1\x5f\xcf\x36\xcd\x8a\x86\x68\xb8\x6b\x4f\x51\xf0\xc5\x6b\xcb\x1b\xa8\x64\x63\x09\x46\x8c\xe5\xf9\x0d\x57\x16\xeb\xd4\x6b\x13\xb8\x44\xfd\x0a\x05\x6d\xcc\x77\x13\x1b\x92\x44\x9d\x6b\x9e\xc1\xee\xf2\x00\x34\xcd\xd5\x88\x16\x34\xb8\xb7\x5a\x26\xf2\xe1\xe2\x66\x39\xab\xed\xed\x49\x76\x58\xd6\x34\x47\x44\x6d\x87\xde\xb8\x92\x53\xfc\xfa\x83\x81\x3a\x71\x04\x7e\x0c\x7a\x08\x30\xa7\x7a\xac\xe4\x42\x1a\x8b\x9d\xf4\x57\x12\x29\x79\x71\x7b\xe0\xfd\x2d\xc3\x51\xcf\x83\x66\x38\x0e\x1b\xb4\x4b\x71\x15\xa6\x3e\x25\x03\xe3\x08\x85\x3b\x5b\x63\x8d\x0c\xdc\xcf\xfe\x6e\xa3\xf5\x06\xd2\xec\x59\x43\xf4\x8d\x3e\xab\x40\xec\xcc\xa0\x38\x9a\xb6\x62\xec\x05\x20\x6f\x8a\x99\x9a\x33\x0b\x2b\xdf\xff\x40\x41\xc1\x3e\xdc\xb6\xbc\xf7\xa6\x5c\x6d\x4b\xd4\xb0\xf9\x0a\x88\xeb\x51\xfe\xef\x72\x74\xe1\xc2\xec\xd4\x1a\xc1\xc3\xb9\xdd\xb0\x68\xa9\xc2\x84\x68\x3e\x8c\xd6\x21\x5e\x1d\xc0\x68\x9d\x1c\x2e\x8d\x02\x5f\x9c\xc0\x04\x34\xea\x06\x7a\x5b\x44\xa2\x15\xd7\xde\xa5\x91\x6e\xfb\xd5\x40\xc9\x0c\x87\xfc\x0d\x3a\x0b\x03\x3a\xc4\x88\x37\x9f\xcf\xf3\xe3\x33\xe8\xd6\x86\x66\x2f\x4e\x8c\xe9\x76\xdb\xe5\x0c\xf0\xf2\x8c\x24\x43\x4a\x86\x5a\xde\x46\x62\x16\x9b\xf8\xc5\xf7\x82\x08\xc6\x70\xbc\xbb\x36\xb8\xf1\x6f\x97\x9b\x2a\xda\xc4\x37\xba\x2f\x27\xf5\x01\xfc\xef\x65\x90\x7f\xa7\xa5\xdf\x68\xa3\x1e\x14\x73\x4e\x22\x6c\x23\x99\xf8\x35\x6d\xdf\x81\x27\xe2\xe5\x82\xa0\x20\xf5\xd6\x59\xc7\x61\x91\x5c\xc7\xf0\x9e\x3a\xa9\x97\x2c\x9e\x99\xf8\x90\xa3\xc3\xb8\xf9\x27\xe6\xf7\x33\xca\xe0\x32\xba\xd4\x86\x45\x4d\x11\x59\x25\xdd\x4e\x18\xe7\x40\xd2\x21\x53\xee\x34\x4d\x12\x42\x91\xbe\x31\x77\x7a\x29\x12\xb6\x52\x62\x12\xab\x3b\x86\x13\x2c\xaa\x0b\x98\x2e\x90\x8b\x0a\x29\x61\x05\xfb\x6d\x5c\xbd\x20\x93\x16\x1a\x8f\xe3\x1f\xb4\x73\x13\x86\xb9\x36\x69\x3f\x62\xa2\x10\x85\xee\xe1\x1b\xeb\xc0\x18\x1c\x6d\x1b\x79\x31\x0e\x35\xde\xb5\x7d\x40\x93\xd6\x09\xd2\x14\x35\xa9\x03\xa9\x95\xc9\x1a\xd5\x27\x61\x3d\x5c\xb1\x56\x7a\xfa\xe7\x62\x6e\xc2\xec\x20\x8e\x71\xd1\x86\x62\xd3\x20\xcd\xa3\xe7\x77\xf9\x46\x56\xf6\x81\xf2\x3b\x87\xcd\x96\x1d\xad\x33\xcc\x20\x28\x29\x6e\x08\xf2\xd8\x18\x48\xee\x0a\xcd\x7b\xa3\x04\x67\x76\x9f\x41\x84\x70\x2d\x39\x44\xa0\xb4\x69\x54\xd4\xe2\xc3\xe5\x43\xf6\x04\xe7\x47\xe1\x23\xbc\xbe\x2e\x6d\xbc\x20\x3f\xc8\x20\x72\x50\x0b\xd0\x84\x87\x22\x01\x3e\xaa\x9f\x6d\xb0\x07\xb2\x9c\x18\xf6\x7c\x71\x84\x14\x65\x2b\xaf\xcb\xea\x58\xce\x21\xec\xd2\xbf\xf5\xc7\x45\x8e\x3a\xe0\xc7\x2c\xfd\x47\x80\x59\x96\xa4\x06\x6f\xce\xa5\xae\xb7\x3c\xda\x38\x8a\x5a\x27\x7c\x21\x17\x70\xc3\x2c\xa9\x13\xbd\x91\x72\x4b\x88\xe4\x4e\xeb\x37\xbc\xb1\x2f\x37\x36\x1b\x79\x0c\x83\x21\x67\x92\x73\x87\xe6\x36\x58\x3a\xf3\x95\xb9\x97\x83\x2a\x57\xc8\xbc\x1c\x66\x9d\x1b\x6c\x7d\x75\xbb\xb7\x34\xa3\xe2\x60\xeb\xeb\x3b\xbd\x38\x71\x22\xbc\xfc\xba\x97\x4c\x8d\x08\x5f\xbe\xe9\xc5\x19\x10\x07\x5b\xdf\x7e\x15\xbf\xf4\xf9\x0d\xe1\xab\x6f\xcc\xa6\x30\x1c\x6c\x7d\xe7\xab\xf9\x3c\x85\xf0\xda\x97\x8f\xd3\x10\x0e\xee\xdc\xda\xea\x05\x09\x07\xe1\xcd\x97\xbd\xe5\x79\x00\xa1\xc8\xd7\xad\x45\xe8\xb3\x9f\x93\x49\x05\x38\xb8\x73\xdb\x2f\x9e\x66\xfc\x1b\xdc\xd9\xa2\x01\xd8\x7c\x7d\x83\x3b\x5f\xd1\x1a\xc6\x59\xaf\x97\xa6\xdc\x1b\xdc\xf9\xee\x56\xcf\xa4\xd7\x83\xe7\x2f\x13\x89\xb2\xbf\xfe\x94\xdc\xf4\x8f\x4d\x6e\x2a\xec\x66\x4b\x46\xd3\xdf\x25\xf1\xe3\xca\x34\x8c\x6c\x13\x4e\xce\x09\x26\x3e\xaf\x6c\xf8\x5f\x8b\x62\x5a\xa3\x40\xef\xf8\xb5\x23\x64\x84\x8d\xf4\xba\x46\xd9\x58\x1f\xdd\x07\xe3\x89\x2d\xe6\xd5\x18\xa3\x80\x13\x0b\x3b\x45\xe7\xfa\x61\x36\xac\xce\x27\x11\x31\x44\x06\xcd\xf5\x59\x39\xcd\xce\xca\x62\x96\xcf\x8e\xcf\x2e\xb0\x35\xbc\x19\xb1\x15\x7f\xe1\xbe\x29\xf3\xc8\x68\x06\xa5\xc1\x2d\x38\xae\x6e\x64\x3b\x56\x61\x43\x98\xc7\x2c\xb6\x50\x25\x2a\x28\xf0\xae\xa7\xa4\x63\x3c\xe3\x81\x5d\xf7\x90\x52\xd8\x87\x2f\x15\x8c\x1e\x19\x91\x82\xbc\x19\xeb\xd4\x5a\x89\x4d\x78\xf1\xb6\x38\x5e\x90\x98\xa7\x3e\xae\xa6\x70\x31\x48\x9c\x30\x7b\x8f\x6f\x23\x49\x83\xab\x47\x6e\xce\xc7\x98\x6f\x6d\x4c\x07\x6f\x04\x27\x0d\x0e\xc5\xeb\xc2\x14\x6e\xc9\xbb\x9d\x71\x1e\x3f\xa7\x11\x81\x52\xb1\xb8\x05\x5d\x7f\x55\xf0\xf0\xdb\x49\x55\xc1\xb5\x05\xff\xef\x5c\xf6\x32\x68\xe2\xde\x0f\x4c\xa5\x7d\xee\x9a\x12\xf6\xec\x73\x73\xed\x63\x36\xef\x1f\x7e\xd3\xf6\x2f\x5d\xce\x6e\x2a\x75\x99\xa0\xec\x4d\x68\x03\xaf\xd3\x3e\x77\x4b\x84\xbe\x98\x28\xd9\xf1\x79\xad\x4c\x90\xc2\x40\x05\xcd\xcd\xf9\x98\x7a\xe1\x62\x66\xee\x07\x9a\x90\x2d\x26\xec\xe5\xcc\x76\x8c\xe7\x2d\x61\xa0\x42\xac\xfa\x1f\xe2\xd7\xbf\x0f\x5f\xfe\xe0\xc1\xc2\xac\x5d\x18\x64\xc1\xf9\x90\x84\x23\x7a\x8f\xb0\x0b\xef\x6e\xcf\x27\x27\xdb\xd8\xec\x99\x61\xe3\x11\x53\xa9\xa3\xd8\xbf\x93\x1d\x29\x89\x39\xc8\x85\x06\xb1\x5c\x2e\x0e\xb0\x64\x8b\x8c\xea\xd4\x54\x3e\x08\x0a\x2d\x5c\xcc\x6c\x7a\x44\x5c\xef\x38\x36\x91\x0b\xf9\x2f\xf5\x8d\x25\xde\x46\x30\x60\x64\x2d\x66\x8b\xa2\x61\x96\xc3\x79\xfc\x3f\xa8\x38\xd1\x58\xf7\x44\xad\xf5\x0c\x90\x6e\xa6\x24\x7f\x38\x16\x68\x21\xdc\xe7\x0f\x23\xc1\xbb\x0c\xe5\x20\x3a\xeb\xcb\xe5\xc4\x9e\x2a\xda\xdf\x8f\xc2\x4b\xd1\x23\x2b\x48\x8b\x6f\xd6\x21\x2d\x3e\x51\x11\x1f\x82\x8a\x30\x24\x74\x92\x94\x58\x7d\x75\x73\xc6\x63\x7b\x71\xdb\x0f\xb8\x98\xe1\x25\x7d\x7e\x56\xa9\x1a\x16\x6f\x70\x34\x2d\x37\x01\x63\xd9\xba\x73\x46\xeb\xe9\x22\x2c\xc3\xac\x05\x65\x33\xeb\x6d\xf7\x0e\x83\x77\x4d\x01\x39\x94\x93\x21\x39\xb9\x64\x67\xd5\x79\x36\x76\xad\x86\xe9\x43\x45\x47\x7c\xe4\x1c\xff\xc4\xe5\x7f\x84\x69\x27\xe3\x6b\x3e\xcc\xcb\xbe\xce\x5d\x1f\xb1\xc9\xcd\x3b\xdf\x33\xa6\x2d\x67\xce\xf4\x89\x07\xaf\xf7\x1b\x9d\x87\x6f\x3f\x91\xda\x7f\xe4\x21\x21\x17\x2e\xd9\x64\xf2\x14\xad\x25\x63\xcf\x0d\x0c\x1d\xd3\x4a\x81\x5b\xa6\x33\xfb\x5d\xb3\xf4\x6f\x70\xa8\xc8\x69\x8a\x8a\x77\xaf\xa9\xa0\xc2\x03\x85\xd5\xc5\xcb\x38\xe7\x25\x67\x31\xa2\x04\xdb\xfd\x65\xff\xf1\xa3\x6c\x9e\x9f\xaa\x35\xa3\xc9\x19\x1c\xca\x53\xb1\xcc\x3e\xfc\x47\xb2\xb2\x2e\x85\xfb\x39\x04\x8a\xed\x70\xb3\xdf\xc8\x30\xec\x80\x93\x3b\x81\x25\x7d\xc8\x5d\x77\xa1\x11\xa6\x4d\xae\x4c\xca\xc8\x7d\xd6\xe2\x27\x4d\xfd\xd8\x4e\xf8\xc6\x4b\x56\x4b\x96\xbe\x8c\x96\x8b\xb2\xf3\x48\xce\x03\x8a\xff\xe2\x13\x60\xe9\x8a\x71\xb2\x0d\x05\x9a\xfb\x5e\x3f\x20\xd9\xb1\xfa\xee\x28\x21\x3f\x32\xaa\xab\x06\x53\xc2\x52\x3b\xa8\x7c\xe8\x17\x9d\x64\x66\x21\x72\x42\xb3\xad\x7b\x7e\xcb\xbb\xb8\x20\x39\xd0\xdb\x39\x89\x92\xf2\xa3\xa3\x19\x3e\xc0\x1f\x7e\x1e\x02\x39\x5d\xd7\xf8\x8a\x7f\xf1\x5b\x98\x15\xbe\x82\x3f\xf2\x0c\x20\x3d\x2a\xe8\x15\xfd\xe2\xb7\xa8\x6b\xc6\x77\xf8\x97\xdf\x2c\x86\x25\xd2\xf6\xf4\x97\xde\x1c\xc1\xd3\x11\xff\x02\xde\x02\x1f\xe0\x0f\x3f\x0f\x4b\x7c\x1c\x96\xf2\x54\xd1\x93\xd4\x2a\x4f\xf1\xa9\x3c\xe5\xa7\x51\x75\xfc\xfa\x5f\x8b\x6a\x4e\xf5\xdd\x03\x7f\xab\x86\x17\xf8\x16\xfe\xf0\x33\xce\x4e\xe6\x76\xb4\x98\xcf\xab\x09\x3e\xd3\x0f\x7a\x07\x38\xe0\x4d\x8e\xd3\xe5\x1f\xf2\x8e\x24\xe8\xf4\x72\xea\xe2\x03\x1d\x97\xd4\x1f\xfe\xe1\xe7\x8a\x26\x8b\x7f\xe4\x79\x44\x8f\x23\x7d\x3a\x9d\x55\x8b\x29\xbf\xa2\x9f\xf4\x1e\x20\x0e\x57\x12\xff\xb8\x67\x8c\x9b\x22\xef\xf0\x27\xbf\x1f\xe2\x1b\x76\x7a\x19\x16\xd8\x32\xfc\x5f\x9e\xe6\x79\x39\xaa\xe9\x0d\xfd\xe2\xb7\x27\x38\x5e\xf8\x3f\x3f\x95\xf9\xa8\xc2\x25\xe3\x1f\xf2\xee\x0d\xbd\x78\xc3\x4f\xd4\xa4\xb4\x48\xbd\x73\xbf\xc5\x18\x7e\x17\x63\xf9\x7d\x54\x0c\xe9\xf1\x48\xdc\x6f\x38\x84\x7e\x81\xe5\xf5\xa7\xbc\x3f\xf5\x8b\xe6\x1f\xf4\x1b\x10\xf1\xfc\x1e\x7e\xf0\x3b\xc0\xe2\xc8\x37\x76\xf8\x87\xbc\x9b\x8d\xe9\xcd\x8c\x7b\x3f\xbb\x0d\x4f\x67\xb7\xf9\xf7\x16\xfe\xde\xe2\xdf\x77\xf0\xf7\x1d\xfe\xfd\x25\xfe\xfe\x92\x7f\x7f\x85\xbf\xbf\xe2\xdf\x5f\xe3\xef\xaf\xf9\x37\xd0\xfd\xf8\x04\x7f\xdc\x33\xf5\xcd\x3f\xf8\x1d\x3d\xcb\xef\xf9\x18\xd7\x06\xff\xd0\x33\x42\x25\xc3\x64\x79\x32\x23\x45\x46\x87\x7f\xf0\xbb\x31\x2e\x33\xfc\x9f\x9f\x26\xd3\x05\x2e\x0e\xfd\x95\x37\x35\x3d\xf3\x2e\xbd\x3e\xc2\xa1\xc0\xff\xf9\xa9\xb8\x38\x2d\x70\xc5\xf8\x07\xbd\x1b\xe5\x47\xb4\xdb\xf4\x97\xdf\x14\xf0\x0d\xab\xf1\x0f\x7e\x87\x83\x1a\x95\xf2\x7b\xf2\x9a\x9e\x26\xaf\xe9\x19\x3d\x8f\x51\xbc\x0c\x7f\xe4\x79\x4a\x8f\x53\x79\x9a\xbd\xa6\xc7\x99\x94\x2e\x26\x0b\x7c\x86\x3f\xee\x19\x20\x7c\x2c\xef\xf0\xa7\xbc\x27\xb8\xc5\x3f\xfa\x4c\x8b\x48\x7f\xe9\xcd\x24\x47\xf8\x82\xff\xf3\x53\xc5\x9a\x28\x7c\x25\x3f\xe9\x3d\x73\xe1\x83\x20\x12\x2b\x1d\x1c\x39\x37\xd5\x74\xae\xe7\x46\x7f\xea\x7b\x86\xae\xca\x43\x56\xb5\x98\xf3\x72\xf3\x0f\x7a\x87\x15\xb9\x06\x5d\x40\xf8\x84\x7f\xf9\x0d\xdc\xb8\x0c\x8a\xf2\x8b\xdf\xf2\x1b\xf7\x54\x9d\x0a\x02\xd4\x9f\xf4\xfe\x5f\xf0\xe2\x5f\xf4\x6b\x86\x5d\xcc\xb8\x8f\x19\xf6\x3e\xe3\x9e\x67\x8b\x23\xc4\x3c\xf8\x87\x9e\xb1\x09\xae\x0b\xf4\x03\xd6\xc1\x3f\xfc\xac\x2b\x63\xd6\xa5\x2e\x8e\x65\x82\xf2\x4b\xde\x8e\x78\xb5\xf8\x07\xbf\x1b\x03\x83\x85\xaf\xf0\x2f\xbf\x21\xe2\x07\x5f\xd1\x0f\x7e\x37\xcd\xa9\x31\xf8\xc3\xcf\xf3\x59\x35\x41\x50\xe5\x1f\xf2\xee\x82\x70\x38\xfd\xe5\x37\x0b\xc4\xcf\xf0\x7f\x79\x1a\x8f\x29\x90\x4b\x47\x7e\xc9\x5b\x9a\x8c\xec\xcb\x1c\xbd\xaa\xe1\x99\xfe\xf2\x1b\x41\xc1\x73\x87\x83\xe7\x08\xbd\x73\x86\x5c\xe4\x13\xe5\x36\xd1\x9f\xfc\x1e\x31\x01\xbe\xc4\xbf\xfc\xe6\x0c\x1f\xcf\xe4\x37\x1f\xe2\xb9\x3b\xc5\x98\xe8\x14\x5f\x94\x72\x0e\xe7\xe5\x9c\xc7\x81\x7f\xf9\x0d\x82\xe7\x7c\x26\xbf\x81\x1b\xa1\x47\xf8\x4b\x6f\x10\xe8\x19\xe2\x17\xb8\x98\x0b\x5e\xc9\x0e\xdc\x9a\x9d\x01\xff\xc1\x67\xa4\xef\xf0\x1e\xa2\xbf\xf4\xe6\x9c\x2e\x94\x73\xba\x51\x36\x58\xc9\xf4\xb7\x9f\xe9\x76\x98\xf1\x85\xc8\x3f\xf8\x0e\x18\x95\xd3\x67\x39\xcd\x43\x7f\x0a\x06\x3f\x61\xf4\x7d\xc2\xf0\x51\x8c\xe0\x2b\x5d\x86\xf2\x8b\xde\xe2\x66\x9d\xea\x09\x2f\xf8\x84\x17\xee\x39\x9f\xfd\x3c\xcb\x87\x25\x6b\x7c\xc2\x17\x72\xce\x6b\x3e\xe7\xf5\x6b\x39\x0d\x34\x8e\xa9\x8e\x01\x7e\x20\x57\xc2\xaf\xf0\x17\xbf\xad\x46\x17\xa7\x04\x85\xf2\xcb\xbd\x95\x31\xe8\x4f\x86\xf8\x1c\xaf\x17\x33\x8e\xf0\x05\x97\x61\xf8\x9d\x39\xe8\x9d\x57\x04\x3e\xf0\x87\x9f\xdf\x10\x50\xbe\x39\x75\xd0\x21\x90\xc1\xcf\x02\xc6\xf4\xb7\x83\x5c\x4e\x83\x28\xdc\x6c\xe5\x90\xa0\xcc\x15\x24\x12\xef\xa0\x0c\xf2\xf4\xf2\xe0\xce\xb7\xb7\x13\xc2\x89\xef\x3e\x09\x27\x3e\x1e\xdf\xf5\x13\x11\x75\xad\x2c\xd6\xf6\x62\x5e\x3d\xac\x8e\x17\x35\xa9\x2e\x43\xc6\x27\xfc\x16\xb0\x59\x3f\xcd\xaa\x73\x58\xe6\x50\xf1\x99\xe0\xb5\x92\xe5\x82\x96\x28\x22\x6d\xa2\x26\xbd\x4f\xb1\x76\xcb\x19\xc1\x0d\x09\x6e\xf3\xb8\x94\xe8\x88\xa6\xac\x7b\xed\x0a\x32\xc5\xdb\xc8\x53\x12\xb0\x32\x4a\x16\x3b\x2e\xb1\x82\x55\x7c\x04\x04\x69\x31\x29\x66\xa4\x84\x84\xfa\xae\x69\xe2\x23\xaa\xc9\x7d\x00\x22\x40\x34\x28\x33\xa5\x2b\x79\xf2\xa0\x02\x1e\xa4\x68\xbc\x7e\x8c\x8d\x3d\xa8\xce\x27\x8d\x97\x8f\xab\x37\x45\xe3\xe5\x8b\xa9\x7d\x45\xad\xdd\x07\x9a\x92\x6e\xef\x64\x5f\x89\xaf\xae\xcb\xb6\x6f\xd8\x73\xdb\xb7\x17\xd3\xe0\x0b\xa0\x11\xcf\x12\xef\xfa\x40\x2b\x79\xf6\x3d\xaf\xda\x0f\x40\xff\xa0\x96\x37\xb6\xb7\x19\x6a\xe4\x66\x71\x9c\xe0\x55\xe5\x64\x45\x35\x36\x46\x91\xa4\x80\x15\xae\xf1\x02\x1d\x1e\x4a\xf0\xb6\x7e\x83\x87\xfb\x29\xd8\x41\x4e\x90\x6c\x92\x25\xd3\x76\x18\x1b\x95\x81\xd8\x24\xb8\x9a\x72\x5b\x9f\xca\xc7\x9f\x5e\xec\xef\x3f\x7d\xc2\x97\xd8\x18\x61\x15\x6e\xa4\x83\xf0\x1c\xf4\x96\x9c\x80\x97\x12\x01\x30\xad\xfe\xc9\x34\x9c\x6d\x2d\x09\x42\xe8\x25\xdc\x95\x88\xe4\x32\x17\x80\xf8\xae\x06\x82\xc5\x37\xbc\x2e\x23\x01\x37\x32\xaf\xe6\x4c\x2b\xba\x34\xd4\x86\x73\x70\xc5\x70\x47\xa5\x18\x7f\x4c\xc3\x80\x0f\x2e\x16\x1b\xbd\x8f\x23\xe5\x42\xc5\xcd\xd0\xda\xba\x7b\xcd\x94\xd6\xde\xd0\x9e\xe7\x5a\xf3\x04\x50\x54\xa3\x20\xc8\x2e\x55\x93\xf0\x4f\x66\x38\xf4\x66\x99\x6d\x34\x83\x8d\xba\x50\x9b\x11\xa8\x4a\x6b\x53\xc5\xee\x4b\x6f\x38\xde\x5c\x16\x00\x36\x31\xd9\x60\x6b\xcb\xdb\x15\xa4\x51\xd4\x60\xeb\x2b\x5f\x84\x71\xd1\x60\xeb\xeb\x5b\xad\xf6\x11\x1e\xb7\x0c\xee\x7c\xf3\x1d\x5e\x73\xdf\xdc\xfa\x24\x73\xfc\x83\xef\x3e\xb7\xa7\x2b\x85\x8f\x37\x3f\xcf\x4e\x47\xd5\x11\x8c\x31\x3c\x17\x03\x0a\x73\xd1\x72\x77\xde\xdf\xdb\xd3\x72\x4f\xe1\xff\x6c\x72\x12\x5e\x39\xc9\x22\x7a\xab\xc1\x08\xf5\x63\x58\xcb\x7c\x48\x94\x6d\xeb\x2b\x59\x24\x75\x6b\xef\x20\x96\xdd\x19\x97\x14\x5f\xba\xf5\xce\xb6\xa5\xc2\x1b\x5b\x57\x55\x0b\x7a\x93\x23\xb2\xb5\x6f\xdc\xe4\xed\xe5\x83\x76\xc9\x1d\x34\x31\x1e\x7a\x1f\x96\x5c\x8c\xe6\x25\x29\x32\x53\xc5\xdd\xc7\xa0\x0e\x1a\x14\x25\x4a\x93\x9d\xd1\xe6\x95\x2d\x3e\xea\xe3\x7c\x5a\xec\xab\x33\xed\x64\xfe\xb0\x9a\xc9\xec\x22\x0b\x90\xf6\x82\xda\x96\x8f\x27\x1e\xd4\xf4\x06\x47\x5a\xae\xa6\x1d\xd9\x73\x22\xd3\xb0\x78\xf4\x55\x6b\x01\x5e\x7a\x7a\xd2\x20\x83\x9e\x9e\x5c\xcd\x1e\x85\xac\x6d\x15\xe3\x2b\x9a\x4d\xc0\x49\x3f\x2c\xc9\x5d\xf0\xe5\xb5\x5f\x2d\xab\xa7\x65\xb8\xc6\xac\x38\x2d\x31\x66\xb4\x9a\x79\xf1\xb1\xae\x97\x35\xd0\x52\x05\xa9\x93\x9b\x19\x2c\x7a\x06\x93\x3b\x7e\x3d\xba\x00\x0e\x70\x7e\x4c\x8e\x8c\xce\x06\x03\xf1\x42\x8f\x32\x11\x62\xc4\x12\xb8\x26\x05\x19\xcd\x89\x8c\x18\x3a\x47\x7e\x8c\x12\x4b\xc7\xfe\xe9\x13\x44\x4c\xaf\xf6\xff\xfe\x6c\x67\x0f\x6f\x72\xcd\x51\x26\xd4\x52\xd6\x99\x2c\xc6\x47\xc5\x4c\x9e\x2f\x65\x11\xf7\xf6\xff\xfe\x68\x87\x49\xc5\xa7\x27\xdd\xdf\x44\xca\x80\xfa\xac\x4b\x5d\xe7\x9d\x47\x3b\x8f\xb1\x65\x12\xd3\x63\xf3\x50\xfc\xb6\x27\xb0\x9e\x4e\x5d\x1c\xfa\x72\x82\x50\x89\x57\x72\x56\x79\x74\x80\x64\x00\xa5\xc2\xd0\x78\x7c\xac\x77\x61\x8a\xe9\x27\xe0\xf1\x81\x30\xd9\x7d\x10\xe0\x0f\x89\xef\x21\x3d\x34\xc2\x0d\x48\x92\x02\xab\x7e\xe0\xc4\x1c\xc4\xf6\x71\xa0\x28\x43\x67\x50\x88\x90\x80\xee\xe0\x6b\x5d\x15\x07\xb0\x17\x4f\x2a\xf1\x9b\x46\x7c\x8a\xc1\x7d\xef\xdd\x3b\x94\xa0\x59\x82\x9c\x4f\xc4\x74\x3a\xa3\x04\x21\xe2\xb1\xd1\xdf\xf0\xa1\xfe\x81\x1c\xc9\x31\xdd\x28\x25\x87\xdd\x2b\xe6\xbb\x13\x80\x35\x52\x20\x44\x51\xc7\xde\xdd\x91\x26\xa4\x39\x32\xf1\xb1\xe8\xc9\xd7\x0e\xda\x02\x53\xd2\x03\xca\x33\x39\xe1\x89\x68\xe9\x43\x8a\x43\xbc\x74\xa0\x87\xfd\x94\x9b\x48\xba\x53\xf5\xc1\x78\xef\x6c\xfa\xcb\x97\x2e\x4a\x52\xaf\x33\x7d\xf5\x8a\x24\xbe\x9a\x7c\xa1\xb5\xbe\x5b\x9a\x15\x13\x77\x8e\x3b\x1a\xcc\x1d\x83\x57\x1e\xfe\xc6\xdd\x0c\xb2\x7e\xbf\x7f\x79\x68\x2d\x5a\x3a\xcf\x28\x8b\x73\xf6\xa6\xac\xcb\x39\xc5\xe7\xac\xa3\x00\x9d\x6e\xba\x37\x4c\x9f\x37\x60\x63\xe0\x0b\x46\x14\xc5\x86\x6d\x83\x74\x48\xd0\x09\xa4\x9c\x60\xe7\x9c\x9a\x62\x49\x2a\xff\xab\x2f\xdb\xda\x8b\xb6\xe9\x34\x6a\x57\xd6\xdc\xbd\xab\x09\x12\x8f\xa7\x34\xe3\x0f\x21\xfb\x01\xd1\x56\x23\x9f\xb5\x67\xaa\x14\xca\x61\xe9\x37\x51\xd2\x32\x4d\x31\xa2\xd4\x1c\x8d\x09\xec\x02\x3f\x4c\x2c\x70\x8f\x0c\xe5\x16\x53\x60\xfc\x8e\x29\x3d\x8f\xd8\xe9\x23\x8f\xb7\xfa\x88\x98\xe0\x60\xef\x3a\xef\x6b\x72\xb8\x18\x91\xef\x00\x49\x4a\xc8\x13\xd8\x99\x15\x47\x7d\xdb\xda\xe7\xd7\x92\xfb\xd0\xb7\xc0\xe1\xc3\xf0\x65\x0e\xcc\xa2\x45\x02\xe3\x7c\x92\x9f\xb2\x23\x81\x59\x1c\xd6\x4e\x66\xbb\x92\x3f\xf9\x3c\xbb\x00\x72\x19\xe9\xf6\x29\xfa\xa4\x1e\x95\xa3\x12\x96\x1a\xee\xa2\xd3\x45\x8e\xc4\x72\x21\xe1\x03\x27\x82\x64\x4c\x4b\xf3\xb3\xaa\xc6\x84\x9b\xc3\x42\x72\xd4\x4e\x80\xab\x20\x77\x63\xbc\xe5\xaa\x21\x67\x55\x82\xbd\x18\x2e\xa6\x23\x8e\x5e\xda\x77\x9a\x53\xd3\x8e\xf3\x39\xc3\x1d\x35\xd9\x4e\x52\xeb\x8f\xa0\xfa\xae\x78\x88\xd7\x99\xd9\x0c\x1b\xfa\xdb\x9e\x32\xfd\x1a\xa7\xa4\xeb\xa0\x95\xca\x21\x7d\x3d\xe4\x0c\x34\x3c\xd7\xa6\x42\x99\x1a\xf0\xf1\x7f\x70\x29\x39\x38\x70\xcf\xcd\xb9\x83\x13\xcd\x33\xbe\xb4\xfb\x44\x1c\x14\x6f\x73\x14\x5e\xf4\xb8\xfe\xbd\xdf\x7e\x1b\xe7\xb3\xd3\x72\xf2\x1c\x99\x93\x01\x2a\x0d\x8e\xb1\x87\x2f\xb2\x7f\x74\x8a\xf1\x3f\x3a\x97\x97\x2c\x9e\x70\x0d\x2e\x6a\xfc\xfc\x5f\x7b\xff\x4d\x6b\x96\x42\xea\x57\x9d\xf6\x26\x6b\xcf\xdd\xa5\x3b\x5d\xcc\x95\xa8\xea\x96\xc3\x5e\x83\x42\xea\x39\x11\x41\x90\x58\xe0\x1d\xcd\x02\x30\x6c\xdc\xce\xb7\xc8\x0a\x01\x50\x64\xdb\xcf\x76\xe9\x4e\xe6\x4c\xd2\xc7\x24\xff\xd1\xd8\xb9\x88\xc2\x0f\xab\xc9\xde\xf1\xac\x1a\x8d\x0e\xa5\x08\x0a\x77\x24\x00\x30\xa7\x8a\x3d\x72\x09\xc1\xdf\xf5\xf8\xc6\xf3\xe5\x20\x88\xda\x71\x07\x57\x34\xa6\x80\xbb\xa8\x47\xc2\x8f\x3d\x22\xc3\xbc\x7b\x29\x9d\x81\x23\xa1\xd6\x69\xac\xff\xe8\xcc\xd5\x14\x21\x39\xa3\x96\x93\xa0\x69\x5d\xe1\xe4\x7b\xaa\x98\xb8\x95\x3e\xd0\x2c\x43\x67\x03\x48\xdf\x01\xcc\x76\x1f\xc0\xde\x51\x6d\x4a\xd1\xa6\x5f\xac\x74\x08\xd0\xa3\x64\x7a\xa5\x4f\x7d\x3c\xde\xfb\x9a\x0b\xb7\x49\x1e\x6a\xf0\x30\x5f\x81\x4c\xc6\x1e\x08\x92\x75\x21\xc2\xdc\x77\x46\xa2\x4a\x6d\x77\x9b\x60\x04\x03\x70\xf3\x8b\x62\xf6\x3c\xf3\x30\x48\xd1\xe1\x7c\xd0\x1e\xf3\x85\x37\x0c\x40\x74\x23\xb5\x6d\x3d\xd3\x3d\x25\x54\x17\x23\x11\x26\xd1\x89\x8e\xc8\x8e\xe1\xe4\x62\xf2\x59\x32\x06\x51\x33\x37\xb8\x66\x70\x67\x4a\x58\xf0\x11\xa2\x3d\xf8\x48\x09\xb1\x5f\x17\xc5\x14\xcd\x5d\xcf\xca\x79\x41\x79\x56\x00\x50\xb1\x39\x46\x8e\x94\x5c\x0e\x78\xfa\x63\x8a\x21\x8e\x0d\xf6\x99\xd0\xae\xf8\xda\xba\x8f\x6d\xed\x63\x3f\xf7\x68\x0f\xd8\x92\xc3\x0b\x3d\xd9\x0a\xc3\x3e\xcf\xec\x13\x1a\x35\x98\x47\xb6\x07\x30\x2f\xce\x82\xd2\xa8\x0c\xb7\x8f\xa4\x0b\x37\x2f\x44\xdb\x6d\xde\x90\xee\xda\x3c\x93\x96\xd9\x3c\xb3\x0a\xd7\xbc\x10\x45\xa7\x79\xc3\x9a\x3d\xf3\xe2\xdc\x4d\x41\xc8\xf1\xa7\xfb\x3b\x03\xa7\xde\xee\xd4\x7e\x7d\x4d\x82\x68\x59\xae\x1e\xc5\x79\x14\x7f\xc9\x85\xe4\xf8\x83\xa3\x3d\x86\x65\xbd\x64\x4e\x0b\xe3\x43\x1c\x93\xf0\x12\xed\x07\xb1\x15\xce\xaf\xaf\x9e\xc3\xd4\x02\x60\xcb\x63\xb1\x1e\xa4\xec\x59\xcc\xcc\x90\x75\x33\x06\x2f\x3f\x2a\x61\xd4\xb3\x0b\x6c\x8e\x21\xe2\xbc\x70\xb9\x89\xc6\x3e\x12\x29\x0e\x83\x22\x5b\x02\x2a\xcf\x4f\x18\x24\xb0\x8e\xc4\x70\x3f\x3f\x3f\xef\x9f\xdf\xe9\x57\xb3\xd3\x9b\xfb\xcf\x6f\x3e\xdf\xb9\x7f\xe3\xed\x78\x74\xf3\x7f\x3d\xd9\xbf\x41\xf1\xd5\x09\x0c\xfe\xb6\xfd\x68\xf7\xc1\xab\xfd\xed\x9f\x5f\x3d\xdf\xf9\x79\xe7\xbf\x01\x0a\x6e\xfe\xdf\x83\xfc\xc6\xbf\xb7\x6f\xfc\xff\x5f\xca\xdf\xc1\xab\x7f\xf4\xff\x71\xe3\x1f\xc3\x97\x9f\xff\xef\x9b\x77\x49\xaf\x89\x81\x9f\xf9\x6e\xad\x29\xcf\x3c\xb5\xf4\x46\xbd\xca\x00\x9a\xee\xa3\x5b\xad\x48\x78\xf1\x5b\x28\x51\xa2\x0f\x91\xf4\xf5\xae\xc1\xf4\xda\xd2\x03\x25\x8b\xa0\xc5\xd0\xc2\xeb\x5a\x58\x99\xf5\x78\x8d\x01\xf4\x70\x41\x36\xdf\x83\x13\x8a\x16\xa7\x8f\xdc\x31\x0d\x04\x6e\xd2\x5d\x71\x93\x87\x47\x4c\xb7\xd3\xe1\xce\x82\x7b\xaf\xb5\xfa\xa6\x73\x82\x8e\x46\x7c\x00\x5f\x5f\x1a\x43\xf3\xcb\xa4\xfd\x18\xba\x0b\x3c\xf7\x59\xc0\x04\x0e\x6a\x74\xd9\x05\x32\x8d\x64\x8a\x44\x91\xe5\x53\xe6\x8e\x4f\x14\xf9\xe1\x95\x45\x4e\xfe\xd8\x9e\xb4\xe0\x1d\x54\x90\x22\x63\xc8\xad\xe5\x16\xf3\x32\x77\x6c\x0f\xcd\xc5\x2c\x59\x61\x8c\x6c\x79\x29\x5c\x08\x30\x32\x60\x33\xb2\x38\x67\x86\x96\xdd\xc8\x76\xc2\x96\x07\x78\xd3\x90\x9e\x06\x63\xd2\x1a\xd5\x0c\x3c\x16\x73\x96\xee\x42\xad\xb0\x6f\xa8\x44\x33\x47\x30\xc6\x6a\x13\xf9\x4b\x2a\x7e\x5f\x51\x6d\x7b\x2d\xd5\x44\xf0\xa7\x90\x56\xfb\xa4\x1e\x40\xfc\x11\xf5\xa4\xe1\xcc\xe0\xc6\x0f\x16\x24\x9f\x90\xd0\x96\x6d\x23\x95\xde\xc2\xb0\xc4\xad\xd4\x96\x93\xcc\x5a\xdf\xdf\xb4\x58\x56\x1d\x74\x22\xe1\x5d\x28\x74\x68\x54\xf5\x47\xa2\xf5\xc0\x20\x0c\xb1\x17\x2c\xe2\xa1\x7b\x08\xa2\xfe\x95\x0b\x65\xe0\x3d\x71\x34\x0c\x87\x06\xaf\x66\x2f\x80\x3d\x9c\x23\x29\x68\xe2\x12\x3e\x38\x95\xfb\x74\x29\xfe\xb2\x76\xa4\xfd\x30\xc3\x47\xa7\x51\xa0\x73\x37\x55\x4b\x35\xaa\x64\x35\xed\x56\xd1\x28\x95\x8a\x30\x8a\x7c\x4b\xb4\xc1\xc2\x07\x63\x6b\xb8\x53\x4f\x50\x0e\x04\xbb\x46\x82\x7c\x5c\xa3\x31\xc7\xa2\xa2\xc4\x0e\xc0\x06\x2e\x66\x68\x70\xc9\x3c\x83\xc4\xbe\x43\x92\x10\xcd\x18\xb3\x02\x40\x87\xe8\x6f\x8d\xfc\x29\x2c\xa1\x3f\x86\x81\x1b\x74\x64\xec\x1d\x47\x15\x80\x01\xc0\x2a\xee\xab\x52\x01\x61\x10\x9e\x39\xd2\x39\x35\x3c\x8c\x23\x3d\xb4\x86\xd4\xfb\x0f\x7d\xd9\x43\x35\xc8\xec\xb9\xe6\x79\x58\x11\x72\x2f\xe5\xc4\x8f\xb8\x61\x81\x97\x12\x2f\x0a\x77\x8f\xa6\xe8\xb1\xc7\xb2\xd7\xf1\xd0\x2c\xa2\xc4\x5e\x51\x30\xbe\x04\xe4\x70\x35\xc6\x89\x0d\xd9\x5a\x32\x00\xc0\x54\xe2\xf6\x2b\xd1\x78\x2c\x64\x0c\x34\x16\x13\x36\x07\xee\x00\xbc\x04\xe4\xde\xe9\x00\x8a\xee\x7c\x7f\x13\x18\x17\x73\x32\xbe\xc8\x3a\x3f\x74\xd2\xc1\x00\xb8\x77\xc2\xbd\x4f\xa7\x40\x31\xe6\xa7\x1c\xf3\x6a\x7b\x32\x34\x34\x5f\x1d\x66\xb2\xfa\x22\x51\x5b\xa4\xdf\x5c\xbb\x25\x5c\xa1\xd6\xd3\xe9\x30\xd1\x9d\x80\x5c\xbd\x0c\x04\x5c\x35\x20\x3e\x60\x21\xa2\x1a\x09\x5f\x63\x20\xc7\x7c\x0e\xfb\x09\x04\x47\x11\xb8\xe4\x2f\x05\xe7\xa3\x82\x28\x1b\x51\x44\x23\x79\x22\x34\x2c\xe2\x0a\xdb\xca\xee\x9c\x84\xa8\x88\x07\x01\xd0\x14\x37\x1a\x54\x08\x9d\x9c\xe4\x58\x0f\xef\x8a\x09\x50\x2a\x41\x79\xf2\x65\x73\x41\x24\x6a\x60\xf3\x85\x6c\xf9\x67\x8d\xa1\x5b\x31\xee\xe5\x4d\x68\xf3\xc6\x9b\xfa\x06\x14\xbd\x21\xb5\x05\x60\xf5\x24\x98\x00\x1b\x1f\xe7\x5c\x48\xac\x3a\xc0\xfc\xb8\xd6\x74\xd7\x21\xd1\x95\xb9\x7c\xb3\x2b\x21\x65\x79\xf6\x33\xab\x1f\x6f\x87\x7c\x1b\x43\x05\x51\x5c\xe7\xfb\x00\x9e\x45\xad\x1e\xe4\x8f\xfd\x2b\xab\xc5\x13\x1a\xf1\x6b\x49\x6d\xb8\xd4\x09\x34\xda\x08\xa7\xe5\x64\x51\x84\xda\x6b\x3f\xe8\xbf\xe1\xc5\x97\xdd\x13\xcd\xb7\xb4\xe0\x74\xdd\x2a\xbb\x96\x52\xcd\xec\x18\x6d\xcd\x73\x0c\xed\xa4\x72\x63\x9d\x51\x5b\xc1\x41\x8c\x7c\x7a\xba\x36\x3d\x3f\x81\x50\x7c\xe0\x06\x13\xa7\x74\xd4\xe9\xe0\xc2\x22\x6b\x4a\xca\x8d\x30\xd9\x47\x30\xe3\x38\x73\xa6\x5d\xb0\xf6\xfb\x36\x70\x05\x74\x82\x92\x96\x7c\x8c\x61\xa3\x49\xc5\xab\x58\x86\x30\x64\x02\xc7\x49\x7d\xd5\x66\x94\xbe\x65\xdf\x2e\x7b\x86\x70\x90\x46\xd3\x59\x52\xdb\x1a\x77\x10\x6f\x8d\x59\x68\xd3\x17\xae\xd4\x38\x88\x57\xc8\xff\x10\xbc\xbf\x00\xf8\x46\x41\x93\x0c\xa1\x39\xc0\xc0\x88\x42\x18\x69\x56\x6f\x67\x53\x0c\x54\x83\x01\xbc\x81\x68\xe6\xb8\x36\x00\x0d\x42\xfa\xc2\xd5\x43\x64\x32\xa9\x5c\x16\xe3\x7e\xb6\x97\x63\x02\xd3\x51\x35\xc7\xb8\xde\x4e\x74\x73\xa1\xc8\x93\xcd\x47\x8c\x40\x80\x09\xa8\xfd\x6a\x8f\xfa\x7a\x1c\x0d\xdf\x39\x4a\xce\xed\xf5\x62\x1c\x47\xc7\xba\x44\x74\x07\xae\xb5\x98\xbb\x0f\x1a\x10\x1c\x87\xa7\xa2\xde\xcc\x72\x71\xfb\x6e\x04\xeb\xdd\x23\x22\xe1\x75\x29\x80\xf0\x1d\xcb\x0e\xb2\x8f\x89\x7c\x23\xff\xec\xb4\x8b\xb4\x62\x66\xb9\x5f\x1b\xc4\x4a\xea\xfa\xbd\x5a\xdc\xe0\x93\xf2\x2d\xe2\xd8\x8e\x8f\x1a\x69\x68\x6a\x14\xc2\x8d\xd8\x1d\xbc\xe3\xa3\xf8\x04\x64\x37\x16\x41\x2b\xf2\x25\x9f\x9d\xc5\x73\x10\x6a\x72\x7b\x38\xe4\x74\xdb\x25\x85\xcd\x07\xbe\x0f\x2d\x6c\xdd\x0d\x2d\x02\x3c\xb8\x68\x4f\x27\xd5\x8c\x55\x8a\x27\xe5\xac\x9e\xbb\x92\x2e\x45\x31\x65\x17\xfe\x5e\xc6\xf9\x43\x2f\xfb\x1e\xc6\xf3\x03\x65\x0b\xfd\x5e\xbb\xfe\x01\xb5\xbc\xd0\xdb\xf5\x7c\x01\x84\xc1\x4c\x7c\x25\x35\xdc\xe3\xf5\xec\xc6\x8d\x0c\x2e\x69\xdf\x9e\x2a\xa2\x50\xcf\xd3\x47\x31\x53\x1f\x23\x0b\x9d\x9f\x92\xbc\x61\x8c\x4c\x0c\x1e\xbe\x9b\xf5\x05\xb0\x9e\x6f\xfb\x58\xea\x7f\xc1\x7e\xa2\x98\xf8\x06\x7a\x20\xdc\x28\x27\x68\x06\xae\x61\x24\xfd\x32\xff\x63\xd2\x3c\x2a\xeb\xdc\x88\x7a\x60\x77\xbd\xfc\x5e\x15\xac\xd7\xee\x51\x4a\xb8\x37\x55\x39\xe4\x4c\xd2\x38\xb9\x7f\x03\xa7\x74\x93\x53\xb7\xb8\x7e\x8c\x52\x68\xb9\xda\xca\x83\x42\xd9\xa6\x79\x8d\x3e\xf7\x59\x23\x96\xca\x0a\x25\x90\x2c\x4b\xf0\x45\x16\xd7\x89\x8c\xc5\xc2\x8b\x48\x25\xb0\x30\xe7\xfd\x0a\x3d\xdf\x3d\x86\x0e\xb4\xf4\x07\x81\xb8\x5d\x75\x34\x48\x12\x47\xda\x9f\x41\x10\xbc\xd3\x86\x6a\x90\xf6\xc3\xee\x64\x3e\xd0\x0e\xfd\x19\x44\xcd\xd9\xcb\x3f\x55\x6f\xd9\x3a\x2c\xb1\x1c\x09\xda\x8a\xef\x68\xea\x2b\x18\x73\xa2\x33\xb1\x63\x9d\xcc\x77\xc7\x78\x47\x28\x70\x31\x6b\x23\x95\x6d\x4a\xae\xa0\xc1\x9e\xf9\x90\x8c\x2d\x9c\x59\x64\x45\xff\xcc\x65\x17\xcf\xd3\x0c\xa3\xff\xcf\xaa\x9c\x74\x3b\x9d\x46\x8e\xa9\x46\x3d\x8f\xcc\xdf\x29\xdb\x72\x4b\x84\xf4\x75\x32\x2d\x5f\x29\xa8\x7f\x9c\x0e\x36\x18\x84\x4d\x9e\x1c\x64\x62\x70\xc3\x4b\x5c\x59\x12\xaa\x08\xe5\x60\x6c\x57\x8b\xac\xb2\x57\x50\xe6\x27\xc8\x70\xa0\xa2\x1c\xd1\xd9\x68\x86\xb1\xf5\x01\x63\x62\x1e\x3b\x89\xc7\x38\xf4\x1c\x3b\x07\x36\x64\xc2\x40\x24\x3f\xfd\xcc\xdd\x5e\xb5\xb7\xf1\xc3\x3e\x90\x05\xef\x45\x92\x81\xe0\x3e\xfc\x90\x99\x0e\xd7\xcc\x71\xf8\x01\xb3\x1b\x5e\x71\x67\x04\x70\xae\xce\xae\xdb\x6c\x0b\x9e\xe8\x29\x89\x08\x75\x9d\xf6\xd5\xfa\xb5\x41\x89\x47\xd5\xdd\x51\x5d\x5e\x79\x29\x44\x45\x1b\x6e\x38\xd8\xa3\x0b\x4a\x1a\xc5\x89\xfb\x55\x56\x78\x8c\xac\xed\xc4\x4b\x13\x59\xdc\xe7\x81\x8a\xc6\x66\xcc\x8f\xf0\x5e\x9d\x68\xee\x6b\x91\x25\x39\xa9\x9e\x8d\xd0\x4c\xd6\x9d\x98\x41\x01\x6d\x9e\x6b\xd9\xd4\xe3\x59\x49\x31\x8b\xc8\x4f\x87\x08\x34\x49\x6c\x42\xd1\x0d\xd1\xe7\x6d\x5c\xfe\x9b\x2d\x38\x2c\x87\x4f\xb1\x56\x7f\x82\xc1\x9e\x21\x3d\x84\xca\x5a\x0a\xee\x4a\xc4\xae\xa6\xd0\x3b\x3e\xc3\xcb\x6d\xa8\x13\x80\x39\x8d\x8b\x31\xda\xb1\xe6\x12\xff\x9e\xdb\x12\x04\x3e\x46\x0b\x53\x54\x78\x98\xee\xbb\x85\xe8\x97\x46\x17\x42\x71\x73\x70\x25\x8c\x98\x00\x23\x82\xb6\xd5\xfb\x7b\xb3\x9f\x1e\x18\x85\xd3\x11\xc9\x03\xde\x4e\x8b\xb9\x8f\x36\x9d\xb3\x2a\x72\x5e\x4d\x45\x5f\xf2\xdd\x77\x9f\x65\x7a\x85\xd9\xb1\x0d\x2b\x12\xbc\xf1\x7c\x68\x6a\x79\x76\x0a\xa8\x61\x12\x25\x36\x6d\x19\x03\x52\x3f\x75\x10\x04\x53\x26\x3b\xe4\x90\x31\xc7\x39\x51\x0c\xab\x89\x5f\x25\x54\x47\x79\xcd\xc9\x49\xde\x19\x33\x98\xa4\x17\xc1\x19\x31\xe7\xd5\x75\x92\x50\x77\x37\x93\x7d\xae\x23\x4b\x10\x0e\xcd\xbf\x20\x5e\x13\xb9\xed\xe8\x95\xa0\xe0\xbb\x5e\xca\x60\x24\x0c\x6e\x5c\x21\x21\xe4\x06\xd3\xc6\xb2\x5b\xea\x38\xbb\xe6\x5a\x79\x1f\xb9\xc4\x4a\x16\x9d\x6c\x33\xa1\xa7\x3d\xb6\x3e\x68\xe3\xc3\xfd\xd5\x4d\x93\x75\xcb\xa2\xd3\xa5\x82\x4d\xd6\xdf\x7d\x8a\xe7\xe0\x1a\xd8\x8c\x85\x02\x76\x79\x31\x8c\x8f\x7d\xfc\xcf\x7f\x48\x9f\xd6\x56\xfc\xc0\xb5\xfa\xd2\x70\x2b\xe1\x82\xd8\x5f\xab\x65\xfc\x54\xde\x93\x54\xef\x21\x82\x09\x6d\x62\xdb\xa5\x30\x29\x4a\x2e\x2d\x70\xe8\x97\x30\x64\x40\xb9\xf9\x6c\x88\x63\x71\xc2\xa6\x00\x8a\xa2\x0a\xf7\x17\xf5\xbc\x1a\x6f\xab\x48\x34\x39\xd2\x84\x89\xa8\x58\xf4\x6a\x43\x36\x33\x82\x5f\x47\x33\x99\x48\x1c\x03\x3d\x34\x89\x40\x4b\xd6\xc5\x07\xc8\x9d\x94\x30\x01\x9b\xbe\xb6\xc9\x8f\x1a\x32\x36\x05\x68\x29\xd8\x00\x7e\x93\x6b\xad\x6d\xff\x7d\x4e\x35\x77\x06\x93\xa2\xbc\x6b\xeb\x9c\x68\x33\x6a\x18\x82\x36\xf8\x41\xce\xae\x45\x2a\xe1\x31\x32\x2b\xb5\x96\x60\xcd\xb5\x62\x44\x4b\xb1\xb4\x6f\xdd\xf3\x62\x4f\x98\xe2\x80\xe6\x08\x81\x4d\x7d\x31\x41\xc3\x59\x3a\xb3\x35\x19\x01\x6a\xc9\x43\x32\x10\xc0\xfb\x0c\xdf\xea\xd8\x0e\xfb\xa6\x7a\x1a\x0b\x35\xbb\x09\x87\xd0\x8e\x85\x42\xaf\x27\xfe\xe7\xf7\x97\x1c\x9e\xf4\x61\x09\x2a\x8b\xfb\xbe\x32\x36\x5b\x1f\x9f\x85\x42\xcf\xcb\x68\x65\x39\x31\x95\x2c\x2d\x5f\xeb\x42\xe9\x30\x19\xe1\x97\x7a\xf9\xa2\xa6\xa1\x2b\x84\xbc\xab\x2d\xaa\x76\x6c\xe7\xe6\x12\x63\x87\xef\x7f\xd7\xd5\x4c\xf4\xb7\xce\xf2\x26\x4e\x05\xac\xf7\xf3\x62\x54\x0a\x0c\x33\xc5\xc2\x32\x65\xc4\x93\x87\x04\xc7\xce\x1e\xff\xd0\x8e\x28\x58\xfc\x68\x6e\x3a\xbe\x84\xac\xf7\x83\xdc\x47\x6b\xaa\x04\x74\x18\x4b\x35\x02\x7f\x8e\x3b\x8a\x57\xfe\x3d\xee\xa8\x5e\x02\x81\x2e\xbf\xb7\x28\xa5\x98\xd9\x37\x3f\xc4\xf6\x01\x7a\xd0\x68\x64\x73\x4a\x0c\xce\xb6\xbe\x11\x8c\x24\x91\x3b\x29\xe2\xe2\x9c\x3c\xcb\x45\xd9\x44\xb3\x1c\xc0\xdc\x4d\x1b\x16\x62\x3f\xd8\xcd\x8f\x38\x2e\xad\xe9\x5c\x5e\xb2\xd6\x90\xa1\x1f\x9a\xd2\x57\x76\x76\x25\x9d\x9f\x94\xe0\xac\x4b\xf0\xbb\x0a\xd8\xb6\xca\xcd\x55\x6e\x98\x94\x1a\x7a\x72\xdc\x4a\x0e\x9b\x6f\x03\xe9\xa1\x0e\x69\xad\x1e\x3c\x35\x61\x7b\x68\xbe\x75\x3d\x04\x93\xf8\x05\x45\xab\xda\xbe\x1f\x56\x9b\xcb\x82\x43\xcd\x2b\x8b\x06\x22\x58\x9d\x50\xd0\x9b\x1f\xe2\xca\xde\x56\x16\x75\xbd\x51\x85\x94\xab\xd0\xb5\xb5\x5d\x85\xcc\x0e\x7b\x03\x1f\xbb\xe1\x0d\xc9\x6d\x73\x3b\xa3\x7d\x34\x86\x42\x66\x5b\x1b\xed\x34\x37\xcd\x48\xe7\xd5\x79\xbb\x86\x73\xc9\x82\x78\xb2\xbb\xf2\xae\x68\x95\x9e\x3b\xd2\x2c\xe0\xb4\xde\x94\xc7\x1c\xea\x35\xef\x49\x14\x58\x6d\x8d\x6c\x1e\x46\x43\xad\x11\x82\x44\x5e\xcb\x08\x9f\xce\x78\xc3\x92\xb3\x87\x9b\xd3\x01\xd0\xb5\x7b\x09\xe8\x4d\xb4\x93\x9a\xbd\xd0\xba\xcd\x76\x94\x04\x73\xab\xa7\x35\xfe\xf2\x97\x68\x55\x63\x21\xb5\x15\xa0\xaa\x98\x8b\x1c\x33\xda\x25\x5b\xc1\xad\x94\x5c\x05\xe8\xf5\x5a\x6a\x5a\xc9\x6e\x8d\xec\xdd\x0b\xa5\x4d\x66\xeb\xc4\x42\x84\x5c\x7f\xb8\xe2\xc1\xca\xd9\x1b\xad\xb5\xcb\xec\x8b\xa0\x4a\x52\x13\xa2\x03\xf9\x25\xa9\x5e\x71\x0b\xc1\x5f\xef\xb9\x5d\x5a\xef\x46\x75\x47\xf3\x2a\x57\xaa\x76\xd1\x7a\x7f\x86\x03\x8f\x21\x63\x05\x04\x98\x1a\xcb\x21\xa1\x79\x47\x3e\x28\x30\xc8\xd3\x45\x4d\xb6\x41\x6c\xe3\x69\xa9\xa8\xda\xdb\x9b\xb9\x3c\x1c\xd9\x03\x1f\xa7\x02\x8f\x1e\x1d\x57\x6e\xcd\x49\xcc\xf7\xf1\x1a\x55\xaf\xb6\x21\xfa\xe9\x1c\x49\x30\x07\xca\x65\xdf\x6e\x06\x47\x12\xe9\x49\xab\x39\x59\x60\x32\xa6\xe5\x74\x1d\x6c\x7a\xb4\x76\x3f\xdc\xed\xd1\xc8\xd8\x68\xa5\x75\xe7\xab\x5c\xb4\xb5\xeb\xdd\x07\x0f\x61\xee\xe6\x43\x5b\x83\xad\xc6\x91\x2e\x5a\xf2\xf3\xb6\x94\x22\x0d\x2b\xc8\x5e\xca\x5c\xb2\x47\x0b\xb3\x4e\xe2\x90\xd5\x69\x43\x38\x8c\x84\x4f\xe2\xde\xb4\xc3\x04\xaa\x61\x5e\x91\x8b\x70\xf2\xb3\xcb\x75\x12\x99\xaf\xf2\x07\xca\x2a\xd2\xac\xc4\x06\xef\x65\x35\x11\xbf\x03\x7e\xb6\x07\xd0\xc0\x81\x7d\x1d\xe4\xb3\x0c\x9a\x4c\x7b\xf7\xa6\xdf\xda\x47\xde\x96\xf6\x78\xba\xb6\x93\x2b\x84\x8d\x4a\xc7\x3d\x18\x6c\x6d\x7d\xdb\x8b\xe2\x1b\x0c\xb6\xee\xdc\xe9\xb5\x46\x2f\x80\xaf\x14\x86\x63\x49\xea\x93\x54\xb8\x02\x28\xf0\x55\x33\x37\x4a\x22\xfe\xc0\x60\xeb\x6b\x9f\x73\x84\x03\x0d\x0c\xb6\xbe\xfb\xae\x97\x08\x26\x30\xb8\x73\xeb\x56\x3a\x3d\xc9\x32\x27\xff\xc1\x1d\x8e\x23\xd2\xcc\x1f\xd2\xf0\xd8\x87\x0f\x5f\xf6\x9c\x7f\xfe\xe0\xce\xb7\x6b\xe4\x10\xf9\xe6\xf6\xa7\x58\x5a\x1f\x2f\x9e\x08\xec\xeb\xb8\x35\x92\x16\xed\x26\x66\x16\xc5\x9c\x4a\x51\x68\x8e\xf0\x9b\xc6\x5e\xc0\x34\x35\x23\xfa\x04\x4c\xd2\x34\x11\x42\x2b\x51\xe0\x7f\x50\x14\x2e\x72\xed\x5e\x1e\x5a\x8b\xa2\x9a\x9a\x10\x52\x7b\x24\xa2\xaa\x26\x7b\x8b\x23\xf4\xf8\x12\x47\x42\xf1\x20\xcc\x9e\x3e\x17\xef\xc3\x82\x33\x4f\xb3\x76\x8c\x22\x8f\xe3\x7e\xee\xee\x7c\x4b\xbe\x42\x68\xec\x86\x8d\x21\x31\x2d\xc5\xcb\xb9\xd6\xf8\x1e\xbb\xfc\x41\x35\x73\xf0\xa1\x2e\x46\x27\x78\x89\x53\x06\x58\xf8\x4f\x2c\xe0\xb2\xb3\x1c\x19\x8c\x73\x84\xf3\x05\x79\x23\xa0\xa2\x6d\x4e\xe1\x86\x2b\xf4\x00\xaa\xcf\x08\x3c\xd5\x27\x8a\xb5\x96\x98\x16\xbb\x24\xbf\x93\xb2\x76\xee\x4a\xd2\x65\xbe\xa1\x59\xc2\xc2\x88\xea\x9c\x4f\x1e\xc0\xe9\xd0\x26\xbb\x27\x5c\x74\x48\x1d\x92\x9a\x9e\x75\x85\x44\xb4\x9c\x41\x85\x11\xdc\xe8\xcd\x60\x58\x0f\xcd\x8a\x5f\x25\x14\xd6\x43\x0d\x2e\xeb\x03\x61\x3d\x7c\xfa\xfc\x71\x14\x06\xab\x1d\x94\x7a\x29\x50\x5e\x11\x0b\xcb\xe5\xc4\xdc\xe5\x1c\x14\xb8\xe6\xec\x47\xeb\xa2\x3f\x1f\xca\xc9\x1c\x5d\xd0\xbe\x8a\x3f\x1a\x2e\x15\xba\xda\x66\xbf\x54\xe7\xb0\x20\xb3\x9e\x36\x77\xf8\xcf\x1a\x58\x2a\x58\xb4\x13\x0c\xff\x4b\xe6\x8e\xf9\x8c\x0b\x03\x12\x41\x08\xa9\x66\x88\xa1\x90\xcc\x1b\x95\x93\xb9\xf8\xea\x9c\x57\xb3\xd7\x8a\x0e\xd0\xac\x59\x9b\x13\xbc\x33\x2b\xa6\x95\x03\x2b\x2c\xff\x4f\x24\xf5\x68\xbf\x74\x9c\x7d\xdc\x60\x91\xe8\x89\x99\x0a\xbe\x31\xd1\xb6\x8c\xe2\xbd\xb1\xc9\x6d\x24\x1f\x90\xa5\xd3\x9f\x08\xf0\x87\xb4\xb0\xdd\x10\x89\xf4\x01\xf6\x1f\x21\xe8\xa3\x7b\x28\x3d\x3d\x07\x64\x8d\x14\x13\x22\xed\x79\xc7\x52\x63\x57\x6e\x8a\xcf\x5f\x8f\x62\x9e\xc2\x8f\x8e\xb8\x84\x2e\x8f\xb9\x85\x50\xe4\x22\x6e\x45\x18\x0f\xee\x71\xba\xf9\x53\x18\x6d\xb0\xf5\xe5\x77\x1f\x30\x1a\x17\x5d\x8b\x5b\x9f\x62\x6f\xfd\xc1\x77\xa5\x25\x32\xd7\x08\xbf\xf5\xcf\x1a\x8f\x24\x60\xb8\x72\xc4\xee\xa9\xbf\x63\xd0\x2d\xe5\xa2\x96\x04\xd2\x6a\x16\xf9\xa0\x81\xb8\xd6\x0f\x75\xb5\x4e\xd8\xaa\x75\x23\x48\xd5\x41\xe0\x12\x5b\xd4\x7e\xb1\x59\x0e\x76\x30\xa2\x1d\x33\xc6\xb1\xe0\x58\xb0\x31\xf2\xc6\x98\x38\x95\xf8\x2a\x31\x19\x39\x6c\xc8\xe3\x87\xdd\x4d\x1f\x8d\x3f\xca\xea\x15\xa5\x39\xc0\x81\xee\x3e\x61\xef\xd1\x67\xcf\x9f\x3e\xdb\x79\xbe\xff\xf7\x57\x3b\xcf\x9f\x3f\x7d\xbe\x27\xdc\x52\x8b\xf8\x90\x55\xb7\x9d\xd6\x78\x22\x8e\x47\x47\xd5\xa3\xdc\x34\x29\x31\x07\x8c\x34\x08\x03\xad\x0e\x94\xad\xd5\x8d\x58\x1f\xeb\xb2\x2b\xb4\x46\x6c\x72\x10\xa2\xa9\x65\x05\xd3\xc8\x8a\xd1\x35\xa5\xf6\x75\xb5\x8f\xcf\x31\xce\x11\x61\xf8\x20\x4f\x6f\x4a\x22\x1f\x9a\x89\x11\x52\x8c\xdf\x61\x93\x32\x88\x38\xc0\xdf\x5a\x8c\x0a\x75\x24\xbc\x8f\xe8\x6a\x1b\x19\x7a\xc9\x08\xd5\x2d\x7f\xc2\xa9\xaa\x65\x6e\xdc\x1a\x4f\x2c\x76\x98\x05\x1c\x12\x3b\xc5\xb6\x26\x19\x2e\x87\xe8\x9e\x20\x49\x72\x68\x38\xb0\x48\xdc\x6c\x3f\x5d\x83\xd2\x67\x68\xa6\x70\x37\xe4\x09\x45\x34\x40\xe7\xaa\x44\xd7\xae\x8d\xcf\x2f\x79\x6e\x94\xf6\x8c\x7f\x49\xd7\xda\x50\x6b\x3a\xd6\xa6\xde\xc9\x5c\xe6\x18\xa6\x83\x47\xf0\xc6\x7a\xc0\x90\x64\x15\xe7\x14\xc4\x8b\xc0\x6c\xc0\xf0\x52\xe3\x43\xbc\x4f\xb4\xa7\x6b\x2d\xa7\x27\x56\x0d\x52\xea\x5d\x17\x14\x23\xa1\x42\xeb\xf7\xfb\x9b\xec\xdd\x2d\x85\x5a\x1a\x3e\xc0\x96\x5e\x52\x99\xd0\x05\xfc\x4a\x23\xd9\xdc\x4c\xc8\xc9\xbd\x35\x61\xd5\x94\xf3\x5b\xa2\x50\xc4\x73\x76\xd7\xb4\xb1\xc0\xb3\x99\x56\xbe\xf4\x14\x67\x39\xc9\x87\x6f\x30\xe0\xc4\xc4\xc6\x3c\x42\xaa\xdb\xc5\x87\x41\x80\xd7\xb6\x8e\xf0\x15\x9e\x65\x32\x3b\x40\x27\x03\xa7\x60\xa3\xdb\xf1\xa8\x38\xcb\xdf\x94\x30\x48\x18\x19\xe5\xa1\xaf\xbc\x03\x83\xe4\x11\x76\xe2\x63\x06\xb5\x86\xd4\x33\xed\x0a\x03\x23\x23\xaf\x21\xeb\x53\xc4\x26\xb9\x16\xc4\x02\x21\xf8\xf2\x06\x59\x40\xb8\xa4\xcd\x76\x39\x6a\x02\x5d\x60\x4e\x3f\xde\x81\xdc\x9f\x9a\x65\xa8\xc2\xa8\x32\x3e\xff\x43\x50\x45\x80\x24\xfc\x80\x96\xa0\x8b\xc6\xe9\x6f\x5a\x46\x7d\x3a\xfd\xef\x73\xfa\xdf\x03\x58\xed\x01\x58\x0d\xad\xee\x72\x63\xba\x5b\x6f\x36\xc0\x3a\xb9\x5c\x00\x08\xb7\x68\xdb\x4b\x61\x3e\xf2\x3a\xeb\xf0\x2a\x7c\x2e\xfe\x61\x33\x8e\xd7\x45\xd1\x1e\x82\x18\x08\x17\x2e\x61\xe3\x62\xc2\xe1\xaa\x3f\x00\xe4\xaa\xba\x5d\x6c\x7a\x1e\x37\xe2\x5d\x85\x71\x17\x96\x5d\x55\x9e\x54\x89\x40\x95\xdb\xb9\x22\x94\xa6\x7d\x2c\x0d\xaa\x12\xff\x4a\xde\x27\xe9\x62\xad\x2d\xea\xd4\xc6\x0f\xe8\x83\x1e\x7f\x52\xab\x02\x67\x44\x34\xb0\xa0\xf8\xe5\x6b\x16\x50\x87\xd1\xb2\x9d\x19\x55\xda\x9a\x8b\x66\x49\x6d\x59\x19\x6a\x65\xdd\x75\xa1\xb4\x9a\xea\xa2\x88\xb4\xe8\xd1\x85\x06\x9b\x94\xb7\x1f\x18\x61\x6a\x5f\xfb\xa6\xe3\x15\x4b\x66\x44\xe1\x89\x45\x3b\x0e\x55\xa0\x6b\xae\x5b\x92\x29\x4b\xa8\x4d\x79\x49\x8f\x8d\xce\xb4\x61\x2a\x33\x1d\xe5\xc7\xd1\xfd\x85\x1c\x0d\x25\xb6\xad\x95\xdb\xd5\x40\x85\x8c\x2d\xac\x5f\xe5\x8a\x85\x25\x65\xbe\x0b\x7b\x44\x7d\x0d\x5b\x96\x56\x1c\x4f\x5d\xe4\x12\x17\x80\xa3\x12\xda\x9f\x5c\x2d\xb0\x05\xd7\x70\x72\xe5\x39\x82\xc0\x6f\xdc\x8e\x35\xaf\x90\xb9\xe2\x4a\xfe\x0a\xd3\x60\xff\x4f\x9f\x55\x71\x55\xc9\xc4\xe6\x85\x7e\xca\xef\xb5\x77\xab\x7a\x97\xad\x94\x1e\x97\x9e\x0f\x27\x54\xc3\x00\x56\xaa\x50\x86\x83\x21\xb7\x26\x45\xab\x83\xc3\x32\x23\x53\xbd\x13\xe5\xbd\x52\xdb\xc9\x49\x86\x19\xe5\xfe\x70\xe9\xb8\x34\x54\xa3\xfa\x9a\x08\x5e\x94\xb6\x4b\x66\x92\x6a\x82\xf7\xf8\x07\xb7\xc9\xda\x82\x3c\xf2\xe7\x76\x7c\x6d\x16\xe7\x19\x4f\x42\x57\x50\x66\x6d\xf6\x45\x06\x19\x6f\x8e\x8b\x80\x50\xc2\xf6\xdc\xba\x0b\x7f\xbe\x77\x33\x1f\x15\x93\xd3\xf9\x19\xbc\xfb\xe2\x0b\x4f\x7a\xca\xc7\x83\xf2\x65\x9f\x75\xd7\x4f\x5a\xb7\xb6\x51\xd4\xa9\x7f\x2f\x97\xec\xb8\x6c\x87\xcc\xa0\x31\x6e\xaf\x8b\x5c\xa9\x21\xb6\xfc\xac\x51\x12\xdb\xd7\xa2\x27\x4e\xf1\x68\x09\x7a\x47\x33\xca\x35\x28\xba\x4e\xf3\xa5\xd1\x2d\xdb\x0b\xb5\x13\xbf\x32\xe5\xa2\x4b\xa4\x93\x78\x6b\x4a\x37\xf0\x67\x27\xf9\x5e\x32\xe5\xad\x73\x86\x3b\xeb\x14\x8b\xdb\x6b\x03\xbc\xce\xca\x32\x9d\x15\xa2\xe2\x50\x03\xfd\xe1\xb4\xca\x09\xb1\xdd\x60\xeb\xce\xd6\x6a\xfd\x72\x9b\xfe\x37\xd0\xf3\x36\x75\xb8\x81\xdc\x6c\x70\xe7\xdb\x6f\x12\x1a\xda\x3b\x9f\x34\xb4\x1f\x51\xea\x4c\x29\x08\x3f\xe9\x68\xd7\xd5\xd1\x72\xca\xc6\x15\x5a\x5a\xc9\xeb\x98\xd0\xd3\x3e\xaa\xf2\xe1\x7b\x68\x69\x49\x66\xf8\x79\x4a\x4b\xcb\x5d\x7e\x64\x3d\xad\x76\x9a\x7b\x35\xad\xd3\xd9\x7e\x60\x4d\xed\x6e\xb0\xee\x57\xd1\xd5\xee\xfa\x24\x9b\x5e\x5b\xbb\xfb\xf0\xf9\xf6\xe3\x9d\xdf\x55\x5f\x2b\x8a\x4d\x5e\xa3\x8f\xad\xda\x44\x38\x83\x6b\x7e\x04\x7f\xd6\xd3\x45\xf2\x2a\xfd\x59\xb4\x91\x5f\x7e\xba\x02\x3e\xe2\x15\x30\x3e\xfd\x84\xff\xd7\xc6\xff\xe3\xd3\x55\xc8\x7f\x7c\xfa\x71\x31\xff\xf8\xf4\xea\x68\x1f\x46\x22\x16\x3f\xef\x82\xf6\xb1\xc7\x8f\x81\xf3\xfd\x5a\x5f\x09\xe1\x4b\x12\x65\x83\xed\x1f\xff\xfc\x51\x50\xfd\xf8\xf4\x0f\xc7\xf3\xef\xda\x10\x29\xae\xa1\xa5\x02\xff\xae\x79\x65\x8c\x4f\xff\x2c\xf7\xc5\x57\x9f\xac\x57\xfe\xe8\x4b\x04\xa3\xb3\x7f\xc0\xa4\xa9\xef\x6b\x35\xf2\xa8\x9c\xbc\x2e\x86\x24\x57\x7f\x31\x47\xeb\xb6\xf0\x0e\x8a\xbe\xfe\xcf\xb8\x80\xde\xc1\x1a\xc6\x3b\xc9\xc6\x65\xe5\xcb\xd5\x53\xb9\xad\x63\x3c\x23\x05\x31\x7a\xe2\x8a\xcb\x92\x82\xfa\xfb\x1a\xec\x46\x52\xff\x74\x41\x95\xc8\x17\x82\xf2\x7e\xba\xa3\x7b\x52\x01\xc4\xf3\xd8\x77\x4f\x68\xbe\xc5\x50\x70\x28\xda\x44\xa1\x3d\x23\x5b\x35\xe0\x01\x71\xc9\x08\x4d\x1c\xbe\xb2\x76\xb5\x02\xd4\x6b\x1a\xee\x2a\xfa\x4b\x66\x6a\x9d\xc0\x05\x88\xa3\x6e\xcb\xd4\x8a\x81\xa3\xce\x6b\xaf\x1a\x3f\x2b\xea\x42\xd2\xce\xa3\xb8\xf2\x73\x0e\x48\x83\x41\xc9\xd1\xb6\xab\x18\x62\x28\x72\xd2\x45\xe1\x8f\x61\x71\x92\x2f\x46\xf3\xfb\xee\x13\xde\xa6\xfa\x96\xe0\xd5\x99\x05\xed\x9e\xf8\x26\x28\x81\x16\x37\x42\x97\x3e\x1a\x19\x61\x7e\x8e\x11\xaa\xe3\xba\xe2\xf3\x77\xd3\x19\x02\x6c\xf6\xf0\x86\x9e\x65\xec\x09\x44\xd6\x66\x91\x6f\x6b\x26\x2d\x93\xe5\x59\x41\x6e\x75\xa4\xe7\x23\x6d\x1d\x1c\xed\xd3\x53\xa8\x6e\x2c\x72\xe8\x3a\x97\x2d\xf6\xe3\x83\xb7\x17\x34\x1e\x3f\x16\x9c\x0f\x8e\xae\x31\x20\x42\x73\x9a\xf4\x40\xc9\x19\xea\x0e\x8a\xd3\x08\x97\xf7\xaa\x66\xb1\x3d\x67\xd3\x50\xb3\x05\x92\xc4\xf9\xb1\xd6\xac\x1b\xa2\x98\x6c\xf4\xc7\x4a\x08\xb1\xcd\xb2\x41\xe1\xd3\x23\xa3\xac\x5c\x64\xac\x50\xfe\x9b\xf5\x9e\x00\xa6\xb2\x70\xb8\xea\xf1\x76\x6e\x52\xa2\x5e\x54\x8f\x00\x14\x15\xe3\xa9\x5a\x09\x05\x85\x79\x97\x37\x1d\xc2\x35\xb1\x8e\xc3\x14\x0d\x70\x49\x6d\xdd\xfc\xf5\x01\xe5\xeb\xfa\x0a\xaf\xac\xad\xdb\xb7\xb6\xbe\xba\x09\x13\xbb\x41\x00\x7a\x43\x97\xe6\x8c\x9c\xcb\x62\xe2\xca\x9e\xce\x2b\x91\x57\x74\x64\x23\x02\xeb\xc9\xb3\x17\xfb\x2b\x92\x00\xc7\x38\xb7\xbf\x66\x72\xe0\x53\x14\x19\xd2\x22\x63\xe4\xd4\xa2\x25\x4b\xb0\x5d\xbc\xcc\x26\xd0\xed\xdb\x2f\x77\x2d\xb9\xe6\x7c\xfe\xb8\x75\xd9\xa4\x41\xa2\xae\x7c\x42\xaf\x4d\x0a\x01\xd9\x0b\x6b\x52\xd3\x83\x70\x08\xde\xcd\x35\x78\xcd\xee\xc8\x2c\xf7\xf7\xf4\xe1\x32\x9b\xef\xfb\x23\xf4\x90\x3b\xf4\x83\x3a\x44\xdb\xec\x73\xf2\x9c\xeb\x48\xb4\x04\xb6\xe3\xa1\x4d\xf7\xbe\xbc\x53\x71\xed\x36\xa1\x4b\x02\xe2\x94\x0a\x26\xa7\x69\xfd\x51\x9b\x6b\xe8\x73\x20\x6a\x4f\x6f\xe4\x75\x63\x87\x4f\x45\xb3\x4d\x98\x77\xd3\x36\xa8\x55\xde\x44\x8b\xf5\x46\x56\x89\x46\x4a\xb8\xa7\x6f\x17\xd9\x74\x7a\xec\x06\x9b\xea\x56\xa6\xd2\xec\xd8\x57\xd3\x5f\xbe\x73\x7d\x93\xea\x5e\x1a\x0c\x96\xad\x9a\xdc\x67\xdc\xa2\xfe\xf3\xcc\xca\xf0\xcb\xbb\x41\x96\x66\xda\x9b\x95\x49\x9a\xd7\x66\x16\xe8\xb2\x1c\x36\x34\x4d\x1a\xf0\x17\x7e\xc2\x41\x25\xbd\x93\xda\x89\x34\xaf\xd6\x83\x72\xa8\xa9\xa6\x13\x9d\xff\x0a\xf8\xed\x05\x3b\x32\xb6\xf4\xaf\x0e\x8b\x3a\x7b\xdb\xe9\xdd\x15\xa3\xd4\xba\x52\x90\x35\x46\x2d\x63\x4c\xaf\x0c\xdf\xd4\x66\x68\x18\x6a\x47\x02\x1f\xe0\x4f\xc2\x15\xfc\xf3\x7e\x33\xf4\xc1\xea\xb1\x47\xc9\xbf\x23\x60\x79\x17\xeb\x33\xa9\x90\xb9\xce\xbd\x0f\x70\x47\x9a\xef\xf8\x57\x89\xbe\x15\xfb\x48\x99\xd0\xbf\xfa\xca\xe7\x70\x89\x45\x1d\x62\x9d\x1c\x6e\x4e\xa5\x28\x8c\x75\x1f\xfe\x06\xae\x65\x21\xf1\x83\xbd\xf1\x4f\x31\x67\x33\x1f\x74\x3e\xe9\x67\xbf\x02\x58\x9b\xe0\xbf\x2e\xf4\xf0\xfc\x62\x2a\x41\xff\x50\xe6\x4c\x51\xfb\x4c\xb4\xc3\x5e\xf6\xcf\x7a\x58\x8d\x55\x4a\xd2\xbf\xf2\x12\xbb\x95\xcd\x3a\x34\xb2\x4e\x2f\x23\xa7\xf0\xc0\xd8\xcf\x81\x53\x70\x5c\x6d\x9e\x90\x37\x91\xb1\x05\x9f\x61\x73\x81\x50\x46\x2c\x7f\xf8\x53\xeb\xfd\x54\x3e\xc7\x4b\xae\xd5\xe2\xc8\xdf\x8a\x5a\xf5\xbb\xd1\xef\xb1\x9c\x24\xd0\x16\x63\xa6\x27\x14\xf0\x9c\x73\xa8\x87\xbc\xce\xc9\x06\xe2\x3c\x2f\xe7\x40\x82\xc0\x18\xc8\x65\x5b\x29\x25\x32\xac\x44\x58\xca\x4f\x73\xca\x4a\x45\x21\x21\xb4\x21\xb4\x9f\x1e\x23\x8f\x8c\x24\x3d\xa5\xe9\x63\x63\x6d\xb4\x08\xc1\x94\x6e\xc5\xd0\xa4\xfd\x21\xea\x85\x22\x48\x5d\x60\x72\x02\x6d\x43\xa3\x3b\x9f\xc2\xd7\xc5\x11\x25\x63\x38\x11\xe6\x99\x93\x8e\xde\x2c\xeb\x7a\x51\xd4\x37\x6f\x7f\xfd\xdd\xb7\x54\xc9\xf2\x20\x7d\x1c\x7f\x37\x45\xd9\x33\xae\xdc\x34\x68\x7f\xc2\x5a\x00\x73\x3c\x26\x2e\xe2\x60\x74\x66\xe7\x9a\x06\xae\x33\xcb\x87\x65\xd5\xa1\x10\x0a\x9c\x0a\x2f\x02\xf8\xf5\x50\x02\x97\xfb\xd7\xa2\x98\x5d\x3c\x47\x7e\xfc\x9e\xab\x23\xe3\xcb\x70\x61\x81\x27\xee\xba\x32\xc6\x2c\xc0\x06\x10\xb0\x6d\xa4\xca\x7a\xff\x7f\x7f\x86\x90\xdc\xd7\xfe\xd8\x7f\x0a\xb6\x1b\x5d\xed\x27\x37\x24\xca\x03\x6e\x9d\x93\xef\xcd\x67\x17\xd9\x21\x16\xeb\x6b\x4c\xcd\xc3\x9e\x39\x90\x9a\x96\xac\xae\xc6\xc5\xbc\x1c\x63\xf0\x52\xb4\xc4\x2d\xd0\xd5\x64\x86\xf0\x47\x29\x93\x51\x02\x49\x59\xe3\xb8\x4d\x40\x3e\x15\x35\x4c\x00\xe2\x5b\xe3\x7e\x60\xc1\x84\xc9\x03\xfc\x2d\xb9\x96\x5c\x3f\x44\x2e\x93\x49\xab\x5c\x88\x2c\x58\x70\xb6\x27\xbe\x31\x64\x10\xce\x89\xb4\x29\x27\xc7\xa3\xc5\x50\xe8\x1a\x71\xa2\x40\x68\x47\xc4\x83\xfa\xe3\xaf\xb8\xe3\x7b\x87\x3e\x6f\x49\x9f\xc5\xad\xbe\x35\x47\x17\x01\x5d\x8a\xd2\x1d\x64\x3d\xf0\x38\x49\x42\xdd\x9c\xfc\xce\x7a\x19\x5c\x3f\x9d\xda\x3b\xaa\x61\x2d\xce\x6e\x6f\x26\x49\x1b\xb5\x07\xab\x89\xac\xeb\x36\xa6\x3a\xf4\xb8\xd0\x93\x63\x00\xe7\x98\xc9\x6d\xee\x42\x80\x0a\xd8\x9c\xce\x2a\xcc\x87\x60\xb6\x3b\x6e\xcf\x5f\x10\xcc\x15\x93\x9d\xe8\x3d\x44\x5f\xff\xb5\xf7\xf4\x49\x9f\xf1\x6f\x79\x72\x21\x71\x2e\x28\x68\xd8\x17\x59\xe7\x25\x85\xc4\xb9\x77\x9d\x60\xfc\xfa\xcb\xce\xa6\x03\xc6\xd0\x9c\xa5\xc7\x43\x78\x44\x01\x59\xe8\xa7\xb7\x69\xc9\xbe\x77\x1f\x23\x0b\x17\xc1\x75\x18\x0d\x56\x0e\x07\x15\x3c\x28\x4d\x04\x30\x42\x6b\xbe\xc4\x3d\x7f\x2e\xc2\xd0\x55\x99\x6f\x87\x00\x98\xcc\x74\x03\x90\x0e\xa3\x98\xc5\xb1\xfe\xe2\x1c\x13\xd4\x1a\x89\x08\x1a\xf4\x85\xeb\xc8\x04\xe9\x7b\x77\x13\x61\x37\xf4\x30\x6e\x47\xc8\x11\x0d\x32\xe2\x59\x4e\x25\x5d\x04\xf3\xb9\x93\x1b\xfc\x44\x9b\xa3\x80\xec\x2c\xe0\x7d\x4e\x59\x6a\x8e\x04\x6e\x9c\x9d\x4c\x93\x43\xd5\xea\xeb\x2e\xb9\x65\xf1\x5f\x68\x34\x2c\xe3\xda\x34\x13\xf5\x6b\x23\xf4\x14\xac\x50\x82\xb4\x92\x9a\x2f\x3f\xec\x0a\x49\x3f\xcb\xd6\xe9\xc5\xe4\xf5\xa4\x3a\x9f\xc8\xa2\xc0\xb1\x9d\x57\x13\x34\x05\xfc\xac\xee\x77\x7a\xcd\x25\x5f\x3a\x71\xe9\xce\x4e\x9f\x71\xe5\x5c\xfc\x82\x72\x7b\x8f\x05\x3d\x12\x20\xf7\x48\xa0\xa4\xe1\x97\x19\x53\x20\xa2\xb1\xad\x21\x9a\xd5\x40\x8e\x80\xc0\x94\x1c\x73\x66\xa0\x8c\xdc\x38\xc9\x42\xa9\x32\x04\xb8\x02\x51\x6a\x70\x43\x4a\xdb\xf6\x30\xd2\xf8\x14\xaf\x28\x98\x88\x18\x91\xd2\xbf\x75\xaf\xc4\x70\xe6\x71\xac\x35\xcb\x75\x44\x84\x0b\x46\x13\x59\x2e\xd1\xc7\xf9\x5f\xc1\xbc\x28\x12\xdd\x0e\xb6\xb6\xbe\x5c\x6d\x39\xd4\x90\xbd\x0e\xb6\xbe\xfc\x76\xbd\x90\x15\xef\xa1\x26\x58\x66\xb3\xa4\xa2\xd0\xc1\x9d\xad\xad\x94\xd9\x52\xc3\x42\xe9\xeb\x4f\xea\x86\x3f\x58\xdd\xf0\x74\xca\x21\xf1\x5a\xf4\x0d\x7f\x6e\x39\x3e\x15\x97\x30\x25\x61\x49\x8d\x5d\xa2\x85\x58\x6c\xbc\x42\x86\xce\x85\xac\xce\x39\x12\x57\x73\x81\x36\x79\x35\xf6\x59\x33\xe1\x7f\x58\x13\x39\x82\x02\x65\xe6\xe9\x9a\x3a\xd9\xa7\xc1\x88\xae\x22\x37\xe4\x9a\x91\xe0\xf0\xe9\xb3\xfd\xdd\xa7\x4f\xd6\x56\xce\xbe\x6c\x0a\x29\xda\x44\x24\x12\x2e\x21\xeb\x5e\x2c\x26\xa7\x98\x56\xae\xde\x1c\xc0\xa0\xc9\xe7\x4a\x53\x57\x23\x85\x64\xe7\xec\xd7\xca\x7b\x9d\x5d\x29\x0f\xf8\xbb\xe7\xeb\x0e\x38\x7e\x1d\x52\x9c\x5b\x1f\xee\xd2\x17\x42\x9e\x86\xd2\x62\x2b\xff\x67\xb9\x1f\xec\xd1\xf7\xdc\xcc\x0f\xd6\x7d\xcf\x92\x1c\x1d\x55\x51\x98\x25\xa8\xcc\x12\x28\xc9\x11\xa4\xf1\xb6\x0c\xf4\x2a\x7d\x38\x37\x64\x58\xb2\x25\xa2\xaf\x55\x57\x13\x43\xcf\x15\xee\xa6\x0f\x78\x6f\xac\x88\x28\xf4\xcd\x27\x63\xa5\x8f\x87\xf8\x99\x61\xfa\x80\x8a\xe6\xff\xa7\x15\xc5\x1f\x58\xfd\x2b\x41\x11\x70\x07\x56\xdc\x49\x5c\x88\xee\x24\x47\x06\x31\xb5\xcc\x07\xb9\xde\x3d\x79\x56\x90\x3f\x20\x0f\x64\x7b\x32\x7c\x17\x65\xee\xab\xa9\x6d\x24\xcc\x19\x1b\x7c\x82\xe1\x92\xec\xf4\xee\x07\x12\x96\xa2\x2c\xa9\x4d\x9d\x9c\x85\x33\x15\x21\x5e\x43\x06\x69\xd4\xcb\x7f\xe3\x8c\xcc\xa4\xdf\x36\x8a\x6e\xaf\xd2\x4d\x2a\x81\xc3\x30\x10\xae\x22\x2f\x3d\x15\x43\xeb\x1e\x55\x3a\xe0\x9f\x27\xe4\xf9\xe9\xae\x4f\x0e\x3c\xfe\xdb\x86\x0f\x9f\xcf\xb1\xfb\x25\xee\x77\x28\x25\x13\x9c\xee\x23\x13\x9a\x5a\x7d\x4e\xe0\xe6\xb3\x5a\x50\xc4\xff\x6d\x74\xeb\x81\x05\xa2\xbf\x71\xf3\x9b\x8d\xd4\x87\xe8\x5f\x4a\x56\x48\x5d\xc3\x90\x52\x42\xee\xeb\xd9\x17\x6e\xf8\xf0\xf3\x3a\xdf\x71\x5e\xa9\x0c\x1c\x97\xbb\xeb\x34\xe8\x04\x20\x1f\x72\x2b\xc2\xa1\x5c\xdf\x34\xb7\x5e\xf7\xfa\xa1\x8e\x96\xa8\x1c\x84\xaa\xfe\xf5\xcd\x58\xa8\x1e\x79\x85\xe3\x84\xfe\xd8\xf9\x64\x35\x5c\x7b\x00\xb7\xd1\x64\x44\x02\x7f\x92\x85\xb3\xe2\x4c\x75\xc9\x69\x19\xb8\x0b\x02\x50\x3b\xf4\x74\x69\x28\x44\x27\x42\x00\xf4\xde\x40\xc1\x36\x22\x04\xce\x80\x65\xd8\xdb\xa2\x2a\x20\xb3\xc1\x2e\xc7\x37\x71\x63\xeb\xc1\x44\x46\xe2\xd8\xe5\x8b\x51\xbe\x9f\x36\x78\x0e\x0f\xd3\xb1\x8f\x74\xe9\xba\xd4\xb4\xe6\x8a\x9b\xe4\x38\xf7\xb2\xb2\x97\x11\xb0\x7a\x52\x1a\x51\xa1\x6b\x22\x90\xf1\xf6\xa5\x00\x89\xcf\x38\xff\x9c\x89\x68\x99\x80\xf1\xa0\x2f\xb1\x53\xc1\xf7\x24\x76\x13\x91\xdb\x48\xb2\x6a\x50\x99\x40\xde\x36\x8a\x04\x6d\x41\x6b\x07\x24\xe2\x73\x15\x0f\xca\x97\x36\xcd\x7f\x90\x09\xc4\x74\x24\x13\x58\xda\x8d\x5d\x24\xcc\x0a\x60\x7b\x8d\xfd\xcc\xa5\x3d\x74\x59\x7b\x13\x24\x60\x25\x81\x9f\xff\xe8\xda\x43\x6a\x57\x1f\xac\x28\x2f\x55\xd6\x97\x8c\x05\x18\xd1\xc9\x03\x3a\xfe\x01\x27\x6c\x42\x1d\x93\x90\xaa\x7d\x45\x8c\x75\x56\xbc\x45\x01\x9b\x8b\x23\x51\x92\x7d\x2d\xa6\x7f\xa7\x38\xae\x98\x92\x7f\x56\xd5\x14\xc2\x56\x9b\x73\xda\x28\x4a\xfd\x44\xa2\x1b\x4d\xce\xd6\xd8\xd4\x70\x23\xd2\x1b\xbc\xce\xba\x47\x4b\x26\x97\xcf\xbd\x68\x07\x56\x2f\x9a\x87\x01\x8f\x69\x9a\x0b\x18\xf4\x27\xe3\xf2\x6d\x6b\xcb\xb7\x5a\x5a\x8e\xb1\x84\xe5\x26\x3d\x62\x5a\x6a\xfc\xa4\xe6\x4e\x36\x44\x08\x53\x9d\xcc\x9d\x2c\xb9\xd8\x48\xd1\xd1\xc4\x65\xde\xac\xc7\xa3\x44\x6c\xcf\x23\x91\x44\x4d\x9c\x53\xaa\xa2\xde\x0d\x21\x12\xb2\x86\x55\x32\x3e\x23\x86\x5d\xcf\x94\x2a\x33\x09\x44\x74\xca\x6e\x91\x85\x9b\x5f\x66\x43\xe5\xec\x8c\x74\xf3\xfc\x98\xca\x39\x31\xe5\x57\xb4\xa4\x52\xb4\x67\x2d\xa9\x44\x6c\x59\xa2\x80\x10\xc3\x32\xd4\xec\xd3\x6e\xa6\x11\x59\x53\x59\xd6\x32\x32\xaa\x22\xd2\xdf\x45\x09\x4c\x76\x6d\xfd\xe5\xdd\x02\x87\xec\x2b\xe7\xb5\x43\x7a\x7f\x88\x26\x6f\x17\x66\xd8\x1a\x2d\x46\xe7\x2d\xe9\xe7\xc4\xfe\xca\xae\x6f\x53\x58\xb1\x17\x90\xaa\x57\x11\x56\x70\xcd\x48\x58\xb1\xb7\xf3\x68\xe7\xfe\xef\x65\xe6\x84\x6b\x4b\xd6\xd8\x03\x39\xa8\x76\x85\x06\x31\x55\xd7\x13\x3a\x36\xf5\x6d\x35\x7f\xfe\x91\xcc\x8a\x56\xd8\xc7\xf8\x82\x6f\x9a\x76\x45\x42\x44\xf1\xd4\xae\x68\x38\xb3\x4c\x2c\xb4\x82\x37\xb8\x9a\x09\xce\x87\x32\xb8\x58\xc9\x2f\xf8\x08\xf0\x2d\x86\x6d\xeb\xb5\xd9\x52\xb9\x21\xd8\x59\xcf\xd0\xe6\xf7\x58\x89\x95\xac\xdb\x95\x16\xeb\x9a\x1b\xab\xa3\xde\x88\x48\xb9\x66\x16\x22\x26\xeb\x7c\x4e\xf8\x12\xdd\x62\x8e\xcb\xf9\x05\xe6\x91\xc8\x01\xfd\x5c\x34\xd0\x56\xe3\xc2\xa9\x4e\x4f\x47\x9a\x50\xa3\x61\x90\xb0\x7c\xc3\xde\x65\xcb\x12\x49\x96\x28\xc5\x12\x46\xe8\x62\xb4\xc9\x18\xf0\x28\x3f\x7e\x4d\x41\x32\xe0\x0e\x97\x66\x28\xe0\x8e\x5c\x4c\x6c\xe9\xb6\xee\x38\xdc\x52\xfe\x98\x1d\xbc\xcc\x00\x2f\xa6\xf2\x0f\xff\x8f\x36\xb1\x59\x82\x29\x3c\x99\xd4\x54\xd7\xad\x27\xe0\x70\x36\x2d\x06\xcd\x5d\x55\x51\xc7\xd7\x93\xf3\xbe\x69\xd1\xc3\xfd\xc1\x9a\x36\xab\x56\x23\x41\xe9\xb7\x9f\x04\xa5\x1f\x5b\x50\xba\x4c\x49\xb6\xf3\xb6\x38\x5e\x60\x09\x13\xdf\x3f\xf2\xf0\x4c\x94\x70\x72\x40\x89\x6c\x02\xa8\x12\x8e\xd3\x0c\x3a\x2d\x66\x4f\x4f\x4e\x90\x49\x0b\xda\x68\x2d\xa6\x82\x4a\x28\x60\xc2\x74\x6c\x1f\xa3\x6c\x1d\xd0\x6f\xdc\x48\xa2\x8c\x0d\xbc\x4a\x16\x87\xd9\x61\x59\xdf\xaf\x46\xa3\x7c\x5a\x8b\x0e\x2b\x7f\x93\x97\x23\x92\x44\x88\xbb\xa4\x5b\x96\x8c\x43\xd6\x30\x0b\x72\xec\x2a\x61\x5b\xa9\x7a\xcf\x09\x11\x71\x1d\x00\xbf\x9d\xdb\xb7\x8d\xed\x14\x0c\x8f\xd2\x88\x8d\xb3\x73\x58\xa5\xd3\xbe\x77\x7f\x80\xe6\x8f\xcf\xaa\xd9\xcd\x13\x3c\x9d\x1c\xb3\x94\x7a\xac\x68\x09\x6a\x72\x8e\xd0\xbd\x15\xca\x9d\x09\x6b\x00\x0b\x1d\x53\x3f\x94\x87\x98\x29\x76\xb9\x75\x36\x79\xe4\xdf\xbc\xb6\x68\xd6\x00\x1d\xf2\x07\xfa\xc9\xef\x19\x25\x0a\xd2\xf1\x95\x89\x13\x75\x35\x50\xb6\x69\x1b\xf3\x5f\xf9\xf9\xae\xe1\x0d\x7f\x2e\xf8\x9e\x31\x06\x0d\x52\x97\xa6\xe9\xa7\x7d\x93\x67\x0c\xa0\x5f\x0a\xe7\xbd\xbb\x63\x1d\x2c\x8e\xf3\xf9\xf1\x59\x46\x5e\xab\xa5\x70\x51\xbb\x3b\x9d\x5a\x2e\x30\x9c\xf7\xf6\xb3\x5d\xe7\x3f\x2b\x30\x0f\x27\x83\x92\x4b\x0b\x98\x67\xf9\x51\xb5\x98\xbb\xec\xd5\xfe\xfe\xe3\x65\xc3\x5e\xcf\xf3\xd9\x10\x95\x65\x78\x21\xe2\xef\x9e\x50\xbd\x64\x22\xc9\x2e\xb6\x6c\x08\x97\x51\x8e\xe7\x6a\x71\x7a\x06\x97\x66\x07\xe5\x07\xe7\xf9\x85\x6b\xc2\x71\x32\x3b\x1c\x5e\x8c\x93\x7d\xd7\x1c\x62\x0e\x50\x5a\xe1\x48\x57\xea\x7a\xc2\x13\x2a\xe7\xce\xca\xce\xb5\x4e\x3d\x8e\x2a\xb8\x9e\xd5\x4e\x2f\x2b\x26\x12\x16\x38\x27\x19\x22\x46\xcd\x94\xd0\x90\xe3\x22\x9f\x60\xbc\x26\x39\x47\x0e\x8a\x90\x19\xa2\x40\x0e\x34\x0c\xe8\x64\x7e\x8e\x29\xec\xc9\xa1\xf8\xbc\xc2\x95\xab\x3d\xba\x60\x91\x1d\x60\x08\x9f\x1a\x1e\x06\x4c\xdf\xd4\x31\xc2\x87\x1a\x36\x70\x87\x96\x55\x3b\x0c\x01\x1c\xa1\x2e\x16\xbb\xb1\x5e\x58\xc3\x80\xf5\xdd\xcb\xbb\x91\x70\xee\xb9\xdc\xe9\xae\x80\xf0\x64\xf4\x9e\x8d\x2d\x6d\xf1\x47\x24\xbe\x30\x02\x23\x2a\xd7\xc7\x75\x57\x91\x0b\x05\xb9\xba\x99\x3d\x58\x20\xc1\x86\x20\xe8\x07\xc4\xdb\x8b\x28\x96\x34\xbf\x7c\xba\x70\x75\x11\x52\x8e\xa0\x5f\xca\x6f\x4e\xbc\xaf\x1f\x8f\x8c\x00\x77\x73\x6f\x9e\xcf\xe6\x8d\xce\x87\xda\x13\x0f\xd7\x15\xec\x63\x27\xfb\x95\xac\x2c\xa2\x2c\x5e\xa9\xb0\x10\xac\xe0\xce\x64\xf8\xac\x2a\x31\x69\x15\xfc\xda\xaf\xe8\x7d\xa7\x17\xf6\xc2\xcc\x14\x2d\x05\x7e\x76\xc8\xd5\x37\x14\xac\x01\x17\x05\xe0\x71\x05\x6d\xb5\x2f\xa2\xf5\xbc\xbb\xb1\x11\x39\xc2\x50\xe9\x81\xad\xc4\x4c\x26\xb4\x38\xf0\xcd\x6e\x90\xe3\x4a\x53\x84\xbc\x14\x9e\x7e\x6c\x03\xa8\xc7\x74\x54\x56\x03\xd5\x79\x39\x19\x56\xe7\x48\xf4\x79\xfc\x0d\x58\x2a\xf1\xba\xbb\xe9\x04\xb8\xd7\x7c\x0b\xff\xf9\x8f\xd9\x5d\x82\x81\xfb\xec\x42\x09\x98\xed\x56\xab\x86\x43\x06\x62\xf1\xa4\x69\xc6\xbf\xbe\x1b\x14\xf4\xcb\x1f\x15\x55\xec\x29\xc0\xe5\xd0\xad\x2d\xe9\xde\x06\xc5\x12\x4d\x06\xf8\x58\xca\x4a\xfa\xc6\xe6\xf9\x82\x05\xa2\x97\xdb\xf3\xee\xad\x4d\x3d\x2d\xbb\x26\xa4\xa1\xbf\x92\x54\xbe\xd2\xbc\x98\x02\x54\x6a\x2f\x27\xb2\x8e\x75\x1b\xd0\x6f\xbf\x82\x59\x64\x88\xc9\x29\xd0\x2e\x18\x70\x67\x78\x83\x6e\x88\xc5\x2e\xd4\x11\x67\x43\xb9\x4c\xd9\x91\xa4\x76\x5d\xb8\xf6\xd1\xb0\xd1\xdc\x86\x46\x82\x1b\x6e\x50\x2f\xf9\xc5\x02\x79\x62\x07\x92\x1f\xdc\x21\xf0\x87\x93\xc0\xc9\x21\xa9\xe4\x30\x7f\xcc\x6e\x01\x9f\x64\xb7\xa7\x3f\x87\x33\x8f\x92\xc7\xee\xa6\x45\x62\xd8\xde\xbc\x18\x4f\x75\x0b\x83\x2a\xc7\x28\xb2\x31\x48\xd2\x15\x14\x54\x8b\x83\x16\x0a\xa9\xf6\x68\xc7\x96\x42\xb4\xd3\x0d\xda\xa4\xd3\x8e\x95\x72\xb8\x65\x66\xbd\xac\xf9\x51\x08\x07\x37\xbc\xb2\xde\xd7\x16\x97\xee\x83\xe9\x37\xec\x23\xf5\xd5\x6e\x85\xff\x04\x48\xa7\xb5\x9a\x45\x48\x11\xa2\xa4\xd1\x24\x06\xc9\xbb\xe0\x9b\x48\x6c\x81\xc3\xa1\x8a\x3d\x01\x6f\x9a\xfd\x75\x17\x4d\x31\x47\xd2\xb1\x95\xd0\x50\xea\x42\x61\x77\x48\xe5\xe1\xa3\xee\xab\xbb\x24\x1b\x37\x5f\x58\x14\xf7\x8c\x50\x7d\x2b\xa5\xd7\x52\x09\x37\xba\x85\x04\xbc\xeb\x36\xf2\x27\x19\x26\x0e\x28\x6c\xc1\x1d\xef\xd6\x6b\xc2\xd4\xfe\x91\x16\x4c\x6e\x0e\x73\x67\x04\x45\x78\x35\xe9\x22\x59\x7d\x85\xfc\x07\x7e\xe2\xe5\x89\x83\x37\xd7\x49\x14\xde\x57\xa8\x9f\x58\xfb\x1d\x51\x29\x3d\x2d\xe7\x6f\x96\x59\xbc\x0b\x2d\x94\x48\x7c\xcd\x3b\x08\xeb\xe1\x34\xdc\x3d\x23\x29\x69\xa5\x9b\x3e\x41\x0f\x7a\x9d\x38\x99\x7c\x67\xd3\xae\x1d\x4a\x20\xa4\x28\x3d\xdf\xd5\x15\x53\x98\xbb\xbb\x11\x08\xb1\x82\xc2\xd9\x0f\xb6\x9f\xb6\x76\x69\x74\xbe\xd5\x46\x77\x81\xd0\x68\xe5\xa0\xa2\x56\xe9\x5e\xa4\x25\x5c\x46\xed\xf8\x02\x0c\xbf\x1d\x47\xb5\x22\x99\x83\xaf\x4c\xb1\x76\x82\x68\x26\x84\x90\x6d\x10\x61\x3b\x68\x0e\x87\x79\x23\xd1\x28\x89\x8e\x37\x2d\xa8\xed\x4e\x94\x3a\x47\xdb\x7c\xb8\x81\x54\x17\xd8\x53\x2a\x51\x4d\x03\x8f\x2a\x40\xe7\xca\x30\xe0\xf5\xa8\x67\xda\x6b\x1c\xac\x7e\x06\x33\xef\x0e\x90\x2d\xbc\xf5\x85\x36\x51\x27\xf9\x4d\xbe\xfb\x24\x55\x97\xb5\xf1\x57\x9f\xf4\x43\x58\x46\x98\xd0\x21\x10\xfb\x18\xc1\x53\x9c\xb5\x84\xf4\xe7\xb0\xbb\xe8\xbf\x52\xba\x99\xec\xee\xf4\x98\x45\xc1\xc6\xa6\x55\x5d\x97\x47\xa3\x42\x82\xfb\x00\x9f\x74\x0a\x67\x06\x93\xc7\x90\x32\x8e\xc1\x1b\x18\x0b\x9d\x8d\xb9\xdf\x80\xc5\x58\xd4\x3d\xa7\x14\xdd\xdd\xc1\x36\x30\x8f\x6e\x49\x21\x43\xc5\xd5\x6c\x2e\x39\x74\x61\xed\x90\x21\xc3\x94\x61\xdc\x66\xb5\x98\x25\xd6\xe5\x43\x9f\xed\x26\xc1\x18\x9d\x6f\x22\xfc\x12\x74\x61\x48\xe4\x05\xf4\xdd\x0a\x42\xd3\x9f\xfd\x91\x5e\xf2\xd8\xef\x41\x5a\x26\xd1\xdd\x7c\x19\xdd\x26\x7a\xbe\x1e\xe7\xf3\xb3\xfe\xb8\x9c\x84\x07\xba\x27\xad\x6e\x86\x97\xcf\x6a\x9c\x92\xfd\xe8\xe4\xb5\xfe\x14\x0f\x9a\xbd\x40\x55\xd3\x87\x90\x7e\x3b\xd9\xed\xdb\xb8\x9d\x75\x83\x59\x65\xf8\x54\x3e\x5b\x4f\x03\x05\x5a\x20\xb8\x14\xb0\x14\xb2\xef\xe1\xa8\x9c\x26\x60\xa9\xee\x19\xbe\x0b\x89\x4a\x61\x67\xd1\x6d\x6c\x24\x4c\x58\xbf\x41\xa5\xf7\xa5\x07\x20\xec\x15\xd7\x19\x1c\xa7\xa4\x11\x2c\x4e\x84\xde\x0c\xc2\xd2\xb5\xc6\x82\xe1\x1e\xe3\x07\x0c\xdc\x5a\xa0\x64\xa9\x55\x26\xe5\x22\xaf\x2b\x2a\x91\x1d\x59\xbb\x26\x0e\xd8\x5d\x0c\xb6\x53\x98\x94\x6b\x27\x10\x7c\xaf\xa4\x08\x0c\x92\x64\x54\x6a\x9a\xed\x9b\xf1\xca\x9b\xca\xdf\xf2\x96\x7a\xe5\x6c\x0d\xdb\xa3\x11\xb5\x5c\x77\x55\x53\xe7\xc6\x19\xae\x76\x40\x2d\x0f\x99\x1f\xed\x7a\x64\x1c\x16\xe0\x7d\xeb\xba\xf9\xf5\xdd\x5a\xa4\xc6\x14\x69\x2c\xec\x0d\xb0\x6e\x13\x2b\x47\xe7\x4c\x18\x70\x89\x01\xce\x1d\x49\x00\x2b\x8d\xe4\x69\x4a\xb0\xd9\x07\x60\x7d\x51\x63\x5a\x7d\x4e\xc1\xde\x71\x7d\x74\x10\xdb\xba\xf0\xe6\xf4\xf1\x5a\xb7\x63\x71\x04\x95\x60\xdc\xb1\xb9\xb1\x69\x9d\x10\xac\x24\x36\xbb\x27\xa6\x8d\x51\x08\xed\x26\xef\x2c\x31\xad\x51\xc9\xc1\xe3\x1e\x84\xb3\xf8\x31\x90\xc6\xc0\xb1\x8f\x79\xe9\x30\xee\xf7\x7a\x58\x38\x95\x42\xc1\xe1\x61\x19\x51\xdd\x3e\xa2\x3a\x1c\x51\x8c\xac\x97\xa7\xcc\xdd\xf3\xc2\x22\x8d\x28\x96\x92\x3d\x0f\xb6\xbe\x24\x3d\x44\xbb\x50\x79\x70\xe7\xeb\xaf\x7b\xed\x12\x63\xf8\xfc\x2d\xe9\x22\xbe\xfb\xa4\x8b\xf8\x78\xba\x08\xde\x09\xd1\x28\x51\xc1\x65\xb9\xed\x12\xaa\x8a\x0f\x92\x43\x6e\x49\x5a\xe3\xec\x1e\xb1\x39\x91\xf1\xf5\x92\x34\xc8\xb6\x5d\x9b\x5d\x2c\x61\x69\x6d\x3f\x5f\x3d\xda\xd6\x92\x54\xc9\x61\xed\x65\x39\x95\x8d\x9e\x84\x92\x52\xb0\x1e\xe2\x4d\x59\x8d\x98\x1a\x3c\xae\x16\xa8\xcf\x85\x9e\x17\xe3\xa9\xb1\x63\x62\xe7\x55\x0c\xfa\x58\x8b\x6c\xdd\x47\x02\x18\xc8\x9e\x03\xe5\xfd\x2b\xfa\x0e\x51\xa8\x10\x32\xf4\xc2\x1e\x80\x92\x67\x83\x26\x98\x3d\x30\xac\xc3\x7f\xc2\x69\x41\x1b\x31\xdf\x3b\x0a\x98\xc6\xc5\xec\x94\x0f\x09\x36\x63\x86\x06\x60\x28\x79\xf2\x78\x35\x30\xb8\x92\x8c\x86\xa0\x7d\xf7\x41\x70\xb2\xbc\x11\x5a\xe9\xf3\xc6\x9d\xcf\x72\x97\x35\x00\xc1\xd6\xc9\xd7\xd1\x89\x1d\x67\x47\xd1\xa9\x10\xe0\xe9\x00\x9e\x56\x4a\x81\x13\x6c\x03\x64\x57\x93\xe3\x72\x54\xb2\x59\x36\xcb\xef\xc9\x71\x53\x4d\x74\xb5\x3d\x37\x12\x49\xce\xfa\xa6\xa8\xe7\x25\x06\x5a\xc0\x64\x16\x88\x08\x78\x59\x78\xf4\x26\x92\x82\x9c\x24\xbc\x6f\xd8\xca\xc9\x4d\xdf\x1d\xa7\x63\x72\x0b\x68\x3f\x45\x7c\xf1\xd6\x11\x78\x6f\x84\xf9\x11\x22\x9b\xa8\xa0\x15\x94\x26\x7b\xbb\x0e\x67\xd3\x81\xbe\x53\xbc\xae\x13\x58\xc0\x05\x9e\x71\xe2\x81\x4a\xd2\x58\x9d\xf2\x3d\x88\xdf\x59\x5a\x34\xba\xe0\x45\x3f\xba\x00\x28\x80\x23\xdd\x27\x5c\x2f\x06\x42\xc9\x7e\x4d\x92\xf8\x28\xb5\x5e\x60\x92\x8c\x75\x2e\x69\x61\xe4\x63\x23\xeb\x83\x1b\xa1\x31\x2e\xb0\xc1\x5e\x5c\xd2\x5c\xcd\x13\x08\xd4\x15\x32\x42\x02\x4d\x04\x72\x3c\x44\xf2\x16\xef\x11\x13\x95\x07\xae\x0d\xc6\x18\x40\xe6\xeb\x7d\x30\xb0\xab\xbb\xa6\x00\x83\x1b\xb5\x2a\xb6\xa3\x5c\x42\xc7\xf2\xcc\x25\xed\x32\x95\x92\x99\xff\xf5\x23\x1d\xab\x5d\x00\xd0\xb7\x68\x70\xea\x4d\x94\xdc\x82\xdd\x27\x7a\x91\x99\x4d\x49\x95\xc1\x96\x78\x65\xed\x41\x4a\xf4\x47\x13\xb9\x7a\x70\x92\xb8\x94\xd0\x2c\x81\x32\xea\xa4\xb8\x35\xb4\xbd\x3b\x81\x06\x17\x33\x0a\x09\x51\x97\x74\x1a\x59\x08\xe7\x0e\x77\x90\xd3\x26\xdc\x36\x4d\xd4\x82\x73\x82\xf9\x20\x70\xfb\xec\x39\x74\x74\x69\x38\x89\xbd\x7e\x2e\x07\xae\xd8\x87\xcb\xa9\x66\x3b\xc4\xff\xd0\x97\x3d\xbc\x4a\x67\xcf\xc9\x98\x0d\x57\xd7\x7f\x07\xd8\xf0\x0f\xd2\xa6\x0a\xab\x74\x24\x8f\x5b\xd7\xa4\x0d\xa6\x68\xc9\x1d\xa8\x1a\xc0\xe2\x49\xf5\x6c\xa7\x92\x38\xc7\x03\x5c\x62\x4b\xb9\x9a\x37\x6b\x61\x4c\x3d\x14\x28\x59\x82\xb7\xbb\x31\x50\x59\xa2\xdd\x0c\xa2\xcf\x86\x7e\x24\x35\x81\xab\xf4\x71\x90\xd4\x84\xe0\xee\x09\x6a\x49\x11\xee\xcf\x8b\xce\x90\x31\x23\x3b\xc8\x63\x08\x8c\xc3\x7a\x9a\x4f\x0e\x8d\xfd\x66\x5e\xe3\x0d\x40\x46\x41\x43\xc4\xfb\x98\xe5\xed\x68\x31\xf7\xcd\xd5\x14\xd3\xd8\xbb\xd8\xd7\xe5\x7c\xc1\x78\xf2\x9c\x34\xb8\x8c\xeb\x38\x8a\xc7\x1c\x43\x06\x43\x13\x33\xe2\x33\x60\x78\x40\x71\x00\x03\xb2\x69\xa2\x91\x28\xa3\x88\x06\x57\x2e\x40\x08\x29\x2f\x71\x89\xf2\x9a\x4d\x5f\xd5\x3e\x49\xbe\x9b\x55\x0c\xcc\x76\xe4\xb3\x3a\x5d\x74\xbe\xc7\xd9\xa1\xdf\x63\x4b\x1c\x21\xe6\xb7\x78\xcd\x60\xe9\x25\x38\xd5\xee\x03\x0a\xae\xf1\x83\xf5\x97\xb4\xfb\xf6\x85\x6b\xfe\x26\xb6\xff\x03\xfb\x4a\x6e\x26\xce\xa7\xba\x60\xcd\xc3\x8b\x0a\x70\xa5\xcf\xd5\xa8\x53\x5d\x72\xb0\x0c\x3e\x9c\xc0\xff\x69\x10\xa8\x37\xc7\x87\xa0\xf2\x9a\x47\x2b\x75\x74\x1a\x27\x01\x2e\xc1\xa2\x7c\x53\xa4\xce\x82\x0e\x22\x38\x0d\xd6\xfd\xc7\x8d\x12\x0d\xee\x52\xe8\x33\x36\xfa\x6b\x20\x57\x6d\x41\x79\x3e\x0a\xff\x03\xcf\x7b\x0d\x24\x1b\x97\xd4\xfe\x4d\x49\x3f\x0a\x73\x9c\x42\xb3\x39\xbe\x28\xf6\xc8\x12\x40\x42\x53\x89\xf5\x97\x18\xbd\x6a\x64\x6b\x00\x1e\x34\x3b\xd0\xc0\x0c\x4f\x34\x7e\x95\x6d\x0c\xca\xde\xac\xd4\xbc\xdb\xdf\xb7\x80\x6c\x87\x4c\x18\xc1\x8a\x2d\x72\x8d\xd1\x44\x87\xcf\x39\x2d\x1c\x5f\x10\x45\x60\x9b\xa3\x98\x0f\xd6\xd8\x1e\x2d\x85\xbd\x04\x28\x71\xfb\x84\xf3\xf7\x3e\x03\x0d\x9a\x34\x95\x10\xb7\x99\x26\x8c\x52\x1c\x1a\x89\x53\x8c\xe7\x6c\xe0\x8e\xb0\x6b\xf7\xa1\xd5\x4a\x70\x31\x69\x45\xb9\xba\x45\xab\x08\xf2\xbe\xb4\xb1\xfb\xe0\xe1\xac\x1a\x9b\x0f\xdd\x78\xa0\xeb\xb9\x1b\x07\xd4\x8a\xe3\x49\x97\x07\xb6\x58\x62\x55\xb7\x8c\x95\x18\x6c\x7d\xbd\xd5\x4b\x32\x0b\x83\xad\x6f\xc8\xc4\x6e\x19\x69\x3f\xb8\xf3\xd5\x97\xc8\xd0\x7e\x7b\xeb\x53\x4c\x8a\x3f\x01\x97\x0b\x5c\x4d\xfe\x01\x9d\x93\x3f\x45\xc1\xfe\x78\xce\xcd\x57\x8a\x6d\xbd\x56\xf4\x8e\xb9\x00\xc4\x0a\x5f\x69\x2d\x16\x7a\x4b\xff\xf1\x81\xae\xb3\xef\x75\x64\x6b\x86\xba\x76\x61\xac\xf3\x09\xa9\xc9\x62\xcf\x2e\xc2\x0f\x81\xa9\x1c\x51\x3e\x18\x95\x49\x8e\x2c\xf2\x0b\xa8\x56\x3a\x2a\x38\x9c\x92\xc6\x97\x24\xaf\xa5\x7a\xa1\x0e\x65\x78\x35\x3f\xbb\xff\x60\x7b\x7f\xdb\x05\x90\xfb\x70\xce\x5b\x3e\x08\x36\x29\xc0\xde\x21\xec\xb5\x19\xc0\xfb\x04\xbe\xc6\xd6\xb0\xc6\x95\x02\x5f\xbf\x9b\xab\x56\xf1\x41\xe2\x5f\x27\x22\x5b\x7b\xef\xbb\x26\x40\x20\xa8\xba\xa4\xc1\xbd\x4c\xc6\xe4\xb2\x51\x6a\x1a\xd5\xee\x10\xc5\x28\xa8\x85\x1f\x6e\x36\x5d\xbc\xf6\xa3\x33\x76\x15\x27\x2f\xad\x1b\xb9\x79\xed\xef\xfc\xf7\xfe\xf6\xf3\x9d\xed\xff\x31\xf1\xac\xd7\x0d\x75\xd3\x58\x5a\x0c\x78\xe3\xce\xb8\x77\xf1\x72\xe5\xee\xa5\x3c\xae\xbc\xa3\x85\x2b\xd7\xf0\x65\x79\x87\xc0\x39\xef\x13\x3a\x27\x0b\xc3\x72\x13\x63\xb6\x6e\xa0\x1c\x13\x1c\x47\xf1\x58\x14\x97\xcf\x4d\xb3\x0a\x96\x2b\x8c\xc8\x67\x02\xe4\xf8\x38\x85\xef\x13\x50\x2f\x04\x80\x46\x1c\x20\x40\x33\x17\xd5\x82\xf1\x4b\xc3\x2f\xa9\x9a\x04\xd8\xbb\x87\x3c\x07\x59\x07\xe0\x45\xec\x30\xa6\x8d\xef\xe3\x07\x90\xea\x77\x33\x70\xfd\x0e\xe3\x20\x38\x47\xbc\x77\xda\xca\x64\x24\x41\x37\x42\x51\xb8\x7f\x7f\x2f\xbb\x1d\xec\xad\xb9\x98\x90\x94\xa3\xb8\xa2\x6c\xb4\x3d\xe7\xb4\x45\xe8\xdb\xc8\xd9\x7f\xdb\xe2\x26\xa6\xfa\xb0\x51\x04\xcd\x19\xd0\x9f\x07\xb7\x5e\xfa\x0d\xde\x48\xed\x12\x73\xa3\xe1\x41\xf1\xfe\xd8\xc9\x95\x75\x8b\xd6\x68\xc9\x56\xbf\xb2\x8b\x5d\x14\xe2\x1e\x30\xc4\xaf\x48\xce\xbe\x51\x97\x4e\xc2\x3f\xd2\xa4\xca\xc3\x0f\x1b\x1c\xc8\xa1\x33\x04\xe0\x2b\xc1\xb7\x76\x38\xf7\xdc\xc8\x61\xd6\x5d\x4c\x5c\x10\x67\x11\x0e\x9d\xeb\x35\x22\xbe\x79\x7d\x5f\x77\xbf\x31\x02\xa1\xc7\xf3\x0c\x58\x8d\x51\x81\x3b\x3a\x53\xf7\x0c\x19\x5c\x07\x23\x94\x5d\x90\x9d\x8b\x6f\x88\x28\x19\xcd\x1c\x9d\xdb\xe4\xe4\x59\x1c\x9b\x9f\x36\xa6\xdb\x16\x6d\x3e\xf0\xac\xe3\x65\xf7\x92\x9c\x3f\xce\x8b\xf6\xdd\x4f\x91\xdc\x14\x3e\xeb\xec\x9e\xc9\xbb\x1a\x63\x93\xce\x61\x4b\xc1\x43\x6f\xa4\x44\x89\xbf\x6a\x62\xd6\x52\x58\x30\x3c\x5b\x6b\xf5\xbe\x99\x4c\x41\x10\x66\x18\xf0\x9f\xdf\xb4\xbc\x5f\x27\x04\x3f\xec\xd3\x36\x7b\x6f\x50\x94\x72\x3d\xd8\x42\x46\x11\x8f\xc7\xe1\x7a\xd1\x3c\x6c\x77\xe7\xbb\xd8\xdc\x59\x7d\x06\x7c\x04\x09\x38\x71\xc4\xfc\xce\xc9\x03\x34\x38\x0a\xe8\xa5\x41\xbb\x2e\x4e\xa0\x2a\xcd\x94\x05\x0b\x3c\x99\x9b\xf9\x0d\x5a\xd2\x00\xbc\x5f\xb0\xfb\x0f\xe5\x9b\xbb\x6e\x94\xec\x4f\xe1\xe3\xff\xcc\xbe\xad\xf8\xff\x2b\x06\x5f\x37\x70\x7c\x55\x47\x55\x25\xb1\xff\x1f\x0f\x2a\xbb\x2a\x82\xec\xaa\x18\x82\xdf\xde\xfe\x64\x8e\xf2\xb1\x04\x75\x7c\xd1\xfc\x84\xfe\x86\xb0\x21\x7b\x73\x00\xa5\xe2\xb4\xdd\xf4\x64\x7d\x51\x13\x96\x36\x1a\x96\xb0\xb0\xf9\xf0\x0e\x46\x20\xc8\x50\x3f\x54\xc9\x50\x68\xf6\x61\x3f\xb9\x96\x9f\xef\xec\xed\xec\xbf\xfa\x69\x7b\xff\xfe\x2f\x3b\x0f\x5e\xbd\x78\xf6\x00\xd6\x6c\x4f\xcc\xcf\x3c\xc7\x3e\x08\x1b\x46\x7a\xe0\x78\x54\xd5\x29\x96\x74\xd9\xd2\xf5\xd1\xd0\x9f\x5f\xf9\x75\xf2\x11\x35\xc8\x18\x00\x07\xf5\xf0\xd1\x8b\xbd\x5f\xde\x63\x50\x01\xd6\x3a\x19\x2d\xea\x33\xea\xb6\x18\xea\xbb\xa3\x72\x32\xec\xda\x52\x9b\xae\xef\xfd\xe7\xdb\x4f\xf6\xb6\xef\x63\xb0\xd9\x57\xbf\x3e\xdf\x7e\xf6\x6c\xe7\x39\x76\x7d\x90\x1c\x53\x2f\xbd\x7e\x2f\xad\x78\x6e\xd9\x82\x98\xbd\x96\x05\xa4\xbb\x72\x56\xf8\x59\x06\x45\xc8\x42\x5d\x28\xc1\x8d\xe5\x6b\x6d\xea\x19\x1b\x0a\xa8\x64\x3f\xb0\x20\x02\x5e\xf2\xde\xa1\x29\x9c\xff\xfa\xeb\x2c\x9f\x4e\x31\x77\x47\x73\x93\x1d\x96\x4f\xad\x96\x35\xac\x74\x02\xce\x00\xda\xd1\x59\x75\xed\x65\x09\x6c\x24\xd3\xe5\x15\x34\x62\xe8\x1a\x28\xb7\x6f\xd5\xac\xf7\xd1\x66\x5d\x64\x4d\x14\x47\xc8\x47\x52\x24\x25\xb7\xa8\xe9\x35\x7f\x09\x1b\xd5\xe3\x7d\x44\xf2\xb4\x43\x36\xae\x9d\x17\x87\xdc\x1a\xf9\x2e\xcf\x4a\x32\xae\x41\x43\xa5\x23\x06\x34\x60\xb7\x29\x75\x6d\x1e\x18\xf2\x60\xda\x0e\xc7\x22\x21\xfe\x54\x8a\xa4\x1c\x5d\xf4\x9d\x2e\xf5\x28\x80\x55\xb3\xfa\x38\x08\x34\xa1\xee\x65\x79\x2f\x3b\xea\x65\xc7\xc0\xae\x5b\xf2\x21\x1f\xc1\xfd\x39\xbc\x68\x1e\xb1\xab\x9d\x49\x21\x86\xaf\x7c\x90\x39\xe0\xc5\x86\xe1\xdd\xf4\xc6\x38\x9f\x95\xf3\x39\xb9\x19\xe3\x43\x7e\x41\x84\xde\x9b\xaa\x1c\xa2\xa9\xf8\x2c\x27\xe9\xf0\x31\xdf\xd3\x8e\x7e\x49\x4f\xc6\x03\xa0\x2e\x46\xd7\xac\x45\xd2\x6c\xd8\x9a\x3f\x88\x3e\xd6\xac\x24\x67\x44\x69\xb6\xe1\xf0\x51\x0b\xc1\x92\x5e\x17\xa7\xff\x5b\x42\x4c\xc4\x14\x80\xc5\xf7\x83\x3b\x77\x28\xd8\x7c\x88\xab\x07\x77\xbe\xa2\xb0\x18\xdf\x6e\x7d\xd2\xdc\xfd\x09\x08\x82\xdd\xc9\x3f\x57\xc4\xcb\xf8\xa9\x00\x28\x2b\x28\x47\x02\xa5\x34\x7e\x36\x5a\x9c\xc6\x2a\xb1\x74\x19\xbd\xc7\x99\x36\x6f\xad\xdc\xf8\xec\xea\x8d\x4a\x74\xca\x24\x5b\x0e\x34\x4e\x11\x73\x30\x5b\x35\x51\xc2\x29\x11\x79\x82\xa6\xdd\xa7\xa4\x05\x08\xd5\x88\xe9\x42\xda\xc6\x0e\x9a\x86\x3c\x2a\xf2\x37\xed\xa3\x4f\x16\x71\xf5\xdf\x39\xd6\x08\xd6\x46\xb9\x81\xa1\xff\x81\xc7\x3d\x29\x23\xdd\x5b\xb2\x88\xd6\x7f\x5c\x1d\x01\x6c\xec\xe5\x27\x80\x93\x61\xa5\x8e\x5f\xb7\x4e\x62\x59\xc9\x3f\x5c\x3d\xfa\xbb\x19\x30\xb7\xde\xbf\x0d\x5b\xe6\x74\xc9\xf7\x31\x87\xb6\xf5\x7e\xe2\xcc\x2c\xc9\x4a\xfc\x2d\xae\xf1\x10\xf3\x08\x25\xcb\xe3\x97\xb8\x34\x27\x94\x4f\x14\x86\x0f\x8d\xb2\x0f\xda\x34\xee\xa9\x12\x8d\xda\x27\x33\x4e\x54\x96\xaa\x47\xdf\x1a\x35\x24\x1f\x6b\xaa\x02\x7e\x8a\xcb\xbb\x44\x0c\x89\x0a\xfc\x2d\xae\xe1\xa2\x21\x26\x6a\xf0\xb7\xb8\x86\x51\xae\x25\xea\xe8\xd7\x54\xad\x15\x10\x10\x14\x79\x0f\x13\x00\x3a\x9d\x8f\xc8\x68\x2a\x46\x68\xcd\xef\x41\x4d\x87\xee\x13\xb5\xdc\xb7\xa8\x06\x87\x42\xfe\x85\xc4\x3e\x29\x98\x88\x4a\xbc\x63\xca\xee\x94\xb5\x5e\xa2\x62\xaa\x98\xb6\xc3\xbb\xd9\x8a\xe4\x1a\x9f\x7d\x3d\xb6\xb4\x6d\xbf\x67\x52\x25\x5c\x6d\xb4\xdf\x6c\xbf\x1f\x1a\x9f\x5d\xbd\xbf\xfd\xbc\x02\xb9\xa7\x4a\x38\x5e\x57\xac\x29\x80\xe2\x7b\x96\x9f\x16\x2d\x80\xd7\x52\xe8\x7a\x60\x72\x91\x2f\xe6\xd5\xcf\x08\x29\x50\x54\xd8\x24\x56\x21\x23\x93\x15\x84\x4e\x5a\xa2\x6a\x36\x9a\x64\xac\xd6\x9f\x57\x2f\xa8\xa1\xbc\x2e\xba\x62\xf4\xda\xaa\x51\x08\x62\x87\x5b\xa0\x37\x59\x42\x5c\xf0\x4f\xfc\x17\x2a\x05\xd7\x7f\xf2\xba\x06\xd5\x01\x1a\x02\x99\xf9\x51\xc3\x3e\xfd\x93\xfc\xa8\x69\x8c\xe1\xf9\xe8\xd3\x6e\xee\x8c\x91\x0f\x98\xf5\xb9\x60\xf3\xdc\x75\x3d\xe3\x11\xbc\xdf\xd0\xc8\x0d\x8e\x89\xe3\x86\x33\x26\x7e\x39\x4a\x14\x50\xaa\xd5\xe8\x0d\x8a\x8e\xd1\x36\xe4\xac\x84\xcd\x99\x1d\x9f\x5d\x10\x87\x36\x65\x28\x23\x9b\x06\xd5\xfc\x10\xaf\x95\x1a\x25\xc3\xdc\x2f\x8b\x23\x19\x67\x4c\xe9\x74\x5b\x28\x20\x5a\x99\x75\x1a\x0c\x4f\x7f\x37\x85\x11\xd6\x6e\x8b\xb0\x42\xd7\x23\x88\x68\x9d\xf6\x30\xb9\x98\x4f\xda\x49\x02\x5e\x59\x8d\x5a\xd3\x26\x92\x3b\x86\xc6\x7a\xec\x6a\xc4\x23\x8c\x92\xcd\x62\x78\x39\x1c\xdc\x20\xc6\x2e\xdb\x7c\xe7\xf5\x93\x7c\x8f\x02\xfe\x8d\x73\x3e\x68\xbe\x62\x48\x4c\x52\x8c\x83\xf4\x6b\xae\xd1\xa0\x90\x07\xcd\x57\x5c\x72\x19\x21\x37\x58\xfa\x95\xeb\x37\x70\xe4\xa0\xf9\x8a\x4b\xa6\x49\xfe\x41\xcb\x7b\x39\x60\xcd\x45\x7e\x42\x16\x56\xde\x2a\x97\x57\x99\xd0\x51\x79\xec\x5e\x33\x9e\x31\x9c\xbc\xa1\xa6\xdc\x79\x5a\xab\xe5\xe0\x0a\x4e\x34\x1b\x79\x1b\x5d\xa5\x69\x94\xe0\x0b\xfe\xe4\x36\xdb\x10\xab\xc7\x00\xe2\x70\x34\x29\x8a\x61\xcd\x1e\x29\x50\x08\x59\x3d\x5c\xc3\x36\x14\x0f\x38\x89\xec\xa2\xcf\x4b\xb1\xf5\x20\x5b\x1d\x6e\x8e\x9d\x0f\xc8\x40\x89\x8f\x43\xbf\x39\x7a\x46\xe0\x72\xe2\xb0\x6a\xb7\x9d\x64\xbf\xc2\xf4\xc3\x55\x2d\xf4\x5a\xe8\x70\xde\xc1\xce\x20\x22\x77\x19\x8a\x3a\x28\xc1\x30\xdf\x90\x7c\x95\x2f\x25\xd1\x8b\xe6\x1b\x13\x90\xfa\x75\x7c\x6a\x3f\x8d\x4f\xf5\x3d\xa5\xe9\x1f\x84\xf4\xa5\x7c\x93\x8c\x61\x83\x88\x98\x94\xaf\x92\xbb\x65\x10\x11\x8e\xf2\xd5\x59\x2b\x0e\x1a\x64\x62\x8f\xc5\x44\x9d\xb3\xf9\x78\x04\x9f\xdb\x76\x8d\xbf\xcb\x5d\xd8\x39\x2b\xf2\xe1\xd2\xc2\xf8\x5d\x0b\x1f\x55\xc3\x8b\x65\x85\xe9\xfb\x66\xeb\x19\x33\x44\x84\xec\x55\x83\xac\xe8\x26\x19\xc9\x14\xe2\x5e\xa7\xb1\x14\xe1\x92\x1c\xd9\x0e\x8a\x86\x62\x40\x0a\x5f\x76\x3b\x93\xaa\x3e\x9e\x95\xd3\x79\x27\xd9\x84\x4a\xc1\xf5\x1a\x6e\x92\x87\xe6\x80\xa7\x3e\x6f\x08\x19\xb0\xb4\xdd\x98\xf5\xeb\xae\x94\x2a\xb6\xe1\x0e\x47\x3f\xea\xb1\xa1\x4d\x0d\x49\x4b\x6e\x7d\x85\xb7\xbe\xba\x41\xa4\x64\x20\x1a\x4e\x21\x24\x69\x07\x52\x23\x45\xcd\x26\x6b\xb4\xcd\xa1\xb1\x63\xc6\xf1\x60\x15\x0b\xde\x02\x53\x71\x93\x96\xcb\xec\xa6\x58\x4f\x1f\x6f\xe2\x4a\x16\x77\x14\x19\x61\x86\xf9\x2b\xba\x2b\xa3\x21\x68\x58\x14\x95\xe7\xf6\xcf\x66\xc5\xc9\x26\x46\xd5\x53\x33\x25\xec\xbe\x7b\xf3\xe0\xc7\xbf\xbc\x9c\xe1\x10\x5f\xa1\x48\xf6\x1f\x47\x37\x37\xfb\x00\x39\xf3\x2e\xf4\xb3\x19\xda\x11\x58\x80\x79\x06\x65\xdb\x65\x0d\xf8\xf5\xba\xb3\x2d\x88\xbf\x70\x10\x95\x6e\x1c\xf6\xa1\x21\xde\x65\x1d\x13\xae\xe7\x40\xfe\x92\x18\x78\x5d\x9d\x74\x8b\x58\x6f\xb0\xb5\x45\x3a\xe0\xa6\xe0\x6e\xb0\x75\x87\x54\xc6\x49\xb9\x1c\x7c\x24\xc1\x71\x9b\xcc\x0d\xbe\x53\x0c\x83\xb4\x44\x0d\xbe\x7e\xd3\x5b\x15\x20\x21\x2d\x0e\x83\xaf\xd4\xf0\x52\x29\xd7\x60\xeb\xab\x5b\xef\xa9\x23\xbf\x8a\xbb\x8b\xc8\x75\xe0\xf5\x77\xcb\xbd\x60\x02\xc1\x0e\xbc\xbc\xdd\x6b\x93\xc5\xc0\xc7\xa0\x0b\x11\xb8\xc0\xeb\x3b\xbd\x48\xe8\x03\xef\xbe\xec\x35\x44\x2d\xf0\xf6\xab\x5e\x53\x9e\x02\xaf\xbf\xee\x35\x85\x26\xf0\xfa\x9b\x5e\xab\x70\x03\xbe\x7e\x17\x7f\x25\xa9\xc9\x60\xeb\x5b\x33\xaf\x16\xc1\x1a\x14\xba\x1d\x17\xa2\x13\x01\x1f\xee\x2c\xb7\x49\x08\x65\x1f\x83\xad\xef\x7c\x6f\x5e\xc0\x01\xaf\xb7\x7a\x6d\xf2\x0b\xf8\xf8\xe5\xb2\xbc\xb9\x49\x11\xc4\xe0\xce\x6d\xea\x28\xc9\xb3\x0f\xee\xb0\x31\x47\x53\x02\x01\x5f\xbe\xea\xb5\x09\x18\xe0\x23\x2d\x7c\x53\x84\x00\x5f\x68\xed\xdb\xf8\xfb\xc1\x1d\x34\x03\x69\x98\x5b\xdc\xf9\x64\x6e\xf1\x71\xb5\x2b\x08\xb3\xef\x19\xf8\xa3\xd5\xed\x29\x25\xcb\xc6\xfe\xb6\x61\xb2\x17\x75\x99\x94\xde\x36\x4b\xbd\xa3\xb4\xae\xe5\xf2\xd2\x5b\x8b\x0a\x8a\x7e\x12\x8f\xd6\x93\xea\x3c\x2c\x1d\x7e\x0b\xe5\x51\x33\xdc\x87\x87\xa3\x2a\x9f\xa3\x49\x5e\x20\x80\xa2\x30\x5f\x27\xa3\xaa\x9a\xe1\x27\x58\xd8\xdb\xb7\x6e\x6d\x66\x37\xf1\x4f\x28\xbd\x81\x7d\x67\x1b\xbf\xea\xe8\x9f\xbd\xec\x75\x71\x41\xc9\x32\xb8\x2d\x78\x75\x00\x6f\x30\xb7\x58\xd7\xfd\x86\x4b\xfd\xd6\x26\x1b\xbd\xdd\xd5\x08\x4a\x89\xdb\x1a\xeb\xbf\x82\xab\xf3\x71\x91\xa3\x39\x1f\xb9\x0c\x0d\xb2\x83\x97\x3d\x64\xbe\x46\x68\xfe\x57\xce\x8b\xb1\x02\x0c\xa5\x7c\x2b\x39\x48\x81\xf8\xf9\xa2\x8d\x36\xb6\x41\x6e\x9b\x7b\xf3\xfc\xf8\x35\x54\xbf\xf5\x12\x09\xfd\x57\x7c\x43\x17\x43\xab\xe9\x97\xb8\x93\x0d\x99\x19\xc5\x10\x6b\x90\x05\xae\x09\x4f\x76\xb8\x7d\x11\xc2\x0a\xe9\x18\xe1\xfd\x78\x0e\xdd\x46\x2b\x63\xfe\xb0\x19\x38\x98\x37\xfb\x8a\x96\xa1\xef\xe2\xc4\xdd\xba\xbb\x11\xf6\x5c\x4c\x30\x10\xae\x14\xce\x7c\x36\x89\x4b\x99\x62\x35\x6d\xb3\xbd\x49\x56\x8f\xd2\xd6\x9c\x16\xf3\x47\xb0\xf2\xe1\x96\xb4\x25\xe7\x5d\x39\x0d\xdf\xee\x74\x56\x4e\xe6\x3b\x6f\x81\x8f\xae\x81\xdd\x35\x4d\x8e\x4d\x71\x6d\xde\xbe\x83\x21\x06\x8f\x00\x5b\x6b\x75\x2b\x31\xdb\x16\xe3\x31\x1a\x94\xdf\x6b\x3d\xd9\x68\x29\xe9\xc6\xb5\xc7\xc5\xc3\x41\x71\x6b\xe8\x59\x5d\x01\x3d\x38\xc7\xe5\xeb\x4a\xbb\xfd\x31\xda\x3d\xea\x54\x10\x5a\x1b\x62\x58\xef\xd0\xd0\xf1\x72\x65\x0e\xca\x32\x61\x96\x1c\xab\xf5\x83\x84\x9a\xc6\x47\x63\xbf\x9a\xc3\xd9\x24\x01\x04\x0e\x30\xc3\x50\xc7\x59\x77\x5c\x6f\x42\x45\x73\xb6\xa9\x0d\x57\x6a\xd3\x34\xe0\xe6\xc6\x31\x29\x96\x36\x50\xbc\x5d\xda\x00\xcb\x9c\x97\xb6\xc0\x45\x6c\xf5\xc7\xbe\x57\xc0\x53\xe4\x2a\x43\xc9\x20\x57\x0d\x01\x10\x91\x2c\x0c\xca\x2e\x4d\x83\xcf\xcd\x28\xd6\x69\x51\x46\xdd\xd6\x9c\x12\x2c\xb5\xdf\x89\xc5\x44\x1d\xce\x25\x1d\xe3\xa5\x7a\x75\x38\x0f\xff\x65\xd0\x44\x5b\xb6\x0f\xc3\x83\xe3\xe2\x8c\xdf\x4d\x44\x0a\x31\x52\xd6\x06\x27\x8b\xf1\x51\x31\xeb\x87\x27\x65\x77\xf2\xe7\x3c\x29\x6e\x5c\xbf\xef\x49\x79\x7a\x8e\xba\xb8\x1f\xbc\x85\xd4\xaa\x63\xb2\xbb\xd6\x01\xc1\x6f\xef\xbc\xf7\x3a\xad\x51\xe5\xbc\xc6\xe4\x74\x62\xb3\x83\x4e\xaf\x85\xbd\x4c\x83\x46\xb0\x6e\xfd\x79\xf5\xb0\x7c\x5b\x0c\xbb\x5b\x14\x31\x24\x1b\xd7\x8d\x58\x20\x18\x9c\xcf\x54\x91\xe5\x7f\x9c\x4f\x57\x00\xc8\x7b\x6c\xad\xcc\xc7\xb6\xaa\x73\xc4\x3b\xc7\x8f\xd0\x67\x5a\xfb\x28\x7b\xfd\x2b\xdc\x4f\xe8\xb2\x63\x36\xda\xed\xee\x95\x37\x37\xba\xa1\xb8\xed\x8f\x72\xe8\xc2\x63\xd2\xa8\xd4\xba\xe1\xe1\x90\xfe\x14\xc0\x49\x4b\x07\xd4\xf4\x9f\x0c\x59\x21\x7b\xfd\x01\xd1\x14\xfb\x61\xd4\xa8\x0b\xf3\x99\x7a\x33\x79\x75\x60\x45\xb9\xbb\x0f\x5e\x6d\xef\xef\x3f\xdf\xfd\xe9\xc5\xfe\xce\xab\x27\xdb\x8f\x77\x90\x3c\xe6\x2b\x7a\x18\x55\xeb\x20\x33\xd3\x71\xdf\xf1\x29\x2e\x91\xcf\x4e\x6b\x2a\xf1\x5f\x7b\x4f\x9f\xf4\xd9\x09\xa6\x3c\xb9\x60\x94\x86\x1f\x37\xef\x86\x87\x8b\x2b\xfe\xa9\xd0\xd7\x2b\x8c\x85\x37\x1b\xfe\x3a\x2b\x03\x1f\xa4\x72\xd8\xcb\x4e\x26\x9c\x52\x7c\xae\x8d\xf7\x32\x9a\x54\x1c\x7d\xcd\x7d\x97\xfc\xbc\x64\x42\x0b\xdc\xde\xc9\x62\x24\xfe\x82\xa5\x0f\x3a\x4c\x67\x1d\x13\x05\xc1\xf8\x6e\xce\x8a\x13\x8c\x31\xe0\xa0\x07\x8d\x4e\xd1\xf8\xa2\x65\xc6\x0e\x85\x34\x00\xf0\x60\x6d\xba\xfd\x46\x76\xfb\xa5\x6f\x87\x3b\xe4\x7d\xe0\xdf\x07\xe5\x10\x77\xd4\x3c\xc0\x01\x38\x78\x19\x17\xe9\x4f\x17\xf5\x59\xd7\xd9\xab\x02\x70\x0c\x74\xbd\xf4\x5d\x49\x56\x02\x6e\xed\xe4\x35\xae\xe0\x80\xfe\xdf\xc0\x73\xb2\x75\xf6\xac\x12\xaf\xcd\xbb\xa0\xbb\x81\x1f\x23\x6a\xdf\x72\x01\x94\xbf\x98\x2c\x8b\xa1\x8b\x7b\xc0\xb2\xfd\xef\x57\xaf\x6e\xdd\xbb\x85\x7f\x6e\xdf\xd3\xf0\x7e\x2e\x9d\x31\x7e\xfc\x1e\x3f\xd1\x2f\xcc\x69\x8c\xd5\x78\x72\xae\xf0\x01\x7e\x7b\xe9\x60\x99\x6c\xc3\x75\x5a\xf6\xe5\xec\x8d\x7d\x92\xc0\xcd\xf2\x06\x19\x39\x9e\x01\x87\xba\x7e\xc5\xc4\xdf\x93\xe2\x1c\x05\x41\x8e\xfe\xee\xc0\x6a\xbb\xdd\xc9\x32\x5b\x23\xe1\x13\xd0\x89\x62\x3c\x6d\x67\xd7\x0d\xf8\x5f\x97\xf0\x65\x05\xe5\x23\x1f\x17\x28\x7a\xa8\x33\x06\x77\xb4\x20\x87\x85\x02\xa0\x39\xcb\xa8\xe1\x3e\xba\xd0\x9e\xe7\x93\xb9\x6d\x6f\x5e\x65\xa7\x40\xa9\x4c\x59\xfd\x28\x0d\x50\x08\xf5\xec\xb4\xc4\x38\xed\x54\x15\xf3\x42\x72\xaa\x08\x1f\x16\x1b\x78\xf7\xd7\x59\x2e\x71\x26\x7c\x83\xc6\xae\x9c\x0e\x89\x0b\xbc\x80\x06\x0f\x1a\x2f\xb2\xf2\x96\x69\x1c\xb2\x82\x62\x49\x8d\x82\x00\x54\xac\x41\x65\xf7\x58\xcc\xee\x30\x1b\x97\x13\xd6\x92\xe6\xcc\x4c\xc0\x8c\xaf\x9f\xf3\x75\x7c\x5e\xcd\x5e\x5f\x57\x31\x85\x4f\x5f\xb9\x0e\xaf\x1b\x00\x39\xfe\x2b\x3c\x9f\xf8\xdb\xa5\xf5\xda\x2e\x27\x2d\x1f\xd4\x1c\x26\x7c\x4b\x58\xa0\x8e\xdf\xf2\xf1\x8a\xdf\x9a\xf0\x0e\x8d\x6f\x0e\x0e\x07\xd9\x2d\xf7\xfa\xd2\x78\x7a\x6b\xcc\xf0\x50\x12\xd3\x35\x25\x66\x6f\x24\x4e\x66\x9f\xb2\x80\x8a\x5b\x5d\x80\xbd\xd7\x58\xaa\x03\x33\xa8\xab\xe0\x22\x57\xed\x65\xdf\xa3\xd1\xe6\x70\x35\x03\x82\x19\xb6\xdc\x28\xee\xcc\x99\xa4\x12\xc1\x41\xe3\xc8\x59\xe3\xfc\xb4\xd8\x9d\xcc\x2b\xf4\x80\x8c\x0e\x99\x47\x32\x5c\x23\x25\x75\x0f\x4e\xda\x07\x5a\xd3\xf5\xe6\xeb\x8a\xaf\x33\x31\x3b\x4a\xc6\x42\x12\x37\x4c\xe9\x11\xe2\x79\x89\xa6\x7e\x80\xf8\xad\x3e\xb8\xfd\xd2\x8c\x28\xb5\x75\xe6\x7a\xec\x4a\x63\xad\x37\xe3\xc1\x2d\xdb\x5a\xcb\x86\x18\xcf\xe9\x67\x2c\xb8\xbe\x2f\x4e\xcb\x29\xac\xc6\x11\x19\x31\x8e\x0a\xd0\x03\x9c\x0e\xcf\x7c\x93\x4e\x31\xea\xcf\x0e\xa0\x32\x4f\x1f\xb1\xbb\x4a\xd8\x90\xb9\x62\xb7\xa1\x5e\x40\x2a\xf9\x25\x96\x64\xde\x18\xc0\x87\xd5\xa9\xd7\x1a\xc1\x0c\xf4\x9f\x6b\xca\x94\xbe\x97\xc5\x0d\x84\x5d\x5c\xb6\x75\x38\xaf\xd6\xef\x4e\xcb\xba\xce\xe4\xc5\xba\x5d\x79\x97\xee\xf5\xba\x33\xe5\x7d\x97\xfe\xe5\x9a\xdd\x72\xfc\xd6\xf5\x67\x29\xf1\x5e\xef\x65\x02\xa8\x07\xcd\x76\x5e\x2e\xeb\x7a\x39\x2c\x47\xdd\x4a\xdb\x53\x74\x77\x9a\x87\x01\xff\xcc\xe7\xd0\x3e\x91\xff\x35\x28\x9c\xc6\x4c\x82\xf7\xc1\x71\xbb\x6c\x1e\x97\x08\xf4\x8f\xf2\xba\x3c\x6e\x02\xfe\x15\xe6\x26\x67\x24\x1c\x5d\x48\xaa\x2d\x9d\x08\x07\x44\x71\xee\x78\xfd\x1a\xf5\x37\xac\x58\xc6\xa6\x7b\xd9\xed\xcd\x8d\xe4\xf4\x2e\xd7\xc2\xd5\x49\xec\x4b\xf4\x50\x5d\x9a\xd8\x92\x1d\x54\xd4\xfb\x89\x75\x1d\xf1\x1d\x47\xf1\xec\x6e\xfa\xc0\x91\x01\xde\x09\xa3\x30\x06\x77\x80\x2d\x16\xc5\xb4\xc4\x72\x59\x82\x70\xfb\x1b\x06\x27\x43\x8f\x38\x5f\x72\x73\x93\xcc\x00\x02\x84\x2d\x99\x4e\x52\x31\x40\x09\x98\xb8\x4d\xe6\x9c\x22\xbc\x67\x68\xdb\x65\xb7\xc8\xa5\xef\xd0\x86\x30\x20\x94\xbf\x6c\xfa\x3f\x36\xd1\xa8\xb3\x1c\x21\x68\x88\x22\x4b\xde\x0d\xba\x29\x6b\x11\x76\xde\x5b\x73\x71\xe2\xea\xaa\x83\x5a\x32\xc4\xbb\xe1\xcc\xbc\x2a\x25\xc1\x5c\xf7\x8d\xa6\x25\xec\x0a\x5a\x4a\xb2\xe3\xbf\x03\x05\x13\x5d\xd6\xba\x46\xe1\xb6\x3a\x95\x15\x0d\x8c\x45\x3f\xb0\xab\x26\xd6\x28\x1c\xa8\xe4\x25\x2a\x8b\x16\x36\xe7\xa7\xcd\xc4\xea\xad\x34\x68\xfc\x71\x24\xcb\x5a\xab\xc0\x60\x13\xae\x82\xeb\xeb\x0a\xab\xc1\x12\x98\x23\xfa\x22\xc3\xb4\x0b\x54\x4d\xbb\x01\xfa\xf5\xdf\x0e\x4c\x31\xc3\x28\x67\x5f\xdc\x6b\xb2\x7a\x89\xf1\x3b\xb6\xa0\x65\x0a\xb8\x36\x66\x58\x9b\x4b\x9a\x72\x8c\xc4\xda\xab\xb1\x64\x5d\xaf\xd2\x98\xdf\x36\xae\x6b\xd9\x8e\x03\x5f\xfb\xa5\xa8\x47\xf5\x9f\x20\xb5\x81\x8b\x98\x42\xc6\xd2\x9b\xf6\x0e\xa9\x50\x8e\x3a\x48\x23\xc1\x57\xf4\x31\x4a\xf7\xb4\xa4\xa4\xef\x21\xc0\x56\x18\x36\x0b\xc7\xf8\x83\x8f\x88\x75\x69\x00\xb1\xed\x02\xfa\x2d\x2e\xb1\xfc\x00\x48\x68\x5f\x92\x58\xac\x76\xb4\x45\xc4\x91\x0a\xae\x8b\x36\x4e\x77\x52\x66\x2f\x4e\x59\x3f\xd8\xfa\x76\xa9\x69\x0a\xdb\xc8\xdc\xb9\x45\x85\x22\x1d\xfb\xe0\xce\xb7\x5f\x91\x15\xc8\x97\x9f\xac\x40\x3e\xbe\x15\x88\x6e\x21\x9b\x7c\xac\x1d\x06\x63\x03\xd3\x6e\x72\x40\xf9\x19\x79\x9a\x53\x30\xb3\x05\x85\x05\x1a\x01\x87\x84\x82\x90\x49\x76\xbb\xbf\x35\xae\xb3\x6e\x2e\x8a\xb9\x6c\x37\x1b\xe7\x43\x8c\x44\xb6\x29\xd6\x24\x4f\xf6\x5f\xdd\xdf\x7e\xbe\xf3\x6a\xff\x97\xe7\x3b\x7b\xbf\x3c\x7d\x84\x34\x00\x54\x72\xd1\x76\x5f\x3d\x7d\xb6\xf3\x7c\x9b\x02\x1f\xec\xff\xfd\x99\x0b\x4f\x91\x64\x25\x07\x68\x2a\x8d\x41\x14\x25\xb2\x15\x89\x61\x77\x61\x67\x9e\xef\xbf\x7a\xbc\xfd\xfc\xaf\x2f\x9e\x25\x4b\x3c\x7e\xfa\xb7\x9d\x57\x3b\xff\xbd\xbb\xb7\xbf\xfb\xe4\xe7\x01\xde\xe9\x6f\x0a\xfa\xf0\x7c\x87\x3e\xa1\xa1\x26\xbc\xe6\x84\x5d\xf4\x01\x03\x52\xbe\xba\x0f\x63\x87\x2d\x90\x26\x0d\x6f\x41\x45\x84\x28\xd3\x03\x84\xd1\xba\x71\x7c\x12\x82\x2d\x9f\x03\xf9\x74\xb4\x98\x73\x73\x9d\x61\x31\x2a\x9a\x65\xf9\x6d\x5c\x96\x5b\xd8\x43\x80\xac\xa3\x56\x09\x4a\x6b\x5b\xcc\x05\xf9\xd2\x92\xcd\xd9\x5b\xe6\xf6\x79\x01\xe8\x13\xcf\xe4\xb0\xf8\xb5\x9c\x9f\x71\x0c\x7e\xad\x3a\xe3\x8f\x1d\xc2\x22\x36\x67\x74\x8b\x20\xdb\x25\x2e\x11\x9a\x57\x72\x39\x13\x18\x00\x88\xb3\xd8\xac\xfe\x11\xe5\x4a\xa3\x21\xc2\xf7\xb8\xac\x47\x45\x3e\x14\xc7\x21\x57\x53\x1a\xcd\x86\xb0\x3c\x53\x14\x02\xa2\xed\x60\x9d\xe5\x27\x98\x70\x5d\xb3\xc2\x14\x3f\xda\x2a\xa3\xea\x94\x2f\x0c\xd6\x6b\x41\x6f\x24\x35\x74\x85\x9d\xec\x6e\x5e\x4d\x6f\x8c\x8a\x37\xc5\xc8\x8b\xf9\xb8\x1d\xb6\x29\xe0\xac\x34\x1c\xed\xb5\xc0\x6c\x2b\x9a\x3f\xd6\x12\x15\x64\x53\xe2\x44\xb8\x25\xbd\x81\x3f\xdf\x07\x2a\x19\x15\xde\x66\x25\x0a\x6c\xbd\x36\xd1\x94\x89\x94\x38\x07\xa5\x70\x8a\xbe\xaf\x2f\x82\x12\xfd\xe0\x96\x47\x3c\xaf\x6a\x71\xff\xfe\x32\xdc\xa9\x36\x1d\x8e\x4b\xc4\x8a\x5a\x10\xbc\x13\x58\x78\xfe\x3b\x4e\x8a\x5a\x1d\xca\x75\x47\xfd\x94\x84\xda\xec\xfc\x58\xb4\xe8\xa9\xa5\xe6\x37\x92\xea\x37\x04\x29\xf4\xcd\x12\x59\x34\xab\xa6\x60\xb4\xc4\x94\xb8\xc3\x40\x34\x49\x3a\x81\x04\xd6\x39\xa0\x36\x89\xfd\x21\xe5\x82\x7f\xec\x45\x3c\xc9\x40\xbe\xe5\x96\x89\xf6\x3c\xf3\x65\x60\x18\xed\xb6\x8c\x46\xd8\xd8\xae\xe5\x96\x34\x6e\xd3\xe0\x7a\x18\x96\x1a\x1d\x84\xe5\x43\x14\xb0\xd6\x13\x43\xb4\xce\xbf\xf3\x6e\x02\xb7\xb1\xfb\xc0\x44\x50\x94\x09\x7b\xd9\xaf\xdd\x3e\x4f\x7c\x26\x3e\x3a\x0a\x90\xbe\x6d\x5a\x20\x61\xb0\xa1\x00\x32\xd4\x9d\x89\xd6\xe9\x67\x1b\x8e\x32\x24\x0a\x11\x60\x84\x48\x73\xb4\x96\x5f\xbf\x03\x53\x16\x89\xc6\xb6\x2f\x00\x01\x1e\x90\x02\xcd\xfa\xc0\x0e\xc4\xc3\x86\x11\xb5\xdf\xf2\x6f\x8d\x64\xde\xbc\x55\xe9\xbb\x79\x45\x1c\x97\x17\x97\x3b\x11\x20\x09\x23\xcc\x54\xb9\x2a\x4e\xd2\x82\x7f\xcb\x2c\xd4\x96\x27\xc2\x2a\xbe\x8d\x90\x84\x6c\xf6\xe6\x86\xbf\x6e\x87\xde\x1c\x29\xea\x33\x68\x69\x55\xb7\x6e\x2d\xd7\xed\xd6\xdb\x7b\x45\xdd\x06\x2d\xad\xea\x96\xb9\xde\x75\xfb\x64\x95\x69\xd4\x9f\x6f\x22\xa2\xce\x37\x84\x97\xa1\xc4\x40\xe7\x1c\xdb\x33\x07\x5a\x71\x46\xf9\x7e\x50\x98\x25\x19\xc9\x28\xf0\x37\xea\xa3\x6b\xbd\x89\xe0\x6b\x88\xaf\xed\x41\x80\x73\xe2\x07\x68\xed\x33\x57\xef\xd0\x0f\xf7\x52\xc4\x99\x9f\x3a\xf4\xcb\x18\xb5\xa5\xa9\x00\xcf\x6d\x70\x79\x9c\x90\x47\xd3\x18\x0c\x28\x52\x8a\x1e\x99\x01\xdc\xc8\x72\xff\x44\x37\xdc\xa6\xcd\x7d\x0e\xed\x35\xf0\xe5\x52\x7b\xaa\x1e\x45\x25\xbe\x8f\xd1\x6c\x57\xa2\x4e\x07\x18\x7f\x2d\x2e\xfe\x87\xe3\x4e\xed\xe2\x18\x27\xee\x04\x55\xb5\xc9\x5b\x15\x2d\x0b\x41\x75\x58\x38\xa3\x34\xbb\x2f\x26\x1c\xb8\xde\x4b\xc8\x6a\xbb\xc0\xa1\x4d\xee\x0a\x6c\x1d\xf4\x8b\x62\xd2\x6b\x51\x97\x8d\x73\x56\x61\xd2\xbe\x45\xe1\x0f\x8e\xfc\x88\x6e\xba\x15\xb8\xdf\xe1\x7c\xcc\xb9\x1c\x5a\xb9\x49\x72\x02\xb1\x81\xc0\xf1\x8f\x31\xf7\x9a\x51\xff\xaa\xcb\xf6\xeb\x49\x75\x8e\x3e\xdb\x94\x5a\xcb\xb7\x47\xd9\x0b\x31\x36\x19\xdb\x50\xce\x4b\x8a\x39\x9b\xed\x91\x82\x39\x3f\x3d\x9d\x15\x94\x83\x30\xb2\x3e\xa5\x73\x4d\xb9\xcd\xbd\xde\x19\xd3\x0b\x91\x88\x01\xc9\x54\xb5\xce\xb6\x93\xcc\xd9\x70\xfb\x75\x71\xe1\x83\x2b\x7b\x88\x85\x35\x30\x85\xfb\xdc\x14\x9a\x92\xfc\x40\x59\xb7\xec\xb7\x25\x57\xa1\x6d\x31\xba\x0b\xc3\x4f\xcb\x2e\x43\x5b\xd2\x04\x3b\x60\xe5\xef\xb2\xfb\xed\x3d\x70\x7f\x30\x3a\xb2\x63\xfb\x7d\xf1\x7e\xd8\xdf\x1f\x87\xf8\x03\x10\x58\x07\xf3\x27\x16\xea\x5d\xb0\x7e\xd0\xcc\x3b\xa2\xfd\x39\x0b\x1c\x73\xfa\xb1\x1e\xb2\x5f\x85\x8e\x94\xfd\x7c\x68\x6c\x3f\x1c\x03\xd8\x73\xd6\x1e\x12\x77\xd0\x9f\x72\x98\x16\xe7\x9c\xf4\x26\x1c\xd0\x8a\xd0\x4a\x80\x11\x28\x32\x75\xe6\x93\xa9\xd2\x21\xd5\x71\xc2\x0e\x4e\xa7\xf8\x9d\x13\x2c\x96\x33\x4c\xb6\x38\xaf\x36\x14\x41\x18\x53\x0f\x46\x3a\x98\xe1\x03\x06\x42\xe1\x1f\x9c\xc4\x09\xc6\x51\xce\x30\x53\xc4\x11\xc9\x89\x36\x92\x18\x3c\xa2\xf5\x67\xf3\x8b\x47\x45\x7e\xc2\xd7\x88\x08\x6b\x00\x3f\x04\x6b\xa2\x1c\x95\xd6\x8a\xaf\x1d\x0c\x7a\x9e\xbe\x69\xd2\xc7\x67\x33\xba\x1b\x13\xa8\x9e\x35\x27\x0f\x4a\x76\x17\x72\xee\x11\x6e\x67\x88\x2f\x8f\x92\xd8\xa8\x85\x4d\x2f\xab\x0b\x12\x9c\xe7\x71\x09\xc7\x92\x6b\x53\xb9\x88\x13\x32\x4e\xa1\x88\x69\x51\xcd\xea\xa5\xef\x6f\xbb\x66\xa9\xfb\x5b\x72\x04\x98\x52\x70\x67\xc3\xe4\x87\xc5\xdb\xa7\x27\xc0\xae\x6e\x92\x06\xe8\x56\xc0\x68\xba\x99\xaa\x1f\x09\xff\x3b\x9a\x15\xf9\xeb\xe6\xd1\x17\x5f\x19\xad\x05\xd7\x60\x1a\x69\x00\xe2\xbe\xd5\x7a\x39\x8b\xf1\x9b\xef\x30\x62\x2d\x1b\x17\x7f\x8b\x0b\x91\x71\xce\xc2\x9e\x12\xec\xe7\x20\xf5\xb2\xb7\x91\xa5\x48\xaf\x41\xea\xa5\x94\xf5\x52\x88\x41\xf8\x28\xdf\xf7\xbd\x81\x90\x7d\x5a\x4f\x7a\xad\xd3\x58\x12\x22\x92\x44\xcd\x5f\x7d\xd0\x18\x8f\x5f\x7e\x92\x3f\x5f\x4d\xfe\xec\x52\xf9\x2e\x0b\xf2\x2c\xa1\xf3\x53\xa1\xf8\xf8\x4b\x18\x8c\x8f\x69\x19\xb6\x80\x4f\x54\x31\x9f\xaf\x1e\xf0\x79\xad\xf4\x62\x18\xa4\xf8\xf9\xdf\x76\x1e\xbc\x7a\xf6\xfc\xe9\x33\x95\x54\x03\x12\x1e\xd0\xe9\xec\xd1\x99\x3c\xe1\x07\x02\x66\x81\xa4\x5f\xf3\xd9\x84\x09\x4e\xcc\x53\x40\xc1\xf0\x75\xe9\x4c\xd2\x68\x97\x41\x94\xf3\x70\x5c\x4a\x3e\x8e\x8d\x44\xae\x5f\xe8\x92\x16\xd6\x41\x2f\xe7\xb6\xfa\x95\x87\xeb\xa2\xeb\x73\x03\xe4\x83\xc8\xd8\x45\x66\xce\xa5\x53\xc5\x7a\x6a\x2b\x70\x4c\xde\xc3\x8b\x19\x5a\x7b\x0f\x6c\xae\x9f\x62\xb2\x18\x17\xf2\x9a\x27\x4d\xaf\xe1\x1c\x27\xa3\x6b\x11\xfe\xd3\x5c\x99\xd5\x2c\x90\xda\x39\x89\xb1\x26\x98\xf0\x34\x9a\xf3\xff\x71\x15\xc9\x55\x52\xf0\x9f\xf4\x59\x07\x7d\x72\xca\x00\xd7\xfc\xbb\xa7\x36\x8a\x12\x1b\x75\x1e\x54\x93\x7f\x74\xe6\x64\xb2\x8a\x67\xe0\xb3\x9a\x12\x61\x90\x7f\xac\x64\x59\x26\xf0\x4b\x64\x07\xb3\x59\x8d\x3a\x9c\x77\xeb\xc2\xfa\x34\x69\xaa\x33\x4c\xe6\x2e\x81\xaa\x47\x17\x1c\x6a\x45\x93\xd4\x6a\xa3\x1d\x3f\x20\xda\x7c\xfa\xd7\xc8\x82\x14\xaf\x17\x40\xe8\x1b\x9f\x04\x81\xe8\x35\x89\x35\xa6\xb9\xe9\x25\xa1\xb0\x46\x52\x46\xaa\x07\xf3\xda\x95\x27\x62\x5e\x3b\x3e\x02\xa4\xc1\x09\x23\x16\xc7\xb8\x7c\xc0\x3b\xe9\x18\x19\xd1\x71\x72\x30\x38\xe0\x8f\x05\xb8\x1f\x6b\x25\x47\x0e\xbc\xe7\x39\x28\x0c\x2a\x89\x20\x3e\xee\xb3\xeb\x4c\x82\x24\x0a\x38\x60\x46\x4f\xa7\x4c\xeb\x62\x31\xac\x1e\xce\xaa\x7f\x17\x13\x9f\x17\xdc\xe8\x8e\x29\x3e\xdb\xc0\xfb\xeb\x88\x1c\xce\x11\x17\xaf\x99\xf0\x4e\xb7\x13\x24\x16\x4a\x9c\x46\x93\x80\x1d\x0f\xe4\x5d\x43\x25\xa4\x57\xcf\xb9\xaa\x02\x7e\x9e\x03\x15\xd5\x7d\x6b\xac\xfc\x77\x77\x38\x21\xdc\x49\x5e\x8e\x32\xb7\x1e\xda\xd9\x46\x98\x63\xf0\xa7\xbc\x2e\x82\xd4\xf2\x64\x2f\x0d\xb5\x03\xc8\xad\xfb\x0e\x1e\x28\xbf\x93\xa6\xf5\x27\xa6\x05\x41\x0b\x9b\x42\xc3\x65\x49\x3b\x97\x0d\x2f\x26\xf9\xb8\x3c\x76\x3e\x85\x70\x1c\xc8\xd1\xbc\x0f\xbc\x0e\x53\xd1\xf5\x19\xe9\x7e\x46\xc8\x0d\x57\x12\xb7\xda\x5b\x6d\xb9\xfb\x83\xf7\xfb\xf3\x4b\x92\xcf\x37\x11\xde\x7f\x14\x12\x00\xbb\x46\x15\x18\x13\xda\x37\x12\x63\xaf\x35\x21\xbf\x0f\x77\xe9\xd3\xd7\xeb\xa6\xf4\xb0\x87\x1e\xf3\xe6\x2e\xcf\x78\x2f\x0b\xf3\xf4\xff\xb4\x28\x47\xf3\x1b\x08\x06\x1e\x84\x88\x68\x3d\x2a\x46\x15\x72\x06\x13\x7b\x72\x37\xe4\x54\xb2\x61\x55\xa6\x1e\x2b\xf4\xee\x35\xb1\xf2\xaf\x51\x04\xe5\x02\xd6\xb3\x6b\xfb\x89\xc6\xe8\x7a\x4e\x16\x74\x82\x34\x94\x44\x06\x3a\x63\x8a\x99\x8b\x01\x09\x73\x96\x39\x8f\x31\x60\x7d\x7d\x76\x44\xc1\x07\x95\x5c\x98\xf4\xd7\x05\xff\x22\x3d\xda\x03\x4d\xf4\x47\x5b\x7a\x5f\x27\x2c\xda\x33\x75\xc0\xe4\x4b\xfa\x08\x86\x42\x7a\x39\xc2\x03\xd8\xb9\x72\x3d\xb3\x6a\x71\xca\x2c\x2c\x9b\x43\xb8\x9e\x8f\xdd\xfd\x2e\xbf\xde\x2d\x70\x8e\x44\x41\x7f\xc3\x16\x5c\x78\xfa\x4f\x46\xf9\x29\x07\x24\xe4\x34\xd1\x33\xe7\xe4\x0e\x70\xcb\xd8\xe5\x4d\x41\xee\x03\x18\xe2\x15\x63\xed\x65\x9c\x73\x9b\x13\x45\x63\xb8\x74\x02\x8d\x0c\x83\x97\x13\xa0\x22\xce\x74\x79\xb9\xc4\x61\xe0\x04\x88\xa8\x7f\xb3\x05\xff\xf9\x59\x05\x8b\xcd\x70\xd8\xf7\x83\x2a\x1d\xed\x24\xca\x53\x4d\xc9\x08\x5d\xe7\xaf\x1f\xe7\x53\xe8\x96\xf2\xb6\xab\xe4\x48\x93\x7d\xa2\xb2\xd1\x0d\x08\xd6\x75\xec\x4f\xdc\x10\xd5\x95\xd5\x94\x80\xb4\xf0\x61\x5c\x24\x1b\xbb\x41\xf1\x88\xb8\x04\x63\x49\x8e\xa3\x0a\xe8\xb9\x12\xa6\xf5\x8c\xdf\x1a\xae\x8f\x41\xf8\xd2\x84\x95\x97\x73\x8d\x50\x95\x53\xa2\x20\x7b\x3a\x00\x8a\xf2\xba\xd4\xbc\x95\x45\x4d\xd0\x35\x5d\xcc\xa6\x55\x5d\x40\x3f\xb0\x3e\x58\x59\xdb\x9a\x27\x36\x67\x52\x4d\x6e\x78\x5a\x21\xeb\x72\x9a\x7a\xa8\x4f\x90\xd3\x13\xb6\x9c\xf1\x83\xb6\x23\x81\xe3\x30\xba\x22\xe0\x6d\x33\x77\xec\x70\xb6\x98\xd0\x48\x90\xff\xdb\xec\xf1\x56\x15\xf4\x86\x15\xc6\x88\x98\x5c\x43\xa7\x13\x58\x9f\x5a\xf4\xb9\xf6\x1a\x68\xa3\x81\xcc\xb2\x72\x2e\x22\xb6\x15\xec\xf4\x42\x11\x65\x9a\x26\x8a\xe9\xa2\xe8\x13\x32\xe5\x9e\x60\x52\x4a\xc7\x05\xd9\x8f\x91\xfb\x65\xbc\xcf\x7d\x37\x1c\x73\xa5\xca\x4c\x7f\x2d\x3a\xb0\xac\x24\xce\xc0\xcc\xb0\x8c\xb0\x91\x54\xe1\x83\xc1\xb4\x3a\x40\x96\x20\x25\x9f\xe2\x0d\x56\xb4\xc8\x67\xe2\xc0\x42\xf2\x0f\x16\x70\x90\xac\xc3\x57\x70\xc8\xda\xd3\x02\xd0\x01\x40\x05\x90\x4d\x43\x15\x92\xc8\x21\xd2\xa6\x78\xd0\x8e\xfd\x4d\x5c\x6e\x9b\xf1\x6e\xf0\x49\xb3\xa9\x97\x94\x06\x8c\xc4\x4d\x3e\x8c\x6a\x76\x8f\xe7\x78\x97\x29\x6d\x4a\xb7\x57\x92\x79\x06\x71\x3b\x94\xb1\x0a\x8d\x57\x90\xd9\x93\x60\x85\x8e\x78\xa8\x1c\x66\x73\x37\xa2\xd2\x74\xfd\x0d\xc2\xba\xe6\xa2\x90\x3b\x8c\x02\x1b\x0e\x4b\x3a\x0a\x8b\xb2\x3e\x23\xb0\xa6\x94\xba\x79\x06\x47\x1f\xa3\xa2\x0a\x76\xb0\xb5\xbd\x8d\xb2\x46\xf0\x40\xdb\x43\xff\xdd\x30\x0b\x57\x44\x8b\x2d\x04\x50\xba\x73\x26\xfa\x82\x6f\x4c\xc2\xb5\xde\x86\x0c\xec\x3d\x97\xbc\xcd\xab\x54\x70\xa5\x9c\xce\x99\x16\x8b\xb9\x5e\x0a\xd0\xc0\xb8\x98\xb2\x51\x60\x2c\x90\x8d\x30\xf7\xde\x6f\x8c\x80\x94\x94\xf2\xc9\xe5\xd8\x59\xf4\xc4\xbd\x91\x5b\x82\x07\x11\xe7\x45\xe3\x82\xfc\x8d\x6f\x4c\x58\x28\x97\xdf\x17\x48\x7a\xca\x35\x38\x30\x25\x18\x88\xb8\x4b\x79\x4b\x0f\xe9\x7a\x9c\x52\xd2\x15\x73\xe2\xac\xe7\xc5\x18\xb6\x99\x30\xa1\xbf\xf9\x71\xba\xc0\x63\xf3\xc1\xcb\x29\x8c\x30\xcf\x56\xb9\x37\xa5\x1f\x75\xd9\x48\x72\xcb\x61\x09\x03\x2e\x49\x3a\x3c\xcb\x6b\xe0\x60\x2d\xd1\x48\xb5\x36\xb3\xbf\xfc\xc5\x21\x94\x2c\xbb\x16\x72\xa2\xad\xb5\x2c\xbb\x45\xc3\x3a\xd0\x4f\x2f\xdd\x52\xf8\x57\xed\xb2\xeb\xfb\x2e\x8f\x2d\xdf\x76\xe3\x8a\xf2\xc9\x51\x26\xd0\x22\x53\xa7\x44\x25\x1c\xf0\xbc\xe1\xba\x50\xc6\x90\x93\x62\x86\xa6\x35\x70\xff\x1b\x29\x29\x2c\x13\x1c\x50\x49\x57\x52\x0c\x83\x25\x73\xe2\x50\xe9\xf3\x91\xc6\x76\x89\x1d\x25\xb3\x1b\xd9\xd6\xdd\x8d\x30\x31\xae\x16\xbe\x87\xc9\x45\x65\xf2\x61\x32\xdd\xec\x5e\x90\x2e\xd4\x58\xef\x46\x6d\xfc\xe0\x5b\x70\xc3\x21\xbf\x03\x68\x21\x4c\xc4\xca\x15\x36\xef\xb6\x4a\x22\xc3\x82\x91\x10\xd2\x37\x7c\x50\xbe\xb4\xd3\x3c\x28\x01\x0e\xb7\x5e\x5a\x46\x21\x3d\x15\xaa\x7c\xd7\x6c\xd7\x73\x0a\xe1\x5c\xb8\x60\xc4\x1a\x77\x5a\xad\xff\x51\x12\x49\x14\xb8\x14\x78\xe6\x09\xdc\x20\x17\xf2\x33\x39\xb7\x8d\xb2\x77\xd3\x70\x9d\x6a\x2e\xf0\x39\x68\xc0\x20\x79\x37\xe8\x11\xec\x2c\x07\x57\xdb\xfa\x4a\xa0\x5d\x1a\xd6\xdb\xdb\xf5\xbc\x56\xb5\x15\x12\xfe\xf4\xa3\x21\x4b\x52\x1d\x9a\xfd\xcc\xd4\x6c\xf8\x45\x17\x79\x93\x6f\xa4\x04\xb2\x95\xfc\xf3\x31\xb2\xf5\xa8\xf5\xc4\x15\x68\x47\xd5\x9c\x73\x8b\xd3\xed\x08\x6a\xa7\x3d\xdf\xf1\xf7\x1c\x6d\xb1\xdc\x71\xda\xa4\x1a\xc4\xf9\xfb\x48\x89\xdd\x72\x2e\xa7\x9a\xdb\x41\xc2\x0f\xcf\x26\x51\xf9\x74\x70\x0d\x7f\xb8\xd3\x3f\xed\x67\xdf\x3f\xac\xaa\xec\xe6\x0f\xde\x57\x04\x9e\xfb\xc2\xd0\x39\xb2\x58\x6e\x4d\xa4\x4c\x00\x5f\xe0\xd5\x30\xcc\x0e\xcd\x85\x7b\x28\x5e\xe8\xc4\xb2\x8c\xe1\x50\x49\x49\x7b\x4f\x2b\xbe\xc0\xe4\x4f\x2c\x70\xb0\x9c\x15\x63\x9b\x72\xee\x6a\x63\x50\x6e\xce\x4b\x6b\xfa\x91\x31\x3d\x2a\x4e\xf3\xe3\x8b\xec\x0c\x75\x31\xcc\xfa\x90\x30\xa2\x14\xa9\x69\x59\xbb\x09\x6f\x64\xba\x66\x31\xcf\xa6\xe6\xd8\xfc\x35\xb5\xcb\x98\x9b\x76\x7b\x32\x14\x2b\x4b\x3d\x3d\x6e\xb3\xab\xd1\x70\x47\xc7\x0e\x80\x69\x8e\x09\x6e\x3e\xbc\xf1\xb7\x71\x1a\x6e\x7d\x03\xc6\x34\xcd\xbc\x74\xd0\x6c\xde\x39\xc0\x36\xef\x98\x25\x6c\xbe\x56\x8e\x97\x3e\xe8\x08\x37\xd4\x44\xeb\x5d\xf8\xb6\xdd\x13\x55\x64\x3b\x12\x54\x78\x14\x5c\x73\x22\x6c\x7b\x86\xd5\xa4\xe4\xbe\xfa\x41\x47\xe1\x86\xd7\xa4\x86\xed\xe0\xa3\xaf\x91\xcd\xa4\x6f\xa7\x6d\xe3\x12\xa4\x90\x83\xb4\xf5\xa9\xa1\xa7\x3a\x3d\xc3\x99\x56\xd3\xb2\x41\x0a\x19\xde\xac\xf0\xd4\x9a\x66\x22\x5e\x8f\xac\x62\x82\xa6\xf0\x9b\x1f\x92\x52\x85\x87\x00\x37\x3a\x12\x05\x90\xe0\xe8\x08\x71\x81\xf4\xd1\x03\x32\x88\x4c\xba\xb1\x22\x8a\x7f\x80\x01\x9b\x95\x40\xd5\x4c\xa4\x41\x15\x21\x14\x01\x00\xad\xa0\xd3\x0c\x55\x83\xed\x5e\xb3\xd4\x96\xc7\xf4\x30\xaa\xbd\x72\xc4\x9c\x3b\xca\x4d\x47\xa2\x0b\x3f\x61\xe2\x9a\x70\x16\x39\x40\xf6\x1d\x5f\x10\x92\x7f\x7a\x01\xe8\x18\x5b\x11\xb8\xbd\x48\xcd\xd8\x70\x15\x5b\xc6\xc6\x0b\x9c\xa4\x07\x2f\x97\x52\x85\xb2\x80\xb8\x65\xa5\x30\xcf\x2e\xf5\xc3\x27\x6a\xf0\x13\x35\xf8\xf1\xa8\xc1\xa5\x74\x50\xd1\xb8\x4c\x9a\xf4\x90\xb9\x2a\x8a\xe4\x3d\x11\xd1\x3d\x22\x72\x56\x89\xec\x8f\x09\x6d\x96\x46\xb5\x92\xdc\xf3\x97\xd9\xbe\xe8\x1c\x0e\xb9\xd0\x21\x07\x09\x21\x54\xee\xc5\x9e\xa4\x6d\xfd\x3f\x27\xa5\x4a\x74\x03\x0c\x5e\xd6\xe4\xdf\x99\xc0\xe1\xdc\xa4\x93\xde\x52\xad\xfd\xa2\x9e\x53\xd2\x62\x42\x76\x27\x98\x52\x91\x44\x6f\xd5\x62\x5e\xe3\xa9\x05\x4a\x95\xf3\x20\xa0\xdd\x39\x9b\x81\xa1\x49\x16\x4b\xcb\x51\x0e\x4e\xf9\x0e\x38\xaf\x65\x39\x17\xb1\x39\xba\x36\x50\x26\x85\xf9\x79\x95\x0d\xcb\x13\x00\x75\x1c\x8a\x0a\xc7\xb1\x23\x69\xa1\xf2\xda\x54\x6e\x6a\x9a\x9f\x16\x7d\x14\xc9\x41\xe7\x93\x39\x6a\x89\x72\x5d\x6c\x15\x31\xf8\x06\x65\x14\x1a\xc7\xef\x9c\x7c\x72\x36\xc4\x4a\x82\x64\x6f\x25\x2b\xa0\xb0\xc3\x7c\xd2\x94\xce\x6f\xa8\xd5\x86\x5f\xad\x6b\xd7\x64\x9d\x90\x33\x90\x83\x17\x49\x2a\x94\xce\x64\x3f\x47\xad\x8a\x96\x7d\x5a\xd5\x74\x14\x54\xf4\x8e\x22\x4a\x6a\x4d\x48\x94\x02\x87\x1d\xa5\x8b\x48\xde\x5d\x54\x0b\x94\x63\x2d\x6a\x44\x95\x63\x20\xf2\xcb\xe9\xa8\xc8\x00\x89\xd6\x14\x72\xc5\xad\x9c\x8b\xde\x82\x62\x26\x4a\x23\x5f\x8e\x0b\x59\x7f\xba\xd5\x6a\x20\x14\xcf\x59\x06\x4b\x80\x5b\x9f\x95\x53\xc2\x43\xf5\x7c\x71\x72\xd2\xcf\x1e\x96\x6f\x61\xc7\x7a\x19\x34\x9f\xd7\x45\xe0\x86\xf2\x6b\x21\x9e\x2a\x22\xa4\xbc\x20\xd5\x60\x86\x9b\x2f\xe5\xac\x3d\x7f\x1d\x50\x13\x69\xab\x05\x57\x64\xed\xa8\xe7\x4b\xd2\x5d\xaa\x46\x7c\xb0\xf5\xb5\x0f\x89\x1d\xe8\xbc\xe1\xcb\x37\x6b\x24\xbe\xfe\xfa\x93\x61\xc4\x9f\xc0\x30\x42\xdc\xd1\xab\x19\x5b\x48\xc8\xd2\x26\x4b\x68\x82\x5d\xc4\x89\xe7\x9c\xcb\x05\xae\x05\x1a\x92\x41\x13\xcc\x95\x90\x8a\x8e\x44\xeb\x4a\x08\xd7\xca\xf6\xc1\x95\x3a\xcd\x6b\xd1\xe9\x59\xdd\xb2\x3b\x97\x24\x3e\x15\x51\xd6\x11\xad\x2f\x63\x45\x54\x4d\xc0\x44\x1f\xec\xfc\x8d\x0d\x56\x55\x1e\xea\x74\x1e\x47\x88\xb0\x38\xb8\x34\x33\x9f\x84\x68\x44\x7d\x30\xca\x27\xa7\x0b\x40\x70\xa4\x94\xa3\xd3\x5e\x2f\xa6\x08\x67\x2c\x9e\x5f\x66\x1f\x72\xb5\xd4\x74\x0f\x67\xf9\x69\x4b\x71\xfd\x14\x06\x92\x86\x35\xd9\x87\xd1\x3e\xd2\x9c\xb9\x89\x8a\x8d\x32\x4b\x5b\x20\x33\xe4\x35\x5a\xa1\x72\xef\x63\xdb\xe2\xea\x45\xf9\x70\x12\x55\xa3\x12\xce\x96\x05\xcd\xb7\xe6\x18\x4a\xa8\x9a\x3d\x8c\x0c\x64\x82\x4f\xda\x9d\x4b\xb0\x1f\x96\xf5\x79\xf7\xd7\x35\xa4\x09\xfc\xd5\x8a\xe3\x51\xce\xe1\x8c\x76\x66\xb3\x6a\xb6\x8d\x3c\xc7\x70\x31\x16\x0b\x12\xbc\x6b\x5a\xc9\x79\x4b\x8e\x4d\xd8\x32\xbc\xb5\xac\xf7\xd0\xbe\xeb\xc8\xff\x09\x11\xd2\xbf\x39\xae\x82\xf0\x7a\x07\x88\x5b\x00\x5d\xe1\x41\x08\x13\x8d\x0b\xa0\x61\xe9\x32\x3d\x44\x46\x80\xba\xfa\x22\xeb\x1c\xf6\x3b\x49\x73\x3c\xcc\xcf\x71\x19\x9a\x3c\xb0\x35\xc5\xac\xe8\xa0\x05\x3a\x31\x15\x80\x68\x01\xa5\x95\xc4\xf3\x14\x44\x10\xa8\x2e\x9d\x6c\x82\xe9\xc6\x73\x74\x1d\xe1\x08\x55\xdd\xa0\xc9\x27\x91\xd3\x28\xf1\xa0\x33\x2e\xe7\x97\xf4\x3f\x35\x9c\x58\x3c\xbd\xaf\x8b\x62\x8a\x04\x37\xcc\xc4\xb6\x74\x54\xcc\xcf\x0b\x64\xea\x3e\x17\x8b\x8f\xda\x5b\x70\xd0\x75\xf9\x4b\x5e\xff\xb5\xb8\x78\x51\xab\xf1\x82\xca\xec\xb1\xc0\xa8\x3a\x3d\x2d\x86\x08\xc6\x0f\xf3\x72\xb4\x98\x39\x97\x0a\xfa\xfa\xe4\xc5\xe3\x9d\xe7\xbb\xf7\x89\x03\xd9\x79\xbe\xff\xf7\x57\xcf\x77\x7e\xde\xf9\x6f\x28\x71\xf3\xff\xfe\x63\xf8\xc5\xff\xbe\xe9\x29\xc3\x9f\x8b\x39\xe3\x24\xa5\x17\x3a\x1c\xdb\x99\x90\x05\x22\x02\x4c\x16\xce\xdd\xb7\xd8\x87\x28\xfd\xf8\xa3\xda\x43\x3d\x60\x8b\x77\x6e\x06\x5b\x51\x56\x2e\xb4\x19\x51\x20\xd0\x8e\x0d\x17\xbf\x38\x82\xfd\xd0\x18\xa8\x30\x6a\x47\x5e\x01\x81\xa3\xbf\x11\x88\x9e\x05\x05\x19\x9c\xc8\xc6\x29\x6c\x21\xb2\x7f\x76\xe3\x51\xa1\x04\xb1\x10\x46\xfb\x74\x2f\x1a\x41\xdf\x7c\x74\x5d\x98\x77\xab\xda\x57\xd3\x50\x23\x07\xb3\xee\x05\xff\xf9\x4f\xf0\x69\x22\xef\x4c\x33\x97\xcd\xed\x72\x51\xe4\x11\x50\x3a\x75\xe0\xaf\xf0\x31\xb6\xce\x9e\xeb\x07\xbe\xef\xae\x71\xf6\x91\x11\xae\x90\x01\xc8\x18\x98\x05\xd2\x3a\xb0\xcf\x0a\x1e\x0e\xbf\xd8\x25\x11\x06\x27\x75\xb0\xdd\x1d\xac\xe1\x34\xcf\xd0\x51\x9e\xac\x0c\xf8\x94\xd3\x91\x67\x9a\x8e\x2f\x57\xbe\xf8\xf8\xdc\x6a\x65\x36\x6c\xce\x27\x8c\x01\xfa\x64\xf1\xc0\x0e\x02\x7c\xdf\x9e\xce\xaa\x73\xa6\x64\xcf\x60\xe5\x5e\xe3\x5a\xf1\x1d\x3d\x2b\x28\x1d\x23\xba\xa2\x20\xc9\xe5\x0e\x3b\x5d\xb5\x38\x14\x1c\x92\x64\x81\x87\x2a\xf0\xc5\x4b\xd0\x10\x91\x08\x9a\x1e\x92\x19\xfb\xe7\x32\xf8\xec\x3a\x8c\xf9\xba\xb7\x74\x6b\x8e\xbe\xd5\x6c\xcb\xde\xcf\xce\x78\x2b\xd3\xab\x5c\x0c\xc0\xa9\x4b\x24\x68\xd8\xc5\x25\xb4\xe0\x21\x71\x0f\x22\x1a\xad\xdd\xa9\xe5\x25\xfc\x50\xcb\x21\x03\x1c\x3a\x9f\x1d\x59\x6f\x40\x61\x5e\x74\xe7\x5b\xf3\x77\x4a\xd1\x26\x51\x84\x1d\x37\xe2\xb4\xa6\xe2\x51\x35\xd2\x78\xc6\x5a\x1b\x31\x19\xfc\xf1\x30\x6c\x4f\x86\x8f\xab\x49\x89\x97\x69\x35\x63\xec\xca\xa0\xd7\x21\xee\x92\xf6\xcb\x6e\x3d\xee\x6c\x29\xd7\xaf\x8a\xd1\x65\x53\x16\x93\xf2\x5f\xc0\x29\xfb\xbd\x51\xbb\x40\x9d\x2d\x33\xe4\x6e\xc6\xcb\x80\x96\x6c\xd9\x6a\x00\x08\x44\xf3\xaa\x03\xcd\x89\x39\x93\xab\xc6\x6d\xfe\x11\xa5\xb1\x14\xbe\xcd\xc5\x63\xff\x9c\x6d\x0b\x97\xc2\x82\x9e\x72\x3a\xdd\x2e\xad\x08\x9f\xf5\x13\xe3\xe2\xb4\x0a\x7a\xee\xc7\x0e\x04\xbf\x0b\xfc\xe8\x00\x11\x7e\x26\x14\x4b\x70\x29\x14\x5d\x4b\xdf\x79\x9c\x80\x6b\x62\x05\x6e\x21\xe0\x2c\x07\x0a\x12\xae\xc9\x16\xd4\xc1\xfe\xa3\x49\x0d\x59\x99\x00\x99\x40\x64\x40\x5d\xb9\x4c\xac\x19\x19\xd6\x29\x9b\x75\x35\xa8\xd8\x3b\xcb\xf1\xf8\x2b\xe1\x86\x38\x66\xcc\x63\xc3\x47\xe2\xcf\xc8\x0c\x48\x80\x66\x39\x82\x8f\x36\x1e\xe8\xdc\x1a\x68\x7f\xc2\x66\x47\x68\x85\xa8\xbd\xd0\x3e\x9e\xe2\xdd\x52\x2d\xe6\xd3\xc5\xfc\x0f\x07\x82\xb6\x5d\x91\x19\x2c\x81\x05\x47\x3d\x89\x7f\xe2\xb2\xbb\x4a\x25\xf4\xdc\x86\x54\x50\xe5\xa8\x1f\xb2\x8d\xc0\x26\x71\x88\xcc\xd7\x81\x79\x88\xef\x75\xf3\x65\xa2\x6a\x09\x31\xd0\x95\xde\xfc\x50\x5d\x71\x56\x60\xa8\x47\xeb\xb8\x2a\xff\xed\x0d\x06\x63\x92\xf0\x40\x16\x84\xfc\x02\x19\x66\xbb\x2b\x0a\x22\x99\xb8\xb9\x21\xde\xaa\xec\x7e\xc7\x7d\xc4\x92\x6a\x19\x64\xcb\xb9\xd1\x5a\x07\x52\xec\xa5\xc5\xb4\x7e\x51\x9f\xce\x68\xd9\x95\x95\x90\xc0\xd5\x7e\xd6\x3f\x66\xdd\xeb\xcb\xa8\xfc\xeb\x40\xdd\xfb\xd2\x5f\x64\xd7\xfb\xd7\x35\xae\x93\xd9\xb5\xa8\x15\x82\x58\x75\xb8\x47\x51\x8f\xc8\xb2\xbe\xc7\xd6\x4c\x35\x68\xee\x07\xdf\x5e\xa7\xa3\x8a\x99\x17\x35\xf9\xa2\x35\x09\x2d\xcd\xe1\x53\x9d\x9c\x48\x3c\x32\xc4\xc6\xb0\x88\xe5\x9c\x54\x96\x53\x94\x52\xe8\x95\x8f\x38\x5a\x24\x8a\xb2\xa4\x3d\x55\x90\x8a\x6a\x95\xf4\xa8\xd5\x4c\xb1\x2f\x5f\x3e\x78\x9c\x3a\x75\x6c\x56\x2a\x22\x45\xba\xf8\x09\xc3\xcc\xdd\x49\xf3\x22\xf0\x68\xa9\x25\x3b\xa1\xb9\x63\xbd\xa6\x22\xd4\x1d\xb5\xbe\x47\x55\xcc\x4a\x9e\x0f\xdd\x29\xcd\x25\x12\x79\x8f\xa9\x8a\xd1\x1b\xaa\xb3\x08\x88\x46\xdc\x0f\x65\xf8\x4f\xc3\x83\x4b\xa7\x34\x1c\x91\xc6\xa7\x48\xce\x17\x80\x60\x77\x0e\xb8\xc3\xc9\x56\x72\x59\x53\x12\xdb\xe2\xe6\x47\xbd\x30\x3c\x39\xf1\xfc\xbb\xb9\x29\x18\x03\x43\x45\xb0\xc0\x91\x7e\x56\x7f\x56\x67\x7b\x45\x91\x9d\xcd\xe7\xd3\x7a\x70\xf3\xe6\xc9\x51\x7f\x5c\xdc\x9c\xe1\x62\xde\x90\xfa\x37\xe8\xe2\x20\x1b\xfc\x8a\x3c\x99\x39\x8a\x27\x66\x66\xea\xd8\x7b\x22\x3a\x44\xbd\x96\x15\xd8\x08\x9c\x10\xfc\x95\xb2\x33\xa1\x88\x3e\xb4\x1b\x62\xcd\x29\xe0\x50\x94\x14\x95\xbb\x74\x0b\x86\x94\x8f\xca\x8e\x34\xdb\x65\x8f\xe9\x21\x6c\xc9\xf8\xc8\x46\x14\xb5\xf1\xc3\x10\xf2\xa5\x47\xa4\xd3\xc4\x90\x30\x23\x22\xa4\xe8\x66\xa2\x26\x58\xa5\x80\xb7\x98\xb7\xf7\x5b\x45\xca\x62\xb0\x24\xa0\x60\xf0\x1a\xdc\xa3\x61\x12\x60\xc9\xe8\x79\xb3\x49\xd0\x7e\xe1\x6e\x95\x96\x7b\x08\x9b\x58\x93\x12\x21\x22\xe0\xaf\xe8\xdd\x89\x95\xd2\xe4\x07\xc7\x40\x2d\x6b\xd6\x3e\x61\x39\x87\x37\x53\x5a\x27\x2c\x90\xf6\x82\x74\x67\x01\xed\x0e\xa0\x94\x8b\x5c\x60\x04\x30\x69\x3d\x0b\xeb\xbc\x02\xbd\x62\x8a\x16\xa7\x52\xc1\x24\x12\xba\x45\xaf\x79\x5b\xd6\x61\x30\x4d\x55\x29\x28\x6c\x99\x63\x48\x50\xc5\xbb\xed\x52\xa8\x52\x1d\x5a\x86\x56\x92\x3d\x18\x07\xf5\x65\xdd\x5c\xad\xb8\x2c\x90\x91\x71\x51\x67\x28\xb8\x43\xe1\x3d\xb5\x78\xad\xf2\x5b\xb2\xfe\x76\xd0\xeb\x0d\x64\x7d\xbb\xa1\x0e\xd8\xf4\x47\xa1\x89\x71\xe4\x30\xcd\x59\xe0\x6b\x12\x0e\x2d\xbb\x67\x46\xc9\x2a\x07\x33\x34\x2d\x5d\xcf\x8b\xa9\x7f\x73\x7e\x86\x82\xec\xee\xb5\x2e\xbe\x36\x0d\xf4\x27\xc5\xdb\x79\x77\x73\xb3\x3f\xac\x26\x51\xd4\xea\x55\xbb\x84\x2d\xf5\xd9\x21\xab\x19\xee\xba\x09\x1f\xbe\x78\x12\x48\x3c\xa0\xd8\x5f\x02\x3a\x7e\xbb\x84\x8a\xa2\x83\x4a\xf4\x13\xe3\x80\x4e\x08\xe8\x27\x5e\x48\x1c\x48\x86\xfb\x62\x5c\xb1\x7b\xa2\x6f\xc2\x95\x8b\x7d\x80\xb4\x9d\xc0\x3b\x18\xa3\x8a\x6b\x7b\x11\x69\x83\x2e\x3f\x71\x5c\xd0\x26\xd7\x41\x3e\x28\xda\x04\xb9\x70\xb5\xac\xc8\x65\xf3\x00\x19\xf4\xbb\x0d\x67\x60\xa6\xae\xd4\x4e\xfa\x8f\xcc\xbe\x18\xd6\x7c\x9e\xa2\xd5\x83\xd0\x0e\x2d\xf7\x2b\x25\x68\x40\x49\xad\x5e\x3c\x75\x3f\xe5\xb2\x35\x15\x81\x77\x9d\x91\x0f\x04\x1b\xfe\x31\xdf\x47\x66\xb2\x81\x54\xbc\xad\x81\x3a\x35\x48\x3d\xcd\x59\x81\xa6\x68\x78\x7b\x4e\xaf\xf7\xb2\xeb\xa2\x91\xa6\x9f\x84\xca\xf4\x85\xe8\x61\xca\x37\xb0\xd2\x21\xae\x25\x1d\x85\x8e\xa1\xee\x86\xf9\x93\xfc\x0c\x7a\xea\x5c\xa1\x3d\xf3\x2e\x3a\x78\xb0\x96\x1c\xae\x92\x35\x81\x71\x2f\xd7\xb0\xcb\xa0\xe0\xc0\xb8\xbc\xba\xd3\x80\x4d\xb0\x3c\x6b\x55\x8c\x8f\x05\x92\x74\xe8\x78\x73\x8e\xee\x86\x40\x70\xd6\xe2\x64\x32\xac\xc8\x3b\x83\x4d\xdf\x31\x75\x06\x07\x27\x90\xa6\xc8\x59\xcc\x10\xbd\xd3\x33\x62\xc9\x48\xbf\x8d\xe9\x60\xca\x21\x56\xa3\x52\xac\xff\xd6\xe8\x26\x18\x6f\xaf\x74\x16\x38\x98\xd5\x83\x82\xf3\x41\x53\x50\x9f\x98\x53\x12\x2c\x91\x2b\x3a\xaa\xf0\xa6\x38\x8a\x0e\x50\xc1\xa3\x42\xdc\x6f\x78\xb0\xd2\x80\xf5\xc7\x08\x34\xc3\xa1\x01\x3f\xc9\x1b\x54\xeb\xe0\x19\xc6\xe3\x7c\x71\x7a\x86\x7e\x96\x74\x89\x7a\x45\xba\x6b\xed\xa8\x80\x21\x95\xe8\xe2\xe6\x63\xba\xb0\x0e\x10\xee\x6f\x21\x43\xde\x22\xe9\xac\xce\x3a\x47\xc5\x7c\x5e\x38\x90\xf6\xc9\x38\xd6\xa6\xce\xdc\x30\x6d\x98\x73\x63\xf3\x4a\xfb\x1f\xdb\xbd\x2a\x24\x76\x6c\x88\x39\xa0\xe2\x06\xe8\x63\x4a\x1b\x7e\xf8\x59\x7d\xc8\xcb\x42\x5b\x7f\x97\x88\xf9\x45\x3d\x67\x2b\x47\xad\xdf\x03\x5e\x83\xb9\x07\x22\x3a\xad\xd7\x69\x26\xb1\xcb\xfb\x0e\xce\xfb\x9d\x30\xe5\x87\x3d\xf2\x98\x5d\x9c\xf5\xec\x14\x1d\x31\x28\xd9\xae\xc7\x3a\xd0\x83\x11\x84\x73\xd7\xb9\xba\x57\x48\x27\xfa\x65\x5a\x7b\x6d\x36\x0d\xd2\x63\xc4\x73\x2f\x55\xab\x2b\x87\x54\x5f\xf4\xb2\xe8\x3c\xbb\xd3\xeb\x48\x0f\x75\xbc\x29\xde\x5a\xbc\xac\x7d\xf8\xc4\x05\x36\x6e\x0c\x7f\x35\x86\x0e\xa4\xb5\x62\x2b\x08\xfa\xd6\x57\x7a\xbc\x9c\x24\x14\x26\x9b\x51\x6e\x9c\xa7\xa8\x59\x15\x59\x0b\x43\xe8\x09\x97\x64\xb7\xb1\xa3\x02\x40\x9d\x4f\x36\x12\xd3\x70\x66\x6b\x56\xcd\xc2\xe6\x8f\xaa\xb9\x60\x67\xdb\x20\xe9\xa1\x79\x20\xee\x75\x73\x18\x07\xc1\x50\x03\x36\x9a\xff\x91\xe7\xbc\x67\x72\x96\x29\xea\x02\x97\x9d\x77\xe0\x67\x98\x95\xc9\x3a\x38\x36\x31\xfd\xda\xa7\x20\x8d\xc8\xcd\x74\x7a\x59\x30\xd4\x9e\x1b\x55\xc3\xf5\x39\xba\x08\x55\x13\x59\x0c\xc9\x86\x55\xdd\x64\x9c\xca\xca\x0a\x44\xf3\x23\x44\x10\xec\x35\xa8\x96\x7a\xec\x94\x5d\x03\x5e\xc0\x57\x87\x0a\x56\x87\xa8\xaa\x3b\x14\x7a\xf3\x30\x76\x60\xd5\x3b\xca\x5d\x09\x28\xf5\xe2\x97\x2c\x39\x63\x8b\x21\xee\x80\x1d\x0d\x01\x43\x41\x27\x2b\x65\x5f\x4d\x51\xd5\xc3\x6a\x16\xcc\xac\xeb\x21\x5f\xea\x78\xe1\x94\xd8\x31\x5b\x6b\x2f\x95\xf6\xc8\xbb\x50\x10\xd5\x48\x02\x00\xfb\x35\x67\xc1\xd3\x3c\x12\x39\xdd\x4d\xc8\xbf\x8a\x54\x18\xed\xa2\x11\x31\x3b\x56\xa5\xf5\xdb\xb4\x55\x03\xef\x14\x64\x14\xcc\x1c\x07\xcb\x2d\x35\xf0\xbf\xff\x41\xf5\xac\x9d\x90\xbe\x73\x83\x53\xd9\x44\x0a\x32\xe2\xdb\xd9\x77\xb3\x44\x8c\x1b\x37\x72\xe0\x6b\x35\xa4\x53\x32\xb2\x5d\x60\xb9\x53\x82\x92\x27\x46\x1d\x1d\x15\xcd\xbe\x4f\xcc\x2c\xbb\xf9\x43\xc7\xaa\x13\x69\x92\x8d\xc6\xdd\xd4\xb5\xe9\xa0\x18\x01\xa8\xe5\x9e\x54\x5c\x72\x74\x91\x75\x22\x31\x58\xa7\xdf\xf9\x70\x52\x0b\x1b\x54\x81\xed\x9e\xfb\x9f\xd5\x61\x38\x05\x87\xbf\x3f\xab\x4d\x48\x05\x1b\x45\x41\x2f\xba\xce\x95\xc3\x29\x64\xa2\xae\x74\x2d\xf0\x25\x19\x98\x81\xab\xe3\x3b\xfb\x74\xb9\x45\x42\x82\x41\xa3\x25\xe8\xc0\x3b\xde\x10\xd2\x47\x05\x35\x7b\xd8\x0b\x57\xbe\x29\x34\xc1\x58\x75\x23\x4c\x16\x26\xf6\x5f\x28\x1d\xa9\x46\x17\x27\xe5\x68\xe4\x4f\x7d\x59\x9b\xd0\x5a\xb8\xb7\x39\xad\x7c\x1e\xc8\xc4\x9e\x18\x40\xcd\x8e\xa8\xc0\x91\x42\x09\xd7\xa1\x98\x46\x78\x63\x1d\x85\xe1\x8d\xa0\xfa\x17\x37\x6e\xd9\xea\xb7\x33\xb4\x28\x24\xe3\x59\xf8\x75\x14\xe9\x96\xf9\xcb\x51\xa0\x2a\xa6\x18\x5c\xf9\xc4\x8b\xca\x89\xc6\x66\x69\x65\x2d\x78\xcf\x53\x8b\x84\x71\x61\x19\xd9\x11\xc4\x63\x3a\xd9\x32\xb4\x3d\x13\xb5\x03\x65\x37\x27\xa9\x2a\x99\x2e\xe1\x3d\x29\xab\xb2\x49\xf4\x2f\xa0\xce\x79\x79\xbc\x80\x1b\xca\x74\x99\x4f\xc8\x1a\xca\x7b\xe4\xf9\x9e\xc9\x61\x4f\x7d\x90\xd9\xd9\xbb\x33\xf7\xce\xb2\x4c\x18\x1c\x89\x5c\x89\x22\x01\x32\x1c\x63\x7b\xd6\xca\x7b\x62\xb8\x2b\x67\xae\xfc\xf9\x15\xb1\x39\x0d\x78\x7b\x32\xfc\x95\xb1\xfa\x63\x5e\x15\xc2\x2b\xdd\x00\x95\x93\xce\x29\xd4\x3a\x9a\xcd\xdb\x49\x1c\x63\x96\x41\x1f\xc6\xc6\xbf\x87\xc6\x2f\x78\x46\x20\xad\x8d\x1c\xb6\xfb\x1d\x1d\xde\xcd\xea\xd7\xe5\xd4\xc5\xee\xe0\x71\xab\xdb\xaf\x45\x8d\x8a\x90\xac\x33\xba\xbd\x16\x58\xf8\x12\x7c\x76\x6a\x91\xa8\xec\x94\x3f\x2e\xe3\xb7\x1a\xbc\xd6\x3a\x7c\x16\x2d\x65\x30\x82\x76\x53\xfb\x20\x2f\xdb\x35\x38\x85\x41\x3d\x4f\x82\xf6\x62\x9b\xfa\x80\xda\x5b\xf3\xce\x36\x44\x18\x1a\xda\x57\xd3\x0b\xf2\x25\x50\x33\x79\x41\x71\xea\xba\x45\xce\x5e\xe7\x55\x00\x81\xe8\x4d\x85\xe0\x9b\x9f\xe6\x12\x61\x80\x90\x4f\x7a\xcc\xea\x44\xbd\xdc\xea\x7f\xd9\x09\x57\x29\x86\xfa\x92\xe9\x31\x3f\xa9\xd0\x1e\xc9\x9d\x0f\x16\x06\xf0\x79\x22\x9e\x45\x8e\x12\xca\xc5\xe8\xba\x51\xbf\xb5\x77\x38\x40\x56\x90\xc2\xbc\x7c\xe3\xd8\x58\xd2\x27\x8b\xd2\x7c\x29\xfb\x49\x1a\x6e\x31\x93\xe0\xbb\xbd\xaf\xf9\x0f\x3c\xef\x1a\x92\x00\xe4\x76\x47\x62\xa3\x48\x4c\xc2\xd1\xe5\x9d\x03\x8b\xb3\xb4\xbc\x5f\x4d\x60\x37\x51\xaf\xcb\x54\x21\x8e\x47\xcc\xc9\x49\x2e\x72\xac\x39\xa6\xa4\x05\xc6\x50\xc8\xec\x13\xf2\xf2\xa2\x84\x0d\x63\xb8\x2c\x86\xa2\xa4\xbb\x95\x86\x3b\xb5\x59\x75\x09\x7c\x3a\x2c\x8e\xab\xc5\x74\x54\x0c\xdd\xb8\x36\x4c\xe4\x43\x1a\x4d\x3e\x03\xba\x4c\x3a\xe5\x48\x2d\x47\x30\x72\x94\x79\x3b\xa5\x8f\x4e\xf1\x3e\x8d\xef\x5e\xd2\x0a\x11\xa9\xbb\xfb\x41\x41\x80\xfc\x94\xe3\xc1\x86\xe8\x04\x8d\x09\x5f\xd8\x41\xd3\x6a\x29\xf8\x3a\x31\x34\x5d\xf4\xa9\x21\x8a\x89\xc4\x3d\x02\xe6\x13\x13\xc5\xbb\xad\x05\xfd\x1e\x20\xa5\x20\x01\x70\xc3\x4a\x94\xca\x50\x89\x4d\x7b\xfb\x0a\x7d\x1d\x75\x44\xec\x95\xf5\xb7\x0d\x19\x60\x19\xff\xbb\x06\xb4\x5a\xde\x59\x5f\x8c\xfc\xe9\xe3\xf6\x14\x4f\x64\xe1\x22\xe6\x77\xe2\x91\x05\x91\x81\xf0\x0a\xc0\x5a\xe5\xb1\x68\x3f\xf9\xba\x60\xc0\xf0\x42\x88\x8e\x3f\xf4\x40\xc8\xbd\xa8\x0b\xaf\xee\x99\x5a\x83\x90\x61\x76\x68\x1d\x7c\x0f\xd5\x8b\xa1\x2f\xd9\x91\x2d\xc3\x77\x19\xc4\x38\x6c\xd8\x4b\xdf\xe3\x28\x66\x4b\x2e\xd6\xc1\xb2\x8f\x14\x5e\x2c\xb8\xfb\x06\x71\x74\x04\x91\x36\x84\xee\x80\x12\x90\x83\xdd\x06\x4a\x89\x76\x44\xa2\x39\x54\xd9\x0e\x0d\x2a\xc1\x52\xc5\xdb\x69\x21\x78\x43\x89\x4b\x47\xf7\x88\xcc\x0e\x19\x7a\x8c\xba\xe5\x73\xd1\xce\x0a\x76\x73\x18\x95\xaf\x31\x48\xc7\x91\x30\xfb\x64\x3a\xc6\xe7\xb8\xff\x5e\xc0\x42\xf8\x51\xac\x9e\x1c\x14\xd8\xdd\xf5\x61\x2b\xc8\x85\x38\x74\xf2\xc5\xf0\x09\xd6\x84\x0f\x45\x74\x5a\x26\x88\x85\x76\x54\x38\x4c\x95\x75\xf1\x66\xc7\xe0\x9e\xea\x65\xbc\x99\x51\x40\x57\x0f\x96\x5c\xc4\xa3\xc6\xa0\x29\x1f\xd8\x75\xb3\x09\x29\xf4\x6c\x78\xaf\xe5\x8e\xd5\x51\x8a\x25\x76\xbb\xda\x34\x21\x73\x5c\x8c\x5e\xf5\x0b\xc0\x6e\xca\xfa\x8c\x43\x98\x8e\xab\xe3\xd7\x3c\xf4\xe3\x05\x90\x38\xe3\xcc\x50\xee\x74\x62\x7c\xdc\x20\x8e\xbd\x44\x72\x5d\xf2\x5c\x11\xff\x57\x71\x94\x9b\x54\x19\x06\x92\x2a\x66\x2e\xa6\x8b\x84\x83\xa6\x35\xd7\x91\x79\xfd\x91\x9b\x5c\x9c\xbe\x52\x28\xf5\x42\xdd\x50\xf8\x46\x67\x5e\xcc\x6a\x08\xb7\x58\x43\xd8\x48\x44\x1d\xab\x09\x63\xdd\xa4\xf1\x4d\x7b\x69\x9c\xd1\x5d\x27\xed\x17\xb3\x2c\x6a\x73\x80\x97\xe6\xf0\x89\xbb\xfc\x20\xe5\x2d\xcf\xdb\xea\x14\x78\x0f\x93\x8e\xf3\x0e\x23\xa4\x3c\xe8\xf5\x02\x30\x90\xce\xd1\xc7\x32\x17\x56\xfd\xaa\x7e\xe3\x59\x63\x40\xa1\x0b\xb9\xdb\xb1\x2b\x79\x51\xc7\xe2\xf2\x74\x00\x23\x43\xa3\xc6\x83\x08\xc4\xcb\x94\x40\xdf\xbe\x09\xd5\x73\x4b\xc2\x18\xe1\xbf\xb6\x30\x8f\xfa\xef\xdd\xa3\x2e\xea\xbf\x44\xa7\x34\xee\x60\x41\x4b\x24\x25\x25\x72\x19\x9a\xbd\xd2\x16\x88\x07\x39\x22\x0c\xc7\xde\x84\xb2\x70\x69\x8a\x55\x1b\xa4\x29\x16\xbb\x16\xa0\xbd\x02\x90\xeb\x77\xa2\x5a\x0d\x71\xe3\xf2\xcd\x60\x1c\x22\x6b\xdd\x58\xa4\x8c\xa9\xf8\x81\x87\x37\xff\xef\xb2\xd1\x83\x86\xc2\x14\xa1\x9d\x29\xba\x91\xfa\xdd\x94\x6f\xbf\x8d\x84\xce\xcb\x23\x07\x02\x3a\xa9\xbf\xba\x51\x9f\x95\xe3\x9b\xf5\x19\x10\xe0\xf3\xaa\xda\x8c\x58\x82\xe0\xec\xc6\xc0\x66\x0e\xb1\x91\xa6\x0c\x12\x3e\xf5\x2d\x77\x68\x23\x14\x42\xab\xa7\x7e\x2b\xc2\xc6\x66\x7e\x07\x04\x67\x42\x11\x04\xb8\xce\xd6\xf5\xa8\xce\x97\x96\x82\x89\x40\x04\xb4\x9a\x2b\xfd\x07\x1d\x1a\xbb\x82\x23\x61\xbb\x77\x60\xe0\x3e\x35\xd8\xfa\xf6\xab\x5e\xc3\x49\x6a\xb0\xf5\x9d\xf7\x3b\x8c\xfd\x87\x06\x77\x6e\x6d\xf5\x96\x3b\x36\x41\x91\xaf\x5b\x8b\xd0\x67\x1a\x49\xe8\x66\x34\xb8\xf3\x35\xa5\x0e\xf4\x0e\x45\x83\x3b\xdf\xdc\x59\xc3\x9f\xf1\x9b\x4f\xfe\x8c\x7f\xa8\x3f\xe3\x78\x3a\xbf\xb8\xef\x93\xab\x7d\x38\x7f\x3e\x55\x0d\xa0\x09\x41\xb3\x86\xf9\xea\x7c\xda\xd6\xf1\x51\xdb\x08\xd8\xd8\xbb\x1b\xca\xfe\xcf\x8a\xd3\xb2\xc6\x9b\x16\x7d\xa7\x6a\xef\x3c\xe5\x25\xd2\x18\x4a\x3f\x36\x88\xa8\xb3\x20\xa2\x3d\x52\xee\x28\x46\xc3\xbb\xe2\x10\x33\x36\xc0\x17\x38\xbd\xe8\x40\x91\x91\xaf\xe4\x59\x35\x42\x68\x00\xb2\xfe\x0c\xa9\xba\xc3\x49\x55\x1f\xcf\xca\xe9\xfc\x90\xd3\x25\x62\x3d\xb7\x96\xd0\xdf\x73\x1d\x94\xf1\xb4\x4a\xac\xfa\xee\x04\x6f\x21\x84\x6e\x0e\x32\x57\xd2\x73\x58\xc6\xa2\xe0\xe0\x83\x63\x90\x8d\x13\x61\x7b\xf0\xa2\xb8\xb2\xb0\x63\xed\x63\x63\x7b\xe6\x80\x68\x80\xd2\x2d\x05\x4d\x4a\x6f\x37\x9c\x07\xe5\xd0\x25\x66\x0e\x29\x0f\xde\x72\x36\xdb\x33\xbe\x5b\x31\x78\x20\xcf\xeb\xf5\x94\x8e\xfe\x7e\x8c\xd2\x7d\x32\x53\xd4\xe8\x92\x44\x81\xb3\x21\x70\xad\x27\x41\x75\x0b\x64\x68\x4f\xb6\x15\xcc\xd0\x00\x33\xc7\x8d\x4d\x0a\x6f\x5e\x4a\xb1\x6f\x39\x24\xe3\x69\x25\x59\x24\x80\xca\x58\x8c\xc9\x42\xe9\x9c\x3e\xa8\xb1\xc5\xb8\xc8\x27\x35\x75\x9d\x4b\xa0\x23\x37\xe3\x5f\xe1\x7a\x7e\x31\xe1\x44\x12\x2a\x91\xe2\x78\x97\x33\x49\x63\xe3\xa6\xed\x1d\xd5\xba\x25\x9b\x47\xa8\x50\x07\x73\x59\x12\xe7\x80\xc2\x71\x85\xdb\x05\xb7\x2a\x6a\x4e\x42\x83\x7d\x95\x2c\xc7\x2b\x99\xd6\x7a\xf1\x31\x29\x66\x4f\x42\x48\xed\xc6\xb5\x6d\x9a\x6e\x8e\x0c\x71\x85\x2d\xb7\x0b\xf0\x81\x77\xfd\xe7\x02\x91\xe1\xd0\xa1\x51\xd9\x34\x34\x9b\xc5\x02\x1c\x8f\x25\x82\xbc\x2b\x2e\x11\x62\x82\xdf\x6f\x91\x66\x2e\xc7\x79\xb8\x2c\xef\x6a\xab\xe2\x66\x2b\x9a\xb9\xfd\xd9\x85\x40\xae\x89\xcf\xae\x51\x28\x66\xc6\x06\x1d\xa0\x90\x3e\x59\xbc\xe6\x71\x88\x53\xad\xa1\x3e\x82\xf1\x51\xc1\xb2\x9c\xd0\x10\xc4\xd5\x60\x43\x0f\xe7\xb8\xe8\x32\xe7\xdf\x75\xc8\x85\x30\x4f\x1b\x5d\x68\x19\xbc\x6e\xcb\x2a\x6e\x7a\xc5\x3f\x66\x3e\x8d\x64\xb6\x39\x69\x88\x70\xee\x06\x9b\xd3\x14\xfb\x29\x25\x3f\xc0\x90\x4f\x0b\x0f\x98\xdc\x6c\xe5\x61\x64\xd5\xdb\x0a\x0e\x12\x6a\xa8\x0d\xeb\x07\x99\x3f\xbc\x10\x1e\x4e\xc6\x55\x46\x3f\x40\x6c\xc3\x2f\xc9\x7c\xa4\xae\x10\xc5\x61\xc9\x09\x49\xb5\xdf\x6b\x6a\x4b\x60\x7d\xa8\x71\x4a\x29\xc9\xed\xb2\x39\xda\xc9\x5d\x75\x2c\x4b\xa2\xc9\x84\x0b\x44\x57\x7c\x73\x5f\x6f\x5a\x05\x6b\xdb\x1c\xa4\x8b\x6b\xd7\x56\xce\xa2\xe5\x12\x94\x7b\xd9\x42\xf0\x20\x78\xea\xb9\x5b\x1b\x46\x32\x58\x7a\xc7\x53\xd1\x78\xa8\x83\xe6\xab\x65\x8c\x45\xd0\xf2\x55\xd9\x8a\x24\xf3\x60\xc9\x31\xe0\x1f\xbe\x4a\x91\xf2\x0d\xd2\xfd\xdb\x4f\xe9\xc0\x3f\x16\x95\x8e\x62\x62\x0a\x79\x44\x45\xf0\x26\xa1\x9b\x4f\x92\x82\x5f\xf7\x04\xfb\xf5\x80\x94\x73\xd5\x04\x82\x69\x33\x32\xdc\x0e\x42\xb8\xe8\x7c\x77\xba\xc8\x67\xa8\xc4\x93\x68\x3d\xe4\x0c\xe1\x2e\x27\x1f\x5c\x84\x82\x7e\xd8\x8c\x02\xc3\xe2\x68\x71\x7a\x2a\x0a\x64\x5a\x05\x0c\xe0\x88\x9e\xa6\x93\xe1\x08\x71\x15\x87\x20\xa7\xb8\x48\x79\x39\xf4\xe5\x7d\xc6\xb4\xa3\x59\x75\x5e\xb3\x33\x3a\x7d\x94\x40\x55\x9f\xcb\xd5\xee\x22\xc2\xd7\x68\x79\x7f\x21\xc7\xb8\x0e\xc3\x10\xba\x91\x52\x4d\xae\xae\x48\x48\xbf\x5d\x52\xa9\xec\xa1\x62\x0a\x36\xc2\x2b\xde\x16\xc7\x0b\x8e\xc6\xd7\xe6\xf2\x8a\x22\x63\xeb\xed\x4a\x6b\x25\xe5\x15\x6f\xb9\x4e\xe8\xfd\x4d\xf8\x3f\x95\x32\xf4\x3a\xfe\xe8\x65\x36\x5e\x85\x86\xa2\x84\x0f\x9e\x00\x6f\x39\xeb\x6e\x0b\x39\x63\x12\x1d\xbc\xef\x3e\x1d\xbc\x8f\x75\xf0\x10\xa6\x77\xc6\x25\x1a\x18\x3f\x2e\xdf\xa2\x4a\xbe\x85\x43\xa6\x92\xcf\x46\x0b\x00\xcb\x5f\x16\x47\x21\x07\x1b\x7e\x0b\xc3\xa8\x00\xeb\x42\x9f\xff\x7f\x8b\x62\x51\xec\x4e\x7e\x42\xa9\x5f\x97\x8e\x92\xe8\x3e\xc3\xca\x40\x0e\xfe\x0b\x4b\xd2\xdb\x5a\x0b\xde\x6d\x96\x13\x64\xed\xdb\xee\x6e\x46\x57\x5c\x3c\x35\x55\xbc\x39\x24\xb1\x07\xcb\x9f\x8f\x11\x49\x9c\x48\x84\x01\xcd\xc6\xce\x47\x1d\xce\xd1\x61\xd8\xeb\xa1\x58\xa3\x4f\xe9\x85\xd8\xec\x88\x91\x2b\x6c\x18\xc5\x0d\x5a\x4c\x90\xa1\x76\x32\x5b\x35\x5a\xc1\x76\x0e\xd5\x40\x16\xf5\xc6\xb8\x10\xa2\x75\xf9\x3c\x7d\x46\x61\x3c\x8f\x70\x38\xc4\xa3\x4a\xaa\x0d\xa2\x74\x79\x54\xf7\x2b\x4e\xf4\x59\x1f\xf6\xc3\xfa\xea\xa5\xe0\xea\xb3\xe2\x1c\x4f\xfb\x08\x89\xa1\x09\x3b\x4e\xbb\x7c\x1d\x08\xa2\xe4\xbe\xb3\x62\x18\xd4\xcc\xee\x03\xcc\x29\x88\xe1\x66\xc2\xf7\x6d\x83\x98\x90\x80\x8e\x06\x9c\xb1\xb0\x2e\x48\x9d\x40\x2b\xdd\x77\xb8\x85\xb1\xeb\xbe\xb4\x6c\x90\x8c\xea\x1a\xcc\x92\xf4\xe2\x77\x34\x8e\xf4\xdb\xdd\x07\xfa\xde\x8c\xc7\xca\x74\x19\xd0\x00\x44\x62\x70\x64\x03\x0a\x01\xc7\xdf\x63\x14\xaa\xd2\x61\xcc\xb9\xe4\xb4\xac\x44\xa5\x31\xc0\xbb\x1c\x74\xd1\xf9\x1c\x6c\x7d\x49\x04\xce\x77\xb7\x3e\xe1\xd9\x8f\x89\x67\x1f\xd1\xe1\x2b\x66\x11\x8d\x23\xf6\x06\x37\xd0\x76\x61\x39\xfa\xd5\x06\x12\xd8\x57\x3f\xa9\x88\x72\x87\x6e\x7f\xb4\x87\x37\x87\x2d\xac\x96\x28\xa1\xb5\x9f\x21\xb3\x32\x54\x23\x1a\x53\xc9\x7c\x48\x0a\x43\x7f\xa1\xf3\x9b\x0a\x32\x16\x95\x08\x6a\xab\x00\x2d\xae\x43\xef\x83\x92\x2f\xa6\x9a\x2d\x3b\x2e\x2b\x5f\xae\x9e\x5a\x0f\x93\x4a\xe2\x0a\x0a\x96\x8c\x43\x8d\x99\x6f\xa6\xc6\x8b\xc9\x11\x42\x47\x31\xdc\x3b\x9e\x55\xa3\xd1\x33\x54\xfd\xb3\x80\x33\xac\xdd\x52\xee\xba\xe1\xf5\x1f\x96\xe4\x38\xe1\x02\x09\xc7\x06\xc6\x84\x6b\x11\x3d\x37\x0c\xfa\x3f\x67\xbf\xdf\x30\x72\xd1\x83\xa7\x8f\xcd\x90\x2f\xb3\x67\xdc\x28\x3a\x9c\xe5\x25\x25\x8e\xaa\x66\x2a\x01\x16\x2e\x94\xad\x96\x4b\x0c\xe6\x2c\xcd\xb5\xff\x13\x6b\xad\x49\x51\xbb\x04\x6b\xee\xaa\x3f\x81\x99\x70\x77\xc6\x39\xd5\x89\xb6\x76\x9d\xa7\x3f\x10\xe5\x55\x35\xc4\x68\xa2\x39\xdd\x93\xf9\xf1\x99\x44\x5a\x9f\xa3\xb1\x20\x5f\xbe\x8b\xc9\xa4\xc0\x0b\x3e\x87\xd3\x0c\x73\xe2\x96\x00\x17\x23\x1d\x9f\x8f\x58\xc6\x83\x35\x25\xba\x08\x06\x20\x45\x1b\x5b\xba\xb5\x87\x95\x0a\x46\x47\x17\xce\xc5\x8a\xad\x4d\x25\x00\x81\x33\x13\xad\x8e\x08\x49\xcd\xb0\x1a\x5f\x8e\x2e\xfb\x18\x5a\x7d\x70\x8e\x5f\x97\xf4\x78\x42\x9c\xbd\x22\x5c\x96\xbe\x11\x5e\xf7\xde\x98\x14\xe0\x1a\x90\x91\x2f\x16\x41\x3e\x56\xa0\xf7\xcf\xa9\xd4\x43\xb8\xd0\x59\x60\xd0\x9d\xa8\xa4\xcd\x45\xe0\xe2\x2d\x0b\xfb\xc3\x55\x76\x21\x37\xe9\xfb\xc3\x6a\x06\xb5\xb9\xd3\x28\x84\x47\x63\xa8\x0f\xcb\x59\xcd\xdd\xc3\xf4\xba\xae\x0b\x2b\xdd\xe2\x9a\x6a\xfa\xfd\x42\x98\x22\xce\xe9\x44\xa1\x62\xd1\x88\xe9\x0c\x78\x9f\x7c\x76\x7c\x46\xde\xa6\x70\xcb\x65\x4c\x38\x21\x9b\x8e\xf9\x76\x3c\x50\xe8\x5d\x7e\x5f\xbe\xfc\x04\xd7\xc5\x5f\x8b\x02\xb3\x14\x77\x83\x7b\xb4\x79\x33\x73\x66\x32\x4b\x04\xdd\x0b\xae\xde\xbb\x5a\xc6\xd2\x18\xf7\x6c\x3b\xae\x84\x8e\x1b\x31\xc7\x01\xc9\x42\x24\xc2\xf9\x92\xe1\x79\xa9\x66\x4f\x44\x45\xea\xff\x91\x30\x32\x48\x8d\xd5\xa7\x8e\x4c\x8d\x32\xfc\xe8\x06\xa8\xf1\xa2\xd1\x33\x9e\x2f\x7c\xd8\x1b\x83\x76\xfb\x70\x85\xe1\x23\x0c\x70\xbf\x42\x82\x64\xc9\x0c\x90\xda\xb0\x55\xe7\xe7\xd5\xb6\xe8\x8c\xe9\xf5\x6c\x23\x20\xd5\x43\xe2\x6b\x17\x98\xd2\xee\x91\x6f\xcc\x38\xec\x84\x74\xe5\x72\x10\xa3\x29\x86\x78\xd4\xb6\x6a\x57\x85\x82\xb0\xa0\x1d\xe5\x39\x80\x78\x75\xae\xc1\x47\x1e\x55\x64\x89\xe4\xd3\xb8\x39\xd8\xeb\x71\x9e\x71\xf5\x41\xeb\xd4\x14\xe7\x80\x71\x93\x51\x82\x89\x39\x2a\x39\x64\x02\xab\x0d\x74\x8d\xf3\xd8\x3c\x47\xeb\x37\x0e\x32\xa2\xf1\xcc\x28\x5a\x82\x42\x8b\x18\x63\x20\x58\x73\xf0\x21\xc9\xc7\x1d\xca\x02\x7a\xce\x17\x2e\x92\x11\x20\x25\x01\x04\x95\xba\x84\xc0\x7a\xf4\x28\x10\x33\x8b\xb0\x37\x34\xad\x18\x86\x35\x41\xd4\x73\x8c\x66\xfb\x24\x3e\xf0\x2b\x4a\x51\x19\x87\x05\x63\x49\xd6\x04\xfc\xaf\xdb\xb7\x6f\x7d\xe5\xf2\xb0\xeb\x89\xbc\x17\xed\x0b\x42\x8f\x38\xcf\x6b\x19\x05\x56\xbb\xfe\x1e\xf0\x28\xb1\xba\x2b\xca\xb0\x69\x5a\x37\xd8\x3d\x28\x74\x19\x26\xe1\x46\xc0\x85\x49\xc2\x9f\x74\x2f\xce\xb6\x21\xfb\x3e\x1b\x05\x26\x0e\x0d\xb0\x4a\x36\xe0\xc2\x3f\x34\x21\x31\x8d\x99\xc3\x32\x04\x5f\x1d\x89\x8d\xd9\x24\xcd\xfa\xaf\xc2\x43\xa0\x14\xbf\x1d\xca\xfb\x53\xff\x2d\xf0\xaf\x9c\x80\x58\x90\xba\x73\x59\x13\xed\xf0\x37\xb4\xca\x91\xf8\x4f\xdd\xe3\x23\x7f\x1c\xeb\x98\x04\x69\xa7\x3b\xba\x7c\xb2\xa8\x8f\xe3\xa3\x6e\x58\x33\xc5\x3f\x1b\x8a\x13\xbb\x7b\x55\x4c\xd0\xf8\x6a\xe8\x33\x0a\xbf\x8a\x39\x36\xb6\x58\x83\x2f\xbf\xee\x3e\x79\xf0\xf4\xd7\x57\xbf\x6c\x3f\x79\xf0\x68\x67\x90\x24\x48\xfb\x70\x3e\xe0\x7e\xc1\x8b\xf6\x47\x39\xf4\x99\x69\xa1\x2e\xe6\xbf\xb4\xf1\x83\x61\xb7\x0a\x42\xab\x37\x14\x26\x12\xbe\xf0\x16\x41\xd0\xdd\x8e\x4e\xcf\x2b\xa3\xf9\xcd\xb2\x0e\xa4\x08\xc5\x29\x97\xdf\xbe\xd1\xb2\x6e\xb6\x19\x89\xc9\x96\xb4\xa9\xed\x58\xa9\xc5\xfe\x2c\x47\x03\x80\x50\x56\x51\xa3\x93\x02\x53\x38\x8c\x82\x8e\x16\x47\x47\x88\xb2\x7e\x0f\xf9\x82\xd6\x17\x34\x87\xe9\x5b\xc9\x02\x9e\xaf\x36\x12\x28\x76\x39\xfe\xc1\x31\xb0\x70\xaf\xaf\x6f\xb6\x88\x06\xb8\xbe\x73\x0d\x42\xd7\xd1\xff\x8f\xbd\x77\xed\x6f\xdb\x48\xf2\x46\xdf\xeb\x53\xc0\xfa\x9d\x0d\xc9\x04\x86\x2f\xca\x95\x8e\x93\x55\x6c\x65\x46\xcf\x46\xb6\x1f\x4b\x99\xec\x1c\xaf\x8f\x09\x91\x90\x84\x31\x49\x70\x08\xd2\xb2\x36\xd6\x77\x3f\x5d\xb7\xee\xea\x46\x83\xa4\x64\xd9\xc9\xec\xda\x2f\x12\x11\x68\x54\xdf\xaa\xab\xab\xab\xab\xfe\x85\xbe\xfd\x70\x2d\xbd\x58\x00\xfa\xe0\x58\x06\x24\x30\x4a\x0a\x85\x5d\x0b\xa5\xc3\xa1\xf2\x74\xb1\xec\x7c\x5b\x39\x86\x0a\x1d\xca\x2a\x73\x12\xc4\xfc\xc0\x44\xac\xf1\x8f\xbf\x5d\x58\x33\x89\xab\xd7\xa1\xef\xb0\x9d\xc2\x28\xa2\xb3\x9f\x60\x88\x8b\x11\xf6\x5a\x7b\x81\x7a\x4a\x4d\x30\x46\xf2\xc0\x33\x3d\xd8\x3b\x43\x7a\x47\xb2\x49\x87\x53\x35\x7c\x66\x9d\xf2\x70\xa9\x39\xc9\x67\x22\xea\x84\x48\x30\x0f\x6d\x2f\x69\xb4\x8b\x1f\x47\x78\x51\x6c\x55\xf8\xd4\x4b\xef\xa4\x3a\xda\x53\xb2\x2b\x8d\xb0\x6b\xde\x30\xae\x05\xfc\x3a\xcc\x67\xa6\x0b\x9f\x18\xf6\x43\x32\xec\x23\x1c\xe3\x3f\x31\xc7\x12\x13\x14\x7f\x10\xcb\x32\xd2\xc1\xa1\xdb\x6d\xd5\x18\xcd\x8b\x93\x79\x51\x9f\x79\x49\x56\x58\xe1\x36\xc3\xd0\xdc\xa1\x75\xad\xf2\x2d\xf5\x3f\xba\x48\x69\xf3\x4b\x93\x0e\x51\xea\xa4\x96\xba\x6a\xa0\xd7\xad\xd6\xf9\x8b\x18\x38\x71\x66\x56\x6c\x33\xe1\x6c\x05\x6e\xf2\x73\xad\xb0\x98\xde\xae\x3a\x33\x41\xe4\x3c\x9e\x38\x56\xd9\x4a\xa3\x3a\x8f\xef\x48\x0e\xb1\x6b\xb8\x3a\xf1\x36\x80\x71\x60\xd9\xe6\x5f\x8c\x3c\x0b\xdc\xf0\x62\x68\x16\x25\x01\x8c\xbb\xaf\x07\x6c\x48\xe0\x08\xa1\x41\xa6\xd9\x85\x8d\x45\xd9\x31\x19\xe1\xf9\x67\xb7\x79\x00\x4a\x75\xd7\x6d\x4e\xdc\x13\x86\xef\x93\xc6\xae\x1a\x90\x79\x81\xb9\x3c\xba\x11\x3a\x9b\xd8\x73\x65\xae\x7c\x5b\xae\xb5\xf6\xf5\xef\xef\x7c\x97\xb6\x19\xf3\xfa\xf7\xbf\x44\x9f\xd5\x78\xda\x0e\x6d\xca\x33\xcf\xee\x37\xee\xca\xc5\x52\xd7\xbf\xff\xdd\x97\xa9\x6f\x92\x33\x8f\xbe\x4b\x43\xcb\x5b\x7f\xe7\xfe\xfd\xb4\x69\x34\xeb\xef\x7c\xbd\x93\xae\xb6\x86\x99\x22\xdf\xa1\x41\xfa\xde\x8d\x3a\xcb\x7e\x32\x50\x37\x0d\xd4\x2d\xf6\x69\x71\xae\xde\x7a\x6f\xff\xd8\xcd\xb2\x2c\x08\xc0\x49\x61\xd3\xf8\xe3\xfa\x05\x1c\x92\xc2\xc1\x0b\x63\xb2\xe8\xf9\x1b\xcc\x6e\x04\xd1\xa7\xe3\x31\xfb\x91\x06\x39\x7c\x6a\x8c\xd7\xad\xe6\x72\xf4\x37\x9a\x7c\xad\xf3\x0e\x60\xac\x39\xa4\x27\xc9\xf1\x62\x4e\xa5\x37\x40\xe8\x73\xc4\x79\xc8\x1d\xf6\x5a\x85\x69\xfc\x95\xfd\xc0\x7a\x09\x4c\x4d\x13\x49\x14\x05\x09\xd5\x4d\x93\x66\x39\x80\x5f\x9b\xa5\x80\xb1\x63\xcb\x21\xec\x64\x8c\xa3\x6e\x7a\x39\x33\xb3\x39\x02\x13\xef\x02\x63\x57\xd1\xec\x69\x38\x91\x82\xd7\xcc\xa4\x43\xf8\x21\x7b\xb2\x0a\xc0\xdb\xef\xd0\xba\x3e\xc7\x54\x5f\xf6\x18\x00\x9d\x6f\x15\x73\x1e\x2a\x0b\xe8\xa6\xe2\xbf\x10\x32\xdb\x6b\x07\x86\x46\x62\x03\x53\x3c\xaa\xb3\x6b\xd5\x9d\x2b\xa7\x75\xd6\x18\x75\x04\x71\xd2\x79\x35\xd7\x0c\xd4\x11\xfb\xe3\xa8\xc4\xe0\x45\xaf\xd0\x63\x7a\x66\xcb\x18\x3e\xe6\x00\xc7\xe7\x41\x86\x14\x97\x47\xdc\x6d\x0a\x46\xa8\xff\x6c\xfa\x8e\xc8\x9d\x66\x9e\x25\xfc\x19\xf3\x6a\x42\x29\xc0\x7e\xaf\xeb\x25\x9b\x92\x85\x05\xd1\xb3\x95\x21\x14\x28\x13\x15\x19\x70\xc2\x48\xa2\xcc\xed\x76\xa3\xe5\x64\x72\xd1\x74\x61\x54\x6a\xcb\x3d\x96\xe0\x7c\x6b\xb7\x32\xe6\xe9\xf7\x4b\xd9\xf6\xd4\xc0\xc9\xa3\xdf\x9b\x11\x4d\x36\xfc\xc6\x9c\xb0\x2f\x65\x7b\xbc\x4a\x35\x1d\xc3\x19\x9d\x68\x05\x78\x68\xa7\x28\x29\xec\xa3\x4f\xbe\x7d\x36\x1c\xfa\xa4\x0a\xda\x71\x50\x0a\x86\x5d\xde\x5e\x48\x7b\x28\xda\xe9\x37\xb3\x2a\x5c\x92\x0e\x9d\xed\x2c\x05\xc6\x95\x01\x8d\xf7\x48\x4a\xb9\xd8\xa4\x46\x27\xf8\x79\x7b\xc0\xd7\xfb\x84\x7a\x01\xff\xbc\x70\xfc\xeb\x01\x87\x75\x76\x83\x6c\x3e\x94\x30\x8c\x57\x3f\xba\xc0\x72\xc0\x17\xdb\x0b\x41\x56\x01\xee\x40\x80\x7b\xa6\x70\x3a\x82\x70\xb1\x67\x70\xe9\x46\x51\x5f\x90\xaf\x50\xfb\xf8\x67\x36\xb5\x61\x40\xed\xac\x18\x1b\x6a\xb5\x0a\x0c\x8b\x84\x84\x85\xdd\x52\x13\xeb\x31\x37\x96\x53\xbc\xfa\x12\x91\x1e\x6d\xe0\x96\x8c\x46\xed\x8d\x3d\xc1\x69\xfe\x71\x13\x50\x4e\xe0\x4a\x07\xb0\xa1\xbd\xa9\x38\x10\xd8\xac\xab\x4c\xc1\xfb\x8d\x62\x7c\xf8\x4c\x31\x1c\xa2\x00\xc0\x82\xb4\x7b\x0b\xc2\x84\xf2\x6b\xc4\x0b\x27\x48\x49\xcf\x75\x9a\xe5\xa9\xe5\xa4\x75\xc2\x0a\x00\x3f\x29\xd6\x9b\xe1\xd9\x38\x2d\x0f\xe7\x58\xa6\xfc\xcb\xc4\x56\xb4\xb9\xe0\xf6\x7a\x56\x98\xf3\x77\x8d\x39\xb2\x2a\x33\x1a\xa3\xe5\xcc\xba\xb6\x60\x3e\x41\x41\xc6\x37\x5b\xf5\x9b\xaa\x34\x9b\xec\x2c\x9f\x4c\xe8\x49\x95\x4c\x96\xc3\x33\x07\x5d\x2d\x8d\x79\x04\x36\x6b\xde\x01\x3a\x41\xe0\x5b\x2b\x50\x69\xe3\xe3\x2f\x1e\x62\xe1\x2f\x92\x4e\x1f\x50\x9f\x04\xa6\xc0\xc3\x21\xed\xc1\xeb\xb4\xe3\xc7\xbc\xcd\x25\x3c\xe1\x37\xc4\xcb\x78\x4a\x9e\xf8\xb7\x6e\xf9\xa3\xfc\x22\xac\x90\x59\x7d\x5d\x29\x6f\xe2\x05\x75\x28\xac\x8f\xa7\x57\xdb\x55\xd5\xec\xf1\xfd\xe8\x6f\xe6\x6c\x6e\x37\x74\x9b\xad\x50\x89\x15\x14\xb0\x02\xc9\x06\x2e\x82\x17\xd5\x12\x36\x36\xf8\x1f\x05\xf8\xba\x9b\x89\xca\xa1\x19\x11\x73\xc3\xb4\x90\xd2\xd0\x8f\xa7\x9d\xbc\x56\xd0\xaf\xc2\x8b\xe0\x16\xdf\x52\xa0\xb6\x60\x64\xbf\xc5\xcf\xcd\x9f\x3e\x16\x34\xd7\x7d\x53\xc2\xa2\x11\x92\xdb\x59\xa1\x54\x11\x40\x84\x20\xd3\xe7\x00\xee\x74\x0a\x32\x83\xf6\x21\x2f\xf2\x58\x32\x82\xb6\x8b\x02\x9e\x74\x2a\xe8\x2f\xec\xf5\x20\xc4\x7f\xe8\x28\x40\x2a\x20\xbc\xc7\xa7\x91\x10\x3c\x03\x51\xf0\x03\x41\x29\x37\xe8\x2e\xbf\x9f\x8c\xd7\x7b\x8d\x4e\x8b\xbe\x11\x82\x47\x13\xf3\x93\x28\x94\xe7\x71\xbd\x01\x4b\xa6\x9e\x9a\xe5\x45\x37\xaf\x8c\x1e\x67\xad\x2b\x98\x75\x1d\xf0\xbc\xb2\x52\xb7\x23\xf8\x75\x9e\xcf\xcb\x45\x53\x6f\xd9\xb4\x35\xf8\x3c\xda\x98\x50\x8e\xfa\x0b\x9a\xfe\xad\xd6\xcb\xa4\xe5\xa0\x8e\x39\xba\x97\x61\x77\xd9\x8c\xb2\xf7\xd6\x1c\x40\x31\xdd\x29\x7d\xd7\x9c\x68\x7c\x1c\x6c\x6f\x5b\x51\x46\x40\x15\x22\x00\x27\xb2\x0e\xcf\x9e\x14\xb4\x10\x45\xee\x6c\xa6\x77\x77\x06\x3b\xd8\xe2\xec\xb2\xe6\x44\x66\x47\x42\x41\xf8\x4b\x8a\x54\x76\xe5\xeb\xb7\x6f\x9a\xd7\x94\x83\x1b\x30\x32\x5a\xe0\xec\x8e\xa5\xb5\x03\x7f\xca\xde\x0f\xa1\xa0\xa9\x22\xb8\x2e\xfa\xa0\x05\x9d\xdd\x29\xe2\xe4\x90\x3b\xbc\x37\xe6\x8c\x88\x72\x5c\xf0\x6a\x47\x0b\x43\x88\x54\xb0\x4a\xba\xd8\xcd\x85\x2f\xcf\xd9\x76\xc7\x09\x28\x40\xea\x36\xa8\x51\xea\x0b\x0d\x6b\x10\x85\x34\x10\xbf\x72\xae\x28\xc6\xb5\x41\x11\x6f\xa8\x57\x30\xa7\x26\x29\xec\xf9\x48\xa0\xfa\x2c\x96\x86\x63\x43\xd0\xa5\xcc\x9b\xba\x4a\x85\xad\x44\xcf\xb2\x03\x99\x25\xfb\xb0\x15\x13\x2d\xef\xeb\xdb\x80\x8f\xc3\xa5\x52\xc2\xe3\x61\x78\xb2\xe6\xe0\x1b\x2a\xa7\x53\xcc\x85\x01\xe7\x58\x22\xc6\x78\x80\xc5\xa2\x98\x4f\x00\x96\xf1\x1c\x3e\x7e\x5d\x4e\x31\x6c\x90\x67\x91\xdb\xac\xf8\xde\x41\xc7\xff\x21\x2b\x00\x1c\x30\x30\x2d\x8c\x64\x8c\x71\x0b\x39\x75\x27\x8f\x60\x08\xbd\xf5\xb3\xc1\xf2\xd9\x64\xf6\x35\xb7\x00\xc8\x31\xb8\x8e\x9c\x97\x70\xf0\x26\x6c\xc6\x02\xee\x71\x2c\xf6\x13\xa5\xb2\xe1\xf4\x62\x16\x1c\x82\x9e\xc2\x2e\xaa\x49\x51\xe7\x00\x96\x2c\x87\xfc\xcc\x10\x42\xbb\x20\x86\x97\x76\xa4\x10\x28\x4b\xe6\x08\x9a\xf7\x22\x9f\x8f\x2f\xb2\xe4\x71\x71\x22\x59\xcc\x99\x16\x0c\x85\x52\xb9\x79\x0e\xb3\x56\xf9\x1f\x03\xfc\x5f\x0f\xf9\xef\x27\xea\x87\x7f\xab\x54\x16\x5f\xe3\x0e\xe1\x55\x24\x52\x7d\x5c\x55\xaf\x6b\x84\x80\xf2\x6c\x6a\xc2\xed\x16\x96\x89\xcd\x90\x98\x48\xc5\x27\x83\x83\x22\xbd\xcf\xbc\xb7\xfa\xca\x3c\xcc\x8d\xe0\x98\x59\xcb\x8c\xd6\xd4\x0c\xad\xcb\x7f\x85\x49\xfe\x67\x5b\xee\xfd\x62\xd2\x56\x63\x46\x7c\x77\xff\x93\x5f\xf6\x47\xf2\xcb\xb6\x61\x8b\xad\x8e\xd7\x8f\x9f\x1e\x58\xf0\x19\xcf\x9c\xad\x5e\x58\xa7\xeb\x2b\xc5\xc8\xb8\xec\xca\x62\x69\x6e\xf5\xd5\x6e\x2d\xe6\xd3\x69\xfa\x6b\xbb\xe7\x5e\xc9\x46\xf8\x67\xc3\xa0\xef\x15\xf0\xbe\xfd\x89\xa2\xda\x74\xb4\x41\x84\x40\xa4\xd4\xfb\x67\x86\xb6\x5f\x9b\xb1\x5f\xf5\xa9\x7e\xed\x67\xc4\x2e\xe6\x27\x91\xf2\xf0\xd8\x2b\x87\xae\xb9\x86\xf3\xdf\x46\x0a\xdb\x77\xd7\x74\x4c\xf7\xf9\x8e\xad\x00\x0a\x07\xa3\x75\xae\xb3\x52\xc7\xd8\xe2\xa4\xf6\xd5\xc4\xfb\xaf\xf5\x10\xf4\x9b\x83\xd6\x28\x2c\xac\xdc\xd7\x3f\xfc\x52\x21\x60\x47\x84\x51\x82\x0f\x3c\x96\xef\x87\xa1\x35\xcd\xb2\xcc\x28\xfd\x56\x46\xf3\xbf\x09\x38\xa4\x1f\x47\xfb\xf4\x3e\x81\x99\xee\x3b\x5e\xf0\x5f\xda\x99\xed\x07\x5c\xe0\x17\xe3\x09\xed\xfb\x57\xc9\xb6\xc8\x8a\xed\xc3\xce\xba\xbd\xcd\xd5\x42\xa4\x7f\x7f\x07\x2f\x4a\x23\xd1\x3a\xe9\xaa\x65\xd5\xbf\xff\x95\x0b\x74\x96\xfb\xdc\xaf\xdd\x37\x51\xb9\x61\x4a\xec\xa4\xd1\xf5\xd2\xbf\xff\x8d\xfb\x36\x90\x03\x66\xff\xfa\x66\x43\xe8\x25\x58\x52\xe6\x89\xbb\x39\x76\xeb\xa6\xbf\x73\x6f\x27\x7a\x7b\x8c\x9b\xdf\xce\xa7\xcd\xef\xa3\x6d\x7e\xb3\xe5\xe2\xb0\x18\xaf\xd9\x01\x85\x45\x6c\xc9\xb8\xc4\xb5\xaf\x15\x8c\x11\x46\x17\xd4\x4f\x30\xe7\x95\xfe\x46\xbf\x11\x31\x7a\x52\x0d\x97\x91\xa2\xf6\xb1\x8a\xbe\xd9\x1d\xa2\xff\x48\xec\x3a\x3a\x7c\xeb\x07\xa3\x96\xf5\xfe\xf4\xb1\x21\x88\xea\xac\x8b\x51\x71\xf9\xc8\x6d\xab\xba\x23\x2e\x96\xc9\x1f\x02\x85\x90\x70\xa8\x87\x02\x85\x88\x8c\x26\x4b\x07\x33\x2b\xe6\x69\x52\xdb\xa1\x63\xc1\x90\x80\x17\x13\x82\xd4\xda\x2f\xb2\x7f\xd0\x35\x36\x04\xb6\xa0\xcf\x78\x49\x17\xe3\xc7\x00\x03\x44\x46\x24\xd4\xfa\xf1\x26\x15\x0f\xa0\x67\x7c\x2d\x0e\xb0\xc9\xc0\x30\xc7\xcb\x53\xc3\x0a\x6f\xcd\x2e\xd4\xe5\x5c\xdf\x98\xa2\x90\x10\x7e\x0c\xd9\x45\x25\x21\xab\x73\x88\x6a\x71\xad\xb2\xd7\xe4\x3d\x5c\x2e\xfb\xd1\x36\x63\xe5\x74\xec\xdf\x92\xac\xfc\x91\x8e\x4b\x94\xad\x69\x9c\x7d\xf6\x28\x9f\xe5\xc7\xe5\xb8\x04\x73\x74\x80\xb5\x17\xf8\xc2\xc2\x23\x40\xff\x17\xbb\x46\x17\x0b\x65\x30\xe4\x94\xbe\x03\x8c\xcc\xfb\x4f\x9e\xfd\x7a\xd4\x81\x62\xf8\xd2\xe5\x03\x81\x94\x5a\x1d\x05\x89\x1e\xf9\xf6\x68\xef\x3f\x8f\x76\x9f\xef\xed\x76\x24\x99\x76\x86\xa9\xb8\xcc\xf4\x8e\x78\x8c\x89\xd2\x7c\x59\x74\x1a\x1e\x62\x86\xb9\x6c\x9f\xf6\x5d\x6e\xca\xc8\x15\xa4\x65\xe8\x02\x4f\x4f\xe4\x94\xed\x31\x66\xd7\xc7\xdd\xb3\xb7\x1f\xee\xa3\xbe\xfe\xe1\x6e\xdd\xb8\xfe\xe7\x30\x85\xfd\xad\xe0\xe4\xe6\xcf\x45\xd6\x36\x09\x5d\x45\xb9\xc7\x29\x50\xda\xa9\xe8\x6e\xfb\x5f\xea\xfa\xc1\x5a\x43\x27\xab\x88\x17\xe8\xbf\xcf\xd1\x7b\xbf\x50\xeb\x63\x9f\xb2\x52\x3a\x36\x53\xd9\x3e\x29\x57\x62\x85\xd9\xb6\xd0\xd3\x6a\x5c\xd5\x0b\x06\x4f\x60\x4a\x90\xf0\xcb\xfa\x65\x98\x16\x9d\x2c\xc7\x84\x54\x6b\x36\x53\xa0\x03\x07\x67\xd8\x58\x39\xb1\x0e\x1a\x58\x28\x55\x3d\xbb\x4d\x8e\xaa\x09\x11\x04\x06\xa1\xdb\x31\x74\xe9\x48\x30\x21\x18\x3a\xf6\x95\xd3\x54\xb9\x54\xc0\x29\x1b\x3a\xcf\x06\x2d\x68\x92\x0b\x5c\x6e\xf6\xcf\xf2\xc4\x6c\x5e\x56\xf3\x18\xdf\x78\xce\x84\xcb\xf9\xcf\x1b\xf1\x0b\x99\xc4\xcb\x2a\x28\xde\x5a\x49\xa6\x26\x2c\xa0\x70\xe8\xf1\xd2\x4a\x22\x3e\xdb\x39\x7f\xcf\xa0\xd9\x64\x2d\x0a\x1a\xa7\x6c\x0c\x9e\xfc\x0d\x0b\x06\x09\x10\xae\xc4\xcf\x2b\x68\xc5\x79\xba\xd6\x3c\xed\xd9\xcc\x7d\x42\x69\xf8\xce\x1f\x34\x77\x01\x12\xde\x70\xd8\x7d\xab\xd9\x36\xe5\xfe\x17\xac\x12\xbd\xd2\x10\x0c\x8c\x33\xc8\xd9\x35\x82\xfe\x73\x35\x83\x98\x10\xc9\x04\xa4\x5e\x6e\x76\x85\x94\x37\x1b\xcc\x8d\x8c\x0e\x4c\xbe\x60\x53\x21\xfe\xb7\xff\x1d\x8b\xf6\x21\xb6\xea\x75\xb2\x9c\x45\x6b\x20\x13\x22\x94\x93\x8f\x44\x56\xd5\xa6\x3e\xf3\xb1\xfd\xe8\x10\x7e\xa7\x49\x31\x1d\xa9\x87\x7b\xd3\x91\xc2\x0c\xf1\x3a\x66\x97\x06\x52\xd7\xcb\xc0\x7e\xad\xe0\x88\x3b\x7e\x3d\x1d\x58\x88\xde\x87\x68\x34\x32\x8a\x4d\x01\x49\x65\x48\x41\x26\xb7\x2c\x19\x0f\x3b\x44\x59\x28\x45\xf9\xf8\xc5\x4f\xa9\x5b\xf8\x55\x16\x74\xce\x16\xc2\x4e\x06\x45\x4c\x57\x65\xf6\xc5\x45\xd4\xe6\xfd\xb4\x7a\x84\xab\xd3\x6c\x5c\x44\x20\xb6\xad\x79\x9d\xda\xdf\xfb\x96\x8b\xf2\x33\x8c\x2e\xe5\xd5\xda\xa4\xcc\x86\x78\xe4\xcc\xae\xe5\x48\xc2\x06\x9f\x93\xd5\x11\xef\x3f\x8f\x0b\x74\x2d\x71\x2d\x82\x3b\x3d\x21\x07\xc3\xbb\xbf\x87\x96\x4a\xce\xe7\xe7\xe8\x1c\xa3\x9a\x69\xd4\x57\x9b\x6d\x40\x2d\x58\x6c\x57\x46\xd1\xa3\x56\x68\x61\xd7\x82\xd9\x6a\x1b\x7f\x3b\x03\xb7\x89\x14\x88\x69\x1c\xfd\x6e\x67\x78\x96\x83\x89\xaf\x98\x77\xd2\xe4\x36\x8d\x08\x5e\x91\x71\x38\x59\xcf\xbf\x58\x1b\x79\x24\xcc\xec\xac\x27\xe0\xac\x84\xc1\x2d\x01\xcd\xa4\x9a\x93\x47\xb4\xac\x92\x42\xd6\x15\xe4\x2b\x37\xdb\xca\xfe\xde\x4a\x36\x6b\xa8\xc9\xb0\xad\x3e\x3d\x39\x01\x5f\x45\x5e\x07\x9e\xdb\x35\xaf\x35\x47\xc2\xe8\x2b\xb2\xf0\xee\xf2\x5a\xbb\x1b\xdd\x6a\x6b\x6f\xad\x1d\xae\x16\x22\xd2\x64\xca\x4d\x0d\xcb\x05\x36\x42\x12\x2d\x35\x11\x84\x8f\x1d\x13\x5a\xe1\x81\x3d\x34\xd4\xd7\xc8\x0e\xbd\xfc\xe4\xfb\x8a\xba\x9d\xc8\x25\x23\x7c\x81\xe7\x16\xd8\x70\xf8\x2e\xa4\xe6\x11\x90\x84\x20\x66\xb4\x3e\xb7\xe2\xa4\x5e\x21\x4e\xd2\x84\xc9\x7b\x72\x05\x06\xce\xcc\x02\xbf\xca\xf0\xb7\xdb\x0e\xcd\x68\xaa\x97\xe6\x97\xdb\xe1\xd8\xc9\x01\x4b\xc0\x2a\xb5\xe9\x03\xd4\x4a\xa5\xcf\x15\xcd\xcb\x2b\x49\xaf\x98\xc0\xf1\xe9\x35\xca\xec\x61\x8d\x07\xf9\xe2\x2c\x33\x9a\x4e\xd7\x34\x80\xa5\xbf\xcf\xd5\x37\x28\x8d\xb4\xe4\xa1\xf2\x24\x6c\x8e\xcc\xdc\x06\x02\x87\x96\x1e\xb8\xeb\xe6\xb3\xba\xe8\x82\x2e\x1d\xbc\x6b\x59\xd9\xd8\xe3\x48\xd1\xc6\x0a\x86\x01\xbf\x1d\x2d\x4e\xfd\xea\xfa\x3d\x97\x3e\x34\xd7\x60\x1d\xac\x41\xc7\x3c\x9b\xf9\xe8\xfb\x5a\x85\x35\xeb\x34\xcf\xc4\xfd\xfb\xdf\x7c\x9b\x86\x27\xdf\xfe\xce\x97\x88\x44\xed\xce\xb8\xfd\x9d\xaf\x04\x7c\xda\x3f\xc6\x9a\x17\xe4\x22\xff\xe5\x8d\xba\xc8\x7f\xb2\x99\x5c\xd9\x66\xe2\x05\x47\x5c\x07\xca\xe5\x6a\x16\xe6\xab\x21\x47\x1f\xee\x3d\xdb\x7d\xbe\x7b\xf4\xf4\x39\xb8\xdc\x41\x4a\x44\xef\xe1\xab\x5f\xf6\x9e\xfc\xe5\xe8\xaf\xe6\x9d\x7d\x24\xf1\xd8\x0a\x7a\xf4\x6d\x39\x59\x4e\xc0\x1f\xd2\x68\x50\x30\xfc\x82\xb9\x61\xa3\xe1\xe1\x02\x13\x42\xd6\x65\xa2\x67\x55\x5d\x97\xa8\x8a\x53\xf4\xbc\x39\x3c\x99\xed\xf0\xb1\x33\x13\x1c\xec\xfe\xe7\xab\xa3\xe7\x7b\x7b\xaf\x1e\xef\x3d\xc3\xea\xef\xdd\xbd\xeb\x6a\x74\x58\x7d\x10\x08\xbc\xff\x18\x20\x40\x4e\xca\xb7\x60\xfb\x58\xd6\x9c\x30\xd1\xe2\x02\x07\xe0\x28\x75\x88\x89\x32\x5d\x4e\x8e\x8b\xf9\xa5\x19\x31\x18\xdb\x5d\xc3\x8e\x25\x5c\x33\x43\x3c\xdc\x29\x23\xef\x38\x2d\x96\xa2\x02\x89\x24\xf2\x1d\x35\x5a\x87\xcf\x69\x7c\x13\x1f\xb8\xe3\x10\x3f\xef\x62\x45\x9e\x19\xc9\xcd\xc1\x17\xd4\x8c\x6c\x51\x71\xe1\x9d\xaf\x3d\xc3\xd1\x23\x62\x1a\xcc\xcf\x62\xc5\x9b\x65\xca\xe5\x6c\x36\x06\x1b\x90\x19\x11\x74\x1f\xa8\x0b\xe8\x23\x04\xe3\x73\xde\x41\x23\x05\xdb\x72\xbc\x96\xa3\x84\xfd\x64\x79\x50\xb3\xf6\x41\x22\x36\x14\xe8\x70\xdb\x0c\x08\x51\x40\xf4\xe1\x0d\x60\x4c\x5d\xdb\x1b\x0d\x2d\xa6\x23\xa1\x6d\x5b\x11\xcb\x77\x5e\xd6\x3f\xc1\x32\xcd\xe7\x17\xdd\x12\x37\xb3\x70\x58\xcb\x51\x06\xf5\xec\x2e\x64\xc8\x61\x9b\x72\x63\x6d\xd4\x23\xea\x0e\x2a\x9c\x23\xcb\xd7\xb1\xd1\xf6\x86\x97\x13\xfd\x60\xcb\x31\x4f\x42\x63\xdc\x36\x1a\xe0\x14\xd0\x6d\x8e\x8b\x0d\x46\x6b\x7d\x85\xad\x43\x84\xd7\xf1\x4d\xe4\xd7\x92\x75\x13\x34\x6a\xd1\x69\xd6\x8d\xd6\xdd\x70\xa4\x60\xc3\x77\x63\x29\x23\x65\xf6\xd3\x7b\x3d\x3c\xc0\xdb\x92\x5b\x78\xac\x6d\x1b\xc0\x13\x80\xf9\x10\xe6\x9c\x3a\xa4\x08\xf0\x41\x31\xd3\xfe\xcf\x65\xce\xf9\x30\x41\xf5\x34\xf2\x62\xb4\x62\x34\xe5\xe3\xfd\xc7\xb1\xb7\x46\x04\x9b\xfd\x63\x94\x23\x6c\xec\xca\xe1\x1d\x38\x42\x83\x48\xbb\x06\x9a\xd2\x60\xd5\x52\x2f\xeb\x5d\x4b\xe9\xe9\x49\xd7\x91\x4d\xbd\xd6\x78\xb3\x40\x03\xaf\x5f\x67\xc8\x91\xde\xf7\x3d\x9b\xe1\x94\xa6\xc9\x71\xbd\xfe\x30\x55\x23\xa2\x4e\x28\xde\x6c\x58\xeb\x00\x23\xfd\x10\x2a\x9f\xc7\xda\x3e\x7f\x0e\xca\x51\x6b\x4e\xe8\x72\xc4\xdf\xe7\x4e\xb6\x66\x51\x69\xe9\xaa\xa1\x7a\x11\x4f\x0a\x7c\x63\xe0\xa6\x88\x79\x7b\x05\x0f\x43\x7c\x28\x7e\x17\xe5\xe2\x1f\x81\x33\xeb\xe5\xb1\x21\xd3\x35\x87\x1c\x60\xce\xbc\xa6\xbd\xd0\x8c\xa2\x65\xcc\x1e\x78\x87\x81\x47\x79\x64\x34\xa6\x46\x1f\x95\x8d\x84\x33\xa0\x82\xd2\x40\x91\x57\xd6\x9f\xd0\x0e\x91\xc7\x31\xc4\xae\x40\xce\xbd\x07\xd4\x9f\x72\x8a\x56\x30\xe0\x19\x30\x5b\x9a\x32\x17\x98\x0a\x0b\x99\x3c\x65\xd9\xa6\x8f\x2c\xeb\xf9\x5c\x86\x5b\x31\x28\xc2\xbc\x30\x97\xea\x2a\x5b\x96\x84\x2b\xa2\xe6\x44\x3d\x17\x7b\x4f\x64\x0e\x9f\xc0\x18\xb9\xf1\x71\x43\x13\x8e\x46\xbc\x29\x2d\xf3\x0a\x54\x1f\x2b\x26\x0e\x57\x8d\x23\xf4\x7e\x90\xf0\x4e\x0c\xea\x65\x05\x52\xcd\xbe\xf0\x6b\x63\xe8\xf8\x58\x13\xff\xad\x4e\x93\x7f\xab\x7b\x70\x5b\x33\x2c\x4a\x4c\x49\x30\xc5\xfa\x1a\x62\x99\x7d\xc3\x55\x9f\x64\xb9\xbb\x9a\xb6\x42\xf8\xf8\x2b\x37\x95\x60\xe6\xaf\x3f\x32\xab\xa4\xd6\x66\x23\x92\x65\x59\x4f\x2e\xaf\xe0\x82\x69\x92\xa3\x8f\x96\x1d\x14\xbc\x4e\x9a\xe1\x9c\x53\x66\x7a\x0b\xa5\xcf\x08\x47\x0e\x9e\x29\x4b\xf6\x30\x8b\x20\x2c\xa3\x7f\xab\x07\x7c\x99\x15\xca\x64\xf3\xe6\xba\x83\xbb\x61\x6f\x69\x50\x31\xbf\xb4\x5b\x7f\x20\x86\x23\x4c\xe9\x42\x39\x6c\x51\x72\x0a\x43\xdb\xcf\x21\xa4\x18\xb6\x19\x6f\x6d\x37\x24\xb2\xa6\x9c\x4c\x8a\x51\x09\xe1\x99\x56\x05\xca\x00\x00\x03\xf4\x67\xc8\x6e\xb1\x28\xc7\xa0\x3c\x9f\x89\x57\x68\x3e\xad\xc0\xfb\xd0\x57\x98\x20\xe7\x06\xfa\x20\xb2\x8a\x17\x17\x09\x9e\x55\xa3\xb1\x59\x18\xcd\x33\x54\xfa\x25\xe6\xb2\x84\x3f\xd0\x7b\xb0\xb4\x36\x06\x04\x63\xf2\xaa\x88\xa5\xa0\x82\x01\xf4\xf7\x2b\x57\xde\xc8\x6a\x65\x72\x3f\x36\x1d\x78\xad\x0f\xd0\x76\x54\xfd\x4a\x94\xa4\x8f\x6f\x6d\xd3\x22\x87\x8b\x15\xd8\x93\x26\x95\xe2\x1b\x16\x78\xe7\x15\x64\xbd\x11\x61\xfb\x6b\x4d\x79\xd4\x8d\x1c\x36\xef\x6b\xa3\xbc\x02\x7a\xc5\x1a\x32\xec\x8d\x8a\x19\x0d\x6d\x09\xa0\xc6\x87\x10\x96\xab\x5c\x15\xdb\xa6\x64\x9a\xc7\x17\x50\x6c\x58\x00\xbe\x78\x9e\x6c\x43\xde\x83\x62\xbe\x0d\x0a\xfc\xb1\x99\x58\xde\x0c\x1b\x47\x14\x91\xc2\x66\x93\x8d\xeb\x3b\xa6\xb2\x40\xd1\x71\x82\xbb\xad\x23\xa9\x3d\x14\xa8\x7d\x18\xa6\x6c\x6a\xaa\x59\x2d\xb7\x11\xaf\xed\x11\x52\x74\x0b\xaa\x8b\xad\x4b\xa9\x2d\x2e\xf6\x77\x52\x4e\x7f\x11\x7c\x3a\x6b\x7d\xc2\xa2\xcc\x31\xfc\x85\x36\x40\x01\xdf\xa8\xef\x74\x56\x77\xee\x5f\xa7\x23\x6b\x0c\xea\x80\x2d\x9f\x9a\x73\x80\x03\x2a\xc7\x64\xc4\xc3\x23\x44\xc2\x64\xf0\xfd\x43\xda\xae\xfd\xc5\x05\x03\xb0\xbd\xf7\xf4\x97\x6d\xab\x0a\x9d\x55\x73\x38\x97\x58\xbd\x24\x40\x2a\x43\xd6\x7f\xe8\xba\xb5\x8a\xe1\x79\x44\x4a\x16\xe0\xf6\x39\x76\xd8\x5f\x00\x6d\x5d\x28\x1b\x06\x39\x1a\x3b\x51\xc6\x49\x01\xa7\x11\xb4\xcf\x56\xae\x2b\x1c\x30\x62\x5e\xaa\x10\x41\xd0\x88\xaa\x5b\x5e\xd1\xf6\xbc\xe7\x56\x23\x1b\x58\x50\xbb\xda\x5b\xe2\x8c\x65\xb7\x5c\xbb\x39\xc4\x8e\x41\x7d\x53\x86\x77\x05\x1a\x77\xfc\x93\x86\x1a\xff\x0c\xaa\x5d\xb1\xf5\x86\x0d\xf4\x52\xb9\x04\x2f\xb5\x14\x12\xc1\xed\x69\xd9\xa8\x2b\x1d\x17\x8b\x73\x48\xd4\x2f\x52\xa1\x5b\x94\x28\xc7\x97\x33\x58\x85\xa3\xea\x1c\x12\xff\x1f\xa1\x56\x58\xf3\x0d\xca\xe7\x92\x86\x56\xec\x4d\xa9\x4a\x9a\x0b\x45\x92\xe2\x6d\x59\x43\x8c\x55\xb4\x22\x23\xcb\x44\xf5\x44\x10\x00\x81\x9e\x91\x9c\x01\x03\x8c\x14\x1a\xa4\xce\x5a\x83\x49\x0d\x16\x15\xc6\x10\x04\x02\xe8\x47\x11\x27\xb4\x7f\x18\x8e\xc9\x17\x0e\xc9\x88\x1e\x5a\x3a\x59\xcb\x97\xd5\x2c\xfc\x10\xf6\xaa\xf8\x67\x2e\x51\xc1\xf0\x38\x11\x90\x14\x8c\xd7\x9f\xbe\xa9\x5e\x17\xe4\x72\x6f\xa8\xc1\xa5\x9d\x5f\x9f\x3d\xe1\x41\x72\x7f\xe4\xa7\xe4\xb7\xb3\x02\x07\x1b\x35\x66\x0c\x93\xc6\xc4\xff\xee\x48\xea\xf4\xde\x28\x95\x5f\xf2\xd5\x44\x60\xad\x68\x1a\x31\xa9\x29\x62\x87\x8e\x32\xcf\xcc\x54\x75\x6b\xba\x03\x85\x81\x49\x4d\x37\x31\xe5\x63\xea\x9a\x9d\xda\xba\x69\x39\xd7\xda\xc8\xef\x30\x09\x71\x5c\x1f\xd2\xff\xec\xc3\xeb\xae\x51\xa2\x0d\xe5\xb1\x55\xac\xa5\x35\x9b\x4e\x2a\xdf\xa3\x7c\x8a\x43\x21\x12\x95\x72\x2a\x4d\x47\xf6\x10\x0f\x46\x52\x3c\x47\x2a\x8d\x0d\xab\x68\xac\x3d\xbf\xe2\x9e\xc5\xa4\x15\xda\xbf\x42\x1f\x03\xf5\x8d\x06\xce\x99\xf4\xaf\xdb\x69\x55\x07\x98\x84\xc2\x4a\xec\x24\xf5\xda\xc7\x83\x24\x54\x9a\xac\x18\x17\x4f\x1f\x18\x55\x4e\x09\x86\xa2\xe8\x62\xe5\x2d\x64\x6f\xb8\xe4\x4f\x4c\xc1\xee\x0f\xdc\xc6\x8d\xef\xd9\xb4\x61\x5e\xb3\x06\x58\x86\x8e\x6e\x50\x6e\x80\xf7\xbc\x64\xca\xcd\x41\xb8\x2c\xca\x49\x21\xda\x23\x3d\xe6\x7d\x55\x4f\x0f\x46\x36\xdb\x86\xfc\xa8\xcf\xec\xa6\xb5\x91\x43\xc3\x03\x6f\x5f\x75\x77\x61\xc9\x9d\xcf\x79\x63\xc6\x9d\xcb\x2c\xa1\x07\xf4\x5a\xc8\xa3\xa9\x8f\x3a\xa4\x2e\xeb\xe6\xc5\xc2\xdd\xbf\x75\x6f\xb9\xa5\x0f\x63\x32\x62\xbe\x02\x3e\x41\x4f\xb1\x5b\x76\x51\xeb\xd7\x8a\x24\xca\x7a\x53\xe9\xf0\x18\xab\x73\x5d\xc3\x35\xea\xe5\x49\xc5\x6b\x6c\x28\xfc\x90\x21\x48\x98\xe6\x43\xa1\xa9\x2f\x82\x9f\xe2\x55\x3a\x76\xec\xce\x9d\xfc\xc4\xa8\x19\xe6\xe1\x9b\x12\x30\x8d\x8c\xea\x45\xe3\x9f\xc5\x77\xee\xeb\xb3\x77\x42\xd3\xf6\xc5\x17\x46\x63\xf7\xcd\xea\x16\xfe\x63\x2d\x47\x3f\x2e\x16\xbc\xf1\xa2\xd3\x15\xa4\xbf\x07\x0d\xd8\x88\x1c\xc2\x8b\x55\xd9\xf1\x99\x16\x29\xd6\x85\xb7\x43\xf3\x5d\x0c\x5e\x06\x31\xb0\xf7\x08\x02\xba\x20\x7f\xce\x18\x2e\x72\xd1\x74\x5d\xab\x8d\x5c\xf8\x5f\x78\x3f\xe4\xfe\xb6\x9e\xf5\x1c\x26\xaa\xbd\xa4\x98\xe6\xa7\xbc\x31\xc3\x32\x24\x68\x2b\xf2\x97\x84\xd6\xcd\x01\xcc\xa1\x36\xbd\x67\xef\x2f\xc1\x0b\x6a\x80\xfa\x00\x31\xb8\xe9\x06\xab\x35\xa1\xa0\x0f\xf9\xe4\x80\x8e\x0e\xf3\x11\x19\xc2\xed\xca\x90\x33\x6e\x01\x68\xe3\x65\x81\xe9\x7b\x08\x3a\x10\x53\xa7\xb8\x2f\xea\x72\xb2\x1c\xc3\x49\x90\x93\x37\xd8\x3d\xd8\xb3\x37\xae\xc0\xcf\xf7\x53\x95\x20\xb4\x21\x80\xf9\xd4\x12\xab\x2d\x17\x16\x7c\xe9\x1f\x9e\x14\x76\x1b\xd7\x1a\x7c\x75\xce\x2e\x22\xee\x1e\xa3\x1d\x98\x34\x7a\xdf\x11\x78\xc6\x87\xe4\xe0\x61\xb7\x17\x03\x82\x8c\x74\xc1\x30\xd1\xf1\x45\xf2\x8f\xaa\xc4\x30\xb7\x5c\x1a\x2b\xd8\x88\x00\xcc\xb8\x0a\x0e\x92\x61\xd6\x9f\xf3\x57\x68\xbd\x9c\x09\xdc\xbd\x33\x62\xb6\xa6\x3f\xda\x75\xc5\x00\x65\x19\x61\x20\xf3\x3a\x39\x31\xf3\x06\xe8\x6a\x23\x97\xfc\x39\x84\x73\x0c\x47\x59\x06\x38\x02\xbc\xa8\x06\xc8\x1b\x6b\x6a\x7c\x34\x6f\x12\xf7\xeb\x0b\x7c\x17\x19\x49\x7b\x3c\x16\x33\xa7\x4e\x03\xeb\xf2\x06\x88\x1f\x85\xbd\x55\x95\xb3\x2c\x98\x43\xe1\x25\x51\x93\x1b\xe9\x28\x0d\x9b\xcb\xca\x1a\x44\xed\x2d\x45\xeb\xb4\x94\x23\xd5\xb0\x3c\x24\x19\x0e\xa5\x55\x29\xaf\xd6\x99\xd6\xf1\x6e\x43\xd7\xd7\x6e\x22\x23\xef\x84\x37\xf2\x6f\x44\x5a\xee\x4b\xd8\xb0\xf2\x03\xdc\x92\x68\x9f\x88\x52\x8e\x76\x23\x6b\xed\xb7\x9f\xa6\xa6\xf0\x03\xb7\x07\xa1\x91\x1b\x8b\xff\x90\xdc\xbe\xd7\x30\x76\xd3\xad\x96\x11\x88\x23\xbd\x51\x04\xf8\x99\x4d\x74\x55\x75\x46\x31\xc3\xe7\x70\xf9\x31\x44\x19\xf5\xeb\x3a\x30\x79\x0f\x8f\x41\x2f\x40\xef\x5b\xd1\x61\x88\x1a\x47\x66\x9e\xb3\x9b\x2c\x5a\x44\xcd\x0c\x0e\x26\x95\x91\x91\x7b\x30\xd2\x03\xcc\x1e\x81\xbf\x7f\x29\x4c\xd5\x03\x9d\xc0\x87\x88\x3c\x79\x7a\xb4\x67\xf6\x18\x41\x98\x60\x15\x1f\xaf\x09\x45\xf3\x67\xbb\x73\x9b\x59\x86\xc1\xd4\x89\x1c\x98\xc8\x40\x3a\x6c\x17\x50\x7f\x31\xda\x86\x16\x6c\x8f\x8b\x93\xc5\x36\x31\x85\xf6\x44\x6b\xe1\xc8\x31\x34\x95\xec\xe4\xec\xbb\x6b\x3e\x6f\x91\x0c\x58\x8d\x2e\xcb\xf5\x06\xc5\xd7\x1d\x69\xaa\x29\x9d\x6a\xf8\xeb\x3b\x50\xa3\x12\x13\x2e\x83\xc7\x72\xb6\x3b\x3f\x4d\x04\x96\x5f\x51\xf0\x46\x0c\xd7\xa1\xa1\xc9\x64\xea\x26\x1d\x38\x75\x5e\x85\x12\x37\x4c\x13\x8b\x81\xc6\x22\x77\xe1\xd4\xe3\x7c\xab\x55\xc4\x83\x9a\xca\x88\xd1\xa9\x07\xbb\x93\x4a\x6b\xb4\x56\xa7\x6d\xaf\xed\x66\xa7\x90\x6a\xcf\x69\x82\x8a\x00\xe8\x4b\x5c\xd2\xad\xc6\x88\xde\x63\xa9\x69\xe3\xb0\x6a\x26\x23\xae\x29\x0f\xa5\xcb\xb6\xea\xa4\x3d\xab\xaa\xd3\xb5\x78\xa3\xc2\xc3\x91\x32\x02\x1b\x56\xdb\xee\x06\x7c\xc8\xba\x43\xcd\xe2\x5a\x4e\xf4\xe4\xb0\x77\x5e\xdd\x9e\x9d\xe5\x18\xaf\x4e\x70\xb9\x77\x10\xeb\x5b\x72\x0f\x08\x48\x6c\x73\x49\xa2\xa6\xe6\xa8\x9d\x01\xbe\x00\xe8\x46\x53\x94\x02\x02\xf2\xb2\xa8\x96\x94\x54\x85\x37\x98\x95\x78\xcc\x7e\x46\x30\x6c\x2d\x81\xf7\x47\xd2\x89\xad\x59\x31\x4d\x8e\xce\x37\xe4\xe6\xb5\xec\x7b\x74\x5e\x3d\x83\x11\xd3\x90\xb9\x82\xc8\x2f\x47\x75\xbd\x23\xc8\xcb\x95\x73\xdd\xe9\xa4\x49\x83\x4a\x6c\x82\xa3\x5f\xbb\x2f\x81\x8e\xfd\x3a\xce\x8f\x2d\x32\x1f\x34\x24\xb8\x32\xc4\xfa\x39\x41\x45\x53\xd0\xc3\xb9\x0c\x25\x91\x32\x16\x67\xc9\xcf\xe2\x24\x5e\xbc\xcd\x27\xb3\xb1\xa9\x13\xf0\x39\xf0\xdc\x92\xdd\xcd\xfe\x9f\x79\x75\x7e\xfb\x6e\x76\x6f\x60\xb7\x02\x88\x81\x00\x8d\x18\x49\x9a\x96\xe3\x11\x07\x2a\x95\xfc\x92\x28\x56\xcc\xb7\x83\x54\x51\x18\x90\x91\xcb\x23\xf9\x89\x2f\x2d\x3f\x88\xd8\xab\x37\x61\xcc\xeb\xb3\x60\xc0\x3e\x7b\x6f\x29\xd1\x29\x30\x06\xe4\x2a\x44\x30\x4d\x0b\xbc\xae\x0c\x5e\xdc\xda\x57\x6d\xb2\xba\xdf\x2a\xc5\xdf\xbf\xc2\xd0\xc2\x10\x35\x3b\x70\x82\x05\x6d\x24\xe9\x07\xbf\xb1\x88\xd5\xc7\xfa\xca\xb7\x65\xa5\x53\xa7\x77\x18\xbb\x2a\xd8\x43\x33\xd0\x75\x5d\xa6\xe1\xef\xbe\xfa\x14\xf3\xfa\x91\xfd\x37\x0f\xf2\x59\xd4\x41\x93\x07\x79\x10\x16\x1e\x24\x13\x73\x48\xa2\x83\x52\x6e\xfe\x9e\x21\x16\x3a\xe7\x9d\x9f\x2d\x8f\xcd\x10\x99\x25\x37\x84\x87\xe0\x03\x0a\xe1\x68\x40\xa7\x64\x0a\x09\xc1\xad\xd8\x8b\x62\x16\x09\x81\xa1\x22\x61\x18\x4d\x8d\x5d\x5c\x33\x75\xa0\x06\x99\xd1\xab\x11\xa2\x07\x33\x70\x1b\x10\x5b\x42\xbc\x0b\xd7\x6d\xeb\x23\xc0\x9a\x5c\xc4\x14\x54\x6c\x1a\xed\x62\xdb\x80\x1c\xca\x2e\x6e\x08\x93\x66\x54\x60\x9b\xb4\xed\x79\x21\x31\x71\x25\x67\x26\xda\x3b\xfc\xba\x9f\x34\xec\x16\x66\x84\x20\xa7\x55\x71\x9e\x98\xbf\xba\xb1\xcc\x80\x54\xc2\xb7\x6a\x60\x2f\x77\x9f\xed\x2b\xd8\x23\xda\x53\xe0\xc2\x1b\xf2\xb2\x0f\x30\x1a\xf6\xbc\xe8\x8c\x38\xd5\x2a\x27\x67\xae\x11\x04\x18\x40\xa3\xcf\xf3\x0b\x09\x53\x30\x6c\x54\x73\x00\x41\x51\x17\x74\x95\x81\x17\xb0\x28\x79\xf6\xf7\x28\xc7\xf3\x7c\x91\x81\xf5\x9f\x60\x4e\xd5\x47\xe6\x87\xca\xb5\xc0\x45\x01\xdf\x99\xe2\x66\x8c\xd0\x05\x26\x2b\xbd\x90\x3f\xf0\x4d\x57\xb2\x5b\x01\xdb\x9a\x3f\x33\xc2\x3c\xde\xe7\x11\x96\x71\x30\x83\x60\x43\x08\xbc\xc8\xd2\x38\x21\x3e\xfe\xb5\xd3\x73\x34\x8c\x8a\x73\x4d\x1a\xa8\xe0\x46\x5a\x55\x87\xad\x62\x70\xe2\x8d\x7a\x69\xe1\x4e\x2f\x37\x91\xb5\x86\x3d\x5c\x02\xe8\xef\xbe\xbe\xae\x3c\xfc\x24\x0a\x37\x17\x85\xbf\x94\x27\xc5\x23\xc8\x9d\xb0\x4a\x10\x92\x79\x97\xbe\x9a\x28\xab\x2b\x8c\xf0\x6b\xce\x08\x81\x1e\xda\xca\x71\x30\xc1\xd8\x1f\xba\x35\xa5\x8d\x8e\xbb\x44\x07\x6a\xf4\xe5\x86\xe0\xf7\x39\x3f\x58\x4e\xf9\x91\x17\xd0\xcb\x58\x71\x82\xd9\x3e\xc5\x74\x28\x24\x53\x79\x37\xad\x93\x6e\x65\xb1\xe6\xeb\x1e\xb5\x83\x40\xb8\xc0\xf2\x60\xc6\xc0\xe8\x25\x05\xe4\x1b\x10\xbc\x75\x74\xed\x2b\x16\x87\x20\xa1\xef\x20\x41\x82\x9f\x90\x71\xb2\x39\xd9\x0f\xd8\xdf\x5c\xd8\xb3\x9f\x3c\xc6\xec\x34\xa4\xe5\x89\x25\x13\x43\xe7\xe8\x2c\xe6\xaa\x25\x6f\x78\x1c\x55\x32\x1d\x97\x90\xf9\x1d\xa4\xf1\x12\xeb\x02\xcc\x51\x8a\x32\x76\xd2\x9a\x3f\x45\x01\x64\xc7\xe7\xa2\x30\xa2\xea\xaf\xd5\xb9\x39\xd7\xcd\x53\x04\x7f\x53\x0d\x64\xbc\x7c\x64\x28\x86\x01\x98\x9a\xf3\x5f\x59\x00\x39\x90\x77\x13\x41\x3e\xa6\x8a\x4a\x08\xa4\xa6\xad\xa9\xd1\xd9\x5f\xa7\x93\x55\xdd\x5d\xda\xd7\xd2\xd9\xa0\xed\x38\xaa\x0b\x48\x59\x23\x4d\x87\xed\x06\x38\x16\xaf\xb7\x31\x66\x00\x8c\xea\xc8\x44\x76\x1c\x54\xdf\x16\x16\x5e\x1f\x99\x5f\x4f\x1c\x86\x65\x0b\xa2\x1a\xb8\x99\x42\xbe\x78\x1e\xc2\x12\xcc\xb6\xe4\x84\x46\xae\x65\x8e\x91\x88\x75\xa5\x72\x00\x1d\xc3\xf6\x9d\xe7\xa4\xb2\xcb\xa4\x10\xca\x2e\xd1\x3c\x41\x07\x1a\x88\x12\xcf\xeb\x82\xf7\x41\xbb\x8b\xd9\xb5\xc2\x01\x8b\x2b\x18\x85\xd2\x97\x25\xab\x87\x17\x83\xe5\xdb\xa5\xa2\xad\x4e\xc9\xc4\x6f\x3e\xe9\x88\x1f\x4d\x30\x4e\x5f\x5f\x35\xb0\x87\x07\xde\x7e\x6f\x04\xd6\x30\x9f\xd5\x6c\xc7\xc9\xc5\xc6\x39\x83\xab\x05\x34\x03\xb3\xdf\x84\x16\x9b\xe7\x28\xd3\x40\xc7\xc1\x94\x91\x40\x2f\x47\x24\x42\xb1\xc5\x72\x28\x24\xe2\x3b\xe3\x31\x30\x53\x15\xb2\xb6\xa8\x7c\x55\x20\x9b\x2e\x20\x82\x81\xf5\x09\x12\xdf\x7e\xce\x70\xdf\x84\x18\x22\xa9\x2b\xdc\xa1\x15\xb8\x3f\x65\x29\x8a\x67\xda\x11\xa0\x5b\x82\x82\x8a\x37\x64\x53\xd4\x16\x91\x2e\x2a\xa3\x92\xd7\xd2\x2c\x19\x0a\x3a\x04\xab\x82\x18\x14\xfa\x3c\xc0\x04\x18\x42\x97\x20\x88\x4d\xd4\xfd\x1d\x1e\xa3\xc6\xb3\x4f\x52\x09\xa5\x71\x78\x0b\xf5\xb9\x36\x9a\xff\xce\x70\xb8\x9d\x0e\x04\xbc\xc2\xab\xcb\x94\xfe\x3f\x07\x29\xd1\xc8\xc7\xfa\xb9\xb5\xce\xe3\x87\x38\x3c\xa4\x9d\xda\xe1\xc2\xa3\x5c\x46\xf2\x10\x0b\x91\x14\x92\x74\x81\x98\xca\xe9\x11\x26\xff\xed\x3d\x08\x5a\xf3\x3d\xc5\xb5\x5a\xd2\x0f\x7f\xb7\x7f\x5e\x26\x77\x7e\x08\x5a\xd8\x42\x55\x35\xd9\xb4\xeb\x6f\x56\xab\xa2\x9a\xa8\x71\xbc\x51\x75\xa5\xfb\x52\xf0\x52\x9a\x74\x09\xff\xa3\x5f\xf0\xd7\x6f\x05\x69\xc9\xcc\xd3\x23\xb3\xa0\x26\xa0\x2b\x9f\x42\x0e\xe5\x09\x64\x84\xaf\xad\x06\x8d\xfb\x18\xcc\x0a\x3a\xf2\x42\xfc\x3a\xde\x04\x59\xdf\x5e\xb9\x31\x25\x5e\xce\xeb\xb2\x98\x3f\x30\x5b\x67\x91\xc0\x83\x62\x84\xed\xf8\xd5\xc8\x54\x02\xce\xa0\x87\xd8\x5a\xcc\x3c\x1f\x8a\xcf\x48\x90\x9b\x4e\x03\xa3\x8c\x2b\xcc\xa1\x24\x3b\xf9\x17\x9b\x70\xc6\xb2\x2c\x1b\x86\x1b\xa0\x0d\x4e\x5c\x38\xb2\x8a\x9f\x2b\x79\x43\xf1\x55\x88\xd7\xa0\xdd\x78\x1c\x37\x30\x0b\x78\x84\x54\x12\x62\x6a\x87\xd2\x69\xf1\xa9\x5f\xed\x43\xff\x6b\x2f\x70\xc6\x46\xb8\x01\xd8\x17\x66\xaf\xa3\xab\x0b\x52\x6a\xd4\xd5\x1b\x0e\x37\x9c\x88\x60\x54\xab\x19\x49\x3f\xb3\xf3\xb1\x14\x62\x99\xda\x44\xf0\xf7\x30\x76\x4b\x8c\xcd\xb3\x63\x06\x6e\xd8\xde\x9a\x3c\x50\x80\x6d\x33\x6e\x10\x5d\x39\x13\xc7\xe6\xc7\x68\xbe\x80\xb6\xf4\x5d\xb3\x32\x69\x7b\x9d\x01\x55\xba\x08\x56\x0f\x29\xa8\xac\x87\x2c\xe9\x0f\x33\xad\x7e\xa0\x01\x25\x31\x8a\xa8\x98\x77\xc7\xfc\x5b\x25\x32\x3d\xcb\x6d\x43\x12\x8b\x81\xcd\x01\xd8\x52\x3c\x8c\xc2\xb6\xe8\x35\x61\x7b\xf2\x29\x40\xce\x3f\x27\xb6\x1b\x59\xa8\x1a\xa1\xa3\xde\xa5\x7c\x4a\x52\xb3\xd7\x6f\x90\x83\xde\xa8\x6f\xb6\x18\x29\x40\x03\x92\xaa\xd2\xd8\x95\x2e\x75\x88\x5c\x9b\x23\xe3\xc8\x3d\x1d\xe3\x38\x47\x07\x69\xa5\x8a\x30\x7d\xed\xc7\x1b\x03\x10\xdc\x0e\xaa\x0a\xdf\x7e\x52\x15\x3e\x92\xaa\x00\xee\xb4\xcb\x19\x05\xc6\x2d\x27\x51\xcd\x00\xef\xbe\x20\x71\xe1\xce\x7d\x5f\x0c\xf2\x43\x1f\x18\xd2\x27\x28\xe8\x90\x7f\xdd\x7b\xf4\x1f\x87\xbf\x1e\xbc\xda\x3d\x3a\x7a\xfe\xea\xc9\xee\xc1\x9e\xd9\x0b\x21\xc3\xd3\x6d\x3c\x7c\xdf\x1e\x72\xf1\x4e\x80\x04\x11\x98\xc5\x27\x48\x3b\xa1\x2a\xd8\x38\x12\xdc\xc6\x4b\x51\xaf\x0c\x29\x0a\x52\x09\xa4\xba\x9c\x97\xc7\x4b\x48\x42\x85\x49\x2f\xf9\x0a\x00\x4c\x22\x66\x1a\xa4\xe9\x47\x15\xd1\x50\x1b\x1d\xd5\xef\xa1\x1e\xb9\x7e\xf2\x68\x48\xa1\x07\xda\x72\x41\xcf\x32\xce\xb9\x25\x8e\x50\x9d\x1f\xac\x5f\x51\x07\x7c\x96\x62\x03\x98\x35\x87\x0e\x32\x85\x3c\xdc\x86\xf2\xb6\x76\xf3\x64\xfb\x07\x42\x1f\x8f\x59\xcc\x5b\xc6\x91\xe2\x93\xfd\x22\x8f\x9f\x1e\x70\xc4\xfe\xa5\xcd\x92\x89\x2c\x4c\xdb\x20\x3f\xf2\x06\xbd\x56\x71\x8c\xe7\x81\x5b\xea\x59\x21\x95\xb1\xeb\x03\xb0\xa6\x1d\x6d\xc3\xcf\xcf\x0b\xd3\x84\x96\x81\x4e\x93\x20\x19\x27\x22\x5d\x80\x97\xb1\xe9\x85\xe2\x30\xb9\x40\x07\xcc\x01\x99\xda\xae\x16\xaa\x6b\x87\xd4\x8d\x5c\x12\xad\x20\x7c\xf4\xd9\x67\xa0\xa2\xd6\xc5\xfe\x74\xd1\x0d\x5f\xa6\xc9\xbd\xbb\x0a\xea\x6a\x12\xae\x87\xf5\x7c\xe2\x0a\x3f\x6c\xd6\xcd\x9e\x64\xad\x62\xd5\xef\xab\x15\xb0\xb2\x56\xfb\x3b\x5f\x12\x4a\xe5\x77\x9f\x60\x18\xfe\x50\xb9\x0b\x27\xea\x56\x71\x7b\x15\xcc\xe6\x36\x58\xd5\x6b\x60\x1a\x3f\x22\xad\xf5\xe9\xf9\x34\xfa\xb9\x7e\xed\xa3\x31\x6f\x92\x57\x31\x2c\x8d\xd1\x0d\x39\xa5\xe6\x6f\xf9\xcc\x16\xb9\x31\xec\xe7\xa6\x9b\x62\xf8\x71\x98\x3c\xb4\xfd\x2a\xa0\xed\x4b\xf3\xd6\xfb\xaa\xb1\x23\x86\x1f\xfa\x05\xae\x87\xf7\x0c\x01\xea\x43\xc3\x8a\xb1\xd1\x74\x2f\x23\x88\xcf\xff\x17\xd3\xd3\xb6\xa1\x3e\xe3\xdb\x6b\xe2\x44\x63\x20\x17\xe3\x23\x79\xa5\xd5\x0b\x21\x7d\x35\xa4\x55\xed\x22\xc7\xac\xb2\x3f\x7d\x44\x05\xc3\x11\x58\x5d\x56\x28\x92\x31\x70\x51\x8a\xa7\x63\x0b\x7b\xb5\x16\x73\x74\xd6\xe3\x9c\x10\x4c\x9c\x69\x85\xa9\xff\xaf\x47\x07\xbf\xf8\x45\xf5\x1b\x5b\x1a\x6f\x97\x68\x7c\x57\x35\xaf\xbd\x9c\x50\x5a\x9b\xd7\x34\xc4\x60\x89\xad\x89\xcc\x16\xe0\x0f\x9c\x6a\xf2\xd0\x43\xdf\xde\x7f\x8c\x5b\xec\xfe\x4f\xbf\x1e\xed\xe1\x7b\x6a\x04\xf8\x30\x60\x16\x32\xc9\x0f\x87\xd0\xf3\xbf\xec\x1d\x18\x81\xfa\x0a\x3d\xc7\x8f\xfe\xfe\x0c\x68\xdd\x7b\xc0\xd2\xf0\x91\xf7\xf8\x3b\x3a\x78\xc3\x4d\x9d\xbb\xc4\x9c\x3b\x9f\x49\x50\x6c\x42\xf7\x4b\xb1\xf6\x66\xe2\xb5\x2c\x0f\xea\x9f\x2e\x94\xbb\xa5\xb4\x68\x1d\xf9\xc1\x50\x38\x68\x40\xf0\x9b\x96\xae\x7d\x11\x27\x7c\xc5\xfc\x24\xd0\x8e\x57\xaf\x1e\xef\xfd\xed\xd5\x2b\x34\xdd\xf9\x17\xb7\x41\xa3\x70\xcb\x63\x65\x88\x1a\xc4\xe1\x08\x8e\xf5\xa3\x8d\xba\xc4\xfb\xd2\x5f\x39\x8f\x2d\x81\x93\x82\xbf\xff\x68\x71\x76\x9b\x22\x92\xea\x02\x5c\x32\xc9\xfa\x8e\x30\xa2\xe5\x74\x64\x79\xeb\x39\x7a\xb3\x22\x60\x6c\xf8\x18\xb4\x3b\x80\x98\xc3\xbc\x69\xa6\xb6\x17\x2f\x9d\xcd\xe4\xe7\x12\xa0\xd6\xc8\x12\xaf\xf0\x5b\xa8\x42\x0b\xc8\x82\xd6\x82\xb3\x1c\xfd\x9b\x2b\xeb\x69\xa9\xc2\xca\x30\x92\xe5\xb4\x84\x1c\xaa\x61\xb8\xaa\x9c\x09\x04\x2d\xa6\x51\x97\x83\x7d\x39\xc7\x30\x36\x07\x6e\x52\x9b\x6d\xfc\x4d\x31\x0f\xed\x2d\xd8\xb8\xc7\xe5\xc9\x89\x29\x6d\x78\x87\x9c\xc5\xe9\x8b\x7b\x29\x7f\x7a\x3f\x0c\x36\xd5\x91\xa6\x5c\xd6\xc6\x9a\xf2\x27\x3a\xda\x34\x12\xdf\xc9\x84\x1a\xb1\x9d\x42\xcd\x8f\xbe\x14\x9a\x91\xf8\x4b\xf1\xe1\x8d\x86\x36\xfb\x6d\xe3\x90\x11\xdd\xbc\xe4\x47\xf0\xfa\xed\x4b\x6b\x34\x80\x74\xe4\xf4\x60\x17\x02\xc5\x1b\xb0\x8a\x80\x66\x23\x88\xb6\xe0\xd7\x51\xff\xea\x98\x77\xf5\x6e\xb2\x6d\xd9\x7d\x1b\x5d\xc6\xca\x88\x73\x36\x61\x58\x80\xea\x48\x6a\x66\x2b\xf8\x51\xd7\x36\xcf\x4d\x97\x5a\x27\xe4\xe1\xb9\x62\xe3\x50\xdf\x2b\x2b\x8a\xa6\x60\xce\x08\x4e\xd3\xcb\xd0\xc7\xa9\xab\xde\x7b\xf1\xe2\x2e\xe1\x2a\x08\x93\x17\x56\x9e\xbe\x84\x83\x94\xb8\xc6\x79\xc7\x1b\x5b\xa4\x87\x9e\xd0\x08\x3c\x08\x94\x64\x9c\xe9\xca\x9f\x66\x1b\x34\x58\xd3\xda\x79\x05\x00\xc3\x95\x51\x36\xd1\x13\x80\xc2\xc7\x11\x01\xa4\x76\x12\x3c\x03\x85\x1d\x08\xc1\xa4\x11\xb0\x30\xbb\x12\x24\x03\xdd\x00\xd8\x8e\xc9\xb9\x01\xd5\x6a\xa8\xce\xd0\xa9\xa0\x91\xe2\x02\x41\x61\xe8\x04\x10\x20\x09\xb1\x4d\x89\x7f\x40\xac\xa8\x8d\x9b\xa6\xb4\x50\x1d\xb3\xf8\x78\x0d\x57\xe0\xc8\x81\xd8\xc7\xf8\xa1\xe1\x17\x36\xfd\x4b\x83\x0c\xdb\x2f\xe1\xde\x01\xdc\x39\xa6\xa3\xea\xbc\xd7\x88\x0e\x75\x5c\xf8\xce\xfc\xf9\x1b\x96\x82\xbf\x04\xb8\x17\xfe\x06\xd4\x3f\xe8\xc3\x25\xd1\x14\xe2\xeb\x20\x63\x14\xac\x0a\xf9\xe5\x0f\x9a\x5c\x66\xe6\xd9\x21\xb3\xdb\x80\x32\x71\x54\xf9\x8b\x2b\x20\xb1\xe5\xbe\x3b\xbf\xdd\x1d\xc3\x7c\x47\xa6\x98\xef\xb9\x3f\x44\xdb\x05\x5c\x0c\xc8\x27\x2f\xca\x91\x4d\x13\x45\x69\xad\xb0\x04\x48\x05\xd7\x24\xfa\x77\xfd\xf8\x2d\xf8\x77\x8b\xa3\x93\xb9\x06\x40\xba\xe9\x35\x93\x37\x22\xeb\xf7\x93\x23\x23\xa1\x29\x40\x1a\xf8\x65\x39\x25\x68\x25\x62\x2e\x17\x9f\x01\x3c\x09\x91\x99\x5e\xbc\x15\xfc\xb3\xbc\x09\xb5\xd8\xe7\x7e\xe4\x55\xac\x3d\x3d\xc9\x0b\x0d\xff\xbc\x21\xe2\x21\x93\x91\x8a\x02\xa5\xb6\x7f\x40\x62\x73\x4b\xc1\xfe\xe0\x52\x76\xd0\x4b\xcd\x99\x96\x44\xa9\xfb\x27\xc4\x6e\x78\x10\x15\x46\xe7\x4c\x53\xc4\xcd\xa9\x85\xb1\x4d\x05\x78\x14\x3f\x49\x11\x07\x01\x33\xbb\x63\x32\x5b\xbc\x7b\x93\x95\x69\x0d\x5a\x35\x62\x19\x25\x9e\x25\x84\x3d\xa3\x52\x38\xdf\x0e\x0b\xba\xa1\xa7\x96\x6f\xd9\x44\x5d\x1a\x73\x21\x85\xa5\xc5\x10\x59\xce\x52\x76\x8e\x61\xde\x25\x0a\xa9\xcc\xf5\x1d\x7b\x63\x24\x1d\xae\x1d\xaf\xd6\xd8\x43\x2d\xb5\x38\x38\xd8\xc9\x40\x8b\xf3\x8a\xac\x73\xdb\x46\xb3\xb9\xc5\x47\x12\x42\x96\x69\xdb\xbe\x83\x4d\x3a\x3a\x73\x6b\x9a\x85\x1e\x86\x65\x8d\xc7\x98\x8e\xa0\x58\x44\x41\x89\x0c\x87\x1e\xd9\x1b\x09\x8b\xf9\xe6\x46\x21\x58\xeb\xb5\x9d\x60\xe4\x37\xbb\xde\xab\xf1\x08\x75\xab\x15\x4b\x9e\x8a\xdc\x42\xa4\x37\x59\x95\xe4\x31\xa6\x18\x0f\x0b\xbd\x14\x64\x09\xec\x77\x1d\x1d\x4d\xac\xfe\xc1\x56\x1b\xd3\x5e\x46\x74\x2e\x1a\x98\x46\x70\x14\x8d\xfd\x69\x31\x05\xdc\x79\x1d\x2c\xb5\x06\x43\x2e\xfa\x89\x13\xa4\x7a\x7e\xdc\xb4\x78\xb5\x83\x4c\x65\x7c\xaf\x15\xf0\x85\x88\x47\x2e\x43\x86\x39\x29\x57\x89\x4b\xcc\xe2\x2b\x92\xc1\x1b\x1b\x12\x10\x3c\xf0\xe1\xa8\xa9\x6d\x1b\x34\x5a\xfc\x09\x15\xff\x74\x41\x98\x5f\x0f\x7c\xbd\x29\x90\xbe\x57\x18\x6d\x76\xbb\x24\x1d\xc6\x9e\x50\x82\xc1\xfe\xfc\xd2\xb9\xaa\xec\xb6\x7f\xa2\x54\xa6\x1b\x1d\x6d\x08\x40\x93\xf3\x5f\x57\x2a\x0c\xf6\xb6\xd0\xfc\x01\x8b\xde\x95\xcd\x5e\x81\xda\x43\x41\x6c\xc2\xff\x11\x3b\x4d\x56\xd6\x4f\x8c\x70\xb2\xbf\x69\xac\x03\x17\x40\x1b\x45\xf6\x2f\x30\xfd\xbb\x56\xd6\x6f\xe3\xee\xb7\xcd\x59\x17\xcb\xda\xea\xc6\x23\x08\x1f\xcd\x95\x53\x94\xf8\x1f\x59\xed\xd2\xb3\x95\x42\x42\x46\x0e\xd9\xb7\x5c\x65\x33\x21\x8b\x7f\xe9\x71\x11\x92\x57\xc0\xe8\xa8\x91\x49\x88\xef\xb1\x83\x41\x35\x45\xb1\x8d\x2b\x74\x29\x25\x59\x8d\xb6\x37\x2a\xd1\x15\xcc\xd7\x9b\xe2\xe2\xb4\x10\x98\x14\x27\xc9\x9b\xaa\x96\xbd\x41\x10\x60\x0b\xdb\xc1\xe6\x70\x45\x07\xa9\x09\x33\x19\x48\x66\xd1\xad\x64\xda\xaf\xaf\x00\xc5\x36\x78\x02\xed\xb4\xd7\x39\x5a\xfd\xf9\x75\x6a\x47\x80\xd2\xe2\x0c\x73\xf1\x50\x00\x7d\xc7\xea\x3a\xc1\x6d\x84\x0f\x06\xd3\x5a\xa5\xd5\x72\x3c\xe3\x43\x0b\x1b\xdb\xe3\xcb\xcf\x18\xab\xc6\xcc\xcc\xba\xa2\xfd\xd6\x6c\xdd\x5e\x26\x21\xfb\x86\x53\x07\x35\xce\x93\x2e\x8d\x7c\xa8\x1b\x61\x10\x87\xe7\x49\x90\x2f\x25\xd8\x13\x55\x35\xe0\x43\x73\x76\x81\x63\x03\x39\xc2\x81\x96\xd3\xd0\x00\x56\x6c\x40\x84\x52\xe3\xc8\x04\xbc\x30\x5b\x9a\x87\x0a\xaa\xb1\xb1\xc9\xca\xa2\x25\x40\x89\x62\x56\xd4\xb8\xd8\x0f\xab\x9f\x73\x18\x45\x12\x38\xca\x00\x30\x1d\x3d\xa6\x52\xf8\xf9\xc8\xc6\x6a\x4c\x66\x63\x0f\x23\x4f\x04\xa4\x8d\x5a\xd2\x6a\xba\x2b\xf8\x52\x24\xa2\x2d\xe7\xc0\xf5\xec\x33\x1d\xfe\xd7\x73\xea\x42\xa3\xb1\x52\x0a\x25\x94\x56\x67\x25\xb5\x29\x2f\x28\xc8\xbe\x3b\xab\x66\xe8\xdb\x65\x2f\x34\x70\x3a\x30\x6b\x02\x38\x4c\x2d\x27\xe8\xb0\xc8\x4a\x27\x9c\x21\x85\x90\x83\xf9\xac\x01\x43\x32\x4b\x7e\x42\x04\x09\x9c\x3b\xf6\x73\xa9\xaa\x59\xa6\xa5\x36\x73\x81\x0f\x81\xf0\xdc\xa5\xcc\xe5\xae\xc8\x81\xc6\x57\xda\x10\x66\xd6\x81\x99\x0d\x24\x60\x28\x3c\x79\xb5\x4e\x4d\x10\x0e\xd7\x3a\xc9\x49\xdc\xd8\xd9\x08\x76\x62\x98\x16\x89\x5b\xc2\x5f\x2b\xf9\x62\x0b\xef\x16\xb7\x24\xa9\xd2\x72\x3a\x62\x33\x77\xd8\x94\x07\xab\x9b\x27\xa3\x29\x14\xf4\xba\xc2\x85\x5e\xf3\x61\xdc\x5a\x43\x28\x84\xba\x2e\xe0\x7e\x10\x76\x9e\x29\x43\xe1\x50\xf8\x99\xb7\xa4\x7c\x7b\xf1\xa5\x23\x62\x3d\xe2\x8f\xb4\xd3\x2c\x3a\xf9\x2d\xa7\x71\x3d\x9a\xe3\xff\xfd\x80\x78\xb4\x4e\x36\xf6\x8a\x0d\x2c\x46\x5c\x13\xb6\x3e\x6b\x34\xd9\x5e\x6e\x1c\x41\x24\x44\xce\x0e\x55\x0b\xf7\x43\x7f\xe1\x70\x94\xd0\x52\xae\x2e\x9f\x11\x9b\x0a\xe3\xce\x46\x15\x87\x7d\xc3\xb0\xf1\x8d\xac\xcf\x69\xd8\x1c\xa7\xa7\x98\x66\xa1\x98\x44\x46\x68\x0c\x1b\xfb\xe6\x10\x58\x02\x17\x11\x71\x4a\x8c\xe4\x9a\xca\xc0\x3a\x61\xdb\x94\x41\x91\xda\xfa\x30\xbc\xf4\xc9\xfc\x26\xb5\x35\x45\x9a\xe1\xd5\xa9\xef\x69\xb6\xf8\x16\xbc\xf1\x69\xf6\xaa\xac\x8f\xaa\xd9\x2f\xc5\x9b\x62\x8c\xf0\x37\x24\xf0\xd5\x1e\xf3\x0a\x9b\xb0\x3f\xc9\x4f\x0b\x3b\x22\x72\x8d\xaf\x36\x90\x66\xe7\x34\x17\xff\x04\x81\xbf\xb8\x4f\x32\x6b\xfd\x8b\x73\xe8\xcd\xf0\xdb\x31\x8d\xca\xc1\x8d\xb2\xdd\x0a\x2e\x53\xdc\x21\xac\x26\x49\x42\x5b\x97\x1c\xa8\xfc\xcf\xa0\xb7\x23\x4a\x5d\xa1\x68\x64\x9c\xd0\x8c\x5a\x1a\x5f\x3c\xd4\x26\xf1\x3c\xff\x30\xcb\x48\x98\x7b\xc3\x0e\xcd\xcd\xf4\xe6\x98\xfd\xc3\x3e\xeb\x35\x24\x2e\xe3\xa0\xab\x48\x11\xdc\x2d\xc9\x2f\xb8\xfc\x6f\x42\x85\x09\x6d\xd4\x46\x89\x25\xcf\x55\xf8\x78\x51\x53\xc4\x80\x0b\xa3\x7b\x53\x68\xee\xaa\x95\x10\xe7\x80\x86\x09\x09\xf2\x5c\x07\x4a\xdb\xeb\x28\x72\xba\x98\x5e\x50\xb2\x2f\xc9\xa1\x25\x2e\x95\xfa\xde\xca\xb4\x1b\xd0\x4c\xe7\xd5\x85\x53\x02\x44\x05\xe6\xa5\xe7\xad\x70\xb2\xab\x77\xc5\xc5\xd7\xf6\x27\x95\x27\x36\x37\x8b\xe1\x05\x5e\x32\xe6\xcc\x04\x99\x4f\xa4\xd2\x4e\x8f\xca\x5a\x8f\xdf\x24\xf9\x7e\x54\xbe\x31\x7a\xdc\xc3\x6d\x5b\x68\xfb\x87\xa4\xf9\xef\xfb\xdb\xb7\x93\xc3\xb6\xee\x26\x42\xc7\xb9\x94\x01\xc5\x6c\x27\x24\x05\x54\x9e\xf3\xf5\x80\xbb\x3d\xb3\xbe\xc2\x42\x0b\xf5\x9c\x2c\xcb\x22\xed\xf0\xff\xf9\x97\x16\x58\xc3\x1d\xd3\x8e\x1f\xb8\x6b\xf2\x37\xfc\xdc\xa7\x09\x00\x0d\xc6\xb5\x3e\x55\x57\x5e\xd6\xdb\x4a\xda\xc7\x7c\xa5\xae\x3d\x5c\x42\x0a\x37\x2d\xec\x61\x07\x17\x85\x3a\x4e\x79\x54\x1c\x2f\x4f\x4f\xd1\xa7\x76\x39\x87\xc7\x75\xf2\x39\x05\x27\xc7\x2f\x3e\xfb\x2d\x17\xa2\x69\x33\xde\x11\x15\xb2\x33\xc8\xbb\x66\xfd\xb4\xe1\xda\x90\x6d\x91\xd4\xfc\x58\xa6\x0b\x02\xe7\x22\x42\xc5\xb4\x96\xf8\x1c\x3e\xcc\xe6\x33\x76\xfa\xaf\x87\xf3\x6a\x3c\x86\x28\xa4\x52\x8e\x49\x70\x83\xa1\x39\x57\xce\xbc\x44\x8b\x1c\xa3\x63\xe1\xf4\x71\xd1\x0d\xbb\x84\xa6\x46\xae\xc7\x6e\xd8\x49\x88\xc7\x23\xec\xa9\x94\x0d\xb2\xa7\x53\x39\x5c\x68\xb8\xc8\xcf\x8a\x37\x9f\x11\xa9\x5a\xf4\x85\x0b\xba\xa4\xee\x1d\x54\x46\x44\x54\xda\xef\x5f\xed\x91\x7e\x25\xce\x02\xa2\x9f\x76\x63\x7e\x7e\x47\x39\x5a\x92\x7d\xd0\x21\x08\x31\x1a\xc3\x6d\xae\xb3\x2e\x68\x3d\x10\xc5\x0b\x3b\x26\x52\x60\xc6\xbc\x9a\xd5\x7e\xff\xc3\x9d\xd7\xc8\xaa\x37\xce\x05\xa1\x79\xc9\x6e\x2b\x64\xa9\x62\xaa\x89\x10\x74\x76\x85\xe2\xad\xbd\x35\x8b\x10\x43\x2f\x78\xe8\xfb\x26\x93\xeb\xfe\xb2\x9f\x61\x77\xfd\x6f\x7f\x54\x98\x09\x32\x97\x0a\x1b\x13\x63\xab\x28\xbb\x2d\xb4\xc7\x9c\x18\x51\x8f\x94\xf0\x7e\x0a\xff\x82\xf5\xa1\x52\x77\xdb\x89\xe4\xa3\xb1\x37\x46\x72\xc4\x57\x3d\x95\x47\xc1\x36\x96\xd8\x06\xe9\x3b\xa1\x2b\x78\x0c\x24\x22\xb4\x43\x1f\xaa\x0c\xbd\x45\x77\xa7\xa3\xdf\xf2\xf9\xd4\x9c\xff\x0f\x20\xbe\xae\x18\x81\xc1\xac\xee\xaa\x86\xf9\x59\xdc\x94\xfc\xf7\x38\x57\xf3\x6b\x03\x7e\x2d\x69\x38\x18\x99\x86\xfe\x13\xfe\x6f\x2f\x52\xc9\x9c\xd1\xf5\x47\x29\x69\x36\x43\xee\xb1\xfc\x31\x59\x55\x85\xac\x90\xb6\x3a\x2c\xad\xe0\xfa\xa7\xa7\x32\x36\x5e\x71\xbc\xcd\x6e\x01\x2a\xc4\x7c\xe4\xd4\x48\x91\xe6\x66\x05\x40\x38\x1e\x9c\xbe\xe0\xb4\x8d\xbe\x4b\x1c\xb5\x6d\x96\x1c\x87\xfa\xe1\xbf\x56\x2f\x8d\x17\xad\x37\xd7\x2f\x93\x87\x76\x38\xae\x74\x5d\x1d\x26\xe9\xf3\x86\x28\x22\x58\x9e\x17\xa7\x65\x0d\xad\xf7\x82\x64\x45\x8a\xd8\x95\x0a\x01\xfa\x20\x4e\x10\x25\xb1\x16\x49\x8e\xd7\x29\x44\x67\x42\xcc\xe3\xdc\xb6\x5b\x04\x0c\xf0\xc1\x4a\x01\x73\x93\x32\x21\xbc\xed\x75\x7a\x81\x4d\xe5\xe4\xd6\xfe\x9c\x47\x22\xb6\xf2\xbd\x56\xab\x53\xcf\xfb\x5b\x1c\x3d\xdb\x9c\xbb\x87\x75\xb3\x8a\xb9\xef\x6c\x74\x49\xd3\x97\xea\xdd\xbb\xa4\xa5\xac\xe7\x5c\x25\x59\x24\xed\x5d\x6e\xa7\xd9\x61\x46\xdb\x3d\x22\x3c\x1a\xd7\x32\x0e\x01\xce\xb5\xf2\x9a\x75\x22\xb6\xcc\x68\x67\x3e\x50\x57\xdc\x25\x70\x9b\x03\x6c\x86\xaa\x48\x71\x88\xbc\x8a\x51\x61\x07\x96\x49\xbb\xda\xb6\x3a\xf7\xfc\xa6\x3c\xbd\x58\x46\xa8\x6d\xb1\xc5\x55\xab\x17\x8a\x22\x5e\xd6\x69\xf6\xf1\xdc\xc2\x55\xc1\xe8\xe2\x44\x8e\xce\x31\x3e\x30\xb2\x3c\x2d\xd6\xd0\x06\xdb\xaf\x3a\xd2\xde\xf4\x9e\xbb\xe2\x2c\x8c\x3e\x20\x82\xa1\x61\x71\xac\x25\x70\x80\x8e\x3e\xbc\x01\xbb\xe5\xba\x52\x66\xe8\x05\x0b\xed\x79\x52\x9c\xaf\xdc\xaf\x1b\x1b\xf3\xba\xd3\x32\x1c\x26\x9d\x71\xf5\x6f\x86\xb5\xab\x25\x06\xb5\x2e\xf0\x04\x08\x19\x66\x87\x9e\xb3\x8a\x6b\xae\xd1\x6b\x8b\x47\x0e\xb7\x53\x68\x70\x4b\x79\xbf\x2e\x9c\x23\x5d\x4f\x32\xe0\x73\x70\xf7\x78\x5c\xab\x81\x06\xa5\xb9\xb3\x30\x1d\x30\x2c\xc8\xb8\x8b\x80\xe2\x6b\x54\x70\x89\x6d\x65\x25\x90\x6c\xbc\x35\x29\xca\x9b\xcb\x22\x76\x0e\xf5\xe2\x29\xb4\x23\x78\x26\xa1\x8e\x0f\x1f\xaa\xf3\x3b\x49\x8e\xd8\xc8\x77\x31\x39\x0b\x36\x5d\xd0\x60\x1c\x78\x0a\x20\xd1\xcc\x0b\xa7\x8a\x29\x20\x5f\x70\xca\x07\x55\x45\x36\x98\x45\xf1\x40\x34\x35\xf4\x9b\xc2\xfe\x2b\xf6\x5f\xb2\x9f\x32\x3a\x4a\x2a\x3a\xc2\x9f\x2c\xad\x20\xe6\x18\x70\x1b\xc0\x33\xa3\x80\xfe\xe7\xf3\x8b\xd4\x86\xd7\x33\x55\xa1\x55\x7a\x2d\xb2\x75\x3d\x2e\xd9\xe7\x56\x89\x3b\x18\x0a\xff\x66\x26\x34\x56\x3d\x6c\x77\x3a\xd6\xea\x58\x2a\xa4\xd6\xca\xa1\x88\xa8\xb6\xdb\x47\xd4\x9a\xa2\xb8\x9c\xda\xcd\xed\xa5\x7c\xcb\x16\x73\xc1\x8d\x58\x7d\x31\x1d\x9e\xcd\xab\x29\xb0\xfa\x31\x66\xda\xbd\xb0\x63\x83\xac\x46\xd0\x67\xc9\x68\x29\x5b\x3c\xd0\xb2\x27\xc2\x14\xb5\x21\x69\xcb\x6f\x25\x28\x93\x70\x82\xad\xd4\xf0\x98\xb1\xc4\x87\xa9\x75\xd6\x60\xeb\x97\x50\xcb\x87\xa0\x68\xe1\xd1\x91\xc4\x9b\xf0\x1f\x96\x23\xf8\x22\x70\x44\x38\xbd\xc8\x94\xe0\x17\x73\x0f\x13\xe3\x9f\x32\x3e\x2b\x0d\x6c\xe9\xba\x41\x9c\xeb\xd3\x72\x30\xae\x16\x37\x3a\x22\x3f\xdc\x80\xff\xf9\x54\x4e\x7f\x6b\xba\x19\x25\xb3\x31\x80\xad\x7b\x59\x1d\x73\xec\xd4\x67\xd6\x30\xc3\xa4\x6f\x10\xb2\x76\x80\xfd\x38\x14\xef\x79\x5e\xa3\xc6\x0b\x22\x1b\x9d\xa1\xd4\xc9\x3f\xb4\xce\x20\x6a\xd4\x98\xa0\xef\x12\x36\x64\x2a\x28\x94\x0a\xf1\x5a\x30\xd6\x19\xbd\xb3\xf1\x4c\xe5\x8e\xd6\xb5\x13\x2a\x24\xb2\x4f\x20\x9d\x2e\x85\x2d\x01\x41\x04\x57\x58\xc4\x11\x86\x37\xdd\xb2\x9d\x9e\xdc\xd8\xbc\xb3\x4d\x76\xef\xc0\x92\xad\xf6\xef\xec\x86\x0e\xcd\xed\x7b\xf6\xa3\xa6\x66\xaf\x66\xa3\x39\xad\x84\x5a\x15\x20\x26\x78\xc2\x52\x1d\x4b\xc3\x43\xe3\xf5\xd5\x6f\x3d\xf8\x19\x5f\xce\x4a\x82\x78\x7d\x64\xf5\xaf\xff\xc5\x60\x6a\x36\xbc\x7d\xce\x3d\x36\x0c\xe7\x2a\x53\xbe\x8e\x4e\xaf\xe7\x88\x71\x3d\xcb\x18\x34\x4e\x27\x14\x17\x31\x8e\x75\x81\x65\x71\x51\xe4\x23\x0a\x5b\x23\x2f\x62\xc0\x84\xe1\x0f\xc5\xa9\xcf\x83\x1d\x53\x3b\x8f\xda\xd1\x90\x5c\x89\xf6\x69\x21\x54\x2e\x6c\x30\x05\x63\x60\xc8\x30\x74\x6c\x40\x7a\x7b\x7b\x65\x8a\x36\x69\xb1\x1a\x9b\x21\xc0\x6c\x7c\xd8\x16\x43\x1a\x7c\x30\x87\xb0\x4b\xce\x3f\x97\x39\xa0\x13\x90\x27\xe6\x54\x47\xb9\xe2\x3f\xdd\xb1\x5b\xa4\xe6\xa0\x7f\xa3\x7b\x9c\x91\x6e\xe2\xc1\x90\x05\x9d\xd6\x79\x06\x10\x1e\x1a\xbd\x59\x96\x53\xc2\x24\x11\x9c\x84\x71\x95\xd3\xe6\x76\x5e\x61\xac\xc2\x0c\x78\x68\xba\x08\xfb\x3c\xac\x66\x65\xe1\xd2\x02\x78\x7d\x33\xaf\x3b\x72\x8e\x8b\x1c\xbf\x36\x65\x66\xcf\xb1\xc4\xb7\xf8\x3d\x6c\x3b\xd1\xb4\x5b\x2a\xd4\x4e\xe7\xd1\xf2\x3d\x9a\xe1\x95\xf3\xc0\xf7\x0a\x66\xaf\x78\xa3\xe7\xf7\xda\x3c\xd4\x1e\xf7\xd4\x55\x14\x7d\xf3\x92\x36\x25\x69\x0c\x04\xd6\xa5\x22\x36\x3e\xed\xff\x1c\xb5\xee\x05\xac\xa2\x1f\x37\x14\x02\x7c\xc8\x02\xca\x3e\xea\xe1\x2d\x1a\x7a\xf8\x59\x97\x3b\x67\xa6\xf2\xfd\x93\x3d\xd3\x1c\xe3\x46\xd9\x16\xed\x2e\x7c\xc7\x9d\xd0\xd6\x15\x39\xd5\x5e\x33\xf0\x21\xf0\x3b\xfa\x6b\x5e\xab\x90\x46\xab\x39\x34\x6a\xf1\x83\x23\x00\x95\x82\xa4\x3e\xb3\x53\x37\xfc\xe0\x3d\x34\x25\x74\x13\x6c\x6b\xe0\xbb\x77\x8d\xb6\x65\x30\x85\x87\xe5\x31\xc4\x5c\x68\x26\x09\x22\x44\xb8\x04\x46\xd2\xf9\x04\x1e\xd8\x4f\x28\x1b\x49\xb7\xf9\x95\xa6\xab\x1c\x22\x5b\x47\xa3\x49\xc0\xa7\x70\xfd\xf3\x9c\xfc\x23\xe0\xe6\xe0\x61\xc7\xed\x60\x47\x0e\x7e\x98\xb3\x6a\xe2\xf8\xd9\xdd\xda\x88\x32\x6c\x6b\xca\x31\x21\xe0\x2e\xee\xcb\x2c\x24\x08\x49\x67\x97\xd3\x79\x41\x9e\x47\x14\x02\x00\x91\x1c\xc5\x78\xec\xb0\xf3\x26\x95\xc5\xd4\x07\xe4\x18\x2b\x2b\x23\xf4\xcc\x08\x2f\x8a\xdb\xf5\x0c\x2f\x2f\xd0\x50\x00\x90\x6b\x73\x0c\xd4\xc6\x60\xf3\xf9\x6d\xdb\x44\x06\x61\xe8\x78\x34\xd4\x59\x4d\x3f\x56\xe9\x6e\x64\xe1\xa8\x1f\x71\x36\x68\x3c\xd4\x9c\xe4\x68\x5d\xb6\x2d\xc5\xa6\x5d\xe4\x61\xeb\xc2\x32\xeb\xe7\x56\x60\xb4\x6d\x1e\x35\x1b\xc7\xc3\xe8\x79\x9c\x9b\xb3\xc9\xd5\x44\xcb\x29\xa6\x5d\x6a\xc5\x6d\xf7\xf2\x84\x20\x89\x6d\x73\x3d\x00\xfb\xf0\xcc\x10\x39\x2b\x78\xf9\x58\x22\x36\x62\xbe\x6a\xa5\x32\xd5\x7c\xc0\x10\xdf\x7c\xac\xc5\x7b\x8f\x01\x21\x47\x25\x78\x03\x4f\x27\x0f\xed\x26\xb5\xee\x7c\x11\x41\xe0\x76\xf5\x35\x8e\x1d\xea\x5d\xa8\x59\x53\x78\xd4\x25\x5b\x38\x18\x56\x8c\x7f\x49\xac\x62\x33\x94\xf5\x66\xb4\xfb\x9b\xd4\xcd\x6d\x17\x77\xc1\xe1\x14\xef\x2b\x23\x16\x37\x35\x10\x29\x75\x32\x62\x2c\xc7\x08\x72\xbb\x27\x79\x4a\x8b\xa7\xd6\x45\xa8\xf9\x98\x1a\x4d\x0f\x86\xa2\x71\x58\x58\x9b\xee\xe7\xc6\xd9\x2b\x57\x73\x44\x5e\x99\xa0\xe6\x95\x27\x25\x89\x3a\xc7\x79\xe4\xa5\xbf\x92\xe5\xb8\x69\x8f\x36\xe3\xbd\x0f\xc0\x7a\x8d\x24\xec\x72\x00\xfe\x20\x9c\xc7\x08\xa6\x6a\xf0\x36\x62\x40\x70\xdf\x5f\xc3\x84\x2e\x16\x07\xbd\x81\x29\xc2\x0f\xfc\x34\x5b\x1c\x5b\xac\xff\xf4\x7b\x24\x43\xa3\x4a\xec\xc9\xf1\x68\x5e\x92\x3f\x05\xec\xb6\x32\x7c\xc8\x59\x25\x9e\x97\xb6\xff\xad\xde\xc6\x2d\x56\xe1\xb5\x92\xe7\x90\x4b\x86\x7e\x5a\x64\xf6\x50\xc9\x11\x73\x41\x9e\x32\xaa\xb4\xd7\xba\x50\x56\x0c\x63\x74\xe0\x84\xe0\x8a\xab\xc3\x3a\xc2\xf2\xb0\x10\x28\x92\xad\xe9\x2b\xc2\xd6\x3f\x15\xcc\x6b\x1d\x50\x30\xd0\x94\x84\x40\xc3\x45\x06\x7d\xc1\xc1\x14\x29\x04\x74\x66\x35\x0c\x75\xd3\x08\x46\x96\xad\x60\x84\x11\xf5\x6f\x43\x1f\x92\x06\x73\xcb\xfd\xa8\xd7\xcd\xb6\xac\x5b\x47\xcd\x36\x9b\xa9\xb5\x0e\x5f\xd1\x56\x91\xe9\x23\xb8\x69\x8a\xf9\x8f\xf8\x89\x08\xb5\xad\xb8\xf5\x74\xe6\x36\x6b\xf5\x81\x67\x6b\xdc\x3f\x41\xc7\x7c\x04\x23\xf2\x8e\xe6\xc4\x86\x92\x00\xd7\xef\x54\x16\x6a\xff\xce\x62\x1d\x3a\x59\xb7\x25\xbd\xf2\x1a\xa4\xf5\x03\xd4\xea\xdb\x5a\xfb\xa4\x8a\xb6\x87\x3c\xa7\x53\x66\x9d\x84\xf2\x4a\x6f\xda\xc2\x46\xda\xb9\xae\xd7\x9e\x16\xd8\x87\xf0\x8e\xcf\x16\xbb\xc2\xfd\x1e\xc3\xef\xd2\xcd\x07\x7b\xec\xc5\x93\x9d\x85\x52\x72\x8d\xda\xb2\x9e\xb5\xf9\x69\xd4\x8d\x31\x64\x6e\x7b\xbf\x77\x34\x5f\x16\x14\x9c\xef\x9b\x5c\x2d\x7c\x12\xf4\xc3\x22\x1d\xe3\x05\x0d\x91\x6a\xfe\x53\x1d\xb0\x8b\x20\x7e\xd6\x5d\xb5\x12\xfe\xd5\x2e\xe8\x92\xee\x21\xa2\x41\x99\xc3\x4f\x3d\x33\xe7\x10\xb4\xdf\x29\x10\xeb\xf3\x0a\x08\xe2\xb9\x08\x42\xe3\x13\x75\xcb\xc2\xe9\x06\x18\x2d\x7a\x84\x05\x29\xfa\x88\x03\xbe\x10\x71\x81\xcb\x42\x4b\x13\x38\xa9\x65\xbd\xab\xed\x62\xd7\xbe\x13\x6c\xb1\x53\x5c\xe5\x4a\xd0\xcc\x9d\xba\x83\xbb\xfe\x95\xa0\xbb\xd5\x52\xe4\x3e\xda\x95\xe0\xbf\xa2\x2b\x48\xcb\xe4\xfd\x6b\xba\x83\x5c\x79\x77\x0c\x4f\xd6\x1b\xf8\x74\xb8\x6d\xf5\xd6\xb0\x69\xef\x0c\x63\xa3\x64\x27\x59\x61\xd6\x93\x7d\xd1\x9d\x99\xc3\x33\x8c\x0d\x70\xdb\xb8\x79\x5c\x7e\x93\xfd\xeb\xc1\x75\x4d\x70\x5c\xc7\x66\xd7\x8d\x11\x2b\x80\x84\x9b\xb4\x6e\x8c\x41\xc8\x13\x25\x36\xc1\xc3\x16\x25\xbb\x6e\xcf\xb8\x15\x9e\x3d\xec\x89\xa3\x79\xff\x78\xfd\x53\x37\xcf\x23\x36\x46\xbe\x3f\x29\x25\xa3\x56\x90\x60\x2b\xf9\x77\x40\xa9\xfe\x7d\xad\x75\xf7\xb2\x75\x47\x14\x36\xd1\x19\x43\x6d\x08\x50\x63\x77\x7c\x1e\x84\x12\x85\xd4\x5c\x20\xb7\xb2\xc1\x6e\xb4\xe4\x9c\xc1\x47\x85\xa5\xba\x2f\xe5\x54\xe5\x99\x4d\x2f\xad\x0b\xc2\xd9\x62\x31\xeb\xdf\xb9\xf3\x8f\x1a\x6e\x5d\xcd\x89\x64\x42\xb8\x71\x46\xb2\xdf\xce\x6f\x43\xad\x58\x90\x4d\xac\x8e\x2a\x64\xbf\x7f\x04\x69\x6f\x23\xd5\x67\xc4\x18\xf8\x3a\xfa\x89\x0a\x62\xf5\x59\xcd\x85\xf2\xb7\x4c\x32\xee\xfc\x92\x88\x36\xe4\x1d\x7b\xcc\xb1\x17\xbf\x5e\x36\x5a\x38\xe3\x9b\xad\x6e\x5c\x11\x78\x55\x6b\x56\x38\x17\xed\x0a\x89\x14\xa7\xcd\x88\x01\x8c\x8e\x5e\xa3\xa6\x35\xd0\x01\xe2\x5d\x40\xf5\xd1\xda\x1e\x80\xcb\x5a\x82\x88\xa3\x69\x69\x5b\xfc\x54\x36\xd6\xfa\xed\xc1\x3a\x0c\x6a\xde\x4c\x4c\x5d\x57\x4e\x35\x41\xa0\xae\x22\xb2\xf8\x04\xe5\xdf\x72\xa8\x9f\x19\x05\x38\xa0\x4d\x01\xda\xd2\x58\x89\xef\xa7\x18\xf0\xb2\x01\xf7\x67\x3f\x42\x1d\x55\x3c\xc9\x49\x4b\x00\x45\xac\xa4\xf2\xed\x1f\x33\x27\x3e\xf3\x89\xb5\xcc\x79\x82\xc9\x07\xec\xc4\xf7\x32\xf5\x95\x1f\xa9\xae\x01\xaf\x50\x42\x44\x9c\x65\x50\xb9\x70\xe2\xae\x4f\xf9\xb0\x85\x2d\x4d\x6d\x23\x02\x5c\x1b\x35\x40\xef\x94\x2d\xdf\xd7\x29\x6e\x70\x1c\xae\x33\x0a\x9b\x8f\x81\x87\x51\xe4\x31\x3b\x0a\x24\x4f\x5e\x62\x98\x10\x3e\x76\x97\x09\x9e\x2c\xa6\x4f\x3e\xfb\x4c\x8d\x6b\x70\xb4\x7d\x18\x82\xd2\xf8\xdf\x06\xb7\x4a\x74\xee\xf7\x85\xde\x19\x5a\x38\xd0\xd3\x14\x6b\xf3\xf1\x9b\x00\x2c\x87\x64\x47\x35\x1e\xf9\x94\xb4\x8b\x12\x86\x3d\x4d\x37\x75\x3f\x2a\x03\xa6\x44\x00\x31\x23\x48\x30\x17\xcf\xc8\xb4\xa5\xa0\x8c\x72\x90\x3f\x07\x75\x6e\x4c\xc3\x44\x67\x29\x92\x6a\x23\x02\x1e\xae\xf9\xb4\x64\x29\x09\x1a\x26\x38\xf9\x9c\x15\xa1\x65\xd1\x3c\xc5\x1d\x47\x73\xf7\xa6\x1e\x53\xc1\x3c\xaa\xdb\x9f\xf0\x16\xf7\x7d\xaf\xee\x22\x17\x77\xed\x8b\x09\x66\xef\x18\x80\x13\x69\x23\x54\xe9\x58\x2a\x73\xbc\x01\x8d\xa4\x71\xc9\xe6\x82\xf7\xb2\xe4\x09\x3a\x18\x8b\xed\xa9\x93\xb6\x48\x37\xf5\x7d\xe4\x7a\x2d\x7a\xff\x65\xaf\x7b\x94\x79\x24\xba\x05\xb7\x6c\x7b\xb4\xe9\x35\x11\x76\xd6\x26\x7a\x97\x24\xef\x16\x27\x87\x4d\x27\x6b\x76\x51\xbd\x89\xe2\x08\xdb\xef\xe3\xe9\xdf\x23\xdb\xa8\x40\xca\xac\xdf\x40\xaf\x08\xe6\xd1\x34\xe7\x36\x70\x39\x9d\x59\xcd\x42\x47\x35\x72\xf4\x92\x11\xc7\xbf\x06\x9b\x22\xea\x9f\xc2\x58\xb4\x63\x1f\x1b\xe6\xcf\x15\xb8\xde\x9e\xd3\x86\x31\x0e\x69\xad\xf5\x48\xae\x10\xe4\x43\xf0\x2c\xcd\xe7\xb2\xd0\x5b\xea\x8f\xe4\xaa\x6d\xdc\xa6\x6b\xcf\x31\x05\x07\x23\xf0\x30\x4e\xa1\x85\x95\x78\x2f\xb0\x2b\xf2\x81\x76\x4f\xc9\x31\x4e\xd1\x45\x87\xdd\x60\xda\xd7\x1c\xf5\x7c\x00\x25\x0d\x14\x69\xc1\xc2\x14\xca\x1c\xe5\xdb\x6f\x4b\xf2\xdf\x57\x28\x1b\x6d\x29\xf6\x97\xe4\x58\x2f\x30\x21\x75\x03\xd5\x10\xa7\x0b\xa0\x54\x0c\xc3\x48\x76\x66\x94\xa0\x25\xcb\x4e\x82\x61\x0c\x92\x7e\x56\x11\x20\xce\x15\xfc\x10\x53\x48\x21\x20\x83\x4c\x08\x97\x6d\x13\x29\xb9\x7a\xb1\x22\xf3\x4d\xcb\x3c\xe2\x26\x2a\xe6\x27\x85\xda\x27\x07\x05\x7e\x05\x18\x37\xf4\x67\x43\x2d\xa3\xc7\xbe\x03\xc9\x4a\xf7\x0c\xf9\x22\xe2\x52\xc4\xaf\x7c\xf7\x9b\x44\x35\xb0\xd9\x88\xc8\xf9\xd7\xa2\x5e\x45\x25\x62\x1b\xba\x98\x43\x4a\x91\xe8\xef\x60\xba\x89\xca\x40\xd8\x81\xe0\x2c\x13\x08\x23\x1e\x57\x25\x83\xf1\x19\xf9\x38\xcd\x27\xe8\x56\x6d\xd6\xed\x04\xb9\x43\xdc\x60\x91\x16\x22\x03\x13\xa5\x7f\x2e\xcb\xe1\xeb\xf1\x45\x9b\xa9\x59\xcd\x71\xa2\xeb\x4c\x0e\x09\x5d\x98\x8f\xea\x20\x5d\x10\x51\xd8\x11\x98\xaf\x4e\x8d\x1d\x67\x49\xef\xe6\x32\x26\xbf\x75\x7b\x5a\x60\xd2\xfc\x61\x6c\x95\x31\x0d\xf9\xaa\x78\x53\xf7\xd4\x65\xbb\xd6\xdc\xea\xf4\xba\x39\x82\x05\xaf\x46\x51\x56\xe7\x22\xf8\x04\x21\x88\x11\x28\xd8\xd9\xb5\x18\x42\x66\xd7\x21\x0f\x6d\x82\x8d\xf3\xee\x9d\x37\x2b\x4c\xcf\x6b\xdc\x8b\xbb\x2f\x1d\x6a\x8d\x90\x68\xe8\xa5\xde\x27\x16\x4d\x18\xc0\xbc\xbd\x85\xe8\x5a\xff\x7d\xf4\x93\x00\xeb\x94\xd5\x61\xbf\x3d\x8e\xc8\x17\x5f\xd8\x53\x18\x42\x58\x60\xb7\xb8\x51\xfc\x5c\x57\x1c\x3a\x76\x11\xa1\xc7\x31\x51\x3c\x54\x96\x01\x11\x07\x5c\xbc\xa1\x2e\x03\x4f\x71\x34\x13\x8a\x50\x87\xfd\x87\x10\xb7\xe3\xaa\x7a\x8d\xe0\xdd\x15\xe6\xc3\x84\x32\x65\x7d\x86\x78\x49\x12\x2f\x61\x49\x2d\xce\xe6\xd5\xf2\xf4\x0c\x95\xb3\x9a\x7c\x88\x6a\xca\x23\x4a\x2e\xb1\x67\xc5\x05\x90\x64\xc8\xa4\xba\xe2\x5b\xcf\x82\x8d\xfe\x80\x06\x17\x10\x84\x1b\x89\x37\x65\x5d\x32\x64\x2f\xb6\x2b\x3f\x35\x1a\x44\x96\x3c\x85\x7d\xec\xbc\x84\xd4\x98\xe7\x05\xdd\xee\x4d\xff\xbf\xfb\xee\x2a\x03\x47\x22\xd0\x9d\x41\x61\x46\x72\x92\x66\x73\x02\xe1\x20\x43\xe1\x63\xdc\x14\xc0\x23\x77\x5c\x58\xc5\x0a\x91\xe7\x32\xed\x49\x05\x83\x69\x57\x34\x6c\x68\xd1\x91\x4d\xf4\x7c\x26\x5c\xc8\xf3\xce\x22\xad\xda\x4a\xea\xd0\xd0\xe0\xe7\x54\x97\xe9\x53\xcb\x31\xac\x8f\x8e\x3e\x32\x8d\xb9\x1c\x76\x34\x26\xd5\xd4\x41\x7b\x79\xf8\xa4\xfe\xc1\x56\x20\x56\xa7\x92\x87\xf9\x58\x7c\x9a\x79\xba\xd0\xc7\x4d\xd2\x7a\x32\xce\x3a\xc9\x9f\x63\x48\x52\x12\x92\x02\xd1\x08\x2e\x6e\x82\xbb\x0c\xed\x42\xd0\x2e\x26\x0f\x6c\x73\x8e\x60\x5c\x04\x3e\x50\x0b\x2a\x57\x48\x48\x43\xba\x67\xfe\x89\x22\xbe\x7e\x43\x71\xd3\xfe\xc9\x6c\x59\x9f\xd1\x18\x2b\xd9\xd0\x6b\xf1\xa6\x8b\x1c\x88\xe4\xdc\x29\xfd\x33\xcc\x0c\xaa\x09\x82\x7e\x2f\xf8\x9c\x36\x2f\x3a\x35\x27\xc5\x1b\x8a\x8e\x82\xd7\x8c\x3e\x9d\x72\xfa\x0f\x42\xde\xcb\x97\x8b\x6a\x02\x19\x30\xd1\xcb\xfa\xf8\x02\x87\xe7\x98\xc2\x41\x11\xf1\x96\x73\x00\x0f\xbe\x5f\x80\xa8\xfd\x61\xe0\xd3\xb1\xde\xf4\xe6\x68\xb6\x5c\xd0\x31\xe4\xed\x62\x8e\xe5\x8f\xab\xd1\xc5\x0f\x03\x6e\x2a\x1e\x8f\x71\xb3\x2d\x4e\x4e\xe0\xda\x0d\x11\x7b\x15\xa5\x41\x56\x4a\x7a\x87\x01\x26\x11\x02\x47\xc1\xe4\xe9\x6c\x51\x4e\x20\xd1\x0f\xb5\x0f\xce\x41\xe5\x74\x59\x50\xe6\x4b\x18\x09\x9f\xc8\xf1\xdc\x74\xfb\x8c\x7c\x2d\x41\xf1\x3c\x26\x1d\x14\x52\x57\xd2\x6d\x2d\x1e\xc1\x11\x47\x51\x64\x87\x9e\xe3\xab\x4d\x97\x9a\xac\xa1\x5e\x80\x31\xf7\x46\x5b\xd6\x2d\xec\x47\xa1\xbc\x05\x39\xc9\x96\x5c\xbf\x25\x77\xd6\xe4\x0f\x28\x3d\xab\x0c\xf4\xdb\x45\xd7\x9c\x60\x10\xd9\x1c\x52\xef\x4c\x0b\x88\x1e\x60\x1f\x99\xb3\x62\x3c\x23\x4d\xe6\x2f\x8f\xcc\x72\x18\x8e\xf3\x72\xa2\xa9\x80\xcc\x22\x37\x54\x5e\x90\x20\xa6\x8b\x93\x45\xc2\xb0\x24\xc5\x74\x64\xd5\x26\x5c\x31\x6e\x1c\x5b\xd6\xc9\x5d\x65\xd1\x91\xfb\x0b\xbd\x1b\xc9\x40\xa9\xe1\x5a\x43\xe9\xfa\x36\x41\xcf\x38\xd0\x69\x1e\x03\xb3\x2c\x4b\x93\x7f\xab\x7b\x00\x52\x09\xe3\x6c\x75\x7f\xb9\xb0\x23\x87\x1b\x9b\xbf\x58\x5d\x75\x0a\x16\x29\xa9\x5f\x70\xbf\xbf\xb4\x38\x97\x36\x12\x6a\x94\x74\x8b\xec\xd4\xd4\xe1\x2f\xb8\x5e\xaa\x29\x2d\xeb\x25\x32\xfd\x68\xa9\xd0\x20\x17\xe4\x73\xc0\xab\x8b\x56\xe7\x12\x03\x3c\x70\x7d\xd6\x29\x5e\xc4\xd2\xef\x53\xef\x0e\x17\x83\x38\xbe\x07\x05\xf5\x87\x34\xf9\x7e\xf6\x03\xe2\x68\x7f\x9f\xd3\xff\x97\x0c\xb2\x3f\xbd\x7d\xf8\xb7\xbf\x38\x8f\x1b\x4a\xa3\xfc\x7d\xfd\xe6\xf4\x07\xef\x76\x99\x73\xd4\xaa\x47\x47\x73\x40\x35\x01\x68\x4a\xbb\xef\xd1\xa2\x20\x26\x62\x56\xf1\x1c\xb7\xe8\x64\x64\x76\x0d\x40\xfb\x74\x9e\x59\x3e\x80\x60\xd2\x54\x3c\xb4\x36\x16\x0b\xe4\xc0\xc9\xed\xa9\xc3\x7b\x04\x82\x2d\x92\x53\x6d\xb8\x0a\x8c\xed\x5f\x18\xa9\xa0\x05\x95\x6f\xf5\xf5\x34\x81\xde\xfe\x79\xae\xa5\x5d\x34\x4b\x64\x56\xde\x3b\x4b\x85\xd4\xa0\x3c\xc9\x6d\x52\x3c\x3f\x17\x9f\xe5\x16\x6d\xbc\x6e\x9e\x6f\x5b\x63\x53\x82\xdc\x88\xda\x4e\x18\xcb\xd2\xe7\xf8\x7f\xa3\x4c\x7d\x38\x66\x6e\x83\xd2\xd4\xc9\xb0\xe9\x2a\xd8\x8c\x6a\x68\x85\x07\x8a\xd6\x07\x5f\x93\x37\x9b\x3f\xed\xdd\xf1\xda\xeb\xf7\xea\x9b\x17\x1b\x64\x33\x72\xba\xfe\x7a\x4d\x84\x4b\x11\xd1\xc6\xa2\x69\x69\xf4\x0c\x1e\xe8\x5c\x83\x9a\x02\x7d\x60\x48\x74\x0c\x6f\x9b\xe3\x2e\xd8\x3d\x7c\x0b\x30\x47\x4d\x18\x75\x94\x4e\xe0\x5d\x57\xf1\xed\xe4\xfe\xdd\x54\x35\xe4\x0b\xf3\xbb\xe7\xc7\xa9\xfd\xd7\xd4\xf0\x33\xc6\x61\x20\x5d\xd5\x98\xcd\x29\xaa\x8e\xbf\xdf\xed\x58\x64\x41\xde\x0a\x17\xa4\x77\x29\xf5\xf7\x6a\xf9\x5f\x70\xc8\x5a\xcc\x2f\x38\xe0\x5c\x7c\xba\xfc\xcb\x5d\xc4\xb0\x15\x90\x6d\xda\x62\x82\x78\x3d\x1a\x03\x05\x8e\xc6\x51\x32\x6e\x91\xc0\x0e\x5a\x52\x98\x28\xef\xba\xb2\x2f\x06\xa4\x68\xe3\xbd\xa8\x96\xce\x08\x9a\xdb\xb9\xf4\x6e\x9d\x31\xc9\xf2\x5c\x7c\xb9\xa7\x21\x21\xac\x1e\xe7\xdc\x79\x49\x20\xdc\x2f\x07\x57\x63\x93\x71\xd7\xbc\x00\x6f\x39\x89\x05\x6a\xb6\x87\x5c\xb6\x20\xb4\xa7\x9c\x80\xb3\x56\x26\xc6\xc0\x7c\x4a\xc0\xe4\x70\x08\x63\x7d\x1e\xee\x64\x78\xa3\x0f\x43\x1a\xe7\x55\x5d\xdf\x66\x0d\x01\x6c\x49\xf3\xd7\x35\xe8\x0d\x6e\xcc\x58\x25\xb3\x23\x8d\x66\xa2\xc4\x4c\x52\x63\xb4\xc9\x7b\x0c\x8e\xdb\xa8\x18\x1a\xe6\x28\xe7\xd5\x14\x3f\x72\x21\x95\x43\x3e\x95\x5e\x90\x2f\xa0\x75\x3d\x0e\x88\xc1\x1d\x93\x3b\x74\x0b\x08\x85\x64\x8b\x82\x5b\x2f\x1e\xc4\xdc\xc6\x1c\xe1\x01\xa0\xff\x5f\xd3\x20\x91\x89\x5b\x70\x6e\x55\xc7\xf7\x9c\x15\x0c\xea\xdd\x18\x5e\xe3\x8e\xfb\x4a\xcb\xe8\x6a\x37\x4e\x90\x28\x03\x6e\xcc\xc8\xd9\x7a\x0e\xbb\x89\x03\x71\xf1\xdc\xbf\x85\xfb\x9b\x97\x4d\xed\xcb\x81\x32\x4c\xc0\x82\x50\x30\xf8\xb0\x0c\xf2\x48\xa8\x59\x87\x56\x61\x63\xd9\xe5\x6c\x94\xe1\x66\xb9\xac\x15\xcc\xf4\x0d\x3a\x4c\x01\x9a\x03\xbc\x7c\x2e\x70\x85\x3c\xe7\xf0\x9c\xb4\x5e\x3c\xc6\xd1\x30\xd8\x43\x67\x83\x1a\xdc\x9b\xba\xe4\xbb\xc0\x73\x86\xb3\xc0\x17\x99\x6e\x9e\xcf\x2b\xe4\xf9\x25\xf5\x0b\x01\xfd\xc7\x10\x0b\x87\x96\x95\x06\x31\xd6\x35\x8f\x4d\x1f\x4e\x4a\xf2\x6a\x0d\xfb\x9b\x49\xa8\x75\x6a\xf6\x88\x53\x60\x61\xb0\x0c\x34\x28\x9d\x9f\x5d\xe8\x51\x21\x40\x44\x37\x36\x00\x14\x6a\xe5\x0b\x0f\x14\xf7\xbf\xd9\xa8\x39\x37\xa2\xc9\xfe\xd1\x05\xb0\xf9\x15\xe1\x0d\xe8\xa4\x1b\xc8\xfd\xeb\xc9\xfc\xe3\x60\x54\x3b\x30\x7f\xa3\x72\x34\xfd\xaf\x0e\x6c\x08\x45\x64\x62\x7e\x43\x7b\x0d\xbc\x47\xa0\xc8\xd2\x97\x3b\x1d\x38\x39\xc0\x5c\xb5\xf0\x31\x8b\xd0\x98\xcc\xcc\x7c\x42\x87\x05\x5f\x46\x72\xf4\xd3\x51\x75\x48\xbb\x6e\x0f\x45\x63\xa3\x61\x2b\x75\xe1\x4d\xe4\x92\x4e\x60\xa9\x51\x02\x55\xbe\xe3\x46\x88\x08\x1f\x90\x96\x8b\x72\x5c\x2e\xca\xa2\x96\xeb\xd2\xad\x24\x70\xcb\xec\x07\xbf\x53\x2e\xc2\x6f\xf8\x41\x4d\x0f\xea\x42\x95\xa0\xd3\x10\xff\xa1\x1f\xea\x04\x27\xfd\xd8\x43\x2c\xcc\x79\x04\xfa\xf2\x07\x66\x60\xc6\x86\x40\x2e\xd6\xcc\x88\x24\xd8\x21\x0e\x68\x2f\x54\xd7\x45\xa9\xbe\x8d\xef\xa4\x28\x86\x5b\x31\xa9\xda\x30\x93\x70\x19\x45\x4f\x77\x9d\xc8\xd3\xce\x16\x62\x19\xb6\xa4\x87\x86\xe2\x90\x15\xba\x47\xd1\x97\xc0\x79\xa9\xe4\x02\xed\xbc\xe2\x25\xd5\xe9\xf5\x38\x6f\xb4\x4e\x38\xdc\xbf\xbf\xb3\x93\xae\xca\x25\xdc\xbf\xff\xd5\x57\x69\x34\x5b\x70\xff\xfe\xd7\xdf\xa4\x61\x52\xe0\xfe\xfd\x6f\xbf\x0a\x1f\xba\x94\xbf\xe6\xed\xd7\x69\x4b\x4a\x5f\xf3\xce\x91\x0b\x33\xf6\xf6\xef\x7f\xf7\x65\xe3\x25\x24\xe5\x35\x2f\x5c\x7d\x41\xd2\x5d\xf3\xee\xdb\xd4\x4b\xaf\xdb\xdf\xb9\xeb\xc8\xa8\x14\xba\xfd\x9d\x7b\xf7\xd2\x58\x96\xdc\xfe\xce\xfd\xf0\x45\x0d\x0f\xef\xa7\x61\x1a\xdb\xfe\xce\x97\xd8\x35\x9d\x08\xb7\xbf\xf3\x15\x0e\xee\x9a\x7c\xb5\xfd\x1d\x1a\xc8\xf6\x4c\xb4\xfd\x9d\x6f\xee\xa7\x5e\xce\x59\xf3\x04\x49\x7b\xa9\x65\xfb\x3b\x34\x84\x2b\x72\xc6\xf6\x77\xbe\xbb\x9b\xaa\xfc\xb0\xe6\xb7\x19\x11\xe1\x91\xed\xfe\xbd\xbb\x97\x2f\xd3\x9d\xbb\x77\x37\xc9\x24\xfe\x29\x69\xf8\xe2\x06\x92\x86\x2f\xc7\x8b\x12\xed\x84\x58\x04\x14\x7c\x52\x98\xd0\x8c\x5f\x0e\x31\x45\x6c\x6b\x52\x71\x7f\x76\xf7\x94\x4e\x1c\x49\xf5\x1d\x29\xe6\x27\xb5\xb6\x4d\x21\xd6\x81\x4d\x21\x96\x14\x3a\x5a\xce\x66\x1a\x0e\xd6\xd6\xe6\xb9\xab\x91\xe2\xca\x0f\x83\x12\x58\x25\x33\x21\xb6\x04\x76\x51\xff\xb2\xca\x6d\xef\x80\xd2\x22\xf1\x1e\x66\x5e\x96\xf3\x1a\x40\xd9\x39\xe4\x83\x9c\xcb\xcc\x31\x02\x62\x32\x11\xbc\x7d\xc9\x99\x73\x11\x46\xac\xf9\x81\xd2\x21\x58\xc1\x9a\xa0\xb1\xfe\xe4\xa4\x1c\x82\x12\x35\x76\x93\x8e\x47\x36\xc9\x57\xcb\x6c\x50\xbe\x31\x44\x2c\xf0\x37\xd1\x7c\x8c\xb5\x93\x85\x98\x3b\x45\x79\xbc\x4d\x47\x18\x99\xca\x74\x1c\x55\x3e\xbe\x0f\xa7\xfc\x9b\x52\xd1\x5e\x6e\x1a\x4a\xcf\xd8\xa3\x6f\x00\x55\x0f\xf0\x74\x83\x59\xe7\xc5\xeb\x03\x22\xbd\xdb\x27\x72\x10\xb4\x3c\x07\x3b\xfd\xf7\x44\xf8\x87\x55\x1d\x90\xac\xe3\x3a\x21\xb0\xed\x81\xd3\x90\xfd\x00\xd0\x66\x4d\x64\x40\x68\xa9\x89\xc8\xc4\x6a\xda\x23\xa4\xe0\x3a\x5e\x93\x02\xdc\xa7\x9b\x36\x05\xb4\x8f\xe9\x83\xdb\xb2\x11\x91\xb9\xd8\x73\x4d\x60\x4c\x73\x1f\x27\x3e\xfc\x8e\x5b\xc1\x06\x27\x1c\x79\x1b\x2e\x8e\xb1\xe2\xd6\xe7\xcd\xfb\xdc\xa6\x35\xae\xc8\x58\xf2\x18\x0d\xe2\x39\xe7\xa0\xe4\x76\xfa\xc3\x62\xa3\xa8\x18\x2b\x99\x8d\x7d\xd2\x70\x51\xd2\x52\xa1\x69\x13\x57\x3e\x79\x7a\xb4\xd7\x4f\x20\x3f\x1b\xc1\xf9\x82\x5c\x36\xba\x78\x91\x9c\x95\x23\x73\x98\x26\xc8\x26\xd2\xdb\xd4\x04\xd3\xd5\x12\x9d\x3c\xa5\x8e\xbe\xfd\x2b\x55\xcf\x49\x9b\x71\xb1\x62\x30\xc9\xfd\x15\x92\x26\xdb\x37\xa2\xfb\xf9\xd1\xab\x83\xdd\xe7\xff\xf1\xeb\x33\xfa\x86\xda\x8e\xed\xee\xeb\xc9\xa7\x56\xb0\xfa\x99\xdc\x4e\xee\x71\x15\x88\x17\x8a\xe0\x4b\xba\xe6\x13\xd4\xfc\x90\x86\x6a\x4e\xc5\x8f\xf8\x8f\x2d\xc2\x8b\xbe\x8c\x70\x94\x91\xda\x0c\xc0\x05\xb1\xb2\xf0\xb7\x0a\x04\xc9\xa7\x74\x29\x77\xa3\x6c\x24\x7c\x60\x5b\x9e\x1c\xd2\x7e\xe5\xe5\xba\x0e\x9b\x73\x35\x56\x0a\x2e\x36\x36\xe0\xac\xea\x4d\xa1\xf8\xca\xb6\xed\x5f\x80\xb5\x0e\x9e\xfe\xcd\x1c\x25\xff\x73\xff\xf0\x68\xff\xc9\x5f\x22\xac\xa5\x48\xad\x65\x21\xd7\xef\x2b\xf2\x11\xda\xb1\x03\x28\x37\x10\x45\xd3\x0f\xcd\x3b\xfb\x91\xe9\xa6\x1d\x0c\x0c\xeb\xeb\x27\xfe\x39\x96\x8b\x4d\xfd\x9f\x77\xc6\x9f\xef\xe1\x9c\xc3\x59\xf6\x03\xcd\x37\x14\x6e\x9f\xec\x9a\xef\x3b\x61\xc8\x31\xe3\xef\x90\x2a\xb9\xe9\x8d\x46\xb5\x3f\x39\x52\xf5\x90\xeb\xc9\x06\xab\xfa\xc8\x11\x50\x33\xac\xc8\xfe\x79\xe7\xf8\x68\xef\x3f\x8f\x5e\x3d\x7a\xfa\x04\x14\xf0\xcd\x27\x59\xfd\xd8\x64\x7b\x88\x4e\xf3\x33\x3a\x2f\x41\xf8\xc1\xf4\x42\x46\xd2\x46\x10\x2b\x85\x3f\x32\xee\x7c\xd6\xc2\xc1\xe9\xba\x3c\x96\x7a\xc8\x7c\x6f\xb9\x56\xed\x3d\x63\x52\xe2\x66\x10\x40\xe0\x2a\x8a\x62\x0a\x53\x5b\x28\xd9\x84\xc8\x40\x37\x1c\x17\xf9\x9c\x1b\x84\xc6\x1c\x9d\xdd\x71\x8c\x3e\xda\x57\xef\xa7\x26\x8a\x3d\x69\xf6\x50\xbc\x8e\xf4\xce\xae\xdf\xe8\xcc\x82\x1e\x17\xa0\x81\x78\x98\xcf\xd0\xc1\xc1\x2c\x97\x39\x1f\x0a\x60\xc5\x4d\xa0\xd4\x6c\x5c\xd8\xa3\x80\x6d\x26\x32\x68\xf4\xd8\xe5\xa5\xcb\x8d\x1c\x88\x30\x23\x8f\xb6\x6f\x3d\xe3\xa3\x1c\x63\x9a\xd9\x2b\xf9\x7c\x5c\x2e\xc4\x73\xc5\xde\x3e\xa0\xfa\x37\xa1\x1c\xf9\x7c\x78\xb1\xad\x24\x72\xb6\xa9\x16\x30\x4d\x00\xd2\x06\xe2\x1b\x6d\x19\x60\x60\x93\x93\xa5\x3c\xa4\xa9\xc3\x24\x92\xb0\x54\x72\x60\x70\x6d\xf0\x1c\x78\xcd\x10\x8f\x6a\x09\x47\xb5\x7d\x04\x6e\x5a\x54\xb0\xe8\x5c\x18\xea\x41\xf9\xb6\x9c\xf6\xa9\xef\xb6\xf7\x40\xe3\x2f\x6c\x49\x86\x73\xc6\x36\x67\x4a\x03\x83\xd5\x36\x5d\xce\xe0\x59\x24\x70\x44\x77\x7d\xdc\x9f\x5a\x60\x04\xa1\x07\xc8\x4b\xcd\x9e\xa6\x92\x19\x96\x88\x13\x2c\x09\x49\x3e\x77\xa8\x60\xef\x1d\xdb\xb4\x06\x0c\x12\x85\xf7\x5b\x6f\xdc\x27\x8c\x21\x80\x23\x34\xc9\x67\xe2\x46\xa5\x5c\x89\xf1\x24\x72\x89\x66\x01\xf4\x52\x82\xba\x18\xda\xc2\x77\x4a\x56\xdf\x6a\x0f\x62\x1e\x3d\xc9\x8c\xc6\x35\x7b\xf8\xb6\xba\x49\x41\xf2\x3e\x94\xe0\x6f\x17\x11\x67\x59\x72\x26\x8e\x9d\x85\x33\x65\x3c\x12\xb2\xee\x8a\x67\x93\xea\xb8\xb0\x35\xd9\x83\x95\x44\x00\xe6\xd4\xe8\x3d\xb4\x2d\xd1\xbe\xb9\xce\x62\x59\xf3\xb9\xcc\xbd\x2b\x43\xff\x42\xe0\x90\x2e\xbc\x99\x82\x99\x04\xa0\xad\x99\xa2\xbe\xd1\xb2\x2e\xb9\xc0\x31\x41\x1e\x68\xf8\x2e\x70\xef\xd4\xfe\xc4\xf2\xd9\x0b\x28\xf7\x52\xfb\x28\x82\x17\xe2\x74\x8c\x40\xae\xd0\x08\x76\x7a\xa7\x20\x6a\x88\xd0\x1e\xac\x83\x89\x11\x8f\x71\x55\xeb\x5c\xc2\x61\x79\xc0\x2a\xc9\x8b\x9d\x7c\x81\x1d\x7c\x10\x94\x77\x43\xb5\x61\xce\x47\xf9\x47\x7e\xa1\xde\xa3\x79\x23\xe8\x32\x92\x34\xcf\x7e\xef\xcd\xb3\x37\xd7\x96\xbc\xa4\x7c\xe4\x29\xc3\xa9\xd3\x85\xd4\x3c\xf3\x11\xcc\x3e\xf0\x88\x95\xe4\xbf\xdd\x76\xfd\x63\xbd\xe8\x14\x3d\x8e\x91\x48\x1b\xa2\xe6\x39\x25\xb2\xa2\x2d\xc8\x1e\xe8\xed\x7a\x40\x7f\xac\xdc\xd3\xb1\x58\x44\xb4\x09\x06\x51\x9d\xa6\x4a\x75\x3a\xb4\x42\xc5\xe9\x69\xfc\x55\x74\x61\x93\xe0\x3d\xd2\x7a\x45\x90\x33\x46\xe9\x4e\xee\x03\x34\xf2\xb8\x71\x41\x40\xbc\xf9\xbc\x9a\x1f\x81\x8b\xef\x54\x65\xe1\xa4\x99\xbc\x08\xdc\x6f\x10\x1e\xd2\xad\xc4\xf8\x12\x75\x83\x8e\x80\xf2\xa0\xba\xc7\x87\xce\x71\x72\x54\xa2\x08\x68\x80\x48\x13\x5d\x79\xcf\xab\xe4\xe8\xe9\xe3\xa7\x7d\x34\xa1\x19\x8d\x53\x8d\x49\x02\xeb\x95\x4e\x9c\x0e\xfc\xa5\x98\x82\x0f\xbc\xfd\xbc\x21\x0c\xbc\x6a\x1a\x98\xaa\xfa\xed\x06\x62\x41\xc4\x98\xee\xcb\x4f\x17\x4f\x4c\x41\x8f\x12\x49\x8a\x14\xdb\x10\x38\x35\x37\xff\x32\x1d\x3e\x04\xd8\xd4\xe2\x3c\x54\xec\x75\x95\xfe\x48\x78\x3c\xe1\x2a\xf0\xe7\x5e\xc5\x92\x81\xfb\x15\xa2\x49\x8c\x35\x0b\x28\x1e\xba\x7d\xdb\x8f\x5e\xb8\xa5\xde\x35\x47\x4d\xd5\x13\x8e\x4f\xa8\xfa\xd9\xfe\x36\x7d\xb8\x93\x40\x75\x5d\x3d\x50\x97\x6d\xeb\xf9\x57\x9b\x5d\xa2\x68\x5b\xce\x36\x16\xd9\x71\xe9\xaa\xed\xfd\xed\xe2\xc9\xc6\x5b\xfc\x15\xf3\x0c\xf3\x57\x2b\x64\x40\x74\x77\x0f\x5b\xb4\x6e\x87\x7f\x6f\xe9\xc0\x6c\xee\xb5\x68\xf3\x76\xfc\x4f\xe7\xc8\x75\x2c\xb9\x3f\x81\xab\x99\x42\x2b\x04\xa0\x7b\x97\x75\x35\xce\xf9\x14\x6f\x54\xcf\xb3\x8a\x1d\x8c\x66\xf9\xe2\xcc\xf9\x57\x99\x89\xb8\x33\x84\x6b\x02\xa1\x76\x3c\xae\x00\x85\x7e\x9a\x0c\xfc\xf9\x18\xfc\x29\x58\xd9\x82\xd4\x24\x7c\x25\xb5\x40\xc7\x16\x8f\xb3\x5f\xdd\x20\x6b\x5f\x79\xdf\xc2\xcd\x00\xc4\xe5\x1a\x8d\x37\x60\xf6\x2d\xc7\x12\xae\xb2\x34\x32\xa4\xef\xa9\xfe\xea\xa6\x69\x07\xdc\x5b\x5e\x9b\x2d\x98\x73\x64\x27\x0b\xfc\x6c\x75\xb7\x95\xbe\x08\x71\x25\x40\x12\x75\xb1\x01\x61\x5f\x96\x53\xa3\x8b\xa2\xf5\xce\x9e\xb2\x88\x31\x80\xd9\x74\xfd\x03\x0c\x96\x50\x94\x00\x0f\x47\x53\x3a\x26\x5f\x37\x78\xcc\x0a\x3a\xc6\x7d\x31\x0e\xb0\x6e\xb9\x55\x78\xa1\x81\x96\x8c\xd6\xe7\x65\xc2\x1a\x2f\x70\x6f\x97\x7d\x5d\x37\x2f\x54\xf4\xbd\xb1\xdb\x60\x5b\x97\x58\x9a\xa6\x7e\x19\xf0\x9b\x64\x1c\x50\xd3\xd2\xdc\xf7\x7d\x17\x5a\xdb\x94\x60\xae\xc3\xb2\x9e\x36\x82\x5e\xe0\xb6\xb4\xdf\x58\xe4\x24\x87\x51\x64\xbf\x49\xdd\xa0\xa5\x6e\x60\x3d\x19\xa6\x87\xfb\xc0\x08\x9d\x6c\x92\xbf\x75\x04\xb4\xb2\xde\x46\x21\x5a\x98\x7b\xb6\xef\x6b\xf7\x11\xf9\xea\xf5\x31\x12\x4f\x47\x5b\xb9\xc7\x5d\x1c\xb6\x34\x50\xd5\x0d\x28\x5b\xd1\x72\x6a\x74\x22\xca\x8f\x21\xb0\x87\x7e\x90\xda\xfb\xf7\x76\x13\x75\x6f\xa5\x96\x67\x13\x65\xb1\xbc\xe5\x34\xc0\xea\x70\x3d\x92\x1e\x96\x80\xef\xc8\x56\x81\x2c\x9c\xee\x57\x61\xfd\xbb\xd4\x5a\xff\x44\x67\x19\x86\xda\xe4\x31\xc4\x0a\x19\x05\xff\x22\x9e\x75\x89\xfb\xdc\xe9\x10\x97\x4e\x06\xf0\x51\xc0\x6a\x5a\x68\x95\xca\x11\xe6\x20\x01\x9c\xaa\x62\x2e\xb0\xc3\x59\x6c\xfd\xb6\x49\xb3\x8d\xb4\xf2\x10\xc1\xe6\x56\x37\x94\x96\xeb\x25\x40\x64\x55\x5d\x53\xaf\x5f\xaf\xa2\x5a\x14\xba\xf1\x38\x72\x6e\x62\x87\x15\x7b\xa4\x11\x67\x01\xd0\x5c\x20\x8d\x94\x2d\x29\xf4\x18\x89\xa6\xac\x35\xf8\x5c\xed\x00\x53\x1b\x8a\x41\x5c\xdf\x9c\xb6\x99\x93\x82\x68\x92\xe6\xa6\xb5\x7a\xc7\xdd\xe8\xf8\x17\x7e\xbc\xc1\x4e\xc9\x10\x07\xd1\x21\x3e\x40\x34\xbf\x3c\x34\x54\x26\x21\x4c\xbf\x5c\x8d\xf9\xe3\xd3\x82\xf4\x47\xc4\x1e\x69\x62\x7c\xc3\xe5\x7f\x77\x8d\xbb\xd1\x38\x01\x27\xb2\x7e\x69\xee\xa4\x62\x00\x95\x48\x6f\x44\x97\x87\x16\x0e\xb2\x35\xfa\x97\xdd\x2d\x34\x04\x2e\x09\x0a\x6e\xb2\x96\x80\x01\xa8\x33\xa5\xef\xe5\x4e\x70\x85\xe8\x51\x65\xf4\x64\x58\xf4\x53\x2d\xaf\x39\xfa\xb6\x5c\x58\xcc\x25\x47\xcb\x70\x36\x22\x0a\x85\xb1\xe4\xa3\x8a\x03\x35\x89\xeb\x51\xaa\x40\xc2\x26\x46\xe1\xb2\x91\xd5\xa4\x67\x38\x7a\xd6\xff\xa2\x9a\x13\x61\xbb\x59\x78\xa3\xe2\x4c\x7f\xde\x9e\xf5\x7d\xac\xc7\x89\x77\x37\x1d\x5a\xe0\xd2\xa6\x51\xcb\xdd\x55\x3f\x58\x27\x04\x1e\xcd\x0b\x36\x70\x07\x3c\xfa\x1e\xdc\x48\xa6\xc4\x06\x3b\x59\xaf\x11\x67\x1b\x3c\xb0\x6e\x2c\x34\x6c\xeb\x58\x86\x28\xb7\x30\x8d\xb2\xd2\xd9\xa1\xf3\xdd\x45\x9a\x43\xe7\xbe\x89\x0c\x63\x6f\x85\xb5\x6e\x12\x5f\xd9\x57\x1c\x35\xfc\xaf\xbe\xa3\x5e\xd9\x7b\x05\x02\x19\xf6\xbe\xd1\x63\xbe\xcd\xde\x80\x59\xda\x7b\x79\x88\xe9\x17\x41\xa0\x5f\xc3\xee\xb8\xfe\xca\x76\x65\x5f\x7d\xcb\x92\xea\x6e\xe3\xce\x56\x75\x5a\xdb\xa2\x9a\x3d\x5f\x34\xac\x53\x51\x89\x2d\xc0\xac\xbc\xbc\x43\x54\x15\xd8\x65\xc3\xbe\xd3\x9d\xb1\x5c\x6a\x01\x54\x37\x4a\xa5\xe0\x60\x4c\xee\x59\x35\xa1\xf9\x81\xd6\x61\x98\x79\x94\x1f\x83\xe7\xf8\xc5\x7b\xc9\xfe\x65\x44\x76\x5b\xf3\x2f\x28\x36\xa0\x32\x58\x64\x19\x9c\xff\x36\x51\x5f\x2a\x57\x0a\x88\x2a\x27\xf0\x4f\x59\x9e\x2b\x08\x5c\xf1\x7c\x6e\xef\x52\xd5\x94\xb7\xa9\x93\x61\xca\xe3\xe0\x92\x00\x95\x4a\x11\xaa\xce\x83\x21\x7a\x47\xd0\x38\xb7\xdf\xe4\x5d\xc9\x55\xee\x49\xae\x7d\x47\x12\xdc\x8f\x84\x77\x23\xd1\x7b\x91\x96\xc3\xff\xda\xbb\x10\xec\x83\x12\xb9\x11\x41\xdb\xba\x8e\x14\xc4\xb1\xaf\x5a\xc2\xd9\xe8\x4f\xb7\x86\x58\x0d\xbc\xe2\x2a\x42\x2b\x42\x5c\x31\xf4\x94\x9f\x08\xab\x37\x55\xfa\xe6\x7e\x46\x67\x8a\xdf\xf5\x64\x78\x30\xc0\x28\xf7\x57\x4d\xa6\x52\x4d\x61\x7e\xcc\x7f\x2e\xdb\xc3\x2b\xec\x0d\x39\xc4\x58\x60\x04\x45\xd4\x1b\xb9\x7f\xff\x2b\x17\x6e\x10\x75\xb6\xee\xdf\xff\xda\x05\x5b\xc4\xbd\xa8\xfb\x3b\x77\xef\xb5\x45\x28\xa0\x67\xfe\xbd\x4f\x9e\xf9\x1f\xdd\x33\x5f\x4d\x50\xab\x27\xfe\xeb\xe2\xe2\xa0\x04\xa3\xb6\xef\xb7\x6e\x1f\x6b\x67\xf5\xdf\x08\x97\x66\xe8\xf2\x51\xb8\x53\x39\x66\xd3\x23\xc8\x53\xf0\x7e\x30\xd3\xc1\x49\x41\x63\x3e\xe0\x38\x14\xe4\x06\x4e\x1e\x31\x28\x91\x46\x16\x97\xc9\x79\xb0\x73\x20\x6b\x99\x8f\xcb\xff\x2e\xf8\xea\x05\x1b\x39\x42\xbc\x9d\x53\xe7\xcc\xb3\x67\x36\x3c\x71\xed\x30\x8c\x81\x8e\x68\x55\x0d\x87\x98\x02\x3d\xb2\x5a\x1b\xe3\xdc\x81\xd6\x79\xd3\xf8\xe1\x05\x76\x88\xd0\x49\xcc\x73\x02\x76\x0e\x59\x9e\x03\xa7\x7b\xac\xbc\xfc\xdc\x43\xed\x16\xc6\xfe\x5b\xab\xa2\xa7\x62\xcd\xb2\x2b\xdd\xcd\x5f\x7f\xe7\x9b\xef\x70\x05\xde\xdf\x64\x05\x76\xad\x1b\x54\x97\xaf\x28\x5a\x96\xe5\x97\x9f\x96\xe5\xd5\x96\xe5\x13\xc3\x6c\x6f\x5c\x2e\x97\xd6\x05\x49\x49\xa2\xfc\xd5\x48\x71\x59\x19\xbd\x92\xe0\x13\x1b\x54\xe5\x97\x75\xb1\x56\x12\xd9\x02\x78\x53\xe2\xf7\xf4\xdb\x1c\xc0\x4b\xe7\x8f\xd0\xa3\x4c\xf6\x13\x28\x84\x21\xb6\xe5\xd0\xb6\xcf\x2f\x81\xd6\x45\xc4\x5a\x85\xac\x4f\x66\x74\x5f\x17\xc5\x0c\x13\xb9\x0f\x5f\xc3\xe8\x9d\x13\x59\x71\xa5\x94\xb4\x97\x53\xec\x33\xc2\xe2\x6c\x11\x14\xde\xe9\x51\xd5\xa8\xe2\xf7\x4b\x6a\x02\x69\xf3\xd1\xfa\xdd\x6a\x0c\x86\x71\x1f\xe3\x9b\x81\x5f\x1f\x8a\xbb\x27\xe5\xe5\x1a\x0e\x8b\x19\x69\xfd\x48\x88\x23\x19\x86\x45\xf9\x86\xaf\x70\x4d\x5b\xe4\xdc\x63\x75\x14\x53\x9a\xa4\x0e\xba\x4e\x22\x5a\x1a\x66\xd1\x99\xda\xc0\xdb\xa9\xe9\x7a\xc9\x38\x4c\x39\x9e\x98\x28\xc2\xfa\x2f\xb1\xe1\xf3\x12\x01\xe9\x17\xa2\x03\xb4\x0d\xba\x5f\x9a\xc3\x54\x63\x9d\xe3\x53\x9c\x97\xad\x9a\x1a\xbd\xc8\x5f\x4b\x47\xa1\x0c\x3b\x9f\x61\x74\xc9\x96\x4a\xd2\x53\x20\x4c\x18\x02\x09\xb8\xce\x1c\x35\x26\x62\x6d\x4f\xa2\x73\xb7\x71\x37\x8c\xb4\x02\xf3\x0a\x05\x01\xe1\x01\xcd\x32\x52\xcd\x3e\xbb\x19\x05\x0a\x99\x92\xce\x95\x8d\x80\x60\x61\x9a\x72\x9c\x44\xd3\x6d\xd0\x32\xcb\xe1\x72\x4c\xcc\x46\xb6\x9c\x65\x2d\x88\x0f\xd8\xae\xd2\x65\xfc\x46\xa4\x3c\x9a\x03\x49\xc1\x45\x23\xe0\x77\xa5\x68\xef\x7f\x61\x47\x80\x16\x67\x37\xc2\xe2\x69\xd2\xf8\xc6\x1b\x8b\xc2\xbc\x9c\x03\x70\xd8\x19\xac\xa6\xba\x84\x5b\xdc\xf3\x42\x72\x25\x11\xa2\xe8\x09\xa3\x0d\x53\x20\x3e\xc0\x4a\x0d\x25\x3d\x54\xcd\x74\x40\x77\x26\xc8\xd2\x62\x5c\x40\xee\x26\xdb\x9b\x5d\x23\x00\x78\xe1\xab\x8e\xf0\x9a\x35\x02\x1c\x64\x97\xed\x46\xbb\xb0\xf0\x3f\x60\x7f\x5b\xa7\x1d\xfc\xa5\x58\x88\x72\x00\xcd\xd2\x19\xb7\xb4\x74\xc0\x76\xe6\x90\x4d\x6a\x58\x9e\x98\x71\xa7\x65\xe4\xf9\x96\xeb\x20\xdc\x4b\xeb\xf8\x7f\xc4\x8b\x16\xbe\xb7\xa7\x58\x40\x52\x22\x0c\x00\x43\x9a\x9c\xc6\xc5\x19\xd2\xa5\xa5\x3c\x72\x20\xd8\xd8\x82\xa1\xca\x4e\x29\xa5\x32\xdf\x09\x18\x30\xd2\xbc\x49\xfb\xb9\x9a\x4b\x96\xcf\x42\x00\xf4\xc5\x05\x9a\x73\xce\x8b\xd1\x75\x21\xf0\x4a\x2e\xe9\xbc\x8c\x2e\xb7\x4d\x97\xa4\x71\x14\xa8\x50\xc8\xde\x1b\xbe\xf5\xd2\xfd\xc8\x64\x44\xf8\xec\x85\x79\x86\x17\x7d\x84\xc4\xef\x7f\x40\x92\xd4\x2e\xd7\x96\xaf\x1b\x8b\xd6\x3c\x68\xe3\x08\x60\xf5\x9e\xb4\x3e\xcc\x91\xcb\x2b\xfe\x32\xe0\x0e\xde\x10\x44\xd1\x6a\x88\xae\xf7\xe1\x0d\x15\x20\x62\xcd\x95\xad\xec\xe0\x5a\xb0\x29\x47\x10\xcd\x7d\xfe\xce\x9d\xe3\x3d\x6e\xb8\x2e\x30\x44\x74\x23\xa0\xe3\x7e\xe7\x08\x4f\xc6\x08\x12\x66\xb3\x2e\x7a\xb9\xc4\x68\xe1\xd3\xe2\xb0\x38\x17\x9a\x89\xb6\x42\x10\x85\x68\x75\x04\xdf\x26\x30\xcf\xc5\x79\xbc\x51\x5d\x4d\x38\xb5\xd5\x48\xb2\x5b\x37\xe1\xde\x84\xc1\x8e\x42\x06\x44\x6f\x4e\x82\x73\x7c\x7c\xc0\xc9\x50\x63\xd6\x1f\x10\xe9\x3a\x63\x8f\x6a\x69\x73\xf7\xe9\xb2\x7f\x50\x4b\x7b\xb4\xed\x40\x69\x64\x4d\x0c\x78\xbf\x49\x65\xed\x6d\x8d\xdd\x20\x95\x56\xb8\x08\x6c\xa2\x26\xd8\x6a\x1a\x4d\xc4\xc6\xb5\xe9\x35\xac\xce\xac\x10\x43\xfd\x55\x2f\x81\x07\x5a\x18\xb6\xdf\xf6\x42\x7f\xe3\x8d\x79\x3f\xfe\x18\xca\x07\x03\xd2\x0f\x1f\xa4\x76\x0f\x32\xc3\xd7\x5f\xad\xc1\xad\x30\x65\x04\x9f\x5c\x01\x33\xc2\xd7\x9c\xfb\xf7\xbf\xba\x17\xc3\x23\x68\xe0\x08\xec\xdc\xe8\x59\xe9\x93\x09\xe3\x8a\x67\x25\x04\xea\x68\x3d\x21\x6d\x74\xf0\xd1\xf1\x37\x48\xae\x0e\x63\x6f\x00\xcf\x12\x74\x62\xa3\x5c\x11\x10\x10\xaa\x58\xd5\xf9\xb4\x08\x02\x50\x3e\x97\x99\x52\xa1\x31\x01\xad\x3b\x77\x10\xa8\x08\xd5\x6a\xa6\x86\x66\x51\xa0\xa6\x43\x6a\xd8\xbd\xe9\x73\x82\x5a\x76\x8d\x5b\x49\x5a\x48\x52\x05\xb1\x06\xe2\x96\x06\xc6\xc5\x91\xab\x1f\xf8\xe5\xf5\x14\xfc\x21\x31\xa8\x7e\xdb\xbc\xd8\x96\xce\x3c\x07\x7d\x12\xea\xc9\xdf\xe4\xe5\x18\x6b\xc2\xab\x7e\x09\x16\xc1\xac\xa8\x64\xcc\x49\x46\x4b\x1e\x25\x8e\x54\xca\x65\x6f\x04\x42\xa4\x9c\x1c\x5c\x68\xb9\x45\x08\x3f\x6c\x64\x46\x59\xfc\x3b\x15\x4d\xf8\xcc\x11\x3a\x00\x7c\x2e\x96\x6f\x12\x9f\x5d\xf7\x24\x49\xbe\x1f\x95\x6f\xcc\x60\x3d\x32\xcc\xfd\xfa\xe1\xef\x68\x31\x25\x0c\x37\x7c\x72\xf9\x83\x2e\x6b\x4a\x3f\x5a\x9a\x59\x9d\xb8\xd6\x98\x4e\x3f\xdc\x1e\xe2\xc3\xed\xe4\x8e\x57\xfa\xfb\x3b\x86\xb4\x7a\x02\xbb\x1f\xfd\x0d\x8a\x39\xfd\xa5\xaa\x6a\x6b\x34\x1b\x71\x4f\xea\x8c\xaa\xd1\xcd\xeb\xc6\x68\xea\xbc\x9c\x9c\x17\x67\x43\xca\x9c\xce\xbd\xfc\xef\x42\x13\xa6\x3f\x2e\xf1\x89\x9d\x5b\xf6\xf1\x30\xa7\x8a\x02\x20\xa6\xc9\xd5\x23\x23\x03\xde\x5c\x26\x1f\x9e\xe1\x3d\xfa\x85\x94\x47\xae\x3c\x46\xdc\xf6\x02\xaf\xd4\x3f\xc7\x9b\x86\x79\x35\x4e\x0c\x33\xe4\x16\x89\xc1\x41\xe9\xb9\xac\x27\x9d\x9a\xca\x9c\x8c\xab\xf3\x58\xe4\x9a\x5b\xd3\x76\xcf\x23\xd6\x0f\x43\xd4\x1a\xde\xa5\xf4\x7f\x7e\xd9\x9a\xa4\x65\x40\xc5\x06\x3a\x07\x34\x2e\xbf\x66\x96\x43\xca\xc5\x82\xf0\x3e\xd8\x04\x35\x03\x44\x24\x50\xd7\x6f\xdd\xb2\xa0\xab\x7c\x46\xb5\x6e\x41\xac\xfa\x57\xbc\xcd\x2c\x16\xe6\x90\x6a\x66\x20\x50\xff\xc1\x51\xc8\x2f\x39\x2a\xe2\x25\x19\x84\x95\xcf\x87\x7a\x58\x76\x47\x23\x3f\xbb\x24\xe2\x11\x9e\x50\x28\x7f\x28\x68\x36\x49\x2f\xe9\x28\x79\x17\x27\x56\x80\x04\xd9\x25\xe5\xe2\x04\xea\xc4\x7b\x13\x53\xbf\x3d\x86\xe1\x47\xe2\x03\xd3\xc8\x74\xa1\x1b\x80\x03\x7e\xc9\xed\x75\x15\x9b\x4d\x54\x11\x1b\x56\xf3\x11\x1b\x7b\x4f\xd6\x26\xa9\x84\xd9\x34\x1b\x95\x4b\x49\x59\x9b\x61\x3d\xaa\x62\x47\xf6\x14\x08\xa6\x54\xf9\xfb\xe3\x0b\xbb\xfe\x64\x9a\x9b\xba\x44\xde\xa2\xb8\x45\xda\xc6\x48\xc0\x4f\x61\xb9\xe5\xde\x36\x60\xa6\x12\x8f\xf8\xb8\xee\x49\x07\x88\xc0\x53\xfb\xa8\x83\x01\x46\x9c\xa9\x0f\xaf\xe8\x88\x35\xb4\x8b\x12\x94\x57\xd4\x46\x55\x51\x23\xea\x1b\xd6\x68\x99\xa8\xcb\xab\x3c\xb5\x48\x83\xce\x3c\x2f\xa9\x5b\x04\x3c\x22\x96\x6f\xf8\xbf\x8c\x24\x18\x90\xa4\x1f\x70\x12\xe5\x9e\xe9\xca\x5c\xc3\x67\x86\x3e\x65\x96\xb0\x22\x48\xa9\xdd\x16\xd5\xec\xf6\xb8\x78\x53\xe8\xb3\x22\x23\x14\x82\x6d\xe7\xac\x1a\x3b\x4e\x89\xe1\xc5\xad\x9e\xa4\x1e\xdf\xb6\x91\xa0\xb0\xcb\xb7\x8b\x6c\xe2\xb4\xfb\xc8\x72\x54\xfe\x22\xe1\x8a\x44\x0f\xfb\x1b\x5d\x93\x60\xa8\xdb\x70\x55\xb2\x55\x8b\xa7\x5f\x79\xa1\x5c\x75\x1d\x32\x11\xb4\x27\xc1\x7a\x64\x6f\xbf\x75\x2b\x91\xef\x33\x3d\x86\x07\x04\xbb\x3f\xcd\x72\x6c\x6b\xe0\x07\x5d\x93\x73\x0e\x67\xfb\xb4\x2c\xaf\xb4\x2c\x21\x77\x26\x80\x8a\xd1\x18\x0d\x86\x2e\x94\x1c\x0e\x2b\x98\x57\x1e\x37\x1c\x4e\x61\x05\x83\x2b\xde\x7c\xce\xdf\x8f\x13\x9a\x08\x41\xda\x79\x1d\x7f\xbb\x51\x73\x3d\x31\xea\x16\x9c\x5b\xd8\x7b\x00\xcc\x69\x24\x20\xcc\x89\xfb\xd9\xf2\xd8\xa8\x76\x72\x14\xee\xf6\x50\x43\x7b\x61\xfe\xf3\x92\x72\xc6\xd8\xd5\x1e\x29\xeb\xae\xfe\x89\x9c\x55\x02\x40\xde\xe8\x84\xbf\xab\xae\xf5\x71\x9c\xae\x70\x02\x5e\x7b\xd6\xfd\xf2\xd3\x59\xf7\x8f\x3c\xeb\x02\xc0\x23\xbe\xbc\x02\x84\x9e\x3e\xdc\xc2\xf7\xa4\xf3\x32\x2a\x71\xb2\xfb\xf4\x59\x52\x5f\xd4\x8b\x62\x02\xd9\x46\xcb\xd3\x29\xfb\xbb\x12\x2e\xa8\xf6\x88\x22\x69\x06\xa4\x68\xc2\xe9\x00\x70\xc6\x79\x53\xcf\xcc\xf4\xd5\x7d\x74\x9a\x22\x88\x83\xe2\x24\x5f\x8e\xa9\x42\xb1\x39\xe6\x66\xbc\x2e\x6a\xf0\x27\x34\xfa\x78\xe6\xab\xf7\x58\x90\xaf\xe5\x64\xdb\xfc\x89\xd4\x76\xca\x1e\x05\x07\x4f\x73\x0a\xc3\xb4\x2a\xd2\x3c\x4a\xf5\x01\x81\xaa\x90\x7f\x03\xe2\xf8\x60\x5b\x1d\x51\xd5\x98\xf1\x6d\x5e\xbc\x29\xa6\x7c\x1c\xc8\x87\xc3\x12\x00\xb4\x4d\xaf\xc7\xd5\xe9\xa9\xc0\x2a\x43\x17\x01\xae\xb8\x76\xb9\x2e\xa9\xb6\x03\xaa\xa4\x2f\xc0\xd1\xba\x69\x7f\x35\x32\x0b\xb0\xc9\x59\x8b\x95\xe1\x72\xc6\x3f\xc8\xfa\x61\x86\xec\x27\xdb\x9c\x94\x13\x5c\x71\x51\x6e\xd2\xf4\xc2\xf0\xd7\xf4\x94\xd2\xbe\x9c\x17\x1d\xc3\xf6\x46\xf6\xcf\xe7\xe5\x88\xaf\xa1\x28\x29\x17\x99\xc5\x00\x28\x22\xa8\xc8\xb5\x19\x2c\x14\xc5\xc8\xb6\xf9\xd5\xb4\xe2\xbf\xd3\xe8\x81\x29\x7a\x5e\x0a\xf4\x04\x7a\x07\x9a\x42\xec\x5b\x0b\x62\xc7\x1b\x04\x94\xab\x6d\x73\x7c\x60\xd9\xc6\xa1\x29\x55\xc4\x53\x4d\x40\xa7\xb5\xbc\x22\x42\xb8\x8d\xb2\x86\x7b\x3f\x33\x01\x11\xaa\x42\xf9\x96\x7a\x17\x06\x62\x98\xaf\xaf\x10\x89\x45\xdd\x78\x61\x3e\x7a\x29\x42\x57\x03\xeb\xea\x58\x18\xd5\x63\xf5\x54\xb5\x04\xa9\xa4\x8d\x2f\xf0\xb1\x7d\x1a\xfa\x74\x37\xb5\xcd\x5f\xe5\x0a\x13\xd2\xb7\xcf\xf3\x59\x22\x48\xf7\x00\xee\x2c\x19\xbb\xb8\x7d\x59\xf2\xff\x16\xf3\x0a\x79\xee\x0c\xee\x39\x31\x06\x46\x06\x3d\xa6\x84\x2a\xde\x68\x32\x86\xbc\x3c\x99\x36\xdf\xb9\x2b\x15\xf8\x2b\x38\xa0\xdb\x97\x21\xff\xf8\x8c\x43\xdc\x42\xd4\x53\x7c\xf3\x1e\xec\x82\x3e\x98\x54\xcb\xe8\x67\x43\xca\xf3\x98\xa3\xd7\x72\x17\xf9\x30\x16\x85\xa2\x52\x92\xe0\x8c\x7b\x42\xa3\x19\x0c\x7c\x4b\xd7\x15\x86\x99\x05\xed\x70\x44\xbd\x55\xdd\x32\x04\x6d\x51\x5e\x02\x3f\xa1\x68\x67\xa6\x3f\xe3\x0b\x52\x03\x92\x7c\x7e\x8a\x28\xe0\x75\x34\xce\x4a\x72\xbf\xae\xff\xea\x52\xfe\xe0\xe1\xca\x8c\x94\x9e\x8d\x73\x74\x6b\x34\x9d\xe1\x46\x27\x5f\x24\x9d\x57\x90\x4a\x83\xda\x2e\xdf\x70\x35\xfc\xa9\x53\x6b\xbc\x06\xb8\x23\x95\xba\x1f\xa0\x11\x54\x3e\xa7\x4d\x4e\x53\xb2\xd6\xfa\x5e\x12\x85\x83\x06\x7b\x4d\xc2\x89\x6b\x99\x04\xd3\x23\x2e\xaa\x75\x30\x75\xb5\x7d\x58\x4e\xcc\x68\x19\x5d\x00\x7d\x12\x24\x1d\xa2\xda\x25\x46\xb6\xd2\x34\x11\xb8\x74\x7a\x85\x39\xbd\x5b\xd1\xd3\xec\x92\x6b\x5f\x70\xed\xcb\x2d\xbe\xd8\xf4\x7d\x95\xdb\x31\x56\x2d\x35\x6f\x56\x2e\xdb\xf4\x4e\x18\xb6\x8d\xd5\xce\x86\x92\xf9\xd5\x27\xf7\xcf\x8f\xa5\x4f\x9a\x4d\x0f\x9d\xf5\xc1\x60\xd0\x7e\x89\xb2\xb1\x9b\x19\x02\x83\xff\x2c\x1c\xe5\x95\xf7\x5e\x49\xf9\x7f\x54\xe5\x94\xdd\x5c\xfc\xd2\xea\x85\xbe\xa1\x71\xe1\x4a\x0b\x6e\x35\xb4\xd4\x3c\x3a\x65\xe4\x5f\x3c\x50\x4e\x8a\xf9\x29\x25\x3c\x11\x0c\x3f\xce\xc0\xe6\xe5\x10\xfe\x3c\x19\x60\xc1\x43\x26\x30\xc8\x20\xb0\x2c\xa7\xef\xce\xd1\xd1\xa9\x78\x53\x56\xcb\x7a\x7c\x41\x61\xbd\x29\xcd\x1d\xa5\xf1\x87\xd8\x98\xe6\x52\xd5\xa2\x47\x91\xde\x64\xf9\xd1\x01\x5d\x26\x43\xbe\xec\x7a\x74\x1a\x4b\x10\x97\x08\x5e\xa7\xa7\xa0\xf5\xa4\xd4\x5f\xbd\x29\xde\x22\x77\xad\x95\x3a\x0e\x16\x11\x15\x06\x29\xb0\x68\xf3\x83\xa5\xbd\x62\x5e\xbb\xba\xee\x95\x34\x41\x09\x47\x7b\x77\xbd\x08\x3a\x77\x80\xf3\xf4\xb0\xad\xeb\x2e\x15\xb1\x51\x8f\x2d\x40\x23\x4d\xda\xc0\xaa\xc9\x74\xfc\xc0\x4c\x52\xac\x2f\x75\xea\xa4\x3b\x70\x2d\x1a\x24\xf9\xb1\x29\xdc\x83\x01\x52\x9c\xb0\xc5\xd9\x44\x8d\x72\x37\xd2\x1f\x62\xf3\x07\x54\x1a\xd7\xa6\x7d\x87\xab\xbf\x53\x3b\x44\x5a\xac\x64\x77\x90\x9c\xc3\x7d\x08\xd1\x03\x17\x23\x6e\xd9\x08\x82\x68\x7f\x1e\x97\x94\xbb\x9c\x5c\x95\xc1\x3b\x23\x73\x53\xc8\x6e\x60\xbf\x5f\x9a\x0e\x9a\x9d\x15\x5c\x10\x14\xb3\x1f\x05\x2c\x0e\x3e\xd2\x23\xb3\x2a\xc1\x29\xf9\xac\x3a\xd7\x19\x7d\xb8\x24\x27\x96\x1f\xc8\x6f\x98\xef\xfa\xa8\x42\xb4\x6b\x8e\xb0\x30\x3c\x81\xb9\x67\xc0\xee\x3b\xbd\x60\x44\xef\xb7\xe0\x5b\x07\xde\xcd\x64\x95\x47\x01\x58\x53\x32\x17\x17\x00\x4c\x99\x84\xf0\x9e\x87\x3d\xa3\x07\xc3\x71\x35\x2d\x7e\x33\x5b\x18\x56\xd4\xed\x0d\xe0\x8c\x65\x7a\x0a\xd9\x73\x2f\xdc\x01\x2f\x98\xd9\x12\x17\xbb\x77\xd2\x7b\x52\x40\x32\x0f\xbb\xa6\x07\x43\x2f\x8e\x02\x77\xee\xa1\x8d\x08\xf6\x24\x49\xba\xe5\x67\x8c\x27\x02\x30\xe2\x03\xbc\x4f\x82\xfd\x8b\xe0\xc1\x61\x64\x80\x77\x78\xfe\x27\x8a\xb4\x14\xec\xb7\xb1\xa2\x12\x47\xbd\x15\x35\x22\x87\x70\x6d\x5d\xb2\x70\x51\xc6\x5d\xb9\x29\x6a\x6d\x02\x7e\xd9\x8f\xaf\x10\xad\x5c\x1c\x60\x7a\x4a\xcd\xf3\xa2\x8f\x61\xaa\x4a\xe1\x03\x91\x76\x0c\x8b\x0e\x23\x6e\xa1\x5c\x88\xe5\x81\x98\x7c\x1a\x4a\x31\x39\x1b\x22\x83\xc5\x5e\x4c\x8b\xf3\x67\xf6\x9d\xc8\x35\x7e\xe9\x4b\x35\x69\x11\xe4\xf8\x10\x41\x25\x5f\xd3\x92\xb6\xa7\x36\xe0\xbb\xff\xa0\x93\x9b\x5f\xc2\xc2\x67\xd0\xc3\x50\x96\xf1\x77\x4a\x9e\xf9\xe7\x35\x46\xc6\x89\x09\x20\xc3\x86\x4d\xde\x7c\xc1\x04\x5f\xaa\xd4\x86\x8d\x0f\x3f\xfb\x2c\xf2\xe5\xfa\x96\x85\x74\x64\x48\xb8\xa4\x1b\x1b\xdb\x88\x9e\x27\x8a\xdb\x25\x7a\xb3\xae\x99\x47\x07\xe1\x30\x02\xda\x5a\x81\xb5\x32\x09\x3f\x6b\xa0\x92\xfa\x8a\x42\xe8\x76\xe0\xf1\x1d\x89\x25\x05\x1a\xee\x39\x4d\x91\xfc\xcd\x9b\x32\x8a\x4f\xa9\xb1\xdb\xe0\x88\x96\xe2\xec\x46\x7e\xc3\xc2\xfb\x61\xda\x62\x16\xe7\x95\x64\x93\xe3\x40\x12\x6a\x46\x64\x0a\x23\x47\x5e\x6b\x2a\x19\x8f\x9e\x11\x11\xa3\x90\xc1\xb5\x06\xd3\xec\xe2\xad\x38\xf8\x50\x83\xca\x30\x2c\x46\x70\xf5\xd2\x8b\xd3\x90\x39\x40\xbb\xb8\x1d\x29\x52\x58\xca\x69\x70\x2a\x96\x8f\xc8\x8a\xce\xb7\xc9\x9c\x90\x05\x73\xf1\x99\xf1\x25\x4d\x04\x74\x45\x24\x86\x94\x46\x99\x3a\x46\x9b\xdf\x58\xa3\x3e\x49\x73\x47\xc2\xa5\xe8\xf2\xfe\xea\x55\xab\x36\x29\xf9\xb0\xa7\xbe\x7c\xb0\xce\x06\xed\xcf\x90\x0d\x3a\x89\x3b\x5b\xf9\x5a\x62\x7f\xe7\x2b\x4c\x09\xa3\xb5\xc1\xfe\xce\x37\xdf\xe2\x29\xe1\xeb\x4f\xa6\xe8\x3f\xfc\xe8\x70\x31\x2b\x7e\xa9\x86\xe8\xe5\xc3\xe6\xbf\x55\x39\x5c\xa2\x9f\x70\x4c\xc7\xd6\x15\x2d\x38\xab\x09\x6e\x89\x00\xec\x27\x1d\xf8\x1f\xfb\xb9\x72\x24\x6c\x1f\x6e\xba\xf0\x2f\x79\x0e\xba\xc5\x23\xf7\x92\x83\xfa\xa9\x88\x55\x61\x57\xb0\x77\xd8\x86\xeb\x9f\x7d\xbf\xf9\x74\xf6\xfd\x83\x18\xf8\x3d\xc3\x1e\x5b\xb9\xbc\x19\xfe\x47\x8c\x29\x91\x7c\x96\x29\xed\x03\x8f\x1b\xd7\x85\xf6\x35\xaa\x5b\x15\xd6\xf7\xed\x27\xee\xfa\xc8\xdc\xb5\x46\x24\xba\x84\xd8\x61\x1e\x28\x49\x36\xa7\xb3\x47\xfd\x3c\xcf\x4f\x5b\x8a\xcb\x2b\xaf\x7c\x9b\x7c\x0c\x3f\x8e\x96\xb3\x5c\x7d\x15\xa3\x8e\x63\x9e\xf1\x98\x63\xed\x00\x57\x9c\x2f\x20\x08\x8d\x6b\x3c\x36\x87\xd7\x51\x61\x14\x3c\xc6\xcd\x85\x5b\xb8\x37\x94\x3f\x8f\x3f\x60\xcd\x88\xc1\xbb\x80\xa0\x05\xe0\x30\xea\x12\x87\xe7\x38\xaf\xd6\x64\xef\x6d\x3e\x01\x34\xfc\x65\x9d\x9f\x16\x7d\xcf\xdf\x94\xd4\x2d\xd7\xea\x8e\x3f\x3d\x1d\xf1\x8e\x24\xdf\xd4\x5d\x88\x08\x1b\x17\xab\x3d\x53\x67\xf2\x71\x5f\xbb\x60\x9a\xd3\x3f\x58\x0b\x66\xcc\x6d\x1c\x44\x87\x67\x41\xf2\xb6\xdd\x36\x2c\x32\x9c\x97\x58\x00\xbd\x6b\xf9\x43\xf5\xb8\x4f\xcd\xcd\xe8\xe3\xd4\x76\x44\xe8\xbb\x80\xe6\x62\xba\x9c\x78\xc4\x87\xa0\xc1\x1a\xae\xd4\x94\xe5\x99\x90\x35\xc3\xf5\xf4\xa4\xfb\xa2\xf3\xa4\x38\xaf\x3b\x69\xe7\xd9\x59\xb5\xa8\xea\xce\xcb\x5e\x56\xd6\xcf\x99\x70\xa4\x4e\xaf\x0b\x65\x3e\xae\x4e\xb7\x25\x44\x12\xbf\xa9\x29\xbb\x0b\x39\x2e\xc0\xec\x3d\xc6\x42\xba\x87\xf8\x40\x5a\x21\x45\x4d\x53\xa8\xa4\xae\xbf\xe9\x03\x1b\xf3\x03\x4e\xb2\x2c\x6b\x7a\xb3\xee\x92\x39\x03\x2f\xac\xc7\x36\x30\xc8\x32\x15\xd8\x4c\xcc\x2a\x86\xe4\xbe\x2a\xf5\x33\x38\xb6\x3a\x8e\xc1\x70\xac\xfe\x43\x82\xc4\x7f\x07\x7e\xa3\xef\xa0\xde\x77\xa4\x7c\xbf\x23\x9c\x94\x77\x34\x3d\xef\x78\x38\x4d\x5b\x5e\xf6\xde\xa9\x5e\x81\x73\x10\x91\x03\x2e\x07\x72\x3e\xcf\x65\xbf\x63\x02\x82\xae\xea\x76\xef\xc7\x2d\x95\xe1\x0c\x53\x37\xbf\x29\xe6\x17\xde\x32\x21\xe5\x08\xad\x9f\x56\xab\x75\x00\x35\x20\x9a\x40\x95\xce\x17\x78\xad\x27\x77\xf5\xb8\xda\xc8\x5e\x80\xbc\xcc\x63\x41\x5e\xc2\x7a\xd5\x09\x49\xb3\x9a\x7e\x06\xdc\x4d\x5a\x51\x76\x64\x68\x79\xfc\x52\x4e\x5f\xaf\x5c\x1b\xd1\xa5\x11\x5f\x19\xa6\x92\x5f\x9f\xef\x7b\xdc\x75\x26\x7e\xe7\xf4\x1d\xfc\xec\x37\xec\x9c\xf0\x3f\xba\x95\xb0\x12\xe0\x89\x40\x65\x08\xc3\x31\x40\x66\x35\xfb\x1b\x58\xf3\x10\x20\x13\x0e\xbe\xf2\xe9\xcb\x07\xaa\x28\x61\xfb\x49\xd1\x5b\x74\x0b\xa8\x9c\x70\xf5\xbb\x87\x49\x87\x5a\xdf\x41\xaf\x5e\x4b\x03\xfe\xdd\x52\x54\x54\x2c\x8f\xe9\x63\xcf\x6f\x9b\x17\x8d\xb4\x87\x5a\x41\x40\xaa\xb3\x87\xe1\x9c\x98\x21\xdd\x8d\x96\x59\x65\x30\x60\x60\x30\x81\x7b\x34\xe9\x0c\x5c\xac\xc1\x06\x85\x6e\x57\x1e\x19\x6f\x7c\xbc\x77\x3d\x3d\x00\x97\xf6\x6f\xf9\xcb\x2e\xbe\xd8\xda\x33\xdc\x4d\xe5\xdc\xc2\xf3\xc1\x10\x70\xd3\xd8\x7d\xf2\xf4\xc9\xdf\x0f\x9e\xfe\x7a\x08\x39\xfa\xbf\xff\x3e\x9f\x56\xd3\x8b\x49\xb5\xac\x7f\xf8\x41\xf6\x3f\x8e\x06\x03\x6e\x41\xbf\x2d\x3c\xbd\x13\x4f\xed\x35\x5e\x75\x79\x5b\x93\x3c\xbe\xe1\x17\x80\xb2\xa3\x8a\x36\xb7\x40\x39\x16\xe0\xc2\x16\x3b\xdf\xb3\x79\x39\x29\x21\x5a\x48\xd7\xd4\xc1\x22\x1d\xb4\xf3\x81\x00\x58\x5d\x98\x5d\xcb\xa9\x38\x0c\xd3\xea\xe2\xce\x77\x1b\xca\x93\x38\x59\xfd\x05\x95\xa1\xf2\x24\x85\x56\x97\x67\x73\x35\x96\x27\xde\x59\x5d\x9e\xf9\xb9\x87\xd7\xab\xf9\xd4\x8e\xcd\xee\xf4\xc2\x1b\xff\x54\x06\xef\xe9\x89\x2d\x42\x3f\x55\x31\x28\x54\x48\xc8\x59\x73\x82\x29\xc2\x4b\xe4\x64\x18\x2a\x16\x14\x9c\x52\xa6\x24\x7f\xc2\xdd\x28\xb8\xef\x9f\xf2\xef\xb0\xd8\x54\xd5\x01\x80\x1f\xb1\xf7\x47\x98\x7e\x89\xca\xfc\x3a\x35\x13\x13\x14\xaa\xcf\x72\x57\xe0\x10\x7e\xa8\x02\x68\xf4\x08\x2e\x70\x1e\x9d\xe5\x25\x3a\x02\xe8\xc1\x63\x31\xcb\x17\x33\xee\x0b\x78\x0d\xe5\xba\x6a\xff\x4d\x56\x8b\xb9\x34\x19\xb3\x92\x26\x36\x1b\xef\xb5\x8e\xc9\xc5\xdf\xef\xde\xb9\xa5\xf8\x60\x4b\xcb\x3b\x25\x0e\xc3\x88\x5f\xc6\x41\x56\xda\xe0\xca\xd3\xee\x0b\x29\x69\x91\x83\xa1\x0e\xb5\xb9\x35\x70\xa1\x3d\xd1\x67\xff\x75\xb7\xe5\x8b\x64\xdb\x48\x35\xaf\xfe\x2f\xcc\xa3\xc1\xb6\x2f\xf6\xb6\x07\xd6\xbd\x95\x37\x7b\x82\x85\xd9\xee\x79\xd9\xdd\xbb\xdb\xf8\xa1\x3f\x2e\xf0\x75\xb6\xdd\xdb\xd2\x12\x51\x64\xa0\xd7\x50\x07\xa2\xe4\xdf\x86\xf1\x7b\x99\xda\x35\xbb\x93\x9a\x36\xcf\x75\x53\x92\xba\x40\x92\xe4\xd1\x23\xe1\x07\xcc\xef\xc2\x7f\x67\xc7\xe5\x74\xd4\xc5\xb3\x21\x39\xa2\x21\x81\xf0\x0b\xa5\x4a\xb4\x7d\x0c\xb8\xfa\x94\xeb\x5c\x42\x4f\x03\x1a\x68\xe4\x08\xd8\x39\x2a\x33\x0a\xde\x9d\xe0\x59\xc0\xd2\x57\x1f\x0e\x1e\xd0\xf5\x1b\xb6\x2a\xc4\x63\x04\x5e\xb3\xfc\xcb\xed\xbd\x3d\x9f\xcb\x6d\xd2\xf7\x66\xa3\x6f\x80\xcf\xe1\x3e\xd2\xd6\x0c\xb8\xd0\xe8\xc1\xe1\x54\xe1\xd4\xe8\x65\x17\x29\xc4\x3a\x15\x77\xe6\xc5\xa9\x69\x43\x8a\x8e\x21\xa8\x8f\x89\xa8\x76\xb4\x70\xde\xc4\x17\x10\x4f\xa5\xd5\xc9\x09\xa6\xf0\x47\xc5\x16\xac\xcb\xa5\x61\x41\xcc\x2b\x60\x94\xd8\x1a\x4e\x3b\x84\x85\x66\x54\xc4\x33\x3c\x4e\xe7\x53\x47\xae\x03\x87\x62\xe8\xbf\x84\x3b\x75\x34\x56\x1d\x53\xd3\x63\x69\x1f\x78\xc3\xb9\xb5\x6e\xe5\x76\xb7\xf7\xa7\x14\x43\xb5\xe9\xb2\xb5\x0d\xa3\x57\xae\x21\xf8\xd6\x5b\xbf\xdd\x6d\x7d\xf4\x6b\x59\xc9\xa9\x9d\x5e\x2a\xa1\x27\x3b\x58\xea\xbd\x88\x8f\x91\x2c\x72\x0d\x4e\xb0\x81\x34\x8f\x2d\x98\x70\xdb\xf4\x62\xbd\xdb\x69\x7a\x07\xe9\x0c\x4e\x57\xcf\xf1\x9b\x1a\x17\x6f\x2f\x5e\x55\x63\xfb\x45\x70\x09\xfe\xfb\xa3\x2e\x4c\xbc\x97\xc2\xf6\x18\x41\x84\xff\x57\x1c\x74\x63\xab\xed\x0a\xcb\xff\xc3\xb0\x6b\xc0\x98\xb6\xa4\x63\xdd\xab\xf1\x6a\xce\xb9\xd7\x5a\xb8\xd3\x5e\x8d\x96\x98\x70\xc0\xfc\xef\x7b\x37\x15\x9c\x43\xd0\x3c\xfd\xe2\x0b\x7f\x84\x0b\x36\x55\x2a\x66\x70\xe3\x93\x26\xe5\xba\xad\x49\x25\x2f\xd1\x07\x19\x1c\xc5\xc8\x56\x8e\x05\x9b\x4e\xa9\x1f\x62\x71\xc5\xce\x05\x37\xc4\xe6\xc8\xc1\xda\xf0\x26\xa1\x26\x02\xe4\x12\xf0\xfd\xcd\x71\xf5\x4d\x32\xaa\x66\xbf\x18\xb3\xae\xe6\x46\xcf\x24\xf9\xd1\x24\x66\x44\xfd\xb7\x1a\x86\x82\x8d\xba\xa1\x29\x6e\xa8\xbe\x8a\xc3\xfd\x5a\x6f\x54\x6c\x79\xa4\x99\x86\xf7\x2c\x9b\xc6\xb5\xf5\x3f\x11\x7f\x68\x13\x9f\xb7\xcb\xba\x4e\x7d\xd4\xad\x36\x38\xd3\x59\xa6\x41\x39\x77\x63\x5c\xb3\xd1\xfe\x17\x93\xd4\x7e\x73\xe2\xe2\xda\xb7\x3d\x3d\x54\x6a\x2a\x7d\xf5\xa2\x7c\x19\x3b\x3c\x29\x37\x75\x11\xb8\x5b\xef\xcd\xa8\xf0\x31\xb9\x4b\x72\x9e\xc0\x87\xc9\xff\x39\x7c\xfa\x84\x6d\xd1\xe5\xc9\x45\x38\xc0\x0f\xb6\x56\xb1\xe7\xb5\x76\x59\xac\xdf\xbd\xa3\x61\x09\x75\xc2\xab\x6a\x84\x80\x4f\x60\x68\x43\x39\xaf\x7f\xa6\x98\xf0\x6a\x03\x9a\xea\x9a\x2c\x19\x31\x45\xfc\x61\x3a\xd9\xfb\x1c\x96\xac\x15\xe9\xcf\xb8\xc9\x7d\x40\x6d\x8c\x01\x17\xd6\xa8\x63\x1c\x5f\xe4\x46\x31\xbe\x9e\xd7\x05\x16\x6d\xa0\xab\xa1\x4f\xef\x3a\x6d\x6d\x53\x7d\x2d\xae\xb1\x35\x32\xc5\x7c\x20\x69\x1d\x5a\xd7\xba\x79\xe3\xf8\x72\x63\x32\x3b\x26\x8e\x23\xd5\xb5\xab\xd0\x43\x6b\x5e\x8e\x7c\x66\x84\xb2\x56\x94\x87\x6a\xda\x36\x6b\x64\xc3\xda\xf6\x81\x25\xfb\xcd\x89\xe8\x16\xfd\x61\xad\x85\xed\xa6\xe4\xab\x67\xe6\xbf\x49\xb5\xb0\xac\x81\xf4\xff\x1e\x25\x1f\x7a\xfb\xd1\x14\xb5\xd0\x6e\xde\xad\xe5\xc1\xc7\xd5\xd2\xfe\xc7\xef\x88\x91\x2d\xf0\xfd\x6c\x69\x6c\x37\xdc\x70\x43\x0c\xa7\xb5\x29\x4d\x5d\x09\x0c\xcd\xd0\x62\xf4\xd6\x50\xeb\x48\xf4\x2f\x0c\xbc\xbd\x8c\x58\x39\x86\xd7\xdc\x35\xed\x9e\xf9\x47\x99\x34\x94\xc8\x51\x5a\x44\x7d\x5e\x02\xa8\x74\x37\xbc\x7c\xb6\xb7\x3d\x79\x5d\x24\x72\x29\xd8\x57\x8f\xf8\x1e\x4f\x3f\x02\x17\xab\x13\x30\xf1\xf3\x53\xe5\xdf\x2b\x63\x4a\x05\xe5\x12\x33\x28\x76\xcb\xd6\xae\x0b\xf3\x42\xe8\xab\x71\x5c\x6f\xf9\xf3\xdc\xcb\x49\x3b\x42\x07\x87\x2e\x8d\x42\xe3\xf6\xa5\x79\x30\xc2\x5b\x79\x73\x3e\x5e\x67\xa3\x69\xad\x59\xe7\x15\x96\x6a\xb4\xc8\xf0\xdc\xa8\xb2\xe2\x2d\xe0\x95\x2f\xf6\x4f\xe4\x49\xc4\xc4\xe8\xf8\xbf\x45\x1d\x6c\x6e\x2e\x58\xe0\xc5\xeb\x97\xbd\xa8\x62\xe6\xa5\x22\x6e\xcd\x27\xef\x3a\xc2\xd0\x02\xc1\xb4\x59\x2a\x97\xe8\xc5\x7f\x27\xd9\xfb\xe7\xb2\x34\x4c\x88\x90\x3d\xe6\xe8\x4e\xac\x35\xa0\x6b\x06\xf0\x1f\xc1\xcb\xb3\x7c\x4c\x28\x6d\x70\x32\x42\x64\x5d\x98\x4b\xf4\x44\xa1\x8b\x8b\xcc\xc3\x3b\x8e\x08\x4e\xec\x50\x20\x62\x43\x2e\x86\x56\x6d\xc2\x30\xdc\x13\xbe\x8a\x97\xa5\xe6\x33\x85\x52\x75\x9f\x17\xa7\x7b\x6f\x67\xf2\xb1\xe9\xf1\x53\xc8\xdd\x54\x1c\xbf\x2e\x17\x75\xd2\xcd\x17\x09\x60\x5c\x2f\x12\xc8\xc7\x39\x4e\x76\xa7\xa3\x79\x65\x84\xeb\x97\xd9\xdd\x9e\xad\xc8\xa1\xaf\x85\x37\x29\x78\x8f\x42\x2c\x4f\x40\x16\xd4\xa5\x9c\x2b\xcd\x92\xdf\x10\xb5\x61\x8a\x4e\x47\x94\x77\x42\x12\xd4\xd4\x15\xf9\x49\xdd\x39\x1e\xe7\x77\x84\x18\xc7\x05\x3b\x67\x20\x3e\x73\x78\xfd\xe6\x0a\x03\x19\x23\x03\xfb\x80\xe7\x15\xfd\x2b\x09\x5a\xaf\xa6\x1b\x22\xca\x5d\x41\xf9\xef\xd4\x2c\x0d\x32\x82\x2a\xc2\x1c\x8e\x98\x55\x57\xdf\x20\xd5\xd9\x16\xa6\x7b\x87\x90\xa9\xd6\x4b\xbf\x41\x38\xff\xb1\xbb\xa2\x18\x0b\xb4\xef\xb2\xde\x1e\xfb\x30\xb2\xc7\xb6\xce\xf7\x63\x7b\x97\xae\x07\x0d\x64\x6c\xc7\xbb\xab\xdd\x90\x61\x1c\x09\x62\xf5\x8e\xbe\xa2\x8d\x8f\xfe\x6a\x5f\xdc\xda\x4f\xa2\x23\xae\x9c\xfd\xfb\xdf\x7e\x95\x36\x1c\x36\xfb\xf7\xbf\x73\xd9\x70\xa2\xca\x03\x24\xcc\xf9\x3a\x1e\x1d\x81\x5e\xbd\xdf\x7d\xf2\xea\xfd\x58\x5e\xbd\xcb\xc5\x2f\x80\xa9\x3d\x2d\x28\x79\x7b\xab\x73\xef\x33\xd8\x51\x47\x82\x8a\xae\x3c\x66\xd5\x0b\xcf\x55\xf7\xa7\x79\x75\x6e\xc6\x79\x0f\xe0\x6a\xf6\xcc\xea\x5b\x14\xf3\x88\xa3\x6e\xa4\x94\xcb\xdc\xb1\x49\x90\xb6\x5b\xc4\xd1\xfe\xf0\xa1\x0a\xd1\x44\xc7\xfc\xa2\x3e\xaa\x4c\x31\x43\xf7\xc5\x4b\x64\x7d\x8e\x07\x8a\x7e\x0f\xd0\xde\x8b\x0a\xa4\x50\x8a\x84\x38\x31\x9f\x2a\xa6\x7c\xc9\x74\x72\x3e\x58\x5c\x18\x00\xd7\xd8\x45\x23\x6d\xc9\x66\xcb\xfa\xac\x6b\xd7\xae\x25\xd3\x57\x7f\xa7\x6a\x87\x37\x84\xfb\xb6\x86\x70\xe7\xef\xbb\x3f\x69\xd5\x2b\x00\xbf\x99\x6b\x77\x1d\xc9\x44\x1b\x33\x33\xc4\x9a\xdb\x6a\x66\x90\x72\x32\xc2\x91\x8f\x95\xb1\xa1\x8d\x03\x32\xd5\x4c\x77\x8a\xf0\x68\x67\xcd\x81\x09\x4b\x04\xe3\x13\x7b\xed\x06\xc9\x3b\x08\xd0\x58\x81\x98\x68\xc0\xd3\xb6\xcc\x1f\x0d\x88\x64\x51\xa7\xef\xcd\x4a\x63\x50\xfd\x36\x22\x58\x43\x97\x4d\x09\x18\x11\xa1\x16\x53\x66\x44\x02\xfc\x34\xea\xcb\x51\x15\x67\xce\x15\x31\x14\x41\xc9\x35\x41\x6a\x7a\x0d\x9b\x67\xf7\xd3\x55\xcb\xd3\x14\xf8\x0a\xa4\xf4\xbd\xbb\x9f\xa4\xf4\x47\x92\xd2\xb1\x3c\x94\x5b\x57\x44\x4d\x83\xe5\xf9\x28\x1f\x8f\x8f\xf3\xe1\x6b\xe4\x09\x5f\xb0\x7a\xaf\x44\x90\x7f\x5c\xa1\x6f\xa9\xec\x4f\x8d\x00\x38\x2c\xc6\x45\x24\x40\x23\x52\xc0\x8f\x10\x09\x38\x3f\x16\x1c\x12\x14\x91\xef\xd5\xe0\xfa\x5f\xa9\x17\x57\xdc\x9c\x98\xfb\xf7\xa6\x80\x35\x40\xf1\x1f\x29\x81\x8d\x4b\x76\xb6\x94\x43\xd8\xa5\xb3\x73\x48\xeb\x96\x74\x19\xd4\xd1\xa8\xb8\xf4\x0a\x0c\x1c\x9c\x3f\xa2\x84\xce\xf7\x04\x88\x7a\x64\x7a\xb2\x9c\x1f\x13\x4e\x02\x83\xdb\x49\xb0\xbc\x4a\x9e\xe9\xb0\x0b\x0e\xf7\x7e\xd9\x7b\x74\xb4\xff\xf4\xc9\xab\xe7\x7b\x87\x47\x4f\x9f\xef\xc2\xdf\x21\x7c\x81\x8d\xd8\xb5\x83\x7c\x99\xb8\x09\x29\xa7\x18\x91\xc0\x74\x05\x52\xda\xe2\x73\xf7\x63\xb3\x08\x88\x90\xf6\xc7\xbe\x23\xe0\x81\x0f\x48\x70\xb1\xaa\xd5\x74\x3f\x5e\x33\x6b\xb1\xa0\xff\x03\x10\xc0\xc0\xd5\xaf\x31\x16\xc6\x55\xdd\xd2\x1e\x33\x1f\x80\x82\x64\x1f\x78\x88\x47\xcb\x19\x24\x59\x82\x63\x0d\xc2\xed\x99\x33\xd7\xf1\x78\x39\xbf\x73\x52\x0d\x97\x75\x8f\xf3\x62\x09\x8c\x44\x39\xcd\x47\x6f\x20\x45\x36\x4e\x17\x40\x45\x41\x16\x2d\xc4\x8e\x17\x78\x89\x33\x23\x19\x12\x02\x0c\x85\x84\x46\x93\x7c\x5a\xce\x96\x63\x0e\xa6\xeb\x62\x42\xa3\x05\xe7\x41\x2a\xc7\x17\x84\x97\x4a\x51\xe5\x98\xbe\x0a\x67\xdc\xe2\x1d\x00\x41\x43\xa5\xe7\xa6\x74\xef\x6f\x46\xb8\xbc\x3a\xfc\xf5\xd9\x33\x33\xa5\x87\xab\xa6\xd3\xe1\x86\x43\xca\x18\x34\xec\x8c\x50\x72\x2c\x29\xd1\x79\xdb\xf2\x1c\x70\xd2\x6f\x22\x47\xe8\xa1\x01\x22\x7e\x84\x0d\x1a\xbb\x1e\xda\xce\x84\xb3\xf7\xb8\xfa\x87\xed\x7a\x40\x59\x73\xa1\x2e\xef\xce\xad\x25\xcd\x46\x2a\x45\x9d\x4f\xa9\xb3\x65\x05\x75\xba\x4d\xba\xc1\x7a\x76\x84\x1c\x58\x8e\x34\x74\x2f\x1c\x2f\xfa\x32\x59\x3f\x6c\x91\x11\x4b\xaa\xe1\x10\xa0\xb3\x32\x04\x1d\xa9\x8b\x81\x10\x63\xbe\xac\x19\xee\x82\x1a\x41\xf7\xbc\x0d\xbe\x56\x91\x24\x41\x63\x65\xc4\x37\x19\xb0\xe6\xc7\xac\x91\xb8\x05\xf1\x8c\x37\x25\xc3\x91\xa8\xff\xa2\xa6\x38\xe4\x90\x38\x00\x8e\x69\xe0\xfa\x63\x66\x5b\xc4\x24\xd2\xaf\x28\x59\xe3\x20\x19\xf2\x6e\x53\x4b\x82\x05\x14\x57\x6d\x22\xcb\xc8\x2a\xc3\xf0\x46\x5e\xed\x3e\xfe\xfb\xab\xff\xfb\xeb\xde\xaf\x7b\xfb\x4f\xfe\x12\xf2\xf8\xbe\x65\x3c\x1a\x3a\x9b\xe3\x68\x50\x4d\xcd\xd7\x66\x20\x46\x17\x03\x6a\xfd\x86\xdc\xca\x3a\x1a\x64\x9b\x84\x1e\x21\x05\x4f\x67\x0b\x20\xea\x4f\x60\xb7\x83\xf5\x6d\x44\xf3\xc9\xd8\x68\xf4\xe0\xfc\x5e\x4e\xdf\x54\x66\x79\x43\x52\x4e\x95\xbe\xc8\x6b\x93\x1d\x8c\xf6\xf9\x5d\xd9\x24\xb3\x0d\x94\x27\x17\x46\x75\xea\xaa\x89\xc3\xed\xfb\xd7\xa3\x57\xbf\xec\x1f\x1a\xd5\x63\xef\x79\x38\x6e\xeb\x7b\x3e\x0b\x8f\x42\x8d\xae\xaf\x6c\x65\xe3\x73\x7d\xf6\xe8\x36\x59\x6c\xef\x6d\x31\x5c\xc2\x3e\x07\x16\x3c\x51\x91\x86\xd5\xcc\x82\x7a\x0f\xd4\x36\x3c\xb0\xb6\x8f\xcc\xa8\x96\x08\xd4\x3c\xe7\x50\xb8\x1c\xa3\xc4\xc8\x71\x79\x52\x80\x55\x59\xa2\xe3\x52\x67\x20\x84\xf8\xbe\x09\xdd\x1b\x20\x8e\x11\x14\x3e\x3f\x03\xe5\x8c\x3d\x9e\xeb\x6a\x8c\xe8\xd2\x20\x74\x81\x5e\x01\x51\x6c\x88\xfe\xa1\x50\x80\x9e\xef\x3e\x39\xdc\xa5\xbd\xf4\xb7\xe7\xbb\xcf\x9e\xed\x3d\x87\xe0\xa0\x17\xa6\x67\xd1\x91\x87\xad\x2e\xba\xfb\xc2\x8b\x86\x0c\x87\x87\x51\xc6\xdf\x7a\xa9\xa2\x52\x45\xb0\x41\x58\x5b\x72\x1b\xc5\x3a\xe7\x90\xc5\x34\x88\x34\x22\xf3\x82\xce\x3e\x56\x1d\x55\xab\x0c\x98\x75\x38\x37\xbc\x60\xb8\x90\x89\x34\x76\xbf\x8c\x9e\x3f\x17\xc9\x14\x68\x2b\xa2\xba\xfe\xbc\x84\x48\xbd\xbe\x57\x38\x19\x99\x2d\x13\xac\x42\x77\x00\x44\x0a\xb2\x63\x98\x49\x9d\x1b\xc1\x91\x60\x9e\x3c\xdc\x00\x09\xe7\x0c\xec\x8b\xcb\x69\x89\xe9\xec\x51\xc5\x46\x3d\xd6\x70\x93\x39\x52\x50\x20\xc4\x9b\x32\xa7\xe5\x85\xb9\xdb\xf1\x53\x04\xc2\xa2\x2e\x01\x36\x5a\x59\x9c\xc3\xb9\x23\x39\x06\xdd\x3b\x27\xa5\xda\xb4\x65\x1f\x02\xff\xb0\x11\x40\xfe\x14\xa0\x51\x38\xcf\x22\x06\x0d\x9a\x35\x30\xe2\x1c\x68\x79\x09\xb8\x43\x39\x1c\x29\xc6\xf9\x05\xe0\x18\x32\x94\x30\x98\x8d\x21\xeb\x27\x07\x55\xda\xcc\x9f\x08\x89\x34\x2a\x0d\xf1\x1a\x1b\x34\x01\x2c\xb5\x63\x10\xf6\x82\x8d\x18\xc3\x7f\x69\xd1\xe7\xef\x04\xc6\x8c\x58\x31\x6d\xd0\x98\x17\x6e\x15\x7b\x45\x60\x71\x81\xd1\x78\x8a\xfa\xa3\x39\x45\xcd\x6f\x23\x96\xb9\xc3\x3a\x37\x32\x04\x60\xdb\xa7\x45\x81\x51\xcc\x86\x09\x28\x9a\x31\xe9\xd6\x05\x23\x89\xd1\xae\x76\x88\x9f\x3f\x97\x0f\x07\x3d\x5a\x45\x9a\xaa\x39\x67\xd4\x2b\x3e\x69\x2c\x5b\x23\xb4\x18\x48\x9e\xeb\x0c\xcd\xcb\xe5\xa2\xc3\x04\x21\x49\x26\x67\x31\x86\x19\xe0\xeb\x81\xda\xa1\x23\xa3\x2e\x4d\xd5\x1a\xd6\x78\xe4\x20\xd2\x71\xf7\x71\x6d\xf2\xf2\x72\x0d\x12\x3e\x33\x95\x0b\x4c\x79\xee\xe7\xa6\x1f\x64\x03\x37\xc0\xd0\x87\xa3\xea\x10\xcf\x56\x07\xf9\xfc\xf5\x72\x06\xd8\xa9\x72\x1f\x11\x13\xc7\xe6\xbd\x77\x96\x42\x28\x74\x3c\x2e\x91\xe7\xbb\xfd\x2e\x14\x90\x6d\x67\x77\x45\xa0\x67\x91\xe7\x0e\xca\xb7\xe5\xb4\xa1\xe6\x01\x58\xb5\xc7\x52\xf8\x34\x3f\xae\xf1\xea\x87\x7f\xea\x04\x06\xa2\x17\xe2\xb5\xc4\xf7\x64\xad\xfe\xe1\x32\x81\xfa\x81\xbd\xc1\xcf\x87\xb4\x15\x84\xdd\x9d\x01\xb4\x47\x31\x82\xa3\x4c\x26\xea\xca\xd1\xd3\xc7\x4f\xfb\xb0\x7a\x40\x05\x46\x90\x24\x24\xa5\x5a\xc1\x59\x13\x7f\xb0\x9b\x9b\xe9\x4f\xf3\x75\xcc\x1c\xc5\xad\x8b\xc9\xd9\x98\x06\x17\xa2\x0c\x81\x30\x24\x6d\x05\x92\x22\x92\xb2\xd2\xb2\xf3\xa2\x38\xc8\x74\x0b\x9f\xfb\xb3\xda\xde\xba\x18\x0f\xb8\xd6\x21\x0e\xbe\x3f\x9f\x6b\x48\x85\x6c\x11\xe9\xe9\x40\x1d\xbf\x07\xc9\x18\x80\xca\x6d\xfe\xd3\x14\x17\x0a\xa2\x46\xb2\xea\x81\xab\x9b\xf5\x50\x0c\x9e\x96\x5c\x07\x44\xcc\x3a\xc1\x62\x86\x55\x50\x3f\x31\x5b\x92\x1d\x8b\x95\x66\x2c\x9f\xd3\x39\xf5\x6a\x37\x36\x24\xac\x90\xb7\xac\x18\xce\x73\x6c\x35\xd6\xc6\x1a\xf0\x48\x87\x43\xa4\x69\x47\x56\x95\xbb\xdc\x06\x75\xc3\x33\xf7\xc6\x24\xac\x36\xf9\xea\xc7\xb8\xe4\x52\x5a\x79\xeb\x6d\x75\x31\xca\xed\xf6\xba\x58\x69\x6b\xb3\xf3\x4d\x33\xfd\xfb\xf7\xbf\x4b\x6f\xce\x92\x97\xb6\xd8\x54\xfa\xf7\xbf\xdb\x49\x5b\x2d\x26\xfd\x9d\xbb\xd8\x08\x6d\x19\xe9\xef\xec\x20\x26\xcb\xbd\x7b\x9f\x70\xac\xfe\x14\xc6\xc2\x76\xf8\x5b\x2e\x77\x12\x31\x8e\x99\xa7\x9e\x3d\x8d\xaf\xfa\xfe\x46\x2e\x1f\x21\x62\x50\xb4\x88\xb6\x7c\xfd\xb5\x18\xcf\x28\x37\x16\xc8\x5a\x5b\xb1\x4b\x36\x54\x0b\xe2\x83\xe4\x5e\xf1\xb3\x27\xa7\x49\x6d\xd4\x74\xb3\x19\x51\xe2\x40\xd8\x5f\xde\xc0\x5d\x37\x08\x32\x41\x23\x8a\x28\xb5\xb8\xa3\xdf\x9e\xa3\x74\x91\x23\x9f\x56\xaf\x5c\xf5\x5d\x85\xbe\xe5\x37\x8c\xe1\xc1\x51\xaa\xbc\x62\x0b\x02\x77\xb5\xe7\x67\x2f\x75\x23\xde\x80\xeb\x0b\x4f\xa5\x5e\xf6\x1f\xe0\x43\xa3\x32\xa2\x5a\x91\x8a\x67\x02\x1e\x11\x59\xf3\xb6\x57\x16\x51\x18\xbf\xe7\x41\xfa\x24\x39\xf1\x4a\xfc\x89\x5f\xda\xe6\x4a\x32\xdc\xbb\xff\x18\x15\x69\xf3\x3f\x49\x98\x04\x2c\x0d\x91\xe9\xb1\x64\x49\x31\xe1\xf4\x6e\x8d\xa6\x77\xa9\xa7\x23\xd8\x9f\x7f\x94\xa6\x3c\x97\x24\xec\x34\x04\xbc\x03\x91\x7a\x8f\x87\x15\x4e\x46\x61\xda\xba\x51\xf6\x25\x5f\x8f\x53\xdb\x55\x38\x32\x29\x8f\x42\xaa\x5b\x99\x0a\x70\x95\xb6\x56\x4d\x44\xe7\x0b\x49\x64\x7e\x65\xdd\x95\x04\x9d\x0b\xde\x15\x21\xfd\xa3\xeb\x2b\x43\xed\x75\x77\x3a\xfa\x2d\x9f\x4f\x7f\xae\xe6\x04\xa1\x4a\x40\x86\xee\xba\xac\xd1\xe0\x80\x87\x9b\xd7\x5e\x89\x67\x7d\x69\xea\x40\xdd\x5e\xc6\xd7\x9f\x5d\xb7\x4a\xd2\x46\x45\xbe\xe9\x8d\x06\x30\xa2\xc4\x3c\xa7\x1d\xbd\x46\xd4\x5e\x23\xbf\x51\x7a\xd6\xb2\xb0\x19\xf7\x37\xd4\xcc\xf5\x2a\x58\xc9\x0a\xcb\xe9\xc6\xcc\xe0\x99\xca\x40\x04\xd8\xc4\x44\x75\x84\x71\xd6\x0d\xab\xcc\x75\x58\x2c\x6c\x50\xd4\x84\x44\xe6\x31\x2f\x3f\x96\xc0\x8b\x82\x5b\xa5\xa4\x9b\x7e\x6f\x59\xa0\xd9\x0a\x20\x3c\xdf\x6a\xa6\xd8\x60\xf5\xc7\x56\x77\x80\x0b\xca\xac\xdf\x36\x3f\x00\x2b\xaa\x93\x1a\xab\xf9\x89\x8e\x5f\xaa\x5b\x19\x5f\x65\x5b\x90\x65\x4b\x3b\xcf\x16\x6f\x1c\x18\xd9\xba\x69\x53\xd0\xb8\xaa\x22\x74\xe2\xd1\x84\x3e\xfb\x4c\xb7\x23\x7b\x45\xc9\xc9\x6e\x85\xee\xef\xe0\x7d\x54\x82\x4e\xcd\x33\x46\xc0\x4c\xe5\x64\x62\x56\x2a\x9e\x65\xd1\x54\x88\x28\xda\x48\x00\xd3\xcc\x91\x2c\x4c\x1d\x09\x8e\x98\x1f\x61\xc2\xb4\xb3\xc2\x1c\xc0\x30\xdb\x4f\xb9\xb8\x40\xfe\x00\x92\x78\x6c\xc6\x14\x79\x86\xe0\xa4\x9c\xa2\x87\x10\xa5\xd9\x31\x75\x3a\x52\xf5\x12\xae\x86\xc6\x4b\x30\x25\x8b\x1d\xda\x68\x29\xfb\x80\x02\x2e\x37\x51\x78\x84\xa8\x11\x8c\x9b\x04\xb1\xb4\x16\xcf\xfb\xcb\xe1\x99\x23\x37\x3c\xc3\x5b\x2a\x86\xd2\x36\xd2\xfc\xf4\xb4\x40\x38\x1f\xc6\xd1\xe6\x5d\x85\x3a\xc7\x89\xd1\x28\x25\x6b\x41\x0e\x59\x8e\xd4\xc2\xe5\xae\x07\xcf\x33\x70\xd5\x35\xba\x58\x09\x57\x29\x28\xe6\x6c\xae\x25\x04\x29\x2f\x38\x5a\xcf\xe6\x85\xab\x4b\x66\x6e\xa2\x56\x36\x3a\x64\x4a\x4a\x6a\x7c\xc9\x18\x67\x74\x09\xb4\x5b\xe4\x4a\xe1\xc0\x1e\x3b\x3a\xa3\xa2\x80\x94\x17\x13\x92\xac\xbc\x35\xdb\x73\x91\x95\x6e\x22\x3b\x3f\x9e\x78\x57\xdc\xd7\xf3\x6a\x07\x96\x87\x64\x6c\x8f\x70\x6a\x46\xee\x60\x71\x92\xd1\x34\x91\x6c\x41\xa9\xc6\xb5\x2b\xc6\x16\xae\x0b\x44\x41\xd2\x53\xeb\x42\x51\x0f\x7a\xb0\x56\x68\xaa\x9a\xfc\x56\x37\x96\x65\x28\x17\xba\x6b\x97\xfd\xda\x26\xde\xe4\xa6\x16\x49\x4e\xf4\x33\x58\xfa\x71\x13\x33\xea\x39\x2c\x4d\xac\x1f\xb5\xd2\xfc\x6a\xe9\x2f\x37\x90\xd9\x9b\x0a\xe3\x86\xbc\xe5\x9b\x61\x62\x82\xfd\x93\x27\x05\x70\x65\x3e\xbf\x58\x2b\x77\x43\xbd\x40\x49\xd9\xc6\xe4\xb5\x55\xd2\x5d\x78\x67\xe0\x35\xf0\xca\x4e\x9b\xbe\x42\x9e\xbf\xf8\x41\xa4\x7f\xff\xdb\xaf\x53\x7d\xb2\xe9\xef\xdc\xbb\xdf\x4c\x02\x78\xef\xfe\x27\x4f\x96\x8f\x76\x38\x3d\x59\x7d\x2a\x95\xac\xd8\xe1\x21\x13\x9f\xfb\xb8\xb4\x74\x80\xfd\xdd\xc3\xac\x6a\x4b\x62\xeb\xe5\x59\x45\x00\x7c\xf2\x7a\x9e\x37\x73\x50\x5b\x9b\xdc\x49\x77\x75\x3e\x4b\xe4\x64\x8d\xa1\x64\x36\x8e\x5f\x8a\xd3\x7c\x88\x89\x70\x9d\x4e\x49\x89\x3e\x63\x89\x90\xe3\xb9\x60\xad\xa7\xbb\xed\x95\x97\x2a\xf3\xbd\x7b\x65\xcd\xd0\x9b\x37\xbe\x35\x6d\xec\x9a\x1e\xc4\xce\xfb\x0f\xb5\x2a\x2e\x3b\x04\xef\xd1\xce\xe1\x1a\xbb\x60\x35\x03\xf3\x4b\x1c\xac\xe1\x45\xa0\x70\x05\x93\xde\xa0\xca\x7a\x9a\xba\x73\x6c\xdd\x1b\x75\xeb\xf4\xfe\xa8\x77\x46\x9b\xb9\x65\xff\x24\x29\x4a\x76\xae\x17\x6d\x07\x54\x0e\xc8\x34\x7b\x32\xc0\x4c\x92\xb4\x1b\x8c\x52\x73\x0e\x7a\x2d\x19\x47\x4c\x59\xa3\xcd\x17\x60\x62\xa7\xac\xf0\x40\x0b\x0a\x53\x5a\x2e\xca\x93\x4b\xf9\x8e\x31\xaa\x09\x16\xf0\x80\xec\x03\x9e\x4f\x00\x67\xc6\x35\x83\x32\x2a\x4f\xf0\x83\x45\xcf\x11\x33\x92\xf8\xb4\x5a\x98\xe5\xcc\xce\x07\x0d\x8a\xa8\x6e\x2d\xeb\x42\xab\x60\x72\x3f\x43\x64\x58\x8d\x9b\x21\xe3\xb3\x79\x15\xb4\x10\x9b\x66\x16\xdf\x56\xa6\x23\x2c\x50\xe1\xa8\x62\x84\x06\xfa\x25\x89\x46\x4a\xa4\xb0\x4f\x19\x9a\xe4\x61\x02\x41\xc2\x17\xb3\x05\xe5\x0e\x1e\x97\x90\x4a\xba\x9a\x7a\xba\xe0\x16\x7d\x47\xd7\x0b\x87\xac\x68\x82\x24\x03\xc3\x08\x48\x25\xd1\xf2\x7e\xa4\x4b\x4f\x49\x56\x8c\xa9\x81\x49\x3d\xe5\x56\x6e\x39\xcd\xd0\x8c\xc9\x31\xe6\xb1\x81\xc3\xa5\x3f\xf5\x7a\x2b\x56\xed\xcc\xa7\x4c\x8d\xa9\x50\xb2\x99\xfa\x3c\xa7\x24\x38\x98\x81\xc7\x0c\x13\xa8\xc8\x50\x33\x0f\x75\x9d\x25\xb8\x8b\xd1\xbd\xf4\x39\x69\xe9\x68\xe1\x02\xd5\x8e\x49\x81\xe5\x67\x84\x4a\x38\x0c\xdf\xb1\x51\xb5\x2f\x4c\x93\xc7\xd5\xf4\xb4\xb6\x9f\x60\x0d\xf4\x15\x67\xf7\xe4\x8f\x91\xc5\x17\x65\xa3\xe9\x40\x76\x64\xfe\xca\x14\x2c\x1a\xed\xec\xd1\x73\x8b\x77\xba\x91\xc7\xef\xde\x35\x3e\xa0\x45\xe7\x97\x26\x31\x01\xa6\x30\xbd\xa0\x9c\x1e\xf8\x01\x16\x7a\x20\x07\x37\x58\xe8\x6d\x2a\xc6\x89\x1f\xd0\x40\xbb\x4b\x7f\xe7\xee\x0e\xea\x03\x3b\x9f\xf4\x81\x8f\xa5\x0f\x80\xd9\xcc\x74\xf1\x6d\xe0\xce\xba\xc6\x74\x2d\x5f\xed\x4b\xf6\xc4\xc6\x55\x68\x23\x7f\xd9\x2b\x3a\xfe\x85\xb5\x5a\x47\x20\x20\xf4\x28\x52\x44\x69\xc8\x51\x12\xbe\xf9\x48\x9e\x66\xb1\xa2\xa6\x91\x51\x12\xbe\xd7\x4e\xe3\x1b\xa0\x1f\xfb\xcc\x01\xec\xab\x24\x92\x2d\xe3\xb3\x6a\x31\xb8\x66\xc0\x92\xc0\x05\xf0\x29\x2b\xf6\x47\x5b\x15\xad\x2e\xdc\xf1\x05\x13\x98\xdc\x71\x9d\xdc\x0c\x16\xbf\x68\xb6\x7f\xe5\xf8\xbb\x98\xdb\xb5\x57\xc2\xfb\x9a\x9c\x23\x30\xb6\xae\x5e\x4e\x22\x1f\xfb\x05\xbc\x6f\xdb\xaf\x11\x92\x87\xb8\x8d\xf9\x94\xda\x8b\xfb\x08\xff\x74\x43\x1a\xc1\xf7\xa7\x17\xd2\x84\xf6\xbd\xd4\xfb\xb2\xb5\x98\xa3\xc3\xa9\xe6\xc3\xef\x24\x03\xbd\xba\x16\x8b\x1b\x62\x0b\xb1\xbc\xa8\xcb\x12\xb9\x2b\x01\x0e\xfa\xeb\xd1\xc1\x2f\x6c\x50\xf7\xaf\xb3\x9c\x9f\x0a\x14\xee\x7a\x7b\xec\x66\x36\xa9\xe4\x47\xd7\xfe\xee\x56\x68\x9b\x0a\xc3\x92\xa5\x02\xb2\x0e\x74\x82\xea\x7b\xfd\xe4\xef\x46\x49\x42\x57\x28\xc4\x06\xcd\x09\x06\xc1\x27\xd9\x41\x4b\x42\x5f\x55\xbb\x49\x8d\x3d\x32\xf7\xd8\xdc\x67\x72\x55\x0e\x36\x8a\x0b\x65\xfd\x2d\xad\x05\x2c\x60\xda\x86\x60\x7e\x2c\xbe\xc5\x0b\xcf\xfd\x7f\x0d\xa7\x29\xa7\x1c\xf1\x37\xd6\xb7\x1e\xda\xe6\xc4\x56\x91\x6e\x24\xe3\x32\xfa\x43\x0b\x1f\x49\x43\xd1\x5a\xdd\xc2\x6b\x32\x0e\x69\x62\x0f\x71\x42\x47\x6e\xaa\xec\x05\x50\x83\x70\x78\x65\x55\x8e\x02\x8b\x9a\x5a\x1c\x21\xea\x64\x64\x09\xe3\x89\x96\xff\x3e\xaa\xe8\x5d\x97\x5a\x21\xd6\x32\xd5\xcc\xcb\x04\xef\x6b\xc6\x17\x7a\xbb\x5c\x31\xbe\xd6\xe1\xa3\x61\x3a\xba\xbc\xb9\x55\xe4\xd2\x15\x93\x85\xd9\x54\xc6\xb9\x38\xf6\x1f\xe3\x79\x6b\xc8\xfd\x03\x62\x5d\x30\x27\x9f\xc2\x6d\x6c\x8e\x3e\xcf\x24\xad\x0d\x87\x9f\x16\x75\xaf\x6d\x3d\x3a\xbf\xb1\x3f\x70\x55\xaa\x46\xfc\x2f\x5b\x9b\x0e\x22\xfa\x8f\x5a\x9a\x12\x81\x70\x03\x8b\xf1\x83\x2d\xa7\x86\x5e\xf8\xfb\x56\x12\xec\x29\xfd\xe0\x77\xea\x95\x70\x0c\xd6\x8f\x3e\x45\xed\xf3\x3a\xa6\x5c\x3f\xc2\x3c\xd4\x3f\xfa\xf7\xbf\xfb\x32\x6d\xd1\x2f\xcc\xbb\x6f\xd3\x0d\x34\x86\xfe\xce\xbd\xaf\xd2\x40\x31\xe8\xef\x7c\x85\xbe\x4f\xed\x5b\x7e\x7f\xe7\x9b\xfb\xa9\xb7\xb9\x9b\x27\x3b\x11\xcb\xf2\xb5\x33\x7f\x7f\xf9\x49\x67\xbe\xda\x49\xb2\x7d\x8e\x37\x3d\x5a\x5e\x25\xda\xf1\xaa\x91\x94\x51\x37\xba\x3f\x34\x36\xf1\xba\x89\xb0\x54\x28\xd0\xc0\xeb\xea\xa0\x25\x34\x28\xea\x70\x0b\x94\x54\xe8\x8f\x0a\x5c\x64\xa3\xe3\xbf\x5e\x20\x10\x47\xc3\x78\x03\xf7\xb1\x43\x71\x9a\x95\xff\xaf\x8a\xae\x59\x1b\x2f\xa3\x83\x30\xd6\x08\x8c\x30\x1e\x30\xba\xaf\x35\x63\x36\xda\xa9\x76\x63\x14\x36\x8d\xe6\x58\x15\x8e\x10\x7b\xfc\x3f\x2f\x3a\xe1\x32\xd9\x03\xe6\xa6\x44\xee\x1b\xc4\x26\x7c\x8a\x34\xf8\x14\x69\xf0\xe7\x88\x34\xd8\x5a\xaf\x9e\xbb\x90\x03\x53\xb8\x19\x74\x60\x1e\xe2\x1f\x5b\xeb\xe3\x0e\xda\x2b\x69\x8f\x3e\x68\xff\xe6\x66\x63\x10\x36\x0e\x23\x68\x87\x86\xba\xb7\x51\x92\xec\x4f\x46\xe8\x9b\x50\xa8\xc1\xed\xec\xb0\x80\x48\x91\x35\xd7\x31\xba\x64\x28\xf5\x39\xeb\x8b\x4e\xf1\x48\xf0\x09\x86\xa1\x24\xc6\x1d\xeb\x1e\xd9\x02\x24\x58\x20\xaa\x90\xef\x53\xeb\xe5\x98\xb7\x07\x1c\xa3\x1c\xe3\xcc\x8c\x02\xe4\x7b\xd4\x77\xc8\x80\x5e\xac\x76\xb5\x02\x6f\x3f\xe5\x73\xa5\x52\xf9\xc7\xaf\x8d\xe0\x2f\xea\x83\x59\x19\xd8\x51\xee\x12\xc4\x8c\xf2\xa2\x90\xb6\x96\x35\xe2\x3d\x50\x60\xdc\x06\xff\x9c\xd7\x26\x66\xf2\xac\xc4\x7d\x52\x75\xc3\xed\x35\xae\x49\xb6\x5a\x0a\x9c\x85\x08\x48\x12\xc0\x3c\x68\x91\x26\xaf\x68\x96\x6d\x04\x79\x17\x70\x52\xfe\xb1\x19\xa6\xb9\xe1\x38\x1a\xe8\x43\xd7\xa0\x3b\xf6\x32\x4a\xcd\xba\x92\xd7\xca\x21\xa4\xd9\x8e\x60\x17\xb2\x1f\xe5\x46\x79\x4c\x93\x61\x9a\x8c\xd2\xa4\x30\x1f\xfa\x66\x18\x33\x27\xa0\x16\x51\x4f\x1e\x46\xc8\x92\x5d\x41\xd5\xdc\xa0\x27\xd6\x18\xc4\xcf\x53\xe4\x7c\x6c\x56\xb9\xfe\x97\x1e\xfb\x45\x85\x06\xc3\xa7\x46\x5d\xda\x85\xd7\xc1\x13\x62\x5c\xdc\xce\xe7\xa7\x4b\x72\x3d\xf5\xa6\x8c\x17\x2b\x82\x17\xba\x59\x97\xaf\x88\x16\x23\xd0\xae\xe5\xf0\x27\xd5\xc2\xec\xf3\xe2\xf2\x6b\x54\xf2\x0a\xc3\x99\xdd\x5a\x22\xf7\x5b\x70\x3f\xe1\x78\x57\x00\xc3\x35\x3a\xfd\x9b\x42\xa2\x72\x6e\x62\xc1\x88\x81\x15\x9a\x7d\xc4\x6e\x0b\x22\x72\x88\x03\xa1\xe3\xe8\x3b\x41\xbe\x1c\xd4\xe9\x0d\x98\xdc\x2c\xf9\x7b\x89\x1d\x48\xea\x0d\x09\x0f\x3b\x4d\x3d\x54\xaa\x5a\x39\xdc\x13\x32\xa6\x61\x08\x0c\x8c\xd6\x5d\xa9\x43\xc8\x47\x59\xfc\x3f\x8a\x8b\x55\x5c\x0e\x20\xf8\xce\x85\xea\x80\x26\x80\x3a\x4e\x12\x31\xb3\x86\xcf\xa1\x39\xe6\x78\x09\x0d\xb3\x57\xaf\x5e\x0b\xf5\x1a\xb0\x60\xbb\x2d\xaf\xc0\xcd\x2d\x80\x34\x01\x5a\x88\x39\x4c\xdf\xb9\x9f\x0f\xa3\x8d\x0f\x9b\xac\x7c\x24\x42\x70\xeb\x95\xdf\x89\xef\xd3\x33\x5a\x1a\x3c\xbb\xa5\x0e\xdc\x10\xff\x6a\x3e\x59\x3a\xf2\xe6\x8c\xba\xa4\x30\xef\x52\x16\x01\x11\x23\xdf\x6a\x3a\x3c\x52\x9a\x60\x98\x9a\x94\x62\xbd\xf8\xa8\x09\x5b\xa4\x8b\xfa\x22\xb1\x87\x6c\x2f\xf4\xb7\xc4\xad\x06\xbe\x25\xbd\x32\x22\x3d\x7e\xc7\x85\x1b\x08\x20\xea\x85\xeb\xf3\x1b\x8d\xd7\xa7\x09\xc8\x08\xbf\x51\x18\xc2\x1b\x88\x8d\xcb\x07\xd6\x19\x4e\xef\x95\x59\xf4\x9c\xf4\xc7\xee\x98\x2a\x55\x72\xca\x67\x7e\x2c\xe3\xc2\x18\x0a\x0b\xbe\xdb\x57\xdf\xb1\x52\x6c\xc7\xe0\xf7\xb7\xfd\xe4\x1e\xf3\xac\x7d\xdb\xd8\x38\x9c\xe5\xfd\xad\xc6\x48\xa4\x65\x2c\x42\xc1\x50\xa2\xb7\x97\x96\xda\x65\xaf\x7b\x8f\x69\x7f\xda\xb8\x6f\x66\xe3\x5e\xbb\x5b\x37\xd9\xb7\x39\x9d\x74\x2e\x8c\x90\xfa\x93\xec\x96\x1f\x8b\xbb\x9d\x28\xe9\xbc\xed\x84\xbc\xfa\x81\xb6\xec\xff\x65\x5b\xb0\xda\x77\x37\x61\x50\x37\x23\xc4\xa3\xf0\xf9\x3a\x37\x41\x4d\x4b\x39\x47\x7d\xf3\xe9\x08\xfa\x91\x8e\xa0\x47\x45\xbd\xf8\x75\x51\x8e\xdb\xcf\x9f\x88\x67\x00\x36\x6a\xb8\xa8\x0b\xae\x6d\xfc\x77\x72\xe7\x81\x4f\x9f\x8d\x97\xa7\xe5\xf4\xaf\xcb\xe3\xc8\x17\xf6\x9d\xff\xc5\xbc\x9a\xe5\xa7\x10\x55\x12\xab\x45\xbd\xf5\x6e\x7c\x22\x37\x3c\xb1\xe8\xfa\x0d\x3d\xb4\xd0\x00\xda\xe2\x9e\x14\x29\xf0\x01\x90\x39\x9b\x27\x82\x08\x91\x66\xa1\x1b\xf4\x33\x93\x77\x07\xf9\x6c\xc5\x97\xe6\xad\xef\x9d\x06\x26\xc0\x98\x53\x1a\x3c\xf7\x4a\x92\x3f\x78\xac\x55\xfc\x46\x4a\x1f\x5e\x4c\x0d\x37\x2f\xca\x21\x0e\x96\x5f\xde\x7f\x77\xcd\x7b\xb9\x0d\xdc\xd7\xb0\xf0\xa2\x9a\xfd\x02\xd0\x92\x88\xd3\x6e\x8a\xfb\x6c\x9f\x79\xaf\xb5\xb6\x8f\xe5\xba\xf5\xf2\xe4\xa4\x04\x27\xd6\xcb\xe8\x25\x49\xb0\x02\xb9\xc4\x51\x35\xaa\xfa\x88\x13\x06\x68\x5b\xe8\x3b\x33\x5d\x98\x26\x62\xa4\x7e\x3d\x9c\x23\xe8\x82\xf9\x6f\x6d\xc6\x21\x7f\x9b\xe1\xb6\x3b\xad\xce\xed\x96\x0b\xb7\x43\x28\x93\x96\x86\xb4\x91\x2c\x45\x4d\x76\x64\x6c\xcc\x90\xae\x10\xcd\x50\xe3\xfd\xe1\x6c\x39\x37\xdc\x54\x10\x08\xd9\xbf\x9b\x8d\x79\x14\x6d\x9a\x9d\x40\xfb\xd8\xf3\x63\xd8\x9f\x2e\xaa\xc7\x0c\x45\xd6\x6f\xfa\xa5\xeb\xc0\xe1\x51\xf9\xc6\x7c\x2a\xb8\x65\x99\x97\xa8\xb5\xdb\x31\x6f\x3b\x7c\x12\x33\xa7\x8d\x27\x9c\x8a\xcf\xc8\x4b\x6c\xb0\xd1\x21\x86\x1c\xd5\xc0\xb3\xc6\xc1\x29\x72\xd1\x09\x41\x8b\x90\xa4\x1c\x21\x31\x50\x30\x13\x21\x33\x70\xa4\xc4\x8f\x2a\xf4\x2d\xaa\x78\xfb\x03\xf5\x08\xb2\x1a\xb0\xca\x08\xba\xbd\xa1\x0d\x47\x02\x88\x1f\xa1\x8b\x34\x3c\x21\x54\x42\x69\x08\xd7\x55\x09\xf8\x36\x19\x22\xe7\x45\xc7\x34\xe1\x14\x69\x82\x46\x08\x28\x69\x67\xd5\xb4\xb2\x17\xaf\x98\xa4\x53\xc4\x3e\xdd\xe4\x09\xa1\x2e\x34\xc7\x46\x26\x98\x61\x84\xa2\x46\x1d\x41\x64\x0a\xec\x63\x0f\xec\x29\xd3\x0a\x0b\x99\xf1\x01\x05\xaa\xac\x49\xa1\xc0\x20\x5a\x19\x42\xf9\x43\xfc\x87\xe0\x1a\x66\x3a\x7a\x74\x56\x8e\x47\x5d\x33\x9e\xfe\xc1\x16\x27\x91\xaf\xba\x54\xdc\x80\x94\x23\x25\xb2\xac\x99\x96\x9a\x4b\xcf\xbf\xca\x27\xb7\xc6\x71\x29\x42\x97\x12\xa4\x05\x9c\x92\x12\xce\xd5\xb4\x84\x40\x1a\x5c\x61\x74\x5d\x11\x54\x29\xf1\xb5\xab\xaa\x06\x72\xbd\xe4\xb3\xcf\xc4\x2e\x65\x7e\x66\x0b\x49\x1b\x11\xaf\x05\x8b\x7a\x6d\xd5\x88\x67\x41\x53\x95\x49\x82\x42\x68\x7e\x2e\xdf\x26\x9c\xc8\x63\x69\x66\xc9\xc8\x26\x0e\xff\xfe\x07\xb8\x82\x61\xb8\x89\x44\xf5\xd8\xa8\x68\xda\xd3\x2d\x78\xaa\x10\x9c\x99\x7e\x16\xd3\x11\x5f\xe3\x00\x90\x88\xd5\xb9\x6b\x2f\xeb\xc7\xad\x5b\xd8\x16\x88\x9a\xa7\x0e\xe6\xa7\xa8\xf8\xc9\xef\xd3\x02\x40\xdb\x6c\xba\x9c\x58\xb7\x9a\xd3\xac\x7b\xd7\xa8\x67\xcb\x57\x3b\xaf\x30\x03\xf2\xef\xd6\x2d\xdd\x54\xaf\x5d\xcd\x7d\x6d\x75\xb3\x38\x18\x0f\xe9\x11\x3f\x07\x41\x79\x41\xed\xba\xbc\x28\xd6\xc1\x17\xab\x9b\xf3\x9b\x51\xc1\xa3\x6c\x0b\x94\x9b\x63\xe6\x8b\xcb\x2c\x46\xb1\x65\x94\xf0\x71\x36\x74\xbc\x89\xcd\xc4\x5a\xd6\x8c\xd8\xea\xf9\x5c\x9b\xb3\x1a\x0b\x37\xb2\x9c\xa8\x2c\x43\x97\xc2\xa4\xbf\x15\x8c\x1f\xc0\x47\x0f\xba\x5e\xb3\xde\x25\xf0\x37\x89\x54\xd8\x77\x0c\x23\x12\x78\x0c\x44\xea\x71\x1c\x97\x10\xb2\xb7\x96\xe5\xa2\x2e\xc6\x27\x8c\x5c\x58\x92\x7d\x06\x00\x2f\x81\x3a\x40\x41\xe6\xa8\x3f\x8f\x96\x50\xe7\xc5\xcc\x08\x58\x67\xf8\x73\xf5\x3f\x74\x4b\xdd\x5d\xfa\x3d\x88\x49\x0f\x97\x69\x88\x0a\xad\x63\xa1\x46\xf9\x16\x16\x6a\x8a\x91\xd6\x59\xba\x79\x7e\x5a\xbd\xf8\x36\x63\x2b\xbc\x32\x27\xb0\x0c\xdc\x42\x9e\x9e\x6c\xbc\x30\x1d\x7f\x6d\xc2\xf6\x0d\x3e\x73\xc9\x2c\x2f\xed\xd4\x86\x41\xf0\xa1\x6b\xab\xd1\x44\x41\xce\x11\x45\x6f\xa2\x9b\x90\x24\x82\x01\xf2\x68\x55\xd8\xb1\x1b\x88\x93\x72\x3a\x32\x07\xc7\xfd\xa9\x0c\xc7\x91\x39\xaf\x35\xe7\xaa\x08\xfa\xaf\x07\xc4\x36\xe6\xc5\xcb\xb0\x63\xe6\x05\x24\xf0\x30\x5f\xf3\x10\xfe\x98\xbc\x80\x3f\x5e\x26\x7d\x5b\x1a\xe8\x35\x86\x53\x8b\xef\x70\x20\xaf\x39\x62\xd2\x22\x35\xeb\xe6\x47\x04\xd6\xc5\xf2\x53\x64\x30\x63\xef\x98\x92\xae\xe5\x75\x71\x21\x3f\x31\x1d\x0a\x9b\x51\xc2\x4f\x1a\x39\xd1\xc2\x02\xeb\x92\xe5\x36\x93\x01\xba\xbc\x68\x2d\x24\xd1\xfa\xdc\xe4\x89\xcd\xa9\xd2\x9c\x9a\xff\xc2\x22\x1b\xe6\x8b\xae\xfa\x2e\x98\xc7\x28\x73\x75\xbd\xf5\xba\x61\xf3\xba\xbd\xd4\xfb\x0c\x58\x4a\x3d\xe8\xd9\xbf\xc3\x1b\x36\x97\xf2\xea\x7a\x4b\xb6\xa5\xab\x57\xed\x68\x50\x7e\x13\xf1\x43\x8d\xd1\xdd\xf6\x3a\xbd\x2a\x4b\xa9\xf9\x5f\xc4\x56\xfa\x73\x09\xc7\x9e\x1c\x5d\x6d\x6a\x9b\xb3\xde\xa9\x5d\xd6\x9e\x23\x88\x6a\x60\xba\xa1\x0d\x2e\xa7\x63\x19\xd1\x51\x5f\x30\xec\x9e\xd9\x26\xf1\xb4\x87\xda\xfd\x04\x32\x17\x10\x9e\xbb\x64\xc0\x1f\x04\xf6\x41\xa3\x10\x52\x22\x3d\x40\xe1\x31\xed\x01\x0a\xf8\x99\xf6\xbb\x82\x23\xa0\x0c\x92\x16\x07\x35\xec\x28\xe8\x18\x12\x64\x4d\x4a\x13\x5b\x61\x4c\x7f\x5f\x37\x5b\x44\x22\x2a\xf2\x45\xe6\xd4\x0b\x97\xd4\x9f\x37\x61\x8c\x65\xcf\x6c\xc5\xb1\x88\x97\xd5\x72\x0d\x14\x59\x95\xe5\xd4\xaf\x04\xde\x75\x92\x4e\xf2\x45\x50\xf9\x17\xe6\x59\xa7\x97\x95\x10\x71\xf9\xf4\x84\x8b\x0c\x83\xd7\x18\x11\x72\xfb\x5e\xc8\x28\x31\x33\xfa\x2f\x90\x3d\x62\xfd\x80\xa3\x77\x26\xe5\x41\xc5\x4b\xa2\xb9\xb8\x61\xc1\x09\x96\x2e\x8c\x52\x22\x48\x60\x47\x64\x9b\x47\x0e\x52\x25\x12\xf4\xfd\x02\x23\x91\xa1\x05\x11\xfc\x70\xf6\x44\xc8\x29\x20\x58\x12\x98\x1b\x3a\x72\x12\x2d\x4a\xeb\x09\xbc\xc2\x3c\x62\x6a\xac\xd1\x7b\x18\x63\xd4\x3d\xce\xfa\x9d\x76\x66\xdd\x7c\xf2\xac\x83\xfa\xf1\x73\xc7\x60\xc0\x06\xb1\xfe\x5e\x81\xbf\xd0\x20\x63\x18\xf8\xe1\x56\x74\x99\xaf\x1f\xd1\x06\x61\xb7\x27\x82\x85\x9e\x53\x42\xc1\x44\xde\x53\x60\x44\x30\x78\x2a\x47\x6e\xe7\x71\x39\x42\x8d\x13\x7a\x04\x57\x13\xc3\x05\x9e\xef\xb9\xc7\xc0\x1c\x96\xc1\x3a\x5d\xb4\xad\xf6\x91\x63\x54\x15\x5f\x00\xc3\xa0\xd7\x35\xf6\xdc\xe3\xa7\x15\x92\xc6\x50\x78\x71\xf7\xa5\x70\xd4\xc7\x92\x36\xe6\x60\x15\xca\x1a\x3e\x6b\xdd\xbc\xa4\x39\xca\x4f\x1b\x7c\x20\x07\xbb\x9b\x96\x32\x57\x92\x1a\xde\x7e\xe8\x1d\x8d\x51\xe1\xa5\xbf\xb3\x45\xf5\x2b\xf8\xab\x3e\x02\x6f\xc4\xf7\x93\x00\x66\x20\xfe\xf7\xac\xff\x0d\x66\xdd\xae\xfd\x2b\xad\x7a\x43\x38\x20\xf7\x21\x56\x3c\xda\x3e\x4d\x17\x60\x19\xfb\xf5\x5c\x7b\xf5\xd6\xc1\xf2\xa5\xc5\x08\xc7\xd1\xe2\x9f\x4b\xba\x2b\x76\x59\x5a\x28\xbd\xea\x7b\x2e\xc5\x60\xe0\xfc\x33\x24\xcb\x4d\x5d\xe1\x47\x5b\x8e\xed\x46\x13\x8d\x9c\x5a\x2f\x9c\xee\xe6\xb5\x73\x83\xfd\xf8\x10\xaf\x36\xeb\x64\xb0\x7a\x3c\x06\x1b\x2c\xc8\x3f\xc5\x7a\xbc\xda\x62\x5c\x65\x8b\x5a\x31\xef\x1b\x2d\xc8\xe6\x20\xca\x9c\x21\xe5\xad\xb6\xf9\xba\xd6\x32\x75\xbb\xee\x06\xeb\xd5\xab\x93\x36\xe0\x15\x5c\xd3\xbe\x8c\x15\x1b\x3d\xa3\xe0\xdc\x49\x35\x7c\x8d\xd9\x49\xe4\xba\x8d\x2e\x9a\xe9\xf6\xc0\x9a\xec\x11\x17\x7b\x79\x4a\x08\x4e\x0b\x75\x15\xbf\xac\x8b\x93\xe5\x58\x42\x74\x78\x8b\x06\xcf\x7c\x28\x46\xec\x86\x7e\x15\x39\xd4\x35\x5a\x4e\x26\x17\x7c\x6f\x19\x00\x17\x26\xfb\x84\x0b\x95\x20\xb8\x98\x24\x11\x31\x5f\x2d\x6b\x23\x40\x52\xdf\xf1\x82\x6c\x6a\xc7\x85\x79\x40\x7e\x1a\x74\xdb\x03\x64\xbe\x1f\x95\x6f\x7e\x90\x4b\x10\x42\x34\xba\x70\x8e\x01\x43\x39\x3a\x63\x61\xe6\xc6\x00\x57\x56\xfa\x0f\x12\xa8\x02\x78\x50\xb9\xce\x62\xff\x17\xba\x81\x97\xac\x70\x39\x11\x69\xf9\x67\x69\xe5\x80\x57\x05\x89\xe5\x03\x90\x6e\x01\x42\xc5\x49\xf0\xdb\x63\x41\xac\xe1\xe5\x11\xef\xde\x94\xcf\xc4\x48\x54\x1a\x4a\xbc\x5d\xb7\x0a\x8f\xa1\x45\x93\xbe\xb2\x4d\xf4\x0f\x1b\xcf\x06\x3f\x9e\xe2\x2e\x24\xd0\x99\xc3\x5a\xdd\xe0\x7b\xf6\x67\xd0\x6d\x2b\x4f\xec\x40\xf7\x82\x85\x2e\x63\x0b\x7d\x0f\xee\xd0\x78\x54\x31\xf6\x7d\x78\x46\x93\xd6\xb3\x2b\x1f\xe8\xc7\x6c\x6e\xec\x0d\xa1\xc7\x46\x56\x9a\x6e\xd2\x43\xef\xd7\xbb\x77\xb1\x66\x9b\xa7\xdb\x86\x69\xb6\x39\x66\x83\x4b\x84\x56\x51\xfc\xc4\xa6\xf9\xc9\xad\x43\x53\x10\xd4\xed\x5d\x31\xf9\x17\x7b\x5b\x6e\xe8\x6c\xe5\x6e\x13\x10\xa0\x1d\xfa\xe7\x90\xd0\x32\x61\xd9\xe6\xc6\xa0\x57\x39\x7c\x10\xdb\x2a\xca\x09\x64\x01\xc4\x4b\x3e\xb8\x99\xa3\x0c\x81\x84\xfc\x4e\x91\x72\x2a\x9b\x20\xf1\x73\x32\xcf\xcf\xb9\x04\xed\x05\x94\x45\x8e\xe8\x55\xb8\x53\x0f\xb8\x4b\x83\x08\xa0\xbb\xbe\x0c\x4e\x7e\x7f\xca\xf3\xbe\x4b\xca\x00\xe5\x51\x5c\x75\x7d\x3c\xf0\xd7\xc0\x2d\x07\x21\x0d\x8e\x29\xb0\x3d\x8c\x20\x47\x61\x05\x6b\x1e\x7b\x86\xf0\xbb\xd8\x5a\x6c\x28\x4a\x0d\xc9\x16\xe8\x96\x12\x56\x79\x99\x9c\xe4\xaf\x8b\x27\x39\xa4\x69\xa7\x2b\xf5\x9f\x01\x32\x6f\x8a\x0f\xa4\xcb\x15\x02\xd6\x99\xe3\x87\x7f\xc3\xae\x94\x10\xae\x58\xd1\x79\x3a\x85\x1b\x26\xc5\x9d\xba\x4b\x29\x36\x3d\x0d\xeb\xb6\x09\x91\xfd\xc7\x46\x4d\x9f\x9f\xa2\x61\x09\xbe\xa2\xb9\x6e\xf3\x9b\xc8\xe8\x1e\x03\x9e\x48\xd0\x4b\x26\xd3\x49\x57\xef\xb2\xf3\xe8\xe6\xf0\xb3\xa0\x5e\xb7\x8d\x7d\x78\x0e\xc2\x60\xd0\x86\x26\x3e\x20\x0d\x71\x70\xb3\xec\xe4\x53\x83\x0a\xa2\xa7\x80\x8f\xcc\x2e\x2d\xd7\xaa\x2b\xa6\x0b\x5a\xde\x32\x75\x1e\x3c\x98\xd2\x6b\xda\xf8\x74\x5d\x35\xea\xd2\xd4\x19\x56\xd7\xb0\x0b\x0d\xca\x51\xb5\x1c\x9e\x3d\xce\x17\xb9\xea\xd3\xdb\x34\x09\xbd\xe8\xac\x42\x04\xc5\x8b\xba\x8f\x11\xb7\xf4\xef\x77\xc0\x3a\xf9\xcf\x7e\x62\xbe\x82\xbf\xfe\xde\x4f\x2e\xc4\xb6\xfc\x92\xe4\x9e\xab\x53\xa0\x3c\x50\x75\x8b\x05\xf4\xc9\x9d\x8a\xd1\xb8\xc8\xd9\xee\x0c\x15\x13\xf9\x42\x5f\x74\x08\x97\x3b\xc0\xb3\x43\x6f\xf8\xfa\xe0\xbd\x72\xd9\x12\xe5\xeb\x93\xf5\x7d\x45\x82\x97\x1a\xb1\x50\x05\xe6\xbe\x2a\xdd\x4d\x05\x5d\x01\x59\xc4\xc3\x80\x80\xda\x97\xac\x99\xf8\xe9\x72\x31\xc3\x5c\xe8\x01\x69\xef\xba\xaf\x1b\x54\xf4\xd9\x67\x41\xd5\x91\xfb\x0c\x6b\x47\x58\x5b\xd2\x3d\xa2\xc6\x90\x59\xd1\xec\xac\xd0\x9b\x2d\x8b\xe1\x08\xc3\xf2\xa4\xaa\x66\xfb\x7c\xa9\xa2\x7d\xbc\xe2\x5e\x16\x54\xb3\x4f\xdc\x81\x39\x3e\xb0\x25\x7c\xac\x7d\x57\x02\xcd\x1d\xd0\x08\x68\x8c\x7e\x46\xc9\xdd\x7e\x74\x2b\xc7\xf7\x6c\xcb\xd0\x0f\x4a\xc8\xa1\xa3\xae\xab\x14\xba\x12\xed\x46\xa6\xaf\x61\x31\x4d\x4b\x6b\x8e\x08\xea\x9e\xe4\x81\x6f\x4d\x55\x10\xb8\x9c\xac\x1f\x8e\x1b\x19\x90\x8d\x87\x24\xd1\x55\x53\x67\x56\xe4\xc5\xe0\x3e\x6f\x59\x5e\x60\xe6\x76\x47\x3a\x8a\x9f\x0e\x58\x19\x16\xbd\x0b\x74\x6d\xf9\xc6\x0f\x70\x6d\xf1\x12\x94\x0c\x5b\x34\x98\xaf\x5a\xd1\x57\xda\x27\xc0\x93\x2a\x51\x1e\xf0\x7c\x7e\x70\x50\xb0\xae\x79\x31\x1b\xe7\xc3\x02\xa4\x2a\x9c\x2d\x29\x86\xfe\xa7\x8b\xfd\xc7\xfe\xf8\xb8\xe2\x30\xc5\x8c\x33\xae\x16\x5a\x5f\xcf\x4f\x5b\x07\x33\x2b\x4f\x5b\xe9\xfc\x46\xa8\x54\x88\x4a\xfa\x74\xfe\xc8\xe6\xb7\xb8\xc4\x00\xe0\x35\x92\x47\xfc\x04\x1a\xa3\x14\x24\xb8\xc1\x2b\xc6\x20\xe5\x0d\xff\x04\x86\x74\x9e\x86\xe4\x26\xdd\x00\x76\x92\xc3\x3a\xfb\x45\x92\xbe\x13\x4d\xa8\xe6\x41\x04\xf8\xcb\xc4\xb5\xad\x35\x71\xce\x86\x95\xc4\x11\x8e\x36\x90\xd4\xbc\x24\x9a\x12\x1a\x01\xb5\x3d\xd9\xea\x2f\xf4\x72\x4d\x6e\x97\x4d\x2a\x7f\xb5\x62\xb6\xda\x73\x13\xe1\xd4\xc5\x9b\x86\x17\xe5\x94\xe2\xe9\xaa\x20\x5b\x0e\x0c\x91\xb6\x3a\xb3\x86\x5a\x96\xb3\xb4\x11\xfd\x58\x6c\xc6\x1b\x1e\x0d\xeb\xbf\xa1\xd6\x9a\x5f\xe2\x6a\xa9\x93\x22\x23\x6e\x71\xb8\x86\x04\x5a\xa0\x71\xcc\x83\xb9\x69\x24\x94\x58\xcf\x70\x41\x5a\x62\xf4\xe8\xef\xb3\x9b\xfa\x6d\x9b\x4f\x54\x34\x39\x51\x45\xb2\xe1\xb8\x1c\xbe\xee\xb2\x04\xbe\xd3\xd0\x62\x7b\x83\x35\xdf\x9b\x51\xa9\x8b\x03\x73\xca\x7f\x0f\x1a\x84\x55\xbd\x9e\x40\x96\x65\x49\x17\x82\x0e\x10\xc0\x1a\x35\x75\x52\x99\x67\xe8\xfc\x9e\x0c\xf0\x17\x29\xe9\x6c\x03\x08\x31\xee\x20\x3c\x85\xeb\xad\x0c\x43\xbc\xf1\x2c\x7a\x61\x80\xaf\x39\x16\xda\x36\x3c\x9d\x3f\xc1\x23\x17\x7e\x02\xfa\xa8\x66\x5d\x77\xae\x5a\xef\x5b\xd2\x24\xaa\xee\xff\xf1\x44\x0a\x6e\xbc\x61\x19\x4f\x81\xe6\x5d\xc0\x79\x1a\x44\xca\x07\x77\x07\x2b\x48\x8b\x7d\xcf\xf6\x26\x3c\xa2\xd0\xa2\xa2\xd3\x1f\xd7\xbd\xc1\x09\x93\xbc\xd9\x46\xd5\xb4\xb3\xc0\xf3\x4c\x70\x98\xb1\xd2\x15\x0e\x3a\x9c\xfc\xb9\x42\x8b\xe5\x59\x4e\x11\x43\xe7\xd5\x1c\x82\x27\x8f\x31\x89\x5e\xc2\x3e\x9c\xe0\x96\x32\xbe\x20\xd0\x8d\xea\x42\xd9\xe2\xc0\x5d\x05\x3c\xb2\x69\x53\x97\x73\xe3\xc0\x4e\xd7\x20\x59\xce\x10\xe3\x10\xe5\xad\xed\x6b\xa1\x7a\xe8\xb7\xd0\xf3\x87\x8d\x9d\x94\xf1\x53\x18\xe3\xc7\x7c\x58\x35\x3b\xde\x49\x79\x5a\xbf\xb0\x5c\xf5\x32\xd5\x34\xd0\x6b\x1f\xfa\x6d\x64\x17\x0c\xd3\xfa\x73\x50\xc2\xbd\x21\x3e\xd5\xbc\x47\x6f\xc3\x20\x8e\x2c\x37\xa7\x62\x5a\x53\x47\xe7\xd5\xb3\x33\xd3\x51\x69\x5b\x51\x13\x91\x9e\x46\x11\x91\xed\xe9\x98\x8e\xda\xfc\x33\x66\x82\xf2\x43\x4c\x32\xce\x3d\x83\x4f\x1d\xe1\x68\x51\x86\x96\xc3\xa7\x08\x9f\x11\x5c\x0a\x3e\xf0\x52\x46\x1c\x2f\xcb\xf1\xc8\xae\x4f\x2f\xcd\x61\x53\x6e\x48\x1a\x0d\x35\x93\x47\xec\x97\x88\x3e\x50\xf6\x09\xb0\xd8\x95\xa7\xd1\xfa\x22\x93\xd5\x22\x66\x41\x02\x75\x37\x72\xfb\xd7\x5c\x62\x21\x81\x1f\xc5\x76\x69\x67\x94\xec\x00\xc4\x8d\x23\xf8\xbd\xd2\x0a\xc0\x76\x80\xd6\x91\x51\x2c\x08\xe6\xca\x16\x99\xc7\xbb\x86\xd9\x34\xee\x18\x42\x38\xf4\xad\x43\x0d\x61\x9f\x10\xe3\xec\x09\x5c\x4e\x10\x86\x68\xdd\xc5\x08\xb5\xef\x6a\x3c\x22\xf4\x6e\xc5\x06\x4f\xe7\xa4\x2b\x04\x9c\x61\xe1\xbf\xf9\xaf\xf0\x8b\x07\x5b\x57\xfc\xa0\xa9\x0b\xb5\xb6\x06\x9c\xf9\xc7\x17\x1c\x54\x27\x41\x7c\x35\x8e\x48\x83\x05\x51\x1d\x6b\xeb\x5b\x7d\xa5\x7e\xd5\x3f\x5d\x90\xcf\xce\x95\x3f\xd9\xac\x6f\xf5\x95\xfb\xb5\x15\x79\x7c\x65\x25\x82\x84\xd7\xfb\xaa\x12\x4c\xe5\x06\x14\x0a\x4d\x69\x7f\xfa\x7e\xdf\x9b\xf3\xf0\xb5\x14\x93\xd5\x26\xc4\x1e\x8f\x29\x05\xd5\x1e\x05\x36\xd0\x05\xc6\x44\xc1\xda\xca\x93\x7a\x79\x0c\x11\xf0\xec\x01\x5e\x50\xc0\x12\x3f\x39\x43\xdd\x78\x4e\xe5\x11\xec\x97\xa2\x5c\xcb\xe9\x70\xbc\xc4\x54\x71\xc7\xf3\x2a\x87\x95\xc1\x1f\x6c\xd7\x22\x4b\xb6\xa9\xaa\xba\x97\xf9\xd1\xc5\xd5\xf4\xf1\x3c\x3f\x7d\x5c\x4d\x31\xd0\x09\xfd\xc5\xed\x37\xf4\x49\x66\xf8\x02\xee\x6c\x19\xcb\x80\xe3\x9d\xac\xc5\x9c\x55\xb1\x8a\x6d\x55\x1d\xce\x09\x0b\xd4\xb0\xb9\x98\x6c\x05\x54\x91\x7a\x56\x0c\xcb\x93\x12\x42\x69\x2f\x52\x0c\xf0\xb5\x51\x3b\xe7\xb9\x33\x83\xb6\x4c\x11\xa7\xd5\x15\x3b\x71\xd8\xc8\x9a\x10\xf9\x7c\xbd\x8f\xa6\xf5\xbd\xb4\xbf\xa9\xdb\xa6\x43\x1d\x70\x95\xd6\xe4\xcb\x5c\xbb\xad\x07\x9f\x34\xc9\xdf\x88\x4e\xb9\x89\x0d\xd7\xa3\x66\x4f\xfa\xb6\xd9\xee\x12\x29\x32\x28\xf6\x5d\x4c\x8f\x71\x97\x4b\x4e\x5b\xbd\x75\x6b\x13\x7d\x15\xf4\x47\xb8\x91\xa5\x8b\x5f\xb8\x24\xc2\x18\x35\xbc\xab\x01\xf5\xa9\xce\xae\xd0\x3f\x6d\xa3\xbe\xe1\x7e\x59\x25\x26\x50\x42\x9a\x2a\x88\x27\x02\x2c\x24\xc9\x9e\x5d\xf2\xb0\xdc\x24\x99\x52\x9d\x74\x4c\xf1\x47\x20\x51\x3b\x46\xc0\x9c\x33\xb4\x28\xc0\x8d\x5a\x64\x8c\x0e\x0a\xdc\xce\x96\xc0\x3e\xdb\xf0\x2b\xde\x30\x6c\xe5\xce\x6d\xd3\xd0\xec\xf4\xd0\x34\x77\x97\xcd\x72\xae\x90\x39\x85\xcd\x77\x17\xdd\x9d\x9e\x91\x55\xbf\x54\xe7\xe2\xc2\x95\x7c\xa1\xca\x80\x34\x5a\xcc\xbb\x5f\x02\xcc\xb6\xa7\x70\x35\x52\x98\x5c\x4b\x47\x6a\x5e\x97\x04\x2b\xe2\x5a\xd7\x25\x2b\xa5\xfc\x8b\x60\xdc\x5e\xb2\x6b\xe5\x6a\x81\xf1\x20\x0a\x40\xed\x57\x64\x51\xe8\xfc\x9d\x60\xbb\x7f\x7f\x07\x31\x9e\x7d\x1d\xc0\x3c\xfe\xf2\x6e\x1a\x8b\xcc\x36\x2f\x76\xda\x61\xeb\x28\x3a\xdb\xfc\xda\xd9\x3c\x69\x7e\x24\xd4\xb9\x7f\xff\x6b\xf7\x3e\x0a\x63\x1d\x44\x69\x9b\x77\xdf\x6c\x06\x71\xad\xa3\x9b\xcd\x0b\x47\x91\xc2\x98\xcd\xa3\xef\xd2\x30\x5a\xb9\xbf\x73\x1f\x01\xf8\x82\x90\xe4\xfe\xce\xce\xbd\x18\xec\x35\x02\x1c\x7c\xfb\x09\xe0\xe0\x03\x00\x1c\x5c\x31\xd1\x0b\xda\x36\xb1\x51\x18\x66\x60\xe6\x7c\x26\xf9\x5e\x5a\x81\xf8\x54\x64\x4c\x23\x28\x9f\x5f\x79\xc1\xee\x3f\x1b\x0d\xa5\x05\x7f\x40\x5e\xf9\x29\x17\xe3\x8d\x0a\x11\x8c\xfe\x52\x42\x8e\xb6\x41\xc4\x4d\x62\x90\x26\xce\xa5\x90\x7d\x4b\x26\x4c\x04\x02\x6d\x00\xde\x04\x8a\x66\xc9\xff\x59\xd6\xec\xff\x46\xfe\x43\x14\x4b\x3e\x04\xbd\xa4\x5e\x9e\x82\xbb\xd8\x1c\xe7\xc1\xeb\x5c\x66\x68\x75\x7b\x31\xf7\xa1\xcf\x2f\xad\x77\x51\xbc\x61\x5c\x3c\x74\x89\x91\x1e\x1a\x66\xd0\xed\xb3\x12\xf1\xb4\x58\xe8\x91\xd0\x10\x61\x41\xa0\x10\x99\xdb\x1b\xd1\x43\x02\xe7\xe5\x45\x22\x79\x2e\x62\xde\x74\x64\x98\xa4\x62\xc8\x09\x19\xbc\x7e\x0b\x89\x34\x68\x43\xbc\x2e\x31\x1d\xc4\xbc\x0a\x7e\x03\x7d\xd4\xe8\x91\x10\x3b\x0e\x2b\x03\xfa\x0f\xe1\x57\x13\xc3\xa5\xa0\x74\xca\x40\xd6\x15\xfa\x71\x43\xda\x3a\x28\x87\x70\xcf\x54\xac\x70\xeb\x12\xa7\x10\x56\x04\x5b\xba\x21\xeb\x04\xa6\x1e\x14\xdd\xb4\x06\x0c\xa5\xcf\x8f\xab\xc5\xd9\xe7\x94\xce\x19\xf6\x68\xfb\x12\xb6\x0c\x23\xf4\x0a\x73\x82\xa0\x08\x64\x70\x88\x2c\x27\x70\x92\xb6\xc9\xb5\x21\xd5\xee\x14\x71\xc7\x38\x3a\xd3\x01\x67\x21\x86\x4e\xee\x72\x26\xb2\xfa\x0e\xa7\x0b\x21\x36\xe2\xec\xea\xea\x15\x3e\x9d\x14\xf3\x53\x72\x08\x9b\x90\xc7\x6c\xb9\x40\x77\xc9\x45\x72\xba\x84\x88\x7c\x3e\x48\x0c\xab\x39\xac\x74\xa2\x26\x70\xd7\x99\x11\x7c\x0c\x7e\x86\x21\xa2\xe7\x34\x4e\x20\x3d\x61\xe5\x56\x13\x1b\x89\xea\x10\x10\x4a\x76\x0c\x23\x89\x6e\x7a\x5d\xe2\xf4\xc2\x28\x60\xf2\x48\xca\x7e\x98\xd7\x17\x84\xb4\x7d\x42\x98\x0a\xec\xaf\x47\xc1\xa9\x46\x19\x30\x84\xa6\x15\xb7\x86\x64\x90\x39\x06\x90\x21\x10\x13\x10\x52\xe2\x45\x5b\xfb\x14\x5d\xe7\x4e\x70\x80\xac\xf4\x80\xde\x43\xf6\xbf\x47\xca\xb9\xe9\x73\x82\x13\x40\x60\xef\x42\x1c\x0d\xc1\xcb\x74\x95\xb3\x1e\x50\xa5\xff\x58\x9e\xc9\x6b\x66\x43\x0b\xff\x8d\x38\xc3\x2b\xa4\x4b\x16\xac\xb1\x6e\x2f\xf0\x1b\xb1\xd5\x41\x9b\xe9\x3f\x1f\xa6\xba\x50\x38\xe4\x28\x13\x08\x56\x0d\x80\xaa\xc8\xad\x91\x7c\xaf\x91\x8d\xc0\x92\x0e\xdd\x1f\x10\x9b\xf1\x63\xa2\x06\xef\xa0\xad\x03\xca\x14\x3d\x37\x33\x6b\xf6\x1f\x48\x5b\x8e\x4c\xe4\x94\x2e\xe4\x43\xdd\x22\x1d\xdc\x02\xd4\x29\x39\xa9\x85\xab\x83\xe1\xa6\x4c\x8d\xa0\x31\x12\xde\x1d\x65\x73\xc4\x93\xd4\xdb\x85\x3c\x26\xfb\xb3\x2c\x15\xd3\x6d\x04\x59\x33\x87\xd8\xff\x28\x2e\x34\xbc\x92\x4b\x8b\xbf\x2e\xa6\xd1\xde\xbe\xbe\x5d\x60\x30\xa0\x0d\xe8\xd3\x17\x34\xaa\x20\x34\xd2\x2f\xa8\x2d\xe8\x46\xa5\xc7\x13\x35\x80\xc3\xc3\x40\x1b\x36\xa5\x11\x23\x7f\x53\x01\x02\xc7\x91\x36\x8b\xc4\x8c\xbc\x69\x94\xe0\x4f\xe3\x8c\x50\xec\xa6\x10\x63\xd7\xce\x63\x84\x4c\x83\xaf\xdd\xad\x83\xa1\x6a\x3a\x5d\x3f\x33\x22\x8a\xf7\x33\x19\x1f\x0c\xdf\xa6\xc7\x50\x02\x10\xe8\xb9\xb5\x78\x2c\xa1\xe8\xee\xe2\xcd\x7f\x50\x94\x28\xfc\xb9\x7e\xd8\xf8\x83\x5e\x18\x43\xaa\xea\x61\x2f\x65\x3f\xb4\x33\x68\xe6\x0b\xa6\x03\x96\x49\xf5\xe9\x03\xf5\x45\xbc\xe5\x6e\xa4\x23\x53\xa3\x1b\x31\x5b\xd6\x67\xb6\xb5\xd1\x39\xc2\x3b\x43\x77\x7d\x38\x0c\xb4\x82\xcb\x60\xa8\xb8\x07\x30\x54\x9a\x67\xdd\x50\xa9\xee\x85\xa3\xc6\xaf\xbd\x51\x43\xc2\xa5\xa9\xe9\xee\x83\xa4\x4c\xbe\x6f\x8c\x10\xff\x7e\xc9\xc3\x69\x0a\x7d\xf1\x85\x3f\xa6\x6a\x7e\x9f\x70\xe3\x1e\xb6\x92\x79\x51\xbe\xd4\xa3\xab\x7b\xfb\x62\xc5\x37\x30\x41\xc1\xf2\x52\x54\x92\xa0\x7e\xf5\xaa\x17\x99\xaf\xad\xf6\xba\x23\xf5\xc8\xa0\x3d\x08\x17\x16\x65\x0f\x4a\x61\xdf\x4e\x6c\x26\x5b\x32\x7a\x8d\xca\x11\x5c\x35\xc1\x4d\xaf\x19\x1c\xc1\x73\x9f\x5e\x08\xa2\x1c\x2d\xc2\xad\xd8\xf8\x37\x39\x38\x18\x72\xaf\xd9\xaa\x74\x7c\x94\xfc\x02\x7e\x27\xb4\x32\xc3\x04\xdd\xe5\x6d\xcb\x81\x32\x2a\xf0\xfd\x4c\xb0\x56\x4f\x36\xe7\x3c\x77\x9a\xb2\xda\xb0\x39\x63\xdd\xc3\x33\xd2\x77\x9f\xce\x48\x1f\x0b\x04\xce\xce\x1a\xdd\x92\xb5\x63\xc1\x61\x8e\x13\x28\x37\x7d\x53\xce\xab\x69\xf3\x64\x13\x2b\xa1\x73\xdb\xec\xfd\xcd\x34\xf4\xd5\x93\xdd\x83\xbd\x57\x07\xbb\xcf\x60\x90\x05\x75\xd2\x21\x7e\xd2\x1a\x21\x8b\xc9\x49\x09\x26\x26\x34\xdf\xe6\x68\x47\xb5\x4d\xbd\x43\x4a\x2a\x6c\xac\x80\x58\x65\x54\xb6\x1c\x28\x55\x82\xc7\x08\x73\xc4\x77\xad\x17\x52\x09\xe6\xc4\xc1\x30\x04\xda\xbd\x0a\x36\xbe\xb0\xc7\x62\xd0\x38\x3a\x73\xb9\x1a\x0b\x88\x0c\xa5\x65\xd6\x71\x4f\x3b\x7d\xfd\xcb\x94\xe9\x70\x76\xb8\xdf\x8a\xe3\xd7\xa5\x1a\x5b\x28\x78\x1e\x3c\xdb\x73\xc5\x0f\xaa\xff\xf6\xcb\x4e\xf4\x03\x55\xf0\xa9\x5f\xac\x8a\x16\x9a\xd4\x7e\xa9\x83\x43\xbf\x98\x3d\x92\xd8\x51\xd4\xbd\xb3\x0f\xe1\x53\x5d\xc2\xef\xdb\xae\x2e\x76\xee\x3f\xf2\x7b\xe6\x95\x9c\xa8\xdf\xba\x5f\x5e\xa1\x2a\x56\x64\x52\x7b\x65\x0e\x0e\xbd\x42\x5b\x3a\xc7\xaf\x69\x2c\x31\x33\xef\xca\x5e\xaa\x7f\xb9\x89\x92\x4b\x5b\xf4\xbb\x32\xe7\x8e\xbd\xf1\x26\xb8\x64\x50\x9a\xf8\xeb\x21\x7f\x95\xe1\xcf\x07\x9c\x51\xfd\x29\x9f\xdb\x66\xe3\x7c\x01\x46\xd0\x3a\x45\xc5\x05\x20\x8b\x87\xcb\x31\x7c\x5c\xe1\x61\x0d\x6f\xf7\xf1\x94\xb3\x3b\x1d\xcd\xab\x72\x94\x7c\x99\xbd\x4d\xb7\xac\x26\xb5\x9c\xde\x36\x9a\xc1\x49\xf9\xd6\xf0\xee\xb6\x9d\x85\x6d\xd4\x74\xb7\x1d\xcb\x6d\x7b\x2e\x05\x66\x23\x21\x0e\x97\xa5\x40\xf4\xa8\xbd\x6c\x0f\xf8\xff\xd9\xfb\xf7\xc6\x26\x92\xe3\x51\x18\xfe\xdf\x9f\x62\x20\x6f\x56\x32\xc8\x32\xd8\xb0\x17\x19\x76\x8f\xd7\x98\xc4\x27\x80\x79\xb1\x59\xb2\x3f\xc2\x41\x63\x69\x64\xcf\x22\x69\x14\x8d\x84\xf0\x06\x3f\x9f\xfd\xa9\x6b\xdf\xe6\x22\xd9\x66\x49\xf2\x1c\x73\xce\x2f\x6b\x4d\x77\x57\x57\x77\x57\x57\x57\x57\xd7\xe5\x44\xd3\x31\xf2\x04\xd1\x56\xc0\x8d\x26\x21\xe2\x66\xec\x5c\x14\x69\xe7\x12\xe7\x0c\xce\xec\x44\x92\xa3\xd3\x25\x1d\x43\xff\xa4\x83\x02\xa6\x02\x14\x11\x81\x5d\x87\xe2\x36\x87\x5d\xa3\x40\x66\x33\xb9\xbc\xd2\x9d\x8f\x61\xd1\x0b\x14\xbb\x3b\x4e\xd6\xe4\x12\xdf\x6c\xd8\x85\x45\x70\x0d\x9c\xc0\x45\x3a\xee\x67\x8b\x75\x9b\xa9\x7c\x08\x0b\x19\xec\xd9\xb6\x4b\xac\xf6\x07\x1f\x5b\x16\x7a\xc0\xf0\x56\x07\xef\x6d\x74\xe7\x97\xe9\xc0\xc8\x61\xc8\x8d\xf6\xf5\xb9\x1e\xe1\xfb\x90\xdc\xd7\x18\x53\x95\x1e\x68\xbd\x6a\x6f\x3d\x30\xa1\x58\x4c\x8b\xaa\xf0\x2d\x14\x5f\xe6\xf3\x2a\xd1\x0f\x57\x3c\x33\xdb\x84\x25\x51\x0b\xe4\xad\x69\xf7\xce\x91\x91\x4e\x60\x4b\x7c\x08\xc5\x54\x79\x99\xc7\xce\xca\xd8\x7f\x1b\x4e\xac\xd7\x79\xf2\xe4\xf0\x39\x77\xec\xef\xbf\x1d\x79\xd4\x7f\x43\xe4\xc2\xa7\x65\xbc\x88\xfe\x05\x67\xe1\x67\xa6\x95\x0b\xcf\xc3\x03\x76\x2c\x3e\xc3\x99\x50\x6a\x5e\xe1\x1a\xc5\xc4\xe3\x0b\x7a\xf4\x01\xef\xee\x12\x3d\x5a\xa8\x8e\xcf\x94\xa1\xd4\x66\x25\x04\x45\xfc\xa3\x78\x82\x1c\xb4\x77\xcd\x89\xf0\x07\xa7\xf2\x30\xcf\x34\xa8\xa2\x43\xd9\x14\xc1\x0a\x0e\xe4\x53\x72\xce\xc7\x37\xc4\x21\x4a\x08\x27\xac\xcd\xce\x11\x06\xef\x19\x09\x04\x0c\xbb\x69\x77\xe3\xf0\x6f\x72\x9d\xb7\xbc\x08\x46\xe9\x8f\x6e\x6c\x0d\xb7\xc8\x3f\x8a\xff\xd4\x62\x9e\x40\x72\x3a\x2a\xb4\xac\x6a\xd3\x8a\x34\x7d\xae\x6b\xbc\xc2\x13\x72\xc5\xbe\xcb\x1a\xaf\xd4\x7d\x89\x96\xd3\x10\x3e\x42\xc7\x41\x8d\xfd\x71\x39\x37\x71\x07\x3f\x1f\x29\x26\x74\x4b\xca\xe2\x7f\x4a\x4f\x47\xde\x23\xdd\xc1\x20\xda\x3b\x3a\x72\x8e\x74\xbb\x9a\x39\x87\xda\x4c\x28\x49\x28\x2d\x2c\x2a\x50\x6f\x63\x14\x3e\xcb\x7a\x2d\x24\xa6\xa4\x74\x34\x4a\xfa\x68\x3e\x3d\x3c\xd7\x17\x3e\x66\x23\x18\x1a\xec\x38\x1d\x25\xd9\x5c\x1e\x54\xed\x74\xdc\x0b\x12\x97\xba\xfa\x48\x3b\x04\xd8\xe3\xfb\x70\x2b\xb7\xf6\x4d\x5a\x64\xc7\x53\x45\x3b\x52\x31\x9c\x29\xcf\x92\x49\xcc\xee\x69\x19\xff\xb0\x09\xbf\xe6\xf8\x6a\x48\x74\x95\x21\xae\x74\x4b\x61\x6c\xec\xeb\x57\x99\xf4\xda\xd9\x7a\xf0\x00\x2f\x24\x5b\xf7\x6e\x2e\x24\x5f\xfd\x42\xf2\x97\x69\x26\x49\x00\x2b\x9f\x64\x96\x45\x80\xae\x7c\x51\x09\x5b\x95\x57\xbc\x7c\x6c\xe1\xde\x10\xc4\x03\x74\x30\x40\xc5\x4a\x10\xe7\xd8\x2f\xbb\x52\x96\xd0\x92\x81\xd1\x2c\x29\x75\x8b\xdc\xca\x11\x74\xe8\xc0\x4d\x73\x10\x45\xc9\x34\x0b\x84\xe6\xb2\xa6\x0d\xe2\x07\x28\x46\xd2\x7b\x7f\xc7\xf8\x2a\x18\x7f\x10\x86\xfc\x52\x6b\x80\x68\x75\xce\x32\x39\x69\x07\x80\xb0\x71\x4d\x8b\xd5\x70\xbf\xac\x39\x61\x05\x9f\x24\x83\x78\x3e\xa4\x27\xe3\x9a\x24\x81\x46\x95\x61\xfb\x6f\xe4\x93\x78\xdc\x68\xb9\x3a\x0e\xd3\xa9\x37\x45\x6d\x94\x66\x25\xf1\xc1\xae\x18\x95\x31\x5b\xd8\x71\x11\x91\x14\xa6\x14\xbe\x71\x05\x44\x44\x65\xd1\xa9\xa3\xa8\x82\x5a\xbb\xe4\x11\x6c\x3d\x44\xa5\x67\x1d\x52\x86\x43\x7a\x64\xae\xca\x50\x6a\x82\xc4\xda\xde\xad\xde\x51\xd5\x80\x54\x13\x15\x4d\xc7\xd9\xfe\x98\x03\x90\xab\x4a\xd2\x29\x7a\x96\xe0\x6b\x85\x16\x05\x88\x3c\x49\xfb\x55\x78\xb0\xfb\x02\x4d\x5c\xb0\x95\x38\x77\x03\x67\x8a\xf2\xde\xd9\x8c\xac\x2a\x9a\xad\x92\xe6\xbe\xb8\x5a\x52\x81\xf4\xd7\xae\xd0\xca\x13\xcb\x09\x6d\x77\x49\x87\xd6\xfc\x50\xa2\x3e\x2d\x9d\xe3\x57\xec\xad\x10\x52\x20\x2a\xdc\xe8\x9b\x67\x2a\xaf\x2f\x34\x76\xa0\x97\x59\x7f\x41\xc7\x80\xf6\x5d\xd9\x1d\x97\x10\xf3\x34\xb4\x64\x42\xed\x3a\xda\x34\x19\x97\xa2\xd0\xe2\x43\x87\x55\x93\x86\x48\x38\xae\xf9\xc1\x34\x48\xc1\xba\x39\x6d\xcd\x40\x28\xb2\xa3\x5d\xf7\x0f\x56\x0f\x5d\xbe\xe0\xd8\xe6\x2c\xce\x5f\xda\x07\x15\x6f\x1a\xbe\xf9\xa6\xf0\xad\xec\x7d\x64\x27\xd0\x70\x17\x68\x07\x01\xdd\xd2\x7e\xbc\xd8\x50\xb7\x96\x6c\xad\x72\xd2\x73\x36\x18\x5f\x9b\xca\xa8\xaf\x30\x0d\xe1\x50\x0a\xd3\xf0\xc2\x3e\x20\x85\xd3\x10\x7e\x5b\x36\x0d\x61\x5f\xde\x34\x50\x3f\x5f\x6c\x1a\x88\x99\x2c\x99\x06\x16\xbd\xdd\x47\xe7\x0c\x04\xe7\xf8\x5c\xb4\x08\x03\x7a\xd4\xd6\x97\xdd\x16\x56\xec\xd1\xb5\xa9\x9f\xb9\x6f\xa0\x45\x46\xc5\x26\x38\x15\x9c\xca\x67\x83\xe1\xc2\x2d\xe5\x97\xee\x22\xab\xb4\xea\x32\x1e\x2a\x09\x88\xdf\xe1\xad\xe1\x0c\x2d\x61\xc2\x91\xdb\xbc\xb4\x3f\x2a\x71\xa4\x77\x8f\xff\x95\x67\x6d\x59\x65\x55\x11\xd5\xe9\x3c\x71\xc6\xd1\x73\x9c\x92\x25\xc5\xeb\x20\x97\x37\x44\x23\xfb\xdb\xe8\x35\x1e\x77\x65\x6c\xd6\x8b\x27\x78\x59\xb5\xa6\x4f\x4e\xef\xd9\x44\x18\xed\x79\xb9\x1c\xe9\xfc\x04\xae\x53\x4e\x3e\x19\x65\x3d\x9e\x9d\xa6\x76\x56\x09\xc5\x21\x4c\x7b\x2a\x94\x55\x2c\x9f\xc6\x65\x93\x52\x33\x27\x40\xa3\x2b\x4c\x89\xa9\xd5\xf4\x1f\x60\x44\x07\xb5\xca\x32\xba\xeb\xc7\x35\xaf\x7f\x70\x55\x05\x61\x59\x77\xe8\xe0\x56\x59\x6f\x9f\x3f\x47\x65\xdf\xeb\xdf\xb6\x31\x8e\x3e\xde\x41\x16\x64\x50\xc0\x16\x2e\xf2\x32\x86\x3c\x20\xc6\xf4\x4d\xa8\xa5\xe1\x47\x33\xb8\x27\xc1\x90\x48\xa9\x93\xaa\x9f\x49\x54\xd8\x2e\xa5\x0b\xef\xee\xdf\xff\x94\x7d\xc3\xcc\x64\xd9\xb6\xa1\x5a\xd5\xbb\x86\x8a\xaf\xbb\x69\x14\xc8\xb2\x3d\xa3\xf5\xfe\x88\x2d\xb3\x7c\x36\xb4\xd2\xcd\x86\x59\xbe\x61\x12\x9c\xa8\xeb\xef\x17\xaa\xf0\xb5\xf6\xcb\x92\xed\xc2\x67\xe1\xb2\xed\xc2\x43\x0a\x09\x1c\xbf\x96\x6c\x92\xf2\xdd\x41\x09\x68\x34\xb1\x9b\xe6\x93\x43\xe1\x65\x41\x11\xcd\xd0\x15\x78\x8a\x46\x6f\x27\x9b\x3d\xce\xb8\xe9\xa7\x6c\xb3\x50\xe2\xd3\x18\x03\x2f\x24\x83\x01\x3a\x4f\x7d\xc4\x14\x33\xa3\x39\xda\xa8\x9a\xac\x35\x3a\x19\x36\xbb\x3b\x15\x2c\xb2\xe9\x07\x0b\x06\x7a\xef\x6b\x1c\xc1\x92\xcd\x2b\x63\x5b\xb6\x77\xa5\xda\xd5\xb6\xee\x92\xbd\xbb\x7c\x69\xb4\xd2\x7f\xdf\xde\x2d\xeb\x0c\x64\xea\x2b\xef\x5c\xd9\x99\x4c\x1c\xce\xde\xe5\x7d\x3b\x4c\x06\xb3\x76\xb4\xdb\xef\xe3\x27\xaa\x52\xb6\x6f\x99\x0d\x3a\x0b\xee\x13\x30\x5f\x63\x17\x8e\xd9\xb2\xf8\xf3\xfc\xeb\xa2\x55\x76\xc9\x34\xf2\xbb\x2c\x87\xd3\xd6\x33\x23\x0b\x6e\xa1\xf6\xfa\xe9\x34\xb8\x28\xd0\x20\x1b\xa8\x96\xc8\xeb\x26\x89\x8e\x11\xfd\xd1\x45\x7b\x9a\xf6\xd5\x8c\x12\xdf\x1e\x39\x70\x2b\xee\x09\x09\x93\x32\x56\x77\x55\x68\x7e\x72\x4e\x7a\x37\xf2\xef\x92\xc4\x95\xd6\x90\xd8\x5a\x4e\x01\x06\xc7\xd9\x2b\x8d\x08\x51\x30\x34\x33\x19\x1d\x8b\x13\xe3\x4d\x29\x7d\x2d\xbf\xa6\x7b\xd3\x44\x54\xe3\x9b\x08\x13\xb6\xbf\x66\x73\x32\x57\xa5\x61\x61\x68\x49\x74\x85\xc4\x77\x28\x62\x0e\x92\x37\x92\x6c\xee\x62\xe9\x2b\xe6\x44\x95\x39\x90\x05\xf3\x2f\x17\x1c\xc6\x85\x1b\x03\x31\xc4\x43\x51\x89\x62\xaa\x14\xb4\xa9\xa0\xfb\xd3\x82\xfc\xda\x91\x91\x88\xf5\x2f\x31\x1c\x82\x4a\x0f\xbe\x68\xbb\xea\x42\x8b\x87\x80\x48\x1f\x6d\x8e\x13\x7d\x28\xea\x93\xb9\x6d\x2f\x06\xca\x42\xef\x37\x46\x1b\x49\xf8\x24\x81\xd6\x29\x4c\x1f\x7e\x46\x4d\xb0\xa8\x73\x3d\x78\x9e\xbe\xce\x31\x1d\xce\x68\x25\x35\x1f\x31\xd6\x61\x8d\x3e\x21\x98\x71\xac\x48\x8e\x78\xed\x82\x2b\x4c\x40\xb8\xb0\x7c\x19\xf5\x35\xad\xae\x39\x58\xb8\xd5\x05\x31\x59\x28\x37\xa7\xc0\xbf\x80\xef\x75\x90\x28\xe8\x8c\xa0\xbf\x6c\xaa\x87\xf5\x12\x85\xd3\x2a\x01\x10\xdd\xee\x95\x27\xb6\x0a\x65\x9e\xaa\xd3\x19\x9c\x32\x25\x7a\xe1\x58\x5f\xe1\x89\x83\x14\xbc\xe6\x85\x63\x65\xc7\x9c\x0a\x65\x78\x67\xfb\x3e\x39\x04\x05\x7a\xec\xce\xf6\x83\x87\xad\x82\xb6\xba\xb3\xfd\x70\x8b\x5e\x4e\xee\xaf\xf2\x72\x62\xde\x82\x50\x7d\x41\x8e\xf8\x15\xcf\x29\x37\x2f\x29\xab\xbf\xa4\xb0\x86\x84\x82\x19\xd4\xbf\xa2\x3c\x4b\x07\xc9\xde\x79\x8f\x8c\x5a\xc2\x87\x11\x53\xe6\x67\xaa\xe4\x63\x8f\x42\x28\x95\xb9\xc3\x38\xc5\xd7\xc8\xc8\x79\xb5\x6c\x94\x2b\xe5\x98\xbc\xdc\xab\x4e\x3a\x86\xff\x4d\xe3\x10\x71\xf3\x59\xeb\x2d\x62\x4a\xca\xec\xd7\x92\x8f\xd4\xab\x21\x73\x89\x4c\xc1\x18\x35\xc3\x44\x3b\x36\x0e\x51\x21\x9d\x0f\x06\x56\xf6\x17\xc6\x4a\x4c\xa4\xbb\x87\xae\xc2\xd4\x35\xaa\x82\x6b\x50\x14\x04\xe4\xc9\x85\x97\x07\xf5\xd1\x6e\x49\x24\x14\xc1\x8f\x4c\xe7\xa7\x96\xf9\xe0\x61\x2b\xc6\x17\xde\x5c\xc3\x74\xcd\x47\x98\x67\xd2\xf6\x21\xf6\x10\x26\xe8\x95\xfa\x7c\xe7\x0a\x68\x31\xcd\x60\xaa\xf0\xf8\xa5\x2d\x3b\xb5\xa1\x8f\xd7\xc5\x38\x83\x3c\x64\x30\xae\x8a\x9c\x67\xb1\x7a\xb9\xc4\xe3\x73\x38\xe5\x4c\x2a\xc4\xa3\x24\x89\x4e\xe6\xa7\xd8\xef\x9f\xee\x7f\xf7\xe0\x1e\x17\x78\xa1\x43\x96\xcc\xb7\xf0\x54\x67\x81\xe8\x9d\xc8\xaf\xf5\x0a\x4f\xc6\xa7\xd9\x54\x80\x4c\xbc\x3c\x3c\x2d\x4e\x8c\x3f\xb5\xce\xc1\xcd\xdb\xb0\x29\xfb\x73\x66\x87\xb4\x6e\xc2\xda\x00\x99\x8f\xed\x17\x87\x4f\xf6\xdf\xef\xbf\xf8\x25\xfa\xc9\x52\x57\xd3\xe2\xed\xee\x20\x5d\xe0\x48\xa2\xd7\x89\x41\xdc\x9f\xf3\x66\xbb\xdd\x5e\xef\x44\x7b\xf1\x18\xad\x18\x24\x75\x77\x7f\x3e\x55\x47\xf7\x4f\x29\x3b\xbd\x4b\x82\x6a\xc3\xd5\x4d\xde\x8b\x46\x33\x9f\xc3\x9a\xc4\x1c\xb4\x1e\x8d\x8f\x79\x82\xbb\xeb\x78\x63\x74\xe2\x23\xe7\x8e\x31\x4b\x8c\x49\x43\x13\x7b\x94\x1b\x60\x9c\x1f\x6d\xc2\xa6\x35\x2c\x18\xc9\xab\x9d\x9d\x1a\xf8\x89\x3e\xb9\x76\xc8\x4b\x47\xbb\xbe\x6e\x42\xa7\xac\x9a\xdb\xca\x5f\x19\x5a\x5c\xc9\xcd\x55\xb6\xcd\xb8\x70\xa5\xc5\xf2\xc4\xf8\xc3\x31\x85\x00\x80\x03\x9f\x4c\x54\x41\x7a\x25\x47\xa0\xd8\x19\x6d\x3b\x3a\xc4\xe8\xf0\x8b\x34\x4f\x7c\x83\xa0\x3c\xc5\x1c\xe8\x6d\x0b\xec\x0d\x11\xbb\x89\x2c\x80\x20\x70\xe5\x38\x76\x14\xd3\xee\x9e\x24\xf3\x6e\xdb\x78\x45\xaa\x52\x47\x2c\x2c\xac\x99\x97\x6f\x72\x91\x18\xa1\x0e\xab\x39\xa2\x34\xf9\x56\xe5\xc0\x08\xc8\x2b\x63\x08\xfc\xa4\x47\x87\x00\x2f\xb9\x22\xb7\x32\x19\x0b\x9f\xb3\xd2\xd6\x2d\x3b\x11\x56\xb0\xf2\xc8\x36\x42\x1f\x4d\x9b\x73\x5e\x92\x04\xa2\x9f\xdb\x48\x58\x99\x73\x89\xf4\xb3\xb5\xd0\xc1\x4e\xf1\xd1\xf1\x3a\x9d\x00\x69\x8b\x18\x3a\xc4\x58\x4d\x7f\x46\xeb\x4e\x0e\xd8\x2c\xe1\xe3\xe0\xa3\xd7\xde\x81\x6b\x53\x0e\x8e\xb3\x8d\x6c\xd2\x6e\x38\xe9\x09\x4a\x46\xe0\x11\x33\x49\x64\x11\x87\x4e\x2d\x8b\x40\xaf\x49\xed\x8c\x05\x62\x91\x86\x6b\x18\xfa\xeb\xf1\xa8\x82\xa5\x97\x81\xaf\xc8\x7c\xc7\x56\x76\x2c\x4b\x85\x72\x01\x47\x2d\xc8\x99\x0b\x13\x97\x70\xae\x1f\x48\xa7\x18\x6f\x69\xce\xd1\xaf\xe8\x42\x82\x0e\xe9\x18\xe6\x15\xe3\x76\x52\x94\xc0\x94\xcd\xb0\xf3\x59\x32\x69\xfb\xe1\x5f\xdd\x6e\x24\x22\xa8\xf1\x81\xdc\x37\xc7\x8b\x49\x51\x6f\xf3\x45\x42\xbf\x09\x19\xe3\xe0\xf5\x78\x80\x2f\x33\xaa\x10\x11\x8f\x05\x45\x92\x61\xd1\xae\x13\x9a\x4c\xfa\x65\x0e\x73\xcc\x63\xd0\x26\xe2\x22\xf2\x79\x03\xdd\x9e\x4c\xdc\x3b\x71\xd1\xc7\xf4\x12\x28\xc8\x75\xf5\xec\x0a\x23\x6a\x97\x24\xf1\xdf\x63\xba\x63\x74\x79\x26\x91\x3e\x09\xcf\xbe\xb6\xd7\x95\xa1\x9f\xe8\x7c\x16\xec\x6c\xd7\xf3\xac\xe4\x70\xc1\x2a\xba\xfe\x57\x3d\x5c\x4c\x26\x4b\x83\xb9\x9f\xbf\x52\xc9\xbc\x11\xa0\x26\x7b\xf6\x57\xbb\xc5\xba\x79\xc2\x4f\xdb\xdd\x16\x1e\x1b\x14\xe1\x53\x7f\xdb\x9d\xd6\xe8\xaa\xa2\xc0\xa9\xa6\xbf\x81\xe8\xba\x40\x79\x3d\x39\x96\xbb\xec\x08\x1a\xd2\x84\x03\x2c\xcd\xc7\xff\x68\xb0\xaa\x0d\x8d\x8b\xdb\x92\x6e\xd3\x3b\x50\xea\xc7\xb7\xee\x45\x63\x2c\x1c\x27\x97\x3d\xf5\x55\x43\x04\x5c\xf7\xa5\x38\xc1\xe2\xa1\x80\xaa\x3b\xe4\xf4\x9c\xf6\x02\x8f\x62\xcc\x7a\x81\xfb\x7f\x91\xa8\x03\x10\x1f\x16\x76\xbb\x2a\x1c\x13\x5b\x31\x3a\x0a\xdd\x75\xc9\x51\x15\x15\x42\xcc\xa8\xa8\x2a\x60\x47\x8f\xa6\xa3\x94\xba\xd0\x2b\x82\x95\xd6\xe4\x8e\xae\xc7\x13\xda\xab\xe2\x01\xa1\xb4\x77\x47\x4f\x78\x23\x4d\xbd\x41\xae\x90\x67\x46\x3f\x01\x72\x30\xea\xa6\x74\x42\xc9\xef\xb2\x28\x40\xb6\x51\x0a\x53\x10\x9e\xb4\x25\x90\x4b\x4f\xe0\xe8\xf3\x67\xc3\x57\x2f\xc5\x19\xab\x44\xdd\xd2\x6c\xa2\xa6\xff\x62\x52\x50\xe1\x28\x4a\xe6\xae\xfd\xf4\xd2\xba\xa2\x6b\xd0\x9d\x59\xaa\x83\x5b\x0e\x05\x55\x51\x0a\xc3\x4b\x13\x6a\xf4\x62\xc8\xa3\x0c\x39\x6b\xea\x19\x5e\x15\x71\x8f\x31\xc9\x68\xd1\x07\x99\xb7\xa7\xba\xe3\x52\xd2\xf2\x92\xd5\xda\x4f\x89\x0a\x06\xe9\x27\xa4\xa8\x0c\x13\xb3\xe7\x1c\xc2\xc6\xe6\x48\xcf\xd0\x1b\x19\x0d\x5c\x1d\x37\xcf\x41\xfc\x31\xa3\x14\x37\x81\x21\x15\x9a\x4b\xd3\x50\x59\xc3\xcd\x0f\xf9\x40\xde\x0a\xb6\x1a\x17\x95\x58\xf9\x16\xb0\x81\x09\x73\xec\x55\x80\x69\x67\x15\xe9\x9d\x94\x8c\x01\xd7\xd2\xbd\xec\xa5\x6d\xf5\x1b\xdf\xb0\xd6\x2f\xcd\x5a\xff\xeb\x36\xda\xca\xd4\x65\x93\x80\xe1\xcc\xe6\x24\x5d\x52\x23\x91\x21\x45\xbe\x27\xa1\xf6\x04\x59\xed\xc7\xec\x83\x6e\x51\x56\xe0\xa2\x5f\xc2\xd8\xc9\x20\xd4\x4b\xa6\xe8\xd4\x3e\x3b\x17\xf1\x27\x21\x9b\xf4\x3b\x77\xe0\x3e\x77\xe7\x0e\xdf\xa3\x31\x03\xbc\x13\x4c\xd7\x95\x6f\x54\x93\xac\xe7\x43\x8f\xe5\x24\x7c\x17\x94\x18\x13\xec\x08\x41\xb0\xc9\xf1\xa8\x9f\x24\xa8\x3c\x8f\x31\xa8\x99\x86\x29\x10\x4c\x74\x5f\x36\x72\x91\x5f\xce\x40\x0e\xe2\x88\xb7\x7d\xf2\x1a\xb2\xe4\x46\xcf\x8e\x78\xe5\x64\x7a\x75\x51\xe2\x57\x49\x94\xe2\xb0\x9c\x67\x00\x5a\xd2\xc4\xf0\x04\xdb\xa4\x17\x1c\x69\x21\x15\xa9\x8f\xeb\x32\x94\xae\xc7\x25\x94\x84\xf1\x5a\xd9\x2d\x9a\x00\x75\xaf\x25\xf2\xd1\xd4\xf0\xba\xa9\xa6\x63\x99\xb8\xf6\xd4\xee\xab\x4a\x89\xcd\x37\x9b\xbc\x82\x9c\x21\x64\x1d\xc8\x81\xba\x5b\x9d\xad\x6d\x52\x8e\x57\x9f\xb2\x55\x66\xf9\x6b\xb5\x1b\xc7\x19\xa6\xff\x80\x7b\xf9\xfd\xf2\x8a\x99\x13\xc7\x6e\x90\x57\x9d\x5c\x4f\x8d\x45\x7c\x9e\x8b\xff\x0f\xd0\x0e\x32\x2e\x4b\x68\x28\xf4\xcc\x89\x1a\xb9\xba\xa5\x7b\x59\xb3\x19\x6a\xd9\x25\xe6\x4c\xce\x6d\xf0\xb5\x64\x84\xad\x90\x8d\x79\xa4\x29\x47\xe7\x38\x8b\x4e\xe7\x31\x6a\x62\x35\xaf\xa6\xd7\x5e\xef\x20\x8e\x83\x87\x0a\xf2\xe8\x0d\xc7\xc0\xe2\x1e\x9e\x08\x29\x25\xd8\x74\xfb\x26\xf9\x5f\x6f\xef\x6e\x0e\x31\xdc\xa7\x26\x5f\x51\x82\x3e\x43\x40\x1b\xc3\x79\x69\x80\x8f\x2f\x41\xbc\x41\xf0\x0e\x3d\xcb\x59\x4c\x20\x2b\x40\x77\x46\x2b\x69\xfd\x95\x73\xac\xd4\x5d\x4f\x5c\xf0\x7f\x30\xed\xbb\x27\xdd\x1f\x46\xfc\x04\x5d\xef\xae\x6f\xbd\xe1\xa9\x89\x42\x55\x53\x77\xca\xae\xbb\x71\x8e\x92\x59\x5e\x08\xae\x29\x3b\x87\x58\x2d\x9d\x35\xa4\xe8\xcb\x8d\xc6\xc7\x1b\x83\x28\x5c\xef\x18\x7c\xa5\xa1\x3e\x18\xa0\xda\x25\x99\x9e\xb2\x9a\x70\x0a\x0d\x4e\xe5\x2c\x4a\x99\xc5\xc7\x1f\xe3\x94\x24\x02\xf6\xd3\x4e\x26\x0c\xcd\x71\x3b\x55\xbd\x2e\xde\x96\x07\xf3\x9c\xe2\xf3\xb0\xe0\xba\xcf\x01\x79\x3c\x74\x50\xd2\x34\xb1\xb6\x53\x0d\xa5\xc3\x12\x20\x79\x82\xa2\x99\xf2\x57\xda\x14\xe4\x96\x2b\xf2\x2b\xef\x09\xf9\xa2\x1a\x53\xce\x4f\x87\x18\xf5\x59\x80\x5a\x69\xcf\x1c\x09\xfb\xaa\xd9\x2f\x6e\xcf\x7f\xf0\x76\x51\x66\x7a\xdd\xad\x82\xe8\xb1\xd2\xe6\xf1\x32\x91\xcb\xd9\x3c\xe6\x7e\x57\x2d\x12\xfa\x5b\x4d\x3d\x4e\xa9\x2b\x09\x91\xe2\x4e\xd6\x97\xdd\x4a\xfc\x14\xfb\x55\xa9\x8d\x1d\x83\x8e\x3c\x34\x28\x6e\x90\x83\x4b\x2d\x6d\x85\xee\x0b\x15\xb4\x55\xf0\x68\xf8\x63\x68\x8b\xba\xb9\x2e\x6d\x5d\xfd\xca\x55\xa4\xaa\x34\x3f\x96\xf8\xa5\x05\x34\xeb\x6e\x5a\xa4\x2d\x76\x2f\x44\x6e\xc2\x4d\xba\x3a\xc1\xbc\xfa\xea\x62\x54\x2f\xcf\xd2\x8d\x49\x8c\x91\x2b\xc7\x62\x5f\xc1\x2f\x20\x24\x43\x38\xc0\xc8\xa2\x45\x2c\x3c\xac\x38\xc1\x62\xba\x66\x34\x6a\x6b\x1a\xd0\x96\x88\xdd\x2c\x28\xe0\x9b\xc8\x3f\x40\x28\x77\x2f\x7e\xf2\x4a\xe3\xe4\x27\xc5\xb8\x6f\x6e\xc0\x34\x16\x2e\x50\x16\x62\x84\x28\xa3\xa9\x6b\x6a\xe6\x80\x5b\xb0\x60\x44\x2c\x9f\xad\x16\xfa\xa5\xd7\xbf\xba\xb9\x5e\x77\x34\x61\xcf\x91\x61\xda\x9c\xe4\xaa\xb4\xd5\x84\x4b\x40\x1e\xe9\x4c\xce\xac\x16\x2b\xa3\xf8\x81\x04\x1b\xe8\x9b\x95\xd1\x24\x49\x23\xbb\x39\x38\x88\xbe\x79\x47\xae\x64\x2b\x36\xae\xab\xd1\x30\xd9\x7f\xc5\x56\x7e\xce\x28\xd7\x3f\x87\xfd\xf8\x1c\xd3\x29\x4d\xcf\xc2\xb6\x1a\xfe\x7e\x5b\x22\x1b\xd8\xf7\x6f\xf7\xd1\xbb\x4d\x16\x15\xbb\x98\xe7\xd7\xde\xf5\x95\xc2\x35\xa3\x8a\xee\x44\x2c\xf3\xb6\xdb\x97\x11\xc7\xbf\x2a\x27\xa4\x39\x7d\x91\x2c\x56\xe3\x79\xee\xac\xd4\xf1\xbd\xaf\xc0\xf0\x5c\x65\xcc\x7f\x38\xd3\x73\x51\x2d\x61\x7c\x9e\x5a\xe9\x86\xf9\xdd\x30\xbf\x90\xf9\xfd\x67\xf2\x30\xcd\xe8\xc2\x00\x57\xd2\xef\x8e\x93\xc5\xbe\x9f\xc8\x6e\x85\xa1\xd9\x46\x3b\x2b\x23\xb8\x56\x13\x76\xc0\x79\x0c\x45\x7b\xbc\xf5\x36\xee\x43\x36\x41\x57\x53\xa1\xc6\x7b\xd9\xff\x8d\xf5\xf5\xe5\x16\x7b\x9e\x89\x55\x67\xeb\xdb\xef\xea\xa3\x62\x57\x06\xb7\xb6\xf6\x5d\xf0\xf9\xdb\xca\x00\xd7\xd6\xd4\xa9\xb3\xfd\x1d\x59\x0a\xaa\x59\x53\x67\x1b\x63\x68\x2b\xee\xb7\x3b\xf7\xef\x91\xd9\xdf\xd6\x17\x35\xfb\xbb\x89\xa2\x70\x25\xdb\xbf\xea\x68\x6e\xaa\x15\xd7\x7b\x97\x63\xaf\xe6\x15\xa9\x65\x1b\xe7\xc0\x22\x31\xc0\xaf\xed\x14\x7c\x11\x0b\xc1\x97\xc9\x74\x50\x52\x1f\x3f\x7b\xf5\x4c\x96\xc2\x32\xe8\xb6\x50\xdb\x1c\x7b\x99\x15\x9d\xfa\x4e\xc1\xbf\xd1\x2e\x10\x2b\xc1\xc2\x3a\x81\xeb\x35\x76\x19\xe3\x13\x4f\xc2\x05\xf3\x7e\xfb\x39\x20\xb5\x89\x18\x59\xa0\xad\x3a\xc5\xe1\x91\x7e\x28\x8b\x16\xdd\xbb\x45\xdd\xa3\x79\x77\x5d\xeb\xc4\x7c\x3e\x4d\x0e\x24\x61\x52\xf3\x0b\xd8\xb3\x2d\xcd\x30\x89\xce\x14\x21\x66\x62\xe8\xe6\x02\xe8\x44\xa3\x79\x3e\x93\x5c\x4e\x64\x10\x28\xa0\xbc\xdc\x99\x9c\xa1\x18\xdf\x0b\x14\xa4\xb5\x52\x53\x2d\x17\x1e\xf2\x25\xa6\x68\x57\x42\x74\xdd\x86\x38\x7a\xb1\x7f\x74\xbc\xff\xe4\xfd\xeb\x97\x4f\x60\x03\x1f\x49\x6c\x23\x09\x6c\x90\xfe\x5e\xe6\xaf\x4c\xfa\xe3\x60\xf1\x9f\x49\x50\x9d\x90\x28\x34\xec\xe7\x9a\x24\x57\x85\x43\x37\x2f\x83\x69\x92\x6b\x96\xc3\xc5\xc5\x2b\x87\xec\x59\xb8\xed\x5a\xe6\xa5\x66\x41\x0b\x94\x96\x12\x25\x2c\x74\xbc\x28\xbc\xc7\xa8\x29\x29\xea\xf2\x2d\xac\x3c\x1d\xa5\xc3\x78\xba\xa3\xae\x2e\xc0\x27\x51\xbc\x8b\x78\xa2\xde\xff\xff\x5f\xef\xbf\xde\x3f\x78\xf1\x17\xe3\xdf\x41\x23\xcb\x5b\xae\xf9\xc3\x74\xee\x1b\xb9\xe5\xe4\xa2\x62\x50\xcb\x33\x51\x5c\x0e\xa2\xdd\x46\x5e\x86\x98\xef\xa2\x05\x42\xaf\x05\xf7\x73\x2b\xfa\x99\x05\x57\xb1\x46\x33\x81\x8e\x9d\xb7\x77\x04\xcb\xc5\x53\xd5\x9f\x8a\x18\x2b\x1a\x7f\x67\xb8\xd2\x89\x5a\xd1\x85\xb3\x9d\x4f\xf0\xb0\x69\xde\x6b\xd5\x2c\xbf\xf1\x31\x18\x0c\xe7\xf9\xd9\xcf\x7e\xf2\xbb\xf2\x57\xd0\xf2\x45\xa5\x08\xb2\x72\xf5\x70\xe3\x24\x86\x73\xbf\x2a\xb1\xf6\x3c\xde\x83\xc7\xee\xcc\x24\x14\xaf\xa6\xc9\x92\xa6\xe3\x6c\x96\x0e\xce\xe1\x08\x77\x73\xba\x12\xbb\x7e\xb5\xfb\xe2\x68\x77\xef\xf8\xe0\xf0\xc5\xfb\x37\xaf\x76\x5f\xbe\xdc\x7f\x85\x7b\xe9\xad\xbf\xbb\x5a\xe1\x08\xbc\x58\x8f\xee\x76\x7e\x8a\x33\xe8\x6c\x62\x37\x01\xf9\x34\xb1\x23\xf6\xaa\xec\xac\x2d\xd9\x9c\x6a\x63\x52\x1c\x59\x3d\x83\x36\x1d\x97\x70\x97\xc7\x97\xe0\x99\x3e\x54\x60\x40\x36\x53\x74\xdd\xe0\xfd\x74\xd1\x6e\x81\x93\x22\x1a\x40\x3b\x25\x92\x99\xb6\x26\x6e\x4f\xd9\x8a\x59\xb1\x9d\xf2\x60\xce\x51\x6c\xb9\x2c\x03\xb4\x76\x3c\x7b\x01\xd5\x49\x42\xe2\xc2\xdc\xaf\xef\x54\x90\x9b\x07\x6d\xc5\x19\xf6\xba\x29\x5b\x30\xb7\xb7\xf2\x05\xb5\x46\x9a\xae\x4b\xad\x33\x0f\x7c\x91\x6d\x45\x79\x2f\x9b\x60\xc0\x4c\xc7\x6c\x7f\x3f\xcf\x13\x4c\xd2\x3d\x14\x9b\x60\xb1\x4c\x2c\xed\x49\xbd\x02\x8b\xf0\xba\x0a\x4e\xae\xa5\x20\xa7\x3a\xa7\x25\x30\x35\x61\xba\xb9\xa6\xfd\x50\x37\x61\x5d\xdb\x90\x44\xb4\x2b\xbe\xc5\x08\xef\xa1\xcb\x8c\xf3\x77\x2d\x92\x4b\x2b\x6a\x05\x19\x8c\xfc\xe2\x21\xc9\x8f\x58\xaf\x90\xc6\x1f\xca\x11\x46\x31\x48\x22\xfe\x04\xae\x7c\x9c\x35\xeb\xb6\x83\xe7\x97\x11\xa4\x18\x55\xfa\x81\x59\x6c\x45\x27\xad\xa8\xd7\x8a\xc4\x9d\x2f\x14\x91\x10\x8b\x50\x2c\x08\x13\x96\x96\x42\x73\xcd\x73\x77\xa7\xd3\x98\x8f\xd4\x78\x8a\x49\x95\xc8\x2e\xd7\xa6\x42\x62\xb9\x10\x0e\x5d\x4e\xa9\x6d\xd2\x61\x98\x8b\x80\xab\xb1\xb3\x39\xac\x7a\xf7\x31\xc2\x6b\x3e\x73\x14\x20\x92\x7e\x84\x7b\xa2\x83\xab\xa6\xf9\x16\x9c\x66\xb0\x40\xfd\x65\xed\x35\x70\xd6\x78\x3e\x3a\x49\xa6\x17\x11\x47\xe2\x12\x65\xcc\x3c\xa7\x47\x44\x40\x9e\x06\xe9\x24\xe9\xce\xe1\x32\x48\x69\x65\xbc\xfc\xc7\x38\x42\x4a\x81\xb9\x67\x66\xa3\xd9\xbb\x0f\x73\xb6\xe5\x65\xc1\xeb\xdd\x6f\xbf\xb7\x75\xa3\x0d\x28\x77\x3f\x04\x81\x2f\xe7\xe3\xe0\x14\x75\xd3\x99\x9b\x68\xc0\x43\xf2\x95\x75\x6d\x6e\x4a\x99\xd3\xce\x35\x64\x62\xea\xa2\x52\x08\x13\xb9\x77\xff\xd3\x84\x88\x8b\xcf\x7f\x17\xa1\x7f\x34\x4c\x06\x36\x82\xb0\xd1\xb3\xe4\x21\x47\x7e\xf3\xcf\xf9\x3a\x25\x5f\x53\xb9\x77\x44\xf9\x07\x0b\xd5\x63\x22\x39\xa7\x91\x9a\xbf\xc3\x27\xfe\xa3\x1c\xc7\x82\xf4\x5c\x3f\x24\x51\x91\xa1\xb3\x0e\x69\x0a\x8d\xf9\x38\xf9\xec\x5a\xc2\x3a\x83\x1b\x71\x32\xd5\x0b\x2f\xe9\xff\xe0\x5b\x32\x8d\xa7\xbd\xb3\x73\x63\xef\xdf\xe4\x24\x2c\xe4\xaf\x4a\xe6\x23\x1b\x1b\x40\xa3\xea\x60\x61\x3a\x17\x6d\xcd\xfa\x3a\x4b\x76\xf6\xae\x60\x93\xf9\x98\x6f\x6b\x2a\x55\x8e\x1c\xd1\x2f\xb5\x9e\xc3\x48\xb9\x48\xa9\xfa\x4e\x4d\xf3\x86\x5c\xb2\x20\xd9\x21\x39\x97\x91\x2f\xcf\x80\x71\x37\x76\xe2\xfa\xc3\x14\x79\x81\xfc\xd9\x5f\xcb\x9d\x16\xb4\x25\x37\x7e\x0c\x82\x9f\xaa\x16\x59\x5f\x9a\xb3\x1f\x71\xcb\xd8\x53\x51\x28\x67\x05\x77\x92\x90\xe1\x28\x5b\x5c\xa1\x95\x19\xf9\x6b\x89\xbc\x3c\x63\x53\xaf\x21\x85\x56\xa1\x3c\x3c\x45\xdb\x39\x10\xe9\xd7\x8c\xe4\x0d\x8d\x84\x8d\xf3\x0c\x1f\x0c\x5e\x24\x48\xf4\xf1\xf4\x5c\xfd\x28\xb2\x89\xd5\x57\xba\x11\x05\x82\xd9\xa2\x94\x0f\xce\x98\x2b\xc1\x9e\xe1\x01\x35\x26\x55\xae\x71\x4d\x1b\x9f\xbb\xf2\x3f\x5e\x15\x14\x12\xd3\x01\xf9\xb1\xb1\x23\x81\x27\xc7\xe3\x5c\xc2\xe4\xd8\x97\x57\xf1\x2a\x93\x3e\xd4\xc8\x87\x43\x67\xc7\xf9\x59\xd0\x98\x78\xa9\x1d\x9c\x63\x5e\x68\x7d\x4a\x0a\x13\xc8\x52\x42\x4d\x05\x7b\x0b\x37\xd2\x89\xd5\x62\xb4\xab\xe6\x45\xcf\xde\xa2\x33\xb1\x27\xc3\x14\x8f\xd7\xc2\xdb\x45\xaf\x68\x98\x69\x48\xf5\x37\x26\xd5\xdf\x80\x54\x4d\x35\x93\x80\xe2\x37\x3f\xe7\x87\xdb\xb1\x2f\xec\xcb\xba\xb9\xde\xd8\x06\xda\xdb\xdf\xde\xb9\xbe\xd7\x76\x9e\x50\xc2\xf5\x9e\x62\x4c\x60\x0d\x27\x7f\x47\x10\x8c\x9a\xb2\x9c\x16\xaf\x4c\xc5\xd4\xc4\x94\x4f\xba\x5a\x30\x70\x05\x23\xda\x52\xb4\x45\x88\x1a\x02\x32\x16\x5e\x44\xac\x14\xb5\x0e\xb2\x5c\x44\xa2\x7a\x3d\x75\x2f\xcd\xb4\x93\x37\xd8\x29\xcb\xdc\x96\x9b\x69\x3b\x69\x4b\x08\xf8\xe2\xe5\x75\x5d\xb7\xae\x9a\xe5\x73\xf8\x34\x7a\xbd\x98\x65\x99\x97\x9d\xbe\x87\xe3\x66\x40\x65\xbd\x9b\x0b\x70\xcf\xdd\xde\xa4\x32\x62\x21\x13\xb7\xee\xe2\x0c\x19\x65\xb3\xe2\x42\xf9\xf9\xb3\xa7\x61\x72\xd5\x0e\xcb\xf4\x0a\x14\x6f\xdf\x93\x8f\x6b\xef\x2a\xc1\xc5\x29\x24\x31\x95\x79\x0b\x47\x7b\x8b\x5d\x25\xdd\xca\x06\x40\x6d\x87\x46\xe2\x2f\x34\x74\x1c\x09\xca\x06\x1f\x55\x28\xdd\xec\xb0\xc5\x7c\xa6\xa8\xcf\xdb\x71\x00\x5c\x42\xd1\xc7\x8d\xfe\x59\x76\x95\xc6\x7f\xe5\x17\xa6\x7f\x3a\x77\x24\xa3\x0e\x28\xdf\x2e\x46\xf3\xda\x1e\x41\x53\x10\x77\x71\xef\x7a\xea\x38\x92\x15\x1a\x25\xad\xa9\xa0\xe4\xfb\x9a\x93\x0f\xe4\x79\x3c\xfd\xe0\x9d\x72\x68\x55\x0c\xd4\xcd\x32\x81\xbe\x21\xb7\x34\x49\x1e\xba\x0b\x4e\x44\x1d\x65\xcd\xd8\x33\xce\x0d\xa2\xe9\xaa\x74\x87\xab\x59\x5a\xc1\xa1\x2c\xd3\x20\x18\x0a\x3f\xca\x7a\xbd\xf9\x34\x0f\xe4\x4f\xff\xbd\xc7\xa0\x58\x25\xfb\xf3\x66\xfb\x05\x44\x21\x8c\x08\x84\x16\x01\x94\xdb\x01\x95\x5c\xf4\xf2\x60\xfc\x6c\x5f\x95\xe7\x35\x6d\x08\x0b\x79\xcf\x38\xfd\x12\x0f\x53\x7a\x24\xb5\x19\xbc\xbd\x23\x9b\xaf\x82\x14\xdb\x9e\xfd\xa1\xe1\xbf\x0d\x4c\xce\x96\x43\x9b\x1d\x06\xf5\x11\xee\x06\x83\x73\x8d\x5e\x14\xa3\x5d\x37\x9f\x63\x79\xd2\x8e\x9a\xfa\x8e\x2b\xcf\xc1\xc0\x15\x28\x11\xd8\x2c\x9b\x6c\x70\x86\x6f\x66\x1c\x0c\x4a\x67\xa5\x05\xd3\xfc\x81\xb2\x7a\xbf\x64\xd3\x07\xe5\x24\xad\xc8\x31\x48\x6e\x45\xc9\xac\xd7\xde\xe1\xd7\xd4\x94\x9c\x30\x25\x75\x84\x6a\x01\x52\xce\x8a\x67\x3b\x73\xe4\x51\xc0\x09\x8d\x73\xfb\x1c\x5a\xff\x95\xc9\xbf\xda\x5e\xbf\x8c\xb8\xed\xf9\xa2\xae\xea\x50\xed\xaf\xf9\x7a\x67\x75\x17\x68\xe3\xf9\x6c\xa4\x6d\xe3\x02\xbd\xa3\x21\xe5\x91\x84\x79\x81\x1c\x8a\x57\xf6\x4c\x7e\xbe\xb2\x98\x62\x78\x69\x41\xa1\xfb\x0c\xbd\x90\x0f\x00\x80\x1c\xfc\x36\x52\xbd\xc0\x54\x48\xa9\xe3\x90\x5d\x3c\x45\xda\xaa\xf5\x16\x7f\xd5\x35\x31\x5c\x28\xdc\x5c\xd3\xfc\x67\xf9\x24\x1b\x57\xb9\xdc\xb2\x3b\xae\x37\x89\x2d\x3b\x54\xe1\x38\xd6\x0e\x82\xb8\x69\x78\x58\xb0\xa3\x87\xd3\xc6\xde\x8d\xcb\x5c\x46\xc9\x3e\x13\x58\x7f\x14\x4b\x52\x93\xb1\x09\x1a\xa4\x4b\x6c\x1e\x00\xc8\xb7\x19\x0d\x18\x30\x2e\x01\x25\x8d\xc7\xa4\x24\x66\xde\xd0\xef\xc2\x78\x97\x01\x58\x6c\x22\x87\x0b\xbf\x28\x3a\xcc\x01\xd9\xb4\x73\x99\x17\x2f\xd1\xeb\xbd\x92\x2c\x5f\x81\x92\xd7\x90\x36\x62\x42\x9e\xd4\xff\x70\x63\x36\x8c\xed\x59\x4e\xf3\x24\x31\x1f\x38\x0e\x03\x19\x3c\x18\x12\x71\x87\x8f\x54\xc7\x03\x97\x35\x6d\x17\xdf\x48\x56\x20\x14\x5a\xe9\xc2\x49\x66\xc4\xbf\xe2\xbc\x69\x7d\xe7\xe8\x64\xa3\x69\x37\x6b\x84\x40\x67\xa6\xcb\x72\x03\x2b\xab\xf1\x77\x99\xea\xce\x51\xb0\x95\x15\x5f\xdf\xdb\xab\x0c\xaa\xb1\xbe\x29\x79\xb3\x92\x17\x83\xfa\x47\xab\x32\xd3\x93\x52\xf4\xd7\x2f\xa3\xc6\xa4\xb3\xbc\xf8\xd9\x2a\x25\x79\x1a\x7f\x0e\x16\xd7\x99\xc2\xf7\x85\x27\xaf\x6b\xcf\x5f\x01\xe4\x6a\x93\x67\x36\xb4\xfb\x90\x17\x4e\x59\x11\x5d\x99\xaf\x6b\x3b\xf7\x15\x20\x07\x0c\xb0\xca\xe9\x6f\xf9\x98\x9c\xb7\x1d\x33\xef\x35\x5e\x78\x97\x44\xe4\x0f\x9c\x80\x02\x0b\xe0\xae\x4f\x50\x4e\x8d\x57\x9c\x82\x71\x54\x84\x22\x00\x80\xb9\xc3\x59\x07\xb7\x9f\xe4\x52\xb3\xb1\x04\x2b\x9d\x8f\x92\xd7\xf0\x02\x2c\xff\x6d\x2a\x08\x32\x44\x17\x49\x6b\x59\x89\x11\xd8\xa6\xc9\x00\x85\x4b\xb4\xb0\xec\x56\xee\xc9\x6e\x44\xbe\x12\xac\x8e\x37\xc9\xea\xf4\x1a\xc7\xe0\x50\xba\x65\x9f\xdc\x04\xf5\x05\x00\xf2\x5c\xb6\x6a\xe0\x09\x58\xb4\x9d\xac\xec\xb7\x23\x22\x8f\xea\xab\x0d\xc1\x74\x82\xdf\xad\xb5\xc0\xec\xa9\xe3\xff\xac\x90\xf0\x3b\x65\x1f\x5b\x86\xc7\x10\x06\xa5\x1c\xbd\x25\xc7\x40\x87\xfe\x77\xa9\x2d\x55\x7e\x09\x3b\x2a\xdf\xa4\xa5\xb3\xb5\x45\xb9\x27\xcb\xad\xab\x5c\x83\x16\xf8\xb6\xb5\x82\xc5\x15\x19\xa7\x74\xb6\xef\x3d\x68\x95\x18\xa0\x74\xb6\xef\x13\x5c\xd7\xd0\xa4\xb3\xbd\xfd\xc3\x95\xac\xaa\xb6\x6f\xac\xaa\xfe\x9d\x56\x55\x18\xf4\x6e\xb7\xdf\x87\xeb\x25\x1b\x56\xc9\xa4\xd2\x94\xf0\x32\xa8\x2f\x16\xde\x0f\x86\xe7\x46\x8f\x3d\xa1\x7c\xee\x34\x08\x80\x8b\x64\x27\x89\xf1\x72\x8a\x5d\x43\x57\xdf\x18\x23\x37\xae\xf1\xae\x67\x4b\x54\x74\x57\x49\x48\x7b\x4c\x4e\x5f\xe3\x7e\x8c\x36\x96\xd1\xc9\x1c\xc3\x37\xc2\x78\x39\xd0\x20\x77\xcf\x1f\x51\x91\x7b\x3b\x26\x0c\x6f\xb7\xc8\xfe\xe2\x8e\x39\x4b\xe0\x4e\x39\xc3\xd8\x14\x8d\x8f\x0c\x62\x46\x18\x60\xd8\xa7\x0f\xd1\x88\x48\xe2\x84\xf2\xb0\x0d\xe6\x43\xd2\x35\x61\x32\x35\x1b\xa8\x22\x3a\xcd\xb2\x3e\x82\x23\xeb\x4e\xc4\x71\x98\x52\x38\x09\xf2\xd7\x67\xbe\xd7\xcb\x28\x58\x7f\x85\xc9\xd9\x33\xe8\x28\xe9\xd3\x7d\x91\x1e\x11\x7d\x6b\xa8\xb0\xd4\x33\xf6\x5a\x96\xe6\x67\xcf\xba\x0b\xcf\xce\x5e\xc2\xd4\xf3\xcd\x4d\xba\xa1\xd7\xa2\xc0\xfc\xac\xa6\x81\x0f\xf9\xe8\xa8\x98\x6a\xa7\x00\xad\x50\xc9\x83\xa1\xe9\x6d\x4b\x5a\x9a\xcc\xb7\xe5\x49\x8b\xaa\x3a\xac\xeb\x6d\xf5\xf0\x77\xbd\x4f\x41\x7e\xa2\x4f\x57\xcf\x62\x34\x57\x3f\x61\xa7\x26\x7f\xa3\xee\x98\x52\x99\x30\xe5\xcc\x2c\x4e\x5a\xa7\x6a\xca\xf1\x64\x08\xe9\xa3\x53\xf8\x82\xb5\x82\xa5\xec\x2c\x27\x0f\x63\x02\x51\xc0\xa3\x80\x44\xc9\x89\xe9\x89\xdf\xc5\xe3\x93\x44\xfa\xa3\x64\xd6\x81\xb9\x16\xd3\x18\x67\xee\x3a\xc1\x6f\xaa\x41\x1b\x5f\xc9\xa2\xe3\x13\x90\xc4\x14\xc5\x7a\x73\x39\x91\x45\x4d\x83\x87\xe5\x25\xa3\x98\xb9\x4b\xd2\xae\xb0\xba\xd4\x94\x4d\x62\x7c\x19\x34\x3a\x4e\xf2\xd9\xeb\x59\x3a\x2c\xa3\x35\x53\x76\x9b\x2f\xf1\xe5\x27\xf9\x25\x8e\xf0\x02\x7f\xe8\x6c\x3d\xf8\xae\x22\x7e\x69\xc9\x7e\x84\x72\x6b\xdc\x5c\xbb\xfb\xe1\x64\xb7\xe7\xb8\x3b\x01\x9d\xad\xef\xb7\xcb\x53\x56\xb7\x8a\xa3\x86\x53\xff\xbb\x92\x78\xaa\x82\xcc\xf6\xd6\xbd\x4a\x4b\xeb\x8a\xe8\xaa\xb0\x39\x3b\xdb\x0f\xa9\x99\xec\x2b\x10\x11\xb6\x4b\x44\x84\x07\x37\x99\xea\xfe\x78\x69\xe0\xe8\x97\xbf\x3c\x39\x7c\xae\x21\xbe\xf7\xb2\xf1\x20\x3d\x55\x91\xe0\xb7\x7c\x98\xa2\xe2\x29\x9d\xa1\x67\x47\x87\x74\x19\x15\x47\xa2\x03\xc3\xdf\x43\x4e\x81\x61\xd7\xcf\x5f\x1f\x1d\xbf\x7f\x7d\xb4\xff\x7e\xf7\xf8\xf8\xd5\xc1\xcf\xaf\x8f\xf7\xa1\x8d\x53\xb1\x6d\x6f\x06\xc5\xaa\x02\xa3\x0c\x6f\xe1\xc7\x2f\x8d\x47\xb7\x49\x01\x37\x4c\x27\x2f\xe3\xd9\x59\xa7\xa4\x6b\x89\xeb\xf8\xa9\xa6\xec\xbc\xba\xac\x5f\x53\x54\x03\xb2\x5f\x03\x12\xd6\x70\x58\x5f\x7a\x38\x89\x7b\x20\x01\xd5\x54\xca\xc6\xb3\xa7\xf1\x28\x1d\x2e\xa9\x73\x44\xa6\x91\x95\x35\x6a\x06\x30\xa8\x81\x0c\xa4\xdb\x4f\x81\x60\x89\x59\xb0\x85\xd8\xb2\xaa\xaf\xc7\xe9\x2c\xaf\xae\x36\x8a\xa7\x1f\x92\xe9\xfe\xb8\x66\xb6\xb9\xca\xf3\x74\x69\x15\x60\xbc\xd3\x59\x75\xa5\x6c\x30\xc8\x93\xba\xf2\x65\x73\x2f\x7e\x64\x7b\xa8\x12\x5c\x3a\x30\xa9\xbc\xac\x56\x06\xdb\xb0\xae\x5c\x78\xd9\x2e\x05\xc3\x79\x85\x6f\x15\xd5\x95\xa7\x35\x45\x35\x0b\x3e\xad\x19\x72\x3e\xc1\x07\xe0\xe7\xf4\xb8\x50\x53\x6b\x96\x4d\xf6\xb2\x61\x56\x83\x00\x56\x59\x4a\xdc\xc0\x78\xb2\x0f\x35\x64\xcb\xe5\x4f\xe2\xfc\x8c\x9e\xb1\x97\x55\x84\xe3\x38\xe9\xe1\x5d\xbd\xbe\xda\x8a\x68\xbd\x49\xfb\x75\x6c\x06\xb5\xc4\xbb\xe3\xde\x59\xdd\x24\xcc\x96\x6f\x9b\x8f\xc9\x34\x27\xf5\x43\x65\x85\x34\x59\xfc\x9c\xd5\x2c\xe7\xa7\xfb\x35\x65\x5b\x35\x65\xd5\x45\xe7\x35\x20\xcf\x6b\x40\x96\xce\xe9\x9a\x98\x60\x03\x8f\xdf\x55\xa5\x19\x06\x2a\x2d\x61\xe9\x0d\xfc\x13\xdd\x37\xcf\x1a\x25\x2c\xb2\x81\xbf\x36\x64\xd7\x36\x8a\xec\xb1\x81\x3f\x36\x06\xf4\xab\x11\x72\x46\x2e\xcc\xe1\xef\x46\x25\x6b\x6b\x14\xbe\x35\x4a\x79\x5b\xc3\xfb\xdd\x28\x30\xb6\x06\xff\xbd\x01\x02\x5c\xa3\xc0\xd2\xb4\x70\x94\xfa\x85\xc2\xcc\xb4\x38\xc7\x9f\x8d\x1a\x3e\xd4\x28\xf9\xda\x28\x63\x45\x0d\xf7\x67\xa3\x86\xcd\x34\x4a\xbe\x36\xca\xd8\x42\xc3\xfd\xd9\x28\xb0\x84\x06\xfe\xbd\xd1\xc3\x1f\x8d\x12\x66\xc0\xc5\xfe\x32\x16\x36\x7a\x83\xbf\x6c\xf4\xf5\x53\xa3\x74\xa3\x6b\xb5\x21\x7f\x68\x94\x6e\x73\xad\x54\xd6\xa5\x6c\x72\xad\xb2\xc0\x9f\x8d\xe2\x06\x6f\xe0\x8f\x8d\x98\x7e\x35\x82\x7d\xd9\x90\xbf\x1a\x6b\x95\x49\x9e\xcb\x24\x1c\x93\x01\xc1\x15\xab\x3a\x5b\xdb\xdb\x24\x30\x3f\xbc\x11\x98\xbf\x82\xc0\x9c\x0c\x35\xf1\xff\xcb\xe1\xfc\x14\xe3\x49\x56\xc8\xc4\x54\x07\xd6\x0d\x15\x5e\xb3\xe0\x6a\xe9\x97\xa9\xee\x81\xa1\xc2\xba\xc6\xa7\x68\x67\x59\xd6\xc6\x29\x0d\x32\x0c\x4c\xe6\x33\xc6\xad\xe0\x19\x58\x52\x41\xdb\x1e\x9d\x8f\x61\xe8\xb3\xb4\x47\xc0\xfd\x66\x7e\x99\x91\xde\x4f\x93\xd9\x2e\x79\xc0\x97\xa6\x40\x08\x4b\x8d\x83\x61\x7e\x0c\xbb\x81\x90\x28\x6d\x57\x2c\xd7\x96\x1f\x92\xf3\xc3\xe0\x4a\x4f\x9f\xb4\x1c\xf6\x3a\xbe\x2c\xec\xff\x73\x0e\x54\xe0\x55\x73\x4b\x0c\xfa\x33\x71\x75\xa7\xd4\xce\x50\xdf\x5f\x89\xb6\x57\x2c\x4d\x28\x3f\xbb\xd6\xc7\xe3\x27\xa7\x69\xd4\xa3\x68\x72\x16\x03\xc9\xbf\x4a\x4e\x53\x7a\xc8\x83\xd9\xf5\x4e\xaa\x28\x3a\x99\x9f\x9c\x0c\x93\x7e\x87\x87\xd2\xfc\x57\x36\x3e\x12\x00\xf8\x80\x71\x61\x92\xb5\x00\x33\x9a\xc1\x1d\xbe\x58\x71\x8f\x0b\xb4\x3e\x55\xbf\x90\x9b\x84\xbe\xa7\xd0\x75\xe7\xad\xbe\x70\xb9\xa3\xc0\x31\xfd\x3c\x9c\x4f\x5b\x55\x85\x7b\xfc\x7c\xfd\x3c\x19\xcf\x2b\xeb\x3c\xcd\x7a\xf3\xbc\xb2\xf4\x6f\xc9\xf9\x93\x6c\x31\xae\x2c\x7f\x9e\xc1\xf6\x58\x5e\xe3\xf5\xa4\xb2\xdc\x50\xee\x1e\x19\x09\x53\xb5\x77\xde\x6b\x56\x1c\x10\x25\x1b\xa1\x16\x4a\x0e\x9e\x78\x65\xc3\x38\xf7\xb6\x8d\x2d\x19\x29\xce\x8e\xd7\xa9\x30\xcf\xbf\x24\x33\x32\xe2\xa2\x67\x17\x1b\x36\x2c\x06\xb6\x97\xfe\x73\x8e\x16\x59\x74\x2a\x8e\x67\xb1\xb1\x10\x72\x0c\x39\x72\xed\xce\x72\xd2\x44\xbd\x00\xd8\xc5\xc0\x84\x9d\x3c\x41\xd6\x3a\xce\x81\xb0\xc8\xaa\xac\x37\xcd\xf2\x9c\x12\x46\x51\x78\x41\x49\x4c\x91\x93\x31\x34\xe9\xdb\x17\x59\x04\xac\x6a\x0c\x7b\x16\x43\x7f\x69\x3f\x18\x5c\xcd\x72\x38\x6c\xae\x66\xe4\x1c\x66\xdd\xb4\xe0\x01\xe5\xa1\x1b\x06\x1c\x36\x32\x79\x17\x92\xad\xaa\x10\x09\xc5\x37\x2b\x01\x26\x60\xe6\xb4\x89\x2d\x6c\x1a\x90\x86\xc1\x8a\x64\x97\x06\xa5\x56\x46\x8c\x4c\x2a\xdf\x12\x6e\x85\x89\xc8\x2c\x01\xc4\x93\xf8\x24\x1d\xa6\x78\xc1\x67\xe0\x15\xf9\xce\x73\x16\x8e\xb0\x4a\xdb\xef\x55\xa9\x2c\x41\xc1\xcb\x2f\xdf\x17\xf3\x70\xce\x6e\xce\x3e\x89\x88\xf7\x22\x1d\xf7\xb3\x45\xdb\x1d\x99\x1b\xa1\x25\x77\x48\xa8\xa4\x6a\xd3\x33\x1a\xb2\x66\x96\x24\x1b\xbc\x00\x04\x3a\x0e\x55\xd8\xaf\x2d\xaf\xde\xa1\x5c\x4d\xc3\x9a\xfc\x5d\xeb\x0e\x70\xa3\x86\x20\xcd\x47\xaf\x56\x11\xa0\xf3\xb9\x74\x16\xfa\x50\x4e\xfa\xdb\xbc\x6c\x12\xa6\x14\xee\xe4\x71\x54\xac\x25\xfa\xde\x57\x58\xa1\x62\x2e\x38\x2e\x8b\xd0\x59\x87\x61\xb5\xbd\x8f\x4d\xc3\x28\x91\x5b\x69\x15\xfc\xdb\xe1\x1a\xfa\xf9\x04\x4f\x7b\x72\x99\x32\x3c\x05\x53\xd1\x85\xc5\xcf\xe0\x9b\x33\x52\xc7\x4a\xeb\x65\x36\x74\xb6\x10\xa5\x7b\x4e\x12\xb4\x39\xa2\x68\xd3\x29\x5a\x21\x4a\x4c\xd9\x70\xbb\x68\x70\x20\x8e\x20\x4d\xe7\x8b\xe7\x55\xf4\x93\x7f\xb0\x06\x7b\x07\xf7\x3b\xd9\x16\x3a\x82\x46\xd3\x01\x65\x0c\xbe\xf7\xc9\x76\xd3\x84\x43\x27\xa9\x89\x04\x3a\x8d\x51\x22\xaf\x62\x62\x51\x36\xcf\xad\x45\x5e\x7f\x1a\x9f\x52\xa0\xc4\x78\x4d\x7c\x7c\x75\x98\x4d\x8e\xf4\x49\xfa\xff\x5c\x46\x80\xb1\xc5\xb0\xbc\xcb\x07\xa1\x89\xc4\xbe\x4e\xe9\xd4\xfe\x7a\xfc\xfc\xd9\xc3\x96\x80\x60\x70\x03\x38\x7f\x25\xa0\x63\x86\x61\xe1\x61\x2b\x33\x2e\xb0\x54\xb0\xa0\x31\xe0\x33\xcf\x91\x9e\x28\xbf\x47\x83\xe2\x98\x12\xe5\x81\xe0\xa8\x21\x61\x16\x62\xb1\xc9\x69\xdf\xfa\x69\x3e\x41\x9c\xda\xc2\x45\x2c\x6f\x36\x71\x61\x02\xf6\xcf\x9c\xbc\xaa\x18\x1f\x14\x42\x49\xa5\x19\xf2\x11\x2f\x25\x85\xa6\x49\xc1\xb1\x69\xa8\x72\x9d\x34\x7c\xab\x04\xf8\xec\xd1\x63\x89\xc2\x4d\xed\xe8\x1e\x31\x1e\x63\xf0\xf0\xb2\x09\x5e\xfc\x63\x09\x33\xab\xba\xc2\x4c\xd3\x2b\x6e\x15\x3a\x31\x23\x09\x4f\xb7\xb0\xa2\x93\x83\x32\x0f\x25\x41\x9f\x4a\x1d\x7b\x6d\x65\x9e\x46\x2a\x92\x7d\xde\x2a\x9b\xea\x83\x27\xfa\xd9\xdb\x0e\x91\xf5\xd9\xf0\x3b\x6e\xa3\x19\x0c\xf4\x2e\xe7\x44\x63\xa7\xb4\x4e\x3c\xc5\x50\x4c\x8f\xfd\xae\x04\x5e\x28\x26\xb7\xe3\x1e\xb0\xa3\x39\xe6\xfb\x38\x5e\x64\x2f\x51\x58\x7b\x22\xe4\x04\x07\x88\x0f\x59\x71\x12\x0a\xf0\x0b\x43\x0e\xc1\xd1\x47\xe9\x0e\x20\xaf\x5d\x14\x4d\xaa\xab\x52\x9b\xee\x17\xda\x82\x9c\xd8\x30\xfd\x1d\xdd\xfb\xa9\x94\x0b\xc9\x7e\x53\xce\x75\x72\xb4\x10\xfa\x37\x67\xf0\xd1\x7c\x82\x37\x37\xbb\x33\xc8\xc2\xb1\x83\x45\x1b\xb2\xb5\x9a\xc8\x98\xba\x45\x01\xba\xbb\xce\xb5\x74\xdb\xf1\xaf\x1e\x5f\xfd\xf7\xe1\xe2\x84\x7e\x8c\xee\x65\xae\x9f\x0e\x06\xe8\xbf\x41\x36\xbc\xb2\xf7\x35\xf9\x55\x8a\x71\x63\x47\x2a\xd2\xe4\x7a\x67\x1a\x64\x48\x94\xc8\x4a\xd0\x7b\x4d\xd0\x7a\x2a\xfb\x3f\xec\x0b\x36\x4f\x32\xec\xe7\x94\xa5\x29\x81\xcd\x89\xf1\x8d\x11\x5f\x1a\xac\x69\x87\xce\x3a\x3d\x00\x1b\x4f\x90\x1f\x78\xc2\x92\xa9\xc3\xd1\x89\x99\xa5\x21\x04\x9b\xb0\xa5\x70\x3d\xd3\x8c\x2d\x96\x5c\x3b\xce\xdf\x7e\x38\x39\xe5\xe0\x78\x8f\x1b\x9f\x5e\x78\x52\x28\xd9\x1d\x4e\x39\x1d\x41\xd4\xf5\x6f\x0d\xdd\x20\x3c\x1c\x0a\x4c\xd4\x05\xd1\xa9\x03\x87\xe9\x16\xe5\xbd\x21\xc9\x74\x5e\x5e\x20\xbe\xf4\x92\x38\xb2\x04\x1d\x02\x03\x82\x2c\xfc\x7f\x90\x2d\xbb\xfe\xf7\x10\x99\x92\xe3\x28\x7a\xe1\x2f\x2e\xcd\x87\x36\xd3\x63\xea\xce\x05\xdd\xb0\x75\xf3\x88\x20\x6b\xb6\x84\xd0\xaf\xb6\x42\x1a\xfc\x97\x33\xed\x7f\x9d\x9f\xb4\x81\xee\xa6\xb1\x2c\x46\x4e\xae\x4d\x1c\x0c\xcf\xfd\xec\x58\x66\x96\x88\xfe\x85\xeb\x00\x8d\xb0\xfc\x6b\x29\xa7\x59\xe7\xc5\x07\x0e\xb2\x48\xd1\x6b\xb4\xe9\x42\xf7\x73\xd9\x4e\x39\x99\x40\x22\xbb\x8a\x84\x52\xda\xba\xc8\xde\xe9\x78\x6a\x9b\x7b\x1a\xc6\xf8\x2e\xbd\x21\x75\xa4\x8a\x24\x0f\x28\xec\xc9\xa6\x8f\xf3\x7a\x18\xd7\xcc\x2f\x6e\x87\x1b\x88\x0c\xff\xf0\x19\xae\xe1\x7a\xaa\x15\x0e\xbf\x00\xcc\x4e\x55\x4d\xba\x0b\x85\xb3\xe8\xd6\x2e\xbf\x1d\x69\xa9\xcd\x22\x7a\x02\xec\xe5\xc3\x4e\xed\xf4\xe0\x0d\xd4\xce\x4e\xf9\x65\xad\x1a\x49\xbf\xbc\x1e\x2d\x41\xc6\x2e\xed\x13\x92\x21\xe8\xe4\x26\xdb\x7a\xda\x02\xec\x16\xe6\x4a\x46\x2a\x15\x89\x1d\x92\x0a\x41\x92\x58\x20\x12\x49\x69\x84\xd1\x02\x7b\xb9\x09\x78\xcb\x3b\xc9\xe5\xe9\xf5\x64\x62\xae\xc2\x76\x32\xdc\x9b\x26\xdb\x8b\x5f\x62\x5e\x9d\xcb\x7b\x67\x79\xc7\xaf\x27\xe5\xdd\x7a\x1e\x5e\xd6\x27\x7d\x99\x2c\xea\xce\xf2\xde\xd9\x14\x13\x33\xa0\xa0\x77\xb0\xcf\xb3\x3d\xce\xc6\x1b\x6c\xee\x05\x8c\x53\xa7\xdd\x13\x9d\x52\x9b\x99\xa1\xa9\x9e\xb9\x3c\xd1\x00\x6b\x96\x52\x26\x46\x49\x3a\x01\xdb\x10\x96\x71\xdd\x49\x35\x87\x67\xc1\x20\xfb\x64\xec\xbb\x72\x3e\x2b\x2d\x78\x06\xdd\xa2\x14\x30\xe4\x64\x68\x3b\x46\x97\x96\x79\x6e\x61\xf1\x89\x42\xae\x43\x98\x3e\x19\x50\x9d\x9e\xb7\x89\x53\xdb\x36\xc6\x3f\x99\xea\x42\xb5\x3e\x4e\x1e\x05\x67\x22\x47\x66\x0b\x0d\xca\xe6\x13\xe3\xa3\xcc\x7d\x03\x00\xd3\x44\x0e\x40\x39\x44\x69\xbd\x80\x9e\xce\xb2\x21\xf9\x87\x71\x1d\x0f\x5a\x8b\xa7\x01\x38\xf1\x2c\x85\x83\xd8\x40\x62\x26\x4c\x4e\x0f\x38\xe3\x9c\xdf\x42\x24\xef\x84\xd1\x80\x39\xae\xa7\xc8\x40\xb5\x52\x4f\x45\xa2\xe9\x59\x5a\xc9\x25\xb4\xd5\xa9\x49\xb9\x4a\x95\x4a\x3c\x3c\xdc\x8d\x3e\x3c\xd0\xa7\x76\xb6\xb6\x29\xc1\x6f\x41\x65\xda\xd9\x7a\xb0\xdd\xaa\x50\x89\x76\xb6\x7e\xa0\xb2\x40\xef\xd9\xd9\xde\x26\xbb\x98\x82\x66\xb3\xb3\xfd\x90\x6d\x5f\x8b\xaa\xcb\xce\xf6\x77\x64\xa4\xc3\x8a\xca\xce\xf6\xf7\x64\xee\xe2\xe9\x23\xe1\xe3\x0f\xa4\xb5\xff\xf6\x46\x6b\xff\x35\xb4\xf6\x98\x92\x89\x2d\x9a\x01\xc9\x03\x18\xe8\x27\xaa\x87\xd7\x0d\xda\x9f\xe5\x11\x06\x65\xde\xf1\x39\x50\x39\xfe\x54\x81\xa0\xf8\x05\xf7\x08\x4c\x70\xf6\x26\x81\x5b\xdd\x38\x21\xfb\x56\x18\x51\x1f\xe5\x67\x8a\x1d\x92\xdb\xc0\x27\x34\x3b\x08\xec\xe0\x09\xbb\x29\x3b\x17\xe0\x98\x24\xde\x34\x4f\x45\x51\xa7\xdb\x1a\x6a\x61\xd6\x1c\xb1\x49\xcc\xcf\x41\x66\x1c\x91\xee\x0e\xe1\xa0\x28\xc9\x99\x0a\x24\xb3\x39\x09\xe4\xf3\x99\x68\x05\xc8\xbd\x3a\xd6\x24\xea\x06\xbd\xbf\xbc\xc6\xfe\x91\x4d\x0c\xd8\xaa\x96\xf3\xea\x68\xb2\x1b\x4a\xb0\x4e\x41\x74\xf3\x11\xa5\x87\x8c\xf2\x5e\x3c\x4c\xac\x80\xfd\x97\x67\x87\x3f\xef\x3e\x7b\xff\xfc\xf0\xf5\x8b\xe3\xf7\x2f\x0f\x0f\xe0\x7f\x9f\xef\xfe\x1d\x36\xe7\xf3\x78\x76\xd6\x9e\x64\x8b\xe6\x56\x2b\x7a\xb8\xad\xea\xf6\xb2\x89\x17\x2d\xba\xe8\x84\xbc\xa2\xea\xb0\x4c\x04\xbe\x97\xa4\xc3\x26\xfd\xc5\xb3\x0c\x95\xee\x54\x60\xe4\xc4\xe1\x2a\xe1\x23\x45\xa4\x98\x95\xd0\x8e\xfc\xee\xc6\x36\xfd\xdf\xb5\x4d\xe9\x9a\xf9\x47\x3e\xae\x11\xd4\x12\x5b\xcf\xb0\xf4\x7a\x4f\x72\xe6\x08\xd9\x1b\xa6\x93\x93\x0c\xc4\x9f\xba\xf7\x35\xbf\xd2\xd5\x9e\xe6\xbc\x16\x74\x15\xa9\x6b\x66\x2b\x14\xda\xc2\xd9\xbd\x14\x61\xaf\x4e\x01\x02\x09\x9a\x75\xcd\x6d\x85\x42\xdb\x27\x20\x83\xd7\x35\x35\xe5\x85\x96\xc7\xd9\xbc\x77\x56\xd7\xd4\x56\x28\xb4\x7d\x7d\x50\xd7\x50\x4a\x0b\xad\xde\x9c\x25\xc9\xb0\xae\xa1\xad\xe0\x3e\x9e\x32\x75\x9e\xc5\xd3\x3d\xdc\xd7\xe1\xe3\xa9\x57\x6a\x9a\xad\x1a\x9e\x75\xd9\x5b\xe9\x4a\xe1\x5b\xbf\xc4\x0b\xe9\x09\xde\xf6\xae\xfe\x3e\x4a\x97\x45\xba\x0b\xd5\xbe\x8e\x62\x35\xf3\x36\xca\xb5\xad\x08\xc9\x66\xea\x29\x26\xa3\xbd\x32\x1e\x7b\xdc\x7e\x29\x22\x54\xaf\x1e\x13\xe7\x9a\x76\x0d\x7c\x5c\x28\xcb\xb1\xb2\xb5\x97\xe0\x36\x39\xbf\x16\x52\xd8\x7c\x05\x6c\x26\xe7\xf5\x68\xcc\xaf\xf3\xa4\xbe\x87\xad\x97\x23\x31\x9f\xd5\xe2\xd0\xcf\xe6\x00\x77\xef\x9a\x64\xf3\xc4\x85\xb2\x14\x27\xa7\x76\x3d\x6e\xc0\xfb\xae\x83\x14\x35\x5f\x8e\x0d\x54\x5b\x8a\x06\x59\xac\x5d\x0b\x13\x82\xb0\x12\x32\x50\x73\x05\x7c\xe0\x46\x7e\x6d\x8c\x08\xc6\x8a\x38\x41\xdd\xe5\x58\x7d\x4a\xaf\x43\xd1\x4f\x0c\x88\xd5\x70\x82\xaa\x4b\x51\x7a\x96\xc4\x1f\x93\x6b\xe2\x24\x30\x56\x42\x8a\xea\x2e\xc5\xea\xf0\xe3\xb5\x57\x8f\x41\xac\x84\x13\x56\x5d\x8a\x92\x58\x56\x5e\x0b\x27\x81\xb1\x12\x52\x54\x77\x09\x56\xf8\xba\x7d\x0d\x84\xb0\xf9\x0a\xb8\x64\x93\x5a\x34\x48\x13\x7e\x0d\x3c\x58\x4d\xbe\x1c\x11\xaa\x57\x8b\x09\xe9\xe9\xaf\x81\xc9\x01\xb7\x5f\x8a\x09\xd5\xab\xc5\xe4\x83\x28\xc5\xae\x8e\x8b\xaa\xd5\x96\x63\x23\x35\x97\xe1\xf3\x12\x6e\x94\xd7\x59\xa6\xbf\x19\x10\xab\x60\x44\x55\x97\xa1\xf4\xfa\x3a\xe4\xcb\x2a\xc5\x95\x90\x79\x5d\x4f\xc0\xc3\x2c\xbe\xce\xe1\xf5\x8c\x9a\x2f\xc5\x03\xab\xd5\xa2\x41\x89\xf4\xaf\x81\xc7\x3e\xb7\x5f\x8a\x08\xd5\xab\xc5\x64\x73\x33\x7a\x91\xa1\x0b\xe6\x1b\xb8\xa1\x67\x9c\x2b\x93\x62\x35\xd8\x37\x4a\xcc\x5e\x8b\x97\x36\x64\x9d\xfa\xf0\x67\xf3\x1c\x71\xca\x5b\x31\xd8\xc8\xc6\x7c\xbd\xc3\x13\x72\x53\x7e\xd0\x29\xa0\x49\x89\x30\x44\x57\x97\x8a\xe9\xb3\x73\xf1\xa6\x97\x4b\xf3\x2a\x71\x8d\xb9\xb1\x6f\x2c\xcb\xe7\xc7\xd4\xad\x9d\x23\xc2\xea\x79\x76\xad\xb3\xf3\xb9\x85\xb1\x1a\x56\x58\x77\x39\x56\x87\xd7\x62\x82\xcf\x0d\x88\xd5\x70\x3a\x5c\xc2\x0a\x0d\x99\x5c\x1b\xa7\xd5\x0e\x74\x53\x77\x39\x56\xd7\xe2\x3f\xfa\x7a\xb6\x22\x46\x4b\x78\xd0\x24\xce\x67\xd7\x21\xa5\x97\xdc\x7e\x29\x2e\x54\xaf\x16\x13\xca\x79\x70\x0d\x4c\x5e\x71\xfb\xa5\x98\x50\xbd\x5a\x4c\xf2\xde\x34\x43\xcf\xc7\xab\x1b\x55\x0b\x80\xa5\xb8\x70\xc5\x7a\x64\xe6\x27\xa3\x6b\x09\xef\x47\x02\x60\x39\x32\x54\xb1\x16\x99\x19\x6a\xae\xf6\x30\x66\xec\x75\xa6\xe7\xd8\x85\xb2\x14\x2d\xa7\xf6\x72\xdc\xae\x77\x1d\x3c\x36\x20\x56\xc3\x6a\xd9\x85\x90\x50\xba\x26\xaf\x3e\xb6\x30\x56\x43\x6a\x29\xaf\x26\xac\xae\x7b\xab\x38\x76\x80\xac\x86\xd7\xf2\x7b\xc5\x02\xb5\x94\xd7\xc0\xe9\x0d\xb7\x5f\x8a\x0e\xd5\xab\xc4\xc4\x98\xf1\xab\x7a\x91\xcd\x83\x8e\x33\xb5\xd5\xf3\x5c\xbc\xd5\x9e\x24\x92\x7f\x8e\x2d\xe2\x89\x78\x3a\xa0\x69\x04\x2b\x60\x0a\x55\x48\x2b\xa8\x75\x5c\x8d\x9a\x5b\xc7\xf7\x89\xa0\x9a\xa8\xe6\x2a\x81\x06\xdf\xb5\x0a\x9e\xa3\x65\x55\xe6\x33\xa9\xe1\x69\x86\x9c\x1a\x8e\xde\x49\x6b\x92\xba\xa6\x08\x0b\x2f\xa7\x4e\x15\xda\x37\x25\x55\xe0\xbb\x57\x8b\x74\x1b\x25\xb5\xe0\xbb\x5b\x8f\xd4\x0d\x25\xf5\xe0\xbb\x53\x4d\x34\x00\x85\x6a\xf4\xdd\xa9\xc7\x67\x78\xb1\x1e\x7e\x77\xaa\x09\x41\x17\xaa\x19\x5b\x7d\xaa\x87\xd7\xd7\xb2\xe9\x60\x03\x6f\xa8\x22\x12\x71\xa1\x0a\x49\xda\x52\x47\x6e\x9f\x85\x3a\x03\x75\x6f\x81\x3a\x72\x2f\x2c\xd4\xa1\xfb\xa6\xd4\x31\xf7\xb5\xa0\xce\x07\xeb\x08\xc3\xb5\xe4\x12\x55\xa8\x45\xdf\x6d\xb5\xd7\x93\x92\x0e\xe9\xce\x24\x75\xf8\xda\x51\xac\x83\xb7\x19\xa9\xe2\x48\xbd\x5e\x95\x91\xeb\x7c\xa3\xf5\x98\xb7\x15\xeb\xe1\x77\xb7\xde\xe1\xbc\x40\x10\x2a\x75\x7a\xd5\x3e\x16\xe8\xcb\x48\x82\x6e\x3d\x1d\x67\x58\xcf\x8c\x53\x24\x9b\xc2\x38\x49\x62\x92\x3a\x22\x73\x14\xea\x90\x2c\x23\x75\x54\x18\x08\xeb\xb0\x94\xa1\x95\xe4\x90\x2e\x54\xa2\xef\x52\xc9\x3b\x37\x9d\x4a\xce\xa9\xec\xd6\xd4\x0d\x19\xd6\xb4\x1b\xd2\x39\x5b\x8a\xd5\x9c\xf9\x77\x99\x7d\xa1\x9e\xbb\x37\x84\x03\x17\x86\x41\x9c\x9d\x18\xab\x09\x80\x4f\xd6\xd5\xf8\x24\x5b\xcb\x65\xd7\x95\xc9\xd6\xd4\x79\x8b\xa0\xde\xb5\x5d\xff\x33\xcc\x6b\x45\x5f\x4d\xc0\xd3\xc2\x7b\xee\x65\xac\x71\x8f\xf0\xc9\x38\xe6\x60\xcf\x7d\x0e\x5f\x13\x98\x21\xb7\xa2\xe4\x53\x2f\x99\x60\x18\x69\x5c\x86\xdc\x33\xef\xa3\x9c\xbc\x68\x3a\xc0\xd0\xd8\xb3\x2a\xcd\xd9\xd4\x4d\x63\x8d\x89\x2b\x83\x89\xae\xdd\x4f\x29\xbb\x4b\x9f\x23\xcd\x8a\x31\x85\x04\x1c\x2f\xcb\x29\xad\xc6\xb5\xfc\x0c\xc8\x61\x7c\xd5\x59\x81\x9d\x00\x9c\xca\x6a\x31\x70\x11\xed\x4e\x30\x6b\x1a\x8d\x41\x03\x47\x4b\x60\xbf\x0a\xd3\xdf\x7e\x36\x3a\x78\x42\xb6\x20\xf0\x1f\x93\x28\x38\xf3\x12\x3a\x70\x53\xb6\xb0\xa5\x18\xe1\xba\x60\x8e\x51\x05\x4d\x4e\x4b\x6e\xf6\x18\x92\x9c\x00\x7b\x4e\x3c\x34\x67\xbf\xd0\x6c\x3d\x2e\x3c\x9a\xb7\x03\xd0\x55\x00\x77\x2e\x99\x19\xda\x0b\x73\x6d\x22\x74\xba\xb8\xdc\xaa\x88\xc4\x89\x35\x50\x45\xd1\xa5\x75\xed\xb2\x7d\x76\x2c\x96\x71\x9a\x93\x80\xcc\x3b\xd1\x29\xaf\x47\x1a\x08\xb4\xab\xd1\x15\x77\x32\x28\xa7\xa7\x63\xca\x44\x53\xb6\xf6\x56\xdb\x31\x8a\xc7\x73\x93\xc6\xca\x6d\x9e\xb4\xd1\x49\x5d\xad\x01\xd8\x84\x05\x48\x2b\x69\x43\xbf\x88\x8c\x84\x60\x6a\xae\xb7\x28\x48\xde\x04\x43\x65\x4e\x53\x8d\x65\x1d\x46\xb3\x66\x0b\x62\x6f\x35\x1e\x8b\x9d\xa6\xb5\xfd\x65\x7b\xd3\x42\xb7\x3b\x5e\x71\xd8\xfd\x8e\x2b\xff\xad\xdd\x98\xbf\xff\x7f\xdc\xfc\x5d\x37\x76\x3f\x14\xa4\x97\xf1\x77\x07\x91\x77\x3b\x86\x22\x6f\xf5\x4b\x8e\x0a\xfc\x17\x78\x4d\xa9\x79\xb8\x6f\xac\xc3\xa9\xf3\xc4\xa9\xa7\xd6\x24\xbf\xdc\xb2\x94\x65\xb3\xda\x2a\x24\x29\xd5\xd6\x60\x41\xb1\xb6\x0a\x8b\x18\xb5\x55\x44\x78\x90\x3a\xa4\xfb\x44\x5f\x38\x1e\x6c\xee\x7e\x26\xea\x38\x9b\xcd\x26\x9d\xcd\xcd\xc5\x62\xd1\x5e\x6c\xb7\xb3\xe9\xe9\xe6\xf1\xab\xcd\xb3\xd9\x68\xf8\x70\x33\x45\xfb\xb3\x36\xfe\xfd\x27\xa6\xaa\x8d\x7b\xa6\x79\x38\x75\x05\xc7\xac\x4b\x19\x8b\x1b\x81\xd4\x45\x0f\xcd\xa8\x9f\x66\x9f\xac\x0f\x13\xde\xd9\xd0\x81\x39\x17\x26\x8a\xd2\x83\xb1\x76\x83\x32\x3c\x79\x32\x39\x41\xa7\xc9\x08\x24\x16\x6f\xb8\x64\x53\x3f\xc6\x5c\xa7\xc0\x4b\x7d\x50\x79\x3b\xa2\x2b\x07\xf2\xe3\xb3\x6c\x91\xa0\x3a\xf9\x24\x9b\x9d\xc1\xb1\x90\x8e\xd9\xc5\xc1\x5a\x81\x13\x30\x34\x21\x37\x85\xed\xe8\x70\x9c\x44\x0b\x4a\x5e\x90\x50\x4e\xb1\xe8\x38\x3e\x91\x63\x57\x8d\xaa\x9b\x68\xdb\x48\x69\xf0\x5d\x73\x71\x26\xde\xd0\xc0\xc6\x77\xac\x44\x06\x7b\xcf\x77\xac\x28\x10\xb5\x25\x6c\x42\xf0\x0e\x72\x64\x12\x3c\xa6\xd9\xfc\xf4\x8c\x77\x78\xed\xfc\x5f\xda\x7a\xba\x8e\x02\x3c\x43\xac\x4b\x51\x82\xeb\x8e\xb1\x92\x3f\x4b\x1d\x1a\xd6\x9c\xec\x72\xae\x0b\x74\x0d\x0e\x49\x71\xe0\x91\x22\xdd\xd5\x85\x0e\x31\xf1\x1d\x59\x55\xd2\x95\x81\x8b\x72\x9f\x0e\x1d\x6f\x0d\xce\x1a\xa4\x74\xe8\xc0\xc9\x7d\x9a\x70\x48\xa0\x0d\xa4\x33\xcb\x38\xfb\xdb\xd6\x1f\x4a\x08\x2b\x7b\x6d\xb8\x0a\x83\xda\x8a\x05\xbf\x92\x9a\x6a\x74\xf9\x58\x5e\xed\x70\x19\xab\xb5\x57\xbf\xe5\xd5\x56\x25\x69\x6b\x1c\x78\x29\x5a\x22\x75\xc9\xd2\x1a\x78\x39\x5b\xa1\xd2\x6c\xd9\x88\x8c\xae\x64\x69\x2d\x56\x95\x2c\xad\xb6\x7c\x12\xad\xa2\x64\x49\xb5\x6c\xc5\x89\x36\xa6\x94\x97\x9a\x67\xf7\x36\xbc\xbc\xe2\xd2\xf9\xb6\x77\xe1\xe5\xd5\xbc\xd1\xd7\x8f\xcd\xda\x7a\x5e\x6a\x70\xa2\x34\x58\xa9\x0b\xb1\x0a\xbd\x14\x7c\xbe\xa8\xaf\x04\xde\xda\x8e\x5e\xd2\x1b\x6c\x72\x5e\x3f\x95\x7b\xcb\x36\x35\x6b\x60\x56\x42\xd2\x37\x5c\x2e\x45\xf4\xe2\x72\xf7\xc0\x42\xae\x86\xb0\x7b\x73\xf3\x2b\xa8\x16\x3a\xd1\xeb\x31\x5f\xf7\xd4\xd7\x8c\x12\x43\x47\xdd\x3f\xc3\x05\xa5\x51\x16\x58\xc6\xdc\xba\x6c\xaf\x61\x77\x9a\x5c\xc1\x18\xb9\x7a\xf6\xb0\x5c\xa7\xe8\x1a\xef\x8b\xc8\x97\x90\xd7\x19\x23\xee\x72\x3f\xb0\x2d\xaf\xf7\x63\x27\xe4\xfc\xc8\x1a\x89\x2e\xca\xc5\x5a\x85\x1b\x44\x38\x85\x97\x88\x62\xec\xdf\x00\x03\x87\x2b\xc7\x8c\xbe\xb3\xf5\x60\xab\xd6\x13\xab\xca\x0a\xbe\xb3\xbd\xf5\x7d\xab\xdc\xf4\xbb\xb3\xbd\x7d\xaf\xc6\x51\xab\xcc\xca\x1d\xca\xb6\x5a\xd5\x26\xec\x50\xfc\xa0\x55\x61\xa2\x0e\x65\x0f\x5b\x15\x86\xe4\x50\xf6\x6d\xab\xcc\x56\x1c\x0a\xbe\x6b\x55\xd8\x82\x43\xd9\xf7\xad\x32\x6b\xef\xce\xf6\xb7\xf7\xca\x93\x29\xf8\x7e\x64\x4b\x52\x2b\x7c\x7f\xe3\x50\xf6\x15\x3c\x55\xca\xc9\x36\xf0\x29\x23\x37\xd3\xb4\xb7\x81\x1e\x99\x95\xae\x2c\x97\x8c\xc1\x26\x2b\xc7\x89\x52\x06\x98\xc2\xc0\xf6\x5c\x79\xd1\xec\x29\x96\x1b\xf1\x24\xcd\x37\x8d\x37\x97\x8f\xfd\x81\x01\x29\x1e\x5a\x5a\xfa\x24\x9e\xc5\xa1\x16\x31\xf0\xcf\x52\xde\xd7\xf0\x1a\x51\x7c\x27\x66\x9c\x3f\x99\xe3\x81\xf5\x2d\x5e\xbd\xc8\x1e\x38\x12\x3e\xc9\x2b\xb6\x7c\x91\x1f\x0a\x75\x0e\x02\x1d\x4f\xa0\xe2\xe0\xff\xcc\xf9\x1d\x33\xa2\xf0\x32\x70\x55\xd4\x4a\x4c\x4a\xaa\xfb\x29\x51\xb9\x4a\xbd\xe7\x14\x5b\x33\x92\xff\x70\xb0\xac\xc1\xb9\x66\x4f\x96\x93\x86\xdd\xf5\x97\x44\x01\xaa\xd2\x3b\x41\x23\xb8\x0b\x24\xe3\x7e\x1e\xfd\x2b\xe4\x24\x41\x74\xa0\x0a\xb2\x6b\x06\x27\x4e\x80\x7c\xab\xa8\x13\x0a\xa2\xbb\x58\x9e\x1f\x1e\x5e\xb5\xa0\x48\xd1\x1f\x80\x8a\xe7\x14\x4f\x9e\xf2\xce\x34\x2b\xf0\x6d\x55\x11\xde\x7a\xe9\x39\x55\x25\x6f\xc8\x59\x54\x72\x0e\x10\x23\xfc\xe1\x86\x11\x7e\x4d\x46\x28\xb9\x40\x31\x88\xda\x7f\x32\x2b\x7c\x72\xf8\x7c\x83\xe4\xb0\x8d\xed\x0d\xd6\xd5\x6d\xaa\xda\xad\x67\x87\x90\x88\x16\x4f\xf9\x64\x30\xb8\x90\x53\xf6\x89\x41\xa2\x76\xe0\x86\x3f\x95\x52\x03\x1e\x0f\x45\xb1\x38\xe0\x2d\x6b\x25\xca\xeb\xaf\xc4\xa8\xdc\x9e\x42\xdc\x11\xaf\x4a\x02\x58\x5b\xc2\xb2\x82\x76\xcb\x98\xd6\xf6\xbd\x1b\xa6\xf5\x15\x99\x96\xb9\x54\x5c\x8b\x5b\x5d\xd2\xe3\xb5\x84\x6f\xf9\x78\x5c\x86\x77\x19\x16\x65\x40\x94\xf1\x26\x0e\x4e\x8e\x36\x1a\x37\x3c\xaa\xb8\xf8\xd7\x10\x9f\xec\xca\x7e\x19\xd6\xe4\xc0\x2b\x17\xa4\x0c\xd2\xad\x92\x15\xaf\xe7\x45\x8e\xc6\x2f\x64\x42\xc1\x7d\x97\x38\xd1\xfd\x1b\x4e\xf4\x15\x39\xd1\x95\xb9\x90\x93\xe6\xd1\xe7\x3e\x6e\xfe\x47\xf5\xed\xe6\x14\x91\x7e\x3d\x3f\x7b\xa4\x78\x8a\x27\xa3\xc9\xec\xfc\xa9\x6e\x19\xaf\xbe\x57\xa4\xf5\x55\x99\x71\xac\xa1\x19\x4b\xdc\xda\xb9\xec\x8b\x4a\x6e\x86\xfb\x95\x72\x3e\x9c\xc9\x8e\x49\x8c\xce\x0c\xa6\x13\xa0\x2a\x1e\x30\x12\x19\x53\xd0\x47\xda\x48\xc4\x88\x48\xf7\x2e\x70\xab\x1d\xca\xb3\x9d\xd3\x12\xa3\xd9\x27\x32\x30\x8c\x4c\x95\x50\xec\x27\x0f\x44\xc7\x9f\xc1\x36\x46\x92\x63\x63\x95\xfc\x85\xe0\x43\xac\x8b\xf4\x78\x16\x47\x36\xaf\xcd\xed\x07\xb6\x6c\xc2\xc7\x4f\x67\x20\xe9\x28\x39\x9a\xc5\xa3\xc9\x92\x2b\x39\xf3\x46\x53\x1b\xc3\x88\x3e\x41\x73\x93\x71\xb6\x60\x2b\x10\xf6\x2b\x94\xcc\x60\x6c\x25\x82\x26\xbb\xda\x4f\x9a\x1f\x4f\xe7\xb9\xf9\xe4\x9e\x1a\x47\x81\x1d\x04\x45\xa0\xb2\x86\x4f\x94\x86\x9f\xd8\x35\xc7\xc7\x04\x96\x08\x6b\x81\x31\xa6\x39\x95\x24\x6c\xfe\x49\x36\x26\xed\x73\x44\x71\x29\x67\x26\x83\x3e\x37\xeb\x27\xc3\x84\xad\x59\xd4\x84\xc7\x09\x96\x9d\x6b\x28\x1c\x93\xc9\x9e\xa3\xdb\x20\x70\x5c\x9d\x09\x10\xbe\x78\x2d\x4d\x93\xfe\xbc\xc7\x61\xde\x06\x48\x91\x94\x78\x16\xb6\xf4\x69\x3c\x3d\x89\x4f\x89\x5f\x60\xe4\x1d\x09\x31\xc9\xf1\xbe\x38\xca\x8e\x40\xe6\xd8\x5d\xdd\x34\x7f\x89\x39\x57\x28\x0e\x77\x97\x4e\xc0\x04\x48\x6d\x94\x8e\x6d\x48\x60\x61\x3f\x8c\xbf\xcd\xb0\x2f\x06\x44\xc8\x2a\xc4\x5e\x0b\xd1\x93\x18\x62\x9c\xa4\xdc\x31\x18\x8b\x5e\x63\x40\x6f\x8a\x3b\x48\xb1\x79\x38\x86\xcf\x44\xfa\xee\xfb\xd0\xd3\xf1\xc7\xec\x43\x12\x75\xa5\xb8\x6b\x62\x86\x86\x8b\xd3\xa4\x24\xfe\xf3\x13\xca\xe2\x87\x19\xf0\x8d\x19\x1d\x21\x84\x66\x65\xb4\xaf\xa2\x6d\xb1\x5e\x88\x76\x5f\x1e\xc0\x1a\x72\x78\x20\x0e\x5c\x4a\xd9\xd4\xe5\xd0\xc5\x9d\x8d\x2f\xaf\x47\x06\xa4\x3a\x8e\x69\x5a\xff\x14\x96\x82\xc3\x12\x67\x4e\x67\xb4\xd4\xd8\x9b\xd9\xf6\x3b\xb0\x6b\xf2\x19\x5a\x6c\x39\x16\x71\x98\x49\x24\x1d\x58\xf4\x91\xe3\xc6\xc3\x3c\x33\x43\x20\xee\x5d\x15\x76\xf9\xbf\x55\x80\x29\x93\x50\xae\x28\x9d\xd0\xf4\x14\xec\x7d\xfc\x0f\x3b\x61\x3d\x19\xdb\xe3\x00\xbc\xa9\xe7\x8e\xe1\xb1\xdb\x27\x99\xab\x21\x0f\x76\xd9\x2f\x35\xe9\x39\x8f\x24\xa6\x10\x01\x1a\x7b\x54\xb4\x81\x43\x0f\x03\x64\x0a\x56\x8a\x11\x36\x46\xe6\x46\xe6\x2b\x06\x81\x3f\x5c\x8c\x35\xed\x49\x53\x9b\xae\x3b\x36\x43\x19\x2c\xcb\x58\x03\x28\x5a\xfb\x23\x13\x7c\x17\x10\x33\xf0\xde\x2a\x00\xc7\xb8\xc9\x54\xb4\x30\x71\x20\xb6\x2a\x8e\x5c\xeb\x94\xc5\xae\xe3\x50\xe9\xd5\x6d\x6d\x8b\xb0\x7b\xf6\x82\x90\x99\x0c\x79\xb2\xdf\xb4\x5d\x28\xbe\x25\xe1\xae\x59\xc7\x5a\x5b\xb5\x53\xa8\x52\x6a\x63\x88\x48\x51\xc4\xf7\xa0\xbd\x4e\x0c\xad\x6f\x9a\x3f\x29\x22\x5a\x79\xee\x1d\x4b\x68\x4b\x6f\x92\xae\x00\xe7\xa9\xe2\x77\xb1\x66\xda\x3b\xe6\x8f\x47\x70\x96\x4c\x56\x82\x00\xd3\xcd\x42\x4f\x33\xd0\x0c\xc0\xd2\xcc\x32\x7e\x3d\x24\x6b\x65\xdf\x82\xb2\x24\x46\x19\x6f\xa4\xe2\x18\x6c\x34\x4f\xf7\x01\x31\xdc\x4e\x96\xfe\x12\xe9\xde\xed\x2e\xb4\xf6\xac\x30\xe7\xf4\x29\x2f\x29\xae\xac\x1b\xe3\xf3\xe2\xda\x6b\x48\x96\xa3\x81\xe1\x69\xc9\xc4\x5c\x66\xd8\x01\xb4\x15\xad\x5c\x4b\x07\xce\x52\xd3\xcf\x24\x4c\x79\xcb\xe0\x0d\xfc\x72\x44\xe3\x0f\xdd\x18\xcd\xbe\x31\x47\x3c\x7a\x4d\xbb\x32\x50\xd7\xa7\xaa\x6e\xee\x06\x19\xe5\x49\x19\x66\xd9\xa4\x45\xd7\x8e\xf1\x29\x83\x83\x06\xa3\x08\xad\xb9\x7d\x79\x41\xac\x9c\xc8\x2f\x3b\xb7\x51\xfd\x30\x62\x68\x94\x61\xc5\xd8\xe6\xea\x17\xe9\x01\xa1\x71\xf4\x7c\x34\x8e\xeb\xf7\x51\x2a\x2b\xc2\xa5\x7a\x68\xab\x24\x42\x44\x15\x71\xbb\x02\xd0\x15\x66\x69\x8f\xef\x33\xe9\xc0\x39\x70\xcb\x84\xa4\x2a\x0c\x19\x8a\x31\xce\x15\x3b\xf0\x8b\x08\xbb\x33\x50\x05\x9e\x24\x4e\x51\x98\x2d\x26\xfc\x28\x43\x29\x0d\x13\x99\xda\x31\xbb\x83\xaa\x11\xd8\x89\x5d\xf8\xe3\xe9\x3a\x97\xab\x2e\x2e\xe3\x07\x8e\xf4\xd8\x85\x9b\x9d\x9c\x78\x5d\xb4\x57\xa3\xb5\x4e\xe9\x95\x1c\x16\x06\xee\x0a\x82\x55\x6e\x91\xb0\x2d\x2a\xf6\xcf\xea\xc7\xea\xaa\x07\x6b\xd9\xc9\x14\x98\xed\x96\x8b\x10\xb6\x56\xb9\xe8\x10\x94\x07\x22\x83\xcd\xa7\x70\x81\x77\xc0\x80\xe9\xba\xc3\xf4\x6f\x73\xf6\xda\xf1\xd7\x64\x38\x41\x51\xdb\x08\xf6\x27\x19\xdc\xb8\xa7\x13\x34\x8a\xe0\xdb\x1a\x59\x0e\xa2\x5c\x66\xc5\xdd\x50\x50\xb4\x6e\x18\xb4\x7c\x6e\xd1\x4f\x2a\xb0\x59\xf5\x2e\x2e\x52\x8d\xe2\x18\xf9\xaa\x2e\x1a\x7d\x68\x85\xd3\x4d\x9a\xc2\xf9\x84\xe6\x07\x67\xc5\x88\x4b\xe6\x94\x81\x02\xb9\x83\xb3\xdd\x63\x93\xaa\xdb\x53\x88\x38\x9d\x9c\x54\xce\xd1\x44\xdd\x05\xb5\x82\x6f\xd1\x63\xdb\x4b\x49\xb1\x4b\x49\x50\x95\x4a\x09\x3d\xae\xe7\xae\x88\x74\xff\xaf\x8b\x16\x0f\xc6\x16\xba\x03\xb6\x7d\x04\x73\xc4\x6d\xdc\x8f\xd4\x8f\xb3\x8b\x30\x17\xf7\x4b\xbe\xb8\x1d\x67\x3a\x95\x6e\xf9\xec\x6c\x9a\x24\xbb\xd3\x53\x4a\x2d\x43\x05\x53\xd4\x9d\x01\x9c\x4a\x28\xfe\xba\xad\x02\xae\x46\x7b\xe6\x6b\xce\x7c\xa5\x49\x67\xeb\x21\x99\x9e\xb8\x2a\x17\xf8\x46\x26\x27\xbe\xba\xa4\xb3\xcd\x5f\x03\x9d\x48\x67\xfb\x5b\xca\xe1\xb7\xbd\x75\xa3\x74\xfb\x8a\x4a\x37\x6b\x21\x74\x2d\xfd\xff\xca\xf1\x23\x4b\xf4\x5e\x01\x0a\x57\x52\x7e\x59\x18\xa1\x06\x0c\x8e\x1b\xf4\x78\x52\x9d\xd4\x8d\xf2\xbf\x64\xe9\xaf\xa1\xfd\x97\x3e\xbe\x8c\xea\x5f\x81\x95\xeb\xfd\x2d\xbe\xad\xb2\xf5\xae\xe7\x5d\xae\x81\x7e\xa8\xfa\x77\x4d\xd6\x88\x05\x6d\xdf\xb0\xa0\xaf\xc8\x82\x38\x6e\xfc\x7f\xb2\xc1\x04\xae\xec\xe6\x9b\x27\x1b\x45\x0e\x84\xeb\xbd\x7d\xff\xfe\xbd\x87\x08\x80\xfe\x19\x53\x0a\x72\x96\x4f\x7c\x23\x0a\x3b\xd4\x1b\xf3\x89\x25\xdc\xc9\x4e\xd5\x7f\x93\xe1\x84\xc5\x1a\x31\x2a\x59\xee\x25\xc6\x12\xb6\xc5\x52\x33\x89\x07\x37\x4c\xea\x2b\x32\x29\xcf\x5a\xfa\x2b\x89\x4a\x57\x0b\x97\xed\xb6\x02\xac\xcb\x1b\x40\x41\x58\x17\x46\x9c\x0e\x52\xca\xa8\x3e\xab\xe8\xc6\xab\x52\xc1\x4e\x8b\x13\x75\x25\x81\xce\x03\x13\x32\xcb\x0f\xc9\x79\xc7\x1d\x23\x07\x35\xec\x89\x0a\xce\x3c\x1c\xce\xa6\xc3\xbf\x61\x4d\xfd\x90\x9f\xa5\x83\x99\xf7\x25\x1e\xfa\xbf\x47\xc9\x2c\xf6\x3e\x4c\x93\x09\xdc\x47\xed\x6f\xec\xc5\x7d\x88\x04\x24\xbc\x49\xe9\x94\x4f\xa7\x3c\xb1\x3e\x4b\x4e\xe3\xde\xb9\x7b\xb5\xc6\x8c\x3a\xb4\x72\x55\x0f\x99\xd0\xaa\xab\x75\xba\xb8\xe9\x68\xbf\x24\x39\x86\x82\x00\xda\x8f\x23\x75\x68\x15\x46\x8d\xef\x5c\x26\xf9\x2e\xd7\xe6\xb8\x0f\xd9\x40\xe1\xe1\x37\x4e\xd6\xe8\x38\x9d\x62\x1f\xf0\x11\x5f\x19\xb5\x9e\x81\xec\x85\x0e\xe0\x9c\x3e\x29\xb1\x88\xc9\x10\x06\x41\xef\x5a\x92\x56\xf3\x3c\xc1\x2c\x53\xb8\x41\x11\x8f\x71\x36\x53\x58\xe6\x05\x4c\x82\x0b\x8c\xcf\xa3\x51\xfc\x9b\xcd\xe0\xdb\xe6\xdc\x92\xa6\x4b\xcc\x38\xa6\xc3\x6e\x07\x5a\x52\xbe\xd6\x63\x30\x04\x75\xad\x6d\x14\x7c\xb0\x0b\x6e\xae\x89\xfb\x46\xe1\x3e\x11\xdf\x33\xcf\xc0\x00\x6d\xd9\x4a\x48\x95\xaa\x85\x40\xe7\xc3\xcd\xd7\x93\xd5\x97\x62\x72\x76\x9e\x53\xde\xe1\x0f\x42\xee\xf8\x87\x5d\x81\x63\xbb\x52\xa3\x24\xa6\x60\x01\x92\x82\x85\x01\x71\xe8\x11\x93\xdc\x18\xd3\x78\xe5\x0d\x0b\x6b\x18\x9f\x67\x73\xb3\x04\x9c\xa4\x19\xd8\xa3\x68\x07\xf1\xfd\x16\x16\xbc\x0f\xac\x35\xcf\xe7\x23\x3e\xef\x63\x71\x1c\x86\xf1\xbc\x3e\xaa\x82\xa4\x3c\x12\x53\xa4\xcc\xa7\x40\x43\x39\x34\x86\xd5\x43\xf7\x1c\xca\xb0\x32\x8a\x27\x13\x84\x87\xba\x38\x00\x83\x13\xb1\x3f\xc7\x57\xab\x78\xcc\x48\xb6\x15\xd4\x93\x79\xc2\x41\x3c\xf0\x54\xe6\x9e\x31\x49\xad\x06\xf6\xa0\xc4\x64\xfe\x03\xea\x8c\xcf\x06\x7c\xd3\xaf\x25\x0c\x4c\x0e\xd5\xc0\x07\xff\x92\xb2\xf9\xa4\x48\x31\x5c\x4d\x16\xb8\x96\x4e\x68\x22\xeb\xa8\x84\x2a\x10\x8d\xd0\xb3\x6d\x1a\xb3\x66\x34\x49\xe9\x95\xdc\x12\x11\x6a\x4b\xed\xde\xe6\xc5\xa4\x35\x1e\x1b\x27\x5e\xdc\xae\x88\xb9\x2c\xbb\x0a\x54\x7f\xc4\x7e\xf8\xaa\xf3\x78\x23\xe4\x16\xa5\x8a\xff\x8e\x5b\xb8\x87\x72\xab\xe2\x9c\xae\x17\x72\x03\x9f\xfd\xba\xeb\x78\xad\x97\x98\x2b\xcc\xc0\xb7\xfb\xad\x4a\x51\x05\x4a\xb7\x48\x68\x7e\x78\x23\x34\x7f\x45\xa1\xd9\xda\x54\x7e\x1d\x89\x19\x5b\xfd\x92\x26\x0b\x5c\xc8\xe7\x09\x02\x0b\x0c\x02\x83\xc2\x82\x94\xfd\x85\x64\xe0\x60\xdc\x57\x12\x80\x2d\x8c\x50\xfa\xcd\x7b\xb0\xb6\xe3\xbf\x3b\x72\x2d\x7d\xf8\xd5\x91\x7c\x87\x29\xb4\xfb\x7b\xf8\xe1\xd7\x2f\x2b\x1b\x5f\x42\xf6\xe5\xa8\x12\x35\x67\xe6\x9b\xe4\xe4\x43\x8a\x7a\x3d\x0e\x7f\x01\xbb\x6b\xff\x87\xbb\x9e\xe4\xd2\x89\xa2\xfb\xd1\x56\xb4\xad\x1f\x15\xe4\x3d\xfa\xdc\xd4\x24\x9b\xeb\xe6\xd1\x50\x23\x59\x08\x83\xe6\x9f\xf6\xc5\xbd\x41\x50\xad\x77\x5e\xe1\x20\x73\x1b\x5c\x68\xaf\x07\xfb\x8f\x7e\x08\xd1\xc2\x8d\x0c\x42\x6f\xd2\x2f\xa2\x06\xff\x2f\xfc\x78\x3f\x7a\x80\xf8\x66\x63\x0a\xe1\x31\x9f\xac\xaf\x15\xfa\xe4\xe8\x1b\xd1\x4f\xf0\x7f\x1d\xf7\xd3\x03\xf8\x74\x1f\x3e\x59\x51\x84\x0b\x73\xf7\xbe\xe2\x69\xbb\x57\x30\x8e\xf4\x5a\xe0\x39\xaf\x6e\x8c\x4d\x91\x06\x30\xde\x95\x4d\x2a\xaf\xd3\x99\x4f\x7b\xfa\xf1\x27\x15\x0d\x32\xfd\x22\x11\xed\xdc\xa6\xeb\x3c\x4e\x6b\x74\x09\x53\x72\xfb\x25\xc5\xff\x02\xba\x9a\x9e\xdf\xb6\xb7\x22\x94\x6f\x26\xf1\x69\xf2\xf7\x25\xf8\x37\xa8\x52\x89\x7f\x25\x77\x4e\xa5\xc6\xab\x52\xac\x22\x78\x63\x44\x77\x43\x36\xd1\xd6\xbc\xf0\x14\xff\xe0\x19\x88\xa0\x06\x51\x84\xf3\xeb\x2a\xa8\xfc\x5a\x8b\xca\xaf\xa5\xa8\xfc\xba\x0c\x95\xe3\x6c\x72\x23\x30\x95\x9d\x28\xff\x1d\xd2\x92\xc5\xb7\x55\xc6\xd1\xeb\xe5\x24\x37\x10\xcc\x32\x21\x29\x3c\xd9\x3a\xdb\x0f\xee\xad\x20\x0f\xdd\xa4\x5e\xfd\x9a\xf2\x90\x8d\x9b\xf0\x6f\xd0\x20\x7e\x21\xd9\x26\x18\x43\xa5\x6c\x43\x31\x5a\x37\x92\x40\xaa\xb1\xad\x0b\x9e\x0a\x58\xe2\xda\xfd\x33\x73\x39\x0e\x3f\x4b\xb2\xec\xc2\xf7\xa5\xe2\xca\x0a\x22\xcf\x8a\x12\xcd\x0d\x2f\x0e\xa8\xf9\xbf\x83\x17\x5b\x7c\x5b\x65\x74\x58\xcf\x8b\xdd\x78\x4a\xab\x5e\x58\x2b\x78\xee\x4a\xc9\x75\x6f\x78\xee\x17\xe2\xb9\xb2\x38\x5f\xe1\x69\xf9\x8b\x38\x81\xb9\xe8\x5e\xe9\xde\x28\x00\x42\xf6\xfa\x11\xe4\x83\x2a\x21\xd6\x6a\xfe\xb0\x56\x85\x46\x0f\x8b\xf4\x32\x64\xee\x58\x33\x1d\xa6\x3f\x36\x4f\xbb\x88\xd0\xa5\x9e\x1a\xe9\x7f\xf3\x8d\xb2\x2b\x0e\x75\x42\xf7\x0a\xfe\x62\x7b\x47\xd5\xa7\xf1\x45\x8b\x25\x28\x4a\xc4\x3c\xcd\x47\x90\xab\x15\x90\xeb\x67\xbd\x48\xc1\xb6\xb3\xc5\x38\x99\x3e\xc9\x7a\x64\xec\xb6\x63\x14\xec\x87\x4f\x0e\x3b\x70\xe9\x3c\xc5\x40\xc7\xd9\x1c\xfd\xdd\xce\xa3\xae\x57\x97\xf4\xb8\x79\x06\xc7\x49\x3a\x4a\x72\x7b\xd9\x23\xb3\xd2\xfd\xef\xad\x32\x16\xba\x2b\x4c\x1d\x7c\x53\xa3\x78\x14\xd0\xf0\x7a\x85\x9f\x80\x3f\x03\xe4\x37\x34\xa2\x52\x1b\x6e\x69\xbe\x70\x6b\xac\x19\x6f\xb5\x59\x9c\x0e\x57\xba\xdb\x71\x55\xec\xf5\xff\x2e\xad\x6b\xed\xb1\x25\x1b\xe4\x3f\x3f\x60\x8c\x20\xda\x2a\x6c\xe9\xfa\x93\xca\x84\xe5\xab\xb6\x1f\xa8\x33\xbf\xbc\x89\x9d\xf5\x35\x4f\x27\x1b\x14\xed\x5a\x07\xd4\xf5\xc3\x2f\x04\x88\x5c\xe9\xe8\xb1\x30\x0a\xd6\x4d\xc9\x70\x16\x2f\xd3\xe7\x98\xf8\x59\x5c\xdb\xd5\xa6\x18\x7e\x86\x05\x46\x91\x82\xe1\x72\x25\xf2\x3f\x32\xa7\x2e\x65\x7b\x78\x42\x75\xba\xf4\xe2\xc6\x5a\x45\x79\x8b\x56\x07\xb8\x26\x53\x2c\x10\x02\x87\x25\xf9\x98\x98\x10\xc9\x0d\x07\x82\xd7\x3d\xdf\x63\xda\x4e\x31\xaa\xe1\x02\x8d\x16\x61\xb7\x4c\x53\xe4\x0f\xf2\xd7\xaa\x41\xfe\xba\xc2\x20\x7f\xad\x1b\x24\x3e\xdb\x2d\x1b\xe3\xaf\xf5\x63\x5c\x05\x07\x46\x01\xb5\xa2\x57\x41\xa0\xbe\xff\xaa\x29\xfe\x1f\xbd\xb0\xb1\x16\xf1\x67\x3e\x11\x72\x38\x2d\x67\x67\x78\x86\xdf\xa6\x5a\xcf\xf1\xa5\x28\xa2\xb8\xc8\xc8\xb5\xc8\x51\x7d\x1c\x4d\xe3\x05\xa7\x7b\x62\x50\xf8\x37\x9e\xfc\x63\x49\xdd\x38\xce\xf0\x70\x93\xe7\x74\x4e\x94\x42\xd2\xc7\x70\x11\x9f\xe7\xd1\xdd\xcd\x8d\xe8\xfe\xd6\xbd\x56\x44\x01\x8e\x87\xe7\x11\x6e\xb4\x8f\xf1\x30\xe1\xc4\x17\x93\xf4\x13\x1c\xe2\x6d\x86\xb4\x1b\x9d\x66\x59\x9f\x73\x1c\x7c\x4a\x47\x26\x7c\x3e\xec\x9f\xf7\x4f\xf6\x9f\x1d\xef\xbe\x7f\x76\xf0\x62\x3f\x6a\xde\x5f\xc7\x0e\x1e\xfe\x19\xcb\x3e\x8a\x0e\x27\xca\x71\x06\xb3\x29\x43\xfa\x7f\x1e\xdc\x13\xd0\x2d\x9a\x6c\x0b\xe1\x68\xef\xd5\xfe\xfe\x8b\xa8\xb9\xb5\x2e\x4f\xe7\xdf\x7f\xd7\x2e\x81\xd4\xd6\x89\x7b\x4e\xd6\x0d\xff\x37\xd9\x18\x5a\xb6\x57\x25\x0d\x58\x9e\xf5\xdf\x14\x02\xc5\x62\xdd\x2a\xe3\xba\xf5\x02\x82\x1b\x58\x77\x95\x28\x28\x2b\x05\x91\x6b\x9a\xa9\x6d\x4a\x34\xce\x1b\x31\xe1\xda\x62\x02\xc5\x2c\x8a\x69\x5a\x2b\x65\x00\x13\x2a\xd5\x3f\xf9\x6d\x04\x55\xe7\xbc\xef\x3a\x00\xbb\x4e\x88\xf9\x93\x21\x72\xf6\x93\xec\x93\x58\x00\xc1\x37\xb4\x09\x83\x7d\xbe\x98\xc6\x13\xb6\xd6\x4a\x80\xb9\x62\x08\x05\xda\xf3\x1c\x9b\xa1\x97\x4c\xe1\x7e\x31\xb6\x28\x70\x10\x8c\x51\x8c\x46\x65\x74\x47\x3a\x49\x80\x63\x51\x46\x03\xf1\xfc\xc4\xb1\x0b\x28\xe8\x85\xc3\x37\xf4\x11\x16\xc5\x1d\xc6\x7b\x14\x26\xae\xa1\x94\x46\x48\x4b\x29\x87\x93\x87\x93\x64\x71\xc6\xb3\x07\x0d\x94\x6b\x20\x6e\xe8\xb1\xca\xf0\xd6\xdb\xb0\x13\x32\xe0\x06\x53\x04\xc7\x0e\x87\xb3\x54\x06\x38\xb3\xe3\xa6\x25\x92\x79\x8e\x92\x31\xe0\xd7\xc3\xc3\x43\x0c\x6c\xdc\xa1\xf0\x18\xc9\x9b\x0e\x4f\x04\x34\x38\x22\x8b\xac\x60\x16\xc9\xbf\x2b\x9d\xe5\xc9\x70\xc0\x29\x75\xf2\xf9\x64\x02\x87\x03\x1c\x2a\x0e\xcd\x20\xac\x78\x3e\xcb\xf0\x24\xe8\x39\x8b\x86\x1c\xfd\x3c\x9b\x47\x1b\x7e\xf7\xbc\x10\x38\xf1\x2e\xea\xea\x46\x89\xc0\x02\x57\xcf\xb9\x99\x22\x5e\xbf\x21\xe0\xdd\x3f\x97\xf0\x1a\x50\xda\x8e\x7e\x85\x5e\x38\x71\x84\x0d\x44\xc2\x24\xc0\x51\x29\xc8\x88\x2b\xb1\xae\x9a\x64\xd4\xe6\x8f\x15\x91\x9d\x26\x48\x83\x23\xb8\xd1\xa6\x13\xa4\x11\xbc\x15\xb7\x18\xdd\x49\x86\x5b\x21\x45\xc8\xb4\x06\xb9\x39\x2e\x88\x8c\x72\x5c\x9c\x18\x1d\x84\x07\xe4\xa7\x3b\x93\x95\xcb\x61\xe5\x68\x29\xa7\x4c\x3f\x98\x1e\x26\x19\x25\x80\x5e\x4e\x76\x5f\xd1\xc6\x1a\xbb\x05\xe3\x9c\xc2\x57\xa1\x72\x6b\x14\x46\x04\xb1\xc8\x0c\x38\xd9\x4d\x8f\x26\xd3\xe4\x47\x63\x97\x5f\xf8\xb7\xd0\x3e\x9b\xe9\xf8\x37\xb2\x84\x43\xe3\x32\x6f\xbd\xd7\xab\x5b\x07\xff\xee\x9a\x3f\x56\x6e\xf2\xd9\xfc\x51\xd1\xe4\xee\x46\xf8\xef\x73\xe1\x0f\xfe\x57\xd5\xe9\xe7\xc2\x97\x8f\x15\x45\x55\x38\x7c\x2e\x47\xe5\xee\xe5\x20\x40\x73\xaa\x2d\x53\x7e\x1f\x3f\xeb\x28\xee\xae\x04\xe1\x73\x39\x0e\x1f\xfd\xa1\x2c\x81\xa0\xff\xee\x86\x70\x2e\x03\x81\x1a\x7f\xb6\x83\xd9\xe2\xb1\xd8\x69\x59\x0a\xe1\x73\x0d\x0e\x9f\x57\x87\x50\x5a\xbe\x1c\x02\x53\xc0\xc7\x52\x08\xb6\xec\xb3\x0e\xaf\x12\xd2\x5d\x42\xfb\xae\x8c\xfa\xae\xb7\x2c\x6e\xd9\x67\x87\xa7\x22\x30\x80\x09\x6c\x64\xd4\x04\xde\xf6\x9c\x19\x37\x54\xe1\xa1\x7d\x8e\xc2\xa5\xb2\x5f\xf4\x7f\xed\xe1\x82\xc0\x8a\x5b\xe4\xc7\xcf\x1b\x4c\x5a\x42\x60\x3f\x7e\x36\x1d\x29\xc9\xb9\x35\xb8\x4d\xe5\x20\x57\xc6\xeb\x3f\x1a\xc2\xca\x4b\x55\x4d\x36\xe9\x38\x45\xc6\x8e\xf7\x92\x92\x7f\xbd\x61\x96\x53\xc1\xea\xac\xac\xea\x1f\xb1\xb2\x47\x9b\xc2\xba\xf1\xc7\x6b\x4c\x74\x83\x01\x03\x3a\xf8\x6b\x23\x7a\xc9\xc2\xa1\x4a\x01\xe4\x66\x05\x67\x8b\x44\xb0\x82\x1b\xde\xf8\x34\xc9\x45\xf2\xd8\x64\xa9\x03\xc4\xac\x6c\xdc\x4b\x87\x29\xb1\xf6\x36\x23\xf9\x2a\xc9\x41\xf6\x22\x47\x79\xd3\x38\x21\x21\x64\xec\x5c\x4a\x32\x92\x48\xe6\x63\x4e\xb6\x84\xf1\xa7\x30\x75\x56\x9b\x51\x79\x92\xe0\xc9\xf8\x91\xdd\xed\xf9\xa9\x53\x4e\x61\x38\x45\xa6\x88\x89\x62\x09\x97\xb6\x96\x06\x51\xa1\x38\x52\xc3\xf9\x34\xdf\xa4\x9c\xab\x98\xf4\x91\x10\xe2\x96\xa7\xf3\x18\xa5\xcb\x24\x31\x06\xd9\x34\x86\x45\x3c\xed\xd3\x39\xab\x88\x49\x90\x2e\xba\xe0\x0a\x16\x2c\x2f\x03\x5e\x4f\x87\xf3\x1c\xa3\xb5\xc1\x01\xfe\xcf\x79\x42\x16\xe7\x1a\xe4\x0b\x46\x80\xe1\xa7\x46\x73\xce\x1f\x69\x52\x28\xe2\xbe\x8a\x5e\x1f\xa0\xb8\x05\x82\x83\x48\x6b\x31\x23\xe6\x4f\x1f\xdc\xd3\x3e\xc0\x04\x93\xed\x3f\x27\x0a\x5c\x64\x74\xab\xe3\xa6\x82\xc2\x81\x4a\x6a\x28\xc3\xd8\xbe\xbb\x26\xd9\xdd\x93\xb4\xff\x7a\xd2\x07\xa4\xbb\x26\x7d\xa3\x86\x07\x99\x62\x3e\x4d\x5a\x99\x71\xb2\x60\x14\x28\x19\xb1\xdc\xf3\x36\xa2\xe6\x53\x4e\x4d\x38\x17\xd2\x58\xef\xb0\x04\x81\x4d\xe0\xe6\x08\x12\xd6\x7c\x08\xa2\xf1\x00\xa7\x21\x31\xb2\x5d\xf7\x15\x4e\xd4\x1b\x42\xb6\xcb\x13\xc3\xc0\xf1\xee\x2e\x37\x0e\xae\x98\xab\xe9\x4d\x17\x03\x87\x39\x72\x9b\xa8\x04\xe2\x05\xca\x29\x30\x8f\xeb\xd5\x08\x3d\x23\x93\x79\x1c\x5b\x4f\xb2\xe7\xe5\x45\x71\x18\x97\x62\x4e\xb3\x60\xa4\x16\x47\xe0\x42\x07\x0d\xce\x19\xba\xfb\xf2\x40\xa8\x7f\x37\xe2\xab\x17\x93\x06\xba\x49\x00\x82\x5d\xbb\x3d\xbb\x2a\x5e\x53\x39\x2b\x9d\x72\x5a\x04\x74\xe0\x80\xc9\x97\x85\x17\xc4\x09\x15\x58\x15\xdc\xc0\x7e\xd3\xb8\x87\x42\x38\xbb\x2d\x04\x4d\x4d\x7d\x5f\x84\x8f\x38\xfe\x84\x2b\x9a\xcb\x55\x10\x2b\x22\x80\x61\x42\x0e\x24\x20\x45\x22\xe2\x83\x18\xe8\xbd\x1f\xc6\xa6\xd8\x85\x7d\x73\xfe\xc8\x9b\x05\x91\x0e\x7f\xbc\x70\x85\x61\xf9\xa8\xa2\xa3\x4c\x4b\xce\xa2\x62\xec\xe4\x49\xf5\x67\x07\x07\x2c\xe8\xb3\xd2\x40\x03\xaa\x38\x3d\x5e\x44\x47\x2c\x0b\xbb\xb2\xb7\x95\x7d\x89\x3f\x28\xa9\x13\x0c\xbe\x03\x84\xb7\x35\xb2\xe2\x4c\x3f\x49\xca\x57\x37\xad\x6b\x02\xf3\x3a\x9f\xf0\x35\xd3\xc8\xdb\x79\xe6\xfa\x5f\xc0\x94\xe3\x2b\x51\x9f\xfa\xd5\x00\x7d\x40\xde\x23\x31\x12\x8b\x9e\x64\x9c\x73\xee\x4e\x44\x61\xe1\xe4\x5a\x26\x57\x57\x18\xd3\x44\x57\x73\x14\xe3\x35\x80\x45\xf1\x0c\x5d\x6f\x6c\x97\xe6\xb6\xc7\xb7\x05\x06\x67\x67\x0b\x96\x8a\xf7\x37\x86\xda\xc1\xaa\x7d\xe8\x93\x6e\x1c\x18\x35\x63\x3e\x72\xef\x37\xd0\xdb\x08\x6f\xcf\xf3\x09\xf2\x60\x9c\x27\x49\x0c\x79\x8c\x0d\xe5\x5a\x0c\x5f\x07\xf3\x21\xde\xf2\xf0\xca\xd3\x4f\x7a\x78\x07\x83\xdd\x37\x02\x8e\x82\x9f\xa6\x36\xbe\x9d\xde\xc2\x47\x34\x81\x31\xc3\xba\xed\x46\x97\xb0\xf1\x63\xa6\x89\xc5\xd9\x59\x84\xaa\x40\x3e\x45\x22\xca\x35\xae\x0c\x1a\x9c\x14\x4b\x9b\xce\x4b\xe6\x2d\xaa\x27\xc2\xd1\x01\x74\x8b\xc9\x19\xfc\xa8\x32\x61\x29\x26\x05\x7e\x57\x19\x1d\x2d\xac\xdd\x1e\x26\xe3\xd3\xd9\x19\x34\xba\x57\x88\x46\xf3\x3e\xcd\x0f\xc6\x0e\x82\x6e\x48\x2b\x0e\x37\x14\xd6\xe8\x70\x85\x20\xcb\x69\x7c\x92\x53\x06\x4e\xf9\xa9\x5b\xa0\xb0\xf5\xec\xc6\xa3\x22\x5a\x14\xa7\x77\xbd\x41\xd9\x95\x28\x9f\x3f\x47\x5f\x5b\x44\x2f\x5c\x22\x41\xe6\xd6\xad\xd2\x11\x97\x04\x56\xda\xe7\x7c\xbc\xcc\xa9\x8c\x16\x0a\x95\xc1\x44\xbc\x79\x3c\x48\x66\xe7\x9a\x53\x83\xa4\x09\x22\x2c\xdc\x57\xd8\x62\x96\x4d\x22\x8a\xbb\xc9\xd0\xe4\x0e\xa9\xec\x93\xdc\xbb\x00\xce\x10\x75\x93\x51\x3c\xca\xe6\x78\xc6\xd3\x71\x6a\xf8\xe1\xa6\x73\x98\x62\x2b\xba\x64\x33\x34\x8a\x5e\xc9\xc9\x19\x05\x0f\x7a\xdd\xd1\xbc\xc8\x32\xff\x85\xa8\x3c\xb2\x73\x9f\x27\xa3\x13\xe0\x6c\x98\x74\xb5\x97\x4d\x68\xa7\xe0\x51\x19\xa4\x77\x3d\x14\x1d\x29\xd7\x39\xd2\x9a\x12\x1a\x13\x4d\x70\x4b\x1b\xfc\xf4\xf8\x02\x6e\xdb\xa7\x79\xbb\xdd\x8e\x34\x08\x4c\x1e\x26\x56\x16\x44\x9a\xd9\x84\x77\xf9\xba\x80\xaa\xfe\x87\xf1\x89\x72\x95\x74\xec\xf8\x53\x56\x87\x8d\x48\x1a\xb0\xd1\x9f\x0c\xed\x71\x9c\x29\x71\x6b\xe3\x0c\xbb\xdc\x77\xd7\x8b\xcf\x85\x37\x07\x87\x66\xb8\x4a\x8b\x87\xde\x8a\xe2\x56\x74\xd2\x8a\x7a\xad\x08\x3e\xc1\xcf\x81\x92\xd4\xd5\x73\x6f\xdd\x92\xc8\x5f\x1e\x0d\x36\xd7\x4d\x0a\x2e\xe7\x6b\x5b\x2f\x36\x30\xa1\x70\xfc\xef\xb1\x9f\x9d\x23\x37\xfb\x5a\x28\x3d\x2a\xa7\x7e\xfe\x65\xab\xb9\x01\x8e\x09\xf2\x03\x99\xb5\x93\x24\xe8\xf4\x64\x93\x25\x5b\x84\x2b\x30\xf5\xb2\x77\xa1\xe4\x7a\x4c\xea\x34\xfb\x71\xaa\x86\x13\x33\x60\xde\x1e\x5f\x2a\x61\x36\x36\x8a\x1c\xbd\x4c\xec\x49\x50\x60\x86\x9c\x13\x1b\x47\x57\xd1\x93\xf9\x29\x09\xbe\xa3\x8c\x42\xe2\x0e\x06\x28\x8f\xcd\x5a\x78\x50\x2d\x50\x7d\x09\x12\x1a\xed\x4f\x0b\xc9\x41\x8d\xc2\x0e\x23\xf9\x61\x5c\x33\x11\x98\xe0\xd3\x4c\x22\x0d\x43\x09\x07\x33\x63\x01\x0a\xf7\x83\x44\x8e\x63\x48\x7c\x15\xd9\xd8\x40\x66\x9d\xce\x1a\xf8\x8e\x4a\x3a\x39\x07\xa8\xc8\xf7\xe4\xa7\x3a\x84\xb3\x71\x98\xf5\x3e\x90\xf3\x21\xfa\x58\xe6\x16\x14\x2a\xf0\x58\x74\xcc\x39\xc5\x38\x29\x23\x93\x85\x3e\x64\xb9\x48\xfb\x73\xc3\x6b\x61\x96\x7e\x77\x38\x6c\xde\x33\x29\xa9\xa7\x64\x30\xc3\xa4\xcb\xcf\x05\x55\xe4\xbb\x53\xda\x91\x1b\xc4\xd0\x0c\xc2\xac\x9c\xb3\x8a\x62\xd8\x63\x1b\xfb\xf9\x3c\xd1\x9b\x61\x60\xb6\x19\xeb\x59\x73\xba\xa4\x0c\xd8\xe9\x32\x3f\xcb\x16\xcc\xd1\x60\xc9\xf0\xe5\x6f\x8a\x12\x7f\x86\x19\x6b\x49\x31\x49\x30\x7d\x80\x27\xe7\x56\x45\xcb\x52\x16\x8c\xbd\xdb\x76\x2a\xf9\x08\x9a\xc9\xd2\xba\xce\x3c\xf1\x00\x7b\xf4\xca\x84\xa3\xf0\xb1\xb7\x89\x47\x83\x33\x55\x30\x01\x09\x0e\x90\x35\xa3\xeb\xa7\x7d\x8c\x03\x48\x38\xb7\x90\x0a\xfb\x14\x17\x70\x11\xf3\xd3\x5d\x0e\x92\xe8\x58\xa2\x24\x1b\xed\xb3\x0f\x10\xb7\xaa\x37\x90\x4a\xb4\x15\xb5\xe2\xea\xac\x70\x8c\x5b\x00\x9e\xd7\xa4\x6c\x53\x3e\xfa\x3c\xca\x72\xd8\x21\xed\xac\x03\x4c\xa5\xec\x06\xcf\xab\x11\x77\x4a\x8a\x82\x20\x7a\x29\x54\xb5\x60\x77\xe0\xf7\xa3\x32\x80\x22\xb4\x40\xf9\xdd\xbb\x76\x9d\x10\x80\xc8\x08\xb4\x41\x0a\xcd\xde\xa6\xef\x76\x4a\x09\xf7\x0b\x30\x17\xe3\x42\x2b\xf0\x0e\x7f\x3e\xda\x7f\xf5\xcb\xfe\x93\xf7\xfb\xaf\x5e\x1d\xbe\x22\xf3\x0a\xc3\x5f\x90\xa6\x17\xd3\x54\x79\x8c\x36\xc7\x9b\xf5\x50\x57\x80\x8e\x26\x17\x20\xb0\x06\x87\xbb\x57\x71\x9c\xa0\x5b\x9f\xf7\xb8\xe0\x02\x36\xa4\x13\xe7\xb0\x11\x9f\xfb\x94\x4b\x8f\x30\xa3\x30\xd5\xee\xb1\xe4\x23\xb0\xb3\x42\xeb\x92\x9e\x7f\x72\x08\xbf\x58\x6c\x1f\x3d\xd7\x9d\x2c\x66\x91\x97\x2a\xb8\x6c\x33\x90\x65\x60\x15\x1a\x8f\xeb\x86\x51\xe0\x64\xc7\xa4\x09\x52\x84\xa6\x44\xc0\x4a\x7a\x29\x4f\x1c\xbd\x2c\x21\x2d\xed\x44\xde\x9c\x26\x3e\xa4\x69\x82\xaa\x10\xa4\x04\xf3\x40\x80\x01\x0f\x94\x43\x20\xe7\x33\x1c\x22\x67\x51\x65\x86\x11\x4b\x61\xad\x13\xb8\x14\x4d\x03\x70\x72\x29\xc3\x25\x9f\xe6\x33\x46\x40\xa3\x07\xe0\x01\x83\xc2\x11\x07\x69\x9d\x4f\x56\xe0\x93\xfe\xa1\x92\x46\x77\xa3\xfb\x97\x67\x98\x05\x36\x13\x48\xd4\xa4\xbb\x81\xcd\x46\xa1\x3b\x81\xcc\xbb\x55\xcc\x82\xf9\x1f\x2c\x57\xd7\x30\x21\x3c\x41\x30\x24\x20\x99\x5b\xcc\x32\x06\xc8\x13\xc4\xf1\x12\x50\x8d\x86\xef\xf7\xee\xb6\xca\xeb\x7b\xc1\x41\x63\x27\x0c\xac\x29\xd7\x77\x09\x12\x0f\x92\xf8\x94\x83\xe9\xf7\x59\xec\x35\x44\x20\xe5\xac\x66\xe0\xa7\x39\x7e\x2d\xd3\x7b\x2e\x69\x2e\xd6\xad\x80\xa9\xdc\xbc\x96\xa5\x5e\x5d\x98\xbc\x84\x2c\x69\xce\x15\x2b\x49\xb2\x60\x53\x10\x21\xc7\xf4\xcc\x88\x3c\x6c\x92\x94\x4b\x86\xcb\x05\xc3\xff\x8e\x13\x82\x1f\xbb\xcd\x95\xba\x82\x71\xb8\xb5\x0b\x02\xef\x1f\x70\xcc\xb8\xb0\xbe\x90\x14\xfb\x45\xe5\x58\xf6\x54\x15\x96\x2d\x34\xe4\x1f\x23\xd5\x62\x2c\x73\x68\x33\xe7\xb7\x6a\x59\x32\x1a\x75\x7b\xfd\xf8\xec\xc7\x2b\x72\xad\x64\x14\x7c\x89\x00\x55\x23\xf9\x56\x1f\x28\x75\xf2\x2e\x9e\x12\x84\xc0\xb2\x03\x42\x27\x2a\xb1\xc7\x81\x0f\xe9\x8a\x67\x83\x39\x0e\x7c\x68\x5f\xe6\x6c\x30\x4c\xa3\xee\x58\x58\xfd\x50\x58\x49\x3d\xc5\x26\xe5\xe4\xd9\xe5\xc9\xb3\x14\x34\x9e\x94\x9f\x1d\xfe\x8f\x7f\xc2\x1c\x03\xe7\x1d\xe3\xf8\x30\x6e\x34\xab\x62\xdc\x84\x22\x62\x06\x42\xf3\x91\x61\x50\x19\x55\x98\x20\x97\xf6\xc9\xae\x13\xfd\xab\x2a\xb9\xb3\xa7\x36\x5a\x39\xad\x73\x98\x7a\x38\x4c\x2e\xfc\xe0\x26\x3d\xdd\x57\xb0\x7c\x0a\xdc\x59\x2b\xad\x9f\x8a\xd1\x1e\x88\xf2\x0a\xde\xdc\x9d\xe8\x5e\xab\x50\x70\x9c\x4d\xf4\x3b\x5c\x7a\x61\xe6\xcf\xf8\x3b\xa5\x0b\xc8\x5d\x29\x80\x3e\xbf\x94\x2c\x86\xba\x85\x96\xba\x90\xe3\xc9\xe8\xb5\x6c\x7f\xda\x59\xde\x12\xb0\x2a\x36\x3c\xd7\xb0\xe1\x65\x84\x1e\x80\x63\xab\x3e\xa2\xd5\x95\x12\x98\xad\x6c\xba\xf7\xe0\x86\x80\x57\x26\x60\x9b\xaa\xfe\x80\xc4\xe0\xeb\x5b\xef\xd1\x3c\x1b\xa8\x68\x72\x86\xe9\x9f\xe8\x40\x19\xcd\xe1\xf8\x10\x4b\x30\x72\xb0\x02\xbe\xe9\x3a\x2a\x89\x36\x97\x8f\x19\x38\x59\x38\x97\x42\x60\xa3\x85\x6f\x3a\xf4\x04\x2a\x2f\x39\x27\xe7\x51\xfc\x31\x4b\x49\xfb\x18\x93\xfa\x1f\x73\x2f\x70\x90\x3d\x38\xb7\xf1\x21\x6d\x76\x36\x87\xc9\x8e\x7b\x53\xcc\x55\xc4\x6f\x6f\x98\x36\xa9\x87\x99\x09\xc6\x28\x12\xab\x1a\x46\x08\xbc\xab\x93\x4c\x48\x8a\x58\xc4\x26\x6a\x78\x69\xd0\xd8\x70\x12\x39\xee\x0e\x57\x53\xc3\x41\xd4\xd9\x0b\xa1\xb6\xf8\xc5\x88\x4f\xd4\x4c\x53\xba\x81\xe4\x63\x2c\xd4\xb5\xc3\x8e\x4c\x5c\x17\x45\x46\x7f\x4d\x9a\xa8\x6f\x5b\xdf\xe9\xba\x74\x8a\xd8\xdb\x9c\x0c\xf9\x24\x9e\x72\x64\x33\x9c\x23\x98\x34\x98\x95\xae\x05\xc2\xf6\x70\xe4\x1a\x46\x12\x24\x0d\xdb\xa6\xe9\x32\xcf\x2a\x77\x3e\xd3\xf4\x3d\xba\x83\xef\x28\x63\x8b\x85\x58\x84\xd3\x3a\x72\xfa\x23\x6b\x9f\x1c\xa0\x2a\xc3\x69\x45\xe3\xe4\x93\x18\x1f\x5f\xf5\x1e\x82\x10\xd4\x11\x8f\xef\x1e\x8d\xa0\x33\x56\x60\x5b\x52\xeb\x0b\xa9\xd5\x52\x19\x5d\x3d\xfc\x8b\x87\xdb\x13\x5f\x37\x50\x3e\x93\xa1\xc0\x05\x9f\x0b\xfc\x67\x1f\x6c\x23\xac\x8e\x8d\xfb\x33\x90\x35\xf0\x7a\x83\xfd\x52\x1c\xf9\x76\xf4\x86\x93\xff\x77\xa2\x17\x68\x50\x48\xc2\x73\xf4\x09\x03\xf9\x03\x6d\x36\xcf\xd7\xf9\x5e\x84\x0f\x8c\xd2\x8e\x21\xa9\xb1\x2a\x6d\x98\x4f\x12\x9c\x8d\x9f\xb5\x9a\x9f\x80\xf8\x65\xcd\xe3\x88\x4d\xd7\x59\x09\xc4\x40\x8d\x85\xe9\x1a\xdf\x2b\x64\x08\x07\x39\x37\x7f\xcc\x60\xe0\x8e\x45\xff\xd5\x11\xd2\x88\x29\xf7\x12\x8c\xa9\xaa\x2e\xad\x27\x25\x02\x70\xe6\x46\x2b\x83\x44\xed\xb4\xd5\x99\x92\x4a\xed\xc9\x3c\x3f\x6b\x63\xd2\xb0\xf3\x80\x3c\x76\xdc\x09\x95\x22\x33\xa7\xc5\x6e\xca\xe0\x36\x57\x03\x54\x82\x1d\xb9\x3e\x9c\xd0\x15\x07\x24\x3a\xb4\xc5\x99\x66\x73\x7a\x4f\xa2\x57\x32\xe0\x05\xd8\x48\x54\xc2\x02\xfa\xad\xc0\x7e\xa7\x8b\x68\x7a\xbf\xe0\xb3\xd9\xab\xc5\xa3\x7c\x47\x16\xf3\x85\xa3\xd0\x27\xe5\x2f\x29\xf6\xdd\xa4\x25\xf8\x1a\xa7\x26\xe6\x39\xdc\xde\x62\x66\xb8\x79\x27\xfa\x2d\x87\x7b\xf1\x0c\xe9\x09\xd3\xd6\x74\xe8\xda\x5b\x71\x92\x3e\x3f\x7c\x02\xeb\xff\xed\xc3\x87\x5b\xf7\xf1\xc8\xdc\xe4\x29\x24\xd7\x61\x62\xcc\x1b\x30\xea\x91\xb5\x0a\x31\xec\x57\xba\xc4\x24\x34\x70\x88\x88\xc1\x05\xc7\xc6\xc4\x5b\x1f\xc6\x2e\x1d\xc0\x71\x33\xfd\x30\x9f\x68\x94\xd3\x05\xbd\xf2\xe2\x4b\x01\x2a\xb3\xe4\x3e\x7f\x02\x93\x76\xe0\x98\x48\xd8\xa7\x5f\x84\xd1\x9b\x9e\x4f\x66\x19\x4c\xe3\xe4\x4c\x4c\xaf\x01\xfb\x6c\x7c\xda\x52\x93\xe6\x38\x87\x89\x3e\x81\x3f\xd9\x6d\x68\x66\x51\xb0\xfd\x23\x20\xce\xf3\x38\x63\x5b\x0e\x9a\x58\xa4\x1b\xba\x36\x5a\xbb\x6a\xe0\x71\xc2\xe8\xa4\x12\x07\x1b\x6a\x3b\xe7\x0b\x8f\xba\xd9\x37\xd6\x0b\x94\x1b\x15\x66\xf0\xbe\xb2\xad\x13\xbd\xe3\x79\xaa\x9e\x7b\xac\xe1\xe9\xdb\xab\xa0\xa7\xd2\x41\x08\xcd\x18\xee\x9f\x54\x41\x83\x5b\xee\xce\x9a\xe9\xfa\x7a\xf4\x67\x5c\x24\x66\x2a\x08\xbc\x79\x02\xf5\x62\xe7\xf3\x85\xdd\xec\x71\xf4\x19\xcb\x1f\x3d\x8a\xee\x7f\xbb\x5e\xb1\xd5\x79\x08\x8e\xb4\x7b\x13\xb6\xff\x2b\x6c\xd1\x1e\xd4\x42\xf5\x6a\xe0\xaf\xca\x5b\x16\xa9\xe4\xfd\xd9\xf9\x04\x4e\xe0\x97\xf1\x0c\xe4\x36\xd4\x05\x6c\x6e\x34\xdb\xeb\x9b\xa7\xd6\x0d\x65\x0f\x41\x90\x15\x00\xac\x33\xd7\x26\x8a\xe6\x93\x97\xbd\xdc\x92\x4f\x31\x6e\x55\x95\xdf\xa2\xe8\x47\xd3\x73\xb3\x81\x62\xde\xe9\x14\xc7\xb3\xd1\xcb\x86\xd9\xb4\x21\x86\xfa\x8f\xa2\xdb\xb6\x68\x0f\x4b\x6e\x07\xd6\x65\xea\x97\xc6\xff\xf5\xc4\x34\x29\xf2\xfd\xc4\x4c\x9f\x5c\xba\x2e\x29\x45\xa8\x05\x7f\x6a\x4b\x18\xe4\xa6\x3f\xee\x96\xbd\x3d\xbe\x6f\xd9\xe8\xca\x81\xb8\x63\xa3\x2e\xcf\xb2\xd7\xa8\x66\xd9\x83\x59\x91\xcc\xb4\x15\x64\xaf\x18\x39\x74\x7f\xe5\x48\xf0\x37\x17\xba\xcb\xd3\xfd\x11\x8e\x09\x73\x86\x95\x6e\x80\xdb\xf6\x60\xba\x2d\x07\x93\x36\xf4\x6f\x78\xfa\xd5\x44\x0e\x19\xe5\xce\x8e\xf9\x3f\x1b\xa3\x7c\x63\x73\xf9\x8e\xd9\x3b\x3a\xa2\x3c\x67\x98\x0e\x34\x1a\x43\xa5\xa5\x9b\xc7\xa0\x7f\xd9\x5d\x54\x05\x65\x63\x94\xfd\xbe\x41\x9a\x7b\x5a\x11\x07\xc8\xf3\xec\xf7\x63\xf3\xbd\x1e\x44\x5e\x0e\x61\x94\xfb\x00\x88\x32\xe1\x96\x36\xee\xa7\xd1\xd1\x08\x05\xf4\x7c\x7e\x7a\x9a\xe4\xec\x59\xd0\x74\x1c\xd6\xd1\x6a\x26\xc7\x1a\x20\x52\x8e\x36\x4f\x86\xd9\x29\x26\xf1\xd8\xda\xbc\xb7\xb5\x09\x3b\x03\x66\x39\xfd\x7d\xba\x81\xa6\x0e\xe9\xa7\xa4\xbf\xb9\xde\x22\x2b\x5a\xc0\xa3\x1b\xf1\x47\xb9\x1b\x83\x3c\x0a\x87\xeb\x8c\x4f\xf2\x61\xb6\x48\xa6\xb8\x08\x51\x17\x2a\x86\x76\xab\x57\xe5\x2c\x76\x1e\x4a\x58\x4c\xc0\x7e\x0c\xaf\x31\xc4\xd2\x8a\x1a\x30\x79\x8d\xf5\x25\xcc\xc2\x74\x62\x3c\x3e\x0d\xfd\x75\xe0\xdc\x24\x2e\xb2\x52\x68\xdc\x1b\x37\xcf\x2f\xc1\x5a\x2a\xc3\x3c\x14\xb9\xce\x30\x1b\x27\x6f\x80\x8e\x31\x54\x66\xb5\x1a\x94\x2c\xdb\x4d\x90\x4e\x97\xcf\xb8\x25\x1a\x22\x97\xbe\x21\x40\xda\x5d\x28\x33\x4e\x4b\x1a\xf9\x15\x0c\x9f\xfa\x90\x9c\x1f\x0e\xfc\xea\xf4\x49\x81\x2f\xf8\x76\xee\xd7\x90\x8f\x06\xc8\xde\x5f\x0f\x9e\x3d\x79\xb5\xff\xe2\xfd\xcb\x57\x87\x2f\xa1\x2a\x41\x68\xfe\xab\x77\x96\x0e\xfb\x20\xc1\xb2\xc1\xe8\x85\xe3\xb9\x7a\x64\x02\xf0\xe0\xc5\x5e\xcd\x76\x38\x16\x9c\x98\xa8\xc3\xfc\xb0\xcf\x22\x41\x51\x85\x12\xd4\x82\x16\x68\xf7\x39\x57\xbf\xc4\x99\x5c\x0c\x50\x73\xd4\x47\xf3\x77\xe4\xa2\x64\x75\x1c\xee\x69\x77\xf2\x2e\x04\x2e\xff\x6f\x22\x73\x0d\xb0\x1b\x7d\x20\xc3\x0f\x6c\x9d\x39\xa4\x48\x02\x45\xff\x75\xc6\x8e\xff\xd7\x6f\x32\xc2\x18\x61\xe7\x6d\xee\x9f\xd2\x55\x52\xa6\x72\xa2\x6e\x7a\xb2\x3e\x21\x80\xa3\x64\x7a\x8a\x0e\x8a\xea\x89\x80\x63\xf1\xed\xd7\x7d\x5c\x63\xc6\x85\x2c\x55\x09\x61\x52\x67\x30\x02\x02\x2b\x1d\x07\x39\xb7\x7d\x5a\x6b\x52\xbb\x16\xb7\x61\xa6\x84\x57\xfe\x95\xb4\x4e\x97\x7e\x2b\x17\xfa\x30\x66\x97\xd4\x37\x70\xbb\x81\x79\x1d\xff\x55\xf4\x39\xf2\x54\x1a\x22\xbb\x4e\xa6\xed\xee\x58\x29\x1d\x6c\xdb\xdc\x02\x1d\x23\x4b\xab\x95\x38\x49\x7a\x31\x6e\x26\x58\x92\x7f\x34\x10\xb8\xa6\xce\x8c\xd1\xf3\x44\xa1\x51\xde\x04\xc7\x7c\xc0\x85\xc5\x59\x65\xd1\x0b\x03\xbb\x23\x03\x04\x60\x0f\x1c\xdf\xc9\x79\x8d\x27\x4d\x97\x51\x68\xb0\x52\x68\x41\x98\x03\xf1\x97\xec\xb6\x36\xad\x11\x0f\x8d\x16\xa0\xc5\xc8\xb4\x79\x35\x76\x44\x3b\x86\xc6\xcc\x5d\xa7\xa0\xad\x1b\xa8\xcb\xcf\xc6\xec\x48\x40\x0c\x85\x1e\xd0\xc8\x80\x5d\x7b\x0e\xb3\x89\x7b\x7b\x72\x3d\xfa\xe6\x1b\x19\xa3\x0b\xbf\xb6\x89\xae\xba\xe9\x40\xb1\xc1\x83\xa8\x04\x49\x57\xcf\x47\x2f\xb3\xa2\x19\x44\x25\x2c\x5e\xa3\xd1\x40\x6f\x9a\x90\xd2\xee\x3d\x85\xe4\xa2\xad\xf1\x9e\x5c\x81\x3e\xcd\x5a\xb2\x30\x69\x4e\x41\xbb\x66\xa4\xd0\x46\x50\xda\x14\x17\xd6\xdd\x14\x6d\x22\x19\x90\x1d\x5e\xf1\x21\xca\x38\xda\xb3\xd6\xaf\x4b\x8e\xd1\xf2\x8b\xb7\x42\x9b\x73\x8e\xea\xe8\xaa\x4e\x5c\x8f\x2e\x2f\xa1\x80\xf2\x18\x75\x67\xeb\xfb\x87\xad\x0a\x46\xdc\xd9\xbe\x47\x65\xcc\x75\x3b\xdb\xdf\x53\x9c\x57\xe5\xb0\x9d\xed\x1f\x1e\x94\x68\xaf\x6e\xe2\xbc\x7e\x8d\x2b\x42\x46\xae\xa9\xf9\x0b\x18\x72\xe5\xf5\x38\xcd\x8f\x81\x7a\x5f\x14\x52\x39\xd9\xef\xf2\xe6\x53\xa5\xfb\xd2\x55\x32\xf9\xa4\xe3\xe8\x34\x45\xbf\x45\x74\x26\x1b\x23\x5c\xc5\x23\x62\x73\x82\x78\x4c\x89\x9f\x4d\x79\x78\xca\xfd\x04\x05\xd8\xef\x05\x1a\x9c\x27\x53\x42\xed\x70\x3e\x0b\x5a\x94\x54\x4f\xc7\x63\xa9\x7e\x80\x7f\x05\xd5\x2b\x33\x55\x77\x4d\x37\xdd\x10\xd5\xae\x01\xd9\x0d\x0f\x27\x67\x6e\x9b\x06\x40\xcb\xe2\x60\x8f\xa8\x5b\x76\x18\x9f\x3f\x47\xb7\x82\x1a\x66\xbf\x5b\xcf\x19\x36\x20\xc6\xa6\xb6\x25\xda\x1f\x56\xb5\x9c\xf9\x69\xfc\xc9\x48\xc6\xac\x9e\x85\xb1\xbe\x42\x87\x4e\x3b\xdb\x5b\xa8\x24\x58\x36\x74\x89\x27\x48\x6d\xab\x06\xd4\x56\x28\x01\xf0\x62\x05\x07\x91\x1a\x60\x23\xec\x53\x63\x24\x86\x2f\xe3\xc6\x87\x67\x79\x13\xa7\xb7\xe8\x1b\x56\xf6\x05\x26\xdd\x85\xd9\x2b\xe7\xbb\xce\x24\x99\x4b\x8e\xb3\xa7\x3a\xdb\xdf\x51\x6e\xcf\x07\x37\xd1\x57\xbf\x06\x27\xa4\xe3\x93\x1e\x86\x9e\x4e\xb3\xd1\x73\xbc\x65\x57\x72\xc4\x59\xa6\x6f\x63\x0e\x3b\x94\x8f\x6e\xf4\x9a\x97\xec\x60\x83\x1a\x90\x64\x3e\x4d\x73\x74\xc8\x9d\xc1\xe5\xbf\xcc\x76\x88\x05\x6f\x9c\xed\xdb\xf4\xf8\xba\x81\xf2\xf6\xed\xb6\x51\x88\xa0\x1b\xed\xf8\x03\x08\x6e\x1f\x60\x1d\xfe\x77\x96\x9f\xcd\x5b\x00\xf7\x7f\x12\x74\x51\xca\x67\x18\x9d\xe9\xf6\x5f\x49\xaa\xeb\x67\xa7\xd1\xcf\xf3\x7e\xff\x2c\xc6\x78\x4d\xf3\x69\xf2\x93\x68\x32\xa8\x11\xe5\x40\x4b\x93\x7e\x27\xba\xfd\x7c\xde\xbe\xed\x2e\xba\xe1\x5c\x06\xb5\x9c\x85\x32\x0c\x72\xc2\xee\x56\xe4\x05\xcb\xf8\x09\xf0\xdb\x1d\xce\x90\x4f\x5e\xbb\x74\x57\x31\xd9\xfd\x13\xdb\x4c\x12\x4b\x71\x62\x30\x6a\xce\xfa\x0b\xad\x90\x37\x64\xfc\xe4\x6a\x1b\xa3\x37\x6a\xf4\xd7\xe3\xe7\xcf\xf6\xc4\x8d\x14\x6f\xef\x49\xfb\xb4\xcd\xcc\x9a\x84\x1b\xdc\x23\xc4\x84\xe9\x13\xc6\x86\x64\x49\x24\xff\xf9\xfc\x38\x3e\x25\xf5\xc4\xfa\xba\x4e\xdf\xc1\x8c\xc5\x61\x77\x67\x92\xde\x89\xcf\x19\x3b\xe1\x82\x46\xce\xb7\x9d\xa7\x40\x46\x43\x58\xb6\xf0\xfc\xb9\x73\x81\xf5\x4a\xcf\x0c\xff\x0c\x80\xe9\x22\xa2\x78\x41\x73\xd5\x84\x46\x9e\xb2\xa4\xa9\x0f\x90\xf4\xfc\x02\x12\xf7\x26\x61\x46\x5f\x6f\xdd\x82\xda\x2a\xd3\x42\x15\xc2\x91\xc3\xcd\x08\x8e\xad\x08\xe7\xe0\x19\xe0\xc7\x9f\x8d\x41\x33\x52\xfe\x51\x3c\x88\xa7\x29\xdf\x69\x90\x84\x61\xfb\x20\x3c\x4c\x83\xc5\xcd\x29\x43\x56\x50\xa2\x10\x1a\xeb\x4e\xc7\xff\x9c\x93\xa3\x3b\x4d\x08\x2e\x22\xe2\xc1\x70\x1b\xfc\x9c\x42\x31\xf1\x68\x68\xb6\x11\x3d\x3a\x91\x03\x23\x0f\xa6\xd9\xc8\x13\x8e\xf6\xf5\x31\x1e\x96\x37\xb0\xd2\x80\xb5\x67\x40\x0b\x0f\xd8\xa4\xe8\x55\xac\x5d\xd3\x32\x99\x49\x89\x1a\x1c\x0a\xa1\x61\xee\xb7\x48\xa1\x06\x31\x14\xbf\x1b\x68\x0b\xd0\x50\xa5\x63\x9a\x50\xf2\xb9\x83\xfd\xef\xc3\xb9\x69\x63\xdf\xc7\x98\x2c\xec\x16\x4c\xc5\x78\x8e\x9e\x8c\x76\x22\xf4\xa2\x47\x9d\x92\x97\x85\x9d\x08\x28\x85\xcf\x3e\xbd\x6e\xea\xda\x68\x0d\xff\x15\x9d\x46\xff\xf9\xb3\x03\x54\x77\x82\xd6\x6f\xa0\x0c\x9e\x24\x76\xae\x60\xb9\x64\x28\xf2\x45\xf2\x93\xac\x51\xb8\xc1\x0b\xc3\x74\xf6\x7d\xbb\xcd\xc2\x26\xa4\xcd\x7b\x72\xce\x06\xa1\x62\xdd\x4b\x46\x2c\x52\x64\xee\x61\xb0\x86\x74\x58\xec\x99\xa8\x5b\x3d\x38\x5d\x34\x36\x81\x05\x3b\x08\x22\x38\x29\x24\xef\x44\x41\xc7\xe8\x2c\x9f\xb1\x65\x0a\xb9\x54\xf7\x53\xab\x18\xb0\x7a\x5f\xd2\x3f\x97\xf0\x62\x87\xd7\x36\xca\xca\x1b\x78\x0c\x0b\x0c\xb3\xfd\x28\xee\xc3\xe1\x38\x39\x9c\x3e\xcf\xa6\xc9\x31\xda\xbc\xe4\x4d\x32\x7d\x61\xa1\xe2\x0e\x4d\x35\x7f\xc0\x13\xb9\x04\xae\x56\xdf\xd1\xda\xed\xb6\x44\xe3\xb8\x70\x87\x87\x86\x46\x0b\x56\xf5\x90\xb1\x33\x00\x22\xf7\x00\x68\xda\x88\x62\x3b\xf1\x9c\x8b\x92\x23\x15\x44\x39\x8c\x3d\x9e\xe6\x7a\x50\xc1\x2d\xd2\xf0\x2b\xf6\x37\xd7\x17\x59\x51\xea\xfa\x7b\xc0\x70\x4c\xfa\x61\x59\x69\xb7\xc5\xf6\x53\x76\xaf\xde\xa1\x9b\xa5\x1e\x5a\xe8\x4b\xef\x86\x02\xa8\xe6\x69\xd4\x3c\x54\x02\x97\xcd\x91\xe1\x6b\x24\xcc\x96\x30\xbd\x40\xcc\x7a\x0b\xdf\xde\x05\xa2\x5a\x71\x7f\x84\x72\x1f\x6c\xd1\x1c\x85\x8d\x66\xa5\xc4\x25\x43\xa4\xd6\x35\x82\x57\xc9\x10\x8c\x00\xa6\xa7\x38\xdc\x4a\x29\x69\xf1\x83\x95\xa2\x0b\xdf\x28\x99\xff\x30\x91\xec\x29\x1c\x8b\x2f\xe3\xd3\x64\x4f\xc3\xb0\x94\x4a\x65\x81\x86\x19\xf3\x74\x26\x03\xdc\x84\xbd\x74\xca\xa1\x55\xc8\x49\x14\x8d\xde\x73\x64\x7e\xbc\x92\x1c\xb0\x86\x0c\x11\x10\x17\x54\x50\x1a\x6d\x33\x85\x6c\x28\x51\x32\x73\x28\x07\x57\x2f\xbd\x92\x16\xfb\xd2\x91\x0f\xf7\x24\xd0\x5d\x64\xe2\xcf\x88\xaf\x3e\xca\x31\xe4\x15\xea\x07\x1e\x24\x1b\xb2\xf9\x98\xfc\xfd\x2d\xe9\x98\x59\x93\x03\xfc\xd1\xd9\x6c\x34\xfc\x11\xfe\x03\x1c\xe0\x47\x3a\x1e\x1f\x9d\x64\xfd\x73\x7c\xe4\x42\x0d\xd4\x09\xb9\x0f\x64\x1f\xd1\x58\x63\x1a\x91\xaa\x10\xa1\x24\x71\x9e\x0e\xcf\x39\xb4\x46\x6f\x9a\xe5\xf9\x86\xc6\x32\x5d\x20\x4b\x3b\xcb\x16\x64\xd7\x46\x5e\x1f\xe8\x1e\xa5\xb1\x18\xd1\x3a\x8d\xff\x24\xc9\x10\x2d\x20\xe3\xfe\x47\x18\x28\xac\x27\x52\x0f\x4d\x52\x23\x0f\xc3\xf5\x90\x91\x22\x10\x32\x07\xe3\x01\x14\x67\xe9\x6c\xc8\x81\xf1\x46\xf1\x18\xda\x92\xc2\x2b\x3a\x22\xc7\x96\xdf\xd0\xc6\xaf\x2f\x77\xb4\x48\xc2\x0a\xf3\xfc\x00\xbe\x56\x73\xaa\x3e\xfc\xa5\x4f\x60\x80\x10\x29\xf4\xf0\xbf\x12\xfc\xcf\xe3\x84\x36\xd0\x01\xb1\xe2\x71\x4a\xde\x13\x28\x9d\x80\xb8\x8b\x44\x8c\xa3\x21\x05\xac\x43\xa5\x05\xae\x59\x20\xe5\x26\xf4\x67\x6d\x59\x44\x82\x01\xd6\x40\x3b\xf1\x71\x99\x7e\x4f\x0a\xa9\xe1\x8e\x6a\x66\x0b\x70\xb5\x2d\xd1\xaa\xb4\xe4\x78\xac\x12\x54\x84\x05\xe4\x0e\xfe\xe1\xbf\xe3\xb3\xf6\x1a\xe3\xbe\x0e\x91\x81\x63\x9d\x06\x81\x2a\xf4\xd1\x88\xee\x62\xf3\x16\x67\x2f\x30\xe3\x7e\x03\xe4\xf9\x9a\xa9\xb0\x24\x54\xc6\x75\x9c\xd1\x22\x0d\x0c\xa2\x3f\x1b\x7f\xce\x81\x3f\xa5\x7c\x44\x0a\xe5\xb7\xa3\x9f\x45\x43\x8e\xef\x08\x1e\xa9\xe2\x76\x43\xf5\xd3\xcc\x57\xae\x63\x0c\x03\xc0\x3d\xcf\x53\x21\x5a\x81\x44\x66\xb2\x18\x6b\x63\x83\x62\x6d\xd8\x11\xe6\x70\x15\x39\x95\x8d\xd4\x92\x9d\xd4\xf2\x01\xda\x7d\xb5\x8e\xf9\xed\x52\x32\x93\xc2\x8f\x09\x7a\x65\xa1\x61\x13\xb0\x9a\xe8\x38\x03\xa6\xf8\x29\x62\xa7\xa2\xb3\xf8\x23\x99\x72\x72\x18\x1f\x0f\x5a\x09\x0e\xcc\x0a\xc6\xb4\xeb\x04\xdf\x5c\x82\x50\x89\xf7\xbf\x10\x53\xde\x6e\xd8\x09\x63\x9f\x1b\x4b\xb4\x6d\x67\x9d\xa5\x92\x6f\x0f\x4b\x13\xae\x7e\x77\x17\xb2\xd4\xdc\x4d\xe9\xe2\x6a\x2a\x07\x8f\x90\xd9\x9d\x4f\x9f\x01\xa2\x48\x1c\x38\x99\x7c\xa5\x45\x81\xba\x2a\x54\xd5\xe5\xdb\xe8\xb2\x3a\x6b\x66\xe1\x9d\x2d\xce\xc9\x5a\xaa\xc6\x5e\x6a\x5c\x79\x13\x62\xf8\xdf\x2b\x16\xd0\xf5\x9f\xc4\x37\x36\x34\x2c\x13\x0a\x8c\x46\x3a\xf9\x88\xe9\x47\x50\x33\xd1\xc2\x78\x4d\xfc\xa7\xd1\xe6\x70\x38\x1e\x18\xc4\xfe\xf8\x63\x3a\xcd\xc6\xc5\xc3\xbc\xac\x86\x39\xd4\x97\xdc\x56\xd0\x72\xa1\xa4\x86\x4a\x10\x98\xc0\x8b\x46\x80\xfe\xa3\x85\xec\x3b\xb6\x48\xeb\x5f\x46\x84\x78\x32\x1f\x8d\xce\x55\xcf\x88\x9c\x42\x9e\x97\x85\x51\xa0\x15\x3a\x9b\x69\xb2\xe6\x9a\x32\xd0\x60\x13\x56\x27\xc3\xee\x2c\x1b\x37\xec\xb3\xf1\xeb\x3c\xc1\xcb\xfa\x4f\xe6\xdc\x0d\x5e\x9f\x1a\xfd\xf4\x63\x43\x5f\x11\x1d\x75\x98\x98\x0b\x11\x1e\x20\x84\x75\x61\x84\xd8\x17\xf2\x9f\xae\xc5\x61\x2c\x9f\x5c\xeb\xa2\x7f\xe4\x77\x1e\x35\xff\xb1\xb8\xbb\xee\x98\x18\xed\x7f\xa2\x90\x50\xec\x7d\xd8\xd5\x56\x5d\xbd\xa0\x8a\x8b\xa2\x08\x67\x1c\x59\x89\x0d\xe5\xb3\x81\x33\xee\x32\x71\x40\x8c\x67\x8f\x4a\xaa\x5b\x99\xe0\x27\xad\x4d\xd3\x85\xa6\x4c\xda\x33\x85\x53\xc6\x73\xc9\x9d\x5d\xc3\x0a\x9c\x41\x37\xb9\x82\x15\x01\x74\x10\xcf\xc9\xf7\xf1\xb1\x02\x18\xe1\xcf\x66\x30\x2f\xc4\x4c\xd5\x09\xc1\x6b\x87\x56\xf8\xee\x87\xb7\xf7\xdf\xc1\x29\xff\x0c\x8d\x81\xd4\x5a\xef\x22\x90\x33\x1d\xd5\x80\xd0\x8b\xc6\x81\x1c\x93\x9e\x8d\x49\x06\x6d\x8d\xc5\x45\xb4\x30\x48\x94\x9f\x68\xf7\x4b\xe0\x25\x34\x18\xd6\x2a\xdd\x33\x38\xfc\x86\xc9\x51\x6f\x9a\x4e\x66\x5d\x37\xe4\x15\x99\x0b\xa8\x63\x7b\x94\xa1\x54\x45\xe6\x60\x71\xef\x0c\x81\x3d\xca\xa9\xc9\x8f\x66\x19\x35\xfe\x9b\xe2\xd3\xc6\xab\xf2\x38\xab\xec\x01\x59\x96\x60\x41\x31\x2b\x2b\x62\x75\x93\x0a\xf6\xbc\xd0\x1d\xeb\xd5\x4c\x5f\xf5\xd4\xb2\xeb\x90\x17\x08\xc1\x69\x9f\x34\x42\x1e\xe9\xe8\x7b\x94\x15\x27\x5d\xb4\x25\x8a\x41\x30\x0d\x76\xea\x15\xbb\x76\xf1\x92\xfe\x08\xb6\xa3\x6c\xbe\xcf\xf0\xa7\xbe\x21\x88\xfb\x8e\x46\x42\x33\x90\x68\x4d\xc3\xe7\xaa\x32\xb6\x2a\x04\xda\xf2\xf0\xf4\xc9\x15\xa8\xd4\x30\x0d\xa4\xc8\x2b\x08\x78\xb7\x6e\x19\x08\x20\x48\x95\x22\xc2\x7d\x44\x7e\x80\xaa\x7e\x23\x88\x28\x65\xe1\xac\x5b\x5f\x16\xd9\x09\x9c\xf2\x2b\xdc\x79\x46\x86\x5e\x30\xfb\x35\xb5\x61\x0f\x79\xfc\xd7\xec\x3e\xe3\x16\x84\x2d\x8c\x01\x01\xea\xa0\xe9\x5d\x88\xd6\x9c\x23\x92\xc0\xb6\x03\x19\x59\xa8\xe3\x2e\x7f\xda\x7a\xb7\x63\xd3\x7d\xe1\x97\x27\x40\x8b\x67\xda\xe0\x9e\x04\x03\xe0\xb8\xaa\x4d\x53\xbe\xb1\x61\x65\x2c\x99\x73\xea\x11\xe4\x98\xd9\x1e\x2a\xc3\x1d\xb9\xca\x55\x8b\x14\xd0\x62\x64\x3c\xb3\x0e\x26\xaa\x5c\x41\x96\x2a\xd2\x1b\x5c\xa9\x61\xc6\x2e\x8d\xc4\x9e\xfe\xfa\x81\x26\x5c\xf2\x32\x06\x34\xe5\x14\xc9\xbe\x5e\xaf\x6d\x78\xdb\x02\x8f\x30\xfb\xb5\x2c\xb6\x84\x47\xc8\x22\x8f\x96\xea\xb4\x64\x88\xeb\x6d\xd8\x88\xfb\xb0\x0f\xfd\x96\xbe\x65\x0c\xb1\xc8\x0a\xfd\x61\xf0\x62\x41\x2d\x65\x7d\xfd\x35\xf4\x68\x89\x6f\xe1\xf4\x3d\xac\x16\xf8\x1d\x50\xe7\x75\xe2\x72\x30\x81\x97\x10\x96\x4b\xc5\x9e\xce\xd6\x83\x07\xad\x2a\xa1\xa6\xb3\xfd\x40\xf3\x49\x3a\xa2\x4b\x67\xfb\xdb\x95\x84\xea\x87\x2b\x39\xaa\xdf\x08\xd5\x7f\x84\x50\xfd\x69\xcd\x35\xd5\xf0\xdf\x03\x1d\x97\x5b\x64\x20\x7a\xce\x0d\xd3\x19\x66\x47\xa0\x7c\x45\x38\x8d\x1c\x27\xda\x98\x26\x92\x48\x44\x4f\x82\x1a\x27\x96\x12\x22\x08\xde\x64\x3d\x8d\x8f\xa3\xe4\x45\x61\x0c\x04\x3d\x6d\x3a\x1e\x81\xb4\xfc\x40\x35\xbf\xc7\x1c\xe0\xec\x0e\xdd\xa3\x47\x70\x08\xc0\x4d\xda\xb8\x44\x05\x9d\x1a\x35\xfa\x58\x60\xbf\x9f\x4f\x72\x54\xca\x8f\x5a\xbe\x5b\x2e\x3d\x5b\xd0\xab\x24\xaa\xb7\xd4\xd3\x0a\xc3\xc8\xa2\x9a\x3e\x9d\xc9\x53\x14\xe9\xc0\x30\x3c\x24\x57\x24\x2d\x19\x59\x64\x89\xe5\x9e\xf5\xa8\xe5\xe0\x2b\x09\x33\x8f\xf4\x63\xa2\x5e\xc7\xce\x80\x49\x15\x26\x62\xcc\x5c\x3c\x88\x4d\x3c\x6b\x8e\x5b\x67\x1f\xc0\x90\xe8\xc5\xc3\x6b\x4e\xb7\xfa\x3c\x59\x48\x5c\x37\x57\x16\xe1\x15\xf9\x2c\x6f\xc8\xd6\x32\x93\xcd\x35\x79\x02\x13\x79\x5b\xd5\x97\x66\x98\xb6\x0f\xc9\xf9\x26\x87\x33\x6a\xeb\xf3\x46\xe1\xdf\x01\x63\xa7\xa0\x41\x7e\xe4\x98\xde\x12\x06\x89\x2c\x1c\xb3\x31\x13\x2c\x3b\x77\x57\x82\xf2\x9e\xbc\xd9\xc9\x4b\x11\x05\x4c\x72\x67\xd8\xe9\xb8\x37\x9c\xf7\x25\x3a\xb8\x8c\xf1\xad\x90\x1d\x1c\x00\xef\xa2\xe8\x17\xe4\x24\x27\xb4\xff\x72\x1a\x8b\x81\x65\xde\x53\xa4\x3e\xa2\xec\x89\x4c\xf2\x9d\xff\xbd\xa2\xc3\x82\x20\xe5\x13\x58\xd1\x8d\x1c\xa3\x18\x1b\x57\x05\x03\xb5\x5d\xa6\x67\x5e\xd9\x7a\x18\x7f\xd3\xad\x50\x6c\x42\x1c\xb1\xeb\x53\xd3\x62\xfe\x95\x8d\x56\x19\x2b\x73\xde\x92\x22\xa4\x0d\xcc\x07\x16\xb2\x4d\x48\x1d\x25\x33\x23\xa3\xf7\x71\x93\xf7\xd8\xb9\x1a\xef\x52\x03\x8e\x1f\xfe\x31\x99\xe6\x18\xee\x21\x3a\x4a\x3c\x33\x53\xf1\x6c\x18\x9c\xb4\x47\xc9\x26\xc5\x7b\xdf\x60\xc8\x1b\x04\x39\x4f\x66\x25\xb6\xa6\x91\x9d\x28\x63\xb1\xa4\x9e\xbb\xf2\x50\xeb\x2c\xb3\xf3\x96\x1d\x3c\x15\x71\xbc\xd8\x36\x12\x95\x3b\xbb\x6d\xe0\x8b\x40\x81\xe6\x00\xb1\x65\x05\x15\x96\x6d\xf5\xd6\xfc\xa9\x11\x91\xd7\xdb\xbf\x65\xe9\xb8\xd9\x88\x1a\x95\x0f\x51\xfc\x98\x05\xab\x30\xcb\x10\x6f\x6a\xc0\x67\xae\x79\xa6\x43\x95\x61\xa3\xee\x95\xea\xd3\x25\x4e\xea\x7a\x5b\xca\x87\x2b\x05\xd5\xb8\x39\x42\xaf\x77\x84\x9a\xa7\x06\x72\x5d\xf9\x85\x83\x2f\x5e\x3e\x43\x26\x70\x1d\xb5\x56\xf6\x79\x8a\x53\x60\x1f\x94\xf2\xd7\x63\x7c\x1b\x01\x02\x25\x7b\x05\x68\xe1\x54\x6b\x87\xc5\xce\xeb\x92\xbe\x28\x4b\x00\x63\x13\x71\x83\xcd\x24\xa2\x5e\x8e\xf1\x1c\xd3\x19\x31\x46\xaa\xc2\x99\xa4\x78\xc1\x48\xd9\xd1\xc5\xff\xed\xd2\xf9\x6e\xf8\xf6\x30\x3b\xc5\x83\x1c\x45\x5b\x71\xfa\xca\xd1\x53\x09\x46\x0e\x73\x80\x99\xc5\xe9\x28\x85\x69\xed\xd6\xa1\x59\xe9\xa9\x44\xfd\x16\x3c\xc8\x38\x96\x3c\x74\xd2\x9d\x65\x13\x10\x3b\x4f\xd3\x71\xb7\x1d\x3c\x6d\xf3\x28\xbd\xa6\xfc\xc9\xb4\xbd\x7f\x6f\xf2\x29\x08\xb0\x6f\x15\x3c\x92\x23\x52\xdd\x1c\xb8\x29\x1d\xfd\xfd\x14\x76\x73\x4e\x67\x5f\xcc\x7a\x86\xe0\x5e\x5d\x42\x16\x4d\xf6\x7b\x23\x28\xcc\x79\x36\x37\xa1\x93\x99\x18\x6d\x2c\x92\xc6\x47\xfb\x0e\x07\xb2\x44\x3c\x49\xf0\x46\xff\x34\x9b\x4a\xe6\xc8\xe6\xba\x44\xf7\xa5\x68\xcc\x79\x2a\x81\x60\x19\xd0\xe2\x2c\x1b\x26\x36\x26\x04\x73\x6f\x86\xd2\xb7\xf9\x0e\xe2\x19\x54\x00\x21\x27\xe1\x94\x08\x92\x4e\x4a\x02\x20\x52\x14\xc8\xc4\x68\x76\xc4\x1a\x41\x53\x90\xcd\xc7\x18\x19\x1c\xe5\x91\x29\x39\x4d\x33\x16\x46\xb8\x63\x60\x6b\x62\xd5\x72\x92\x82\xe0\x03\x1b\x15\xa7\x9e\xcd\xdf\x25\xba\x3f\x40\x03\xda\xe2\x24\x15\xcd\x03\x0e\x67\xc1\xf6\xf3\x50\x42\x9b\x7a\xbd\xc3\x40\xf0\x28\xc9\xc5\x4b\x2e\x5b\xc4\xf9\x84\x32\xbb\xa6\x18\xbc\xaf\x3d\x39\x9b\x6c\xfe\xfd\xe8\xe8\xfd\x53\xe2\xec\xef\xf7\x3f\xc6\xb8\x16\xef\xf7\xce\xe0\x72\xf2\xfe\xe8\x2c\x49\x66\x16\x86\x80\xc0\xf7\x91\x09\x46\x7b\x99\xb6\x7b\x59\x7b\xfe\x61\x73\xeb\xde\xbd\xef\x36\xef\xdf\xdf\xdc\xfa\x76\x13\x73\x84\x01\x4a\xc9\xc6\xa7\x1c\x0e\x2a\xf8\x3f\x1e\x0c\xda\xf3\xa8\xd5\x3f\xdb\xb2\xa0\x22\x02\xc6\x0a\x5d\x47\x34\xdd\x24\x2e\xb2\x61\x05\xec\x29\x93\x56\x8c\x86\x6d\x60\x40\xc3\x7c\x6e\x56\x09\xe7\x02\x8d\x95\x86\xd8\x06\xed\x35\x80\x53\xe1\x95\x6a\x8a\xcf\x6f\xbd\x79\x9e\x93\xd7\xfb\x09\xa6\xe4\xc0\xb0\xc6\x40\x15\x30\xcb\xa7\x19\xe9\xe5\x74\x91\xa6\xf8\xf8\xf9\xfa\xd5\x33\x34\xae\xa1\xfc\x32\x20\x28\x62\xde\x15\x3e\x8e\xff\xb4\x75\xff\xfe\xc3\x1f\xee\xdd\xd7\x7b\x6a\x9a\xef\x63\x3c\x12\x60\x12\x4c\xc0\x12\xd0\xc4\x31\x04\xd3\xef\x70\xb2\x8a\x41\x1b\x99\x89\x39\x9f\x1b\xaa\x02\x10\x60\xc1\xc9\xcb\xe5\x17\xb6\xc7\x17\xd9\x18\x36\x75\x02\x1c\x0e\xba\x85\x9f\xf1\x8b\x26\xd3\xbd\x85\xe3\x54\xf1\xfa\xba\x67\x0d\xa4\x42\x0e\x11\xba\x75\x8c\xe9\x0c\xff\xe6\x9b\x42\xc5\xb7\x58\xf2\xae\x80\x64\x74\x97\xfb\xd9\xa1\x38\x2b\x31\x5b\x64\xaa\x1f\x64\x41\xe6\x70\x86\xcf\x75\x1a\x36\x5a\x31\x95\x08\x87\x84\xb2\x51\x33\xbc\x9f\x73\x95\xbb\x51\x63\xf2\xa9\x51\x7e\x4d\x2f\xe1\x10\xc6\x1c\xc5\x65\xfa\x9d\xad\x2d\x32\x08\x7e\x78\x13\xd8\xe3\x2b\x1c\xe7\x14\xba\xe7\xa9\x4c\xf3\x9a\x1f\xeb\x08\x63\x39\xed\xbb\xe5\x28\xd6\x79\x96\x9d\x55\x49\x22\xa0\x1e\xd1\x87\xab\x81\xf7\x2f\xdb\x9a\xc5\x06\xef\x8d\xc8\x08\x30\x8b\x12\xa7\x8c\xca\x77\xf0\x46\x8a\x2c\x63\x8c\xf1\xbf\x31\x19\xe4\x60\x80\x86\xa0\xc6\x67\x0c\xa1\x4d\x80\x08\xe1\x6e\x54\x61\x68\xc7\x46\xaf\x70\xf4\x4f\xd3\x3e\x9d\xed\xa6\x5f\xb8\x07\x4d\x80\xb9\x70\x3e\x28\xd6\xbe\x4b\x12\x61\x27\x25\x04\xc2\xc0\x66\x2d\x39\x74\xfe\xf7\x51\x34\xe4\x34\x48\xc4\x49\x36\x28\xb2\x11\x75\x08\x8d\x63\x20\xbe\x5e\x16\x07\xe7\xa1\x37\xaf\x38\x3d\x30\x11\xde\xb7\x36\x1e\x82\xaf\x24\x0d\xd0\xe3\xe2\x5c\xef\x54\x57\x7f\x4a\x76\xbd\x25\x6d\xe4\x25\xbb\xa6\x29\xb9\x7a\x94\xb5\xc4\x8b\x48\x5d\xc3\x17\xc8\x41\xcb\x1a\xca\xad\xa6\xba\x47\x5c\xb3\xc7\x1e\xa5\x18\x3b\x36\x28\xda\x41\x22\xa9\x6c\xac\xf9\x2f\x5c\x00\x4c\x83\x2e\xa5\x45\xa5\xc1\xf7\x12\x7f\x36\x35\x28\xc3\xc3\x95\x82\x91\xdc\x68\xdf\xfe\x28\x5e\xc3\x97\xd6\xb5\xaa\xa0\x0c\x4e\x1d\x8c\x19\x89\x2b\x7b\x49\x45\x81\xdc\x8a\x07\x30\xd0\xdf\x93\xa6\x03\xaf\xc2\x31\xd0\xa9\xb1\xf2\x55\xb4\x70\xf5\xbc\x72\xa4\x8f\x1b\xfa\xb9\x04\xfd\x98\x3b\xc2\x1e\x67\x9d\xb3\x57\x85\xca\x7b\xe6\xfe\xd1\xde\xee\xcb\xfd\xf7\xcf\x0e\x0f\xff\xf6\xfa\xa5\xe4\xfb\x6a\x7c\xd3\xe8\xc0\xff\xc4\xa3\xc9\x0e\x99\x0d\x35\x7e\xa4\xdf\xa7\x33\xf9\xf9\x88\x7e\x0e\xf5\xe7\x6d\xfa\xf9\xcf\x79\xa6\x1f\xfe\xd1\xa0\x2f\x7f\xfa\xb4\xf5\xdd\x4e\xc3\xc4\xd9\x95\x9e\x5e\xed\xff\x65\xff\xef\xf8\x98\xff\xf6\x9b\x1f\x1f\xdd\x6e\xbc\xa3\xf8\x3a\xf6\x58\xa0\x21\x4c\x9b\xf4\xd4\xed\x1d\xa5\x1e\xa2\x6f\xa9\xfc\x9d\x67\xef\x4e\x2d\xf3\x08\x5d\x6c\x25\x31\x1e\xa7\x1b\x64\x1d\x2c\xda\x10\xce\x50\xab\x5a\x30\xfe\x83\x6b\x21\xb5\xc1\x79\x13\x31\x0d\xc3\x1e\x13\xb8\xf2\x8b\xe0\xee\xd8\x5c\xa4\x24\xbc\x45\x70\xb6\x55\xaf\x43\x73\x66\xe2\x20\xaa\xf3\x07\x89\xa1\xf4\xd9\x44\xc9\x70\xa7\xaa\xa5\x73\x52\xb5\x3d\xab\x3b\x73\x98\xfa\x4d\x8c\x8c\x7f\xd7\xa6\x1c\xc0\x0d\x55\x1c\x4f\xaf\xa2\x07\x62\x4b\x35\x76\x30\x3f\x24\x5f\xf2\x12\x5b\x64\xa7\xd8\x33\x49\x3e\x90\x7c\x79\xcf\x43\x9b\xa2\xb0\xd4\x6b\xf5\x9c\xec\x1e\x8b\xf5\xe9\xfb\xa5\x8c\x98\xf5\xee\x57\x74\x19\x56\x77\xe1\x95\x54\xe7\x42\x82\x2a\x0c\xce\x38\x2d\x29\x3f\x81\x1b\x63\x86\x13\x76\xa5\xd7\xe7\xdf\xd2\x88\x18\xc6\x54\xf0\xb3\x35\x94\xb8\xb0\xe6\x94\x87\x53\xf9\xe6\xed\x7a\xb7\xea\xb1\x92\x1a\xf5\xad\x54\xe6\x74\xe9\x70\x01\x67\xe1\x9b\xc5\x2e\xae\xa8\xe3\xc7\xf9\xca\x84\x0c\x0a\x6b\xdf\x76\x42\x5d\x32\x6c\xae\x7a\x2b\x08\x59\x7a\xf5\xa7\x82\x88\x3b\x6f\xbf\x67\x05\xfd\x2e\xaa\x25\x5e\x25\x83\xfc\x60\xcc\x0f\x28\xbe\x55\x2e\xbd\xaa\x21\x54\x5c\xdd\xd3\x64\x26\xb3\x81\xef\x4f\xce\xe4\xa0\xc2\x04\x6f\x31\xa9\xb1\x5d\x6d\xae\xb7\x7d\xd3\x57\xfd\xec\xa8\x18\xe3\x68\x32\x77\x9c\xdd\x68\x17\x53\x58\x0a\x8e\x42\x02\x1b\x9a\xa2\x1a\x4a\x03\x0f\x1a\xdb\xcb\x32\x66\xce\x9b\x9d\x24\xce\x23\x0a\xa4\xbd\x49\xca\xdc\x59\x6c\x6d\x9d\xf0\x48\x49\xd1\x88\xbc\x04\xb9\x96\x51\x21\x4e\x61\x3e\xda\xd1\xf3\xec\xa3\xe4\xeb\x23\x65\x28\xbb\xef\xd8\x0c\xb2\xbc\xc7\xc8\x2f\xcd\x85\x55\x4c\x32\x6b\xfc\x74\x1c\x03\x5e\x5e\x03\x34\x63\x21\xf7\x46\x72\x09\xdb\xb5\xe0\x1b\x8e\x11\xaf\xf3\xa6\xb2\x6c\xed\xbc\x1c\x0a\x17\xa2\xbd\xa0\xa8\xab\x05\xe2\xad\x8a\x81\x2b\x69\x73\x2e\x1c\x9d\x4e\x39\xf1\x17\x1c\xc5\xc3\x1a\x2e\x98\x90\x59\xa1\xd6\x67\x05\xa0\x96\x67\xb5\xc5\xe2\x07\x0d\x14\x14\x4e\x19\x00\xed\xf4\xaa\x06\x2c\x45\x90\x6d\xb1\xb1\xb4\x2a\x36\x36\xbc\x97\x47\xac\xca\xfa\xb7\x3c\x37\x4c\x89\x76\x6c\xed\xfa\x9b\xa4\x73\xc6\x77\xad\x4e\xf4\xe7\x7c\xdd\x06\x23\xe8\x72\x7b\x93\x10\x57\x89\xab\x41\x8a\x49\xd6\x57\x8a\x6b\x88\x9e\x62\xb0\x0b\xa5\x03\xef\xb9\xac\x38\x3b\x6b\xa1\x0d\xcd\x8a\xc3\xbd\xe4\x60\xd9\x1a\xe7\xaa\x4b\xe0\xf8\x06\x34\x94\x58\x31\x0d\x04\xfa\xd7\xb1\xee\x62\x9c\xa4\xe4\xec\xeb\x1f\x08\x30\x33\x14\x06\x82\x18\x52\xd3\xcc\xec\x15\x67\xc6\x18\xcc\x97\x09\x6c\x0e\xeb\xbb\xb4\xc5\xba\x7b\xd0\x77\xb6\xbe\xfd\xae\x55\x76\x96\x77\xb6\x7e\xb0\x31\x58\xf8\xd0\x86\x4f\x3f\x94\x99\xde\x98\xa3\x18\x7e\x3e\x5c\x1e\x8d\xe5\xe1\x4a\xd1\x58\x6e\xc4\xc8\x3f\x42\x8c\x1c\xa2\xb9\xef\x78\x4f\x42\x10\x55\xca\x8b\xb3\x69\x8c\x6f\xf1\x98\x4e\x65\xcf\x46\x31\x72\xe3\x13\x14\x2b\x5c\x56\x10\x2b\xe6\x7d\x55\xa0\x7b\x1c\xe2\x28\xd2\xff\x6a\x2c\xb3\xb3\x69\x36\x3f\x3d\xd3\x6a\xf1\xd0\xb7\x83\xf5\xb7\xa2\xc6\x2b\xa3\xaf\x1a\xbb\x4c\x0b\xbd\x86\xb7\xbc\x07\x41\x31\xd3\x56\x0b\x6c\xd8\xac\xb8\x20\x67\x1c\x6e\x0d\xc3\x20\x05\xe2\x19\x4f\x28\x27\xcc\xa6\x99\xc0\xc0\xdb\x82\x78\x33\x18\x90\x44\xb1\x6a\x45\x63\x63\x25\xb0\xb9\x19\xbd\xd1\xd5\x75\xbd\xf3\x34\x47\xb5\xc6\x5c\x97\x54\xbc\x8f\xc3\x39\x52\xc3\x54\xc0\xf3\xf5\x38\xfd\x27\xa9\x1d\x6f\x71\xe5\xd2\x67\x8d\x9d\xaf\x69\x12\x62\x90\x32\x56\x21\x01\xfd\x89\xfd\xe5\xfe\xb8\x47\xa7\x09\x0a\xe0\xb3\x85\x4c\x34\x92\x9c\xc9\x44\x98\x8b\x59\x8f\xeb\x1a\xd5\xe8\xfe\x39\xef\xb6\x23\x82\xc5\x26\x3f\x14\xa1\x1f\xf3\x6c\x53\xa7\x3b\xf2\x3e\xe9\x02\xcc\xcf\xd0\xc4\x28\x66\x50\x14\x7a\xda\x81\x67\xed\xfc\x35\x8e\x1a\x3f\x77\x52\xf6\x03\x23\x38\x8d\xd5\xbf\x29\x08\x6c\xc6\xf3\x6a\xd7\xe1\x9b\x6f\x04\xcc\xad\x50\xca\xc1\xc5\xe1\xa7\x24\x8d\x0c\x66\x0c\x37\x64\x6b\x3c\xe5\x69\xca\x2d\xe2\x9c\x93\x1e\x5f\x46\xcf\x27\x1a\x41\x5b\x5f\xc1\xe9\xc5\x39\x08\x80\x86\x0c\xe6\x9c\xfa\x45\x78\xce\x84\xda\x30\x6e\x6a\x16\x65\xb8\x16\x21\x46\x36\xe7\x7c\x50\x79\xf7\x97\x5b\x1a\xcb\x4f\x96\x30\xe9\x5b\xa8\x30\x68\xbe\x3a\x8d\x8d\x6d\x53\xb8\x41\xcc\x8a\x6b\x23\x7b\x73\xb1\x61\xd2\x4a\xc5\x41\x3f\x5c\x5a\xb0\x1b\x50\x73\x19\x95\x71\x2b\x03\xb5\x55\xbf\x45\x5b\x02\xcb\xf5\x7f\xe0\x2f\x15\xc7\xae\x3f\x9c\x4b\x1c\xbd\x65\x1c\x13\xce\xc7\xad\x15\xce\xcb\x2b\xc7\xec\xb9\x09\x70\x7c\x89\xa3\x31\xeb\xcd\x35\x74\x59\x51\x69\x1e\x9c\x59\xee\x6d\x7e\xcc\xb7\xcf\xc9\x7c\xb6\x89\x14\x05\x9b\x34\xa6\x04\x77\x08\x2f\xd8\x0b\xda\x05\x59\x61\x9b\x03\xe0\x60\xff\x7b\x1a\x0b\xfb\x19\xdf\xde\x23\xe7\x69\xb4\xd7\xe0\x06\x9a\x8c\x1c\xc5\xf3\x69\x36\x34\x51\x1b\xd9\xf7\x14\x64\xb1\x94\xbc\x4d\x5b\x6b\x26\x56\x4a\x82\xa1\xf4\xd1\xee\x94\x5d\x89\x63\x12\x9e\x99\x85\x98\xf8\xfc\x12\x35\x82\x78\x1e\xf6\xd2\xbe\x4d\xaf\x79\xf8\xe4\xf6\x01\x44\x4b\x8c\x25\xba\x26\x09\x41\x31\x36\x7f\xee\x70\xa0\x2c\xa3\xd0\xff\x70\xdf\xfe\xc8\xe1\x3a\x07\xd3\xf8\x34\x65\x7f\x57\x0c\x48\xd4\x5e\x73\x73\xb4\x91\xc1\x39\x75\xa1\xa1\x16\x28\x17\x9b\xa6\x62\x2b\xb7\x57\x33\x33\xe5\x28\x1f\x57\x8a\x9d\x70\x23\x20\x5e\x77\x17\x90\x7f\x82\x93\xfd\xa6\x54\x46\x0c\xb6\x03\xc7\xf6\x40\x1b\x96\xdb\x6e\x7a\x9f\xdb\x26\xbf\x8f\x0d\x56\x29\xf7\x26\x93\x7c\x26\x9b\xd2\xe3\xb0\xfa\x2a\x63\x6d\x8c\x56\x4b\x8f\xcd\x74\x7e\x4f\xe2\x74\xaa\xa6\xd1\xe4\x9b\xe7\x66\x20\x12\xc2\xb1\xc9\x2e\xc8\x82\x8c\x6c\xaf\xa3\xf9\x2c\x1d\xa6\xb3\x73\x21\x5c\x36\x02\xe7\xdd\xc4\x24\x2d\xe6\x30\x28\x75\x99\xb8\x50\x8a\x2f\x99\x6c\x23\x2c\xf2\xd3\x50\xef\x35\x0a\x7e\xed\x64\xae\xc7\xe1\x7c\x8a\x31\xd4\x03\xe5\x2b\xc4\x96\x51\x13\x37\x04\x25\xd8\x76\xd3\x60\xf0\x03\x38\xa5\x8f\xb2\x71\x8f\xd6\xad\x97\x62\x71\xda\xfd\xb7\xd8\x29\x88\x8e\x27\x92\xe8\xdf\x9e\x9c\x7e\x94\x13\xa8\x65\x94\x17\xf0\xb7\x71\x35\xb1\x0d\x83\x20\x29\xb1\xcd\x91\xdb\x3b\xf1\x53\xb1\x4f\xa7\x6a\x4c\x5a\xf6\xe6\x5b\xc4\xd6\xd9\xa6\x2b\xf9\x32\xdf\x6c\xd3\xeb\x6d\xd3\xd3\x64\xb6\x4b\x79\x84\x5d\x55\x73\xd1\x63\x99\x63\x47\x53\x54\xe5\xdc\xba\xd7\xc6\x6e\x4b\x32\x36\x43\xdf\xb0\x9c\x2d\xb1\x81\x71\x6f\x70\xb2\x4c\x4a\xa8\xda\x46\x93\xfd\x83\x7d\x3e\x6c\x10\x1a\x12\x35\x59\xec\xe1\x85\x08\x4f\x8b\x0a\xb0\x6c\x94\xcf\x9b\x04\x03\x70\xb2\x3d\x59\x8f\x64\x69\xb3\x76\x98\x27\xce\x6d\xa4\x12\x37\xa7\xd7\x42\xf1\x5c\x6c\xfb\x4d\x48\x0e\x8c\x83\xa0\x2a\xa8\xf3\x04\xd3\xc4\x70\xfa\xad\xb5\xd0\x2b\xd6\x9b\x9e\xe6\x7a\xb4\x79\xe7\x27\x7b\x68\xdf\xd9\x24\xba\xb7\x87\x94\x48\x7e\x15\x63\xf9\xfc\xd9\x96\x20\x02\xce\x31\xe6\xa4\x14\x0d\x61\x98\x9a\xa5\x27\x5c\x88\xa2\xdd\x41\xdf\xde\x64\xd8\xfc\x3a\x3b\x68\x1f\x5f\x76\xf7\x24\x47\xcf\x65\x5f\xd5\x64\xfe\xbb\x9a\xe3\xa7\x6b\x1d\x97\xf8\x6d\x49\xe2\x13\xde\x36\x39\x4e\x68\x76\x6f\x93\xc0\x84\x53\x20\x7b\x08\xa1\x72\x22\x65\x00\xc6\xca\x87\x36\x3e\x15\x28\x5e\x78\x93\xcb\xe9\x55\x40\x2e\xac\x74\xd3\x2d\xc9\xfc\x3d\x81\xa6\x64\x61\xcd\x17\x3e\xe9\x94\x02\x60\xc3\xd5\x3d\x61\xe3\xec\xb4\xef\x60\xcc\xae\x37\x04\xd4\xba\x31\xcf\xd8\x5c\x16\x51\xdc\xc7\x2b\x79\x5b\x77\xea\x71\x7c\xb2\x81\xda\x10\x4e\x0b\xa1\x81\xf4\xc6\xd9\x78\xc3\xf4\xcc\x66\x66\x2a\x61\x4a\x10\x12\xa7\x3f\xb6\x28\x83\xdb\xd5\x88\x62\x98\x38\x82\xac\x69\x64\xb1\x05\x88\x1b\x76\xee\x60\x6d\x25\xf4\x4a\xe1\xe5\x5d\x2f\xa6\xe3\x98\xb6\x13\x3d\xd7\xbf\xa0\xbf\xb5\x09\xbb\x5b\x2d\x35\xc7\x76\xd6\x52\xed\xba\x8b\x7c\xc5\x23\x9a\xa6\xd3\xa7\x75\x64\x56\x30\x8e\x6e\x66\x4f\xfc\x6c\x6d\xf5\xb6\x7c\x35\xc9\xef\x1a\xda\x8c\x42\xf2\x15\x00\x47\x06\x6c\x00\xc7\xf6\x46\xb5\x40\x62\x7f\xfa\xd4\xce\x27\x26\xcc\x76\xc6\x45\xa9\x86\x61\x31\x69\x69\x37\x48\x0b\x42\xf4\x1e\xc5\xa7\xa8\xf9\x87\xba\x82\x96\x64\xa8\xe3\xfb\xb9\xf6\x4b\x66\xb4\xdf\x7c\x63\x07\x04\x1f\xee\x6f\xdb\xf7\x40\x07\xc3\xfb\xdb\x15\x5e\xc4\x72\xdf\x31\x08\x1a\x3f\x39\x8f\x30\xf1\x50\x32\xa8\x90\x95\x22\xdf\x80\xa6\xb8\xab\xc5\x40\x36\x9c\x14\x33\xa1\x36\xac\x3a\xa6\x4d\x08\x48\x94\xb6\x0f\x3b\xe2\x8b\x3b\x1c\x3a\x10\x98\xae\x37\x4d\xaf\x2d\x35\x98\xc4\xae\x47\x6d\x06\xf8\x5c\x73\x40\x3a\x65\xe8\x9f\x30\xde\x58\xb7\x5d\x98\xc9\x6d\xaf\x05\x33\xf8\xe3\xe3\x68\x7b\x0b\x8f\x13\x6f\x4e\xed\x14\x3a\x69\x91\xbc\xa1\xc8\xf7\x7b\xe5\x3a\x89\x90\x2a\x9d\xa3\xe4\xc6\x57\xe7\x2b\x1e\x25\x7f\x4b\xce\xaf\x62\x9b\x11\x2e\x5f\x21\x6e\x8b\x57\xea\x6a\xd0\x95\x77\x19\xcf\x55\xc7\xad\x0e\x7d\xf4\x1f\xd2\x1e\xea\x8a\x77\x25\xe1\x96\x27\x89\x71\x81\xe8\x63\x18\x28\xe4\x73\xed\x51\xf6\x3b\x48\x5e\x31\xb9\x42\x24\xe3\x8d\xd7\x47\x9b\x20\xc5\xe4\x9b\x6f\x92\x93\xcd\xdd\x97\x07\x9b\x30\xb0\x93\x0c\xa8\x9d\x10\xf9\x13\xfc\x7a\xaf\xde\xb8\x1a\x63\x45\x78\x28\x14\xa9\xf1\xd7\x7e\xde\x43\xf3\x2d\xb6\xa7\x62\x83\xae\x23\x74\x89\x3c\x89\xa7\xf8\x3d\xe2\x4f\x98\x26\x1a\x7f\xc2\x0d\x26\x5b\xd0\x0f\xfa\xfc\x7a\x62\x3e\xc2\x9f\xf4\xe9\x15\xae\x9c\xf9\xca\xbf\xa8\xe0\x49\xb6\x18\x9b\xef\xf4\x83\x3f\x27\x43\xfc\x0a\xff\x49\x66\xd2\xff\x9b\x94\x2a\x1e\x1e\xf1\xcf\xe7\xc9\x78\x8e\xbf\x45\x13\x48\x3f\xa9\x60\x77\x32\xc9\x4b\x0b\x38\x41\x35\x16\x49\x92\x6b\x10\x90\x05\x56\xf6\xfb\x4b\xdd\xff\x30\x09\x58\xe5\xf5\x18\x48\x64\x3c\x23\x0d\x2d\x9b\xaf\xa9\x85\x36\xfa\xee\x4a\xfe\x5b\x32\x0a\x18\x26\xa7\x71\xef\xdc\xe1\x77\x70\x06\x3b\xcb\x87\x6d\x0e\xc7\xaa\xf0\x05\xba\x66\xf7\xd6\xf9\x84\xf9\x57\x8b\x74\x36\x14\x7a\x38\x47\x02\x48\xc6\x94\x1b\xf1\x83\xac\x59\x34\x8c\xcf\xf1\x9a\x0b\x8c\xff\xc4\x18\xf1\xfd\x41\x74\x30\x93\x91\x25\xc7\x99\xa5\x84\xef\x61\x2e\x7e\x46\x8b\x39\x5c\x7d\x9a\xad\x1f\xe0\x0b\x48\x13\xf4\xf7\xfd\x2d\x9c\xe8\x61\x02\x54\x41\x3f\xb7\x91\x66\x90\x7f\xf2\xcf\x6f\x71\xae\xcf\x52\xa1\x8b\xfb\xdf\xc9\xaa\xc0\xe4\xf3\x07\x04\xbe\x3b\x94\x52\x84\xfb\x12\x25\x0a\xfa\xb9\x75\x0f\x2b\xc3\xbd\xc6\xac\xd2\xd6\x77\x3e\x41\x6e\x6f\x19\x42\xdc\xde\xa6\xb6\xa7\x89\x90\xdb\xf6\x03\xf9\x6d\x08\x6a\xfb\x21\x61\xd6\xe7\x1f\x88\xd7\x5f\xe1\x70\xe1\x5f\xdf\x15\x28\x78\xfb\xfb\x80\x7e\xb7\x7f\x28\x92\xee\x83\x7b\x05\xb2\x7d\x80\xbd\x1c\x60\x22\x6a\xa9\xf2\xad\x4f\xc3\xf7\x69\xbe\x9e\xde\x6f\xb4\xe0\x4f\xc4\xf9\xe9\x16\xfd\x89\xe8\x3e\xdd\xa6\x3f\x11\xc2\xd3\x07\xf4\x27\x36\x7e\xfa\x90\xfe\x44\x14\x9f\x7e\x2b\x30\x10\xb9\xa7\xdf\xd1\x77\x44\xeb\xe9\xf7\xf8\x27\xcd\xd7\xd3\x1f\xe8\xcf\xfb\xd4\xc9\x3d\xfa\x9b\x3b\xa4\x1e\xb7\xa8\xc7\xfb\x5b\x0c\xe6\x01\x76\xfa\x62\x3e\x32\xf3\x7b\x9f\xb0\x0f\xb6\xc6\xd6\x16\x56\x7b\x9e\xcc\x62\x6f\x13\x7c\x79\xe1\x8d\x38\xdd\x12\xb9\x0d\xa8\xb2\x28\xb2\x51\x26\x5f\x5f\x30\x73\xb2\xf9\x9a\x2e\xf0\xbd\x04\xe5\xde\x9c\x0e\x12\x71\x58\x37\x42\xc4\xc9\xb9\x91\x4f\xa3\xfe\x9c\x83\x54\x32\x00\x3f\xe5\xaa\xe4\x68\x5a\x64\xd3\x0f\x78\x23\xee\x4f\xe3\xc1\x4c\x5f\x72\x38\x02\x41\xdb\xca\x71\x70\x04\x3c\xcd\x3e\x59\x08\xb9\x8c\x12\xa5\x23\x09\x92\x1e\x75\x03\xd6\xd3\x55\x35\xae\x42\xb1\x72\x89\x73\x29\x68\x8e\xed\xcc\x61\xbe\x70\x97\x59\x75\xd7\x5b\x51\x7a\x3a\xc6\xd8\x03\xe9\x8c\xa5\x2c\x91\x62\x29\xac\x8b\x65\xf5\x6f\x83\x59\x7b\x87\x92\x4d\xf0\xcd\x1a\x91\x61\x7b\xb2\xd1\xf0\x18\x63\xc1\x57\xda\xb4\xb9\x70\xe4\x38\xb1\x44\x2d\x95\x1a\x71\x46\x5a\xd1\x24\x1b\x9e\x0f\x50\x7b\x10\xe3\x33\x20\xdc\xcb\x49\x93\x87\xbf\x16\xa8\xb7\x1b\xb7\x4b\x16\x9a\xb4\xe2\xe4\x88\x05\x30\xf0\x5e\x92\x37\x5c\x03\x39\x47\xb4\xac\x95\xfb\xad\xe0\x8d\xd7\xa4\x44\x85\x3f\x0a\x08\x05\x72\xc0\x58\x9e\xeb\x4e\x32\xca\x40\xe5\x5e\x95\x8a\x97\xa7\x1e\x46\xab\x8f\xc4\x67\x92\x32\x34\xc1\xa7\x09\xfa\xc6\x73\x8c\x33\x45\x14\x46\x3c\xce\x24\xde\x7c\x41\xbe\x15\x73\xb5\x76\x99\x48\x29\x02\x67\xf4\x93\xb2\xd9\xa8\x13\x95\xdc\x3a\x8d\xc8\xea\x3d\x6e\x56\x4e\x5e\x1f\xf9\x57\xb8\xfa\x5e\x8d\xf9\xa4\xe1\x6c\xaa\x37\x14\xb2\x86\x7c\x3e\xc3\x73\xca\x49\x17\xe0\xdc\xa2\x47\x49\x3c\x96\x68\x58\x1c\xcd\x8b\xe1\xd8\x23\x93\xf6\x23\x1e\x85\x18\x17\x9c\x4e\x44\xb3\xf9\xe9\xb8\x94\xcb\xe8\x7c\x9c\xb2\xe9\x80\x7b\x87\x30\x69\x4d\xdc\xd3\x2b\x24\x6e\xec\x86\x08\xdc\xa7\xdf\xc0\x3f\xaf\x51\xe1\x95\xe7\x30\x20\xe3\x8d\x57\x90\xec\x3a\xdb\xdf\xd2\x7b\xdf\xb7\x37\x2e\x79\x5f\x51\x6a\x7f\x8e\x19\xe8\xd2\x64\x7a\x84\xd6\x9e\x57\xd4\x02\x15\x44\xba\x91\x00\xa5\xed\x28\xef\x77\x71\x9e\x67\x20\xbf\xe1\x69\x61\xdc\xc6\x05\x63\xe7\x88\x53\xc1\x4c\xfc\x8b\x17\xdb\x24\x8c\x1d\xbf\xda\x7c\x72\xf8\x7c\xe3\x19\x4a\x6a\x1b\xdb\x1b\x84\x78\xbe\xf9\x27\x24\xed\x0d\x1d\x80\x93\x52\x44\xbb\x07\x72\x3b\xce\xd0\x00\x44\xa5\x72\x94\x95\xe0\x38\x8e\x87\x48\x89\x2c\xba\xaa\x3c\x05\x9f\x7b\xb3\xe9\xd0\x7c\xa7\x23\x1b\x3e\x8e\xe0\xbf\xe6\x23\xcb\x62\xf0\x35\xc7\x3f\xf0\x33\x1f\xea\x95\x97\x7a\x8c\xdd\xe4\x4e\x30\x86\xef\x59\x24\xfc\x44\x73\x1e\x8d\xe2\x89\xa4\x0f\x57\x4d\x14\x82\x72\x27\x0f\x5f\x58\x26\x59\xae\x96\xd9\x32\x55\x68\xe5\x9b\x0c\x07\x2d\x47\xcf\xc1\xe2\x70\x84\x72\x07\x72\xdf\xbc\x8d\x90\xc4\xd2\x6d\x78\xde\x92\xf8\x94\xbf\x59\x31\x38\x17\xa5\x57\xb4\x77\x36\x45\x35\x01\x4c\xfc\x88\x5e\x87\x4a\x40\x59\x5f\x4d\x77\x2c\x7f\x49\x30\x74\x22\x1e\x6c\xbb\xea\xb0\x89\x41\x42\xcf\x52\x96\x0f\xd2\x3e\x92\xba\x49\x5c\x25\x01\xd2\xce\xc7\x30\x0a\xa0\x29\x16\x75\x1e\xb3\x77\x9e\x14\xba\x42\xd0\xe3\xa0\x6a\xdb\x29\xdc\x29\xe1\xc7\xe1\x44\x87\x46\xb5\x35\x55\x75\x04\xae\x85\x05\x7c\x12\xba\x29\xd0\xd2\x5b\xae\xfe\xce\xb1\x98\xd0\xda\x3f\x45\xb7\x6e\x39\x3d\xbd\x95\xef\xef\xe0\x90\x91\x58\x35\x17\x6b\x45\xa9\xcc\x47\xa6\x20\x9f\x49\x1f\x25\x53\x5f\xcf\x6b\x3d\xb0\x8e\x4e\xe4\x26\x4d\xfa\x57\xe4\xae\xc7\xf1\xf4\x34\x09\x9f\xa7\x56\x65\xab\xb0\xca\x2c\x05\xcc\x08\x0a\x5b\x5a\x10\x7f\x8d\x85\xa0\xfd\x4b\x02\xf2\x88\xb8\x47\xb6\x64\x12\xbe\x60\x8d\x02\x84\x18\xb9\xbd\x97\x72\x40\x27\x6d\x85\xfe\x1f\x70\xb1\xfd\x42\x2a\x65\x7c\x5f\xb2\x63\xbe\x88\x8e\x2d\xd6\x15\xf7\x11\xae\x51\xae\x45\x96\x31\xfb\xca\x5e\xf9\x18\x48\x5a\xf9\xb4\xe7\x3c\x55\x71\xa6\x9c\x1d\xd1\x80\x52\xe6\x1e\x0a\x93\x31\x80\x35\x63\xb4\x29\x69\x0d\x59\x56\x72\xb0\xc1\x26\x65\x28\x3b\xde\xff\xfb\xf1\x7b\x34\xe6\x43\x12\xdd\x5e\x17\x8d\x67\x78\x20\x71\xe0\x73\x4c\x22\x4d\x07\xd3\x6f\xf9\x26\x83\x7c\x6f\x53\xe2\xb4\x31\x9a\xb9\xdd\xb8\x8c\xb3\x4d\x88\x83\x22\x21\x0a\xa0\xf2\xdd\x26\x6f\x8b\x3a\xf2\xad\x7e\x5f\x1f\x4b\x1d\xb3\xa1\x6f\xbc\x42\xbf\xce\x86\x3e\xc0\x08\x7d\x50\xe7\xe9\xf8\xf2\xfb\x39\x3a\x1d\x66\x27\x80\xee\xd1\xf9\xe8\x24\x1b\xaa\xc2\xe8\xe0\x78\xff\xd5\xee\xf1\xe1\xab\xf7\x47\xbf\x3e\xff\xf9\x10\x63\x8a\x8a\x99\xbf\x54\x7b\xec\xd9\xf4\xe3\xd3\x03\x17\xb4\x53\x41\x85\x2d\x8e\x9f\xee\xbe\xfe\xfb\xfb\x22\xac\xc6\xff\xfa\x5f\x5a\xaf\x41\xb1\x39\x7e\x4e\x06\x78\xab\x15\xe0\x78\xeb\x6e\x97\xba\x85\x69\x2b\xf5\x7f\x08\xb3\x30\x52\x54\x5d\x5b\x13\xaf\x5d\xd6\x64\x12\x81\xfd\x8c\xa1\x80\xc8\x54\x4a\xa2\x11\xb3\x9d\x95\x8d\x54\x2c\xb6\x2c\xa6\x79\x4c\x8f\x6a\xb8\x25\x6d\xf2\x22\x09\x7a\x62\x26\x9d\xb7\x80\x5d\x84\xe6\xe8\xfc\x40\xda\xdb\x84\x42\xe4\x30\x63\xaa\x38\x79\x89\x7c\x68\x18\x3e\xc5\xd4\x62\xd3\x8f\x32\x68\x4e\x82\x22\x9b\xa2\xc8\x18\x5c\x2b\x97\x04\xe6\x72\x92\x68\x63\x8f\x23\xda\xd8\xc4\x05\xfe\xe7\x8e\xc3\x6d\x6f\x19\xa0\x37\x72\xaf\x0e\x12\x02\xdb\x18\x37\xc3\x55\x87\x12\xaf\xea\xdb\xa0\x02\x5d\xe1\xfc\x1a\x65\xd4\xf3\x4e\x12\x61\x79\x91\x5b\x5c\x84\x82\x04\x67\x9e\xac\x65\xeb\xd5\x3e\xff\x1f\x38\xd5\x0c\x2f\xbb\xf1\xb0\xfd\x37\x32\x38\x1b\x65\x76\xed\x4b\xc5\xf3\xff\x12\x11\xf6\x51\x25\xd2\x9b\x69\x22\x6e\x32\xd5\xc1\x07\xcc\x71\x82\x2b\x1f\x4f\xcf\xbf\x52\xc0\x7d\x7a\x4c\x35\x97\x27\x80\x83\xf7\x2e\xe4\xf3\x5d\x13\x14\xba\xeb\x24\x04\xe8\x81\x30\x80\x41\x48\x4d\xf4\x73\x74\x68\xe8\xc7\x98\x1f\x9a\x0c\x01\xf8\x22\x48\x91\xb2\xf1\x81\xb5\xe5\x64\x1c\xe1\x6c\x72\x1a\x5a\x9c\xcc\x14\x30\xd2\x3a\x05\xe8\x67\x73\xa0\x24\x4f\x35\xf4\xb8\x13\x9e\x15\xee\xa0\xad\x62\xbf\x82\xa9\xc9\x53\x80\x08\x50\xef\xd8\x35\x5e\x0b\x4d\xcd\x66\xe3\x4e\xc3\x31\xca\x63\x35\x9a\xa4\x52\x10\x5b\xdd\xa7\x19\xd2\xa9\xc9\x76\x87\xba\xd6\xa3\x5f\xfe\x62\x41\x18\x9b\x06\xb2\x5b\x3a\x47\xaa\x92\xc8\xc9\x7d\xf5\x50\x8d\xa3\x47\x30\xc1\x3f\x8a\xbd\x2e\xd5\xb2\xa1\xeb\x4d\x34\x72\x25\xde\x05\x2c\x1c\xbb\xa3\xd0\x03\x8a\xd8\x17\xaa\x19\xbf\xe4\x5c\x21\x61\xad\x81\xd9\xa9\x86\x49\x43\x72\x53\xd0\x97\x61\x3a\x79\x19\xcf\xce\xdc\x6f\xfd\x64\x90\xbb\xbf\x93\x21\x54\xca\xbd\x66\xa7\xee\x8f\x21\xd0\x62\xf8\x3b\x9e\xfe\x65\x1a\xf7\x31\xf5\x8c\x5b\x32\x09\x7a\x42\x9d\xec\x69\x36\x0e\x3f\x85\x00\x11\x52\x3c\x2c\x03\x88\x3b\xd6\xfd\x9d\xcf\xb2\x89\xfb\x1b\xcf\x4b\xf9\x6d\xe2\x43\x70\x06\x47\x59\xb4\xb7\xf7\x5b\x51\xe3\x11\x7f\x8a\x46\xe8\xdd\x30\x19\x26\x8f\x6f\x63\x83\xdb\x3f\x36\xb0\x6c\x93\x0b\x7f\x6c\xbc\x63\x51\x82\x94\xa8\x5e\x6b\xfa\x22\x95\xe5\x6f\xad\x3b\xd5\x8a\xdb\xb6\xe2\xa3\x19\xa5\xea\x79\x34\x9b\x6a\x9b\xe9\x8f\xf0\x3f\xfc\xd1\x01\xc0\xc8\x7e\x3c\xf5\x31\xfd\x78\xaa\x68\xe1\x5f\x5a\x6d\xe4\xe6\xf4\x20\x3d\xce\x1d\x18\x36\x35\xf9\x89\x68\x89\xdb\xd0\x5f\xef\x28\xb1\x4e\x03\xad\xd0\xb5\xce\xa3\x51\x3c\x91\x2a\xf4\xd7\x3b\xa6\x0d\xd2\xf9\xbc\xdd\x2a\xa2\xae\xd8\x42\x8d\xd3\x69\x36\xd7\xb6\xe6\xa7\x1d\x06\x13\x44\x72\x0a\x5b\xcb\x74\x06\x57\xee\x61\x3f\x4f\x66\xd2\xca\xfe\x7c\x27\x44\x02\xc2\x83\xa9\xcc\x22\x84\x54\xd5\x1f\x5c\x71\x36\x2d\x47\x4f\x66\x35\x98\x50\x1e\x75\x36\x99\x11\x8a\xd0\xd2\xd2\x41\x4b\x4a\x52\x22\x45\xf7\x3b\x4d\x43\xac\x25\x66\xe9\x75\x7a\x14\x94\x5f\x40\x3d\x17\xbf\x0e\xe0\x60\x2b\x7e\xc5\x7c\x4e\xfe\x57\xfa\x4c\xdf\xa6\x4e\x35\xe7\xb7\xb7\x93\x85\x40\xc2\xcd\xec\x7e\x96\xfd\xec\x7e\xb2\x5b\xda\xfd\x7a\x1a\xfc\x96\x7d\x18\x7e\xf2\xf6\xb6\x5b\x38\x29\xf6\x6d\x77\x78\xf8\xb5\x04\x78\x61\x9f\x7b\x85\xbc\xd5\xdd\x4f\xb2\xdb\xdd\x4f\xb2\xe1\xe5\x93\xfb\x9e\x68\x54\x05\x92\x21\x81\x98\x3b\x1c\xa5\x83\xf4\x74\x3e\xb5\x89\xe0\x66\x6e\xae\x11\x9b\xe5\x45\xcf\x90\x17\x87\xc7\xfb\x1d\x16\x80\x86\xf1\xef\x18\xf6\x8c\xcf\xde\xbc\xfa\xf0\x35\x60\x25\x6a\x82\x9e\x90\x95\x51\x47\x35\x27\x04\x65\x50\x21\x8b\x72\x1f\x0f\x47\x7a\x16\xb3\xfa\xe7\x55\x43\x6a\x51\xaa\x11\x1c\x4d\x0f\x09\xac\xa8\x64\x28\xcb\x38\x41\x0c\xe4\xda\x79\x35\x1c\x9c\xe8\x20\x24\xd5\xcc\x25\x13\x6a\x50\x7e\x4f\xcb\xdb\x0a\xfe\x8a\x8a\xb1\x9b\xcb\x40\x92\x6f\x00\x03\x74\x1f\xa6\x6e\xd9\xa3\x7a\x29\x14\x52\x9c\x1a\x48\x8f\x09\x96\x7d\x85\x34\x28\x7a\x99\x2e\x1a\x8f\x80\x9e\x3f\x44\x9b\x3f\x36\xe4\x6d\xd2\xb5\x68\xab\x6e\x84\x21\x79\x4c\x57\x77\xa3\x06\xf0\xab\xc2\xa7\x86\x7d\xed\x8c\x1c\x89\xe3\xad\x56\x42\x1f\x41\x3b\x71\x6d\xf2\x4f\xdc\xb3\x3e\x83\xe6\xd2\x51\xda\xf4\x27\xe7\xe8\x70\x3e\xab\x64\x07\x17\x93\xd2\x9b\x89\x25\x9b\x2f\x95\xdf\x61\x59\xb2\x86\x6f\x57\x72\x09\xbf\xb9\xe2\x5c\xfb\x8a\x43\x01\x2c\xb2\xe9\x9e\x9a\x02\x1c\x0e\x06\x79\x32\xab\x55\xc2\xa6\x1f\x93\x31\x25\x34\x92\x48\x39\x12\x54\x50\x7d\x65\x87\x49\x3c\xe0\x22\x54\x6b\xe0\x13\xae\xba\x5e\x86\x2c\xb0\x3c\xad\x10\xb3\xc4\x82\x22\xb5\xa4\x62\x81\xbd\x3d\x83\xae\x03\x77\x3a\x27\x19\x8a\x66\xae\x72\xf6\x8c\xcb\x49\x34\x47\x4d\xe5\x8e\x1a\x93\x29\xe5\x85\x7b\xc4\xd0\xb0\xc7\xa8\x38\x45\x97\x3b\x0e\x89\x8c\xae\x0d\xe4\x44\x24\xd7\x36\x71\x46\x22\x11\x7d\x11\x0f\x3f\x44\xf3\x89\x52\x0b\xde\xba\x90\x63\x13\xe8\x46\xae\x40\xe4\x75\xfa\x24\xa1\x5b\xce\x19\xdc\x1f\x66\xc5\xfc\x50\x2b\x4f\xde\x4f\xab\xce\xde\x11\xf7\x5e\x3d\x81\x21\xc7\x6c\xe3\xc8\xa5\x55\xc1\x6e\x23\xac\xe0\xb2\x35\x77\xba\xad\xba\x37\x74\x7a\xc6\xf9\x95\xc4\x10\x9c\xf3\xe2\xc4\xcf\x1a\xc6\x47\xb0\xcc\xb3\x6b\xcc\x12\x63\xca\x06\x24\xe3\x55\xe7\x0c\x77\xa8\x5b\x8f\xd3\xb3\x5f\x08\x14\x7f\x36\x45\xc9\x55\x98\xbd\xf2\x8d\xd4\x44\xd0\x2d\x01\x54\x48\x6d\xe5\x92\x2c\x56\xf4\xd2\x4a\x1d\xcd\xe2\x29\x6a\x09\xee\xb9\x1f\xf7\xc7\x7d\xfe\xb4\x6c\x65\x3c\xe5\xba\x9f\xdf\x89\x61\xd8\x2e\xf8\x00\x6a\xcf\x6c\xac\x37\xc9\xbc\x24\x86\x2c\x16\x2c\xd7\x7f\xf4\x58\xc6\xa3\x1b\x0a\x01\xfe\xf8\xd8\x1b\xa4\x47\x0a\xf6\x03\x23\xd0\xa1\xff\x6d\x39\x5f\xb9\x69\x47\xe1\x6e\x58\xec\x4c\xa5\x0b\x0d\x37\x74\xb1\xe6\x8c\x45\x27\x49\xd0\x50\x22\x73\xa9\xcc\x9d\xe4\x32\x2a\xaf\xc9\x92\x50\xb9\xac\x8e\x82\xee\xca\xbe\xd8\x37\x07\xd5\xa5\x0e\x2a\x8a\xdb\xf1\x0a\x30\x94\x1d\x7c\x30\xde\x53\x0e\x5b\x69\x49\xfd\xe4\x70\x8f\x1e\xb0\xde\x1f\xff\xfa\x72\x1f\xd6\xf3\x87\x3a\xc7\x6d\x64\x09\x4f\x44\x01\x76\xe1\x68\xdd\x90\x49\x7b\x09\x02\x47\x36\x8d\xa1\xd5\x8b\xaf\xf2\x2f\xd6\xe0\x23\x5e\xb2\x71\xc3\x59\xee\x5c\x94\xf7\x45\x87\x01\x07\x64\x90\x29\x88\x0e\x9e\x90\x2f\x37\x4a\x6d\x45\x21\xbf\x66\xa6\x9a\x66\x58\x4e\x46\xfd\xe0\x5b\x49\xdc\xad\x35\x8d\xd8\xa5\x47\x9a\xc7\x5e\xbc\x59\x2e\x84\xe0\xd2\x26\xaa\x5b\x74\x23\x71\x95\xe4\x36\xb1\x0d\xc2\x73\xb8\x62\x83\xd6\x8c\xd6\xd9\xa5\x37\xbe\xe2\x5f\x67\x97\x3a\x01\x43\x77\x29\x12\x5e\x56\x13\x23\xf6\x9a\x99\x71\xb9\x1b\x36\x2c\xf7\x35\xd3\xe6\xf2\x8f\xd6\x56\xaa\x35\x97\xc8\x7c\xf4\xcc\x2d\x6d\xf1\xd5\x2e\x36\x41\x1f\xcd\xb0\x0a\x39\x58\xff\x56\x0f\x86\x6f\xe9\x29\x9a\x4f\xc2\x74\x17\xf6\x63\xc9\x9c\x34\x83\xed\x27\xe3\x80\xf3\xb4\x5e\x47\xef\x98\x4c\xbe\x9c\x26\x03\xa4\x23\x0b\x9c\x5f\x17\x81\xee\x29\xe4\xac\x2a\x9e\x47\x28\xa9\x1b\x2d\xbd\xda\x32\x91\xf1\x29\xb9\xb4\x33\x34\xd4\x59\x3f\x42\x58\x4e\x76\xd2\x7e\x86\x71\x27\xb4\x85\x85\x8c\xef\xfb\xec\xf5\x4e\xba\x46\xb2\xb9\x12\xe7\x2b\x77\x49\x1a\x0e\x6a\xe4\xc2\x66\x5e\x17\x02\x56\x10\xfd\x24\x07\xba\xdf\xa2\xa3\x5f\x4d\xcf\xa1\x71\xa5\xed\xae\xd2\x40\xa0\x64\xee\x8d\xbd\x65\xe5\x05\x95\x38\xc6\x8d\xdb\xfa\xd7\xe1\x18\xaf\xc7\x27\x08\x2b\xe9\xb3\x9f\xc0\xcb\x2c\x4f\x25\x27\x42\xd1\x81\xbd\x3c\x06\x8b\xd9\xed\x39\x41\x88\x26\x02\xa2\x90\x30\x59\x4f\x56\x38\x39\xd9\x26\xc6\x75\x3c\x77\x13\x6a\xb0\x4a\x6f\xae\x98\xb5\xe0\xcf\x61\xfa\x21\xa1\x94\xd2\x3e\x9a\x5d\xb9\xdd\xa1\x3d\x32\x21\x41\x1e\x5f\x92\x84\x66\x9c\x9c\xb2\x8d\x10\x26\xdb\xfd\xd4\xa3\xc8\x0f\x67\x26\x79\x7e\x44\xd0\xe3\x29\x9a\x20\x35\x4d\x38\x0c\x40\x9e\xa2\xb7\x00\xbf\xa1\x74\x21\x68\xae\x84\x56\x34\xb0\x28\x3c\x3c\xbc\x6b\x95\xdc\x6b\xde\xd0\x80\xbc\x00\xb4\x5c\xbf\xf0\x06\xaf\xaf\xf4\x18\xbd\x97\x0c\x0f\xba\x9f\xba\x64\x6b\xde\x3d\xef\x46\x6c\xde\x18\x72\xb0\x8a\x35\x6a\xda\x1e\x2c\x3f\xb3\xdf\x48\x38\xe0\x89\x0e\xa4\x02\xbd\x10\x7c\xea\xe8\x42\x4c\xe2\xd3\xe4\xef\x2c\x5b\x7b\xde\xf5\x01\xab\x68\x33\x74\x74\xab\xd1\xeb\xc3\xb9\x07\xe3\xd7\x95\x61\x1c\x67\x93\x35\x73\xaf\x70\x98\x0a\xe3\x06\x98\xd9\x81\x14\x7a\x3d\x2f\x29\x65\x78\x17\x95\x9c\xa8\x62\x0e\xad\x8c\xf2\xdd\x8d\x9b\xff\x57\xe0\x38\x9c\x37\xac\x68\xd9\x6d\x1f\xf8\xdf\x03\xbb\x60\x45\xbc\x93\x22\xbe\xf9\x76\x77\xe3\x7f\xde\xad\x53\x54\x79\x59\x82\xbf\x2a\x24\xcc\x4f\xd2\x83\xce\x87\xd8\x46\x63\xb7\xb7\x38\xc5\xf6\xa7\x18\x2d\x9f\xad\x0d\xcf\x8f\x16\x81\x66\xe3\x24\xee\x7d\xc0\x37\xa5\x71\x7f\x2f\x1b\x66\xd3\xc6\x3a\xd7\x79\x14\xdd\xb6\x25\x1b\x3d\x2c\xba\x2d\x00\xe0\x26\x4a\x49\x9f\x6c\xa2\xb4\xbc\xc5\x4f\xee\x06\x2c\xa5\xf9\xe1\x54\xf5\x9a\x32\x4a\xde\x2a\xb2\xe9\x87\x5c\x2c\xcd\xc9\x2c\x8b\x77\x3f\x3e\x78\xc3\x81\xde\x07\xc8\x13\x10\x29\xd2\x4f\x08\x92\x43\xc1\xa1\xba\xa5\x3b\xca\x2b\x13\xa6\x69\x4a\xa3\xa2\x23\x96\xcf\x41\xec\x90\xb9\xd8\x33\xe3\x95\x50\xf7\x1a\xa3\xbe\x30\xfb\xad\xa8\xb1\xf1\xff\xbb\xdf\x58\x2f\xc9\x31\x5f\xd8\x66\xa6\x23\x67\x57\xdd\x78\x3c\x7f\xcd\x5d\x65\xa8\x6f\x95\xf3\x1b\x77\x9b\x69\xe9\x4b\xfe\xe6\xb3\x11\xf7\x47\xb9\xb3\x1d\xff\xcf\x28\xdf\xd8\x5c\xbe\x15\x0b\xc9\xfc\x96\xef\x4a\x33\x80\xcb\x6e\xcf\x4a\x30\xcf\xb3\xdf\xc9\x1d\x24\x65\xd3\x30\x03\x64\x63\x94\xfd\xbe\x31\x33\x25\xb5\x30\x46\x79\x05\x88\x3c\x80\x40\xe4\x99\x47\xb0\x2c\x30\x53\xe9\xef\x53\x10\x7e\x4e\x4f\x93\x1c\x6d\x59\xc4\x66\x77\xa4\x45\xed\x5e\x36\x62\x77\xde\x3f\xc9\xc6\xef\x63\x36\xc5\x31\x6d\x79\xe1\x05\x24\x7f\x90\x29\x22\xe6\x73\x14\xdf\x40\xec\xf5\xcb\xf1\x04\x3b\xca\x12\xe6\x50\xe0\x1c\x86\x4f\x18\x72\x40\xfe\x00\x08\x35\x96\xb1\x04\xd3\x8f\x91\xff\x2d\x8d\x75\xe0\xf0\x25\x66\xb1\x92\xa3\xd5\x8d\xb5\xdd\x1f\xc0\x41\x38\xbe\xed\x0c\xdd\xa1\xfc\xb8\xbd\x6b\x97\x34\x2d\xb6\xd9\x2d\x10\x02\xec\x8c\xc4\x46\xe3\x2e\xc9\x71\x51\xa8\xe4\xe5\xac\xa0\x9c\x5b\x75\xed\xfd\x0a\x5e\x5b\xf6\x0f\xa8\x6b\x1c\xd4\x30\xac\x2e\x86\x2b\xc0\x69\x10\x5f\x59\x62\x85\x73\x91\x49\x82\xb1\x62\xb2\x8c\xe5\x11\x98\x37\xa3\xe3\x2c\x8a\x3f\x66\x29\x45\x1d\x3e\xef\x01\x51\x49\xec\x80\x64\xdc\x3b\x6f\x91\xd3\x2c\x59\xad\xc9\x43\x1f\x92\x06\xa7\x44\x4f\x39\xa1\x98\x44\xde\xab\x9b\xfe\x37\x64\xc4\x37\x0d\xb3\x92\x81\xc8\xcc\xa3\x42\x0b\xde\xfa\xa6\x36\xe7\x71\xab\xba\x6e\xfb\x79\xfa\x29\x1d\x63\x05\x16\xe5\xdf\x57\x92\x56\xa7\x8e\xea\xe0\x4e\xe0\x98\x62\xee\x51\x50\x1c\x09\x3e\x46\x8e\xac\xa4\x7e\x49\x30\x4d\x1d\x86\x19\x8c\x3e\x8c\xb3\x05\x66\x27\x65\x1d\x10\x55\x69\x47\x07\x6d\xf8\x1f\x0a\xae\x49\xbe\xad\x08\x48\xc8\x5e\x62\x4f\x23\xe2\x5c\x37\x60\xa7\x4e\x0c\x6c\x28\xf5\xd8\xa9\xa4\xce\xbc\xb0\x16\xea\xe8\x50\x96\x0e\x4c\x98\x26\x0d\xec\xe4\x23\xe3\xb3\xdf\x34\x3f\x90\x52\x33\x64\xd4\xe7\x92\x65\xb3\x9f\x47\x88\xe6\x50\x0c\x9e\xad\x07\xaf\x6b\x83\x1f\xd6\xb0\xab\xc4\xfe\xdd\xc8\xb4\x28\x28\x5b\x7d\xe5\x36\x65\x10\x70\xf6\xcb\xea\xfd\xc0\xa9\xd0\x4b\xfc\xcd\xe6\x35\x5e\x23\xdb\xed\x8b\xf0\x09\x5b\xf6\x29\x19\xb0\x08\x75\x53\x86\x59\x8e\xb4\xcd\x0a\x78\x7a\xb6\x35\x49\xfc\x81\xdf\x49\x9e\x83\xd2\x44\x30\xc1\x0b\xac\xcd\x04\xc5\x8f\x9c\x86\x56\x49\x75\x7e\x4c\x01\x8c\x5c\x22\x88\x24\x57\x48\x9e\x0d\x3f\x92\xae\x20\xcd\xdb\xa5\x57\xf7\xdd\x68\x9c\x2c\x2c\xa2\xa2\xe7\x10\xbd\x42\x83\xe3\x71\x01\x55\x20\xc3\x6d\x2b\xb3\x9d\x51\x0e\xde\x80\x0a\xaa\xc8\x9f\x5e\xc6\x5a\x65\x68\x3b\xe6\xf8\xd2\xbd\x09\x58\x35\x56\x77\x72\x4d\xfb\x6a\x3e\x70\xe2\x02\xff\xad\xbd\x84\x7d\xb6\x29\x27\x9c\x97\xaa\x63\xcd\x33\xb8\x37\x00\xc3\xcc\xec\x94\xc2\x4e\x93\x88\xc8\x43\x3d\x7e\xbf\x74\x64\xf3\xeb\xe4\xb0\x51\x04\xd0\x19\x41\x10\xd6\x14\x3e\x65\x1b\xc7\xa4\x9f\xf5\xff\x55\xb6\xd4\xe4\xb0\x4e\x32\x1c\x8a\x02\xa3\x10\x73\x54\x33\x71\x25\x73\x38\x6b\x52\x8e\x38\x0f\x9f\x9e\xf2\x76\x45\x3e\x97\x0b\x13\xbd\xe0\x48\xc2\xcb\x90\x4d\x9a\x64\x7c\xd6\xc8\x41\x32\xb7\x65\x74\x8d\xc8\x7a\xd8\xcb\xce\x5d\x69\x70\x66\x19\xa0\xff\x5d\x3a\x8e\x60\x6b\xcf\xa7\x94\xad\x58\xb8\xef\x42\x8e\x11\xb6\xdf\xce\xc5\xf5\xb7\xad\x4f\xd5\xba\x29\x1e\x97\x9e\xc2\x62\xd9\x5e\x60\x7e\xcd\xc4\x49\xd6\xa2\xfd\xa3\x4d\x35\x2b\xf0\xec\xb4\x91\x66\xb0\xa7\x6e\xc4\xc6\x30\x5d\x4c\x3e\x74\x37\x93\x2d\x7b\x63\x9a\x58\x60\x1a\xde\x0f\x8e\xba\xf9\x48\x76\xba\x32\xec\x05\xe7\xe5\xd6\xac\x42\xce\xae\x6c\xbb\xd6\x65\x9c\xfb\xa6\x9c\x6f\xbb\x33\xba\xee\xcd\xa2\x46\xc2\x9d\xc1\xe6\xca\xa6\x9c\xbb\x35\xfe\x18\xa7\xac\xa2\xc3\xeb\x50\x6f\x9e\xcf\xb2\x91\x3b\x46\x13\xda\x99\x3c\xa9\x35\x71\xb1\x00\xd4\xb0\x86\x1c\xbe\x44\x0e\xb9\xdd\x57\xc7\xed\xe8\x90\xb9\x66\x06\xb8\x92\xfe\x94\x32\x0d\xf5\x35\xa8\x21\xc9\x82\x15\xb0\x66\x62\xbe\xc8\xb1\x39\xa2\x3e\xfa\x0e\xd3\xec\x90\x04\x8c\x86\xa6\x25\xeb\x8b\x3c\xd0\x1d\x77\xb0\x86\x81\x4d\x5e\xd0\xb0\x5e\xd0\x68\xae\x17\xa2\xd5\x95\xb2\x21\x21\x5b\x27\xc7\xb5\x2d\x63\x23\x12\x43\xd2\xab\x12\x26\xd7\x7a\x9a\xd1\x8b\x07\x5b\x28\x14\xde\x4a\xaf\x9a\xc6\xc6\x4b\x64\x83\x31\xb9\x9c\x3c\x0b\x58\x15\xa5\x06\xe6\x13\x26\x11\x19\xee\xd0\x3f\xe7\x26\xd9\x81\x33\xca\x35\x65\x1e\x25\x09\x6a\x1c\xd6\xfd\x55\x12\x4b\xa8\x43\x96\x26\xc9\x30\x07\x60\x85\x14\x51\x6c\xb1\x92\xf0\x51\x6c\xb6\x44\xf0\xa8\x6e\x38\x1f\xd7\xf6\x68\x96\x88\x58\x3c\xaf\xc9\x9e\xdd\xa0\x3e\x7b\x17\x56\x1e\xe4\x9f\x58\x63\x26\x8e\x8f\x23\x6c\x71\x66\x3b\x67\xa6\x80\x40\x30\x4f\x3e\xc5\xde\xfc\x0d\x03\x19\x52\x8c\x79\xcc\xd2\x2f\xd1\x15\x8d\x14\x01\x0b\xbe\xa0\x88\x39\x85\x09\x56\x0a\x5d\xd3\x80\x37\xb8\xd3\x17\x59\xc4\x66\xfe\xcc\x07\x9c\x68\x0d\xf8\xd6\x8a\x6f\x0d\xc0\x2f\xe0\x4e\x38\x18\x50\x02\xcd\xe1\x69\x36\x4d\x67\x67\xa3\x7c\x4d\x98\x02\x7a\x62\xe2\xee\x18\x9e\x63\xb8\x61\x56\x62\xc2\xe4\xd1\x93\x08\xc6\x7f\x00\x08\x19\xf9\x2c\x5b\x9e\xd5\x72\x18\xe8\x89\x64\xc1\x07\xb6\x36\x55\x93\x31\xca\xdd\x46\xd1\xb7\x2d\x32\x45\x04\x68\x93\x2d\x30\x4c\xb1\x37\xda\xf7\x34\xd1\x07\x70\xde\x7c\x52\x83\xac\xb0\x6c\x14\x9f\x26\xf6\x1d\xfa\x0a\xa4\x6f\x01\xa6\x39\x65\x62\x7a\x61\x2c\xca\x1f\x6b\xb0\x04\xbf\x5e\x75\xc2\x35\x53\x5d\xa9\x40\x0f\x0d\xd3\x3a\xd7\xb9\x1a\xcc\x51\xae\x35\xcb\x89\xb2\x82\x1c\x4c\x94\xaf\x9b\x1c\xa3\xc8\x25\x89\xeb\xaf\x99\x9c\x02\xe8\xc8\x44\x46\xa0\xc0\x4c\x75\xb1\xfb\x7d\x66\xf7\xe8\xbf\xe5\xc3\x69\x5f\x69\x4a\xa0\x81\xdc\x7b\x25\xed\xea\xfe\x27\xcc\x82\x82\xe7\x8e\x3d\xe3\xaa\x6a\x34\x75\xac\xeb\x41\xfc\x28\xf5\xca\x34\xf2\x6b\x99\xde\xa8\x52\x34\xbe\x84\x05\xb4\x7f\x67\xef\x6c\x3d\xbc\xdf\xaa\xd1\x3b\x74\xb6\xbe\xb5\xf9\xb5\x02\xbd\x42\x67\xeb\x7b\x9b\x94\x2b\x54\x1b\x74\xb6\xef\x6d\x95\x67\xe1\xaa\x4f\x23\xf2\xdd\x4d\x4a\xee\x7f\x9f\xb6\x4b\x96\xaa\xee\x5d\xfb\x75\xee\x54\x6c\xae\x8b\xf4\x98\x4c\x67\xc2\xcc\xf8\x59\xe7\x1c\x46\x83\xbb\xe8\x14\xef\x9a\x2c\x5d\x6a\x4e\x3a\x54\x0c\x28\x06\x2f\x19\x81\x28\xa7\xc8\x60\x03\x99\xcd\x01\x46\x6f\x9b\x45\x4d\x8a\xf9\xcc\xa9\x35\x4d\x1c\xc9\x75\x62\xd4\xb1\xa4\x82\xa7\x68\xa1\x14\x55\x9a\xe1\xa4\x63\x6e\x9b\x9a\xbc\x09\x24\xc5\x9e\x4c\xd1\xb9\x9d\x5c\x12\xf1\x27\x20\x07\x7c\x79\x4a\x2b\x84\x29\x42\x7a\x33\x49\x6b\xac\xaf\xee\x56\x83\x35\x42\x66\x77\x9a\x18\xd7\x47\x9c\x0e\x15\xad\x2d\xd3\xe0\x48\xc0\xb3\x33\x7f\x0a\xb9\xd1\x34\x19\xa1\x21\x30\x66\x59\x1e\x93\xb7\x3d\xa7\xc8\x34\x21\x81\x90\xdd\x73\xe4\x68\x0b\xaf\x6d\xdf\xfd\x5c\x65\x9a\xd9\x16\xc0\x18\x99\x38\x5a\x32\x57\xad\x28\x06\x1c\x5a\x51\xaf\x15\xf5\x5b\x11\x3e\x28\x5c\x31\xe5\x2a\x36\x90\xe9\xc7\xa3\xdf\x28\x49\x2c\x63\xe3\xf4\x2f\xc8\x5f\xf7\xa7\xd3\x6c\xda\x6c\x58\x0c\x4d\x3e\x51\xa0\xca\x04\x0b\xcd\xf4\xe9\x7a\x35\x42\xae\xa7\xb6\x46\x3c\x1c\xef\xe2\x8c\x00\x76\x56\x44\x8a\x7b\x7b\xec\xa0\x65\xaf\xa3\xcf\xd3\x31\xe7\x9f\xb2\xd1\xc3\xb3\x1e\xdd\x95\xfa\x3b\xe6\x0a\x80\xd1\xe9\x46\x5a\xb1\x9f\x7c\x84\xc5\xb2\xd6\x5f\x5e\xd6\x52\x75\xa4\xc2\x23\x2a\x1c\x25\x52\xa6\xdd\xb6\x67\xc9\x70\x42\xf9\x41\x98\xdf\x39\x77\xdb\xd2\xab\x00\xe9\x58\xa7\xa7\xc8\xe6\xdf\x86\xab\xf9\x6e\xc7\xaf\xe4\x1d\xfa\xcb\x26\xe0\xc0\x2c\xd0\x2f\x69\xc6\xe1\xbf\x3a\xde\x98\x78\x6e\xcd\x23\xc6\xe6\x9f\xf3\x4d\x7c\x29\x76\xd5\xa1\x72\x3a\x21\x7e\x6f\xb5\xff\xbb\x77\xdf\xed\x44\x17\xeb\xc1\xa0\xf8\xa2\x4e\xf8\xb4\x07\x53\x7c\x0b\x3e\xce\x5e\x52\x88\xa6\xfb\x14\xdd\x82\x92\x8e\xa0\x09\x57\x8f\x72\x9c\xd1\x26\x35\x24\xd4\xc8\x31\x6f\x6b\x44\xed\xd6\x2c\xb5\x19\x5a\xa8\xc8\xf4\x61\xda\x5f\x39\x67\xff\x77\x37\xd1\x59\xbe\xc6\x01\x93\x53\x68\x9c\x23\x65\xe6\x7f\x94\x11\x26\x00\xfc\x6b\x9c\x3f\x85\xab\x2b\x30\xdc\x9d\x35\xe4\x1f\xab\x58\x30\x7a\xcd\x28\x36\x41\x64\xed\x75\xfc\x00\xa9\x7a\x85\xaa\x28\x46\xf7\x3e\x85\x23\x35\x81\xf4\xe3\xe1\x22\x3e\xcf\x4d\x4c\x54\xd6\x90\x8f\x71\xcf\x26\x4e\xbc\xb7\x18\x84\x53\x59\x7f\x8e\x45\x30\x95\x18\x99\x41\x98\xa3\x7e\x36\x6a\x53\x70\x18\x3c\xd3\x16\xa7\x14\xe7\xe8\x4f\xf0\x71\x03\xfe\xcf\xc7\x66\x03\xb0\x19\x30\x36\x2b\x22\xdd\x6c\xa0\xff\x72\x63\x9d\xce\x0b\x4e\x94\x7c\xe1\xbf\x3a\xe4\xe4\x22\x34\xd6\x40\x77\xce\x09\xad\x24\xa1\x9e\xa6\x89\xce\xbc\xcb\x53\x4b\x5c\x59\x4d\xb4\x00\x34\x09\xd1\x20\xfa\x43\xf6\x5c\x45\xf6\x7c\x9a\xc0\xf5\x03\x4e\x4e\x89\x0d\xa5\x19\xa8\x31\x28\xfe\xf8\x54\xd2\x36\x74\x71\xa3\xcd\xba\xad\xa8\x3b\xcc\xe2\x3e\xfe\x97\x58\x47\xb7\xc5\xa6\x64\xec\x55\x6d\x5e\x89\x7f\xce\x30\xaa\x71\xce\xb1\xba\xcc\xe3\x74\xd5\x1b\x32\xf5\x8b\x4f\xb5\x47\x73\xb8\xa0\x7d\x8a\x38\xde\x16\xbf\xdf\x27\xed\xd3\x76\x74\x1b\xdf\xa7\x3e\xdc\xf6\xd3\x7d\x9a\x77\x11\x09\x90\xea\xbf\xd9\xe8\xc7\xc9\x19\x6a\x33\xdd\x59\x6c\x97\xbf\xae\x1c\x9b\x57\x95\xa4\x64\xea\x0b\x26\xbf\xd1\xff\x52\xc6\x61\xdf\xde\xb7\xdb\xf7\xda\xf7\xe0\x5e\x12\x35\xf7\x58\xc5\xf6\xf3\x9c\x7c\xce\x3e\x47\xcf\x0f\x8e\xc3\xf7\x18\x7f\xbf\x36\x83\x39\x68\xe9\x00\x1c\xc3\xe1\x25\xe1\x3c\x8c\x7e\x59\x87\xfe\xcd\x37\xd1\xad\x66\x03\x98\x11\x75\xf5\x8c\x02\xa0\x61\xc0\x57\xc7\x34\x37\x4c\x76\xed\x5f\x24\x49\x58\x50\xbc\xd0\xc2\x17\x35\x1c\x77\xc3\xe5\x52\x77\xa5\x34\x37\xa3\x81\xba\xb6\x9d\xd3\x9d\xb9\x29\xdf\x72\x2a\x97\xeb\xf4\x6b\x43\x93\xf0\x81\xa8\xba\x40\xa0\xcb\xdd\x19\x90\x12\x48\x8a\x89\x9d\xc7\x16\xfa\x94\xe3\xa0\x76\xb4\xbe\x8f\xa0\xaf\x9a\x7e\x6b\xda\xbd\x0b\x34\x33\x9e\x72\xcb\xc5\x1b\xe7\xd7\xe7\x6b\xf0\x21\x24\x65\x82\xb5\x38\x4b\x92\xa1\x1b\xfe\xd6\xe8\x68\x35\xfd\x0a\x70\x2f\x4d\x9e\x67\x0c\xb0\x55\x1c\xea\x52\xf3\xae\x12\x25\x46\x39\xf9\xe1\x6e\xbb\x64\x44\xab\x30\x1f\x0e\x1c\xda\x66\x8c\x60\x8a\x80\x64\x1b\xeb\x61\x9a\x09\x07\x6c\xc5\x65\x39\xa0\xde\xd5\x4c\xac\xbf\x5b\x29\xb6\xd1\x8d\x24\x70\x5d\x49\xe0\xff\x65\xef\xdd\xbb\x9b\x38\xb2\x45\xf1\xff\xfd\x29\x1a\x9f\xc9\x48\x0a\x92\x6c\x43\x32\x43\x6c\x1c\x8e\x21\xe6\xc4\xbf\x03\x81\x1f\x90\xc9\x9c\x65\x7c\x71\x5b\x6a\xd9\x1d\x24\xb5\xa7\x5b\xc2\xf6\x80\xef\x67\xbf\xfb\x59\xb5\xab\x1f\xb2\x6c\x1c\x66\xee\xba\xb0\xd6\x4c\xac\xae\xf7\xae\x5d\xbb\x76\xed\xe7\x2f\x59\x25\x9b\xd1\x8a\xcd\x07\x66\xf4\x94\xe2\x6e\x89\x2f\x33\xf9\x93\xd2\x1c\x43\x93\x06\x2a\xf9\xdb\x49\x32\xc3\x98\xd3\x74\x73\xf0\xc3\x4c\x1a\x92\x22\xda\xba\x56\x04\xd4\x8e\xdc\xef\xb8\x66\xa0\x6e\xbe\x73\x47\xbe\x9a\x90\x5e\x2a\x76\xff\xc5\x89\xd6\xbd\x7c\xf5\x91\x1b\x4e\xa4\x39\x5a\x6f\x53\x0f\xb4\x94\x5b\xad\x61\x49\x97\x2c\xa1\xda\x02\x9f\x26\x95\xde\x37\x57\xf5\xe1\x02\x54\x77\x45\x21\xc2\x1a\xcc\x90\xd2\x52\xf2\xca\xbf\x7e\xf5\x6f\xff\x22\xb8\x8f\x4a\x94\x3d\x4c\xc5\xea\xf3\xe2\x35\x27\xaf\x2c\x87\x5a\xf6\xdc\x1e\x72\x7f\xc5\xda\x59\x72\xd4\x8b\x4f\x4f\x8b\x35\x61\xb8\x7a\xc8\x3f\xad\x71\x18\x21\x78\x95\xae\xc1\xc4\x7a\x94\xf7\xb5\xa7\x57\x11\x06\xbe\xfc\x0f\xfe\x84\x18\xd4\x8b\xe1\x5e\xea\x15\xf3\xc9\x24\xce\xd9\x7a\x89\x82\xfe\x28\xd9\xa4\x89\x22\x0a\x16\x1a\xd6\x87\xac\x0b\x83\x60\x4d\x00\xad\xf2\xef\x59\x3a\xa9\xfd\xd6\xc3\xf4\x92\xe3\x20\xb4\xd3\x24\x4e\x83\x0f\x93\x6c\x1a\x86\x68\x12\xb4\x0f\x82\x38\x15\x05\xac\x73\x18\x46\x68\x02\x3e\x30\x08\xc4\x94\xc4\xf9\xe0\x24\x0c\xc5\x34\x6e\x88\xcc\xc4\xbf\x4b\x73\x9e\xe7\x41\xf5\xb3\x24\x79\x6f\x03\x39\x19\xca\x51\xde\x51\xd2\xfa\x05\x34\x04\x3f\x18\xf2\x81\x3f\x4b\x27\x76\xef\x97\x97\xbf\xbe\xa1\xf0\x91\x35\xb0\xdf\xa7\x06\xb8\x5d\x14\x1b\xb0\xa6\x39\x06\x46\xdd\x79\xb5\xbb\xd3\x92\xa0\x80\xf5\x07\xbe\x3c\x51\x73\xf8\xbf\xfa\x0c\x7f\xb1\xc3\xdf\x78\xf9\x31\x8b\xca\x77\x4a\x60\x3c\x47\xdf\x6c\x18\xbe\x3f\xf8\x7e\x74\x71\x77\x2b\x97\xa4\xce\xbf\xee\xa2\x2c\x5d\xa1\x80\xca\xd5\x6b\x2c\xba\xbf\x08\x37\xfd\x85\xe4\x57\xbd\x09\x4c\x19\x61\xe8\x57\x7f\xd9\x2f\x80\xa1\xbf\x67\xe9\xf4\x09\x1a\x51\x4a\x2e\xae\xeb\x07\xc4\x7e\x92\x4d\x8e\x28\x35\x86\xc6\xb2\x63\xa3\x4c\x22\x55\x6a\x0a\x44\xfa\xdc\x6c\x4a\xe8\xa5\xd7\xdb\xef\x70\xa1\xe5\x23\xb2\x00\xc7\x49\x0c\x78\x12\x3d\x14\x3a\xf6\x3e\xe0\x7f\xf3\xf8\xa2\xf4\x38\xef\xf7\xfb\xce\x1f\x76\x60\x26\xbd\xd0\xca\xdb\xac\xb0\xed\x66\xb6\xf6\x6d\x17\xc3\xc8\x42\x45\xeb\x05\xab\xa5\x2e\xbb\xa1\x5b\xc8\x36\x65\xd1\xf0\xa1\xe8\x31\xa8\x08\x75\xaa\x2f\x4d\x98\xf6\x33\x0a\x58\x01\x55\x9d\xbe\xc2\xc5\xb0\x88\x24\xb7\xb1\xd6\xf9\x31\xda\xd0\x31\xf0\x49\xd5\x26\x42\x90\xb2\xd4\x14\xfe\xfb\xd0\x77\x87\xbf\xef\xde\x35\xc1\x33\x74\x60\x3b\xce\x7e\x9a\x3a\x99\x31\x59\xc1\x69\x25\x1b\x08\xc3\x2e\xc6\x03\x02\xb8\x57\xff\xf7\x5d\x4c\x3d\x05\x6c\x2b\xca\x82\xee\x86\x6b\x54\x39\xbe\x4a\xf3\xbd\x03\xac\xb6\xae\x3f\xe7\x06\xfa\xe6\xf2\x59\xca\xb1\xf5\xab\xd6\xef\x0f\x38\xef\xef\x93\x8b\xe7\x29\x4a\xc9\x6e\x62\xd3\x7e\x9d\xc0\xb1\x4f\x54\x9d\xcf\x0a\x22\x60\xea\x12\x89\x79\x47\x2e\x5f\x9c\x46\xe3\x1f\x98\x47\x87\x95\xf5\x69\xee\xd2\xdf\x38\x37\xb3\x8a\x93\x0c\x4e\xe2\xc9\x8b\x67\x2f\x5e\xbd\xe6\xdc\x9a\xbc\x94\xf6\xc7\x23\x68\xc8\x86\x27\x18\xb2\x75\xc8\x7f\x5e\x6a\xcc\x68\x72\xdd\xb9\x20\x07\x1a\x68\xc6\xed\xfb\xd8\xc4\x94\xa7\x05\x95\xff\x8d\xec\x8f\xb6\xe1\x0d\xc8\xd5\xf6\xa5\x1d\x1e\x2f\xa7\x30\x04\x74\x9e\x45\x18\x4c\x10\x10\x07\xed\x17\xf0\x56\x85\x1d\x42\x72\x96\xe5\x13\x94\x89\xb2\xc8\x4e\xfc\x78\xc5\x34\x96\x24\x9a\x64\x8c\x86\xc0\x70\x2a\x49\x6c\x5c\x82\x83\x3a\xc0\xf2\xec\x88\x7f\xdb\x8c\xa2\x8f\xf0\x79\x63\x13\x3b\xdd\xe8\x62\x95\x7b\xf4\xf7\xbd\x4b\xae\xf5\x62\x3e\xa3\x6a\x52\x0b\xff\x5f\x6b\xe1\xff\x97\xe3\x64\xab\x15\x2f\xfc\xb7\xce\xba\xd7\xbd\x0b\x1c\x8c\xad\x42\x12\x2a\x79\x13\xdc\x9c\xf2\x01\x7c\xbc\x54\x42\x28\xb9\xb2\x6e\x6a\x1e\x06\x7d\xdb\x77\xf4\x0b\xf7\x10\xbf\x13\x26\x96\xc7\x39\xb0\x81\x52\xcb\xe3\x01\x50\xf4\xce\x66\xb4\x23\x64\x11\x2e\xa4\x82\x36\x06\xf0\x4f\x18\x13\xb2\xc2\x0e\xcc\xc5\xae\x33\x1e\x5b\x95\x11\xc1\xa6\x5c\x5a\xd4\xad\xd5\xa5\xde\x81\xdf\xe5\x58\x7f\x98\xb9\xcd\x64\xa3\xcd\x30\x0d\xc4\x3c\xb1\x91\xa8\x00\x82\xfb\x94\xa9\x6c\x5b\x81\x67\xc8\x6b\x4e\x99\x07\xea\xd4\x60\x6e\xd9\xd7\xb0\x06\xb9\x2a\xe4\xdd\x83\xaf\xfe\xbf\x5f\x86\x06\xbf\x18\x05\xe2\x2f\x80\x11\xaa\x26\x24\x9c\xb4\xc4\x0d\x88\x23\xa7\xa3\xc6\xbc\xbd\xd1\xb3\x04\x35\xa6\x38\xcc\x11\xca\xf0\xa3\xe2\xa2\x98\xc1\x2b\x93\x2a\x71\x0a\xee\x15\x71\xa8\x45\x2d\xeb\x38\xcb\x0a\x35\x3c\x8b\x8f\xd2\x71\x3a\x23\x71\xee\xf0\x62\x1a\x4f\x24\xfb\x1b\x12\x78\x4a\xcd\x26\x5c\x5a\x5c\x98\xac\xac\x68\x3f\x55\x24\xe3\x0f\x49\xd1\x8f\x5e\x8a\x93\x8d\x3b\x48\xe2\xb6\x1b\xe1\x08\xbc\xa0\x35\x68\x09\x40\x03\xea\x45\xb9\xc4\x67\x6a\x0e\x81\x48\x8c\xdd\xa1\x15\x86\xb7\xbe\xa5\x61\x69\x47\xe2\x99\x76\x02\x40\x83\x27\x7e\x3f\x22\x09\x2e\xcc\x8c\xec\x36\x62\x0e\x29\x02\x3b\x73\xa4\x7b\x4d\x53\xe4\x84\x82\xd4\x4d\xcb\x71\x20\xa8\x46\xa0\x68\xd6\xd9\xc8\x9c\x79\x8c\x9c\x42\xb3\x63\x68\x72\x42\x43\x0c\x8f\x40\xbc\x28\xa5\x60\x1b\xa7\xe4\xaa\x49\xb3\x91\xe4\x58\xb0\xdb\xad\xf3\x78\xe3\x5e\xab\xcf\xdb\xd5\xfe\xe8\x86\xd1\xdb\xa5\xbc\x44\xae\xcf\xa8\x80\x99\xd0\xa1\xcf\x7e\xf4\x8a\x3d\x29\xf8\xbe\xb3\x4b\x42\xe0\x67\x68\x8b\x1b\x93\x2d\x4d\x3e\x43\x03\xc9\x14\x75\x04\xb0\x4e\xea\x2f\x4f\xd8\x5e\x01\x81\x41\x0e\x19\x73\xb6\x76\xb6\xc4\xf9\xc5\x28\x20\xcc\x53\x4c\x81\xf8\xc2\x92\x67\xa1\x28\x01\xd1\x0a\x6b\x29\xe9\xd2\xaf\x37\x22\x60\x26\x4b\xa2\x8d\x56\xc8\x11\x3d\xb7\xea\x42\x7a\xd2\xe4\x3d\x4b\xf8\xe0\xab\x8f\xf4\x17\xa0\x3c\x93\xf8\x94\x6f\xb8\x46\x16\x2f\xdc\x7c\xd8\x27\x67\xda\xa8\x7e\x4e\x61\x0d\xcf\xf0\xb1\x9e\x45\x52\x24\x3a\x17\xb3\x43\x24\x35\xe8\xab\x7c\xc8\xd8\x4e\xbe\xcf\xf1\xe0\x44\x39\x42\xca\x53\x72\x36\x2d\x67\x9f\x23\x58\x30\xa9\xa1\x14\x94\x86\x99\x24\xab\x17\x29\x23\x5d\x2e\x87\x25\x2b\xe0\xf5\x59\xf4\x89\x3f\x33\x63\xa6\x44\xcb\x38\xdf\xc9\x50\x73\x9c\xc0\x06\xf8\xb7\x93\x63\x2e\x7b\x3a\x71\x9e\x07\x91\x99\xba\x82\xa9\x78\x96\xcb\x77\x99\xc9\x51\x42\xc4\x36\x8f\x31\x95\x23\xd9\x3a\xac\xb0\xc5\x9b\xe4\x1f\xf2\xfe\x0c\x6c\xa1\x1a\x8f\x66\x82\x63\x38\x59\xf2\x69\x76\x9b\x73\xe8\xb5\xe3\xb0\xf5\x1f\x52\xb4\xd1\xc4\x1e\x29\xdb\xa6\x5b\x5b\x3f\xda\x2b\xb3\x99\xc9\x79\x5a\x50\x96\x29\x9f\xf7\x88\x7d\x45\x48\x69\x3e\xec\xfa\xea\xd8\x1b\x4a\x55\xc5\x9d\xda\x03\x4c\x4d\xdf\x5c\x4d\xb6\xa1\x4d\x88\x36\x05\x73\xa4\x79\xd1\x6e\x4f\xfa\x4d\x6b\x1d\x52\x96\x60\xb4\x86\xa6\x24\x37\x0c\x24\x59\x90\x73\xee\x90\xdf\x0e\x67\x8f\xf3\xe4\xd4\xe7\xa5\x61\xf8\x3e\x8f\x4f\xdb\x9d\xfa\x52\x2d\x0a\x14\xf1\x86\xbf\x65\x6c\xaf\xf1\x6a\xd4\x45\x97\xe4\x6b\x92\xf3\x26\x60\x8b\xeb\x23\x6e\x3a\x60\x88\x08\xac\xeb\xba\xec\x6a\x2f\x46\xba\x60\x05\x68\x35\xf1\xed\x94\x9b\x46\x3c\x76\x0c\xb5\x13\x0e\x4c\x45\x6b\x1d\x76\x82\xfd\x86\xc7\x91\xd9\x40\x9d\xce\xd4\xc6\x98\x8e\xa4\xf3\xfd\xa9\x44\x70\xd6\xc9\x72\x1b\x99\x70\x57\x86\xe0\x5a\x5d\xb1\x78\x90\x61\xb7\xea\x04\x00\xdc\x6b\xfd\xeb\xdf\x41\xc8\x10\xfa\xaf\x89\x44\xbf\x04\xa1\x4f\x26\x59\xfa\xcf\x84\xb3\xe8\xbe\xe0\x37\xfd\x4d\x84\x7b\xcf\xb9\x9f\x42\x88\xac\x0f\x4f\xc5\x0c\xaa\x3b\x0a\x7c\xe2\x07\x68\x72\x89\x4e\x11\x8e\xcf\x53\x32\xdb\xec\x5b\x1c\x9c\x42\x3d\x6f\x0d\x29\x9a\x2a\xab\x6a\x6b\x6b\xcf\xf0\x0c\xe0\x72\x49\xdc\x01\x52\x1b\x12\x45\x38\x1b\xdf\x41\xa5\x7e\xd8\xa0\xcc\xf4\x48\x3d\xc3\xf7\x60\xad\x7d\xfe\x5c\x3d\x3c\xf4\xee\x92\x35\x77\x6a\x58\xa3\xa0\x35\x9d\xf7\x86\xf3\x52\x5e\xa0\x39\x37\x5f\x2d\xe5\xff\x55\x87\x09\x0f\x09\x05\x01\x25\x6c\x6c\x8a\xf5\xb0\xeb\xec\x84\x2a\x01\x1a\xb8\xe4\x46\xf9\x97\x6c\x0a\x38\x8e\x6d\x4e\x91\xcc\xd5\xd9\x73\x8c\x26\x6e\xf2\x5e\xd4\x10\xe7\xc4\x31\x01\x1b\x82\x4f\xc7\x42\xbd\x3c\x45\xda\x94\x16\x6c\xdc\x83\x47\xd4\x75\xc4\x8e\x56\xda\x15\xf3\x50\x6a\xcf\x57\x32\x84\x94\x5d\xc1\xae\x1c\xa6\x39\x83\x7f\xa2\x01\xfa\x9c\xe3\xde\x8f\xd1\xf5\x4b\x18\x0d\x7d\x99\xc6\xea\x3e\xeb\x0c\xe9\x89\x1b\x99\xe7\xf4\xec\xd3\x7d\x47\x7b\x6a\xc0\x27\xa3\x8a\x22\xe7\x83\xa3\x82\x33\x2e\xc5\x64\x9e\x84\x7c\x19\x3c\x9d\xd2\xc1\x7c\x1c\x93\xe3\x31\xb0\x88\x73\x5e\xa9\x01\x48\x99\xf8\x38\xee\xc0\x41\x8c\x76\xd7\x82\xd3\x75\x15\xea\xd4\x42\x37\x9c\x4b\x82\x14\xef\x0a\xc2\x9c\x20\x7b\x18\xd6\x39\x34\xf9\xf9\x3c\xfe\x07\xdd\x1b\x02\xe7\x30\xad\xad\x53\xbb\x71\x6a\x0c\x22\x3f\x16\xfd\xfa\x69\x41\xd2\x4d\xd5\x59\xbb\x11\x44\x8c\xe6\xc6\x76\x72\x33\xd9\xb7\xd8\xc3\x89\x18\xe8\xe4\x3c\x26\x53\x4d\x87\x43\x35\x62\xb5\xa5\x06\x66\x79\x9a\x4b\x06\xcf\x5f\xeb\x09\xa3\x9b\xdc\x35\x84\x5d\xc1\xd9\xdb\xbc\xf7\xe0\xfb\x65\x92\x3e\x3c\xf8\x6a\x1a\xfe\x05\x28\xaa\x88\xca\x51\xe8\xba\x52\xa7\x18\xaf\x09\xd2\xf5\x99\x46\xe2\x66\x44\xf8\xb2\xac\x8d\xb8\x69\x25\x16\xe2\x1a\xe7\xd1\x14\x88\x91\xab\x94\x4c\x8a\x97\x8d\x65\x67\xc9\xd1\xfb\x74\xf6\xd2\x4e\xa5\x0e\xd9\xc3\xce\x89\x93\x59\xc6\x96\xf1\xc1\x57\x5b\xc6\x2f\x8b\xba\xbf\x64\x67\xb5\xd8\x5b\xc2\xb7\x10\x4b\x4d\x41\x90\x67\x91\xf3\x29\x02\x62\x4a\xfc\x01\x8a\xa8\x58\xc5\xb6\xfe\x34\x3b\x6b\x77\x38\x58\x2a\x2c\x79\x90\xb0\xf3\xec\x48\xd8\x51\xb8\x23\xb1\xb7\xc3\x9f\x30\x70\x83\x54\x4d\x31\x4b\x28\xb9\xa0\xa1\x23\x0e\xc9\x08\xfa\xd1\x6f\xec\x88\x6c\x73\xcb\x3f\x85\x19\x8e\xb2\xf3\xe8\x61\xb4\xf1\xbd\xd8\xe1\xd3\xfa\x34\x8a\x33\x00\x56\x11\x04\xe5\xd0\x09\x8b\x1a\xd2\xe9\x28\x8f\x4b\xf7\x19\xf1\xd5\x25\x2c\xbe\x53\x5a\x44\xcd\x01\x8b\x7e\xa2\xb0\x89\x97\x15\x08\x02\xa0\xc3\x63\x81\x1d\xf4\x8f\x00\x38\x6d\xf3\xb1\x53\xa7\x25\x09\x7b\x71\x07\xc9\xee\xc2\x26\x10\x7d\x3a\x3f\x5f\xed\x21\xbf\xc0\xf9\xf9\xc7\x3c\x9b\x25\xce\x36\xfe\x6f\xf8\x96\x7c\x9a\xe5\x8f\xd9\x1f\xa6\x51\x2c\x99\x14\x83\xf8\x34\x31\x91\xb4\x7d\x9b\xf0\x78\x2d\xa8\x68\x8f\xdb\x2e\x55\xc3\x34\x2d\x32\x11\x79\xd5\x92\x77\x29\x5b\xb5\x63\xb6\x97\x53\x42\x71\xa8\x04\x47\xab\x92\x90\xfd\xdb\x4b\x69\xf4\x37\x6d\xca\x83\x87\x2c\xa3\xda\xab\x00\xb4\xb9\x58\xa3\xb3\x96\x58\xbf\x85\x70\x69\xd3\x40\x81\xf1\x55\x6b\x95\xfc\x1e\x9a\x97\xab\x6d\xee\x62\xd5\xfa\x8b\x66\xe1\x98\xee\xac\x2c\x02\xe9\xe6\xfd\xef\xf9\xec\x7c\x35\x27\xfc\x02\x67\xa7\x48\x66\x7b\x9a\xcc\x4d\xf5\x87\x92\xc4\xbc\x88\x9e\xbf\xde\x39\x3d\xfd\x83\x5c\xec\x7e\xfb\x79\xef\xcd\xee\xeb\x97\x3b\x4f\x76\xdf\xc1\x7f\xdf\x50\xf8\xd3\xfd\xe8\x6d\xfe\x76\xfa\x76\xf6\x76\x74\xb0\xc6\x21\xfe\x7e\x79\xf1\xcb\xdf\xf6\x5e\xef\x3d\x7e\xe6\x6b\x3d\x6c\xdf\xe9\xf5\x3e\x61\xa2\xba\x4f\xd3\x8c\x4f\xd4\xa7\x49\x32\x8b\x3f\xc9\xdf\xb4\x3b\x1d\xdf\xd5\xdb\xb5\x1f\x0f\x4c\x50\xd5\xd7\x89\x3a\x5a\x6b\x0a\x3b\x27\x86\xcf\x34\x67\x55\x97\x5d\xad\x59\xd7\x19\x53\x4a\xe2\x99\xe4\xa5\xc5\xc8\x0f\x8a\x3a\xd8\x1d\x65\x0d\x20\x6f\x95\x07\xcd\x69\x99\xaa\xc1\xd3\xf4\x08\xa3\x25\x35\x7d\x0f\xd2\x2c\x70\x82\x57\xbf\x31\x56\x21\xc7\xf3\xc3\x76\x7c\x76\xa7\xe5\x7c\x7c\x58\xc4\x1a\xb2\xb5\xb5\xe8\xb7\x74\xfa\x00\x53\x27\x16\x9b\xac\x10\xa6\xb8\xc8\x58\x43\x14\x92\xe9\xb4\xa0\x08\xa8\x2b\x26\x0e\x10\xef\x7a\x35\xc6\x1d\x17\xf4\xd1\x1d\xef\xd7\x29\x06\x7e\x7a\x86\x86\xd8\x4f\x65\x62\x3c\x9b\x65\x67\x1d\x2d\xee\xac\x6d\x7d\x87\xd5\x4c\xad\x7e\xa1\x24\x18\xeb\x78\x01\xd8\xb2\x7c\x38\x86\x0f\xd9\x7d\xb0\x89\xa6\xac\x53\x8e\xe9\x44\x74\x99\x23\xc6\x68\x2a\x63\x97\xef\xcd\xa0\x0b\x3d\xc9\xc7\x49\x3c\xe4\x90\x4f\xe8\x91\x1c\xa0\x47\x9e\x60\xbc\x99\x61\xbf\xdc\xf3\xd4\xeb\x52\x6a\xba\xad\xf6\x34\x65\xaa\xa1\x36\xad\x1c\x03\x71\x5c\x64\x24\x53\x88\x4f\x0b\x22\x5d\xce\xa7\x13\x0f\xdd\xfb\x02\xa3\xe0\x92\x65\xff\xd1\x1c\x95\x1a\x48\x23\xd7\xd0\x84\x3d\xfd\x90\x14\x6b\xf7\xd6\xd7\xbf\x5b\xdb\xd8\x58\xa3\x31\x11\x78\xef\x80\xe3\x7b\xc7\xd6\xfc\x12\x50\x45\x5d\xbc\x38\x1d\x28\x00\x70\x8b\x97\x0b\x90\xc2\xe1\x39\x1a\x24\x61\x0e\x69\xb9\xd3\x89\xc6\xdd\x8e\x28\x91\x80\x84\xf6\x23\xa1\x29\x32\x73\xbb\xcb\xfb\xb9\x99\xea\x61\x76\xc9\xa8\xa5\xb6\x8e\x0d\x55\x10\x4f\x9d\xd7\xd9\xf2\xf8\x47\xeb\x7d\x1e\x63\x28\x05\x20\x07\x40\x21\x37\x69\x95\x05\x9b\x0a\x0c\x31\x27\x2a\x05\x56\x48\x38\x5a\x0a\xa6\xbc\x9e\x9d\x61\xea\x3a\x51\xb6\x01\xf1\x95\x48\x60\xbe\x3b\x4d\xe0\x96\x4c\x55\x98\xc2\xec\xac\x4c\xa8\x1b\x60\x91\x0b\x24\xc6\xad\x8a\x39\x8e\x56\xf8\xce\x48\x11\x79\x96\xe5\x45\x62\xd1\x82\x20\x9f\x66\x39\x9a\x01\xf4\xf0\xbe\x20\xa4\x25\x84\x72\x5b\x00\x17\x4a\x7a\x7c\x1c\x74\xc6\x14\x8f\x52\x96\xd2\xd4\x27\xa8\x3b\x1b\xc5\x1f\x32\x56\x97\xd6\x0d\xe0\x1b\xbf\x79\xf1\xd3\x0b\x3c\x28\x31\x59\x19\x0c\x33\xce\x2f\x03\x38\x82\x22\x68\x9e\xff\x23\x6b\x2a\x1a\xe6\xbf\xb3\x06\xa3\xa5\x22\x8d\x18\xc0\xf2\x29\xde\x23\x17\x1a\x8c\x25\xde\x7e\x16\xbf\x25\x8c\xfe\x4e\x7c\x88\x52\xbf\x2c\x7f\x1f\x53\xc4\x6a\xe7\xe5\x8b\xaa\x3f\x5c\xd2\x2c\x3e\x2e\x30\x6f\x38\x8a\x05\xe3\x9c\xf7\x01\x5f\x32\x1e\x22\x28\xef\x4c\x73\x5c\x0c\x25\x54\x27\xc8\x11\xb6\x9f\x60\x9b\x69\x21\x36\x77\x39\x9d\xea\x69\x16\xb9\x9e\x49\x95\xa7\xfd\xa4\xd3\x1e\xec\x14\xa6\xdf\x60\xd5\x69\x79\x0e\xfd\xe8\x25\x6c\xc6\x05\xbd\xa4\x32\xc9\x75\xee\xa1\x4d\xc1\xa8\xb5\x2b\xdc\x98\x02\x97\x77\xc1\xc6\xf7\xec\x21\x7d\x51\x5d\x16\xaf\xc9\x5d\xf4\xc4\x45\xf4\xcd\x0e\x94\xee\xd6\x3e\x9e\x9c\x36\x23\x7f\x10\x9e\x11\x3f\xed\xaf\x8b\x2b\xe8\x43\xa2\xf1\xa5\x0b\xd7\x34\xb5\xfb\x08\x93\x7d\x95\x0c\x80\xcc\xe5\x4a\x09\x03\x14\xba\x08\xc2\xf2\xc1\x7d\x89\x11\x77\x99\x08\x5e\xf8\x8c\x86\x7d\xdb\xdd\xdb\xf9\xd3\xdd\xa7\x4f\xd1\x56\x80\x45\xb0\xd9\x8c\x0e\x1e\x60\xeb\xf0\x03\x70\x42\x18\x1d\x03\x00\xcc\xda\xde\x7f\x26\x79\xd6\x3b\x4b\x87\xb3\x13\x94\xbd\x31\x60\xfa\x21\x8e\x05\x24\x84\xfb\x46\xde\x96\xaf\x0c\x3b\x2e\xab\x93\xe1\x95\x18\xe3\x4a\x3e\x48\xec\x11\x0c\x53\x14\x1d\x2a\xe9\x3d\x94\x98\x34\x9c\xc6\xaf\x90\xc3\x84\x01\x34\x90\x63\x18\x8f\x6d\x7f\x4e\x40\x0c\xcf\xef\x11\x9e\xb8\x84\xfc\x5e\xd9\x40\x87\x23\x11\x2b\x95\xe4\x7f\x4c\x2b\x79\xa0\xfa\x5c\x9d\x7e\x5f\xb5\x5e\x1f\x08\x47\x2c\x96\xe0\xb4\x79\x1b\x9d\x4a\x36\xc2\x3e\xdf\x43\x7c\xb4\xb4\x61\xc7\xf7\x57\x0a\x1e\x82\xff\x7c\xf7\x0e\x28\xed\xf5\x2e\x74\x6e\x5a\xad\x34\xb4\x5e\x70\x3b\x3b\x2b\x6f\x09\xc0\x51\xf3\x6a\xb0\x64\x7b\x49\xc9\xd4\x57\x57\x8e\x2f\xf3\x3a\x30\x8f\xb4\xc6\xa7\xf4\xcd\x9f\x02\xb7\xf9\x10\xaf\xe1\x9a\x4d\x63\x5b\x62\x9f\xed\xfa\x1e\xb0\x19\xc7\x6e\xed\x45\x10\xf9\xf4\x62\xe4\x18\x75\x9a\x61\x30\xdb\xf9\x11\xb0\x81\x33\x94\x10\x90\xf3\xbb\x19\x18\x6e\x80\x6e\x14\x4f\x32\x18\x06\x13\x9c\xb1\x7a\xad\x98\x73\xee\x12\xe4\xd4\x8b\xe8\xe1\x51\xfe\x63\x94\xfa\xe8\x81\x38\xf7\x31\x4c\x26\x07\xb4\x98\x26\x67\x6c\x43\x0e\x24\xb6\xe8\x1b\x6e\x83\xf9\x35\xd2\xb1\xc5\x18\x5a\x56\xc2\xde\xdd\xe4\xc5\xe2\x0c\x59\xea\x5e\x2c\x66\x6f\xaa\xdc\x97\x37\x5e\x29\x27\x66\xc5\x38\x05\xf0\x8b\x5f\x2d\xcb\x32\xf0\x24\x11\x6c\x2f\x9d\x8e\xad\x63\x58\xc4\x25\xa7\x29\xb5\x1d\xda\x48\x85\x45\x02\x12\x6a\xac\xea\xfa\x85\xf4\xce\xb4\xbf\x9a\xe2\x75\x97\x90\x99\x74\xcb\x48\xbe\x79\xff\xc1\x5f\x89\x54\x7e\xcd\xf9\xf6\x25\x48\xe5\x49\x8c\x0f\xec\x5d\xf4\xbb\x58\x64\xfe\x22\xaa\x1a\xf1\x54\x41\x13\x6a\x60\x97\xe8\xfc\xce\x98\xba\x00\x3b\x7b\x2c\xce\x2c\x99\xb5\x8f\x46\xee\x90\x05\x75\x92\x89\x84\xa2\x98\xf0\x6b\x03\xf9\x2a\x34\xc5\x3d\x71\xf6\xd6\xc2\xb2\xd8\x68\xc7\xa4\x61\x65\xbf\x10\x79\xcb\xac\xb0\x49\xe4\x0e\xab\x9a\x8f\x7e\x7f\xdc\x0f\xa3\xef\x53\xdf\xa1\x3d\x20\xca\x0f\x68\x6e\xd8\x73\xd8\x6b\x25\xd1\xa4\xba\x8b\x86\x52\x49\x0b\x28\x34\x2b\xdb\x21\x5b\xb0\xc7\xfe\x50\xd3\x8c\x90\xab\xf1\x9f\x9d\x88\x92\x43\x09\x79\xe3\x36\x31\x10\xc6\x47\x0a\x06\x15\x41\x7a\xba\xd3\x2a\x78\x86\xee\xfd\xc6\x4f\xa9\xc7\xfd\xaa\xa7\xc5\x8e\x35\xdb\xc1\xdf\x75\x96\xca\x36\xd2\x37\xd9\xdc\x3d\xae\xad\xf5\xe9\x13\xf5\xc8\x7e\x17\x77\x64\xfa\xf4\xab\x53\xc9\x22\x6e\x02\x9f\xaa\xe9\x9b\x5d\xc2\x63\x5d\xc2\x24\xe5\x27\x24\x2d\x60\xa7\x66\x01\x8f\x4b\x0b\xa8\x9f\x1a\xfa\x9e\x34\xad\x6e\x99\xb9\x05\xc0\xaf\xa5\x67\x66\x4f\xbd\x7d\xd1\x0f\x4b\xb9\x7e\x7c\xb5\x2f\xfa\x43\xa8\x11\xde\xef\xbf\x92\x84\xe1\xf3\x13\xcf\x5c\x9d\x68\x25\x4c\x40\x71\x88\x0a\x0f\xb9\x77\x25\x09\x23\x7a\x7e\xea\x97\x2e\xc9\x97\xf2\x09\xb9\xf8\x6a\x2c\x2a\x91\x8d\x11\xcb\xa3\x31\xc5\x5d\xe0\x63\x27\x2b\x01\xfa\x96\xb1\x80\x86\xc5\x50\x38\x2b\x58\xf5\x2c\xcf\x2e\xe0\x53\x86\xd6\xae\x24\x51\xa0\x60\xc8\x64\xd7\x6d\x3b\xec\x47\x8f\x31\x41\xac\x33\xd4\x26\x22\xa6\x89\x61\x25\x7c\x34\x07\xd9\x74\x46\x4e\x88\x2e\x14\x6f\x13\xf6\x87\xf6\xed\x94\x3c\xee\x22\x32\xe8\x81\x3f\xc6\x94\x35\x17\x76\xba\xf0\xc6\x48\x98\x99\x16\x9e\xfb\x2c\x73\x90\x91\x9b\xec\x85\x0c\xa4\x6a\xcb\x0d\xdc\x6a\x69\x6b\x18\xd0\x4b\x05\x8c\xcd\x10\x5c\x98\x38\xa3\x19\x6b\xda\x66\x9e\x5d\x3b\x29\x4f\xb6\x4d\x0d\x20\x7f\x9c\x2d\x03\x33\xe9\xfb\xba\xfa\xd9\x86\xc2\xc2\x56\xec\xd7\xaf\xc1\x68\x4c\x3f\x5b\xae\x1a\xf6\x12\x56\x33\xfd\xfa\x20\x9f\xbe\xb7\x52\x18\xfb\xb0\xa0\x14\xc3\xde\x67\x85\xf1\xc3\x94\xda\x87\x05\xda\xbe\x36\x0c\xa7\x7a\x4b\xfb\xea\xa5\xf8\x3c\xfc\xcf\x2c\xd3\x27\x8c\x30\x8b\xaa\x24\x99\x08\x9b\xe0\x15\x50\x6e\x41\xb4\xfe\x63\x20\x59\xc8\x30\xe4\x76\xf1\x3c\x9e\x0d\xd0\x8b\xdc\x76\xf0\x8e\x8a\x2a\x7d\xf0\xe7\xad\xa0\x13\x6c\x26\x5e\xde\x6a\x5c\xee\x0b\xb1\xf1\xc2\xc2\x9f\xd2\x02\x8e\xe4\x45\x6d\x9d\x1b\x24\x32\xd1\x66\x77\xcc\xd2\xc2\xd2\x0a\x3a\xea\x5a\x3d\x56\x06\xb5\xcb\xa0\xe5\xda\xfd\xe3\x64\xf6\x72\x7e\x04\xd7\x81\x26\x2f\x68\x77\x3e\xbf\x87\xbe\x8d\x3e\x5f\x3a\x0e\x61\x5f\x0c\xaf\x5b\x18\xa6\x3f\xf4\x1b\xb0\x15\xf4\x77\x59\x01\x5a\x15\x13\x16\x2d\xb9\x5a\xfb\xba\x40\x5b\xae\x87\xe5\x80\xe6\x11\xf1\x16\x86\xb9\x29\xd0\x24\x3d\xd4\x52\x0b\x26\xd7\x27\x33\xce\xe2\xa5\x95\x8e\xd1\x82\x7e\x3e\x63\xbe\x35\xc4\x75\x51\x36\x9b\xe5\xe7\x77\xd5\x9c\x9a\xc6\xbd\x13\xd2\xe1\x2b\xe1\xc9\x13\xa5\xd0\x54\xd7\xa8\x8f\xaf\x76\x60\x05\xe2\x9a\xa5\xe1\xe4\xae\x49\x4b\x6a\x0f\x69\x4d\xfa\x03\x9f\x41\xaa\x36\x67\xd2\x35\x0f\x63\x2d\x96\x2f\x1a\xb5\xba\xd6\xab\x08\x67\x5d\x8b\x65\x17\xeb\x5e\x6e\xe1\xbf\xcb\xda\x29\x34\xaf\xbc\x7e\x0a\xcb\xad\x7c\xe9\x29\xdc\x3c\x57\x96\xff\x17\x64\xa4\xb1\xff\x5a\x0f\xbf\x29\xa2\xb5\x1f\xf1\x1d\xc2\xec\x2b\x27\x7c\x62\x8e\xf5\x08\xd9\xd3\x6f\x0a\x62\x99\xe1\x3f\x73\xe7\x6e\x4d\x5c\xbf\x0d\xb9\x6d\x3a\x44\x56\xa0\xfd\x4d\xd1\x09\x5e\x08\xc4\x05\xf7\xa3\x27\x9a\xd2\x49\xf4\x5b\x9a\xd0\x3d\x9e\x35\xf5\x36\xc3\xac\x18\xc3\x6c\xfa\xb6\x35\x73\x72\x4d\x66\x75\x85\x41\x56\x05\xa1\xe1\x2d\x3f\x24\x00\xdf\x86\xfe\x72\x12\x14\x60\xe2\xa8\xb7\xad\x9c\xb3\xaf\xc0\x3b\x25\x67\xc6\x1d\x06\x18\xb0\xdc\x23\x9d\xf5\xa3\x97\xc0\xd1\x16\x09\x5b\xb7\x0f\x16\x4d\x50\x32\xc7\xcc\x12\xcc\x0d\x30\xc5\xc0\xec\xb0\x5c\x58\x3d\x25\x0d\xc0\xe7\x0b\xe7\xf6\xca\x44\x56\xcb\xd6\x8f\x4d\xdd\xc5\xef\x25\x6f\x15\x45\x14\xd2\xf9\x71\x4c\xd1\x56\xdd\x0e\x96\xa9\x1d\xb0\x87\xad\x5f\xa7\xac\x1b\x77\x0c\x73\x6d\x4b\x77\xaf\x63\x93\x7d\x69\x73\xd0\x38\xc8\x92\x55\x4b\x6c\x61\xa5\x46\x29\x13\x9a\xff\x77\xd9\x48\x94\x2f\x2b\x0a\x1f\xc7\x23\x1b\xb6\x6b\x61\x10\x1f\x11\x23\xd4\x4b\x0b\x9a\x9e\x19\xd7\x30\xc5\x5f\x9c\x04\xe4\x87\xa5\x7c\xbf\x97\x16\x3d\x7c\xf7\x55\xf4\xb0\xb4\xe8\x61\x96\xed\x48\x9c\xad\x86\xe8\x74\xd7\x8b\xf8\x83\x19\x9a\x23\x8a\xdc\xd5\x23\x03\x07\x7e\x4c\xb1\xe7\x0e\x7e\x2d\x02\x70\xef\xbc\xdc\x33\xce\x43\xec\x09\x0d\x70\xc6\xd3\x23\x1f\x58\x76\xee\x42\xe8\xa0\x26\x55\xd2\x9a\x62\x78\x20\x7c\xce\x63\x67\x67\x09\xec\xab\xd8\x3e\x45\xc4\x4e\x14\x4c\x58\xc8\x7c\x85\x16\xf8\x34\xcf\x26\xcf\x31\xbd\x74\xf9\x6d\xcf\x33\xfc\xa4\xb8\xf5\x09\x41\x38\x86\x87\x79\x35\x34\x0e\x2d\xa0\x24\x1e\x15\xf0\x85\x11\x71\x54\xd5\x8b\x3d\xb8\x08\x60\x2c\x34\x7c\x9d\xc1\xa6\x70\xec\x77\x0a\xe2\x31\x73\x2e\xbd\xbc\xb1\x6c\x06\xa4\x8c\x9d\x89\x31\xdb\xa6\x98\xe3\xa8\xef\xc5\x98\xd9\xb0\x48\xee\x2f\x1b\x93\xa7\x17\xe5\x1a\x42\x20\xbd\x8e\x47\xb0\x2f\x1d\x94\x3d\xde\xd4\x65\xa8\x26\xee\x8d\x72\x30\x6d\x1f\x81\x36\x7c\x2b\xfb\xd4\x73\xae\xc8\x4d\x5d\xdd\x8b\x04\x54\x18\x9e\xa7\x84\x1e\x92\x95\x25\x19\x56\xdd\x88\x1a\x27\x73\xb3\xa9\x74\x38\x49\xd8\x4d\x41\x23\x1d\x1b\x55\xbe\x0a\x17\xca\x6b\x94\x30\x42\x68\x61\x8f\x9a\x44\x69\xa1\x9a\xca\xea\x3a\x9b\x7b\xfe\xcc\x29\x9b\x1e\xd7\x95\x73\x6d\xcb\xc7\x1e\x5a\x22\x30\x02\x36\xcc\x5f\x98\x06\x32\x1f\x23\x11\x37\x0a\xb4\xd3\xe9\x10\x48\x5f\x51\x5d\x44\x75\xac\x9a\x91\x3a\x2e\x4f\xdb\x0b\xe8\x79\x6f\xd7\xf9\x25\x1c\x73\x8e\x4b\xf5\xc0\x2b\xc8\x9b\xb8\x20\xd2\x51\x72\x71\x8f\x76\x38\x7f\x25\x9f\x74\xee\x4c\xc5\x79\x93\x04\xfe\x3b\xe4\x28\x06\x9c\x4d\x64\x38\xf7\xf9\xd7\x90\x66\x73\xbc\x05\xb2\xde\x79\x9f\x9e\xa2\xec\x34\xa6\x8b\x83\xa3\x6f\x71\x6f\xea\x4d\xd1\xf7\x4a\x8e\x92\x34\x5e\x59\xdb\x19\x90\xf3\x92\x5c\x8a\x51\xd6\xc7\xcb\xa0\x51\x9d\x5f\xbe\x13\x43\x0d\x48\xcc\xd3\x4e\x02\x13\x37\x80\xc7\xc3\xe8\x07\x9f\x2e\x48\x5d\x33\xa8\xcf\xff\xe0\xf9\x53\xca\x39\x0f\x26\x21\x1f\xe6\x56\xe7\x35\x3c\xc5\x65\x8a\x4b\x08\x34\x38\xbd\xd0\xb0\x3b\x47\x17\x1c\x4e\x88\x48\xb0\x92\x5f\xa7\x29\xe2\x80\x38\xac\x43\xea\x72\x4f\xc8\x0f\x6a\x3c\x0a\xcf\x64\x02\xfd\x2c\xd0\x5c\xe6\x34\x3b\x9d\x8f\xe3\x99\xa3\xbc\x6a\x52\xc8\x71\xc1\xf8\xdc\x32\x1a\x74\x82\x88\x06\x14\xee\x70\x5d\xc2\x1d\x8e\x6b\x62\x1d\x62\x58\xac\x34\x3d\x60\x3a\xaa\x11\x0e\x2b\x91\xb1\x6a\x38\x16\xc1\xe2\x5b\x0c\x8b\xf5\xc3\xd7\x9c\xfc\xff\x32\x06\x45\x22\xaa\x00\x64\x9e\x88\xb5\x56\xa3\xe6\x63\x79\x37\x6c\x57\xfb\x69\x1e\x1f\x37\x54\xd7\xa2\xa0\xbe\x0a\xa0\x7e\x06\x02\x32\xa6\x18\xd9\xe5\x66\xa5\x1a\xce\x84\xfe\x38\x99\xed\x91\xe2\x38\xcb\x9f\x96\xf2\xea\x07\x45\xb7\x9e\x57\x1f\x2b\xbd\xde\x7d\xb9\xf3\x6a\xe7\xcd\x8b\x57\x9a\xf9\xb5\x34\xcb\xbe\xab\xc0\x9d\xbe\xfe\xf5\xb1\x6d\xd2\xda\x34\x3a\x71\x36\x30\x25\xf5\x67\x9d\xc7\x37\xa5\xc5\x9a\x32\xbb\xc7\x66\xd3\xe8\x27\x9c\x62\xa4\x32\xa2\x2d\x6e\xeb\xe9\xf5\x83\x51\x68\x66\x68\x9a\x62\x92\xa0\x61\x9a\x7a\x49\x15\x37\xfc\xef\xe4\x82\x5d\x75\xf2\x67\x70\x50\xe6\xa7\x1a\x94\x7c\xbb\xb5\x09\xff\xb7\x4e\x17\x6f\xab\x4f\x3f\x36\xf8\xc7\x26\xfd\xb8\xd7\x22\xf3\x94\xc6\xee\x5e\x25\xc7\x94\x52\x6b\x6d\x7f\xbb\xbf\x79\xb0\x76\x2c\x75\x87\xe9\xf0\x37\x00\x1d\xe5\xb3\x7c\x1e\x9f\x16\x3e\x8f\xa5\xe7\xf9\xea\xa7\xd7\x9e\x78\xd9\xb6\x10\xa8\x45\xeb\xd8\xa7\xea\x07\x41\x42\x78\x89\x0f\x29\x61\xcd\x24\x80\x06\x3f\x76\x87\x68\x5f\x49\xee\xfc\xb1\xcf\x37\x4a\xd0\xa5\x38\x00\x45\x52\x09\xb0\x41\x81\x6c\xb4\xe2\x8e\xf9\x9b\x63\x93\xd1\xbd\x2e\x9e\xe9\x18\x68\x2e\x9e\xa2\xa5\x01\xde\x0b\xb6\x13\xe6\x41\x2e\xc5\x7e\x92\xd3\x90\xf1\x84\x0a\xce\xa8\x9a\x8e\x82\xc6\x6c\x7b\x3b\x73\xd1\x9f\x6a\x3d\xa1\x42\x0e\x1a\x70\xdf\x3d\x28\x01\x48\x6d\x37\xd1\x2e\x8f\xea\x55\x56\x7e\x09\x7f\xfe\xb3\x5f\x0f\xe9\x56\x4a\xf2\x26\xb8\xb3\x76\xcf\x4f\x81\xfe\xa5\xb3\x48\xdf\xd8\x32\x09\x8c\x3c\xf0\x6b\xb8\x2f\xed\xa0\xaf\xce\x96\x57\xf1\xef\x4d\x7c\x27\x5e\x0b\xea\x52\xb7\x32\x54\x94\x9a\x25\xb3\x15\x93\xd6\x13\x4a\xfa\xb3\x8c\xe3\x78\xb4\xef\xff\x25\xc8\xfc\xcf\x88\x10\xec\x24\x6d\xb8\x48\x40\x52\xce\xf2\x23\xb9\xba\xe7\x94\x80\x11\x2a\xe7\x78\x6c\xd3\xca\xfb\x05\xf6\x19\x1b\x3f\x09\xba\x62\x77\x11\x71\x37\xbb\x99\x3b\x1a\x17\x96\x41\xe5\xcd\xad\x54\x09\xd7\x42\x4b\x5d\xfa\xec\x32\xca\x11\xbc\x9b\x4f\x5d\xb7\xb9\x3c\x5f\xd1\x58\xf6\x02\x2a\x4c\x85\x8d\x2a\x6a\x58\xd4\xa1\x38\xdb\x25\xb2\xb3\x64\xab\x2c\x41\xc6\x64\x43\xb0\x4f\x32\x7a\x67\xc5\xea\x3c\x2d\x4e\x10\x9a\x68\x8f\x41\x8a\xe5\x89\xb6\xec\xf9\x58\xac\xc4\xf4\xf8\x9f\xa4\x88\x76\xfb\xd2\x2a\xfc\x26\xa7\x14\xc8\x02\xe5\x73\x4d\x29\xa3\x10\xf2\x7f\xf3\xb1\x71\x70\x36\x3d\x1f\x07\x8d\x96\xe0\xdc\x0d\xaf\x3e\x18\x75\x98\xea\x74\x86\xea\x03\xf8\x27\xef\x03\x58\x57\xd7\x82\xd2\x29\xab\xbf\x2d\xc7\xbd\xc0\x3f\xf0\x8a\x77\x91\x2a\xf2\x80\x08\xdc\xd1\xf5\x61\x28\xa8\xd7\xd9\x53\x74\xf4\x42\xfa\x2d\x6f\x72\x5c\x35\x26\x47\x47\xfc\x85\xc7\x67\xd8\x34\x20\x20\xd2\x96\x3e\x05\xf1\x4a\x12\x93\x02\x1c\xfe\x9b\x8e\xa3\x20\x69\xaf\xe9\xaf\x1a\x36\x28\x7a\xe2\x3d\x9f\x25\xce\x9b\x44\xa9\xc0\x20\x73\x7c\x25\x11\x2b\xd2\x2f\x03\x41\x39\x8b\x27\x1c\xf8\x0a\x53\x9d\x92\x9d\xc2\x29\x07\xbb\xf4\xa9\x45\xc5\xca\x2b\x93\xa4\x9f\xd2\x8e\x33\x6e\xe9\x2b\x2c\xd8\x4f\xb7\x6c\x0c\x0f\x32\xad\xae\x97\x48\x06\x65\xf2\x3a\x22\xd6\xaa\x24\x53\xa8\x72\x3c\x48\x88\xf0\x58\x69\x0f\x78\x84\xdc\x6e\xe0\x0f\x0f\x5f\xfc\xe5\xa2\x90\xad\x44\xe5\x55\xae\x78\x31\xc5\x2c\xd0\xd0\xfb\xf0\x1b\x2b\x5e\xc9\xc3\x2f\x51\xe3\x57\x26\xaf\x6b\xfe\x2e\x56\x0d\x36\x89\x14\xf2\xaf\x82\x17\xf1\x11\x26\xf2\x46\x79\x32\x9c\x6b\x4a\x50\x4e\x06\x21\x48\xa7\xd9\x9e\xde\x81\x63\xdb\x44\x41\x53\x5a\xef\xca\xb6\x45\x89\xe2\xb4\x2e\x15\x0d\x57\x5d\x91\x66\xce\x71\x45\xcb\xc5\x23\xd1\xb0\xef\x02\x3f\x97\xd9\x3d\x84\xa1\x8a\x75\xed\x6e\xe8\xfb\x0d\x5d\xed\x5b\x26\x89\x16\xd5\xe9\xe2\xf1\x92\x30\x7a\x14\xc8\x2d\x2e\xc4\x29\xff\x0c\xfe\xe2\x60\x38\x43\x89\xaf\x2a\x61\xef\xb5\x43\x7f\x29\x40\xaf\x24\xee\x2e\x88\xd7\x16\x1b\x92\x1a\xe4\x3a\x46\xe9\x92\x7a\x2c\xf8\x23\xcb\x9e\x57\xd1\x23\xc3\x0a\xde\xad\x5e\xbe\xba\xa2\x68\x9d\xe4\xd0\x16\xc5\xf0\x9f\x47\x33\xfa\x20\x6f\x59\x41\xfb\x0d\xb7\x83\x14\x86\x8b\x17\xae\x92\x71\xfe\x8b\x38\x08\x0d\x14\x2d\xd8\xff\x04\x8f\x3e\x3f\x05\x61\xbd\xfc\xcb\xae\x27\x78\x47\x68\x54\x22\x77\x72\x04\x5f\x42\x31\x51\x65\x43\xfd\xa3\x53\xde\x9c\xf0\xe4\x74\xbe\x1f\xee\xed\x69\xc3\xec\x33\xe1\xd8\x76\xb5\xf6\x7d\x80\x7d\x63\x43\xe1\x75\x49\x6d\x0f\xe9\x3b\x0a\x69\xff\xe9\x6e\xc8\x50\x6f\xfa\x4d\xe8\x18\x3d\x47\xed\x6e\x00\x1b\x54\xca\xb9\x1a\x79\x50\x52\x32\x54\x47\x59\xef\x06\x20\xd5\xca\x01\x98\xef\x6e\x2f\x22\x2f\x66\xe9\x5e\x75\xe1\x76\x30\xf8\x42\xc3\xfb\x4f\x96\xe2\xd4\x9e\x99\x70\x09\x24\xa7\xb0\x86\x38\xb4\x37\xf6\x75\x14\x3c\x89\xfc\x86\x7a\xe3\x21\x5f\xbb\x13\xe4\xd4\xd5\xef\x08\x1a\x57\x45\x22\x1c\x86\xbd\x08\x16\xce\x92\x53\xfd\x1d\xf6\x4b\x1b\xe9\xb0\x04\xf6\x24\x07\xfe\xbb\x6c\xb2\x23\x52\x0c\xf7\xed\xec\x04\x5f\xb8\xed\x3b\x6d\xec\xd7\xcc\xa1\x8f\x40\x6b\x77\x3a\xfd\x21\x6c\x6f\xa8\x17\x55\x54\xc3\x16\x7d\xe2\x71\xac\xea\xa7\x16\xdb\x6e\x0b\xe3\x16\x61\x1d\x1e\x07\x53\xb1\x53\x9e\xd4\xd2\x08\x78\x23\x24\xac\x41\x44\x0b\x8d\xea\xd7\x12\x42\x52\xfb\x0a\x52\xe2\xbf\x7a\xc4\x2c\x2d\xb1\xd1\x73\xea\x86\x36\x50\x9f\xa7\xa4\x2e\xbf\x4a\xc3\x05\xb5\x7e\x25\xc5\x33\x3d\x57\xe1\x3a\xf1\x5c\x06\xbf\xc5\x2e\x92\x59\xc4\x31\x62\x7c\xe2\xd0\x68\x8f\x5d\x5c\xaa\x7a\xd6\x16\xca\xe2\xf3\x94\x02\xbe\x8d\x23\x49\x23\xcb\x57\xd0\x84\xc4\x57\x47\x89\xf7\x99\x56\x85\x4f\xca\xfe\x72\xd5\xce\x8a\xe4\x1f\xf3\x04\x2d\x1b\xd7\xf8\x20\x50\xb0\xdf\x11\xb2\x8c\x70\xdf\xd9\x2b\xb9\x50\x27\x19\x97\x35\x9b\x36\xa4\x4e\x17\x5a\xf3\x44\x0f\x4d\x05\xbc\x12\x14\x2f\x64\x25\x07\x24\xc1\xd4\xc4\xf1\x78\x98\x2f\xa2\xfd\xf7\xdd\x0f\x07\xd1\x6c\x7e\x8a\x82\x1c\xa8\x75\x42\x22\xb4\x58\x02\x5c\x1a\xaf\xbf\x1b\x1c\x6a\x72\x95\xa2\x51\x9a\x0e\x36\x62\x12\xd5\x28\x5b\x49\x28\x3d\xa0\xc2\xfd\x8d\x83\xad\xda\x13\x50\xa1\x07\xb7\x47\x11\xa2\xda\xb7\x07\x4f\x67\xfd\xa0\x53\xee\xa9\xdc\xb8\x81\xa0\xac\x77\x82\x7a\x9d\xea\xb2\xae\x45\x51\x6e\x48\x53\x6a\xa9\x4a\x13\x5d\x69\xa4\x2c\x4d\xb4\x65\x11\x75\x29\x2d\xb9\xaa\xb4\x17\xc5\x3c\x53\x9c\x90\x03\x17\xe5\x96\xc7\x94\x9b\xaa\x83\x1c\x00\xf0\x4a\x73\x59\xba\xb0\xfd\x86\x5f\x49\xab\x06\x92\x92\x5a\x63\xd7\xbc\xd4\xe2\x29\xf5\x8e\xf9\x52\xa8\xcb\x2d\xca\x24\x16\x64\xcf\x57\x6b\x6d\x1f\xea\xd9\x57\x47\x12\x05\xb4\x80\x8d\x43\xdc\x8b\xdb\xa4\xcd\x0f\x74\x4b\x0d\x93\xee\x04\x77\xf9\xc8\x0b\x73\x03\x09\x6e\x5f\xf2\x2a\x54\x39\x00\xc7\x18\x8a\x93\x86\xf6\xd0\x29\x91\x7c\xfd\xbe\xd8\x27\xc3\x41\x17\xc5\x86\xd2\x82\x7c\x4a\xbe\xe8\x85\xde\x28\x38\x58\x78\x6e\x97\x39\xb5\xff\x8f\xf2\x00\x9e\x65\x35\xf9\x88\xc3\x55\x7a\x31\xcb\x1b\xe9\xda\x5c\xc4\x2e\x1a\x3a\x1c\x68\xc9\xbc\x81\xb9\x3c\x39\xb3\x07\xe6\x34\x47\xbd\x70\xd1\xd7\xfa\x87\x14\x16\x15\xfb\xe2\x1b\x97\xe2\x28\x1c\x25\xa6\x8d\xba\x9d\x39\x69\x92\x0b\x62\xdf\x8b\x0e\xeb\x0e\x2f\x39\xb1\x87\xa3\x50\xfa\xb3\xce\xe1\x72\x8d\xc6\xc9\x68\xf6\x32\x9e\x26\xae\xd0\xb7\x66\xd5\x54\xe2\xbb\x10\x98\x1e\x0a\x83\x91\x9d\x8a\xc2\x48\xfd\x38\x9c\x00\x59\xc3\xcf\xcb\x62\x44\x3b\x85\x82\xee\xdc\x08\x59\x88\x57\x11\x95\xd2\x5c\x24\x34\xc5\x0c\x03\x62\xc4\x83\xc1\x7c\x82\xaa\x47\x56\x83\x62\xe2\x91\x0b\x94\x87\x1f\x33\x05\xc5\x61\xb0\x43\x35\x2c\x21\x19\x11\x43\x74\x94\x92\x77\xde\x38\xc1\x60\x05\x15\x67\x8f\x66\xf9\x98\x24\x14\xb9\x4a\x22\xf5\xc6\x09\xa2\xe6\xa7\x5e\x9e\x43\x13\x73\x32\xa9\x2b\xa5\x51\xfa\x5f\x72\x3a\x76\xc0\xf8\x63\xc5\x4c\xe6\xfd\xef\x03\xd9\x97\x26\x66\xe4\xf1\x5e\x46\x13\x48\xdf\x65\x7a\xeb\x5b\xa5\x13\xd3\x74\xde\xfd\xa0\xad\x16\x10\x9c\x45\x63\x37\xe8\x7b\xab\x1d\x7f\x6e\x94\xd8\x50\x01\xb8\x79\xef\x87\x8d\x6e\x93\x7e\x0f\x0a\xc9\x9b\x37\x54\xe2\x6d\xde\xff\xcb\x77\x75\xe1\x66\xaf\x34\x85\xfb\x1a\xe5\xfb\x5f\xa5\x69\x66\x9f\x2b\x56\x43\x46\x2e\xae\x5a\xc9\xf8\x64\x93\x5c\x6d\x1b\xf4\xcf\x40\xd0\xd2\xe3\x92\x6e\x57\xd2\xa7\x70\x91\xea\x6c\x35\x71\x8f\xa9\x47\x9f\xae\xab\xfb\xad\x24\x6b\xf9\x78\x59\x4d\xcf\x52\xf6\xe5\x45\x04\x69\x1b\xbd\x5a\x28\x3b\x3b\xef\x94\xce\xf1\x39\x7a\x5a\x0c\x62\x78\xe7\x6c\xad\x04\xec\xe9\xb9\x71\x41\x38\xaf\xe5\x53\xa5\x07\x5e\x7b\x1b\xd3\xb6\x9c\x5b\xb7\x8d\x76\xa7\x1b\x9d\xdb\x5e\xc3\x71\x9d\x43\x3e\x27\xfd\x7b\xfe\x7c\xe7\x97\x9f\xde\xbd\xfc\xf5\xf5\xcf\x9a\x3c\xa8\xfd\xf1\x4f\xa7\xf3\xe2\xc4\x27\xfb\xb3\x15\x7f\xfd\xe5\xf5\xcf\x7b\x4f\xdf\x98\xba\xf3\x69\x71\x92\x8e\x66\xf5\xd5\x5f\xbf\x44\x64\x35\xb5\x0b\xd4\x15\x25\x0d\x95\x77\x6d\xbf\x45\xd2\xd0\xe7\xf3\xdd\x57\xff\x65\xbb\x9c\x24\xf9\x71\x43\x8f\x3b\x2f\x5f\x3e\xfb\x1f\x53\x35\x3e\x3d\x1d\x5f\xf8\xaa\x54\x77\xe7\xd9\xb3\x77\x52\xff\xf5\xbb\x67\x7b\x14\x5f\x6f\x1f\x60\x64\x41\xd3\x35\xbf\x05\x02\xf6\x13\xaf\x32\xf8\xb2\x1b\x54\xa0\x29\xdb\x0f\x34\xb1\x95\x83\xba\x29\x30\x14\x28\x38\x71\x65\x6a\x7d\xb8\xb6\x76\xe1\xb2\xf3\xa1\xe1\x80\xc3\x9f\x00\xc5\x64\xd4\x28\xf7\xb3\x2f\xa5\x07\xee\x31\x4f\xab\xf6\xb1\xdf\x15\xf1\x09\x47\x9f\xc4\x45\xc2\xc1\x2d\xbb\xc4\x14\x61\xb2\x15\xd3\xf9\x4d\xdf\x46\xe1\x39\xe0\xe0\x99\x62\x17\xc7\xa4\xa1\x0d\x0f\x20\x35\x55\x8c\x66\xc0\xcf\x24\x24\xa9\xfe\xa6\x10\x7d\xab\x4a\xef\xb7\xa2\x63\xa0\x71\xdf\x14\x6a\x90\x2e\xb3\xeb\x8a\xa4\x93\xb2\xef\x94\x9e\x37\x75\x63\xf3\xdb\x86\x64\x94\x30\x26\x2b\x16\xb7\xe9\x6f\x07\xae\xad\x5b\x5b\xae\x1b\x62\xc1\x92\xb1\xce\xe2\x05\xbb\xd7\x5f\xeb\x27\x78\xe6\x61\xb6\x33\xc0\x03\x04\x13\xd4\xc7\x67\x09\xdb\xfc\x13\xd7\x83\xda\x74\xab\xf2\x78\x54\x07\x2c\x37\xab\x2b\x00\xe6\x67\xdf\x61\x1e\xc1\x1b\x6b\xf0\x32\x0c\xb6\x7c\x1e\x92\x08\xbd\x23\x50\x58\x92\x57\x81\xda\xff\xc0\xe2\x9d\xf2\x37\xf6\x5a\x52\x54\xe9\x4b\x25\xe6\x84\x87\x29\x27\x10\x55\x63\x0c\xb4\x96\x71\x60\x24\x68\xf7\xa3\x2a\x34\x31\x5f\xf2\x1c\xae\xe6\x8f\xdf\x14\x9b\xc8\x8b\x5f\x2a\xfc\xaa\x47\x11\x33\xf0\xb6\x81\xb3\x52\x4b\x5c\x73\xf4\x2b\x60\x6d\x5a\x9e\x58\x6d\x36\xe5\x1b\xe2\x53\x68\x3a\x76\x97\xc8\xcd\x05\x15\x72\x71\xa2\x7e\x9e\xfa\xef\x04\x21\xb4\xf4\x3d\xd7\x7a\x12\x4f\x11\x7a\x64\x5a\x44\x71\xf2\x48\x82\x87\x40\x94\x27\x7d\x29\x67\xe1\x37\x85\x73\xcb\x08\x01\x51\x06\xc5\xe2\xf1\x05\x20\xfe\x39\x88\xc7\xd2\x74\x78\x10\x28\xc3\xf0\x71\xea\x0e\xb0\xb9\x85\xf9\xa0\x5f\x03\xb4\x44\x9f\x3b\xd6\x25\x9b\x2e\x95\x17\x68\xea\x1c\xce\x81\x6a\x8a\xe0\xe1\xe6\x9b\xe0\x7a\xf7\x57\xbd\x1f\xb0\x82\xfe\xc1\x01\xf8\xa6\x10\xca\x81\x36\x4b\x4a\x3a\x48\xa4\xf5\x56\x5a\xbd\x6d\x29\xe1\xa8\x6c\x89\xbb\x87\xec\x24\x6a\x36\x69\xd9\xf9\xa9\x9c\xe8\xe6\x90\xf0\x5b\x18\x3a\x5e\xca\xb6\x5e\x03\x16\xfe\xe6\xb8\x11\x34\xdc\xa0\x35\xe0\x58\x7e\x92\x0a\x10\xc7\x9b\x49\xa5\x6e\x1d\x16\x75\x02\xdd\xfc\xd5\x58\x8a\x9c\x88\x43\xd2\xab\xee\xee\xa0\xd1\x96\x23\xfb\xfb\xf6\xfb\x41\x95\x9f\x40\x83\xc2\x30\x2b\x3a\xcd\xbf\x8f\x1c\x21\x17\x8a\xaa\xf1\xba\x93\x17\xb6\xe9\xda\xf3\xd7\x76\x35\x4b\x90\xa2\x6b\xac\x42\x78\xd5\xcf\x5a\x08\x33\x7b\xb7\x40\x89\x9b\x19\x23\x40\xf2\x5d\xe5\x0e\x90\x2b\x88\xf5\x7a\xaa\x61\x0e\xaa\x64\xd7\x31\xa3\x96\x2f\x5a\x9e\x33\xba\xbd\x25\x85\xc4\x9b\xa6\x75\xd0\xa9\x39\xc6\x57\x73\x42\x64\xf9\x45\x8e\x4e\x55\x9e\x68\x59\xae\xa8\xa8\x63\x8b\x9a\xc0\x56\x37\xf5\x2b\xa1\x58\xbb\xde\x4e\x1d\xe6\x4a\x61\x15\x71\x61\xa7\x8b\xdb\x51\x47\x84\x53\xa3\x7e\x8d\x2a\xe2\xf6\x80\xff\x99\xe0\x6f\xda\x80\x05\x5b\xb0\x78\x13\x68\xa5\x9d\xc0\xa6\x83\xcf\x3e\xbf\x3c\xfb\xf4\x04\xb4\x84\x99\x1a\xdc\x90\x16\xd0\x33\xee\x16\x48\x81\xe1\x0f\xf7\x83\xbe\x0f\x4a\xae\x56\xd7\x3b\x3d\x2e\xaa\x5f\xf9\xe9\x54\x7a\x88\xd6\x62\x3d\x8f\x5f\x83\xf4\x4b\x4f\x56\x77\x21\x60\xd3\xaa\xad\xfc\x66\x78\xf0\x7b\x05\x12\xa2\x8d\x7f\x5f\x68\xc4\xc3\xf2\x4b\xb7\xa2\x40\xa2\x78\x5f\x95\xf7\xf0\x7b\x1b\x86\xcc\x0d\x0b\x9f\x61\x66\xf6\x49\x03\x5f\xe4\xc6\x7e\x7f\x10\x64\xe7\xf4\x62\x57\xd7\xba\x5e\x78\xca\xbd\x5d\x43\x5e\x1a\x0a\xb4\x36\xef\x7d\xbf\x51\x2f\xe7\x64\x81\xd6\xe6\xfd\x07\xeb\x35\x52\xce\xa5\x92\x6c\x7d\x75\xf8\xfd\x03\xa4\x9c\x22\x7e\x5e\x69\x4a\xb3\x45\xd1\x94\x35\xb2\x7f\x29\xa2\xab\x2d\x0a\xa2\xb2\xa6\x93\x14\xf3\xef\xb1\x05\xae\x48\x2e\x31\xb5\x1f\x47\xdf\xcf\x30\x08\xb6\xf3\x53\x11\xcb\x45\x78\xee\xf2\xda\xd5\x4e\x65\xc2\x3e\x0c\xbc\x2f\x25\x85\x0f\x74\x21\xa1\x55\x29\x68\x68\xf2\x21\x19\x67\xa7\xa4\x4c\x4a\x7c\xec\x4d\x2a\x1b\xe4\xd0\xe9\x40\x6c\x73\xe1\xbd\x5d\x60\x90\xc4\x09\x40\x40\x5c\x00\xa1\xa7\x63\xfc\x9b\x76\x1c\x0f\xaf\xa7\x84\x61\x5f\x64\x2f\xf2\x3e\x49\x4e\x75\x9b\x09\xbc\x1c\x5d\x2c\xa6\x08\xe6\x94\xa1\xc1\x01\x9e\x3a\xe4\x11\xbd\x27\x8b\xf7\xcd\x09\x60\x27\x71\x53\xaf\x61\x47\xe4\x3b\x32\x02\x35\x01\x60\x37\x62\x53\x65\xa0\x7e\x1f\x1d\x39\xc2\xcb\x62\x7b\xff\xa0\xfb\xa7\x77\xef\xd6\xb7\xef\xe1\x7f\x36\xb6\x5d\x24\x35\x35\x79\xc4\xc2\x87\x58\x44\x7f\xa1\xf9\x23\x36\x63\x16\xda\x55\xde\xc7\xb2\x03\x63\x79\x27\xa3\x21\x09\x75\x96\xc1\x9e\x58\xb1\xd3\x25\xca\x7a\x77\xf3\x3c\xcb\xfd\x3d\xdf\x3a\x54\xdb\xa6\xca\xcc\x49\x9b\x48\xd7\xdb\xa1\xe2\x9b\xc5\x98\xe0\x0e\x9f\x60\x80\x90\x63\x9f\xbf\xdb\x99\x0b\x28\xf5\x2b\xcd\x53\x5f\xed\x0f\xa3\x0d\x74\x4a\xc5\xbc\x25\xc5\xdb\xdf\x0e\xbe\xfd\xd3\x1a\x47\x4b\xe7\x5a\x9d\x65\x16\x80\x6a\x36\x9d\x93\x00\xc1\x47\xd5\x20\xdb\x26\x14\xee\x4c\xd3\x7f\xcc\xd1\x2f\x52\x7c\x76\x2e\xf8\xe4\x07\x6b\x90\x4e\x34\x86\x46\x97\x9c\x3c\x62\x16\x5f\xc0\x49\xe5\xbc\x43\x1f\x12\x1d\x04\x25\x1a\x9b\xd8\x83\x7c\xb8\x6a\xc5\xa4\x8d\x7f\x31\x6a\xb7\x9e\xc6\x40\x1e\x86\xec\x1b\x82\x29\xb6\xc9\x01\x19\x8d\x27\xa0\xb7\x0e\xfb\xe9\x96\xa3\xaa\x91\x11\xee\xde\xf1\x14\xa7\xe2\xda\x79\xe7\x12\xec\x80\x5e\xad\x14\x27\xa0\x5f\x9e\xc0\x1d\xb7\xb5\xa1\x51\x26\x6c\x96\x9a\x0a\xac\x5b\x83\x0d\xdd\x4c\xb8\x8c\x7f\x63\x98\xd8\x75\x3a\x87\x92\xb5\x6f\x8a\xb5\xe3\x6e\x64\xd2\x8c\x44\x1f\x55\xb7\x00\x58\xb3\xaf\xdd\xdf\xbd\x7b\xb0\x75\xe9\x38\x2a\xd4\x34\x64\x70\xd7\x21\xb4\xdb\x32\x92\x2b\xb4\x7e\xbb\x64\x28\xd6\xeb\xf5\xa2\xdf\x92\xf1\x00\x1d\xf4\xd1\x85\x24\x39\x9a\x33\xa5\x60\x03\x15\x28\xb6\xb5\x39\xf8\x20\xe2\x07\x99\x70\x13\xce\xa0\xa2\x83\x9c\x47\xa6\x1f\x92\x69\x4a\x66\x6f\x6a\xbd\x8d\x4c\xa7\xe6\x74\xe3\x8b\x60\x46\x19\x8f\x7d\x87\x30\x24\x69\xa5\x55\x5b\x4d\xdb\xc5\xae\x5a\x31\x53\x41\x6c\xa6\xd8\x47\xb5\x73\x13\x46\xbf\x8c\xb4\xe5\xe5\x8a\xbb\x31\xa9\x7d\x8c\x3d\x43\x3d\x4b\x20\xa3\x5c\x83\x27\x08\x6f\x86\xcd\xfb\xdf\xdf\xab\xb9\xf3\x97\xca\x4e\x58\x99\x8c\x1b\xb5\xbf\x36\x4e\x8f\x58\x05\x8b\xb1\xfc\x64\x64\xf7\x0d\x39\x91\xfb\x34\xce\x72\x59\xdc\x30\x16\x83\xdb\x97\x43\x76\x58\x86\x83\x5b\x04\x2a\xb7\x62\x8e\x01\x24\x8f\x01\xf3\x7b\x49\xf1\x17\x74\xe6\x99\xa4\x45\xb2\xda\x39\xe4\x10\xda\xae\x14\x33\x37\x37\x4d\xdc\x74\xe2\x3d\x49\x75\x24\x5f\xd6\x97\x8f\x9c\x09\xe8\x09\x45\xae\x88\x06\xf3\x62\x96\x4d\x04\xd1\xc8\x99\xdc\x14\x52\xc0\xcc\x48\x53\xbd\x13\xae\xa8\xd3\x39\xd9\x98\xa4\xd3\x93\x24\x47\xaf\x25\x8a\x47\x8b\x88\x45\xb8\x11\xd9\xc0\x69\xec\xec\xe9\x26\xf1\x92\x17\xc8\xf5\x82\xd9\x35\xd6\xf1\x3c\x9a\xe2\x1c\x9d\x2b\x32\x1e\x99\xb2\x99\x53\xab\xbe\x31\xa5\x8a\xa1\x7a\x9e\x0c\xe8\x5f\x18\x47\xe7\x71\x3c\xd4\x3d\x69\x71\xb0\xf1\xfa\x7e\xbc\xab\x3d\x85\x32\xd3\x23\x00\xb0\xbe\xaa\x7e\x10\xaa\x6e\xbb\x01\x0e\x9e\xcd\xf9\x4f\x5c\x0f\x87\x91\x9f\xcf\xd2\x31\x85\x1e\xf9\xcf\xc1\x18\xdd\x85\x7c\xd3\x15\x49\xcb\xf5\xad\xf0\x5f\x3b\xc3\x61\x24\x78\xe3\xbc\xf9\x47\x99\x45\x9e\x35\xfa\x13\x2f\x23\x69\x82\x1e\x4d\x51\x5f\x1a\xa1\x9a\x20\x53\x5e\x5e\x3b\x22\xa3\x10\x4a\xc8\x4e\xe0\x51\x56\x4f\x82\x1f\x40\xc9\x34\x30\x14\x79\x0c\xdc\xff\x51\x9a\x0f\xfb\xb2\x2e\xf6\x34\x13\x84\x33\xe0\xd0\xee\xb7\xa3\x52\x46\x27\x39\x1e\xa8\x9d\x83\xfd\x52\xb5\x54\x22\xe0\x31\x4f\x8d\xb3\x48\x86\x68\x9b\x23\x08\x54\xf8\x03\x5c\x72\x79\x82\x98\x6a\x2f\x9c\x7f\x00\xa7\x33\xf4\x35\xa1\x3f\xac\x55\x94\x8d\xef\xe4\x1d\x87\x4c\x01\x72\x49\xab\x8e\xeb\x58\xc5\xb7\x13\x7c\xee\x63\xc4\xab\x79\x11\xfd\xb8\x1d\x7d\xb7\xbe\x5e\x35\xc4\x9d\x14\xc8\x39\xb5\x06\xac\x2a\xc0\x0b\x06\xc7\x16\x68\xdd\xc5\xac\x45\xf2\x69\x9e\x8f\xe9\x77\x9b\x3f\xb8\x8e\xe1\x5b\xa7\x65\x6d\xd9\x12\xc1\x7e\x5c\x71\x3d\xda\xb4\x61\xd0\x4e\xa5\x89\x76\xb8\x6d\x7a\xaf\x56\x3a\xca\x86\x17\x52\x05\xff\xac\x56\xc8\xc5\xf3\x3c\x68\xcb\xf0\x6d\x53\x8d\x6a\xea\x10\x32\x37\xce\xf3\x10\x38\xd2\x64\xc1\x2a\xb0\xc9\xe2\x3c\x24\xb2\xbf\xb8\xcf\x75\xc6\x73\x46\x62\x71\xb9\x65\x0f\xc6\x73\x0c\xe5\x65\x48\xa8\xe0\x72\xa1\x18\x54\xac\xed\xdc\x45\x5a\xc5\x69\x3a\xc3\xb3\x81\x18\xde\xde\xcf\xa6\x4f\xe7\x63\x78\x01\x01\x8f\x03\xaf\x60\xf8\xf9\x8a\x96\x03\xbf\xe4\xcc\x1c\xa3\xb3\x54\xee\xec\x89\x8a\xa6\x73\x22\x66\x58\xde\x94\x2b\xe8\xba\xb1\x8a\x1b\xee\x46\x87\x0d\x47\xaf\x3f\x69\xfe\x18\xaa\x09\x1e\x13\x82\x2d\x7f\xd2\xe4\x1b\x75\x22\x92\x22\xf9\xd4\xf5\x01\x93\x05\xe4\x78\x51\x9a\x3b\x68\xf3\xfe\x0f\x94\x68\xe0\x87\xeb\x64\x6c\x94\xc7\xe3\x90\x72\x03\x01\x6b\x93\x26\xf6\x99\xb3\x3b\x49\xd1\x87\xdf\xde\xd6\x09\x7f\x6a\xc9\x8d\x97\x27\xf0\xd0\xb1\x89\x70\x5b\xfc\xa5\x65\x33\xdd\xe3\x9b\x39\x4f\x28\x0a\xfc\x80\x69\x5c\x3a\x42\xa1\x9c\x1d\x8a\x1e\xd6\xa1\x4f\xe2\xb6\xf3\x61\xe4\x6c\xb9\x00\xa5\x47\x11\xb1\x2c\x78\x8d\x14\xc9\x78\x84\x36\xac\x9b\x52\xea\xc7\xfb\x25\xcb\x4e\xa5\x67\x77\x89\x4d\xe1\x5b\xbb\xf3\xf1\xd2\x04\xb5\xd2\xdc\x4e\x87\x70\xd3\xb2\x51\x63\x74\x92\xc1\xe5\x2d\x17\x2f\xc7\x9f\xc2\x18\x7c\xad\x99\x4b\x1d\x54\xc0\xc5\x1b\x8f\xd3\x7f\x52\xb4\x03\xd8\xc9\xcd\x8e\x0a\x1d\x28\x76\xc2\x68\x4e\x5e\x15\xb0\x63\xd9\xa8\x1b\xa1\x33\x05\xc7\x68\x01\x2e\x1b\x4f\xc2\x18\xde\x97\x25\xa3\xc4\x17\x12\x60\xba\x1c\x93\xea\xb1\x0f\xda\x1f\xfd\x67\x7c\x9a\x42\x9f\xe9\x07\x67\xc5\x64\x72\xe7\xff\x0c\x53\x0e\xa3\x54\xc1\xc5\xc7\x06\x43\xea\xa6\x6e\x43\xd4\x40\x9d\xe2\x2c\xa5\x00\x35\x50\xcf\xfb\x45\xc2\x5a\x5a\xfb\xa2\x4e\x7d\x0a\x8f\x8b\x83\xd6\x66\x4d\xc9\xe3\x71\x76\x54\x5f\xf2\x14\x0e\x33\x66\x2a\xd2\xd2\x4a\xaa\x80\x08\xe3\x78\xc5\xf3\xf1\xac\x54\xee\xe2\xdc\x5f\x1a\x5b\xdb\x9f\xd4\x25\x3f\xfa\xfb\xcf\xaf\x64\x2b\x85\x8c\x60\xc8\x58\xf8\x18\x30\x28\xde\xe4\x09\xb1\xa8\xff\xf7\xe7\xcf\x7e\x9e\xcd\x4e\x5f\xe9\x1d\x4a\xff\xe0\x42\x69\xdf\xa1\xe2\x71\x36\x60\xf7\x5f\xe4\x45\x50\xce\xb2\xd9\xc2\x38\x03\x41\x19\x1f\xe7\x41\x36\x36\xf4\x10\x53\x1d\x53\xa5\x9d\x01\x3e\xe2\xfe\xce\x5b\x57\xb6\xaa\x42\x92\x1b\x4e\xa0\x62\x07\x45\x4f\x14\x5b\x3f\xe8\xb0\xdd\x7a\x9e\x0e\xf2\xac\xc8\x46\xbc\x92\x37\x6f\x5e\xc2\x61\x72\x8c\x7e\xe2\x18\xfd\x2b\xbb\x29\xce\x27\xe3\x7b\xda\x47\xff\x2f\xfd\xf5\x5b\xe9\xe7\xfe\xed\xf4\x53\xd7\x47\x4d\xdc\x42\x43\x45\xc8\x39\xa9\x70\x99\xce\x50\x56\x83\x21\x9e\xc6\x61\xda\xb3\xae\x64\x06\x34\xe9\xaf\xf7\x76\xcb\xa6\xc0\xaf\xc5\xf1\xbd\x08\xce\xdc\x6b\xe7\xad\x5f\x73\xe4\xc8\xb1\x3a\x4f\x27\x48\xa3\x5a\x7d\xfc\x8b\xc8\x91\x23\xb4\xc8\xdc\x38\x9b\x01\x2a\x6f\xe3\x0a\x89\x40\x35\x54\x72\xaf\xe0\xf6\xff\x7a\x5b\x7c\xfb\x09\xfe\xf7\xa7\x0e\x3e\x87\x5b\x04\x9b\x85\x94\x6a\x6a\x4c\x96\x6f\x95\x9c\xc8\x66\x39\x82\xa2\xe1\x26\x45\xed\x6e\x8a\xad\x6d\xfc\x6b\x4b\x16\x29\xe0\xd7\x94\x27\xbb\xec\xfc\x16\x82\xde\xdb\x39\xea\x30\x7e\x7e\x24\x9c\x08\xa6\xdd\x31\x73\x56\x86\xf6\x34\x4e\x73\x64\xac\xf6\xc9\x6e\xa2\xec\x1b\xe2\x3a\x93\xb0\xb7\xe8\x95\x7e\x87\x83\x53\x51\xde\x10\xc7\x15\x51\x37\x2c\x45\xc3\xc8\x06\xc3\xe4\xd7\x57\x7b\x3e\x36\x3f\xba\x62\x38\x72\x71\x17\x23\xd9\x60\x08\x87\x6a\x3d\xd7\x6f\x20\xd7\xf7\x1c\x00\x0d\xc2\xb6\x3d\x7f\x6e\x85\xf1\x45\xce\x31\xe7\x82\x03\x03\x53\x31\xe6\x79\x84\x48\x2a\xb3\xd5\x77\xa0\x92\x80\x6f\xdb\x1e\x78\x5b\x64\x05\x0b\x1d\x62\x1a\x1c\x8c\xf5\x65\x36\xed\xbc\x77\x76\x76\xd6\x43\xce\xac\x07\x2c\x33\x4f\x7e\x18\x1d\xc2\x55\x81\x5b\x19\x71\xa3\xca\x29\x9a\xe5\xfc\x5d\x77\x53\x76\x99\x3f\x06\xdb\x19\xee\x27\x45\x1a\x93\x50\x2a\xee\x36\xa2\x78\xf9\x64\xf6\xf2\xf1\xb2\xbc\x7f\x50\x89\xb4\x68\x33\x01\x8d\x96\x02\x4b\x63\xab\x6e\x05\x0a\x1c\x72\xe4\xed\x62\x24\x32\x8c\xbd\x4f\xd0\x75\x9e\xe1\x1c\xa1\x6c\x2b\xba\x7b\x37\xd5\x6d\xc6\x1a\x5a\xd1\x39\x87\xd3\x10\xf2\x55\x67\xb0\xad\x99\x07\x70\x43\x87\x49\x65\x9f\xa9\x0d\xfa\xd5\xa1\x6e\xa7\xb1\x7c\xc3\x18\x61\x58\xc4\xad\xec\x3a\x01\x2b\x2f\x5d\x86\x06\x82\x34\x3b\xf7\x6b\xcb\xdc\xa5\x74\xed\x46\xcf\xf7\x9e\xef\xb2\x61\xca\x24\x3e\xd5\x73\x89\xff\x8c\x30\x00\x8b\x8b\x3e\x90\x69\xa4\x72\xc8\x7d\xa6\x7c\x1d\xae\xc1\x27\x7c\x26\x7d\x1b\x8e\x4e\xd5\x25\x70\x13\x26\x1a\xdc\xe4\x18\xde\x6b\xf8\x37\xe9\xf9\x7e\x2f\x32\x14\x70\xda\x9e\xf0\x13\x95\x9d\x53\xfd\xf2\x20\x58\xe2\x31\xaf\x5c\xa1\x0e\x3b\x39\x38\x14\x7e\x6c\x5d\xaf\x7a\x0f\x83\x8e\x2e\xd7\xc6\xde\x43\x0a\xcf\xd2\x29\x6c\x84\xa9\x3b\x77\xfb\x95\xc5\x1e\xd8\x67\x02\x52\xa1\x8f\xda\xde\x07\x82\xf1\x11\x6c\x70\x5b\x30\x0f\x2a\x6d\x04\xbf\xc1\xfc\x96\x54\x0f\xbe\xec\xcb\x32\xcb\xdb\xf4\xc4\xa1\x5b\x69\x42\x1b\xb6\x19\xfd\x7f\xaf\x5f\xfc\xd2\xe7\xc0\x1c\xe9\xe8\x62\x85\xee\x27\x47\x46\x14\x26\x8c\xa3\x85\x27\x15\x25\x58\x50\xf9\x15\x70\x40\x42\xf0\xd1\x35\x76\x80\xf8\xa8\xc6\x7e\xd4\xc7\x90\x65\x5f\xc8\xea\x12\x91\xf0\xf0\xe0\x81\xcb\x47\x44\xa3\x8b\x2d\x03\x0b\x73\x8a\xba\xe5\x36\x16\x18\x54\xcf\x62\x46\x99\x98\x9e\x00\xa7\x02\x8f\x27\xa2\x9e\x92\xf6\xf6\x5b\x63\xb5\x28\x76\xa1\xaa\xc0\x9a\x70\xb0\x90\x51\x9a\x8c\x87\x45\x23\xc3\x82\xa4\xb6\x8e\xd2\x2e\xbc\x37\x69\xa6\x3f\xd3\x6c\x42\x3a\x3b\xa6\xdc\x3f\x96\xae\xae\xbd\xcd\x1f\xbd\x9d\xae\x39\xda\xca\xd3\x09\x88\x71\x6a\x63\x7d\x60\x0f\x41\x5d\xfd\xf1\x21\xe6\x14\xaf\x34\x44\xff\x14\x5f\x5f\xa4\x82\x70\x2c\xdb\x93\x57\xcf\x9e\x36\xd3\x69\x6e\xb6\x88\x4e\x53\x8a\x45\xa9\xe8\xe8\x74\x2a\xca\x08\xfc\xea\xd5\x25\x9b\x4a\xa9\x69\x86\x5a\x4c\x41\x37\x31\xb3\x2a\x87\x23\x83\xe7\xd2\xb3\xec\x2c\xc9\xc9\x10\x4c\xea\xc3\x22\xc8\x70\x1d\x98\x39\xd3\x84\x07\xb9\xeb\x9d\x54\x19\x48\xfb\xf4\x1f\xc4\x65\x5a\x7b\x48\xd3\xb9\x8a\x25\xeb\xaf\xe4\x7d\x84\x5b\x9f\x4e\x12\x26\xcd\x2a\xff\x13\x16\x4a\xee\xdd\xa5\x50\x61\x39\x16\x0a\x47\x71\x47\x4c\x39\x51\xbf\xfb\xd1\xb7\x5b\x50\xbf\xd3\x67\x23\xb5\x4e\x89\x01\xa7\xda\x82\xd5\x0c\x4a\x6f\x5c\x73\xeb\x18\x1b\x4f\x8a\xf2\x44\x59\xb4\xd0\xae\xce\xb7\x1b\x90\xd1\x6e\xa4\xed\x0c\x7f\x10\x62\x79\xf4\xed\x36\xb6\x13\x76\xad\x4b\x9c\xe0\x36\x57\xd4\xb5\xbb\x32\x46\x82\xa0\x6c\xcb\x6b\xc6\xb0\x25\xbc\x2d\xa1\x52\xc7\x71\x8c\x1e\x05\xa2\x12\x33\x7a\xd9\x85\x83\x14\x82\x75\x8f\xf3\x81\x23\xc5\x66\xc1\xff\xe1\x2b\x78\xc9\x64\xd3\x02\x13\x1e\xa3\x61\xb3\xc1\x87\xf3\x13\x8f\x0f\x51\x0f\x43\xd3\x45\xa3\x31\xa6\xa2\x6e\xf7\xd1\x38\xa2\x4f\x22\xc2\x6e\x94\xcc\x06\x1d\xa9\xc2\xd4\x8f\xf7\x4c\x1a\xee\x9e\xc7\x98\xbb\xdb\xb9\x96\x46\x3b\xe3\x34\x26\x2f\xc6\x43\x4f\xaa\x0f\xc9\x7f\x55\x68\x28\xbd\x39\xa6\xe8\x35\x63\xae\x38\xa3\x56\xf1\xcd\xb6\xb4\xc2\x6f\x89\xd1\x8b\x25\x2a\xd6\xe2\xe0\xd0\x3b\x2f\xf7\xba\xe8\xd6\x49\xf1\xb8\x9c\x0c\xaf\xae\x6f\x7c\xec\xb7\x5b\x6b\xad\x4e\x28\x4f\x46\x89\x24\x81\xb1\xa1\xba\x41\x07\x53\x95\x6a\xbf\x96\x14\xd8\x14\x70\x5c\x8c\x11\x06\x27\x18\x1b\x6d\x58\x37\x01\x7f\x1f\x47\x40\xc3\x0a\xec\x1d\xa3\xbf\xb5\x3a\xb6\xa0\xc0\xc9\x7d\x24\x97\x6e\xe4\x80\x7e\x6f\x45\x97\x41\x79\xd3\xdc\xa9\xce\x8b\xdc\xf9\xcb\x66\xd1\x21\xf7\xd5\x39\xbc\xcd\xb9\x2c\x80\x46\x69\x70\xea\xf5\x7a\x83\x03\x3e\xdf\x6c\xe1\x30\xf4\x68\x9e\x53\x68\x0e\x3e\xd6\x43\x0e\x35\xa2\x21\x47\x51\x1c\x4c\xea\x14\x4a\x34\x4f\xd2\xa6\x5a\x14\x59\x76\x62\xcd\x50\x50\x8a\x25\x82\x09\x91\xda\x5c\x46\x70\xd8\x6a\x9f\xae\xe4\xf7\x5c\x5c\x41\xc0\xf4\x0c\xa3\x00\xb6\xab\x6d\xf8\xea\x92\x1f\x18\xfe\x58\xfe\xfa\xf4\x49\xae\x57\x12\x0b\xb3\x3e\x06\xfe\xdf\x7d\x81\x99\xa8\xcc\x18\x95\x19\xf0\x13\x8b\xe0\x32\xcd\x65\x14\x97\xda\x98\x22\x6b\x53\x86\x7a\xb2\xd0\x49\x47\xbe\x0a\x5e\x2f\x68\xaf\xd0\xc2\xa3\x47\x7c\x7a\x8b\x13\x8e\x4e\x31\xd8\x3c\x6c\x03\x47\xaf\xcf\x0b\x1d\x95\xbc\x94\xb7\xa3\x76\xdb\x0d\x2c\xe2\xf5\x3b\xdb\xad\x9f\x77\x77\x7e\xa2\x44\xf5\x6d\x9d\x60\x3f\x18\x48\x82\x92\x61\x54\xb9\xe6\x72\x9a\x43\xa7\x63\x22\xbb\x2f\xa8\xec\xe5\xc2\x42\x99\x1f\xd5\xd4\x76\x2e\xff\x9b\x2e\xf2\x1c\x55\x62\x7d\xcc\x1b\x5e\x90\x85\xa3\x29\xf1\x95\x93\xd9\x6b\xfa\x2a\xb6\x7c\x69\x52\xf8\x55\x72\xfd\x8e\xab\x2c\xb7\xe1\xb6\xfd\x55\xe8\x53\x4c\x58\x2e\xd7\x18\xc8\xd3\xce\x78\xac\xa8\xc1\xa5\x45\x9b\xb9\x08\xd8\xcd\xda\xe2\xa8\xc8\x00\xec\x29\x86\xf2\x26\x99\x18\xec\x6a\x2e\xc9\x61\x57\x57\xe9\x84\x3c\x79\xf1\xea\xb5\x53\xb2\x48\x88\x01\xe9\x2e\xec\x0b\x2e\x40\xb4\x7d\x3a\xcb\xf2\xf7\x45\x9f\x93\xc1\x60\x25\x4d\xc6\xd0\x23\x0e\x84\xf3\x66\x8f\xb0\x80\x13\x41\x52\x36\x02\x3a\xa7\xba\xba\x11\x70\x70\xc4\xe3\x9b\x35\xef\xb7\x6c\x2f\xc4\xd1\xdb\x65\x87\x13\x69\x87\x95\x3b\x16\xf4\x5c\xa3\x0c\x7a\x1e\xc4\x57\x14\x45\x5a\x15\x33\x23\x46\xcd\x15\x83\x21\xb4\x15\x8f\xa1\x41\xdb\xa3\xf5\x23\x83\xe2\x9b\x55\x44\x62\x14\x53\x24\xb2\x91\x7c\x67\x44\x89\x7a\x98\x06\x7c\x5a\xa4\x64\xcc\x73\x48\xac\x90\x44\x31\x6d\x62\x83\xa8\xce\x62\x7e\x8d\xf2\xa0\x31\x19\x51\x70\x19\xad\xd2\x71\x12\x24\xc9\xa6\xfe\x2c\x6f\x64\xf7\x82\x0a\x43\x7e\xf6\x20\xe0\x39\x30\xdb\xba\x60\x6e\x9e\x70\x8c\xf7\x53\x07\x71\x4f\x65\x7b\x70\x27\xe0\xe0\x87\x36\x67\x07\x33\xaa\x1a\x96\x9f\x19\x35\x69\xb1\xe3\xa8\x0d\x1a\x3b\xae\x4a\x82\xec\x1e\x1b\x26\x91\x64\x80\x12\x04\x6d\x71\x66\xf4\x64\xb6\x3d\x9f\x8d\x7a\x0f\x56\x49\xd3\x62\xa3\x38\xa1\xf5\x06\xb1\x3e\xb1\x9b\x00\xf6\xe7\x7b\x58\x6d\x92\x2b\x3a\x46\xa7\x86\x36\xd7\x00\xb5\x06\xdf\x2c\x90\x05\xeb\x3e\xf2\x21\xb0\x38\x2b\x8f\x9c\xc1\x2c\x3c\xf9\x95\x53\x80\x2a\x06\x6f\x0e\x61\x02\x73\xb6\x07\x33\x97\x2f\x41\x61\x68\x44\x5f\xc2\xff\x52\xa5\x06\x81\x25\xf6\xa8\xdc\xa6\x32\x9e\x5b\x8b\x9e\xa3\x74\x66\x82\x27\x05\x05\x46\xc5\xce\xe3\xf9\x2c\xeb\xe1\x39\x41\xd6\x08\x40\x0d\x55\x51\x11\xc8\x5d\xe4\x9c\xb0\x9e\x4c\xd8\x38\x13\x4b\xc6\xcf\x96\xc3\xf2\xcb\xfe\xb0\x41\x2a\xdd\xf4\x16\xa0\xbc\x2d\x0d\x4f\x81\x9a\xdd\x72\x07\xb9\x4e\x5c\x20\x8c\x7e\xa1\xba\x48\xf7\xf4\xdf\x77\xa0\x3f\xb0\x7a\x56\xaa\x0a\x17\x18\x8a\x10\xf0\x1e\xc3\xc7\x81\x58\x14\xa2\x72\x71\x96\xbb\xec\xad\x00\x0f\x51\xf5\x08\x55\xa1\xb6\x34\x70\x48\x26\xc2\xf3\xc5\x8c\x79\x31\xc7\xf4\xdf\xc0\x4a\x03\x83\x7e\x18\x1d\xc5\x05\x83\xef\x90\xef\x11\xb7\x13\x98\xf4\x26\x61\xbe\x1c\x90\xfe\xde\xf9\xb9\x3f\x49\x74\x32\x28\x87\x06\x1e\x8b\x58\x7a\x82\x49\xbd\x7b\x87\xba\xb5\x77\xef\xe8\xf8\xa0\x60\x08\x86\xf9\x1e\x5a\x52\x03\x60\x6b\xdf\xbd\xa3\x0b\xe3\xdd\x3b\x4e\xfd\xcb\x8f\x83\x43\x53\xcc\xcd\x31\x5f\x04\xd9\xc1\x1e\xf6\x07\xe3\x14\xf6\x72\x97\xeb\x71\x23\x32\xad\xce\xf5\x13\x06\x67\xc1\xa0\x35\xf1\x07\xb8\x02\xd4\x30\xf2\x88\xfd\x33\xb1\x0b\x89\x64\x33\xe8\x6a\x6b\xbe\x5d\xe9\x04\xa7\x92\xf9\x87\xcc\x6a\x60\xfa\x6c\x69\x91\xc7\xd3\x63\x97\x5a\x7b\xa3\xdf\xff\x9e\xba\x71\x57\x1e\xb0\x72\xa3\x39\x33\x82\x28\x1f\xe1\x44\x6d\x08\x18\x8c\x71\x3e\xce\xe0\x32\x82\xb7\x8e\x02\x71\xb5\x98\x1f\xc7\xf9\xaa\x21\x65\x7e\xc6\x8a\xba\x23\xb2\x93\x9a\x4c\x30\xd7\x06\xb2\x94\x26\x37\x9b\x90\x1f\xb4\x55\x34\x14\xb0\x3f\xcd\x84\x8e\xb9\x2f\x47\xf1\xf0\x95\x65\x3e\xe1\xd3\x7c\x0a\x47\xe8\x24\xcb\xe1\x15\x37\x34\x2d\x67\x3b\xc0\x90\x9d\xce\x10\x52\xf6\xeb\x53\xb4\xf8\x2e\x9d\x91\x5f\x24\xe4\x0b\x83\xec\x3a\x14\xac\xcc\xac\x84\xa7\x83\xd8\x15\xa1\x60\x27\x14\xd9\x24\xda\xdb\xfd\x01\xb8\x84\xe3\xcd\xe8\x64\x36\x3b\xdd\x5c\x5b\x23\x9b\xc5\x0c\xb6\x79\x34\xce\xce\xfa\x00\x9d\x35\x5a\x1c\xb2\xa6\x6b\x1b\xeb\xeb\xdf\xfd\xe5\x87\xbf\xde\x5b\x9b\x14\x69\xd2\x13\xce\xa3\xc7\xdd\xf6\x50\x62\xd6\xcb\x46\xbd\x8d\x7b\xf7\xee\xa3\x20\xad\x17\xff\x1e\x9f\xf7\x1c\x63\x4e\xef\x63\xb5\x8b\x41\xdf\x5a\xa8\xa6\xd2\x1b\x67\x2e\x73\x6f\xfd\x3b\x27\x2b\x31\xc1\x8b\xa5\x7c\x2d\x82\x09\x44\x9f\xd0\xb8\x94\x97\xe0\xbe\x13\x1e\x85\xfc\x9d\x6b\x56\xe6\xfb\x3c\xd9\xd5\x6e\xe0\x20\xa6\x03\xd7\x1c\x63\x42\x43\x85\x0d\xb5\x38\x70\xed\xb3\xf7\x38\xc3\xca\x67\x73\x4e\xa0\xfc\xbb\x4a\xb9\x39\x34\x50\xfe\x7d\xa5\x5c\x8d\x8c\xda\xae\x29\xd2\x1c\x57\xaf\x63\xb9\x97\x59\x26\x56\x6f\x42\x6b\x34\x6b\x01\x43\x03\x11\x5e\x7b\x8d\x09\xd7\x92\x21\x01\x95\x26\x5d\x82\x86\xc3\x64\x06\x7b\x4d\x0d\x8f\xd9\x11\x59\x5c\xd5\x54\xb1\x98\x4e\x95\x36\x6a\x47\x32\x98\x4f\xb5\xfe\x52\x5f\x8b\x4e\x02\x55\xa8\x9b\x0e\xa0\xd4\x51\x3a\x1c\x92\x40\xf0\xbb\xf5\xfb\xb6\x46\x55\x2e\x85\xd6\x9e\x42\xa7\xf2\x84\xb2\xd9\x4c\x31\xa7\xfa\x87\xc4\x39\x69\x28\x49\x75\xd7\x93\xde\x43\xd4\x6c\x69\x4e\x4c\x76\x24\x30\xf1\xa9\xda\xd2\xf5\xe5\x01\xc7\xd6\xd0\xc4\x9d\x6e\x1b\xeb\x34\x2d\x42\xc3\xb4\x6d\x35\x51\xdb\xd2\x43\x50\xb5\x6b\x2b\xd9\xb4\x05\xf6\x6c\xf6\x08\x38\x83\x36\xb1\xe3\x0b\x2c\x27\xd5\x72\x0d\xbe\xfb\x23\x63\x5a\x6b\x99\x9b\xaf\x9f\x2b\x7e\xe6\xb9\xea\x3c\x05\x78\x50\x10\xec\x86\x68\xab\xbc\x10\xab\xa4\xb1\xd2\xef\xd1\xb6\x7b\x23\x2f\x96\x85\x89\x04\xaa\x2c\x0a\xe3\xa9\xc9\x35\x05\x73\x6a\x94\x93\x72\xc5\xba\x12\x68\x55\xbb\xe7\xe6\x11\x4f\x83\xb7\xb9\x8b\x2e\x36\x30\x66\x36\xc9\x78\x64\xec\x26\xc5\x54\xca\x9b\x55\xfb\xc7\xca\x3b\xe8\x25\x77\xcf\x15\xf9\x05\x07\x9e\xb5\xd1\x62\x28\x5b\x81\x38\x9f\x36\x0f\xf2\xf2\x83\xd3\x48\x0c\xde\xd5\x7d\x04\xb4\x6c\x25\xd3\xa1\x15\x86\x19\x99\xa8\xa0\x86\x4b\x03\xce\xc8\x5b\xb8\x6f\xf4\x31\xcc\x81\x55\x08\x2e\x39\xd1\x06\x59\x60\x89\x0e\xdb\x58\x72\x48\x83\x32\xf2\xb5\x98\x99\xa4\x0c\x23\x53\xe5\x1d\x4e\x1d\x8f\xaa\x87\xb3\xe5\x6c\x0d\x11\xe5\x94\xa3\xb3\x81\x60\xf1\x3b\xd0\x1f\x60\x1b\x48\x30\xeb\xbe\xab\x34\x1b\x66\xd5\x77\x81\xde\xd1\xcc\x51\xd5\xec\x7c\xf1\x60\x31\x1a\xb1\xa1\xa5\x9a\x0c\xc9\xc6\xa9\x46\xa8\x1b\xd8\x53\x36\xf5\xab\xad\x4c\xe7\x64\x82\x14\x98\xad\xde\x03\x22\x1a\xda\xb2\x3e\x8c\xee\xaf\x57\xbc\x33\x96\xea\x9d\x03\x4e\x9c\xbd\x2b\x43\xd6\x77\x4e\x12\x0e\x4e\x84\x0a\x8c\x27\xca\x82\x90\x7b\x42\xa9\x56\x05\xbe\xd2\x51\x00\xc9\x3c\x0f\xcb\x72\x7f\x56\x9d\x49\xaa\x96\xd5\xda\xbb\x7a\x08\xbb\xa5\x48\x7d\xbf\x9c\xcb\xc0\xa4\x01\x9e\x00\x29\x12\x6e\x3e\x3d\x4a\x2c\xe4\x67\xbb\x62\x5c\x69\xac\x0a\x77\xc8\x4d\x6b\x44\x8c\xf3\x0c\x1f\xe3\xd9\x54\x49\x76\xd9\x22\x73\x1e\x9a\x3e\x8f\xc4\x89\x65\x34\xf5\x07\xd5\xbc\xa2\x43\xc3\x16\x78\xef\x02\x27\x4a\x29\x22\x32\xa0\x3a\x45\x85\xce\x28\xe3\x36\x09\x8d\x89\x9c\x18\x91\x38\xce\x13\x56\xf4\x35\x5c\x31\x15\x0b\x52\x19\xd1\xcc\x79\xc2\x4c\x1c\x1f\x77\x5f\x3e\x29\xaa\x93\x37\x86\x43\xe3\x84\xac\x4e\x93\x0f\x69\x06\x7b\x25\xcd\x2a\xd7\xdf\xe7\x4c\x75\x80\x43\xbc\xa9\xce\xb7\x76\xb6\xe4\x22\x64\x5b\xb4\x7d\x8d\xbc\x66\x1b\xcc\x66\x1f\x51\xf6\x4c\x6f\x19\xcf\x2f\x8c\x01\x2f\x30\x43\xa6\x06\xee\x8d\x2b\x57\xb8\xe4\xa2\x62\x1a\xad\xbc\x1a\xb2\x58\x27\x46\xeb\x88\x82\x6d\xab\xa1\x91\xa3\xb8\xf2\xdd\x90\x2b\x27\x58\xa2\xa2\x76\xc7\x70\x90\x06\x08\xfe\x33\xd3\x25\xaa\xdc\x5a\x08\x0f\x23\xc0\x51\xf1\x13\xa2\xe7\x87\x78\x7c\x48\xaa\x95\xc9\x7c\x3c\x4b\xf1\x31\x29\xfa\x5b\x97\xae\x2b\x7c\xa0\x57\x54\x41\x22\x58\x77\x7a\x97\x50\xb5\x00\xdf\x98\xad\xc3\xa0\x43\x15\xb5\x78\xb5\xf2\xdf\x7b\x3b\x2f\xf7\x7a\xff\x9d\x5c\x60\xfd\x51\x96\x1d\xc5\x25\x6d\x05\x2a\x08\x94\x52\x78\xad\xc4\x55\x93\xf8\x18\xf1\x2c\x6a\x2d\x4b\x22\x33\xea\xa6\x1b\xb5\x46\x31\x51\x19\x37\x64\x0f\x3e\xa9\x48\xc9\x4b\xee\x4a\xec\xc3\x07\x76\x46\xbd\x95\x63\x54\xd4\x48\xf7\x48\xf3\xe8\x30\xcf\xd9\xb8\xb1\xe4\xaf\x92\x00\x43\xe3\x1c\x53\xa9\xf1\x79\x64\xa9\x2a\xaa\x29\xbb\x5c\xc8\xb6\x67\xde\xf4\xac\x84\x64\xfc\xd1\xb2\x15\xb5\xe2\x44\xaf\xe2\xac\x08\x1e\x4d\x59\x13\xfa\xb2\x2d\x67\x09\x83\x4b\x48\xb9\x14\x4e\xce\xa7\x84\x68\x18\x15\xb9\xb7\x83\x82\xa8\x25\xf0\xeb\x6a\xd1\xec\xe7\xec\x24\xcd\xa8\x5e\x52\x3b\x4c\xc6\xc9\x2c\xb9\x1a\xb6\x5b\xa5\xba\x01\x70\x17\x81\xb5\x56\x3c\x5d\x22\x13\x9f\x2b\xa5\x0e\xe5\x11\xe5\xd5\x1f\xab\x40\xf5\x6a\x59\xf5\x62\x08\x94\x68\x9d\x15\x25\x13\xa5\x23\xa9\x70\xd7\x09\x85\x38\xb0\x3f\x4b\x91\x0e\x03\xf3\xb4\x32\x5a\x85\xb4\xee\x9a\xb6\x6f\x0e\x19\x79\xd9\xac\x6e\x0c\x51\x8e\x84\xbb\x2d\x6c\x53\xd5\xcb\xc2\x57\xb6\xa0\x5a\x9e\x08\x5e\x35\x50\x79\xa2\x9f\x35\x68\x19\x1d\x58\xd2\x7d\x5b\x4c\x0d\x4b\x61\x1c\x56\x10\x3b\xf7\x71\xc5\xd0\xa8\x96\xdd\x65\x62\xca\xcd\x3e\xee\x93\x04\x57\x75\x85\x57\x5e\x8e\x7c\x43\xfc\xa1\xa8\x82\xf7\x4d\x19\x57\xe8\x0e\xaa\xdd\x43\xa6\x5e\x71\x95\x46\xb1\xd8\xa6\xdd\xaa\xde\xa1\x57\x23\xc6\x95\x9d\x2e\xbe\xa4\x97\x42\x02\xee\xea\xd6\xd0\x80\xbb\xbb\x02\x11\x1c\x97\xf1\x59\x28\x20\x72\x2a\x36\xd0\x64\x7b\x25\xce\x34\x48\xdc\xd0\x21\x9a\x09\x88\xfc\x00\x8d\x20\x1a\x05\x08\x58\xaf\xee\xfb\x69\x5c\xdc\x1e\xcb\x8f\x42\x35\x0b\x14\x1c\xb4\x4b\x43\x38\xd9\x12\xfb\xf5\x1c\xcd\xb2\x98\x4a\x51\xd4\xb3\x89\xe2\x1f\xaa\xb4\x15\xc2\xcf\x2e\x1d\x79\xa2\xc7\x28\xef\x24\xc9\x11\xaa\x2d\x1a\x21\xc7\x5e\xad\x24\xa0\xe8\x49\x9a\x52\xe2\x29\xfb\x2b\x58\xe6\x8f\x05\xfe\x2a\x63\x61\x71\x92\x25\x05\xe0\x17\xa3\x57\x9f\x3a\x69\xb7\x8a\xf4\x9f\xc9\xf6\xc6\x7a\xf9\xfb\x47\x16\xdf\x03\x83\x76\x04\x1b\x42\xec\x19\xf6\x19\xaa\xf3\x3e\x59\x4e\xeb\x4a\x38\x87\x60\xae\x87\xb2\x0a\x62\x1c\x98\x2d\x87\xe5\xd2\xce\xdd\x71\x7e\x67\x64\xd5\xc5\xf6\x5f\xde\xf7\x00\x3f\x6e\x49\x1b\xaa\x60\xc4\x3a\xec\x1c\xa0\x35\x9a\xb0\xf3\xb7\x9c\x83\x00\x08\x7b\x1e\x1d\xa2\xa1\x8a\xa0\x22\x82\x9b\x16\xb6\xca\x3c\x7c\x9c\xcf\xd6\x9c\xb5\x32\xa9\x4a\xd5\xee\x4a\x94\x74\x82\xb5\x87\x87\x87\xd1\xef\x85\x29\x77\xd6\x30\xa7\xe3\x2c\x1e\xea\xc1\xef\xd3\x88\x6d\xe4\x8b\x11\x2f\x0c\x47\x5e\xa5\x06\xd8\x67\xc3\x99\xc0\x09\xd7\xf0\xcc\xe8\x1f\xf6\x09\xdd\xc7\x6e\x97\x3b\x56\xb3\x4d\xb7\x6d\x53\x4a\x3c\x67\x37\xef\x0e\x6f\xc2\x48\xdc\xd0\x74\x53\xf4\xb7\xc8\x4b\xc8\x7d\x4b\x5d\xd5\xcc\xbb\xcb\xd5\x43\x97\x4b\x84\x83\x1f\x60\xd1\x3e\xfe\xff\xf3\x64\x1e\xb8\xbc\xa0\x37\x19\x59\xce\x61\x98\xb1\xd9\x2c\x1e\x9c\x70\x62\x84\x8c\xc3\xc9\xb8\x3c\x0f\xc2\x8c\xb1\x8f\x21\x3d\xcd\x34\x99\x02\x75\x41\xe8\x70\xdd\x8d\xe5\xf1\xc8\xe5\x17\xb7\xa1\xbd\xdf\x7a\x18\x47\xe9\x70\x7b\x35\x5e\xfd\xf1\xe1\x11\xfd\x75\xb4\xfa\xe3\x49\x72\x71\xe7\xe1\xda\xd1\x8f\x0f\xd7\xe2\x1f\x5b\x07\x68\x24\x35\x23\xed\xfc\xaa\x33\xdc\x5f\xbd\xec\xdc\x04\x23\x2a\xcf\x24\x83\x0b\xb8\xa6\xfa\x36\xbc\xd6\xdb\xa3\xa2\x04\x83\x9a\x97\x14\x8e\xd4\x75\xe3\xfd\x51\x58\x53\x3f\xd8\xe2\x7b\x0a\xcf\x3c\x1e\x6d\xe0\x50\xc4\x41\x52\x0d\xc2\xd9\xf4\xa1\xdd\xa1\xa7\xfd\x2a\xde\xde\xab\xa8\xe7\x25\xcf\x66\x6f\x45\x9e\x16\x8c\x7c\x0b\x79\x17\xd4\x15\x11\x7d\x62\x12\xe7\xbf\x97\x48\x78\x12\xe7\x83\x93\x80\x47\x28\x21\x41\xb9\x53\x27\x67\x20\x7b\xca\xd5\x33\x24\x6c\xc5\xea\xb5\xfa\x17\x8b\x45\x2e\x83\x0b\x81\xe6\x59\x7a\xb0\xbb\x5a\xa8\x2e\x46\x93\x3e\xd4\x14\x37\xd5\xc9\x72\x78\x56\x40\x1d\x0c\xb8\x53\xa9\xb3\x78\x35\x9c\xef\x1a\x41\x5d\x5d\x42\x93\xc9\xa5\x72\xe2\x15\xf6\x4a\x26\xd4\xfa\xb8\x8a\x68\xb0\xba\xb9\x3a\xfb\x7d\xf5\x3a\xb3\x41\xa3\x8c\x6b\xcf\xe5\x0a\x5b\xd4\xe5\x00\x50\xeb\x19\x71\x7d\x88\x90\x4f\x4e\x1d\x44\x70\x76\xdb\x30\xb7\xeb\x02\xe3\x0f\x9e\xd7\x8d\xc1\x26\x07\x97\xa2\x1e\x36\xcc\xb1\xe1\x49\xa7\x73\x2c\x3f\xda\x04\x44\xd9\x51\x5a\x5b\x4a\x37\x49\x52\x6c\x8f\x92\x1c\x28\x4b\xa9\x4a\xdd\x54\x1b\x64\x5b\x78\x6a\x6f\x8d\xf8\xe2\xd4\x2c\xe9\xc5\xce\x1d\xf3\xca\x66\x4d\x4e\x88\x45\x65\xaa\xa6\x54\xb3\x28\xa4\xa9\x4e\x80\x50\x7a\x0d\x3a\x63\x29\x8a\x02\x2d\xe4\x3b\xe3\xf8\xd0\xae\x57\xa6\xca\xd4\x77\x93\x7c\x8c\x0a\x43\xf1\x18\x35\x50\x4b\x2a\xf7\xb7\x17\x90\x99\x38\x1b\x8e\x45\xf4\xa1\x09\x6c\x87\x7c\xa5\xe0\xdb\xc4\xdb\x7b\x29\xba\x71\x7f\x4b\x2e\x55\x3b\x5b\xc2\x5f\xc9\x19\x0d\xd4\x2c\xca\xa9\x1c\x79\x9f\xe5\xdf\x23\x5b\x03\x1e\x11\x7f\xc6\x67\x41\x50\x63\x93\x7e\xaa\x66\x2f\x08\x0c\x12\x74\x6e\x00\xce\x96\x6e\x1d\xe9\xa9\x02\x3c\x6e\x1e\x34\xd6\x7a\x2e\xd8\xe9\x1d\xdc\x4e\xe8\x46\x62\x1a\xc8\x36\x96\x84\x93\xf5\x20\x66\xda\xbb\xe8\xa2\xdd\xe3\xbc\x4d\x41\xce\x28\x7e\x06\xc2\x11\x12\xd6\x3b\x4f\x8a\x43\xbe\x5c\x87\x6a\x2a\x13\xc3\x85\x76\xe1\x62\xa2\x05\x47\x89\x8d\x06\x50\x69\x66\xbf\xaa\x72\xf4\x12\xf5\x5d\xcb\x4a\xcd\xdc\x8c\xcc\xe9\x71\x3a\x33\x3d\x41\xa3\xa9\xdb\x4e\xad\xbf\x40\x9d\x30\x9a\x5a\x25\x62\x15\x10\x21\x10\xce\x7b\xc3\x6c\x82\x39\x0a\x38\x0a\x8d\xae\x74\x99\xa9\xe7\x59\x51\xfc\x44\x8d\x9b\xad\x22\x2a\xaa\xe0\x17\xa4\x74\xd4\x00\x91\x14\x36\x9f\x53\xf4\xef\x90\xd2\xb2\x87\xe7\x21\xcf\xc6\x3d\xd2\xf1\xf5\xb8\x76\xcb\x99\x2e\x98\x31\xcb\xba\x96\x92\xde\xf7\xaa\x75\xab\x6a\xea\xda\xcb\x96\x86\xcd\x4b\xf6\x4a\xaf\x40\x09\xd6\x64\x99\xd1\xd2\xfa\x40\x51\xc8\xa4\x43\x7e\xc2\xf1\x9c\x60\x88\xf9\x41\x92\xe0\x61\x77\x20\x30\xdd\xfb\x8e\xaf\x80\xc0\xae\x68\xdd\x81\x87\x2a\x26\x69\x81\x0a\x53\xca\x2a\x96\x65\xef\xd1\x6a\x2c\x44\x04\xb5\x27\x57\xa0\xfc\x92\x69\xd8\x3a\x76\x51\x4b\xe9\xb2\x43\x53\x72\x3a\x53\xac\x45\x06\x76\x10\xde\xa5\xb8\xa5\x47\xc4\xd3\xcf\xc9\x9e\x74\x75\xc1\xa6\xae\xaa\x9d\xef\x59\x3a\x1e\x0e\xe2\x7c\xd8\xd5\x03\x48\x56\x7b\xd4\x1f\xca\xd3\xeb\xfb\x78\x92\x27\x43\xd6\xfc\x31\xcf\x89\x7c\x32\xa2\xc3\x6a\xb8\x95\x0b\x6f\x2d\x1c\xdf\xf4\xd3\xa0\xc3\xac\xd6\x52\xb4\x6b\x26\x38\x68\xca\x32\x33\x0a\x4b\x4a\x1d\x47\x21\x4a\x15\x07\x0f\x47\xec\x8c\x72\xe8\xde\x81\x94\x7a\xd3\x99\x9d\x86\x46\x34\x96\xcc\x3c\x75\xe1\x8a\x46\xd3\x5b\xbb\xc0\x4b\xf7\xf7\x68\xda\x69\xb0\x75\xc1\x4f\xc6\x27\x85\xff\x0c\xe3\xb3\xb4\xdd\xed\x5e\x63\xfc\x62\xa3\x1b\x2c\x75\x5c\x82\xcb\xcc\xbd\xce\xd4\xbb\xe4\x1d\x5f\x25\x2b\x62\x20\x88\x11\x2e\x15\xc4\x6e\x03\x2d\x89\xa5\xc8\x2f\x18\x10\xc8\x1a\x15\x92\x1b\xd8\x94\x58\x0b\x54\xd8\x66\xd3\x1c\xee\xe6\x0b\x2a\xe1\x82\x0a\x66\xf0\x65\xf4\x1d\x8a\x8b\xd8\x77\x00\xea\xa3\x2d\x66\xe2\x15\xc3\x2b\xc2\x20\xee\x4d\xd1\xe8\x12\xa9\x71\x3c\xa4\x83\x13\x4f\x2f\xd4\x4c\xf5\x22\x6a\x27\xfd\xe3\xbe\x58\xb6\x75\xe0\x48\x8e\x28\xde\xf9\x34\x52\x7d\x32\x86\xbb\x41\xab\x5d\xed\x0d\x50\x06\x9d\xad\x25\x3a\x30\x1b\x13\xae\x3e\xa1\x78\xa5\x9c\x6f\x06\x1f\x80\x22\x60\xc2\x21\x58\x00\x3a\x9c\x93\xe6\x84\xab\x0f\xd6\xd7\x07\xeb\xf7\xee\x8f\x56\xa9\x4f\x96\x2e\xfa\x90\x65\x1c\xc9\xc5\x59\x78\x78\xbf\x97\xc0\xce\xc7\x57\x58\xdf\xb2\x06\x30\xc6\x6a\xd0\x33\x25\x64\x0a\x8a\x86\x21\xb8\xb3\x43\xd8\xda\x4e\x60\xf9\x62\xe9\x69\xdb\x59\x00\xb9\x46\x35\x1a\x77\x66\xa6\x8d\xed\x4c\xe9\x22\x6a\x07\x2a\x4e\x63\xf5\x83\x36\x51\x6c\x88\xe2\xec\xef\xf3\xec\x18\x60\xaa\x16\xf8\x7c\xf5\xbf\x94\x8f\xc1\x9d\x6c\xf6\x1d\xed\x00\x31\x93\xf6\x8f\x36\xd4\x6a\xd2\x07\x70\x0f\xd8\xc2\x32\xe9\xa3\x78\x06\xb6\x6f\x2d\xd2\xba\xdf\xa2\x35\x6b\xc3\xb4\x74\x12\xad\x6e\x94\xe8\xf4\x8c\xcd\xc1\x49\x5c\x3c\xc3\xa0\x67\x53\xf4\x18\xf2\x95\x1d\x9f\xcb\x38\x7b\xea\x27\x1d\xae\xc2\xe9\x75\x9d\x45\x17\x25\x7a\x83\x46\x2c\x45\xa2\xb4\x22\xcb\x8c\xc3\x23\x71\xa3\xab\x06\x54\x0e\xb0\x64\x1a\x06\x10\x67\x6a\x8e\xb4\xd0\x4c\x81\xdc\x8a\x10\xab\xf7\x76\x59\x3b\x03\xb7\x42\x72\x44\x77\x0c\xca\xc2\xe1\x3a\xf8\x1d\xaf\x83\x53\xd8\x75\xa4\x54\xe9\x2c\x1a\x66\x49\x81\xd1\xb9\x92\x73\x98\x72\x5f\x3b\x7f\x95\x70\x32\x74\x0a\x96\xb0\xa9\x5f\xd1\xd6\xb9\xd8\x5c\x5b\x1b\x64\xd3\x29\x5a\x40\x4c\x5c\x90\x25\x34\x78\xde\xdb\x5d\x1b\xc1\x15\x8b\x14\x62\x6d\x98\xcc\x70\x26\x6b\x0f\xee\xff\xf5\xde\x77\xdf\xa3\x56\x0d\xdb\x0a\x79\xeb\xf1\x64\x7b\x14\x97\xb5\xe8\x49\x9e\xe4\x9e\x86\x66\xeb\xa1\x80\xa6\x87\x71\x5d\x7b\xb8\x84\x1e\x2c\xa0\xc7\x0b\xe8\x0d\x5c\x4a\xda\x4b\xc1\x3b\x41\x7a\xdd\x66\x21\x81\xb0\x13\x77\xac\x59\x4c\xc0\x3b\xd3\x27\x92\x46\xcf\x94\xdd\x2b\x13\xa5\x28\x0a\xce\x59\xc9\x78\xce\x1f\x27\x77\x40\xba\x3a\x11\x1f\x88\xa4\x2c\x2e\xa2\x09\xd2\x17\x9d\x8e\x52\xf5\x86\x78\x33\x52\x79\xcb\x4f\x9d\x2c\x56\xb7\xa3\xff\xad\x3f\xbc\x77\xfe\x23\xf5\xe8\x83\x97\x09\x3f\x46\xa8\xf1\x8a\xbe\x45\xa0\x82\x7e\xb3\x13\x4c\x4b\x17\xac\x12\xee\x53\xcd\x70\xab\x56\x9b\x3a\x62\x97\x00\xe1\x1e\x92\xe8\x36\x67\x4f\x58\xf9\x8e\xef\x50\x77\x4d\x17\x3f\xf7\x81\x2e\x35\xd2\x47\xeb\xbf\x76\xdf\xb0\xea\xc0\xd8\x73\xc2\x5e\x8a\xab\x64\x4d\x41\x55\xdd\x40\xd7\x1c\xee\x7f\xf8\x04\x72\xc7\xc6\xc7\xf6\x28\x66\xf3\xd1\xc8\xd1\x6e\x71\x3a\x7a\xb3\xfc\xe3\x92\x2f\x75\x1f\x29\xa4\xb2\x8d\xfb\xb6\xcf\x47\x76\x04\x0d\x7f\xb3\xd5\xea\xec\xaf\x1f\xe0\xfe\xb4\x0e\xfc\x8b\xd5\x75\xd0\xd1\x4b\xdb\x2b\x4e\xdc\xa3\x5f\xb7\xb0\xf0\x56\x4c\x6c\xa7\xb4\x62\x1e\xec\x2c\xf4\x4f\x03\xcf\xb6\x4a\x98\xa6\xed\xed\x1a\x13\x89\x0e\x4d\x37\x9d\x2a\xd6\xd3\xfd\x85\x3e\x88\xb4\x46\x01\x8b\xc8\x6a\x6b\x5a\x87\x33\x04\x4a\xa3\xc0\x36\x26\x5a\x1a\xbe\x96\x3b\xa0\x26\x3c\xca\x74\xe8\x97\xd9\xc4\x1a\x3e\x8d\xe7\xe7\xe5\xd0\xb1\xcd\xfc\x1d\x87\xab\xac\x2f\xe4\x30\x9f\xb5\x0c\x60\xe3\xcb\x25\x8c\x4e\x19\xb5\x65\x80\x30\x8c\xab\x35\xd4\x58\x18\xca\x15\x1f\x32\x8f\x22\x1f\xa1\xb4\x43\xe1\xce\xa8\xc7\x76\xbd\xc5\xa7\x37\x10\x67\xcb\xee\x8a\x7d\xb8\xfa\x1f\x98\xb8\xc9\xc2\x52\x63\xa2\x00\xb8\x15\xa4\xea\x66\xb3\xc4\x5b\x6a\xf0\xa1\xec\x46\x2c\x67\x2b\x24\x8c\x80\x95\x8d\x05\x95\xaf\x55\xcb\x67\x33\xae\x97\xb1\x35\x1b\x9e\x7f\xf2\xfb\x87\x44\x31\xcb\x0d\xb7\xba\xac\xcd\xa2\xdb\xbe\xbc\xc9\x44\x1d\x1d\x16\x3d\x13\x4c\x14\xca\xa5\x45\x31\xe2\x2b\x57\x3f\x08\x60\xf8\x2a\x84\x1f\x77\xce\x70\xc1\x06\xf6\x84\xe0\x12\x46\x69\xee\xfc\x7d\xc8\x1d\xa4\x9c\x90\x60\xe9\x21\x5c\xcf\x35\x35\xed\x12\x03\xa7\xdc\xdd\x37\xec\x01\x50\x52\xa5\x55\x9f\x59\x8d\x1a\xfe\x3c\x38\x5f\xe4\x96\x68\x76\x89\x08\x59\x96\xeb\x53\x6b\xd9\x27\x58\xed\xc6\x99\x57\x52\xa0\xee\xc7\xeb\x09\xc7\xe9\x46\xe6\xd9\xe5\x22\x01\x58\x48\xe9\x06\x34\x6e\x29\x4b\x24\x49\x5c\xc4\x3d\x0a\x21\x56\x63\x7f\x6c\xc8\x75\xd0\xaa\x8e\xf5\xf1\x8e\x66\x51\xb6\x81\x29\x17\xd1\xc1\x9f\x5a\x52\x46\x3e\x2d\x86\x92\xe1\xdd\xf6\x7f\x1f\xec\x91\xdc\x5f\x1b\xf8\x74\x8d\xdf\x3a\xf4\xc3\x0b\xe3\x7a\xc0\xff\x69\xf7\xd9\xee\x9b\xdd\xdb\x05\xff\xe7\x01\x76\x98\x8c\x2b\x70\x6d\x86\x28\xcf\xbf\x04\xd3\xe5\x97\xff\x72\xe7\xcd\x93\x9f\x6b\x57\xcf\xfa\x54\x36\x10\xff\x2c\x3c\x34\x0a\x92\x5b\x81\xcf\x29\x3e\x84\xae\x8d\x79\xb4\xd0\x7f\x2f\xd4\x7b\xf9\xe2\x75\x3d\xcd\xfd\xf7\x05\x7d\x56\x5c\x9f\xe0\xe2\x32\xff\xcd\x00\xff\xeb\x1f\x0c\xf7\x3f\x98\xf4\x9e\xce\x6f\xb0\x0b\xbf\xfe\x9b\x6d\x82\x72\xb0\x79\xc8\xc1\xd6\x26\x0a\x61\x06\x16\x23\xb5\x4b\xe0\x74\x0c\xd3\xfe\xa0\xbb\xca\x31\x8f\xf0\xc7\x0f\x14\xb3\xfd\xc1\x32\x31\xdb\xcb\x13\x28\x79\x4d\x55\x26\x20\xe5\x8b\xfc\x2b\x6d\x17\x8b\x39\x4d\xf5\xc9\x0a\x42\xef\xd2\x0f\x01\xd3\x04\x5d\xb9\x34\x34\xf0\x56\xc9\xc3\x8b\x24\x95\x12\x4d\xde\xfb\xe7\x2f\x1b\x1e\x78\xb9\xa0\x71\x7e\x02\xec\xde\x55\x52\xfd\xaa\x87\xa6\x77\x26\x13\xae\xd4\x84\x6d\xab\xd4\x71\xba\x60\x13\xa1\xb7\x14\x9f\x95\xe5\x65\x1a\x14\x43\x2c\xc1\x30\x8c\x8e\x7a\xad\xc2\x41\x6c\x3c\x83\x54\x6f\xa9\xf3\x25\x53\xab\x3f\x5f\x95\x79\xf7\xd1\x36\xb9\xe6\x73\x3c\x1c\xee\xe2\x90\x2a\xe4\x0b\xc4\x9b\x58\xe0\x4e\x62\x28\x37\x2f\x2a\xca\x47\x13\xb6\xaa\x5d\x2a\xd9\xa7\x9e\x0e\xaa\x4d\xb4\x80\x9c\x5f\x59\xea\xc3\x16\x93\xe1\x81\xab\xba\x7f\x0d\x87\x64\x53\xa7\x60\x1d\xeb\xec\x49\x23\xa5\x11\x2d\x48\xc1\x42\x49\xd9\x39\x88\x18\xa9\x84\x28\xb4\x22\xbe\x79\xd1\x82\x64\x12\x53\x0e\x39\x8a\xa1\x84\x1e\x28\xc3\x7f\xc1\xb6\x0c\x92\x66\x98\xd7\xe8\x5a\x96\xde\x06\xc4\x78\x3d\x09\x2e\xeb\x84\x08\xfc\xb2\xd1\x48\x47\xca\xa6\x1a\xb4\x52\xf3\x4b\x60\x7f\x61\x72\x09\x79\x83\x65\xd3\x3e\x91\xd3\x91\x77\x71\xf3\x33\xce\x16\xef\x98\x78\xf8\xf8\x13\xe1\xae\x25\x3c\x96\xba\x8f\x18\x7a\x86\x65\x1b\x9a\xd3\x23\xf1\x17\x58\x63\x48\xc9\x3f\x6e\x73\x46\xa3\xda\x43\xc3\xc8\xe2\x8f\x4c\x63\x95\x9d\xf1\xd8\x49\xcf\x17\x54\xbb\xed\x13\xc8\x2f\x71\x82\xa4\xd7\xc0\x34\xbd\xc1\xab\xbd\xf2\x21\xae\xf1\x03\x13\x19\x98\x04\x75\x51\xb8\xb3\xc8\xb1\x79\x56\x72\xc8\x9d\xb5\x86\x2b\x28\x19\x73\xac\x88\x32\x8b\x10\x05\xc3\xfd\xb1\x06\x81\x02\xd0\x5d\x29\x49\x08\x7c\xa9\xea\x86\x6e\x5c\x8e\x0c\xe8\x56\x25\xa3\xea\xba\x8e\xb6\x56\xca\x31\x69\x39\xfe\xac\x47\x4b\x17\x95\x16\x13\x2b\xf2\x74\x06\x47\x50\xd1\x4f\x23\x35\x12\x51\x2c\xda\x56\xad\xe3\xe0\x88\x8e\x14\xfd\xf6\x2a\x15\xdf\x35\xa7\x08\x6e\xa7\xdd\x68\xc3\x69\xc1\x8e\xf2\x24\x7e\x6f\xf4\x29\x0b\x4e\x1d\x22\x5c\x78\xf7\xf8\x03\x48\x19\x20\x97\x3d\x51\xc2\x83\xf7\xfb\xfd\xa6\xf3\x54\x7b\x80\xf0\x86\xaf\xe0\xf3\x75\x6f\x13\xcd\x72\x19\x61\xbc\x7e\x0e\xb9\xcb\x51\x15\x1c\x2e\x20\x74\x08\x1e\xdd\xa5\xf0\x50\xf0\xc9\xe0\xa1\x6c\x9a\x69\x6b\xb6\x80\xc3\x02\x2b\x95\xac\x8d\x4e\x5c\x83\x0b\x35\x11\x8a\xa3\x00\x23\xca\xd4\xb6\x08\xc2\xff\x2f\x24\xa5\x92\x10\x51\x32\x61\xfb\x69\x1b\x52\x7a\xf5\xce\xea\x1e\x52\x92\xea\x65\x29\xe2\xd8\x53\xb3\xcf\xdc\xd5\xc0\xf5\xaf\x9e\x21\x08\x7d\xd7\x35\xe9\x05\xd9\x9a\x28\xeb\x78\x82\xa1\xb4\x04\xbf\x95\x5c\x2c\xbf\xf4\x6a\x16\x8c\x85\x8b\xb7\xba\xd0\xfa\xf5\x4b\xc7\x77\xee\xf0\xba\x1c\xb4\xa4\x8a\x62\x87\x66\x6b\x22\x4e\xff\x87\xeb\x70\xfa\xaf\x38\xbd\xd2\x61\x9c\xe7\x0b\x98\x49\xde\x52\xc4\x90\x85\xb7\x62\x78\xb6\x59\x7f\x36\x5e\xb1\xf9\x8b\x06\xd9\xe4\x08\x58\x24\x34\x13\x62\x3b\x01\x82\x31\x40\xf3\x51\xc3\x0b\xc3\xa4\x8d\xcf\xf1\xde\xea\x6a\xb7\x9d\x8f\x51\x24\x67\x39\x1d\xba\xf4\xa0\x14\x31\x9c\x4e\x10\xd4\x77\xd0\x11\xca\x3b\x27\x9b\xa8\x32\xc1\xc7\x4b\xe0\xfe\x0a\x6b\x07\xdd\x94\x49\x2f\x08\x5d\xec\x43\xdf\x98\x1b\x14\x8f\xcf\xd9\x09\xa6\x4c\x6e\xe3\x68\x74\x14\xdd\x29\xe7\x7e\x81\xdd\x21\x22\x82\xcf\xc1\x2e\x7d\xec\x6a\x0f\x07\x5d\x3c\xb5\xc3\x73\xfa\xd0\x51\x66\xdf\x6f\x2f\x56\xa6\x3d\xa4\x2d\xc4\xff\xeb\x72\xda\x86\xff\x13\x00\x00\xff\xff\x9d\x08\xe7\xdf\x51\x92\x1c\x00") - -func distMainJsBytes() ([]byte, error) { - return bindataRead( - _distMainJs, - "dist/main.js", - ) -} - -func distMainJs() (*asset, error) { - bytes, err := distMainJsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "dist/main.js", size: 1872465, mode: os.FileMode(420), modTime: time.Unix(1443253097, 0)} - a := &asset{bytes: bytes, info: info} - 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) { - cannonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[cannonicalName]; 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) -} - -// 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 -} - -// 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) { - cannonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[cannonicalName]; 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) -} - -// 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){ - "dist/app.css": distAppCSS, - "dist/index.html": distIndexHTML, - "dist/main.js": distMainJs, -} - -// 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 -// AssetDir("") will return []string{"data"}. -func AssetDir(name string) ([]string, error) { - node := _bintree - if len(name) != 0 { - cannonicalName := strings.Replace(name, "\\", "/", -1) - pathList := strings.Split(cannonicalName, "/") - 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{ - "dist": {nil, map[string]*bintree{ - "app.css": {distAppCSS, map[string]*bintree{}}, - "index.html": {distIndexHTML, map[string]*bintree{}}, - "main.js": {distMainJs, 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 - } - err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) - if err != nil { - return err - } - return nil -} - -// 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 { - cannonicalName := strings.Replace(name, "\\", "/", -1) - return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...) -} - -func assetFS() *assetfs.AssetFS { - for k := range _bintree.Children { - return &assetfs.AssetFS{Asset: Asset, AssetDir: AssetDir, Prefix: k} - } - panic("unreachable") -} diff --git a/server-auth-config.go b/auth-config.go similarity index 79% rename from server-auth-config.go rename to auth-config.go index 35c7ed83c..62d79aae6 100644 --- a/server-auth-config.go +++ b/auth-config.go @@ -21,21 +21,15 @@ import ( "os/user" "path/filepath" - "github.com/minio/minio/pkg/probe" - "github.com/minio/minio/pkg/quick" + "github.com/minio/minio-xl/pkg/probe" + "github.com/minio/minio-xl/pkg/quick" ) -// AuthUser container -type AuthUser struct { - Name string `json:"name"` - AccessKeyID string `json:"accessKeyId"` - SecretAccessKey string `json:"secretAccessKey"` -} - // AuthConfig auth keys type AuthConfig struct { - Version string - Users map[string]*AuthUser + Version string `json:"version"` + AccessKeyID string `json:"accessKeyId"` + SecretAccessKey string `json:"secretAccessKey"` } // getAuthConfigPath get users config path @@ -89,19 +83,14 @@ func getAuthConfigFile() (string, *probe.Error) { if err != nil { return "", err.Trace() } - return filepath.Join(authConfigPath, "users.json"), nil + return filepath.Join(authConfigPath, "fsUsers.json"), nil } -// customConfigPath not accessed from outside only allowed through get/set methods +// customConfigPath for custom config path only for testing purposes var customConfigPath string -// SetAuthConfigPath - set custom auth config path -func SetAuthConfigPath(configPath string) { - customConfigPath = configPath -} - -// SaveConfig save auth config -func SaveConfig(a *AuthConfig) *probe.Error { +// saveAuthConfig save auth config +func saveAuthConfig(a *AuthConfig) *probe.Error { authConfigFile, err := getAuthConfigFile() if err != nil { return err.Trace() @@ -116,8 +105,8 @@ func SaveConfig(a *AuthConfig) *probe.Error { return nil } -// LoadConfig load auth config -func LoadConfig() (*AuthConfig, *probe.Error) { +// loadAuthConfig load auth config +func loadAuthConfig() (*AuthConfig, *probe.Error) { authConfigFile, err := getAuthConfigFile() if err != nil { return nil, err.Trace() @@ -126,8 +115,7 @@ func LoadConfig() (*AuthConfig, *probe.Error) { return nil, probe.NewError(err) } a := &AuthConfig{} - a.Version = "0.0.1" - a.Users = make(map[string]*AuthUser) + a.Version = "1" qc, err := quick.New(a) if err != nil { return nil, err.Trace() diff --git a/server-auth.go b/auth-utils.go similarity index 68% rename from server-auth.go rename to auth-utils.go index 619a47b7b..c71a29702 100644 --- a/server-auth.go +++ b/auth-utils.go @@ -19,19 +19,34 @@ package main import ( "crypto/rand" "encoding/base64" + "regexp" - "github.com/minio/minio/pkg/probe" + "github.com/minio/minio-xl/pkg/probe" ) +const ( + minioAccessID = 20 + minioSecretID = 40 +) + +// isValidAccessKey - validate access key +func isValidAccessKey(accessKeyID string) bool { + if accessKeyID == "" { + return true + } + regex := regexp.MustCompile("^[A-Z0-9\\-\\.\\_\\~]{20}$") + return regex.MatchString(accessKeyID) +} + // generateAccessKeyID - generate random alpha numeric value using only uppercase characters // takes input as size in integer func generateAccessKeyID() ([]byte, *probe.Error) { - alpha := make([]byte, MinioAccessID) + alpha := make([]byte, minioAccessID) _, err := rand.Read(alpha) if err != nil { return nil, probe.NewError(err) } - for i := 0; i < MinioAccessID; i++ { + for i := 0; i < minioAccessID; i++ { alpha[i] = alphaNumericTable[alpha[i]%byte(len(alphaNumericTable))] } return alpha, nil @@ -39,32 +54,25 @@ func generateAccessKeyID() ([]byte, *probe.Error) { // generateSecretAccessKey - generate random base64 numeric value from a random seed. func generateSecretAccessKey() ([]byte, *probe.Error) { - rb := make([]byte, MinioSecretID) + rb := make([]byte, minioSecretID) _, err := rand.Read(rb) if err != nil { return nil, probe.NewError(err) } - return []byte(base64.StdEncoding.EncodeToString(rb))[:MinioSecretID], nil + return []byte(base64.StdEncoding.EncodeToString(rb))[:minioSecretID], nil } // mustGenerateAccessKeyID - must generate random alpha numeric value using only uppercase characters // takes input as size in integer func mustGenerateAccessKeyID() []byte { - alpha := make([]byte, MinioAccessID) - _, err := rand.Read(alpha) - fatalIf(probe.NewError(err), "Unable to get random number from crypto/rand.", nil) - - for i := 0; i < MinioAccessID; i++ { - alpha[i] = alphaNumericTable[alpha[i]%byte(len(alphaNumericTable))] - } + alpha, err := generateAccessKeyID() + fatalIf(err.Trace(), "Unable to generate accessKeyID.", nil) return alpha } // mustGenerateSecretAccessKey - generate random base64 numeric value from a random seed. func mustGenerateSecretAccessKey() []byte { - rb := make([]byte, MinioSecretID) - _, err := rand.Read(rb) - fatalIf(probe.NewError(err), "Unable to get random number from crypto/rand.", nil) - - return []byte(base64.StdEncoding.EncodeToString(rb))[:MinioSecretID] + secretKey, err := generateSecretAccessKey() + fatalIf(err.Trace(), "Unable to generate secretAccessKey.", nil) + return secretKey } diff --git a/server-api-acl.go b/bucket-acl.go similarity index 100% rename from server-api-acl.go rename to bucket-acl.go diff --git a/server-api-bucket-handlers.go b/bucket-handlers.go similarity index 77% rename from server-api-bucket-handlers.go rename to bucket-handlers.go index 8eec77bad..5e7c55603 100644 --- a/server-api-bucket-handlers.go +++ b/bucket-handlers.go @@ -17,12 +17,14 @@ package main import ( + "encoding/hex" + "io/ioutil" "net/http" "github.com/gorilla/mux" - "github.com/minio/minio/pkg/donut" - "github.com/minio/minio/pkg/probe" - signv4 "github.com/minio/minio/pkg/signature" + "github.com/minio/minio/pkg/fs" + "github.com/minio/minio-xl/pkg/crypto/sha256" + "github.com/minio/minio-xl/pkg/probe" ) // ListMultipartUploadsHandler - GET Bucket (List Multipart uploads) @@ -33,15 +35,6 @@ import ( // This operation returns at most 1,000 multipart uploads in the response. // func (api API) ListMultipartUploadsHandler(w http.ResponseWriter, req *http.Request) { - // Ticket master block - { - op := APIOperation{} - op.ProceedCh = make(chan struct{}) - api.OP <- op - // block until ticket master gives us a go - <-op.ProceedCh - } - resources := getBucketMultipartResources(req.URL.Query()) if resources.MaxUploads < 0 { writeErrorResponse(w, req, InvalidMaxUploads, req.URL.Path) @@ -54,11 +47,11 @@ func (api API) ListMultipartUploadsHandler(w http.ResponseWriter, req *http.Requ vars := mux.Vars(req) bucket := vars["bucket"] - resources, err := api.Donut.ListMultipartUploads(bucket, resources) + resources, err := api.Filesystem.ListMultipartUploads(bucket, resources) if err != nil { errorIf(err.Trace(), "ListMultipartUploads failed.", nil) switch err.ToGoError().(type) { - case donut.BucketNotFound: + case fs.BucketNotFound: writeErrorResponse(w, req, NoSuchBucket, req.URL.Path) default: writeErrorResponse(w, req, InternalError, req.URL.Path) @@ -81,15 +74,6 @@ func (api API) ListMultipartUploadsHandler(w http.ResponseWriter, req *http.Requ // criteria to return a subset of the objects in a bucket. // func (api API) ListObjectsHandler(w http.ResponseWriter, req *http.Request) { - // Ticket master block - { - op := APIOperation{} - op.ProceedCh = make(chan struct{}) - api.OP <- op - // block until Ticket master gives us a go - <-op.ProceedCh - } - if isRequestUploads(req.URL.Query()) { api.ListMultipartUploadsHandler(w, req) return @@ -107,7 +91,7 @@ func (api API) ListObjectsHandler(w http.ResponseWriter, req *http.Request) { vars := mux.Vars(req) bucket := vars["bucket"] - objects, resources, err := api.Donut.ListObjects(bucket, resources) + objects, resources, err := api.Filesystem.ListObjects(bucket, resources) if err == nil { // generate response response := generateListObjectsResponse(bucket, objects, resources) @@ -119,13 +103,13 @@ func (api API) ListObjectsHandler(w http.ResponseWriter, req *http.Request) { return } switch err.ToGoError().(type) { - case donut.BucketNameInvalid: + case fs.BucketNameInvalid: writeErrorResponse(w, req, InvalidBucketName, req.URL.Path) - case donut.BucketNotFound: + case fs.BucketNotFound: writeErrorResponse(w, req, NoSuchBucket, req.URL.Path) - case donut.ObjectNotFound: + case fs.ObjectNotFound: writeErrorResponse(w, req, NoSuchKey, req.URL.Path) - case donut.ObjectNameInvalid: + case fs.ObjectNameInvalid: writeErrorResponse(w, req, NoSuchKey, req.URL.Path) default: errorIf(err.Trace(), "ListObjects failed.", nil) @@ -138,23 +122,7 @@ func (api API) ListObjectsHandler(w http.ResponseWriter, req *http.Request) { // This implementation of the GET operation returns a list of all buckets // owned by the authenticated sender of the request. func (api API) ListBucketsHandler(w http.ResponseWriter, req *http.Request) { - // Ticket master block - { - op := APIOperation{} - op.ProceedCh = make(chan struct{}) - api.OP <- op - // block until Ticket master gives us a go - <-op.ProceedCh - } - - // uncomment this when we have webcli - // without access key credentials one cannot list buckets - // if _, err := StripAccessKeyID(req); err != nil { - // writeErrorResponse(w, req, AccessDenied, req.URL.Path) - // return - // } - - buckets, err := api.Donut.ListBuckets() + buckets, err := api.Filesystem.ListBuckets() if err == nil { // generate response response := generateListBucketsResponse(buckets) @@ -173,15 +141,6 @@ func (api API) ListBucketsHandler(w http.ResponseWriter, req *http.Request) { // ---------- // This implementation of the PUT operation creates a new bucket for authenticated request func (api API) PutBucketHandler(w http.ResponseWriter, req *http.Request) { - // Ticket master block - { - op := APIOperation{} - op.ProceedCh = make(chan struct{}) - api.OP <- op - // block until Ticket master gives us a go - <-op.ProceedCh - } - if _, err := stripAccessKeyID(req.Header.Get("Authorization")); err != nil { writeErrorResponse(w, req, AccessDenied, req.URL.Path) return @@ -197,7 +156,7 @@ func (api API) PutBucketHandler(w http.ResponseWriter, req *http.Request) { vars := mux.Vars(req) bucket := vars["bucket"] - var signature *signv4.Signature + var signature *fs.Signature if !api.Anonymous { if _, ok := req.Header["Authorization"]; ok { // Init signature V4 verification @@ -214,24 +173,36 @@ func (api API) PutBucketHandler(w http.ResponseWriter, req *http.Request) { // if body of request is non-nil then check for validity of Content-Length if req.Body != nil { /// if Content-Length missing, deny the request - size := req.Header.Get("Content-Length") - if size == "" { + if req.Header.Get("Content-Length") == "" { writeErrorResponse(w, req, MissingContentLength, req.URL.Path) return } + if signature != nil { + locationBytes, err := ioutil.ReadAll(req.Body) + if err != nil { + sh := sha256.New() + sh.Write(locationBytes) + ok, perr := signature.DoesSignatureMatch(hex.EncodeToString(sh.Sum(nil))) + if perr != nil { + errorIf(perr.Trace(), "MakeBucket failed.", nil) + writeErrorResponse(w, req, InternalError, req.URL.Path) + return + } + if !ok { + writeErrorResponse(w, req, SignatureDoesNotMatch, req.URL.Path) + return + } + } + } } - err := api.Donut.MakeBucket(bucket, getACLTypeString(aclType), req.Body, signature) + err := api.Filesystem.MakeBucket(bucket, getACLTypeString(aclType)) if err != nil { errorIf(err.Trace(), "MakeBucket failed.", nil) switch err.ToGoError().(type) { - case signv4.DoesNotMatch: - writeErrorResponse(w, req, SignatureDoesNotMatch, req.URL.Path) - case donut.TooManyBuckets: - writeErrorResponse(w, req, TooManyBuckets, req.URL.Path) - case donut.BucketNameInvalid: + case fs.BucketNameInvalid: writeErrorResponse(w, req, InvalidBucketName, req.URL.Path) - case donut.BucketExists: + case fs.BucketExists: writeErrorResponse(w, req, BucketAlreadyExists, req.URL.Path) default: writeErrorResponse(w, req, InternalError, req.URL.Path) @@ -248,15 +219,6 @@ func (api API) PutBucketHandler(w http.ResponseWriter, req *http.Request) { // This implementation of the POST operation handles object creation with a specified // signature policy in multipart/form-data func (api API) PostPolicyBucketHandler(w http.ResponseWriter, req *http.Request) { - // Ticket master block - { - op := APIOperation{} - op.ProceedCh = make(chan struct{}) - api.OP <- op - // block until Ticket master gives us a go - <-op.ProceedCh - } - // if body of request is non-nil then check for validity of Content-Length if req.Body != nil { /// if Content-Length missing, deny the request @@ -307,32 +269,30 @@ func (api API) PostPolicyBucketHandler(w http.ResponseWriter, req *http.Request) writeErrorResponse(w, req, MalformedPOSTRequest, req.URL.Path) return } - metadata, perr := api.Donut.CreateObject(bucket, object, "", 0, fileBody, nil, nil) + metadata, perr := api.Filesystem.CreateObject(bucket, object, "", 0, fileBody, nil) if perr != nil { errorIf(perr.Trace(), "CreateObject failed.", nil) switch perr.ToGoError().(type) { - case donut.BucketNotFound: + case fs.BucketNotFound: writeErrorResponse(w, req, NoSuchBucket, req.URL.Path) - case donut.BucketNameInvalid: + case fs.BucketNameInvalid: writeErrorResponse(w, req, InvalidBucketName, req.URL.Path) - case donut.ObjectExists: - writeErrorResponse(w, req, MethodNotAllowed, req.URL.Path) - case donut.BadDigest: + case fs.BadDigest: writeErrorResponse(w, req, BadDigest, req.URL.Path) - case signv4.DoesNotMatch: + case fs.SignatureDoesNotMatch: writeErrorResponse(w, req, SignatureDoesNotMatch, req.URL.Path) - case donut.IncompleteBody: + case fs.IncompleteBody: writeErrorResponse(w, req, IncompleteBody, req.URL.Path) - case donut.EntityTooLarge: + case fs.EntityTooLarge: writeErrorResponse(w, req, EntityTooLarge, req.URL.Path) - case donut.InvalidDigest: + case fs.InvalidDigest: writeErrorResponse(w, req, InvalidDigest, req.URL.Path) default: writeErrorResponse(w, req, InternalError, req.URL.Path) } return } - w.Header().Set("ETag", metadata.MD5Sum) + w.Header().Set("ETag", "\""+metadata.Md5+"\"") writeSuccessResponse(w) } @@ -340,15 +300,6 @@ func (api API) PostPolicyBucketHandler(w http.ResponseWriter, req *http.Request) // ---------- // This implementation of the PUT operation modifies the bucketACL for authenticated request func (api API) PutBucketACLHandler(w http.ResponseWriter, req *http.Request) { - // Ticket master block - { - op := APIOperation{} - op.ProceedCh = make(chan struct{}) - api.OP <- op - // block until Ticket master gives us a go - <-op.ProceedCh - } - // read from 'x-amz-acl' aclType := getACLType(req) if aclType == unsupportedACLType { @@ -359,13 +310,13 @@ func (api API) PutBucketACLHandler(w http.ResponseWriter, req *http.Request) { vars := mux.Vars(req) bucket := vars["bucket"] - err := api.Donut.SetBucketMetadata(bucket, map[string]string{"acl": getACLTypeString(aclType)}) + err := api.Filesystem.SetBucketMetadata(bucket, map[string]string{"acl": getACLTypeString(aclType)}) if err != nil { errorIf(err.Trace(), "PutBucketACL failed.", nil) switch err.ToGoError().(type) { - case donut.BucketNameInvalid: + case fs.BucketNameInvalid: writeErrorResponse(w, req, InvalidBucketName, req.URL.Path) - case donut.BucketNotFound: + case fs.BucketNotFound: writeErrorResponse(w, req, NoSuchBucket, req.URL.Path) default: writeErrorResponse(w, req, InternalError, req.URL.Path) @@ -382,25 +333,16 @@ func (api API) PutBucketACLHandler(w http.ResponseWriter, req *http.Request) { // know its ``acl``. This operation willl return response of 404 // if bucket not found and 403 for invalid credentials. func (api API) GetBucketACLHandler(w http.ResponseWriter, req *http.Request) { - // Ticket master block - { - op := APIOperation{} - op.ProceedCh = make(chan struct{}) - api.OP <- op - // block until Ticket master gives us a go - <-op.ProceedCh - } - vars := mux.Vars(req) bucket := vars["bucket"] - bucketMetadata, err := api.Donut.GetBucketMetadata(bucket) + bucketMetadata, err := api.Filesystem.GetBucketMetadata(bucket) if err != nil { errorIf(err.Trace(), "GetBucketMetadata failed.", nil) switch err.ToGoError().(type) { - case donut.BucketNotFound: + case fs.BucketNotFound: writeErrorResponse(w, req, NoSuchBucket, req.URL.Path) - case donut.BucketNameInvalid: + case fs.BucketNameInvalid: writeErrorResponse(w, req, InvalidBucketName, req.URL.Path) default: writeErrorResponse(w, req, InternalError, req.URL.Path) @@ -423,25 +365,16 @@ func (api API) GetBucketACLHandler(w http.ResponseWriter, req *http.Request) { // have permission to access it. Otherwise, the operation might // return responses such as 404 Not Found and 403 Forbidden. func (api API) HeadBucketHandler(w http.ResponseWriter, req *http.Request) { - // Ticket master block - { - op := APIOperation{} - op.ProceedCh = make(chan struct{}) - api.OP <- op - // block until Ticket master gives us a go - <-op.ProceedCh - } - vars := mux.Vars(req) bucket := vars["bucket"] - _, err := api.Donut.GetBucketMetadata(bucket) + _, err := api.Filesystem.GetBucketMetadata(bucket) if err != nil { errorIf(err.Trace(), "GetBucketMetadata failed.", nil) switch err.ToGoError().(type) { - case donut.BucketNotFound: + case fs.BucketNotFound: writeErrorResponse(w, req, NoSuchBucket, req.URL.Path) - case donut.BucketNameInvalid: + case fs.BucketNameInvalid: writeErrorResponse(w, req, InvalidBucketName, req.URL.Path) default: writeErrorResponse(w, req, InternalError, req.URL.Path) @@ -450,3 +383,24 @@ func (api API) HeadBucketHandler(w http.ResponseWriter, req *http.Request) { } writeSuccessResponse(w) } + +// DeleteBucketHandler - Delete bucket +func (api API) DeleteBucketHandler(w http.ResponseWriter, req *http.Request) { + vars := mux.Vars(req) + bucket := vars["bucket"] + + err := api.Filesystem.DeleteBucket(bucket) + if err != nil { + errorIf(err.Trace(), "DeleteBucket failed.", nil) + switch err.ToGoError().(type) { + case fs.BucketNotFound: + writeErrorResponse(w, req, NoSuchBucket, req.URL.Path) + case fs.BucketNotEmpty: + writeErrorResponse(w, req, BucketNotEmpty, req.URL.Path) + default: + writeErrorResponse(w, req, InternalError, req.URL.Path) + } + return + } + writeSuccessResponse(w) +} diff --git a/buildscripts/checkdeps.sh b/buildscripts/checkdeps.sh index 7fc543304..47fefdae3 100644 --- a/buildscripts/checkdeps.sh +++ b/buildscripts/checkdeps.sh @@ -20,9 +20,6 @@ _init() { shopt -s extglob ## Minimum required versions for build dependencies - GCC_VERSION="4.0" - LLVM_VERSION="7.0.0" - YASM_VERSION="1.2.0" GIT_VERSION="1.0" GO_VERSION="1.5.1" OSX_VERSION="10.8" @@ -180,29 +177,6 @@ check_deps() { if [ $? -ge 2 ]; then MISSING="${MISSING} git" fi - - case ${UNAME%% *} in - "Linux") - check_version "$(env gcc --version 2>/dev/null | sed 's/^.* \([0-9.]*\).*$/\1/' | head -1)" "${GCC_VERSION}" - if [ $? -ge 2 ]; then - MISSING="${MISSING} build-essential(${GCC_VERSION})" - fi - ;; - "Darwin") - check_version "$(env gcc --version 2>/dev/null | awk '{print $4}' | head -1)" "${LLVM_VERSION}" - if [ $? -ge 2 ]; then - MISSING="${MISSING} xcode-cli(${LLVM_VERSION})" - fi - ;; - "*") - ;; - esac - - check_version "$(env yasm --version 2>/dev/null | sed 's/^.* \([0-9.]*\).*$/\1/' | head -1)" "${YASM_VERSION}" - if [ $? -ge 2 ]; then - MISSING="${MISSING} yasm(${YASM_VERSION})" - fi - } main() { diff --git a/console.go b/console.go index 5f640061a..26d9cc523 100644 --- a/console.go +++ b/console.go @@ -27,8 +27,7 @@ import ( type logLevel int const ( - levelUnknown logLevel = iota - levelPrint + levelPrint logLevel = iota + 1 levelDebug levelInfo levelError diff --git a/contributors.sh b/contributors.sh deleted file mode 100755 index ffb3655a2..000000000 --- a/contributors.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -set -e - -cd "$(dirname "$(readlink -f "$BASH_SOURCE")")" - -# see also ".mailmap" for how email addresses and names are deduplicated - -{ - cat <<-'EOH' -## Contributors - - EOH - echo - git log --format='%aN <%aE>' | LC_ALL=C.UTF-8 sort -uf | sed 's/^/- /g' -} > CONTRIBUTORS.md diff --git a/controller-main.go b/controller-main.go deleted file mode 100644 index 0acfedd0d..000000000 --- a/controller-main.go +++ /dev/null @@ -1,229 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 main - -import ( - "crypto/tls" - "encoding/json" - "fmt" - "net" - "net/http" - "os" - "strings" - - "github.com/minio/cli" - "github.com/minio/minio/pkg/minhttp" - "github.com/minio/minio/pkg/probe" -) - -var controllerCmd = cli.Command{ - Name: "controller", - Usage: "Start minio controller", - Action: controllerMain, - CustomHelpTemplate: `NAME: - minio {{.Name}} - {{.Description}} - -USAGE: - minio {{.Name}} [OPTION] - -EXAMPLES: - 1. Start minio controller - $ minio {{.Name}} - - 2. Fetch stored access keys - $ minio {{.Name}} keys -`, -} - -// configureControllerRPC instance -func configureControllerRPC(conf minioConfig, rpcHandler http.Handler) (*http.Server, *probe.Error) { - // Minio server config - rpcServer := &http.Server{ - Addr: conf.ControllerAddress, - Handler: rpcHandler, - MaxHeaderBytes: 1 << 20, - } - if conf.TLS { - var err error - rpcServer.TLSConfig = &tls.Config{} - rpcServer.TLSConfig.Certificates = make([]tls.Certificate, 1) - rpcServer.TLSConfig.Certificates[0], err = tls.LoadX509KeyPair(conf.CertFile, conf.KeyFile) - if err != nil { - return nil, probe.NewError(err) - } - } - host, port, err := net.SplitHostPort(conf.ControllerAddress) - if err != nil { - return nil, probe.NewError(err) - } - var hosts []string - switch { - case host != "": - hosts = append(hosts, host) - default: - addrs, err := net.InterfaceAddrs() - if err != nil { - return nil, probe.NewError(err) - } - for _, addr := range addrs { - if addr.Network() == "ip+net" { - host := strings.Split(addr.String(), "/")[0] - if ip := net.ParseIP(host); ip.To4() != nil { - hosts = append(hosts, host) - } - } - } - } - for _, host := range hosts { - if conf.TLS { - Printf("Starting minio controller on: https://%s:%s, PID: %d\n", host, port, os.Getpid()) - } else { - Printf("Starting minio controller on: http://%s:%s, PID: %d\n", host, port, os.Getpid()) - } - } - return rpcServer, nil -} - -// startController starts a minio controller -func startController(conf minioConfig) *probe.Error { - rpcServer, err := configureControllerRPC(conf, getControllerRPCHandler(conf.Anonymous)) - if err != nil { - return err.Trace() - } - // Setting rate limit to 'zero' no ratelimiting implemented - if err := minhttp.ListenAndServeLimited(0, rpcServer); err != nil { - return err.Trace() - } - return nil -} - -func genAuthFirstTime() (*AuthConfig, *probe.Error) { - if isAuthConfigFileExists() { - return nil, nil - } - if err := createAuthConfigPath(); err != nil { - return nil, err - } - // Initialize new config, since config file doesn't exist yet - config := &AuthConfig{} - config.Version = "0.0.1" - config.Users = make(map[string]*AuthUser) - - config.Users["admin"] = &AuthUser{ - Name: "admin", - AccessKeyID: "admin", - SecretAccessKey: string(mustGenerateSecretAccessKey()), - } - config.Users["user"] = &AuthUser{ - Name: "user", - AccessKeyID: string(mustGenerateAccessKeyID()), - SecretAccessKey: string(mustGenerateSecretAccessKey()), - } - if err := SaveConfig(config); err != nil { - return nil, err.Trace() - } - return config, nil -} - -func getAuth() (*AuthConfig, *probe.Error) { - config, err := LoadConfig() - if err != nil { - return nil, err.Trace() - } - return config, nil -} - -type accessKeys struct { - *AuthUser -} - -func (a accessKeys) String() string { - return colorizeMessage(fmt.Sprintf("Username: %s, AccessKey: %s, SecretKey: %s", a.Name, a.AccessKeyID, a.SecretAccessKey)) -} - -// JSON - json formatted output -func (a accessKeys) JSON() string { - b, err := json.Marshal(a) - errorIf(probe.NewError(err), "Unable to marshal json", nil) - return string(b) -} - -// firstTimeAuth first time authorization -func firstTimeAuth() *probe.Error { - conf, err := genAuthFirstTime() - if err != nil { - return err.Trace() - } - if conf != nil { - Println("Running for first time, generating access keys.") - for _, user := range conf.Users { - if globalJSONFlag { - Println(accessKeys{user}.JSON()) - } else { - Println(accessKeys{user}) - } - - } - Println("To fetch your keys again.") - Println(" $ minio controller keys") - } - return nil -} - -func getControllerConfig(c *cli.Context) minioConfig { - certFile := c.GlobalString("cert") - keyFile := c.GlobalString("key") - if (certFile != "" && keyFile == "") || (certFile == "" && keyFile != "") { - Fatalln("Both certificate and key are required to enable https.") - } - tls := (certFile != "" && keyFile != "") - return minioConfig{ - ControllerAddress: c.GlobalString("address-controller"), - TLS: tls, - CertFile: certFile, - KeyFile: keyFile, - RateLimit: c.GlobalInt("ratelimit"), - Anonymous: c.GlobalBool("anonymous"), - } -} - -func controllerMain(c *cli.Context) { - if c.Args().Present() && c.Args().First() != "keys" { - cli.ShowCommandHelpAndExit(c, "controller", 1) - } - - if c.Args().First() == "keys" { - conf, err := getAuth() - fatalIf(err.Trace(), "Failed to fetch keys for minio controller.", nil) - if conf != nil { - for _, user := range conf.Users { - if globalJSONFlag { - Println(accessKeys{user}.JSON()) - } else { - Println(accessKeys{user}) - } - } - } - return - } - - err := firstTimeAuth() - fatalIf(err.Trace(), "Failed to generate keys for minio.", nil) - - err = startController(getControllerConfig(c)) - fatalIf(err.Trace(), "Failed to start minio controller.", nil) -} diff --git a/controller-rpc-signature-handler.go b/controller-rpc-signature-handler.go deleted file mode 100644 index c4390b86a..000000000 --- a/controller-rpc-signature-handler.go +++ /dev/null @@ -1,246 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 main - -import ( - "bytes" - "encoding/hex" - "io" - "io/ioutil" - "net/http" - "sort" - "strings" - "time" - - "github.com/minio/minio/pkg/crypto/sha256" - "github.com/minio/minio/pkg/probe" -) - -type rpcSignatureHandler struct { - handler http.Handler -} - -// RPCSignatureHandler to validate authorization header for the incoming request. -func RPCSignatureHandler(h http.Handler) http.Handler { - return rpcSignatureHandler{h} -} - -type rpcSignature struct { - AccessKeyID string - SecretAccessKey string - Signature string - SignedHeaders []string - Request *http.Request -} - -// getCanonicalHeaders generate a list of request headers with their values -func (r *rpcSignature) getCanonicalHeaders(signedHeaders map[string][]string) string { - var headers []string - vals := make(map[string][]string) - for k, vv := range signedHeaders { - headers = append(headers, strings.ToLower(k)) - vals[strings.ToLower(k)] = vv - } - headers = append(headers, "host") - sort.Strings(headers) - - var buf bytes.Buffer - for _, k := range headers { - buf.WriteString(k) - buf.WriteByte(':') - switch { - case k == "host": - buf.WriteString(r.Request.Host) - fallthrough - default: - for idx, v := range vals[k] { - if idx > 0 { - buf.WriteByte(',') - } - buf.WriteString(v) - } - buf.WriteByte('\n') - } - } - return buf.String() -} - -// getSignedHeaders generate a string i.e alphabetically sorted, semicolon-separated list of lowercase request header names -func (r *rpcSignature) getSignedHeaders(signedHeaders map[string][]string) string { - var headers []string - for k := range signedHeaders { - headers = append(headers, strings.ToLower(k)) - } - headers = append(headers, "host") - sort.Strings(headers) - return strings.Join(headers, ";") -} - -// extractSignedHeaders extract signed headers from Authorization header -func (r rpcSignature) extractSignedHeaders() map[string][]string { - extractedSignedHeadersMap := make(map[string][]string) - for _, header := range r.SignedHeaders { - val, ok := r.Request.Header[http.CanonicalHeaderKey(header)] - if !ok { - // if not found continue, we will fail later - continue - } - extractedSignedHeadersMap[header] = val - } - return extractedSignedHeadersMap -} - -// getCanonicalRequest generate a canonical request of style -// -// canonicalRequest = -// \n -// \n -// \n -// \n -// \n -// -// -func (r *rpcSignature) getCanonicalRequest() string { - payload := r.Request.Header.Get(http.CanonicalHeaderKey("x-minio-content-sha256")) - r.Request.URL.RawQuery = strings.Replace(r.Request.URL.Query().Encode(), "+", "%20", -1) - encodedPath := getURLEncodedName(r.Request.URL.Path) - // convert any space strings back to "+" - encodedPath = strings.Replace(encodedPath, "+", "%20", -1) - canonicalRequest := strings.Join([]string{ - r.Request.Method, - encodedPath, - r.Request.URL.RawQuery, - r.getCanonicalHeaders(r.extractSignedHeaders()), - r.getSignedHeaders(r.extractSignedHeaders()), - payload, - }, "\n") - return canonicalRequest -} - -// getScope generate a string of a specific date, an AWS region, and a service -func (r rpcSignature) getScope(t time.Time) string { - scope := strings.Join([]string{ - t.Format(yyyymmdd), - "milkyway", - "rpc", - "rpc_request", - }, "/") - return scope -} - -// getStringToSign a string based on selected query values -func (r rpcSignature) getStringToSign(canonicalRequest string, t time.Time) string { - stringToSign := rpcAuthHeaderPrefix + "\n" + t.Format(iso8601Format) + "\n" - stringToSign = stringToSign + r.getScope(t) + "\n" - stringToSign = stringToSign + hex.EncodeToString(sha256.Sum256([]byte(canonicalRequest))) - return stringToSign -} - -// getSigningKey hmac seed to calculate final signature -func (r rpcSignature) getSigningKey(t time.Time) []byte { - secret := r.SecretAccessKey - date := sumHMAC([]byte("MINIO"+secret), []byte(t.Format(yyyymmdd))) - region := sumHMAC(date, []byte("milkyway")) - service := sumHMAC(region, []byte("rpc")) - signingKey := sumHMAC(service, []byte("rpc_request")) - return signingKey -} - -// getSignature final signature in hexadecimal form -func (r rpcSignature) getSignature(signingKey []byte, stringToSign string) string { - return hex.EncodeToString(sumHMAC(signingKey, []byte(stringToSign))) -} - -func (r rpcSignature) DoesSignatureMatch(hashedPayload string) (bool, *probe.Error) { - // set new calulated payload - r.Request.Header.Set("X-Minio-Content-Sha256", hashedPayload) - - // Add date if not present throw error - var date string - if date = r.Request.Header.Get(http.CanonicalHeaderKey("x-minio-date")); date == "" { - if date = r.Request.Header.Get("Date"); date == "" { - return false, probe.NewError(errMissingDateHeader) - } - } - t, err := time.Parse(iso8601Format, date) - if err != nil { - return false, probe.NewError(err) - } - canonicalRequest := r.getCanonicalRequest() - stringToSign := r.getStringToSign(canonicalRequest, t) - signingKey := r.getSigningKey(t) - newSignature := r.getSignature(signingKey, stringToSign) - - if newSignature != r.Signature { - return false, nil - } - return true, nil -} - -func isRequestSignatureRPC(req *http.Request) bool { - if _, ok := req.Header["Authorization"]; ok { - return ok - } - return false -} - -func (s rpcSignatureHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { - var signature *rpcSignature - if isRequestSignatureRPC(r) { - // Init signature V4 verification - var err *probe.Error - signature, err = initSignatureRPC(r) - if err != nil { - switch err.ToGoError() { - case errInvalidRegion: - errorIf(err.Trace(), "Unknown region in authorization header.", nil) - writeErrorResponse(w, r, AuthorizationHeaderMalformed, r.URL.Path) - return - case errAccessKeyIDInvalid: - errorIf(err.Trace(), "Invalid access key id.", nil) - writeErrorResponse(w, r, InvalidAccessKeyID, r.URL.Path) - return - default: - errorIf(err.Trace(), "Initializing signature v4 failed.", nil) - writeErrorResponse(w, r, InternalError, r.URL.Path) - return - } - } - buffer := new(bytes.Buffer) - if _, err := io.Copy(buffer, r.Body); err != nil { - errorIf(probe.NewError(err), "Unable to read payload from request body.", nil) - writeErrorResponse(w, r, InternalError, r.URL.Path) - return - } - value := sha256.Sum256(buffer.Bytes()) - ok, err := signature.DoesSignatureMatch(hex.EncodeToString(value[:])) - if err != nil { - errorIf(err.Trace(), "Unable to verify signature.", nil) - writeErrorResponse(w, r, InternalError, r.URL.Path) - return - } - if !ok { - writeErrorResponse(w, r, SignatureDoesNotMatch, r.URL.Path) - return - } - // Copy the buffer back into request body to be read by the RPC service callers - r.Body = ioutil.NopCloser(buffer) - s.handler.ServeHTTP(w, r) - } else { - writeErrorResponse(w, r, AccessDenied, r.URL.Path) - } -} diff --git a/controller-rpc-signature.go b/controller-rpc-signature.go deleted file mode 100644 index e557b436f..000000000 --- a/controller-rpc-signature.go +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 main - -import ( - "net/http" - "strings" - - "github.com/minio/minio/pkg/probe" -) - -const ( - rpcAuthHeaderPrefix = "MINIORPC" -) - -// getRPCCredentialsFromAuth parse credentials tag from authorization value -// Authorization: -// Authorization: MINIORPC Credential=admin/20130524/milkyway/rpc/rpc_request, -// SignedHeaders=host;x-minio-date, Signature=fe5f80f77d5fa3beca038a248ff027d0445342fe2855ddc963176630326f1024 -func getRPCCredentialsFromAuth(authValue string) ([]string, *probe.Error) { - if authValue == "" { - return nil, probe.NewError(errMissingAuthHeaderValue) - } - authFields := strings.Split(strings.TrimSpace(authValue), ",") - if len(authFields) != 3 { - return nil, probe.NewError(errInvalidAuthHeaderValue) - } - authPrefixFields := strings.Fields(authFields[0]) - if len(authPrefixFields) != 2 { - return nil, probe.NewError(errMissingFieldsAuthHeader) - } - if authPrefixFields[0] != rpcAuthHeaderPrefix { - return nil, probe.NewError(errInvalidAuthHeaderPrefix) - } - credentials := strings.Split(strings.TrimSpace(authPrefixFields[1]), "=") - if len(credentials) != 2 { - return nil, probe.NewError(errMissingFieldsCredentialTag) - } - if len(strings.Split(strings.TrimSpace(authFields[1]), "=")) != 2 { - return nil, probe.NewError(errMissingFieldsSignedHeadersTag) - } - if len(strings.Split(strings.TrimSpace(authFields[2]), "=")) != 2 { - return nil, probe.NewError(errMissingFieldsSignatureTag) - } - credentialElements := strings.Split(strings.TrimSpace(credentials[1]), "/") - if len(credentialElements) != 5 { - return nil, probe.NewError(errCredentialTagMalformed) - } - return credentialElements, nil -} - -// verify if rpcAuthHeader value has valid region -func isValidRPCRegion(authHeaderValue string) *probe.Error { - credentialElements, err := getRPCCredentialsFromAuth(authHeaderValue) - if err != nil { - return err.Trace() - } - region := credentialElements[2] - if region != "milkyway" { - return probe.NewError(errInvalidRegion) - } - return nil -} - -// stripRPCAccessKeyID - strip only access key id from auth header -func stripRPCAccessKeyID(authHeaderValue string) (string, *probe.Error) { - if err := isValidRPCRegion(authHeaderValue); err != nil { - return "", err.Trace() - } - credentialElements, err := getRPCCredentialsFromAuth(authHeaderValue) - if err != nil { - return "", err.Trace() - } - if credentialElements[0] != "admin" { - return "", probe.NewError(errAccessKeyIDInvalid) - } - return credentialElements[0], nil -} - -// initSignatureRPC initializing rpc signature verification -func initSignatureRPC(req *http.Request) (*rpcSignature, *probe.Error) { - // strip auth from authorization header - authHeaderValue := req.Header.Get("Authorization") - accessKeyID, err := stripRPCAccessKeyID(authHeaderValue) - if err != nil { - return nil, err.Trace() - } - authConfig, err := LoadConfig() - if err != nil { - return nil, err.Trace() - } - authFields := strings.Split(strings.TrimSpace(authHeaderValue), ",") - signedHeaders := strings.Split(strings.Split(strings.TrimSpace(authFields[1]), "=")[1], ";") - signature := strings.Split(strings.TrimSpace(authFields[2]), "=")[1] - for _, user := range authConfig.Users { - if user.AccessKeyID == accessKeyID { - signature := &rpcSignature{ - AccessKeyID: user.AccessKeyID, - SecretAccessKey: user.SecretAccessKey, - Signature: signature, - SignedHeaders: signedHeaders, - Request: req, - } - return signature, nil - } - } - return nil, probe.NewError(errAccessKeyIDInvalid) -} diff --git a/controller-rpc.go b/controller-rpc.go deleted file mode 100644 index 86ba1d96e..000000000 --- a/controller-rpc.go +++ /dev/null @@ -1,300 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 main - -import ( - "errors" - "net" - "net/http" - "net/url" - "os" - "runtime" - "strings" - - "github.com/gorilla/rpc/v2/json" - "github.com/minio/minio/pkg/probe" -) - -type controllerRPCService struct { - serverList []ServerRep -} - -// generateAuth generate new auth keys for a user -func generateAuth(args *AuthArgs, reply *AuthRep) *probe.Error { - config, err := LoadConfig() - if err != nil { - if os.IsNotExist(err.ToGoError()) { - // Initialize new config, since config file doesn't exist yet - config = &AuthConfig{} - config.Version = "0.0.1" - config.Users = make(map[string]*AuthUser) - } else { - return err.Trace() - } - } - if _, ok := config.Users[args.User]; ok { - return probe.NewError(errors.New("Credentials already set, if you wish to change this invoke Reset() method")) - } - accessKeyID, err := generateAccessKeyID() - if err != nil { - return err.Trace() - } - reply.AccessKeyID = string(accessKeyID) - - secretAccessKey, err := generateSecretAccessKey() - if err != nil { - return err.Trace() - } - reply.SecretAccessKey = string(secretAccessKey) - reply.Name = args.User - - config.Users[args.User] = &AuthUser{ - Name: args.User, - AccessKeyID: string(accessKeyID), - SecretAccessKey: string(secretAccessKey), - } - if err := SaveConfig(config); err != nil { - return err.Trace() - } - return nil -} - -// fetchAuth fetch auth keys for a user -func fetchAuth(args *AuthArgs, reply *AuthRep) *probe.Error { - config, err := LoadConfig() - if err != nil { - return err.Trace() - } - if _, ok := config.Users[args.User]; !ok { - return probe.NewError(errors.New("User not found")) - } - reply.AccessKeyID = config.Users[args.User].AccessKeyID - reply.SecretAccessKey = config.Users[args.User].SecretAccessKey - reply.Name = args.User - return nil -} - -// resetAuth reset auth keys for a user -func resetAuth(args *AuthArgs, reply *AuthRep) *probe.Error { - config, err := LoadConfig() - if err != nil { - return err.Trace() - } - if _, ok := config.Users[args.User]; !ok { - return probe.NewError(errors.New("User not found")) - } - accessKeyID, err := generateAccessKeyID() - if err != nil { - return err.Trace() - } - reply.AccessKeyID = string(accessKeyID) - secretAccessKey, err := generateSecretAccessKey() - if err != nil { - return err.Trace() - } - reply.SecretAccessKey = string(secretAccessKey) - reply.Name = args.User - - config.Users[args.User] = &AuthUser{ - Name: args.User, - AccessKeyID: string(accessKeyID), - SecretAccessKey: string(secretAccessKey), - } - return SaveConfig(config).Trace() -} - -// Generate auth keys -func (s *controllerRPCService) GenerateAuth(r *http.Request, args *AuthArgs, reply *AuthRep) error { - if strings.TrimSpace(args.User) == "" { - return errors.New("Invalid argument") - } - if err := generateAuth(args, reply); err != nil { - return probe.WrapError(err) - } - return nil -} - -// Fetch auth keys -func (s *controllerRPCService) FetchAuth(r *http.Request, args *AuthArgs, reply *AuthRep) error { - if strings.TrimSpace(args.User) == "" { - return errors.New("Invalid argument") - } - if err := fetchAuth(args, reply); err != nil { - return probe.WrapError(err) - } - return nil -} - -// Reset auth keys, generates new set of auth keys -func (s *controllerRPCService) ResetAuth(r *http.Request, args *AuthArgs, reply *AuthRep) error { - if strings.TrimSpace(args.User) == "" { - return errors.New("Invalid argument") - } - if err := resetAuth(args, reply); err != nil { - return probe.WrapError(err) - } - return nil -} - -func readAuthConfig() (*AuthConfig, *probe.Error) { - authConfig, err := LoadConfig() - if err != nil { - return nil, err.Trace() - } - return authConfig, nil -} - -func proxyRequest(method, host string, ssl bool, res interface{}) *probe.Error { - u := &url.URL{} - if ssl { - u.Scheme = "https" - } else { - u.Scheme = "http" - } - u.Host = host - if _, _, err := net.SplitHostPort(host); err == nil { - u.Host = host - } else { - u.Host = host + ":9002" - } - u.Path = "/rpc" - - op := rpcOperation{ - Method: method, - Request: ServerArg{}, - } - authConfig, err := readAuthConfig() - if err != nil { - return err.Trace() - } - request, err := newRPCRequest(authConfig, u.String(), op, nil) - if err != nil { - return err.Trace() - } - var resp *http.Response - resp, err = request.Do() - if err != nil { - return err.Trace() - } - if err := json.DecodeClientResponse(resp.Body, res); err != nil { - return probe.NewError(err) - } - return nil -} - -// StorageStats returns dummy storage stats -func (s *controllerRPCService) StorageStats(r *http.Request, args *ControllerArgs, reply *StorageStatsRep) error { - err := proxyRequest("Donut.StorageStats", args.Host, args.SSL, reply) - if err != nil { - return probe.WrapError(err) - } - return nil -} - -// RebalaceStats returns dummy rebalance stats -func (s *controllerRPCService) RebalanceStats(r *http.Request, args *ControllerArgs, reply *RebalanceStatsRep) error { - err := proxyRequest("Donut.RebalanceStats", args.Host, args.SSL, reply) - if err != nil { - return probe.WrapError(err) - } - return nil -} - -func (s *controllerRPCService) AddServer(r *http.Request, args *ControllerArgs, res *ServerRep) error { - err := proxyRequest("Server.Add", args.Host, args.SSL, res) - if err != nil { - return probe.WrapError(err) - } - s.serverList = append(s.serverList, *res) - return nil -} - -func (s *controllerRPCService) DiscoverServers(r *http.Request, args *DiscoverArgs, rep *DiscoverRep) error { - c := make(chan DiscoverRepEntry) - defer close(c) - for _, host := range args.Hosts { - go func(c chan DiscoverRepEntry, host string) { - err := proxyRequest("Server.Version", host, args.SSL, rep) - if err != nil { - c <- DiscoverRepEntry{host, err.ToGoError().Error()} - return - } - c <- DiscoverRepEntry{host, ""} - }(c, host) - } - for range args.Hosts { - entry := <-c - rep.Entry = append(rep.Entry, entry) - } - return nil -} - -func (s *controllerRPCService) GetControllerNetInfo(r *http.Request, args *ServerArg, res *ControllerNetInfoRep) error { - addrs, err := net.InterfaceAddrs() - if err != nil { - return err - } - for _, addr := range addrs { - res.NetInfo = append(res.NetInfo, addr.String()) - } - return nil -} - -func (s *controllerRPCService) GetServerMemStats(r *http.Request, args *ControllerArgs, res *MemStatsRep) error { - err := proxyRequest("Server.MemStats", args.Host, args.SSL, res) - if err != nil { - return probe.WrapError(err) - } - return nil -} - -func (s *controllerRPCService) GetServerDiskStats(r *http.Request, args *ControllerArgs, res *DiskStatsRep) error { - err := proxyRequest("Server.DiskStats", args.Host, args.SSL, res) - if err != nil { - return probe.WrapError(err) - } - return nil -} - -func (s *controllerRPCService) GetServerSysInfo(r *http.Request, args *ControllerArgs, res *SysInfoRep) error { - err := proxyRequest("Server.SysInfo", args.Host, args.SSL, res) - if err != nil { - return probe.WrapError(err) - } - return nil -} - -func (s *controllerRPCService) ListServers(r *http.Request, args *ControllerArgs, res *ListRep) error { - res.List = s.serverList - return nil -} - -func (s *controllerRPCService) GetServerVersion(r *http.Request, args *ControllerArgs, res *VersionRep) error { - err := proxyRequest("Server.Version", args.Host, args.SSL, res) - if err != nil { - return probe.WrapError(err) - } - return nil -} - -func (s *controllerRPCService) GetVersion(r *http.Request, args *ControllerArgs, res *VersionRep) error { - res.Version = "0.0.1" - res.BuildDate = minioVersion - res.Architecture = runtime.GOARCH - res.OperatingSystem = runtime.GOOS - return nil -} diff --git a/controller_rpc_test.go b/controller_rpc_test.go deleted file mode 100644 index 2e7389fed..000000000 --- a/controller_rpc_test.go +++ /dev/null @@ -1,257 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2014 Minio, 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 main - -import ( - "io" - "io/ioutil" - "net/http" - "net/http/httptest" - "net/url" - "os" - - "github.com/gorilla/rpc/v2/json" - . "gopkg.in/check.v1" -) - -type ControllerRPCSuite struct { - root string - url *url.URL - req *http.Request - body io.ReadSeeker - config *AuthConfig -} - -var _ = Suite(&ControllerRPCSuite{}) - -var ( - testControllerRPC *httptest.Server - testServerRPC *httptest.Server -) - -func (s *ControllerRPCSuite) SetUpSuite(c *C) { - root, err := ioutil.TempDir(os.TempDir(), "api-") - c.Assert(err, IsNil) - s.root = root - SetAuthConfigPath(root) - - secretAccessKey, perr := generateSecretAccessKey() - c.Assert(perr, IsNil) - - authConf := &AuthConfig{} - authConf.Users = make(map[string]*AuthUser) - authConf.Users["admin"] = &AuthUser{ - Name: "admin", - AccessKeyID: "admin", - SecretAccessKey: string(secretAccessKey), - } - s.config = authConf - - SetAuthConfigPath(root) - perr = SaveConfig(authConf) - c.Assert(perr, IsNil) - - testControllerRPC = httptest.NewServer(getControllerRPCHandler(false)) - testServerRPC = httptest.NewUnstartedServer(getServerRPCHandler(false)) - testServerRPC.Config.Addr = ":9002" - testServerRPC.Start() - - url, gerr := url.Parse(testServerRPC.URL) - c.Assert(gerr, IsNil) - s.url = url -} - -func (s *ControllerRPCSuite) TearDownSuite(c *C) { - os.RemoveAll(s.root) - testServerRPC.Close() - testControllerRPC.Close() -} - -func (s *ControllerRPCSuite) TestMemStats(c *C) { - op := rpcOperation{ - Method: "Controller.GetServerMemStats", - Request: ControllerArgs{Host: s.url.Host}, - } - req, err := newRPCRequest(s.config, testControllerRPC.URL+"/rpc", op, http.DefaultTransport) - c.Assert(err, IsNil) - c.Assert(req.Get("Content-Type"), Equals, "application/json") - resp, err := req.Do() - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusOK) - - var reply MemStatsRep - c.Assert(json.DecodeClientResponse(resp.Body, &reply), IsNil) - resp.Body.Close() - c.Assert(reply, Not(DeepEquals), MemStatsRep{}) -} - -func (s *ControllerRPCSuite) TestDiskStats(c *C) { - op := rpcOperation{ - Method: "Controller.GetServerDiskStats", - Request: ControllerArgs{Host: s.url.Host}, - } - req, err := newRPCRequest(s.config, testControllerRPC.URL+"/rpc", op, http.DefaultTransport) - c.Assert(err, IsNil) - c.Assert(req.Get("Content-Type"), Equals, "application/json") - resp, err := req.Do() - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusOK) - - var reply MemStatsRep - c.Assert(json.DecodeClientResponse(resp.Body, &reply), IsNil) - resp.Body.Close() - c.Assert(reply, Not(DeepEquals), DiskStatsRep{}) -} - -func (s *ControllerRPCSuite) TestSysInfo(c *C) { - op := rpcOperation{ - Method: "Controller.GetServerSysInfo", - Request: ControllerArgs{Host: s.url.Host}, - } - req, err := newRPCRequest(s.config, testControllerRPC.URL+"/rpc", op, http.DefaultTransport) - c.Assert(err, IsNil) - c.Assert(req.Get("Content-Type"), Equals, "application/json") - resp, err := req.Do() - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusOK) - - var reply SysInfoRep - c.Assert(json.DecodeClientResponse(resp.Body, &reply), IsNil) - resp.Body.Close() - c.Assert(reply, Not(DeepEquals), SysInfoRep{}) -} - -func (s *ControllerRPCSuite) TestServerList(c *C) { - op := rpcOperation{ - Method: "Controller.ListServers", - Request: ControllerArgs{Host: s.url.Host}, - } - req, err := newRPCRequest(s.config, testControllerRPC.URL+"/rpc", op, http.DefaultTransport) - c.Assert(err, IsNil) - c.Assert(req.Get("Content-Type"), Equals, "application/json") - resp, err := req.Do() - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusOK) - - var reply ServerListRep - c.Assert(json.DecodeClientResponse(resp.Body, &reply), IsNil) - resp.Body.Close() - c.Assert(reply, Not(DeepEquals), ServerListRep{List: []ServerRep{}}) -} - -func (s *ControllerRPCSuite) TestServerAdd(c *C) { - op := rpcOperation{ - Method: "Controller.AddServer", - Request: ControllerArgs{Host: s.url.Host}, - } - req, err := newRPCRequest(s.config, testControllerRPC.URL+"/rpc", op, http.DefaultTransport) - c.Assert(err, IsNil) - c.Assert(req.Get("Content-Type"), Equals, "application/json") - resp, err := req.Do() - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusOK) - - var reply DefaultRep - c.Assert(json.DecodeClientResponse(resp.Body, &reply), IsNil) - resp.Body.Close() - c.Assert(reply, Not(DeepEquals), DefaultRep{nil, "Added"}) -} - -func (s *ControllerRPCSuite) TestAuth(c *C) { - op := rpcOperation{ - Method: "Controller.GenerateAuth", - Request: AuthArgs{User: "newuser"}, - } - req, err := newRPCRequest(s.config, testControllerRPC.URL+"/rpc", op, http.DefaultTransport) - c.Assert(err, IsNil) - c.Assert(req.Get("Content-Type"), Equals, "application/json") - resp, err := req.Do() - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusOK) - - var reply AuthRep - c.Assert(json.DecodeClientResponse(resp.Body, &reply), IsNil) - resp.Body.Close() - c.Assert(reply, Not(DeepEquals), AuthRep{}) - c.Assert(len(reply.AccessKeyID), Equals, 20) - c.Assert(len(reply.SecretAccessKey), Equals, 40) - c.Assert(len(reply.Name), Not(Equals), 0) - - op = rpcOperation{ - Method: "Controller.FetchAuth", - Request: AuthArgs{User: "newuser"}, - } - req, err = newRPCRequest(s.config, testControllerRPC.URL+"/rpc", op, http.DefaultTransport) - c.Assert(err, IsNil) - c.Assert(req.Get("Content-Type"), Equals, "application/json") - resp, err = req.Do() - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusOK) - - var newReply AuthRep - c.Assert(json.DecodeClientResponse(resp.Body, &newReply), IsNil) - resp.Body.Close() - c.Assert(newReply, Not(DeepEquals), AuthRep{}) - c.Assert(reply.AccessKeyID, Equals, newReply.AccessKeyID) - c.Assert(reply.SecretAccessKey, Equals, newReply.SecretAccessKey) - c.Assert(len(reply.Name), Not(Equals), 0) - - op = rpcOperation{ - Method: "Controller.ResetAuth", - Request: AuthArgs{User: "newuser"}, - } - req, err = newRPCRequest(s.config, testControllerRPC.URL+"/rpc", op, http.DefaultTransport) - c.Assert(err, IsNil) - c.Assert(req.Get("Content-Type"), Equals, "application/json") - resp, err = req.Do() - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusOK) - - var resetReply AuthRep - c.Assert(json.DecodeClientResponse(resp.Body, &resetReply), IsNil) - resp.Body.Close() - c.Assert(newReply, Not(DeepEquals), AuthRep{}) - c.Assert(reply.AccessKeyID, Not(Equals), resetReply.AccessKeyID) - c.Assert(reply.SecretAccessKey, Not(Equals), resetReply.SecretAccessKey) - c.Assert(len(reply.Name), Not(Equals), 0) - - // these operations should fail - - /// generating access for existing user fails - op = rpcOperation{ - Method: "Controller.GenerateAuth", - Request: AuthArgs{User: "newuser"}, - } - req, err = newRPCRequest(s.config, testControllerRPC.URL+"/rpc", op, http.DefaultTransport) - c.Assert(err, IsNil) - c.Assert(req.Get("Content-Type"), Equals, "application/json") - resp, err = req.Do() - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusBadRequest) - - /// null user provided invalid - op = rpcOperation{ - Method: "Controller.GenerateAuth", - Request: AuthArgs{User: ""}, - } - req, err = newRPCRequest(s.config, testControllerRPC.URL+"/rpc", op, http.DefaultTransport) - c.Assert(err, IsNil) - c.Assert(req.Get("Content-Type"), Equals, "application/json") - resp, err = req.Do() - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusBadRequest) -} diff --git a/donut-disks.go b/donut-disks.go deleted file mode 100644 index 2bd5007c7..000000000 --- a/donut-disks.go +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 main - -import ( - "io/ioutil" - "os" - - "github.com/minio/minio/pkg/probe" -) - -// isUsable provides a comprehensive way of knowing if the provided mountPath is mounted and writable -func isUsable(mountPath string) (bool, *probe.Error) { - _, e := os.Stat(mountPath) - if e != nil { - e := os.MkdirAll(mountPath, 0700) - if e != nil { - return false, probe.NewError(e) - } - } - - testFile, e := ioutil.TempFile(mountPath, "writetest-") - if e != nil { - return false, probe.NewError(e) - } - defer testFile.Close() - - testFileName := testFile.Name() - if e := os.Remove(testFileName); e != nil { - return false, probe.NewError(e) - } - return true, nil -} diff --git a/donut-main.go b/donut-main.go deleted file mode 100644 index 7c1bf2a5e..000000000 --- a/donut-main.go +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 main - -import ( - "os" - "path/filepath" - - "github.com/minio/cli" - "github.com/minio/minio/pkg/donut" - "github.com/minio/minio/pkg/probe" -) - -var ( - donutSubCommands = []cli.Command{ - { - Name: "make", - Description: "make a donut", - Action: makeDonutMain, - CustomHelpTemplate: `NAME: - minio donut {{.Name}} - {{.Description}} - -USAGE: - minio donut {{.Name}} DONUTNAME [DISKS...] - -EXAMPLES: - 1. Make a donut with 4 exports - $ minio donut {{.Name}} mongodb-backup /mnt/export1 /mnt/export2 /mnt/export3 /mnt/export4 - - 2. Make a donut with 16 exports - $ minio donut {{.Name}} operational-data /mnt/export1 /mnt/export2 /mnt/export3 /mnt/export4 /mnt/export5 \ - /mnt/export6 /mnt/export7 /mnt/export8 /mnt/export9 /mnt/export10 /mnt/export11 \ - /mnt/export12 /mnt/export13 /mnt/export14 /mnt/export15 /mnt/export16 -`, - }, - } - - donutCmd = cli.Command{ - Name: "donut", - Usage: "Create and manage a donut configuration", - Subcommands: donutSubCommands, - } -) - -func makeDonutMain(c *cli.Context) { - if !c.Args().Present() || c.Args().First() == "help" { - cli.ShowCommandHelpAndExit(c, "make", 1) - } - donutName := c.Args().First() - if c.Args().First() != "" { - if !donut.IsValidDonut(donutName) { - Fatalf("Invalid donutname %s\n", donutName) - } - } - var disks []string - for _, disk := range c.Args().Tail() { - if _, err := isUsable(disk); err != nil { - Fatalln(err.Trace()) - } - disks = append(disks, disk) - } - for _, disk := range disks { - if err := os.MkdirAll(filepath.Join(disk, donutName), 0700); err != nil { - Fatalln(probe.NewError(err)) - } - } - - hostname, err := os.Hostname() - if err != nil { - Fatalln(probe.NewError(err)) - } - donutConfig := &donut.Config{} - donutConfig.Version = "0.0.1" - donutConfig.DonutName = donutName - donutConfig.NodeDiskMap = make(map[string][]string) - // keep it in exact order as it was specified, do not try to sort disks - donutConfig.NodeDiskMap[hostname] = disks - // default cache is unlimited - donutConfig.MaxSize = 512000000 - - if err := donut.SaveConfig(donutConfig); err != nil { - Fatalln(err.Trace()) - } - - Infoln("Success!") -} diff --git a/donut-rpc.go b/donut-rpc.go deleted file mode 100644 index 3e27fa74a..000000000 --- a/donut-rpc.go +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 main - -import ( - "net/http" - "runtime" -) - -type donutRPCService struct{} - -func (s *donutRPCService) ListNodes(r *http.Request, arg *DonutArg, rep *ListNodesRep) error { - rep.Nodes = []struct { - Hostname string `json:"hostname"` - Address string `json:"address"` - ID string `json:"id"` - }{ - { - Hostname: "localhost", - Address: "192.168.1.102:9000", - ID: "6F27CB16-493D-40FA-B035-2A2E5646066A", - }, - } - return nil -} - -// Usage bytes -const ( - PB = 1024 * 1024 * 1024 * 1024 - TB = 1024 * 1024 * 1024 * 1024 - GB = 1024 * 1024 * 1024 -) - -func (s *donutRPCService) StorageStats(r *http.Request, arg *DonutArg, rep *StorageStatsRep) error { - rep.Buckets = []BucketStats{{"bucket1", 4 * TB}, {"bucket2", 120 * TB}, {"bucket3", 45 * TB}} - return nil -} - -func (s *donutRPCService) RebalanceStats(r *http.Request, arg *DonutArg, rep *RebalanceStatsRep) error { - rep.State = make(map[string]string) - rep.State["bucket1/obj1"] = "inProgress" - rep.State["bucket2/obj2"] = "finished" - rep.State["bucket3/obj3"] = "errored" - rep.State["bucket4/obj4"] = "unknownState" - return nil -} - -func (s *donutRPCService) Version(r *http.Request, arg *ServerArg, rep *DonutVersionRep) error { - rep.Version = "0.1.0" - rep.Architecture = runtime.GOARCH - rep.OperatingSystem = runtime.GOOS - return nil -} diff --git a/flags.go b/flags.go index d4fc598ed..80de184fd 100644 --- a/flags.go +++ b/flags.go @@ -28,20 +28,6 @@ var ( Usage: "ADDRESS:PORT for cloud storage access.", } - addressControllerFlag = cli.StringFlag{ - Name: "address-controller", - Hide: true, - Value: ":9001", - Usage: "ADDRESS:PORT for management console access.", - } - - addressServerRPCFlag = cli.StringFlag{ - Name: "address-server-rpc", - Hide: true, - Value: ":9002", - Usage: "ADDRESS:PORT for management console access.", - } - ratelimitFlag = cli.IntFlag{ Name: "ratelimit", Hide: true, diff --git a/globals.go b/globals.go index 1063e7df7..1838469c2 100644 --- a/globals.go +++ b/globals.go @@ -17,6 +17,5 @@ package main var ( - globalJSONFlag = false // Json flag set via command line - globalDebugFlag = false // Debug flag set via command line + globalJSONFlag = false // Json flag set via command line ) diff --git a/server-api-httprange.go b/httprange.go similarity index 88% rename from server-api-httprange.go rename to httprange.go index 87dd06c80..d8e98fa48 100644 --- a/server-api-httprange.go +++ b/httprange.go @@ -22,8 +22,8 @@ import ( "strconv" "strings" - "github.com/minio/minio/pkg/donut" - "github.com/minio/minio/pkg/probe" + "github.com/minio/minio/pkg/fs" + "github.com/minio/minio-xl/pkg/probe" ) const ( @@ -60,7 +60,7 @@ func getRequestedRange(hrange string, size int64) (*httpRange, *probe.Error) { func (r *httpRange) parse(ra string) *probe.Error { i := strings.Index(ra, "-") if i < 0 { - return probe.NewError(donut.InvalidRange{}) + return probe.NewError(fs.InvalidRange{}) } start, end := strings.TrimSpace(ra[:i]), strings.TrimSpace(ra[i+1:]) if start == "" { @@ -68,7 +68,7 @@ func (r *httpRange) parse(ra string) *probe.Error { // range start relative to the end of the file. i, err := strconv.ParseInt(end, 10, 64) if err != nil { - return probe.NewError(donut.InvalidRange{}) + return probe.NewError(fs.InvalidRange{}) } if i > r.size { i = r.size @@ -78,7 +78,7 @@ func (r *httpRange) parse(ra string) *probe.Error { } else { i, err := strconv.ParseInt(start, 10, 64) if err != nil || i > r.size || i < 0 { - return probe.NewError(donut.InvalidRange{}) + return probe.NewError(fs.InvalidRange{}) } r.start = i if end == "" { @@ -87,7 +87,7 @@ func (r *httpRange) parse(ra string) *probe.Error { } else { i, err := strconv.ParseInt(end, 10, 64) if err != nil || r.start > i { - return probe.NewError(donut.InvalidRange{}) + return probe.NewError(fs.InvalidRange{}) } if i >= r.size { i = r.size - 1 @@ -104,7 +104,7 @@ func (r *httpRange) parseRange(s string) *probe.Error { return probe.NewError(errors.New("header not present")) } if !strings.HasPrefix(s, b) { - return probe.NewError(donut.InvalidRange{}) + return probe.NewError(fs.InvalidRange{}) } ras := strings.Split(s[len(b):], ",") @@ -118,7 +118,7 @@ func (r *httpRange) parseRange(s string) *probe.Error { ra := strings.TrimSpace(ras[0]) if ra == "" { - return probe.NewError(donut.InvalidRange{}) + return probe.NewError(fs.InvalidRange{}) } return r.parse(ra) } diff --git a/logger.go b/logger.go index 6e2b238ca..2ab8b118a 100644 --- a/logger.go +++ b/logger.go @@ -21,27 +21,13 @@ import ( "reflect" "github.com/Sirupsen/logrus" - "github.com/minio/minio/pkg/probe" - "github.com/weekface/mgorus" + "github.com/minio/minio-xl/pkg/probe" ) type fields map[string]interface{} var log = logrus.New() // Default console logger. -// log2Mongo enables logging to mongodb. Use capped collection to -func log2Mongo(url, db, collection string) *probe.Error { - hooker, e := mgorus.NewHooker(url, db, collection) - if e != nil { - return probe.NewError(e) - } - - log.Hooks.Add(hooker) // Add mongodb hook. - log.Formatter = &logrus.JSONFormatter{} // JSON formatted log. - log.Level = logrus.InfoLevel // Minimum log level. - return nil -} - func errorIf(err *probe.Error, msg string, fields map[string]interface{}) { if err == nil { return @@ -77,11 +63,3 @@ func fatalIf(err *probe.Error, msg string, fields map[string]interface{}) { } log.WithFields(fields).Fatal(msg) } - -func audit(msg string, fields logrus.Fields) { - if fields == nil { - fields = make(map[string]interface{}) - } - - log.WithFields(fields).Info(msg) -} diff --git a/logger_test.go b/logger_test.go index 09c654218..2b8c7adab 100644 --- a/logger_test.go +++ b/logger_test.go @@ -22,7 +22,7 @@ import ( "errors" "github.com/Sirupsen/logrus" - "github.com/minio/minio/pkg/probe" + "github.com/minio/minio-xl/pkg/probe" . "gopkg.in/check.v1" ) diff --git a/main.go b/main.go index b2a093dd9..f8902cfc1 100644 --- a/main.go +++ b/main.go @@ -27,16 +27,15 @@ import ( "github.com/minio/cli" ) -// minioConfig - http server config -type minioConfig struct { - Address string - ControllerAddress string - RPCAddress string - Anonymous bool - TLS bool - CertFile string - KeyFile string - RateLimit int +// fsConfig - fs http server config +type fsConfig struct { + Address string + Path string + Anonymous bool + TLS bool + CertFile string + KeyFile string + RateLimit int } func init() { @@ -90,15 +89,11 @@ func findClosestCommands(command string) []string { func registerApp() *cli.App { // register all commands - registerCommand(donutCmd) registerCommand(serverCmd) - registerCommand(controllerCmd) registerCommand(versionCmd) // register all flags registerFlag(addressFlag) - registerFlag(addressControllerFlag) - registerFlag(addressServerRPCFlag) registerFlag(ratelimitFlag) registerFlag(anonymousFlag) registerFlag(certFlag) @@ -107,11 +102,12 @@ func registerApp() *cli.App { // set up app app := cli.NewApp() - app.Name = "minio" + app.Name = "Minio" // hide --version flag, version is a command app.HideVersion = true app.Author = "Minio.io" - app.Usage = "Minio Cloud Storage" + app.Usage = "Cloud Storage Server for Micro Services & Magnetic Disks." + app.Description = `Micro services environment provisions one Minio server per application instance. Scalability is achieved to through large number of smaller personalized instances. This version of the Minio binary is built using Filesystem storage backend for magnetic disk. It is ideal for storing large objects with sizes ranging from few MBs to GBs. Minio binary is small enough to be bundled along with the application stack.` app.Flags = flags app.Commands = commands @@ -119,17 +115,21 @@ func registerApp() *cli.App { {{.Name}} - {{.Usage}} USAGE: - {{.Name}} {{if .Flags}}[global flags] {{end}}command{{if .Flags}} [command flags]{{end}} [arguments...] + minio {{if .Flags}}[flags] {{end}}command{{if .Flags}}{{end}} [arguments...] + +DESCRIPTION: + {{.Description}} COMMANDS: {{range .Commands}}{{join .Names ", "}}{{ "\t" }}{{.Usage}} {{end}}{{if .Flags}} -GLOBAL FLAGS: +FLAGS: {{range .Flags}}{{.}} {{end}}{{end}} VERSION: ` + minioVersion + - `{{range $key, $value := ExtraInfo}} + ` +{{range $key, $value := ExtraInfo}} {{$key}}: {{$value}} {{end}} diff --git a/minio_test.go b/main_test.go similarity index 100% rename from minio_test.go rename to main_test.go diff --git a/notifier.go b/notifier.go deleted file mode 100644 index a3ddc56af..000000000 --- a/notifier.go +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 main - -import ( - "fmt" - "runtime" - "strings" - - "github.com/fatih/color" - "github.com/olekukonko/ts" -) - -// colorizeMessage - inspired from Yeoman project npm package https://github.com/yeoman/update-notifier -func colorizeMessage(message string) string { - // initialize coloring - cyan := color.New(color.FgCyan, color.Bold).SprintFunc() - yellow := color.New(color.FgYellow, color.Bold).SprintfFunc() - - // calculate length without color coding, due to ANSI color characters padded to actual - // string the final length is wrong than the original string length - lineStr := fmt.Sprintf(" \"%s\" . ", message) - lineLength := len(lineStr) - - // populate lines with color coding - lineInColor := fmt.Sprintf(" \"%s\" . ", cyan(message)) - maxContentWidth := lineLength - - terminal, err := ts.GetSize() - if err != nil { - // no coloring needed just send as is - return message - } - var msg string - switch { - case len(lineStr) > terminal.Col(): - msg = lineInColor - default: - // on windows terminal turn off unicode characters - var top, bottom, sideBar string - if runtime.GOOS == "windows" { - top = yellow("*" + strings.Repeat("*", maxContentWidth) + "*") - bottom = yellow("*" + strings.Repeat("*", maxContentWidth) + "*") - sideBar = yellow("|") - } else { - // color the rectangular box, use unicode characters here - top = yellow("┏" + strings.Repeat("━", maxContentWidth) + "┓") - bottom = yellow("┗" + strings.Repeat("━", maxContentWidth) + "┛") - sideBar = yellow("┃") - } - - // construct the final message - msg = top + "\n" + - sideBar + lineInColor + sideBar + "\n" + - bottom - } - return msg -} diff --git a/server-api-object-handlers.go b/object-handlers.go similarity index 70% rename from server-api-object-handlers.go rename to object-handlers.go index 73f35333b..a311313c0 100644 --- a/server-api-object-handlers.go +++ b/object-handlers.go @@ -9,7 +9,7 @@ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implieapi.Donut. + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implieapi.Filesystem. * See the License for the specific language governing permissions and * limitations under the License. */ @@ -21,9 +21,8 @@ import ( "strconv" "github.com/gorilla/mux" - "github.com/minio/minio/pkg/donut" - "github.com/minio/minio/pkg/probe" - signv4 "github.com/minio/minio/pkg/signature" + "github.com/minio/minio/pkg/fs" + "github.com/minio/minio-xl/pkg/probe" ) const ( @@ -35,31 +34,22 @@ const ( // This implementation of the GET operation retrieves object. To use GET, // you must have READ access to the object. func (api API) GetObjectHandler(w http.ResponseWriter, req *http.Request) { - // ticket master block - { - op := APIOperation{} - op.ProceedCh = make(chan struct{}) - api.OP <- op - // block until Ticket master gives us a go - <-op.ProceedCh - } - var object, bucket string vars := mux.Vars(req) bucket = vars["bucket"] object = vars["object"] - metadata, err := api.Donut.GetObjectMetadata(bucket, object) + metadata, err := api.Filesystem.GetObjectMetadata(bucket, object) if err != nil { errorIf(err.Trace(), "GetObject failed.", nil) switch err.ToGoError().(type) { - case donut.BucketNameInvalid: + case fs.BucketNameInvalid: writeErrorResponse(w, req, InvalidBucketName, req.URL.Path) - case donut.BucketNotFound: + case fs.BucketNotFound: writeErrorResponse(w, req, NoSuchBucket, req.URL.Path) - case donut.ObjectNotFound: + case fs.ObjectNotFound: writeErrorResponse(w, req, NoSuchKey, req.URL.Path) - case donut.ObjectNameInvalid: + case fs.ObjectNameInvalid: writeErrorResponse(w, req, NoSuchKey, req.URL.Path) default: writeErrorResponse(w, req, InternalError, req.URL.Path) @@ -73,7 +63,7 @@ func (api API) GetObjectHandler(w http.ResponseWriter, req *http.Request) { return } setObjectHeaders(w, metadata, hrange) - if _, err = api.Donut.GetObject(w, bucket, object, hrange.start, hrange.length); err != nil { + if _, err = api.Filesystem.GetObject(w, bucket, object, hrange.start, hrange.length); err != nil { errorIf(err.Trace(), "GetObject failed.", nil) return } @@ -83,31 +73,21 @@ func (api API) GetObjectHandler(w http.ResponseWriter, req *http.Request) { // ----------- // The HEAD operation retrieves metadata from an object without returning the object itself. func (api API) HeadObjectHandler(w http.ResponseWriter, req *http.Request) { - // ticket master block - { - op := APIOperation{} - op.ProceedCh = make(chan struct{}) - api.OP <- op - // block until Ticket master gives us a go - <-op.ProceedCh - } - var object, bucket string vars := mux.Vars(req) bucket = vars["bucket"] object = vars["object"] - metadata, err := api.Donut.GetObjectMetadata(bucket, object) + metadata, err := api.Filesystem.GetObjectMetadata(bucket, object) if err != nil { - errorIf(err.Trace(), "GetObjectMetadata failed.", nil) switch err.ToGoError().(type) { - case donut.BucketNameInvalid: + case fs.BucketNameInvalid: writeErrorResponse(w, req, InvalidBucketName, req.URL.Path) - case donut.BucketNotFound: + case fs.BucketNotFound: writeErrorResponse(w, req, NoSuchBucket, req.URL.Path) - case donut.ObjectNotFound: + case fs.ObjectNotFound: writeErrorResponse(w, req, NoSuchKey, req.URL.Path) - case donut.ObjectNameInvalid: + case fs.ObjectNameInvalid: writeErrorResponse(w, req, NoSuchKey, req.URL.Path) default: writeErrorResponse(w, req, InternalError, req.URL.Path) @@ -122,15 +102,6 @@ func (api API) HeadObjectHandler(w http.ResponseWriter, req *http.Request) { // ---------- // This implementation of the PUT operation adds an object to a bucket. func (api API) PutObjectHandler(w http.ResponseWriter, req *http.Request) { - // Ticket master block - { - op := APIOperation{} - op.ProceedCh = make(chan struct{}) - api.OP <- op - // block until Ticket master gives us a go - <-op.ProceedCh - } - var object, bucket string vars := mux.Vars(req) bucket = vars["bucket"] @@ -153,16 +124,6 @@ func (api API) PutObjectHandler(w http.ResponseWriter, req *http.Request) { writeErrorResponse(w, req, EntityTooLarge, req.URL.Path) return } - /// minimum Upload size for objects in a single operation - // - // Surprisingly while Amazon in their document states that S3 objects have 1byte - // as the minimum limit, they do not seem to enforce it one can successfully - // create a 0byte file using a regular putObject() operation - // - // if isMinObjectSize(size) { - // writeErrorResponse(w, req, EntityTooSmall, req.URL.Path) - // return - // } var sizeInt64 int64 { var err error @@ -173,7 +134,7 @@ func (api API) PutObjectHandler(w http.ResponseWriter, req *http.Request) { } } - var signature *signv4.Signature + var signature *fs.Signature if !api.Anonymous { if _, ok := req.Header["Authorization"]; ok { // Init signature V4 verification @@ -187,34 +148,32 @@ func (api API) PutObjectHandler(w http.ResponseWriter, req *http.Request) { } } - metadata, err := api.Donut.CreateObject(bucket, object, md5, sizeInt64, req.Body, nil, signature) + metadata, err := api.Filesystem.CreateObject(bucket, object, md5, sizeInt64, req.Body, signature) if err != nil { errorIf(err.Trace(), "CreateObject failed.", nil) switch err.ToGoError().(type) { - case donut.BucketNotFound: + case fs.BucketNotFound: writeErrorResponse(w, req, NoSuchBucket, req.URL.Path) - case donut.BucketNameInvalid: + case fs.BucketNameInvalid: writeErrorResponse(w, req, InvalidBucketName, req.URL.Path) - case donut.ObjectExists: - writeErrorResponse(w, req, MethodNotAllowed, req.URL.Path) - case donut.BadDigest: + case fs.BadDigest: writeErrorResponse(w, req, BadDigest, req.URL.Path) - case signv4.MissingDateHeader: + case fs.MissingDateHeader: writeErrorResponse(w, req, RequestTimeTooSkewed, req.URL.Path) - case signv4.DoesNotMatch: + case fs.SignatureDoesNotMatch: writeErrorResponse(w, req, SignatureDoesNotMatch, req.URL.Path) - case donut.IncompleteBody: + case fs.IncompleteBody: writeErrorResponse(w, req, IncompleteBody, req.URL.Path) - case donut.EntityTooLarge: + case fs.EntityTooLarge: writeErrorResponse(w, req, EntityTooLarge, req.URL.Path) - case donut.InvalidDigest: + case fs.InvalidDigest: writeErrorResponse(w, req, InvalidDigest, req.URL.Path) default: writeErrorResponse(w, req, InternalError, req.URL.Path) } return } - w.Header().Set("ETag", metadata.MD5Sum) + w.Header().Set("ETag", "\""+metadata.Md5+"\"") writeSuccessResponse(w) } @@ -222,15 +181,6 @@ func (api API) PutObjectHandler(w http.ResponseWriter, req *http.Request) { // NewMultipartUploadHandler - New multipart upload func (api API) NewMultipartUploadHandler(w http.ResponseWriter, req *http.Request) { - // Ticket master block - { - op := APIOperation{} - op.ProceedCh = make(chan struct{}) - api.OP <- op - // block until Ticket master gives us a go - <-op.ProceedCh - } - if !isRequestUploads(req.URL.Query()) { writeErrorResponse(w, req, MethodNotAllowed, req.URL.Path) return @@ -241,12 +191,18 @@ func (api API) NewMultipartUploadHandler(w http.ResponseWriter, req *http.Reques bucket = vars["bucket"] object = vars["object"] - uploadID, err := api.Donut.NewMultipartUpload(bucket, object, req.Header.Get("Content-Type")) + uploadID, err := api.Filesystem.NewMultipartUpload(bucket, object) if err != nil { errorIf(err.Trace(), "NewMultipartUpload failed.", nil) switch err.ToGoError().(type) { - case donut.ObjectExists: - writeErrorResponse(w, req, MethodNotAllowed, req.URL.Path) + case fs.BucketNameInvalid: + writeErrorResponse(w, req, InvalidBucketName, req.URL.Path) + case fs.BucketNotFound: + writeErrorResponse(w, req, NoSuchBucket, req.URL.Path) + case fs.ObjectNotFound: + writeErrorResponse(w, req, NoSuchKey, req.URL.Path) + case fs.ObjectNameInvalid: + writeErrorResponse(w, req, NoSuchKey, req.URL.Path) default: writeErrorResponse(w, req, InternalError, req.URL.Path) } @@ -263,15 +219,6 @@ func (api API) NewMultipartUploadHandler(w http.ResponseWriter, req *http.Reques // PutObjectPartHandler - Upload part func (api API) PutObjectPartHandler(w http.ResponseWriter, req *http.Request) { - // Ticket master block - { - op := APIOperation{} - op.ProceedCh = make(chan struct{}) - api.OP <- op - // block until Ticket master gives us a go - <-op.ProceedCh - } - // get Content-MD5 sent by client and verify if valid md5 := req.Header.Get("Content-MD5") if !isValidMD5(md5) { @@ -319,7 +266,7 @@ func (api API) PutObjectPartHandler(w http.ResponseWriter, req *http.Request) { } } - var signature *signv4.Signature + var signature *fs.Signature if !api.Anonymous { if _, ok := req.Header["Authorization"]; ok { // Init signature V4 verification @@ -333,55 +280,52 @@ func (api API) PutObjectPartHandler(w http.ResponseWriter, req *http.Request) { } } - calculatedMD5, err := api.Donut.CreateObjectPart(bucket, object, uploadID, partID, "", md5, sizeInt64, req.Body, signature) + calculatedMD5, err := api.Filesystem.CreateObjectPart(bucket, object, uploadID, md5, partID, sizeInt64, req.Body, signature) if err != nil { errorIf(err.Trace(), "CreateObjectPart failed.", nil) switch err.ToGoError().(type) { - case donut.InvalidUploadID: + case fs.InvalidUploadID: writeErrorResponse(w, req, NoSuchUpload, req.URL.Path) - case donut.ObjectExists: - writeErrorResponse(w, req, MethodNotAllowed, req.URL.Path) - case donut.BadDigest: + case fs.BadDigest: writeErrorResponse(w, req, BadDigest, req.URL.Path) - case signv4.DoesNotMatch: + case fs.SignatureDoesNotMatch: writeErrorResponse(w, req, SignatureDoesNotMatch, req.URL.Path) - case donut.IncompleteBody: + case fs.IncompleteBody: writeErrorResponse(w, req, IncompleteBody, req.URL.Path) - case donut.EntityTooLarge: + case fs.EntityTooLarge: writeErrorResponse(w, req, EntityTooLarge, req.URL.Path) - case donut.InvalidDigest: + case fs.InvalidDigest: writeErrorResponse(w, req, InvalidDigest, req.URL.Path) default: writeErrorResponse(w, req, InternalError, req.URL.Path) } return } - w.Header().Set("ETag", calculatedMD5) + w.Header().Set("ETag", "\""+calculatedMD5+"\"") writeSuccessResponse(w) } // AbortMultipartUploadHandler - Abort multipart upload func (api API) AbortMultipartUploadHandler(w http.ResponseWriter, req *http.Request) { - // Ticket master block - { - op := APIOperation{} - op.ProceedCh = make(chan struct{}) - api.OP <- op - // block until Ticket master gives us a go - <-op.ProceedCh - } - vars := mux.Vars(req) bucket := vars["bucket"] object := vars["object"] objectResourcesMetadata := getObjectResources(req.URL.Query()) - err := api.Donut.AbortMultipartUpload(bucket, object, objectResourcesMetadata.UploadID) + err := api.Filesystem.AbortMultipartUpload(bucket, object, objectResourcesMetadata.UploadID) if err != nil { errorIf(err.Trace(), "AbortMutlipartUpload failed.", nil) switch err.ToGoError().(type) { - case donut.InvalidUploadID: + case fs.BucketNameInvalid: + writeErrorResponse(w, req, InvalidBucketName, req.URL.Path) + case fs.BucketNotFound: + writeErrorResponse(w, req, NoSuchBucket, req.URL.Path) + case fs.ObjectNotFound: + writeErrorResponse(w, req, NoSuchKey, req.URL.Path) + case fs.ObjectNameInvalid: + writeErrorResponse(w, req, NoSuchKey, req.URL.Path) + case fs.InvalidUploadID: writeErrorResponse(w, req, NoSuchUpload, req.URL.Path) default: writeErrorResponse(w, req, InternalError, req.URL.Path) @@ -394,15 +338,6 @@ func (api API) AbortMultipartUploadHandler(w http.ResponseWriter, req *http.Requ // ListObjectPartsHandler - List object parts func (api API) ListObjectPartsHandler(w http.ResponseWriter, req *http.Request) { - // Ticket master block - { - op := APIOperation{} - op.ProceedCh = make(chan struct{}) - api.OP <- op - // block until Ticket master gives us a go - <-op.ProceedCh - } - objectResourcesMetadata := getObjectResources(req.URL.Query()) if objectResourcesMetadata.PartNumberMarker < 0 { writeErrorResponse(w, req, InvalidPartNumberMarker, req.URL.Path) @@ -420,11 +355,19 @@ func (api API) ListObjectPartsHandler(w http.ResponseWriter, req *http.Request) bucket := vars["bucket"] object := vars["object"] - objectResourcesMetadata, err := api.Donut.ListObjectParts(bucket, object, objectResourcesMetadata) + objectResourcesMetadata, err := api.Filesystem.ListObjectParts(bucket, object, objectResourcesMetadata) if err != nil { errorIf(err.Trace(), "ListObjectParts failed.", nil) switch err.ToGoError().(type) { - case donut.InvalidUploadID: + case fs.BucketNameInvalid: + writeErrorResponse(w, req, InvalidBucketName, req.URL.Path) + case fs.BucketNotFound: + writeErrorResponse(w, req, NoSuchBucket, req.URL.Path) + case fs.ObjectNotFound: + writeErrorResponse(w, req, NoSuchKey, req.URL.Path) + case fs.ObjectNameInvalid: + writeErrorResponse(w, req, NoSuchKey, req.URL.Path) + case fs.InvalidUploadID: writeErrorResponse(w, req, NoSuchUpload, req.URL.Path) default: writeErrorResponse(w, req, InternalError, req.URL.Path) @@ -441,22 +384,13 @@ func (api API) ListObjectPartsHandler(w http.ResponseWriter, req *http.Request) // CompleteMultipartUploadHandler - Complete multipart upload func (api API) CompleteMultipartUploadHandler(w http.ResponseWriter, req *http.Request) { - // Ticket master block - { - op := APIOperation{} - op.ProceedCh = make(chan struct{}) - api.OP <- op - // block until Ticket master gives us a go - <-op.ProceedCh - } - vars := mux.Vars(req) bucket := vars["bucket"] object := vars["object"] objectResourcesMetadata := getObjectResources(req.URL.Query()) - var signature *signv4.Signature + var signature *fs.Signature if !api.Anonymous { if _, ok := req.Header["Authorization"]; ok { // Init signature V4 verification @@ -470,30 +404,36 @@ func (api API) CompleteMultipartUploadHandler(w http.ResponseWriter, req *http.R } } - metadata, err := api.Donut.CompleteMultipartUpload(bucket, object, objectResourcesMetadata.UploadID, req.Body, signature) + metadata, err := api.Filesystem.CompleteMultipartUpload(bucket, object, objectResourcesMetadata.UploadID, req.Body, signature) if err != nil { errorIf(err.Trace(), "CompleteMultipartUpload failed.", nil) switch err.ToGoError().(type) { - case donut.InvalidUploadID: + case fs.BucketNameInvalid: + writeErrorResponse(w, req, InvalidBucketName, req.URL.Path) + case fs.BucketNotFound: + writeErrorResponse(w, req, NoSuchBucket, req.URL.Path) + case fs.ObjectNotFound: + writeErrorResponse(w, req, NoSuchKey, req.URL.Path) + case fs.ObjectNameInvalid: + writeErrorResponse(w, req, NoSuchKey, req.URL.Path) + case fs.InvalidUploadID: writeErrorResponse(w, req, NoSuchUpload, req.URL.Path) - case donut.InvalidPart: + case fs.InvalidPart: writeErrorResponse(w, req, InvalidPart, req.URL.Path) - case donut.InvalidPartOrder: + case fs.InvalidPartOrder: writeErrorResponse(w, req, InvalidPartOrder, req.URL.Path) - case signv4.MissingDateHeader: - writeErrorResponse(w, req, RequestTimeTooSkewed, req.URL.Path) - case signv4.DoesNotMatch: + case fs.SignatureDoesNotMatch: writeErrorResponse(w, req, SignatureDoesNotMatch, req.URL.Path) - case donut.IncompleteBody: + case fs.IncompleteBody: writeErrorResponse(w, req, IncompleteBody, req.URL.Path) - case donut.MalformedXML: + case fs.MalformedXML: writeErrorResponse(w, req, MalformedXML, req.URL.Path) default: writeErrorResponse(w, req, InternalError, req.URL.Path) } return } - response := generateCompleteMultpartUploadResponse(bucket, object, "", metadata.MD5Sum) + response := generateCompleteMultpartUploadResponse(bucket, object, "", metadata.Md5) encodedSuccessResponse := encodeSuccessResponse(response) // write headers setCommonHeaders(w, len(encodedSuccessResponse)) @@ -503,14 +443,26 @@ func (api API) CompleteMultipartUploadHandler(w http.ResponseWriter, req *http.R /// Delete API -// DeleteBucketHandler - Delete bucket -func (api API) DeleteBucketHandler(w http.ResponseWriter, req *http.Request) { - error := getErrorCode(MethodNotAllowed) - w.WriteHeader(error.HTTPStatusCode) -} - // DeleteObjectHandler - Delete object func (api API) DeleteObjectHandler(w http.ResponseWriter, req *http.Request) { - error := getErrorCode(MethodNotAllowed) - w.WriteHeader(error.HTTPStatusCode) + vars := mux.Vars(req) + bucket := vars["bucket"] + object := vars["object"] + + err := api.Filesystem.DeleteObject(bucket, object) + if err != nil { + errorIf(err.Trace(), "DeleteObject failed.", nil) + switch err.ToGoError().(type) { + case fs.BucketNameInvalid: + writeErrorResponse(w, req, InvalidBucketName, req.URL.Path) + case fs.BucketNotFound: + writeErrorResponse(w, req, NoSuchBucket, req.URL.Path) + case fs.ObjectNotFound: + writeErrorResponse(w, req, NoSuchKey, req.URL.Path) + case fs.ObjectNameInvalid: + writeErrorResponse(w, req, NoSuchKey, req.URL.Path) + default: + writeErrorResponse(w, req, InternalError, req.URL.Path) + } + } } diff --git a/pkg/crypto/md5/md5.go b/pkg/crypto/md5/md5.go deleted file mode 100644 index 8bf3b7d42..000000000 --- a/pkg/crypto/md5/md5.go +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2014 Minio, 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 md5 - -import ( - "crypto/md5" - "io" -) - -// Sum - low memory footprint io.Reader based md5sum helper -func Sum(reader io.Reader) ([]byte, error) { - hash := md5.New() - var err error - var length int - for err == nil { - byteBuffer := make([]byte, 1024*1024) - length, err = reader.Read(byteBuffer) - // While hash.Write() wouldn't mind a Nil byteBuffer - // It is necessary for us to verify this and break - if length == 0 { - break - } - byteBuffer = byteBuffer[0:length] - hash.Write(byteBuffer) - } - if err != io.EOF { - return nil, err - } - return hash.Sum(nil), nil -} diff --git a/pkg/crypto/md5/md5_test.go b/pkg/crypto/md5/md5_test.go deleted file mode 100644 index d77a7c6d2..000000000 --- a/pkg/crypto/md5/md5_test.go +++ /dev/null @@ -1,24 +0,0 @@ -package md5_test - -import ( - "bytes" - "encoding/hex" - "testing" - - "github.com/minio/minio/pkg/crypto/md5" - . "gopkg.in/check.v1" -) - -func Test(t *testing.T) { TestingT(t) } - -type MySuite struct{} - -var _ = Suite(&MySuite{}) - -func (s *MySuite) TestMd5sum(c *C) { - testString := []byte("Test string") - expectedHash, _ := hex.DecodeString("0fd3dbec9730101bff92acc820befc34") - hash, err := md5.Sum(bytes.NewBuffer(testString)) - c.Assert(err, IsNil) - c.Assert(bytes.Equal(expectedHash, hash), Equals, true) -} diff --git a/pkg/crypto/sha1/.gitignore b/pkg/crypto/sha1/.gitignore deleted file mode 100644 index a11ae5b8a..000000000 --- a/pkg/crypto/sha1/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.syso \ No newline at end of file diff --git a/pkg/crypto/sha1/sha1_darwin.go b/pkg/crypto/sha1/sha1_darwin.go deleted file mode 100644 index 40a333ec4..000000000 --- a/pkg/crypto/sha1/sha1_darwin.go +++ /dev/null @@ -1,167 +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 of -// Golang project: -// https://github.com/golang/go/blob/master/LICENSE - -// Using this part of Minio codebase under the license -// Apache License Version 2.0 with modifications - -// Package sha1 implements the SHA1 hash algorithm as defined in RFC 3174. -package sha1 - -import ( - "hash" - "io" - - "github.com/minio/minio/pkg/cpu" -) - -// The size of a SHA1 checksum in bytes. -const Size = 20 - -// The blocksize of SHA1 in bytes. -const BlockSize = 64 - -const ( - chunk = 64 - init0 = 0x67452301 - init1 = 0xEFCDAB89 - init2 = 0x98BADCFE - init3 = 0x10325476 - init4 = 0xC3D2E1F0 -) - -// digest represents the partial evaluation of a checksum. -type digest struct { - h [5]uint32 - x [chunk]byte - nx int - len uint64 -} - -// Reset digest -func (d *digest) Reset() { - d.h[0] = init0 - d.h[1] = init1 - d.h[2] = init2 - d.h[3] = init3 - d.h[4] = init4 - d.nx = 0 - d.len = 0 -} - -// New returns a new hash.Hash computing the SHA1 checksum. -func New() hash.Hash { - d := new(digest) - d.Reset() - return d -} - -func block(dig *digest, p []byte) { - switch true { - case cpu.HasSSE41() == true: - blockSSE3(dig, p) - default: - blockGeneric(dig, p) - } -} - -// Return output size -func (d *digest) Size() int { return Size } - -// Return checksum blocksize -func (d *digest) BlockSize() int { return BlockSize } - -// Write to digest -func (d *digest) Write(p []byte) (nn int, err error) { - nn = len(p) - d.len += uint64(nn) - if d.nx > 0 { - n := copy(d.x[d.nx:], p) - d.nx += n - if d.nx == chunk { - block(d, d.x[:]) - d.nx = 0 - } - p = p[n:] - } - if len(p) >= chunk { - n := len(p) &^ (chunk - 1) - block(d, p[:n]) - p = p[n:] - } - if len(p) > 0 { - d.nx = copy(d.x[:], p) - } - return -} - -// Return checksum bytes -func (d *digest) Sum(in []byte) []byte { - // Make a copy of d0 so that caller can keep writing and summing. - d0 := *d - hash := d0.checkSum() - return append(in, hash[:]...) -} - -// Intermediate checksum function -func (d *digest) checkSum() [Size]byte { - len := d.len - // Padding. Add a 1 bit and 0 bits until 56 bytes mod 64. - var tmp [64]byte - tmp[0] = 0x80 - if len%64 < 56 { - d.Write(tmp[0 : 56-len%64]) - } else { - d.Write(tmp[0 : 64+56-len%64]) - } - - // Length in bits. - len <<= 3 - for i := uint(0); i < 8; i++ { - tmp[i] = byte(len >> (56 - 8*i)) - } - d.Write(tmp[0:8]) - - if d.nx != 0 { - panic("d.nx != 0") - } - - var digest [Size]byte - for i, s := range d.h { - digest[i*4] = byte(s >> 24) - digest[i*4+1] = byte(s >> 16) - digest[i*4+2] = byte(s >> 8) - digest[i*4+3] = byte(s) - } - - return digest -} - -/// Convenience functions - -// Sum1 - single caller sha1 helper -func Sum1(data []byte) [Size]byte { - var d digest - d.Reset() - d.Write(data) - return d.checkSum() -} - -// Sum - io.Reader based streaming sha1 helper -func Sum(reader io.Reader) ([]byte, error) { - h := New() - var err error - for err == nil { - length := 0 - byteBuffer := make([]byte, 1024*1024) - length, err = reader.Read(byteBuffer) - byteBuffer = byteBuffer[0:length] - h.Write(byteBuffer) - } - if err != io.EOF { - return nil, err - } - return h.Sum(nil), nil -} diff --git a/pkg/crypto/sha1/sha1_linux.S b/pkg/crypto/sha1/sha1_linux.S deleted file mode 100644 index 49887325d..000000000 --- a/pkg/crypto/sha1/sha1_linux.S +++ /dev/null @@ -1,967 +0,0 @@ -/* - * Implement fast SHA-1 with AVX2 instructions. (x86_64) - * - * This file is provided under a dual BSD/GPLv2 license. When using or - * redistributing this file, you may do so under either license. - * - * GPL LICENSE SUMMARY - * - * Copyright(c) 2014 Intel Corporation. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program 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 - * General Public License for more details. - * - * Contact Information: - * Ilya Albrekht - * Maxim Locktyukhin - * Ronen Zohar - * Chandramouli Narayanan - * - * BSD LICENSE - * - * Copyright(c) 2014 Intel Corporation. - * - * 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 Intel Corporation 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. - * - */ - -/* - * SHA-1 implementation with Intel(R) AVX2 instruction set extensions. - * - *This implementation is based on the previous SSSE3 release: - * https://software.intel.com/en-us/articles/improving-the-performance-of-the-secure-hash-algorithm-1 - * - *Updates 20-byte SHA-1 record in 'hash' for even number of - *'num_blocks' consecutive 64-byte blocks - * - */ - -/* - * Using this part of Minio codebase under the license - * Apache License Version 2.0 with modifications - * - */ - -#ifdef HAS_AVX2 -#ifndef ENTRY -#define ENTRY(name) \ - .globl name ; \ - .align 4,0x90 ; \ - name: -#endif - -#ifndef END -#define END(name) \ - .size name, .-name -#endif - -#ifndef ENDPROC -#define ENDPROC(name) \ - .type name, @function ; \ - END(name) -#endif - -#define NUM_INVALID 100 - -#define TYPE_R32 0 -#define TYPE_R64 1 -#define TYPE_XMM 2 -#define TYPE_INVALID 100 - - .macro R32_NUM opd r32 - \opd = NUM_INVALID - .ifc \r32,%eax - \opd = 0 - .endif - .ifc \r32,%ecx - \opd = 1 - .endif - .ifc \r32,%edx - \opd = 2 - .endif - .ifc \r32,%ebx - \opd = 3 - .endif - .ifc \r32,%esp - \opd = 4 - .endif - .ifc \r32,%ebp - \opd = 5 - .endif - .ifc \r32,%esi - \opd = 6 - .endif - .ifc \r32,%edi - \opd = 7 - .endif -#ifdef X86_64 - .ifc \r32,%r8d - \opd = 8 - .endif - .ifc \r32,%r9d - \opd = 9 - .endif - .ifc \r32,%r10d - \opd = 10 - .endif - .ifc \r32,%r11d - \opd = 11 - .endif - .ifc \r32,%r12d - \opd = 12 - .endif - .ifc \r32,%r13d - \opd = 13 - .endif - .ifc \r32,%r14d - \opd = 14 - .endif - .ifc \r32,%r15d - \opd = 15 - .endif -#endif - .endm - - .macro R64_NUM opd r64 - \opd = NUM_INVALID -#ifdef X86_64 - .ifc \r64,%rax - \opd = 0 - .endif - .ifc \r64,%rcx - \opd = 1 - .endif - .ifc \r64,%rdx - \opd = 2 - .endif - .ifc \r64,%rbx - \opd = 3 - .endif - .ifc \r64,%rsp - \opd = 4 - .endif - .ifc \r64,%rbp - \opd = 5 - .endif - .ifc \r64,%rsi - \opd = 6 - .endif - .ifc \r64,%rdi - \opd = 7 - .endif - .ifc \r64,%r8 - \opd = 8 - .endif - .ifc \r64,%r9 - \opd = 9 - .endif - .ifc \r64,%r10 - \opd = 10 - .endif - .ifc \r64,%r11 - \opd = 11 - .endif - .ifc \r64,%r12 - \opd = 12 - .endif - .ifc \r64,%r13 - \opd = 13 - .endif - .ifc \r64,%r14 - \opd = 14 - .endif - .ifc \r64,%r15 - \opd = 15 - .endif -#endif - .endm - - .macro XMM_NUM opd xmm - \opd = NUM_INVALID - .ifc \xmm,%xmm0 - \opd = 0 - .endif - .ifc \xmm,%xmm1 - \opd = 1 - .endif - .ifc \xmm,%xmm2 - \opd = 2 - .endif - .ifc \xmm,%xmm3 - \opd = 3 - .endif - .ifc \xmm,%xmm4 - \opd = 4 - .endif - .ifc \xmm,%xmm5 - \opd = 5 - .endif - .ifc \xmm,%xmm6 - \opd = 6 - .endif - .ifc \xmm,%xmm7 - \opd = 7 - .endif - .ifc \xmm,%xmm8 - \opd = 8 - .endif - .ifc \xmm,%xmm9 - \opd = 9 - .endif - .ifc \xmm,%xmm10 - \opd = 10 - .endif - .ifc \xmm,%xmm11 - \opd = 11 - .endif - .ifc \xmm,%xmm12 - \opd = 12 - .endif - .ifc \xmm,%xmm13 - \opd = 13 - .endif - .ifc \xmm,%xmm14 - \opd = 14 - .endif - .ifc \xmm,%xmm15 - \opd = 15 - .endif - .endm - - .macro TYPE type reg - R32_NUM reg_type_r32 \reg - R64_NUM reg_type_r64 \reg - XMM_NUM reg_type_xmm \reg - .if reg_type_r64 <> NUM_INVALID - \type = TYPE_R64 - .elseif reg_type_r32 <> NUM_INVALID - \type = TYPE_R32 - .elseif reg_type_xmm <> NUM_INVALID - \type = TYPE_XMM - .else - \type = TYPE_INVALID - .endif - .endm - - .macro PFX_OPD_SIZE - .byte 0x66 - .endm - - .macro PFX_REX opd1 opd2 W=0 - .if ((\opd1 | \opd2) & 8) || \W - .byte 0x40 | ((\opd1 & 8) >> 3) | ((\opd2 & 8) >> 1) | (\W << 3) - .endif - .endm - - .macro MODRM mod opd1 opd2 - .byte \mod | (\opd1 & 7) | ((\opd2 & 7) << 3) - .endm - - .macro PSHUFB_XMM xmm1 xmm2 - XMM_NUM pshufb_opd1 \xmm1 - XMM_NUM pshufb_opd2 \xmm2 - PFX_OPD_SIZE - PFX_REX pshufb_opd1 pshufb_opd2 - .byte 0x0f, 0x38, 0x00 - MODRM 0xc0 pshufb_opd1 pshufb_opd2 - .endm - - .macro PCLMULQDQ imm8 xmm1 xmm2 - XMM_NUM clmul_opd1 \xmm1 - XMM_NUM clmul_opd2 \xmm2 - PFX_OPD_SIZE - PFX_REX clmul_opd1 clmul_opd2 - .byte 0x0f, 0x3a, 0x44 - MODRM 0xc0 clmul_opd1 clmul_opd2 - .byte \imm8 - .endm - - .macro PEXTRD imm8 xmm gpr - R32_NUM extrd_opd1 \gpr - XMM_NUM extrd_opd2 \xmm - PFX_OPD_SIZE - PFX_REX extrd_opd1 extrd_opd2 - .byte 0x0f, 0x3a, 0x16 - MODRM 0xc0 extrd_opd1 extrd_opd2 - .byte \imm8 - .endm - - .macro MOVQ_R64_XMM opd1 opd2 - TYPE movq_r64_xmm_opd1_type \opd1 - .if movq_r64_xmm_opd1_type == TYPE_XMM - XMM_NUM movq_r64_xmm_opd1 \opd1 - R64_NUM movq_r64_xmm_opd2 \opd2 - .else - R64_NUM movq_r64_xmm_opd1 \opd1 - XMM_NUM movq_r64_xmm_opd2 \opd2 - .endif - PFX_OPD_SIZE - PFX_REX movq_r64_xmm_opd1 movq_r64_xmm_opd2 1 - .if movq_r64_xmm_opd1_type == TYPE_XMM - .byte 0x0f, 0x7e - .else - .byte 0x0f, 0x6e - .endif - MODRM 0xc0 movq_r64_xmm_opd1 movq_r64_xmm_opd2 - .endm - -#define CTX %rdi /* arg1 */ -#define BUF %rsi /* arg2 */ -#define CNT %rdx /* arg3 */ - -#define REG_A %ecx -#define REG_B %esi -#define REG_C %edi -#define REG_D %eax -#define REG_E %edx -#define REG_TB %ebx -#define REG_TA %r12d -#define REG_RA %rcx -#define REG_RB %rsi -#define REG_RC %rdi -#define REG_RD %rax -#define REG_RE %rdx -#define REG_RTA %r12 -#define REG_RTB %rbx -#define REG_T1 %ebp -#define xmm_mov vmovups -#define avx2_zeroupper vzeroupper -#define RND_F1 1 -#define RND_F2 2 -#define RND_F3 3 - -.macro REGALLOC - .set A, REG_A - .set B, REG_B - .set C, REG_C - .set D, REG_D - .set E, REG_E - .set TB, REG_TB - .set TA, REG_TA - - .set RA, REG_RA - .set RB, REG_RB - .set RC, REG_RC - .set RD, REG_RD - .set RE, REG_RE - - .set RTA, REG_RTA - .set RTB, REG_RTB - - .set T1, REG_T1 -.endm - -#define K_BASE %r8 -#define HASH_PTR %r9 -#define BUFFER_PTR %r10 -#define BUFFER_PTR2 %r13 -#define BUFFER_END %r11 - -#define PRECALC_BUF %r14 -#define WK_BUF %r15 - -#define W_TMP %xmm0 -#define WY_TMP %ymm0 -#define WY_TMP2 %ymm9 - -# AVX2 variables -#define WY0 %ymm3 -#define WY4 %ymm5 -#define WY08 %ymm7 -#define WY12 %ymm8 -#define WY16 %ymm12 -#define WY20 %ymm13 -#define WY24 %ymm14 -#define WY28 %ymm15 - -#define YMM_SHUFB_BSWAP %ymm10 - -/* - * Keep 2 iterations precalculated at a time: - * - 80 DWORDs per iteration * 2 - */ -#define W_SIZE (80*2*2 +16) - -#define WK(t) ((((t) % 80) / 4)*32 + ( (t) % 4)*4 + ((t)/80)*16 )(WK_BUF) -#define PRECALC_WK(t) ((t)*2*2)(PRECALC_BUF) - - -.macro UPDATE_HASH hash, val - add \hash, \val - mov \val, \hash -.endm - -.macro PRECALC_RESET_WY - .set WY_00, WY0 - .set WY_04, WY4 - .set WY_08, WY08 - .set WY_12, WY12 - .set WY_16, WY16 - .set WY_20, WY20 - .set WY_24, WY24 - .set WY_28, WY28 - .set WY_32, WY_00 -.endm - -.macro PRECALC_ROTATE_WY - /* Rotate macros */ - .set WY_32, WY_28 - .set WY_28, WY_24 - .set WY_24, WY_20 - .set WY_20, WY_16 - .set WY_16, WY_12 - .set WY_12, WY_08 - .set WY_08, WY_04 - .set WY_04, WY_00 - .set WY_00, WY_32 - - /* Define register aliases */ - .set WY, WY_00 - .set WY_minus_04, WY_04 - .set WY_minus_08, WY_08 - .set WY_minus_12, WY_12 - .set WY_minus_16, WY_16 - .set WY_minus_20, WY_20 - .set WY_minus_24, WY_24 - .set WY_minus_28, WY_28 - .set WY_minus_32, WY -.endm - -.macro PRECALC_00_15 - .if (i == 0) # Initialize and rotate registers - PRECALC_RESET_WY - PRECALC_ROTATE_WY - .endif - - /* message scheduling pre-compute for rounds 0-15 */ - .if ((i & 7) == 0) - /* - * blended AVX2 and ALU instruction scheduling - * 1 vector iteration per 8 rounds - */ - vmovdqu ((i * 2) + PRECALC_OFFSET)(BUFFER_PTR), W_TMP - .elseif ((i & 7) == 1) - vinsertf128 $1, (((i-1) * 2)+PRECALC_OFFSET)(BUFFER_PTR2),\ - WY_TMP, WY_TMP - .elseif ((i & 7) == 2) - vpshufb YMM_SHUFB_BSWAP, WY_TMP, WY - .elseif ((i & 7) == 4) - vpaddd K_XMM(K_BASE), WY, WY_TMP - .elseif ((i & 7) == 7) - vmovdqu WY_TMP, PRECALC_WK(i&~7) - - PRECALC_ROTATE_WY - .endif -.endm - -.macro PRECALC_16_31 - /* - * message scheduling pre-compute for rounds 16-31 - * calculating last 32 w[i] values in 8 XMM registers - * pre-calculate K+w[i] values and store to mem - * for later load by ALU add instruction - * - * "brute force" vectorization for rounds 16-31 only - * due to w[i]->w[i-3] dependency - */ - .if ((i & 7) == 0) - /* - * blended AVX2 and ALU instruction scheduling - * 1 vector iteration per 8 rounds - */ - /* w[i-14] */ - vpalignr $8, WY_minus_16, WY_minus_12, WY - vpsrldq $4, WY_minus_04, WY_TMP /* w[i-3] */ - .elseif ((i & 7) == 1) - vpxor WY_minus_08, WY, WY - vpxor WY_minus_16, WY_TMP, WY_TMP - .elseif ((i & 7) == 2) - vpxor WY_TMP, WY, WY - vpslldq $12, WY, WY_TMP2 - .elseif ((i & 7) == 3) - vpslld $1, WY, WY_TMP - vpsrld $31, WY, WY - .elseif ((i & 7) == 4) - vpor WY, WY_TMP, WY_TMP - vpslld $2, WY_TMP2, WY - .elseif ((i & 7) == 5) - vpsrld $30, WY_TMP2, WY_TMP2 - vpxor WY, WY_TMP, WY_TMP - .elseif ((i & 7) == 7) - vpxor WY_TMP2, WY_TMP, WY - vpaddd K_XMM(K_BASE), WY, WY_TMP - vmovdqu WY_TMP, PRECALC_WK(i&~7) - - PRECALC_ROTATE_WY - .endif -.endm - -.macro PRECALC_32_79 - /* - * in SHA-1 specification: - * w[i] = (w[i-3] ^ w[i-8] ^ w[i-14] ^ w[i-16]) rol 1 - * instead we do equal: - * w[i] = (w[i-6] ^ w[i-16] ^ w[i-28] ^ w[i-32]) rol 2 - * allows more efficient vectorization - * since w[i]=>w[i-3] dependency is broken - */ - - .if ((i & 7) == 0) - /* - * blended AVX2 and ALU instruction scheduling - * 1 vector iteration per 8 rounds - */ - vpalignr $8, WY_minus_08, WY_minus_04, WY_TMP - .elseif ((i & 7) == 1) - /* W is W_minus_32 before xor */ - vpxor WY_minus_28, WY, WY - .elseif ((i & 7) == 2) - vpxor WY_minus_16, WY_TMP, WY_TMP - .elseif ((i & 7) == 3) - vpxor WY_TMP, WY, WY - .elseif ((i & 7) == 4) - vpslld $2, WY, WY_TMP - .elseif ((i & 7) == 5) - vpsrld $30, WY, WY - vpor WY, WY_TMP, WY - .elseif ((i & 7) == 7) - vpaddd K_XMM(K_BASE), WY, WY_TMP - vmovdqu WY_TMP, PRECALC_WK(i&~7) - - PRECALC_ROTATE_WY - .endif -.endm - -.macro PRECALC r, s - .set i, \r - - .if (i < 40) - .set K_XMM, 32*0 - .elseif (i < 80) - .set K_XMM, 32*1 - .elseif (i < 120) - .set K_XMM, 32*2 - .else - .set K_XMM, 32*3 - .endif - - .if (i<32) - PRECALC_00_15 \s - .elseif (i<64) - PRECALC_16_31 \s - .elseif (i < 160) - PRECALC_32_79 \s - .endif -.endm - -.macro ROTATE_STATE - .set T_REG, E - .set E, D - .set D, C - .set C, B - .set B, TB - .set TB, A - .set A, T_REG - - .set T_REG, RE - .set RE, RD - .set RD, RC - .set RC, RB - .set RB, RTB - .set RTB, RA - .set RA, T_REG -.endm - -/* Macro relies on saved ROUND_Fx */ - -.macro RND_FUN f, r - .if (\f == RND_F1) - ROUND_F1 \r - .elseif (\f == RND_F2) - ROUND_F2 \r - .elseif (\f == RND_F3) - ROUND_F3 \r - .endif -.endm - -.macro RR r - .set round_id, (\r % 80) - - .if (round_id == 0) /* Precalculate F for first round */ - .set ROUND_FUNC, RND_F1 - mov B, TB - - rorx $(32-30), B, B /* b>>>2 */ - andn D, TB, T1 - and C, TB - xor T1, TB - .endif - - RND_FUN ROUND_FUNC, \r - ROTATE_STATE - - .if (round_id == 18) - .set ROUND_FUNC, RND_F2 - .elseif (round_id == 38) - .set ROUND_FUNC, RND_F3 - .elseif (round_id == 58) - .set ROUND_FUNC, RND_F2 - .endif - - .set round_id, ( (\r+1) % 80) - - RND_FUN ROUND_FUNC, (\r+1) - ROTATE_STATE -.endm - -.macro ROUND_F1 r - add WK(\r), E - - andn C, A, T1 /* ~b&d */ - lea (RE,RTB), E /* Add F from the previous round */ - - rorx $(32-5), A, TA /* T2 = A >>> 5 */ - rorx $(32-30),A, TB /* b>>>2 for next round */ - - PRECALC (\r) /* msg scheduling for next 2 blocks */ - - /* - * Calculate F for the next round - * (b & c) ^ andn[b, d] - */ - and B, A /* b&c */ - xor T1, A /* F1 = (b&c) ^ (~b&d) */ - - lea (RE,RTA), E /* E += A >>> 5 */ -.endm - -.macro ROUND_F2 r - add WK(\r), E - lea (RE,RTB), E /* Add F from the previous round */ - - /* Calculate F for the next round */ - rorx $(32-5), A, TA /* T2 = A >>> 5 */ - .if ((round_id) < 79) - rorx $(32-30), A, TB /* b>>>2 for next round */ - .endif - PRECALC (\r) /* msg scheduling for next 2 blocks */ - - .if ((round_id) < 79) - xor B, A - .endif - - add TA, E /* E += A >>> 5 */ - - .if ((round_id) < 79) - xor C, A - .endif -.endm - -.macro ROUND_F3 r - add WK(\r), E - PRECALC (\r) /* msg scheduling for next 2 blocks */ - - lea (RE,RTB), E /* Add F from the previous round */ - - mov B, T1 - or A, T1 - - rorx $(32-5), A, TA /* T2 = A >>> 5 */ - rorx $(32-30), A, TB /* b>>>2 for next round */ - - /* Calculate F for the next round - * (b and c) or (d and (b or c)) - */ - and C, T1 - and B, A - or T1, A - - add TA, E /* E += A >>> 5 */ - -.endm - -/* - * macro implements 80 rounds of SHA-1, for multiple blocks with s/w pipelining - */ -.macro SHA1_PIPELINED_MAIN_BODY - - REGALLOC - - mov (HASH_PTR), A - mov 4(HASH_PTR), B - mov 8(HASH_PTR), C - mov 12(HASH_PTR), D - mov 16(HASH_PTR), E - - mov %rsp, PRECALC_BUF - lea (2*4*80+32)(%rsp), WK_BUF - - # Precalc WK for first 2 blocks - PRECALC_OFFSET = 0 - .set i, 0 - .rept 160 - PRECALC i - .set i, i + 1 - .endr - PRECALC_OFFSET = 128 - xchg WK_BUF, PRECALC_BUF - - .align 32 -_loop: - /* - * code loops through more than one block - * we use K_BASE value as a signal of a last block, - * it is set below by: cmovae BUFFER_PTR, K_BASE - */ - cmp K_BASE, BUFFER_PTR - jne _begin - .align 32 - jmp _end - .align 32 -_begin: - - /* - * Do first block - * rounds: 0,2,4,6,8 - */ - .set j, 0 - .rept 5 - RR j - .set j, j+2 - .endr - - jmp _loop0 -_loop0: - - /* - * rounds: - * 10,12,14,16,18 - * 20,22,24,26,28 - * 30,32,34,36,38 - * 40,42,44,46,48 - * 50,52,54,56,58 - */ - .rept 25 - RR j - .set j, j+2 - .endr - - add $(2*64), BUFFER_PTR /* move to next odd-64-byte block */ - cmp BUFFER_END, BUFFER_PTR /* is current block the last one? */ - cmovae K_BASE, BUFFER_PTR /* signal the last iteration smartly */ - - /* - * rounds - * 60,62,64,66,68 - * 70,72,74,76,78 - */ - .rept 10 - RR j - .set j, j+2 - .endr - - UPDATE_HASH (HASH_PTR), A - UPDATE_HASH 4(HASH_PTR), TB - UPDATE_HASH 8(HASH_PTR), C - UPDATE_HASH 12(HASH_PTR), D - UPDATE_HASH 16(HASH_PTR), E - - cmp K_BASE, BUFFER_PTR /* is current block the last one? */ - je _loop - - mov TB, B - - /* Process second block */ - /* - * rounds - * 0+80, 2+80, 4+80, 6+80, 8+80 - * 10+80,12+80,14+80,16+80,18+80 - */ - - .set j, 0 - .rept 10 - RR j+80 - .set j, j+2 - .endr - - jmp _loop1 -_loop1: - /* - * rounds - * 20+80,22+80,24+80,26+80,28+80 - * 30+80,32+80,34+80,36+80,38+80 - */ - .rept 10 - RR j+80 - .set j, j+2 - .endr - - jmp _loop2 -_loop2: - - /* - * rounds - * 40+80,42+80,44+80,46+80,48+80 - * 50+80,52+80,54+80,56+80,58+80 - */ - .rept 10 - RR j+80 - .set j, j+2 - .endr - - add $(2*64), BUFFER_PTR2 /* move to next even-64-byte block */ - - cmp BUFFER_END, BUFFER_PTR2 /* is current block the last one */ - cmovae K_BASE, BUFFER_PTR /* signal the last iteration smartly */ - - jmp _loop3 -_loop3: - - /* - * rounds - * 60+80,62+80,64+80,66+80,68+80 - * 70+80,72+80,74+80,76+80,78+80 - */ - .rept 10 - RR j+80 - .set j, j+2 - .endr - - UPDATE_HASH (HASH_PTR), A - UPDATE_HASH 4(HASH_PTR), TB - UPDATE_HASH 8(HASH_PTR), C - UPDATE_HASH 12(HASH_PTR), D - UPDATE_HASH 16(HASH_PTR), E - - /* Reset state for AVX2 reg permutation */ - mov A, TA - mov TB, A - mov C, TB - mov E, C - mov D, B - mov TA, D - - REGALLOC - - xchg WK_BUF, PRECALC_BUF - - jmp _loop - - .align 32 - _end: - -.endm - -.section .rodata - -#define K1 0x5a827999 -#define K2 0x6ed9eba1 -#define K3 0x8f1bbcdc -#define K4 0xca62c1d6 - -.align 128 -K_XMM_AR: - .long K1, K1, K1, K1 - .long K1, K1, K1, K1 - .long K2, K2, K2, K2 - .long K2, K2, K2, K2 - .long K3, K3, K3, K3 - .long K3, K3, K3, K3 - .long K4, K4, K4, K4 - .long K4, K4, K4, K4 - -BSWAP_SHUFB_CTL: - .long 0x00010203 - .long 0x04050607 - .long 0x08090a0b - .long 0x0c0d0e0f - .long 0x00010203 - .long 0x04050607 - .long 0x08090a0b - .long 0x0c0d0e0f - -# void sha1_transform(int32_t *hash, const char* input, size_t num_blocks) ; - .text - ENTRY(sha1_transform) - - push %rbx - push %rbp - push %r12 - push %r13 - push %r14 - push %r15 - - RESERVE_STACK = (W_SIZE*4 + 8+24) - - /* Align stack */ - mov %rsp, %rbx - and $~(0x20-1), %rsp - push %rbx - sub $RESERVE_STACK, %rsp - - avx2_zeroupper - - lea K_XMM_AR(%rip), K_BASE - - mov CTX, HASH_PTR - mov BUF, BUFFER_PTR - lea 64(BUF), BUFFER_PTR2 - - shl $6, CNT /* mul by 64 */ - add BUF, CNT - add $64, CNT - mov CNT, BUFFER_END - - cmp BUFFER_END, BUFFER_PTR2 - cmovae K_BASE, BUFFER_PTR2 - - xmm_mov BSWAP_SHUFB_CTL(%rip), YMM_SHUFB_BSWAP - - SHA1_PIPELINED_MAIN_BODY - - avx2_zeroupper - - add $RESERVE_STACK, %rsp - pop %rsp - - pop %r15 - pop %r14 - pop %r13 - pop %r12 - pop %rbp - pop %rbx - - ret - - ENDPROC(sha1_transform) -#endif diff --git a/pkg/crypto/sha1/sha1_linux.go b/pkg/crypto/sha1/sha1_linux.go deleted file mode 100644 index 58e34f3b6..000000000 --- a/pkg/crypto/sha1/sha1_linux.go +++ /dev/null @@ -1,169 +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 of -// Golang project: -// https://github.com/golang/go/blob/master/LICENSE - -// Using this part of Minio codebase under the license -// Apache License Version 2.0 with modifications - -// Package sha1 implements the SHA1 hash algorithm as defined in RFC 3174. -package sha1 - -import ( - "hash" - "io" - - "github.com/minio/minio/pkg/cpu" -) - -// The size of a SHA1 checksum in bytes. -const Size = 20 - -// The blocksize of SHA1 in bytes. -const BlockSize = 64 - -const ( - chunk = 64 - init0 = 0x67452301 - init1 = 0xEFCDAB89 - init2 = 0x98BADCFE - init3 = 0x10325476 - init4 = 0xC3D2E1F0 -) - -// digest represents the partial evaluation of a checksum. -type digest struct { - h [5]uint32 - x [chunk]byte - nx int - len uint64 -} - -// Reset digest -func (d *digest) Reset() { - d.h[0] = init0 - d.h[1] = init1 - d.h[2] = init2 - d.h[3] = init3 - d.h[4] = init4 - d.nx = 0 - d.len = 0 -} - -// New returns a new hash.Hash computing the SHA1 checksum. -func New() hash.Hash { - d := new(digest) - d.Reset() - return d -} - -func block(dig *digest, p []byte) { - switch true { - case cpu.HasAVX2() == true: - blockAVX2(dig, p) - case cpu.HasSSE41() == true: - blockSSE3(dig, p) - default: - blockGeneric(dig, p) - } -} - -// Return output size -func (d *digest) Size() int { return Size } - -// Return checksum blocksize -func (d *digest) BlockSize() int { return BlockSize } - -// Write to digest -func (d *digest) Write(p []byte) (nn int, err error) { - nn = len(p) - d.len += uint64(nn) - if d.nx > 0 { - n := copy(d.x[d.nx:], p) - d.nx += n - if d.nx == chunk { - block(d, d.x[:]) - d.nx = 0 - } - p = p[n:] - } - if len(p) >= chunk { - n := len(p) &^ (chunk - 1) - block(d, p[:n]) - p = p[n:] - } - if len(p) > 0 { - d.nx = copy(d.x[:], p) - } - return -} - -// Return checksum bytes -func (d *digest) Sum(in []byte) []byte { - // Make a copy of d0 so that caller can keep writing and summing. - d0 := *d - hash := d0.checkSum() - return append(in, hash[:]...) -} - -// Intermediate checksum function -func (d *digest) checkSum() [Size]byte { - len := d.len - // Padding. Add a 1 bit and 0 bits until 56 bytes mod 64. - var tmp [64]byte - tmp[0] = 0x80 - if len%64 < 56 { - d.Write(tmp[0 : 56-len%64]) - } else { - d.Write(tmp[0 : 64+56-len%64]) - } - - // Length in bits. - len <<= 3 - for i := uint(0); i < 8; i++ { - tmp[i] = byte(len >> (56 - 8*i)) - } - d.Write(tmp[0:8]) - - if d.nx != 0 { - panic("d.nx != 0") - } - - var digest [Size]byte - for i, s := range d.h { - digest[i*4] = byte(s >> 24) - digest[i*4+1] = byte(s >> 16) - digest[i*4+2] = byte(s >> 8) - digest[i*4+3] = byte(s) - } - - return digest -} - -/// Convenience functions - -// Sum1 - single caller sha1 helper -func Sum1(data []byte) [Size]byte { - var d digest - d.Reset() - d.Write(data) - return d.checkSum() -} - -// Sum - io.Reader based streaming sha1 helper -func Sum(reader io.Reader) ([]byte, error) { - h := New() - var err error - for err == nil { - length := 0 - byteBuffer := make([]byte, 1024*1024) - length, err = reader.Read(byteBuffer) - byteBuffer = byteBuffer[0:length] - h.Write(byteBuffer) - } - if err != io.EOF { - return nil, err - } - return h.Sum(nil), nil -} diff --git a/pkg/crypto/sha1/sha1_sse3_amd64.asm b/pkg/crypto/sha1/sha1_sse3_amd64.asm deleted file mode 100644 index e91967a6f..000000000 --- a/pkg/crypto/sha1/sha1_sse3_amd64.asm +++ /dev/null @@ -1,579 +0,0 @@ -;--------------------- -; https://software.intel.com/en-us/articles/improving-the-performance-of-the-secure-hash-algorithm-1 -; -; License information: -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; This implementation notably advances the performance of SHA-1 algorithm compared to existing -; implementations. We are encouraging all projects utilizing SHA-1 to integrate this new fast -; implementation and are ready to help if issues or concerns arise (you are welcome to leave -; a comment or write an email to the authors). It is provided 'as is' and free for either -; commercial or non-commercial use. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; -; This code implements two interfaces of SHA-1 update function: 1) working on a single -; 64-byte block and 2) working on a buffer of multiple 64-bit blocks. Multiple blocks -; version of code is software pipelined and faster overall, it is a default. Assemble -; with -DINTEL_SHA1_SINGLEBLOCK to select single 64-byte block function interface. -; -; C++ prototypes of implemented functions are below: -; -; #ifndef INTEL_SHA1_SINGLEBLOCK -; // Updates 20-byte SHA-1 record in 'hash' for 'num_blocks' consequtive 64-byte blocks -; extern "C" void sha1_update_intel(int *hash, const char* input, size_t num_blocks ); -; #else -; // Updates 20-byte SHA-1 record in 'hash' for one 64-byte block pointed by 'input' -; extern "C" void sha1_update_intel(int *hash, const char* input); -; #endif -; -; Function name 'sha1_update_intel' can be changed in the source or via macro: -; -DINTEL_SHA1_UPDATE_FUNCNAME=my_sha1_update_func_name -; -; It implements both UNIX(default) and Windows ABIs, use -DWIN_ABI on Windows -; -; Code checks CPU for SSSE3 support via CPUID feature flag (CPUID.1.ECX.SSSE3[bit 9]==1), -; and performs dispatch. Since in most cases the functionality on non-SSSE3 supporting CPUs -; is also required, the default (e.g. one being replaced) function can be provided for -; dispatch on such CPUs, the name of old function can be changed in the source or via macro: -; -DINTEL_SHA1_UPDATE_DEFAULT_DISPATCH=default_sha1_update_function_name -; -; Authors: Maxim Locktyukhin and Ronen Zohar at Intel.com -; - -%ifndef INTEL_SHA1_UPDATE_DEFAULT_DISPATCH - ;; can be replaced with a default SHA-1 update function name -%define INTEL_SHA1_UPDATE_DEFAULT_DISPATCH sha1_intel_non_ssse3_cpu_stub_ -%else -extern INTEL_SHA1_UPDATE_DEFAULT_DISPATCH -%endif - -;; provide alternative SHA-1 update function's name here -%ifndef INTEL_SHA1_UPDATE_FUNCNAME -%define INTEL_SHA1_UPDATE_FUNCNAME sha1_update_intel -%endif - -global INTEL_SHA1_UPDATE_FUNCNAME - - -%ifndef INTEL_SHA1_SINGLEBLOCK -%assign multiblock 1 -%else -%assign multiblock 0 -%endif - - -bits 64 -default rel - -%ifdef WIN_ABI - %xdefine arg1 rcx - %xdefine arg2 rdx - %xdefine arg3 r8 -%else - %xdefine arg1 rdi - %xdefine arg2 rsi - %xdefine arg3 rdx -%endif - -%xdefine ctx arg1 -%xdefine buf arg2 -%xdefine cnt arg3 - -%macro REGALLOC 0 - %xdefine A ecx - %xdefine B esi - %xdefine C edi - %xdefine D ebp - %xdefine E edx - - %xdefine T1 eax - %xdefine T2 ebx -%endmacro - -%xdefine K_BASE r8 -%xdefine HASH_PTR r9 -%xdefine BUFFER_PTR r10 -%xdefine BUFFER_END r11 - -%xdefine W_TMP xmm0 -%xdefine W_TMP2 xmm9 - -%xdefine W0 xmm1 -%xdefine W4 xmm2 -%xdefine W8 xmm3 -%xdefine W12 xmm4 -%xdefine W16 xmm5 -%xdefine W20 xmm6 -%xdefine W24 xmm7 -%xdefine W28 xmm8 - -%xdefine XMM_SHUFB_BSWAP xmm10 - -;; we keep window of 64 w[i]+K pre-calculated values in a circular buffer -%xdefine WK(t) (rsp + (t & 15)*4) - -;------------------------------------------------------------------------------ -; -; macro implements SHA-1 function's body for single or several 64-byte blocks -; first param: function's name -; second param: =0 - function implements single 64-byte block hash -; =1 - function implements multiple64-byte blocks hash -; 3rd function's argument is a number, greater 0, of 64-byte blocks to calc hash for -; -%macro SHA1_VECTOR_ASM 2 -align 4096 -%1: - push rbx - push rbp - - %ifdef WIN_ABI - push rdi - push rsi - - %xdefine stack_size (16*4 + 16*5 + 8) - %else - %xdefine stack_size (16*4 + 8) - %endif - - sub rsp, stack_size - - %ifdef WIN_ABI - %xdefine xmm_save_base (rsp + 16*4) - - xmm_mov [xmm_save_base + 0*16], xmm6 - xmm_mov [xmm_save_base + 1*16], xmm7 - xmm_mov [xmm_save_base + 2*16], xmm8 - xmm_mov [xmm_save_base + 3*16], xmm9 - xmm_mov [xmm_save_base + 4*16], xmm10 - %endif - - mov HASH_PTR, ctx - mov BUFFER_PTR, buf - - %if (%2 == 1) - shl cnt, 6 ;; mul by 64 - add cnt, buf - mov BUFFER_END, cnt - %endif - - lea K_BASE, [K_XMM_AR] - xmm_mov XMM_SHUFB_BSWAP, [bswap_shufb_ctl] - - SHA1_PIPELINED_MAIN_BODY %2 - - %ifdef WIN_ABI - xmm_mov xmm6, [xmm_save_base + 0*16] - xmm_mov xmm7, [xmm_save_base + 1*16] - xmm_mov xmm8, [xmm_save_base + 2*16] - xmm_mov xmm9, [xmm_save_base + 3*16] - xmm_mov xmm10,[xmm_save_base + 4*16] - %endif - - add rsp, stack_size - - %ifdef WIN_ABI - pop rsi - pop rdi - %endif - - pop rbp - pop rbx - - ret -%endmacro - -;-------------------------------------------- -; macro implements 80 rounds of SHA-1, for one 64-byte block or multiple blocks with s/w pipelining -; macro param: =0 - process single 64-byte block -; =1 - multiple blocks -; -%macro SHA1_PIPELINED_MAIN_BODY 1 - - REGALLOC - - mov A, [HASH_PTR ] - mov B, [HASH_PTR+ 4] - mov C, [HASH_PTR+ 8] - mov D, [HASH_PTR+12] - - mov E, [HASH_PTR+16] - - %assign i 0 - %rep W_PRECALC_AHEAD - W_PRECALC i - %assign i i+1 - %endrep - - %xdefine F F1 - - %if (%1 == 1) ;; code loops through more than one block - %%_loop: - cmp BUFFER_PTR, K_BASE ;; we use K_BASE value as a signal of a last block, - jne %%_begin ;; it is set below by: cmovae BUFFER_PTR, K_BASE - jmp %%_end - - align 32 - %%_begin: - %endif - RR A,B,C,D,E,0 - RR D,E,A,B,C,2 - RR B,C,D,E,A,4 - RR E,A,B,C,D,6 - RR C,D,E,A,B,8 - - RR A,B,C,D,E,10 - RR D,E,A,B,C,12 - RR B,C,D,E,A,14 - RR E,A,B,C,D,16 - RR C,D,E,A,B,18 - - %xdefine F F2 - - RR A,B,C,D,E,20 - RR D,E,A,B,C,22 - RR B,C,D,E,A,24 - RR E,A,B,C,D,26 - RR C,D,E,A,B,28 - - RR A,B,C,D,E,30 - RR D,E,A,B,C,32 - RR B,C,D,E,A,34 - RR E,A,B,C,D,36 - RR C,D,E,A,B,38 - - %xdefine F F3 - - RR A,B,C,D,E,40 - RR D,E,A,B,C,42 - RR B,C,D,E,A,44 - RR E,A,B,C,D,46 - RR C,D,E,A,B,48 - - RR A,B,C,D,E,50 - RR D,E,A,B,C,52 - RR B,C,D,E,A,54 - RR E,A,B,C,D,56 - RR C,D,E,A,B,58 - - %xdefine F F4 - - %if (%1 == 1) ;; if code loops through more than one block - add BUFFER_PTR, 64 ;; move to next 64-byte block - cmp BUFFER_PTR, BUFFER_END ;; check if current block is the last one - cmovae BUFFER_PTR, K_BASE ;; smart way to signal the last iteration - %else - %xdefine W_NO_TAIL_PRECALC 1 ;; no software pipelining for single block interface - %endif - - RR A,B,C,D,E,60 - RR D,E,A,B,C,62 - RR B,C,D,E,A,64 - RR E,A,B,C,D,66 - RR C,D,E,A,B,68 - - RR A,B,C,D,E,70 - RR D,E,A,B,C,72 - RR B,C,D,E,A,74 - RR E,A,B,C,D,76 - RR C,D,E,A,B,78 - - UPDATE_HASH [HASH_PTR ],A - UPDATE_HASH [HASH_PTR+ 4],B - UPDATE_HASH [HASH_PTR+ 8],C - UPDATE_HASH [HASH_PTR+12],D - UPDATE_HASH [HASH_PTR+16],E - - %if (%1 == 1) - jmp %%_loop - - align 32 - %%_end: - %endif - - - %xdefine W_NO_TAIL_PRECALC 0 - %xdefine F %error - -%endmacro - - -%macro F1 3 - mov T1,%2 - xor T1,%3 - and T1,%1 - xor T1,%3 -%endmacro - -%macro F2 3 - mov T1,%3 - xor T1,%2 - xor T1,%1 -%endmacro - -%macro F3 3 - mov T1,%2 - mov T2,%1 - or T1,%1 - and T2,%2 - and T1,%3 - or T1,T2 -%endmacro - -%define F4 F2 - -%macro UPDATE_HASH 2 - add %2, %1 - mov %1, %2 -%endmacro - - -%macro W_PRECALC 1 - %xdefine i (%1) - - %if (i < 20) - %xdefine K_XMM 0 - %elif (i < 40) - %xdefine K_XMM 16 - %elif (i < 60) - %xdefine K_XMM 32 - %else - %xdefine K_XMM 48 - %endif - - %if (i<16 || (i>=80 && i<(80 + W_PRECALC_AHEAD))) - - %if (W_NO_TAIL_PRECALC == 0) - - %xdefine i ((%1) % 80) ;; pre-compute for the next iteration - - %if (i == 0) - W_PRECALC_RESET - %endif - - - W_PRECALC_00_15 - %endif - - %elif (i < 32) - W_PRECALC_16_31 - %elif (i < 80) ;; rounds 32-79 - W_PRECALC_32_79 - %endif -%endmacro - -%macro W_PRECALC_RESET 0 - %xdefine W W0 - %xdefine W_minus_04 W4 - %xdefine W_minus_08 W8 - %xdefine W_minus_12 W12 - %xdefine W_minus_16 W16 - %xdefine W_minus_20 W20 - %xdefine W_minus_24 W24 - %xdefine W_minus_28 W28 - %xdefine W_minus_32 W -%endmacro - -%macro W_PRECALC_ROTATE 0 - %xdefine W_minus_32 W_minus_28 - %xdefine W_minus_28 W_minus_24 - %xdefine W_minus_24 W_minus_20 - %xdefine W_minus_20 W_minus_16 - %xdefine W_minus_16 W_minus_12 - %xdefine W_minus_12 W_minus_08 - %xdefine W_minus_08 W_minus_04 - %xdefine W_minus_04 W - %xdefine W W_minus_32 -%endmacro - -%xdefine W_PRECALC_AHEAD 16 -%xdefine W_NO_TAIL_PRECALC 0 - - -%xdefine xmm_mov movdqa - -%macro W_PRECALC_00_15 0 - ;; message scheduling pre-compute for rounds 0-15 - %if ((i & 3) == 0) ;; blended SSE and ALU instruction scheduling, 1 vector iteration per 4 rounds - movdqu W_TMP, [BUFFER_PTR + (i * 4)] - %elif ((i & 3) == 1) - pshufb W_TMP, XMM_SHUFB_BSWAP - movdqa W, W_TMP - %elif ((i & 3) == 2) - paddd W_TMP, [K_BASE] - %elif ((i & 3) == 3) - movdqa [WK(i&~3)], W_TMP - - W_PRECALC_ROTATE - %endif -%endmacro - -%macro W_PRECALC_16_31 0 - ;; message scheduling pre-compute for rounds 16-31 - ;; calculating last 32 w[i] values in 8 XMM registers - ;; pre-calculate K+w[i] values and store to mem, for later load by ALU add instruction - ;; - ;; "brute force" vectorization for rounds 16-31 only due to w[i]->w[i-3] dependency - ;; - %if ((i & 3) == 0) ;; blended SSE and ALU instruction scheduling, 1 vector iteration per 4 rounds - movdqa W, W_minus_12 - palignr W, W_minus_16, 8 ;; w[i-14] - movdqa W_TMP, W_minus_04 - psrldq W_TMP, 4 ;; w[i-3] - pxor W, W_minus_08 - %elif ((i & 3) == 1) - pxor W_TMP, W_minus_16 - pxor W, W_TMP - movdqa W_TMP2, W - movdqa W_TMP, W - pslldq W_TMP2, 12 - %elif ((i & 3) == 2) - psrld W, 31 - pslld W_TMP, 1 - por W_TMP, W - movdqa W, W_TMP2 - psrld W_TMP2, 30 - pslld W, 2 - %elif ((i & 3) == 3) - pxor W_TMP, W - pxor W_TMP, W_TMP2 - movdqa W, W_TMP - paddd W_TMP, [K_BASE + K_XMM] - movdqa [WK(i&~3)],W_TMP - - W_PRECALC_ROTATE - %endif -%endmacro - -%macro W_PRECALC_32_79 0 - ;; in SHA-1 specification: w[i] = (w[i-3] ^ w[i-8] ^ w[i-14] ^ w[i-16]) rol 1 - ;; instead we do equal: w[i] = (w[i-6] ^ w[i-16] ^ w[i-28] ^ w[i-32]) rol 2 - ;; allows more efficient vectorization since w[i]=>w[i-3] dependency is broken - ;; - %if ((i & 3) == 0) ;; blended SSE and ALU instruction scheduling, 1 vector iteration per 4 rounds - movdqa W_TMP, W_minus_04 - pxor W, W_minus_28 ;; W is W_minus_32 before xor - palignr W_TMP, W_minus_08, 8 - %elif ((i & 3) == 1) - pxor W, W_minus_16 - pxor W, W_TMP - movdqa W_TMP, W - %elif ((i & 3) == 2) - psrld W, 30 - pslld W_TMP, 2 - por W_TMP, W - %elif ((i & 3) == 3) - movdqa W, W_TMP - paddd W_TMP, [K_BASE + K_XMM] - movdqa [WK(i&~3)],W_TMP - - W_PRECALC_ROTATE - %endif -%endmacro - -%macro RR 6 ;; RR does two rounds of SHA-1 back to back with W pre-calculation - - ;; TEMP = A - ;; A = F( i, B, C, D ) + E + ROTATE_LEFT( A, 5 ) + W[i] + K(i) - ;; C = ROTATE_LEFT( B, 30 ) - ;; D = C - ;; E = D - ;; B = TEMP - - W_PRECALC (%6 + W_PRECALC_AHEAD) - F %2, %3, %4 ;; F returns result in T1 - add %5, [WK(%6)] - rol %2, 30 - mov T2, %1 - add %4, [WK(%6 + 1)] - rol T2, 5 - add %5, T1 - - W_PRECALC (%6 + W_PRECALC_AHEAD + 1) - add T2, %5 - mov %5, T2 - rol T2, 5 - add %4, T2 - F %1, %2, %3 ;; F returns result in T1 - add %4, T1 - rol %1, 30 - -;; write: %1, %2 -;; rotate: %1<=%4, %2<=%5, %3<=%1, %4<=%2, %5<=%3 -%endmacro - - - -;;---------------------- -section .data align=128 - -%xdefine K1 0x5a827999 -%xdefine K2 0x6ed9eba1 -%xdefine K3 0x8f1bbcdc -%xdefine K4 0xca62c1d6 - -align 128 -K_XMM_AR: - DD K1, K1, K1, K1 - DD K2, K2, K2, K2 - DD K3, K3, K3, K3 - DD K4, K4, K4, K4 - -align 16 -bswap_shufb_ctl: - DD 00010203h - DD 04050607h - DD 08090a0bh - DD 0c0d0e0fh - -;; dispatch pointer, points to the init routine for the first invocation -sha1_update_intel_dispatched: - DQ sha1_update_intel_init_ - -;;---------------------- -section .text align=4096 - -SHA1_VECTOR_ASM sha1_update_intel_ssse3_, multiblock - -align 32 -sha1_update_intel_init_: ;; we get here with the first time invocation - call sha1_update_intel_dispacth_init_ -INTEL_SHA1_UPDATE_FUNCNAME: ;; we get here after init - jmp qword [sha1_update_intel_dispatched] - -;; CPUID feature flag based dispatch -sha1_update_intel_dispacth_init_: - push rax - push rbx - push rcx - push rdx - push rsi - - lea rsi, [INTEL_SHA1_UPDATE_DEFAULT_DISPATCH] - - mov eax, 1 - cpuid - - test ecx, 0200h ;; SSSE3 support, CPUID.1.ECX[bit 9] - jz _done - - lea rsi, [sha1_update_intel_ssse3_] - -_done: - mov [sha1_update_intel_dispatched], rsi - - pop rsi - pop rdx - pop rcx - pop rbx - pop rax - ret - -;;---------------------- -;; in the case a default SHA-1 update function implementation was not provided -;; and code was invoked on a non-SSSE3 supporting CPU, dispatch handles this -;; failure in a safest way - jumps to the stub function with UD2 instruction below -sha1_intel_non_ssse3_cpu_stub_: - ud2 ;; in the case no default SHA-1 was provided non-SSSE3 CPUs safely fail here - ret - -; END -;---------------------- diff --git a/pkg/crypto/sha1/sha1_test.go b/pkg/crypto/sha1/sha1_test.go deleted file mode 100644 index f2d090bac..000000000 --- a/pkg/crypto/sha1/sha1_test.go +++ /dev/null @@ -1,138 +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 of -// Golang project: -// https://github.com/golang/go/blob/master/LICENSE - -// Using this part of Minio codebase under the license -// Apache License Version 2.0 with modifications - -// SHA1 hash algorithm. See RFC 3174. - -package sha1 - -import ( - "crypto/rand" - "fmt" - "io" - "testing" -) - -type sha1Test struct { - out string - in string -} - -var golden = []sha1Test{ - {"da39a3ee5e6b4b0d3255bfef95601890afd80709", ""}, - {"86f7e437faa5a7fce15d1ddcb9eaeaea377667b8", "a"}, - {"da23614e02469a0d7c7bd1bdab5c9c474b1904dc", "ab"}, - {"a9993e364706816aba3e25717850c26c9cd0d89d", "abc"}, - {"81fe8bfe87576c3ecb22426f8e57847382917acf", "abcd"}, - {"03de6c570bfe24bfc328ccd7ca46b76eadaf4334", "abcde"}, - {"1f8ac10f23c5b5bc1167bda84b833e5c057a77d2", "abcdef"}, - {"2fb5e13419fc89246865e7a324f476ec624e8740", "abcdefg"}, - {"425af12a0743502b322e93a015bcf868e324d56a", "abcdefgh"}, - {"c63b19f1e4c8b5f76b25c49b8b87f57d8e4872a1", "abcdefghi"}, - {"d68c19a0a345b7eab78d5e11e991c026ec60db63", "abcdefghij"}, - {"ebf81ddcbe5bf13aaabdc4d65354fdf2044f38a7", "Discard medicine more than two years old."}, - {"e5dea09392dd886ca63531aaa00571dc07554bb6", "He who has a shady past knows that nice guys finish last."}, - {"45988f7234467b94e3e9494434c96ee3609d8f8f", "I wouldn't marry him with a ten foot pole."}, - {"55dee037eb7460d5a692d1ce11330b260e40c988", "Free! Free!/A trip/to Mars/for 900/empty jars/Burma Shave"}, - {"b7bc5fb91080c7de6b582ea281f8a396d7c0aee8", "The days of the digital watch are numbered. -Tom Stoppard"}, - {"c3aed9358f7c77f523afe86135f06b95b3999797", "Nepal premier won't resign."}, - {"6e29d302bf6e3a5e4305ff318d983197d6906bb9", "For every action there is an equal and opposite government program."}, - {"597f6a540010f94c15d71806a99a2c8710e747bd", "His money is twice tainted: 'taint yours and 'taint mine."}, - {"6859733b2590a8a091cecf50086febc5ceef1e80", "There is no reason for any individual to have a computer in their home. -Ken Olsen, 1977"}, - {"514b2630ec089b8aee18795fc0cf1f4860cdacad", "It's a tiny change to the code and not completely disgusting. - Bob Manchek"}, - {"c5ca0d4a7b6676fc7aa72caa41cc3d5df567ed69", "size: a.out: bad magic"}, - {"74c51fa9a04eadc8c1bbeaa7fc442f834b90a00a", "The major problem is with sendmail. -Mark Horton"}, - {"0b4c4ce5f52c3ad2821852a8dc00217fa18b8b66", "Give me a rock, paper and scissors and I will move the world. CCFestoon"}, - {"3ae7937dd790315beb0f48330e8642237c61550a", "If the enemy is within range, then so are you."}, - {"410a2b296df92b9a47412b13281df8f830a9f44b", "It's well we cannot hear the screams/That we create in others' dreams."}, - {"841e7c85ca1adcddbdd0187f1289acb5c642f7f5", "You remind me of a TV show, but that's all right: I watch it anyway."}, - {"163173b825d03b952601376b25212df66763e1db", "C is as portable as Stonehedge!!"}, - {"32b0377f2687eb88e22106f133c586ab314d5279", "Even if I could be Shakespeare, I think I should still choose to be Faraday. - A. Huxley"}, - {"0885aaf99b569542fd165fa44e322718f4a984e0", "The fugacity of a constituent in a mixture of gases at a given temperature is proportional to its mole fraction. Lewis-Randall Rule"}, - {"6627d6904d71420b0bf3886ab629623538689f45", "How can you write a big system without C++? -Paul Glick"}, -} - -func TestGolden(t *testing.T) { - for i := 0; i < len(golden); i++ { - g := golden[i] - s := fmt.Sprintf("%x", Sum1([]byte(g.in))) - if s != g.out { - t.Fatalf("Sum function: sha1(%s) = %s want %s", g.in, s, g.out) - } - c := New() - for j := 0; j < 3; j++ { - if j < 2 { - io.WriteString(c, g.in) - } else { - io.WriteString(c, g.in[0:len(g.in)/2]) - c.Sum(nil) - io.WriteString(c, g.in[len(g.in)/2:]) - } - s := fmt.Sprintf("%x", c.Sum(nil)) - if s != g.out { - t.Fatalf("sha1[%d](%s) = %s want %s", j, g.in, s, g.out) - } - c.Reset() - } - } -} - -func TestSize(t *testing.T) { - c := New() - if got := c.Size(); got != Size { - t.Errorf("Size = %d; want %d", got, Size) - } -} - -func TestBlockSize(t *testing.T) { - c := New() - if got := c.BlockSize(); got != BlockSize { - t.Errorf("BlockSize = %d; want %d", got, BlockSize) - } -} - -// Tests that blockGeneric (pure Go) and block (in assembly for amd64, 386, arm) match. -func TestBlockGeneric(t *testing.T) { - gen, asm := New().(*digest), New().(*digest) - buf := make([]byte, BlockSize*20) // arbitrary factor - rand.Read(buf) - blockGeneric(gen, buf) - block(asm, buf) - if *gen != *asm { - t.Error("block and blockGeneric resulted in different states") - } -} - -var bench = New() -var buf = make([]byte, 1024*1024) - -func benchmarkSize(b *testing.B, size int) { - b.SetBytes(int64(size)) - sum := make([]byte, bench.Size()) - for i := 0; i < b.N; i++ { - bench.Reset() - bench.Write(buf[:size]) - bench.Sum(sum[:0]) - } -} - -func BenchmarkHash8Bytes(b *testing.B) { - benchmarkSize(b, 8) -} - -func BenchmarkHash1K(b *testing.B) { - benchmarkSize(b, 1024) -} - -func BenchmarkHash8K(b *testing.B) { - benchmarkSize(b, 8192) -} - -func BenchmarkHash1M(b *testing.B) { - benchmarkSize(b, 1024*1024) -} diff --git a/pkg/crypto/sha1/sha1_windows.go b/pkg/crypto/sha1/sha1_windows.go deleted file mode 100644 index 40a333ec4..000000000 --- a/pkg/crypto/sha1/sha1_windows.go +++ /dev/null @@ -1,167 +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 of -// Golang project: -// https://github.com/golang/go/blob/master/LICENSE - -// Using this part of Minio codebase under the license -// Apache License Version 2.0 with modifications - -// Package sha1 implements the SHA1 hash algorithm as defined in RFC 3174. -package sha1 - -import ( - "hash" - "io" - - "github.com/minio/minio/pkg/cpu" -) - -// The size of a SHA1 checksum in bytes. -const Size = 20 - -// The blocksize of SHA1 in bytes. -const BlockSize = 64 - -const ( - chunk = 64 - init0 = 0x67452301 - init1 = 0xEFCDAB89 - init2 = 0x98BADCFE - init3 = 0x10325476 - init4 = 0xC3D2E1F0 -) - -// digest represents the partial evaluation of a checksum. -type digest struct { - h [5]uint32 - x [chunk]byte - nx int - len uint64 -} - -// Reset digest -func (d *digest) Reset() { - d.h[0] = init0 - d.h[1] = init1 - d.h[2] = init2 - d.h[3] = init3 - d.h[4] = init4 - d.nx = 0 - d.len = 0 -} - -// New returns a new hash.Hash computing the SHA1 checksum. -func New() hash.Hash { - d := new(digest) - d.Reset() - return d -} - -func block(dig *digest, p []byte) { - switch true { - case cpu.HasSSE41() == true: - blockSSE3(dig, p) - default: - blockGeneric(dig, p) - } -} - -// Return output size -func (d *digest) Size() int { return Size } - -// Return checksum blocksize -func (d *digest) BlockSize() int { return BlockSize } - -// Write to digest -func (d *digest) Write(p []byte) (nn int, err error) { - nn = len(p) - d.len += uint64(nn) - if d.nx > 0 { - n := copy(d.x[d.nx:], p) - d.nx += n - if d.nx == chunk { - block(d, d.x[:]) - d.nx = 0 - } - p = p[n:] - } - if len(p) >= chunk { - n := len(p) &^ (chunk - 1) - block(d, p[:n]) - p = p[n:] - } - if len(p) > 0 { - d.nx = copy(d.x[:], p) - } - return -} - -// Return checksum bytes -func (d *digest) Sum(in []byte) []byte { - // Make a copy of d0 so that caller can keep writing and summing. - d0 := *d - hash := d0.checkSum() - return append(in, hash[:]...) -} - -// Intermediate checksum function -func (d *digest) checkSum() [Size]byte { - len := d.len - // Padding. Add a 1 bit and 0 bits until 56 bytes mod 64. - var tmp [64]byte - tmp[0] = 0x80 - if len%64 < 56 { - d.Write(tmp[0 : 56-len%64]) - } else { - d.Write(tmp[0 : 64+56-len%64]) - } - - // Length in bits. - len <<= 3 - for i := uint(0); i < 8; i++ { - tmp[i] = byte(len >> (56 - 8*i)) - } - d.Write(tmp[0:8]) - - if d.nx != 0 { - panic("d.nx != 0") - } - - var digest [Size]byte - for i, s := range d.h { - digest[i*4] = byte(s >> 24) - digest[i*4+1] = byte(s >> 16) - digest[i*4+2] = byte(s >> 8) - digest[i*4+3] = byte(s) - } - - return digest -} - -/// Convenience functions - -// Sum1 - single caller sha1 helper -func Sum1(data []byte) [Size]byte { - var d digest - d.Reset() - d.Write(data) - return d.checkSum() -} - -// Sum - io.Reader based streaming sha1 helper -func Sum(reader io.Reader) ([]byte, error) { - h := New() - var err error - for err == nil { - length := 0 - byteBuffer := make([]byte, 1024*1024) - length, err = reader.Read(byteBuffer) - byteBuffer = byteBuffer[0:length] - h.Write(byteBuffer) - } - if err != io.EOF { - return nil, err - } - return h.Sum(nil), nil -} diff --git a/pkg/crypto/sha1/sha1_yasm_darwin.go b/pkg/crypto/sha1/sha1_yasm_darwin.go deleted file mode 100644 index 78ddc5ad0..000000000 --- a/pkg/crypto/sha1/sha1_yasm_darwin.go +++ /dev/null @@ -1,21 +0,0 @@ -// !build amd64 - -/* - * Minio Cloud Storage, (C) 2014 Minio, 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 sha1 - -//go:generate yasm -f macho64 -DINTEL_SHA1_UPDATE_FUNCNAME=_sha1_update_intel sha1_sse3_amd64.asm -o sha1_sse3_amd64.syso diff --git a/pkg/crypto/sha1/sha1_yasm_linux.go b/pkg/crypto/sha1/sha1_yasm_linux.go deleted file mode 100644 index 708e1d49d..000000000 --- a/pkg/crypto/sha1/sha1_yasm_linux.go +++ /dev/null @@ -1,21 +0,0 @@ -// !build amd64 - -/* - * Minio Cloud Storage, (C) 2014 Minio, 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 sha1 - -//go:generate yasm -f elf64 sha1_sse3_amd64.asm -o sha1_sse3_amd64.syso diff --git a/pkg/crypto/sha1/sha1_yasm_windows.go b/pkg/crypto/sha1/sha1_yasm_windows.go deleted file mode 100644 index 770e71a44..000000000 --- a/pkg/crypto/sha1/sha1_yasm_windows.go +++ /dev/null @@ -1,21 +0,0 @@ -// !build amd64 - -/* - * Minio Cloud Storage, (C) 2014 Minio, 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 sha1 - -//go:generate yasm -f win64 -DWIN_ABI=1 sha1_sse3_amd64.asm -o sha1_sse3_amd64.syso diff --git a/pkg/crypto/sha1/sha1block_darwin.go b/pkg/crypto/sha1/sha1block_darwin.go deleted file mode 100644 index cb268e9ae..000000000 --- a/pkg/crypto/sha1/sha1block_darwin.go +++ /dev/null @@ -1,29 +0,0 @@ -// +build amd64 - -/* - * Minio Cloud Storage, (C) 2014 Minio, 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 sha1 - -// #include -// #include -// void sha1_update_intel(int32_t *hash, const char* input, size_t num_blocks); -import "C" -import "unsafe" - -func blockSSE3(dig *digest, p []byte) { - C.sha1_update_intel((*C.int32_t)(unsafe.Pointer(&dig.h[0])), (*C.char)(unsafe.Pointer(&p[0])), (C.size_t)(len(p)/chunk)) -} diff --git a/pkg/crypto/sha1/sha1block_generic.go b/pkg/crypto/sha1/sha1block_generic.go deleted file mode 100644 index ddc64e946..000000000 --- a/pkg/crypto/sha1/sha1block_generic.go +++ /dev/null @@ -1,96 +0,0 @@ -// +build amd64 - -// 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 of -// Golang project: -// https://github.com/golang/go/blob/master/LICENSE - -// Using this part of Minio codebase under the license -// Apache License Version 2.0 with modifications - -package sha1 - -const ( - _K0 = 0x5A827999 - _K1 = 0x6ED9EBA1 - _K2 = 0x8F1BBCDC - _K3 = 0xCA62C1D6 -) - -// blockGeneric is a portable, pure Go version of the SHA1 block step. -// It's used by sha1block_generic.go and tests. -func blockGeneric(dig *digest, p []byte) { - var w [16]uint32 - - h0, h1, h2, h3, h4 := dig.h[0], dig.h[1], dig.h[2], dig.h[3], dig.h[4] - for len(p) >= chunk { - // Can interlace the computation of w with the - // rounds below if needed for speed. - for i := 0; i < 16; i++ { - j := i * 4 - w[i] = uint32(p[j])<<24 | uint32(p[j+1])<<16 | uint32(p[j+2])<<8 | uint32(p[j+3]) - } - - a, b, c, d, e := h0, h1, h2, h3, h4 - - // Each of the four 20-iteration rounds - // differs only in the computation of f and - // the choice of K (_K0, _K1, etc). - i := 0 - for ; i < 16; i++ { - f := b&c | (^b)&d - a5 := a<<5 | a>>(32-5) - b30 := b<<30 | b>>(32-30) - t := a5 + f + e + w[i&0xf] + _K0 - a, b, c, d, e = t, a, b30, c, d - } - for ; i < 20; i++ { - tmp := w[(i-3)&0xf] ^ w[(i-8)&0xf] ^ w[(i-14)&0xf] ^ w[(i)&0xf] - w[i&0xf] = tmp<<1 | tmp>>(32-1) - - f := b&c | (^b)&d - a5 := a<<5 | a>>(32-5) - b30 := b<<30 | b>>(32-30) - t := a5 + f + e + w[i&0xf] + _K0 - a, b, c, d, e = t, a, b30, c, d - } - for ; i < 40; i++ { - tmp := w[(i-3)&0xf] ^ w[(i-8)&0xf] ^ w[(i-14)&0xf] ^ w[(i)&0xf] - w[i&0xf] = tmp<<1 | tmp>>(32-1) - f := b ^ c ^ d - a5 := a<<5 | a>>(32-5) - b30 := b<<30 | b>>(32-30) - t := a5 + f + e + w[i&0xf] + _K1 - a, b, c, d, e = t, a, b30, c, d - } - for ; i < 60; i++ { - tmp := w[(i-3)&0xf] ^ w[(i-8)&0xf] ^ w[(i-14)&0xf] ^ w[(i)&0xf] - w[i&0xf] = tmp<<1 | tmp>>(32-1) - f := ((b | c) & d) | (b & c) - - a5 := a<<5 | a>>(32-5) - b30 := b<<30 | b>>(32-30) - t := a5 + f + e + w[i&0xf] + _K2 - a, b, c, d, e = t, a, b30, c, d - } - for ; i < 80; i++ { - tmp := w[(i-3)&0xf] ^ w[(i-8)&0xf] ^ w[(i-14)&0xf] ^ w[(i)&0xf] - w[i&0xf] = tmp<<1 | tmp>>(32-1) - f := b ^ c ^ d - a5 := a<<5 | a>>(32-5) - b30 := b<<30 | b>>(32-30) - t := a5 + f + e + w[i&0xf] + _K3 - a, b, c, d, e = t, a, b30, c, d - } - - h0 += a - h1 += b - h2 += c - h3 += d - h4 += e - - p = p[chunk:] - } - dig.h[0], dig.h[1], dig.h[2], dig.h[3], dig.h[4] = h0, h1, h2, h3, h4 -} diff --git a/pkg/crypto/sha1/sha1block_linux.go b/pkg/crypto/sha1/sha1block_linux.go deleted file mode 100644 index 346093ff7..000000000 --- a/pkg/crypto/sha1/sha1block_linux.go +++ /dev/null @@ -1,35 +0,0 @@ -// +build amd64 - -/* - * Minio Cloud Storage, (C) 2014 Minio, 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 sha1 - -// #cgo CFLAGS: -DHAS_AVX2 -// #include -// #include -// void sha1_transform(int32_t *hash, const char* input, size_t num_blocks); -// void sha1_update_intel(int32_t *hash, const char* input, size_t num_blocks); -import "C" -import "unsafe" - -func blockAVX2(dig *digest, p []byte) { - C.sha1_transform((*C.int32_t)(unsafe.Pointer(&dig.h[0])), (*C.char)(unsafe.Pointer(&p[0])), (C.size_t)(len(p)/chunk)) -} - -func blockSSE3(dig *digest, p []byte) { - C.sha1_update_intel((*C.int32_t)(unsafe.Pointer(&dig.h[0])), (*C.char)(unsafe.Pointer(&p[0])), (C.size_t)(len(p)/chunk)) -} diff --git a/pkg/crypto/sha1/sha1block_windows.go b/pkg/crypto/sha1/sha1block_windows.go deleted file mode 100644 index cb268e9ae..000000000 --- a/pkg/crypto/sha1/sha1block_windows.go +++ /dev/null @@ -1,29 +0,0 @@ -// +build amd64 - -/* - * Minio Cloud Storage, (C) 2014 Minio, 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 sha1 - -// #include -// #include -// void sha1_update_intel(int32_t *hash, const char* input, size_t num_blocks); -import "C" -import "unsafe" - -func blockSSE3(dig *digest, p []byte) { - C.sha1_update_intel((*C.int32_t)(unsafe.Pointer(&dig.h[0])), (*C.char)(unsafe.Pointer(&p[0])), (C.size_t)(len(p)/chunk)) -} diff --git a/pkg/crypto/sha512/LICENSE b/pkg/crypto/sha512/LICENSE deleted file mode 100644 index d64569567..000000000 --- a/pkg/crypto/sha512/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - 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/pkg/donut/LICENSE b/pkg/donut/LICENSE deleted file mode 100644 index d64569567..000000000 --- a/pkg/donut/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - 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/pkg/donut/README.md b/pkg/donut/README.md deleted file mode 100644 index 9d977f173..000000000 --- a/pkg/donut/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Donut - -donut - Donut (do not delete) on disk format implementation released under [Apache license v2](./LICENSE). diff --git a/pkg/donut/acl.go b/pkg/donut/acl.go deleted file mode 100644 index cc62cae9b..000000000 --- a/pkg/donut/acl.go +++ /dev/null @@ -1,47 +0,0 @@ -package donut - -// BucketACL - bucket level access control -type BucketACL string - -// different types of ACL's currently supported for buckets -const ( - BucketPrivate = BucketACL("private") - BucketPublicRead = BucketACL("public-read") - BucketPublicReadWrite = BucketACL("public-read-write") -) - -func (b BucketACL) String() string { - return string(b) -} - -// IsPrivate - is acl Private -func (b BucketACL) IsPrivate() bool { - return b == BucketACL("private") -} - -// IsPublicRead - is acl PublicRead -func (b BucketACL) IsPublicRead() bool { - return b == BucketACL("public-read") -} - -// IsPublicReadWrite - is acl PublicReadWrite -func (b BucketACL) IsPublicReadWrite() bool { - return b == BucketACL("public-read-write") -} - -// IsValidBucketACL - is provided acl string supported -func IsValidBucketACL(acl string) bool { - switch acl { - case "private": - fallthrough - case "public-read": - fallthrough - case "public-read-write": - return true - case "": - // by default its "private" - return true - default: - return false - } -} diff --git a/pkg/donut/bucket.go b/pkg/donut/bucket.go deleted file mode 100644 index be446b36d..000000000 --- a/pkg/donut/bucket.go +++ /dev/null @@ -1,639 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 donut - -import ( - "bytes" - "fmt" - "hash" - "io" - "path/filepath" - "sort" - "strings" - "sync" - "time" - - "crypto/md5" - "encoding/hex" - "encoding/json" - - "github.com/minio/minio/pkg/crypto/sha256" - "github.com/minio/minio/pkg/crypto/sha512" - "github.com/minio/minio/pkg/donut/disk" - "github.com/minio/minio/pkg/probe" - signv4 "github.com/minio/minio/pkg/signature" -) - -const ( - blockSize = 10 * 1024 * 1024 -) - -// internal struct carrying bucket specific information -type bucket struct { - name string - acl string - time time.Time - donutName string - nodes map[string]node - lock *sync.Mutex -} - -// newBucket - instantiate a new bucket -func newBucket(bucketName, aclType, donutName string, nodes map[string]node) (bucket, BucketMetadata, *probe.Error) { - if strings.TrimSpace(bucketName) == "" || strings.TrimSpace(donutName) == "" { - return bucket{}, BucketMetadata{}, probe.NewError(InvalidArgument{}) - } - - b := bucket{} - t := time.Now().UTC() - b.name = bucketName - b.acl = aclType - b.time = t - b.donutName = donutName - b.nodes = nodes - b.lock = new(sync.Mutex) - - metadata := BucketMetadata{} - metadata.Version = bucketMetadataVersion - metadata.Name = bucketName - metadata.ACL = BucketACL(aclType) - metadata.Created = t - metadata.Metadata = make(map[string]string) - metadata.BucketObjects = make(map[string]struct{}) - - return b, metadata, nil -} - -// getBucketName - -func (b bucket) getBucketName() string { - return b.name -} - -// getBucketMetadataReaders - -func (b bucket) getBucketMetadataReaders() (map[int]io.ReadCloser, *probe.Error) { - readers := make(map[int]io.ReadCloser) - var disks map[int]disk.Disk - var err *probe.Error - for _, node := range b.nodes { - disks, err = node.ListDisks() - if err != nil { - return nil, err.Trace() - } - } - var bucketMetaDataReader io.ReadCloser - for order, disk := range disks { - bucketMetaDataReader, err = disk.Open(filepath.Join(b.donutName, bucketMetadataConfig)) - if err != nil { - continue - } - readers[order] = bucketMetaDataReader - } - if err != nil { - return nil, err.Trace() - } - return readers, nil -} - -// getBucketMetadata - -func (b bucket) getBucketMetadata() (*AllBuckets, *probe.Error) { - metadata := new(AllBuckets) - var readers map[int]io.ReadCloser - { - var err *probe.Error - readers, err = b.getBucketMetadataReaders() - if err != nil { - return nil, err.Trace() - } - } - for _, reader := range readers { - defer reader.Close() - } - var err error - for _, reader := range readers { - jenc := json.NewDecoder(reader) - if err = jenc.Decode(metadata); err == nil { - return metadata, nil - } - } - return nil, probe.NewError(err) -} - -// GetObjectMetadata - get metadata for an object -func (b bucket) GetObjectMetadata(objectName string) (ObjectMetadata, *probe.Error) { - b.lock.Lock() - defer b.lock.Unlock() - return b.readObjectMetadata(normalizeObjectName(objectName)) -} - -// ListObjects - list all objects -func (b bucket) ListObjects(prefix, marker, delimiter string, maxkeys int) (ListObjectsResults, *probe.Error) { - b.lock.Lock() - defer b.lock.Unlock() - if maxkeys <= 0 { - maxkeys = 1000 - } - var isTruncated bool - var objects []string - bucketMetadata, err := b.getBucketMetadata() - if err != nil { - return ListObjectsResults{}, err.Trace() - } - for objectName := range bucketMetadata.Buckets[b.getBucketName()].Multiparts { - if strings.HasPrefix(objectName, strings.TrimSpace(prefix)) { - if objectName > marker { - objects = append(objects, objectName) - } - } - } - for objectName := range bucketMetadata.Buckets[b.getBucketName()].BucketObjects { - if strings.HasPrefix(objectName, strings.TrimSpace(prefix)) { - if objectName > marker { - objects = append(objects, objectName) - } - } - } - if strings.TrimSpace(prefix) != "" { - objects = TrimPrefix(objects, prefix) - } - var prefixes []string - var filteredObjects []string - filteredObjects = objects - if strings.TrimSpace(delimiter) != "" { - filteredObjects = HasNoDelimiter(objects, delimiter) - prefixes = HasDelimiter(objects, delimiter) - prefixes = SplitDelimiter(prefixes, delimiter) - prefixes = SortUnique(prefixes) - } - var results []string - var commonPrefixes []string - - for _, commonPrefix := range prefixes { - commonPrefixes = append(commonPrefixes, prefix+commonPrefix) - } - filteredObjects = RemoveDuplicates(filteredObjects) - sort.Strings(filteredObjects) - for _, objectName := range filteredObjects { - if len(results) >= maxkeys { - isTruncated = true - break - } - results = append(results, prefix+objectName) - } - results = RemoveDuplicates(results) - commonPrefixes = RemoveDuplicates(commonPrefixes) - sort.Strings(commonPrefixes) - - listObjects := ListObjectsResults{} - listObjects.Objects = make(map[string]ObjectMetadata) - listObjects.CommonPrefixes = commonPrefixes - listObjects.IsTruncated = isTruncated - - for _, objectName := range results { - objMetadata, err := b.readObjectMetadata(normalizeObjectName(objectName)) - if err != nil { - return ListObjectsResults{}, err.Trace() - } - listObjects.Objects[objectName] = objMetadata - } - return listObjects, nil -} - -// ReadObject - open an object to read -func (b bucket) ReadObject(objectName string) (reader io.ReadCloser, size int64, err *probe.Error) { - b.lock.Lock() - defer b.lock.Unlock() - reader, writer := io.Pipe() - // get list of objects - bucketMetadata, err := b.getBucketMetadata() - if err != nil { - return nil, 0, err.Trace() - } - // check if object exists - if _, ok := bucketMetadata.Buckets[b.getBucketName()].BucketObjects[objectName]; !ok { - return nil, 0, probe.NewError(ObjectNotFound{Object: objectName}) - } - objMetadata, err := b.readObjectMetadata(normalizeObjectName(objectName)) - if err != nil { - return nil, 0, err.Trace() - } - // read and reply back to GetObject() request in a go-routine - go b.readObjectData(normalizeObjectName(objectName), writer, objMetadata) - return reader, objMetadata.Size, nil -} - -// WriteObject - write a new object into bucket -func (b bucket) WriteObject(objectName string, objectData io.Reader, size int64, expectedMD5Sum string, metadata map[string]string, signature *signv4.Signature) (ObjectMetadata, *probe.Error) { - b.lock.Lock() - defer b.lock.Unlock() - if objectName == "" || objectData == nil { - return ObjectMetadata{}, probe.NewError(InvalidArgument{}) - } - writers, err := b.getObjectWriters(normalizeObjectName(objectName), "data") - if err != nil { - return ObjectMetadata{}, err.Trace() - } - sumMD5 := md5.New() - sum512 := sha512.New() - var sum256 hash.Hash - var mwriter io.Writer - - if signature != nil { - sum256 = sha256.New() - mwriter = io.MultiWriter(sumMD5, sum256, sum512) - } else { - mwriter = io.MultiWriter(sumMD5, sum512) - } - objMetadata := ObjectMetadata{} - objMetadata.Version = objectMetadataVersion - objMetadata.Created = time.Now().UTC() - // if total writers are only '1' do not compute erasure - switch len(writers) == 1 { - case true: - mw := io.MultiWriter(writers[0], mwriter) - totalLength, err := io.Copy(mw, objectData) - if err != nil { - CleanupWritersOnError(writers) - return ObjectMetadata{}, probe.NewError(err) - } - objMetadata.Size = totalLength - case false: - // calculate data and parity dictated by total number of writers - k, m, err := b.getDataAndParity(len(writers)) - if err != nil { - CleanupWritersOnError(writers) - return ObjectMetadata{}, err.Trace() - } - // write encoded data with k, m and writers - chunkCount, totalLength, err := b.writeObjectData(k, m, writers, objectData, size, mwriter) - if err != nil { - CleanupWritersOnError(writers) - return ObjectMetadata{}, err.Trace() - } - /// donutMetadata section - objMetadata.BlockSize = blockSize - objMetadata.ChunkCount = chunkCount - objMetadata.DataDisks = k - objMetadata.ParityDisks = m - objMetadata.Size = int64(totalLength) - } - objMetadata.Bucket = b.getBucketName() - objMetadata.Object = objectName - dataMD5sum := sumMD5.Sum(nil) - dataSHA512sum := sum512.Sum(nil) - if signature != nil { - ok, err := signature.DoesSignatureMatch(hex.EncodeToString(sum256.Sum(nil))) - if err != nil { - // error occurred while doing signature calculation, we return and also cleanup any temporary writers. - CleanupWritersOnError(writers) - return ObjectMetadata{}, err.Trace() - } - if !ok { - // purge all writers, when control flow reaches here - // - // Signature mismatch occurred all temp files to be removed and all data purged. - CleanupWritersOnError(writers) - return ObjectMetadata{}, probe.NewError(signv4.DoesNotMatch{}) - } - } - objMetadata.MD5Sum = hex.EncodeToString(dataMD5sum) - objMetadata.SHA512Sum = hex.EncodeToString(dataSHA512sum) - - // Verify if the written object is equal to what is expected, only if it is requested as such - if strings.TrimSpace(expectedMD5Sum) != "" { - if err := b.isMD5SumEqual(strings.TrimSpace(expectedMD5Sum), objMetadata.MD5Sum); err != nil { - return ObjectMetadata{}, err.Trace() - } - } - objMetadata.Metadata = metadata - // write object specific metadata - if err := b.writeObjectMetadata(normalizeObjectName(objectName), objMetadata); err != nil { - // purge all writers, when control flow reaches here - CleanupWritersOnError(writers) - return ObjectMetadata{}, err.Trace() - } - // close all writers, when control flow reaches here - for _, writer := range writers { - writer.Close() - } - return objMetadata, nil -} - -// isMD5SumEqual - returns error if md5sum mismatches, other its `nil` -func (b bucket) isMD5SumEqual(expectedMD5Sum, actualMD5Sum string) *probe.Error { - if strings.TrimSpace(expectedMD5Sum) != "" && strings.TrimSpace(actualMD5Sum) != "" { - expectedMD5SumBytes, err := hex.DecodeString(expectedMD5Sum) - if err != nil { - return probe.NewError(err) - } - actualMD5SumBytes, err := hex.DecodeString(actualMD5Sum) - if err != nil { - return probe.NewError(err) - } - if !bytes.Equal(expectedMD5SumBytes, actualMD5SumBytes) { - return probe.NewError(BadDigest{}) - } - return nil - } - return probe.NewError(InvalidArgument{}) -} - -// writeObjectMetadata - write additional object metadata -func (b bucket) writeObjectMetadata(objectName string, objMetadata ObjectMetadata) *probe.Error { - if objMetadata.Object == "" { - return probe.NewError(InvalidArgument{}) - } - objMetadataWriters, err := b.getObjectWriters(objectName, objectMetadataConfig) - if err != nil { - return err.Trace() - } - for _, objMetadataWriter := range objMetadataWriters { - jenc := json.NewEncoder(objMetadataWriter) - if err := jenc.Encode(&objMetadata); err != nil { - // Close writers and purge all temporary entries - CleanupWritersOnError(objMetadataWriters) - return probe.NewError(err) - } - } - for _, objMetadataWriter := range objMetadataWriters { - objMetadataWriter.Close() - } - return nil -} - -// readObjectMetadata - read object metadata -func (b bucket) readObjectMetadata(objectName string) (ObjectMetadata, *probe.Error) { - if objectName == "" { - return ObjectMetadata{}, probe.NewError(InvalidArgument{}) - } - objMetadata := ObjectMetadata{} - objMetadataReaders, err := b.getObjectReaders(objectName, objectMetadataConfig) - if err != nil { - return ObjectMetadata{}, err.Trace() - } - for _, objMetadataReader := range objMetadataReaders { - defer objMetadataReader.Close() - } - { - var err error - for _, objMetadataReader := range objMetadataReaders { - jdec := json.NewDecoder(objMetadataReader) - if err = jdec.Decode(&objMetadata); err == nil { - return objMetadata, nil - } - } - return ObjectMetadata{}, probe.NewError(err) - } -} - -// TODO - This a temporary normalization of objectNames, need to find a better way -// -// normalizedObjectName - all objectNames with "/" get normalized to a simple objectName -// -// example: -// user provided value - "this/is/my/deep/directory/structure" -// donut normalized value - "this-is-my-deep-directory-structure" -// -func normalizeObjectName(objectName string) string { - // replace every '/' with '-' - return strings.Replace(objectName, "/", "-", -1) -} - -// getDataAndParity - calculate k, m (data and parity) values from number of disks -func (b bucket) getDataAndParity(totalWriters int) (k uint8, m uint8, err *probe.Error) { - if totalWriters <= 1 { - return 0, 0, probe.NewError(InvalidArgument{}) - } - quotient := totalWriters / 2 // not using float or abs to let integer round off to lower value - // quotient cannot be bigger than (255 / 2) = 127 - if quotient > 127 { - return 0, 0, probe.NewError(ParityOverflow{}) - } - remainder := totalWriters % 2 // will be 1 for odd and 0 for even numbers - k = uint8(quotient + remainder) - m = uint8(quotient) - return k, m, nil -} - -// writeObjectData - -func (b bucket) writeObjectData(k, m uint8, writers []io.WriteCloser, objectData io.Reader, size int64, hashWriter io.Writer) (int, int, *probe.Error) { - encoder, err := newEncoder(k, m) - if err != nil { - return 0, 0, err.Trace() - } - chunkSize := int64(10 * 1024 * 1024) - chunkCount := 0 - totalLength := 0 - - var e error - for e == nil { - var length int - inputData := make([]byte, chunkSize) - length, e = objectData.Read(inputData) - if length != 0 { - encodedBlocks, err := encoder.Encode(inputData[0:length]) - if err != nil { - return 0, 0, err.Trace() - } - if _, err := hashWriter.Write(inputData[0:length]); err != nil { - return 0, 0, probe.NewError(err) - } - for blockIndex, block := range encodedBlocks { - errCh := make(chan error, 1) - go func(writer io.Writer, reader io.Reader, errCh chan<- error) { - defer close(errCh) - _, err := io.Copy(writer, reader) - errCh <- err - }(writers[blockIndex], bytes.NewReader(block), errCh) - if err := <-errCh; err != nil { - // Returning error is fine here CleanupErrors() would cleanup writers - return 0, 0, probe.NewError(err) - } - } - totalLength += length - chunkCount = chunkCount + 1 - } - } - if e != io.EOF { - return 0, 0, probe.NewError(e) - } - return chunkCount, totalLength, nil -} - -// readObjectData - -func (b bucket) readObjectData(objectName string, writer *io.PipeWriter, objMetadata ObjectMetadata) { - readers, err := b.getObjectReaders(objectName, "data") - if err != nil { - writer.CloseWithError(probe.WrapError(err)) - return - } - for _, reader := range readers { - defer reader.Close() - } - var expected512Sum, expectedMd5sum []byte - { - var err error - expectedMd5sum, err = hex.DecodeString(objMetadata.MD5Sum) - if err != nil { - writer.CloseWithError(probe.WrapError(probe.NewError(err))) - return - } - expected512Sum, err = hex.DecodeString(objMetadata.SHA512Sum) - if err != nil { - writer.CloseWithError(probe.WrapError(probe.NewError(err))) - return - } - } - hasher := md5.New() - sum512hasher := sha256.New() - mwriter := io.MultiWriter(writer, hasher, sum512hasher) - switch len(readers) > 1 { - case true: - encoder, err := newEncoder(objMetadata.DataDisks, objMetadata.ParityDisks) - if err != nil { - writer.CloseWithError(probe.WrapError(err)) - return - } - totalLeft := objMetadata.Size - for i := 0; i < objMetadata.ChunkCount; i++ { - decodedData, err := b.decodeEncodedData(totalLeft, int64(objMetadata.BlockSize), readers, encoder, writer) - if err != nil { - writer.CloseWithError(probe.WrapError(err)) - return - } - if _, err := io.Copy(mwriter, bytes.NewReader(decodedData)); err != nil { - writer.CloseWithError(probe.WrapError(probe.NewError(err))) - return - } - totalLeft = totalLeft - int64(objMetadata.BlockSize) - } - case false: - _, err := io.Copy(writer, readers[0]) - if err != nil { - writer.CloseWithError(probe.WrapError(probe.NewError(err))) - return - } - } - // check if decodedData md5sum matches - if !bytes.Equal(expectedMd5sum, hasher.Sum(nil)) { - writer.CloseWithError(probe.WrapError(probe.NewError(ChecksumMismatch{}))) - return - } - if !bytes.Equal(expected512Sum, sum512hasher.Sum(nil)) { - writer.CloseWithError(probe.WrapError(probe.NewError(ChecksumMismatch{}))) - return - } - writer.Close() - return -} - -// decodeEncodedData - -func (b bucket) decodeEncodedData(totalLeft, blockSize int64, readers map[int]io.ReadCloser, encoder encoder, writer *io.PipeWriter) ([]byte, *probe.Error) { - var curBlockSize int64 - if blockSize < totalLeft { - curBlockSize = blockSize - } else { - curBlockSize = totalLeft - } - curChunkSize, err := encoder.GetEncodedBlockLen(int(curBlockSize)) - if err != nil { - return nil, err.Trace() - } - encodedBytes := make([][]byte, encoder.k+encoder.m) - errCh := make(chan error, len(readers)) - var errRet error - var readCnt int - - for i, reader := range readers { - go func(reader io.Reader, i int) { - encodedBytes[i] = make([]byte, curChunkSize) - _, err := io.ReadFull(reader, encodedBytes[i]) - if err != nil { - encodedBytes[i] = nil - errCh <- err - return - } - errCh <- nil - }(reader, i) - // read through errCh for any errors - err := <-errCh - if err != nil { - errRet = err - } else { - readCnt++ - } - } - if readCnt < int(encoder.k) { - return nil, probe.NewError(errRet) - } - decodedData, err := encoder.Decode(encodedBytes, int(curBlockSize)) - if err != nil { - return nil, err.Trace() - } - return decodedData, nil -} - -// getObjectReaders - -func (b bucket) getObjectReaders(objectName, objectMeta string) (map[int]io.ReadCloser, *probe.Error) { - readers := make(map[int]io.ReadCloser) - var disks map[int]disk.Disk - var err *probe.Error - nodeSlice := 0 - for _, node := range b.nodes { - disks, err = node.ListDisks() - if err != nil { - return nil, err.Trace() - } - for order, disk := range disks { - var objectSlice io.ReadCloser - bucketSlice := fmt.Sprintf("%s$%d$%d", b.name, nodeSlice, order) - objectPath := filepath.Join(b.donutName, bucketSlice, objectName, objectMeta) - objectSlice, err = disk.Open(objectPath) - if err == nil { - readers[order] = objectSlice - } - } - nodeSlice = nodeSlice + 1 - } - if err != nil { - return nil, err.Trace() - } - return readers, nil -} - -// getObjectWriters - -func (b bucket) getObjectWriters(objectName, objectMeta string) ([]io.WriteCloser, *probe.Error) { - var writers []io.WriteCloser - nodeSlice := 0 - for _, node := range b.nodes { - disks, err := node.ListDisks() - if err != nil { - return nil, err.Trace() - } - writers = make([]io.WriteCloser, len(disks)) - for order, disk := range disks { - bucketSlice := fmt.Sprintf("%s$%d$%d", b.name, nodeSlice, order) - objectPath := filepath.Join(b.donutName, bucketSlice, objectName, objectMeta) - objectSlice, err := disk.CreateFile(objectPath) - if err != nil { - return nil, err.Trace() - } - writers[order] = objectSlice - } - nodeSlice = nodeSlice + 1 - } - return writers, nil -} diff --git a/pkg/donut/cache/data/data.go b/pkg/donut/cache/data/data.go deleted file mode 100644 index 56ccdd14c..000000000 --- a/pkg/donut/cache/data/data.go +++ /dev/null @@ -1,204 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 data implements in memory caching methods for data -package data - -import ( - "container/list" - "sync" - "time" -) - -var noExpiration = time.Duration(0) - -// Cache holds the required variables to compose an in memory cache system -// which also provides expiring key mechanism and also maxSize -type Cache struct { - // Mutex is used for handling the concurrent - // read/write requests for cache - sync.Mutex - - // items hold the cached objects - items *list.List - - // reverseItems holds the time that related item's updated at - reverseItems map[interface{}]*list.Element - - // maxSize is a total size for overall cache - maxSize uint64 - - // currentSize is a current size in memory - currentSize uint64 - - // OnEvicted - callback function for eviction - OnEvicted func(a ...interface{}) - - // totalEvicted counter to keep track of total expirations - totalEvicted int -} - -// Stats current cache statistics -type Stats struct { - Bytes uint64 - Items int - Evicted int -} - -type element struct { - key interface{} - value []byte -} - -// NewCache creates an inmemory cache -// -// maxSize is used for expiring objects before we run out of memory -// expiration is used for expiration of a key from cache -func NewCache(maxSize uint64) *Cache { - return &Cache{ - items: list.New(), - reverseItems: make(map[interface{}]*list.Element), - maxSize: maxSize, - } -} - -// SetMaxSize set a new max size -func (r *Cache) SetMaxSize(maxSize uint64) { - r.Lock() - defer r.Unlock() - r.maxSize = maxSize - return -} - -// Stats get current cache statistics -func (r *Cache) Stats() Stats { - return Stats{ - Bytes: r.currentSize, - Items: r.items.Len(), - Evicted: r.totalEvicted, - } -} - -// Get returns a value of a given key if it exists -func (r *Cache) Get(key interface{}) ([]byte, bool) { - r.Lock() - defer r.Unlock() - ele, hit := r.reverseItems[key] - if !hit { - return nil, false - } - r.items.MoveToFront(ele) - return ele.Value.(*element).value, true -} - -// Len returns length of the value of a given key, returns zero if key doesn't exist -func (r *Cache) Len(key interface{}) int { - r.Lock() - defer r.Unlock() - _, ok := r.reverseItems[key] - if !ok { - return 0 - } - return len(r.reverseItems[key].Value.(*element).value) -} - -// Append will append new data to an existing key, -// if key doesn't exist it behaves like Set() -func (r *Cache) Append(key interface{}, value []byte) bool { - r.Lock() - defer r.Unlock() - valueLen := uint64(len(value)) - if r.maxSize > 0 { - // check if the size of the object is not bigger than the - // capacity of the cache - if valueLen > r.maxSize { - return false - } - // remove random key if only we reach the maxSize threshold - for (r.currentSize + valueLen) > r.maxSize { - r.doDeleteOldest() - break - } - } - ele, hit := r.reverseItems[key] - if !hit { - ele := r.items.PushFront(&element{key, value}) - r.currentSize += valueLen - r.reverseItems[key] = ele - return true - } - r.items.MoveToFront(ele) - r.currentSize += valueLen - ele.Value.(*element).value = append(ele.Value.(*element).value, value...) - return true -} - -// Set will persist a value to the cache -func (r *Cache) Set(key interface{}, value []byte) bool { - r.Lock() - defer r.Unlock() - valueLen := uint64(len(value)) - if r.maxSize > 0 { - // check if the size of the object is not bigger than the - // capacity of the cache - if valueLen > r.maxSize { - return false - } - // remove random key if only we reach the maxSize threshold - for (r.currentSize + valueLen) > r.maxSize { - r.doDeleteOldest() - } - } - if _, hit := r.reverseItems[key]; hit { - return false - } - ele := r.items.PushFront(&element{key, value}) - r.currentSize += valueLen - r.reverseItems[key] = ele - return true -} - -// Delete deletes a given key if exists -func (r *Cache) Delete(key interface{}) { - r.Lock() - defer r.Unlock() - ele, ok := r.reverseItems[key] - if !ok { - return - } - if ele != nil { - r.currentSize -= uint64(len(r.reverseItems[key].Value.(*element).value)) - r.items.Remove(ele) - delete(r.reverseItems, key) - r.totalEvicted++ - if r.OnEvicted != nil { - r.OnEvicted(key) - } - } -} - -func (r *Cache) doDeleteOldest() { - ele := r.items.Back() - if ele != nil { - r.currentSize -= uint64(len(r.reverseItems[ele.Value.(*element).key].Value.(*element).value)) - delete(r.reverseItems, ele.Value.(*element).key) - r.items.Remove(ele) - r.totalEvicted++ - if r.OnEvicted != nil { - r.OnEvicted(ele.Value.(*element).key) - } - } -} diff --git a/pkg/donut/cache/data/data_test.go b/pkg/donut/cache/data/data_test.go deleted file mode 100644 index 71327f69b..000000000 --- a/pkg/donut/cache/data/data_test.go +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 data - -import ( - "testing" - - . "gopkg.in/check.v1" -) - -func Test(t *testing.T) { TestingT(t) } - -type MySuite struct{} - -var _ = Suite(&MySuite{}) - -func (s *MySuite) TestCache(c *C) { - cache := NewCache(1000) - data := []byte("Hello, world!") - ok := cache.Set("filename", data) - - c.Assert(ok, Equals, true) - storedata, ok := cache.Get("filename") - - c.Assert(ok, Equals, true) - c.Assert(data, DeepEquals, storedata) - - cache.Delete("filename") - _, ok = cache.Get("filename") - c.Assert(ok, Equals, false) -} diff --git a/pkg/donut/cache/metadata/metadata.go b/pkg/donut/cache/metadata/metadata.go deleted file mode 100644 index 8b2d6cce2..000000000 --- a/pkg/donut/cache/metadata/metadata.go +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 metadata implements in memory caching methods for metadata information -package metadata - -import ( - "sync" - "time" -) - -var noExpiration = time.Duration(0) - -// Cache holds the required variables to compose an in memory cache system -// which also provides expiring key mechanism and also maxSize -type Cache struct { - // Mutex is used for handling the concurrent - // read/write requests for cache - sync.Mutex - - // items hold the cached objects - items map[string]interface{} - - // updatedAt holds the time that related item's updated at - updatedAt map[string]time.Time -} - -// Stats current cache statistics -type Stats struct { - Items int -} - -// NewCache creates an inmemory cache -// -func NewCache() *Cache { - return &Cache{ - items: make(map[string]interface{}), - updatedAt: map[string]time.Time{}, - } -} - -// Stats get current cache statistics -func (r *Cache) Stats() Stats { - return Stats{ - Items: len(r.items), - } -} - -// GetAll returs all the items -func (r *Cache) GetAll() map[string]interface{} { - r.Lock() - defer r.Unlock() - // copy - items := r.items - return items -} - -// Get returns a value of a given key if it exists -func (r *Cache) Get(key string) interface{} { - r.Lock() - defer r.Unlock() - value, ok := r.items[key] - if !ok { - return nil - } - return value -} - -// Exists returns true if key exists -func (r *Cache) Exists(key string) bool { - r.Lock() - defer r.Unlock() - _, ok := r.items[key] - return ok -} - -// Set will persist a value to the cache -func (r *Cache) Set(key string, value interface{}) bool { - r.Lock() - defer r.Unlock() - r.items[key] = value - return true -} - -// Delete deletes a given key if exists -func (r *Cache) Delete(key string) { - r.Lock() - defer r.Unlock() - r.doDelete(key) -} - -func (r *Cache) doDelete(key string) { - if _, ok := r.items[key]; ok { - delete(r.items, key) - delete(r.updatedAt, key) - } -} diff --git a/pkg/donut/cache/metadata/metadata_test.go b/pkg/donut/cache/metadata/metadata_test.go deleted file mode 100644 index 7669ccd28..000000000 --- a/pkg/donut/cache/metadata/metadata_test.go +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 metadata - -import ( - "testing" - - . "gopkg.in/check.v1" -) - -func Test(t *testing.T) { TestingT(t) } - -type MySuite struct{} - -var _ = Suite(&MySuite{}) - -func (s *MySuite) TestCache(c *C) { - cache := NewCache() - data := []byte("Hello, world!") - ok := cache.Set("filename", data) - - c.Assert(ok, Equals, true) - storedata := cache.Get("filename") - - c.Assert(ok, Equals, true) - c.Assert(data, DeepEquals, storedata) - - cache.Delete("filename") - - ok = cache.Exists("filename") - c.Assert(ok, Equals, false) -} diff --git a/pkg/donut/common.go b/pkg/donut/common.go deleted file mode 100644 index 390eb93fd..000000000 --- a/pkg/donut/common.go +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 donut - -import ( - "bufio" - "bytes" - "io" - "regexp" - "sort" - "strings" - "unicode/utf8" - - "github.com/minio/minio/pkg/atomic" -) - -// IsValidDonut - verify donut name is correct -func IsValidDonut(donutName string) bool { - if len(donutName) < 3 || len(donutName) > 63 { - return false - } - if donutName[0] == '.' || donutName[len(donutName)-1] == '.' { - return false - } - if match, _ := regexp.MatchString("\\.\\.", donutName); match == true { - return false - } - // We don't support donutNames with '.' in them - match, _ := regexp.MatchString("^[a-zA-Z][a-zA-Z0-9\\-]+[a-zA-Z0-9]$", donutName) - return match -} - -// IsValidBucket - verify bucket name in accordance with -// - http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html -func IsValidBucket(bucket string) bool { - if len(bucket) < 3 || len(bucket) > 63 { - return false - } - if bucket[0] == '.' || bucket[len(bucket)-1] == '.' { - return false - } - if match, _ := regexp.MatchString("\\.\\.", bucket); match == true { - return false - } - // We don't support buckets with '.' in them - match, _ := regexp.MatchString("^[a-zA-Z][a-zA-Z0-9\\-]+[a-zA-Z0-9]$", bucket) - return match -} - -// IsValidObjectName - verify object name in accordance with -// - http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html -func IsValidObjectName(object string) bool { - if strings.TrimSpace(object) == "" { - return false - } - if len(object) > 1024 || len(object) == 0 { - return false - } - if !utf8.ValidString(object) { - return false - } - return true -} - -// IsValidPrefix - verify prefix name is correct, an empty prefix is valid -func IsValidPrefix(prefix string) bool { - if strings.TrimSpace(prefix) == "" { - return true - } - return IsValidObjectName(prefix) -} - -// ProxyWriter implements io.Writer to trap written bytes -type ProxyWriter struct { - writer io.Writer - writtenBytes []byte -} - -func (r *ProxyWriter) Write(p []byte) (n int, err error) { - n, err = r.writer.Write(p) - if err != nil { - return - } - r.writtenBytes = append(r.writtenBytes, p[0:n]...) - return -} - -// NewProxyWriter - wrap around a given writer with ProxyWriter -func NewProxyWriter(w io.Writer) *ProxyWriter { - return &ProxyWriter{writer: w, writtenBytes: nil} -} - -// Delimiter delims the string at delimiter -func Delimiter(object, delimiter string) string { - readBuffer := bytes.NewBufferString(object) - reader := bufio.NewReader(readBuffer) - stringReader := strings.NewReader(delimiter) - delimited, _ := stringReader.ReadByte() - delimitedStr, _ := reader.ReadString(delimited) - return delimitedStr -} - -// RemoveDuplicates removes duplicate elements from a slice -func RemoveDuplicates(slice []string) []string { - newSlice := []string{} - seen := make(map[string]struct{}) - for _, val := range slice { - if _, ok := seen[val]; !ok { - newSlice = append(newSlice, val) - seen[val] = struct{}{} // avoiding byte allocation - } - } - return newSlice -} - -// TrimPrefix trims off a prefix string from all the elements in a given slice -func TrimPrefix(objects []string, prefix string) []string { - var results []string - for _, object := range objects { - results = append(results, strings.TrimPrefix(object, prefix)) - } - return results -} - -// HasNoDelimiter provides a new slice from an input slice which has elements without delimiter -func HasNoDelimiter(objects []string, delim string) []string { - var results []string - for _, object := range objects { - if !strings.Contains(object, delim) { - results = append(results, object) - } - } - return results -} - -// HasDelimiter provides a new slice from an input slice which has elements with a delimiter -func HasDelimiter(objects []string, delim string) []string { - var results []string - for _, object := range objects { - if strings.Contains(object, delim) { - results = append(results, object) - } - } - return results -} - -// SplitDelimiter provides a new slice from an input slice by splitting a delimiter -func SplitDelimiter(objects []string, delim string) []string { - var results []string - for _, object := range objects { - parts := strings.Split(object, delim) - results = append(results, parts[0]+delim) - } - return results -} - -// SortUnique sort a slice in lexical order, removing duplicate elements -func SortUnique(objects []string) []string { - objectMap := make(map[string]string) - for _, v := range objects { - objectMap[v] = v - } - var results []string - for k := range objectMap { - results = append(results, k) - } - sort.Strings(results) - return results -} - -// CleanupWritersOnError purge writers on error -func CleanupWritersOnError(writers []io.WriteCloser) { - for _, writer := range writers { - writer.(*atomic.File).CloseAndPurge() - } -} diff --git a/pkg/donut/config.go b/pkg/donut/config.go deleted file mode 100644 index cfe4070d5..000000000 --- a/pkg/donut/config.go +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 donut - -import ( - "os/user" - "path/filepath" - - "github.com/minio/minio/pkg/probe" - "github.com/minio/minio/pkg/quick" -) - -// getDonutConfigPath get donut config file path -func getDonutConfigPath() (string, *probe.Error) { - if customConfigPath != "" { - return customConfigPath, nil - } - u, err := user.Current() - if err != nil { - return "", probe.NewError(err) - } - donutConfigPath := filepath.Join(u.HomeDir, ".minio", "donut.json") - return donutConfigPath, nil -} - -// internal variable only accessed via get/set methods -var customConfigPath string - -// SetDonutConfigPath - set custom donut config path -func SetDonutConfigPath(configPath string) { - customConfigPath = configPath -} - -// SaveConfig save donut config -func SaveConfig(a *Config) *probe.Error { - donutConfigPath, err := getDonutConfigPath() - if err != nil { - return err.Trace() - } - qc, err := quick.New(a) - if err != nil { - return err.Trace() - } - if err := qc.Save(donutConfigPath); err != nil { - return err.Trace() - } - return nil -} - -// LoadConfig load donut config -func LoadConfig() (*Config, *probe.Error) { - donutConfigPath, err := getDonutConfigPath() - if err != nil { - return nil, err.Trace() - } - a := &Config{} - a.Version = "0.0.1" - qc, err := quick.New(a) - if err != nil { - return nil, err.Trace() - } - if err := qc.Load(donutConfigPath); err != nil { - return nil, err.Trace() - } - return qc.Data().(*Config), nil -} diff --git a/pkg/donut/disk/disk.go b/pkg/donut/disk/disk.go deleted file mode 100644 index 6b34e5db5..000000000 --- a/pkg/donut/disk/disk.go +++ /dev/null @@ -1,222 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 impliedisk. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package disk - -import ( - "fmt" - "os" - "path/filepath" - "strconv" - "strings" - "sync" - "syscall" - - "github.com/minio/minio/pkg/atomic" - "github.com/minio/minio/pkg/probe" -) - -// Disk container for disk parameters -type Disk struct { - lock *sync.Mutex - path string - fsInfo map[string]string -} - -// New - instantiate new disk -func New(diskPath string) (Disk, *probe.Error) { - if diskPath == "" { - return Disk{}, probe.NewError(InvalidArgument{}) - } - st, err := os.Stat(diskPath) - if err != nil { - return Disk{}, probe.NewError(err) - } - - if !st.IsDir() { - return Disk{}, probe.NewError(syscall.ENOTDIR) - } - s := syscall.Statfs_t{} - err = syscall.Statfs(diskPath, &s) - if err != nil { - return Disk{}, probe.NewError(err) - } - disk := Disk{ - lock: &sync.Mutex{}, - path: diskPath, - fsInfo: make(map[string]string), - } - if fsType := getFSType(s.Type); fsType != "UNKNOWN" { - disk.fsInfo["FSType"] = fsType - disk.fsInfo["MountPoint"] = disk.path - return disk, nil - } - return Disk{}, probe.NewError(UnsupportedFilesystem{Type: strconv.FormatInt(int64(s.Type), 10)}) -} - -// IsUsable - is disk usable, alive -func (disk Disk) IsUsable() bool { - _, err := os.Stat(disk.path) - if err != nil { - return false - } - return true -} - -// GetPath - get root disk path -func (disk Disk) GetPath() string { - return disk.path -} - -// GetFSInfo - get disk filesystem and its usage information -func (disk Disk) GetFSInfo() map[string]string { - disk.lock.Lock() - defer disk.lock.Unlock() - - s := syscall.Statfs_t{} - err := syscall.Statfs(disk.path, &s) - if err != nil { - return nil - } - disk.fsInfo["Total"] = formatBytes(int64(s.Bsize) * int64(s.Blocks)) - disk.fsInfo["Free"] = formatBytes(int64(s.Bsize) * int64(s.Bfree)) - disk.fsInfo["TotalB"] = strconv.FormatInt(int64(s.Bsize)*int64(s.Blocks), 10) - disk.fsInfo["FreeB"] = strconv.FormatInt(int64(s.Bsize)*int64(s.Bfree), 10) - return disk.fsInfo -} - -// MakeDir - make a directory inside disk root path -func (disk Disk) MakeDir(dirname string) *probe.Error { - disk.lock.Lock() - defer disk.lock.Unlock() - if err := os.MkdirAll(filepath.Join(disk.path, dirname), 0700); err != nil { - return probe.NewError(err) - } - return nil -} - -// ListDir - list a directory inside disk root path, get only directories -func (disk Disk) ListDir(dirname string) ([]os.FileInfo, *probe.Error) { - disk.lock.Lock() - defer disk.lock.Unlock() - - dir, err := os.Open(filepath.Join(disk.path, dirname)) - if err != nil { - return nil, probe.NewError(err) - } - defer dir.Close() - contents, err := dir.Readdir(-1) - if err != nil { - return nil, probe.NewError(err) - } - var directories []os.FileInfo - for _, content := range contents { - // Include only directories, ignore everything else - if content.IsDir() { - directories = append(directories, content) - } - } - return directories, nil -} - -// ListFiles - list a directory inside disk root path, get only files -func (disk Disk) ListFiles(dirname string) ([]os.FileInfo, *probe.Error) { - disk.lock.Lock() - defer disk.lock.Unlock() - - dir, err := os.Open(filepath.Join(disk.path, dirname)) - if err != nil { - return nil, probe.NewError(err) - } - defer dir.Close() - contents, err := dir.Readdir(-1) - if err != nil { - return nil, probe.NewError(err) - } - var files []os.FileInfo - for _, content := range contents { - // Include only regular files, ignore everything else - if content.Mode().IsRegular() { - files = append(files, content) - } - } - return files, nil -} - -// CreateFile - create a file inside disk root path, replies with custome disk.File which provides atomic writes -func (disk Disk) CreateFile(filename string) (*atomic.File, *probe.Error) { - disk.lock.Lock() - defer disk.lock.Unlock() - - if filename == "" { - return nil, probe.NewError(InvalidArgument{}) - } - - f, err := atomic.FileCreate(filepath.Join(disk.path, filename)) - if err != nil { - return nil, probe.NewError(err) - } - - return f, nil -} - -// Open - read a file inside disk root path -func (disk Disk) Open(filename string) (*os.File, *probe.Error) { - disk.lock.Lock() - defer disk.lock.Unlock() - - if filename == "" { - return nil, probe.NewError(InvalidArgument{}) - } - dataFile, err := os.Open(filepath.Join(disk.path, filename)) - if err != nil { - return nil, probe.NewError(err) - } - return dataFile, nil -} - -// OpenFile - Use with caution -func (disk Disk) OpenFile(filename string, flags int, perm os.FileMode) (*os.File, *probe.Error) { - disk.lock.Lock() - defer disk.lock.Unlock() - - if filename == "" { - return nil, probe.NewError(InvalidArgument{}) - } - dataFile, err := os.OpenFile(filepath.Join(disk.path, filename), flags, perm) - if err != nil { - return nil, probe.NewError(err) - } - return dataFile, nil -} - -// formatBytes - Convert bytes to human readable string. Like a 2 MB, 64.2 KB, 52 B -func formatBytes(i int64) (result string) { - switch { - case i > (1024 * 1024 * 1024 * 1024): - result = fmt.Sprintf("%.02f TB", float64(i)/1024/1024/1024/1024) - case i > (1024 * 1024 * 1024): - result = fmt.Sprintf("%.02f GB", float64(i)/1024/1024/1024) - case i > (1024 * 1024): - result = fmt.Sprintf("%.02f MB", float64(i)/1024/1024) - case i > 1024: - result = fmt.Sprintf("%.02f KB", float64(i)/1024) - default: - result = fmt.Sprintf("%d B", i) - } - result = strings.Trim(result, " ") - return -} diff --git a/pkg/donut/disk/disk_darwin.go b/pkg/donut/disk/disk_darwin.go deleted file mode 100644 index 5a80549da..000000000 --- a/pkg/donut/disk/disk_darwin.go +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 disk - -import "strconv" - -// fsType2StrinMap - list of filesystems supported by donut -var fsType2StringMap = map[string]string{ - "11": "HFS", -} - -// getFSType - get filesystem type -func getFSType(fsType uint32) string { - fsTypeHex := strconv.FormatUint(uint64(fsType), 16) - fsTypeString, ok := fsType2StringMap[fsTypeHex] - if ok == false { - return "UNKNOWN" - } - return fsTypeString -} diff --git a/pkg/donut/disk/disk_linux.go b/pkg/donut/disk/disk_linux.go deleted file mode 100644 index 362f9c142..000000000 --- a/pkg/donut/disk/disk_linux.go +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 disk - -import "strconv" - -// fsType2StringMap - list of filesystems supported by donut on linux -var fsType2StringMap = map[string]string{ - "1021994": "TMPFS", - "137d": "EXT", - "4244": "HFS", - "4d44": "MSDOS", - "52654973": "REISERFS", - "5346544e": "NTFS", - "58465342": "XFS", - "61756673": "AUFS", - "6969": "NFS", - "ef51": "EXT2OLD", - "ef53": "EXT4", - "f15f": "ecryptfs", -} - -// getFSType - get filesystem type -func getFSType(fsType int64) string { - fsTypeHex := strconv.FormatInt(fsType, 16) - fsTypeString, ok := fsType2StringMap[fsTypeHex] - if ok == false { - return "UNKNOWN" - } - return fsTypeString -} diff --git a/pkg/donut/disk/disk_test.go b/pkg/donut/disk/disk_test.go deleted file mode 100644 index 70c74f8ba..000000000 --- a/pkg/donut/disk/disk_test.go +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 impliedisk. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package disk - -import ( - "io/ioutil" - "os" - "path/filepath" - "testing" - - . "gopkg.in/check.v1" -) - -func TestDisk(t *testing.T) { TestingT(t) } - -type MyDiskSuite struct { - path string - disk Disk -} - -var _ = Suite(&MyDiskSuite{}) - -func (s *MyDiskSuite) SetUpSuite(c *C) { - path, err := ioutil.TempDir(os.TempDir(), "disk-") - c.Assert(err, IsNil) - s.path = path - d, perr := New(s.path) - c.Assert(perr, IsNil) - s.disk = d -} - -func (s *MyDiskSuite) TearDownSuite(c *C) { - os.RemoveAll(s.path) -} - -func (s *MyDiskSuite) TestDiskInfo(c *C) { - c.Assert(s.path, Equals, s.disk.GetPath()) - fsInfo := s.disk.GetFSInfo() - c.Assert(fsInfo["MountPoint"], Equals, s.disk.GetPath()) - c.Assert(fsInfo["FSType"], Not(Equals), "UNKNOWN") -} - -func (s *MyDiskSuite) TestDiskCreateDir(c *C) { - c.Assert(s.disk.MakeDir("hello"), IsNil) -} - -func (s *MyDiskSuite) TestDiskCreateFile(c *C) { - f, err := s.disk.CreateFile("hello1") - c.Assert(err, IsNil) - c.Assert(f.Name(), Not(Equals), filepath.Join(s.path, "hello1")) - // close renames the file - f.Close() - - // Open should be a success - _, err = s.disk.Open("hello1") - c.Assert(err, IsNil) -} - -func (s *MyDiskSuite) TestDiskOpen(c *C) { - f1, err := s.disk.CreateFile("hello2") - c.Assert(err, IsNil) - c.Assert(f1.Name(), Not(Equals), filepath.Join(s.path, "hello2")) - // close renames the file - f1.Close() - - f2, err := s.disk.Open("hello2") - c.Assert(err, IsNil) - c.Assert(f2.Name(), Equals, filepath.Join(s.path, "hello2")) - defer f2.Close() -} diff --git a/pkg/donut/disk/errors.go b/pkg/donut/disk/errors.go deleted file mode 100644 index 8acdb9153..000000000 --- a/pkg/donut/disk/errors.go +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 impliedisk. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package disk - -// InvalidArgument invalid argument -type InvalidArgument struct{} - -func (e InvalidArgument) Error() string { - return "Invalid argument" -} - -// UnsupportedFilesystem unsupported filesystem type -type UnsupportedFilesystem struct { - Type string -} - -func (e UnsupportedFilesystem) Error() string { - return "Unsupported filesystem: " + e.Type -} diff --git a/pkg/donut/donut-metadata.md b/pkg/donut/donut-metadata.md deleted file mode 100644 index 1825741c5..000000000 --- a/pkg/donut/donut-metadata.md +++ /dev/null @@ -1,55 +0,0 @@ -##### Users Collection - -```js - -"minio": { - "version": 1, - "users": [{ - "secretAccessKey": String, - "accessKeyId": String, - "status": String // enum: ok, disabled, deleted - }], - "hosts": [{ - "address": String, - "uuid": String, - "status": String, // enum: ok, disabled, deleted, busy, offline. - "disks": [{ - "disk": String, - "uuid": String, - "status": String // ok, offline, disabled, busy. - }] - }] -} -``` - -##### Bucket Collection - -```js -"buckets": { - "bucket": String, // index - "deleted": Boolean, - "permissions": String -} -``` - -##### Object Collection - -```js -"objects": { - "key": String, // index - "createdAt": Date, - "hosts[16]": [{ - "host": String, - "disk": String, - }], - "deleted": Boolean -} -``` - -```js -"meta": { - "key": String, // index - "type": String // content-type - // type speific meta -} -``` diff --git a/pkg/donut/donut-v1.go b/pkg/donut/donut-v1.go deleted file mode 100644 index 5875b8403..000000000 --- a/pkg/donut/donut-v1.go +++ /dev/null @@ -1,680 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 donut - -import ( - "encoding/base64" - "encoding/hex" - "encoding/json" - "encoding/xml" - "fmt" - "io" - "io/ioutil" - "math/rand" - "os" - "path/filepath" - "sort" - "strconv" - "strings" - "time" - - "github.com/minio/minio/pkg/crypto/sha256" - "github.com/minio/minio/pkg/crypto/sha512" - "github.com/minio/minio/pkg/donut/disk" - "github.com/minio/minio/pkg/probe" - signv4 "github.com/minio/minio/pkg/signature" -) - -// config files used inside Donut -const ( - // bucket, object metadata - bucketMetadataConfig = "bucketMetadata.json" - objectMetadataConfig = "objectMetadata.json" - - // versions - objectMetadataVersion = "1.0.0" - bucketMetadataVersion = "1.0.0" -) - -/// v1 API functions - -// makeBucket - make a new bucket -func (donut API) makeBucket(bucket string, acl BucketACL) *probe.Error { - if bucket == "" || strings.TrimSpace(bucket) == "" { - return probe.NewError(InvalidArgument{}) - } - return donut.makeDonutBucket(bucket, acl.String()) -} - -// getBucketMetadata - get bucket metadata -func (donut API) getBucketMetadata(bucketName string) (BucketMetadata, *probe.Error) { - if err := donut.listDonutBuckets(); err != nil { - return BucketMetadata{}, err.Trace() - } - if _, ok := donut.buckets[bucketName]; !ok { - return BucketMetadata{}, probe.NewError(BucketNotFound{Bucket: bucketName}) - } - metadata, err := donut.getDonutBucketMetadata() - if err != nil { - return BucketMetadata{}, err.Trace() - } - return metadata.Buckets[bucketName], nil -} - -// setBucketMetadata - set bucket metadata -func (donut API) setBucketMetadata(bucketName string, bucketMetadata map[string]string) *probe.Error { - if err := donut.listDonutBuckets(); err != nil { - return err.Trace() - } - metadata, err := donut.getDonutBucketMetadata() - if err != nil { - return err.Trace() - } - oldBucketMetadata := metadata.Buckets[bucketName] - acl, ok := bucketMetadata["acl"] - if !ok { - return probe.NewError(InvalidArgument{}) - } - oldBucketMetadata.ACL = BucketACL(acl) - metadata.Buckets[bucketName] = oldBucketMetadata - return donut.setDonutBucketMetadata(metadata) -} - -// listBuckets - return list of buckets -func (donut API) listBuckets() (map[string]BucketMetadata, *probe.Error) { - if err := donut.listDonutBuckets(); err != nil { - return nil, err.Trace() - } - metadata, err := donut.getDonutBucketMetadata() - if err != nil { - // intentionally left out the error when Donut is empty - // but we need to revisit this area in future - since we need - // to figure out between acceptable and unacceptable errors - return make(map[string]BucketMetadata), nil - } - if metadata == nil { - return make(map[string]BucketMetadata), nil - } - return metadata.Buckets, nil -} - -// listObjects - return list of objects -func (donut API) listObjects(bucket, prefix, marker, delimiter string, maxkeys int) (ListObjectsResults, *probe.Error) { - if err := donut.listDonutBuckets(); err != nil { - return ListObjectsResults{}, err.Trace() - } - if _, ok := donut.buckets[bucket]; !ok { - return ListObjectsResults{}, probe.NewError(BucketNotFound{Bucket: bucket}) - } - listObjects, err := donut.buckets[bucket].ListObjects(prefix, marker, delimiter, maxkeys) - if err != nil { - return ListObjectsResults{}, err.Trace() - } - return listObjects, nil -} - -// putObject - put object -func (donut API) putObject(bucket, object, expectedMD5Sum string, reader io.Reader, size int64, metadata map[string]string, signature *signv4.Signature) (ObjectMetadata, *probe.Error) { - if bucket == "" || strings.TrimSpace(bucket) == "" { - return ObjectMetadata{}, probe.NewError(InvalidArgument{}) - } - if object == "" || strings.TrimSpace(object) == "" { - return ObjectMetadata{}, probe.NewError(InvalidArgument{}) - } - if err := donut.listDonutBuckets(); err != nil { - return ObjectMetadata{}, err.Trace() - } - if _, ok := donut.buckets[bucket]; !ok { - return ObjectMetadata{}, probe.NewError(BucketNotFound{Bucket: bucket}) - } - bucketMeta, err := donut.getDonutBucketMetadata() - if err != nil { - return ObjectMetadata{}, err.Trace() - } - if _, ok := bucketMeta.Buckets[bucket].BucketObjects[object]; ok { - return ObjectMetadata{}, probe.NewError(ObjectExists{Object: object}) - } - objMetadata, err := donut.buckets[bucket].WriteObject(object, reader, size, expectedMD5Sum, metadata, signature) - if err != nil { - return ObjectMetadata{}, err.Trace() - } - bucketMeta.Buckets[bucket].BucketObjects[object] = struct{}{} - if err := donut.setDonutBucketMetadata(bucketMeta); err != nil { - return ObjectMetadata{}, err.Trace() - } - return objMetadata, nil -} - -// putObject - put object -func (donut API) putObjectPart(bucket, object, expectedMD5Sum, uploadID string, partID int, reader io.Reader, size int64, metadata map[string]string, signature *signv4.Signature) (PartMetadata, *probe.Error) { - if bucket == "" || strings.TrimSpace(bucket) == "" { - return PartMetadata{}, probe.NewError(InvalidArgument{}) - } - if object == "" || strings.TrimSpace(object) == "" { - return PartMetadata{}, probe.NewError(InvalidArgument{}) - } - if err := donut.listDonutBuckets(); err != nil { - return PartMetadata{}, err.Trace() - } - if _, ok := donut.buckets[bucket]; !ok { - return PartMetadata{}, probe.NewError(BucketNotFound{Bucket: bucket}) - } - bucketMeta, err := donut.getDonutBucketMetadata() - if err != nil { - return PartMetadata{}, err.Trace() - } - if _, ok := bucketMeta.Buckets[bucket].Multiparts[object]; !ok { - return PartMetadata{}, probe.NewError(InvalidUploadID{UploadID: uploadID}) - } - if _, ok := bucketMeta.Buckets[bucket].BucketObjects[object]; ok { - return PartMetadata{}, probe.NewError(ObjectExists{Object: object}) - } - objectPart := object + "/" + "multipart" + "/" + strconv.Itoa(partID) - objmetadata, err := donut.buckets[bucket].WriteObject(objectPart, reader, size, expectedMD5Sum, metadata, signature) - if err != nil { - return PartMetadata{}, err.Trace() - } - partMetadata := PartMetadata{ - PartNumber: partID, - LastModified: objmetadata.Created, - ETag: objmetadata.MD5Sum, - Size: objmetadata.Size, - } - multipartSession := bucketMeta.Buckets[bucket].Multiparts[object] - multipartSession.Parts[strconv.Itoa(partID)] = partMetadata - bucketMeta.Buckets[bucket].Multiparts[object] = multipartSession - if err := donut.setDonutBucketMetadata(bucketMeta); err != nil { - return PartMetadata{}, err.Trace() - } - return partMetadata, nil -} - -// getObject - get object -func (donut API) getObject(bucket, object string) (reader io.ReadCloser, size int64, err *probe.Error) { - if bucket == "" || strings.TrimSpace(bucket) == "" { - return nil, 0, probe.NewError(InvalidArgument{}) - } - if object == "" || strings.TrimSpace(object) == "" { - return nil, 0, probe.NewError(InvalidArgument{}) - } - if err := donut.listDonutBuckets(); err != nil { - return nil, 0, err.Trace() - } - if _, ok := donut.buckets[bucket]; !ok { - return nil, 0, probe.NewError(BucketNotFound{Bucket: bucket}) - } - return donut.buckets[bucket].ReadObject(object) -} - -// getObjectMetadata - get object metadata -func (donut API) getObjectMetadata(bucket, object string) (ObjectMetadata, *probe.Error) { - if err := donut.listDonutBuckets(); err != nil { - return ObjectMetadata{}, err.Trace() - } - if _, ok := donut.buckets[bucket]; !ok { - return ObjectMetadata{}, probe.NewError(BucketNotFound{Bucket: bucket}) - } - bucketMeta, err := donut.getDonutBucketMetadata() - if err != nil { - return ObjectMetadata{}, err.Trace() - } - if _, ok := bucketMeta.Buckets[bucket].BucketObjects[object]; !ok { - return ObjectMetadata{}, probe.NewError(ObjectNotFound{Object: object}) - } - objectMetadata, err := donut.buckets[bucket].GetObjectMetadata(object) - if err != nil { - return ObjectMetadata{}, err.Trace() - } - return objectMetadata, nil -} - -// newMultipartUpload - new multipart upload request -func (donut API) newMultipartUpload(bucket, object, contentType string) (string, *probe.Error) { - if err := donut.listDonutBuckets(); err != nil { - return "", err.Trace() - } - if _, ok := donut.buckets[bucket]; !ok { - return "", probe.NewError(BucketNotFound{Bucket: bucket}) - } - allbuckets, err := donut.getDonutBucketMetadata() - if err != nil { - return "", err.Trace() - } - bucketMetadata := allbuckets.Buckets[bucket] - multiparts := make(map[string]MultiPartSession) - if len(bucketMetadata.Multiparts) > 0 { - multiparts = bucketMetadata.Multiparts - } - - id := []byte(strconv.Itoa(rand.Int()) + bucket + object + time.Now().String()) - uploadIDSum := sha512.Sum512(id) - uploadID := base64.URLEncoding.EncodeToString(uploadIDSum[:])[:47] - - multipartSession := MultiPartSession{ - UploadID: uploadID, - Initiated: time.Now().UTC(), - Parts: make(map[string]PartMetadata), - TotalParts: 0, - } - multiparts[object] = multipartSession - bucketMetadata.Multiparts = multiparts - allbuckets.Buckets[bucket] = bucketMetadata - - if err := donut.setDonutBucketMetadata(allbuckets); err != nil { - return "", err.Trace() - } - - return uploadID, nil -} - -// listObjectParts list all object parts -func (donut API) listObjectParts(bucket, object string, resources ObjectResourcesMetadata) (ObjectResourcesMetadata, *probe.Error) { - if bucket == "" || strings.TrimSpace(bucket) == "" { - return ObjectResourcesMetadata{}, probe.NewError(InvalidArgument{}) - } - if object == "" || strings.TrimSpace(object) == "" { - return ObjectResourcesMetadata{}, probe.NewError(InvalidArgument{}) - } - if err := donut.listDonutBuckets(); err != nil { - return ObjectResourcesMetadata{}, err.Trace() - } - if _, ok := donut.buckets[bucket]; !ok { - return ObjectResourcesMetadata{}, probe.NewError(BucketNotFound{Bucket: bucket}) - } - allBuckets, err := donut.getDonutBucketMetadata() - if err != nil { - return ObjectResourcesMetadata{}, err.Trace() - } - bucketMetadata := allBuckets.Buckets[bucket] - if _, ok := bucketMetadata.Multiparts[object]; !ok { - return ObjectResourcesMetadata{}, probe.NewError(InvalidUploadID{UploadID: resources.UploadID}) - } - if bucketMetadata.Multiparts[object].UploadID != resources.UploadID { - return ObjectResourcesMetadata{}, probe.NewError(InvalidUploadID{UploadID: resources.UploadID}) - } - objectResourcesMetadata := resources - objectResourcesMetadata.Bucket = bucket - objectResourcesMetadata.Key = object - var parts []*PartMetadata - var startPartNumber int - switch { - case objectResourcesMetadata.PartNumberMarker == 0: - startPartNumber = 1 - default: - startPartNumber = objectResourcesMetadata.PartNumberMarker - } - for i := startPartNumber; i <= bucketMetadata.Multiparts[object].TotalParts; i++ { - if len(parts) > objectResourcesMetadata.MaxParts { - sort.Sort(partNumber(parts)) - objectResourcesMetadata.IsTruncated = true - objectResourcesMetadata.Part = parts - objectResourcesMetadata.NextPartNumberMarker = i - return objectResourcesMetadata, nil - } - part, ok := bucketMetadata.Multiparts[object].Parts[strconv.Itoa(i)] - if !ok { - return ObjectResourcesMetadata{}, probe.NewError(InvalidPart{}) - } - parts = append(parts, &part) - } - sort.Sort(partNumber(parts)) - objectResourcesMetadata.Part = parts - return objectResourcesMetadata, nil -} - -// completeMultipartUpload complete an incomplete multipart upload -func (donut API) completeMultipartUpload(bucket, object, uploadID string, data io.Reader, signature *signv4.Signature) (ObjectMetadata, *probe.Error) { - if bucket == "" || strings.TrimSpace(bucket) == "" { - return ObjectMetadata{}, probe.NewError(InvalidArgument{}) - } - if object == "" || strings.TrimSpace(object) == "" { - return ObjectMetadata{}, probe.NewError(InvalidArgument{}) - } - if err := donut.listDonutBuckets(); err != nil { - return ObjectMetadata{}, err.Trace() - } - if _, ok := donut.buckets[bucket]; !ok { - return ObjectMetadata{}, probe.NewError(BucketNotFound{Bucket: bucket}) - } - allBuckets, err := donut.getDonutBucketMetadata() - if err != nil { - return ObjectMetadata{}, err.Trace() - } - bucketMetadata := allBuckets.Buckets[bucket] - if _, ok := bucketMetadata.Multiparts[object]; !ok { - return ObjectMetadata{}, probe.NewError(InvalidUploadID{UploadID: uploadID}) - } - if bucketMetadata.Multiparts[object].UploadID != uploadID { - return ObjectMetadata{}, probe.NewError(InvalidUploadID{UploadID: uploadID}) - } - var partBytes []byte - { - var err error - partBytes, err = ioutil.ReadAll(data) - if err != nil { - return ObjectMetadata{}, probe.NewError(err) - } - } - if signature != nil { - ok, err := signature.DoesSignatureMatch(hex.EncodeToString(sha256.Sum256(partBytes)[:])) - if err != nil { - return ObjectMetadata{}, err.Trace() - } - if !ok { - return ObjectMetadata{}, probe.NewError(signv4.DoesNotMatch{}) - } - } - parts := &CompleteMultipartUpload{} - if err := xml.Unmarshal(partBytes, parts); err != nil { - return ObjectMetadata{}, probe.NewError(MalformedXML{}) - } - if !sort.IsSorted(completedParts(parts.Part)) { - return ObjectMetadata{}, probe.NewError(InvalidPartOrder{}) - } - for _, part := range parts.Part { - if strings.Trim(part.ETag, "\"") != bucketMetadata.Multiparts[object].Parts[strconv.Itoa(part.PartNumber)].ETag { - return ObjectMetadata{}, probe.NewError(InvalidPart{}) - } - } - var finalETagBytes []byte - var finalSize int64 - totalParts := strconv.Itoa(bucketMetadata.Multiparts[object].TotalParts) - for _, part := range bucketMetadata.Multiparts[object].Parts { - partETagBytes, err := hex.DecodeString(part.ETag) - if err != nil { - return ObjectMetadata{}, probe.NewError(err) - } - finalETagBytes = append(finalETagBytes, partETagBytes...) - finalSize += part.Size - } - finalETag := hex.EncodeToString(finalETagBytes) - objMetadata := ObjectMetadata{} - objMetadata.MD5Sum = finalETag + "-" + totalParts - objMetadata.Object = object - objMetadata.Bucket = bucket - objMetadata.Size = finalSize - objMetadata.Created = bucketMetadata.Multiparts[object].Parts[totalParts].LastModified - return objMetadata, nil -} - -// listMultipartUploads list all multipart uploads -func (donut API) listMultipartUploads(bucket string, resources BucketMultipartResourcesMetadata) (BucketMultipartResourcesMetadata, *probe.Error) { - if err := donut.listDonutBuckets(); err != nil { - return BucketMultipartResourcesMetadata{}, err.Trace() - } - if _, ok := donut.buckets[bucket]; !ok { - return BucketMultipartResourcesMetadata{}, probe.NewError(BucketNotFound{Bucket: bucket}) - } - allbuckets, err := donut.getDonutBucketMetadata() - if err != nil { - return BucketMultipartResourcesMetadata{}, err.Trace() - } - bucketMetadata := allbuckets.Buckets[bucket] - var uploads []*UploadMetadata - for key, session := range bucketMetadata.Multiparts { - if strings.HasPrefix(key, resources.Prefix) { - if len(uploads) > resources.MaxUploads { - sort.Sort(byKey(uploads)) - resources.Upload = uploads - resources.NextKeyMarker = key - resources.NextUploadIDMarker = session.UploadID - resources.IsTruncated = true - return resources, nil - } - // uploadIDMarker is ignored if KeyMarker is empty - switch { - case resources.KeyMarker != "" && resources.UploadIDMarker == "": - if key > resources.KeyMarker { - upload := new(UploadMetadata) - upload.Key = key - upload.UploadID = session.UploadID - upload.Initiated = session.Initiated - uploads = append(uploads, upload) - } - case resources.KeyMarker != "" && resources.UploadIDMarker != "": - if session.UploadID > resources.UploadIDMarker { - if key >= resources.KeyMarker { - upload := new(UploadMetadata) - upload.Key = key - upload.UploadID = session.UploadID - upload.Initiated = session.Initiated - uploads = append(uploads, upload) - } - } - default: - upload := new(UploadMetadata) - upload.Key = key - upload.UploadID = session.UploadID - upload.Initiated = session.Initiated - uploads = append(uploads, upload) - } - } - } - sort.Sort(byKey(uploads)) - resources.Upload = uploads - return resources, nil -} - -// abortMultipartUpload - abort a incomplete multipart upload -func (donut API) abortMultipartUpload(bucket, object, uploadID string) *probe.Error { - if err := donut.listDonutBuckets(); err != nil { - return err.Trace() - } - if _, ok := donut.buckets[bucket]; !ok { - return probe.NewError(BucketNotFound{Bucket: bucket}) - } - allbuckets, err := donut.getDonutBucketMetadata() - if err != nil { - return err.Trace() - } - bucketMetadata := allbuckets.Buckets[bucket] - if _, ok := bucketMetadata.Multiparts[object]; !ok { - return probe.NewError(InvalidUploadID{UploadID: uploadID}) - } - if bucketMetadata.Multiparts[object].UploadID != uploadID { - return probe.NewError(InvalidUploadID{UploadID: uploadID}) - } - delete(bucketMetadata.Multiparts, object) - - allbuckets.Buckets[bucket] = bucketMetadata - if err := donut.setDonutBucketMetadata(allbuckets); err != nil { - return err.Trace() - } - - return nil -} - -//// internal functions - -// getBucketMetadataWriters - -func (donut API) getBucketMetadataWriters() ([]io.WriteCloser, *probe.Error) { - var writers []io.WriteCloser - for _, node := range donut.nodes { - disks, err := node.ListDisks() - if err != nil { - return nil, err.Trace() - } - writers = make([]io.WriteCloser, len(disks)) - for order, disk := range disks { - bucketMetaDataWriter, err := disk.CreateFile(filepath.Join(donut.config.DonutName, bucketMetadataConfig)) - if err != nil { - return nil, err.Trace() - } - writers[order] = bucketMetaDataWriter - } - } - return writers, nil -} - -// getBucketMetadataReaders - readers are returned in map rather than slice -func (donut API) getBucketMetadataReaders() (map[int]io.ReadCloser, *probe.Error) { - readers := make(map[int]io.ReadCloser) - disks := make(map[int]disk.Disk) - var err *probe.Error - for _, node := range donut.nodes { - nDisks := make(map[int]disk.Disk) - nDisks, err = node.ListDisks() - if err != nil { - return nil, err.Trace() - } - for k, v := range nDisks { - disks[k] = v - } - } - var bucketMetaDataReader io.ReadCloser - for order, disk := range disks { - bucketMetaDataReader, err = disk.Open(filepath.Join(donut.config.DonutName, bucketMetadataConfig)) - if err != nil { - continue - } - readers[order] = bucketMetaDataReader - } - if err != nil { - return nil, err.Trace() - } - return readers, nil -} - -// setDonutBucketMetadata - -func (donut API) setDonutBucketMetadata(metadata *AllBuckets) *probe.Error { - writers, err := donut.getBucketMetadataWriters() - if err != nil { - return err.Trace() - } - for _, writer := range writers { - jenc := json.NewEncoder(writer) - if err := jenc.Encode(metadata); err != nil { - CleanupWritersOnError(writers) - return probe.NewError(err) - } - } - for _, writer := range writers { - writer.Close() - } - return nil -} - -// getDonutBucketMetadata - -func (donut API) getDonutBucketMetadata() (*AllBuckets, *probe.Error) { - metadata := &AllBuckets{} - readers, err := donut.getBucketMetadataReaders() - if err != nil { - return nil, err.Trace() - } - for _, reader := range readers { - defer reader.Close() - } - { - var err error - for _, reader := range readers { - jenc := json.NewDecoder(reader) - if err = jenc.Decode(metadata); err == nil { - return metadata, nil - } - } - return nil, probe.NewError(err) - } -} - -// makeDonutBucket - -func (donut API) makeDonutBucket(bucketName, acl string) *probe.Error { - if err := donut.listDonutBuckets(); err != nil { - return err.Trace() - } - if _, ok := donut.buckets[bucketName]; ok { - return probe.NewError(BucketExists{Bucket: bucketName}) - } - bkt, bucketMetadata, err := newBucket(bucketName, acl, donut.config.DonutName, donut.nodes) - if err != nil { - return err.Trace() - } - nodeNumber := 0 - donut.buckets[bucketName] = bkt - for _, node := range donut.nodes { - disks := make(map[int]disk.Disk) - disks, err = node.ListDisks() - if err != nil { - return err.Trace() - } - for order, disk := range disks { - bucketSlice := fmt.Sprintf("%s$%d$%d", bucketName, nodeNumber, order) - err := disk.MakeDir(filepath.Join(donut.config.DonutName, bucketSlice)) - if err != nil { - return err.Trace() - } - } - nodeNumber = nodeNumber + 1 - } - var metadata *AllBuckets - metadata, err = donut.getDonutBucketMetadata() - if err != nil { - if os.IsNotExist(err.ToGoError()) { - metadata = new(AllBuckets) - metadata.Buckets = make(map[string]BucketMetadata) - metadata.Buckets[bucketName] = bucketMetadata - err = donut.setDonutBucketMetadata(metadata) - if err != nil { - return err.Trace() - } - return nil - } - return err.Trace() - } - metadata.Buckets[bucketName] = bucketMetadata - err = donut.setDonutBucketMetadata(metadata) - if err != nil { - return err.Trace() - } - return nil -} - -// listDonutBuckets - -func (donut API) listDonutBuckets() *probe.Error { - var disks map[int]disk.Disk - var err *probe.Error - for _, node := range donut.nodes { - disks, err = node.ListDisks() - if err != nil { - return err.Trace() - } - } - var dirs []os.FileInfo - for _, disk := range disks { - dirs, err = disk.ListDir(donut.config.DonutName) - if err == nil { - break - } - } - // if all disks are missing then return error - if err != nil { - return err.Trace() - } - for _, dir := range dirs { - splitDir := strings.Split(dir.Name(), "$") - if len(splitDir) < 3 { - return probe.NewError(CorruptedBackend{Backend: dir.Name()}) - } - bucketName := splitDir[0] - // we dont need this once we cache from makeDonutBucket() - bkt, _, err := newBucket(bucketName, "private", donut.config.DonutName, donut.nodes) - if err != nil { - return err.Trace() - } - donut.buckets[bucketName] = bkt - } - return nil -} diff --git a/pkg/donut/donut-v1_test.go b/pkg/donut/donut-v1_test.go deleted file mode 100644 index b845fdea0..000000000 --- a/pkg/donut/donut-v1_test.go +++ /dev/null @@ -1,290 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 impliedd. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package donut - -import ( - "bytes" - "crypto/md5" - "encoding/base64" - "encoding/hex" - "io/ioutil" - "os" - "path/filepath" - "strconv" - "testing" - - . "gopkg.in/check.v1" -) - -func TestDonut(t *testing.T) { TestingT(t) } - -type MyDonutSuite struct { - root string -} - -var _ = Suite(&MyDonutSuite{}) - -// create a dummy TestNodeDiskMap -func createTestNodeDiskMap(p string) map[string][]string { - nodes := make(map[string][]string) - nodes["localhost"] = make([]string, 16) - for i := 0; i < len(nodes["localhost"]); i++ { - diskPath := filepath.Join(p, strconv.Itoa(i)) - if _, err := os.Stat(diskPath); err != nil { - if os.IsNotExist(err) { - os.MkdirAll(diskPath, 0700) - } - } - nodes["localhost"][i] = diskPath - } - return nodes -} - -var dd Interface - -func (s *MyDonutSuite) SetUpSuite(c *C) { - root, err := ioutil.TempDir(os.TempDir(), "donut-") - c.Assert(err, IsNil) - s.root = root - - conf := new(Config) - conf.Version = "0.0.1" - conf.DonutName = "test" - conf.NodeDiskMap = createTestNodeDiskMap(root) - conf.MaxSize = 100000 - SetDonutConfigPath(filepath.Join(root, "donut.json")) - perr := SaveConfig(conf) - c.Assert(perr, IsNil) - - dd, perr = New() - c.Assert(perr, IsNil) - - // testing empty donut - buckets, perr := dd.ListBuckets() - c.Assert(perr, IsNil) - c.Assert(len(buckets), Equals, 0) -} - -func (s *MyDonutSuite) TearDownSuite(c *C) { - os.RemoveAll(s.root) -} - -// test make bucket without name -func (s *MyDonutSuite) TestBucketWithoutNameFails(c *C) { - // fail to create new bucket without a name - err := dd.MakeBucket("", "private", nil, nil) - c.Assert(err, Not(IsNil)) - - err = dd.MakeBucket(" ", "private", nil, nil) - c.Assert(err, Not(IsNil)) -} - -// test empty bucket -func (s *MyDonutSuite) TestEmptyBucket(c *C) { - c.Assert(dd.MakeBucket("foo1", "private", nil, nil), IsNil) - // check if bucket is empty - var resources BucketResourcesMetadata - resources.Maxkeys = 1 - objectsMetadata, resources, err := dd.ListObjects("foo1", resources) - c.Assert(err, IsNil) - c.Assert(len(objectsMetadata), Equals, 0) - c.Assert(resources.CommonPrefixes, DeepEquals, []string{}) - c.Assert(resources.IsTruncated, Equals, false) -} - -// test bucket list -func (s *MyDonutSuite) TestMakeBucketAndList(c *C) { - // create bucket - err := dd.MakeBucket("foo2", "private", nil, nil) - c.Assert(err, IsNil) - - // check bucket exists - buckets, err := dd.ListBuckets() - c.Assert(err, IsNil) - c.Assert(len(buckets), Equals, 5) - c.Assert(buckets[0].ACL, Equals, BucketACL("private")) -} - -// test re-create bucket -func (s *MyDonutSuite) TestMakeBucketWithSameNameFails(c *C) { - err := dd.MakeBucket("foo3", "private", nil, nil) - c.Assert(err, IsNil) - - err = dd.MakeBucket("foo3", "private", nil, nil) - c.Assert(err, Not(IsNil)) -} - -// test make multiple buckets -func (s *MyDonutSuite) TestCreateMultipleBucketsAndList(c *C) { - // add a second bucket - err := dd.MakeBucket("foo4", "private", nil, nil) - c.Assert(err, IsNil) - - err = dd.MakeBucket("bar1", "private", nil, nil) - c.Assert(err, IsNil) - - buckets, err := dd.ListBuckets() - c.Assert(err, IsNil) - - c.Assert(len(buckets), Equals, 2) - c.Assert(buckets[0].Name, Equals, "bar1") - c.Assert(buckets[1].Name, Equals, "foo4") - - err = dd.MakeBucket("foobar1", "private", nil, nil) - c.Assert(err, IsNil) - - buckets, err = dd.ListBuckets() - c.Assert(err, IsNil) - - c.Assert(len(buckets), Equals, 3) - c.Assert(buckets[2].Name, Equals, "foobar1") -} - -// test object create without bucket -func (s *MyDonutSuite) TestNewObjectFailsWithoutBucket(c *C) { - _, err := dd.CreateObject("unknown", "obj", "", 0, nil, nil, nil) - c.Assert(err, Not(IsNil)) -} - -// test create object metadata -func (s *MyDonutSuite) TestNewObjectMetadata(c *C) { - data := "Hello World" - hasher := md5.New() - hasher.Write([]byte(data)) - expectedMd5Sum := base64.StdEncoding.EncodeToString(hasher.Sum(nil)) - reader := ioutil.NopCloser(bytes.NewReader([]byte(data))) - - err := dd.MakeBucket("foo6", "private", nil, nil) - c.Assert(err, IsNil) - - objectMetadata, err := dd.CreateObject("foo6", "obj", expectedMd5Sum, int64(len(data)), reader, map[string]string{"contentType": "application/json"}, nil) - c.Assert(err, IsNil) - c.Assert(objectMetadata.MD5Sum, Equals, hex.EncodeToString(hasher.Sum(nil))) - c.Assert(objectMetadata.Metadata["contentType"], Equals, "application/json") -} - -// test create object fails without name -func (s *MyDonutSuite) TestNewObjectFailsWithEmptyName(c *C) { - _, err := dd.CreateObject("foo", "", "", 0, nil, nil, nil) - c.Assert(err, Not(IsNil)) -} - -// test create object -func (s *MyDonutSuite) TestNewObjectCanBeWritten(c *C) { - err := dd.MakeBucket("foo", "private", nil, nil) - c.Assert(err, IsNil) - - data := "Hello World" - - hasher := md5.New() - hasher.Write([]byte(data)) - expectedMd5Sum := base64.StdEncoding.EncodeToString(hasher.Sum(nil)) - reader := ioutil.NopCloser(bytes.NewReader([]byte(data))) - - actualMetadata, err := dd.CreateObject("foo", "obj", expectedMd5Sum, int64(len(data)), reader, map[string]string{"contentType": "application/octet-stream"}, nil) - c.Assert(err, IsNil) - c.Assert(actualMetadata.MD5Sum, Equals, hex.EncodeToString(hasher.Sum(nil))) - - var buffer bytes.Buffer - size, err := dd.GetObject(&buffer, "foo", "obj", 0, 0) - c.Assert(err, IsNil) - c.Assert(size, Equals, int64(len(data))) - c.Assert(buffer.Bytes(), DeepEquals, []byte(data)) - - actualMetadata, err = dd.GetObjectMetadata("foo", "obj") - c.Assert(err, IsNil) - c.Assert(hex.EncodeToString(hasher.Sum(nil)), Equals, actualMetadata.MD5Sum) - c.Assert(int64(len(data)), Equals, actualMetadata.Size) -} - -// test list objects -func (s *MyDonutSuite) TestMultipleNewObjects(c *C) { - c.Assert(dd.MakeBucket("foo5", "private", nil, nil), IsNil) - - one := ioutil.NopCloser(bytes.NewReader([]byte("one"))) - - _, err := dd.CreateObject("foo5", "obj1", "", int64(len("one")), one, nil, nil) - c.Assert(err, IsNil) - - two := ioutil.NopCloser(bytes.NewReader([]byte("two"))) - _, err = dd.CreateObject("foo5", "obj2", "", int64(len("two")), two, nil, nil) - c.Assert(err, IsNil) - - var buffer1 bytes.Buffer - size, err := dd.GetObject(&buffer1, "foo5", "obj1", 0, 0) - c.Assert(err, IsNil) - c.Assert(size, Equals, int64(len([]byte("one")))) - c.Assert(buffer1.Bytes(), DeepEquals, []byte("one")) - - var buffer2 bytes.Buffer - size, err = dd.GetObject(&buffer2, "foo5", "obj2", 0, 0) - c.Assert(err, IsNil) - c.Assert(size, Equals, int64(len([]byte("two")))) - - c.Assert(buffer2.Bytes(), DeepEquals, []byte("two")) - - /// test list of objects - - // test list objects with prefix and delimiter - var resources BucketResourcesMetadata - resources.Prefix = "o" - resources.Delimiter = "1" - resources.Maxkeys = 10 - objectsMetadata, resources, err := dd.ListObjects("foo5", resources) - c.Assert(err, IsNil) - c.Assert(resources.IsTruncated, Equals, false) - c.Assert(resources.CommonPrefixes[0], Equals, "obj1") - - // test list objects with only delimiter - resources.Prefix = "" - resources.Delimiter = "1" - resources.Maxkeys = 10 - objectsMetadata, resources, err = dd.ListObjects("foo5", resources) - c.Assert(err, IsNil) - c.Assert(objectsMetadata[0].Object, Equals, "obj2") - c.Assert(resources.IsTruncated, Equals, false) - c.Assert(resources.CommonPrefixes[0], Equals, "obj1") - - // test list objects with only prefix - resources.Prefix = "o" - resources.Delimiter = "" - resources.Maxkeys = 10 - objectsMetadata, resources, err = dd.ListObjects("foo5", resources) - c.Assert(err, IsNil) - c.Assert(resources.IsTruncated, Equals, false) - c.Assert(objectsMetadata[0].Object, Equals, "obj1") - c.Assert(objectsMetadata[1].Object, Equals, "obj2") - - three := ioutil.NopCloser(bytes.NewReader([]byte("three"))) - _, err = dd.CreateObject("foo5", "obj3", "", int64(len("three")), three, nil, nil) - c.Assert(err, IsNil) - - var buffer bytes.Buffer - size, err = dd.GetObject(&buffer, "foo5", "obj3", 0, 0) - c.Assert(err, IsNil) - c.Assert(size, Equals, int64(len([]byte("three")))) - c.Assert(buffer.Bytes(), DeepEquals, []byte("three")) - - // test list objects with maxkeys - resources.Prefix = "o" - resources.Delimiter = "" - resources.Maxkeys = 2 - objectsMetadata, resources, err = dd.ListObjects("foo5", resources) - c.Assert(err, IsNil) - c.Assert(resources.IsTruncated, Equals, true) - c.Assert(len(objectsMetadata), Equals, 2) -} diff --git a/pkg/donut/donut-v2.go b/pkg/donut/donut-v2.go deleted file mode 100644 index 21e648e5c..000000000 --- a/pkg/donut/donut-v2.go +++ /dev/null @@ -1,636 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 donut - -import ( - "bytes" - "crypto/md5" - "encoding/base64" - "encoding/hex" - "io" - "io/ioutil" - "log" - "runtime/debug" - "sort" - "strconv" - "strings" - "sync" - "time" - - "github.com/minio/minio/pkg/crypto/sha256" - "github.com/minio/minio/pkg/donut/cache/data" - "github.com/minio/minio/pkg/donut/cache/metadata" - "github.com/minio/minio/pkg/probe" - "github.com/minio/minio/pkg/quick" - signv4 "github.com/minio/minio/pkg/signature" -) - -// total Number of buckets allowed -const ( - totalBuckets = 100 -) - -// Config donut config -type Config struct { - Version string `json:"version"` - MaxSize uint64 `json:"max-size"` - DonutName string `json:"donut-name"` - NodeDiskMap map[string][]string `json:"node-disk-map"` -} - -// API - local variables -type API struct { - config *Config - lock *sync.Mutex - objects *data.Cache - multiPartObjects map[string]*data.Cache - storedBuckets *metadata.Cache - nodes map[string]node - buckets map[string]bucket -} - -// storedBucket saved bucket -type storedBucket struct { - bucketMetadata BucketMetadata - objectMetadata map[string]ObjectMetadata - partMetadata map[string]map[int]PartMetadata - multiPartSession map[string]MultiPartSession -} - -// New instantiate a new donut -func New() (Interface, *probe.Error) { - var conf *Config - var err *probe.Error - conf, err = LoadConfig() - if err != nil { - conf = &Config{ - Version: "0.0.1", - MaxSize: 512000000, - NodeDiskMap: nil, - DonutName: "", - } - if err := quick.CheckData(conf); err != nil { - return nil, err.Trace() - } - } - a := API{config: conf} - a.storedBuckets = metadata.NewCache() - a.nodes = make(map[string]node) - a.buckets = make(map[string]bucket) - a.objects = data.NewCache(a.config.MaxSize) - a.multiPartObjects = make(map[string]*data.Cache) - a.objects.OnEvicted = a.evictedObject - a.lock = new(sync.Mutex) - - if len(a.config.NodeDiskMap) > 0 { - for k, v := range a.config.NodeDiskMap { - if len(v) == 0 { - return nil, probe.NewError(InvalidDisksArgument{}) - } - err := a.AttachNode(k, v) - if err != nil { - return nil, err.Trace() - } - } - /// Initialization, populate all buckets into memory - buckets, err := a.listBuckets() - if err != nil { - return nil, err.Trace() - } - for k, v := range buckets { - var newBucket = storedBucket{} - newBucket.bucketMetadata = v - newBucket.objectMetadata = make(map[string]ObjectMetadata) - newBucket.multiPartSession = make(map[string]MultiPartSession) - newBucket.partMetadata = make(map[string]map[int]PartMetadata) - a.storedBuckets.Set(k, newBucket) - } - a.Heal() - } - return a, nil -} - -/// V2 API functions - -// GetObject - GET object from cache buffer -func (donut API) GetObject(w io.Writer, bucket string, object string, start, length int64) (int64, *probe.Error) { - donut.lock.Lock() - defer donut.lock.Unlock() - - if !IsValidBucket(bucket) { - return 0, probe.NewError(BucketNameInvalid{Bucket: bucket}) - } - if !IsValidObjectName(object) { - return 0, probe.NewError(ObjectNameInvalid{Object: object}) - } - if start < 0 { - return 0, probe.NewError(InvalidRange{ - Start: start, - Length: length, - }) - } - if !donut.storedBuckets.Exists(bucket) { - return 0, probe.NewError(BucketNotFound{Bucket: bucket}) - } - objectKey := bucket + "/" + object - data, ok := donut.objects.Get(objectKey) - var written int64 - if !ok { - if len(donut.config.NodeDiskMap) > 0 { - reader, size, err := donut.getObject(bucket, object) - if err != nil { - return 0, err.Trace() - } - if start > 0 { - if _, err := io.CopyN(ioutil.Discard, reader, start); err != nil { - return 0, probe.NewError(err) - } - } - // new proxy writer to capture data read from disk - pw := NewProxyWriter(w) - { - var err error - if length > 0 { - written, err = io.CopyN(pw, reader, length) - if err != nil { - return 0, probe.NewError(err) - } - } else { - written, err = io.CopyN(pw, reader, size) - if err != nil { - return 0, probe.NewError(err) - } - } - } - /// cache object read from disk - ok := donut.objects.Append(objectKey, pw.writtenBytes) - pw.writtenBytes = nil - go debug.FreeOSMemory() - if !ok { - return 0, probe.NewError(InternalError{}) - } - return written, nil - } - return 0, probe.NewError(ObjectNotFound{Object: object}) - } - var err error - if start == 0 && length == 0 { - written, err = io.CopyN(w, bytes.NewBuffer(data), int64(donut.objects.Len(objectKey))) - if err != nil { - return 0, probe.NewError(err) - } - return written, nil - } - written, err = io.CopyN(w, bytes.NewBuffer(data[start:]), length) - if err != nil { - return 0, probe.NewError(err) - } - return written, nil -} - -// GetBucketMetadata - -func (donut API) GetBucketMetadata(bucket string) (BucketMetadata, *probe.Error) { - donut.lock.Lock() - defer donut.lock.Unlock() - - if !IsValidBucket(bucket) { - return BucketMetadata{}, probe.NewError(BucketNameInvalid{Bucket: bucket}) - } - if !donut.storedBuckets.Exists(bucket) { - if len(donut.config.NodeDiskMap) > 0 { - bucketMetadata, err := donut.getBucketMetadata(bucket) - if err != nil { - return BucketMetadata{}, err.Trace() - } - storedBucket := donut.storedBuckets.Get(bucket).(storedBucket) - storedBucket.bucketMetadata = bucketMetadata - donut.storedBuckets.Set(bucket, storedBucket) - } - return BucketMetadata{}, probe.NewError(BucketNotFound{Bucket: bucket}) - } - return donut.storedBuckets.Get(bucket).(storedBucket).bucketMetadata, nil -} - -// SetBucketMetadata - -func (donut API) SetBucketMetadata(bucket string, metadata map[string]string) *probe.Error { - donut.lock.Lock() - defer donut.lock.Unlock() - - if !IsValidBucket(bucket) { - return probe.NewError(BucketNameInvalid{Bucket: bucket}) - } - if !donut.storedBuckets.Exists(bucket) { - return probe.NewError(BucketNotFound{Bucket: bucket}) - } - if len(donut.config.NodeDiskMap) > 0 { - if err := donut.setBucketMetadata(bucket, metadata); err != nil { - return err.Trace() - } - } - storedBucket := donut.storedBuckets.Get(bucket).(storedBucket) - storedBucket.bucketMetadata.ACL = BucketACL(metadata["acl"]) - donut.storedBuckets.Set(bucket, storedBucket) - return nil -} - -// isMD5SumEqual - returns error if md5sum mismatches, success its `nil` -func isMD5SumEqual(expectedMD5Sum, actualMD5Sum string) *probe.Error { - if strings.TrimSpace(expectedMD5Sum) != "" && strings.TrimSpace(actualMD5Sum) != "" { - expectedMD5SumBytes, err := hex.DecodeString(expectedMD5Sum) - if err != nil { - return probe.NewError(err) - } - actualMD5SumBytes, err := hex.DecodeString(actualMD5Sum) - if err != nil { - return probe.NewError(err) - } - if !bytes.Equal(expectedMD5SumBytes, actualMD5SumBytes) { - return probe.NewError(BadDigest{}) - } - return nil - } - return probe.NewError(InvalidArgument{}) -} - -// CreateObject - create an object -func (donut API) CreateObject(bucket, key, expectedMD5Sum string, size int64, data io.Reader, metadata map[string]string, signature *signv4.Signature) (ObjectMetadata, *probe.Error) { - donut.lock.Lock() - defer donut.lock.Unlock() - - contentType := metadata["contentType"] - objectMetadata, err := donut.createObject(bucket, key, contentType, expectedMD5Sum, size, data, signature) - // free - debug.FreeOSMemory() - - return objectMetadata, err.Trace() -} - -// createObject - PUT object to cache buffer -func (donut API) createObject(bucket, key, contentType, expectedMD5Sum string, size int64, data io.Reader, signature *signv4.Signature) (ObjectMetadata, *probe.Error) { - if len(donut.config.NodeDiskMap) == 0 { - if size > int64(donut.config.MaxSize) { - generic := GenericObjectError{Bucket: bucket, Object: key} - return ObjectMetadata{}, probe.NewError(EntityTooLarge{ - GenericObjectError: generic, - Size: strconv.FormatInt(size, 10), - MaxSize: strconv.FormatUint(donut.config.MaxSize, 10), - }) - } - } - if !IsValidBucket(bucket) { - return ObjectMetadata{}, probe.NewError(BucketNameInvalid{Bucket: bucket}) - } - if !IsValidObjectName(key) { - return ObjectMetadata{}, probe.NewError(ObjectNameInvalid{Object: key}) - } - if !donut.storedBuckets.Exists(bucket) { - return ObjectMetadata{}, probe.NewError(BucketNotFound{Bucket: bucket}) - } - storedBucket := donut.storedBuckets.Get(bucket).(storedBucket) - // get object key - objectKey := bucket + "/" + key - if _, ok := storedBucket.objectMetadata[objectKey]; ok == true { - return ObjectMetadata{}, probe.NewError(ObjectExists{Object: key}) - } - - if contentType == "" { - contentType = "application/octet-stream" - } - contentType = strings.TrimSpace(contentType) - if strings.TrimSpace(expectedMD5Sum) != "" { - expectedMD5SumBytes, err := base64.StdEncoding.DecodeString(strings.TrimSpace(expectedMD5Sum)) - if err != nil { - // pro-actively close the connection - return ObjectMetadata{}, probe.NewError(InvalidDigest{Md5: expectedMD5Sum}) - } - expectedMD5Sum = hex.EncodeToString(expectedMD5SumBytes) - } - - if len(donut.config.NodeDiskMap) > 0 { - objMetadata, err := donut.putObject( - bucket, - key, - expectedMD5Sum, - data, - size, - map[string]string{ - "contentType": contentType, - "contentLength": strconv.FormatInt(size, 10), - }, - signature, - ) - if err != nil { - return ObjectMetadata{}, err.Trace() - } - storedBucket.objectMetadata[objectKey] = objMetadata - donut.storedBuckets.Set(bucket, storedBucket) - return objMetadata, nil - } - - // calculate md5 - hash := md5.New() - sha256hash := sha256.New() - - var err error - var totalLength int64 - for err == nil { - var length int - byteBuffer := make([]byte, 1024*1024) - length, err = data.Read(byteBuffer) - if length != 0 { - hash.Write(byteBuffer[0:length]) - sha256hash.Write(byteBuffer[0:length]) - ok := donut.objects.Append(objectKey, byteBuffer[0:length]) - if !ok { - return ObjectMetadata{}, probe.NewError(InternalError{}) - } - totalLength += int64(length) - go debug.FreeOSMemory() - } - } - if size != 0 { - if totalLength != size { - // Delete perhaps the object is already saved, due to the nature of append() - donut.objects.Delete(objectKey) - return ObjectMetadata{}, probe.NewError(IncompleteBody{Bucket: bucket, Object: key}) - } - } - if err != io.EOF { - return ObjectMetadata{}, probe.NewError(err) - } - md5SumBytes := hash.Sum(nil) - md5Sum := hex.EncodeToString(md5SumBytes) - // Verify if the written object is equal to what is expected, only if it is requested as such - if strings.TrimSpace(expectedMD5Sum) != "" { - if err := isMD5SumEqual(strings.TrimSpace(expectedMD5Sum), md5Sum); err != nil { - // Delete perhaps the object is already saved, due to the nature of append() - donut.objects.Delete(objectKey) - return ObjectMetadata{}, probe.NewError(BadDigest{}) - } - } - if signature != nil { - ok, err := signature.DoesSignatureMatch(hex.EncodeToString(sha256hash.Sum(nil))) - if err != nil { - // Delete perhaps the object is already saved, due to the nature of append() - donut.objects.Delete(objectKey) - return ObjectMetadata{}, err.Trace() - } - if !ok { - // Delete perhaps the object is already saved, due to the nature of append() - donut.objects.Delete(objectKey) - return ObjectMetadata{}, probe.NewError(signv4.DoesNotMatch{}) - } - } - - m := make(map[string]string) - m["contentType"] = contentType - newObject := ObjectMetadata{ - Bucket: bucket, - Object: key, - - Metadata: m, - Created: time.Now().UTC(), - MD5Sum: md5Sum, - Size: int64(totalLength), - } - - storedBucket.objectMetadata[objectKey] = newObject - donut.storedBuckets.Set(bucket, storedBucket) - return newObject, nil -} - -// MakeBucket - create bucket in cache -func (donut API) MakeBucket(bucketName, acl string, location io.Reader, signature *signv4.Signature) *probe.Error { - donut.lock.Lock() - defer donut.lock.Unlock() - - // do not have to parse location constraint, using this just for signature verification - locationSum := "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" - if location != nil { - locationConstraintBytes, err := ioutil.ReadAll(location) - if err != nil { - return probe.NewError(InternalError{}) - } - locationSum = hex.EncodeToString(sha256.Sum256(locationConstraintBytes)[:]) - } - - if signature != nil { - ok, err := signature.DoesSignatureMatch(locationSum) - if err != nil { - return err.Trace() - } - if !ok { - return probe.NewError(signv4.DoesNotMatch{}) - } - } - - if donut.storedBuckets.Stats().Items == totalBuckets { - return probe.NewError(TooManyBuckets{Bucket: bucketName}) - } - if !IsValidBucket(bucketName) { - return probe.NewError(BucketNameInvalid{Bucket: bucketName}) - } - if !IsValidBucketACL(acl) { - return probe.NewError(InvalidACL{ACL: acl}) - } - if donut.storedBuckets.Exists(bucketName) { - return probe.NewError(BucketExists{Bucket: bucketName}) - } - - if strings.TrimSpace(acl) == "" { - // default is private - acl = "private" - } - if len(donut.config.NodeDiskMap) > 0 { - if err := donut.makeBucket(bucketName, BucketACL(acl)); err != nil { - return err.Trace() - } - } - var newBucket = storedBucket{} - newBucket.objectMetadata = make(map[string]ObjectMetadata) - newBucket.multiPartSession = make(map[string]MultiPartSession) - newBucket.partMetadata = make(map[string]map[int]PartMetadata) - newBucket.bucketMetadata = BucketMetadata{} - newBucket.bucketMetadata.Name = bucketName - newBucket.bucketMetadata.Created = time.Now().UTC() - newBucket.bucketMetadata.ACL = BucketACL(acl) - donut.storedBuckets.Set(bucketName, newBucket) - return nil -} - -// ListObjects - list objects from cache -func (donut API) ListObjects(bucket string, resources BucketResourcesMetadata) ([]ObjectMetadata, BucketResourcesMetadata, *probe.Error) { - donut.lock.Lock() - defer donut.lock.Unlock() - - if !IsValidBucket(bucket) { - return nil, BucketResourcesMetadata{IsTruncated: false}, probe.NewError(BucketNameInvalid{Bucket: bucket}) - } - if !IsValidPrefix(resources.Prefix) { - return nil, BucketResourcesMetadata{IsTruncated: false}, probe.NewError(ObjectNameInvalid{Object: resources.Prefix}) - } - if !donut.storedBuckets.Exists(bucket) { - return nil, BucketResourcesMetadata{IsTruncated: false}, probe.NewError(BucketNotFound{Bucket: bucket}) - } - var results []ObjectMetadata - var keys []string - if len(donut.config.NodeDiskMap) > 0 { - listObjects, err := donut.listObjects( - bucket, - resources.Prefix, - resources.Marker, - resources.Delimiter, - resources.Maxkeys, - ) - if err != nil { - return nil, BucketResourcesMetadata{IsTruncated: false}, err.Trace() - } - resources.CommonPrefixes = listObjects.CommonPrefixes - resources.IsTruncated = listObjects.IsTruncated - for key := range listObjects.Objects { - keys = append(keys, key) - } - sort.Strings(keys) - for _, key := range keys { - results = append(results, listObjects.Objects[key]) - } - if resources.IsTruncated && resources.Delimiter != "" { - resources.NextMarker = results[len(results)-1].Object - } - return results, resources, nil - } - storedBucket := donut.storedBuckets.Get(bucket).(storedBucket) - for key := range storedBucket.objectMetadata { - if strings.HasPrefix(key, bucket+"/") { - key = key[len(bucket)+1:] - if strings.HasPrefix(key, resources.Prefix) { - if key > resources.Marker { - keys = append(keys, key) - } - } - } - } - if strings.TrimSpace(resources.Prefix) != "" { - keys = TrimPrefix(keys, resources.Prefix) - } - var prefixes []string - var filteredKeys []string - filteredKeys = keys - if strings.TrimSpace(resources.Delimiter) != "" { - filteredKeys = HasNoDelimiter(keys, resources.Delimiter) - prefixes = HasDelimiter(keys, resources.Delimiter) - prefixes = SplitDelimiter(prefixes, resources.Delimiter) - prefixes = SortUnique(prefixes) - } - for _, commonPrefix := range prefixes { - resources.CommonPrefixes = append(resources.CommonPrefixes, resources.Prefix+commonPrefix) - } - filteredKeys = RemoveDuplicates(filteredKeys) - sort.Strings(filteredKeys) - - for _, key := range filteredKeys { - if len(results) == resources.Maxkeys { - resources.IsTruncated = true - if resources.IsTruncated && resources.Delimiter != "" { - resources.NextMarker = results[len(results)-1].Object - } - return results, resources, nil - } - object := storedBucket.objectMetadata[bucket+"/"+resources.Prefix+key] - results = append(results, object) - } - resources.CommonPrefixes = RemoveDuplicates(resources.CommonPrefixes) - sort.Strings(resources.CommonPrefixes) - return results, resources, nil -} - -// byBucketName is a type for sorting bucket metadata by bucket name -type byBucketName []BucketMetadata - -func (b byBucketName) Len() int { return len(b) } -func (b byBucketName) Swap(i, j int) { b[i], b[j] = b[j], b[i] } -func (b byBucketName) Less(i, j int) bool { return b[i].Name < b[j].Name } - -// ListBuckets - List buckets from cache -func (donut API) ListBuckets() ([]BucketMetadata, *probe.Error) { - donut.lock.Lock() - defer donut.lock.Unlock() - - var results []BucketMetadata - if len(donut.config.NodeDiskMap) > 0 { - buckets, err := donut.listBuckets() - if err != nil { - return nil, err.Trace() - } - for _, bucketMetadata := range buckets { - results = append(results, bucketMetadata) - } - sort.Sort(byBucketName(results)) - return results, nil - } - for _, bucket := range donut.storedBuckets.GetAll() { - results = append(results, bucket.(storedBucket).bucketMetadata) - } - sort.Sort(byBucketName(results)) - return results, nil -} - -// GetObjectMetadata - get object metadata from cache -func (donut API) GetObjectMetadata(bucket, key string) (ObjectMetadata, *probe.Error) { - donut.lock.Lock() - defer donut.lock.Unlock() - - // check if bucket exists - if !IsValidBucket(bucket) { - return ObjectMetadata{}, probe.NewError(BucketNameInvalid{Bucket: bucket}) - } - if !IsValidObjectName(key) { - return ObjectMetadata{}, probe.NewError(ObjectNameInvalid{Object: key}) - } - if !donut.storedBuckets.Exists(bucket) { - return ObjectMetadata{}, probe.NewError(BucketNotFound{Bucket: bucket}) - } - storedBucket := donut.storedBuckets.Get(bucket).(storedBucket) - objectKey := bucket + "/" + key - if objMetadata, ok := storedBucket.objectMetadata[objectKey]; ok == true { - return objMetadata, nil - } - if len(donut.config.NodeDiskMap) > 0 { - objMetadata, err := donut.getObjectMetadata(bucket, key) - if err != nil { - return ObjectMetadata{}, err.Trace() - } - // update - storedBucket.objectMetadata[objectKey] = objMetadata - donut.storedBuckets.Set(bucket, storedBucket) - return objMetadata, nil - } - return ObjectMetadata{}, probe.NewError(ObjectNotFound{Object: key}) -} - -// evictedObject callback function called when an item is evicted from memory -func (donut API) evictedObject(a ...interface{}) { - cacheStats := donut.objects.Stats() - log.Printf("CurrentSize: %d, CurrentItems: %d, TotalEvicted: %d", - cacheStats.Bytes, cacheStats.Items, cacheStats.Evicted) - key := a[0].(string) - // loop through all buckets - for _, bucket := range donut.storedBuckets.GetAll() { - delete(bucket.(storedBucket).objectMetadata, key) - } - debug.FreeOSMemory() -} diff --git a/pkg/donut/donut-v2_test.go b/pkg/donut/donut-v2_test.go deleted file mode 100644 index 7474cc25c..000000000 --- a/pkg/donut/donut-v2_test.go +++ /dev/null @@ -1,265 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 impliedc. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package donut - -import ( - "bytes" - "crypto/md5" - "encoding/base64" - "encoding/hex" - "io/ioutil" - "os" - "path/filepath" - "testing" - - . "gopkg.in/check.v1" -) - -func TestCache(t *testing.T) { TestingT(t) } - -type MyCacheSuite struct { - root string -} - -var _ = Suite(&MyCacheSuite{}) - -var dc Interface - -func (s *MyCacheSuite) SetUpSuite(c *C) { - root, err := ioutil.TempDir(os.TempDir(), "donut-") - c.Assert(err, IsNil) - s.root = root - - SetDonutConfigPath(filepath.Join(root, "donut.json")) - dc, _ = New() - - // testing empty cache - var buckets []BucketMetadata - buckets, perr := dc.ListBuckets() - c.Assert(perr, IsNil) - c.Assert(len(buckets), Equals, 0) -} - -func (s *MyCacheSuite) TearDownSuite(c *C) { - os.RemoveAll(s.root) -} - -// test make bucket without name -func (s *MyCacheSuite) TestBucketWithoutNameFails(c *C) { - // fail to create new bucket without a name - err := dc.MakeBucket("", "private", nil, nil) - c.Assert(err, Not(IsNil)) - - err = dc.MakeBucket(" ", "private", nil, nil) - c.Assert(err, Not(IsNil)) -} - -// test empty bucket -func (s *MyCacheSuite) TestEmptyBucket(c *C) { - c.Assert(dc.MakeBucket("foo1", "private", nil, nil), IsNil) - // check if bucket is empty - var resources BucketResourcesMetadata - resources.Maxkeys = 1 - objectsMetadata, resources, err := dc.ListObjects("foo1", resources) - c.Assert(err, IsNil) - c.Assert(len(objectsMetadata), Equals, 0) - c.Assert(resources.CommonPrefixes, DeepEquals, []string{}) - c.Assert(resources.IsTruncated, Equals, false) -} - -// test bucket list -func (s *MyCacheSuite) TestMakeBucketAndList(c *C) { - // create bucket - err := dc.MakeBucket("foo2", "private", nil, nil) - c.Assert(err, IsNil) - - // check bucket exists - buckets, err := dc.ListBuckets() - c.Assert(err, IsNil) - c.Assert(len(buckets), Equals, 5) - c.Assert(buckets[0].ACL, Equals, BucketACL("private")) -} - -// test re-create bucket -func (s *MyCacheSuite) TestMakeBucketWithSameNameFails(c *C) { - err := dc.MakeBucket("foo3", "private", nil, nil) - c.Assert(err, IsNil) - - err = dc.MakeBucket("foo3", "private", nil, nil) - c.Assert(err, Not(IsNil)) -} - -// test make multiple buckets -func (s *MyCacheSuite) TestCreateMultipleBucketsAndList(c *C) { - // add a second bucket - err := dc.MakeBucket("foo4", "private", nil, nil) - c.Assert(err, IsNil) - - err = dc.MakeBucket("bar1", "private", nil, nil) - c.Assert(err, IsNil) - - buckets, err := dc.ListBuckets() - c.Assert(err, IsNil) - - c.Assert(len(buckets), Equals, 2) - c.Assert(buckets[0].Name, Equals, "bar1") - c.Assert(buckets[1].Name, Equals, "foo4") - - err = dc.MakeBucket("foobar1", "private", nil, nil) - c.Assert(err, IsNil) - - buckets, err = dc.ListBuckets() - c.Assert(err, IsNil) - - c.Assert(len(buckets), Equals, 3) - c.Assert(buckets[2].Name, Equals, "foobar1") -} - -// test object create without bucket -func (s *MyCacheSuite) TestNewObjectFailsWithoutBucket(c *C) { - _, err := dc.CreateObject("unknown", "obj", "", 0, nil, nil, nil) - c.Assert(err, Not(IsNil)) -} - -// test create object metadata -func (s *MyCacheSuite) TestNewObjectMetadata(c *C) { - data := "Hello World" - hasher := md5.New() - hasher.Write([]byte(data)) - expectedMd5Sum := base64.StdEncoding.EncodeToString(hasher.Sum(nil)) - reader := ioutil.NopCloser(bytes.NewReader([]byte(data))) - - err := dc.MakeBucket("foo6", "private", nil, nil) - c.Assert(err, IsNil) - - objectMetadata, err := dc.CreateObject("foo6", "obj", expectedMd5Sum, int64(len(data)), reader, map[string]string{"contentType": "application/json"}, nil) - c.Assert(err, IsNil) - c.Assert(objectMetadata.MD5Sum, Equals, hex.EncodeToString(hasher.Sum(nil))) - c.Assert(objectMetadata.Metadata["contentType"], Equals, "application/json") -} - -// test create object fails without name -func (s *MyCacheSuite) TestNewObjectFailsWithEmptyName(c *C) { - _, err := dc.CreateObject("foo", "", "", 0, nil, nil, nil) - c.Assert(err, Not(IsNil)) -} - -// test create object -func (s *MyCacheSuite) TestNewObjectCanBeWritten(c *C) { - err := dc.MakeBucket("foo", "private", nil, nil) - c.Assert(err, IsNil) - - data := "Hello World" - - hasher := md5.New() - hasher.Write([]byte(data)) - expectedMd5Sum := base64.StdEncoding.EncodeToString(hasher.Sum(nil)) - reader := ioutil.NopCloser(bytes.NewReader([]byte(data))) - - actualMetadata, err := dc.CreateObject("foo", "obj", expectedMd5Sum, int64(len(data)), reader, map[string]string{"contentType": "application/octet-stream"}, nil) - c.Assert(err, IsNil) - c.Assert(actualMetadata.MD5Sum, Equals, hex.EncodeToString(hasher.Sum(nil))) - - var buffer bytes.Buffer - size, err := dc.GetObject(&buffer, "foo", "obj", 0, 0) - c.Assert(err, IsNil) - c.Assert(size, Equals, int64(len(data))) - c.Assert(buffer.Bytes(), DeepEquals, []byte(data)) - - actualMetadata, err = dc.GetObjectMetadata("foo", "obj") - c.Assert(err, IsNil) - c.Assert(hex.EncodeToString(hasher.Sum(nil)), Equals, actualMetadata.MD5Sum) - c.Assert(int64(len(data)), Equals, actualMetadata.Size) -} - -// test list objects -func (s *MyCacheSuite) TestMultipleNewObjects(c *C) { - c.Assert(dc.MakeBucket("foo5", "private", nil, nil), IsNil) - - one := ioutil.NopCloser(bytes.NewReader([]byte("one"))) - - _, err := dc.CreateObject("foo5", "obj1", "", int64(len("one")), one, nil, nil) - c.Assert(err, IsNil) - - two := ioutil.NopCloser(bytes.NewReader([]byte("two"))) - _, err = dc.CreateObject("foo5", "obj2", "", int64(len("two")), two, nil, nil) - c.Assert(err, IsNil) - - var buffer1 bytes.Buffer - size, err := dc.GetObject(&buffer1, "foo5", "obj1", 0, 0) - c.Assert(err, IsNil) - c.Assert(size, Equals, int64(len([]byte("one")))) - c.Assert(buffer1.Bytes(), DeepEquals, []byte("one")) - - var buffer2 bytes.Buffer - size, err = dc.GetObject(&buffer2, "foo5", "obj2", 0, 0) - c.Assert(err, IsNil) - c.Assert(size, Equals, int64(len([]byte("two")))) - - c.Assert(buffer2.Bytes(), DeepEquals, []byte("two")) - - /// test list of objects - - // test list objects with prefix and delimiter - var resources BucketResourcesMetadata - resources.Prefix = "o" - resources.Delimiter = "1" - resources.Maxkeys = 10 - objectsMetadata, resources, err := dc.ListObjects("foo5", resources) - c.Assert(err, IsNil) - c.Assert(resources.IsTruncated, Equals, false) - c.Assert(resources.CommonPrefixes[0], Equals, "obj1") - - // test list objects with only delimiter - resources.Prefix = "" - resources.Delimiter = "1" - resources.Maxkeys = 10 - objectsMetadata, resources, err = dc.ListObjects("foo5", resources) - c.Assert(err, IsNil) - c.Assert(objectsMetadata[0].Object, Equals, "obj2") - c.Assert(resources.IsTruncated, Equals, false) - c.Assert(resources.CommonPrefixes[0], Equals, "obj1") - - // test list objects with only prefix - resources.Prefix = "o" - resources.Delimiter = "" - resources.Maxkeys = 10 - objectsMetadata, resources, err = dc.ListObjects("foo5", resources) - c.Assert(err, IsNil) - c.Assert(resources.IsTruncated, Equals, false) - c.Assert(objectsMetadata[0].Object, Equals, "obj1") - c.Assert(objectsMetadata[1].Object, Equals, "obj2") - - three := ioutil.NopCloser(bytes.NewReader([]byte("three"))) - _, err = dc.CreateObject("foo5", "obj3", "", int64(len("three")), three, nil, nil) - c.Assert(err, IsNil) - - var buffer bytes.Buffer - size, err = dc.GetObject(&buffer, "foo5", "obj3", 0, 0) - c.Assert(err, IsNil) - c.Assert(size, Equals, int64(len([]byte("three")))) - c.Assert(buffer.Bytes(), DeepEquals, []byte("three")) - - // test list objects with maxkeys - resources.Prefix = "o" - resources.Delimiter = "" - resources.Maxkeys = 2 - objectsMetadata, resources, err = dc.ListObjects("foo5", resources) - c.Assert(err, IsNil) - c.Assert(resources.IsTruncated, Equals, true) - c.Assert(len(objectsMetadata), Equals, 2) -} diff --git a/pkg/donut/encoder.go b/pkg/donut/encoder.go deleted file mode 100644 index 056ea586f..000000000 --- a/pkg/donut/encoder.go +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 donut - -import ( - encoding "github.com/minio/minio/pkg/erasure" - "github.com/minio/minio/pkg/probe" -) - -// encoder internal struct -type encoder struct { - encoder *encoding.Erasure - k, m uint8 -} - -// newEncoder - instantiate a new encoder -func newEncoder(k, m uint8) (encoder, *probe.Error) { - e := encoder{} - params, err := encoding.ValidateParams(k, m) - if err != nil { - return encoder{}, probe.NewError(err) - } - e.encoder = encoding.NewErasure(params) - e.k = k - e.m = m - return e, nil -} - -// TODO - think again if this is needed -// GetEncodedBlockLen - wrapper around erasure function with the same name -func (e encoder) GetEncodedBlockLen(dataLength int) (int, *probe.Error) { - if dataLength <= 0 { - return 0, probe.NewError(InvalidArgument{}) - } - return encoding.GetEncodedBlockLen(dataLength, e.k), nil -} - -// Encode - erasure code input bytes -func (e encoder) Encode(data []byte) ([][]byte, *probe.Error) { - if data == nil { - return nil, probe.NewError(InvalidArgument{}) - } - encodedData, err := e.encoder.Encode(data) - if err != nil { - return nil, probe.NewError(err) - } - return encodedData, nil -} - -// Decode - erasure decode input encoded bytes -func (e encoder) Decode(encodedData [][]byte, dataLength int) ([]byte, *probe.Error) { - decodedData, err := e.encoder.Decode(encodedData, dataLength) - if err != nil { - return nil, probe.NewError(err) - } - return decodedData, nil -} diff --git a/pkg/donut/heal.go b/pkg/donut/heal.go deleted file mode 100644 index e496c5b3a..000000000 --- a/pkg/donut/heal.go +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 donut - -import ( - "encoding/json" - "fmt" - "path/filepath" - - "github.com/minio/minio/pkg/donut/disk" - "github.com/minio/minio/pkg/probe" -) - -// healBuckets heal bucket slices -func (donut API) healBuckets() *probe.Error { - if err := donut.listDonutBuckets(); err != nil { - return err.Trace() - } - bucketMetadata, err := donut.getDonutBucketMetadata() - if err != nil { - return err.Trace() - } - disks := make(map[int]disk.Disk) - for _, node := range donut.nodes { - nDisks, err := node.ListDisks() - if err != nil { - return err.Trace() - } - for k, v := range nDisks { - disks[k] = v - } - } - for order, disk := range disks { - if disk.IsUsable() { - disk.MakeDir(donut.config.DonutName) - bucketMetadataWriter, err := disk.CreateFile(filepath.Join(donut.config.DonutName, bucketMetadataConfig)) - if err != nil { - return err.Trace() - } - defer bucketMetadataWriter.Close() - jenc := json.NewEncoder(bucketMetadataWriter) - if err := jenc.Encode(bucketMetadata); err != nil { - return probe.NewError(err) - } - for bucket := range bucketMetadata.Buckets { - bucketSlice := fmt.Sprintf("%s$0$%d", bucket, order) // TODO handle node slices - err := disk.MakeDir(filepath.Join(donut.config.DonutName, bucketSlice)) - if err != nil { - return err.Trace() - } - } - } - } - return nil -} diff --git a/pkg/donut/interfaces.go b/pkg/donut/interfaces.go deleted file mode 100644 index bbf17ca8e..000000000 --- a/pkg/donut/interfaces.go +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 donut - -import ( - "io" - - "github.com/minio/minio/pkg/probe" - signv4 "github.com/minio/minio/pkg/signature" -) - -// Collection of Donut specification interfaces - -// Interface is a collection of cloud storage and management interface -type Interface interface { - CloudStorage - Management -} - -// CloudStorage is a donut cloud storage interface -type CloudStorage interface { - // Storage service operations - GetBucketMetadata(bucket string) (BucketMetadata, *probe.Error) - SetBucketMetadata(bucket string, metadata map[string]string) *probe.Error - ListBuckets() ([]BucketMetadata, *probe.Error) - MakeBucket(bucket string, ACL string, location io.Reader, signature *signv4.Signature) *probe.Error - - // Bucket operations - ListObjects(string, BucketResourcesMetadata) ([]ObjectMetadata, BucketResourcesMetadata, *probe.Error) - - // Object operations - GetObject(w io.Writer, bucket, object string, start, length int64) (int64, *probe.Error) - GetObjectMetadata(bucket, object string) (ObjectMetadata, *probe.Error) - // bucket, object, expectedMD5Sum, size, reader, metadata, signature - CreateObject(string, string, string, int64, io.Reader, map[string]string, *signv4.Signature) (ObjectMetadata, *probe.Error) - - Multipart -} - -// Multipart API -type Multipart interface { - NewMultipartUpload(bucket, key, contentType string) (string, *probe.Error) - AbortMultipartUpload(bucket, key, uploadID string) *probe.Error - CreateObjectPart(string, string, string, int, string, string, int64, io.Reader, *signv4.Signature) (string, *probe.Error) - CompleteMultipartUpload(bucket, key, uploadID string, data io.Reader, signature *signv4.Signature) (ObjectMetadata, *probe.Error) - ListMultipartUploads(string, BucketMultipartResourcesMetadata) (BucketMultipartResourcesMetadata, *probe.Error) - ListObjectParts(string, string, ObjectResourcesMetadata) (ObjectResourcesMetadata, *probe.Error) -} - -// Management is a donut management system interface -type Management interface { - Heal() *probe.Error - Rebalance() *probe.Error - Info() (map[string][]string, *probe.Error) - - AttachNode(hostname string, disks []string) *probe.Error - DetachNode(hostname string) *probe.Error -} diff --git a/pkg/donut/management.go b/pkg/donut/management.go deleted file mode 100644 index 59084e3e4..000000000 --- a/pkg/donut/management.go +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 donut - -import ( - "github.com/minio/minio/pkg/donut/disk" - "github.com/minio/minio/pkg/probe" -) - -// Info - return info about donut configuration -func (donut API) Info() (nodeDiskMap map[string][]string, err *probe.Error) { - nodeDiskMap = make(map[string][]string) - for nodeName, n := range donut.nodes { - disks, err := n.ListDisks() - if err != nil { - return nil, err.Trace() - } - diskList := make([]string, len(disks)) - for diskOrder, disk := range disks { - diskList[diskOrder] = disk.GetPath() - } - nodeDiskMap[nodeName] = diskList - } - return nodeDiskMap, nil -} - -// AttachNode - attach node -func (donut API) AttachNode(hostname string, disks []string) *probe.Error { - if hostname == "" || len(disks) == 0 { - return probe.NewError(InvalidArgument{}) - } - n, err := newNode(hostname) - if err != nil { - return err.Trace() - } - donut.nodes[hostname] = n - for i, d := range disks { - newDisk, err := disk.New(d) - if err != nil { - continue - } - if err := newDisk.MakeDir(donut.config.DonutName); err != nil { - return err.Trace() - } - if err := n.AttachDisk(newDisk, i); err != nil { - return err.Trace() - } - } - return nil -} - -// DetachNode - detach node -func (donut API) DetachNode(hostname string) *probe.Error { - delete(donut.nodes, hostname) - return nil -} - -// Rebalance - rebalance an existing donut with new disks and nodes -func (donut API) Rebalance() *probe.Error { - return probe.NewError(APINotImplemented{API: "management.Rebalance"}) -} - -// Heal - heal your donuts -func (donut API) Heal() *probe.Error { - // TODO handle data heal - return donut.healBuckets() -} diff --git a/pkg/donut/multipart.go b/pkg/donut/multipart.go deleted file mode 100644 index 80e4448fa..000000000 --- a/pkg/donut/multipart.go +++ /dev/null @@ -1,513 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 donut - -import ( - "bytes" - "crypto/md5" - "crypto/sha512" - "encoding/base64" - "encoding/hex" - "encoding/xml" - - "io" - "io/ioutil" - "math/rand" - "runtime/debug" - "sort" - "strconv" - "strings" - "time" - - "github.com/minio/minio/pkg/crypto/sha256" - "github.com/minio/minio/pkg/donut/cache/data" - "github.com/minio/minio/pkg/probe" - signv4 "github.com/minio/minio/pkg/signature" -) - -/// V2 API functions - -// NewMultipartUpload - initiate a new multipart session -func (donut API) NewMultipartUpload(bucket, key, contentType string) (string, *probe.Error) { - donut.lock.Lock() - defer donut.lock.Unlock() - - if !IsValidBucket(bucket) { - return "", probe.NewError(BucketNameInvalid{Bucket: bucket}) - } - if !IsValidObjectName(key) { - return "", probe.NewError(ObjectNameInvalid{Object: key}) - } - // if len(donut.config.NodeDiskMap) > 0 { - // return donut.newMultipartUpload(bucket, key, contentType) - // } - if !donut.storedBuckets.Exists(bucket) { - return "", probe.NewError(BucketNotFound{Bucket: bucket}) - } - storedBucket := donut.storedBuckets.Get(bucket).(storedBucket) - objectKey := bucket + "/" + key - if _, ok := storedBucket.objectMetadata[objectKey]; ok == true { - return "", probe.NewError(ObjectExists{Object: key}) - } - id := []byte(strconv.Itoa(rand.Int()) + bucket + key + time.Now().UTC().String()) - uploadIDSum := sha512.Sum512(id) - uploadID := base64.URLEncoding.EncodeToString(uploadIDSum[:])[:47] - - storedBucket.multiPartSession[key] = MultiPartSession{ - UploadID: uploadID, - Initiated: time.Now().UTC(), - TotalParts: 0, - } - storedBucket.partMetadata[key] = make(map[int]PartMetadata) - multiPartCache := data.NewCache(0) - multiPartCache.OnEvicted = donut.evictedPart - donut.multiPartObjects[uploadID] = multiPartCache - donut.storedBuckets.Set(bucket, storedBucket) - return uploadID, nil -} - -// AbortMultipartUpload - abort an incomplete multipart session -func (donut API) AbortMultipartUpload(bucket, key, uploadID string) *probe.Error { - donut.lock.Lock() - defer donut.lock.Unlock() - - if !IsValidBucket(bucket) { - return probe.NewError(BucketNameInvalid{Bucket: bucket}) - } - if !IsValidObjectName(key) { - return probe.NewError(ObjectNameInvalid{Object: key}) - } - // TODO: multipart support for donut is broken, since we haven't finalized the format in which - // it can be stored, disabling this for now until we get the underlying layout stable. - // - // if len(donut.config.NodeDiskMap) > 0 { - // return donut.abortMultipartUpload(bucket, key, uploadID) - // } - if !donut.storedBuckets.Exists(bucket) { - return probe.NewError(BucketNotFound{Bucket: bucket}) - } - storedBucket := donut.storedBuckets.Get(bucket).(storedBucket) - if storedBucket.multiPartSession[key].UploadID != uploadID { - return probe.NewError(InvalidUploadID{UploadID: uploadID}) - } - donut.cleanupMultipartSession(bucket, key, uploadID) - return nil -} - -// CreateObjectPart - create a part in a multipart session -func (donut API) CreateObjectPart(bucket, key, uploadID string, partID int, contentType, expectedMD5Sum string, size int64, data io.Reader, signature *signv4.Signature) (string, *probe.Error) { - donut.lock.Lock() - etag, err := donut.createObjectPart(bucket, key, uploadID, partID, "", expectedMD5Sum, size, data, signature) - donut.lock.Unlock() - // possible free - debug.FreeOSMemory() - - return etag, err.Trace() -} - -// createObject - internal wrapper function called by CreateObjectPart -func (donut API) createObjectPart(bucket, key, uploadID string, partID int, contentType, expectedMD5Sum string, size int64, data io.Reader, signature *signv4.Signature) (string, *probe.Error) { - if !IsValidBucket(bucket) { - return "", probe.NewError(BucketNameInvalid{Bucket: bucket}) - } - if !IsValidObjectName(key) { - return "", probe.NewError(ObjectNameInvalid{Object: key}) - } - // TODO: multipart support for donut is broken, since we haven't finalized the format in which - // it can be stored, disabling this for now until we get the underlying layout stable. - // - /* - if len(donut.config.NodeDiskMap) > 0 { - metadata := make(map[string]string) - if contentType == "" { - contentType = "application/octet-stream" - } - contentType = strings.TrimSpace(contentType) - metadata["contentType"] = contentType - if strings.TrimSpace(expectedMD5Sum) != "" { - expectedMD5SumBytes, err := base64.StdEncoding.DecodeString(strings.TrimSpace(expectedMD5Sum)) - if err != nil { - // pro-actively close the connection - return "", probe.NewError(InvalidDigest{Md5: expectedMD5Sum}) - } - expectedMD5Sum = hex.EncodeToString(expectedMD5SumBytes) - } - partMetadata, err := donut.putObjectPart(bucket, key, expectedMD5Sum, uploadID, partID, data, size, metadata, signature) - if err != nil { - return "", err.Trace() - } - return partMetadata.ETag, nil - } - */ - if !donut.storedBuckets.Exists(bucket) { - return "", probe.NewError(BucketNotFound{Bucket: bucket}) - } - strBucket := donut.storedBuckets.Get(bucket).(storedBucket) - // Verify upload id - if strBucket.multiPartSession[key].UploadID != uploadID { - return "", probe.NewError(InvalidUploadID{UploadID: uploadID}) - } - - // get object key - parts := strBucket.partMetadata[key] - if _, ok := parts[partID]; ok { - return parts[partID].ETag, nil - } - - if contentType == "" { - contentType = "application/octet-stream" - } - contentType = strings.TrimSpace(contentType) - if strings.TrimSpace(expectedMD5Sum) != "" { - expectedMD5SumBytes, err := base64.StdEncoding.DecodeString(strings.TrimSpace(expectedMD5Sum)) - if err != nil { - // pro-actively close the connection - return "", probe.NewError(InvalidDigest{Md5: expectedMD5Sum}) - } - expectedMD5Sum = hex.EncodeToString(expectedMD5SumBytes) - } - - // calculate md5 - hash := md5.New() - sha256hash := sha256.New() - - var totalLength int64 - var err error - for err == nil { - var length int - byteBuffer := make([]byte, 1024*1024) - length, err = data.Read(byteBuffer) // do not read error return error here, we will handle this error later - if length != 0 { - hash.Write(byteBuffer[0:length]) - sha256hash.Write(byteBuffer[0:length]) - ok := donut.multiPartObjects[uploadID].Append(partID, byteBuffer[0:length]) - if !ok { - return "", probe.NewError(InternalError{}) - } - totalLength += int64(length) - go debug.FreeOSMemory() - } - } - if totalLength != size { - donut.multiPartObjects[uploadID].Delete(partID) - return "", probe.NewError(IncompleteBody{Bucket: bucket, Object: key}) - } - if err != io.EOF { - return "", probe.NewError(err) - } - - md5SumBytes := hash.Sum(nil) - md5Sum := hex.EncodeToString(md5SumBytes) - // Verify if the written object is equal to what is expected, only if it is requested as such - if strings.TrimSpace(expectedMD5Sum) != "" { - if err := isMD5SumEqual(strings.TrimSpace(expectedMD5Sum), md5Sum); err != nil { - return "", err.Trace() - } - } - - if signature != nil { - { - ok, err := signature.DoesSignatureMatch(hex.EncodeToString(sha256hash.Sum(nil))) - if err != nil { - return "", err.Trace() - } - if !ok { - return "", probe.NewError(signv4.DoesNotMatch{}) - } - } - } - - newPart := PartMetadata{ - PartNumber: partID, - LastModified: time.Now().UTC(), - ETag: md5Sum, - Size: totalLength, - } - - parts[partID] = newPart - strBucket.partMetadata[key] = parts - multiPartSession := strBucket.multiPartSession[key] - multiPartSession.TotalParts++ - strBucket.multiPartSession[key] = multiPartSession - donut.storedBuckets.Set(bucket, strBucket) - return md5Sum, nil -} - -// cleanupMultipartSession invoked during an abort or complete multipart session to cleanup session from memory -func (donut API) cleanupMultipartSession(bucket, key, uploadID string) { - storedBucket := donut.storedBuckets.Get(bucket).(storedBucket) - for i := 1; i <= storedBucket.multiPartSession[key].TotalParts; i++ { - donut.multiPartObjects[uploadID].Delete(i) - } - delete(storedBucket.multiPartSession, key) - delete(storedBucket.partMetadata, key) - donut.storedBuckets.Set(bucket, storedBucket) -} - -func (donut API) mergeMultipart(parts *CompleteMultipartUpload, uploadID string, fullObjectWriter *io.PipeWriter) { - for _, part := range parts.Part { - recvMD5 := part.ETag - object, ok := donut.multiPartObjects[uploadID].Get(part.PartNumber) - if ok == false { - fullObjectWriter.CloseWithError(probe.WrapError(probe.NewError(InvalidPart{}))) - return - } - calcMD5Bytes := md5.Sum(object) - // complete multi part request header md5sum per part is hex encoded - recvMD5Bytes, err := hex.DecodeString(strings.Trim(recvMD5, "\"")) - if err != nil { - fullObjectWriter.CloseWithError(probe.WrapError(probe.NewError(InvalidDigest{Md5: recvMD5}))) - return - } - if !bytes.Equal(recvMD5Bytes, calcMD5Bytes[:]) { - fullObjectWriter.CloseWithError(probe.WrapError(probe.NewError(BadDigest{}))) - return - } - - if _, err := io.Copy(fullObjectWriter, bytes.NewReader(object)); err != nil { - fullObjectWriter.CloseWithError(probe.WrapError(probe.NewError(err))) - return - } - object = nil - } - fullObjectWriter.Close() - return -} - -// CompleteMultipartUpload - complete a multipart upload and persist the data -func (donut API) CompleteMultipartUpload(bucket, key, uploadID string, data io.Reader, signature *signv4.Signature) (ObjectMetadata, *probe.Error) { - donut.lock.Lock() - defer donut.lock.Unlock() - size := int64(donut.multiPartObjects[uploadID].Stats().Bytes) - fullObjectReader, err := donut.completeMultipartUploadV2(bucket, key, uploadID, data, signature) - if err != nil { - return ObjectMetadata{}, err.Trace() - } - objectMetadata, err := donut.createObject(bucket, key, "", "", size, fullObjectReader, nil) - if err != nil { - // No need to call internal cleanup functions here, caller should call AbortMultipartUpload() - // which would in-turn cleanup properly in accordance with S3 Spec - return ObjectMetadata{}, err.Trace() - } - donut.cleanupMultipartSession(bucket, key, uploadID) - return objectMetadata, nil -} - -func (donut API) completeMultipartUploadV2(bucket, key, uploadID string, data io.Reader, signature *signv4.Signature) (io.Reader, *probe.Error) { - if !IsValidBucket(bucket) { - return nil, probe.NewError(BucketNameInvalid{Bucket: bucket}) - } - if !IsValidObjectName(key) { - return nil, probe.NewError(ObjectNameInvalid{Object: key}) - } - - // TODO: multipart support for donut is broken, since we haven't finalized the format in which - // it can be stored, disabling this for now until we get the underlying layout stable. - // - // if len(donut.config.NodeDiskMap) > 0 { - // donut.lock.Unlock() - // return donut.completeMultipartUpload(bucket, key, uploadID, data, signature) - // } - - if !donut.storedBuckets.Exists(bucket) { - return nil, probe.NewError(BucketNotFound{Bucket: bucket}) - } - storedBucket := donut.storedBuckets.Get(bucket).(storedBucket) - // Verify upload id - if storedBucket.multiPartSession[key].UploadID != uploadID { - return nil, probe.NewError(InvalidUploadID{UploadID: uploadID}) - } - partBytes, err := ioutil.ReadAll(data) - if err != nil { - return nil, probe.NewError(err) - } - if signature != nil { - ok, err := signature.DoesSignatureMatch(hex.EncodeToString(sha256.Sum256(partBytes)[:])) - if err != nil { - return nil, err.Trace() - } - if !ok { - return nil, probe.NewError(signv4.DoesNotMatch{}) - } - } - parts := &CompleteMultipartUpload{} - if err := xml.Unmarshal(partBytes, parts); err != nil { - return nil, probe.NewError(MalformedXML{}) - } - if !sort.IsSorted(completedParts(parts.Part)) { - return nil, probe.NewError(InvalidPartOrder{}) - } - - fullObjectReader, fullObjectWriter := io.Pipe() - go donut.mergeMultipart(parts, uploadID, fullObjectWriter) - - return fullObjectReader, nil -} - -// byKey is a sortable interface for UploadMetadata slice -type byKey []*UploadMetadata - -func (a byKey) Len() int { return len(a) } -func (a byKey) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a byKey) Less(i, j int) bool { return a[i].Key < a[j].Key } - -// ListMultipartUploads - list incomplete multipart sessions for a given bucket -func (donut API) ListMultipartUploads(bucket string, resources BucketMultipartResourcesMetadata) (BucketMultipartResourcesMetadata, *probe.Error) { - // TODO handle delimiter, low priority - donut.lock.Lock() - defer donut.lock.Unlock() - - if !IsValidBucket(bucket) { - return BucketMultipartResourcesMetadata{}, probe.NewError(BucketNameInvalid{Bucket: bucket}) - } - - // TODO: multipart support for donut is broken, since we haven't finalized the format in which - // it can be stored, disabling this for now until we get the underlying layout stable. - // - // if len(donut.config.NodeDiskMap) > 0 { - // return donut.listMultipartUploads(bucket, resources) - // } - - if !donut.storedBuckets.Exists(bucket) { - return BucketMultipartResourcesMetadata{}, probe.NewError(BucketNotFound{Bucket: bucket}) - } - - storedBucket := donut.storedBuckets.Get(bucket).(storedBucket) - var uploads []*UploadMetadata - - for key, session := range storedBucket.multiPartSession { - if strings.HasPrefix(key, resources.Prefix) { - if len(uploads) > resources.MaxUploads { - sort.Sort(byKey(uploads)) - resources.Upload = uploads - resources.NextKeyMarker = key - resources.NextUploadIDMarker = session.UploadID - resources.IsTruncated = true - return resources, nil - } - // uploadIDMarker is ignored if KeyMarker is empty - switch { - case resources.KeyMarker != "" && resources.UploadIDMarker == "": - if key > resources.KeyMarker { - upload := new(UploadMetadata) - upload.Key = key - upload.UploadID = session.UploadID - upload.Initiated = session.Initiated - uploads = append(uploads, upload) - } - case resources.KeyMarker != "" && resources.UploadIDMarker != "": - if session.UploadID > resources.UploadIDMarker { - if key >= resources.KeyMarker { - upload := new(UploadMetadata) - upload.Key = key - upload.UploadID = session.UploadID - upload.Initiated = session.Initiated - uploads = append(uploads, upload) - } - } - default: - upload := new(UploadMetadata) - upload.Key = key - upload.UploadID = session.UploadID - upload.Initiated = session.Initiated - uploads = append(uploads, upload) - } - } - } - sort.Sort(byKey(uploads)) - resources.Upload = uploads - return resources, nil -} - -// partNumber is a sortable interface for Part slice -type partNumber []*PartMetadata - -func (a partNumber) Len() int { return len(a) } -func (a partNumber) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a partNumber) Less(i, j int) bool { return a[i].PartNumber < a[j].PartNumber } - -// ListObjectParts - list parts from incomplete multipart session for a given object -func (donut API) ListObjectParts(bucket, key string, resources ObjectResourcesMetadata) (ObjectResourcesMetadata, *probe.Error) { - // Verify upload id - donut.lock.Lock() - defer donut.lock.Unlock() - - if !IsValidBucket(bucket) { - return ObjectResourcesMetadata{}, probe.NewError(BucketNameInvalid{Bucket: bucket}) - } - if !IsValidObjectName(key) { - return ObjectResourcesMetadata{}, probe.NewError(ObjectNameInvalid{Object: key}) - } - - // TODO: multipart support for donut is broken, since we haven't finalized the format in which - // it can be stored, disabling this for now until we get the underlying layout stable. - // - // if len(donut.config.NodeDiskMap) > 0 { - // return donut.listObjectParts(bucket, key, resources) - // } - - if !donut.storedBuckets.Exists(bucket) { - return ObjectResourcesMetadata{}, probe.NewError(BucketNotFound{Bucket: bucket}) - } - storedBucket := donut.storedBuckets.Get(bucket).(storedBucket) - if _, ok := storedBucket.multiPartSession[key]; ok == false { - return ObjectResourcesMetadata{}, probe.NewError(ObjectNotFound{Object: key}) - } - if storedBucket.multiPartSession[key].UploadID != resources.UploadID { - return ObjectResourcesMetadata{}, probe.NewError(InvalidUploadID{UploadID: resources.UploadID}) - } - storedParts := storedBucket.partMetadata[key] - objectResourcesMetadata := resources - objectResourcesMetadata.Bucket = bucket - objectResourcesMetadata.Key = key - var parts []*PartMetadata - var startPartNumber int - switch { - case objectResourcesMetadata.PartNumberMarker == 0: - startPartNumber = 1 - default: - startPartNumber = objectResourcesMetadata.PartNumberMarker - } - for i := startPartNumber; i <= storedBucket.multiPartSession[key].TotalParts; i++ { - if len(parts) > objectResourcesMetadata.MaxParts { - sort.Sort(partNumber(parts)) - objectResourcesMetadata.IsTruncated = true - objectResourcesMetadata.Part = parts - objectResourcesMetadata.NextPartNumberMarker = i - return objectResourcesMetadata, nil - } - part, ok := storedParts[i] - if !ok { - return ObjectResourcesMetadata{}, probe.NewError(InvalidPart{}) - } - parts = append(parts, &part) - } - sort.Sort(partNumber(parts)) - objectResourcesMetadata.Part = parts - return objectResourcesMetadata, nil -} - -// evictedPart - call back function called by caching module during individual cache evictions -func (donut API) evictedPart(a ...interface{}) { - // loop through all buckets - buckets := donut.storedBuckets.GetAll() - for bucketName, bucket := range buckets { - b := bucket.(storedBucket) - donut.storedBuckets.Set(bucketName, b) - } - debug.FreeOSMemory() -} diff --git a/pkg/donut/node.go b/pkg/donut/node.go deleted file mode 100644 index 35a90b4ad..000000000 --- a/pkg/donut/node.go +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 donut - -import ( - "github.com/minio/minio/pkg/donut/disk" - "github.com/minio/minio/pkg/probe" -) - -// node struct internal -type node struct { - hostname string - disks map[int]disk.Disk -} - -// newNode - instantiates a new node -func newNode(hostname string) (node, *probe.Error) { - if hostname == "" { - return node{}, probe.NewError(InvalidArgument{}) - } - disks := make(map[int]disk.Disk) - n := node{ - hostname: hostname, - disks: disks, - } - return n, nil -} - -// GetHostname - return hostname -func (n node) GetHostname() string { - return n.hostname -} - -// ListDisks - return number of disks -func (n node) ListDisks() (map[int]disk.Disk, *probe.Error) { - return n.disks, nil -} - -// AttachDisk - attach a disk -func (n node) AttachDisk(disk disk.Disk, diskOrder int) *probe.Error { - if diskOrder < 0 { - return probe.NewError(InvalidArgument{}) - } - n.disks[diskOrder] = disk - return nil -} - -// DetachDisk - detach a disk -func (n node) DetachDisk(diskOrder int) *probe.Error { - delete(n.disks, diskOrder) - return nil -} - -// SaveConfig - save node configuration -func (n node) SaveConfig() *probe.Error { - return probe.NewError(NotImplemented{Function: "SaveConfig"}) -} - -// LoadConfig - load node configuration from saved configs -func (n node) LoadConfig() *probe.Error { - return probe.NewError(NotImplemented{Function: "LoadConfig"}) -} diff --git a/pkg/erasure/.gitignore b/pkg/erasure/.gitignore deleted file mode 100644 index a11ae5b8a..000000000 --- a/pkg/erasure/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.syso \ No newline at end of file diff --git a/pkg/erasure/INSTALLGO.md b/pkg/erasure/INSTALLGO.md deleted file mode 100644 index 9cc319df0..000000000 --- a/pkg/erasure/INSTALLGO.md +++ /dev/null @@ -1,64 +0,0 @@ -## Ubuntu (Kylin) 14.04 -### Build Dependencies -This installation document assumes Ubuntu 14.04+ on x86-64 platform. - -##### Install Git, GCC, yasm -```sh -$ sudo apt-get install git build-essential yasm -``` - -##### Install Go 1.5+ - -Download Go 1.5+ from [https://golang.org/dl/](https://golang.org/dl/). - -```sh -$ wget https://storage.googleapis.com/golang/go1.5.linux-amd64.tar.gz -$ mkdir -p ${HOME}/bin/ -$ mkdir -p ${HOME}/go/ -$ tar -C ${HOME}/bin/ -xzf go1.5.linux-amd64.tar.gz -``` -##### Setup GOROOT and GOPATH - -Add the following exports to your ``~/.bashrc``. Environment variable GOROOT specifies the location of your golang binaries -and GOPATH specifies the location of your project workspace. - -```sh -$ export GOROOT=${HOME}/bin/go -$ export GOPATH=${HOME}/go -$ export PATH=$PATH:${HOME}/bin/go/bin:${GOPATH}/bin -``` - -## OS X (Yosemite) 10.10 -### Build Dependencies -This installation document assumes OS X Yosemite 10.10+ on x86-64 platform. - -##### Install brew -```sh -$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" -``` - -##### Install Git, Python -```sh -$ brew install git python yasm -``` - -##### Install Go 1.5+ - -Install golang binaries using `brew` - -```sh -$ brew install go -$ mkdir -p $HOME/go -``` - -##### Setup GOROOT and GOPATH - -Add the following exports to your ``~/.bashrc``. Environment variable GOROOT specifies the location of your golang binaries -and GOPATH specifies the location of your project workspace. - -```sh -$ export GOPATH=${HOME}/go -$ export GOVERSION=$(brew list go | head -n 1 | cut -d '/' -f 6) -$ export GOROOT=$(brew --prefix)/Cellar/go/${GOVERSION}/libexec -$ export PATH=$PATH:${GOPATH}/bin -``` diff --git a/pkg/erasure/LICENSE.INTEL b/pkg/erasure/LICENSE.INTEL deleted file mode 100644 index 667056695..000000000 --- a/pkg/erasure/LICENSE.INTEL +++ /dev/null @@ -1,26 +0,0 @@ - Copyright(c) 2011-2014 Intel Corporation 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 Intel Corporation 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/pkg/erasure/LICENSE.MINIO b/pkg/erasure/LICENSE.MINIO deleted file mode 100644 index d64569567..000000000 --- a/pkg/erasure/LICENSE.MINIO +++ /dev/null @@ -1,202 +0,0 @@ - - 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/pkg/erasure/README.md b/pkg/erasure/README.md deleted file mode 100644 index 4cef6311b..000000000 --- a/pkg/erasure/README.md +++ /dev/null @@ -1,25 +0,0 @@ -## Introduction - -Erasure is an open source Golang library written on top of ISAL (Intel Intelligent Storage Library) released under [Apache license v2](./LICENSE) - -### Developers -* [Get Source](./CONTRIBUTING.md) -* [Build Dependencies](./BUILDDEPS.md) -* [Development Workflow](./CONTRIBUTING.md#developer-guidelines) -* [Developer discussions and bugs](https://github.com/minio/minio/issues) - -### Supported platforms - -| Name | Supported | -| ------------- | ------------- | -| Linux | Yes | -| Windows | Not yet | -| Mac OSX | Yes | - -### Supported architectures - -| Arch | Supported | -| ------------- | ------------- | -| x86-64 | Yes | -| arm64 | Not yet| -| i386 | Never | diff --git a/pkg/erasure/RELEASE-NOTES.INTEL b/pkg/erasure/RELEASE-NOTES.INTEL deleted file mode 100644 index b4b601824..000000000 --- a/pkg/erasure/RELEASE-NOTES.INTEL +++ /dev/null @@ -1,49 +0,0 @@ -================================================================================ -v2.10 Intel Intelligent Storage Acceleration Library Release Notes - Open Source Version -================================================================================ - -================================================================================ -RELEASE NOTE CONTENTS -================================================================================ -1. KNOWN ISSUES -2. FIXED ISSUES -3. CHANGE LOG & FEATURES ADDED - -================================================================================ -1. KNOWN ISSUES -================================================================================ - -* Only erasure code unit included in open source version at this time. - -* Perf tests do not run in Windows environment. - -* Leaving /bin directories from builds in unit directories will cause the - top-level make build to fail. Build only in top-level or ensure unit - directories are clean of objects and /bin. - -* 32-bit lib is not supported in Windows. - -================================================================================ -2. FIXED ISSUES -================================================================================ -v2.10 - -* Fix for windows register save overlap in gf_{3-6}vect_dot_prod_sse.asm. Only - affects windows versions of erasure code. GP register saves/restore were - pushed to same stack area as XMM. - -================================================================================ -3. CHANGE LOG & FEATURES ADDED -================================================================================ -v2.10 - -* Erasure code updates - - New AVX and AVX2 support functions. - - Changes min len requirement on gf_vect_dot_prod() to 32 from 16. - - Tests include both source and parity recovery with ec_encode_data(). - - New encoding examples with Vandermonde or Cauchy matrix. - -v2.8 - -* First open release of erasure code unit that is part of ISA-L. diff --git a/pkg/erasure/RELEASE-NOTES.MINIO b/pkg/erasure/RELEASE-NOTES.MINIO deleted file mode 100644 index bf3ed1ece..000000000 --- a/pkg/erasure/RELEASE-NOTES.MINIO +++ /dev/null @@ -1,3 +0,0 @@ -v1.0 - Erasure Golang Package -============================ -- First release, supports only amd64 or x86-64 architecture \ No newline at end of file diff --git a/pkg/erasure/ctypes.go b/pkg/erasure/ctypes.go deleted file mode 100644 index 60ef6482b..000000000 --- a/pkg/erasure/ctypes.go +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2014 Minio, 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 erasure - -// #include -import "C" -import ( - "fmt" - "unsafe" -) - -// intSlice2CIntArray converts Go int slice to C int array -func intSlice2CIntArray(srcErrList []int) *C.int32_t { - if len(srcErrList) == 0 { - return (*C.int32_t)(unsafe.Pointer(nil)) - } - var sizeErrInt = int(unsafe.Sizeof(srcErrList[0])) - switch sizeInt { - case sizeErrInt: - return (*C.int32_t)(unsafe.Pointer(&srcErrList[0])) - case sizeInt8: - int8Array := make([]int8, len(srcErrList)) - for i, v := range srcErrList { - int8Array[i] = int8(v) - } - return (*C.int32_t)(unsafe.Pointer(&int8Array[0])) - case sizeInt16: - int16Array := make([]int16, len(srcErrList)) - for i, v := range srcErrList { - int16Array[i] = int16(v) - } - return (*C.int32_t)(unsafe.Pointer(&int16Array[0])) - case sizeInt32: - int32Array := make([]int32, len(srcErrList)) - for i, v := range srcErrList { - int32Array[i] = int32(v) - } - return (*C.int32_t)(unsafe.Pointer(&int32Array[0])) - case sizeInt64: - int64Array := make([]int64, len(srcErrList)) - for i, v := range srcErrList { - int64Array[i] = int64(v) - } - return (*C.int32_t)(unsafe.Pointer(&int64Array[0])) - default: - panic(fmt.Sprintf("Unsupported: %d", sizeInt)) - } -} diff --git a/pkg/erasure/doc.go b/pkg/erasure/doc.go deleted file mode 100644 index 4e7edbc63..000000000 --- a/pkg/erasure/doc.go +++ /dev/null @@ -1,66 +0,0 @@ -// Package erasure is a Go wrapper for the Intel Intelligent Storage -// Acceleration Library (Intel ISA-L). Intel ISA-L is a CPU optimized -// implementation of erasure coding algorithms. -// -// For more information on Intel ISA-L, please visit: -// https://01.org/intel%C2%AE-storage-acceleration-library-open-source-version -// -// Usage: -// -// Encode encodes a block of data. The input is the original data. The output -// is a 2 tuple containing (k + m) chunks of erasure encoded data and the -// length of the original object. -// -// Decode decodes 2 tuple data containing (k + m) chunks back into its original form. -// Additionally original block length should also be provided as input. -// -// Decoded data is exactly similar in length and content as the original data. -// -// Encoding data may be performed in 3 steps. -// -// 1. Create a parse set of encoder parameters -// 2. Create a new encoder -// 3. Encode data -// -// Decoding data is also performed in 3 steps. -// -// 1. Create a parse set of encoder parameters for validation -// 2. Create a new encoder -// 3. Decode data -// -// Erasure parameters contain three configurable elements: -// ValidateParams(k, m, technique int) (ErasureParams, error) -// k - Number of rows in matrix -// m - Number of colums in matrix -// technique - Matrix type, can be either Cauchy (recommended) or Vandermonde -// constraints: k + m < Galois Field (2^8) -// -// Choosing right parity and matrix technique is left for application to decide. -// -// But here are the few points to keep in mind -// -// Matrix Type: -// - Vandermonde is most commonly used method for choosing coefficients in erasure -// encoding but does not guarantee invertable for every sub matrix. -// - Whereas Cauchy is our recommended method for choosing coefficients in erasure coding. -// Since any sub-matrix of a Cauchy matrix is invertable. -// -// Total blocks: -// - Data blocks and Parity blocks should not be greater than 'Galois Field' (2^8) -// -// Example -// -// Creating and using an encoder -// var bytes []byte -// params := erasure.ValidateParams(10, 5) -// encoder := erasure.NewErasure(params) -// encodedData, length := encoder.Encode(bytes) -// -// Creating and using a decoder -// var encodedData [][]byte -// var length int -// params := erasure.ValidateParams(10, 5) -// encoder := erasure.NewErasure(params) -// originalData, err := encoder.Decode(encodedData, length) -// -package erasure diff --git a/pkg/erasure/docs/isa-l_open_src_2.10.pdf b/pkg/erasure/docs/isa-l_open_src_2.10.pdf deleted file mode 100644 index b2d6e1447..000000000 --- a/pkg/erasure/docs/isa-l_open_src_2.10.pdf +++ /dev/null @@ -1,5429 +0,0 @@ -%PDF-1.4 -% -5 0 obj -<< /S /GoTo /D (chapter.1) >> -endobj -8 0 obj -(\376\377\000S\000t\000o\000r\000a\000g\000e\000\040\000L\000i\000b\000r\000a\000r\000y) -endobj -9 0 obj -<< /S /GoTo /D (section.1.1) >> -endobj -12 0 obj -(\376\377\000A\000b\000o\000u\000t\000\040\000T\000h\000i\000s\000\040\000D\000o\000c\000u\000m\000e\000n\000t) -endobj -13 0 obj -<< /S /GoTo /D (section.1.2) >> -endobj -16 0 obj -(\376\377\000O\000v\000e\000r\000v\000i\000e\000w) -endobj -17 0 obj -<< /S /GoTo /D (section.1.3) >> -endobj -20 0 obj -(\376\377\000E\000r\000a\000s\000u\000r\000e\000\040\000C\000o\000d\000e\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000s) -endobj -21 0 obj -<< /S /GoTo /D (section.1.4) >> -endobj -24 0 obj -(\376\377\000S\000y\000s\000t\000e\000m\000\040\000R\000e\000q\000u\000i\000r\000e\000m\000e\000n\000t\000s) -endobj -25 0 obj -<< /S /GoTo /D (chapter.2) >> -endobj -28 0 obj -(\376\377\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000V\000e\000r\000s\000i\000o\000n\000\040\000N\000u\000m\000b\000e\000r\000s) -endobj -29 0 obj -<< /S /GoTo /D (section.2.1) >> -endobj -32 0 obj -(\376\377\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000V\000e\000r\000s\000i\000o\000n\000\040\000N\000u\000m\000b\000e\000r\000s) -endobj -33 0 obj -<< /S /GoTo /D (section.2.2) >> -endobj -36 0 obj -(\376\377\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000V\000e\000r\000s\000i\000o\000n\000\040\000N\000u\000m\000b\000e\000r\000s\000\040\000T\000a\000b\000l\000e\000s) -endobj -37 0 obj -<< /S /GoTo /D (chapter.3) >> -endobj -40 0 obj -(\376\377\000I\000n\000s\000t\000r\000u\000c\000t\000i\000o\000n\000\040\000S\000e\000t\000\040\000R\000e\000q\000u\000i\000r\000e\000m\000e\000n\000t\000s) -endobj -41 0 obj -<< /S /GoTo /D (chapter.4) >> -endobj -44 0 obj -(\376\377\000F\000i\000l\000e\000\040\000I\000n\000d\000e\000x) -endobj -45 0 obj -<< /S /GoTo /D (section.4.1) >> -endobj -48 0 obj -(\376\377\000F\000i\000l\000e\000\040\000L\000i\000s\000t) -endobj -49 0 obj -<< /S /GoTo /D (chapter.5) >> -endobj -52 0 obj -(\376\377\000F\000i\000l\000e\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) -endobj -53 0 obj -<< /S /GoTo /D (section.5.1) >> -endobj -56 0 obj -(\376\377\000e\000r\000a\000s\000u\000r\000e\000\137\000c\000o\000d\000e\000.\000h\000\040\000F\000i\000l\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) -endobj -57 0 obj -<< /S /GoTo /D (subsection.5.1.1) >> -endobj -60 0 obj -(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n) -endobj -61 0 obj -<< /S /GoTo /D (subsection.5.1.2) >> -endobj -64 0 obj -(\376\377\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) -endobj -65 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.1) >> -endobj -68 0 obj -(\376\377\000e\000c\000\137\000e\000n\000c\000o\000d\000e\000\137\000d\000a\000t\000a) -endobj -69 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.2) >> -endobj -72 0 obj -(\376\377\000e\000c\000\137\000e\000n\000c\000o\000d\000e\000\137\000d\000a\000t\000a\000\137\000b\000a\000s\000e) -endobj -73 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.3) >> -endobj -76 0 obj -(\376\377\000e\000c\000\137\000e\000n\000c\000o\000d\000e\000\137\000d\000a\000t\000a\000\137\000s\000s\000e) -endobj -77 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.4) >> -endobj -80 0 obj -(\376\377\000e\000c\000\137\000i\000n\000i\000t\000\137\000t\000a\000b\000l\000e\000s) -endobj -81 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.5) >> -endobj -84 0 obj -(\376\377\000g\000f\000\137\0002\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000a\000v\000x) -endobj -85 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.6) >> -endobj -88 0 obj -(\376\377\000g\000f\000\137\0002\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000a\000v\000x\0002) -endobj -89 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.7) >> -endobj -92 0 obj -(\376\377\000g\000f\000\137\0002\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000s\000s\000e) -endobj -93 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.8) >> -endobj -96 0 obj -(\376\377\000g\000f\000\137\0003\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000a\000v\000x) -endobj -97 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.9) >> -endobj -100 0 obj -(\376\377\000g\000f\000\137\0003\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000a\000v\000x\0002) -endobj -101 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.10) >> -endobj -104 0 obj -(\376\377\000g\000f\000\137\0003\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000s\000s\000e) -endobj -105 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.11) >> -endobj -108 0 obj -(\376\377\000g\000f\000\137\0004\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000a\000v\000x) -endobj -109 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.12) >> -endobj -112 0 obj -(\376\377\000g\000f\000\137\0004\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000a\000v\000x\0002) -endobj -113 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.13) >> -endobj -116 0 obj -(\376\377\000g\000f\000\137\0004\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000s\000s\000e) -endobj -117 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.14) >> -endobj -120 0 obj -(\376\377\000g\000f\000\137\0005\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000a\000v\000x) -endobj -121 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.15) >> -endobj -124 0 obj -(\376\377\000g\000f\000\137\0005\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000a\000v\000x\0002) -endobj -125 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.16) >> -endobj -128 0 obj -(\376\377\000g\000f\000\137\0005\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000s\000s\000e) -endobj -129 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.17) >> -endobj -132 0 obj -(\376\377\000g\000f\000\137\0006\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000a\000v\000x) -endobj -133 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.18) >> -endobj -136 0 obj -(\376\377\000g\000f\000\137\0006\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000a\000v\000x\0002) -endobj -137 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.19) >> -endobj -140 0 obj -(\376\377\000g\000f\000\137\0006\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000s\000s\000e) -endobj -141 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.20) >> -endobj -144 0 obj -(\376\377\000g\000f\000\137\000g\000e\000n\000\137\000c\000a\000u\000c\000h\000y\0001\000\137\000m\000a\000t\000r\000i\000x) -endobj -145 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.21) >> -endobj -148 0 obj -(\376\377\000g\000f\000\137\000g\000e\000n\000\137\000r\000s\000\137\000m\000a\000t\000r\000i\000x) -endobj -149 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.22) >> -endobj -152 0 obj -(\376\377\000g\000f\000\137\000i\000n\000v) -endobj -153 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.23) >> -endobj -156 0 obj -(\376\377\000g\000f\000\137\000i\000n\000v\000e\000r\000t\000\137\000m\000a\000t\000r\000i\000x) -endobj -157 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.24) >> -endobj -160 0 obj -(\376\377\000g\000f\000\137\000m\000u\000l) -endobj -161 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.25) >> -endobj -164 0 obj -(\376\377\000g\000f\000\137\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d) -endobj -165 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.26) >> -endobj -168 0 obj -(\376\377\000g\000f\000\137\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000a\000v\000x) -endobj -169 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.27) >> -endobj -172 0 obj -(\376\377\000g\000f\000\137\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000a\000v\000x\0002) -endobj -173 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.28) >> -endobj -176 0 obj -(\376\377\000g\000f\000\137\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000b\000a\000s\000e) -endobj -177 0 obj -<< /S /GoTo /D (subsubsection.5.1.2.29) >> -endobj -180 0 obj -(\376\377\000g\000f\000\137\000v\000e\000c\000t\000\137\000d\000o\000t\000\137\000p\000r\000o\000d\000\137\000s\000s\000e) -endobj -181 0 obj -<< /S /GoTo /D (section.5.2) >> -endobj -184 0 obj -(\376\377\000g\000f\000\137\000v\000e\000c\000t\000\137\000m\000u\000l\000.\000h\000\040\000F\000i\000l\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) -endobj -185 0 obj -<< /S /GoTo /D (subsection.5.2.1) >> -endobj -188 0 obj -(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n) -endobj -189 0 obj -<< /S /GoTo /D (subsection.5.2.2) >> -endobj -192 0 obj -(\376\377\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) -endobj -193 0 obj -<< /S /GoTo /D (subsubsection.5.2.2.1) >> -endobj -196 0 obj -(\376\377\000g\000f\000\137\000v\000e\000c\000t\000\137\000m\000u\000l) -endobj -197 0 obj -<< /S /GoTo /D (subsubsection.5.2.2.2) >> -endobj -200 0 obj -(\376\377\000g\000f\000\137\000v\000e\000c\000t\000\137\000m\000u\000l\000\137\000a\000v\000x) -endobj -201 0 obj -<< /S /GoTo /D (subsubsection.5.2.2.3) >> -endobj -204 0 obj -(\376\377\000g\000f\000\137\000v\000e\000c\000t\000\137\000m\000u\000l\000\137\000b\000a\000s\000e) -endobj -205 0 obj -<< /S /GoTo /D (subsubsection.5.2.2.4) >> -endobj -208 0 obj -(\376\377\000g\000f\000\137\000v\000e\000c\000t\000\137\000m\000u\000l\000\137\000i\000n\000i\000t) -endobj -209 0 obj -<< /S /GoTo /D (subsubsection.5.2.2.5) >> -endobj -212 0 obj -(\376\377\000g\000f\000\137\000v\000e\000c\000t\000\137\000m\000u\000l\000\137\000s\000s\000e) -endobj -213 0 obj -<< /S /GoTo /D (section.5.3) >> -endobj -216 0 obj -(\376\377\000t\000y\000p\000e\000s\000.\000h\000\040\000F\000i\000l\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) -endobj -217 0 obj -<< /S /GoTo /D (subsection.5.3.1) >> -endobj -220 0 obj -(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n) -endobj -221 0 obj -<< /S /GoTo /D [222 0 R /Fit ] >> -endobj -225 0 obj << -/Length 384 -/Filter /FlateDecode ->> -stream -xڝSN0+Hx@@q)=6ELﱓ"^P$2̌7k/*a*Cjlp:!7CxeFR>xٚZMFgyrz)8@\AAaN붬e~QR!5Dɩ 's$ZT@FNھdYZmFm|d{tZUv=r}8_0rgpAC - ǹ{-`g!c1|*}:uT'ZS41y|~?+7/mQG裨wrة9E=|4V/-, s,|vHmC`5J%$RoL; -endstream -endobj -222 0 obj << -/Type /Page -/Contents 225 0 R -/Resources 224 0 R -/MediaBox [0 0 612 792] -/Parent 229 0 R ->> endobj -223 0 obj << -/Type /XObject -/Subtype /Form -/FormType 1 -/PTEX.FileName (./intel_4c_100.pdf) -/PTEX.PageNumber 1 -/PTEX.InfoDict 230 0 R -/BBox [0 0 102 77] -/Resources << -/ProcSet [ /PDF ] -/ExtGState << -/R7 231 0 R ->>>> -/Length 232 0 R -/Filter /FlateDecode ->> -stream -xmWI5)t!A1 -`"h/O*wxQ?%9%R!_V÷/਽$ㇿ.k-z+!y~Cn]C) ck4cYuRc`jƊ܂I*D&MׂA" \o܌=-( `'f F^!~ERral 7Gٽ)iegb"vte97T] e kI|v I4A!Ԏ11$c6'X*:->|h[sf,̈́qV`$pΓ1;fPTWJ'#ep1\^}#HP1{m(TWx9%³a]Q)s3xpqYߊT|d|Uu;Po-V!'fG:]CSa*ew2?n1F6O6+ncG+kE焍MxN8^~1cí_f>8 r0|1Tm!KˊxỌе`E&3bsc2~WGaE+R?9UBفB[18=9}<Mc5|GBhNLi c'*h NAxsFr9zΛ4~0ed{vmhbLQ,-@7Aa:z|#6}g?Zw3UN0G>B)[uټ3{Ea;Ґ -f@N =51Ϙ+v?7U|}Iu;oׯ^§ -endstream -endobj -230 0 obj -<< -/Producer (GPL Ghostscript 8.71) -/CreationDate (D:20100929095736-07'00') -/ModDate (D:20100929095736-07'00') -/Creator (Adobe Illustrator\(R\) 8.0) -/Author (\(L.P Thebault\) \(L.P. Thebault Company\)) -/Title (\(intel_4c_100.eps\)) ->> -endobj -231 0 obj -<< -/Type /ExtGState -/OPM 1 ->> -endobj -232 0 obj -1336 -endobj -226 0 obj << -/D [222 0 R /XYZ 72 668.127 null] ->> endobj -224 0 obj << -/Font << /F32 227 0 R /F35 228 0 R >> -/XObject << /Im1 223 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -236 0 obj << -/Length 1840 -/Filter /FlateDecode ->> -stream -xڥXQsF ~ϯ`0: M71= >ͤJkw3>'-^ڳfjWa@3s<=w8PE\ށhd<Ӓ'i4o82%w|: -WLM6j?MmOl4^Ns!_rtC L c/״ 6ʰn={eIn4&0dyz.cꋞk꿆`=|'a2UI0{b |A,y\*m1^D"|Y {32ӹv@ Nz].18JЍC2 LvҞlsv#`+5fW|%F4y -w2WD]nvǀHdpb*P8*ANص7IqӒXGr@ANǞeÆ#Q0S?'ёhY@1ܭr|Xw넱g `x&}z8ߡE;wa2>hDTY\EuX=?0ɸ8]]tpUD!RyOLH '\פϲ9h)BV)yM,װ m5Q,}ZS8craQVKȮI$ *<'J|Ęi/nL ߆+qbHEiV 59PT tb5ΏE/$C #d1}1.*c~ZAEZgNvvWV`4UMf]ѳmZ>TmEcYiYUڴd_WC֒h:wZe߃m/ylTVm 4M\Ɋ&(^)nUpF/F8^fbcWO8: |i{2$/AKk`FObvnʍܖbc| :;9GAx: .񐄈fɶin5rL"$"o_/6mJl] π\[ϪPmHyU= V|&ڱ?u.tyL+`OA"]^O9 ۊZi Ywdű,1Ҥ: -/~ZƔek[c2j bW6+ yIbMvlI.@P*kMڋ'q􎬡PuU  -)$mSll{0=4B{{V -,> endobj -233 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [135.019 309.334 337.859 318.456] -/Subtype/Link/A<> ->> endobj -234 0 obj << -/Font << /F46 237 0 R /F47 238 0 R /F48 239 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -275 0 obj << -/Length 824 -/Filter /FlateDecode ->> -stream -xKo@t3,ۼ*j&IC -8M}fM Q"Vƶ{/Q Amrr+@`r ̃.L"pcI"Ou -/.q!p8rvк.,S.id/AąoۉJ BǘY.[}urIg'pk;L^=bJ FO6bʞbecf}ajI2ZĨu<3=N#su6O"NzҼԈqjV*pL6 -s%ecLi6Qף8Xd6nR_P|6[٧5Gq EvYt+:]WĖ -$b,=IL8/r\bHZۋ)DR]ʋ$RϭC_myіI9رꃦ+OY7g`6}*rC=fΫsnUP53&%XM*M;2<ǦK{#:w[cüޡ['#VR˱,*L -ˋEx{;XFoOQJHS̛Ńsd?t2N/?P6m\fjXQZYܘA[˻ JtI//V[j$d>Q!15H ȡB=z:r'j,zZZAck y?7 IZH+l > YC 쇐!l~ZT x:9^V -endstream -endobj -274 0 obj << -/Type /Page -/Contents 275 0 R -/Resources 273 0 R -/MediaBox [0 0 612 792] -/Parent 229 0 R -/Annots [ 240 0 R 241 0 R 242 0 R 243 0 R 244 0 R 245 0 R 246 0 R 247 0 R 248 0 R 249 0 R 250 0 R 251 0 R 252 0 R 253 0 R 254 0 R 255 0 R 256 0 R 257 0 R 258 0 R 259 0 R 260 0 R 261 0 R 262 0 R 263 0 R 264 0 R 265 0 R 266 0 R 267 0 R 268 0 R 269 0 R 270 0 R 271 0 R ] ->> endobj -240 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 525.49 156.841 536.369] -/Subtype /Link -/A << /S /GoTo /D (chapter.1) >> ->> endobj -241 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [85.948 515.457 199.959 524.304] -/Subtype /Link -/A << /S /GoTo /D (section.1.1) >> ->> endobj -242 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [85.948 503.502 149.738 512.349] -/Subtype /Link -/A << /S /GoTo /D (section.1.2) >> ->> endobj -243 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [85.948 491.547 206.594 500.394] -/Subtype /Link -/A << /S /GoTo /D (section.1.3) >> ->> endobj -244 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [85.948 477.535 198.026 488.439] -/Subtype /Link -/A << /S /GoTo /D (section.1.4) >> ->> endobj -245 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 457.654 202.619 466.63] -/Subtype /Link -/A << /S /GoTo /D (chapter.2) >> ->> endobj -246 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [85.948 445.719 218.221 454.566] -/Subtype /Link -/A << /S /GoTo /D (section.2.1) >> ->> endobj -247 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [85.948 433.764 246.474 442.61] -/Subtype /Link -/A << /S /GoTo /D (section.2.2) >> ->> endobj -248 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 409.923 213.388 420.802] -/Subtype /Link -/A << /S /GoTo /D (chapter.3) >> ->> endobj -249 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 389.908 130.839 398.884] -/Subtype /Link -/A << /S /GoTo /D (chapter.4) >> ->> endobj -250 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [85.948 377.973 144.348 386.82] -/Subtype /Link -/A << /S /GoTo /D (section.4.1) >> ->> endobj -251 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 356.035 171.785 365.011] -/Subtype /Link -/A << /S /GoTo /D (chapter.5) >> ->> endobj -252 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [85.948 343.019 231.74 352.947] -/Subtype /Link -/A << /S /GoTo /D (section.5.1) >> ->> endobj -253 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [108.862 330.087 225.463 340.991] -/Subtype /Link -/A << /S /GoTo /D (subsection.5.1.1) >> ->> endobj -254 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [108.862 320.19 242.081 329.036] -/Subtype /Link -/A << /S /GoTo /D (subsection.5.1.2) >> ->> endobj -255 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 307.153 247.203 317.081] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.1) >> ->> endobj -256 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 295.198 269.887 305.126] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.2) >> ->> endobj -257 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 283.243 264.358 293.171] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.3) >> ->> endobj -258 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 271.288 238.923 281.216] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.4) >> ->> endobj -259 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 258.356 278.416 269.26] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.5) >> ->> endobj -260 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 246.401 283.397 257.305] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.6) >> ->> endobj -261 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 234.446 276.403 245.35] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.7) >> ->> endobj -262 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 222.491 278.416 233.395] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.8) >> ->> endobj -263 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 210.536 283.397 221.44] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.9) >> ->> endobj -264 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 198.581 276.403 209.485] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.10) >> ->> endobj -265 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 186.625 278.416 197.529] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.11) >> ->> endobj -266 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 174.67 283.397 185.574] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.12) >> ->> endobj -267 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 162.715 276.403 173.619] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.13) >> ->> endobj -268 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 150.76 278.416 161.664] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.14) >> ->> endobj -269 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 138.805 283.397 149.709] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.15) >> ->> endobj -270 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 126.85 276.403 137.754] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.16) >> ->> endobj -271 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 114.894 278.416 125.798] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.17) >> ->> endobj -273 0 obj << -/Font << /F46 237 0 R /F47 238 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -299 0 obj << -/Length 690 -/Filter /FlateDecode ->> -stream -xMs0;"G8͓\w2Cw8.Җ.b+<ɏt:& B3%ZKvbOl$(A" VQ8DWyx\gyכ!.)leIq|Q4 gEF]#ۡ=~|}1`1I$V ;4 ytӂ7}(yA@Hzv>zj1 P|J[m!*4vl6N`hgcՐ3ChgKٴN)H=tKQj/vA/,oZ ,rɗ/|G8X;YOjv%Vq.StvA y;H (կ(fC%4[4QʈjU i]УIrϏ.8ed_3ٚA)6瀡x(V}8g?QLd: x^n"Ӳ Ysq4i>S;Pbƙ.~tgb6o貦kbajQ׺ضȱGD*VހI^EJv|!hg+lk"2]L97Ox"-M|hV"4;D+Ec1 -endstream -endobj -298 0 obj << -/Type /Page -/Contents 299 0 R -/Resources 297 0 R -/MediaBox [0 0 612 792] -/Parent 229 0 R -/Annots [ 272 0 R 276 0 R 277 0 R 278 0 R 279 0 R 280 0 R 281 0 R 282 0 R 283 0 R 284 0 R 285 0 R 286 0 R 287 0 R 288 0 R 289 0 R 290 0 R 291 0 R 292 0 R 293 0 R 294 0 R 295 0 R 296 0 R ] ->> endobj -272 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 655.011 283.397 665.915] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.18) >> ->> endobj -276 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 643.056 276.403 653.96] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.19) >> ->> endobj -277 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 631.101 280.368 642.005] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.20) >> ->> endobj -278 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 619.146 254.415 630.05] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.21) >> ->> endobj -279 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 607.191 209.196 618.095] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.22) >> ->> endobj -280 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 595.235 250.55 606.139] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.23) >> ->> endobj -281 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 583.28 212.364 594.184] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.24) >> ->> endobj -282 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 571.325 254.266 582.229] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.25) >> ->> endobj -283 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 559.37 273.435 570.274] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.26) >> ->> endobj -284 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 547.415 278.416 558.319] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.27) >> ->> endobj -285 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 535.46 276.951 546.364] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.28) >> ->> endobj -286 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 523.504 271.422 534.408] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.1.2.29) >> ->> endobj -287 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [85.948 511.549 229.399 522.453] -/Subtype /Link -/A << /S /GoTo /D (section.5.2) >> ->> endobj -288 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [108.862 499.594 225.463 510.498] -/Subtype /Link -/A << /S /GoTo /D (subsection.5.2.1) >> ->> endobj -289 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [108.862 489.696 242.081 498.543] -/Subtype /Link -/A << /S /GoTo /D (subsection.5.2.2) >> ->> endobj -290 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 475.684 233.793 486.588] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.2.2.1) >> ->> endobj -291 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 463.729 252.961 474.633] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.2.2.2) >> ->> endobj -292 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 451.773 256.478 462.677] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.2.2.3) >> ->> endobj -293 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 439.818 252.064 450.722] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.2.2.4) >> ->> endobj -294 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.742 427.863 250.949 438.767] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.5.2.2.5) >> ->> endobj -295 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [85.948 415.908 200.218 426.812] -/Subtype /Link -/A << /S /GoTo /D (section.5.3) >> ->> endobj -296 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [108.862 403.953 225.463 414.857] -/Subtype /Link -/A << /S /GoTo /D (subsection.5.3.1) >> ->> endobj -297 0 obj << -/Font << /F46 237 0 R /F47 238 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -304 0 obj << -/Length 2318 -/Filter /FlateDecode ->> -stream -xڭXsܶ_GGv$gHN;v8cy%yտ><1b/n.B Xęq& _zۛo/^_' io$8=A"S>je/V?eia⻻_%r}* ʋ\:EQ+~ - -?E=wwq/~&' Ndip 'Z0 MwA(w@wqhy}d^2eFAKڑQWv1PF3tq%B_L9C} Bݎz%~kJfSmE?Aj[nmnrvpSoz?dud>[>0^5dL:EYF#]`DP$8Bawl+bATURs]UCs;*0ǝ+ ,;vAqq^r,Am+MgGxJ^|8q7LanD̤`^oa_;b@FAH}XE#lq1hTfԨH,BX5V 闪i#khx1|RIt3lΝsލ]آe F[ >i7w@jVQTݨM|Qvj_j4ޗQfAcxfxs6t\Q[k}h!H?^`1=7x67?fL 'wL (pؗ,?@zq -7ށf B*Y]^*0?b`0=m+%%a"8UNTi7.*.~Jy3uz#`Ml -{;u(wP5rþ;u,-h<=UP|b ɒM272 -ÇhNÏjfzi}iK0ѓk0iPvkUG?ukhXR-~K21IZk΢et+cp_Ut>g $/ DTÈX܆N(4)4D;PFkK/C6}҂ԛIC= Lt耧ʾ peTK'֫h`VůC -endstream -endobj -303 0 obj << -/Type /Page -/Contents 304 0 R -/Resources 302 0 R -/MediaBox [0 0 612 792] -/Parent 229 0 R -/Annots [ 300 0 R ] ->> endobj -300 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [176.401 286.23 248.649 297.188] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a590b5c35075aeea1243a9e4ef73a49d4) >> ->> endobj -305 0 obj << -/D [303 0 R /XYZ 72 686.127 null] ->> endobj -6 0 obj << -/D [303 0 R /XYZ 72 668.127 null] ->> endobj -307 0 obj << -/D [303 0 R /XYZ 74.491 618.224 null] ->> endobj -308 0 obj << -/D [303 0 R /XYZ 74.491 618.224 null] ->> endobj -10 0 obj << -/D [303 0 R /XYZ 72 618.224 null] ->> endobj -310 0 obj << -/D [303 0 R /XYZ 485.963 513.196 null] ->> endobj -14 0 obj << -/D [303 0 R /XYZ 72 495.348 null] ->> endobj -311 0 obj << -/D [303 0 R /XYZ 84.453 398.147 null] ->> endobj -18 0 obj << -/D [303 0 R /XYZ 72 382.356 null] ->> endobj -319 0 obj << -/D [303 0 R /XYZ 482.188 135.988 null] ->> endobj -302 0 obj << -/Font << /F58 306 0 R /F59 309 0 R /F47 238 0 R /F13 312 0 R /F11 313 0 R /F7 314 0 R /F8 315 0 R /F10 316 0 R /F1 317 0 R /F14 318 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -324 0 obj << -/Length 1196 -/Filter /FlateDecode ->> -stream -xڥVn6}߯Уh(Elq6Mݢ.J\]6$wxEA gΜw.YQyN˯,]_.׋0UQAF(#I/!A2)WOR؈%C^_ &0ҙ͋b]LQA_⠆jfWrj5jQ\i >4CIM'O§ He6P3k쪯%Mv1 c_fҰ+\R/IrtUK [GܲdXT:jDM7vް>DH®[Z]LIXsYfk.x]#\B"M}RՔHG-^ ?Rϔ[m A74\K0|r`u^jh TZPZfP+[JӃh;Sٙ=KN -kSJ$M W-MPq)ab5Wj@p":)B Y -LLm$lMָBLMܤg0gD@8C," LcM/Ǎ(6&Q -G\WS$h -͉ʳx3=u#|uF>'=4f#Jd,2MQ;yT0 ÞBUm߹$)7ocK?*'!Y|)?=9|+(29Yq;> ۓǜ&°-z)[KkƄֆ u>sYQywUEV%`Κ$> oox(@@'7ZK_(roAf9شIλK'gR [.\M]wqN'"lyeowȬ$]0QbSbprLaۡ׏]k]Suv>Z]ϒalYB FEdt* )sx/A;L?np2I* +wg2nOCju?:Bڎ}ovRʱi%ϭ7\<)B۹Q;$z] -dF ]7 -+ -endstream -endobj -323 0 obj << -/Type /Page -/Contents 324 0 R -/Resources 322 0 R -/MediaBox [0 0 612 792] -/Parent 229 0 R -/Annots [ 301 0 R 321 0 R 326 0 R ] ->> endobj -301 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 614.453 189.219 625.357] -/Subtype /Link -/A << /S /GoTo /D (requires) >> ->> endobj -321 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [444.171 496.134 540.996 507.038] -/Subtype/Link/A<> ->> endobj -326 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [71.004 484.802 336.01 495.083] -/Subtype/Link/A<> ->> endobj -325 0 obj << -/D [323 0 R /XYZ 72 686.127 null] ->> endobj -22 0 obj << -/D [323 0 R /XYZ 72 668.127 null] ->> endobj -322 0 obj << -/Font << /F46 237 0 R /F59 309 0 R /F47 238 0 R /F48 239 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -359 0 obj << -/Length 570 -/Filter /FlateDecode ->> -stream -xڅTK@+ƙafj՚D䰵ԩa1קq8֮mAO9KL<`ϗ\"('O0c cFGqa/s)P7˷h4w\6sޣ)r!Ad\_gLGc2[eQ NE>Ch[o%v|NQ92i&:fBD9d]3Z1Ma긔bŪQeu8ʡԮ/>_s(ġdACO"Qv}A&Au_f\ZH -;-KUʼnEj <}<E\$e]g&Q+|Ce¤6h:YƠ j[Erw;; R/__gBS -endstream -endobj -358 0 obj << -/Type /Page -/Contents 359 0 R -/Resources 357 0 R -/MediaBox [0 0 612 792] -/Parent 364 0 R ->> endobj -360 0 obj << -/D [358 0 R /XYZ 72 686.127 null] ->> endobj -26 0 obj << -/D [358 0 R /XYZ 72 668.127 null] ->> endobj -361 0 obj << -/D [358 0 R /XYZ 74.491 618.224 null] ->> endobj -362 0 obj << -/D [358 0 R /XYZ 76.981 618.224 null] ->> endobj -30 0 obj << -/D [358 0 R /XYZ 72 618.224 null] ->> endobj -363 0 obj << -/D [358 0 R /XYZ 196.601 431.811 null] ->> endobj -34 0 obj << -/D [358 0 R /XYZ 72 416.02 null] ->> endobj -357 0 obj << -/Font << /F58 306 0 R /F59 309 0 R /F47 238 0 R /F48 239 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -367 0 obj << -/Length 1462 -/Filter /FlateDecode ->> -stream -xڵMoF W~z'MB .ڵvOAL[ _?.]w VXq_;@/B6Tߺ*%.+1f4\+H=.X1{hj AuZҸ/Ujo3$435957ZECx ^4y(1܈KB&o͌_E -JMK3}ϒ> endobj -328 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 615.236 146.739 629.184] -/Subtype /Link -/A << /S /GoTo /D (gf__vect__mul_8h_a15d42d058c64dec106d9e3e9fc2e1136) >> ->> endobj -329 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 603.281 147.855 617.229] -/Subtype /Link -/A << /S /GoTo /D (gf__vect__mul_8h_a84eb9ca31c934f05a8e3fa7a02fa71dc) >> ->> endobj -330 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 591.326 148.752 605.274] -/Subtype /Link -/A << /S /GoTo /D (gf__vect__mul_8h_a7a1f65b032f03494dbc68411f5614bb1) >> ->> endobj -331 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 579.371 167.212 593.318] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a1ff835062a19d6516f2d59d9c37ddb48) >> ->> endobj -332 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 567.416 169.225 581.363] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a4f880c4b9fe6700e040b9f4ef4e45918) >> ->> endobj -333 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 555.46 172.194 569.408] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a17c6ccf6470796b756841e160dc8697c) >> ->> endobj -334 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 543.505 172.194 557.453] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_abb7a991b4c0fb9ced373680ef36bae08) >> ->> endobj -335 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 531.55 179.188 545.498] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a26c2200ad3bf04b1c858eb239b7ff940) >> ->> endobj -336 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 519.595 174.206 533.543] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_ae1e4c9eb9a26a3a7852166d54d2a27f8) >> ->> endobj -337 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 507.64 172.194 521.587] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_af88a7da05f46e1a0fe17d032a2cf78bf) >> ->> endobj -338 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 495.685 172.194 509.632] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a06a563b718c6269c8df0fe7647e5bb49) >> ->> endobj -339 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 483.729 172.194 497.677] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a12f59be6d348fea6ad2464a20af22fd3) >> ->> endobj -340 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 471.774 134.714 485.722] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a22b53cd4103da9ed88c351e7045ff313) >> ->> endobj -341 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 459.819 160.149 473.767] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a21d5e25b4ac64062996149fea71aede8) >> ->> endobj -342 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 447.864 142.993 461.812] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a590b5c35075aeea1243a9e4ef73a49d4) >> ->> endobj -343 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 435.909 129.584 449.856] -/Subtype /Link -/A << /S /GoTo /D (gf__vect__mul_8h_aa7a737b69a0a77dc29aa28d0f17421a1) >> ->> endobj -344 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 423.954 165.678 437.901] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_aa486278c409735df8001096ac2b487dd) >> ->> endobj -345 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 411.998 152.268 425.946] -/Subtype /Link -/A << /S /GoTo /D (gf__vect__mul_8h_a8f3e57729c3382514325612c54e20eaa) >> ->> endobj -346 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 400.043 172.742 413.991] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a17799d49d9b83861322ebf314a55f77f) >> ->> endobj -347 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 388.088 150.057 402.036] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a6ce05684e168d73773847a3c2c13c175) >> ->> endobj -348 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 376.133 174.206 390.081] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a1fb1d6d463ac00ae196501c75d2036d2) >> ->> endobj -349 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 364.178 174.206 378.125] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_aacd489f45babdbfe6a41f1bac2885ab6) >> ->> endobj -350 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 352.223 174.206 366.17] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_ad0eca329291d751df6ffb3aa3eb83610) >> ->> endobj -351 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 340.267 174.206 354.215] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_afeefb3612c92a0bc87182f6e11030b11) >> ->> endobj -352 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 328.312 174.206 342.26] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_ac64153e1aef3cdc4b69d375ec762fa33) >> ->> endobj -353 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 316.357 179.188 330.305] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a2688b38c18e93c95c525c0d5bf9e221a) >> ->> endobj -354 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 304.402 179.188 318.35] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a2fb7662ba4e1df4bb72659c57efeaad6) >> ->> endobj -355 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 292.447 179.188 306.394] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_af88c501e0c5138ec9c88f58c182945e8) >> ->> endobj -356 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [77.38 280.492 179.188 294.439] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_ac6468d7eb3c28116439abb4a7c5eca05) >> ->> endobj -368 0 obj << -/D [366 0 R /XYZ 72 686.127 null] ->> endobj -365 0 obj << -/Font << /F46 237 0 R /F59 309 0 R /F47 238 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -433 0 obj << -/Length 621 -/Filter /FlateDecode ->> -stream -x[o0~iq}9=vRi4)Ph-%[`~ I)tQ&<s|G#RGL8 -̕iZS4?sކѩЈ*̨^#H -A -h;}Ôvw#BQ. n/IЫ~X Gn O&H1$yQF7Ο{7ݕY7qOv9 6ɢG El,w$$0ʲ]}[40AK"$ͽ4ITՉc½J8Mp^T9:`{6܂vvI99Q-Rag#^gӤ2dը0I2P5h1L2;|˙r nB}j(я,#࿽[4L^4OBX> endobj -398 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 597.638 156.263 608.542] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a21d5e25b4ac64062996149fea71aede8) >> ->> endobj -400 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 565.977 170.321 576.881] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_aacd489f45babdbfe6a41f1bac2885ab6) >> ->> endobj -402 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 534.316 175.302 545.22] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a2688b38c18e93c95c525c0d5bf9e221a) >> ->> endobj -404 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 502.655 168.308 513.559] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a17c6ccf6470796b756841e160dc8697c) >> ->> endobj -406 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 470.994 170.321 481.898] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_ad0eca329291d751df6ffb3aa3eb83610) >> ->> endobj -408 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 439.332 175.302 450.236] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a2fb7662ba4e1df4bb72659c57efeaad6) >> ->> endobj -410 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 407.671 168.308 418.575] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_abb7a991b4c0fb9ced373680ef36bae08) >> ->> endobj -412 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 376.01 170.321 386.914] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_ae1e4c9eb9a26a3a7852166d54d2a27f8) >> ->> endobj -414 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 344.349 175.302 355.253] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a26c2200ad3bf04b1c858eb239b7ff940) >> ->> endobj -416 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 312.688 168.308 323.592] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_af88a7da05f46e1a0fe17d032a2cf78bf) >> ->> endobj -418 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 281.027 170.321 291.931] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_afeefb3612c92a0bc87182f6e11030b11) >> ->> endobj -420 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 249.366 175.302 260.27] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_af88c501e0c5138ec9c88f58c182945e8) >> ->> endobj -422 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 217.705 168.308 228.608] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a06a563b718c6269c8df0fe7647e5bb49) >> ->> endobj -424 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 186.043 170.321 196.947] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_ac64153e1aef3cdc4b69d375ec762fa33) >> ->> endobj -426 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 154.382 175.302 165.286] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_ac6468d7eb3c28116439abb4a7c5eca05) >> ->> endobj -428 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 122.721 168.308 133.625] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a12f59be6d348fea6ad2464a20af22fd3) >> ->> endobj -434 0 obj << -/D [432 0 R /XYZ 72 686.127 null] ->> endobj -38 0 obj << -/D [432 0 R /XYZ 72 668.127 null] ->> endobj -327 0 obj << -/D [432 0 R /XYZ 74.491 618.224 null] ->> endobj -435 0 obj << -/D [432 0 R /XYZ 72 607.546 null] ->> endobj -436 0 obj << -/D [432 0 R /XYZ 72 575.885 null] ->> endobj -437 0 obj << -/D [432 0 R /XYZ 72 544.224 null] ->> endobj -438 0 obj << -/D [432 0 R /XYZ 72 512.562 null] ->> endobj -439 0 obj << -/D [432 0 R /XYZ 72 480.901 null] ->> endobj -440 0 obj << -/D [432 0 R /XYZ 72 449.24 null] ->> endobj -441 0 obj << -/D [432 0 R /XYZ 72 417.579 null] ->> endobj -442 0 obj << -/D [432 0 R /XYZ 72 385.918 null] ->> endobj -443 0 obj << -/D [432 0 R /XYZ 72 354.257 null] ->> endobj -444 0 obj << -/D [432 0 R /XYZ 72 322.596 null] ->> endobj -445 0 obj << -/D [432 0 R /XYZ 72 290.934 null] ->> endobj -446 0 obj << -/D [432 0 R /XYZ 72 259.273 null] ->> endobj -447 0 obj << -/D [432 0 R /XYZ 72 227.612 null] ->> endobj -448 0 obj << -/D [432 0 R /XYZ 72 195.951 null] ->> endobj -449 0 obj << -/D [432 0 R /XYZ 72 164.29 null] ->> endobj -450 0 obj << -/D [432 0 R /XYZ 72 132.629 null] ->> endobj -431 0 obj << -/Font << /F58 306 0 R /F47 238 0 R /F14 318 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -461 0 obj << -/Length 489 -/Filter /FlateDecode ->> -stream -xMo@s)LfwDʭŪ*P$>&RN9zyvK0눐PrkVzǫ/<ٟ+-c0 tBCcw6e=Fd = "XTA[ -)|++Qx -IG0YÇ2w%uֿ~aГ:dhȻ,]Uк{Zd"MяU$E@r-T dempj]3Ǝ8EOmtj&g׆pȍ&I)y)X._5dyzmWHƟ?|;Vt =+կͲ4uǾj/5w4{ù| 8mOuj9M^XY+dڜ5WU-w&_>/jW_Zm%%Ҩ[Z^EMVys -endstream -endobj -460 0 obj << -/Type /Page -/Contents 461 0 R -/Resources 459 0 R -/MediaBox [0 0 612 792] -/Parent 364 0 R -/Annots [ 430 0 R 452 0 R 454 0 R 456 0 R 458 0 R ] ->> endobj -430 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 655.203 165.34 666.107] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a4f880c4b9fe6700e040b9f4ef4e45918) >> ->> endobj -452 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 623.323 170.321 634.227] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a1fb1d6d463ac00ae196501c75d2036d2) >> ->> endobj -454 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 591.442 163.327 602.346] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a1ff835062a19d6516f2d59d9c37ddb48) >> ->> endobj -456 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 559.562 144.866 570.466] -/Subtype /Link -/A << /S /GoTo /D (gf__vect__mul_8h_a7a1f65b032f03494dbc68411f5614bb1) >> ->> endobj -458 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.494 527.681 142.854 538.585] -/Subtype /Link -/A << /S /GoTo /D (gf__vect__mul_8h_a15d42d058c64dec106d9e3e9fc2e1136) >> ->> endobj -462 0 obj << -/D [460 0 R /XYZ 72 686.127 null] ->> endobj -463 0 obj << -/D [460 0 R /XYZ 72 665.111 null] ->> endobj -464 0 obj << -/D [460 0 R /XYZ 72 633.23 null] ->> endobj -465 0 obj << -/D [460 0 R /XYZ 72 601.35 null] ->> endobj -466 0 obj << -/D [460 0 R /XYZ 72 569.469 null] ->> endobj -467 0 obj << -/D [460 0 R /XYZ 72 537.589 null] ->> endobj -459 0 obj << -/Font << /F46 237 0 R /F47 238 0 R /F14 318 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -476 0 obj << -/Length 583 -/Filter /FlateDecode ->> -stream -xU]o0}ϯC] Xu> uHLuRA+*1tq|oa aFX XriQ -44x7ƉP@bD0ρsR @\ -g_8E#GH{dv;.W/-̃1)Hh(H7Cfo3y.>~t0@8b\RGۦ[.sD#14Umv{RCqcHK*] 43mۮ:\#m8ٱY,:3(AZ=YM>] en+_•뷫z~Skh$lC5pOy~o1" -P?Η?""Bvͮ<+Tn1XDzNY-[+e\8M\u a rr׀!Izz_l,_gtcf!wj{5,[۽lM7teܠWà}&>~jF5 ^?i)?c -endstream -endobj -475 0 obj << -/Type /Page -/Contents 476 0 R -/Resources 474 0 R -/MediaBox [0 0 612 792] -/Parent 364 0 R -/Annots [ 468 0 R 469 0 R 470 0 R 471 0 R 472 0 R 473 0 R ] ->> endobj -468 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [85.177 546.885 147.194 556.813] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h) >> ->> endobj -469 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [534.022 536.011 540.996 544.858] -/Subtype /Link -/A << /S /GoTo /D (section.5.1) >> ->> endobj -470 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [85.177 521.998 144.853 532.902] -/Subtype /Link -/A << /S /GoTo /D (gf__vect__mul_8h) >> ->> endobj -471 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [529.041 512.101 540.996 520.947] -/Subtype /Link -/A << /S /GoTo /D (section.5.2) >> ->> endobj -472 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [85.177 498.088 115.672 508.992] -/Subtype /Link -/A << /S /GoTo /D (types_8h) >> ->> endobj -473 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [529.041 488.19 540.996 497.037] -/Subtype /Link -/A << /S /GoTo /D (section.5.3) >> ->> endobj -477 0 obj << -/D [475 0 R /XYZ 72 686.127 null] ->> endobj -42 0 obj << -/D [475 0 R /XYZ 72 668.127 null] ->> endobj -46 0 obj << -/D [475 0 R /XYZ 72 618.224 null] ->> endobj -474 0 obj << -/Font << /F58 306 0 R /F59 309 0 R /F47 238 0 R /F13 312 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -495 0 obj << -/Length 1402 -/Filter /FlateDecode ->> -stream -xKs6BTޏci2MҺ)I5D+JRr (tHͫⱋ.\8x6aF -0bJr O)&AMF?LFυBL 1)Ry&|ӓ_&gј*E06y0rgӏ$"O'_CGgџ#at0{?zsֽ\jx.FL}f)& 1.] -L- 訋N  8L\q4K)7$0u{"b!DQĽ]$HAhI6s5 }|U`TyJBa[Oj*]-ڔpkl(ˡ9B-M2 Dqc`ݠ 2J A^{u\8~^8G!ճWzV)'!_Gmx* PT0mvCC'aNC͑4D1uj(2Q}x G0`WUy5mvVaʺY귯(?4jo'PH$qi7YWiJ{];]U{Nڭ' 1UC0m5H2J Xu۴~#j]@{i:Z0`}qA["m{kjf+x_~A׉h,_L+Ŀ1Iu[9g? m -endstream -endobj -494 0 obj << -/Type /Page -/Contents 495 0 R -/Resources 493 0 R -/MediaBox [0 0 612 792] -/Parent 364 0 R -/Annots [ 481 0 R 482 0 R 483 0 R 484 0 R 485 0 R 486 0 R 487 0 R 488 0 R 489 0 R 490 0 R 491 0 R ] ->> endobj -481 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [115.915 489.057 173.249 499.961] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a22b53cd4103da9ed88c351e7045ff313) >> ->> endobj -482 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [116.545 461.161 199.314 472.065] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a21d5e25b4ac64062996149fea71aede8) >> ->> endobj -483 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [117.601 421.311 183.215 432.215] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a590b5c35075aeea1243a9e4ef73a49d4) >> ->> endobj -484 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [116.945 381.46 205.243 392.364] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_aa486278c409735df8001096ac2b487dd) >> ->> endobj -485 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [115.7 341.609 205.532 352.513] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a1ff835062a19d6516f2d59d9c37ddb48) >> ->> endobj -486 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [115.583 313.714 207.428 324.618] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a4f880c4b9fe6700e040b9f4ef4e45918) >> ->> endobj -487 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [117.78 285.819 214.606 296.723] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a1fb1d6d463ac00ae196501c75d2036d2) >> ->> endobj -488 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [115.634 245.968 210.448 256.872] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a17c6ccf6470796b756841e160dc8697c) >> ->> endobj -489 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [117.78 206.118 214.606 217.022] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_aacd489f45babdbfe6a41f1bac2885ab6) >> ->> endobj -490 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [117.424 166.267 219.232 177.171] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a2688b38c18e93c95c525c0d5bf9e221a) >> ->> endobj -491 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [115.634 126.416 210.448 137.32] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_abb7a991b4c0fb9ced373680ef36bae08) >> ->> endobj -496 0 obj << -/D [494 0 R /XYZ 72 686.127 null] ->> endobj -50 0 obj << -/D [494 0 R /XYZ 72 668.127 null] ->> endobj -478 0 obj << -/D [494 0 R /XYZ 74.491 618.224 null] ->> endobj -54 0 obj << -/D [494 0 R /XYZ 72 618.224 null] ->> endobj -497 0 obj << -/D [494 0 R /XYZ 72 508.03 null] ->> endobj -493 0 obj << -/Font << /F58 306 0 R /F59 309 0 R /F47 238 0 R /F48 239 0 R /F14 318 0 R /F73 498 0 R /F43 499 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -517 0 obj << -/Length 994 -/Filter /FlateDecode ->> -stream -xKo8> endobj -492 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [117.78 642.06 214.606 652.964] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_ad0eca329291d751df6ffb3aa3eb83610) >> ->> endobj -500 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [117.424 602.209 219.232 613.113] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a2fb7662ba4e1df4bb72659c57efeaad6) >> ->> endobj -501 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [115.634 562.359 210.448 573.263] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_af88a7da05f46e1a0fe17d032a2cf78bf) >> ->> endobj -502 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [117.78 522.508 214.606 533.412] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_ae1e4c9eb9a26a3a7852166d54d2a27f8) >> ->> endobj -503 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [117.424 482.658 219.232 493.562] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a26c2200ad3bf04b1c858eb239b7ff940) >> ->> endobj -504 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [115.634 442.807 210.448 453.711] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a06a563b718c6269c8df0fe7647e5bb49) >> ->> endobj -505 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [117.78 402.957 214.606 413.86] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_afeefb3612c92a0bc87182f6e11030b11) >> ->> endobj -506 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [117.424 363.106 219.232 374.01] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_af88c501e0c5138ec9c88f58c182945e8) >> ->> endobj -507 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [115.634 323.255 210.448 334.159] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a12f59be6d348fea6ad2464a20af22fd3) >> ->> endobj -508 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [117.78 283.405 214.606 294.309] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_ac64153e1aef3cdc4b69d375ec762fa33) >> ->> endobj -509 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [117.424 243.554 219.232 254.458] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_ac6468d7eb3c28116439abb4a7c5eca05) >> ->> endobj -510 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [115.378 203.704 210.74 214.608] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a17799d49d9b83861322ebf314a55f77f) >> ->> endobj -511 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [115.915 175.808 188.592 186.712] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a6ce05684e168d73773847a3c2c13c175) >> ->> endobj -512 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [154.012 147.913 184.786 158.817] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_ac73ea8358bc3155c7f3a6c078a7d6d35) >> ->> endobj -513 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [154.012 120.018 181.618 130.921] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a484460566a8c888fda3d769324461345) >> ->> endobj -518 0 obj << -/D [516 0 R /XYZ 72 686.127 null] ->> endobj -515 0 obj << -/Font << /F46 237 0 R /F73 498 0 R /F43 499 0 R /F47 238 0 R /F14 318 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -527 0 obj << -/Length 2526 -/Filter /FlateDecode ->> -stream -xZK6ϯ<ۻTJҘ&Hx$, -PXrICdm, -}^5yRGvAůw?Ы >/ +IUoo>J5RuFq(`Ta nP^Pƴz,"eQ~|AZ/2|4yvcBMa"!`Bs8L̤2$x=W9x`$f8g8ʼ/3!`lh;;5;_ \[X.MZ&;^'TN!Յ -盺u<3hug6pE, ]&Ö} (k0~}"svep_km7 [VStq=ﴝ22%xd֝Ĩ,YithdYٮhamX9]Tș?}ӇCpcf*֕j ё06̸-fQS_vŮtt]lmŞO9\WVn[Ė#w -w 8'u`& -߂v}n63 Gv˧^1YN}q$]ҵqdxݛ}r|;ġ'Q?wjz[7{+}YvyY08Z  ^r!mׂ2$8}JS}(`=8=IPe!'-my7NH_X2:25&2^I*Vj@f R#`XxXe #RiLgQs< rE΃W$9aӭRRLո];+bb)KA0{:F{aGىlUkjWei$fgM_Ʈ)FnBC=fI`”lxm`d8³T_·s V6wn%HX;}6Ϭ˞IZP0+ðԋc4!yFRBkS9̯<( JYG^0.[ 0i LK)s$-M8T%ΥnvڢqL:_щ8oBy̕ޏZ!lHf /6՜]' McvM?Y -OWhZw%@8., 7,ɭ &/KJ4<];SV㟱gME {y_/ţ.Di(0 a)JHN$HKREr3DWy)S/0 -C]=t~RY8I/3b#r̴^y}GӁr~(%%` ^ܽQr(IoW[Mo,zzS8ۄ}*fV9lG{q\ GGb+m`H#Xɰ~jecgd ~%*PBzt/qw]ԮoO$RW5hwY=71=87LΞl9])B(_Hsu9ru}"`+]O$& 7,޿|_ᠶUH ˫YF)(Qw}SG~9ppnr?$VT< -endstream -endobj -526 0 obj << -/Type /Page -/Contents 527 0 R -/Resources 525 0 R -/MediaBox [0 0 612 792] -/Parent 519 0 R -/Annots [ 514 0 R 522 0 R 523 0 R 524 0 R ] ->> endobj -514 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [115.915 642.06 188.741 652.964] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a81be18ea979e8a32f384e1a7856badcf) >> ->> endobj -522 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [115.915 614.164 214.694 625.068] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_afd549f435ee28276b5a9408a3a6256b1) >> ->> endobj -523 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [108.921 586.269 177.882 597.173] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_ad808efb2e8af3803571c0a6c7c9faf39) >> ->> endobj -524 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [435.802 210.231 499.771 222.749] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a22b53cd4103da9ed88c351e7045ff313) >> ->> endobj -528 0 obj << -/D [526 0 R /XYZ 72 686.127 null] ->> endobj -58 0 obj << -/D [526 0 R /XYZ 72 558.334 null] ->> endobj -62 0 obj << -/D [526 0 R /XYZ 72 427.484 null] ->> endobj -320 0 obj << -/D [526 0 R /XYZ 72 403.078 null] ->> endobj -66 0 obj << -/D [526 0 R /XYZ 72 403.078 null] ->> endobj -530 0 obj << -/D [526 0 R /XYZ 72 271.167 null] ->> endobj -384 0 obj << -/D [526 0 R /XYZ 72 113.727 null] ->> endobj -525 0 obj << -/Font << /F46 237 0 R /F73 498 0 R /F43 499 0 R /F47 238 0 R /F14 318 0 R /F59 309 0 R /F13 312 0 R /F76 529 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -539 0 obj << -/Length 2066 -/Filter /FlateDecode ->> -stream -xZ[6~_G/- Pd}HǖgT3{(RhHf7@$F'7aFJ0bJr O)&I__Ow7oAFRmE R'wC*Y,iVC :>M|w6s:[~ \aɈ"%$7^qB\8/֞s+O%o -j~%9[ @Œ` 2xFDF@B#Qd9x -a X XeHCįTHy~Ffլ"^5P*^ AZ^,i^467oUb6 z >4ҒtBqC"麎 IFdugbclPrZ=OZNN7Y$7it]0ҘJv9[h `.dɴ", AF'q=6a($lb "?QV&' -e%JY5sWi;\{=wS7)p= o]eڅİ -IwmKYO+[uy..05i TQX {&e}ЇodU;S!_5U[[kl+;Ͽ=.RD`wGĘDC6@ڡwF[[p> -ac(ULu"8[V<4aV^u,nn_QMY[/<֥A!UpDV<}8i$N xT3uLGKݣgqgUCT-~4QgחNxnto;9Y9jrm25؂sR^{6aw;<sy4eb}*8Vw_|j;7WIu,t4om*cu4p -Hf;a8->0ZxjŽg^8DX)rb7*ky}:lǼțΡ=.n0/2Ph:t{++~}X NXn0oޥw{F $.͒U\AרMp^;G7OGOzZﻺd{9{?{c :%s:|zK({QRuTTD<ӼswsuDGO!c1=_L S 7Oϳ(aƜzayVwL,,B_5# >k -42LF5Z{ 5H9mkq$]uZue>E}#mh!a0{Lb9}}a[j71?xx&F`?ehp0J_Lb$V$vHM通/w@MK6þOoJRW /.ug?/ǃC~9M,9VFsh ir=zz6S)a)7Mu|h%G72hg:J(!@SjLE1ǓD12c$}7>~AέRө3r:?wpX(j.:?>q:}Kz||:ӹzhgpYQJ<]lvh6ۿH$ nz6Sa3 #:~L6}ߎ=0ok;H]O|Ӱs#i~v)u -shc$57wp -endstream -endobj -538 0 obj << -/Type /Page -/Contents 539 0 R -/Resources 537 0 R -/MediaBox [0 0 612 792] -/Parent 519 0 R -/Annots [ 534 0 R 535 0 R 536 0 R ] ->> endobj -534 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [435.802 500.345 499.771 512.863] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a22b53cd4103da9ed88c351e7045ff313) >> ->> endobj -535 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 260.492 111.003 271.372] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000001) >> ->> endobj -536 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [435.802 173.703 499.771 186.221] -/Subtype /Link -/A << /S /GoTo /D (erasure__code_8h_a22b53cd4103da9ed88c351e7045ff313) >> ->> endobj -540 0 obj << -/D [538 0 R /XYZ 72 686.127 null] ->> endobj -70 0 obj << -/D [538 0 R /XYZ 72 668.127 null] ->> endobj -541 0 obj << -/D [538 0 R /XYZ 72 561.282 null] ->> endobj -382 0 obj << -/D [538 0 R /XYZ 72 401.032 null] ->> endobj -74 0 obj << -/D [538 0 R /XYZ 72 386.462 null] ->> endobj -542 0 obj << -/D [538 0 R /XYZ 72 234.639 null] ->> endobj -537 0 obj << -/Font << /F46 237 0 R /F59 309 0 R /F76 529 0 R /F14 318 0 R /F47 238 0 R /F13 312 0 R /F73 498 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -546 0 obj << -/Length 2219 -/Filter /FlateDecode ->> -stream -xn_G -f>ÇHhl҂(XtH̍"#799s('83TSKxJ5IZOo|{2I*mh"u& -DVk*pZyoWD忋fS]Jz_nKw.կ_E%֌H!RB'ؾ'+PFuR<^}'tbO=&\jxy`j` -4/%B<,Ry_OΒ5<1nj/ #k@,YsЃ>E|&yEyTPD> %I$6`sB( /AF\&4ꪏ1u -h6%w+],jͅn,3ؤ@ܑ)Wp$P gi""}b@pz_w}]z=C:(p#$@0|_#~V.&ˑQVɚrx -U?>ĀamZ0,]޾qʟ_u1zF2dMRoc7e 7ĘiPKKOOy2e9[?1pqV]nnm>G*es`n#A^}#y{U?\ܮ0vA{t" T x`BWeoI4 S)⺠l=_,Kf xubcGЯR`/xk2ĥJ(a9!y=?ޕJ͙t;-Ͷ1zK >Y%@Uߣ/o/8/Tءf[ADfljpq 銋yN΅3VlݕSX10HC4#Hz\N^Sχ?_} -/sbeH/H͗>CjFLk7[&d7MHK*4cSO)EMr&ǗR2)RM#ɩ95we@ Lӄgze@Cο*D(cj9'81(:;)NUK!3C|-)>&EHDYn< +7f$agI"蔶|DDv6}_^f!> endobj -543 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 239.795 111.003 250.674] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000006) >> ->> endobj -547 0 obj << -/D [545 0 R /XYZ 72 686.127 null] ->> endobj -381 0 obj << -/D [545 0 R /XYZ 72 632.899 null] ->> endobj -78 0 obj << -/D [545 0 R /XYZ 72 618.329 null] ->> endobj -548 0 obj << -/D [545 0 R /XYZ 72 527.832 null] ->> endobj -389 0 obj << -/D [545 0 R /XYZ 72 392.29 null] ->> endobj -82 0 obj << -/D [545 0 R /XYZ 72 377.719 null] ->> endobj -549 0 obj << -/D [545 0 R /XYZ 72 213.941 null] ->> endobj -544 0 obj << -/Font << /F46 237 0 R /F59 309 0 R /F47 238 0 R /F76 529 0 R /F14 318 0 R /F73 498 0 R /F13 312 0 R /F11 313 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -554 0 obj << -/Length 1723 -/Filter /FlateDecode ->> -stream -xZIoFWHdi"u@45ؤCRv_7 iRK2O-|7eF\S -IR[~:;|>{u[IerLM6H/@dQS[ͺjaU?Y]۰:K>;G)|B9}X}2T'g,`gtrO$\jx^'g>(+G[G0C1OȘh3ۮd|AՀhI2xbFyY@#3,8ED"98SV8r陎CGDbl(2fzlpv -#%- B#IٳIBbՔPő!Y*X-ĶHń\#X|NHz/ >g&xu!ږ?Cc9Ru 13w[8Q6ݩu٬.Kñ*ԓ*"zO` ȧݙe{1'8n&0}[4SPӛŤ]AXG\ #ē׶ -".ykv/ۑ#<[X4_+Lo7)#.6NˢyqV_ϫQ+ -]IpP4k\t >vlڼ5.TʖmUr\u]Dd̘ 6PbY‹Uy ` )?1)<'hWUzU;绷f]0#+مW:Q(WbB&6ǭ>\\c;GroVM;mvCUraׅ6k?&7RV`snIVwvn 9@yZ^7u jL usPC93P]CX1zen27~̍_ƣo8";y`=y&t -endstream -endobj -553 0 obj << -/Type /Page -/Contents 554 0 R -/Resources 552 0 R -/MediaBox [0 0 612 792] -/Parent 519 0 R -/Annots [ 550 0 R 551 0 R ] ->> endobj -550 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 480.404 111.003 491.284] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000007) >> ->> endobj -551 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 154.16 111.003 165.04] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000005) >> ->> endobj -555 0 obj << -/D [553 0 R /XYZ 72 686.127 null] ->> endobj -393 0 obj << -/D [553 0 R /XYZ 72 632.899 null] ->> endobj -86 0 obj << -/D [553 0 R /XYZ 72 618.329 null] ->> endobj -556 0 obj << -/D [553 0 R /XYZ 72 454.551 null] ->> endobj -374 0 obj << -/D [553 0 R /XYZ 72 306.655 null] ->> endobj -90 0 obj << -/D [553 0 R /XYZ 72 292.085 null] ->> endobj -552 0 obj << -/Font << /F46 237 0 R /F59 309 0 R /F47 238 0 R /F76 529 0 R /F14 318 0 R /F13 312 0 R /F73 498 0 R /F11 313 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -560 0 obj << -/Length 1933 -/Filter /FlateDecode ->> -stream -xZYoF~ׯ#TH"u@4ElҡA)Z$αs|6n"0Œ0aĔRhM,]Ͼ8)26H].@dY78+-g̏.ol OR.z`D -ÌG+:Jgoh ,?On}ĥ]췝R[娰C i0摔zNy}V#x>oGٿW!qf]Y/iJQ,@=';Bz÷1XQ>(l DcYȉ1w2z{h jJus u)S4:X[&u+Hʐ!J]*"Ό7uuu>QbXlQv=ªMVh!RD MWKl0PK4zp>D[s`ۙM/ߛwۃϋecw%DFkr%g||!4;ZWO-ηBU$ *n'MG٪ʓjUjhTIw@hOÒ[5Ry^dզ̻}h;Y."=SK7rvmm(8`lKhM\*xS;b TĵvQx< X@+ -`" -m 8X($vK8nt -1P -XvH6j v Ni[rbΏ{7\p+_PfW/ -F#xM݌Efi nMkW7y"26);*#L; - -o؊qݺS Ejq@k -5WdBnpqi?BBo 5SUq> endobj -557 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 367.478 111.003 378.357] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000009) >> ->> endobj -561 0 obj << -/D [559 0 R /XYZ 72 686.127 null] ->> endobj -562 0 obj << -/D [559 0 R /XYZ 72 667.868 null] ->> endobj -390 0 obj << -/D [559 0 R /XYZ 72 519.972 null] ->> endobj -94 0 obj << -/D [559 0 R /XYZ 72 505.402 null] ->> endobj -563 0 obj << -/D [559 0 R /XYZ 72 341.624 null] ->> endobj -394 0 obj << -/D [559 0 R /XYZ 72 193.729 null] ->> endobj -98 0 obj << -/D [559 0 R /XYZ 72 179.158 null] ->> endobj -558 0 obj << -/Font << /F46 237 0 R /F59 309 0 R /F73 498 0 R /F47 238 0 R /F11 313 0 R /F14 318 0 R /F76 529 0 R /F13 312 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -568 0 obj << -/Length 1836 -/Filter /FlateDecode ->> -stream -xZ[o6~У ,6ۚ6tmP hA@"HJ(n,{$Iht*0%hZU8ُg'JHN##mbNX6_pEJu5g6eN.*7y.Y>xjFb.zL+35tiư *pe׳i+/g:{Anޮ,a}9c,γD˲ \GyӬW)7KUer}nN=uN )msw@_|r'g'LD$FXǼPtpmFEѢw#_cVu2ξ4^@& hI -hs\3;֍W^ҪJݴXv#EݤE{=Pfe~>*@)Vyѝ{YY*pT֫)EgF+y.|Dk dpJ8W`39S$#`[.6=AJByo]<[@ķ.,F#8\ D}rC5-D-N$!4>V%=؅)onx=gql>ݎJ!X3zFzLx’$Rۅ -IAbBb6HΙLqgPT͔!_⢹g3)p9@ƿ֖-YfӍ{0ֳ1.]a(r4Vp!t+: >XO3@+BbPtuN3Fu܌T[_Ќ.U׻7{Cp -NaATh7jOn%^7gWzDu\=U8h΅  i樀]ƙAذ@g]Õ.;"l, ƶVy|jBSo?jrh:{ 'kd 5\8 &mЋm73ں׫vizvr8'@jKрZ ->p—^5ŽzFu\}ֳcoUmHk -K{?c?_3]Ï^`R*/iU񠖄Ybhi.xQfgC@c lB?)2*AR\,$ꈙ &D‚3)$*EW (-ZQjD/%dݼ.QXT(D-'R!ћ.eNa%9E;0\yPAAHnBEa 4R~.\zjM3&nAMwk]ԫ"o12FJ#7Snm4`~wstgW( O= gF l$|p/ >DJo#6d-4uVAڊQ #ujMy'p{%NƝj8ӥx?>fQd ÈJ rRscM> endobj -564 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 591.693 111.003 602.572] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000010) >> ->> endobj -565 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 265.449 111.003 276.328] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000008) >> ->> endobj -569 0 obj << -/D [567 0 R /XYZ 72 686.127 null] ->> endobj -570 0 obj << -/D [567 0 R /XYZ 72 565.84 null] ->> endobj -375 0 obj << -/D [567 0 R /XYZ 72 417.944 null] ->> endobj -102 0 obj << -/D [567 0 R /XYZ 72 403.374 null] ->> endobj -571 0 obj << -/D [567 0 R /XYZ 72 239.596 null] ->> endobj -566 0 obj << -/Font << /F46 237 0 R /F47 238 0 R /F13 312 0 R /F14 318 0 R /F59 309 0 R /F73 498 0 R /F11 313 0 R /F76 529 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -577 0 obj << -/Length 1709 -/Filter /FlateDecode ->> -stream -xZYo6~_G-P1H"u@k %Gw(R֮0>I\i. g>GW,0Œ0aĔRhM ->otf2H*uh$Ab}"˄ -*jItlʕEY~cܮ'(2tvO2.0"HbyA`#PepoZ)a|vU)Ut"TciOL12e9] L L0Hp -*:[|66T=Ѽ BΞ~$æj:*ll\PS\i3(?lj\. oY+ FnK %q6WVڑ0HrA\ =jVn|B d B(QB9p% C~#rG ISM -!ɒƽ;MP=vg[U/yZͺle6wmS# HC]4p`H/Qㅻ 1t?.@[SgdMX+[׿M4-uciM힄ku+vW{iVu0Ŧٵ_]~mRa`^l'kеMeZUװ,V~,&-mmn%jnK*\^,Eݹ=A׭:{GF MR?EF=&/Ra5 ;+!"&Y[dM^ۼrawwM -$| PXUq :@茜nuW۽Y`(𾏼#I[ߛ,B2 ?i=uv 8}rqz Z&xxR\L:DT33?6@.Ax8H8K6xފy_7Q/kQ;Q/@WAـ5c"!}GpGq#NC̠;pJ\KOlL t䗶|ié$ >9zYDp ޘf=E,>1,J4:N|^jFSCl+7Bp8:wqeA-޽;=TExkM5GiXH.p!0ޣ'8;DoθeBЯ2tn{5'o}=IhW_uM޽$ m zhG]-&hkg$cf?ݧj:9i4O.x LpTmv`svLA'PK:97;@&fzqZ<ֺwyy_q܋Irk1Ku<91c?ә1>84 -̗'ύ9$C]cc:И3@xJ72z1VϠbhFNy1d==0J?90J10̍HQ=50J?0[?is`,>c Sڑ0_闁e`20~tx! W/0 -endstream -endobj -576 0 obj << -/Type /Page -/Contents 577 0 R -/Resources 575 0 R -/MediaBox [0 0 612 792] -/Parent 572 0 R -/Annots [ 573 0 R 574 0 R ] ->> endobj -573 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 480.404 111.003 491.284] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000012) >> ->> endobj -574 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 154.16 111.003 165.04] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000013) >> ->> endobj -578 0 obj << -/D [576 0 R /XYZ 72 686.127 null] ->> endobj -377 0 obj << -/D [576 0 R /XYZ 72 632.899 null] ->> endobj -106 0 obj << -/D [576 0 R /XYZ 72 618.329 null] ->> endobj -579 0 obj << -/D [576 0 R /XYZ 72 454.551 null] ->> endobj -376 0 obj << -/D [576 0 R /XYZ 72 306.655 null] ->> endobj -110 0 obj << -/D [576 0 R /XYZ 72 292.085 null] ->> endobj -575 0 obj << -/Font << /F46 237 0 R /F59 309 0 R /F47 238 0 R /F76 529 0 R /F14 318 0 R /F13 312 0 R /F73 498 0 R /F11 313 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -583 0 obj << -/Length 1906 -/Filter /FlateDecode ->> -stream -xZKoFWHfߏC "u^)`IM}gTHbDR rȉ+rwٙٙm30#LE1%Z>]^tu^d$Mh$Aj"Ɋ -UZo8;+9zߟor?or?Ջ3H)DLTOg8"^_ Qv-gtuqy:R;娰Ck0摔2oI\; -~p(%(1&!f 2Bpu G@Rk™i"U *0M&s7 q5eo -5J q۶n[ J(O)⺝(zj V`ϰF? -9?-1ĬQ#ehC.~ldna6-pޯX"m(Cv+{HR837]}ر`څ}Yn -Ӹ)<rYnO)hat@)R\;宓?4 seZUF}P,˶wi,&-ONKYWͻܿIdA"tmZAMBUJ*$V.dC690F?ֻ3 G-Lш0oJ`&)m\=3\{QBdy=G/K !P*:⠛zz"m6ei -(8޺D'o? |O^>%\#,elbF -ș(3W 8+nDZ4?ۚzr2@1VנMn"SKN\}ƵBZSG(`%CϝVJ?î!Pe$͜>CeKrb7}12ܶ}ν` -r mᚑ[&650ÂEPt!Ipo3Yۢy,Q(v.)b:zP *q@5;K 14+AT=V [1L{ۄ ֩_媽R rvޡT8V,(l IkHC\ufi`/er6m#Hɶͮmm]45&V8 p@Ccxi[ߦA`ns)zaKW!95jfUYUp"(vm:m̰FpAD.ihq.[J;mL FEσkmiɮŰ]|6qzќ6<7 <| 8nUwJ\.NBSahYQx&갏_4/g{1tJHS|"m]ݪ[N+'J` -1F˓ڸ;B:ژA?ES {ژSw>ۧaXpz uQԱښ#c:;˵ٱܱ ;m%j")|dT 9L_Kj- -endstream -endobj -582 0 obj << -/Type /Page -/Contents 583 0 R -/Resources 581 0 R -/MediaBox [0 0 612 792] -/Parent 572 0 R -/Annots [ 580 0 R ] ->> endobj -580 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 367.478 111.003 378.357] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000011) >> ->> endobj -584 0 obj << -/D [582 0 R /XYZ 72 686.127 null] ->> endobj -585 0 obj << -/D [582 0 R /XYZ 72 667.868 null] ->> endobj -378 0 obj << -/D [582 0 R /XYZ 72 519.972 null] ->> endobj -114 0 obj << -/D [582 0 R /XYZ 72 505.402 null] ->> endobj -586 0 obj << -/D [582 0 R /XYZ 72 341.624 null] ->> endobj -391 0 obj << -/D [582 0 R /XYZ 72 193.729 null] ->> endobj -118 0 obj << -/D [582 0 R /XYZ 72 179.158 null] ->> endobj -581 0 obj << -/Font << /F46 237 0 R /F59 309 0 R /F73 498 0 R /F47 238 0 R /F11 313 0 R /F14 318 0 R /F76 529 0 R /F13 312 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -591 0 obj << -/Length 1839 -/Filter /FlateDecode ->> -stream -xZYoF~ׯ# TwA[H҂hM:$$=r%J(5 -?qI;\6"X`a*ˆ)%<КD /ߟ/2R4:E|"ɒ -M֮+Wvʛ­^PE\vɈ"&:ÂG+PJu.޾ -4R}n#.5!"ݺk:2ϥ-Pd?ENjwXgг3"RŴ9#E I"݉tۂS ]8Mu֗"$tT'O>erji]]b6uC[X ϼ.. !ˢ {>0Vwa YCVy --ƗOݕWhUVW 84H2f*JBl]]YW. )I]F= >rx9vz؄cpjat]Z:{jv`dֲLb˜;7 T^kUPl1A. $mK*$r_[|ll7i(Fy揍IY!trX)J(fEg1f"{"HP6DS#ఁ}<`۱A^X [^ڈv3niL* - &B! @Eu,jɲ. ʅ={ཬ\ ǿ!kIxN{nV*a÷3m#p4F +9ctG'(u@HF3O(}6M^p=Xq=90z(KV -*P#N}.v7N:.+~S[@u<ùȽ 38(w,IٔӲOAӸF!߷nK U>,s}vMK!K)„?WP$Cj)78z{xJ h$JDƶI`[~Qls7uo"\"] 2̆HzР[D94⫑UjiIy,8*s͐u @\3kukܠ2\"ҾMNhi43G^ՕmD! !12!06U %uid!NH -1 L`mK%dSܛBCQ4!V2BEPl'vB5EP]cjz-b$)tPrfZOlRɒKa7)j;3XiPm4#BvTLqMPŬ -y묙(@eT f7) Bء1ԅ 1aהCX2AaCgM@g7*d FZ*(*xGCjfQPN@'Z*75yjDzƖ&D?B:6rJ*F_zi4jYf -G.%QN2koϚg -_۬=mVrS/`pIbLa5:=#4] -+(gzE(mKLI45; k igCt`ww@JIfDHCf3O_f|!T@YjaQdl,/0ĬyiRc"}5Phr?zF8 -endstream -endobj -590 0 obj << -/Type /Page -/Contents 591 0 R -/Resources 589 0 R -/MediaBox [0 0 612 792] -/Parent 572 0 R -/Annots [ 587 0 R 588 0 R ] ->> endobj -587 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 591.693 111.003 602.572] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000015) >> ->> endobj -588 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 265.449 111.003 276.328] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000016) >> ->> endobj -592 0 obj << -/D [590 0 R /XYZ 72 686.127 null] ->> endobj -593 0 obj << -/D [590 0 R /XYZ 72 565.84 null] ->> endobj -395 0 obj << -/D [590 0 R /XYZ 72 417.944 null] ->> endobj -122 0 obj << -/D [590 0 R /XYZ 72 403.374 null] ->> endobj -594 0 obj << -/D [590 0 R /XYZ 72 239.596 null] ->> endobj -589 0 obj << -/Font << /F46 237 0 R /F47 238 0 R /F13 312 0 R /F14 318 0 R /F59 309 0 R /F73 498 0 R /F11 313 0 R /F76 529 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -599 0 obj << -/Length 1921 -/Filter /FlateDecode ->> -stream -xZKoFWHfߏC ml h1IZ`.)9I}gHR$@zcgfgf? ' N.'aFJ0bJr O)&I|x=yqSIerHM6H\ϓ@dQS[ڿfܢ0ate6,(fv\>cD -z'$+:=L_;~F'K RrT{DӵADJVuUM'TuȉF -$'f4e ԓ%8# -SDnUN31Nr`<]x=*EFN $H&@l5 V2R[ڢݢuQԽeDa c"~^6jqٱBeq̀Lmh Ӌu1[-"|e=V61LҮr{!r%͠Piڼ?:A`o7r> ZHKroYH}˜ 1B4A< -roMA ՒL?vT!Ql| {To]-o۷8"[3 pR<7˫\3MaElVD씡s#bL( :")֭`1y1i{Py~#/w-n)4PEx$uS :+n]} YzAM< -}9l|GʻáJt'u8|R[?ت>ASjfC~=Y_\W~=ia~RSplI6z_GIjWTέpm #lsw(E%qPf -l7|mLuڔ/然%KB見0 -=LYH -m*xj>|"ݚ-GTO3=:# sùH=2Ͻ'`32^:1:vMoM}l/t{|}O93郫FZ839' ya?wg޲5Ôcfu̎(l0f}fv,,G!̂0Bqh@VA%<2D,YD,Y,4X2KFܜcݽ56hAXтf F od#" sa0taKAa3ɨ.LGua.03v̘7#f 33vl[+5̘R7 -3fu0cie]z~yЩB[N9- HH n|OMCBJܺ;@8gh"_+ -endstream -endobj -598 0 obj << -/Type /Page -/Contents 599 0 R -/Resources 597 0 R -/MediaBox [0 0 612 792] -/Parent 572 0 R -/Annots [ 595 0 R 596 0 R ] ->> endobj -595 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 480.404 111.003 491.284] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000014) >> ->> endobj -596 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 154.16 111.003 165.04] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000018) >> ->> endobj -600 0 obj << -/D [598 0 R /XYZ 72 686.127 null] ->> endobj -379 0 obj << -/D [598 0 R /XYZ 72 632.899 null] ->> endobj -126 0 obj << -/D [598 0 R /XYZ 72 618.329 null] ->> endobj -601 0 obj << -/D [598 0 R /XYZ 72 454.551 null] ->> endobj -392 0 obj << -/D [598 0 R /XYZ 72 306.655 null] ->> endobj -130 0 obj << -/D [598 0 R /XYZ 72 292.085 null] ->> endobj -597 0 obj << -/Font << /F46 237 0 R /F59 309 0 R /F47 238 0 R /F76 529 0 R /F14 318 0 R /F13 312 0 R /F73 498 0 R /F11 313 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -605 0 obj << -/Length 1934 -/Filter /FlateDecode ->> -stream -xZYoF~ׯ#H"u@D;l%=H2%!O|6n"/0Œ0aĔRhM>tqr 2:R4 Ext^eB28gU3Ώmn3v]g~Bʖo/_,, #R➴_..x}2TG8Z +胛uqyAV9*}ӵAHJ VyY8m[aԅ3B ~Sz)n&|eCя+FNY} 1k93 !(p'H`MC.ۻnTŶ\٠l6y_Dڨ[ ߭"I)x\W~NkemsN㺰Opyg5G9o0f#I3))wLH^8Ze~lDڡ2KVj{[yUy])Wi|)r?T@+neK*4zGTHJ%.dC]m2;tƺðZ= [΀0nfߏ0F#¼rT{&.snnxpE q9.g|z!4sw[AηBUpHT{< u]ԣli)B5N4T@KKPmᓙGkmHa9P]EzpB3p&mѐ3ۚzb2 @1 ]4L&2}[p$' J!){(`%R"BLu] a*9c/mX#SlDb -#|z7/. $W3xmw~n{aA" -*tj!IpwSV0ۼYRr4`)F=f-ОVZjGk -Ѫ 770I y>-Pe&N+H/a$D1HpPQ{z[SڲH"1#Cm(nҐ3,lTYæpm}m}]4p6٤MI\כ?߇$nkj$i9 'CȪȰF̱5ʢ - Bg~؉PÛ~ڏ-HwiF9g~0 A]o_@ ,)Êy;ruf(7ndP-2w)W)k888)lwDH8GIU*::)t; -;G}񾧦ݵ!XP%F/)%k drqKdBBucѸ[}Jh*1ɕObj$Sƌbd0}0:&@V˜xk2ZG.Y2(thGPQèzxz}ruxa[J;eL ~FEOke)ѮŰ]t&qzFԘPqA -鎞ڻYd8 aLAaQ}Em'|=׏)CWBʘ琉ufl6e %{23ރUs -Ps}3g"S,C̻>X |짋OPA3> endobj -602 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 367.478 111.003 378.357] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000019) >> ->> endobj -606 0 obj << -/D [604 0 R /XYZ 72 686.127 null] ->> endobj -607 0 obj << -/D [604 0 R /XYZ 72 667.868 null] ->> endobj -396 0 obj << -/D [604 0 R /XYZ 72 519.972 null] ->> endobj -134 0 obj << -/D [604 0 R /XYZ 72 505.402 null] ->> endobj -608 0 obj << -/D [604 0 R /XYZ 72 341.624 null] ->> endobj -380 0 obj << -/D [604 0 R /XYZ 72 193.729 null] ->> endobj -138 0 obj << -/D [604 0 R /XYZ 72 179.158 null] ->> endobj -603 0 obj << -/Font << /F46 237 0 R /F59 309 0 R /F73 498 0 R /F47 238 0 R /F11 313 0 R /F14 318 0 R /F76 529 0 R /F13 312 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -612 0 obj << -/Length 2168 -/Filter /FlateDecode ->> -stream -xڽZ[6~_}јThMf ,T$A{/%v O( ύ磍UWaF0bJr O)&Q |zǛ0DR,#E#nћX 2SNd"Gk7]lr7z/sۛ_EEoH!bJF~G+PBum޼1}o;6n`B#";#yV!Uk4Enom|^=tuIS|˻m8,Rhf?9 |y;[<&,(QLֈ'$bHt[6ڟ@Zh>X# 0Ə4[Cjw.#&t4'%B89E { ӺNPipsn0UeӦ_V R`&匊wiVΝa=w^]œc$nk;ꜳEZz -k[afi -/rew[$,UT`c_weU>]Q[}-v!}$)S*V Gޭa4Ŏ~{a4ٻ,IQ͎/P$bT= "}n (`q9ctz]F&(uaA"7O40JOqOSuu7zzcP 텞_1EIB~R`ĉjn~$5ց_4U~ty#~Kxs#(w;AgfL so߸%TǼqd#[Dh݉/RC>zr@-e2=.D"}468;`$j۽ˌƽ9Wt=QOUdW_H\1 K[!94m"o~&5G٨W=1ihFqRS?{c)x&|pn;@1lKY#G M ̑UgNaLLmЂ JTse ̘F&Ӡ??Y |Jv:E 6iM}S(%|rE4Nrf*^CEB~r!Gi[P -\ȸ+bU*֡b -tjta[>s+ƚA;6!m GX=ͮ+ pIr%1i1SXoԗyǾOge3o%sI0Z}%*]!AC=|/3 >{{Ŗ٠f0a, Xj_9By\4[NEPg7`mxm&[h".k{Sޘ义½|z?ߔ]*LLg~v7'o?=«?6}C jUY(g|unrtMR|S WIb*/Q/kਣ hB -i`4f}גuK G:r!lU -?}1)@;qNvPbީ]l72Uu7U)Y3*im= -Rq`8MR!Bؠ4 DVmm9=$N}' 5ӟ (2D -.?O +JSpi$wrJ0WRj,+$40%$X18$N 2cR{ xs!;tdB -yС#b]to({tdȆ+~v`Sctd&R!U@2($=owe}!yB* /-xtྺ`ƈźKuė;u}HCSȤ -endstream -endobj -611 0 obj << -/Type /Page -/Contents 612 0 R -/Resources 610 0 R -/MediaBox [0 0 612 792] -/Parent 616 0 R -/Annots [ 609 0 R ] ->> endobj -609 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 591.693 111.003 602.572] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000017) >> ->> endobj -613 0 obj << -/D [611 0 R /XYZ 72 686.127 null] ->> endobj -614 0 obj << -/D [611 0 R /XYZ 72 565.84 null] ->> endobj -532 0 obj << -/D [611 0 R /XYZ 72 417.944 null] ->> endobj -142 0 obj << -/D [611 0 R /XYZ 72 403.374 null] ->> endobj -615 0 obj << -/D [611 0 R /XYZ 72 312.543 null] ->> endobj -531 0 obj << -/D [611 0 R /XYZ 72 201.31 null] ->> endobj -146 0 obj << -/D [611 0 R /XYZ 72 186.739 null] ->> endobj -610 0 obj << -/Font << /F46 237 0 R /F47 238 0 R /F13 312 0 R /F14 318 0 R /F59 309 0 R /F73 498 0 R /F11 313 0 R /F76 529 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -619 0 obj << -/Length 1605 -/Filter /FlateDecode ->> -stream -xYIs6W(M#;C{LINmCKZ"].N{!JHOzD!FGXr JG^}5KZOIVg'HM؁//)V/yN0Bۓuu!xV&\bD͵߹#A,3:(*.7vB9`!%qNTȬ ÷_ &d ʺyMzD-}vu,zYqSD5^ =4 -L&d"h# @rxz`RMI6Xnvll[&/u!FeY4Ow!V̱b8'q8}Y7bqkX>WӼ`:b0Sy%EY<7n:9bK -n9Dd)\'8I9|W9q*ȱ90:5 0TιLU0Gk_Pg~=$ILQċW|A0!/+ӇNl5gۤp?6IHqc - ^Y_@)̻RQ~ͰӽFXvLNBဒ@>`P1.1u2&0;7?nY,6b1$_F-Rm} Ks; MW8*kq"}ӈ# -^1q ";q ]TWam+1SCw9m2^^JU-@M-/o7gZSf)"Z0T Ԃ@S` AEЃ-9,(1@F>Ik"߻j" ΅bġXgȧ5J6'8 -G7A>9z"1H -p]c8}#eB߁|Eu]MwM ZucnЅ2CwTivl]ɬ%9qal-B]n"׹P!V g(ÉїXZx$/U* PKMr [9L[_)M{^mۋMB/> endobj -620 0 obj << -/D [618 0 R /XYZ 72 686.127 null] ->> endobj -621 0 obj << -/D [618 0 R /XYZ 72 617.267 null] ->> endobj -521 0 obj << -/D [618 0 R /XYZ 72 506.034 null] ->> endobj -150 0 obj << -/D [618 0 R /XYZ 72 491.464 null] ->> endobj -622 0 obj << -/D [618 0 R /XYZ 72 430.546 null] ->> endobj -533 0 obj << -/D [618 0 R /XYZ 72 342.337 null] ->> endobj -154 0 obj << -/D [618 0 R /XYZ 72 327.767 null] ->> endobj -623 0 obj << -/D [618 0 R /XYZ 72 268.906 null] ->> endobj -520 0 obj << -/D [618 0 R /XYZ 72 169.442 null] ->> endobj -158 0 obj << -/D [618 0 R /XYZ 72 155.701 null] ->> endobj -617 0 obj << -/Font << /F46 237 0 R /F47 238 0 R /F11 313 0 R /F59 309 0 R /F73 498 0 R /F76 529 0 R /F13 312 0 R /F14 318 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -627 0 obj << -/Length 1839 -/Filter /FlateDecode ->> -stream -xZYo6~У2H"u@Z%G:ͿVZKWr'rErfp.,n"`a*ˆ)%RhMGN~8y} - 2:R4 Extq"58Nˤڕ+Mq[4ۦ~v^~CIW/ޞEE׌H!bz~8tB`#PmN|k}v".5菓BQavE y$%FTޭ(2Kk{eWN8\}t!Se^<"D3$  #D SQp!8zW&x, -aX6$!pgϐ%#nq9Fe48R0:/57,krBsGKчw@uǟ? i9O]Ch5RDk1 Ⱦ+ݦͳl7dN?`eH"vDX0$ iugߡkI wTةX 8~>Ȭ74# E᮵" N 7A!@ވ&^$xU1Tq$\U)ɬ5՚C]us -f8pgioj6 "a)=#(;#ͮ]^e7yDݬT|y8ᚒ5>`4e{rEpHr\I,*WǛ\R?WiUtOyîjͥ@ʭ)G,qCMב:uO{v (o;WW x+eiBYeE,w> ix0?%sMJ`poݼ)*H&[ |saԷCe|><47ȫ:*6Ezdi^ ^onĢ^,uiDqAV?&_ Y<|v/g:3Y~r[yv%'75/]VzM$n4[LV{L`5tWӮ l6"VGAր&m|O<.61ꂾ=Lk:&\f\OHwYϷIr -<2ȑ嶑Lt :ymu.EUT -b? jMB!f ϻZ[eXZW6&f2&zLI3 >*_wU04arQ^Bfwh9`i+ZvYE($$Rv<:lF].ӲoFSrVz=^^qguqU-"bV -U>VzwP= -(:b) 24XMt fM 3#%<]!fS]6%yJ!x=nj z@@P}Ή:PƚQzj-f(5f(ە?u!_P0˥oRE 5G!@c y^e+Jо!dS|f7E9+:PS,itj~kt~kt~Fg'iM> endobj -624 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 157.861 111.003 168.74] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000003) >> ->> endobj -628 0 obj << -/D [626 0 R /XYZ 72 686.127 null] ->> endobj -629 0 obj << -/D [626 0 R /XYZ 72 667.868 null] ->> endobj -387 0 obj << -/D [626 0 R /XYZ 72 567.305 null] ->> endobj -162 0 obj << -/D [626 0 R /XYZ 72 552.735 null] ->> endobj -630 0 obj << -/D [626 0 R /XYZ 72 434.341 null] ->> endobj -373 0 obj << -/D [626 0 R /XYZ 72 298.401 null] ->> endobj -166 0 obj << -/D [626 0 R /XYZ 72 283.831 null] ->> endobj -625 0 obj << -/Font << /F46 237 0 R /F59 309 0 R /F73 498 0 R /F47 238 0 R /F13 312 0 R /F76 529 0 R /F14 318 0 R /F11 313 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -634 0 obj << -/Length 1835 -/Filter /FlateDecode ->> -stream -xZYoF~ׯ#DH"u4E;d!=$se"y"983qrrf#$pBk԰cr<2H*DDj9q -{k/!"t#B<#cBTL)O:{(Z$mkb{})A)1  #DPX'p .EnY.TKVP\u -0FF*6ku9ÓS""o^z-4"ϫ O]i kUDo1 x]DFhU`E4JA#kt2>z0EԵᶨ".Zչ-Y=ٽ8-vi'J4҂+BU")Ev0}S-֥󎸀+~192zժShۉ:o]!,yY-2k_˫im|֬W} ]+*TXi(@=9qlx%F^5HE ̦2+t -~i=hUTTn* O8yja8y12В!fG|^ߕV{Y}DZWe.LY;KFYA<@Dd.cUѮog@#M2+fAptloaɌrP`lm ױ5bb cQ)f In Ҍ5R(^EYW}F"bT)9>UZl?eV3{Y~θP{[ Tp@Rl ^M -9J+"PhBt1F&sYܗE(|Y݇qs9ƉP]MᐴlzZx/vxbC6aBS;5,р>6Ge,U5ԫUKua}vMtX [LVqs}Mk$h<_M:Fv Cqb KwsuMb&ZqcC#܎M~tAGhm38(E;=wq YJzhGF%{G#.t85RWY(JAQ_F](Ow/ K5)J$Dd#Q@JQv ( Ff,%к9hB?Eyq0 #9)RM AOBQR#ar> endobj -631 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 391.388 111.003 402.267] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000004) >> ->> endobj -635 0 obj << -/D [633 0 R /XYZ 72 686.127 null] ->> endobj -636 0 obj << -/D [633 0 R /XYZ 72 667.868 null] ->> endobj -388 0 obj << -/D [633 0 R /XYZ 72 531.928 null] ->> endobj -170 0 obj << -/D [633 0 R /XYZ 72 517.357 null] ->> endobj -637 0 obj << -/D [633 0 R /XYZ 72 365.534 null] ->> endobj -386 0 obj << -/D [633 0 R /XYZ 72 229.594 null] ->> endobj -174 0 obj << -/D [633 0 R /XYZ 72 215.024 null] ->> endobj -632 0 obj << -/Font << /F46 237 0 R /F59 309 0 R /F73 498 0 R /F47 238 0 R /F11 313 0 R /F14 318 0 R /F76 529 0 R /F13 312 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -642 0 obj << -/Length 2018 -/Filter /FlateDecode ->> -stream -xZKsF W(M;tMcO;mھ%iF([D:$L}J\%>tz% `,Nn\aa*)%RhM>tyqsxeT&DDj,0'T1,?Kt_/]f=4 -0a2")NW Cu>| f|sV eruVpTةBi+ y"%FS>UV#Q ݯ#SP͙r?"$3$@ hjSb-&v"`Ze;UE&Lj3 -aFL:k1c6Mja(":xXWux\9!m D)nD!@ ڈhvC*E! -8Rz}=Dv;Q&+c'uXuV=Y,FfUh~p4%J"T%Rę7je{lbδ{[N[cq9HY|Ϧe9Α ܗ$.rZg3--uOKHwy ݯP6Sa"A'o!V˗@1Hl9S#A5߽ĨMPX-A5~ىA/`*]+?|㰈"= ->Kt1X*#MmvB{i=ʛhv*>4vKc֎02C\7ckMngYf}gwc{(|l{ܬ;~8f+z}T,8BxTcpt Ǹ3F -p>6Vɹ&ϵ<ࠩO76l?ߛZhDP8 ߪ!2{܏k\ eS+ -zQ;S?G!+,ll%؎u#OP&Q^Y.oW)l |pC}a Op[+"%2Vg (3/-/fD-H*\U$ӥwGݺ\"y|,!Du"e඼YΫmOLjt7-F⼈BTo۪U-"/I&F[)=j5Y1@ Q1 -kǮ:b-U1j'6M$Fd.έ5`%ư!Iu`tidm2w&{QuZJvP@" ӑMJ4ӊ TƂ/p iYTA?9ě ^4 ->as)*cjq7^/nĢ^,_IP#AiDb]z7k&Y9eE~>y8/uzQz뚨KLV{Z׸~jmn(XY-mАo怚B wˋݦ<`TA"1j? -pw6HT; C@?_TR}8/ |E;ϰxztaH\=dzG<а΅a5[nS°#=vzQiোم4U_)6~BjYxOݖm68Z sѿ]5pwP3Oҙjy\g'nm3~Ʀ3̠.+IA#=v۸9 HxƧ?/I*ה KĶ$a dg&DZd-ĶZq8l<Ԇ^Ӱ -ٮ, /.!((jj;B^yMP\yCԛ7kͲH^Ve_.ej7{6}P7wqED. -endstream -endobj -641 0 obj << -/Type /Page -/Contents 642 0 R -/Resources 640 0 R -/MediaBox [0 0 612 792] -/Parent 616 0 R -/Annots [ 638 0 R ] ->> endobj -638 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 355.522 111.003 366.402] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000002) >> ->> endobj -643 0 obj << -/D [641 0 R /XYZ 72 686.127 null] ->> endobj -644 0 obj << -/D [641 0 R /XYZ 72 667.868 null] ->> endobj -372 0 obj << -/D [641 0 R /XYZ 72 496.062 null] ->> endobj -178 0 obj << -/D [641 0 R /XYZ 72 481.492 null] ->> endobj -645 0 obj << -/D [641 0 R /XYZ 72 329.669 null] ->> endobj -479 0 obj << -/D [641 0 R /XYZ 72 193.729 null] ->> endobj -182 0 obj << -/D [641 0 R /XYZ 72 188 null] ->> endobj -640 0 obj << -/Font << /F46 237 0 R /F59 309 0 R /F73 498 0 R /F47 238 0 R /F11 313 0 R /F14 318 0 R /F76 529 0 R /F13 312 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -652 0 obj << -/Length 1944 -/Filter /FlateDecode ->> -stream -xZKs6WHDă$δoI$攢Jf߻xIL)lOa[JQ\'<^a4OaJ13_]:{qur *y"i"T$ɒY6刎ƔzӈTOUnEYi׺s݌Ju=գWoxQHOWg4qBq9ʩJq27F^v"Ʉg~g sNBDx \iW.6?|g>"PT2 wh-h1N˺Fc poL΃?ޖcYSk궼7Ec?Ϋ(8wTi\0zM*ǧ鲜 HR 9m3X&3v`"}% -oo#X2& #xuaLLF,I̗ĨYT2',et.'wm&9uEݡH-ǙD2; -$ ȉHdE{t &cO:"?:oZm3xmʢA^cI Y0;HYe tcKDFp *[K0pPޓ=@-)x =vX:  X[0lP#_58v2C"ϟ1 -Rx}D4w^.VƂT"JK6"0RwThTA6孩f] A C,t37*J=u n@OOo1V*=+SĮ",*L)CW)H,+4ӫ ´:ʹڿnt8N+ -Zkg987xL8Q?~'&ߝ Y[ -@G%GrZ+b`(׸s _ϭĨh' 0"@wTUCދ #@\Ł=!{B֮ xVi^B(13YLJ6x:*ȟd:Xp8#kF :88*LpXEea>ݡOI#CzFVf p0'fĐ^<=4DŽkYTHDB>c\&EZߣ#֌Ct:7I00qܟ󍶡1R]oK5M*HF[61+tJX:6_} ȹ<03Y]O?0mLh0M]-C]sSZ^nPqU62mxZTUUl,IdOZa*f!&Fϑ >.4zgn'h;v@_1 o27wNJ%3wwϺv74Z.| lKHlYng<xz3 f) ?~۬zS[݅hI -Y~cQA~F[]p&2pDŽ[('iES,#Bn QAuG#s="P;ь 5{D`D*>y[QTrFnL@%ЌkplHye]mHq"։g 1 G+2Av? -[@2샰%3乄2p͇h8ma8uikm'8Tᥟ_|UM:q~ga9tdXm%PD?e>nbbc$9NhSu -endstream -endobj -651 0 obj << -/Type /Page -/Contents 652 0 R -/Resources 650 0 R -/MediaBox [0 0 612 792] -/Parent 616 0 R -/Annots [ 639 0 R 646 0 R 647 0 R 648 0 R 649 0 R ] ->> endobj -639 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [108.921 632.346 178.281 643.25] -/Subtype /Link -/A << /S /GoTo /D (gf__vect__mul_8h_a15d42d058c64dec106d9e3e9fc2e1136) >> ->> endobj -646 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [108.921 604.451 180.293 615.355] -/Subtype /Link -/A << /S /GoTo /D (gf__vect__mul_8h_a7a1f65b032f03494dbc68411f5614bb1) >> ->> endobj -647 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [108.921 576.556 161.125 587.459] -/Subtype /Link -/A << /S /GoTo /D (gf__vect__mul_8h_aa7a737b69a0a77dc29aa28d0f17421a1) >> ->> endobj -648 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [115.915 548.66 186.39 559.564] -/Subtype /Link -/A << /S /GoTo /D (gf__vect__mul_8h_a84eb9ca31c934f05a8e3fa7a02fa71dc) >> ->> endobj -649 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [115.915 520.765 190.804 531.669] -/Subtype /Link -/A << /S /GoTo /D (gf__vect__mul_8h_a8f3e57729c3382514325612c54e20eaa) >> ->> endobj -653 0 obj << -/D [651 0 R /XYZ 72 686.127 null] ->> endobj -654 0 obj << -/D [651 0 R /XYZ 72 651.32 null] ->> endobj -186 0 obj << -/D [651 0 R /XYZ 72 492.57 null] ->> endobj -190 0 obj << -/D [651 0 R /XYZ 72 423.813 null] ->> endobj -383 0 obj << -/D [651 0 R /XYZ 72 397.349 null] ->> endobj -194 0 obj << -/D [651 0 R /XYZ 72 397.349 null] ->> endobj -655 0 obj << -/D [651 0 R /XYZ 72 265.439 null] ->> endobj -371 0 obj << -/D [651 0 R /XYZ 72 139.795 null] ->> endobj -198 0 obj << -/D [651 0 R /XYZ 72 125.224 null] ->> endobj -650 0 obj << -/Font << /F46 237 0 R /F59 309 0 R /F47 238 0 R /F14 318 0 R /F73 498 0 R /F43 499 0 R /F13 312 0 R /F76 529 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -659 0 obj << -/Length 1894 -/Filter /FlateDecode ->> -stream -xZKoFWHfߏCS Z u@Dh:!)iYRW|yٙˆ:r1vh3ԍ.EZb]:ҷ̈́QlHLUǫ!sW Cu4y9<e}jfF\jѯ_F8ؾf  YQjh -!T!AH#@~#6+aБ{\!w -#6ގya)$%0*4 t Wܤ -tTYqݤxXiyz6RO] Hm OVTog`q*څXVqn峗/LZfBV!),ͧ2S'X:4^߻eq*PYϖyrIg D8i4iÕM4;d^ 6?6g- }ታcBSNE;eC)ޮgOiPt-۬7k?HpS߹+QX4ǙEfI3xĴ)t EoFm-G63y ~mwR&im-{o`f1 ~tR V)1& ! :)) '0!.cX "MBQu[9{ ٜ:u$~hZq6,>#4jOFʬ|; wPf '6>M~=7Jy0 bqq8NBqI¶\ih|ԪfpnGAvѵۋ6Oꤋ)}%Z8y  jwCJ5 ~0f ]hdE[;~T콺0 NŇa|C@Sm]W/bd ԡPıIU=񉸾i#|@fRAs Lw9(9Ub$#(@*(V)9UMv& -i9]Dgn4]ri8LwN݁;Rfy)jJu!gEUVVpb|g3X'5XP`M`DA^)tçiI($r$}B:ho3}T -iUqeh8NޡaqhQ܊LckH>A ?w-մޛ ΏQOp"B^֊=hU]ÏJ>0 n݃qC ѓO0$ړz}:j?V iՅaq_~i&Ki0dە uNa:uNa:MZg1կHLLvP x:$;^6Aۘ,<m]e&JviU/0D4-|n-> endobj -656 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 549.72 111.003 560.599] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000021) >> ->> endobj -660 0 obj << -/D [658 0 R /XYZ 72 686.127 null] ->> endobj -661 0 obj << -/D [658 0 R /XYZ 72 523.866 null] ->> endobj -385 0 obj << -/D [658 0 R /XYZ 72 398.222 null] ->> endobj -202 0 obj << -/D [658 0 R /XYZ 72 383.652 null] ->> endobj -662 0 obj << -/D [658 0 R /XYZ 72 271.302 null] ->> endobj -370 0 obj << -/D [658 0 R /XYZ 72 201.636 null] ->> endobj -206 0 obj << -/D [658 0 R /XYZ 72 187.437 null] ->> endobj -657 0 obj << -/Font << /F46 237 0 R /F59 309 0 R /F76 529 0 R /F14 318 0 R /F47 238 0 R /F13 312 0 R /F73 498 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -667 0 obj << -/Length 1543 -/Filter /FlateDecode ->> -stream -xڽYKoFWHvߏC Z u|KRV6rH*FgAT(%BcwۙoA.#S FLI.aBkToW #Ln)“E!eS*p|}57WʆUFtj˹>ݾ%\hx ~{BN>O\',['zH0vضpnk 0扔-.<ͫ6n$>b~l\1 00 #D XpSRN*X\u5 -0\T^˺&p(7 0wbxםkczā'{~O_DhL')jpπoB\󣤦h#0=_P G{ #J2" @+5W=um?b)[`N0l3ʖ¤L9.JJ*, [r"' -H9f! )Khb1jjN[Wε2/ukDž}N LM< hW]_9ӈ%tUL$(Y=i@n@|@ Gi]ͪ)W_,|ti`( Ry5LV2 qJ=ly e6{Efa= ӽl% 墳@@Uվk7"L*ꞌ(|W@jWq]#r6$8 ) -lp2$oN}m#ek›?R#)ڍl WMSU46XnySK< -^07ENjY)eϤN;S}7;qk4 ɖ -O}A\qҊ7_MpMv׀!]n9h"kY9˖Asj:֚X6jFF_1 |UPx}ۮc=FpDnFP^́\p?AV\iUb,,l[G:wMaH>>DXIzD>VoKhH4>p%[m^P8@ja:tվ[Ck}/N}:Zѽ,߭t8ƌ,,?^'Y/@ɳcF 2nh|1x]ŃE]~Hh8yW}rr3{F0R-=pTH$8tu=tpP{Z[rhZXeMURYjQ<`u^ׯb$n[.'g#}tHSf5o;L<Գ|ti]VژF\JYU$Shk zO3qzpC_,~s*=U` .`HN;X4 -endstream -endobj -666 0 obj << -/Type /Page -/Contents 667 0 R -/Resources 665 0 R -/MediaBox [0 0 612 792] -/Parent 663 0 R -/Annots [ 664 0 R ] ->> endobj -664 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [71.004 480.205 111.003 491.084] -/Subtype /Link -/A << /S /GoTo /D (requires__requires000020) >> ->> endobj -668 0 obj << -/D [666 0 R /XYZ 72 686.127 null] ->> endobj -669 0 obj << -/D [666 0 R /XYZ 72 667.868 null] ->> endobj -369 0 obj << -/D [666 0 R /XYZ 72 620.844 null] ->> endobj -210 0 obj << -/D [666 0 R /XYZ 72 606.274 null] ->> endobj -670 0 obj << -/D [666 0 R /XYZ 72 454.352 null] ->> endobj -480 0 obj << -/D [666 0 R /XYZ 72 328.708 null] ->> endobj -214 0 obj << -/D [666 0 R /XYZ 72 322.979 null] ->> endobj -218 0 obj << -/D [666 0 R /XYZ 72 256.871 null] ->> endobj -665 0 obj << -/Font << /F46 237 0 R /F59 309 0 R /F73 498 0 R /F47 238 0 R /F76 529 0 R /F14 318 0 R /F13 312 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -672 0 obj -[228 273 228 228 456 456 456 456 456 456 456 456 456 456 273 273 479 479 479 501 800 592 592 592 592 547 501 638 592 228 456 592 501 683 592 638 547 638 592 547 501 592 547 774 547 547 501 273 228 273 479 456 228 456 501 456 501 456 273 501 501 228 228 456 228 729 501 501 501 501 319 456 273 501 456 638] -endobj -673 0 obj -[833.3] -endobj -674 0 obj -[500 500 167 333 556 278 333 333 0 333 675 0 556 389 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 214 250 333 420 500 500 833 778 333 333 333 500 675 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 675 675 675 500 920 611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 722 611 500 556 722 611 833 611 556 556 389 278 389 422 500 333 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444 389] -endobj -675 0 obj -[277.8 777.8 500 777.8 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 500 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 1000 777.8 777.8 1000 1000 500 500 1000 1000 1000 777.8 1000 1000 611.1 611.1 1000 1000 1000 777.8 275 1000 666.7 666.7 888.9 888.9 0 0 555.6 555.6 666.7 500 722.2 722.2 777.8 777.8 611.1 798.5 656.8 526.5 771.4 527.8 718.7 594.9 844.5 544.5 677.8 762 689.7 1200.9 820.5 796.1 695.6 816.7 847.5 605.6 544.6 625.8 612.8 987.8 713.3 668.3 724.7 666.7 666.7 666.7 666.7 666.7 611.1 611.1 444.4 444.4 444.4 444.4 500 500 388.9 388.9 277.8] -endobj -676 0 obj -[1444.5] -endobj -677 0 obj -[339.3 892.9 585.3 892.9 585.3 610.1 859.1 863.2 819.4 934.1 838.7 724.5 889.4 935.6 506.3 632 959.9 783.7 1089.4 904.9 868.9 727.3 899.7 860.6 701.5 674.8 778.2 674.6 1074.4 936.9 671.5 778.4 462.3 462.3 462.3 1138.9 1138.9 478.2 619.7 502.4 510.5 594.7 542 557.1 557.3 668.8 404.2 472.7 607.3] -endobj -678 0 obj -[777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8] -endobj -679 0 obj -[569.5 569.5 569.5 569.5 569.5 569.5 569.5 569.5 569.5 323.4 323.4 323.4 877] -endobj -680 0 obj -[777.8 500 530.9 750 758.5 714.7 827.9 738.2 643.1 786.3 831.3 439.6 554.5 849.3 680.6 970.1 803.5 762.8 642 790.6 759.3 613.2 584.4 682.8 583.3 944.4 828.5 580.6 682.6 388.9 388.9 388.9 1000 1000 416.7 528.6 429.2 432.8 520.5 465.6 489.6 477 576.2 344.5 411.8 520.6 298.4 878 600.2 484.7 503.1 446.4 451.2 468.8 361.1 572.5 484.7 715.9 571.5] -endobj -681 0 obj -[769.8] -endobj -682 0 obj -[273 273 319 479 228 273 228 228 456 456 456 456 456 456 456 456 456 456 273 273 479 479 479 501 800 592 592 592 592 547 501 638 592 228 456 592 501 683 592 638 547 638 592 547 501 592 547 774 547 547 501 273 228 273 479 456 228 456 501 456 501 456 273 501 501 228 228 456 228 729 501 501 501 501 319 456 273 501 456 638 456 456] -endobj -683 0 obj -[556 556 556 556 556 556 556 556 556 278 278 584 584 584 556 1015 667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 667 778 722 667 611 722 667 944 667 667] -endobj -684 0 obj -[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] -endobj -685 0 obj -[556 556 167 333 611 278 333 333 0 333 564 0 611 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 180 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 469 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 541 0 0 0 333 500 444 1000 500 500 333 1000 556 333 889 0 0 0 0 0 0 444 444 350 500 1000 333 980 389 333 722 0 0 722 0 333 500 500 500 500 200 500 333 760 276 500 564 333 760] -endobj -686 0 obj -[250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 930 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 278 333 581 500 333 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500] -endobj -687 0 obj -[278 333 278 278 556 556 556 556 556 556 556 556 556 556 333 333 584 584 584 611 975 722 722 722 722 667 611 778 722 278 556 722 611 833 722 778 667 778 722 667 611 722 667 944 667 667 611 333 278 333 584 556 278 556 611 556 611 556 333 611 611 278 278 556 278 889 611 611 611 611 389] -endobj -688 0 obj -[333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 333 333 584 584 584 611 975 722 722 722 722 667 611 778 722 278 556 722 611 833 722 778 667 778 722 667 611 722 667 944 667 667 611 333 278 333 584 556 278 556 611 556 611 556 333 611 611 278 278 556 278 889 611 611 611 611 389 556 333 611 556 778 556 556 500 389 280 389 584 0 0 0 278 556 500 1000 556 556 333 1000 667 333 1000 0 0 0 0 0 0 500 500 350 556 1000 333 1000 556 333 944 0 0 667 0 333 556 556 556 556 280 556 333 737 370 556 584 333 737] -endobj -689 0 obj << -/Length1 757 -/Length2 1108 -/Length3 0 -/Length 1645 -/Filter /FlateDecode ->> -stream -xڭiTWǥE"1bYªP)R[CfBF K -ZDPR*UTRQTVq iT~/s{eX-`4;;9[sqC}8hnnt(tG@ W52 /{Ք0EqQ -A$C`\fB!:!$FA$)wi(QKNQ#B`>ɞ`ٜ(>!B_ -L$Na  XΔFB`Iͬ\!cB8K!RCa>W(0 -̈́ FFk0.eNc?1I4BH|60Ap%D"r4p L4QWW`/M_HBlJAT[:ݜ 'pqo((>bg|S`闛oMSt_EWW|CO:ª1㵥&%1nJ d؞P H4PGYxO41I'Z%e\è>}xrVkl҉ﲜ]bX 9;S-# \F&٨hjf}XSG -_O|Rqd~ɣ6̌>VЖuڬF7fX4TsP{=?h#.˞gO;|Zz:~?z1əh}.:/G2'7v;ydt?Q?[[u2 ݥˎx̉-孮]g/M#{,u6c=2]qŎ,P| EvUujeZ[XFQv$bSVsj 2֜,%Ue&8 Rb/Felr[WrlL2Fu*Կ"7'G[]>rCU۞TMO=h)_J>XߝlL׃ ~-ߺr}Sa}sy~M0Clł=j; 631-?-n!FQ]ԑ|{r{F(%:sGqng4Ntpsr|7%8xUR -2g(_oj|~gu#ƵVY{,>^KkB[]C 6t1IGU<-2湛Z4 5825GPWǓ oε.Z+z*\wDǭ>xlmф(*^g?('A6^ũTᑷdtx1s۹W#5a+lMCF WFf3 rܕ姱ŵo )'oOιV&7xZ1"_ׯ]Z>zH]6g~ScwtMc.nB*1omh+63aר&_<0-h.{9+j٨109dLlTi~uqxg*bqtO& -endstream -endobj -690 0 obj << -/Type /FontDescriptor -/FontName /YQJSDJ+CMEX10 -/Flags 4 -/FontBBox [-24 -2960 1454 772] -/Ascent 40 -/CapHeight 0 -/Descent -600 -/ItalicAngle 0 -/StemV 47 -/XHeight 431 -/CharSet (/summationdisplay) -/FontFile 689 0 R ->> endobj -691 0 obj << -/Length1 811 -/Length2 1849 -/Length3 0 -/Length 2409 -/Filter /FlateDecode ->> -stream -xڭR{<WȪS.rkls-rgfeNisK$&9,r)NʥtEIYr I.3:u>|~z?Q#b#hs@QB;HbӘ= h,p!2576476!;f$E gv:$SY42 $v8Ȑ L<}GQ'A> (42h`Q2oa -'{*dEIDK2uH - -HbJ-Y?6wHKN'Ob輿LF$ ~7qB0~$: D飌iQ4.HqD DQĿ%v;]<|^RҝD޼H@^$ Q((yA? sL - -0&"`# c  -@D>dKJ3ɂ- 0_ -!3`̀2aG){ p-erc1HBƨ!9,LbwLIA.H:d=95) e+u6OnyJH3VcoP}RZzE -ո_'28%'\SxKf<f"Z[?E\YmZ2vdE΅ EOQaA٠}Fw2fTntD\Mȵ,R` ej33&Kx.Ѫ΅n )V-+'-w,n72_<#1YlgbR؊O_Tɱp)K򬣵FtZQ*+ -I'lSjGq3#QBV|sf;_r03Ё+}1Pƴ}-L=/t{LT~7[)FS,}2y ƒy fY /= '].J݅bsN1Yac?h-e8nreeXކ]b60˞Ĥ@)>_y̯^a]Ik 9y@De,2 *vܺxA,'X vvnumtif;u&J3)]Eϛ-]E]QJ`-rSE%|S2\)7-gY -okN8aϒM]vT⧚)Y x۹->猲+8U'⛟&N(HH̉x1b1o c>TVjprNl[roqkj|5*'[=owڨnz.LF?:>!#K)(!'xs=\Zw$>2*1KmỦIӻa֖*zybWCYӆ;j.w6[CYJN73RO >q:t:n4?<&Q@pKoew!T6p5vH;݇ނ<1̉bѝUV2NM=7lEQrF6tgu>Rў~,&[p.ݪmSf*y?b&芟։Rhbwaӭ>x8حt4tm l|K4G;m/I5E=FWc-w&*>{ z™ -endstream -endobj -692 0 obj << -/Type /FontDescriptor -/FontName /CVGKQU+CMMI10 -/Flags 4 -/FontBBox [-32 -250 1048 750] -/Ascent 694 -/CapHeight 683 -/Descent -194 -/ItalicAngle -14 -/StemV 72 -/XHeight 431 -/CharSet (/D/P/a/greater/x) -/FontFile 691 0 R ->> endobj -693 0 obj << -/Length1 792 -/Length2 1655 -/Length3 0 -/Length 2206 -/Filter /FlateDecode ->> -stream -xڭy ]Agq|(K+7s$A Α@2j_Zh$ϏՉβd cq&ʣţX @ -@d09-8Pɖ_U1"3tJyAc7PԿI#*Ln0NJ0Fٟ՟JA.H2ɦԴ0܎2?ˆȊ SKSGp*T:ewEV4Q/Ͱ͈kDi-9MٱaU ܶ]W:/]#\ =dW!9*"} -xtl1s-[g6-t2rR=ƃJyBMik]*avu/pKz'>XT%-Q]\T;O?#)]Bn;~%ҍ<1҃ط1ݭ\'B!IdpB cl1DNsc; 5g`oM<Ϊϊ$%+9l`T뒀_ls̒m`f3tRw|Z p4DPnƚ{QvȱXaft|הdБtl؈4)u R|hKxŽ[Bubs?.'mvqo=] l|,H8y*b; <ׅ:Jy;n?! a?7Q{VN8ψ{F/;d3Ėa뗧#>b/ieYZ 25DĉlW`; -V]x6*:Y&t/})̴Hмt8~(;3n<$<evQYs8/$;j4b=^^l~23Ut>r'MYLݷf߬ ָn>Mg0)(Tzt,NEJL[ -3JD9mȝr`Ȣ#GDƼ&}u rF zUFԙߖ".^^cjZҪs5c 6>O_8pq!vVy[#[&QJ5_E}0eUX WcP+J̫fyӞ)a'kv: 6+<̪T])XmFp ->j1qKVws^h4jDcK$W]!NV"7jz`r:5%_L`f2cԸA%AheM5&"ʶ68w9O \wڴܷ܃c4t&7E[4][ZSfK{ϵқ'Kzٸ=ѡ ѫq8O\ρ{]׈r5gڧ8KA40|.CVH|Qx,8J[[aWͲ<_g )o-;n,sʲ[iLoWp5q -AQ-ԣz"Y` NUoס -3(zQ$BtOǟ7-Q+XHo|y7=c x(!TQ]߽Inu l|SY85z18@/V/1N6YC2du:ҖŒCG+̴xڄndWeT k-̻ -$(UL;;4Q0HD2,Kg -endstream -endobj -694 0 obj << -/Type /FontDescriptor -/FontName /EFXCJE+CMMI7 -/Flags 4 -/FontBBox [0 -250 1171 750] -/Ascent 694 -/CapHeight 683 -/Descent -194 -/ItalicAngle -14 -/StemV 81 -/XHeight 431 -/CharSet (/comma/i/j/k) -/FontFile 693 0 R ->> endobj -695 0 obj << -/Length1 778 -/Length2 1256 -/Length3 0 -/Length 1801 -/Filter /FlateDecode ->> -stream -xڭS{8"g[QY.k.l2e\FE$;f^vƵU³\TJkQh*.]"i1r* Ngc=>~y?ϔlF /XSg@3(d@!T)10x0389/( -[` Pns*C& -ɴH6pƑQiZ_K3W˯43$s(!!mt gLrGb8 `,؁ >C{̹5 $>>Vf dˆ`_UWk1s@8*b]/Oa$;&LaA -H &Tm'i V@$(A ;'@B! R(ƞ֙LvNNid y<#̮q4 A"{ڇ\2㊛.{V=bLÝ[Qt&X7.։u4d*GFo%Af2K~Y%~%'ΉIOlmyr\.[B%2K=?+jjbRddڀߝz7H:*o-fo(yVmLHYR3-nwr]!n<Ԉv׳Bܷ_t…K~ߕ -[BGUZ%ErU]M6UM°]MŖuR󆥊w \ޒv;ड> fRsp0;D7E*|rli9 4eOKSX9'D3bp~ HHn`.VMXIN>L/UR51JQ)SkvF'm k[=ܻY)4N6Q5~O`U*E|3m>65ޙް3?Q^x:W0El%5تJ~E -zC!}^+,T;Be`Ct;_- : E-|81=n)ڈ{Z6'蠎_FM:m:y`kE_2Hz֨Y\A69gjkn`:czԳMa,M4dpk N,zLx6m[Aqoo=tCe?өyYcI?UDK6ozQo^y%Hͼ8)9 rZR_KdLzD7yωԎ^:1瑩go]ۨ31|&/Oz+hƄ3Ƈt&6n|{ՙh뢓VΆ s us8R25 r/(A҈Y4n&:dI.| 1oLFa -endstream -endobj -696 0 obj << -/Type /FontDescriptor -/FontName /JVDJDJ+CMR10 -/Flags 4 -/FontBBox [-251 -250 1009 969] -/Ascent 694 -/CapHeight 683 -/Descent -194 -/ItalicAngle 0 -/StemV 69 -/XHeight 431 -/CharSet (/equal/one/plus) -/FontFile 695 0 R ->> endobj -697 0 obj << -/Length1 822 -/Length2 1824 -/Length3 0 -/Length 2389 -/Filter /FlateDecode ->> -stream -xڭR{4ZkZ.ƚyf3%U0p -.J%Ȧ_?ៀi0< m^C\zlfgp:+MX Eʨ,JH͕L_Ἲpl_Z,91nWd -λ7h}o7h2B=PZ~*1z!ze@Vs6uEoa EuE3]ګK*nYr3a uj'ŤFwut]N|*XsE̋!NKP -GzcFUA%4}SUlrG{&wp>k?ɦ&N%Sƍǥ}]bڄoS#tjIҨ٣RĭW_9Q!i͍^:& -9WG8)mUh)l%o>iM7;.-L+ѳޟ[iP-v]Րd}ᨼY{"2/I+6LQ^1Nk -}ph]*SYbj,sj:)FÈGpU>%>-gfƓGg3E'⋢Ԏe;DH̹XjNB}):dKsϛȄ3q2YNC D '{1.1]4 ISW!lo˓6y=a/ti53W[{gGj'Ac;[/ߍ5pؔ싕oISGOOuo~^Rb1Q1ɥԐ=&6#SQ !l@_ڤ -jQDxƐߩK[?zU87> endobj -699 0 obj << -/Length1 798 -/Length2 859 -/Length3 0 -/Length 1406 -/Filter /FlateDecode ->> -stream -xڭkPWU(AkG  $Y0PKC+@Q&,ݰ٤ P jQQDkł -,,0RF]S?}{;@#!Q! ag'Q PwA 8Nw+ $1X_;grxD0a*g`)" ,JA -9F(D(J0#p}F%4XCC4"BR5@P1- PZ8G! -)T)(B6 ?`K1HQgqoLP$D1@ K|ő(t| lopA:/Ne(sлNT p Hol捋%` $ATPMfE/t4 &Hܵ:6,q̉}02F "(2pOOB\hr\"ISZё -1z{GZɪߦxu\X֟nWFxu AIp=3d#א*[sEmfAi=:֯BfW?O;>`^G>h;nڼ4^T;cb]p:SrELuVcթ'6ݹ/)\)d=bDAx72A^UȰ9`gT5btEx]8ϨQ4>Ƿbys+f{ # ˏW^=gZ2U -];n5PVq2a}Yu*yqMAOJpsw/9}AnBDulm=Ń{u:uf| JlĶ&≂3 -ie)z/`nGf&3:-3wmyT﨑[/W4J8U\tuQ+&5[79<0~!uiy\|!x\OwT87T.^CᬦXS6D:W%cuݖdک41LE[hPcˣ3:l>׆E1{ \ٷ!:\A?;Jd%-טwUl4x`@UY7eQhspYdfîB+œ]UdrbiEi͢!ޙ *MhwtҪ䢎щ&+띒R>K30T?K=ƕfٝ6biyf> endobj -701 0 obj << -/Length1 750 -/Length2 628 -/Length3 0 -/Length 1146 -/Filter /FlateDecode ->> -stream -xSU uLOJu+53Rp 4S03RUu.JM,sI,IR04Tp,MW04U002226RUp/,L(Qp)2WpM-LNSM,HZRQZZTeh\ǥrg^Z9D8&UZT tБ -@'T*qJB7ܭ4'/1d<(0s3s* -s JKR|SRЕB曚Y.Y옗khg`l -,vˬHM ,IPHK)N楠;z`xEDDiCb,WRY`P "0*ʬP6300*B+.׼̼t#S3ĢJ.QF -Ն -y) -@(CV!- & -9H(Dž'j]]K Cc#Ks ZuɥEEy% ?-\7'[dMֶuU?O}y@Ďٙ)KZhka^SH}Y$fkׂeLlO[°sZI[/z> endobj -703 0 obj << -/Length1 751 -/Length2 632 -/Length3 0 -/Length 1151 -/Filter /FlateDecode ->> -stream -xSU uLOJu+53Rp 4W03RUu.JM,sI,IR04Tp,MW04U002225RUp/,L(Qp)2WpM-LNSM,HZRQZZTeh\ǥrg^Z9D8&UZT tБ -@'T*qJB7ܭ4'/1d<(0s3s* -s JKR|SRЕB曚Y.Y옗khg`l -,vˬHM ,IPHK)N楠;z`8z{iCb,WRY`P "0*ʬP6300*B+.׼̼t#S3ĢJ.QF -Ն -y) -@(CV!- & -9H(Dž'j]`ӵ45T0425R00EQ\ZTWN-2ZuZ~uKmm+\_XŪڗ7D쨛Rl:/P1dɫϾ(l=Uhd_OܗEkv-X1tލ`i_y. 1dz:un~Q?3/S}] -$e~s]F1ʻ/zO]3EQ^Y^QgI\L!~y?hKDgV;Ow_df|fg81`5q-aK_jV^,u ꏌYuUxk:K|[[ɸo_; -.)GDǽK|3ݣ]wֺ0G"G͌crĄm{_}?uz峦Gl -'ogsR*% -endstream -endobj -704 0 obj << -/Type /FontDescriptor -/FontName /LAJUWJ+CMSY7 -/Flags 4 -/FontBBox [-15 -951 1252 782] -/Ascent 750 -/CapHeight 683 -/Descent -194 -/ItalicAngle -14 -/StemV 93 -/XHeight 431 -/CharSet (/logicaland) -/FontFile 703 0 R ->> endobj -705 0 obj << -/Length1 1612 -/Length2 12917 -/Length3 0 -/Length 13748 -/Filter /FlateDecode ->> -stream -xڭweT]ݒ-܂Kp;;wwwww'n߾=_8cUUk֬އLNIZ$jmR^JId0r"PQ فL@ C0`AY۸ڙ8hTe+ON{Sc+ǃd?ިL@#S @HVw1we -dgsԷ05HAt#k;?k+CӿJgm@@. \3`lgk_>F}Y;ؙ8> _M?kHCkǿJu38\ʥX~30@zv {쿺:z= ׿w[LAFl9 >rZ! +#k+?솎69n_3CAB`2B~vH '+'k_ywhQG z qX1zvWUA ph ,,0ڋ L LFzۮle0}(w3L,,S2150p HS&wQr;(|Rd sƷo.w 7 2zv.YX.?~Zi_ge1^imhg'td4om`P50& -9hSTSaSR\7uuW~o ǂ3tCIAםFa]r~1+Ţ5&]C*NQp"uCHSwX| +RnkQz(hFm6! C -@џI~{n\vv؇C099PZZ[Ko+#?$ET>,GkAEЬd~!61@tC6FkKſqE% w4%#D=lǘd۷8=ɻ> Ik -~J"Z|2BWTiBCzlGv>0jOFeGC5CxA>QZpk$#5d#H$3<|\;Ηx8v)V8Wd"!xEUMYcG; ֥n~Lq,^t/) ;t)ý[lEvXTVי&4{ *1?EޥZ={@F ul`Fƪe dtukp6Y҅3z {G`B56;\ z— EƹPa֭^Qb_Mw]?,=G9銐`UPOyD4 -.gBc%JSvC@=9 ;٣ޤ;N8$>ąFtjȮ )8"c5P`0r%f>Q2! -Z._̎)X[: O-zz%cb+9_kE%Wl%%Aap}ҚyʘLW%)%t=a{7篡0AE̟.zR B8+TK]݆fi|a,NXلG-F,1B&&3[?U'`\b,M^J0 -)zZ -\*$b:P[x9_rM6vP==C;a.s+ə5פ&6]b7|Rge9*V+Y;73f ޒj{}9;[zHXSXkuM#MvI2Mxݖåc@JT=]!;xtk%4Q%LUՑ "#'1W3%1CQoe_B$IH$D'ꃪ.]Gӊj05q{F$ RWUOS_sABCpfb{?_y!|В̲戚m_Y+y&Z 7%xsJjq.8zgڜ>'* \ =N#Qad,gE8?mDQKbvN)qI~Iɏ)`"ٚO$(Ǜ خeƬ)OVim< %w+#'Qc~DpnX}JgKq㮼b̌W 9T>]brn^AC}M|zx`Uaotium<+&+kcIl-rdM=K -Y/l,xJrH{5?n66_QǕo{H_oȋqKy L2ty(ڏxIgt}d w,iidOttW-Q$r33o\ -תx?~e?y476ϼI2]rOl4~DCMH)|urᰕuiqVhUc^(4[ ٿ",UѱH_1,.J7,fe.rLܰ=ύ]k.EZSnJ>vyD/@[/:lM쩄Gn-cFcM| -Xy%lNΔ"~t`6qg'mgbr~!YLH(ou AA=\R'!t(]gLZP&̷-l¤F01>D+Ū]*3'^e32{=-Zu[d WǞ=ZF$Kfp ΍[0@'E%1-aZ xOMw<'nlT C*Ktv.ؤzNω ET<#oU.>sg+ -\N@JO*3 5UB^I/ͲB E:< 4 \v=9ol݄#ߓ:?舚.j=ќkX_pB)*ӦIכOS!_$BJ35 3ՙP)Rnm4m5kofAz&6Ǯ&g޾Ģ)\M'dm9%[JKiͭ0%5J_) o\0 #h QV] ^!M0 x̳C7)>o R:ɐr߸C(@%QTXl\=%jivɱ|F+%O?u&%`n qNJ۰r6Eb.xgyu[vdq&pc,uAI Kmb}&ˀWPϒ5D>|cp1mb:߄Y< %w6_oikserOGiɨ{`E/Te)s<ӓik^:`᠍&( -Eo"ylbM7H,pP"^)W,bIBrN̑DPߘ5yPju[L -l̠'MO:fmՈ( -wLaړLu cL[VxgIU=e- -6^h |r[؁&҇[D:f- -`yÉj>@M`>H@O.x]D4X-##'5=$kkYAO$)gcA-gw[m௫ C̰u@^{;OW/4R:Doh1Ȥ_QcgDzX6!g{"~Cȝnd#REo#Vn p@:F##nԚᆙuT~J~Hntƛ.I?i4}|<0kc;.Gc *_Eb`Lq%`Z cijWNpgdvل=;2t1.]5E`(6ě̚R'LdcOɩ*u",눔o.i;NyWj76 ~GN^E$j`c09|2OU`Ҿȼ; h4ER*^+v\~뾚Sc%;º'cIUCAx* D$%"0<:S-Hk#~N9)+,/v'woHE7PCQgHB%~ d q7UrK Ab)d@I}r"'8e0;%U7 z*+$\.N9[$] "+pb :KgYZk/PfM]Ĝީh+Z2"j9nqDxII( - k|{ɄE'ȫCH:<_1GB*uADҚ`>}h?{4+N#爋rr4 -.^VƙL$bZ!ZNvHɩ|n&zggki?7 ~N?7 ` - Zﶱ;RإR&#vOO703[X7 }3joy^5C+$d1~VStM7 ~ڜ]5vg t ݸ:R#ڈe! LQ9 -2PDC=_h55lN0~G.{aй -]Y!>PR"sV_yjz L b7*_ Ģp6شY'S{` -k}I+{ -zԁ韶sIpvFސ8fu["If& -E5|`*@bX~XPVI+S![ /:;S 38%1(ϡR)`Qo+t@LJp/M8o/?gv VMa \rDC"7\)*HO ڮ⍌')ӳӢlq4BiC?s 7H")xMx6,hdɃEA(oWsp#lqd̓~ob%|A(ټOCSd.f>n0CU9@fiYdf^1<1a[k8BϩMrPk㫕ˢNK3ǸMJ^X/ϗ.Ua(wd(`gq$kɥe%WCGjBNUUM2h:XE>swߝ-g>pc@bv'Z.,Mk<\>G0/TG=I ']^Ľy󝠴R g87E$w;qUh Uzm5(Hoʆz58M3oٱk-3#@dT\xT@Pa)˄Wi{#%~Z(5 -|I$L2_:=3ro 28-WZլ>6يʁ^]H %DGZz閥~mI0C.Enf-5r/TZSy&7R[cS Fd*{X'O5BBƣ\sfl*C~1p"NCPp r-I,,ݼQR7эKg֌e8N| -VL\4o޿愝lmzizYKvbYf&Yɫl+-+C7b?a&6/X+qۖpƂ*_lti޸>Mٹ2G:r,1tۭt9ckl<5Xl?', x/lhBzJI!|2uK -m Wx -XF)饫Em /㘀+35-Cwj̓*0}4@Ne/ڰWh5tR -RP9ɱ(8⴮җ4`RGNtH[ -L@&8BXuD )9uh7?2"-=JQơpv@e[l>vdH4L𓃹p^i>qvd$%S?+  kEaȣ &z }U Gf3͉h}))K(_qpqj @K7 -Jr8U2:I{.v842w -n 5GKNҠ_oL~90F1,eg?ġ P2(g0pnoJCQ/#+F`aHEާ8J%YOLɺ7g .M=i V8Wa:#o݂I:ʻ2k"nw$QJnj(˝pgo=Vat'^mpϟ;s9KN$RWbFh-늝cBJr];d9aEFe8tK^tL!F>`1 hFzvH8m _-Yaf ?.fgͬdv 'f y?{]>勔yʤKI_?4`Rj̕o c1!L0uA3ꦫc}F7rS.x6 -T gdzK''xPYav;2|{QADODG)pro\ -13m6i)Y,ӟm t*L51ꑵ,P@D); -_",'7oc8^ o9`ȦS8_kҸw_<Wfj:&s#*Z!l-4V0\:'p ' r"wO'uHƒ >_֜Q 5W[xJX\o?U읓@Ss%z1 ) Yt:ֈOyrڥE5c"m} 87X**skVF4"AJ\"F8;J?Nhf[)1'Aiy/I3!" rq?.;SNw^fô4 -5}^RcCdfi&gؐtVҚ`g7C oe pǢyHܔh>^8޳U69z1ƴ u܆BK|VtR;.ES5B@/7!UDh).y %ճ!,dm[%HV'<]Gd@v &I Zkwc^X/Y+y&M.kPN4GpL L6r\o3`R"q>Ld(vsu$G.K~G#tñm2ʫDIKy!%QI6)ԛ0i:Aّ"pCX!ZZ{VMOպU`h<Γ}^ ;TP#|wՐW3*"gk5_t 3 -w+^ǚ8諃v]*b1}͎5tZYx7|Tb2E`MMF7?#oavS^|_BF.**λzh0OyY$6UqGט̌cu]|0h'Ub6g>i0hMU\X+-}B߼^]|InԘċ?|(:/<2׸ְ~4=[jJ=*y_ ޱ{(pd^^H<6t2[8Ӊ[m)]KRII|sO­Zeee쿚X}IBsIF! 2,`TdI?ůr.*ϝfq{zb- l8\u=MR5s(jɃf hJ;A'o\.Y&9ǽM?0)ryK/n̪I,na7u{;ajbڃ/yq7*[o[K-n0dBJy5JbOodr]X[sj!Lh)s@!kOjvh㯡x$>xMu^J/eX譨r-[WISWLZl8 H*g!7t9%K٠}E>`:jVC&QL>;*IJ y|Ђ -U;"IbpafyDBLƒ;Az>BQfh5x9Tr%/]sZrӠ԰j!cCryǾܩUGZ%Jsh/P.M'T$TL͑ITK9X0)ovd+2> R[X&OXe~dJ" V'=G"E -?pl5 =ycxtt[f0-tC]Mr;W:ЉQ/"߾q}>GY-K >4 bPg ELJ2ɾz6qEy){*g#Udoa lT[hhv=cA$ L9V/GХ%ǷDŽ:9 4P⁜ -jmDNOL Tŀɨ_l8,*O*^[vvS7;GrL4mVbT( Pg|<} \n7g2qq!7sf-/~KK Va>"cICCRH|)}c?W4)J'օ\ I"o -dzf6HG\{^ ;dOR#Hjon9~9q -r*+OҢzgs+6(S=8ŀ:ͫt M#G`F{х'P^CXNG y]B1rgR*rjUDy2I ڊMm \ZEcjUl&53QϯOgdv#18نEVZ#k\J,YkQt1湛+ipdU -endstream -endobj -706 0 obj << -/Type /FontDescriptor -/FontName /YDPBQZ+NimbusMonL-Regu -/Flags 4 -/FontBBox [-12 -237 650 811] -/Ascent 625 -/CapHeight 557 -/Descent -147 -/ItalicAngle 0 -/StemV 41 -/XHeight 426 -/CharSet (/B/F/H/I/J/M/N/S/W/a/b/c/colon/d/e/eight/equal/f/five/four/g/h/hyphen/i/l/m/n/nine/numbersign/o/one/p/period/quotedbl/r/s/six/slash/t/three/two/u/underscore/v/w/x/y/zero) -/FontFile 705 0 R ->> endobj -707 0 obj << -/Length1 1608 -/Length2 7084 -/Length3 0 -/Length 7904 -/Filter /FlateDecode ->> -stream -xڭTeXDn;iPInii~g}_u+{kyi8ep+jBz0uN9x(Xp% -"4 -+**z(wrG@mlQ@]#Vvvy~;Lw?.#?ԃ@([ki?WT(k!0lա  aZ@ CÒE-H'zw 8q G(y"6Kn(8 -98[rB2bw`p$ - B@P -JDZ~FB@]&rҟ]e !(w-+ E:9XվsB@pFBa6bD@l,`ys{:?trrps'($>/]Mꮶ v@^`g\ ?b3w$,p; ϭ GݕTω?"D\};^$P_PD#_  -n 0;)xxrBJP7X-foCPN?cr - --o ~]HO<xsh5}:J!'wzr -9y.?PT@/[MDe ߭? gN?qNAvIɨJӎ6^ OپVeђ*n'wU6z[Axѳg/25 -os&EzL/an ¡jG;8gw%e8sz J -ae.ۭ3ξCu*7x.XL2M JWi$`8+KI\3&4Q!O h#㯣C;T -Q"_%\֖5ħ ď5RqWgr rg}OAH|>:ah9xggMI -g9K`-טwC XFv-|8^pkBVurHvA7f艰IW # ;D_mX1{}うDc*jF)d]YMW Z -*.& ku -G"AW3ơH3R\V#/)o|.iyBn2uS3jۍ(J$[ wHJ:I24ER!A{v'CCg܂4 W:5'8o V42x>{Ɍ0xhI)?Hu=zCg?(A&E9|Ě6a p=(HhHtfeŕ"5ۊs)ڳZV^Fe=AU]Oгi=xe)^0jP4NbNy\*44H|\8D w Vvqr6BQݒ{UU]J+/uB5j+gn.e^̼ -Y=,_Švi@2P9Tr(xu7Wo tF -᭛{T?4Q"ΰG)ws' -4ɛ#^=]/?T4QX<#B#oTE:q% h%ܬ #=^n5:L<˥ۡ!xr]azJ Mml)i5C PyDգI3<;S&cQQϔj3gbs?wG - ;{fyC8Y䅜KN뻳l^M?}}x! nAZ龬϶_3d?AJs K8?H'J m ^֜CcG.ݙ@r18m97:>~|M~o\rդ탧V{3fG$3y$**ACm/Yc Ԃ5*ܭ˟6Lwr-0SkRWI'LD^DKPb`l. c~S~\mf+D=xzEupぷB)j]5r2Tl}"R?M`+jO/Kr.+OJٮSx~!]mGM<_+b/kO(9!^> mx Z&XH`⡋`-w,L]ĮReTǢ-&afPC&fk_^>+<^c#^4Ĩ2}+(VE"U ۺ|mus_Dq0l݇P󶷼 {7YV/O)杇_ZϩndMԆ$*h1k^L-R`3E-}y36l6kM~H[cpBjvԎNS-5 /TL4O:d 9q;fI$Ge~pp"!Dr?+9vur;~Yr}~ Wz$`NIm/r+Q^޲ -MK2}_ -a`3KMPK}px)-|waճʥɰxp1 -|6)'7TX C~^ZrkӼ{?hL}Cw)ؾ)z9>rTzxSC=8@hid;*dd'5wܑS7%\ۦu9Ճើ״K@ R4^'Hvs^ }d&uqntvepϒ2Zwzrm ^-3 :bw̓eMfsoNE fxc9be%A` MM y)?{rRR|(o֠\EĖ*]mi Xo܉+ SI@k}?K^.^s=\OyJܓ1-{:pҺ2ix_ 1^٭y0|~[z&~ǡC3re8cȧ1HRrZ.I䜹MڨsX`Yb_\6eZXzXonlu\!|đ*:)x?PpA1='f-a**{BXV:fQj;,2+ge ~(6)OgXneKO8oR/ Q~߈f*-]ݹ!RoD>O = -&mMi(2<3`6͒h]jcSP$tD)K0F&UY$ý9޸wv )q*;V5W 6su9Z*V=}_.z":QG%xHFʽ`} jqsD?R;Ԭ%[ gAo\ Mq"}&Y dRlF^[xvZbq[ Z:܅aJBS)(8>5'8@\AQ57xӝtZƤ{M -inr6Gg93+\2ct$_;GI#,¸ԝ: 'rܕ-45!'sVҐN@JM/A3c!=L  7֢ޓjlkiۈ{&)z=;;*nw"ٝM)$˓՝яhP:<$:u{)&Ϩx-Ft]+}Kѕ9{:̹%;6UJHX+`VsTuYU40]hWk#v&/2npm}b$qt5毓K7>ucvG 0'(-EVqD{}պaxKQϰ%E8  } tMTD.Ejvo [yߌ? OO5wVnmx>#`V-nqå_>gGF}Ht|~-lR^=3,y3͕ ?!#_e˾_͟'^*-֛JSWTJDH4YMdW8@ Iwwaf4S?\bmB6J[U%M9m hSӷkx.wCR<YUEZ;}?B -1hW,h"? -ʳВ/EwzM64E{W7VpD~A\Yo|b-%yGрepq>IduM~T=u&<.2X)̅v£ > endobj -709 0 obj << -/Length1 1625 -/Length2 10429 -/Length3 0 -/Length 11255 -/Filter /FlateDecode ->> -stream -xڭeTݲ- 4[!Cи{pwwww'{Џ;=?zgլ5kj2"y%:c!PdHD56trP2Y l+,=d#l@#33 u775sP(Q ?6ghA}Q 8&V@RLV X ̍F@ d`?[5/D [;8||65pm -dk>AF涎¢hf7 |xA:8cVn?l`nc -h@S{c+w#{[[+n/ @+zX&揘FMm` /b@ -Dwf>Dl@XYGH]ޣu5-ǖqHEWpՀ1 Gؘ~4_FsQsWZU>[?OAtL)Y-? Ǣ7G7[Ge7q yA:oo?2?~}7#ߡQr412??L< -42HIOub-UulrTMp5۾JR uaXQt&sHs[itRO"<.7 5Uu _'ZC_!?|ܽK C @k˧RQ7lpU*Á:s -@4a/#㚲74PKl3=k]q\gn4Ҷd؁ <S8tL5Xlz8ac@+(!aFfM5 X@hMTDeac!jyalc3f] k4{y&AJ[U /Y `; -&El.@)}Z/hV_#R1z*^ 2 -"%&9Vs'|\Ӌb7:5rpfz !*/òYҫ1I,V ^/P ) n}mM0n5Ex7=kk%!\tŝa=}G `I A -Bc RrpC'’>6K`4{%6$83 TU D'ٲcv΄ Y-<`/ۚ(.)"NT.@-#qD%spG.%_dY=3*x!_E ~sFWYFIaWeT~}}MВjK+Y9O(Xo/8m9A}-dAMZzS1 -S <ߕOY* -9E\{*^LAd_ ,2x%]|e ,gEY$ 8剒܎&F0jB,߼} x WJZB3YO2R -W}*fj.*wV, -# )̍-'+z*jY!t\7LL_9)>T ӏ~tDk\= bYy42og_Vz -. - z|F@o;%ŗ׃qKV_4%j CV:4p03֗7S9ltx%.9={<e#JU|%BĝlXR'2Nd2Fm.0uVFg*CU}@ D9ހ~8O.6)9Yl]hSxI|=$Ѓftw#bx !w'!2UYS^ѰLWACa2T eУ&AqYwoz4AaCFUn_;Ґޮ!| ֟O"^U4r"˔(* -zv9 pbxm{^hނT<0D>t$aK=lV|KA7O6(fѸQL6_ܠi,wkR_" 5=1N+ltV%MI@_*t.;m[ "h WT#mkOxA/-7ߌEc指j*rTVq ? cF~boщ Ԙj,^DvtѸU)u'TveEu%bTm llT m .;d=%mlw -*dA0l%;ʵ|眢 I rS4 k>%Xoj% Ňr4oEr)0d^(U&_ջk/p [K -c~Ԟzf"ca= -,aXKrqS`(蘃k}# z +G10}WhPT}Gͤ?75V:V+i mC nk1~V~(E^SHbdR<`1^1rǬmD=5LI*24\7Td~s'jz ]BL`-ܳFhҙfI97(z| i~&^D"ZY,lӇ^nb v$f2JmlO}dU↢'O'.Ǿ&%O*)a[: W -As_(ujcsg"qӯVԟe"Nkκ2;Y`S~8#y;T5EVdkKHh -"gy3m)TmMU>ENer|Y䊪ž#)|}=7Mk2^OZ%;|Ñ\Dln%j!`RtkƒY#Bl1 Ԁ_We!Q*.5 ZN`Դ' 9eT=;G0hsjs߻=Vb(xOX  SSOLV,0zth1k씏M]$8ˍƐĢ0rHӻs sLO[c(=Єz΄zd,p Z99uʥFu$|eOEV:w!tAۀfq$~J -GD-2aM̾O:Řkw& -Ym1>-a0R<>JۣH׍ǶuxhZuVՖzf jffd?Ƴf1>ە-$MX~I6c~>Ԍ e*74JgMV2]n8t1~t1pTrG2|ɿtPf9▼7X0PbDZPt pM"xO֟؎7ScR9_]:aۊJx8*['JIk.#"|I-j4]gʣU^]7#Ţ1…:LL4}1v}ϛ.xXV.5Hm͚~|YCy B唥9|o1sC. -e7$ \b`SfWڞ7KѿW]z-rU#A`0ʹ<6j^M6*7fm%*|o4(,ƍLŸG>0(bY}+p鈃d4a41\ unBxQؠ$2mD%e*o:,XsG% RmqY?51&{^9@*?Gj@#P*T>@ٝ< - β9XWĢPZF$ ^ W_]U]jOR w58I_{3b4ZW -ë́jZPNJx@/8z-tO- yS]/2&s#" s ;{> EO VԣGc/| C^n%w^J)_rɣ0!,9f-V1FlJrp6*Fc*grCBi39O@J&b [/. cD#)]_hOt1|\+ՙ/(!?MD}Y$1wjn~,mw8c&s(Md-읏̦ҝJ6xشL/LA)޷ǵ*=m`kT@,XgabN0 #/ |;mAi5hպ8'T7UU /Whe9G C]9YNtt>%y o63!~6h1 -/ӳ lN^b]ӄkY8!$!KID{94٥Os/Ǖkⰰo|1쫬6xkb -4Kcq= LR7 90T< ֝R.bFRcs --zZEp8(RG7o Xs%ّj`%K(Wa~pma8"\R_ l ::V$?^# z`iΫS5jb -,rDz i%όT!Mwp[_Cd+Z_>b)7"hòtҦl\VR%mY.Wb 'R&s ]•:$PȌ}6"kG)Z;n,S3q(:8@6XIh!8Uˆk0`UK/^r>2+Np gZujw/~uބJ_ iw ] W2UKq6xU<;VP~+!/Dl!vM>>g>$˪̉pZrwo -c܊-4YIai));kf1-bs/Kx*%j["$aKpMDaaϪð/ JayYfooFN %wsϐ;OT(|bLY ^[8*+K 7rޚ2Q :E1MJT^pfmٗT(#?b=K42v͢22 j; -FOτYBq%Uԧ_"&N20\A1Y@xNKd C߇P1nN!PWIeS˭0LЦڠjڌdIh-ͳ²1u# -y_;\:/D tJq{0toF#-.P ]Cߦ%`M`q9MX;Df^pe -OF0=1{bmMJ%EbHlQnodh~·F:/枀m\\!EMY,mSdtj\/䭁 (J B}6-$̎9ӕj錪ǗB}sˇ!Pկ½;N F GƂTE $ /t|z(Ƈ2J O [XVS>bp a"I3k*8?]0w`} M_\HCs -`ŀ#IQqxHm$D$W\|_ ްEf_-;jި Je`t,:05g⏚4)x/CHnT8ڮȹ~*OR*{Pv>5K8)9V -{WiKwjj鴝_f-evv A:հyìԷ>dwO"Af3BRJlo`o*m {*O١trI &g=H[Uϝ}`f>FpVPP t<Lc>XO -wڪHJ7%[;2 u6 om!e1?6HW1H GH4Ad:rH1*GO!2ְf|8}n!jy>k"%}~'s2GaU3q_yMCC'~"$Gg+"S jO2k)s! *d}}? ^D6+҇E:g뽑fXo0Y%џ`H#vy}8tr[D۸>$딕}fbP_hyqWZݒ왴AJ\)0^Qǔm$7gxg8NΜܷ%^4ZSa ^VP+@(GC(s^-X{k@X4F9l5UN[(pU -endstream -endobj -710 0 obj << -/Type /FontDescriptor -/FontName /CIYFZS+NimbusSanL-BoldCond -/Flags 4 -/FontBBox [-139 -307 822 975] -/Ascent 722 -/CapHeight 722 -/Descent -217 -/ItalicAngle 0 -/StemV 114 -/XHeight 532 -/CharSet (/A/C/D/E/F/L/N/O/P/R/S/T/V/a/b/c/d/e/eight/f/five/four/g/h/i/l/m/n/nine/o/one/p/parenleft/parenright/period/q/r/s/seven/six/t/three/two/u/v/w/x/y/zero) -/FontFile 709 0 R ->> endobj -711 0 obj << -/Length1 1625 -/Length2 5831 -/Length3 0 -/Length 6655 -/Filter /FlateDecode ->> -stream -xڭTeXtchn TrfafPJARnD@:$;AZ~g}_3{{+ah,jj!Xa1c F !]u`"P0Dh;s=@ -ȁu$ wa|e܇r"8s1 -  ~𑎁6O E@Ѹ" \>E`$A"KÈT10B0 PP+}#zEo8 pa82C$(,PC/X;7H=?bpza粃 GBpR @Ch{(qο(hjc1Pr1q\N ,:$@  ;ÏG"\PrQ$nGowj-w+nzdW~g8].&п;*7a1q_f8F 7c!0׬?vS=G@qCO\0}i?aw9Q.j}-4ĭ4{H~!b22a @L $79|Eý H _'h" HKc#q{OoFC^P"└-gаho#EW<-Et䣩` מSvE٩BR)QgG~4mʞPevFu@~80.oZTii4|'G.Dh2ϧB|1k_B,|xć=%>S؛)5)g$\qqr8K ,cn0elTW}-$Y dlɚ޽IODCm:[iU}j@_T4;NPRO.dR4uziMvB=q1n\ik!O䍿@r^_=AoR2d% 6UvD]f -1?mU>gŏ";rJ*g?~lL3[Uӓg_z&~sHVk[35tgNL]yeڑ GX\`)Qly:TRJ9S[Ɯ#9 Tjh5בtT -nFLֈbJ5HD~}lUyO<zFD~4VcGdwj%Xś}a!P;T%Zdj/7e/LcxY/X~3{?˱/"6\Iw |)*?xoZQQQ̟Dנaړw;M55hF|;oj.vC c]thɧOK?=yk (?Ձ: -w j—' ~+JluI[`L6B3 -!(8cOR ũGu -S>u)"HhNXEQҵ\E(һДotΣW!N<G7<^4m˪˓ް 'v~5r騤QM_=@4Ņ먿Pf۳f3bMlfl}94#W-L+Zґ:!@NɆ`$ARjU_rk"};V V̢ڟR寝 `y!l9}Q 27K.τLghzg2NWs}/+ԡFwcAm^yjϬq?"xyE6XNݬB'ң39%<eiN_-SJعNcꛠI g3'@IuiAMtɆf{wC>:SУNʺd*¡!L"굲ʹ*>RoPG9}hQ3Q\/&fj'V+^έz4F'(qI9~̬Cgr6C(4. 0 e&٦֤w]Oz<Q4+' _ԁơzC~ 6`GmՠOn -#7#(i>bQ/E8G]E?j7Tg LxEr[^70fpY*zi4&}R\(QW"կHo+y?O} MsrrN<2p;'IhDnFVvI5Ġz#&Ioa7ҍ@* -^Ŝ3VI;y=BKotќ=m\xХP.oNӾZW|KHzѿ,d'V\/6n[,d52~[ԕ—~+\eP0RQ) -ن;뽴DQnYo4){W@Μ uҪ,EhRE]g'[֋.Uėj!_nk 0-s\͡۴ -2?ו7a -X愘|l=UeM|ӛvZ{|UlAu/%W͵գNR)9mYnҘ\}b{g -^zɕ4maxrd`hbx >3}b+g걭l(~H5:fm3^G [O^8T<61~/IyR[2!"g3v<66h^"p_\[|JHSԻ4{tcekݸKXMVH~^l -`?ژ(a 5ʡ\dmtj" ypl{.Զ#Ǭ -ۏVh/[[,Pub0$Wm:yO2>ZIy˙DˆP+86log1kV9zNw+E~$Uᓒg5c<JoTyk:_2n4iF} t. Eں^~ok4ξ8YeݾV@H{yO˼ŭ4//=Xyr;\K{_mg@k? `gT;P+)<1D$D;Eg}eb fy,V~zkaD:_._M;>m)eOEV#S<)hɗԴIE>%?\'<=+c -;k!eoURP*'xGvz1HJ;x -f6&a -WUM7C('dKfrI,b4b=  -:p,kUx֕qZ>E/k·&͟Y>m,*vΚVc?U;|y$&pPnȉ/oTR2'6$Gltn~=SZ!iXr?pIIuPmrQ׹;aI-qٓ,*:鯦Uy\o$gV5Iq!1iuC{e ->ݾugoomYGM#dx \;JEjj܉K% n:  ]j.% I灛{kcztYߢTȷb٫5!aĭb1%Q3ecs6CHC5!ɹd6:ܨ -{gd͸ f)3ody(ZKFEWUzdw,WCV)-z?n3l, >~:m`0:f&>8 l%-2Ѩ+uraٻX1hc&\uѣb6vq|_f\)k! j0ik4I8OFgsNL/elhcy&M/>~)5a C! ˴7qJ"CEreQ;[&qwE;3(׺S8 'G7=fgIT9Ջ_Ib8OJq;11y]iylNz!W( c)}a}Ouo DPey/sܔ66V TT9_1Ʀ 0mL%xT/W44d_ccX@(ϧʅۀ)̦Cto0J&nG" ;G0fwo-Ju5eTzZ]MK -,m1`q%n b@ӻd!0CaB*c (yDz9X>\8 VFqiͫ\#cR&s>>*WkqM~l{7v+NI-Ӟkl4Ȝ sC< -%6^7FG5 F%{ f73mYz6u򈝬wXU+ץ\_t1X;Nb~8ziNjR/kDpSrdi00'CTMvq5ienUI+NG0$ڷqn1M{O4 JBq'f1ʱ\\z*]0PfVF=U>H'mEj?)^jyI Nx -endstream -endobj -712 0 obj << -/Type /FontDescriptor -/FontName /NYWZOF+NimbusSanL-BoldItal -/Flags 4 -/FontBBox [-177 -309 1107 953] -/Ascent 722 -/CapHeight 722 -/Descent -217 -/ItalicAngle -12 -/StemV 145 -/XHeight 532 -/CharSet (/A/comma/eight/four/i/l/one/p/r/two/zero) -/FontFile 711 0 R ->> endobj -713 0 obj << -/Length1 1641 -/Length2 6434 -/Length3 0 -/Length 7268 -/Filter /FlateDecode ->> -stream -xڭteXTm6ݒ҈CwwKtw 3 30C#RJwHI)ttt47zsߟ}~}kk\Z{q(N K@DPX}2uT0*hPC zAp5D` (@DFFGB]\f<||[~#QP8!<A^hq r0@J[_oЄ!HtN0( A(:@JKC Q Aa?7 AQ(7 p/x!P8 -mwFD=14!!^tVC5tz~FA0#@޿KiШ -G ~^s9A`(GFy dxp  Ph4No P/,H$" Bv‰~6A 3Ã#0L$BpϺ,kGk?{_~Oj oL=-zӠ߻{ ^9P |7t%7?.e4~! -pзnVAtw\,@@DX+ O.n۳ eTzTT~@q14@FD #-ߤ#Y腄lEOvQd3ooD[g +C ~4$UM7f!δ0LuU`~蠁qC x: )9?}'k"6`Jw ZR򰑱k{bH36O@ -E;)g\=}Gk|y r>8w8cB<ckcG:п}s1IX 2`;6 tMG>@AX8E#:(T„)FyՏ:+o) -^0Wkip#󟉅cN_EޞLj8~[aӰm{lKV<;%[˜B{zoǰ*JPds5(_m׍fL*fwʄo:`bi}3+[}$YA_8qC#_-Ym|t ;f-¥8ĕ;E('.* -]O ]%x~v X#`wrs 79i'C^J>)
  • 'GxqDBoq[q2Zs pbLbRHG[>>\էOOGMHzŜL'F%1?~&xT$?seWIagyO'PC>`Lt3!DX<4#ȵӆ OqM$^=# Z!qz^w%;cO76ng_UPU#S1)#xL*pQ)r<અLhŐn* .w: /8}>cE"89qӼ`e{틳s,ƌ|͸h]6>k>sB7 -7hezST9M 9|sp5O1:5Cju5*b8 ;$Y4#bn>WچerB5Q IwtG$0%ɇɈ -yf[:+#׈=JhP_͟QȞ(L ?)MHOZ'P琩+B!t&1dl[B""?D}dlޖ):c J<žY&"`S2?:hɄq(܇^?XKqJ;*q-_dh5 -2ҏaXyYQS?UwV#9Q˨f`Ru56QǑbԼ|PtÌ-PNSc -[*ΐ!o:`蝲>PI),vzrg=\Nqcj#M:aFYp@5QM\_;8rm+}DKFp3!s\x\f+Ե*|Anq]t,4iz$(Zf%bp~3+/;Vz;i!=]J6apqTL |\b"x :29-9j*?uńYڕ4Z^c$-FM\w*H~O5\ݿʆoWU +ҝx\9c4/l?=.hOAefyVRIdKɅw&mڧFW@ŶVC~+HtNA+H6b(~Cjɛ)U{v !lsNWLYFGCj3R."ť患Qp]$ξQب&I@{@b*8ǦUW -8*i&g\ps 'o٦#Oq&DBr7gA?z<dw~w'f -g6lmX~oЅny|CۣOb}@ ِhYߛ;o_G(%)!biR4|'kz^]s,Rm? kZoꆜ|,= -̫ͮsy6JE6>nÝSI)zao{yj~7׾mJkQP(t10ۑ_HyS]Q&F1VWҲq-s4t=cb\0KJ99zWcrgIZQb 増)}}]KXE~ Q@R3 ]Lq!`۾a:ǔRSX^Gdo"UTbE\I~'lF'ܫ zt{E#Bz-yK}~X&Ur m[k}>s=JfeW+9"/ߝ2j"XxɻZDxOGfe<x[ -]}fۻen3fgVDxXn֯'QзmFLcI&rH}LnoLw8K,n/B-8 n4·Xeu02w\T@jӏx2r޹,ڂD!5;kRE#v6buRBNܔE+r8Ɣo BG~DS~-nWXPj2gN<&A$2xZw\r¤ME%R#ouJKZFi]8R{VSXͻRxp>1^bGD4ȕpNS.Fe*To 5bL5uMH22/GCUETZ63t Pi Ɓ)K˫MUFxG2Y)~D|d^ -1E7WcP>#&II~mP0ش|Il/46;Wv) r,C~Hzb';/䱝[JOG<=KHSd1`ʇ+ѭC7CW6#F9ʖ.0}3;eg4fbO9&jeAOKkL[OKU@kLQvǬ,^' RWP0MI]y>^T]UhF 9]eB2Ӑ֏L -">-gmٽ|[9%>,RD5\󡄄G+YQ?&`Tf- q:)av?1: ذN3o;x< C]AfiS&LsP.`S ]̏a/hah\B-zx!z>TpΕݴ?ćf `5(64ki(ё? .,jmX}Y?&Y J7h:/2dH3{ VQn2^aӐg\Kk~n -z0B^y+QHH\'\Twj32T6"́e0 SGnt{5a<'7f >,cs IV4 w'|{WbT6JҔQ47&<_PME\ڮ!Mso޿b|Ay4z <]"Z9PKa5Du\snҕlb,mӐ9{_|M5V[mVgȪ/gI?AW,ªoQQݗw<jҝ]D.zTW-1Q~3ʯŌ_8(MB&jLFJ-!ːRh1gmr75nJVHqoJiE=:`bե: ;K~ZpS᷵v?x”It2@BN<c0,H (U%eR?;ܒ"xU]HvaN&0'//tcll DMy ڶ*6~}YSJFlm3qGӖ ,'] -sܦqS≾\> ;.w+Sq5CH?]~7.%N=] u^`rڞlQniI86g.ڝn=\j-Bgéu.^8Ō4h)3AX^eDo6`H g<ż2> |MWDڻZ1 W^/cj"7YJ'7C|' `_L%W IJf䎍i> !6oB\źn5wr68 -&9 fbma֒U3HL"؆S _oCGmZ$X+oO,m+>Zotڵ\-"§kY'650zX`Rt=& 5!!4O ~ ݩztsMb&s|\N ܽ~q,i}l*ݛ vH]?`vtgqCF)V@`G8}2:-i(Q$|7=`8Zs::g?~'6+1 e$ Uo]iOXqSQ"{VmJVeȾI%<~dl~4u&ǹ6)ʚs1=-=XpX_i,sj)fv<$<ѹBSF䴬_G}ߠS1T$\߷X ߀8[6깥-9[}7sM۬a~2)x{] Ԙ{MrԵw>=6$.x%T~ALs{8D/]V0r䇇j/C@262u|7TVb#bVW/K/کYc>Zs}WV_bZQ\^%=jޣmIH7f%ĹH.GVDTQE;j ]2"IzAl\α+ .w}g8R)?Uw,IT2P0o:D;Bp 50+LTI|Ak[} d⊱P6)~ϲЀg8P&sSQ h%3LdE?͠ -endstream -endobj -714 0 obj << -/Type /FontDescriptor -/FontName /KFEQLI+NimbusSanL-BoldCondItal -/Flags 4 -/FontBBox [-143 -298 913 989] -/Ascent 722 -/CapHeight 722 -/Descent -217 -/ItalicAngle -9 -/StemV 120 -/XHeight 532 -/CharSet (/a/b/c/comma/d/e/f/g/i/k/l/m/n/o/r/s/t/u/v/w) -/FontFile 713 0 R ->> endobj -715 0 obj << -/Length1 1166 -/Length2 4511 -/Length3 0 -/Length 5274 -/Filter /FlateDecode ->> -stream -xuVuXT[V@i$e:%%3%5R (R -t(]Rs9;cwy6/\TrQHXdr;! EWq@<B8([0 I0HW R0 ( -AD & - q>h'X`A.]B`n8߈9O `Ha xп*RHCh+G~ pЊh'a]ĐN\ШKK3M -nH2_  =-nDxzL(\H, VKosU" &%~NHxH8yb @xQa|_?w 89c;;\90X =nBznnYj s !4HTR^BFfK?uB'zHHq:9/ mcA7F0$u2`k/jYC*"~)W3|@k?ypN:/Xm?"p0?_7$*!# @X,,~SZH -@qW:ahCs 4blSrROt_U4Ey1cfglҏ?ф'i%y(@HtcY7Īv>|eN]z~`ëGoG1q.x\ddeDP$bD3TPw&=N:~7G 2aCx -g6gr}M'n%.'} PQWw -{]4op"}J$z䤸5 ^ ؽ/²mOF)u=zn;M -NuI/tL53.I+~x&HtR,ؠÖs -dT;RTt."Tl5 y!x2 ߟR"3K(&9GW -Luxv+R`y*B|*DVEqLmOˏ l١A*oD6SZȳX2A*hG]wN|3{g-jgc,-[),­Txнpx?3#7X8rX+4Rt tg8ǡ*WDGBl\\zY%ىqGS?!qMIN~A. / F2F&/jT7gͮA2'?m1 *"; yK׏ϱl -(,z/-mA57"${`=^3~{-NmA]dܚl}":\w)l B .Qt/vE&dv%s'Bwm6 A̖z,KsF0$>g -dX #+6y)t~+p,T2s{Lo56kʿS_:PhiT2Ԋx;D8XLZ|c藀WSkZGNWBX=+g}%/~.~\#qnty9Es3Y1clV KK}ns0+O?%/xF=(6yQC:{J:+oLp|7sfny=Z'gRjjE4Jt}x4Hids w"RjY8u }q[V\{> ع(*xU~v/=ϋJF4ItDߏԐ.j 6-k%{SGso2s$.ܝ[HHK-^g2xD铤r;LlZ1%b?w qY3LfYjq_ɏ`$@f7f\VjW9Lۦw'lIAL =5}{>W ?hy? z@4V"uZ ~Y`}Tc¸k5f%yYkL滙Vx.hYf֗Ҍ@X4ꈜ-#)F\Xv`o>`Yn $TIjsa`}wN^s]Y. ,NvZc_f))\%U'n, |$oKuAg[Hܶ`ri)?ĎRAa_2Ǹ>"N>:6Em 03gTK,ll3|r]ch~`>~٦[U4?^Zbذ[2u\D0T;nb9-(0ٌ#ح/:a]9n}B4wEw \&E%N7(`1ha2jK6q˩ņaF⪳gdv@~ڒW3k`oHiHYZEF;w`h%&2iM/.4X}nSѨKT9ns%ʜ\8R]; %bμ}b⚽Gˈ ̍ʡ.w ^o|yK(ͨ`ԭeycuZM^iOAX:"3޹Ÿ?N_|y_4-3tgBJ2^ȵ{(%a6/m[rȥ(US}]4cw"GEq}!kI}HA m*f{R( ]ǐԯTG҅6ӷVO٫bjmVoLy"D=_GCGuoJr;"&ȝhLusw]x$Vӛ!*Dx;A3(RK|r%4]%1)~J BیVO^_!yPC Q1Q1Z5OgOƜqu#=<__'CKA捘$4`eS0?uvTݴø{]:B5l0`H6pf<$8a Ӌ\^gZvE=pm\⤖~JUplQDP[qsn^osux kSb ;ԗ ->ƾlVwx0}!|gwt~Z7$T99A 17[ve|per>qH\ɿI A6jTЌ0~1jUk8;v`oP;4#8ݭR d[+y}5NO997FaY ۣX i%v,y,h -^> 9(4li5"ZBD׮<<PA|'Qd2rH(]&޹))O^ؐnPQ}:4B*U)U99Vag޽(wn)&sF\) -}++Xh@SFWY-I?L2i*Q`0P;)$%ЦS[&=jW< cҢM.29a>+2DhD^)e ɤM(_ )[hO+Ͻ/|*vRt;`G+WU^ȣw$j=Uuk.\) -z[$/cXkݣ[C"o/|ڔ[fC) \ˤFݘD=օ)K8) -*GwùA)7ϖYdϲy fbgK3=W5{vBMۓ BS&E|yA烡*v 2/fQd}X 5BhNH`!{w=:x+J\\pQ$@Q\mXFH7p2[ā1](𞫜;5w,'CwvSX9N&chC@}r#՜:6'fGNB&e3>;i_bnXf<ǘ[hA+f8&cW'ojKF> U7< }pwQ~5:!2aܶ3?0wՁ*y6P(W[#NqK ;3P+TR1dݔ>YZ)_j~]6&>.DTJbP;.^F?$8Lmh?6/=52ҡj70< zR^wEJ7?!ng蚱KvG\,hE}K*8ه4X*wHݍ^V-va5U׸ɜByk =vC4l{[h<['Eyu [┓SnI.wFbC<\{`RHtC2of6 -endstream -endobj -716 0 obj << -/Type /FontDescriptor -/FontName /IXMTHF+NimbusSanL-Regu -/Flags 4 -/FontBBox [-174 -285 1001 953] -/Ascent 712 -/CapHeight 712 -/Descent -213 -/ItalicAngle 0 -/StemV 85 -/XHeight 523 -/CharSet (/A/B/C/D/E/F/G/H/I/L/M/N/O/P/Q/R/S/T/U/V/X/Y/five/four/one/three/two) -/FontFile 715 0 R ->> endobj -717 0 obj << -/Length1 1626 -/Length2 12707 -/Length3 0 -/Length 13550 -/Filter /FlateDecode ->> -stream -xڭvUT]-nKpwwwwn5 Ow}{+UZDI H 3@YV[<!gGuXۉx S`a0sss#PD<,-\*4tte0O͇ dc` svT.  - TPH@N6%WK @s68vK` pv-?@@_*z` 0w2s聋=hj߀?,l?t]N.JbbaWng5WI>|h]-. r6ƞ?98Y N sc'SGuu[6{m_,]A6f ,9.-i;3{3?䦮s9 f'd`@cG zW%ZFccKgrblkirWkM?ЊۘN%v010Ch,a2UtŽm>\dci031NhmPLUgԒ߆JC?J7_aDD=_9_X٘? n&!߁y7vq~w/aǤ/5/Gy{A amlR72%; 9P֤V\_k]eRsu_`dž7Ї} Ѡ 9L3rQn JI`gJYŠ{'2B,{_`ZcvZ3F}e{ёkOtqnPȔQuԫcqXjP0 IO}[O݄!v:S]kO0hdBCG*&1NebQ̍n>bvd2J[%86aT+Чi}3>KjDVF@"ItyjJK'f璞`Q%i, _ןRD6Us&MgxRE˻Prf9Hy@c!U}ÔITNdm뾧 !!"LsXF<ٌqr95k0p`@/$F]PBԔ)];yaE$4XfD#pn0GFzl9@3;fh>[%@H$%+#szo@9cf%I}K -֌YZ4A7#j)Sn=D`}oZ7J !jҾv76$}1f/d8 -RϽ "2=H*S8QjL 9I{oW.#7Է=ؕ\n04*HN Jk@ ;w'ߪEec5{hI4܋%J-{d6_}N&~.Ը(HCͯS(VUO8CQM3E)~":;%fI(2tń H&\P$[AY Rױ=$CL0 2}SoʊV[r#_vA|iwUnh<'3u̒$񶼹~[0cA"=}Augm}ɀ$<ΫC?J۔>q\.!C,ÆևLd-0_K (81Imtbӗ*hȩ9/%ڗIk "q<a%4TT=CЏr3py[!B;3\V|xf@ DayEKneE^Wj+9z&xvQA[,HkXXh )S! -z![x@T YE΁UyWm 3{q`q}־ gNU9ᾥ`Y89{U֢0LûfͲg9 ځ[N!Gw؜)菫ne 7m0xΤǤ$_߰^1 -5jqAT)53oBE;+)tʉ`΄> bb ^[RD|؜}4Ɓ%n'ŭ" hA]WM^>bm^1|SerpЇ-EwjGDϨ[fLZ?Է!)t%?K  wf>d 6>m8KpAKSH荊$3Yc/͒k0I.<`atoTfyXuK tsFS3kAyܙtrm) Qsh*}NlIs'gMr<uQEֳ}hSٻ$J; 7.Yѭm8V8+jK/{8*LԌEѾpr8Ę3Dֱ_/W&Z <WPaDudG(|&Ľq^ -l\PE}w s') /Btjx4>_*|v>h~GkY\pZ` /<?Ȝ$P^׆*ΐVvR6ŵ_a &1婭ahJĒ\:)]r]^Y8J@ =4HRWԞᢷO߄!lNmN2 ^N)zye{LR2*Ǫp>"< YYHnt -%ꀁKPFVuM*}=vOHNٶETbd|ȼu<*3_ |’船a`jv(lN9"fk=Yh, \n\\9{f)lon%ř~ci/& nwvjrԈCk> -[?l }s}i`|ѣEICC'0ok/l.^2HZM~5wNH@U`vY}[:*.o udYFar ?r*|g+$%Zc& -<,xxMʷNpfAKSx#P\J0JɾiՉȦz8C7)-uv\5yjD0S<-A|j#R@g -sBc@Μ-svh1;TS 5!7qvW7ds -TDwOW9"uh<9]Lu" 1Cζ56ff/ݡ>2,B2|9o}(^ FD k*['dK}0GR+3/~| /[_CkݴMc>4D3 10-pEfInbqdDWlt\<lKn)o"Ŋ6G6LmiFsyaЏՓbyAa;w6*1=H_gYW>8TnPM ʔ#0q+]8En8Q9+0ő+p>%=Ykl%yt@ܯ]J1VѪ'È3g7 &Ϝa&4QzC|m/R9Ս˿(޴oI<ӵjH_pl](]r31g8>xZu7+-eᐟ݌e*kVI?sбz*HJNfcWxą==,g:~JNy nV<rbexZoStm*>8*P>N%j'BkSJ NSD}J˜F~T-g!P ٨Ɣ aCA1|ri"Fz2WL$!TV|+ IRT~Sh["#ZW?N<[akن!偶2O!UEY\KǴ+kSh<8fZ5|Is5pĥmҕ{N&\3O<9-u9NU5̈}X! -Sr_})p!Oìfb&R7 kG,n )rš6lI~RnDm92Ji+\ИSߘGBUe ?HچnCI!G`5nZsO/|Rk~R{8)E=ŅSR(o ZZV˾"8.O2AtfEFȉ ? r>_-%MD״-#1tgM{MjZѸo3<(S}oaXЏ:%t_[9H3Xp\epY `(4Dz˛2{DvT!uJä浤Iݼ=M]&f36:OJtqb0Bm5I[==d%WY@m4o|ߏ!|O,$T׳/,p8]{r\` ܖU&|-.){9z);,ɚS}*BphR[ZP8([WlyQC0%&cqiW~>2m!~a".v ?!v[u.* kYG on+4'w:s `Uy;U#HBeRFa!T^*|] ,ק3^3Ӊ!S\-T#qya'!9͝><_#|6<>*GB4Dj)!@U,mLl x,o: Qqý+W$  3ڞ3hۛxf_VijҮSqT*!w7bN@>5!X{ņ 9a oH_`ʩӍ -c7c kpCp?I㳏3ΔB$i4/# #tϧZE|]օ0EP#AŤu 9%`ۚ7šs1Zݾpu\i1&X8Aw'w'X].ߞn̜o۟Fv(` -g1AL[cc╋cd2jIK}6#qYд* lܴ0q{~ۼ(Wr$;3y8LJe\paDN2lWB[G.RFC97Ed`W?뮳p'+C*ڝo7}1_CN03HK/[oڵq;n>WֹOBQU2DdÝiAJ}Jt`[q'Pw@|Np̸3ӎp>ڰ΋QPoI(д OP)n) ܽ( k zRmzB'Z=ȳ`L<_S,=ݪ6}>1;.9v^^[5Q\<XI>ɻ\e Yq֫cUy| ^EZHO<(,S9{|V,+[:NYy,d'5XՋ +2 y 4_nLPOl/+%HՋ=] -1blm 4{V@Q1> ݂GyVVAm0F}EQ0B :,{nlitϧ~Q9G3-_;̧fHr<屟=%Y_yKtMs))j߯# vI"ͧ )wt?{)gu^oQD/ej 'F56l pJ33 H;㶬qI5]'Q`''ky~pOtrߓn GNWOjO HvL@f!#<(1rMF4R#43RGg+6p9Akz 1w-SM*~b¤o?2᏷׻bSZA -gusq1%չIGTZde{Nz:jn Hjp@xa}<p x\"|c˼7-pޕ3NI>%ZΆrGvFFtv;ˉ^ [NZWBZpo)߈,Uj9JZ/s -~4ZA1:vۀ‡ :5#{qH#vc3$2 .یZn ;tRj~#c?XK WaFd j8H= &/R!i]^ji$k0 EDQ ߯R -x9#SX  H1Ig=f$)d~B~\jW)y&QʵHuL6v$|"%Q^)QՂ2*Oz26,hԚpgCٴrir9ԞpwNprx܈URDAh9 (@*.+XrJ}' Lm䀊?Gr|yKeMw٨s4&n9bn!КdD}܂/LeSWѺ-1 qGT9(gl6ƺ[yzRbOvWk*{yqdh4FbSԱIݏ}g͙ҞВYPl2w: sbKȿHsΧfZc8,Plԁ>ʩj9.}]δ}S.U=$iHW%E(Q[33X m.d1\o-k_] L~,~]'!G*eczwW[ˍ*{3&Dh!N1,.~he=-?u!Y8AvΤ*t5cNnpJ,(l_Gπ5JcմE)㧙OHܜ?~o}媋10d`v-iX6?MeU+ދm@u1ݾ5X-I4*Qc!Œ3vPl>zHEKP!]aR*s5sJTRDOjdSџZ.=] Z(%tY-5 Ne؋RxN3 t!4Ermf!Ht*oQ&x9&!w)76[@]6$Nc -u&Rni,y`ӾA8e[9jC0$ɶitg煳KQ\W &OL9 _q -M~T|H`^2K9l;e+N#TA:!]<-p@hdw0STFC):^mHeծKvUp(Uc%yIR !EHOySOI#U,bCbE`|c'E45uӦ >t= -jslV@GHg?R"&~¥9$P17C'^^ןlI@SĜrM;ayVIeMu dN:Z 8-=iP63)gdzWkDO؟D3-4׿eP9_#uBU\QY".d ]O5忺^XPU<3Ҳ=hASADXKNYl#KL߅EsaI[c𦸣l ꩻ1;%?sZʞͳUJ/`;°z)U*Db鸀*HF0rg[g3^<Lzc#`@3g]B]SpDסBz=INN uҏ\+C5Ka|[MSBx\өt~HZ nN|T-VިZ`mpX`jl $ #bs:.KEN-pRKkSzLg*?BZ@, !z݈1=A;cCN0ۗ#>?D2N2_fѕn]H^4>Y$-ݭrN/8L9GM,`h]({@o=]y$5Y~zDiM !];D.:[ H[AtfuUɟjJu3CfDse%>2xj6w7'%qMxpWӽ<ܠBonw+ίu\[V4CBK^Q܄Sm#ِj+:C()yU1'$ug- 7SnkSMO m^}l7(7ZjDvg1'Ĭ Y=li99!=Y 5ooѨ 3[LDygըnofӯ@{D}An \.u?TF!S -Ɇ(tR\g0XR8kuj4>_hqx^~ -,fTTތ.׋O=ۆ -g;P7Ǣ_t|:_JG$lƭ’~+ܷ, S<ǜun-^Ue\%ц ] "! 6QJNبy9I1K tbQnNO1n˖.tl3B$J\w*JB3 >mhބ{V(}]]Guo ?t\ B 15sf =&IH[oXPI\U,(_],|zn8p&ゥ-K&HyJkWU{",i~:@g+ѭGA~#쌄ŐƯ(`tyȸ6J{lֳ*w)Xpb5{O5G HX}=90M0VTYm9JoDK5y j"*v ԝPG=2ǕKvX) +z63ށa%qK& 72/ c_L_GN#³ Vg7sں!S zkwfbX߁.{nF58_%G֜7€dQ͟t) -|=]?o8<0]NzC)s|V#?AS-Q'.t 島*QƯQxrP5wu!߸ T2 S~b41fԕ2\%Jk7bbv4BFs{W 'C(6=236gc{^G,Frl"S \PՂCda{/~Wyi<Djp۴f.YN~ *u 7RmIAAV'SsTB䯨ȭf- v=0)a[79S61|H3$xOo@g=O'\q(8/œ\j.=Sa&}8o,slpFaEqgU'GxՊR%@tE0=(=$6D^FZVkPNkqB0qdb -v5~ «5 Os4-a[ə?j ,%EkH/Bʥ獈Ͷ8Bw2rV#l@20z>BBe#v3^uV"VE&l2\Cl9GL~}Mfn0K8;pHz?teNfw([jEn8h -wsZðL, ot) A ^jҵF K?0 8K/=Ȅ)}N[zSdzb$<F=.j ,wSѹ̞ո&P_ċ5MK/Ϸ1q9i0L: -=e>A'@Ι# b_Q[, Qx؉HRBݥ* |g*oXjv[7qDI:<._owEK;n7SLjY? d[cMhxV>j4~Ԡ޸8h Z;dLbWP[shL -KwܞY!b +~-vM ;*BF,eII)*ĩk o)rD+lHI^۹85W<=k.hf<KX| p2nEꑖR^0dYBߠ儵JV'\m|`oA{) e A~V'zz)w([iV7b[@(ӣrl&IXVAlL!&<'rH4iRt]bɑ2}jt!lV/b8urɝl6eSd`Bl%'(TO -X~k>m -endstream -endobj -718 0 obj << -/Type /FontDescriptor -/FontName /ZDVWXI+NimbusRomNo9L-Medi -/Flags 4 -/FontBBox [-168 -341 1000 960] -/Ascent 690 -/CapHeight 690 -/Descent -209 -/ItalicAngle 0 -/StemV 140 -/XHeight 461 -/CharSet (/C/D/E/F/H/I/L/N/O/R/S/T/V/a/b/c/colon/d/e/eight/f/five/four/g/h/i/l/m/n/nine/o/one/p/period/q/r/s/seven/six/t/three/two/u/underscore/v/w/x/y/zero) -/FontFile 717 0 R ->> endobj -719 0 obj << -/Length1 1630 -/Length2 18441 -/Length3 0 -/Length 19294 -/Filter /FlateDecode ->> -stream -xڬctf]&Tl[wXAfŶm+m;ضm'۶}8_c5q5J@CQ-#@Qh# 䔦U41s’ 98Ym Lj&a# ss03wP(QO?&Ct0P}q1٘:vT218L-MBrbJ1Y5@ madbhB0:}m-)͑/#hgbdw#o [#kg+7+!;_ `@G'G# ;'ߨ¢؎_Kc?%KdO,C,f`bf`lm/?:Kvvn`hbmJ7f̊)o\L fo@[k7),,oHt}$7PB oWKz+]2{ gX8| l,O^Z$ E/5 t Z8Z[8L _r[ck [ZFS60LlkWJr4/Cf7Q w)ӵ -MiW-iI2)>`)%1}sDNKjۭUgU!B0QGEI$AOΦ$""*^?8x^h #xJf!c̞dn90:>}̾W_bڒᓕ93u˃򷗆T*0ud߄L:;LWl]748N|Pf$y Z lw|de'х)U2)M'A4s)Ӵ$~V֍A6>8Tiioa ")wTZlqQs!$' Fy60#+߽teBEQ*ؖ`]|vAArQƫ{z2j3sn04@CW䥋4`Ano Y1s85̑#{ -ԧ*(UgbLhF3~G,{c׃3FvBt#}fl3= Џ! *G47O. -#|E;F=UVNAڋ&1Z?;5n%aZf,OKRq$oYx/3n,ek2}̀K`t.Ke>֖0eBA_NvO(0VҠW+N XW)VO>tqv]fxڟI -ɚ^GCr/3}NeC+`LJΓyW:xg\DYV8ʃ~Mf:z(>VA̺~L #x|w¬h1$>lNw X+p6bf!7͋>mhuTSs>3HMQםPZy]|efoLj 䉂7q+ b-ο#Qs'/ʅQa^<)L!5 XJҒ4`S}}wcßzsej|ӹWe# :=\QH1q!Oi >IեPڀTXX.U7տZfAZ|6ܨ{eLf|8)Yhf?,2(zl.J`9IU^[hz) U)۟ ܑ0[ma}9#53ǕcXCHZE(KSoCClǗ9ǝ0yc{;x]]תU]dI'.5\cK hVTJ_,zNor,ui& X\o;5G33H^tw7>bKGAxɯR[!5~ k1:Y,Nl/q&,5^DZ(+aF/('ʐ_Rߟ$Dǵ8ӳ١= -E9q?GSv -'qB9^# W$ݛ"ھ 3?fR 㭿{ ql^k(b[$wMؾ-s c\Ֆ!VuyDYR/=,'4[wbĀ A, !qBzt[s)ij5!q -Y&}j$JV#~M~ʢ>.KXdO#eAp[a'bd*c50Z#'B` dpew| -2]\fWJh`HUuk9G̸t_$ktX4 ) L`؁H6L4Yt -caDVCN,V KXOQZlpˁŬ/!qٙEzCyP&VnXQTl-HcE7"q3rf -3Ƹ j_Imu '0נMdbW{@kxMx+D8y9*LIWaBuc,˻'bjhh/R'J Gg8dxK0Y߆DiEl2_H( K+@_y?>?I7D'wn"ڲʍ[]r>~TWr}1H`\'҂)-N#5j,ssnaꌓTv*HD-kpdk+D$tgnnixaFfIWQg#[o' s3%ƮG`Oq;zG4HǚKWR~Y<ΎM,u;ҼjU>T;v fKrS@=j۔{D9?srVeW6;|LrƵZ&%mq|[ ^4m{[ݯpl9 ŏ~i!kd9,O[Pz]`҆l@j7[eH m7h X2\J%`No)KUս#TEŹ2q{;C'UM/S #9Ft[+s3WSf޲#ۜ:,\PL0[ z٢u.H{.v QG`Nv|V-9Ωbxdao OnV ͂Cyp ;8.9M޷=0Q`4xBPLx;8(~3e|-V/4OƠH噀EĄ`Z:f$t+_hsQhSkGcAzDJjWV9SG?p YboRʃ+VT 3"u0"C]|j^~klŗEbRgB3s$5$jjT:J,"Y{L9Bbi.ϖԤ:7[1Ӭ΅hp~'}RgL+hYzŮKJ5UMc,Xz5EJyNC*m^B~.*n!k(,$AѼg -c|hpU=.?30*n=_ߍGk}{WڅC6[i eaó1gjRݤTj o?h򖒃tF qׁS E +][)\玽tu%d9 DY/ʶV*L9ܓYL[$&.YzYt.uB v0ʮ]D9'rYVNt$,duG-^"!3Z6k!uFe%s>`Ry[[wR8b"L۲Ѥz9]\Si-\uynN FEڼrj[vH/(ISv.% OIƟDsG&U)jL -cg?UͼE)`]|[4ZK#Y#M }wa3 .Nk|kGi`ǀW"AXUf)%s߄?{ɞ VqM&@g -1'ࠍ+{i8Z3# -wZgz ~+1T&(|duà 瓬"Pk?׭2KX{Y^1+7xubҊqx9;!A܉~rz$Tbu콊+A.5/$^끷Np(T}ӻimE,$AREE45Ɩg% Y{^HKs`CZ6HHDtHZ#Mڡ`\i~$ʳTteL7E =VgC9stY#`3(o4D,|1)tEYj*M>V{C2N*>OiGE'Ф[E!ԭ:|,cckcQI2mu) y\ѿ0+C#c0|YRF MF}9'f""%lsYձf&q@FZݽnH}O"'1Le{g%-.9CΑm[M>}ZQ2i9@0я4~ۑDpC^,RbM2rL}%B^l{BXDAO()k? 6M0y(C@h:w&Q`Ѡ4;^DŽOX@na,w4dx_mH&P2ݐũM`%^ZJ4c:ЮQw9F,\ ;ƥ*>ĵf+tȕ료;ir>S^Tꄗ1t KL/`Tsna4SưbF* -Z4<PzcVoa6oRI6o8rʓ$,KX>//ۿƝ.FSaȗG!v雪KխϿ|Q"o"lsրYߏiOs_4R,(( JB7{{v&_.ߣ*( 3 Uz`"{zsL(::ЪHr]٥7 IG*F|,!_#zDE<8iU+P'zlo1(~^Y]g3nʞc2i'j -"zWN\?zkGʮr_p00v/Qc`56BSO7tC@9#(g {^S"<7AnJ"ډ@Hzs#˹d/i(/emUԱTVD˧ #Y6">󳋙8ZbA7Aoaj~ijX߭tߩVqAN)*v#X*Iޔ- ю #z]]veO$ `ijƱ)uUg5[|6Tq=.G'JxW2DĿ2~ kؑ03=޿83AV߳EVTHGj tF} -a HX/QXh^=y,wjC91!v@ Kd`FleXM(?uG%כ`.Ez9s( Csn7>~78w%s;sp/(:v ?%9ӛێRom -=Y\ BQH [|ŸøL5o7øȭC.|&[2#ڈQ>%q[mà_:{z4d!ς 6[&BMMKMqFZgX#SzU87-׊KY 2up'j.vlUEDKPoN|OJ4n76Aq#T%MMNF!ݣt@>ujgad|ڵVk |1}Rk+vלJ|.R4oGwQ[u<> >֢]WhdYe*h9]1O*HRrɉ(<<% 5k崟xJEM00sX [H>`TwSho&^rgOc39iEO<h!j̨\&Ӊ@|jʀ߾Vȍl"CXQJ?(x{o -n~8R-+Ś~5t=["Itl  =gWڠw}OiZ~`/n MAmXE9bZ|* Q kHɪ<ȡ0SDgsb3Tzw|UL ҶL>0:M|aqd;[g2?Dd_Q Sn#N]t 4a_=8h=$_p!S_b}([LzHq'UEpR "`״6qJe2Kn'"ɲ -K 8-9U+8k`3|fddˎE~„uMQ0=h2Qd(gN1ÆZTJ%SJQ1Bʌ]O'עcz*o8n8i:|6[BBZODcdZԒ *ס5qR^}Ғ!NeޝsKrwor|G9GZJo.x؅:sZMDURf})KQ3]pmIPwĄ0j5eb4> }VGWhpe*[Ecpw… I_u֛+zoDwF2ZdGt7K%ojYV!nMXs1@8R)v .ܭmdHrD-י_sВ ?|$\ç5mՖ)Ó4>I|BiZK\"Y[Ǩ(Lr?. vw kp҃uGjwFC^:;?|5v9@L20'K -u -7-@a"k%Bls XT6祱 3~0IDozfADpo,f+=)is}5vp?][8dV ̈́Y<itB)CU ZSmǩy\-3_g6FxB餻à]F(MN &,ʦvNݡ;ϽsE/ȡYUy;%SHs[^g$+ 휮_Դ,WU5[#lo+d_Pp#(b0+X5 4Q5s]V҂7,?x`}LQ -M=,:0}ēW8AC} ٷ٥Pk[ӻPe ="p"<7e#CXz%oh44~ HqwJis\:Dwg̶7ˈ;gL_I,%Ȇ@+ʿ4qZ沐?QqO+G@k!s+t)tZ܍hKԈWK~hjccJZ+~0_,2<Bdir1a|QUWç_/7u%.}f%Ł7Oi7"P ,l|@:_goEKբ2G#`^V^, e-Ng "p@U(ُY^ -4e:_4pD^Q2 [ŵ)\8x 6Z*"JMjl#?^ w>=rWì9V+C}f^w˧2bw>[Յ(\I<%v-5SLDPݻy,*8N2wR7<҇A%2< V,❏$rc=U!UpF9%VnC~zR;M&alw42; \p)O)P co(n)DR|ŌE}a\Lj,[f{at>)ta2j`9k9j*,1+|BX 57A0yl.I6f.m[ -}[У1HzVAw~V؋~ն-> dݠW96Q̱N§F6fAZ)W/82'%O. MT*Yt" w ˹-:{z\sM]DT(]j)]1GǎP妹J 5nw xy,r~m/^P`W4B"1/LN Y$<8Qd* Oĉ$e[T̼(^KCKA:bQ 5:m^ b~JWtє DMy]QŔ95=bz M*\q#s"'VϳfrupNoN:( K2)`I0HBˣhaexLJN'tWWke -/GM0˛vRz$~EGEHCӄYSc[VT5—q <  rҵ pT+BoI P4oWa,j Xg~' -4{A6\Rū+qW">n Wds ;| Keb/;tKGCl`k7*!V_;f5ݛ&b^=2reFaIE"2[&e|CC+TRƑOMׇ2KvFO 3خaW2*]__kb]AIh$ފj{GtWݜzfDLBғ-o"T -ֵzG{⓿L9m#015CK\4UY ƳRצȋ%ΏL]oRu wJ'yǃnw:2z85!I+eF77ûR/A(؂?வSuɮw֮\khU]g6%>do .:SF6,?ԉ4iE/E{ݴñ3cakQ6 <"->\#v-:MR>_ "g'5V|cV亲|U,?^ۗ0)$:UEX:o0lN,ҢV>s›]*#%?[&rpL|F A,c.EM!0+K*Py:"99 !>ͦ#ZZBdPBvH&X@H -MN3"|4cZu.0>] i hϔ(̏"]jToBUխf#TA O\֧8<>߰hc3~߁xIJnH ;8S=$E)5`Xha@6ҫƤ%oMATm2!E;SdV1s>g"uXIU -BK&hlR|j;ݠf9"ΕMTTZ*,c"p5†]c -q]bdS!C%d"Bɲ0(sсS2YP};(T|S?5.jA_477`ͩy;BB0,L6kqCY4%eг!lFº[:) n>!_5,^ -dy-Ղg0(6;iFR\Z8 *&L.߈wYO މtؚd -qKJٺV]3m0FcR%2H_R=ZɌD?~s6V` NGw'"C7WppC0;ܔq\_4!MPr&#֫}Wd4VJ򵱚X״ؔ +笤Z{]' q!Q?wlJ'@͟4^`+WU)L751*I_zArtL_#sOFp1a ,朦f})*D-v |ǃ ~2DA -gK/A뽫"B~ ՟2 j[7MljݭNx*wk/]UFGa칲@#D֕ɭ̴SU;j&*gk4T|N V'Z#V=ྰ4NF2&eTUd ӰҖ:WSC8,;Y?&iU,p2nƭQgF)i^㹎'l٣pYŸ,`J̰o.D]<[5"bOt2D!goQaȊs1ǔ{eN%M8Zrϥ)/\O/c<}) ~=gncҋ-NOTux fg+}.QD̝ .T;YBӾVXUōy{ft.^@-qy|Fo>~5WTf6~fWI@P]M}`/Cp8ˬG~cP˜0 efq{JR΀=>^Fx(Nk%*眮XtN>W3J_+Ur,~@m -AOyVk\F~=&^ )%s59jg:ɋ+K52硳MMrVQzaaF|sng -dqjG ״|C`0;Y -A;"ӪC%DsiQ_3vSgʼnc_Nj{v yYl,vA&̓k׈Y~Z]ZJ>\cTVhB -o':뎨!u߳Q~>L|%X"7Ka$9y5(軀@9[To]\3mԐh~$ =peMz=RbcbIלh'EKxDg7"T8t#SHB;ZʂAwUo>C0ج2cѬ|мw ٠Y Oxu3q5Lأ[IkJR͙ y,'}AQ^#6[֦s"6a.?v|Me;LW;0gv<s_VBChO4Ѝ]#W" 3jR^i)vlA#ZiP`*_o*[l,TkDžJӺEnM8ez *de7PMc]Y֞Q Ac H -FnǤ0r{'ߎ6r#ga -iW3g w*к?a\K<:ܪ/`8jBUS1:ht@=]0Zu>Б s$9_qƀᔉG%T -&S%[XիH*=.J"t -Pnm`rM-\*}(ޥ2O4se Y97-veq௾z& U8D32;WK1!c50IED$K8| - -?b +~a$ -n""R{"Ha^![LÔ ߏ'闄'dް2_̐{,̽ G `-Sr )FJwG eY.Zx7YйtWGAbѪVdßcz#~R(S0ssdnh8 fi bjjB+ 5|KWSjZ뢟~V !ZSiڳLtb&Gl2Iwxn% -$1D<-F/˿W,a~_s\6rZ玭P=uDI`]8L֙'+ G+MpJp<gӓ/Erjz &d]ҥײ*G׾eQ7TfrsoDp^)\ϱlΑ0,vbYT !̑Ybi0? Ya-/&D(ٙxWjJؒnBtJ#ntwbƼ}YSК{mUU}%8IUê7{VB"2`fz-Jcx`=™ޥ`LrnN 4a$g|o%icA=y_HI"Ƹ/_۬H%|>5YVMs?(@kj h^O̧pG&ԸDc~̧D4(  !_fMMv/Kz, GkȔ\Jbͦ\Ѽ^p@*eR3(JyVeBs!: 컾 e.0]?9T܈v\l#Z.l16_ EXTUr&IF)i,3ƅ.t -  uL6f 8v*1N<8+{U%胩ZF!K6O0?\,GU臏\g?=vy&~{O1.,/-ʺh> endobj -721 0 obj << -/Length1 1647 -/Length2 11596 -/Length3 0 -/Length 12440 -/Filter /FlateDecode ->> -stream -xڭveX]ے-]Kpwo\6. %hpwwwC`sn߾OַfYY{S)19]ؘYVv&Ϊv|L@ Wc[ƅ@E%4vr0vf )LJ@wy:YYXh5Tek ȇ= hڻ|PՀ@%`ne +)(Jh5@{Gʮ&Vy+S3```ofWi\c3hj0 7`dlq.+{S[W;cAldr|DUG..v;L]*ou1w=\eY9l=?bN_0Nf@gN_uK \l1M]>b[X#/26\A܀N_=C' h@?SOW_O\Rv 94Y5ll +sZd#ŇBLl\\0[9KYy͔\L-ƶ] dkepbe7L/5ERRZJ]ῙoV -uOsq?#;#DlZ+8YyXYY>Z}7I{SHl@aeT :=+å7gp\B r0TҠ^PWaR8pzݗ?ƱJ^RoP0 gjx_oArj쌫Os8]>P`QރPL5aR=~躆'dO%LPXW;SAG\ *IgOzS9mA6IAWH -<7xzRbEqMw:}NAumڭfNߔpf.7^QJ́ʂLk^S^db6)BR?< "OҭI SwڇY%Qk$dÝ˔95.]P„BOu5DZ_$z^/a &QgB儤5^auM*ՐD:wi!(vz0^O)m^Y.%l/GmNw3ar`~+`b\<,]PG ' p!RDNOp[jyQ˨kP 9lv :۞iZO}sRwW"YR^~wHqg.=ag !zgpTBi Ö;#Mvf$H11,ML,ڤ=TWYɆLzn -}hN>"W&u~DCr_5K<$$W焣/;Qg_n7 - /I"ҽOs |VkY&Sş%M9A_[.W tϾجx3ꠂ̽̄nR"7m@W `vylom4tߘ*ЪlX;c뿱֜kg| H{.T}שּׁ!x\oY4tS29Š80Nts\F&ڒ.l!eU\ *F@m^}fC#Q ׉7E+Ǖ=Ē3.߽9GA77c8*ҏ?1,UqLy7?1ZЗ]yȂT7M.Ec(P ${Eʐ.ccD QT^Ϗg4K Ú$=!$Yɤ[ PIfxC򪥻s7$&$^Jݸޓ}|{Ύ/X嵤*Tqe#Α^8 ❇RƟto{_uT"L`ӶP ͸eIF> 6|D)y ?BD,ݭ>0aMt߭SrNKBTbH _L?ZYH|P9fXX4 BTƐn6%Q|"ϟϴ]T2ˤ(W<{ DinZn<5Ǥ?Z 0㮺[@ldjzq?DrʜFND ~JrQu_<|~s7bݒٵRchwJNXgAd&W-M4LU[ {J)yROU䅭%48ymAq@TaxsTzš1.'&&yC$/}qix5-@߫HI'6 :QPϟgo3 (ȔL-bd -a`cÒ7\ָ%1퍧>H| -|HBJͻ -#H$_)2H-ZqJ80c'8jiK8݁Ց,~,bn;i( o0xŦi "tҨڃp aC {~icJJAsH,Qҡr4L[=~Ղ :@7ã]UkͪG:_cE!BT,[=q_uV[+%荒YVawamŒWv -<ŀWC5e4,q8_@/yMw]jO?᳛D-;xMZ -vSC)4ڳ'Ɗvv+zg҇f<-IQНkkFإ~%'Pco#3$BcViX%QxޮD|׏r t0Aof489+5U^,_l*\`Ep; w-ɏVvfMxbm h){#N팊't,Mk4 ~܎FcpR[^~181cu;ss}wi[u#'d?X/ԆRS3 p -BQ̑ -<)awȼ^ ;FIG9*)2nyubKo6ĸ;QsY<9)D}cdg䩔B=nSΧR]>߭-H@XGxYVN;MZsi愄%r8A'3` q&8t^Dt׶o &F/S+1%GP}0<^x>9 z<ѓs )[0H޻:zTɻB6'\6m޺&c$jO-&!Qnd|QZ#S $waÏlz*(P7"M=(M(<ߥ9 jֹ ;F\ߴy\x ZiY^Wplcܨk 1V=jۖ&Q͟&֡<u `enj>i-ZӾ?bfP"V/ N@DsmLz4)9Ñl&]8V~JBz*rNh}7ś}f6{#Fؤ:z~0MKŁp=Ml2-DPk  Wn.*x/`F%l-Ld&"Ac "Îou%#[cqBex)QlNM)%">|y{Q}uLV򖶸^ [,Mm(]ot-sa+`l4eNɢQLt<++bBך_0+~oˊ@u3OWBH&y&Hn57VdԍVՃYQ\ݴ2 &/wηe -f]ym̉^G j^! -\՞zS/:m2sg~]Dx (rVf1OdPyOa3B<=<}nhMG-6Ip2AzTe;KjGOPBғv滏1tZ] 'u)vewW-7 l{jۀ~_]5ꂇ_h!FfG+M#F)@:=̹a {-ig%|BzP˶TP=׊&Z3TGTS,I YNLbv" xd[@a@=>7`Cu6Ϥj4sIzsLd~:@%/.59s9`:Q4%!Wݒɏ P\!D;Aʈ +2x& E,;{&!?&!3y${VTLYuo8"j@a֭!|>y/%WoycHϦs9(uș=>gKӯvЯSH8ar$O5zT.]8_ /D#H89T2՚$iI3./Ev ?L&+U``D0b2`Ik;s%u8/r(؇`RGGAQꬓXZ":q,Mj~$]h4Jz\Nlm =!ɟ>S<Ӳ+7pkJJڶY:j^]kaGAy;iecv&Ml* vɯ]gDu<7OÒ -h G\N1Pk|ڦs9Mm&`9[S$16]'U\?N7sPFwC@}H˭g;0W9Q bL@NVF?rVo_X(ڳ1Յu $%núN.v_BucO`qFЊKlVZ;Nɑ3IOkv YjHp.Ќ^`˭L IrqT#mZviً]8k{e m -_z7;.A]&v%Ja-('OqʸO6g:Q1S0V{;B!HS' -MLpu³ m]*bDT>x}M˺BNp=0ZExChYI"2-Hh$ #(jVUgV<ˌM;.Д -c%=TȊuج&cD= \ܪIL ph4Lz`tud Fi^4 h fSF`\>%Q%gumڞ'dU&9%\H.6u؃Ph9y4ERL]){8 ɇj얹0u[Qq)Q/MdЂ\9 Hk-Kqnh*Ɲ=u8 -J۟oSV*+5{MAZݥN.!镴Mk>dL!V(֫](-'_4sV!oĮ==`MTRQ~eP*>yqPq%/ -#UE>-r7V(3{ -3s3nxs#۱q'%yT䶙~?.\yEklUS Ӑ1}f>3vl -oa^l/Zzpuٜ~PPQM -/N(=|L2gHثrOdc̑ex|KVkr!Efq)m)Fql]oTCŧ 3vHcI?ϗP;e%(-RL8 ۀH{ cLV#r(邦%GuUvON·׭+mK }8 ->|;C}UCwQdꕝy2TP;jX>7g?If)pd!4*nR›|{آJNRnCsPyD@W:o[ҥ7g9ּF|nY^M{U4lEH[jNRiW/ -%B"i}vTNv`oE"jp᷐-bvmg]~NA8M]ˡỶP taG^?=R"d1C}AfN+~(?@ih")Av6܎IfG$O. -/kGNJ]L[I/q^`!0sp&}250D;}ﳇeɋacViư{ ;"O&FHEOƒq1^ɫcbc3ꡐ$/ -q;4Z$ -6K$TQ1G1 yl \8D7nр̉BAz(]G6C׽,wJxFj5"|5xt-c> -ꧏidн"Dat5ÂX -/uKVg`>L`}Y#pϭ6w)P&}( G 6/Y.[oN2 F])u8%ɰQԃdvjt7?ĝpnp2%deRˍ̸q;=Dm 3Ɵ ?iwZC,"+]2_]^Nv9e(#>L(ӕd.VVq戶R./GzQboaHmC;g<:{̢:RQ*i!WIhV_rX@wn졶!M5Po<ץ;&qB'XsC/w4n[lˡ?' -7'zXciT:dF R]V+F^#Lb9"z,Gn`x̯-⒰ӞeϹrmE˄0^|%Ɨl0A+x}8*YM1#U`+h8bEnH  aUmԬ TjdJJ<]eXAdml, -}.4EuH9=JG,iNJ9js:EH;ܛ7, -BU3Vy|͆qxàވȒj6:ؤmW|Z&;Q Lڊc-mʥs>k-P 4FkdW)ZtmjO+]hg뛓Afw*}w lwځΨY9cYOHٚ΂ԔhSbd~(}/"5ax9H~~@ NFYS8iZ לP}r}ùW{;]14:s?Rߩ5 MXs>NNPUcIV'#m+㟫!ξB[T9@{Pπu6 w2>=UxuXWW R#SusDp2| ߩ{;C_Wܻ49춮nTǵ^,ƭz, z^CH:m8z ΞsmD^ҊsNĞp"aԽ}]9n#,ZmNKW]ʲ|YgIy`I{4\sw7h"3IYNӞQщ̄7$m^Oi7Sx;OmgrE:i'>I7꽟Oux,zI)R42nYO^ ?b-Ӛ/kk8]^DFend˒c8&PWf Gné+wpX{|q5s= r6O`;9.6/q: o[_s'(ͨ7LwT*Zt$/CjegHꏔJIM8i. n]Rˌ~oY]T.>ݒ5^(B~( ,,bJ tI<;8$udJ$c@Ё/M6C/gf:?0 so -*&82bFcPt 30W$}2 -vi:F $[wBDg$0$: C WF"lZcBKzh` :1XOw{jʲL|MKƯ5~Fg(3>Tq+dAA/C0OEA86ųd:kVԧ^%3H/Jn_/WI-YYcP\Ojr4}cYJVe7N~Qlf#G\Twʫp4]dWJ~r<ʼnUWsW$d^$ q m*}^s` (SFikyַbezH<43?\sIN8`x媾L~{Yd`e5d1^zX66eQ "~BJŗ{qXgpz&ҬӼV_),GQbGtSԦ&,φ (\T޵mn^@}-Tr_ Ҝ $N|0W_F2TK)a3s{PQH<0Jc }!6dܰ L/Qv\)n4ǒ `갨̞ - -c)'GY!8RI02/>o7wꗘiwmp[kZ=uĵ  p֖->y.iDx3-D`Z>2|mӭ!,_PQH,Q/:RDFDBm?Hj6GM2g ǾIbrf"KmSiD񕜻W^OsC _O7Ď>x&H!tf"yQNeFB*lOX:.LO?A}:];v?1㲦Q|Y]P-vZnXpB?Vw >g7ß qC 7GI^V$ ăl}iT8)srވG2ۉ6ٖn߅ hp -6ݮcsm>|֎L ]z'R8& Mq̆q.[W'/WZת]ˤ}qۡSaGK'an4Xb8a_#0;c̈jy&5IEBVqh(/ r-s^bB;b}Aj2)Is Gi;6?vhdQ`^>ruffL" 5%l/tL҄ ^b -:?Ķ; -endstream -endobj -722 0 obj << -/Type /FontDescriptor -/FontName /EEGFTS+NimbusRomNo9L-ReguItal -/Flags 4 -/FontBBox [-169 -270 1010 924] -/Ascent 668 -/CapHeight 668 -/Descent -193 -/ItalicAngle -15 -/StemV 78 -/XHeight 441 -/CharSet (/C/E/F/G/I/S/a/b/c/comma/d/e/eight/f/fi/g/h/hyphen/i/k/l/m/n/o/p/parenleft/parenright/period/r/s/t/three/two/u/v/w/x/y/z) -/FontFile 721 0 R ->> endobj -671 0 obj << -/Type /Encoding -/Differences [2/fi/fl 33/exclam/quotedbl/numbersign 39/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon 61/equal 65/A/B/C/D/E/F/G/H/I/J 76/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y 91/bracketleft 93/bracketright 95/underscore 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft 125/braceright 149/bullet 169/copyright 174/registered] ->> endobj -317 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /YQJSDJ+CMEX10 -/FontDescriptor 690 0 R -/FirstChar 88 -/LastChar 88 -/Widths 676 0 R ->> endobj -313 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /CVGKQU+CMMI10 -/FontDescriptor 692 0 R -/FirstChar 62 -/LastChar 120 -/Widths 680 0 R ->> endobj -316 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /EFXCJE+CMMI7 -/FontDescriptor 694 0 R -/FirstChar 59 -/LastChar 107 -/Widths 677 0 R ->> endobj -315 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /JVDJDJ+CMR10 -/FontDescriptor 696 0 R -/FirstChar 43 -/LastChar 61 -/Widths 678 0 R ->> endobj -314 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /XLWYJF+CMR7 -/FontDescriptor 698 0 R -/FirstChar 49 -/LastChar 61 -/Widths 679 0 R ->> endobj -318 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /EMXNQD+CMSY10 -/FontDescriptor 700 0 R -/FirstChar 1 -/LastChar 106 -/Widths 675 0 R ->> endobj -499 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /DJYPXZ+CMSY6 -/FontDescriptor 702 0 R -/FirstChar 94 -/LastChar 94 -/Widths 673 0 R ->> endobj -312 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /LAJUWJ+CMSY7 -/FontDescriptor 704 0 R -/FirstChar 94 -/LastChar 94 -/Widths 681 0 R ->> endobj -239 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /YDPBQZ+NimbusMonL-Regu -/FontDescriptor 706 0 R -/FirstChar 34 -/LastChar 121 -/Widths 684 0 R -/Encoding 671 0 R ->> endobj -227 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /IPRZVI+NimbusSanL-Bold -/FontDescriptor 708 0 R -/FirstChar 40 -/LastChar 174 -/Widths 688 0 R -/Encoding 671 0 R ->> endobj -309 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /CIYFZS+NimbusSanL-BoldCond -/FontDescriptor 710 0 R -/FirstChar 40 -/LastChar 121 -/Widths 682 0 R -/Encoding 671 0 R ->> endobj -228 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /NYWZOF+NimbusSanL-BoldItal -/FontDescriptor 712 0 R -/FirstChar 44 -/LastChar 114 -/Widths 687 0 R -/Encoding 671 0 R ->> endobj -529 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /KFEQLI+NimbusSanL-BoldCondItal -/FontDescriptor 714 0 R -/FirstChar 44 -/LastChar 119 -/Widths 672 0 R -/Encoding 671 0 R ->> endobj -306 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /IXMTHF+NimbusSanL-Regu -/FontDescriptor 716 0 R -/FirstChar 49 -/LastChar 89 -/Widths 683 0 R -/Encoding 671 0 R ->> endobj -237 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /ZDVWXI+NimbusRomNo9L-Medi -/FontDescriptor 718 0 R -/FirstChar 46 -/LastChar 121 -/Widths 686 0 R -/Encoding 671 0 R ->> endobj -238 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /IPABSO+NimbusRomNo9L-Regu -/FontDescriptor 720 0 R -/FirstChar 2 -/LastChar 174 -/Widths 685 0 R -/Encoding 671 0 R ->> endobj -498 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /EEGFTS+NimbusRomNo9L-ReguItal -/FontDescriptor 722 0 R -/FirstChar 2 -/LastChar 122 -/Widths 674 0 R -/Encoding 671 0 R ->> endobj -229 0 obj << -/Type /Pages -/Count 6 -/Parent 723 0 R -/Kids [222 0 R 235 0 R 274 0 R 298 0 R 303 0 R 323 0 R] ->> endobj -364 0 obj << -/Type /Pages -/Count 6 -/Parent 723 0 R -/Kids [358 0 R 366 0 R 432 0 R 460 0 R 475 0 R 494 0 R] ->> endobj -519 0 obj << -/Type /Pages -/Count 6 -/Parent 723 0 R -/Kids [516 0 R 526 0 R 538 0 R 545 0 R 553 0 R 559 0 R] ->> endobj -572 0 obj << -/Type /Pages -/Count 6 -/Parent 723 0 R -/Kids [567 0 R 576 0 R 582 0 R 590 0 R 598 0 R 604 0 R] ->> endobj -616 0 obj << -/Type /Pages -/Count 6 -/Parent 723 0 R -/Kids [611 0 R 618 0 R 626 0 R 633 0 R 641 0 R 651 0 R] ->> endobj -663 0 obj << -/Type /Pages -/Count 2 -/Parent 723 0 R -/Kids [658 0 R 666 0 R] ->> endobj -723 0 obj << -/Type /Pages -/Count 32 -/Kids [229 0 R 364 0 R 519 0 R 572 0 R 616 0 R 663 0 R] ->> endobj -724 0 obj << -/Type /Outlines -/First 7 0 R -/Last 51 0 R -/Count 5 ->> endobj -219 0 obj << -/Title 220 0 R -/A 217 0 R -/Parent 215 0 R ->> endobj -215 0 obj << -/Title 216 0 R -/A 213 0 R -/Parent 51 0 R -/Prev 183 0 R -/First 219 0 R -/Last 219 0 R -/Count -1 ->> endobj -211 0 obj << -/Title 212 0 R -/A 209 0 R -/Parent 191 0 R -/Prev 207 0 R ->> endobj -207 0 obj << -/Title 208 0 R -/A 205 0 R -/Parent 191 0 R -/Prev 203 0 R -/Next 211 0 R ->> endobj -203 0 obj << -/Title 204 0 R -/A 201 0 R -/Parent 191 0 R -/Prev 199 0 R -/Next 207 0 R ->> endobj -199 0 obj << -/Title 200 0 R -/A 197 0 R -/Parent 191 0 R -/Prev 195 0 R -/Next 203 0 R ->> endobj -195 0 obj << -/Title 196 0 R -/A 193 0 R -/Parent 191 0 R -/Next 199 0 R ->> endobj -191 0 obj << -/Title 192 0 R -/A 189 0 R -/Parent 183 0 R -/Prev 187 0 R -/First 195 0 R -/Last 211 0 R -/Count -5 ->> endobj -187 0 obj << -/Title 188 0 R -/A 185 0 R -/Parent 183 0 R -/Next 191 0 R ->> endobj -183 0 obj << -/Title 184 0 R -/A 181 0 R -/Parent 51 0 R -/Prev 55 0 R -/Next 215 0 R -/First 187 0 R -/Last 191 0 R -/Count -2 ->> endobj -179 0 obj << -/Title 180 0 R -/A 177 0 R -/Parent 63 0 R -/Prev 175 0 R ->> endobj -175 0 obj << -/Title 176 0 R -/A 173 0 R -/Parent 63 0 R -/Prev 171 0 R -/Next 179 0 R ->> endobj -171 0 obj << -/Title 172 0 R -/A 169 0 R -/Parent 63 0 R -/Prev 167 0 R -/Next 175 0 R ->> endobj -167 0 obj << -/Title 168 0 R -/A 165 0 R -/Parent 63 0 R -/Prev 163 0 R -/Next 171 0 R ->> endobj -163 0 obj << -/Title 164 0 R -/A 161 0 R -/Parent 63 0 R -/Prev 159 0 R -/Next 167 0 R ->> endobj -159 0 obj << -/Title 160 0 R -/A 157 0 R -/Parent 63 0 R -/Prev 155 0 R -/Next 163 0 R ->> endobj -155 0 obj << -/Title 156 0 R -/A 153 0 R -/Parent 63 0 R -/Prev 151 0 R -/Next 159 0 R ->> endobj -151 0 obj << -/Title 152 0 R -/A 149 0 R -/Parent 63 0 R -/Prev 147 0 R -/Next 155 0 R ->> endobj -147 0 obj << -/Title 148 0 R -/A 145 0 R -/Parent 63 0 R -/Prev 143 0 R -/Next 151 0 R ->> endobj -143 0 obj << -/Title 144 0 R -/A 141 0 R -/Parent 63 0 R -/Prev 139 0 R -/Next 147 0 R ->> endobj -139 0 obj << -/Title 140 0 R -/A 137 0 R -/Parent 63 0 R -/Prev 135 0 R -/Next 143 0 R ->> endobj -135 0 obj << -/Title 136 0 R -/A 133 0 R -/Parent 63 0 R -/Prev 131 0 R -/Next 139 0 R ->> endobj -131 0 obj << -/Title 132 0 R -/A 129 0 R -/Parent 63 0 R -/Prev 127 0 R -/Next 135 0 R ->> endobj -127 0 obj << -/Title 128 0 R -/A 125 0 R -/Parent 63 0 R -/Prev 123 0 R -/Next 131 0 R ->> endobj -123 0 obj << -/Title 124 0 R -/A 121 0 R -/Parent 63 0 R -/Prev 119 0 R -/Next 127 0 R ->> endobj -119 0 obj << -/Title 120 0 R -/A 117 0 R -/Parent 63 0 R -/Prev 115 0 R -/Next 123 0 R ->> endobj -115 0 obj << -/Title 116 0 R -/A 113 0 R -/Parent 63 0 R -/Prev 111 0 R -/Next 119 0 R ->> endobj -111 0 obj << -/Title 112 0 R -/A 109 0 R -/Parent 63 0 R -/Prev 107 0 R -/Next 115 0 R ->> endobj -107 0 obj << -/Title 108 0 R -/A 105 0 R -/Parent 63 0 R -/Prev 103 0 R -/Next 111 0 R ->> endobj -103 0 obj << -/Title 104 0 R -/A 101 0 R -/Parent 63 0 R -/Prev 99 0 R -/Next 107 0 R ->> endobj -99 0 obj << -/Title 100 0 R -/A 97 0 R -/Parent 63 0 R -/Prev 95 0 R -/Next 103 0 R ->> endobj -95 0 obj << -/Title 96 0 R -/A 93 0 R -/Parent 63 0 R -/Prev 91 0 R -/Next 99 0 R ->> endobj -91 0 obj << -/Title 92 0 R -/A 89 0 R -/Parent 63 0 R -/Prev 87 0 R -/Next 95 0 R ->> endobj -87 0 obj << -/Title 88 0 R -/A 85 0 R -/Parent 63 0 R -/Prev 83 0 R -/Next 91 0 R ->> endobj -83 0 obj << -/Title 84 0 R -/A 81 0 R -/Parent 63 0 R -/Prev 79 0 R -/Next 87 0 R ->> endobj -79 0 obj << -/Title 80 0 R -/A 77 0 R -/Parent 63 0 R -/Prev 75 0 R -/Next 83 0 R ->> endobj -75 0 obj << -/Title 76 0 R -/A 73 0 R -/Parent 63 0 R -/Prev 71 0 R -/Next 79 0 R ->> endobj -71 0 obj << -/Title 72 0 R -/A 69 0 R -/Parent 63 0 R -/Prev 67 0 R -/Next 75 0 R ->> endobj -67 0 obj << -/Title 68 0 R -/A 65 0 R -/Parent 63 0 R -/Next 71 0 R ->> endobj -63 0 obj << -/Title 64 0 R -/A 61 0 R -/Parent 55 0 R -/Prev 59 0 R -/First 67 0 R -/Last 179 0 R -/Count -29 ->> endobj -59 0 obj << -/Title 60 0 R -/A 57 0 R -/Parent 55 0 R -/Next 63 0 R ->> endobj -55 0 obj << -/Title 56 0 R -/A 53 0 R -/Parent 51 0 R -/Next 183 0 R -/First 59 0 R -/Last 63 0 R -/Count -2 ->> endobj -51 0 obj << -/Title 52 0 R -/A 49 0 R -/Parent 724 0 R -/Prev 43 0 R -/First 55 0 R -/Last 215 0 R -/Count -3 ->> endobj -47 0 obj << -/Title 48 0 R -/A 45 0 R -/Parent 43 0 R ->> endobj -43 0 obj << -/Title 44 0 R -/A 41 0 R -/Parent 724 0 R -/Prev 39 0 R -/Next 51 0 R -/First 47 0 R -/Last 47 0 R -/Count -1 ->> endobj -39 0 obj << -/Title 40 0 R -/A 37 0 R -/Parent 724 0 R -/Prev 27 0 R -/Next 43 0 R ->> endobj -35 0 obj << -/Title 36 0 R -/A 33 0 R -/Parent 27 0 R -/Prev 31 0 R ->> endobj -31 0 obj << -/Title 32 0 R -/A 29 0 R -/Parent 27 0 R -/Next 35 0 R ->> endobj -27 0 obj << -/Title 28 0 R -/A 25 0 R -/Parent 724 0 R -/Prev 7 0 R -/Next 39 0 R -/First 31 0 R -/Last 35 0 R -/Count -2 ->> endobj -23 0 obj << -/Title 24 0 R -/A 21 0 R -/Parent 7 0 R -/Prev 19 0 R ->> endobj -19 0 obj << -/Title 20 0 R -/A 17 0 R -/Parent 7 0 R -/Prev 15 0 R -/Next 23 0 R ->> endobj -15 0 obj << -/Title 16 0 R -/A 13 0 R -/Parent 7 0 R -/Prev 11 0 R -/Next 19 0 R ->> endobj -11 0 obj << -/Title 12 0 R -/A 9 0 R -/Parent 7 0 R -/Next 15 0 R ->> endobj -7 0 obj << -/Title 8 0 R -/A 5 0 R -/Parent 724 0 R -/Next 27 0 R -/First 11 0 R -/Last 23 0 R -/Count -4 ->> endobj -725 0 obj << -/Names [(Doc-Start) 226 0 R (chapter.1) 6 0 R (chapter.2) 26 0 R (chapter.3) 38 0 R (chapter.4) 42 0 R (chapter.5) 50 0 R] -/Limits [(Doc-Start) (chapter.5)] ->> endobj -726 0 obj << -/Names [(erasure__code_8h) 478 0 R (erasure__code_8h_a06a563b718c6269c8df0fe7647e5bb49) 379 0 R (erasure__code_8h_a12f59be6d348fea6ad2464a20af22fd3) 380 0 R (erasure__code_8h_a17799d49d9b83861322ebf314a55f77f) 386 0 R (erasure__code_8h_a17c6ccf6470796b756841e160dc8697c) 374 0 R (erasure__code_8h_a1fb1d6d463ac00ae196501c75d2036d2) 388 0 R] -/Limits [(erasure__code_8h) (erasure__code_8h_a1fb1d6d463ac00ae196501c75d2036d2)] ->> endobj -727 0 obj << -/Names [(erasure__code_8h_a1ff835062a19d6516f2d59d9c37ddb48) 372 0 R (erasure__code_8h_a21d5e25b4ac64062996149fea71aede8) 382 0 R (erasure__code_8h_a22b53cd4103da9ed88c351e7045ff313) 381 0 R (erasure__code_8h_a2688b38c18e93c95c525c0d5bf9e221a) 393 0 R (erasure__code_8h_a26c2200ad3bf04b1c858eb239b7ff940) 376 0 R (erasure__code_8h_a2fb7662ba4e1df4bb72659c57efeaad6) 394 0 R] -/Limits [(erasure__code_8h_a1ff835062a19d6516f2d59d9c37ddb48) (erasure__code_8h_a2fb7662ba4e1df4bb72659c57efeaad6)] ->> endobj -728 0 obj << -/Names [(erasure__code_8h_a484460566a8c888fda3d769324461345) 521 0 R (erasure__code_8h_a4f880c4b9fe6700e040b9f4ef4e45918) 373 0 R (erasure__code_8h_a590b5c35075aeea1243a9e4ef73a49d4) 320 0 R (erasure__code_8h_a6ce05684e168d73773847a3c2c13c175) 387 0 R (erasure__code_8h_a81be18ea979e8a32f384e1a7856badcf) 531 0 R (erasure__code_8h_aa486278c409735df8001096ac2b487dd) 384 0 R] -/Limits [(erasure__code_8h_a484460566a8c888fda3d769324461345) (erasure__code_8h_aa486278c409735df8001096ac2b487dd)] ->> endobj -729 0 obj << -/Names [(erasure__code_8h_aacd489f45babdbfe6a41f1bac2885ab6) 389 0 R (erasure__code_8h_abb7a991b4c0fb9ced373680ef36bae08) 375 0 R (erasure__code_8h_ac64153e1aef3cdc4b69d375ec762fa33) 392 0 R (erasure__code_8h_ac6468d7eb3c28116439abb4a7c5eca05) 396 0 R (erasure__code_8h_ac73ea8358bc3155c7f3a6c078a7d6d35) 520 0 R (erasure__code_8h_ad0eca329291d751df6ffb3aa3eb83610) 390 0 R] -/Limits [(erasure__code_8h_aacd489f45babdbfe6a41f1bac2885ab6) (erasure__code_8h_ad0eca329291d751df6ffb3aa3eb83610)] ->> endobj -730 0 obj << -/Names [(erasure__code_8h_ad808efb2e8af3803571c0a6c7c9faf39) 533 0 R (erasure__code_8h_ae1e4c9eb9a26a3a7852166d54d2a27f8) 377 0 R (erasure__code_8h_af88a7da05f46e1a0fe17d032a2cf78bf) 378 0 R (erasure__code_8h_af88c501e0c5138ec9c88f58c182945e8) 395 0 R (erasure__code_8h_afd549f435ee28276b5a9408a3a6256b1) 532 0 R (erasure__code_8h_afeefb3612c92a0bc87182f6e11030b11) 391 0 R] -/Limits [(erasure__code_8h_ad808efb2e8af3803571c0a6c7c9faf39) (erasure__code_8h_afeefb3612c92a0bc87182f6e11030b11)] ->> endobj -731 0 obj << -/Names [(gf__vect__mul_8h) 479 0 R (gf__vect__mul_8h_a15d42d058c64dec106d9e3e9fc2e1136) 369 0 R (gf__vect__mul_8h_a7a1f65b032f03494dbc68411f5614bb1) 371 0 R (gf__vect__mul_8h_a84eb9ca31c934f05a8e3fa7a02fa71dc) 370 0 R (gf__vect__mul_8h_a8f3e57729c3382514325612c54e20eaa) 385 0 R (gf__vect__mul_8h_aa7a737b69a0a77dc29aa28d0f17421a1) 383 0 R] -/Limits [(gf__vect__mul_8h) (gf__vect__mul_8h_aa7a737b69a0a77dc29aa28d0f17421a1)] ->> endobj -732 0 obj << -/Names [(index) 307 0 R (index_about_sec) 308 0 R (index_ec_sec) 311 0 R (index_intro_sec) 310 0 R (index_sys_reg_sec) 319 0 R (page.1) 305 0 R] -/Limits [(index) (page.1)] ->> endobj -733 0 obj << -/Names [(page.10) 528 0 R (page.11) 540 0 R (page.12) 547 0 R (page.13) 555 0 R (page.14) 561 0 R (page.15) 569 0 R] -/Limits [(page.10) (page.15)] ->> endobj -734 0 obj << -/Names [(page.16) 578 0 R (page.17) 584 0 R (page.18) 592 0 R (page.19) 600 0 R (page.2) 325 0 R (page.20) 606 0 R] -/Limits [(page.16) (page.20)] ->> endobj -735 0 obj << -/Names [(page.21) 613 0 R (page.22) 620 0 R (page.23) 628 0 R (page.24) 635 0 R (page.25) 643 0 R (page.26) 653 0 R] -/Limits [(page.21) (page.26)] ->> endobj -736 0 obj << -/Names [(page.27) 660 0 R (page.28) 668 0 R (page.3) 360 0 R (page.4) 368 0 R (page.5) 434 0 R (page.6) 462 0 R] -/Limits [(page.27) (page.6)] ->> endobj -737 0 obj << -/Names [(page.7) 477 0 R (page.8) 496 0 R (page.9) 518 0 R (requires) 327 0 R (requires__requires000001) 435 0 R (requires__requires000002) 465 0 R] -/Limits [(page.7) (requires__requires000002)] ->> endobj -738 0 obj << -/Names [(requires__requires000003) 463 0 R (requires__requires000004) 464 0 R (requires__requires000005) 438 0 R (requires__requires000006) 436 0 R (requires__requires000007) 437 0 R (requires__requires000008) 441 0 R] -/Limits [(requires__requires000003) (requires__requires000008)] ->> endobj -739 0 obj << -/Names [(requires__requires000009) 439 0 R (requires__requires000010) 440 0 R (requires__requires000011) 444 0 R (requires__requires000012) 442 0 R (requires__requires000013) 443 0 R (requires__requires000014) 447 0 R] -/Limits [(requires__requires000009) (requires__requires000014)] ->> endobj -740 0 obj << -/Names [(requires__requires000015) 445 0 R (requires__requires000016) 446 0 R (requires__requires000017) 450 0 R (requires__requires000018) 448 0 R (requires__requires000019) 449 0 R (requires__requires000020) 467 0 R] -/Limits [(requires__requires000015) (requires__requires000020)] ->> endobj -741 0 obj << -/Names [(requires__requires000021) 466 0 R (section*.1) 497 0 R (section*.2) 654 0 R (section.1.1) 10 0 R (section.1.2) 14 0 R (section.1.3) 18 0 R] -/Limits [(requires__requires000021) (section.1.3)] ->> endobj -742 0 obj << -/Names [(section.1.4) 22 0 R (section.2.1) 30 0 R (section.2.2) 34 0 R (section.4.1) 46 0 R (section.5.1) 54 0 R (section.5.2) 182 0 R] -/Limits [(section.1.4) (section.5.2)] ->> endobj -743 0 obj << -/Names [(section.5.3) 214 0 R (subsection.5.1.1) 58 0 R (subsection.5.1.2) 62 0 R (subsection.5.2.1) 186 0 R (subsection.5.2.2) 190 0 R (subsection.5.3.1) 218 0 R] -/Limits [(section.5.3) (subsection.5.3.1)] ->> endobj -744 0 obj << -/Names [(subsubsection.5.1.2.1) 66 0 R (subsubsection.5.1.2.10) 102 0 R (subsubsection.5.1.2.11) 106 0 R (subsubsection.5.1.2.12) 110 0 R (subsubsection.5.1.2.13) 114 0 R (subsubsection.5.1.2.14) 118 0 R] -/Limits [(subsubsection.5.1.2.1) (subsubsection.5.1.2.14)] ->> endobj -745 0 obj << -/Names [(subsubsection.5.1.2.15) 122 0 R (subsubsection.5.1.2.16) 126 0 R (subsubsection.5.1.2.17) 130 0 R (subsubsection.5.1.2.18) 134 0 R (subsubsection.5.1.2.19) 138 0 R (subsubsection.5.1.2.2) 70 0 R] -/Limits [(subsubsection.5.1.2.15) (subsubsection.5.1.2.2)] ->> endobj -746 0 obj << -/Names [(subsubsection.5.1.2.20) 142 0 R (subsubsection.5.1.2.21) 146 0 R (subsubsection.5.1.2.22) 150 0 R (subsubsection.5.1.2.23) 154 0 R (subsubsection.5.1.2.24) 158 0 R (subsubsection.5.1.2.25) 162 0 R] -/Limits [(subsubsection.5.1.2.20) (subsubsection.5.1.2.25)] ->> endobj -747 0 obj << -/Names [(subsubsection.5.1.2.26) 166 0 R (subsubsection.5.1.2.27) 170 0 R (subsubsection.5.1.2.28) 174 0 R (subsubsection.5.1.2.29) 178 0 R (subsubsection.5.1.2.3) 74 0 R (subsubsection.5.1.2.4) 78 0 R] -/Limits [(subsubsection.5.1.2.26) (subsubsection.5.1.2.4)] ->> endobj -748 0 obj << -/Names [(subsubsection.5.1.2.5) 82 0 R (subsubsection.5.1.2.6) 86 0 R (subsubsection.5.1.2.7) 90 0 R (subsubsection.5.1.2.8) 94 0 R (subsubsection.5.1.2.9) 98 0 R (subsubsection.5.2.2.1) 194 0 R] -/Limits [(subsubsection.5.1.2.5) (subsubsection.5.2.2.1)] ->> endobj -749 0 obj << -/Names [(subsubsection.5.2.2.2) 198 0 R (subsubsection.5.2.2.3) 202 0 R (subsubsection.5.2.2.4) 206 0 R (subsubsection.5.2.2.5) 210 0 R (table.5.1) 530 0 R (table.5.10) 571 0 R] -/Limits [(subsubsection.5.2.2.2) (table.5.10)] ->> endobj -750 0 obj << -/Names [(table.5.11) 579 0 R (table.5.12) 585 0 R (table.5.13) 586 0 R (table.5.14) 593 0 R (table.5.15) 594 0 R (table.5.16) 601 0 R] -/Limits [(table.5.11) (table.5.16)] ->> endobj -751 0 obj << -/Names [(table.5.17) 607 0 R (table.5.18) 608 0 R (table.5.19) 614 0 R (table.5.2) 541 0 R (table.5.20) 615 0 R (table.5.21) 621 0 R] -/Limits [(table.5.17) (table.5.21)] ->> endobj -752 0 obj << -/Names [(table.5.22) 622 0 R (table.5.23) 623 0 R (table.5.24) 629 0 R (table.5.25) 630 0 R (table.5.26) 636 0 R (table.5.27) 637 0 R] -/Limits [(table.5.22) (table.5.27)] ->> endobj -753 0 obj << -/Names [(table.5.28) 644 0 R (table.5.29) 645 0 R (table.5.3) 542 0 R (table.5.30) 655 0 R (table.5.31) 661 0 R (table.5.32) 662 0 R] -/Limits [(table.5.28) (table.5.32)] ->> endobj -754 0 obj << -/Names [(table.5.33) 669 0 R (table.5.34) 670 0 R (table.5.4) 548 0 R (table.5.5) 549 0 R (table.5.6) 556 0 R (table.5.7) 562 0 R] -/Limits [(table.5.33) (table.5.7)] ->> endobj -755 0 obj << -/Names [(table.5.8) 563 0 R (table.5.9) 570 0 R (types_8h) 480 0 R (version) 361 0 R (version_test) 362 0 R (version_test2) 363 0 R] -/Limits [(table.5.8) (version_test2)] ->> endobj -756 0 obj << -/Kids [725 0 R 726 0 R 727 0 R 728 0 R 729 0 R 730 0 R] -/Limits [(Doc-Start) (erasure__code_8h_afeefb3612c92a0bc87182f6e11030b11)] ->> endobj -757 0 obj << -/Kids [731 0 R 732 0 R 733 0 R 734 0 R 735 0 R 736 0 R] -/Limits [(gf__vect__mul_8h) (page.6)] ->> endobj -758 0 obj << -/Kids [737 0 R 738 0 R 739 0 R 740 0 R 741 0 R 742 0 R] -/Limits [(page.7) (section.5.2)] ->> endobj -759 0 obj << -/Kids [743 0 R 744 0 R 745 0 R 746 0 R 747 0 R 748 0 R] -/Limits [(section.5.3) (subsubsection.5.2.2.1)] ->> endobj -760 0 obj << -/Kids [749 0 R 750 0 R 751 0 R 752 0 R 753 0 R 754 0 R] -/Limits [(subsubsection.5.2.2.2) (table.5.7)] ->> endobj -761 0 obj << -/Kids [755 0 R] -/Limits [(table.5.8) (version_test2)] ->> endobj -762 0 obj << -/Kids [756 0 R 757 0 R 758 0 R 759 0 R 760 0 R 761 0 R] -/Limits [(Doc-Start) (version_test2)] ->> endobj -763 0 obj << -/Dests 762 0 R ->> endobj -764 0 obj << -/Type /Catalog -/Pages 723 0 R -/Outlines 724 0 R -/Names 763 0 R -/PageMode/UseOutlines/PageLabels << /Nums [0 << /S /D >> 1 << /S /D >> 2 << /S /r >> 4 << /S /D >> ] >> -/OpenAction 221 0 R ->> endobj -765 0 obj << -/Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.3)/Keywords() -/CreationDate (D:20140408225608-07'00') -/ModDate (D:20140408225608-07'00') -/Trapped /False -/PTEX.Fullbanner (This is pdfTeX using libpoppler, Version 3.141592-1.40.3-2.2 (Web2C 7.5.6) kpathsea version 3.5.6) ->> endobj -xref -0 766 -0000000001 65535 f -0000000002 00000 f -0000000003 00000 f -0000000004 00000 f -0000000397 00000 f -0000000015 00000 n -0000029129 00000 n -0000248311 00000 n -0000000060 00000 n -0000000164 00000 n -0000029306 00000 n -0000248239 00000 n -0000000211 00000 n -0000000339 00000 n -0000029424 00000 n -0000248153 00000 n -0000000387 00000 n -0000000454 00000 n -0000029541 00000 n -0000248067 00000 n -0000000502 00000 n -0000000645 00000 n -0000031891 00000 n -0000247994 00000 n -0000000693 00000 n -0000000818 00000 n -0000032878 00000 n -0000247870 00000 n -0000000864 00000 n -0000001017 00000 n -0000033056 00000 n -0000247796 00000 n -0000001065 00000 n -0000001218 00000 n -0000033174 00000 n -0000247722 00000 n -0000001266 00000 n -0000001457 00000 n -0000045007 00000 n -0000247634 00000 n -0000001503 00000 n -0000001676 00000 n -0000050083 00000 n -0000247509 00000 n -0000001722 00000 n -0000001802 00000 n -0000050139 00000 n -0000247448 00000 n -0000001850 00000 n -0000001925 00000 n -0000054175 00000 n -0000247335 00000 n -0000001971 00000 n -0000002091 00000 n -0000054292 00000 n -0000247223 00000 n -0000002139 00000 n -0000002320 00000 n -0000062532 00000 n -0000247149 00000 n -0000002373 00000 n -0000002503 00000 n -0000062588 00000 n -0000247036 00000 n -0000002556 00000 n -0000002696 00000 n -0000062701 00000 n -0000246962 00000 n -0000002754 00000 n -0000002857 00000 n -0000065938 00000 n -0000246875 00000 n -0000002915 00000 n -0000003046 00000 n -0000066108 00000 n -0000246788 00000 n -0000003104 00000 n -0000003230 00000 n -0000069083 00000 n -0000246701 00000 n -0000003288 00000 n -0000003391 00000 n -0000069252 00000 n -0000246614 00000 n -0000003449 00000 n -0000003593 00000 n -0000071916 00000 n -0000246527 00000 n -0000003651 00000 n -0000003800 00000 n -0000072086 00000 n -0000246440 00000 n -0000003858 00000 n -0000004002 00000 n -0000074788 00000 n -0000246353 00000 n -0000004060 00000 n -0000004204 00000 n -0000074958 00000 n -0000246264 00000 n -0000004262 00000 n -0000004412 00000 n -0000077736 00000 n -0000246173 00000 n -0000004472 00000 n -0000004617 00000 n -0000080387 00000 n -0000246081 00000 n -0000004677 00000 n -0000004822 00000 n -0000080558 00000 n -0000245989 00000 n -0000004882 00000 n -0000005032 00000 n -0000083234 00000 n -0000245897 00000 n -0000005092 00000 n -0000005237 00000 n -0000083405 00000 n -0000245805 00000 n -0000005297 00000 n -0000005442 00000 n -0000086187 00000 n -0000245713 00000 n -0000005502 00000 n -0000005652 00000 n -0000089050 00000 n -0000245621 00000 n -0000005712 00000 n -0000005857 00000 n -0000089221 00000 n -0000245529 00000 n -0000005917 00000 n -0000006062 00000 n -0000091925 00000 n -0000245437 00000 n -0000006122 00000 n -0000006272 00000 n -0000092096 00000 n -0000245345 00000 n -0000006332 00000 n -0000006477 00000 n -0000095033 00000 n -0000245253 00000 n -0000006537 00000 n -0000006679 00000 n -0000095203 00000 n -0000245161 00000 n -0000006739 00000 n -0000006856 00000 n -0000097392 00000 n -0000245069 00000 n -0000006916 00000 n -0000006977 00000 n -0000097563 00000 n -0000244977 00000 n -0000007037 00000 n -0000007151 00000 n -0000097734 00000 n -0000244885 00000 n -0000007211 00000 n -0000007272 00000 n -0000100342 00000 n -0000244793 00000 n -0000007332 00000 n -0000007449 00000 n -0000100513 00000 n -0000244701 00000 n -0000007509 00000 n -0000007649 00000 n -0000103118 00000 n -0000244609 00000 n -0000007709 00000 n -0000007854 00000 n -0000103289 00000 n -0000244517 00000 n -0000007914 00000 n -0000008059 00000 n -0000106077 00000 n -0000244439 00000 n -0000008119 00000 n -0000008259 00000 n -0000106248 00000 n -0000244309 00000 n -0000008308 00000 n -0000008488 00000 n -0000109728 00000 n -0000244230 00000 n -0000008542 00000 n -0000008673 00000 n -0000109784 00000 n -0000244112 00000 n -0000008727 00000 n -0000008868 00000 n -0000109898 00000 n -0000244033 00000 n -0000008927 00000 n -0000009016 00000 n -0000110069 00000 n -0000243940 00000 n -0000009075 00000 n -0000009187 00000 n -0000112732 00000 n -0000243847 00000 n -0000009246 00000 n -0000009363 00000 n -0000112903 00000 n -0000243754 00000 n -0000009422 00000 n -0000009539 00000 n -0000115203 00000 n -0000243675 00000 n -0000009598 00000 n -0000009710 00000 n -0000115374 00000 n -0000243558 00000 n -0000009759 00000 n -0000009903 00000 n -0000115431 00000 n -0000243493 00000 n -0000009957 00000 n -0000010088 00000 n -0000010605 00000 n -0000010717 00000 n -0000012711 00000 n -0000010140 00000 n -0000012654 00000 n -0000241253 00000 n -0000241599 00000 n -0000242647 00000 n -0000012333 00000 n -0000012585 00000 n -0000012632 00000 n -0000014877 00000 n -0000015067 00000 n -0000014745 00000 n -0000012824 00000 n -0000242123 00000 n -0000242297 00000 n -0000241082 00000 n -0000016450 00000 n -0000016600 00000 n -0000016753 00000 n -0000016906 00000 n -0000017059 00000 n -0000017212 00000 n -0000017362 00000 n -0000017515 00000 n -0000017667 00000 n -0000017818 00000 n -0000017969 00000 n -0000018121 00000 n -0000018272 00000 n -0000018424 00000 n -0000018583 00000 n -0000018741 00000 n -0000018905 00000 n -0000019069 00000 n -0000019233 00000 n -0000019397 00000 n -0000019560 00000 n -0000019724 00000 n -0000019887 00000 n -0000020051 00000 n -0000020214 00000 n -0000020379 00000 n -0000020544 00000 n -0000020708 00000 n -0000020873 00000 n -0000021037 00000 n -0000021202 00000 n -0000021366 00000 n -0000022687 00000 n -0000021531 00000 n -0000016070 00000 n -0000015165 00000 n -0000022852 00000 n -0000023016 00000 n -0000023181 00000 n -0000023345 00000 n -0000023510 00000 n -0000023674 00000 n -0000023838 00000 n -0000024003 00000 n -0000024167 00000 n -0000024332 00000 n -0000024496 00000 n -0000024661 00000 n -0000024814 00000 n -0000024973 00000 n -0000025132 00000 n -0000025296 00000 n -0000025460 00000 n -0000025624 00000 n -0000025788 00000 n -0000025952 00000 n -0000026105 00000 n -0000026264 00000 n -0000022387 00000 n -0000021616 00000 n -0000028880 00000 n -0000031270 00000 n -0000029659 00000 n -0000028748 00000 n -0000026349 00000 n -0000029072 00000 n -0000241953 00000 n -0000029184 00000 n -0000029245 00000 n -0000241424 00000 n -0000029362 00000 n -0000029480 00000 n -0000240940 00000 n -0000240085 00000 n -0000240514 00000 n -0000240372 00000 n -0000240229 00000 n -0000239942 00000 n -0000240655 00000 n -0000029597 00000 n -0000062644 00000 n -0000031420 00000 n -0000031947 00000 n -0000031122 00000 n -0000029845 00000 n -0000031834 00000 n -0000031628 00000 n -0000045063 00000 n -0000035239 00000 n -0000035430 00000 n -0000035621 00000 n -0000035812 00000 n -0000036003 00000 n -0000036194 00000 n -0000036384 00000 n -0000036575 00000 n -0000036765 00000 n -0000036956 00000 n -0000037146 00000 n -0000037337 00000 n -0000037528 00000 n -0000037719 00000 n -0000037910 00000 n -0000038101 00000 n -0000038292 00000 n -0000038483 00000 n -0000038674 00000 n -0000038865 00000 n -0000039056 00000 n -0000039247 00000 n -0000039438 00000 n -0000039628 00000 n -0000039819 00000 n -0000040009 00000 n -0000040200 00000 n -0000040390 00000 n -0000040581 00000 n -0000033229 00000 n -0000032709 00000 n -0000032058 00000 n -0000032821 00000 n -0000032934 00000 n -0000032995 00000 n -0000033112 00000 n -0000242764 00000 n -0000040829 00000 n -0000034883 00000 n -0000033340 00000 n -0000040772 00000 n -0000115146 00000 n -0000112846 00000 n -0000110012 00000 n -0000106020 00000 n -0000100456 00000 n -0000072029 00000 n -0000077679 00000 n -0000080501 00000 n -0000080330 00000 n -0000083177 00000 n -0000088993 00000 n -0000092039 00000 n -0000069026 00000 n -0000066051 00000 n -0000109841 00000 n -0000062814 00000 n -0000112675 00000 n -0000103232 00000 n -0000100285 00000 n -0000103061 00000 n -0000069196 00000 n -0000074731 00000 n -0000083348 00000 n -0000089164 00000 n -0000071859 00000 n -0000074901 00000 n -0000086130 00000 n -0000091868 00000 n -0000000399 00000 f -0000041881 00000 n -0000000401 00000 f -0000042073 00000 n -0000000403 00000 f -0000042265 00000 n -0000000405 00000 f -0000042456 00000 n -0000000407 00000 f -0000042648 00000 n -0000000409 00000 f -0000042840 00000 n -0000000411 00000 f -0000043032 00000 n -0000000413 00000 f -0000043224 00000 n -0000000415 00000 f -0000043415 00000 n -0000000417 00000 f -0000043607 00000 n -0000000419 00000 f -0000043799 00000 n -0000000421 00000 f -0000043991 00000 n -0000000423 00000 f -0000044182 00000 n -0000000425 00000 f -0000044374 00000 n -0000000427 00000 f -0000044566 00000 n -0000000429 00000 f -0000044758 00000 n -0000000451 00000 f -0000046866 00000 n -0000046034 00000 n -0000041629 00000 n -0000040927 00000 n -0000044950 00000 n -0000045124 00000 n -0000045181 00000 n -0000045238 00000 n -0000045295 00000 n -0000045352 00000 n -0000045409 00000 n -0000045465 00000 n -0000045522 00000 n -0000045579 00000 n -0000045636 00000 n -0000045693 00000 n -0000045750 00000 n -0000045807 00000 n -0000045864 00000 n -0000045921 00000 n -0000045977 00000 n -0000000453 00000 f -0000047057 00000 n -0000000455 00000 f -0000047249 00000 n -0000000457 00000 f -0000047441 00000 n -0000000000 00000 f -0000047633 00000 n -0000048165 00000 n -0000046702 00000 n -0000046132 00000 n -0000047825 00000 n -0000047882 00000 n -0000047939 00000 n -0000047995 00000 n -0000048051 00000 n -0000048108 00000 n -0000049099 00000 n -0000049257 00000 n -0000049411 00000 n -0000049569 00000 n -0000049723 00000 n -0000049873 00000 n -0000050195 00000 n -0000048927 00000 n -0000048263 00000 n -0000050026 00000 n -0000054231 00000 n -0000106191 00000 n -0000115317 00000 n -0000052001 00000 n -0000052194 00000 n -0000052387 00000 n -0000052580 00000 n -0000052772 00000 n -0000052963 00000 n -0000053156 00000 n -0000053348 00000 n -0000053541 00000 n -0000053733 00000 n -0000053926 00000 n -0000055873 00000 n -0000054404 00000 n -0000051789 00000 n -0000050306 00000 n -0000054118 00000 n -0000054348 00000 n -0000242470 00000 n -0000240798 00000 n -0000056064 00000 n -0000056257 00000 n -0000056450 00000 n -0000056642 00000 n -0000056835 00000 n -0000057028 00000 n -0000057219 00000 n -0000057411 00000 n -0000057604 00000 n -0000057796 00000 n -0000057989 00000 n -0000058181 00000 n -0000058374 00000 n -0000058567 00000 n -0000061704 00000 n -0000058817 00000 n -0000055629 00000 n -0000054554 00000 n -0000058760 00000 n -0000242881 00000 n -0000097677 00000 n -0000097335 00000 n -0000061896 00000 n -0000062089 00000 n -0000062282 00000 n -0000062871 00000 n -0000061548 00000 n -0000058941 00000 n -0000062475 00000 n -0000241774 00000 n -0000062757 00000 n -0000095147 00000 n -0000094976 00000 n -0000097506 00000 n -0000065329 00000 n -0000065522 00000 n -0000065688 00000 n -0000066221 00000 n -0000065181 00000 n -0000063034 00000 n -0000065881 00000 n -0000065994 00000 n -0000066164 00000 n -0000068803 00000 n -0000069365 00000 n -0000068671 00000 n -0000066371 00000 n -0000068969 00000 n -0000069139 00000 n -0000069308 00000 n -0000071472 00000 n -0000071638 00000 n -0000072142 00000 n -0000071332 00000 n -0000069528 00000 n -0000071802 00000 n -0000071972 00000 n -0000074451 00000 n -0000075014 00000 n -0000074319 00000 n -0000072305 00000 n -0000074617 00000 n -0000074674 00000 n -0000074844 00000 n -0000077234 00000 n -0000077400 00000 n -0000077850 00000 n -0000077094 00000 n -0000075177 00000 n -0000077566 00000 n -0000077623 00000 n -0000077793 00000 n -0000242998 00000 n -0000079943 00000 n -0000080109 00000 n -0000080615 00000 n -0000079803 00000 n -0000078013 00000 n -0000080273 00000 n -0000080444 00000 n -0000082897 00000 n -0000083462 00000 n -0000082765 00000 n -0000080778 00000 n -0000083063 00000 n -0000083120 00000 n -0000083291 00000 n -0000085685 00000 n -0000085851 00000 n -0000086301 00000 n -0000085545 00000 n -0000083625 00000 n -0000086017 00000 n -0000086074 00000 n -0000086244 00000 n -0000088606 00000 n -0000088772 00000 n -0000089278 00000 n -0000088466 00000 n -0000086464 00000 n -0000088936 00000 n -0000089107 00000 n -0000091588 00000 n -0000092153 00000 n -0000091456 00000 n -0000089441 00000 n -0000091754 00000 n -0000091811 00000 n -0000091982 00000 n -0000094697 00000 n -0000095260 00000 n -0000094565 00000 n -0000092316 00000 n -0000094863 00000 n -0000094920 00000 n -0000095090 00000 n -0000243115 00000 n -0000097791 00000 n -0000097109 00000 n -0000095423 00000 n -0000097221 00000 n -0000097278 00000 n -0000097449 00000 n -0000097620 00000 n -0000100006 00000 n -0000100570 00000 n -0000099874 00000 n -0000097954 00000 n -0000100171 00000 n -0000100228 00000 n -0000100399 00000 n -0000102781 00000 n -0000103346 00000 n -0000102649 00000 n -0000100733 00000 n -0000102947 00000 n -0000103004 00000 n -0000103175 00000 n -0000105740 00000 n -0000108653 00000 n -0000106301 00000 n -0000105608 00000 n -0000103509 00000 n -0000105906 00000 n -0000105963 00000 n -0000106134 00000 n -0000108845 00000 n -0000109038 00000 n -0000109231 00000 n -0000109422 00000 n -0000110126 00000 n -0000108489 00000 n -0000106464 00000 n -0000109615 00000 n -0000109672 00000 n -0000109955 00000 n -0000112396 00000 n -0000112960 00000 n -0000112264 00000 n -0000110289 00000 n -0000112561 00000 n -0000112618 00000 n -0000112789 00000 n -0000243232 00000 n -0000114866 00000 n -0000115488 00000 n -0000114734 00000 n -0000113110 00000 n -0000115032 00000 n -0000115089 00000 n -0000115260 00000 n -0000239481 00000 n -0000115638 00000 n -0000115961 00000 n -0000115986 00000 n -0000116461 00000 n -0000117073 00000 n -0000117099 00000 n -0000117412 00000 n -0000117523 00000 n -0000117618 00000 n -0000117979 00000 n -0000118004 00000 n -0000118351 00000 n -0000118535 00000 n -0000118906 00000 n -0000119568 00000 n -0000119892 00000 n -0000120195 00000 n -0000120735 00000 n -0000122499 00000 n -0000122732 00000 n -0000125260 00000 n -0000125496 00000 n -0000127821 00000 n -0000128050 00000 n -0000129970 00000 n -0000130203 00000 n -0000132711 00000 n -0000132958 00000 n -0000134482 00000 n -0000134734 00000 n -0000135998 00000 n -0000136227 00000 n -0000137496 00000 n -0000137726 00000 n -0000151595 00000 n -0000151990 00000 n -0000160014 00000 n -0000160352 00000 n -0000171728 00000 n -0000172110 00000 n -0000178885 00000 n -0000179160 00000 n -0000186548 00000 n -0000186829 00000 n -0000192223 00000 n -0000192519 00000 n -0000206190 00000 n -0000206568 00000 n -0000225983 00000 n -0000226563 00000 n -0000239124 00000 n -0000243317 00000 n -0000243419 00000 n -0000248420 00000 n -0000248600 00000 n -0000249046 00000 n -0000249560 00000 n -0000250074 00000 n -0000250588 00000 n -0000251102 00000 n -0000251548 00000 n -0000251743 00000 n -0000251913 00000 n -0000252082 00000 n -0000252252 00000 n -0000252417 00000 n -0000252635 00000 n -0000252941 00000 n -0000253247 00000 n -0000253553 00000 n -0000253776 00000 n -0000253973 00000 n -0000254203 00000 n -0000254490 00000 n -0000254777 00000 n -0000255067 00000 n -0000255352 00000 n -0000255629 00000 n -0000255877 00000 n -0000256071 00000 n -0000256264 00000 n -0000256458 00000 n -0000256651 00000 n -0000256840 00000 n -0000257034 00000 n -0000257188 00000 n -0000257305 00000 n -0000257417 00000 n -0000257544 00000 n -0000257669 00000 n -0000257746 00000 n -0000257863 00000 n -0000257901 00000 n -0000258111 00000 n -trailer -<< /Size 766 -/Root 764 0 R -/Info 765 0 R -/ID [<07BF1BFF8396560A3D29CED1E32BB73D> <07BF1BFF8396560A3D29CED1E32BB73D>] >> -startxref -258442 -%%EOF diff --git a/pkg/erasure/docs/isa-l_open_src_2.13.pdf b/pkg/erasure/docs/isa-l_open_src_2.13.pdf deleted file mode 100644 index 7ae862f99..000000000 Binary files a/pkg/erasure/docs/isa-l_open_src_2.13.pdf and /dev/null differ diff --git a/pkg/erasure/ec.h b/pkg/erasure/ec.h deleted file mode 100644 index 77be0812a..000000000 --- a/pkg/erasure/ec.h +++ /dev/null @@ -1,41 +0,0 @@ -/********************************************************************** - Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -**********************************************************************/ - -#ifndef _ISAL_H_ -#define _ISAL_H_ - -#define ISAL_MAJOR_VERSION 2 -#define ISAL_MINOR_VERSION 13 -#define ISAL_PATCH_VERSION 0 -#define ISAL_MAKE_VERSION(maj, min, patch) ((maj) * 0x10000 + (min) * 0x100 + (patch)) -#define ISAL_VERSION ISAL_MAKE_VERSION(ISAL_MAJOR_VERSION, ISAL_MINOR_VERSION, ISAL_PATCH_VERSION) - -#include "ec_code.h" -#include "gf_vect_mul.h" -#endif //_ISAL_H_ diff --git a/pkg/erasure/ec_base.c b/pkg/erasure/ec_base.c deleted file mode 100644 index 2898f668f..000000000 --- a/pkg/erasure/ec_base.c +++ /dev/null @@ -1,348 +0,0 @@ -/********************************************************************** - Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -**********************************************************************/ - -#include -#include // for memset -#include "ec_code.h" -#include "ec_base.h" // for GF tables -#include "ec_types.h" - -unsigned char gf_mul(unsigned char a, unsigned char b) -{ -#ifndef GF_LARGE_TABLES - int i; - - if ((a == 0) || (b == 0)) - return 0; - - return gff_base[(i = gflog_base[a] + gflog_base[b]) > 254 ? i - 255 : i]; -#else - return gf_mul_table_base[b * 256 + a]; -#endif -} - -unsigned char gf_inv(unsigned char a) -{ -#ifndef GF_LARGE_TABLES - if (a == 0) - return 0; - - return gff_base[255 - gflog_base[a]]; -#else - return gf_inv_table_base[a]; -#endif -} - -void gf_gen_rs_matrix(unsigned char *a, int m, int k) -{ - int i, j; - unsigned char p, gen = 1; - - memset(a, 0, k * m); - for (i = 0; i < k; i++) - a[k * i + i] = 1; - - for (i = k; i < m; i++) { - p = 1; - for (j = 0; j < k; j++) { - a[k * i + j] = p; - p = gf_mul(p, gen); - } - gen = gf_mul(gen, 2); - } -} - -void gf_gen_cauchy1_matrix(unsigned char *a, int m, int k) -{ - int i, j; - unsigned char *p; - - // Identity matrix in high position - memset(a, 0, k * m); - for (i = 0; i < k; i++) - a[k * i + i] = 1; - - // For the rest choose 1/(i + j) | i != j - p = &a[k * k]; - for (i = k; i < m; i++) - for (j = 0; j < k; j++) - *p++ = gf_inv(i ^ j); - -} - -int gf_invert_matrix(unsigned char *in_mat, unsigned char *out_mat, const int n) -{ - int i, j, k; - unsigned char temp; - - // Set out_mat[] to the identity matrix - for (i = 0; i < n * n; i++) // memset(out_mat, 0, n*n) - out_mat[i] = 0; - - for (i = 0; i < n; i++) - out_mat[i * n + i] = 1; - - // Inverse - for (i = 0; i < n; i++) { - // Check for 0 in pivot element - if (in_mat[i * n + i] == 0) { - // Find a row with non-zero in current column and swap - for (j = i + 1; j < n; j++) - if (in_mat[j * n + i]) - break; - - if (j == n) // Couldn't find means it's singular - return -1; - - for (k = 0; k < n; k++) { // Swap rows i,j - temp = in_mat[i * n + k]; - in_mat[i * n + k] = in_mat[j * n + k]; - in_mat[j * n + k] = temp; - - temp = out_mat[i * n + k]; - out_mat[i * n + k] = out_mat[j * n + k]; - out_mat[j * n + k] = temp; - } - } - - temp = gf_inv(in_mat[i * n + i]); // 1/pivot - for (j = 0; j < n; j++) { // Scale row i by 1/pivot - in_mat[i * n + j] = gf_mul(in_mat[i * n + j], temp); - out_mat[i * n + j] = gf_mul(out_mat[i * n + j], temp); - } - - for (j = 0; j < n; j++) { - if (j == i) - continue; - - temp = in_mat[j * n + i]; - for (k = 0; k < n; k++) { - out_mat[j * n + k] ^= gf_mul(temp, out_mat[i * n + k]); - in_mat[j * n + k] ^= gf_mul(temp, in_mat[i * n + k]); - } - } - } - return 0; -} - -// Calculates const table gftbl in GF(2^8) from single input A -// gftbl(A) = {A{00}, A{01}, A{02}, ... , A{0f} }, {A{00}, A{10}, A{20}, ... , A{f0} } - -void gf_vect_mul_init(unsigned char c, unsigned char *tbl) -{ - unsigned char c2 = (c << 1) ^ ((c & 0x80) ? 0x1d : 0); //Mult by GF{2} - unsigned char c4 = (c2 << 1) ^ ((c2 & 0x80) ? 0x1d : 0); //Mult by GF{2} - unsigned char c8 = (c4 << 1) ^ ((c4 & 0x80) ? 0x1d : 0); //Mult by GF{2} - -#if __WORDSIZE == 64 || _WIN64 || __x86_64__ - unsigned long long v1, v2, v4, v8, *t; - unsigned long long v10, v20, v40, v80; - unsigned char c17, c18, c20, c24; - - t = (unsigned long long *)tbl; - - v1 = c * 0x0100010001000100ull; - v2 = c2 * 0x0101000001010000ull; - v4 = c4 * 0x0101010100000000ull; - v8 = c8 * 0x0101010101010101ull; - - v4 = v1 ^ v2 ^ v4; - t[0] = v4; - t[1] = v8 ^ v4; - - c17 = (c8 << 1) ^ ((c8 & 0x80) ? 0x1d : 0); //Mult by GF{2} - c18 = (c17 << 1) ^ ((c17 & 0x80) ? 0x1d : 0); //Mult by GF{2} - c20 = (c18 << 1) ^ ((c18 & 0x80) ? 0x1d : 0); //Mult by GF{2} - c24 = (c20 << 1) ^ ((c20 & 0x80) ? 0x1d : 0); //Mult by GF{2} - - v10 = c17 * 0x0100010001000100ull; - v20 = c18 * 0x0101000001010000ull; - v40 = c20 * 0x0101010100000000ull; - v80 = c24 * 0x0101010101010101ull; - - v40 = v10 ^ v20 ^ v40; - t[2] = v40; - t[3] = v80 ^ v40; - -#else // 32-bit or other - unsigned char c3, c5, c6, c7, c9, c10, c11, c12, c13, c14, c15; - unsigned char c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, c30, - c31; - - c3 = c2 ^ c; - c5 = c4 ^ c; - c6 = c4 ^ c2; - c7 = c4 ^ c3; - - c9 = c8 ^ c; - c10 = c8 ^ c2; - c11 = c8 ^ c3; - c12 = c8 ^ c4; - c13 = c8 ^ c5; - c14 = c8 ^ c6; - c15 = c8 ^ c7; - - tbl[0] = 0; - tbl[1] = c; - tbl[2] = c2; - tbl[3] = c3; - tbl[4] = c4; - tbl[5] = c5; - tbl[6] = c6; - tbl[7] = c7; - tbl[8] = c8; - tbl[9] = c9; - tbl[10] = c10; - tbl[11] = c11; - tbl[12] = c12; - tbl[13] = c13; - tbl[14] = c14; - tbl[15] = c15; - - c17 = (c8 << 1) ^ ((c8 & 0x80) ? 0x1d : 0); //Mult by GF{2} - c18 = (c17 << 1) ^ ((c17 & 0x80) ? 0x1d : 0); //Mult by GF{2} - c19 = c18 ^ c17; - c20 = (c18 << 1) ^ ((c18 & 0x80) ? 0x1d : 0); //Mult by GF{2} - c21 = c20 ^ c17; - c22 = c20 ^ c18; - c23 = c20 ^ c19; - c24 = (c20 << 1) ^ ((c20 & 0x80) ? 0x1d : 0); //Mult by GF{2} - c25 = c24 ^ c17; - c26 = c24 ^ c18; - c27 = c24 ^ c19; - c28 = c24 ^ c20; - c29 = c24 ^ c21; - c30 = c24 ^ c22; - c31 = c24 ^ c23; - - tbl[16] = 0; - tbl[17] = c17; - tbl[18] = c18; - tbl[19] = c19; - tbl[20] = c20; - tbl[21] = c21; - tbl[22] = c22; - tbl[23] = c23; - tbl[24] = c24; - tbl[25] = c25; - tbl[26] = c26; - tbl[27] = c27; - tbl[28] = c28; - tbl[29] = c29; - tbl[30] = c30; - tbl[31] = c31; - -#endif //__WORDSIZE == 64 || _WIN64 || __x86_64__ -} - -void gf_vect_dot_prod_base(int len, int vlen, unsigned char *v, - unsigned char **src, unsigned char *dest) -{ - int i, j; - unsigned char s; - for (i = 0; i < len; i++) { - s = 0; - for (j = 0; j < vlen; j++) - s ^= gf_mul(src[j][i], v[j * 32 + 1]); - - dest[i] = s; - } -} - -void gf_vect_mad_base(int len, int vec, int vec_i, - unsigned char *v, unsigned char *src, unsigned char *dest) -{ - int i; - unsigned char s; - for (i = 0; i < len; i++) { - s = dest[i]; - s ^= gf_mul(src[i], v[vec_i * 32 + 1]); - dest[i] = s; - } -} - -void ec_encode_data_base(int len, int srcs, int dests, unsigned char *v, - unsigned char **src, unsigned char **dest) -{ - int i, j, l; - unsigned char s; - - for (l = 0; l < dests; l++) { - for (i = 0; i < len; i++) { - s = 0; - for (j = 0; j < srcs; j++) - s ^= gf_mul(src[j][i], v[j * 32 + l * srcs * 32 + 1]); - - dest[l][i] = s; - } - } -} - -void ec_encode_data_update_base(int len, int k, int rows, int vec_i, unsigned char *v, - unsigned char *data, unsigned char **dest) -{ - int i, l; - unsigned char s; - - for (l = 0; l < rows; l++) { - for (i = 0; i < len; i++) { - s = dest[l][i]; - s ^= gf_mul(data[i], v[vec_i * 32 + l * k * 32 + 1]); - - dest[l][i] = s; - } - } -} - -void gf_vect_mul_base(int len, unsigned char *a, unsigned char *src, unsigned char *dest) -{ - //2nd element of table array is ref value used to fill it in - unsigned char c = a[1]; - while (len-- > 0) - *dest++ = gf_mul(c, *src++); -} - -struct slver { - UINT16 snum; - UINT8 ver; - UINT8 core; -}; - -// Version info -struct slver gf_vect_mul_init_slver_00020035; -struct slver gf_vect_mul_init_slver = { 0x0035, 0x02, 0x00 }; - -struct slver ec_encode_data_base_slver_00010135; -struct slver ec_encode_data_base_slver = { 0x0135, 0x01, 0x00 }; - -struct slver gf_vect_mul_base_slver_00010136; -struct slver gf_vect_mul_base_slver = { 0x0136, 0x01, 0x00 }; - -struct slver gf_vect_dot_prod_base_slver_00010137; -struct slver gf_vect_dot_prod_base_slver = { 0x0137, 0x01, 0x00 }; diff --git a/pkg/erasure/ec_base.h b/pkg/erasure/ec_base.h deleted file mode 100644 index db4fd9d6c..000000000 --- a/pkg/erasure/ec_base.h +++ /dev/null @@ -1,6680 +0,0 @@ -/********************************************************************** - Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -**********************************************************************/ - -#ifndef _EC_BASE_H_ -#define _EC_BASE_H_ - -// Global GF(256) tables -#ifndef GF_LARGE_TABLES -unsigned char gff_base[] = { - 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1d, 0x3a, - 0x74, 0xe8, 0xcd, 0x87, 0x13, 0x26, 0x4c, 0x98, 0x2d, 0x5a, - 0xb4, 0x75, 0xea, 0xc9, 0x8f, 0x03, 0x06, 0x0c, 0x18, 0x30, - 0x60, 0xc0, 0x9d, 0x27, 0x4e, 0x9c, 0x25, 0x4a, 0x94, 0x35, - 0x6a, 0xd4, 0xb5, 0x77, 0xee, 0xc1, 0x9f, 0x23, 0x46, 0x8c, - 0x05, 0x0a, 0x14, 0x28, 0x50, 0xa0, 0x5d, 0xba, 0x69, 0xd2, - 0xb9, 0x6f, 0xde, 0xa1, 0x5f, 0xbe, 0x61, 0xc2, 0x99, 0x2f, - 0x5e, 0xbc, 0x65, 0xca, 0x89, 0x0f, 0x1e, 0x3c, 0x78, 0xf0, - 0xfd, 0xe7, 0xd3, 0xbb, 0x6b, 0xd6, 0xb1, 0x7f, 0xfe, 0xe1, - 0xdf, 0xa3, 0x5b, 0xb6, 0x71, 0xe2, 0xd9, 0xaf, 0x43, 0x86, - 0x11, 0x22, 0x44, 0x88, 0x0d, 0x1a, 0x34, 0x68, 0xd0, 0xbd, - 0x67, 0xce, 0x81, 0x1f, 0x3e, 0x7c, 0xf8, 0xed, 0xc7, 0x93, - 0x3b, 0x76, 0xec, 0xc5, 0x97, 0x33, 0x66, 0xcc, 0x85, 0x17, - 0x2e, 0x5c, 0xb8, 0x6d, 0xda, 0xa9, 0x4f, 0x9e, 0x21, 0x42, - 0x84, 0x15, 0x2a, 0x54, 0xa8, 0x4d, 0x9a, 0x29, 0x52, 0xa4, - 0x55, 0xaa, 0x49, 0x92, 0x39, 0x72, 0xe4, 0xd5, 0xb7, 0x73, - 0xe6, 0xd1, 0xbf, 0x63, 0xc6, 0x91, 0x3f, 0x7e, 0xfc, 0xe5, - 0xd7, 0xb3, 0x7b, 0xf6, 0xf1, 0xff, 0xe3, 0xdb, 0xab, 0x4b, - 0x96, 0x31, 0x62, 0xc4, 0x95, 0x37, 0x6e, 0xdc, 0xa5, 0x57, - 0xae, 0x41, 0x82, 0x19, 0x32, 0x64, 0xc8, 0x8d, 0x07, 0x0e, - 0x1c, 0x38, 0x70, 0xe0, 0xdd, 0xa7, 0x53, 0xa6, 0x51, 0xa2, - 0x59, 0xb2, 0x79, 0xf2, 0xf9, 0xef, 0xc3, 0x9b, 0x2b, 0x56, - 0xac, 0x45, 0x8a, 0x09, 0x12, 0x24, 0x48, 0x90, 0x3d, 0x7a, - 0xf4, 0xf5, 0xf7, 0xf3, 0xfb, 0xeb, 0xcb, 0x8b, 0x0b, 0x16, - 0x2c, 0x58, 0xb0, 0x7d, 0xfa, 0xe9, 0xcf, 0x83, 0x1b, 0x36, - 0x6c, 0xd8, 0xad, 0x47, 0x8e, 0x01 -}; - -unsigned char gflog_base[] = { - 0x00, 0xff, 0x01, 0x19, 0x02, 0x32, 0x1a, 0xc6, 0x03, 0xdf, - 0x33, 0xee, 0x1b, 0x68, 0xc7, 0x4b, 0x04, 0x64, 0xe0, 0x0e, - 0x34, 0x8d, 0xef, 0x81, 0x1c, 0xc1, 0x69, 0xf8, 0xc8, 0x08, - 0x4c, 0x71, 0x05, 0x8a, 0x65, 0x2f, 0xe1, 0x24, 0x0f, 0x21, - 0x35, 0x93, 0x8e, 0xda, 0xf0, 0x12, 0x82, 0x45, 0x1d, 0xb5, - 0xc2, 0x7d, 0x6a, 0x27, 0xf9, 0xb9, 0xc9, 0x9a, 0x09, 0x78, - 0x4d, 0xe4, 0x72, 0xa6, 0x06, 0xbf, 0x8b, 0x62, 0x66, 0xdd, - 0x30, 0xfd, 0xe2, 0x98, 0x25, 0xb3, 0x10, 0x91, 0x22, 0x88, - 0x36, 0xd0, 0x94, 0xce, 0x8f, 0x96, 0xdb, 0xbd, 0xf1, 0xd2, - 0x13, 0x5c, 0x83, 0x38, 0x46, 0x40, 0x1e, 0x42, 0xb6, 0xa3, - 0xc3, 0x48, 0x7e, 0x6e, 0x6b, 0x3a, 0x28, 0x54, 0xfa, 0x85, - 0xba, 0x3d, 0xca, 0x5e, 0x9b, 0x9f, 0x0a, 0x15, 0x79, 0x2b, - 0x4e, 0xd4, 0xe5, 0xac, 0x73, 0xf3, 0xa7, 0x57, 0x07, 0x70, - 0xc0, 0xf7, 0x8c, 0x80, 0x63, 0x0d, 0x67, 0x4a, 0xde, 0xed, - 0x31, 0xc5, 0xfe, 0x18, 0xe3, 0xa5, 0x99, 0x77, 0x26, 0xb8, - 0xb4, 0x7c, 0x11, 0x44, 0x92, 0xd9, 0x23, 0x20, 0x89, 0x2e, - 0x37, 0x3f, 0xd1, 0x5b, 0x95, 0xbc, 0xcf, 0xcd, 0x90, 0x87, - 0x97, 0xb2, 0xdc, 0xfc, 0xbe, 0x61, 0xf2, 0x56, 0xd3, 0xab, - 0x14, 0x2a, 0x5d, 0x9e, 0x84, 0x3c, 0x39, 0x53, 0x47, 0x6d, - 0x41, 0xa2, 0x1f, 0x2d, 0x43, 0xd8, 0xb7, 0x7b, 0xa4, 0x76, - 0xc4, 0x17, 0x49, 0xec, 0x7f, 0x0c, 0x6f, 0xf6, 0x6c, 0xa1, - 0x3b, 0x52, 0x29, 0x9d, 0x55, 0xaa, 0xfb, 0x60, 0x86, 0xb1, - 0xbb, 0xcc, 0x3e, 0x5a, 0xcb, 0x59, 0x5f, 0xb0, 0x9c, 0xa9, - 0xa0, 0x51, 0x0b, 0xf5, 0x16, 0xeb, 0x7a, 0x75, 0x2c, 0xd7, - 0x4f, 0xae, 0xd5, 0xe9, 0xe6, 0xe7, 0xad, 0xe8, 0x74, 0xd6, - 0xf4, 0xea, 0xa8, 0x50, 0x58, 0xaf -}; -#else -unsigned char gf_mul_table_base[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, - 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, - 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, - 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, - 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, - 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, - 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, - 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, - 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, - 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, - 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, - 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, - 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, - 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, - 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, - 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, - 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, - 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, - 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, - 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, - 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, - 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, - 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, - 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, - 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, - 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, - 0xfe, 0xff, 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, - 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, 0x20, 0x22, - 0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, - 0x38, 0x3a, 0x3c, 0x3e, 0x40, 0x42, 0x44, 0x46, 0x48, 0x4a, - 0x4c, 0x4e, 0x50, 0x52, 0x54, 0x56, 0x58, 0x5a, 0x5c, 0x5e, - 0x60, 0x62, 0x64, 0x66, 0x68, 0x6a, 0x6c, 0x6e, 0x70, 0x72, - 0x74, 0x76, 0x78, 0x7a, 0x7c, 0x7e, 0x80, 0x82, 0x84, 0x86, - 0x88, 0x8a, 0x8c, 0x8e, 0x90, 0x92, 0x94, 0x96, 0x98, 0x9a, - 0x9c, 0x9e, 0xa0, 0xa2, 0xa4, 0xa6, 0xa8, 0xaa, 0xac, 0xae, - 0xb0, 0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc, 0xbe, 0xc0, 0xc2, - 0xc4, 0xc6, 0xc8, 0xca, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, - 0xd8, 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, - 0xec, 0xee, 0xf0, 0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfc, 0xfe, - 0x1d, 0x1f, 0x19, 0x1b, 0x15, 0x17, 0x11, 0x13, 0x0d, 0x0f, - 0x09, 0x0b, 0x05, 0x07, 0x01, 0x03, 0x3d, 0x3f, 0x39, 0x3b, - 0x35, 0x37, 0x31, 0x33, 0x2d, 0x2f, 0x29, 0x2b, 0x25, 0x27, - 0x21, 0x23, 0x5d, 0x5f, 0x59, 0x5b, 0x55, 0x57, 0x51, 0x53, - 0x4d, 0x4f, 0x49, 0x4b, 0x45, 0x47, 0x41, 0x43, 0x7d, 0x7f, - 0x79, 0x7b, 0x75, 0x77, 0x71, 0x73, 0x6d, 0x6f, 0x69, 0x6b, - 0x65, 0x67, 0x61, 0x63, 0x9d, 0x9f, 0x99, 0x9b, 0x95, 0x97, - 0x91, 0x93, 0x8d, 0x8f, 0x89, 0x8b, 0x85, 0x87, 0x81, 0x83, - 0xbd, 0xbf, 0xb9, 0xbb, 0xb5, 0xb7, 0xb1, 0xb3, 0xad, 0xaf, - 0xa9, 0xab, 0xa5, 0xa7, 0xa1, 0xa3, 0xdd, 0xdf, 0xd9, 0xdb, - 0xd5, 0xd7, 0xd1, 0xd3, 0xcd, 0xcf, 0xc9, 0xcb, 0xc5, 0xc7, - 0xc1, 0xc3, 0xfd, 0xff, 0xf9, 0xfb, 0xf5, 0xf7, 0xf1, 0xf3, - 0xed, 0xef, 0xe9, 0xeb, 0xe5, 0xe7, 0xe1, 0xe3, 0x00, 0x03, - 0x06, 0x05, 0x0c, 0x0f, 0x0a, 0x09, 0x18, 0x1b, 0x1e, 0x1d, - 0x14, 0x17, 0x12, 0x11, 0x30, 0x33, 0x36, 0x35, 0x3c, 0x3f, - 0x3a, 0x39, 0x28, 0x2b, 0x2e, 0x2d, 0x24, 0x27, 0x22, 0x21, - 0x60, 0x63, 0x66, 0x65, 0x6c, 0x6f, 0x6a, 0x69, 0x78, 0x7b, - 0x7e, 0x7d, 0x74, 0x77, 0x72, 0x71, 0x50, 0x53, 0x56, 0x55, - 0x5c, 0x5f, 0x5a, 0x59, 0x48, 0x4b, 0x4e, 0x4d, 0x44, 0x47, - 0x42, 0x41, 0xc0, 0xc3, 0xc6, 0xc5, 0xcc, 0xcf, 0xca, 0xc9, - 0xd8, 0xdb, 0xde, 0xdd, 0xd4, 0xd7, 0xd2, 0xd1, 0xf0, 0xf3, - 0xf6, 0xf5, 0xfc, 0xff, 0xfa, 0xf9, 0xe8, 0xeb, 0xee, 0xed, - 0xe4, 0xe7, 0xe2, 0xe1, 0xa0, 0xa3, 0xa6, 0xa5, 0xac, 0xaf, - 0xaa, 0xa9, 0xb8, 0xbb, 0xbe, 0xbd, 0xb4, 0xb7, 0xb2, 0xb1, - 0x90, 0x93, 0x96, 0x95, 0x9c, 0x9f, 0x9a, 0x99, 0x88, 0x8b, - 0x8e, 0x8d, 0x84, 0x87, 0x82, 0x81, 0x9d, 0x9e, 0x9b, 0x98, - 0x91, 0x92, 0x97, 0x94, 0x85, 0x86, 0x83, 0x80, 0x89, 0x8a, - 0x8f, 0x8c, 0xad, 0xae, 0xab, 0xa8, 0xa1, 0xa2, 0xa7, 0xa4, - 0xb5, 0xb6, 0xb3, 0xb0, 0xb9, 0xba, 0xbf, 0xbc, 0xfd, 0xfe, - 0xfb, 0xf8, 0xf1, 0xf2, 0xf7, 0xf4, 0xe5, 0xe6, 0xe3, 0xe0, - 0xe9, 0xea, 0xef, 0xec, 0xcd, 0xce, 0xcb, 0xc8, 0xc1, 0xc2, - 0xc7, 0xc4, 0xd5, 0xd6, 0xd3, 0xd0, 0xd9, 0xda, 0xdf, 0xdc, - 0x5d, 0x5e, 0x5b, 0x58, 0x51, 0x52, 0x57, 0x54, 0x45, 0x46, - 0x43, 0x40, 0x49, 0x4a, 0x4f, 0x4c, 0x6d, 0x6e, 0x6b, 0x68, - 0x61, 0x62, 0x67, 0x64, 0x75, 0x76, 0x73, 0x70, 0x79, 0x7a, - 0x7f, 0x7c, 0x3d, 0x3e, 0x3b, 0x38, 0x31, 0x32, 0x37, 0x34, - 0x25, 0x26, 0x23, 0x20, 0x29, 0x2a, 0x2f, 0x2c, 0x0d, 0x0e, - 0x0b, 0x08, 0x01, 0x02, 0x07, 0x04, 0x15, 0x16, 0x13, 0x10, - 0x19, 0x1a, 0x1f, 0x1c, 0x00, 0x04, 0x08, 0x0c, 0x10, 0x14, - 0x18, 0x1c, 0x20, 0x24, 0x28, 0x2c, 0x30, 0x34, 0x38, 0x3c, - 0x40, 0x44, 0x48, 0x4c, 0x50, 0x54, 0x58, 0x5c, 0x60, 0x64, - 0x68, 0x6c, 0x70, 0x74, 0x78, 0x7c, 0x80, 0x84, 0x88, 0x8c, - 0x90, 0x94, 0x98, 0x9c, 0xa0, 0xa4, 0xa8, 0xac, 0xb0, 0xb4, - 0xb8, 0xbc, 0xc0, 0xc4, 0xc8, 0xcc, 0xd0, 0xd4, 0xd8, 0xdc, - 0xe0, 0xe4, 0xe8, 0xec, 0xf0, 0xf4, 0xf8, 0xfc, 0x1d, 0x19, - 0x15, 0x11, 0x0d, 0x09, 0x05, 0x01, 0x3d, 0x39, 0x35, 0x31, - 0x2d, 0x29, 0x25, 0x21, 0x5d, 0x59, 0x55, 0x51, 0x4d, 0x49, - 0x45, 0x41, 0x7d, 0x79, 0x75, 0x71, 0x6d, 0x69, 0x65, 0x61, - 0x9d, 0x99, 0x95, 0x91, 0x8d, 0x89, 0x85, 0x81, 0xbd, 0xb9, - 0xb5, 0xb1, 0xad, 0xa9, 0xa5, 0xa1, 0xdd, 0xd9, 0xd5, 0xd1, - 0xcd, 0xc9, 0xc5, 0xc1, 0xfd, 0xf9, 0xf5, 0xf1, 0xed, 0xe9, - 0xe5, 0xe1, 0x3a, 0x3e, 0x32, 0x36, 0x2a, 0x2e, 0x22, 0x26, - 0x1a, 0x1e, 0x12, 0x16, 0x0a, 0x0e, 0x02, 0x06, 0x7a, 0x7e, - 0x72, 0x76, 0x6a, 0x6e, 0x62, 0x66, 0x5a, 0x5e, 0x52, 0x56, - 0x4a, 0x4e, 0x42, 0x46, 0xba, 0xbe, 0xb2, 0xb6, 0xaa, 0xae, - 0xa2, 0xa6, 0x9a, 0x9e, 0x92, 0x96, 0x8a, 0x8e, 0x82, 0x86, - 0xfa, 0xfe, 0xf2, 0xf6, 0xea, 0xee, 0xe2, 0xe6, 0xda, 0xde, - 0xd2, 0xd6, 0xca, 0xce, 0xc2, 0xc6, 0x27, 0x23, 0x2f, 0x2b, - 0x37, 0x33, 0x3f, 0x3b, 0x07, 0x03, 0x0f, 0x0b, 0x17, 0x13, - 0x1f, 0x1b, 0x67, 0x63, 0x6f, 0x6b, 0x77, 0x73, 0x7f, 0x7b, - 0x47, 0x43, 0x4f, 0x4b, 0x57, 0x53, 0x5f, 0x5b, 0xa7, 0xa3, - 0xaf, 0xab, 0xb7, 0xb3, 0xbf, 0xbb, 0x87, 0x83, 0x8f, 0x8b, - 0x97, 0x93, 0x9f, 0x9b, 0xe7, 0xe3, 0xef, 0xeb, 0xf7, 0xf3, - 0xff, 0xfb, 0xc7, 0xc3, 0xcf, 0xcb, 0xd7, 0xd3, 0xdf, 0xdb, - 0x00, 0x05, 0x0a, 0x0f, 0x14, 0x11, 0x1e, 0x1b, 0x28, 0x2d, - 0x22, 0x27, 0x3c, 0x39, 0x36, 0x33, 0x50, 0x55, 0x5a, 0x5f, - 0x44, 0x41, 0x4e, 0x4b, 0x78, 0x7d, 0x72, 0x77, 0x6c, 0x69, - 0x66, 0x63, 0xa0, 0xa5, 0xaa, 0xaf, 0xb4, 0xb1, 0xbe, 0xbb, - 0x88, 0x8d, 0x82, 0x87, 0x9c, 0x99, 0x96, 0x93, 0xf0, 0xf5, - 0xfa, 0xff, 0xe4, 0xe1, 0xee, 0xeb, 0xd8, 0xdd, 0xd2, 0xd7, - 0xcc, 0xc9, 0xc6, 0xc3, 0x5d, 0x58, 0x57, 0x52, 0x49, 0x4c, - 0x43, 0x46, 0x75, 0x70, 0x7f, 0x7a, 0x61, 0x64, 0x6b, 0x6e, - 0x0d, 0x08, 0x07, 0x02, 0x19, 0x1c, 0x13, 0x16, 0x25, 0x20, - 0x2f, 0x2a, 0x31, 0x34, 0x3b, 0x3e, 0xfd, 0xf8, 0xf7, 0xf2, - 0xe9, 0xec, 0xe3, 0xe6, 0xd5, 0xd0, 0xdf, 0xda, 0xc1, 0xc4, - 0xcb, 0xce, 0xad, 0xa8, 0xa7, 0xa2, 0xb9, 0xbc, 0xb3, 0xb6, - 0x85, 0x80, 0x8f, 0x8a, 0x91, 0x94, 0x9b, 0x9e, 0xba, 0xbf, - 0xb0, 0xb5, 0xae, 0xab, 0xa4, 0xa1, 0x92, 0x97, 0x98, 0x9d, - 0x86, 0x83, 0x8c, 0x89, 0xea, 0xef, 0xe0, 0xe5, 0xfe, 0xfb, - 0xf4, 0xf1, 0xc2, 0xc7, 0xc8, 0xcd, 0xd6, 0xd3, 0xdc, 0xd9, - 0x1a, 0x1f, 0x10, 0x15, 0x0e, 0x0b, 0x04, 0x01, 0x32, 0x37, - 0x38, 0x3d, 0x26, 0x23, 0x2c, 0x29, 0x4a, 0x4f, 0x40, 0x45, - 0x5e, 0x5b, 0x54, 0x51, 0x62, 0x67, 0x68, 0x6d, 0x76, 0x73, - 0x7c, 0x79, 0xe7, 0xe2, 0xed, 0xe8, 0xf3, 0xf6, 0xf9, 0xfc, - 0xcf, 0xca, 0xc5, 0xc0, 0xdb, 0xde, 0xd1, 0xd4, 0xb7, 0xb2, - 0xbd, 0xb8, 0xa3, 0xa6, 0xa9, 0xac, 0x9f, 0x9a, 0x95, 0x90, - 0x8b, 0x8e, 0x81, 0x84, 0x47, 0x42, 0x4d, 0x48, 0x53, 0x56, - 0x59, 0x5c, 0x6f, 0x6a, 0x65, 0x60, 0x7b, 0x7e, 0x71, 0x74, - 0x17, 0x12, 0x1d, 0x18, 0x03, 0x06, 0x09, 0x0c, 0x3f, 0x3a, - 0x35, 0x30, 0x2b, 0x2e, 0x21, 0x24, 0x00, 0x06, 0x0c, 0x0a, - 0x18, 0x1e, 0x14, 0x12, 0x30, 0x36, 0x3c, 0x3a, 0x28, 0x2e, - 0x24, 0x22, 0x60, 0x66, 0x6c, 0x6a, 0x78, 0x7e, 0x74, 0x72, - 0x50, 0x56, 0x5c, 0x5a, 0x48, 0x4e, 0x44, 0x42, 0xc0, 0xc6, - 0xcc, 0xca, 0xd8, 0xde, 0xd4, 0xd2, 0xf0, 0xf6, 0xfc, 0xfa, - 0xe8, 0xee, 0xe4, 0xe2, 0xa0, 0xa6, 0xac, 0xaa, 0xb8, 0xbe, - 0xb4, 0xb2, 0x90, 0x96, 0x9c, 0x9a, 0x88, 0x8e, 0x84, 0x82, - 0x9d, 0x9b, 0x91, 0x97, 0x85, 0x83, 0x89, 0x8f, 0xad, 0xab, - 0xa1, 0xa7, 0xb5, 0xb3, 0xb9, 0xbf, 0xfd, 0xfb, 0xf1, 0xf7, - 0xe5, 0xe3, 0xe9, 0xef, 0xcd, 0xcb, 0xc1, 0xc7, 0xd5, 0xd3, - 0xd9, 0xdf, 0x5d, 0x5b, 0x51, 0x57, 0x45, 0x43, 0x49, 0x4f, - 0x6d, 0x6b, 0x61, 0x67, 0x75, 0x73, 0x79, 0x7f, 0x3d, 0x3b, - 0x31, 0x37, 0x25, 0x23, 0x29, 0x2f, 0x0d, 0x0b, 0x01, 0x07, - 0x15, 0x13, 0x19, 0x1f, 0x27, 0x21, 0x2b, 0x2d, 0x3f, 0x39, - 0x33, 0x35, 0x17, 0x11, 0x1b, 0x1d, 0x0f, 0x09, 0x03, 0x05, - 0x47, 0x41, 0x4b, 0x4d, 0x5f, 0x59, 0x53, 0x55, 0x77, 0x71, - 0x7b, 0x7d, 0x6f, 0x69, 0x63, 0x65, 0xe7, 0xe1, 0xeb, 0xed, - 0xff, 0xf9, 0xf3, 0xf5, 0xd7, 0xd1, 0xdb, 0xdd, 0xcf, 0xc9, - 0xc3, 0xc5, 0x87, 0x81, 0x8b, 0x8d, 0x9f, 0x99, 0x93, 0x95, - 0xb7, 0xb1, 0xbb, 0xbd, 0xaf, 0xa9, 0xa3, 0xa5, 0xba, 0xbc, - 0xb6, 0xb0, 0xa2, 0xa4, 0xae, 0xa8, 0x8a, 0x8c, 0x86, 0x80, - 0x92, 0x94, 0x9e, 0x98, 0xda, 0xdc, 0xd6, 0xd0, 0xc2, 0xc4, - 0xce, 0xc8, 0xea, 0xec, 0xe6, 0xe0, 0xf2, 0xf4, 0xfe, 0xf8, - 0x7a, 0x7c, 0x76, 0x70, 0x62, 0x64, 0x6e, 0x68, 0x4a, 0x4c, - 0x46, 0x40, 0x52, 0x54, 0x5e, 0x58, 0x1a, 0x1c, 0x16, 0x10, - 0x02, 0x04, 0x0e, 0x08, 0x2a, 0x2c, 0x26, 0x20, 0x32, 0x34, - 0x3e, 0x38, 0x00, 0x07, 0x0e, 0x09, 0x1c, 0x1b, 0x12, 0x15, - 0x38, 0x3f, 0x36, 0x31, 0x24, 0x23, 0x2a, 0x2d, 0x70, 0x77, - 0x7e, 0x79, 0x6c, 0x6b, 0x62, 0x65, 0x48, 0x4f, 0x46, 0x41, - 0x54, 0x53, 0x5a, 0x5d, 0xe0, 0xe7, 0xee, 0xe9, 0xfc, 0xfb, - 0xf2, 0xf5, 0xd8, 0xdf, 0xd6, 0xd1, 0xc4, 0xc3, 0xca, 0xcd, - 0x90, 0x97, 0x9e, 0x99, 0x8c, 0x8b, 0x82, 0x85, 0xa8, 0xaf, - 0xa6, 0xa1, 0xb4, 0xb3, 0xba, 0xbd, 0xdd, 0xda, 0xd3, 0xd4, - 0xc1, 0xc6, 0xcf, 0xc8, 0xe5, 0xe2, 0xeb, 0xec, 0xf9, 0xfe, - 0xf7, 0xf0, 0xad, 0xaa, 0xa3, 0xa4, 0xb1, 0xb6, 0xbf, 0xb8, - 0x95, 0x92, 0x9b, 0x9c, 0x89, 0x8e, 0x87, 0x80, 0x3d, 0x3a, - 0x33, 0x34, 0x21, 0x26, 0x2f, 0x28, 0x05, 0x02, 0x0b, 0x0c, - 0x19, 0x1e, 0x17, 0x10, 0x4d, 0x4a, 0x43, 0x44, 0x51, 0x56, - 0x5f, 0x58, 0x75, 0x72, 0x7b, 0x7c, 0x69, 0x6e, 0x67, 0x60, - 0xa7, 0xa0, 0xa9, 0xae, 0xbb, 0xbc, 0xb5, 0xb2, 0x9f, 0x98, - 0x91, 0x96, 0x83, 0x84, 0x8d, 0x8a, 0xd7, 0xd0, 0xd9, 0xde, - 0xcb, 0xcc, 0xc5, 0xc2, 0xef, 0xe8, 0xe1, 0xe6, 0xf3, 0xf4, - 0xfd, 0xfa, 0x47, 0x40, 0x49, 0x4e, 0x5b, 0x5c, 0x55, 0x52, - 0x7f, 0x78, 0x71, 0x76, 0x63, 0x64, 0x6d, 0x6a, 0x37, 0x30, - 0x39, 0x3e, 0x2b, 0x2c, 0x25, 0x22, 0x0f, 0x08, 0x01, 0x06, - 0x13, 0x14, 0x1d, 0x1a, 0x7a, 0x7d, 0x74, 0x73, 0x66, 0x61, - 0x68, 0x6f, 0x42, 0x45, 0x4c, 0x4b, 0x5e, 0x59, 0x50, 0x57, - 0x0a, 0x0d, 0x04, 0x03, 0x16, 0x11, 0x18, 0x1f, 0x32, 0x35, - 0x3c, 0x3b, 0x2e, 0x29, 0x20, 0x27, 0x9a, 0x9d, 0x94, 0x93, - 0x86, 0x81, 0x88, 0x8f, 0xa2, 0xa5, 0xac, 0xab, 0xbe, 0xb9, - 0xb0, 0xb7, 0xea, 0xed, 0xe4, 0xe3, 0xf6, 0xf1, 0xf8, 0xff, - 0xd2, 0xd5, 0xdc, 0xdb, 0xce, 0xc9, 0xc0, 0xc7, 0x00, 0x08, - 0x10, 0x18, 0x20, 0x28, 0x30, 0x38, 0x40, 0x48, 0x50, 0x58, - 0x60, 0x68, 0x70, 0x78, 0x80, 0x88, 0x90, 0x98, 0xa0, 0xa8, - 0xb0, 0xb8, 0xc0, 0xc8, 0xd0, 0xd8, 0xe0, 0xe8, 0xf0, 0xf8, - 0x1d, 0x15, 0x0d, 0x05, 0x3d, 0x35, 0x2d, 0x25, 0x5d, 0x55, - 0x4d, 0x45, 0x7d, 0x75, 0x6d, 0x65, 0x9d, 0x95, 0x8d, 0x85, - 0xbd, 0xb5, 0xad, 0xa5, 0xdd, 0xd5, 0xcd, 0xc5, 0xfd, 0xf5, - 0xed, 0xe5, 0x3a, 0x32, 0x2a, 0x22, 0x1a, 0x12, 0x0a, 0x02, - 0x7a, 0x72, 0x6a, 0x62, 0x5a, 0x52, 0x4a, 0x42, 0xba, 0xb2, - 0xaa, 0xa2, 0x9a, 0x92, 0x8a, 0x82, 0xfa, 0xf2, 0xea, 0xe2, - 0xda, 0xd2, 0xca, 0xc2, 0x27, 0x2f, 0x37, 0x3f, 0x07, 0x0f, - 0x17, 0x1f, 0x67, 0x6f, 0x77, 0x7f, 0x47, 0x4f, 0x57, 0x5f, - 0xa7, 0xaf, 0xb7, 0xbf, 0x87, 0x8f, 0x97, 0x9f, 0xe7, 0xef, - 0xf7, 0xff, 0xc7, 0xcf, 0xd7, 0xdf, 0x74, 0x7c, 0x64, 0x6c, - 0x54, 0x5c, 0x44, 0x4c, 0x34, 0x3c, 0x24, 0x2c, 0x14, 0x1c, - 0x04, 0x0c, 0xf4, 0xfc, 0xe4, 0xec, 0xd4, 0xdc, 0xc4, 0xcc, - 0xb4, 0xbc, 0xa4, 0xac, 0x94, 0x9c, 0x84, 0x8c, 0x69, 0x61, - 0x79, 0x71, 0x49, 0x41, 0x59, 0x51, 0x29, 0x21, 0x39, 0x31, - 0x09, 0x01, 0x19, 0x11, 0xe9, 0xe1, 0xf9, 0xf1, 0xc9, 0xc1, - 0xd9, 0xd1, 0xa9, 0xa1, 0xb9, 0xb1, 0x89, 0x81, 0x99, 0x91, - 0x4e, 0x46, 0x5e, 0x56, 0x6e, 0x66, 0x7e, 0x76, 0x0e, 0x06, - 0x1e, 0x16, 0x2e, 0x26, 0x3e, 0x36, 0xce, 0xc6, 0xde, 0xd6, - 0xee, 0xe6, 0xfe, 0xf6, 0x8e, 0x86, 0x9e, 0x96, 0xae, 0xa6, - 0xbe, 0xb6, 0x53, 0x5b, 0x43, 0x4b, 0x73, 0x7b, 0x63, 0x6b, - 0x13, 0x1b, 0x03, 0x0b, 0x33, 0x3b, 0x23, 0x2b, 0xd3, 0xdb, - 0xc3, 0xcb, 0xf3, 0xfb, 0xe3, 0xeb, 0x93, 0x9b, 0x83, 0x8b, - 0xb3, 0xbb, 0xa3, 0xab, 0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, - 0x36, 0x3f, 0x48, 0x41, 0x5a, 0x53, 0x6c, 0x65, 0x7e, 0x77, - 0x90, 0x99, 0x82, 0x8b, 0xb4, 0xbd, 0xa6, 0xaf, 0xd8, 0xd1, - 0xca, 0xc3, 0xfc, 0xf5, 0xee, 0xe7, 0x3d, 0x34, 0x2f, 0x26, - 0x19, 0x10, 0x0b, 0x02, 0x75, 0x7c, 0x67, 0x6e, 0x51, 0x58, - 0x43, 0x4a, 0xad, 0xa4, 0xbf, 0xb6, 0x89, 0x80, 0x9b, 0x92, - 0xe5, 0xec, 0xf7, 0xfe, 0xc1, 0xc8, 0xd3, 0xda, 0x7a, 0x73, - 0x68, 0x61, 0x5e, 0x57, 0x4c, 0x45, 0x32, 0x3b, 0x20, 0x29, - 0x16, 0x1f, 0x04, 0x0d, 0xea, 0xe3, 0xf8, 0xf1, 0xce, 0xc7, - 0xdc, 0xd5, 0xa2, 0xab, 0xb0, 0xb9, 0x86, 0x8f, 0x94, 0x9d, - 0x47, 0x4e, 0x55, 0x5c, 0x63, 0x6a, 0x71, 0x78, 0x0f, 0x06, - 0x1d, 0x14, 0x2b, 0x22, 0x39, 0x30, 0xd7, 0xde, 0xc5, 0xcc, - 0xf3, 0xfa, 0xe1, 0xe8, 0x9f, 0x96, 0x8d, 0x84, 0xbb, 0xb2, - 0xa9, 0xa0, 0xf4, 0xfd, 0xe6, 0xef, 0xd0, 0xd9, 0xc2, 0xcb, - 0xbc, 0xb5, 0xae, 0xa7, 0x98, 0x91, 0x8a, 0x83, 0x64, 0x6d, - 0x76, 0x7f, 0x40, 0x49, 0x52, 0x5b, 0x2c, 0x25, 0x3e, 0x37, - 0x08, 0x01, 0x1a, 0x13, 0xc9, 0xc0, 0xdb, 0xd2, 0xed, 0xe4, - 0xff, 0xf6, 0x81, 0x88, 0x93, 0x9a, 0xa5, 0xac, 0xb7, 0xbe, - 0x59, 0x50, 0x4b, 0x42, 0x7d, 0x74, 0x6f, 0x66, 0x11, 0x18, - 0x03, 0x0a, 0x35, 0x3c, 0x27, 0x2e, 0x8e, 0x87, 0x9c, 0x95, - 0xaa, 0xa3, 0xb8, 0xb1, 0xc6, 0xcf, 0xd4, 0xdd, 0xe2, 0xeb, - 0xf0, 0xf9, 0x1e, 0x17, 0x0c, 0x05, 0x3a, 0x33, 0x28, 0x21, - 0x56, 0x5f, 0x44, 0x4d, 0x72, 0x7b, 0x60, 0x69, 0xb3, 0xba, - 0xa1, 0xa8, 0x97, 0x9e, 0x85, 0x8c, 0xfb, 0xf2, 0xe9, 0xe0, - 0xdf, 0xd6, 0xcd, 0xc4, 0x23, 0x2a, 0x31, 0x38, 0x07, 0x0e, - 0x15, 0x1c, 0x6b, 0x62, 0x79, 0x70, 0x4f, 0x46, 0x5d, 0x54, - 0x00, 0x0a, 0x14, 0x1e, 0x28, 0x22, 0x3c, 0x36, 0x50, 0x5a, - 0x44, 0x4e, 0x78, 0x72, 0x6c, 0x66, 0xa0, 0xaa, 0xb4, 0xbe, - 0x88, 0x82, 0x9c, 0x96, 0xf0, 0xfa, 0xe4, 0xee, 0xd8, 0xd2, - 0xcc, 0xc6, 0x5d, 0x57, 0x49, 0x43, 0x75, 0x7f, 0x61, 0x6b, - 0x0d, 0x07, 0x19, 0x13, 0x25, 0x2f, 0x31, 0x3b, 0xfd, 0xf7, - 0xe9, 0xe3, 0xd5, 0xdf, 0xc1, 0xcb, 0xad, 0xa7, 0xb9, 0xb3, - 0x85, 0x8f, 0x91, 0x9b, 0xba, 0xb0, 0xae, 0xa4, 0x92, 0x98, - 0x86, 0x8c, 0xea, 0xe0, 0xfe, 0xf4, 0xc2, 0xc8, 0xd6, 0xdc, - 0x1a, 0x10, 0x0e, 0x04, 0x32, 0x38, 0x26, 0x2c, 0x4a, 0x40, - 0x5e, 0x54, 0x62, 0x68, 0x76, 0x7c, 0xe7, 0xed, 0xf3, 0xf9, - 0xcf, 0xc5, 0xdb, 0xd1, 0xb7, 0xbd, 0xa3, 0xa9, 0x9f, 0x95, - 0x8b, 0x81, 0x47, 0x4d, 0x53, 0x59, 0x6f, 0x65, 0x7b, 0x71, - 0x17, 0x1d, 0x03, 0x09, 0x3f, 0x35, 0x2b, 0x21, 0x69, 0x63, - 0x7d, 0x77, 0x41, 0x4b, 0x55, 0x5f, 0x39, 0x33, 0x2d, 0x27, - 0x11, 0x1b, 0x05, 0x0f, 0xc9, 0xc3, 0xdd, 0xd7, 0xe1, 0xeb, - 0xf5, 0xff, 0x99, 0x93, 0x8d, 0x87, 0xb1, 0xbb, 0xa5, 0xaf, - 0x34, 0x3e, 0x20, 0x2a, 0x1c, 0x16, 0x08, 0x02, 0x64, 0x6e, - 0x70, 0x7a, 0x4c, 0x46, 0x58, 0x52, 0x94, 0x9e, 0x80, 0x8a, - 0xbc, 0xb6, 0xa8, 0xa2, 0xc4, 0xce, 0xd0, 0xda, 0xec, 0xe6, - 0xf8, 0xf2, 0xd3, 0xd9, 0xc7, 0xcd, 0xfb, 0xf1, 0xef, 0xe5, - 0x83, 0x89, 0x97, 0x9d, 0xab, 0xa1, 0xbf, 0xb5, 0x73, 0x79, - 0x67, 0x6d, 0x5b, 0x51, 0x4f, 0x45, 0x23, 0x29, 0x37, 0x3d, - 0x0b, 0x01, 0x1f, 0x15, 0x8e, 0x84, 0x9a, 0x90, 0xa6, 0xac, - 0xb2, 0xb8, 0xde, 0xd4, 0xca, 0xc0, 0xf6, 0xfc, 0xe2, 0xe8, - 0x2e, 0x24, 0x3a, 0x30, 0x06, 0x0c, 0x12, 0x18, 0x7e, 0x74, - 0x6a, 0x60, 0x56, 0x5c, 0x42, 0x48, 0x00, 0x0b, 0x16, 0x1d, - 0x2c, 0x27, 0x3a, 0x31, 0x58, 0x53, 0x4e, 0x45, 0x74, 0x7f, - 0x62, 0x69, 0xb0, 0xbb, 0xa6, 0xad, 0x9c, 0x97, 0x8a, 0x81, - 0xe8, 0xe3, 0xfe, 0xf5, 0xc4, 0xcf, 0xd2, 0xd9, 0x7d, 0x76, - 0x6b, 0x60, 0x51, 0x5a, 0x47, 0x4c, 0x25, 0x2e, 0x33, 0x38, - 0x09, 0x02, 0x1f, 0x14, 0xcd, 0xc6, 0xdb, 0xd0, 0xe1, 0xea, - 0xf7, 0xfc, 0x95, 0x9e, 0x83, 0x88, 0xb9, 0xb2, 0xaf, 0xa4, - 0xfa, 0xf1, 0xec, 0xe7, 0xd6, 0xdd, 0xc0, 0xcb, 0xa2, 0xa9, - 0xb4, 0xbf, 0x8e, 0x85, 0x98, 0x93, 0x4a, 0x41, 0x5c, 0x57, - 0x66, 0x6d, 0x70, 0x7b, 0x12, 0x19, 0x04, 0x0f, 0x3e, 0x35, - 0x28, 0x23, 0x87, 0x8c, 0x91, 0x9a, 0xab, 0xa0, 0xbd, 0xb6, - 0xdf, 0xd4, 0xc9, 0xc2, 0xf3, 0xf8, 0xe5, 0xee, 0x37, 0x3c, - 0x21, 0x2a, 0x1b, 0x10, 0x0d, 0x06, 0x6f, 0x64, 0x79, 0x72, - 0x43, 0x48, 0x55, 0x5e, 0xe9, 0xe2, 0xff, 0xf4, 0xc5, 0xce, - 0xd3, 0xd8, 0xb1, 0xba, 0xa7, 0xac, 0x9d, 0x96, 0x8b, 0x80, - 0x59, 0x52, 0x4f, 0x44, 0x75, 0x7e, 0x63, 0x68, 0x01, 0x0a, - 0x17, 0x1c, 0x2d, 0x26, 0x3b, 0x30, 0x94, 0x9f, 0x82, 0x89, - 0xb8, 0xb3, 0xae, 0xa5, 0xcc, 0xc7, 0xda, 0xd1, 0xe0, 0xeb, - 0xf6, 0xfd, 0x24, 0x2f, 0x32, 0x39, 0x08, 0x03, 0x1e, 0x15, - 0x7c, 0x77, 0x6a, 0x61, 0x50, 0x5b, 0x46, 0x4d, 0x13, 0x18, - 0x05, 0x0e, 0x3f, 0x34, 0x29, 0x22, 0x4b, 0x40, 0x5d, 0x56, - 0x67, 0x6c, 0x71, 0x7a, 0xa3, 0xa8, 0xb5, 0xbe, 0x8f, 0x84, - 0x99, 0x92, 0xfb, 0xf0, 0xed, 0xe6, 0xd7, 0xdc, 0xc1, 0xca, - 0x6e, 0x65, 0x78, 0x73, 0x42, 0x49, 0x54, 0x5f, 0x36, 0x3d, - 0x20, 0x2b, 0x1a, 0x11, 0x0c, 0x07, 0xde, 0xd5, 0xc8, 0xc3, - 0xf2, 0xf9, 0xe4, 0xef, 0x86, 0x8d, 0x90, 0x9b, 0xaa, 0xa1, - 0xbc, 0xb7, 0x00, 0x0c, 0x18, 0x14, 0x30, 0x3c, 0x28, 0x24, - 0x60, 0x6c, 0x78, 0x74, 0x50, 0x5c, 0x48, 0x44, 0xc0, 0xcc, - 0xd8, 0xd4, 0xf0, 0xfc, 0xe8, 0xe4, 0xa0, 0xac, 0xb8, 0xb4, - 0x90, 0x9c, 0x88, 0x84, 0x9d, 0x91, 0x85, 0x89, 0xad, 0xa1, - 0xb5, 0xb9, 0xfd, 0xf1, 0xe5, 0xe9, 0xcd, 0xc1, 0xd5, 0xd9, - 0x5d, 0x51, 0x45, 0x49, 0x6d, 0x61, 0x75, 0x79, 0x3d, 0x31, - 0x25, 0x29, 0x0d, 0x01, 0x15, 0x19, 0x27, 0x2b, 0x3f, 0x33, - 0x17, 0x1b, 0x0f, 0x03, 0x47, 0x4b, 0x5f, 0x53, 0x77, 0x7b, - 0x6f, 0x63, 0xe7, 0xeb, 0xff, 0xf3, 0xd7, 0xdb, 0xcf, 0xc3, - 0x87, 0x8b, 0x9f, 0x93, 0xb7, 0xbb, 0xaf, 0xa3, 0xba, 0xb6, - 0xa2, 0xae, 0x8a, 0x86, 0x92, 0x9e, 0xda, 0xd6, 0xc2, 0xce, - 0xea, 0xe6, 0xf2, 0xfe, 0x7a, 0x76, 0x62, 0x6e, 0x4a, 0x46, - 0x52, 0x5e, 0x1a, 0x16, 0x02, 0x0e, 0x2a, 0x26, 0x32, 0x3e, - 0x4e, 0x42, 0x56, 0x5a, 0x7e, 0x72, 0x66, 0x6a, 0x2e, 0x22, - 0x36, 0x3a, 0x1e, 0x12, 0x06, 0x0a, 0x8e, 0x82, 0x96, 0x9a, - 0xbe, 0xb2, 0xa6, 0xaa, 0xee, 0xe2, 0xf6, 0xfa, 0xde, 0xd2, - 0xc6, 0xca, 0xd3, 0xdf, 0xcb, 0xc7, 0xe3, 0xef, 0xfb, 0xf7, - 0xb3, 0xbf, 0xab, 0xa7, 0x83, 0x8f, 0x9b, 0x97, 0x13, 0x1f, - 0x0b, 0x07, 0x23, 0x2f, 0x3b, 0x37, 0x73, 0x7f, 0x6b, 0x67, - 0x43, 0x4f, 0x5b, 0x57, 0x69, 0x65, 0x71, 0x7d, 0x59, 0x55, - 0x41, 0x4d, 0x09, 0x05, 0x11, 0x1d, 0x39, 0x35, 0x21, 0x2d, - 0xa9, 0xa5, 0xb1, 0xbd, 0x99, 0x95, 0x81, 0x8d, 0xc9, 0xc5, - 0xd1, 0xdd, 0xf9, 0xf5, 0xe1, 0xed, 0xf4, 0xf8, 0xec, 0xe0, - 0xc4, 0xc8, 0xdc, 0xd0, 0x94, 0x98, 0x8c, 0x80, 0xa4, 0xa8, - 0xbc, 0xb0, 0x34, 0x38, 0x2c, 0x20, 0x04, 0x08, 0x1c, 0x10, - 0x54, 0x58, 0x4c, 0x40, 0x64, 0x68, 0x7c, 0x70, 0x00, 0x0d, - 0x1a, 0x17, 0x34, 0x39, 0x2e, 0x23, 0x68, 0x65, 0x72, 0x7f, - 0x5c, 0x51, 0x46, 0x4b, 0xd0, 0xdd, 0xca, 0xc7, 0xe4, 0xe9, - 0xfe, 0xf3, 0xb8, 0xb5, 0xa2, 0xaf, 0x8c, 0x81, 0x96, 0x9b, - 0xbd, 0xb0, 0xa7, 0xaa, 0x89, 0x84, 0x93, 0x9e, 0xd5, 0xd8, - 0xcf, 0xc2, 0xe1, 0xec, 0xfb, 0xf6, 0x6d, 0x60, 0x77, 0x7a, - 0x59, 0x54, 0x43, 0x4e, 0x05, 0x08, 0x1f, 0x12, 0x31, 0x3c, - 0x2b, 0x26, 0x67, 0x6a, 0x7d, 0x70, 0x53, 0x5e, 0x49, 0x44, - 0x0f, 0x02, 0x15, 0x18, 0x3b, 0x36, 0x21, 0x2c, 0xb7, 0xba, - 0xad, 0xa0, 0x83, 0x8e, 0x99, 0x94, 0xdf, 0xd2, 0xc5, 0xc8, - 0xeb, 0xe6, 0xf1, 0xfc, 0xda, 0xd7, 0xc0, 0xcd, 0xee, 0xe3, - 0xf4, 0xf9, 0xb2, 0xbf, 0xa8, 0xa5, 0x86, 0x8b, 0x9c, 0x91, - 0x0a, 0x07, 0x10, 0x1d, 0x3e, 0x33, 0x24, 0x29, 0x62, 0x6f, - 0x78, 0x75, 0x56, 0x5b, 0x4c, 0x41, 0xce, 0xc3, 0xd4, 0xd9, - 0xfa, 0xf7, 0xe0, 0xed, 0xa6, 0xab, 0xbc, 0xb1, 0x92, 0x9f, - 0x88, 0x85, 0x1e, 0x13, 0x04, 0x09, 0x2a, 0x27, 0x30, 0x3d, - 0x76, 0x7b, 0x6c, 0x61, 0x42, 0x4f, 0x58, 0x55, 0x73, 0x7e, - 0x69, 0x64, 0x47, 0x4a, 0x5d, 0x50, 0x1b, 0x16, 0x01, 0x0c, - 0x2f, 0x22, 0x35, 0x38, 0xa3, 0xae, 0xb9, 0xb4, 0x97, 0x9a, - 0x8d, 0x80, 0xcb, 0xc6, 0xd1, 0xdc, 0xff, 0xf2, 0xe5, 0xe8, - 0xa9, 0xa4, 0xb3, 0xbe, 0x9d, 0x90, 0x87, 0x8a, 0xc1, 0xcc, - 0xdb, 0xd6, 0xf5, 0xf8, 0xef, 0xe2, 0x79, 0x74, 0x63, 0x6e, - 0x4d, 0x40, 0x57, 0x5a, 0x11, 0x1c, 0x0b, 0x06, 0x25, 0x28, - 0x3f, 0x32, 0x14, 0x19, 0x0e, 0x03, 0x20, 0x2d, 0x3a, 0x37, - 0x7c, 0x71, 0x66, 0x6b, 0x48, 0x45, 0x52, 0x5f, 0xc4, 0xc9, - 0xde, 0xd3, 0xf0, 0xfd, 0xea, 0xe7, 0xac, 0xa1, 0xb6, 0xbb, - 0x98, 0x95, 0x82, 0x8f, 0x00, 0x0e, 0x1c, 0x12, 0x38, 0x36, - 0x24, 0x2a, 0x70, 0x7e, 0x6c, 0x62, 0x48, 0x46, 0x54, 0x5a, - 0xe0, 0xee, 0xfc, 0xf2, 0xd8, 0xd6, 0xc4, 0xca, 0x90, 0x9e, - 0x8c, 0x82, 0xa8, 0xa6, 0xb4, 0xba, 0xdd, 0xd3, 0xc1, 0xcf, - 0xe5, 0xeb, 0xf9, 0xf7, 0xad, 0xa3, 0xb1, 0xbf, 0x95, 0x9b, - 0x89, 0x87, 0x3d, 0x33, 0x21, 0x2f, 0x05, 0x0b, 0x19, 0x17, - 0x4d, 0x43, 0x51, 0x5f, 0x75, 0x7b, 0x69, 0x67, 0xa7, 0xa9, - 0xbb, 0xb5, 0x9f, 0x91, 0x83, 0x8d, 0xd7, 0xd9, 0xcb, 0xc5, - 0xef, 0xe1, 0xf3, 0xfd, 0x47, 0x49, 0x5b, 0x55, 0x7f, 0x71, - 0x63, 0x6d, 0x37, 0x39, 0x2b, 0x25, 0x0f, 0x01, 0x13, 0x1d, - 0x7a, 0x74, 0x66, 0x68, 0x42, 0x4c, 0x5e, 0x50, 0x0a, 0x04, - 0x16, 0x18, 0x32, 0x3c, 0x2e, 0x20, 0x9a, 0x94, 0x86, 0x88, - 0xa2, 0xac, 0xbe, 0xb0, 0xea, 0xe4, 0xf6, 0xf8, 0xd2, 0xdc, - 0xce, 0xc0, 0x53, 0x5d, 0x4f, 0x41, 0x6b, 0x65, 0x77, 0x79, - 0x23, 0x2d, 0x3f, 0x31, 0x1b, 0x15, 0x07, 0x09, 0xb3, 0xbd, - 0xaf, 0xa1, 0x8b, 0x85, 0x97, 0x99, 0xc3, 0xcd, 0xdf, 0xd1, - 0xfb, 0xf5, 0xe7, 0xe9, 0x8e, 0x80, 0x92, 0x9c, 0xb6, 0xb8, - 0xaa, 0xa4, 0xfe, 0xf0, 0xe2, 0xec, 0xc6, 0xc8, 0xda, 0xd4, - 0x6e, 0x60, 0x72, 0x7c, 0x56, 0x58, 0x4a, 0x44, 0x1e, 0x10, - 0x02, 0x0c, 0x26, 0x28, 0x3a, 0x34, 0xf4, 0xfa, 0xe8, 0xe6, - 0xcc, 0xc2, 0xd0, 0xde, 0x84, 0x8a, 0x98, 0x96, 0xbc, 0xb2, - 0xa0, 0xae, 0x14, 0x1a, 0x08, 0x06, 0x2c, 0x22, 0x30, 0x3e, - 0x64, 0x6a, 0x78, 0x76, 0x5c, 0x52, 0x40, 0x4e, 0x29, 0x27, - 0x35, 0x3b, 0x11, 0x1f, 0x0d, 0x03, 0x59, 0x57, 0x45, 0x4b, - 0x61, 0x6f, 0x7d, 0x73, 0xc9, 0xc7, 0xd5, 0xdb, 0xf1, 0xff, - 0xed, 0xe3, 0xb9, 0xb7, 0xa5, 0xab, 0x81, 0x8f, 0x9d, 0x93, - 0x00, 0x0f, 0x1e, 0x11, 0x3c, 0x33, 0x22, 0x2d, 0x78, 0x77, - 0x66, 0x69, 0x44, 0x4b, 0x5a, 0x55, 0xf0, 0xff, 0xee, 0xe1, - 0xcc, 0xc3, 0xd2, 0xdd, 0x88, 0x87, 0x96, 0x99, 0xb4, 0xbb, - 0xaa, 0xa5, 0xfd, 0xf2, 0xe3, 0xec, 0xc1, 0xce, 0xdf, 0xd0, - 0x85, 0x8a, 0x9b, 0x94, 0xb9, 0xb6, 0xa7, 0xa8, 0x0d, 0x02, - 0x13, 0x1c, 0x31, 0x3e, 0x2f, 0x20, 0x75, 0x7a, 0x6b, 0x64, - 0x49, 0x46, 0x57, 0x58, 0xe7, 0xe8, 0xf9, 0xf6, 0xdb, 0xd4, - 0xc5, 0xca, 0x9f, 0x90, 0x81, 0x8e, 0xa3, 0xac, 0xbd, 0xb2, - 0x17, 0x18, 0x09, 0x06, 0x2b, 0x24, 0x35, 0x3a, 0x6f, 0x60, - 0x71, 0x7e, 0x53, 0x5c, 0x4d, 0x42, 0x1a, 0x15, 0x04, 0x0b, - 0x26, 0x29, 0x38, 0x37, 0x62, 0x6d, 0x7c, 0x73, 0x5e, 0x51, - 0x40, 0x4f, 0xea, 0xe5, 0xf4, 0xfb, 0xd6, 0xd9, 0xc8, 0xc7, - 0x92, 0x9d, 0x8c, 0x83, 0xae, 0xa1, 0xb0, 0xbf, 0xd3, 0xdc, - 0xcd, 0xc2, 0xef, 0xe0, 0xf1, 0xfe, 0xab, 0xa4, 0xb5, 0xba, - 0x97, 0x98, 0x89, 0x86, 0x23, 0x2c, 0x3d, 0x32, 0x1f, 0x10, - 0x01, 0x0e, 0x5b, 0x54, 0x45, 0x4a, 0x67, 0x68, 0x79, 0x76, - 0x2e, 0x21, 0x30, 0x3f, 0x12, 0x1d, 0x0c, 0x03, 0x56, 0x59, - 0x48, 0x47, 0x6a, 0x65, 0x74, 0x7b, 0xde, 0xd1, 0xc0, 0xcf, - 0xe2, 0xed, 0xfc, 0xf3, 0xa6, 0xa9, 0xb8, 0xb7, 0x9a, 0x95, - 0x84, 0x8b, 0x34, 0x3b, 0x2a, 0x25, 0x08, 0x07, 0x16, 0x19, - 0x4c, 0x43, 0x52, 0x5d, 0x70, 0x7f, 0x6e, 0x61, 0xc4, 0xcb, - 0xda, 0xd5, 0xf8, 0xf7, 0xe6, 0xe9, 0xbc, 0xb3, 0xa2, 0xad, - 0x80, 0x8f, 0x9e, 0x91, 0xc9, 0xc6, 0xd7, 0xd8, 0xf5, 0xfa, - 0xeb, 0xe4, 0xb1, 0xbe, 0xaf, 0xa0, 0x8d, 0x82, 0x93, 0x9c, - 0x39, 0x36, 0x27, 0x28, 0x05, 0x0a, 0x1b, 0x14, 0x41, 0x4e, - 0x5f, 0x50, 0x7d, 0x72, 0x63, 0x6c, 0x00, 0x10, 0x20, 0x30, - 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, 0xa0, 0xb0, 0xc0, 0xd0, - 0xe0, 0xf0, 0x1d, 0x0d, 0x3d, 0x2d, 0x5d, 0x4d, 0x7d, 0x6d, - 0x9d, 0x8d, 0xbd, 0xad, 0xdd, 0xcd, 0xfd, 0xed, 0x3a, 0x2a, - 0x1a, 0x0a, 0x7a, 0x6a, 0x5a, 0x4a, 0xba, 0xaa, 0x9a, 0x8a, - 0xfa, 0xea, 0xda, 0xca, 0x27, 0x37, 0x07, 0x17, 0x67, 0x77, - 0x47, 0x57, 0xa7, 0xb7, 0x87, 0x97, 0xe7, 0xf7, 0xc7, 0xd7, - 0x74, 0x64, 0x54, 0x44, 0x34, 0x24, 0x14, 0x04, 0xf4, 0xe4, - 0xd4, 0xc4, 0xb4, 0xa4, 0x94, 0x84, 0x69, 0x79, 0x49, 0x59, - 0x29, 0x39, 0x09, 0x19, 0xe9, 0xf9, 0xc9, 0xd9, 0xa9, 0xb9, - 0x89, 0x99, 0x4e, 0x5e, 0x6e, 0x7e, 0x0e, 0x1e, 0x2e, 0x3e, - 0xce, 0xde, 0xee, 0xfe, 0x8e, 0x9e, 0xae, 0xbe, 0x53, 0x43, - 0x73, 0x63, 0x13, 0x03, 0x33, 0x23, 0xd3, 0xc3, 0xf3, 0xe3, - 0x93, 0x83, 0xb3, 0xa3, 0xe8, 0xf8, 0xc8, 0xd8, 0xa8, 0xb8, - 0x88, 0x98, 0x68, 0x78, 0x48, 0x58, 0x28, 0x38, 0x08, 0x18, - 0xf5, 0xe5, 0xd5, 0xc5, 0xb5, 0xa5, 0x95, 0x85, 0x75, 0x65, - 0x55, 0x45, 0x35, 0x25, 0x15, 0x05, 0xd2, 0xc2, 0xf2, 0xe2, - 0x92, 0x82, 0xb2, 0xa2, 0x52, 0x42, 0x72, 0x62, 0x12, 0x02, - 0x32, 0x22, 0xcf, 0xdf, 0xef, 0xff, 0x8f, 0x9f, 0xaf, 0xbf, - 0x4f, 0x5f, 0x6f, 0x7f, 0x0f, 0x1f, 0x2f, 0x3f, 0x9c, 0x8c, - 0xbc, 0xac, 0xdc, 0xcc, 0xfc, 0xec, 0x1c, 0x0c, 0x3c, 0x2c, - 0x5c, 0x4c, 0x7c, 0x6c, 0x81, 0x91, 0xa1, 0xb1, 0xc1, 0xd1, - 0xe1, 0xf1, 0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71, - 0xa6, 0xb6, 0x86, 0x96, 0xe6, 0xf6, 0xc6, 0xd6, 0x26, 0x36, - 0x06, 0x16, 0x66, 0x76, 0x46, 0x56, 0xbb, 0xab, 0x9b, 0x8b, - 0xfb, 0xeb, 0xdb, 0xcb, 0x3b, 0x2b, 0x1b, 0x0b, 0x7b, 0x6b, - 0x5b, 0x4b, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, - 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x0d, 0x1c, - 0x2f, 0x3e, 0x49, 0x58, 0x6b, 0x7a, 0x85, 0x94, 0xa7, 0xb6, - 0xc1, 0xd0, 0xe3, 0xf2, 0x1a, 0x0b, 0x38, 0x29, 0x5e, 0x4f, - 0x7c, 0x6d, 0x92, 0x83, 0xb0, 0xa1, 0xd6, 0xc7, 0xf4, 0xe5, - 0x17, 0x06, 0x35, 0x24, 0x53, 0x42, 0x71, 0x60, 0x9f, 0x8e, - 0xbd, 0xac, 0xdb, 0xca, 0xf9, 0xe8, 0x34, 0x25, 0x16, 0x07, - 0x70, 0x61, 0x52, 0x43, 0xbc, 0xad, 0x9e, 0x8f, 0xf8, 0xe9, - 0xda, 0xcb, 0x39, 0x28, 0x1b, 0x0a, 0x7d, 0x6c, 0x5f, 0x4e, - 0xb1, 0xa0, 0x93, 0x82, 0xf5, 0xe4, 0xd7, 0xc6, 0x2e, 0x3f, - 0x0c, 0x1d, 0x6a, 0x7b, 0x48, 0x59, 0xa6, 0xb7, 0x84, 0x95, - 0xe2, 0xf3, 0xc0, 0xd1, 0x23, 0x32, 0x01, 0x10, 0x67, 0x76, - 0x45, 0x54, 0xab, 0xba, 0x89, 0x98, 0xef, 0xfe, 0xcd, 0xdc, - 0x68, 0x79, 0x4a, 0x5b, 0x2c, 0x3d, 0x0e, 0x1f, 0xe0, 0xf1, - 0xc2, 0xd3, 0xa4, 0xb5, 0x86, 0x97, 0x65, 0x74, 0x47, 0x56, - 0x21, 0x30, 0x03, 0x12, 0xed, 0xfc, 0xcf, 0xde, 0xa9, 0xb8, - 0x8b, 0x9a, 0x72, 0x63, 0x50, 0x41, 0x36, 0x27, 0x14, 0x05, - 0xfa, 0xeb, 0xd8, 0xc9, 0xbe, 0xaf, 0x9c, 0x8d, 0x7f, 0x6e, - 0x5d, 0x4c, 0x3b, 0x2a, 0x19, 0x08, 0xf7, 0xe6, 0xd5, 0xc4, - 0xb3, 0xa2, 0x91, 0x80, 0x5c, 0x4d, 0x7e, 0x6f, 0x18, 0x09, - 0x3a, 0x2b, 0xd4, 0xc5, 0xf6, 0xe7, 0x90, 0x81, 0xb2, 0xa3, - 0x51, 0x40, 0x73, 0x62, 0x15, 0x04, 0x37, 0x26, 0xd9, 0xc8, - 0xfb, 0xea, 0x9d, 0x8c, 0xbf, 0xae, 0x46, 0x57, 0x64, 0x75, - 0x02, 0x13, 0x20, 0x31, 0xce, 0xdf, 0xec, 0xfd, 0x8a, 0x9b, - 0xa8, 0xb9, 0x4b, 0x5a, 0x69, 0x78, 0x0f, 0x1e, 0x2d, 0x3c, - 0xc3, 0xd2, 0xe1, 0xf0, 0x87, 0x96, 0xa5, 0xb4, 0x00, 0x12, - 0x24, 0x36, 0x48, 0x5a, 0x6c, 0x7e, 0x90, 0x82, 0xb4, 0xa6, - 0xd8, 0xca, 0xfc, 0xee, 0x3d, 0x2f, 0x19, 0x0b, 0x75, 0x67, - 0x51, 0x43, 0xad, 0xbf, 0x89, 0x9b, 0xe5, 0xf7, 0xc1, 0xd3, - 0x7a, 0x68, 0x5e, 0x4c, 0x32, 0x20, 0x16, 0x04, 0xea, 0xf8, - 0xce, 0xdc, 0xa2, 0xb0, 0x86, 0x94, 0x47, 0x55, 0x63, 0x71, - 0x0f, 0x1d, 0x2b, 0x39, 0xd7, 0xc5, 0xf3, 0xe1, 0x9f, 0x8d, - 0xbb, 0xa9, 0xf4, 0xe6, 0xd0, 0xc2, 0xbc, 0xae, 0x98, 0x8a, - 0x64, 0x76, 0x40, 0x52, 0x2c, 0x3e, 0x08, 0x1a, 0xc9, 0xdb, - 0xed, 0xff, 0x81, 0x93, 0xa5, 0xb7, 0x59, 0x4b, 0x7d, 0x6f, - 0x11, 0x03, 0x35, 0x27, 0x8e, 0x9c, 0xaa, 0xb8, 0xc6, 0xd4, - 0xe2, 0xf0, 0x1e, 0x0c, 0x3a, 0x28, 0x56, 0x44, 0x72, 0x60, - 0xb3, 0xa1, 0x97, 0x85, 0xfb, 0xe9, 0xdf, 0xcd, 0x23, 0x31, - 0x07, 0x15, 0x6b, 0x79, 0x4f, 0x5d, 0xf5, 0xe7, 0xd1, 0xc3, - 0xbd, 0xaf, 0x99, 0x8b, 0x65, 0x77, 0x41, 0x53, 0x2d, 0x3f, - 0x09, 0x1b, 0xc8, 0xda, 0xec, 0xfe, 0x80, 0x92, 0xa4, 0xb6, - 0x58, 0x4a, 0x7c, 0x6e, 0x10, 0x02, 0x34, 0x26, 0x8f, 0x9d, - 0xab, 0xb9, 0xc7, 0xd5, 0xe3, 0xf1, 0x1f, 0x0d, 0x3b, 0x29, - 0x57, 0x45, 0x73, 0x61, 0xb2, 0xa0, 0x96, 0x84, 0xfa, 0xe8, - 0xde, 0xcc, 0x22, 0x30, 0x06, 0x14, 0x6a, 0x78, 0x4e, 0x5c, - 0x01, 0x13, 0x25, 0x37, 0x49, 0x5b, 0x6d, 0x7f, 0x91, 0x83, - 0xb5, 0xa7, 0xd9, 0xcb, 0xfd, 0xef, 0x3c, 0x2e, 0x18, 0x0a, - 0x74, 0x66, 0x50, 0x42, 0xac, 0xbe, 0x88, 0x9a, 0xe4, 0xf6, - 0xc0, 0xd2, 0x7b, 0x69, 0x5f, 0x4d, 0x33, 0x21, 0x17, 0x05, - 0xeb, 0xf9, 0xcf, 0xdd, 0xa3, 0xb1, 0x87, 0x95, 0x46, 0x54, - 0x62, 0x70, 0x0e, 0x1c, 0x2a, 0x38, 0xd6, 0xc4, 0xf2, 0xe0, - 0x9e, 0x8c, 0xba, 0xa8, 0x00, 0x13, 0x26, 0x35, 0x4c, 0x5f, - 0x6a, 0x79, 0x98, 0x8b, 0xbe, 0xad, 0xd4, 0xc7, 0xf2, 0xe1, - 0x2d, 0x3e, 0x0b, 0x18, 0x61, 0x72, 0x47, 0x54, 0xb5, 0xa6, - 0x93, 0x80, 0xf9, 0xea, 0xdf, 0xcc, 0x5a, 0x49, 0x7c, 0x6f, - 0x16, 0x05, 0x30, 0x23, 0xc2, 0xd1, 0xe4, 0xf7, 0x8e, 0x9d, - 0xa8, 0xbb, 0x77, 0x64, 0x51, 0x42, 0x3b, 0x28, 0x1d, 0x0e, - 0xef, 0xfc, 0xc9, 0xda, 0xa3, 0xb0, 0x85, 0x96, 0xb4, 0xa7, - 0x92, 0x81, 0xf8, 0xeb, 0xde, 0xcd, 0x2c, 0x3f, 0x0a, 0x19, - 0x60, 0x73, 0x46, 0x55, 0x99, 0x8a, 0xbf, 0xac, 0xd5, 0xc6, - 0xf3, 0xe0, 0x01, 0x12, 0x27, 0x34, 0x4d, 0x5e, 0x6b, 0x78, - 0xee, 0xfd, 0xc8, 0xdb, 0xa2, 0xb1, 0x84, 0x97, 0x76, 0x65, - 0x50, 0x43, 0x3a, 0x29, 0x1c, 0x0f, 0xc3, 0xd0, 0xe5, 0xf6, - 0x8f, 0x9c, 0xa9, 0xba, 0x5b, 0x48, 0x7d, 0x6e, 0x17, 0x04, - 0x31, 0x22, 0x75, 0x66, 0x53, 0x40, 0x39, 0x2a, 0x1f, 0x0c, - 0xed, 0xfe, 0xcb, 0xd8, 0xa1, 0xb2, 0x87, 0x94, 0x58, 0x4b, - 0x7e, 0x6d, 0x14, 0x07, 0x32, 0x21, 0xc0, 0xd3, 0xe6, 0xf5, - 0x8c, 0x9f, 0xaa, 0xb9, 0x2f, 0x3c, 0x09, 0x1a, 0x63, 0x70, - 0x45, 0x56, 0xb7, 0xa4, 0x91, 0x82, 0xfb, 0xe8, 0xdd, 0xce, - 0x02, 0x11, 0x24, 0x37, 0x4e, 0x5d, 0x68, 0x7b, 0x9a, 0x89, - 0xbc, 0xaf, 0xd6, 0xc5, 0xf0, 0xe3, 0xc1, 0xd2, 0xe7, 0xf4, - 0x8d, 0x9e, 0xab, 0xb8, 0x59, 0x4a, 0x7f, 0x6c, 0x15, 0x06, - 0x33, 0x20, 0xec, 0xff, 0xca, 0xd9, 0xa0, 0xb3, 0x86, 0x95, - 0x74, 0x67, 0x52, 0x41, 0x38, 0x2b, 0x1e, 0x0d, 0x9b, 0x88, - 0xbd, 0xae, 0xd7, 0xc4, 0xf1, 0xe2, 0x03, 0x10, 0x25, 0x36, - 0x4f, 0x5c, 0x69, 0x7a, 0xb6, 0xa5, 0x90, 0x83, 0xfa, 0xe9, - 0xdc, 0xcf, 0x2e, 0x3d, 0x08, 0x1b, 0x62, 0x71, 0x44, 0x57, - 0x00, 0x14, 0x28, 0x3c, 0x50, 0x44, 0x78, 0x6c, 0xa0, 0xb4, - 0x88, 0x9c, 0xf0, 0xe4, 0xd8, 0xcc, 0x5d, 0x49, 0x75, 0x61, - 0x0d, 0x19, 0x25, 0x31, 0xfd, 0xe9, 0xd5, 0xc1, 0xad, 0xb9, - 0x85, 0x91, 0xba, 0xae, 0x92, 0x86, 0xea, 0xfe, 0xc2, 0xd6, - 0x1a, 0x0e, 0x32, 0x26, 0x4a, 0x5e, 0x62, 0x76, 0xe7, 0xf3, - 0xcf, 0xdb, 0xb7, 0xa3, 0x9f, 0x8b, 0x47, 0x53, 0x6f, 0x7b, - 0x17, 0x03, 0x3f, 0x2b, 0x69, 0x7d, 0x41, 0x55, 0x39, 0x2d, - 0x11, 0x05, 0xc9, 0xdd, 0xe1, 0xf5, 0x99, 0x8d, 0xb1, 0xa5, - 0x34, 0x20, 0x1c, 0x08, 0x64, 0x70, 0x4c, 0x58, 0x94, 0x80, - 0xbc, 0xa8, 0xc4, 0xd0, 0xec, 0xf8, 0xd3, 0xc7, 0xfb, 0xef, - 0x83, 0x97, 0xab, 0xbf, 0x73, 0x67, 0x5b, 0x4f, 0x23, 0x37, - 0x0b, 0x1f, 0x8e, 0x9a, 0xa6, 0xb2, 0xde, 0xca, 0xf6, 0xe2, - 0x2e, 0x3a, 0x06, 0x12, 0x7e, 0x6a, 0x56, 0x42, 0xd2, 0xc6, - 0xfa, 0xee, 0x82, 0x96, 0xaa, 0xbe, 0x72, 0x66, 0x5a, 0x4e, - 0x22, 0x36, 0x0a, 0x1e, 0x8f, 0x9b, 0xa7, 0xb3, 0xdf, 0xcb, - 0xf7, 0xe3, 0x2f, 0x3b, 0x07, 0x13, 0x7f, 0x6b, 0x57, 0x43, - 0x68, 0x7c, 0x40, 0x54, 0x38, 0x2c, 0x10, 0x04, 0xc8, 0xdc, - 0xe0, 0xf4, 0x98, 0x8c, 0xb0, 0xa4, 0x35, 0x21, 0x1d, 0x09, - 0x65, 0x71, 0x4d, 0x59, 0x95, 0x81, 0xbd, 0xa9, 0xc5, 0xd1, - 0xed, 0xf9, 0xbb, 0xaf, 0x93, 0x87, 0xeb, 0xff, 0xc3, 0xd7, - 0x1b, 0x0f, 0x33, 0x27, 0x4b, 0x5f, 0x63, 0x77, 0xe6, 0xf2, - 0xce, 0xda, 0xb6, 0xa2, 0x9e, 0x8a, 0x46, 0x52, 0x6e, 0x7a, - 0x16, 0x02, 0x3e, 0x2a, 0x01, 0x15, 0x29, 0x3d, 0x51, 0x45, - 0x79, 0x6d, 0xa1, 0xb5, 0x89, 0x9d, 0xf1, 0xe5, 0xd9, 0xcd, - 0x5c, 0x48, 0x74, 0x60, 0x0c, 0x18, 0x24, 0x30, 0xfc, 0xe8, - 0xd4, 0xc0, 0xac, 0xb8, 0x84, 0x90, 0x00, 0x15, 0x2a, 0x3f, - 0x54, 0x41, 0x7e, 0x6b, 0xa8, 0xbd, 0x82, 0x97, 0xfc, 0xe9, - 0xd6, 0xc3, 0x4d, 0x58, 0x67, 0x72, 0x19, 0x0c, 0x33, 0x26, - 0xe5, 0xf0, 0xcf, 0xda, 0xb1, 0xa4, 0x9b, 0x8e, 0x9a, 0x8f, - 0xb0, 0xa5, 0xce, 0xdb, 0xe4, 0xf1, 0x32, 0x27, 0x18, 0x0d, - 0x66, 0x73, 0x4c, 0x59, 0xd7, 0xc2, 0xfd, 0xe8, 0x83, 0x96, - 0xa9, 0xbc, 0x7f, 0x6a, 0x55, 0x40, 0x2b, 0x3e, 0x01, 0x14, - 0x29, 0x3c, 0x03, 0x16, 0x7d, 0x68, 0x57, 0x42, 0x81, 0x94, - 0xab, 0xbe, 0xd5, 0xc0, 0xff, 0xea, 0x64, 0x71, 0x4e, 0x5b, - 0x30, 0x25, 0x1a, 0x0f, 0xcc, 0xd9, 0xe6, 0xf3, 0x98, 0x8d, - 0xb2, 0xa7, 0xb3, 0xa6, 0x99, 0x8c, 0xe7, 0xf2, 0xcd, 0xd8, - 0x1b, 0x0e, 0x31, 0x24, 0x4f, 0x5a, 0x65, 0x70, 0xfe, 0xeb, - 0xd4, 0xc1, 0xaa, 0xbf, 0x80, 0x95, 0x56, 0x43, 0x7c, 0x69, - 0x02, 0x17, 0x28, 0x3d, 0x52, 0x47, 0x78, 0x6d, 0x06, 0x13, - 0x2c, 0x39, 0xfa, 0xef, 0xd0, 0xc5, 0xae, 0xbb, 0x84, 0x91, - 0x1f, 0x0a, 0x35, 0x20, 0x4b, 0x5e, 0x61, 0x74, 0xb7, 0xa2, - 0x9d, 0x88, 0xe3, 0xf6, 0xc9, 0xdc, 0xc8, 0xdd, 0xe2, 0xf7, - 0x9c, 0x89, 0xb6, 0xa3, 0x60, 0x75, 0x4a, 0x5f, 0x34, 0x21, - 0x1e, 0x0b, 0x85, 0x90, 0xaf, 0xba, 0xd1, 0xc4, 0xfb, 0xee, - 0x2d, 0x38, 0x07, 0x12, 0x79, 0x6c, 0x53, 0x46, 0x7b, 0x6e, - 0x51, 0x44, 0x2f, 0x3a, 0x05, 0x10, 0xd3, 0xc6, 0xf9, 0xec, - 0x87, 0x92, 0xad, 0xb8, 0x36, 0x23, 0x1c, 0x09, 0x62, 0x77, - 0x48, 0x5d, 0x9e, 0x8b, 0xb4, 0xa1, 0xca, 0xdf, 0xe0, 0xf5, - 0xe1, 0xf4, 0xcb, 0xde, 0xb5, 0xa0, 0x9f, 0x8a, 0x49, 0x5c, - 0x63, 0x76, 0x1d, 0x08, 0x37, 0x22, 0xac, 0xb9, 0x86, 0x93, - 0xf8, 0xed, 0xd2, 0xc7, 0x04, 0x11, 0x2e, 0x3b, 0x50, 0x45, - 0x7a, 0x6f, 0x00, 0x16, 0x2c, 0x3a, 0x58, 0x4e, 0x74, 0x62, - 0xb0, 0xa6, 0x9c, 0x8a, 0xe8, 0xfe, 0xc4, 0xd2, 0x7d, 0x6b, - 0x51, 0x47, 0x25, 0x33, 0x09, 0x1f, 0xcd, 0xdb, 0xe1, 0xf7, - 0x95, 0x83, 0xb9, 0xaf, 0xfa, 0xec, 0xd6, 0xc0, 0xa2, 0xb4, - 0x8e, 0x98, 0x4a, 0x5c, 0x66, 0x70, 0x12, 0x04, 0x3e, 0x28, - 0x87, 0x91, 0xab, 0xbd, 0xdf, 0xc9, 0xf3, 0xe5, 0x37, 0x21, - 0x1b, 0x0d, 0x6f, 0x79, 0x43, 0x55, 0xe9, 0xff, 0xc5, 0xd3, - 0xb1, 0xa7, 0x9d, 0x8b, 0x59, 0x4f, 0x75, 0x63, 0x01, 0x17, - 0x2d, 0x3b, 0x94, 0x82, 0xb8, 0xae, 0xcc, 0xda, 0xe0, 0xf6, - 0x24, 0x32, 0x08, 0x1e, 0x7c, 0x6a, 0x50, 0x46, 0x13, 0x05, - 0x3f, 0x29, 0x4b, 0x5d, 0x67, 0x71, 0xa3, 0xb5, 0x8f, 0x99, - 0xfb, 0xed, 0xd7, 0xc1, 0x6e, 0x78, 0x42, 0x54, 0x36, 0x20, - 0x1a, 0x0c, 0xde, 0xc8, 0xf2, 0xe4, 0x86, 0x90, 0xaa, 0xbc, - 0xcf, 0xd9, 0xe3, 0xf5, 0x97, 0x81, 0xbb, 0xad, 0x7f, 0x69, - 0x53, 0x45, 0x27, 0x31, 0x0b, 0x1d, 0xb2, 0xa4, 0x9e, 0x88, - 0xea, 0xfc, 0xc6, 0xd0, 0x02, 0x14, 0x2e, 0x38, 0x5a, 0x4c, - 0x76, 0x60, 0x35, 0x23, 0x19, 0x0f, 0x6d, 0x7b, 0x41, 0x57, - 0x85, 0x93, 0xa9, 0xbf, 0xdd, 0xcb, 0xf1, 0xe7, 0x48, 0x5e, - 0x64, 0x72, 0x10, 0x06, 0x3c, 0x2a, 0xf8, 0xee, 0xd4, 0xc2, - 0xa0, 0xb6, 0x8c, 0x9a, 0x26, 0x30, 0x0a, 0x1c, 0x7e, 0x68, - 0x52, 0x44, 0x96, 0x80, 0xba, 0xac, 0xce, 0xd8, 0xe2, 0xf4, - 0x5b, 0x4d, 0x77, 0x61, 0x03, 0x15, 0x2f, 0x39, 0xeb, 0xfd, - 0xc7, 0xd1, 0xb3, 0xa5, 0x9f, 0x89, 0xdc, 0xca, 0xf0, 0xe6, - 0x84, 0x92, 0xa8, 0xbe, 0x6c, 0x7a, 0x40, 0x56, 0x34, 0x22, - 0x18, 0x0e, 0xa1, 0xb7, 0x8d, 0x9b, 0xf9, 0xef, 0xd5, 0xc3, - 0x11, 0x07, 0x3d, 0x2b, 0x49, 0x5f, 0x65, 0x73, 0x00, 0x17, - 0x2e, 0x39, 0x5c, 0x4b, 0x72, 0x65, 0xb8, 0xaf, 0x96, 0x81, - 0xe4, 0xf3, 0xca, 0xdd, 0x6d, 0x7a, 0x43, 0x54, 0x31, 0x26, - 0x1f, 0x08, 0xd5, 0xc2, 0xfb, 0xec, 0x89, 0x9e, 0xa7, 0xb0, - 0xda, 0xcd, 0xf4, 0xe3, 0x86, 0x91, 0xa8, 0xbf, 0x62, 0x75, - 0x4c, 0x5b, 0x3e, 0x29, 0x10, 0x07, 0xb7, 0xa0, 0x99, 0x8e, - 0xeb, 0xfc, 0xc5, 0xd2, 0x0f, 0x18, 0x21, 0x36, 0x53, 0x44, - 0x7d, 0x6a, 0xa9, 0xbe, 0x87, 0x90, 0xf5, 0xe2, 0xdb, 0xcc, - 0x11, 0x06, 0x3f, 0x28, 0x4d, 0x5a, 0x63, 0x74, 0xc4, 0xd3, - 0xea, 0xfd, 0x98, 0x8f, 0xb6, 0xa1, 0x7c, 0x6b, 0x52, 0x45, - 0x20, 0x37, 0x0e, 0x19, 0x73, 0x64, 0x5d, 0x4a, 0x2f, 0x38, - 0x01, 0x16, 0xcb, 0xdc, 0xe5, 0xf2, 0x97, 0x80, 0xb9, 0xae, - 0x1e, 0x09, 0x30, 0x27, 0x42, 0x55, 0x6c, 0x7b, 0xa6, 0xb1, - 0x88, 0x9f, 0xfa, 0xed, 0xd4, 0xc3, 0x4f, 0x58, 0x61, 0x76, - 0x13, 0x04, 0x3d, 0x2a, 0xf7, 0xe0, 0xd9, 0xce, 0xab, 0xbc, - 0x85, 0x92, 0x22, 0x35, 0x0c, 0x1b, 0x7e, 0x69, 0x50, 0x47, - 0x9a, 0x8d, 0xb4, 0xa3, 0xc6, 0xd1, 0xe8, 0xff, 0x95, 0x82, - 0xbb, 0xac, 0xc9, 0xde, 0xe7, 0xf0, 0x2d, 0x3a, 0x03, 0x14, - 0x71, 0x66, 0x5f, 0x48, 0xf8, 0xef, 0xd6, 0xc1, 0xa4, 0xb3, - 0x8a, 0x9d, 0x40, 0x57, 0x6e, 0x79, 0x1c, 0x0b, 0x32, 0x25, - 0xe6, 0xf1, 0xc8, 0xdf, 0xba, 0xad, 0x94, 0x83, 0x5e, 0x49, - 0x70, 0x67, 0x02, 0x15, 0x2c, 0x3b, 0x8b, 0x9c, 0xa5, 0xb2, - 0xd7, 0xc0, 0xf9, 0xee, 0x33, 0x24, 0x1d, 0x0a, 0x6f, 0x78, - 0x41, 0x56, 0x3c, 0x2b, 0x12, 0x05, 0x60, 0x77, 0x4e, 0x59, - 0x84, 0x93, 0xaa, 0xbd, 0xd8, 0xcf, 0xf6, 0xe1, 0x51, 0x46, - 0x7f, 0x68, 0x0d, 0x1a, 0x23, 0x34, 0xe9, 0xfe, 0xc7, 0xd0, - 0xb5, 0xa2, 0x9b, 0x8c, 0x00, 0x18, 0x30, 0x28, 0x60, 0x78, - 0x50, 0x48, 0xc0, 0xd8, 0xf0, 0xe8, 0xa0, 0xb8, 0x90, 0x88, - 0x9d, 0x85, 0xad, 0xb5, 0xfd, 0xe5, 0xcd, 0xd5, 0x5d, 0x45, - 0x6d, 0x75, 0x3d, 0x25, 0x0d, 0x15, 0x27, 0x3f, 0x17, 0x0f, - 0x47, 0x5f, 0x77, 0x6f, 0xe7, 0xff, 0xd7, 0xcf, 0x87, 0x9f, - 0xb7, 0xaf, 0xba, 0xa2, 0x8a, 0x92, 0xda, 0xc2, 0xea, 0xf2, - 0x7a, 0x62, 0x4a, 0x52, 0x1a, 0x02, 0x2a, 0x32, 0x4e, 0x56, - 0x7e, 0x66, 0x2e, 0x36, 0x1e, 0x06, 0x8e, 0x96, 0xbe, 0xa6, - 0xee, 0xf6, 0xde, 0xc6, 0xd3, 0xcb, 0xe3, 0xfb, 0xb3, 0xab, - 0x83, 0x9b, 0x13, 0x0b, 0x23, 0x3b, 0x73, 0x6b, 0x43, 0x5b, - 0x69, 0x71, 0x59, 0x41, 0x09, 0x11, 0x39, 0x21, 0xa9, 0xb1, - 0x99, 0x81, 0xc9, 0xd1, 0xf9, 0xe1, 0xf4, 0xec, 0xc4, 0xdc, - 0x94, 0x8c, 0xa4, 0xbc, 0x34, 0x2c, 0x04, 0x1c, 0x54, 0x4c, - 0x64, 0x7c, 0x9c, 0x84, 0xac, 0xb4, 0xfc, 0xe4, 0xcc, 0xd4, - 0x5c, 0x44, 0x6c, 0x74, 0x3c, 0x24, 0x0c, 0x14, 0x01, 0x19, - 0x31, 0x29, 0x61, 0x79, 0x51, 0x49, 0xc1, 0xd9, 0xf1, 0xe9, - 0xa1, 0xb9, 0x91, 0x89, 0xbb, 0xa3, 0x8b, 0x93, 0xdb, 0xc3, - 0xeb, 0xf3, 0x7b, 0x63, 0x4b, 0x53, 0x1b, 0x03, 0x2b, 0x33, - 0x26, 0x3e, 0x16, 0x0e, 0x46, 0x5e, 0x76, 0x6e, 0xe6, 0xfe, - 0xd6, 0xce, 0x86, 0x9e, 0xb6, 0xae, 0xd2, 0xca, 0xe2, 0xfa, - 0xb2, 0xaa, 0x82, 0x9a, 0x12, 0x0a, 0x22, 0x3a, 0x72, 0x6a, - 0x42, 0x5a, 0x4f, 0x57, 0x7f, 0x67, 0x2f, 0x37, 0x1f, 0x07, - 0x8f, 0x97, 0xbf, 0xa7, 0xef, 0xf7, 0xdf, 0xc7, 0xf5, 0xed, - 0xc5, 0xdd, 0x95, 0x8d, 0xa5, 0xbd, 0x35, 0x2d, 0x05, 0x1d, - 0x55, 0x4d, 0x65, 0x7d, 0x68, 0x70, 0x58, 0x40, 0x08, 0x10, - 0x38, 0x20, 0xa8, 0xb0, 0x98, 0x80, 0xc8, 0xd0, 0xf8, 0xe0, - 0x00, 0x19, 0x32, 0x2b, 0x64, 0x7d, 0x56, 0x4f, 0xc8, 0xd1, - 0xfa, 0xe3, 0xac, 0xb5, 0x9e, 0x87, 0x8d, 0x94, 0xbf, 0xa6, - 0xe9, 0xf0, 0xdb, 0xc2, 0x45, 0x5c, 0x77, 0x6e, 0x21, 0x38, - 0x13, 0x0a, 0x07, 0x1e, 0x35, 0x2c, 0x63, 0x7a, 0x51, 0x48, - 0xcf, 0xd6, 0xfd, 0xe4, 0xab, 0xb2, 0x99, 0x80, 0x8a, 0x93, - 0xb8, 0xa1, 0xee, 0xf7, 0xdc, 0xc5, 0x42, 0x5b, 0x70, 0x69, - 0x26, 0x3f, 0x14, 0x0d, 0x0e, 0x17, 0x3c, 0x25, 0x6a, 0x73, - 0x58, 0x41, 0xc6, 0xdf, 0xf4, 0xed, 0xa2, 0xbb, 0x90, 0x89, - 0x83, 0x9a, 0xb1, 0xa8, 0xe7, 0xfe, 0xd5, 0xcc, 0x4b, 0x52, - 0x79, 0x60, 0x2f, 0x36, 0x1d, 0x04, 0x09, 0x10, 0x3b, 0x22, - 0x6d, 0x74, 0x5f, 0x46, 0xc1, 0xd8, 0xf3, 0xea, 0xa5, 0xbc, - 0x97, 0x8e, 0x84, 0x9d, 0xb6, 0xaf, 0xe0, 0xf9, 0xd2, 0xcb, - 0x4c, 0x55, 0x7e, 0x67, 0x28, 0x31, 0x1a, 0x03, 0x1c, 0x05, - 0x2e, 0x37, 0x78, 0x61, 0x4a, 0x53, 0xd4, 0xcd, 0xe6, 0xff, - 0xb0, 0xa9, 0x82, 0x9b, 0x91, 0x88, 0xa3, 0xba, 0xf5, 0xec, - 0xc7, 0xde, 0x59, 0x40, 0x6b, 0x72, 0x3d, 0x24, 0x0f, 0x16, - 0x1b, 0x02, 0x29, 0x30, 0x7f, 0x66, 0x4d, 0x54, 0xd3, 0xca, - 0xe1, 0xf8, 0xb7, 0xae, 0x85, 0x9c, 0x96, 0x8f, 0xa4, 0xbd, - 0xf2, 0xeb, 0xc0, 0xd9, 0x5e, 0x47, 0x6c, 0x75, 0x3a, 0x23, - 0x08, 0x11, 0x12, 0x0b, 0x20, 0x39, 0x76, 0x6f, 0x44, 0x5d, - 0xda, 0xc3, 0xe8, 0xf1, 0xbe, 0xa7, 0x8c, 0x95, 0x9f, 0x86, - 0xad, 0xb4, 0xfb, 0xe2, 0xc9, 0xd0, 0x57, 0x4e, 0x65, 0x7c, - 0x33, 0x2a, 0x01, 0x18, 0x15, 0x0c, 0x27, 0x3e, 0x71, 0x68, - 0x43, 0x5a, 0xdd, 0xc4, 0xef, 0xf6, 0xb9, 0xa0, 0x8b, 0x92, - 0x98, 0x81, 0xaa, 0xb3, 0xfc, 0xe5, 0xce, 0xd7, 0x50, 0x49, - 0x62, 0x7b, 0x34, 0x2d, 0x06, 0x1f, 0x00, 0x1a, 0x34, 0x2e, - 0x68, 0x72, 0x5c, 0x46, 0xd0, 0xca, 0xe4, 0xfe, 0xb8, 0xa2, - 0x8c, 0x96, 0xbd, 0xa7, 0x89, 0x93, 0xd5, 0xcf, 0xe1, 0xfb, - 0x6d, 0x77, 0x59, 0x43, 0x05, 0x1f, 0x31, 0x2b, 0x67, 0x7d, - 0x53, 0x49, 0x0f, 0x15, 0x3b, 0x21, 0xb7, 0xad, 0x83, 0x99, - 0xdf, 0xc5, 0xeb, 0xf1, 0xda, 0xc0, 0xee, 0xf4, 0xb2, 0xa8, - 0x86, 0x9c, 0x0a, 0x10, 0x3e, 0x24, 0x62, 0x78, 0x56, 0x4c, - 0xce, 0xd4, 0xfa, 0xe0, 0xa6, 0xbc, 0x92, 0x88, 0x1e, 0x04, - 0x2a, 0x30, 0x76, 0x6c, 0x42, 0x58, 0x73, 0x69, 0x47, 0x5d, - 0x1b, 0x01, 0x2f, 0x35, 0xa3, 0xb9, 0x97, 0x8d, 0xcb, 0xd1, - 0xff, 0xe5, 0xa9, 0xb3, 0x9d, 0x87, 0xc1, 0xdb, 0xf5, 0xef, - 0x79, 0x63, 0x4d, 0x57, 0x11, 0x0b, 0x25, 0x3f, 0x14, 0x0e, - 0x20, 0x3a, 0x7c, 0x66, 0x48, 0x52, 0xc4, 0xde, 0xf0, 0xea, - 0xac, 0xb6, 0x98, 0x82, 0x81, 0x9b, 0xb5, 0xaf, 0xe9, 0xf3, - 0xdd, 0xc7, 0x51, 0x4b, 0x65, 0x7f, 0x39, 0x23, 0x0d, 0x17, - 0x3c, 0x26, 0x08, 0x12, 0x54, 0x4e, 0x60, 0x7a, 0xec, 0xf6, - 0xd8, 0xc2, 0x84, 0x9e, 0xb0, 0xaa, 0xe6, 0xfc, 0xd2, 0xc8, - 0x8e, 0x94, 0xba, 0xa0, 0x36, 0x2c, 0x02, 0x18, 0x5e, 0x44, - 0x6a, 0x70, 0x5b, 0x41, 0x6f, 0x75, 0x33, 0x29, 0x07, 0x1d, - 0x8b, 0x91, 0xbf, 0xa5, 0xe3, 0xf9, 0xd7, 0xcd, 0x4f, 0x55, - 0x7b, 0x61, 0x27, 0x3d, 0x13, 0x09, 0x9f, 0x85, 0xab, 0xb1, - 0xf7, 0xed, 0xc3, 0xd9, 0xf2, 0xe8, 0xc6, 0xdc, 0x9a, 0x80, - 0xae, 0xb4, 0x22, 0x38, 0x16, 0x0c, 0x4a, 0x50, 0x7e, 0x64, - 0x28, 0x32, 0x1c, 0x06, 0x40, 0x5a, 0x74, 0x6e, 0xf8, 0xe2, - 0xcc, 0xd6, 0x90, 0x8a, 0xa4, 0xbe, 0x95, 0x8f, 0xa1, 0xbb, - 0xfd, 0xe7, 0xc9, 0xd3, 0x45, 0x5f, 0x71, 0x6b, 0x2d, 0x37, - 0x19, 0x03, 0x00, 0x1b, 0x36, 0x2d, 0x6c, 0x77, 0x5a, 0x41, - 0xd8, 0xc3, 0xee, 0xf5, 0xb4, 0xaf, 0x82, 0x99, 0xad, 0xb6, - 0x9b, 0x80, 0xc1, 0xda, 0xf7, 0xec, 0x75, 0x6e, 0x43, 0x58, - 0x19, 0x02, 0x2f, 0x34, 0x47, 0x5c, 0x71, 0x6a, 0x2b, 0x30, - 0x1d, 0x06, 0x9f, 0x84, 0xa9, 0xb2, 0xf3, 0xe8, 0xc5, 0xde, - 0xea, 0xf1, 0xdc, 0xc7, 0x86, 0x9d, 0xb0, 0xab, 0x32, 0x29, - 0x04, 0x1f, 0x5e, 0x45, 0x68, 0x73, 0x8e, 0x95, 0xb8, 0xa3, - 0xe2, 0xf9, 0xd4, 0xcf, 0x56, 0x4d, 0x60, 0x7b, 0x3a, 0x21, - 0x0c, 0x17, 0x23, 0x38, 0x15, 0x0e, 0x4f, 0x54, 0x79, 0x62, - 0xfb, 0xe0, 0xcd, 0xd6, 0x97, 0x8c, 0xa1, 0xba, 0xc9, 0xd2, - 0xff, 0xe4, 0xa5, 0xbe, 0x93, 0x88, 0x11, 0x0a, 0x27, 0x3c, - 0x7d, 0x66, 0x4b, 0x50, 0x64, 0x7f, 0x52, 0x49, 0x08, 0x13, - 0x3e, 0x25, 0xbc, 0xa7, 0x8a, 0x91, 0xd0, 0xcb, 0xe6, 0xfd, - 0x01, 0x1a, 0x37, 0x2c, 0x6d, 0x76, 0x5b, 0x40, 0xd9, 0xc2, - 0xef, 0xf4, 0xb5, 0xae, 0x83, 0x98, 0xac, 0xb7, 0x9a, 0x81, - 0xc0, 0xdb, 0xf6, 0xed, 0x74, 0x6f, 0x42, 0x59, 0x18, 0x03, - 0x2e, 0x35, 0x46, 0x5d, 0x70, 0x6b, 0x2a, 0x31, 0x1c, 0x07, - 0x9e, 0x85, 0xa8, 0xb3, 0xf2, 0xe9, 0xc4, 0xdf, 0xeb, 0xf0, - 0xdd, 0xc6, 0x87, 0x9c, 0xb1, 0xaa, 0x33, 0x28, 0x05, 0x1e, - 0x5f, 0x44, 0x69, 0x72, 0x8f, 0x94, 0xb9, 0xa2, 0xe3, 0xf8, - 0xd5, 0xce, 0x57, 0x4c, 0x61, 0x7a, 0x3b, 0x20, 0x0d, 0x16, - 0x22, 0x39, 0x14, 0x0f, 0x4e, 0x55, 0x78, 0x63, 0xfa, 0xe1, - 0xcc, 0xd7, 0x96, 0x8d, 0xa0, 0xbb, 0xc8, 0xd3, 0xfe, 0xe5, - 0xa4, 0xbf, 0x92, 0x89, 0x10, 0x0b, 0x26, 0x3d, 0x7c, 0x67, - 0x4a, 0x51, 0x65, 0x7e, 0x53, 0x48, 0x09, 0x12, 0x3f, 0x24, - 0xbd, 0xa6, 0x8b, 0x90, 0xd1, 0xca, 0xe7, 0xfc, 0x00, 0x1c, - 0x38, 0x24, 0x70, 0x6c, 0x48, 0x54, 0xe0, 0xfc, 0xd8, 0xc4, - 0x90, 0x8c, 0xa8, 0xb4, 0xdd, 0xc1, 0xe5, 0xf9, 0xad, 0xb1, - 0x95, 0x89, 0x3d, 0x21, 0x05, 0x19, 0x4d, 0x51, 0x75, 0x69, - 0xa7, 0xbb, 0x9f, 0x83, 0xd7, 0xcb, 0xef, 0xf3, 0x47, 0x5b, - 0x7f, 0x63, 0x37, 0x2b, 0x0f, 0x13, 0x7a, 0x66, 0x42, 0x5e, - 0x0a, 0x16, 0x32, 0x2e, 0x9a, 0x86, 0xa2, 0xbe, 0xea, 0xf6, - 0xd2, 0xce, 0x53, 0x4f, 0x6b, 0x77, 0x23, 0x3f, 0x1b, 0x07, - 0xb3, 0xaf, 0x8b, 0x97, 0xc3, 0xdf, 0xfb, 0xe7, 0x8e, 0x92, - 0xb6, 0xaa, 0xfe, 0xe2, 0xc6, 0xda, 0x6e, 0x72, 0x56, 0x4a, - 0x1e, 0x02, 0x26, 0x3a, 0xf4, 0xe8, 0xcc, 0xd0, 0x84, 0x98, - 0xbc, 0xa0, 0x14, 0x08, 0x2c, 0x30, 0x64, 0x78, 0x5c, 0x40, - 0x29, 0x35, 0x11, 0x0d, 0x59, 0x45, 0x61, 0x7d, 0xc9, 0xd5, - 0xf1, 0xed, 0xb9, 0xa5, 0x81, 0x9d, 0xa6, 0xba, 0x9e, 0x82, - 0xd6, 0xca, 0xee, 0xf2, 0x46, 0x5a, 0x7e, 0x62, 0x36, 0x2a, - 0x0e, 0x12, 0x7b, 0x67, 0x43, 0x5f, 0x0b, 0x17, 0x33, 0x2f, - 0x9b, 0x87, 0xa3, 0xbf, 0xeb, 0xf7, 0xd3, 0xcf, 0x01, 0x1d, - 0x39, 0x25, 0x71, 0x6d, 0x49, 0x55, 0xe1, 0xfd, 0xd9, 0xc5, - 0x91, 0x8d, 0xa9, 0xb5, 0xdc, 0xc0, 0xe4, 0xf8, 0xac, 0xb0, - 0x94, 0x88, 0x3c, 0x20, 0x04, 0x18, 0x4c, 0x50, 0x74, 0x68, - 0xf5, 0xe9, 0xcd, 0xd1, 0x85, 0x99, 0xbd, 0xa1, 0x15, 0x09, - 0x2d, 0x31, 0x65, 0x79, 0x5d, 0x41, 0x28, 0x34, 0x10, 0x0c, - 0x58, 0x44, 0x60, 0x7c, 0xc8, 0xd4, 0xf0, 0xec, 0xb8, 0xa4, - 0x80, 0x9c, 0x52, 0x4e, 0x6a, 0x76, 0x22, 0x3e, 0x1a, 0x06, - 0xb2, 0xae, 0x8a, 0x96, 0xc2, 0xde, 0xfa, 0xe6, 0x8f, 0x93, - 0xb7, 0xab, 0xff, 0xe3, 0xc7, 0xdb, 0x6f, 0x73, 0x57, 0x4b, - 0x1f, 0x03, 0x27, 0x3b, 0x00, 0x1d, 0x3a, 0x27, 0x74, 0x69, - 0x4e, 0x53, 0xe8, 0xf5, 0xd2, 0xcf, 0x9c, 0x81, 0xa6, 0xbb, - 0xcd, 0xd0, 0xf7, 0xea, 0xb9, 0xa4, 0x83, 0x9e, 0x25, 0x38, - 0x1f, 0x02, 0x51, 0x4c, 0x6b, 0x76, 0x87, 0x9a, 0xbd, 0xa0, - 0xf3, 0xee, 0xc9, 0xd4, 0x6f, 0x72, 0x55, 0x48, 0x1b, 0x06, - 0x21, 0x3c, 0x4a, 0x57, 0x70, 0x6d, 0x3e, 0x23, 0x04, 0x19, - 0xa2, 0xbf, 0x98, 0x85, 0xd6, 0xcb, 0xec, 0xf1, 0x13, 0x0e, - 0x29, 0x34, 0x67, 0x7a, 0x5d, 0x40, 0xfb, 0xe6, 0xc1, 0xdc, - 0x8f, 0x92, 0xb5, 0xa8, 0xde, 0xc3, 0xe4, 0xf9, 0xaa, 0xb7, - 0x90, 0x8d, 0x36, 0x2b, 0x0c, 0x11, 0x42, 0x5f, 0x78, 0x65, - 0x94, 0x89, 0xae, 0xb3, 0xe0, 0xfd, 0xda, 0xc7, 0x7c, 0x61, - 0x46, 0x5b, 0x08, 0x15, 0x32, 0x2f, 0x59, 0x44, 0x63, 0x7e, - 0x2d, 0x30, 0x17, 0x0a, 0xb1, 0xac, 0x8b, 0x96, 0xc5, 0xd8, - 0xff, 0xe2, 0x26, 0x3b, 0x1c, 0x01, 0x52, 0x4f, 0x68, 0x75, - 0xce, 0xd3, 0xf4, 0xe9, 0xba, 0xa7, 0x80, 0x9d, 0xeb, 0xf6, - 0xd1, 0xcc, 0x9f, 0x82, 0xa5, 0xb8, 0x03, 0x1e, 0x39, 0x24, - 0x77, 0x6a, 0x4d, 0x50, 0xa1, 0xbc, 0x9b, 0x86, 0xd5, 0xc8, - 0xef, 0xf2, 0x49, 0x54, 0x73, 0x6e, 0x3d, 0x20, 0x07, 0x1a, - 0x6c, 0x71, 0x56, 0x4b, 0x18, 0x05, 0x22, 0x3f, 0x84, 0x99, - 0xbe, 0xa3, 0xf0, 0xed, 0xca, 0xd7, 0x35, 0x28, 0x0f, 0x12, - 0x41, 0x5c, 0x7b, 0x66, 0xdd, 0xc0, 0xe7, 0xfa, 0xa9, 0xb4, - 0x93, 0x8e, 0xf8, 0xe5, 0xc2, 0xdf, 0x8c, 0x91, 0xb6, 0xab, - 0x10, 0x0d, 0x2a, 0x37, 0x64, 0x79, 0x5e, 0x43, 0xb2, 0xaf, - 0x88, 0x95, 0xc6, 0xdb, 0xfc, 0xe1, 0x5a, 0x47, 0x60, 0x7d, - 0x2e, 0x33, 0x14, 0x09, 0x7f, 0x62, 0x45, 0x58, 0x0b, 0x16, - 0x31, 0x2c, 0x97, 0x8a, 0xad, 0xb0, 0xe3, 0xfe, 0xd9, 0xc4, - 0x00, 0x1e, 0x3c, 0x22, 0x78, 0x66, 0x44, 0x5a, 0xf0, 0xee, - 0xcc, 0xd2, 0x88, 0x96, 0xb4, 0xaa, 0xfd, 0xe3, 0xc1, 0xdf, - 0x85, 0x9b, 0xb9, 0xa7, 0x0d, 0x13, 0x31, 0x2f, 0x75, 0x6b, - 0x49, 0x57, 0xe7, 0xf9, 0xdb, 0xc5, 0x9f, 0x81, 0xa3, 0xbd, - 0x17, 0x09, 0x2b, 0x35, 0x6f, 0x71, 0x53, 0x4d, 0x1a, 0x04, - 0x26, 0x38, 0x62, 0x7c, 0x5e, 0x40, 0xea, 0xf4, 0xd6, 0xc8, - 0x92, 0x8c, 0xae, 0xb0, 0xd3, 0xcd, 0xef, 0xf1, 0xab, 0xb5, - 0x97, 0x89, 0x23, 0x3d, 0x1f, 0x01, 0x5b, 0x45, 0x67, 0x79, - 0x2e, 0x30, 0x12, 0x0c, 0x56, 0x48, 0x6a, 0x74, 0xde, 0xc0, - 0xe2, 0xfc, 0xa6, 0xb8, 0x9a, 0x84, 0x34, 0x2a, 0x08, 0x16, - 0x4c, 0x52, 0x70, 0x6e, 0xc4, 0xda, 0xf8, 0xe6, 0xbc, 0xa2, - 0x80, 0x9e, 0xc9, 0xd7, 0xf5, 0xeb, 0xb1, 0xaf, 0x8d, 0x93, - 0x39, 0x27, 0x05, 0x1b, 0x41, 0x5f, 0x7d, 0x63, 0xbb, 0xa5, - 0x87, 0x99, 0xc3, 0xdd, 0xff, 0xe1, 0x4b, 0x55, 0x77, 0x69, - 0x33, 0x2d, 0x0f, 0x11, 0x46, 0x58, 0x7a, 0x64, 0x3e, 0x20, - 0x02, 0x1c, 0xb6, 0xa8, 0x8a, 0x94, 0xce, 0xd0, 0xf2, 0xec, - 0x5c, 0x42, 0x60, 0x7e, 0x24, 0x3a, 0x18, 0x06, 0xac, 0xb2, - 0x90, 0x8e, 0xd4, 0xca, 0xe8, 0xf6, 0xa1, 0xbf, 0x9d, 0x83, - 0xd9, 0xc7, 0xe5, 0xfb, 0x51, 0x4f, 0x6d, 0x73, 0x29, 0x37, - 0x15, 0x0b, 0x68, 0x76, 0x54, 0x4a, 0x10, 0x0e, 0x2c, 0x32, - 0x98, 0x86, 0xa4, 0xba, 0xe0, 0xfe, 0xdc, 0xc2, 0x95, 0x8b, - 0xa9, 0xb7, 0xed, 0xf3, 0xd1, 0xcf, 0x65, 0x7b, 0x59, 0x47, - 0x1d, 0x03, 0x21, 0x3f, 0x8f, 0x91, 0xb3, 0xad, 0xf7, 0xe9, - 0xcb, 0xd5, 0x7f, 0x61, 0x43, 0x5d, 0x07, 0x19, 0x3b, 0x25, - 0x72, 0x6c, 0x4e, 0x50, 0x0a, 0x14, 0x36, 0x28, 0x82, 0x9c, - 0xbe, 0xa0, 0xfa, 0xe4, 0xc6, 0xd8, 0x00, 0x1f, 0x3e, 0x21, - 0x7c, 0x63, 0x42, 0x5d, 0xf8, 0xe7, 0xc6, 0xd9, 0x84, 0x9b, - 0xba, 0xa5, 0xed, 0xf2, 0xd3, 0xcc, 0x91, 0x8e, 0xaf, 0xb0, - 0x15, 0x0a, 0x2b, 0x34, 0x69, 0x76, 0x57, 0x48, 0xc7, 0xd8, - 0xf9, 0xe6, 0xbb, 0xa4, 0x85, 0x9a, 0x3f, 0x20, 0x01, 0x1e, - 0x43, 0x5c, 0x7d, 0x62, 0x2a, 0x35, 0x14, 0x0b, 0x56, 0x49, - 0x68, 0x77, 0xd2, 0xcd, 0xec, 0xf3, 0xae, 0xb1, 0x90, 0x8f, - 0x93, 0x8c, 0xad, 0xb2, 0xef, 0xf0, 0xd1, 0xce, 0x6b, 0x74, - 0x55, 0x4a, 0x17, 0x08, 0x29, 0x36, 0x7e, 0x61, 0x40, 0x5f, - 0x02, 0x1d, 0x3c, 0x23, 0x86, 0x99, 0xb8, 0xa7, 0xfa, 0xe5, - 0xc4, 0xdb, 0x54, 0x4b, 0x6a, 0x75, 0x28, 0x37, 0x16, 0x09, - 0xac, 0xb3, 0x92, 0x8d, 0xd0, 0xcf, 0xee, 0xf1, 0xb9, 0xa6, - 0x87, 0x98, 0xc5, 0xda, 0xfb, 0xe4, 0x41, 0x5e, 0x7f, 0x60, - 0x3d, 0x22, 0x03, 0x1c, 0x3b, 0x24, 0x05, 0x1a, 0x47, 0x58, - 0x79, 0x66, 0xc3, 0xdc, 0xfd, 0xe2, 0xbf, 0xa0, 0x81, 0x9e, - 0xd6, 0xc9, 0xe8, 0xf7, 0xaa, 0xb5, 0x94, 0x8b, 0x2e, 0x31, - 0x10, 0x0f, 0x52, 0x4d, 0x6c, 0x73, 0xfc, 0xe3, 0xc2, 0xdd, - 0x80, 0x9f, 0xbe, 0xa1, 0x04, 0x1b, 0x3a, 0x25, 0x78, 0x67, - 0x46, 0x59, 0x11, 0x0e, 0x2f, 0x30, 0x6d, 0x72, 0x53, 0x4c, - 0xe9, 0xf6, 0xd7, 0xc8, 0x95, 0x8a, 0xab, 0xb4, 0xa8, 0xb7, - 0x96, 0x89, 0xd4, 0xcb, 0xea, 0xf5, 0x50, 0x4f, 0x6e, 0x71, - 0x2c, 0x33, 0x12, 0x0d, 0x45, 0x5a, 0x7b, 0x64, 0x39, 0x26, - 0x07, 0x18, 0xbd, 0xa2, 0x83, 0x9c, 0xc1, 0xde, 0xff, 0xe0, - 0x6f, 0x70, 0x51, 0x4e, 0x13, 0x0c, 0x2d, 0x32, 0x97, 0x88, - 0xa9, 0xb6, 0xeb, 0xf4, 0xd5, 0xca, 0x82, 0x9d, 0xbc, 0xa3, - 0xfe, 0xe1, 0xc0, 0xdf, 0x7a, 0x65, 0x44, 0x5b, 0x06, 0x19, - 0x38, 0x27, 0x00, 0x20, 0x40, 0x60, 0x80, 0xa0, 0xc0, 0xe0, - 0x1d, 0x3d, 0x5d, 0x7d, 0x9d, 0xbd, 0xdd, 0xfd, 0x3a, 0x1a, - 0x7a, 0x5a, 0xba, 0x9a, 0xfa, 0xda, 0x27, 0x07, 0x67, 0x47, - 0xa7, 0x87, 0xe7, 0xc7, 0x74, 0x54, 0x34, 0x14, 0xf4, 0xd4, - 0xb4, 0x94, 0x69, 0x49, 0x29, 0x09, 0xe9, 0xc9, 0xa9, 0x89, - 0x4e, 0x6e, 0x0e, 0x2e, 0xce, 0xee, 0x8e, 0xae, 0x53, 0x73, - 0x13, 0x33, 0xd3, 0xf3, 0x93, 0xb3, 0xe8, 0xc8, 0xa8, 0x88, - 0x68, 0x48, 0x28, 0x08, 0xf5, 0xd5, 0xb5, 0x95, 0x75, 0x55, - 0x35, 0x15, 0xd2, 0xf2, 0x92, 0xb2, 0x52, 0x72, 0x12, 0x32, - 0xcf, 0xef, 0x8f, 0xaf, 0x4f, 0x6f, 0x0f, 0x2f, 0x9c, 0xbc, - 0xdc, 0xfc, 0x1c, 0x3c, 0x5c, 0x7c, 0x81, 0xa1, 0xc1, 0xe1, - 0x01, 0x21, 0x41, 0x61, 0xa6, 0x86, 0xe6, 0xc6, 0x26, 0x06, - 0x66, 0x46, 0xbb, 0x9b, 0xfb, 0xdb, 0x3b, 0x1b, 0x7b, 0x5b, - 0xcd, 0xed, 0x8d, 0xad, 0x4d, 0x6d, 0x0d, 0x2d, 0xd0, 0xf0, - 0x90, 0xb0, 0x50, 0x70, 0x10, 0x30, 0xf7, 0xd7, 0xb7, 0x97, - 0x77, 0x57, 0x37, 0x17, 0xea, 0xca, 0xaa, 0x8a, 0x6a, 0x4a, - 0x2a, 0x0a, 0xb9, 0x99, 0xf9, 0xd9, 0x39, 0x19, 0x79, 0x59, - 0xa4, 0x84, 0xe4, 0xc4, 0x24, 0x04, 0x64, 0x44, 0x83, 0xa3, - 0xc3, 0xe3, 0x03, 0x23, 0x43, 0x63, 0x9e, 0xbe, 0xde, 0xfe, - 0x1e, 0x3e, 0x5e, 0x7e, 0x25, 0x05, 0x65, 0x45, 0xa5, 0x85, - 0xe5, 0xc5, 0x38, 0x18, 0x78, 0x58, 0xb8, 0x98, 0xf8, 0xd8, - 0x1f, 0x3f, 0x5f, 0x7f, 0x9f, 0xbf, 0xdf, 0xff, 0x02, 0x22, - 0x42, 0x62, 0x82, 0xa2, 0xc2, 0xe2, 0x51, 0x71, 0x11, 0x31, - 0xd1, 0xf1, 0x91, 0xb1, 0x4c, 0x6c, 0x0c, 0x2c, 0xcc, 0xec, - 0x8c, 0xac, 0x6b, 0x4b, 0x2b, 0x0b, 0xeb, 0xcb, 0xab, 0x8b, - 0x76, 0x56, 0x36, 0x16, 0xf6, 0xd6, 0xb6, 0x96, 0x00, 0x21, - 0x42, 0x63, 0x84, 0xa5, 0xc6, 0xe7, 0x15, 0x34, 0x57, 0x76, - 0x91, 0xb0, 0xd3, 0xf2, 0x2a, 0x0b, 0x68, 0x49, 0xae, 0x8f, - 0xec, 0xcd, 0x3f, 0x1e, 0x7d, 0x5c, 0xbb, 0x9a, 0xf9, 0xd8, - 0x54, 0x75, 0x16, 0x37, 0xd0, 0xf1, 0x92, 0xb3, 0x41, 0x60, - 0x03, 0x22, 0xc5, 0xe4, 0x87, 0xa6, 0x7e, 0x5f, 0x3c, 0x1d, - 0xfa, 0xdb, 0xb8, 0x99, 0x6b, 0x4a, 0x29, 0x08, 0xef, 0xce, - 0xad, 0x8c, 0xa8, 0x89, 0xea, 0xcb, 0x2c, 0x0d, 0x6e, 0x4f, - 0xbd, 0x9c, 0xff, 0xde, 0x39, 0x18, 0x7b, 0x5a, 0x82, 0xa3, - 0xc0, 0xe1, 0x06, 0x27, 0x44, 0x65, 0x97, 0xb6, 0xd5, 0xf4, - 0x13, 0x32, 0x51, 0x70, 0xfc, 0xdd, 0xbe, 0x9f, 0x78, 0x59, - 0x3a, 0x1b, 0xe9, 0xc8, 0xab, 0x8a, 0x6d, 0x4c, 0x2f, 0x0e, - 0xd6, 0xf7, 0x94, 0xb5, 0x52, 0x73, 0x10, 0x31, 0xc3, 0xe2, - 0x81, 0xa0, 0x47, 0x66, 0x05, 0x24, 0x4d, 0x6c, 0x0f, 0x2e, - 0xc9, 0xe8, 0x8b, 0xaa, 0x58, 0x79, 0x1a, 0x3b, 0xdc, 0xfd, - 0x9e, 0xbf, 0x67, 0x46, 0x25, 0x04, 0xe3, 0xc2, 0xa1, 0x80, - 0x72, 0x53, 0x30, 0x11, 0xf6, 0xd7, 0xb4, 0x95, 0x19, 0x38, - 0x5b, 0x7a, 0x9d, 0xbc, 0xdf, 0xfe, 0x0c, 0x2d, 0x4e, 0x6f, - 0x88, 0xa9, 0xca, 0xeb, 0x33, 0x12, 0x71, 0x50, 0xb7, 0x96, - 0xf5, 0xd4, 0x26, 0x07, 0x64, 0x45, 0xa2, 0x83, 0xe0, 0xc1, - 0xe5, 0xc4, 0xa7, 0x86, 0x61, 0x40, 0x23, 0x02, 0xf0, 0xd1, - 0xb2, 0x93, 0x74, 0x55, 0x36, 0x17, 0xcf, 0xee, 0x8d, 0xac, - 0x4b, 0x6a, 0x09, 0x28, 0xda, 0xfb, 0x98, 0xb9, 0x5e, 0x7f, - 0x1c, 0x3d, 0xb1, 0x90, 0xf3, 0xd2, 0x35, 0x14, 0x77, 0x56, - 0xa4, 0x85, 0xe6, 0xc7, 0x20, 0x01, 0x62, 0x43, 0x9b, 0xba, - 0xd9, 0xf8, 0x1f, 0x3e, 0x5d, 0x7c, 0x8e, 0xaf, 0xcc, 0xed, - 0x0a, 0x2b, 0x48, 0x69, 0x00, 0x22, 0x44, 0x66, 0x88, 0xaa, - 0xcc, 0xee, 0x0d, 0x2f, 0x49, 0x6b, 0x85, 0xa7, 0xc1, 0xe3, - 0x1a, 0x38, 0x5e, 0x7c, 0x92, 0xb0, 0xd6, 0xf4, 0x17, 0x35, - 0x53, 0x71, 0x9f, 0xbd, 0xdb, 0xf9, 0x34, 0x16, 0x70, 0x52, - 0xbc, 0x9e, 0xf8, 0xda, 0x39, 0x1b, 0x7d, 0x5f, 0xb1, 0x93, - 0xf5, 0xd7, 0x2e, 0x0c, 0x6a, 0x48, 0xa6, 0x84, 0xe2, 0xc0, - 0x23, 0x01, 0x67, 0x45, 0xab, 0x89, 0xef, 0xcd, 0x68, 0x4a, - 0x2c, 0x0e, 0xe0, 0xc2, 0xa4, 0x86, 0x65, 0x47, 0x21, 0x03, - 0xed, 0xcf, 0xa9, 0x8b, 0x72, 0x50, 0x36, 0x14, 0xfa, 0xd8, - 0xbe, 0x9c, 0x7f, 0x5d, 0x3b, 0x19, 0xf7, 0xd5, 0xb3, 0x91, - 0x5c, 0x7e, 0x18, 0x3a, 0xd4, 0xf6, 0x90, 0xb2, 0x51, 0x73, - 0x15, 0x37, 0xd9, 0xfb, 0x9d, 0xbf, 0x46, 0x64, 0x02, 0x20, - 0xce, 0xec, 0x8a, 0xa8, 0x4b, 0x69, 0x0f, 0x2d, 0xc3, 0xe1, - 0x87, 0xa5, 0xd0, 0xf2, 0x94, 0xb6, 0x58, 0x7a, 0x1c, 0x3e, - 0xdd, 0xff, 0x99, 0xbb, 0x55, 0x77, 0x11, 0x33, 0xca, 0xe8, - 0x8e, 0xac, 0x42, 0x60, 0x06, 0x24, 0xc7, 0xe5, 0x83, 0xa1, - 0x4f, 0x6d, 0x0b, 0x29, 0xe4, 0xc6, 0xa0, 0x82, 0x6c, 0x4e, - 0x28, 0x0a, 0xe9, 0xcb, 0xad, 0x8f, 0x61, 0x43, 0x25, 0x07, - 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 0xf3, 0xd1, - 0xb7, 0x95, 0x7b, 0x59, 0x3f, 0x1d, 0xb8, 0x9a, 0xfc, 0xde, - 0x30, 0x12, 0x74, 0x56, 0xb5, 0x97, 0xf1, 0xd3, 0x3d, 0x1f, - 0x79, 0x5b, 0xa2, 0x80, 0xe6, 0xc4, 0x2a, 0x08, 0x6e, 0x4c, - 0xaf, 0x8d, 0xeb, 0xc9, 0x27, 0x05, 0x63, 0x41, 0x8c, 0xae, - 0xc8, 0xea, 0x04, 0x26, 0x40, 0x62, 0x81, 0xa3, 0xc5, 0xe7, - 0x09, 0x2b, 0x4d, 0x6f, 0x96, 0xb4, 0xd2, 0xf0, 0x1e, 0x3c, - 0x5a, 0x78, 0x9b, 0xb9, 0xdf, 0xfd, 0x13, 0x31, 0x57, 0x75, - 0x00, 0x23, 0x46, 0x65, 0x8c, 0xaf, 0xca, 0xe9, 0x05, 0x26, - 0x43, 0x60, 0x89, 0xaa, 0xcf, 0xec, 0x0a, 0x29, 0x4c, 0x6f, - 0x86, 0xa5, 0xc0, 0xe3, 0x0f, 0x2c, 0x49, 0x6a, 0x83, 0xa0, - 0xc5, 0xe6, 0x14, 0x37, 0x52, 0x71, 0x98, 0xbb, 0xde, 0xfd, - 0x11, 0x32, 0x57, 0x74, 0x9d, 0xbe, 0xdb, 0xf8, 0x1e, 0x3d, - 0x58, 0x7b, 0x92, 0xb1, 0xd4, 0xf7, 0x1b, 0x38, 0x5d, 0x7e, - 0x97, 0xb4, 0xd1, 0xf2, 0x28, 0x0b, 0x6e, 0x4d, 0xa4, 0x87, - 0xe2, 0xc1, 0x2d, 0x0e, 0x6b, 0x48, 0xa1, 0x82, 0xe7, 0xc4, - 0x22, 0x01, 0x64, 0x47, 0xae, 0x8d, 0xe8, 0xcb, 0x27, 0x04, - 0x61, 0x42, 0xab, 0x88, 0xed, 0xce, 0x3c, 0x1f, 0x7a, 0x59, - 0xb0, 0x93, 0xf6, 0xd5, 0x39, 0x1a, 0x7f, 0x5c, 0xb5, 0x96, - 0xf3, 0xd0, 0x36, 0x15, 0x70, 0x53, 0xba, 0x99, 0xfc, 0xdf, - 0x33, 0x10, 0x75, 0x56, 0xbf, 0x9c, 0xf9, 0xda, 0x50, 0x73, - 0x16, 0x35, 0xdc, 0xff, 0x9a, 0xb9, 0x55, 0x76, 0x13, 0x30, - 0xd9, 0xfa, 0x9f, 0xbc, 0x5a, 0x79, 0x1c, 0x3f, 0xd6, 0xf5, - 0x90, 0xb3, 0x5f, 0x7c, 0x19, 0x3a, 0xd3, 0xf0, 0x95, 0xb6, - 0x44, 0x67, 0x02, 0x21, 0xc8, 0xeb, 0x8e, 0xad, 0x41, 0x62, - 0x07, 0x24, 0xcd, 0xee, 0x8b, 0xa8, 0x4e, 0x6d, 0x08, 0x2b, - 0xc2, 0xe1, 0x84, 0xa7, 0x4b, 0x68, 0x0d, 0x2e, 0xc7, 0xe4, - 0x81, 0xa2, 0x78, 0x5b, 0x3e, 0x1d, 0xf4, 0xd7, 0xb2, 0x91, - 0x7d, 0x5e, 0x3b, 0x18, 0xf1, 0xd2, 0xb7, 0x94, 0x72, 0x51, - 0x34, 0x17, 0xfe, 0xdd, 0xb8, 0x9b, 0x77, 0x54, 0x31, 0x12, - 0xfb, 0xd8, 0xbd, 0x9e, 0x6c, 0x4f, 0x2a, 0x09, 0xe0, 0xc3, - 0xa6, 0x85, 0x69, 0x4a, 0x2f, 0x0c, 0xe5, 0xc6, 0xa3, 0x80, - 0x66, 0x45, 0x20, 0x03, 0xea, 0xc9, 0xac, 0x8f, 0x63, 0x40, - 0x25, 0x06, 0xef, 0xcc, 0xa9, 0x8a, 0x00, 0x24, 0x48, 0x6c, - 0x90, 0xb4, 0xd8, 0xfc, 0x3d, 0x19, 0x75, 0x51, 0xad, 0x89, - 0xe5, 0xc1, 0x7a, 0x5e, 0x32, 0x16, 0xea, 0xce, 0xa2, 0x86, - 0x47, 0x63, 0x0f, 0x2b, 0xd7, 0xf3, 0x9f, 0xbb, 0xf4, 0xd0, - 0xbc, 0x98, 0x64, 0x40, 0x2c, 0x08, 0xc9, 0xed, 0x81, 0xa5, - 0x59, 0x7d, 0x11, 0x35, 0x8e, 0xaa, 0xc6, 0xe2, 0x1e, 0x3a, - 0x56, 0x72, 0xb3, 0x97, 0xfb, 0xdf, 0x23, 0x07, 0x6b, 0x4f, - 0xf5, 0xd1, 0xbd, 0x99, 0x65, 0x41, 0x2d, 0x09, 0xc8, 0xec, - 0x80, 0xa4, 0x58, 0x7c, 0x10, 0x34, 0x8f, 0xab, 0xc7, 0xe3, - 0x1f, 0x3b, 0x57, 0x73, 0xb2, 0x96, 0xfa, 0xde, 0x22, 0x06, - 0x6a, 0x4e, 0x01, 0x25, 0x49, 0x6d, 0x91, 0xb5, 0xd9, 0xfd, - 0x3c, 0x18, 0x74, 0x50, 0xac, 0x88, 0xe4, 0xc0, 0x7b, 0x5f, - 0x33, 0x17, 0xeb, 0xcf, 0xa3, 0x87, 0x46, 0x62, 0x0e, 0x2a, - 0xd6, 0xf2, 0x9e, 0xba, 0xf7, 0xd3, 0xbf, 0x9b, 0x67, 0x43, - 0x2f, 0x0b, 0xca, 0xee, 0x82, 0xa6, 0x5a, 0x7e, 0x12, 0x36, - 0x8d, 0xa9, 0xc5, 0xe1, 0x1d, 0x39, 0x55, 0x71, 0xb0, 0x94, - 0xf8, 0xdc, 0x20, 0x04, 0x68, 0x4c, 0x03, 0x27, 0x4b, 0x6f, - 0x93, 0xb7, 0xdb, 0xff, 0x3e, 0x1a, 0x76, 0x52, 0xae, 0x8a, - 0xe6, 0xc2, 0x79, 0x5d, 0x31, 0x15, 0xe9, 0xcd, 0xa1, 0x85, - 0x44, 0x60, 0x0c, 0x28, 0xd4, 0xf0, 0x9c, 0xb8, 0x02, 0x26, - 0x4a, 0x6e, 0x92, 0xb6, 0xda, 0xfe, 0x3f, 0x1b, 0x77, 0x53, - 0xaf, 0x8b, 0xe7, 0xc3, 0x78, 0x5c, 0x30, 0x14, 0xe8, 0xcc, - 0xa0, 0x84, 0x45, 0x61, 0x0d, 0x29, 0xd5, 0xf1, 0x9d, 0xb9, - 0xf6, 0xd2, 0xbe, 0x9a, 0x66, 0x42, 0x2e, 0x0a, 0xcb, 0xef, - 0x83, 0xa7, 0x5b, 0x7f, 0x13, 0x37, 0x8c, 0xa8, 0xc4, 0xe0, - 0x1c, 0x38, 0x54, 0x70, 0xb1, 0x95, 0xf9, 0xdd, 0x21, 0x05, - 0x69, 0x4d, 0x00, 0x25, 0x4a, 0x6f, 0x94, 0xb1, 0xde, 0xfb, - 0x35, 0x10, 0x7f, 0x5a, 0xa1, 0x84, 0xeb, 0xce, 0x6a, 0x4f, - 0x20, 0x05, 0xfe, 0xdb, 0xb4, 0x91, 0x5f, 0x7a, 0x15, 0x30, - 0xcb, 0xee, 0x81, 0xa4, 0xd4, 0xf1, 0x9e, 0xbb, 0x40, 0x65, - 0x0a, 0x2f, 0xe1, 0xc4, 0xab, 0x8e, 0x75, 0x50, 0x3f, 0x1a, - 0xbe, 0x9b, 0xf4, 0xd1, 0x2a, 0x0f, 0x60, 0x45, 0x8b, 0xae, - 0xc1, 0xe4, 0x1f, 0x3a, 0x55, 0x70, 0xb5, 0x90, 0xff, 0xda, - 0x21, 0x04, 0x6b, 0x4e, 0x80, 0xa5, 0xca, 0xef, 0x14, 0x31, - 0x5e, 0x7b, 0xdf, 0xfa, 0x95, 0xb0, 0x4b, 0x6e, 0x01, 0x24, - 0xea, 0xcf, 0xa0, 0x85, 0x7e, 0x5b, 0x34, 0x11, 0x61, 0x44, - 0x2b, 0x0e, 0xf5, 0xd0, 0xbf, 0x9a, 0x54, 0x71, 0x1e, 0x3b, - 0xc0, 0xe5, 0x8a, 0xaf, 0x0b, 0x2e, 0x41, 0x64, 0x9f, 0xba, - 0xd5, 0xf0, 0x3e, 0x1b, 0x74, 0x51, 0xaa, 0x8f, 0xe0, 0xc5, - 0x77, 0x52, 0x3d, 0x18, 0xe3, 0xc6, 0xa9, 0x8c, 0x42, 0x67, - 0x08, 0x2d, 0xd6, 0xf3, 0x9c, 0xb9, 0x1d, 0x38, 0x57, 0x72, - 0x89, 0xac, 0xc3, 0xe6, 0x28, 0x0d, 0x62, 0x47, 0xbc, 0x99, - 0xf6, 0xd3, 0xa3, 0x86, 0xe9, 0xcc, 0x37, 0x12, 0x7d, 0x58, - 0x96, 0xb3, 0xdc, 0xf9, 0x02, 0x27, 0x48, 0x6d, 0xc9, 0xec, - 0x83, 0xa6, 0x5d, 0x78, 0x17, 0x32, 0xfc, 0xd9, 0xb6, 0x93, - 0x68, 0x4d, 0x22, 0x07, 0xc2, 0xe7, 0x88, 0xad, 0x56, 0x73, - 0x1c, 0x39, 0xf7, 0xd2, 0xbd, 0x98, 0x63, 0x46, 0x29, 0x0c, - 0xa8, 0x8d, 0xe2, 0xc7, 0x3c, 0x19, 0x76, 0x53, 0x9d, 0xb8, - 0xd7, 0xf2, 0x09, 0x2c, 0x43, 0x66, 0x16, 0x33, 0x5c, 0x79, - 0x82, 0xa7, 0xc8, 0xed, 0x23, 0x06, 0x69, 0x4c, 0xb7, 0x92, - 0xfd, 0xd8, 0x7c, 0x59, 0x36, 0x13, 0xe8, 0xcd, 0xa2, 0x87, - 0x49, 0x6c, 0x03, 0x26, 0xdd, 0xf8, 0x97, 0xb2, 0x00, 0x26, - 0x4c, 0x6a, 0x98, 0xbe, 0xd4, 0xf2, 0x2d, 0x0b, 0x61, 0x47, - 0xb5, 0x93, 0xf9, 0xdf, 0x5a, 0x7c, 0x16, 0x30, 0xc2, 0xe4, - 0x8e, 0xa8, 0x77, 0x51, 0x3b, 0x1d, 0xef, 0xc9, 0xa3, 0x85, - 0xb4, 0x92, 0xf8, 0xde, 0x2c, 0x0a, 0x60, 0x46, 0x99, 0xbf, - 0xd5, 0xf3, 0x01, 0x27, 0x4d, 0x6b, 0xee, 0xc8, 0xa2, 0x84, - 0x76, 0x50, 0x3a, 0x1c, 0xc3, 0xe5, 0x8f, 0xa9, 0x5b, 0x7d, - 0x17, 0x31, 0x75, 0x53, 0x39, 0x1f, 0xed, 0xcb, 0xa1, 0x87, - 0x58, 0x7e, 0x14, 0x32, 0xc0, 0xe6, 0x8c, 0xaa, 0x2f, 0x09, - 0x63, 0x45, 0xb7, 0x91, 0xfb, 0xdd, 0x02, 0x24, 0x4e, 0x68, - 0x9a, 0xbc, 0xd6, 0xf0, 0xc1, 0xe7, 0x8d, 0xab, 0x59, 0x7f, - 0x15, 0x33, 0xec, 0xca, 0xa0, 0x86, 0x74, 0x52, 0x38, 0x1e, - 0x9b, 0xbd, 0xd7, 0xf1, 0x03, 0x25, 0x4f, 0x69, 0xb6, 0x90, - 0xfa, 0xdc, 0x2e, 0x08, 0x62, 0x44, 0xea, 0xcc, 0xa6, 0x80, - 0x72, 0x54, 0x3e, 0x18, 0xc7, 0xe1, 0x8b, 0xad, 0x5f, 0x79, - 0x13, 0x35, 0xb0, 0x96, 0xfc, 0xda, 0x28, 0x0e, 0x64, 0x42, - 0x9d, 0xbb, 0xd1, 0xf7, 0x05, 0x23, 0x49, 0x6f, 0x5e, 0x78, - 0x12, 0x34, 0xc6, 0xe0, 0x8a, 0xac, 0x73, 0x55, 0x3f, 0x19, - 0xeb, 0xcd, 0xa7, 0x81, 0x04, 0x22, 0x48, 0x6e, 0x9c, 0xba, - 0xd0, 0xf6, 0x29, 0x0f, 0x65, 0x43, 0xb1, 0x97, 0xfd, 0xdb, - 0x9f, 0xb9, 0xd3, 0xf5, 0x07, 0x21, 0x4b, 0x6d, 0xb2, 0x94, - 0xfe, 0xd8, 0x2a, 0x0c, 0x66, 0x40, 0xc5, 0xe3, 0x89, 0xaf, - 0x5d, 0x7b, 0x11, 0x37, 0xe8, 0xce, 0xa4, 0x82, 0x70, 0x56, - 0x3c, 0x1a, 0x2b, 0x0d, 0x67, 0x41, 0xb3, 0x95, 0xff, 0xd9, - 0x06, 0x20, 0x4a, 0x6c, 0x9e, 0xb8, 0xd2, 0xf4, 0x71, 0x57, - 0x3d, 0x1b, 0xe9, 0xcf, 0xa5, 0x83, 0x5c, 0x7a, 0x10, 0x36, - 0xc4, 0xe2, 0x88, 0xae, 0x00, 0x27, 0x4e, 0x69, 0x9c, 0xbb, - 0xd2, 0xf5, 0x25, 0x02, 0x6b, 0x4c, 0xb9, 0x9e, 0xf7, 0xd0, - 0x4a, 0x6d, 0x04, 0x23, 0xd6, 0xf1, 0x98, 0xbf, 0x6f, 0x48, - 0x21, 0x06, 0xf3, 0xd4, 0xbd, 0x9a, 0x94, 0xb3, 0xda, 0xfd, - 0x08, 0x2f, 0x46, 0x61, 0xb1, 0x96, 0xff, 0xd8, 0x2d, 0x0a, - 0x63, 0x44, 0xde, 0xf9, 0x90, 0xb7, 0x42, 0x65, 0x0c, 0x2b, - 0xfb, 0xdc, 0xb5, 0x92, 0x67, 0x40, 0x29, 0x0e, 0x35, 0x12, - 0x7b, 0x5c, 0xa9, 0x8e, 0xe7, 0xc0, 0x10, 0x37, 0x5e, 0x79, - 0x8c, 0xab, 0xc2, 0xe5, 0x7f, 0x58, 0x31, 0x16, 0xe3, 0xc4, - 0xad, 0x8a, 0x5a, 0x7d, 0x14, 0x33, 0xc6, 0xe1, 0x88, 0xaf, - 0xa1, 0x86, 0xef, 0xc8, 0x3d, 0x1a, 0x73, 0x54, 0x84, 0xa3, - 0xca, 0xed, 0x18, 0x3f, 0x56, 0x71, 0xeb, 0xcc, 0xa5, 0x82, - 0x77, 0x50, 0x39, 0x1e, 0xce, 0xe9, 0x80, 0xa7, 0x52, 0x75, - 0x1c, 0x3b, 0x6a, 0x4d, 0x24, 0x03, 0xf6, 0xd1, 0xb8, 0x9f, - 0x4f, 0x68, 0x01, 0x26, 0xd3, 0xf4, 0x9d, 0xba, 0x20, 0x07, - 0x6e, 0x49, 0xbc, 0x9b, 0xf2, 0xd5, 0x05, 0x22, 0x4b, 0x6c, - 0x99, 0xbe, 0xd7, 0xf0, 0xfe, 0xd9, 0xb0, 0x97, 0x62, 0x45, - 0x2c, 0x0b, 0xdb, 0xfc, 0x95, 0xb2, 0x47, 0x60, 0x09, 0x2e, - 0xb4, 0x93, 0xfa, 0xdd, 0x28, 0x0f, 0x66, 0x41, 0x91, 0xb6, - 0xdf, 0xf8, 0x0d, 0x2a, 0x43, 0x64, 0x5f, 0x78, 0x11, 0x36, - 0xc3, 0xe4, 0x8d, 0xaa, 0x7a, 0x5d, 0x34, 0x13, 0xe6, 0xc1, - 0xa8, 0x8f, 0x15, 0x32, 0x5b, 0x7c, 0x89, 0xae, 0xc7, 0xe0, - 0x30, 0x17, 0x7e, 0x59, 0xac, 0x8b, 0xe2, 0xc5, 0xcb, 0xec, - 0x85, 0xa2, 0x57, 0x70, 0x19, 0x3e, 0xee, 0xc9, 0xa0, 0x87, - 0x72, 0x55, 0x3c, 0x1b, 0x81, 0xa6, 0xcf, 0xe8, 0x1d, 0x3a, - 0x53, 0x74, 0xa4, 0x83, 0xea, 0xcd, 0x38, 0x1f, 0x76, 0x51, - 0x00, 0x28, 0x50, 0x78, 0xa0, 0x88, 0xf0, 0xd8, 0x5d, 0x75, - 0x0d, 0x25, 0xfd, 0xd5, 0xad, 0x85, 0xba, 0x92, 0xea, 0xc2, - 0x1a, 0x32, 0x4a, 0x62, 0xe7, 0xcf, 0xb7, 0x9f, 0x47, 0x6f, - 0x17, 0x3f, 0x69, 0x41, 0x39, 0x11, 0xc9, 0xe1, 0x99, 0xb1, - 0x34, 0x1c, 0x64, 0x4c, 0x94, 0xbc, 0xc4, 0xec, 0xd3, 0xfb, - 0x83, 0xab, 0x73, 0x5b, 0x23, 0x0b, 0x8e, 0xa6, 0xde, 0xf6, - 0x2e, 0x06, 0x7e, 0x56, 0xd2, 0xfa, 0x82, 0xaa, 0x72, 0x5a, - 0x22, 0x0a, 0x8f, 0xa7, 0xdf, 0xf7, 0x2f, 0x07, 0x7f, 0x57, - 0x68, 0x40, 0x38, 0x10, 0xc8, 0xe0, 0x98, 0xb0, 0x35, 0x1d, - 0x65, 0x4d, 0x95, 0xbd, 0xc5, 0xed, 0xbb, 0x93, 0xeb, 0xc3, - 0x1b, 0x33, 0x4b, 0x63, 0xe6, 0xce, 0xb6, 0x9e, 0x46, 0x6e, - 0x16, 0x3e, 0x01, 0x29, 0x51, 0x79, 0xa1, 0x89, 0xf1, 0xd9, - 0x5c, 0x74, 0x0c, 0x24, 0xfc, 0xd4, 0xac, 0x84, 0xb9, 0x91, - 0xe9, 0xc1, 0x19, 0x31, 0x49, 0x61, 0xe4, 0xcc, 0xb4, 0x9c, - 0x44, 0x6c, 0x14, 0x3c, 0x03, 0x2b, 0x53, 0x7b, 0xa3, 0x8b, - 0xf3, 0xdb, 0x5e, 0x76, 0x0e, 0x26, 0xfe, 0xd6, 0xae, 0x86, - 0xd0, 0xf8, 0x80, 0xa8, 0x70, 0x58, 0x20, 0x08, 0x8d, 0xa5, - 0xdd, 0xf5, 0x2d, 0x05, 0x7d, 0x55, 0x6a, 0x42, 0x3a, 0x12, - 0xca, 0xe2, 0x9a, 0xb2, 0x37, 0x1f, 0x67, 0x4f, 0x97, 0xbf, - 0xc7, 0xef, 0x6b, 0x43, 0x3b, 0x13, 0xcb, 0xe3, 0x9b, 0xb3, - 0x36, 0x1e, 0x66, 0x4e, 0x96, 0xbe, 0xc6, 0xee, 0xd1, 0xf9, - 0x81, 0xa9, 0x71, 0x59, 0x21, 0x09, 0x8c, 0xa4, 0xdc, 0xf4, - 0x2c, 0x04, 0x7c, 0x54, 0x02, 0x2a, 0x52, 0x7a, 0xa2, 0x8a, - 0xf2, 0xda, 0x5f, 0x77, 0x0f, 0x27, 0xff, 0xd7, 0xaf, 0x87, - 0xb8, 0x90, 0xe8, 0xc0, 0x18, 0x30, 0x48, 0x60, 0xe5, 0xcd, - 0xb5, 0x9d, 0x45, 0x6d, 0x15, 0x3d, 0x00, 0x29, 0x52, 0x7b, - 0xa4, 0x8d, 0xf6, 0xdf, 0x55, 0x7c, 0x07, 0x2e, 0xf1, 0xd8, - 0xa3, 0x8a, 0xaa, 0x83, 0xf8, 0xd1, 0x0e, 0x27, 0x5c, 0x75, - 0xff, 0xd6, 0xad, 0x84, 0x5b, 0x72, 0x09, 0x20, 0x49, 0x60, - 0x1b, 0x32, 0xed, 0xc4, 0xbf, 0x96, 0x1c, 0x35, 0x4e, 0x67, - 0xb8, 0x91, 0xea, 0xc3, 0xe3, 0xca, 0xb1, 0x98, 0x47, 0x6e, - 0x15, 0x3c, 0xb6, 0x9f, 0xe4, 0xcd, 0x12, 0x3b, 0x40, 0x69, - 0x92, 0xbb, 0xc0, 0xe9, 0x36, 0x1f, 0x64, 0x4d, 0xc7, 0xee, - 0x95, 0xbc, 0x63, 0x4a, 0x31, 0x18, 0x38, 0x11, 0x6a, 0x43, - 0x9c, 0xb5, 0xce, 0xe7, 0x6d, 0x44, 0x3f, 0x16, 0xc9, 0xe0, - 0x9b, 0xb2, 0xdb, 0xf2, 0x89, 0xa0, 0x7f, 0x56, 0x2d, 0x04, - 0x8e, 0xa7, 0xdc, 0xf5, 0x2a, 0x03, 0x78, 0x51, 0x71, 0x58, - 0x23, 0x0a, 0xd5, 0xfc, 0x87, 0xae, 0x24, 0x0d, 0x76, 0x5f, - 0x80, 0xa9, 0xd2, 0xfb, 0x39, 0x10, 0x6b, 0x42, 0x9d, 0xb4, - 0xcf, 0xe6, 0x6c, 0x45, 0x3e, 0x17, 0xc8, 0xe1, 0x9a, 0xb3, - 0x93, 0xba, 0xc1, 0xe8, 0x37, 0x1e, 0x65, 0x4c, 0xc6, 0xef, - 0x94, 0xbd, 0x62, 0x4b, 0x30, 0x19, 0x70, 0x59, 0x22, 0x0b, - 0xd4, 0xfd, 0x86, 0xaf, 0x25, 0x0c, 0x77, 0x5e, 0x81, 0xa8, - 0xd3, 0xfa, 0xda, 0xf3, 0x88, 0xa1, 0x7e, 0x57, 0x2c, 0x05, - 0x8f, 0xa6, 0xdd, 0xf4, 0x2b, 0x02, 0x79, 0x50, 0xab, 0x82, - 0xf9, 0xd0, 0x0f, 0x26, 0x5d, 0x74, 0xfe, 0xd7, 0xac, 0x85, - 0x5a, 0x73, 0x08, 0x21, 0x01, 0x28, 0x53, 0x7a, 0xa5, 0x8c, - 0xf7, 0xde, 0x54, 0x7d, 0x06, 0x2f, 0xf0, 0xd9, 0xa2, 0x8b, - 0xe2, 0xcb, 0xb0, 0x99, 0x46, 0x6f, 0x14, 0x3d, 0xb7, 0x9e, - 0xe5, 0xcc, 0x13, 0x3a, 0x41, 0x68, 0x48, 0x61, 0x1a, 0x33, - 0xec, 0xc5, 0xbe, 0x97, 0x1d, 0x34, 0x4f, 0x66, 0xb9, 0x90, - 0xeb, 0xc2, 0x00, 0x2a, 0x54, 0x7e, 0xa8, 0x82, 0xfc, 0xd6, - 0x4d, 0x67, 0x19, 0x33, 0xe5, 0xcf, 0xb1, 0x9b, 0x9a, 0xb0, - 0xce, 0xe4, 0x32, 0x18, 0x66, 0x4c, 0xd7, 0xfd, 0x83, 0xa9, - 0x7f, 0x55, 0x2b, 0x01, 0x29, 0x03, 0x7d, 0x57, 0x81, 0xab, - 0xd5, 0xff, 0x64, 0x4e, 0x30, 0x1a, 0xcc, 0xe6, 0x98, 0xb2, - 0xb3, 0x99, 0xe7, 0xcd, 0x1b, 0x31, 0x4f, 0x65, 0xfe, 0xd4, - 0xaa, 0x80, 0x56, 0x7c, 0x02, 0x28, 0x52, 0x78, 0x06, 0x2c, - 0xfa, 0xd0, 0xae, 0x84, 0x1f, 0x35, 0x4b, 0x61, 0xb7, 0x9d, - 0xe3, 0xc9, 0xc8, 0xe2, 0x9c, 0xb6, 0x60, 0x4a, 0x34, 0x1e, - 0x85, 0xaf, 0xd1, 0xfb, 0x2d, 0x07, 0x79, 0x53, 0x7b, 0x51, - 0x2f, 0x05, 0xd3, 0xf9, 0x87, 0xad, 0x36, 0x1c, 0x62, 0x48, - 0x9e, 0xb4, 0xca, 0xe0, 0xe1, 0xcb, 0xb5, 0x9f, 0x49, 0x63, - 0x1d, 0x37, 0xac, 0x86, 0xf8, 0xd2, 0x04, 0x2e, 0x50, 0x7a, - 0xa4, 0x8e, 0xf0, 0xda, 0x0c, 0x26, 0x58, 0x72, 0xe9, 0xc3, - 0xbd, 0x97, 0x41, 0x6b, 0x15, 0x3f, 0x3e, 0x14, 0x6a, 0x40, - 0x96, 0xbc, 0xc2, 0xe8, 0x73, 0x59, 0x27, 0x0d, 0xdb, 0xf1, - 0x8f, 0xa5, 0x8d, 0xa7, 0xd9, 0xf3, 0x25, 0x0f, 0x71, 0x5b, - 0xc0, 0xea, 0x94, 0xbe, 0x68, 0x42, 0x3c, 0x16, 0x17, 0x3d, - 0x43, 0x69, 0xbf, 0x95, 0xeb, 0xc1, 0x5a, 0x70, 0x0e, 0x24, - 0xf2, 0xd8, 0xa6, 0x8c, 0xf6, 0xdc, 0xa2, 0x88, 0x5e, 0x74, - 0x0a, 0x20, 0xbb, 0x91, 0xef, 0xc5, 0x13, 0x39, 0x47, 0x6d, - 0x6c, 0x46, 0x38, 0x12, 0xc4, 0xee, 0x90, 0xba, 0x21, 0x0b, - 0x75, 0x5f, 0x89, 0xa3, 0xdd, 0xf7, 0xdf, 0xf5, 0x8b, 0xa1, - 0x77, 0x5d, 0x23, 0x09, 0x92, 0xb8, 0xc6, 0xec, 0x3a, 0x10, - 0x6e, 0x44, 0x45, 0x6f, 0x11, 0x3b, 0xed, 0xc7, 0xb9, 0x93, - 0x08, 0x22, 0x5c, 0x76, 0xa0, 0x8a, 0xf4, 0xde, 0x00, 0x2b, - 0x56, 0x7d, 0xac, 0x87, 0xfa, 0xd1, 0x45, 0x6e, 0x13, 0x38, - 0xe9, 0xc2, 0xbf, 0x94, 0x8a, 0xa1, 0xdc, 0xf7, 0x26, 0x0d, - 0x70, 0x5b, 0xcf, 0xe4, 0x99, 0xb2, 0x63, 0x48, 0x35, 0x1e, - 0x09, 0x22, 0x5f, 0x74, 0xa5, 0x8e, 0xf3, 0xd8, 0x4c, 0x67, - 0x1a, 0x31, 0xe0, 0xcb, 0xb6, 0x9d, 0x83, 0xa8, 0xd5, 0xfe, - 0x2f, 0x04, 0x79, 0x52, 0xc6, 0xed, 0x90, 0xbb, 0x6a, 0x41, - 0x3c, 0x17, 0x12, 0x39, 0x44, 0x6f, 0xbe, 0x95, 0xe8, 0xc3, - 0x57, 0x7c, 0x01, 0x2a, 0xfb, 0xd0, 0xad, 0x86, 0x98, 0xb3, - 0xce, 0xe5, 0x34, 0x1f, 0x62, 0x49, 0xdd, 0xf6, 0x8b, 0xa0, - 0x71, 0x5a, 0x27, 0x0c, 0x1b, 0x30, 0x4d, 0x66, 0xb7, 0x9c, - 0xe1, 0xca, 0x5e, 0x75, 0x08, 0x23, 0xf2, 0xd9, 0xa4, 0x8f, - 0x91, 0xba, 0xc7, 0xec, 0x3d, 0x16, 0x6b, 0x40, 0xd4, 0xff, - 0x82, 0xa9, 0x78, 0x53, 0x2e, 0x05, 0x24, 0x0f, 0x72, 0x59, - 0x88, 0xa3, 0xde, 0xf5, 0x61, 0x4a, 0x37, 0x1c, 0xcd, 0xe6, - 0x9b, 0xb0, 0xae, 0x85, 0xf8, 0xd3, 0x02, 0x29, 0x54, 0x7f, - 0xeb, 0xc0, 0xbd, 0x96, 0x47, 0x6c, 0x11, 0x3a, 0x2d, 0x06, - 0x7b, 0x50, 0x81, 0xaa, 0xd7, 0xfc, 0x68, 0x43, 0x3e, 0x15, - 0xc4, 0xef, 0x92, 0xb9, 0xa7, 0x8c, 0xf1, 0xda, 0x0b, 0x20, - 0x5d, 0x76, 0xe2, 0xc9, 0xb4, 0x9f, 0x4e, 0x65, 0x18, 0x33, - 0x36, 0x1d, 0x60, 0x4b, 0x9a, 0xb1, 0xcc, 0xe7, 0x73, 0x58, - 0x25, 0x0e, 0xdf, 0xf4, 0x89, 0xa2, 0xbc, 0x97, 0xea, 0xc1, - 0x10, 0x3b, 0x46, 0x6d, 0xf9, 0xd2, 0xaf, 0x84, 0x55, 0x7e, - 0x03, 0x28, 0x3f, 0x14, 0x69, 0x42, 0x93, 0xb8, 0xc5, 0xee, - 0x7a, 0x51, 0x2c, 0x07, 0xd6, 0xfd, 0x80, 0xab, 0xb5, 0x9e, - 0xe3, 0xc8, 0x19, 0x32, 0x4f, 0x64, 0xf0, 0xdb, 0xa6, 0x8d, - 0x5c, 0x77, 0x0a, 0x21, 0x00, 0x2c, 0x58, 0x74, 0xb0, 0x9c, - 0xe8, 0xc4, 0x7d, 0x51, 0x25, 0x09, 0xcd, 0xe1, 0x95, 0xb9, - 0xfa, 0xd6, 0xa2, 0x8e, 0x4a, 0x66, 0x12, 0x3e, 0x87, 0xab, - 0xdf, 0xf3, 0x37, 0x1b, 0x6f, 0x43, 0xe9, 0xc5, 0xb1, 0x9d, - 0x59, 0x75, 0x01, 0x2d, 0x94, 0xb8, 0xcc, 0xe0, 0x24, 0x08, - 0x7c, 0x50, 0x13, 0x3f, 0x4b, 0x67, 0xa3, 0x8f, 0xfb, 0xd7, - 0x6e, 0x42, 0x36, 0x1a, 0xde, 0xf2, 0x86, 0xaa, 0xcf, 0xe3, - 0x97, 0xbb, 0x7f, 0x53, 0x27, 0x0b, 0xb2, 0x9e, 0xea, 0xc6, - 0x02, 0x2e, 0x5a, 0x76, 0x35, 0x19, 0x6d, 0x41, 0x85, 0xa9, - 0xdd, 0xf1, 0x48, 0x64, 0x10, 0x3c, 0xf8, 0xd4, 0xa0, 0x8c, - 0x26, 0x0a, 0x7e, 0x52, 0x96, 0xba, 0xce, 0xe2, 0x5b, 0x77, - 0x03, 0x2f, 0xeb, 0xc7, 0xb3, 0x9f, 0xdc, 0xf0, 0x84, 0xa8, - 0x6c, 0x40, 0x34, 0x18, 0xa1, 0x8d, 0xf9, 0xd5, 0x11, 0x3d, - 0x49, 0x65, 0x83, 0xaf, 0xdb, 0xf7, 0x33, 0x1f, 0x6b, 0x47, - 0xfe, 0xd2, 0xa6, 0x8a, 0x4e, 0x62, 0x16, 0x3a, 0x79, 0x55, - 0x21, 0x0d, 0xc9, 0xe5, 0x91, 0xbd, 0x04, 0x28, 0x5c, 0x70, - 0xb4, 0x98, 0xec, 0xc0, 0x6a, 0x46, 0x32, 0x1e, 0xda, 0xf6, - 0x82, 0xae, 0x17, 0x3b, 0x4f, 0x63, 0xa7, 0x8b, 0xff, 0xd3, - 0x90, 0xbc, 0xc8, 0xe4, 0x20, 0x0c, 0x78, 0x54, 0xed, 0xc1, - 0xb5, 0x99, 0x5d, 0x71, 0x05, 0x29, 0x4c, 0x60, 0x14, 0x38, - 0xfc, 0xd0, 0xa4, 0x88, 0x31, 0x1d, 0x69, 0x45, 0x81, 0xad, - 0xd9, 0xf5, 0xb6, 0x9a, 0xee, 0xc2, 0x06, 0x2a, 0x5e, 0x72, - 0xcb, 0xe7, 0x93, 0xbf, 0x7b, 0x57, 0x23, 0x0f, 0xa5, 0x89, - 0xfd, 0xd1, 0x15, 0x39, 0x4d, 0x61, 0xd8, 0xf4, 0x80, 0xac, - 0x68, 0x44, 0x30, 0x1c, 0x5f, 0x73, 0x07, 0x2b, 0xef, 0xc3, - 0xb7, 0x9b, 0x22, 0x0e, 0x7a, 0x56, 0x92, 0xbe, 0xca, 0xe6, - 0x00, 0x2d, 0x5a, 0x77, 0xb4, 0x99, 0xee, 0xc3, 0x75, 0x58, - 0x2f, 0x02, 0xc1, 0xec, 0x9b, 0xb6, 0xea, 0xc7, 0xb0, 0x9d, - 0x5e, 0x73, 0x04, 0x29, 0x9f, 0xb2, 0xc5, 0xe8, 0x2b, 0x06, - 0x71, 0x5c, 0xc9, 0xe4, 0x93, 0xbe, 0x7d, 0x50, 0x27, 0x0a, - 0xbc, 0x91, 0xe6, 0xcb, 0x08, 0x25, 0x52, 0x7f, 0x23, 0x0e, - 0x79, 0x54, 0x97, 0xba, 0xcd, 0xe0, 0x56, 0x7b, 0x0c, 0x21, - 0xe2, 0xcf, 0xb8, 0x95, 0x8f, 0xa2, 0xd5, 0xf8, 0x3b, 0x16, - 0x61, 0x4c, 0xfa, 0xd7, 0xa0, 0x8d, 0x4e, 0x63, 0x14, 0x39, - 0x65, 0x48, 0x3f, 0x12, 0xd1, 0xfc, 0x8b, 0xa6, 0x10, 0x3d, - 0x4a, 0x67, 0xa4, 0x89, 0xfe, 0xd3, 0x46, 0x6b, 0x1c, 0x31, - 0xf2, 0xdf, 0xa8, 0x85, 0x33, 0x1e, 0x69, 0x44, 0x87, 0xaa, - 0xdd, 0xf0, 0xac, 0x81, 0xf6, 0xdb, 0x18, 0x35, 0x42, 0x6f, - 0xd9, 0xf4, 0x83, 0xae, 0x6d, 0x40, 0x37, 0x1a, 0x03, 0x2e, - 0x59, 0x74, 0xb7, 0x9a, 0xed, 0xc0, 0x76, 0x5b, 0x2c, 0x01, - 0xc2, 0xef, 0x98, 0xb5, 0xe9, 0xc4, 0xb3, 0x9e, 0x5d, 0x70, - 0x07, 0x2a, 0x9c, 0xb1, 0xc6, 0xeb, 0x28, 0x05, 0x72, 0x5f, - 0xca, 0xe7, 0x90, 0xbd, 0x7e, 0x53, 0x24, 0x09, 0xbf, 0x92, - 0xe5, 0xc8, 0x0b, 0x26, 0x51, 0x7c, 0x20, 0x0d, 0x7a, 0x57, - 0x94, 0xb9, 0xce, 0xe3, 0x55, 0x78, 0x0f, 0x22, 0xe1, 0xcc, - 0xbb, 0x96, 0x8c, 0xa1, 0xd6, 0xfb, 0x38, 0x15, 0x62, 0x4f, - 0xf9, 0xd4, 0xa3, 0x8e, 0x4d, 0x60, 0x17, 0x3a, 0x66, 0x4b, - 0x3c, 0x11, 0xd2, 0xff, 0x88, 0xa5, 0x13, 0x3e, 0x49, 0x64, - 0xa7, 0x8a, 0xfd, 0xd0, 0x45, 0x68, 0x1f, 0x32, 0xf1, 0xdc, - 0xab, 0x86, 0x30, 0x1d, 0x6a, 0x47, 0x84, 0xa9, 0xde, 0xf3, - 0xaf, 0x82, 0xf5, 0xd8, 0x1b, 0x36, 0x41, 0x6c, 0xda, 0xf7, - 0x80, 0xad, 0x6e, 0x43, 0x34, 0x19, 0x00, 0x2e, 0x5c, 0x72, - 0xb8, 0x96, 0xe4, 0xca, 0x6d, 0x43, 0x31, 0x1f, 0xd5, 0xfb, - 0x89, 0xa7, 0xda, 0xf4, 0x86, 0xa8, 0x62, 0x4c, 0x3e, 0x10, - 0xb7, 0x99, 0xeb, 0xc5, 0x0f, 0x21, 0x53, 0x7d, 0xa9, 0x87, - 0xf5, 0xdb, 0x11, 0x3f, 0x4d, 0x63, 0xc4, 0xea, 0x98, 0xb6, - 0x7c, 0x52, 0x20, 0x0e, 0x73, 0x5d, 0x2f, 0x01, 0xcb, 0xe5, - 0x97, 0xb9, 0x1e, 0x30, 0x42, 0x6c, 0xa6, 0x88, 0xfa, 0xd4, - 0x4f, 0x61, 0x13, 0x3d, 0xf7, 0xd9, 0xab, 0x85, 0x22, 0x0c, - 0x7e, 0x50, 0x9a, 0xb4, 0xc6, 0xe8, 0x95, 0xbb, 0xc9, 0xe7, - 0x2d, 0x03, 0x71, 0x5f, 0xf8, 0xd6, 0xa4, 0x8a, 0x40, 0x6e, - 0x1c, 0x32, 0xe6, 0xc8, 0xba, 0x94, 0x5e, 0x70, 0x02, 0x2c, - 0x8b, 0xa5, 0xd7, 0xf9, 0x33, 0x1d, 0x6f, 0x41, 0x3c, 0x12, - 0x60, 0x4e, 0x84, 0xaa, 0xd8, 0xf6, 0x51, 0x7f, 0x0d, 0x23, - 0xe9, 0xc7, 0xb5, 0x9b, 0x9e, 0xb0, 0xc2, 0xec, 0x26, 0x08, - 0x7a, 0x54, 0xf3, 0xdd, 0xaf, 0x81, 0x4b, 0x65, 0x17, 0x39, - 0x44, 0x6a, 0x18, 0x36, 0xfc, 0xd2, 0xa0, 0x8e, 0x29, 0x07, - 0x75, 0x5b, 0x91, 0xbf, 0xcd, 0xe3, 0x37, 0x19, 0x6b, 0x45, - 0x8f, 0xa1, 0xd3, 0xfd, 0x5a, 0x74, 0x06, 0x28, 0xe2, 0xcc, - 0xbe, 0x90, 0xed, 0xc3, 0xb1, 0x9f, 0x55, 0x7b, 0x09, 0x27, - 0x80, 0xae, 0xdc, 0xf2, 0x38, 0x16, 0x64, 0x4a, 0xd1, 0xff, - 0x8d, 0xa3, 0x69, 0x47, 0x35, 0x1b, 0xbc, 0x92, 0xe0, 0xce, - 0x04, 0x2a, 0x58, 0x76, 0x0b, 0x25, 0x57, 0x79, 0xb3, 0x9d, - 0xef, 0xc1, 0x66, 0x48, 0x3a, 0x14, 0xde, 0xf0, 0x82, 0xac, - 0x78, 0x56, 0x24, 0x0a, 0xc0, 0xee, 0x9c, 0xb2, 0x15, 0x3b, - 0x49, 0x67, 0xad, 0x83, 0xf1, 0xdf, 0xa2, 0x8c, 0xfe, 0xd0, - 0x1a, 0x34, 0x46, 0x68, 0xcf, 0xe1, 0x93, 0xbd, 0x77, 0x59, - 0x2b, 0x05, 0x00, 0x2f, 0x5e, 0x71, 0xbc, 0x93, 0xe2, 0xcd, - 0x65, 0x4a, 0x3b, 0x14, 0xd9, 0xf6, 0x87, 0xa8, 0xca, 0xe5, - 0x94, 0xbb, 0x76, 0x59, 0x28, 0x07, 0xaf, 0x80, 0xf1, 0xde, - 0x13, 0x3c, 0x4d, 0x62, 0x89, 0xa6, 0xd7, 0xf8, 0x35, 0x1a, - 0x6b, 0x44, 0xec, 0xc3, 0xb2, 0x9d, 0x50, 0x7f, 0x0e, 0x21, - 0x43, 0x6c, 0x1d, 0x32, 0xff, 0xd0, 0xa1, 0x8e, 0x26, 0x09, - 0x78, 0x57, 0x9a, 0xb5, 0xc4, 0xeb, 0x0f, 0x20, 0x51, 0x7e, - 0xb3, 0x9c, 0xed, 0xc2, 0x6a, 0x45, 0x34, 0x1b, 0xd6, 0xf9, - 0x88, 0xa7, 0xc5, 0xea, 0x9b, 0xb4, 0x79, 0x56, 0x27, 0x08, - 0xa0, 0x8f, 0xfe, 0xd1, 0x1c, 0x33, 0x42, 0x6d, 0x86, 0xa9, - 0xd8, 0xf7, 0x3a, 0x15, 0x64, 0x4b, 0xe3, 0xcc, 0xbd, 0x92, - 0x5f, 0x70, 0x01, 0x2e, 0x4c, 0x63, 0x12, 0x3d, 0xf0, 0xdf, - 0xae, 0x81, 0x29, 0x06, 0x77, 0x58, 0x95, 0xba, 0xcb, 0xe4, - 0x1e, 0x31, 0x40, 0x6f, 0xa2, 0x8d, 0xfc, 0xd3, 0x7b, 0x54, - 0x25, 0x0a, 0xc7, 0xe8, 0x99, 0xb6, 0xd4, 0xfb, 0x8a, 0xa5, - 0x68, 0x47, 0x36, 0x19, 0xb1, 0x9e, 0xef, 0xc0, 0x0d, 0x22, - 0x53, 0x7c, 0x97, 0xb8, 0xc9, 0xe6, 0x2b, 0x04, 0x75, 0x5a, - 0xf2, 0xdd, 0xac, 0x83, 0x4e, 0x61, 0x10, 0x3f, 0x5d, 0x72, - 0x03, 0x2c, 0xe1, 0xce, 0xbf, 0x90, 0x38, 0x17, 0x66, 0x49, - 0x84, 0xab, 0xda, 0xf5, 0x11, 0x3e, 0x4f, 0x60, 0xad, 0x82, - 0xf3, 0xdc, 0x74, 0x5b, 0x2a, 0x05, 0xc8, 0xe7, 0x96, 0xb9, - 0xdb, 0xf4, 0x85, 0xaa, 0x67, 0x48, 0x39, 0x16, 0xbe, 0x91, - 0xe0, 0xcf, 0x02, 0x2d, 0x5c, 0x73, 0x98, 0xb7, 0xc6, 0xe9, - 0x24, 0x0b, 0x7a, 0x55, 0xfd, 0xd2, 0xa3, 0x8c, 0x41, 0x6e, - 0x1f, 0x30, 0x52, 0x7d, 0x0c, 0x23, 0xee, 0xc1, 0xb0, 0x9f, - 0x37, 0x18, 0x69, 0x46, 0x8b, 0xa4, 0xd5, 0xfa, 0x00, 0x30, - 0x60, 0x50, 0xc0, 0xf0, 0xa0, 0x90, 0x9d, 0xad, 0xfd, 0xcd, - 0x5d, 0x6d, 0x3d, 0x0d, 0x27, 0x17, 0x47, 0x77, 0xe7, 0xd7, - 0x87, 0xb7, 0xba, 0x8a, 0xda, 0xea, 0x7a, 0x4a, 0x1a, 0x2a, - 0x4e, 0x7e, 0x2e, 0x1e, 0x8e, 0xbe, 0xee, 0xde, 0xd3, 0xe3, - 0xb3, 0x83, 0x13, 0x23, 0x73, 0x43, 0x69, 0x59, 0x09, 0x39, - 0xa9, 0x99, 0xc9, 0xf9, 0xf4, 0xc4, 0x94, 0xa4, 0x34, 0x04, - 0x54, 0x64, 0x9c, 0xac, 0xfc, 0xcc, 0x5c, 0x6c, 0x3c, 0x0c, - 0x01, 0x31, 0x61, 0x51, 0xc1, 0xf1, 0xa1, 0x91, 0xbb, 0x8b, - 0xdb, 0xeb, 0x7b, 0x4b, 0x1b, 0x2b, 0x26, 0x16, 0x46, 0x76, - 0xe6, 0xd6, 0x86, 0xb6, 0xd2, 0xe2, 0xb2, 0x82, 0x12, 0x22, - 0x72, 0x42, 0x4f, 0x7f, 0x2f, 0x1f, 0x8f, 0xbf, 0xef, 0xdf, - 0xf5, 0xc5, 0x95, 0xa5, 0x35, 0x05, 0x55, 0x65, 0x68, 0x58, - 0x08, 0x38, 0xa8, 0x98, 0xc8, 0xf8, 0x25, 0x15, 0x45, 0x75, - 0xe5, 0xd5, 0x85, 0xb5, 0xb8, 0x88, 0xd8, 0xe8, 0x78, 0x48, - 0x18, 0x28, 0x02, 0x32, 0x62, 0x52, 0xc2, 0xf2, 0xa2, 0x92, - 0x9f, 0xaf, 0xff, 0xcf, 0x5f, 0x6f, 0x3f, 0x0f, 0x6b, 0x5b, - 0x0b, 0x3b, 0xab, 0x9b, 0xcb, 0xfb, 0xf6, 0xc6, 0x96, 0xa6, - 0x36, 0x06, 0x56, 0x66, 0x4c, 0x7c, 0x2c, 0x1c, 0x8c, 0xbc, - 0xec, 0xdc, 0xd1, 0xe1, 0xb1, 0x81, 0x11, 0x21, 0x71, 0x41, - 0xb9, 0x89, 0xd9, 0xe9, 0x79, 0x49, 0x19, 0x29, 0x24, 0x14, - 0x44, 0x74, 0xe4, 0xd4, 0x84, 0xb4, 0x9e, 0xae, 0xfe, 0xce, - 0x5e, 0x6e, 0x3e, 0x0e, 0x03, 0x33, 0x63, 0x53, 0xc3, 0xf3, - 0xa3, 0x93, 0xf7, 0xc7, 0x97, 0xa7, 0x37, 0x07, 0x57, 0x67, - 0x6a, 0x5a, 0x0a, 0x3a, 0xaa, 0x9a, 0xca, 0xfa, 0xd0, 0xe0, - 0xb0, 0x80, 0x10, 0x20, 0x70, 0x40, 0x4d, 0x7d, 0x2d, 0x1d, - 0x8d, 0xbd, 0xed, 0xdd, 0x00, 0x31, 0x62, 0x53, 0xc4, 0xf5, - 0xa6, 0x97, 0x95, 0xa4, 0xf7, 0xc6, 0x51, 0x60, 0x33, 0x02, - 0x37, 0x06, 0x55, 0x64, 0xf3, 0xc2, 0x91, 0xa0, 0xa2, 0x93, - 0xc0, 0xf1, 0x66, 0x57, 0x04, 0x35, 0x6e, 0x5f, 0x0c, 0x3d, - 0xaa, 0x9b, 0xc8, 0xf9, 0xfb, 0xca, 0x99, 0xa8, 0x3f, 0x0e, - 0x5d, 0x6c, 0x59, 0x68, 0x3b, 0x0a, 0x9d, 0xac, 0xff, 0xce, - 0xcc, 0xfd, 0xae, 0x9f, 0x08, 0x39, 0x6a, 0x5b, 0xdc, 0xed, - 0xbe, 0x8f, 0x18, 0x29, 0x7a, 0x4b, 0x49, 0x78, 0x2b, 0x1a, - 0x8d, 0xbc, 0xef, 0xde, 0xeb, 0xda, 0x89, 0xb8, 0x2f, 0x1e, - 0x4d, 0x7c, 0x7e, 0x4f, 0x1c, 0x2d, 0xba, 0x8b, 0xd8, 0xe9, - 0xb2, 0x83, 0xd0, 0xe1, 0x76, 0x47, 0x14, 0x25, 0x27, 0x16, - 0x45, 0x74, 0xe3, 0xd2, 0x81, 0xb0, 0x85, 0xb4, 0xe7, 0xd6, - 0x41, 0x70, 0x23, 0x12, 0x10, 0x21, 0x72, 0x43, 0xd4, 0xe5, - 0xb6, 0x87, 0xa5, 0x94, 0xc7, 0xf6, 0x61, 0x50, 0x03, 0x32, - 0x30, 0x01, 0x52, 0x63, 0xf4, 0xc5, 0x96, 0xa7, 0x92, 0xa3, - 0xf0, 0xc1, 0x56, 0x67, 0x34, 0x05, 0x07, 0x36, 0x65, 0x54, - 0xc3, 0xf2, 0xa1, 0x90, 0xcb, 0xfa, 0xa9, 0x98, 0x0f, 0x3e, - 0x6d, 0x5c, 0x5e, 0x6f, 0x3c, 0x0d, 0x9a, 0xab, 0xf8, 0xc9, - 0xfc, 0xcd, 0x9e, 0xaf, 0x38, 0x09, 0x5a, 0x6b, 0x69, 0x58, - 0x0b, 0x3a, 0xad, 0x9c, 0xcf, 0xfe, 0x79, 0x48, 0x1b, 0x2a, - 0xbd, 0x8c, 0xdf, 0xee, 0xec, 0xdd, 0x8e, 0xbf, 0x28, 0x19, - 0x4a, 0x7b, 0x4e, 0x7f, 0x2c, 0x1d, 0x8a, 0xbb, 0xe8, 0xd9, - 0xdb, 0xea, 0xb9, 0x88, 0x1f, 0x2e, 0x7d, 0x4c, 0x17, 0x26, - 0x75, 0x44, 0xd3, 0xe2, 0xb1, 0x80, 0x82, 0xb3, 0xe0, 0xd1, - 0x46, 0x77, 0x24, 0x15, 0x20, 0x11, 0x42, 0x73, 0xe4, 0xd5, - 0x86, 0xb7, 0xb5, 0x84, 0xd7, 0xe6, 0x71, 0x40, 0x13, 0x22, - 0x00, 0x32, 0x64, 0x56, 0xc8, 0xfa, 0xac, 0x9e, 0x8d, 0xbf, - 0xe9, 0xdb, 0x45, 0x77, 0x21, 0x13, 0x07, 0x35, 0x63, 0x51, - 0xcf, 0xfd, 0xab, 0x99, 0x8a, 0xb8, 0xee, 0xdc, 0x42, 0x70, - 0x26, 0x14, 0x0e, 0x3c, 0x6a, 0x58, 0xc6, 0xf4, 0xa2, 0x90, - 0x83, 0xb1, 0xe7, 0xd5, 0x4b, 0x79, 0x2f, 0x1d, 0x09, 0x3b, - 0x6d, 0x5f, 0xc1, 0xf3, 0xa5, 0x97, 0x84, 0xb6, 0xe0, 0xd2, - 0x4c, 0x7e, 0x28, 0x1a, 0x1c, 0x2e, 0x78, 0x4a, 0xd4, 0xe6, - 0xb0, 0x82, 0x91, 0xa3, 0xf5, 0xc7, 0x59, 0x6b, 0x3d, 0x0f, - 0x1b, 0x29, 0x7f, 0x4d, 0xd3, 0xe1, 0xb7, 0x85, 0x96, 0xa4, - 0xf2, 0xc0, 0x5e, 0x6c, 0x3a, 0x08, 0x12, 0x20, 0x76, 0x44, - 0xda, 0xe8, 0xbe, 0x8c, 0x9f, 0xad, 0xfb, 0xc9, 0x57, 0x65, - 0x33, 0x01, 0x15, 0x27, 0x71, 0x43, 0xdd, 0xef, 0xb9, 0x8b, - 0x98, 0xaa, 0xfc, 0xce, 0x50, 0x62, 0x34, 0x06, 0x38, 0x0a, - 0x5c, 0x6e, 0xf0, 0xc2, 0x94, 0xa6, 0xb5, 0x87, 0xd1, 0xe3, - 0x7d, 0x4f, 0x19, 0x2b, 0x3f, 0x0d, 0x5b, 0x69, 0xf7, 0xc5, - 0x93, 0xa1, 0xb2, 0x80, 0xd6, 0xe4, 0x7a, 0x48, 0x1e, 0x2c, - 0x36, 0x04, 0x52, 0x60, 0xfe, 0xcc, 0x9a, 0xa8, 0xbb, 0x89, - 0xdf, 0xed, 0x73, 0x41, 0x17, 0x25, 0x31, 0x03, 0x55, 0x67, - 0xf9, 0xcb, 0x9d, 0xaf, 0xbc, 0x8e, 0xd8, 0xea, 0x74, 0x46, - 0x10, 0x22, 0x24, 0x16, 0x40, 0x72, 0xec, 0xde, 0x88, 0xba, - 0xa9, 0x9b, 0xcd, 0xff, 0x61, 0x53, 0x05, 0x37, 0x23, 0x11, - 0x47, 0x75, 0xeb, 0xd9, 0x8f, 0xbd, 0xae, 0x9c, 0xca, 0xf8, - 0x66, 0x54, 0x02, 0x30, 0x2a, 0x18, 0x4e, 0x7c, 0xe2, 0xd0, - 0x86, 0xb4, 0xa7, 0x95, 0xc3, 0xf1, 0x6f, 0x5d, 0x0b, 0x39, - 0x2d, 0x1f, 0x49, 0x7b, 0xe5, 0xd7, 0x81, 0xb3, 0xa0, 0x92, - 0xc4, 0xf6, 0x68, 0x5a, 0x0c, 0x3e, 0x00, 0x33, 0x66, 0x55, - 0xcc, 0xff, 0xaa, 0x99, 0x85, 0xb6, 0xe3, 0xd0, 0x49, 0x7a, - 0x2f, 0x1c, 0x17, 0x24, 0x71, 0x42, 0xdb, 0xe8, 0xbd, 0x8e, - 0x92, 0xa1, 0xf4, 0xc7, 0x5e, 0x6d, 0x38, 0x0b, 0x2e, 0x1d, - 0x48, 0x7b, 0xe2, 0xd1, 0x84, 0xb7, 0xab, 0x98, 0xcd, 0xfe, - 0x67, 0x54, 0x01, 0x32, 0x39, 0x0a, 0x5f, 0x6c, 0xf5, 0xc6, - 0x93, 0xa0, 0xbc, 0x8f, 0xda, 0xe9, 0x70, 0x43, 0x16, 0x25, - 0x5c, 0x6f, 0x3a, 0x09, 0x90, 0xa3, 0xf6, 0xc5, 0xd9, 0xea, - 0xbf, 0x8c, 0x15, 0x26, 0x73, 0x40, 0x4b, 0x78, 0x2d, 0x1e, - 0x87, 0xb4, 0xe1, 0xd2, 0xce, 0xfd, 0xa8, 0x9b, 0x02, 0x31, - 0x64, 0x57, 0x72, 0x41, 0x14, 0x27, 0xbe, 0x8d, 0xd8, 0xeb, - 0xf7, 0xc4, 0x91, 0xa2, 0x3b, 0x08, 0x5d, 0x6e, 0x65, 0x56, - 0x03, 0x30, 0xa9, 0x9a, 0xcf, 0xfc, 0xe0, 0xd3, 0x86, 0xb5, - 0x2c, 0x1f, 0x4a, 0x79, 0xb8, 0x8b, 0xde, 0xed, 0x74, 0x47, - 0x12, 0x21, 0x3d, 0x0e, 0x5b, 0x68, 0xf1, 0xc2, 0x97, 0xa4, - 0xaf, 0x9c, 0xc9, 0xfa, 0x63, 0x50, 0x05, 0x36, 0x2a, 0x19, - 0x4c, 0x7f, 0xe6, 0xd5, 0x80, 0xb3, 0x96, 0xa5, 0xf0, 0xc3, - 0x5a, 0x69, 0x3c, 0x0f, 0x13, 0x20, 0x75, 0x46, 0xdf, 0xec, - 0xb9, 0x8a, 0x81, 0xb2, 0xe7, 0xd4, 0x4d, 0x7e, 0x2b, 0x18, - 0x04, 0x37, 0x62, 0x51, 0xc8, 0xfb, 0xae, 0x9d, 0xe4, 0xd7, - 0x82, 0xb1, 0x28, 0x1b, 0x4e, 0x7d, 0x61, 0x52, 0x07, 0x34, - 0xad, 0x9e, 0xcb, 0xf8, 0xf3, 0xc0, 0x95, 0xa6, 0x3f, 0x0c, - 0x59, 0x6a, 0x76, 0x45, 0x10, 0x23, 0xba, 0x89, 0xdc, 0xef, - 0xca, 0xf9, 0xac, 0x9f, 0x06, 0x35, 0x60, 0x53, 0x4f, 0x7c, - 0x29, 0x1a, 0x83, 0xb0, 0xe5, 0xd6, 0xdd, 0xee, 0xbb, 0x88, - 0x11, 0x22, 0x77, 0x44, 0x58, 0x6b, 0x3e, 0x0d, 0x94, 0xa7, - 0xf2, 0xc1, 0x00, 0x34, 0x68, 0x5c, 0xd0, 0xe4, 0xb8, 0x8c, - 0xbd, 0x89, 0xd5, 0xe1, 0x6d, 0x59, 0x05, 0x31, 0x67, 0x53, - 0x0f, 0x3b, 0xb7, 0x83, 0xdf, 0xeb, 0xda, 0xee, 0xb2, 0x86, - 0x0a, 0x3e, 0x62, 0x56, 0xce, 0xfa, 0xa6, 0x92, 0x1e, 0x2a, - 0x76, 0x42, 0x73, 0x47, 0x1b, 0x2f, 0xa3, 0x97, 0xcb, 0xff, - 0xa9, 0x9d, 0xc1, 0xf5, 0x79, 0x4d, 0x11, 0x25, 0x14, 0x20, - 0x7c, 0x48, 0xc4, 0xf0, 0xac, 0x98, 0x81, 0xb5, 0xe9, 0xdd, - 0x51, 0x65, 0x39, 0x0d, 0x3c, 0x08, 0x54, 0x60, 0xec, 0xd8, - 0x84, 0xb0, 0xe6, 0xd2, 0x8e, 0xba, 0x36, 0x02, 0x5e, 0x6a, - 0x5b, 0x6f, 0x33, 0x07, 0x8b, 0xbf, 0xe3, 0xd7, 0x4f, 0x7b, - 0x27, 0x13, 0x9f, 0xab, 0xf7, 0xc3, 0xf2, 0xc6, 0x9a, 0xae, - 0x22, 0x16, 0x4a, 0x7e, 0x28, 0x1c, 0x40, 0x74, 0xf8, 0xcc, - 0x90, 0xa4, 0x95, 0xa1, 0xfd, 0xc9, 0x45, 0x71, 0x2d, 0x19, - 0x1f, 0x2b, 0x77, 0x43, 0xcf, 0xfb, 0xa7, 0x93, 0xa2, 0x96, - 0xca, 0xfe, 0x72, 0x46, 0x1a, 0x2e, 0x78, 0x4c, 0x10, 0x24, - 0xa8, 0x9c, 0xc0, 0xf4, 0xc5, 0xf1, 0xad, 0x99, 0x15, 0x21, - 0x7d, 0x49, 0xd1, 0xe5, 0xb9, 0x8d, 0x01, 0x35, 0x69, 0x5d, - 0x6c, 0x58, 0x04, 0x30, 0xbc, 0x88, 0xd4, 0xe0, 0xb6, 0x82, - 0xde, 0xea, 0x66, 0x52, 0x0e, 0x3a, 0x0b, 0x3f, 0x63, 0x57, - 0xdb, 0xef, 0xb3, 0x87, 0x9e, 0xaa, 0xf6, 0xc2, 0x4e, 0x7a, - 0x26, 0x12, 0x23, 0x17, 0x4b, 0x7f, 0xf3, 0xc7, 0x9b, 0xaf, - 0xf9, 0xcd, 0x91, 0xa5, 0x29, 0x1d, 0x41, 0x75, 0x44, 0x70, - 0x2c, 0x18, 0x94, 0xa0, 0xfc, 0xc8, 0x50, 0x64, 0x38, 0x0c, - 0x80, 0xb4, 0xe8, 0xdc, 0xed, 0xd9, 0x85, 0xb1, 0x3d, 0x09, - 0x55, 0x61, 0x37, 0x03, 0x5f, 0x6b, 0xe7, 0xd3, 0x8f, 0xbb, - 0x8a, 0xbe, 0xe2, 0xd6, 0x5a, 0x6e, 0x32, 0x06, 0x00, 0x35, - 0x6a, 0x5f, 0xd4, 0xe1, 0xbe, 0x8b, 0xb5, 0x80, 0xdf, 0xea, - 0x61, 0x54, 0x0b, 0x3e, 0x77, 0x42, 0x1d, 0x28, 0xa3, 0x96, - 0xc9, 0xfc, 0xc2, 0xf7, 0xa8, 0x9d, 0x16, 0x23, 0x7c, 0x49, - 0xee, 0xdb, 0x84, 0xb1, 0x3a, 0x0f, 0x50, 0x65, 0x5b, 0x6e, - 0x31, 0x04, 0x8f, 0xba, 0xe5, 0xd0, 0x99, 0xac, 0xf3, 0xc6, - 0x4d, 0x78, 0x27, 0x12, 0x2c, 0x19, 0x46, 0x73, 0xf8, 0xcd, - 0x92, 0xa7, 0xc1, 0xf4, 0xab, 0x9e, 0x15, 0x20, 0x7f, 0x4a, - 0x74, 0x41, 0x1e, 0x2b, 0xa0, 0x95, 0xca, 0xff, 0xb6, 0x83, - 0xdc, 0xe9, 0x62, 0x57, 0x08, 0x3d, 0x03, 0x36, 0x69, 0x5c, - 0xd7, 0xe2, 0xbd, 0x88, 0x2f, 0x1a, 0x45, 0x70, 0xfb, 0xce, - 0x91, 0xa4, 0x9a, 0xaf, 0xf0, 0xc5, 0x4e, 0x7b, 0x24, 0x11, - 0x58, 0x6d, 0x32, 0x07, 0x8c, 0xb9, 0xe6, 0xd3, 0xed, 0xd8, - 0x87, 0xb2, 0x39, 0x0c, 0x53, 0x66, 0x9f, 0xaa, 0xf5, 0xc0, - 0x4b, 0x7e, 0x21, 0x14, 0x2a, 0x1f, 0x40, 0x75, 0xfe, 0xcb, - 0x94, 0xa1, 0xe8, 0xdd, 0x82, 0xb7, 0x3c, 0x09, 0x56, 0x63, - 0x5d, 0x68, 0x37, 0x02, 0x89, 0xbc, 0xe3, 0xd6, 0x71, 0x44, - 0x1b, 0x2e, 0xa5, 0x90, 0xcf, 0xfa, 0xc4, 0xf1, 0xae, 0x9b, - 0x10, 0x25, 0x7a, 0x4f, 0x06, 0x33, 0x6c, 0x59, 0xd2, 0xe7, - 0xb8, 0x8d, 0xb3, 0x86, 0xd9, 0xec, 0x67, 0x52, 0x0d, 0x38, - 0x5e, 0x6b, 0x34, 0x01, 0x8a, 0xbf, 0xe0, 0xd5, 0xeb, 0xde, - 0x81, 0xb4, 0x3f, 0x0a, 0x55, 0x60, 0x29, 0x1c, 0x43, 0x76, - 0xfd, 0xc8, 0x97, 0xa2, 0x9c, 0xa9, 0xf6, 0xc3, 0x48, 0x7d, - 0x22, 0x17, 0xb0, 0x85, 0xda, 0xef, 0x64, 0x51, 0x0e, 0x3b, - 0x05, 0x30, 0x6f, 0x5a, 0xd1, 0xe4, 0xbb, 0x8e, 0xc7, 0xf2, - 0xad, 0x98, 0x13, 0x26, 0x79, 0x4c, 0x72, 0x47, 0x18, 0x2d, - 0xa6, 0x93, 0xcc, 0xf9, 0x00, 0x36, 0x6c, 0x5a, 0xd8, 0xee, - 0xb4, 0x82, 0xad, 0x9b, 0xc1, 0xf7, 0x75, 0x43, 0x19, 0x2f, - 0x47, 0x71, 0x2b, 0x1d, 0x9f, 0xa9, 0xf3, 0xc5, 0xea, 0xdc, - 0x86, 0xb0, 0x32, 0x04, 0x5e, 0x68, 0x8e, 0xb8, 0xe2, 0xd4, - 0x56, 0x60, 0x3a, 0x0c, 0x23, 0x15, 0x4f, 0x79, 0xfb, 0xcd, - 0x97, 0xa1, 0xc9, 0xff, 0xa5, 0x93, 0x11, 0x27, 0x7d, 0x4b, - 0x64, 0x52, 0x08, 0x3e, 0xbc, 0x8a, 0xd0, 0xe6, 0x01, 0x37, - 0x6d, 0x5b, 0xd9, 0xef, 0xb5, 0x83, 0xac, 0x9a, 0xc0, 0xf6, - 0x74, 0x42, 0x18, 0x2e, 0x46, 0x70, 0x2a, 0x1c, 0x9e, 0xa8, - 0xf2, 0xc4, 0xeb, 0xdd, 0x87, 0xb1, 0x33, 0x05, 0x5f, 0x69, - 0x8f, 0xb9, 0xe3, 0xd5, 0x57, 0x61, 0x3b, 0x0d, 0x22, 0x14, - 0x4e, 0x78, 0xfa, 0xcc, 0x96, 0xa0, 0xc8, 0xfe, 0xa4, 0x92, - 0x10, 0x26, 0x7c, 0x4a, 0x65, 0x53, 0x09, 0x3f, 0xbd, 0x8b, - 0xd1, 0xe7, 0x02, 0x34, 0x6e, 0x58, 0xda, 0xec, 0xb6, 0x80, - 0xaf, 0x99, 0xc3, 0xf5, 0x77, 0x41, 0x1b, 0x2d, 0x45, 0x73, - 0x29, 0x1f, 0x9d, 0xab, 0xf1, 0xc7, 0xe8, 0xde, 0x84, 0xb2, - 0x30, 0x06, 0x5c, 0x6a, 0x8c, 0xba, 0xe0, 0xd6, 0x54, 0x62, - 0x38, 0x0e, 0x21, 0x17, 0x4d, 0x7b, 0xf9, 0xcf, 0x95, 0xa3, - 0xcb, 0xfd, 0xa7, 0x91, 0x13, 0x25, 0x7f, 0x49, 0x66, 0x50, - 0x0a, 0x3c, 0xbe, 0x88, 0xd2, 0xe4, 0x03, 0x35, 0x6f, 0x59, - 0xdb, 0xed, 0xb7, 0x81, 0xae, 0x98, 0xc2, 0xf4, 0x76, 0x40, - 0x1a, 0x2c, 0x44, 0x72, 0x28, 0x1e, 0x9c, 0xaa, 0xf0, 0xc6, - 0xe9, 0xdf, 0x85, 0xb3, 0x31, 0x07, 0x5d, 0x6b, 0x8d, 0xbb, - 0xe1, 0xd7, 0x55, 0x63, 0x39, 0x0f, 0x20, 0x16, 0x4c, 0x7a, - 0xf8, 0xce, 0x94, 0xa2, 0xca, 0xfc, 0xa6, 0x90, 0x12, 0x24, - 0x7e, 0x48, 0x67, 0x51, 0x0b, 0x3d, 0xbf, 0x89, 0xd3, 0xe5, - 0x00, 0x37, 0x6e, 0x59, 0xdc, 0xeb, 0xb2, 0x85, 0xa5, 0x92, - 0xcb, 0xfc, 0x79, 0x4e, 0x17, 0x20, 0x57, 0x60, 0x39, 0x0e, - 0x8b, 0xbc, 0xe5, 0xd2, 0xf2, 0xc5, 0x9c, 0xab, 0x2e, 0x19, - 0x40, 0x77, 0xae, 0x99, 0xc0, 0xf7, 0x72, 0x45, 0x1c, 0x2b, - 0x0b, 0x3c, 0x65, 0x52, 0xd7, 0xe0, 0xb9, 0x8e, 0xf9, 0xce, - 0x97, 0xa0, 0x25, 0x12, 0x4b, 0x7c, 0x5c, 0x6b, 0x32, 0x05, - 0x80, 0xb7, 0xee, 0xd9, 0x41, 0x76, 0x2f, 0x18, 0x9d, 0xaa, - 0xf3, 0xc4, 0xe4, 0xd3, 0x8a, 0xbd, 0x38, 0x0f, 0x56, 0x61, - 0x16, 0x21, 0x78, 0x4f, 0xca, 0xfd, 0xa4, 0x93, 0xb3, 0x84, - 0xdd, 0xea, 0x6f, 0x58, 0x01, 0x36, 0xef, 0xd8, 0x81, 0xb6, - 0x33, 0x04, 0x5d, 0x6a, 0x4a, 0x7d, 0x24, 0x13, 0x96, 0xa1, - 0xf8, 0xcf, 0xb8, 0x8f, 0xd6, 0xe1, 0x64, 0x53, 0x0a, 0x3d, - 0x1d, 0x2a, 0x73, 0x44, 0xc1, 0xf6, 0xaf, 0x98, 0x82, 0xb5, - 0xec, 0xdb, 0x5e, 0x69, 0x30, 0x07, 0x27, 0x10, 0x49, 0x7e, - 0xfb, 0xcc, 0x95, 0xa2, 0xd5, 0xe2, 0xbb, 0x8c, 0x09, 0x3e, - 0x67, 0x50, 0x70, 0x47, 0x1e, 0x29, 0xac, 0x9b, 0xc2, 0xf5, - 0x2c, 0x1b, 0x42, 0x75, 0xf0, 0xc7, 0x9e, 0xa9, 0x89, 0xbe, - 0xe7, 0xd0, 0x55, 0x62, 0x3b, 0x0c, 0x7b, 0x4c, 0x15, 0x22, - 0xa7, 0x90, 0xc9, 0xfe, 0xde, 0xe9, 0xb0, 0x87, 0x02, 0x35, - 0x6c, 0x5b, 0xc3, 0xf4, 0xad, 0x9a, 0x1f, 0x28, 0x71, 0x46, - 0x66, 0x51, 0x08, 0x3f, 0xba, 0x8d, 0xd4, 0xe3, 0x94, 0xa3, - 0xfa, 0xcd, 0x48, 0x7f, 0x26, 0x11, 0x31, 0x06, 0x5f, 0x68, - 0xed, 0xda, 0x83, 0xb4, 0x6d, 0x5a, 0x03, 0x34, 0xb1, 0x86, - 0xdf, 0xe8, 0xc8, 0xff, 0xa6, 0x91, 0x14, 0x23, 0x7a, 0x4d, - 0x3a, 0x0d, 0x54, 0x63, 0xe6, 0xd1, 0x88, 0xbf, 0x9f, 0xa8, - 0xf1, 0xc6, 0x43, 0x74, 0x2d, 0x1a, 0x00, 0x38, 0x70, 0x48, - 0xe0, 0xd8, 0x90, 0xa8, 0xdd, 0xe5, 0xad, 0x95, 0x3d, 0x05, - 0x4d, 0x75, 0xa7, 0x9f, 0xd7, 0xef, 0x47, 0x7f, 0x37, 0x0f, - 0x7a, 0x42, 0x0a, 0x32, 0x9a, 0xa2, 0xea, 0xd2, 0x53, 0x6b, - 0x23, 0x1b, 0xb3, 0x8b, 0xc3, 0xfb, 0x8e, 0xb6, 0xfe, 0xc6, - 0x6e, 0x56, 0x1e, 0x26, 0xf4, 0xcc, 0x84, 0xbc, 0x14, 0x2c, - 0x64, 0x5c, 0x29, 0x11, 0x59, 0x61, 0xc9, 0xf1, 0xb9, 0x81, - 0xa6, 0x9e, 0xd6, 0xee, 0x46, 0x7e, 0x36, 0x0e, 0x7b, 0x43, - 0x0b, 0x33, 0x9b, 0xa3, 0xeb, 0xd3, 0x01, 0x39, 0x71, 0x49, - 0xe1, 0xd9, 0x91, 0xa9, 0xdc, 0xe4, 0xac, 0x94, 0x3c, 0x04, - 0x4c, 0x74, 0xf5, 0xcd, 0x85, 0xbd, 0x15, 0x2d, 0x65, 0x5d, - 0x28, 0x10, 0x58, 0x60, 0xc8, 0xf0, 0xb8, 0x80, 0x52, 0x6a, - 0x22, 0x1a, 0xb2, 0x8a, 0xc2, 0xfa, 0x8f, 0xb7, 0xff, 0xc7, - 0x6f, 0x57, 0x1f, 0x27, 0x51, 0x69, 0x21, 0x19, 0xb1, 0x89, - 0xc1, 0xf9, 0x8c, 0xb4, 0xfc, 0xc4, 0x6c, 0x54, 0x1c, 0x24, - 0xf6, 0xce, 0x86, 0xbe, 0x16, 0x2e, 0x66, 0x5e, 0x2b, 0x13, - 0x5b, 0x63, 0xcb, 0xf3, 0xbb, 0x83, 0x02, 0x3a, 0x72, 0x4a, - 0xe2, 0xda, 0x92, 0xaa, 0xdf, 0xe7, 0xaf, 0x97, 0x3f, 0x07, - 0x4f, 0x77, 0xa5, 0x9d, 0xd5, 0xed, 0x45, 0x7d, 0x35, 0x0d, - 0x78, 0x40, 0x08, 0x30, 0x98, 0xa0, 0xe8, 0xd0, 0xf7, 0xcf, - 0x87, 0xbf, 0x17, 0x2f, 0x67, 0x5f, 0x2a, 0x12, 0x5a, 0x62, - 0xca, 0xf2, 0xba, 0x82, 0x50, 0x68, 0x20, 0x18, 0xb0, 0x88, - 0xc0, 0xf8, 0x8d, 0xb5, 0xfd, 0xc5, 0x6d, 0x55, 0x1d, 0x25, - 0xa4, 0x9c, 0xd4, 0xec, 0x44, 0x7c, 0x34, 0x0c, 0x79, 0x41, - 0x09, 0x31, 0x99, 0xa1, 0xe9, 0xd1, 0x03, 0x3b, 0x73, 0x4b, - 0xe3, 0xdb, 0x93, 0xab, 0xde, 0xe6, 0xae, 0x96, 0x3e, 0x06, - 0x4e, 0x76, 0x00, 0x39, 0x72, 0x4b, 0xe4, 0xdd, 0x96, 0xaf, - 0xd5, 0xec, 0xa7, 0x9e, 0x31, 0x08, 0x43, 0x7a, 0xb7, 0x8e, - 0xc5, 0xfc, 0x53, 0x6a, 0x21, 0x18, 0x62, 0x5b, 0x10, 0x29, - 0x86, 0xbf, 0xf4, 0xcd, 0x73, 0x4a, 0x01, 0x38, 0x97, 0xae, - 0xe5, 0xdc, 0xa6, 0x9f, 0xd4, 0xed, 0x42, 0x7b, 0x30, 0x09, - 0xc4, 0xfd, 0xb6, 0x8f, 0x20, 0x19, 0x52, 0x6b, 0x11, 0x28, - 0x63, 0x5a, 0xf5, 0xcc, 0x87, 0xbe, 0xe6, 0xdf, 0x94, 0xad, - 0x02, 0x3b, 0x70, 0x49, 0x33, 0x0a, 0x41, 0x78, 0xd7, 0xee, - 0xa5, 0x9c, 0x51, 0x68, 0x23, 0x1a, 0xb5, 0x8c, 0xc7, 0xfe, - 0x84, 0xbd, 0xf6, 0xcf, 0x60, 0x59, 0x12, 0x2b, 0x95, 0xac, - 0xe7, 0xde, 0x71, 0x48, 0x03, 0x3a, 0x40, 0x79, 0x32, 0x0b, - 0xa4, 0x9d, 0xd6, 0xef, 0x22, 0x1b, 0x50, 0x69, 0xc6, 0xff, - 0xb4, 0x8d, 0xf7, 0xce, 0x85, 0xbc, 0x13, 0x2a, 0x61, 0x58, - 0xd1, 0xe8, 0xa3, 0x9a, 0x35, 0x0c, 0x47, 0x7e, 0x04, 0x3d, - 0x76, 0x4f, 0xe0, 0xd9, 0x92, 0xab, 0x66, 0x5f, 0x14, 0x2d, - 0x82, 0xbb, 0xf0, 0xc9, 0xb3, 0x8a, 0xc1, 0xf8, 0x57, 0x6e, - 0x25, 0x1c, 0xa2, 0x9b, 0xd0, 0xe9, 0x46, 0x7f, 0x34, 0x0d, - 0x77, 0x4e, 0x05, 0x3c, 0x93, 0xaa, 0xe1, 0xd8, 0x15, 0x2c, - 0x67, 0x5e, 0xf1, 0xc8, 0x83, 0xba, 0xc0, 0xf9, 0xb2, 0x8b, - 0x24, 0x1d, 0x56, 0x6f, 0x37, 0x0e, 0x45, 0x7c, 0xd3, 0xea, - 0xa1, 0x98, 0xe2, 0xdb, 0x90, 0xa9, 0x06, 0x3f, 0x74, 0x4d, - 0x80, 0xb9, 0xf2, 0xcb, 0x64, 0x5d, 0x16, 0x2f, 0x55, 0x6c, - 0x27, 0x1e, 0xb1, 0x88, 0xc3, 0xfa, 0x44, 0x7d, 0x36, 0x0f, - 0xa0, 0x99, 0xd2, 0xeb, 0x91, 0xa8, 0xe3, 0xda, 0x75, 0x4c, - 0x07, 0x3e, 0xf3, 0xca, 0x81, 0xb8, 0x17, 0x2e, 0x65, 0x5c, - 0x26, 0x1f, 0x54, 0x6d, 0xc2, 0xfb, 0xb0, 0x89, 0x00, 0x3a, - 0x74, 0x4e, 0xe8, 0xd2, 0x9c, 0xa6, 0xcd, 0xf7, 0xb9, 0x83, - 0x25, 0x1f, 0x51, 0x6b, 0x87, 0xbd, 0xf3, 0xc9, 0x6f, 0x55, - 0x1b, 0x21, 0x4a, 0x70, 0x3e, 0x04, 0xa2, 0x98, 0xd6, 0xec, - 0x13, 0x29, 0x67, 0x5d, 0xfb, 0xc1, 0x8f, 0xb5, 0xde, 0xe4, - 0xaa, 0x90, 0x36, 0x0c, 0x42, 0x78, 0x94, 0xae, 0xe0, 0xda, - 0x7c, 0x46, 0x08, 0x32, 0x59, 0x63, 0x2d, 0x17, 0xb1, 0x8b, - 0xc5, 0xff, 0x26, 0x1c, 0x52, 0x68, 0xce, 0xf4, 0xba, 0x80, - 0xeb, 0xd1, 0x9f, 0xa5, 0x03, 0x39, 0x77, 0x4d, 0xa1, 0x9b, - 0xd5, 0xef, 0x49, 0x73, 0x3d, 0x07, 0x6c, 0x56, 0x18, 0x22, - 0x84, 0xbe, 0xf0, 0xca, 0x35, 0x0f, 0x41, 0x7b, 0xdd, 0xe7, - 0xa9, 0x93, 0xf8, 0xc2, 0x8c, 0xb6, 0x10, 0x2a, 0x64, 0x5e, - 0xb2, 0x88, 0xc6, 0xfc, 0x5a, 0x60, 0x2e, 0x14, 0x7f, 0x45, - 0x0b, 0x31, 0x97, 0xad, 0xe3, 0xd9, 0x4c, 0x76, 0x38, 0x02, - 0xa4, 0x9e, 0xd0, 0xea, 0x81, 0xbb, 0xf5, 0xcf, 0x69, 0x53, - 0x1d, 0x27, 0xcb, 0xf1, 0xbf, 0x85, 0x23, 0x19, 0x57, 0x6d, - 0x06, 0x3c, 0x72, 0x48, 0xee, 0xd4, 0x9a, 0xa0, 0x5f, 0x65, - 0x2b, 0x11, 0xb7, 0x8d, 0xc3, 0xf9, 0x92, 0xa8, 0xe6, 0xdc, - 0x7a, 0x40, 0x0e, 0x34, 0xd8, 0xe2, 0xac, 0x96, 0x30, 0x0a, - 0x44, 0x7e, 0x15, 0x2f, 0x61, 0x5b, 0xfd, 0xc7, 0x89, 0xb3, - 0x6a, 0x50, 0x1e, 0x24, 0x82, 0xb8, 0xf6, 0xcc, 0xa7, 0x9d, - 0xd3, 0xe9, 0x4f, 0x75, 0x3b, 0x01, 0xed, 0xd7, 0x99, 0xa3, - 0x05, 0x3f, 0x71, 0x4b, 0x20, 0x1a, 0x54, 0x6e, 0xc8, 0xf2, - 0xbc, 0x86, 0x79, 0x43, 0x0d, 0x37, 0x91, 0xab, 0xe5, 0xdf, - 0xb4, 0x8e, 0xc0, 0xfa, 0x5c, 0x66, 0x28, 0x12, 0xfe, 0xc4, - 0x8a, 0xb0, 0x16, 0x2c, 0x62, 0x58, 0x33, 0x09, 0x47, 0x7d, - 0xdb, 0xe1, 0xaf, 0x95, 0x00, 0x3b, 0x76, 0x4d, 0xec, 0xd7, - 0x9a, 0xa1, 0xc5, 0xfe, 0xb3, 0x88, 0x29, 0x12, 0x5f, 0x64, - 0x97, 0xac, 0xe1, 0xda, 0x7b, 0x40, 0x0d, 0x36, 0x52, 0x69, - 0x24, 0x1f, 0xbe, 0x85, 0xc8, 0xf3, 0x33, 0x08, 0x45, 0x7e, - 0xdf, 0xe4, 0xa9, 0x92, 0xf6, 0xcd, 0x80, 0xbb, 0x1a, 0x21, - 0x6c, 0x57, 0xa4, 0x9f, 0xd2, 0xe9, 0x48, 0x73, 0x3e, 0x05, - 0x61, 0x5a, 0x17, 0x2c, 0x8d, 0xb6, 0xfb, 0xc0, 0x66, 0x5d, - 0x10, 0x2b, 0x8a, 0xb1, 0xfc, 0xc7, 0xa3, 0x98, 0xd5, 0xee, - 0x4f, 0x74, 0x39, 0x02, 0xf1, 0xca, 0x87, 0xbc, 0x1d, 0x26, - 0x6b, 0x50, 0x34, 0x0f, 0x42, 0x79, 0xd8, 0xe3, 0xae, 0x95, - 0x55, 0x6e, 0x23, 0x18, 0xb9, 0x82, 0xcf, 0xf4, 0x90, 0xab, - 0xe6, 0xdd, 0x7c, 0x47, 0x0a, 0x31, 0xc2, 0xf9, 0xb4, 0x8f, - 0x2e, 0x15, 0x58, 0x63, 0x07, 0x3c, 0x71, 0x4a, 0xeb, 0xd0, - 0x9d, 0xa6, 0xcc, 0xf7, 0xba, 0x81, 0x20, 0x1b, 0x56, 0x6d, - 0x09, 0x32, 0x7f, 0x44, 0xe5, 0xde, 0x93, 0xa8, 0x5b, 0x60, - 0x2d, 0x16, 0xb7, 0x8c, 0xc1, 0xfa, 0x9e, 0xa5, 0xe8, 0xd3, - 0x72, 0x49, 0x04, 0x3f, 0xff, 0xc4, 0x89, 0xb2, 0x13, 0x28, - 0x65, 0x5e, 0x3a, 0x01, 0x4c, 0x77, 0xd6, 0xed, 0xa0, 0x9b, - 0x68, 0x53, 0x1e, 0x25, 0x84, 0xbf, 0xf2, 0xc9, 0xad, 0x96, - 0xdb, 0xe0, 0x41, 0x7a, 0x37, 0x0c, 0xaa, 0x91, 0xdc, 0xe7, - 0x46, 0x7d, 0x30, 0x0b, 0x6f, 0x54, 0x19, 0x22, 0x83, 0xb8, - 0xf5, 0xce, 0x3d, 0x06, 0x4b, 0x70, 0xd1, 0xea, 0xa7, 0x9c, - 0xf8, 0xc3, 0x8e, 0xb5, 0x14, 0x2f, 0x62, 0x59, 0x99, 0xa2, - 0xef, 0xd4, 0x75, 0x4e, 0x03, 0x38, 0x5c, 0x67, 0x2a, 0x11, - 0xb0, 0x8b, 0xc6, 0xfd, 0x0e, 0x35, 0x78, 0x43, 0xe2, 0xd9, - 0x94, 0xaf, 0xcb, 0xf0, 0xbd, 0x86, 0x27, 0x1c, 0x51, 0x6a, - 0x00, 0x3c, 0x78, 0x44, 0xf0, 0xcc, 0x88, 0xb4, 0xfd, 0xc1, - 0x85, 0xb9, 0x0d, 0x31, 0x75, 0x49, 0xe7, 0xdb, 0x9f, 0xa3, - 0x17, 0x2b, 0x6f, 0x53, 0x1a, 0x26, 0x62, 0x5e, 0xea, 0xd6, - 0x92, 0xae, 0xd3, 0xef, 0xab, 0x97, 0x23, 0x1f, 0x5b, 0x67, - 0x2e, 0x12, 0x56, 0x6a, 0xde, 0xe2, 0xa6, 0x9a, 0x34, 0x08, - 0x4c, 0x70, 0xc4, 0xf8, 0xbc, 0x80, 0xc9, 0xf5, 0xb1, 0x8d, - 0x39, 0x05, 0x41, 0x7d, 0xbb, 0x87, 0xc3, 0xff, 0x4b, 0x77, - 0x33, 0x0f, 0x46, 0x7a, 0x3e, 0x02, 0xb6, 0x8a, 0xce, 0xf2, - 0x5c, 0x60, 0x24, 0x18, 0xac, 0x90, 0xd4, 0xe8, 0xa1, 0x9d, - 0xd9, 0xe5, 0x51, 0x6d, 0x29, 0x15, 0x68, 0x54, 0x10, 0x2c, - 0x98, 0xa4, 0xe0, 0xdc, 0x95, 0xa9, 0xed, 0xd1, 0x65, 0x59, - 0x1d, 0x21, 0x8f, 0xb3, 0xf7, 0xcb, 0x7f, 0x43, 0x07, 0x3b, - 0x72, 0x4e, 0x0a, 0x36, 0x82, 0xbe, 0xfa, 0xc6, 0x6b, 0x57, - 0x13, 0x2f, 0x9b, 0xa7, 0xe3, 0xdf, 0x96, 0xaa, 0xee, 0xd2, - 0x66, 0x5a, 0x1e, 0x22, 0x8c, 0xb0, 0xf4, 0xc8, 0x7c, 0x40, - 0x04, 0x38, 0x71, 0x4d, 0x09, 0x35, 0x81, 0xbd, 0xf9, 0xc5, - 0xb8, 0x84, 0xc0, 0xfc, 0x48, 0x74, 0x30, 0x0c, 0x45, 0x79, - 0x3d, 0x01, 0xb5, 0x89, 0xcd, 0xf1, 0x5f, 0x63, 0x27, 0x1b, - 0xaf, 0x93, 0xd7, 0xeb, 0xa2, 0x9e, 0xda, 0xe6, 0x52, 0x6e, - 0x2a, 0x16, 0xd0, 0xec, 0xa8, 0x94, 0x20, 0x1c, 0x58, 0x64, - 0x2d, 0x11, 0x55, 0x69, 0xdd, 0xe1, 0xa5, 0x99, 0x37, 0x0b, - 0x4f, 0x73, 0xc7, 0xfb, 0xbf, 0x83, 0xca, 0xf6, 0xb2, 0x8e, - 0x3a, 0x06, 0x42, 0x7e, 0x03, 0x3f, 0x7b, 0x47, 0xf3, 0xcf, - 0x8b, 0xb7, 0xfe, 0xc2, 0x86, 0xba, 0x0e, 0x32, 0x76, 0x4a, - 0xe4, 0xd8, 0x9c, 0xa0, 0x14, 0x28, 0x6c, 0x50, 0x19, 0x25, - 0x61, 0x5d, 0xe9, 0xd5, 0x91, 0xad, 0x00, 0x3d, 0x7a, 0x47, - 0xf4, 0xc9, 0x8e, 0xb3, 0xf5, 0xc8, 0x8f, 0xb2, 0x01, 0x3c, - 0x7b, 0x46, 0xf7, 0xca, 0x8d, 0xb0, 0x03, 0x3e, 0x79, 0x44, - 0x02, 0x3f, 0x78, 0x45, 0xf6, 0xcb, 0x8c, 0xb1, 0xf3, 0xce, - 0x89, 0xb4, 0x07, 0x3a, 0x7d, 0x40, 0x06, 0x3b, 0x7c, 0x41, - 0xf2, 0xcf, 0x88, 0xb5, 0x04, 0x39, 0x7e, 0x43, 0xf0, 0xcd, - 0x8a, 0xb7, 0xf1, 0xcc, 0x8b, 0xb6, 0x05, 0x38, 0x7f, 0x42, - 0xfb, 0xc6, 0x81, 0xbc, 0x0f, 0x32, 0x75, 0x48, 0x0e, 0x33, - 0x74, 0x49, 0xfa, 0xc7, 0x80, 0xbd, 0x0c, 0x31, 0x76, 0x4b, - 0xf8, 0xc5, 0x82, 0xbf, 0xf9, 0xc4, 0x83, 0xbe, 0x0d, 0x30, - 0x77, 0x4a, 0x08, 0x35, 0x72, 0x4f, 0xfc, 0xc1, 0x86, 0xbb, - 0xfd, 0xc0, 0x87, 0xba, 0x09, 0x34, 0x73, 0x4e, 0xff, 0xc2, - 0x85, 0xb8, 0x0b, 0x36, 0x71, 0x4c, 0x0a, 0x37, 0x70, 0x4d, - 0xfe, 0xc3, 0x84, 0xb9, 0xeb, 0xd6, 0x91, 0xac, 0x1f, 0x22, - 0x65, 0x58, 0x1e, 0x23, 0x64, 0x59, 0xea, 0xd7, 0x90, 0xad, - 0x1c, 0x21, 0x66, 0x5b, 0xe8, 0xd5, 0x92, 0xaf, 0xe9, 0xd4, - 0x93, 0xae, 0x1d, 0x20, 0x67, 0x5a, 0x18, 0x25, 0x62, 0x5f, - 0xec, 0xd1, 0x96, 0xab, 0xed, 0xd0, 0x97, 0xaa, 0x19, 0x24, - 0x63, 0x5e, 0xef, 0xd2, 0x95, 0xa8, 0x1b, 0x26, 0x61, 0x5c, - 0x1a, 0x27, 0x60, 0x5d, 0xee, 0xd3, 0x94, 0xa9, 0x10, 0x2d, - 0x6a, 0x57, 0xe4, 0xd9, 0x9e, 0xa3, 0xe5, 0xd8, 0x9f, 0xa2, - 0x11, 0x2c, 0x6b, 0x56, 0xe7, 0xda, 0x9d, 0xa0, 0x13, 0x2e, - 0x69, 0x54, 0x12, 0x2f, 0x68, 0x55, 0xe6, 0xdb, 0x9c, 0xa1, - 0xe3, 0xde, 0x99, 0xa4, 0x17, 0x2a, 0x6d, 0x50, 0x16, 0x2b, - 0x6c, 0x51, 0xe2, 0xdf, 0x98, 0xa5, 0x14, 0x29, 0x6e, 0x53, - 0xe0, 0xdd, 0x9a, 0xa7, 0xe1, 0xdc, 0x9b, 0xa6, 0x15, 0x28, - 0x6f, 0x52, 0x00, 0x3e, 0x7c, 0x42, 0xf8, 0xc6, 0x84, 0xba, - 0xed, 0xd3, 0x91, 0xaf, 0x15, 0x2b, 0x69, 0x57, 0xc7, 0xf9, - 0xbb, 0x85, 0x3f, 0x01, 0x43, 0x7d, 0x2a, 0x14, 0x56, 0x68, - 0xd2, 0xec, 0xae, 0x90, 0x93, 0xad, 0xef, 0xd1, 0x6b, 0x55, - 0x17, 0x29, 0x7e, 0x40, 0x02, 0x3c, 0x86, 0xb8, 0xfa, 0xc4, - 0x54, 0x6a, 0x28, 0x16, 0xac, 0x92, 0xd0, 0xee, 0xb9, 0x87, - 0xc5, 0xfb, 0x41, 0x7f, 0x3d, 0x03, 0x3b, 0x05, 0x47, 0x79, - 0xc3, 0xfd, 0xbf, 0x81, 0xd6, 0xe8, 0xaa, 0x94, 0x2e, 0x10, - 0x52, 0x6c, 0xfc, 0xc2, 0x80, 0xbe, 0x04, 0x3a, 0x78, 0x46, - 0x11, 0x2f, 0x6d, 0x53, 0xe9, 0xd7, 0x95, 0xab, 0xa8, 0x96, - 0xd4, 0xea, 0x50, 0x6e, 0x2c, 0x12, 0x45, 0x7b, 0x39, 0x07, - 0xbd, 0x83, 0xc1, 0xff, 0x6f, 0x51, 0x13, 0x2d, 0x97, 0xa9, - 0xeb, 0xd5, 0x82, 0xbc, 0xfe, 0xc0, 0x7a, 0x44, 0x06, 0x38, - 0x76, 0x48, 0x0a, 0x34, 0x8e, 0xb0, 0xf2, 0xcc, 0x9b, 0xa5, - 0xe7, 0xd9, 0x63, 0x5d, 0x1f, 0x21, 0xb1, 0x8f, 0xcd, 0xf3, - 0x49, 0x77, 0x35, 0x0b, 0x5c, 0x62, 0x20, 0x1e, 0xa4, 0x9a, - 0xd8, 0xe6, 0xe5, 0xdb, 0x99, 0xa7, 0x1d, 0x23, 0x61, 0x5f, - 0x08, 0x36, 0x74, 0x4a, 0xf0, 0xce, 0x8c, 0xb2, 0x22, 0x1c, - 0x5e, 0x60, 0xda, 0xe4, 0xa6, 0x98, 0xcf, 0xf1, 0xb3, 0x8d, - 0x37, 0x09, 0x4b, 0x75, 0x4d, 0x73, 0x31, 0x0f, 0xb5, 0x8b, - 0xc9, 0xf7, 0xa0, 0x9e, 0xdc, 0xe2, 0x58, 0x66, 0x24, 0x1a, - 0x8a, 0xb4, 0xf6, 0xc8, 0x72, 0x4c, 0x0e, 0x30, 0x67, 0x59, - 0x1b, 0x25, 0x9f, 0xa1, 0xe3, 0xdd, 0xde, 0xe0, 0xa2, 0x9c, - 0x26, 0x18, 0x5a, 0x64, 0x33, 0x0d, 0x4f, 0x71, 0xcb, 0xf5, - 0xb7, 0x89, 0x19, 0x27, 0x65, 0x5b, 0xe1, 0xdf, 0x9d, 0xa3, - 0xf4, 0xca, 0x88, 0xb6, 0x0c, 0x32, 0x70, 0x4e, 0x00, 0x3f, - 0x7e, 0x41, 0xfc, 0xc3, 0x82, 0xbd, 0xe5, 0xda, 0x9b, 0xa4, - 0x19, 0x26, 0x67, 0x58, 0xd7, 0xe8, 0xa9, 0x96, 0x2b, 0x14, - 0x55, 0x6a, 0x32, 0x0d, 0x4c, 0x73, 0xce, 0xf1, 0xb0, 0x8f, - 0xb3, 0x8c, 0xcd, 0xf2, 0x4f, 0x70, 0x31, 0x0e, 0x56, 0x69, - 0x28, 0x17, 0xaa, 0x95, 0xd4, 0xeb, 0x64, 0x5b, 0x1a, 0x25, - 0x98, 0xa7, 0xe6, 0xd9, 0x81, 0xbe, 0xff, 0xc0, 0x7d, 0x42, - 0x03, 0x3c, 0x7b, 0x44, 0x05, 0x3a, 0x87, 0xb8, 0xf9, 0xc6, - 0x9e, 0xa1, 0xe0, 0xdf, 0x62, 0x5d, 0x1c, 0x23, 0xac, 0x93, - 0xd2, 0xed, 0x50, 0x6f, 0x2e, 0x11, 0x49, 0x76, 0x37, 0x08, - 0xb5, 0x8a, 0xcb, 0xf4, 0xc8, 0xf7, 0xb6, 0x89, 0x34, 0x0b, - 0x4a, 0x75, 0x2d, 0x12, 0x53, 0x6c, 0xd1, 0xee, 0xaf, 0x90, - 0x1f, 0x20, 0x61, 0x5e, 0xe3, 0xdc, 0x9d, 0xa2, 0xfa, 0xc5, - 0x84, 0xbb, 0x06, 0x39, 0x78, 0x47, 0xf6, 0xc9, 0x88, 0xb7, - 0x0a, 0x35, 0x74, 0x4b, 0x13, 0x2c, 0x6d, 0x52, 0xef, 0xd0, - 0x91, 0xae, 0x21, 0x1e, 0x5f, 0x60, 0xdd, 0xe2, 0xa3, 0x9c, - 0xc4, 0xfb, 0xba, 0x85, 0x38, 0x07, 0x46, 0x79, 0x45, 0x7a, - 0x3b, 0x04, 0xb9, 0x86, 0xc7, 0xf8, 0xa0, 0x9f, 0xde, 0xe1, - 0x5c, 0x63, 0x22, 0x1d, 0x92, 0xad, 0xec, 0xd3, 0x6e, 0x51, - 0x10, 0x2f, 0x77, 0x48, 0x09, 0x36, 0x8b, 0xb4, 0xf5, 0xca, - 0x8d, 0xb2, 0xf3, 0xcc, 0x71, 0x4e, 0x0f, 0x30, 0x68, 0x57, - 0x16, 0x29, 0x94, 0xab, 0xea, 0xd5, 0x5a, 0x65, 0x24, 0x1b, - 0xa6, 0x99, 0xd8, 0xe7, 0xbf, 0x80, 0xc1, 0xfe, 0x43, 0x7c, - 0x3d, 0x02, 0x3e, 0x01, 0x40, 0x7f, 0xc2, 0xfd, 0xbc, 0x83, - 0xdb, 0xe4, 0xa5, 0x9a, 0x27, 0x18, 0x59, 0x66, 0xe9, 0xd6, - 0x97, 0xa8, 0x15, 0x2a, 0x6b, 0x54, 0x0c, 0x33, 0x72, 0x4d, - 0xf0, 0xcf, 0x8e, 0xb1, 0x00, 0x40, 0x80, 0xc0, 0x1d, 0x5d, - 0x9d, 0xdd, 0x3a, 0x7a, 0xba, 0xfa, 0x27, 0x67, 0xa7, 0xe7, - 0x74, 0x34, 0xf4, 0xb4, 0x69, 0x29, 0xe9, 0xa9, 0x4e, 0x0e, - 0xce, 0x8e, 0x53, 0x13, 0xd3, 0x93, 0xe8, 0xa8, 0x68, 0x28, - 0xf5, 0xb5, 0x75, 0x35, 0xd2, 0x92, 0x52, 0x12, 0xcf, 0x8f, - 0x4f, 0x0f, 0x9c, 0xdc, 0x1c, 0x5c, 0x81, 0xc1, 0x01, 0x41, - 0xa6, 0xe6, 0x26, 0x66, 0xbb, 0xfb, 0x3b, 0x7b, 0xcd, 0x8d, - 0x4d, 0x0d, 0xd0, 0x90, 0x50, 0x10, 0xf7, 0xb7, 0x77, 0x37, - 0xea, 0xaa, 0x6a, 0x2a, 0xb9, 0xf9, 0x39, 0x79, 0xa4, 0xe4, - 0x24, 0x64, 0x83, 0xc3, 0x03, 0x43, 0x9e, 0xde, 0x1e, 0x5e, - 0x25, 0x65, 0xa5, 0xe5, 0x38, 0x78, 0xb8, 0xf8, 0x1f, 0x5f, - 0x9f, 0xdf, 0x02, 0x42, 0x82, 0xc2, 0x51, 0x11, 0xd1, 0x91, - 0x4c, 0x0c, 0xcc, 0x8c, 0x6b, 0x2b, 0xeb, 0xab, 0x76, 0x36, - 0xf6, 0xb6, 0x87, 0xc7, 0x07, 0x47, 0x9a, 0xda, 0x1a, 0x5a, - 0xbd, 0xfd, 0x3d, 0x7d, 0xa0, 0xe0, 0x20, 0x60, 0xf3, 0xb3, - 0x73, 0x33, 0xee, 0xae, 0x6e, 0x2e, 0xc9, 0x89, 0x49, 0x09, - 0xd4, 0x94, 0x54, 0x14, 0x6f, 0x2f, 0xef, 0xaf, 0x72, 0x32, - 0xf2, 0xb2, 0x55, 0x15, 0xd5, 0x95, 0x48, 0x08, 0xc8, 0x88, - 0x1b, 0x5b, 0x9b, 0xdb, 0x06, 0x46, 0x86, 0xc6, 0x21, 0x61, - 0xa1, 0xe1, 0x3c, 0x7c, 0xbc, 0xfc, 0x4a, 0x0a, 0xca, 0x8a, - 0x57, 0x17, 0xd7, 0x97, 0x70, 0x30, 0xf0, 0xb0, 0x6d, 0x2d, - 0xed, 0xad, 0x3e, 0x7e, 0xbe, 0xfe, 0x23, 0x63, 0xa3, 0xe3, - 0x04, 0x44, 0x84, 0xc4, 0x19, 0x59, 0x99, 0xd9, 0xa2, 0xe2, - 0x22, 0x62, 0xbf, 0xff, 0x3f, 0x7f, 0x98, 0xd8, 0x18, 0x58, - 0x85, 0xc5, 0x05, 0x45, 0xd6, 0x96, 0x56, 0x16, 0xcb, 0x8b, - 0x4b, 0x0b, 0xec, 0xac, 0x6c, 0x2c, 0xf1, 0xb1, 0x71, 0x31, - 0x00, 0x41, 0x82, 0xc3, 0x19, 0x58, 0x9b, 0xda, 0x32, 0x73, - 0xb0, 0xf1, 0x2b, 0x6a, 0xa9, 0xe8, 0x64, 0x25, 0xe6, 0xa7, - 0x7d, 0x3c, 0xff, 0xbe, 0x56, 0x17, 0xd4, 0x95, 0x4f, 0x0e, - 0xcd, 0x8c, 0xc8, 0x89, 0x4a, 0x0b, 0xd1, 0x90, 0x53, 0x12, - 0xfa, 0xbb, 0x78, 0x39, 0xe3, 0xa2, 0x61, 0x20, 0xac, 0xed, - 0x2e, 0x6f, 0xb5, 0xf4, 0x37, 0x76, 0x9e, 0xdf, 0x1c, 0x5d, - 0x87, 0xc6, 0x05, 0x44, 0x8d, 0xcc, 0x0f, 0x4e, 0x94, 0xd5, - 0x16, 0x57, 0xbf, 0xfe, 0x3d, 0x7c, 0xa6, 0xe7, 0x24, 0x65, - 0xe9, 0xa8, 0x6b, 0x2a, 0xf0, 0xb1, 0x72, 0x33, 0xdb, 0x9a, - 0x59, 0x18, 0xc2, 0x83, 0x40, 0x01, 0x45, 0x04, 0xc7, 0x86, - 0x5c, 0x1d, 0xde, 0x9f, 0x77, 0x36, 0xf5, 0xb4, 0x6e, 0x2f, - 0xec, 0xad, 0x21, 0x60, 0xa3, 0xe2, 0x38, 0x79, 0xba, 0xfb, - 0x13, 0x52, 0x91, 0xd0, 0x0a, 0x4b, 0x88, 0xc9, 0x07, 0x46, - 0x85, 0xc4, 0x1e, 0x5f, 0x9c, 0xdd, 0x35, 0x74, 0xb7, 0xf6, - 0x2c, 0x6d, 0xae, 0xef, 0x63, 0x22, 0xe1, 0xa0, 0x7a, 0x3b, - 0xf8, 0xb9, 0x51, 0x10, 0xd3, 0x92, 0x48, 0x09, 0xca, 0x8b, - 0xcf, 0x8e, 0x4d, 0x0c, 0xd6, 0x97, 0x54, 0x15, 0xfd, 0xbc, - 0x7f, 0x3e, 0xe4, 0xa5, 0x66, 0x27, 0xab, 0xea, 0x29, 0x68, - 0xb2, 0xf3, 0x30, 0x71, 0x99, 0xd8, 0x1b, 0x5a, 0x80, 0xc1, - 0x02, 0x43, 0x8a, 0xcb, 0x08, 0x49, 0x93, 0xd2, 0x11, 0x50, - 0xb8, 0xf9, 0x3a, 0x7b, 0xa1, 0xe0, 0x23, 0x62, 0xee, 0xaf, - 0x6c, 0x2d, 0xf7, 0xb6, 0x75, 0x34, 0xdc, 0x9d, 0x5e, 0x1f, - 0xc5, 0x84, 0x47, 0x06, 0x42, 0x03, 0xc0, 0x81, 0x5b, 0x1a, - 0xd9, 0x98, 0x70, 0x31, 0xf2, 0xb3, 0x69, 0x28, 0xeb, 0xaa, - 0x26, 0x67, 0xa4, 0xe5, 0x3f, 0x7e, 0xbd, 0xfc, 0x14, 0x55, - 0x96, 0xd7, 0x0d, 0x4c, 0x8f, 0xce, 0x00, 0x42, 0x84, 0xc6, - 0x15, 0x57, 0x91, 0xd3, 0x2a, 0x68, 0xae, 0xec, 0x3f, 0x7d, - 0xbb, 0xf9, 0x54, 0x16, 0xd0, 0x92, 0x41, 0x03, 0xc5, 0x87, - 0x7e, 0x3c, 0xfa, 0xb8, 0x6b, 0x29, 0xef, 0xad, 0xa8, 0xea, - 0x2c, 0x6e, 0xbd, 0xff, 0x39, 0x7b, 0x82, 0xc0, 0x06, 0x44, - 0x97, 0xd5, 0x13, 0x51, 0xfc, 0xbe, 0x78, 0x3a, 0xe9, 0xab, - 0x6d, 0x2f, 0xd6, 0x94, 0x52, 0x10, 0xc3, 0x81, 0x47, 0x05, - 0x4d, 0x0f, 0xc9, 0x8b, 0x58, 0x1a, 0xdc, 0x9e, 0x67, 0x25, - 0xe3, 0xa1, 0x72, 0x30, 0xf6, 0xb4, 0x19, 0x5b, 0x9d, 0xdf, - 0x0c, 0x4e, 0x88, 0xca, 0x33, 0x71, 0xb7, 0xf5, 0x26, 0x64, - 0xa2, 0xe0, 0xe5, 0xa7, 0x61, 0x23, 0xf0, 0xb2, 0x74, 0x36, - 0xcf, 0x8d, 0x4b, 0x09, 0xda, 0x98, 0x5e, 0x1c, 0xb1, 0xf3, - 0x35, 0x77, 0xa4, 0xe6, 0x20, 0x62, 0x9b, 0xd9, 0x1f, 0x5d, - 0x8e, 0xcc, 0x0a, 0x48, 0x9a, 0xd8, 0x1e, 0x5c, 0x8f, 0xcd, - 0x0b, 0x49, 0xb0, 0xf2, 0x34, 0x76, 0xa5, 0xe7, 0x21, 0x63, - 0xce, 0x8c, 0x4a, 0x08, 0xdb, 0x99, 0x5f, 0x1d, 0xe4, 0xa6, - 0x60, 0x22, 0xf1, 0xb3, 0x75, 0x37, 0x32, 0x70, 0xb6, 0xf4, - 0x27, 0x65, 0xa3, 0xe1, 0x18, 0x5a, 0x9c, 0xde, 0x0d, 0x4f, - 0x89, 0xcb, 0x66, 0x24, 0xe2, 0xa0, 0x73, 0x31, 0xf7, 0xb5, - 0x4c, 0x0e, 0xc8, 0x8a, 0x59, 0x1b, 0xdd, 0x9f, 0xd7, 0x95, - 0x53, 0x11, 0xc2, 0x80, 0x46, 0x04, 0xfd, 0xbf, 0x79, 0x3b, - 0xe8, 0xaa, 0x6c, 0x2e, 0x83, 0xc1, 0x07, 0x45, 0x96, 0xd4, - 0x12, 0x50, 0xa9, 0xeb, 0x2d, 0x6f, 0xbc, 0xfe, 0x38, 0x7a, - 0x7f, 0x3d, 0xfb, 0xb9, 0x6a, 0x28, 0xee, 0xac, 0x55, 0x17, - 0xd1, 0x93, 0x40, 0x02, 0xc4, 0x86, 0x2b, 0x69, 0xaf, 0xed, - 0x3e, 0x7c, 0xba, 0xf8, 0x01, 0x43, 0x85, 0xc7, 0x14, 0x56, - 0x90, 0xd2, 0x00, 0x43, 0x86, 0xc5, 0x11, 0x52, 0x97, 0xd4, - 0x22, 0x61, 0xa4, 0xe7, 0x33, 0x70, 0xb5, 0xf6, 0x44, 0x07, - 0xc2, 0x81, 0x55, 0x16, 0xd3, 0x90, 0x66, 0x25, 0xe0, 0xa3, - 0x77, 0x34, 0xf1, 0xb2, 0x88, 0xcb, 0x0e, 0x4d, 0x99, 0xda, - 0x1f, 0x5c, 0xaa, 0xe9, 0x2c, 0x6f, 0xbb, 0xf8, 0x3d, 0x7e, - 0xcc, 0x8f, 0x4a, 0x09, 0xdd, 0x9e, 0x5b, 0x18, 0xee, 0xad, - 0x68, 0x2b, 0xff, 0xbc, 0x79, 0x3a, 0x0d, 0x4e, 0x8b, 0xc8, - 0x1c, 0x5f, 0x9a, 0xd9, 0x2f, 0x6c, 0xa9, 0xea, 0x3e, 0x7d, - 0xb8, 0xfb, 0x49, 0x0a, 0xcf, 0x8c, 0x58, 0x1b, 0xde, 0x9d, - 0x6b, 0x28, 0xed, 0xae, 0x7a, 0x39, 0xfc, 0xbf, 0x85, 0xc6, - 0x03, 0x40, 0x94, 0xd7, 0x12, 0x51, 0xa7, 0xe4, 0x21, 0x62, - 0xb6, 0xf5, 0x30, 0x73, 0xc1, 0x82, 0x47, 0x04, 0xd0, 0x93, - 0x56, 0x15, 0xe3, 0xa0, 0x65, 0x26, 0xf2, 0xb1, 0x74, 0x37, - 0x1a, 0x59, 0x9c, 0xdf, 0x0b, 0x48, 0x8d, 0xce, 0x38, 0x7b, - 0xbe, 0xfd, 0x29, 0x6a, 0xaf, 0xec, 0x5e, 0x1d, 0xd8, 0x9b, - 0x4f, 0x0c, 0xc9, 0x8a, 0x7c, 0x3f, 0xfa, 0xb9, 0x6d, 0x2e, - 0xeb, 0xa8, 0x92, 0xd1, 0x14, 0x57, 0x83, 0xc0, 0x05, 0x46, - 0xb0, 0xf3, 0x36, 0x75, 0xa1, 0xe2, 0x27, 0x64, 0xd6, 0x95, - 0x50, 0x13, 0xc7, 0x84, 0x41, 0x02, 0xf4, 0xb7, 0x72, 0x31, - 0xe5, 0xa6, 0x63, 0x20, 0x17, 0x54, 0x91, 0xd2, 0x06, 0x45, - 0x80, 0xc3, 0x35, 0x76, 0xb3, 0xf0, 0x24, 0x67, 0xa2, 0xe1, - 0x53, 0x10, 0xd5, 0x96, 0x42, 0x01, 0xc4, 0x87, 0x71, 0x32, - 0xf7, 0xb4, 0x60, 0x23, 0xe6, 0xa5, 0x9f, 0xdc, 0x19, 0x5a, - 0x8e, 0xcd, 0x08, 0x4b, 0xbd, 0xfe, 0x3b, 0x78, 0xac, 0xef, - 0x2a, 0x69, 0xdb, 0x98, 0x5d, 0x1e, 0xca, 0x89, 0x4c, 0x0f, - 0xf9, 0xba, 0x7f, 0x3c, 0xe8, 0xab, 0x6e, 0x2d, 0x00, 0x44, - 0x88, 0xcc, 0x0d, 0x49, 0x85, 0xc1, 0x1a, 0x5e, 0x92, 0xd6, - 0x17, 0x53, 0x9f, 0xdb, 0x34, 0x70, 0xbc, 0xf8, 0x39, 0x7d, - 0xb1, 0xf5, 0x2e, 0x6a, 0xa6, 0xe2, 0x23, 0x67, 0xab, 0xef, - 0x68, 0x2c, 0xe0, 0xa4, 0x65, 0x21, 0xed, 0xa9, 0x72, 0x36, - 0xfa, 0xbe, 0x7f, 0x3b, 0xf7, 0xb3, 0x5c, 0x18, 0xd4, 0x90, - 0x51, 0x15, 0xd9, 0x9d, 0x46, 0x02, 0xce, 0x8a, 0x4b, 0x0f, - 0xc3, 0x87, 0xd0, 0x94, 0x58, 0x1c, 0xdd, 0x99, 0x55, 0x11, - 0xca, 0x8e, 0x42, 0x06, 0xc7, 0x83, 0x4f, 0x0b, 0xe4, 0xa0, - 0x6c, 0x28, 0xe9, 0xad, 0x61, 0x25, 0xfe, 0xba, 0x76, 0x32, - 0xf3, 0xb7, 0x7b, 0x3f, 0xb8, 0xfc, 0x30, 0x74, 0xb5, 0xf1, - 0x3d, 0x79, 0xa2, 0xe6, 0x2a, 0x6e, 0xaf, 0xeb, 0x27, 0x63, - 0x8c, 0xc8, 0x04, 0x40, 0x81, 0xc5, 0x09, 0x4d, 0x96, 0xd2, - 0x1e, 0x5a, 0x9b, 0xdf, 0x13, 0x57, 0xbd, 0xf9, 0x35, 0x71, - 0xb0, 0xf4, 0x38, 0x7c, 0xa7, 0xe3, 0x2f, 0x6b, 0xaa, 0xee, - 0x22, 0x66, 0x89, 0xcd, 0x01, 0x45, 0x84, 0xc0, 0x0c, 0x48, - 0x93, 0xd7, 0x1b, 0x5f, 0x9e, 0xda, 0x16, 0x52, 0xd5, 0x91, - 0x5d, 0x19, 0xd8, 0x9c, 0x50, 0x14, 0xcf, 0x8b, 0x47, 0x03, - 0xc2, 0x86, 0x4a, 0x0e, 0xe1, 0xa5, 0x69, 0x2d, 0xec, 0xa8, - 0x64, 0x20, 0xfb, 0xbf, 0x73, 0x37, 0xf6, 0xb2, 0x7e, 0x3a, - 0x6d, 0x29, 0xe5, 0xa1, 0x60, 0x24, 0xe8, 0xac, 0x77, 0x33, - 0xff, 0xbb, 0x7a, 0x3e, 0xf2, 0xb6, 0x59, 0x1d, 0xd1, 0x95, - 0x54, 0x10, 0xdc, 0x98, 0x43, 0x07, 0xcb, 0x8f, 0x4e, 0x0a, - 0xc6, 0x82, 0x05, 0x41, 0x8d, 0xc9, 0x08, 0x4c, 0x80, 0xc4, - 0x1f, 0x5b, 0x97, 0xd3, 0x12, 0x56, 0x9a, 0xde, 0x31, 0x75, - 0xb9, 0xfd, 0x3c, 0x78, 0xb4, 0xf0, 0x2b, 0x6f, 0xa3, 0xe7, - 0x26, 0x62, 0xae, 0xea, 0x00, 0x45, 0x8a, 0xcf, 0x09, 0x4c, - 0x83, 0xc6, 0x12, 0x57, 0x98, 0xdd, 0x1b, 0x5e, 0x91, 0xd4, - 0x24, 0x61, 0xae, 0xeb, 0x2d, 0x68, 0xa7, 0xe2, 0x36, 0x73, - 0xbc, 0xf9, 0x3f, 0x7a, 0xb5, 0xf0, 0x48, 0x0d, 0xc2, 0x87, - 0x41, 0x04, 0xcb, 0x8e, 0x5a, 0x1f, 0xd0, 0x95, 0x53, 0x16, - 0xd9, 0x9c, 0x6c, 0x29, 0xe6, 0xa3, 0x65, 0x20, 0xef, 0xaa, - 0x7e, 0x3b, 0xf4, 0xb1, 0x77, 0x32, 0xfd, 0xb8, 0x90, 0xd5, - 0x1a, 0x5f, 0x99, 0xdc, 0x13, 0x56, 0x82, 0xc7, 0x08, 0x4d, - 0x8b, 0xce, 0x01, 0x44, 0xb4, 0xf1, 0x3e, 0x7b, 0xbd, 0xf8, - 0x37, 0x72, 0xa6, 0xe3, 0x2c, 0x69, 0xaf, 0xea, 0x25, 0x60, - 0xd8, 0x9d, 0x52, 0x17, 0xd1, 0x94, 0x5b, 0x1e, 0xca, 0x8f, - 0x40, 0x05, 0xc3, 0x86, 0x49, 0x0c, 0xfc, 0xb9, 0x76, 0x33, - 0xf5, 0xb0, 0x7f, 0x3a, 0xee, 0xab, 0x64, 0x21, 0xe7, 0xa2, - 0x6d, 0x28, 0x3d, 0x78, 0xb7, 0xf2, 0x34, 0x71, 0xbe, 0xfb, - 0x2f, 0x6a, 0xa5, 0xe0, 0x26, 0x63, 0xac, 0xe9, 0x19, 0x5c, - 0x93, 0xd6, 0x10, 0x55, 0x9a, 0xdf, 0x0b, 0x4e, 0x81, 0xc4, - 0x02, 0x47, 0x88, 0xcd, 0x75, 0x30, 0xff, 0xba, 0x7c, 0x39, - 0xf6, 0xb3, 0x67, 0x22, 0xed, 0xa8, 0x6e, 0x2b, 0xe4, 0xa1, - 0x51, 0x14, 0xdb, 0x9e, 0x58, 0x1d, 0xd2, 0x97, 0x43, 0x06, - 0xc9, 0x8c, 0x4a, 0x0f, 0xc0, 0x85, 0xad, 0xe8, 0x27, 0x62, - 0xa4, 0xe1, 0x2e, 0x6b, 0xbf, 0xfa, 0x35, 0x70, 0xb6, 0xf3, - 0x3c, 0x79, 0x89, 0xcc, 0x03, 0x46, 0x80, 0xc5, 0x0a, 0x4f, - 0x9b, 0xde, 0x11, 0x54, 0x92, 0xd7, 0x18, 0x5d, 0xe5, 0xa0, - 0x6f, 0x2a, 0xec, 0xa9, 0x66, 0x23, 0xf7, 0xb2, 0x7d, 0x38, - 0xfe, 0xbb, 0x74, 0x31, 0xc1, 0x84, 0x4b, 0x0e, 0xc8, 0x8d, - 0x42, 0x07, 0xd3, 0x96, 0x59, 0x1c, 0xda, 0x9f, 0x50, 0x15, - 0x00, 0x46, 0x8c, 0xca, 0x05, 0x43, 0x89, 0xcf, 0x0a, 0x4c, - 0x86, 0xc0, 0x0f, 0x49, 0x83, 0xc5, 0x14, 0x52, 0x98, 0xde, - 0x11, 0x57, 0x9d, 0xdb, 0x1e, 0x58, 0x92, 0xd4, 0x1b, 0x5d, - 0x97, 0xd1, 0x28, 0x6e, 0xa4, 0xe2, 0x2d, 0x6b, 0xa1, 0xe7, - 0x22, 0x64, 0xae, 0xe8, 0x27, 0x61, 0xab, 0xed, 0x3c, 0x7a, - 0xb0, 0xf6, 0x39, 0x7f, 0xb5, 0xf3, 0x36, 0x70, 0xba, 0xfc, - 0x33, 0x75, 0xbf, 0xf9, 0x50, 0x16, 0xdc, 0x9a, 0x55, 0x13, - 0xd9, 0x9f, 0x5a, 0x1c, 0xd6, 0x90, 0x5f, 0x19, 0xd3, 0x95, - 0x44, 0x02, 0xc8, 0x8e, 0x41, 0x07, 0xcd, 0x8b, 0x4e, 0x08, - 0xc2, 0x84, 0x4b, 0x0d, 0xc7, 0x81, 0x78, 0x3e, 0xf4, 0xb2, - 0x7d, 0x3b, 0xf1, 0xb7, 0x72, 0x34, 0xfe, 0xb8, 0x77, 0x31, - 0xfb, 0xbd, 0x6c, 0x2a, 0xe0, 0xa6, 0x69, 0x2f, 0xe5, 0xa3, - 0x66, 0x20, 0xea, 0xac, 0x63, 0x25, 0xef, 0xa9, 0xa0, 0xe6, - 0x2c, 0x6a, 0xa5, 0xe3, 0x29, 0x6f, 0xaa, 0xec, 0x26, 0x60, - 0xaf, 0xe9, 0x23, 0x65, 0xb4, 0xf2, 0x38, 0x7e, 0xb1, 0xf7, - 0x3d, 0x7b, 0xbe, 0xf8, 0x32, 0x74, 0xbb, 0xfd, 0x37, 0x71, - 0x88, 0xce, 0x04, 0x42, 0x8d, 0xcb, 0x01, 0x47, 0x82, 0xc4, - 0x0e, 0x48, 0x87, 0xc1, 0x0b, 0x4d, 0x9c, 0xda, 0x10, 0x56, - 0x99, 0xdf, 0x15, 0x53, 0x96, 0xd0, 0x1a, 0x5c, 0x93, 0xd5, - 0x1f, 0x59, 0xf0, 0xb6, 0x7c, 0x3a, 0xf5, 0xb3, 0x79, 0x3f, - 0xfa, 0xbc, 0x76, 0x30, 0xff, 0xb9, 0x73, 0x35, 0xe4, 0xa2, - 0x68, 0x2e, 0xe1, 0xa7, 0x6d, 0x2b, 0xee, 0xa8, 0x62, 0x24, - 0xeb, 0xad, 0x67, 0x21, 0xd8, 0x9e, 0x54, 0x12, 0xdd, 0x9b, - 0x51, 0x17, 0xd2, 0x94, 0x5e, 0x18, 0xd7, 0x91, 0x5b, 0x1d, - 0xcc, 0x8a, 0x40, 0x06, 0xc9, 0x8f, 0x45, 0x03, 0xc6, 0x80, - 0x4a, 0x0c, 0xc3, 0x85, 0x4f, 0x09, 0x00, 0x47, 0x8e, 0xc9, - 0x01, 0x46, 0x8f, 0xc8, 0x02, 0x45, 0x8c, 0xcb, 0x03, 0x44, - 0x8d, 0xca, 0x04, 0x43, 0x8a, 0xcd, 0x05, 0x42, 0x8b, 0xcc, - 0x06, 0x41, 0x88, 0xcf, 0x07, 0x40, 0x89, 0xce, 0x08, 0x4f, - 0x86, 0xc1, 0x09, 0x4e, 0x87, 0xc0, 0x0a, 0x4d, 0x84, 0xc3, - 0x0b, 0x4c, 0x85, 0xc2, 0x0c, 0x4b, 0x82, 0xc5, 0x0d, 0x4a, - 0x83, 0xc4, 0x0e, 0x49, 0x80, 0xc7, 0x0f, 0x48, 0x81, 0xc6, - 0x10, 0x57, 0x9e, 0xd9, 0x11, 0x56, 0x9f, 0xd8, 0x12, 0x55, - 0x9c, 0xdb, 0x13, 0x54, 0x9d, 0xda, 0x14, 0x53, 0x9a, 0xdd, - 0x15, 0x52, 0x9b, 0xdc, 0x16, 0x51, 0x98, 0xdf, 0x17, 0x50, - 0x99, 0xde, 0x18, 0x5f, 0x96, 0xd1, 0x19, 0x5e, 0x97, 0xd0, - 0x1a, 0x5d, 0x94, 0xd3, 0x1b, 0x5c, 0x95, 0xd2, 0x1c, 0x5b, - 0x92, 0xd5, 0x1d, 0x5a, 0x93, 0xd4, 0x1e, 0x59, 0x90, 0xd7, - 0x1f, 0x58, 0x91, 0xd6, 0x20, 0x67, 0xae, 0xe9, 0x21, 0x66, - 0xaf, 0xe8, 0x22, 0x65, 0xac, 0xeb, 0x23, 0x64, 0xad, 0xea, - 0x24, 0x63, 0xaa, 0xed, 0x25, 0x62, 0xab, 0xec, 0x26, 0x61, - 0xa8, 0xef, 0x27, 0x60, 0xa9, 0xee, 0x28, 0x6f, 0xa6, 0xe1, - 0x29, 0x6e, 0xa7, 0xe0, 0x2a, 0x6d, 0xa4, 0xe3, 0x2b, 0x6c, - 0xa5, 0xe2, 0x2c, 0x6b, 0xa2, 0xe5, 0x2d, 0x6a, 0xa3, 0xe4, - 0x2e, 0x69, 0xa0, 0xe7, 0x2f, 0x68, 0xa1, 0xe6, 0x30, 0x77, - 0xbe, 0xf9, 0x31, 0x76, 0xbf, 0xf8, 0x32, 0x75, 0xbc, 0xfb, - 0x33, 0x74, 0xbd, 0xfa, 0x34, 0x73, 0xba, 0xfd, 0x35, 0x72, - 0xbb, 0xfc, 0x36, 0x71, 0xb8, 0xff, 0x37, 0x70, 0xb9, 0xfe, - 0x38, 0x7f, 0xb6, 0xf1, 0x39, 0x7e, 0xb7, 0xf0, 0x3a, 0x7d, - 0xb4, 0xf3, 0x3b, 0x7c, 0xb5, 0xf2, 0x3c, 0x7b, 0xb2, 0xf5, - 0x3d, 0x7a, 0xb3, 0xf4, 0x3e, 0x79, 0xb0, 0xf7, 0x3f, 0x78, - 0xb1, 0xf6, 0x00, 0x48, 0x90, 0xd8, 0x3d, 0x75, 0xad, 0xe5, - 0x7a, 0x32, 0xea, 0xa2, 0x47, 0x0f, 0xd7, 0x9f, 0xf4, 0xbc, - 0x64, 0x2c, 0xc9, 0x81, 0x59, 0x11, 0x8e, 0xc6, 0x1e, 0x56, - 0xb3, 0xfb, 0x23, 0x6b, 0xf5, 0xbd, 0x65, 0x2d, 0xc8, 0x80, - 0x58, 0x10, 0x8f, 0xc7, 0x1f, 0x57, 0xb2, 0xfa, 0x22, 0x6a, - 0x01, 0x49, 0x91, 0xd9, 0x3c, 0x74, 0xac, 0xe4, 0x7b, 0x33, - 0xeb, 0xa3, 0x46, 0x0e, 0xd6, 0x9e, 0xf7, 0xbf, 0x67, 0x2f, - 0xca, 0x82, 0x5a, 0x12, 0x8d, 0xc5, 0x1d, 0x55, 0xb0, 0xf8, - 0x20, 0x68, 0x03, 0x4b, 0x93, 0xdb, 0x3e, 0x76, 0xae, 0xe6, - 0x79, 0x31, 0xe9, 0xa1, 0x44, 0x0c, 0xd4, 0x9c, 0x02, 0x4a, - 0x92, 0xda, 0x3f, 0x77, 0xaf, 0xe7, 0x78, 0x30, 0xe8, 0xa0, - 0x45, 0x0d, 0xd5, 0x9d, 0xf6, 0xbe, 0x66, 0x2e, 0xcb, 0x83, - 0x5b, 0x13, 0x8c, 0xc4, 0x1c, 0x54, 0xb1, 0xf9, 0x21, 0x69, - 0xf3, 0xbb, 0x63, 0x2b, 0xce, 0x86, 0x5e, 0x16, 0x89, 0xc1, - 0x19, 0x51, 0xb4, 0xfc, 0x24, 0x6c, 0x07, 0x4f, 0x97, 0xdf, - 0x3a, 0x72, 0xaa, 0xe2, 0x7d, 0x35, 0xed, 0xa5, 0x40, 0x08, - 0xd0, 0x98, 0x06, 0x4e, 0x96, 0xde, 0x3b, 0x73, 0xab, 0xe3, - 0x7c, 0x34, 0xec, 0xa4, 0x41, 0x09, 0xd1, 0x99, 0xf2, 0xba, - 0x62, 0x2a, 0xcf, 0x87, 0x5f, 0x17, 0x88, 0xc0, 0x18, 0x50, - 0xb5, 0xfd, 0x25, 0x6d, 0x04, 0x4c, 0x94, 0xdc, 0x39, 0x71, - 0xa9, 0xe1, 0x7e, 0x36, 0xee, 0xa6, 0x43, 0x0b, 0xd3, 0x9b, - 0xf0, 0xb8, 0x60, 0x28, 0xcd, 0x85, 0x5d, 0x15, 0x8a, 0xc2, - 0x1a, 0x52, 0xb7, 0xff, 0x27, 0x6f, 0xf1, 0xb9, 0x61, 0x29, - 0xcc, 0x84, 0x5c, 0x14, 0x8b, 0xc3, 0x1b, 0x53, 0xb6, 0xfe, - 0x26, 0x6e, 0x05, 0x4d, 0x95, 0xdd, 0x38, 0x70, 0xa8, 0xe0, - 0x7f, 0x37, 0xef, 0xa7, 0x42, 0x0a, 0xd2, 0x9a, 0x00, 0x49, - 0x92, 0xdb, 0x39, 0x70, 0xab, 0xe2, 0x72, 0x3b, 0xe0, 0xa9, - 0x4b, 0x02, 0xd9, 0x90, 0xe4, 0xad, 0x76, 0x3f, 0xdd, 0x94, - 0x4f, 0x06, 0x96, 0xdf, 0x04, 0x4d, 0xaf, 0xe6, 0x3d, 0x74, - 0xd5, 0x9c, 0x47, 0x0e, 0xec, 0xa5, 0x7e, 0x37, 0xa7, 0xee, - 0x35, 0x7c, 0x9e, 0xd7, 0x0c, 0x45, 0x31, 0x78, 0xa3, 0xea, - 0x08, 0x41, 0x9a, 0xd3, 0x43, 0x0a, 0xd1, 0x98, 0x7a, 0x33, - 0xe8, 0xa1, 0xb7, 0xfe, 0x25, 0x6c, 0x8e, 0xc7, 0x1c, 0x55, - 0xc5, 0x8c, 0x57, 0x1e, 0xfc, 0xb5, 0x6e, 0x27, 0x53, 0x1a, - 0xc1, 0x88, 0x6a, 0x23, 0xf8, 0xb1, 0x21, 0x68, 0xb3, 0xfa, - 0x18, 0x51, 0x8a, 0xc3, 0x62, 0x2b, 0xf0, 0xb9, 0x5b, 0x12, - 0xc9, 0x80, 0x10, 0x59, 0x82, 0xcb, 0x29, 0x60, 0xbb, 0xf2, - 0x86, 0xcf, 0x14, 0x5d, 0xbf, 0xf6, 0x2d, 0x64, 0xf4, 0xbd, - 0x66, 0x2f, 0xcd, 0x84, 0x5f, 0x16, 0x73, 0x3a, 0xe1, 0xa8, - 0x4a, 0x03, 0xd8, 0x91, 0x01, 0x48, 0x93, 0xda, 0x38, 0x71, - 0xaa, 0xe3, 0x97, 0xde, 0x05, 0x4c, 0xae, 0xe7, 0x3c, 0x75, - 0xe5, 0xac, 0x77, 0x3e, 0xdc, 0x95, 0x4e, 0x07, 0xa6, 0xef, - 0x34, 0x7d, 0x9f, 0xd6, 0x0d, 0x44, 0xd4, 0x9d, 0x46, 0x0f, - 0xed, 0xa4, 0x7f, 0x36, 0x42, 0x0b, 0xd0, 0x99, 0x7b, 0x32, - 0xe9, 0xa0, 0x30, 0x79, 0xa2, 0xeb, 0x09, 0x40, 0x9b, 0xd2, - 0xc4, 0x8d, 0x56, 0x1f, 0xfd, 0xb4, 0x6f, 0x26, 0xb6, 0xff, - 0x24, 0x6d, 0x8f, 0xc6, 0x1d, 0x54, 0x20, 0x69, 0xb2, 0xfb, - 0x19, 0x50, 0x8b, 0xc2, 0x52, 0x1b, 0xc0, 0x89, 0x6b, 0x22, - 0xf9, 0xb0, 0x11, 0x58, 0x83, 0xca, 0x28, 0x61, 0xba, 0xf3, - 0x63, 0x2a, 0xf1, 0xb8, 0x5a, 0x13, 0xc8, 0x81, 0xf5, 0xbc, - 0x67, 0x2e, 0xcc, 0x85, 0x5e, 0x17, 0x87, 0xce, 0x15, 0x5c, - 0xbe, 0xf7, 0x2c, 0x65, 0x00, 0x4a, 0x94, 0xde, 0x35, 0x7f, - 0xa1, 0xeb, 0x6a, 0x20, 0xfe, 0xb4, 0x5f, 0x15, 0xcb, 0x81, - 0xd4, 0x9e, 0x40, 0x0a, 0xe1, 0xab, 0x75, 0x3f, 0xbe, 0xf4, - 0x2a, 0x60, 0x8b, 0xc1, 0x1f, 0x55, 0xb5, 0xff, 0x21, 0x6b, - 0x80, 0xca, 0x14, 0x5e, 0xdf, 0x95, 0x4b, 0x01, 0xea, 0xa0, - 0x7e, 0x34, 0x61, 0x2b, 0xf5, 0xbf, 0x54, 0x1e, 0xc0, 0x8a, - 0x0b, 0x41, 0x9f, 0xd5, 0x3e, 0x74, 0xaa, 0xe0, 0x77, 0x3d, - 0xe3, 0xa9, 0x42, 0x08, 0xd6, 0x9c, 0x1d, 0x57, 0x89, 0xc3, - 0x28, 0x62, 0xbc, 0xf6, 0xa3, 0xe9, 0x37, 0x7d, 0x96, 0xdc, - 0x02, 0x48, 0xc9, 0x83, 0x5d, 0x17, 0xfc, 0xb6, 0x68, 0x22, - 0xc2, 0x88, 0x56, 0x1c, 0xf7, 0xbd, 0x63, 0x29, 0xa8, 0xe2, - 0x3c, 0x76, 0x9d, 0xd7, 0x09, 0x43, 0x16, 0x5c, 0x82, 0xc8, - 0x23, 0x69, 0xb7, 0xfd, 0x7c, 0x36, 0xe8, 0xa2, 0x49, 0x03, - 0xdd, 0x97, 0xee, 0xa4, 0x7a, 0x30, 0xdb, 0x91, 0x4f, 0x05, - 0x84, 0xce, 0x10, 0x5a, 0xb1, 0xfb, 0x25, 0x6f, 0x3a, 0x70, - 0xae, 0xe4, 0x0f, 0x45, 0x9b, 0xd1, 0x50, 0x1a, 0xc4, 0x8e, - 0x65, 0x2f, 0xf1, 0xbb, 0x5b, 0x11, 0xcf, 0x85, 0x6e, 0x24, - 0xfa, 0xb0, 0x31, 0x7b, 0xa5, 0xef, 0x04, 0x4e, 0x90, 0xda, - 0x8f, 0xc5, 0x1b, 0x51, 0xba, 0xf0, 0x2e, 0x64, 0xe5, 0xaf, - 0x71, 0x3b, 0xd0, 0x9a, 0x44, 0x0e, 0x99, 0xd3, 0x0d, 0x47, - 0xac, 0xe6, 0x38, 0x72, 0xf3, 0xb9, 0x67, 0x2d, 0xc6, 0x8c, - 0x52, 0x18, 0x4d, 0x07, 0xd9, 0x93, 0x78, 0x32, 0xec, 0xa6, - 0x27, 0x6d, 0xb3, 0xf9, 0x12, 0x58, 0x86, 0xcc, 0x2c, 0x66, - 0xb8, 0xf2, 0x19, 0x53, 0x8d, 0xc7, 0x46, 0x0c, 0xd2, 0x98, - 0x73, 0x39, 0xe7, 0xad, 0xf8, 0xb2, 0x6c, 0x26, 0xcd, 0x87, - 0x59, 0x13, 0x92, 0xd8, 0x06, 0x4c, 0xa7, 0xed, 0x33, 0x79, - 0x00, 0x4b, 0x96, 0xdd, 0x31, 0x7a, 0xa7, 0xec, 0x62, 0x29, - 0xf4, 0xbf, 0x53, 0x18, 0xc5, 0x8e, 0xc4, 0x8f, 0x52, 0x19, - 0xf5, 0xbe, 0x63, 0x28, 0xa6, 0xed, 0x30, 0x7b, 0x97, 0xdc, - 0x01, 0x4a, 0x95, 0xde, 0x03, 0x48, 0xa4, 0xef, 0x32, 0x79, - 0xf7, 0xbc, 0x61, 0x2a, 0xc6, 0x8d, 0x50, 0x1b, 0x51, 0x1a, - 0xc7, 0x8c, 0x60, 0x2b, 0xf6, 0xbd, 0x33, 0x78, 0xa5, 0xee, - 0x02, 0x49, 0x94, 0xdf, 0x37, 0x7c, 0xa1, 0xea, 0x06, 0x4d, - 0x90, 0xdb, 0x55, 0x1e, 0xc3, 0x88, 0x64, 0x2f, 0xf2, 0xb9, - 0xf3, 0xb8, 0x65, 0x2e, 0xc2, 0x89, 0x54, 0x1f, 0x91, 0xda, - 0x07, 0x4c, 0xa0, 0xeb, 0x36, 0x7d, 0xa2, 0xe9, 0x34, 0x7f, - 0x93, 0xd8, 0x05, 0x4e, 0xc0, 0x8b, 0x56, 0x1d, 0xf1, 0xba, - 0x67, 0x2c, 0x66, 0x2d, 0xf0, 0xbb, 0x57, 0x1c, 0xc1, 0x8a, - 0x04, 0x4f, 0x92, 0xd9, 0x35, 0x7e, 0xa3, 0xe8, 0x6e, 0x25, - 0xf8, 0xb3, 0x5f, 0x14, 0xc9, 0x82, 0x0c, 0x47, 0x9a, 0xd1, - 0x3d, 0x76, 0xab, 0xe0, 0xaa, 0xe1, 0x3c, 0x77, 0x9b, 0xd0, - 0x0d, 0x46, 0xc8, 0x83, 0x5e, 0x15, 0xf9, 0xb2, 0x6f, 0x24, - 0xfb, 0xb0, 0x6d, 0x26, 0xca, 0x81, 0x5c, 0x17, 0x99, 0xd2, - 0x0f, 0x44, 0xa8, 0xe3, 0x3e, 0x75, 0x3f, 0x74, 0xa9, 0xe2, - 0x0e, 0x45, 0x98, 0xd3, 0x5d, 0x16, 0xcb, 0x80, 0x6c, 0x27, - 0xfa, 0xb1, 0x59, 0x12, 0xcf, 0x84, 0x68, 0x23, 0xfe, 0xb5, - 0x3b, 0x70, 0xad, 0xe6, 0x0a, 0x41, 0x9c, 0xd7, 0x9d, 0xd6, - 0x0b, 0x40, 0xac, 0xe7, 0x3a, 0x71, 0xff, 0xb4, 0x69, 0x22, - 0xce, 0x85, 0x58, 0x13, 0xcc, 0x87, 0x5a, 0x11, 0xfd, 0xb6, - 0x6b, 0x20, 0xae, 0xe5, 0x38, 0x73, 0x9f, 0xd4, 0x09, 0x42, - 0x08, 0x43, 0x9e, 0xd5, 0x39, 0x72, 0xaf, 0xe4, 0x6a, 0x21, - 0xfc, 0xb7, 0x5b, 0x10, 0xcd, 0x86, 0x00, 0x4c, 0x98, 0xd4, - 0x2d, 0x61, 0xb5, 0xf9, 0x5a, 0x16, 0xc2, 0x8e, 0x77, 0x3b, - 0xef, 0xa3, 0xb4, 0xf8, 0x2c, 0x60, 0x99, 0xd5, 0x01, 0x4d, - 0xee, 0xa2, 0x76, 0x3a, 0xc3, 0x8f, 0x5b, 0x17, 0x75, 0x39, - 0xed, 0xa1, 0x58, 0x14, 0xc0, 0x8c, 0x2f, 0x63, 0xb7, 0xfb, - 0x02, 0x4e, 0x9a, 0xd6, 0xc1, 0x8d, 0x59, 0x15, 0xec, 0xa0, - 0x74, 0x38, 0x9b, 0xd7, 0x03, 0x4f, 0xb6, 0xfa, 0x2e, 0x62, - 0xea, 0xa6, 0x72, 0x3e, 0xc7, 0x8b, 0x5f, 0x13, 0xb0, 0xfc, - 0x28, 0x64, 0x9d, 0xd1, 0x05, 0x49, 0x5e, 0x12, 0xc6, 0x8a, - 0x73, 0x3f, 0xeb, 0xa7, 0x04, 0x48, 0x9c, 0xd0, 0x29, 0x65, - 0xb1, 0xfd, 0x9f, 0xd3, 0x07, 0x4b, 0xb2, 0xfe, 0x2a, 0x66, - 0xc5, 0x89, 0x5d, 0x11, 0xe8, 0xa4, 0x70, 0x3c, 0x2b, 0x67, - 0xb3, 0xff, 0x06, 0x4a, 0x9e, 0xd2, 0x71, 0x3d, 0xe9, 0xa5, - 0x5c, 0x10, 0xc4, 0x88, 0xc9, 0x85, 0x51, 0x1d, 0xe4, 0xa8, - 0x7c, 0x30, 0x93, 0xdf, 0x0b, 0x47, 0xbe, 0xf2, 0x26, 0x6a, - 0x7d, 0x31, 0xe5, 0xa9, 0x50, 0x1c, 0xc8, 0x84, 0x27, 0x6b, - 0xbf, 0xf3, 0x0a, 0x46, 0x92, 0xde, 0xbc, 0xf0, 0x24, 0x68, - 0x91, 0xdd, 0x09, 0x45, 0xe6, 0xaa, 0x7e, 0x32, 0xcb, 0x87, - 0x53, 0x1f, 0x08, 0x44, 0x90, 0xdc, 0x25, 0x69, 0xbd, 0xf1, - 0x52, 0x1e, 0xca, 0x86, 0x7f, 0x33, 0xe7, 0xab, 0x23, 0x6f, - 0xbb, 0xf7, 0x0e, 0x42, 0x96, 0xda, 0x79, 0x35, 0xe1, 0xad, - 0x54, 0x18, 0xcc, 0x80, 0x97, 0xdb, 0x0f, 0x43, 0xba, 0xf6, - 0x22, 0x6e, 0xcd, 0x81, 0x55, 0x19, 0xe0, 0xac, 0x78, 0x34, - 0x56, 0x1a, 0xce, 0x82, 0x7b, 0x37, 0xe3, 0xaf, 0x0c, 0x40, - 0x94, 0xd8, 0x21, 0x6d, 0xb9, 0xf5, 0xe2, 0xae, 0x7a, 0x36, - 0xcf, 0x83, 0x57, 0x1b, 0xb8, 0xf4, 0x20, 0x6c, 0x95, 0xd9, - 0x0d, 0x41, 0x00, 0x4d, 0x9a, 0xd7, 0x29, 0x64, 0xb3, 0xfe, - 0x52, 0x1f, 0xc8, 0x85, 0x7b, 0x36, 0xe1, 0xac, 0xa4, 0xe9, - 0x3e, 0x73, 0x8d, 0xc0, 0x17, 0x5a, 0xf6, 0xbb, 0x6c, 0x21, - 0xdf, 0x92, 0x45, 0x08, 0x55, 0x18, 0xcf, 0x82, 0x7c, 0x31, - 0xe6, 0xab, 0x07, 0x4a, 0x9d, 0xd0, 0x2e, 0x63, 0xb4, 0xf9, - 0xf1, 0xbc, 0x6b, 0x26, 0xd8, 0x95, 0x42, 0x0f, 0xa3, 0xee, - 0x39, 0x74, 0x8a, 0xc7, 0x10, 0x5d, 0xaa, 0xe7, 0x30, 0x7d, - 0x83, 0xce, 0x19, 0x54, 0xf8, 0xb5, 0x62, 0x2f, 0xd1, 0x9c, - 0x4b, 0x06, 0x0e, 0x43, 0x94, 0xd9, 0x27, 0x6a, 0xbd, 0xf0, - 0x5c, 0x11, 0xc6, 0x8b, 0x75, 0x38, 0xef, 0xa2, 0xff, 0xb2, - 0x65, 0x28, 0xd6, 0x9b, 0x4c, 0x01, 0xad, 0xe0, 0x37, 0x7a, - 0x84, 0xc9, 0x1e, 0x53, 0x5b, 0x16, 0xc1, 0x8c, 0x72, 0x3f, - 0xe8, 0xa5, 0x09, 0x44, 0x93, 0xde, 0x20, 0x6d, 0xba, 0xf7, - 0x49, 0x04, 0xd3, 0x9e, 0x60, 0x2d, 0xfa, 0xb7, 0x1b, 0x56, - 0x81, 0xcc, 0x32, 0x7f, 0xa8, 0xe5, 0xed, 0xa0, 0x77, 0x3a, - 0xc4, 0x89, 0x5e, 0x13, 0xbf, 0xf2, 0x25, 0x68, 0x96, 0xdb, - 0x0c, 0x41, 0x1c, 0x51, 0x86, 0xcb, 0x35, 0x78, 0xaf, 0xe2, - 0x4e, 0x03, 0xd4, 0x99, 0x67, 0x2a, 0xfd, 0xb0, 0xb8, 0xf5, - 0x22, 0x6f, 0x91, 0xdc, 0x0b, 0x46, 0xea, 0xa7, 0x70, 0x3d, - 0xc3, 0x8e, 0x59, 0x14, 0xe3, 0xae, 0x79, 0x34, 0xca, 0x87, - 0x50, 0x1d, 0xb1, 0xfc, 0x2b, 0x66, 0x98, 0xd5, 0x02, 0x4f, - 0x47, 0x0a, 0xdd, 0x90, 0x6e, 0x23, 0xf4, 0xb9, 0x15, 0x58, - 0x8f, 0xc2, 0x3c, 0x71, 0xa6, 0xeb, 0xb6, 0xfb, 0x2c, 0x61, - 0x9f, 0xd2, 0x05, 0x48, 0xe4, 0xa9, 0x7e, 0x33, 0xcd, 0x80, - 0x57, 0x1a, 0x12, 0x5f, 0x88, 0xc5, 0x3b, 0x76, 0xa1, 0xec, - 0x40, 0x0d, 0xda, 0x97, 0x69, 0x24, 0xf3, 0xbe, 0x00, 0x4e, - 0x9c, 0xd2, 0x25, 0x6b, 0xb9, 0xf7, 0x4a, 0x04, 0xd6, 0x98, - 0x6f, 0x21, 0xf3, 0xbd, 0x94, 0xda, 0x08, 0x46, 0xb1, 0xff, - 0x2d, 0x63, 0xde, 0x90, 0x42, 0x0c, 0xfb, 0xb5, 0x67, 0x29, - 0x35, 0x7b, 0xa9, 0xe7, 0x10, 0x5e, 0x8c, 0xc2, 0x7f, 0x31, - 0xe3, 0xad, 0x5a, 0x14, 0xc6, 0x88, 0xa1, 0xef, 0x3d, 0x73, - 0x84, 0xca, 0x18, 0x56, 0xeb, 0xa5, 0x77, 0x39, 0xce, 0x80, - 0x52, 0x1c, 0x6a, 0x24, 0xf6, 0xb8, 0x4f, 0x01, 0xd3, 0x9d, - 0x20, 0x6e, 0xbc, 0xf2, 0x05, 0x4b, 0x99, 0xd7, 0xfe, 0xb0, - 0x62, 0x2c, 0xdb, 0x95, 0x47, 0x09, 0xb4, 0xfa, 0x28, 0x66, - 0x91, 0xdf, 0x0d, 0x43, 0x5f, 0x11, 0xc3, 0x8d, 0x7a, 0x34, - 0xe6, 0xa8, 0x15, 0x5b, 0x89, 0xc7, 0x30, 0x7e, 0xac, 0xe2, - 0xcb, 0x85, 0x57, 0x19, 0xee, 0xa0, 0x72, 0x3c, 0x81, 0xcf, - 0x1d, 0x53, 0xa4, 0xea, 0x38, 0x76, 0xd4, 0x9a, 0x48, 0x06, - 0xf1, 0xbf, 0x6d, 0x23, 0x9e, 0xd0, 0x02, 0x4c, 0xbb, 0xf5, - 0x27, 0x69, 0x40, 0x0e, 0xdc, 0x92, 0x65, 0x2b, 0xf9, 0xb7, - 0x0a, 0x44, 0x96, 0xd8, 0x2f, 0x61, 0xb3, 0xfd, 0xe1, 0xaf, - 0x7d, 0x33, 0xc4, 0x8a, 0x58, 0x16, 0xab, 0xe5, 0x37, 0x79, - 0x8e, 0xc0, 0x12, 0x5c, 0x75, 0x3b, 0xe9, 0xa7, 0x50, 0x1e, - 0xcc, 0x82, 0x3f, 0x71, 0xa3, 0xed, 0x1a, 0x54, 0x86, 0xc8, - 0xbe, 0xf0, 0x22, 0x6c, 0x9b, 0xd5, 0x07, 0x49, 0xf4, 0xba, - 0x68, 0x26, 0xd1, 0x9f, 0x4d, 0x03, 0x2a, 0x64, 0xb6, 0xf8, - 0x0f, 0x41, 0x93, 0xdd, 0x60, 0x2e, 0xfc, 0xb2, 0x45, 0x0b, - 0xd9, 0x97, 0x8b, 0xc5, 0x17, 0x59, 0xae, 0xe0, 0x32, 0x7c, - 0xc1, 0x8f, 0x5d, 0x13, 0xe4, 0xaa, 0x78, 0x36, 0x1f, 0x51, - 0x83, 0xcd, 0x3a, 0x74, 0xa6, 0xe8, 0x55, 0x1b, 0xc9, 0x87, - 0x70, 0x3e, 0xec, 0xa2, 0x00, 0x4f, 0x9e, 0xd1, 0x21, 0x6e, - 0xbf, 0xf0, 0x42, 0x0d, 0xdc, 0x93, 0x63, 0x2c, 0xfd, 0xb2, - 0x84, 0xcb, 0x1a, 0x55, 0xa5, 0xea, 0x3b, 0x74, 0xc6, 0x89, - 0x58, 0x17, 0xe7, 0xa8, 0x79, 0x36, 0x15, 0x5a, 0x8b, 0xc4, - 0x34, 0x7b, 0xaa, 0xe5, 0x57, 0x18, 0xc9, 0x86, 0x76, 0x39, - 0xe8, 0xa7, 0x91, 0xde, 0x0f, 0x40, 0xb0, 0xff, 0x2e, 0x61, - 0xd3, 0x9c, 0x4d, 0x02, 0xf2, 0xbd, 0x6c, 0x23, 0x2a, 0x65, - 0xb4, 0xfb, 0x0b, 0x44, 0x95, 0xda, 0x68, 0x27, 0xf6, 0xb9, - 0x49, 0x06, 0xd7, 0x98, 0xae, 0xe1, 0x30, 0x7f, 0x8f, 0xc0, - 0x11, 0x5e, 0xec, 0xa3, 0x72, 0x3d, 0xcd, 0x82, 0x53, 0x1c, - 0x3f, 0x70, 0xa1, 0xee, 0x1e, 0x51, 0x80, 0xcf, 0x7d, 0x32, - 0xe3, 0xac, 0x5c, 0x13, 0xc2, 0x8d, 0xbb, 0xf4, 0x25, 0x6a, - 0x9a, 0xd5, 0x04, 0x4b, 0xf9, 0xb6, 0x67, 0x28, 0xd8, 0x97, - 0x46, 0x09, 0x54, 0x1b, 0xca, 0x85, 0x75, 0x3a, 0xeb, 0xa4, - 0x16, 0x59, 0x88, 0xc7, 0x37, 0x78, 0xa9, 0xe6, 0xd0, 0x9f, - 0x4e, 0x01, 0xf1, 0xbe, 0x6f, 0x20, 0x92, 0xdd, 0x0c, 0x43, - 0xb3, 0xfc, 0x2d, 0x62, 0x41, 0x0e, 0xdf, 0x90, 0x60, 0x2f, - 0xfe, 0xb1, 0x03, 0x4c, 0x9d, 0xd2, 0x22, 0x6d, 0xbc, 0xf3, - 0xc5, 0x8a, 0x5b, 0x14, 0xe4, 0xab, 0x7a, 0x35, 0x87, 0xc8, - 0x19, 0x56, 0xa6, 0xe9, 0x38, 0x77, 0x7e, 0x31, 0xe0, 0xaf, - 0x5f, 0x10, 0xc1, 0x8e, 0x3c, 0x73, 0xa2, 0xed, 0x1d, 0x52, - 0x83, 0xcc, 0xfa, 0xb5, 0x64, 0x2b, 0xdb, 0x94, 0x45, 0x0a, - 0xb8, 0xf7, 0x26, 0x69, 0x99, 0xd6, 0x07, 0x48, 0x6b, 0x24, - 0xf5, 0xba, 0x4a, 0x05, 0xd4, 0x9b, 0x29, 0x66, 0xb7, 0xf8, - 0x08, 0x47, 0x96, 0xd9, 0xef, 0xa0, 0x71, 0x3e, 0xce, 0x81, - 0x50, 0x1f, 0xad, 0xe2, 0x33, 0x7c, 0x8c, 0xc3, 0x12, 0x5d, - 0x00, 0x50, 0xa0, 0xf0, 0x5d, 0x0d, 0xfd, 0xad, 0xba, 0xea, - 0x1a, 0x4a, 0xe7, 0xb7, 0x47, 0x17, 0x69, 0x39, 0xc9, 0x99, - 0x34, 0x64, 0x94, 0xc4, 0xd3, 0x83, 0x73, 0x23, 0x8e, 0xde, - 0x2e, 0x7e, 0xd2, 0x82, 0x72, 0x22, 0x8f, 0xdf, 0x2f, 0x7f, - 0x68, 0x38, 0xc8, 0x98, 0x35, 0x65, 0x95, 0xc5, 0xbb, 0xeb, - 0x1b, 0x4b, 0xe6, 0xb6, 0x46, 0x16, 0x01, 0x51, 0xa1, 0xf1, - 0x5c, 0x0c, 0xfc, 0xac, 0xb9, 0xe9, 0x19, 0x49, 0xe4, 0xb4, - 0x44, 0x14, 0x03, 0x53, 0xa3, 0xf3, 0x5e, 0x0e, 0xfe, 0xae, - 0xd0, 0x80, 0x70, 0x20, 0x8d, 0xdd, 0x2d, 0x7d, 0x6a, 0x3a, - 0xca, 0x9a, 0x37, 0x67, 0x97, 0xc7, 0x6b, 0x3b, 0xcb, 0x9b, - 0x36, 0x66, 0x96, 0xc6, 0xd1, 0x81, 0x71, 0x21, 0x8c, 0xdc, - 0x2c, 0x7c, 0x02, 0x52, 0xa2, 0xf2, 0x5f, 0x0f, 0xff, 0xaf, - 0xb8, 0xe8, 0x18, 0x48, 0xe5, 0xb5, 0x45, 0x15, 0x6f, 0x3f, - 0xcf, 0x9f, 0x32, 0x62, 0x92, 0xc2, 0xd5, 0x85, 0x75, 0x25, - 0x88, 0xd8, 0x28, 0x78, 0x06, 0x56, 0xa6, 0xf6, 0x5b, 0x0b, - 0xfb, 0xab, 0xbc, 0xec, 0x1c, 0x4c, 0xe1, 0xb1, 0x41, 0x11, - 0xbd, 0xed, 0x1d, 0x4d, 0xe0, 0xb0, 0x40, 0x10, 0x07, 0x57, - 0xa7, 0xf7, 0x5a, 0x0a, 0xfa, 0xaa, 0xd4, 0x84, 0x74, 0x24, - 0x89, 0xd9, 0x29, 0x79, 0x6e, 0x3e, 0xce, 0x9e, 0x33, 0x63, - 0x93, 0xc3, 0xd6, 0x86, 0x76, 0x26, 0x8b, 0xdb, 0x2b, 0x7b, - 0x6c, 0x3c, 0xcc, 0x9c, 0x31, 0x61, 0x91, 0xc1, 0xbf, 0xef, - 0x1f, 0x4f, 0xe2, 0xb2, 0x42, 0x12, 0x05, 0x55, 0xa5, 0xf5, - 0x58, 0x08, 0xf8, 0xa8, 0x04, 0x54, 0xa4, 0xf4, 0x59, 0x09, - 0xf9, 0xa9, 0xbe, 0xee, 0x1e, 0x4e, 0xe3, 0xb3, 0x43, 0x13, - 0x6d, 0x3d, 0xcd, 0x9d, 0x30, 0x60, 0x90, 0xc0, 0xd7, 0x87, - 0x77, 0x27, 0x8a, 0xda, 0x2a, 0x7a, 0x00, 0x51, 0xa2, 0xf3, - 0x59, 0x08, 0xfb, 0xaa, 0xb2, 0xe3, 0x10, 0x41, 0xeb, 0xba, - 0x49, 0x18, 0x79, 0x28, 0xdb, 0x8a, 0x20, 0x71, 0x82, 0xd3, - 0xcb, 0x9a, 0x69, 0x38, 0x92, 0xc3, 0x30, 0x61, 0xf2, 0xa3, - 0x50, 0x01, 0xab, 0xfa, 0x09, 0x58, 0x40, 0x11, 0xe2, 0xb3, - 0x19, 0x48, 0xbb, 0xea, 0x8b, 0xda, 0x29, 0x78, 0xd2, 0x83, - 0x70, 0x21, 0x39, 0x68, 0x9b, 0xca, 0x60, 0x31, 0xc2, 0x93, - 0xf9, 0xa8, 0x5b, 0x0a, 0xa0, 0xf1, 0x02, 0x53, 0x4b, 0x1a, - 0xe9, 0xb8, 0x12, 0x43, 0xb0, 0xe1, 0x80, 0xd1, 0x22, 0x73, - 0xd9, 0x88, 0x7b, 0x2a, 0x32, 0x63, 0x90, 0xc1, 0x6b, 0x3a, - 0xc9, 0x98, 0x0b, 0x5a, 0xa9, 0xf8, 0x52, 0x03, 0xf0, 0xa1, - 0xb9, 0xe8, 0x1b, 0x4a, 0xe0, 0xb1, 0x42, 0x13, 0x72, 0x23, - 0xd0, 0x81, 0x2b, 0x7a, 0x89, 0xd8, 0xc0, 0x91, 0x62, 0x33, - 0x99, 0xc8, 0x3b, 0x6a, 0xef, 0xbe, 0x4d, 0x1c, 0xb6, 0xe7, - 0x14, 0x45, 0x5d, 0x0c, 0xff, 0xae, 0x04, 0x55, 0xa6, 0xf7, - 0x96, 0xc7, 0x34, 0x65, 0xcf, 0x9e, 0x6d, 0x3c, 0x24, 0x75, - 0x86, 0xd7, 0x7d, 0x2c, 0xdf, 0x8e, 0x1d, 0x4c, 0xbf, 0xee, - 0x44, 0x15, 0xe6, 0xb7, 0xaf, 0xfe, 0x0d, 0x5c, 0xf6, 0xa7, - 0x54, 0x05, 0x64, 0x35, 0xc6, 0x97, 0x3d, 0x6c, 0x9f, 0xce, - 0xd6, 0x87, 0x74, 0x25, 0x8f, 0xde, 0x2d, 0x7c, 0x16, 0x47, - 0xb4, 0xe5, 0x4f, 0x1e, 0xed, 0xbc, 0xa4, 0xf5, 0x06, 0x57, - 0xfd, 0xac, 0x5f, 0x0e, 0x6f, 0x3e, 0xcd, 0x9c, 0x36, 0x67, - 0x94, 0xc5, 0xdd, 0x8c, 0x7f, 0x2e, 0x84, 0xd5, 0x26, 0x77, - 0xe4, 0xb5, 0x46, 0x17, 0xbd, 0xec, 0x1f, 0x4e, 0x56, 0x07, - 0xf4, 0xa5, 0x0f, 0x5e, 0xad, 0xfc, 0x9d, 0xcc, 0x3f, 0x6e, - 0xc4, 0x95, 0x66, 0x37, 0x2f, 0x7e, 0x8d, 0xdc, 0x76, 0x27, - 0xd4, 0x85, 0x00, 0x52, 0xa4, 0xf6, 0x55, 0x07, 0xf1, 0xa3, - 0xaa, 0xf8, 0x0e, 0x5c, 0xff, 0xad, 0x5b, 0x09, 0x49, 0x1b, - 0xed, 0xbf, 0x1c, 0x4e, 0xb8, 0xea, 0xe3, 0xb1, 0x47, 0x15, - 0xb6, 0xe4, 0x12, 0x40, 0x92, 0xc0, 0x36, 0x64, 0xc7, 0x95, - 0x63, 0x31, 0x38, 0x6a, 0x9c, 0xce, 0x6d, 0x3f, 0xc9, 0x9b, - 0xdb, 0x89, 0x7f, 0x2d, 0x8e, 0xdc, 0x2a, 0x78, 0x71, 0x23, - 0xd5, 0x87, 0x24, 0x76, 0x80, 0xd2, 0x39, 0x6b, 0x9d, 0xcf, - 0x6c, 0x3e, 0xc8, 0x9a, 0x93, 0xc1, 0x37, 0x65, 0xc6, 0x94, - 0x62, 0x30, 0x70, 0x22, 0xd4, 0x86, 0x25, 0x77, 0x81, 0xd3, - 0xda, 0x88, 0x7e, 0x2c, 0x8f, 0xdd, 0x2b, 0x79, 0xab, 0xf9, - 0x0f, 0x5d, 0xfe, 0xac, 0x5a, 0x08, 0x01, 0x53, 0xa5, 0xf7, - 0x54, 0x06, 0xf0, 0xa2, 0xe2, 0xb0, 0x46, 0x14, 0xb7, 0xe5, - 0x13, 0x41, 0x48, 0x1a, 0xec, 0xbe, 0x1d, 0x4f, 0xb9, 0xeb, - 0x72, 0x20, 0xd6, 0x84, 0x27, 0x75, 0x83, 0xd1, 0xd8, 0x8a, - 0x7c, 0x2e, 0x8d, 0xdf, 0x29, 0x7b, 0x3b, 0x69, 0x9f, 0xcd, - 0x6e, 0x3c, 0xca, 0x98, 0x91, 0xc3, 0x35, 0x67, 0xc4, 0x96, - 0x60, 0x32, 0xe0, 0xb2, 0x44, 0x16, 0xb5, 0xe7, 0x11, 0x43, - 0x4a, 0x18, 0xee, 0xbc, 0x1f, 0x4d, 0xbb, 0xe9, 0xa9, 0xfb, - 0x0d, 0x5f, 0xfc, 0xae, 0x58, 0x0a, 0x03, 0x51, 0xa7, 0xf5, - 0x56, 0x04, 0xf2, 0xa0, 0x4b, 0x19, 0xef, 0xbd, 0x1e, 0x4c, - 0xba, 0xe8, 0xe1, 0xb3, 0x45, 0x17, 0xb4, 0xe6, 0x10, 0x42, - 0x02, 0x50, 0xa6, 0xf4, 0x57, 0x05, 0xf3, 0xa1, 0xa8, 0xfa, - 0x0c, 0x5e, 0xfd, 0xaf, 0x59, 0x0b, 0xd9, 0x8b, 0x7d, 0x2f, - 0x8c, 0xde, 0x28, 0x7a, 0x73, 0x21, 0xd7, 0x85, 0x26, 0x74, - 0x82, 0xd0, 0x90, 0xc2, 0x34, 0x66, 0xc5, 0x97, 0x61, 0x33, - 0x3a, 0x68, 0x9e, 0xcc, 0x6f, 0x3d, 0xcb, 0x99, 0x00, 0x53, - 0xa6, 0xf5, 0x51, 0x02, 0xf7, 0xa4, 0xa2, 0xf1, 0x04, 0x57, - 0xf3, 0xa0, 0x55, 0x06, 0x59, 0x0a, 0xff, 0xac, 0x08, 0x5b, - 0xae, 0xfd, 0xfb, 0xa8, 0x5d, 0x0e, 0xaa, 0xf9, 0x0c, 0x5f, - 0xb2, 0xe1, 0x14, 0x47, 0xe3, 0xb0, 0x45, 0x16, 0x10, 0x43, - 0xb6, 0xe5, 0x41, 0x12, 0xe7, 0xb4, 0xeb, 0xb8, 0x4d, 0x1e, - 0xba, 0xe9, 0x1c, 0x4f, 0x49, 0x1a, 0xef, 0xbc, 0x18, 0x4b, - 0xbe, 0xed, 0x79, 0x2a, 0xdf, 0x8c, 0x28, 0x7b, 0x8e, 0xdd, - 0xdb, 0x88, 0x7d, 0x2e, 0x8a, 0xd9, 0x2c, 0x7f, 0x20, 0x73, - 0x86, 0xd5, 0x71, 0x22, 0xd7, 0x84, 0x82, 0xd1, 0x24, 0x77, - 0xd3, 0x80, 0x75, 0x26, 0xcb, 0x98, 0x6d, 0x3e, 0x9a, 0xc9, - 0x3c, 0x6f, 0x69, 0x3a, 0xcf, 0x9c, 0x38, 0x6b, 0x9e, 0xcd, - 0x92, 0xc1, 0x34, 0x67, 0xc3, 0x90, 0x65, 0x36, 0x30, 0x63, - 0x96, 0xc5, 0x61, 0x32, 0xc7, 0x94, 0xf2, 0xa1, 0x54, 0x07, - 0xa3, 0xf0, 0x05, 0x56, 0x50, 0x03, 0xf6, 0xa5, 0x01, 0x52, - 0xa7, 0xf4, 0xab, 0xf8, 0x0d, 0x5e, 0xfa, 0xa9, 0x5c, 0x0f, - 0x09, 0x5a, 0xaf, 0xfc, 0x58, 0x0b, 0xfe, 0xad, 0x40, 0x13, - 0xe6, 0xb5, 0x11, 0x42, 0xb7, 0xe4, 0xe2, 0xb1, 0x44, 0x17, - 0xb3, 0xe0, 0x15, 0x46, 0x19, 0x4a, 0xbf, 0xec, 0x48, 0x1b, - 0xee, 0xbd, 0xbb, 0xe8, 0x1d, 0x4e, 0xea, 0xb9, 0x4c, 0x1f, - 0x8b, 0xd8, 0x2d, 0x7e, 0xda, 0x89, 0x7c, 0x2f, 0x29, 0x7a, - 0x8f, 0xdc, 0x78, 0x2b, 0xde, 0x8d, 0xd2, 0x81, 0x74, 0x27, - 0x83, 0xd0, 0x25, 0x76, 0x70, 0x23, 0xd6, 0x85, 0x21, 0x72, - 0x87, 0xd4, 0x39, 0x6a, 0x9f, 0xcc, 0x68, 0x3b, 0xce, 0x9d, - 0x9b, 0xc8, 0x3d, 0x6e, 0xca, 0x99, 0x6c, 0x3f, 0x60, 0x33, - 0xc6, 0x95, 0x31, 0x62, 0x97, 0xc4, 0xc2, 0x91, 0x64, 0x37, - 0x93, 0xc0, 0x35, 0x66, 0x00, 0x54, 0xa8, 0xfc, 0x4d, 0x19, - 0xe5, 0xb1, 0x9a, 0xce, 0x32, 0x66, 0xd7, 0x83, 0x7f, 0x2b, - 0x29, 0x7d, 0x81, 0xd5, 0x64, 0x30, 0xcc, 0x98, 0xb3, 0xe7, - 0x1b, 0x4f, 0xfe, 0xaa, 0x56, 0x02, 0x52, 0x06, 0xfa, 0xae, - 0x1f, 0x4b, 0xb7, 0xe3, 0xc8, 0x9c, 0x60, 0x34, 0x85, 0xd1, - 0x2d, 0x79, 0x7b, 0x2f, 0xd3, 0x87, 0x36, 0x62, 0x9e, 0xca, - 0xe1, 0xb5, 0x49, 0x1d, 0xac, 0xf8, 0x04, 0x50, 0xa4, 0xf0, - 0x0c, 0x58, 0xe9, 0xbd, 0x41, 0x15, 0x3e, 0x6a, 0x96, 0xc2, - 0x73, 0x27, 0xdb, 0x8f, 0x8d, 0xd9, 0x25, 0x71, 0xc0, 0x94, - 0x68, 0x3c, 0x17, 0x43, 0xbf, 0xeb, 0x5a, 0x0e, 0xf2, 0xa6, - 0xf6, 0xa2, 0x5e, 0x0a, 0xbb, 0xef, 0x13, 0x47, 0x6c, 0x38, - 0xc4, 0x90, 0x21, 0x75, 0x89, 0xdd, 0xdf, 0x8b, 0x77, 0x23, - 0x92, 0xc6, 0x3a, 0x6e, 0x45, 0x11, 0xed, 0xb9, 0x08, 0x5c, - 0xa0, 0xf4, 0x55, 0x01, 0xfd, 0xa9, 0x18, 0x4c, 0xb0, 0xe4, - 0xcf, 0x9b, 0x67, 0x33, 0x82, 0xd6, 0x2a, 0x7e, 0x7c, 0x28, - 0xd4, 0x80, 0x31, 0x65, 0x99, 0xcd, 0xe6, 0xb2, 0x4e, 0x1a, - 0xab, 0xff, 0x03, 0x57, 0x07, 0x53, 0xaf, 0xfb, 0x4a, 0x1e, - 0xe2, 0xb6, 0x9d, 0xc9, 0x35, 0x61, 0xd0, 0x84, 0x78, 0x2c, - 0x2e, 0x7a, 0x86, 0xd2, 0x63, 0x37, 0xcb, 0x9f, 0xb4, 0xe0, - 0x1c, 0x48, 0xf9, 0xad, 0x51, 0x05, 0xf1, 0xa5, 0x59, 0x0d, - 0xbc, 0xe8, 0x14, 0x40, 0x6b, 0x3f, 0xc3, 0x97, 0x26, 0x72, - 0x8e, 0xda, 0xd8, 0x8c, 0x70, 0x24, 0x95, 0xc1, 0x3d, 0x69, - 0x42, 0x16, 0xea, 0xbe, 0x0f, 0x5b, 0xa7, 0xf3, 0xa3, 0xf7, - 0x0b, 0x5f, 0xee, 0xba, 0x46, 0x12, 0x39, 0x6d, 0x91, 0xc5, - 0x74, 0x20, 0xdc, 0x88, 0x8a, 0xde, 0x22, 0x76, 0xc7, 0x93, - 0x6f, 0x3b, 0x10, 0x44, 0xb8, 0xec, 0x5d, 0x09, 0xf5, 0xa1, - 0x00, 0x55, 0xaa, 0xff, 0x49, 0x1c, 0xe3, 0xb6, 0x92, 0xc7, - 0x38, 0x6d, 0xdb, 0x8e, 0x71, 0x24, 0x39, 0x6c, 0x93, 0xc6, - 0x70, 0x25, 0xda, 0x8f, 0xab, 0xfe, 0x01, 0x54, 0xe2, 0xb7, - 0x48, 0x1d, 0x72, 0x27, 0xd8, 0x8d, 0x3b, 0x6e, 0x91, 0xc4, - 0xe0, 0xb5, 0x4a, 0x1f, 0xa9, 0xfc, 0x03, 0x56, 0x4b, 0x1e, - 0xe1, 0xb4, 0x02, 0x57, 0xa8, 0xfd, 0xd9, 0x8c, 0x73, 0x26, - 0x90, 0xc5, 0x3a, 0x6f, 0xe4, 0xb1, 0x4e, 0x1b, 0xad, 0xf8, - 0x07, 0x52, 0x76, 0x23, 0xdc, 0x89, 0x3f, 0x6a, 0x95, 0xc0, - 0xdd, 0x88, 0x77, 0x22, 0x94, 0xc1, 0x3e, 0x6b, 0x4f, 0x1a, - 0xe5, 0xb0, 0x06, 0x53, 0xac, 0xf9, 0x96, 0xc3, 0x3c, 0x69, - 0xdf, 0x8a, 0x75, 0x20, 0x04, 0x51, 0xae, 0xfb, 0x4d, 0x18, - 0xe7, 0xb2, 0xaf, 0xfa, 0x05, 0x50, 0xe6, 0xb3, 0x4c, 0x19, - 0x3d, 0x68, 0x97, 0xc2, 0x74, 0x21, 0xde, 0x8b, 0xd5, 0x80, - 0x7f, 0x2a, 0x9c, 0xc9, 0x36, 0x63, 0x47, 0x12, 0xed, 0xb8, - 0x0e, 0x5b, 0xa4, 0xf1, 0xec, 0xb9, 0x46, 0x13, 0xa5, 0xf0, - 0x0f, 0x5a, 0x7e, 0x2b, 0xd4, 0x81, 0x37, 0x62, 0x9d, 0xc8, - 0xa7, 0xf2, 0x0d, 0x58, 0xee, 0xbb, 0x44, 0x11, 0x35, 0x60, - 0x9f, 0xca, 0x7c, 0x29, 0xd6, 0x83, 0x9e, 0xcb, 0x34, 0x61, - 0xd7, 0x82, 0x7d, 0x28, 0x0c, 0x59, 0xa6, 0xf3, 0x45, 0x10, - 0xef, 0xba, 0x31, 0x64, 0x9b, 0xce, 0x78, 0x2d, 0xd2, 0x87, - 0xa3, 0xf6, 0x09, 0x5c, 0xea, 0xbf, 0x40, 0x15, 0x08, 0x5d, - 0xa2, 0xf7, 0x41, 0x14, 0xeb, 0xbe, 0x9a, 0xcf, 0x30, 0x65, - 0xd3, 0x86, 0x79, 0x2c, 0x43, 0x16, 0xe9, 0xbc, 0x0a, 0x5f, - 0xa0, 0xf5, 0xd1, 0x84, 0x7b, 0x2e, 0x98, 0xcd, 0x32, 0x67, - 0x7a, 0x2f, 0xd0, 0x85, 0x33, 0x66, 0x99, 0xcc, 0xe8, 0xbd, - 0x42, 0x17, 0xa1, 0xf4, 0x0b, 0x5e, 0x00, 0x56, 0xac, 0xfa, - 0x45, 0x13, 0xe9, 0xbf, 0x8a, 0xdc, 0x26, 0x70, 0xcf, 0x99, - 0x63, 0x35, 0x09, 0x5f, 0xa5, 0xf3, 0x4c, 0x1a, 0xe0, 0xb6, - 0x83, 0xd5, 0x2f, 0x79, 0xc6, 0x90, 0x6a, 0x3c, 0x12, 0x44, - 0xbe, 0xe8, 0x57, 0x01, 0xfb, 0xad, 0x98, 0xce, 0x34, 0x62, - 0xdd, 0x8b, 0x71, 0x27, 0x1b, 0x4d, 0xb7, 0xe1, 0x5e, 0x08, - 0xf2, 0xa4, 0x91, 0xc7, 0x3d, 0x6b, 0xd4, 0x82, 0x78, 0x2e, - 0x24, 0x72, 0x88, 0xde, 0x61, 0x37, 0xcd, 0x9b, 0xae, 0xf8, - 0x02, 0x54, 0xeb, 0xbd, 0x47, 0x11, 0x2d, 0x7b, 0x81, 0xd7, - 0x68, 0x3e, 0xc4, 0x92, 0xa7, 0xf1, 0x0b, 0x5d, 0xe2, 0xb4, - 0x4e, 0x18, 0x36, 0x60, 0x9a, 0xcc, 0x73, 0x25, 0xdf, 0x89, - 0xbc, 0xea, 0x10, 0x46, 0xf9, 0xaf, 0x55, 0x03, 0x3f, 0x69, - 0x93, 0xc5, 0x7a, 0x2c, 0xd6, 0x80, 0xb5, 0xe3, 0x19, 0x4f, - 0xf0, 0xa6, 0x5c, 0x0a, 0x48, 0x1e, 0xe4, 0xb2, 0x0d, 0x5b, - 0xa1, 0xf7, 0xc2, 0x94, 0x6e, 0x38, 0x87, 0xd1, 0x2b, 0x7d, - 0x41, 0x17, 0xed, 0xbb, 0x04, 0x52, 0xa8, 0xfe, 0xcb, 0x9d, - 0x67, 0x31, 0x8e, 0xd8, 0x22, 0x74, 0x5a, 0x0c, 0xf6, 0xa0, - 0x1f, 0x49, 0xb3, 0xe5, 0xd0, 0x86, 0x7c, 0x2a, 0x95, 0xc3, - 0x39, 0x6f, 0x53, 0x05, 0xff, 0xa9, 0x16, 0x40, 0xba, 0xec, - 0xd9, 0x8f, 0x75, 0x23, 0x9c, 0xca, 0x30, 0x66, 0x6c, 0x3a, - 0xc0, 0x96, 0x29, 0x7f, 0x85, 0xd3, 0xe6, 0xb0, 0x4a, 0x1c, - 0xa3, 0xf5, 0x0f, 0x59, 0x65, 0x33, 0xc9, 0x9f, 0x20, 0x76, - 0x8c, 0xda, 0xef, 0xb9, 0x43, 0x15, 0xaa, 0xfc, 0x06, 0x50, - 0x7e, 0x28, 0xd2, 0x84, 0x3b, 0x6d, 0x97, 0xc1, 0xf4, 0xa2, - 0x58, 0x0e, 0xb1, 0xe7, 0x1d, 0x4b, 0x77, 0x21, 0xdb, 0x8d, - 0x32, 0x64, 0x9e, 0xc8, 0xfd, 0xab, 0x51, 0x07, 0xb8, 0xee, - 0x14, 0x42, 0x00, 0x57, 0xae, 0xf9, 0x41, 0x16, 0xef, 0xb8, - 0x82, 0xd5, 0x2c, 0x7b, 0xc3, 0x94, 0x6d, 0x3a, 0x19, 0x4e, - 0xb7, 0xe0, 0x58, 0x0f, 0xf6, 0xa1, 0x9b, 0xcc, 0x35, 0x62, - 0xda, 0x8d, 0x74, 0x23, 0x32, 0x65, 0x9c, 0xcb, 0x73, 0x24, - 0xdd, 0x8a, 0xb0, 0xe7, 0x1e, 0x49, 0xf1, 0xa6, 0x5f, 0x08, - 0x2b, 0x7c, 0x85, 0xd2, 0x6a, 0x3d, 0xc4, 0x93, 0xa9, 0xfe, - 0x07, 0x50, 0xe8, 0xbf, 0x46, 0x11, 0x64, 0x33, 0xca, 0x9d, - 0x25, 0x72, 0x8b, 0xdc, 0xe6, 0xb1, 0x48, 0x1f, 0xa7, 0xf0, - 0x09, 0x5e, 0x7d, 0x2a, 0xd3, 0x84, 0x3c, 0x6b, 0x92, 0xc5, - 0xff, 0xa8, 0x51, 0x06, 0xbe, 0xe9, 0x10, 0x47, 0x56, 0x01, - 0xf8, 0xaf, 0x17, 0x40, 0xb9, 0xee, 0xd4, 0x83, 0x7a, 0x2d, - 0x95, 0xc2, 0x3b, 0x6c, 0x4f, 0x18, 0xe1, 0xb6, 0x0e, 0x59, - 0xa0, 0xf7, 0xcd, 0x9a, 0x63, 0x34, 0x8c, 0xdb, 0x22, 0x75, - 0xc8, 0x9f, 0x66, 0x31, 0x89, 0xde, 0x27, 0x70, 0x4a, 0x1d, - 0xe4, 0xb3, 0x0b, 0x5c, 0xa5, 0xf2, 0xd1, 0x86, 0x7f, 0x28, - 0x90, 0xc7, 0x3e, 0x69, 0x53, 0x04, 0xfd, 0xaa, 0x12, 0x45, - 0xbc, 0xeb, 0xfa, 0xad, 0x54, 0x03, 0xbb, 0xec, 0x15, 0x42, - 0x78, 0x2f, 0xd6, 0x81, 0x39, 0x6e, 0x97, 0xc0, 0xe3, 0xb4, - 0x4d, 0x1a, 0xa2, 0xf5, 0x0c, 0x5b, 0x61, 0x36, 0xcf, 0x98, - 0x20, 0x77, 0x8e, 0xd9, 0xac, 0xfb, 0x02, 0x55, 0xed, 0xba, - 0x43, 0x14, 0x2e, 0x79, 0x80, 0xd7, 0x6f, 0x38, 0xc1, 0x96, - 0xb5, 0xe2, 0x1b, 0x4c, 0xf4, 0xa3, 0x5a, 0x0d, 0x37, 0x60, - 0x99, 0xce, 0x76, 0x21, 0xd8, 0x8f, 0x9e, 0xc9, 0x30, 0x67, - 0xdf, 0x88, 0x71, 0x26, 0x1c, 0x4b, 0xb2, 0xe5, 0x5d, 0x0a, - 0xf3, 0xa4, 0x87, 0xd0, 0x29, 0x7e, 0xc6, 0x91, 0x68, 0x3f, - 0x05, 0x52, 0xab, 0xfc, 0x44, 0x13, 0xea, 0xbd, 0x00, 0x58, - 0xb0, 0xe8, 0x7d, 0x25, 0xcd, 0x95, 0xfa, 0xa2, 0x4a, 0x12, - 0x87, 0xdf, 0x37, 0x6f, 0xe9, 0xb1, 0x59, 0x01, 0x94, 0xcc, - 0x24, 0x7c, 0x13, 0x4b, 0xa3, 0xfb, 0x6e, 0x36, 0xde, 0x86, - 0xcf, 0x97, 0x7f, 0x27, 0xb2, 0xea, 0x02, 0x5a, 0x35, 0x6d, - 0x85, 0xdd, 0x48, 0x10, 0xf8, 0xa0, 0x26, 0x7e, 0x96, 0xce, - 0x5b, 0x03, 0xeb, 0xb3, 0xdc, 0x84, 0x6c, 0x34, 0xa1, 0xf9, - 0x11, 0x49, 0x83, 0xdb, 0x33, 0x6b, 0xfe, 0xa6, 0x4e, 0x16, - 0x79, 0x21, 0xc9, 0x91, 0x04, 0x5c, 0xb4, 0xec, 0x6a, 0x32, - 0xda, 0x82, 0x17, 0x4f, 0xa7, 0xff, 0x90, 0xc8, 0x20, 0x78, - 0xed, 0xb5, 0x5d, 0x05, 0x4c, 0x14, 0xfc, 0xa4, 0x31, 0x69, - 0x81, 0xd9, 0xb6, 0xee, 0x06, 0x5e, 0xcb, 0x93, 0x7b, 0x23, - 0xa5, 0xfd, 0x15, 0x4d, 0xd8, 0x80, 0x68, 0x30, 0x5f, 0x07, - 0xef, 0xb7, 0x22, 0x7a, 0x92, 0xca, 0x1b, 0x43, 0xab, 0xf3, - 0x66, 0x3e, 0xd6, 0x8e, 0xe1, 0xb9, 0x51, 0x09, 0x9c, 0xc4, - 0x2c, 0x74, 0xf2, 0xaa, 0x42, 0x1a, 0x8f, 0xd7, 0x3f, 0x67, - 0x08, 0x50, 0xb8, 0xe0, 0x75, 0x2d, 0xc5, 0x9d, 0xd4, 0x8c, - 0x64, 0x3c, 0xa9, 0xf1, 0x19, 0x41, 0x2e, 0x76, 0x9e, 0xc6, - 0x53, 0x0b, 0xe3, 0xbb, 0x3d, 0x65, 0x8d, 0xd5, 0x40, 0x18, - 0xf0, 0xa8, 0xc7, 0x9f, 0x77, 0x2f, 0xba, 0xe2, 0x0a, 0x52, - 0x98, 0xc0, 0x28, 0x70, 0xe5, 0xbd, 0x55, 0x0d, 0x62, 0x3a, - 0xd2, 0x8a, 0x1f, 0x47, 0xaf, 0xf7, 0x71, 0x29, 0xc1, 0x99, - 0x0c, 0x54, 0xbc, 0xe4, 0x8b, 0xd3, 0x3b, 0x63, 0xf6, 0xae, - 0x46, 0x1e, 0x57, 0x0f, 0xe7, 0xbf, 0x2a, 0x72, 0x9a, 0xc2, - 0xad, 0xf5, 0x1d, 0x45, 0xd0, 0x88, 0x60, 0x38, 0xbe, 0xe6, - 0x0e, 0x56, 0xc3, 0x9b, 0x73, 0x2b, 0x44, 0x1c, 0xf4, 0xac, - 0x39, 0x61, 0x89, 0xd1, 0x00, 0x59, 0xb2, 0xeb, 0x79, 0x20, - 0xcb, 0x92, 0xf2, 0xab, 0x40, 0x19, 0x8b, 0xd2, 0x39, 0x60, - 0xf9, 0xa0, 0x4b, 0x12, 0x80, 0xd9, 0x32, 0x6b, 0x0b, 0x52, - 0xb9, 0xe0, 0x72, 0x2b, 0xc0, 0x99, 0xef, 0xb6, 0x5d, 0x04, - 0x96, 0xcf, 0x24, 0x7d, 0x1d, 0x44, 0xaf, 0xf6, 0x64, 0x3d, - 0xd6, 0x8f, 0x16, 0x4f, 0xa4, 0xfd, 0x6f, 0x36, 0xdd, 0x84, - 0xe4, 0xbd, 0x56, 0x0f, 0x9d, 0xc4, 0x2f, 0x76, 0xc3, 0x9a, - 0x71, 0x28, 0xba, 0xe3, 0x08, 0x51, 0x31, 0x68, 0x83, 0xda, - 0x48, 0x11, 0xfa, 0xa3, 0x3a, 0x63, 0x88, 0xd1, 0x43, 0x1a, - 0xf1, 0xa8, 0xc8, 0x91, 0x7a, 0x23, 0xb1, 0xe8, 0x03, 0x5a, - 0x2c, 0x75, 0x9e, 0xc7, 0x55, 0x0c, 0xe7, 0xbe, 0xde, 0x87, - 0x6c, 0x35, 0xa7, 0xfe, 0x15, 0x4c, 0xd5, 0x8c, 0x67, 0x3e, - 0xac, 0xf5, 0x1e, 0x47, 0x27, 0x7e, 0x95, 0xcc, 0x5e, 0x07, - 0xec, 0xb5, 0x9b, 0xc2, 0x29, 0x70, 0xe2, 0xbb, 0x50, 0x09, - 0x69, 0x30, 0xdb, 0x82, 0x10, 0x49, 0xa2, 0xfb, 0x62, 0x3b, - 0xd0, 0x89, 0x1b, 0x42, 0xa9, 0xf0, 0x90, 0xc9, 0x22, 0x7b, - 0xe9, 0xb0, 0x5b, 0x02, 0x74, 0x2d, 0xc6, 0x9f, 0x0d, 0x54, - 0xbf, 0xe6, 0x86, 0xdf, 0x34, 0x6d, 0xff, 0xa6, 0x4d, 0x14, - 0x8d, 0xd4, 0x3f, 0x66, 0xf4, 0xad, 0x46, 0x1f, 0x7f, 0x26, - 0xcd, 0x94, 0x06, 0x5f, 0xb4, 0xed, 0x58, 0x01, 0xea, 0xb3, - 0x21, 0x78, 0x93, 0xca, 0xaa, 0xf3, 0x18, 0x41, 0xd3, 0x8a, - 0x61, 0x38, 0xa1, 0xf8, 0x13, 0x4a, 0xd8, 0x81, 0x6a, 0x33, - 0x53, 0x0a, 0xe1, 0xb8, 0x2a, 0x73, 0x98, 0xc1, 0xb7, 0xee, - 0x05, 0x5c, 0xce, 0x97, 0x7c, 0x25, 0x45, 0x1c, 0xf7, 0xae, - 0x3c, 0x65, 0x8e, 0xd7, 0x4e, 0x17, 0xfc, 0xa5, 0x37, 0x6e, - 0x85, 0xdc, 0xbc, 0xe5, 0x0e, 0x57, 0xc5, 0x9c, 0x77, 0x2e, - 0x00, 0x5a, 0xb4, 0xee, 0x75, 0x2f, 0xc1, 0x9b, 0xea, 0xb0, - 0x5e, 0x04, 0x9f, 0xc5, 0x2b, 0x71, 0xc9, 0x93, 0x7d, 0x27, - 0xbc, 0xe6, 0x08, 0x52, 0x23, 0x79, 0x97, 0xcd, 0x56, 0x0c, - 0xe2, 0xb8, 0x8f, 0xd5, 0x3b, 0x61, 0xfa, 0xa0, 0x4e, 0x14, - 0x65, 0x3f, 0xd1, 0x8b, 0x10, 0x4a, 0xa4, 0xfe, 0x46, 0x1c, - 0xf2, 0xa8, 0x33, 0x69, 0x87, 0xdd, 0xac, 0xf6, 0x18, 0x42, - 0xd9, 0x83, 0x6d, 0x37, 0x03, 0x59, 0xb7, 0xed, 0x76, 0x2c, - 0xc2, 0x98, 0xe9, 0xb3, 0x5d, 0x07, 0x9c, 0xc6, 0x28, 0x72, - 0xca, 0x90, 0x7e, 0x24, 0xbf, 0xe5, 0x0b, 0x51, 0x20, 0x7a, - 0x94, 0xce, 0x55, 0x0f, 0xe1, 0xbb, 0x8c, 0xd6, 0x38, 0x62, - 0xf9, 0xa3, 0x4d, 0x17, 0x66, 0x3c, 0xd2, 0x88, 0x13, 0x49, - 0xa7, 0xfd, 0x45, 0x1f, 0xf1, 0xab, 0x30, 0x6a, 0x84, 0xde, - 0xaf, 0xf5, 0x1b, 0x41, 0xda, 0x80, 0x6e, 0x34, 0x06, 0x5c, - 0xb2, 0xe8, 0x73, 0x29, 0xc7, 0x9d, 0xec, 0xb6, 0x58, 0x02, - 0x99, 0xc3, 0x2d, 0x77, 0xcf, 0x95, 0x7b, 0x21, 0xba, 0xe0, - 0x0e, 0x54, 0x25, 0x7f, 0x91, 0xcb, 0x50, 0x0a, 0xe4, 0xbe, - 0x89, 0xd3, 0x3d, 0x67, 0xfc, 0xa6, 0x48, 0x12, 0x63, 0x39, - 0xd7, 0x8d, 0x16, 0x4c, 0xa2, 0xf8, 0x40, 0x1a, 0xf4, 0xae, - 0x35, 0x6f, 0x81, 0xdb, 0xaa, 0xf0, 0x1e, 0x44, 0xdf, 0x85, - 0x6b, 0x31, 0x05, 0x5f, 0xb1, 0xeb, 0x70, 0x2a, 0xc4, 0x9e, - 0xef, 0xb5, 0x5b, 0x01, 0x9a, 0xc0, 0x2e, 0x74, 0xcc, 0x96, - 0x78, 0x22, 0xb9, 0xe3, 0x0d, 0x57, 0x26, 0x7c, 0x92, 0xc8, - 0x53, 0x09, 0xe7, 0xbd, 0x8a, 0xd0, 0x3e, 0x64, 0xff, 0xa5, - 0x4b, 0x11, 0x60, 0x3a, 0xd4, 0x8e, 0x15, 0x4f, 0xa1, 0xfb, - 0x43, 0x19, 0xf7, 0xad, 0x36, 0x6c, 0x82, 0xd8, 0xa9, 0xf3, - 0x1d, 0x47, 0xdc, 0x86, 0x68, 0x32, 0x00, 0x5b, 0xb6, 0xed, - 0x71, 0x2a, 0xc7, 0x9c, 0xe2, 0xb9, 0x54, 0x0f, 0x93, 0xc8, - 0x25, 0x7e, 0xd9, 0x82, 0x6f, 0x34, 0xa8, 0xf3, 0x1e, 0x45, - 0x3b, 0x60, 0x8d, 0xd6, 0x4a, 0x11, 0xfc, 0xa7, 0xaf, 0xf4, - 0x19, 0x42, 0xde, 0x85, 0x68, 0x33, 0x4d, 0x16, 0xfb, 0xa0, - 0x3c, 0x67, 0x8a, 0xd1, 0x76, 0x2d, 0xc0, 0x9b, 0x07, 0x5c, - 0xb1, 0xea, 0x94, 0xcf, 0x22, 0x79, 0xe5, 0xbe, 0x53, 0x08, - 0x43, 0x18, 0xf5, 0xae, 0x32, 0x69, 0x84, 0xdf, 0xa1, 0xfa, - 0x17, 0x4c, 0xd0, 0x8b, 0x66, 0x3d, 0x9a, 0xc1, 0x2c, 0x77, - 0xeb, 0xb0, 0x5d, 0x06, 0x78, 0x23, 0xce, 0x95, 0x09, 0x52, - 0xbf, 0xe4, 0xec, 0xb7, 0x5a, 0x01, 0x9d, 0xc6, 0x2b, 0x70, - 0x0e, 0x55, 0xb8, 0xe3, 0x7f, 0x24, 0xc9, 0x92, 0x35, 0x6e, - 0x83, 0xd8, 0x44, 0x1f, 0xf2, 0xa9, 0xd7, 0x8c, 0x61, 0x3a, - 0xa6, 0xfd, 0x10, 0x4b, 0x86, 0xdd, 0x30, 0x6b, 0xf7, 0xac, - 0x41, 0x1a, 0x64, 0x3f, 0xd2, 0x89, 0x15, 0x4e, 0xa3, 0xf8, - 0x5f, 0x04, 0xe9, 0xb2, 0x2e, 0x75, 0x98, 0xc3, 0xbd, 0xe6, - 0x0b, 0x50, 0xcc, 0x97, 0x7a, 0x21, 0x29, 0x72, 0x9f, 0xc4, - 0x58, 0x03, 0xee, 0xb5, 0xcb, 0x90, 0x7d, 0x26, 0xba, 0xe1, - 0x0c, 0x57, 0xf0, 0xab, 0x46, 0x1d, 0x81, 0xda, 0x37, 0x6c, - 0x12, 0x49, 0xa4, 0xff, 0x63, 0x38, 0xd5, 0x8e, 0xc5, 0x9e, - 0x73, 0x28, 0xb4, 0xef, 0x02, 0x59, 0x27, 0x7c, 0x91, 0xca, - 0x56, 0x0d, 0xe0, 0xbb, 0x1c, 0x47, 0xaa, 0xf1, 0x6d, 0x36, - 0xdb, 0x80, 0xfe, 0xa5, 0x48, 0x13, 0x8f, 0xd4, 0x39, 0x62, - 0x6a, 0x31, 0xdc, 0x87, 0x1b, 0x40, 0xad, 0xf6, 0x88, 0xd3, - 0x3e, 0x65, 0xf9, 0xa2, 0x4f, 0x14, 0xb3, 0xe8, 0x05, 0x5e, - 0xc2, 0x99, 0x74, 0x2f, 0x51, 0x0a, 0xe7, 0xbc, 0x20, 0x7b, - 0x96, 0xcd, 0x00, 0x5c, 0xb8, 0xe4, 0x6d, 0x31, 0xd5, 0x89, - 0xda, 0x86, 0x62, 0x3e, 0xb7, 0xeb, 0x0f, 0x53, 0xa9, 0xf5, - 0x11, 0x4d, 0xc4, 0x98, 0x7c, 0x20, 0x73, 0x2f, 0xcb, 0x97, - 0x1e, 0x42, 0xa6, 0xfa, 0x4f, 0x13, 0xf7, 0xab, 0x22, 0x7e, - 0x9a, 0xc6, 0x95, 0xc9, 0x2d, 0x71, 0xf8, 0xa4, 0x40, 0x1c, - 0xe6, 0xba, 0x5e, 0x02, 0x8b, 0xd7, 0x33, 0x6f, 0x3c, 0x60, - 0x84, 0xd8, 0x51, 0x0d, 0xe9, 0xb5, 0x9e, 0xc2, 0x26, 0x7a, - 0xf3, 0xaf, 0x4b, 0x17, 0x44, 0x18, 0xfc, 0xa0, 0x29, 0x75, - 0x91, 0xcd, 0x37, 0x6b, 0x8f, 0xd3, 0x5a, 0x06, 0xe2, 0xbe, - 0xed, 0xb1, 0x55, 0x09, 0x80, 0xdc, 0x38, 0x64, 0xd1, 0x8d, - 0x69, 0x35, 0xbc, 0xe0, 0x04, 0x58, 0x0b, 0x57, 0xb3, 0xef, - 0x66, 0x3a, 0xde, 0x82, 0x78, 0x24, 0xc0, 0x9c, 0x15, 0x49, - 0xad, 0xf1, 0xa2, 0xfe, 0x1a, 0x46, 0xcf, 0x93, 0x77, 0x2b, - 0x21, 0x7d, 0x99, 0xc5, 0x4c, 0x10, 0xf4, 0xa8, 0xfb, 0xa7, - 0x43, 0x1f, 0x96, 0xca, 0x2e, 0x72, 0x88, 0xd4, 0x30, 0x6c, - 0xe5, 0xb9, 0x5d, 0x01, 0x52, 0x0e, 0xea, 0xb6, 0x3f, 0x63, - 0x87, 0xdb, 0x6e, 0x32, 0xd6, 0x8a, 0x03, 0x5f, 0xbb, 0xe7, - 0xb4, 0xe8, 0x0c, 0x50, 0xd9, 0x85, 0x61, 0x3d, 0xc7, 0x9b, - 0x7f, 0x23, 0xaa, 0xf6, 0x12, 0x4e, 0x1d, 0x41, 0xa5, 0xf9, - 0x70, 0x2c, 0xc8, 0x94, 0xbf, 0xe3, 0x07, 0x5b, 0xd2, 0x8e, - 0x6a, 0x36, 0x65, 0x39, 0xdd, 0x81, 0x08, 0x54, 0xb0, 0xec, - 0x16, 0x4a, 0xae, 0xf2, 0x7b, 0x27, 0xc3, 0x9f, 0xcc, 0x90, - 0x74, 0x28, 0xa1, 0xfd, 0x19, 0x45, 0xf0, 0xac, 0x48, 0x14, - 0x9d, 0xc1, 0x25, 0x79, 0x2a, 0x76, 0x92, 0xce, 0x47, 0x1b, - 0xff, 0xa3, 0x59, 0x05, 0xe1, 0xbd, 0x34, 0x68, 0x8c, 0xd0, - 0x83, 0xdf, 0x3b, 0x67, 0xee, 0xb2, 0x56, 0x0a, 0x00, 0x5d, - 0xba, 0xe7, 0x69, 0x34, 0xd3, 0x8e, 0xd2, 0x8f, 0x68, 0x35, - 0xbb, 0xe6, 0x01, 0x5c, 0xb9, 0xe4, 0x03, 0x5e, 0xd0, 0x8d, - 0x6a, 0x37, 0x6b, 0x36, 0xd1, 0x8c, 0x02, 0x5f, 0xb8, 0xe5, - 0x6f, 0x32, 0xd5, 0x88, 0x06, 0x5b, 0xbc, 0xe1, 0xbd, 0xe0, - 0x07, 0x5a, 0xd4, 0x89, 0x6e, 0x33, 0xd6, 0x8b, 0x6c, 0x31, - 0xbf, 0xe2, 0x05, 0x58, 0x04, 0x59, 0xbe, 0xe3, 0x6d, 0x30, - 0xd7, 0x8a, 0xde, 0x83, 0x64, 0x39, 0xb7, 0xea, 0x0d, 0x50, - 0x0c, 0x51, 0xb6, 0xeb, 0x65, 0x38, 0xdf, 0x82, 0x67, 0x3a, - 0xdd, 0x80, 0x0e, 0x53, 0xb4, 0xe9, 0xb5, 0xe8, 0x0f, 0x52, - 0xdc, 0x81, 0x66, 0x3b, 0xb1, 0xec, 0x0b, 0x56, 0xd8, 0x85, - 0x62, 0x3f, 0x63, 0x3e, 0xd9, 0x84, 0x0a, 0x57, 0xb0, 0xed, - 0x08, 0x55, 0xb2, 0xef, 0x61, 0x3c, 0xdb, 0x86, 0xda, 0x87, - 0x60, 0x3d, 0xb3, 0xee, 0x09, 0x54, 0xa1, 0xfc, 0x1b, 0x46, - 0xc8, 0x95, 0x72, 0x2f, 0x73, 0x2e, 0xc9, 0x94, 0x1a, 0x47, - 0xa0, 0xfd, 0x18, 0x45, 0xa2, 0xff, 0x71, 0x2c, 0xcb, 0x96, - 0xca, 0x97, 0x70, 0x2d, 0xa3, 0xfe, 0x19, 0x44, 0xce, 0x93, - 0x74, 0x29, 0xa7, 0xfa, 0x1d, 0x40, 0x1c, 0x41, 0xa6, 0xfb, - 0x75, 0x28, 0xcf, 0x92, 0x77, 0x2a, 0xcd, 0x90, 0x1e, 0x43, - 0xa4, 0xf9, 0xa5, 0xf8, 0x1f, 0x42, 0xcc, 0x91, 0x76, 0x2b, - 0x7f, 0x22, 0xc5, 0x98, 0x16, 0x4b, 0xac, 0xf1, 0xad, 0xf0, - 0x17, 0x4a, 0xc4, 0x99, 0x7e, 0x23, 0xc6, 0x9b, 0x7c, 0x21, - 0xaf, 0xf2, 0x15, 0x48, 0x14, 0x49, 0xae, 0xf3, 0x7d, 0x20, - 0xc7, 0x9a, 0x10, 0x4d, 0xaa, 0xf7, 0x79, 0x24, 0xc3, 0x9e, - 0xc2, 0x9f, 0x78, 0x25, 0xab, 0xf6, 0x11, 0x4c, 0xa9, 0xf4, - 0x13, 0x4e, 0xc0, 0x9d, 0x7a, 0x27, 0x7b, 0x26, 0xc1, 0x9c, - 0x12, 0x4f, 0xa8, 0xf5, 0x00, 0x5e, 0xbc, 0xe2, 0x65, 0x3b, - 0xd9, 0x87, 0xca, 0x94, 0x76, 0x28, 0xaf, 0xf1, 0x13, 0x4d, - 0x89, 0xd7, 0x35, 0x6b, 0xec, 0xb2, 0x50, 0x0e, 0x43, 0x1d, - 0xff, 0xa1, 0x26, 0x78, 0x9a, 0xc4, 0x0f, 0x51, 0xb3, 0xed, - 0x6a, 0x34, 0xd6, 0x88, 0xc5, 0x9b, 0x79, 0x27, 0xa0, 0xfe, - 0x1c, 0x42, 0x86, 0xd8, 0x3a, 0x64, 0xe3, 0xbd, 0x5f, 0x01, - 0x4c, 0x12, 0xf0, 0xae, 0x29, 0x77, 0x95, 0xcb, 0x1e, 0x40, - 0xa2, 0xfc, 0x7b, 0x25, 0xc7, 0x99, 0xd4, 0x8a, 0x68, 0x36, - 0xb1, 0xef, 0x0d, 0x53, 0x97, 0xc9, 0x2b, 0x75, 0xf2, 0xac, - 0x4e, 0x10, 0x5d, 0x03, 0xe1, 0xbf, 0x38, 0x66, 0x84, 0xda, - 0x11, 0x4f, 0xad, 0xf3, 0x74, 0x2a, 0xc8, 0x96, 0xdb, 0x85, - 0x67, 0x39, 0xbe, 0xe0, 0x02, 0x5c, 0x98, 0xc6, 0x24, 0x7a, - 0xfd, 0xa3, 0x41, 0x1f, 0x52, 0x0c, 0xee, 0xb0, 0x37, 0x69, - 0x8b, 0xd5, 0x3c, 0x62, 0x80, 0xde, 0x59, 0x07, 0xe5, 0xbb, - 0xf6, 0xa8, 0x4a, 0x14, 0x93, 0xcd, 0x2f, 0x71, 0xb5, 0xeb, - 0x09, 0x57, 0xd0, 0x8e, 0x6c, 0x32, 0x7f, 0x21, 0xc3, 0x9d, - 0x1a, 0x44, 0xa6, 0xf8, 0x33, 0x6d, 0x8f, 0xd1, 0x56, 0x08, - 0xea, 0xb4, 0xf9, 0xa7, 0x45, 0x1b, 0x9c, 0xc2, 0x20, 0x7e, - 0xba, 0xe4, 0x06, 0x58, 0xdf, 0x81, 0x63, 0x3d, 0x70, 0x2e, - 0xcc, 0x92, 0x15, 0x4b, 0xa9, 0xf7, 0x22, 0x7c, 0x9e, 0xc0, - 0x47, 0x19, 0xfb, 0xa5, 0xe8, 0xb6, 0x54, 0x0a, 0x8d, 0xd3, - 0x31, 0x6f, 0xab, 0xf5, 0x17, 0x49, 0xce, 0x90, 0x72, 0x2c, - 0x61, 0x3f, 0xdd, 0x83, 0x04, 0x5a, 0xb8, 0xe6, 0x2d, 0x73, - 0x91, 0xcf, 0x48, 0x16, 0xf4, 0xaa, 0xe7, 0xb9, 0x5b, 0x05, - 0x82, 0xdc, 0x3e, 0x60, 0xa4, 0xfa, 0x18, 0x46, 0xc1, 0x9f, - 0x7d, 0x23, 0x6e, 0x30, 0xd2, 0x8c, 0x0b, 0x55, 0xb7, 0xe9, - 0x00, 0x5f, 0xbe, 0xe1, 0x61, 0x3e, 0xdf, 0x80, 0xc2, 0x9d, - 0x7c, 0x23, 0xa3, 0xfc, 0x1d, 0x42, 0x99, 0xc6, 0x27, 0x78, - 0xf8, 0xa7, 0x46, 0x19, 0x5b, 0x04, 0xe5, 0xba, 0x3a, 0x65, - 0x84, 0xdb, 0x2f, 0x70, 0x91, 0xce, 0x4e, 0x11, 0xf0, 0xaf, - 0xed, 0xb2, 0x53, 0x0c, 0x8c, 0xd3, 0x32, 0x6d, 0xb6, 0xe9, - 0x08, 0x57, 0xd7, 0x88, 0x69, 0x36, 0x74, 0x2b, 0xca, 0x95, - 0x15, 0x4a, 0xab, 0xf4, 0x5e, 0x01, 0xe0, 0xbf, 0x3f, 0x60, - 0x81, 0xde, 0x9c, 0xc3, 0x22, 0x7d, 0xfd, 0xa2, 0x43, 0x1c, - 0xc7, 0x98, 0x79, 0x26, 0xa6, 0xf9, 0x18, 0x47, 0x05, 0x5a, - 0xbb, 0xe4, 0x64, 0x3b, 0xda, 0x85, 0x71, 0x2e, 0xcf, 0x90, - 0x10, 0x4f, 0xae, 0xf1, 0xb3, 0xec, 0x0d, 0x52, 0xd2, 0x8d, - 0x6c, 0x33, 0xe8, 0xb7, 0x56, 0x09, 0x89, 0xd6, 0x37, 0x68, - 0x2a, 0x75, 0x94, 0xcb, 0x4b, 0x14, 0xf5, 0xaa, 0xbc, 0xe3, - 0x02, 0x5d, 0xdd, 0x82, 0x63, 0x3c, 0x7e, 0x21, 0xc0, 0x9f, - 0x1f, 0x40, 0xa1, 0xfe, 0x25, 0x7a, 0x9b, 0xc4, 0x44, 0x1b, - 0xfa, 0xa5, 0xe7, 0xb8, 0x59, 0x06, 0x86, 0xd9, 0x38, 0x67, - 0x93, 0xcc, 0x2d, 0x72, 0xf2, 0xad, 0x4c, 0x13, 0x51, 0x0e, - 0xef, 0xb0, 0x30, 0x6f, 0x8e, 0xd1, 0x0a, 0x55, 0xb4, 0xeb, - 0x6b, 0x34, 0xd5, 0x8a, 0xc8, 0x97, 0x76, 0x29, 0xa9, 0xf6, - 0x17, 0x48, 0xe2, 0xbd, 0x5c, 0x03, 0x83, 0xdc, 0x3d, 0x62, - 0x20, 0x7f, 0x9e, 0xc1, 0x41, 0x1e, 0xff, 0xa0, 0x7b, 0x24, - 0xc5, 0x9a, 0x1a, 0x45, 0xa4, 0xfb, 0xb9, 0xe6, 0x07, 0x58, - 0xd8, 0x87, 0x66, 0x39, 0xcd, 0x92, 0x73, 0x2c, 0xac, 0xf3, - 0x12, 0x4d, 0x0f, 0x50, 0xb1, 0xee, 0x6e, 0x31, 0xd0, 0x8f, - 0x54, 0x0b, 0xea, 0xb5, 0x35, 0x6a, 0x8b, 0xd4, 0x96, 0xc9, - 0x28, 0x77, 0xf7, 0xa8, 0x49, 0x16, 0x00, 0x60, 0xc0, 0xa0, - 0x9d, 0xfd, 0x5d, 0x3d, 0x27, 0x47, 0xe7, 0x87, 0xba, 0xda, - 0x7a, 0x1a, 0x4e, 0x2e, 0x8e, 0xee, 0xd3, 0xb3, 0x13, 0x73, - 0x69, 0x09, 0xa9, 0xc9, 0xf4, 0x94, 0x34, 0x54, 0x9c, 0xfc, - 0x5c, 0x3c, 0x01, 0x61, 0xc1, 0xa1, 0xbb, 0xdb, 0x7b, 0x1b, - 0x26, 0x46, 0xe6, 0x86, 0xd2, 0xb2, 0x12, 0x72, 0x4f, 0x2f, - 0x8f, 0xef, 0xf5, 0x95, 0x35, 0x55, 0x68, 0x08, 0xa8, 0xc8, - 0x25, 0x45, 0xe5, 0x85, 0xb8, 0xd8, 0x78, 0x18, 0x02, 0x62, - 0xc2, 0xa2, 0x9f, 0xff, 0x5f, 0x3f, 0x6b, 0x0b, 0xab, 0xcb, - 0xf6, 0x96, 0x36, 0x56, 0x4c, 0x2c, 0x8c, 0xec, 0xd1, 0xb1, - 0x11, 0x71, 0xb9, 0xd9, 0x79, 0x19, 0x24, 0x44, 0xe4, 0x84, - 0x9e, 0xfe, 0x5e, 0x3e, 0x03, 0x63, 0xc3, 0xa3, 0xf7, 0x97, - 0x37, 0x57, 0x6a, 0x0a, 0xaa, 0xca, 0xd0, 0xb0, 0x10, 0x70, - 0x4d, 0x2d, 0x8d, 0xed, 0x4a, 0x2a, 0x8a, 0xea, 0xd7, 0xb7, - 0x17, 0x77, 0x6d, 0x0d, 0xad, 0xcd, 0xf0, 0x90, 0x30, 0x50, - 0x04, 0x64, 0xc4, 0xa4, 0x99, 0xf9, 0x59, 0x39, 0x23, 0x43, - 0xe3, 0x83, 0xbe, 0xde, 0x7e, 0x1e, 0xd6, 0xb6, 0x16, 0x76, - 0x4b, 0x2b, 0x8b, 0xeb, 0xf1, 0x91, 0x31, 0x51, 0x6c, 0x0c, - 0xac, 0xcc, 0x98, 0xf8, 0x58, 0x38, 0x05, 0x65, 0xc5, 0xa5, - 0xbf, 0xdf, 0x7f, 0x1f, 0x22, 0x42, 0xe2, 0x82, 0x6f, 0x0f, - 0xaf, 0xcf, 0xf2, 0x92, 0x32, 0x52, 0x48, 0x28, 0x88, 0xe8, - 0xd5, 0xb5, 0x15, 0x75, 0x21, 0x41, 0xe1, 0x81, 0xbc, 0xdc, - 0x7c, 0x1c, 0x06, 0x66, 0xc6, 0xa6, 0x9b, 0xfb, 0x5b, 0x3b, - 0xf3, 0x93, 0x33, 0x53, 0x6e, 0x0e, 0xae, 0xce, 0xd4, 0xb4, - 0x14, 0x74, 0x49, 0x29, 0x89, 0xe9, 0xbd, 0xdd, 0x7d, 0x1d, - 0x20, 0x40, 0xe0, 0x80, 0x9a, 0xfa, 0x5a, 0x3a, 0x07, 0x67, - 0xc7, 0xa7, 0x00, 0x61, 0xc2, 0xa3, 0x99, 0xf8, 0x5b, 0x3a, - 0x2f, 0x4e, 0xed, 0x8c, 0xb6, 0xd7, 0x74, 0x15, 0x5e, 0x3f, - 0x9c, 0xfd, 0xc7, 0xa6, 0x05, 0x64, 0x71, 0x10, 0xb3, 0xd2, - 0xe8, 0x89, 0x2a, 0x4b, 0xbc, 0xdd, 0x7e, 0x1f, 0x25, 0x44, - 0xe7, 0x86, 0x93, 0xf2, 0x51, 0x30, 0x0a, 0x6b, 0xc8, 0xa9, - 0xe2, 0x83, 0x20, 0x41, 0x7b, 0x1a, 0xb9, 0xd8, 0xcd, 0xac, - 0x0f, 0x6e, 0x54, 0x35, 0x96, 0xf7, 0x65, 0x04, 0xa7, 0xc6, - 0xfc, 0x9d, 0x3e, 0x5f, 0x4a, 0x2b, 0x88, 0xe9, 0xd3, 0xb2, - 0x11, 0x70, 0x3b, 0x5a, 0xf9, 0x98, 0xa2, 0xc3, 0x60, 0x01, - 0x14, 0x75, 0xd6, 0xb7, 0x8d, 0xec, 0x4f, 0x2e, 0xd9, 0xb8, - 0x1b, 0x7a, 0x40, 0x21, 0x82, 0xe3, 0xf6, 0x97, 0x34, 0x55, - 0x6f, 0x0e, 0xad, 0xcc, 0x87, 0xe6, 0x45, 0x24, 0x1e, 0x7f, - 0xdc, 0xbd, 0xa8, 0xc9, 0x6a, 0x0b, 0x31, 0x50, 0xf3, 0x92, - 0xca, 0xab, 0x08, 0x69, 0x53, 0x32, 0x91, 0xf0, 0xe5, 0x84, - 0x27, 0x46, 0x7c, 0x1d, 0xbe, 0xdf, 0x94, 0xf5, 0x56, 0x37, - 0x0d, 0x6c, 0xcf, 0xae, 0xbb, 0xda, 0x79, 0x18, 0x22, 0x43, - 0xe0, 0x81, 0x76, 0x17, 0xb4, 0xd5, 0xef, 0x8e, 0x2d, 0x4c, - 0x59, 0x38, 0x9b, 0xfa, 0xc0, 0xa1, 0x02, 0x63, 0x28, 0x49, - 0xea, 0x8b, 0xb1, 0xd0, 0x73, 0x12, 0x07, 0x66, 0xc5, 0xa4, - 0x9e, 0xff, 0x5c, 0x3d, 0xaf, 0xce, 0x6d, 0x0c, 0x36, 0x57, - 0xf4, 0x95, 0x80, 0xe1, 0x42, 0x23, 0x19, 0x78, 0xdb, 0xba, - 0xf1, 0x90, 0x33, 0x52, 0x68, 0x09, 0xaa, 0xcb, 0xde, 0xbf, - 0x1c, 0x7d, 0x47, 0x26, 0x85, 0xe4, 0x13, 0x72, 0xd1, 0xb0, - 0x8a, 0xeb, 0x48, 0x29, 0x3c, 0x5d, 0xfe, 0x9f, 0xa5, 0xc4, - 0x67, 0x06, 0x4d, 0x2c, 0x8f, 0xee, 0xd4, 0xb5, 0x16, 0x77, - 0x62, 0x03, 0xa0, 0xc1, 0xfb, 0x9a, 0x39, 0x58, 0x00, 0x62, - 0xc4, 0xa6, 0x95, 0xf7, 0x51, 0x33, 0x37, 0x55, 0xf3, 0x91, - 0xa2, 0xc0, 0x66, 0x04, 0x6e, 0x0c, 0xaa, 0xc8, 0xfb, 0x99, - 0x3f, 0x5d, 0x59, 0x3b, 0x9d, 0xff, 0xcc, 0xae, 0x08, 0x6a, - 0xdc, 0xbe, 0x18, 0x7a, 0x49, 0x2b, 0x8d, 0xef, 0xeb, 0x89, - 0x2f, 0x4d, 0x7e, 0x1c, 0xba, 0xd8, 0xb2, 0xd0, 0x76, 0x14, - 0x27, 0x45, 0xe3, 0x81, 0x85, 0xe7, 0x41, 0x23, 0x10, 0x72, - 0xd4, 0xb6, 0xa5, 0xc7, 0x61, 0x03, 0x30, 0x52, 0xf4, 0x96, - 0x92, 0xf0, 0x56, 0x34, 0x07, 0x65, 0xc3, 0xa1, 0xcb, 0xa9, - 0x0f, 0x6d, 0x5e, 0x3c, 0x9a, 0xf8, 0xfc, 0x9e, 0x38, 0x5a, - 0x69, 0x0b, 0xad, 0xcf, 0x79, 0x1b, 0xbd, 0xdf, 0xec, 0x8e, - 0x28, 0x4a, 0x4e, 0x2c, 0x8a, 0xe8, 0xdb, 0xb9, 0x1f, 0x7d, - 0x17, 0x75, 0xd3, 0xb1, 0x82, 0xe0, 0x46, 0x24, 0x20, 0x42, - 0xe4, 0x86, 0xb5, 0xd7, 0x71, 0x13, 0x57, 0x35, 0x93, 0xf1, - 0xc2, 0xa0, 0x06, 0x64, 0x60, 0x02, 0xa4, 0xc6, 0xf5, 0x97, - 0x31, 0x53, 0x39, 0x5b, 0xfd, 0x9f, 0xac, 0xce, 0x68, 0x0a, - 0x0e, 0x6c, 0xca, 0xa8, 0x9b, 0xf9, 0x5f, 0x3d, 0x8b, 0xe9, - 0x4f, 0x2d, 0x1e, 0x7c, 0xda, 0xb8, 0xbc, 0xde, 0x78, 0x1a, - 0x29, 0x4b, 0xed, 0x8f, 0xe5, 0x87, 0x21, 0x43, 0x70, 0x12, - 0xb4, 0xd6, 0xd2, 0xb0, 0x16, 0x74, 0x47, 0x25, 0x83, 0xe1, - 0xf2, 0x90, 0x36, 0x54, 0x67, 0x05, 0xa3, 0xc1, 0xc5, 0xa7, - 0x01, 0x63, 0x50, 0x32, 0x94, 0xf6, 0x9c, 0xfe, 0x58, 0x3a, - 0x09, 0x6b, 0xcd, 0xaf, 0xab, 0xc9, 0x6f, 0x0d, 0x3e, 0x5c, - 0xfa, 0x98, 0x2e, 0x4c, 0xea, 0x88, 0xbb, 0xd9, 0x7f, 0x1d, - 0x19, 0x7b, 0xdd, 0xbf, 0x8c, 0xee, 0x48, 0x2a, 0x40, 0x22, - 0x84, 0xe6, 0xd5, 0xb7, 0x11, 0x73, 0x77, 0x15, 0xb3, 0xd1, - 0xe2, 0x80, 0x26, 0x44, 0x00, 0x63, 0xc6, 0xa5, 0x91, 0xf2, - 0x57, 0x34, 0x3f, 0x5c, 0xf9, 0x9a, 0xae, 0xcd, 0x68, 0x0b, - 0x7e, 0x1d, 0xb8, 0xdb, 0xef, 0x8c, 0x29, 0x4a, 0x41, 0x22, - 0x87, 0xe4, 0xd0, 0xb3, 0x16, 0x75, 0xfc, 0x9f, 0x3a, 0x59, - 0x6d, 0x0e, 0xab, 0xc8, 0xc3, 0xa0, 0x05, 0x66, 0x52, 0x31, - 0x94, 0xf7, 0x82, 0xe1, 0x44, 0x27, 0x13, 0x70, 0xd5, 0xb6, - 0xbd, 0xde, 0x7b, 0x18, 0x2c, 0x4f, 0xea, 0x89, 0xe5, 0x86, - 0x23, 0x40, 0x74, 0x17, 0xb2, 0xd1, 0xda, 0xb9, 0x1c, 0x7f, - 0x4b, 0x28, 0x8d, 0xee, 0x9b, 0xf8, 0x5d, 0x3e, 0x0a, 0x69, - 0xcc, 0xaf, 0xa4, 0xc7, 0x62, 0x01, 0x35, 0x56, 0xf3, 0x90, - 0x19, 0x7a, 0xdf, 0xbc, 0x88, 0xeb, 0x4e, 0x2d, 0x26, 0x45, - 0xe0, 0x83, 0xb7, 0xd4, 0x71, 0x12, 0x67, 0x04, 0xa1, 0xc2, - 0xf6, 0x95, 0x30, 0x53, 0x58, 0x3b, 0x9e, 0xfd, 0xc9, 0xaa, - 0x0f, 0x6c, 0xd7, 0xb4, 0x11, 0x72, 0x46, 0x25, 0x80, 0xe3, - 0xe8, 0x8b, 0x2e, 0x4d, 0x79, 0x1a, 0xbf, 0xdc, 0xa9, 0xca, - 0x6f, 0x0c, 0x38, 0x5b, 0xfe, 0x9d, 0x96, 0xf5, 0x50, 0x33, - 0x07, 0x64, 0xc1, 0xa2, 0x2b, 0x48, 0xed, 0x8e, 0xba, 0xd9, - 0x7c, 0x1f, 0x14, 0x77, 0xd2, 0xb1, 0x85, 0xe6, 0x43, 0x20, - 0x55, 0x36, 0x93, 0xf0, 0xc4, 0xa7, 0x02, 0x61, 0x6a, 0x09, - 0xac, 0xcf, 0xfb, 0x98, 0x3d, 0x5e, 0x32, 0x51, 0xf4, 0x97, - 0xa3, 0xc0, 0x65, 0x06, 0x0d, 0x6e, 0xcb, 0xa8, 0x9c, 0xff, - 0x5a, 0x39, 0x4c, 0x2f, 0x8a, 0xe9, 0xdd, 0xbe, 0x1b, 0x78, - 0x73, 0x10, 0xb5, 0xd6, 0xe2, 0x81, 0x24, 0x47, 0xce, 0xad, - 0x08, 0x6b, 0x5f, 0x3c, 0x99, 0xfa, 0xf1, 0x92, 0x37, 0x54, - 0x60, 0x03, 0xa6, 0xc5, 0xb0, 0xd3, 0x76, 0x15, 0x21, 0x42, - 0xe7, 0x84, 0x8f, 0xec, 0x49, 0x2a, 0x1e, 0x7d, 0xd8, 0xbb, - 0x00, 0x64, 0xc8, 0xac, 0x8d, 0xe9, 0x45, 0x21, 0x07, 0x63, - 0xcf, 0xab, 0x8a, 0xee, 0x42, 0x26, 0x0e, 0x6a, 0xc6, 0xa2, - 0x83, 0xe7, 0x4b, 0x2f, 0x09, 0x6d, 0xc1, 0xa5, 0x84, 0xe0, - 0x4c, 0x28, 0x1c, 0x78, 0xd4, 0xb0, 0x91, 0xf5, 0x59, 0x3d, - 0x1b, 0x7f, 0xd3, 0xb7, 0x96, 0xf2, 0x5e, 0x3a, 0x12, 0x76, - 0xda, 0xbe, 0x9f, 0xfb, 0x57, 0x33, 0x15, 0x71, 0xdd, 0xb9, - 0x98, 0xfc, 0x50, 0x34, 0x38, 0x5c, 0xf0, 0x94, 0xb5, 0xd1, - 0x7d, 0x19, 0x3f, 0x5b, 0xf7, 0x93, 0xb2, 0xd6, 0x7a, 0x1e, - 0x36, 0x52, 0xfe, 0x9a, 0xbb, 0xdf, 0x73, 0x17, 0x31, 0x55, - 0xf9, 0x9d, 0xbc, 0xd8, 0x74, 0x10, 0x24, 0x40, 0xec, 0x88, - 0xa9, 0xcd, 0x61, 0x05, 0x23, 0x47, 0xeb, 0x8f, 0xae, 0xca, - 0x66, 0x02, 0x2a, 0x4e, 0xe2, 0x86, 0xa7, 0xc3, 0x6f, 0x0b, - 0x2d, 0x49, 0xe5, 0x81, 0xa0, 0xc4, 0x68, 0x0c, 0x70, 0x14, - 0xb8, 0xdc, 0xfd, 0x99, 0x35, 0x51, 0x77, 0x13, 0xbf, 0xdb, - 0xfa, 0x9e, 0x32, 0x56, 0x7e, 0x1a, 0xb6, 0xd2, 0xf3, 0x97, - 0x3b, 0x5f, 0x79, 0x1d, 0xb1, 0xd5, 0xf4, 0x90, 0x3c, 0x58, - 0x6c, 0x08, 0xa4, 0xc0, 0xe1, 0x85, 0x29, 0x4d, 0x6b, 0x0f, - 0xa3, 0xc7, 0xe6, 0x82, 0x2e, 0x4a, 0x62, 0x06, 0xaa, 0xce, - 0xef, 0x8b, 0x27, 0x43, 0x65, 0x01, 0xad, 0xc9, 0xe8, 0x8c, - 0x20, 0x44, 0x48, 0x2c, 0x80, 0xe4, 0xc5, 0xa1, 0x0d, 0x69, - 0x4f, 0x2b, 0x87, 0xe3, 0xc2, 0xa6, 0x0a, 0x6e, 0x46, 0x22, - 0x8e, 0xea, 0xcb, 0xaf, 0x03, 0x67, 0x41, 0x25, 0x89, 0xed, - 0xcc, 0xa8, 0x04, 0x60, 0x54, 0x30, 0x9c, 0xf8, 0xd9, 0xbd, - 0x11, 0x75, 0x53, 0x37, 0x9b, 0xff, 0xde, 0xba, 0x16, 0x72, - 0x5a, 0x3e, 0x92, 0xf6, 0xd7, 0xb3, 0x1f, 0x7b, 0x5d, 0x39, - 0x95, 0xf1, 0xd0, 0xb4, 0x18, 0x7c, 0x00, 0x65, 0xca, 0xaf, - 0x89, 0xec, 0x43, 0x26, 0x0f, 0x6a, 0xc5, 0xa0, 0x86, 0xe3, - 0x4c, 0x29, 0x1e, 0x7b, 0xd4, 0xb1, 0x97, 0xf2, 0x5d, 0x38, - 0x11, 0x74, 0xdb, 0xbe, 0x98, 0xfd, 0x52, 0x37, 0x3c, 0x59, - 0xf6, 0x93, 0xb5, 0xd0, 0x7f, 0x1a, 0x33, 0x56, 0xf9, 0x9c, - 0xba, 0xdf, 0x70, 0x15, 0x22, 0x47, 0xe8, 0x8d, 0xab, 0xce, - 0x61, 0x04, 0x2d, 0x48, 0xe7, 0x82, 0xa4, 0xc1, 0x6e, 0x0b, - 0x78, 0x1d, 0xb2, 0xd7, 0xf1, 0x94, 0x3b, 0x5e, 0x77, 0x12, - 0xbd, 0xd8, 0xfe, 0x9b, 0x34, 0x51, 0x66, 0x03, 0xac, 0xc9, - 0xef, 0x8a, 0x25, 0x40, 0x69, 0x0c, 0xa3, 0xc6, 0xe0, 0x85, - 0x2a, 0x4f, 0x44, 0x21, 0x8e, 0xeb, 0xcd, 0xa8, 0x07, 0x62, - 0x4b, 0x2e, 0x81, 0xe4, 0xc2, 0xa7, 0x08, 0x6d, 0x5a, 0x3f, - 0x90, 0xf5, 0xd3, 0xb6, 0x19, 0x7c, 0x55, 0x30, 0x9f, 0xfa, - 0xdc, 0xb9, 0x16, 0x73, 0xf0, 0x95, 0x3a, 0x5f, 0x79, 0x1c, - 0xb3, 0xd6, 0xff, 0x9a, 0x35, 0x50, 0x76, 0x13, 0xbc, 0xd9, - 0xee, 0x8b, 0x24, 0x41, 0x67, 0x02, 0xad, 0xc8, 0xe1, 0x84, - 0x2b, 0x4e, 0x68, 0x0d, 0xa2, 0xc7, 0xcc, 0xa9, 0x06, 0x63, - 0x45, 0x20, 0x8f, 0xea, 0xc3, 0xa6, 0x09, 0x6c, 0x4a, 0x2f, - 0x80, 0xe5, 0xd2, 0xb7, 0x18, 0x7d, 0x5b, 0x3e, 0x91, 0xf4, - 0xdd, 0xb8, 0x17, 0x72, 0x54, 0x31, 0x9e, 0xfb, 0x88, 0xed, - 0x42, 0x27, 0x01, 0x64, 0xcb, 0xae, 0x87, 0xe2, 0x4d, 0x28, - 0x0e, 0x6b, 0xc4, 0xa1, 0x96, 0xf3, 0x5c, 0x39, 0x1f, 0x7a, - 0xd5, 0xb0, 0x99, 0xfc, 0x53, 0x36, 0x10, 0x75, 0xda, 0xbf, - 0xb4, 0xd1, 0x7e, 0x1b, 0x3d, 0x58, 0xf7, 0x92, 0xbb, 0xde, - 0x71, 0x14, 0x32, 0x57, 0xf8, 0x9d, 0xaa, 0xcf, 0x60, 0x05, - 0x23, 0x46, 0xe9, 0x8c, 0xa5, 0xc0, 0x6f, 0x0a, 0x2c, 0x49, - 0xe6, 0x83, 0x00, 0x66, 0xcc, 0xaa, 0x85, 0xe3, 0x49, 0x2f, - 0x17, 0x71, 0xdb, 0xbd, 0x92, 0xf4, 0x5e, 0x38, 0x2e, 0x48, - 0xe2, 0x84, 0xab, 0xcd, 0x67, 0x01, 0x39, 0x5f, 0xf5, 0x93, - 0xbc, 0xda, 0x70, 0x16, 0x5c, 0x3a, 0x90, 0xf6, 0xd9, 0xbf, - 0x15, 0x73, 0x4b, 0x2d, 0x87, 0xe1, 0xce, 0xa8, 0x02, 0x64, - 0x72, 0x14, 0xbe, 0xd8, 0xf7, 0x91, 0x3b, 0x5d, 0x65, 0x03, - 0xa9, 0xcf, 0xe0, 0x86, 0x2c, 0x4a, 0xb8, 0xde, 0x74, 0x12, - 0x3d, 0x5b, 0xf1, 0x97, 0xaf, 0xc9, 0x63, 0x05, 0x2a, 0x4c, - 0xe6, 0x80, 0x96, 0xf0, 0x5a, 0x3c, 0x13, 0x75, 0xdf, 0xb9, - 0x81, 0xe7, 0x4d, 0x2b, 0x04, 0x62, 0xc8, 0xae, 0xe4, 0x82, - 0x28, 0x4e, 0x61, 0x07, 0xad, 0xcb, 0xf3, 0x95, 0x3f, 0x59, - 0x76, 0x10, 0xba, 0xdc, 0xca, 0xac, 0x06, 0x60, 0x4f, 0x29, - 0x83, 0xe5, 0xdd, 0xbb, 0x11, 0x77, 0x58, 0x3e, 0x94, 0xf2, - 0x6d, 0x0b, 0xa1, 0xc7, 0xe8, 0x8e, 0x24, 0x42, 0x7a, 0x1c, - 0xb6, 0xd0, 0xff, 0x99, 0x33, 0x55, 0x43, 0x25, 0x8f, 0xe9, - 0xc6, 0xa0, 0x0a, 0x6c, 0x54, 0x32, 0x98, 0xfe, 0xd1, 0xb7, - 0x1d, 0x7b, 0x31, 0x57, 0xfd, 0x9b, 0xb4, 0xd2, 0x78, 0x1e, - 0x26, 0x40, 0xea, 0x8c, 0xa3, 0xc5, 0x6f, 0x09, 0x1f, 0x79, - 0xd3, 0xb5, 0x9a, 0xfc, 0x56, 0x30, 0x08, 0x6e, 0xc4, 0xa2, - 0x8d, 0xeb, 0x41, 0x27, 0xd5, 0xb3, 0x19, 0x7f, 0x50, 0x36, - 0x9c, 0xfa, 0xc2, 0xa4, 0x0e, 0x68, 0x47, 0x21, 0x8b, 0xed, - 0xfb, 0x9d, 0x37, 0x51, 0x7e, 0x18, 0xb2, 0xd4, 0xec, 0x8a, - 0x20, 0x46, 0x69, 0x0f, 0xa5, 0xc3, 0x89, 0xef, 0x45, 0x23, - 0x0c, 0x6a, 0xc0, 0xa6, 0x9e, 0xf8, 0x52, 0x34, 0x1b, 0x7d, - 0xd7, 0xb1, 0xa7, 0xc1, 0x6b, 0x0d, 0x22, 0x44, 0xee, 0x88, - 0xb0, 0xd6, 0x7c, 0x1a, 0x35, 0x53, 0xf9, 0x9f, 0x00, 0x67, - 0xce, 0xa9, 0x81, 0xe6, 0x4f, 0x28, 0x1f, 0x78, 0xd1, 0xb6, - 0x9e, 0xf9, 0x50, 0x37, 0x3e, 0x59, 0xf0, 0x97, 0xbf, 0xd8, - 0x71, 0x16, 0x21, 0x46, 0xef, 0x88, 0xa0, 0xc7, 0x6e, 0x09, - 0x7c, 0x1b, 0xb2, 0xd5, 0xfd, 0x9a, 0x33, 0x54, 0x63, 0x04, - 0xad, 0xca, 0xe2, 0x85, 0x2c, 0x4b, 0x42, 0x25, 0x8c, 0xeb, - 0xc3, 0xa4, 0x0d, 0x6a, 0x5d, 0x3a, 0x93, 0xf4, 0xdc, 0xbb, - 0x12, 0x75, 0xf8, 0x9f, 0x36, 0x51, 0x79, 0x1e, 0xb7, 0xd0, - 0xe7, 0x80, 0x29, 0x4e, 0x66, 0x01, 0xa8, 0xcf, 0xc6, 0xa1, - 0x08, 0x6f, 0x47, 0x20, 0x89, 0xee, 0xd9, 0xbe, 0x17, 0x70, - 0x58, 0x3f, 0x96, 0xf1, 0x84, 0xe3, 0x4a, 0x2d, 0x05, 0x62, - 0xcb, 0xac, 0x9b, 0xfc, 0x55, 0x32, 0x1a, 0x7d, 0xd4, 0xb3, - 0xba, 0xdd, 0x74, 0x13, 0x3b, 0x5c, 0xf5, 0x92, 0xa5, 0xc2, - 0x6b, 0x0c, 0x24, 0x43, 0xea, 0x8d, 0xed, 0x8a, 0x23, 0x44, - 0x6c, 0x0b, 0xa2, 0xc5, 0xf2, 0x95, 0x3c, 0x5b, 0x73, 0x14, - 0xbd, 0xda, 0xd3, 0xb4, 0x1d, 0x7a, 0x52, 0x35, 0x9c, 0xfb, - 0xcc, 0xab, 0x02, 0x65, 0x4d, 0x2a, 0x83, 0xe4, 0x91, 0xf6, - 0x5f, 0x38, 0x10, 0x77, 0xde, 0xb9, 0x8e, 0xe9, 0x40, 0x27, - 0x0f, 0x68, 0xc1, 0xa6, 0xaf, 0xc8, 0x61, 0x06, 0x2e, 0x49, - 0xe0, 0x87, 0xb0, 0xd7, 0x7e, 0x19, 0x31, 0x56, 0xff, 0x98, - 0x15, 0x72, 0xdb, 0xbc, 0x94, 0xf3, 0x5a, 0x3d, 0x0a, 0x6d, - 0xc4, 0xa3, 0x8b, 0xec, 0x45, 0x22, 0x2b, 0x4c, 0xe5, 0x82, - 0xaa, 0xcd, 0x64, 0x03, 0x34, 0x53, 0xfa, 0x9d, 0xb5, 0xd2, - 0x7b, 0x1c, 0x69, 0x0e, 0xa7, 0xc0, 0xe8, 0x8f, 0x26, 0x41, - 0x76, 0x11, 0xb8, 0xdf, 0xf7, 0x90, 0x39, 0x5e, 0x57, 0x30, - 0x99, 0xfe, 0xd6, 0xb1, 0x18, 0x7f, 0x48, 0x2f, 0x86, 0xe1, - 0xc9, 0xae, 0x07, 0x60, 0x00, 0x68, 0xd0, 0xb8, 0xbd, 0xd5, - 0x6d, 0x05, 0x67, 0x0f, 0xb7, 0xdf, 0xda, 0xb2, 0x0a, 0x62, - 0xce, 0xa6, 0x1e, 0x76, 0x73, 0x1b, 0xa3, 0xcb, 0xa9, 0xc1, - 0x79, 0x11, 0x14, 0x7c, 0xc4, 0xac, 0x81, 0xe9, 0x51, 0x39, - 0x3c, 0x54, 0xec, 0x84, 0xe6, 0x8e, 0x36, 0x5e, 0x5b, 0x33, - 0x8b, 0xe3, 0x4f, 0x27, 0x9f, 0xf7, 0xf2, 0x9a, 0x22, 0x4a, - 0x28, 0x40, 0xf8, 0x90, 0x95, 0xfd, 0x45, 0x2d, 0x1f, 0x77, - 0xcf, 0xa7, 0xa2, 0xca, 0x72, 0x1a, 0x78, 0x10, 0xa8, 0xc0, - 0xc5, 0xad, 0x15, 0x7d, 0xd1, 0xb9, 0x01, 0x69, 0x6c, 0x04, - 0xbc, 0xd4, 0xb6, 0xde, 0x66, 0x0e, 0x0b, 0x63, 0xdb, 0xb3, - 0x9e, 0xf6, 0x4e, 0x26, 0x23, 0x4b, 0xf3, 0x9b, 0xf9, 0x91, - 0x29, 0x41, 0x44, 0x2c, 0x94, 0xfc, 0x50, 0x38, 0x80, 0xe8, - 0xed, 0x85, 0x3d, 0x55, 0x37, 0x5f, 0xe7, 0x8f, 0x8a, 0xe2, - 0x5a, 0x32, 0x3e, 0x56, 0xee, 0x86, 0x83, 0xeb, 0x53, 0x3b, - 0x59, 0x31, 0x89, 0xe1, 0xe4, 0x8c, 0x34, 0x5c, 0xf0, 0x98, - 0x20, 0x48, 0x4d, 0x25, 0x9d, 0xf5, 0x97, 0xff, 0x47, 0x2f, - 0x2a, 0x42, 0xfa, 0x92, 0xbf, 0xd7, 0x6f, 0x07, 0x02, 0x6a, - 0xd2, 0xba, 0xd8, 0xb0, 0x08, 0x60, 0x65, 0x0d, 0xb5, 0xdd, - 0x71, 0x19, 0xa1, 0xc9, 0xcc, 0xa4, 0x1c, 0x74, 0x16, 0x7e, - 0xc6, 0xae, 0xab, 0xc3, 0x7b, 0x13, 0x21, 0x49, 0xf1, 0x99, - 0x9c, 0xf4, 0x4c, 0x24, 0x46, 0x2e, 0x96, 0xfe, 0xfb, 0x93, - 0x2b, 0x43, 0xef, 0x87, 0x3f, 0x57, 0x52, 0x3a, 0x82, 0xea, - 0x88, 0xe0, 0x58, 0x30, 0x35, 0x5d, 0xe5, 0x8d, 0xa0, 0xc8, - 0x70, 0x18, 0x1d, 0x75, 0xcd, 0xa5, 0xc7, 0xaf, 0x17, 0x7f, - 0x7a, 0x12, 0xaa, 0xc2, 0x6e, 0x06, 0xbe, 0xd6, 0xd3, 0xbb, - 0x03, 0x6b, 0x09, 0x61, 0xd9, 0xb1, 0xb4, 0xdc, 0x64, 0x0c, - 0x00, 0x69, 0xd2, 0xbb, 0xb9, 0xd0, 0x6b, 0x02, 0x6f, 0x06, - 0xbd, 0xd4, 0xd6, 0xbf, 0x04, 0x6d, 0xde, 0xb7, 0x0c, 0x65, - 0x67, 0x0e, 0xb5, 0xdc, 0xb1, 0xd8, 0x63, 0x0a, 0x08, 0x61, - 0xda, 0xb3, 0xa1, 0xc8, 0x73, 0x1a, 0x18, 0x71, 0xca, 0xa3, - 0xce, 0xa7, 0x1c, 0x75, 0x77, 0x1e, 0xa5, 0xcc, 0x7f, 0x16, - 0xad, 0xc4, 0xc6, 0xaf, 0x14, 0x7d, 0x10, 0x79, 0xc2, 0xab, - 0xa9, 0xc0, 0x7b, 0x12, 0x5f, 0x36, 0x8d, 0xe4, 0xe6, 0x8f, - 0x34, 0x5d, 0x30, 0x59, 0xe2, 0x8b, 0x89, 0xe0, 0x5b, 0x32, - 0x81, 0xe8, 0x53, 0x3a, 0x38, 0x51, 0xea, 0x83, 0xee, 0x87, - 0x3c, 0x55, 0x57, 0x3e, 0x85, 0xec, 0xfe, 0x97, 0x2c, 0x45, - 0x47, 0x2e, 0x95, 0xfc, 0x91, 0xf8, 0x43, 0x2a, 0x28, 0x41, - 0xfa, 0x93, 0x20, 0x49, 0xf2, 0x9b, 0x99, 0xf0, 0x4b, 0x22, - 0x4f, 0x26, 0x9d, 0xf4, 0xf6, 0x9f, 0x24, 0x4d, 0xbe, 0xd7, - 0x6c, 0x05, 0x07, 0x6e, 0xd5, 0xbc, 0xd1, 0xb8, 0x03, 0x6a, - 0x68, 0x01, 0xba, 0xd3, 0x60, 0x09, 0xb2, 0xdb, 0xd9, 0xb0, - 0x0b, 0x62, 0x0f, 0x66, 0xdd, 0xb4, 0xb6, 0xdf, 0x64, 0x0d, - 0x1f, 0x76, 0xcd, 0xa4, 0xa6, 0xcf, 0x74, 0x1d, 0x70, 0x19, - 0xa2, 0xcb, 0xc9, 0xa0, 0x1b, 0x72, 0xc1, 0xa8, 0x13, 0x7a, - 0x78, 0x11, 0xaa, 0xc3, 0xae, 0xc7, 0x7c, 0x15, 0x17, 0x7e, - 0xc5, 0xac, 0xe1, 0x88, 0x33, 0x5a, 0x58, 0x31, 0x8a, 0xe3, - 0x8e, 0xe7, 0x5c, 0x35, 0x37, 0x5e, 0xe5, 0x8c, 0x3f, 0x56, - 0xed, 0x84, 0x86, 0xef, 0x54, 0x3d, 0x50, 0x39, 0x82, 0xeb, - 0xe9, 0x80, 0x3b, 0x52, 0x40, 0x29, 0x92, 0xfb, 0xf9, 0x90, - 0x2b, 0x42, 0x2f, 0x46, 0xfd, 0x94, 0x96, 0xff, 0x44, 0x2d, - 0x9e, 0xf7, 0x4c, 0x25, 0x27, 0x4e, 0xf5, 0x9c, 0xf1, 0x98, - 0x23, 0x4a, 0x48, 0x21, 0x9a, 0xf3, 0x00, 0x6a, 0xd4, 0xbe, - 0xb5, 0xdf, 0x61, 0x0b, 0x77, 0x1d, 0xa3, 0xc9, 0xc2, 0xa8, - 0x16, 0x7c, 0xee, 0x84, 0x3a, 0x50, 0x5b, 0x31, 0x8f, 0xe5, - 0x99, 0xf3, 0x4d, 0x27, 0x2c, 0x46, 0xf8, 0x92, 0xc1, 0xab, - 0x15, 0x7f, 0x74, 0x1e, 0xa0, 0xca, 0xb6, 0xdc, 0x62, 0x08, - 0x03, 0x69, 0xd7, 0xbd, 0x2f, 0x45, 0xfb, 0x91, 0x9a, 0xf0, - 0x4e, 0x24, 0x58, 0x32, 0x8c, 0xe6, 0xed, 0x87, 0x39, 0x53, - 0x9f, 0xf5, 0x4b, 0x21, 0x2a, 0x40, 0xfe, 0x94, 0xe8, 0x82, - 0x3c, 0x56, 0x5d, 0x37, 0x89, 0xe3, 0x71, 0x1b, 0xa5, 0xcf, - 0xc4, 0xae, 0x10, 0x7a, 0x06, 0x6c, 0xd2, 0xb8, 0xb3, 0xd9, - 0x67, 0x0d, 0x5e, 0x34, 0x8a, 0xe0, 0xeb, 0x81, 0x3f, 0x55, - 0x29, 0x43, 0xfd, 0x97, 0x9c, 0xf6, 0x48, 0x22, 0xb0, 0xda, - 0x64, 0x0e, 0x05, 0x6f, 0xd1, 0xbb, 0xc7, 0xad, 0x13, 0x79, - 0x72, 0x18, 0xa6, 0xcc, 0x23, 0x49, 0xf7, 0x9d, 0x96, 0xfc, - 0x42, 0x28, 0x54, 0x3e, 0x80, 0xea, 0xe1, 0x8b, 0x35, 0x5f, - 0xcd, 0xa7, 0x19, 0x73, 0x78, 0x12, 0xac, 0xc6, 0xba, 0xd0, - 0x6e, 0x04, 0x0f, 0x65, 0xdb, 0xb1, 0xe2, 0x88, 0x36, 0x5c, - 0x57, 0x3d, 0x83, 0xe9, 0x95, 0xff, 0x41, 0x2b, 0x20, 0x4a, - 0xf4, 0x9e, 0x0c, 0x66, 0xd8, 0xb2, 0xb9, 0xd3, 0x6d, 0x07, - 0x7b, 0x11, 0xaf, 0xc5, 0xce, 0xa4, 0x1a, 0x70, 0xbc, 0xd6, - 0x68, 0x02, 0x09, 0x63, 0xdd, 0xb7, 0xcb, 0xa1, 0x1f, 0x75, - 0x7e, 0x14, 0xaa, 0xc0, 0x52, 0x38, 0x86, 0xec, 0xe7, 0x8d, - 0x33, 0x59, 0x25, 0x4f, 0xf1, 0x9b, 0x90, 0xfa, 0x44, 0x2e, - 0x7d, 0x17, 0xa9, 0xc3, 0xc8, 0xa2, 0x1c, 0x76, 0x0a, 0x60, - 0xde, 0xb4, 0xbf, 0xd5, 0x6b, 0x01, 0x93, 0xf9, 0x47, 0x2d, - 0x26, 0x4c, 0xf2, 0x98, 0xe4, 0x8e, 0x30, 0x5a, 0x51, 0x3b, - 0x85, 0xef, 0x00, 0x6b, 0xd6, 0xbd, 0xb1, 0xda, 0x67, 0x0c, - 0x7f, 0x14, 0xa9, 0xc2, 0xce, 0xa5, 0x18, 0x73, 0xfe, 0x95, - 0x28, 0x43, 0x4f, 0x24, 0x99, 0xf2, 0x81, 0xea, 0x57, 0x3c, - 0x30, 0x5b, 0xe6, 0x8d, 0xe1, 0x8a, 0x37, 0x5c, 0x50, 0x3b, - 0x86, 0xed, 0x9e, 0xf5, 0x48, 0x23, 0x2f, 0x44, 0xf9, 0x92, - 0x1f, 0x74, 0xc9, 0xa2, 0xae, 0xc5, 0x78, 0x13, 0x60, 0x0b, - 0xb6, 0xdd, 0xd1, 0xba, 0x07, 0x6c, 0xdf, 0xb4, 0x09, 0x62, - 0x6e, 0x05, 0xb8, 0xd3, 0xa0, 0xcb, 0x76, 0x1d, 0x11, 0x7a, - 0xc7, 0xac, 0x21, 0x4a, 0xf7, 0x9c, 0x90, 0xfb, 0x46, 0x2d, - 0x5e, 0x35, 0x88, 0xe3, 0xef, 0x84, 0x39, 0x52, 0x3e, 0x55, - 0xe8, 0x83, 0x8f, 0xe4, 0x59, 0x32, 0x41, 0x2a, 0x97, 0xfc, - 0xf0, 0x9b, 0x26, 0x4d, 0xc0, 0xab, 0x16, 0x7d, 0x71, 0x1a, - 0xa7, 0xcc, 0xbf, 0xd4, 0x69, 0x02, 0x0e, 0x65, 0xd8, 0xb3, - 0xa3, 0xc8, 0x75, 0x1e, 0x12, 0x79, 0xc4, 0xaf, 0xdc, 0xb7, - 0x0a, 0x61, 0x6d, 0x06, 0xbb, 0xd0, 0x5d, 0x36, 0x8b, 0xe0, - 0xec, 0x87, 0x3a, 0x51, 0x22, 0x49, 0xf4, 0x9f, 0x93, 0xf8, - 0x45, 0x2e, 0x42, 0x29, 0x94, 0xff, 0xf3, 0x98, 0x25, 0x4e, - 0x3d, 0x56, 0xeb, 0x80, 0x8c, 0xe7, 0x5a, 0x31, 0xbc, 0xd7, - 0x6a, 0x01, 0x0d, 0x66, 0xdb, 0xb0, 0xc3, 0xa8, 0x15, 0x7e, - 0x72, 0x19, 0xa4, 0xcf, 0x7c, 0x17, 0xaa, 0xc1, 0xcd, 0xa6, - 0x1b, 0x70, 0x03, 0x68, 0xd5, 0xbe, 0xb2, 0xd9, 0x64, 0x0f, - 0x82, 0xe9, 0x54, 0x3f, 0x33, 0x58, 0xe5, 0x8e, 0xfd, 0x96, - 0x2b, 0x40, 0x4c, 0x27, 0x9a, 0xf1, 0x9d, 0xf6, 0x4b, 0x20, - 0x2c, 0x47, 0xfa, 0x91, 0xe2, 0x89, 0x34, 0x5f, 0x53, 0x38, - 0x85, 0xee, 0x63, 0x08, 0xb5, 0xde, 0xd2, 0xb9, 0x04, 0x6f, - 0x1c, 0x77, 0xca, 0xa1, 0xad, 0xc6, 0x7b, 0x10, 0x00, 0x6c, - 0xd8, 0xb4, 0xad, 0xc1, 0x75, 0x19, 0x47, 0x2b, 0x9f, 0xf3, - 0xea, 0x86, 0x32, 0x5e, 0x8e, 0xe2, 0x56, 0x3a, 0x23, 0x4f, - 0xfb, 0x97, 0xc9, 0xa5, 0x11, 0x7d, 0x64, 0x08, 0xbc, 0xd0, - 0x01, 0x6d, 0xd9, 0xb5, 0xac, 0xc0, 0x74, 0x18, 0x46, 0x2a, - 0x9e, 0xf2, 0xeb, 0x87, 0x33, 0x5f, 0x8f, 0xe3, 0x57, 0x3b, - 0x22, 0x4e, 0xfa, 0x96, 0xc8, 0xa4, 0x10, 0x7c, 0x65, 0x09, - 0xbd, 0xd1, 0x02, 0x6e, 0xda, 0xb6, 0xaf, 0xc3, 0x77, 0x1b, - 0x45, 0x29, 0x9d, 0xf1, 0xe8, 0x84, 0x30, 0x5c, 0x8c, 0xe0, - 0x54, 0x38, 0x21, 0x4d, 0xf9, 0x95, 0xcb, 0xa7, 0x13, 0x7f, - 0x66, 0x0a, 0xbe, 0xd2, 0x03, 0x6f, 0xdb, 0xb7, 0xae, 0xc2, - 0x76, 0x1a, 0x44, 0x28, 0x9c, 0xf0, 0xe9, 0x85, 0x31, 0x5d, - 0x8d, 0xe1, 0x55, 0x39, 0x20, 0x4c, 0xf8, 0x94, 0xca, 0xa6, - 0x12, 0x7e, 0x67, 0x0b, 0xbf, 0xd3, 0x04, 0x68, 0xdc, 0xb0, - 0xa9, 0xc5, 0x71, 0x1d, 0x43, 0x2f, 0x9b, 0xf7, 0xee, 0x82, - 0x36, 0x5a, 0x8a, 0xe6, 0x52, 0x3e, 0x27, 0x4b, 0xff, 0x93, - 0xcd, 0xa1, 0x15, 0x79, 0x60, 0x0c, 0xb8, 0xd4, 0x05, 0x69, - 0xdd, 0xb1, 0xa8, 0xc4, 0x70, 0x1c, 0x42, 0x2e, 0x9a, 0xf6, - 0xef, 0x83, 0x37, 0x5b, 0x8b, 0xe7, 0x53, 0x3f, 0x26, 0x4a, - 0xfe, 0x92, 0xcc, 0xa0, 0x14, 0x78, 0x61, 0x0d, 0xb9, 0xd5, - 0x06, 0x6a, 0xde, 0xb2, 0xab, 0xc7, 0x73, 0x1f, 0x41, 0x2d, - 0x99, 0xf5, 0xec, 0x80, 0x34, 0x58, 0x88, 0xe4, 0x50, 0x3c, - 0x25, 0x49, 0xfd, 0x91, 0xcf, 0xa3, 0x17, 0x7b, 0x62, 0x0e, - 0xba, 0xd6, 0x07, 0x6b, 0xdf, 0xb3, 0xaa, 0xc6, 0x72, 0x1e, - 0x40, 0x2c, 0x98, 0xf4, 0xed, 0x81, 0x35, 0x59, 0x89, 0xe5, - 0x51, 0x3d, 0x24, 0x48, 0xfc, 0x90, 0xce, 0xa2, 0x16, 0x7a, - 0x63, 0x0f, 0xbb, 0xd7, 0x00, 0x6d, 0xda, 0xb7, 0xa9, 0xc4, - 0x73, 0x1e, 0x4f, 0x22, 0x95, 0xf8, 0xe6, 0x8b, 0x3c, 0x51, - 0x9e, 0xf3, 0x44, 0x29, 0x37, 0x5a, 0xed, 0x80, 0xd1, 0xbc, - 0x0b, 0x66, 0x78, 0x15, 0xa2, 0xcf, 0x21, 0x4c, 0xfb, 0x96, - 0x88, 0xe5, 0x52, 0x3f, 0x6e, 0x03, 0xb4, 0xd9, 0xc7, 0xaa, - 0x1d, 0x70, 0xbf, 0xd2, 0x65, 0x08, 0x16, 0x7b, 0xcc, 0xa1, - 0xf0, 0x9d, 0x2a, 0x47, 0x59, 0x34, 0x83, 0xee, 0x42, 0x2f, - 0x98, 0xf5, 0xeb, 0x86, 0x31, 0x5c, 0x0d, 0x60, 0xd7, 0xba, - 0xa4, 0xc9, 0x7e, 0x13, 0xdc, 0xb1, 0x06, 0x6b, 0x75, 0x18, - 0xaf, 0xc2, 0x93, 0xfe, 0x49, 0x24, 0x3a, 0x57, 0xe0, 0x8d, - 0x63, 0x0e, 0xb9, 0xd4, 0xca, 0xa7, 0x10, 0x7d, 0x2c, 0x41, - 0xf6, 0x9b, 0x85, 0xe8, 0x5f, 0x32, 0xfd, 0x90, 0x27, 0x4a, - 0x54, 0x39, 0x8e, 0xe3, 0xb2, 0xdf, 0x68, 0x05, 0x1b, 0x76, - 0xc1, 0xac, 0x84, 0xe9, 0x5e, 0x33, 0x2d, 0x40, 0xf7, 0x9a, - 0xcb, 0xa6, 0x11, 0x7c, 0x62, 0x0f, 0xb8, 0xd5, 0x1a, 0x77, - 0xc0, 0xad, 0xb3, 0xde, 0x69, 0x04, 0x55, 0x38, 0x8f, 0xe2, - 0xfc, 0x91, 0x26, 0x4b, 0xa5, 0xc8, 0x7f, 0x12, 0x0c, 0x61, - 0xd6, 0xbb, 0xea, 0x87, 0x30, 0x5d, 0x43, 0x2e, 0x99, 0xf4, - 0x3b, 0x56, 0xe1, 0x8c, 0x92, 0xff, 0x48, 0x25, 0x74, 0x19, - 0xae, 0xc3, 0xdd, 0xb0, 0x07, 0x6a, 0xc6, 0xab, 0x1c, 0x71, - 0x6f, 0x02, 0xb5, 0xd8, 0x89, 0xe4, 0x53, 0x3e, 0x20, 0x4d, - 0xfa, 0x97, 0x58, 0x35, 0x82, 0xef, 0xf1, 0x9c, 0x2b, 0x46, - 0x17, 0x7a, 0xcd, 0xa0, 0xbe, 0xd3, 0x64, 0x09, 0xe7, 0x8a, - 0x3d, 0x50, 0x4e, 0x23, 0x94, 0xf9, 0xa8, 0xc5, 0x72, 0x1f, - 0x01, 0x6c, 0xdb, 0xb6, 0x79, 0x14, 0xa3, 0xce, 0xd0, 0xbd, - 0x0a, 0x67, 0x36, 0x5b, 0xec, 0x81, 0x9f, 0xf2, 0x45, 0x28, - 0x00, 0x6e, 0xdc, 0xb2, 0xa5, 0xcb, 0x79, 0x17, 0x57, 0x39, - 0x8b, 0xe5, 0xf2, 0x9c, 0x2e, 0x40, 0xae, 0xc0, 0x72, 0x1c, - 0x0b, 0x65, 0xd7, 0xb9, 0xf9, 0x97, 0x25, 0x4b, 0x5c, 0x32, - 0x80, 0xee, 0x41, 0x2f, 0x9d, 0xf3, 0xe4, 0x8a, 0x38, 0x56, - 0x16, 0x78, 0xca, 0xa4, 0xb3, 0xdd, 0x6f, 0x01, 0xef, 0x81, - 0x33, 0x5d, 0x4a, 0x24, 0x96, 0xf8, 0xb8, 0xd6, 0x64, 0x0a, - 0x1d, 0x73, 0xc1, 0xaf, 0x82, 0xec, 0x5e, 0x30, 0x27, 0x49, - 0xfb, 0x95, 0xd5, 0xbb, 0x09, 0x67, 0x70, 0x1e, 0xac, 0xc2, - 0x2c, 0x42, 0xf0, 0x9e, 0x89, 0xe7, 0x55, 0x3b, 0x7b, 0x15, - 0xa7, 0xc9, 0xde, 0xb0, 0x02, 0x6c, 0xc3, 0xad, 0x1f, 0x71, - 0x66, 0x08, 0xba, 0xd4, 0x94, 0xfa, 0x48, 0x26, 0x31, 0x5f, - 0xed, 0x83, 0x6d, 0x03, 0xb1, 0xdf, 0xc8, 0xa6, 0x14, 0x7a, - 0x3a, 0x54, 0xe6, 0x88, 0x9f, 0xf1, 0x43, 0x2d, 0x19, 0x77, - 0xc5, 0xab, 0xbc, 0xd2, 0x60, 0x0e, 0x4e, 0x20, 0x92, 0xfc, - 0xeb, 0x85, 0x37, 0x59, 0xb7, 0xd9, 0x6b, 0x05, 0x12, 0x7c, - 0xce, 0xa0, 0xe0, 0x8e, 0x3c, 0x52, 0x45, 0x2b, 0x99, 0xf7, - 0x58, 0x36, 0x84, 0xea, 0xfd, 0x93, 0x21, 0x4f, 0x0f, 0x61, - 0xd3, 0xbd, 0xaa, 0xc4, 0x76, 0x18, 0xf6, 0x98, 0x2a, 0x44, - 0x53, 0x3d, 0x8f, 0xe1, 0xa1, 0xcf, 0x7d, 0x13, 0x04, 0x6a, - 0xd8, 0xb6, 0x9b, 0xf5, 0x47, 0x29, 0x3e, 0x50, 0xe2, 0x8c, - 0xcc, 0xa2, 0x10, 0x7e, 0x69, 0x07, 0xb5, 0xdb, 0x35, 0x5b, - 0xe9, 0x87, 0x90, 0xfe, 0x4c, 0x22, 0x62, 0x0c, 0xbe, 0xd0, - 0xc7, 0xa9, 0x1b, 0x75, 0xda, 0xb4, 0x06, 0x68, 0x7f, 0x11, - 0xa3, 0xcd, 0x8d, 0xe3, 0x51, 0x3f, 0x28, 0x46, 0xf4, 0x9a, - 0x74, 0x1a, 0xa8, 0xc6, 0xd1, 0xbf, 0x0d, 0x63, 0x23, 0x4d, - 0xff, 0x91, 0x86, 0xe8, 0x5a, 0x34, 0x00, 0x6f, 0xde, 0xb1, - 0xa1, 0xce, 0x7f, 0x10, 0x5f, 0x30, 0x81, 0xee, 0xfe, 0x91, - 0x20, 0x4f, 0xbe, 0xd1, 0x60, 0x0f, 0x1f, 0x70, 0xc1, 0xae, - 0xe1, 0x8e, 0x3f, 0x50, 0x40, 0x2f, 0x9e, 0xf1, 0x61, 0x0e, - 0xbf, 0xd0, 0xc0, 0xaf, 0x1e, 0x71, 0x3e, 0x51, 0xe0, 0x8f, - 0x9f, 0xf0, 0x41, 0x2e, 0xdf, 0xb0, 0x01, 0x6e, 0x7e, 0x11, - 0xa0, 0xcf, 0x80, 0xef, 0x5e, 0x31, 0x21, 0x4e, 0xff, 0x90, - 0xc2, 0xad, 0x1c, 0x73, 0x63, 0x0c, 0xbd, 0xd2, 0x9d, 0xf2, - 0x43, 0x2c, 0x3c, 0x53, 0xe2, 0x8d, 0x7c, 0x13, 0xa2, 0xcd, - 0xdd, 0xb2, 0x03, 0x6c, 0x23, 0x4c, 0xfd, 0x92, 0x82, 0xed, - 0x5c, 0x33, 0xa3, 0xcc, 0x7d, 0x12, 0x02, 0x6d, 0xdc, 0xb3, - 0xfc, 0x93, 0x22, 0x4d, 0x5d, 0x32, 0x83, 0xec, 0x1d, 0x72, - 0xc3, 0xac, 0xbc, 0xd3, 0x62, 0x0d, 0x42, 0x2d, 0x9c, 0xf3, - 0xe3, 0x8c, 0x3d, 0x52, 0x99, 0xf6, 0x47, 0x28, 0x38, 0x57, - 0xe6, 0x89, 0xc6, 0xa9, 0x18, 0x77, 0x67, 0x08, 0xb9, 0xd6, - 0x27, 0x48, 0xf9, 0x96, 0x86, 0xe9, 0x58, 0x37, 0x78, 0x17, - 0xa6, 0xc9, 0xd9, 0xb6, 0x07, 0x68, 0xf8, 0x97, 0x26, 0x49, - 0x59, 0x36, 0x87, 0xe8, 0xa7, 0xc8, 0x79, 0x16, 0x06, 0x69, - 0xd8, 0xb7, 0x46, 0x29, 0x98, 0xf7, 0xe7, 0x88, 0x39, 0x56, - 0x19, 0x76, 0xc7, 0xa8, 0xb8, 0xd7, 0x66, 0x09, 0x5b, 0x34, - 0x85, 0xea, 0xfa, 0x95, 0x24, 0x4b, 0x04, 0x6b, 0xda, 0xb5, - 0xa5, 0xca, 0x7b, 0x14, 0xe5, 0x8a, 0x3b, 0x54, 0x44, 0x2b, - 0x9a, 0xf5, 0xba, 0xd5, 0x64, 0x0b, 0x1b, 0x74, 0xc5, 0xaa, - 0x3a, 0x55, 0xe4, 0x8b, 0x9b, 0xf4, 0x45, 0x2a, 0x65, 0x0a, - 0xbb, 0xd4, 0xc4, 0xab, 0x1a, 0x75, 0x84, 0xeb, 0x5a, 0x35, - 0x25, 0x4a, 0xfb, 0x94, 0xdb, 0xb4, 0x05, 0x6a, 0x7a, 0x15, - 0xa4, 0xcb, 0x00, 0x70, 0xe0, 0x90, 0xdd, 0xad, 0x3d, 0x4d, - 0xa7, 0xd7, 0x47, 0x37, 0x7a, 0x0a, 0x9a, 0xea, 0x53, 0x23, - 0xb3, 0xc3, 0x8e, 0xfe, 0x6e, 0x1e, 0xf4, 0x84, 0x14, 0x64, - 0x29, 0x59, 0xc9, 0xb9, 0xa6, 0xd6, 0x46, 0x36, 0x7b, 0x0b, - 0x9b, 0xeb, 0x01, 0x71, 0xe1, 0x91, 0xdc, 0xac, 0x3c, 0x4c, - 0xf5, 0x85, 0x15, 0x65, 0x28, 0x58, 0xc8, 0xb8, 0x52, 0x22, - 0xb2, 0xc2, 0x8f, 0xff, 0x6f, 0x1f, 0x51, 0x21, 0xb1, 0xc1, - 0x8c, 0xfc, 0x6c, 0x1c, 0xf6, 0x86, 0x16, 0x66, 0x2b, 0x5b, - 0xcb, 0xbb, 0x02, 0x72, 0xe2, 0x92, 0xdf, 0xaf, 0x3f, 0x4f, - 0xa5, 0xd5, 0x45, 0x35, 0x78, 0x08, 0x98, 0xe8, 0xf7, 0x87, - 0x17, 0x67, 0x2a, 0x5a, 0xca, 0xba, 0x50, 0x20, 0xb0, 0xc0, - 0x8d, 0xfd, 0x6d, 0x1d, 0xa4, 0xd4, 0x44, 0x34, 0x79, 0x09, - 0x99, 0xe9, 0x03, 0x73, 0xe3, 0x93, 0xde, 0xae, 0x3e, 0x4e, - 0xa2, 0xd2, 0x42, 0x32, 0x7f, 0x0f, 0x9f, 0xef, 0x05, 0x75, - 0xe5, 0x95, 0xd8, 0xa8, 0x38, 0x48, 0xf1, 0x81, 0x11, 0x61, - 0x2c, 0x5c, 0xcc, 0xbc, 0x56, 0x26, 0xb6, 0xc6, 0x8b, 0xfb, - 0x6b, 0x1b, 0x04, 0x74, 0xe4, 0x94, 0xd9, 0xa9, 0x39, 0x49, - 0xa3, 0xd3, 0x43, 0x33, 0x7e, 0x0e, 0x9e, 0xee, 0x57, 0x27, - 0xb7, 0xc7, 0x8a, 0xfa, 0x6a, 0x1a, 0xf0, 0x80, 0x10, 0x60, - 0x2d, 0x5d, 0xcd, 0xbd, 0xf3, 0x83, 0x13, 0x63, 0x2e, 0x5e, - 0xce, 0xbe, 0x54, 0x24, 0xb4, 0xc4, 0x89, 0xf9, 0x69, 0x19, - 0xa0, 0xd0, 0x40, 0x30, 0x7d, 0x0d, 0x9d, 0xed, 0x07, 0x77, - 0xe7, 0x97, 0xda, 0xaa, 0x3a, 0x4a, 0x55, 0x25, 0xb5, 0xc5, - 0x88, 0xf8, 0x68, 0x18, 0xf2, 0x82, 0x12, 0x62, 0x2f, 0x5f, - 0xcf, 0xbf, 0x06, 0x76, 0xe6, 0x96, 0xdb, 0xab, 0x3b, 0x4b, - 0xa1, 0xd1, 0x41, 0x31, 0x7c, 0x0c, 0x9c, 0xec, 0x00, 0x71, - 0xe2, 0x93, 0xd9, 0xa8, 0x3b, 0x4a, 0xaf, 0xde, 0x4d, 0x3c, - 0x76, 0x07, 0x94, 0xe5, 0x43, 0x32, 0xa1, 0xd0, 0x9a, 0xeb, - 0x78, 0x09, 0xec, 0x9d, 0x0e, 0x7f, 0x35, 0x44, 0xd7, 0xa6, - 0x86, 0xf7, 0x64, 0x15, 0x5f, 0x2e, 0xbd, 0xcc, 0x29, 0x58, - 0xcb, 0xba, 0xf0, 0x81, 0x12, 0x63, 0xc5, 0xb4, 0x27, 0x56, - 0x1c, 0x6d, 0xfe, 0x8f, 0x6a, 0x1b, 0x88, 0xf9, 0xb3, 0xc2, - 0x51, 0x20, 0x11, 0x60, 0xf3, 0x82, 0xc8, 0xb9, 0x2a, 0x5b, - 0xbe, 0xcf, 0x5c, 0x2d, 0x67, 0x16, 0x85, 0xf4, 0x52, 0x23, - 0xb0, 0xc1, 0x8b, 0xfa, 0x69, 0x18, 0xfd, 0x8c, 0x1f, 0x6e, - 0x24, 0x55, 0xc6, 0xb7, 0x97, 0xe6, 0x75, 0x04, 0x4e, 0x3f, - 0xac, 0xdd, 0x38, 0x49, 0xda, 0xab, 0xe1, 0x90, 0x03, 0x72, - 0xd4, 0xa5, 0x36, 0x47, 0x0d, 0x7c, 0xef, 0x9e, 0x7b, 0x0a, - 0x99, 0xe8, 0xa2, 0xd3, 0x40, 0x31, 0x22, 0x53, 0xc0, 0xb1, - 0xfb, 0x8a, 0x19, 0x68, 0x8d, 0xfc, 0x6f, 0x1e, 0x54, 0x25, - 0xb6, 0xc7, 0x61, 0x10, 0x83, 0xf2, 0xb8, 0xc9, 0x5a, 0x2b, - 0xce, 0xbf, 0x2c, 0x5d, 0x17, 0x66, 0xf5, 0x84, 0xa4, 0xd5, - 0x46, 0x37, 0x7d, 0x0c, 0x9f, 0xee, 0x0b, 0x7a, 0xe9, 0x98, - 0xd2, 0xa3, 0x30, 0x41, 0xe7, 0x96, 0x05, 0x74, 0x3e, 0x4f, - 0xdc, 0xad, 0x48, 0x39, 0xaa, 0xdb, 0x91, 0xe0, 0x73, 0x02, - 0x33, 0x42, 0xd1, 0xa0, 0xea, 0x9b, 0x08, 0x79, 0x9c, 0xed, - 0x7e, 0x0f, 0x45, 0x34, 0xa7, 0xd6, 0x70, 0x01, 0x92, 0xe3, - 0xa9, 0xd8, 0x4b, 0x3a, 0xdf, 0xae, 0x3d, 0x4c, 0x06, 0x77, - 0xe4, 0x95, 0xb5, 0xc4, 0x57, 0x26, 0x6c, 0x1d, 0x8e, 0xff, - 0x1a, 0x6b, 0xf8, 0x89, 0xc3, 0xb2, 0x21, 0x50, 0xf6, 0x87, - 0x14, 0x65, 0x2f, 0x5e, 0xcd, 0xbc, 0x59, 0x28, 0xbb, 0xca, - 0x80, 0xf1, 0x62, 0x13, 0x00, 0x72, 0xe4, 0x96, 0xd5, 0xa7, - 0x31, 0x43, 0xb7, 0xc5, 0x53, 0x21, 0x62, 0x10, 0x86, 0xf4, - 0x73, 0x01, 0x97, 0xe5, 0xa6, 0xd4, 0x42, 0x30, 0xc4, 0xb6, - 0x20, 0x52, 0x11, 0x63, 0xf5, 0x87, 0xe6, 0x94, 0x02, 0x70, - 0x33, 0x41, 0xd7, 0xa5, 0x51, 0x23, 0xb5, 0xc7, 0x84, 0xf6, - 0x60, 0x12, 0x95, 0xe7, 0x71, 0x03, 0x40, 0x32, 0xa4, 0xd6, - 0x22, 0x50, 0xc6, 0xb4, 0xf7, 0x85, 0x13, 0x61, 0xd1, 0xa3, - 0x35, 0x47, 0x04, 0x76, 0xe0, 0x92, 0x66, 0x14, 0x82, 0xf0, - 0xb3, 0xc1, 0x57, 0x25, 0xa2, 0xd0, 0x46, 0x34, 0x77, 0x05, - 0x93, 0xe1, 0x15, 0x67, 0xf1, 0x83, 0xc0, 0xb2, 0x24, 0x56, - 0x37, 0x45, 0xd3, 0xa1, 0xe2, 0x90, 0x06, 0x74, 0x80, 0xf2, - 0x64, 0x16, 0x55, 0x27, 0xb1, 0xc3, 0x44, 0x36, 0xa0, 0xd2, - 0x91, 0xe3, 0x75, 0x07, 0xf3, 0x81, 0x17, 0x65, 0x26, 0x54, - 0xc2, 0xb0, 0xbf, 0xcd, 0x5b, 0x29, 0x6a, 0x18, 0x8e, 0xfc, - 0x08, 0x7a, 0xec, 0x9e, 0xdd, 0xaf, 0x39, 0x4b, 0xcc, 0xbe, - 0x28, 0x5a, 0x19, 0x6b, 0xfd, 0x8f, 0x7b, 0x09, 0x9f, 0xed, - 0xae, 0xdc, 0x4a, 0x38, 0x59, 0x2b, 0xbd, 0xcf, 0x8c, 0xfe, - 0x68, 0x1a, 0xee, 0x9c, 0x0a, 0x78, 0x3b, 0x49, 0xdf, 0xad, - 0x2a, 0x58, 0xce, 0xbc, 0xff, 0x8d, 0x1b, 0x69, 0x9d, 0xef, - 0x79, 0x0b, 0x48, 0x3a, 0xac, 0xde, 0x6e, 0x1c, 0x8a, 0xf8, - 0xbb, 0xc9, 0x5f, 0x2d, 0xd9, 0xab, 0x3d, 0x4f, 0x0c, 0x7e, - 0xe8, 0x9a, 0x1d, 0x6f, 0xf9, 0x8b, 0xc8, 0xba, 0x2c, 0x5e, - 0xaa, 0xd8, 0x4e, 0x3c, 0x7f, 0x0d, 0x9b, 0xe9, 0x88, 0xfa, - 0x6c, 0x1e, 0x5d, 0x2f, 0xb9, 0xcb, 0x3f, 0x4d, 0xdb, 0xa9, - 0xea, 0x98, 0x0e, 0x7c, 0xfb, 0x89, 0x1f, 0x6d, 0x2e, 0x5c, - 0xca, 0xb8, 0x4c, 0x3e, 0xa8, 0xda, 0x99, 0xeb, 0x7d, 0x0f, - 0x00, 0x73, 0xe6, 0x95, 0xd1, 0xa2, 0x37, 0x44, 0xbf, 0xcc, - 0x59, 0x2a, 0x6e, 0x1d, 0x88, 0xfb, 0x63, 0x10, 0x85, 0xf6, - 0xb2, 0xc1, 0x54, 0x27, 0xdc, 0xaf, 0x3a, 0x49, 0x0d, 0x7e, - 0xeb, 0x98, 0xc6, 0xb5, 0x20, 0x53, 0x17, 0x64, 0xf1, 0x82, - 0x79, 0x0a, 0x9f, 0xec, 0xa8, 0xdb, 0x4e, 0x3d, 0xa5, 0xd6, - 0x43, 0x30, 0x74, 0x07, 0x92, 0xe1, 0x1a, 0x69, 0xfc, 0x8f, - 0xcb, 0xb8, 0x2d, 0x5e, 0x91, 0xe2, 0x77, 0x04, 0x40, 0x33, - 0xa6, 0xd5, 0x2e, 0x5d, 0xc8, 0xbb, 0xff, 0x8c, 0x19, 0x6a, - 0xf2, 0x81, 0x14, 0x67, 0x23, 0x50, 0xc5, 0xb6, 0x4d, 0x3e, - 0xab, 0xd8, 0x9c, 0xef, 0x7a, 0x09, 0x57, 0x24, 0xb1, 0xc2, - 0x86, 0xf5, 0x60, 0x13, 0xe8, 0x9b, 0x0e, 0x7d, 0x39, 0x4a, - 0xdf, 0xac, 0x34, 0x47, 0xd2, 0xa1, 0xe5, 0x96, 0x03, 0x70, - 0x8b, 0xf8, 0x6d, 0x1e, 0x5a, 0x29, 0xbc, 0xcf, 0x3f, 0x4c, - 0xd9, 0xaa, 0xee, 0x9d, 0x08, 0x7b, 0x80, 0xf3, 0x66, 0x15, - 0x51, 0x22, 0xb7, 0xc4, 0x5c, 0x2f, 0xba, 0xc9, 0x8d, 0xfe, - 0x6b, 0x18, 0xe3, 0x90, 0x05, 0x76, 0x32, 0x41, 0xd4, 0xa7, - 0xf9, 0x8a, 0x1f, 0x6c, 0x28, 0x5b, 0xce, 0xbd, 0x46, 0x35, - 0xa0, 0xd3, 0x97, 0xe4, 0x71, 0x02, 0x9a, 0xe9, 0x7c, 0x0f, - 0x4b, 0x38, 0xad, 0xde, 0x25, 0x56, 0xc3, 0xb0, 0xf4, 0x87, - 0x12, 0x61, 0xae, 0xdd, 0x48, 0x3b, 0x7f, 0x0c, 0x99, 0xea, - 0x11, 0x62, 0xf7, 0x84, 0xc0, 0xb3, 0x26, 0x55, 0xcd, 0xbe, - 0x2b, 0x58, 0x1c, 0x6f, 0xfa, 0x89, 0x72, 0x01, 0x94, 0xe7, - 0xa3, 0xd0, 0x45, 0x36, 0x68, 0x1b, 0x8e, 0xfd, 0xb9, 0xca, - 0x5f, 0x2c, 0xd7, 0xa4, 0x31, 0x42, 0x06, 0x75, 0xe0, 0x93, - 0x0b, 0x78, 0xed, 0x9e, 0xda, 0xa9, 0x3c, 0x4f, 0xb4, 0xc7, - 0x52, 0x21, 0x65, 0x16, 0x83, 0xf0, 0x00, 0x74, 0xe8, 0x9c, - 0xcd, 0xb9, 0x25, 0x51, 0x87, 0xf3, 0x6f, 0x1b, 0x4a, 0x3e, - 0xa2, 0xd6, 0x13, 0x67, 0xfb, 0x8f, 0xde, 0xaa, 0x36, 0x42, - 0x94, 0xe0, 0x7c, 0x08, 0x59, 0x2d, 0xb1, 0xc5, 0x26, 0x52, - 0xce, 0xba, 0xeb, 0x9f, 0x03, 0x77, 0xa1, 0xd5, 0x49, 0x3d, - 0x6c, 0x18, 0x84, 0xf0, 0x35, 0x41, 0xdd, 0xa9, 0xf8, 0x8c, - 0x10, 0x64, 0xb2, 0xc6, 0x5a, 0x2e, 0x7f, 0x0b, 0x97, 0xe3, - 0x4c, 0x38, 0xa4, 0xd0, 0x81, 0xf5, 0x69, 0x1d, 0xcb, 0xbf, - 0x23, 0x57, 0x06, 0x72, 0xee, 0x9a, 0x5f, 0x2b, 0xb7, 0xc3, - 0x92, 0xe6, 0x7a, 0x0e, 0xd8, 0xac, 0x30, 0x44, 0x15, 0x61, - 0xfd, 0x89, 0x6a, 0x1e, 0x82, 0xf6, 0xa7, 0xd3, 0x4f, 0x3b, - 0xed, 0x99, 0x05, 0x71, 0x20, 0x54, 0xc8, 0xbc, 0x79, 0x0d, - 0x91, 0xe5, 0xb4, 0xc0, 0x5c, 0x28, 0xfe, 0x8a, 0x16, 0x62, - 0x33, 0x47, 0xdb, 0xaf, 0x98, 0xec, 0x70, 0x04, 0x55, 0x21, - 0xbd, 0xc9, 0x1f, 0x6b, 0xf7, 0x83, 0xd2, 0xa6, 0x3a, 0x4e, - 0x8b, 0xff, 0x63, 0x17, 0x46, 0x32, 0xae, 0xda, 0x0c, 0x78, - 0xe4, 0x90, 0xc1, 0xb5, 0x29, 0x5d, 0xbe, 0xca, 0x56, 0x22, - 0x73, 0x07, 0x9b, 0xef, 0x39, 0x4d, 0xd1, 0xa5, 0xf4, 0x80, - 0x1c, 0x68, 0xad, 0xd9, 0x45, 0x31, 0x60, 0x14, 0x88, 0xfc, - 0x2a, 0x5e, 0xc2, 0xb6, 0xe7, 0x93, 0x0f, 0x7b, 0xd4, 0xa0, - 0x3c, 0x48, 0x19, 0x6d, 0xf1, 0x85, 0x53, 0x27, 0xbb, 0xcf, - 0x9e, 0xea, 0x76, 0x02, 0xc7, 0xb3, 0x2f, 0x5b, 0x0a, 0x7e, - 0xe2, 0x96, 0x40, 0x34, 0xa8, 0xdc, 0x8d, 0xf9, 0x65, 0x11, - 0xf2, 0x86, 0x1a, 0x6e, 0x3f, 0x4b, 0xd7, 0xa3, 0x75, 0x01, - 0x9d, 0xe9, 0xb8, 0xcc, 0x50, 0x24, 0xe1, 0x95, 0x09, 0x7d, - 0x2c, 0x58, 0xc4, 0xb0, 0x66, 0x12, 0x8e, 0xfa, 0xab, 0xdf, - 0x43, 0x37, 0x00, 0x75, 0xea, 0x9f, 0xc9, 0xbc, 0x23, 0x56, - 0x8f, 0xfa, 0x65, 0x10, 0x46, 0x33, 0xac, 0xd9, 0x03, 0x76, - 0xe9, 0x9c, 0xca, 0xbf, 0x20, 0x55, 0x8c, 0xf9, 0x66, 0x13, - 0x45, 0x30, 0xaf, 0xda, 0x06, 0x73, 0xec, 0x99, 0xcf, 0xba, - 0x25, 0x50, 0x89, 0xfc, 0x63, 0x16, 0x40, 0x35, 0xaa, 0xdf, - 0x05, 0x70, 0xef, 0x9a, 0xcc, 0xb9, 0x26, 0x53, 0x8a, 0xff, - 0x60, 0x15, 0x43, 0x36, 0xa9, 0xdc, 0x0c, 0x79, 0xe6, 0x93, - 0xc5, 0xb0, 0x2f, 0x5a, 0x83, 0xf6, 0x69, 0x1c, 0x4a, 0x3f, - 0xa0, 0xd5, 0x0f, 0x7a, 0xe5, 0x90, 0xc6, 0xb3, 0x2c, 0x59, - 0x80, 0xf5, 0x6a, 0x1f, 0x49, 0x3c, 0xa3, 0xd6, 0x0a, 0x7f, - 0xe0, 0x95, 0xc3, 0xb6, 0x29, 0x5c, 0x85, 0xf0, 0x6f, 0x1a, - 0x4c, 0x39, 0xa6, 0xd3, 0x09, 0x7c, 0xe3, 0x96, 0xc0, 0xb5, - 0x2a, 0x5f, 0x86, 0xf3, 0x6c, 0x19, 0x4f, 0x3a, 0xa5, 0xd0, - 0x18, 0x6d, 0xf2, 0x87, 0xd1, 0xa4, 0x3b, 0x4e, 0x97, 0xe2, - 0x7d, 0x08, 0x5e, 0x2b, 0xb4, 0xc1, 0x1b, 0x6e, 0xf1, 0x84, - 0xd2, 0xa7, 0x38, 0x4d, 0x94, 0xe1, 0x7e, 0x0b, 0x5d, 0x28, - 0xb7, 0xc2, 0x1e, 0x6b, 0xf4, 0x81, 0xd7, 0xa2, 0x3d, 0x48, - 0x91, 0xe4, 0x7b, 0x0e, 0x58, 0x2d, 0xb2, 0xc7, 0x1d, 0x68, - 0xf7, 0x82, 0xd4, 0xa1, 0x3e, 0x4b, 0x92, 0xe7, 0x78, 0x0d, - 0x5b, 0x2e, 0xb1, 0xc4, 0x14, 0x61, 0xfe, 0x8b, 0xdd, 0xa8, - 0x37, 0x42, 0x9b, 0xee, 0x71, 0x04, 0x52, 0x27, 0xb8, 0xcd, - 0x17, 0x62, 0xfd, 0x88, 0xde, 0xab, 0x34, 0x41, 0x98, 0xed, - 0x72, 0x07, 0x51, 0x24, 0xbb, 0xce, 0x12, 0x67, 0xf8, 0x8d, - 0xdb, 0xae, 0x31, 0x44, 0x9d, 0xe8, 0x77, 0x02, 0x54, 0x21, - 0xbe, 0xcb, 0x11, 0x64, 0xfb, 0x8e, 0xd8, 0xad, 0x32, 0x47, - 0x9e, 0xeb, 0x74, 0x01, 0x57, 0x22, 0xbd, 0xc8, 0x00, 0x76, - 0xec, 0x9a, 0xc5, 0xb3, 0x29, 0x5f, 0x97, 0xe1, 0x7b, 0x0d, - 0x52, 0x24, 0xbe, 0xc8, 0x33, 0x45, 0xdf, 0xa9, 0xf6, 0x80, - 0x1a, 0x6c, 0xa4, 0xd2, 0x48, 0x3e, 0x61, 0x17, 0x8d, 0xfb, - 0x66, 0x10, 0x8a, 0xfc, 0xa3, 0xd5, 0x4f, 0x39, 0xf1, 0x87, - 0x1d, 0x6b, 0x34, 0x42, 0xd8, 0xae, 0x55, 0x23, 0xb9, 0xcf, - 0x90, 0xe6, 0x7c, 0x0a, 0xc2, 0xb4, 0x2e, 0x58, 0x07, 0x71, - 0xeb, 0x9d, 0xcc, 0xba, 0x20, 0x56, 0x09, 0x7f, 0xe5, 0x93, - 0x5b, 0x2d, 0xb7, 0xc1, 0x9e, 0xe8, 0x72, 0x04, 0xff, 0x89, - 0x13, 0x65, 0x3a, 0x4c, 0xd6, 0xa0, 0x68, 0x1e, 0x84, 0xf2, - 0xad, 0xdb, 0x41, 0x37, 0xaa, 0xdc, 0x46, 0x30, 0x6f, 0x19, - 0x83, 0xf5, 0x3d, 0x4b, 0xd1, 0xa7, 0xf8, 0x8e, 0x14, 0x62, - 0x99, 0xef, 0x75, 0x03, 0x5c, 0x2a, 0xb0, 0xc6, 0x0e, 0x78, - 0xe2, 0x94, 0xcb, 0xbd, 0x27, 0x51, 0x85, 0xf3, 0x69, 0x1f, - 0x40, 0x36, 0xac, 0xda, 0x12, 0x64, 0xfe, 0x88, 0xd7, 0xa1, - 0x3b, 0x4d, 0xb6, 0xc0, 0x5a, 0x2c, 0x73, 0x05, 0x9f, 0xe9, - 0x21, 0x57, 0xcd, 0xbb, 0xe4, 0x92, 0x08, 0x7e, 0xe3, 0x95, - 0x0f, 0x79, 0x26, 0x50, 0xca, 0xbc, 0x74, 0x02, 0x98, 0xee, - 0xb1, 0xc7, 0x5d, 0x2b, 0xd0, 0xa6, 0x3c, 0x4a, 0x15, 0x63, - 0xf9, 0x8f, 0x47, 0x31, 0xab, 0xdd, 0x82, 0xf4, 0x6e, 0x18, - 0x49, 0x3f, 0xa5, 0xd3, 0x8c, 0xfa, 0x60, 0x16, 0xde, 0xa8, - 0x32, 0x44, 0x1b, 0x6d, 0xf7, 0x81, 0x7a, 0x0c, 0x96, 0xe0, - 0xbf, 0xc9, 0x53, 0x25, 0xed, 0x9b, 0x01, 0x77, 0x28, 0x5e, - 0xc4, 0xb2, 0x2f, 0x59, 0xc3, 0xb5, 0xea, 0x9c, 0x06, 0x70, - 0xb8, 0xce, 0x54, 0x22, 0x7d, 0x0b, 0x91, 0xe7, 0x1c, 0x6a, - 0xf0, 0x86, 0xd9, 0xaf, 0x35, 0x43, 0x8b, 0xfd, 0x67, 0x11, - 0x4e, 0x38, 0xa2, 0xd4, 0x00, 0x77, 0xee, 0x99, 0xc1, 0xb6, - 0x2f, 0x58, 0x9f, 0xe8, 0x71, 0x06, 0x5e, 0x29, 0xb0, 0xc7, - 0x23, 0x54, 0xcd, 0xba, 0xe2, 0x95, 0x0c, 0x7b, 0xbc, 0xcb, - 0x52, 0x25, 0x7d, 0x0a, 0x93, 0xe4, 0x46, 0x31, 0xa8, 0xdf, - 0x87, 0xf0, 0x69, 0x1e, 0xd9, 0xae, 0x37, 0x40, 0x18, 0x6f, - 0xf6, 0x81, 0x65, 0x12, 0x8b, 0xfc, 0xa4, 0xd3, 0x4a, 0x3d, - 0xfa, 0x8d, 0x14, 0x63, 0x3b, 0x4c, 0xd5, 0xa2, 0x8c, 0xfb, - 0x62, 0x15, 0x4d, 0x3a, 0xa3, 0xd4, 0x13, 0x64, 0xfd, 0x8a, - 0xd2, 0xa5, 0x3c, 0x4b, 0xaf, 0xd8, 0x41, 0x36, 0x6e, 0x19, - 0x80, 0xf7, 0x30, 0x47, 0xde, 0xa9, 0xf1, 0x86, 0x1f, 0x68, - 0xca, 0xbd, 0x24, 0x53, 0x0b, 0x7c, 0xe5, 0x92, 0x55, 0x22, - 0xbb, 0xcc, 0x94, 0xe3, 0x7a, 0x0d, 0xe9, 0x9e, 0x07, 0x70, - 0x28, 0x5f, 0xc6, 0xb1, 0x76, 0x01, 0x98, 0xef, 0xb7, 0xc0, - 0x59, 0x2e, 0x05, 0x72, 0xeb, 0x9c, 0xc4, 0xb3, 0x2a, 0x5d, - 0x9a, 0xed, 0x74, 0x03, 0x5b, 0x2c, 0xb5, 0xc2, 0x26, 0x51, - 0xc8, 0xbf, 0xe7, 0x90, 0x09, 0x7e, 0xb9, 0xce, 0x57, 0x20, - 0x78, 0x0f, 0x96, 0xe1, 0x43, 0x34, 0xad, 0xda, 0x82, 0xf5, - 0x6c, 0x1b, 0xdc, 0xab, 0x32, 0x45, 0x1d, 0x6a, 0xf3, 0x84, - 0x60, 0x17, 0x8e, 0xf9, 0xa1, 0xd6, 0x4f, 0x38, 0xff, 0x88, - 0x11, 0x66, 0x3e, 0x49, 0xd0, 0xa7, 0x89, 0xfe, 0x67, 0x10, - 0x48, 0x3f, 0xa6, 0xd1, 0x16, 0x61, 0xf8, 0x8f, 0xd7, 0xa0, - 0x39, 0x4e, 0xaa, 0xdd, 0x44, 0x33, 0x6b, 0x1c, 0x85, 0xf2, - 0x35, 0x42, 0xdb, 0xac, 0xf4, 0x83, 0x1a, 0x6d, 0xcf, 0xb8, - 0x21, 0x56, 0x0e, 0x79, 0xe0, 0x97, 0x50, 0x27, 0xbe, 0xc9, - 0x91, 0xe6, 0x7f, 0x08, 0xec, 0x9b, 0x02, 0x75, 0x2d, 0x5a, - 0xc3, 0xb4, 0x73, 0x04, 0x9d, 0xea, 0xb2, 0xc5, 0x5c, 0x2b, - 0x00, 0x78, 0xf0, 0x88, 0xfd, 0x85, 0x0d, 0x75, 0xe7, 0x9f, - 0x17, 0x6f, 0x1a, 0x62, 0xea, 0x92, 0xd3, 0xab, 0x23, 0x5b, - 0x2e, 0x56, 0xde, 0xa6, 0x34, 0x4c, 0xc4, 0xbc, 0xc9, 0xb1, - 0x39, 0x41, 0xbb, 0xc3, 0x4b, 0x33, 0x46, 0x3e, 0xb6, 0xce, - 0x5c, 0x24, 0xac, 0xd4, 0xa1, 0xd9, 0x51, 0x29, 0x68, 0x10, - 0x98, 0xe0, 0x95, 0xed, 0x65, 0x1d, 0x8f, 0xf7, 0x7f, 0x07, - 0x72, 0x0a, 0x82, 0xfa, 0x6b, 0x13, 0x9b, 0xe3, 0x96, 0xee, - 0x66, 0x1e, 0x8c, 0xf4, 0x7c, 0x04, 0x71, 0x09, 0x81, 0xf9, - 0xb8, 0xc0, 0x48, 0x30, 0x45, 0x3d, 0xb5, 0xcd, 0x5f, 0x27, - 0xaf, 0xd7, 0xa2, 0xda, 0x52, 0x2a, 0xd0, 0xa8, 0x20, 0x58, - 0x2d, 0x55, 0xdd, 0xa5, 0x37, 0x4f, 0xc7, 0xbf, 0xca, 0xb2, - 0x3a, 0x42, 0x03, 0x7b, 0xf3, 0x8b, 0xfe, 0x86, 0x0e, 0x76, - 0xe4, 0x9c, 0x14, 0x6c, 0x19, 0x61, 0xe9, 0x91, 0xd6, 0xae, - 0x26, 0x5e, 0x2b, 0x53, 0xdb, 0xa3, 0x31, 0x49, 0xc1, 0xb9, - 0xcc, 0xb4, 0x3c, 0x44, 0x05, 0x7d, 0xf5, 0x8d, 0xf8, 0x80, - 0x08, 0x70, 0xe2, 0x9a, 0x12, 0x6a, 0x1f, 0x67, 0xef, 0x97, - 0x6d, 0x15, 0x9d, 0xe5, 0x90, 0xe8, 0x60, 0x18, 0x8a, 0xf2, - 0x7a, 0x02, 0x77, 0x0f, 0x87, 0xff, 0xbe, 0xc6, 0x4e, 0x36, - 0x43, 0x3b, 0xb3, 0xcb, 0x59, 0x21, 0xa9, 0xd1, 0xa4, 0xdc, - 0x54, 0x2c, 0xbd, 0xc5, 0x4d, 0x35, 0x40, 0x38, 0xb0, 0xc8, - 0x5a, 0x22, 0xaa, 0xd2, 0xa7, 0xdf, 0x57, 0x2f, 0x6e, 0x16, - 0x9e, 0xe6, 0x93, 0xeb, 0x63, 0x1b, 0x89, 0xf1, 0x79, 0x01, - 0x74, 0x0c, 0x84, 0xfc, 0x06, 0x7e, 0xf6, 0x8e, 0xfb, 0x83, - 0x0b, 0x73, 0xe1, 0x99, 0x11, 0x69, 0x1c, 0x64, 0xec, 0x94, - 0xd5, 0xad, 0x25, 0x5d, 0x28, 0x50, 0xd8, 0xa0, 0x32, 0x4a, - 0xc2, 0xba, 0xcf, 0xb7, 0x3f, 0x47, 0x00, 0x79, 0xf2, 0x8b, - 0xf9, 0x80, 0x0b, 0x72, 0xef, 0x96, 0x1d, 0x64, 0x16, 0x6f, - 0xe4, 0x9d, 0xc3, 0xba, 0x31, 0x48, 0x3a, 0x43, 0xc8, 0xb1, - 0x2c, 0x55, 0xde, 0xa7, 0xd5, 0xac, 0x27, 0x5e, 0x9b, 0xe2, - 0x69, 0x10, 0x62, 0x1b, 0x90, 0xe9, 0x74, 0x0d, 0x86, 0xff, - 0x8d, 0xf4, 0x7f, 0x06, 0x58, 0x21, 0xaa, 0xd3, 0xa1, 0xd8, - 0x53, 0x2a, 0xb7, 0xce, 0x45, 0x3c, 0x4e, 0x37, 0xbc, 0xc5, - 0x2b, 0x52, 0xd9, 0xa0, 0xd2, 0xab, 0x20, 0x59, 0xc4, 0xbd, - 0x36, 0x4f, 0x3d, 0x44, 0xcf, 0xb6, 0xe8, 0x91, 0x1a, 0x63, - 0x11, 0x68, 0xe3, 0x9a, 0x07, 0x7e, 0xf5, 0x8c, 0xfe, 0x87, - 0x0c, 0x75, 0xb0, 0xc9, 0x42, 0x3b, 0x49, 0x30, 0xbb, 0xc2, - 0x5f, 0x26, 0xad, 0xd4, 0xa6, 0xdf, 0x54, 0x2d, 0x73, 0x0a, - 0x81, 0xf8, 0x8a, 0xf3, 0x78, 0x01, 0x9c, 0xe5, 0x6e, 0x17, - 0x65, 0x1c, 0x97, 0xee, 0x56, 0x2f, 0xa4, 0xdd, 0xaf, 0xd6, - 0x5d, 0x24, 0xb9, 0xc0, 0x4b, 0x32, 0x40, 0x39, 0xb2, 0xcb, - 0x95, 0xec, 0x67, 0x1e, 0x6c, 0x15, 0x9e, 0xe7, 0x7a, 0x03, - 0x88, 0xf1, 0x83, 0xfa, 0x71, 0x08, 0xcd, 0xb4, 0x3f, 0x46, - 0x34, 0x4d, 0xc6, 0xbf, 0x22, 0x5b, 0xd0, 0xa9, 0xdb, 0xa2, - 0x29, 0x50, 0x0e, 0x77, 0xfc, 0x85, 0xf7, 0x8e, 0x05, 0x7c, - 0xe1, 0x98, 0x13, 0x6a, 0x18, 0x61, 0xea, 0x93, 0x7d, 0x04, - 0x8f, 0xf6, 0x84, 0xfd, 0x76, 0x0f, 0x92, 0xeb, 0x60, 0x19, - 0x6b, 0x12, 0x99, 0xe0, 0xbe, 0xc7, 0x4c, 0x35, 0x47, 0x3e, - 0xb5, 0xcc, 0x51, 0x28, 0xa3, 0xda, 0xa8, 0xd1, 0x5a, 0x23, - 0xe6, 0x9f, 0x14, 0x6d, 0x1f, 0x66, 0xed, 0x94, 0x09, 0x70, - 0xfb, 0x82, 0xf0, 0x89, 0x02, 0x7b, 0x25, 0x5c, 0xd7, 0xae, - 0xdc, 0xa5, 0x2e, 0x57, 0xca, 0xb3, 0x38, 0x41, 0x33, 0x4a, - 0xc1, 0xb8, 0x00, 0x7a, 0xf4, 0x8e, 0xf5, 0x8f, 0x01, 0x7b, - 0xf7, 0x8d, 0x03, 0x79, 0x02, 0x78, 0xf6, 0x8c, 0xf3, 0x89, - 0x07, 0x7d, 0x06, 0x7c, 0xf2, 0x88, 0x04, 0x7e, 0xf0, 0x8a, - 0xf1, 0x8b, 0x05, 0x7f, 0xfb, 0x81, 0x0f, 0x75, 0x0e, 0x74, - 0xfa, 0x80, 0x0c, 0x76, 0xf8, 0x82, 0xf9, 0x83, 0x0d, 0x77, - 0x08, 0x72, 0xfc, 0x86, 0xfd, 0x87, 0x09, 0x73, 0xff, 0x85, - 0x0b, 0x71, 0x0a, 0x70, 0xfe, 0x84, 0xeb, 0x91, 0x1f, 0x65, - 0x1e, 0x64, 0xea, 0x90, 0x1c, 0x66, 0xe8, 0x92, 0xe9, 0x93, - 0x1d, 0x67, 0x18, 0x62, 0xec, 0x96, 0xed, 0x97, 0x19, 0x63, - 0xef, 0x95, 0x1b, 0x61, 0x1a, 0x60, 0xee, 0x94, 0x10, 0x6a, - 0xe4, 0x9e, 0xe5, 0x9f, 0x11, 0x6b, 0xe7, 0x9d, 0x13, 0x69, - 0x12, 0x68, 0xe6, 0x9c, 0xe3, 0x99, 0x17, 0x6d, 0x16, 0x6c, - 0xe2, 0x98, 0x14, 0x6e, 0xe0, 0x9a, 0xe1, 0x9b, 0x15, 0x6f, - 0xcb, 0xb1, 0x3f, 0x45, 0x3e, 0x44, 0xca, 0xb0, 0x3c, 0x46, - 0xc8, 0xb2, 0xc9, 0xb3, 0x3d, 0x47, 0x38, 0x42, 0xcc, 0xb6, - 0xcd, 0xb7, 0x39, 0x43, 0xcf, 0xb5, 0x3b, 0x41, 0x3a, 0x40, - 0xce, 0xb4, 0x30, 0x4a, 0xc4, 0xbe, 0xc5, 0xbf, 0x31, 0x4b, - 0xc7, 0xbd, 0x33, 0x49, 0x32, 0x48, 0xc6, 0xbc, 0xc3, 0xb9, - 0x37, 0x4d, 0x36, 0x4c, 0xc2, 0xb8, 0x34, 0x4e, 0xc0, 0xba, - 0xc1, 0xbb, 0x35, 0x4f, 0x20, 0x5a, 0xd4, 0xae, 0xd5, 0xaf, - 0x21, 0x5b, 0xd7, 0xad, 0x23, 0x59, 0x22, 0x58, 0xd6, 0xac, - 0xd3, 0xa9, 0x27, 0x5d, 0x26, 0x5c, 0xd2, 0xa8, 0x24, 0x5e, - 0xd0, 0xaa, 0xd1, 0xab, 0x25, 0x5f, 0xdb, 0xa1, 0x2f, 0x55, - 0x2e, 0x54, 0xda, 0xa0, 0x2c, 0x56, 0xd8, 0xa2, 0xd9, 0xa3, - 0x2d, 0x57, 0x28, 0x52, 0xdc, 0xa6, 0xdd, 0xa7, 0x29, 0x53, - 0xdf, 0xa5, 0x2b, 0x51, 0x2a, 0x50, 0xde, 0xa4, 0x00, 0x7b, - 0xf6, 0x8d, 0xf1, 0x8a, 0x07, 0x7c, 0xff, 0x84, 0x09, 0x72, - 0x0e, 0x75, 0xf8, 0x83, 0xe3, 0x98, 0x15, 0x6e, 0x12, 0x69, - 0xe4, 0x9f, 0x1c, 0x67, 0xea, 0x91, 0xed, 0x96, 0x1b, 0x60, - 0xdb, 0xa0, 0x2d, 0x56, 0x2a, 0x51, 0xdc, 0xa7, 0x24, 0x5f, - 0xd2, 0xa9, 0xd5, 0xae, 0x23, 0x58, 0x38, 0x43, 0xce, 0xb5, - 0xc9, 0xb2, 0x3f, 0x44, 0xc7, 0xbc, 0x31, 0x4a, 0x36, 0x4d, - 0xc0, 0xbb, 0xab, 0xd0, 0x5d, 0x26, 0x5a, 0x21, 0xac, 0xd7, - 0x54, 0x2f, 0xa2, 0xd9, 0xa5, 0xde, 0x53, 0x28, 0x48, 0x33, - 0xbe, 0xc5, 0xb9, 0xc2, 0x4f, 0x34, 0xb7, 0xcc, 0x41, 0x3a, - 0x46, 0x3d, 0xb0, 0xcb, 0x70, 0x0b, 0x86, 0xfd, 0x81, 0xfa, - 0x77, 0x0c, 0x8f, 0xf4, 0x79, 0x02, 0x7e, 0x05, 0x88, 0xf3, - 0x93, 0xe8, 0x65, 0x1e, 0x62, 0x19, 0x94, 0xef, 0x6c, 0x17, - 0x9a, 0xe1, 0x9d, 0xe6, 0x6b, 0x10, 0x4b, 0x30, 0xbd, 0xc6, - 0xba, 0xc1, 0x4c, 0x37, 0xb4, 0xcf, 0x42, 0x39, 0x45, 0x3e, - 0xb3, 0xc8, 0xa8, 0xd3, 0x5e, 0x25, 0x59, 0x22, 0xaf, 0xd4, - 0x57, 0x2c, 0xa1, 0xda, 0xa6, 0xdd, 0x50, 0x2b, 0x90, 0xeb, - 0x66, 0x1d, 0x61, 0x1a, 0x97, 0xec, 0x6f, 0x14, 0x99, 0xe2, - 0x9e, 0xe5, 0x68, 0x13, 0x73, 0x08, 0x85, 0xfe, 0x82, 0xf9, - 0x74, 0x0f, 0x8c, 0xf7, 0x7a, 0x01, 0x7d, 0x06, 0x8b, 0xf0, - 0xe0, 0x9b, 0x16, 0x6d, 0x11, 0x6a, 0xe7, 0x9c, 0x1f, 0x64, - 0xe9, 0x92, 0xee, 0x95, 0x18, 0x63, 0x03, 0x78, 0xf5, 0x8e, - 0xf2, 0x89, 0x04, 0x7f, 0xfc, 0x87, 0x0a, 0x71, 0x0d, 0x76, - 0xfb, 0x80, 0x3b, 0x40, 0xcd, 0xb6, 0xca, 0xb1, 0x3c, 0x47, - 0xc4, 0xbf, 0x32, 0x49, 0x35, 0x4e, 0xc3, 0xb8, 0xd8, 0xa3, - 0x2e, 0x55, 0x29, 0x52, 0xdf, 0xa4, 0x27, 0x5c, 0xd1, 0xaa, - 0xd6, 0xad, 0x20, 0x5b, 0x00, 0x7c, 0xf8, 0x84, 0xed, 0x91, - 0x15, 0x69, 0xc7, 0xbb, 0x3f, 0x43, 0x2a, 0x56, 0xd2, 0xae, - 0x93, 0xef, 0x6b, 0x17, 0x7e, 0x02, 0x86, 0xfa, 0x54, 0x28, - 0xac, 0xd0, 0xb9, 0xc5, 0x41, 0x3d, 0x3b, 0x47, 0xc3, 0xbf, - 0xd6, 0xaa, 0x2e, 0x52, 0xfc, 0x80, 0x04, 0x78, 0x11, 0x6d, - 0xe9, 0x95, 0xa8, 0xd4, 0x50, 0x2c, 0x45, 0x39, 0xbd, 0xc1, - 0x6f, 0x13, 0x97, 0xeb, 0x82, 0xfe, 0x7a, 0x06, 0x76, 0x0a, - 0x8e, 0xf2, 0x9b, 0xe7, 0x63, 0x1f, 0xb1, 0xcd, 0x49, 0x35, - 0x5c, 0x20, 0xa4, 0xd8, 0xe5, 0x99, 0x1d, 0x61, 0x08, 0x74, - 0xf0, 0x8c, 0x22, 0x5e, 0xda, 0xa6, 0xcf, 0xb3, 0x37, 0x4b, - 0x4d, 0x31, 0xb5, 0xc9, 0xa0, 0xdc, 0x58, 0x24, 0x8a, 0xf6, - 0x72, 0x0e, 0x67, 0x1b, 0x9f, 0xe3, 0xde, 0xa2, 0x26, 0x5a, - 0x33, 0x4f, 0xcb, 0xb7, 0x19, 0x65, 0xe1, 0x9d, 0xf4, 0x88, - 0x0c, 0x70, 0xec, 0x90, 0x14, 0x68, 0x01, 0x7d, 0xf9, 0x85, - 0x2b, 0x57, 0xd3, 0xaf, 0xc6, 0xba, 0x3e, 0x42, 0x7f, 0x03, - 0x87, 0xfb, 0x92, 0xee, 0x6a, 0x16, 0xb8, 0xc4, 0x40, 0x3c, - 0x55, 0x29, 0xad, 0xd1, 0xd7, 0xab, 0x2f, 0x53, 0x3a, 0x46, - 0xc2, 0xbe, 0x10, 0x6c, 0xe8, 0x94, 0xfd, 0x81, 0x05, 0x79, - 0x44, 0x38, 0xbc, 0xc0, 0xa9, 0xd5, 0x51, 0x2d, 0x83, 0xff, - 0x7b, 0x07, 0x6e, 0x12, 0x96, 0xea, 0x9a, 0xe6, 0x62, 0x1e, - 0x77, 0x0b, 0x8f, 0xf3, 0x5d, 0x21, 0xa5, 0xd9, 0xb0, 0xcc, - 0x48, 0x34, 0x09, 0x75, 0xf1, 0x8d, 0xe4, 0x98, 0x1c, 0x60, - 0xce, 0xb2, 0x36, 0x4a, 0x23, 0x5f, 0xdb, 0xa7, 0xa1, 0xdd, - 0x59, 0x25, 0x4c, 0x30, 0xb4, 0xc8, 0x66, 0x1a, 0x9e, 0xe2, - 0x8b, 0xf7, 0x73, 0x0f, 0x32, 0x4e, 0xca, 0xb6, 0xdf, 0xa3, - 0x27, 0x5b, 0xf5, 0x89, 0x0d, 0x71, 0x18, 0x64, 0xe0, 0x9c, - 0x00, 0x7d, 0xfa, 0x87, 0xe9, 0x94, 0x13, 0x6e, 0xcf, 0xb2, - 0x35, 0x48, 0x26, 0x5b, 0xdc, 0xa1, 0x83, 0xfe, 0x79, 0x04, - 0x6a, 0x17, 0x90, 0xed, 0x4c, 0x31, 0xb6, 0xcb, 0xa5, 0xd8, - 0x5f, 0x22, 0x1b, 0x66, 0xe1, 0x9c, 0xf2, 0x8f, 0x08, 0x75, - 0xd4, 0xa9, 0x2e, 0x53, 0x3d, 0x40, 0xc7, 0xba, 0x98, 0xe5, - 0x62, 0x1f, 0x71, 0x0c, 0x8b, 0xf6, 0x57, 0x2a, 0xad, 0xd0, - 0xbe, 0xc3, 0x44, 0x39, 0x36, 0x4b, 0xcc, 0xb1, 0xdf, 0xa2, - 0x25, 0x58, 0xf9, 0x84, 0x03, 0x7e, 0x10, 0x6d, 0xea, 0x97, - 0xb5, 0xc8, 0x4f, 0x32, 0x5c, 0x21, 0xa6, 0xdb, 0x7a, 0x07, - 0x80, 0xfd, 0x93, 0xee, 0x69, 0x14, 0x2d, 0x50, 0xd7, 0xaa, - 0xc4, 0xb9, 0x3e, 0x43, 0xe2, 0x9f, 0x18, 0x65, 0x0b, 0x76, - 0xf1, 0x8c, 0xae, 0xd3, 0x54, 0x29, 0x47, 0x3a, 0xbd, 0xc0, - 0x61, 0x1c, 0x9b, 0xe6, 0x88, 0xf5, 0x72, 0x0f, 0x6c, 0x11, - 0x96, 0xeb, 0x85, 0xf8, 0x7f, 0x02, 0xa3, 0xde, 0x59, 0x24, - 0x4a, 0x37, 0xb0, 0xcd, 0xef, 0x92, 0x15, 0x68, 0x06, 0x7b, - 0xfc, 0x81, 0x20, 0x5d, 0xda, 0xa7, 0xc9, 0xb4, 0x33, 0x4e, - 0x77, 0x0a, 0x8d, 0xf0, 0x9e, 0xe3, 0x64, 0x19, 0xb8, 0xc5, - 0x42, 0x3f, 0x51, 0x2c, 0xab, 0xd6, 0xf4, 0x89, 0x0e, 0x73, - 0x1d, 0x60, 0xe7, 0x9a, 0x3b, 0x46, 0xc1, 0xbc, 0xd2, 0xaf, - 0x28, 0x55, 0x5a, 0x27, 0xa0, 0xdd, 0xb3, 0xce, 0x49, 0x34, - 0x95, 0xe8, 0x6f, 0x12, 0x7c, 0x01, 0x86, 0xfb, 0xd9, 0xa4, - 0x23, 0x5e, 0x30, 0x4d, 0xca, 0xb7, 0x16, 0x6b, 0xec, 0x91, - 0xff, 0x82, 0x05, 0x78, 0x41, 0x3c, 0xbb, 0xc6, 0xa8, 0xd5, - 0x52, 0x2f, 0x8e, 0xf3, 0x74, 0x09, 0x67, 0x1a, 0x9d, 0xe0, - 0xc2, 0xbf, 0x38, 0x45, 0x2b, 0x56, 0xd1, 0xac, 0x0d, 0x70, - 0xf7, 0x8a, 0xe4, 0x99, 0x1e, 0x63, 0x00, 0x7e, 0xfc, 0x82, - 0xe5, 0x9b, 0x19, 0x67, 0xd7, 0xa9, 0x2b, 0x55, 0x32, 0x4c, - 0xce, 0xb0, 0xb3, 0xcd, 0x4f, 0x31, 0x56, 0x28, 0xaa, 0xd4, - 0x64, 0x1a, 0x98, 0xe6, 0x81, 0xff, 0x7d, 0x03, 0x7b, 0x05, - 0x87, 0xf9, 0x9e, 0xe0, 0x62, 0x1c, 0xac, 0xd2, 0x50, 0x2e, - 0x49, 0x37, 0xb5, 0xcb, 0xc8, 0xb6, 0x34, 0x4a, 0x2d, 0x53, - 0xd1, 0xaf, 0x1f, 0x61, 0xe3, 0x9d, 0xfa, 0x84, 0x06, 0x78, - 0xf6, 0x88, 0x0a, 0x74, 0x13, 0x6d, 0xef, 0x91, 0x21, 0x5f, - 0xdd, 0xa3, 0xc4, 0xba, 0x38, 0x46, 0x45, 0x3b, 0xb9, 0xc7, - 0xa0, 0xde, 0x5c, 0x22, 0x92, 0xec, 0x6e, 0x10, 0x77, 0x09, - 0x8b, 0xf5, 0x8d, 0xf3, 0x71, 0x0f, 0x68, 0x16, 0x94, 0xea, - 0x5a, 0x24, 0xa6, 0xd8, 0xbf, 0xc1, 0x43, 0x3d, 0x3e, 0x40, - 0xc2, 0xbc, 0xdb, 0xa5, 0x27, 0x59, 0xe9, 0x97, 0x15, 0x6b, - 0x0c, 0x72, 0xf0, 0x8e, 0xf1, 0x8f, 0x0d, 0x73, 0x14, 0x6a, - 0xe8, 0x96, 0x26, 0x58, 0xda, 0xa4, 0xc3, 0xbd, 0x3f, 0x41, - 0x42, 0x3c, 0xbe, 0xc0, 0xa7, 0xd9, 0x5b, 0x25, 0x95, 0xeb, - 0x69, 0x17, 0x70, 0x0e, 0x8c, 0xf2, 0x8a, 0xf4, 0x76, 0x08, - 0x6f, 0x11, 0x93, 0xed, 0x5d, 0x23, 0xa1, 0xdf, 0xb8, 0xc6, - 0x44, 0x3a, 0x39, 0x47, 0xc5, 0xbb, 0xdc, 0xa2, 0x20, 0x5e, - 0xee, 0x90, 0x12, 0x6c, 0x0b, 0x75, 0xf7, 0x89, 0x07, 0x79, - 0xfb, 0x85, 0xe2, 0x9c, 0x1e, 0x60, 0xd0, 0xae, 0x2c, 0x52, - 0x35, 0x4b, 0xc9, 0xb7, 0xb4, 0xca, 0x48, 0x36, 0x51, 0x2f, - 0xad, 0xd3, 0x63, 0x1d, 0x9f, 0xe1, 0x86, 0xf8, 0x7a, 0x04, - 0x7c, 0x02, 0x80, 0xfe, 0x99, 0xe7, 0x65, 0x1b, 0xab, 0xd5, - 0x57, 0x29, 0x4e, 0x30, 0xb2, 0xcc, 0xcf, 0xb1, 0x33, 0x4d, - 0x2a, 0x54, 0xd6, 0xa8, 0x18, 0x66, 0xe4, 0x9a, 0xfd, 0x83, - 0x01, 0x7f, 0x00, 0x7f, 0xfe, 0x81, 0xe1, 0x9e, 0x1f, 0x60, - 0xdf, 0xa0, 0x21, 0x5e, 0x3e, 0x41, 0xc0, 0xbf, 0xa3, 0xdc, - 0x5d, 0x22, 0x42, 0x3d, 0xbc, 0xc3, 0x7c, 0x03, 0x82, 0xfd, - 0x9d, 0xe2, 0x63, 0x1c, 0x5b, 0x24, 0xa5, 0xda, 0xba, 0xc5, - 0x44, 0x3b, 0x84, 0xfb, 0x7a, 0x05, 0x65, 0x1a, 0x9b, 0xe4, - 0xf8, 0x87, 0x06, 0x79, 0x19, 0x66, 0xe7, 0x98, 0x27, 0x58, - 0xd9, 0xa6, 0xc6, 0xb9, 0x38, 0x47, 0xb6, 0xc9, 0x48, 0x37, - 0x57, 0x28, 0xa9, 0xd6, 0x69, 0x16, 0x97, 0xe8, 0x88, 0xf7, - 0x76, 0x09, 0x15, 0x6a, 0xeb, 0x94, 0xf4, 0x8b, 0x0a, 0x75, - 0xca, 0xb5, 0x34, 0x4b, 0x2b, 0x54, 0xd5, 0xaa, 0xed, 0x92, - 0x13, 0x6c, 0x0c, 0x73, 0xf2, 0x8d, 0x32, 0x4d, 0xcc, 0xb3, - 0xd3, 0xac, 0x2d, 0x52, 0x4e, 0x31, 0xb0, 0xcf, 0xaf, 0xd0, - 0x51, 0x2e, 0x91, 0xee, 0x6f, 0x10, 0x70, 0x0f, 0x8e, 0xf1, - 0x71, 0x0e, 0x8f, 0xf0, 0x90, 0xef, 0x6e, 0x11, 0xae, 0xd1, - 0x50, 0x2f, 0x4f, 0x30, 0xb1, 0xce, 0xd2, 0xad, 0x2c, 0x53, - 0x33, 0x4c, 0xcd, 0xb2, 0x0d, 0x72, 0xf3, 0x8c, 0xec, 0x93, - 0x12, 0x6d, 0x2a, 0x55, 0xd4, 0xab, 0xcb, 0xb4, 0x35, 0x4a, - 0xf5, 0x8a, 0x0b, 0x74, 0x14, 0x6b, 0xea, 0x95, 0x89, 0xf6, - 0x77, 0x08, 0x68, 0x17, 0x96, 0xe9, 0x56, 0x29, 0xa8, 0xd7, - 0xb7, 0xc8, 0x49, 0x36, 0xc7, 0xb8, 0x39, 0x46, 0x26, 0x59, - 0xd8, 0xa7, 0x18, 0x67, 0xe6, 0x99, 0xf9, 0x86, 0x07, 0x78, - 0x64, 0x1b, 0x9a, 0xe5, 0x85, 0xfa, 0x7b, 0x04, 0xbb, 0xc4, - 0x45, 0x3a, 0x5a, 0x25, 0xa4, 0xdb, 0x9c, 0xe3, 0x62, 0x1d, - 0x7d, 0x02, 0x83, 0xfc, 0x43, 0x3c, 0xbd, 0xc2, 0xa2, 0xdd, - 0x5c, 0x23, 0x3f, 0x40, 0xc1, 0xbe, 0xde, 0xa1, 0x20, 0x5f, - 0xe0, 0x9f, 0x1e, 0x61, 0x01, 0x7e, 0xff, 0x80, 0x00, 0x80, - 0x1d, 0x9d, 0x3a, 0xba, 0x27, 0xa7, 0x74, 0xf4, 0x69, 0xe9, - 0x4e, 0xce, 0x53, 0xd3, 0xe8, 0x68, 0xf5, 0x75, 0xd2, 0x52, - 0xcf, 0x4f, 0x9c, 0x1c, 0x81, 0x01, 0xa6, 0x26, 0xbb, 0x3b, - 0xcd, 0x4d, 0xd0, 0x50, 0xf7, 0x77, 0xea, 0x6a, 0xb9, 0x39, - 0xa4, 0x24, 0x83, 0x03, 0x9e, 0x1e, 0x25, 0xa5, 0x38, 0xb8, - 0x1f, 0x9f, 0x02, 0x82, 0x51, 0xd1, 0x4c, 0xcc, 0x6b, 0xeb, - 0x76, 0xf6, 0x87, 0x07, 0x9a, 0x1a, 0xbd, 0x3d, 0xa0, 0x20, - 0xf3, 0x73, 0xee, 0x6e, 0xc9, 0x49, 0xd4, 0x54, 0x6f, 0xef, - 0x72, 0xf2, 0x55, 0xd5, 0x48, 0xc8, 0x1b, 0x9b, 0x06, 0x86, - 0x21, 0xa1, 0x3c, 0xbc, 0x4a, 0xca, 0x57, 0xd7, 0x70, 0xf0, - 0x6d, 0xed, 0x3e, 0xbe, 0x23, 0xa3, 0x04, 0x84, 0x19, 0x99, - 0xa2, 0x22, 0xbf, 0x3f, 0x98, 0x18, 0x85, 0x05, 0xd6, 0x56, - 0xcb, 0x4b, 0xec, 0x6c, 0xf1, 0x71, 0x13, 0x93, 0x0e, 0x8e, - 0x29, 0xa9, 0x34, 0xb4, 0x67, 0xe7, 0x7a, 0xfa, 0x5d, 0xdd, - 0x40, 0xc0, 0xfb, 0x7b, 0xe6, 0x66, 0xc1, 0x41, 0xdc, 0x5c, - 0x8f, 0x0f, 0x92, 0x12, 0xb5, 0x35, 0xa8, 0x28, 0xde, 0x5e, - 0xc3, 0x43, 0xe4, 0x64, 0xf9, 0x79, 0xaa, 0x2a, 0xb7, 0x37, - 0x90, 0x10, 0x8d, 0x0d, 0x36, 0xb6, 0x2b, 0xab, 0x0c, 0x8c, - 0x11, 0x91, 0x42, 0xc2, 0x5f, 0xdf, 0x78, 0xf8, 0x65, 0xe5, - 0x94, 0x14, 0x89, 0x09, 0xae, 0x2e, 0xb3, 0x33, 0xe0, 0x60, - 0xfd, 0x7d, 0xda, 0x5a, 0xc7, 0x47, 0x7c, 0xfc, 0x61, 0xe1, - 0x46, 0xc6, 0x5b, 0xdb, 0x08, 0x88, 0x15, 0x95, 0x32, 0xb2, - 0x2f, 0xaf, 0x59, 0xd9, 0x44, 0xc4, 0x63, 0xe3, 0x7e, 0xfe, - 0x2d, 0xad, 0x30, 0xb0, 0x17, 0x97, 0x0a, 0x8a, 0xb1, 0x31, - 0xac, 0x2c, 0x8b, 0x0b, 0x96, 0x16, 0xc5, 0x45, 0xd8, 0x58, - 0xff, 0x7f, 0xe2, 0x62, 0x00, 0x81, 0x1f, 0x9e, 0x3e, 0xbf, - 0x21, 0xa0, 0x7c, 0xfd, 0x63, 0xe2, 0x42, 0xc3, 0x5d, 0xdc, - 0xf8, 0x79, 0xe7, 0x66, 0xc6, 0x47, 0xd9, 0x58, 0x84, 0x05, - 0x9b, 0x1a, 0xba, 0x3b, 0xa5, 0x24, 0xed, 0x6c, 0xf2, 0x73, - 0xd3, 0x52, 0xcc, 0x4d, 0x91, 0x10, 0x8e, 0x0f, 0xaf, 0x2e, - 0xb0, 0x31, 0x15, 0x94, 0x0a, 0x8b, 0x2b, 0xaa, 0x34, 0xb5, - 0x69, 0xe8, 0x76, 0xf7, 0x57, 0xd6, 0x48, 0xc9, 0xc7, 0x46, - 0xd8, 0x59, 0xf9, 0x78, 0xe6, 0x67, 0xbb, 0x3a, 0xa4, 0x25, - 0x85, 0x04, 0x9a, 0x1b, 0x3f, 0xbe, 0x20, 0xa1, 0x01, 0x80, - 0x1e, 0x9f, 0x43, 0xc2, 0x5c, 0xdd, 0x7d, 0xfc, 0x62, 0xe3, - 0x2a, 0xab, 0x35, 0xb4, 0x14, 0x95, 0x0b, 0x8a, 0x56, 0xd7, - 0x49, 0xc8, 0x68, 0xe9, 0x77, 0xf6, 0xd2, 0x53, 0xcd, 0x4c, - 0xec, 0x6d, 0xf3, 0x72, 0xae, 0x2f, 0xb1, 0x30, 0x90, 0x11, - 0x8f, 0x0e, 0x93, 0x12, 0x8c, 0x0d, 0xad, 0x2c, 0xb2, 0x33, - 0xef, 0x6e, 0xf0, 0x71, 0xd1, 0x50, 0xce, 0x4f, 0x6b, 0xea, - 0x74, 0xf5, 0x55, 0xd4, 0x4a, 0xcb, 0x17, 0x96, 0x08, 0x89, - 0x29, 0xa8, 0x36, 0xb7, 0x7e, 0xff, 0x61, 0xe0, 0x40, 0xc1, - 0x5f, 0xde, 0x02, 0x83, 0x1d, 0x9c, 0x3c, 0xbd, 0x23, 0xa2, - 0x86, 0x07, 0x99, 0x18, 0xb8, 0x39, 0xa7, 0x26, 0xfa, 0x7b, - 0xe5, 0x64, 0xc4, 0x45, 0xdb, 0x5a, 0x54, 0xd5, 0x4b, 0xca, - 0x6a, 0xeb, 0x75, 0xf4, 0x28, 0xa9, 0x37, 0xb6, 0x16, 0x97, - 0x09, 0x88, 0xac, 0x2d, 0xb3, 0x32, 0x92, 0x13, 0x8d, 0x0c, - 0xd0, 0x51, 0xcf, 0x4e, 0xee, 0x6f, 0xf1, 0x70, 0xb9, 0x38, - 0xa6, 0x27, 0x87, 0x06, 0x98, 0x19, 0xc5, 0x44, 0xda, 0x5b, - 0xfb, 0x7a, 0xe4, 0x65, 0x41, 0xc0, 0x5e, 0xdf, 0x7f, 0xfe, - 0x60, 0xe1, 0x3d, 0xbc, 0x22, 0xa3, 0x03, 0x82, 0x1c, 0x9d, - 0x00, 0x82, 0x19, 0x9b, 0x32, 0xb0, 0x2b, 0xa9, 0x64, 0xe6, - 0x7d, 0xff, 0x56, 0xd4, 0x4f, 0xcd, 0xc8, 0x4a, 0xd1, 0x53, - 0xfa, 0x78, 0xe3, 0x61, 0xac, 0x2e, 0xb5, 0x37, 0x9e, 0x1c, - 0x87, 0x05, 0x8d, 0x0f, 0x94, 0x16, 0xbf, 0x3d, 0xa6, 0x24, - 0xe9, 0x6b, 0xf0, 0x72, 0xdb, 0x59, 0xc2, 0x40, 0x45, 0xc7, - 0x5c, 0xde, 0x77, 0xf5, 0x6e, 0xec, 0x21, 0xa3, 0x38, 0xba, - 0x13, 0x91, 0x0a, 0x88, 0x07, 0x85, 0x1e, 0x9c, 0x35, 0xb7, - 0x2c, 0xae, 0x63, 0xe1, 0x7a, 0xf8, 0x51, 0xd3, 0x48, 0xca, - 0xcf, 0x4d, 0xd6, 0x54, 0xfd, 0x7f, 0xe4, 0x66, 0xab, 0x29, - 0xb2, 0x30, 0x99, 0x1b, 0x80, 0x02, 0x8a, 0x08, 0x93, 0x11, - 0xb8, 0x3a, 0xa1, 0x23, 0xee, 0x6c, 0xf7, 0x75, 0xdc, 0x5e, - 0xc5, 0x47, 0x42, 0xc0, 0x5b, 0xd9, 0x70, 0xf2, 0x69, 0xeb, - 0x26, 0xa4, 0x3f, 0xbd, 0x14, 0x96, 0x0d, 0x8f, 0x0e, 0x8c, - 0x17, 0x95, 0x3c, 0xbe, 0x25, 0xa7, 0x6a, 0xe8, 0x73, 0xf1, - 0x58, 0xda, 0x41, 0xc3, 0xc6, 0x44, 0xdf, 0x5d, 0xf4, 0x76, - 0xed, 0x6f, 0xa2, 0x20, 0xbb, 0x39, 0x90, 0x12, 0x89, 0x0b, - 0x83, 0x01, 0x9a, 0x18, 0xb1, 0x33, 0xa8, 0x2a, 0xe7, 0x65, - 0xfe, 0x7c, 0xd5, 0x57, 0xcc, 0x4e, 0x4b, 0xc9, 0x52, 0xd0, - 0x79, 0xfb, 0x60, 0xe2, 0x2f, 0xad, 0x36, 0xb4, 0x1d, 0x9f, - 0x04, 0x86, 0x09, 0x8b, 0x10, 0x92, 0x3b, 0xb9, 0x22, 0xa0, - 0x6d, 0xef, 0x74, 0xf6, 0x5f, 0xdd, 0x46, 0xc4, 0xc1, 0x43, - 0xd8, 0x5a, 0xf3, 0x71, 0xea, 0x68, 0xa5, 0x27, 0xbc, 0x3e, - 0x97, 0x15, 0x8e, 0x0c, 0x84, 0x06, 0x9d, 0x1f, 0xb6, 0x34, - 0xaf, 0x2d, 0xe0, 0x62, 0xf9, 0x7b, 0xd2, 0x50, 0xcb, 0x49, - 0x4c, 0xce, 0x55, 0xd7, 0x7e, 0xfc, 0x67, 0xe5, 0x28, 0xaa, - 0x31, 0xb3, 0x1a, 0x98, 0x03, 0x81, 0x00, 0x83, 0x1b, 0x98, - 0x36, 0xb5, 0x2d, 0xae, 0x6c, 0xef, 0x77, 0xf4, 0x5a, 0xd9, - 0x41, 0xc2, 0xd8, 0x5b, 0xc3, 0x40, 0xee, 0x6d, 0xf5, 0x76, - 0xb4, 0x37, 0xaf, 0x2c, 0x82, 0x01, 0x99, 0x1a, 0xad, 0x2e, - 0xb6, 0x35, 0x9b, 0x18, 0x80, 0x03, 0xc1, 0x42, 0xda, 0x59, - 0xf7, 0x74, 0xec, 0x6f, 0x75, 0xf6, 0x6e, 0xed, 0x43, 0xc0, - 0x58, 0xdb, 0x19, 0x9a, 0x02, 0x81, 0x2f, 0xac, 0x34, 0xb7, - 0x47, 0xc4, 0x5c, 0xdf, 0x71, 0xf2, 0x6a, 0xe9, 0x2b, 0xa8, - 0x30, 0xb3, 0x1d, 0x9e, 0x06, 0x85, 0x9f, 0x1c, 0x84, 0x07, - 0xa9, 0x2a, 0xb2, 0x31, 0xf3, 0x70, 0xe8, 0x6b, 0xc5, 0x46, - 0xde, 0x5d, 0xea, 0x69, 0xf1, 0x72, 0xdc, 0x5f, 0xc7, 0x44, - 0x86, 0x05, 0x9d, 0x1e, 0xb0, 0x33, 0xab, 0x28, 0x32, 0xb1, - 0x29, 0xaa, 0x04, 0x87, 0x1f, 0x9c, 0x5e, 0xdd, 0x45, 0xc6, - 0x68, 0xeb, 0x73, 0xf0, 0x8e, 0x0d, 0x95, 0x16, 0xb8, 0x3b, - 0xa3, 0x20, 0xe2, 0x61, 0xf9, 0x7a, 0xd4, 0x57, 0xcf, 0x4c, - 0x56, 0xd5, 0x4d, 0xce, 0x60, 0xe3, 0x7b, 0xf8, 0x3a, 0xb9, - 0x21, 0xa2, 0x0c, 0x8f, 0x17, 0x94, 0x23, 0xa0, 0x38, 0xbb, - 0x15, 0x96, 0x0e, 0x8d, 0x4f, 0xcc, 0x54, 0xd7, 0x79, 0xfa, - 0x62, 0xe1, 0xfb, 0x78, 0xe0, 0x63, 0xcd, 0x4e, 0xd6, 0x55, - 0x97, 0x14, 0x8c, 0x0f, 0xa1, 0x22, 0xba, 0x39, 0xc9, 0x4a, - 0xd2, 0x51, 0xff, 0x7c, 0xe4, 0x67, 0xa5, 0x26, 0xbe, 0x3d, - 0x93, 0x10, 0x88, 0x0b, 0x11, 0x92, 0x0a, 0x89, 0x27, 0xa4, - 0x3c, 0xbf, 0x7d, 0xfe, 0x66, 0xe5, 0x4b, 0xc8, 0x50, 0xd3, - 0x64, 0xe7, 0x7f, 0xfc, 0x52, 0xd1, 0x49, 0xca, 0x08, 0x8b, - 0x13, 0x90, 0x3e, 0xbd, 0x25, 0xa6, 0xbc, 0x3f, 0xa7, 0x24, - 0x8a, 0x09, 0x91, 0x12, 0xd0, 0x53, 0xcb, 0x48, 0xe6, 0x65, - 0xfd, 0x7e, 0x00, 0x84, 0x15, 0x91, 0x2a, 0xae, 0x3f, 0xbb, - 0x54, 0xd0, 0x41, 0xc5, 0x7e, 0xfa, 0x6b, 0xef, 0xa8, 0x2c, - 0xbd, 0x39, 0x82, 0x06, 0x97, 0x13, 0xfc, 0x78, 0xe9, 0x6d, - 0xd6, 0x52, 0xc3, 0x47, 0x4d, 0xc9, 0x58, 0xdc, 0x67, 0xe3, - 0x72, 0xf6, 0x19, 0x9d, 0x0c, 0x88, 0x33, 0xb7, 0x26, 0xa2, - 0xe5, 0x61, 0xf0, 0x74, 0xcf, 0x4b, 0xda, 0x5e, 0xb1, 0x35, - 0xa4, 0x20, 0x9b, 0x1f, 0x8e, 0x0a, 0x9a, 0x1e, 0x8f, 0x0b, - 0xb0, 0x34, 0xa5, 0x21, 0xce, 0x4a, 0xdb, 0x5f, 0xe4, 0x60, - 0xf1, 0x75, 0x32, 0xb6, 0x27, 0xa3, 0x18, 0x9c, 0x0d, 0x89, - 0x66, 0xe2, 0x73, 0xf7, 0x4c, 0xc8, 0x59, 0xdd, 0xd7, 0x53, - 0xc2, 0x46, 0xfd, 0x79, 0xe8, 0x6c, 0x83, 0x07, 0x96, 0x12, - 0xa9, 0x2d, 0xbc, 0x38, 0x7f, 0xfb, 0x6a, 0xee, 0x55, 0xd1, - 0x40, 0xc4, 0x2b, 0xaf, 0x3e, 0xba, 0x01, 0x85, 0x14, 0x90, - 0x29, 0xad, 0x3c, 0xb8, 0x03, 0x87, 0x16, 0x92, 0x7d, 0xf9, - 0x68, 0xec, 0x57, 0xd3, 0x42, 0xc6, 0x81, 0x05, 0x94, 0x10, - 0xab, 0x2f, 0xbe, 0x3a, 0xd5, 0x51, 0xc0, 0x44, 0xff, 0x7b, - 0xea, 0x6e, 0x64, 0xe0, 0x71, 0xf5, 0x4e, 0xca, 0x5b, 0xdf, - 0x30, 0xb4, 0x25, 0xa1, 0x1a, 0x9e, 0x0f, 0x8b, 0xcc, 0x48, - 0xd9, 0x5d, 0xe6, 0x62, 0xf3, 0x77, 0x98, 0x1c, 0x8d, 0x09, - 0xb2, 0x36, 0xa7, 0x23, 0xb3, 0x37, 0xa6, 0x22, 0x99, 0x1d, - 0x8c, 0x08, 0xe7, 0x63, 0xf2, 0x76, 0xcd, 0x49, 0xd8, 0x5c, - 0x1b, 0x9f, 0x0e, 0x8a, 0x31, 0xb5, 0x24, 0xa0, 0x4f, 0xcb, - 0x5a, 0xde, 0x65, 0xe1, 0x70, 0xf4, 0xfe, 0x7a, 0xeb, 0x6f, - 0xd4, 0x50, 0xc1, 0x45, 0xaa, 0x2e, 0xbf, 0x3b, 0x80, 0x04, - 0x95, 0x11, 0x56, 0xd2, 0x43, 0xc7, 0x7c, 0xf8, 0x69, 0xed, - 0x02, 0x86, 0x17, 0x93, 0x28, 0xac, 0x3d, 0xb9, 0x00, 0x85, - 0x17, 0x92, 0x2e, 0xab, 0x39, 0xbc, 0x5c, 0xd9, 0x4b, 0xce, - 0x72, 0xf7, 0x65, 0xe0, 0xb8, 0x3d, 0xaf, 0x2a, 0x96, 0x13, - 0x81, 0x04, 0xe4, 0x61, 0xf3, 0x76, 0xca, 0x4f, 0xdd, 0x58, - 0x6d, 0xe8, 0x7a, 0xff, 0x43, 0xc6, 0x54, 0xd1, 0x31, 0xb4, - 0x26, 0xa3, 0x1f, 0x9a, 0x08, 0x8d, 0xd5, 0x50, 0xc2, 0x47, - 0xfb, 0x7e, 0xec, 0x69, 0x89, 0x0c, 0x9e, 0x1b, 0xa7, 0x22, - 0xb0, 0x35, 0xda, 0x5f, 0xcd, 0x48, 0xf4, 0x71, 0xe3, 0x66, - 0x86, 0x03, 0x91, 0x14, 0xa8, 0x2d, 0xbf, 0x3a, 0x62, 0xe7, - 0x75, 0xf0, 0x4c, 0xc9, 0x5b, 0xde, 0x3e, 0xbb, 0x29, 0xac, - 0x10, 0x95, 0x07, 0x82, 0xb7, 0x32, 0xa0, 0x25, 0x99, 0x1c, - 0x8e, 0x0b, 0xeb, 0x6e, 0xfc, 0x79, 0xc5, 0x40, 0xd2, 0x57, - 0x0f, 0x8a, 0x18, 0x9d, 0x21, 0xa4, 0x36, 0xb3, 0x53, 0xd6, - 0x44, 0xc1, 0x7d, 0xf8, 0x6a, 0xef, 0xa9, 0x2c, 0xbe, 0x3b, - 0x87, 0x02, 0x90, 0x15, 0xf5, 0x70, 0xe2, 0x67, 0xdb, 0x5e, - 0xcc, 0x49, 0x11, 0x94, 0x06, 0x83, 0x3f, 0xba, 0x28, 0xad, - 0x4d, 0xc8, 0x5a, 0xdf, 0x63, 0xe6, 0x74, 0xf1, 0xc4, 0x41, - 0xd3, 0x56, 0xea, 0x6f, 0xfd, 0x78, 0x98, 0x1d, 0x8f, 0x0a, - 0xb6, 0x33, 0xa1, 0x24, 0x7c, 0xf9, 0x6b, 0xee, 0x52, 0xd7, - 0x45, 0xc0, 0x20, 0xa5, 0x37, 0xb2, 0x0e, 0x8b, 0x19, 0x9c, - 0x73, 0xf6, 0x64, 0xe1, 0x5d, 0xd8, 0x4a, 0xcf, 0x2f, 0xaa, - 0x38, 0xbd, 0x01, 0x84, 0x16, 0x93, 0xcb, 0x4e, 0xdc, 0x59, - 0xe5, 0x60, 0xf2, 0x77, 0x97, 0x12, 0x80, 0x05, 0xb9, 0x3c, - 0xae, 0x2b, 0x1e, 0x9b, 0x09, 0x8c, 0x30, 0xb5, 0x27, 0xa2, - 0x42, 0xc7, 0x55, 0xd0, 0x6c, 0xe9, 0x7b, 0xfe, 0xa6, 0x23, - 0xb1, 0x34, 0x88, 0x0d, 0x9f, 0x1a, 0xfa, 0x7f, 0xed, 0x68, - 0xd4, 0x51, 0xc3, 0x46, 0x00, 0x86, 0x11, 0x97, 0x22, 0xa4, - 0x33, 0xb5, 0x44, 0xc2, 0x55, 0xd3, 0x66, 0xe0, 0x77, 0xf1, - 0x88, 0x0e, 0x99, 0x1f, 0xaa, 0x2c, 0xbb, 0x3d, 0xcc, 0x4a, - 0xdd, 0x5b, 0xee, 0x68, 0xff, 0x79, 0x0d, 0x8b, 0x1c, 0x9a, - 0x2f, 0xa9, 0x3e, 0xb8, 0x49, 0xcf, 0x58, 0xde, 0x6b, 0xed, - 0x7a, 0xfc, 0x85, 0x03, 0x94, 0x12, 0xa7, 0x21, 0xb6, 0x30, - 0xc1, 0x47, 0xd0, 0x56, 0xe3, 0x65, 0xf2, 0x74, 0x1a, 0x9c, - 0x0b, 0x8d, 0x38, 0xbe, 0x29, 0xaf, 0x5e, 0xd8, 0x4f, 0xc9, - 0x7c, 0xfa, 0x6d, 0xeb, 0x92, 0x14, 0x83, 0x05, 0xb0, 0x36, - 0xa1, 0x27, 0xd6, 0x50, 0xc7, 0x41, 0xf4, 0x72, 0xe5, 0x63, - 0x17, 0x91, 0x06, 0x80, 0x35, 0xb3, 0x24, 0xa2, 0x53, 0xd5, - 0x42, 0xc4, 0x71, 0xf7, 0x60, 0xe6, 0x9f, 0x19, 0x8e, 0x08, - 0xbd, 0x3b, 0xac, 0x2a, 0xdb, 0x5d, 0xca, 0x4c, 0xf9, 0x7f, - 0xe8, 0x6e, 0x34, 0xb2, 0x25, 0xa3, 0x16, 0x90, 0x07, 0x81, - 0x70, 0xf6, 0x61, 0xe7, 0x52, 0xd4, 0x43, 0xc5, 0xbc, 0x3a, - 0xad, 0x2b, 0x9e, 0x18, 0x8f, 0x09, 0xf8, 0x7e, 0xe9, 0x6f, - 0xda, 0x5c, 0xcb, 0x4d, 0x39, 0xbf, 0x28, 0xae, 0x1b, 0x9d, - 0x0a, 0x8c, 0x7d, 0xfb, 0x6c, 0xea, 0x5f, 0xd9, 0x4e, 0xc8, - 0xb1, 0x37, 0xa0, 0x26, 0x93, 0x15, 0x82, 0x04, 0xf5, 0x73, - 0xe4, 0x62, 0xd7, 0x51, 0xc6, 0x40, 0x2e, 0xa8, 0x3f, 0xb9, - 0x0c, 0x8a, 0x1d, 0x9b, 0x6a, 0xec, 0x7b, 0xfd, 0x48, 0xce, - 0x59, 0xdf, 0xa6, 0x20, 0xb7, 0x31, 0x84, 0x02, 0x95, 0x13, - 0xe2, 0x64, 0xf3, 0x75, 0xc0, 0x46, 0xd1, 0x57, 0x23, 0xa5, - 0x32, 0xb4, 0x01, 0x87, 0x10, 0x96, 0x67, 0xe1, 0x76, 0xf0, - 0x45, 0xc3, 0x54, 0xd2, 0xab, 0x2d, 0xba, 0x3c, 0x89, 0x0f, - 0x98, 0x1e, 0xef, 0x69, 0xfe, 0x78, 0xcd, 0x4b, 0xdc, 0x5a, - 0x00, 0x87, 0x13, 0x94, 0x26, 0xa1, 0x35, 0xb2, 0x4c, 0xcb, - 0x5f, 0xd8, 0x6a, 0xed, 0x79, 0xfe, 0x98, 0x1f, 0x8b, 0x0c, - 0xbe, 0x39, 0xad, 0x2a, 0xd4, 0x53, 0xc7, 0x40, 0xf2, 0x75, - 0xe1, 0x66, 0x2d, 0xaa, 0x3e, 0xb9, 0x0b, 0x8c, 0x18, 0x9f, - 0x61, 0xe6, 0x72, 0xf5, 0x47, 0xc0, 0x54, 0xd3, 0xb5, 0x32, - 0xa6, 0x21, 0x93, 0x14, 0x80, 0x07, 0xf9, 0x7e, 0xea, 0x6d, - 0xdf, 0x58, 0xcc, 0x4b, 0x5a, 0xdd, 0x49, 0xce, 0x7c, 0xfb, - 0x6f, 0xe8, 0x16, 0x91, 0x05, 0x82, 0x30, 0xb7, 0x23, 0xa4, - 0xc2, 0x45, 0xd1, 0x56, 0xe4, 0x63, 0xf7, 0x70, 0x8e, 0x09, - 0x9d, 0x1a, 0xa8, 0x2f, 0xbb, 0x3c, 0x77, 0xf0, 0x64, 0xe3, - 0x51, 0xd6, 0x42, 0xc5, 0x3b, 0xbc, 0x28, 0xaf, 0x1d, 0x9a, - 0x0e, 0x89, 0xef, 0x68, 0xfc, 0x7b, 0xc9, 0x4e, 0xda, 0x5d, - 0xa3, 0x24, 0xb0, 0x37, 0x85, 0x02, 0x96, 0x11, 0xb4, 0x33, - 0xa7, 0x20, 0x92, 0x15, 0x81, 0x06, 0xf8, 0x7f, 0xeb, 0x6c, - 0xde, 0x59, 0xcd, 0x4a, 0x2c, 0xab, 0x3f, 0xb8, 0x0a, 0x8d, - 0x19, 0x9e, 0x60, 0xe7, 0x73, 0xf4, 0x46, 0xc1, 0x55, 0xd2, - 0x99, 0x1e, 0x8a, 0x0d, 0xbf, 0x38, 0xac, 0x2b, 0xd5, 0x52, - 0xc6, 0x41, 0xf3, 0x74, 0xe0, 0x67, 0x01, 0x86, 0x12, 0x95, - 0x27, 0xa0, 0x34, 0xb3, 0x4d, 0xca, 0x5e, 0xd9, 0x6b, 0xec, - 0x78, 0xff, 0xee, 0x69, 0xfd, 0x7a, 0xc8, 0x4f, 0xdb, 0x5c, - 0xa2, 0x25, 0xb1, 0x36, 0x84, 0x03, 0x97, 0x10, 0x76, 0xf1, - 0x65, 0xe2, 0x50, 0xd7, 0x43, 0xc4, 0x3a, 0xbd, 0x29, 0xae, - 0x1c, 0x9b, 0x0f, 0x88, 0xc3, 0x44, 0xd0, 0x57, 0xe5, 0x62, - 0xf6, 0x71, 0x8f, 0x08, 0x9c, 0x1b, 0xa9, 0x2e, 0xba, 0x3d, - 0x5b, 0xdc, 0x48, 0xcf, 0x7d, 0xfa, 0x6e, 0xe9, 0x17, 0x90, - 0x04, 0x83, 0x31, 0xb6, 0x22, 0xa5, 0x00, 0x88, 0x0d, 0x85, - 0x1a, 0x92, 0x17, 0x9f, 0x34, 0xbc, 0x39, 0xb1, 0x2e, 0xa6, - 0x23, 0xab, 0x68, 0xe0, 0x65, 0xed, 0x72, 0xfa, 0x7f, 0xf7, - 0x5c, 0xd4, 0x51, 0xd9, 0x46, 0xce, 0x4b, 0xc3, 0xd0, 0x58, - 0xdd, 0x55, 0xca, 0x42, 0xc7, 0x4f, 0xe4, 0x6c, 0xe9, 0x61, - 0xfe, 0x76, 0xf3, 0x7b, 0xb8, 0x30, 0xb5, 0x3d, 0xa2, 0x2a, - 0xaf, 0x27, 0x8c, 0x04, 0x81, 0x09, 0x96, 0x1e, 0x9b, 0x13, - 0xbd, 0x35, 0xb0, 0x38, 0xa7, 0x2f, 0xaa, 0x22, 0x89, 0x01, - 0x84, 0x0c, 0x93, 0x1b, 0x9e, 0x16, 0xd5, 0x5d, 0xd8, 0x50, - 0xcf, 0x47, 0xc2, 0x4a, 0xe1, 0x69, 0xec, 0x64, 0xfb, 0x73, - 0xf6, 0x7e, 0x6d, 0xe5, 0x60, 0xe8, 0x77, 0xff, 0x7a, 0xf2, - 0x59, 0xd1, 0x54, 0xdc, 0x43, 0xcb, 0x4e, 0xc6, 0x05, 0x8d, - 0x08, 0x80, 0x1f, 0x97, 0x12, 0x9a, 0x31, 0xb9, 0x3c, 0xb4, - 0x2b, 0xa3, 0x26, 0xae, 0x67, 0xef, 0x6a, 0xe2, 0x7d, 0xf5, - 0x70, 0xf8, 0x53, 0xdb, 0x5e, 0xd6, 0x49, 0xc1, 0x44, 0xcc, - 0x0f, 0x87, 0x02, 0x8a, 0x15, 0x9d, 0x18, 0x90, 0x3b, 0xb3, - 0x36, 0xbe, 0x21, 0xa9, 0x2c, 0xa4, 0xb7, 0x3f, 0xba, 0x32, - 0xad, 0x25, 0xa0, 0x28, 0x83, 0x0b, 0x8e, 0x06, 0x99, 0x11, - 0x94, 0x1c, 0xdf, 0x57, 0xd2, 0x5a, 0xc5, 0x4d, 0xc8, 0x40, - 0xeb, 0x63, 0xe6, 0x6e, 0xf1, 0x79, 0xfc, 0x74, 0xda, 0x52, - 0xd7, 0x5f, 0xc0, 0x48, 0xcd, 0x45, 0xee, 0x66, 0xe3, 0x6b, - 0xf4, 0x7c, 0xf9, 0x71, 0xb2, 0x3a, 0xbf, 0x37, 0xa8, 0x20, - 0xa5, 0x2d, 0x86, 0x0e, 0x8b, 0x03, 0x9c, 0x14, 0x91, 0x19, - 0x0a, 0x82, 0x07, 0x8f, 0x10, 0x98, 0x1d, 0x95, 0x3e, 0xb6, - 0x33, 0xbb, 0x24, 0xac, 0x29, 0xa1, 0x62, 0xea, 0x6f, 0xe7, - 0x78, 0xf0, 0x75, 0xfd, 0x56, 0xde, 0x5b, 0xd3, 0x4c, 0xc4, - 0x41, 0xc9, 0x00, 0x89, 0x0f, 0x86, 0x1e, 0x97, 0x11, 0x98, - 0x3c, 0xb5, 0x33, 0xba, 0x22, 0xab, 0x2d, 0xa4, 0x78, 0xf1, - 0x77, 0xfe, 0x66, 0xef, 0x69, 0xe0, 0x44, 0xcd, 0x4b, 0xc2, - 0x5a, 0xd3, 0x55, 0xdc, 0xf0, 0x79, 0xff, 0x76, 0xee, 0x67, - 0xe1, 0x68, 0xcc, 0x45, 0xc3, 0x4a, 0xd2, 0x5b, 0xdd, 0x54, - 0x88, 0x01, 0x87, 0x0e, 0x96, 0x1f, 0x99, 0x10, 0xb4, 0x3d, - 0xbb, 0x32, 0xaa, 0x23, 0xa5, 0x2c, 0xfd, 0x74, 0xf2, 0x7b, - 0xe3, 0x6a, 0xec, 0x65, 0xc1, 0x48, 0xce, 0x47, 0xdf, 0x56, - 0xd0, 0x59, 0x85, 0x0c, 0x8a, 0x03, 0x9b, 0x12, 0x94, 0x1d, - 0xb9, 0x30, 0xb6, 0x3f, 0xa7, 0x2e, 0xa8, 0x21, 0x0d, 0x84, - 0x02, 0x8b, 0x13, 0x9a, 0x1c, 0x95, 0x31, 0xb8, 0x3e, 0xb7, - 0x2f, 0xa6, 0x20, 0xa9, 0x75, 0xfc, 0x7a, 0xf3, 0x6b, 0xe2, - 0x64, 0xed, 0x49, 0xc0, 0x46, 0xcf, 0x57, 0xde, 0x58, 0xd1, - 0xe7, 0x6e, 0xe8, 0x61, 0xf9, 0x70, 0xf6, 0x7f, 0xdb, 0x52, - 0xd4, 0x5d, 0xc5, 0x4c, 0xca, 0x43, 0x9f, 0x16, 0x90, 0x19, - 0x81, 0x08, 0x8e, 0x07, 0xa3, 0x2a, 0xac, 0x25, 0xbd, 0x34, - 0xb2, 0x3b, 0x17, 0x9e, 0x18, 0x91, 0x09, 0x80, 0x06, 0x8f, - 0x2b, 0xa2, 0x24, 0xad, 0x35, 0xbc, 0x3a, 0xb3, 0x6f, 0xe6, - 0x60, 0xe9, 0x71, 0xf8, 0x7e, 0xf7, 0x53, 0xda, 0x5c, 0xd5, - 0x4d, 0xc4, 0x42, 0xcb, 0x1a, 0x93, 0x15, 0x9c, 0x04, 0x8d, - 0x0b, 0x82, 0x26, 0xaf, 0x29, 0xa0, 0x38, 0xb1, 0x37, 0xbe, - 0x62, 0xeb, 0x6d, 0xe4, 0x7c, 0xf5, 0x73, 0xfa, 0x5e, 0xd7, - 0x51, 0xd8, 0x40, 0xc9, 0x4f, 0xc6, 0xea, 0x63, 0xe5, 0x6c, - 0xf4, 0x7d, 0xfb, 0x72, 0xd6, 0x5f, 0xd9, 0x50, 0xc8, 0x41, - 0xc7, 0x4e, 0x92, 0x1b, 0x9d, 0x14, 0x8c, 0x05, 0x83, 0x0a, - 0xae, 0x27, 0xa1, 0x28, 0xb0, 0x39, 0xbf, 0x36, 0x00, 0x8a, - 0x09, 0x83, 0x12, 0x98, 0x1b, 0x91, 0x24, 0xae, 0x2d, 0xa7, - 0x36, 0xbc, 0x3f, 0xb5, 0x48, 0xc2, 0x41, 0xcb, 0x5a, 0xd0, - 0x53, 0xd9, 0x6c, 0xe6, 0x65, 0xef, 0x7e, 0xf4, 0x77, 0xfd, - 0x90, 0x1a, 0x99, 0x13, 0x82, 0x08, 0x8b, 0x01, 0xb4, 0x3e, - 0xbd, 0x37, 0xa6, 0x2c, 0xaf, 0x25, 0xd8, 0x52, 0xd1, 0x5b, - 0xca, 0x40, 0xc3, 0x49, 0xfc, 0x76, 0xf5, 0x7f, 0xee, 0x64, - 0xe7, 0x6d, 0x3d, 0xb7, 0x34, 0xbe, 0x2f, 0xa5, 0x26, 0xac, - 0x19, 0x93, 0x10, 0x9a, 0x0b, 0x81, 0x02, 0x88, 0x75, 0xff, - 0x7c, 0xf6, 0x67, 0xed, 0x6e, 0xe4, 0x51, 0xdb, 0x58, 0xd2, - 0x43, 0xc9, 0x4a, 0xc0, 0xad, 0x27, 0xa4, 0x2e, 0xbf, 0x35, - 0xb6, 0x3c, 0x89, 0x03, 0x80, 0x0a, 0x9b, 0x11, 0x92, 0x18, - 0xe5, 0x6f, 0xec, 0x66, 0xf7, 0x7d, 0xfe, 0x74, 0xc1, 0x4b, - 0xc8, 0x42, 0xd3, 0x59, 0xda, 0x50, 0x7a, 0xf0, 0x73, 0xf9, - 0x68, 0xe2, 0x61, 0xeb, 0x5e, 0xd4, 0x57, 0xdd, 0x4c, 0xc6, - 0x45, 0xcf, 0x32, 0xb8, 0x3b, 0xb1, 0x20, 0xaa, 0x29, 0xa3, - 0x16, 0x9c, 0x1f, 0x95, 0x04, 0x8e, 0x0d, 0x87, 0xea, 0x60, - 0xe3, 0x69, 0xf8, 0x72, 0xf1, 0x7b, 0xce, 0x44, 0xc7, 0x4d, - 0xdc, 0x56, 0xd5, 0x5f, 0xa2, 0x28, 0xab, 0x21, 0xb0, 0x3a, - 0xb9, 0x33, 0x86, 0x0c, 0x8f, 0x05, 0x94, 0x1e, 0x9d, 0x17, - 0x47, 0xcd, 0x4e, 0xc4, 0x55, 0xdf, 0x5c, 0xd6, 0x63, 0xe9, - 0x6a, 0xe0, 0x71, 0xfb, 0x78, 0xf2, 0x0f, 0x85, 0x06, 0x8c, - 0x1d, 0x97, 0x14, 0x9e, 0x2b, 0xa1, 0x22, 0xa8, 0x39, 0xb3, - 0x30, 0xba, 0xd7, 0x5d, 0xde, 0x54, 0xc5, 0x4f, 0xcc, 0x46, - 0xf3, 0x79, 0xfa, 0x70, 0xe1, 0x6b, 0xe8, 0x62, 0x9f, 0x15, - 0x96, 0x1c, 0x8d, 0x07, 0x84, 0x0e, 0xbb, 0x31, 0xb2, 0x38, - 0xa9, 0x23, 0xa0, 0x2a, 0x00, 0x8b, 0x0b, 0x80, 0x16, 0x9d, - 0x1d, 0x96, 0x2c, 0xa7, 0x27, 0xac, 0x3a, 0xb1, 0x31, 0xba, - 0x58, 0xd3, 0x53, 0xd8, 0x4e, 0xc5, 0x45, 0xce, 0x74, 0xff, - 0x7f, 0xf4, 0x62, 0xe9, 0x69, 0xe2, 0xb0, 0x3b, 0xbb, 0x30, - 0xa6, 0x2d, 0xad, 0x26, 0x9c, 0x17, 0x97, 0x1c, 0x8a, 0x01, - 0x81, 0x0a, 0xe8, 0x63, 0xe3, 0x68, 0xfe, 0x75, 0xf5, 0x7e, - 0xc4, 0x4f, 0xcf, 0x44, 0xd2, 0x59, 0xd9, 0x52, 0x7d, 0xf6, - 0x76, 0xfd, 0x6b, 0xe0, 0x60, 0xeb, 0x51, 0xda, 0x5a, 0xd1, - 0x47, 0xcc, 0x4c, 0xc7, 0x25, 0xae, 0x2e, 0xa5, 0x33, 0xb8, - 0x38, 0xb3, 0x09, 0x82, 0x02, 0x89, 0x1f, 0x94, 0x14, 0x9f, - 0xcd, 0x46, 0xc6, 0x4d, 0xdb, 0x50, 0xd0, 0x5b, 0xe1, 0x6a, - 0xea, 0x61, 0xf7, 0x7c, 0xfc, 0x77, 0x95, 0x1e, 0x9e, 0x15, - 0x83, 0x08, 0x88, 0x03, 0xb9, 0x32, 0xb2, 0x39, 0xaf, 0x24, - 0xa4, 0x2f, 0xfa, 0x71, 0xf1, 0x7a, 0xec, 0x67, 0xe7, 0x6c, - 0xd6, 0x5d, 0xdd, 0x56, 0xc0, 0x4b, 0xcb, 0x40, 0xa2, 0x29, - 0xa9, 0x22, 0xb4, 0x3f, 0xbf, 0x34, 0x8e, 0x05, 0x85, 0x0e, - 0x98, 0x13, 0x93, 0x18, 0x4a, 0xc1, 0x41, 0xca, 0x5c, 0xd7, - 0x57, 0xdc, 0x66, 0xed, 0x6d, 0xe6, 0x70, 0xfb, 0x7b, 0xf0, - 0x12, 0x99, 0x19, 0x92, 0x04, 0x8f, 0x0f, 0x84, 0x3e, 0xb5, - 0x35, 0xbe, 0x28, 0xa3, 0x23, 0xa8, 0x87, 0x0c, 0x8c, 0x07, - 0x91, 0x1a, 0x9a, 0x11, 0xab, 0x20, 0xa0, 0x2b, 0xbd, 0x36, - 0xb6, 0x3d, 0xdf, 0x54, 0xd4, 0x5f, 0xc9, 0x42, 0xc2, 0x49, - 0xf3, 0x78, 0xf8, 0x73, 0xe5, 0x6e, 0xee, 0x65, 0x37, 0xbc, - 0x3c, 0xb7, 0x21, 0xaa, 0x2a, 0xa1, 0x1b, 0x90, 0x10, 0x9b, - 0x0d, 0x86, 0x06, 0x8d, 0x6f, 0xe4, 0x64, 0xef, 0x79, 0xf2, - 0x72, 0xf9, 0x43, 0xc8, 0x48, 0xc3, 0x55, 0xde, 0x5e, 0xd5, - 0x00, 0x8c, 0x05, 0x89, 0x0a, 0x86, 0x0f, 0x83, 0x14, 0x98, - 0x11, 0x9d, 0x1e, 0x92, 0x1b, 0x97, 0x28, 0xa4, 0x2d, 0xa1, - 0x22, 0xae, 0x27, 0xab, 0x3c, 0xb0, 0x39, 0xb5, 0x36, 0xba, - 0x33, 0xbf, 0x50, 0xdc, 0x55, 0xd9, 0x5a, 0xd6, 0x5f, 0xd3, - 0x44, 0xc8, 0x41, 0xcd, 0x4e, 0xc2, 0x4b, 0xc7, 0x78, 0xf4, - 0x7d, 0xf1, 0x72, 0xfe, 0x77, 0xfb, 0x6c, 0xe0, 0x69, 0xe5, - 0x66, 0xea, 0x63, 0xef, 0xa0, 0x2c, 0xa5, 0x29, 0xaa, 0x26, - 0xaf, 0x23, 0xb4, 0x38, 0xb1, 0x3d, 0xbe, 0x32, 0xbb, 0x37, - 0x88, 0x04, 0x8d, 0x01, 0x82, 0x0e, 0x87, 0x0b, 0x9c, 0x10, - 0x99, 0x15, 0x96, 0x1a, 0x93, 0x1f, 0xf0, 0x7c, 0xf5, 0x79, - 0xfa, 0x76, 0xff, 0x73, 0xe4, 0x68, 0xe1, 0x6d, 0xee, 0x62, - 0xeb, 0x67, 0xd8, 0x54, 0xdd, 0x51, 0xd2, 0x5e, 0xd7, 0x5b, - 0xcc, 0x40, 0xc9, 0x45, 0xc6, 0x4a, 0xc3, 0x4f, 0x5d, 0xd1, - 0x58, 0xd4, 0x57, 0xdb, 0x52, 0xde, 0x49, 0xc5, 0x4c, 0xc0, - 0x43, 0xcf, 0x46, 0xca, 0x75, 0xf9, 0x70, 0xfc, 0x7f, 0xf3, - 0x7a, 0xf6, 0x61, 0xed, 0x64, 0xe8, 0x6b, 0xe7, 0x6e, 0xe2, - 0x0d, 0x81, 0x08, 0x84, 0x07, 0x8b, 0x02, 0x8e, 0x19, 0x95, - 0x1c, 0x90, 0x13, 0x9f, 0x16, 0x9a, 0x25, 0xa9, 0x20, 0xac, - 0x2f, 0xa3, 0x2a, 0xa6, 0x31, 0xbd, 0x34, 0xb8, 0x3b, 0xb7, - 0x3e, 0xb2, 0xfd, 0x71, 0xf8, 0x74, 0xf7, 0x7b, 0xf2, 0x7e, - 0xe9, 0x65, 0xec, 0x60, 0xe3, 0x6f, 0xe6, 0x6a, 0xd5, 0x59, - 0xd0, 0x5c, 0xdf, 0x53, 0xda, 0x56, 0xc1, 0x4d, 0xc4, 0x48, - 0xcb, 0x47, 0xce, 0x42, 0xad, 0x21, 0xa8, 0x24, 0xa7, 0x2b, - 0xa2, 0x2e, 0xb9, 0x35, 0xbc, 0x30, 0xb3, 0x3f, 0xb6, 0x3a, - 0x85, 0x09, 0x80, 0x0c, 0x8f, 0x03, 0x8a, 0x06, 0x91, 0x1d, - 0x94, 0x18, 0x9b, 0x17, 0x9e, 0x12, 0x00, 0x8d, 0x07, 0x8a, - 0x0e, 0x83, 0x09, 0x84, 0x1c, 0x91, 0x1b, 0x96, 0x12, 0x9f, - 0x15, 0x98, 0x38, 0xb5, 0x3f, 0xb2, 0x36, 0xbb, 0x31, 0xbc, - 0x24, 0xa9, 0x23, 0xae, 0x2a, 0xa7, 0x2d, 0xa0, 0x70, 0xfd, - 0x77, 0xfa, 0x7e, 0xf3, 0x79, 0xf4, 0x6c, 0xe1, 0x6b, 0xe6, - 0x62, 0xef, 0x65, 0xe8, 0x48, 0xc5, 0x4f, 0xc2, 0x46, 0xcb, - 0x41, 0xcc, 0x54, 0xd9, 0x53, 0xde, 0x5a, 0xd7, 0x5d, 0xd0, - 0xe0, 0x6d, 0xe7, 0x6a, 0xee, 0x63, 0xe9, 0x64, 0xfc, 0x71, - 0xfb, 0x76, 0xf2, 0x7f, 0xf5, 0x78, 0xd8, 0x55, 0xdf, 0x52, - 0xd6, 0x5b, 0xd1, 0x5c, 0xc4, 0x49, 0xc3, 0x4e, 0xca, 0x47, - 0xcd, 0x40, 0x90, 0x1d, 0x97, 0x1a, 0x9e, 0x13, 0x99, 0x14, - 0x8c, 0x01, 0x8b, 0x06, 0x82, 0x0f, 0x85, 0x08, 0xa8, 0x25, - 0xaf, 0x22, 0xa6, 0x2b, 0xa1, 0x2c, 0xb4, 0x39, 0xb3, 0x3e, - 0xba, 0x37, 0xbd, 0x30, 0xdd, 0x50, 0xda, 0x57, 0xd3, 0x5e, - 0xd4, 0x59, 0xc1, 0x4c, 0xc6, 0x4b, 0xcf, 0x42, 0xc8, 0x45, - 0xe5, 0x68, 0xe2, 0x6f, 0xeb, 0x66, 0xec, 0x61, 0xf9, 0x74, - 0xfe, 0x73, 0xf7, 0x7a, 0xf0, 0x7d, 0xad, 0x20, 0xaa, 0x27, - 0xa3, 0x2e, 0xa4, 0x29, 0xb1, 0x3c, 0xb6, 0x3b, 0xbf, 0x32, - 0xb8, 0x35, 0x95, 0x18, 0x92, 0x1f, 0x9b, 0x16, 0x9c, 0x11, - 0x89, 0x04, 0x8e, 0x03, 0x87, 0x0a, 0x80, 0x0d, 0x3d, 0xb0, - 0x3a, 0xb7, 0x33, 0xbe, 0x34, 0xb9, 0x21, 0xac, 0x26, 0xab, - 0x2f, 0xa2, 0x28, 0xa5, 0x05, 0x88, 0x02, 0x8f, 0x0b, 0x86, - 0x0c, 0x81, 0x19, 0x94, 0x1e, 0x93, 0x17, 0x9a, 0x10, 0x9d, - 0x4d, 0xc0, 0x4a, 0xc7, 0x43, 0xce, 0x44, 0xc9, 0x51, 0xdc, - 0x56, 0xdb, 0x5f, 0xd2, 0x58, 0xd5, 0x75, 0xf8, 0x72, 0xff, - 0x7b, 0xf6, 0x7c, 0xf1, 0x69, 0xe4, 0x6e, 0xe3, 0x67, 0xea, - 0x60, 0xed, 0x00, 0x8e, 0x01, 0x8f, 0x02, 0x8c, 0x03, 0x8d, - 0x04, 0x8a, 0x05, 0x8b, 0x06, 0x88, 0x07, 0x89, 0x08, 0x86, - 0x09, 0x87, 0x0a, 0x84, 0x0b, 0x85, 0x0c, 0x82, 0x0d, 0x83, - 0x0e, 0x80, 0x0f, 0x81, 0x10, 0x9e, 0x11, 0x9f, 0x12, 0x9c, - 0x13, 0x9d, 0x14, 0x9a, 0x15, 0x9b, 0x16, 0x98, 0x17, 0x99, - 0x18, 0x96, 0x19, 0x97, 0x1a, 0x94, 0x1b, 0x95, 0x1c, 0x92, - 0x1d, 0x93, 0x1e, 0x90, 0x1f, 0x91, 0x20, 0xae, 0x21, 0xaf, - 0x22, 0xac, 0x23, 0xad, 0x24, 0xaa, 0x25, 0xab, 0x26, 0xa8, - 0x27, 0xa9, 0x28, 0xa6, 0x29, 0xa7, 0x2a, 0xa4, 0x2b, 0xa5, - 0x2c, 0xa2, 0x2d, 0xa3, 0x2e, 0xa0, 0x2f, 0xa1, 0x30, 0xbe, - 0x31, 0xbf, 0x32, 0xbc, 0x33, 0xbd, 0x34, 0xba, 0x35, 0xbb, - 0x36, 0xb8, 0x37, 0xb9, 0x38, 0xb6, 0x39, 0xb7, 0x3a, 0xb4, - 0x3b, 0xb5, 0x3c, 0xb2, 0x3d, 0xb3, 0x3e, 0xb0, 0x3f, 0xb1, - 0x40, 0xce, 0x41, 0xcf, 0x42, 0xcc, 0x43, 0xcd, 0x44, 0xca, - 0x45, 0xcb, 0x46, 0xc8, 0x47, 0xc9, 0x48, 0xc6, 0x49, 0xc7, - 0x4a, 0xc4, 0x4b, 0xc5, 0x4c, 0xc2, 0x4d, 0xc3, 0x4e, 0xc0, - 0x4f, 0xc1, 0x50, 0xde, 0x51, 0xdf, 0x52, 0xdc, 0x53, 0xdd, - 0x54, 0xda, 0x55, 0xdb, 0x56, 0xd8, 0x57, 0xd9, 0x58, 0xd6, - 0x59, 0xd7, 0x5a, 0xd4, 0x5b, 0xd5, 0x5c, 0xd2, 0x5d, 0xd3, - 0x5e, 0xd0, 0x5f, 0xd1, 0x60, 0xee, 0x61, 0xef, 0x62, 0xec, - 0x63, 0xed, 0x64, 0xea, 0x65, 0xeb, 0x66, 0xe8, 0x67, 0xe9, - 0x68, 0xe6, 0x69, 0xe7, 0x6a, 0xe4, 0x6b, 0xe5, 0x6c, 0xe2, - 0x6d, 0xe3, 0x6e, 0xe0, 0x6f, 0xe1, 0x70, 0xfe, 0x71, 0xff, - 0x72, 0xfc, 0x73, 0xfd, 0x74, 0xfa, 0x75, 0xfb, 0x76, 0xf8, - 0x77, 0xf9, 0x78, 0xf6, 0x79, 0xf7, 0x7a, 0xf4, 0x7b, 0xf5, - 0x7c, 0xf2, 0x7d, 0xf3, 0x7e, 0xf0, 0x7f, 0xf1, 0x00, 0x8f, - 0x03, 0x8c, 0x06, 0x89, 0x05, 0x8a, 0x0c, 0x83, 0x0f, 0x80, - 0x0a, 0x85, 0x09, 0x86, 0x18, 0x97, 0x1b, 0x94, 0x1e, 0x91, - 0x1d, 0x92, 0x14, 0x9b, 0x17, 0x98, 0x12, 0x9d, 0x11, 0x9e, - 0x30, 0xbf, 0x33, 0xbc, 0x36, 0xb9, 0x35, 0xba, 0x3c, 0xb3, - 0x3f, 0xb0, 0x3a, 0xb5, 0x39, 0xb6, 0x28, 0xa7, 0x2b, 0xa4, - 0x2e, 0xa1, 0x2d, 0xa2, 0x24, 0xab, 0x27, 0xa8, 0x22, 0xad, - 0x21, 0xae, 0x60, 0xef, 0x63, 0xec, 0x66, 0xe9, 0x65, 0xea, - 0x6c, 0xe3, 0x6f, 0xe0, 0x6a, 0xe5, 0x69, 0xe6, 0x78, 0xf7, - 0x7b, 0xf4, 0x7e, 0xf1, 0x7d, 0xf2, 0x74, 0xfb, 0x77, 0xf8, - 0x72, 0xfd, 0x71, 0xfe, 0x50, 0xdf, 0x53, 0xdc, 0x56, 0xd9, - 0x55, 0xda, 0x5c, 0xd3, 0x5f, 0xd0, 0x5a, 0xd5, 0x59, 0xd6, - 0x48, 0xc7, 0x4b, 0xc4, 0x4e, 0xc1, 0x4d, 0xc2, 0x44, 0xcb, - 0x47, 0xc8, 0x42, 0xcd, 0x41, 0xce, 0xc0, 0x4f, 0xc3, 0x4c, - 0xc6, 0x49, 0xc5, 0x4a, 0xcc, 0x43, 0xcf, 0x40, 0xca, 0x45, - 0xc9, 0x46, 0xd8, 0x57, 0xdb, 0x54, 0xde, 0x51, 0xdd, 0x52, - 0xd4, 0x5b, 0xd7, 0x58, 0xd2, 0x5d, 0xd1, 0x5e, 0xf0, 0x7f, - 0xf3, 0x7c, 0xf6, 0x79, 0xf5, 0x7a, 0xfc, 0x73, 0xff, 0x70, - 0xfa, 0x75, 0xf9, 0x76, 0xe8, 0x67, 0xeb, 0x64, 0xee, 0x61, - 0xed, 0x62, 0xe4, 0x6b, 0xe7, 0x68, 0xe2, 0x6d, 0xe1, 0x6e, - 0xa0, 0x2f, 0xa3, 0x2c, 0xa6, 0x29, 0xa5, 0x2a, 0xac, 0x23, - 0xaf, 0x20, 0xaa, 0x25, 0xa9, 0x26, 0xb8, 0x37, 0xbb, 0x34, - 0xbe, 0x31, 0xbd, 0x32, 0xb4, 0x3b, 0xb7, 0x38, 0xb2, 0x3d, - 0xb1, 0x3e, 0x90, 0x1f, 0x93, 0x1c, 0x96, 0x19, 0x95, 0x1a, - 0x9c, 0x13, 0x9f, 0x10, 0x9a, 0x15, 0x99, 0x16, 0x88, 0x07, - 0x8b, 0x04, 0x8e, 0x01, 0x8d, 0x02, 0x84, 0x0b, 0x87, 0x08, - 0x82, 0x0d, 0x81, 0x0e, 0x00, 0x90, 0x3d, 0xad, 0x7a, 0xea, - 0x47, 0xd7, 0xf4, 0x64, 0xc9, 0x59, 0x8e, 0x1e, 0xb3, 0x23, - 0xf5, 0x65, 0xc8, 0x58, 0x8f, 0x1f, 0xb2, 0x22, 0x01, 0x91, - 0x3c, 0xac, 0x7b, 0xeb, 0x46, 0xd6, 0xf7, 0x67, 0xca, 0x5a, - 0x8d, 0x1d, 0xb0, 0x20, 0x03, 0x93, 0x3e, 0xae, 0x79, 0xe9, - 0x44, 0xd4, 0x02, 0x92, 0x3f, 0xaf, 0x78, 0xe8, 0x45, 0xd5, - 0xf6, 0x66, 0xcb, 0x5b, 0x8c, 0x1c, 0xb1, 0x21, 0xf3, 0x63, - 0xce, 0x5e, 0x89, 0x19, 0xb4, 0x24, 0x07, 0x97, 0x3a, 0xaa, - 0x7d, 0xed, 0x40, 0xd0, 0x06, 0x96, 0x3b, 0xab, 0x7c, 0xec, - 0x41, 0xd1, 0xf2, 0x62, 0xcf, 0x5f, 0x88, 0x18, 0xb5, 0x25, - 0x04, 0x94, 0x39, 0xa9, 0x7e, 0xee, 0x43, 0xd3, 0xf0, 0x60, - 0xcd, 0x5d, 0x8a, 0x1a, 0xb7, 0x27, 0xf1, 0x61, 0xcc, 0x5c, - 0x8b, 0x1b, 0xb6, 0x26, 0x05, 0x95, 0x38, 0xa8, 0x7f, 0xef, - 0x42, 0xd2, 0xfb, 0x6b, 0xc6, 0x56, 0x81, 0x11, 0xbc, 0x2c, - 0x0f, 0x9f, 0x32, 0xa2, 0x75, 0xe5, 0x48, 0xd8, 0x0e, 0x9e, - 0x33, 0xa3, 0x74, 0xe4, 0x49, 0xd9, 0xfa, 0x6a, 0xc7, 0x57, - 0x80, 0x10, 0xbd, 0x2d, 0x0c, 0x9c, 0x31, 0xa1, 0x76, 0xe6, - 0x4b, 0xdb, 0xf8, 0x68, 0xc5, 0x55, 0x82, 0x12, 0xbf, 0x2f, - 0xf9, 0x69, 0xc4, 0x54, 0x83, 0x13, 0xbe, 0x2e, 0x0d, 0x9d, - 0x30, 0xa0, 0x77, 0xe7, 0x4a, 0xda, 0x08, 0x98, 0x35, 0xa5, - 0x72, 0xe2, 0x4f, 0xdf, 0xfc, 0x6c, 0xc1, 0x51, 0x86, 0x16, - 0xbb, 0x2b, 0xfd, 0x6d, 0xc0, 0x50, 0x87, 0x17, 0xba, 0x2a, - 0x09, 0x99, 0x34, 0xa4, 0x73, 0xe3, 0x4e, 0xde, 0xff, 0x6f, - 0xc2, 0x52, 0x85, 0x15, 0xb8, 0x28, 0x0b, 0x9b, 0x36, 0xa6, - 0x71, 0xe1, 0x4c, 0xdc, 0x0a, 0x9a, 0x37, 0xa7, 0x70, 0xe0, - 0x4d, 0xdd, 0xfe, 0x6e, 0xc3, 0x53, 0x84, 0x14, 0xb9, 0x29, - 0x00, 0x91, 0x3f, 0xae, 0x7e, 0xef, 0x41, 0xd0, 0xfc, 0x6d, - 0xc3, 0x52, 0x82, 0x13, 0xbd, 0x2c, 0xe5, 0x74, 0xda, 0x4b, - 0x9b, 0x0a, 0xa4, 0x35, 0x19, 0x88, 0x26, 0xb7, 0x67, 0xf6, - 0x58, 0xc9, 0xd7, 0x46, 0xe8, 0x79, 0xa9, 0x38, 0x96, 0x07, - 0x2b, 0xba, 0x14, 0x85, 0x55, 0xc4, 0x6a, 0xfb, 0x32, 0xa3, - 0x0d, 0x9c, 0x4c, 0xdd, 0x73, 0xe2, 0xce, 0x5f, 0xf1, 0x60, - 0xb0, 0x21, 0x8f, 0x1e, 0xb3, 0x22, 0x8c, 0x1d, 0xcd, 0x5c, - 0xf2, 0x63, 0x4f, 0xde, 0x70, 0xe1, 0x31, 0xa0, 0x0e, 0x9f, - 0x56, 0xc7, 0x69, 0xf8, 0x28, 0xb9, 0x17, 0x86, 0xaa, 0x3b, - 0x95, 0x04, 0xd4, 0x45, 0xeb, 0x7a, 0x64, 0xf5, 0x5b, 0xca, - 0x1a, 0x8b, 0x25, 0xb4, 0x98, 0x09, 0xa7, 0x36, 0xe6, 0x77, - 0xd9, 0x48, 0x81, 0x10, 0xbe, 0x2f, 0xff, 0x6e, 0xc0, 0x51, - 0x7d, 0xec, 0x42, 0xd3, 0x03, 0x92, 0x3c, 0xad, 0x7b, 0xea, - 0x44, 0xd5, 0x05, 0x94, 0x3a, 0xab, 0x87, 0x16, 0xb8, 0x29, - 0xf9, 0x68, 0xc6, 0x57, 0x9e, 0x0f, 0xa1, 0x30, 0xe0, 0x71, - 0xdf, 0x4e, 0x62, 0xf3, 0x5d, 0xcc, 0x1c, 0x8d, 0x23, 0xb2, - 0xac, 0x3d, 0x93, 0x02, 0xd2, 0x43, 0xed, 0x7c, 0x50, 0xc1, - 0x6f, 0xfe, 0x2e, 0xbf, 0x11, 0x80, 0x49, 0xd8, 0x76, 0xe7, - 0x37, 0xa6, 0x08, 0x99, 0xb5, 0x24, 0x8a, 0x1b, 0xcb, 0x5a, - 0xf4, 0x65, 0xc8, 0x59, 0xf7, 0x66, 0xb6, 0x27, 0x89, 0x18, - 0x34, 0xa5, 0x0b, 0x9a, 0x4a, 0xdb, 0x75, 0xe4, 0x2d, 0xbc, - 0x12, 0x83, 0x53, 0xc2, 0x6c, 0xfd, 0xd1, 0x40, 0xee, 0x7f, - 0xaf, 0x3e, 0x90, 0x01, 0x1f, 0x8e, 0x20, 0xb1, 0x61, 0xf0, - 0x5e, 0xcf, 0xe3, 0x72, 0xdc, 0x4d, 0x9d, 0x0c, 0xa2, 0x33, - 0xfa, 0x6b, 0xc5, 0x54, 0x84, 0x15, 0xbb, 0x2a, 0x06, 0x97, - 0x39, 0xa8, 0x78, 0xe9, 0x47, 0xd6, 0x00, 0x92, 0x39, 0xab, - 0x72, 0xe0, 0x4b, 0xd9, 0xe4, 0x76, 0xdd, 0x4f, 0x96, 0x04, - 0xaf, 0x3d, 0xd5, 0x47, 0xec, 0x7e, 0xa7, 0x35, 0x9e, 0x0c, - 0x31, 0xa3, 0x08, 0x9a, 0x43, 0xd1, 0x7a, 0xe8, 0xb7, 0x25, - 0x8e, 0x1c, 0xc5, 0x57, 0xfc, 0x6e, 0x53, 0xc1, 0x6a, 0xf8, - 0x21, 0xb3, 0x18, 0x8a, 0x62, 0xf0, 0x5b, 0xc9, 0x10, 0x82, - 0x29, 0xbb, 0x86, 0x14, 0xbf, 0x2d, 0xf4, 0x66, 0xcd, 0x5f, - 0x73, 0xe1, 0x4a, 0xd8, 0x01, 0x93, 0x38, 0xaa, 0x97, 0x05, - 0xae, 0x3c, 0xe5, 0x77, 0xdc, 0x4e, 0xa6, 0x34, 0x9f, 0x0d, - 0xd4, 0x46, 0xed, 0x7f, 0x42, 0xd0, 0x7b, 0xe9, 0x30, 0xa2, - 0x09, 0x9b, 0xc4, 0x56, 0xfd, 0x6f, 0xb6, 0x24, 0x8f, 0x1d, - 0x20, 0xb2, 0x19, 0x8b, 0x52, 0xc0, 0x6b, 0xf9, 0x11, 0x83, - 0x28, 0xba, 0x63, 0xf1, 0x5a, 0xc8, 0xf5, 0x67, 0xcc, 0x5e, - 0x87, 0x15, 0xbe, 0x2c, 0xe6, 0x74, 0xdf, 0x4d, 0x94, 0x06, - 0xad, 0x3f, 0x02, 0x90, 0x3b, 0xa9, 0x70, 0xe2, 0x49, 0xdb, - 0x33, 0xa1, 0x0a, 0x98, 0x41, 0xd3, 0x78, 0xea, 0xd7, 0x45, - 0xee, 0x7c, 0xa5, 0x37, 0x9c, 0x0e, 0x51, 0xc3, 0x68, 0xfa, - 0x23, 0xb1, 0x1a, 0x88, 0xb5, 0x27, 0x8c, 0x1e, 0xc7, 0x55, - 0xfe, 0x6c, 0x84, 0x16, 0xbd, 0x2f, 0xf6, 0x64, 0xcf, 0x5d, - 0x60, 0xf2, 0x59, 0xcb, 0x12, 0x80, 0x2b, 0xb9, 0x95, 0x07, - 0xac, 0x3e, 0xe7, 0x75, 0xde, 0x4c, 0x71, 0xe3, 0x48, 0xda, - 0x03, 0x91, 0x3a, 0xa8, 0x40, 0xd2, 0x79, 0xeb, 0x32, 0xa0, - 0x0b, 0x99, 0xa4, 0x36, 0x9d, 0x0f, 0xd6, 0x44, 0xef, 0x7d, - 0x22, 0xb0, 0x1b, 0x89, 0x50, 0xc2, 0x69, 0xfb, 0xc6, 0x54, - 0xff, 0x6d, 0xb4, 0x26, 0x8d, 0x1f, 0xf7, 0x65, 0xce, 0x5c, - 0x85, 0x17, 0xbc, 0x2e, 0x13, 0x81, 0x2a, 0xb8, 0x61, 0xf3, - 0x58, 0xca, 0x00, 0x93, 0x3b, 0xa8, 0x76, 0xe5, 0x4d, 0xde, - 0xec, 0x7f, 0xd7, 0x44, 0x9a, 0x09, 0xa1, 0x32, 0xc5, 0x56, - 0xfe, 0x6d, 0xb3, 0x20, 0x88, 0x1b, 0x29, 0xba, 0x12, 0x81, - 0x5f, 0xcc, 0x64, 0xf7, 0x97, 0x04, 0xac, 0x3f, 0xe1, 0x72, - 0xda, 0x49, 0x7b, 0xe8, 0x40, 0xd3, 0x0d, 0x9e, 0x36, 0xa5, - 0x52, 0xc1, 0x69, 0xfa, 0x24, 0xb7, 0x1f, 0x8c, 0xbe, 0x2d, - 0x85, 0x16, 0xc8, 0x5b, 0xf3, 0x60, 0x33, 0xa0, 0x08, 0x9b, - 0x45, 0xd6, 0x7e, 0xed, 0xdf, 0x4c, 0xe4, 0x77, 0xa9, 0x3a, - 0x92, 0x01, 0xf6, 0x65, 0xcd, 0x5e, 0x80, 0x13, 0xbb, 0x28, - 0x1a, 0x89, 0x21, 0xb2, 0x6c, 0xff, 0x57, 0xc4, 0xa4, 0x37, - 0x9f, 0x0c, 0xd2, 0x41, 0xe9, 0x7a, 0x48, 0xdb, 0x73, 0xe0, - 0x3e, 0xad, 0x05, 0x96, 0x61, 0xf2, 0x5a, 0xc9, 0x17, 0x84, - 0x2c, 0xbf, 0x8d, 0x1e, 0xb6, 0x25, 0xfb, 0x68, 0xc0, 0x53, - 0x66, 0xf5, 0x5d, 0xce, 0x10, 0x83, 0x2b, 0xb8, 0x8a, 0x19, - 0xb1, 0x22, 0xfc, 0x6f, 0xc7, 0x54, 0xa3, 0x30, 0x98, 0x0b, - 0xd5, 0x46, 0xee, 0x7d, 0x4f, 0xdc, 0x74, 0xe7, 0x39, 0xaa, - 0x02, 0x91, 0xf1, 0x62, 0xca, 0x59, 0x87, 0x14, 0xbc, 0x2f, - 0x1d, 0x8e, 0x26, 0xb5, 0x6b, 0xf8, 0x50, 0xc3, 0x34, 0xa7, - 0x0f, 0x9c, 0x42, 0xd1, 0x79, 0xea, 0xd8, 0x4b, 0xe3, 0x70, - 0xae, 0x3d, 0x95, 0x06, 0x55, 0xc6, 0x6e, 0xfd, 0x23, 0xb0, - 0x18, 0x8b, 0xb9, 0x2a, 0x82, 0x11, 0xcf, 0x5c, 0xf4, 0x67, - 0x90, 0x03, 0xab, 0x38, 0xe6, 0x75, 0xdd, 0x4e, 0x7c, 0xef, - 0x47, 0xd4, 0x0a, 0x99, 0x31, 0xa2, 0xc2, 0x51, 0xf9, 0x6a, - 0xb4, 0x27, 0x8f, 0x1c, 0x2e, 0xbd, 0x15, 0x86, 0x58, 0xcb, - 0x63, 0xf0, 0x07, 0x94, 0x3c, 0xaf, 0x71, 0xe2, 0x4a, 0xd9, - 0xeb, 0x78, 0xd0, 0x43, 0x9d, 0x0e, 0xa6, 0x35, 0x00, 0x94, - 0x35, 0xa1, 0x6a, 0xfe, 0x5f, 0xcb, 0xd4, 0x40, 0xe1, 0x75, - 0xbe, 0x2a, 0x8b, 0x1f, 0xb5, 0x21, 0x80, 0x14, 0xdf, 0x4b, - 0xea, 0x7e, 0x61, 0xf5, 0x54, 0xc0, 0x0b, 0x9f, 0x3e, 0xaa, - 0x77, 0xe3, 0x42, 0xd6, 0x1d, 0x89, 0x28, 0xbc, 0xa3, 0x37, - 0x96, 0x02, 0xc9, 0x5d, 0xfc, 0x68, 0xc2, 0x56, 0xf7, 0x63, - 0xa8, 0x3c, 0x9d, 0x09, 0x16, 0x82, 0x23, 0xb7, 0x7c, 0xe8, - 0x49, 0xdd, 0xee, 0x7a, 0xdb, 0x4f, 0x84, 0x10, 0xb1, 0x25, - 0x3a, 0xae, 0x0f, 0x9b, 0x50, 0xc4, 0x65, 0xf1, 0x5b, 0xcf, - 0x6e, 0xfa, 0x31, 0xa5, 0x04, 0x90, 0x8f, 0x1b, 0xba, 0x2e, - 0xe5, 0x71, 0xd0, 0x44, 0x99, 0x0d, 0xac, 0x38, 0xf3, 0x67, - 0xc6, 0x52, 0x4d, 0xd9, 0x78, 0xec, 0x27, 0xb3, 0x12, 0x86, - 0x2c, 0xb8, 0x19, 0x8d, 0x46, 0xd2, 0x73, 0xe7, 0xf8, 0x6c, - 0xcd, 0x59, 0x92, 0x06, 0xa7, 0x33, 0xc1, 0x55, 0xf4, 0x60, - 0xab, 0x3f, 0x9e, 0x0a, 0x15, 0x81, 0x20, 0xb4, 0x7f, 0xeb, - 0x4a, 0xde, 0x74, 0xe0, 0x41, 0xd5, 0x1e, 0x8a, 0x2b, 0xbf, - 0xa0, 0x34, 0x95, 0x01, 0xca, 0x5e, 0xff, 0x6b, 0xb6, 0x22, - 0x83, 0x17, 0xdc, 0x48, 0xe9, 0x7d, 0x62, 0xf6, 0x57, 0xc3, - 0x08, 0x9c, 0x3d, 0xa9, 0x03, 0x97, 0x36, 0xa2, 0x69, 0xfd, - 0x5c, 0xc8, 0xd7, 0x43, 0xe2, 0x76, 0xbd, 0x29, 0x88, 0x1c, - 0x2f, 0xbb, 0x1a, 0x8e, 0x45, 0xd1, 0x70, 0xe4, 0xfb, 0x6f, - 0xce, 0x5a, 0x91, 0x05, 0xa4, 0x30, 0x9a, 0x0e, 0xaf, 0x3b, - 0xf0, 0x64, 0xc5, 0x51, 0x4e, 0xda, 0x7b, 0xef, 0x24, 0xb0, - 0x11, 0x85, 0x58, 0xcc, 0x6d, 0xf9, 0x32, 0xa6, 0x07, 0x93, - 0x8c, 0x18, 0xb9, 0x2d, 0xe6, 0x72, 0xd3, 0x47, 0xed, 0x79, - 0xd8, 0x4c, 0x87, 0x13, 0xb2, 0x26, 0x39, 0xad, 0x0c, 0x98, - 0x53, 0xc7, 0x66, 0xf2, 0x00, 0x95, 0x37, 0xa2, 0x6e, 0xfb, - 0x59, 0xcc, 0xdc, 0x49, 0xeb, 0x7e, 0xb2, 0x27, 0x85, 0x10, - 0xa5, 0x30, 0x92, 0x07, 0xcb, 0x5e, 0xfc, 0x69, 0x79, 0xec, - 0x4e, 0xdb, 0x17, 0x82, 0x20, 0xb5, 0x57, 0xc2, 0x60, 0xf5, - 0x39, 0xac, 0x0e, 0x9b, 0x8b, 0x1e, 0xbc, 0x29, 0xe5, 0x70, - 0xd2, 0x47, 0xf2, 0x67, 0xc5, 0x50, 0x9c, 0x09, 0xab, 0x3e, - 0x2e, 0xbb, 0x19, 0x8c, 0x40, 0xd5, 0x77, 0xe2, 0xae, 0x3b, - 0x99, 0x0c, 0xc0, 0x55, 0xf7, 0x62, 0x72, 0xe7, 0x45, 0xd0, - 0x1c, 0x89, 0x2b, 0xbe, 0x0b, 0x9e, 0x3c, 0xa9, 0x65, 0xf0, - 0x52, 0xc7, 0xd7, 0x42, 0xe0, 0x75, 0xb9, 0x2c, 0x8e, 0x1b, - 0xf9, 0x6c, 0xce, 0x5b, 0x97, 0x02, 0xa0, 0x35, 0x25, 0xb0, - 0x12, 0x87, 0x4b, 0xde, 0x7c, 0xe9, 0x5c, 0xc9, 0x6b, 0xfe, - 0x32, 0xa7, 0x05, 0x90, 0x80, 0x15, 0xb7, 0x22, 0xee, 0x7b, - 0xd9, 0x4c, 0x41, 0xd4, 0x76, 0xe3, 0x2f, 0xba, 0x18, 0x8d, - 0x9d, 0x08, 0xaa, 0x3f, 0xf3, 0x66, 0xc4, 0x51, 0xe4, 0x71, - 0xd3, 0x46, 0x8a, 0x1f, 0xbd, 0x28, 0x38, 0xad, 0x0f, 0x9a, - 0x56, 0xc3, 0x61, 0xf4, 0x16, 0x83, 0x21, 0xb4, 0x78, 0xed, - 0x4f, 0xda, 0xca, 0x5f, 0xfd, 0x68, 0xa4, 0x31, 0x93, 0x06, - 0xb3, 0x26, 0x84, 0x11, 0xdd, 0x48, 0xea, 0x7f, 0x6f, 0xfa, - 0x58, 0xcd, 0x01, 0x94, 0x36, 0xa3, 0xef, 0x7a, 0xd8, 0x4d, - 0x81, 0x14, 0xb6, 0x23, 0x33, 0xa6, 0x04, 0x91, 0x5d, 0xc8, - 0x6a, 0xff, 0x4a, 0xdf, 0x7d, 0xe8, 0x24, 0xb1, 0x13, 0x86, - 0x96, 0x03, 0xa1, 0x34, 0xf8, 0x6d, 0xcf, 0x5a, 0xb8, 0x2d, - 0x8f, 0x1a, 0xd6, 0x43, 0xe1, 0x74, 0x64, 0xf1, 0x53, 0xc6, - 0x0a, 0x9f, 0x3d, 0xa8, 0x1d, 0x88, 0x2a, 0xbf, 0x73, 0xe6, - 0x44, 0xd1, 0xc1, 0x54, 0xf6, 0x63, 0xaf, 0x3a, 0x98, 0x0d, - 0x00, 0x96, 0x31, 0xa7, 0x62, 0xf4, 0x53, 0xc5, 0xc4, 0x52, - 0xf5, 0x63, 0xa6, 0x30, 0x97, 0x01, 0x95, 0x03, 0xa4, 0x32, - 0xf7, 0x61, 0xc6, 0x50, 0x51, 0xc7, 0x60, 0xf6, 0x33, 0xa5, - 0x02, 0x94, 0x37, 0xa1, 0x06, 0x90, 0x55, 0xc3, 0x64, 0xf2, - 0xf3, 0x65, 0xc2, 0x54, 0x91, 0x07, 0xa0, 0x36, 0xa2, 0x34, - 0x93, 0x05, 0xc0, 0x56, 0xf1, 0x67, 0x66, 0xf0, 0x57, 0xc1, - 0x04, 0x92, 0x35, 0xa3, 0x6e, 0xf8, 0x5f, 0xc9, 0x0c, 0x9a, - 0x3d, 0xab, 0xaa, 0x3c, 0x9b, 0x0d, 0xc8, 0x5e, 0xf9, 0x6f, - 0xfb, 0x6d, 0xca, 0x5c, 0x99, 0x0f, 0xa8, 0x3e, 0x3f, 0xa9, - 0x0e, 0x98, 0x5d, 0xcb, 0x6c, 0xfa, 0x59, 0xcf, 0x68, 0xfe, - 0x3b, 0xad, 0x0a, 0x9c, 0x9d, 0x0b, 0xac, 0x3a, 0xff, 0x69, - 0xce, 0x58, 0xcc, 0x5a, 0xfd, 0x6b, 0xae, 0x38, 0x9f, 0x09, - 0x08, 0x9e, 0x39, 0xaf, 0x6a, 0xfc, 0x5b, 0xcd, 0xdc, 0x4a, - 0xed, 0x7b, 0xbe, 0x28, 0x8f, 0x19, 0x18, 0x8e, 0x29, 0xbf, - 0x7a, 0xec, 0x4b, 0xdd, 0x49, 0xdf, 0x78, 0xee, 0x2b, 0xbd, - 0x1a, 0x8c, 0x8d, 0x1b, 0xbc, 0x2a, 0xef, 0x79, 0xde, 0x48, - 0xeb, 0x7d, 0xda, 0x4c, 0x89, 0x1f, 0xb8, 0x2e, 0x2f, 0xb9, - 0x1e, 0x88, 0x4d, 0xdb, 0x7c, 0xea, 0x7e, 0xe8, 0x4f, 0xd9, - 0x1c, 0x8a, 0x2d, 0xbb, 0xba, 0x2c, 0x8b, 0x1d, 0xd8, 0x4e, - 0xe9, 0x7f, 0xb2, 0x24, 0x83, 0x15, 0xd0, 0x46, 0xe1, 0x77, - 0x76, 0xe0, 0x47, 0xd1, 0x14, 0x82, 0x25, 0xb3, 0x27, 0xb1, - 0x16, 0x80, 0x45, 0xd3, 0x74, 0xe2, 0xe3, 0x75, 0xd2, 0x44, - 0x81, 0x17, 0xb0, 0x26, 0x85, 0x13, 0xb4, 0x22, 0xe7, 0x71, - 0xd6, 0x40, 0x41, 0xd7, 0x70, 0xe6, 0x23, 0xb5, 0x12, 0x84, - 0x10, 0x86, 0x21, 0xb7, 0x72, 0xe4, 0x43, 0xd5, 0xd4, 0x42, - 0xe5, 0x73, 0xb6, 0x20, 0x87, 0x11, 0x00, 0x97, 0x33, 0xa4, - 0x66, 0xf1, 0x55, 0xc2, 0xcc, 0x5b, 0xff, 0x68, 0xaa, 0x3d, - 0x99, 0x0e, 0x85, 0x12, 0xb6, 0x21, 0xe3, 0x74, 0xd0, 0x47, - 0x49, 0xde, 0x7a, 0xed, 0x2f, 0xb8, 0x1c, 0x8b, 0x17, 0x80, - 0x24, 0xb3, 0x71, 0xe6, 0x42, 0xd5, 0xdb, 0x4c, 0xe8, 0x7f, - 0xbd, 0x2a, 0x8e, 0x19, 0x92, 0x05, 0xa1, 0x36, 0xf4, 0x63, - 0xc7, 0x50, 0x5e, 0xc9, 0x6d, 0xfa, 0x38, 0xaf, 0x0b, 0x9c, - 0x2e, 0xb9, 0x1d, 0x8a, 0x48, 0xdf, 0x7b, 0xec, 0xe2, 0x75, - 0xd1, 0x46, 0x84, 0x13, 0xb7, 0x20, 0xab, 0x3c, 0x98, 0x0f, - 0xcd, 0x5a, 0xfe, 0x69, 0x67, 0xf0, 0x54, 0xc3, 0x01, 0x96, - 0x32, 0xa5, 0x39, 0xae, 0x0a, 0x9d, 0x5f, 0xc8, 0x6c, 0xfb, - 0xf5, 0x62, 0xc6, 0x51, 0x93, 0x04, 0xa0, 0x37, 0xbc, 0x2b, - 0x8f, 0x18, 0xda, 0x4d, 0xe9, 0x7e, 0x70, 0xe7, 0x43, 0xd4, - 0x16, 0x81, 0x25, 0xb2, 0x5c, 0xcb, 0x6f, 0xf8, 0x3a, 0xad, - 0x09, 0x9e, 0x90, 0x07, 0xa3, 0x34, 0xf6, 0x61, 0xc5, 0x52, - 0xd9, 0x4e, 0xea, 0x7d, 0xbf, 0x28, 0x8c, 0x1b, 0x15, 0x82, - 0x26, 0xb1, 0x73, 0xe4, 0x40, 0xd7, 0x4b, 0xdc, 0x78, 0xef, - 0x2d, 0xba, 0x1e, 0x89, 0x87, 0x10, 0xb4, 0x23, 0xe1, 0x76, - 0xd2, 0x45, 0xce, 0x59, 0xfd, 0x6a, 0xa8, 0x3f, 0x9b, 0x0c, - 0x02, 0x95, 0x31, 0xa6, 0x64, 0xf3, 0x57, 0xc0, 0x72, 0xe5, - 0x41, 0xd6, 0x14, 0x83, 0x27, 0xb0, 0xbe, 0x29, 0x8d, 0x1a, - 0xd8, 0x4f, 0xeb, 0x7c, 0xf7, 0x60, 0xc4, 0x53, 0x91, 0x06, - 0xa2, 0x35, 0x3b, 0xac, 0x08, 0x9f, 0x5d, 0xca, 0x6e, 0xf9, - 0x65, 0xf2, 0x56, 0xc1, 0x03, 0x94, 0x30, 0xa7, 0xa9, 0x3e, - 0x9a, 0x0d, 0xcf, 0x58, 0xfc, 0x6b, 0xe0, 0x77, 0xd3, 0x44, - 0x86, 0x11, 0xb5, 0x22, 0x2c, 0xbb, 0x1f, 0x88, 0x4a, 0xdd, - 0x79, 0xee, 0x00, 0x98, 0x2d, 0xb5, 0x5a, 0xc2, 0x77, 0xef, - 0xb4, 0x2c, 0x99, 0x01, 0xee, 0x76, 0xc3, 0x5b, 0x75, 0xed, - 0x58, 0xc0, 0x2f, 0xb7, 0x02, 0x9a, 0xc1, 0x59, 0xec, 0x74, - 0x9b, 0x03, 0xb6, 0x2e, 0xea, 0x72, 0xc7, 0x5f, 0xb0, 0x28, - 0x9d, 0x05, 0x5e, 0xc6, 0x73, 0xeb, 0x04, 0x9c, 0x29, 0xb1, - 0x9f, 0x07, 0xb2, 0x2a, 0xc5, 0x5d, 0xe8, 0x70, 0x2b, 0xb3, - 0x06, 0x9e, 0x71, 0xe9, 0x5c, 0xc4, 0xc9, 0x51, 0xe4, 0x7c, - 0x93, 0x0b, 0xbe, 0x26, 0x7d, 0xe5, 0x50, 0xc8, 0x27, 0xbf, - 0x0a, 0x92, 0xbc, 0x24, 0x91, 0x09, 0xe6, 0x7e, 0xcb, 0x53, - 0x08, 0x90, 0x25, 0xbd, 0x52, 0xca, 0x7f, 0xe7, 0x23, 0xbb, - 0x0e, 0x96, 0x79, 0xe1, 0x54, 0xcc, 0x97, 0x0f, 0xba, 0x22, - 0xcd, 0x55, 0xe0, 0x78, 0x56, 0xce, 0x7b, 0xe3, 0x0c, 0x94, - 0x21, 0xb9, 0xe2, 0x7a, 0xcf, 0x57, 0xb8, 0x20, 0x95, 0x0d, - 0x8f, 0x17, 0xa2, 0x3a, 0xd5, 0x4d, 0xf8, 0x60, 0x3b, 0xa3, - 0x16, 0x8e, 0x61, 0xf9, 0x4c, 0xd4, 0xfa, 0x62, 0xd7, 0x4f, - 0xa0, 0x38, 0x8d, 0x15, 0x4e, 0xd6, 0x63, 0xfb, 0x14, 0x8c, - 0x39, 0xa1, 0x65, 0xfd, 0x48, 0xd0, 0x3f, 0xa7, 0x12, 0x8a, - 0xd1, 0x49, 0xfc, 0x64, 0x8b, 0x13, 0xa6, 0x3e, 0x10, 0x88, - 0x3d, 0xa5, 0x4a, 0xd2, 0x67, 0xff, 0xa4, 0x3c, 0x89, 0x11, - 0xfe, 0x66, 0xd3, 0x4b, 0x46, 0xde, 0x6b, 0xf3, 0x1c, 0x84, - 0x31, 0xa9, 0xf2, 0x6a, 0xdf, 0x47, 0xa8, 0x30, 0x85, 0x1d, - 0x33, 0xab, 0x1e, 0x86, 0x69, 0xf1, 0x44, 0xdc, 0x87, 0x1f, - 0xaa, 0x32, 0xdd, 0x45, 0xf0, 0x68, 0xac, 0x34, 0x81, 0x19, - 0xf6, 0x6e, 0xdb, 0x43, 0x18, 0x80, 0x35, 0xad, 0x42, 0xda, - 0x6f, 0xf7, 0xd9, 0x41, 0xf4, 0x6c, 0x83, 0x1b, 0xae, 0x36, - 0x6d, 0xf5, 0x40, 0xd8, 0x37, 0xaf, 0x1a, 0x82, 0x00, 0x99, - 0x2f, 0xb6, 0x5e, 0xc7, 0x71, 0xe8, 0xbc, 0x25, 0x93, 0x0a, - 0xe2, 0x7b, 0xcd, 0x54, 0x65, 0xfc, 0x4a, 0xd3, 0x3b, 0xa2, - 0x14, 0x8d, 0xd9, 0x40, 0xf6, 0x6f, 0x87, 0x1e, 0xa8, 0x31, - 0xca, 0x53, 0xe5, 0x7c, 0x94, 0x0d, 0xbb, 0x22, 0x76, 0xef, - 0x59, 0xc0, 0x28, 0xb1, 0x07, 0x9e, 0xaf, 0x36, 0x80, 0x19, - 0xf1, 0x68, 0xde, 0x47, 0x13, 0x8a, 0x3c, 0xa5, 0x4d, 0xd4, - 0x62, 0xfb, 0x89, 0x10, 0xa6, 0x3f, 0xd7, 0x4e, 0xf8, 0x61, - 0x35, 0xac, 0x1a, 0x83, 0x6b, 0xf2, 0x44, 0xdd, 0xec, 0x75, - 0xc3, 0x5a, 0xb2, 0x2b, 0x9d, 0x04, 0x50, 0xc9, 0x7f, 0xe6, - 0x0e, 0x97, 0x21, 0xb8, 0x43, 0xda, 0x6c, 0xf5, 0x1d, 0x84, - 0x32, 0xab, 0xff, 0x66, 0xd0, 0x49, 0xa1, 0x38, 0x8e, 0x17, - 0x26, 0xbf, 0x09, 0x90, 0x78, 0xe1, 0x57, 0xce, 0x9a, 0x03, - 0xb5, 0x2c, 0xc4, 0x5d, 0xeb, 0x72, 0x0f, 0x96, 0x20, 0xb9, - 0x51, 0xc8, 0x7e, 0xe7, 0xb3, 0x2a, 0x9c, 0x05, 0xed, 0x74, - 0xc2, 0x5b, 0x6a, 0xf3, 0x45, 0xdc, 0x34, 0xad, 0x1b, 0x82, - 0xd6, 0x4f, 0xf9, 0x60, 0x88, 0x11, 0xa7, 0x3e, 0xc5, 0x5c, - 0xea, 0x73, 0x9b, 0x02, 0xb4, 0x2d, 0x79, 0xe0, 0x56, 0xcf, - 0x27, 0xbe, 0x08, 0x91, 0xa0, 0x39, 0x8f, 0x16, 0xfe, 0x67, - 0xd1, 0x48, 0x1c, 0x85, 0x33, 0xaa, 0x42, 0xdb, 0x6d, 0xf4, - 0x86, 0x1f, 0xa9, 0x30, 0xd8, 0x41, 0xf7, 0x6e, 0x3a, 0xa3, - 0x15, 0x8c, 0x64, 0xfd, 0x4b, 0xd2, 0xe3, 0x7a, 0xcc, 0x55, - 0xbd, 0x24, 0x92, 0x0b, 0x5f, 0xc6, 0x70, 0xe9, 0x01, 0x98, - 0x2e, 0xb7, 0x4c, 0xd5, 0x63, 0xfa, 0x12, 0x8b, 0x3d, 0xa4, - 0xf0, 0x69, 0xdf, 0x46, 0xae, 0x37, 0x81, 0x18, 0x29, 0xb0, - 0x06, 0x9f, 0x77, 0xee, 0x58, 0xc1, 0x95, 0x0c, 0xba, 0x23, - 0xcb, 0x52, 0xe4, 0x7d, 0x00, 0x9a, 0x29, 0xb3, 0x52, 0xc8, - 0x7b, 0xe1, 0xa4, 0x3e, 0x8d, 0x17, 0xf6, 0x6c, 0xdf, 0x45, - 0x55, 0xcf, 0x7c, 0xe6, 0x07, 0x9d, 0x2e, 0xb4, 0xf1, 0x6b, - 0xd8, 0x42, 0xa3, 0x39, 0x8a, 0x10, 0xaa, 0x30, 0x83, 0x19, - 0xf8, 0x62, 0xd1, 0x4b, 0x0e, 0x94, 0x27, 0xbd, 0x5c, 0xc6, - 0x75, 0xef, 0xff, 0x65, 0xd6, 0x4c, 0xad, 0x37, 0x84, 0x1e, - 0x5b, 0xc1, 0x72, 0xe8, 0x09, 0x93, 0x20, 0xba, 0x49, 0xd3, - 0x60, 0xfa, 0x1b, 0x81, 0x32, 0xa8, 0xed, 0x77, 0xc4, 0x5e, - 0xbf, 0x25, 0x96, 0x0c, 0x1c, 0x86, 0x35, 0xaf, 0x4e, 0xd4, - 0x67, 0xfd, 0xb8, 0x22, 0x91, 0x0b, 0xea, 0x70, 0xc3, 0x59, - 0xe3, 0x79, 0xca, 0x50, 0xb1, 0x2b, 0x98, 0x02, 0x47, 0xdd, - 0x6e, 0xf4, 0x15, 0x8f, 0x3c, 0xa6, 0xb6, 0x2c, 0x9f, 0x05, - 0xe4, 0x7e, 0xcd, 0x57, 0x12, 0x88, 0x3b, 0xa1, 0x40, 0xda, - 0x69, 0xf3, 0x92, 0x08, 0xbb, 0x21, 0xc0, 0x5a, 0xe9, 0x73, - 0x36, 0xac, 0x1f, 0x85, 0x64, 0xfe, 0x4d, 0xd7, 0xc7, 0x5d, - 0xee, 0x74, 0x95, 0x0f, 0xbc, 0x26, 0x63, 0xf9, 0x4a, 0xd0, - 0x31, 0xab, 0x18, 0x82, 0x38, 0xa2, 0x11, 0x8b, 0x6a, 0xf0, - 0x43, 0xd9, 0x9c, 0x06, 0xb5, 0x2f, 0xce, 0x54, 0xe7, 0x7d, - 0x6d, 0xf7, 0x44, 0xde, 0x3f, 0xa5, 0x16, 0x8c, 0xc9, 0x53, - 0xe0, 0x7a, 0x9b, 0x01, 0xb2, 0x28, 0xdb, 0x41, 0xf2, 0x68, - 0x89, 0x13, 0xa0, 0x3a, 0x7f, 0xe5, 0x56, 0xcc, 0x2d, 0xb7, - 0x04, 0x9e, 0x8e, 0x14, 0xa7, 0x3d, 0xdc, 0x46, 0xf5, 0x6f, - 0x2a, 0xb0, 0x03, 0x99, 0x78, 0xe2, 0x51, 0xcb, 0x71, 0xeb, - 0x58, 0xc2, 0x23, 0xb9, 0x0a, 0x90, 0xd5, 0x4f, 0xfc, 0x66, - 0x87, 0x1d, 0xae, 0x34, 0x24, 0xbe, 0x0d, 0x97, 0x76, 0xec, - 0x5f, 0xc5, 0x80, 0x1a, 0xa9, 0x33, 0xd2, 0x48, 0xfb, 0x61, - 0x00, 0x9b, 0x2b, 0xb0, 0x56, 0xcd, 0x7d, 0xe6, 0xac, 0x37, - 0x87, 0x1c, 0xfa, 0x61, 0xd1, 0x4a, 0x45, 0xde, 0x6e, 0xf5, - 0x13, 0x88, 0x38, 0xa3, 0xe9, 0x72, 0xc2, 0x59, 0xbf, 0x24, - 0x94, 0x0f, 0x8a, 0x11, 0xa1, 0x3a, 0xdc, 0x47, 0xf7, 0x6c, - 0x26, 0xbd, 0x0d, 0x96, 0x70, 0xeb, 0x5b, 0xc0, 0xcf, 0x54, - 0xe4, 0x7f, 0x99, 0x02, 0xb2, 0x29, 0x63, 0xf8, 0x48, 0xd3, - 0x35, 0xae, 0x1e, 0x85, 0x09, 0x92, 0x22, 0xb9, 0x5f, 0xc4, - 0x74, 0xef, 0xa5, 0x3e, 0x8e, 0x15, 0xf3, 0x68, 0xd8, 0x43, - 0x4c, 0xd7, 0x67, 0xfc, 0x1a, 0x81, 0x31, 0xaa, 0xe0, 0x7b, - 0xcb, 0x50, 0xb6, 0x2d, 0x9d, 0x06, 0x83, 0x18, 0xa8, 0x33, - 0xd5, 0x4e, 0xfe, 0x65, 0x2f, 0xb4, 0x04, 0x9f, 0x79, 0xe2, - 0x52, 0xc9, 0xc6, 0x5d, 0xed, 0x76, 0x90, 0x0b, 0xbb, 0x20, - 0x6a, 0xf1, 0x41, 0xda, 0x3c, 0xa7, 0x17, 0x8c, 0x12, 0x89, - 0x39, 0xa2, 0x44, 0xdf, 0x6f, 0xf4, 0xbe, 0x25, 0x95, 0x0e, - 0xe8, 0x73, 0xc3, 0x58, 0x57, 0xcc, 0x7c, 0xe7, 0x01, 0x9a, - 0x2a, 0xb1, 0xfb, 0x60, 0xd0, 0x4b, 0xad, 0x36, 0x86, 0x1d, - 0x98, 0x03, 0xb3, 0x28, 0xce, 0x55, 0xe5, 0x7e, 0x34, 0xaf, - 0x1f, 0x84, 0x62, 0xf9, 0x49, 0xd2, 0xdd, 0x46, 0xf6, 0x6d, - 0x8b, 0x10, 0xa0, 0x3b, 0x71, 0xea, 0x5a, 0xc1, 0x27, 0xbc, - 0x0c, 0x97, 0x1b, 0x80, 0x30, 0xab, 0x4d, 0xd6, 0x66, 0xfd, - 0xb7, 0x2c, 0x9c, 0x07, 0xe1, 0x7a, 0xca, 0x51, 0x5e, 0xc5, - 0x75, 0xee, 0x08, 0x93, 0x23, 0xb8, 0xf2, 0x69, 0xd9, 0x42, - 0xa4, 0x3f, 0x8f, 0x14, 0x91, 0x0a, 0xba, 0x21, 0xc7, 0x5c, - 0xec, 0x77, 0x3d, 0xa6, 0x16, 0x8d, 0x6b, 0xf0, 0x40, 0xdb, - 0xd4, 0x4f, 0xff, 0x64, 0x82, 0x19, 0xa9, 0x32, 0x78, 0xe3, - 0x53, 0xc8, 0x2e, 0xb5, 0x05, 0x9e, 0x00, 0x9c, 0x25, 0xb9, - 0x4a, 0xd6, 0x6f, 0xf3, 0x94, 0x08, 0xb1, 0x2d, 0xde, 0x42, - 0xfb, 0x67, 0x35, 0xa9, 0x10, 0x8c, 0x7f, 0xe3, 0x5a, 0xc6, - 0xa1, 0x3d, 0x84, 0x18, 0xeb, 0x77, 0xce, 0x52, 0x6a, 0xf6, - 0x4f, 0xd3, 0x20, 0xbc, 0x05, 0x99, 0xfe, 0x62, 0xdb, 0x47, - 0xb4, 0x28, 0x91, 0x0d, 0x5f, 0xc3, 0x7a, 0xe6, 0x15, 0x89, - 0x30, 0xac, 0xcb, 0x57, 0xee, 0x72, 0x81, 0x1d, 0xa4, 0x38, - 0xd4, 0x48, 0xf1, 0x6d, 0x9e, 0x02, 0xbb, 0x27, 0x40, 0xdc, - 0x65, 0xf9, 0x0a, 0x96, 0x2f, 0xb3, 0xe1, 0x7d, 0xc4, 0x58, - 0xab, 0x37, 0x8e, 0x12, 0x75, 0xe9, 0x50, 0xcc, 0x3f, 0xa3, - 0x1a, 0x86, 0xbe, 0x22, 0x9b, 0x07, 0xf4, 0x68, 0xd1, 0x4d, - 0x2a, 0xb6, 0x0f, 0x93, 0x60, 0xfc, 0x45, 0xd9, 0x8b, 0x17, - 0xae, 0x32, 0xc1, 0x5d, 0xe4, 0x78, 0x1f, 0x83, 0x3a, 0xa6, - 0x55, 0xc9, 0x70, 0xec, 0xb5, 0x29, 0x90, 0x0c, 0xff, 0x63, - 0xda, 0x46, 0x21, 0xbd, 0x04, 0x98, 0x6b, 0xf7, 0x4e, 0xd2, - 0x80, 0x1c, 0xa5, 0x39, 0xca, 0x56, 0xef, 0x73, 0x14, 0x88, - 0x31, 0xad, 0x5e, 0xc2, 0x7b, 0xe7, 0xdf, 0x43, 0xfa, 0x66, - 0x95, 0x09, 0xb0, 0x2c, 0x4b, 0xd7, 0x6e, 0xf2, 0x01, 0x9d, - 0x24, 0xb8, 0xea, 0x76, 0xcf, 0x53, 0xa0, 0x3c, 0x85, 0x19, - 0x7e, 0xe2, 0x5b, 0xc7, 0x34, 0xa8, 0x11, 0x8d, 0x61, 0xfd, - 0x44, 0xd8, 0x2b, 0xb7, 0x0e, 0x92, 0xf5, 0x69, 0xd0, 0x4c, - 0xbf, 0x23, 0x9a, 0x06, 0x54, 0xc8, 0x71, 0xed, 0x1e, 0x82, - 0x3b, 0xa7, 0xc0, 0x5c, 0xe5, 0x79, 0x8a, 0x16, 0xaf, 0x33, - 0x0b, 0x97, 0x2e, 0xb2, 0x41, 0xdd, 0x64, 0xf8, 0x9f, 0x03, - 0xba, 0x26, 0xd5, 0x49, 0xf0, 0x6c, 0x3e, 0xa2, 0x1b, 0x87, - 0x74, 0xe8, 0x51, 0xcd, 0xaa, 0x36, 0x8f, 0x13, 0xe0, 0x7c, - 0xc5, 0x59, 0x00, 0x9d, 0x27, 0xba, 0x4e, 0xd3, 0x69, 0xf4, - 0x9c, 0x01, 0xbb, 0x26, 0xd2, 0x4f, 0xf5, 0x68, 0x25, 0xb8, - 0x02, 0x9f, 0x6b, 0xf6, 0x4c, 0xd1, 0xb9, 0x24, 0x9e, 0x03, - 0xf7, 0x6a, 0xd0, 0x4d, 0x4a, 0xd7, 0x6d, 0xf0, 0x04, 0x99, - 0x23, 0xbe, 0xd6, 0x4b, 0xf1, 0x6c, 0x98, 0x05, 0xbf, 0x22, - 0x6f, 0xf2, 0x48, 0xd5, 0x21, 0xbc, 0x06, 0x9b, 0xf3, 0x6e, - 0xd4, 0x49, 0xbd, 0x20, 0x9a, 0x07, 0x94, 0x09, 0xb3, 0x2e, - 0xda, 0x47, 0xfd, 0x60, 0x08, 0x95, 0x2f, 0xb2, 0x46, 0xdb, - 0x61, 0xfc, 0xb1, 0x2c, 0x96, 0x0b, 0xff, 0x62, 0xd8, 0x45, - 0x2d, 0xb0, 0x0a, 0x97, 0x63, 0xfe, 0x44, 0xd9, 0xde, 0x43, - 0xf9, 0x64, 0x90, 0x0d, 0xb7, 0x2a, 0x42, 0xdf, 0x65, 0xf8, - 0x0c, 0x91, 0x2b, 0xb6, 0xfb, 0x66, 0xdc, 0x41, 0xb5, 0x28, - 0x92, 0x0f, 0x67, 0xfa, 0x40, 0xdd, 0x29, 0xb4, 0x0e, 0x93, - 0x35, 0xa8, 0x12, 0x8f, 0x7b, 0xe6, 0x5c, 0xc1, 0xa9, 0x34, - 0x8e, 0x13, 0xe7, 0x7a, 0xc0, 0x5d, 0x10, 0x8d, 0x37, 0xaa, - 0x5e, 0xc3, 0x79, 0xe4, 0x8c, 0x11, 0xab, 0x36, 0xc2, 0x5f, - 0xe5, 0x78, 0x7f, 0xe2, 0x58, 0xc5, 0x31, 0xac, 0x16, 0x8b, - 0xe3, 0x7e, 0xc4, 0x59, 0xad, 0x30, 0x8a, 0x17, 0x5a, 0xc7, - 0x7d, 0xe0, 0x14, 0x89, 0x33, 0xae, 0xc6, 0x5b, 0xe1, 0x7c, - 0x88, 0x15, 0xaf, 0x32, 0xa1, 0x3c, 0x86, 0x1b, 0xef, 0x72, - 0xc8, 0x55, 0x3d, 0xa0, 0x1a, 0x87, 0x73, 0xee, 0x54, 0xc9, - 0x84, 0x19, 0xa3, 0x3e, 0xca, 0x57, 0xed, 0x70, 0x18, 0x85, - 0x3f, 0xa2, 0x56, 0xcb, 0x71, 0xec, 0xeb, 0x76, 0xcc, 0x51, - 0xa5, 0x38, 0x82, 0x1f, 0x77, 0xea, 0x50, 0xcd, 0x39, 0xa4, - 0x1e, 0x83, 0xce, 0x53, 0xe9, 0x74, 0x80, 0x1d, 0xa7, 0x3a, - 0x52, 0xcf, 0x75, 0xe8, 0x1c, 0x81, 0x3b, 0xa6, 0x00, 0x9e, - 0x21, 0xbf, 0x42, 0xdc, 0x63, 0xfd, 0x84, 0x1a, 0xa5, 0x3b, - 0xc6, 0x58, 0xe7, 0x79, 0x15, 0x8b, 0x34, 0xaa, 0x57, 0xc9, - 0x76, 0xe8, 0x91, 0x0f, 0xb0, 0x2e, 0xd3, 0x4d, 0xf2, 0x6c, - 0x2a, 0xb4, 0x0b, 0x95, 0x68, 0xf6, 0x49, 0xd7, 0xae, 0x30, - 0x8f, 0x11, 0xec, 0x72, 0xcd, 0x53, 0x3f, 0xa1, 0x1e, 0x80, - 0x7d, 0xe3, 0x5c, 0xc2, 0xbb, 0x25, 0x9a, 0x04, 0xf9, 0x67, - 0xd8, 0x46, 0x54, 0xca, 0x75, 0xeb, 0x16, 0x88, 0x37, 0xa9, - 0xd0, 0x4e, 0xf1, 0x6f, 0x92, 0x0c, 0xb3, 0x2d, 0x41, 0xdf, - 0x60, 0xfe, 0x03, 0x9d, 0x22, 0xbc, 0xc5, 0x5b, 0xe4, 0x7a, - 0x87, 0x19, 0xa6, 0x38, 0x7e, 0xe0, 0x5f, 0xc1, 0x3c, 0xa2, - 0x1d, 0x83, 0xfa, 0x64, 0xdb, 0x45, 0xb8, 0x26, 0x99, 0x07, - 0x6b, 0xf5, 0x4a, 0xd4, 0x29, 0xb7, 0x08, 0x96, 0xef, 0x71, - 0xce, 0x50, 0xad, 0x33, 0x8c, 0x12, 0xa8, 0x36, 0x89, 0x17, - 0xea, 0x74, 0xcb, 0x55, 0x2c, 0xb2, 0x0d, 0x93, 0x6e, 0xf0, - 0x4f, 0xd1, 0xbd, 0x23, 0x9c, 0x02, 0xff, 0x61, 0xde, 0x40, - 0x39, 0xa7, 0x18, 0x86, 0x7b, 0xe5, 0x5a, 0xc4, 0x82, 0x1c, - 0xa3, 0x3d, 0xc0, 0x5e, 0xe1, 0x7f, 0x06, 0x98, 0x27, 0xb9, - 0x44, 0xda, 0x65, 0xfb, 0x97, 0x09, 0xb6, 0x28, 0xd5, 0x4b, - 0xf4, 0x6a, 0x13, 0x8d, 0x32, 0xac, 0x51, 0xcf, 0x70, 0xee, - 0xfc, 0x62, 0xdd, 0x43, 0xbe, 0x20, 0x9f, 0x01, 0x78, 0xe6, - 0x59, 0xc7, 0x3a, 0xa4, 0x1b, 0x85, 0xe9, 0x77, 0xc8, 0x56, - 0xab, 0x35, 0x8a, 0x14, 0x6d, 0xf3, 0x4c, 0xd2, 0x2f, 0xb1, - 0x0e, 0x90, 0xd6, 0x48, 0xf7, 0x69, 0x94, 0x0a, 0xb5, 0x2b, - 0x52, 0xcc, 0x73, 0xed, 0x10, 0x8e, 0x31, 0xaf, 0xc3, 0x5d, - 0xe2, 0x7c, 0x81, 0x1f, 0xa0, 0x3e, 0x47, 0xd9, 0x66, 0xf8, - 0x05, 0x9b, 0x24, 0xba, 0x00, 0x9f, 0x23, 0xbc, 0x46, 0xd9, - 0x65, 0xfa, 0x8c, 0x13, 0xaf, 0x30, 0xca, 0x55, 0xe9, 0x76, - 0x05, 0x9a, 0x26, 0xb9, 0x43, 0xdc, 0x60, 0xff, 0x89, 0x16, - 0xaa, 0x35, 0xcf, 0x50, 0xec, 0x73, 0x0a, 0x95, 0x29, 0xb6, - 0x4c, 0xd3, 0x6f, 0xf0, 0x86, 0x19, 0xa5, 0x3a, 0xc0, 0x5f, - 0xe3, 0x7c, 0x0f, 0x90, 0x2c, 0xb3, 0x49, 0xd6, 0x6a, 0xf5, - 0x83, 0x1c, 0xa0, 0x3f, 0xc5, 0x5a, 0xe6, 0x79, 0x14, 0x8b, - 0x37, 0xa8, 0x52, 0xcd, 0x71, 0xee, 0x98, 0x07, 0xbb, 0x24, - 0xde, 0x41, 0xfd, 0x62, 0x11, 0x8e, 0x32, 0xad, 0x57, 0xc8, - 0x74, 0xeb, 0x9d, 0x02, 0xbe, 0x21, 0xdb, 0x44, 0xf8, 0x67, - 0x1e, 0x81, 0x3d, 0xa2, 0x58, 0xc7, 0x7b, 0xe4, 0x92, 0x0d, - 0xb1, 0x2e, 0xd4, 0x4b, 0xf7, 0x68, 0x1b, 0x84, 0x38, 0xa7, - 0x5d, 0xc2, 0x7e, 0xe1, 0x97, 0x08, 0xb4, 0x2b, 0xd1, 0x4e, - 0xf2, 0x6d, 0x28, 0xb7, 0x0b, 0x94, 0x6e, 0xf1, 0x4d, 0xd2, - 0xa4, 0x3b, 0x87, 0x18, 0xe2, 0x7d, 0xc1, 0x5e, 0x2d, 0xb2, - 0x0e, 0x91, 0x6b, 0xf4, 0x48, 0xd7, 0xa1, 0x3e, 0x82, 0x1d, - 0xe7, 0x78, 0xc4, 0x5b, 0x22, 0xbd, 0x01, 0x9e, 0x64, 0xfb, - 0x47, 0xd8, 0xae, 0x31, 0x8d, 0x12, 0xe8, 0x77, 0xcb, 0x54, - 0x27, 0xb8, 0x04, 0x9b, 0x61, 0xfe, 0x42, 0xdd, 0xab, 0x34, - 0x88, 0x17, 0xed, 0x72, 0xce, 0x51, 0x3c, 0xa3, 0x1f, 0x80, - 0x7a, 0xe5, 0x59, 0xc6, 0xb0, 0x2f, 0x93, 0x0c, 0xf6, 0x69, - 0xd5, 0x4a, 0x39, 0xa6, 0x1a, 0x85, 0x7f, 0xe0, 0x5c, 0xc3, - 0xb5, 0x2a, 0x96, 0x09, 0xf3, 0x6c, 0xd0, 0x4f, 0x36, 0xa9, - 0x15, 0x8a, 0x70, 0xef, 0x53, 0xcc, 0xba, 0x25, 0x99, 0x06, - 0xfc, 0x63, 0xdf, 0x40, 0x33, 0xac, 0x10, 0x8f, 0x75, 0xea, - 0x56, 0xc9, 0xbf, 0x20, 0x9c, 0x03, 0xf9, 0x66, 0xda, 0x45, - 0x00, 0xa0, 0x5d, 0xfd, 0xba, 0x1a, 0xe7, 0x47, 0x69, 0xc9, - 0x34, 0x94, 0xd3, 0x73, 0x8e, 0x2e, 0xd2, 0x72, 0x8f, 0x2f, - 0x68, 0xc8, 0x35, 0x95, 0xbb, 0x1b, 0xe6, 0x46, 0x01, 0xa1, - 0x5c, 0xfc, 0xb9, 0x19, 0xe4, 0x44, 0x03, 0xa3, 0x5e, 0xfe, - 0xd0, 0x70, 0x8d, 0x2d, 0x6a, 0xca, 0x37, 0x97, 0x6b, 0xcb, - 0x36, 0x96, 0xd1, 0x71, 0x8c, 0x2c, 0x02, 0xa2, 0x5f, 0xff, - 0xb8, 0x18, 0xe5, 0x45, 0x6f, 0xcf, 0x32, 0x92, 0xd5, 0x75, - 0x88, 0x28, 0x06, 0xa6, 0x5b, 0xfb, 0xbc, 0x1c, 0xe1, 0x41, - 0xbd, 0x1d, 0xe0, 0x40, 0x07, 0xa7, 0x5a, 0xfa, 0xd4, 0x74, - 0x89, 0x29, 0x6e, 0xce, 0x33, 0x93, 0xd6, 0x76, 0x8b, 0x2b, - 0x6c, 0xcc, 0x31, 0x91, 0xbf, 0x1f, 0xe2, 0x42, 0x05, 0xa5, - 0x58, 0xf8, 0x04, 0xa4, 0x59, 0xf9, 0xbe, 0x1e, 0xe3, 0x43, - 0x6d, 0xcd, 0x30, 0x90, 0xd7, 0x77, 0x8a, 0x2a, 0xde, 0x7e, - 0x83, 0x23, 0x64, 0xc4, 0x39, 0x99, 0xb7, 0x17, 0xea, 0x4a, - 0x0d, 0xad, 0x50, 0xf0, 0x0c, 0xac, 0x51, 0xf1, 0xb6, 0x16, - 0xeb, 0x4b, 0x65, 0xc5, 0x38, 0x98, 0xdf, 0x7f, 0x82, 0x22, - 0x67, 0xc7, 0x3a, 0x9a, 0xdd, 0x7d, 0x80, 0x20, 0x0e, 0xae, - 0x53, 0xf3, 0xb4, 0x14, 0xe9, 0x49, 0xb5, 0x15, 0xe8, 0x48, - 0x0f, 0xaf, 0x52, 0xf2, 0xdc, 0x7c, 0x81, 0x21, 0x66, 0xc6, - 0x3b, 0x9b, 0xb1, 0x11, 0xec, 0x4c, 0x0b, 0xab, 0x56, 0xf6, - 0xd8, 0x78, 0x85, 0x25, 0x62, 0xc2, 0x3f, 0x9f, 0x63, 0xc3, - 0x3e, 0x9e, 0xd9, 0x79, 0x84, 0x24, 0x0a, 0xaa, 0x57, 0xf7, - 0xb0, 0x10, 0xed, 0x4d, 0x08, 0xa8, 0x55, 0xf5, 0xb2, 0x12, - 0xef, 0x4f, 0x61, 0xc1, 0x3c, 0x9c, 0xdb, 0x7b, 0x86, 0x26, - 0xda, 0x7a, 0x87, 0x27, 0x60, 0xc0, 0x3d, 0x9d, 0xb3, 0x13, - 0xee, 0x4e, 0x09, 0xa9, 0x54, 0xf4, 0x00, 0xa1, 0x5f, 0xfe, - 0xbe, 0x1f, 0xe1, 0x40, 0x61, 0xc0, 0x3e, 0x9f, 0xdf, 0x7e, - 0x80, 0x21, 0xc2, 0x63, 0x9d, 0x3c, 0x7c, 0xdd, 0x23, 0x82, - 0xa3, 0x02, 0xfc, 0x5d, 0x1d, 0xbc, 0x42, 0xe3, 0x99, 0x38, - 0xc6, 0x67, 0x27, 0x86, 0x78, 0xd9, 0xf8, 0x59, 0xa7, 0x06, - 0x46, 0xe7, 0x19, 0xb8, 0x5b, 0xfa, 0x04, 0xa5, 0xe5, 0x44, - 0xba, 0x1b, 0x3a, 0x9b, 0x65, 0xc4, 0x84, 0x25, 0xdb, 0x7a, - 0x2f, 0x8e, 0x70, 0xd1, 0x91, 0x30, 0xce, 0x6f, 0x4e, 0xef, - 0x11, 0xb0, 0xf0, 0x51, 0xaf, 0x0e, 0xed, 0x4c, 0xb2, 0x13, - 0x53, 0xf2, 0x0c, 0xad, 0x8c, 0x2d, 0xd3, 0x72, 0x32, 0x93, - 0x6d, 0xcc, 0xb6, 0x17, 0xe9, 0x48, 0x08, 0xa9, 0x57, 0xf6, - 0xd7, 0x76, 0x88, 0x29, 0x69, 0xc8, 0x36, 0x97, 0x74, 0xd5, - 0x2b, 0x8a, 0xca, 0x6b, 0x95, 0x34, 0x15, 0xb4, 0x4a, 0xeb, - 0xab, 0x0a, 0xf4, 0x55, 0x5e, 0xff, 0x01, 0xa0, 0xe0, 0x41, - 0xbf, 0x1e, 0x3f, 0x9e, 0x60, 0xc1, 0x81, 0x20, 0xde, 0x7f, - 0x9c, 0x3d, 0xc3, 0x62, 0x22, 0x83, 0x7d, 0xdc, 0xfd, 0x5c, - 0xa2, 0x03, 0x43, 0xe2, 0x1c, 0xbd, 0xc7, 0x66, 0x98, 0x39, - 0x79, 0xd8, 0x26, 0x87, 0xa6, 0x07, 0xf9, 0x58, 0x18, 0xb9, - 0x47, 0xe6, 0x05, 0xa4, 0x5a, 0xfb, 0xbb, 0x1a, 0xe4, 0x45, - 0x64, 0xc5, 0x3b, 0x9a, 0xda, 0x7b, 0x85, 0x24, 0x71, 0xd0, - 0x2e, 0x8f, 0xcf, 0x6e, 0x90, 0x31, 0x10, 0xb1, 0x4f, 0xee, - 0xae, 0x0f, 0xf1, 0x50, 0xb3, 0x12, 0xec, 0x4d, 0x0d, 0xac, - 0x52, 0xf3, 0xd2, 0x73, 0x8d, 0x2c, 0x6c, 0xcd, 0x33, 0x92, - 0xe8, 0x49, 0xb7, 0x16, 0x56, 0xf7, 0x09, 0xa8, 0x89, 0x28, - 0xd6, 0x77, 0x37, 0x96, 0x68, 0xc9, 0x2a, 0x8b, 0x75, 0xd4, - 0x94, 0x35, 0xcb, 0x6a, 0x4b, 0xea, 0x14, 0xb5, 0xf5, 0x54, - 0xaa, 0x0b, 0x00, 0xa2, 0x59, 0xfb, 0xb2, 0x10, 0xeb, 0x49, - 0x79, 0xdb, 0x20, 0x82, 0xcb, 0x69, 0x92, 0x30, 0xf2, 0x50, - 0xab, 0x09, 0x40, 0xe2, 0x19, 0xbb, 0x8b, 0x29, 0xd2, 0x70, - 0x39, 0x9b, 0x60, 0xc2, 0xf9, 0x5b, 0xa0, 0x02, 0x4b, 0xe9, - 0x12, 0xb0, 0x80, 0x22, 0xd9, 0x7b, 0x32, 0x90, 0x6b, 0xc9, - 0x0b, 0xa9, 0x52, 0xf0, 0xb9, 0x1b, 0xe0, 0x42, 0x72, 0xd0, - 0x2b, 0x89, 0xc0, 0x62, 0x99, 0x3b, 0xef, 0x4d, 0xb6, 0x14, - 0x5d, 0xff, 0x04, 0xa6, 0x96, 0x34, 0xcf, 0x6d, 0x24, 0x86, - 0x7d, 0xdf, 0x1d, 0xbf, 0x44, 0xe6, 0xaf, 0x0d, 0xf6, 0x54, - 0x64, 0xc6, 0x3d, 0x9f, 0xd6, 0x74, 0x8f, 0x2d, 0x16, 0xb4, - 0x4f, 0xed, 0xa4, 0x06, 0xfd, 0x5f, 0x6f, 0xcd, 0x36, 0x94, - 0xdd, 0x7f, 0x84, 0x26, 0xe4, 0x46, 0xbd, 0x1f, 0x56, 0xf4, - 0x0f, 0xad, 0x9d, 0x3f, 0xc4, 0x66, 0x2f, 0x8d, 0x76, 0xd4, - 0xc3, 0x61, 0x9a, 0x38, 0x71, 0xd3, 0x28, 0x8a, 0xba, 0x18, - 0xe3, 0x41, 0x08, 0xaa, 0x51, 0xf3, 0x31, 0x93, 0x68, 0xca, - 0x83, 0x21, 0xda, 0x78, 0x48, 0xea, 0x11, 0xb3, 0xfa, 0x58, - 0xa3, 0x01, 0x3a, 0x98, 0x63, 0xc1, 0x88, 0x2a, 0xd1, 0x73, - 0x43, 0xe1, 0x1a, 0xb8, 0xf1, 0x53, 0xa8, 0x0a, 0xc8, 0x6a, - 0x91, 0x33, 0x7a, 0xd8, 0x23, 0x81, 0xb1, 0x13, 0xe8, 0x4a, - 0x03, 0xa1, 0x5a, 0xf8, 0x2c, 0x8e, 0x75, 0xd7, 0x9e, 0x3c, - 0xc7, 0x65, 0x55, 0xf7, 0x0c, 0xae, 0xe7, 0x45, 0xbe, 0x1c, - 0xde, 0x7c, 0x87, 0x25, 0x6c, 0xce, 0x35, 0x97, 0xa7, 0x05, - 0xfe, 0x5c, 0x15, 0xb7, 0x4c, 0xee, 0xd5, 0x77, 0x8c, 0x2e, - 0x67, 0xc5, 0x3e, 0x9c, 0xac, 0x0e, 0xf5, 0x57, 0x1e, 0xbc, - 0x47, 0xe5, 0x27, 0x85, 0x7e, 0xdc, 0x95, 0x37, 0xcc, 0x6e, - 0x5e, 0xfc, 0x07, 0xa5, 0xec, 0x4e, 0xb5, 0x17, 0x00, 0xa3, - 0x5b, 0xf8, 0xb6, 0x15, 0xed, 0x4e, 0x71, 0xd2, 0x2a, 0x89, - 0xc7, 0x64, 0x9c, 0x3f, 0xe2, 0x41, 0xb9, 0x1a, 0x54, 0xf7, - 0x0f, 0xac, 0x93, 0x30, 0xc8, 0x6b, 0x25, 0x86, 0x7e, 0xdd, - 0xd9, 0x7a, 0x82, 0x21, 0x6f, 0xcc, 0x34, 0x97, 0xa8, 0x0b, - 0xf3, 0x50, 0x1e, 0xbd, 0x45, 0xe6, 0x3b, 0x98, 0x60, 0xc3, - 0x8d, 0x2e, 0xd6, 0x75, 0x4a, 0xe9, 0x11, 0xb2, 0xfc, 0x5f, - 0xa7, 0x04, 0xaf, 0x0c, 0xf4, 0x57, 0x19, 0xba, 0x42, 0xe1, - 0xde, 0x7d, 0x85, 0x26, 0x68, 0xcb, 0x33, 0x90, 0x4d, 0xee, - 0x16, 0xb5, 0xfb, 0x58, 0xa0, 0x03, 0x3c, 0x9f, 0x67, 0xc4, - 0x8a, 0x29, 0xd1, 0x72, 0x76, 0xd5, 0x2d, 0x8e, 0xc0, 0x63, - 0x9b, 0x38, 0x07, 0xa4, 0x5c, 0xff, 0xb1, 0x12, 0xea, 0x49, - 0x94, 0x37, 0xcf, 0x6c, 0x22, 0x81, 0x79, 0xda, 0xe5, 0x46, - 0xbe, 0x1d, 0x53, 0xf0, 0x08, 0xab, 0x43, 0xe0, 0x18, 0xbb, - 0xf5, 0x56, 0xae, 0x0d, 0x32, 0x91, 0x69, 0xca, 0x84, 0x27, - 0xdf, 0x7c, 0xa1, 0x02, 0xfa, 0x59, 0x17, 0xb4, 0x4c, 0xef, - 0xd0, 0x73, 0x8b, 0x28, 0x66, 0xc5, 0x3d, 0x9e, 0x9a, 0x39, - 0xc1, 0x62, 0x2c, 0x8f, 0x77, 0xd4, 0xeb, 0x48, 0xb0, 0x13, - 0x5d, 0xfe, 0x06, 0xa5, 0x78, 0xdb, 0x23, 0x80, 0xce, 0x6d, - 0x95, 0x36, 0x09, 0xaa, 0x52, 0xf1, 0xbf, 0x1c, 0xe4, 0x47, - 0xec, 0x4f, 0xb7, 0x14, 0x5a, 0xf9, 0x01, 0xa2, 0x9d, 0x3e, - 0xc6, 0x65, 0x2b, 0x88, 0x70, 0xd3, 0x0e, 0xad, 0x55, 0xf6, - 0xb8, 0x1b, 0xe3, 0x40, 0x7f, 0xdc, 0x24, 0x87, 0xc9, 0x6a, - 0x92, 0x31, 0x35, 0x96, 0x6e, 0xcd, 0x83, 0x20, 0xd8, 0x7b, - 0x44, 0xe7, 0x1f, 0xbc, 0xf2, 0x51, 0xa9, 0x0a, 0xd7, 0x74, - 0x8c, 0x2f, 0x61, 0xc2, 0x3a, 0x99, 0xa6, 0x05, 0xfd, 0x5e, - 0x10, 0xb3, 0x4b, 0xe8, 0x00, 0xa4, 0x55, 0xf1, 0xaa, 0x0e, - 0xff, 0x5b, 0x49, 0xed, 0x1c, 0xb8, 0xe3, 0x47, 0xb6, 0x12, - 0x92, 0x36, 0xc7, 0x63, 0x38, 0x9c, 0x6d, 0xc9, 0xdb, 0x7f, - 0x8e, 0x2a, 0x71, 0xd5, 0x24, 0x80, 0x39, 0x9d, 0x6c, 0xc8, - 0x93, 0x37, 0xc6, 0x62, 0x70, 0xd4, 0x25, 0x81, 0xda, 0x7e, - 0x8f, 0x2b, 0xab, 0x0f, 0xfe, 0x5a, 0x01, 0xa5, 0x54, 0xf0, - 0xe2, 0x46, 0xb7, 0x13, 0x48, 0xec, 0x1d, 0xb9, 0x72, 0xd6, - 0x27, 0x83, 0xd8, 0x7c, 0x8d, 0x29, 0x3b, 0x9f, 0x6e, 0xca, - 0x91, 0x35, 0xc4, 0x60, 0xe0, 0x44, 0xb5, 0x11, 0x4a, 0xee, - 0x1f, 0xbb, 0xa9, 0x0d, 0xfc, 0x58, 0x03, 0xa7, 0x56, 0xf2, - 0x4b, 0xef, 0x1e, 0xba, 0xe1, 0x45, 0xb4, 0x10, 0x02, 0xa6, - 0x57, 0xf3, 0xa8, 0x0c, 0xfd, 0x59, 0xd9, 0x7d, 0x8c, 0x28, - 0x73, 0xd7, 0x26, 0x82, 0x90, 0x34, 0xc5, 0x61, 0x3a, 0x9e, - 0x6f, 0xcb, 0xe4, 0x40, 0xb1, 0x15, 0x4e, 0xea, 0x1b, 0xbf, - 0xad, 0x09, 0xf8, 0x5c, 0x07, 0xa3, 0x52, 0xf6, 0x76, 0xd2, - 0x23, 0x87, 0xdc, 0x78, 0x89, 0x2d, 0x3f, 0x9b, 0x6a, 0xce, - 0x95, 0x31, 0xc0, 0x64, 0xdd, 0x79, 0x88, 0x2c, 0x77, 0xd3, - 0x22, 0x86, 0x94, 0x30, 0xc1, 0x65, 0x3e, 0x9a, 0x6b, 0xcf, - 0x4f, 0xeb, 0x1a, 0xbe, 0xe5, 0x41, 0xb0, 0x14, 0x06, 0xa2, - 0x53, 0xf7, 0xac, 0x08, 0xf9, 0x5d, 0x96, 0x32, 0xc3, 0x67, - 0x3c, 0x98, 0x69, 0xcd, 0xdf, 0x7b, 0x8a, 0x2e, 0x75, 0xd1, - 0x20, 0x84, 0x04, 0xa0, 0x51, 0xf5, 0xae, 0x0a, 0xfb, 0x5f, - 0x4d, 0xe9, 0x18, 0xbc, 0xe7, 0x43, 0xb2, 0x16, 0xaf, 0x0b, - 0xfa, 0x5e, 0x05, 0xa1, 0x50, 0xf4, 0xe6, 0x42, 0xb3, 0x17, - 0x4c, 0xe8, 0x19, 0xbd, 0x3d, 0x99, 0x68, 0xcc, 0x97, 0x33, - 0xc2, 0x66, 0x74, 0xd0, 0x21, 0x85, 0xde, 0x7a, 0x8b, 0x2f, - 0x00, 0xa5, 0x57, 0xf2, 0xae, 0x0b, 0xf9, 0x5c, 0x41, 0xe4, - 0x16, 0xb3, 0xef, 0x4a, 0xb8, 0x1d, 0x82, 0x27, 0xd5, 0x70, - 0x2c, 0x89, 0x7b, 0xde, 0xc3, 0x66, 0x94, 0x31, 0x6d, 0xc8, - 0x3a, 0x9f, 0x19, 0xbc, 0x4e, 0xeb, 0xb7, 0x12, 0xe0, 0x45, - 0x58, 0xfd, 0x0f, 0xaa, 0xf6, 0x53, 0xa1, 0x04, 0x9b, 0x3e, - 0xcc, 0x69, 0x35, 0x90, 0x62, 0xc7, 0xda, 0x7f, 0x8d, 0x28, - 0x74, 0xd1, 0x23, 0x86, 0x32, 0x97, 0x65, 0xc0, 0x9c, 0x39, - 0xcb, 0x6e, 0x73, 0xd6, 0x24, 0x81, 0xdd, 0x78, 0x8a, 0x2f, - 0xb0, 0x15, 0xe7, 0x42, 0x1e, 0xbb, 0x49, 0xec, 0xf1, 0x54, - 0xa6, 0x03, 0x5f, 0xfa, 0x08, 0xad, 0x2b, 0x8e, 0x7c, 0xd9, - 0x85, 0x20, 0xd2, 0x77, 0x6a, 0xcf, 0x3d, 0x98, 0xc4, 0x61, - 0x93, 0x36, 0xa9, 0x0c, 0xfe, 0x5b, 0x07, 0xa2, 0x50, 0xf5, - 0xe8, 0x4d, 0xbf, 0x1a, 0x46, 0xe3, 0x11, 0xb4, 0x64, 0xc1, - 0x33, 0x96, 0xca, 0x6f, 0x9d, 0x38, 0x25, 0x80, 0x72, 0xd7, - 0x8b, 0x2e, 0xdc, 0x79, 0xe6, 0x43, 0xb1, 0x14, 0x48, 0xed, - 0x1f, 0xba, 0xa7, 0x02, 0xf0, 0x55, 0x09, 0xac, 0x5e, 0xfb, - 0x7d, 0xd8, 0x2a, 0x8f, 0xd3, 0x76, 0x84, 0x21, 0x3c, 0x99, - 0x6b, 0xce, 0x92, 0x37, 0xc5, 0x60, 0xff, 0x5a, 0xa8, 0x0d, - 0x51, 0xf4, 0x06, 0xa3, 0xbe, 0x1b, 0xe9, 0x4c, 0x10, 0xb5, - 0x47, 0xe2, 0x56, 0xf3, 0x01, 0xa4, 0xf8, 0x5d, 0xaf, 0x0a, - 0x17, 0xb2, 0x40, 0xe5, 0xb9, 0x1c, 0xee, 0x4b, 0xd4, 0x71, - 0x83, 0x26, 0x7a, 0xdf, 0x2d, 0x88, 0x95, 0x30, 0xc2, 0x67, - 0x3b, 0x9e, 0x6c, 0xc9, 0x4f, 0xea, 0x18, 0xbd, 0xe1, 0x44, - 0xb6, 0x13, 0x0e, 0xab, 0x59, 0xfc, 0xa0, 0x05, 0xf7, 0x52, - 0xcd, 0x68, 0x9a, 0x3f, 0x63, 0xc6, 0x34, 0x91, 0x8c, 0x29, - 0xdb, 0x7e, 0x22, 0x87, 0x75, 0xd0, 0x00, 0xa6, 0x51, 0xf7, - 0xa2, 0x04, 0xf3, 0x55, 0x59, 0xff, 0x08, 0xae, 0xfb, 0x5d, - 0xaa, 0x0c, 0xb2, 0x14, 0xe3, 0x45, 0x10, 0xb6, 0x41, 0xe7, - 0xeb, 0x4d, 0xba, 0x1c, 0x49, 0xef, 0x18, 0xbe, 0x79, 0xdf, - 0x28, 0x8e, 0xdb, 0x7d, 0x8a, 0x2c, 0x20, 0x86, 0x71, 0xd7, - 0x82, 0x24, 0xd3, 0x75, 0xcb, 0x6d, 0x9a, 0x3c, 0x69, 0xcf, - 0x38, 0x9e, 0x92, 0x34, 0xc3, 0x65, 0x30, 0x96, 0x61, 0xc7, - 0xf2, 0x54, 0xa3, 0x05, 0x50, 0xf6, 0x01, 0xa7, 0xab, 0x0d, - 0xfa, 0x5c, 0x09, 0xaf, 0x58, 0xfe, 0x40, 0xe6, 0x11, 0xb7, - 0xe2, 0x44, 0xb3, 0x15, 0x19, 0xbf, 0x48, 0xee, 0xbb, 0x1d, - 0xea, 0x4c, 0x8b, 0x2d, 0xda, 0x7c, 0x29, 0x8f, 0x78, 0xde, - 0xd2, 0x74, 0x83, 0x25, 0x70, 0xd6, 0x21, 0x87, 0x39, 0x9f, - 0x68, 0xce, 0x9b, 0x3d, 0xca, 0x6c, 0x60, 0xc6, 0x31, 0x97, - 0xc2, 0x64, 0x93, 0x35, 0xf9, 0x5f, 0xa8, 0x0e, 0x5b, 0xfd, - 0x0a, 0xac, 0xa0, 0x06, 0xf1, 0x57, 0x02, 0xa4, 0x53, 0xf5, - 0x4b, 0xed, 0x1a, 0xbc, 0xe9, 0x4f, 0xb8, 0x1e, 0x12, 0xb4, - 0x43, 0xe5, 0xb0, 0x16, 0xe1, 0x47, 0x80, 0x26, 0xd1, 0x77, - 0x22, 0x84, 0x73, 0xd5, 0xd9, 0x7f, 0x88, 0x2e, 0x7b, 0xdd, - 0x2a, 0x8c, 0x32, 0x94, 0x63, 0xc5, 0x90, 0x36, 0xc1, 0x67, - 0x6b, 0xcd, 0x3a, 0x9c, 0xc9, 0x6f, 0x98, 0x3e, 0x0b, 0xad, - 0x5a, 0xfc, 0xa9, 0x0f, 0xf8, 0x5e, 0x52, 0xf4, 0x03, 0xa5, - 0xf0, 0x56, 0xa1, 0x07, 0xb9, 0x1f, 0xe8, 0x4e, 0x1b, 0xbd, - 0x4a, 0xec, 0xe0, 0x46, 0xb1, 0x17, 0x42, 0xe4, 0x13, 0xb5, - 0x72, 0xd4, 0x23, 0x85, 0xd0, 0x76, 0x81, 0x27, 0x2b, 0x8d, - 0x7a, 0xdc, 0x89, 0x2f, 0xd8, 0x7e, 0xc0, 0x66, 0x91, 0x37, - 0x62, 0xc4, 0x33, 0x95, 0x99, 0x3f, 0xc8, 0x6e, 0x3b, 0x9d, - 0x6a, 0xcc, 0x00, 0xa7, 0x53, 0xf4, 0xa6, 0x01, 0xf5, 0x52, - 0x51, 0xf6, 0x02, 0xa5, 0xf7, 0x50, 0xa4, 0x03, 0xa2, 0x05, - 0xf1, 0x56, 0x04, 0xa3, 0x57, 0xf0, 0xf3, 0x54, 0xa0, 0x07, - 0x55, 0xf2, 0x06, 0xa1, 0x59, 0xfe, 0x0a, 0xad, 0xff, 0x58, - 0xac, 0x0b, 0x08, 0xaf, 0x5b, 0xfc, 0xae, 0x09, 0xfd, 0x5a, - 0xfb, 0x5c, 0xa8, 0x0f, 0x5d, 0xfa, 0x0e, 0xa9, 0xaa, 0x0d, - 0xf9, 0x5e, 0x0c, 0xab, 0x5f, 0xf8, 0xb2, 0x15, 0xe1, 0x46, - 0x14, 0xb3, 0x47, 0xe0, 0xe3, 0x44, 0xb0, 0x17, 0x45, 0xe2, - 0x16, 0xb1, 0x10, 0xb7, 0x43, 0xe4, 0xb6, 0x11, 0xe5, 0x42, - 0x41, 0xe6, 0x12, 0xb5, 0xe7, 0x40, 0xb4, 0x13, 0xeb, 0x4c, - 0xb8, 0x1f, 0x4d, 0xea, 0x1e, 0xb9, 0xba, 0x1d, 0xe9, 0x4e, - 0x1c, 0xbb, 0x4f, 0xe8, 0x49, 0xee, 0x1a, 0xbd, 0xef, 0x48, - 0xbc, 0x1b, 0x18, 0xbf, 0x4b, 0xec, 0xbe, 0x19, 0xed, 0x4a, - 0x79, 0xde, 0x2a, 0x8d, 0xdf, 0x78, 0x8c, 0x2b, 0x28, 0x8f, - 0x7b, 0xdc, 0x8e, 0x29, 0xdd, 0x7a, 0xdb, 0x7c, 0x88, 0x2f, - 0x7d, 0xda, 0x2e, 0x89, 0x8a, 0x2d, 0xd9, 0x7e, 0x2c, 0x8b, - 0x7f, 0xd8, 0x20, 0x87, 0x73, 0xd4, 0x86, 0x21, 0xd5, 0x72, - 0x71, 0xd6, 0x22, 0x85, 0xd7, 0x70, 0x84, 0x23, 0x82, 0x25, - 0xd1, 0x76, 0x24, 0x83, 0x77, 0xd0, 0xd3, 0x74, 0x80, 0x27, - 0x75, 0xd2, 0x26, 0x81, 0xcb, 0x6c, 0x98, 0x3f, 0x6d, 0xca, - 0x3e, 0x99, 0x9a, 0x3d, 0xc9, 0x6e, 0x3c, 0x9b, 0x6f, 0xc8, - 0x69, 0xce, 0x3a, 0x9d, 0xcf, 0x68, 0x9c, 0x3b, 0x38, 0x9f, - 0x6b, 0xcc, 0x9e, 0x39, 0xcd, 0x6a, 0x92, 0x35, 0xc1, 0x66, - 0x34, 0x93, 0x67, 0xc0, 0xc3, 0x64, 0x90, 0x37, 0x65, 0xc2, - 0x36, 0x91, 0x30, 0x97, 0x63, 0xc4, 0x96, 0x31, 0xc5, 0x62, - 0x61, 0xc6, 0x32, 0x95, 0xc7, 0x60, 0x94, 0x33, 0x00, 0xa8, - 0x4d, 0xe5, 0x9a, 0x32, 0xd7, 0x7f, 0x29, 0x81, 0x64, 0xcc, - 0xb3, 0x1b, 0xfe, 0x56, 0x52, 0xfa, 0x1f, 0xb7, 0xc8, 0x60, - 0x85, 0x2d, 0x7b, 0xd3, 0x36, 0x9e, 0xe1, 0x49, 0xac, 0x04, - 0xa4, 0x0c, 0xe9, 0x41, 0x3e, 0x96, 0x73, 0xdb, 0x8d, 0x25, - 0xc0, 0x68, 0x17, 0xbf, 0x5a, 0xf2, 0xf6, 0x5e, 0xbb, 0x13, - 0x6c, 0xc4, 0x21, 0x89, 0xdf, 0x77, 0x92, 0x3a, 0x45, 0xed, - 0x08, 0xa0, 0x55, 0xfd, 0x18, 0xb0, 0xcf, 0x67, 0x82, 0x2a, - 0x7c, 0xd4, 0x31, 0x99, 0xe6, 0x4e, 0xab, 0x03, 0x07, 0xaf, - 0x4a, 0xe2, 0x9d, 0x35, 0xd0, 0x78, 0x2e, 0x86, 0x63, 0xcb, - 0xb4, 0x1c, 0xf9, 0x51, 0xf1, 0x59, 0xbc, 0x14, 0x6b, 0xc3, - 0x26, 0x8e, 0xd8, 0x70, 0x95, 0x3d, 0x42, 0xea, 0x0f, 0xa7, - 0xa3, 0x0b, 0xee, 0x46, 0x39, 0x91, 0x74, 0xdc, 0x8a, 0x22, - 0xc7, 0x6f, 0x10, 0xb8, 0x5d, 0xf5, 0xaa, 0x02, 0xe7, 0x4f, - 0x30, 0x98, 0x7d, 0xd5, 0x83, 0x2b, 0xce, 0x66, 0x19, 0xb1, - 0x54, 0xfc, 0xf8, 0x50, 0xb5, 0x1d, 0x62, 0xca, 0x2f, 0x87, - 0xd1, 0x79, 0x9c, 0x34, 0x4b, 0xe3, 0x06, 0xae, 0x0e, 0xa6, - 0x43, 0xeb, 0x94, 0x3c, 0xd9, 0x71, 0x27, 0x8f, 0x6a, 0xc2, - 0xbd, 0x15, 0xf0, 0x58, 0x5c, 0xf4, 0x11, 0xb9, 0xc6, 0x6e, - 0x8b, 0x23, 0x75, 0xdd, 0x38, 0x90, 0xef, 0x47, 0xa2, 0x0a, - 0xff, 0x57, 0xb2, 0x1a, 0x65, 0xcd, 0x28, 0x80, 0xd6, 0x7e, - 0x9b, 0x33, 0x4c, 0xe4, 0x01, 0xa9, 0xad, 0x05, 0xe0, 0x48, - 0x37, 0x9f, 0x7a, 0xd2, 0x84, 0x2c, 0xc9, 0x61, 0x1e, 0xb6, - 0x53, 0xfb, 0x5b, 0xf3, 0x16, 0xbe, 0xc1, 0x69, 0x8c, 0x24, - 0x72, 0xda, 0x3f, 0x97, 0xe8, 0x40, 0xa5, 0x0d, 0x09, 0xa1, - 0x44, 0xec, 0x93, 0x3b, 0xde, 0x76, 0x20, 0x88, 0x6d, 0xc5, - 0xba, 0x12, 0xf7, 0x5f, 0x00, 0xa9, 0x4f, 0xe6, 0x9e, 0x37, - 0xd1, 0x78, 0x21, 0x88, 0x6e, 0xc7, 0xbf, 0x16, 0xf0, 0x59, - 0x42, 0xeb, 0x0d, 0xa4, 0xdc, 0x75, 0x93, 0x3a, 0x63, 0xca, - 0x2c, 0x85, 0xfd, 0x54, 0xb2, 0x1b, 0x84, 0x2d, 0xcb, 0x62, - 0x1a, 0xb3, 0x55, 0xfc, 0xa5, 0x0c, 0xea, 0x43, 0x3b, 0x92, - 0x74, 0xdd, 0xc6, 0x6f, 0x89, 0x20, 0x58, 0xf1, 0x17, 0xbe, - 0xe7, 0x4e, 0xa8, 0x01, 0x79, 0xd0, 0x36, 0x9f, 0x15, 0xbc, - 0x5a, 0xf3, 0x8b, 0x22, 0xc4, 0x6d, 0x34, 0x9d, 0x7b, 0xd2, - 0xaa, 0x03, 0xe5, 0x4c, 0x57, 0xfe, 0x18, 0xb1, 0xc9, 0x60, - 0x86, 0x2f, 0x76, 0xdf, 0x39, 0x90, 0xe8, 0x41, 0xa7, 0x0e, - 0x91, 0x38, 0xde, 0x77, 0x0f, 0xa6, 0x40, 0xe9, 0xb0, 0x19, - 0xff, 0x56, 0x2e, 0x87, 0x61, 0xc8, 0xd3, 0x7a, 0x9c, 0x35, - 0x4d, 0xe4, 0x02, 0xab, 0xf2, 0x5b, 0xbd, 0x14, 0x6c, 0xc5, - 0x23, 0x8a, 0x2a, 0x83, 0x65, 0xcc, 0xb4, 0x1d, 0xfb, 0x52, - 0x0b, 0xa2, 0x44, 0xed, 0x95, 0x3c, 0xda, 0x73, 0x68, 0xc1, - 0x27, 0x8e, 0xf6, 0x5f, 0xb9, 0x10, 0x49, 0xe0, 0x06, 0xaf, - 0xd7, 0x7e, 0x98, 0x31, 0xae, 0x07, 0xe1, 0x48, 0x30, 0x99, - 0x7f, 0xd6, 0x8f, 0x26, 0xc0, 0x69, 0x11, 0xb8, 0x5e, 0xf7, - 0xec, 0x45, 0xa3, 0x0a, 0x72, 0xdb, 0x3d, 0x94, 0xcd, 0x64, - 0x82, 0x2b, 0x53, 0xfa, 0x1c, 0xb5, 0x3f, 0x96, 0x70, 0xd9, - 0xa1, 0x08, 0xee, 0x47, 0x1e, 0xb7, 0x51, 0xf8, 0x80, 0x29, - 0xcf, 0x66, 0x7d, 0xd4, 0x32, 0x9b, 0xe3, 0x4a, 0xac, 0x05, - 0x5c, 0xf5, 0x13, 0xba, 0xc2, 0x6b, 0x8d, 0x24, 0xbb, 0x12, - 0xf4, 0x5d, 0x25, 0x8c, 0x6a, 0xc3, 0x9a, 0x33, 0xd5, 0x7c, - 0x04, 0xad, 0x4b, 0xe2, 0xf9, 0x50, 0xb6, 0x1f, 0x67, 0xce, - 0x28, 0x81, 0xd8, 0x71, 0x97, 0x3e, 0x46, 0xef, 0x09, 0xa0, - 0x00, 0xaa, 0x49, 0xe3, 0x92, 0x38, 0xdb, 0x71, 0x39, 0x93, - 0x70, 0xda, 0xab, 0x01, 0xe2, 0x48, 0x72, 0xd8, 0x3b, 0x91, - 0xe0, 0x4a, 0xa9, 0x03, 0x4b, 0xe1, 0x02, 0xa8, 0xd9, 0x73, - 0x90, 0x3a, 0xe4, 0x4e, 0xad, 0x07, 0x76, 0xdc, 0x3f, 0x95, - 0xdd, 0x77, 0x94, 0x3e, 0x4f, 0xe5, 0x06, 0xac, 0x96, 0x3c, - 0xdf, 0x75, 0x04, 0xae, 0x4d, 0xe7, 0xaf, 0x05, 0xe6, 0x4c, - 0x3d, 0x97, 0x74, 0xde, 0xd5, 0x7f, 0x9c, 0x36, 0x47, 0xed, - 0x0e, 0xa4, 0xec, 0x46, 0xa5, 0x0f, 0x7e, 0xd4, 0x37, 0x9d, - 0xa7, 0x0d, 0xee, 0x44, 0x35, 0x9f, 0x7c, 0xd6, 0x9e, 0x34, - 0xd7, 0x7d, 0x0c, 0xa6, 0x45, 0xef, 0x31, 0x9b, 0x78, 0xd2, - 0xa3, 0x09, 0xea, 0x40, 0x08, 0xa2, 0x41, 0xeb, 0x9a, 0x30, - 0xd3, 0x79, 0x43, 0xe9, 0x0a, 0xa0, 0xd1, 0x7b, 0x98, 0x32, - 0x7a, 0xd0, 0x33, 0x99, 0xe8, 0x42, 0xa1, 0x0b, 0xb7, 0x1d, - 0xfe, 0x54, 0x25, 0x8f, 0x6c, 0xc6, 0x8e, 0x24, 0xc7, 0x6d, - 0x1c, 0xb6, 0x55, 0xff, 0xc5, 0x6f, 0x8c, 0x26, 0x57, 0xfd, - 0x1e, 0xb4, 0xfc, 0x56, 0xb5, 0x1f, 0x6e, 0xc4, 0x27, 0x8d, - 0x53, 0xf9, 0x1a, 0xb0, 0xc1, 0x6b, 0x88, 0x22, 0x6a, 0xc0, - 0x23, 0x89, 0xf8, 0x52, 0xb1, 0x1b, 0x21, 0x8b, 0x68, 0xc2, - 0xb3, 0x19, 0xfa, 0x50, 0x18, 0xb2, 0x51, 0xfb, 0x8a, 0x20, - 0xc3, 0x69, 0x62, 0xc8, 0x2b, 0x81, 0xf0, 0x5a, 0xb9, 0x13, - 0x5b, 0xf1, 0x12, 0xb8, 0xc9, 0x63, 0x80, 0x2a, 0x10, 0xba, - 0x59, 0xf3, 0x82, 0x28, 0xcb, 0x61, 0x29, 0x83, 0x60, 0xca, - 0xbb, 0x11, 0xf2, 0x58, 0x86, 0x2c, 0xcf, 0x65, 0x14, 0xbe, - 0x5d, 0xf7, 0xbf, 0x15, 0xf6, 0x5c, 0x2d, 0x87, 0x64, 0xce, - 0xf4, 0x5e, 0xbd, 0x17, 0x66, 0xcc, 0x2f, 0x85, 0xcd, 0x67, - 0x84, 0x2e, 0x5f, 0xf5, 0x16, 0xbc, 0x00, 0xab, 0x4b, 0xe0, - 0x96, 0x3d, 0xdd, 0x76, 0x31, 0x9a, 0x7a, 0xd1, 0xa7, 0x0c, - 0xec, 0x47, 0x62, 0xc9, 0x29, 0x82, 0xf4, 0x5f, 0xbf, 0x14, - 0x53, 0xf8, 0x18, 0xb3, 0xc5, 0x6e, 0x8e, 0x25, 0xc4, 0x6f, - 0x8f, 0x24, 0x52, 0xf9, 0x19, 0xb2, 0xf5, 0x5e, 0xbe, 0x15, - 0x63, 0xc8, 0x28, 0x83, 0xa6, 0x0d, 0xed, 0x46, 0x30, 0x9b, - 0x7b, 0xd0, 0x97, 0x3c, 0xdc, 0x77, 0x01, 0xaa, 0x4a, 0xe1, - 0x95, 0x3e, 0xde, 0x75, 0x03, 0xa8, 0x48, 0xe3, 0xa4, 0x0f, - 0xef, 0x44, 0x32, 0x99, 0x79, 0xd2, 0xf7, 0x5c, 0xbc, 0x17, - 0x61, 0xca, 0x2a, 0x81, 0xc6, 0x6d, 0x8d, 0x26, 0x50, 0xfb, - 0x1b, 0xb0, 0x51, 0xfa, 0x1a, 0xb1, 0xc7, 0x6c, 0x8c, 0x27, - 0x60, 0xcb, 0x2b, 0x80, 0xf6, 0x5d, 0xbd, 0x16, 0x33, 0x98, - 0x78, 0xd3, 0xa5, 0x0e, 0xee, 0x45, 0x02, 0xa9, 0x49, 0xe2, - 0x94, 0x3f, 0xdf, 0x74, 0x37, 0x9c, 0x7c, 0xd7, 0xa1, 0x0a, - 0xea, 0x41, 0x06, 0xad, 0x4d, 0xe6, 0x90, 0x3b, 0xdb, 0x70, - 0x55, 0xfe, 0x1e, 0xb5, 0xc3, 0x68, 0x88, 0x23, 0x64, 0xcf, - 0x2f, 0x84, 0xf2, 0x59, 0xb9, 0x12, 0xf3, 0x58, 0xb8, 0x13, - 0x65, 0xce, 0x2e, 0x85, 0xc2, 0x69, 0x89, 0x22, 0x54, 0xff, - 0x1f, 0xb4, 0x91, 0x3a, 0xda, 0x71, 0x07, 0xac, 0x4c, 0xe7, - 0xa0, 0x0b, 0xeb, 0x40, 0x36, 0x9d, 0x7d, 0xd6, 0xa2, 0x09, - 0xe9, 0x42, 0x34, 0x9f, 0x7f, 0xd4, 0x93, 0x38, 0xd8, 0x73, - 0x05, 0xae, 0x4e, 0xe5, 0xc0, 0x6b, 0x8b, 0x20, 0x56, 0xfd, - 0x1d, 0xb6, 0xf1, 0x5a, 0xba, 0x11, 0x67, 0xcc, 0x2c, 0x87, - 0x66, 0xcd, 0x2d, 0x86, 0xf0, 0x5b, 0xbb, 0x10, 0x57, 0xfc, - 0x1c, 0xb7, 0xc1, 0x6a, 0x8a, 0x21, 0x04, 0xaf, 0x4f, 0xe4, - 0x92, 0x39, 0xd9, 0x72, 0x35, 0x9e, 0x7e, 0xd5, 0xa3, 0x08, - 0xe8, 0x43, 0x00, 0xac, 0x45, 0xe9, 0x8a, 0x26, 0xcf, 0x63, - 0x09, 0xa5, 0x4c, 0xe0, 0x83, 0x2f, 0xc6, 0x6a, 0x12, 0xbe, - 0x57, 0xfb, 0x98, 0x34, 0xdd, 0x71, 0x1b, 0xb7, 0x5e, 0xf2, - 0x91, 0x3d, 0xd4, 0x78, 0x24, 0x88, 0x61, 0xcd, 0xae, 0x02, - 0xeb, 0x47, 0x2d, 0x81, 0x68, 0xc4, 0xa7, 0x0b, 0xe2, 0x4e, - 0x36, 0x9a, 0x73, 0xdf, 0xbc, 0x10, 0xf9, 0x55, 0x3f, 0x93, - 0x7a, 0xd6, 0xb5, 0x19, 0xf0, 0x5c, 0x48, 0xe4, 0x0d, 0xa1, - 0xc2, 0x6e, 0x87, 0x2b, 0x41, 0xed, 0x04, 0xa8, 0xcb, 0x67, - 0x8e, 0x22, 0x5a, 0xf6, 0x1f, 0xb3, 0xd0, 0x7c, 0x95, 0x39, - 0x53, 0xff, 0x16, 0xba, 0xd9, 0x75, 0x9c, 0x30, 0x6c, 0xc0, - 0x29, 0x85, 0xe6, 0x4a, 0xa3, 0x0f, 0x65, 0xc9, 0x20, 0x8c, - 0xef, 0x43, 0xaa, 0x06, 0x7e, 0xd2, 0x3b, 0x97, 0xf4, 0x58, - 0xb1, 0x1d, 0x77, 0xdb, 0x32, 0x9e, 0xfd, 0x51, 0xb8, 0x14, - 0x90, 0x3c, 0xd5, 0x79, 0x1a, 0xb6, 0x5f, 0xf3, 0x99, 0x35, - 0xdc, 0x70, 0x13, 0xbf, 0x56, 0xfa, 0x82, 0x2e, 0xc7, 0x6b, - 0x08, 0xa4, 0x4d, 0xe1, 0x8b, 0x27, 0xce, 0x62, 0x01, 0xad, - 0x44, 0xe8, 0xb4, 0x18, 0xf1, 0x5d, 0x3e, 0x92, 0x7b, 0xd7, - 0xbd, 0x11, 0xf8, 0x54, 0x37, 0x9b, 0x72, 0xde, 0xa6, 0x0a, - 0xe3, 0x4f, 0x2c, 0x80, 0x69, 0xc5, 0xaf, 0x03, 0xea, 0x46, - 0x25, 0x89, 0x60, 0xcc, 0xd8, 0x74, 0x9d, 0x31, 0x52, 0xfe, - 0x17, 0xbb, 0xd1, 0x7d, 0x94, 0x38, 0x5b, 0xf7, 0x1e, 0xb2, - 0xca, 0x66, 0x8f, 0x23, 0x40, 0xec, 0x05, 0xa9, 0xc3, 0x6f, - 0x86, 0x2a, 0x49, 0xe5, 0x0c, 0xa0, 0xfc, 0x50, 0xb9, 0x15, - 0x76, 0xda, 0x33, 0x9f, 0xf5, 0x59, 0xb0, 0x1c, 0x7f, 0xd3, - 0x3a, 0x96, 0xee, 0x42, 0xab, 0x07, 0x64, 0xc8, 0x21, 0x8d, - 0xe7, 0x4b, 0xa2, 0x0e, 0x6d, 0xc1, 0x28, 0x84, 0x00, 0xad, - 0x47, 0xea, 0x8e, 0x23, 0xc9, 0x64, 0x01, 0xac, 0x46, 0xeb, - 0x8f, 0x22, 0xc8, 0x65, 0x02, 0xaf, 0x45, 0xe8, 0x8c, 0x21, - 0xcb, 0x66, 0x03, 0xae, 0x44, 0xe9, 0x8d, 0x20, 0xca, 0x67, - 0x04, 0xa9, 0x43, 0xee, 0x8a, 0x27, 0xcd, 0x60, 0x05, 0xa8, - 0x42, 0xef, 0x8b, 0x26, 0xcc, 0x61, 0x06, 0xab, 0x41, 0xec, - 0x88, 0x25, 0xcf, 0x62, 0x07, 0xaa, 0x40, 0xed, 0x89, 0x24, - 0xce, 0x63, 0x08, 0xa5, 0x4f, 0xe2, 0x86, 0x2b, 0xc1, 0x6c, - 0x09, 0xa4, 0x4e, 0xe3, 0x87, 0x2a, 0xc0, 0x6d, 0x0a, 0xa7, - 0x4d, 0xe0, 0x84, 0x29, 0xc3, 0x6e, 0x0b, 0xa6, 0x4c, 0xe1, - 0x85, 0x28, 0xc2, 0x6f, 0x0c, 0xa1, 0x4b, 0xe6, 0x82, 0x2f, - 0xc5, 0x68, 0x0d, 0xa0, 0x4a, 0xe7, 0x83, 0x2e, 0xc4, 0x69, - 0x0e, 0xa3, 0x49, 0xe4, 0x80, 0x2d, 0xc7, 0x6a, 0x0f, 0xa2, - 0x48, 0xe5, 0x81, 0x2c, 0xc6, 0x6b, 0x10, 0xbd, 0x57, 0xfa, - 0x9e, 0x33, 0xd9, 0x74, 0x11, 0xbc, 0x56, 0xfb, 0x9f, 0x32, - 0xd8, 0x75, 0x12, 0xbf, 0x55, 0xf8, 0x9c, 0x31, 0xdb, 0x76, - 0x13, 0xbe, 0x54, 0xf9, 0x9d, 0x30, 0xda, 0x77, 0x14, 0xb9, - 0x53, 0xfe, 0x9a, 0x37, 0xdd, 0x70, 0x15, 0xb8, 0x52, 0xff, - 0x9b, 0x36, 0xdc, 0x71, 0x16, 0xbb, 0x51, 0xfc, 0x98, 0x35, - 0xdf, 0x72, 0x17, 0xba, 0x50, 0xfd, 0x99, 0x34, 0xde, 0x73, - 0x18, 0xb5, 0x5f, 0xf2, 0x96, 0x3b, 0xd1, 0x7c, 0x19, 0xb4, - 0x5e, 0xf3, 0x97, 0x3a, 0xd0, 0x7d, 0x1a, 0xb7, 0x5d, 0xf0, - 0x94, 0x39, 0xd3, 0x7e, 0x1b, 0xb6, 0x5c, 0xf1, 0x95, 0x38, - 0xd2, 0x7f, 0x1c, 0xb1, 0x5b, 0xf6, 0x92, 0x3f, 0xd5, 0x78, - 0x1d, 0xb0, 0x5a, 0xf7, 0x93, 0x3e, 0xd4, 0x79, 0x1e, 0xb3, - 0x59, 0xf4, 0x90, 0x3d, 0xd7, 0x7a, 0x1f, 0xb2, 0x58, 0xf5, - 0x91, 0x3c, 0xd6, 0x7b, 0x00, 0xae, 0x41, 0xef, 0x82, 0x2c, - 0xc3, 0x6d, 0x19, 0xb7, 0x58, 0xf6, 0x9b, 0x35, 0xda, 0x74, - 0x32, 0x9c, 0x73, 0xdd, 0xb0, 0x1e, 0xf1, 0x5f, 0x2b, 0x85, - 0x6a, 0xc4, 0xa9, 0x07, 0xe8, 0x46, 0x64, 0xca, 0x25, 0x8b, - 0xe6, 0x48, 0xa7, 0x09, 0x7d, 0xd3, 0x3c, 0x92, 0xff, 0x51, - 0xbe, 0x10, 0x56, 0xf8, 0x17, 0xb9, 0xd4, 0x7a, 0x95, 0x3b, - 0x4f, 0xe1, 0x0e, 0xa0, 0xcd, 0x63, 0x8c, 0x22, 0xc8, 0x66, - 0x89, 0x27, 0x4a, 0xe4, 0x0b, 0xa5, 0xd1, 0x7f, 0x90, 0x3e, - 0x53, 0xfd, 0x12, 0xbc, 0xfa, 0x54, 0xbb, 0x15, 0x78, 0xd6, - 0x39, 0x97, 0xe3, 0x4d, 0xa2, 0x0c, 0x61, 0xcf, 0x20, 0x8e, - 0xac, 0x02, 0xed, 0x43, 0x2e, 0x80, 0x6f, 0xc1, 0xb5, 0x1b, - 0xf4, 0x5a, 0x37, 0x99, 0x76, 0xd8, 0x9e, 0x30, 0xdf, 0x71, - 0x1c, 0xb2, 0x5d, 0xf3, 0x87, 0x29, 0xc6, 0x68, 0x05, 0xab, - 0x44, 0xea, 0x8d, 0x23, 0xcc, 0x62, 0x0f, 0xa1, 0x4e, 0xe0, - 0x94, 0x3a, 0xd5, 0x7b, 0x16, 0xb8, 0x57, 0xf9, 0xbf, 0x11, - 0xfe, 0x50, 0x3d, 0x93, 0x7c, 0xd2, 0xa6, 0x08, 0xe7, 0x49, - 0x24, 0x8a, 0x65, 0xcb, 0xe9, 0x47, 0xa8, 0x06, 0x6b, 0xc5, - 0x2a, 0x84, 0xf0, 0x5e, 0xb1, 0x1f, 0x72, 0xdc, 0x33, 0x9d, - 0xdb, 0x75, 0x9a, 0x34, 0x59, 0xf7, 0x18, 0xb6, 0xc2, 0x6c, - 0x83, 0x2d, 0x40, 0xee, 0x01, 0xaf, 0x45, 0xeb, 0x04, 0xaa, - 0xc7, 0x69, 0x86, 0x28, 0x5c, 0xf2, 0x1d, 0xb3, 0xde, 0x70, - 0x9f, 0x31, 0x77, 0xd9, 0x36, 0x98, 0xf5, 0x5b, 0xb4, 0x1a, - 0x6e, 0xc0, 0x2f, 0x81, 0xec, 0x42, 0xad, 0x03, 0x21, 0x8f, - 0x60, 0xce, 0xa3, 0x0d, 0xe2, 0x4c, 0x38, 0x96, 0x79, 0xd7, - 0xba, 0x14, 0xfb, 0x55, 0x13, 0xbd, 0x52, 0xfc, 0x91, 0x3f, - 0xd0, 0x7e, 0x0a, 0xa4, 0x4b, 0xe5, 0x88, 0x26, 0xc9, 0x67, - 0x00, 0xaf, 0x43, 0xec, 0x86, 0x29, 0xc5, 0x6a, 0x11, 0xbe, - 0x52, 0xfd, 0x97, 0x38, 0xd4, 0x7b, 0x22, 0x8d, 0x61, 0xce, - 0xa4, 0x0b, 0xe7, 0x48, 0x33, 0x9c, 0x70, 0xdf, 0xb5, 0x1a, - 0xf6, 0x59, 0x44, 0xeb, 0x07, 0xa8, 0xc2, 0x6d, 0x81, 0x2e, - 0x55, 0xfa, 0x16, 0xb9, 0xd3, 0x7c, 0x90, 0x3f, 0x66, 0xc9, - 0x25, 0x8a, 0xe0, 0x4f, 0xa3, 0x0c, 0x77, 0xd8, 0x34, 0x9b, - 0xf1, 0x5e, 0xb2, 0x1d, 0x88, 0x27, 0xcb, 0x64, 0x0e, 0xa1, - 0x4d, 0xe2, 0x99, 0x36, 0xda, 0x75, 0x1f, 0xb0, 0x5c, 0xf3, - 0xaa, 0x05, 0xe9, 0x46, 0x2c, 0x83, 0x6f, 0xc0, 0xbb, 0x14, - 0xf8, 0x57, 0x3d, 0x92, 0x7e, 0xd1, 0xcc, 0x63, 0x8f, 0x20, - 0x4a, 0xe5, 0x09, 0xa6, 0xdd, 0x72, 0x9e, 0x31, 0x5b, 0xf4, - 0x18, 0xb7, 0xee, 0x41, 0xad, 0x02, 0x68, 0xc7, 0x2b, 0x84, - 0xff, 0x50, 0xbc, 0x13, 0x79, 0xd6, 0x3a, 0x95, 0x0d, 0xa2, - 0x4e, 0xe1, 0x8b, 0x24, 0xc8, 0x67, 0x1c, 0xb3, 0x5f, 0xf0, - 0x9a, 0x35, 0xd9, 0x76, 0x2f, 0x80, 0x6c, 0xc3, 0xa9, 0x06, - 0xea, 0x45, 0x3e, 0x91, 0x7d, 0xd2, 0xb8, 0x17, 0xfb, 0x54, - 0x49, 0xe6, 0x0a, 0xa5, 0xcf, 0x60, 0x8c, 0x23, 0x58, 0xf7, - 0x1b, 0xb4, 0xde, 0x71, 0x9d, 0x32, 0x6b, 0xc4, 0x28, 0x87, - 0xed, 0x42, 0xae, 0x01, 0x7a, 0xd5, 0x39, 0x96, 0xfc, 0x53, - 0xbf, 0x10, 0x85, 0x2a, 0xc6, 0x69, 0x03, 0xac, 0x40, 0xef, - 0x94, 0x3b, 0xd7, 0x78, 0x12, 0xbd, 0x51, 0xfe, 0xa7, 0x08, - 0xe4, 0x4b, 0x21, 0x8e, 0x62, 0xcd, 0xb6, 0x19, 0xf5, 0x5a, - 0x30, 0x9f, 0x73, 0xdc, 0xc1, 0x6e, 0x82, 0x2d, 0x47, 0xe8, - 0x04, 0xab, 0xd0, 0x7f, 0x93, 0x3c, 0x56, 0xf9, 0x15, 0xba, - 0xe3, 0x4c, 0xa0, 0x0f, 0x65, 0xca, 0x26, 0x89, 0xf2, 0x5d, - 0xb1, 0x1e, 0x74, 0xdb, 0x37, 0x98, 0x00, 0xb0, 0x7d, 0xcd, - 0xfa, 0x4a, 0x87, 0x37, 0xe9, 0x59, 0x94, 0x24, 0x13, 0xa3, - 0x6e, 0xde, 0xcf, 0x7f, 0xb2, 0x02, 0x35, 0x85, 0x48, 0xf8, - 0x26, 0x96, 0x5b, 0xeb, 0xdc, 0x6c, 0xa1, 0x11, 0x83, 0x33, - 0xfe, 0x4e, 0x79, 0xc9, 0x04, 0xb4, 0x6a, 0xda, 0x17, 0xa7, - 0x90, 0x20, 0xed, 0x5d, 0x4c, 0xfc, 0x31, 0x81, 0xb6, 0x06, - 0xcb, 0x7b, 0xa5, 0x15, 0xd8, 0x68, 0x5f, 0xef, 0x22, 0x92, - 0x1b, 0xab, 0x66, 0xd6, 0xe1, 0x51, 0x9c, 0x2c, 0xf2, 0x42, - 0x8f, 0x3f, 0x08, 0xb8, 0x75, 0xc5, 0xd4, 0x64, 0xa9, 0x19, - 0x2e, 0x9e, 0x53, 0xe3, 0x3d, 0x8d, 0x40, 0xf0, 0xc7, 0x77, - 0xba, 0x0a, 0x98, 0x28, 0xe5, 0x55, 0x62, 0xd2, 0x1f, 0xaf, - 0x71, 0xc1, 0x0c, 0xbc, 0x8b, 0x3b, 0xf6, 0x46, 0x57, 0xe7, - 0x2a, 0x9a, 0xad, 0x1d, 0xd0, 0x60, 0xbe, 0x0e, 0xc3, 0x73, - 0x44, 0xf4, 0x39, 0x89, 0x36, 0x86, 0x4b, 0xfb, 0xcc, 0x7c, - 0xb1, 0x01, 0xdf, 0x6f, 0xa2, 0x12, 0x25, 0x95, 0x58, 0xe8, - 0xf9, 0x49, 0x84, 0x34, 0x03, 0xb3, 0x7e, 0xce, 0x10, 0xa0, - 0x6d, 0xdd, 0xea, 0x5a, 0x97, 0x27, 0xb5, 0x05, 0xc8, 0x78, - 0x4f, 0xff, 0x32, 0x82, 0x5c, 0xec, 0x21, 0x91, 0xa6, 0x16, - 0xdb, 0x6b, 0x7a, 0xca, 0x07, 0xb7, 0x80, 0x30, 0xfd, 0x4d, - 0x93, 0x23, 0xee, 0x5e, 0x69, 0xd9, 0x14, 0xa4, 0x2d, 0x9d, - 0x50, 0xe0, 0xd7, 0x67, 0xaa, 0x1a, 0xc4, 0x74, 0xb9, 0x09, - 0x3e, 0x8e, 0x43, 0xf3, 0xe2, 0x52, 0x9f, 0x2f, 0x18, 0xa8, - 0x65, 0xd5, 0x0b, 0xbb, 0x76, 0xc6, 0xf1, 0x41, 0x8c, 0x3c, - 0xae, 0x1e, 0xd3, 0x63, 0x54, 0xe4, 0x29, 0x99, 0x47, 0xf7, - 0x3a, 0x8a, 0xbd, 0x0d, 0xc0, 0x70, 0x61, 0xd1, 0x1c, 0xac, - 0x9b, 0x2b, 0xe6, 0x56, 0x88, 0x38, 0xf5, 0x45, 0x72, 0xc2, - 0x0f, 0xbf, 0x00, 0xb1, 0x7f, 0xce, 0xfe, 0x4f, 0x81, 0x30, - 0xe1, 0x50, 0x9e, 0x2f, 0x1f, 0xae, 0x60, 0xd1, 0xdf, 0x6e, - 0xa0, 0x11, 0x21, 0x90, 0x5e, 0xef, 0x3e, 0x8f, 0x41, 0xf0, - 0xc0, 0x71, 0xbf, 0x0e, 0xa3, 0x12, 0xdc, 0x6d, 0x5d, 0xec, - 0x22, 0x93, 0x42, 0xf3, 0x3d, 0x8c, 0xbc, 0x0d, 0xc3, 0x72, - 0x7c, 0xcd, 0x03, 0xb2, 0x82, 0x33, 0xfd, 0x4c, 0x9d, 0x2c, - 0xe2, 0x53, 0x63, 0xd2, 0x1c, 0xad, 0x5b, 0xea, 0x24, 0x95, - 0xa5, 0x14, 0xda, 0x6b, 0xba, 0x0b, 0xc5, 0x74, 0x44, 0xf5, - 0x3b, 0x8a, 0x84, 0x35, 0xfb, 0x4a, 0x7a, 0xcb, 0x05, 0xb4, - 0x65, 0xd4, 0x1a, 0xab, 0x9b, 0x2a, 0xe4, 0x55, 0xf8, 0x49, - 0x87, 0x36, 0x06, 0xb7, 0x79, 0xc8, 0x19, 0xa8, 0x66, 0xd7, - 0xe7, 0x56, 0x98, 0x29, 0x27, 0x96, 0x58, 0xe9, 0xd9, 0x68, - 0xa6, 0x17, 0xc6, 0x77, 0xb9, 0x08, 0x38, 0x89, 0x47, 0xf6, - 0xb6, 0x07, 0xc9, 0x78, 0x48, 0xf9, 0x37, 0x86, 0x57, 0xe6, - 0x28, 0x99, 0xa9, 0x18, 0xd6, 0x67, 0x69, 0xd8, 0x16, 0xa7, - 0x97, 0x26, 0xe8, 0x59, 0x88, 0x39, 0xf7, 0x46, 0x76, 0xc7, - 0x09, 0xb8, 0x15, 0xa4, 0x6a, 0xdb, 0xeb, 0x5a, 0x94, 0x25, - 0xf4, 0x45, 0x8b, 0x3a, 0x0a, 0xbb, 0x75, 0xc4, 0xca, 0x7b, - 0xb5, 0x04, 0x34, 0x85, 0x4b, 0xfa, 0x2b, 0x9a, 0x54, 0xe5, - 0xd5, 0x64, 0xaa, 0x1b, 0xed, 0x5c, 0x92, 0x23, 0x13, 0xa2, - 0x6c, 0xdd, 0x0c, 0xbd, 0x73, 0xc2, 0xf2, 0x43, 0x8d, 0x3c, - 0x32, 0x83, 0x4d, 0xfc, 0xcc, 0x7d, 0xb3, 0x02, 0xd3, 0x62, - 0xac, 0x1d, 0x2d, 0x9c, 0x52, 0xe3, 0x4e, 0xff, 0x31, 0x80, - 0xb0, 0x01, 0xcf, 0x7e, 0xaf, 0x1e, 0xd0, 0x61, 0x51, 0xe0, - 0x2e, 0x9f, 0x91, 0x20, 0xee, 0x5f, 0x6f, 0xde, 0x10, 0xa1, - 0x70, 0xc1, 0x0f, 0xbe, 0x8e, 0x3f, 0xf1, 0x40, 0x00, 0xb2, - 0x79, 0xcb, 0xf2, 0x40, 0x8b, 0x39, 0xf9, 0x4b, 0x80, 0x32, - 0x0b, 0xb9, 0x72, 0xc0, 0xef, 0x5d, 0x96, 0x24, 0x1d, 0xaf, - 0x64, 0xd6, 0x16, 0xa4, 0x6f, 0xdd, 0xe4, 0x56, 0x9d, 0x2f, - 0xc3, 0x71, 0xba, 0x08, 0x31, 0x83, 0x48, 0xfa, 0x3a, 0x88, - 0x43, 0xf1, 0xc8, 0x7a, 0xb1, 0x03, 0x2c, 0x9e, 0x55, 0xe7, - 0xde, 0x6c, 0xa7, 0x15, 0xd5, 0x67, 0xac, 0x1e, 0x27, 0x95, - 0x5e, 0xec, 0x9b, 0x29, 0xe2, 0x50, 0x69, 0xdb, 0x10, 0xa2, - 0x62, 0xd0, 0x1b, 0xa9, 0x90, 0x22, 0xe9, 0x5b, 0x74, 0xc6, - 0x0d, 0xbf, 0x86, 0x34, 0xff, 0x4d, 0x8d, 0x3f, 0xf4, 0x46, - 0x7f, 0xcd, 0x06, 0xb4, 0x58, 0xea, 0x21, 0x93, 0xaa, 0x18, - 0xd3, 0x61, 0xa1, 0x13, 0xd8, 0x6a, 0x53, 0xe1, 0x2a, 0x98, - 0xb7, 0x05, 0xce, 0x7c, 0x45, 0xf7, 0x3c, 0x8e, 0x4e, 0xfc, - 0x37, 0x85, 0xbc, 0x0e, 0xc5, 0x77, 0x2b, 0x99, 0x52, 0xe0, - 0xd9, 0x6b, 0xa0, 0x12, 0xd2, 0x60, 0xab, 0x19, 0x20, 0x92, - 0x59, 0xeb, 0xc4, 0x76, 0xbd, 0x0f, 0x36, 0x84, 0x4f, 0xfd, - 0x3d, 0x8f, 0x44, 0xf6, 0xcf, 0x7d, 0xb6, 0x04, 0xe8, 0x5a, - 0x91, 0x23, 0x1a, 0xa8, 0x63, 0xd1, 0x11, 0xa3, 0x68, 0xda, - 0xe3, 0x51, 0x9a, 0x28, 0x07, 0xb5, 0x7e, 0xcc, 0xf5, 0x47, - 0x8c, 0x3e, 0xfe, 0x4c, 0x87, 0x35, 0x0c, 0xbe, 0x75, 0xc7, - 0xb0, 0x02, 0xc9, 0x7b, 0x42, 0xf0, 0x3b, 0x89, 0x49, 0xfb, - 0x30, 0x82, 0xbb, 0x09, 0xc2, 0x70, 0x5f, 0xed, 0x26, 0x94, - 0xad, 0x1f, 0xd4, 0x66, 0xa6, 0x14, 0xdf, 0x6d, 0x54, 0xe6, - 0x2d, 0x9f, 0x73, 0xc1, 0x0a, 0xb8, 0x81, 0x33, 0xf8, 0x4a, - 0x8a, 0x38, 0xf3, 0x41, 0x78, 0xca, 0x01, 0xb3, 0x9c, 0x2e, - 0xe5, 0x57, 0x6e, 0xdc, 0x17, 0xa5, 0x65, 0xd7, 0x1c, 0xae, - 0x97, 0x25, 0xee, 0x5c, 0x00, 0xb3, 0x7b, 0xc8, 0xf6, 0x45, - 0x8d, 0x3e, 0xf1, 0x42, 0x8a, 0x39, 0x07, 0xb4, 0x7c, 0xcf, - 0xff, 0x4c, 0x84, 0x37, 0x09, 0xba, 0x72, 0xc1, 0x0e, 0xbd, - 0x75, 0xc6, 0xf8, 0x4b, 0x83, 0x30, 0xe3, 0x50, 0x98, 0x2b, - 0x15, 0xa6, 0x6e, 0xdd, 0x12, 0xa1, 0x69, 0xda, 0xe4, 0x57, - 0x9f, 0x2c, 0x1c, 0xaf, 0x67, 0xd4, 0xea, 0x59, 0x91, 0x22, - 0xed, 0x5e, 0x96, 0x25, 0x1b, 0xa8, 0x60, 0xd3, 0xdb, 0x68, - 0xa0, 0x13, 0x2d, 0x9e, 0x56, 0xe5, 0x2a, 0x99, 0x51, 0xe2, - 0xdc, 0x6f, 0xa7, 0x14, 0x24, 0x97, 0x5f, 0xec, 0xd2, 0x61, - 0xa9, 0x1a, 0xd5, 0x66, 0xae, 0x1d, 0x23, 0x90, 0x58, 0xeb, - 0x38, 0x8b, 0x43, 0xf0, 0xce, 0x7d, 0xb5, 0x06, 0xc9, 0x7a, - 0xb2, 0x01, 0x3f, 0x8c, 0x44, 0xf7, 0xc7, 0x74, 0xbc, 0x0f, - 0x31, 0x82, 0x4a, 0xf9, 0x36, 0x85, 0x4d, 0xfe, 0xc0, 0x73, - 0xbb, 0x08, 0xab, 0x18, 0xd0, 0x63, 0x5d, 0xee, 0x26, 0x95, - 0x5a, 0xe9, 0x21, 0x92, 0xac, 0x1f, 0xd7, 0x64, 0x54, 0xe7, - 0x2f, 0x9c, 0xa2, 0x11, 0xd9, 0x6a, 0xa5, 0x16, 0xde, 0x6d, - 0x53, 0xe0, 0x28, 0x9b, 0x48, 0xfb, 0x33, 0x80, 0xbe, 0x0d, - 0xc5, 0x76, 0xb9, 0x0a, 0xc2, 0x71, 0x4f, 0xfc, 0x34, 0x87, - 0xb7, 0x04, 0xcc, 0x7f, 0x41, 0xf2, 0x3a, 0x89, 0x46, 0xf5, - 0x3d, 0x8e, 0xb0, 0x03, 0xcb, 0x78, 0x70, 0xc3, 0x0b, 0xb8, - 0x86, 0x35, 0xfd, 0x4e, 0x81, 0x32, 0xfa, 0x49, 0x77, 0xc4, - 0x0c, 0xbf, 0x8f, 0x3c, 0xf4, 0x47, 0x79, 0xca, 0x02, 0xb1, - 0x7e, 0xcd, 0x05, 0xb6, 0x88, 0x3b, 0xf3, 0x40, 0x93, 0x20, - 0xe8, 0x5b, 0x65, 0xd6, 0x1e, 0xad, 0x62, 0xd1, 0x19, 0xaa, - 0x94, 0x27, 0xef, 0x5c, 0x6c, 0xdf, 0x17, 0xa4, 0x9a, 0x29, - 0xe1, 0x52, 0x9d, 0x2e, 0xe6, 0x55, 0x6b, 0xd8, 0x10, 0xa3, - 0x00, 0xb4, 0x75, 0xc1, 0xea, 0x5e, 0x9f, 0x2b, 0xc9, 0x7d, - 0xbc, 0x08, 0x23, 0x97, 0x56, 0xe2, 0x8f, 0x3b, 0xfa, 0x4e, - 0x65, 0xd1, 0x10, 0xa4, 0x46, 0xf2, 0x33, 0x87, 0xac, 0x18, - 0xd9, 0x6d, 0x03, 0xb7, 0x76, 0xc2, 0xe9, 0x5d, 0x9c, 0x28, - 0xca, 0x7e, 0xbf, 0x0b, 0x20, 0x94, 0x55, 0xe1, 0x8c, 0x38, - 0xf9, 0x4d, 0x66, 0xd2, 0x13, 0xa7, 0x45, 0xf1, 0x30, 0x84, - 0xaf, 0x1b, 0xda, 0x6e, 0x06, 0xb2, 0x73, 0xc7, 0xec, 0x58, - 0x99, 0x2d, 0xcf, 0x7b, 0xba, 0x0e, 0x25, 0x91, 0x50, 0xe4, - 0x89, 0x3d, 0xfc, 0x48, 0x63, 0xd7, 0x16, 0xa2, 0x40, 0xf4, - 0x35, 0x81, 0xaa, 0x1e, 0xdf, 0x6b, 0x05, 0xb1, 0x70, 0xc4, - 0xef, 0x5b, 0x9a, 0x2e, 0xcc, 0x78, 0xb9, 0x0d, 0x26, 0x92, - 0x53, 0xe7, 0x8a, 0x3e, 0xff, 0x4b, 0x60, 0xd4, 0x15, 0xa1, - 0x43, 0xf7, 0x36, 0x82, 0xa9, 0x1d, 0xdc, 0x68, 0x0c, 0xb8, - 0x79, 0xcd, 0xe6, 0x52, 0x93, 0x27, 0xc5, 0x71, 0xb0, 0x04, - 0x2f, 0x9b, 0x5a, 0xee, 0x83, 0x37, 0xf6, 0x42, 0x69, 0xdd, - 0x1c, 0xa8, 0x4a, 0xfe, 0x3f, 0x8b, 0xa0, 0x14, 0xd5, 0x61, - 0x0f, 0xbb, 0x7a, 0xce, 0xe5, 0x51, 0x90, 0x24, 0xc6, 0x72, - 0xb3, 0x07, 0x2c, 0x98, 0x59, 0xed, 0x80, 0x34, 0xf5, 0x41, - 0x6a, 0xde, 0x1f, 0xab, 0x49, 0xfd, 0x3c, 0x88, 0xa3, 0x17, - 0xd6, 0x62, 0x0a, 0xbe, 0x7f, 0xcb, 0xe0, 0x54, 0x95, 0x21, - 0xc3, 0x77, 0xb6, 0x02, 0x29, 0x9d, 0x5c, 0xe8, 0x85, 0x31, - 0xf0, 0x44, 0x6f, 0xdb, 0x1a, 0xae, 0x4c, 0xf8, 0x39, 0x8d, - 0xa6, 0x12, 0xd3, 0x67, 0x09, 0xbd, 0x7c, 0xc8, 0xe3, 0x57, - 0x96, 0x22, 0xc0, 0x74, 0xb5, 0x01, 0x2a, 0x9e, 0x5f, 0xeb, - 0x86, 0x32, 0xf3, 0x47, 0x6c, 0xd8, 0x19, 0xad, 0x4f, 0xfb, - 0x3a, 0x8e, 0xa5, 0x11, 0xd0, 0x64, 0x00, 0xb5, 0x77, 0xc2, - 0xee, 0x5b, 0x99, 0x2c, 0xc1, 0x74, 0xb6, 0x03, 0x2f, 0x9a, - 0x58, 0xed, 0x9f, 0x2a, 0xe8, 0x5d, 0x71, 0xc4, 0x06, 0xb3, - 0x5e, 0xeb, 0x29, 0x9c, 0xb0, 0x05, 0xc7, 0x72, 0x23, 0x96, - 0x54, 0xe1, 0xcd, 0x78, 0xba, 0x0f, 0xe2, 0x57, 0x95, 0x20, - 0x0c, 0xb9, 0x7b, 0xce, 0xbc, 0x09, 0xcb, 0x7e, 0x52, 0xe7, - 0x25, 0x90, 0x7d, 0xc8, 0x0a, 0xbf, 0x93, 0x26, 0xe4, 0x51, - 0x46, 0xf3, 0x31, 0x84, 0xa8, 0x1d, 0xdf, 0x6a, 0x87, 0x32, - 0xf0, 0x45, 0x69, 0xdc, 0x1e, 0xab, 0xd9, 0x6c, 0xae, 0x1b, - 0x37, 0x82, 0x40, 0xf5, 0x18, 0xad, 0x6f, 0xda, 0xf6, 0x43, - 0x81, 0x34, 0x65, 0xd0, 0x12, 0xa7, 0x8b, 0x3e, 0xfc, 0x49, - 0xa4, 0x11, 0xd3, 0x66, 0x4a, 0xff, 0x3d, 0x88, 0xfa, 0x4f, - 0x8d, 0x38, 0x14, 0xa1, 0x63, 0xd6, 0x3b, 0x8e, 0x4c, 0xf9, - 0xd5, 0x60, 0xa2, 0x17, 0x8c, 0x39, 0xfb, 0x4e, 0x62, 0xd7, - 0x15, 0xa0, 0x4d, 0xf8, 0x3a, 0x8f, 0xa3, 0x16, 0xd4, 0x61, - 0x13, 0xa6, 0x64, 0xd1, 0xfd, 0x48, 0x8a, 0x3f, 0xd2, 0x67, - 0xa5, 0x10, 0x3c, 0x89, 0x4b, 0xfe, 0xaf, 0x1a, 0xd8, 0x6d, - 0x41, 0xf4, 0x36, 0x83, 0x6e, 0xdb, 0x19, 0xac, 0x80, 0x35, - 0xf7, 0x42, 0x30, 0x85, 0x47, 0xf2, 0xde, 0x6b, 0xa9, 0x1c, - 0xf1, 0x44, 0x86, 0x33, 0x1f, 0xaa, 0x68, 0xdd, 0xca, 0x7f, - 0xbd, 0x08, 0x24, 0x91, 0x53, 0xe6, 0x0b, 0xbe, 0x7c, 0xc9, - 0xe5, 0x50, 0x92, 0x27, 0x55, 0xe0, 0x22, 0x97, 0xbb, 0x0e, - 0xcc, 0x79, 0x94, 0x21, 0xe3, 0x56, 0x7a, 0xcf, 0x0d, 0xb8, - 0xe9, 0x5c, 0x9e, 0x2b, 0x07, 0xb2, 0x70, 0xc5, 0x28, 0x9d, - 0x5f, 0xea, 0xc6, 0x73, 0xb1, 0x04, 0x76, 0xc3, 0x01, 0xb4, - 0x98, 0x2d, 0xef, 0x5a, 0xb7, 0x02, 0xc0, 0x75, 0x59, 0xec, - 0x2e, 0x9b, 0x00, 0xb6, 0x71, 0xc7, 0xe2, 0x54, 0x93, 0x25, - 0xd9, 0x6f, 0xa8, 0x1e, 0x3b, 0x8d, 0x4a, 0xfc, 0xaf, 0x19, - 0xde, 0x68, 0x4d, 0xfb, 0x3c, 0x8a, 0x76, 0xc0, 0x07, 0xb1, - 0x94, 0x22, 0xe5, 0x53, 0x43, 0xf5, 0x32, 0x84, 0xa1, 0x17, - 0xd0, 0x66, 0x9a, 0x2c, 0xeb, 0x5d, 0x78, 0xce, 0x09, 0xbf, - 0xec, 0x5a, 0x9d, 0x2b, 0x0e, 0xb8, 0x7f, 0xc9, 0x35, 0x83, - 0x44, 0xf2, 0xd7, 0x61, 0xa6, 0x10, 0x86, 0x30, 0xf7, 0x41, - 0x64, 0xd2, 0x15, 0xa3, 0x5f, 0xe9, 0x2e, 0x98, 0xbd, 0x0b, - 0xcc, 0x7a, 0x29, 0x9f, 0x58, 0xee, 0xcb, 0x7d, 0xba, 0x0c, - 0xf0, 0x46, 0x81, 0x37, 0x12, 0xa4, 0x63, 0xd5, 0xc5, 0x73, - 0xb4, 0x02, 0x27, 0x91, 0x56, 0xe0, 0x1c, 0xaa, 0x6d, 0xdb, - 0xfe, 0x48, 0x8f, 0x39, 0x6a, 0xdc, 0x1b, 0xad, 0x88, 0x3e, - 0xf9, 0x4f, 0xb3, 0x05, 0xc2, 0x74, 0x51, 0xe7, 0x20, 0x96, - 0x11, 0xa7, 0x60, 0xd6, 0xf3, 0x45, 0x82, 0x34, 0xc8, 0x7e, - 0xb9, 0x0f, 0x2a, 0x9c, 0x5b, 0xed, 0xbe, 0x08, 0xcf, 0x79, - 0x5c, 0xea, 0x2d, 0x9b, 0x67, 0xd1, 0x16, 0xa0, 0x85, 0x33, - 0xf4, 0x42, 0x52, 0xe4, 0x23, 0x95, 0xb0, 0x06, 0xc1, 0x77, - 0x8b, 0x3d, 0xfa, 0x4c, 0x69, 0xdf, 0x18, 0xae, 0xfd, 0x4b, - 0x8c, 0x3a, 0x1f, 0xa9, 0x6e, 0xd8, 0x24, 0x92, 0x55, 0xe3, - 0xc6, 0x70, 0xb7, 0x01, 0x97, 0x21, 0xe6, 0x50, 0x75, 0xc3, - 0x04, 0xb2, 0x4e, 0xf8, 0x3f, 0x89, 0xac, 0x1a, 0xdd, 0x6b, - 0x38, 0x8e, 0x49, 0xff, 0xda, 0x6c, 0xab, 0x1d, 0xe1, 0x57, - 0x90, 0x26, 0x03, 0xb5, 0x72, 0xc4, 0xd4, 0x62, 0xa5, 0x13, - 0x36, 0x80, 0x47, 0xf1, 0x0d, 0xbb, 0x7c, 0xca, 0xef, 0x59, - 0x9e, 0x28, 0x7b, 0xcd, 0x0a, 0xbc, 0x99, 0x2f, 0xe8, 0x5e, - 0xa2, 0x14, 0xd3, 0x65, 0x40, 0xf6, 0x31, 0x87, 0x00, 0xb7, - 0x73, 0xc4, 0xe6, 0x51, 0x95, 0x22, 0xd1, 0x66, 0xa2, 0x15, - 0x37, 0x80, 0x44, 0xf3, 0xbf, 0x08, 0xcc, 0x7b, 0x59, 0xee, - 0x2a, 0x9d, 0x6e, 0xd9, 0x1d, 0xaa, 0x88, 0x3f, 0xfb, 0x4c, - 0x63, 0xd4, 0x10, 0xa7, 0x85, 0x32, 0xf6, 0x41, 0xb2, 0x05, - 0xc1, 0x76, 0x54, 0xe3, 0x27, 0x90, 0xdc, 0x6b, 0xaf, 0x18, - 0x3a, 0x8d, 0x49, 0xfe, 0x0d, 0xba, 0x7e, 0xc9, 0xeb, 0x5c, - 0x98, 0x2f, 0xc6, 0x71, 0xb5, 0x02, 0x20, 0x97, 0x53, 0xe4, - 0x17, 0xa0, 0x64, 0xd3, 0xf1, 0x46, 0x82, 0x35, 0x79, 0xce, - 0x0a, 0xbd, 0x9f, 0x28, 0xec, 0x5b, 0xa8, 0x1f, 0xdb, 0x6c, - 0x4e, 0xf9, 0x3d, 0x8a, 0xa5, 0x12, 0xd6, 0x61, 0x43, 0xf4, - 0x30, 0x87, 0x74, 0xc3, 0x07, 0xb0, 0x92, 0x25, 0xe1, 0x56, - 0x1a, 0xad, 0x69, 0xde, 0xfc, 0x4b, 0x8f, 0x38, 0xcb, 0x7c, - 0xb8, 0x0f, 0x2d, 0x9a, 0x5e, 0xe9, 0x91, 0x26, 0xe2, 0x55, - 0x77, 0xc0, 0x04, 0xb3, 0x40, 0xf7, 0x33, 0x84, 0xa6, 0x11, - 0xd5, 0x62, 0x2e, 0x99, 0x5d, 0xea, 0xc8, 0x7f, 0xbb, 0x0c, - 0xff, 0x48, 0x8c, 0x3b, 0x19, 0xae, 0x6a, 0xdd, 0xf2, 0x45, - 0x81, 0x36, 0x14, 0xa3, 0x67, 0xd0, 0x23, 0x94, 0x50, 0xe7, - 0xc5, 0x72, 0xb6, 0x01, 0x4d, 0xfa, 0x3e, 0x89, 0xab, 0x1c, - 0xd8, 0x6f, 0x9c, 0x2b, 0xef, 0x58, 0x7a, 0xcd, 0x09, 0xbe, - 0x57, 0xe0, 0x24, 0x93, 0xb1, 0x06, 0xc2, 0x75, 0x86, 0x31, - 0xf5, 0x42, 0x60, 0xd7, 0x13, 0xa4, 0xe8, 0x5f, 0x9b, 0x2c, - 0x0e, 0xb9, 0x7d, 0xca, 0x39, 0x8e, 0x4a, 0xfd, 0xdf, 0x68, - 0xac, 0x1b, 0x34, 0x83, 0x47, 0xf0, 0xd2, 0x65, 0xa1, 0x16, - 0xe5, 0x52, 0x96, 0x21, 0x03, 0xb4, 0x70, 0xc7, 0x8b, 0x3c, - 0xf8, 0x4f, 0x6d, 0xda, 0x1e, 0xa9, 0x5a, 0xed, 0x29, 0x9e, - 0xbc, 0x0b, 0xcf, 0x78, 0x00, 0xb8, 0x6d, 0xd5, 0xda, 0x62, - 0xb7, 0x0f, 0xa9, 0x11, 0xc4, 0x7c, 0x73, 0xcb, 0x1e, 0xa6, - 0x4f, 0xf7, 0x22, 0x9a, 0x95, 0x2d, 0xf8, 0x40, 0xe6, 0x5e, - 0x8b, 0x33, 0x3c, 0x84, 0x51, 0xe9, 0x9e, 0x26, 0xf3, 0x4b, - 0x44, 0xfc, 0x29, 0x91, 0x37, 0x8f, 0x5a, 0xe2, 0xed, 0x55, - 0x80, 0x38, 0xd1, 0x69, 0xbc, 0x04, 0x0b, 0xb3, 0x66, 0xde, - 0x78, 0xc0, 0x15, 0xad, 0xa2, 0x1a, 0xcf, 0x77, 0x21, 0x99, - 0x4c, 0xf4, 0xfb, 0x43, 0x96, 0x2e, 0x88, 0x30, 0xe5, 0x5d, - 0x52, 0xea, 0x3f, 0x87, 0x6e, 0xd6, 0x03, 0xbb, 0xb4, 0x0c, - 0xd9, 0x61, 0xc7, 0x7f, 0xaa, 0x12, 0x1d, 0xa5, 0x70, 0xc8, - 0xbf, 0x07, 0xd2, 0x6a, 0x65, 0xdd, 0x08, 0xb0, 0x16, 0xae, - 0x7b, 0xc3, 0xcc, 0x74, 0xa1, 0x19, 0xf0, 0x48, 0x9d, 0x25, - 0x2a, 0x92, 0x47, 0xff, 0x59, 0xe1, 0x34, 0x8c, 0x83, 0x3b, - 0xee, 0x56, 0x42, 0xfa, 0x2f, 0x97, 0x98, 0x20, 0xf5, 0x4d, - 0xeb, 0x53, 0x86, 0x3e, 0x31, 0x89, 0x5c, 0xe4, 0x0d, 0xb5, - 0x60, 0xd8, 0xd7, 0x6f, 0xba, 0x02, 0xa4, 0x1c, 0xc9, 0x71, - 0x7e, 0xc6, 0x13, 0xab, 0xdc, 0x64, 0xb1, 0x09, 0x06, 0xbe, - 0x6b, 0xd3, 0x75, 0xcd, 0x18, 0xa0, 0xaf, 0x17, 0xc2, 0x7a, - 0x93, 0x2b, 0xfe, 0x46, 0x49, 0xf1, 0x24, 0x9c, 0x3a, 0x82, - 0x57, 0xef, 0xe0, 0x58, 0x8d, 0x35, 0x63, 0xdb, 0x0e, 0xb6, - 0xb9, 0x01, 0xd4, 0x6c, 0xca, 0x72, 0xa7, 0x1f, 0x10, 0xa8, - 0x7d, 0xc5, 0x2c, 0x94, 0x41, 0xf9, 0xf6, 0x4e, 0x9b, 0x23, - 0x85, 0x3d, 0xe8, 0x50, 0x5f, 0xe7, 0x32, 0x8a, 0xfd, 0x45, - 0x90, 0x28, 0x27, 0x9f, 0x4a, 0xf2, 0x54, 0xec, 0x39, 0x81, - 0x8e, 0x36, 0xe3, 0x5b, 0xb2, 0x0a, 0xdf, 0x67, 0x68, 0xd0, - 0x05, 0xbd, 0x1b, 0xa3, 0x76, 0xce, 0xc1, 0x79, 0xac, 0x14, - 0x00, 0xb9, 0x6f, 0xd6, 0xde, 0x67, 0xb1, 0x08, 0xa1, 0x18, - 0xce, 0x77, 0x7f, 0xc6, 0x10, 0xa9, 0x5f, 0xe6, 0x30, 0x89, - 0x81, 0x38, 0xee, 0x57, 0xfe, 0x47, 0x91, 0x28, 0x20, 0x99, - 0x4f, 0xf6, 0xbe, 0x07, 0xd1, 0x68, 0x60, 0xd9, 0x0f, 0xb6, - 0x1f, 0xa6, 0x70, 0xc9, 0xc1, 0x78, 0xae, 0x17, 0xe1, 0x58, - 0x8e, 0x37, 0x3f, 0x86, 0x50, 0xe9, 0x40, 0xf9, 0x2f, 0x96, - 0x9e, 0x27, 0xf1, 0x48, 0x61, 0xd8, 0x0e, 0xb7, 0xbf, 0x06, - 0xd0, 0x69, 0xc0, 0x79, 0xaf, 0x16, 0x1e, 0xa7, 0x71, 0xc8, - 0x3e, 0x87, 0x51, 0xe8, 0xe0, 0x59, 0x8f, 0x36, 0x9f, 0x26, - 0xf0, 0x49, 0x41, 0xf8, 0x2e, 0x97, 0xdf, 0x66, 0xb0, 0x09, - 0x01, 0xb8, 0x6e, 0xd7, 0x7e, 0xc7, 0x11, 0xa8, 0xa0, 0x19, - 0xcf, 0x76, 0x80, 0x39, 0xef, 0x56, 0x5e, 0xe7, 0x31, 0x88, - 0x21, 0x98, 0x4e, 0xf7, 0xff, 0x46, 0x90, 0x29, 0xc2, 0x7b, - 0xad, 0x14, 0x1c, 0xa5, 0x73, 0xca, 0x63, 0xda, 0x0c, 0xb5, - 0xbd, 0x04, 0xd2, 0x6b, 0x9d, 0x24, 0xf2, 0x4b, 0x43, 0xfa, - 0x2c, 0x95, 0x3c, 0x85, 0x53, 0xea, 0xe2, 0x5b, 0x8d, 0x34, - 0x7c, 0xc5, 0x13, 0xaa, 0xa2, 0x1b, 0xcd, 0x74, 0xdd, 0x64, - 0xb2, 0x0b, 0x03, 0xba, 0x6c, 0xd5, 0x23, 0x9a, 0x4c, 0xf5, - 0xfd, 0x44, 0x92, 0x2b, 0x82, 0x3b, 0xed, 0x54, 0x5c, 0xe5, - 0x33, 0x8a, 0xa3, 0x1a, 0xcc, 0x75, 0x7d, 0xc4, 0x12, 0xab, - 0x02, 0xbb, 0x6d, 0xd4, 0xdc, 0x65, 0xb3, 0x0a, 0xfc, 0x45, - 0x93, 0x2a, 0x22, 0x9b, 0x4d, 0xf4, 0x5d, 0xe4, 0x32, 0x8b, - 0x83, 0x3a, 0xec, 0x55, 0x1d, 0xa4, 0x72, 0xcb, 0xc3, 0x7a, - 0xac, 0x15, 0xbc, 0x05, 0xd3, 0x6a, 0x62, 0xdb, 0x0d, 0xb4, - 0x42, 0xfb, 0x2d, 0x94, 0x9c, 0x25, 0xf3, 0x4a, 0xe3, 0x5a, - 0x8c, 0x35, 0x3d, 0x84, 0x52, 0xeb, 0x00, 0xba, 0x69, 0xd3, - 0xd2, 0x68, 0xbb, 0x01, 0xb9, 0x03, 0xd0, 0x6a, 0x6b, 0xd1, - 0x02, 0xb8, 0x6f, 0xd5, 0x06, 0xbc, 0xbd, 0x07, 0xd4, 0x6e, - 0xd6, 0x6c, 0xbf, 0x05, 0x04, 0xbe, 0x6d, 0xd7, 0xde, 0x64, - 0xb7, 0x0d, 0x0c, 0xb6, 0x65, 0xdf, 0x67, 0xdd, 0x0e, 0xb4, - 0xb5, 0x0f, 0xdc, 0x66, 0xb1, 0x0b, 0xd8, 0x62, 0x63, 0xd9, - 0x0a, 0xb0, 0x08, 0xb2, 0x61, 0xdb, 0xda, 0x60, 0xb3, 0x09, - 0xa1, 0x1b, 0xc8, 0x72, 0x73, 0xc9, 0x1a, 0xa0, 0x18, 0xa2, - 0x71, 0xcb, 0xca, 0x70, 0xa3, 0x19, 0xce, 0x74, 0xa7, 0x1d, - 0x1c, 0xa6, 0x75, 0xcf, 0x77, 0xcd, 0x1e, 0xa4, 0xa5, 0x1f, - 0xcc, 0x76, 0x7f, 0xc5, 0x16, 0xac, 0xad, 0x17, 0xc4, 0x7e, - 0xc6, 0x7c, 0xaf, 0x15, 0x14, 0xae, 0x7d, 0xc7, 0x10, 0xaa, - 0x79, 0xc3, 0xc2, 0x78, 0xab, 0x11, 0xa9, 0x13, 0xc0, 0x7a, - 0x7b, 0xc1, 0x12, 0xa8, 0x5f, 0xe5, 0x36, 0x8c, 0x8d, 0x37, - 0xe4, 0x5e, 0xe6, 0x5c, 0x8f, 0x35, 0x34, 0x8e, 0x5d, 0xe7, - 0x30, 0x8a, 0x59, 0xe3, 0xe2, 0x58, 0x8b, 0x31, 0x89, 0x33, - 0xe0, 0x5a, 0x5b, 0xe1, 0x32, 0x88, 0x81, 0x3b, 0xe8, 0x52, - 0x53, 0xe9, 0x3a, 0x80, 0x38, 0x82, 0x51, 0xeb, 0xea, 0x50, - 0x83, 0x39, 0xee, 0x54, 0x87, 0x3d, 0x3c, 0x86, 0x55, 0xef, - 0x57, 0xed, 0x3e, 0x84, 0x85, 0x3f, 0xec, 0x56, 0xfe, 0x44, - 0x97, 0x2d, 0x2c, 0x96, 0x45, 0xff, 0x47, 0xfd, 0x2e, 0x94, - 0x95, 0x2f, 0xfc, 0x46, 0x91, 0x2b, 0xf8, 0x42, 0x43, 0xf9, - 0x2a, 0x90, 0x28, 0x92, 0x41, 0xfb, 0xfa, 0x40, 0x93, 0x29, - 0x20, 0x9a, 0x49, 0xf3, 0xf2, 0x48, 0x9b, 0x21, 0x99, 0x23, - 0xf0, 0x4a, 0x4b, 0xf1, 0x22, 0x98, 0x4f, 0xf5, 0x26, 0x9c, - 0x9d, 0x27, 0xf4, 0x4e, 0xf6, 0x4c, 0x9f, 0x25, 0x24, 0x9e, - 0x4d, 0xf7, 0x00, 0xbb, 0x6b, 0xd0, 0xd6, 0x6d, 0xbd, 0x06, - 0xb1, 0x0a, 0xda, 0x61, 0x67, 0xdc, 0x0c, 0xb7, 0x7f, 0xc4, - 0x14, 0xaf, 0xa9, 0x12, 0xc2, 0x79, 0xce, 0x75, 0xa5, 0x1e, - 0x18, 0xa3, 0x73, 0xc8, 0xfe, 0x45, 0x95, 0x2e, 0x28, 0x93, - 0x43, 0xf8, 0x4f, 0xf4, 0x24, 0x9f, 0x99, 0x22, 0xf2, 0x49, - 0x81, 0x3a, 0xea, 0x51, 0x57, 0xec, 0x3c, 0x87, 0x30, 0x8b, - 0x5b, 0xe0, 0xe6, 0x5d, 0x8d, 0x36, 0xe1, 0x5a, 0x8a, 0x31, - 0x37, 0x8c, 0x5c, 0xe7, 0x50, 0xeb, 0x3b, 0x80, 0x86, 0x3d, - 0xed, 0x56, 0x9e, 0x25, 0xf5, 0x4e, 0x48, 0xf3, 0x23, 0x98, - 0x2f, 0x94, 0x44, 0xff, 0xf9, 0x42, 0x92, 0x29, 0x1f, 0xa4, - 0x74, 0xcf, 0xc9, 0x72, 0xa2, 0x19, 0xae, 0x15, 0xc5, 0x7e, - 0x78, 0xc3, 0x13, 0xa8, 0x60, 0xdb, 0x0b, 0xb0, 0xb6, 0x0d, - 0xdd, 0x66, 0xd1, 0x6a, 0xba, 0x01, 0x07, 0xbc, 0x6c, 0xd7, - 0xdf, 0x64, 0xb4, 0x0f, 0x09, 0xb2, 0x62, 0xd9, 0x6e, 0xd5, - 0x05, 0xbe, 0xb8, 0x03, 0xd3, 0x68, 0xa0, 0x1b, 0xcb, 0x70, - 0x76, 0xcd, 0x1d, 0xa6, 0x11, 0xaa, 0x7a, 0xc1, 0xc7, 0x7c, - 0xac, 0x17, 0x21, 0x9a, 0x4a, 0xf1, 0xf7, 0x4c, 0x9c, 0x27, - 0x90, 0x2b, 0xfb, 0x40, 0x46, 0xfd, 0x2d, 0x96, 0x5e, 0xe5, - 0x35, 0x8e, 0x88, 0x33, 0xe3, 0x58, 0xef, 0x54, 0x84, 0x3f, - 0x39, 0x82, 0x52, 0xe9, 0x3e, 0x85, 0x55, 0xee, 0xe8, 0x53, - 0x83, 0x38, 0x8f, 0x34, 0xe4, 0x5f, 0x59, 0xe2, 0x32, 0x89, - 0x41, 0xfa, 0x2a, 0x91, 0x97, 0x2c, 0xfc, 0x47, 0xf0, 0x4b, - 0x9b, 0x20, 0x26, 0x9d, 0x4d, 0xf6, 0xc0, 0x7b, 0xab, 0x10, - 0x16, 0xad, 0x7d, 0xc6, 0x71, 0xca, 0x1a, 0xa1, 0xa7, 0x1c, - 0xcc, 0x77, 0xbf, 0x04, 0xd4, 0x6f, 0x69, 0xd2, 0x02, 0xb9, - 0x0e, 0xb5, 0x65, 0xde, 0xd8, 0x63, 0xb3, 0x08, 0x00, 0xbc, - 0x65, 0xd9, 0xca, 0x76, 0xaf, 0x13, 0x89, 0x35, 0xec, 0x50, - 0x43, 0xff, 0x26, 0x9a, 0x0f, 0xb3, 0x6a, 0xd6, 0xc5, 0x79, - 0xa0, 0x1c, 0x86, 0x3a, 0xe3, 0x5f, 0x4c, 0xf0, 0x29, 0x95, - 0x1e, 0xa2, 0x7b, 0xc7, 0xd4, 0x68, 0xb1, 0x0d, 0x97, 0x2b, - 0xf2, 0x4e, 0x5d, 0xe1, 0x38, 0x84, 0x11, 0xad, 0x74, 0xc8, - 0xdb, 0x67, 0xbe, 0x02, 0x98, 0x24, 0xfd, 0x41, 0x52, 0xee, - 0x37, 0x8b, 0x3c, 0x80, 0x59, 0xe5, 0xf6, 0x4a, 0x93, 0x2f, - 0xb5, 0x09, 0xd0, 0x6c, 0x7f, 0xc3, 0x1a, 0xa6, 0x33, 0x8f, - 0x56, 0xea, 0xf9, 0x45, 0x9c, 0x20, 0xba, 0x06, 0xdf, 0x63, - 0x70, 0xcc, 0x15, 0xa9, 0x22, 0x9e, 0x47, 0xfb, 0xe8, 0x54, - 0x8d, 0x31, 0xab, 0x17, 0xce, 0x72, 0x61, 0xdd, 0x04, 0xb8, - 0x2d, 0x91, 0x48, 0xf4, 0xe7, 0x5b, 0x82, 0x3e, 0xa4, 0x18, - 0xc1, 0x7d, 0x6e, 0xd2, 0x0b, 0xb7, 0x78, 0xc4, 0x1d, 0xa1, - 0xb2, 0x0e, 0xd7, 0x6b, 0xf1, 0x4d, 0x94, 0x28, 0x3b, 0x87, - 0x5e, 0xe2, 0x77, 0xcb, 0x12, 0xae, 0xbd, 0x01, 0xd8, 0x64, - 0xfe, 0x42, 0x9b, 0x27, 0x34, 0x88, 0x51, 0xed, 0x66, 0xda, - 0x03, 0xbf, 0xac, 0x10, 0xc9, 0x75, 0xef, 0x53, 0x8a, 0x36, - 0x25, 0x99, 0x40, 0xfc, 0x69, 0xd5, 0x0c, 0xb0, 0xa3, 0x1f, - 0xc6, 0x7a, 0xe0, 0x5c, 0x85, 0x39, 0x2a, 0x96, 0x4f, 0xf3, - 0x44, 0xf8, 0x21, 0x9d, 0x8e, 0x32, 0xeb, 0x57, 0xcd, 0x71, - 0xa8, 0x14, 0x07, 0xbb, 0x62, 0xde, 0x4b, 0xf7, 0x2e, 0x92, - 0x81, 0x3d, 0xe4, 0x58, 0xc2, 0x7e, 0xa7, 0x1b, 0x08, 0xb4, - 0x6d, 0xd1, 0x5a, 0xe6, 0x3f, 0x83, 0x90, 0x2c, 0xf5, 0x49, - 0xd3, 0x6f, 0xb6, 0x0a, 0x19, 0xa5, 0x7c, 0xc0, 0x55, 0xe9, - 0x30, 0x8c, 0x9f, 0x23, 0xfa, 0x46, 0xdc, 0x60, 0xb9, 0x05, - 0x16, 0xaa, 0x73, 0xcf, 0x00, 0xbd, 0x67, 0xda, 0xce, 0x73, - 0xa9, 0x14, 0x81, 0x3c, 0xe6, 0x5b, 0x4f, 0xf2, 0x28, 0x95, - 0x1f, 0xa2, 0x78, 0xc5, 0xd1, 0x6c, 0xb6, 0x0b, 0x9e, 0x23, - 0xf9, 0x44, 0x50, 0xed, 0x37, 0x8a, 0x3e, 0x83, 0x59, 0xe4, - 0xf0, 0x4d, 0x97, 0x2a, 0xbf, 0x02, 0xd8, 0x65, 0x71, 0xcc, - 0x16, 0xab, 0x21, 0x9c, 0x46, 0xfb, 0xef, 0x52, 0x88, 0x35, - 0xa0, 0x1d, 0xc7, 0x7a, 0x6e, 0xd3, 0x09, 0xb4, 0x7c, 0xc1, - 0x1b, 0xa6, 0xb2, 0x0f, 0xd5, 0x68, 0xfd, 0x40, 0x9a, 0x27, - 0x33, 0x8e, 0x54, 0xe9, 0x63, 0xde, 0x04, 0xb9, 0xad, 0x10, - 0xca, 0x77, 0xe2, 0x5f, 0x85, 0x38, 0x2c, 0x91, 0x4b, 0xf6, - 0x42, 0xff, 0x25, 0x98, 0x8c, 0x31, 0xeb, 0x56, 0xc3, 0x7e, - 0xa4, 0x19, 0x0d, 0xb0, 0x6a, 0xd7, 0x5d, 0xe0, 0x3a, 0x87, - 0x93, 0x2e, 0xf4, 0x49, 0xdc, 0x61, 0xbb, 0x06, 0x12, 0xaf, - 0x75, 0xc8, 0xf8, 0x45, 0x9f, 0x22, 0x36, 0x8b, 0x51, 0xec, - 0x79, 0xc4, 0x1e, 0xa3, 0xb7, 0x0a, 0xd0, 0x6d, 0xe7, 0x5a, - 0x80, 0x3d, 0x29, 0x94, 0x4e, 0xf3, 0x66, 0xdb, 0x01, 0xbc, - 0xa8, 0x15, 0xcf, 0x72, 0xc6, 0x7b, 0xa1, 0x1c, 0x08, 0xb5, - 0x6f, 0xd2, 0x47, 0xfa, 0x20, 0x9d, 0x89, 0x34, 0xee, 0x53, - 0xd9, 0x64, 0xbe, 0x03, 0x17, 0xaa, 0x70, 0xcd, 0x58, 0xe5, - 0x3f, 0x82, 0x96, 0x2b, 0xf1, 0x4c, 0x84, 0x39, 0xe3, 0x5e, - 0x4a, 0xf7, 0x2d, 0x90, 0x05, 0xb8, 0x62, 0xdf, 0xcb, 0x76, - 0xac, 0x11, 0x9b, 0x26, 0xfc, 0x41, 0x55, 0xe8, 0x32, 0x8f, - 0x1a, 0xa7, 0x7d, 0xc0, 0xd4, 0x69, 0xb3, 0x0e, 0xba, 0x07, - 0xdd, 0x60, 0x74, 0xc9, 0x13, 0xae, 0x3b, 0x86, 0x5c, 0xe1, - 0xf5, 0x48, 0x92, 0x2f, 0xa5, 0x18, 0xc2, 0x7f, 0x6b, 0xd6, - 0x0c, 0xb1, 0x24, 0x99, 0x43, 0xfe, 0xea, 0x57, 0x8d, 0x30, - 0x00, 0xbe, 0x61, 0xdf, 0xc2, 0x7c, 0xa3, 0x1d, 0x99, 0x27, - 0xf8, 0x46, 0x5b, 0xe5, 0x3a, 0x84, 0x2f, 0x91, 0x4e, 0xf0, - 0xed, 0x53, 0x8c, 0x32, 0xb6, 0x08, 0xd7, 0x69, 0x74, 0xca, - 0x15, 0xab, 0x5e, 0xe0, 0x3f, 0x81, 0x9c, 0x22, 0xfd, 0x43, - 0xc7, 0x79, 0xa6, 0x18, 0x05, 0xbb, 0x64, 0xda, 0x71, 0xcf, - 0x10, 0xae, 0xb3, 0x0d, 0xd2, 0x6c, 0xe8, 0x56, 0x89, 0x37, - 0x2a, 0x94, 0x4b, 0xf5, 0xbc, 0x02, 0xdd, 0x63, 0x7e, 0xc0, - 0x1f, 0xa1, 0x25, 0x9b, 0x44, 0xfa, 0xe7, 0x59, 0x86, 0x38, - 0x93, 0x2d, 0xf2, 0x4c, 0x51, 0xef, 0x30, 0x8e, 0x0a, 0xb4, - 0x6b, 0xd5, 0xc8, 0x76, 0xa9, 0x17, 0xe2, 0x5c, 0x83, 0x3d, - 0x20, 0x9e, 0x41, 0xff, 0x7b, 0xc5, 0x1a, 0xa4, 0xb9, 0x07, - 0xd8, 0x66, 0xcd, 0x73, 0xac, 0x12, 0x0f, 0xb1, 0x6e, 0xd0, - 0x54, 0xea, 0x35, 0x8b, 0x96, 0x28, 0xf7, 0x49, 0x65, 0xdb, - 0x04, 0xba, 0xa7, 0x19, 0xc6, 0x78, 0xfc, 0x42, 0x9d, 0x23, - 0x3e, 0x80, 0x5f, 0xe1, 0x4a, 0xf4, 0x2b, 0x95, 0x88, 0x36, - 0xe9, 0x57, 0xd3, 0x6d, 0xb2, 0x0c, 0x11, 0xaf, 0x70, 0xce, - 0x3b, 0x85, 0x5a, 0xe4, 0xf9, 0x47, 0x98, 0x26, 0xa2, 0x1c, - 0xc3, 0x7d, 0x60, 0xde, 0x01, 0xbf, 0x14, 0xaa, 0x75, 0xcb, - 0xd6, 0x68, 0xb7, 0x09, 0x8d, 0x33, 0xec, 0x52, 0x4f, 0xf1, - 0x2e, 0x90, 0xd9, 0x67, 0xb8, 0x06, 0x1b, 0xa5, 0x7a, 0xc4, - 0x40, 0xfe, 0x21, 0x9f, 0x82, 0x3c, 0xe3, 0x5d, 0xf6, 0x48, - 0x97, 0x29, 0x34, 0x8a, 0x55, 0xeb, 0x6f, 0xd1, 0x0e, 0xb0, - 0xad, 0x13, 0xcc, 0x72, 0x87, 0x39, 0xe6, 0x58, 0x45, 0xfb, - 0x24, 0x9a, 0x1e, 0xa0, 0x7f, 0xc1, 0xdc, 0x62, 0xbd, 0x03, - 0xa8, 0x16, 0xc9, 0x77, 0x6a, 0xd4, 0x0b, 0xb5, 0x31, 0x8f, - 0x50, 0xee, 0xf3, 0x4d, 0x92, 0x2c, 0x00, 0xbf, 0x63, 0xdc, - 0xc6, 0x79, 0xa5, 0x1a, 0x91, 0x2e, 0xf2, 0x4d, 0x57, 0xe8, - 0x34, 0x8b, 0x3f, 0x80, 0x5c, 0xe3, 0xf9, 0x46, 0x9a, 0x25, - 0xae, 0x11, 0xcd, 0x72, 0x68, 0xd7, 0x0b, 0xb4, 0x7e, 0xc1, - 0x1d, 0xa2, 0xb8, 0x07, 0xdb, 0x64, 0xef, 0x50, 0x8c, 0x33, - 0x29, 0x96, 0x4a, 0xf5, 0x41, 0xfe, 0x22, 0x9d, 0x87, 0x38, - 0xe4, 0x5b, 0xd0, 0x6f, 0xb3, 0x0c, 0x16, 0xa9, 0x75, 0xca, - 0xfc, 0x43, 0x9f, 0x20, 0x3a, 0x85, 0x59, 0xe6, 0x6d, 0xd2, - 0x0e, 0xb1, 0xab, 0x14, 0xc8, 0x77, 0xc3, 0x7c, 0xa0, 0x1f, - 0x05, 0xba, 0x66, 0xd9, 0x52, 0xed, 0x31, 0x8e, 0x94, 0x2b, - 0xf7, 0x48, 0x82, 0x3d, 0xe1, 0x5e, 0x44, 0xfb, 0x27, 0x98, - 0x13, 0xac, 0x70, 0xcf, 0xd5, 0x6a, 0xb6, 0x09, 0xbd, 0x02, - 0xde, 0x61, 0x7b, 0xc4, 0x18, 0xa7, 0x2c, 0x93, 0x4f, 0xf0, - 0xea, 0x55, 0x89, 0x36, 0xe5, 0x5a, 0x86, 0x39, 0x23, 0x9c, - 0x40, 0xff, 0x74, 0xcb, 0x17, 0xa8, 0xb2, 0x0d, 0xd1, 0x6e, - 0xda, 0x65, 0xb9, 0x06, 0x1c, 0xa3, 0x7f, 0xc0, 0x4b, 0xf4, - 0x28, 0x97, 0x8d, 0x32, 0xee, 0x51, 0x9b, 0x24, 0xf8, 0x47, - 0x5d, 0xe2, 0x3e, 0x81, 0x0a, 0xb5, 0x69, 0xd6, 0xcc, 0x73, - 0xaf, 0x10, 0xa4, 0x1b, 0xc7, 0x78, 0x62, 0xdd, 0x01, 0xbe, - 0x35, 0x8a, 0x56, 0xe9, 0xf3, 0x4c, 0x90, 0x2f, 0x19, 0xa6, - 0x7a, 0xc5, 0xdf, 0x60, 0xbc, 0x03, 0x88, 0x37, 0xeb, 0x54, - 0x4e, 0xf1, 0x2d, 0x92, 0x26, 0x99, 0x45, 0xfa, 0xe0, 0x5f, - 0x83, 0x3c, 0xb7, 0x08, 0xd4, 0x6b, 0x71, 0xce, 0x12, 0xad, - 0x67, 0xd8, 0x04, 0xbb, 0xa1, 0x1e, 0xc2, 0x7d, 0xf6, 0x49, - 0x95, 0x2a, 0x30, 0x8f, 0x53, 0xec, 0x58, 0xe7, 0x3b, 0x84, - 0x9e, 0x21, 0xfd, 0x42, 0xc9, 0x76, 0xaa, 0x15, 0x0f, 0xb0, - 0x6c, 0xd3, 0x00, 0xc0, 0x9d, 0x5d, 0x27, 0xe7, 0xba, 0x7a, - 0x4e, 0x8e, 0xd3, 0x13, 0x69, 0xa9, 0xf4, 0x34, 0x9c, 0x5c, - 0x01, 0xc1, 0xbb, 0x7b, 0x26, 0xe6, 0xd2, 0x12, 0x4f, 0x8f, - 0xf5, 0x35, 0x68, 0xa8, 0x25, 0xe5, 0xb8, 0x78, 0x02, 0xc2, - 0x9f, 0x5f, 0x6b, 0xab, 0xf6, 0x36, 0x4c, 0x8c, 0xd1, 0x11, - 0xb9, 0x79, 0x24, 0xe4, 0x9e, 0x5e, 0x03, 0xc3, 0xf7, 0x37, - 0x6a, 0xaa, 0xd0, 0x10, 0x4d, 0x8d, 0x4a, 0x8a, 0xd7, 0x17, - 0x6d, 0xad, 0xf0, 0x30, 0x04, 0xc4, 0x99, 0x59, 0x23, 0xe3, - 0xbe, 0x7e, 0xd6, 0x16, 0x4b, 0x8b, 0xf1, 0x31, 0x6c, 0xac, - 0x98, 0x58, 0x05, 0xc5, 0xbf, 0x7f, 0x22, 0xe2, 0x6f, 0xaf, - 0xf2, 0x32, 0x48, 0x88, 0xd5, 0x15, 0x21, 0xe1, 0xbc, 0x7c, - 0x06, 0xc6, 0x9b, 0x5b, 0xf3, 0x33, 0x6e, 0xae, 0xd4, 0x14, - 0x49, 0x89, 0xbd, 0x7d, 0x20, 0xe0, 0x9a, 0x5a, 0x07, 0xc7, - 0x94, 0x54, 0x09, 0xc9, 0xb3, 0x73, 0x2e, 0xee, 0xda, 0x1a, - 0x47, 0x87, 0xfd, 0x3d, 0x60, 0xa0, 0x08, 0xc8, 0x95, 0x55, - 0x2f, 0xef, 0xb2, 0x72, 0x46, 0x86, 0xdb, 0x1b, 0x61, 0xa1, - 0xfc, 0x3c, 0xb1, 0x71, 0x2c, 0xec, 0x96, 0x56, 0x0b, 0xcb, - 0xff, 0x3f, 0x62, 0xa2, 0xd8, 0x18, 0x45, 0x85, 0x2d, 0xed, - 0xb0, 0x70, 0x0a, 0xca, 0x97, 0x57, 0x63, 0xa3, 0xfe, 0x3e, - 0x44, 0x84, 0xd9, 0x19, 0xde, 0x1e, 0x43, 0x83, 0xf9, 0x39, - 0x64, 0xa4, 0x90, 0x50, 0x0d, 0xcd, 0xb7, 0x77, 0x2a, 0xea, - 0x42, 0x82, 0xdf, 0x1f, 0x65, 0xa5, 0xf8, 0x38, 0x0c, 0xcc, - 0x91, 0x51, 0x2b, 0xeb, 0xb6, 0x76, 0xfb, 0x3b, 0x66, 0xa6, - 0xdc, 0x1c, 0x41, 0x81, 0xb5, 0x75, 0x28, 0xe8, 0x92, 0x52, - 0x0f, 0xcf, 0x67, 0xa7, 0xfa, 0x3a, 0x40, 0x80, 0xdd, 0x1d, - 0x29, 0xe9, 0xb4, 0x74, 0x0e, 0xce, 0x93, 0x53, 0x00, 0xc1, - 0x9f, 0x5e, 0x23, 0xe2, 0xbc, 0x7d, 0x46, 0x87, 0xd9, 0x18, - 0x65, 0xa4, 0xfa, 0x3b, 0x8c, 0x4d, 0x13, 0xd2, 0xaf, 0x6e, - 0x30, 0xf1, 0xca, 0x0b, 0x55, 0x94, 0xe9, 0x28, 0x76, 0xb7, - 0x05, 0xc4, 0x9a, 0x5b, 0x26, 0xe7, 0xb9, 0x78, 0x43, 0x82, - 0xdc, 0x1d, 0x60, 0xa1, 0xff, 0x3e, 0x89, 0x48, 0x16, 0xd7, - 0xaa, 0x6b, 0x35, 0xf4, 0xcf, 0x0e, 0x50, 0x91, 0xec, 0x2d, - 0x73, 0xb2, 0x0a, 0xcb, 0x95, 0x54, 0x29, 0xe8, 0xb6, 0x77, - 0x4c, 0x8d, 0xd3, 0x12, 0x6f, 0xae, 0xf0, 0x31, 0x86, 0x47, - 0x19, 0xd8, 0xa5, 0x64, 0x3a, 0xfb, 0xc0, 0x01, 0x5f, 0x9e, - 0xe3, 0x22, 0x7c, 0xbd, 0x0f, 0xce, 0x90, 0x51, 0x2c, 0xed, - 0xb3, 0x72, 0x49, 0x88, 0xd6, 0x17, 0x6a, 0xab, 0xf5, 0x34, - 0x83, 0x42, 0x1c, 0xdd, 0xa0, 0x61, 0x3f, 0xfe, 0xc5, 0x04, - 0x5a, 0x9b, 0xe6, 0x27, 0x79, 0xb8, 0x14, 0xd5, 0x8b, 0x4a, - 0x37, 0xf6, 0xa8, 0x69, 0x52, 0x93, 0xcd, 0x0c, 0x71, 0xb0, - 0xee, 0x2f, 0x98, 0x59, 0x07, 0xc6, 0xbb, 0x7a, 0x24, 0xe5, - 0xde, 0x1f, 0x41, 0x80, 0xfd, 0x3c, 0x62, 0xa3, 0x11, 0xd0, - 0x8e, 0x4f, 0x32, 0xf3, 0xad, 0x6c, 0x57, 0x96, 0xc8, 0x09, - 0x74, 0xb5, 0xeb, 0x2a, 0x9d, 0x5c, 0x02, 0xc3, 0xbe, 0x7f, - 0x21, 0xe0, 0xdb, 0x1a, 0x44, 0x85, 0xf8, 0x39, 0x67, 0xa6, - 0x1e, 0xdf, 0x81, 0x40, 0x3d, 0xfc, 0xa2, 0x63, 0x58, 0x99, - 0xc7, 0x06, 0x7b, 0xba, 0xe4, 0x25, 0x92, 0x53, 0x0d, 0xcc, - 0xb1, 0x70, 0x2e, 0xef, 0xd4, 0x15, 0x4b, 0x8a, 0xf7, 0x36, - 0x68, 0xa9, 0x1b, 0xda, 0x84, 0x45, 0x38, 0xf9, 0xa7, 0x66, - 0x5d, 0x9c, 0xc2, 0x03, 0x7e, 0xbf, 0xe1, 0x20, 0x97, 0x56, - 0x08, 0xc9, 0xb4, 0x75, 0x2b, 0xea, 0xd1, 0x10, 0x4e, 0x8f, - 0xf2, 0x33, 0x6d, 0xac, 0x00, 0xc2, 0x99, 0x5b, 0x2f, 0xed, - 0xb6, 0x74, 0x5e, 0x9c, 0xc7, 0x05, 0x71, 0xb3, 0xe8, 0x2a, - 0xbc, 0x7e, 0x25, 0xe7, 0x93, 0x51, 0x0a, 0xc8, 0xe2, 0x20, - 0x7b, 0xb9, 0xcd, 0x0f, 0x54, 0x96, 0x65, 0xa7, 0xfc, 0x3e, - 0x4a, 0x88, 0xd3, 0x11, 0x3b, 0xf9, 0xa2, 0x60, 0x14, 0xd6, - 0x8d, 0x4f, 0xd9, 0x1b, 0x40, 0x82, 0xf6, 0x34, 0x6f, 0xad, - 0x87, 0x45, 0x1e, 0xdc, 0xa8, 0x6a, 0x31, 0xf3, 0xca, 0x08, - 0x53, 0x91, 0xe5, 0x27, 0x7c, 0xbe, 0x94, 0x56, 0x0d, 0xcf, - 0xbb, 0x79, 0x22, 0xe0, 0x76, 0xb4, 0xef, 0x2d, 0x59, 0x9b, - 0xc0, 0x02, 0x28, 0xea, 0xb1, 0x73, 0x07, 0xc5, 0x9e, 0x5c, - 0xaf, 0x6d, 0x36, 0xf4, 0x80, 0x42, 0x19, 0xdb, 0xf1, 0x33, - 0x68, 0xaa, 0xde, 0x1c, 0x47, 0x85, 0x13, 0xd1, 0x8a, 0x48, - 0x3c, 0xfe, 0xa5, 0x67, 0x4d, 0x8f, 0xd4, 0x16, 0x62, 0xa0, - 0xfb, 0x39, 0x89, 0x4b, 0x10, 0xd2, 0xa6, 0x64, 0x3f, 0xfd, - 0xd7, 0x15, 0x4e, 0x8c, 0xf8, 0x3a, 0x61, 0xa3, 0x35, 0xf7, - 0xac, 0x6e, 0x1a, 0xd8, 0x83, 0x41, 0x6b, 0xa9, 0xf2, 0x30, - 0x44, 0x86, 0xdd, 0x1f, 0xec, 0x2e, 0x75, 0xb7, 0xc3, 0x01, - 0x5a, 0x98, 0xb2, 0x70, 0x2b, 0xe9, 0x9d, 0x5f, 0x04, 0xc6, - 0x50, 0x92, 0xc9, 0x0b, 0x7f, 0xbd, 0xe6, 0x24, 0x0e, 0xcc, - 0x97, 0x55, 0x21, 0xe3, 0xb8, 0x7a, 0x43, 0x81, 0xda, 0x18, - 0x6c, 0xae, 0xf5, 0x37, 0x1d, 0xdf, 0x84, 0x46, 0x32, 0xf0, - 0xab, 0x69, 0xff, 0x3d, 0x66, 0xa4, 0xd0, 0x12, 0x49, 0x8b, - 0xa1, 0x63, 0x38, 0xfa, 0x8e, 0x4c, 0x17, 0xd5, 0x26, 0xe4, - 0xbf, 0x7d, 0x09, 0xcb, 0x90, 0x52, 0x78, 0xba, 0xe1, 0x23, - 0x57, 0x95, 0xce, 0x0c, 0x9a, 0x58, 0x03, 0xc1, 0xb5, 0x77, - 0x2c, 0xee, 0xc4, 0x06, 0x5d, 0x9f, 0xeb, 0x29, 0x72, 0xb0, - 0x00, 0xc3, 0x9b, 0x58, 0x2b, 0xe8, 0xb0, 0x73, 0x56, 0x95, - 0xcd, 0x0e, 0x7d, 0xbe, 0xe6, 0x25, 0xac, 0x6f, 0x37, 0xf4, - 0x87, 0x44, 0x1c, 0xdf, 0xfa, 0x39, 0x61, 0xa2, 0xd1, 0x12, - 0x4a, 0x89, 0x45, 0x86, 0xde, 0x1d, 0x6e, 0xad, 0xf5, 0x36, - 0x13, 0xd0, 0x88, 0x4b, 0x38, 0xfb, 0xa3, 0x60, 0xe9, 0x2a, - 0x72, 0xb1, 0xc2, 0x01, 0x59, 0x9a, 0xbf, 0x7c, 0x24, 0xe7, - 0x94, 0x57, 0x0f, 0xcc, 0x8a, 0x49, 0x11, 0xd2, 0xa1, 0x62, - 0x3a, 0xf9, 0xdc, 0x1f, 0x47, 0x84, 0xf7, 0x34, 0x6c, 0xaf, - 0x26, 0xe5, 0xbd, 0x7e, 0x0d, 0xce, 0x96, 0x55, 0x70, 0xb3, - 0xeb, 0x28, 0x5b, 0x98, 0xc0, 0x03, 0xcf, 0x0c, 0x54, 0x97, - 0xe4, 0x27, 0x7f, 0xbc, 0x99, 0x5a, 0x02, 0xc1, 0xb2, 0x71, - 0x29, 0xea, 0x63, 0xa0, 0xf8, 0x3b, 0x48, 0x8b, 0xd3, 0x10, - 0x35, 0xf6, 0xae, 0x6d, 0x1e, 0xdd, 0x85, 0x46, 0x09, 0xca, - 0x92, 0x51, 0x22, 0xe1, 0xb9, 0x7a, 0x5f, 0x9c, 0xc4, 0x07, - 0x74, 0xb7, 0xef, 0x2c, 0xa5, 0x66, 0x3e, 0xfd, 0x8e, 0x4d, - 0x15, 0xd6, 0xf3, 0x30, 0x68, 0xab, 0xd8, 0x1b, 0x43, 0x80, - 0x4c, 0x8f, 0xd7, 0x14, 0x67, 0xa4, 0xfc, 0x3f, 0x1a, 0xd9, - 0x81, 0x42, 0x31, 0xf2, 0xaa, 0x69, 0xe0, 0x23, 0x7b, 0xb8, - 0xcb, 0x08, 0x50, 0x93, 0xb6, 0x75, 0x2d, 0xee, 0x9d, 0x5e, - 0x06, 0xc5, 0x83, 0x40, 0x18, 0xdb, 0xa8, 0x6b, 0x33, 0xf0, - 0xd5, 0x16, 0x4e, 0x8d, 0xfe, 0x3d, 0x65, 0xa6, 0x2f, 0xec, - 0xb4, 0x77, 0x04, 0xc7, 0x9f, 0x5c, 0x79, 0xba, 0xe2, 0x21, - 0x52, 0x91, 0xc9, 0x0a, 0xc6, 0x05, 0x5d, 0x9e, 0xed, 0x2e, - 0x76, 0xb5, 0x90, 0x53, 0x0b, 0xc8, 0xbb, 0x78, 0x20, 0xe3, - 0x6a, 0xa9, 0xf1, 0x32, 0x41, 0x82, 0xda, 0x19, 0x3c, 0xff, - 0xa7, 0x64, 0x17, 0xd4, 0x8c, 0x4f, 0x00, 0xc4, 0x95, 0x51, - 0x37, 0xf3, 0xa2, 0x66, 0x6e, 0xaa, 0xfb, 0x3f, 0x59, 0x9d, - 0xcc, 0x08, 0xdc, 0x18, 0x49, 0x8d, 0xeb, 0x2f, 0x7e, 0xba, - 0xb2, 0x76, 0x27, 0xe3, 0x85, 0x41, 0x10, 0xd4, 0xa5, 0x61, - 0x30, 0xf4, 0x92, 0x56, 0x07, 0xc3, 0xcb, 0x0f, 0x5e, 0x9a, - 0xfc, 0x38, 0x69, 0xad, 0x79, 0xbd, 0xec, 0x28, 0x4e, 0x8a, - 0xdb, 0x1f, 0x17, 0xd3, 0x82, 0x46, 0x20, 0xe4, 0xb5, 0x71, - 0x57, 0x93, 0xc2, 0x06, 0x60, 0xa4, 0xf5, 0x31, 0x39, 0xfd, - 0xac, 0x68, 0x0e, 0xca, 0x9b, 0x5f, 0x8b, 0x4f, 0x1e, 0xda, - 0xbc, 0x78, 0x29, 0xed, 0xe5, 0x21, 0x70, 0xb4, 0xd2, 0x16, - 0x47, 0x83, 0xf2, 0x36, 0x67, 0xa3, 0xc5, 0x01, 0x50, 0x94, - 0x9c, 0x58, 0x09, 0xcd, 0xab, 0x6f, 0x3e, 0xfa, 0x2e, 0xea, - 0xbb, 0x7f, 0x19, 0xdd, 0x8c, 0x48, 0x40, 0x84, 0xd5, 0x11, - 0x77, 0xb3, 0xe2, 0x26, 0xae, 0x6a, 0x3b, 0xff, 0x99, 0x5d, - 0x0c, 0xc8, 0xc0, 0x04, 0x55, 0x91, 0xf7, 0x33, 0x62, 0xa6, - 0x72, 0xb6, 0xe7, 0x23, 0x45, 0x81, 0xd0, 0x14, 0x1c, 0xd8, - 0x89, 0x4d, 0x2b, 0xef, 0xbe, 0x7a, 0x0b, 0xcf, 0x9e, 0x5a, - 0x3c, 0xf8, 0xa9, 0x6d, 0x65, 0xa1, 0xf0, 0x34, 0x52, 0x96, - 0xc7, 0x03, 0xd7, 0x13, 0x42, 0x86, 0xe0, 0x24, 0x75, 0xb1, - 0xb9, 0x7d, 0x2c, 0xe8, 0x8e, 0x4a, 0x1b, 0xdf, 0xf9, 0x3d, - 0x6c, 0xa8, 0xce, 0x0a, 0x5b, 0x9f, 0x97, 0x53, 0x02, 0xc6, - 0xa0, 0x64, 0x35, 0xf1, 0x25, 0xe1, 0xb0, 0x74, 0x12, 0xd6, - 0x87, 0x43, 0x4b, 0x8f, 0xde, 0x1a, 0x7c, 0xb8, 0xe9, 0x2d, - 0x5c, 0x98, 0xc9, 0x0d, 0x6b, 0xaf, 0xfe, 0x3a, 0x32, 0xf6, - 0xa7, 0x63, 0x05, 0xc1, 0x90, 0x54, 0x80, 0x44, 0x15, 0xd1, - 0xb7, 0x73, 0x22, 0xe6, 0xee, 0x2a, 0x7b, 0xbf, 0xd9, 0x1d, - 0x4c, 0x88, 0x00, 0xc5, 0x97, 0x52, 0x33, 0xf6, 0xa4, 0x61, - 0x66, 0xa3, 0xf1, 0x34, 0x55, 0x90, 0xc2, 0x07, 0xcc, 0x09, - 0x5b, 0x9e, 0xff, 0x3a, 0x68, 0xad, 0xaa, 0x6f, 0x3d, 0xf8, - 0x99, 0x5c, 0x0e, 0xcb, 0x85, 0x40, 0x12, 0xd7, 0xb6, 0x73, - 0x21, 0xe4, 0xe3, 0x26, 0x74, 0xb1, 0xd0, 0x15, 0x47, 0x82, - 0x49, 0x8c, 0xde, 0x1b, 0x7a, 0xbf, 0xed, 0x28, 0x2f, 0xea, - 0xb8, 0x7d, 0x1c, 0xd9, 0x8b, 0x4e, 0x17, 0xd2, 0x80, 0x45, - 0x24, 0xe1, 0xb3, 0x76, 0x71, 0xb4, 0xe6, 0x23, 0x42, 0x87, - 0xd5, 0x10, 0xdb, 0x1e, 0x4c, 0x89, 0xe8, 0x2d, 0x7f, 0xba, - 0xbd, 0x78, 0x2a, 0xef, 0x8e, 0x4b, 0x19, 0xdc, 0x92, 0x57, - 0x05, 0xc0, 0xa1, 0x64, 0x36, 0xf3, 0xf4, 0x31, 0x63, 0xa6, - 0xc7, 0x02, 0x50, 0x95, 0x5e, 0x9b, 0xc9, 0x0c, 0x6d, 0xa8, - 0xfa, 0x3f, 0x38, 0xfd, 0xaf, 0x6a, 0x0b, 0xce, 0x9c, 0x59, - 0x2e, 0xeb, 0xb9, 0x7c, 0x1d, 0xd8, 0x8a, 0x4f, 0x48, 0x8d, - 0xdf, 0x1a, 0x7b, 0xbe, 0xec, 0x29, 0xe2, 0x27, 0x75, 0xb0, - 0xd1, 0x14, 0x46, 0x83, 0x84, 0x41, 0x13, 0xd6, 0xb7, 0x72, - 0x20, 0xe5, 0xab, 0x6e, 0x3c, 0xf9, 0x98, 0x5d, 0x0f, 0xca, - 0xcd, 0x08, 0x5a, 0x9f, 0xfe, 0x3b, 0x69, 0xac, 0x67, 0xa2, - 0xf0, 0x35, 0x54, 0x91, 0xc3, 0x06, 0x01, 0xc4, 0x96, 0x53, - 0x32, 0xf7, 0xa5, 0x60, 0x39, 0xfc, 0xae, 0x6b, 0x0a, 0xcf, - 0x9d, 0x58, 0x5f, 0x9a, 0xc8, 0x0d, 0x6c, 0xa9, 0xfb, 0x3e, - 0xf5, 0x30, 0x62, 0xa7, 0xc6, 0x03, 0x51, 0x94, 0x93, 0x56, - 0x04, 0xc1, 0xa0, 0x65, 0x37, 0xf2, 0xbc, 0x79, 0x2b, 0xee, - 0x8f, 0x4a, 0x18, 0xdd, 0xda, 0x1f, 0x4d, 0x88, 0xe9, 0x2c, - 0x7e, 0xbb, 0x70, 0xb5, 0xe7, 0x22, 0x43, 0x86, 0xd4, 0x11, - 0x16, 0xd3, 0x81, 0x44, 0x25, 0xe0, 0xb2, 0x77, 0x00, 0xc6, - 0x91, 0x57, 0x3f, 0xf9, 0xae, 0x68, 0x7e, 0xb8, 0xef, 0x29, - 0x41, 0x87, 0xd0, 0x16, 0xfc, 0x3a, 0x6d, 0xab, 0xc3, 0x05, - 0x52, 0x94, 0x82, 0x44, 0x13, 0xd5, 0xbd, 0x7b, 0x2c, 0xea, - 0xe5, 0x23, 0x74, 0xb2, 0xda, 0x1c, 0x4b, 0x8d, 0x9b, 0x5d, - 0x0a, 0xcc, 0xa4, 0x62, 0x35, 0xf3, 0x19, 0xdf, 0x88, 0x4e, - 0x26, 0xe0, 0xb7, 0x71, 0x67, 0xa1, 0xf6, 0x30, 0x58, 0x9e, - 0xc9, 0x0f, 0xd7, 0x11, 0x46, 0x80, 0xe8, 0x2e, 0x79, 0xbf, - 0xa9, 0x6f, 0x38, 0xfe, 0x96, 0x50, 0x07, 0xc1, 0x2b, 0xed, - 0xba, 0x7c, 0x14, 0xd2, 0x85, 0x43, 0x55, 0x93, 0xc4, 0x02, - 0x6a, 0xac, 0xfb, 0x3d, 0x32, 0xf4, 0xa3, 0x65, 0x0d, 0xcb, - 0x9c, 0x5a, 0x4c, 0x8a, 0xdd, 0x1b, 0x73, 0xb5, 0xe2, 0x24, - 0xce, 0x08, 0x5f, 0x99, 0xf1, 0x37, 0x60, 0xa6, 0xb0, 0x76, - 0x21, 0xe7, 0x8f, 0x49, 0x1e, 0xd8, 0xb3, 0x75, 0x22, 0xe4, - 0x8c, 0x4a, 0x1d, 0xdb, 0xcd, 0x0b, 0x5c, 0x9a, 0xf2, 0x34, - 0x63, 0xa5, 0x4f, 0x89, 0xde, 0x18, 0x70, 0xb6, 0xe1, 0x27, - 0x31, 0xf7, 0xa0, 0x66, 0x0e, 0xc8, 0x9f, 0x59, 0x56, 0x90, - 0xc7, 0x01, 0x69, 0xaf, 0xf8, 0x3e, 0x28, 0xee, 0xb9, 0x7f, - 0x17, 0xd1, 0x86, 0x40, 0xaa, 0x6c, 0x3b, 0xfd, 0x95, 0x53, - 0x04, 0xc2, 0xd4, 0x12, 0x45, 0x83, 0xeb, 0x2d, 0x7a, 0xbc, - 0x64, 0xa2, 0xf5, 0x33, 0x5b, 0x9d, 0xca, 0x0c, 0x1a, 0xdc, - 0x8b, 0x4d, 0x25, 0xe3, 0xb4, 0x72, 0x98, 0x5e, 0x09, 0xcf, - 0xa7, 0x61, 0x36, 0xf0, 0xe6, 0x20, 0x77, 0xb1, 0xd9, 0x1f, - 0x48, 0x8e, 0x81, 0x47, 0x10, 0xd6, 0xbe, 0x78, 0x2f, 0xe9, - 0xff, 0x39, 0x6e, 0xa8, 0xc0, 0x06, 0x51, 0x97, 0x7d, 0xbb, - 0xec, 0x2a, 0x42, 0x84, 0xd3, 0x15, 0x03, 0xc5, 0x92, 0x54, - 0x3c, 0xfa, 0xad, 0x6b, 0x00, 0xc7, 0x93, 0x54, 0x3b, 0xfc, - 0xa8, 0x6f, 0x76, 0xb1, 0xe5, 0x22, 0x4d, 0x8a, 0xde, 0x19, - 0xec, 0x2b, 0x7f, 0xb8, 0xd7, 0x10, 0x44, 0x83, 0x9a, 0x5d, - 0x09, 0xce, 0xa1, 0x66, 0x32, 0xf5, 0xc5, 0x02, 0x56, 0x91, - 0xfe, 0x39, 0x6d, 0xaa, 0xb3, 0x74, 0x20, 0xe7, 0x88, 0x4f, - 0x1b, 0xdc, 0x29, 0xee, 0xba, 0x7d, 0x12, 0xd5, 0x81, 0x46, - 0x5f, 0x98, 0xcc, 0x0b, 0x64, 0xa3, 0xf7, 0x30, 0x97, 0x50, - 0x04, 0xc3, 0xac, 0x6b, 0x3f, 0xf8, 0xe1, 0x26, 0x72, 0xb5, - 0xda, 0x1d, 0x49, 0x8e, 0x7b, 0xbc, 0xe8, 0x2f, 0x40, 0x87, - 0xd3, 0x14, 0x0d, 0xca, 0x9e, 0x59, 0x36, 0xf1, 0xa5, 0x62, - 0x52, 0x95, 0xc1, 0x06, 0x69, 0xae, 0xfa, 0x3d, 0x24, 0xe3, - 0xb7, 0x70, 0x1f, 0xd8, 0x8c, 0x4b, 0xbe, 0x79, 0x2d, 0xea, - 0x85, 0x42, 0x16, 0xd1, 0xc8, 0x0f, 0x5b, 0x9c, 0xf3, 0x34, - 0x60, 0xa7, 0x33, 0xf4, 0xa0, 0x67, 0x08, 0xcf, 0x9b, 0x5c, - 0x45, 0x82, 0xd6, 0x11, 0x7e, 0xb9, 0xed, 0x2a, 0xdf, 0x18, - 0x4c, 0x8b, 0xe4, 0x23, 0x77, 0xb0, 0xa9, 0x6e, 0x3a, 0xfd, - 0x92, 0x55, 0x01, 0xc6, 0xf6, 0x31, 0x65, 0xa2, 0xcd, 0x0a, - 0x5e, 0x99, 0x80, 0x47, 0x13, 0xd4, 0xbb, 0x7c, 0x28, 0xef, - 0x1a, 0xdd, 0x89, 0x4e, 0x21, 0xe6, 0xb2, 0x75, 0x6c, 0xab, - 0xff, 0x38, 0x57, 0x90, 0xc4, 0x03, 0xa4, 0x63, 0x37, 0xf0, - 0x9f, 0x58, 0x0c, 0xcb, 0xd2, 0x15, 0x41, 0x86, 0xe9, 0x2e, - 0x7a, 0xbd, 0x48, 0x8f, 0xdb, 0x1c, 0x73, 0xb4, 0xe0, 0x27, - 0x3e, 0xf9, 0xad, 0x6a, 0x05, 0xc2, 0x96, 0x51, 0x61, 0xa6, - 0xf2, 0x35, 0x5a, 0x9d, 0xc9, 0x0e, 0x17, 0xd0, 0x84, 0x43, - 0x2c, 0xeb, 0xbf, 0x78, 0x8d, 0x4a, 0x1e, 0xd9, 0xb6, 0x71, - 0x25, 0xe2, 0xfb, 0x3c, 0x68, 0xaf, 0xc0, 0x07, 0x53, 0x94, - 0x00, 0xc8, 0x8d, 0x45, 0x07, 0xcf, 0x8a, 0x42, 0x0e, 0xc6, - 0x83, 0x4b, 0x09, 0xc1, 0x84, 0x4c, 0x1c, 0xd4, 0x91, 0x59, - 0x1b, 0xd3, 0x96, 0x5e, 0x12, 0xda, 0x9f, 0x57, 0x15, 0xdd, - 0x98, 0x50, 0x38, 0xf0, 0xb5, 0x7d, 0x3f, 0xf7, 0xb2, 0x7a, - 0x36, 0xfe, 0xbb, 0x73, 0x31, 0xf9, 0xbc, 0x74, 0x24, 0xec, - 0xa9, 0x61, 0x23, 0xeb, 0xae, 0x66, 0x2a, 0xe2, 0xa7, 0x6f, - 0x2d, 0xe5, 0xa0, 0x68, 0x70, 0xb8, 0xfd, 0x35, 0x77, 0xbf, - 0xfa, 0x32, 0x7e, 0xb6, 0xf3, 0x3b, 0x79, 0xb1, 0xf4, 0x3c, - 0x6c, 0xa4, 0xe1, 0x29, 0x6b, 0xa3, 0xe6, 0x2e, 0x62, 0xaa, - 0xef, 0x27, 0x65, 0xad, 0xe8, 0x20, 0x48, 0x80, 0xc5, 0x0d, - 0x4f, 0x87, 0xc2, 0x0a, 0x46, 0x8e, 0xcb, 0x03, 0x41, 0x89, - 0xcc, 0x04, 0x54, 0x9c, 0xd9, 0x11, 0x53, 0x9b, 0xde, 0x16, - 0x5a, 0x92, 0xd7, 0x1f, 0x5d, 0x95, 0xd0, 0x18, 0xe0, 0x28, - 0x6d, 0xa5, 0xe7, 0x2f, 0x6a, 0xa2, 0xee, 0x26, 0x63, 0xab, - 0xe9, 0x21, 0x64, 0xac, 0xfc, 0x34, 0x71, 0xb9, 0xfb, 0x33, - 0x76, 0xbe, 0xf2, 0x3a, 0x7f, 0xb7, 0xf5, 0x3d, 0x78, 0xb0, - 0xd8, 0x10, 0x55, 0x9d, 0xdf, 0x17, 0x52, 0x9a, 0xd6, 0x1e, - 0x5b, 0x93, 0xd1, 0x19, 0x5c, 0x94, 0xc4, 0x0c, 0x49, 0x81, - 0xc3, 0x0b, 0x4e, 0x86, 0xca, 0x02, 0x47, 0x8f, 0xcd, 0x05, - 0x40, 0x88, 0x90, 0x58, 0x1d, 0xd5, 0x97, 0x5f, 0x1a, 0xd2, - 0x9e, 0x56, 0x13, 0xdb, 0x99, 0x51, 0x14, 0xdc, 0x8c, 0x44, - 0x01, 0xc9, 0x8b, 0x43, 0x06, 0xce, 0x82, 0x4a, 0x0f, 0xc7, - 0x85, 0x4d, 0x08, 0xc0, 0xa8, 0x60, 0x25, 0xed, 0xaf, 0x67, - 0x22, 0xea, 0xa6, 0x6e, 0x2b, 0xe3, 0xa1, 0x69, 0x2c, 0xe4, - 0xb4, 0x7c, 0x39, 0xf1, 0xb3, 0x7b, 0x3e, 0xf6, 0xba, 0x72, - 0x37, 0xff, 0xbd, 0x75, 0x30, 0xf8, 0x00, 0xc9, 0x8f, 0x46, - 0x03, 0xca, 0x8c, 0x45, 0x06, 0xcf, 0x89, 0x40, 0x05, 0xcc, - 0x8a, 0x43, 0x0c, 0xc5, 0x83, 0x4a, 0x0f, 0xc6, 0x80, 0x49, - 0x0a, 0xc3, 0x85, 0x4c, 0x09, 0xc0, 0x86, 0x4f, 0x18, 0xd1, - 0x97, 0x5e, 0x1b, 0xd2, 0x94, 0x5d, 0x1e, 0xd7, 0x91, 0x58, - 0x1d, 0xd4, 0x92, 0x5b, 0x14, 0xdd, 0x9b, 0x52, 0x17, 0xde, - 0x98, 0x51, 0x12, 0xdb, 0x9d, 0x54, 0x11, 0xd8, 0x9e, 0x57, - 0x30, 0xf9, 0xbf, 0x76, 0x33, 0xfa, 0xbc, 0x75, 0x36, 0xff, - 0xb9, 0x70, 0x35, 0xfc, 0xba, 0x73, 0x3c, 0xf5, 0xb3, 0x7a, - 0x3f, 0xf6, 0xb0, 0x79, 0x3a, 0xf3, 0xb5, 0x7c, 0x39, 0xf0, - 0xb6, 0x7f, 0x28, 0xe1, 0xa7, 0x6e, 0x2b, 0xe2, 0xa4, 0x6d, - 0x2e, 0xe7, 0xa1, 0x68, 0x2d, 0xe4, 0xa2, 0x6b, 0x24, 0xed, - 0xab, 0x62, 0x27, 0xee, 0xa8, 0x61, 0x22, 0xeb, 0xad, 0x64, - 0x21, 0xe8, 0xae, 0x67, 0x60, 0xa9, 0xef, 0x26, 0x63, 0xaa, - 0xec, 0x25, 0x66, 0xaf, 0xe9, 0x20, 0x65, 0xac, 0xea, 0x23, - 0x6c, 0xa5, 0xe3, 0x2a, 0x6f, 0xa6, 0xe0, 0x29, 0x6a, 0xa3, - 0xe5, 0x2c, 0x69, 0xa0, 0xe6, 0x2f, 0x78, 0xb1, 0xf7, 0x3e, - 0x7b, 0xb2, 0xf4, 0x3d, 0x7e, 0xb7, 0xf1, 0x38, 0x7d, 0xb4, - 0xf2, 0x3b, 0x74, 0xbd, 0xfb, 0x32, 0x77, 0xbe, 0xf8, 0x31, - 0x72, 0xbb, 0xfd, 0x34, 0x71, 0xb8, 0xfe, 0x37, 0x50, 0x99, - 0xdf, 0x16, 0x53, 0x9a, 0xdc, 0x15, 0x56, 0x9f, 0xd9, 0x10, - 0x55, 0x9c, 0xda, 0x13, 0x5c, 0x95, 0xd3, 0x1a, 0x5f, 0x96, - 0xd0, 0x19, 0x5a, 0x93, 0xd5, 0x1c, 0x59, 0x90, 0xd6, 0x1f, - 0x48, 0x81, 0xc7, 0x0e, 0x4b, 0x82, 0xc4, 0x0d, 0x4e, 0x87, - 0xc1, 0x08, 0x4d, 0x84, 0xc2, 0x0b, 0x44, 0x8d, 0xcb, 0x02, - 0x47, 0x8e, 0xc8, 0x01, 0x42, 0x8b, 0xcd, 0x04, 0x41, 0x88, - 0xce, 0x07, 0x00, 0xca, 0x89, 0x43, 0x0f, 0xc5, 0x86, 0x4c, - 0x1e, 0xd4, 0x97, 0x5d, 0x11, 0xdb, 0x98, 0x52, 0x3c, 0xf6, - 0xb5, 0x7f, 0x33, 0xf9, 0xba, 0x70, 0x22, 0xe8, 0xab, 0x61, - 0x2d, 0xe7, 0xa4, 0x6e, 0x78, 0xb2, 0xf1, 0x3b, 0x77, 0xbd, - 0xfe, 0x34, 0x66, 0xac, 0xef, 0x25, 0x69, 0xa3, 0xe0, 0x2a, - 0x44, 0x8e, 0xcd, 0x07, 0x4b, 0x81, 0xc2, 0x08, 0x5a, 0x90, - 0xd3, 0x19, 0x55, 0x9f, 0xdc, 0x16, 0xf0, 0x3a, 0x79, 0xb3, - 0xff, 0x35, 0x76, 0xbc, 0xee, 0x24, 0x67, 0xad, 0xe1, 0x2b, - 0x68, 0xa2, 0xcc, 0x06, 0x45, 0x8f, 0xc3, 0x09, 0x4a, 0x80, - 0xd2, 0x18, 0x5b, 0x91, 0xdd, 0x17, 0x54, 0x9e, 0x88, 0x42, - 0x01, 0xcb, 0x87, 0x4d, 0x0e, 0xc4, 0x96, 0x5c, 0x1f, 0xd5, - 0x99, 0x53, 0x10, 0xda, 0xb4, 0x7e, 0x3d, 0xf7, 0xbb, 0x71, - 0x32, 0xf8, 0xaa, 0x60, 0x23, 0xe9, 0xa5, 0x6f, 0x2c, 0xe6, - 0xfd, 0x37, 0x74, 0xbe, 0xf2, 0x38, 0x7b, 0xb1, 0xe3, 0x29, - 0x6a, 0xa0, 0xec, 0x26, 0x65, 0xaf, 0xc1, 0x0b, 0x48, 0x82, - 0xce, 0x04, 0x47, 0x8d, 0xdf, 0x15, 0x56, 0x9c, 0xd0, 0x1a, - 0x59, 0x93, 0x85, 0x4f, 0x0c, 0xc6, 0x8a, 0x40, 0x03, 0xc9, - 0x9b, 0x51, 0x12, 0xd8, 0x94, 0x5e, 0x1d, 0xd7, 0xb9, 0x73, - 0x30, 0xfa, 0xb6, 0x7c, 0x3f, 0xf5, 0xa7, 0x6d, 0x2e, 0xe4, - 0xa8, 0x62, 0x21, 0xeb, 0x0d, 0xc7, 0x84, 0x4e, 0x02, 0xc8, - 0x8b, 0x41, 0x13, 0xd9, 0x9a, 0x50, 0x1c, 0xd6, 0x95, 0x5f, - 0x31, 0xfb, 0xb8, 0x72, 0x3e, 0xf4, 0xb7, 0x7d, 0x2f, 0xe5, - 0xa6, 0x6c, 0x20, 0xea, 0xa9, 0x63, 0x75, 0xbf, 0xfc, 0x36, - 0x7a, 0xb0, 0xf3, 0x39, 0x6b, 0xa1, 0xe2, 0x28, 0x64, 0xae, - 0xed, 0x27, 0x49, 0x83, 0xc0, 0x0a, 0x46, 0x8c, 0xcf, 0x05, - 0x57, 0x9d, 0xde, 0x14, 0x58, 0x92, 0xd1, 0x1b, 0x00, 0xcb, - 0x8b, 0x40, 0x0b, 0xc0, 0x80, 0x4b, 0x16, 0xdd, 0x9d, 0x56, - 0x1d, 0xd6, 0x96, 0x5d, 0x2c, 0xe7, 0xa7, 0x6c, 0x27, 0xec, - 0xac, 0x67, 0x3a, 0xf1, 0xb1, 0x7a, 0x31, 0xfa, 0xba, 0x71, - 0x58, 0x93, 0xd3, 0x18, 0x53, 0x98, 0xd8, 0x13, 0x4e, 0x85, - 0xc5, 0x0e, 0x45, 0x8e, 0xce, 0x05, 0x74, 0xbf, 0xff, 0x34, - 0x7f, 0xb4, 0xf4, 0x3f, 0x62, 0xa9, 0xe9, 0x22, 0x69, 0xa2, - 0xe2, 0x29, 0xb0, 0x7b, 0x3b, 0xf0, 0xbb, 0x70, 0x30, 0xfb, - 0xa6, 0x6d, 0x2d, 0xe6, 0xad, 0x66, 0x26, 0xed, 0x9c, 0x57, - 0x17, 0xdc, 0x97, 0x5c, 0x1c, 0xd7, 0x8a, 0x41, 0x01, 0xca, - 0x81, 0x4a, 0x0a, 0xc1, 0xe8, 0x23, 0x63, 0xa8, 0xe3, 0x28, - 0x68, 0xa3, 0xfe, 0x35, 0x75, 0xbe, 0xf5, 0x3e, 0x7e, 0xb5, - 0xc4, 0x0f, 0x4f, 0x84, 0xcf, 0x04, 0x44, 0x8f, 0xd2, 0x19, - 0x59, 0x92, 0xd9, 0x12, 0x52, 0x99, 0x7d, 0xb6, 0xf6, 0x3d, - 0x76, 0xbd, 0xfd, 0x36, 0x6b, 0xa0, 0xe0, 0x2b, 0x60, 0xab, - 0xeb, 0x20, 0x51, 0x9a, 0xda, 0x11, 0x5a, 0x91, 0xd1, 0x1a, - 0x47, 0x8c, 0xcc, 0x07, 0x4c, 0x87, 0xc7, 0x0c, 0x25, 0xee, - 0xae, 0x65, 0x2e, 0xe5, 0xa5, 0x6e, 0x33, 0xf8, 0xb8, 0x73, - 0x38, 0xf3, 0xb3, 0x78, 0x09, 0xc2, 0x82, 0x49, 0x02, 0xc9, - 0x89, 0x42, 0x1f, 0xd4, 0x94, 0x5f, 0x14, 0xdf, 0x9f, 0x54, - 0xcd, 0x06, 0x46, 0x8d, 0xc6, 0x0d, 0x4d, 0x86, 0xdb, 0x10, - 0x50, 0x9b, 0xd0, 0x1b, 0x5b, 0x90, 0xe1, 0x2a, 0x6a, 0xa1, - 0xea, 0x21, 0x61, 0xaa, 0xf7, 0x3c, 0x7c, 0xb7, 0xfc, 0x37, - 0x77, 0xbc, 0x95, 0x5e, 0x1e, 0xd5, 0x9e, 0x55, 0x15, 0xde, - 0x83, 0x48, 0x08, 0xc3, 0x88, 0x43, 0x03, 0xc8, 0xb9, 0x72, - 0x32, 0xf9, 0xb2, 0x79, 0x39, 0xf2, 0xaf, 0x64, 0x24, 0xef, - 0xa4, 0x6f, 0x2f, 0xe4, 0x00, 0xcc, 0x85, 0x49, 0x17, 0xdb, - 0x92, 0x5e, 0x2e, 0xe2, 0xab, 0x67, 0x39, 0xf5, 0xbc, 0x70, - 0x5c, 0x90, 0xd9, 0x15, 0x4b, 0x87, 0xce, 0x02, 0x72, 0xbe, - 0xf7, 0x3b, 0x65, 0xa9, 0xe0, 0x2c, 0xb8, 0x74, 0x3d, 0xf1, - 0xaf, 0x63, 0x2a, 0xe6, 0x96, 0x5a, 0x13, 0xdf, 0x81, 0x4d, - 0x04, 0xc8, 0xe4, 0x28, 0x61, 0xad, 0xf3, 0x3f, 0x76, 0xba, - 0xca, 0x06, 0x4f, 0x83, 0xdd, 0x11, 0x58, 0x94, 0x6d, 0xa1, - 0xe8, 0x24, 0x7a, 0xb6, 0xff, 0x33, 0x43, 0x8f, 0xc6, 0x0a, - 0x54, 0x98, 0xd1, 0x1d, 0x31, 0xfd, 0xb4, 0x78, 0x26, 0xea, - 0xa3, 0x6f, 0x1f, 0xd3, 0x9a, 0x56, 0x08, 0xc4, 0x8d, 0x41, - 0xd5, 0x19, 0x50, 0x9c, 0xc2, 0x0e, 0x47, 0x8b, 0xfb, 0x37, - 0x7e, 0xb2, 0xec, 0x20, 0x69, 0xa5, 0x89, 0x45, 0x0c, 0xc0, - 0x9e, 0x52, 0x1b, 0xd7, 0xa7, 0x6b, 0x22, 0xee, 0xb0, 0x7c, - 0x35, 0xf9, 0xda, 0x16, 0x5f, 0x93, 0xcd, 0x01, 0x48, 0x84, - 0xf4, 0x38, 0x71, 0xbd, 0xe3, 0x2f, 0x66, 0xaa, 0x86, 0x4a, - 0x03, 0xcf, 0x91, 0x5d, 0x14, 0xd8, 0xa8, 0x64, 0x2d, 0xe1, - 0xbf, 0x73, 0x3a, 0xf6, 0x62, 0xae, 0xe7, 0x2b, 0x75, 0xb9, - 0xf0, 0x3c, 0x4c, 0x80, 0xc9, 0x05, 0x5b, 0x97, 0xde, 0x12, - 0x3e, 0xf2, 0xbb, 0x77, 0x29, 0xe5, 0xac, 0x60, 0x10, 0xdc, - 0x95, 0x59, 0x07, 0xcb, 0x82, 0x4e, 0xb7, 0x7b, 0x32, 0xfe, - 0xa0, 0x6c, 0x25, 0xe9, 0x99, 0x55, 0x1c, 0xd0, 0x8e, 0x42, - 0x0b, 0xc7, 0xeb, 0x27, 0x6e, 0xa2, 0xfc, 0x30, 0x79, 0xb5, - 0xc5, 0x09, 0x40, 0x8c, 0xd2, 0x1e, 0x57, 0x9b, 0x0f, 0xc3, - 0x8a, 0x46, 0x18, 0xd4, 0x9d, 0x51, 0x21, 0xed, 0xa4, 0x68, - 0x36, 0xfa, 0xb3, 0x7f, 0x53, 0x9f, 0xd6, 0x1a, 0x44, 0x88, - 0xc1, 0x0d, 0x7d, 0xb1, 0xf8, 0x34, 0x6a, 0xa6, 0xef, 0x23, - 0x00, 0xcd, 0x87, 0x4a, 0x13, 0xde, 0x94, 0x59, 0x26, 0xeb, - 0xa1, 0x6c, 0x35, 0xf8, 0xb2, 0x7f, 0x4c, 0x81, 0xcb, 0x06, - 0x5f, 0x92, 0xd8, 0x15, 0x6a, 0xa7, 0xed, 0x20, 0x79, 0xb4, - 0xfe, 0x33, 0x98, 0x55, 0x1f, 0xd2, 0x8b, 0x46, 0x0c, 0xc1, - 0xbe, 0x73, 0x39, 0xf4, 0xad, 0x60, 0x2a, 0xe7, 0xd4, 0x19, - 0x53, 0x9e, 0xc7, 0x0a, 0x40, 0x8d, 0xf2, 0x3f, 0x75, 0xb8, - 0xe1, 0x2c, 0x66, 0xab, 0x2d, 0xe0, 0xaa, 0x67, 0x3e, 0xf3, - 0xb9, 0x74, 0x0b, 0xc6, 0x8c, 0x41, 0x18, 0xd5, 0x9f, 0x52, - 0x61, 0xac, 0xe6, 0x2b, 0x72, 0xbf, 0xf5, 0x38, 0x47, 0x8a, - 0xc0, 0x0d, 0x54, 0x99, 0xd3, 0x1e, 0xb5, 0x78, 0x32, 0xff, - 0xa6, 0x6b, 0x21, 0xec, 0x93, 0x5e, 0x14, 0xd9, 0x80, 0x4d, - 0x07, 0xca, 0xf9, 0x34, 0x7e, 0xb3, 0xea, 0x27, 0x6d, 0xa0, - 0xdf, 0x12, 0x58, 0x95, 0xcc, 0x01, 0x4b, 0x86, 0x5a, 0x97, - 0xdd, 0x10, 0x49, 0x84, 0xce, 0x03, 0x7c, 0xb1, 0xfb, 0x36, - 0x6f, 0xa2, 0xe8, 0x25, 0x16, 0xdb, 0x91, 0x5c, 0x05, 0xc8, - 0x82, 0x4f, 0x30, 0xfd, 0xb7, 0x7a, 0x23, 0xee, 0xa4, 0x69, - 0xc2, 0x0f, 0x45, 0x88, 0xd1, 0x1c, 0x56, 0x9b, 0xe4, 0x29, - 0x63, 0xae, 0xf7, 0x3a, 0x70, 0xbd, 0x8e, 0x43, 0x09, 0xc4, - 0x9d, 0x50, 0x1a, 0xd7, 0xa8, 0x65, 0x2f, 0xe2, 0xbb, 0x76, - 0x3c, 0xf1, 0x77, 0xba, 0xf0, 0x3d, 0x64, 0xa9, 0xe3, 0x2e, - 0x51, 0x9c, 0xd6, 0x1b, 0x42, 0x8f, 0xc5, 0x08, 0x3b, 0xf6, - 0xbc, 0x71, 0x28, 0xe5, 0xaf, 0x62, 0x1d, 0xd0, 0x9a, 0x57, - 0x0e, 0xc3, 0x89, 0x44, 0xef, 0x22, 0x68, 0xa5, 0xfc, 0x31, - 0x7b, 0xb6, 0xc9, 0x04, 0x4e, 0x83, 0xda, 0x17, 0x5d, 0x90, - 0xa3, 0x6e, 0x24, 0xe9, 0xb0, 0x7d, 0x37, 0xfa, 0x85, 0x48, - 0x02, 0xcf, 0x96, 0x5b, 0x11, 0xdc, 0x00, 0xce, 0x81, 0x4f, - 0x1f, 0xd1, 0x9e, 0x50, 0x3e, 0xf0, 0xbf, 0x71, 0x21, 0xef, - 0xa0, 0x6e, 0x7c, 0xb2, 0xfd, 0x33, 0x63, 0xad, 0xe2, 0x2c, - 0x42, 0x8c, 0xc3, 0x0d, 0x5d, 0x93, 0xdc, 0x12, 0xf8, 0x36, - 0x79, 0xb7, 0xe7, 0x29, 0x66, 0xa8, 0xc6, 0x08, 0x47, 0x89, - 0xd9, 0x17, 0x58, 0x96, 0x84, 0x4a, 0x05, 0xcb, 0x9b, 0x55, - 0x1a, 0xd4, 0xba, 0x74, 0x3b, 0xf5, 0xa5, 0x6b, 0x24, 0xea, - 0xed, 0x23, 0x6c, 0xa2, 0xf2, 0x3c, 0x73, 0xbd, 0xd3, 0x1d, - 0x52, 0x9c, 0xcc, 0x02, 0x4d, 0x83, 0x91, 0x5f, 0x10, 0xde, - 0x8e, 0x40, 0x0f, 0xc1, 0xaf, 0x61, 0x2e, 0xe0, 0xb0, 0x7e, - 0x31, 0xff, 0x15, 0xdb, 0x94, 0x5a, 0x0a, 0xc4, 0x8b, 0x45, - 0x2b, 0xe5, 0xaa, 0x64, 0x34, 0xfa, 0xb5, 0x7b, 0x69, 0xa7, - 0xe8, 0x26, 0x76, 0xb8, 0xf7, 0x39, 0x57, 0x99, 0xd6, 0x18, - 0x48, 0x86, 0xc9, 0x07, 0xc7, 0x09, 0x46, 0x88, 0xd8, 0x16, - 0x59, 0x97, 0xf9, 0x37, 0x78, 0xb6, 0xe6, 0x28, 0x67, 0xa9, - 0xbb, 0x75, 0x3a, 0xf4, 0xa4, 0x6a, 0x25, 0xeb, 0x85, 0x4b, - 0x04, 0xca, 0x9a, 0x54, 0x1b, 0xd5, 0x3f, 0xf1, 0xbe, 0x70, - 0x20, 0xee, 0xa1, 0x6f, 0x01, 0xcf, 0x80, 0x4e, 0x1e, 0xd0, - 0x9f, 0x51, 0x43, 0x8d, 0xc2, 0x0c, 0x5c, 0x92, 0xdd, 0x13, - 0x7d, 0xb3, 0xfc, 0x32, 0x62, 0xac, 0xe3, 0x2d, 0x2a, 0xe4, - 0xab, 0x65, 0x35, 0xfb, 0xb4, 0x7a, 0x14, 0xda, 0x95, 0x5b, - 0x0b, 0xc5, 0x8a, 0x44, 0x56, 0x98, 0xd7, 0x19, 0x49, 0x87, - 0xc8, 0x06, 0x68, 0xa6, 0xe9, 0x27, 0x77, 0xb9, 0xf6, 0x38, - 0xd2, 0x1c, 0x53, 0x9d, 0xcd, 0x03, 0x4c, 0x82, 0xec, 0x22, - 0x6d, 0xa3, 0xf3, 0x3d, 0x72, 0xbc, 0xae, 0x60, 0x2f, 0xe1, - 0xb1, 0x7f, 0x30, 0xfe, 0x90, 0x5e, 0x11, 0xdf, 0x8f, 0x41, - 0x0e, 0xc0, 0x00, 0xcf, 0x83, 0x4c, 0x1b, 0xd4, 0x98, 0x57, - 0x36, 0xf9, 0xb5, 0x7a, 0x2d, 0xe2, 0xae, 0x61, 0x6c, 0xa3, - 0xef, 0x20, 0x77, 0xb8, 0xf4, 0x3b, 0x5a, 0x95, 0xd9, 0x16, - 0x41, 0x8e, 0xc2, 0x0d, 0xd8, 0x17, 0x5b, 0x94, 0xc3, 0x0c, - 0x40, 0x8f, 0xee, 0x21, 0x6d, 0xa2, 0xf5, 0x3a, 0x76, 0xb9, - 0xb4, 0x7b, 0x37, 0xf8, 0xaf, 0x60, 0x2c, 0xe3, 0x82, 0x4d, - 0x01, 0xce, 0x99, 0x56, 0x1a, 0xd5, 0xad, 0x62, 0x2e, 0xe1, - 0xb6, 0x79, 0x35, 0xfa, 0x9b, 0x54, 0x18, 0xd7, 0x80, 0x4f, - 0x03, 0xcc, 0xc1, 0x0e, 0x42, 0x8d, 0xda, 0x15, 0x59, 0x96, - 0xf7, 0x38, 0x74, 0xbb, 0xec, 0x23, 0x6f, 0xa0, 0x75, 0xba, - 0xf6, 0x39, 0x6e, 0xa1, 0xed, 0x22, 0x43, 0x8c, 0xc0, 0x0f, - 0x58, 0x97, 0xdb, 0x14, 0x19, 0xd6, 0x9a, 0x55, 0x02, 0xcd, - 0x81, 0x4e, 0x2f, 0xe0, 0xac, 0x63, 0x34, 0xfb, 0xb7, 0x78, - 0x47, 0x88, 0xc4, 0x0b, 0x5c, 0x93, 0xdf, 0x10, 0x71, 0xbe, - 0xf2, 0x3d, 0x6a, 0xa5, 0xe9, 0x26, 0x2b, 0xe4, 0xa8, 0x67, - 0x30, 0xff, 0xb3, 0x7c, 0x1d, 0xd2, 0x9e, 0x51, 0x06, 0xc9, - 0x85, 0x4a, 0x9f, 0x50, 0x1c, 0xd3, 0x84, 0x4b, 0x07, 0xc8, - 0xa9, 0x66, 0x2a, 0xe5, 0xb2, 0x7d, 0x31, 0xfe, 0xf3, 0x3c, - 0x70, 0xbf, 0xe8, 0x27, 0x6b, 0xa4, 0xc5, 0x0a, 0x46, 0x89, - 0xde, 0x11, 0x5d, 0x92, 0xea, 0x25, 0x69, 0xa6, 0xf1, 0x3e, - 0x72, 0xbd, 0xdc, 0x13, 0x5f, 0x90, 0xc7, 0x08, 0x44, 0x8b, - 0x86, 0x49, 0x05, 0xca, 0x9d, 0x52, 0x1e, 0xd1, 0xb0, 0x7f, - 0x33, 0xfc, 0xab, 0x64, 0x28, 0xe7, 0x32, 0xfd, 0xb1, 0x7e, - 0x29, 0xe6, 0xaa, 0x65, 0x04, 0xcb, 0x87, 0x48, 0x1f, 0xd0, - 0x9c, 0x53, 0x5e, 0x91, 0xdd, 0x12, 0x45, 0x8a, 0xc6, 0x09, - 0x68, 0xa7, 0xeb, 0x24, 0x73, 0xbc, 0xf0, 0x3f, 0x00, 0xd0, - 0xbd, 0x6d, 0x67, 0xb7, 0xda, 0x0a, 0xce, 0x1e, 0x73, 0xa3, - 0xa9, 0x79, 0x14, 0xc4, 0x81, 0x51, 0x3c, 0xec, 0xe6, 0x36, - 0x5b, 0x8b, 0x4f, 0x9f, 0xf2, 0x22, 0x28, 0xf8, 0x95, 0x45, - 0x1f, 0xcf, 0xa2, 0x72, 0x78, 0xa8, 0xc5, 0x15, 0xd1, 0x01, - 0x6c, 0xbc, 0xb6, 0x66, 0x0b, 0xdb, 0x9e, 0x4e, 0x23, 0xf3, - 0xf9, 0x29, 0x44, 0x94, 0x50, 0x80, 0xed, 0x3d, 0x37, 0xe7, - 0x8a, 0x5a, 0x3e, 0xee, 0x83, 0x53, 0x59, 0x89, 0xe4, 0x34, - 0xf0, 0x20, 0x4d, 0x9d, 0x97, 0x47, 0x2a, 0xfa, 0xbf, 0x6f, - 0x02, 0xd2, 0xd8, 0x08, 0x65, 0xb5, 0x71, 0xa1, 0xcc, 0x1c, - 0x16, 0xc6, 0xab, 0x7b, 0x21, 0xf1, 0x9c, 0x4c, 0x46, 0x96, - 0xfb, 0x2b, 0xef, 0x3f, 0x52, 0x82, 0x88, 0x58, 0x35, 0xe5, - 0xa0, 0x70, 0x1d, 0xcd, 0xc7, 0x17, 0x7a, 0xaa, 0x6e, 0xbe, - 0xd3, 0x03, 0x09, 0xd9, 0xb4, 0x64, 0x7c, 0xac, 0xc1, 0x11, - 0x1b, 0xcb, 0xa6, 0x76, 0xb2, 0x62, 0x0f, 0xdf, 0xd5, 0x05, - 0x68, 0xb8, 0xfd, 0x2d, 0x40, 0x90, 0x9a, 0x4a, 0x27, 0xf7, - 0x33, 0xe3, 0x8e, 0x5e, 0x54, 0x84, 0xe9, 0x39, 0x63, 0xb3, - 0xde, 0x0e, 0x04, 0xd4, 0xb9, 0x69, 0xad, 0x7d, 0x10, 0xc0, - 0xca, 0x1a, 0x77, 0xa7, 0xe2, 0x32, 0x5f, 0x8f, 0x85, 0x55, - 0x38, 0xe8, 0x2c, 0xfc, 0x91, 0x41, 0x4b, 0x9b, 0xf6, 0x26, - 0x42, 0x92, 0xff, 0x2f, 0x25, 0xf5, 0x98, 0x48, 0x8c, 0x5c, - 0x31, 0xe1, 0xeb, 0x3b, 0x56, 0x86, 0xc3, 0x13, 0x7e, 0xae, - 0xa4, 0x74, 0x19, 0xc9, 0x0d, 0xdd, 0xb0, 0x60, 0x6a, 0xba, - 0xd7, 0x07, 0x5d, 0x8d, 0xe0, 0x30, 0x3a, 0xea, 0x87, 0x57, - 0x93, 0x43, 0x2e, 0xfe, 0xf4, 0x24, 0x49, 0x99, 0xdc, 0x0c, - 0x61, 0xb1, 0xbb, 0x6b, 0x06, 0xd6, 0x12, 0xc2, 0xaf, 0x7f, - 0x75, 0xa5, 0xc8, 0x18, 0x00, 0xd1, 0xbf, 0x6e, 0x63, 0xb2, - 0xdc, 0x0d, 0xc6, 0x17, 0x79, 0xa8, 0xa5, 0x74, 0x1a, 0xcb, - 0x91, 0x40, 0x2e, 0xff, 0xf2, 0x23, 0x4d, 0x9c, 0x57, 0x86, - 0xe8, 0x39, 0x34, 0xe5, 0x8b, 0x5a, 0x3f, 0xee, 0x80, 0x51, - 0x5c, 0x8d, 0xe3, 0x32, 0xf9, 0x28, 0x46, 0x97, 0x9a, 0x4b, - 0x25, 0xf4, 0xae, 0x7f, 0x11, 0xc0, 0xcd, 0x1c, 0x72, 0xa3, - 0x68, 0xb9, 0xd7, 0x06, 0x0b, 0xda, 0xb4, 0x65, 0x7e, 0xaf, - 0xc1, 0x10, 0x1d, 0xcc, 0xa2, 0x73, 0xb8, 0x69, 0x07, 0xd6, - 0xdb, 0x0a, 0x64, 0xb5, 0xef, 0x3e, 0x50, 0x81, 0x8c, 0x5d, - 0x33, 0xe2, 0x29, 0xf8, 0x96, 0x47, 0x4a, 0x9b, 0xf5, 0x24, - 0x41, 0x90, 0xfe, 0x2f, 0x22, 0xf3, 0x9d, 0x4c, 0x87, 0x56, - 0x38, 0xe9, 0xe4, 0x35, 0x5b, 0x8a, 0xd0, 0x01, 0x6f, 0xbe, - 0xb3, 0x62, 0x0c, 0xdd, 0x16, 0xc7, 0xa9, 0x78, 0x75, 0xa4, - 0xca, 0x1b, 0xfc, 0x2d, 0x43, 0x92, 0x9f, 0x4e, 0x20, 0xf1, - 0x3a, 0xeb, 0x85, 0x54, 0x59, 0x88, 0xe6, 0x37, 0x6d, 0xbc, - 0xd2, 0x03, 0x0e, 0xdf, 0xb1, 0x60, 0xab, 0x7a, 0x14, 0xc5, - 0xc8, 0x19, 0x77, 0xa6, 0xc3, 0x12, 0x7c, 0xad, 0xa0, 0x71, - 0x1f, 0xce, 0x05, 0xd4, 0xba, 0x6b, 0x66, 0xb7, 0xd9, 0x08, - 0x52, 0x83, 0xed, 0x3c, 0x31, 0xe0, 0x8e, 0x5f, 0x94, 0x45, - 0x2b, 0xfa, 0xf7, 0x26, 0x48, 0x99, 0x82, 0x53, 0x3d, 0xec, - 0xe1, 0x30, 0x5e, 0x8f, 0x44, 0x95, 0xfb, 0x2a, 0x27, 0xf6, - 0x98, 0x49, 0x13, 0xc2, 0xac, 0x7d, 0x70, 0xa1, 0xcf, 0x1e, - 0xd5, 0x04, 0x6a, 0xbb, 0xb6, 0x67, 0x09, 0xd8, 0xbd, 0x6c, - 0x02, 0xd3, 0xde, 0x0f, 0x61, 0xb0, 0x7b, 0xaa, 0xc4, 0x15, - 0x18, 0xc9, 0xa7, 0x76, 0x2c, 0xfd, 0x93, 0x42, 0x4f, 0x9e, - 0xf0, 0x21, 0xea, 0x3b, 0x55, 0x84, 0x89, 0x58, 0x36, 0xe7, - 0x00, 0xd2, 0xb9, 0x6b, 0x6f, 0xbd, 0xd6, 0x04, 0xde, 0x0c, - 0x67, 0xb5, 0xb1, 0x63, 0x08, 0xda, 0xa1, 0x73, 0x18, 0xca, - 0xce, 0x1c, 0x77, 0xa5, 0x7f, 0xad, 0xc6, 0x14, 0x10, 0xc2, - 0xa9, 0x7b, 0x5f, 0x8d, 0xe6, 0x34, 0x30, 0xe2, 0x89, 0x5b, - 0x81, 0x53, 0x38, 0xea, 0xee, 0x3c, 0x57, 0x85, 0xfe, 0x2c, - 0x47, 0x95, 0x91, 0x43, 0x28, 0xfa, 0x20, 0xf2, 0x99, 0x4b, - 0x4f, 0x9d, 0xf6, 0x24, 0xbe, 0x6c, 0x07, 0xd5, 0xd1, 0x03, - 0x68, 0xba, 0x60, 0xb2, 0xd9, 0x0b, 0x0f, 0xdd, 0xb6, 0x64, - 0x1f, 0xcd, 0xa6, 0x74, 0x70, 0xa2, 0xc9, 0x1b, 0xc1, 0x13, - 0x78, 0xaa, 0xae, 0x7c, 0x17, 0xc5, 0xe1, 0x33, 0x58, 0x8a, - 0x8e, 0x5c, 0x37, 0xe5, 0x3f, 0xed, 0x86, 0x54, 0x50, 0x82, - 0xe9, 0x3b, 0x40, 0x92, 0xf9, 0x2b, 0x2f, 0xfd, 0x96, 0x44, - 0x9e, 0x4c, 0x27, 0xf5, 0xf1, 0x23, 0x48, 0x9a, 0x61, 0xb3, - 0xd8, 0x0a, 0x0e, 0xdc, 0xb7, 0x65, 0xbf, 0x6d, 0x06, 0xd4, - 0xd0, 0x02, 0x69, 0xbb, 0xc0, 0x12, 0x79, 0xab, 0xaf, 0x7d, - 0x16, 0xc4, 0x1e, 0xcc, 0xa7, 0x75, 0x71, 0xa3, 0xc8, 0x1a, - 0x3e, 0xec, 0x87, 0x55, 0x51, 0x83, 0xe8, 0x3a, 0xe0, 0x32, - 0x59, 0x8b, 0x8f, 0x5d, 0x36, 0xe4, 0x9f, 0x4d, 0x26, 0xf4, - 0xf0, 0x22, 0x49, 0x9b, 0x41, 0x93, 0xf8, 0x2a, 0x2e, 0xfc, - 0x97, 0x45, 0xdf, 0x0d, 0x66, 0xb4, 0xb0, 0x62, 0x09, 0xdb, - 0x01, 0xd3, 0xb8, 0x6a, 0x6e, 0xbc, 0xd7, 0x05, 0x7e, 0xac, - 0xc7, 0x15, 0x11, 0xc3, 0xa8, 0x7a, 0xa0, 0x72, 0x19, 0xcb, - 0xcf, 0x1d, 0x76, 0xa4, 0x80, 0x52, 0x39, 0xeb, 0xef, 0x3d, - 0x56, 0x84, 0x5e, 0x8c, 0xe7, 0x35, 0x31, 0xe3, 0x88, 0x5a, - 0x21, 0xf3, 0x98, 0x4a, 0x4e, 0x9c, 0xf7, 0x25, 0xff, 0x2d, - 0x46, 0x94, 0x90, 0x42, 0x29, 0xfb, 0x00, 0xd3, 0xbb, 0x68, - 0x6b, 0xb8, 0xd0, 0x03, 0xd6, 0x05, 0x6d, 0xbe, 0xbd, 0x6e, - 0x06, 0xd5, 0xb1, 0x62, 0x0a, 0xd9, 0xda, 0x09, 0x61, 0xb2, - 0x67, 0xb4, 0xdc, 0x0f, 0x0c, 0xdf, 0xb7, 0x64, 0x7f, 0xac, - 0xc4, 0x17, 0x14, 0xc7, 0xaf, 0x7c, 0xa9, 0x7a, 0x12, 0xc1, - 0xc2, 0x11, 0x79, 0xaa, 0xce, 0x1d, 0x75, 0xa6, 0xa5, 0x76, - 0x1e, 0xcd, 0x18, 0xcb, 0xa3, 0x70, 0x73, 0xa0, 0xc8, 0x1b, - 0xfe, 0x2d, 0x45, 0x96, 0x95, 0x46, 0x2e, 0xfd, 0x28, 0xfb, - 0x93, 0x40, 0x43, 0x90, 0xf8, 0x2b, 0x4f, 0x9c, 0xf4, 0x27, - 0x24, 0xf7, 0x9f, 0x4c, 0x99, 0x4a, 0x22, 0xf1, 0xf2, 0x21, - 0x49, 0x9a, 0x81, 0x52, 0x3a, 0xe9, 0xea, 0x39, 0x51, 0x82, - 0x57, 0x84, 0xec, 0x3f, 0x3c, 0xef, 0x87, 0x54, 0x30, 0xe3, - 0x8b, 0x58, 0x5b, 0x88, 0xe0, 0x33, 0xe6, 0x35, 0x5d, 0x8e, - 0x8d, 0x5e, 0x36, 0xe5, 0xe1, 0x32, 0x5a, 0x89, 0x8a, 0x59, - 0x31, 0xe2, 0x37, 0xe4, 0x8c, 0x5f, 0x5c, 0x8f, 0xe7, 0x34, - 0x50, 0x83, 0xeb, 0x38, 0x3b, 0xe8, 0x80, 0x53, 0x86, 0x55, - 0x3d, 0xee, 0xed, 0x3e, 0x56, 0x85, 0x9e, 0x4d, 0x25, 0xf6, - 0xf5, 0x26, 0x4e, 0x9d, 0x48, 0x9b, 0xf3, 0x20, 0x23, 0xf0, - 0x98, 0x4b, 0x2f, 0xfc, 0x94, 0x47, 0x44, 0x97, 0xff, 0x2c, - 0xf9, 0x2a, 0x42, 0x91, 0x92, 0x41, 0x29, 0xfa, 0x1f, 0xcc, - 0xa4, 0x77, 0x74, 0xa7, 0xcf, 0x1c, 0xc9, 0x1a, 0x72, 0xa1, - 0xa2, 0x71, 0x19, 0xca, 0xae, 0x7d, 0x15, 0xc6, 0xc5, 0x16, - 0x7e, 0xad, 0x78, 0xab, 0xc3, 0x10, 0x13, 0xc0, 0xa8, 0x7b, - 0x60, 0xb3, 0xdb, 0x08, 0x0b, 0xd8, 0xb0, 0x63, 0xb6, 0x65, - 0x0d, 0xde, 0xdd, 0x0e, 0x66, 0xb5, 0xd1, 0x02, 0x6a, 0xb9, - 0xba, 0x69, 0x01, 0xd2, 0x07, 0xd4, 0xbc, 0x6f, 0x6c, 0xbf, - 0xd7, 0x04, 0x00, 0xd4, 0xb5, 0x61, 0x77, 0xa3, 0xc2, 0x16, - 0xee, 0x3a, 0x5b, 0x8f, 0x99, 0x4d, 0x2c, 0xf8, 0xc1, 0x15, - 0x74, 0xa0, 0xb6, 0x62, 0x03, 0xd7, 0x2f, 0xfb, 0x9a, 0x4e, - 0x58, 0x8c, 0xed, 0x39, 0x9f, 0x4b, 0x2a, 0xfe, 0xe8, 0x3c, - 0x5d, 0x89, 0x71, 0xa5, 0xc4, 0x10, 0x06, 0xd2, 0xb3, 0x67, - 0x5e, 0x8a, 0xeb, 0x3f, 0x29, 0xfd, 0x9c, 0x48, 0xb0, 0x64, - 0x05, 0xd1, 0xc7, 0x13, 0x72, 0xa6, 0x23, 0xf7, 0x96, 0x42, - 0x54, 0x80, 0xe1, 0x35, 0xcd, 0x19, 0x78, 0xac, 0xba, 0x6e, - 0x0f, 0xdb, 0xe2, 0x36, 0x57, 0x83, 0x95, 0x41, 0x20, 0xf4, - 0x0c, 0xd8, 0xb9, 0x6d, 0x7b, 0xaf, 0xce, 0x1a, 0xbc, 0x68, - 0x09, 0xdd, 0xcb, 0x1f, 0x7e, 0xaa, 0x52, 0x86, 0xe7, 0x33, - 0x25, 0xf1, 0x90, 0x44, 0x7d, 0xa9, 0xc8, 0x1c, 0x0a, 0xde, - 0xbf, 0x6b, 0x93, 0x47, 0x26, 0xf2, 0xe4, 0x30, 0x51, 0x85, - 0x46, 0x92, 0xf3, 0x27, 0x31, 0xe5, 0x84, 0x50, 0xa8, 0x7c, - 0x1d, 0xc9, 0xdf, 0x0b, 0x6a, 0xbe, 0x87, 0x53, 0x32, 0xe6, - 0xf0, 0x24, 0x45, 0x91, 0x69, 0xbd, 0xdc, 0x08, 0x1e, 0xca, - 0xab, 0x7f, 0xd9, 0x0d, 0x6c, 0xb8, 0xae, 0x7a, 0x1b, 0xcf, - 0x37, 0xe3, 0x82, 0x56, 0x40, 0x94, 0xf5, 0x21, 0x18, 0xcc, - 0xad, 0x79, 0x6f, 0xbb, 0xda, 0x0e, 0xf6, 0x22, 0x43, 0x97, - 0x81, 0x55, 0x34, 0xe0, 0x65, 0xb1, 0xd0, 0x04, 0x12, 0xc6, - 0xa7, 0x73, 0x8b, 0x5f, 0x3e, 0xea, 0xfc, 0x28, 0x49, 0x9d, - 0xa4, 0x70, 0x11, 0xc5, 0xd3, 0x07, 0x66, 0xb2, 0x4a, 0x9e, - 0xff, 0x2b, 0x3d, 0xe9, 0x88, 0x5c, 0xfa, 0x2e, 0x4f, 0x9b, - 0x8d, 0x59, 0x38, 0xec, 0x14, 0xc0, 0xa1, 0x75, 0x63, 0xb7, - 0xd6, 0x02, 0x3b, 0xef, 0x8e, 0x5a, 0x4c, 0x98, 0xf9, 0x2d, - 0xd5, 0x01, 0x60, 0xb4, 0xa2, 0x76, 0x17, 0xc3, 0x00, 0xd5, - 0xb7, 0x62, 0x73, 0xa6, 0xc4, 0x11, 0xe6, 0x33, 0x51, 0x84, - 0x95, 0x40, 0x22, 0xf7, 0xd1, 0x04, 0x66, 0xb3, 0xa2, 0x77, - 0x15, 0xc0, 0x37, 0xe2, 0x80, 0x55, 0x44, 0x91, 0xf3, 0x26, - 0xbf, 0x6a, 0x08, 0xdd, 0xcc, 0x19, 0x7b, 0xae, 0x59, 0x8c, - 0xee, 0x3b, 0x2a, 0xff, 0x9d, 0x48, 0x6e, 0xbb, 0xd9, 0x0c, - 0x1d, 0xc8, 0xaa, 0x7f, 0x88, 0x5d, 0x3f, 0xea, 0xfb, 0x2e, - 0x4c, 0x99, 0x63, 0xb6, 0xd4, 0x01, 0x10, 0xc5, 0xa7, 0x72, - 0x85, 0x50, 0x32, 0xe7, 0xf6, 0x23, 0x41, 0x94, 0xb2, 0x67, - 0x05, 0xd0, 0xc1, 0x14, 0x76, 0xa3, 0x54, 0x81, 0xe3, 0x36, - 0x27, 0xf2, 0x90, 0x45, 0xdc, 0x09, 0x6b, 0xbe, 0xaf, 0x7a, - 0x18, 0xcd, 0x3a, 0xef, 0x8d, 0x58, 0x49, 0x9c, 0xfe, 0x2b, - 0x0d, 0xd8, 0xba, 0x6f, 0x7e, 0xab, 0xc9, 0x1c, 0xeb, 0x3e, - 0x5c, 0x89, 0x98, 0x4d, 0x2f, 0xfa, 0xc6, 0x13, 0x71, 0xa4, - 0xb5, 0x60, 0x02, 0xd7, 0x20, 0xf5, 0x97, 0x42, 0x53, 0x86, - 0xe4, 0x31, 0x17, 0xc2, 0xa0, 0x75, 0x64, 0xb1, 0xd3, 0x06, - 0xf1, 0x24, 0x46, 0x93, 0x82, 0x57, 0x35, 0xe0, 0x79, 0xac, - 0xce, 0x1b, 0x0a, 0xdf, 0xbd, 0x68, 0x9f, 0x4a, 0x28, 0xfd, - 0xec, 0x39, 0x5b, 0x8e, 0xa8, 0x7d, 0x1f, 0xca, 0xdb, 0x0e, - 0x6c, 0xb9, 0x4e, 0x9b, 0xf9, 0x2c, 0x3d, 0xe8, 0x8a, 0x5f, - 0xa5, 0x70, 0x12, 0xc7, 0xd6, 0x03, 0x61, 0xb4, 0x43, 0x96, - 0xf4, 0x21, 0x30, 0xe5, 0x87, 0x52, 0x74, 0xa1, 0xc3, 0x16, - 0x07, 0xd2, 0xb0, 0x65, 0x92, 0x47, 0x25, 0xf0, 0xe1, 0x34, - 0x56, 0x83, 0x1a, 0xcf, 0xad, 0x78, 0x69, 0xbc, 0xde, 0x0b, - 0xfc, 0x29, 0x4b, 0x9e, 0x8f, 0x5a, 0x38, 0xed, 0xcb, 0x1e, - 0x7c, 0xa9, 0xb8, 0x6d, 0x0f, 0xda, 0x2d, 0xf8, 0x9a, 0x4f, - 0x5e, 0x8b, 0xe9, 0x3c, 0x00, 0xd6, 0xb1, 0x67, 0x7f, 0xa9, - 0xce, 0x18, 0xfe, 0x28, 0x4f, 0x99, 0x81, 0x57, 0x30, 0xe6, - 0xe1, 0x37, 0x50, 0x86, 0x9e, 0x48, 0x2f, 0xf9, 0x1f, 0xc9, - 0xae, 0x78, 0x60, 0xb6, 0xd1, 0x07, 0xdf, 0x09, 0x6e, 0xb8, - 0xa0, 0x76, 0x11, 0xc7, 0x21, 0xf7, 0x90, 0x46, 0x5e, 0x88, - 0xef, 0x39, 0x3e, 0xe8, 0x8f, 0x59, 0x41, 0x97, 0xf0, 0x26, - 0xc0, 0x16, 0x71, 0xa7, 0xbf, 0x69, 0x0e, 0xd8, 0xa3, 0x75, - 0x12, 0xc4, 0xdc, 0x0a, 0x6d, 0xbb, 0x5d, 0x8b, 0xec, 0x3a, - 0x22, 0xf4, 0x93, 0x45, 0x42, 0x94, 0xf3, 0x25, 0x3d, 0xeb, - 0x8c, 0x5a, 0xbc, 0x6a, 0x0d, 0xdb, 0xc3, 0x15, 0x72, 0xa4, - 0x7c, 0xaa, 0xcd, 0x1b, 0x03, 0xd5, 0xb2, 0x64, 0x82, 0x54, - 0x33, 0xe5, 0xfd, 0x2b, 0x4c, 0x9a, 0x9d, 0x4b, 0x2c, 0xfa, - 0xe2, 0x34, 0x53, 0x85, 0x63, 0xb5, 0xd2, 0x04, 0x1c, 0xca, - 0xad, 0x7b, 0x5b, 0x8d, 0xea, 0x3c, 0x24, 0xf2, 0x95, 0x43, - 0xa5, 0x73, 0x14, 0xc2, 0xda, 0x0c, 0x6b, 0xbd, 0xba, 0x6c, - 0x0b, 0xdd, 0xc5, 0x13, 0x74, 0xa2, 0x44, 0x92, 0xf5, 0x23, - 0x3b, 0xed, 0x8a, 0x5c, 0x84, 0x52, 0x35, 0xe3, 0xfb, 0x2d, - 0x4a, 0x9c, 0x7a, 0xac, 0xcb, 0x1d, 0x05, 0xd3, 0xb4, 0x62, - 0x65, 0xb3, 0xd4, 0x02, 0x1a, 0xcc, 0xab, 0x7d, 0x9b, 0x4d, - 0x2a, 0xfc, 0xe4, 0x32, 0x55, 0x83, 0xf8, 0x2e, 0x49, 0x9f, - 0x87, 0x51, 0x36, 0xe0, 0x06, 0xd0, 0xb7, 0x61, 0x79, 0xaf, - 0xc8, 0x1e, 0x19, 0xcf, 0xa8, 0x7e, 0x66, 0xb0, 0xd7, 0x01, - 0xe7, 0x31, 0x56, 0x80, 0x98, 0x4e, 0x29, 0xff, 0x27, 0xf1, - 0x96, 0x40, 0x58, 0x8e, 0xe9, 0x3f, 0xd9, 0x0f, 0x68, 0xbe, - 0xa6, 0x70, 0x17, 0xc1, 0xc6, 0x10, 0x77, 0xa1, 0xb9, 0x6f, - 0x08, 0xde, 0x38, 0xee, 0x89, 0x5f, 0x47, 0x91, 0xf6, 0x20, - 0x00, 0xd7, 0xb3, 0x64, 0x7b, 0xac, 0xc8, 0x1f, 0xf6, 0x21, - 0x45, 0x92, 0x8d, 0x5a, 0x3e, 0xe9, 0xf1, 0x26, 0x42, 0x95, - 0x8a, 0x5d, 0x39, 0xee, 0x07, 0xd0, 0xb4, 0x63, 0x7c, 0xab, - 0xcf, 0x18, 0xff, 0x28, 0x4c, 0x9b, 0x84, 0x53, 0x37, 0xe0, - 0x09, 0xde, 0xba, 0x6d, 0x72, 0xa5, 0xc1, 0x16, 0x0e, 0xd9, - 0xbd, 0x6a, 0x75, 0xa2, 0xc6, 0x11, 0xf8, 0x2f, 0x4b, 0x9c, - 0x83, 0x54, 0x30, 0xe7, 0xe3, 0x34, 0x50, 0x87, 0x98, 0x4f, - 0x2b, 0xfc, 0x15, 0xc2, 0xa6, 0x71, 0x6e, 0xb9, 0xdd, 0x0a, - 0x12, 0xc5, 0xa1, 0x76, 0x69, 0xbe, 0xda, 0x0d, 0xe4, 0x33, - 0x57, 0x80, 0x9f, 0x48, 0x2c, 0xfb, 0x1c, 0xcb, 0xaf, 0x78, - 0x67, 0xb0, 0xd4, 0x03, 0xea, 0x3d, 0x59, 0x8e, 0x91, 0x46, - 0x22, 0xf5, 0xed, 0x3a, 0x5e, 0x89, 0x96, 0x41, 0x25, 0xf2, - 0x1b, 0xcc, 0xa8, 0x7f, 0x60, 0xb7, 0xd3, 0x04, 0xdb, 0x0c, - 0x68, 0xbf, 0xa0, 0x77, 0x13, 0xc4, 0x2d, 0xfa, 0x9e, 0x49, - 0x56, 0x81, 0xe5, 0x32, 0x2a, 0xfd, 0x99, 0x4e, 0x51, 0x86, - 0xe2, 0x35, 0xdc, 0x0b, 0x6f, 0xb8, 0xa7, 0x70, 0x14, 0xc3, - 0x24, 0xf3, 0x97, 0x40, 0x5f, 0x88, 0xec, 0x3b, 0xd2, 0x05, - 0x61, 0xb6, 0xa9, 0x7e, 0x1a, 0xcd, 0xd5, 0x02, 0x66, 0xb1, - 0xae, 0x79, 0x1d, 0xca, 0x23, 0xf4, 0x90, 0x47, 0x58, 0x8f, - 0xeb, 0x3c, 0x38, 0xef, 0x8b, 0x5c, 0x43, 0x94, 0xf0, 0x27, - 0xce, 0x19, 0x7d, 0xaa, 0xb5, 0x62, 0x06, 0xd1, 0xc9, 0x1e, - 0x7a, 0xad, 0xb2, 0x65, 0x01, 0xd6, 0x3f, 0xe8, 0x8c, 0x5b, - 0x44, 0x93, 0xf7, 0x20, 0xc7, 0x10, 0x74, 0xa3, 0xbc, 0x6b, - 0x0f, 0xd8, 0x31, 0xe6, 0x82, 0x55, 0x4a, 0x9d, 0xf9, 0x2e, - 0x36, 0xe1, 0x85, 0x52, 0x4d, 0x9a, 0xfe, 0x29, 0xc0, 0x17, - 0x73, 0xa4, 0xbb, 0x6c, 0x08, 0xdf, 0x00, 0xd8, 0xad, 0x75, - 0x47, 0x9f, 0xea, 0x32, 0x8e, 0x56, 0x23, 0xfb, 0xc9, 0x11, - 0x64, 0xbc, 0x01, 0xd9, 0xac, 0x74, 0x46, 0x9e, 0xeb, 0x33, - 0x8f, 0x57, 0x22, 0xfa, 0xc8, 0x10, 0x65, 0xbd, 0x02, 0xda, - 0xaf, 0x77, 0x45, 0x9d, 0xe8, 0x30, 0x8c, 0x54, 0x21, 0xf9, - 0xcb, 0x13, 0x66, 0xbe, 0x03, 0xdb, 0xae, 0x76, 0x44, 0x9c, - 0xe9, 0x31, 0x8d, 0x55, 0x20, 0xf8, 0xca, 0x12, 0x67, 0xbf, - 0x04, 0xdc, 0xa9, 0x71, 0x43, 0x9b, 0xee, 0x36, 0x8a, 0x52, - 0x27, 0xff, 0xcd, 0x15, 0x60, 0xb8, 0x05, 0xdd, 0xa8, 0x70, - 0x42, 0x9a, 0xef, 0x37, 0x8b, 0x53, 0x26, 0xfe, 0xcc, 0x14, - 0x61, 0xb9, 0x06, 0xde, 0xab, 0x73, 0x41, 0x99, 0xec, 0x34, - 0x88, 0x50, 0x25, 0xfd, 0xcf, 0x17, 0x62, 0xba, 0x07, 0xdf, - 0xaa, 0x72, 0x40, 0x98, 0xed, 0x35, 0x89, 0x51, 0x24, 0xfc, - 0xce, 0x16, 0x63, 0xbb, 0x08, 0xd0, 0xa5, 0x7d, 0x4f, 0x97, - 0xe2, 0x3a, 0x86, 0x5e, 0x2b, 0xf3, 0xc1, 0x19, 0x6c, 0xb4, - 0x09, 0xd1, 0xa4, 0x7c, 0x4e, 0x96, 0xe3, 0x3b, 0x87, 0x5f, - 0x2a, 0xf2, 0xc0, 0x18, 0x6d, 0xb5, 0x0a, 0xd2, 0xa7, 0x7f, - 0x4d, 0x95, 0xe0, 0x38, 0x84, 0x5c, 0x29, 0xf1, 0xc3, 0x1b, - 0x6e, 0xb6, 0x0b, 0xd3, 0xa6, 0x7e, 0x4c, 0x94, 0xe1, 0x39, - 0x85, 0x5d, 0x28, 0xf0, 0xc2, 0x1a, 0x6f, 0xb7, 0x0c, 0xd4, - 0xa1, 0x79, 0x4b, 0x93, 0xe6, 0x3e, 0x82, 0x5a, 0x2f, 0xf7, - 0xc5, 0x1d, 0x68, 0xb0, 0x0d, 0xd5, 0xa0, 0x78, 0x4a, 0x92, - 0xe7, 0x3f, 0x83, 0x5b, 0x2e, 0xf6, 0xc4, 0x1c, 0x69, 0xb1, - 0x0e, 0xd6, 0xa3, 0x7b, 0x49, 0x91, 0xe4, 0x3c, 0x80, 0x58, - 0x2d, 0xf5, 0xc7, 0x1f, 0x6a, 0xb2, 0x0f, 0xd7, 0xa2, 0x7a, - 0x48, 0x90, 0xe5, 0x3d, 0x81, 0x59, 0x2c, 0xf4, 0xc6, 0x1e, - 0x6b, 0xb3, 0x00, 0xd9, 0xaf, 0x76, 0x43, 0x9a, 0xec, 0x35, - 0x86, 0x5f, 0x29, 0xf0, 0xc5, 0x1c, 0x6a, 0xb3, 0x11, 0xc8, - 0xbe, 0x67, 0x52, 0x8b, 0xfd, 0x24, 0x97, 0x4e, 0x38, 0xe1, - 0xd4, 0x0d, 0x7b, 0xa2, 0x22, 0xfb, 0x8d, 0x54, 0x61, 0xb8, - 0xce, 0x17, 0xa4, 0x7d, 0x0b, 0xd2, 0xe7, 0x3e, 0x48, 0x91, - 0x33, 0xea, 0x9c, 0x45, 0x70, 0xa9, 0xdf, 0x06, 0xb5, 0x6c, - 0x1a, 0xc3, 0xf6, 0x2f, 0x59, 0x80, 0x44, 0x9d, 0xeb, 0x32, - 0x07, 0xde, 0xa8, 0x71, 0xc2, 0x1b, 0x6d, 0xb4, 0x81, 0x58, - 0x2e, 0xf7, 0x55, 0x8c, 0xfa, 0x23, 0x16, 0xcf, 0xb9, 0x60, - 0xd3, 0x0a, 0x7c, 0xa5, 0x90, 0x49, 0x3f, 0xe6, 0x66, 0xbf, - 0xc9, 0x10, 0x25, 0xfc, 0x8a, 0x53, 0xe0, 0x39, 0x4f, 0x96, - 0xa3, 0x7a, 0x0c, 0xd5, 0x77, 0xae, 0xd8, 0x01, 0x34, 0xed, - 0x9b, 0x42, 0xf1, 0x28, 0x5e, 0x87, 0xb2, 0x6b, 0x1d, 0xc4, - 0x88, 0x51, 0x27, 0xfe, 0xcb, 0x12, 0x64, 0xbd, 0x0e, 0xd7, - 0xa1, 0x78, 0x4d, 0x94, 0xe2, 0x3b, 0x99, 0x40, 0x36, 0xef, - 0xda, 0x03, 0x75, 0xac, 0x1f, 0xc6, 0xb0, 0x69, 0x5c, 0x85, - 0xf3, 0x2a, 0xaa, 0x73, 0x05, 0xdc, 0xe9, 0x30, 0x46, 0x9f, - 0x2c, 0xf5, 0x83, 0x5a, 0x6f, 0xb6, 0xc0, 0x19, 0xbb, 0x62, - 0x14, 0xcd, 0xf8, 0x21, 0x57, 0x8e, 0x3d, 0xe4, 0x92, 0x4b, - 0x7e, 0xa7, 0xd1, 0x08, 0xcc, 0x15, 0x63, 0xba, 0x8f, 0x56, - 0x20, 0xf9, 0x4a, 0x93, 0xe5, 0x3c, 0x09, 0xd0, 0xa6, 0x7f, - 0xdd, 0x04, 0x72, 0xab, 0x9e, 0x47, 0x31, 0xe8, 0x5b, 0x82, - 0xf4, 0x2d, 0x18, 0xc1, 0xb7, 0x6e, 0xee, 0x37, 0x41, 0x98, - 0xad, 0x74, 0x02, 0xdb, 0x68, 0xb1, 0xc7, 0x1e, 0x2b, 0xf2, - 0x84, 0x5d, 0xff, 0x26, 0x50, 0x89, 0xbc, 0x65, 0x13, 0xca, - 0x79, 0xa0, 0xd6, 0x0f, 0x3a, 0xe3, 0x95, 0x4c, 0x00, 0xda, - 0xa9, 0x73, 0x4f, 0x95, 0xe6, 0x3c, 0x9e, 0x44, 0x37, 0xed, - 0xd1, 0x0b, 0x78, 0xa2, 0x21, 0xfb, 0x88, 0x52, 0x6e, 0xb4, - 0xc7, 0x1d, 0xbf, 0x65, 0x16, 0xcc, 0xf0, 0x2a, 0x59, 0x83, - 0x42, 0x98, 0xeb, 0x31, 0x0d, 0xd7, 0xa4, 0x7e, 0xdc, 0x06, - 0x75, 0xaf, 0x93, 0x49, 0x3a, 0xe0, 0x63, 0xb9, 0xca, 0x10, - 0x2c, 0xf6, 0x85, 0x5f, 0xfd, 0x27, 0x54, 0x8e, 0xb2, 0x68, - 0x1b, 0xc1, 0x84, 0x5e, 0x2d, 0xf7, 0xcb, 0x11, 0x62, 0xb8, - 0x1a, 0xc0, 0xb3, 0x69, 0x55, 0x8f, 0xfc, 0x26, 0xa5, 0x7f, - 0x0c, 0xd6, 0xea, 0x30, 0x43, 0x99, 0x3b, 0xe1, 0x92, 0x48, - 0x74, 0xae, 0xdd, 0x07, 0xc6, 0x1c, 0x6f, 0xb5, 0x89, 0x53, - 0x20, 0xfa, 0x58, 0x82, 0xf1, 0x2b, 0x17, 0xcd, 0xbe, 0x64, - 0xe7, 0x3d, 0x4e, 0x94, 0xa8, 0x72, 0x01, 0xdb, 0x79, 0xa3, - 0xd0, 0x0a, 0x36, 0xec, 0x9f, 0x45, 0x15, 0xcf, 0xbc, 0x66, - 0x5a, 0x80, 0xf3, 0x29, 0x8b, 0x51, 0x22, 0xf8, 0xc4, 0x1e, - 0x6d, 0xb7, 0x34, 0xee, 0x9d, 0x47, 0x7b, 0xa1, 0xd2, 0x08, - 0xaa, 0x70, 0x03, 0xd9, 0xe5, 0x3f, 0x4c, 0x96, 0x57, 0x8d, - 0xfe, 0x24, 0x18, 0xc2, 0xb1, 0x6b, 0xc9, 0x13, 0x60, 0xba, - 0x86, 0x5c, 0x2f, 0xf5, 0x76, 0xac, 0xdf, 0x05, 0x39, 0xe3, - 0x90, 0x4a, 0xe8, 0x32, 0x41, 0x9b, 0xa7, 0x7d, 0x0e, 0xd4, - 0x91, 0x4b, 0x38, 0xe2, 0xde, 0x04, 0x77, 0xad, 0x0f, 0xd5, - 0xa6, 0x7c, 0x40, 0x9a, 0xe9, 0x33, 0xb0, 0x6a, 0x19, 0xc3, - 0xff, 0x25, 0x56, 0x8c, 0x2e, 0xf4, 0x87, 0x5d, 0x61, 0xbb, - 0xc8, 0x12, 0xd3, 0x09, 0x7a, 0xa0, 0x9c, 0x46, 0x35, 0xef, - 0x4d, 0x97, 0xe4, 0x3e, 0x02, 0xd8, 0xab, 0x71, 0xf2, 0x28, - 0x5b, 0x81, 0xbd, 0x67, 0x14, 0xce, 0x6c, 0xb6, 0xc5, 0x1f, - 0x23, 0xf9, 0x8a, 0x50, 0x00, 0xdb, 0xab, 0x70, 0x4b, 0x90, - 0xe0, 0x3b, 0x96, 0x4d, 0x3d, 0xe6, 0xdd, 0x06, 0x76, 0xad, - 0x31, 0xea, 0x9a, 0x41, 0x7a, 0xa1, 0xd1, 0x0a, 0xa7, 0x7c, - 0x0c, 0xd7, 0xec, 0x37, 0x47, 0x9c, 0x62, 0xb9, 0xc9, 0x12, - 0x29, 0xf2, 0x82, 0x59, 0xf4, 0x2f, 0x5f, 0x84, 0xbf, 0x64, - 0x14, 0xcf, 0x53, 0x88, 0xf8, 0x23, 0x18, 0xc3, 0xb3, 0x68, - 0xc5, 0x1e, 0x6e, 0xb5, 0x8e, 0x55, 0x25, 0xfe, 0xc4, 0x1f, - 0x6f, 0xb4, 0x8f, 0x54, 0x24, 0xff, 0x52, 0x89, 0xf9, 0x22, - 0x19, 0xc2, 0xb2, 0x69, 0xf5, 0x2e, 0x5e, 0x85, 0xbe, 0x65, - 0x15, 0xce, 0x63, 0xb8, 0xc8, 0x13, 0x28, 0xf3, 0x83, 0x58, - 0xa6, 0x7d, 0x0d, 0xd6, 0xed, 0x36, 0x46, 0x9d, 0x30, 0xeb, - 0x9b, 0x40, 0x7b, 0xa0, 0xd0, 0x0b, 0x97, 0x4c, 0x3c, 0xe7, - 0xdc, 0x07, 0x77, 0xac, 0x01, 0xda, 0xaa, 0x71, 0x4a, 0x91, - 0xe1, 0x3a, 0x95, 0x4e, 0x3e, 0xe5, 0xde, 0x05, 0x75, 0xae, - 0x03, 0xd8, 0xa8, 0x73, 0x48, 0x93, 0xe3, 0x38, 0xa4, 0x7f, - 0x0f, 0xd4, 0xef, 0x34, 0x44, 0x9f, 0x32, 0xe9, 0x99, 0x42, - 0x79, 0xa2, 0xd2, 0x09, 0xf7, 0x2c, 0x5c, 0x87, 0xbc, 0x67, - 0x17, 0xcc, 0x61, 0xba, 0xca, 0x11, 0x2a, 0xf1, 0x81, 0x5a, - 0xc6, 0x1d, 0x6d, 0xb6, 0x8d, 0x56, 0x26, 0xfd, 0x50, 0x8b, - 0xfb, 0x20, 0x1b, 0xc0, 0xb0, 0x6b, 0x51, 0x8a, 0xfa, 0x21, - 0x1a, 0xc1, 0xb1, 0x6a, 0xc7, 0x1c, 0x6c, 0xb7, 0x8c, 0x57, - 0x27, 0xfc, 0x60, 0xbb, 0xcb, 0x10, 0x2b, 0xf0, 0x80, 0x5b, - 0xf6, 0x2d, 0x5d, 0x86, 0xbd, 0x66, 0x16, 0xcd, 0x33, 0xe8, - 0x98, 0x43, 0x78, 0xa3, 0xd3, 0x08, 0xa5, 0x7e, 0x0e, 0xd5, - 0xee, 0x35, 0x45, 0x9e, 0x02, 0xd9, 0xa9, 0x72, 0x49, 0x92, - 0xe2, 0x39, 0x94, 0x4f, 0x3f, 0xe4, 0xdf, 0x04, 0x74, 0xaf, - 0x00, 0xdc, 0xa5, 0x79, 0x57, 0x8b, 0xf2, 0x2e, 0xae, 0x72, - 0x0b, 0xd7, 0xf9, 0x25, 0x5c, 0x80, 0x41, 0x9d, 0xe4, 0x38, - 0x16, 0xca, 0xb3, 0x6f, 0xef, 0x33, 0x4a, 0x96, 0xb8, 0x64, - 0x1d, 0xc1, 0x82, 0x5e, 0x27, 0xfb, 0xd5, 0x09, 0x70, 0xac, - 0x2c, 0xf0, 0x89, 0x55, 0x7b, 0xa7, 0xde, 0x02, 0xc3, 0x1f, - 0x66, 0xba, 0x94, 0x48, 0x31, 0xed, 0x6d, 0xb1, 0xc8, 0x14, - 0x3a, 0xe6, 0x9f, 0x43, 0x19, 0xc5, 0xbc, 0x60, 0x4e, 0x92, - 0xeb, 0x37, 0xb7, 0x6b, 0x12, 0xce, 0xe0, 0x3c, 0x45, 0x99, - 0x58, 0x84, 0xfd, 0x21, 0x0f, 0xd3, 0xaa, 0x76, 0xf6, 0x2a, - 0x53, 0x8f, 0xa1, 0x7d, 0x04, 0xd8, 0x9b, 0x47, 0x3e, 0xe2, - 0xcc, 0x10, 0x69, 0xb5, 0x35, 0xe9, 0x90, 0x4c, 0x62, 0xbe, - 0xc7, 0x1b, 0xda, 0x06, 0x7f, 0xa3, 0x8d, 0x51, 0x28, 0xf4, - 0x74, 0xa8, 0xd1, 0x0d, 0x23, 0xff, 0x86, 0x5a, 0x32, 0xee, - 0x97, 0x4b, 0x65, 0xb9, 0xc0, 0x1c, 0x9c, 0x40, 0x39, 0xe5, - 0xcb, 0x17, 0x6e, 0xb2, 0x73, 0xaf, 0xd6, 0x0a, 0x24, 0xf8, - 0x81, 0x5d, 0xdd, 0x01, 0x78, 0xa4, 0x8a, 0x56, 0x2f, 0xf3, - 0xb0, 0x6c, 0x15, 0xc9, 0xe7, 0x3b, 0x42, 0x9e, 0x1e, 0xc2, - 0xbb, 0x67, 0x49, 0x95, 0xec, 0x30, 0xf1, 0x2d, 0x54, 0x88, - 0xa6, 0x7a, 0x03, 0xdf, 0x5f, 0x83, 0xfa, 0x26, 0x08, 0xd4, - 0xad, 0x71, 0x2b, 0xf7, 0x8e, 0x52, 0x7c, 0xa0, 0xd9, 0x05, - 0x85, 0x59, 0x20, 0xfc, 0xd2, 0x0e, 0x77, 0xab, 0x6a, 0xb6, - 0xcf, 0x13, 0x3d, 0xe1, 0x98, 0x44, 0xc4, 0x18, 0x61, 0xbd, - 0x93, 0x4f, 0x36, 0xea, 0xa9, 0x75, 0x0c, 0xd0, 0xfe, 0x22, - 0x5b, 0x87, 0x07, 0xdb, 0xa2, 0x7e, 0x50, 0x8c, 0xf5, 0x29, - 0xe8, 0x34, 0x4d, 0x91, 0xbf, 0x63, 0x1a, 0xc6, 0x46, 0x9a, - 0xe3, 0x3f, 0x11, 0xcd, 0xb4, 0x68, 0x00, 0xdd, 0xa7, 0x7a, - 0x53, 0x8e, 0xf4, 0x29, 0xa6, 0x7b, 0x01, 0xdc, 0xf5, 0x28, - 0x52, 0x8f, 0x51, 0x8c, 0xf6, 0x2b, 0x02, 0xdf, 0xa5, 0x78, - 0xf7, 0x2a, 0x50, 0x8d, 0xa4, 0x79, 0x03, 0xde, 0xa2, 0x7f, - 0x05, 0xd8, 0xf1, 0x2c, 0x56, 0x8b, 0x04, 0xd9, 0xa3, 0x7e, - 0x57, 0x8a, 0xf0, 0x2d, 0xf3, 0x2e, 0x54, 0x89, 0xa0, 0x7d, - 0x07, 0xda, 0x55, 0x88, 0xf2, 0x2f, 0x06, 0xdb, 0xa1, 0x7c, - 0x59, 0x84, 0xfe, 0x23, 0x0a, 0xd7, 0xad, 0x70, 0xff, 0x22, - 0x58, 0x85, 0xac, 0x71, 0x0b, 0xd6, 0x08, 0xd5, 0xaf, 0x72, - 0x5b, 0x86, 0xfc, 0x21, 0xae, 0x73, 0x09, 0xd4, 0xfd, 0x20, - 0x5a, 0x87, 0xfb, 0x26, 0x5c, 0x81, 0xa8, 0x75, 0x0f, 0xd2, - 0x5d, 0x80, 0xfa, 0x27, 0x0e, 0xd3, 0xa9, 0x74, 0xaa, 0x77, - 0x0d, 0xd0, 0xf9, 0x24, 0x5e, 0x83, 0x0c, 0xd1, 0xab, 0x76, - 0x5f, 0x82, 0xf8, 0x25, 0xb2, 0x6f, 0x15, 0xc8, 0xe1, 0x3c, - 0x46, 0x9b, 0x14, 0xc9, 0xb3, 0x6e, 0x47, 0x9a, 0xe0, 0x3d, - 0xe3, 0x3e, 0x44, 0x99, 0xb0, 0x6d, 0x17, 0xca, 0x45, 0x98, - 0xe2, 0x3f, 0x16, 0xcb, 0xb1, 0x6c, 0x10, 0xcd, 0xb7, 0x6a, - 0x43, 0x9e, 0xe4, 0x39, 0xb6, 0x6b, 0x11, 0xcc, 0xe5, 0x38, - 0x42, 0x9f, 0x41, 0x9c, 0xe6, 0x3b, 0x12, 0xcf, 0xb5, 0x68, - 0xe7, 0x3a, 0x40, 0x9d, 0xb4, 0x69, 0x13, 0xce, 0xeb, 0x36, - 0x4c, 0x91, 0xb8, 0x65, 0x1f, 0xc2, 0x4d, 0x90, 0xea, 0x37, - 0x1e, 0xc3, 0xb9, 0x64, 0xba, 0x67, 0x1d, 0xc0, 0xe9, 0x34, - 0x4e, 0x93, 0x1c, 0xc1, 0xbb, 0x66, 0x4f, 0x92, 0xe8, 0x35, - 0x49, 0x94, 0xee, 0x33, 0x1a, 0xc7, 0xbd, 0x60, 0xef, 0x32, - 0x48, 0x95, 0xbc, 0x61, 0x1b, 0xc6, 0x18, 0xc5, 0xbf, 0x62, - 0x4b, 0x96, 0xec, 0x31, 0xbe, 0x63, 0x19, 0xc4, 0xed, 0x30, - 0x4a, 0x97, 0x00, 0xde, 0xa1, 0x7f, 0x5f, 0x81, 0xfe, 0x20, - 0xbe, 0x60, 0x1f, 0xc1, 0xe1, 0x3f, 0x40, 0x9e, 0x61, 0xbf, - 0xc0, 0x1e, 0x3e, 0xe0, 0x9f, 0x41, 0xdf, 0x01, 0x7e, 0xa0, - 0x80, 0x5e, 0x21, 0xff, 0xc2, 0x1c, 0x63, 0xbd, 0x9d, 0x43, - 0x3c, 0xe2, 0x7c, 0xa2, 0xdd, 0x03, 0x23, 0xfd, 0x82, 0x5c, - 0xa3, 0x7d, 0x02, 0xdc, 0xfc, 0x22, 0x5d, 0x83, 0x1d, 0xc3, - 0xbc, 0x62, 0x42, 0x9c, 0xe3, 0x3d, 0x99, 0x47, 0x38, 0xe6, - 0xc6, 0x18, 0x67, 0xb9, 0x27, 0xf9, 0x86, 0x58, 0x78, 0xa6, - 0xd9, 0x07, 0xf8, 0x26, 0x59, 0x87, 0xa7, 0x79, 0x06, 0xd8, - 0x46, 0x98, 0xe7, 0x39, 0x19, 0xc7, 0xb8, 0x66, 0x5b, 0x85, - 0xfa, 0x24, 0x04, 0xda, 0xa5, 0x7b, 0xe5, 0x3b, 0x44, 0x9a, - 0xba, 0x64, 0x1b, 0xc5, 0x3a, 0xe4, 0x9b, 0x45, 0x65, 0xbb, - 0xc4, 0x1a, 0x84, 0x5a, 0x25, 0xfb, 0xdb, 0x05, 0x7a, 0xa4, - 0x2f, 0xf1, 0x8e, 0x50, 0x70, 0xae, 0xd1, 0x0f, 0x91, 0x4f, - 0x30, 0xee, 0xce, 0x10, 0x6f, 0xb1, 0x4e, 0x90, 0xef, 0x31, - 0x11, 0xcf, 0xb0, 0x6e, 0xf0, 0x2e, 0x51, 0x8f, 0xaf, 0x71, - 0x0e, 0xd0, 0xed, 0x33, 0x4c, 0x92, 0xb2, 0x6c, 0x13, 0xcd, - 0x53, 0x8d, 0xf2, 0x2c, 0x0c, 0xd2, 0xad, 0x73, 0x8c, 0x52, - 0x2d, 0xf3, 0xd3, 0x0d, 0x72, 0xac, 0x32, 0xec, 0x93, 0x4d, - 0x6d, 0xb3, 0xcc, 0x12, 0xb6, 0x68, 0x17, 0xc9, 0xe9, 0x37, - 0x48, 0x96, 0x08, 0xd6, 0xa9, 0x77, 0x57, 0x89, 0xf6, 0x28, - 0xd7, 0x09, 0x76, 0xa8, 0x88, 0x56, 0x29, 0xf7, 0x69, 0xb7, - 0xc8, 0x16, 0x36, 0xe8, 0x97, 0x49, 0x74, 0xaa, 0xd5, 0x0b, - 0x2b, 0xf5, 0x8a, 0x54, 0xca, 0x14, 0x6b, 0xb5, 0x95, 0x4b, - 0x34, 0xea, 0x15, 0xcb, 0xb4, 0x6a, 0x4a, 0x94, 0xeb, 0x35, - 0xab, 0x75, 0x0a, 0xd4, 0xf4, 0x2a, 0x55, 0x8b, 0x00, 0xdf, - 0xa3, 0x7c, 0x5b, 0x84, 0xf8, 0x27, 0xb6, 0x69, 0x15, 0xca, - 0xed, 0x32, 0x4e, 0x91, 0x71, 0xae, 0xd2, 0x0d, 0x2a, 0xf5, - 0x89, 0x56, 0xc7, 0x18, 0x64, 0xbb, 0x9c, 0x43, 0x3f, 0xe0, - 0xe2, 0x3d, 0x41, 0x9e, 0xb9, 0x66, 0x1a, 0xc5, 0x54, 0x8b, - 0xf7, 0x28, 0x0f, 0xd0, 0xac, 0x73, 0x93, 0x4c, 0x30, 0xef, - 0xc8, 0x17, 0x6b, 0xb4, 0x25, 0xfa, 0x86, 0x59, 0x7e, 0xa1, - 0xdd, 0x02, 0xd9, 0x06, 0x7a, 0xa5, 0x82, 0x5d, 0x21, 0xfe, - 0x6f, 0xb0, 0xcc, 0x13, 0x34, 0xeb, 0x97, 0x48, 0xa8, 0x77, - 0x0b, 0xd4, 0xf3, 0x2c, 0x50, 0x8f, 0x1e, 0xc1, 0xbd, 0x62, - 0x45, 0x9a, 0xe6, 0x39, 0x3b, 0xe4, 0x98, 0x47, 0x60, 0xbf, - 0xc3, 0x1c, 0x8d, 0x52, 0x2e, 0xf1, 0xd6, 0x09, 0x75, 0xaa, - 0x4a, 0x95, 0xe9, 0x36, 0x11, 0xce, 0xb2, 0x6d, 0xfc, 0x23, - 0x5f, 0x80, 0xa7, 0x78, 0x04, 0xdb, 0xaf, 0x70, 0x0c, 0xd3, - 0xf4, 0x2b, 0x57, 0x88, 0x19, 0xc6, 0xba, 0x65, 0x42, 0x9d, - 0xe1, 0x3e, 0xde, 0x01, 0x7d, 0xa2, 0x85, 0x5a, 0x26, 0xf9, - 0x68, 0xb7, 0xcb, 0x14, 0x33, 0xec, 0x90, 0x4f, 0x4d, 0x92, - 0xee, 0x31, 0x16, 0xc9, 0xb5, 0x6a, 0xfb, 0x24, 0x58, 0x87, - 0xa0, 0x7f, 0x03, 0xdc, 0x3c, 0xe3, 0x9f, 0x40, 0x67, 0xb8, - 0xc4, 0x1b, 0x8a, 0x55, 0x29, 0xf6, 0xd1, 0x0e, 0x72, 0xad, - 0x76, 0xa9, 0xd5, 0x0a, 0x2d, 0xf2, 0x8e, 0x51, 0xc0, 0x1f, - 0x63, 0xbc, 0x9b, 0x44, 0x38, 0xe7, 0x07, 0xd8, 0xa4, 0x7b, - 0x5c, 0x83, 0xff, 0x20, 0xb1, 0x6e, 0x12, 0xcd, 0xea, 0x35, - 0x49, 0x96, 0x94, 0x4b, 0x37, 0xe8, 0xcf, 0x10, 0x6c, 0xb3, - 0x22, 0xfd, 0x81, 0x5e, 0x79, 0xa6, 0xda, 0x05, 0xe5, 0x3a, - 0x46, 0x99, 0xbe, 0x61, 0x1d, 0xc2, 0x53, 0x8c, 0xf0, 0x2f, - 0x08, 0xd7, 0xab, 0x74, 0x00, 0xe0, 0xdd, 0x3d, 0xa7, 0x47, - 0x7a, 0x9a, 0x53, 0xb3, 0x8e, 0x6e, 0xf4, 0x14, 0x29, 0xc9, - 0xa6, 0x46, 0x7b, 0x9b, 0x01, 0xe1, 0xdc, 0x3c, 0xf5, 0x15, - 0x28, 0xc8, 0x52, 0xb2, 0x8f, 0x6f, 0x51, 0xb1, 0x8c, 0x6c, - 0xf6, 0x16, 0x2b, 0xcb, 0x02, 0xe2, 0xdf, 0x3f, 0xa5, 0x45, - 0x78, 0x98, 0xf7, 0x17, 0x2a, 0xca, 0x50, 0xb0, 0x8d, 0x6d, - 0xa4, 0x44, 0x79, 0x99, 0x03, 0xe3, 0xde, 0x3e, 0xa2, 0x42, - 0x7f, 0x9f, 0x05, 0xe5, 0xd8, 0x38, 0xf1, 0x11, 0x2c, 0xcc, - 0x56, 0xb6, 0x8b, 0x6b, 0x04, 0xe4, 0xd9, 0x39, 0xa3, 0x43, - 0x7e, 0x9e, 0x57, 0xb7, 0x8a, 0x6a, 0xf0, 0x10, 0x2d, 0xcd, - 0xf3, 0x13, 0x2e, 0xce, 0x54, 0xb4, 0x89, 0x69, 0xa0, 0x40, - 0x7d, 0x9d, 0x07, 0xe7, 0xda, 0x3a, 0x55, 0xb5, 0x88, 0x68, - 0xf2, 0x12, 0x2f, 0xcf, 0x06, 0xe6, 0xdb, 0x3b, 0xa1, 0x41, - 0x7c, 0x9c, 0x59, 0xb9, 0x84, 0x64, 0xfe, 0x1e, 0x23, 0xc3, - 0x0a, 0xea, 0xd7, 0x37, 0xad, 0x4d, 0x70, 0x90, 0xff, 0x1f, - 0x22, 0xc2, 0x58, 0xb8, 0x85, 0x65, 0xac, 0x4c, 0x71, 0x91, - 0x0b, 0xeb, 0xd6, 0x36, 0x08, 0xe8, 0xd5, 0x35, 0xaf, 0x4f, - 0x72, 0x92, 0x5b, 0xbb, 0x86, 0x66, 0xfc, 0x1c, 0x21, 0xc1, - 0xae, 0x4e, 0x73, 0x93, 0x09, 0xe9, 0xd4, 0x34, 0xfd, 0x1d, - 0x20, 0xc0, 0x5a, 0xba, 0x87, 0x67, 0xfb, 0x1b, 0x26, 0xc6, - 0x5c, 0xbc, 0x81, 0x61, 0xa8, 0x48, 0x75, 0x95, 0x0f, 0xef, - 0xd2, 0x32, 0x5d, 0xbd, 0x80, 0x60, 0xfa, 0x1a, 0x27, 0xc7, - 0x0e, 0xee, 0xd3, 0x33, 0xa9, 0x49, 0x74, 0x94, 0xaa, 0x4a, - 0x77, 0x97, 0x0d, 0xed, 0xd0, 0x30, 0xf9, 0x19, 0x24, 0xc4, - 0x5e, 0xbe, 0x83, 0x63, 0x0c, 0xec, 0xd1, 0x31, 0xab, 0x4b, - 0x76, 0x96, 0x5f, 0xbf, 0x82, 0x62, 0xf8, 0x18, 0x25, 0xc5, - 0x00, 0xe1, 0xdf, 0x3e, 0xa3, 0x42, 0x7c, 0x9d, 0x5b, 0xba, - 0x84, 0x65, 0xf8, 0x19, 0x27, 0xc6, 0xb6, 0x57, 0x69, 0x88, - 0x15, 0xf4, 0xca, 0x2b, 0xed, 0x0c, 0x32, 0xd3, 0x4e, 0xaf, - 0x91, 0x70, 0x71, 0x90, 0xae, 0x4f, 0xd2, 0x33, 0x0d, 0xec, - 0x2a, 0xcb, 0xf5, 0x14, 0x89, 0x68, 0x56, 0xb7, 0xc7, 0x26, - 0x18, 0xf9, 0x64, 0x85, 0xbb, 0x5a, 0x9c, 0x7d, 0x43, 0xa2, - 0x3f, 0xde, 0xe0, 0x01, 0xe2, 0x03, 0x3d, 0xdc, 0x41, 0xa0, - 0x9e, 0x7f, 0xb9, 0x58, 0x66, 0x87, 0x1a, 0xfb, 0xc5, 0x24, - 0x54, 0xb5, 0x8b, 0x6a, 0xf7, 0x16, 0x28, 0xc9, 0x0f, 0xee, - 0xd0, 0x31, 0xac, 0x4d, 0x73, 0x92, 0x93, 0x72, 0x4c, 0xad, - 0x30, 0xd1, 0xef, 0x0e, 0xc8, 0x29, 0x17, 0xf6, 0x6b, 0x8a, - 0xb4, 0x55, 0x25, 0xc4, 0xfa, 0x1b, 0x86, 0x67, 0x59, 0xb8, - 0x7e, 0x9f, 0xa1, 0x40, 0xdd, 0x3c, 0x02, 0xe3, 0xd9, 0x38, - 0x06, 0xe7, 0x7a, 0x9b, 0xa5, 0x44, 0x82, 0x63, 0x5d, 0xbc, - 0x21, 0xc0, 0xfe, 0x1f, 0x6f, 0x8e, 0xb0, 0x51, 0xcc, 0x2d, - 0x13, 0xf2, 0x34, 0xd5, 0xeb, 0x0a, 0x97, 0x76, 0x48, 0xa9, - 0xa8, 0x49, 0x77, 0x96, 0x0b, 0xea, 0xd4, 0x35, 0xf3, 0x12, - 0x2c, 0xcd, 0x50, 0xb1, 0x8f, 0x6e, 0x1e, 0xff, 0xc1, 0x20, - 0xbd, 0x5c, 0x62, 0x83, 0x45, 0xa4, 0x9a, 0x7b, 0xe6, 0x07, - 0x39, 0xd8, 0x3b, 0xda, 0xe4, 0x05, 0x98, 0x79, 0x47, 0xa6, - 0x60, 0x81, 0xbf, 0x5e, 0xc3, 0x22, 0x1c, 0xfd, 0x8d, 0x6c, - 0x52, 0xb3, 0x2e, 0xcf, 0xf1, 0x10, 0xd6, 0x37, 0x09, 0xe8, - 0x75, 0x94, 0xaa, 0x4b, 0x4a, 0xab, 0x95, 0x74, 0xe9, 0x08, - 0x36, 0xd7, 0x11, 0xf0, 0xce, 0x2f, 0xb2, 0x53, 0x6d, 0x8c, - 0xfc, 0x1d, 0x23, 0xc2, 0x5f, 0xbe, 0x80, 0x61, 0xa7, 0x46, - 0x78, 0x99, 0x04, 0xe5, 0xdb, 0x3a, 0x00, 0xe2, 0xd9, 0x3b, - 0xaf, 0x4d, 0x76, 0x94, 0x43, 0xa1, 0x9a, 0x78, 0xec, 0x0e, - 0x35, 0xd7, 0x86, 0x64, 0x5f, 0xbd, 0x29, 0xcb, 0xf0, 0x12, - 0xc5, 0x27, 0x1c, 0xfe, 0x6a, 0x88, 0xb3, 0x51, 0x11, 0xf3, - 0xc8, 0x2a, 0xbe, 0x5c, 0x67, 0x85, 0x52, 0xb0, 0x8b, 0x69, - 0xfd, 0x1f, 0x24, 0xc6, 0x97, 0x75, 0x4e, 0xac, 0x38, 0xda, - 0xe1, 0x03, 0xd4, 0x36, 0x0d, 0xef, 0x7b, 0x99, 0xa2, 0x40, - 0x22, 0xc0, 0xfb, 0x19, 0x8d, 0x6f, 0x54, 0xb6, 0x61, 0x83, - 0xb8, 0x5a, 0xce, 0x2c, 0x17, 0xf5, 0xa4, 0x46, 0x7d, 0x9f, - 0x0b, 0xe9, 0xd2, 0x30, 0xe7, 0x05, 0x3e, 0xdc, 0x48, 0xaa, - 0x91, 0x73, 0x33, 0xd1, 0xea, 0x08, 0x9c, 0x7e, 0x45, 0xa7, - 0x70, 0x92, 0xa9, 0x4b, 0xdf, 0x3d, 0x06, 0xe4, 0xb5, 0x57, - 0x6c, 0x8e, 0x1a, 0xf8, 0xc3, 0x21, 0xf6, 0x14, 0x2f, 0xcd, - 0x59, 0xbb, 0x80, 0x62, 0x44, 0xa6, 0x9d, 0x7f, 0xeb, 0x09, - 0x32, 0xd0, 0x07, 0xe5, 0xde, 0x3c, 0xa8, 0x4a, 0x71, 0x93, - 0xc2, 0x20, 0x1b, 0xf9, 0x6d, 0x8f, 0xb4, 0x56, 0x81, 0x63, - 0x58, 0xba, 0x2e, 0xcc, 0xf7, 0x15, 0x55, 0xb7, 0x8c, 0x6e, - 0xfa, 0x18, 0x23, 0xc1, 0x16, 0xf4, 0xcf, 0x2d, 0xb9, 0x5b, - 0x60, 0x82, 0xd3, 0x31, 0x0a, 0xe8, 0x7c, 0x9e, 0xa5, 0x47, - 0x90, 0x72, 0x49, 0xab, 0x3f, 0xdd, 0xe6, 0x04, 0x66, 0x84, - 0xbf, 0x5d, 0xc9, 0x2b, 0x10, 0xf2, 0x25, 0xc7, 0xfc, 0x1e, - 0x8a, 0x68, 0x53, 0xb1, 0xe0, 0x02, 0x39, 0xdb, 0x4f, 0xad, - 0x96, 0x74, 0xa3, 0x41, 0x7a, 0x98, 0x0c, 0xee, 0xd5, 0x37, - 0x77, 0x95, 0xae, 0x4c, 0xd8, 0x3a, 0x01, 0xe3, 0x34, 0xd6, - 0xed, 0x0f, 0x9b, 0x79, 0x42, 0xa0, 0xf1, 0x13, 0x28, 0xca, - 0x5e, 0xbc, 0x87, 0x65, 0xb2, 0x50, 0x6b, 0x89, 0x1d, 0xff, - 0xc4, 0x26, 0x00, 0xe3, 0xdb, 0x38, 0xab, 0x48, 0x70, 0x93, - 0x4b, 0xa8, 0x90, 0x73, 0xe0, 0x03, 0x3b, 0xd8, 0x96, 0x75, - 0x4d, 0xae, 0x3d, 0xde, 0xe6, 0x05, 0xdd, 0x3e, 0x06, 0xe5, - 0x76, 0x95, 0xad, 0x4e, 0x31, 0xd2, 0xea, 0x09, 0x9a, 0x79, - 0x41, 0xa2, 0x7a, 0x99, 0xa1, 0x42, 0xd1, 0x32, 0x0a, 0xe9, - 0xa7, 0x44, 0x7c, 0x9f, 0x0c, 0xef, 0xd7, 0x34, 0xec, 0x0f, - 0x37, 0xd4, 0x47, 0xa4, 0x9c, 0x7f, 0x62, 0x81, 0xb9, 0x5a, - 0xc9, 0x2a, 0x12, 0xf1, 0x29, 0xca, 0xf2, 0x11, 0x82, 0x61, - 0x59, 0xba, 0xf4, 0x17, 0x2f, 0xcc, 0x5f, 0xbc, 0x84, 0x67, - 0xbf, 0x5c, 0x64, 0x87, 0x14, 0xf7, 0xcf, 0x2c, 0x53, 0xb0, - 0x88, 0x6b, 0xf8, 0x1b, 0x23, 0xc0, 0x18, 0xfb, 0xc3, 0x20, - 0xb3, 0x50, 0x68, 0x8b, 0xc5, 0x26, 0x1e, 0xfd, 0x6e, 0x8d, - 0xb5, 0x56, 0x8e, 0x6d, 0x55, 0xb6, 0x25, 0xc6, 0xfe, 0x1d, - 0xc4, 0x27, 0x1f, 0xfc, 0x6f, 0x8c, 0xb4, 0x57, 0x8f, 0x6c, - 0x54, 0xb7, 0x24, 0xc7, 0xff, 0x1c, 0x52, 0xb1, 0x89, 0x6a, - 0xf9, 0x1a, 0x22, 0xc1, 0x19, 0xfa, 0xc2, 0x21, 0xb2, 0x51, - 0x69, 0x8a, 0xf5, 0x16, 0x2e, 0xcd, 0x5e, 0xbd, 0x85, 0x66, - 0xbe, 0x5d, 0x65, 0x86, 0x15, 0xf6, 0xce, 0x2d, 0x63, 0x80, - 0xb8, 0x5b, 0xc8, 0x2b, 0x13, 0xf0, 0x28, 0xcb, 0xf3, 0x10, - 0x83, 0x60, 0x58, 0xbb, 0xa6, 0x45, 0x7d, 0x9e, 0x0d, 0xee, - 0xd6, 0x35, 0xed, 0x0e, 0x36, 0xd5, 0x46, 0xa5, 0x9d, 0x7e, - 0x30, 0xd3, 0xeb, 0x08, 0x9b, 0x78, 0x40, 0xa3, 0x7b, 0x98, - 0xa0, 0x43, 0xd0, 0x33, 0x0b, 0xe8, 0x97, 0x74, 0x4c, 0xaf, - 0x3c, 0xdf, 0xe7, 0x04, 0xdc, 0x3f, 0x07, 0xe4, 0x77, 0x94, - 0xac, 0x4f, 0x01, 0xe2, 0xda, 0x39, 0xaa, 0x49, 0x71, 0x92, - 0x4a, 0xa9, 0x91, 0x72, 0xe1, 0x02, 0x3a, 0xd9, 0x00, 0xe4, - 0xd5, 0x31, 0xb7, 0x53, 0x62, 0x86, 0x73, 0x97, 0xa6, 0x42, - 0xc4, 0x20, 0x11, 0xf5, 0xe6, 0x02, 0x33, 0xd7, 0x51, 0xb5, - 0x84, 0x60, 0x95, 0x71, 0x40, 0xa4, 0x22, 0xc6, 0xf7, 0x13, - 0xd1, 0x35, 0x04, 0xe0, 0x66, 0x82, 0xb3, 0x57, 0xa2, 0x46, - 0x77, 0x93, 0x15, 0xf1, 0xc0, 0x24, 0x37, 0xd3, 0xe2, 0x06, - 0x80, 0x64, 0x55, 0xb1, 0x44, 0xa0, 0x91, 0x75, 0xf3, 0x17, - 0x26, 0xc2, 0xbf, 0x5b, 0x6a, 0x8e, 0x08, 0xec, 0xdd, 0x39, - 0xcc, 0x28, 0x19, 0xfd, 0x7b, 0x9f, 0xae, 0x4a, 0x59, 0xbd, - 0x8c, 0x68, 0xee, 0x0a, 0x3b, 0xdf, 0x2a, 0xce, 0xff, 0x1b, - 0x9d, 0x79, 0x48, 0xac, 0x6e, 0x8a, 0xbb, 0x5f, 0xd9, 0x3d, - 0x0c, 0xe8, 0x1d, 0xf9, 0xc8, 0x2c, 0xaa, 0x4e, 0x7f, 0x9b, - 0x88, 0x6c, 0x5d, 0xb9, 0x3f, 0xdb, 0xea, 0x0e, 0xfb, 0x1f, - 0x2e, 0xca, 0x4c, 0xa8, 0x99, 0x7d, 0x63, 0x87, 0xb6, 0x52, - 0xd4, 0x30, 0x01, 0xe5, 0x10, 0xf4, 0xc5, 0x21, 0xa7, 0x43, - 0x72, 0x96, 0x85, 0x61, 0x50, 0xb4, 0x32, 0xd6, 0xe7, 0x03, - 0xf6, 0x12, 0x23, 0xc7, 0x41, 0xa5, 0x94, 0x70, 0xb2, 0x56, - 0x67, 0x83, 0x05, 0xe1, 0xd0, 0x34, 0xc1, 0x25, 0x14, 0xf0, - 0x76, 0x92, 0xa3, 0x47, 0x54, 0xb0, 0x81, 0x65, 0xe3, 0x07, - 0x36, 0xd2, 0x27, 0xc3, 0xf2, 0x16, 0x90, 0x74, 0x45, 0xa1, - 0xdc, 0x38, 0x09, 0xed, 0x6b, 0x8f, 0xbe, 0x5a, 0xaf, 0x4b, - 0x7a, 0x9e, 0x18, 0xfc, 0xcd, 0x29, 0x3a, 0xde, 0xef, 0x0b, - 0x8d, 0x69, 0x58, 0xbc, 0x49, 0xad, 0x9c, 0x78, 0xfe, 0x1a, - 0x2b, 0xcf, 0x0d, 0xe9, 0xd8, 0x3c, 0xba, 0x5e, 0x6f, 0x8b, - 0x7e, 0x9a, 0xab, 0x4f, 0xc9, 0x2d, 0x1c, 0xf8, 0xeb, 0x0f, - 0x3e, 0xda, 0x5c, 0xb8, 0x89, 0x6d, 0x98, 0x7c, 0x4d, 0xa9, - 0x2f, 0xcb, 0xfa, 0x1e, 0x00, 0xe5, 0xd7, 0x32, 0xb3, 0x56, - 0x64, 0x81, 0x7b, 0x9e, 0xac, 0x49, 0xc8, 0x2d, 0x1f, 0xfa, - 0xf6, 0x13, 0x21, 0xc4, 0x45, 0xa0, 0x92, 0x77, 0x8d, 0x68, - 0x5a, 0xbf, 0x3e, 0xdb, 0xe9, 0x0c, 0xf1, 0x14, 0x26, 0xc3, - 0x42, 0xa7, 0x95, 0x70, 0x8a, 0x6f, 0x5d, 0xb8, 0x39, 0xdc, - 0xee, 0x0b, 0x07, 0xe2, 0xd0, 0x35, 0xb4, 0x51, 0x63, 0x86, - 0x7c, 0x99, 0xab, 0x4e, 0xcf, 0x2a, 0x18, 0xfd, 0xff, 0x1a, - 0x28, 0xcd, 0x4c, 0xa9, 0x9b, 0x7e, 0x84, 0x61, 0x53, 0xb6, - 0x37, 0xd2, 0xe0, 0x05, 0x09, 0xec, 0xde, 0x3b, 0xba, 0x5f, - 0x6d, 0x88, 0x72, 0x97, 0xa5, 0x40, 0xc1, 0x24, 0x16, 0xf3, - 0x0e, 0xeb, 0xd9, 0x3c, 0xbd, 0x58, 0x6a, 0x8f, 0x75, 0x90, - 0xa2, 0x47, 0xc6, 0x23, 0x11, 0xf4, 0xf8, 0x1d, 0x2f, 0xca, - 0x4b, 0xae, 0x9c, 0x79, 0x83, 0x66, 0x54, 0xb1, 0x30, 0xd5, - 0xe7, 0x02, 0xe3, 0x06, 0x34, 0xd1, 0x50, 0xb5, 0x87, 0x62, - 0x98, 0x7d, 0x4f, 0xaa, 0x2b, 0xce, 0xfc, 0x19, 0x15, 0xf0, - 0xc2, 0x27, 0xa6, 0x43, 0x71, 0x94, 0x6e, 0x8b, 0xb9, 0x5c, - 0xdd, 0x38, 0x0a, 0xef, 0x12, 0xf7, 0xc5, 0x20, 0xa1, 0x44, - 0x76, 0x93, 0x69, 0x8c, 0xbe, 0x5b, 0xda, 0x3f, 0x0d, 0xe8, - 0xe4, 0x01, 0x33, 0xd6, 0x57, 0xb2, 0x80, 0x65, 0x9f, 0x7a, - 0x48, 0xad, 0x2c, 0xc9, 0xfb, 0x1e, 0x1c, 0xf9, 0xcb, 0x2e, - 0xaf, 0x4a, 0x78, 0x9d, 0x67, 0x82, 0xb0, 0x55, 0xd4, 0x31, - 0x03, 0xe6, 0xea, 0x0f, 0x3d, 0xd8, 0x59, 0xbc, 0x8e, 0x6b, - 0x91, 0x74, 0x46, 0xa3, 0x22, 0xc7, 0xf5, 0x10, 0xed, 0x08, - 0x3a, 0xdf, 0x5e, 0xbb, 0x89, 0x6c, 0x96, 0x73, 0x41, 0xa4, - 0x25, 0xc0, 0xf2, 0x17, 0x1b, 0xfe, 0xcc, 0x29, 0xa8, 0x4d, - 0x7f, 0x9a, 0x60, 0x85, 0xb7, 0x52, 0xd3, 0x36, 0x04, 0xe1, - 0x00, 0xe6, 0xd1, 0x37, 0xbf, 0x59, 0x6e, 0x88, 0x63, 0x85, - 0xb2, 0x54, 0xdc, 0x3a, 0x0d, 0xeb, 0xc6, 0x20, 0x17, 0xf1, - 0x79, 0x9f, 0xa8, 0x4e, 0xa5, 0x43, 0x74, 0x92, 0x1a, 0xfc, - 0xcb, 0x2d, 0x91, 0x77, 0x40, 0xa6, 0x2e, 0xc8, 0xff, 0x19, - 0xf2, 0x14, 0x23, 0xc5, 0x4d, 0xab, 0x9c, 0x7a, 0x57, 0xb1, - 0x86, 0x60, 0xe8, 0x0e, 0x39, 0xdf, 0x34, 0xd2, 0xe5, 0x03, - 0x8b, 0x6d, 0x5a, 0xbc, 0x3f, 0xd9, 0xee, 0x08, 0x80, 0x66, - 0x51, 0xb7, 0x5c, 0xba, 0x8d, 0x6b, 0xe3, 0x05, 0x32, 0xd4, - 0xf9, 0x1f, 0x28, 0xce, 0x46, 0xa0, 0x97, 0x71, 0x9a, 0x7c, - 0x4b, 0xad, 0x25, 0xc3, 0xf4, 0x12, 0xae, 0x48, 0x7f, 0x99, - 0x11, 0xf7, 0xc0, 0x26, 0xcd, 0x2b, 0x1c, 0xfa, 0x72, 0x94, - 0xa3, 0x45, 0x68, 0x8e, 0xb9, 0x5f, 0xd7, 0x31, 0x06, 0xe0, - 0x0b, 0xed, 0xda, 0x3c, 0xb4, 0x52, 0x65, 0x83, 0x7e, 0x98, - 0xaf, 0x49, 0xc1, 0x27, 0x10, 0xf6, 0x1d, 0xfb, 0xcc, 0x2a, - 0xa2, 0x44, 0x73, 0x95, 0xb8, 0x5e, 0x69, 0x8f, 0x07, 0xe1, - 0xd6, 0x30, 0xdb, 0x3d, 0x0a, 0xec, 0x64, 0x82, 0xb5, 0x53, - 0xef, 0x09, 0x3e, 0xd8, 0x50, 0xb6, 0x81, 0x67, 0x8c, 0x6a, - 0x5d, 0xbb, 0x33, 0xd5, 0xe2, 0x04, 0x29, 0xcf, 0xf8, 0x1e, - 0x96, 0x70, 0x47, 0xa1, 0x4a, 0xac, 0x9b, 0x7d, 0xf5, 0x13, - 0x24, 0xc2, 0x41, 0xa7, 0x90, 0x76, 0xfe, 0x18, 0x2f, 0xc9, - 0x22, 0xc4, 0xf3, 0x15, 0x9d, 0x7b, 0x4c, 0xaa, 0x87, 0x61, - 0x56, 0xb0, 0x38, 0xde, 0xe9, 0x0f, 0xe4, 0x02, 0x35, 0xd3, - 0x5b, 0xbd, 0x8a, 0x6c, 0xd0, 0x36, 0x01, 0xe7, 0x6f, 0x89, - 0xbe, 0x58, 0xb3, 0x55, 0x62, 0x84, 0x0c, 0xea, 0xdd, 0x3b, - 0x16, 0xf0, 0xc7, 0x21, 0xa9, 0x4f, 0x78, 0x9e, 0x75, 0x93, - 0xa4, 0x42, 0xca, 0x2c, 0x1b, 0xfd, 0x00, 0xe7, 0xd3, 0x34, - 0xbb, 0x5c, 0x68, 0x8f, 0x6b, 0x8c, 0xb8, 0x5f, 0xd0, 0x37, - 0x03, 0xe4, 0xd6, 0x31, 0x05, 0xe2, 0x6d, 0x8a, 0xbe, 0x59, - 0xbd, 0x5a, 0x6e, 0x89, 0x06, 0xe1, 0xd5, 0x32, 0xb1, 0x56, - 0x62, 0x85, 0x0a, 0xed, 0xd9, 0x3e, 0xda, 0x3d, 0x09, 0xee, - 0x61, 0x86, 0xb2, 0x55, 0x67, 0x80, 0xb4, 0x53, 0xdc, 0x3b, - 0x0f, 0xe8, 0x0c, 0xeb, 0xdf, 0x38, 0xb7, 0x50, 0x64, 0x83, - 0x7f, 0x98, 0xac, 0x4b, 0xc4, 0x23, 0x17, 0xf0, 0x14, 0xf3, - 0xc7, 0x20, 0xaf, 0x48, 0x7c, 0x9b, 0xa9, 0x4e, 0x7a, 0x9d, - 0x12, 0xf5, 0xc1, 0x26, 0xc2, 0x25, 0x11, 0xf6, 0x79, 0x9e, - 0xaa, 0x4d, 0xce, 0x29, 0x1d, 0xfa, 0x75, 0x92, 0xa6, 0x41, - 0xa5, 0x42, 0x76, 0x91, 0x1e, 0xf9, 0xcd, 0x2a, 0x18, 0xff, - 0xcb, 0x2c, 0xa3, 0x44, 0x70, 0x97, 0x73, 0x94, 0xa0, 0x47, - 0xc8, 0x2f, 0x1b, 0xfc, 0xfe, 0x19, 0x2d, 0xca, 0x45, 0xa2, - 0x96, 0x71, 0x95, 0x72, 0x46, 0xa1, 0x2e, 0xc9, 0xfd, 0x1a, - 0x28, 0xcf, 0xfb, 0x1c, 0x93, 0x74, 0x40, 0xa7, 0x43, 0xa4, - 0x90, 0x77, 0xf8, 0x1f, 0x2b, 0xcc, 0x4f, 0xa8, 0x9c, 0x7b, - 0xf4, 0x13, 0x27, 0xc0, 0x24, 0xc3, 0xf7, 0x10, 0x9f, 0x78, - 0x4c, 0xab, 0x99, 0x7e, 0x4a, 0xad, 0x22, 0xc5, 0xf1, 0x16, - 0xf2, 0x15, 0x21, 0xc6, 0x49, 0xae, 0x9a, 0x7d, 0x81, 0x66, - 0x52, 0xb5, 0x3a, 0xdd, 0xe9, 0x0e, 0xea, 0x0d, 0x39, 0xde, - 0x51, 0xb6, 0x82, 0x65, 0x57, 0xb0, 0x84, 0x63, 0xec, 0x0b, - 0x3f, 0xd8, 0x3c, 0xdb, 0xef, 0x08, 0x87, 0x60, 0x54, 0xb3, - 0x30, 0xd7, 0xe3, 0x04, 0x8b, 0x6c, 0x58, 0xbf, 0x5b, 0xbc, - 0x88, 0x6f, 0xe0, 0x07, 0x33, 0xd4, 0xe6, 0x01, 0x35, 0xd2, - 0x5d, 0xba, 0x8e, 0x69, 0x8d, 0x6a, 0x5e, 0xb9, 0x36, 0xd1, - 0xe5, 0x02, 0x00, 0xe8, 0xcd, 0x25, 0x87, 0x6f, 0x4a, 0xa2, - 0x13, 0xfb, 0xde, 0x36, 0x94, 0x7c, 0x59, 0xb1, 0x26, 0xce, - 0xeb, 0x03, 0xa1, 0x49, 0x6c, 0x84, 0x35, 0xdd, 0xf8, 0x10, - 0xb2, 0x5a, 0x7f, 0x97, 0x4c, 0xa4, 0x81, 0x69, 0xcb, 0x23, - 0x06, 0xee, 0x5f, 0xb7, 0x92, 0x7a, 0xd8, 0x30, 0x15, 0xfd, - 0x6a, 0x82, 0xa7, 0x4f, 0xed, 0x05, 0x20, 0xc8, 0x79, 0x91, - 0xb4, 0x5c, 0xfe, 0x16, 0x33, 0xdb, 0x98, 0x70, 0x55, 0xbd, - 0x1f, 0xf7, 0xd2, 0x3a, 0x8b, 0x63, 0x46, 0xae, 0x0c, 0xe4, - 0xc1, 0x29, 0xbe, 0x56, 0x73, 0x9b, 0x39, 0xd1, 0xf4, 0x1c, - 0xad, 0x45, 0x60, 0x88, 0x2a, 0xc2, 0xe7, 0x0f, 0xd4, 0x3c, - 0x19, 0xf1, 0x53, 0xbb, 0x9e, 0x76, 0xc7, 0x2f, 0x0a, 0xe2, - 0x40, 0xa8, 0x8d, 0x65, 0xf2, 0x1a, 0x3f, 0xd7, 0x75, 0x9d, - 0xb8, 0x50, 0xe1, 0x09, 0x2c, 0xc4, 0x66, 0x8e, 0xab, 0x43, - 0x2d, 0xc5, 0xe0, 0x08, 0xaa, 0x42, 0x67, 0x8f, 0x3e, 0xd6, - 0xf3, 0x1b, 0xb9, 0x51, 0x74, 0x9c, 0x0b, 0xe3, 0xc6, 0x2e, - 0x8c, 0x64, 0x41, 0xa9, 0x18, 0xf0, 0xd5, 0x3d, 0x9f, 0x77, - 0x52, 0xba, 0x61, 0x89, 0xac, 0x44, 0xe6, 0x0e, 0x2b, 0xc3, - 0x72, 0x9a, 0xbf, 0x57, 0xf5, 0x1d, 0x38, 0xd0, 0x47, 0xaf, - 0x8a, 0x62, 0xc0, 0x28, 0x0d, 0xe5, 0x54, 0xbc, 0x99, 0x71, - 0xd3, 0x3b, 0x1e, 0xf6, 0xb5, 0x5d, 0x78, 0x90, 0x32, 0xda, - 0xff, 0x17, 0xa6, 0x4e, 0x6b, 0x83, 0x21, 0xc9, 0xec, 0x04, - 0x93, 0x7b, 0x5e, 0xb6, 0x14, 0xfc, 0xd9, 0x31, 0x80, 0x68, - 0x4d, 0xa5, 0x07, 0xef, 0xca, 0x22, 0xf9, 0x11, 0x34, 0xdc, - 0x7e, 0x96, 0xb3, 0x5b, 0xea, 0x02, 0x27, 0xcf, 0x6d, 0x85, - 0xa0, 0x48, 0xdf, 0x37, 0x12, 0xfa, 0x58, 0xb0, 0x95, 0x7d, - 0xcc, 0x24, 0x01, 0xe9, 0x4b, 0xa3, 0x86, 0x6e, 0x00, 0xe9, - 0xcf, 0x26, 0x83, 0x6a, 0x4c, 0xa5, 0x1b, 0xf2, 0xd4, 0x3d, - 0x98, 0x71, 0x57, 0xbe, 0x36, 0xdf, 0xf9, 0x10, 0xb5, 0x5c, - 0x7a, 0x93, 0x2d, 0xc4, 0xe2, 0x0b, 0xae, 0x47, 0x61, 0x88, - 0x6c, 0x85, 0xa3, 0x4a, 0xef, 0x06, 0x20, 0xc9, 0x77, 0x9e, - 0xb8, 0x51, 0xf4, 0x1d, 0x3b, 0xd2, 0x5a, 0xb3, 0x95, 0x7c, - 0xd9, 0x30, 0x16, 0xff, 0x41, 0xa8, 0x8e, 0x67, 0xc2, 0x2b, - 0x0d, 0xe4, 0xd8, 0x31, 0x17, 0xfe, 0x5b, 0xb2, 0x94, 0x7d, - 0xc3, 0x2a, 0x0c, 0xe5, 0x40, 0xa9, 0x8f, 0x66, 0xee, 0x07, - 0x21, 0xc8, 0x6d, 0x84, 0xa2, 0x4b, 0xf5, 0x1c, 0x3a, 0xd3, - 0x76, 0x9f, 0xb9, 0x50, 0xb4, 0x5d, 0x7b, 0x92, 0x37, 0xde, - 0xf8, 0x11, 0xaf, 0x46, 0x60, 0x89, 0x2c, 0xc5, 0xe3, 0x0a, - 0x82, 0x6b, 0x4d, 0xa4, 0x01, 0xe8, 0xce, 0x27, 0x99, 0x70, - 0x56, 0xbf, 0x1a, 0xf3, 0xd5, 0x3c, 0xad, 0x44, 0x62, 0x8b, - 0x2e, 0xc7, 0xe1, 0x08, 0xb6, 0x5f, 0x79, 0x90, 0x35, 0xdc, - 0xfa, 0x13, 0x9b, 0x72, 0x54, 0xbd, 0x18, 0xf1, 0xd7, 0x3e, - 0x80, 0x69, 0x4f, 0xa6, 0x03, 0xea, 0xcc, 0x25, 0xc1, 0x28, - 0x0e, 0xe7, 0x42, 0xab, 0x8d, 0x64, 0xda, 0x33, 0x15, 0xfc, - 0x59, 0xb0, 0x96, 0x7f, 0xf7, 0x1e, 0x38, 0xd1, 0x74, 0x9d, - 0xbb, 0x52, 0xec, 0x05, 0x23, 0xca, 0x6f, 0x86, 0xa0, 0x49, - 0x75, 0x9c, 0xba, 0x53, 0xf6, 0x1f, 0x39, 0xd0, 0x6e, 0x87, - 0xa1, 0x48, 0xed, 0x04, 0x22, 0xcb, 0x43, 0xaa, 0x8c, 0x65, - 0xc0, 0x29, 0x0f, 0xe6, 0x58, 0xb1, 0x97, 0x7e, 0xdb, 0x32, - 0x14, 0xfd, 0x19, 0xf0, 0xd6, 0x3f, 0x9a, 0x73, 0x55, 0xbc, - 0x02, 0xeb, 0xcd, 0x24, 0x81, 0x68, 0x4e, 0xa7, 0x2f, 0xc6, - 0xe0, 0x09, 0xac, 0x45, 0x63, 0x8a, 0x34, 0xdd, 0xfb, 0x12, - 0xb7, 0x5e, 0x78, 0x91, 0x00, 0xea, 0xc9, 0x23, 0x8f, 0x65, - 0x46, 0xac, 0x03, 0xe9, 0xca, 0x20, 0x8c, 0x66, 0x45, 0xaf, - 0x06, 0xec, 0xcf, 0x25, 0x89, 0x63, 0x40, 0xaa, 0x05, 0xef, - 0xcc, 0x26, 0x8a, 0x60, 0x43, 0xa9, 0x0c, 0xe6, 0xc5, 0x2f, - 0x83, 0x69, 0x4a, 0xa0, 0x0f, 0xe5, 0xc6, 0x2c, 0x80, 0x6a, - 0x49, 0xa3, 0x0a, 0xe0, 0xc3, 0x29, 0x85, 0x6f, 0x4c, 0xa6, - 0x09, 0xe3, 0xc0, 0x2a, 0x86, 0x6c, 0x4f, 0xa5, 0x18, 0xf2, - 0xd1, 0x3b, 0x97, 0x7d, 0x5e, 0xb4, 0x1b, 0xf1, 0xd2, 0x38, - 0x94, 0x7e, 0x5d, 0xb7, 0x1e, 0xf4, 0xd7, 0x3d, 0x91, 0x7b, - 0x58, 0xb2, 0x1d, 0xf7, 0xd4, 0x3e, 0x92, 0x78, 0x5b, 0xb1, - 0x14, 0xfe, 0xdd, 0x37, 0x9b, 0x71, 0x52, 0xb8, 0x17, 0xfd, - 0xde, 0x34, 0x98, 0x72, 0x51, 0xbb, 0x12, 0xf8, 0xdb, 0x31, - 0x9d, 0x77, 0x54, 0xbe, 0x11, 0xfb, 0xd8, 0x32, 0x9e, 0x74, - 0x57, 0xbd, 0x30, 0xda, 0xf9, 0x13, 0xbf, 0x55, 0x76, 0x9c, - 0x33, 0xd9, 0xfa, 0x10, 0xbc, 0x56, 0x75, 0x9f, 0x36, 0xdc, - 0xff, 0x15, 0xb9, 0x53, 0x70, 0x9a, 0x35, 0xdf, 0xfc, 0x16, - 0xba, 0x50, 0x73, 0x99, 0x3c, 0xd6, 0xf5, 0x1f, 0xb3, 0x59, - 0x7a, 0x90, 0x3f, 0xd5, 0xf6, 0x1c, 0xb0, 0x5a, 0x79, 0x93, - 0x3a, 0xd0, 0xf3, 0x19, 0xb5, 0x5f, 0x7c, 0x96, 0x39, 0xd3, - 0xf0, 0x1a, 0xb6, 0x5c, 0x7f, 0x95, 0x28, 0xc2, 0xe1, 0x0b, - 0xa7, 0x4d, 0x6e, 0x84, 0x2b, 0xc1, 0xe2, 0x08, 0xa4, 0x4e, - 0x6d, 0x87, 0x2e, 0xc4, 0xe7, 0x0d, 0xa1, 0x4b, 0x68, 0x82, - 0x2d, 0xc7, 0xe4, 0x0e, 0xa2, 0x48, 0x6b, 0x81, 0x24, 0xce, - 0xed, 0x07, 0xab, 0x41, 0x62, 0x88, 0x27, 0xcd, 0xee, 0x04, - 0xa8, 0x42, 0x61, 0x8b, 0x22, 0xc8, 0xeb, 0x01, 0xad, 0x47, - 0x64, 0x8e, 0x21, 0xcb, 0xe8, 0x02, 0xae, 0x44, 0x67, 0x8d, - 0x00, 0xeb, 0xcb, 0x20, 0x8b, 0x60, 0x40, 0xab, 0x0b, 0xe0, - 0xc0, 0x2b, 0x80, 0x6b, 0x4b, 0xa0, 0x16, 0xfd, 0xdd, 0x36, - 0x9d, 0x76, 0x56, 0xbd, 0x1d, 0xf6, 0xd6, 0x3d, 0x96, 0x7d, - 0x5d, 0xb6, 0x2c, 0xc7, 0xe7, 0x0c, 0xa7, 0x4c, 0x6c, 0x87, - 0x27, 0xcc, 0xec, 0x07, 0xac, 0x47, 0x67, 0x8c, 0x3a, 0xd1, - 0xf1, 0x1a, 0xb1, 0x5a, 0x7a, 0x91, 0x31, 0xda, 0xfa, 0x11, - 0xba, 0x51, 0x71, 0x9a, 0x58, 0xb3, 0x93, 0x78, 0xd3, 0x38, - 0x18, 0xf3, 0x53, 0xb8, 0x98, 0x73, 0xd8, 0x33, 0x13, 0xf8, - 0x4e, 0xa5, 0x85, 0x6e, 0xc5, 0x2e, 0x0e, 0xe5, 0x45, 0xae, - 0x8e, 0x65, 0xce, 0x25, 0x05, 0xee, 0x74, 0x9f, 0xbf, 0x54, - 0xff, 0x14, 0x34, 0xdf, 0x7f, 0x94, 0xb4, 0x5f, 0xf4, 0x1f, - 0x3f, 0xd4, 0x62, 0x89, 0xa9, 0x42, 0xe9, 0x02, 0x22, 0xc9, - 0x69, 0x82, 0xa2, 0x49, 0xe2, 0x09, 0x29, 0xc2, 0xb0, 0x5b, - 0x7b, 0x90, 0x3b, 0xd0, 0xf0, 0x1b, 0xbb, 0x50, 0x70, 0x9b, - 0x30, 0xdb, 0xfb, 0x10, 0xa6, 0x4d, 0x6d, 0x86, 0x2d, 0xc6, - 0xe6, 0x0d, 0xad, 0x46, 0x66, 0x8d, 0x26, 0xcd, 0xed, 0x06, - 0x9c, 0x77, 0x57, 0xbc, 0x17, 0xfc, 0xdc, 0x37, 0x97, 0x7c, - 0x5c, 0xb7, 0x1c, 0xf7, 0xd7, 0x3c, 0x8a, 0x61, 0x41, 0xaa, - 0x01, 0xea, 0xca, 0x21, 0x81, 0x6a, 0x4a, 0xa1, 0x0a, 0xe1, - 0xc1, 0x2a, 0xe8, 0x03, 0x23, 0xc8, 0x63, 0x88, 0xa8, 0x43, - 0xe3, 0x08, 0x28, 0xc3, 0x68, 0x83, 0xa3, 0x48, 0xfe, 0x15, - 0x35, 0xde, 0x75, 0x9e, 0xbe, 0x55, 0xf5, 0x1e, 0x3e, 0xd5, - 0x7e, 0x95, 0xb5, 0x5e, 0xc4, 0x2f, 0x0f, 0xe4, 0x4f, 0xa4, - 0x84, 0x6f, 0xcf, 0x24, 0x04, 0xef, 0x44, 0xaf, 0x8f, 0x64, - 0xd2, 0x39, 0x19, 0xf2, 0x59, 0xb2, 0x92, 0x79, 0xd9, 0x32, - 0x12, 0xf9, 0x52, 0xb9, 0x99, 0x72, 0x00, 0xec, 0xc5, 0x29, - 0x97, 0x7b, 0x52, 0xbe, 0x33, 0xdf, 0xf6, 0x1a, 0xa4, 0x48, - 0x61, 0x8d, 0x66, 0x8a, 0xa3, 0x4f, 0xf1, 0x1d, 0x34, 0xd8, - 0x55, 0xb9, 0x90, 0x7c, 0xc2, 0x2e, 0x07, 0xeb, 0xcc, 0x20, - 0x09, 0xe5, 0x5b, 0xb7, 0x9e, 0x72, 0xff, 0x13, 0x3a, 0xd6, - 0x68, 0x84, 0xad, 0x41, 0xaa, 0x46, 0x6f, 0x83, 0x3d, 0xd1, - 0xf8, 0x14, 0x99, 0x75, 0x5c, 0xb0, 0x0e, 0xe2, 0xcb, 0x27, - 0x85, 0x69, 0x40, 0xac, 0x12, 0xfe, 0xd7, 0x3b, 0xb6, 0x5a, - 0x73, 0x9f, 0x21, 0xcd, 0xe4, 0x08, 0xe3, 0x0f, 0x26, 0xca, - 0x74, 0x98, 0xb1, 0x5d, 0xd0, 0x3c, 0x15, 0xf9, 0x47, 0xab, - 0x82, 0x6e, 0x49, 0xa5, 0x8c, 0x60, 0xde, 0x32, 0x1b, 0xf7, - 0x7a, 0x96, 0xbf, 0x53, 0xed, 0x01, 0x28, 0xc4, 0x2f, 0xc3, - 0xea, 0x06, 0xb8, 0x54, 0x7d, 0x91, 0x1c, 0xf0, 0xd9, 0x35, - 0x8b, 0x67, 0x4e, 0xa2, 0x17, 0xfb, 0xd2, 0x3e, 0x80, 0x6c, - 0x45, 0xa9, 0x24, 0xc8, 0xe1, 0x0d, 0xb3, 0x5f, 0x76, 0x9a, - 0x71, 0x9d, 0xb4, 0x58, 0xe6, 0x0a, 0x23, 0xcf, 0x42, 0xae, - 0x87, 0x6b, 0xd5, 0x39, 0x10, 0xfc, 0xdb, 0x37, 0x1e, 0xf2, - 0x4c, 0xa0, 0x89, 0x65, 0xe8, 0x04, 0x2d, 0xc1, 0x7f, 0x93, - 0xba, 0x56, 0xbd, 0x51, 0x78, 0x94, 0x2a, 0xc6, 0xef, 0x03, - 0x8e, 0x62, 0x4b, 0xa7, 0x19, 0xf5, 0xdc, 0x30, 0x92, 0x7e, - 0x57, 0xbb, 0x05, 0xe9, 0xc0, 0x2c, 0xa1, 0x4d, 0x64, 0x88, - 0x36, 0xda, 0xf3, 0x1f, 0xf4, 0x18, 0x31, 0xdd, 0x63, 0x8f, - 0xa6, 0x4a, 0xc7, 0x2b, 0x02, 0xee, 0x50, 0xbc, 0x95, 0x79, - 0x5e, 0xb2, 0x9b, 0x77, 0xc9, 0x25, 0x0c, 0xe0, 0x6d, 0x81, - 0xa8, 0x44, 0xfa, 0x16, 0x3f, 0xd3, 0x38, 0xd4, 0xfd, 0x11, - 0xaf, 0x43, 0x6a, 0x86, 0x0b, 0xe7, 0xce, 0x22, 0x9c, 0x70, - 0x59, 0xb5, 0x00, 0xed, 0xc7, 0x2a, 0x93, 0x7e, 0x54, 0xb9, - 0x3b, 0xd6, 0xfc, 0x11, 0xa8, 0x45, 0x6f, 0x82, 0x76, 0x9b, - 0xb1, 0x5c, 0xe5, 0x08, 0x22, 0xcf, 0x4d, 0xa0, 0x8a, 0x67, - 0xde, 0x33, 0x19, 0xf4, 0xec, 0x01, 0x2b, 0xc6, 0x7f, 0x92, - 0xb8, 0x55, 0xd7, 0x3a, 0x10, 0xfd, 0x44, 0xa9, 0x83, 0x6e, - 0x9a, 0x77, 0x5d, 0xb0, 0x09, 0xe4, 0xce, 0x23, 0xa1, 0x4c, - 0x66, 0x8b, 0x32, 0xdf, 0xf5, 0x18, 0xc5, 0x28, 0x02, 0xef, - 0x56, 0xbb, 0x91, 0x7c, 0xfe, 0x13, 0x39, 0xd4, 0x6d, 0x80, - 0xaa, 0x47, 0xb3, 0x5e, 0x74, 0x99, 0x20, 0xcd, 0xe7, 0x0a, - 0x88, 0x65, 0x4f, 0xa2, 0x1b, 0xf6, 0xdc, 0x31, 0x29, 0xc4, - 0xee, 0x03, 0xba, 0x57, 0x7d, 0x90, 0x12, 0xff, 0xd5, 0x38, - 0x81, 0x6c, 0x46, 0xab, 0x5f, 0xb2, 0x98, 0x75, 0xcc, 0x21, - 0x0b, 0xe6, 0x64, 0x89, 0xa3, 0x4e, 0xf7, 0x1a, 0x30, 0xdd, - 0x97, 0x7a, 0x50, 0xbd, 0x04, 0xe9, 0xc3, 0x2e, 0xac, 0x41, - 0x6b, 0x86, 0x3f, 0xd2, 0xf8, 0x15, 0xe1, 0x0c, 0x26, 0xcb, - 0x72, 0x9f, 0xb5, 0x58, 0xda, 0x37, 0x1d, 0xf0, 0x49, 0xa4, - 0x8e, 0x63, 0x7b, 0x96, 0xbc, 0x51, 0xe8, 0x05, 0x2f, 0xc2, - 0x40, 0xad, 0x87, 0x6a, 0xd3, 0x3e, 0x14, 0xf9, 0x0d, 0xe0, - 0xca, 0x27, 0x9e, 0x73, 0x59, 0xb4, 0x36, 0xdb, 0xf1, 0x1c, - 0xa5, 0x48, 0x62, 0x8f, 0x52, 0xbf, 0x95, 0x78, 0xc1, 0x2c, - 0x06, 0xeb, 0x69, 0x84, 0xae, 0x43, 0xfa, 0x17, 0x3d, 0xd0, - 0x24, 0xc9, 0xe3, 0x0e, 0xb7, 0x5a, 0x70, 0x9d, 0x1f, 0xf2, - 0xd8, 0x35, 0x8c, 0x61, 0x4b, 0xa6, 0xbe, 0x53, 0x79, 0x94, - 0x2d, 0xc0, 0xea, 0x07, 0x85, 0x68, 0x42, 0xaf, 0x16, 0xfb, - 0xd1, 0x3c, 0xc8, 0x25, 0x0f, 0xe2, 0x5b, 0xb6, 0x9c, 0x71, - 0xf3, 0x1e, 0x34, 0xd9, 0x60, 0x8d, 0xa7, 0x4a, 0x00, 0xee, - 0xc1, 0x2f, 0x9f, 0x71, 0x5e, 0xb0, 0x23, 0xcd, 0xe2, 0x0c, - 0xbc, 0x52, 0x7d, 0x93, 0x46, 0xa8, 0x87, 0x69, 0xd9, 0x37, - 0x18, 0xf6, 0x65, 0x8b, 0xa4, 0x4a, 0xfa, 0x14, 0x3b, 0xd5, - 0x8c, 0x62, 0x4d, 0xa3, 0x13, 0xfd, 0xd2, 0x3c, 0xaf, 0x41, - 0x6e, 0x80, 0x30, 0xde, 0xf1, 0x1f, 0xca, 0x24, 0x0b, 0xe5, - 0x55, 0xbb, 0x94, 0x7a, 0xe9, 0x07, 0x28, 0xc6, 0x76, 0x98, - 0xb7, 0x59, 0x05, 0xeb, 0xc4, 0x2a, 0x9a, 0x74, 0x5b, 0xb5, - 0x26, 0xc8, 0xe7, 0x09, 0xb9, 0x57, 0x78, 0x96, 0x43, 0xad, - 0x82, 0x6c, 0xdc, 0x32, 0x1d, 0xf3, 0x60, 0x8e, 0xa1, 0x4f, - 0xff, 0x11, 0x3e, 0xd0, 0x89, 0x67, 0x48, 0xa6, 0x16, 0xf8, - 0xd7, 0x39, 0xaa, 0x44, 0x6b, 0x85, 0x35, 0xdb, 0xf4, 0x1a, - 0xcf, 0x21, 0x0e, 0xe0, 0x50, 0xbe, 0x91, 0x7f, 0xec, 0x02, - 0x2d, 0xc3, 0x73, 0x9d, 0xb2, 0x5c, 0x0a, 0xe4, 0xcb, 0x25, - 0x95, 0x7b, 0x54, 0xba, 0x29, 0xc7, 0xe8, 0x06, 0xb6, 0x58, - 0x77, 0x99, 0x4c, 0xa2, 0x8d, 0x63, 0xd3, 0x3d, 0x12, 0xfc, - 0x6f, 0x81, 0xae, 0x40, 0xf0, 0x1e, 0x31, 0xdf, 0x86, 0x68, - 0x47, 0xa9, 0x19, 0xf7, 0xd8, 0x36, 0xa5, 0x4b, 0x64, 0x8a, - 0x3a, 0xd4, 0xfb, 0x15, 0xc0, 0x2e, 0x01, 0xef, 0x5f, 0xb1, - 0x9e, 0x70, 0xe3, 0x0d, 0x22, 0xcc, 0x7c, 0x92, 0xbd, 0x53, - 0x0f, 0xe1, 0xce, 0x20, 0x90, 0x7e, 0x51, 0xbf, 0x2c, 0xc2, - 0xed, 0x03, 0xb3, 0x5d, 0x72, 0x9c, 0x49, 0xa7, 0x88, 0x66, - 0xd6, 0x38, 0x17, 0xf9, 0x6a, 0x84, 0xab, 0x45, 0xf5, 0x1b, - 0x34, 0xda, 0x83, 0x6d, 0x42, 0xac, 0x1c, 0xf2, 0xdd, 0x33, - 0xa0, 0x4e, 0x61, 0x8f, 0x3f, 0xd1, 0xfe, 0x10, 0xc5, 0x2b, - 0x04, 0xea, 0x5a, 0xb4, 0x9b, 0x75, 0xe6, 0x08, 0x27, 0xc9, - 0x79, 0x97, 0xb8, 0x56, 0x00, 0xef, 0xc3, 0x2c, 0x9b, 0x74, - 0x58, 0xb7, 0x2b, 0xc4, 0xe8, 0x07, 0xb0, 0x5f, 0x73, 0x9c, - 0x56, 0xb9, 0x95, 0x7a, 0xcd, 0x22, 0x0e, 0xe1, 0x7d, 0x92, - 0xbe, 0x51, 0xe6, 0x09, 0x25, 0xca, 0xac, 0x43, 0x6f, 0x80, - 0x37, 0xd8, 0xf4, 0x1b, 0x87, 0x68, 0x44, 0xab, 0x1c, 0xf3, - 0xdf, 0x30, 0xfa, 0x15, 0x39, 0xd6, 0x61, 0x8e, 0xa2, 0x4d, - 0xd1, 0x3e, 0x12, 0xfd, 0x4a, 0xa5, 0x89, 0x66, 0x45, 0xaa, - 0x86, 0x69, 0xde, 0x31, 0x1d, 0xf2, 0x6e, 0x81, 0xad, 0x42, - 0xf5, 0x1a, 0x36, 0xd9, 0x13, 0xfc, 0xd0, 0x3f, 0x88, 0x67, - 0x4b, 0xa4, 0x38, 0xd7, 0xfb, 0x14, 0xa3, 0x4c, 0x60, 0x8f, - 0xe9, 0x06, 0x2a, 0xc5, 0x72, 0x9d, 0xb1, 0x5e, 0xc2, 0x2d, - 0x01, 0xee, 0x59, 0xb6, 0x9a, 0x75, 0xbf, 0x50, 0x7c, 0x93, - 0x24, 0xcb, 0xe7, 0x08, 0x94, 0x7b, 0x57, 0xb8, 0x0f, 0xe0, - 0xcc, 0x23, 0x8a, 0x65, 0x49, 0xa6, 0x11, 0xfe, 0xd2, 0x3d, - 0xa1, 0x4e, 0x62, 0x8d, 0x3a, 0xd5, 0xf9, 0x16, 0xdc, 0x33, - 0x1f, 0xf0, 0x47, 0xa8, 0x84, 0x6b, 0xf7, 0x18, 0x34, 0xdb, - 0x6c, 0x83, 0xaf, 0x40, 0x26, 0xc9, 0xe5, 0x0a, 0xbd, 0x52, - 0x7e, 0x91, 0x0d, 0xe2, 0xce, 0x21, 0x96, 0x79, 0x55, 0xba, - 0x70, 0x9f, 0xb3, 0x5c, 0xeb, 0x04, 0x28, 0xc7, 0x5b, 0xb4, - 0x98, 0x77, 0xc0, 0x2f, 0x03, 0xec, 0xcf, 0x20, 0x0c, 0xe3, - 0x54, 0xbb, 0x97, 0x78, 0xe4, 0x0b, 0x27, 0xc8, 0x7f, 0x90, - 0xbc, 0x53, 0x99, 0x76, 0x5a, 0xb5, 0x02, 0xed, 0xc1, 0x2e, - 0xb2, 0x5d, 0x71, 0x9e, 0x29, 0xc6, 0xea, 0x05, 0x63, 0x8c, - 0xa0, 0x4f, 0xf8, 0x17, 0x3b, 0xd4, 0x48, 0xa7, 0x8b, 0x64, - 0xd3, 0x3c, 0x10, 0xff, 0x35, 0xda, 0xf6, 0x19, 0xae, 0x41, - 0x6d, 0x82, 0x1e, 0xf1, 0xdd, 0x32, 0x85, 0x6a, 0x46, 0xa9, - 0x00, 0xf0, 0xfd, 0x0d, 0xe7, 0x17, 0x1a, 0xea, 0xd3, 0x23, - 0x2e, 0xde, 0x34, 0xc4, 0xc9, 0x39, 0xbb, 0x4b, 0x46, 0xb6, - 0x5c, 0xac, 0xa1, 0x51, 0x68, 0x98, 0x95, 0x65, 0x8f, 0x7f, - 0x72, 0x82, 0x6b, 0x9b, 0x96, 0x66, 0x8c, 0x7c, 0x71, 0x81, - 0xb8, 0x48, 0x45, 0xb5, 0x5f, 0xaf, 0xa2, 0x52, 0xd0, 0x20, - 0x2d, 0xdd, 0x37, 0xc7, 0xca, 0x3a, 0x03, 0xf3, 0xfe, 0x0e, - 0xe4, 0x14, 0x19, 0xe9, 0xd6, 0x26, 0x2b, 0xdb, 0x31, 0xc1, - 0xcc, 0x3c, 0x05, 0xf5, 0xf8, 0x08, 0xe2, 0x12, 0x1f, 0xef, - 0x6d, 0x9d, 0x90, 0x60, 0x8a, 0x7a, 0x77, 0x87, 0xbe, 0x4e, - 0x43, 0xb3, 0x59, 0xa9, 0xa4, 0x54, 0xbd, 0x4d, 0x40, 0xb0, - 0x5a, 0xaa, 0xa7, 0x57, 0x6e, 0x9e, 0x93, 0x63, 0x89, 0x79, - 0x74, 0x84, 0x06, 0xf6, 0xfb, 0x0b, 0xe1, 0x11, 0x1c, 0xec, - 0xd5, 0x25, 0x28, 0xd8, 0x32, 0xc2, 0xcf, 0x3f, 0xb1, 0x41, - 0x4c, 0xbc, 0x56, 0xa6, 0xab, 0x5b, 0x62, 0x92, 0x9f, 0x6f, - 0x85, 0x75, 0x78, 0x88, 0x0a, 0xfa, 0xf7, 0x07, 0xed, 0x1d, - 0x10, 0xe0, 0xd9, 0x29, 0x24, 0xd4, 0x3e, 0xce, 0xc3, 0x33, - 0xda, 0x2a, 0x27, 0xd7, 0x3d, 0xcd, 0xc0, 0x30, 0x09, 0xf9, - 0xf4, 0x04, 0xee, 0x1e, 0x13, 0xe3, 0x61, 0x91, 0x9c, 0x6c, - 0x86, 0x76, 0x7b, 0x8b, 0xb2, 0x42, 0x4f, 0xbf, 0x55, 0xa5, - 0xa8, 0x58, 0x67, 0x97, 0x9a, 0x6a, 0x80, 0x70, 0x7d, 0x8d, - 0xb4, 0x44, 0x49, 0xb9, 0x53, 0xa3, 0xae, 0x5e, 0xdc, 0x2c, - 0x21, 0xd1, 0x3b, 0xcb, 0xc6, 0x36, 0x0f, 0xff, 0xf2, 0x02, - 0xe8, 0x18, 0x15, 0xe5, 0x0c, 0xfc, 0xf1, 0x01, 0xeb, 0x1b, - 0x16, 0xe6, 0xdf, 0x2f, 0x22, 0xd2, 0x38, 0xc8, 0xc5, 0x35, - 0xb7, 0x47, 0x4a, 0xba, 0x50, 0xa0, 0xad, 0x5d, 0x64, 0x94, - 0x99, 0x69, 0x83, 0x73, 0x7e, 0x8e, 0x00, 0xf1, 0xff, 0x0e, - 0xe3, 0x12, 0x1c, 0xed, 0xdb, 0x2a, 0x24, 0xd5, 0x38, 0xc9, - 0xc7, 0x36, 0xab, 0x5a, 0x54, 0xa5, 0x48, 0xb9, 0xb7, 0x46, - 0x70, 0x81, 0x8f, 0x7e, 0x93, 0x62, 0x6c, 0x9d, 0x4b, 0xba, - 0xb4, 0x45, 0xa8, 0x59, 0x57, 0xa6, 0x90, 0x61, 0x6f, 0x9e, - 0x73, 0x82, 0x8c, 0x7d, 0xe0, 0x11, 0x1f, 0xee, 0x03, 0xf2, - 0xfc, 0x0d, 0x3b, 0xca, 0xc4, 0x35, 0xd8, 0x29, 0x27, 0xd6, - 0x96, 0x67, 0x69, 0x98, 0x75, 0x84, 0x8a, 0x7b, 0x4d, 0xbc, - 0xb2, 0x43, 0xae, 0x5f, 0x51, 0xa0, 0x3d, 0xcc, 0xc2, 0x33, - 0xde, 0x2f, 0x21, 0xd0, 0xe6, 0x17, 0x19, 0xe8, 0x05, 0xf4, - 0xfa, 0x0b, 0xdd, 0x2c, 0x22, 0xd3, 0x3e, 0xcf, 0xc1, 0x30, - 0x06, 0xf7, 0xf9, 0x08, 0xe5, 0x14, 0x1a, 0xeb, 0x76, 0x87, - 0x89, 0x78, 0x95, 0x64, 0x6a, 0x9b, 0xad, 0x5c, 0x52, 0xa3, - 0x4e, 0xbf, 0xb1, 0x40, 0x31, 0xc0, 0xce, 0x3f, 0xd2, 0x23, - 0x2d, 0xdc, 0xea, 0x1b, 0x15, 0xe4, 0x09, 0xf8, 0xf6, 0x07, - 0x9a, 0x6b, 0x65, 0x94, 0x79, 0x88, 0x86, 0x77, 0x41, 0xb0, - 0xbe, 0x4f, 0xa2, 0x53, 0x5d, 0xac, 0x7a, 0x8b, 0x85, 0x74, - 0x99, 0x68, 0x66, 0x97, 0xa1, 0x50, 0x5e, 0xaf, 0x42, 0xb3, - 0xbd, 0x4c, 0xd1, 0x20, 0x2e, 0xdf, 0x32, 0xc3, 0xcd, 0x3c, - 0x0a, 0xfb, 0xf5, 0x04, 0xe9, 0x18, 0x16, 0xe7, 0xa7, 0x56, - 0x58, 0xa9, 0x44, 0xb5, 0xbb, 0x4a, 0x7c, 0x8d, 0x83, 0x72, - 0x9f, 0x6e, 0x60, 0x91, 0x0c, 0xfd, 0xf3, 0x02, 0xef, 0x1e, - 0x10, 0xe1, 0xd7, 0x26, 0x28, 0xd9, 0x34, 0xc5, 0xcb, 0x3a, - 0xec, 0x1d, 0x13, 0xe2, 0x0f, 0xfe, 0xf0, 0x01, 0x37, 0xc6, - 0xc8, 0x39, 0xd4, 0x25, 0x2b, 0xda, 0x47, 0xb6, 0xb8, 0x49, - 0xa4, 0x55, 0x5b, 0xaa, 0x9c, 0x6d, 0x63, 0x92, 0x7f, 0x8e, - 0x80, 0x71, 0x00, 0xf2, 0xf9, 0x0b, 0xef, 0x1d, 0x16, 0xe4, - 0xc3, 0x31, 0x3a, 0xc8, 0x2c, 0xde, 0xd5, 0x27, 0x9b, 0x69, - 0x62, 0x90, 0x74, 0x86, 0x8d, 0x7f, 0x58, 0xaa, 0xa1, 0x53, - 0xb7, 0x45, 0x4e, 0xbc, 0x2b, 0xd9, 0xd2, 0x20, 0xc4, 0x36, - 0x3d, 0xcf, 0xe8, 0x1a, 0x11, 0xe3, 0x07, 0xf5, 0xfe, 0x0c, - 0xb0, 0x42, 0x49, 0xbb, 0x5f, 0xad, 0xa6, 0x54, 0x73, 0x81, - 0x8a, 0x78, 0x9c, 0x6e, 0x65, 0x97, 0x56, 0xa4, 0xaf, 0x5d, - 0xb9, 0x4b, 0x40, 0xb2, 0x95, 0x67, 0x6c, 0x9e, 0x7a, 0x88, - 0x83, 0x71, 0xcd, 0x3f, 0x34, 0xc6, 0x22, 0xd0, 0xdb, 0x29, - 0x0e, 0xfc, 0xf7, 0x05, 0xe1, 0x13, 0x18, 0xea, 0x7d, 0x8f, - 0x84, 0x76, 0x92, 0x60, 0x6b, 0x99, 0xbe, 0x4c, 0x47, 0xb5, - 0x51, 0xa3, 0xa8, 0x5a, 0xe6, 0x14, 0x1f, 0xed, 0x09, 0xfb, - 0xf0, 0x02, 0x25, 0xd7, 0xdc, 0x2e, 0xca, 0x38, 0x33, 0xc1, - 0xac, 0x5e, 0x55, 0xa7, 0x43, 0xb1, 0xba, 0x48, 0x6f, 0x9d, - 0x96, 0x64, 0x80, 0x72, 0x79, 0x8b, 0x37, 0xc5, 0xce, 0x3c, - 0xd8, 0x2a, 0x21, 0xd3, 0xf4, 0x06, 0x0d, 0xff, 0x1b, 0xe9, - 0xe2, 0x10, 0x87, 0x75, 0x7e, 0x8c, 0x68, 0x9a, 0x91, 0x63, - 0x44, 0xb6, 0xbd, 0x4f, 0xab, 0x59, 0x52, 0xa0, 0x1c, 0xee, - 0xe5, 0x17, 0xf3, 0x01, 0x0a, 0xf8, 0xdf, 0x2d, 0x26, 0xd4, - 0x30, 0xc2, 0xc9, 0x3b, 0xfa, 0x08, 0x03, 0xf1, 0x15, 0xe7, - 0xec, 0x1e, 0x39, 0xcb, 0xc0, 0x32, 0xd6, 0x24, 0x2f, 0xdd, - 0x61, 0x93, 0x98, 0x6a, 0x8e, 0x7c, 0x77, 0x85, 0xa2, 0x50, - 0x5b, 0xa9, 0x4d, 0xbf, 0xb4, 0x46, 0xd1, 0x23, 0x28, 0xda, - 0x3e, 0xcc, 0xc7, 0x35, 0x12, 0xe0, 0xeb, 0x19, 0xfd, 0x0f, - 0x04, 0xf6, 0x4a, 0xb8, 0xb3, 0x41, 0xa5, 0x57, 0x5c, 0xae, - 0x89, 0x7b, 0x70, 0x82, 0x66, 0x94, 0x9f, 0x6d, 0x00, 0xf3, - 0xfb, 0x08, 0xeb, 0x18, 0x10, 0xe3, 0xcb, 0x38, 0x30, 0xc3, - 0x20, 0xd3, 0xdb, 0x28, 0x8b, 0x78, 0x70, 0x83, 0x60, 0x93, - 0x9b, 0x68, 0x40, 0xb3, 0xbb, 0x48, 0xab, 0x58, 0x50, 0xa3, - 0x0b, 0xf8, 0xf0, 0x03, 0xe0, 0x13, 0x1b, 0xe8, 0xc0, 0x33, - 0x3b, 0xc8, 0x2b, 0xd8, 0xd0, 0x23, 0x80, 0x73, 0x7b, 0x88, - 0x6b, 0x98, 0x90, 0x63, 0x4b, 0xb8, 0xb0, 0x43, 0xa0, 0x53, - 0x5b, 0xa8, 0x16, 0xe5, 0xed, 0x1e, 0xfd, 0x0e, 0x06, 0xf5, - 0xdd, 0x2e, 0x26, 0xd5, 0x36, 0xc5, 0xcd, 0x3e, 0x9d, 0x6e, - 0x66, 0x95, 0x76, 0x85, 0x8d, 0x7e, 0x56, 0xa5, 0xad, 0x5e, - 0xbd, 0x4e, 0x46, 0xb5, 0x1d, 0xee, 0xe6, 0x15, 0xf6, 0x05, - 0x0d, 0xfe, 0xd6, 0x25, 0x2d, 0xde, 0x3d, 0xce, 0xc6, 0x35, - 0x96, 0x65, 0x6d, 0x9e, 0x7d, 0x8e, 0x86, 0x75, 0x5d, 0xae, - 0xa6, 0x55, 0xb6, 0x45, 0x4d, 0xbe, 0x2c, 0xdf, 0xd7, 0x24, - 0xc7, 0x34, 0x3c, 0xcf, 0xe7, 0x14, 0x1c, 0xef, 0x0c, 0xff, - 0xf7, 0x04, 0xa7, 0x54, 0x5c, 0xaf, 0x4c, 0xbf, 0xb7, 0x44, - 0x6c, 0x9f, 0x97, 0x64, 0x87, 0x74, 0x7c, 0x8f, 0x27, 0xd4, - 0xdc, 0x2f, 0xcc, 0x3f, 0x37, 0xc4, 0xec, 0x1f, 0x17, 0xe4, - 0x07, 0xf4, 0xfc, 0x0f, 0xac, 0x5f, 0x57, 0xa4, 0x47, 0xb4, - 0xbc, 0x4f, 0x67, 0x94, 0x9c, 0x6f, 0x8c, 0x7f, 0x77, 0x84, - 0x3a, 0xc9, 0xc1, 0x32, 0xd1, 0x22, 0x2a, 0xd9, 0xf1, 0x02, - 0x0a, 0xf9, 0x1a, 0xe9, 0xe1, 0x12, 0xb1, 0x42, 0x4a, 0xb9, - 0x5a, 0xa9, 0xa1, 0x52, 0x7a, 0x89, 0x81, 0x72, 0x91, 0x62, - 0x6a, 0x99, 0x31, 0xc2, 0xca, 0x39, 0xda, 0x29, 0x21, 0xd2, - 0xfa, 0x09, 0x01, 0xf2, 0x11, 0xe2, 0xea, 0x19, 0xba, 0x49, - 0x41, 0xb2, 0x51, 0xa2, 0xaa, 0x59, 0x71, 0x82, 0x8a, 0x79, - 0x9a, 0x69, 0x61, 0x92, 0x00, 0xf4, 0xf5, 0x01, 0xf7, 0x03, - 0x02, 0xf6, 0xf3, 0x07, 0x06, 0xf2, 0x04, 0xf0, 0xf1, 0x05, - 0xfb, 0x0f, 0x0e, 0xfa, 0x0c, 0xf8, 0xf9, 0x0d, 0x08, 0xfc, - 0xfd, 0x09, 0xff, 0x0b, 0x0a, 0xfe, 0xeb, 0x1f, 0x1e, 0xea, - 0x1c, 0xe8, 0xe9, 0x1d, 0x18, 0xec, 0xed, 0x19, 0xef, 0x1b, - 0x1a, 0xee, 0x10, 0xe4, 0xe5, 0x11, 0xe7, 0x13, 0x12, 0xe6, - 0xe3, 0x17, 0x16, 0xe2, 0x14, 0xe0, 0xe1, 0x15, 0xcb, 0x3f, - 0x3e, 0xca, 0x3c, 0xc8, 0xc9, 0x3d, 0x38, 0xcc, 0xcd, 0x39, - 0xcf, 0x3b, 0x3a, 0xce, 0x30, 0xc4, 0xc5, 0x31, 0xc7, 0x33, - 0x32, 0xc6, 0xc3, 0x37, 0x36, 0xc2, 0x34, 0xc0, 0xc1, 0x35, - 0x20, 0xd4, 0xd5, 0x21, 0xd7, 0x23, 0x22, 0xd6, 0xd3, 0x27, - 0x26, 0xd2, 0x24, 0xd0, 0xd1, 0x25, 0xdb, 0x2f, 0x2e, 0xda, - 0x2c, 0xd8, 0xd9, 0x2d, 0x28, 0xdc, 0xdd, 0x29, 0xdf, 0x2b, - 0x2a, 0xde, 0x8b, 0x7f, 0x7e, 0x8a, 0x7c, 0x88, 0x89, 0x7d, - 0x78, 0x8c, 0x8d, 0x79, 0x8f, 0x7b, 0x7a, 0x8e, 0x70, 0x84, - 0x85, 0x71, 0x87, 0x73, 0x72, 0x86, 0x83, 0x77, 0x76, 0x82, - 0x74, 0x80, 0x81, 0x75, 0x60, 0x94, 0x95, 0x61, 0x97, 0x63, - 0x62, 0x96, 0x93, 0x67, 0x66, 0x92, 0x64, 0x90, 0x91, 0x65, - 0x9b, 0x6f, 0x6e, 0x9a, 0x6c, 0x98, 0x99, 0x6d, 0x68, 0x9c, - 0x9d, 0x69, 0x9f, 0x6b, 0x6a, 0x9e, 0x40, 0xb4, 0xb5, 0x41, - 0xb7, 0x43, 0x42, 0xb6, 0xb3, 0x47, 0x46, 0xb2, 0x44, 0xb0, - 0xb1, 0x45, 0xbb, 0x4f, 0x4e, 0xba, 0x4c, 0xb8, 0xb9, 0x4d, - 0x48, 0xbc, 0xbd, 0x49, 0xbf, 0x4b, 0x4a, 0xbe, 0xab, 0x5f, - 0x5e, 0xaa, 0x5c, 0xa8, 0xa9, 0x5d, 0x58, 0xac, 0xad, 0x59, - 0xaf, 0x5b, 0x5a, 0xae, 0x50, 0xa4, 0xa5, 0x51, 0xa7, 0x53, - 0x52, 0xa6, 0xa3, 0x57, 0x56, 0xa2, 0x54, 0xa0, 0xa1, 0x55, - 0x00, 0xf5, 0xf7, 0x02, 0xf3, 0x06, 0x04, 0xf1, 0xfb, 0x0e, - 0x0c, 0xf9, 0x08, 0xfd, 0xff, 0x0a, 0xeb, 0x1e, 0x1c, 0xe9, - 0x18, 0xed, 0xef, 0x1a, 0x10, 0xe5, 0xe7, 0x12, 0xe3, 0x16, - 0x14, 0xe1, 0xcb, 0x3e, 0x3c, 0xc9, 0x38, 0xcd, 0xcf, 0x3a, - 0x30, 0xc5, 0xc7, 0x32, 0xc3, 0x36, 0x34, 0xc1, 0x20, 0xd5, - 0xd7, 0x22, 0xd3, 0x26, 0x24, 0xd1, 0xdb, 0x2e, 0x2c, 0xd9, - 0x28, 0xdd, 0xdf, 0x2a, 0x8b, 0x7e, 0x7c, 0x89, 0x78, 0x8d, - 0x8f, 0x7a, 0x70, 0x85, 0x87, 0x72, 0x83, 0x76, 0x74, 0x81, - 0x60, 0x95, 0x97, 0x62, 0x93, 0x66, 0x64, 0x91, 0x9b, 0x6e, - 0x6c, 0x99, 0x68, 0x9d, 0x9f, 0x6a, 0x40, 0xb5, 0xb7, 0x42, - 0xb3, 0x46, 0x44, 0xb1, 0xbb, 0x4e, 0x4c, 0xb9, 0x48, 0xbd, - 0xbf, 0x4a, 0xab, 0x5e, 0x5c, 0xa9, 0x58, 0xad, 0xaf, 0x5a, - 0x50, 0xa5, 0xa7, 0x52, 0xa3, 0x56, 0x54, 0xa1, 0x0b, 0xfe, - 0xfc, 0x09, 0xf8, 0x0d, 0x0f, 0xfa, 0xf0, 0x05, 0x07, 0xf2, - 0x03, 0xf6, 0xf4, 0x01, 0xe0, 0x15, 0x17, 0xe2, 0x13, 0xe6, - 0xe4, 0x11, 0x1b, 0xee, 0xec, 0x19, 0xe8, 0x1d, 0x1f, 0xea, - 0xc0, 0x35, 0x37, 0xc2, 0x33, 0xc6, 0xc4, 0x31, 0x3b, 0xce, - 0xcc, 0x39, 0xc8, 0x3d, 0x3f, 0xca, 0x2b, 0xde, 0xdc, 0x29, - 0xd8, 0x2d, 0x2f, 0xda, 0xd0, 0x25, 0x27, 0xd2, 0x23, 0xd6, - 0xd4, 0x21, 0x80, 0x75, 0x77, 0x82, 0x73, 0x86, 0x84, 0x71, - 0x7b, 0x8e, 0x8c, 0x79, 0x88, 0x7d, 0x7f, 0x8a, 0x6b, 0x9e, - 0x9c, 0x69, 0x98, 0x6d, 0x6f, 0x9a, 0x90, 0x65, 0x67, 0x92, - 0x63, 0x96, 0x94, 0x61, 0x4b, 0xbe, 0xbc, 0x49, 0xb8, 0x4d, - 0x4f, 0xba, 0xb0, 0x45, 0x47, 0xb2, 0x43, 0xb6, 0xb4, 0x41, - 0xa0, 0x55, 0x57, 0xa2, 0x53, 0xa6, 0xa4, 0x51, 0x5b, 0xae, - 0xac, 0x59, 0xa8, 0x5d, 0x5f, 0xaa, 0x00, 0xf6, 0xf1, 0x07, - 0xff, 0x09, 0x0e, 0xf8, 0xe3, 0x15, 0x12, 0xe4, 0x1c, 0xea, - 0xed, 0x1b, 0xdb, 0x2d, 0x2a, 0xdc, 0x24, 0xd2, 0xd5, 0x23, - 0x38, 0xce, 0xc9, 0x3f, 0xc7, 0x31, 0x36, 0xc0, 0xab, 0x5d, - 0x5a, 0xac, 0x54, 0xa2, 0xa5, 0x53, 0x48, 0xbe, 0xb9, 0x4f, - 0xb7, 0x41, 0x46, 0xb0, 0x70, 0x86, 0x81, 0x77, 0x8f, 0x79, - 0x7e, 0x88, 0x93, 0x65, 0x62, 0x94, 0x6c, 0x9a, 0x9d, 0x6b, - 0x4b, 0xbd, 0xba, 0x4c, 0xb4, 0x42, 0x45, 0xb3, 0xa8, 0x5e, - 0x59, 0xaf, 0x57, 0xa1, 0xa6, 0x50, 0x90, 0x66, 0x61, 0x97, - 0x6f, 0x99, 0x9e, 0x68, 0x73, 0x85, 0x82, 0x74, 0x8c, 0x7a, - 0x7d, 0x8b, 0xe0, 0x16, 0x11, 0xe7, 0x1f, 0xe9, 0xee, 0x18, - 0x03, 0xf5, 0xf2, 0x04, 0xfc, 0x0a, 0x0d, 0xfb, 0x3b, 0xcd, - 0xca, 0x3c, 0xc4, 0x32, 0x35, 0xc3, 0xd8, 0x2e, 0x29, 0xdf, - 0x27, 0xd1, 0xd6, 0x20, 0x96, 0x60, 0x67, 0x91, 0x69, 0x9f, - 0x98, 0x6e, 0x75, 0x83, 0x84, 0x72, 0x8a, 0x7c, 0x7b, 0x8d, - 0x4d, 0xbb, 0xbc, 0x4a, 0xb2, 0x44, 0x43, 0xb5, 0xae, 0x58, - 0x5f, 0xa9, 0x51, 0xa7, 0xa0, 0x56, 0x3d, 0xcb, 0xcc, 0x3a, - 0xc2, 0x34, 0x33, 0xc5, 0xde, 0x28, 0x2f, 0xd9, 0x21, 0xd7, - 0xd0, 0x26, 0xe6, 0x10, 0x17, 0xe1, 0x19, 0xef, 0xe8, 0x1e, - 0x05, 0xf3, 0xf4, 0x02, 0xfa, 0x0c, 0x0b, 0xfd, 0xdd, 0x2b, - 0x2c, 0xda, 0x22, 0xd4, 0xd3, 0x25, 0x3e, 0xc8, 0xcf, 0x39, - 0xc1, 0x37, 0x30, 0xc6, 0x06, 0xf0, 0xf7, 0x01, 0xf9, 0x0f, - 0x08, 0xfe, 0xe5, 0x13, 0x14, 0xe2, 0x1a, 0xec, 0xeb, 0x1d, - 0x76, 0x80, 0x87, 0x71, 0x89, 0x7f, 0x78, 0x8e, 0x95, 0x63, - 0x64, 0x92, 0x6a, 0x9c, 0x9b, 0x6d, 0xad, 0x5b, 0x5c, 0xaa, - 0x52, 0xa4, 0xa3, 0x55, 0x4e, 0xb8, 0xbf, 0x49, 0xb1, 0x47, - 0x40, 0xb6, 0x00, 0xf7, 0xf3, 0x04, 0xfb, 0x0c, 0x08, 0xff, - 0xeb, 0x1c, 0x18, 0xef, 0x10, 0xe7, 0xe3, 0x14, 0xcb, 0x3c, - 0x38, 0xcf, 0x30, 0xc7, 0xc3, 0x34, 0x20, 0xd7, 0xd3, 0x24, - 0xdb, 0x2c, 0x28, 0xdf, 0x8b, 0x7c, 0x78, 0x8f, 0x70, 0x87, - 0x83, 0x74, 0x60, 0x97, 0x93, 0x64, 0x9b, 0x6c, 0x68, 0x9f, - 0x40, 0xb7, 0xb3, 0x44, 0xbb, 0x4c, 0x48, 0xbf, 0xab, 0x5c, - 0x58, 0xaf, 0x50, 0xa7, 0xa3, 0x54, 0x0b, 0xfc, 0xf8, 0x0f, - 0xf0, 0x07, 0x03, 0xf4, 0xe0, 0x17, 0x13, 0xe4, 0x1b, 0xec, - 0xe8, 0x1f, 0xc0, 0x37, 0x33, 0xc4, 0x3b, 0xcc, 0xc8, 0x3f, - 0x2b, 0xdc, 0xd8, 0x2f, 0xd0, 0x27, 0x23, 0xd4, 0x80, 0x77, - 0x73, 0x84, 0x7b, 0x8c, 0x88, 0x7f, 0x6b, 0x9c, 0x98, 0x6f, - 0x90, 0x67, 0x63, 0x94, 0x4b, 0xbc, 0xb8, 0x4f, 0xb0, 0x47, - 0x43, 0xb4, 0xa0, 0x57, 0x53, 0xa4, 0x5b, 0xac, 0xa8, 0x5f, - 0x16, 0xe1, 0xe5, 0x12, 0xed, 0x1a, 0x1e, 0xe9, 0xfd, 0x0a, - 0x0e, 0xf9, 0x06, 0xf1, 0xf5, 0x02, 0xdd, 0x2a, 0x2e, 0xd9, - 0x26, 0xd1, 0xd5, 0x22, 0x36, 0xc1, 0xc5, 0x32, 0xcd, 0x3a, - 0x3e, 0xc9, 0x9d, 0x6a, 0x6e, 0x99, 0x66, 0x91, 0x95, 0x62, - 0x76, 0x81, 0x85, 0x72, 0x8d, 0x7a, 0x7e, 0x89, 0x56, 0xa1, - 0xa5, 0x52, 0xad, 0x5a, 0x5e, 0xa9, 0xbd, 0x4a, 0x4e, 0xb9, - 0x46, 0xb1, 0xb5, 0x42, 0x1d, 0xea, 0xee, 0x19, 0xe6, 0x11, - 0x15, 0xe2, 0xf6, 0x01, 0x05, 0xf2, 0x0d, 0xfa, 0xfe, 0x09, - 0xd6, 0x21, 0x25, 0xd2, 0x2d, 0xda, 0xde, 0x29, 0x3d, 0xca, - 0xce, 0x39, 0xc6, 0x31, 0x35, 0xc2, 0x96, 0x61, 0x65, 0x92, - 0x6d, 0x9a, 0x9e, 0x69, 0x7d, 0x8a, 0x8e, 0x79, 0x86, 0x71, - 0x75, 0x82, 0x5d, 0xaa, 0xae, 0x59, 0xa6, 0x51, 0x55, 0xa2, - 0xb6, 0x41, 0x45, 0xb2, 0x4d, 0xba, 0xbe, 0x49, 0x00, 0xf8, - 0xed, 0x15, 0xc7, 0x3f, 0x2a, 0xd2, 0x93, 0x6b, 0x7e, 0x86, - 0x54, 0xac, 0xb9, 0x41, 0x3b, 0xc3, 0xd6, 0x2e, 0xfc, 0x04, - 0x11, 0xe9, 0xa8, 0x50, 0x45, 0xbd, 0x6f, 0x97, 0x82, 0x7a, - 0x76, 0x8e, 0x9b, 0x63, 0xb1, 0x49, 0x5c, 0xa4, 0xe5, 0x1d, - 0x08, 0xf0, 0x22, 0xda, 0xcf, 0x37, 0x4d, 0xb5, 0xa0, 0x58, - 0x8a, 0x72, 0x67, 0x9f, 0xde, 0x26, 0x33, 0xcb, 0x19, 0xe1, - 0xf4, 0x0c, 0xec, 0x14, 0x01, 0xf9, 0x2b, 0xd3, 0xc6, 0x3e, - 0x7f, 0x87, 0x92, 0x6a, 0xb8, 0x40, 0x55, 0xad, 0xd7, 0x2f, - 0x3a, 0xc2, 0x10, 0xe8, 0xfd, 0x05, 0x44, 0xbc, 0xa9, 0x51, - 0x83, 0x7b, 0x6e, 0x96, 0x9a, 0x62, 0x77, 0x8f, 0x5d, 0xa5, - 0xb0, 0x48, 0x09, 0xf1, 0xe4, 0x1c, 0xce, 0x36, 0x23, 0xdb, - 0xa1, 0x59, 0x4c, 0xb4, 0x66, 0x9e, 0x8b, 0x73, 0x32, 0xca, - 0xdf, 0x27, 0xf5, 0x0d, 0x18, 0xe0, 0xc5, 0x3d, 0x28, 0xd0, - 0x02, 0xfa, 0xef, 0x17, 0x56, 0xae, 0xbb, 0x43, 0x91, 0x69, - 0x7c, 0x84, 0xfe, 0x06, 0x13, 0xeb, 0x39, 0xc1, 0xd4, 0x2c, - 0x6d, 0x95, 0x80, 0x78, 0xaa, 0x52, 0x47, 0xbf, 0xb3, 0x4b, - 0x5e, 0xa6, 0x74, 0x8c, 0x99, 0x61, 0x20, 0xd8, 0xcd, 0x35, - 0xe7, 0x1f, 0x0a, 0xf2, 0x88, 0x70, 0x65, 0x9d, 0x4f, 0xb7, - 0xa2, 0x5a, 0x1b, 0xe3, 0xf6, 0x0e, 0xdc, 0x24, 0x31, 0xc9, - 0x29, 0xd1, 0xc4, 0x3c, 0xee, 0x16, 0x03, 0xfb, 0xba, 0x42, - 0x57, 0xaf, 0x7d, 0x85, 0x90, 0x68, 0x12, 0xea, 0xff, 0x07, - 0xd5, 0x2d, 0x38, 0xc0, 0x81, 0x79, 0x6c, 0x94, 0x46, 0xbe, - 0xab, 0x53, 0x5f, 0xa7, 0xb2, 0x4a, 0x98, 0x60, 0x75, 0x8d, - 0xcc, 0x34, 0x21, 0xd9, 0x0b, 0xf3, 0xe6, 0x1e, 0x64, 0x9c, - 0x89, 0x71, 0xa3, 0x5b, 0x4e, 0xb6, 0xf7, 0x0f, 0x1a, 0xe2, - 0x30, 0xc8, 0xdd, 0x25, 0x00, 0xf9, 0xef, 0x16, 0xc3, 0x3a, - 0x2c, 0xd5, 0x9b, 0x62, 0x74, 0x8d, 0x58, 0xa1, 0xb7, 0x4e, - 0x2b, 0xd2, 0xc4, 0x3d, 0xe8, 0x11, 0x07, 0xfe, 0xb0, 0x49, - 0x5f, 0xa6, 0x73, 0x8a, 0x9c, 0x65, 0x56, 0xaf, 0xb9, 0x40, - 0x95, 0x6c, 0x7a, 0x83, 0xcd, 0x34, 0x22, 0xdb, 0x0e, 0xf7, - 0xe1, 0x18, 0x7d, 0x84, 0x92, 0x6b, 0xbe, 0x47, 0x51, 0xa8, - 0xe6, 0x1f, 0x09, 0xf0, 0x25, 0xdc, 0xca, 0x33, 0xac, 0x55, - 0x43, 0xba, 0x6f, 0x96, 0x80, 0x79, 0x37, 0xce, 0xd8, 0x21, - 0xf4, 0x0d, 0x1b, 0xe2, 0x87, 0x7e, 0x68, 0x91, 0x44, 0xbd, - 0xab, 0x52, 0x1c, 0xe5, 0xf3, 0x0a, 0xdf, 0x26, 0x30, 0xc9, - 0xfa, 0x03, 0x15, 0xec, 0x39, 0xc0, 0xd6, 0x2f, 0x61, 0x98, - 0x8e, 0x77, 0xa2, 0x5b, 0x4d, 0xb4, 0xd1, 0x28, 0x3e, 0xc7, - 0x12, 0xeb, 0xfd, 0x04, 0x4a, 0xb3, 0xa5, 0x5c, 0x89, 0x70, - 0x66, 0x9f, 0x45, 0xbc, 0xaa, 0x53, 0x86, 0x7f, 0x69, 0x90, - 0xde, 0x27, 0x31, 0xc8, 0x1d, 0xe4, 0xf2, 0x0b, 0x6e, 0x97, - 0x81, 0x78, 0xad, 0x54, 0x42, 0xbb, 0xf5, 0x0c, 0x1a, 0xe3, - 0x36, 0xcf, 0xd9, 0x20, 0x13, 0xea, 0xfc, 0x05, 0xd0, 0x29, - 0x3f, 0xc6, 0x88, 0x71, 0x67, 0x9e, 0x4b, 0xb2, 0xa4, 0x5d, - 0x38, 0xc1, 0xd7, 0x2e, 0xfb, 0x02, 0x14, 0xed, 0xa3, 0x5a, - 0x4c, 0xb5, 0x60, 0x99, 0x8f, 0x76, 0xe9, 0x10, 0x06, 0xff, - 0x2a, 0xd3, 0xc5, 0x3c, 0x72, 0x8b, 0x9d, 0x64, 0xb1, 0x48, - 0x5e, 0xa7, 0xc2, 0x3b, 0x2d, 0xd4, 0x01, 0xf8, 0xee, 0x17, - 0x59, 0xa0, 0xb6, 0x4f, 0x9a, 0x63, 0x75, 0x8c, 0xbf, 0x46, - 0x50, 0xa9, 0x7c, 0x85, 0x93, 0x6a, 0x24, 0xdd, 0xcb, 0x32, - 0xe7, 0x1e, 0x08, 0xf1, 0x94, 0x6d, 0x7b, 0x82, 0x57, 0xae, - 0xb8, 0x41, 0x0f, 0xf6, 0xe0, 0x19, 0xcc, 0x35, 0x23, 0xda, - 0x00, 0xfa, 0xe9, 0x13, 0xcf, 0x35, 0x26, 0xdc, 0x83, 0x79, - 0x6a, 0x90, 0x4c, 0xb6, 0xa5, 0x5f, 0x1b, 0xe1, 0xf2, 0x08, - 0xd4, 0x2e, 0x3d, 0xc7, 0x98, 0x62, 0x71, 0x8b, 0x57, 0xad, - 0xbe, 0x44, 0x36, 0xcc, 0xdf, 0x25, 0xf9, 0x03, 0x10, 0xea, - 0xb5, 0x4f, 0x5c, 0xa6, 0x7a, 0x80, 0x93, 0x69, 0x2d, 0xd7, - 0xc4, 0x3e, 0xe2, 0x18, 0x0b, 0xf1, 0xae, 0x54, 0x47, 0xbd, - 0x61, 0x9b, 0x88, 0x72, 0x6c, 0x96, 0x85, 0x7f, 0xa3, 0x59, - 0x4a, 0xb0, 0xef, 0x15, 0x06, 0xfc, 0x20, 0xda, 0xc9, 0x33, - 0x77, 0x8d, 0x9e, 0x64, 0xb8, 0x42, 0x51, 0xab, 0xf4, 0x0e, - 0x1d, 0xe7, 0x3b, 0xc1, 0xd2, 0x28, 0x5a, 0xa0, 0xb3, 0x49, - 0x95, 0x6f, 0x7c, 0x86, 0xd9, 0x23, 0x30, 0xca, 0x16, 0xec, - 0xff, 0x05, 0x41, 0xbb, 0xa8, 0x52, 0x8e, 0x74, 0x67, 0x9d, - 0xc2, 0x38, 0x2b, 0xd1, 0x0d, 0xf7, 0xe4, 0x1e, 0xd8, 0x22, - 0x31, 0xcb, 0x17, 0xed, 0xfe, 0x04, 0x5b, 0xa1, 0xb2, 0x48, - 0x94, 0x6e, 0x7d, 0x87, 0xc3, 0x39, 0x2a, 0xd0, 0x0c, 0xf6, - 0xe5, 0x1f, 0x40, 0xba, 0xa9, 0x53, 0x8f, 0x75, 0x66, 0x9c, - 0xee, 0x14, 0x07, 0xfd, 0x21, 0xdb, 0xc8, 0x32, 0x6d, 0x97, - 0x84, 0x7e, 0xa2, 0x58, 0x4b, 0xb1, 0xf5, 0x0f, 0x1c, 0xe6, - 0x3a, 0xc0, 0xd3, 0x29, 0x76, 0x8c, 0x9f, 0x65, 0xb9, 0x43, - 0x50, 0xaa, 0xb4, 0x4e, 0x5d, 0xa7, 0x7b, 0x81, 0x92, 0x68, - 0x37, 0xcd, 0xde, 0x24, 0xf8, 0x02, 0x11, 0xeb, 0xaf, 0x55, - 0x46, 0xbc, 0x60, 0x9a, 0x89, 0x73, 0x2c, 0xd6, 0xc5, 0x3f, - 0xe3, 0x19, 0x0a, 0xf0, 0x82, 0x78, 0x6b, 0x91, 0x4d, 0xb7, - 0xa4, 0x5e, 0x01, 0xfb, 0xe8, 0x12, 0xce, 0x34, 0x27, 0xdd, - 0x99, 0x63, 0x70, 0x8a, 0x56, 0xac, 0xbf, 0x45, 0x1a, 0xe0, - 0xf3, 0x09, 0xd5, 0x2f, 0x3c, 0xc6, 0x00, 0xfb, 0xeb, 0x10, - 0xcb, 0x30, 0x20, 0xdb, 0x8b, 0x70, 0x60, 0x9b, 0x40, 0xbb, - 0xab, 0x50, 0x0b, 0xf0, 0xe0, 0x1b, 0xc0, 0x3b, 0x2b, 0xd0, - 0x80, 0x7b, 0x6b, 0x90, 0x4b, 0xb0, 0xa0, 0x5b, 0x16, 0xed, - 0xfd, 0x06, 0xdd, 0x26, 0x36, 0xcd, 0x9d, 0x66, 0x76, 0x8d, - 0x56, 0xad, 0xbd, 0x46, 0x1d, 0xe6, 0xf6, 0x0d, 0xd6, 0x2d, - 0x3d, 0xc6, 0x96, 0x6d, 0x7d, 0x86, 0x5d, 0xa6, 0xb6, 0x4d, - 0x2c, 0xd7, 0xc7, 0x3c, 0xe7, 0x1c, 0x0c, 0xf7, 0xa7, 0x5c, - 0x4c, 0xb7, 0x6c, 0x97, 0x87, 0x7c, 0x27, 0xdc, 0xcc, 0x37, - 0xec, 0x17, 0x07, 0xfc, 0xac, 0x57, 0x47, 0xbc, 0x67, 0x9c, - 0x8c, 0x77, 0x3a, 0xc1, 0xd1, 0x2a, 0xf1, 0x0a, 0x1a, 0xe1, - 0xb1, 0x4a, 0x5a, 0xa1, 0x7a, 0x81, 0x91, 0x6a, 0x31, 0xca, - 0xda, 0x21, 0xfa, 0x01, 0x11, 0xea, 0xba, 0x41, 0x51, 0xaa, - 0x71, 0x8a, 0x9a, 0x61, 0x58, 0xa3, 0xb3, 0x48, 0x93, 0x68, - 0x78, 0x83, 0xd3, 0x28, 0x38, 0xc3, 0x18, 0xe3, 0xf3, 0x08, - 0x53, 0xa8, 0xb8, 0x43, 0x98, 0x63, 0x73, 0x88, 0xd8, 0x23, - 0x33, 0xc8, 0x13, 0xe8, 0xf8, 0x03, 0x4e, 0xb5, 0xa5, 0x5e, - 0x85, 0x7e, 0x6e, 0x95, 0xc5, 0x3e, 0x2e, 0xd5, 0x0e, 0xf5, - 0xe5, 0x1e, 0x45, 0xbe, 0xae, 0x55, 0x8e, 0x75, 0x65, 0x9e, - 0xce, 0x35, 0x25, 0xde, 0x05, 0xfe, 0xee, 0x15, 0x74, 0x8f, - 0x9f, 0x64, 0xbf, 0x44, 0x54, 0xaf, 0xff, 0x04, 0x14, 0xef, - 0x34, 0xcf, 0xdf, 0x24, 0x7f, 0x84, 0x94, 0x6f, 0xb4, 0x4f, - 0x5f, 0xa4, 0xf4, 0x0f, 0x1f, 0xe4, 0x3f, 0xc4, 0xd4, 0x2f, - 0x62, 0x99, 0x89, 0x72, 0xa9, 0x52, 0x42, 0xb9, 0xe9, 0x12, - 0x02, 0xf9, 0x22, 0xd9, 0xc9, 0x32, 0x69, 0x92, 0x82, 0x79, - 0xa2, 0x59, 0x49, 0xb2, 0xe2, 0x19, 0x09, 0xf2, 0x29, 0xd2, - 0xc2, 0x39, 0x00, 0xfc, 0xe5, 0x19, 0xd7, 0x2b, 0x32, 0xce, - 0xb3, 0x4f, 0x56, 0xaa, 0x64, 0x98, 0x81, 0x7d, 0x7b, 0x87, - 0x9e, 0x62, 0xac, 0x50, 0x49, 0xb5, 0xc8, 0x34, 0x2d, 0xd1, - 0x1f, 0xe3, 0xfa, 0x06, 0xf6, 0x0a, 0x13, 0xef, 0x21, 0xdd, - 0xc4, 0x38, 0x45, 0xb9, 0xa0, 0x5c, 0x92, 0x6e, 0x77, 0x8b, - 0x8d, 0x71, 0x68, 0x94, 0x5a, 0xa6, 0xbf, 0x43, 0x3e, 0xc2, - 0xdb, 0x27, 0xe9, 0x15, 0x0c, 0xf0, 0xf1, 0x0d, 0x14, 0xe8, - 0x26, 0xda, 0xc3, 0x3f, 0x42, 0xbe, 0xa7, 0x5b, 0x95, 0x69, - 0x70, 0x8c, 0x8a, 0x76, 0x6f, 0x93, 0x5d, 0xa1, 0xb8, 0x44, - 0x39, 0xc5, 0xdc, 0x20, 0xee, 0x12, 0x0b, 0xf7, 0x07, 0xfb, - 0xe2, 0x1e, 0xd0, 0x2c, 0x35, 0xc9, 0xb4, 0x48, 0x51, 0xad, - 0x63, 0x9f, 0x86, 0x7a, 0x7c, 0x80, 0x99, 0x65, 0xab, 0x57, - 0x4e, 0xb2, 0xcf, 0x33, 0x2a, 0xd6, 0x18, 0xe4, 0xfd, 0x01, - 0xff, 0x03, 0x1a, 0xe6, 0x28, 0xd4, 0xcd, 0x31, 0x4c, 0xb0, - 0xa9, 0x55, 0x9b, 0x67, 0x7e, 0x82, 0x84, 0x78, 0x61, 0x9d, - 0x53, 0xaf, 0xb6, 0x4a, 0x37, 0xcb, 0xd2, 0x2e, 0xe0, 0x1c, - 0x05, 0xf9, 0x09, 0xf5, 0xec, 0x10, 0xde, 0x22, 0x3b, 0xc7, - 0xba, 0x46, 0x5f, 0xa3, 0x6d, 0x91, 0x88, 0x74, 0x72, 0x8e, - 0x97, 0x6b, 0xa5, 0x59, 0x40, 0xbc, 0xc1, 0x3d, 0x24, 0xd8, - 0x16, 0xea, 0xf3, 0x0f, 0x0e, 0xf2, 0xeb, 0x17, 0xd9, 0x25, - 0x3c, 0xc0, 0xbd, 0x41, 0x58, 0xa4, 0x6a, 0x96, 0x8f, 0x73, - 0x75, 0x89, 0x90, 0x6c, 0xa2, 0x5e, 0x47, 0xbb, 0xc6, 0x3a, - 0x23, 0xdf, 0x11, 0xed, 0xf4, 0x08, 0xf8, 0x04, 0x1d, 0xe1, - 0x2f, 0xd3, 0xca, 0x36, 0x4b, 0xb7, 0xae, 0x52, 0x9c, 0x60, - 0x79, 0x85, 0x83, 0x7f, 0x66, 0x9a, 0x54, 0xa8, 0xb1, 0x4d, - 0x30, 0xcc, 0xd5, 0x29, 0xe7, 0x1b, 0x02, 0xfe, 0x00, 0xfd, - 0xe7, 0x1a, 0xd3, 0x2e, 0x34, 0xc9, 0xbb, 0x46, 0x5c, 0xa1, - 0x68, 0x95, 0x8f, 0x72, 0x6b, 0x96, 0x8c, 0x71, 0xb8, 0x45, - 0x5f, 0xa2, 0xd0, 0x2d, 0x37, 0xca, 0x03, 0xfe, 0xe4, 0x19, - 0xd6, 0x2b, 0x31, 0xcc, 0x05, 0xf8, 0xe2, 0x1f, 0x6d, 0x90, - 0x8a, 0x77, 0xbe, 0x43, 0x59, 0xa4, 0xbd, 0x40, 0x5a, 0xa7, - 0x6e, 0x93, 0x89, 0x74, 0x06, 0xfb, 0xe1, 0x1c, 0xd5, 0x28, - 0x32, 0xcf, 0xb1, 0x4c, 0x56, 0xab, 0x62, 0x9f, 0x85, 0x78, - 0x0a, 0xf7, 0xed, 0x10, 0xd9, 0x24, 0x3e, 0xc3, 0xda, 0x27, - 0x3d, 0xc0, 0x09, 0xf4, 0xee, 0x13, 0x61, 0x9c, 0x86, 0x7b, - 0xb2, 0x4f, 0x55, 0xa8, 0x67, 0x9a, 0x80, 0x7d, 0xb4, 0x49, - 0x53, 0xae, 0xdc, 0x21, 0x3b, 0xc6, 0x0f, 0xf2, 0xe8, 0x15, - 0x0c, 0xf1, 0xeb, 0x16, 0xdf, 0x22, 0x38, 0xc5, 0xb7, 0x4a, - 0x50, 0xad, 0x64, 0x99, 0x83, 0x7e, 0x7f, 0x82, 0x98, 0x65, - 0xac, 0x51, 0x4b, 0xb6, 0xc4, 0x39, 0x23, 0xde, 0x17, 0xea, - 0xf0, 0x0d, 0x14, 0xe9, 0xf3, 0x0e, 0xc7, 0x3a, 0x20, 0xdd, - 0xaf, 0x52, 0x48, 0xb5, 0x7c, 0x81, 0x9b, 0x66, 0xa9, 0x54, - 0x4e, 0xb3, 0x7a, 0x87, 0x9d, 0x60, 0x12, 0xef, 0xf5, 0x08, - 0xc1, 0x3c, 0x26, 0xdb, 0xc2, 0x3f, 0x25, 0xd8, 0x11, 0xec, - 0xf6, 0x0b, 0x79, 0x84, 0x9e, 0x63, 0xaa, 0x57, 0x4d, 0xb0, - 0xce, 0x33, 0x29, 0xd4, 0x1d, 0xe0, 0xfa, 0x07, 0x75, 0x88, - 0x92, 0x6f, 0xa6, 0x5b, 0x41, 0xbc, 0xa5, 0x58, 0x42, 0xbf, - 0x76, 0x8b, 0x91, 0x6c, 0x1e, 0xe3, 0xf9, 0x04, 0xcd, 0x30, - 0x2a, 0xd7, 0x18, 0xe5, 0xff, 0x02, 0xcb, 0x36, 0x2c, 0xd1, - 0xa3, 0x5e, 0x44, 0xb9, 0x70, 0x8d, 0x97, 0x6a, 0x73, 0x8e, - 0x94, 0x69, 0xa0, 0x5d, 0x47, 0xba, 0xc8, 0x35, 0x2f, 0xd2, - 0x1b, 0xe6, 0xfc, 0x01, 0x00, 0xfe, 0xe1, 0x1f, 0xdf, 0x21, - 0x3e, 0xc0, 0xa3, 0x5d, 0x42, 0xbc, 0x7c, 0x82, 0x9d, 0x63, - 0x5b, 0xa5, 0xba, 0x44, 0x84, 0x7a, 0x65, 0x9b, 0xf8, 0x06, - 0x19, 0xe7, 0x27, 0xd9, 0xc6, 0x38, 0xb6, 0x48, 0x57, 0xa9, - 0x69, 0x97, 0x88, 0x76, 0x15, 0xeb, 0xf4, 0x0a, 0xca, 0x34, - 0x2b, 0xd5, 0xed, 0x13, 0x0c, 0xf2, 0x32, 0xcc, 0xd3, 0x2d, - 0x4e, 0xb0, 0xaf, 0x51, 0x91, 0x6f, 0x70, 0x8e, 0x71, 0x8f, - 0x90, 0x6e, 0xae, 0x50, 0x4f, 0xb1, 0xd2, 0x2c, 0x33, 0xcd, - 0x0d, 0xf3, 0xec, 0x12, 0x2a, 0xd4, 0xcb, 0x35, 0xf5, 0x0b, - 0x14, 0xea, 0x89, 0x77, 0x68, 0x96, 0x56, 0xa8, 0xb7, 0x49, - 0xc7, 0x39, 0x26, 0xd8, 0x18, 0xe6, 0xf9, 0x07, 0x64, 0x9a, - 0x85, 0x7b, 0xbb, 0x45, 0x5a, 0xa4, 0x9c, 0x62, 0x7d, 0x83, - 0x43, 0xbd, 0xa2, 0x5c, 0x3f, 0xc1, 0xde, 0x20, 0xe0, 0x1e, - 0x01, 0xff, 0xe2, 0x1c, 0x03, 0xfd, 0x3d, 0xc3, 0xdc, 0x22, - 0x41, 0xbf, 0xa0, 0x5e, 0x9e, 0x60, 0x7f, 0x81, 0xb9, 0x47, - 0x58, 0xa6, 0x66, 0x98, 0x87, 0x79, 0x1a, 0xe4, 0xfb, 0x05, - 0xc5, 0x3b, 0x24, 0xda, 0x54, 0xaa, 0xb5, 0x4b, 0x8b, 0x75, - 0x6a, 0x94, 0xf7, 0x09, 0x16, 0xe8, 0x28, 0xd6, 0xc9, 0x37, - 0x0f, 0xf1, 0xee, 0x10, 0xd0, 0x2e, 0x31, 0xcf, 0xac, 0x52, - 0x4d, 0xb3, 0x73, 0x8d, 0x92, 0x6c, 0x93, 0x6d, 0x72, 0x8c, - 0x4c, 0xb2, 0xad, 0x53, 0x30, 0xce, 0xd1, 0x2f, 0xef, 0x11, - 0x0e, 0xf0, 0xc8, 0x36, 0x29, 0xd7, 0x17, 0xe9, 0xf6, 0x08, - 0x6b, 0x95, 0x8a, 0x74, 0xb4, 0x4a, 0x55, 0xab, 0x25, 0xdb, - 0xc4, 0x3a, 0xfa, 0x04, 0x1b, 0xe5, 0x86, 0x78, 0x67, 0x99, - 0x59, 0xa7, 0xb8, 0x46, 0x7e, 0x80, 0x9f, 0x61, 0xa1, 0x5f, - 0x40, 0xbe, 0xdd, 0x23, 0x3c, 0xc2, 0x02, 0xfc, 0xe3, 0x1d, - 0x00, 0xff, 0xe3, 0x1c, 0xdb, 0x24, 0x38, 0xc7, 0xab, 0x54, - 0x48, 0xb7, 0x70, 0x8f, 0x93, 0x6c, 0x4b, 0xb4, 0xa8, 0x57, - 0x90, 0x6f, 0x73, 0x8c, 0xe0, 0x1f, 0x03, 0xfc, 0x3b, 0xc4, - 0xd8, 0x27, 0x96, 0x69, 0x75, 0x8a, 0x4d, 0xb2, 0xae, 0x51, - 0x3d, 0xc2, 0xde, 0x21, 0xe6, 0x19, 0x05, 0xfa, 0xdd, 0x22, - 0x3e, 0xc1, 0x06, 0xf9, 0xe5, 0x1a, 0x76, 0x89, 0x95, 0x6a, - 0xad, 0x52, 0x4e, 0xb1, 0x31, 0xce, 0xd2, 0x2d, 0xea, 0x15, - 0x09, 0xf6, 0x9a, 0x65, 0x79, 0x86, 0x41, 0xbe, 0xa2, 0x5d, - 0x7a, 0x85, 0x99, 0x66, 0xa1, 0x5e, 0x42, 0xbd, 0xd1, 0x2e, - 0x32, 0xcd, 0x0a, 0xf5, 0xe9, 0x16, 0xa7, 0x58, 0x44, 0xbb, - 0x7c, 0x83, 0x9f, 0x60, 0x0c, 0xf3, 0xef, 0x10, 0xd7, 0x28, - 0x34, 0xcb, 0xec, 0x13, 0x0f, 0xf0, 0x37, 0xc8, 0xd4, 0x2b, - 0x47, 0xb8, 0xa4, 0x5b, 0x9c, 0x63, 0x7f, 0x80, 0x62, 0x9d, - 0x81, 0x7e, 0xb9, 0x46, 0x5a, 0xa5, 0xc9, 0x36, 0x2a, 0xd5, - 0x12, 0xed, 0xf1, 0x0e, 0x29, 0xd6, 0xca, 0x35, 0xf2, 0x0d, - 0x11, 0xee, 0x82, 0x7d, 0x61, 0x9e, 0x59, 0xa6, 0xba, 0x45, - 0xf4, 0x0b, 0x17, 0xe8, 0x2f, 0xd0, 0xcc, 0x33, 0x5f, 0xa0, - 0xbc, 0x43, 0x84, 0x7b, 0x67, 0x98, 0xbf, 0x40, 0x5c, 0xa3, - 0x64, 0x9b, 0x87, 0x78, 0x14, 0xeb, 0xf7, 0x08, 0xcf, 0x30, - 0x2c, 0xd3, 0x53, 0xac, 0xb0, 0x4f, 0x88, 0x77, 0x6b, 0x94, - 0xf8, 0x07, 0x1b, 0xe4, 0x23, 0xdc, 0xc0, 0x3f, 0x18, 0xe7, - 0xfb, 0x04, 0xc3, 0x3c, 0x20, 0xdf, 0xb3, 0x4c, 0x50, 0xaf, - 0x68, 0x97, 0x8b, 0x74, 0xc5, 0x3a, 0x26, 0xd9, 0x1e, 0xe1, - 0xfd, 0x02, 0x6e, 0x91, 0x8d, 0x72, 0xb5, 0x4a, 0x56, 0xa9, - 0x8e, 0x71, 0x6d, 0x92, 0x55, 0xaa, 0xb6, 0x49, 0x25, 0xda, - 0xc6, 0x39, 0xfe, 0x01, 0x1d, 0xe2 -}; - -unsigned char gf_inv_table_base[] = { - 0x00, 0x01, 0x8e, 0xf4, 0x47, 0xa7, 0x7a, 0xba, 0xad, 0x9d, - 0xdd, 0x98, 0x3d, 0xaa, 0x5d, 0x96, 0xd8, 0x72, 0xc0, 0x58, - 0xe0, 0x3e, 0x4c, 0x66, 0x90, 0xde, 0x55, 0x80, 0xa0, 0x83, - 0x4b, 0x2a, 0x6c, 0xed, 0x39, 0x51, 0x60, 0x56, 0x2c, 0x8a, - 0x70, 0xd0, 0x1f, 0x4a, 0x26, 0x8b, 0x33, 0x6e, 0x48, 0x89, - 0x6f, 0x2e, 0xa4, 0xc3, 0x40, 0x5e, 0x50, 0x22, 0xcf, 0xa9, - 0xab, 0x0c, 0x15, 0xe1, 0x36, 0x5f, 0xf8, 0xd5, 0x92, 0x4e, - 0xa6, 0x04, 0x30, 0x88, 0x2b, 0x1e, 0x16, 0x67, 0x45, 0x93, - 0x38, 0x23, 0x68, 0x8c, 0x81, 0x1a, 0x25, 0x61, 0x13, 0xc1, - 0xcb, 0x63, 0x97, 0x0e, 0x37, 0x41, 0x24, 0x57, 0xca, 0x5b, - 0xb9, 0xc4, 0x17, 0x4d, 0x52, 0x8d, 0xef, 0xb3, 0x20, 0xec, - 0x2f, 0x32, 0x28, 0xd1, 0x11, 0xd9, 0xe9, 0xfb, 0xda, 0x79, - 0xdb, 0x77, 0x06, 0xbb, 0x84, 0xcd, 0xfe, 0xfc, 0x1b, 0x54, - 0xa1, 0x1d, 0x7c, 0xcc, 0xe4, 0xb0, 0x49, 0x31, 0x27, 0x2d, - 0x53, 0x69, 0x02, 0xf5, 0x18, 0xdf, 0x44, 0x4f, 0x9b, 0xbc, - 0x0f, 0x5c, 0x0b, 0xdc, 0xbd, 0x94, 0xac, 0x09, 0xc7, 0xa2, - 0x1c, 0x82, 0x9f, 0xc6, 0x34, 0xc2, 0x46, 0x05, 0xce, 0x3b, - 0x0d, 0x3c, 0x9c, 0x08, 0xbe, 0xb7, 0x87, 0xe5, 0xee, 0x6b, - 0xeb, 0xf2, 0xbf, 0xaf, 0xc5, 0x64, 0x07, 0x7b, 0x95, 0x9a, - 0xae, 0xb6, 0x12, 0x59, 0xa5, 0x35, 0x65, 0xb8, 0xa3, 0x9e, - 0xd2, 0xf7, 0x62, 0x5a, 0x85, 0x7d, 0xa8, 0x3a, 0x29, 0x71, - 0xc8, 0xf6, 0xf9, 0x43, 0xd7, 0xd6, 0x10, 0x73, 0x76, 0x78, - 0x99, 0x0a, 0x19, 0x91, 0x14, 0x3f, 0xe6, 0xf0, 0x86, 0xb1, - 0xe2, 0xf1, 0xfa, 0x74, 0xf3, 0xb4, 0x6d, 0x21, 0xb2, 0x6a, - 0xe3, 0xe7, 0xb5, 0xea, 0x03, 0x8f, 0xd3, 0xc9, 0x42, 0xd4, - 0xe8, 0x75, 0x7f, 0xff, 0x7e, 0xfd -}; -#endif // GF_LARGE_TABLES - -#endif //_EC_BASE_H_ diff --git a/pkg/erasure/ec_code.h b/pkg/erasure/ec_code.h deleted file mode 100644 index 570944c37..000000000 --- a/pkg/erasure/ec_code.h +++ /dev/null @@ -1,933 +0,0 @@ -/********************************************************************** - Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -**********************************************************************/ - - -#ifndef _ERASURE_CODE_H_ -#define _ERASURE_CODE_H_ - -/** - * @file erasure_code.h - * @brief Interface to functions supporting erasure code encode and decode. - * - * This file defines the interface to optimized functions used in erasure - * codes. Encode and decode of erasures in GF(2^8) are made by calculating the - * dot product of the symbols (bytes in GF(2^8)) across a set of buffers and a - * set of coefficients. Values for the coefficients are determined by the type - * of erasure code. Using a general dot product means that any sequence of - * coefficients may be used including erasure codes based on random - * coefficients. - * Multiple versions of dot product are supplied to calculate 1-6 output - * vectors in one pass. - * Base GF multiply and divide functions can be sped up by defining - * GF_LARGE_TABLES at the expense of memory size. - * - */ - -#include "gf_vect_mul.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @brief Initialize tables for fast Erasure Code encode and decode. - * - * Generates the expanded tables needed for fast encode or decode for erasure - * codes on blocks of data. 32bytes is generated for each input coefficient. - * - * @param k The number of vector sources or rows in the generator matrix - * for coding. - * @param rows The number of output vectors to concurrently encode/decode. - * @param a Pointer to sets of arrays of input coefficients used to encode - * or decode data. - * @param gftbls Pointer to start of space for concatenated output tables - * generated from input coefficients. Must be of size 32*k*rows. - * @returns none - */ - -void ec_init_tables(int k, int rows, unsigned char* a, unsigned char* gftbls); - -/** - * @brief Generate or decode erasure codes on blocks of data, runs appropriate version. - * - * Given a list of source data blocks, generate one or multiple blocks of - * encoded data as specified by a matrix of GF(2^8) coefficients. When given a - * suitable set of coefficients, this function will perform the fast generation - * or decoding of Reed-Solomon type erasure codes. - * - * This function determines what instruction sets are enabled and - * selects the appropriate version at runtime. - * - * @param len Length of each block of data (vector) of source or dest data. - * @param k The number of vector sources or rows in the generator matrix - * for coding. - * @param rows The number of output vectors to concurrently encode/decode. - * @param gftbls Pointer to array of input tables generated from coding - * coefficients in ec_init_tables(). Must be of size 32*k*rows - * @param data Array of pointers to source input buffers. - * @param coding Array of pointers to coded output buffers. - * @returns none - */ - -void ec_encode_data(int len, int k, int rows, unsigned char *gftbls, unsigned char **data, - unsigned char **coding); - -/** - * @brief Generate or decode erasure codes on blocks of data. - * - * Arch specific version of ec_encode_data() with same parameters. - * @requires SSE4.1 - */ -void ec_encode_data_sse(int len, int k, int rows, unsigned char *gftbls, unsigned char **data, - unsigned char **coding); - -/** - * @brief Generate or decode erasure codes on blocks of data. - * - * Arch specific version of ec_encode_data() with same parameters. - * @requires AVX - */ -void ec_encode_data_avx(int len, int k, int rows, unsigned char *gftbls, unsigned char **data, - unsigned char **coding); - -/** - * @brief Generate or decode erasure codes on blocks of data. - * - * Arch specific version of ec_encode_data() with same parameters. - * @requires AVX2 - */ -void ec_encode_data_avx2(int len, int k, int rows, unsigned char *gftbls, unsigned char **data, - unsigned char **coding); - -/** - * @brief Generate or decode erasure codes on blocks of data, runs baseline version. - * - * Baseline version of ec_encode_data() with same parameters. - */ -void ec_encode_data_base(int len, int srcs, int dests, unsigned char *v, unsigned char **src, - unsigned char **dest); - -/** - * @brief Generate update for encode or decode of erasure codes from single source, runs appropriate version. - * - * Given one source data block, update one or multiple blocks of encoded data as - * specified by a matrix of GF(2^8) coefficients. When given a suitable set of - * coefficients, this function will perform the fast generation or decoding of - * Reed-Solomon type erasure codes from one input source at a time. - * - * This function determines what instruction sets are enabled and selects the - * appropriate version at runtime. - * - * @param len Length of each block of data (vector) of source or dest data. - * @param k The number of vector sources or rows in the generator matrix - * for coding. - * @param rows The number of output vectors to concurrently encode/decode. - * @param vec_i The vector index corresponding to the single input source. - * @param g_tbls Pointer to array of input tables generated from coding - * coefficients in ec_init_tables(). Must be of size 32*k*rows - * @param data Pointer to single input source used to update output parity. - * @param coding Array of pointers to coded output buffers. - * @returns none - */ -void ec_encode_data_update(int len, int k, int rows, int vec_i, unsigned char *g_tbls, - unsigned char *data, unsigned char **coding); - -/** - * @brief Generate update for encode or decode of erasure codes from single source. - * - * Arch specific version of ec_encode_data_update() with same parameters. - * @requires SSE4.1 - */ - -void ec_encode_data_update_sse(int len, int k, int rows, int vec_i, unsigned char *g_tbls, - unsigned char *data, unsigned char **coding); - -/** - * @brief Generate update for encode or decode of erasure codes from single source. - * - * Arch specific version of ec_encode_data_update() with same parameters. - * @requires AVX - */ - -void ec_encode_data_update_avx(int len, int k, int rows, int vec_i, unsigned char *g_tbls, - unsigned char *data, unsigned char **coding); - -/** - * @brief Generate update for encode or decode of erasure codes from single source. - * - * Arch specific version of ec_encode_data_update() with same parameters. - * @requires AVX2 - */ - -void ec_encode_data_update_avx2(int len, int k, int rows, int vec_i, unsigned char *g_tbls, - unsigned char *data, unsigned char **coding); - -/** - * @brief Generate update for encode or decode of erasure codes from single source. - * - * Baseline version of ec_encode_data_update(). - */ - -void ec_encode_data_update_base(int len, int k, int rows, int vec_i, unsigned char *v, - unsigned char *data, unsigned char **dest); - - -/** - * @brief GF(2^8) vector dot product. - * - * Does a GF(2^8) dot product across each byte of the input array and a constant - * set of coefficients to produce each byte of the output. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 32*vlen byte constant array based on the input coefficients. - * @requires SSE4.1 - * - * @param len Length of each vector in bytes. Must be >= 16. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 32*vlen byte array of pre-calculated constants based - * on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Pointer to destination data array. - * @returns none - */ - -void gf_vect_dot_prod_sse(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char *dest); - -/** - * @brief GF(2^8) vector dot product. - * - * Does a GF(2^8) dot product across each byte of the input array and a constant - * set of coefficients to produce each byte of the output. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 32*vlen byte constant array based on the input coefficients. - * @requires AVX - * - * @param len Length of each vector in bytes. Must be >= 16. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 32*vlen byte array of pre-calculated constants based - * on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Pointer to destination data array. - * @returns none - */ - -void gf_vect_dot_prod_avx(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char *dest); - -/** - * @brief GF(2^8) vector dot product. - * - * Does a GF(2^8) dot product across each byte of the input array and a constant - * set of coefficients to produce each byte of the output. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 32*vlen byte constant array based on the input coefficients. - * @requires AVX2 - * - * @param len Length of each vector in bytes. Must be >= 32. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 32*vlen byte array of pre-calculated constants based - * on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Pointer to destination data array. - * @returns none - */ - -void gf_vect_dot_prod_avx2(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char *dest); - -/** - * @brief GF(2^8) vector dot product with two outputs. - * - * Vector dot product optimized to calculate two ouputs at a time. Does two - * GF(2^8) dot products across each byte of the input array and two constant - * sets of coefficients to produce each byte of the outputs. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 2*32*vlen byte constant array based on the two sets of input coefficients. - * @requires SSE4.1 - * - * @param len Length of each vector in bytes. Must be >= 16. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 2*32*vlen byte array of pre-calculated constants - * based on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Array of pointers to destination data buffers. - * @returns none - */ - -void gf_2vect_dot_prod_sse(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char **dest); - -/** - * @brief GF(2^8) vector dot product with two outputs. - * - * Vector dot product optimized to calculate two ouputs at a time. Does two - * GF(2^8) dot products across each byte of the input array and two constant - * sets of coefficients to produce each byte of the outputs. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 2*32*vlen byte constant array based on the two sets of input coefficients. - * @requires AVX - * - * @param len Length of each vector in bytes. Must be >= 16. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 2*32*vlen byte array of pre-calculated constants - * based on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Array of pointers to destination data buffers. - * @returns none - */ - -void gf_2vect_dot_prod_avx(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char **dest); - -/** - * @brief GF(2^8) vector dot product with two outputs. - * - * Vector dot product optimized to calculate two ouputs at a time. Does two - * GF(2^8) dot products across each byte of the input array and two constant - * sets of coefficients to produce each byte of the outputs. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 2*32*vlen byte constant array based on the two sets of input coefficients. - * @requires AVX2 - * - * @param len Length of each vector in bytes. Must be >= 32. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 2*32*vlen byte array of pre-calculated constants - * based on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Array of pointers to destination data buffers. - * @returns none - */ - -void gf_2vect_dot_prod_avx2(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char **dest); - -/** - * @brief GF(2^8) vector dot product with three outputs. - * - * Vector dot product optimized to calculate three ouputs at a time. Does three - * GF(2^8) dot products across each byte of the input array and three constant - * sets of coefficients to produce each byte of the outputs. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 3*32*vlen byte constant array based on the three sets of input coefficients. - * @requires SSE4.1 - * - * @param len Length of each vector in bytes. Must be >= 16. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 3*32*vlen byte array of pre-calculated constants - * based on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Array of pointers to destination data buffers. - * @returns none - */ - -void gf_3vect_dot_prod_sse(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char **dest); - -/** - * @brief GF(2^8) vector dot product with three outputs. - * - * Vector dot product optimized to calculate three ouputs at a time. Does three - * GF(2^8) dot products across each byte of the input array and three constant - * sets of coefficients to produce each byte of the outputs. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 3*32*vlen byte constant array based on the three sets of input coefficients. - * @requires AVX - * - * @param len Length of each vector in bytes. Must be >= 16. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 3*32*vlen byte array of pre-calculated constants - * based on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Array of pointers to destination data buffers. - * @returns none - */ - -void gf_3vect_dot_prod_avx(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char **dest); - -/** - * @brief GF(2^8) vector dot product with three outputs. - * - * Vector dot product optimized to calculate three ouputs at a time. Does three - * GF(2^8) dot products across each byte of the input array and three constant - * sets of coefficients to produce each byte of the outputs. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 3*32*vlen byte constant array based on the three sets of input coefficients. - * @requires AVX2 - * - * @param len Length of each vector in bytes. Must be >= 32. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 3*32*vlen byte array of pre-calculated constants - * based on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Array of pointers to destination data buffers. - * @returns none - */ - -void gf_3vect_dot_prod_avx2(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char **dest); - -/** - * @brief GF(2^8) vector dot product with four outputs. - * - * Vector dot product optimized to calculate four ouputs at a time. Does four - * GF(2^8) dot products across each byte of the input array and four constant - * sets of coefficients to produce each byte of the outputs. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 4*32*vlen byte constant array based on the four sets of input coefficients. - * @requires SSE4.1 - * - * @param len Length of each vector in bytes. Must be >= 16. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 4*32*vlen byte array of pre-calculated constants - * based on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Array of pointers to destination data buffers. - * @returns none - */ - -void gf_4vect_dot_prod_sse(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char **dest); - -/** - * @brief GF(2^8) vector dot product with four outputs. - * - * Vector dot product optimized to calculate four ouputs at a time. Does four - * GF(2^8) dot products across each byte of the input array and four constant - * sets of coefficients to produce each byte of the outputs. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 4*32*vlen byte constant array based on the four sets of input coefficients. - * @requires AVX - * - * @param len Length of each vector in bytes. Must be >= 16. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 4*32*vlen byte array of pre-calculated constants - * based on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Array of pointers to destination data buffers. - * @returns none - */ - -void gf_4vect_dot_prod_avx(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char **dest); - -/** - * @brief GF(2^8) vector dot product with four outputs. - * - * Vector dot product optimized to calculate four ouputs at a time. Does four - * GF(2^8) dot products across each byte of the input array and four constant - * sets of coefficients to produce each byte of the outputs. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 4*32*vlen byte constant array based on the four sets of input coefficients. - * @requires AVX2 - * - * @param len Length of each vector in bytes. Must be >= 32. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 4*32*vlen byte array of pre-calculated constants - * based on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Array of pointers to destination data buffers. - * @returns none - */ - -void gf_4vect_dot_prod_avx2(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char **dest); - -/** - * @brief GF(2^8) vector dot product with five outputs. - * - * Vector dot product optimized to calculate five ouputs at a time. Does five - * GF(2^8) dot products across each byte of the input array and five constant - * sets of coefficients to produce each byte of the outputs. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 5*32*vlen byte constant array based on the five sets of input coefficients. - * @requires SSE4.1 - * - * @param len Length of each vector in bytes. Must >= 16. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 5*32*vlen byte array of pre-calculated constants - * based on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Array of pointers to destination data buffers. - * @returns none - */ - -void gf_5vect_dot_prod_sse(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char **dest); - -/** - * @brief GF(2^8) vector dot product with five outputs. - * - * Vector dot product optimized to calculate five ouputs at a time. Does five - * GF(2^8) dot products across each byte of the input array and five constant - * sets of coefficients to produce each byte of the outputs. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 5*32*vlen byte constant array based on the five sets of input coefficients. - * @requires AVX - * - * @param len Length of each vector in bytes. Must >= 16. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 5*32*vlen byte array of pre-calculated constants - * based on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Array of pointers to destination data buffers. - * @returns none - */ - -void gf_5vect_dot_prod_avx(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char **dest); - -/** - * @brief GF(2^8) vector dot product with five outputs. - * - * Vector dot product optimized to calculate five ouputs at a time. Does five - * GF(2^8) dot products across each byte of the input array and five constant - * sets of coefficients to produce each byte of the outputs. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 5*32*vlen byte constant array based on the five sets of input coefficients. - * @requires AVX2 - * - * @param len Length of each vector in bytes. Must >= 32. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 5*32*vlen byte array of pre-calculated constants - * based on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Array of pointers to destination data buffers. - * @returns none - */ - -void gf_5vect_dot_prod_avx2(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char **dest); - -/** - * @brief GF(2^8) vector dot product with six outputs. - * - * Vector dot product optimized to calculate six ouputs at a time. Does six - * GF(2^8) dot products across each byte of the input array and six constant - * sets of coefficients to produce each byte of the outputs. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 6*32*vlen byte constant array based on the six sets of input coefficients. - * @requires SSE4.1 - * - * @param len Length of each vector in bytes. Must be >= 16. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 6*32*vlen byte array of pre-calculated constants - * based on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Array of pointers to destination data buffers. - * @returns none - */ - -void gf_6vect_dot_prod_sse(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char **dest); - -/** - * @brief GF(2^8) vector dot product with six outputs. - * - * Vector dot product optimized to calculate six ouputs at a time. Does six - * GF(2^8) dot products across each byte of the input array and six constant - * sets of coefficients to produce each byte of the outputs. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 6*32*vlen byte constant array based on the six sets of input coefficients. - * @requires AVX - * - * @param len Length of each vector in bytes. Must be >= 16. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 6*32*vlen byte array of pre-calculated constants - * based on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Array of pointers to destination data buffers. - * @returns none - */ - -void gf_6vect_dot_prod_avx(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char **dest); - -/** - * @brief GF(2^8) vector dot product with six outputs. - * - * Vector dot product optimized to calculate six ouputs at a time. Does six - * GF(2^8) dot products across each byte of the input array and six constant - * sets of coefficients to produce each byte of the outputs. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 6*32*vlen byte constant array based on the six sets of input coefficients. - * @requires AVX2 - * - * @param len Length of each vector in bytes. Must be >= 32. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 6*32*vlen byte array of pre-calculated constants - * based on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Array of pointers to destination data buffers. - * @returns none - */ - -void gf_6vect_dot_prod_avx2(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char **dest); - -/** - * @brief GF(2^8) vector dot product, runs baseline version. - * - * Does a GF(2^8) dot product across each byte of the input array and a constant - * set of coefficients to produce each byte of the output. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 32*vlen byte constant array based on the input coefficients. - * - * @param len Length of each vector in bytes. Must be >= 16. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 32*vlen byte array of pre-calculated constants based - * on the array of input coefficients. Only elements 32*CONST*j + 1 - * of this array are used, where j = (0, 1, 2...) and CONST is the - * number of elements in the array of input coefficients. The - * elements used correspond to the original input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Pointer to destination data array. - * @returns none - */ - -void gf_vect_dot_prod_base(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char *dest); - -/** - * @brief GF(2^8) vector dot product, runs appropriate version. - * - * Does a GF(2^8) dot product across each byte of the input array and a constant - * set of coefficients to produce each byte of the output. Can be used for - * erasure coding encode and decode. Function requires pre-calculation of a - * 32*vlen byte constant array based on the input coefficients. - * - * This function determines what instruction sets are enabled and - * selects the appropriate version at runtime. - * - * @param len Length of each vector in bytes. Must be >= 32. - * @param vlen Number of vector sources. - * @param gftbls Pointer to 32*vlen byte array of pre-calculated constants based - * on the array of input coefficients. - * @param src Array of pointers to source inputs. - * @param dest Pointer to destination data array. - * @returns none - */ - -void gf_vect_dot_prod(int len, int vlen, unsigned char *gftbls, - unsigned char **src, unsigned char *dest); - - -/** - * @brief GF(2^8) vector multiply accumulate, runs appropriate version. - * - * Does a GF(2^8) multiply across each byte of input source with expanded - * constant and add to destination array. Can be used for erasure coding encode - * and decode update when only one source is available at a time. Function - * requires pre-calculation of a 32*vec byte constant array based on the input - * coefficients. - * - * This function determines what instruction sets are enabled and selects the - * appropriate version at runtime. - * - * @param len Length of each vector in bytes. Must be >= 32. - * @param vec The number of vector sources or rows in the generator matrix - * for coding. - * @param vec_i The vector index corresponding to the single input source. - * @param gftbls Pointer to array of input tables generated from coding - * coefficients in ec_init_tables(). Must be of size 32*vec. - * @param src Array of pointers to source inputs. - * @param dest Pointer to destination data array. - * @returns none - */ - -void gf_vect_mad(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char *dest); - -/** - * @brief GF(2^8) vector multiply accumulate, arch specific version. - * - * Arch specific version of gf_vect_mad() with same parameters. - * @requires SSE4.1 - */ - -void gf_vect_mad_sse(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char *dest); -/** - * @brief GF(2^8) vector multiply accumulate, arch specific version. - * - * Arch specific version of gf_vect_mad() with same parameters. - * @requires AVX - */ - -void gf_vect_mad_avx(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char *dest); - -/** - * @brief GF(2^8) vector multiply accumulate, arch specific version. - * - * Arch specific version of gf_vect_mad() with same parameters. - * @requires AVX2 - */ - -void gf_vect_mad_avx2(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char *dest); - -/** - * @brief GF(2^8) vector multiply accumulate, baseline version. - * - * Baseline version of gf_vect_mad() with same parameters. - */ - -void gf_vect_mad_base(int len, int vec, int vec_i, unsigned char *v, unsigned char *src, - unsigned char *dest); - -/** - * @brief GF(2^8) vector multiply with 2 accumulate. SSE version. - * - * Does a GF(2^8) multiply across each byte of input source with expanded - * constants and add to destination arrays. Can be used for erasure coding - * encode and decode update when only one source is available at a - * time. Function requires pre-calculation of a 32*vec byte constant array based - * on the input coefficients. - * @requires SSE4.1 - * - * @param len Length of each vector in bytes. Must be >= 32. - * @param vec The number of vector sources or rows in the generator matrix - * for coding. - * @param vec_i The vector index corresponding to the single input source. - * @param gftbls Pointer to array of input tables generated from coding - * coefficients in ec_init_tables(). Must be of size 32*vec. - * @param src Pointer to source input array. - * @param dest Array of pointers to destination input/outputs. - * @returns none - */ - -void gf_2vect_mad_sse(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char **dest); - -/** - * @brief GF(2^8) vector multiply with 2 accumulate. AVX version of gf_2vect_mad_sse(). - * @requires AVX - */ -void gf_2vect_mad_avx(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char **dest); -/** - * @brief GF(2^8) vector multiply with 2 accumulate. AVX2 version of gf_2vect_mad_sse(). - * @requires AVX2 - */ -void gf_2vect_mad_avx2(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char **dest); - -/** - * @brief GF(2^8) vector multiply with 3 accumulate. SSE version. - * - * Does a GF(2^8) multiply across each byte of input source with expanded - * constants and add to destination arrays. Can be used for erasure coding - * encode and decode update when only one source is available at a - * time. Function requires pre-calculation of a 32*vec byte constant array based - * on the input coefficients. - * @requires SSE4.1 - * - * @param len Length of each vector in bytes. Must be >= 32. - * @param vec The number of vector sources or rows in the generator matrix - * for coding. - * @param vec_i The vector index corresponding to the single input source. - * @param gftbls Pointer to array of input tables generated from coding - * coefficients in ec_init_tables(). Must be of size 32*vec. - * @param src Pointer to source input array. - * @param dest Array of pointers to destination input/outputs. - * @returns none - */ - -void gf_3vect_mad_sse(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char **dest); - -/** - * @brief GF(2^8) vector multiply with 3 accumulate. AVX version of gf_3vect_mad_sse(). - * @requires AVX - */ -void gf_3vect_mad_avx(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char **dest); - -/** - * @brief GF(2^8) vector multiply with 3 accumulate. AVX2 version of gf_3vect_mad_sse(). - * @requires AVX2 - */ -void gf_3vect_mad_avx2(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char **dest); - -/** - * @brief GF(2^8) vector multiply with 4 accumulate. SSE version. - * - * Does a GF(2^8) multiply across each byte of input source with expanded - * constants and add to destination arrays. Can be used for erasure coding - * encode and decode update when only one source is available at a - * time. Function requires pre-calculation of a 32*vec byte constant array based - * on the input coefficients. - * @requires SSE4.1 - * - * @param len Length of each vector in bytes. Must be >= 32. - * @param vec The number of vector sources or rows in the generator matrix - * for coding. - * @param vec_i The vector index corresponding to the single input source. - * @param gftbls Pointer to array of input tables generated from coding - * coefficients in ec_init_tables(). Must be of size 32*vec. - * @param src Pointer to source input array. - * @param dest Array of pointers to destination input/outputs. - * @returns none - */ - -void gf_4vect_mad_sse(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char **dest); - -/** - * @brief GF(2^8) vector multiply with 4 accumulate. AVX version of gf_4vect_mad_sse(). - * @requires AVX - */ -void gf_4vect_mad_avx(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char **dest); -/** - * @brief GF(2^8) vector multiply with 4 accumulate. AVX2 version of gf_4vect_mad_sse(). - * @requires AVX2 - */ -void gf_4vect_mad_avx2(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char **dest); - -/** - * @brief GF(2^8) vector multiply with 5 accumulate. SSE version. - * @requires SSE4.1 - */ -void gf_5vect_mad_sse(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char **dest); - -/** - * @brief GF(2^8) vector multiply with 5 accumulate. AVX version. - * @requires AVX - */ -void gf_5vect_mad_avx(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char **dest); -/** - * @brief GF(2^8) vector multiply with 5 accumulate. AVX2 version. - * @requires AVX2 - */ -void gf_5vect_mad_avx2(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char **dest); - -/** - * @brief GF(2^8) vector multiply with 6 accumulate. SSE version. - * @requires SSE4.1 - */ -void gf_6vect_mad_sse(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char **dest); -/** - * @brief GF(2^8) vector multiply with 6 accumulate. AVX version. - * @requires AVX - */ -void gf_6vect_mad_avx(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char **dest); - -/** - * @brief GF(2^8) vector multiply with 6 accumulate. AVX2 version. - * @requires AVX2 - */ -void gf_6vect_mad_avx2(int len, int vec, int vec_i, unsigned char *gftbls, unsigned char *src, - unsigned char **dest); - - -/********************************************************************** - * The remaining are lib support functions used in GF(2^8) operations. - */ - -/** - * @brief Single element GF(2^8) multiply. - * - * @param a Multiplicand a - * @param b Multiplicand b - * @returns Product of a and b in GF(2^8) - */ - -unsigned char gf_mul(unsigned char a, unsigned char b); - -/** - * @brief Single element GF(2^8) inverse. - * - * @param a Input element - * @returns Field element b such that a x b = {1} - */ - -unsigned char gf_inv(unsigned char a); - -/** - * @brief Generate a matrix of coefficients to be used for encoding. - * - * Vandermonde matrix example of encoding coefficients where high portion of - * matrix is identity matrix I and lower portion is constructed as 2^{i*(j-k+1)} - * i:{0,k-1} j:{k,m-1}. Commonly used method for choosing coefficients in - * erasure encoding but does not guarantee invertable for every sub matrix. For - * large k it is possible to find cases where the decode matrix chosen from - * sources and parity not in erasure are not invertable. Users may want to - * adjust for k > 5. - * - * @param a [mxk] array to hold coefficients - * @param m number of rows in matrix corresponding to srcs + parity. - * @param k number of columns in matrix corresponding to srcs. - * @returns none - */ - -void gf_gen_rs_matrix(unsigned char *a, int m, int k); - -/** - * @brief Generate a Cauchy matrix of coefficients to be used for encoding. - * - * Cauchy matrix example of encoding coefficients where high portion of matrix - * is identity matrix I and lower portion is constructed as 1/(i + j) | i != j, - * i:{0,k-1} j:{k,m-1}. Any sub-matrix of a Cauchy matrix should be invertable. - * - * @param a [mxk] array to hold coefficients - * @param m number of rows in matrix corresponding to srcs + parity. - * @param k number of columns in matrix corresponding to srcs. - * @returns none - */ - -void gf_gen_cauchy1_matrix(unsigned char *a, int m, int k); - -/** - * @brief Invert a matrix in GF(2^8) - * - * @param in input matrix - * @param out output matrix such that [in] x [out] = [I] - identity matrix - * @param n size of matrix [nxn] - * @returns 0 successful, other fail on singular input matrix - */ - -int gf_invert_matrix(unsigned char *in, unsigned char *out, const int n); - - -/*************************************************************/ - -#ifdef __cplusplus -} -#endif - -#endif //_ERASURE_CODE_H_ diff --git a/pkg/erasure/ec_highlevel_func.c b/pkg/erasure/ec_highlevel_func.c deleted file mode 100644 index 9b9c8dc0f..000000000 --- a/pkg/erasure/ec_highlevel_func.c +++ /dev/null @@ -1,267 +0,0 @@ -/********************************************************************** - Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -**********************************************************************/ -#include -#include "ec_code.h" -#include "ec_types.h" - -void ec_init_tables(int k, int rows, unsigned char *a, unsigned char *g_tbls) -{ - int i, j; - - for (i = 0; i < rows; i++) { - for (j = 0; j < k; j++) { - gf_vect_mul_init(*a++, g_tbls); - g_tbls += 32; - } - } -} - -void ec_encode_data_sse(int len, int k, int rows, unsigned char *g_tbls, unsigned char **data, - unsigned char **coding) -{ - - if (len < 16) { - ec_encode_data_base(len, k, rows, g_tbls, data, coding); - return; - } - - while (rows >= 4) { - gf_4vect_dot_prod_sse(len, k, g_tbls, data, coding); - g_tbls += 4 * k * 32; - coding += 4; - rows -= 4; - } - switch (rows) { - case 3: - gf_3vect_dot_prod_sse(len, k, g_tbls, data, coding); - break; - case 2: - gf_2vect_dot_prod_sse(len, k, g_tbls, data, coding); - break; - case 1: - gf_vect_dot_prod_sse(len, k, g_tbls, data, *coding); - break; - case 0: - break; - } - -} - -void ec_encode_data_avx(int len, int k, int rows, unsigned char *g_tbls, unsigned char **data, - unsigned char **coding) -{ - if (len < 16) { - ec_encode_data_base(len, k, rows, g_tbls, data, coding); - return; - } - - while (rows >= 4) { - gf_4vect_dot_prod_avx(len, k, g_tbls, data, coding); - g_tbls += 4 * k * 32; - coding += 4; - rows -= 4; - } - switch (rows) { - case 3: - gf_3vect_dot_prod_avx(len, k, g_tbls, data, coding); - break; - case 2: - gf_2vect_dot_prod_avx(len, k, g_tbls, data, coding); - break; - case 1: - gf_vect_dot_prod_avx(len, k, g_tbls, data, *coding); - break; - case 0: - break; - } - -} - -void ec_encode_data_avx2(int len, int k, int rows, unsigned char *g_tbls, unsigned char **data, - unsigned char **coding) -{ - - if (len < 32) { - ec_encode_data_base(len, k, rows, g_tbls, data, coding); - return; - } - - while (rows >= 4) { - gf_4vect_dot_prod_avx2(len, k, g_tbls, data, coding); - g_tbls += 4 * k * 32; - coding += 4; - rows -= 4; - } - switch (rows) { - case 3: - gf_3vect_dot_prod_avx2(len, k, g_tbls, data, coding); - break; - case 2: - gf_2vect_dot_prod_avx2(len, k, g_tbls, data, coding); - break; - case 1: - gf_vect_dot_prod_avx2(len, k, g_tbls, data, *coding); - break; - case 0: - break; - } - -} - -#if __WORDSIZE == 64 || _WIN64 || __x86_64__ - -void ec_encode_data_update_sse(int len, int k, int rows, int vec_i, unsigned char *g_tbls, - unsigned char *data, unsigned char **coding) -{ - if (len < 16) { - ec_encode_data_update_base(len, k, rows, vec_i, g_tbls, data, coding); - return; - } - - while (rows > 6) { - gf_6vect_mad_sse(len, k, vec_i, g_tbls, data, coding); - g_tbls += 6 * k * 32; - coding += 6; - rows -= 6; - } - switch (rows) { - case 6: - gf_6vect_mad_sse(len, k, vec_i, g_tbls, data, coding); - break; - case 5: - gf_5vect_mad_sse(len, k, vec_i, g_tbls, data, coding); - break; - case 4: - gf_4vect_mad_sse(len, k, vec_i, g_tbls, data, coding); - break; - case 3: - gf_3vect_mad_sse(len, k, vec_i, g_tbls, data, coding); - break; - case 2: - gf_2vect_mad_sse(len, k, vec_i, g_tbls, data, coding); - break; - case 1: - gf_vect_mad_sse(len, k, vec_i, g_tbls, data, *coding); - break; - case 0: - break; - } - -} - -void ec_encode_data_update_avx(int len, int k, int rows, int vec_i, unsigned char *g_tbls, - unsigned char *data, unsigned char **coding) -{ - if (len < 16) { - ec_encode_data_update_base(len, k, rows, vec_i, g_tbls, data, coding); - return; - } - while (rows > 6) { - gf_6vect_mad_avx(len, k, vec_i, g_tbls, data, coding); - g_tbls += 6 * k * 32; - coding += 6; - rows -= 6; - } - switch (rows) { - case 6: - gf_6vect_mad_avx(len, k, vec_i, g_tbls, data, coding); - break; - case 5: - gf_5vect_mad_avx(len, k, vec_i, g_tbls, data, coding); - break; - case 4: - gf_4vect_mad_avx(len, k, vec_i, g_tbls, data, coding); - break; - case 3: - gf_3vect_mad_avx(len, k, vec_i, g_tbls, data, coding); - break; - case 2: - gf_2vect_mad_avx(len, k, vec_i, g_tbls, data, coding); - break; - case 1: - gf_vect_mad_avx(len, k, vec_i, g_tbls, data, *coding); - break; - case 0: - break; - } - -} - -void ec_encode_data_update_avx2(int len, int k, int rows, int vec_i, unsigned char *g_tbls, - unsigned char *data, unsigned char **coding) -{ - if (len < 32) { - ec_encode_data_update_base(len, k, rows, vec_i, g_tbls, data, coding); - return; - } - while (rows > 6) { - gf_6vect_mad_avx2(len, k, vec_i, g_tbls, data, coding); - g_tbls += 6 * k * 32; - coding += 6; - rows -= 6; - } - switch (rows) { - case 6: - gf_6vect_mad_avx2(len, k, vec_i, g_tbls, data, coding); - break; - case 5: - gf_5vect_mad_avx2(len, k, vec_i, g_tbls, data, coding); - break; - case 4: - gf_4vect_mad_avx2(len, k, vec_i, g_tbls, data, coding); - break; - case 3: - gf_3vect_mad_avx2(len, k, vec_i, g_tbls, data, coding); - break; - case 2: - gf_2vect_mad_avx2(len, k, vec_i, g_tbls, data, coding); - break; - case 1: - gf_vect_mad_avx2(len, k, vec_i, g_tbls, data, *coding); - break; - case 0: - break; - } - -} - -#endif //__WORDSIZE == 64 || _WIN64 || __x86_64__ - -struct slver { - UINT16 snum; - UINT8 ver; - UINT8 core; -}; - -// Version info -struct slver ec_init_tables_slver_00010068; -struct slver ec_init_tables_slver = { 0x0068, 0x01, 0x00 }; - -struct slver ec_encode_data_sse_slver_00020069; -struct slver ec_encode_data_sse_slver = { 0x0069, 0x02, 0x00 }; diff --git a/pkg/erasure/ec_minio_common.h b/pkg/erasure/ec_minio_common.h deleted file mode 100644 index ee7965c22..000000000 --- a/pkg/erasure/ec_minio_common.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2014 Minio, 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. - */ - -#ifndef __COMMON_H__ -#define __COMMON_H__ - -#include - -int32_t minio_init_encoder (int k, int m, - unsigned char **encode_matrix, - unsigned char **encode_tbls); - -int32_t minio_init_decoder (int32_t *error_index, - int k, int n, int errs, - unsigned char *encoding_matrix, - unsigned char **decode_matrix, - unsigned char **decode_tbls, - uint32_t **decode_index); - -int32_t minio_get_source_target (int errs, int k, int m, - int32_t *error_index, - uint32_t *decode_index, - unsigned char **buffs, - unsigned char ***source, - unsigned char ***target); -#endif /* __COMMON_H__ */ diff --git a/pkg/erasure/ec_minio_decode.c b/pkg/erasure/ec_minio_decode.c deleted file mode 100644 index 8c6f683e7..000000000 --- a/pkg/erasure/ec_minio_decode.c +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2014 Minio, 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. - */ - -#include -#include -#include - -#include "ec.h" -#include "ec_minio_common.h" - -static -int32_t _minio_src_index_in_error (int r, int32_t *error_index, int errs) -{ - int i; - for (i = 0; i < errs; i++) { - if (error_index[i] == r) { - // true - return 1; - } - } - // false - return 0; -} - -// Separate out source data and target buffers -int32_t minio_get_source_target (int errs, int k, int m, - int32_t *error_index, - uint32_t *decode_index, - unsigned char **buffs, - unsigned char ***source, - unsigned char ***target) -{ - int i; - unsigned char *tmp_source[k]; - unsigned char *tmp_target[m]; - - if (k < 0 || m < 0) { - return -1; - } - - memset (tmp_source, 0, k); - memset (tmp_target, 0, m); - - for (i = 0; i < k; i++) { - tmp_source[i] = (unsigned char *) buffs[decode_index[i]]; - } - - for (i = 0; i < m; i++) { - if (i < errs) - tmp_target[i] = (unsigned char *) buffs[error_index[i]]; - } - - *source = tmp_source; - *target = tmp_target; - - return 0; -} - -/* - Generate decode matrix during the decoding phase -*/ - -int minio_init_decoder (int32_t *error_index, - int k, int n, int errs, - unsigned char *encode_matrix, - unsigned char **decode_matrix, - unsigned char **decode_tbls, - uint32_t **decode_index) -{ - int i, j, r, l; - - uint32_t *tmp_decode_index = (uint32_t *) malloc(sizeof(uint32_t) * k); - unsigned char *input_matrix; - unsigned char *inverse_matrix; - unsigned char *tmp_decode_matrix; - unsigned char *tmp_decode_tbls; - - input_matrix = (unsigned char *) malloc(sizeof(unsigned char) * k * n); - inverse_matrix = (unsigned char *) malloc(sizeof(unsigned char) * k * n); - tmp_decode_matrix = (unsigned char *) malloc(sizeof(unsigned char) * k * n);; - tmp_decode_tbls = (unsigned char *) malloc(sizeof(unsigned char) * k * n * 32); - - for (i = 0, r = 0; i < k; i++, r++) { - while (_minio_src_index_in_error(r, error_index, errs)) - r++; - for (j = 0; j < k; j++) { - input_matrix[k * i + j] = encode_matrix[k * r + j]; - } - tmp_decode_index[i] = r; - } - - // Not all vandermonde matrix can be inverted - if (gf_invert_matrix(input_matrix, inverse_matrix, k) < 0) { - free(tmp_decode_matrix); - free(tmp_decode_tbls); - free(tmp_decode_index); - return -1; - } - - for (l = 0; l < errs; l++) { - if (error_index[l] < k) { - // decoding matrix elements for data chunks - for (j = 0; j < k; j++) { - tmp_decode_matrix[k * l + j] = - inverse_matrix[k * - error_index[l] + j]; - } - } else { - // decoding matrix element for coding chunks - for (i = 0; i < k; i++) { - unsigned char s = 0; - for (j = 0; j < k; j++) { - s ^= gf_mul(inverse_matrix[j * k + i], - encode_matrix[k * - error_index[l] + j]); - } - tmp_decode_matrix[k * l + i] = s; - } - } - } - - ec_init_tables (k, errs, tmp_decode_matrix, tmp_decode_tbls); - - *decode_matrix = tmp_decode_matrix; - *decode_tbls = tmp_decode_tbls; - *decode_index = tmp_decode_index; - - return 0; -} diff --git a/pkg/erasure/ec_minio_encode.c b/pkg/erasure/ec_minio_encode.c deleted file mode 100644 index 8270bd1a6..000000000 --- a/pkg/erasure/ec_minio_encode.c +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2014 Minio, 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. - */ - -#include -#include - -#include "ec.h" -#include "ec_minio_common.h" - -/* - Generate encode matrix during the encoding phase -*/ - -int32_t minio_init_encoder (int k, int m, unsigned char **encode_matrix, unsigned char **encode_tbls) -{ - unsigned char *tmp_matrix; - unsigned char *tmp_tbls; - - tmp_matrix = (unsigned char *) malloc (k * (k + m)); - tmp_tbls = (unsigned char *) malloc (k * (k + m) * 32); - - if (k < 5) { - /* - Commonly used method for choosing coefficients in erasure - encoding but does not guarantee invertable for every sub - matrix. For large k it is possible to find cases where the - decode matrix chosen from sources and parity not in erasure - are not invertable. Users may want to adjust for k > 5. - -- Intel - */ - gf_gen_rs_matrix (tmp_matrix, k + m, k); - } else { - gf_gen_cauchy1_matrix (tmp_matrix, k + m, k); - } - - ec_init_tables(k, m, &tmp_matrix[k * k], tmp_tbls); - - *encode_matrix = tmp_matrix; - *encode_tbls = tmp_tbls; - - return 0; -} diff --git a/pkg/erasure/ec_multibinary.asm b/pkg/erasure/ec_multibinary.asm deleted file mode 100644 index 5589e654e..000000000 --- a/pkg/erasure/ec_multibinary.asm +++ /dev/null @@ -1,404 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -%ifidn __OUTPUT_FORMAT__, elf64 - %define WRT_OPT wrt ..plt -%else - %define WRT_OPT -%endif - -%include "ec_reg_sizes.asm" - -%ifidn __OUTPUT_FORMAT__, elf32 - -[bits 32] - - %define def_wrd dd - %define wrd_sz dword - %define arg1 esi - %define arg2 eax - %define arg3 ebx - %define arg4 ecx - %define arg5 edx - -%else - - default rel - [bits 64] - - %define def_wrd dq - %define wrd_sz qword - %define arg1 rsi - %define arg2 rax - %define arg3 rbx - %define arg4 rcx - %define arg5 rdx - - - extern ec_encode_data_update_sse - extern ec_encode_data_update_avx - extern ec_encode_data_update_avx2 - extern gf_vect_mul_sse - extern gf_vect_mul_avx - - extern gf_vect_mad_sse - extern gf_vect_mad_avx - extern gf_vect_mad_avx2 -%endif - -extern gf_vect_mul_base -extern ec_encode_data_base -extern ec_encode_data_update_base -extern gf_vect_dot_prod_base -extern gf_vect_mad_base - -extern gf_vect_dot_prod_sse -extern gf_vect_dot_prod_avx -extern gf_vect_dot_prod_avx2 -extern ec_encode_data_sse -extern ec_encode_data_avx -extern ec_encode_data_avx2 - - -section .data -;;; *_mbinit are initial values for *_dispatched; is updated on first call. -;;; Therefore, *_dispatch_init is only executed on first call. - -ec_encode_data_dispatched: - def_wrd ec_encode_data_mbinit - -gf_vect_mul_dispatched: - def_wrd gf_vect_mul_mbinit - -gf_vect_dot_prod_dispatched: - def_wrd gf_vect_dot_prod_mbinit - -ec_encode_data_update_dispatched: - def_wrd ec_encode_data_update_mbinit - -gf_vect_mad_dispatched: - def_wrd gf_vect_mad_mbinit - -section .text -;;;; -; ec_encode_data multibinary function -;;;; -global ec_encode_data:function -ec_encode_data_mbinit: - call ec_encode_data_dispatch_init - -ec_encode_data: - jmp wrd_sz [ec_encode_data_dispatched] - -ec_encode_data_dispatch_init: - push arg1 - push arg2 - push arg3 - push arg4 - push arg5 - lea arg1, [ec_encode_data_base WRT_OPT] ; Default - - mov eax, 1 - cpuid - lea arg3, [ec_encode_data_sse WRT_OPT] - test ecx, FLAG_CPUID1_ECX_SSE4_1 - cmovne arg1, arg3 - - and ecx, (FLAG_CPUID1_ECX_AVX | FLAG_CPUID1_ECX_OSXSAVE) - cmp ecx, (FLAG_CPUID1_ECX_AVX | FLAG_CPUID1_ECX_OSXSAVE) - lea arg3, [ec_encode_data_avx WRT_OPT] - - jne _done_ec_encode_data_init - mov arg1, arg3 - - ;; Try for AVX2 - xor ecx, ecx - mov eax, 7 - cpuid - test ebx, FLAG_CPUID1_EBX_AVX2 - lea arg3, [ec_encode_data_avx2 WRT_OPT] - cmovne arg1, arg3 - ;; Does it have xmm and ymm support - xor ecx, ecx - xgetbv - and eax, FLAG_XGETBV_EAX_XMM_YMM - cmp eax, FLAG_XGETBV_EAX_XMM_YMM - je _done_ec_encode_data_init - lea arg1, [ec_encode_data_sse WRT_OPT] - -_done_ec_encode_data_init: - pop arg5 - pop arg4 - pop arg3 - pop arg2 - mov [ec_encode_data_dispatched], arg1 - pop arg1 - ret - -;;;; -; gf_vect_mul multibinary function -;;;; -global gf_vect_mul:function -gf_vect_mul_mbinit: - call gf_vect_mul_dispatch_init - -gf_vect_mul: - jmp wrd_sz [gf_vect_mul_dispatched] - -gf_vect_mul_dispatch_init: - push arg1 -%ifidn __OUTPUT_FORMAT__, elf32 ;; 32-bit check - lea arg1, [gf_vect_mul_base] -%else - push rax - push rbx - push rcx - push rdx - lea arg1, [gf_vect_mul_base WRT_OPT] ; Default - - mov eax, 1 - cpuid - test ecx, FLAG_CPUID1_ECX_SSE4_2 - lea rbx, [gf_vect_mul_sse WRT_OPT] - je _done_gf_vect_mul_dispatch_init - mov arg1, rbx - - ;; Try for AVX - and ecx, (FLAG_CPUID1_ECX_OSXSAVE | FLAG_CPUID1_ECX_AVX) - cmp ecx, (FLAG_CPUID1_ECX_OSXSAVE | FLAG_CPUID1_ECX_AVX) - jne _done_gf_vect_mul_dispatch_init - - ;; Does it have xmm and ymm support - xor ecx, ecx - xgetbv - and eax, FLAG_XGETBV_EAX_XMM_YMM - cmp eax, FLAG_XGETBV_EAX_XMM_YMM - jne _done_gf_vect_mul_dispatch_init - lea arg1, [gf_vect_mul_avx WRT_OPT] - -_done_gf_vect_mul_dispatch_init: - pop rdx - pop rcx - pop rbx - pop rax -%endif ;; END 32-bit check - mov [gf_vect_mul_dispatched], arg1 - pop arg1 - ret - -;;;; -; ec_encode_data_update multibinary function -;;;; -global ec_encode_data_update:function -ec_encode_data_update_mbinit: - call ec_encode_data_update_dispatch_init - -ec_encode_data_update: - jmp wrd_sz [ec_encode_data_update_dispatched] - -ec_encode_data_update_dispatch_init: - push arg1 -%ifidn __OUTPUT_FORMAT__, elf32 ;; 32-bit check - lea arg1, [ec_encode_data_update_base] -%else - push rax - push rbx - push rcx - push rdx - lea arg1, [ec_encode_data_update_base WRT_OPT] ; Default - - mov eax, 1 - cpuid - lea rbx, [ec_encode_data_update_sse WRT_OPT] - test ecx, FLAG_CPUID1_ECX_SSE4_1 - cmovne arg1, rbx - - and ecx, (FLAG_CPUID1_ECX_AVX | FLAG_CPUID1_ECX_OSXSAVE) - cmp ecx, (FLAG_CPUID1_ECX_AVX | FLAG_CPUID1_ECX_OSXSAVE) - lea rbx, [ec_encode_data_update_avx WRT_OPT] - - jne _done_ec_encode_data_update_init - mov rsi, rbx - - ;; Try for AVX2 - xor ecx, ecx - mov eax, 7 - cpuid - test ebx, FLAG_CPUID1_EBX_AVX2 - lea rbx, [ec_encode_data_update_avx2 WRT_OPT] - cmovne rsi, rbx - - ;; Does it have xmm and ymm support - xor ecx, ecx - xgetbv - and eax, FLAG_XGETBV_EAX_XMM_YMM - cmp eax, FLAG_XGETBV_EAX_XMM_YMM - je _done_ec_encode_data_update_init - lea rsi, [ec_encode_data_update_sse WRT_OPT] - -_done_ec_encode_data_update_init: - pop rdx - pop rcx - pop rbx - pop rax -%endif ;; END 32-bit check - mov [ec_encode_data_update_dispatched], arg1 - pop arg1 - ret - -;;;; -; gf_vect_dot_prod multibinary function -;;;; -global gf_vect_dot_prod:function -gf_vect_dot_prod_mbinit: - call gf_vect_dot_prod_dispatch_init - -gf_vect_dot_prod: - jmp wrd_sz [gf_vect_dot_prod_dispatched] - -gf_vect_dot_prod_dispatch_init: - push arg1 - push arg2 - push arg3 - push arg4 - push arg5 - lea arg1, [gf_vect_dot_prod_base WRT_OPT] ; Default - - mov eax, 1 - cpuid - lea arg3, [gf_vect_dot_prod_sse WRT_OPT] - test ecx, FLAG_CPUID1_ECX_SSE4_1 - cmovne arg1, arg3 - - and ecx, (FLAG_CPUID1_ECX_AVX | FLAG_CPUID1_ECX_OSXSAVE) - cmp ecx, (FLAG_CPUID1_ECX_AVX | FLAG_CPUID1_ECX_OSXSAVE) - lea arg3, [gf_vect_dot_prod_avx WRT_OPT] - - jne _done_gf_vect_dot_prod_init - mov arg1, arg3 - - ;; Try for AVX2 - xor ecx, ecx - mov eax, 7 - cpuid - test ebx, FLAG_CPUID1_EBX_AVX2 - lea arg3, [gf_vect_dot_prod_avx2 WRT_OPT] - cmovne arg1, arg3 - ;; Does it have xmm and ymm support - xor ecx, ecx - xgetbv - and eax, FLAG_XGETBV_EAX_XMM_YMM - cmp eax, FLAG_XGETBV_EAX_XMM_YMM - je _done_gf_vect_dot_prod_init - lea arg1, [gf_vect_dot_prod_sse WRT_OPT] - -_done_gf_vect_dot_prod_init: - pop arg5 - pop arg4 - pop arg3 - pop arg2 - mov [gf_vect_dot_prod_dispatched], arg1 - pop arg1 - ret - -;;;; -; gf_vect_mad multibinary function -;;;; -global gf_vect_mad:function -gf_vect_mad_mbinit: - call gf_vect_mad_dispatch_init - -gf_vect_mad: - jmp wrd_sz [gf_vect_mad_dispatched] - -gf_vect_mad_dispatch_init: - push arg1 -%ifidn __OUTPUT_FORMAT__, elf32 ;; 32-bit check - lea arg1, [gf_vect_mad_base] -%else - push rax - push rbx - push rcx - push rdx - lea arg1, [gf_vect_mad_base WRT_OPT] ; Default - - mov eax, 1 - cpuid - lea rbx, [gf_vect_mad_sse WRT_OPT] - test ecx, FLAG_CPUID1_ECX_SSE4_1 - cmovne arg1, rbx - - and ecx, (FLAG_CPUID1_ECX_AVX | FLAG_CPUID1_ECX_OSXSAVE) - cmp ecx, (FLAG_CPUID1_ECX_AVX | FLAG_CPUID1_ECX_OSXSAVE) - lea rbx, [gf_vect_mad_avx WRT_OPT] - - jne _done_gf_vect_mad_init - mov rsi, rbx - - ;; Try for AVX2 - xor ecx, ecx - mov eax, 7 - cpuid - test ebx, FLAG_CPUID1_EBX_AVX2 - lea rbx, [gf_vect_mad_avx2 WRT_OPT] - cmovne rsi, rbx - - ;; Does it have xmm and ymm support - xor ecx, ecx - xgetbv - and eax, FLAG_XGETBV_EAX_XMM_YMM - cmp eax, FLAG_XGETBV_EAX_XMM_YMM - je _done_gf_vect_mad_init - lea rsi, [gf_vect_mad_sse WRT_OPT] - -_done_gf_vect_mad_init: - pop rdx - pop rcx - pop rbx - pop rax -%endif ;; END 32-bit check - mov [gf_vect_mad_dispatched], arg1 - pop arg1 - ret - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro - -;;; func core, ver, snum -slversion ec_encode_data, 00, 03, 0133 -slversion gf_vect_mul, 00, 02, 0134 -slversion ec_encode_data_update, 00, 02, 0212 -slversion gf_vect_dot_prod, 00, 02, 0138 -slversion gf_vect_mad, 00, 01, 0213 diff --git a/pkg/erasure/ec_reg_sizes.asm b/pkg/erasure/ec_reg_sizes.asm deleted file mode 100644 index c6692b417..000000000 --- a/pkg/erasure/ec_reg_sizes.asm +++ /dev/null @@ -1,107 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -%define EFLAGS_HAS_CPUID (1<<21) -%define FLAG_CPUID1_ECX_CLMUL (1<<1) -%define FLAG_CPUID1_EDX_SSE2 (1<<26) -%define FLAG_CPUID1_ECX_SSE3 (1) -%define FLAG_CPUID1_ECX_SSE4_1 (1<<19) -%define FLAG_CPUID1_ECX_SSE4_2 (1<<20) -%define FLAG_CPUID1_ECX_POPCNT (1<<23) -%define FLAG_CPUID1_ECX_AESNI (1<<25) -%define FLAG_CPUID1_ECX_OSXSAVE (1<<27) -%define FLAG_CPUID1_ECX_AVX (1<<28) -%define FLAG_CPUID1_EBX_AVX2 (1<<5) -%define FLAG_XGETBV_EAX_XMM_YMM 0x6 - -%define FLAG_CPUID1_EAX_AVOTON 0x000406d0 - -; define d and w variants for registers - -%define raxd eax -%define raxw ax -%define raxb al - -%define rbxd ebx -%define rbxw bx -%define rbxb bl - -%define rcxd ecx -%define rcxw cx -%define rcxb cl - -%define rdxd edx -%define rdxw dx -%define rdxb dl - -%define rsid esi -%define rsiw si -%define rsib sil - -%define rdid edi -%define rdiw di -%define rdib dil - -%define rbpd ebp -%define rbpw bp -%define rbpb bpl - -%define ymm0x xmm0 -%define ymm1x xmm1 -%define ymm2x xmm2 -%define ymm3x xmm3 -%define ymm4x xmm4 -%define ymm5x xmm5 -%define ymm6x xmm6 -%define ymm7x xmm7 -%define ymm8x xmm8 -%define ymm9x xmm9 -%define ymm10x xmm10 -%define ymm11x xmm11 -%define ymm12x xmm12 -%define ymm13x xmm13 -%define ymm14x xmm14 -%define ymm15x xmm15 - -%define DWORD(reg) reg %+ d -%define WORD(reg) reg %+ w -%define BYTE(reg) reg %+ b - -%define XWORD(reg) reg %+ x - -%ifidn __OUTPUT_FORMAT__,elf32 -section .note.GNU-stack noalloc noexec nowrite progbits -section .text -%endif - -%ifidn __OUTPUT_FORMAT__,elf64 -section .note.GNU-stack noalloc noexec nowrite progbits -section .text -%endif - diff --git a/pkg/erasure/ec_types.h b/pkg/erasure/ec_types.h deleted file mode 100644 index 62e61e2dd..000000000 --- a/pkg/erasure/ec_types.h +++ /dev/null @@ -1,80 +0,0 @@ -/********************************************************************** - Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -**********************************************************************/ - - -/** - * @file types.h - * @brief Defines standard width types. - * - */ - -#ifndef __TYPES_H -#define __TYPES_H - -#ifdef __cplusplus -extern "C" { -#endif - -#if !defined(__unix__) && !defined(__APPLE__) -#ifdef __MINGW32__ -# include <_mingw.h> -#endif -typedef unsigned __int64 UINT64; -typedef __int64 INT64; -typedef unsigned __int32 UINT32; -typedef unsigned __int16 UINT16; -typedef unsigned char UINT8; -#else -typedef unsigned long int UINT64; -typedef long int INT64; -typedef unsigned int UINT32; -typedef unsigned short int UINT16; -typedef unsigned char UINT8; -#endif - - -#if defined(__unix__) || defined(__APPLE__) -# define DECLARE_ALIGNED(decl, alignval) decl __attribute__((aligned(alignval))) -# define __forceinline static inline -#else -# define DECLARE_ALIGNED(decl, alignval) __declspec(align(alignval)) decl -# define posix_memalign(p, algn, len) (NULL == (*((char**)(p)) = (void*) _aligned_malloc(len, algn))) -#endif - -#ifdef DEBUG -# define DEBUG_PRINT(x) printf x -#else -# define DEBUG_PRINT(x) do {} while (0) -#endif - -#ifdef __cplusplus -} -#endif - -#endif //__TYPES_H diff --git a/pkg/erasure/erasure_decode.go b/pkg/erasure/erasure_decode.go deleted file mode 100644 index 20523f7b0..000000000 --- a/pkg/erasure/erasure_decode.go +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2014 Minio, 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 erasure - -// #cgo CFLAGS: -O0 -// #include -// #include "ec.h" -// #include "ec_minio_common.h" -import "C" -import ( - "errors" - "fmt" - "unsafe" -) - -// Decode decodes erasure coded blocks of data into its original -// form. Erasure coded data contains K data blocks and M parity -// blocks. Decode can withstand data loss up to any M number of blocks. -// -// "encodedDataBlocks" is an array of K data blocks and M parity -// blocks. Data blocks are position and order dependent. Missing blocks -// are set to "nil". There must be at least "K" number of data|parity -// blocks. -// -// "dataLen" is the length of original source data -func (e *Erasure) Decode(encodedDataBlocks [][]byte, dataLen int) (decodedData []byte, err error) { - e.mutex.Lock() - defer e.mutex.Unlock() - - var source, target **C.uchar - - k := int(e.params.K) - m := int(e.params.M) - n := k + m - // We need the data and parity blocks preserved in the same order. Missing blocks are set to nil. - if len(encodedDataBlocks) != n { - msg := fmt.Sprintf("Encoded data blocks slice must of length [%d]", n) - return nil, errors.New(msg) - } - - // Length of a single encoded block - encodedBlockLen := GetEncodedBlockLen(dataLen, uint8(k)) - - // Keep track of errors per block. - missingEncodedBlocks := make([]int, n+1) - var missingEncodedBlocksCount int - - // Check for the missing encoded blocks - for i := range encodedDataBlocks { - if encodedDataBlocks[i] == nil || len(encodedDataBlocks[i]) == 0 { - missingEncodedBlocks[missingEncodedBlocksCount] = i - missingEncodedBlocksCount++ - } - } - - // Cannot reconstruct original data. Need at least M number of data or parity blocks. - if missingEncodedBlocksCount > m { - return nil, fmt.Errorf("Cannot reconstruct original data. Need at least [%d] data or parity blocks", m) - } - - // Convert from Go int slice to C int array - missingEncodedBlocksC := intSlice2CIntArray(missingEncodedBlocks[:missingEncodedBlocksCount]) - - // Allocate buffer for the missing blocks - for i := range encodedDataBlocks { - if encodedDataBlocks[i] == nil || len(encodedDataBlocks[i]) == 0 { - encodedDataBlocks[i] = make([]byte, encodedBlockLen) - } - } - - // If not already initialized, recompute and cache - if e.decodeMatrix == nil || e.decodeTbls == nil || e.decodeIndex == nil { - var decodeMatrix, decodeTbls *C.uchar - var decodeIndex *C.uint32_t - - C.minio_init_decoder(missingEncodedBlocksC, C.int(k), C.int(n), C.int(missingEncodedBlocksCount), - e.encodeMatrix, &decodeMatrix, &decodeTbls, &decodeIndex) - - // cache this for future needs - e.decodeMatrix = decodeMatrix - e.decodeTbls = decodeTbls - e.decodeIndex = decodeIndex - } - - // Make a slice of pointers to encoded blocks. Necessary to bridge to the C world. - pointers := make([]*byte, n) - for i := range encodedDataBlocks { - pointers[i] = &encodedDataBlocks[i][0] - } - - // Get pointers to source "data" and target "parity" blocks from the output byte array. - ret := C.minio_get_source_target(C.int(missingEncodedBlocksCount), C.int(k), C.int(m), missingEncodedBlocksC, - e.decodeIndex, (**C.uchar)(unsafe.Pointer(&pointers[0])), &source, &target) - if int(ret) == -1 { - return nil, errors.New("Unable to decode data") - } - - // Decode data - C.ec_encode_data(C.int(encodedBlockLen), C.int(k), C.int(missingEncodedBlocksCount), e.decodeTbls, - source, target) - - // Allocate buffer to output buffer - decodedData = make([]byte, 0, encodedBlockLen*int(k)) - for i := 0; i < int(k); i++ { - decodedData = append(decodedData, encodedDataBlocks[i]...) - } - - return decodedData[:dataLen], nil -} diff --git a/pkg/erasure/erasure_encode.go b/pkg/erasure/erasure_encode.go deleted file mode 100644 index 752e5a2a7..000000000 --- a/pkg/erasure/erasure_encode.go +++ /dev/null @@ -1,174 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2014 Minio, 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 erasure - -// #include -// #include "ec.h" -// #include "ec_minio_common.h" -import "C" -import ( - "errors" - "sync" - "unsafe" -) - -// Block alignment -const ( - SIMDAlign = 32 -) - -// Params is a configuration set for building an encoder. It is created using ValidateParams(). -type Params struct { - K uint8 - M uint8 -} - -// Erasure is an object used to encode and decode data. -type Erasure struct { - params *Params - encodeMatrix, encodeTbls *C.uchar - decodeMatrix, decodeTbls *C.uchar - decodeIndex *C.uint32_t - mutex *sync.Mutex -} - -// ValidateParams creates an Params object. -// -// k and m represent the matrix size, which corresponds to the protection level -// technique is the matrix type. Valid inputs are Cauchy (recommended) or Vandermonde. -// -func ValidateParams(k, m uint8) (*Params, error) { - if k < 1 { - return nil, errors.New("k cannot be zero") - } - - if m < 1 { - return nil, errors.New("m cannot be zero") - } - - if k+m > 255 { - return nil, errors.New("(k + m) cannot be bigger than Galois field GF(2^8) - 1") - } - - return &Params{ - K: k, - M: m, - }, nil -} - -// NewErasure creates an encoder object with a given set of parameters. -func NewErasure(ep *Params) *Erasure { - var k = C.int(ep.K) - var m = C.int(ep.M) - - var encodeMatrix *C.uchar - var encodeTbls *C.uchar - - C.minio_init_encoder(k, m, &encodeMatrix, &encodeTbls) - - return &Erasure{ - params: ep, - encodeMatrix: encodeMatrix, - encodeTbls: encodeTbls, - decodeMatrix: nil, - decodeTbls: nil, - decodeIndex: nil, - mutex: new(sync.Mutex), - } -} - -// GetEncodedBlocksLen - total length of all encoded blocks -func GetEncodedBlocksLen(inputLen int, k, m uint8) (outputLen int) { - outputLen = GetEncodedBlockLen(inputLen, k) * int(k+m) - return outputLen -} - -// GetEncodedBlockLen - length per block of encoded blocks -func GetEncodedBlockLen(inputLen int, k uint8) (encodedOutputLen int) { - alignment := int(k) * SIMDAlign - remainder := inputLen % alignment - - paddedInputLen := inputLen - if remainder != 0 { - paddedInputLen = inputLen + (alignment - remainder) - } - encodedOutputLen = paddedInputLen / int(k) - return encodedOutputLen -} - -// Encode erasure codes a block of data in "k" data blocks and "m" parity blocks. -// Output is [k+m][]blocks of data and parity slices. -func (e *Erasure) Encode(inputData []byte) (encodedBlocks [][]byte, err error) { - e.mutex.Lock() - defer e.mutex.Unlock() - - k := int(e.params.K) // "k" data blocks - m := int(e.params.M) // "m" parity blocks - n := k + m // "n" total encoded blocks - - // Length of a single encoded chunk. - // Total number of encoded chunks = "k" data + "m" parity blocks - encodedBlockLen := GetEncodedBlockLen(len(inputData), uint8(k)) - - // Length of total number of "k" data chunks - encodedDataBlocksLen := encodedBlockLen * k - - // Length of extra padding required for the data blocks. - encodedDataBlocksPadLen := encodedDataBlocksLen - len(inputData) - - // Extend inputData buffer to accommodate coded data blocks if necesssary - if encodedDataBlocksPadLen > 0 { - padding := make([]byte, encodedDataBlocksPadLen) - // Expand with new padded blocks to the byte array - inputData = append(inputData, padding...) - } - - // Extend inputData buffer to accommodate coded parity blocks - { // Local Scope - encodedParityBlocksLen := encodedBlockLen * m - parityBlocks := make([]byte, encodedParityBlocksLen) - inputData = append(inputData, parityBlocks...) - } - - // Allocate memory to the "encoded blocks" return buffer - encodedBlocks = make([][]byte, n) // Return buffer - - // Neccessary to bridge Go to the C world. C requires 2D arry of pointers to - // byte array. "encodedBlocks" is a 2D slice. - pointersToEncodedBlock := make([]*byte, n) // Pointers to encoded blocks. - - // Copy data block slices to encoded block buffer - for i := 0; i < k; i++ { - encodedBlocks[i] = inputData[i*encodedBlockLen : (i+1)*encodedBlockLen] - pointersToEncodedBlock[i] = &encodedBlocks[i][0] - } - - // Copy erasure block slices to encoded block buffer - for i := k; i < n; i++ { - encodedBlocks[i] = make([]byte, encodedBlockLen) - pointersToEncodedBlock[i] = &encodedBlocks[i][0] - } - - // Erasure code the data into K data blocks and M parity - // blocks. Only the parity blocks are filled. Data blocks remain - // intact. - C.ec_encode_data(C.int(encodedBlockLen), C.int(k), C.int(m), e.encodeTbls, - (**C.uchar)(unsafe.Pointer(&pointersToEncodedBlock[:k][0])), // Pointers to data blocks - (**C.uchar)(unsafe.Pointer(&pointersToEncodedBlock[k:][0]))) // Pointers to parity blocks - - return encodedBlocks, nil -} diff --git a/pkg/erasure/erasure_test.go b/pkg/erasure/erasure_test.go deleted file mode 100644 index 0ec5d9821..000000000 --- a/pkg/erasure/erasure_test.go +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2014 Minio, 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 erasure - -import ( - "bytes" - "testing" - - . "gopkg.in/check.v1" -) - -type MySuite struct{} - -var _ = Suite(&MySuite{}) - -func Test(t *testing.T) { TestingT(t) } - -const ( - k = 10 - m = 5 -) - -func corruptChunks(chunks [][]byte, errorIndex []int) [][]byte { - for _, err := range errorIndex { - chunks[err] = nil - } - return chunks -} - -func (s *MySuite) TestEncodeDecodeFailure(c *C) { - ep, err := ValidateParams(k, m) - c.Assert(err, IsNil) - - data := []byte("Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.") - - e := NewErasure(ep) - chunks, err := e.Encode(data) - c.Assert(err, IsNil) - - errorIndex := []int{0, 3, 5, 9, 11, 13} - chunks = corruptChunks(chunks, errorIndex) - - _, err = e.Decode(chunks, len(data)) - c.Assert(err, Not(IsNil)) -} - -func (s *MySuite) TestEncodeDecodeSuccess(c *C) { - ep, err := ValidateParams(k, m) - c.Assert(err, IsNil) - - data := []byte("Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.") - - e := NewErasure(ep) - chunks, err := e.Encode(data) - c.Assert(err, IsNil) - - errorIndex := []int{0, 3, 5, 9, 13} - chunks = corruptChunks(chunks, errorIndex) - - recoveredData, err := e.Decode(chunks, len(data)) - c.Assert(err, IsNil) - - if !bytes.Equal(data, recoveredData) { - c.Fatalf("Recovered data mismatches with original data") - } -} diff --git a/pkg/erasure/erasure_yasm_darwin.go b/pkg/erasure/erasure_yasm_darwin.go deleted file mode 100644 index 9dd2c7c8c..000000000 --- a/pkg/erasure/erasure_yasm_darwin.go +++ /dev/null @@ -1,43 +0,0 @@ -// !build amd64 - -package erasure - -//go:generate yasm -f macho64 --prefix=_ ec_multibinary.asm -o ec_multibinary.syso -//go:generate yasm -f macho64 --prefix=_ gf_2vect_mad_avx2.asm -o gf_2vect_mad_avx2.syso -//go:generate yasm -f macho64 --prefix=_ gf_2vect_mad_avx.asm -o gf_2vect_mad_avx.syso -//go:generate yasm -f macho64 --prefix=_ gf_2vect_mad_sse.asm -o gf_2vect_mad_sse.syso -//go:generate yasm -f macho64 --prefix=_ gf_3vect_mad_avx2.asm -o gf_3vect_mad_avx2.syso -//go:generate yasm -f macho64 --prefix=_ gf_3vect_mad_avx.asm -o gf_3vect_mad_avx.syso -//go:generate yasm -f macho64 --prefix=_ gf_3vect_mad_sse.asm -o gf_3vect_mad_sse.syso -//go:generate yasm -f macho64 --prefix=_ gf_4vect_mad_avx2.asm -o gf_4vect_mad_avx2.syso -//go:generate yasm -f macho64 --prefix=_ gf_4vect_mad_avx.asm -o gf_4vect_mad_avx.syso -//go:generate yasm -f macho64 --prefix=_ gf_4vect_mad_sse.asm -o gf_4vect_mad_sse.syso -//go:generate yasm -f macho64 --prefix=_ gf_5vect_mad_avx2.asm -o gf_5vect_mad_avx2.syso -//go:generate yasm -f macho64 --prefix=_ gf_5vect_mad_avx.asm -o gf_5vect_mad_avx.syso -//go:generate yasm -f macho64 --prefix=_ gf_5vect_mad_sse.asm -o gf_5vect_mad_sse.syso -//go:generate yasm -f macho64 --prefix=_ gf_6vect_mad_avx2.asm -o gf_6vect_mad_avx2.syso -//go:generate yasm -f macho64 --prefix=_ gf_6vect_mad_avx.asm -o gf_6vect_mad_avx.syso -//go:generate yasm -f macho64 --prefix=_ gf_6vect_mad_sse.asm -o gf_6vect_mad_sse.syso -//go:generate yasm -f macho64 --prefix=_ gf_vect_mad_avx2.asm -o gf_vect_mad_avx2.syso -//go:generate yasm -f macho64 --prefix=_ gf_vect_mad_avx.asm -o gf_vect_mad_avx.syso -//go:generate yasm -f macho64 --prefix=_ gf_vect_mad_sse.asm -o gf_vect_mad_sse.syso -//go:generate yasm -f macho64 --prefix=_ gf_2vect_dot_prod_avx2.asm -o gf_2vect_dot_prod_avx2.syso -//go:generate yasm -f macho64 --prefix=_ gf_2vect_dot_prod_avx.asm -o gf_2vect_dot_prod_avx.syso -//go:generate yasm -f macho64 --prefix=_ gf_2vect_dot_prod_sse.asm -o gf_2vect_dot_prod_sse.syso -//go:generate yasm -f macho64 --prefix=_ gf_3vect_dot_prod_avx2.asm -o gf_3vect_dot_prod_avx2.syso -//go:generate yasm -f macho64 --prefix=_ gf_3vect_dot_prod_avx.asm -o gf_3vect_dot_prod_avx.syso -//go:generate yasm -f macho64 --prefix=_ gf_3vect_dot_prod_sse.asm -o gf_3vect_dot_prod_sse.syso -//go:generate yasm -f macho64 --prefix=_ gf_4vect_dot_prod_avx2.asm -o gf_4vect_dot_prod_avx2.syso -//go:generate yasm -f macho64 --prefix=_ gf_4vect_dot_prod_avx.asm -o gf_4vect_dot_prod_avx.syso -//go:generate yasm -f macho64 --prefix=_ gf_4vect_dot_prod_sse.asm -o gf_4vect_dot_prod_sse.syso -//go:generate yasm -f macho64 --prefix=_ gf_5vect_dot_prod_avx2.asm -o gf_5vect_dot_prod_avx2.syso -//go:generate yasm -f macho64 --prefix=_ gf_5vect_dot_prod_avx.asm -o gf_5vect_dot_prod_avx.syso -//go:generate yasm -f macho64 --prefix=_ gf_5vect_dot_prod_sse.asm -o gf_5vect_dot_prod_sse.syso -//go:generate yasm -f macho64 --prefix=_ gf_6vect_dot_prod_avx2.asm -o gf_6vect_dot_prod_avx2.syso -//go:generate yasm -f macho64 --prefix=_ gf_6vect_dot_prod_avx.asm -o gf_6vect_dot_prod_avx.syso -//go:generate yasm -f macho64 --prefix=_ gf_6vect_dot_prod_sse.asm -o gf_6vect_dot_prod_sse.syso -//go:generate yasm -f macho64 --prefix=_ gf_vect_dot_prod_avx2.asm -o gf_vect_dot_prod_avx2.syso -//go:generate yasm -f macho64 --prefix=_ gf_vect_dot_prod_avx.asm -o gf_vect_dot_prod_avx.syso -//go:generate yasm -f macho64 --prefix=_ gf_vect_dot_prod_sse.asm -o gf_vect_dot_prod_sse.syso -//go:generate yasm -f macho64 --prefix=_ gf_vect_mul_avx.asm -o gf_vect_mul_avx.syso -//go:generate yasm -f macho64 --prefix=_ gf_vect_mul_sse.asm -o gf_vect_mul_sse.syso diff --git a/pkg/erasure/erasure_yasm_linux.go b/pkg/erasure/erasure_yasm_linux.go deleted file mode 100644 index 0574a7ccc..000000000 --- a/pkg/erasure/erasure_yasm_linux.go +++ /dev/null @@ -1,43 +0,0 @@ -// !build amd64 - -package erasure - -//go:generate yasm -f elf64 ec_multibinary.asm -o ec_multibinary.syso -//go:generate yasm -f elf64 gf_2vect_mad_avx2.asm -o gf_2vect_mad_avx2.syso -//go:generate yasm -f elf64 gf_2vect_mad_avx.asm -o gf_2vect_mad_avx.syso -//go:generate yasm -f elf64 gf_2vect_mad_sse.asm -o gf_2vect_mad_sse.syso -//go:generate yasm -f elf64 gf_3vect_mad_avx2.asm -o gf_3vect_mad_avx2.syso -//go:generate yasm -f elf64 gf_3vect_mad_avx.asm -o gf_3vect_mad_avx.syso -//go:generate yasm -f elf64 gf_3vect_mad_sse.asm -o gf_3vect_mad_sse.syso -//go:generate yasm -f elf64 gf_4vect_mad_avx2.asm -o gf_4vect_mad_avx2.syso -//go:generate yasm -f elf64 gf_4vect_mad_avx.asm -o gf_4vect_mad_avx.syso -//go:generate yasm -f elf64 gf_4vect_mad_sse.asm -o gf_4vect_mad_sse.syso -//go:generate yasm -f elf64 gf_5vect_mad_avx2.asm -o gf_5vect_mad_avx2.syso -//go:generate yasm -f elf64 gf_5vect_mad_avx.asm -o gf_5vect_mad_avx.syso -//go:generate yasm -f elf64 gf_5vect_mad_sse.asm -o gf_5vect_mad_sse.syso -//go:generate yasm -f elf64 gf_6vect_mad_avx2.asm -o gf_6vect_mad_avx2.syso -//go:generate yasm -f elf64 gf_6vect_mad_avx.asm -o gf_6vect_mad_avx.syso -//go:generate yasm -f elf64 gf_6vect_mad_sse.asm -o gf_6vect_mad_sse.syso -//go:generate yasm -f elf64 gf_vect_mad_avx2.asm -o gf_vect_mad_avx2.syso -//go:generate yasm -f elf64 gf_vect_mad_avx.asm -o gf_vect_mad_avx.syso -//go:generate yasm -f elf64 gf_vect_mad_sse.asm -o gf_vect_mad_sse.syso -//go:generate yasm -f elf64 gf_2vect_dot_prod_avx2.asm -o gf_2vect_dot_prod_avx2.syso -//go:generate yasm -f elf64 gf_2vect_dot_prod_avx.asm -o gf_2vect_dot_prod_avx.syso -//go:generate yasm -f elf64 gf_2vect_dot_prod_sse.asm -o gf_2vect_dot_prod_sse.syso -//go:generate yasm -f elf64 gf_3vect_dot_prod_avx2.asm -o gf_3vect_dot_prod_avx2.syso -//go:generate yasm -f elf64 gf_3vect_dot_prod_avx.asm -o gf_3vect_dot_prod_avx.syso -//go:generate yasm -f elf64 gf_3vect_dot_prod_sse.asm -o gf_3vect_dot_prod_sse.syso -//go:generate yasm -f elf64 gf_4vect_dot_prod_avx2.asm -o gf_4vect_dot_prod_avx2.syso -//go:generate yasm -f elf64 gf_4vect_dot_prod_avx.asm -o gf_4vect_dot_prod_avx.syso -//go:generate yasm -f elf64 gf_4vect_dot_prod_sse.asm -o gf_4vect_dot_prod_sse.syso -//go:generate yasm -f elf64 gf_5vect_dot_prod_avx2.asm -o gf_5vect_dot_prod_avx2.syso -//go:generate yasm -f elf64 gf_5vect_dot_prod_avx.asm -o gf_5vect_dot_prod_avx.syso -//go:generate yasm -f elf64 gf_5vect_dot_prod_sse.asm -o gf_5vect_dot_prod_sse.syso -//go:generate yasm -f elf64 gf_6vect_dot_prod_avx2.asm -o gf_6vect_dot_prod_avx2.syso -//go:generate yasm -f elf64 gf_6vect_dot_prod_avx.asm -o gf_6vect_dot_prod_avx.syso -//go:generate yasm -f elf64 gf_6vect_dot_prod_sse.asm -o gf_6vect_dot_prod_sse.syso -//go:generate yasm -f elf64 gf_vect_dot_prod_avx2.asm -o gf_vect_dot_prod_avx2.syso -//go:generate yasm -f elf64 gf_vect_dot_prod_avx.asm -o gf_vect_dot_prod_avx.syso -//go:generate yasm -f elf64 gf_vect_dot_prod_sse.asm -o gf_vect_dot_prod_sse.syso -//go:generate yasm -f elf64 gf_vect_mul_avx.asm -o gf_vect_mul_avx.syso -//go:generate yasm -f elf64 gf_vect_mul_sse.asm -o gf_vect_mul_sse.syso diff --git a/pkg/erasure/erasure_yasm_windows.go b/pkg/erasure/erasure_yasm_windows.go deleted file mode 100644 index c3aa6f0de..000000000 --- a/pkg/erasure/erasure_yasm_windows.go +++ /dev/null @@ -1,43 +0,0 @@ -// !build amd64 - -package erasure - -//go:generate yasm -f win64 ec_multibinary.asm -o ec_multibinary.syso -//go:generate yasm -f win64 gf_2vect_mad_avx2.asm -o gf_2vect_mad_avx2.syso -//go:generate yasm -f win64 gf_2vect_mad_avx.asm -o gf_2vect_mad_avx.syso -//go:generate yasm -f win64 gf_2vect_mad_sse.asm -o gf_2vect_mad_sse.syso -//go:generate yasm -f win64 gf_3vect_mad_avx2.asm -o gf_3vect_mad_avx2.syso -//go:generate yasm -f win64 gf_3vect_mad_avx.asm -o gf_3vect_mad_avx.syso -//go:generate yasm -f win64 gf_3vect_mad_sse.asm -o gf_3vect_mad_sse.syso -//go:generate yasm -f win64 gf_4vect_mad_avx2.asm -o gf_4vect_mad_avx2.syso -//go:generate yasm -f win64 gf_4vect_mad_avx.asm -o gf_4vect_mad_avx.syso -//go:generate yasm -f win64 gf_4vect_mad_sse.asm -o gf_4vect_mad_sse.syso -//go:generate yasm -f win64 gf_5vect_mad_avx2.asm -o gf_5vect_mad_avx2.syso -//go:generate yasm -f win64 gf_5vect_mad_avx.asm -o gf_5vect_mad_avx.syso -//go:generate yasm -f win64 gf_5vect_mad_sse.asm -o gf_5vect_mad_sse.syso -//go:generate yasm -f win64 gf_6vect_mad_avx2.asm -o gf_6vect_mad_avx2.syso -//go:generate yasm -f win64 gf_6vect_mad_avx.asm -o gf_6vect_mad_avx.syso -//go:generate yasm -f win64 gf_6vect_mad_sse.asm -o gf_6vect_mad_sse.syso -//go:generate yasm -f win64 gf_vect_mad_avx2.asm -o gf_vect_mad_avx2.syso -//go:generate yasm -f win64 gf_vect_mad_avx.asm -o gf_vect_mad_avx.syso -//go:generate yasm -f win64 gf_vect_mad_sse.asm -o gf_vect_mad_sse.syso -//go:generate yasm -f win64 gf_2vect_dot_prod_avx2.asm -o gf_2vect_dot_prod_avx2.syso -//go:generate yasm -f win64 gf_2vect_dot_prod_avx.asm -o gf_2vect_dot_prod_avx.syso -//go:generate yasm -f win64 gf_2vect_dot_prod_sse.asm -o gf_2vect_dot_prod_sse.syso -//go:generate yasm -f win64 gf_3vect_dot_prod_avx2.asm -o gf_3vect_dot_prod_avx2.syso -//go:generate yasm -f win64 gf_3vect_dot_prod_avx.asm -o gf_3vect_dot_prod_avx.syso -//go:generate yasm -f win64 gf_3vect_dot_prod_sse.asm -o gf_3vect_dot_prod_sse.syso -//go:generate yasm -f win64 gf_4vect_dot_prod_avx2.asm -o gf_4vect_dot_prod_avx2.syso -//go:generate yasm -f win64 gf_4vect_dot_prod_avx.asm -o gf_4vect_dot_prod_avx.syso -//go:generate yasm -f win64 gf_4vect_dot_prod_sse.asm -o gf_4vect_dot_prod_sse.syso -//go:generate yasm -f win64 gf_5vect_dot_prod_avx2.asm -o gf_5vect_dot_prod_avx2.syso -//go:generate yasm -f win64 gf_5vect_dot_prod_avx.asm -o gf_5vect_dot_prod_avx.syso -//go:generate yasm -f win64 gf_5vect_dot_prod_sse.asm -o gf_5vect_dot_prod_sse.syso -//go:generate yasm -f win64 gf_6vect_dot_prod_avx2.asm -o gf_6vect_dot_prod_avx2.syso -//go:generate yasm -f win64 gf_6vect_dot_prod_avx.asm -o gf_6vect_dot_prod_avx.syso -//go:generate yasm -f win64 gf_6vect_dot_prod_sse.asm -o gf_6vect_dot_prod_sse.syso -//go:generate yasm -f win64 gf_vect_dot_prod_avx2.asm -o gf_vect_dot_prod_avx2.syso -//go:generate yasm -f win64 gf_vect_dot_prod_avx.asm -o gf_vect_dot_prod_avx.syso -//go:generate yasm -f win64 gf_vect_dot_prod_sse.asm -o gf_vect_dot_prod_sse.syso -//go:generate yasm -f win64 gf_vect_mul_avx.asm -o gf_vect_mul_avx.syso -//go:generate yasm -f win64 gf_vect_mul_sse.asm -o gf_vect_mul_sse.syso diff --git a/pkg/erasure/gf_2vect_dot_prod_avx.asm b/pkg/erasure/gf_2vect_dot_prod_avx.asm deleted file mode 100644 index 022be0cf6..000000000 --- a/pkg/erasure/gf_2vect_dot_prod_avx.asm +++ /dev/null @@ -1,374 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_2vect_dot_prod_avx(len, vec, *g_tbls, **buffs, **dests); -;;; - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r9 - %define tmp4 r12 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - %endmacro - %macro FUNC_RESTORE 0 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - %endmacro - %macro FUNC_RESTORE 0 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved, loaded and restored - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r14 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - %define stack_size 3*16 + 3*8 ; must be an odd multiple of 8 - %define arg(x) [rsp + stack_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - save_xmm128 xmm6, 0*16 - save_xmm128 xmm7, 1*16 - save_xmm128 xmm8, 2*16 - save_reg r12, 3*16 + 0*8 - save_reg r13, 3*16 + 1*8 - save_reg r14, 3*16 + 2*8 - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - vmovdqa xmm6, [rsp + 0*16] - vmovdqa xmm7, [rsp + 1*16] - vmovdqa xmm8, [rsp + 2*16] - mov r12, [rsp + 3*16 + 0*8] - mov r13, [rsp + 3*16 + 1*8] - mov r14, [rsp + 3*16 + 2*8] - add rsp, stack_size - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, elf32 - -;;;================== High Address; -;;; arg4 -;;; arg3 -;;; arg2 -;;; arg1 -;;; arg0 -;;; return -;;;<================= esp of caller -;;; ebp -;;;<================= ebp = esp -;;; var0 -;;; esi -;;; edi -;;; ebx -;;;<================= esp of callee -;;; -;;;================== Low Address; - - %define PS 4 - %define LOG_PS 2 - %define func(x) x: - %define arg(x) [ebp + PS*2 + PS*x] - %define var(x) [ebp - PS - PS*x] - - %define trans ecx - %define trans2 esi - %define arg0 trans ;trans and trans2 are for the variables in stack - %define arg0_m arg(0) - %define arg1 ebx - %define arg2 arg2_m - %define arg2_m arg(2) - %define arg3 trans - %define arg3_m arg(3) - %define arg4 trans - %define arg4_m arg(4) - %define tmp edx - %define tmp2 edi - %define tmp3 trans2 - %define tmp4 trans2 - %define tmp4_m var(0) - %define return eax - %macro SLDR 2 ;; stack load/restore - mov %1, %2 - %endmacro - %define SSTR SLDR - - %macro FUNC_SAVE 0 - push ebp - mov ebp, esp - sub esp, PS*1 ;1 local variable - push esi - push edi - push ebx - mov arg1, arg(1) - %endmacro - - %macro FUNC_RESTORE 0 - pop ebx - pop edi - pop esi - add esp, PS*1 ;1 local variable - pop ebp - %endmacro - -%endif ; output formats - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest1 arg4 - -%define vec_i tmp2 -%define ptr tmp3 -%define dest2 tmp4 -%define pos return - - %ifidn PS,4 ;32-bit code - %define len_m arg0_m - %define src_m arg3_m - %define dest1_m arg4_m - %define dest2_m tmp4_m - %endif - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - -%ifidn PS,8 ; 64-bit code - default rel - [bits 64] -%endif - -section .text - -%ifidn PS,8 ;64-bit code - %define xmask0f xmm8 - %define xgft1_lo xmm7 - %define xgft1_hi xmm6 - %define xgft2_lo xmm5 - %define xgft2_hi xmm4 - - %define x0 xmm0 - %define xtmpa xmm1 - %define xp1 xmm2 - %define xp2 xmm3 -%else ;32-bit code - %define xmask0f xmm4 - %define xgft1_lo xmm7 - %define xgft1_hi xmm6 - %define xgft2_lo xgft1_lo - %define xgft2_hi xgft1_hi - - %define x0 xmm0 - %define xtmpa xmm1 - %define xp1 xmm2 - %define xp2 xmm3 -%endif - -align 16 -global gf_2vect_dot_prod_avx:function -func(gf_2vect_dot_prod_avx) - FUNC_SAVE - SLDR len, len_m - sub len, 16 - SSTR len_m, len - jl .return_fail - xor pos, pos - vmovdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - sal vec, LOG_PS ;vec *= PS. Make vec_i count by PS - SLDR dest1, dest1_m - mov dest2, [dest1+PS] - SSTR dest2_m, dest2 - mov dest1, [dest1] - SSTR dest1_m, dest1 - -.loop16 - vpxor xp1, xp1 - vpxor xp2, xp2 - mov tmp, mul_array - xor vec_i, vec_i - -.next_vect - SLDR src, src_m - mov ptr, [src+vec_i] - - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - vmovdqu xgft1_hi, [tmp+16] ; " Ax{00}, Ax{10}, ..., Ax{f0} - %ifidn PS,8 ; 64-bit code - vmovdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - vmovdqu xgft2_hi, [tmp+vec*(32/PS)+16] ; " Bx{00}, Bx{10}, ..., Bx{f0} - add tmp, 32 - add vec_i, PS - %endif - XLDR x0, [ptr+pos] ;Get next source vector - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - vpshufb xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft1_hi, xgft1_lo ;GF add high and low partials - vpxor xp1, xgft1_hi ;xp1 += partial - - %ifidn PS,4 ; 32-bit code - vmovdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - vmovdqu xgft2_hi, [tmp+vec*(32/PS)+16] ; " Bx{00}, Bx{10}, ..., Bx{f0} - add tmp, 32 - add vec_i, PS - %endif - vpshufb xgft2_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft2_hi, xgft2_lo ;GF add high and low partials - vpxor xp2, xgft2_hi ;xp2 += partial - - cmp vec_i, vec - jl .next_vect - - SLDR dest1, dest1_m - SLDR dest2, dest2_m - XSTR [dest1+pos], xp1 - XSTR [dest2+pos], xp2 - - SLDR len, len_m - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - jmp .loop16 ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -align 16 -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_2vect_dot_prod_avx, 02, 04, 0191 diff --git a/pkg/erasure/gf_2vect_dot_prod_avx2.asm b/pkg/erasure/gf_2vect_dot_prod_avx2.asm deleted file mode 100644 index e8e7a26b5..000000000 --- a/pkg/erasure/gf_2vect_dot_prod_avx2.asm +++ /dev/null @@ -1,391 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_2vect_dot_prod_avx2(len, vec, *g_tbls, **buffs, **dests); -;;; - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r9 - %define tmp4 r12 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - %endmacro - %macro FUNC_RESTORE 0 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r9 - %define tmp4 r12 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - %endmacro - %macro FUNC_RESTORE 0 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved, loaded and restored - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r14 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - %define stack_size 3*16 + 3*8 ; must be an odd multiple of 8 - %define arg(x) [rsp + stack_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - vmovdqa [rsp + 0*16], xmm6 - vmovdqa [rsp + 1*16], xmm7 - vmovdqa [rsp + 2*16], xmm8 - save_reg r12, 3*16 + 0*8 - save_reg r13, 3*16 + 1*8 - save_reg r14, 3*16 + 2*8 - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - vmovdqa xmm6, [rsp + 0*16] - vmovdqa xmm7, [rsp + 1*16] - vmovdqa xmm8, [rsp + 2*16] - mov r12, [rsp + 3*16 + 0*8] - mov r13, [rsp + 3*16 + 1*8] - mov r14, [rsp + 3*16 + 2*8] - add rsp, stack_size - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, elf32 - -;;;================== High Address; -;;; arg4 -;;; arg3 -;;; arg2 -;;; arg1 -;;; arg0 -;;; return -;;;<================= esp of caller -;;; ebp -;;;<================= ebp = esp -;;; var0 -;;; esi -;;; edi -;;; ebx -;;;<================= esp of callee -;;; -;;;================== Low Address; - - %define PS 4 - %define LOG_PS 2 - %define func(x) x: - %define arg(x) [ebp + PS*2 + PS*x] - %define var(x) [ebp - PS - PS*x] - - %define trans ecx - %define trans2 esi - %define arg0 trans ;trans and trans2 are for the variables in stack - %define arg0_m arg(0) - %define arg1 ebx - %define arg2 arg2_m - %define arg2_m arg(2) - %define arg3 trans - %define arg3_m arg(3) - %define arg4 trans - %define arg4_m arg(4) - %define tmp edx - %define tmp.w edx - %define tmp.b dl - %define tmp2 edi - %define tmp3 trans2 - %define tmp4 trans2 - %define tmp4_m var(0) - %define return eax - %macro SLDR 2 ;stack load/restore - mov %1, %2 - %endmacro - %define SSTR SLDR - - %macro FUNC_SAVE 0 - push ebp - mov ebp, esp - sub esp, PS*1 ;1 local variable - push esi - push edi - push ebx - mov arg1, arg(1) - %endmacro - - %macro FUNC_RESTORE 0 - pop ebx - pop edi - pop esi - add esp, PS*1 ;1 local variable - pop ebp - %endmacro - -%endif ; output formats - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest1 arg4 - -%define vec_i tmp2 -%define ptr tmp3 -%define dest2 tmp4 -%define pos return - -%ifidn PS,4 ;32-bit code - %define len_m arg0_m - %define src_m arg3_m - %define dest1_m arg4_m - %define dest2_m tmp4_m -%endif - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else - -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - -%ifidn PS,8 ;64-bit code - default rel - [bits 64] -%endif - -section .text - -%ifidn PS,8 ;64-bit code - %define xmask0f ymm8 - %define xmask0fx xmm8 - %define xgft1_lo ymm7 - %define xgft1_hi ymm6 - %define xgft2_lo ymm5 - %define xgft2_hi ymm4 - - %define x0 ymm0 - %define xtmpa ymm1 - %define xp1 ymm2 - %define xp2 ymm3 -%else ;32-bit code - %define xmask0f ymm7 - %define xmask0fx xmm7 - %define xgft1_lo ymm5 - %define xgft1_hi ymm4 - %define xgft2_lo xgft1_lo - %define xgft2_hi xgft1_hi - - %define x0 ymm0 - %define xtmpa ymm1 - %define xp1 ymm2 - %define xp2 ymm3 - -%endif - -align 16 -global gf_2vect_dot_prod_avx2:function -func(gf_2vect_dot_prod_avx2) - FUNC_SAVE - SLDR len, len_m - sub len, 32 - SSTR len_m, len - jl .return_fail - xor pos, pos - mov tmp.b, 0x0f - vpinsrb xmask0fx, xmask0fx, tmp.w, 0 - vpbroadcastb xmask0f, xmask0fx ;Construct mask 0x0f0f0f... - - sal vec, LOG_PS ;vec *= PS. Make vec_i count by PS - SLDR dest1, dest1_m - mov dest2, [dest1+PS] - SSTR dest2_m, dest2 - mov dest1, [dest1] - SSTR dest1_m, dest1 - -.loop32 - vpxor xp1, xp1 - vpxor xp2, xp2 - mov tmp, mul_array - xor vec_i, vec_i - -.next_vect - SLDR src, src_m - mov ptr, [src+vec_i] - - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - ; " Ax{00}, Ax{10}, ..., Ax{f0} - vperm2i128 xgft1_hi, xgft1_lo, xgft1_lo, 0x11 ; swapped to hi | hi - vperm2i128 xgft1_lo, xgft1_lo, xgft1_lo, 0x00 ; swapped to lo | lo - %ifidn PS,8 ; 64-bit code - vmovdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - ; " Bx{00}, Bx{10}, ..., Bx{f0} - vperm2i128 xgft2_hi, xgft2_lo, xgft2_lo, 0x11 ; swapped to hi | hi - vperm2i128 xgft2_lo, xgft2_lo, xgft2_lo, 0x00 ; swapped to lo | lo - - XLDR x0, [ptr+pos] ;Get next source vector - add tmp, 32 - add vec_i, PS - %else - XLDR x0, [ptr+pos] ;Get next source vector - %endif - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - vpshufb xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft1_hi, xgft1_lo ;GF add high and low partials - vpxor xp1, xgft1_hi ;xp1 += partial - - %ifidn PS,4 ; 32-bit code - vmovdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - ; " Bx{00}, Bx{10}, ..., Bx{f0} - vperm2i128 xgft2_hi, xgft2_lo, xgft2_lo, 0x11 ; swapped to hi | hi - vperm2i128 xgft2_lo, xgft2_lo, xgft2_lo, 0x00 ; swapped to lo | lo - add tmp, 32 - add vec_i, PS - %endif - vpshufb xgft2_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft2_hi, xgft2_lo ;GF add high and low partials - vpxor xp2, xgft2_hi ;xp2 += partial - - cmp vec_i, vec - jl .next_vect - - SLDR dest1, dest1_m - SLDR dest2, dest2_m - XSTR [dest1+pos], xp1 - XSTR [dest2+pos], xp2 - - SLDR len, len_m - add pos, 32 ;Loop on 32 bytes at a time - cmp pos, len - jle .loop32 - - lea tmp, [len + 32] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - jmp .loop32 ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_2vect_dot_prod_avx2, 04, 04, 0196 diff --git a/pkg/erasure/gf_2vect_dot_prod_sse.asm b/pkg/erasure/gf_2vect_dot_prod_sse.asm deleted file mode 100644 index 555434047..000000000 --- a/pkg/erasure/gf_2vect_dot_prod_sse.asm +++ /dev/null @@ -1,376 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_2vect_dot_prod_sse(len, vec, *g_tbls, **buffs, **dests); -;;; - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r9 - %define tmp4 r12 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - %endmacro - %macro FUNC_RESTORE 0 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - %endmacro - %macro FUNC_RESTORE 0 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved, loaded and restored - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r14 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - %define stack_size 3*16 + 3*8 ; must be an odd multiple of 8 - %define arg(x) [rsp + stack_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - save_xmm128 xmm6, 0*16 - save_xmm128 xmm7, 1*16 - save_xmm128 xmm8, 2*16 - save_reg r12, 3*16 + 0*8 - save_reg r13, 3*16 + 1*8 - save_reg r14, 3*16 + 2*8 - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - movdqa xmm6, [rsp + 0*16] - movdqa xmm7, [rsp + 1*16] - movdqa xmm8, [rsp + 2*16] - mov r12, [rsp + 3*16 + 0*8] - mov r13, [rsp + 3*16 + 1*8] - mov r14, [rsp + 3*16 + 2*8] - add rsp, stack_size - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, elf32 - -;;;================== High Address; -;;; arg4 -;;; arg3 -;;; arg2 -;;; arg1 -;;; arg0 -;;; return -;;;<================= esp of caller -;;; ebp -;;;<================= ebp = esp -;;; var0 -;;; esi -;;; edi -;;; ebx -;;;<================= esp of callee -;;; -;;;================== Low Address; - - %define PS 4 - %define LOG_PS 2 - %define func(x) x: - %define arg(x) [ebp + PS*2 + PS*x] - %define var(x) [ebp - PS - PS*x] - - %define trans ecx - %define trans2 esi - %define arg0 trans ;trans and trans2 are for the variables in stack - %define arg0_m arg(0) - %define arg1 ebx - %define arg2 arg2_m - %define arg2_m arg(2) - %define arg3 trans - %define arg3_m arg(3) - %define arg4 trans - %define arg4_m arg(4) - %define tmp edx - %define tmp2 edi - %define tmp3 trans2 - %define tmp4 trans2 - %define tmp4_m var(0) - %define return eax - %macro SLDR 2 ;; stack load/restore - mov %1, %2 - %endmacro - %define SSTR SLDR - - %macro FUNC_SAVE 0 - push ebp - mov ebp, esp - sub esp, PS*1 ;1 local variable - push esi - push edi - push ebx - mov arg1, arg(1) - %endmacro - - %macro FUNC_RESTORE 0 - pop ebx - pop edi - pop esi - add esp, PS*1 ;1 local variable - pop ebp - %endmacro - -%endif ; output formats - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest1 arg4 - -%define vec_i tmp2 -%define ptr tmp3 -%define dest2 tmp4 -%define pos return - - %ifidn PS,4 ;32-bit code - %define len_m arg0_m - %define src_m arg3_m - %define dest1_m arg4_m - %define dest2_m tmp4_m - %endif - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR movdqu - %define XSTR movdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR movdqa - %define XSTR movdqa - %else - %define XLDR movntdqa - %define XSTR movntdq - %endif -%endif - -%ifidn PS,8 ;64-bit code - default rel - [bits 64] -%endif - -section .text - -%ifidn PS,8 ;64-bit code - %define xmask0f xmm8 - %define xgft1_lo xmm7 - %define xgft1_hi xmm6 - %define xgft2_lo xmm5 - %define xgft2_hi xmm4 - - %define x0 xmm0 - %define xtmpa xmm1 - %define xp1 xmm2 - %define xp2 xmm3 -%else ;32-bit code - %define xmask0f xmm4 - %define xgft1_lo xmm7 - %define xgft1_hi xmm6 - %define xgft2_lo xgft1_lo - %define xgft2_hi xgft1_hi - - %define x0 xmm0 - %define xtmpa xmm1 - %define xp1 xmm2 - %define xp2 xmm3 -%endif - -align 16 -global gf_2vect_dot_prod_sse:function -func(gf_2vect_dot_prod_sse) - FUNC_SAVE - SLDR len, len_m - sub len, 16 - SSTR len_m, len - jl .return_fail - xor pos, pos - movdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - sal vec, LOG_PS ;vec *= PS. Make vec_i count by PS - SLDR dest1, dest1_m - mov dest2, [dest1+PS] - SSTR dest2_m, dest2 - mov dest1, [dest1] - SSTR dest1_m, dest1 - -.loop16 - pxor xp1, xp1 - pxor xp2, xp2 - mov tmp, mul_array - xor vec_i, vec_i - -.next_vect - SLDR src, src_m - mov ptr, [src+vec_i] - - movdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - movdqu xgft1_hi, [tmp+16] ; " Ax{00}, Ax{10}, ..., Ax{f0} - %ifidn PS,8 ;64-bit code - movdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - movdqu xgft2_hi, [tmp+vec*(32/PS)+16] ; " Bx{00}, Bx{10}, ..., Bx{f0} - add tmp, 32 - add vec_i, PS - %endif - XLDR x0, [ptr+pos] ;Get next source vector - - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - - pshufb xgft1_hi, x0 ;Lookup mul table of high nibble - pshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft1_hi, xgft1_lo ;GF add high and low partials - pxor xp1, xgft1_hi ;xp1 += partial - - %ifidn PS,4 ;32-bit code - movdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - movdqu xgft2_hi, [tmp+vec*(32/PS)+16] ; " Bx{00}, Bx{10}, ..., Bx{f0} - - add tmp, 32 - add vec_i, PS - %endif - pshufb xgft2_hi, x0 ;Lookup mul table of high nibble - pshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft2_hi, xgft2_lo ;GF add high and low partials - pxor xp2, xgft2_hi ;xp2 += partial - - cmp vec_i, vec - jl .next_vect - - SLDR dest1, dest1_m - SLDR dest2, dest2_m - XSTR [dest1+pos], xp1 - XSTR [dest2+pos], xp2 - - SLDR len, len_m - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - jmp .loop16 ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -align 16 -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_2vect_dot_prod_sse, 00, 03, 0062 diff --git a/pkg/erasure/gf_2vect_mad_avx.asm b/pkg/erasure/gf_2vect_mad_avx.asm deleted file mode 100644 index 148bd691e..000000000 --- a/pkg/erasure/gf_2vect_mad_avx.asm +++ /dev/null @@ -1,258 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_2vect_mad_avx(len, vec, vec_i, mul_array, src, dest); -;;; - -%define PS 8 - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 - %define arg5 r15 - %define tmp r11 - %define tmp2 r10 - %define return rax - %define return.w eax - %define stack_size 16*9 + 3*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - -%macro FUNC_SAVE 0 - sub rsp, stack_size - movdqa [rsp+16*0],xmm6 - movdqa [rsp+16*1],xmm7 - movdqa [rsp+16*2],xmm8 - movdqa [rsp+16*3],xmm9 - movdqa [rsp+16*4],xmm10 - movdqa [rsp+16*5],xmm11 - movdqa [rsp+16*6],xmm12 - movdqa [rsp+16*7],xmm13 - movdqa [rsp+16*8],xmm14 - save_reg r12, 9*16 + 0*8 - save_reg r15, 9*16 + 1*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) -%endmacro - -%macro FUNC_RESTORE 0 - movdqa xmm6, [rsp+16*0] - movdqa xmm7, [rsp+16*1] - movdqa xmm8, [rsp+16*2] - movdqa xmm9, [rsp+16*3] - movdqa xmm10, [rsp+16*4] - movdqa xmm11, [rsp+16*5] - movdqa xmm12, [rsp+16*6] - movdqa xmm13, [rsp+16*7] - movdqa xmm14, [rsp+16*8] - mov r12, [rsp + 9*16 + 0*8] - mov r15, [rsp + 9*16 + 1*8] - add rsp, stack_size -%endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp2 r10 - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE - -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp2 r10 - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - -;;; gf_2vect_mad_avx(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest1 arg5 -%define pos return -%define pos.w return.w - -%define dest2 tmp2 - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - - -default rel - -[bits 64] -section .text - -%define xmask0f xmm14 -%define xgft1_lo xmm13 -%define xgft1_hi xmm12 -%define xgft2_lo xmm11 -%define xgft2_hi xmm10 - -%define x0 xmm0 -%define xtmpa xmm1 -%define xtmph1 xmm2 -%define xtmpl1 xmm3 -%define xtmph2 xmm4 -%define xtmpl2 xmm5 -%define xd1 xmm6 -%define xd2 xmm7 -%define xtmpd1 xmm8 -%define xtmpd2 xmm9 - - -align 16 -global gf_2vect_mad_avx:function -func(gf_2vect_mad_avx) - FUNC_SAVE - sub len, 16 - jl .return_fail - - xor pos, pos - vmovdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - sal vec_i, 5 ;Multiply by 32 - sal vec, 5 - lea tmp, [mul_array + vec_i] - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - vmovdqu xgft1_hi, [tmp+16] ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - vmovdqu xgft2_lo, [tmp+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - vmovdqu xgft2_hi, [tmp+vec+16] ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - - mov dest2, [dest1+PS] - mov dest1, [dest1] - - XLDR xtmpd1, [dest1+len] ;backup the last 16 bytes in dest - XLDR xtmpd2, [dest2+len] ;backup the last 16 bytes in dest - -.loop16 - XLDR xd1, [dest1+pos] ;Get next dest vector - XLDR xd2, [dest2+pos] ;Get next dest vector -.loop16_overlap: - XLDR x0, [src+pos] ;Get next source vector - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - vpshufb xtmph1, xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl1, xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xtmpl1 ;GF add high and low partials - vpxor xd1, xd1, xtmph1 ;xd1 += partial - - vpshufb xtmph2, xgft2_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl2, xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmph2, xtmpl2 ;GF add high and low partials - vpxor xd2, xd2, xtmph2 ;xd2 += partial - - XSTR [dest1+pos], xd1 - XSTR [dest2+pos], xd2 - - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - vmovdqa xd1, xtmpd1 ;Restore xd1 - vmovdqa xd2, xtmpd2 ;Restore xd2 - jmp .loop16_overlap ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -align 16 -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_2vect_mad_avx, 02, 00, 0204 diff --git a/pkg/erasure/gf_2vect_mad_avx2.asm b/pkg/erasure/gf_2vect_mad_avx2.asm deleted file mode 100644 index 1daac537b..000000000 --- a/pkg/erasure/gf_2vect_mad_avx2.asm +++ /dev/null @@ -1,273 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_2vect_mad_avx2(len, vec, vec_i, mul_array, src, dest); -;;; - -%define PS 8 - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 - %define arg5 r15 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define return rax - %define return.w eax - %define stack_size 16*9 + 3*8 ; must be an odd multiple of 8 - %define arg(x) [rsp + stack_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - sub rsp, stack_size - vmovdqa [rsp+16*0],xmm6 - vmovdqa [rsp+16*1],xmm7 - vmovdqa [rsp+16*2],xmm8 - vmovdqa [rsp+16*3],xmm9 - vmovdqa [rsp+16*4],xmm10 - vmovdqa [rsp+16*5],xmm11 - vmovdqa [rsp+16*6],xmm12 - vmovdqa [rsp+16*7],xmm13 - vmovdqa [rsp+16*8],xmm14 - save_reg r12, 9*16 + 0*8 - save_reg r15, 9*16 + 1*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) - %endmacro - - %macro FUNC_RESTORE 0 - vmovdqa xmm6, [rsp+16*0] - vmovdqa xmm7, [rsp+16*1] - vmovdqa xmm8, [rsp+16*2] - vmovdqa xmm9, [rsp+16*3] - vmovdqa xmm10, [rsp+16*4] - vmovdqa xmm11, [rsp+16*5] - vmovdqa xmm12, [rsp+16*6] - vmovdqa xmm13, [rsp+16*7] - vmovdqa xmm14, [rsp+16*8] - mov r12, [rsp + 9*16 + 0*8] - mov r15, [rsp + 9*16 + 1*8] - add rsp, stack_size - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - -;;; gf_2vect_mad_avx2(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest1 arg5 -%define pos return -%define pos.w return.w - -%define dest2 tmp2 - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else - -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - - -default rel - -[bits 64] -section .text - -%define xmask0f ymm14 -%define xmask0fx xmm14 -%define xgft1_lo ymm13 -%define xgft1_hi ymm12 -%define xgft2_lo ymm11 -%define xgft2_hi ymm10 - -%define x0 ymm0 -%define xtmpa ymm1 -%define xtmph1 ymm2 -%define xtmpl1 ymm3 -%define xtmph2 ymm4 -%define xtmpl2 ymm5 -%define xd1 ymm6 -%define xd2 ymm7 -%define xtmpd1 ymm8 -%define xtmpd2 ymm9 - -align 16 -global gf_2vect_mad_avx2:function -func(gf_2vect_mad_avx2) - FUNC_SAVE - sub len, 32 - jl .return_fail - xor pos, pos - mov tmp.b, 0x0f - vpinsrb xmask0fx, xmask0fx, tmp.w, 0 - vpbroadcastb xmask0f, xmask0fx ;Construct mask 0x0f0f0f... - - sal vec_i, 5 ;Multiply by 32 - sal vec, 5 - lea tmp, [mul_array + vec_i] - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - ; " Ax{00}, Ax{10}, ..., Ax{f0} - vmovdqu xgft2_lo, [tmp+vec] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - ; " Bx{00}, Bx{10}, ..., Bx{f0} - - vperm2i128 xgft1_hi, xgft1_lo, xgft1_lo, 0x11 ; swapped to hi | hi - vperm2i128 xgft1_lo, xgft1_lo, xgft1_lo, 0x00 ; swapped to lo | lo - vperm2i128 xgft2_hi, xgft2_lo, xgft2_lo, 0x11 ; swapped to hi | hi - vperm2i128 xgft2_lo, xgft2_lo, xgft2_lo, 0x00 ; swapped to lo | lo - mov dest2, [dest1+PS] ; reuse mul_array - mov dest1, [dest1] - - XLDR xtmpd1, [dest1+len] ;backup the last 16 bytes in dest - XLDR xtmpd2, [dest2+len] ;backup the last 16 bytes in dest - -.loop32 - XLDR xd1, [dest1+pos] ;Get next dest vector - XLDR xd2, [dest2+pos] ;Get next dest vector -.loop32_overlap: - XLDR x0, [src+pos] ;Get next source vector - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - vpshufb xtmph1, xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl1, xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xtmpl1 ;GF add high and low partials - vpxor xd1, xd1, xtmph1 ;xd1 += partial - - vpshufb xtmph2, xgft2_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl2, xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmph2, xtmpl2 ;GF add high and low partials - vpxor xd2, xd2, xtmph2 ;xd2 += partial - - XSTR [dest1+pos], xd1 - XSTR [dest2+pos], xd2 - - add pos, 32 ;Loop on 32 bytes at a time - cmp pos, len - jle .loop32 - - lea tmp, [len + 32] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-32 - vmovdqa xd1, xtmpd1 ;Restore xd1 - vmovdqa xd2, xtmpd2 ;Restore xd2 - jmp .loop32_overlap ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_2vect_mad_avx2, 04, 00, 0205 diff --git a/pkg/erasure/gf_2vect_mad_sse.asm b/pkg/erasure/gf_2vect_mad_sse.asm deleted file mode 100644 index a00389de9..000000000 --- a/pkg/erasure/gf_2vect_mad_sse.asm +++ /dev/null @@ -1,262 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_2vect_mad_sse(len, vec, vec_i, mul_array, src, dest); -;;; - -%define PS 8 - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 - %define arg5 r15 - %define tmp r11 - %define tmp2 r10 - %define return rax - %define return.w eax - %define stack_size 16*9 + 3*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - -%macro FUNC_SAVE 0 - sub rsp, stack_size - movdqa [rsp+16*0],xmm6 - movdqa [rsp+16*1],xmm7 - movdqa [rsp+16*2],xmm8 - movdqa [rsp+16*3],xmm9 - movdqa [rsp+16*4],xmm10 - movdqa [rsp+16*5],xmm11 - movdqa [rsp+16*6],xmm12 - movdqa [rsp+16*7],xmm13 - movdqa [rsp+16*8],xmm14 - save_reg r12, 9*16 + 0*8 - save_reg r15, 9*16 + 1*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) -%endmacro - -%macro FUNC_RESTORE 0 - movdqa xmm6, [rsp+16*0] - movdqa xmm7, [rsp+16*1] - movdqa xmm8, [rsp+16*2] - movdqa xmm9, [rsp+16*3] - movdqa xmm10, [rsp+16*4] - movdqa xmm11, [rsp+16*5] - movdqa xmm12, [rsp+16*6] - movdqa xmm13, [rsp+16*7] - movdqa xmm14, [rsp+16*8] - mov r12, [rsp + 9*16 + 0*8] - mov r15, [rsp + 9*16 + 1*8] - add rsp, stack_size -%endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp2 r10 - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE - -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp2 r10 - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - -;;; gf_2vect_mad_sse(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest1 arg5 -%define pos return -%define pos.w return.w - -%define dest2 tmp2 - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR movdqu - %define XSTR movdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR movdqa - %define XSTR movdqa - %else - %define XLDR movntdqa - %define XSTR movntdq - %endif -%endif - -default rel - -[bits 64] -section .text - -%define xmask0f xmm14 -%define xgft1_lo xmm13 -%define xgft1_hi xmm12 -%define xgft2_lo xmm11 -%define xgft2_hi xmm10 - -%define x0 xmm0 -%define xtmpa xmm1 -%define xtmph1 xmm2 -%define xtmpl1 xmm3 -%define xtmph2 xmm4 -%define xtmpl2 xmm5 -%define xd1 xmm6 -%define xd2 xmm7 -%define xtmpd1 xmm8 -%define xtmpd2 xmm9 - - -align 16 -global gf_2vect_mad_sse:function -func(gf_2vect_mad_sse) - FUNC_SAVE - sub len, 16 - jl .return_fail - - xor pos, pos - movdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - sal vec_i, 5 ;Multiply by 32 - sal vec, 5 - lea tmp, [mul_array + vec_i] - movdqu xgft1_lo,[tmp] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - movdqu xgft1_hi, [tmp+16] ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - movdqu xgft2_lo, [tmp+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - movdqu xgft2_hi, [tmp+vec+16] ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - mov dest2, [dest1+PS] - mov dest1, [dest1] - - XLDR xtmpd1, [dest1+len] ;backup the last 16 bytes in dest - XLDR xtmpd2, [dest2+len] ;backup the last 16 bytes in dest - -.loop16: - XLDR xd1, [dest1+pos] ;Get next dest vector - XLDR xd2, [dest2+pos] ;Get next dest vector -.loop16_overlap: - XLDR x0, [src+pos] ;Get next source vector - movdqa xtmph1, xgft1_hi ;Reload const array registers - movdqa xtmpl1, xgft1_lo - movdqa xtmph2, xgft2_hi ;Reload const array registers - movdqa xtmpl2, xgft2_lo - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - - pshufb xtmph1, x0 ;Lookup mul table of high nibble - pshufb xtmpl1, xtmpa ;Lookup mul table of low nibble - pxor xtmph1, xtmpl1 ;GF add high and low partials - pxor xd1, xtmph1 - - pshufb xtmph2, x0 ;Lookup mul table of high nibble - pshufb xtmpl2, xtmpa ;Lookup mul table of low nibble - pxor xtmph2, xtmpl2 ;GF add high and low partials - pxor xd2, xtmph2 - - XSTR [dest1+pos], xd1 ;Store result - XSTR [dest2+pos], xd2 ;Store result - - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - movdqa xd1, xtmpd1 ;Restore xd1 - movdqa xd2, xtmpd2 ;Restore xd2 - jmp .loop16_overlap ;Do one more overlap pass - -.return_pass: - FUNC_RESTORE - mov return, 0 - ret - -.return_fail: - FUNC_RESTORE - mov return, 1 - ret - -endproc_frame - -section .data - -align 16 - -mask0f: - ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_2vect_mad_sse, 00, 00, 0203 diff --git a/pkg/erasure/gf_3vect_dot_prod_avx.asm b/pkg/erasure/gf_3vect_dot_prod_avx.asm deleted file mode 100644 index 550301ca0..000000000 --- a/pkg/erasure/gf_3vect_dot_prod_avx.asm +++ /dev/null @@ -1,415 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_3vect_dot_prod_avx(len, vec, *g_tbls, **buffs, **dests); -;;; - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - %endmacro - %macro FUNC_RESTORE 0 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - %endmacro - %macro FUNC_RESTORE 0 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved, loaded and restored - %define arg5 r15 ; must be saved and restored - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r14 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - %define stack_size 6*16 + 5*8 ; must be an odd multiple of 8 - %define arg(x) [rsp + stack_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - save_xmm128 xmm6, 0*16 - save_xmm128 xmm7, 1*16 - save_xmm128 xmm8, 2*16 - save_xmm128 xmm9, 3*16 - save_xmm128 xmm10, 4*16 - save_xmm128 xmm11, 5*16 - save_reg r12, 6*16 + 0*8 - save_reg r13, 6*16 + 1*8 - save_reg r14, 6*16 + 2*8 - save_reg r15, 6*16 + 3*8 - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - vmovdqa xmm6, [rsp + 0*16] - vmovdqa xmm7, [rsp + 1*16] - vmovdqa xmm8, [rsp + 2*16] - vmovdqa xmm9, [rsp + 3*16] - vmovdqa xmm10, [rsp + 4*16] - vmovdqa xmm11, [rsp + 5*16] - mov r12, [rsp + 6*16 + 0*8] - mov r13, [rsp + 6*16 + 1*8] - mov r14, [rsp + 6*16 + 2*8] - mov r15, [rsp + 6*16 + 3*8] - add rsp, stack_size - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, elf32 - -;;;================== High Address; -;;; arg4 -;;; arg3 -;;; arg2 -;;; arg1 -;;; arg0 -;;; return -;;;<================= esp of caller -;;; ebp -;;;<================= ebp = esp -;;; var0 -;;; var1 -;;; esi -;;; edi -;;; ebx -;;;<================= esp of callee -;;; -;;;================== Low Address; - - %define PS 4 - %define LOG_PS 2 - %define func(x) x: - %define arg(x) [ebp + PS*2 + PS*x] - %define var(x) [ebp - PS - PS*x] - - %define trans ecx - %define trans2 esi - %define arg0 trans ;trans and trans2 are for the variables in stack - %define arg0_m arg(0) - %define arg1 ebx - %define arg2 arg2_m - %define arg2_m arg(2) - %define arg3 trans - %define arg3_m arg(3) - %define arg4 trans - %define arg4_m arg(4) - %define arg5 trans2 - %define tmp edx - %define tmp2 edi - %define tmp3 trans2 - %define tmp3_m var(0) - %define tmp4 trans2 - %define tmp4_m var(1) - %define return eax - %macro SLDR 2 ;; stack load/restore - mov %1, %2 - %endmacro - %define SSTR SLDR - - %macro FUNC_SAVE 0 - push ebp - mov ebp, esp - sub esp, PS*2 ;2 local variables - push esi - push edi - push ebx - mov arg1, arg(1) - %endmacro - - %macro FUNC_RESTORE 0 - pop ebx - pop edi - pop esi - add esp, PS*2 ;2 local variables - pop ebp - %endmacro - -%endif ; output formats - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest1 arg4 -%define ptr arg5 - -%define vec_i tmp2 -%define dest2 tmp3 -%define dest3 tmp4 -%define pos return - - %ifidn PS,4 ;32-bit code - %define len_m arg0_m - %define src_m arg3_m - %define dest1_m arg4_m - %define dest2_m tmp3_m - %define dest3_m tmp4_m - %endif - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - -%ifidn PS,8 ; 64-bit code - default rel - [bits 64] -%endif - - -section .text - -%ifidn PS,8 ;64-bit code - %define xmask0f xmm11 - %define xgft1_lo xmm10 - %define xgft1_hi xmm9 - %define xgft2_lo xmm8 - %define xgft2_hi xmm7 - %define xgft3_lo xmm6 - %define xgft3_hi xmm5 - - %define x0 xmm0 - %define xtmpa xmm1 - %define xp1 xmm2 - %define xp2 xmm3 - %define xp3 xmm4 -%else - %define xmask0f xmm7 - %define xgft1_lo xmm6 - %define xgft1_hi xmm5 - %define xgft2_lo xgft1_lo - %define xgft2_hi xgft1_hi - %define xgft3_lo xgft1_lo - %define xgft3_hi xgft1_hi - - %define x0 xmm0 - %define xtmpa xmm1 - %define xp1 xmm2 - %define xp2 xmm3 - %define xp3 xmm4 -%endif - -align 16 -global gf_3vect_dot_prod_avx:function -func(gf_3vect_dot_prod_avx) - FUNC_SAVE - SLDR len, len_m - sub len, 16 - SSTR len_m, len - jl .return_fail - xor pos, pos - vmovdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - sal vec, LOG_PS ;vec *= PS. Make vec_i count by PS - SLDR dest1, dest1_m - mov dest2, [dest1+PS] - SSTR dest2_m, dest2 - mov dest3, [dest1+2*PS] - SSTR dest3_m, dest3 - mov dest1, [dest1] - SSTR dest1_m, dest1 - -.loop16: - vpxor xp1, xp1 - vpxor xp2, xp2 - vpxor xp3, xp3 - mov tmp, mul_array - xor vec_i, vec_i - -.next_vect: - SLDR src, src_m - mov ptr, [src+vec_i] - - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - vmovdqu xgft1_hi, [tmp+16] ; " Ax{00}, Ax{10}, ..., Ax{f0} - %ifidn PS,8 ; 64-bit code - vmovdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - vmovdqu xgft2_hi, [tmp+vec*(32/PS)+16] ; " Bx{00}, Bx{10}, ..., Bx{f0} - vmovdqu xgft3_lo, [tmp+vec*(64/PS)] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - vmovdqu xgft3_hi, [tmp+vec*(64/PS)+16] ; " Cx{00}, Cx{10}, ..., Cx{f0} - add tmp, 32 - add vec_i, PS - %endif - XLDR x0, [ptr+pos] ;Get next source vector - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - vpshufb xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft1_hi, xgft1_lo ;GF add high and low partials - vpxor xp1, xgft1_hi ;xp1 += partial - - %ifidn PS,4 ; 32-bit code - vmovdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - vmovdqu xgft2_hi, [tmp+vec*(32/PS)+16] ; " Bx{00}, Bx{10}, ..., Bx{f0} - %endif - vpshufb xgft2_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft2_hi, xgft2_lo ;GF add high and low partials - vpxor xp2, xgft2_hi ;xp2 += partial - - %ifidn PS,4 ; 32-bit code - sal vec, 1 - vmovdqu xgft3_lo, [tmp+vec*(32/PS)] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - vmovdqu xgft3_hi, [tmp+vec*(32/PS)+16] ; " Cx{00}, Cx{10}, ..., Cx{f0} - sar vec, 1 - add tmp, 32 - add vec_i, PS - %endif - vpshufb xgft3_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft3_hi, xgft3_lo ;GF add high and low partials - vpxor xp3, xgft3_hi ;xp3 += partial - - cmp vec_i, vec - jl .next_vect - - SLDR dest1, dest1_m - SLDR dest2, dest2_m - XSTR [dest1+pos], xp1 - XSTR [dest2+pos], xp2 - SLDR dest3, dest3_m - XSTR [dest3+pos], xp3 - - SLDR len, len_m - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - jmp .loop16 ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -align 16 -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_3vect_dot_prod_avx, 02, 04, 0192 diff --git a/pkg/erasure/gf_3vect_dot_prod_avx2.asm b/pkg/erasure/gf_3vect_dot_prod_avx2.asm deleted file mode 100644 index 7d4898ce4..000000000 --- a/pkg/erasure/gf_3vect_dot_prod_avx2.asm +++ /dev/null @@ -1,435 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_3vect_dot_prod_avx2(len, vec, *g_tbls, **buffs, **dests); -;;; - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - %endmacro - %macro FUNC_RESTORE 0 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - %endmacro - %macro FUNC_RESTORE 0 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved, loaded and restored - %define arg5 r15 ; must be saved and restored - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r14 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - %define stack_size 6*16 + 5*8 ; must be an odd multiple of 8 - %define arg(x) [rsp + stack_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - vmovdqa [rsp + 0*16], xmm6 - vmovdqa [rsp + 1*16], xmm7 - vmovdqa [rsp + 2*16], xmm8 - vmovdqa [rsp + 3*16], xmm9 - vmovdqa [rsp + 4*16], xmm10 - vmovdqa [rsp + 5*16], xmm11 - save_reg r12, 6*16 + 0*8 - save_reg r13, 6*16 + 1*8 - save_reg r14, 6*16 + 2*8 - save_reg r15, 6*16 + 3*8 - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - vmovdqa xmm6, [rsp + 0*16] - vmovdqa xmm7, [rsp + 1*16] - vmovdqa xmm8, [rsp + 2*16] - vmovdqa xmm9, [rsp + 3*16] - vmovdqa xmm10, [rsp + 4*16] - vmovdqa xmm11, [rsp + 5*16] - mov r12, [rsp + 6*16 + 0*8] - mov r13, [rsp + 6*16 + 1*8] - mov r14, [rsp + 6*16 + 2*8] - mov r15, [rsp + 6*16 + 3*8] - add rsp, stack_size - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, elf32 - -;;;================== High Address; -;;; arg4 -;;; arg3 -;;; arg2 -;;; arg1 -;;; arg0 -;;; return -;;;<================= esp of caller -;;; ebp -;;;<================= ebp = esp -;;; var0 -;;; var1 -;;; esi -;;; edi -;;; ebx -;;;<================= esp of callee -;;; -;;;================== Low Address; - - %define PS 4 - %define LOG_PS 2 - %define func(x) x: - %define arg(x) [ebp + PS*2 + PS*x] - %define var(x) [ebp - PS - PS*x] - - %define trans ecx - %define trans2 esi - %define arg0 trans ;trans and trans2 are for the variables in stack - %define arg0_m arg(0) - %define arg1 ebx - %define arg2 arg2_m - %define arg2_m arg(2) - %define arg3 trans - %define arg3_m arg(3) - %define arg4 trans - %define arg4_m arg(4) - %define arg5 trans2 - %define tmp edx - %define tmp.w edx - %define tmp.b dl - %define tmp2 edi - %define tmp3 trans2 - %define tmp3_m var(0) - %define tmp4 trans2 - %define tmp4_m var(1) - %define return eax - %macro SLDR 2 ;stack load/restore - mov %1, %2 - %endmacro - %define SSTR SLDR - - %macro FUNC_SAVE 0 - push ebp - mov ebp, esp - sub esp, PS*2 ;2 local variables - push esi - push edi - push ebx - mov arg1, arg(1) - %endmacro - - %macro FUNC_RESTORE 0 - pop ebx - pop edi - pop esi - add esp, PS*2 ;2 local variables - pop ebp - %endmacro - -%endif ; output formats - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest1 arg4 -%define ptr arg5 - -%define vec_i tmp2 -%define dest2 tmp3 -%define dest3 tmp4 -%define pos return - -%ifidn PS,4 ;32-bit code - %define len_m arg0_m - %define src_m arg3_m - %define dest1_m arg4_m - %define dest2_m tmp3_m - %define dest3_m tmp4_m -%endif - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - -%ifidn PS,8 ;64-bit code - default rel - [bits 64] -%endif - -section .text - -%ifidn PS,8 ;64-bit code - %define xmask0f ymm11 - %define xmask0fx xmm11 - %define xgft1_lo ymm10 - %define xgft1_hi ymm9 - %define xgft2_lo ymm8 - %define xgft2_hi ymm7 - %define xgft3_lo ymm6 - %define xgft3_hi ymm5 - - %define x0 ymm0 - %define xtmpa ymm1 - %define xp1 ymm2 - %define xp2 ymm3 - %define xp3 ymm4 -%else - %define xmask0f ymm7 - %define xmask0fx xmm7 - %define xgft1_lo ymm6 - %define xgft1_hi ymm5 - %define xgft2_lo xgft1_lo - %define xgft2_hi xgft1_hi - %define xgft3_lo xgft1_lo - %define xgft3_hi xgft1_hi - - %define x0 ymm0 - %define xtmpa ymm1 - %define xp1 ymm2 - %define xp2 ymm3 - %define xp3 ymm4 - -%endif - -align 16 -global gf_3vect_dot_prod_avx2:function -func(gf_3vect_dot_prod_avx2) - FUNC_SAVE - SLDR len, len_m - sub len, 32 - SSTR len_m, len - jl .return_fail - xor pos, pos - mov tmp.b, 0x0f - vpinsrb xmask0fx, xmask0fx, tmp.w, 0 - vpbroadcastb xmask0f, xmask0fx ;Construct mask 0x0f0f0f... - - sal vec, LOG_PS ;vec *= PS. Make vec_i count by PS - SLDR dest1, dest1_m - mov dest2, [dest1+PS] - SSTR dest2_m, dest2 - mov dest3, [dest1+2*PS] - SSTR dest3_m, dest3 - mov dest1, [dest1] - SSTR dest1_m, dest1 - -.loop32: - vpxor xp1, xp1 - vpxor xp2, xp2 - vpxor xp3, xp3 - mov tmp, mul_array - xor vec_i, vec_i - -.next_vect: - SLDR src, src_m - mov ptr, [src+vec_i] - - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - ; " Ax{00}, Ax{10}, ..., Ax{f0} - vperm2i128 xgft1_hi, xgft1_lo, xgft1_lo, 0x11 ; swapped to hi | hi - vperm2i128 xgft1_lo, xgft1_lo, xgft1_lo, 0x00 ; swapped to lo | lo - %ifidn PS,8 ; 64-bit code - vmovdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - ; " Bx{00}, Bx{10}, ..., Bx{f0} - vperm2i128 xgft2_hi, xgft2_lo, xgft2_lo, 0x11 ; swapped to hi | hi - vperm2i128 xgft2_lo, xgft2_lo, xgft2_lo, 0x00 ; swapped to lo | lo - - vmovdqu xgft3_lo, [tmp+vec*(64/PS)] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - ; " Cx{00}, Cx{10}, ..., Cx{f0} - vperm2i128 xgft3_hi, xgft3_lo, xgft3_lo, 0x11 ; swapped to hi | hi - vperm2i128 xgft3_lo, xgft3_lo, xgft3_lo, 0x00 ; swapped to lo | lo - - add tmp, 32 - add vec_i, PS - %endif - XLDR x0, [ptr+pos] ;Get next source vector - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - vpshufb xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft1_hi, xgft1_lo ;GF add high and low partials - vpxor xp1, xgft1_hi ;xp1 += partial - - %ifidn PS,4 ; 32-bit code - vmovdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - ; " Bx{00}, Bx{10}, ..., Bx{f0} - vperm2i128 xgft2_hi, xgft2_lo, xgft2_lo, 0x11 ; swapped to hi | hi - vperm2i128 xgft2_lo, xgft2_lo, xgft2_lo, 0x00 ; swapped to lo | lo - %endif - vpshufb xgft2_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft2_hi, xgft2_lo ;GF add high and low partials - vpxor xp2, xgft2_hi ;xp2 += partial - - %ifidn PS,4 ; 32-bit code - sal vec, 1 - vmovdqu xgft3_lo, [tmp+vec*(32/PS)] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - ; " Cx{00}, Cx{10}, ..., Cx{f0} - vperm2i128 xgft3_hi, xgft3_lo, xgft3_lo, 0x11 ; swapped to hi | hi - vperm2i128 xgft3_lo, xgft3_lo, xgft3_lo, 0x00 ; swapped to lo | lo - sar vec, 1 - add tmp, 32 - add vec_i, PS - %endif - vpshufb xgft3_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft3_hi, xgft3_lo ;GF add high and low partials - vpxor xp3, xgft3_hi ;xp3 += partial - - cmp vec_i, vec - jl .next_vect - - SLDR dest1, dest1_m - SLDR dest2, dest2_m - XSTR [dest1+pos], xp1 - XSTR [dest2+pos], xp2 - SLDR dest3, dest3_m - XSTR [dest3+pos], xp3 - - SLDR len, len_m - add pos, 32 ;Loop on 32 bytes at a time - cmp pos, len - jle .loop32 - - lea tmp, [len + 32] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - jmp .loop32 ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_3vect_dot_prod_avx2, 04, 04, 0197 diff --git a/pkg/erasure/gf_3vect_dot_prod_sse.asm b/pkg/erasure/gf_3vect_dot_prod_sse.asm deleted file mode 100644 index 4e138ac72..000000000 --- a/pkg/erasure/gf_3vect_dot_prod_sse.asm +++ /dev/null @@ -1,416 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_3vect_dot_prod_sse(len, vec, *g_tbls, **buffs, **dests); -;;; - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - %endmacro - %macro FUNC_RESTORE 0 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - %endmacro - %macro FUNC_RESTORE 0 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved, loaded and restored - %define arg5 r15 ; must be saved and restored - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r14 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - %define stack_size 6*16 + 5*8 ; must be an odd multiple of 8 - %define arg(x) [rsp + stack_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - save_xmm128 xmm6, 0*16 - save_xmm128 xmm7, 1*16 - save_xmm128 xmm8, 2*16 - save_xmm128 xmm9, 3*16 - save_xmm128 xmm10, 4*16 - save_xmm128 xmm11, 5*16 - save_reg r12, 6*16 + 0*8 - save_reg r13, 6*16 + 1*8 - save_reg r14, 6*16 + 2*8 - save_reg r15, 6*16 + 3*8 - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - movdqa xmm6, [rsp + 0*16] - movdqa xmm7, [rsp + 1*16] - movdqa xmm8, [rsp + 2*16] - movdqa xmm9, [rsp + 3*16] - movdqa xmm10, [rsp + 4*16] - movdqa xmm11, [rsp + 5*16] - mov r12, [rsp + 6*16 + 0*8] - mov r13, [rsp + 6*16 + 1*8] - mov r14, [rsp + 6*16 + 2*8] - mov r15, [rsp + 6*16 + 3*8] - add rsp, stack_size - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, elf32 - -;;;================== High Address; -;;; arg4 -;;; arg3 -;;; arg2 -;;; arg1 -;;; arg0 -;;; return -;;;<================= esp of caller -;;; ebp -;;;<================= ebp = esp -;;; var0 -;;; var1 -;;; esi -;;; edi -;;; ebx -;;;<================= esp of callee -;;; -;;;================== Low Address; - - %define PS 4 - %define LOG_PS 2 - %define func(x) x: - %define arg(x) [ebp + PS*2 + PS*x] - %define var(x) [ebp - PS - PS*x] - - %define trans ecx - %define trans2 esi - %define arg0 trans ;trans and trans2 are for the variables in stack - %define arg0_m arg(0) - %define arg1 ebx - %define arg2 arg2_m - %define arg2_m arg(2) - %define arg3 trans - %define arg3_m arg(3) - %define arg4 trans - %define arg4_m arg(4) - %define arg5 trans2 - %define tmp edx - %define tmp2 edi - %define tmp3 trans2 - %define tmp3_m var(0) - %define tmp4 trans2 - %define tmp4_m var(1) - %define return eax - %macro SLDR 2 ;; stack load/restore - mov %1, %2 - %endmacro - %define SSTR SLDR - - %macro FUNC_SAVE 0 - push ebp - mov ebp, esp - sub esp, PS*2 ;2 local variables - push esi - push edi - push ebx - mov arg1, arg(1) - %endmacro - - %macro FUNC_RESTORE 0 - pop ebx - pop edi - pop esi - add esp, PS*2 ;2 local variables - pop ebp - %endmacro - -%endif ; output formats - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest1 arg4 -%define ptr arg5 - -%define vec_i tmp2 -%define dest2 tmp3 -%define dest3 tmp4 -%define pos return - - %ifidn PS,4 ;32-bit code - %define len_m arg0_m - %define src_m arg3_m - %define dest1_m arg4_m - %define dest2_m tmp3_m - %define dest3_m tmp4_m - %endif - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR movdqu - %define XSTR movdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR movdqa - %define XSTR movdqa - %else - %define XLDR movntdqa - %define XSTR movntdq - %endif -%endif - -%ifidn PS,8 ; 64-bit code - default rel - [bits 64] -%endif - - -section .text - -%ifidn PS,8 ;64-bit code - %define xmask0f xmm11 - %define xgft1_lo xmm2 - %define xgft1_hi xmm3 - %define xgft2_lo xmm4 - %define xgft2_hi xmm7 - %define xgft3_lo xmm6 - %define xgft3_hi xmm5 - - %define x0 xmm0 - %define xtmpa xmm1 - %define xp1 xmm10 - %define xp2 xmm9 - %define xp3 xmm8 -%else - %define xmask0f xmm7 - %define xgft1_lo xmm6 - %define xgft1_hi xmm5 - %define xgft2_lo xgft1_lo - %define xgft2_hi xgft1_hi - %define xgft3_lo xgft1_lo - %define xgft3_hi xgft1_hi - - %define x0 xmm0 - %define xtmpa xmm1 - %define xp1 xmm2 - %define xp2 xmm3 - %define xp3 xmm4 -%endif - -align 16 -global gf_3vect_dot_prod_sse:function -func(gf_3vect_dot_prod_sse) - FUNC_SAVE - SLDR len, len_m - sub len, 16 - SSTR len_m, len - jl .return_fail - xor pos, pos - movdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - sal vec, LOG_PS ;vec *= PS. Make vec_i count by PS - SLDR dest1, dest1_m - mov dest2, [dest1+PS] - SSTR dest2_m, dest2 - mov dest3, [dest1+2*PS] - SSTR dest3_m, dest3 - mov dest1, [dest1] - SSTR dest1_m, dest1 - -.loop16: - pxor xp1, xp1 - pxor xp2, xp2 - pxor xp3, xp3 - mov tmp, mul_array - xor vec_i, vec_i - -.next_vect: - SLDR src, src_m - mov ptr, [src+vec_i] - - movdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - movdqu xgft1_hi, [tmp+16] ; " Ax{00}, Ax{10}, ..., Ax{f0} - %ifidn PS,8 ;64-bit code - movdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - movdqu xgft2_hi, [tmp+vec*(32/PS)+16] ; " Bx{00}, Bx{10}, ..., Bx{f0} - movdqu xgft3_lo, [tmp+vec*(64/PS)] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - movdqu xgft3_hi, [tmp+vec*(64/PS)+16] ; " Cx{00}, Cx{10}, ..., Cx{f0} - add tmp, 32 - add vec_i, PS - %endif - XLDR x0, [ptr+pos] ;Get next source vector - - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - - pshufb xgft1_hi, x0 ;Lookup mul table of high nibble - pshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft1_hi, xgft1_lo ;GF add high and low partials - pxor xp1, xgft1_hi ;xp1 += partial - - %ifidn PS,4 ;32-bit code - movdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - movdqu xgft2_hi, [tmp+vec*(32/PS)+16] ; " Bx{00}, Bx{10}, ..., Bx{f0} - %endif - pshufb xgft2_hi, x0 ;Lookup mul table of high nibble - pshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft2_hi, xgft2_lo ;GF add high and low partials - pxor xp2, xgft2_hi ;xp2 += partial - - %ifidn PS,4 ;32-bit code - sal vec, 1 - movdqu xgft3_lo, [tmp+vec*(32/PS)] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - movdqu xgft3_hi, [tmp+vec*(32/PS)+16] ; " Cx{00}, Cx{10}, ..., Cx{f0} - sar vec, 1 - add tmp, 32 - add vec_i, PS - %endif - pshufb xgft3_hi, x0 ;Lookup mul table of high nibble - pshufb xgft3_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft3_hi, xgft3_lo ;GF add high and low partials - pxor xp3, xgft3_hi ;xp3 += partial - - cmp vec_i, vec - jl .next_vect - - SLDR dest1, dest1_m - SLDR dest2, dest2_m - XSTR [dest1+pos], xp1 - XSTR [dest2+pos], xp2 - SLDR dest3, dest3_m - XSTR [dest3+pos], xp3 - - SLDR len, len_m - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - jmp .loop16 ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -align 16 -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_3vect_dot_prod_sse, 00, 05, 0063 diff --git a/pkg/erasure/gf_3vect_mad_avx.asm b/pkg/erasure/gf_3vect_mad_avx.asm deleted file mode 100644 index d9c22be35..000000000 --- a/pkg/erasure/gf_3vect_mad_avx.asm +++ /dev/null @@ -1,310 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_3vect_mad_avx(len, vec, vec_i, mul_array, src, dest); -;;; - -%define PS 8 - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 - %define arg5 r15 - %define tmp r11 - %define return rax - %define return.w eax - %define stack_size 16*10 + 3*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - -%macro FUNC_SAVE 0 - sub rsp, stack_size - vmovdqa [rsp+16*0],xmm6 - vmovdqa [rsp+16*1],xmm7 - vmovdqa [rsp+16*2],xmm8 - vmovdqa [rsp+16*3],xmm9 - vmovdqa [rsp+16*4],xmm10 - vmovdqa [rsp+16*5],xmm11 - vmovdqa [rsp+16*6],xmm12 - vmovdqa [rsp+16*7],xmm13 - vmovdqa [rsp+16*8],xmm14 - vmovdqa [rsp+16*9],xmm15 - save_reg r12, 10*16 + 0*8 - save_reg r15, 10*16 + 1*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) -%endmacro - -%macro FUNC_RESTORE 0 - vmovdqa xmm6, [rsp+16*0] - vmovdqa xmm7, [rsp+16*1] - vmovdqa xmm8, [rsp+16*2] - vmovdqa xmm9, [rsp+16*3] - vmovdqa xmm10, [rsp+16*4] - vmovdqa xmm11, [rsp+16*5] - vmovdqa xmm12, [rsp+16*6] - vmovdqa xmm13, [rsp+16*7] - vmovdqa xmm14, [rsp+16*8] - vmovdqa xmm15, [rsp+16*9] - mov r12, [rsp + 10*16 + 0*8] - mov r15, [rsp + 10*16 + 1*8] - add rsp, stack_size -%endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE - -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - -;;; gf_3vect_mad_avx(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest1 arg5 -%define pos return -%define pos.w return.w - -%define dest2 mul_array -%define dest3 vec_i - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - - -default rel - -[bits 64] -section .text - -%define xmask0f xmm15 -%define xgft1_lo xmm14 -%define xgft1_hi xmm13 -%define xgft2_lo xmm12 -%define xgft2_hi xmm11 -%define xgft3_lo xmm10 -%define xgft3_hi xmm9 - -%define x0 xmm0 -%define xtmpa xmm1 -%define xtmph1 xmm2 -%define xtmpl1 xmm3 -%define xtmph2 xmm4 -%define xtmpl2 xmm5 -%define xtmph3 xmm6 -%define xtmpl3 xmm7 -%define xd1 xmm8 -%define xd2 xtmpl1 -%define xd3 xtmph1 - -align 16 -global gf_3vect_mad_avx:function -func(gf_3vect_mad_avx) - FUNC_SAVE - sub len, 16 - jl .return_fail - xor pos, pos - vmovdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - - sal vec_i, 5 ;Multiply by 32 - sal vec, 5 - lea tmp, [mul_array + vec_i] - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - vmovdqu xgft1_hi, [tmp+16] ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - vmovdqu xgft2_lo, [tmp+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - vmovdqu xgft2_hi, [tmp+vec+16] ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - vmovdqu xgft3_lo, [tmp+2*vec] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - vmovdqu xgft3_hi, [tmp+2*vec+16]; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - mov dest2, [dest1+PS] ; reuse mul_array - mov dest3, [dest1+2*PS] ; reuse vec_i - mov dest1, [dest1] - -.loop16: - XLDR x0, [src+pos] ;Get next source vector - XLDR xd1, [dest1+pos] ;Get next dest vector - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - ; dest1 - vpshufb xtmph1, xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl1, xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xtmpl1 ;GF add high and low partials - vpxor xd1, xd1, xtmph1 ;xd1 += partial - - XLDR xd2, [dest2+pos] ;reuse xtmpl1. Get next dest vector - XLDR xd3, [dest3+pos] ;reuse xtmph1. Get next dest vector - - ; dest2 - vpshufb xtmph2, xgft2_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl2, xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmph2, xtmpl2 ;GF add high and low partials - vpxor xd2, xd2, xtmph2 ;xd2 += partial - - ; dest3 - vpshufb xtmph3, xgft3_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl3, xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph3, xtmph3, xtmpl3 ;GF add high and low partials - vpxor xd3, xd3, xtmph3 ;xd3 += partial - - XSTR [dest1+pos], xd1 - XSTR [dest2+pos], xd2 - XSTR [dest3+pos], xd3 - - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - -.lessthan16: - ;; Tail len - ;; Do one more overlap pass - mov tmp, len ;Overlapped offset length-16 - XLDR x0, [src+tmp] ;Get next source vector - XLDR xd1, [dest1+tmp] ;Get next dest vector - XLDR xd2, [dest2+tmp] ;reuse xtmpl1. Get next dest vector - XLDR xd3, [dest3+tmp] ;reuse xtmph1. Get next dest vector - - sub len, pos - - movdqa xtmph3, [constip16] ;Load const of i + 16 - vpinsrb xtmpl3, xtmpl3, len.w, 15 - vpshufb xtmpl3, xtmpl3, xmask0f ;Broadcast len to all bytes - vpcmpgtb xtmpl3, xtmpl3, xtmph3 - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - ; dest1 - vpshufb xgft1_hi, xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft1_hi, xgft1_hi, xgft1_lo ;GF add high and low partials - vpand xgft1_hi, xgft1_hi, xtmpl3 - vpxor xd1, xd1, xgft1_hi - - ; dest2 - vpshufb xgft2_hi, xgft2_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft2_hi, xgft2_hi, xgft2_lo ;GF add high and low partials - vpand xgft2_hi, xgft2_hi, xtmpl3 - vpxor xd2, xd2, xgft2_hi - - ; dest3 - vpshufb xgft3_hi, xgft3_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft3_lo, xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft3_hi, xgft3_hi, xgft3_lo ;GF add high and low partials - vpand xgft3_hi, xgft3_hi, xtmpl3 - vpxor xd3, xd3, xgft3_hi - - XSTR [dest1+tmp], xd1 - XSTR [dest2+tmp], xd2 - XSTR [dest3+tmp], xd3 - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -align 16 -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f -constip16: - ddq 0xf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_3vect_mad_avx, 02, 00, 0207 diff --git a/pkg/erasure/gf_3vect_mad_avx2.asm b/pkg/erasure/gf_3vect_mad_avx2.asm deleted file mode 100644 index baac0e545..000000000 --- a/pkg/erasure/gf_3vect_mad_avx2.asm +++ /dev/null @@ -1,342 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_3vect_mad_avx2(len, vec, vec_i, mul_array, src, dest); -;;; - -%define PS 8 - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 ; must be saved, loaded and restored - %define arg5 r15 ; must be saved and restored - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define return rax - %define return.w eax - %define stack_size 16*10 + 3*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - - %macro FUNC_SAVE 0 - sub rsp, stack_size - vmovdqa [rsp+16*0],xmm6 - vmovdqa [rsp+16*1],xmm7 - vmovdqa [rsp+16*2],xmm8 - vmovdqa [rsp+16*3],xmm9 - vmovdqa [rsp+16*4],xmm10 - vmovdqa [rsp+16*5],xmm11 - vmovdqa [rsp+16*6],xmm12 - vmovdqa [rsp+16*7],xmm13 - vmovdqa [rsp+16*8],xmm14 - vmovdqa [rsp+16*9],xmm15 - save_reg r12, 10*16 + 0*8 - save_reg r15, 10*16 + 1*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) - %endmacro - - %macro FUNC_RESTORE 0 - vmovdqa xmm6, [rsp+16*0] - vmovdqa xmm7, [rsp+16*1] - vmovdqa xmm8, [rsp+16*2] - vmovdqa xmm9, [rsp+16*3] - vmovdqa xmm10, [rsp+16*4] - vmovdqa xmm11, [rsp+16*5] - vmovdqa xmm12, [rsp+16*6] - vmovdqa xmm13, [rsp+16*7] - vmovdqa xmm14, [rsp+16*8] - vmovdqa xmm15, [rsp+16*9] - mov r12, [rsp + 10*16 + 0*8] - mov r15, [rsp + 10*16 + 1*8] - add rsp, stack_size - %endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE - -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - -;;; gf_3vect_mad_avx2(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest1 arg5 -%define pos return -%define pos.w return.w - -%define dest2 mul_array -%define dest3 vec_i - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - - -default rel - -[bits 64] -section .text - -%define xmask0f ymm15 -%define xmask0fx xmm15 -%define xgft1_lo ymm14 -%define xgft1_hi ymm13 -%define xgft2_lo ymm12 -%define xgft3_lo ymm11 - -%define x0 ymm0 -%define xtmpa ymm1 -%define xtmph1 ymm2 -%define xtmpl1 ymm3 -%define xtmph2 ymm4 -%define xtmpl2 ymm5 -%define xtmpl2x xmm5 -%define xtmph3 ymm6 -%define xtmpl3 ymm7 -%define xtmpl3x xmm7 -%define xd1 ymm8 -%define xd2 ymm9 -%define xd3 ymm10 - -align 16 -global gf_3vect_mad_avx2:function -func(gf_3vect_mad_avx2) - FUNC_SAVE - sub len, 32 - jl .return_fail - xor pos, pos - mov tmp.b, 0x0f - vpinsrb xmask0fx, xmask0fx, tmp.w, 0 - vpbroadcastb xmask0f, xmask0fx ;Construct mask 0x0f0f0f... - - sal vec_i, 5 ;Multiply by 32 - sal vec, 5 - lea tmp, [mul_array + vec_i] - - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - ; " Ax{00}, Ax{10}, ..., Ax{f0} - vperm2i128 xgft1_hi, xgft1_lo, xgft1_lo, 0x11 ; swapped to hi | hi - vperm2i128 xgft1_lo, xgft1_lo, xgft1_lo, 0x00 ; swapped to lo | lo - - vmovdqu xgft2_lo, [tmp+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - vmovdqu xgft3_lo, [tmp+2*vec] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - mov dest2, [dest1+PS] ; reuse mul_array - mov dest3, [dest1+2*PS] ; reuse vec_i - mov dest1, [dest1] - -.loop32: - XLDR x0, [src+pos] ;Get next source vector - XLDR xd1, [dest1+pos] ;Get next dest vector - XLDR xd2, [dest2+pos] ;Get next dest vector - XLDR xd3, [dest3+pos] ;Get next dest vector - vperm2i128 xtmph2, xgft2_lo, xgft2_lo, 0x11 ; swapped to hi | hi - vperm2i128 xtmpl2, xgft2_lo, xgft2_lo, 0x00 ; swapped to lo | lo - - vperm2i128 xtmph3, xgft3_lo, xgft3_lo, 0x11 ; swapped to hi | hi - vperm2i128 xtmpl3, xgft3_lo, xgft3_lo, 0x00 ; swapped to lo | lo - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - ; dest1 - vpshufb xtmph1, xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl1, xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xtmpl1 ;GF add high and low partials - vpxor xd1, xd1, xtmph1 ;xd1 += partial - - ; dest2 - vpshufb xtmph2, x0 ;Lookup mul table of high nibble - vpshufb xtmpl2, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmpl2 ;GF add high and low partials - vpxor xd2, xtmph2 ;xd2 += partial - - ; dest3 - vpshufb xtmph3, x0 ;Lookup mul table of high nibble - vpshufb xtmpl3, xtmpa ;Lookup mul table of low nibble - vpxor xtmph3, xtmpl3 ;GF add high and low partials - vpxor xd3, xtmph3 ;xd3 += partial - - XSTR [dest1+pos], xd1 - XSTR [dest2+pos], xd2 - XSTR [dest3+pos], xd3 - - add pos, 32 ;Loop on 32 bytes at a time - cmp pos, len - jle .loop32 - - lea tmp, [len + 32] - cmp pos, tmp - je .return_pass - -.lessthan32: - ;; Tail len - ;; Do one more overlap pass - mov tmp.b, 0x1f - vpinsrb xtmpl2x, xtmpl2x, tmp.w, 0 - vpbroadcastb xtmpl2, xtmpl2x ;Construct mask 0x1f1f1f... - - mov tmp, len ;Overlapped offset length-32 - - XLDR x0, [src+tmp] ;Get next source vector - XLDR xd1, [dest1+tmp] ;Get next dest vector - XLDR xd2, [dest2+tmp] ;Get next dest vector - XLDR xd3, [dest3+tmp] ;Get next dest vector - - sub len, pos - - vmovdqa xtmph3, [constip32] ;Load const of i + 32 - vpinsrb xtmpl3x, xtmpl3x, len.w, 15 - vinserti128 xtmpl3, xtmpl3, xtmpl3x, 1 ;swapped to xtmpl3x | xtmpl3x - vpshufb xtmpl3, xtmpl3, xtmpl2 ;Broadcast len to all bytes. xtmpl2=0x1f1f1f... - vpcmpgtb xtmpl3, xtmpl3, xtmph3 - - vperm2i128 xtmph2, xgft2_lo, xgft2_lo, 0x11 ; swapped to hi | hi - vperm2i128 xgft2_lo, xgft2_lo, xgft2_lo, 0x00 ; swapped to lo | lo - - vperm2i128 xtmph3, xgft3_lo, xgft3_lo, 0x11 ; swapped to hi | hi - vperm2i128 xgft3_lo, xgft3_lo, xgft3_lo, 0x00 ; swapped to lo | lo - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - ; dest1 - vpshufb xtmph1, xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl1, xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xtmpl1 ;GF add high and low partials - vpand xtmph1, xtmph1, xtmpl3 - vpxor xd1, xd1, xtmph1 ;xd1 += partial - - ; dest2 - vpshufb xtmph2, xtmph2, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmph2, xgft2_lo ;GF add high and low partials - vpand xtmph2, xtmph2, xtmpl3 - vpxor xd2, xd2, xtmph2 ;xd2 += partial - - ; dest3 - vpshufb xtmph3, xtmph3, x0 ;Lookup mul table of high nibble - vpshufb xgft3_lo, xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph3, xtmph3, xgft3_lo ;GF add high and low partials - vpand xtmph3, xtmph3, xtmpl3 - vpxor xd3, xd3, xtmph3 ;xd3 += partial - - XSTR [dest1+tmp], xd1 - XSTR [dest2+tmp], xd2 - XSTR [dest3+tmp], xd3 - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -align 32 -constip32: - ddq 0xf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff - ddq 0xe0e1e2e3e4e5e6e7e8e9eaebecedeeef - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_3vect_mad_avx2, 04, 00, 0208 diff --git a/pkg/erasure/gf_3vect_mad_sse.asm b/pkg/erasure/gf_3vect_mad_sse.asm deleted file mode 100644 index 45f55f970..000000000 --- a/pkg/erasure/gf_3vect_mad_sse.asm +++ /dev/null @@ -1,321 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_3vect_mad_sse(len, vec, vec_i, mul_array, src, dest); -;;; - -%define PS 8 - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 - %define arg5 r15 - %define tmp r11 - %define return rax - %define return.w eax - %define stack_size 16*10 + 3*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - -%macro FUNC_SAVE 0 - sub rsp, stack_size - movdqa [rsp+16*0],xmm6 - movdqa [rsp+16*1],xmm7 - movdqa [rsp+16*2],xmm8 - movdqa [rsp+16*3],xmm9 - movdqa [rsp+16*4],xmm10 - movdqa [rsp+16*5],xmm11 - movdqa [rsp+16*6],xmm12 - movdqa [rsp+16*7],xmm13 - movdqa [rsp+16*8],xmm14 - movdqa [rsp+16*9],xmm15 - save_reg r12, 10*16 + 0*8 - save_reg r15, 10*16 + 1*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) -%endmacro - -%macro FUNC_RESTORE 0 - movdqa xmm6, [rsp+16*0] - movdqa xmm7, [rsp+16*1] - movdqa xmm8, [rsp+16*2] - movdqa xmm9, [rsp+16*3] - movdqa xmm10, [rsp+16*4] - movdqa xmm11, [rsp+16*5] - movdqa xmm12, [rsp+16*6] - movdqa xmm13, [rsp+16*7] - movdqa xmm14, [rsp+16*8] - movdqa xmm15, [rsp+16*9] - mov r12, [rsp + 10*16 + 0*8] - mov r15, [rsp + 10*16 + 1*8] - add rsp, stack_size -%endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE - -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - -;;; gf_3vect_mad_sse(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest1 arg5 -%define pos return -%define pos.w return.w - -%define dest2 mul_array -%define dest3 vec_i - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR movdqu - %define XSTR movdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR movdqa - %define XSTR movdqa - %else - %define XLDR movntdqa - %define XSTR movntdq - %endif -%endif - -default rel - -[bits 64] -section .text - -%define xmask0f xmm15 -%define xgft1_lo xmm14 -%define xgft1_hi xmm13 -%define xgft2_lo xmm12 -%define xgft2_hi xmm11 -%define xgft3_lo xmm10 -%define xgft3_hi xmm9 - -%define x0 xmm0 -%define xtmpa xmm1 -%define xtmph1 xmm2 -%define xtmpl1 xmm3 -%define xtmph2 xmm4 -%define xtmpl2 xmm5 -%define xtmph3 xmm6 -%define xtmpl3 xmm7 -%define xd1 xmm8 -%define xd2 xtmpl1 -%define xd3 xtmph1 - -align 16 -global gf_3vect_mad_sse:function -func(gf_3vect_mad_sse) - FUNC_SAVE - sub len, 16 - jl .return_fail - xor pos, pos - movdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - sal vec_i, 5 ;Multiply by 32 - sal vec, 5 - lea tmp, [mul_array + vec_i] - - movdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - movdqu xgft1_hi, [tmp+16] ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - movdqu xgft2_lo, [tmp+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - movdqu xgft2_hi, [tmp+vec+16] ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - movdqu xgft3_lo, [tmp+2*vec] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - movdqu xgft3_hi, [tmp+2*vec+16] ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - mov dest2, [dest1+PS] ; reuse mul_array - mov dest3, [dest1+2*PS] ; reuse vec_i - mov dest1, [dest1] - -.loop16: - XLDR x0, [src+pos] ;Get next source vector - movdqa xtmph1, xgft1_hi ;Reload const array registers - movdqa xtmpl1, xgft1_lo - movdqa xtmph2, xgft2_hi ;Reload const array registers - movdqa xtmpl2, xgft2_lo - movdqa xtmph3, xgft3_hi ;Reload const array registers - movdqa xtmpl3, xgft3_lo - - XLDR xd1, [dest1+pos] ;Get next dest vector - - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - - ; dest1 - pshufb xtmph1, x0 ;Lookup mul table of high nibble - pshufb xtmpl1, xtmpa ;Lookup mul table of low nibble - pxor xtmph1, xtmpl1 ;GF add high and low partials - pxor xd1, xtmph1 - - XLDR xd2, [dest2+pos] ;reuse xtmpl1. Get next dest vector - XLDR xd3, [dest3+pos] ;reuse xtmph1. Get next dest vector - - ; dest2 - pshufb xtmph2, x0 ;Lookup mul table of high nibble - pshufb xtmpl2, xtmpa ;Lookup mul table of low nibble - pxor xtmph2, xtmpl2 ;GF add high and low partials - pxor xd2, xtmph2 - - ; dest3 - pshufb xtmph3, x0 ;Lookup mul table of high nibble - pshufb xtmpl3, xtmpa ;Lookup mul table of low nibble - pxor xtmph3, xtmpl3 ;GF add high and low partials - pxor xd3, xtmph3 - - XSTR [dest1+pos], xd1 ;Store result - XSTR [dest2+pos], xd2 ;Store result - XSTR [dest3+pos], xd3 ;Store result - - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - -.lessthan16: - ;; Tail len - ;; Do one more overlap pass - mov tmp, len ;Overlapped offset length-16 - - XLDR x0, [src+tmp] ;Get next source vector - XLDR xd1, [dest1+tmp] ;Get next dest vector - XLDR xd2, [dest2+tmp] ;reuse xtmpl1. Get next dest vector - XLDR xd3, [dest3+tmp] ;reuse xtmph1. Get next dest vector - - sub len, pos - - movdqa xtmph3, [constip16] ;Load const of i + 16 - pinsrb xtmpl3, len.w, 15 - pshufb xtmpl3, xmask0f ;Broadcast len to all bytes - pcmpgtb xtmpl3, xtmph3 - - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - - ; dest1 - pshufb xgft1_hi, x0 ;Lookup mul table of high nibble - pshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft1_hi, xgft1_lo ;GF add high and low partials - pand xgft1_hi, xtmpl3 - pxor xd1, xgft1_hi - - ; dest2 - pshufb xgft2_hi, x0 ;Lookup mul table of high nibble - pshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft2_hi, xgft2_lo ;GF add high and low partials - pand xgft2_hi, xtmpl3 - pxor xd2, xgft2_hi - - ; dest3 - pshufb xgft3_hi, x0 ;Lookup mul table of high nibble - pshufb xgft3_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft3_hi, xgft3_lo ;GF add high and low partials - pand xgft3_hi, xtmpl3 - pxor xd3, xgft3_hi - - XSTR [dest1+tmp], xd1 ;Store result - XSTR [dest2+tmp], xd2 ;Store result - XSTR [dest3+tmp], xd3 ;Store result - -.return_pass: - FUNC_RESTORE - mov return, 0 - ret - -.return_fail: - FUNC_RESTORE - mov return, 1 - ret - -endproc_frame - -section .data - -align 16 - -mask0f: - ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f -constip16: - ddq 0xf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_3vect_mad_sse, 00, 00, 0206 diff --git a/pkg/erasure/gf_4vect_dot_prod_avx.asm b/pkg/erasure/gf_4vect_dot_prod_avx.asm deleted file mode 100644 index 07d330ea9..000000000 --- a/pkg/erasure/gf_4vect_dot_prod_avx.asm +++ /dev/null @@ -1,483 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_4vect_dot_prod_avx(len, vec, *g_tbls, **buffs, **dests); -;;; - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved, loaded and restored - %define arg5 r15 ; must be saved and restored - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r14 ; must be saved and restored - %define tmp5 rdi ; must be saved and restored - %define tmp6 rsi ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - %define stack_size 9*16 + 7*8 ; must be an odd multiple of 8 - %define arg(x) [rsp + stack_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - save_xmm128 xmm6, 0*16 - save_xmm128 xmm7, 1*16 - save_xmm128 xmm8, 2*16 - save_xmm128 xmm9, 3*16 - save_xmm128 xmm10, 4*16 - save_xmm128 xmm11, 5*16 - save_xmm128 xmm12, 6*16 - save_xmm128 xmm13, 7*16 - save_xmm128 xmm14, 8*16 - save_reg r12, 9*16 + 0*8 - save_reg r13, 9*16 + 1*8 - save_reg r14, 9*16 + 2*8 - save_reg r15, 9*16 + 3*8 - save_reg rdi, 9*16 + 4*8 - save_reg rsi, 9*16 + 5*8 - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - vmovdqa xmm6, [rsp + 0*16] - vmovdqa xmm7, [rsp + 1*16] - vmovdqa xmm8, [rsp + 2*16] - vmovdqa xmm9, [rsp + 3*16] - vmovdqa xmm10, [rsp + 4*16] - vmovdqa xmm11, [rsp + 5*16] - vmovdqa xmm12, [rsp + 6*16] - vmovdqa xmm13, [rsp + 7*16] - vmovdqa xmm14, [rsp + 8*16] - mov r12, [rsp + 9*16 + 0*8] - mov r13, [rsp + 9*16 + 1*8] - mov r14, [rsp + 9*16 + 2*8] - mov r15, [rsp + 9*16 + 3*8] - mov rdi, [rsp + 9*16 + 4*8] - mov rsi, [rsp + 9*16 + 5*8] - add rsp, stack_size - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, elf32 - -;;;================== High Address; -;;; arg4 -;;; arg3 -;;; arg2 -;;; arg1 -;;; arg0 -;;; return -;;;<================= esp of caller -;;; ebp -;;;<================= ebp = esp -;;; var0 -;;; var1 -;;; var2 -;;; var3 -;;; esi -;;; edi -;;; ebx -;;;<================= esp of callee -;;; -;;;================== Low Address; - - %define PS 4 - %define LOG_PS 2 - %define func(x) x: - %define arg(x) [ebp + PS*2 + PS*x] - %define var(x) [ebp - PS - PS*x] - - %define trans ecx - %define trans2 esi - %define arg0 trans ;trans and trans2 are for the variables in stack - %define arg0_m arg(0) - %define arg1 ebx - %define arg2 arg2_m - %define arg2_m arg(2) - %define arg3 trans - %define arg3_m arg(3) - %define arg4 trans - %define arg4_m arg(4) - %define arg5 trans2 - %define tmp edx - %define tmp2 edi - %define tmp3 trans2 - %define tmp3_m var(0) - %define tmp4 trans2 - %define tmp4_m var(1) - %define tmp5 trans2 - %define tmp5_m var(2) - %define tmp6 trans2 - %define tmp6_m var(3) - %define return eax - %macro SLDR 2 ;stack load/restore - mov %1, %2 - %endmacro - %define SSTR SLDR - - %macro FUNC_SAVE 0 - push ebp - mov ebp, esp - sub esp, PS*4 ;4 local variables - push esi - push edi - push ebx - mov arg1, arg(1) - %endmacro - - %macro FUNC_RESTORE 0 - pop ebx - pop edi - pop esi - add esp, PS*4 ;4 local variables - pop ebp - %endmacro - -%endif ; output formats - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest1 arg4 -%define ptr arg5 -%define vec_i tmp2 -%define dest2 tmp3 -%define dest3 tmp4 -%define dest4 tmp5 -%define vskip3 tmp6 -%define pos return - - %ifidn PS,4 ;32-bit code - %define len_m arg0_m - %define src_m arg3_m - %define dest1_m arg4_m - %define dest2_m tmp3_m - %define dest3_m tmp4_m - %define dest4_m tmp5_m - %define vskip3_m tmp6_m - %endif - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - -%ifidn PS,8 ; 64-bit code - default rel - [bits 64] -%endif - - -section .text - -%ifidn PS,8 ;64-bit code - %define xmask0f xmm14 - %define xgft1_lo xmm13 - %define xgft1_hi xmm12 - %define xgft2_lo xmm11 - %define xgft2_hi xmm10 - %define xgft3_lo xmm9 - %define xgft3_hi xmm8 - %define xgft4_lo xmm7 - %define xgft4_hi xmm6 - - %define x0 xmm0 - %define xtmpa xmm1 - %define xp1 xmm2 - %define xp2 xmm3 - %define xp3 xmm4 - %define xp4 xmm5 -%else - %define xmm_trans xmm7 ;reuse xmask0f and xgft1_lo - %define xmask0f xmm_trans - %define xgft1_lo xmm_trans - %define xgft1_hi xmm6 - %define xgft2_lo xgft1_lo - %define xgft2_hi xgft1_hi - %define xgft3_lo xgft1_lo - %define xgft3_hi xgft1_hi - %define xgft4_lo xgft1_lo - %define xgft4_hi xgft1_hi - - %define x0 xmm0 - %define xtmpa xmm1 - %define xp1 xmm2 - %define xp2 xmm3 - %define xp3 xmm4 - %define xp4 xmm5 -%endif -align 16 -global gf_4vect_dot_prod_avx:function -func(gf_4vect_dot_prod_avx) - FUNC_SAVE - SLDR len, len_m - sub len, 16 - SSTR len_m, len - jl .return_fail - xor pos, pos - vmovdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - mov vskip3, vec - imul vskip3, 96 - SSTR vskip3_m, vskip3 - sal vec, LOG_PS ;vec *= PS. Make vec_i count by PS - SLDR dest1, dest1_m - mov dest2, [dest1+PS] - SSTR dest2_m, dest2 - mov dest3, [dest1+2*PS] - SSTR dest3_m, dest3 - mov dest4, [dest1+3*PS] - SSTR dest4_m, dest4 - mov dest1, [dest1] - SSTR dest1_m, dest1 - -.loop16: - vpxor xp1, xp1 - vpxor xp2, xp2 - vpxor xp3, xp3 - vpxor xp4, xp4 - mov tmp, mul_array - xor vec_i, vec_i - -.next_vect: - SLDR src, src_m - mov ptr, [src+vec_i] - - %ifidn PS,8 ;64-bit code - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - vmovdqu xgft1_hi, [tmp+16] ; " Ax{00}, Ax{10}, ..., Ax{f0} - vmovdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - vmovdqu xgft2_hi, [tmp+vec*(32/PS)+16] ; " Bx{00}, Bx{10}, ..., Bx{f0} - vmovdqu xgft3_lo, [tmp+vec*(64/PS)] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - vmovdqu xgft3_hi, [tmp+vec*(64/PS)+16] ; " Cx{00}, Cx{10}, ..., Cx{f0} - vmovdqu xgft4_lo, [tmp+vskip3] ;Load array Dx{00}, Dx{01}, ..., Dx{0f} - vmovdqu xgft4_hi, [tmp+vskip3+16] ; " Dx{00}, Dx{10}, ..., Dx{f0} - - XLDR x0, [ptr+pos] ;Get next source vector - add tmp, 32 - add vec_i, PS - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - %else ;32-bit code - XLDR x0, [ptr+pos] ;Get next source vector - vmovdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - vmovdqu xgft1_hi, [tmp+16] ; " Ax{00}, Ax{10}, ..., Ax{f0} - %endif - - vpshufb xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft1_hi, xgft1_lo ;GF add high and low partials - vpxor xp1, xgft1_hi ;xp1 += partial - - %ifidn PS,4 ;32-bit code - vmovdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - vmovdqu xgft2_hi, [tmp+vec*(32/PS)+16] ; " Bx{00}, Bx{10}, ..., Bx{f0} - %endif - vpshufb xgft2_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft2_hi, xgft2_lo ;GF add high and low partials - vpxor xp2, xgft2_hi ;xp2 += partial - - %ifidn PS,4 ;32-bit code - sal vec, 1 - vmovdqu xgft3_lo, [tmp+vec*(32/PS)] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - vmovdqu xgft3_hi, [tmp+vec*(32/PS)+16] ; " Cx{00}, Cx{10}, ..., Cx{f0} - sar vec, 1 - %endif - vpshufb xgft3_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft3_hi, xgft3_lo ;GF add high and low partials - vpxor xp3, xgft3_hi ;xp3 += partial - - %ifidn PS,4 ;32-bit code - SLDR vskip3, vskip3_m - vmovdqu xgft4_lo, [tmp+vskip3] ;Load array Dx{00}, Dx{01}, ..., Dx{0f} - vmovdqu xgft4_hi, [tmp+vskip3+16] ; " Dx{00}, Dx{10}, ..., Dx{f0} - add tmp, 32 - add vec_i, PS - %endif - vpshufb xgft4_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft4_hi, xgft4_lo ;GF add high and low partials - vpxor xp4, xgft4_hi ;xp4 += partial - - cmp vec_i, vec - jl .next_vect - - SLDR dest1, dest1_m - SLDR dest2, dest2_m - XSTR [dest1+pos], xp1 - XSTR [dest2+pos], xp2 - SLDR dest3, dest3_m - XSTR [dest3+pos], xp3 - SLDR dest4, dest4_m - XSTR [dest4+pos], xp4 - - SLDR len, len_m - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - jmp .loop16 ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -align 16 -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_4vect_dot_prod_avx, 02, 04, 0193 diff --git a/pkg/erasure/gf_4vect_dot_prod_avx2.asm b/pkg/erasure/gf_4vect_dot_prod_avx2.asm deleted file mode 100644 index a4da4f179..000000000 --- a/pkg/erasure/gf_4vect_dot_prod_avx2.asm +++ /dev/null @@ -1,504 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_4vect_dot_prod_avx2(len, vec, *g_tbls, **buffs, **dests); -;;; - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved, loaded and restored - %define arg5 r15 ; must be saved and restored - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r14 ; must be saved and restored - %define tmp5 rdi ; must be saved and restored - %define tmp6 rsi ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - %define stack_size 9*16 + 7*8 ; must be an odd multiple of 8 - %define arg(x) [rsp + stack_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - vmovdqa [rsp + 0*16], xmm6 - vmovdqa [rsp + 1*16], xmm7 - vmovdqa [rsp + 2*16], xmm8 - vmovdqa [rsp + 3*16], xmm9 - vmovdqa [rsp + 4*16], xmm10 - vmovdqa [rsp + 5*16], xmm11 - vmovdqa [rsp + 6*16], xmm12 - vmovdqa [rsp + 7*16], xmm13 - vmovdqa [rsp + 8*16], xmm14 - save_reg r12, 9*16 + 0*8 - save_reg r13, 9*16 + 1*8 - save_reg r14, 9*16 + 2*8 - save_reg r15, 9*16 + 3*8 - save_reg rdi, 9*16 + 4*8 - save_reg rsi, 9*16 + 5*8 - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - vmovdqa xmm6, [rsp + 0*16] - vmovdqa xmm7, [rsp + 1*16] - vmovdqa xmm8, [rsp + 2*16] - vmovdqa xmm9, [rsp + 3*16] - vmovdqa xmm10, [rsp + 4*16] - vmovdqa xmm11, [rsp + 5*16] - vmovdqa xmm12, [rsp + 6*16] - vmovdqa xmm13, [rsp + 7*16] - vmovdqa xmm14, [rsp + 8*16] - mov r12, [rsp + 9*16 + 0*8] - mov r13, [rsp + 9*16 + 1*8] - mov r14, [rsp + 9*16 + 2*8] - mov r15, [rsp + 9*16 + 3*8] - mov rdi, [rsp + 9*16 + 4*8] - mov rsi, [rsp + 9*16 + 5*8] - add rsp, stack_size - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, elf32 - -;;;================== High Address; -;;; arg4 -;;; arg3 -;;; arg2 -;;; arg1 -;;; arg0 -;;; return -;;;<================= esp of caller -;;; ebp -;;;<================= ebp = esp -;;; var0 -;;; var1 -;;; var2 -;;; var3 -;;; esi -;;; edi -;;; ebx -;;;<================= esp of callee -;;; -;;;================== Low Address; - - %define PS 4 - %define LOG_PS 2 - %define func(x) x: - %define arg(x) [ebp + PS*2 + PS*x] - %define var(x) [ebp - PS - PS*x] - - %define trans ecx - %define trans2 esi - %define arg0 trans ;trans and trans2 are for the variables in stack - %define arg0_m arg(0) - %define arg1 ebx - %define arg2 arg2_m - %define arg2_m arg(2) - %define arg3 trans - %define arg3_m arg(3) - %define arg4 trans - %define arg4_m arg(4) - %define arg5 trans2 - %define tmp edx - %define tmp.w edx - %define tmp.b dl - %define tmp2 edi - %define tmp3 trans2 - %define tmp3_m var(0) - %define tmp4 trans2 - %define tmp4_m var(1) - %define tmp5 trans2 - %define tmp5_m var(2) - %define tmp6 trans2 - %define tmp6_m var(3) - %define return eax - %macro SLDR 2 ;stack load/restore - mov %1, %2 - %endmacro - %define SSTR SLDR - - %macro FUNC_SAVE 0 - push ebp - mov ebp, esp - sub esp, PS*4 ;4 local variables - push esi - push edi - push ebx - mov arg1, arg(1) - %endmacro - - %macro FUNC_RESTORE 0 - pop ebx - pop edi - pop esi - add esp, PS*4 ;4 local variables - pop ebp - %endmacro - -%endif ; output formats - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest1 arg4 -%define ptr arg5 -%define vec_i tmp2 -%define dest2 tmp3 -%define dest3 tmp4 -%define dest4 tmp5 -%define vskip3 tmp6 -%define pos return - - %ifidn PS,4 ;32-bit code - %define len_m arg0_m - %define src_m arg3_m - %define dest1_m arg4_m - %define dest2_m tmp3_m - %define dest3_m tmp4_m - %define dest4_m tmp5_m - %define vskip3_m tmp6_m - %endif - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - -%ifidn PS,8 ;64-bit code - default rel - [bits 64] -%endif - - -section .text - -%ifidn PS,8 ;64-bit code - %define xmask0f ymm14 - %define xmask0fx xmm14 - %define xgft1_lo ymm13 - %define xgft1_hi ymm12 - %define xgft2_lo ymm11 - %define xgft2_hi ymm10 - %define xgft3_lo ymm9 - %define xgft3_hi ymm8 - %define xgft4_lo ymm7 - %define xgft4_hi ymm6 - - %define x0 ymm0 - %define xtmpa ymm1 - %define xp1 ymm2 - %define xp2 ymm3 - %define xp3 ymm4 - %define xp4 ymm5 -%else - %define ymm_trans ymm7 ;reuse xmask0f and xgft1_hi - %define xmask0f ymm_trans - %define xmask0fx xmm7 - %define xgft1_lo ymm6 - %define xgft1_hi ymm_trans - %define xgft2_lo xgft1_lo - %define xgft2_hi xgft1_hi - %define xgft3_lo xgft1_lo - %define xgft3_hi xgft1_hi - %define xgft4_lo xgft1_lo - %define xgft4_hi xgft1_hi - - %define x0 ymm0 - %define xtmpa ymm1 - %define xp1 ymm2 - %define xp2 ymm3 - %define xp3 ymm4 - %define xp4 ymm5 -%endif -align 16 -global gf_4vect_dot_prod_avx2:function -func(gf_4vect_dot_prod_avx2) - FUNC_SAVE - SLDR len, len_m - sub len, 32 - SSTR len_m, len - jl .return_fail - xor pos, pos - mov tmp.b, 0x0f - vpinsrb xmask0fx, xmask0fx, tmp.w, 0 - vpbroadcastb xmask0f, xmask0fx ;Construct mask 0x0f0f0f... - mov vskip3, vec - imul vskip3, 96 - SSTR vskip3_m, vskip3 - sal vec, LOG_PS ;vec *= PS. Make vec_i count by PS - SLDR dest1, dest1_m - mov dest2, [dest1+PS] - SSTR dest2_m, dest2 - mov dest3, [dest1+2*PS] - SSTR dest3_m, dest3 - mov dest4, [dest1+3*PS] - SSTR dest4_m, dest4 - mov dest1, [dest1] - SSTR dest1_m, dest1 - -.loop32: - vpxor xp1, xp1 - vpxor xp2, xp2 - vpxor xp3, xp3 - vpxor xp4, xp4 - mov tmp, mul_array - xor vec_i, vec_i - -.next_vect: - SLDR src, src_m - mov ptr, [src+vec_i] - XLDR x0, [ptr+pos] ;Get next source vector - - add vec_i, PS - %ifidn PS,8 ;64-bit code - vpand xgft4_lo, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - vperm2i128 xtmpa, xgft4_lo, x0, 0x30 ;swap xtmpa from 1lo|2lo to 1lo|2hi - vperm2i128 x0, xgft4_lo, x0, 0x12 ;swap x0 from 1hi|2hi to 1hi|2lo - - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - ; " Ax{00}, Ax{10}, ..., Ax{f0} - vmovdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - ; " Bx{00}, Bx{10}, ..., Bx{f0} - vmovdqu xgft3_lo, [tmp+vec*(64/PS)] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - ; " Cx{00}, Cx{10}, ..., Cx{f0} - vmovdqu xgft4_lo, [tmp+vskip3] ;Load array Dx{00}, Dx{01}, ..., Dx{0f} - ; " Dx{00}, Dx{10}, ..., Dx{f0} - - vperm2i128 xgft1_hi, xgft1_lo, xgft1_lo, 0x01 ; swapped to hi | lo - vperm2i128 xgft2_hi, xgft2_lo, xgft2_lo, 0x01 ; swapped to hi | lo - vperm2i128 xgft3_hi, xgft3_lo, xgft3_lo, 0x01 ; swapped to hi | lo - vperm2i128 xgft4_hi, xgft4_lo, xgft4_lo, 0x01 ; swapped to hi | lo - add tmp, 32 - %else ;32-bit code - mov cl, 0x0f ;use ecx as a temp variable - vpinsrb xmask0fx, xmask0fx, ecx, 0 - vpbroadcastb xmask0f, xmask0fx ;Construct mask 0x0f0f0f... - - vpand xgft4_lo, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - vperm2i128 xtmpa, xgft4_lo, x0, 0x30 ;swap xtmpa from 1lo|2lo to 1lo|2hi - vperm2i128 x0, xgft4_lo, x0, 0x12 ;swap x0 from 1hi|2hi to 1hi|2lo - - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - ; " Ax{00}, Ax{10}, ..., Ax{f0} - vperm2i128 xgft1_hi, xgft1_lo, xgft1_lo, 0x01 ; swapped to hi | lo - %endif - - vpshufb xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft1_hi, xgft1_lo ;GF add high and low partials - vpxor xp1, xgft1_hi ;xp1 += partial - - %ifidn PS,4 ; 32-bit code - vmovdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - ; " Bx{00}, Bx{10}, ..., Bx{f0} - vperm2i128 xgft2_hi, xgft2_lo, xgft2_lo, 0x01 ; swapped to hi | lo - %endif - vpshufb xgft2_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft2_hi, xgft2_lo ;GF add high and low partials - vpxor xp2, xgft2_hi ;xp2 += partial - - %ifidn PS,4 ; 32-bit code - sal vec, 1 - vmovdqu xgft3_lo, [tmp+vec*(32/PS)] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - ; " Cx{00}, Cx{10}, ..., Cx{f0} - vperm2i128 xgft3_hi, xgft3_lo, xgft3_lo, 0x01 ; swapped to hi | lo - sar vec, 1 - %endif - vpshufb xgft3_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft3_hi, xgft3_lo ;GF add high and low partials - vpxor xp3, xgft3_hi ;xp3 += partial - - %ifidn PS,4 ; 32-bit code - SLDR vskip3, vskip3_m - vmovdqu xgft4_lo, [tmp+vskip3] ;Load array Dx{00}, Dx{01}, ..., Dx{0f} - ; " DX{00}, Dx{10}, ..., Dx{f0} - vperm2i128 xgft4_hi, xgft4_lo, xgft4_lo, 0x01 ; swapped to hi | lo - add tmp, 32 - %endif - vpshufb xgft4_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft4_hi, xgft4_lo ;GF add high and low partials - vpxor xp4, xgft4_hi ;xp4 += partial - - cmp vec_i, vec - jl .next_vect - - SLDR dest1, dest1_m - SLDR dest2, dest2_m - XSTR [dest1+pos], xp1 - XSTR [dest2+pos], xp2 - SLDR dest3, dest3_m - XSTR [dest3+pos], xp3 - SLDR dest4, dest4_m - XSTR [dest4+pos], xp4 - - SLDR len, len_m - add pos, 32 ;Loop on 32 bytes at a time - cmp pos, len - jle .loop32 - - lea tmp, [len + 32] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-32 - jmp .loop32 ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_4vect_dot_prod_avx2, 04, 04, 0198 diff --git a/pkg/erasure/gf_4vect_dot_prod_sse.asm b/pkg/erasure/gf_4vect_dot_prod_sse.asm deleted file mode 100644 index 3097623b4..000000000 --- a/pkg/erasure/gf_4vect_dot_prod_sse.asm +++ /dev/null @@ -1,485 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_4vect_dot_prod_sse(len, vec, *g_tbls, **buffs, **dests); -;;; - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved, loaded and restored - %define arg5 r15 ; must be saved and restored - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r14 ; must be saved and restored - %define tmp5 rdi ; must be saved and restored - %define tmp6 rsi ; must be saved and restored - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define LOG_PS 3 - %define stack_size 9*16 + 7*8 ; must be an odd multiple of 8 - %define arg(x) [rsp + stack_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - save_xmm128 xmm6, 0*16 - save_xmm128 xmm7, 1*16 - save_xmm128 xmm8, 2*16 - save_xmm128 xmm9, 3*16 - save_xmm128 xmm10, 4*16 - save_xmm128 xmm11, 5*16 - save_xmm128 xmm12, 6*16 - save_xmm128 xmm13, 7*16 - save_xmm128 xmm14, 8*16 - save_reg r12, 9*16 + 0*8 - save_reg r13, 9*16 + 1*8 - save_reg r14, 9*16 + 2*8 - save_reg r15, 9*16 + 3*8 - save_reg rdi, 9*16 + 4*8 - save_reg rsi, 9*16 + 5*8 - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - movdqa xmm6, [rsp + 0*16] - movdqa xmm7, [rsp + 1*16] - movdqa xmm8, [rsp + 2*16] - movdqa xmm9, [rsp + 3*16] - movdqa xmm10, [rsp + 4*16] - movdqa xmm11, [rsp + 5*16] - movdqa xmm12, [rsp + 6*16] - movdqa xmm13, [rsp + 7*16] - movdqa xmm14, [rsp + 8*16] - mov r12, [rsp + 9*16 + 0*8] - mov r13, [rsp + 9*16 + 1*8] - mov r14, [rsp + 9*16 + 2*8] - mov r15, [rsp + 9*16 + 3*8] - mov rdi, [rsp + 9*16 + 4*8] - mov rsi, [rsp + 9*16 + 5*8] - add rsp, stack_size - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, elf32 - -;;;================== High Address; -;;; arg4 -;;; arg3 -;;; arg2 -;;; arg1 -;;; arg0 -;;; return -;;;<================= esp of caller -;;; ebp -;;;<================= ebp = esp -;;; var0 -;;; var1 -;;; var2 -;;; var3 -;;; esi -;;; edi -;;; ebx -;;;<================= esp of callee -;;; -;;;================== Low Address; - - %define PS 4 - %define LOG_PS 2 - %define func(x) x: - %define arg(x) [ebp + PS*2 + PS*x] - %define var(x) [ebp - PS - PS*x] - - %define trans ecx - %define trans2 esi - %define arg0 trans ;trans and trans2 are for the variables in stack - %define arg0_m arg(0) - %define arg1 ebx - %define arg2 arg2_m - %define arg2_m arg(2) - %define arg3 trans - %define arg3_m arg(3) - %define arg4 trans - %define arg4_m arg(4) - %define arg5 trans2 - %define tmp edx - %define tmp2 edi - %define tmp3 trans2 - %define tmp3_m var(0) - %define tmp4 trans2 - %define tmp4_m var(1) - %define tmp5 trans2 - %define tmp5_m var(2) - %define tmp6 trans2 - %define tmp6_m var(3) - %define return eax - %macro SLDR 2 ;stack load/restore - mov %1, %2 - %endmacro - %define SSTR SLDR - - %macro FUNC_SAVE 0 - push ebp - mov ebp, esp - sub esp, PS*4 ;4 local variables - push esi - push edi - push ebx - mov arg1, arg(1) - %endmacro - - %macro FUNC_RESTORE 0 - pop ebx - pop edi - pop esi - add esp, PS*4 ;4 local variables - pop ebp - %endmacro - -%endif ; output formats - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest1 arg4 -%define ptr arg5 -%define vec_i tmp2 -%define dest2 tmp3 -%define dest3 tmp4 -%define dest4 tmp5 -%define vskip3 tmp6 -%define pos return - - %ifidn PS,4 ;32-bit code - %define len_m arg0_m - %define src_m arg3_m - %define dest1_m arg4_m - %define dest2_m tmp3_m - %define dest3_m tmp4_m - %define dest4_m tmp5_m - %define vskip3_m tmp6_m - %endif - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR movdqu - %define XSTR movdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR movdqa - %define XSTR movdqa - %else - %define XLDR movntdqa - %define XSTR movntdq - %endif -%endif - -%ifidn PS,8 ; 64-bit code - default rel - [bits 64] -%endif - - -section .text - -%ifidn PS,8 ;64-bit code - %define xmask0f xmm14 - %define xgft1_lo xmm2 - %define xgft1_hi xmm3 - %define xgft2_lo xmm11 - %define xgft2_hi xmm4 - %define xgft3_lo xmm9 - %define xgft3_hi xmm5 - %define xgft4_lo xmm7 - %define xgft4_hi xmm6 - - %define x0 xmm0 - %define xtmpa xmm1 - %define xp1 xmm8 - %define xp2 xmm10 - %define xp3 xmm12 - %define xp4 xmm13 -%else - %define xmm_trans xmm7 ;reuse xmask0f and xgft1_lo - %define xmask0f xmm_trans - %define xgft1_lo xmm_trans - %define xgft1_hi xmm6 - %define xgft2_lo xgft1_lo - %define xgft2_hi xgft1_hi - %define xgft3_lo xgft1_lo - %define xgft3_hi xgft1_hi - %define xgft4_lo xgft1_lo - %define xgft4_hi xgft1_hi - - %define x0 xmm0 - %define xtmpa xmm1 - %define xp1 xmm2 - %define xp2 xmm3 - %define xp3 xmm4 - %define xp4 xmm5 -%endif -align 16 -global gf_4vect_dot_prod_sse:function -func(gf_4vect_dot_prod_sse) - FUNC_SAVE - SLDR len, len_m - sub len, 16 - SSTR len_m, len - jl .return_fail - xor pos, pos - movdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - mov vskip3, vec - imul vskip3, 96 - SSTR vskip3_m, vskip3 - sal vec, LOG_PS ;vec *= PS. Make vec_i count by PS - SLDR dest1, dest1_m - mov dest2, [dest1+PS] - SSTR dest2_m, dest2 - mov dest3, [dest1+2*PS] - SSTR dest3_m, dest3 - mov dest4, [dest1+3*PS] - SSTR dest4_m, dest4 - mov dest1, [dest1] - SSTR dest1_m, dest1 - -.loop16: - pxor xp1, xp1 - pxor xp2, xp2 - pxor xp3, xp3 - pxor xp4, xp4 - mov tmp, mul_array - xor vec_i, vec_i - -.next_vect: - SLDR src, src_m - mov ptr, [src+vec_i] - - %ifidn PS,8 ;64-bit code - movdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - movdqu xgft1_hi, [tmp+16] ; " Ax{00}, Ax{10}, ..., Ax{f0} - movdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - movdqu xgft2_hi, [tmp+vec*(32/PS)+16] ; " Bx{00}, Bx{10}, ..., Bx{f0} - movdqu xgft3_lo, [tmp+vec*(64/PS)] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - movdqu xgft3_hi, [tmp+vec*(64/PS)+16] ; " Cx{00}, Cx{10}, ..., Cx{f0} - movdqu xgft4_lo, [tmp+vskip3] ;Load array Dx{00}, Dx{01}, ..., Dx{0f} - movdqu xgft4_hi, [tmp+vskip3+16] ; " Dx{00}, Dx{10}, ..., Dx{f0} - - XLDR x0, [ptr+pos] ;Get next source vector - add tmp, 32 - add vec_i, PS - - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - %else ;32-bit code - XLDR x0, [ptr+pos] ;Get next source vector - movdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - - movdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - movdqu xgft1_hi, [tmp+16] ; " Ax{00}, Ax{10}, ..., Ax{f0} - %endif - - pshufb xgft1_hi, x0 ;Lookup mul table of high nibble - pshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft1_hi, xgft1_lo ;GF add high and low partials - pxor xp1, xgft1_hi ;xp1 += partial - - %ifidn PS,4 ;32-bit code - movdqu xgft2_lo, [tmp+vec*(32/PS)] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - movdqu xgft2_hi, [tmp+vec*(32/PS)+16] ; " Bx{00}, Bx{10}, ..., Bx{f0} - %endif - pshufb xgft2_hi, x0 ;Lookup mul table of high nibble - pshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft2_hi, xgft2_lo ;GF add high and low partials - pxor xp2, xgft2_hi ;xp2 += partial - - %ifidn PS,4 ;32-bit code - sal vec, 1 - movdqu xgft3_lo, [tmp+vec*(32/PS)] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - movdqu xgft3_hi, [tmp+vec*(32/PS)+16] ; " Cx{00}, Cx{10}, ..., Cx{f0} - sar vec, 1 - %endif - pshufb xgft3_hi, x0 ;Lookup mul table of high nibble - pshufb xgft3_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft3_hi, xgft3_lo ;GF add high and low partials - pxor xp3, xgft3_hi ;xp3 += partial - - %ifidn PS,4 ;32-bit code - SLDR vskip3, vskip3_m - movdqu xgft4_lo, [tmp+vskip3] ;Load array Dx{00}, Dx{01}, ..., Dx{0f} - movdqu xgft4_hi, [tmp+vskip3+16] ; " Dx{00}, Dx{10}, ..., Dx{f0} - add tmp, 32 - add vec_i, PS - %endif - pshufb xgft4_hi, x0 ;Lookup mul table of high nibble - pshufb xgft4_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft4_hi, xgft4_lo ;GF add high and low partials - pxor xp4, xgft4_hi ;xp4 += partial - - cmp vec_i, vec - jl .next_vect - - SLDR dest1, dest1_m - SLDR dest2, dest2_m - XSTR [dest1+pos], xp1 - XSTR [dest2+pos], xp2 - SLDR dest3, dest3_m - XSTR [dest3+pos], xp3 - SLDR dest4, dest4_m - XSTR [dest4+pos], xp4 - - SLDR len, len_m - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - jmp .loop16 ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -align 16 -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_4vect_dot_prod_sse, 00, 05, 0064 diff --git a/pkg/erasure/gf_4vect_mad_avx.asm b/pkg/erasure/gf_4vect_mad_avx.asm deleted file mode 100644 index 6b8d949fb..000000000 --- a/pkg/erasure/gf_4vect_mad_avx.asm +++ /dev/null @@ -1,365 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_4vect_mad_avx(len, vec, vec_i, mul_array, src, dest); -;;; - -%define PS 8 - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 - %define arg5 r15 - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 - %define return rax - %define return.w eax - %define stack_size 16*10 + 3*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - -%macro FUNC_SAVE 0 - sub rsp, stack_size - movdqa [rsp+16*0],xmm6 - movdqa [rsp+16*1],xmm7 - movdqa [rsp+16*2],xmm8 - movdqa [rsp+16*3],xmm9 - movdqa [rsp+16*4],xmm10 - movdqa [rsp+16*5],xmm11 - movdqa [rsp+16*6],xmm12 - movdqa [rsp+16*7],xmm13 - movdqa [rsp+16*8],xmm14 - movdqa [rsp+16*9],xmm15 - save_reg r12, 10*16 + 0*8 - save_reg r13, 10*16 + 1*8 - save_reg r15, 10*16 + 2*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) -%endmacro - -%macro FUNC_RESTORE 0 - movdqa xmm6, [rsp+16*0] - movdqa xmm7, [rsp+16*1] - movdqa xmm8, [rsp+16*2] - movdqa xmm9, [rsp+16*3] - movdqa xmm10, [rsp+16*4] - movdqa xmm11, [rsp+16*5] - movdqa xmm12, [rsp+16*6] - movdqa xmm13, [rsp+16*7] - movdqa xmm14, [rsp+16*8] - movdqa xmm15, [rsp+16*9] - mov r12, [rsp + 10*16 + 0*8] - mov r13, [rsp + 10*16 + 1*8] - mov r15, [rsp + 10*16 + 2*8] - add rsp, stack_size -%endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp2 r10 - %define tmp3 r12 - %define return rax - %define return.w eax - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - %endmacro - %macro FUNC_RESTORE 0 - pop r12 - %endmacro - -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp2 r10 - %define tmp3 r12 - %define return rax - %define return.w eax - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - %endmacro - %macro FUNC_RESTORE 0 - pop r12 - %endmacro -%endif - -;;; gf_4vect_mad_avx(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest1 arg5 -%define pos return -%define pos.w return.w - -%define dest2 mul_array -%define dest3 tmp2 -%define dest4 vec_i - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - - -default rel - -[bits 64] -section .text - -%define xmask0f xmm15 -%define xgft3_hi xmm14 -%define xgft4_hi xmm13 -%define xgft4_lo xmm12 - -%define x0 xmm0 -%define xtmpa xmm1 -%define xtmph1 xmm2 -%define xtmpl1 xmm3 -%define xtmph2 xmm4 -%define xtmpl2 xmm5 -%define xtmph3 xmm6 -%define xtmpl3 xmm7 -%define xtmph4 xmm8 -%define xtmpl4 xmm9 -%define xd1 xmm10 -%define xd2 xmm11 -%define xd3 xtmph1 -%define xd4 xtmpl1 - -align 16 -global gf_4vect_mad_avx:function -func(gf_4vect_mad_avx) - FUNC_SAVE - sub len, 16 - jl .return_fail - xor pos, pos - vmovdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - - mov tmp, vec - - sal vec_i, 5 ;Multiply by 32 - lea tmp3, [mul_array + vec_i] - - sal tmp, 6 ;Multiply by 64 - vmovdqu xgft3_hi, [tmp3+tmp+16] ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - sal vec, 5 ;Multiply by 32 - add tmp, vec - vmovdqu xgft4_lo, [tmp3+tmp] ;Load array Dx{00}, Dx{01}, Dx{02}, ... - vmovdqu xgft4_hi, [tmp3+tmp+16] ; " Dx{00}, Dx{10}, Dx{20}, ... , Dx{f0} - - mov dest2, [dest1+PS] ; reuse mul_array - mov dest3, [dest1+2*PS] - mov dest4, [dest1+3*PS] ; reuse vec_i - mov dest1, [dest1] - -.loop16: - XLDR x0, [src+pos] ;Get next source vector - vmovdqu xtmph1, [tmp3+16] ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - vmovdqu xtmpl1, [tmp3] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - vmovdqu xtmph2, [tmp3+vec+16] ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - vmovdqu xtmpl2, [tmp3+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - vmovdqu xtmpl3, [tmp3+2*vec] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - - XLDR xd1, [dest1+pos] ;Get next dest vector - XLDR xd2, [dest2+pos] ;Get next dest vector - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - ; dest1 - vpshufb xtmph1, xtmph1, x0 ;Lookup mul table of high nibble - vpshufb xtmpl1, xtmpl1, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xtmpl1 ;GF add high and low partials - vpxor xd1, xd1, xtmph1 - - XLDR xd3, [dest3+pos] ;Reuse xtmph1, Get next dest vector - XLDR xd4, [dest4+pos] ;Reuse xtmpl1, Get next dest vector - - ; dest2 - vpshufb xtmph2, xtmph2, x0 ;Lookup mul table of high nibble - vpshufb xtmpl2, xtmpl2, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmph2, xtmpl2 ;GF add high and low partials - vpxor xd2, xd2, xtmph2 - - ; dest3 - vpshufb xtmph3, xgft3_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl3, xtmpl3, xtmpa ;Lookup mul table of low nibble - vpxor xtmph3, xtmph3, xtmpl3 ;GF add high and low partials - vpxor xd3, xd3, xtmph3 - - ; dest4 - vpshufb xtmph4, xgft4_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl4, xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph4, xtmph4, xtmpl4 ;GF add high and low partials - vpxor xd4, xd4, xtmph4 - - XSTR [dest1+pos], xd1 ;Store result - XSTR [dest2+pos], xd2 ;Store result - XSTR [dest3+pos], xd3 ;Store result - XSTR [dest4+pos], xd4 ;Store result - - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - -.lessthan16: - ;; Tail len - ;; Do one more overlap pass - - mov tmp, len ;Overlapped offset length-16 - - XLDR x0, [src+tmp] ;Get next source vector - - vmovdqu xtmph1, [tmp3+16] ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - vmovdqu xtmpl1, [tmp3] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - vmovdqu xtmph2, [tmp3+vec+16] ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - vmovdqu xtmpl2, [tmp3+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - vmovdqu xtmpl3, [tmp3+2*vec] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - - XLDR xd1, [dest1+tmp] ;Get next dest vector - XLDR xd2, [dest2+tmp] ;Get next dest vector - XLDR xtmph4, [dest3+tmp] ;Get next dest vector - - sub len, pos - - vmovdqa xtmpl4, [constip16] ;Load const of i + 16 - vpinsrb xtmph3, xtmph3, len.w, 15 - vpshufb xtmph3, xtmph3, xmask0f ;Broadcast len to all bytes - vpcmpgtb xtmph3, xtmph3, xtmpl4 - - XLDR xtmpl4, [dest4+tmp] ;Get next dest vector - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - ; dest1 - vpshufb xtmph1, xtmph1, x0 ;Lookup mul table of high nibble - vpshufb xtmpl1, xtmpl1, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xtmpl1 ;GF add high and low partials - vpand xtmph1, xtmph1, xtmph3 - vpxor xd1, xd1, xtmph1 - - ; dest2 - vpshufb xtmph2, xtmph2, x0 ;Lookup mul table of high nibble - vpshufb xtmpl2, xtmpl2, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmph2, xtmpl2 ;GF add high and low partials - vpand xtmph2, xtmph2, xtmph3 - vpxor xd2, xd2, xtmph2 - - ; dest3 - vpshufb xgft3_hi, xgft3_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl3, xtmpl3, xtmpa ;Lookup mul table of low nibble - vpxor xgft3_hi, xgft3_hi, xtmpl3 ;GF add high and low partials - vpand xgft3_hi, xgft3_hi, xtmph3 - vpxor xtmph4, xtmph4, xgft3_hi - - ; dest4 - vpshufb xgft4_hi, xgft4_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft4_lo, xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft4_hi, xgft4_hi, xgft4_lo ;GF add high and low partials - vpand xgft4_hi, xgft4_hi, xtmph3 - vpxor xtmpl4, xtmpl4, xgft4_hi - - XSTR [dest1+tmp], xd1 ;Store result - XSTR [dest2+tmp], xd2 ;Store result - XSTR [dest3+tmp], xtmph4 ;Store result - XSTR [dest4+tmp], xtmpl4 ;Store result - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -align 16 -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f -constip16: - ddq 0xf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff - - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_4vect_mad_avx, 02, 00, 020a diff --git a/pkg/erasure/gf_4vect_mad_avx2.asm b/pkg/erasure/gf_4vect_mad_avx2.asm deleted file mode 100644 index cb226c099..000000000 --- a/pkg/erasure/gf_4vect_mad_avx2.asm +++ /dev/null @@ -1,366 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_4vect_mad_avx2(len, vec, vec_i, mul_array, src, dest); -;;; - -%define PS 8 - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 - %define arg5 r15 - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define return rax - %define return.w eax - %define stack_size 16*10 + 3*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - -%macro FUNC_SAVE 0 - sub rsp, stack_size - movdqa [rsp+16*0],xmm6 - movdqa [rsp+16*1],xmm7 - movdqa [rsp+16*2],xmm8 - movdqa [rsp+16*3],xmm9 - movdqa [rsp+16*4],xmm10 - movdqa [rsp+16*5],xmm11 - movdqa [rsp+16*6],xmm12 - movdqa [rsp+16*7],xmm13 - movdqa [rsp+16*8],xmm14 - movdqa [rsp+16*9],xmm15 - save_reg r12, 10*16 + 0*8 - save_reg r15, 10*16 + 1*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) -%endmacro - -%macro FUNC_RESTORE 0 - movdqa xmm6, [rsp+16*0] - movdqa xmm7, [rsp+16*1] - movdqa xmm8, [rsp+16*2] - movdqa xmm9, [rsp+16*3] - movdqa xmm10, [rsp+16*4] - movdqa xmm11, [rsp+16*5] - movdqa xmm12, [rsp+16*6] - movdqa xmm13, [rsp+16*7] - movdqa xmm14, [rsp+16*8] - movdqa xmm15, [rsp+16*9] - mov r12, [rsp + 10*16 + 0*8] - mov r15, [rsp + 10*16 + 1*8] - add rsp, stack_size -%endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE - -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - - -;;; gf_4vect_mad_avx2(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest1 arg5 -%define pos return -%define pos.w return.w - -%define dest2 mul_array -%define dest3 vec -%define dest4 vec_i - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - - -default rel - -[bits 64] -section .text - -%define xmask0f ymm15 -%define xmask0fx xmm15 -%define xgft1_lo ymm14 -%define xgft2_lo ymm13 -%define xgft3_lo ymm12 -%define xgft4_lo ymm11 - -%define x0 ymm0 -%define xtmpa ymm1 -%define xtmpl ymm2 -%define xtmplx xmm2 -%define xtmph1 ymm3 -%define xtmph1x xmm3 -%define xtmph2 ymm4 -%define xtmph3 ymm5 -%define xtmph4 ymm6 -%define xd1 ymm7 -%define xd2 ymm8 -%define xd3 ymm9 -%define xd4 ymm10 - -align 16 -global gf_4vect_mad_avx2:function -func(gf_4vect_mad_avx2) - FUNC_SAVE - sub len, 32 - jl .return_fail - xor pos, pos - mov tmp.b, 0x0f - vpinsrb xmask0fx, xmask0fx, tmp.w, 0 - vpbroadcastb xmask0f, xmask0fx ;Construct mask 0x0f0f0f... - - sal vec_i, 5 ;Multiply by 32 - sal vec, 5 ;Multiply by 32 - lea tmp, [mul_array + vec_i] - - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - vmovdqu xgft2_lo, [tmp+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - vmovdqu xgft3_lo, [tmp+2*vec] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - add tmp, vec - vmovdqu xgft4_lo, [tmp+2*vec] ;Load array Dx{00}, Dx{01}, Dx{02}, ... - ; " Dx{00}, Dx{10}, Dx{20}, ... , Dx{f0} - - mov dest2, [dest1+PS] ; reuse mul_array - mov dest3, [dest1+2*PS] ; reuse vec - mov dest4, [dest1+3*PS] ; reuse vec_i - mov dest1, [dest1] - -.loop32: - XLDR x0, [src+pos] ;Get next source vector - - XLDR xd1, [dest1+pos] ;Get next dest vector - XLDR xd2, [dest2+pos] ;Get next dest vector - XLDR xd3, [dest3+pos] ;Get next dest vector - XLDR xd4, [dest4+pos] ;reuse xtmpl1. Get next dest vector - - vpand xtmpl, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - vperm2i128 xtmpa, xtmpl, x0, 0x30 ;swap xtmpa from 1lo|2lo to 1lo|2hi - vperm2i128 x0, xtmpl, x0, 0x12 ;swap x0 from 1hi|2hi to 1hi|2lo - - vperm2i128 xtmph1, xgft1_lo, xgft1_lo, 0x01 ; swapped to hi | lo - vperm2i128 xtmph2, xgft2_lo, xgft2_lo, 0x01 ; swapped to hi | lo - vperm2i128 xtmph3, xgft3_lo, xgft3_lo, 0x01 ; swapped to hi | lo - vperm2i128 xtmph4, xgft4_lo, xgft4_lo, 0x01 ; swapped to hi | lo - - ; dest1 - vpshufb xtmph1, xtmph1, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xtmpl ;GF add high and low partials - vpxor xd1, xd1, xtmph1 ;xd1 += partial - - ; dest2 - vpshufb xtmph2, xtmph2, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmph2, xtmpl ;GF add high and low partials - vpxor xd2, xd2, xtmph2 ;xd2 += partial - - ; dest3 - vpshufb xtmph3, xtmph3, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph3, xtmph3, xtmpl ;GF add high and low partials - vpxor xd3, xd3, xtmph3 ;xd3 += partial - - ; dest4 - vpshufb xtmph4, xtmph4, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph4, xtmph4, xtmpl ;GF add high and low partials - vpxor xd4, xd4, xtmph4 ;xd4 += partial - - XSTR [dest1+pos], xd1 - XSTR [dest2+pos], xd2 - XSTR [dest3+pos], xd3 - XSTR [dest4+pos], xd4 - - add pos, 32 ;Loop on 32 bytes at a time - cmp pos, len - jle .loop32 - - lea tmp, [len + 32] - cmp pos, tmp - je .return_pass - -.lessthan32: - ;; Tail len - ;; Do one more overlap pass - mov tmp.b, 0x1f - vpinsrb xtmph1x, xtmph1x, tmp.w, 0 - vpbroadcastb xtmph1, xtmph1x ;Construct mask 0x1f1f1f... - - mov tmp, len ;Overlapped offset length-32 - - XLDR x0, [src+tmp] ;Get next source vector - - XLDR xd1, [dest1+tmp] ;Get next dest vector - XLDR xd2, [dest2+tmp] ;Get next dest vector - XLDR xd3, [dest3+tmp] ;Get next dest vector - XLDR xd4, [dest4+tmp] ;Get next dest vector - - sub len, pos - - vmovdqa xtmph2, [constip32] ;Load const of i + 32 - vpinsrb xtmplx, xtmplx, len.w, 15 - vinserti128 xtmpl, xtmpl, xtmplx, 1 ;swapped to xtmplx | xtmplx - vpshufb xtmpl, xtmpl, xtmph1 ;Broadcast len to all bytes. xtmph1=0x1f1f1f... - vpcmpgtb xtmpl, xtmpl, xtmph2 - - vpand xtmph1, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - vperm2i128 xtmpa, xtmph1, x0, 0x30 ;swap xtmpa from 1lo|2lo to 1lo|2hi - vperm2i128 x0, xtmph1, x0, 0x12 ;swap x0 from 1hi|2hi to 1hi|2lo - - vperm2i128 xtmph1, xgft1_lo, xgft1_lo, 0x01 ; swapped to hi | lo - vperm2i128 xtmph2, xgft2_lo, xgft2_lo, 0x01 ; swapped to hi | lo - vperm2i128 xtmph3, xgft3_lo, xgft3_lo, 0x01 ; swapped to hi | lo - vperm2i128 xtmph4, xgft4_lo, xgft4_lo, 0x01 ; swapped to hi | lo - - ; dest1 - vpshufb xtmph1, xtmph1, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xgft1_lo ;GF add high and low partials - vpand xtmph1, xtmph1, xtmpl - vpxor xd1, xd1, xtmph1 ;xd1 += partial - - ; dest2 - vpshufb xtmph2, xtmph2, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmph2, xgft2_lo ;GF add high and low partials - vpand xtmph2, xtmph2, xtmpl - vpxor xd2, xd2, xtmph2 ;xd2 += partial - - ; dest3 - vpshufb xtmph3, xtmph3, x0 ;Lookup mul table of high nibble - vpshufb xgft3_lo, xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph3, xtmph3, xgft3_lo ;GF add high and low partials - vpand xtmph3, xtmph3, xtmpl - vpxor xd3, xd3, xtmph3 ;xd3 += partial - - ; dest4 - vpshufb xtmph4, xtmph4, x0 ;Lookup mul table of high nibble - vpshufb xgft4_lo, xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph4, xtmph4, xgft4_lo ;GF add high and low partials - vpand xtmph4, xtmph4, xtmpl - vpxor xd4, xd4, xtmph4 ;xd4 += partial - - XSTR [dest1+tmp], xd1 - XSTR [dest2+tmp], xd2 - XSTR [dest3+tmp], xd3 - XSTR [dest4+tmp], xd4 - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data -align 32 -constip32: - ddq 0xf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff - ddq 0xe0e1e2e3e4e5e6e7e8e9eaebecedeeef - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_4vect_mad_avx2, 04, 00, 020b diff --git a/pkg/erasure/gf_4vect_mad_sse.asm b/pkg/erasure/gf_4vect_mad_sse.asm deleted file mode 100644 index 5f52030e7..000000000 --- a/pkg/erasure/gf_4vect_mad_sse.asm +++ /dev/null @@ -1,370 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_4vect_mad_sse(len, vec, vec_i, mul_array, src, dest); -;;; - -%define PS 8 - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 - %define arg5 r15 - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 - %define return rax - %define return.w eax - %define stack_size 16*10 + 3*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - -%macro FUNC_SAVE 0 - sub rsp, stack_size - movdqa [rsp+16*0],xmm6 - movdqa [rsp+16*1],xmm7 - movdqa [rsp+16*2],xmm8 - movdqa [rsp+16*3],xmm9 - movdqa [rsp+16*4],xmm10 - movdqa [rsp+16*5],xmm11 - movdqa [rsp+16*6],xmm12 - movdqa [rsp+16*7],xmm13 - movdqa [rsp+16*8],xmm14 - movdqa [rsp+16*9],xmm15 - save_reg r12, 10*16 + 0*8 - save_reg r13, 10*16 + 1*8 - save_reg r15, 10*16 + 2*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) -%endmacro - -%macro FUNC_RESTORE 0 - movdqa xmm6, [rsp+16*0] - movdqa xmm7, [rsp+16*1] - movdqa xmm8, [rsp+16*2] - movdqa xmm9, [rsp+16*3] - movdqa xmm10, [rsp+16*4] - movdqa xmm11, [rsp+16*5] - movdqa xmm12, [rsp+16*6] - movdqa xmm13, [rsp+16*7] - movdqa xmm14, [rsp+16*8] - movdqa xmm15, [rsp+16*9] - mov r12, [rsp + 10*16 + 0*8] - mov r13, [rsp + 10*16 + 1*8] - mov r15, [rsp + 10*16 + 2*8] - add rsp, stack_size -%endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp2 r10 - %define tmp3 r12 - %define return rax - %define return.w eax - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - %endmacro - %macro FUNC_RESTORE 0 - pop r12 - %endmacro - -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp2 r10 - %define tmp3 r12 - %define return rax - %define return.w eax - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - %endmacro - %macro FUNC_RESTORE 0 - pop r12 - %endmacro -%endif - -;;; gf_4vect_mad_sse(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest1 arg5 -%define pos return -%define pos.w return.w - -%define dest2 mul_array -%define dest3 tmp2 -%define dest4 vec_i - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR movdqu - %define XSTR movdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR movdqa - %define XSTR movdqa - %else - %define XLDR movntdqa - %define XSTR movntdq - %endif -%endif - -default rel - -[bits 64] -section .text - -%define xmask0f xmm15 -%define xgft3_hi xmm14 -%define xgft4_hi xmm13 -%define xgft4_lo xmm12 - -%define x0 xmm0 -%define xtmpa xmm1 -%define xtmph1 xmm2 -%define xtmpl1 xmm3 -%define xtmph2 xmm4 -%define xtmpl2 xmm5 -%define xtmph3 xmm6 -%define xtmpl3 xmm7 -%define xtmph4 xmm8 -%define xtmpl4 xmm9 -%define xd1 xmm10 -%define xd2 xmm11 -%define xd3 xtmph1 -%define xd4 xtmpl1 - -align 16 -global gf_4vect_mad_sse:function -func(gf_4vect_mad_sse) - FUNC_SAVE - sub len, 16 - jl .return_fail - xor pos, pos - movdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - mov tmp, vec - - sal vec_i, 5 ;Multiply by 32 - lea tmp3, [mul_array + vec_i] - - sal tmp, 6 ;Multiply by 64 - - movdqu xgft3_hi, [tmp3+tmp+16] ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - sal vec, 5 ;Multiply by 32 - add tmp, vec - movdqu xgft4_lo, [tmp3+tmp] ;Load array Dx{00}, Dx{01}, Dx{02}, ... - movdqu xgft4_hi, [tmp3+tmp+16] ; " Dx{00}, Dx{10}, Dx{20}, ... , Dx{f0} - - mov dest2, [dest1+PS] ; reuse mul_array - mov dest3, [dest1+2*PS] - mov dest4, [dest1+3*PS] ; reuse vec_i - mov dest1, [dest1] - -.loop16: - XLDR x0, [src+pos] ;Get next source vector - movdqu xtmph1, [tmp3+16] ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - movdqu xtmpl1, [tmp3] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - movdqu xtmph2, [tmp3+vec+16] ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - movdqu xtmpl2, [tmp3+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - movdqu xtmpl3, [tmp3+2*vec] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - - movdqa xtmph3, xgft3_hi - movdqa xtmpl4, xgft4_lo - movdqa xtmph4, xgft4_hi - - XLDR xd1, [dest1+pos] ;Get next dest vector - XLDR xd2, [dest2+pos] ;Get next dest vector - - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - - ; dest1 - pshufb xtmph1, x0 ;Lookup mul table of high nibble - pshufb xtmpl1, xtmpa ;Lookup mul table of low nibble - pxor xtmph1, xtmpl1 ;GF add high and low partials - pxor xd1, xtmph1 - - XLDR xd3, [dest3+pos] ;Reuse xtmph1, Get next dest vector - XLDR xd4, [dest4+pos] ;Reuse xtmpl1, Get next dest vector - - ; dest2 - pshufb xtmph2, x0 ;Lookup mul table of high nibble - pshufb xtmpl2, xtmpa ;Lookup mul table of low nibble - pxor xtmph2, xtmpl2 ;GF add high and low partials - pxor xd2, xtmph2 - - ; dest3 - pshufb xtmph3, x0 ;Lookup mul table of high nibble - pshufb xtmpl3, xtmpa ;Lookup mul table of low nibble - pxor xtmph3, xtmpl3 ;GF add high and low partials - pxor xd3, xtmph3 - - ; dest4 - pshufb xtmph4, x0 ;Lookup mul table of high nibble - pshufb xtmpl4, xtmpa ;Lookup mul table of low nibble - pxor xtmph4, xtmpl4 ;GF add high and low partials - pxor xd4, xtmph4 - - XSTR [dest1+pos], xd1 ;Store result - XSTR [dest2+pos], xd2 ;Store result - XSTR [dest3+pos], xd3 ;Store result - XSTR [dest4+pos], xd4 ;Store result - - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - -.lessthan16: - ;; Tail len - ;; Do one more overlap pass - mov tmp, len ;Overlapped offset length-16 - - XLDR x0, [src+tmp] ;Get next source vector - - movdqu xtmph1, [tmp3+16] ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - movdqu xtmpl1, [tmp3] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - movdqu xtmph2, [tmp3+vec+16] ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - movdqu xtmpl2, [tmp3+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - movdqu xtmpl3, [tmp3+2*vec] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - - XLDR xd1, [dest1+tmp] ;Get next dest vector - XLDR xd2, [dest2+tmp] ;Get next dest vector - XLDR xtmph4, [dest3+tmp] ;Reuse xtmph1. Get next dest vector - - sub len, pos - - movdqa xtmpl4, [constip16] ;Load const of i + 16 - pinsrb xtmph3, len.w, 15 - pshufb xtmph3, xmask0f ;Broadcast len to all bytes - pcmpgtb xtmph3, xtmpl4 - - XLDR xtmpl4, [dest4+tmp] ;Get next dest vector - - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - - ; dest1 - pshufb xtmph1, x0 ;Lookup mul table of high nibble - pshufb xtmpl1, xtmpa ;Lookup mul table of low nibble - pxor xtmph1, xtmpl1 ;GF add high and low partials - pand xtmph1, xtmph3 - pxor xd1, xtmph1 - - ; dest2 - pshufb xtmph2, x0 ;Lookup mul table of high nibble - pshufb xtmpl2, xtmpa ;Lookup mul table of low nibble - pxor xtmph2, xtmpl2 ;GF add high and low partials - pand xtmph2, xtmph3 - pxor xd2, xtmph2 - - ; dest3 - pshufb xgft3_hi, x0 ;Lookup mul table of high nibble - pshufb xtmpl3, xtmpa ;Lookup mul table of low nibble - pxor xgft3_hi, xtmpl3 ;GF add high and low partials - pand xgft3_hi, xtmph3 - pxor xtmph4, xgft3_hi - - ; dest4 - pshufb xgft4_hi, x0 ;Lookup mul table of high nibble - pshufb xgft4_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft4_hi, xgft4_lo ;GF add high and low partials - pand xgft4_hi, xtmph3 - pxor xtmpl4, xgft4_hi - - XSTR [dest1+tmp], xd1 ;Store result - XSTR [dest2+tmp], xd2 ;Store result - XSTR [dest3+tmp], xtmph4 ;Store result - XSTR [dest4+tmp], xtmpl4 ;Store result - -.return_pass: - FUNC_RESTORE - mov return, 0 - ret - -.return_fail: - FUNC_RESTORE - mov return, 1 - ret - -endproc_frame - -section .data - -align 16 - -mask0f: - ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f -constip16: - ddq 0xf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_4vect_mad_sse, 00, 00, 0209 diff --git a/pkg/erasure/gf_5vect_dot_prod_avx.asm b/pkg/erasure/gf_5vect_dot_prod_avx.asm deleted file mode 100644 index d03c0a04c..000000000 --- a/pkg/erasure/gf_5vect_dot_prod_avx.asm +++ /dev/null @@ -1,342 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_5vect_dot_prod_avx(len, vec, *g_tbls, **buffs, **dests); -;;; - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved, loaded and restored - %define arg5 r15 ; must be saved and restored - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r14 ; must be saved and restored - %define tmp5 rdi ; must be saved and restored - %define tmp6 rsi ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - %define stack_size 10*16 + 7*8 ; must be an odd multiple of 8 - %define arg(x) [rsp + stack_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - save_xmm128 xmm6, 0*16 - save_xmm128 xmm7, 1*16 - save_xmm128 xmm8, 2*16 - save_xmm128 xmm9, 3*16 - save_xmm128 xmm10, 4*16 - save_xmm128 xmm11, 5*16 - save_xmm128 xmm12, 6*16 - save_xmm128 xmm13, 7*16 - save_xmm128 xmm14, 8*16 - save_xmm128 xmm15, 9*16 - save_reg r12, 10*16 + 0*8 - save_reg r13, 10*16 + 1*8 - save_reg r14, 10*16 + 2*8 - save_reg r15, 10*16 + 3*8 - save_reg rdi, 10*16 + 4*8 - save_reg rsi, 10*16 + 5*8 - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - vmovdqa xmm6, [rsp + 0*16] - vmovdqa xmm7, [rsp + 1*16] - vmovdqa xmm8, [rsp + 2*16] - vmovdqa xmm9, [rsp + 3*16] - vmovdqa xmm10, [rsp + 4*16] - vmovdqa xmm11, [rsp + 5*16] - vmovdqa xmm12, [rsp + 6*16] - vmovdqa xmm13, [rsp + 7*16] - vmovdqa xmm14, [rsp + 8*16] - vmovdqa xmm15, [rsp + 9*16] - mov r12, [rsp + 10*16 + 0*8] - mov r13, [rsp + 10*16 + 1*8] - mov r14, [rsp + 10*16 + 2*8] - mov r15, [rsp + 10*16 + 3*8] - mov rdi, [rsp + 10*16 + 4*8] - mov rsi, [rsp + 10*16 + 5*8] - add rsp, stack_size - %endmacro -%endif - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest arg4 -%define ptr arg5 -%define vec_i tmp2 -%define dest1 tmp3 -%define dest2 tmp4 -%define vskip1 tmp5 -%define vskip3 tmp6 -%define pos return - - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - -default rel - -[bits 64] -section .text - -%define xmask0f xmm15 -%define xgft1_lo xmm14 -%define xgft1_hi xmm13 -%define xgft2_lo xmm12 -%define xgft2_hi xmm11 -%define xgft3_lo xmm10 -%define xgft3_hi xmm9 -%define xgft4_lo xmm8 -%define xgft4_hi xmm7 - - -%define x0 xmm0 -%define xtmpa xmm1 -%define xp1 xmm2 -%define xp2 xmm3 -%define xp3 xmm4 -%define xp4 xmm5 -%define xp5 xmm6 - -align 16 -global gf_5vect_dot_prod_avx:function -func(gf_5vect_dot_prod_avx) - FUNC_SAVE - sub len, 16 - jl .return_fail - xor pos, pos - vmovdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - mov vskip1, vec - imul vskip1, 32 - mov vskip3, vec - imul vskip3, 96 - sal vec, LOG_PS ;vec *= PS. Make vec_i count by PS - mov dest1, [dest] - mov dest2, [dest+PS] - - -.loop16: - mov tmp, mul_array - xor vec_i, vec_i - vpxor xp1, xp1 - vpxor xp2, xp2 - vpxor xp3, xp3 - vpxor xp4, xp4 - vpxor xp5, xp5 - - -.next_vect: - mov ptr, [src+vec_i] - add vec_i, PS - XLDR x0, [ptr+pos] ;Get next source vector - - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - vmovdqu xgft1_hi, [tmp+16] ; " Ax{00}, Ax{10}, ..., Ax{f0} - vmovdqu xgft2_lo, [tmp+vskip1*1] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - vmovdqu xgft2_hi, [tmp+vskip1*1+16] ; " Bx{00}, Bx{10}, ..., Bx{f0} - vmovdqu xgft3_lo, [tmp+vskip1*2] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - vmovdqu xgft3_hi, [tmp+vskip1*2+16] ; " Cx{00}, Cx{10}, ..., Cx{f0} - vmovdqu xgft4_lo, [tmp+vskip3] ;Load array Dx{00}, Dx{01}, ..., Dx{0f} - vmovdqu xgft4_hi, [tmp+vskip3+16] ; " Dx{00}, Dx{10}, ..., Dx{f0} - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - vpshufb xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft1_hi, xgft1_lo ;GF add high and low partials - vpxor xp1, xgft1_hi ;xp1 += partial - - vpshufb xgft2_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft2_hi, xgft2_lo ;GF add high and low partials - vpxor xp2, xgft2_hi ;xp2 += partial - - vmovdqu xgft1_lo, [tmp+vskip1*4] ;Load array Ex{00}, Ex{01}, ..., Ex{0f} - vmovdqu xgft1_hi, [tmp+vskip1*4+16] ; " Ex{00}, Ex{10}, ..., Ex{f0} - add tmp, 32 - - vpshufb xgft3_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft3_hi, xgft3_lo ;GF add high and low partials - vpxor xp3, xgft3_hi ;xp3 += partial - - vpshufb xgft4_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft4_hi, xgft4_lo ;GF add high and low partials - vpxor xp4, xgft4_hi ;xp4 += partial - - vpshufb xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft1_hi, xgft1_lo ;GF add high and low partials - vpxor xp5, xgft1_hi ;xp5 += partial - - cmp vec_i, vec - jl .next_vect - - mov tmp, [dest+2*PS] - mov ptr, [dest+3*PS] - mov vec_i, [dest+4*PS] - - XSTR [dest1+pos], xp1 - XSTR [dest2+pos], xp2 - XSTR [tmp+pos], xp3 - XSTR [ptr+pos], xp4 - XSTR [vec_i+pos], xp5 - - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - jmp .loop16 ;Do one more overlap pass - -.return_pass: - FUNC_RESTORE - mov return, 0 - ret - -.return_fail: - FUNC_RESTORE - mov return, 1 - ret - -endproc_frame - -section .data - -align 16 -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_5vect_dot_prod_avx, 02, 03, 0194 diff --git a/pkg/erasure/gf_5vect_dot_prod_avx2.asm b/pkg/erasure/gf_5vect_dot_prod_avx2.asm deleted file mode 100644 index c096990db..000000000 --- a/pkg/erasure/gf_5vect_dot_prod_avx2.asm +++ /dev/null @@ -1,356 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_5vect_dot_prod_avx2(len, vec, *g_tbls, **buffs, **dests); -;;; - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved, loaded and restored - %define arg5 r15 ; must be saved and restored - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r14 ; must be saved and restored - %define tmp5 rdi ; must be saved and restored - %define tmp6 rsi ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - %define stack_size 10*16 + 7*8 ; must be an odd multiple of 8 - %define arg(x) [rsp + stack_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - vmovdqa [rsp + 0*16], xmm6 - vmovdqa [rsp + 1*16], xmm7 - vmovdqa [rsp + 2*16], xmm8 - vmovdqa [rsp + 3*16], xmm9 - vmovdqa [rsp + 4*16], xmm10 - vmovdqa [rsp + 5*16], xmm11 - vmovdqa [rsp + 6*16], xmm12 - vmovdqa [rsp + 7*16], xmm13 - vmovdqa [rsp + 8*16], xmm14 - vmovdqa [rsp + 9*16], xmm15 - save_reg r12, 10*16 + 0*8 - save_reg r13, 10*16 + 1*8 - save_reg r14, 10*16 + 2*8 - save_reg r15, 10*16 + 3*8 - save_reg rdi, 10*16 + 4*8 - save_reg rsi, 10*16 + 5*8 - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - vmovdqa xmm6, [rsp + 0*16] - vmovdqa xmm7, [rsp + 1*16] - vmovdqa xmm8, [rsp + 2*16] - vmovdqa xmm9, [rsp + 3*16] - vmovdqa xmm10, [rsp + 4*16] - vmovdqa xmm11, [rsp + 5*16] - vmovdqa xmm12, [rsp + 6*16] - vmovdqa xmm13, [rsp + 7*16] - vmovdqa xmm14, [rsp + 8*16] - vmovdqa xmm15, [rsp + 9*16] - mov r12, [rsp + 10*16 + 0*8] - mov r13, [rsp + 10*16 + 1*8] - mov r14, [rsp + 10*16 + 2*8] - mov r15, [rsp + 10*16 + 3*8] - mov rdi, [rsp + 10*16 + 4*8] - mov rsi, [rsp + 10*16 + 5*8] - add rsp, stack_size - %endmacro -%endif - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest arg4 -%define ptr arg5 -%define vec_i tmp2 -%define dest1 tmp3 -%define dest2 tmp4 -%define vskip1 tmp5 -%define vskip3 tmp6 -%define pos return - - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - -default rel - -[bits 64] -section .text - -%define xmask0f ymm15 -%define xmask0fx xmm15 -%define xgft1_lo ymm14 -%define xgft1_hi ymm13 -%define xgft2_lo ymm12 -%define xgft2_hi ymm11 -%define xgft3_lo ymm10 -%define xgft3_hi ymm9 -%define xgft4_lo ymm8 -%define xgft4_hi ymm7 - - -%define x0 ymm0 -%define xtmpa ymm1 -%define xp1 ymm2 -%define xp2 ymm3 -%define xp3 ymm4 -%define xp4 ymm5 -%define xp5 ymm6 - -align 16 -global gf_5vect_dot_prod_avx2:function -func(gf_5vect_dot_prod_avx2) - FUNC_SAVE - sub len, 32 - jl .return_fail - xor pos, pos - mov tmp.b, 0x0f - vpinsrb xmask0fx, xmask0fx, tmp.w, 0 - vpbroadcastb xmask0f, xmask0fx ;Construct mask 0x0f0f0f... - mov vskip1, vec - imul vskip1, 32 - mov vskip3, vec - imul vskip3, 96 - sal vec, LOG_PS ;vec *= PS. Make vec_i count by PS - mov dest1, [dest] - mov dest2, [dest+PS] - - -.loop32: - mov tmp, mul_array - xor vec_i, vec_i - vpxor xp1, xp1 - vpxor xp2, xp2 - vpxor xp3, xp3 - vpxor xp4, xp4 - vpxor xp5, xp5 - - -.next_vect: - mov ptr, [src+vec_i] - XLDR x0, [ptr+pos] ;Get next source vector - add vec_i, PS - - vpand xgft4_lo, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - vperm2i128 xtmpa, xgft4_lo, x0, 0x30 ;swap xtmpa from 1lo|2lo to 1lo|2hi - vperm2i128 x0, xgft4_lo, x0, 0x12 ;swap x0 from 1hi|2hi to 1hi|2lo - - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - ; " Ax{00}, Ax{10}, ..., Ax{f0} - vmovdqu xgft2_lo, [tmp+vskip1*1] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - ; " Bx{00}, Bx{10}, ..., Bx{f0} - vmovdqu xgft3_lo, [tmp+vskip1*2] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - ; " Cx{00}, Cx{10}, ..., Cx{f0} - vmovdqu xgft4_lo, [tmp+vskip3] ;Load array Dx{00}, Dx{01}, ..., Dx{0f} - ; " Dx{00}, Dx{10}, ..., Dx{f0} - - vperm2i128 xgft1_hi, xgft1_lo, xgft1_lo, 0x01 ; swapped to hi | lo - vperm2i128 xgft2_hi, xgft2_lo, xgft2_lo, 0x01 ; swapped to hi | lo - vperm2i128 xgft3_hi, xgft3_lo, xgft3_lo, 0x01 ; swapped to hi | lo - vperm2i128 xgft4_hi, xgft4_lo, xgft4_lo, 0x01 ; swapped to hi | lo - - vpshufb xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft1_hi, xgft1_lo ;GF add high and low partials - vpxor xp1, xgft1_hi ;xp1 += partial - - vpshufb xgft2_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft2_hi, xgft2_lo ;GF add high and low partials - vpxor xp2, xgft2_hi ;xp2 += partial - - vmovdqu xgft1_lo, [tmp+vskip1*4] ;Load array Ex{00}, Ex{01}, ..., Ex{0f} - ; " Ex{00}, Ex{10}, ..., Ex{f0} - vperm2i128 xgft1_hi, xgft1_lo, xgft1_lo, 0x01 ; swapped to hi | lo - add tmp, 32 - - vpshufb xgft3_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft3_hi, xgft3_lo ;GF add high and low partials - vpxor xp3, xgft3_hi ;xp3 += partial - - vpshufb xgft4_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft4_hi, xgft4_lo ;GF add high and low partials - vpxor xp4, xgft4_hi ;xp4 += partial - - vpshufb xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft1_hi, xgft1_lo ;GF add high and low partials - vpxor xp5, xgft1_hi ;xp5 += partial - - cmp vec_i, vec - jl .next_vect - - mov tmp, [dest+2*PS] - mov ptr, [dest+3*PS] - mov vec_i, [dest+4*PS] - - XSTR [dest1+pos], xp1 - XSTR [dest2+pos], xp2 - XSTR [tmp+pos], xp3 - XSTR [ptr+pos], xp4 - XSTR [vec_i+pos], xp5 - - add pos, 32 ;Loop on 32 bytes at a time - cmp pos, len - jle .loop32 - - lea tmp, [len + 32] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - jmp .loop32 ;Do one more overlap pass - -.return_pass: - FUNC_RESTORE - mov return, 0 - ret - -.return_fail: - FUNC_RESTORE - mov return, 1 - ret - -endproc_frame - -section .data - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_5vect_dot_prod_avx2, 04, 03, 0199 diff --git a/pkg/erasure/gf_5vect_dot_prod_sse.asm b/pkg/erasure/gf_5vect_dot_prod_sse.asm deleted file mode 100644 index 6f43aa905..000000000 --- a/pkg/erasure/gf_5vect_dot_prod_sse.asm +++ /dev/null @@ -1,343 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_5vect_dot_prod_sse(len, vec, *g_tbls, **buffs, **dests); -;;; - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved, loaded and restored - %define arg5 r15 ; must be saved and restored - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r14 ; must be saved and restored - %define tmp5 rdi ; must be saved and restored - %define tmp6 rsi ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - %define stack_size 10*16 + 7*8 ; must be an odd multiple of 8 - %define arg(x) [rsp + stack_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - save_xmm128 xmm6, 0*16 - save_xmm128 xmm7, 1*16 - save_xmm128 xmm8, 2*16 - save_xmm128 xmm9, 3*16 - save_xmm128 xmm10, 4*16 - save_xmm128 xmm11, 5*16 - save_xmm128 xmm12, 6*16 - save_xmm128 xmm13, 7*16 - save_xmm128 xmm14, 8*16 - save_xmm128 xmm15, 9*16 - save_reg r12, 10*16 + 0*8 - save_reg r13, 10*16 + 1*8 - save_reg r14, 10*16 + 2*8 - save_reg r15, 10*16 + 3*8 - save_reg rdi, 10*16 + 4*8 - save_reg rsi, 10*16 + 5*8 - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - movdqa xmm6, [rsp + 0*16] - movdqa xmm7, [rsp + 1*16] - movdqa xmm8, [rsp + 2*16] - movdqa xmm9, [rsp + 3*16] - movdqa xmm10, [rsp + 4*16] - movdqa xmm11, [rsp + 5*16] - movdqa xmm12, [rsp + 6*16] - movdqa xmm13, [rsp + 7*16] - movdqa xmm14, [rsp + 8*16] - movdqa xmm15, [rsp + 9*16] - mov r12, [rsp + 10*16 + 0*8] - mov r13, [rsp + 10*16 + 1*8] - mov r14, [rsp + 10*16 + 2*8] - mov r15, [rsp + 10*16 + 3*8] - mov rdi, [rsp + 10*16 + 4*8] - mov rsi, [rsp + 10*16 + 5*8] - add rsp, stack_size - %endmacro -%endif - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest arg4 -%define ptr arg5 -%define vec_i tmp2 -%define dest1 tmp3 -%define dest2 tmp4 -%define vskip1 tmp5 -%define vskip3 tmp6 -%define pos return - - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR movdqu - %define XSTR movdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR movdqa - %define XSTR movdqa - %else - %define XLDR movntdqa - %define XSTR movntdq - %endif -%endif - -default rel - -[bits 64] -section .text - -%define xmask0f xmm15 -%define xgft1_lo xmm2 -%define xgft1_hi xmm3 -%define xgft2_lo xmm4 -%define xgft2_hi xmm5 -%define xgft3_lo xmm10 -%define xgft3_hi xmm6 -%define xgft4_lo xmm8 -%define xgft4_hi xmm7 - - -%define x0 xmm0 -%define xtmpa xmm1 -%define xp1 xmm9 -%define xp2 xmm11 -%define xp3 xmm12 -%define xp4 xmm13 -%define xp5 xmm14 - -align 16 -global gf_5vect_dot_prod_sse:function -func(gf_5vect_dot_prod_sse) - FUNC_SAVE - sub len, 16 - jl .return_fail - xor pos, pos - movdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - mov vskip1, vec - imul vskip1, 32 - mov vskip3, vec - imul vskip3, 96 - sal vec, LOG_PS ;vec *= PS. Make vec_i count by PS - mov dest1, [dest] - mov dest2, [dest+PS] - - -.loop16: - mov tmp, mul_array - xor vec_i, vec_i - pxor xp1, xp1 - pxor xp2, xp2 - pxor xp3, xp3 - pxor xp4, xp4 - pxor xp5, xp5 - - -.next_vect: - mov ptr, [src+vec_i] - add vec_i, PS - XLDR x0, [ptr+pos] ;Get next source vector - - movdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - movdqu xgft1_hi, [tmp+16] ; " Ax{00}, Ax{10}, ..., Ax{f0} - movdqu xgft2_lo, [tmp+vskip1*1] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - movdqu xgft2_hi, [tmp+vskip1*1+16] ; " Bx{00}, Bx{10}, ..., Bx{f0} - movdqu xgft3_lo, [tmp+vskip1*2] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - movdqu xgft3_hi, [tmp+vskip1*2+16] ; " Cx{00}, Cx{10}, ..., Cx{f0} - movdqu xgft4_lo, [tmp+vskip3] ;Load array Dx{00}, Dx{01}, ..., Dx{0f} - movdqu xgft4_hi, [tmp+vskip3+16] ; " Dx{00}, Dx{10}, ..., Dx{f0} - - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - - pshufb xgft1_hi, x0 ;Lookup mul table of high nibble - pshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft1_hi, xgft1_lo ;GF add high and low partials - pxor xp1, xgft1_hi ;xp1 += partial - - pshufb xgft2_hi, x0 ;Lookup mul table of high nibble - pshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft2_hi, xgft2_lo ;GF add high and low partials - pxor xp2, xgft2_hi ;xp2 += partial - - movdqu xgft1_lo, [tmp+vskip1*4] ;Load array Ex{00}, Ex{01}, ..., Ex{0f} - movdqu xgft1_hi, [tmp+vskip1*4+16] ; " Ex{00}, Ex{10}, ..., Ex{f0} - add tmp, 32 - - pshufb xgft3_hi, x0 ;Lookup mul table of high nibble - pshufb xgft3_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft3_hi, xgft3_lo ;GF add high and low partials - pxor xp3, xgft3_hi ;xp3 += partial - - pshufb xgft4_hi, x0 ;Lookup mul table of high nibble - pshufb xgft4_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft4_hi, xgft4_lo ;GF add high and low partials - pxor xp4, xgft4_hi ;xp4 += partial - - pshufb xgft1_hi, x0 ;Lookup mul table of high nibble - pshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft1_hi, xgft1_lo ;GF add high and low partials - pxor xp5, xgft1_hi ;xp5 += partial - - cmp vec_i, vec - jl .next_vect - - mov tmp, [dest+2*PS] - mov ptr, [dest+3*PS] - mov vec_i, [dest+4*PS] - - XSTR [dest1+pos], xp1 - XSTR [dest2+pos], xp2 - XSTR [tmp+pos], xp3 - XSTR [ptr+pos], xp4 - XSTR [vec_i+pos], xp5 - - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - jmp .loop16 ;Do one more overlap pass - -.return_pass: - FUNC_RESTORE - mov return, 0 - ret - -.return_fail: - FUNC_RESTORE - mov return, 1 - ret - -endproc_frame - -section .data - -align 16 -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_5vect_dot_prod_sse, 00, 04, 0065 diff --git a/pkg/erasure/gf_5vect_mad_avx.asm b/pkg/erasure/gf_5vect_mad_avx.asm deleted file mode 100644 index 0b10e8da1..000000000 --- a/pkg/erasure/gf_5vect_mad_avx.asm +++ /dev/null @@ -1,395 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_5vect_mad_avx(len, vec, vec_i, mul_array, src, dest); -;;; - -%define PS 8 - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 - %define arg5 r15 - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 - %define tmp4 r14 - %define return rax - %define return.w eax - %define stack_size 16*10 + 5*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - -%macro FUNC_SAVE 0 - sub rsp, stack_size - movdqa [rsp+16*0],xmm6 - movdqa [rsp+16*1],xmm7 - movdqa [rsp+16*2],xmm8 - movdqa [rsp+16*3],xmm9 - movdqa [rsp+16*4],xmm10 - movdqa [rsp+16*5],xmm11 - movdqa [rsp+16*6],xmm12 - movdqa [rsp+16*7],xmm13 - movdqa [rsp+16*8],xmm14 - movdqa [rsp+16*9],xmm15 - save_reg r12, 10*16 + 0*8 - save_reg r13, 10*16 + 1*8 - save_reg r14, 10*16 + 2*8 - save_reg r15, 10*16 + 3*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) -%endmacro - -%macro FUNC_RESTORE 0 - movdqa xmm6, [rsp+16*0] - movdqa xmm7, [rsp+16*1] - movdqa xmm8, [rsp+16*2] - movdqa xmm9, [rsp+16*3] - movdqa xmm10, [rsp+16*4] - movdqa xmm11, [rsp+16*5] - movdqa xmm12, [rsp+16*6] - movdqa xmm13, [rsp+16*7] - movdqa xmm14, [rsp+16*8] - movdqa xmm15, [rsp+16*9] - mov r12, [rsp + 10*16 + 0*8] - mov r13, [rsp + 10*16 + 1*8] - mov r14, [rsp + 10*16 + 2*8] - mov r15, [rsp + 10*16 + 3*8] - add rsp, stack_size -%endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp2 r10 - %define tmp3 r12 - %define tmp4 r13 - %define return rax - %define return.w eax - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - %endmacro - %macro FUNC_RESTORE 0 - pop r13 - pop r12 - %endmacro -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp2 r10 - %define tmp3 r12 - %define tmp4 r13 - %define return rax - %define return.w eax - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - %endmacro - %macro FUNC_RESTORE 0 - pop r13 - pop r12 - %endmacro -%endif - -;;; gf_5vect_mad_avx(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest1 arg5 -%define pos return -%define pos.w return.w - -%define dest2 tmp4 -%define dest3 mul_array -%define dest4 tmp2 -%define dest5 vec_i - - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - -default rel - -[bits 64] -section .text - -%define xmask0f xmm15 -%define xgft5_hi xmm14 -%define xgft4_lo xmm13 -%define xgft4_hi xmm12 - -%define x0 xmm0 -%define xtmpa xmm1 -%define xtmph1 xmm2 -%define xtmpl1 xmm3 -%define xtmph2 xmm4 -%define xtmpl2 xmm5 -%define xtmph3 xmm6 -%define xtmpl3 xmm7 -%define xtmph5 xmm8 -%define xtmpl5 xmm9 -%define xd1 xmm10 -%define xd2 xmm11 -%define xd3 xtmpl1 -%define xd4 xtmph1 -%define xd5 xtmpl2 - - -align 16 -global gf_5vect_mad_avx:function -func(gf_5vect_mad_avx) - FUNC_SAVE - sub len, 16 - jl .return_fail - xor pos, pos - vmovdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - mov tmp, vec - sal vec_i, 5 ;Multiply by 32 - lea tmp3, [mul_array + vec_i] - sal tmp, 6 ;Multiply by 64 - vmovdqu xgft5_hi, [tmp3+2*tmp+16] ; " Ex{00}, Ex{10}, ..., Ex{f0} - sal vec, 5 ;Multiply by 32 - add tmp, vec - vmovdqu xgft4_hi, [tmp3+tmp+16] ; " Dx{00}, Dx{10}, Dx{20}, ... , Dx{f0} - vmovdqu xgft4_lo, [tmp3+tmp] ;Load array Dx{00}, Dx{01}, Dx{02}, ... - - mov dest3, [dest1+2*PS] ; reuse mul_array - mov dest4, [dest1+3*PS] - mov dest5, [dest1+4*PS] ; reuse vec_i - mov dest2, [dest1+PS] - mov dest1, [dest1] - -.loop16: - XLDR x0, [src+pos] ;Get next source vector - - vmovdqu xtmph1, [tmp3+16] ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - vmovdqu xtmpl1, [tmp3] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - vmovdqu xtmph2, [tmp3+vec+16] ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - vmovdqu xtmpl2, [tmp3+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - vmovdqu xtmph3, [tmp3+2*vec+16] ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - vmovdqu xtmpl3, [tmp3+2*vec] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - vmovdqu xtmpl5, [tmp3+4*vec] ;Load array Ex{00}, Ex{01}, ..., Ex{0f} - - XLDR xd1, [dest1+pos] ;Get next dest vector - XLDR xd2, [dest2+pos] ;Get next dest vector - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - ; dest1 - vpshufb xtmph1, xtmph1, x0 ;Lookup mul table of high nibble - vpshufb xtmpl1, xtmpl1, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xtmpl1 ;GF add high and low partials - vpxor xd1, xd1, xtmph1 - - XLDR xd3, [dest3+pos] ;Reuse xtmpl1, Get next dest vector - XLDR xd4, [dest4+pos] ;Reuse xtmph1, Get next dest vector - - ; dest2 - vpshufb xtmph2, xtmph2, x0 ;Lookup mul table of high nibble - vpshufb xtmpl2, xtmpl2, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmph2, xtmpl2 ;GF add high and low partials - vpxor xd2, xd2, xtmph2 - - XLDR xd5, [dest5+pos] ;Reuse xtmpl2. Get next dest vector - - ; dest3 - vpshufb xtmph3, xtmph3, x0 ;Lookup mul table of high nibble - vpshufb xtmpl3, xtmpl3, xtmpa ;Lookup mul table of low nibble - vpxor xtmph3, xtmph3, xtmpl3 ;GF add high and low partials - vpxor xd3, xd3, xtmph3 - - ; dest4 - vpshufb xtmph2, xgft4_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl3, xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmph2, xtmpl3 ;GF add high and low partials - vpxor xd4, xd4, xtmph2 - - ; dest5 - vpshufb xtmph5, xgft5_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl5, xtmpl5, xtmpa ;Lookup mul table of low nibble - vpxor xtmph5, xtmph5, xtmpl5 ;GF add high and low partials - vpxor xd5, xd5, xtmph5 - - XSTR [dest1+pos], xd1 ;Store result into dest1 - XSTR [dest2+pos], xd2 ;Store result into dest2 - XSTR [dest3+pos], xd3 ;Store result into dest3 - XSTR [dest4+pos], xd4 ;Store result into dest4 - XSTR [dest5+pos], xd5 ;Store result into dest5 - - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - -.lessthan16: - ;; Tail len - ;; Do one more overlap pass - mov tmp, len ;Overlapped offset length-16 - XLDR x0, [src+tmp] ;Get next source vector - - sub len, pos - - vmovdqa xtmph1, [constip16] ;Load const of i + 16 - vpinsrb xtmph5, len.w, 15 - vpshufb xtmph5, xmask0f ;Broadcast len to all bytes - vpcmpgtb xtmph5, xtmph5, xtmph1 - - vmovdqu xtmph1, [tmp3+16] ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - vmovdqu xtmpl1, [tmp3] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - vmovdqu xtmph2, [tmp3+vec+16] ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - vmovdqu xtmpl2, [tmp3+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - vmovdqu xtmph3, [tmp3+2*vec+16] ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - vmovdqu xtmpl3, [tmp3+2*vec] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - vmovdqu xtmpl5, [tmp3+4*vec] ;Load array Ex{00}, Ex{01}, ..., Ex{0f} - - XLDR xd1, [dest1+tmp] ;Get next dest vector - XLDR xd2, [dest2+tmp] ;Get next dest vector - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - ; dest1 - vpshufb xtmph1, xtmph1, x0 ;Lookup mul table of high nibble - vpshufb xtmpl1, xtmpl1, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xtmpl1 ;GF add high and low partials - vpand xtmph1, xtmph1, xtmph5 - vpxor xd1, xd1, xtmph1 - - XLDR xd3, [dest3+tmp] ;Reuse xtmpl1, Get next dest vector - XLDR xd4, [dest4+tmp] ;Reuse xtmph1, Get next dest vector - - ; dest2 - vpshufb xtmph2, xtmph2, x0 ;Lookup mul table of high nibble - vpshufb xtmpl2, xtmpl2, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmph2, xtmpl2 ;GF add high and low partials - vpand xtmph2, xtmph2, xtmph5 - vpxor xd2, xd2, xtmph2 - - XLDR xd5, [dest5+tmp] ;Reuse xtmpl2. Get next dest vector - - ; dest3 - vpshufb xtmph3, xtmph3, x0 ;Lookup mul table of high nibble - vpshufb xtmpl3, xtmpl3, xtmpa ;Lookup mul table of low nibble - vpxor xtmph3, xtmph3, xtmpl3 ;GF add high and low partials - vpand xtmph3, xtmph3, xtmph5 - vpxor xd3, xd3, xtmph3 - - ; dest4 - vpshufb xgft4_hi, xgft4_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft4_lo, xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft4_hi, xgft4_hi, xgft4_lo ;GF add high and low partials - vpand xgft4_hi, xgft4_hi, xtmph5 - vpxor xd4, xd4, xgft4_hi - - ; dest5 - vpshufb xgft5_hi, xgft5_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl5, xtmpl5, xtmpa ;Lookup mul table of low nibble - vpxor xgft5_hi, xgft5_hi, xtmpl5 ;GF add high and low partials - vpand xgft5_hi, xgft5_hi, xtmph5 - vpxor xd5, xd5, xgft5_hi - - XSTR [dest1+tmp], xd1 ;Store result into dest1 - XSTR [dest2+tmp], xd2 ;Store result into dest2 - XSTR [dest3+tmp], xd3 ;Store result into dest3 - XSTR [dest4+tmp], xd4 ;Store result into dest4 - XSTR [dest5+tmp], xd5 ;Store result into dest5 - -.return_pass: - FUNC_RESTORE - mov return, 0 - ret - -.return_fail: - FUNC_RESTORE - mov return, 1 - ret - -endproc_frame - -section .data - -align 16 -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f -constip16: - ddq 0xf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_5vect_mad_avx, 02, 00, 020d diff --git a/pkg/erasure/gf_5vect_mad_avx2.asm b/pkg/erasure/gf_5vect_mad_avx2.asm deleted file mode 100644 index 1b2bb2e4c..000000000 --- a/pkg/erasure/gf_5vect_mad_avx2.asm +++ /dev/null @@ -1,387 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_5vect_mad_avx2(len, vec, vec_i, mul_array, src, dest); -;;; - -%define PS 8 - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 - %define arg5 r15 - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define return rax - %define return.w eax - %define stack_size 16*10 + 3*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - -%macro FUNC_SAVE 0 - sub rsp, stack_size - movdqa [rsp+16*0],xmm6 - movdqa [rsp+16*1],xmm7 - movdqa [rsp+16*2],xmm8 - movdqa [rsp+16*3],xmm9 - movdqa [rsp+16*4],xmm10 - movdqa [rsp+16*5],xmm11 - movdqa [rsp+16*6],xmm12 - movdqa [rsp+16*7],xmm13 - movdqa [rsp+16*8],xmm14 - movdqa [rsp+16*9],xmm15 - save_reg r12, 10*16 + 0*8 - save_reg r15, 10*16 + 1*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) -%endmacro - -%macro FUNC_RESTORE 0 - movdqa xmm6, [rsp+16*0] - movdqa xmm7, [rsp+16*1] - movdqa xmm8, [rsp+16*2] - movdqa xmm9, [rsp+16*3] - movdqa xmm10, [rsp+16*4] - movdqa xmm11, [rsp+16*5] - movdqa xmm12, [rsp+16*6] - movdqa xmm13, [rsp+16*7] - movdqa xmm14, [rsp+16*8] - movdqa xmm15, [rsp+16*9] - mov r12, [rsp + 10*16 + 0*8] - mov r15, [rsp + 10*16 + 1*8] - add rsp, stack_size -%endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - -;;; gf_5vect_mad_avx2(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest1 arg5 -%define pos return -%define pos.w return.w - -%define dest2 tmp2 -%define dest3 mul_array -%define dest4 vec -%define dest5 vec_i - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - -default rel - -[bits 64] -section .text - -%define xmask0f ymm15 -%define xmask0fx xmm15 -%define xgft1_lo ymm14 -%define xgft2_lo ymm13 -%define xgft3_lo ymm12 -%define xgft4_lo ymm11 -%define xgft5_lo ymm10 - -%define x0 ymm0 -%define xtmpa ymm1 -%define xtmpl ymm2 -%define xtmplx xmm2 -%define xtmph1 ymm3 -%define xtmph1x xmm3 -%define xtmph2 ymm4 -%define xd1 ymm5 -%define xd2 ymm6 -%define xd3 ymm7 -%define xd4 ymm8 -%define xd5 ymm9 - -align 16 -global gf_5vect_mad_avx2:function -func(gf_5vect_mad_avx2) - FUNC_SAVE - sub len, 32 - jl .return_fail - xor pos, pos - mov tmp.b, 0x0f - vpinsrb xmask0fx, xmask0fx, tmp.w, 0 - vpbroadcastb xmask0f, xmask0fx ;Construct mask 0x0f0f0f... - - sal vec_i, 5 ;Multiply by 32 - sal vec, 5 ;Multiply by 32 - lea tmp, [mul_array + vec_i] - - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - ; " Ax{00}, Ax{10}, ..., Ax{f0} - vmovdqu xgft2_lo, [tmp+vec] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - ; " Bx{00}, Bx{10}, ..., Bx{f0} - vmovdqu xgft3_lo, [tmp+2*vec] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - ; " Cx{00}, Cx{10}, ..., Cx{f0} - vmovdqu xgft5_lo, [tmp+4*vec] ;Load array Ex{00}, Ex{01}, ..., Ex{0f} - ; " Ex{00}, Ex{10}, ..., Ex{f0} - add tmp, vec - vmovdqu xgft4_lo, [tmp+2*vec] ;Load array Dx{00}, Dx{01}, ..., Dx{0f} - ; " Dx{00}, Dx{10}, ..., Dx{f0} - - mov dest3, [dest1+2*PS] ; reuse mul_array - mov dest4, [dest1+3*PS] ; reuse vec - mov dest5, [dest1+4*PS] ; reuse vec_i - mov dest2, [dest1+PS] - mov dest1, [dest1] - -.loop32: - XLDR x0, [src+pos] ;Get next source vector - - XLDR xd1, [dest1+pos] ;Get next dest vector - XLDR xd2, [dest2+pos] ;Get next dest vector - XLDR xd3, [dest3+pos] ;Get next dest vector - XLDR xd4, [dest4+pos] ;Get next dest vector - XLDR xd5, [dest5+pos] ;Get next dest vector - - vpand xtmpl, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - vperm2i128 xtmpa, xtmpl, x0, 0x30 ;swap xtmpa from 1lo|2lo to 1lo|2hi - vperm2i128 x0, xtmpl, x0, 0x12 ;swap x0 from 1hi|2hi to 1hi|2lo - - vperm2i128 xtmph1, xgft1_lo, xgft1_lo, 0x01 ; swapped to hi | lo - vperm2i128 xtmph2, xgft2_lo, xgft2_lo, 0x01 ; swapped to hi | lo - - ; dest1 - vpshufb xtmph1, xtmph1, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xtmpl ;GF add high and low partials - vpxor xd1, xd1, xtmph1 ;xd1 += partial - - vperm2i128 xtmph1, xgft3_lo, xgft3_lo, 0x01 ; swapped to hi | lo - ; dest2 - vpshufb xtmph2, xtmph2, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmph2, xtmpl ;GF add high and low partials - vpxor xd2, xd2, xtmph2 ;xd2 += partial - - vperm2i128 xtmph2, xgft4_lo, xgft4_lo, 0x01 ; swapped to hi | lo - ; dest3 - vpshufb xtmph1, xtmph1, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xtmpl ;GF add high and low partials - vpxor xd3, xd3, xtmph1 ;xd3 += partial - - vperm2i128 xtmph1, xgft5_lo, xgft5_lo, 0x01 ; swapped to hi | lo - ; dest4 - vpshufb xtmph2, xtmph2, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmph2, xtmpl ;GF add high and low partials - vpxor xd4, xd4, xtmph2 ;xd4 += partial - - ; dest5 - vpshufb xtmph1, xtmph1, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft5_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xtmpl ;GF add high and low partials - vpxor xd5, xd5, xtmph1 ;xd5 += partial - - XSTR [dest1+pos], xd1 - XSTR [dest2+pos], xd2 - XSTR [dest3+pos], xd3 - XSTR [dest4+pos], xd4 - XSTR [dest5+pos], xd5 - - add pos, 32 ;Loop on 32 bytes at a time - cmp pos, len - jle .loop32 - - lea tmp, [len + 32] - cmp pos, tmp - je .return_pass - -.lessthan32: - ;; Tail len - ;; Do one more overlap pass - mov tmp.b, 0x1f - vpinsrb xtmph1x, xtmph1x, tmp.w, 0 - vpbroadcastb xtmph1, xtmph1x ;Construct mask 0x1f1f1f... - - mov tmp, len ;Overlapped offset length-32 - - XLDR x0, [src+tmp] ;Get next source vector - - XLDR xd1, [dest1+tmp] ;Get next dest vector - XLDR xd2, [dest2+tmp] ;Get next dest vector - XLDR xd3, [dest3+tmp] ;Get next dest vector - XLDR xd4, [dest4+tmp] ;Get next dest vector - XLDR xd5, [dest5+tmp] ;Get next dest vector - - sub len, pos - - vmovdqa xtmph2, [constip32] ;Load const of i + 32 - vpinsrb xtmplx, xtmplx, len.w, 15 - vinserti128 xtmpl, xtmpl, xtmplx, 1 ;swapped to xtmplx | xtmplx - vpshufb xtmpl, xtmpl, xtmph1 ;Broadcast len to all bytes. xtmph1=0x1f1f1f... - vpcmpgtb xtmpl, xtmpl, xtmph2 - - vpand xtmph1, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - vperm2i128 xtmpa, xtmph1, x0, 0x30 ;swap xtmpa from 1lo|2lo to 1lo|2hi - vperm2i128 x0, xtmph1, x0, 0x12 ;swap x0 from 1hi|2hi to 1hi|2lo - - vperm2i128 xtmph1, xgft1_lo, xgft1_lo, 0x01 ; swapped to hi | lo - vperm2i128 xtmph2, xgft2_lo, xgft2_lo, 0x01 ; swapped to hi | lo - - ; dest1 - vpshufb xtmph1, xtmph1, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xgft1_lo ;GF add high and low partials - vpand xtmph1, xtmph1, xtmpl - vpxor xd1, xd1, xtmph1 ;xd1 += partial - - vperm2i128 xtmph1, xgft3_lo, xgft3_lo, 0x01 ; swapped to hi | lo - ; dest2 - vpshufb xtmph2, xtmph2, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmph2, xgft2_lo ;GF add high and low partials - vpand xtmph2, xtmph2, xtmpl - vpxor xd2, xd2, xtmph2 ;xd2 += partial - - vperm2i128 xtmph2, xgft4_lo, xgft4_lo, 0x01 ; swapped to hi | lo - ; dest3 - vpshufb xtmph1, xtmph1, x0 ;Lookup mul table of high nibble - vpshufb xgft3_lo, xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xgft3_lo ;GF add high and low partials - vpand xtmph1, xtmph1, xtmpl - vpxor xd3, xd3, xtmph1 ;xd3 += partial - - vperm2i128 xtmph1, xgft5_lo, xgft5_lo, 0x01 ; swapped to hi | lo - ; dest4 - vpshufb xtmph2, xtmph2, x0 ;Lookup mul table of high nibble - vpshufb xgft4_lo, xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmph2, xgft4_lo ;GF add high and low partials - vpand xtmph2, xtmph2, xtmpl - vpxor xd4, xd4, xtmph2 ;xd4 += partial - - ; dest5 - vpshufb xtmph1, xtmph1, x0 ;Lookup mul table of high nibble - vpshufb xgft5_lo, xgft5_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xgft5_lo ;GF add high and low partials - vpand xtmph1, xtmph1, xtmpl - vpxor xd5, xd5, xtmph1 ;xd5 += partial - - XSTR [dest1+tmp], xd1 - XSTR [dest2+tmp], xd2 - XSTR [dest3+tmp], xd3 - XSTR [dest4+tmp], xd4 - XSTR [dest5+tmp], xd5 - -.return_pass: - FUNC_RESTORE - mov return, 0 - ret - -.return_fail: - FUNC_RESTORE - mov return, 1 - ret - -endproc_frame - -section .data -align 32 -constip32: - ddq 0xf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff - ddq 0xe0e1e2e3e4e5e6e7e8e9eaebecedeeef - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_5vect_mad_avx2, 04, 00, 020e diff --git a/pkg/erasure/gf_5vect_mad_sse.asm b/pkg/erasure/gf_5vect_mad_sse.asm deleted file mode 100644 index 1fa670a84..000000000 --- a/pkg/erasure/gf_5vect_mad_sse.asm +++ /dev/null @@ -1,403 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_5vect_mad_sse(len, vec, vec_i, mul_array, src, dest); -;;; - -%define PS 8 - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 - %define arg5 r15 - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 - %define tmp4 r14 - %define return rax - %define return.w eax - %define stack_size 16*10 + 5*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - -%macro FUNC_SAVE 0 - sub rsp, stack_size - movdqa [rsp+16*0],xmm6 - movdqa [rsp+16*1],xmm7 - movdqa [rsp+16*2],xmm8 - movdqa [rsp+16*3],xmm9 - movdqa [rsp+16*4],xmm10 - movdqa [rsp+16*5],xmm11 - movdqa [rsp+16*6],xmm12 - movdqa [rsp+16*7],xmm13 - movdqa [rsp+16*8],xmm14 - movdqa [rsp+16*9],xmm15 - save_reg r12, 10*16 + 0*8 - save_reg r13, 10*16 + 1*8 - save_reg r14, 10*16 + 2*8 - save_reg r15, 10*16 + 3*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) -%endmacro - -%macro FUNC_RESTORE 0 - movdqa xmm6, [rsp+16*0] - movdqa xmm7, [rsp+16*1] - movdqa xmm8, [rsp+16*2] - movdqa xmm9, [rsp+16*3] - movdqa xmm10, [rsp+16*4] - movdqa xmm11, [rsp+16*5] - movdqa xmm12, [rsp+16*6] - movdqa xmm13, [rsp+16*7] - movdqa xmm14, [rsp+16*8] - movdqa xmm15, [rsp+16*9] - mov r12, [rsp + 10*16 + 0*8] - mov r13, [rsp + 10*16 + 1*8] - mov r14, [rsp + 10*16 + 2*8] - mov r15, [rsp + 10*16 + 3*8] - add rsp, stack_size -%endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp2 r10 - %define tmp3 r12 - %define tmp4 r13 - %define return rax - %define return.w eax - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - %endmacro - %macro FUNC_RESTORE 0 - pop r13 - pop r12 - %endmacro -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp2 r10 - %define tmp3 r12 - %define tmp4 r13 - %define return rax - %define return.w eax - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - %endmacro - %macro FUNC_RESTORE 0 - pop r13 - pop r12 - %endmacro -%endif - -;;; gf_5vect_mad_sse(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest1 arg5 -%define pos return -%define pos.w return.w - -%define dest2 tmp4 -%define dest3 mul_array -%define dest4 tmp2 -%define dest5 vec_i - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR movdqu - %define XSTR movdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR movdqa - %define XSTR movdqa - %else - %define XLDR movntdqa - %define XSTR movntdq - %endif -%endif - -default rel - -[bits 64] -section .text - -%define xmask0f xmm15 -%define xgft5_hi xmm14 -%define xgft4_lo xmm13 -%define xgft4_hi xmm12 - -%define x0 xmm0 -%define xtmpa xmm1 -%define xtmph1 xmm2 -%define xtmpl1 xmm3 -%define xtmph2 xmm4 -%define xtmpl2 xmm5 -%define xtmph3 xmm6 -%define xtmpl3 xmm7 -%define xtmph5 xmm8 -%define xtmpl5 xmm9 -%define xd1 xmm10 -%define xd2 xmm11 -%define xd3 xtmpl1 -%define xd4 xtmph1 -%define xd5 xtmpl2 - - -align 16 -global gf_5vect_mad_sse:function -func(gf_5vect_mad_sse) - FUNC_SAVE - sub len, 16 - jl .return_fail - xor pos, pos - - movdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - mov tmp, vec - sal vec_i, 5 ;Multiply by 32 - lea tmp3, [mul_array + vec_i] - sal tmp, 6 ;Multiply by 64 - movdqu xgft5_hi, [tmp3+2*tmp+16] ; " Ex{00}, Ex{10}, ..., Ex{f0} - sal vec, 5 ;Multiply by 32 - add tmp, vec - movdqu xgft4_hi, [tmp3+tmp+16] ; " Dx{00}, Dx{10}, Dx{20}, ... , Dx{f0} - movdqu xgft4_lo, [tmp3+tmp] ;Load array Dx{00}, Dx{01}, Dx{02}, ... - - mov dest3, [dest1+2*PS] ; reuse mul_array - mov dest4, [dest1+3*PS] - mov dest5, [dest1+4*PS] ; reuse vec_i - mov dest2, [dest1+PS] - mov dest1, [dest1] - -.loop16: - XLDR x0, [src+pos] ;Get next source vector - - movdqu xtmph1, [tmp3+16] ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - movdqu xtmpl1, [tmp3] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - movdqu xtmph2, [tmp3+vec+16] ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - movdqu xtmpl2, [tmp3+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - movdqu xtmph3, [tmp3+2*vec+16] ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - movdqu xtmpl3, [tmp3+2*vec] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - movdqu xtmpl5, [tmp3+4*vec] ;Load array Ex{00}, Ex{01}, ..., Ex{0f} - movdqa xtmph5, xgft5_hi ;Reload const array registers - - XLDR xd1, [dest1+pos] ;Get next dest vector - XLDR xd2, [dest2+pos] ;Get next dest vector - - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - - ; dest1 - pshufb xtmph1, x0 ;Lookup mul table of high nibble - pshufb xtmpl1, xtmpa ;Lookup mul table of low nibble - pxor xtmph1, xtmpl1 ;GF add high and low partials - pxor xd1, xtmph1 - - XLDR xd3, [dest3+pos] ;Reuse xtmpl1, Get next dest vector - XLDR xd4, [dest4+pos] ;Reuse xtmph1. Get next dest vector - - ; dest2 - pshufb xtmph2, x0 ;Lookup mul table of high nibble - pshufb xtmpl2, xtmpa ;Lookup mul table of low nibble - pxor xtmph2, xtmpl2 ;GF add high and low partials - pxor xd2, xtmph2 - - XLDR xd5, [dest5+pos] ;Reuse xtmpl2. Get next dest vector - - ; dest3 - pshufb xtmph3, x0 ;Lookup mul table of high nibble - pshufb xtmpl3, xtmpa ;Lookup mul table of low nibble - pxor xtmph3, xtmpl3 ;GF add high and low partials - pxor xd3, xtmph3 - - movdqa xtmph2, xgft4_hi ;Reload const array registers - movdqa xtmpl3, xgft4_lo ;Reload const array registers - - ; dest5 - pshufb xtmph5, x0 ;Lookup mul table of high nibble - pshufb xtmpl5, xtmpa ;Lookup mul table of low nibble - pxor xtmph5, xtmpl5 ;GF add high and low partials - pxor xd5, xtmph5 - - ; dest4 - pshufb xtmph2, x0 ;Lookup mul table of high nibble - pshufb xtmpl3, xtmpa ;Lookup mul table of low nibble - pxor xtmph2, xtmpl3 ;GF add high and low partials - pxor xd4, xtmph2 - - XSTR [dest1+pos], xd1 ;Store result into dest1 - XSTR [dest2+pos], xd2 ;Store result into dest2 - XSTR [dest3+pos], xd3 ;Store result into dest3 - XSTR [dest4+pos], xd4 ;Store result into dest4 - XSTR [dest5+pos], xd5 ;Store result into dest5 - - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - -.lessthan16: - ;; Tail len - ;; Do one more overlap pass - mov tmp, len ;Overlapped offset length-16 - XLDR x0, [src+tmp] ;Get next source vector - - sub len, pos - - movdqa xtmpl1, [constip16] ;Load const of i + 16 - pinsrb xtmph5, len.w, 15 - pshufb xtmph5, xmask0f ;Broadcast len to all bytes - pcmpgtb xtmph5, xtmpl1 - - movdqu xtmph1, [tmp3+16] ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - movdqu xtmpl1, [tmp3] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - movdqu xtmph2, [tmp3+vec+16] ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - movdqu xtmpl2, [tmp3+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - movdqu xtmph3, [tmp3+2*vec+16] ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - movdqu xtmpl3, [tmp3+2*vec] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - movdqu xtmpl5, [tmp3+4*vec] ;Load array Ex{00}, Ex{01}, ..., Ex{0f} - - XLDR xd1, [dest1+tmp] ;Get next dest vector - XLDR xd2, [dest2+tmp] ;Get next dest vector - - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - - ; dest1 - pshufb xtmph1, x0 ;Lookup mul table of high nibble - pshufb xtmpl1, xtmpa ;Lookup mul table of low nibble - pxor xtmph1, xtmpl1 ;GF add high and low partials - pand xtmph1, xtmph5 - pxor xd1, xtmph1 - - XLDR xd3, [dest3+tmp] ;Reuse xtmpl1, Get next dest vector - XLDR xd4, [dest4+tmp] ;Reuse xtmph1. Get next dest vector - - ; dest2 - pshufb xtmph2, x0 ;Lookup mul table of high nibble - pshufb xtmpl2, xtmpa ;Lookup mul table of low nibble - pxor xtmph2, xtmpl2 ;GF add high and low partials - pand xtmph2, xtmph5 - pxor xd2, xtmph2 - - XLDR xd5, [dest5+tmp] ;Reuse xtmpl2. Get next dest vector - - ; dest3 - pshufb xtmph3, x0 ;Lookup mul table of high nibble - pshufb xtmpl3, xtmpa ;Lookup mul table of low nibble - pxor xtmph3, xtmpl3 ;GF add high and low partials - pand xtmph3, xtmph5 - pxor xd3, xtmph3 - - ; dest4 - pshufb xgft4_hi, x0 ;Lookup mul table of high nibble - pshufb xgft4_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft4_hi, xgft4_lo ;GF add high and low partials - pand xgft4_hi, xtmph5 - pxor xd4, xgft4_hi - - ; dest5 - pshufb xgft5_hi, x0 ;Lookup mul table of high nibble - pshufb xtmpl5, xtmpa ;Lookup mul table of low nibble - pxor xgft5_hi, xtmpl5 ;GF add high and low partials - pand xgft5_hi, xtmph5 - pxor xd5, xgft5_hi - - XSTR [dest1+tmp], xd1 ;Store result into dest1 - XSTR [dest2+tmp], xd2 ;Store result into dest2 - XSTR [dest3+tmp], xd3 ;Store result into dest3 - XSTR [dest4+tmp], xd4 ;Store result into dest4 - XSTR [dest5+tmp], xd5 ;Store result into dest5 - -.return_pass: - FUNC_RESTORE - mov return, 0 - ret - -.return_fail: - FUNC_RESTORE - mov return, 1 - ret - -endproc_frame - -section .data - -align 16 - -mask0f: - ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f -constip16: - ddq 0xf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_5vect_mad_sse, 00, 00, 020c diff --git a/pkg/erasure/gf_6vect_dot_prod_avx.asm b/pkg/erasure/gf_6vect_dot_prod_avx.asm deleted file mode 100644 index fba9bd18a..000000000 --- a/pkg/erasure/gf_6vect_dot_prod_avx.asm +++ /dev/null @@ -1,354 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_6vect_dot_prod_avx(len, vec, *g_tbls, **buffs, **dests); -;;; - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved, loaded and restored - %define arg5 r15 ; must be saved and restored - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r14 ; must be saved and restored - %define tmp5 rdi ; must be saved and restored - %define tmp6 rsi ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - %define stack_size 10*16 + 7*8 ; must be an odd multiple of 8 - %define arg(x) [rsp + stack_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - save_xmm128 xmm6, 0*16 - save_xmm128 xmm7, 1*16 - save_xmm128 xmm8, 2*16 - save_xmm128 xmm9, 3*16 - save_xmm128 xmm10, 4*16 - save_xmm128 xmm11, 5*16 - save_xmm128 xmm12, 6*16 - save_xmm128 xmm13, 7*16 - save_xmm128 xmm14, 8*16 - save_xmm128 xmm15, 9*16 - save_reg r12, 10*16 + 0*8 - save_reg r13, 10*16 + 1*8 - save_reg r14, 10*16 + 2*8 - save_reg r15, 10*16 + 3*8 - save_reg rdi, 10*16 + 4*8 - save_reg rsi, 10*16 + 5*8 - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - vmovdqa xmm6, [rsp + 0*16] - vmovdqa xmm7, [rsp + 1*16] - vmovdqa xmm8, [rsp + 2*16] - vmovdqa xmm9, [rsp + 3*16] - vmovdqa xmm10, [rsp + 4*16] - vmovdqa xmm11, [rsp + 5*16] - vmovdqa xmm12, [rsp + 6*16] - vmovdqa xmm13, [rsp + 7*16] - vmovdqa xmm14, [rsp + 8*16] - vmovdqa xmm15, [rsp + 9*16] - mov r12, [rsp + 10*16 + 0*8] - mov r13, [rsp + 10*16 + 1*8] - mov r14, [rsp + 10*16 + 2*8] - mov r15, [rsp + 10*16 + 3*8] - mov rdi, [rsp + 10*16 + 4*8] - mov rsi, [rsp + 10*16 + 5*8] - add rsp, stack_size - %endmacro -%endif - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest arg4 -%define ptr arg5 -%define vec_i tmp2 -%define dest1 tmp3 -%define dest2 tmp4 -%define vskip1 tmp5 -%define vskip3 tmp6 -%define pos return - - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - - -default rel - -[bits 64] -section .text - -%define xmask0f xmm15 -%define xgft1_lo xmm14 -%define xgft1_hi xmm13 -%define xgft2_lo xmm12 -%define xgft2_hi xmm11 -%define xgft3_lo xmm10 -%define xgft3_hi xmm9 -%define x0 xmm0 -%define xtmpa xmm1 -%define xp1 xmm2 -%define xp2 xmm3 -%define xp3 xmm4 -%define xp4 xmm5 -%define xp5 xmm6 -%define xp6 xmm7 - -align 16 -global gf_6vect_dot_prod_avx:function -func(gf_6vect_dot_prod_avx) - FUNC_SAVE - sub len, 16 - jl .return_fail - xor pos, pos - vmovdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - mov vskip1, vec - imul vskip1, 32 - mov vskip3, vec - imul vskip3, 96 - sal vec, LOG_PS ;vec *= PS. Make vec_i count by PS - mov dest1, [dest] - mov dest2, [dest+PS] - - -.loop16: - mov tmp, mul_array - xor vec_i, vec_i - vpxor xp1, xp1 - vpxor xp2, xp2 - vpxor xp3, xp3 - vpxor xp4, xp4 - vpxor xp5, xp5 - vpxor xp6, xp6 - -.next_vect: - mov ptr, [src+vec_i] - add vec_i, PS - XLDR x0, [ptr+pos] ;Get next source vector - - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - vmovdqu xgft1_hi, [tmp+16] ; " Ax{00}, Ax{10}, ..., Ax{f0} - vmovdqu xgft2_lo, [tmp+vskip1*1] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - vmovdqu xgft2_hi, [tmp+vskip1*1+16] ; " Bx{00}, Bx{10}, ..., Bx{f0} - vmovdqu xgft3_lo, [tmp+vskip1*2] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - vmovdqu xgft3_hi, [tmp+vskip1*2+16] ; " Cx{00}, Cx{10}, ..., Cx{f0} - lea ptr, [vskip1 + vskip1*4] ;ptr = vskip5 - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - - vpshufb xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft1_hi, xgft1_lo ;GF add high and low partials - vpxor xp1, xgft1_hi ;xp1 += partial - - vpshufb xgft2_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft2_hi, xgft2_lo ;GF add high and low partials - vpxor xp2, xgft2_hi ;xp2 += partial - - vpshufb xgft3_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft3_hi, xgft3_lo ;GF add high and low partials - vpxor xp3, xgft3_hi ;xp3 += partial - - - vmovdqu xgft1_lo, [tmp+vskip3] ;Load array Dx{00}, Dx{01}, ..., Dx{0f} - vmovdqu xgft1_hi, [tmp+vskip3+16] ; " Dx{00}, Dx{10}, ..., Dx{f0} - vmovdqu xgft2_lo, [tmp+vskip1*4] ;Load array Ex{00}, Ex{01}, ..., Ex{0f} - vmovdqu xgft2_hi, [tmp+vskip1*4+16] ; " Ex{00}, Ex{10}, ..., Ex{f0} - vmovdqu xgft3_lo, [tmp+ptr] ;Load array Fx{00}, Fx{01}, ..., Fx{0f} - vmovdqu xgft3_hi, [tmp+ptr+16] ; " Fx{00}, Fx{10}, ..., Fx{f0} - add tmp, 32 - - - vpshufb xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft1_hi, xgft1_lo ;GF add high and low partials - vpxor xp4, xgft1_hi ;xp4 += partial - - vpshufb xgft2_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft2_hi, xgft2_lo ;GF add high and low partials - vpxor xp5, xgft2_hi ;xp5 += partial - - vpshufb xgft3_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft3_hi, xgft3_lo ;GF add high and low partials - vpxor xp6, xgft3_hi ;xp6 += partial - - cmp vec_i, vec - jl .next_vect - - - mov tmp, [dest+2*PS] - mov ptr, [dest+3*PS] - mov vec_i, [dest+4*PS] - - XSTR [dest1+pos], xp1 - XSTR [dest2+pos], xp2 - XSTR [tmp+pos], xp3 - mov tmp, [dest+5*PS] - XSTR [ptr+pos], xp4 - XSTR [vec_i+pos], xp5 - XSTR [tmp+pos], xp6 - - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - jmp .loop16 ;Do one more overlap pass - -.return_pass: - FUNC_RESTORE - mov return, 0 - ret - -.return_fail: - FUNC_RESTORE - mov return, 1 - ret - -endproc_frame - -section .data - -align 16 -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_6vect_dot_prod_avx, 02, 03, 0195 diff --git a/pkg/erasure/gf_6vect_dot_prod_avx2.asm b/pkg/erasure/gf_6vect_dot_prod_avx2.asm deleted file mode 100644 index e7aa1b71c..000000000 --- a/pkg/erasure/gf_6vect_dot_prod_avx2.asm +++ /dev/null @@ -1,367 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_6vect_dot_prod_avx2(len, vec, *g_tbls, **buffs, **dests); -;;; - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved, loaded and restored - %define arg5 r15 ; must be saved and restored - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r14 ; must be saved and restored - %define tmp5 rdi ; must be saved and restored - %define tmp6 rsi ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - %define stack_size 10*16 + 7*8 ; must be an odd multiple of 8 - %define arg(x) [rsp + stack_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - vmovdqa [rsp + 0*16], xmm6 - vmovdqa [rsp + 1*16], xmm7 - vmovdqa [rsp + 2*16], xmm8 - vmovdqa [rsp + 3*16], xmm9 - vmovdqa [rsp + 4*16], xmm10 - vmovdqa [rsp + 5*16], xmm11 - vmovdqa [rsp + 6*16], xmm12 - vmovdqa [rsp + 7*16], xmm13 - vmovdqa [rsp + 8*16], xmm14 - vmovdqa [rsp + 9*16], xmm15 - save_reg r12, 10*16 + 0*8 - save_reg r13, 10*16 + 1*8 - save_reg r14, 10*16 + 2*8 - save_reg r15, 10*16 + 3*8 - save_reg rdi, 10*16 + 4*8 - save_reg rsi, 10*16 + 5*8 - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - vmovdqa xmm6, [rsp + 0*16] - vmovdqa xmm7, [rsp + 1*16] - vmovdqa xmm8, [rsp + 2*16] - vmovdqa xmm9, [rsp + 3*16] - vmovdqa xmm10, [rsp + 4*16] - vmovdqa xmm11, [rsp + 5*16] - vmovdqa xmm12, [rsp + 6*16] - vmovdqa xmm13, [rsp + 7*16] - vmovdqa xmm14, [rsp + 8*16] - vmovdqa xmm15, [rsp + 9*16] - mov r12, [rsp + 10*16 + 0*8] - mov r13, [rsp + 10*16 + 1*8] - mov r14, [rsp + 10*16 + 2*8] - mov r15, [rsp + 10*16 + 3*8] - mov rdi, [rsp + 10*16 + 4*8] - mov rsi, [rsp + 10*16 + 5*8] - add rsp, stack_size - %endmacro -%endif - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest arg4 -%define ptr arg5 -%define vec_i tmp2 -%define dest1 tmp3 -%define dest2 tmp4 -%define vskip1 tmp5 -%define vskip3 tmp6 -%define pos return - - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - - -default rel - -[bits 64] -section .text - -%define xmask0f ymm15 -%define xmask0fx xmm15 -%define xgft1_lo ymm14 -%define xgft1_hi ymm13 -%define xgft2_lo ymm12 -%define xgft2_hi ymm11 -%define xgft3_lo ymm10 -%define xgft3_hi ymm9 -%define x0 ymm0 -%define xtmpa ymm1 -%define xp1 ymm2 -%define xp2 ymm3 -%define xp3 ymm4 -%define xp4 ymm5 -%define xp5 ymm6 -%define xp6 ymm7 - -align 16 -global gf_6vect_dot_prod_avx2:function -func(gf_6vect_dot_prod_avx2) - FUNC_SAVE - sub len, 32 - jl .return_fail - xor pos, pos - mov tmp.b, 0x0f - vpinsrb xmask0fx, xmask0fx, tmp.w, 0 - vpbroadcastb xmask0f, xmask0fx ;Construct mask 0x0f0f0f... - mov vskip1, vec - imul vskip1, 32 - mov vskip3, vec - imul vskip3, 96 - sal vec, LOG_PS ;vec *= PS. Make vec_i count by PS - mov dest1, [dest] - mov dest2, [dest+PS] - - -.loop32: - mov tmp, mul_array - xor vec_i, vec_i - vpxor xp1, xp1 - vpxor xp2, xp2 - vpxor xp3, xp3 - vpxor xp4, xp4 - vpxor xp5, xp5 - vpxor xp6, xp6 - -.next_vect: - mov ptr, [src+vec_i] - XLDR x0, [ptr+pos] ;Get next source vector - add vec_i, PS - - vpand xgft3_lo, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - vperm2i128 xtmpa, xgft3_lo, x0, 0x30 ;swap xtmpa from 1lo|2lo to 1lo|2hi - vperm2i128 x0, xgft3_lo, x0, 0x12 ;swap x0 from 1hi|2hi to 1hi|2lo - - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - ; " Ax{00}, Ax{10}, ..., Ax{f0} - vmovdqu xgft2_lo, [tmp+vskip1*1] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - ; " Bx{00}, Bx{10}, ..., Bx{f0} - vmovdqu xgft3_lo, [tmp+vskip1*2] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - ; " Cx{00}, Cx{10}, ..., Cx{f0} - lea ptr, [vskip1 + vskip1*4] ;ptr = vskip5 - - vperm2i128 xgft1_hi, xgft1_lo, xgft1_lo, 0x01 ; swapped to hi | lo - vperm2i128 xgft2_hi, xgft2_lo, xgft2_lo, 0x01 ; swapped to hi | lo - vperm2i128 xgft3_hi, xgft3_lo, xgft3_lo, 0x01 ; swapped to hi | lo - - vpshufb xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft1_hi, xgft1_lo ;GF add high and low partials - vpxor xp1, xgft1_hi ;xp1 += partial - - vpshufb xgft2_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft2_hi, xgft2_lo ;GF add high and low partials - vpxor xp2, xgft2_hi ;xp2 += partial - - vpshufb xgft3_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft3_hi, xgft3_lo ;GF add high and low partials - vpxor xp3, xgft3_hi ;xp3 += partial - - - vmovdqu xgft1_lo, [tmp+vskip3] ;Load array Dx{00}, Dx{01}, ..., Dx{0f} - ; " Dx{00}, Dx{10}, ..., Dx{f0} - vmovdqu xgft2_lo, [tmp+vskip1*4] ;Load array Ex{00}, Ex{01}, ..., Ex{0f} - ; " Ex{00}, Ex{10}, ..., Ex{f0} - vmovdqu xgft3_lo, [tmp+ptr] ;Load array Fx{00}, Fx{01}, ..., Fx{0f} - ; " Fx{00}, Fx{10}, ..., Fx{f0} - add tmp, 32 - vperm2i128 xgft1_hi, xgft1_lo, xgft1_lo, 0x01 ; swapped to hi | lo - vperm2i128 xgft2_hi, xgft2_lo, xgft2_lo, 0x01 ; swapped to hi | lo - vperm2i128 xgft3_hi, xgft3_lo, xgft3_lo, 0x01 ; swapped to hi | lo - - vpshufb xgft1_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft1_hi, xgft1_lo ;GF add high and low partials - vpxor xp4, xgft1_hi ;xp4 += partial - - vpshufb xgft2_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft2_hi, xgft2_lo ;GF add high and low partials - vpxor xp5, xgft2_hi ;xp5 += partial - - vpshufb xgft3_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft3_hi, xgft3_lo ;GF add high and low partials - vpxor xp6, xgft3_hi ;xp6 += partial - - cmp vec_i, vec - jl .next_vect - - - mov tmp, [dest+2*PS] - mov ptr, [dest+3*PS] - mov vec_i, [dest+4*PS] - - XSTR [dest1+pos], xp1 - XSTR [dest2+pos], xp2 - XSTR [tmp+pos], xp3 - mov tmp, [dest+5*PS] - XSTR [ptr+pos], xp4 - XSTR [vec_i+pos], xp5 - XSTR [tmp+pos], xp6 - - add pos, 32 ;Loop on 32 bytes at a time - cmp pos, len - jle .loop32 - - lea tmp, [len + 32] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - jmp .loop32 ;Do one more overlap pass - -.return_pass: - FUNC_RESTORE - mov return, 0 - ret - -.return_fail: - FUNC_RESTORE - mov return, 1 - ret - -endproc_frame - -section .data - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_6vect_dot_prod_avx2, 04, 03, 019a diff --git a/pkg/erasure/gf_6vect_dot_prod_sse.asm b/pkg/erasure/gf_6vect_dot_prod_sse.asm deleted file mode 100644 index 64d3f7f62..000000000 --- a/pkg/erasure/gf_6vect_dot_prod_sse.asm +++ /dev/null @@ -1,354 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_6vect_dot_prod_sse(len, vec, *g_tbls, **buffs, **dests); -;;; - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r12 ; must be saved and restored - %define tmp5 r14 ; must be saved and restored - %define tmp6 r15 ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - push r15 - %endmacro - %macro FUNC_RESTORE 0 - pop r15 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved, loaded and restored - %define arg5 r15 ; must be saved and restored - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 ; must be saved and restored - %define tmp4 r14 ; must be saved and restored - %define tmp5 rdi ; must be saved and restored - %define tmp6 rsi ; must be saved and restored - %define return rax - %define PS 8 - %define LOG_PS 3 - %define stack_size 10*16 + 7*8 ; must be an odd multiple of 8 - %define arg(x) [rsp + stack_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - save_xmm128 xmm6, 0*16 - save_xmm128 xmm7, 1*16 - save_xmm128 xmm8, 2*16 - save_xmm128 xmm9, 3*16 - save_xmm128 xmm10, 4*16 - save_xmm128 xmm11, 5*16 - save_xmm128 xmm12, 6*16 - save_xmm128 xmm13, 7*16 - save_xmm128 xmm14, 8*16 - save_xmm128 xmm15, 9*16 - save_reg r12, 10*16 + 0*8 - save_reg r13, 10*16 + 1*8 - save_reg r14, 10*16 + 2*8 - save_reg r15, 10*16 + 3*8 - save_reg rdi, 10*16 + 4*8 - save_reg rsi, 10*16 + 5*8 - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - movdqa xmm6, [rsp + 0*16] - movdqa xmm7, [rsp + 1*16] - movdqa xmm8, [rsp + 2*16] - movdqa xmm9, [rsp + 3*16] - movdqa xmm10, [rsp + 4*16] - movdqa xmm11, [rsp + 5*16] - movdqa xmm12, [rsp + 6*16] - movdqa xmm13, [rsp + 7*16] - movdqa xmm14, [rsp + 8*16] - movdqa xmm15, [rsp + 9*16] - mov r12, [rsp + 10*16 + 0*8] - mov r13, [rsp + 10*16 + 1*8] - mov r14, [rsp + 10*16 + 2*8] - mov r15, [rsp + 10*16 + 3*8] - mov rdi, [rsp + 10*16 + 4*8] - mov rsi, [rsp + 10*16 + 5*8] - add rsp, stack_size - %endmacro -%endif - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest arg4 -%define ptr arg5 -%define vec_i tmp2 -%define dest1 tmp3 -%define dest2 tmp4 -%define vskip1 tmp5 -%define vskip3 tmp6 -%define pos return - - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR movdqu - %define XSTR movdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR movdqa - %define XSTR movdqa - %else - %define XLDR movntdqa - %define XSTR movntdq - %endif -%endif - - -default rel - -[bits 64] -section .text - -%define xmask0f xmm15 -%define xgft1_lo xmm2 -%define xgft1_hi xmm3 -%define xgft2_lo xmm4 -%define xgft2_hi xmm5 -%define xgft3_lo xmm6 -%define xgft3_hi xmm7 -%define x0 xmm0 -%define xtmpa xmm1 -%define xp1 xmm8 -%define xp2 xmm9 -%define xp3 xmm10 -%define xp4 xmm11 -%define xp5 xmm12 -%define xp6 xmm13 - -align 16 -global gf_6vect_dot_prod_sse:function -func(gf_6vect_dot_prod_sse) - FUNC_SAVE - sub len, 16 - jl .return_fail - xor pos, pos - movdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - mov vskip1, vec - imul vskip1, 32 - mov vskip3, vec - imul vskip3, 96 - sal vec, LOG_PS ;vec *= PS. Make vec_i count by PS - mov dest1, [dest] - mov dest2, [dest+PS] - - -.loop16: - mov tmp, mul_array - xor vec_i, vec_i - pxor xp1, xp1 - pxor xp2, xp2 - pxor xp3, xp3 - pxor xp4, xp4 - pxor xp5, xp5 - pxor xp6, xp6 - -.next_vect: - mov ptr, [src+vec_i] - add vec_i, PS - XLDR x0, [ptr+pos] ;Get next source vector - - movdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - movdqu xgft1_hi, [tmp+16] ; " Ax{00}, Ax{10}, ..., Ax{f0} - movdqu xgft2_lo, [tmp+vskip1*1] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - movdqu xgft2_hi, [tmp+vskip1*1+16] ; " Bx{00}, Bx{10}, ..., Bx{f0} - movdqu xgft3_lo, [tmp+vskip1*2] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - movdqu xgft3_hi, [tmp+vskip1*2+16] ; " Cx{00}, Cx{10}, ..., Cx{f0} - lea ptr, [vskip1 + vskip1*4] ;ptr = vskip5 - - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - - pshufb xgft1_hi, x0 ;Lookup mul table of high nibble - pshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft1_hi, xgft1_lo ;GF add high and low partials - pxor xp1, xgft1_hi ;xp1 += partial - - pshufb xgft2_hi, x0 ;Lookup mul table of high nibble - pshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft2_hi, xgft2_lo ;GF add high and low partials - pxor xp2, xgft2_hi ;xp2 += partial - - pshufb xgft3_hi, x0 ;Lookup mul table of high nibble - pshufb xgft3_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft3_hi, xgft3_lo ;GF add high and low partials - pxor xp3, xgft3_hi ;xp3 += partial - - - movdqu xgft1_lo, [tmp+vskip3] ;Load array Dx{00}, Dx{01}, ..., Dx{0f} - movdqu xgft1_hi, [tmp+vskip3+16] ; " Dx{00}, Dx{10}, ..., Dx{f0} - movdqu xgft2_lo, [tmp+vskip1*4] ;Load array Ex{00}, Ex{01}, ..., Ex{0f} - movdqu xgft2_hi, [tmp+vskip1*4+16] ; " Ex{00}, Ex{10}, ..., Ex{f0} - movdqu xgft3_lo, [tmp+ptr] ;Load array Fx{00}, Fx{01}, ..., Fx{0f} - movdqu xgft3_hi, [tmp+ptr+16] ; " Fx{00}, Fx{10}, ..., Fx{f0} - add tmp, 32 - - - pshufb xgft1_hi, x0 ;Lookup mul table of high nibble - pshufb xgft1_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft1_hi, xgft1_lo ;GF add high and low partials - pxor xp4, xgft1_hi ;xp4 += partial - - pshufb xgft2_hi, x0 ;Lookup mul table of high nibble - pshufb xgft2_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft2_hi, xgft2_lo ;GF add high and low partials - pxor xp5, xgft2_hi ;xp5 += partial - - pshufb xgft3_hi, x0 ;Lookup mul table of high nibble - pshufb xgft3_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft3_hi, xgft3_lo ;GF add high and low partials - pxor xp6, xgft3_hi ;xp6 += partial - - cmp vec_i, vec - jl .next_vect - - - mov tmp, [dest+2*PS] - mov ptr, [dest+3*PS] - mov vec_i, [dest+4*PS] - - XSTR [dest1+pos], xp1 - XSTR [dest2+pos], xp2 - XSTR [tmp+pos], xp3 - mov tmp, [dest+5*PS] - XSTR [ptr+pos], xp4 - XSTR [vec_i+pos], xp5 - XSTR [tmp+pos], xp6 - - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - jmp .loop16 ;Do one more overlap pass - -.return_pass: - FUNC_RESTORE - mov return, 0 - ret - -.return_fail: - FUNC_RESTORE - mov return, 1 - ret - -endproc_frame - -section .data - -align 16 -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_6vect_dot_prod_sse, 00, 04, 0066 diff --git a/pkg/erasure/gf_6vect_mad_avx.asm b/pkg/erasure/gf_6vect_mad_avx.asm deleted file mode 100644 index 014744500..000000000 --- a/pkg/erasure/gf_6vect_mad_avx.asm +++ /dev/null @@ -1,427 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_6vect_mad_avx(len, vec, vec_i, mul_array, src, dest); -;;; - -%define PS 8 - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 - %define arg5 r15 - %define tmp r11 - %define tmp2 r10 - %define tmp3 r13 - %define tmp4 r14 - %define tmp5 rdi - %define return rax - %define return.w eax - %define stack_size 16*10 + 5*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - -%macro FUNC_SAVE 0 - sub rsp, stack_size - movdqa [rsp+16*0],xmm6 - movdqa [rsp+16*1],xmm7 - movdqa [rsp+16*2],xmm8 - movdqa [rsp+16*3],xmm9 - movdqa [rsp+16*4],xmm10 - movdqa [rsp+16*5],xmm11 - movdqa [rsp+16*6],xmm12 - movdqa [rsp+16*7],xmm13 - movdqa [rsp+16*8],xmm14 - movdqa [rsp+16*9],xmm15 - save_reg r12, 10*16 + 0*8 - save_reg r13, 10*16 + 1*8 - save_reg r14, 10*16 + 2*8 - save_reg r15, 10*16 + 3*8 - save_reg rdi, 10*16 + 4*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) -%endmacro - -%macro FUNC_RESTORE 0 - movdqa xmm6, [rsp+16*0] - movdqa xmm7, [rsp+16*1] - movdqa xmm8, [rsp+16*2] - movdqa xmm9, [rsp+16*3] - movdqa xmm10, [rsp+16*4] - movdqa xmm11, [rsp+16*5] - movdqa xmm12, [rsp+16*6] - movdqa xmm13, [rsp+16*7] - movdqa xmm14, [rsp+16*8] - movdqa xmm15, [rsp+16*9] - mov r12, [rsp + 10*16 + 0*8] - mov r13, [rsp + 10*16 + 1*8] - mov r14, [rsp + 10*16 + 2*8] - mov r15, [rsp + 10*16 + 3*8] - mov rdi, [rsp + 10*16 + 4*8] - add rsp, stack_size -%endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp2 r10 - %define tmp3 r12 - %define tmp4 r13 - %define tmp5 r14 - %define return rax - %define return.w eax - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - %endmacro - %macro FUNC_RESTORE 0 - pop r14 - pop r13 - pop r12 - %endmacro -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp2 r10 - %define tmp3 r12 - %define tmp4 r13 - %define tmp5 r14 - %define return rax - %define return.w eax - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - %endmacro - %macro FUNC_RESTORE 0 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -;;; gf_6vect_mad_avx(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest1 arg5 -%define pos return -%define pos.w return.w - -%define dest2 tmp4 -%define dest3 tmp2 -%define dest4 mul_array -%define dest5 tmp5 -%define dest6 vec_i - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - - -default rel - -[bits 64] -section .text - -%define xmask0f xmm15 -%define xgft4_lo xmm14 -%define xgft4_hi xmm13 -%define xgft5_lo xmm12 -%define xgft5_hi xmm11 -%define xgft6_lo xmm10 -%define xgft6_hi xmm9 - -%define x0 xmm0 -%define xtmpa xmm1 -%define xtmph1 xmm2 -%define xtmpl1 xmm3 -%define xtmph2 xmm4 -%define xtmpl2 xmm5 -%define xtmph3 xmm6 -%define xtmpl3 xmm7 -%define xd1 xmm8 -%define xd2 xtmpl1 -%define xd3 xtmph1 - - -align 16 -global gf_6vect_mad_avx:function -func(gf_6vect_mad_avx) - FUNC_SAVE - sub len, 16 - jl .return_fail - xor pos, pos - vmovdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - mov tmp, vec - sal vec_i, 5 ;Multiply by 32 - lea tmp3, [mul_array + vec_i] - sal tmp, 6 ;Multiply by 64 - - sal vec, 5 ;Multiply by 32 - lea vec_i, [tmp + vec] ;vec_i = vec*96 - lea mul_array, [tmp + vec_i] ;mul_array = vec*160 - - vmovdqu xgft5_lo, [tmp3+2*tmp] ;Load array Ex{00}, Ex{01}, ..., Ex{0f} - vmovdqu xgft5_hi, [tmp3+2*tmp+16] ; " Ex{00}, Ex{10}, ..., Ex{f0} - vmovdqu xgft4_lo, [tmp3+vec_i] ;Load array Dx{00}, Dx{01}, Dx{02}, ... - vmovdqu xgft4_hi, [tmp3+vec_i+16] ; " Dx{00}, Dx{10}, Dx{20}, ... , Dx{f0} - vmovdqu xgft6_lo, [tmp3+mul_array] ;Load array Fx{00}, Fx{01}, ..., Fx{0f} - vmovdqu xgft6_hi, [tmp3+mul_array+16] ; " Fx{00}, Fx{10}, ..., Fx{f0} - - mov dest2, [dest1+PS] - mov dest3, [dest1+2*PS] - mov dest4, [dest1+3*PS] ; reuse mul_array - mov dest5, [dest1+4*PS] - mov dest6, [dest1+5*PS] ; reuse vec_i - mov dest1, [dest1] - -.loop16: - XLDR x0, [src+pos] ;Get next source vector - - vmovdqu xtmpl1, [tmp3] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - vmovdqu xtmph1, [tmp3+16] ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - vmovdqu xtmpl2, [tmp3+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - vmovdqu xtmph2, [tmp3+vec+16] ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - vmovdqu xtmpl3, [tmp3+2*vec] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - vmovdqu xtmph3, [tmp3+2*vec+16] ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - XLDR xd1, [dest1+pos] ;Get next dest vector - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - - ;dest1 - vpshufb xtmph1, x0 ;Lookup mul table of high nibble - vpshufb xtmpl1, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmpl1 ;GF add high and low partials - vpxor xd1, xtmph1 - - XLDR xd2, [dest2+pos] ;reuse xtmpl1. Get next dest vector - XLDR xd3, [dest3+pos] ;reuse xtmph1. Get next dest vector - - ;dest2 - vpshufb xtmph2, x0 ;Lookup mul table of high nibble - vpshufb xtmpl2, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmpl2 ;GF add high and low partials - vpxor xd2, xtmph2 - - ;dest3 - vpshufb xtmph3, x0 ;Lookup mul table of high nibble - vpshufb xtmpl3, xtmpa ;Lookup mul table of low nibble - vpxor xtmph3, xtmpl3 ;GF add high and low partials - vpxor xd3, xtmph3 - - XSTR [dest1+pos], xd1 ;Store result into dest1 - XSTR [dest2+pos], xd2 ;Store result into dest2 - XSTR [dest3+pos], xd3 ;Store result into dest3 - - ;dest4 - XLDR xd1, [dest4+pos] ;Get next dest vector - vpshufb xtmph1, xgft4_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl1, xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph1, xtmph1, xtmpl1 ;GF add high and low partials - vpxor xd1, xd1, xtmph1 - - XLDR xd2, [dest5+pos] ;reuse xtmpl1. Get next dest vector - XLDR xd3, [dest6+pos] ;reuse xtmph1. Get next dest vector - - ;dest5 - vpshufb xtmph2, xgft5_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl2, xgft5_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph2, xtmph2, xtmpl2 ;GF add high and low partials - vpxor xd2, xd2, xtmph2 - - ;dest6 - vpshufb xtmph3, xgft6_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl3, xgft6_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph3, xtmph3, xtmpl3 ;GF add high and low partials - vpxor xd3, xd3, xtmph3 - - XSTR [dest4+pos], xd1 ;Store result into dest4 - XSTR [dest5+pos], xd2 ;Store result into dest5 - XSTR [dest6+pos], xd3 ;Store result into dest6 - - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - -.lessthan16: - ;; Tail len - ;; Do one more overlap pass - ;; Overlapped offset length-16 - mov tmp, len ;Backup len as len=rdi - - XLDR x0, [src+tmp] ;Get next source vector - XLDR xd1, [dest4+tmp] ;Get next dest vector - XLDR xd2, [dest5+tmp] ;reuse xtmpl1. Get next dest vector - XLDR xd3, [dest6+tmp] ;reuse xtmph1. Get next dest vector - - sub len, pos - - vmovdqa xtmph3, [constip16] ;Load const of i + 16 - vpinsrb xtmpl3, len.w, 15 - vpshufb xtmpl3, xmask0f ;Broadcast len to all bytes - vpcmpgtb xtmpl3, xtmpl3, xtmph3 - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - ;dest4 - vpshufb xgft4_hi, xgft4_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft4_lo, xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft4_hi, xgft4_hi, xgft4_lo ;GF add high and low partials - vpand xgft4_hi, xgft4_hi, xtmpl3 - vpxor xd1, xd1, xgft4_hi - - ;dest5 - vpshufb xgft5_hi, xgft5_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft5_lo, xgft5_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft5_hi, xgft5_hi, xgft5_lo ;GF add high and low partials - vpand xgft5_hi, xgft5_hi, xtmpl3 - vpxor xd2, xd2, xgft5_hi - - ;dest6 - vpshufb xgft6_hi, xgft6_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft6_lo, xgft6_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft6_hi, xgft6_hi, xgft6_lo ;GF add high and low partials - vpand xgft6_hi, xgft6_hi, xtmpl3 - vpxor xd3, xd3, xgft6_hi - - XSTR [dest4+tmp], xd1 ;Store result into dest4 - XSTR [dest5+tmp], xd2 ;Store result into dest5 - XSTR [dest6+tmp], xd3 ;Store result into dest6 - - vmovdqu xgft4_lo, [tmp3] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - vmovdqu xgft4_hi, [tmp3+16] ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - vmovdqu xgft5_lo, [tmp3+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - vmovdqu xgft5_hi, [tmp3+vec+16] ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - vmovdqu xgft6_lo, [tmp3+2*vec] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - vmovdqu xgft6_hi, [tmp3+2*vec+16] ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - XLDR xd1, [dest1+tmp] ;Get next dest vector - XLDR xd2, [dest2+tmp] ;reuse xtmpl1. Get next dest vector - XLDR xd3, [dest3+tmp] ;reuse xtmph1. Get next dest3 vector - - ;dest1 - vpshufb xgft4_hi, xgft4_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft4_lo, xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft4_hi, xgft4_hi, xgft4_lo ;GF add high and low partials - vpand xgft4_hi, xgft4_hi, xtmpl3 - vpxor xd1, xd1, xgft4_hi - - ;dest2 - vpshufb xgft5_hi, xgft5_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft5_lo, xgft5_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft5_hi, xgft5_hi, xgft5_lo ;GF add high and low partials - vpand xgft5_hi, xgft5_hi, xtmpl3 - vpxor xd2, xd2, xgft5_hi - - ;dest3 - vpshufb xgft6_hi, xgft6_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft6_lo, xgft6_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft6_hi, xgft6_hi, xgft6_lo ;GF add high and low partials - vpand xgft6_hi, xgft6_hi, xtmpl3 - vpxor xd3, xd3, xgft6_hi - - XSTR [dest1+tmp], xd1 ;Store result into dest1 - XSTR [dest2+tmp], xd2 ;Store result into dest2 - XSTR [dest3+tmp], xd3 ;Store result into dest3 - -.return_pass: - FUNC_RESTORE - mov return, 0 - ret - -.return_fail: - FUNC_RESTORE - mov return, 1 - ret - -endproc_frame - -section .data - -align 16 -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f -constip16: - ddq 0xf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_6vect_mad_avx, 02, 00, 0210 diff --git a/pkg/erasure/gf_6vect_mad_avx2.asm b/pkg/erasure/gf_6vect_mad_avx2.asm deleted file mode 100644 index 1dbd0c63f..000000000 --- a/pkg/erasure/gf_6vect_mad_avx2.asm +++ /dev/null @@ -1,429 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_6vect_mad_avx2(len, vec, vec_i, mul_array, src, dest); -;;; - -%define PS 8 - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 - %define arg5 r15 - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r13 - %define return rax - %define return.w eax - %define stack_size 16*10 + 3*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - -%macro FUNC_SAVE 0 - sub rsp, stack_size - movdqa [rsp+16*0],xmm6 - movdqa [rsp+16*1],xmm7 - movdqa [rsp+16*2],xmm8 - movdqa [rsp+16*3],xmm9 - movdqa [rsp+16*4],xmm10 - movdqa [rsp+16*5],xmm11 - movdqa [rsp+16*6],xmm12 - movdqa [rsp+16*7],xmm13 - movdqa [rsp+16*8],xmm14 - movdqa [rsp+16*9],xmm15 - save_reg r12, 10*16 + 0*8 - save_reg r13, 10*16 + 1*8 - save_reg r15, 10*16 + 2*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) -%endmacro - -%macro FUNC_RESTORE 0 - movdqa xmm6, [rsp+16*0] - movdqa xmm7, [rsp+16*1] - movdqa xmm8, [rsp+16*2] - movdqa xmm9, [rsp+16*3] - movdqa xmm10, [rsp+16*4] - movdqa xmm11, [rsp+16*5] - movdqa xmm12, [rsp+16*6] - movdqa xmm13, [rsp+16*7] - movdqa xmm14, [rsp+16*8] - movdqa xmm15, [rsp+16*9] - mov r12, [rsp + 10*16 + 0*8] - mov r13, [rsp + 10*16 + 1*8] - mov r15, [rsp + 10*16 + 3*8] - add rsp, stack_size -%endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r12 - %define return rax - %define return.w eax - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - %endmacro - %macro FUNC_RESTORE 0 - pop r12 - %endmacro -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r12 - %define return rax - %define return.w eax - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - %endmacro - %macro FUNC_RESTORE 0 - pop r12 - %endmacro -%endif - -;;; gf_6vect_mad_avx2(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest1 arg5 -%define pos return -%define pos.w return.w - -%define dest2 tmp3 -%define dest3 tmp2 -%define dest4 mul_array -%define dest5 vec -%define dest6 vec_i - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - - -default rel - -[bits 64] -section .text - -%define xmask0f ymm15 -%define xmask0fx xmm15 -%define xgft1_lo ymm14 -%define xgft2_lo ymm13 -%define xgft3_lo ymm12 -%define xgft4_lo ymm11 -%define xgft5_lo ymm10 -%define xgft6_lo ymm9 - -%define x0 ymm0 -%define xtmpa ymm1 -%define xtmpl ymm2 -%define xtmplx xmm2 -%define xtmph ymm3 -%define xtmphx xmm3 -%define xd1 ymm4 -%define xd2 ymm5 -%define xd3 ymm6 -%define xd4 ymm7 -%define xd5 ymm8 -%define xd6 xd1 - -align 16 -global gf_6vect_mad_avx2:function -func(gf_6vect_mad_avx2) - FUNC_SAVE - sub len, 32 - jl .return_fail - xor pos, pos - mov tmp.b, 0x0f - vpinsrb xmask0fx, xmask0fx, tmp.w, 0 - vpbroadcastb xmask0f, xmask0fx ;Construct mask 0x0f0f0f... - - sal vec_i, 5 ;Multiply by 32 - sal vec, 5 ;Multiply by 32 - lea tmp, [mul_array + vec_i] - mov vec_i, vec - mov mul_array, vec - sal vec_i, 1 - sal mul_array, 1 - add vec_i, vec ;vec_i=vec*96 - add mul_array, vec_i ;vec_i=vec*160 - - vmovdqu xgft1_lo, [tmp] ;Load array Ax{00}, Ax{01}, ..., Ax{0f} - ; " Ax{00}, Ax{10}, ..., Ax{f0} - vmovdqu xgft2_lo, [tmp+vec] ;Load array Bx{00}, Bx{01}, ..., Bx{0f} - ; " Bx{00}, Bx{10}, ..., Bx{f0} - vmovdqu xgft3_lo, [tmp+2*vec] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - ; " Cx{00}, Cx{10}, ..., Cx{f0} - vmovdqu xgft4_lo, [tmp+vec_i] ;Load array Fx{00}, Fx{01}, ..., Fx{0f} - ; " Fx{00}, Fx{10}, ..., Fx{f0} - vmovdqu xgft5_lo, [tmp+4*vec] ;Load array Ex{00}, Ex{01}, ..., Ex{0f} - ; " Ex{00}, Ex{10}, ..., Ex{f0} - vmovdqu xgft6_lo, [tmp+mul_array] ;Load array Dx{00}, Dx{01}, ..., Dx{0f} - ; " Dx{00}, Dx{10}, ..., Dx{f0} - - mov dest2, [dest1+PS] ; reuse tmp3 - mov dest3, [dest1+2*PS] ; reuse tmp2 - mov dest4, [dest1+3*PS] ; reuse mul_array - mov dest5, [dest1+4*PS] ; reuse vec - mov dest6, [dest1+5*PS] ; reuse vec_i - mov dest1, [dest1] - -.loop32: - XLDR x0, [src+pos] ;Get next source vector - XLDR xd1, [dest1+pos] ;Get next dest vector - XLDR xd2, [dest2+pos] ;Get next dest vector - XLDR xd3, [dest3+pos] ;Get next dest vector - XLDR xd4, [dest4+pos] ;Get next dest vector - XLDR xd5, [dest5+pos] ;Get next dest vector - - vpand xtmpl, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - vperm2i128 xtmpa, xtmpl, x0, 0x30 ;swap xtmpa from 1lo|2lo to 1lo|2hi - vperm2i128 x0, xtmpl, x0, 0x12 ;swap x0 from 1hi|2hi to 1hi|2lo - - ;dest1 - vperm2i128 xtmph, xgft1_lo, xgft1_lo, 0x01 ; swapped to hi | lo - vpshufb xtmph, xtmph, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph, xtmph, xtmpl ;GF add high and low partials - vpxor xd1, xd1, xtmph ;xd1 += partial - - XSTR [dest1+pos], xd1 ;Store result into dest1 - - ;dest2 - vperm2i128 xtmph, xgft2_lo, xgft2_lo, 0x01 ; swapped to hi | lo - vpshufb xtmph, xtmph, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph, xtmph, xtmpl ;GF add high and low partials - vpxor xd2, xd2, xtmph ;xd2 += partial - - ;dest3 - vperm2i128 xtmph, xgft3_lo, xgft3_lo, 0x01 ; swapped to hi | lo - vpshufb xtmph, xtmph, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph, xtmph, xtmpl ;GF add high and low partials - vpxor xd3, xd3, xtmph ;xd3 += partial - - XLDR xd6, [dest6+pos] ;reuse xd1. Get next dest vector - - ;dest4 - vperm2i128 xtmph, xgft4_lo, xgft4_lo, 0x01 ; swapped to hi | lo - vpshufb xtmph, xtmph, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph, xtmph, xtmpl ;GF add high and low partials - vpxor xd4, xd4, xtmph ;xd4 += partial - - ;dest5 - vperm2i128 xtmph, xgft5_lo, xgft5_lo, 0x01 ; swapped to hi | lo - vpshufb xtmph, xtmph, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft5_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph, xtmph, xtmpl ;GF add high and low partials - vpxor xd5, xd5, xtmph ;xd5 += partial - - ;dest6 - vperm2i128 xtmph, xgft6_lo, xgft6_lo, 0x01 ; swapped to hi | lo - vpshufb xtmph, xtmph, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft6_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph, xtmph, xtmpl ;GF add high and low partials - vpxor xd6, xd6, xtmph ;xd6 += partial - - XSTR [dest2+pos], xd2 ;Store result into dest2 - XSTR [dest3+pos], xd3 ;Store result into dest3 - XSTR [dest4+pos], xd4 ;Store result into dest4 - XSTR [dest5+pos], xd5 ;Store result into dest5 - XSTR [dest6+pos], xd6 ;Store result into dest6 - - add pos, 32 ;Loop on 32 bytes at a time - cmp pos, len - jle .loop32 - - lea tmp, [len + 32] - cmp pos, tmp - je .return_pass - -.lessthan32: - ;; Tail len - ;; Do one more overlap pass - mov tmp.b, 0x1f - vpinsrb xtmphx, xtmphx, tmp.w, 0 - vpbroadcastb xtmph, xtmphx ;Construct mask 0x1f1f1f... - - mov tmp, len ;Overlapped offset length-32 - - XLDR x0, [src+tmp] ;Get next source vector - XLDR xd1, [dest1+tmp] ;Get next dest vector - XLDR xd2, [dest2+tmp] ;Get next dest vector - XLDR xd3, [dest3+tmp] ;Get next dest vector - XLDR xd4, [dest4+tmp] ;Get next dest vector - XLDR xd5, [dest5+tmp] ;Get next dest vector - - sub len, pos - - vpinsrb xtmplx, xtmplx, len.w, 15 - vinserti128 xtmpl, xtmpl, xtmplx, 1 ;swapped to xtmplx | xtmplx - vpshufb xtmpl, xtmpl, xtmph ;Broadcast len to all bytes. xtmph=0x1f1f1f... - vpcmpgtb xtmpl, xtmpl, [constip32] - - vpand xtmph, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - vperm2i128 xtmpa, xtmph, x0, 0x30 ;swap xtmpa from 1lo|2lo to 1lo|2hi - vperm2i128 x0, xtmph, x0, 0x12 ;swap x0 from 1hi|2hi to 1hi|2lo - - ;dest1 - vperm2i128 xtmph, xgft1_lo, xgft1_lo, 0x01 ; swapped to hi | lo - vpshufb xtmph, xtmph, x0 ;Lookup mul table of high nibble - vpshufb xgft1_lo, xgft1_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph, xtmph, xgft1_lo ;GF add high and low partials - vpand xtmph, xtmph, xtmpl - vpxor xd1, xd1, xtmph ;xd1 += partial - - XSTR [dest1+tmp], xd1 ;Store result into dest1 - - ;dest2 - vperm2i128 xtmph, xgft2_lo, xgft2_lo, 0x01 ; swapped to hi | lo - vpshufb xtmph, xtmph, x0 ;Lookup mul table of high nibble - vpshufb xgft2_lo, xgft2_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph, xtmph, xgft2_lo ;GF add high and low partials - vpand xtmph, xtmph, xtmpl - vpxor xd2, xd2, xtmph ;xd2 += partial - - ;dest3 - vperm2i128 xtmph, xgft3_lo, xgft3_lo, 0x01 ; swapped to hi | lo - vpshufb xtmph, xtmph, x0 ;Lookup mul table of high nibble - vpshufb xgft3_lo, xgft3_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph, xtmph, xgft3_lo ;GF add high and low partials - vpand xtmph, xtmph, xtmpl - vpxor xd3, xd3, xtmph ;xd3 += partial - - XLDR xd6, [dest6+tmp] ;reuse xd1. Get next dest vector - - ;dest4 - vperm2i128 xtmph, xgft4_lo, xgft4_lo, 0x01 ; swapped to hi | lo - vpshufb xtmph, xtmph, x0 ;Lookup mul table of high nibble - vpshufb xgft4_lo, xgft4_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph, xtmph, xgft4_lo ;GF add high and low partials - vpand xtmph, xtmph, xtmpl - vpxor xd4, xd4, xtmph ;xd4 += partial - - ;dest5 - vperm2i128 xtmph, xgft5_lo, xgft5_lo, 0x01 ; swapped to hi | lo - vpshufb xtmph, xtmph, x0 ;Lookup mul table of high nibble - vpshufb xgft5_lo, xgft5_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph, xtmph, xgft5_lo ;GF add high and low partials - vpand xtmph, xtmph, xtmpl - vpxor xd5, xd5, xtmph ;xd5 += partial - - ;dest6 - vperm2i128 xtmph, xgft6_lo, xgft6_lo, 0x01 ; swapped to hi | lo - vpshufb xtmph, xtmph, x0 ;Lookup mul table of high nibble - vpshufb xgft6_lo, xgft6_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph, xtmph, xgft6_lo ;GF add high and low partials - vpand xtmph, xtmph, xtmpl - vpxor xd6, xd6, xtmph ;xd6 += partial - - XSTR [dest2+tmp], xd2 ;Store result into dest2 - XSTR [dest3+tmp], xd3 ;Store result into dest3 - XSTR [dest4+tmp], xd4 ;Store result into dest4 - XSTR [dest5+tmp], xd5 ;Store result into dest5 - XSTR [dest6+tmp], xd6 ;Store result into dest6 - -.return_pass: - FUNC_RESTORE - mov return, 0 - ret - -.return_fail: - FUNC_RESTORE - mov return, 1 - ret - -endproc_frame - -section .data -align 32 -constip32: - ddq 0xf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff - ddq 0xe0e1e2e3e4e5e6e7e8e9eaebecedeeef - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_6vect_mad_avx2, 04, 00, 0211 diff --git a/pkg/erasure/gf_6vect_mad_sse.asm b/pkg/erasure/gf_6vect_mad_sse.asm deleted file mode 100644 index 4829c8c2f..000000000 --- a/pkg/erasure/gf_6vect_mad_sse.asm +++ /dev/null @@ -1,440 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_6vect_mad_sse(len, vec, vec_i, mul_array, src, dest); -;;; - -%define PS 8 - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 - %define arg5 r15 - %define tmp r11 - %define tmp.w r11d - %define tmp2 r10 - %define tmp3 r13 - %define tmp4 r14 - %define tmp5 rdi - %define return rax - %define return.w eax - %define stack_size 16*10 + 5*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - -%macro FUNC_SAVE 0 - sub rsp, stack_size - movdqa [rsp+16*0],xmm6 - movdqa [rsp+16*1],xmm7 - movdqa [rsp+16*2],xmm8 - movdqa [rsp+16*3],xmm9 - movdqa [rsp+16*4],xmm10 - movdqa [rsp+16*5],xmm11 - movdqa [rsp+16*6],xmm12 - movdqa [rsp+16*7],xmm13 - movdqa [rsp+16*8],xmm14 - movdqa [rsp+16*9],xmm15 - save_reg r12, 10*16 + 0*8 - save_reg r13, 10*16 + 1*8 - save_reg r14, 10*16 + 2*8 - save_reg r15, 10*16 + 3*8 - save_reg rdi, 10*16 + 4*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) -%endmacro - -%macro FUNC_RESTORE 0 - movdqa xmm6, [rsp+16*0] - movdqa xmm7, [rsp+16*1] - movdqa xmm8, [rsp+16*2] - movdqa xmm9, [rsp+16*3] - movdqa xmm10, [rsp+16*4] - movdqa xmm11, [rsp+16*5] - movdqa xmm12, [rsp+16*6] - movdqa xmm13, [rsp+16*7] - movdqa xmm14, [rsp+16*8] - movdqa xmm15, [rsp+16*9] - mov r12, [rsp + 10*16 + 0*8] - mov r13, [rsp + 10*16 + 1*8] - mov r14, [rsp + 10*16 + 2*8] - mov r15, [rsp + 10*16 + 3*8] - mov rdi, [rsp + 10*16 + 4*8] - add rsp, stack_size -%endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp.w r11d - %define tmp2 r10 - %define tmp3 r12 - %define tmp4 r13 - %define tmp5 r14 - %define return rax - %define return.w eax - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - %endmacro - %macro FUNC_RESTORE 0 - pop r14 - pop r13 - pop r12 - %endmacro -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define tmp.w r11d - %define tmp2 r10 - %define tmp3 r12 - %define tmp4 r13 - %define tmp5 r14 - %define return rax - %define return.w eax - - %define func(x) x: - %macro FUNC_SAVE 0 - push r12 - push r13 - push r14 - %endmacro - %macro FUNC_RESTORE 0 - pop r14 - pop r13 - pop r12 - %endmacro -%endif - -;;; gf_6vect_mad_sse(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest1 arg5 -%define pos return -%define pos.w return.w - -%define dest2 mul_array -%define dest3 tmp2 -%define dest4 tmp4 -%define dest5 tmp5 -%define dest6 vec_i - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR movdqu - %define XSTR movdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR movdqa - %define XSTR movdqa - %else - %define XLDR movntdqa - %define XSTR movntdq - %endif -%endif - -default rel - -[bits 64] -section .text - -%define xmask0f xmm15 -%define xgft4_lo xmm14 -%define xgft4_hi xmm13 -%define xgft5_lo xmm12 -%define xgft5_hi xmm11 -%define xgft6_lo xmm10 -%define xgft6_hi xmm9 - -%define x0 xmm0 -%define xtmpa xmm1 -%define xtmph1 xmm2 -%define xtmpl1 xmm3 -%define xtmph2 xmm4 -%define xtmpl2 xmm5 -%define xtmph3 xmm6 -%define xtmpl3 xmm7 -%define xd1 xmm8 -%define xd2 xtmpl1 -%define xd3 xtmph1 - - -align 16 -global gf_6vect_mad_sse:function -func(gf_6vect_mad_sse) - FUNC_SAVE - sub len, 16 - jl .return_fail - - xor pos, pos - movdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - - mov tmp, vec - sal vec_i, 5 ;Multiply by 32 - lea tmp3, [mul_array + vec_i] - sal tmp, 6 ;Multiply by 64 - - sal vec, 5 ;Multiply by 32 - lea vec_i, [tmp + vec] ;vec_i = 96 - lea mul_array, [tmp + vec_i] ;mul_array = 160 - - movdqu xgft5_lo, [tmp3+2*tmp] ;Load array Ex{00}, Ex{01}, ..., Ex{0f} - movdqu xgft5_hi, [tmp3+2*tmp+16] ; " Ex{00}, Ex{10}, ..., Ex{f0} - movdqu xgft4_lo, [tmp3+vec_i] ;Load array Dx{00}, Dx{01}, Dx{02}, ... - movdqu xgft4_hi, [tmp3+vec_i+16] ; " Dx{00}, Dx{10}, Dx{20}, ... , Dx{f0} - movdqu xgft6_lo, [tmp3+mul_array] ;Load array Fx{00}, Fx{01}, ..., Fx{0f} - movdqu xgft6_hi, [tmp3+mul_array+16] ; " Fx{00}, Fx{10}, ..., Fx{f0} - - mov dest2, [dest1+PS] - mov dest3, [dest1+2*PS] - mov dest4, [dest1+3*PS] ; reuse mul_array - mov dest5, [dest1+4*PS] - mov dest6, [dest1+5*PS] ; reuse vec_i - mov dest1, [dest1] - -.loop16: - XLDR x0, [src+pos] ;Get next source vector - - movdqu xtmpl1, [tmp3] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - movdqu xtmph1, [tmp3+16] ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - movdqu xtmpl2, [tmp3+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - movdqu xtmph2, [tmp3+vec+16] ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - movdqu xtmpl3, [tmp3+2*vec] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - movdqu xtmph3, [tmp3+2*vec+16] ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - XLDR xd1, [dest1+pos] ;Get next dest vector - - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - - ;dest1 - pshufb xtmph1, x0 ;Lookup mul table of high nibble - pshufb xtmpl1, xtmpa ;Lookup mul table of low nibble - pxor xtmph1, xtmpl1 ;GF add high and low partials - pxor xd1, xtmph1 - - XLDR xd2, [dest2+pos] ;reuse xtmpl1. Get next dest vector - XLDR xd3, [dest3+pos] ;reuse xtmph1. Get next dest3 vector - - ;dest2 - pshufb xtmph2, x0 ;Lookup mul table of high nibble - pshufb xtmpl2, xtmpa ;Lookup mul table of low nibble - pxor xtmph2, xtmpl2 ;GF add high and low partials - pxor xd2, xtmph2 - - ;dest3 - pshufb xtmph3, x0 ;Lookup mul table of high nibble - pshufb xtmpl3, xtmpa ;Lookup mul table of low nibble - pxor xtmph3, xtmpl3 ;GF add high and low partials - pxor xd3, xtmph3 - - XSTR [dest1+pos], xd1 ;Store result into dest1 - XSTR [dest2+pos], xd2 ;Store result into dest2 - XSTR [dest3+pos], xd3 ;Store result into dest3 - - movdqa xtmph1, xgft4_hi ;Reload const array registers - movdqa xtmpl1, xgft4_lo ;Reload const array registers - movdqa xtmph2, xgft5_hi ;Reload const array registers - movdqa xtmpl2, xgft5_lo ;Reload const array registers - movdqa xtmph3, xgft6_hi ;Reload const array registers - movdqa xtmpl3, xgft6_lo ;Reload const array registers - - ;dest4 - XLDR xd1, [dest4+pos] ;Get next dest vector - pshufb xtmph1, x0 ;Lookup mul table of high nibble - pshufb xtmpl1, xtmpa ;Lookup mul table of low nibble - pxor xtmph1, xtmpl1 ;GF add high and low partials - pxor xd1, xtmph1 - - XLDR xd2, [dest5+pos] ;reuse xtmpl1. Get next dest vector - XLDR xd3, [dest6+pos] ;reuse xtmph1. Get next dest vector - - ;dest5 - pshufb xtmph2, x0 ;Lookup mul table of high nibble - pshufb xtmpl2, xtmpa ;Lookup mul table of low nibble - pxor xtmph2, xtmpl2 ;GF add high and low partials - pxor xd2, xtmph2 - - ;dest6 - pshufb xtmph3, x0 ;Lookup mul table of high nibble - pshufb xtmpl3, xtmpa ;Lookup mul table of low nibble - pxor xtmph3, xtmpl3 ;GF add high and low partials - pxor xd3, xtmph3 - - XSTR [dest4+pos], xd1 ;Store result into dest4 - XSTR [dest5+pos], xd2 ;Store result into dest5 - XSTR [dest6+pos], xd3 ;Store result into dest6 - - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - -.lessthan16: - ;; Tail len - ;; Do one more overlap pass - ;; Overlapped offset length-16 - mov tmp, len ;Backup len as len=rdi - - XLDR x0, [src+tmp] ;Get next source vector - XLDR xd1, [dest4+tmp] ;Get next dest vector - XLDR xd2, [dest5+tmp] ;reuse xtmpl1. Get next dest vector - XLDR xd3, [dest6+tmp] ;reuse xtmph1. Get next dest vector - - sub len, pos - - movdqa xtmph3, [constip16] ;Load const of i + 16 - pinsrb xtmpl3, len.w, 15 - pshufb xtmpl3, xmask0f ;Broadcast len to all bytes - pcmpgtb xtmpl3, xtmph3 - - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - - ;dest4 - pshufb xgft4_hi, x0 ;Lookup mul table of high nibble - pshufb xgft4_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft4_hi, xgft4_lo ;GF add high and low partials - pand xgft4_hi, xtmpl3 - pxor xd1, xgft4_hi - - ;dest5 - pshufb xgft5_hi, x0 ;Lookup mul table of high nibble - pshufb xgft5_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft5_hi, xgft5_lo ;GF add high and low partials - pand xgft5_hi, xtmpl3 - pxor xd2, xgft5_hi - - ;dest6 - pshufb xgft6_hi, x0 ;Lookup mul table of high nibble - pshufb xgft6_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft6_hi, xgft6_lo ;GF add high and low partials - pand xgft6_hi, xtmpl3 - pxor xd3, xgft6_hi - - XSTR [dest4+tmp], xd1 ;Store result into dest4 - XSTR [dest5+tmp], xd2 ;Store result into dest5 - XSTR [dest6+tmp], xd3 ;Store result into dest6 - - movdqu xgft4_lo, [tmp3] ;Load array Ax{00}, Ax{01}, Ax{02}, ... - movdqu xgft4_hi, [tmp3+16] ; " Ax{00}, Ax{10}, Ax{20}, ... , Ax{f0} - movdqu xgft5_lo, [tmp3+vec] ;Load array Bx{00}, Bx{01}, Bx{02}, ... - movdqu xgft5_hi, [tmp3+vec+16] ; " Bx{00}, Bx{10}, Bx{20}, ... , Bx{f0} - movdqu xgft6_lo, [tmp3+2*vec] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - movdqu xgft6_hi, [tmp3+2*vec+16] ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - XLDR xd1, [dest1+tmp] ;Get next dest vector - XLDR xd2, [dest2+tmp] ;reuse xtmpl1. Get next dest vector - XLDR xd3, [dest3+tmp] ;reuse xtmph1. Get next dest3 vector - - ;dest1 - pshufb xgft4_hi, x0 ;Lookup mul table of high nibble - pshufb xgft4_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft4_hi, xgft4_lo ;GF add high and low partials - pand xgft4_hi, xtmpl3 - pxor xd1, xgft4_hi - - ;dest2 - pshufb xgft5_hi, x0 ;Lookup mul table of high nibble - pshufb xgft5_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft5_hi, xgft5_lo ;GF add high and low partials - pand xgft5_hi, xtmpl3 - pxor xd2, xgft5_hi - - ;dest3 - pshufb xgft6_hi, x0 ;Lookup mul table of high nibble - pshufb xgft6_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft6_hi, xgft6_lo ;GF add high and low partials - pand xgft6_hi, xtmpl3 - pxor xd3, xgft6_hi - - XSTR [dest1+tmp], xd1 ;Store result into dest1 - XSTR [dest2+tmp], xd2 ;Store result into dest2 - XSTR [dest3+tmp], xd3 ;Store result into dest3 - -.return_pass: - FUNC_RESTORE - mov return, 0 - ret - -.return_fail: - FUNC_RESTORE - mov return, 1 - ret - -endproc_frame - -section .data - -align 16 - -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f -constip16: - ddq 0xf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_6vect_mad_sse, 00, 00, 020f diff --git a/pkg/erasure/gf_vect_dot_prod_avx.asm b/pkg/erasure/gf_vect_dot_prod_avx.asm deleted file mode 100644 index 129073693..000000000 --- a/pkg/erasure/gf_vect_dot_prod_avx.asm +++ /dev/null @@ -1,297 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_vect_dot_prod_avx(len, vec, *g_tbls, **buffs, *dest); -;;; - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r9 - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r9 - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved and loaded - %define tmp r11 - %define tmp2 r10 - %define tmp3 rdi ; must be saved and loaded - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define frame_size 2*8 - %define arg(x) [rsp + frame_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - rex_push_reg r12 - push_reg rdi - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - pop rdi - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, elf32 - -;;;================== High Address; -;;; arg4 -;;; arg3 -;;; arg2 -;;; arg1 -;;; arg0 -;;; return -;;;<================= esp of caller -;;; ebp -;;;<================= ebp = esp -;;; esi -;;; edi -;;; ebx -;;;<================= esp of callee -;;; -;;;================== Low Address; - - %define PS 4 - %define LOG_PS 2 - %define func(x) x: - %define arg(x) [ebp + PS*2 + PS*x] - - %define trans ecx ;trans is for the variables in stack - %define arg0 trans - %define arg0_m arg(0) - %define arg1 trans - %define arg1_m arg(1) - %define arg2 arg2_m - %define arg2_m arg(2) - %define arg3 ebx - %define arg4 trans - %define arg4_m arg(4) - %define tmp edx - %define tmp2 edi - %define tmp3 esi - %define return eax - %macro SLDR 2 ;; stack load/restore - mov %1, %2 - %endmacro - %define SSTR SLDR - - %macro FUNC_SAVE 0 - push ebp - mov ebp, esp - push esi - push edi - push ebx - mov arg3, arg(3) - %endmacro - - %macro FUNC_RESTORE 0 - pop ebx - pop edi - pop esi - mov esp, ebp - pop ebp - %endmacro - -%endif ; output formats - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest arg4 - -%define vec_i tmp2 -%define ptr tmp3 -%define pos return - - %ifidn PS,4 ;32-bit code - %define vec_m arg1_m - %define len_m arg0_m - %define dest_m arg4_m - %endif - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - -%ifidn PS,8 ; 64-bit code - default rel - [bits 64] -%endif - -section .text - -%define xmask0f xmm5 -%define xgft_lo xmm4 -%define xgft_hi xmm3 - -%define x0 xmm0 -%define xtmpa xmm1 -%define xp xmm2 - -align 16 -global gf_vect_dot_prod_avx:function -func(gf_vect_dot_prod_avx) - FUNC_SAVE - SLDR len, len_m - sub len, 16 - SSTR len_m, len - jl .return_fail - xor pos, pos - vmovdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - -.loop16: - vpxor xp, xp - mov tmp, mul_array - xor vec_i, vec_i - -.next_vect: - - mov ptr, [src+vec_i*PS] - vmovdqu xgft_lo, [tmp] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - vmovdqu xgft_hi, [tmp+16] ; " Cx{00}, Cx{10}, ..., Cx{f0} - XLDR x0, [ptr+pos] ;Get next source vector - - add tmp, 32 - add vec_i, 1 - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - vpshufb xgft_hi, xgft_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft_lo, xgft_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft_hi, xgft_hi, xgft_lo ;GF add high and low partials - vpxor xp, xp, xgft_hi ;xp += partial - - SLDR vec, vec_m - cmp vec_i, vec - jl .next_vect - - SLDR dest, dest_m - XSTR [dest+pos], xp - - add pos, 16 ;Loop on 16 bytes at a time - SLDR len, len_m - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - jmp .loop16 ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -align 16 - -mask0f: -ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_vect_dot_prod_avx, 02, 04, 0061 diff --git a/pkg/erasure/gf_vect_dot_prod_avx2.asm b/pkg/erasure/gf_vect_dot_prod_avx2.asm deleted file mode 100644 index ec11cc3ba..000000000 --- a/pkg/erasure/gf_vect_dot_prod_avx2.asm +++ /dev/null @@ -1,309 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_vect_dot_prod_avx2(len, vec, *g_tbls, **buffs, *dest); -;;; - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r9 - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 r9 - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved and loaded - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define tmp2 r10 - %define tmp3 rdi ; must be saved and loaded - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define frame_size 2*8 - %define arg(x) [rsp + frame_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - rex_push_reg r12 - push_reg rdi - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - pop rdi - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, elf32 - -;;;================== High Address; -;;; arg4 -;;; arg3 -;;; arg2 -;;; arg1 -;;; arg0 -;;; return -;;;<================= esp of caller -;;; ebp -;;;<================= ebp = esp -;;; esi -;;; edi -;;; ebx -;;;<================= esp of callee -;;; -;;;================== Low Address; - - %define PS 4 - %define LOG_PS 2 - %define func(x) x: - %define arg(x) [ebp + PS*2 + PS*x] - - %define trans ecx ;trans is for the variables in stack - %define arg0 trans - %define arg0_m arg(0) - %define arg1 trans - %define arg1_m arg(1) - %define arg2 arg2_m - %define arg2_m arg(2) - %define arg3 ebx - %define arg4 trans - %define arg4_m arg(4) - %define tmp edx - %define tmp.w edx - %define tmp.b dl - %define tmp2 edi - %define tmp3 esi - %define return eax - %macro SLDR 2 ;stack load/restore - mov %1, %2 - %endmacro - %define SSTR SLDR - - %macro FUNC_SAVE 0 - push ebp - mov ebp, esp - push esi - push edi - push ebx - mov arg3, arg(3) - %endmacro - - %macro FUNC_RESTORE 0 - pop ebx - pop edi - pop esi - mov esp, ebp - pop ebp - %endmacro - -%endif ; output formats - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest arg4 - -%define vec_i tmp2 -%define ptr tmp3 -%define pos return - -%ifidn PS,4 ;32-bit code - %define vec_m arg1_m - %define len_m arg0_m - %define dest_m arg4_m -%endif - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - -%ifidn PS,8 ;64-bit code - default rel - [bits 64] -%endif - -section .text - -%define xmask0f ymm3 -%define xmask0fx xmm3 -%define xgft_lo ymm4 -%define xgft_hi ymm5 - -%define x0 ymm0 -%define xtmpa ymm1 -%define xp ymm2 - -align 16 -global gf_vect_dot_prod_avx2:function -func(gf_vect_dot_prod_avx2) - FUNC_SAVE - SLDR len, len_m - sub len, 32 - SSTR len_m, len - jl .return_fail - xor pos, pos - mov tmp.b, 0x0f - vpinsrb xmask0fx, xmask0fx, tmp.w, 0 - vpbroadcastb xmask0f, xmask0fx ;Construct mask 0x0f0f0f... - -.loop32: - vpxor xp, xp - mov tmp, mul_array - xor vec_i, vec_i - -.next_vect: - - mov ptr, [src+vec_i*PS] - - vmovdqu xgft_lo, [tmp] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - vperm2i128 xgft_hi, xgft_lo, xgft_lo, 0x11 ; swapped to hi | hi - vperm2i128 xgft_lo, xgft_lo, xgft_lo, 0x00 ; swapped to lo | lo - - XLDR x0, [ptr+pos] ;Get next source vector - - add tmp, 32 - add vec_i, 1 - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - vpshufb xgft_hi, xgft_hi, x0 ;Lookup mul table of high nibble - vpshufb xgft_lo, xgft_lo, xtmpa ;Lookup mul table of low nibble - vpxor xgft_hi, xgft_hi, xgft_lo ;GF add high and low partials - vpxor xp, xp, xgft_hi ;xp += partial - - SLDR vec, vec_m - cmp vec_i, vec - jl .next_vect - - SLDR dest, dest_m - XSTR [dest+pos], xp - - add pos, 32 ;Loop on 32 bytes at a time - SLDR len, len_m - cmp pos, len - jle .loop32 - - lea tmp, [len + 32] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-32 - jmp .loop32 ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_vect_dot_prod_avx2, 04, 04, 0190 diff --git a/pkg/erasure/gf_vect_dot_prod_sse.asm b/pkg/erasure/gf_vect_dot_prod_sse.asm deleted file mode 100644 index 444888433..000000000 --- a/pkg/erasure/gf_vect_dot_prod_sse.asm +++ /dev/null @@ -1,297 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_vect_dot_prod_sse(len, vec, *g_tbls, **buffs, *dest); -;;; - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r9 - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - -%ifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - - %define tmp r11 - %define tmp2 r10 - %define tmp3 r9 - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - - %define arg4 r12 ; must be saved and loaded - %define tmp r11 - %define tmp2 r10 - %define tmp3 rdi ; must be saved and loaded - %define return rax - %macro SLDR 2 - %endmacro - %define SSTR SLDR - %define PS 8 - %define frame_size 2*8 - %define arg(x) [rsp + frame_size + PS + PS*x] - - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - rex_push_reg r12 - push_reg rdi - end_prolog - mov arg4, arg(4) - %endmacro - - %macro FUNC_RESTORE 0 - pop rdi - pop r12 - %endmacro -%endif - -%ifidn __OUTPUT_FORMAT__, elf32 - -;;;================== High Address; -;;; arg4 -;;; arg3 -;;; arg2 -;;; arg1 -;;; arg0 -;;; return -;;;<================= esp of caller -;;; ebp -;;;<================= ebp = esp -;;; esi -;;; edi -;;; ebx -;;;<================= esp of callee -;;; -;;;================== Low Address; - - %define PS 4 - %define LOG_PS 2 - %define func(x) x: - %define arg(x) [ebp + PS*2 + PS*x] - - %define trans ecx ;trans is for the variables in stack - %define arg0 trans - %define arg0_m arg(0) - %define arg1 trans - %define arg1_m arg(1) - %define arg2 arg2_m - %define arg2_m arg(2) - %define arg3 ebx - %define arg4 trans - %define arg4_m arg(4) - %define tmp edx - %define tmp2 edi - %define tmp3 esi - %define return eax - %macro SLDR 2 ;; stack load/restore - mov %1, %2 - %endmacro - %define SSTR SLDR - - %macro FUNC_SAVE 0 - push ebp - mov ebp, esp - push esi - push edi - push ebx - mov arg3, arg(3) - %endmacro - - %macro FUNC_RESTORE 0 - pop ebx - pop edi - pop esi - mov esp, ebp - pop ebp - %endmacro - -%endif ; output formats - -%define len arg0 -%define vec arg1 -%define mul_array arg2 -%define src arg3 -%define dest arg4 - -%define vec_i tmp2 -%define ptr tmp3 -%define pos return - - %ifidn PS,4 ;32-bit code - %define vec_m arg1_m - %define len_m arg0_m - %define dest_m arg4_m - %endif - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR movdqu - %define XSTR movdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR movdqa - %define XSTR movdqa - %else - %define XLDR movntdqa - %define XSTR movntdq - %endif -%endif - -%ifidn PS,8 ;64-bit code - default rel - [bits 64] -%endif - -section .text - -%define xmask0f xmm5 -%define xgft_lo xmm4 -%define xgft_hi xmm3 - -%define x0 xmm0 -%define xtmpa xmm1 -%define xp xmm2 - -align 16 -global gf_vect_dot_prod_sse:function -func(gf_vect_dot_prod_sse) - FUNC_SAVE - SLDR len, len_m - sub len, 16 - SSTR len_m, len - jl .return_fail - xor pos, pos - movdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - -.loop16: - pxor xp, xp - mov tmp, mul_array - xor vec_i, vec_i - -.next_vect: - - mov ptr, [src+vec_i*PS] - movdqu xgft_lo, [tmp] ;Load array Cx{00}, Cx{01}, ..., Cx{0f} - movdqu xgft_hi, [tmp+16] ; " Cx{00}, Cx{10}, ..., Cx{f0} - XLDR x0, [ptr+pos] ;Get next source vector - - add tmp, 32 - add vec_i, 1 - - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - - pshufb xgft_hi, x0 ;Lookup mul table of high nibble - pshufb xgft_lo, xtmpa ;Lookup mul table of low nibble - pxor xgft_hi, xgft_lo ;GF add high and low partials - pxor xp, xgft_hi ;xp += partial - - SLDR vec, vec_m - cmp vec_i, vec - jl .next_vect - - SLDR dest, dest_m - XSTR [dest+pos], xp - - add pos, 16 ;Loop on 16 bytes at a time - SLDR len, len_m - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - jmp .loop16 ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -align 16 - -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_vect_dot_prod_sse, 00, 04, 0060 diff --git a/pkg/erasure/gf_vect_mad_avx.asm b/pkg/erasure/gf_vect_mad_avx.asm deleted file mode 100644 index 2c0627dfb..000000000 --- a/pkg/erasure/gf_vect_mad_avx.asm +++ /dev/null @@ -1,218 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_vect_mad_avx(len, vec, vec_i, mul_array, src, dest); -;;; - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 - %define arg5 r15 - %define tmp r11 - %define return rax - %define return.w eax - %define PS 8 - %define stack_size 16*3 + 3*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - -%macro FUNC_SAVE 0 - sub rsp, stack_size - vmovdqa [rsp+16*0],xmm6 - vmovdqa [rsp+16*1],xmm7 - vmovdqa [rsp+16*2],xmm8 - save_reg r12, 3*16 + 0*8 - save_reg r15, 3*16 + 1*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) -%endmacro - -%macro FUNC_RESTORE 0 - vmovdqa xmm6, [rsp+16*0] - vmovdqa xmm7, [rsp+16*1] - vmovdqa xmm8, [rsp+16*2] - mov r12, [rsp + 3*16 + 0*8] - mov r15, [rsp + 3*16 + 1*8] - add rsp, stack_size -%endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE - -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - -;;; gf_vect_mad_avx(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest arg5 -%define pos return -%define pos.w return.w - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - - -default rel - -[bits 64] -section .text - -%define xmask0f xmm8 -%define xgft_lo xmm7 -%define xgft_hi xmm6 - -%define x0 xmm0 -%define xtmpa xmm1 -%define xtmph xmm2 -%define xtmpl xmm3 -%define xd xmm4 -%define xtmpd xmm5 - -align 16 -global gf_vect_mad_avx:function -func(gf_vect_mad_avx) - FUNC_SAVE - sub len, 16 - jl .return_fail - - xor pos, pos - vmovdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - - sal vec_i, 5 ;Multiply by 32 - vmovdqu xgft_lo, [vec_i+mul_array] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - vmovdqu xgft_hi, [vec_i+mul_array+16] ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - - XLDR xtmpd, [dest+len] ;backup the last 16 bytes in dest - -.loop16: - XLDR xd, [dest+pos] ;Get next dest vector -.loop16_overlap: - XLDR x0, [src+pos] ;Get next source vector - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - vpshufb xtmph, xgft_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph, xtmph, xtmpl ;GF add high and low partials - vpxor xd, xd, xtmph ;xd += partial - - XSTR [dest+pos], xd - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - vmovdqa xd, xtmpd ;Restore xd - jmp .loop16_overlap ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -align 16 - -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_vect_mad_avx, 02, 00, 0201 diff --git a/pkg/erasure/gf_vect_mad_avx2.asm b/pkg/erasure/gf_vect_mad_avx2.asm deleted file mode 100644 index 787434deb..000000000 --- a/pkg/erasure/gf_vect_mad_avx2.asm +++ /dev/null @@ -1,228 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_vect_mad_avx2(len, vec, vec_i, mul_array, src, dest); -;;; - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 ; must be saved and loaded - %define arg5 r15 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define return rax - %define return.w eax - %define PS 8 - %define stack_size 16*3 + 3*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - - %macro FUNC_SAVE 0 - sub rsp, stack_size - vmovdqa [rsp+16*0],xmm6 - vmovdqa [rsp+16*1],xmm7 - vmovdqa [rsp+16*2],xmm8 - save_reg r12, 3*16 + 0*8 - save_reg r15, 3*16 + 1*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) - %endmacro - - %macro FUNC_RESTORE 0 - vmovdqa xmm6, [rsp+16*0] - vmovdqa xmm7, [rsp+16*1] - vmovdqa xmm8, [rsp+16*2] - mov r12, [rsp + 3*16 + 0*8] - mov r15, [rsp + 3*16 + 1*8] - add rsp, stack_size - %endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE - -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - - %define tmp r11 - %define tmp.w r11d - %define tmp.b r11b - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - - -;;; gf_vect_mad_avx2(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest arg5 -%define pos return -%define pos.w return.w - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR vmovdqu - %define XSTR vmovdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa - %else - %define XLDR vmovntdqa - %define XSTR vmovntdq - %endif -%endif - - -default rel - -[bits 64] -section .text - -%define xmask0f ymm8 -%define xmask0fx xmm8 -%define xgft_lo ymm7 -%define xgft_hi ymm6 - -%define x0 ymm0 -%define xtmpa ymm1 -%define xtmph ymm2 -%define xtmpl ymm3 -%define xd ymm4 -%define xtmpd ymm5 - -align 16 -global gf_vect_mad_avx2:function -func(gf_vect_mad_avx2) - FUNC_SAVE - sub len, 32 - jl .return_fail - xor pos, pos - mov tmp.b, 0x0f - vpinsrb xmask0fx, xmask0fx, tmp.w, 0 - vpbroadcastb xmask0f, xmask0fx ;Construct mask 0x0f0f0f... - - sal vec_i, 5 ;Multiply by 32 - vmovdqu xgft_lo, [vec_i+mul_array] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - vperm2i128 xgft_hi, xgft_lo, xgft_lo, 0x11 ; swapped to hi | hi - vperm2i128 xgft_lo, xgft_lo, xgft_lo, 0x00 ; swapped to lo | lo - - XLDR xtmpd, [dest+len] ;backup the last 32 bytes in dest - -.loop32: - XLDR xd, [dest+pos] ;Get next dest vector -.loop32_overlap: - XLDR x0, [src+pos] ;Get next source vector - - vpand xtmpa, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - - vpshufb xtmph, xgft_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmpl, xgft_lo, xtmpa ;Lookup mul table of low nibble - vpxor xtmph, xtmph, xtmpl ;GF add high and low partials - vpxor xd, xd, xtmph ;xd += partial - - XSTR [dest+pos], xd - add pos, 32 ;Loop on 32 bytes at a time - cmp pos, len - jle .loop32 - - lea tmp, [len + 32] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-32 - vmovdqa xd, xtmpd ;Restore xd - jmp .loop32_overlap ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_vect_mad_avx2, 04, 00, 0202 diff --git a/pkg/erasure/gf_vect_mad_sse.asm b/pkg/erasure/gf_vect_mad_sse.asm deleted file mode 100644 index d2e64f38d..000000000 --- a/pkg/erasure/gf_vect_mad_sse.asm +++ /dev/null @@ -1,219 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_vect_mad_sse(len, vec, vec_i, mul_array, src, dest); -;;; - -%ifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg0.w ecx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define arg4 r12 - %define arg5 r15 - %define tmp r11 - %define return rax - %define return.w eax - %define PS 8 - %define stack_size 16*3 + 3*8 - %define arg(x) [rsp + stack_size + PS + PS*x] - %define func(x) proc_frame x - -%macro FUNC_SAVE 0 - sub rsp, stack_size - movdqa [rsp+16*0],xmm6 - movdqa [rsp+16*1],xmm7 - movdqa [rsp+16*2],xmm8 - save_reg r12, 3*16 + 0*8 - save_reg r15, 3*16 + 1*8 - end_prolog - mov arg4, arg(4) - mov arg5, arg(5) -%endmacro - -%macro FUNC_RESTORE 0 - movdqa xmm6, [rsp+16*0] - movdqa xmm7, [rsp+16*1] - movdqa xmm8, [rsp+16*2] - mov r12, [rsp + 3*16 + 0*8] - mov r15, [rsp + 3*16 + 1*8] - add rsp, stack_size -%endmacro - -%elifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE - -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg0.w edi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define return rax - %define return.w eax - - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE -%endif - -;;; gf_vect_mad_sse(len, vec, vec_i, mul_array, src, dest) -%define len arg0 -%define len.w arg0.w -%define vec arg1 -%define vec_i arg2 -%define mul_array arg3 -%define src arg4 -%define dest arg5 -%define pos return -%define pos.w return.w - -%ifndef EC_ALIGNED_ADDR -;;; Use Un-aligned load/store - %define XLDR movdqu - %define XSTR movdqu -%else -;;; Use Non-temporal load/stor - %ifdef NO_NT_LDST - %define XLDR movdqa - %define XSTR movdqa - %else - %define XLDR movntdqa - %define XSTR movntdq - %endif -%endif - -default rel - -[bits 64] -section .text - -%define xmask0f xmm8 -%define xgft_lo xmm7 -%define xgft_hi xmm6 - -%define x0 xmm0 -%define xtmpa xmm1 -%define xtmph xmm2 -%define xtmpl xmm3 -%define xd xmm4 -%define xtmpd xmm5 - - -align 16 -global gf_vect_mad_sse:function -func(gf_vect_mad_sse) - FUNC_SAVE - sub len, 16 - jl .return_fail - - xor pos, pos - movdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - sal vec_i, 5 ;Multiply by 32 - movdqu xgft_lo, [vec_i+mul_array] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - movdqu xgft_hi, [vec_i+mul_array+16] ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - - XLDR xtmpd, [dest+len] ;backup the last 16 bytes in dest - -.loop16: - XLDR xd, [dest+pos] ;Get next dest vector -.loop16_overlap: - XLDR x0, [src+pos] ;Get next source vector - movdqa xtmph, xgft_hi ;Reload const array registers - movdqa xtmpl, xgft_lo - movdqa xtmpa, x0 ;Keep unshifted copy of src - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand xtmpa, xmask0f ;Mask low src nibble in bits 4-0 - pshufb xtmph, x0 ;Lookup mul table of high nibble - pshufb xtmpl, xtmpa ;Lookup mul table of low nibble - pxor xtmph, xtmpl ;GF add high and low partials - - pxor xd, xtmph - XSTR [dest+pos], xd ;Store result - - add pos, 16 ;Loop on 16 bytes at a time - cmp pos, len - jle .loop16 - - lea tmp, [len + 16] - cmp pos, tmp - je .return_pass - - ;; Tail len - mov pos, len ;Overlapped offset length-16 - movdqa xd, xtmpd ;Restore xd - jmp .loop16_overlap ;Do one more overlap pass - -.return_pass: - mov return, 0 - FUNC_RESTORE - ret - -.return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -align 16 - -mask0f: ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_vect_mad_sse, 00, 00, 0200 diff --git a/pkg/erasure/gf_vect_mul.h b/pkg/erasure/gf_vect_mul.h deleted file mode 100644 index 42aa0a456..000000000 --- a/pkg/erasure/gf_vect_mul.h +++ /dev/null @@ -1,148 +0,0 @@ -/********************************************************************** - Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -**********************************************************************/ - - -#ifndef _GF_VECT_MUL_H -#define _GF_VECT_MUL_H - -/** - * @file gf_vect_mul.h - * @brief Interface to functions for vector (block) multiplication in GF(2^8). - * - * This file defines the interface to routines used in fast RAID rebuild and - * erasure codes. - */ - -#ifdef __cplusplus -extern "C" { -#endif - - /** - * @brief GF(2^8) vector multiply by constant. - * - * Does a GF(2^8) vector multiply b = Ca where a and b are arrays and C - * is a single field element in GF(2^8). Can be used for RAID6 rebuild - * and partial write functions. Function requires pre-calculation of a - * 32-element constant array based on constant C. gftbl(C) = {C{00}, - * C{01}, C{02}, ... , C{0f} }, {C{00}, C{10}, C{20}, ... , C{f0} }. Len - * and src must be aligned to 32B. - * @requires SSE4.1 - * - * @param len Length of vector in bytes. Must be aligned to 32B. - * @param gftbl Pointer to 32-byte array of pre-calculated constants based on C. - * @param src Pointer to src data array. Must be aligned to 32B. - * @param dest Pointer to destination data array. Must be aligned to 32B. - * @returns 0 pass, other fail - */ - -int gf_vect_mul_sse(int len, unsigned char *gftbl, void *src, void *dest); - - - /** - * @brief GF(2^8) vector multiply by constant. - * - * Does a GF(2^8) vector multiply b = Ca where a and b are arrays and C - * is a single field element in GF(2^8). Can be used for RAID6 rebuild - * and partial write functions. Function requires pre-calculation of a - * 32-element constant array based on constant C. gftbl(C) = {C{00}, - * C{01}, C{02}, ... , C{0f} }, {C{00}, C{10}, C{20}, ... , C{f0} }. Len - * and src must be aligned to 32B. - * @requires AVX - * - * @param len Length of vector in bytes. Must be aligned to 32B. - * @param gftbl Pointer to 32-byte array of pre-calculated constants based on C. - * @param src Pointer to src data array. Must be aligned to 32B. - * @param dest Pointer to destination data array. Must be aligned to 32B. - * @returns 0 pass, other fail - */ - -int gf_vect_mul_avx(int len, unsigned char *gftbl, void *src, void *dest); - - -/** - * @brief GF(2^8) vector multiply by constant, runs appropriate version. - * - * Does a GF(2^8) vector multiply b = Ca where a and b are arrays and C - * is a single field element in GF(2^8). Can be used for RAID6 rebuild - * and partial write functions. Function requires pre-calculation of a - * 32-element constant array based on constant C. gftbl(C) = {C{00}, - * C{01}, C{02}, ... , C{0f} }, {C{00}, C{10}, C{20}, ... , C{f0} }. - * Len and src must be aligned to 32B. - * - * This function determines what instruction sets are enabled - * and selects the appropriate version at runtime. - * - * @param len Length of vector in bytes. Must be aligned to 32B. - * @param gftbl Pointer to 32-byte array of pre-calculated constants based on C. - * @param src Pointer to src data array. Must be aligned to 32B. - * @param dest Pointer to destination data array. Must be aligned to 32B. - * @returns 0 pass, other fail - */ - -int gf_vect_mul(int len, unsigned char *gftbl, void *src, void *dest); - - -/** - * @brief Initialize 32-byte constant array for GF(2^8) vector multiply - * - * Calculates array {C{00}, C{01}, C{02}, ... , C{0f} }, {C{00}, C{10}, - * C{20}, ... , C{f0} } as required by other fast vector multiply - * functions. - * @param c Constant input. - * @param gftbl Table output. - */ - -void gf_vect_mul_init(unsigned char c, unsigned char* gftbl); - - -/** - * @brief GF(2^8) vector multiply by constant, runs baseline version. - * - * Does a GF(2^8) vector multiply b = Ca where a and b are arrays and C - * is a single field element in GF(2^8). Can be used for RAID6 rebuild - * and partial write functions. Function requires pre-calculation of a - * 32-element constant array based on constant C. gftbl(C) = {C{00}, - * C{01}, C{02}, ... , C{0f} }, {C{00}, C{10}, C{20}, ... , C{f0} }. Len - * and src must be aligned to 32B. - * - * @param len Length of vector in bytes. Must be aligned to 32B. - * @param a Pointer to 32-byte array of pre-calculated constants based on C. - * only use 2nd element is used. - * @param src Pointer to src data array. Must be aligned to 32B. - * @param dest Pointer to destination data array. Must be aligned to 32B. - */ - -void gf_vect_mul_base(int len, unsigned char *a, unsigned char *src, - unsigned char *dest); - -#ifdef __cplusplus -} -#endif - -#endif //_GF_VECT_MUL_H diff --git a/pkg/erasure/gf_vect_mul_avx.asm b/pkg/erasure/gf_vect_mul_avx.asm deleted file mode 100644 index f5f5e0aa1..000000000 --- a/pkg/erasure/gf_vect_mul_avx.asm +++ /dev/null @@ -1,183 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_vect_mul_avx(len, mul_array, src, dest) -;;; - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define return rax - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE - -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define return rax - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE - -%elifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define return rax - %define stack_size 5*16 + 8 ; must be an odd multiple of 8 - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - save_xmm128 xmm6, 0*16 - save_xmm128 xmm7, 1*16 - save_xmm128 xmm13, 2*16 - save_xmm128 xmm14, 3*16 - save_xmm128 xmm15, 4*16 - end_prolog - %endmacro - - %macro FUNC_RESTORE 0 - vmovdqa xmm6, [rsp + 0*16] - vmovdqa xmm7, [rsp + 1*16] - vmovdqa xmm13, [rsp + 2*16] - vmovdqa xmm14, [rsp + 3*16] - vmovdqa xmm15, [rsp + 4*16] - add rsp, stack_size - %endmacro - -%endif - - -%define len arg0 -%define mul_array arg1 -%define src arg2 -%define dest arg3 -%define pos return - - -;;; Use Non-temporal load/stor -%ifdef NO_NT_LDST - %define XLDR vmovdqa - %define XSTR vmovdqa -%else - %define XLDR vmovntdqa - %define XSTR vmovntdq -%endif - -default rel - -[bits 64] -section .text - -%define xmask0f xmm15 -%define xgft_lo xmm14 -%define xgft_hi xmm13 - -%define x0 xmm0 -%define xtmp1a xmm1 -%define xtmp1b xmm2 -%define xtmp1c xmm3 -%define x1 xmm4 -%define xtmp2a xmm5 -%define xtmp2b xmm6 -%define xtmp2c xmm7 - -align 16 -global gf_vect_mul_avx:function -func(gf_vect_mul_avx) - FUNC_SAVE - mov pos, 0 - vmovdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - vmovdqu xgft_lo, [mul_array] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - vmovdqu xgft_hi, [mul_array+16] ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - -loop32: - XLDR x0, [src+pos] ;Get next source vector - XLDR x1, [src+pos+16] ;Get next source vector + 16B ahead - add pos, 32 ;Loop on 16 bytes at a time - cmp pos, len - vpand xtmp1a, x0, xmask0f ;Mask low src nibble in bits 4-0 - vpand xtmp2a, x1, xmask0f - vpsraw x0, x0, 4 ;Shift to put high nibble into bits 4-0 - vpsraw x1, x1, 4 - vpand x0, x0, xmask0f ;Mask high src nibble in bits 4-0 - vpand x1, x1, xmask0f - vpshufb xtmp1b, xgft_hi, x0 ;Lookup mul table of high nibble - vpshufb xtmp1c, xgft_lo, xtmp1a ;Lookup mul table of low nibble - vpshufb xtmp2b, xgft_hi, x1 ;Lookup mul table of high nibble - vpshufb xtmp2c, xgft_lo, xtmp2a ;Lookup mul table of low nibble - vpxor xtmp1b, xtmp1b, xtmp1c ;GF add high and low partials - vpxor xtmp2b, xtmp2b, xtmp2c - XSTR [dest+pos-32], xtmp1b ;Store result - XSTR [dest+pos-16], xtmp2b ;Store +16B result - jl loop32 - - -return_pass: - FUNC_RESTORE - sub pos, len - ret - -return_fail: - FUNC_RESTORE - mov return, 1 - ret - -endproc_frame - -section .data - -align 16 - -mask0f: -ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_vect_mul_avx, 01, 02, 0036 diff --git a/pkg/erasure/gf_vect_mul_sse.asm b/pkg/erasure/gf_vect_mul_sse.asm deleted file mode 100644 index aeb958b8f..000000000 --- a/pkg/erasure/gf_vect_mul_sse.asm +++ /dev/null @@ -1,189 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Copyright(c) 2011-2015 Intel Corporation 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 Intel Corporation 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;;; -;;; gf_vect_mul_sse(len, mul_array, src, dest) -;;; - -%ifidn __OUTPUT_FORMAT__, elf64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define return rax - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE - -%elifidn __OUTPUT_FORMAT__, macho64 - %define arg0 rdi - %define arg1 rsi - %define arg2 rdx - %define arg3 rcx - %define arg4 r8 - %define arg5 r9 - %define tmp r11 - %define return rax - %define func(x) x: - %define FUNC_SAVE - %define FUNC_RESTORE - -%elifidn __OUTPUT_FORMAT__, win64 - %define arg0 rcx - %define arg1 rdx - %define arg2 r8 - %define arg3 r9 - %define return rax - %define stack_size 5*16 + 8 ; must be an odd multiple of 8 - %define func(x) proc_frame x - %macro FUNC_SAVE 0 - alloc_stack stack_size - save_xmm128 xmm6, 0*16 - save_xmm128 xmm7, 1*16 - save_xmm128 xmm13, 2*16 - save_xmm128 xmm14, 3*16 - save_xmm128 xmm15, 4*16 - end_prolog - %endmacro - - %macro FUNC_RESTORE 0 - movdqa xmm6, [rsp + 0*16] - movdqa xmm7, [rsp + 1*16] - movdqa xmm13, [rsp + 2*16] - movdqa xmm14, [rsp + 3*16] - movdqa xmm15, [rsp + 4*16] - add rsp, stack_size - %endmacro - -%endif - - -%define len arg0 -%define mul_array arg1 -%define src arg2 -%define dest arg3 -%define pos return - - -;;; Use Non-temporal load/stor -%ifdef NO_NT_LDST - %define XLDR movdqa - %define XSTR movdqa -%else - %define XLDR movntdqa - %define XSTR movntdq -%endif - -default rel - -[bits 64] -section .text - -%define xmask0f xmm15 -%define xgft_lo xmm14 -%define xgft_hi xmm13 - -%define x0 xmm0 -%define xtmp1a xmm1 -%define xtmp1b xmm2 -%define xtmp1c xmm3 -%define x1 xmm4 -%define xtmp2a xmm5 -%define xtmp2b xmm6 -%define xtmp2c xmm7 - - -align 16 -global gf_vect_mul_sse:function -func(gf_vect_mul_sse) - FUNC_SAVE - mov pos, 0 - movdqa xmask0f, [mask0f] ;Load mask of lower nibble in each byte - movdqu xgft_lo, [mul_array] ;Load array Cx{00}, Cx{01}, Cx{02}, ... - movdqu xgft_hi, [mul_array+16] ; " Cx{00}, Cx{10}, Cx{20}, ... , Cx{f0} - -loop32: - XLDR x0, [src+pos] ;Get next source vector - XLDR x1, [src+pos+16] ;Get next source vector + 16B ahead - movdqa xtmp1b, xgft_hi ;Reload const array registers - movdqa xtmp1c, xgft_lo - movdqa xtmp2b, xgft_hi - movdqa xtmp2c, xgft_lo - movdqa xtmp1a, x0 ;Keep unshifted copy of src - movdqa xtmp2a, x1 - psraw x0, 4 ;Shift to put high nibble into bits 4-0 - psraw x1, 4 - pand xtmp1a, xmask0f ;Mask low src nibble in bits 4-0 - pand xtmp2a, xmask0f - pand x0, xmask0f ;Mask high src nibble in bits 4-0 - pand x1, xmask0f - pshufb xtmp1b, x0 ;Lookup mul table of high nibble - pshufb xtmp1c, xtmp1a ;Lookup mul table of low nibble - pshufb xtmp2b, x1 - pshufb xtmp2c, xtmp2a - pxor xtmp1b, xtmp1c ;GF add high and low partials - pxor xtmp2b, xtmp2c - XSTR [dest+pos], xtmp1b ;Store result - XSTR [dest+pos+16], xtmp2b ;Store +16B result - add pos, 32 ;Loop on 32 bytes at at time - cmp pos, len - jl loop32 - - -return_pass: - sub pos, len - FUNC_RESTORE - ret - -return_fail: - mov return, 1 - FUNC_RESTORE - ret - -endproc_frame - -section .data - -align 16 -mask0f: -ddq 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f - -%macro slversion 4 -global %1_slver_%2%3%4 -global %1_slver -%1_slver: -%1_slver_%2%3%4: - dw 0x%4 - db 0x%3, 0x%2 -%endmacro -;;; func core, ver, snum -slversion gf_vect_mul_sse, 00, 02, 0034 diff --git a/pkg/erasure/stdint.go b/pkg/erasure/stdint.go deleted file mode 100644 index bca665a21..000000000 --- a/pkg/erasure/stdint.go +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2014 Minio, 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 erasure - -// -// int sizeInt() -// { -// return sizeof(int); -// } -import "C" -import "unsafe" - -var ( - // See http://golang.org/ref/spec#Numeric_types - sizeInt = int(C.sizeInt()) - // SizeInt8 is the byte size of a int8. - sizeInt8 = int(unsafe.Sizeof(int8(0))) - // SizeInt16 is the byte size of a int16. - sizeInt16 = int(unsafe.Sizeof(int16(0))) - // SizeInt32 is the byte size of a int32. - sizeInt32 = int(unsafe.Sizeof(int32(0))) - // SizeInt64 is the byte size of a int64. - sizeInt64 = int(unsafe.Sizeof(int64(0))) -) diff --git a/pkg/fs/api_suite_nix_test.go b/pkg/fs/api_suite_nix_test.go new file mode 100644 index 000000000..b19867330 --- /dev/null +++ b/pkg/fs/api_suite_nix_test.go @@ -0,0 +1,507 @@ +// +build linux darwin freebsd openbsd netbsd dragonfly + +/* + * Minimalist Object Storage, (C) 2015 Minio, 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 fs + +import ( + "bytes" + "crypto/md5" + "encoding/base64" + "encoding/hex" + "encoding/xml" + "math/rand" + "strconv" + "time" + + "gopkg.in/check.v1" +) + +// APITestSuite - collection of API tests +func APITestSuite(c *check.C, create func() CloudStorage) { + testMakeBucket(c, create) + testMultipleObjectCreation(c, create) + testPaging(c, create) + testObjectOverwriteWorks(c, create) + testNonExistantBucketOperations(c, create) + testBucketMetadata(c, create) + testBucketRecreateFails(c, create) + testPutObjectInSubdir(c, create) + testListBuckets(c, create) + testListBucketsOrder(c, create) + testListObjectsTestsForNonExistantBucket(c, create) + testNonExistantObjectInBucket(c, create) + testGetDirectoryReturnsObjectNotFound(c, create) + testDefaultContentType(c, create) + testMultipartObjectCreation(c, create) + testMultipartObjectAbort(c, create) +} + +func testMakeBucket(c *check.C, create func() CloudStorage) { + fs := create() + err := fs.MakeBucket("bucket", "") + c.Assert(err, check.IsNil) +} + +func testMultipartObjectCreation(c *check.C, create func() CloudStorage) { + fs := create() + err := fs.MakeBucket("bucket", "") + c.Assert(err, check.IsNil) + uploadID, err := fs.NewMultipartUpload("bucket", "key") + c.Assert(err, check.IsNil) + + completedParts := CompleteMultipartUpload{} + completedParts.Part = make([]CompletePart, 0) + finalHasher := md5.New() + for i := 1; i <= 10; i++ { + randomPerm := rand.Perm(10) + randomString := "" + for _, num := range randomPerm { + randomString = randomString + strconv.Itoa(num) + } + + hasher := md5.New() + finalHasher.Write([]byte(randomString)) + hasher.Write([]byte(randomString)) + expectedmd5Sum := base64.StdEncoding.EncodeToString(hasher.Sum(nil)) + expectedmd5Sumhex := hex.EncodeToString(hasher.Sum(nil)) + + var calculatedmd5sum string + calculatedmd5sum, err = fs.CreateObjectPart("bucket", "key", uploadID, expectedmd5Sum, i, int64(len(randomString)), + bytes.NewBufferString(randomString), nil) + c.Assert(err, check.IsNil) + c.Assert(calculatedmd5sum, check.Equals, expectedmd5Sumhex) + completedParts.Part = append(completedParts.Part, CompletePart{PartNumber: i, ETag: calculatedmd5sum}) + } + finalExpectedmd5SumHex := hex.EncodeToString(finalHasher.Sum(nil)) + completedPartsBytes, e := xml.Marshal(completedParts) + c.Assert(e, check.IsNil) + objectMetadata, err := fs.CompleteMultipartUpload("bucket", "key", uploadID, bytes.NewReader(completedPartsBytes), nil) + c.Assert(err, check.IsNil) + c.Assert(objectMetadata.Md5, check.Equals, finalExpectedmd5SumHex) +} + +func testMultipartObjectAbort(c *check.C, create func() CloudStorage) { + fs := create() + err := fs.MakeBucket("bucket", "") + c.Assert(err, check.IsNil) + uploadID, err := fs.NewMultipartUpload("bucket", "key") + c.Assert(err, check.IsNil) + + parts := make(map[int]string) + for i := 1; i <= 10; i++ { + randomPerm := rand.Perm(10) + randomString := "" + for _, num := range randomPerm { + randomString = randomString + strconv.Itoa(num) + } + + hasher := md5.New() + hasher.Write([]byte(randomString)) + expectedmd5Sum := base64.StdEncoding.EncodeToString(hasher.Sum(nil)) + expectedmd5Sumhex := hex.EncodeToString(hasher.Sum(nil)) + + var calculatedmd5sum string + calculatedmd5sum, err = fs.CreateObjectPart("bucket", "key", uploadID, expectedmd5Sum, i, int64(len(randomString)), + bytes.NewBufferString(randomString), nil) + c.Assert(err, check.IsNil) + c.Assert(calculatedmd5sum, check.Equals, expectedmd5Sumhex) + parts[i] = calculatedmd5sum + } + err = fs.AbortMultipartUpload("bucket", "key", uploadID) + c.Assert(err, check.IsNil) +} + +func testMultipleObjectCreation(c *check.C, create func() CloudStorage) { + objects := make(map[string][]byte) + fs := create() + err := fs.MakeBucket("bucket", "") + c.Assert(err, check.IsNil) + for i := 0; i < 10; i++ { + randomPerm := rand.Perm(10) + randomString := "" + for _, num := range randomPerm { + randomString = randomString + strconv.Itoa(num) + } + + hasher := md5.New() + hasher.Write([]byte(randomString)) + expectedmd5Sum := base64.StdEncoding.EncodeToString(hasher.Sum(nil)) + expectedmd5Sumhex := hex.EncodeToString(hasher.Sum(nil)) + + key := "obj" + strconv.Itoa(i) + objects[key] = []byte(randomString) + objectMetadata, err := fs.CreateObject("bucket", key, expectedmd5Sum, int64(len(randomString)), bytes.NewBufferString(randomString), nil) + c.Assert(err, check.IsNil) + c.Assert(objectMetadata.Md5, check.Equals, expectedmd5Sumhex) + } + + for key, value := range objects { + var byteBuffer bytes.Buffer + _, err := fs.GetObject(&byteBuffer, "bucket", key, 0, 0) + c.Assert(err, check.IsNil) + c.Assert(byteBuffer.Bytes(), check.DeepEquals, value) + + metadata, err := fs.GetObjectMetadata("bucket", key) + c.Assert(err, check.IsNil) + c.Assert(metadata.Size, check.Equals, int64(len(value))) + } +} + +func testPaging(c *check.C, create func() CloudStorage) { + fs := create() + fs.MakeBucket("bucket", "") + resources := BucketResourcesMetadata{} + objects, resources, err := fs.ListObjects("bucket", resources) + c.Assert(err, check.IsNil) + c.Assert(len(objects), check.Equals, 0) + c.Assert(resources.IsTruncated, check.Equals, false) + // check before paging occurs + for i := 0; i < 5; i++ { + key := "obj" + strconv.Itoa(i) + _, err = fs.CreateObject("bucket", key, "", int64(len(key)), bytes.NewBufferString(key), nil) + c.Assert(err, check.IsNil) + resources.Maxkeys = 5 + resources.Prefix = "" + objects, resources, err = fs.ListObjects("bucket", resources) + c.Assert(err, check.IsNil) + c.Assert(len(objects), check.Equals, i+1) + c.Assert(resources.IsTruncated, check.Equals, false) + } + // check after paging occurs pages work + for i := 6; i <= 10; i++ { + key := "obj" + strconv.Itoa(i) + _, err = fs.CreateObject("bucket", key, "", int64(len(key)), bytes.NewBufferString(key), nil) + c.Assert(err, check.IsNil) + resources.Maxkeys = 5 + resources.Prefix = "" + objects, resources, err = fs.ListObjects("bucket", resources) + c.Assert(err, check.IsNil) + c.Assert(len(objects), check.Equals, 5) + c.Assert(resources.IsTruncated, check.Equals, true) + } + // check paging with prefix at end returns less objects + { + _, err = fs.CreateObject("bucket", "newPrefix", "", int64(len("prefix1")), bytes.NewBufferString("prefix1"), nil) + c.Assert(err, check.IsNil) + fs.CreateObject("bucket", "newPrefix2", "", int64(len("prefix2")), bytes.NewBufferString("prefix2"), nil) + c.Assert(err, check.IsNil) + resources.Prefix = "new" + resources.Maxkeys = 5 + objects, resources, err = fs.ListObjects("bucket", resources) + c.Assert(err, check.IsNil) + c.Assert(len(objects), check.Equals, 2) + } + + // check ordering of pages + { + resources.Prefix = "" + resources.Maxkeys = 1000 + objects, resources, err = fs.ListObjects("bucket", resources) + c.Assert(err, check.IsNil) + c.Assert(objects[0].Object, check.Equals, "newPrefix") + c.Assert(objects[1].Object, check.Equals, "newPrefix2") + c.Assert(objects[2].Object, check.Equals, "obj0") + c.Assert(objects[3].Object, check.Equals, "obj1") + c.Assert(objects[4].Object, check.Equals, "obj10") + } + + // check delimited results with delimiter and prefix + { + _, err = fs.CreateObject("bucket", "this/is/delimited", "", int64(len("prefix1")), bytes.NewBufferString("prefix1"), nil) + c.Assert(err, check.IsNil) + _, err = fs.CreateObject("bucket", "this/is/also/a/delimited/file", "", int64(len("prefix2")), bytes.NewBufferString("prefix2"), nil) + c.Assert(err, check.IsNil) + var prefixes []string + resources.CommonPrefixes = prefixes // allocate new everytime + resources.Delimiter = "/" + resources.Prefix = "this/is/" + resources.Maxkeys = 10 + objects, resources, err = fs.ListObjects("bucket", resources) + c.Assert(err, check.IsNil) + c.Assert(len(objects), check.Equals, 1) + c.Assert(resources.CommonPrefixes[0], check.Equals, "this/is/also/") + } + time.Sleep(time.Second) + + // check delimited results with delimiter without prefix + { + var prefixes []string + resources.CommonPrefixes = prefixes // allocate new everytime + resources.Delimiter = "/" + resources.Prefix = "" + resources.Maxkeys = 1000 + objects, resources, err = fs.ListObjects("bucket", resources) + c.Assert(err, check.IsNil) + c.Assert(objects[0].Object, check.Equals, "newPrefix") + c.Assert(objects[1].Object, check.Equals, "newPrefix2") + c.Assert(objects[2].Object, check.Equals, "obj0") + c.Assert(objects[3].Object, check.Equals, "obj1") + c.Assert(objects[4].Object, check.Equals, "obj10") + c.Assert(resources.CommonPrefixes[0], check.Equals, "this/") + } + + // check results with Marker + { + var prefixes []string + resources.CommonPrefixes = prefixes // allocate new everytime + resources.Prefix = "" + resources.Marker = "newPrefix" + resources.Delimiter = "" + resources.Maxkeys = 3 + objects, resources, err = fs.ListObjects("bucket", resources) + c.Assert(err, check.IsNil) + c.Assert(objects[0].Object, check.Equals, "newPrefix2") + c.Assert(objects[1].Object, check.Equals, "obj0") + c.Assert(objects[2].Object, check.Equals, "obj1") + } + // check ordering of results with prefix + { + resources.Prefix = "obj" + resources.Delimiter = "" + resources.Marker = "" + resources.Maxkeys = 1000 + objects, resources, err = fs.ListObjects("bucket", resources) + c.Assert(err, check.IsNil) + c.Assert(objects[0].Object, check.Equals, "obj0") + c.Assert(objects[1].Object, check.Equals, "obj1") + c.Assert(objects[2].Object, check.Equals, "obj10") + c.Assert(objects[3].Object, check.Equals, "obj2") + c.Assert(objects[4].Object, check.Equals, "obj3") + } + // check ordering of results with prefix and no paging + { + resources.Prefix = "new" + resources.Marker = "" + resources.Maxkeys = 5 + objects, resources, err = fs.ListObjects("bucket", resources) + c.Assert(err, check.IsNil) + c.Assert(objects[0].Object, check.Equals, "newPrefix") + c.Assert(objects[1].Object, check.Equals, "newPrefix2") + } +} + +func testObjectOverwriteWorks(c *check.C, create func() CloudStorage) { + fs := create() + err := fs.MakeBucket("bucket", "") + c.Assert(err, check.IsNil) + + hasher1 := md5.New() + hasher1.Write([]byte("one")) + md5Sum1 := base64.StdEncoding.EncodeToString(hasher1.Sum(nil)) + md5Sum1hex := hex.EncodeToString(hasher1.Sum(nil)) + objectMetadata, err := fs.CreateObject("bucket", "object", md5Sum1, int64(len("one")), bytes.NewBufferString("one"), nil) + c.Assert(err, check.IsNil) + c.Assert(md5Sum1hex, check.Equals, objectMetadata.Md5) + + hasher2 := md5.New() + hasher2.Write([]byte("three")) + md5Sum2 := base64.StdEncoding.EncodeToString(hasher2.Sum(nil)) + _, err = fs.CreateObject("bucket", "object", md5Sum2, int64(len("three")), bytes.NewBufferString("three"), nil) + c.Assert(err, check.IsNil) + + var bytesBuffer bytes.Buffer + length, err := fs.GetObject(&bytesBuffer, "bucket", "object", 0, 0) + c.Assert(err, check.IsNil) + c.Assert(length, check.Equals, int64(len("three"))) + c.Assert(string(bytesBuffer.Bytes()), check.Equals, "three") +} + +func testNonExistantBucketOperations(c *check.C, create func() CloudStorage) { + fs := create() + _, err := fs.CreateObject("bucket", "object", "", int64(len("one")), bytes.NewBufferString("one"), nil) + c.Assert(err, check.Not(check.IsNil)) +} + +func testBucketMetadata(c *check.C, create func() CloudStorage) { + fs := create() + err := fs.MakeBucket("string", "") + c.Assert(err, check.IsNil) + + metadata, err := fs.GetBucketMetadata("string") + c.Assert(err, check.IsNil) + c.Assert(metadata.ACL, check.Equals, BucketACL("private")) +} + +func testBucketRecreateFails(c *check.C, create func() CloudStorage) { + fs := create() + err := fs.MakeBucket("string", "") + c.Assert(err, check.IsNil) + err = fs.MakeBucket("string", "") + c.Assert(err, check.Not(check.IsNil)) +} + +func testPutObjectInSubdir(c *check.C, create func() CloudStorage) { + fs := create() + err := fs.MakeBucket("bucket", "") + c.Assert(err, check.IsNil) + + hasher := md5.New() + hasher.Write([]byte("hello world")) + md5Sum1 := base64.StdEncoding.EncodeToString(hasher.Sum(nil)) + md5Sum1hex := hex.EncodeToString(hasher.Sum(nil)) + objectMetadata, err := fs.CreateObject("bucket", "dir1/dir2/object", md5Sum1, int64(len("hello world")), bytes.NewBufferString("hello world"), nil) + c.Assert(err, check.IsNil) + c.Assert(objectMetadata.Md5, check.Equals, md5Sum1hex) + + var bytesBuffer bytes.Buffer + length, err := fs.GetObject(&bytesBuffer, "bucket", "dir1/dir2/object", 0, 0) + c.Assert(err, check.IsNil) + c.Assert(len(bytesBuffer.Bytes()), check.Equals, len("hello world")) + c.Assert(int64(len(bytesBuffer.Bytes())), check.Equals, length) +} + +func testListBuckets(c *check.C, create func() CloudStorage) { + fs := create() + + // test empty list + buckets, err := fs.ListBuckets() + c.Assert(err, check.IsNil) + c.Assert(len(buckets), check.Equals, 0) + + // add one and test exists + err = fs.MakeBucket("bucket1", "") + c.Assert(err, check.IsNil) + + buckets, err = fs.ListBuckets() + c.Assert(len(buckets), check.Equals, 1) + c.Assert(err, check.IsNil) + + // add two and test exists + err = fs.MakeBucket("bucket2", "") + c.Assert(err, check.IsNil) + + buckets, err = fs.ListBuckets() + c.Assert(len(buckets), check.Equals, 2) + c.Assert(err, check.IsNil) + + // add three and test exists + prefix + err = fs.MakeBucket("bucket22", "") + + buckets, err = fs.ListBuckets() + c.Assert(len(buckets), check.Equals, 3) + c.Assert(err, check.IsNil) +} + +func testListBucketsOrder(c *check.C, create func() CloudStorage) { + // if implementation contains a map, order of map keys will vary. + // this ensures they return in the same order each time + for i := 0; i < 10; i++ { + fs := create() + // add one and test exists + err := fs.MakeBucket("bucket1", "") + c.Assert(err, check.IsNil) + err = fs.MakeBucket("bucket2", "") + c.Assert(err, check.IsNil) + buckets, err := fs.ListBuckets() + c.Assert(err, check.IsNil) + c.Assert(len(buckets), check.Equals, 2) + c.Assert(buckets[0].Name, check.Equals, "bucket1") + c.Assert(buckets[1].Name, check.Equals, "bucket2") + } +} + +func testListObjectsTestsForNonExistantBucket(c *check.C, create func() CloudStorage) { + fs := create() + resources := BucketResourcesMetadata{Prefix: "", Maxkeys: 1000} + objects, resources, err := fs.ListObjects("bucket", resources) + c.Assert(err, check.Not(check.IsNil)) + c.Assert(resources.IsTruncated, check.Equals, false) + c.Assert(len(objects), check.Equals, 0) +} + +func testNonExistantObjectInBucket(c *check.C, create func() CloudStorage) { + fs := create() + err := fs.MakeBucket("bucket", "") + c.Assert(err, check.IsNil) + + var byteBuffer bytes.Buffer + length, err := fs.GetObject(&byteBuffer, "bucket", "dir1", 0, 0) + c.Assert(length, check.Equals, int64(0)) + c.Assert(err, check.Not(check.IsNil)) + c.Assert(len(byteBuffer.Bytes()), check.Equals, 0) + switch err := err.ToGoError().(type) { + case ObjectNotFound: + c.Assert(err, check.ErrorMatches, "Object not found: bucket#dir1") + default: + c.Assert(err, check.Equals, "fails") + } +} + +func testGetDirectoryReturnsObjectNotFound(c *check.C, create func() CloudStorage) { + fs := create() + err := fs.MakeBucket("bucket", "") + c.Assert(err, check.IsNil) + + _, err = fs.CreateObject("bucket", "dir1/dir2/object", "", int64(len("hello world")), bytes.NewBufferString("hello world"), nil) + c.Assert(err, check.IsNil) + + var byteBuffer bytes.Buffer + length, err := fs.GetObject(&byteBuffer, "bucket", "dir1", 0, 0) + c.Assert(length, check.Equals, int64(0)) + switch err := err.ToGoError().(type) { + case ObjectNotFound: + c.Assert(err.Bucket, check.Equals, "bucket") + c.Assert(err.Object, check.Equals, "dir1") + default: + // force a failure with a line number + c.Assert(err, check.Equals, "ObjectNotFound") + } + c.Assert(len(byteBuffer.Bytes()), check.Equals, 0) + + var byteBuffer2 bytes.Buffer + length, err = fs.GetObject(&byteBuffer, "bucket", "dir1/", 0, 0) + c.Assert(length, check.Equals, int64(0)) + switch err := err.ToGoError().(type) { + case ObjectNotFound: + c.Assert(err.Bucket, check.Equals, "bucket") + c.Assert(err.Object, check.Equals, "dir1/") + default: + // force a failure with a line number + c.Assert(err, check.Equals, "ObjectNotFound") + } + c.Assert(len(byteBuffer2.Bytes()), check.Equals, 0) +} + +func testDefaultContentType(c *check.C, create func() CloudStorage) { + fs := create() + err := fs.MakeBucket("bucket", "") + c.Assert(err, check.IsNil) + + // test empty + _, err = fs.CreateObject("bucket", "one", "", int64(len("one")), bytes.NewBufferString("one"), nil) + metadata, err := fs.GetObjectMetadata("bucket", "one") + c.Assert(err, check.IsNil) + c.Assert(metadata.ContentType, check.Equals, "application/octet-stream") +} + +func testContentMd5Set(c *check.C, create func() CloudStorage) { + fs := create() + err := fs.MakeBucket("bucket", "") + c.Assert(err, check.IsNil) + + // test md5 invalid + badmd5Sum := "NWJiZjVhNTIzMjhlNzQzOWFlNmU3MTlkZmU3MTIyMDA" + calculatedmd5sum, err := fs.CreateObject("bucket", "one", badmd5Sum, int64(len("one")), bytes.NewBufferString("one"), nil) + c.Assert(err, check.Not(check.IsNil)) + c.Assert(calculatedmd5sum, check.Not(check.Equals), badmd5Sum) + + goodmd5sum := "NWJiZjVhNTIzMjhlNzQzOWFlNmU3MTlkZmU3MTIyMDA=" + calculatedmd5sum, err = fs.CreateObject("bucket", "two", goodmd5sum, int64(len("one")), bytes.NewBufferString("one"), nil) + c.Assert(err, check.IsNil) + c.Assert(calculatedmd5sum, check.Equals, goodmd5sum) +} diff --git a/pkg/fs/api_suite_windows_test.go b/pkg/fs/api_suite_windows_test.go new file mode 100644 index 000000000..8e71bd831 --- /dev/null +++ b/pkg/fs/api_suite_windows_test.go @@ -0,0 +1,511 @@ +// +build windows + +/* + * Minimalist Object Storage, (C) 2015 Minio, 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 fs + +import ( + "bytes" + "crypto/md5" + "encoding/base64" + "encoding/hex" + "encoding/xml" + "math/rand" + "strconv" + "time" + + "gopkg.in/check.v1" +) + +// APITestSuite - collection of API tests +func APITestSuite(c *check.C, create func() CloudStorage) { + testMakeBucket(c, create) + testMultipleObjectCreation(c, create) + testPaging(c, create) + testObjectOverwriteWorks(c, create) + testNonExistantBucketOperations(c, create) + testBucketMetadata(c, create) + testBucketRecreateFails(c, create) + testPutObjectInSubdir(c, create) + testListBuckets(c, create) + testListBucketsOrder(c, create) + testListObjectsTestsForNonExistantBucket(c, create) + testNonExistantObjectInBucket(c, create) + testGetDirectoryReturnsObjectNotFound(c, create) + testDefaultContentType(c, create) + testMultipartObjectCreation(c, create) + testMultipartObjectAbort(c, create) +} + +func testMakeBucket(c *check.C, create func() CloudStorage) { + fs := create() + err := fs.MakeBucket("bucket", "") + c.Assert(err, check.IsNil) +} + +func testMultipartObjectCreation(c *check.C, create func() CloudStorage) { + fs := create() + err := fs.MakeBucket("bucket", "") + c.Assert(err, check.IsNil) + uploadID, err := fs.NewMultipartUpload("bucket", "key") + c.Assert(err, check.IsNil) + + completedParts := CompleteMultipartUpload{} + completedParts.Part = make([]CompletePart, 0) + finalHasher := md5.New() + for i := 1; i <= 10; i++ { + randomPerm := rand.Perm(10) + randomString := "" + for _, num := range randomPerm { + randomString = randomString + strconv.Itoa(num) + } + + hasher := md5.New() + finalHasher.Write([]byte(randomString)) + hasher.Write([]byte(randomString)) + expectedmd5Sum := base64.StdEncoding.EncodeToString(hasher.Sum(nil)) + expectedmd5Sumhex := hex.EncodeToString(hasher.Sum(nil)) + + var calculatedmd5sum string + calculatedmd5sum, err = fs.CreateObjectPart("bucket", "key", uploadID, expectedmd5Sum, i, int64(len(randomString)), + bytes.NewBufferString(randomString), nil) + c.Assert(err, check.IsNil) + c.Assert(calculatedmd5sum, check.Equals, expectedmd5Sumhex) + completedParts.Part = append(completedParts.Part, CompletePart{PartNumber: i, ETag: calculatedmd5sum}) + } + finalExpectedmd5SumHex := hex.EncodeToString(finalHasher.Sum(nil)) + completedPartsBytes, e := xml.Marshal(completedParts) + c.Assert(e, check.IsNil) + objectMetadata, err := fs.CompleteMultipartUpload("bucket", "key", uploadID, bytes.NewReader(completedPartsBytes), nil) + c.Assert(err, check.IsNil) + c.Assert(objectMetadata.Md5, check.Equals, finalExpectedmd5SumHex) +} + +func testMultipartObjectAbort(c *check.C, create func() CloudStorage) { + fs := create() + err := fs.MakeBucket("bucket", "") + c.Assert(err, check.IsNil) + uploadID, err := fs.NewMultipartUpload("bucket", "key") + c.Assert(err, check.IsNil) + + parts := make(map[int]string) + for i := 1; i <= 10; i++ { + randomPerm := rand.Perm(10) + randomString := "" + for _, num := range randomPerm { + randomString = randomString + strconv.Itoa(num) + } + + hasher := md5.New() + hasher.Write([]byte(randomString)) + expectedmd5Sum := base64.StdEncoding.EncodeToString(hasher.Sum(nil)) + expectedmd5Sumhex := hex.EncodeToString(hasher.Sum(nil)) + + var calculatedmd5sum string + calculatedmd5sum, err = fs.CreateObjectPart("bucket", "key", uploadID, expectedmd5Sum, i, int64(len(randomString)), + bytes.NewBufferString(randomString), nil) + c.Assert(err, check.IsNil) + c.Assert(calculatedmd5sum, check.Equals, expectedmd5Sumhex) + parts[i] = calculatedmd5sum + } + err = fs.AbortMultipartUpload("bucket", "key", uploadID) + c.Assert(err, check.IsNil) +} + +func testMultipleObjectCreation(c *check.C, create func() CloudStorage) { + objects := make(map[string][]byte) + fs := create() + err := fs.MakeBucket("bucket", "") + c.Assert(err, check.IsNil) + for i := 0; i < 10; i++ { + randomPerm := rand.Perm(10) + randomString := "" + for _, num := range randomPerm { + randomString = randomString + strconv.Itoa(num) + } + + hasher := md5.New() + hasher.Write([]byte(randomString)) + expectedmd5Sum := base64.StdEncoding.EncodeToString(hasher.Sum(nil)) + expectedmd5Sumhex := hex.EncodeToString(hasher.Sum(nil)) + + key := "obj" + strconv.Itoa(i) + objects[key] = []byte(randomString) + objectMetadata, err := fs.CreateObject("bucket", key, expectedmd5Sum, int64(len(randomString)), bytes.NewBufferString(randomString), nil) + c.Assert(err, check.IsNil) + c.Assert(objectMetadata.Md5, check.Equals, expectedmd5Sumhex) + } + + for key, value := range objects { + var byteBuffer bytes.Buffer + _, err := fs.GetObject(&byteBuffer, "bucket", key, 0, 0) + c.Assert(err, check.IsNil) + c.Assert(byteBuffer.Bytes(), check.DeepEquals, value) + + metadata, err := fs.GetObjectMetadata("bucket", key) + c.Assert(err, check.IsNil) + c.Assert(metadata.Size, check.Equals, int64(len(value))) + } +} + +func testPaging(c *check.C, create func() CloudStorage) { + fs := create() + fs.MakeBucket("bucket", "") + resources := BucketResourcesMetadata{} + objects, resources, err := fs.ListObjects("bucket", resources) + c.Assert(err, check.IsNil) + c.Assert(len(objects), check.Equals, 0) + c.Assert(resources.IsTruncated, check.Equals, false) + // check before paging occurs + for i := 0; i < 5; i++ { + key := "obj" + strconv.Itoa(i) + _, err = fs.CreateObject("bucket", key, "", int64(len(key)), bytes.NewBufferString(key), nil) + c.Assert(err, check.IsNil) + resources.Maxkeys = 5 + resources.Prefix = "" + objects, resources, err = fs.ListObjects("bucket", resources) + c.Assert(err, check.IsNil) + c.Assert(len(objects), check.Equals, i+1) + c.Assert(resources.IsTruncated, check.Equals, false) + } + // check after paging occurs pages work + for i := 6; i <= 10; i++ { + key := "obj" + strconv.Itoa(i) + _, err = fs.CreateObject("bucket", key, "", int64(len(key)), bytes.NewBufferString(key), nil) + c.Assert(err, check.IsNil) + resources.Maxkeys = 5 + resources.Prefix = "" + objects, resources, err = fs.ListObjects("bucket", resources) + c.Assert(err, check.IsNil) + c.Assert(len(objects), check.Equals, 5) + c.Assert(resources.IsTruncated, check.Equals, true) + } + // check paging with prefix at end returns less objects + { + _, err = fs.CreateObject("bucket", "newPrefix", "", int64(len("prefix1")), bytes.NewBufferString("prefix1"), nil) + c.Assert(err, check.IsNil) + _, err = fs.CreateObject("bucket", "newPrefix2", "", int64(len("prefix2")), bytes.NewBufferString("prefix2"), nil) + c.Assert(err, check.IsNil) + resources.Prefix = "new" + resources.Maxkeys = 5 + objects, resources, err = fs.ListObjects("bucket", resources) + c.Assert(err, check.IsNil) + c.Assert(len(objects), check.Equals, 2) + } + + // check ordering of pages + { + resources.Prefix = "" + resources.Maxkeys = 1000 + objects, resources, err = fs.ListObjects("bucket", resources) + c.Assert(err, check.IsNil) + c.Assert(objects[0].Object, check.Equals, "newPrefix") + c.Assert(objects[1].Object, check.Equals, "newPrefix2") + c.Assert(objects[2].Object, check.Equals, "obj0") + c.Assert(objects[3].Object, check.Equals, "obj1") + c.Assert(objects[4].Object, check.Equals, "obj10") + } + + // check delimited results with delimiter and prefix + { + _, err = fs.CreateObject("bucket", "this/is/delimited", "", int64(len("prefix1")), bytes.NewBufferString("prefix1"), nil) + c.Assert(err, check.IsNil) + _, err = fs.CreateObject("bucket", "this/is/also/a/delimited/file", "", int64(len("prefix2")), bytes.NewBufferString("prefix2"), nil) + c.Assert(err, check.IsNil) + var prefixes []string + resources.CommonPrefixes = prefixes // allocate new everytime + resources.Delimiter = "\\" + resources.Prefix = "this\\is\\" + resources.Maxkeys = 10 + objects, resources, err = fs.ListObjects("bucket", resources) + c.Assert(err, check.IsNil) + c.Assert(len(objects), check.Equals, 1) + c.Assert(resources.CommonPrefixes[0], check.Equals, "this\\is\\also\\") + } + time.Sleep(time.Second) + + // check delimited results with delimiter without prefix + { + var prefixes []string + resources.CommonPrefixes = prefixes // allocate new everytime + resources.Delimiter = "\\" + resources.Prefix = "" + resources.Maxkeys = 1000 + objects, resources, err = fs.ListObjects("bucket", resources) + c.Assert(err, check.IsNil) + c.Assert(objects[0].Object, check.Equals, "newPrefix") + c.Assert(objects[1].Object, check.Equals, "newPrefix2") + c.Assert(objects[2].Object, check.Equals, "obj0") + c.Assert(objects[3].Object, check.Equals, "obj1") + c.Assert(objects[4].Object, check.Equals, "obj10") + c.Assert(resources.CommonPrefixes[0], check.Equals, "this\\") + } + + // check results with Marker + { + var prefixes []string + resources.CommonPrefixes = prefixes // allocate new everytime + resources.Prefix = "" + resources.Marker = "newPrefix" + resources.Delimiter = "" + resources.Maxkeys = 3 + objects, resources, err = fs.ListObjects("bucket", resources) + c.Assert(err, check.IsNil) + c.Assert(objects[0].Object, check.Equals, "newPrefix2") + c.Assert(objects[1].Object, check.Equals, "obj0") + c.Assert(objects[2].Object, check.Equals, "obj1") + } + // check ordering of results with prefix + { + resources.Prefix = "obj" + resources.Delimiter = "" + resources.Marker = "" + resources.Maxkeys = 1000 + objects, resources, err = fs.ListObjects("bucket", resources) + c.Assert(err, check.IsNil) + c.Assert(objects[0].Object, check.Equals, "obj0") + c.Assert(objects[1].Object, check.Equals, "obj1") + c.Assert(objects[2].Object, check.Equals, "obj10") + c.Assert(objects[3].Object, check.Equals, "obj2") + c.Assert(objects[4].Object, check.Equals, "obj3") + } + // check ordering of results with prefix and no paging + { + resources.Prefix = "new" + resources.Marker = "" + resources.Maxkeys = 5 + objects, resources, err = fs.ListObjects("bucket", resources) + c.Assert(err, check.IsNil) + c.Assert(objects[0].Object, check.Equals, "newPrefix") + c.Assert(objects[1].Object, check.Equals, "newPrefix2") + } +} + +func testObjectOverwriteWorks(c *check.C, create func() CloudStorage) { + fs := create() + fs.MakeBucket("bucket", "") + + hasher1 := md5.New() + hasher1.Write([]byte("one")) + md5Sum1 := base64.StdEncoding.EncodeToString(hasher1.Sum(nil)) + md5Sum1hex := hex.EncodeToString(hasher1.Sum(nil)) + objectMetadata, err := fs.CreateObject("bucket", "object", md5Sum1, int64(len("one")), bytes.NewBufferString("one"), nil) + c.Assert(err, check.IsNil) + c.Assert(md5Sum1hex, check.Equals, objectMetadata.Md5) + + hasher2 := md5.New() + hasher2.Write([]byte("three")) + md5Sum2 := base64.StdEncoding.EncodeToString(hasher2.Sum(nil)) + _, err = fs.CreateObject("bucket", "object", md5Sum2, int64(len("three")), bytes.NewBufferString("three"), nil) + c.Assert(err, check.IsNil) + + var bytesBuffer bytes.Buffer + length, err := fs.GetObject(&bytesBuffer, "bucket", "object", 0, 0) + c.Assert(err, check.IsNil) + c.Assert(length, check.Equals, int64(len("three"))) + c.Assert(string(bytesBuffer.Bytes()), check.Equals, "three") +} + +func testNonExistantBucketOperations(c *check.C, create func() CloudStorage) { + fs := create() + _, err := fs.CreateObject("bucket", "object", "", int64(len("one")), bytes.NewBufferString("one"), nil) + c.Assert(err, check.Not(check.IsNil)) +} + +func testBucketMetadata(c *check.C, create func() CloudStorage) { + fs := create() + err := fs.MakeBucket("string", "private") + c.Assert(err, check.IsNil) + + metadata, err := fs.GetBucketMetadata("string") + c.Assert(err, check.IsNil) + // On windows everything directory is always in public-read-write mode -- TODO need to handle this + c.Assert(metadata.ACL, check.Equals, BucketACL("public-read-write")) +} + +func testBucketRecreateFails(c *check.C, create func() CloudStorage) { + fs := create() + err := fs.MakeBucket("string", "private") + c.Assert(err, check.IsNil) + err = fs.MakeBucket("string", "private") + c.Assert(err, check.Not(check.IsNil)) +} + +func testPutObjectInSubdir(c *check.C, create func() CloudStorage) { + fs := create() + err := fs.MakeBucket("bucket", "private") + c.Assert(err, check.IsNil) + + hasher := md5.New() + hasher.Write([]byte("hello world")) + md5Sum1 := base64.StdEncoding.EncodeToString(hasher.Sum(nil)) + md5Sum1hex := hex.EncodeToString(hasher.Sum(nil)) + objectMetadata, err := fs.CreateObject("bucket", "dir1/dir2/object", md5Sum1, int64(len("hello world")), bytes.NewBufferString("hello world"), nil) + c.Assert(err, check.IsNil) + c.Assert(objectMetadata.Md5, check.Equals, md5Sum1hex) + + var bytesBuffer bytes.Buffer + length, err := fs.GetObject(&bytesBuffer, "bucket", "dir1/dir2/object", 0, 0) + c.Assert(err, check.IsNil) + c.Assert(len(bytesBuffer.Bytes()), check.Equals, len("hello world")) + c.Assert(int64(len(bytesBuffer.Bytes())), check.Equals, length) +} + +func testListBuckets(c *check.C, create func() CloudStorage) { + fs := create() + + // test empty list + buckets, err := fs.ListBuckets() + c.Assert(err, check.IsNil) + c.Assert(len(buckets), check.Equals, 0) + + // add one and test exists + err = fs.MakeBucket("bucket1", "") + c.Assert(err, check.IsNil) + + buckets, err = fs.ListBuckets() + c.Assert(len(buckets), check.Equals, 1) + c.Assert(err, check.IsNil) + + // add two and test exists + err = fs.MakeBucket("bucket2", "") + c.Assert(err, check.IsNil) + + buckets, err = fs.ListBuckets() + c.Assert(len(buckets), check.Equals, 2) + c.Assert(err, check.IsNil) + + // add three and test exists + prefix + err = fs.MakeBucket("bucket22", "") + + buckets, err = fs.ListBuckets() + c.Assert(len(buckets), check.Equals, 3) + c.Assert(err, check.IsNil) +} + +func testListBucketsOrder(c *check.C, create func() CloudStorage) { + // if implementation contains a map, order of map keys will vary. + // this ensures they return in the same order each time + for i := 0; i < 10; i++ { + fs := create() + // add one and test exists + err := fs.MakeBucket("bucket1", "") + c.Assert(err, check.IsNil) + err = fs.MakeBucket("bucket2", "") + c.Assert(err, check.IsNil) + buckets, err := fs.ListBuckets() + c.Assert(err, check.IsNil) + c.Assert(len(buckets), check.Equals, 2) + c.Assert(buckets[0].Name, check.Equals, "bucket1") + c.Assert(buckets[1].Name, check.Equals, "bucket2") + } +} + +func testListObjectsTestsForNonExistantBucket(c *check.C, create func() CloudStorage) { + fs := create() + resources := BucketResourcesMetadata{Prefix: "", Maxkeys: 1000} + objects, resources, err := fs.ListObjects("bucket", resources) + c.Assert(err, check.Not(check.IsNil)) + c.Assert(resources.IsTruncated, check.Equals, false) + c.Assert(len(objects), check.Equals, 0) +} + +func testNonExistantObjectInBucket(c *check.C, create func() CloudStorage) { + fs := create() + err := fs.MakeBucket("bucket", "") + c.Assert(err, check.IsNil) + + var byteBuffer bytes.Buffer + length, err := fs.GetObject(&byteBuffer, "bucket", "dir1", 0, 0) + c.Assert(length, check.Equals, int64(0)) + c.Assert(err, check.Not(check.IsNil)) + c.Assert(len(byteBuffer.Bytes()), check.Equals, 0) + switch err := err.ToGoError().(type) { + case ObjectNotFound: + { + c.Assert(err, check.ErrorMatches, "Object not found: bucket#dir1") + } + default: + { + c.Assert(err, check.Equals, "fails") + } + } +} + +func testGetDirectoryReturnsObjectNotFound(c *check.C, create func() CloudStorage) { + fs := create() + err := fs.MakeBucket("bucket", "") + c.Assert(err, check.IsNil) + + _, err = fs.CreateObject("bucket", "dir1/dir2/object", "", int64(len("hello world")), bytes.NewBufferString("hello world"), nil) + c.Assert(err, check.IsNil) + + var byteBuffer bytes.Buffer + length, err := fs.GetObject(&byteBuffer, "bucket", "dir1", 0, 0) + c.Assert(length, check.Equals, int64(0)) + switch err := err.ToGoError().(type) { + case ObjectNotFound: + c.Assert(err.Bucket, check.Equals, "bucket") + c.Assert(err.Object, check.Equals, "dir1") + default: + // force a failure with a line number + c.Assert(err, check.Equals, "ObjectNotFound") + } + c.Assert(len(byteBuffer.Bytes()), check.Equals, 0) + + var byteBuffer2 bytes.Buffer + length, err = fs.GetObject(&byteBuffer, "bucket", "dir1/", 0, 0) + c.Assert(length, check.Equals, int64(0)) + switch err := err.ToGoError().(type) { + case ObjectNotFound: + c.Assert(err.Bucket, check.Equals, "bucket") + c.Assert(err.Object, check.Equals, "dir1/") + default: + // force a failure with a line number + c.Assert(err, check.Equals, "ObjectNotFound") + } + c.Assert(len(byteBuffer2.Bytes()), check.Equals, 0) +} + +func testDefaultContentType(c *check.C, create func() CloudStorage) { + fs := create() + err := fs.MakeBucket("bucket", "") + c.Assert(err, check.IsNil) + + // test empty + _, err = fs.CreateObject("bucket", "one", "", int64(len("one")), bytes.NewBufferString("one"), nil) + metadata, err := fs.GetObjectMetadata("bucket", "one") + c.Assert(err, check.IsNil) + c.Assert(metadata.ContentType, check.Equals, "application/octet-stream") +} + +func testContentMd5Set(c *check.C, create func() CloudStorage) { + fs := create() + err := fs.MakeBucket("bucket", "") + c.Assert(err, check.IsNil) + + // test md5 invalid + badmd5Sum := "NWJiZjVhNTIzMjhlNzQzOWFlNmU3MTlkZmU3MTIyMDA" + calculatedmd5sum, err := fs.CreateObject("bucket", "one", badmd5Sum, int64(len("one")), bytes.NewBufferString("one"), nil) + c.Assert(err, check.Not(check.IsNil)) + c.Assert(calculatedmd5sum, check.Not(check.Equals), badmd5Sum) + + goodmd5sum := "NWJiZjVhNTIzMjhlNzQzOWFlNmU3MTlkZmU3MTIyMDA=" + calculatedmd5sum, err = fs.CreateObject("bucket", "two", goodmd5sum, int64(len("one")), bytes.NewBufferString("one"), nil) + c.Assert(err, check.IsNil) + c.Assert(calculatedmd5sum, check.Equals, goodmd5sum) +} diff --git a/pkg/fs/config.go b/pkg/fs/config.go new file mode 100644 index 000000000..628c9c413 --- /dev/null +++ b/pkg/fs/config.go @@ -0,0 +1,85 @@ +/* + * Minio Cloud Storage, (C) 2015 Minio, 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 fs + +import ( + "os/user" + "path/filepath" + + "github.com/minio/minio-xl/pkg/probe" + "github.com/minio/minio-xl/pkg/quick" +) + +func getFSMultipartConfigPath() (string, *probe.Error) { + if customMultipartsConfigPath != "" { + return customMultipartsConfigPath, nil + } + u, err := user.Current() + if err != nil { + return "", probe.NewError(err) + } + fsMultipartsConfigPath := filepath.Join(u.HomeDir, ".minio", "multiparts.json") + return fsMultipartsConfigPath, nil +} + +// internal variable only accessed via get/set methods +var customConfigPath, customMultipartsConfigPath string + +// SetFSConfigPath - set custom fs config path +func SetFSConfigPath(configPath string) { + customConfigPath = configPath +} + +// SetFSMultipartsConfigPath - set custom multiparts session config path +func SetFSMultipartsConfigPath(configPath string) { + customMultipartsConfigPath = configPath +} + +// SaveMultipartsSession - save multiparts +func SaveMultipartsSession(multiparts *Multiparts) *probe.Error { + fsMultipartsConfigPath, err := getFSMultipartConfigPath() + if err != nil { + return err.Trace() + } + qc, err := quick.New(multiparts) + if err != nil { + return err.Trace() + } + if err := qc.Save(fsMultipartsConfigPath); err != nil { + return err.Trace() + } + return nil +} + +// loadMultipartsSession load multipart session file +func loadMultipartsSession() (*Multiparts, *probe.Error) { + fsMultipartsConfigPath, err := getFSMultipartConfigPath() + if err != nil { + return nil, err.Trace() + } + multiparts := &Multiparts{} + multiparts.Version = "1" + multiparts.ActiveSession = make(map[string]*MultipartSession) + qc, err := quick.New(multiparts) + if err != nil { + return nil, err.Trace() + } + if err := qc.Load(fsMultipartsConfigPath); err != nil { + return nil, err.Trace() + } + return qc.Data().(*Multiparts), nil +} diff --git a/pkg/donut/definitions.go b/pkg/fs/definitions.go similarity index 52% rename from pkg/donut/definitions.go rename to pkg/fs/definitions.go index 2fe1f8f1c..e9eb34b3b 100644 --- a/pkg/donut/definitions.go +++ b/pkg/fs/definitions.go @@ -1,5 +1,5 @@ /* - * Minio Cloud Storage, (C) 2015 Minio, Inc. + * Minimalist Object Storage, (C) 2015 Minio, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,70 +14,62 @@ * limitations under the License. */ -package donut +package fs -import "time" +import ( + "os" + "regexp" + "strings" + "time" + "unicode/utf8" +) -// ObjectMetadata container for object on donut system -type ObjectMetadata struct { - // version - Version string `json:"version"` +// BucketACL - bucket level access control +type BucketACL string - // object metadata - Created time.Time `json:"created"` - Bucket string `json:"bucket"` - Object string `json:"object"` - Size int64 `json:"size"` +// different types of ACL's currently supported for buckets +const ( + BucketPrivate = BucketACL("private") + BucketPublicRead = BucketACL("public-read") + BucketPublicReadWrite = BucketACL("public-read-write") +) - // erasure - DataDisks uint8 `json:"sys.erasureK"` - ParityDisks uint8 `json:"sys.erasureM"` - BlockSize int `json:"sys.blockSize"` - ChunkCount int `json:"sys.chunkCount"` - - // checksums - MD5Sum string `json:"sys.md5sum"` - SHA512Sum string `json:"sys.sha512sum"` - - // metadata - Metadata map[string]string `json:"metadata"` +func (b BucketACL) String() string { + return string(b) } -// Metadata container for donut metadata -type Metadata struct { - Version string `json:"version"` +// IsPrivate - is acl Private +func (b BucketACL) IsPrivate() bool { + return b == BucketACL("private") } -// AllBuckets container for all buckets -type AllBuckets struct { - Version string `json:"version"` - Buckets map[string]BucketMetadata `json:"buckets"` +// IsPublicRead - is acl PublicRead +func (b BucketACL) IsPublicRead() bool { + return b == BucketACL("public-read") } -// BucketMetadata container for bucket level metadata +// IsPublicReadWrite - is acl PublicReadWrite +func (b BucketACL) IsPublicReadWrite() bool { + return b == BucketACL("public-read-write") +} + +// BucketMetadata - name and create date type BucketMetadata struct { - Version string `json:"version"` - Name string `json:"name"` - ACL BucketACL `json:"acl"` - Created time.Time `json:"created"` - Multiparts map[string]MultiPartSession `json:"multiparts"` - Metadata map[string]string `json:"metadata"` - BucketObjects map[string]struct{} `json:"objects"` + Name string + Created time.Time + ACL BucketACL } -// ListObjectsResults container for list objects response -type ListObjectsResults struct { - Objects map[string]ObjectMetadata `json:"objects"` - CommonPrefixes []string `json:"commonPrefixes"` - IsTruncated bool `json:"isTruncated"` -} +// ObjectMetadata - object key and its relevant metadata +type ObjectMetadata struct { + Bucket string + Object string -// MultiPartSession multipart session -type MultiPartSession struct { - UploadID string `json:"uploadId"` - Initiated time.Time `json:"initiated"` - Parts map[string]PartMetadata `json:"parts"` - TotalParts int `json:"total-parts"` + ContentType string + Created time.Time + Mode os.FileMode + Md5 string + Size int64 } // PartMetadata - various types of individual part resources @@ -88,29 +80,10 @@ type PartMetadata struct { Size int64 } -// CompletePart - completed part container -type CompletePart struct { - PartNumber int - ETag string -} - -// completedParts is a sortable interface for Part slice -type completedParts []CompletePart - -func (a completedParts) Len() int { return len(a) } -func (a completedParts) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a completedParts) Less(i, j int) bool { return a[i].PartNumber < a[j].PartNumber } - -// CompleteMultipartUpload container for completing multipart upload -type CompleteMultipartUpload struct { - Part []CompletePart -} - // ObjectResourcesMetadata - various types of object resources type ObjectResourcesMetadata struct { Bucket string - EncodingType string - Key string + Object string UploadID string StorageClass string PartNumberMarker int @@ -118,12 +91,13 @@ type ObjectResourcesMetadata struct { MaxParts int IsTruncated bool - Part []*PartMetadata + Part []*PartMetadata + EncodingType string } // UploadMetadata container capturing metadata on in progress multipart upload in a given bucket type UploadMetadata struct { - Key string + Object string UploadID string StorageClass string Initiated time.Time @@ -155,3 +129,70 @@ type BucketResourcesMetadata struct { IsTruncated bool CommonPrefixes []string } + +// CompletePart - completed part container +type CompletePart struct { + PartNumber int + ETag string +} + +// completedParts is a sortable interface for Part slice +type completedParts []CompletePart + +func (a completedParts) Len() int { return len(a) } +func (a completedParts) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a completedParts) Less(i, j int) bool { return a[i].PartNumber < a[j].PartNumber } + +// CompleteMultipartUpload container for completing multipart upload +type CompleteMultipartUpload struct { + Part []CompletePart +} + +// IsValidBucketACL - is provided acl string supported +func IsValidBucketACL(acl string) bool { + switch acl { + case "private": + fallthrough + case "public-read": + fallthrough + case "public-read-write": + return true + case "": + // by default its "private" + return true + default: + return false + } +} + +// IsValidBucket - verify bucket name in accordance with +// - http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html +func IsValidBucket(bucket string) bool { + if len(bucket) < 3 || len(bucket) > 63 { + return false + } + if bucket[0] == '.' || bucket[len(bucket)-1] == '.' { + return false + } + if match, _ := regexp.MatchString("\\.\\.", bucket); match == true { + return false + } + // We don't support buckets with '.' in them + match, _ := regexp.MatchString("^[a-zA-Z][a-zA-Z0-9\\-]+[a-zA-Z0-9]$", bucket) + return match +} + +// IsValidObjectName - verify object name in accordance with +// - http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html +func IsValidObjectName(object string) bool { + if strings.TrimSpace(object) == "" { + return true + } + if len(object) > 1024 || len(object) == 0 { + return false + } + if !utf8.ValidString(object) { + return false + } + return true +} diff --git a/pkg/donut/errors.go b/pkg/fs/errors.go similarity index 86% rename from pkg/donut/errors.go rename to pkg/fs/errors.go index e5c97e803..d4ef4a1ff 100644 --- a/pkg/donut/errors.go +++ b/pkg/fs/errors.go @@ -14,10 +14,41 @@ * limitations under the License. */ -package donut +package fs import "fmt" +// MissingDateHeader date header missing +type MissingDateHeader struct{} + +func (e MissingDateHeader) Error() string { + return "Missing date header" +} + +// MissingExpiresQuery expires query string missing +type MissingExpiresQuery struct{} + +func (e MissingExpiresQuery) Error() string { + return "Missing expires query string" +} + +// ExpiredPresignedRequest request already expired +type ExpiredPresignedRequest struct{} + +func (e ExpiredPresignedRequest) Error() string { + return "Presigned request already expired" +} + +// SignatureDoesNotMatch invalid signature +type SignatureDoesNotMatch struct { + SignatureSent string + SignatureCalculated string +} + +func (e SignatureDoesNotMatch) Error() string { + return "The request signature we calculated does not match the signature you provided" +} + // InvalidArgument invalid argument type InvalidArgument struct{} @@ -43,22 +74,23 @@ func (e BucketNotFound) Error() string { return "Bucket not found: " + e.Bucket } -// ObjectExists object exists -type ObjectExists struct { - Object string +// BucketNotEmpty bucket is not empty +type BucketNotEmpty struct { + Bucket string } -func (e ObjectExists) Error() string { - return "Object exists: " + e.Object +func (e BucketNotEmpty) Error() string { + return "Bucket not empty: " + e.Bucket } // ObjectNotFound object does not exist type ObjectNotFound struct { + Bucket string Object string } func (e ObjectNotFound) Error() string { - return "Object not found: " + e.Object + return "Object not found: " + e.Bucket + "#" + e.Object } // ObjectCorrupted object found to be corrupted @@ -105,7 +137,11 @@ func (e InvalidDisksArgument) Error() string { } // BadDigest bad md5sum -type BadDigest struct{} +type BadDigest struct { + Md5 string + Bucket string + Object string +} func (e BadDigest) Error() string { return "Bad digest" @@ -190,9 +226,6 @@ func (e InvalidACL) Error() string { // BucketNameInvalid - bucketname provided is invalid type BucketNameInvalid GenericBucketError -// TooManyBuckets - total buckets exceeded -type TooManyBuckets GenericBucketError - /// Object related errors // EntityTooLarge - object size exceeds maximum limit @@ -245,11 +278,6 @@ func (e BucketNameInvalid) Error() string { return "Bucket name invalid: " + e.Bucket } -// Return string an error formatted as the given text -func (e TooManyBuckets) Error() string { - return "Bucket limit exceeded beyond 100, cannot create bucket: " + e.Bucket -} - // Return string an error formatted as the given text func (e ObjectNameInvalid) Error() string { return "Object name invalid: " + e.Bucket + "#" + e.Object diff --git a/pkg/fs/fs-common.go b/pkg/fs/fs-common.go new file mode 100644 index 000000000..549d57b4f --- /dev/null +++ b/pkg/fs/fs-common.go @@ -0,0 +1,75 @@ +/* + * Minio Cloud Storage, (C) 2015 Minio, 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 fs + +import ( + "bufio" + "bytes" + "os" + "sort" + "strings" + "time" +) + +// Metadata - carries metadata about object +type Metadata struct { + Md5sum []byte + ContentType string +} + +// sortUnique sort a slice in lexical order, removing duplicate elements +func sortUnique(objects []string) []string { + objectMap := make(map[string]string) + for _, v := range objects { + objectMap[v] = v + } + var results []string + for k := range objectMap { + results = append(results, k) + } + sort.Strings(results) + return results +} + +type contentInfo struct { + os.FileInfo + Prefix string + Size int64 + Mode os.FileMode + ModTime time.Time +} + +type bucketDir struct { + files []contentInfo + root string +} + +func delimiter(object, delimiter string) string { + readBuffer := bytes.NewBufferString(object) + reader := bufio.NewReader(readBuffer) + stringReader := strings.NewReader(delimiter) + delimited, _ := stringReader.ReadByte() + delimitedStr, _ := reader.ReadString(delimited) + return delimitedStr +} + +// byObjectMetadataKey is a sortable interface for UploadMetadata slice +type byUploadMetadataKey []*UploadMetadata + +func (b byUploadMetadataKey) Len() int { return len(b) } +func (b byUploadMetadataKey) Swap(i, j int) { b[i], b[j] = b[j], b[i] } +func (b byUploadMetadataKey) Less(i, j int) bool { return b[i].Object < b[j].Object } diff --git a/pkg/fs/fs-filter.go b/pkg/fs/fs-filter.go new file mode 100644 index 000000000..4bd72f2d6 --- /dev/null +++ b/pkg/fs/fs-filter.go @@ -0,0 +1,99 @@ +/* + * Minio Cloud Storage, (C) 2015 Minio, 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 fs + +import ( + "strings" + + "github.com/minio/minio-xl/pkg/probe" +) + +func (fs API) filterObjects(bucket string, content contentInfo, resources BucketResourcesMetadata) (ObjectMetadata, BucketResourcesMetadata, *probe.Error) { + var err *probe.Error + var metadata ObjectMetadata + + name := content.Prefix + switch true { + // Both delimiter and Prefix is present + case resources.Delimiter != "" && resources.Prefix != "": + if strings.HasPrefix(name, resources.Prefix) { + trimmedName := strings.TrimPrefix(name, resources.Prefix) + delimitedName := delimiter(trimmedName, resources.Delimiter) + switch true { + case name == resources.Prefix: + // Use resources.Prefix to filter out delimited file + metadata, err = getMetadata(fs.path, bucket, name) + if err != nil { + return ObjectMetadata{}, resources, err.Trace() + } + case delimitedName == content.FileInfo.Name(): + // Use resources.Prefix to filter out delimited files + metadata, err = getMetadata(fs.path, bucket, name) + if err != nil { + return ObjectMetadata{}, resources, err.Trace() + } + if metadata.Mode.IsDir() { + resources.CommonPrefixes = append(resources.CommonPrefixes, name+resources.Delimiter) + sortUnique(resources.CommonPrefixes) + return ObjectMetadata{}, resources, nil + } + case delimitedName != "": + resources.CommonPrefixes = append(resources.CommonPrefixes, resources.Prefix+delimitedName) + sortUnique(resources.CommonPrefixes) + } + } + // Delimiter present and Prefix is absent + case resources.Delimiter != "" && resources.Prefix == "": + delimitedName := delimiter(name, resources.Delimiter) + switch true { + case delimitedName == "": + metadata, err = getMetadata(fs.path, bucket, name) + if err != nil { + return ObjectMetadata{}, resources, err.Trace() + } + case delimitedName == content.FileInfo.Name(): + metadata, err = getMetadata(fs.path, bucket, name) + if err != nil { + return ObjectMetadata{}, resources, err.Trace() + } + if metadata.Mode.IsDir() { + resources.CommonPrefixes = append(resources.CommonPrefixes, name+resources.Delimiter) + sortUnique(resources.CommonPrefixes) + return ObjectMetadata{}, resources, nil + } + case delimitedName != "": + resources.CommonPrefixes = append(resources.CommonPrefixes, delimitedName) + sortUnique(resources.CommonPrefixes) + } + // Delimiter is absent and only Prefix is present + case resources.Delimiter == "" && resources.Prefix != "": + if strings.HasPrefix(name, resources.Prefix) { + // Do not strip prefix object output + metadata, err = getMetadata(fs.path, bucket, name) + if err != nil { + return ObjectMetadata{}, resources, err.Trace() + } + } + default: + metadata, err = getMetadata(fs.path, bucket, name) + if err != nil { + return ObjectMetadata{}, resources, err.Trace() + } + } + + return metadata, resources, nil +} diff --git a/pkg/fs/fs-multipart.go b/pkg/fs/fs-multipart.go new file mode 100644 index 000000000..383ed7bca --- /dev/null +++ b/pkg/fs/fs-multipart.go @@ -0,0 +1,537 @@ +/* + * Minio Cloud Storage, (C) 2015 Minio, 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 fs + +import ( + "bytes" + "crypto/md5" + "encoding/base64" + "encoding/hex" + "encoding/json" + "encoding/xml" + "errors" + "fmt" + "io" + "io/ioutil" + "math/rand" + "os" + "path/filepath" + "sort" + "strconv" + "strings" + "time" + + "github.com/minio/minio-xl/pkg/atomic" + "github.com/minio/minio-xl/pkg/crypto/sha256" + "github.com/minio/minio-xl/pkg/crypto/sha512" + "github.com/minio/minio-xl/pkg/probe" +) + +func (fs API) isValidUploadID(object, uploadID string) bool { + s, ok := fs.multiparts.ActiveSession[object] + if !ok { + return false + } + if uploadID == s.UploadID { + return true + } + return false +} + +// ListMultipartUploads - list incomplete multipart sessions for a given BucketMultipartResourcesMetadata +func (fs API) ListMultipartUploads(bucket string, resources BucketMultipartResourcesMetadata) (BucketMultipartResourcesMetadata, *probe.Error) { + fs.lock.Lock() + defer fs.lock.Unlock() + if !IsValidBucket(bucket) { + return BucketMultipartResourcesMetadata{}, probe.NewError(BucketNameInvalid{Bucket: bucket}) + } + bucketPath := filepath.Join(fs.path, bucket) + _, err := os.Stat(bucketPath) + // check bucket exists + if os.IsNotExist(err) { + return BucketMultipartResourcesMetadata{}, probe.NewError(BucketNotFound{Bucket: bucket}) + } + if err != nil { + return BucketMultipartResourcesMetadata{}, probe.NewError(InternalError{}) + } + var uploads []*UploadMetadata + for object, session := range fs.multiparts.ActiveSession { + if strings.HasPrefix(object, resources.Prefix) { + if len(uploads) > resources.MaxUploads { + sort.Sort(byUploadMetadataKey(uploads)) + resources.Upload = uploads + resources.NextKeyMarker = object + resources.NextUploadIDMarker = session.UploadID + resources.IsTruncated = true + return resources, nil + } + // uploadIDMarker is ignored if KeyMarker is empty + switch { + case resources.KeyMarker != "" && resources.UploadIDMarker == "": + if object > resources.KeyMarker { + upload := new(UploadMetadata) + upload.Object = object + upload.UploadID = session.UploadID + upload.Initiated = session.Initiated + uploads = append(uploads, upload) + } + case resources.KeyMarker != "" && resources.UploadIDMarker != "": + if session.UploadID > resources.UploadIDMarker { + if object >= resources.KeyMarker { + upload := new(UploadMetadata) + upload.Object = object + upload.UploadID = session.UploadID + upload.Initiated = session.Initiated + uploads = append(uploads, upload) + } + } + default: + upload := new(UploadMetadata) + upload.Object = object + upload.UploadID = session.UploadID + upload.Initiated = session.Initiated + uploads = append(uploads, upload) + } + } + } + sort.Sort(byUploadMetadataKey(uploads)) + resources.Upload = uploads + return resources, nil +} + +func (fs API) concatParts(parts *CompleteMultipartUpload, objectPath string, mw io.Writer) *probe.Error { + for _, part := range parts.Part { + recvMD5 := part.ETag + partFile, err := os.OpenFile(objectPath+fmt.Sprintf("$%d", part.PartNumber), os.O_RDONLY, 0600) + defer partFile.Close() + if err != nil { + return probe.NewError(err) + } + obj, err := ioutil.ReadAll(partFile) + if err != nil { + return probe.NewError(err) + } + calcMD5Bytes := md5.Sum(obj) + // complete multi part request header md5sum per part is hex encoded + recvMD5Bytes, err := hex.DecodeString(strings.Trim(recvMD5, "\"")) + if err != nil { + return probe.NewError(InvalidDigest{Md5: recvMD5}) + } + if !bytes.Equal(recvMD5Bytes, calcMD5Bytes[:]) { + return probe.NewError(BadDigest{Md5: recvMD5}) + } + _, err = io.Copy(mw, bytes.NewBuffer(obj)) + if err != nil { + return probe.NewError(err) + } + } + return nil +} + +// NewMultipartUpload - initiate a new multipart session +func (fs API) NewMultipartUpload(bucket, object string) (string, *probe.Error) { + fs.lock.Lock() + defer fs.lock.Unlock() + if !IsValidBucket(bucket) { + return "", probe.NewError(BucketNameInvalid{Bucket: bucket}) + } + if !IsValidObjectName(object) { + return "", probe.NewError(ObjectNameInvalid{Object: object}) + } + + bucketPath := filepath.Join(fs.path, bucket) + _, err := os.Stat(bucketPath) + // check bucket exists + if os.IsNotExist(err) { + return "", probe.NewError(BucketNotFound{Bucket: bucket}) + } + if err != nil { + return "", probe.NewError(InternalError{}) + } + objectPath := filepath.Join(bucketPath, object) + objectDir := filepath.Dir(objectPath) + if _, err = os.Stat(objectDir); os.IsNotExist(err) { + err = os.MkdirAll(objectDir, 0700) + if err != nil { + return "", probe.NewError(err) + } + } + + id := []byte(strconv.FormatInt(rand.Int63(), 10) + bucket + object + time.Now().String()) + uploadIDSum := sha512.Sum512(id) + uploadID := base64.URLEncoding.EncodeToString(uploadIDSum[:])[:47] + + multiPartfile, err := os.OpenFile(objectPath+"$multiparts", os.O_WRONLY|os.O_CREATE, 0600) + if err != nil { + return "", probe.NewError(err) + } + defer multiPartfile.Close() + + mpartSession := new(MultipartSession) + mpartSession.TotalParts = 0 + mpartSession.UploadID = uploadID + mpartSession.Initiated = time.Now().UTC() + var parts []*PartMetadata + mpartSession.Parts = parts + fs.multiparts.ActiveSession[object] = mpartSession + + encoder := json.NewEncoder(multiPartfile) + err = encoder.Encode(mpartSession) + if err != nil { + return "", probe.NewError(err) + } + if err := SaveMultipartsSession(fs.multiparts); err != nil { + return "", err.Trace() + } + return uploadID, nil +} + +// partNumber is a sortable interface for Part slice +type partNumber []*PartMetadata + +func (a partNumber) Len() int { return len(a) } +func (a partNumber) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a partNumber) Less(i, j int) bool { return a[i].PartNumber < a[j].PartNumber } + +// CreateObjectPart - create a part in a multipart session +func (fs API) CreateObjectPart(bucket, object, uploadID, expectedMD5Sum string, partID int, size int64, data io.Reader, signature *Signature) (string, *probe.Error) { + fs.lock.Lock() + defer fs.lock.Unlock() + + if partID <= 0 { + return "", probe.NewError(errors.New("invalid part id, cannot be zero or less than zero")) + } + // check bucket name valid + if !IsValidBucket(bucket) { + return "", probe.NewError(BucketNameInvalid{Bucket: bucket}) + } + + // verify object path legal + if !IsValidObjectName(object) { + return "", probe.NewError(ObjectNameInvalid{Bucket: bucket, Object: object}) + } + + if !fs.isValidUploadID(object, uploadID) { + return "", probe.NewError(InvalidUploadID{UploadID: uploadID}) + } + + if strings.TrimSpace(expectedMD5Sum) != "" { + expectedMD5SumBytes, err := base64.StdEncoding.DecodeString(strings.TrimSpace(expectedMD5Sum)) + if err != nil { + // pro-actively close the connection + return "", probe.NewError(InvalidDigest{Md5: expectedMD5Sum}) + } + expectedMD5Sum = hex.EncodeToString(expectedMD5SumBytes) + } + + bucketPath := filepath.Join(fs.path, bucket) + if _, err := os.Stat(bucketPath); err != nil { + // check bucket exists + if os.IsNotExist(err) { + return "", probe.NewError(BucketNotFound{Bucket: bucket}) + } + if err != nil { + return "", probe.NewError(InternalError{}) + } + } + + objectPath := filepath.Join(bucketPath, object) + partPath := objectPath + fmt.Sprintf("$%d", partID) + partFile, err := atomic.FileCreate(partPath) + if err != nil { + return "", probe.NewError(err) + } + h := md5.New() + sh := sha256.New() + mw := io.MultiWriter(partFile, h, sh) + _, err = io.CopyN(mw, data, size) + if err != nil { + partFile.CloseAndPurge() + return "", probe.NewError(err) + } + md5sum := hex.EncodeToString(h.Sum(nil)) + // Verify if the written object is equal to what is expected, only if it is requested as such + if strings.TrimSpace(expectedMD5Sum) != "" { + if err := isMD5SumEqual(strings.TrimSpace(expectedMD5Sum), md5sum); err != nil { + partFile.CloseAndPurge() + return "", probe.NewError(BadDigest{Md5: expectedMD5Sum, Bucket: bucket, Object: object}) + } + } + if signature != nil { + ok, perr := signature.DoesSignatureMatch(hex.EncodeToString(sh.Sum(nil))) + if perr != nil { + partFile.CloseAndPurge() + return "", perr.Trace() + } + if !ok { + partFile.CloseAndPurge() + return "", probe.NewError(SignatureDoesNotMatch{}) + } + } + partFile.File.Sync() + partFile.Close() + + fi, err := os.Stat(partPath) + if err != nil { + return "", probe.NewError(err) + } + partMetadata := PartMetadata{} + partMetadata.ETag = md5sum + partMetadata.PartNumber = partID + partMetadata.Size = fi.Size() + partMetadata.LastModified = fi.ModTime() + + multiPartfile, err := os.OpenFile(objectPath+"$multiparts", os.O_RDWR|os.O_APPEND, 0600) + if err != nil { + return "", probe.NewError(err) + } + defer multiPartfile.Close() + + var deserializedMultipartSession MultipartSession + decoder := json.NewDecoder(multiPartfile) + err = decoder.Decode(&deserializedMultipartSession) + if err != nil { + return "", probe.NewError(err) + } + deserializedMultipartSession.Parts = append(deserializedMultipartSession.Parts, &partMetadata) + deserializedMultipartSession.TotalParts++ + fs.multiparts.ActiveSession[object] = &deserializedMultipartSession + + sort.Sort(partNumber(deserializedMultipartSession.Parts)) + encoder := json.NewEncoder(multiPartfile) + err = encoder.Encode(&deserializedMultipartSession) + if err != nil { + return "", probe.NewError(err) + } + return partMetadata.ETag, nil +} + +// CompleteMultipartUpload - complete a multipart upload and persist the data +func (fs API) CompleteMultipartUpload(bucket, object, uploadID string, data io.Reader, signature *Signature) (ObjectMetadata, *probe.Error) { + fs.lock.Lock() + defer fs.lock.Unlock() + + // check bucket name valid + if !IsValidBucket(bucket) { + return ObjectMetadata{}, probe.NewError(BucketNameInvalid{Bucket: bucket}) + } + + // verify object path legal + if !IsValidObjectName(object) { + return ObjectMetadata{}, probe.NewError(ObjectNameInvalid{Bucket: bucket, Object: object}) + } + + if !fs.isValidUploadID(object, uploadID) { + return ObjectMetadata{}, probe.NewError(InvalidUploadID{UploadID: uploadID}) + } + + bucketPath := filepath.Join(fs.path, bucket) + if _, err := os.Stat(bucketPath); err != nil { + // check bucket exists + if os.IsNotExist(err) { + return ObjectMetadata{}, probe.NewError(BucketNotFound{Bucket: bucket}) + } + return ObjectMetadata{}, probe.NewError(InternalError{}) + } + + objectPath := filepath.Join(bucketPath, object) + file, err := atomic.FileCreate(objectPath) + if err != nil { + return ObjectMetadata{}, probe.NewError(err) + } + h := md5.New() + mw := io.MultiWriter(file, h) + + partBytes, err := ioutil.ReadAll(data) + if err != nil { + file.CloseAndPurge() + return ObjectMetadata{}, probe.NewError(err) + } + if signature != nil { + sh := sha256.New() + sh.Write(partBytes) + ok, perr := signature.DoesSignatureMatch(hex.EncodeToString(sh.Sum(nil))) + if perr != nil { + file.CloseAndPurge() + return ObjectMetadata{}, probe.NewError(err) + } + if !ok { + file.CloseAndPurge() + return ObjectMetadata{}, probe.NewError(SignatureDoesNotMatch{}) + } + } + parts := &CompleteMultipartUpload{} + if err := xml.Unmarshal(partBytes, parts); err != nil { + file.CloseAndPurge() + return ObjectMetadata{}, probe.NewError(MalformedXML{}) + } + if !sort.IsSorted(completedParts(parts.Part)) { + file.CloseAndPurge() + return ObjectMetadata{}, probe.NewError(InvalidPartOrder{}) + } + + if err := fs.concatParts(parts, objectPath, mw); err != nil { + file.CloseAndPurge() + return ObjectMetadata{}, err.Trace() + } + + delete(fs.multiparts.ActiveSession, object) + for _, part := range parts.Part { + err = os.Remove(objectPath + fmt.Sprintf("$%d", part.PartNumber)) + if err != nil { + file.CloseAndPurge() + return ObjectMetadata{}, probe.NewError(err) + } + } + if err := os.Remove(objectPath + "$multiparts"); err != nil { + file.CloseAndPurge() + return ObjectMetadata{}, probe.NewError(err) + } + if err := SaveMultipartsSession(fs.multiparts); err != nil { + file.CloseAndPurge() + return ObjectMetadata{}, err.Trace() + } + file.File.Sync() + file.Close() + + st, err := os.Stat(objectPath) + if err != nil { + return ObjectMetadata{}, probe.NewError(err) + } + newObject := ObjectMetadata{ + Bucket: bucket, + Object: object, + Created: st.ModTime(), + Size: st.Size(), + ContentType: "application/octet-stream", + Md5: hex.EncodeToString(h.Sum(nil)), + } + return newObject, nil +} + +// ListObjectParts - list parts from incomplete multipart session for a given ObjectResourcesMetadata +func (fs API) ListObjectParts(bucket, object string, resources ObjectResourcesMetadata) (ObjectResourcesMetadata, *probe.Error) { + fs.lock.Lock() + defer fs.lock.Unlock() + + // check bucket name valid + if !IsValidBucket(bucket) { + return ObjectResourcesMetadata{}, probe.NewError(BucketNameInvalid{Bucket: bucket}) + } + + // verify object path legal + if !IsValidObjectName(object) { + return ObjectResourcesMetadata{}, probe.NewError(ObjectNameInvalid{Bucket: bucket, Object: object}) + } + + if !fs.isValidUploadID(object, resources.UploadID) { + return ObjectResourcesMetadata{}, probe.NewError(InvalidUploadID{UploadID: resources.UploadID}) + } + + objectResourcesMetadata := resources + objectResourcesMetadata.Bucket = bucket + objectResourcesMetadata.Object = object + var startPartNumber int + switch { + case objectResourcesMetadata.PartNumberMarker == 0: + startPartNumber = 1 + default: + startPartNumber = objectResourcesMetadata.PartNumberMarker + } + + bucketPath := filepath.Join(fs.path, bucket) + _, err := os.Stat(bucketPath) + // check bucket exists + if os.IsNotExist(err) { + return ObjectResourcesMetadata{}, probe.NewError(BucketNotFound{Bucket: bucket}) + } + if err != nil { + return ObjectResourcesMetadata{}, probe.NewError(InternalError{}) + } + + objectPath := filepath.Join(bucketPath, object) + multiPartfile, err := os.OpenFile(objectPath+"$multiparts", os.O_RDONLY, 0600) + if err != nil { + return ObjectResourcesMetadata{}, probe.NewError(err) + } + defer multiPartfile.Close() + + var deserializedMultipartSession MultipartSession + decoder := json.NewDecoder(multiPartfile) + err = decoder.Decode(&deserializedMultipartSession) + if err != nil { + return ObjectResourcesMetadata{}, probe.NewError(err) + } + var parts []*PartMetadata + for i := startPartNumber; i <= deserializedMultipartSession.TotalParts; i++ { + if len(parts) > objectResourcesMetadata.MaxParts { + sort.Sort(partNumber(parts)) + objectResourcesMetadata.IsTruncated = true + objectResourcesMetadata.Part = parts + objectResourcesMetadata.NextPartNumberMarker = i + return objectResourcesMetadata, nil + } + parts = append(parts, deserializedMultipartSession.Parts[i-1]) + } + sort.Sort(partNumber(parts)) + objectResourcesMetadata.Part = parts + return objectResourcesMetadata, nil +} + +// AbortMultipartUpload - abort an incomplete multipart session +func (fs API) AbortMultipartUpload(bucket, object, uploadID string) *probe.Error { + fs.lock.Lock() + defer fs.lock.Unlock() + + // check bucket name valid + if !IsValidBucket(bucket) { + return probe.NewError(BucketNameInvalid{Bucket: bucket}) + } + + // verify object path legal + if !IsValidObjectName(object) { + return probe.NewError(ObjectNameInvalid{Bucket: bucket, Object: object}) + } + + if !fs.isValidUploadID(object, uploadID) { + return probe.NewError(InvalidUploadID{UploadID: uploadID}) + } + + bucketPath := filepath.Join(fs.path, bucket) + _, err := os.Stat(bucketPath) + // check bucket exists + if os.IsNotExist(err) { + return probe.NewError(BucketNotFound{Bucket: bucket}) + } + if err != nil { + return probe.NewError(InternalError{}) + } + + objectPath := filepath.Join(bucketPath, object) + for _, part := range fs.multiparts.ActiveSession[object].Parts { + err = os.RemoveAll(objectPath + fmt.Sprintf("$%d", part.PartNumber)) + if err != nil { + return probe.NewError(err) + } + } + delete(fs.multiparts.ActiveSession, object) + err = os.RemoveAll(objectPath + "$multiparts") + if err != nil { + return probe.NewError(err) + } + return nil +} diff --git a/pkg/fs/fs-object.go b/pkg/fs/fs-object.go new file mode 100644 index 000000000..044dad681 --- /dev/null +++ b/pkg/fs/fs-object.go @@ -0,0 +1,294 @@ +/* + * Minio Cloud Storage, (C) 2015 Minio, 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 fs + +import ( + "bytes" + "io" + "os" + "path/filepath" + "strings" + + "crypto/md5" + "encoding/base64" + "encoding/hex" + "errors" + "runtime" + + "github.com/minio/minio-xl/pkg/atomic" + "github.com/minio/minio-xl/pkg/crypto/sha256" + "github.com/minio/minio-xl/pkg/probe" +) + +/// Object Operations + +// GetObject - GET object +func (fs API) GetObject(w io.Writer, bucket, object string, start, length int64) (int64, *probe.Error) { + fs.lock.Lock() + defer fs.lock.Unlock() + + // validate bucket + if !IsValidBucket(bucket) { + return 0, probe.NewError(BucketNameInvalid{Bucket: bucket}) + } + + // validate object + if !IsValidObjectName(object) { + return 0, probe.NewError(ObjectNameInvalid{Bucket: bucket, Object: object}) + } + + objectPath := filepath.Join(fs.path, bucket, object) + filestat, err := os.Stat(objectPath) + switch err := err.(type) { + case nil: + if filestat.IsDir() { + return 0, probe.NewError(ObjectNotFound{Bucket: bucket, Object: object}) + } + default: + if os.IsNotExist(err) { + return 0, probe.NewError(ObjectNotFound{Bucket: bucket, Object: object}) + } + return 0, probe.NewError(err) + } + file, err := os.Open(objectPath) + if err != nil { + return 0, probe.NewError(err) + } + defer file.Close() + + _, err = file.Seek(start, os.SEEK_SET) + if err != nil { + return 0, probe.NewError(err) + } + + var count int64 + if length > 0 { + count, err = io.CopyN(w, file, length) + if err != nil { + return count, probe.NewError(err) + } + } else { + count, err = io.Copy(w, file) + if err != nil { + return count, probe.NewError(err) + } + } + return count, nil +} + +// GetObjectMetadata - HEAD object +func (fs API) GetObjectMetadata(bucket, object string) (ObjectMetadata, *probe.Error) { + fs.lock.Lock() + defer fs.lock.Unlock() + + if !IsValidBucket(bucket) { + return ObjectMetadata{}, probe.NewError(BucketNameInvalid{Bucket: bucket}) + } + + if !IsValidObjectName(object) { + return ObjectMetadata{}, probe.NewError(ObjectNameInvalid{Bucket: bucket, Object: bucket}) + } + + metadata, err := getMetadata(fs.path, bucket, object) + if err != nil { + return ObjectMetadata{}, err.Trace(bucket, object) + } + if metadata.Mode.IsDir() { + return ObjectMetadata{}, probe.NewError(ObjectNotFound{Bucket: bucket, Object: object}) + } + return metadata, nil +} + +func getMetadata(rootPath, bucket, object string) (ObjectMetadata, *probe.Error) { + // Do not use filepath.Join() since filepath.Join strips off any object names with '/', use them as is + // in a static manner so that we can send a proper 'ObjectNotFound' reply back upon os.Stat() + var objectPath string + if runtime.GOOS == "windows" { + objectPath = rootPath + "\\" + bucket + "\\" + object + } else { + objectPath = rootPath + "/" + bucket + "/" + object + } + stat, err := os.Stat(objectPath) + if err != nil { + if os.IsNotExist(err) { + return ObjectMetadata{}, probe.NewError(ObjectNotFound{Bucket: bucket, Object: object}) + } + return ObjectMetadata{}, probe.NewError(err) + } + contentType := "application/octet-stream" + metadata := ObjectMetadata{ + Bucket: bucket, + Object: object, + Created: stat.ModTime(), + Size: stat.Size(), + ContentType: contentType, + Mode: stat.Mode(), + } + return metadata, nil +} + +// isMD5SumEqual - returns error if md5sum mismatches, success its `nil` +func isMD5SumEqual(expectedMD5Sum, actualMD5Sum string) *probe.Error { + if strings.TrimSpace(expectedMD5Sum) != "" && strings.TrimSpace(actualMD5Sum) != "" { + expectedMD5SumBytes, err := hex.DecodeString(expectedMD5Sum) + if err != nil { + return probe.NewError(err) + } + actualMD5SumBytes, err := hex.DecodeString(actualMD5Sum) + if err != nil { + return probe.NewError(err) + } + if !bytes.Equal(expectedMD5SumBytes, actualMD5SumBytes) { + return probe.NewError(BadDigest{Md5: expectedMD5Sum}) + } + return nil + } + return probe.NewError(errors.New("invalid argument")) +} + +// CreateObject - PUT object +func (fs API) CreateObject(bucket, object, expectedMD5Sum string, size int64, data io.Reader, signature *Signature) (ObjectMetadata, *probe.Error) { + fs.lock.Lock() + defer fs.lock.Unlock() + + // check bucket name valid + if !IsValidBucket(bucket) { + return ObjectMetadata{}, probe.NewError(BucketNameInvalid{Bucket: bucket}) + } + // check bucket exists + if _, err := os.Stat(filepath.Join(fs.path, bucket)); os.IsNotExist(err) { + return ObjectMetadata{}, probe.NewError(BucketNotFound{Bucket: bucket}) + } + // verify object path legal + if !IsValidObjectName(object) { + return ObjectMetadata{}, probe.NewError(ObjectNameInvalid{Bucket: bucket, Object: object}) + } + + // get object path + objectPath := filepath.Join(fs.path, bucket, object) + if strings.TrimSpace(expectedMD5Sum) != "" { + expectedMD5SumBytes, err := base64.StdEncoding.DecodeString(strings.TrimSpace(expectedMD5Sum)) + if err != nil { + // pro-actively close the connection + return ObjectMetadata{}, probe.NewError(InvalidDigest{Md5: expectedMD5Sum}) + } + expectedMD5Sum = hex.EncodeToString(expectedMD5SumBytes) + } + + // write object + file, err := atomic.FileCreate(objectPath) + if err != nil { + return ObjectMetadata{}, probe.NewError(err) + } + + h := md5.New() + sh := sha256.New() + mw := io.MultiWriter(file, h, sh) + + if size > 0 { + _, err = io.CopyN(mw, data, size) + if err != nil { + file.CloseAndPurge() + return ObjectMetadata{}, probe.NewError(err) + } + } else { + _, err = io.Copy(mw, data) + if err != nil { + file.CloseAndPurge() + return ObjectMetadata{}, probe.NewError(err) + } + } + + md5Sum := hex.EncodeToString(h.Sum(nil)) + // Verify if the written object is equal to what is expected, only if it is requested as such + if strings.TrimSpace(expectedMD5Sum) != "" { + if err := isMD5SumEqual(strings.TrimSpace(expectedMD5Sum), md5Sum); err != nil { + file.CloseAndPurge() + return ObjectMetadata{}, probe.NewError(BadDigest{Md5: expectedMD5Sum, Bucket: bucket, Object: object}) + } + } + sha256Sum := hex.EncodeToString(sh.Sum(nil)) + if signature != nil { + ok, perr := signature.DoesSignatureMatch(sha256Sum) + if perr != nil { + file.CloseAndPurge() + return ObjectMetadata{}, perr.Trace() + } + if !ok { + file.CloseAndPurge() + return ObjectMetadata{}, probe.NewError(SignatureDoesNotMatch{}) + } + } + file.File.Sync() + file.Close() + + st, err := os.Stat(objectPath) + if err != nil { + return ObjectMetadata{}, probe.NewError(err) + } + newObject := ObjectMetadata{ + Bucket: bucket, + Object: object, + Created: st.ModTime(), + Size: st.Size(), + ContentType: "application/octet-stream", + Md5: md5Sum, + } + return newObject, nil +} + +// DeleteObject - delete and object +func (fs API) DeleteObject(bucket, object string) *probe.Error { + fs.lock.Lock() + defer fs.lock.Unlock() + + // check bucket name valid + if !IsValidBucket(bucket) { + return probe.NewError(BucketNameInvalid{Bucket: bucket}) + } + + // check bucket exists + if _, err := os.Stat(filepath.Join(fs.path, bucket)); os.IsNotExist(err) { + return probe.NewError(BucketNotFound{Bucket: bucket}) + } + + // verify object path legal + if !IsValidObjectName(object) { + return probe.NewError(ObjectNameInvalid{Bucket: bucket, Object: object}) + } + + // Do not use filepath.Join() since filepath.Join strips off any object names with '/', use them as is + // in a static manner so that we can send a proper 'ObjectNotFound' reply back upon os.Stat() + var objectPath string + if runtime.GOOS == "windows" { + objectPath = fs.path + "\\" + bucket + "\\" + object + } else { + objectPath = fs.path + "/" + bucket + "/" + object + } + + _, err := os.Stat(objectPath) + if err != nil { + if os.IsNotExist(err) { + return probe.NewError(ObjectNotFound{Bucket: bucket, Object: object}) + } + return probe.NewError(err) + } + if err := os.Remove(objectPath); err != nil { + return probe.NewError(err) + } + return nil +} diff --git a/pkg/fs/fs.go b/pkg/fs/fs.go new file mode 100644 index 000000000..b9488ba92 --- /dev/null +++ b/pkg/fs/fs.go @@ -0,0 +1,435 @@ +/* + * Minio Cloud Storage, (C) 2015 Minio, 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 fs + +import ( + "os" + "runtime" + "strings" + "sync" + "time" + + "io/ioutil" + "path/filepath" + + "github.com/minio/minio-xl/pkg/probe" +) + +// API - local variables +type API struct { + path string + lock *sync.Mutex + multiparts *Multiparts +} + +// MultipartSession holds active session information +type MultipartSession struct { + TotalParts int + UploadID string + Initiated time.Time + Parts []*PartMetadata +} + +// Multiparts collection of many parts +type Multiparts struct { + Version string `json:"version"` + ActiveSession map[string]*MultipartSession `json:"activeSessions"` +} + +// New instantiate a new donut +func New(path string) (CloudStorage, *probe.Error) { + var err *probe.Error + // load multiparts session from disk + var multiparts *Multiparts + multiparts, err = loadMultipartsSession() + if err != nil { + if os.IsNotExist(err.ToGoError()) { + multiparts = &Multiparts{ + Version: "1", + ActiveSession: make(map[string]*MultipartSession), + } + if err := SaveMultipartsSession(multiparts); err != nil { + return nil, err.Trace() + } + } else { + return nil, err.Trace() + } + } + a := API{ + path: path, + lock: new(sync.Mutex), + } + a.multiparts = multiparts + return a, nil +} + +/// Bucket Operations + +// DeleteBucket - delete bucket +func (fs API) DeleteBucket(bucket string) *probe.Error { + fs.lock.Lock() + defer fs.lock.Unlock() + + // verify bucket path legal + if !IsValidBucket(bucket) { + return probe.NewError(BucketNameInvalid{Bucket: bucket}) + } + bucketDir := filepath.Join(fs.path, bucket) + // check bucket exists + if _, err := os.Stat(bucketDir); os.IsNotExist(err) { + return probe.NewError(BucketNotFound{Bucket: bucket}) + } + files, err := ioutil.ReadDir(bucketDir) + if err != nil { + return probe.NewError(err) + } + if len(files) > 0 { + return probe.NewError(BucketNotEmpty{Bucket: bucket}) + } + if err := os.Remove(bucketDir); err != nil { + return probe.NewError(err) + } + return nil +} + +// ListBuckets - Get service +func (fs API) ListBuckets() ([]BucketMetadata, *probe.Error) { + fs.lock.Lock() + defer fs.lock.Unlock() + + files, err := ioutil.ReadDir(fs.path) + if err != nil { + return []BucketMetadata{}, probe.NewError(err) + } + + var metadataList []BucketMetadata + for _, file := range files { + if !file.IsDir() { + // if files found ignore them + continue + } + if file.IsDir() { + // if directories found with odd names, skip them too + if !IsValidBucket(file.Name()) { + continue + } + } + + metadata := BucketMetadata{ + Name: file.Name(), + Created: file.ModTime(), + } + metadataList = append(metadataList, metadata) + } + return metadataList, nil +} + +// MakeBucket - PUT Bucket +func (fs API) MakeBucket(bucket, acl string) *probe.Error { + fs.lock.Lock() + defer fs.lock.Unlock() + + // verify bucket path legal + if !IsValidBucket(bucket) { + return probe.NewError(BucketNameInvalid{Bucket: bucket}) + } + + // get bucket path + bucketDir := filepath.Join(fs.path, bucket) + + // check if bucket exists + if _, err := os.Stat(bucketDir); err == nil { + return probe.NewError(BucketExists{ + Bucket: bucket, + }) + } + + // make bucket + err := os.Mkdir(bucketDir, aclToPerm(acl)) + if err != nil { + return probe.NewError(err) + } + return nil +} + +// GetBucketMetadata - +func (fs API) GetBucketMetadata(bucket string) (BucketMetadata, *probe.Error) { + fs.lock.Lock() + defer fs.lock.Unlock() + if !IsValidBucket(bucket) { + return BucketMetadata{}, probe.NewError(BucketNameInvalid{Bucket: bucket}) + } + // get bucket path + bucketDir := filepath.Join(fs.path, bucket) + bucketMetadata := BucketMetadata{} + fi, err := os.Stat(bucketDir) + // check if bucket exists + if os.IsNotExist(err) { + return BucketMetadata{}, probe.NewError(BucketNotFound{Bucket: bucket}) + } + if err != nil { + return BucketMetadata{}, probe.NewError(err) + } + + bucketMetadata.Name = fi.Name() + bucketMetadata.Created = fi.ModTime() + bucketMetadata.ACL = permToACL(fi.Mode()) + return bucketMetadata, nil +} + +// permToACL - convert perm to meaningful ACL +func permToACL(mode os.FileMode) BucketACL { + switch mode.Perm() { + case os.FileMode(0700): + return BucketACL("private") + case os.FileMode(0500): + return BucketACL("public-read") + case os.FileMode(0777): + return BucketACL("public-read-write") + default: + return BucketACL("private") + } +} + +// aclToPerm - convert acl to filesystem mode +func aclToPerm(acl string) os.FileMode { + switch acl { + case "private": + return os.FileMode(0700) + case "public-read": + return os.FileMode(0500) + case "public-read-write": + return os.FileMode(0777) + default: + return os.FileMode(0700) + } +} + +// SetBucketMetadata - +func (fs API) SetBucketMetadata(bucket string, metadata map[string]string) *probe.Error { + fs.lock.Lock() + defer fs.lock.Unlock() + if !IsValidBucket(bucket) { + return probe.NewError(BucketNameInvalid{Bucket: bucket}) + } + acl := metadata["acl"] + if !IsValidBucketACL(acl) { + return probe.NewError(InvalidACL{ACL: acl}) + } + // get bucket path + bucketDir := filepath.Join(fs.path, bucket) + err := os.Chmod(bucketDir, aclToPerm(acl)) + if err != nil { + return probe.NewError(err) + } + return nil +} + +// ListObjects - GET bucket (list objects) +func (fs API) ListObjects(bucket string, resources BucketResourcesMetadata) ([]ObjectMetadata, BucketResourcesMetadata, *probe.Error) { + if !IsValidBucket(bucket) { + return nil, resources, probe.NewError(BucketNameInvalid{Bucket: bucket}) + } + if resources.Prefix != "" && IsValidObjectName(resources.Prefix) == false { + return nil, resources, probe.NewError(ObjectNameInvalid{Bucket: bucket, Object: resources.Prefix}) + } + + p := bucketDir{} + rootPrefix := filepath.Join(fs.path, bucket) + // check bucket exists + if _, err := os.Stat(rootPrefix); os.IsNotExist(err) { + return nil, resources, probe.NewError(BucketNotFound{Bucket: bucket}) + } + + p.root = rootPrefix + /// automatically treat "/" delimiter as "\\" delimiter on windows due to its path constraints. + if resources.Delimiter == "/" { + if runtime.GOOS == "windows" { + resources.Delimiter = "\\" + } + } + + // If delimiter is supplied make sure that paging doesn't go deep, treat it as simple directory listing. + if resources.Delimiter != "" { + files, err := ioutil.ReadDir(filepath.Join(rootPrefix, resources.Prefix)) + if err != nil { + if os.IsNotExist(err) { + return nil, resources, probe.NewError(ObjectNotFound{Bucket: bucket, Object: resources.Prefix}) + } + return nil, resources, probe.NewError(err) + } + for _, fl := range files { + prefix := fl.Name() + if resources.Prefix != "" { + prefix = filepath.Join(resources.Prefix, fl.Name()) + } + p.files = append(p.files, contentInfo{ + Prefix: prefix, + Size: fl.Size(), + Mode: fl.Mode(), + ModTime: fl.ModTime(), + FileInfo: fl, + }) + } + } else { + var files []contentInfo + getAllFiles := func(fp string, fl os.FileInfo, err error) error { + // If any error return back quickly + if err != nil { + return err + } + if strings.HasSuffix(fp, "$multiparts") { + return nil + } + // if file pointer equals to rootPrefix - discard it + if fp == p.root { + return nil + } + if len(files) > resources.Maxkeys { + return ErrSkipFile + } + // Split the root prefix from the incoming file pointer + realFp := "" + if runtime.GOOS == "windows" { + if splits := strings.Split(fp, p.root+"\\"); len(splits) > 1 { + realFp = splits[1] + } + } else { + if splits := strings.Split(fp, p.root+"/"); len(splits) > 1 { + realFp = splits[1] + } + } + // If path is a directory and has a prefix verify if the file pointer + // has the prefix if it does not skip the directory. + if fl.Mode().IsDir() { + if resources.Prefix != "" { + if !strings.HasPrefix(fp, filepath.Join(p.root, resources.Prefix)) { + return ErrSkipDir + } + } + } + // If path is a directory and has a marker verify if the file split file pointer + // is lesser than the Marker top level directory if yes skip it. + if fl.Mode().IsDir() { + if resources.Marker != "" { + if realFp != "" { + if runtime.GOOS == "windows" { + if realFp < strings.Split(resources.Marker, "\\")[0] { + return ErrSkipDir + } + } else { + if realFp < strings.Split(resources.Marker, "/")[0] { + return ErrSkipDir + } + } + } + } + } + // If regular file verify + if fl.Mode().IsRegular() { + // If marker is present this will be used to check if filepointer is + // lexically higher than then Marker + if realFp != "" { + if resources.Marker != "" { + if realFp > resources.Marker { + files = append(files, contentInfo{ + Prefix: realFp, + Size: fl.Size(), + Mode: fl.Mode(), + ModTime: fl.ModTime(), + FileInfo: fl, + }) + } + } else { + files = append(files, contentInfo{ + Prefix: realFp, + Size: fl.Size(), + Mode: fl.Mode(), + ModTime: fl.ModTime(), + FileInfo: fl, + }) + } + } + } + // If file is a symlink follow it and populate values. + if fl.Mode()&os.ModeSymlink == os.ModeSymlink { + st, err := os.Stat(fp) + if err != nil { + return nil + } + // If marker is present this will be used to check if filepointer is + // lexically higher than then Marker + if realFp != "" { + if resources.Marker != "" { + if realFp > resources.Marker { + files = append(files, contentInfo{ + Prefix: realFp, + Size: st.Size(), + Mode: st.Mode(), + ModTime: st.ModTime(), + FileInfo: st, + }) + } + } else { + files = append(files, contentInfo{ + Prefix: realFp, + Size: st.Size(), + Mode: st.Mode(), + ModTime: st.ModTime(), + FileInfo: st, + }) + } + } + } + p.files = files + return nil + } + // If no delimiter is specified, crawl through everything. + err := Walk(rootPrefix, getAllFiles) + if err != nil { + if os.IsNotExist(err) { + return nil, resources, probe.NewError(ObjectNotFound{Bucket: bucket, Object: resources.Prefix}) + } + return nil, resources, probe.NewError(err) + } + } + + var metadataList []ObjectMetadata + var metadata ObjectMetadata + + // Filter objects + for _, content := range p.files { + if len(metadataList) == resources.Maxkeys { + resources.IsTruncated = true + if resources.IsTruncated && resources.Delimiter != "" { + resources.NextMarker = metadataList[len(metadataList)-1].Object + } + break + } + if content.Prefix > resources.Marker { + var err *probe.Error + metadata, resources, err = fs.filterObjects(bucket, content, resources) + if err != nil { + return nil, resources, err.Trace() + } + if metadata.Bucket != "" { + metadataList = append(metadataList, metadata) + } + } + } + return metadataList, resources, nil +} diff --git a/pkg/tasker/taskctl_test.go b/pkg/fs/fs_test.go similarity index 54% rename from pkg/tasker/taskctl_test.go rename to pkg/fs/fs_test.go index 4dae9c0ea..bfdc83d3d 100644 --- a/pkg/tasker/taskctl_test.go +++ b/pkg/fs/fs_test.go @@ -1,7 +1,5 @@ /* - * Quick - Quick key value store for config files and persistent state files - * - * Minio Client (C) 2015 Minio, Inc. + * Minio Cloud Storage, (C) 2015 Minio, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,13 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package tasker_test + +package fs import ( + "io/ioutil" + "os" + "path/filepath" "testing" - "github.com/minio/minio/pkg/tasker" - . "gopkg.in/check.v1" ) @@ -31,8 +31,26 @@ type MySuite struct{} var _ = Suite(&MySuite{}) -func (s *MySuite) TestCheckData(c *C) { - testTasks := tasker.New("Test Task") - testTasks.Shutdown() - // c.Assert(err, Not(IsNil)) +func (s *MySuite) TestAPISuite(c *C) { + var storageList []string + create := func() CloudStorage { + configPath, err := ioutil.TempDir(os.TempDir(), "minio-") + c.Check(err, IsNil) + path, err := ioutil.TempDir(os.TempDir(), "minio-") + c.Check(err, IsNil) + SetFSMultipartsConfigPath(filepath.Join(configPath, "multiparts.json")) + storageList = append(storageList, path) + store, perr := New(path) + c.Check(perr, IsNil) + return store + } + APITestSuite(c, create) + defer removeRoots(c, storageList) +} + +func removeRoots(c *C, roots []string) { + for _, root := range roots { + err := os.RemoveAll(root) + c.Check(err, IsNil) + } } diff --git a/pkg/fs/interfaces.go b/pkg/fs/interfaces.go new file mode 100644 index 000000000..8189ab921 --- /dev/null +++ b/pkg/fs/interfaces.go @@ -0,0 +1,55 @@ +/* + * Minio Cloud Storage, (C) 2015 Minio, 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 fs + +import ( + "io" + + "github.com/minio/minio-xl/pkg/probe" +) + +// CloudStorage is a fs cloud storage interface +type CloudStorage interface { + // Storage service operations + GetBucketMetadata(bucket string) (BucketMetadata, *probe.Error) + SetBucketMetadata(bucket string, metadata map[string]string) *probe.Error + ListBuckets() ([]BucketMetadata, *probe.Error) + MakeBucket(bucket, acl string) *probe.Error + DeleteBucket(bucket string) *probe.Error + + // Bucket operations + ListObjects(bucket string, resources BucketResourcesMetadata) ([]ObjectMetadata, BucketResourcesMetadata, *probe.Error) + + // Object operations + GetObject(w io.Writer, bucket, object string, start, length int64) (int64, *probe.Error) + GetObjectMetadata(bucket, object string) (ObjectMetadata, *probe.Error) + // bucket, object, expectedMD5Sum, size, reader, metadata, signature + CreateObject(bucket, object, md5sum string, size int64, data io.Reader, signature *Signature) (ObjectMetadata, *probe.Error) + DeleteObject(bucket, object string) *probe.Error + + Multipart +} + +// Multipart API +type Multipart interface { + NewMultipartUpload(bucket, object string) (string, *probe.Error) + AbortMultipartUpload(bucket, object, uploadID string) *probe.Error + CreateObjectPart(bucket, object, uploadID, md5sum string, partID int, size int64, data io.Reader, signature *Signature) (string, *probe.Error) + CompleteMultipartUpload(bucket, object, uploadID string, data io.Reader, signature *Signature) (ObjectMetadata, *probe.Error) + ListMultipartUploads(bucket string, resources BucketMultipartResourcesMetadata) (BucketMultipartResourcesMetadata, *probe.Error) + ListObjectParts(bucket, object string, objectResources ObjectResourcesMetadata) (ObjectResourcesMetadata, *probe.Error) +} diff --git a/pkg/signature/postpolicyform.go b/pkg/fs/postpolicyform.go similarity index 98% rename from pkg/signature/postpolicyform.go rename to pkg/fs/postpolicyform.go index 3f33af661..17d16ca96 100644 --- a/pkg/signature/postpolicyform.go +++ b/pkg/fs/postpolicyform.go @@ -14,7 +14,7 @@ * limitations under the License. */ -package signature +package fs import ( "encoding/json" @@ -22,7 +22,7 @@ import ( "reflect" "time" - "github.com/minio/minio/pkg/probe" + "github.com/minio/minio-xl/pkg/probe" ) // toString - Safely convert interface to string without causing panic. diff --git a/pkg/signature/signature-v4.go b/pkg/fs/signature.go similarity index 99% rename from pkg/signature/signature-v4.go rename to pkg/fs/signature.go index c53c7e2b6..e53106ce0 100644 --- a/pkg/signature/signature-v4.go +++ b/pkg/fs/signature.go @@ -14,7 +14,7 @@ * limitations under the License. */ -package signature +package fs import ( "bytes" @@ -29,8 +29,8 @@ import ( "time" "unicode/utf8" - "github.com/minio/minio/pkg/crypto/sha256" - "github.com/minio/minio/pkg/probe" + "github.com/minio/minio-xl/pkg/crypto/sha256" + "github.com/minio/minio-xl/pkg/probe" ) // Signature - local variables diff --git a/pkg/fs/walk.go b/pkg/fs/walk.go new file mode 100644 index 000000000..519d0c412 --- /dev/null +++ b/pkg/fs/walk.go @@ -0,0 +1,108 @@ +/* + * Minio Cloud Storage, (C) 2015 Minio, 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 fs + +import ( + "errors" + "os" + "path/filepath" + "sort" +) + +// Walk walks the file tree rooted at root, calling walkFn for each file or +// directory in the tree, including root. +func Walk(root string, walkFn WalkFunc) error { + info, err := os.Lstat(root) + if err != nil { + return walkFn(root, nil, err) + } + return walk(root, info, walkFn) +} + +// readDirNames reads the directory named by dirname and returns +// a sorted list of directory entries. +func readDirNames(dirname string) ([]string, error) { + f, err := os.Open(dirname) + if err != nil { + return nil, err + } + names, err := f.Readdirnames(-1) + f.Close() + if err != nil { + return nil, err + } + sort.Strings(names) + return names, nil +} + +// WalkFunc is the type of the function called for each file or directory +// visited by Walk. The path argument contains the argument to Walk as a +// prefix; that is, if Walk is called with "dir", which is a directory +// containing the file "a", the walk function will be called with argument +// "dir/a". The info argument is the os.FileInfo for the named path. +type WalkFunc func(path string, info os.FileInfo, err error) error + +// ErrSkipDir is used as a return value from WalkFuncs to indicate that +// the directory named in the call is to be skipped. It is not returned +// as an error by any function. +var ErrSkipDir = errors.New("skip this directory") + +// ErrSkipFile is used as a return value from WalkFuncs to indicate that +// the file named in the call is to be skipped. It is not returned +// as an error by any function. +var ErrSkipFile = errors.New("skip this file") + +// walk recursively descends path, calling w. +func walk(path string, info os.FileInfo, walkFn WalkFunc) error { + err := walkFn(path, info, nil) + if err != nil { + if info.Mode().IsDir() && err == ErrSkipDir { + return nil + } + if info.Mode().IsRegular() && err == ErrSkipFile { + return nil + } + return err + } + + if !info.IsDir() { + return nil + } + + names, err := readDirNames(path) + if err != nil { + return walkFn(path, info, err) + } + for _, name := range names { + filename := filepath.Join(path, name) + fileInfo, err := os.Lstat(filename) + if err != nil { + if err := walkFn(filename, fileInfo, err); err != nil && err != ErrSkipDir && err != ErrSkipFile { + return err + } + } else { + err = walk(filename, fileInfo, walkFn) + if err != nil { + if err == ErrSkipDir || err == ErrSkipFile { + return nil + } + return err + } + } + } + return nil +} diff --git a/pkg/hash/crc32c/LICENSE b/pkg/hash/crc32c/LICENSE deleted file mode 100644 index d64569567..000000000 --- a/pkg/hash/crc32c/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - 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/pkg/hash/crc32c/crc32c_darwin.go b/pkg/hash/crc32c/crc32c_darwin.go deleted file mode 100644 index acd9d396f..000000000 --- a/pkg/hash/crc32c/crc32c_darwin.go +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2014 Minio, 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 crc32c - -import ( - "hash/crc32" - "io" -) - -var castanagoliTable = crc32.MakeTable(crc32.Castagnoli) - -/// Convenience functions - -// Sum32 - single caller crc helper -func Sum32(buffer []byte) uint32 { - crc := crc32.New(castanagoliTable) - crc.Reset() - crc.Write(buffer) - return crc.Sum32() -} - -// Sum - io.Reader based crc helper -func Sum(reader io.Reader) (uint32, error) { - h := crc32.New(castanagoliTable) - var err error - for err == nil { - length := 0 - byteBuffer := make([]byte, 1024*1024) - length, err = reader.Read(byteBuffer) - byteBuffer = byteBuffer[0:length] - h.Write(byteBuffer) - } - if err != io.EOF { - return 0, err - } - return h.Sum32(), nil -} diff --git a/pkg/hash/crc32c/crc32c_intel_linux.go b/pkg/hash/crc32c/crc32c_intel_linux.go deleted file mode 100644 index e089fb3e8..000000000 --- a/pkg/hash/crc32c/crc32c_intel_linux.go +++ /dev/null @@ -1,28 +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. -// Golang project: -// https://github.com/golang/go/blob/master/LICENSE - -// Using this part of Minio codebase under the license -// Apache License Version 2.0 with modifications - -// Package crc32 implements the 32-bit cyclic redundancy check, or CRC-32, -// checksum. See http://en.wikipedia.org/wiki/Cyclic_redundancy_check for -// information. - -package crc32c - -// #include -// uint32_t crc32c_pcl(uint8_t *buf, int32_t len, uint32_t prev_crc); -import "C" -import ( - "unsafe" -) - -func updateCastanagoliPCL(crc uint32, p []byte) uint32 { - if len(p) == 0 { - return 0 - } - return uint32(C.crc32c_pcl((*C.uint8_t)(unsafe.Pointer(&p[0])), C.int32_t(len(p)), C.uint32_t(crc))) -} diff --git a/pkg/hash/crc32c/crc32c_linux.S b/pkg/hash/crc32c/crc32c_linux.S deleted file mode 100644 index 2b4c9b272..000000000 --- a/pkg/hash/crc32c/crc32c_linux.S +++ /dev/null @@ -1,722 +0,0 @@ -/* - * Implement fast CRC32C with PCLMULQDQ instructions. (x86_64) - * - * The white papers on CRC32C calculations with PCLMULQDQ instruction can be - * downloaded from: - * http://www.intel.com/content/dam/www/public/us/en/documents/white-papers/crc-iscsi-polynomial-crc32-instruction-paper.pdf - * http://www.intel.com/content/dam/www/public/us/en/documents/white-papers/fast-crc-computation-paper.pdf - * - * Copyright (C) 2012 Intel Corporation. - * - * Authors: - * Wajdi Feghali - * James Guilford - * David Cote - * Tim Chen - * - * This software is available to you under a choice of one of two - * licenses. You may choose to be licensed under the terms of the GNU - * General Public License (GPL) Version 2, available from the file - * COPYING in the main directory of this source tree, or the - * OpenIB.org BSD license below: - * - * 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. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* ISCSI CRC 32 Implementation with crc32 and pclmulqdq Instruction */ - -#ifndef ENTRY -#define ENTRY(name) \ - .globl name ; \ - .align 4,0x90 ; \ - name: -#endif - -#ifndef END -#define END(name) \ - .size name, .-name -#endif - -#ifndef ENDPROC -#define ENDPROC(name) \ - .type name, @function ; \ - END(name) -#endif - -#define NUM_INVALID 100 - -#define TYPE_R32 0 -#define TYPE_R64 1 -#define TYPE_XMM 2 -#define TYPE_INVALID 100 - - .macro R32_NUM opd r32 - \opd = NUM_INVALID - .ifc \r32,%eax - \opd = 0 - .endif - .ifc \r32,%ecx - \opd = 1 - .endif - .ifc \r32,%edx - \opd = 2 - .endif - .ifc \r32,%ebx - \opd = 3 - .endif - .ifc \r32,%esp - \opd = 4 - .endif - .ifc \r32,%ebp - \opd = 5 - .endif - .ifc \r32,%esi - \opd = 6 - .endif - .ifc \r32,%edi - \opd = 7 - .endif -#ifdef X86_64 - .ifc \r32,%r8d - \opd = 8 - .endif - .ifc \r32,%r9d - \opd = 9 - .endif - .ifc \r32,%r10d - \opd = 10 - .endif - .ifc \r32,%r11d - \opd = 11 - .endif - .ifc \r32,%r12d - \opd = 12 - .endif - .ifc \r32,%r13d - \opd = 13 - .endif - .ifc \r32,%r14d - \opd = 14 - .endif - .ifc \r32,%r15d - \opd = 15 - .endif -#endif - .endm - - .macro R64_NUM opd r64 - \opd = NUM_INVALID -#ifdef X86_64 - .ifc \r64,%rax - \opd = 0 - .endif - .ifc \r64,%rcx - \opd = 1 - .endif - .ifc \r64,%rdx - \opd = 2 - .endif - .ifc \r64,%rbx - \opd = 3 - .endif - .ifc \r64,%rsp - \opd = 4 - .endif - .ifc \r64,%rbp - \opd = 5 - .endif - .ifc \r64,%rsi - \opd = 6 - .endif - .ifc \r64,%rdi - \opd = 7 - .endif - .ifc \r64,%r8 - \opd = 8 - .endif - .ifc \r64,%r9 - \opd = 9 - .endif - .ifc \r64,%r10 - \opd = 10 - .endif - .ifc \r64,%r11 - \opd = 11 - .endif - .ifc \r64,%r12 - \opd = 12 - .endif - .ifc \r64,%r13 - \opd = 13 - .endif - .ifc \r64,%r14 - \opd = 14 - .endif - .ifc \r64,%r15 - \opd = 15 - .endif -#endif - .endm - - .macro XMM_NUM opd xmm - \opd = NUM_INVALID - .ifc \xmm,%xmm0 - \opd = 0 - .endif - .ifc \xmm,%xmm1 - \opd = 1 - .endif - .ifc \xmm,%xmm2 - \opd = 2 - .endif - .ifc \xmm,%xmm3 - \opd = 3 - .endif - .ifc \xmm,%xmm4 - \opd = 4 - .endif - .ifc \xmm,%xmm5 - \opd = 5 - .endif - .ifc \xmm,%xmm6 - \opd = 6 - .endif - .ifc \xmm,%xmm7 - \opd = 7 - .endif - .ifc \xmm,%xmm8 - \opd = 8 - .endif - .ifc \xmm,%xmm9 - \opd = 9 - .endif - .ifc \xmm,%xmm10 - \opd = 10 - .endif - .ifc \xmm,%xmm11 - \opd = 11 - .endif - .ifc \xmm,%xmm12 - \opd = 12 - .endif - .ifc \xmm,%xmm13 - \opd = 13 - .endif - .ifc \xmm,%xmm14 - \opd = 14 - .endif - .ifc \xmm,%xmm15 - \opd = 15 - .endif - .endm - - .macro TYPE type reg - R32_NUM reg_type_r32 \reg - R64_NUM reg_type_r64 \reg - XMM_NUM reg_type_xmm \reg - .if reg_type_r64 <> NUM_INVALID - \type = TYPE_R64 - .elseif reg_type_r32 <> NUM_INVALID - \type = TYPE_R32 - .elseif reg_type_xmm <> NUM_INVALID - \type = TYPE_XMM - .else - \type = TYPE_INVALID - .endif - .endm - - .macro PFX_OPD_SIZE - .byte 0x66 - .endm - - .macro PFX_REX opd1 opd2 W=0 - .if ((\opd1 | \opd2) & 8) || \W - .byte 0x40 | ((\opd1 & 8) >> 3) | ((\opd2 & 8) >> 1) | (\W << 3) - .endif - .endm - - .macro MODRM mod opd1 opd2 - .byte \mod | (\opd1 & 7) | ((\opd2 & 7) << 3) - .endm - - .macro PSHUFB_XMM xmm1 xmm2 - XMM_NUM pshufb_opd1 \xmm1 - XMM_NUM pshufb_opd2 \xmm2 - PFX_OPD_SIZE - PFX_REX pshufb_opd1 pshufb_opd2 - .byte 0x0f, 0x38, 0x00 - MODRM 0xc0 pshufb_opd1 pshufb_opd2 - .endm - - .macro PCLMULQDQ imm8 xmm1 xmm2 - XMM_NUM clmul_opd1 \xmm1 - XMM_NUM clmul_opd2 \xmm2 - PFX_OPD_SIZE - PFX_REX clmul_opd1 clmul_opd2 - .byte 0x0f, 0x3a, 0x44 - MODRM 0xc0 clmul_opd1 clmul_opd2 - .byte \imm8 - .endm - - .macro PEXTRD imm8 xmm gpr - R32_NUM extrd_opd1 \gpr - XMM_NUM extrd_opd2 \xmm - PFX_OPD_SIZE - PFX_REX extrd_opd1 extrd_opd2 - .byte 0x0f, 0x3a, 0x16 - MODRM 0xc0 extrd_opd1 extrd_opd2 - .byte \imm8 - .endm - - .macro MOVQ_R64_XMM opd1 opd2 - TYPE movq_r64_xmm_opd1_type \opd1 - .if movq_r64_xmm_opd1_type == TYPE_XMM - XMM_NUM movq_r64_xmm_opd1 \opd1 - R64_NUM movq_r64_xmm_opd2 \opd2 - .else - R64_NUM movq_r64_xmm_opd1 \opd1 - XMM_NUM movq_r64_xmm_opd2 \opd2 - .endif - PFX_OPD_SIZE - PFX_REX movq_r64_xmm_opd1 movq_r64_xmm_opd2 1 - .if movq_r64_xmm_opd1_type == TYPE_XMM - .byte 0x0f, 0x7e - .else - .byte 0x0f, 0x6e - .endif - MODRM 0xc0 movq_r64_xmm_opd1 movq_r64_xmm_opd2 - .endm - -.macro LABEL prefix n -\prefix\n\(): -.endm - -.macro JMPTBL_ENTRY i -.word crc_\i - crc_array -.endm - -.macro JNC_LESS_THAN j - jnc less_than_\j -.endm - -# Define threshold where buffers are considered "small" and routed to more -# efficient "by-1" code. This "by-1" code only handles up to 255 bytes, so -# SMALL_SIZE can be no larger than 255. - -#define SMALL_SIZE 200 - -.if (SMALL_SIZE > 255) -.error "SMALL_ SIZE must be < 256" -.endif - -# unsigned int crc32c_pcl(u8 *buffer, int len, unsigned int crc_init); - -.text -ENTRY(crc32c_pcl) -#define bufp %rdi -#define bufp_dw %edi -#define bufp_w %di -#define bufp_b %dil -#define bufptmp %rcx -#define block_0 %rcx -#define block_1 %rdx -#define block_2 %r11 -#define len %rsi -#define len_dw %esi -#define len_w %si -#define len_b %sil -#define crc_init_arg %rdx -#define tmp %rbx -#define crc_init %r8 -#define crc_init_dw %r8d -#define crc1 %r9 -#define crc2 %r10 - - pushq %rbx - pushq %rdi - pushq %rsi - - ## Move crc_init for Linux to a different - mov crc_init_arg, crc_init - - ################################################################ - ## 1) ALIGN: - ################################################################ - - mov bufp, bufptmp # rdi = *buf - neg bufp - and $7, bufp # calculate the unalignment amount of - # the address - je proc_block # Skip if aligned - - ## If len is less than 8 and we're unaligned, we need to jump - ## to special code to avoid reading beyond the end of the buffer - cmp $8, len - jae do_align - # less_than_8 expects length in upper 3 bits of len_dw - # less_than_8_post_shl1 expects length = carryflag * 8 + len_dw[31:30] - shl $32-3+1, len_dw - jmp less_than_8_post_shl1 - -do_align: - #### Calculate CRC of unaligned bytes of the buffer (if any) - movq (bufptmp), tmp # load a quadward from the buffer - add bufp, bufptmp # align buffer pointer for quadword - # processing - sub bufp, len # update buffer length -align_loop: - crc32b %bl, crc_init_dw # compute crc32 of 1-byte - shr $8, tmp # get next byte - dec bufp - jne align_loop - -proc_block: - - ################################################################ - ## 2) PROCESS BLOCKS: - ################################################################ - - ## compute num of bytes to be processed - movq len, tmp # save num bytes in tmp - - cmpq $128*24, len - jae full_block - -continue_block: - cmpq $SMALL_SIZE, len - jb small - - ## len < 128*24 - movq $2731, %rax # 2731 = ceil(2^16 / 24) - mul len_dw - shrq $16, %rax - - ## eax contains floor(bytes / 24) = num 24-byte chunks to do - - ## process rax 24-byte chunks (128 >= rax >= 0) - - ## compute end address of each block - ## block 0 (base addr + RAX * 8) - ## block 1 (base addr + RAX * 16) - ## block 2 (base addr + RAX * 24) - lea (bufptmp, %rax, 8), block_0 - lea (block_0, %rax, 8), block_1 - lea (block_1, %rax, 8), block_2 - - xor crc1, crc1 - xor crc2, crc2 - - ## branch into array - lea jump_table(%rip), bufp - movzwq (bufp, %rax, 2), len - offset=crc_array-jump_table - lea offset(bufp, len, 1), bufp - jmp *bufp - - ################################################################ - ## 2a) PROCESS FULL BLOCKS: - ################################################################ -full_block: - movq $128,%rax - lea 128*8*2(block_0), block_1 - lea 128*8*3(block_0), block_2 - add $128*8*1, block_0 - - xor crc1,crc1 - xor crc2,crc2 - - # Fall thruogh into top of crc array (crc_128) - - ################################################################ - ## 3) CRC Array: - ################################################################ - -crc_array: - i=128 -.rept 128-1 -.altmacro -LABEL crc_ %i -.noaltmacro - crc32q -i*8(block_0), crc_init - crc32q -i*8(block_1), crc1 - crc32q -i*8(block_2), crc2 - i=(i-1) -.endr - -.altmacro -LABEL crc_ %i -.noaltmacro - crc32q -i*8(block_0), crc_init - crc32q -i*8(block_1), crc1 -# SKIP crc32 -i*8(block_2), crc2 ; Don't do this one yet - - mov block_2, block_0 - - ################################################################ - ## 4) Combine three results: - ################################################################ - - lea (K_table-8)(%rip), bufp # first entry is for idx 1 - shlq $3, %rax # rax *= 8 - pmovzxdq (bufp,%rax), %xmm0 # 2 consts: K1:K2 - leal (%eax,%eax,2), %eax # rax *= 3 (total *24) - subq %rax, tmp # tmp -= rax*24 - - movq crc_init, %xmm1 # CRC for block 1 - PCLMULQDQ 0x00, %xmm0, %xmm1 # Multiply by K2 - - movq crc1, %xmm2 # CRC for block 2 - PCLMULQDQ 0x10, %xmm0, %xmm2 # Multiply by K1 - - pxor %xmm2,%xmm1 - movq %xmm1, %rax - xor -i*8(block_2), %rax - mov crc2, crc_init - crc32 %rax, crc_init - - ################################################################ - ## 5) Check for end: - ################################################################ - -LABEL crc_ 0 - mov tmp, len - cmp $128*24, tmp - jae full_block - cmp $24, tmp - jae continue_block - -less_than_24: - shl $32-4, len_dw # less_than_16 expects length - # in upper 4 bits of len_dw - jnc less_than_16 - crc32q (bufptmp), crc_init - crc32q 8(bufptmp), crc_init - jz do_return - add $16, bufptmp - # len is less than 8 if we got here - # less_than_8 expects length in upper 3 bits of len_dw - # less_than_8_post_shl1 expects length = carryflag * 8 + len_dw[31:30] - shl $2, len_dw - jmp less_than_8_post_shl1 - - ####################################################################### - ## 6) LESS THAN 256-bytes REMAIN AT THIS POINT (8-bits of len are full) - ####################################################################### -small: - shl $32-8, len_dw # Prepare len_dw for less_than_256 - j=256 -.rept 5 # j = {256, 128, 64, 32, 16} -.altmacro -LABEL less_than_ %j # less_than_j: Length should be in - # upper lg(j) bits of len_dw - j=(j/2) - shl $1, len_dw # Get next MSB - JNC_LESS_THAN %j -.noaltmacro - i=0 -.rept (j/8) - crc32q i(bufptmp), crc_init # Compute crc32 of 8-byte data - i=i+8 -.endr - jz do_return # Return if remaining length is zero - add $j, bufptmp # Advance buf -.endr - -less_than_8: # Length should be stored in - # upper 3 bits of len_dw - shl $1, len_dw -less_than_8_post_shl1: - jnc less_than_4 - crc32l (bufptmp), crc_init_dw # CRC of 4 bytes - jz do_return # return if remaining data is zero - add $4, bufptmp -less_than_4: # Length should be stored in - # upper 2 bits of len_dw - shl $1, len_dw - jnc less_than_2 - crc32w (bufptmp), crc_init_dw # CRC of 2 bytes - jz do_return # return if remaining data is zero - add $2, bufptmp -less_than_2: # Length should be stored in the MSB - # of len_dw - shl $1, len_dw - jnc less_than_1 - crc32b (bufptmp), crc_init_dw # CRC of 1 byte -less_than_1: # Length should be zero -do_return: - movq crc_init, %rax - popq %rsi - popq %rdi - popq %rbx - ret - - ################################################################ - ## jump table Table is 129 entries x 2 bytes each - ################################################################ -.align 4 -jump_table: - i=0 -.rept 129 -.altmacro -JMPTBL_ENTRY %i -.noaltmacro - i=i+1 -.endr - -ENDPROC(crc32c_pcl) - - ################################################################ - ## PCLMULQDQ tables - ## Table is 128 entries x 2 words (8 bytes) each - ################################################################ -.section .rotata, "a", %progbits -.align 8 -K_table: - .long 0x493c7d27, 0x00000001 - .long 0xba4fc28e, 0x493c7d27 - .long 0xddc0152b, 0xf20c0dfe - .long 0x9e4addf8, 0xba4fc28e - .long 0x39d3b296, 0x3da6d0cb - .long 0x0715ce53, 0xddc0152b - .long 0x47db8317, 0x1c291d04 - .long 0x0d3b6092, 0x9e4addf8 - .long 0xc96cfdc0, 0x740eef02 - .long 0x878a92a7, 0x39d3b296 - .long 0xdaece73e, 0x083a6eec - .long 0xab7aff2a, 0x0715ce53 - .long 0x2162d385, 0xc49f4f67 - .long 0x83348832, 0x47db8317 - .long 0x299847d5, 0x2ad91c30 - .long 0xb9e02b86, 0x0d3b6092 - .long 0x18b33a4e, 0x6992cea2 - .long 0xb6dd949b, 0xc96cfdc0 - .long 0x78d9ccb7, 0x7e908048 - .long 0xbac2fd7b, 0x878a92a7 - .long 0xa60ce07b, 0x1b3d8f29 - .long 0xce7f39f4, 0xdaece73e - .long 0x61d82e56, 0xf1d0f55e - .long 0xd270f1a2, 0xab7aff2a - .long 0xc619809d, 0xa87ab8a8 - .long 0x2b3cac5d, 0x2162d385 - .long 0x65863b64, 0x8462d800 - .long 0x1b03397f, 0x83348832 - .long 0xebb883bd, 0x71d111a8 - .long 0xb3e32c28, 0x299847d5 - .long 0x064f7f26, 0xffd852c6 - .long 0xdd7e3b0c, 0xb9e02b86 - .long 0xf285651c, 0xdcb17aa4 - .long 0x10746f3c, 0x18b33a4e - .long 0xc7a68855, 0xf37c5aee - .long 0x271d9844, 0xb6dd949b - .long 0x8e766a0c, 0x6051d5a2 - .long 0x93a5f730, 0x78d9ccb7 - .long 0x6cb08e5c, 0x18b0d4ff - .long 0x6b749fb2, 0xbac2fd7b - .long 0x1393e203, 0x21f3d99c - .long 0xcec3662e, 0xa60ce07b - .long 0x96c515bb, 0x8f158014 - .long 0xe6fc4e6a, 0xce7f39f4 - .long 0x8227bb8a, 0xa00457f7 - .long 0xb0cd4768, 0x61d82e56 - .long 0x39c7ff35, 0x8d6d2c43 - .long 0xd7a4825c, 0xd270f1a2 - .long 0x0ab3844b, 0x00ac29cf - .long 0x0167d312, 0xc619809d - .long 0xf6076544, 0xe9adf796 - .long 0x26f6a60a, 0x2b3cac5d - .long 0xa741c1bf, 0x96638b34 - .long 0x98d8d9cb, 0x65863b64 - .long 0x49c3cc9c, 0xe0e9f351 - .long 0x68bce87a, 0x1b03397f - .long 0x57a3d037, 0x9af01f2d - .long 0x6956fc3b, 0xebb883bd - .long 0x42d98888, 0x2cff42cf - .long 0x3771e98f, 0xb3e32c28 - .long 0xb42ae3d9, 0x88f25a3a - .long 0x2178513a, 0x064f7f26 - .long 0xe0ac139e, 0x4e36f0b0 - .long 0x170076fa, 0xdd7e3b0c - .long 0x444dd413, 0xbd6f81f8 - .long 0x6f345e45, 0xf285651c - .long 0x41d17b64, 0x91c9bd4b - .long 0xff0dba97, 0x10746f3c - .long 0xa2b73df1, 0x885f087b - .long 0xf872e54c, 0xc7a68855 - .long 0x1e41e9fc, 0x4c144932 - .long 0x86d8e4d2, 0x271d9844 - .long 0x651bd98b, 0x52148f02 - .long 0x5bb8f1bc, 0x8e766a0c - .long 0xa90fd27a, 0xa3c6f37a - .long 0xb3af077a, 0x93a5f730 - .long 0x4984d782, 0xd7c0557f - .long 0xca6ef3ac, 0x6cb08e5c - .long 0x234e0b26, 0x63ded06a - .long 0xdd66cbbb, 0x6b749fb2 - .long 0x4597456a, 0x4d56973c - .long 0xe9e28eb4, 0x1393e203 - .long 0x7b3ff57a, 0x9669c9df - .long 0xc9c8b782, 0xcec3662e - .long 0x3f70cc6f, 0xe417f38a - .long 0x93e106a4, 0x96c515bb - .long 0x62ec6c6d, 0x4b9e0f71 - .long 0xd813b325, 0xe6fc4e6a - .long 0x0df04680, 0xd104b8fc - .long 0x2342001e, 0x8227bb8a - .long 0x0a2a8d7e, 0x5b397730 - .long 0x6d9a4957, 0xb0cd4768 - .long 0xe8b6368b, 0xe78eb416 - .long 0xd2c3ed1a, 0x39c7ff35 - .long 0x995a5724, 0x61ff0e01 - .long 0x9ef68d35, 0xd7a4825c - .long 0x0c139b31, 0x8d96551c - .long 0xf2271e60, 0x0ab3844b - .long 0x0b0bf8ca, 0x0bf80dd2 - .long 0x2664fd8b, 0x0167d312 - .long 0xed64812d, 0x8821abed - .long 0x02ee03b2, 0xf6076544 - .long 0x8604ae0f, 0x6a45d2b2 - .long 0x363bd6b3, 0x26f6a60a - .long 0x135c83fd, 0xd8d26619 - .long 0x5fabe670, 0xa741c1bf - .long 0x35ec3279, 0xde87806c - .long 0x00bcf5f6, 0x98d8d9cb - .long 0x8ae00689, 0x14338754 - .long 0x17f27698, 0x49c3cc9c - .long 0x58ca5f00, 0x5bd2011f - .long 0xaa7c7ad5, 0x68bce87a - .long 0xb5cfca28, 0xdd07448e - .long 0xded288f8, 0x57a3d037 - .long 0x59f229bc, 0xdde8f5b9 - .long 0x6d390dec, 0x6956fc3b - .long 0x37170390, 0xa3e3e02c - .long 0x6353c1cc, 0x42d98888 - .long 0xc4584f5c, 0xd73c7bea - .long 0xf48642e9, 0x3771e98f - .long 0x531377e2, 0x80ff0093 - .long 0xdd35bc8d, 0xb42ae3d9 - .long 0xb25b29f2, 0x8fe4c34d - .long 0x9a5ede41, 0x2178513a - .long 0xa563905d, 0xdf99fc11 - .long 0x45cddf4e, 0xe0ac139e - .long 0xacfa3103, 0x6c23e841 - .long 0xa51b6135, 0x170076fa diff --git a/pkg/hash/crc32c/crc32c_linux.go b/pkg/hash/crc32c/crc32c_linux.go deleted file mode 100644 index 2033bdb08..000000000 --- a/pkg/hash/crc32c/crc32c_linux.go +++ /dev/null @@ -1,89 +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. -// Golang project: -// https://github.com/golang/go/blob/master/LICENSE - -// Using this part of Minio codebase under the license -// Apache License Version 2.0 with modifications - -// Package crc32 implements the 32-bit cyclic redundancy check, or CRC-32, -// checksum. See http://en.wikipedia.org/wiki/Cyclic_redundancy_check for -// information. - -package crc32c - -import ( - "hash" - "io" -) - -// The size of a CRC-32 checksum in bytes. -const Size = 4 - -// digest represents the partial evaluation of a checksum. -type digest struct { - crc uint32 -} - -// New creates a new hash.Hash32 computing the CRC-32 checksum -// using the polynomial represented by the Table. -func New() hash.Hash32 { - return &digest{crc: 0} -} - -// Return size of crc -func (d *digest) Size() int { return Size } - -// Stub -func (d *digest) BlockSize() int { return 1 } - -// Get crc in bytes -func (d *digest) Sum(in []byte) []byte { - s := d.crc - return append(in, byte(s>>24), byte(s>>16), byte(s>>8), byte(s)) -} - -// Sum32 - return current crc in digest object -func (d *digest) Sum32() uint32 { return d.crc } - -// Reset default crc -func (d *digest) Reset() { d.crc = 0 } - -// Update returns the result of adding the bytes in p to the crc. -func (d *digest) update(crc uint32, p []byte) uint32 { - return updateCastanagoliPCL(crc, p) -} - -// Write data -func (d *digest) Write(p []byte) (n int, err error) { - d.crc = d.update(d.crc, p) - return len(p), nil -} - -/// Convenience functions - -// Sum32 - single caller crc helper -func Sum32(data []byte) uint32 { - crc32 := New() - crc32.Reset() - crc32.Write(data) - return crc32.Sum32() -} - -// Sum - low memory footprint io.Reader based crc helper -func Sum(reader io.Reader) (uint32, error) { - h := New() - var err error - for err == nil { - length := 0 - byteBuffer := make([]byte, 1024*1024) - length, err = reader.Read(byteBuffer) - byteBuffer = byteBuffer[0:length] - h.Write(byteBuffer) - } - if err != io.EOF { - return 0, err - } - return h.Sum32(), nil -} diff --git a/pkg/hash/crc32c/crc32c_linux_test.go b/pkg/hash/crc32c/crc32c_linux_test.go deleted file mode 100644 index 83108a6b9..000000000 --- a/pkg/hash/crc32c/crc32c_linux_test.go +++ /dev/null @@ -1,80 +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. - -// Golang project: -// https://github.com/golang/go/blob/master/LICENSE - -// Using this part of Minio codebase under the license -// Apache License Version 2.0 with modifications - -package crc32c - -import ( - "testing" -) - -type test struct { - castagnoli uint32 - in string -} - -var golden = []test{ - {0x0, ""}, - {0x93ad1061, "a"}, - {0x13c35ee4, "ab"}, - {0x562f9ccd, "abc"}, - {0xdaaf41f6, "abcd"}, - {0x8122a0a2, "abcde"}, - {0x496937b, "abcdef"}, - {0x5d199e2c, "abcdefg"}, - {0x86bc933d, "abcdefgh"}, - {0x9639f15f, "abcdefghi"}, - {0x584645c, "abcdefghij"}, - {0x8c13a060, "Discard medicine more than two years old."}, - {0x629077d4, "He who has a shady past knows that nice guys finish last."}, - {0xd20036a4, "I wouldn't marry him with a ten foot pole."}, - {0xf283b768, "Free! Free!/A trip/to Mars/for 900/empty jars/Burma Shave"}, - {0x9cd61a9f, "The days of the digital watch are numbered. -Tom Stoppard"}, - {0x637702f5, "Nepal premier won't resign."}, - {0x6c595588, "For every action there is an equal and opposite government program."}, - {0x19532076, "His money is twice tainted: 'taint yours and 'taint mine."}, - {0x9b82c857, "There is no reason for any individual to have a computer in their home. -Ken Olsen, 1977"}, - {0x2b485952, "It's a tiny change to the code and not completely disgusting. - Bob Manchek"}, - {0xd3d0980c, "size: a.out: bad magic"}, - {0x12aad0bb, "The major problem is with sendmail. -Mark Horton"}, - {0x83a0339b, "Give me a rock, paper and scissors and I will move the world. CCFestoon"}, - {0x1eb28fde, "If the enemy is within range, then so are you."}, - {0xce34d559, "It's well we cannot hear the screams/That we create in others' dreams."}, - {0x71576691, "You remind me of a TV show, but that's all right: I watch it anyway."}, - {0x54bf536f, "C is as portable as Stonehedge!!"}, - {0x2313a94d, "Even if I could be Shakespeare, I think I should still choose to be Faraday. - A. Huxley"}, - {0x9d4e3629, "The fugacity of a constituent in a mixture of gases at a given temperature is proportional to its mole fraction. Lewis-Randall Rule"}, - {0xc9991fb9, "How can you write a big system without C++? -Paul Glick"}, -} - -func TestGolden(t *testing.T) { - for _, g := range golden { - s := Sum32([]byte(g.in)) - if s != g.castagnoli { - t.Errorf("Castagnoli(%s) = 0x%x want 0x%x", g.in, s, g.castagnoli) - } - } -} - -func BenchmarkCrc32KB(b *testing.B) { - b.SetBytes(1024) - data := make([]byte, 1024) - for i := range data { - data[i] = byte(i) - } - h := New() - in := make([]byte, 0, h.Size()) - - b.ResetTimer() - for i := 0; i < b.N; i++ { - h.Reset() - h.Write(data) - h.Sum(in) - } -} diff --git a/pkg/hash/crc32c/crc32c_windows.go b/pkg/hash/crc32c/crc32c_windows.go deleted file mode 100644 index acd9d396f..000000000 --- a/pkg/hash/crc32c/crc32c_windows.go +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2014 Minio, 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 crc32c - -import ( - "hash/crc32" - "io" -) - -var castanagoliTable = crc32.MakeTable(crc32.Castagnoli) - -/// Convenience functions - -// Sum32 - single caller crc helper -func Sum32(buffer []byte) uint32 { - crc := crc32.New(castanagoliTable) - crc.Reset() - crc.Write(buffer) - return crc.Sum32() -} - -// Sum - io.Reader based crc helper -func Sum(reader io.Reader) (uint32, error) { - h := crc32.New(castanagoliTable) - var err error - for err == nil { - length := 0 - byteBuffer := make([]byte, 1024*1024) - length, err = reader.Read(byteBuffer) - byteBuffer = byteBuffer[0:length] - h.Write(byteBuffer) - } - if err != io.EOF { - return 0, err - } - return h.Sum32(), nil -} diff --git a/pkg/hash/crc32c/doc.go b/pkg/hash/crc32c/doc.go deleted file mode 100644 index 279597f77..000000000 --- a/pkg/hash/crc32c/doc.go +++ /dev/null @@ -1,10 +0,0 @@ -// Package crc32c provides wrapper around Intel's fast CRC32C with PCLMULQDQ instructions. -// The white papers on CRC32C calculations with PCLMULQDQ instruction can be downloaded from: -// -// http://www.intel.com/content/dam/www/public/us/en/documents/white-papers/crc-iscsi-polynomial-crc32-instruction-paper.pdf -// http://www.intel.com/content/dam/www/public/us/en/documents/white-papers/fast-crc-computation-paper.pdf -// -// Example -// -// crc32c.Crc32c(value) - value can be any []byte, return value is uint32 value -package crc32c diff --git a/pkg/signature/errors.go b/pkg/signature/errors.go deleted file mode 100644 index 0801e5190..000000000 --- a/pkg/signature/errors.go +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 signature - -// MissingDateHeader date header missing -type MissingDateHeader struct{} - -func (e MissingDateHeader) Error() string { - return "Missing date header" -} - -// MissingExpiresQuery expires query string missing -type MissingExpiresQuery struct{} - -func (e MissingExpiresQuery) Error() string { - return "Missing expires query string" -} - -// ExpiredPresignedRequest request already expired -type ExpiredPresignedRequest struct{} - -func (e ExpiredPresignedRequest) Error() string { - return "Presigned request already expired" -} - -// DoesNotMatch invalid signature -type DoesNotMatch struct { - SignatureSent string - SignatureCalculated string -} - -func (e DoesNotMatch) Error() string { - return "The request signature we calculated does not match the signature you provided" -} diff --git a/pkg/tasker/commands.go b/pkg/tasker/commands.go deleted file mode 100644 index 032bd566c..000000000 --- a/pkg/tasker/commands.go +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 tasker - -// Command is number that uniquely identifies a command function. -type Command uint8 - -// Enumerate the task commands. -const ( - // CmdNOOP does nothing. It is a default placeholder. Uninitialized variable of this type will point to NOOP command by default. - CmdNOOP Command = iota - // CmdSignalEnd gracefully ends current task. Never ending tasks (loop over) or Batched jobs will not take the next iteration, - // but may finish the current state to completion. - CmdSignalEnd - // CmdSignalAbort ends the current task at hand immediately. It may still cleanup dangling issues quickly. - CmdSignalAbort - // CmdSignalSuspend suspends the current task. - CmdSignalSuspend - // CmdSignalResume resumes a suspended task. - CmdSignalResume - // CmdPriorityLow is optimized to conserve resources and complete the task at a slow pace. This option is ideal for batch processed tasks. - CmdPriorityLow - // CmdPriorityMedium is the default priority. It is a balanced option between resources and speed. - CmdPriorityMedium - // CmdPriorityHigh is optimized for speed. This option is ideal for short lived tasks (like meta-data related) that are latency sensitive. Use this option wisely. - CmdPriorityHigh - // CmdPrioritySuper is an exclusive priority. All tasks with priority lower than Super (including High) are paused - // temporarily until this task completes. Anytime you consider using this priority level, please seek for approval. - CmdPrioritySuper -) diff --git a/pkg/tasker/handle.go b/pkg/tasker/handle.go deleted file mode 100644 index c3330dede..000000000 --- a/pkg/tasker/handle.go +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 tasker - -import "github.com/minio/minio/pkg/probe" - -// Handle as the name suggests is a handle (self reference) to its -// own task structure. Task has limited privileges over itself. Only the -// task controller (TaskCtl) can manage the task by sending commands to -// the task over channels. -type Handle struct { - this taskRef - cmdCh <-chan Command // Channel to receive commands from TaskCtl. - statusCh chan<- status // Channel to send completion status and error (if any) to TaskCtl. - closeCh chan<- taskRef // Channel to notify the TaskCtl about ending this task. -} - -// Listen returns a channel to receive commands. -func (t Handle) Listen() <-chan Command { - return t.cmdCh -} - -// StatusDone acknowledges successful completion of a command. -func (t Handle) StatusDone() { - t.statusCh <- status{code: statusDone, err: nil} -} - -// StatusBusy rejects a command with busy status. -func (t Handle) StatusBusy() { - t.statusCh <- status{code: statusBusy, err: nil} -} - -// StatusFail returns failure status. -func (t Handle) StatusFail(err *probe.Error) { - t.statusCh <- status{code: statusFail, err: err} -} - -// Close notifies the TaskCtl about the end of this Task. Owner of the -// task must invoke Close() when it is done performing its job. -func (t Handle) Close() { - t.closeCh <- t.this -} diff --git a/pkg/tasker/status.go b/pkg/tasker/status.go deleted file mode 100644 index f1ed47eb3..000000000 --- a/pkg/tasker/status.go +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 tasker - -import "github.com/minio/minio/pkg/probe" - -// StatusCode denotes the completion status of a command. -type statusCode int8 - -// Enumerate task return status codes. -const ( - statusDone statusCode = iota - statusBusy - statusFail -) - -// Status returns the completion status and error (if any) of a command. -type status struct { - code statusCode // Completion code. - err *probe.Error // Error if any. -} diff --git a/pkg/tasker/task.go b/pkg/tasker/task.go deleted file mode 100644 index a3aa7ea63..000000000 --- a/pkg/tasker/task.go +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 tasker - -import ( - "container/list" - "sync" -) - -// NOTE: Task is a private entity. It is created and managed by TaskCtl -// entirely. Only TaskCtl and Handle objects are exposed outside. - -// taskRef is a unique reference ID to a task. It is assigned by the -// TaskCtl during the creation of a task. All tasfRef variables are -// named "this". -type taskRef *list.Element - -// Task is an abstract concept built on top of Go routines and -// channels. Tasks themselves are expected to co-operate and comply with -// the TaskCtl commands. - -type task struct { - mutex *sync.Mutex - - this taskRef // Refence to task entry in the TaskCtl's task list. - name string // Free form name. - priority Command // Current priority. - cmdCh chan Command // Channel to receive commands from TaskCtl. - statusCh chan status // Channel to send completion status and error (if any) to TaskCtl. - closeCh chan taskRef // Channel to notify the TaskCtl about ending this task. -} - -// NewTask creates a new task structure and returns a handle to -// it. Only the task controller has access to the task structure. The -// caller routine only receives a handle to its task structure. Task -// handle is like a reference to task self. Caller is expected to listen -// for commands from the task controller and comply with it co-operatively. -// this: Task reference is unique identifier assigned by the TaskCtl. -// name: Free form name of the task. Eg. "Late Night Disk Scrubber". -func newTask(name string) task { - return task{ - // this: Is set by the TaskCtl's NewTask function. - mutex: &sync.Mutex{}, - name: name, - priority: CmdPriorityMedium, - cmdCh: make(chan Command), - statusCh: make(chan status), - closeCh: make(chan taskRef), - } -} - -// getHandle returns a handle to the task. Handle has limited access to the task structure and it is safe to be exposed. -func (t task) getHandle() Handle { - t.mutex.Lock() - defer t.mutex.Unlock() - - // Make a handle with limited access to channels (only send or receive). - return Handle{ - cmdCh: t.cmdCh, - statusCh: t.statusCh, - closeCh: t.closeCh, - } -} - -// command method sends a command code to the task and returns its completion status. -func (t task) command(cmd Command) status { - t.mutex.Lock() - defer t.mutex.Unlock() - - t.cmdCh <- cmd - return <-t.statusCh -} - -// close releases all the resources held by this task. -func (t task) close() { - t.mutex.Lock() - defer t.mutex.Unlock() - - // Task can be ended in 2 ways. - // 1) Calling application invokes Handle.Close(). - // 2) TaskCtl.Shutdown() ending the task's life. - // In either case, task.close() is invoked only via the - // TaskCtl. Handle.Close() only sends a message to the TaskCtl to - // initiate a close call. - - close(t.cmdCh) - close(t.statusCh) - close(t.closeCh) -} diff --git a/pkg/tasker/taskctl.go b/pkg/tasker/taskctl.go deleted file mode 100644 index ab63f7b2e..000000000 --- a/pkg/tasker/taskctl.go +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 tasker - -import ( - "container/list" - "sync" -) - -// TaskCtl (Task Controller) is a framework to create and manage -// tasks. -type TaskCtl struct { - mutex *sync.Mutex // Lock - // List of tasks managed by this task controller. - tasks *list.List -} - -// New creates a new TaskCtl to create and control a collection of tasks. -// Single application can create multiple task controllers to manage different set of tasks separately. -func New(name string) *TaskCtl { - return &TaskCtl{ - mutex: &sync.Mutex{}, - tasks: list.New(), - } -} - -// NewTask creates a new task structure and returns a handle to it. Only the task controller -// has access to the task structure. The caller routine only receives a handle to its task structure. -// Task handle is like a reference to task self. Caller is expected to listen for commands from -// the task controller and comply with it co-operatively. -func (tc *TaskCtl) NewTask(name string) Handle { - tc.mutex.Lock() - defer tc.mutex.Unlock() - - // Create a new task. - tsk := newTask(name) - - // Register this task in the TaskCtl's tasklist and save the reference. - tsk.this = tc.tasks.PushBack(tsk) - - // Free task from the tasklist upon close call. - go func() { - // Release the tasks resources upon return of this function. - defer tsk.close() - - // Will be notified here upon task's end of life. - this := <-tsk.closeCh - - tc.mutex.Lock() - defer tc.mutex.Unlock() - - // Release the task structure from the task list. - tc.tasks.Remove(this) - }() - - // Return a handle to this task. - return tsk.getHandle() -} - -// Shutdown ends all tasks, including the suspended ones. -func (tc *TaskCtl) Shutdown() { - tc.mutex.Lock() - defer tc.mutex.Unlock() - - var wg sync.WaitGroup - - // End all tasks. - for e := tc.tasks.Front(); e != nil; e = e.Next() { - wg.Add(1) - thisTask := e.Value.(task) // Make a local copy for go routine. - // End tasks in background. Flow of events from here is as follows: thisTask.handle.Close() -> tc.NewTask() -> this.task.close(). - go func() { - thisTask.getHandle().Close() - wg.Done() - }() - } - - wg.Wait() // Wait for all tasks to end gracefully. - - // Reset the task pool. - tc.tasks = nil -} - -// Suspend puts all tasks to sleep. -func (tc *TaskCtl) Suspend() bool { - tc.mutex.Lock() - defer tc.mutex.Unlock() - - var wg sync.WaitGroup - - // If any one of the task fails to suspend, this flag will set to false. - statusAll := make([]status, tc.tasks.Len()) - - // Suspend all tasks. - i := 0 - for e := tc.tasks.Front(); e != nil; e = e.Next() { - wg.Add(1) - locTask := e.Value.(task) // Make a local copy for go routine. - locI := i // local i - // Suspend a task in background. - go func(locI int) { - defer wg.Done() - statusAll[locI] = locTask.command(CmdSignalSuspend) - }(locI) - i++ - } - - wg.Wait() // Wait for all tasks to suspend gracefully. - - for _, st := range statusAll { - if st.code != statusDone { - return false - } - } - return true -} - -// Resume wakes up all suspended task from sleep. -func (tc *TaskCtl) Resume() bool { - tc.mutex.Lock() - defer tc.mutex.Unlock() - - var wg sync.WaitGroup - - // If any one of the task fails to suspend, this flag will set to false. - statusAll := make([]status, tc.tasks.Len()) - - i := 0 - // Resume all suspended tasks. - for e := tc.tasks.Front(); e != nil; e = e.Next() { - wg.Add(1) - locTask := e.Value.(task) // Make a local copy for go routine. - locI := i // local i - // Resume a task in background. - go func(locI int) { - defer wg.Done() - statusAll[locI] = locTask.command(CmdSignalResume) - }(locI) - i++ - } - wg.Wait() // Wait for all tasks to resume. - - for _, st := range statusAll { - if st.code != statusDone { - return false - } - } - return true - -} diff --git a/routers.go b/routers.go index 776500789..ddb350af6 100644 --- a/routers.go +++ b/routers.go @@ -1,5 +1,5 @@ /* - * Minio Cloud Storage, (C) 2014 Minio, Inc. + * Minio Cloud Storage, (C) 2015 Minio, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,9 +20,7 @@ import ( "net/http" router "github.com/gorilla/mux" - jsonrpc "github.com/gorilla/rpc/v2" - "github.com/gorilla/rpc/v2/json" - "github.com/minio/minio/pkg/donut" + "github.com/minio/minio/pkg/fs" ) // registerAPI - register all the object API handlers to their respective paths @@ -50,28 +48,21 @@ func registerAPI(mux *router.Router, a API) { mux.HandleFunc("/{bucket}/{object:.*}", a.DeleteObjectHandler).Methods("DELETE") } -// APIOperation container for individual operations read by Ticket Master -type APIOperation struct { - ProceedCh chan struct{} -} - // API container for API and also carries OP (operation) channel type API struct { - OP chan APIOperation - Donut donut.Interface - Anonymous bool // do not checking for incoming signatures, allow all requests + Filesystem fs.CloudStorage + Anonymous bool // do not checking for incoming signatures, allow all requests } // getNewAPI instantiate a new minio API -func getNewAPI(anonymous bool) API { +func getNewAPI(path string, anonymous bool) API { // ignore errors for now - d, err := donut.New() - fatalIf(err.Trace(), "Instantiating donut failed.", nil) + fs, err := fs.New(path) + fatalIf(err.Trace(), "Instantiating filesystem failed.", nil) return API{ - OP: make(chan APIOperation), - Donut: d, - Anonymous: anonymous, + Filesystem: fs, + Anonymous: anonymous, } } @@ -89,45 +80,3 @@ func getAPIHandler(anonymous bool, api API) http.Handler { apiHandler := registerCustomMiddleware(mux, mwHandlers...) return apiHandler } - -func getServerRPCHandler(anonymous bool) http.Handler { - var mwHandlers = []MiddlewareHandler{ - TimeValidityHandler, - } - if !anonymous { - mwHandlers = append(mwHandlers, RPCSignatureHandler) - } - - s := jsonrpc.NewServer() - s.RegisterCodec(json.NewCodec(), "application/json") - s.RegisterService(new(serverRPCService), "Server") - s.RegisterService(new(donutRPCService), "Donut") - mux := router.NewRouter() - mux.Handle("/rpc", s) - - rpcHandler := registerCustomMiddleware(mux, mwHandlers...) - return rpcHandler -} - -// getControllerRPCHandler rpc handler for controller -func getControllerRPCHandler(anonymous bool) http.Handler { - var mwHandlers = []MiddlewareHandler{ - TimeValidityHandler, - } - if !anonymous { - mwHandlers = append(mwHandlers, RPCSignatureHandler) - } - - s := jsonrpc.NewServer() - codec := json.NewCodec() - s.RegisterCodec(codec, "application/json") - s.RegisterCodec(codec, "application/json; charset=UTF-8") - s.RegisterService(new(controllerRPCService), "Controller") - mux := router.NewRouter() - // Add new RPC services here - mux.Handle("/rpc", s) - mux.Handle("/{file:.*}", http.FileServer(assetFS())) - - rpcHandler := registerCustomMiddleware(mux, mwHandlers...) - return rpcHandler -} diff --git a/rpc-client.go b/rpc-client.go deleted file mode 100644 index 08cdd7065..000000000 --- a/rpc-client.go +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 main - -import ( - "bytes" - "encoding/hex" - "net/http" - "sort" - "strings" - "time" - - "github.com/gorilla/rpc/v2/json" - "github.com/minio/minio/pkg/probe" -) - -// rpcOperation RPC operation -type rpcOperation struct { - Method string - Request interface{} -} - -// rpcRequest rpc client request -type rpcRequest struct { - req *http.Request - transport http.RoundTripper -} - -// newRPCRequest initiate a new client RPC request -func newRPCRequest(config *AuthConfig, url string, op rpcOperation, transport http.RoundTripper) (*rpcRequest, *probe.Error) { - t := time.Now().UTC() - params, err := json.EncodeClientRequest(op.Method, op.Request) - if err != nil { - return nil, probe.NewError(err) - } - - body := bytes.NewReader(params) - req, err := http.NewRequest("POST", url, body) - if err != nil { - return nil, probe.NewError(err) - } - req.Header.Set("x-minio-date", t.Format(iso8601Format)) - - // save for subsequent use - hash := func() string { - sum256Bytes, _ := sum256Reader(body) - return hex.EncodeToString(sum256Bytes) - } - - hashedPayload := hash() - req.Header.Set("Content-Type", "application/json") - req.Header.Set("x-minio-content-sha256", hashedPayload) - - var headers []string - vals := make(map[string][]string) - for k, vv := range req.Header { - if _, ok := ignoredHeaders[http.CanonicalHeaderKey(k)]; ok { - continue // ignored header - } - headers = append(headers, strings.ToLower(k)) - vals[strings.ToLower(k)] = vv - } - headers = append(headers, "host") - sort.Strings(headers) - - var canonicalHeaders bytes.Buffer - for _, k := range headers { - canonicalHeaders.WriteString(k) - canonicalHeaders.WriteByte(':') - switch { - case k == "host": - canonicalHeaders.WriteString(req.URL.Host) - fallthrough - default: - for idx, v := range vals[k] { - if idx > 0 { - canonicalHeaders.WriteByte(',') - } - canonicalHeaders.WriteString(v) - } - canonicalHeaders.WriteByte('\n') - } - } - - signedHeaders := strings.Join(headers, ";") - - req.URL.RawQuery = strings.Replace(req.URL.Query().Encode(), "+", "%20", -1) - encodedPath := getURLEncodedName(req.URL.Path) - // convert any space strings back to "+" - encodedPath = strings.Replace(encodedPath, "+", "%20", -1) - - // - // canonicalRequest = - // \n - // \n - // \n - // \n - // \n - // - // - canonicalRequest := strings.Join([]string{ - req.Method, - encodedPath, - req.URL.RawQuery, - canonicalHeaders.String(), - signedHeaders, - hashedPayload, - }, "\n") - - scope := strings.Join([]string{ - t.Format(yyyymmdd), - "milkyway", - "rpc", - "rpc_request", - }, "/") - - stringToSign := rpcAuthHeaderPrefix + "\n" + t.Format(iso8601Format) + "\n" - stringToSign = stringToSign + scope + "\n" - stringToSign = stringToSign + hex.EncodeToString(sum256([]byte(canonicalRequest))) - - date := sumHMAC([]byte("MINIO"+config.Users["admin"].SecretAccessKey), []byte(t.Format(yyyymmdd))) - region := sumHMAC(date, []byte("milkyway")) - service := sumHMAC(region, []byte("rpc")) - signingKey := sumHMAC(service, []byte("rpc_request")) - - signature := hex.EncodeToString(sumHMAC(signingKey, []byte(stringToSign))) - - // final Authorization header - parts := []string{ - rpcAuthHeaderPrefix + " Credential=admin/" + scope, - "SignedHeaders=" + signedHeaders, - "Signature=" + signature, - } - auth := strings.Join(parts, ", ") - req.Header.Set("Authorization", auth) - - rpcReq := &rpcRequest{} - rpcReq.req = req - if transport == nil { - transport = http.DefaultTransport - } - rpcReq.transport = transport - return rpcReq, nil -} - -// Do - make a http connection -func (r rpcRequest) Do() (*http.Response, *probe.Error) { - resp, err := r.transport.RoundTrip(r.req) - if err != nil { - if err, ok := probe.UnwrapError(err); ok { - return nil, err.Trace() - } - return nil, probe.NewError(err) - } - return resp, nil -} - -// Get - get value of requested header -func (r rpcRequest) Get(key string) string { - return r.req.Header.Get(key) -} - -// Set - set value of a header key -func (r *rpcRequest) Set(key, value string) { - r.req.Header.Set(key, value) -} diff --git a/rpc-definitions.go b/rpc-definitions.go deleted file mode 100644 index f9860086a..000000000 --- a/rpc-definitions.go +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2014 Minio, 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 main - -//// In memory metadata - -//// RPC params - -// AuthArgs auth params -type AuthArgs struct { - User string `json:"user"` -} - -// DonutArg donut params -type DonutArg struct{} - -// ServerArg server params -type ServerArg struct{} - -// ControllerArgs controller params -type ControllerArgs struct { - Host string `json:"host"` // host or host:port - SSL bool `json:"ssl"` - ID string `json:"id"` -} - -//// RPC replies - -// ServerRep server reply container for Server.List -type ServerRep struct { - Host string `json:"host"` - ID string `json:"id"` -} - -// ControllerNetInfoRep array of ip/mask in the form: 172.17.42.1/16 -type ControllerNetInfoRep struct { - NetInfo []string `json:"netinfo"` -} - -// DefaultRep default reply -type DefaultRep struct { - Error error `json:"error"` - Message string `json:"message"` -} - -// ServerListRep collection of server replies -type ServerListRep struct { - List []ServerRep `json:"list"` -} - -// DiskStatsRep collection of disks -type DiskStatsRep struct { - Disks []string `json:"disks"` -} - -// MemStatsRep memory statistics of a server -type MemStatsRep struct { - Total uint64 `json:"total"` - Free uint64 `json:"free"` -} - -// Network metadata of a server -type Network struct { - Address string `json:"address"` - NetMask string `json:"netmask"` - Hostname string `json:"hostname"` - Ethernet string `json:"networkInterface"` -} - -// NetStatsRep network statistics of a server -type NetStatsRep struct { - Interfaces []Network `json:"interfaces"` -} - -// SysInfoRep system information of a server -type SysInfoRep struct { - Hostname string `json:"hostname"` - SysARCH string `json:"sysArch"` - SysOS string `json:"sysOS"` - SysCPUS int `json:"sysNcpus"` - Routines int `json:"goRoutines"` - GOVersion string `json:"goVersion"` -} - -// ListRep all servers list -type ListRep struct { - List []ServerRep `json:"list"` -} - -// VersionRep version reply -type VersionRep struct { - Version string `json:"version"` - BuildDate string `json:"buildDate"` - Architecture string `json:"arch"` - OperatingSystem string `json:"os"` -} - -// AuthRep reply with access keys and secret ids for the user -type AuthRep struct { - Name string `json:"name"` - AccessKeyID string `json:"accessKeyId"` - SecretAccessKey string `json:"secretAccessKey"` -} - -// DiscoverArgs array of IP addresses / names to discover -type DiscoverArgs struct { - Hosts []string `json:"hosts"` - Port int `json:"port"` - SSL bool `json:"bool"` -} - -// DiscoverRepEntry : Error is "" if there is no error -type DiscoverRepEntry struct { - Host string `json:"host"` - Error string `json:"error"` -} - -// DiscoverRep list of discovered hosts -type DiscoverRep struct { - Entry []DiscoverRepEntry `json:"entry"` -} - -// BucketStats bucket-name and storage used -type BucketStats struct { - Name string `json:"name"` - Used uint64 `json:"used"` -} - -// StorageStatsRep array of BucketStats -type StorageStatsRep struct { - Buckets []BucketStats `json:"bucketStats"` -} - -// RebalanceStatsRep rebalance information -type RebalanceStatsRep struct { - State map[string]string `json:"rebalanceState"` -} - -// ListNodesRep all nodes part of donut cluster -type ListNodesRep struct { - Nodes []struct { - Hostname string `json:"hostname"` - Address string `json:"address"` - ID string `json:"id"` - } `json:"nodes"` -} - -// DonutVersionRep reply donut on disk format version -type DonutVersionRep struct { - Version string `json:"version"` - Architecture string `json:"arch"` - OperatingSystem string `json:"os"` -} diff --git a/server-auth-common.go b/server-auth-common.go deleted file mode 100644 index abf07e0e1..000000000 --- a/server-auth-common.go +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 main - -import "regexp" - -// AccessID and SecretID length in bytes -const ( - MinioAccessID = 20 - MinioSecretID = 40 -) - -/// helpers - -// IsValidSecretKey - validate secret key -func IsValidSecretKey(secretAccessKey string) bool { - if secretAccessKey == "" { - return true - } - regex := regexp.MustCompile("^.{40}$") - return regex.MatchString(secretAccessKey) -} - -// IsValidAccessKey - validate access key -func IsValidAccessKey(accessKeyID string) bool { - if accessKeyID == "" { - return true - } - regex := regexp.MustCompile("^[A-Z0-9\\-\\.\\_\\~]{20}$") - return regex.MatchString(accessKeyID) -} diff --git a/server-main.go b/server-main.go index 8da3430c2..cef302298 100644 --- a/server-main.go +++ b/server-main.go @@ -18,35 +18,44 @@ package main import ( "crypto/tls" + "encoding/json" + "fmt" "net" "net/http" "os" + "runtime" "strings" + "github.com/fatih/color" "github.com/minio/cli" - "github.com/minio/minio/pkg/minhttp" - "github.com/minio/minio/pkg/probe" + "github.com/minio/minio-xl/pkg/minhttp" + "github.com/minio/minio-xl/pkg/probe" ) var serverCmd = cli.Command{ Name: "server", - Usage: "Start minio server.", + Usage: "Start Minio cloud storage server.", Action: serverMain, CustomHelpTemplate: `NAME: - minio {{.Name}} - {{.Description}} + minio {{.Name}} - {{.Usage}} USAGE: - minio {{.Name}} + minio {{.Name}} PATH EXAMPLES: - 1. Start minio server - $ minio {{.Name}} + 1. Start minio server on Linux. + $ minio {{.Name}} /home/shared + 2. Start minio server on Windows. + $ minio {{.Name}} C:\MyShare + + 3. Start minio server bound to a specific IP:PORT, when you have multiple network interfaces. + $ minio --address 192.168.1.101:9000 /home/shared `, } // configureAPIServer configure a new server instance -func configureAPIServer(conf minioConfig, apiHandler http.Handler) (*http.Server, *probe.Error) { +func configureAPIServer(conf fsConfig, apiHandler http.Handler) (*http.Server, *probe.Error) { // Minio server config apiServer := &http.Server{ Addr: conf.Address, @@ -88,88 +97,133 @@ func configureAPIServer(conf minioConfig, apiHandler http.Handler) (*http.Server } } + Println("Starting minio server:") for _, host := range hosts { if conf.TLS { - Printf("Starting minio server on: https://%s:%s, PID: %d\n", host, port, os.Getpid()) + Printf("Listening on https://%s:%s\n", host, port) } else { - Printf("Starting minio server on: http://%s:%s, PID: %d\n", host, port, os.Getpid()) + Printf("Listening on http://%s:%s\n", host, port) } } return apiServer, nil } -// configureServerRPC configure server rpc port -func configureServerRPC(conf minioConfig, rpcHandler http.Handler) (*http.Server, *probe.Error) { - // Minio server config - rpcServer := &http.Server{ - Addr: conf.RPCAddress, - Handler: rpcHandler, - MaxHeaderBytes: 1 << 20, - } - - if conf.TLS { - var err error - rpcServer.TLSConfig = &tls.Config{} - rpcServer.TLSConfig.Certificates = make([]tls.Certificate, 1) - rpcServer.TLSConfig.Certificates[0], err = tls.LoadX509KeyPair(conf.CertFile, conf.KeyFile) - if err != nil { - return nil, probe.NewError(err) - } - } - return rpcServer, nil -} - -// Start ticket master -func startTM(api API) { - for { - for op := range api.OP { - op.ProceedCh <- struct{}{} - } - } -} - // startServer starts an s3 compatible cloud storage server -func startServer(conf minioConfig) *probe.Error { - minioAPI := getNewAPI(conf.Anonymous) +func startServer(conf fsConfig) *probe.Error { + minioAPI := getNewAPI(conf.Path, conf.Anonymous) apiHandler := getAPIHandler(conf.Anonymous, minioAPI) apiServer, err := configureAPIServer(conf, apiHandler) if err != nil { return err.Trace() } - rpcServer, err := configureServerRPC(conf, getServerRPCHandler(conf.Anonymous)) - - // start ticket master - go startTM(minioAPI) - if err := minhttp.ListenAndServe(apiServer, rpcServer); err != nil { + if err := minhttp.ListenAndServe(apiServer); err != nil { return err.Trace() } return nil } -func getServerConfig(c *cli.Context) minioConfig { +func getServerConfig(c *cli.Context) fsConfig { certFile := c.GlobalString("cert") keyFile := c.GlobalString("key") if (certFile != "" && keyFile == "") || (certFile == "" && keyFile != "") { Fatalln("Both certificate and key are required to enable https.") } tls := (certFile != "" && keyFile != "") - return minioConfig{ - Address: c.GlobalString("address"), - RPCAddress: c.GlobalString("address-server-rpc"), - Anonymous: c.GlobalBool("anonymous"), - TLS: tls, - CertFile: certFile, - KeyFile: keyFile, - RateLimit: c.GlobalInt("ratelimit"), + return fsConfig{ + Address: c.GlobalString("address"), + Path: strings.TrimSpace(c.Args().First()), + Anonymous: c.GlobalBool("anonymous"), + TLS: tls, + CertFile: certFile, + KeyFile: keyFile, + RateLimit: c.GlobalInt("ratelimit"), } } +func getAuth() (*AuthConfig, *probe.Error) { + if err := createAuthConfigPath(); err != nil { + return nil, err.Trace() + } + config, err := loadAuthConfig() + if err != nil { + if os.IsNotExist(err.ToGoError()) { + // Initialize new config, since config file doesn't exist yet + config := &AuthConfig{} + config.Version = "1" + config.AccessKeyID = string(mustGenerateAccessKeyID()) + config.SecretAccessKey = string(mustGenerateSecretAccessKey()) + if err := saveAuthConfig(config); err != nil { + return nil, err.Trace() + } + return config, nil + } + return nil, err.Trace() + } + return config, nil +} + +type accessKeys struct { + *AuthConfig +} + +func (a accessKeys) String() string { + magenta := color.New(color.FgMagenta, color.Bold).SprintFunc() + white := color.New(color.FgWhite, color.Bold).SprintfFunc() + return fmt.Sprint(magenta("AccessKey: ") + white(a.AccessKeyID) + " " + magenta("SecretKey: ") + white(a.SecretAccessKey)) +} + +// JSON - json formatted output +func (a accessKeys) JSON() string { + b, err := json.Marshal(a) + errorIf(probe.NewError(err), "Unable to marshal json", nil) + return string(b) +} + +// fetchAuth first time authorization +func fetchAuth() *probe.Error { + conf, err := getAuth() + if err != nil { + return err.Trace() + } + if conf != nil { + if globalJSONFlag { + Println(accessKeys{conf}.JSON()) + } else { + Println() + Println(accessKeys{conf}) + } + } + if !globalJSONFlag { + Println("\nTo configure Minio Client.") + if runtime.GOOS == "windows" { + Println("\n\tDownload https://dl.minio.io:9000/updates/2015/Oct/" + runtime.GOOS + "-" + runtime.GOARCH + "/mc.exe") + Println("\t$ mc.exe config host add localhost:9000 " + conf.AccessKeyID + " " + conf.SecretAccessKey) + Println("\t$ mc.exe mb localhost/photobucket") + Println("\t$ mc.exe cp C:\\Photos... localhost/photobucket") + } else { + Println("\n\t$ wget https://dl.minio.io:9000/updates/2015/Oct/" + runtime.GOOS + "-" + runtime.GOARCH + "/mc") + Println("\t$ chmod 755 mc") + Println("\t$ ./mc config host add localhost:9000 " + conf.AccessKeyID + " " + conf.SecretAccessKey) + Println("\t$ ./mc mb localhost/photobucket") + Println("\t$ ./mc cp ~/Photos... localhost/photobucket") + } + Println() + } + return nil +} + func serverMain(c *cli.Context) { - if c.Args().Present() { + if !c.Args().Present() || c.Args().First() == "help" { cli.ShowCommandHelpAndExit(c, "server", 1) } + err := fetchAuth() + fatalIf(err.Trace(), "Failed to generate keys for minio.", nil) + + if _, err := os.Stat(c.Args().First()); err != nil { + fatalIf(probe.NewError(err), "Unable to validate the path", nil) + } apiServerConfig := getServerConfig(c) - err := startServer(apiServerConfig) + err = startServer(apiServerConfig) errorIf(err.Trace(), "Failed to start the minio server.", nil) } diff --git a/server-rpc.go b/server-rpc.go deleted file mode 100644 index dd95d31b3..000000000 --- a/server-rpc.go +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 main - -import ( - "net/http" - "os" - "runtime" - - "github.com/minio/minio/pkg/probe" -) - -type serverRPCService struct{} - -func (s *serverRPCService) Add(r *http.Request, arg *ServerArg, rep *ServerRep) error { - rep.Host = "192.168.1.1:9002" - rep.ID = "6F27CB16-493D-40FA-B035-2A2E5646066A" - return nil -} - -func (s *serverRPCService) MemStats(r *http.Request, arg *ServerArg, rep *MemStatsRep) error { - rep.Total = 64 * 1024 * 1024 * 1024 - rep.Free = 9 * 1024 * 1024 * 1024 - return nil -} - -func (s *serverRPCService) DiskStats(r *http.Request, arg *ServerArg, rep *DiskStatsRep) error { - rep.Disks = []string{"/mnt/disk1", "/mnt/disk2", "/mnt/disk3", "/mnt/disk4", "/mnt/disk5", "/mnt/disk6"} - return nil -} - -func (s *serverRPCService) SysInfo(r *http.Request, arg *ServerArg, rep *SysInfoRep) error { - rep.SysARCH = runtime.GOARCH - rep.SysOS = runtime.GOOS - rep.SysCPUS = runtime.NumCPU() - rep.Routines = runtime.NumGoroutine() - rep.GOVersion = runtime.Version() - var err error - rep.Hostname, err = os.Hostname() - if err != nil { - return probe.WrapError(probe.NewError(err)) - } - return nil -} - -func (s *serverRPCService) NetStats(r *http.Request, arg *ServerArg, rep *NetStatsRep) error { - rep.Interfaces = make([]Network, 0) - rep.Interfaces = append(rep.Interfaces, Network{Address: "192.168.1.1", NetMask: "255.255.255.0", Hostname: "hostname1", Ethernet: "eth0"}) - return nil -} - -func (s *serverRPCService) Version(r *http.Request, arg *ServerArg, rep *VersionRep) error { - rep.Version = "0.0.1" - rep.BuildDate = minioVersion - rep.Architecture = runtime.GOARCH - rep.OperatingSystem = runtime.GOOS - return nil -} diff --git a/server_auth_test.go b/server_auth_test.go deleted file mode 100644 index d93406336..000000000 --- a/server_auth_test.go +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2015 Minio, 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 main - -import . "gopkg.in/check.v1" - -type MySuite struct{} - -var _ = Suite(&MySuite{}) - -func (s *MySuite) TestAuth(c *C) { - secretID, err := generateSecretAccessKey() - c.Assert(err, IsNil) - - accessID, err := generateAccessKeyID() - c.Assert(err, IsNil) - - c.Assert(len(secretID), Equals, MinioSecretID) - c.Assert(len(accessID), Equals, MinioAccessID) - - c.Log(string(secretID)) - c.Log(string(accessID)) -} diff --git a/server_signV4_donut_cache_test.go b/server_fs_test.go similarity index 62% rename from server_signV4_donut_cache_test.go rename to server_fs_test.go index 79efb751f..369112d34 100644 --- a/server_signV4_donut_cache_test.go +++ b/server_fs_test.go @@ -1,5 +1,5 @@ /* - * Minio Cloud Storage, (C) 2014 Minio, Inc. + * Minio Cloud Storage, (C) 2015 Minio, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,11 +31,15 @@ import ( "net/http" "net/http/httptest" - "github.com/minio/minio/pkg/donut" + "github.com/minio/minio/pkg/fs" . "gopkg.in/check.v1" ) -type MyAPIDonutCacheSuite struct { +const ( + yyyymmdd = "20060102" +) + +type MyAPIFSCacheSuite struct { root string req *http.Request body io.ReadSeeker @@ -43,20 +47,22 @@ type MyAPIDonutCacheSuite struct { secretAccessKey string } -var _ = Suite(&MyAPIDonutCacheSuite{}) +var _ = Suite(&MyAPIFSCacheSuite{}) -var testAPIDonutCacheServer *httptest.Server +var testAPIFSCacheServer *httptest.Server -func (s *MyAPIDonutCacheSuite) SetUpSuite(c *C) { +func (s *MyAPIFSCacheSuite) SetUpSuite(c *C) { root, err := ioutil.TempDir(os.TempDir(), "api-") c.Assert(err, IsNil) s.root = root - conf := &donut.Config{} - conf.Version = "0.0.1" - conf.MaxSize = 100000 - donut.SetDonutConfigPath(filepath.Join(root, "donut.json")) - perr := donut.SaveConfig(conf) + fsroot, err := ioutil.TempDir(os.TempDir(), "api-") + c.Assert(err, IsNil) + + fs.SetFSMultipartsConfigPath(filepath.Join(root, "multiparts.json")) + multiparts := &fs.Multiparts{} + multiparts.ActiveSession = make(map[string]*fs.MultipartSession) + perr := fs.SaveMultipartsSession(multiparts) c.Assert(perr, IsNil) accessKeyID, perr := generateAccessKeyID() @@ -65,31 +71,63 @@ func (s *MyAPIDonutCacheSuite) SetUpSuite(c *C) { c.Assert(perr, IsNil) authConf := &AuthConfig{} - authConf.Users = make(map[string]*AuthUser) - authConf.Users[string(accessKeyID)] = &AuthUser{ - Name: "testuser", - AccessKeyID: string(accessKeyID), - SecretAccessKey: string(secretAccessKey), - } + authConf.AccessKeyID = string(accessKeyID) + authConf.SecretAccessKey = string(secretAccessKey) s.accessKeyID = string(accessKeyID) s.secretAccessKey = string(secretAccessKey) - SetAuthConfigPath(root) - perr = SaveConfig(authConf) + // do this only once here + customConfigPath = root + + perr = saveAuthConfig(authConf) c.Assert(perr, IsNil) - minioAPI := getNewAPI(false) + minioAPI := getNewAPI(fsroot, false) httpHandler := getAPIHandler(false, minioAPI) - go startTM(minioAPI) - testAPIDonutCacheServer = httptest.NewServer(httpHandler) + testAPIFSCacheServer = httptest.NewServer(httpHandler) } -func (s *MyAPIDonutCacheSuite) TearDownSuite(c *C) { +func (s *MyAPIFSCacheSuite) TearDownSuite(c *C) { os.RemoveAll(s.root) - testAPIDonutCacheServer.Close() + testAPIFSCacheServer.Close() } -func (s *MyAPIDonutCacheSuite) newRequest(method, urlStr string, contentLength int64, body io.ReadSeeker) (*http.Request, error) { +/// +/// Excerpts from @lsegal - https://github.com/aws/aws-sdk-js/issues/659#issuecomment-120477258 +/// +/// User-Agent: +/// +/// This is ignored from signing because signing this causes problems with generating pre-signed URLs +/// (that are executed by other agents) or when customers pass requests through proxies, which may +/// modify the user-agent. +/// +/// Content-Length: +/// +/// This is ignored from signing because generating a pre-signed URL should not provide a content-length +/// constraint, specifically when vending a S3 pre-signed PUT URL. The corollary to this is that when +/// sending regular requests (non-pre-signed), the signature contains a checksum of the body, which +/// implicitly validates the payload length (since changing the number of bytes would change the checksum) +/// and therefore this header is not valuable in the signature. +/// +/// Content-Type: +/// +/// Signing this header causes quite a number of problems in browser environments, where browsers +/// like to modify and normalize the content-type header in different ways. There is more information +/// on this in https://github.com/aws/aws-sdk-js/issues/244. Avoiding this field simplifies logic +/// and reduces the possibility of future bugs +/// +/// Authorization: +/// +/// Is skipped for obvious reasons +/// +var ignoredHeaders = map[string]bool{ + "Authorization": true, + "Content-Type": true, + "Content-Length": true, + "User-Agent": true, +} + +func (s *MyAPIFSCacheSuite) newRequest(method, urlStr string, contentLength int64, body io.ReadSeeker) (*http.Request, error) { t := time.Now().UTC() req, err := http.NewRequest(method, urlStr, nil) if err != nil { @@ -211,27 +249,62 @@ func (s *MyAPIDonutCacheSuite) newRequest(method, urlStr string, contentLength i return req, nil } -func (s *MyAPIDonutCacheSuite) TestDeleteBucket(c *C) { - request, err := s.newRequest("DELETE", testAPIDonutCacheServer.URL+"/mybucket", 0, nil) +func (s *MyAPIFSCacheSuite) TestAuth(c *C) { + secretID, err := generateSecretAccessKey() c.Assert(err, IsNil) - client := &http.Client{} - response, err := client.Do(request) + accessID, err := generateAccessKeyID() c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusMethodNotAllowed) + + c.Assert(len(secretID), Equals, minioSecretID) + c.Assert(len(accessID), Equals, minioAccessID) } -func (s *MyAPIDonutCacheSuite) TestDeleteObject(c *C) { - request, err := s.newRequest("DELETE", testAPIDonutCacheServer.URL+"/mybucket/myobject", 0, nil) +func (s *MyAPIFSCacheSuite) TestDeleteBucket(c *C) { + request, err := s.newRequest("PUT", testAPIFSCacheServer.URL+"/deletebucket", 0, nil) c.Assert(err, IsNil) - client := &http.Client{} + + client := http.Client{} response, err := client.Do(request) c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusMethodNotAllowed) + c.Assert(response.StatusCode, Equals, http.StatusOK) + + request, err = s.newRequest("DELETE", testAPIFSCacheServer.URL+"/deletebucket", 0, nil) + c.Assert(err, IsNil) + + client = http.Client{} + response, err = client.Do(request) + c.Assert(err, IsNil) + c.Assert(response.StatusCode, Equals, http.StatusOK) } -func (s *MyAPIDonutCacheSuite) TestNonExistantBucket(c *C) { - request, err := s.newRequest("HEAD", testAPIDonutCacheServer.URL+"/nonexistantbucket", 0, nil) +func (s *MyAPIFSCacheSuite) TestDeleteObject(c *C) { + request, err := s.newRequest("PUT", testAPIFSCacheServer.URL+"/deletebucketobject", 0, nil) + c.Assert(err, IsNil) + + client := http.Client{} + response, err := client.Do(request) + c.Assert(err, IsNil) + c.Assert(response.StatusCode, Equals, http.StatusOK) + + request, err = s.newRequest("PUT", testAPIFSCacheServer.URL+"/deletebucketobject/myobject", 0, nil) + c.Assert(err, IsNil) + + client = http.Client{} + response, err = client.Do(request) + c.Assert(err, IsNil) + c.Assert(response.StatusCode, Equals, http.StatusOK) + + request, err = s.newRequest("DELETE", testAPIFSCacheServer.URL+"/deletebucketobject/myobject", 0, nil) + c.Assert(err, IsNil) + client = http.Client{} + response, err = client.Do(request) + c.Assert(err, IsNil) + c.Assert(response.StatusCode, Equals, http.StatusOK) +} + +func (s *MyAPIFSCacheSuite) TestNonExistantBucket(c *C) { + request, err := s.newRequest("HEAD", testAPIFSCacheServer.URL+"/nonexistantbucket", 0, nil) c.Assert(err, IsNil) client := http.Client{} @@ -240,8 +313,8 @@ func (s *MyAPIDonutCacheSuite) TestNonExistantBucket(c *C) { c.Assert(response.StatusCode, Equals, http.StatusNotFound) } -func (s *MyAPIDonutCacheSuite) TestEmptyObject(c *C) { - request, err := s.newRequest("PUT", testAPIDonutCacheServer.URL+"/emptyobject", 0, nil) +func (s *MyAPIFSCacheSuite) TestEmptyObject(c *C) { + request, err := s.newRequest("PUT", testAPIFSCacheServer.URL+"/emptyobject", 0, nil) c.Assert(err, IsNil) client := http.Client{} @@ -249,7 +322,7 @@ func (s *MyAPIDonutCacheSuite) TestEmptyObject(c *C) { c.Assert(err, IsNil) c.Assert(response.StatusCode, Equals, http.StatusOK) - request, err = s.newRequest("PUT", testAPIDonutCacheServer.URL+"/emptyobject/object", 0, nil) + request, err = s.newRequest("PUT", testAPIFSCacheServer.URL+"/emptyobject/object", 0, nil) c.Assert(err, IsNil) client = http.Client{} @@ -257,7 +330,7 @@ func (s *MyAPIDonutCacheSuite) TestEmptyObject(c *C) { c.Assert(err, IsNil) c.Assert(response.StatusCode, Equals, http.StatusOK) - request, err = s.newRequest("GET", testAPIDonutCacheServer.URL+"/emptyobject/object", 0, nil) + request, err = s.newRequest("GET", testAPIFSCacheServer.URL+"/emptyobject/object", 0, nil) c.Assert(err, IsNil) client = http.Client{} @@ -271,8 +344,8 @@ func (s *MyAPIDonutCacheSuite) TestEmptyObject(c *C) { c.Assert(true, Equals, bytes.Equal(responseBody, buffer.Bytes())) } -func (s *MyAPIDonutCacheSuite) TestBucket(c *C) { - request, err := s.newRequest("PUT", testAPIDonutCacheServer.URL+"/bucket", 0, nil) +func (s *MyAPIFSCacheSuite) TestBucket(c *C) { + request, err := s.newRequest("PUT", testAPIFSCacheServer.URL+"/bucket", 0, nil) c.Assert(err, IsNil) client := http.Client{} @@ -280,7 +353,7 @@ func (s *MyAPIDonutCacheSuite) TestBucket(c *C) { c.Assert(err, IsNil) c.Assert(response.StatusCode, Equals, http.StatusOK) - request, err = s.newRequest("HEAD", testAPIDonutCacheServer.URL+"/bucket", 0, nil) + request, err = s.newRequest("HEAD", testAPIFSCacheServer.URL+"/bucket", 0, nil) c.Assert(err, IsNil) client = http.Client{} @@ -289,9 +362,9 @@ func (s *MyAPIDonutCacheSuite) TestBucket(c *C) { c.Assert(response.StatusCode, Equals, http.StatusOK) } -func (s *MyAPIDonutCacheSuite) TestObject(c *C) { +func (s *MyAPIFSCacheSuite) TestObject(c *C) { buffer := bytes.NewReader([]byte("hello world")) - request, err := s.newRequest("PUT", testAPIDonutCacheServer.URL+"/testobject", 0, nil) + request, err := s.newRequest("PUT", testAPIFSCacheServer.URL+"/testobject", 0, nil) c.Assert(err, IsNil) client := http.Client{} @@ -299,7 +372,7 @@ func (s *MyAPIDonutCacheSuite) TestObject(c *C) { c.Assert(err, IsNil) c.Assert(response.StatusCode, Equals, http.StatusOK) - request, err = s.newRequest("PUT", testAPIDonutCacheServer.URL+"/testobject/object", int64(buffer.Len()), buffer) + request, err = s.newRequest("PUT", testAPIFSCacheServer.URL+"/testobject/object", int64(buffer.Len()), buffer) c.Assert(err, IsNil) client = http.Client{} @@ -307,7 +380,7 @@ func (s *MyAPIDonutCacheSuite) TestObject(c *C) { c.Assert(err, IsNil) c.Assert(response.StatusCode, Equals, http.StatusOK) - request, err = s.newRequest("GET", testAPIDonutCacheServer.URL+"/testobject/object", 0, nil) + request, err = s.newRequest("GET", testAPIFSCacheServer.URL+"/testobject/object", 0, nil) c.Assert(err, IsNil) client = http.Client{} @@ -321,8 +394,8 @@ func (s *MyAPIDonutCacheSuite) TestObject(c *C) { } -func (s *MyAPIDonutCacheSuite) TestMultipleObjects(c *C) { - request, err := s.newRequest("PUT", testAPIDonutCacheServer.URL+"/multipleobjects", 0, nil) +func (s *MyAPIFSCacheSuite) TestMultipleObjects(c *C) { + request, err := s.newRequest("PUT", testAPIFSCacheServer.URL+"/multipleobjects", 0, nil) c.Assert(err, IsNil) client := http.Client{} @@ -330,7 +403,7 @@ func (s *MyAPIDonutCacheSuite) TestMultipleObjects(c *C) { c.Assert(err, IsNil) c.Assert(response.StatusCode, Equals, http.StatusOK) - request, err = s.newRequest("GET", testAPIDonutCacheServer.URL+"/multipleobjects/object", 0, nil) + request, err = s.newRequest("GET", testAPIFSCacheServer.URL+"/multipleobjects/object", 0, nil) c.Assert(err, IsNil) client = http.Client{} @@ -342,7 +415,7 @@ func (s *MyAPIDonutCacheSuite) TestMultipleObjects(c *C) { // get object buffer1 := bytes.NewReader([]byte("hello one")) - request, err = s.newRequest("PUT", testAPIDonutCacheServer.URL+"/multipleobjects/object1", int64(buffer1.Len()), buffer1) + request, err = s.newRequest("PUT", testAPIFSCacheServer.URL+"/multipleobjects/object1", int64(buffer1.Len()), buffer1) c.Assert(err, IsNil) client = http.Client{} @@ -350,7 +423,7 @@ func (s *MyAPIDonutCacheSuite) TestMultipleObjects(c *C) { c.Assert(err, IsNil) c.Assert(response.StatusCode, Equals, http.StatusOK) - request, err = s.newRequest("GET", testAPIDonutCacheServer.URL+"/multipleobjects/object1", 0, nil) + request, err = s.newRequest("GET", testAPIFSCacheServer.URL+"/multipleobjects/object1", 0, nil) c.Assert(err, IsNil) client = http.Client{} @@ -364,7 +437,7 @@ func (s *MyAPIDonutCacheSuite) TestMultipleObjects(c *C) { c.Assert(true, Equals, bytes.Equal(responseBody, []byte("hello one"))) buffer2 := bytes.NewReader([]byte("hello two")) - request, err = s.newRequest("PUT", testAPIDonutCacheServer.URL+"/multipleobjects/object2", int64(buffer2.Len()), buffer2) + request, err = s.newRequest("PUT", testAPIFSCacheServer.URL+"/multipleobjects/object2", int64(buffer2.Len()), buffer2) c.Assert(err, IsNil) client = http.Client{} @@ -372,7 +445,7 @@ func (s *MyAPIDonutCacheSuite) TestMultipleObjects(c *C) { c.Assert(err, IsNil) c.Assert(response.StatusCode, Equals, http.StatusOK) - request, err = s.newRequest("GET", testAPIDonutCacheServer.URL+"/multipleobjects/object2", 0, nil) + request, err = s.newRequest("GET", testAPIFSCacheServer.URL+"/multipleobjects/object2", 0, nil) c.Assert(err, IsNil) client = http.Client{} @@ -386,7 +459,7 @@ func (s *MyAPIDonutCacheSuite) TestMultipleObjects(c *C) { c.Assert(true, Equals, bytes.Equal(responseBody, []byte("hello two"))) buffer3 := bytes.NewReader([]byte("hello three")) - request, err = s.newRequest("PUT", testAPIDonutCacheServer.URL+"/multipleobjects/object3", int64(buffer3.Len()), buffer3) + request, err = s.newRequest("PUT", testAPIFSCacheServer.URL+"/multipleobjects/object3", int64(buffer3.Len()), buffer3) c.Assert(err, IsNil) client = http.Client{} @@ -394,7 +467,7 @@ func (s *MyAPIDonutCacheSuite) TestMultipleObjects(c *C) { c.Assert(err, IsNil) c.Assert(response.StatusCode, Equals, http.StatusOK) - request, err = s.newRequest("GET", testAPIDonutCacheServer.URL+"/multipleobjects/object3", 0, nil) + request, err = s.newRequest("GET", testAPIFSCacheServer.URL+"/multipleobjects/object3", 0, nil) c.Assert(err, IsNil) client = http.Client{} @@ -408,8 +481,8 @@ func (s *MyAPIDonutCacheSuite) TestMultipleObjects(c *C) { c.Assert(true, Equals, bytes.Equal(responseBody, []byte("hello three"))) } -func (s *MyAPIDonutCacheSuite) TestNotImplemented(c *C) { - request, err := s.newRequest("GET", testAPIDonutCacheServer.URL+"/bucket/object?policy", 0, nil) +func (s *MyAPIFSCacheSuite) TestNotImplemented(c *C) { + request, err := s.newRequest("GET", testAPIFSCacheServer.URL+"/bucket/object?policy", 0, nil) c.Assert(err, IsNil) client := http.Client{} @@ -419,8 +492,8 @@ func (s *MyAPIDonutCacheSuite) TestNotImplemented(c *C) { } -func (s *MyAPIDonutCacheSuite) TestHeader(c *C) { - request, err := s.newRequest("GET", testAPIDonutCacheServer.URL+"/bucket/object", 0, nil) +func (s *MyAPIFSCacheSuite) TestHeader(c *C) { + request, err := s.newRequest("GET", testAPIFSCacheServer.URL+"/bucket/object", 0, nil) c.Assert(err, IsNil) client := http.Client{} @@ -430,8 +503,8 @@ func (s *MyAPIDonutCacheSuite) TestHeader(c *C) { verifyError(c, response, "NoSuchKey", "The specified key does not exist.", http.StatusNotFound) } -func (s *MyAPIDonutCacheSuite) TestPutBucket(c *C) { - request, err := s.newRequest("PUT", testAPIDonutCacheServer.URL+"/put-bucket", 0, nil) +func (s *MyAPIFSCacheSuite) TestPutBucket(c *C) { + request, err := s.newRequest("PUT", testAPIFSCacheServer.URL+"/put-bucket", 0, nil) c.Assert(err, IsNil) request.Header.Add("x-amz-acl", "private") @@ -441,8 +514,8 @@ func (s *MyAPIDonutCacheSuite) TestPutBucket(c *C) { c.Assert(response.StatusCode, Equals, http.StatusOK) } -func (s *MyAPIDonutCacheSuite) TestPutObject(c *C) { - request, err := s.newRequest("PUT", testAPIDonutCacheServer.URL+"/put-object", 0, nil) +func (s *MyAPIFSCacheSuite) TestPutObject(c *C) { + request, err := s.newRequest("PUT", testAPIFSCacheServer.URL+"/put-object", 0, nil) c.Assert(err, IsNil) request.Header.Add("x-amz-acl", "private") @@ -452,7 +525,7 @@ func (s *MyAPIDonutCacheSuite) TestPutObject(c *C) { c.Assert(response.StatusCode, Equals, http.StatusOK) buffer1 := bytes.NewReader([]byte("hello world")) - request, err = s.newRequest("PUT", testAPIDonutCacheServer.URL+"/put-object/object", int64(buffer1.Len()), buffer1) + request, err = s.newRequest("PUT", testAPIFSCacheServer.URL+"/put-object/object", int64(buffer1.Len()), buffer1) c.Assert(err, IsNil) response, err = client.Do(request) @@ -460,8 +533,8 @@ func (s *MyAPIDonutCacheSuite) TestPutObject(c *C) { c.Assert(response.StatusCode, Equals, http.StatusOK) } -func (s *MyAPIDonutCacheSuite) TestListBuckets(c *C) { - request, err := s.newRequest("GET", testAPIDonutCacheServer.URL+"/", 0, nil) +func (s *MyAPIFSCacheSuite) TestListBuckets(c *C) { + request, err := s.newRequest("GET", testAPIFSCacheServer.URL+"/", 0, nil) c.Assert(err, IsNil) client := http.Client{} @@ -475,9 +548,9 @@ func (s *MyAPIDonutCacheSuite) TestListBuckets(c *C) { c.Assert(err, IsNil) } -func (s *MyAPIDonutCacheSuite) TestNotBeAbleToCreateObjectInNonexistantBucket(c *C) { +func (s *MyAPIFSCacheSuite) TestNotBeAbleToCreateObjectInNonexistantBucket(c *C) { buffer1 := bytes.NewReader([]byte("hello world")) - request, err := s.newRequest("PUT", testAPIDonutCacheServer.URL+"/innonexistantbucket/object", int64(buffer1.Len()), buffer1) + request, err := s.newRequest("PUT", testAPIFSCacheServer.URL+"/innonexistantbucket/object", int64(buffer1.Len()), buffer1) c.Assert(err, IsNil) client := http.Client{} @@ -486,8 +559,8 @@ func (s *MyAPIDonutCacheSuite) TestNotBeAbleToCreateObjectInNonexistantBucket(c verifyError(c, response, "NoSuchBucket", "The specified bucket does not exist.", http.StatusNotFound) } -func (s *MyAPIDonutCacheSuite) TestHeadOnObject(c *C) { - request, err := s.newRequest("PUT", testAPIDonutCacheServer.URL+"/headonobject", 0, nil) +func (s *MyAPIFSCacheSuite) TestHeadOnObject(c *C) { + request, err := s.newRequest("PUT", testAPIFSCacheServer.URL+"/headonobject", 0, nil) c.Assert(err, IsNil) request.Header.Add("x-amz-acl", "private") @@ -497,14 +570,14 @@ func (s *MyAPIDonutCacheSuite) TestHeadOnObject(c *C) { c.Assert(response.StatusCode, Equals, http.StatusOK) buffer1 := bytes.NewReader([]byte("hello world")) - request, err = s.newRequest("PUT", testAPIDonutCacheServer.URL+"/headonobject/object1", int64(buffer1.Len()), buffer1) + request, err = s.newRequest("PUT", testAPIFSCacheServer.URL+"/headonobject/object1", int64(buffer1.Len()), buffer1) c.Assert(err, IsNil) response, err = client.Do(request) c.Assert(err, IsNil) c.Assert(response.StatusCode, Equals, http.StatusOK) - request, err = s.newRequest("HEAD", testAPIDonutCacheServer.URL+"/headonobject/object1", 0, nil) + request, err = s.newRequest("HEAD", testAPIFSCacheServer.URL+"/headonobject/object1", 0, nil) c.Assert(err, IsNil) response, err = client.Do(request) @@ -512,8 +585,8 @@ func (s *MyAPIDonutCacheSuite) TestHeadOnObject(c *C) { c.Assert(response.StatusCode, Equals, http.StatusOK) } -func (s *MyAPIDonutCacheSuite) TestHeadOnBucket(c *C) { - request, err := s.newRequest("PUT", testAPIDonutCacheServer.URL+"/headonbucket", 0, nil) +func (s *MyAPIFSCacheSuite) TestHeadOnBucket(c *C) { + request, err := s.newRequest("PUT", testAPIFSCacheServer.URL+"/headonbucket", 0, nil) c.Assert(err, IsNil) request.Header.Add("x-amz-acl", "private") @@ -522,7 +595,7 @@ func (s *MyAPIDonutCacheSuite) TestHeadOnBucket(c *C) { c.Assert(err, IsNil) c.Assert(response.StatusCode, Equals, http.StatusOK) - request, err = s.newRequest("HEAD", testAPIDonutCacheServer.URL+"/headonbucket", 0, nil) + request, err = s.newRequest("HEAD", testAPIFSCacheServer.URL+"/headonbucket", 0, nil) c.Assert(err, IsNil) response, err = client.Do(request) @@ -530,8 +603,8 @@ func (s *MyAPIDonutCacheSuite) TestHeadOnBucket(c *C) { c.Assert(response.StatusCode, Equals, http.StatusOK) } -func (s *MyAPIDonutCacheSuite) TestXMLNameNotInBucketListJson(c *C) { - request, err := s.newRequest("GET", testAPIDonutCacheServer.URL+"/", 0, nil) +func (s *MyAPIFSCacheSuite) TestXMLNameNotInBucketListJson(c *C) { + request, err := s.newRequest("GET", testAPIFSCacheServer.URL+"/", 0, nil) c.Assert(err, IsNil) request.Header.Add("Accept", "application/json") @@ -545,8 +618,8 @@ func (s *MyAPIDonutCacheSuite) TestXMLNameNotInBucketListJson(c *C) { c.Assert(strings.Contains(string(byteResults), "XML"), Equals, false) } -func (s *MyAPIDonutCacheSuite) TestXMLNameNotInObjectListJson(c *C) { - request, err := s.newRequest("PUT", testAPIDonutCacheServer.URL+"/xmlnamenotinobjectlistjson", 0, nil) +func (s *MyAPIFSCacheSuite) TestXMLNameNotInObjectListJson(c *C) { + request, err := s.newRequest("PUT", testAPIFSCacheServer.URL+"/xmlnamenotinobjectlistjson", 0, nil) c.Assert(err, IsNil) request.Header.Add("Accept", "application/json") @@ -555,7 +628,7 @@ func (s *MyAPIDonutCacheSuite) TestXMLNameNotInObjectListJson(c *C) { c.Assert(err, IsNil) c.Assert(response.StatusCode, Equals, http.StatusOK) - request, err = s.newRequest("GET", testAPIDonutCacheServer.URL+"/xmlnamenotinobjectlistjson", 0, nil) + request, err = s.newRequest("GET", testAPIFSCacheServer.URL+"/xmlnamenotinobjectlistjson", 0, nil) c.Assert(err, IsNil) request.Header.Add("Accept", "application/json") @@ -569,8 +642,8 @@ func (s *MyAPIDonutCacheSuite) TestXMLNameNotInObjectListJson(c *C) { c.Assert(strings.Contains(string(byteResults), "XML"), Equals, false) } -func (s *MyAPIDonutCacheSuite) TestContentTypePersists(c *C) { - request, err := s.newRequest("PUT", testAPIDonutCacheServer.URL+"/contenttype-persists", 0, nil) +func (s *MyAPIFSCacheSuite) TestContentTypePersists(c *C) { + request, err := s.newRequest("PUT", testAPIFSCacheServer.URL+"/contenttype-persists", 0, nil) c.Assert(err, IsNil) client := http.Client{} @@ -579,7 +652,7 @@ func (s *MyAPIDonutCacheSuite) TestContentTypePersists(c *C) { c.Assert(response.StatusCode, Equals, http.StatusOK) buffer1 := bytes.NewReader([]byte("hello world")) - request, err = s.newRequest("PUT", testAPIDonutCacheServer.URL+"/contenttype-persists/one", int64(buffer1.Len()), buffer1) + request, err = s.newRequest("PUT", testAPIFSCacheServer.URL+"/contenttype-persists/one", int64(buffer1.Len()), buffer1) delete(request.Header, "Content-Type") c.Assert(err, IsNil) @@ -588,14 +661,14 @@ func (s *MyAPIDonutCacheSuite) TestContentTypePersists(c *C) { c.Assert(err, IsNil) c.Assert(response.StatusCode, Equals, http.StatusOK) - request, err = s.newRequest("HEAD", testAPIDonutCacheServer.URL+"/contenttype-persists/one", 0, nil) + request, err = s.newRequest("HEAD", testAPIFSCacheServer.URL+"/contenttype-persists/one", 0, nil) c.Assert(err, IsNil) response, err = client.Do(request) c.Assert(err, IsNil) c.Assert(response.Header.Get("Content-Type"), Equals, "application/octet-stream") - request, err = s.newRequest("GET", testAPIDonutCacheServer.URL+"/contenttype-persists/one", 0, nil) + request, err = s.newRequest("GET", testAPIFSCacheServer.URL+"/contenttype-persists/one", 0, nil) c.Assert(err, IsNil) client = http.Client{} @@ -605,7 +678,7 @@ func (s *MyAPIDonutCacheSuite) TestContentTypePersists(c *C) { c.Assert(response.Header.Get("Content-Type"), Equals, "application/octet-stream") buffer2 := bytes.NewReader([]byte("hello world")) - request, err = s.newRequest("PUT", testAPIDonutCacheServer.URL+"/contenttype-persists/two", int64(buffer2.Len()), buffer2) + request, err = s.newRequest("PUT", testAPIFSCacheServer.URL+"/contenttype-persists/two", int64(buffer2.Len()), buffer2) delete(request.Header, "Content-Type") request.Header.Add("Content-Type", "application/json") c.Assert(err, IsNil) @@ -614,14 +687,14 @@ func (s *MyAPIDonutCacheSuite) TestContentTypePersists(c *C) { c.Assert(err, IsNil) c.Assert(response.StatusCode, Equals, http.StatusOK) - request, err = s.newRequest("HEAD", testAPIDonutCacheServer.URL+"/contenttype-persists/two", 0, nil) + request, err = s.newRequest("HEAD", testAPIFSCacheServer.URL+"/contenttype-persists/two", 0, nil) c.Assert(err, IsNil) response, err = client.Do(request) c.Assert(err, IsNil) c.Assert(response.Header.Get("Content-Type"), Equals, "application/octet-stream") - request, err = s.newRequest("GET", testAPIDonutCacheServer.URL+"/contenttype-persists/two", 0, nil) + request, err = s.newRequest("GET", testAPIFSCacheServer.URL+"/contenttype-persists/two", 0, nil) c.Assert(err, IsNil) response, err = client.Do(request) @@ -629,8 +702,8 @@ func (s *MyAPIDonutCacheSuite) TestContentTypePersists(c *C) { c.Assert(response.Header.Get("Content-Type"), Equals, "application/octet-stream") } -func (s *MyAPIDonutCacheSuite) TestPartialContent(c *C) { - request, err := s.newRequest("PUT", testAPIDonutCacheServer.URL+"/partial-content", 0, nil) +func (s *MyAPIFSCacheSuite) TestPartialContent(c *C) { + request, err := s.newRequest("PUT", testAPIFSCacheServer.URL+"/partial-content", 0, nil) c.Assert(err, IsNil) client := http.Client{} @@ -639,7 +712,7 @@ func (s *MyAPIDonutCacheSuite) TestPartialContent(c *C) { c.Assert(response.StatusCode, Equals, http.StatusOK) buffer1 := bytes.NewReader([]byte("Hello World")) - request, err = s.newRequest("PUT", testAPIDonutCacheServer.URL+"/partial-content/bar", int64(buffer1.Len()), buffer1) + request, err = s.newRequest("PUT", testAPIFSCacheServer.URL+"/partial-content/bar", int64(buffer1.Len()), buffer1) c.Assert(err, IsNil) client = http.Client{} @@ -648,7 +721,7 @@ func (s *MyAPIDonutCacheSuite) TestPartialContent(c *C) { c.Assert(response.StatusCode, Equals, http.StatusOK) // prepare request - request, err = s.newRequest("GET", testAPIDonutCacheServer.URL+"/partial-content/bar", 0, nil) + request, err = s.newRequest("GET", testAPIFSCacheServer.URL+"/partial-content/bar", 0, nil) c.Assert(err, IsNil) request.Header.Add("Accept", "application/json") request.Header.Add("Range", "bytes=6-7") @@ -663,8 +736,8 @@ func (s *MyAPIDonutCacheSuite) TestPartialContent(c *C) { c.Assert(string(partialObject), Equals, "Wo") } -func (s *MyAPIDonutCacheSuite) TestListObjectsHandlerErrors(c *C) { - request, err := s.newRequest("GET", testAPIDonutCacheServer.URL+"/objecthandlererrors-.", 0, nil) +func (s *MyAPIFSCacheSuite) TestListObjectsHandlerErrors(c *C) { + request, err := s.newRequest("GET", testAPIFSCacheServer.URL+"/objecthandlererrors-.", 0, nil) c.Assert(err, IsNil) client := http.Client{} @@ -672,7 +745,7 @@ func (s *MyAPIDonutCacheSuite) TestListObjectsHandlerErrors(c *C) { c.Assert(err, IsNil) verifyError(c, response, "InvalidBucketName", "The specified bucket is not valid.", http.StatusBadRequest) - request, err = s.newRequest("GET", testAPIDonutCacheServer.URL+"/objecthandlererrors", 0, nil) + request, err = s.newRequest("GET", testAPIFSCacheServer.URL+"/objecthandlererrors", 0, nil) c.Assert(err, IsNil) client = http.Client{} @@ -680,7 +753,7 @@ func (s *MyAPIDonutCacheSuite) TestListObjectsHandlerErrors(c *C) { c.Assert(err, IsNil) verifyError(c, response, "NoSuchBucket", "The specified bucket does not exist.", http.StatusNotFound) - request, err = s.newRequest("PUT", testAPIDonutCacheServer.URL+"/objecthandlererrors", 0, nil) + request, err = s.newRequest("PUT", testAPIFSCacheServer.URL+"/objecthandlererrors", 0, nil) c.Assert(err, IsNil) request.Header.Add("x-amz-acl", "private") @@ -689,7 +762,7 @@ func (s *MyAPIDonutCacheSuite) TestListObjectsHandlerErrors(c *C) { c.Assert(err, IsNil) c.Assert(response.StatusCode, Equals, http.StatusOK) - request, err = s.newRequest("GET", testAPIDonutCacheServer.URL+"/objecthandlererrors?max-keys=-2", 0, nil) + request, err = s.newRequest("GET", testAPIFSCacheServer.URL+"/objecthandlererrors?max-keys=-2", 0, nil) c.Assert(err, IsNil) client = http.Client{} response, err = client.Do(request) @@ -697,8 +770,8 @@ func (s *MyAPIDonutCacheSuite) TestListObjectsHandlerErrors(c *C) { verifyError(c, response, "InvalidArgument", "Argument maxKeys must be an integer between 0 and 2147483647.", http.StatusBadRequest) } -func (s *MyAPIDonutCacheSuite) TestPutBucketErrors(c *C) { - request, err := s.newRequest("PUT", testAPIDonutCacheServer.URL+"/putbucket-.", 0, nil) +func (s *MyAPIFSCacheSuite) TestPutBucketErrors(c *C) { + request, err := s.newRequest("PUT", testAPIFSCacheServer.URL+"/putbucket-.", 0, nil) c.Assert(err, IsNil) request.Header.Add("x-amz-acl", "private") @@ -707,7 +780,7 @@ func (s *MyAPIDonutCacheSuite) TestPutBucketErrors(c *C) { c.Assert(err, IsNil) verifyError(c, response, "InvalidBucketName", "The specified bucket is not valid.", http.StatusBadRequest) - request, err = s.newRequest("PUT", testAPIDonutCacheServer.URL+"/putbucket", 0, nil) + request, err = s.newRequest("PUT", testAPIFSCacheServer.URL+"/putbucket", 0, nil) c.Assert(err, IsNil) request.Header.Add("x-amz-acl", "private") @@ -716,7 +789,7 @@ func (s *MyAPIDonutCacheSuite) TestPutBucketErrors(c *C) { c.Assert(err, IsNil) c.Assert(response.StatusCode, Equals, http.StatusOK) - request, err = s.newRequest("PUT", testAPIDonutCacheServer.URL+"/putbucket", 0, nil) + request, err = s.newRequest("PUT", testAPIFSCacheServer.URL+"/putbucket", 0, nil) c.Assert(err, IsNil) request.Header.Add("x-amz-acl", "private") @@ -724,7 +797,7 @@ func (s *MyAPIDonutCacheSuite) TestPutBucketErrors(c *C) { c.Assert(err, IsNil) verifyError(c, response, "BucketAlreadyExists", "The requested bucket name is not available.", http.StatusConflict) - request, err = s.newRequest("PUT", testAPIDonutCacheServer.URL+"/putbucket?acl", 0, nil) + request, err = s.newRequest("PUT", testAPIFSCacheServer.URL+"/putbucket?acl", 0, nil) c.Assert(err, IsNil) request.Header.Add("x-amz-acl", "unknown") @@ -733,8 +806,8 @@ func (s *MyAPIDonutCacheSuite) TestPutBucketErrors(c *C) { verifyError(c, response, "NotImplemented", "A header you provided implies functionality that is not implemented.", http.StatusNotImplemented) } -func (s *MyAPIDonutCacheSuite) TestGetObjectErrors(c *C) { - request, err := s.newRequest("GET", testAPIDonutCacheServer.URL+"/getobjecterrors", 0, nil) +func (s *MyAPIFSCacheSuite) TestGetObjectErrors(c *C) { + request, err := s.newRequest("GET", testAPIFSCacheServer.URL+"/getobjecterrors", 0, nil) c.Assert(err, IsNil) client := http.Client{} @@ -742,7 +815,7 @@ func (s *MyAPIDonutCacheSuite) TestGetObjectErrors(c *C) { c.Assert(err, IsNil) verifyError(c, response, "NoSuchBucket", "The specified bucket does not exist.", http.StatusNotFound) - request, err = s.newRequest("PUT", testAPIDonutCacheServer.URL+"/getobjecterrors", 0, nil) + request, err = s.newRequest("PUT", testAPIFSCacheServer.URL+"/getobjecterrors", 0, nil) c.Assert(err, IsNil) client = http.Client{} @@ -750,7 +823,7 @@ func (s *MyAPIDonutCacheSuite) TestGetObjectErrors(c *C) { c.Assert(err, IsNil) c.Assert(response.StatusCode, Equals, http.StatusOK) - request, err = s.newRequest("GET", testAPIDonutCacheServer.URL+"/getobjecterrors/bar", 0, nil) + request, err = s.newRequest("GET", testAPIFSCacheServer.URL+"/getobjecterrors/bar", 0, nil) c.Assert(err, IsNil) client = http.Client{} @@ -758,7 +831,7 @@ func (s *MyAPIDonutCacheSuite) TestGetObjectErrors(c *C) { c.Assert(err, IsNil) verifyError(c, response, "NoSuchKey", "The specified key does not exist.", http.StatusNotFound) - request, err = s.newRequest("GET", testAPIDonutCacheServer.URL+"/getobjecterrors-./bar", 0, nil) + request, err = s.newRequest("GET", testAPIFSCacheServer.URL+"/getobjecterrors-./bar", 0, nil) c.Assert(err, IsNil) response, err = client.Do(request) @@ -767,8 +840,8 @@ func (s *MyAPIDonutCacheSuite) TestGetObjectErrors(c *C) { } -func (s *MyAPIDonutCacheSuite) TestGetObjectRangeErrors(c *C) { - request, err := s.newRequest("PUT", testAPIDonutCacheServer.URL+"/getobjectrangeerrors", 0, nil) +func (s *MyAPIFSCacheSuite) TestGetObjectRangeErrors(c *C) { + request, err := s.newRequest("PUT", testAPIFSCacheServer.URL+"/getobjectrangeerrors", 0, nil) c.Assert(err, IsNil) client := http.Client{} @@ -777,7 +850,7 @@ func (s *MyAPIDonutCacheSuite) TestGetObjectRangeErrors(c *C) { c.Assert(response.StatusCode, Equals, http.StatusOK) buffer1 := bytes.NewReader([]byte("Hello World")) - request, err = s.newRequest("PUT", testAPIDonutCacheServer.URL+"/getobjectrangeerrors/bar", int64(buffer1.Len()), buffer1) + request, err = s.newRequest("PUT", testAPIFSCacheServer.URL+"/getobjectrangeerrors/bar", int64(buffer1.Len()), buffer1) c.Assert(err, IsNil) client = http.Client{} @@ -785,7 +858,7 @@ func (s *MyAPIDonutCacheSuite) TestGetObjectRangeErrors(c *C) { c.Assert(err, IsNil) c.Assert(response.StatusCode, Equals, http.StatusOK) - request, err = s.newRequest("GET", testAPIDonutCacheServer.URL+"/getobjectrangeerrors/bar", 0, nil) + request, err = s.newRequest("GET", testAPIFSCacheServer.URL+"/getobjectrangeerrors/bar", 0, nil) request.Header.Add("Range", "bytes=7-6") c.Assert(err, IsNil) @@ -795,8 +868,8 @@ func (s *MyAPIDonutCacheSuite) TestGetObjectRangeErrors(c *C) { verifyError(c, response, "InvalidRange", "The requested range cannot be satisfied.", http.StatusRequestedRangeNotSatisfiable) } -func (s *MyAPIDonutCacheSuite) TestObjectMultipartAbort(c *C) { - request, err := s.newRequest("PUT", testAPIDonutCacheServer.URL+"/objectmultipartabort", 0, nil) +func (s *MyAPIFSCacheSuite) TestObjectMultipartAbort(c *C) { + request, err := s.newRequest("PUT", testAPIFSCacheServer.URL+"/objectmultipartabort", 0, nil) c.Assert(err, IsNil) client := http.Client{} @@ -804,7 +877,7 @@ func (s *MyAPIDonutCacheSuite) TestObjectMultipartAbort(c *C) { c.Assert(err, IsNil) c.Assert(response.StatusCode, Equals, 200) - request, err = s.newRequest("POST", testAPIDonutCacheServer.URL+"/objectmultipartabort/object?uploads", 0, nil) + request, err = s.newRequest("POST", testAPIFSCacheServer.URL+"/objectmultipartabort/object?uploads", 0, nil) c.Assert(err, IsNil) response, err = client.Do(request) @@ -819,7 +892,7 @@ func (s *MyAPIDonutCacheSuite) TestObjectMultipartAbort(c *C) { uploadID := newResponse.UploadID buffer1 := bytes.NewReader([]byte("hello world")) - request, err = s.newRequest("PUT", testAPIDonutCacheServer.URL+"/objectmultipartabort/object?uploadId="+uploadID+"&partNumber=1", int64(buffer1.Len()), buffer1) + request, err = s.newRequest("PUT", testAPIFSCacheServer.URL+"/objectmultipartabort/object?uploadId="+uploadID+"&partNumber=1", int64(buffer1.Len()), buffer1) c.Assert(err, IsNil) response1, err := client.Do(request) @@ -827,14 +900,14 @@ func (s *MyAPIDonutCacheSuite) TestObjectMultipartAbort(c *C) { c.Assert(response1.StatusCode, Equals, http.StatusOK) buffer2 := bytes.NewReader([]byte("hello world")) - request, err = s.newRequest("PUT", testAPIDonutCacheServer.URL+"/objectmultipartabort/object?uploadId="+uploadID+"&partNumber=2", int64(buffer2.Len()), buffer2) + request, err = s.newRequest("PUT", testAPIFSCacheServer.URL+"/objectmultipartabort/object?uploadId="+uploadID+"&partNumber=2", int64(buffer2.Len()), buffer2) c.Assert(err, IsNil) response2, err := client.Do(request) c.Assert(err, IsNil) c.Assert(response2.StatusCode, Equals, http.StatusOK) - request, err = s.newRequest("DELETE", testAPIDonutCacheServer.URL+"/objectmultipartabort/object?uploadId="+uploadID, 0, nil) + request, err = s.newRequest("DELETE", testAPIFSCacheServer.URL+"/objectmultipartabort/object?uploadId="+uploadID, 0, nil) c.Assert(err, IsNil) response3, err := client.Do(request) @@ -842,8 +915,8 @@ func (s *MyAPIDonutCacheSuite) TestObjectMultipartAbort(c *C) { c.Assert(response3.StatusCode, Equals, http.StatusNoContent) } -func (s *MyAPIDonutCacheSuite) TestBucketMultipartList(c *C) { - request, err := s.newRequest("PUT", testAPIDonutCacheServer.URL+"/bucketmultipartlist", 0, nil) +func (s *MyAPIFSCacheSuite) TestBucketMultipartList(c *C) { + request, err := s.newRequest("PUT", testAPIFSCacheServer.URL+"/bucketmultipartlist", 0, nil) c.Assert(err, IsNil) client := http.Client{} @@ -851,7 +924,7 @@ func (s *MyAPIDonutCacheSuite) TestBucketMultipartList(c *C) { c.Assert(err, IsNil) c.Assert(response.StatusCode, Equals, 200) - request, err = s.newRequest("POST", testAPIDonutCacheServer.URL+"/bucketmultipartlist/object?uploads", 0, nil) + request, err = s.newRequest("POST", testAPIFSCacheServer.URL+"/bucketmultipartlist/object?uploads", 0, nil) c.Assert(err, IsNil) response, err = client.Do(request) @@ -866,7 +939,7 @@ func (s *MyAPIDonutCacheSuite) TestBucketMultipartList(c *C) { uploadID := newResponse.UploadID buffer1 := bytes.NewReader([]byte("hello world")) - request, err = s.newRequest("PUT", testAPIDonutCacheServer.URL+"/bucketmultipartlist/object?uploadId="+uploadID+"&partNumber=1", int64(buffer1.Len()), buffer1) + request, err = s.newRequest("PUT", testAPIFSCacheServer.URL+"/bucketmultipartlist/object?uploadId="+uploadID+"&partNumber=1", int64(buffer1.Len()), buffer1) c.Assert(err, IsNil) response1, err := client.Do(request) @@ -874,14 +947,14 @@ func (s *MyAPIDonutCacheSuite) TestBucketMultipartList(c *C) { c.Assert(response1.StatusCode, Equals, http.StatusOK) buffer2 := bytes.NewReader([]byte("hello world")) - request, err = s.newRequest("PUT", testAPIDonutCacheServer.URL+"/bucketmultipartlist/object?uploadId="+uploadID+"&partNumber=2", int64(buffer2.Len()), buffer2) + request, err = s.newRequest("PUT", testAPIFSCacheServer.URL+"/bucketmultipartlist/object?uploadId="+uploadID+"&partNumber=2", int64(buffer2.Len()), buffer2) c.Assert(err, IsNil) response2, err := client.Do(request) c.Assert(err, IsNil) c.Assert(response2.StatusCode, Equals, http.StatusOK) - request, err = s.newRequest("GET", testAPIDonutCacheServer.URL+"/bucketmultipartlist?uploads", 0, nil) + request, err = s.newRequest("GET", testAPIFSCacheServer.URL+"/bucketmultipartlist?uploads", 0, nil) c.Assert(err, IsNil) response3, err := client.Do(request) @@ -895,8 +968,8 @@ func (s *MyAPIDonutCacheSuite) TestBucketMultipartList(c *C) { c.Assert(newResponse3.Bucket, Equals, "bucketmultipartlist") } -func (s *MyAPIDonutCacheSuite) TestObjectMultipartList(c *C) { - request, err := s.newRequest("PUT", testAPIDonutCacheServer.URL+"/objectmultipartlist", 0, nil) +func (s *MyAPIFSCacheSuite) TestObjectMultipartList(c *C) { + request, err := s.newRequest("PUT", testAPIFSCacheServer.URL+"/objectmultipartlist", 0, nil) c.Assert(err, IsNil) client := http.Client{} @@ -904,7 +977,7 @@ func (s *MyAPIDonutCacheSuite) TestObjectMultipartList(c *C) { c.Assert(err, IsNil) c.Assert(response.StatusCode, Equals, 200) - request, err = s.newRequest("POST", testAPIDonutCacheServer.URL+"/objectmultipartlist/object?uploads", 0, nil) + request, err = s.newRequest("POST", testAPIFSCacheServer.URL+"/objectmultipartlist/object?uploads", 0, nil) c.Assert(err, IsNil) response, err = client.Do(request) @@ -919,7 +992,7 @@ func (s *MyAPIDonutCacheSuite) TestObjectMultipartList(c *C) { uploadID := newResponse.UploadID buffer1 := bytes.NewReader([]byte("hello world")) - request, err = s.newRequest("PUT", testAPIDonutCacheServer.URL+"/objectmultipartlist/object?uploadId="+uploadID+"&partNumber=1", int64(buffer1.Len()), buffer1) + request, err = s.newRequest("PUT", testAPIFSCacheServer.URL+"/objectmultipartlist/object?uploadId="+uploadID+"&partNumber=1", int64(buffer1.Len()), buffer1) c.Assert(err, IsNil) response1, err := client.Do(request) @@ -927,21 +1000,21 @@ func (s *MyAPIDonutCacheSuite) TestObjectMultipartList(c *C) { c.Assert(response1.StatusCode, Equals, http.StatusOK) buffer2 := bytes.NewReader([]byte("hello world")) - request, err = s.newRequest("PUT", testAPIDonutCacheServer.URL+"/objectmultipartlist/object?uploadId="+uploadID+"&partNumber=2", int64(buffer2.Len()), buffer2) + request, err = s.newRequest("PUT", testAPIFSCacheServer.URL+"/objectmultipartlist/object?uploadId="+uploadID+"&partNumber=2", int64(buffer2.Len()), buffer2) c.Assert(err, IsNil) response2, err := client.Do(request) c.Assert(err, IsNil) c.Assert(response2.StatusCode, Equals, http.StatusOK) - request, err = s.newRequest("GET", testAPIDonutCacheServer.URL+"/objectmultipartlist/object?uploadId="+uploadID, 0, nil) + request, err = s.newRequest("GET", testAPIFSCacheServer.URL+"/objectmultipartlist/object?uploadId="+uploadID, 0, nil) c.Assert(err, IsNil) response3, err := client.Do(request) c.Assert(err, IsNil) c.Assert(response3.StatusCode, Equals, http.StatusOK) - request, err = s.newRequest("GET", testAPIDonutCacheServer.URL+"/objectmultipartlist/object?max-parts=-2&uploadId="+uploadID, 0, nil) + request, err = s.newRequest("GET", testAPIFSCacheServer.URL+"/objectmultipartlist/object?max-parts=-2&uploadId="+uploadID, 0, nil) c.Assert(err, IsNil) response4, err := client.Do(request) @@ -949,8 +1022,8 @@ func (s *MyAPIDonutCacheSuite) TestObjectMultipartList(c *C) { verifyError(c, response4, "InvalidArgument", "Argument maxParts must be an integer between 1 and 10000.", http.StatusBadRequest) } -func (s *MyAPIDonutCacheSuite) TestObjectMultipart(c *C) { - request, err := s.newRequest("PUT", testAPIDonutCacheServer.URL+"/objectmultiparts", 0, nil) +func (s *MyAPIFSCacheSuite) TestObjectMultipart(c *C) { + request, err := s.newRequest("PUT", testAPIFSCacheServer.URL+"/objectmultiparts", 0, nil) c.Assert(err, IsNil) client := http.Client{} @@ -958,7 +1031,7 @@ func (s *MyAPIDonutCacheSuite) TestObjectMultipart(c *C) { c.Assert(err, IsNil) c.Assert(response.StatusCode, Equals, 200) - request, err = s.newRequest("POST", testAPIDonutCacheServer.URL+"/objectmultiparts/object?uploads", 0, nil) + request, err = s.newRequest("POST", testAPIFSCacheServer.URL+"/objectmultiparts/object?uploads", 0, nil) c.Assert(err, IsNil) client = http.Client{} @@ -975,7 +1048,7 @@ func (s *MyAPIDonutCacheSuite) TestObjectMultipart(c *C) { uploadID := newResponse.UploadID buffer1 := bytes.NewReader([]byte("hello world")) - request, err = s.newRequest("PUT", testAPIDonutCacheServer.URL+"/objectmultiparts/object?uploadId="+uploadID+"&partNumber=1", int64(buffer1.Len()), buffer1) + request, err = s.newRequest("PUT", testAPIFSCacheServer.URL+"/objectmultiparts/object?uploadId="+uploadID+"&partNumber=1", int64(buffer1.Len()), buffer1) c.Assert(err, IsNil) client = http.Client{} @@ -984,7 +1057,7 @@ func (s *MyAPIDonutCacheSuite) TestObjectMultipart(c *C) { c.Assert(response1.StatusCode, Equals, http.StatusOK) buffer2 := bytes.NewReader([]byte("hello world")) - request, err = s.newRequest("PUT", testAPIDonutCacheServer.URL+"/objectmultiparts/object?uploadId="+uploadID+"&partNumber=2", int64(buffer2.Len()), buffer2) + request, err = s.newRequest("PUT", testAPIFSCacheServer.URL+"/objectmultiparts/object?uploadId="+uploadID+"&partNumber=2", int64(buffer2.Len()), buffer2) c.Assert(err, IsNil) client = http.Client{} @@ -993,8 +1066,8 @@ func (s *MyAPIDonutCacheSuite) TestObjectMultipart(c *C) { c.Assert(response2.StatusCode, Equals, http.StatusOK) // complete multipart upload - completeUploads := &donut.CompleteMultipartUpload{ - Part: []donut.CompletePart{ + completeUploads := &fs.CompleteMultipartUpload{ + Part: []fs.CompletePart{ { PartNumber: 1, ETag: response1.Header.Get("ETag"), @@ -1009,7 +1082,7 @@ func (s *MyAPIDonutCacheSuite) TestObjectMultipart(c *C) { completeBytes, err := xml.Marshal(completeUploads) c.Assert(err, IsNil) - request, err = s.newRequest("POST", testAPIDonutCacheServer.URL+"/objectmultiparts/object?uploadId="+uploadID, int64(len(completeBytes)), bytes.NewReader(completeBytes)) + request, err = s.newRequest("POST", testAPIFSCacheServer.URL+"/objectmultiparts/object?uploadId="+uploadID, int64(len(completeBytes)), bytes.NewReader(completeBytes)) c.Assert(err, IsNil) response, err = client.Do(request) diff --git a/server_signV4_donut_test.go b/server_signV4_donut_test.go deleted file mode 100644 index 0ed8f26a8..000000000 --- a/server_signV4_donut_test.go +++ /dev/null @@ -1,1037 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2014 Minio, 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 main - -import ( - "bytes" - "io" - "io/ioutil" - "os" - "path/filepath" - "sort" - "strconv" - "strings" - "time" - - "encoding/hex" - "encoding/xml" - "net/http" - "net/http/httptest" - - "github.com/minio/minio/pkg/donut" - . "gopkg.in/check.v1" -) - -type MyAPISignatureV4Suite struct { - root string - req *http.Request - body io.ReadSeeker - accessKeyID string - secretAccessKey string -} - -var _ = Suite(&MyAPISignatureV4Suite{}) - -var testSignatureV4Server *httptest.Server - -// create a dummy TestNodeDiskMap -func createTestNodeDiskMap(p string) map[string][]string { - nodes := make(map[string][]string) - nodes["localhost"] = make([]string, 16) - for i := 0; i < len(nodes["localhost"]); i++ { - diskPath := filepath.Join(p, strconv.Itoa(i)) - if _, err := os.Stat(diskPath); err != nil { - if os.IsNotExist(err) { - os.MkdirAll(diskPath, 0700) - } - } - nodes["localhost"][i] = diskPath - } - return nodes -} - -func (s *MyAPISignatureV4Suite) SetUpSuite(c *C) { - root, err := ioutil.TempDir(os.TempDir(), "api-") - c.Assert(err, IsNil) - s.root = root - - conf := &donut.Config{} - conf.Version = "0.0.1" - conf.DonutName = "test" - conf.NodeDiskMap = createTestNodeDiskMap(root) - conf.MaxSize = 100000 - donut.SetDonutConfigPath(filepath.Join(root, "donut.json")) - perr := donut.SaveConfig(conf) - c.Assert(perr, IsNil) - - accessKeyID, perr := generateAccessKeyID() - c.Assert(perr, IsNil) - secretAccessKey, perr := generateSecretAccessKey() - c.Assert(perr, IsNil) - - authConf := &AuthConfig{} - authConf.Users = make(map[string]*AuthUser) - authConf.Users[string(accessKeyID)] = &AuthUser{ - Name: "testuser", - AccessKeyID: string(accessKeyID), - SecretAccessKey: string(secretAccessKey), - } - s.accessKeyID = string(accessKeyID) - s.secretAccessKey = string(secretAccessKey) - - SetAuthConfigPath(root) - perr = SaveConfig(authConf) - c.Assert(perr, IsNil) - - minioAPI := getNewAPI(false) - httpHandler := getAPIHandler(false, minioAPI) - go startTM(minioAPI) - testSignatureV4Server = httptest.NewServer(httpHandler) -} - -func (s *MyAPISignatureV4Suite) TearDownSuite(c *C) { - os.RemoveAll(s.root) - testSignatureV4Server.Close() -} - -func (s *MyAPISignatureV4Suite) newRequest(method, urlStr string, contentLength int64, body io.ReadSeeker) (*http.Request, error) { - t := time.Now().UTC() - req, err := http.NewRequest(method, urlStr, nil) - if err != nil { - return nil, err - } - - req.Header.Set("x-amz-date", t.Format(iso8601Format)) - if method == "" { - method = "POST" - } - - // add Content-Length - req.ContentLength = contentLength - - // add body - switch { - case body == nil: - req.Body = nil - default: - req.Body = ioutil.NopCloser(body) - } - - // save for subsequent use - hash := func() string { - switch { - case body == nil: - return hex.EncodeToString(sum256([]byte{})) - default: - sum256Bytes, _ := sum256Reader(body) - return hex.EncodeToString(sum256Bytes) - } - } - hashedPayload := hash() - req.Header.Set("x-amz-content-sha256", hashedPayload) - - var headers []string - vals := make(map[string][]string) - for k, vv := range req.Header { - if _, ok := ignoredHeaders[http.CanonicalHeaderKey(k)]; ok { - continue // ignored header - } - headers = append(headers, strings.ToLower(k)) - vals[strings.ToLower(k)] = vv - } - headers = append(headers, "host") - sort.Strings(headers) - - var canonicalHeaders bytes.Buffer - for _, k := range headers { - canonicalHeaders.WriteString(k) - canonicalHeaders.WriteByte(':') - switch { - case k == "host": - canonicalHeaders.WriteString(req.URL.Host) - fallthrough - default: - for idx, v := range vals[k] { - if idx > 0 { - canonicalHeaders.WriteByte(',') - } - canonicalHeaders.WriteString(v) - } - canonicalHeaders.WriteByte('\n') - } - } - - signedHeaders := strings.Join(headers, ";") - - req.URL.RawQuery = strings.Replace(req.URL.Query().Encode(), "+", "%20", -1) - encodedPath := getURLEncodedName(req.URL.Path) - // convert any space strings back to "+" - encodedPath = strings.Replace(encodedPath, "+", "%20", -1) - - // - // canonicalRequest = - // \n - // \n - // \n - // \n - // \n - // - // - canonicalRequest := strings.Join([]string{ - req.Method, - encodedPath, - req.URL.RawQuery, - canonicalHeaders.String(), - signedHeaders, - hashedPayload, - }, "\n") - - scope := strings.Join([]string{ - t.Format(yyyymmdd), - "milkyway", - "s3", - "aws4_request", - }, "/") - - stringToSign := authHeaderPrefix + "\n" + t.Format(iso8601Format) + "\n" - stringToSign = stringToSign + scope + "\n" - stringToSign = stringToSign + hex.EncodeToString(sum256([]byte(canonicalRequest))) - - date := sumHMAC([]byte("AWS4"+s.secretAccessKey), []byte(t.Format(yyyymmdd))) - region := sumHMAC(date, []byte("milkyway")) - service := sumHMAC(region, []byte("s3")) - signingKey := sumHMAC(service, []byte("aws4_request")) - - signature := hex.EncodeToString(sumHMAC(signingKey, []byte(stringToSign))) - - // final Authorization header - parts := []string{ - authHeaderPrefix + " Credential=" + s.accessKeyID + "/" + scope, - "SignedHeaders=" + signedHeaders, - "Signature=" + signature, - } - auth := strings.Join(parts, ", ") - req.Header.Set("Authorization", auth) - - return req, nil -} - -func (s *MyAPISignatureV4Suite) TestDeleteBucket(c *C) { - request, err := s.newRequest("DELETE", testSignatureV4Server.URL+"/mybucket", 0, nil) - c.Assert(err, IsNil) - - client := &http.Client{} - response, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusMethodNotAllowed) -} - -func (s *MyAPISignatureV4Suite) TestDeleteObject(c *C) { - request, err := s.newRequest("DELETE", testSignatureV4Server.URL+"/mybucket/myobject", 0, nil) - c.Assert(err, IsNil) - client := &http.Client{} - response, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusMethodNotAllowed) -} - -func (s *MyAPISignatureV4Suite) TestNonExistantBucket(c *C) { - request, err := s.newRequest("HEAD", testSignatureV4Server.URL+"/nonexistantbucket", 0, nil) - c.Assert(err, IsNil) - - client := http.Client{} - response, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusNotFound) -} - -func (s *MyAPISignatureV4Suite) TestEmptyObject(c *C) { - request, err := s.newRequest("PUT", testSignatureV4Server.URL+"/emptyobject", 0, nil) - c.Assert(err, IsNil) - - client := http.Client{} - response, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - request, err = s.newRequest("PUT", testSignatureV4Server.URL+"/emptyobject/object", 0, nil) - c.Assert(err, IsNil) - - client = http.Client{} - response, err = client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - request, err = s.newRequest("GET", testSignatureV4Server.URL+"/emptyobject/object", 0, nil) - c.Assert(err, IsNil) - - client = http.Client{} - response, err = client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - var buffer bytes.Buffer - responseBody, err := ioutil.ReadAll(response.Body) - c.Assert(err, IsNil) - c.Assert(true, Equals, bytes.Equal(responseBody, buffer.Bytes())) -} - -func (s *MyAPISignatureV4Suite) TestBucket(c *C) { - request, err := s.newRequest("PUT", testSignatureV4Server.URL+"/bucket", 0, nil) - c.Assert(err, IsNil) - - client := http.Client{} - response, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - request, err = s.newRequest("HEAD", testSignatureV4Server.URL+"/bucket", 0, nil) - c.Assert(err, IsNil) - - client = http.Client{} - response, err = client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) -} - -func (s *MyAPISignatureV4Suite) TestObject(c *C) { - buffer := bytes.NewReader([]byte("hello world")) - request, err := s.newRequest("PUT", testSignatureV4Server.URL+"/testobject", 0, nil) - c.Assert(err, IsNil) - - client := http.Client{} - response, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - request, err = s.newRequest("PUT", testSignatureV4Server.URL+"/testobject/object", int64(buffer.Len()), buffer) - c.Assert(err, IsNil) - - client = http.Client{} - response, err = client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - request, err = s.newRequest("GET", testSignatureV4Server.URL+"/testobject/object", 0, nil) - c.Assert(err, IsNil) - - client = http.Client{} - response, err = client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - responseBody, err := ioutil.ReadAll(response.Body) - c.Assert(err, IsNil) - c.Assert(responseBody, DeepEquals, []byte("hello world")) - -} - -func (s *MyAPISignatureV4Suite) TestMultipleObjects(c *C) { - request, err := s.newRequest("PUT", testSignatureV4Server.URL+"/multipleobjects", 0, nil) - c.Assert(err, IsNil) - - client := http.Client{} - response, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - request, err = s.newRequest("GET", testSignatureV4Server.URL+"/multipleobjects/object", 0, nil) - c.Assert(err, IsNil) - - client = http.Client{} - response, err = client.Do(request) - c.Assert(err, IsNil) - verifyError(c, response, "NoSuchKey", "The specified key does not exist.", http.StatusNotFound) - - //// test object 1 - - // get object - buffer1 := bytes.NewReader([]byte("hello one")) - request, err = s.newRequest("PUT", testSignatureV4Server.URL+"/multipleobjects/object1", int64(buffer1.Len()), buffer1) - c.Assert(err, IsNil) - - client = http.Client{} - response, err = client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - request, err = s.newRequest("GET", testSignatureV4Server.URL+"/multipleobjects/object1", 0, nil) - c.Assert(err, IsNil) - - client = http.Client{} - response, err = client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - // verify response data - responseBody, err := ioutil.ReadAll(response.Body) - c.Assert(err, IsNil) - c.Assert(true, Equals, bytes.Equal(responseBody, []byte("hello one"))) - - buffer2 := bytes.NewReader([]byte("hello two")) - request, err = s.newRequest("PUT", testSignatureV4Server.URL+"/multipleobjects/object2", int64(buffer2.Len()), buffer2) - c.Assert(err, IsNil) - - client = http.Client{} - response, err = client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - request, err = s.newRequest("GET", testSignatureV4Server.URL+"/multipleobjects/object2", 0, nil) - c.Assert(err, IsNil) - - client = http.Client{} - response, err = client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - // verify response data - responseBody, err = ioutil.ReadAll(response.Body) - c.Assert(err, IsNil) - c.Assert(true, Equals, bytes.Equal(responseBody, []byte("hello two"))) - - buffer3 := bytes.NewReader([]byte("hello three")) - request, err = s.newRequest("PUT", testSignatureV4Server.URL+"/multipleobjects/object3", int64(buffer3.Len()), buffer3) - c.Assert(err, IsNil) - - client = http.Client{} - response, err = client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - request, err = s.newRequest("GET", testSignatureV4Server.URL+"/multipleobjects/object3", 0, nil) - c.Assert(err, IsNil) - - client = http.Client{} - response, err = client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - // verify object - responseBody, err = ioutil.ReadAll(response.Body) - c.Assert(err, IsNil) - c.Assert(true, Equals, bytes.Equal(responseBody, []byte("hello three"))) -} - -func (s *MyAPISignatureV4Suite) TestNotImplemented(c *C) { - request, err := s.newRequest("GET", testSignatureV4Server.URL+"/bucket/object?policy", 0, nil) - c.Assert(err, IsNil) - - client := http.Client{} - response, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusNotImplemented) - -} - -func (s *MyAPISignatureV4Suite) TestHeader(c *C) { - request, err := s.newRequest("GET", testSignatureV4Server.URL+"/bucket/object", 0, nil) - c.Assert(err, IsNil) - - client := http.Client{} - response, err := client.Do(request) - c.Assert(err, IsNil) - - verifyError(c, response, "NoSuchKey", "The specified key does not exist.", http.StatusNotFound) -} - -func (s *MyAPISignatureV4Suite) TestPutBucket(c *C) { - request, err := s.newRequest("PUT", testSignatureV4Server.URL+"/put-bucket", 0, nil) - c.Assert(err, IsNil) - request.Header.Add("x-amz-acl", "private") - - client := http.Client{} - response, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) -} - -func (s *MyAPISignatureV4Suite) TestPutObject(c *C) { - request, err := s.newRequest("PUT", testSignatureV4Server.URL+"/put-object", 0, nil) - c.Assert(err, IsNil) - request.Header.Add("x-amz-acl", "private") - - client := http.Client{} - response, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - buffer1 := bytes.NewReader([]byte("hello world")) - request, err = s.newRequest("PUT", testSignatureV4Server.URL+"/put-object/object", int64(buffer1.Len()), buffer1) - c.Assert(err, IsNil) - - response, err = client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) -} - -func (s *MyAPISignatureV4Suite) TestListBuckets(c *C) { - request, err := s.newRequest("GET", testSignatureV4Server.URL+"/", 0, nil) - c.Assert(err, IsNil) - - client := http.Client{} - response, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - var results ListBucketsResponse - decoder := xml.NewDecoder(response.Body) - err = decoder.Decode(&results) - c.Assert(err, IsNil) -} - -func (s *MyAPISignatureV4Suite) TestNotBeAbleToCreateObjectInNonexistantBucket(c *C) { - buffer1 := bytes.NewReader([]byte("hello world")) - request, err := s.newRequest("PUT", testSignatureV4Server.URL+"/innonexistantbucket/object", int64(buffer1.Len()), buffer1) - c.Assert(err, IsNil) - - client := http.Client{} - response, err := client.Do(request) - c.Assert(err, IsNil) - verifyError(c, response, "NoSuchBucket", "The specified bucket does not exist.", http.StatusNotFound) -} - -func (s *MyAPISignatureV4Suite) TestHeadOnObject(c *C) { - request, err := s.newRequest("PUT", testSignatureV4Server.URL+"/headonobject", 0, nil) - c.Assert(err, IsNil) - request.Header.Add("x-amz-acl", "private") - - client := http.Client{} - response, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - buffer1 := bytes.NewReader([]byte("hello world")) - request, err = s.newRequest("PUT", testSignatureV4Server.URL+"/headonobject/object1", int64(buffer1.Len()), buffer1) - c.Assert(err, IsNil) - - response, err = client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - request, err = s.newRequest("HEAD", testSignatureV4Server.URL+"/headonobject/object1", 0, nil) - c.Assert(err, IsNil) - - response, err = client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) -} - -func (s *MyAPISignatureV4Suite) TestHeadOnBucket(c *C) { - request, err := s.newRequest("PUT", testSignatureV4Server.URL+"/headonbucket", 0, nil) - c.Assert(err, IsNil) - request.Header.Add("x-amz-acl", "private") - - client := http.Client{} - response, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - request, err = s.newRequest("HEAD", testSignatureV4Server.URL+"/headonbucket", 0, nil) - c.Assert(err, IsNil) - - response, err = client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) -} - -func (s *MyAPISignatureV4Suite) TestXMLNameNotInBucketListJson(c *C) { - request, err := s.newRequest("GET", testSignatureV4Server.URL+"/", 0, nil) - c.Assert(err, IsNil) - request.Header.Add("Accept", "application/json") - - client := http.Client{} - response, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - byteResults, err := ioutil.ReadAll(response.Body) - c.Assert(err, IsNil) - c.Assert(strings.Contains(string(byteResults), "XML"), Equals, false) -} - -func (s *MyAPISignatureV4Suite) TestXMLNameNotInObjectListJson(c *C) { - request, err := s.newRequest("PUT", testSignatureV4Server.URL+"/xmlnamenotinobjectlistjson", 0, nil) - c.Assert(err, IsNil) - request.Header.Add("Accept", "application/json") - - client := http.Client{} - response, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - request, err = s.newRequest("GET", testSignatureV4Server.URL+"/xmlnamenotinobjectlistjson", 0, nil) - c.Assert(err, IsNil) - request.Header.Add("Accept", "application/json") - - client = http.Client{} - response, err = client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - byteResults, err := ioutil.ReadAll(response.Body) - c.Assert(err, IsNil) - c.Assert(strings.Contains(string(byteResults), "XML"), Equals, false) -} - -func (s *MyAPISignatureV4Suite) TestContentTypePersists(c *C) { - request, err := s.newRequest("PUT", testSignatureV4Server.URL+"/contenttype-persists", 0, nil) - c.Assert(err, IsNil) - - client := http.Client{} - response, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - buffer1 := bytes.NewReader([]byte("hello world")) - request, err = s.newRequest("PUT", testSignatureV4Server.URL+"/contenttype-persists/one", int64(buffer1.Len()), buffer1) - delete(request.Header, "Content-Type") - c.Assert(err, IsNil) - - client = http.Client{} - response, err = client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - request, err = s.newRequest("HEAD", testSignatureV4Server.URL+"/contenttype-persists/one", 0, nil) - c.Assert(err, IsNil) - - response, err = client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.Header.Get("Content-Type"), Equals, "application/octet-stream") - - request, err = s.newRequest("GET", testSignatureV4Server.URL+"/contenttype-persists/one", 0, nil) - c.Assert(err, IsNil) - - client = http.Client{} - response, err = client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - c.Assert(response.Header.Get("Content-Type"), Equals, "application/octet-stream") - - buffer2 := bytes.NewReader([]byte("hello world")) - request, err = s.newRequest("PUT", testSignatureV4Server.URL+"/contenttype-persists/two", int64(buffer2.Len()), buffer2) - delete(request.Header, "Content-Type") - request.Header.Add("Content-Type", "application/json") - c.Assert(err, IsNil) - - response, err = client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - request, err = s.newRequest("HEAD", testSignatureV4Server.URL+"/contenttype-persists/two", 0, nil) - c.Assert(err, IsNil) - - response, err = client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.Header.Get("Content-Type"), Equals, "application/octet-stream") - - request, err = s.newRequest("GET", testSignatureV4Server.URL+"/contenttype-persists/two", 0, nil) - c.Assert(err, IsNil) - - response, err = client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.Header.Get("Content-Type"), Equals, "application/octet-stream") -} - -func (s *MyAPISignatureV4Suite) TestPartialContent(c *C) { - request, err := s.newRequest("PUT", testSignatureV4Server.URL+"/partial-content", 0, nil) - c.Assert(err, IsNil) - - client := http.Client{} - response, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - buffer1 := bytes.NewReader([]byte("Hello World")) - request, err = s.newRequest("PUT", testSignatureV4Server.URL+"/partial-content/bar", int64(buffer1.Len()), buffer1) - c.Assert(err, IsNil) - - client = http.Client{} - response, err = client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - // prepare request - request, err = s.newRequest("GET", testSignatureV4Server.URL+"/partial-content/bar", 0, nil) - c.Assert(err, IsNil) - request.Header.Add("Accept", "application/json") - request.Header.Add("Range", "bytes=6-7") - - client = http.Client{} - response, err = client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusPartialContent) - partialObject, err := ioutil.ReadAll(response.Body) - c.Assert(err, IsNil) - - c.Assert(string(partialObject), Equals, "Wo") -} - -func (s *MyAPISignatureV4Suite) TestListObjectsHandlerErrors(c *C) { - request, err := s.newRequest("GET", testSignatureV4Server.URL+"/objecthandlererrors-.", 0, nil) - c.Assert(err, IsNil) - - client := http.Client{} - response, err := client.Do(request) - c.Assert(err, IsNil) - verifyError(c, response, "InvalidBucketName", "The specified bucket is not valid.", http.StatusBadRequest) - - request, err = s.newRequest("GET", testSignatureV4Server.URL+"/objecthandlererrors", 0, nil) - c.Assert(err, IsNil) - - client = http.Client{} - response, err = client.Do(request) - c.Assert(err, IsNil) - verifyError(c, response, "NoSuchBucket", "The specified bucket does not exist.", http.StatusNotFound) - - request, err = s.newRequest("PUT", testSignatureV4Server.URL+"/objecthandlererrors", 0, nil) - c.Assert(err, IsNil) - request.Header.Add("x-amz-acl", "private") - - client = http.Client{} - response, err = client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - request, err = s.newRequest("GET", testSignatureV4Server.URL+"/objecthandlererrors?max-keys=-2", 0, nil) - c.Assert(err, IsNil) - client = http.Client{} - response, err = client.Do(request) - c.Assert(err, IsNil) - verifyError(c, response, "InvalidArgument", "Argument maxKeys must be an integer between 0 and 2147483647.", http.StatusBadRequest) -} - -func (s *MyAPISignatureV4Suite) TestPutBucketErrors(c *C) { - request, err := s.newRequest("PUT", testSignatureV4Server.URL+"/putbucket-.", 0, nil) - c.Assert(err, IsNil) - request.Header.Add("x-amz-acl", "private") - - client := http.Client{} - response, err := client.Do(request) - c.Assert(err, IsNil) - verifyError(c, response, "InvalidBucketName", "The specified bucket is not valid.", http.StatusBadRequest) - - request, err = s.newRequest("PUT", testSignatureV4Server.URL+"/putbucket", 0, nil) - c.Assert(err, IsNil) - request.Header.Add("x-amz-acl", "private") - - client = http.Client{} - response, err = client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - request, err = s.newRequest("PUT", testSignatureV4Server.URL+"/putbucket", 0, nil) - c.Assert(err, IsNil) - request.Header.Add("x-amz-acl", "private") - - response, err = client.Do(request) - c.Assert(err, IsNil) - verifyError(c, response, "BucketAlreadyExists", "The requested bucket name is not available.", http.StatusConflict) - - request, err = s.newRequest("PUT", testSignatureV4Server.URL+"/putbucket?acl", 0, nil) - c.Assert(err, IsNil) - request.Header.Add("x-amz-acl", "unknown") - - response, err = client.Do(request) - c.Assert(err, IsNil) - verifyError(c, response, "NotImplemented", "A header you provided implies functionality that is not implemented.", http.StatusNotImplemented) -} - -func (s *MyAPISignatureV4Suite) TestGetObjectErrors(c *C) { - request, err := s.newRequest("GET", testSignatureV4Server.URL+"/getobjecterrors", 0, nil) - c.Assert(err, IsNil) - - client := http.Client{} - response, err := client.Do(request) - c.Assert(err, IsNil) - verifyError(c, response, "NoSuchBucket", "The specified bucket does not exist.", http.StatusNotFound) - - request, err = s.newRequest("PUT", testSignatureV4Server.URL+"/getobjecterrors", 0, nil) - c.Assert(err, IsNil) - - client = http.Client{} - response, err = client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - request, err = s.newRequest("GET", testSignatureV4Server.URL+"/getobjecterrors/bar", 0, nil) - c.Assert(err, IsNil) - - client = http.Client{} - response, err = client.Do(request) - c.Assert(err, IsNil) - verifyError(c, response, "NoSuchKey", "The specified key does not exist.", http.StatusNotFound) - - request, err = s.newRequest("GET", testSignatureV4Server.URL+"/getobjecterrors-./bar", 0, nil) - c.Assert(err, IsNil) - - response, err = client.Do(request) - c.Assert(err, IsNil) - verifyError(c, response, "InvalidBucketName", "The specified bucket is not valid.", http.StatusBadRequest) - -} - -func (s *MyAPISignatureV4Suite) TestGetObjectRangeErrors(c *C) { - request, err := s.newRequest("PUT", testSignatureV4Server.URL+"/getobjectrangeerrors", 0, nil) - c.Assert(err, IsNil) - - client := http.Client{} - response, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - buffer1 := bytes.NewReader([]byte("Hello World")) - request, err = s.newRequest("PUT", testSignatureV4Server.URL+"/getobjectrangeerrors/bar", int64(buffer1.Len()), buffer1) - c.Assert(err, IsNil) - - client = http.Client{} - response, err = client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - request, err = s.newRequest("GET", testSignatureV4Server.URL+"/getobjectrangeerrors/bar", 0, nil) - request.Header.Add("Range", "bytes=7-6") - c.Assert(err, IsNil) - - client = http.Client{} - response, err = client.Do(request) - c.Assert(err, IsNil) - verifyError(c, response, "InvalidRange", "The requested range cannot be satisfied.", http.StatusRequestedRangeNotSatisfiable) -} - -func (s *MyAPISignatureV4Suite) TestObjectMultipartAbort(c *C) { - request, err := s.newRequest("PUT", testSignatureV4Server.URL+"/objectmultipartabort", 0, nil) - c.Assert(err, IsNil) - - client := http.Client{} - response, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, 200) - - request, err = s.newRequest("POST", testSignatureV4Server.URL+"/objectmultipartabort/object?uploads", 0, nil) - c.Assert(err, IsNil) - - response, err = client.Do(request) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - decoder := xml.NewDecoder(response.Body) - newResponse := &InitiateMultipartUploadResponse{} - - err = decoder.Decode(newResponse) - c.Assert(err, IsNil) - c.Assert(len(newResponse.UploadID) > 0, Equals, true) - uploadID := newResponse.UploadID - - buffer1 := bytes.NewReader([]byte("hello world")) - request, err = s.newRequest("PUT", testSignatureV4Server.URL+"/objectmultipartabort/object?uploadId="+uploadID+"&partNumber=1", int64(buffer1.Len()), buffer1) - c.Assert(err, IsNil) - - response1, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response1.StatusCode, Equals, http.StatusOK) - - buffer2 := bytes.NewReader([]byte("hello world")) - request, err = s.newRequest("PUT", testSignatureV4Server.URL+"/objectmultipartabort/object?uploadId="+uploadID+"&partNumber=2", int64(buffer2.Len()), buffer2) - c.Assert(err, IsNil) - - response2, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response2.StatusCode, Equals, http.StatusOK) - - request, err = s.newRequest("DELETE", testSignatureV4Server.URL+"/objectmultipartabort/object?uploadId="+uploadID, 0, nil) - c.Assert(err, IsNil) - - response3, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response3.StatusCode, Equals, http.StatusNoContent) -} - -func (s *MyAPISignatureV4Suite) TestBucketMultipartList(c *C) { - request, err := s.newRequest("PUT", testSignatureV4Server.URL+"/bucketmultipartlist", 0, nil) - c.Assert(err, IsNil) - - client := http.Client{} - response, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, 200) - - request, err = s.newRequest("POST", testSignatureV4Server.URL+"/bucketmultipartlist/object?uploads", 0, nil) - c.Assert(err, IsNil) - - response, err = client.Do(request) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - decoder := xml.NewDecoder(response.Body) - newResponse := &InitiateMultipartUploadResponse{} - - err = decoder.Decode(newResponse) - c.Assert(err, IsNil) - c.Assert(len(newResponse.UploadID) > 0, Equals, true) - uploadID := newResponse.UploadID - - buffer1 := bytes.NewReader([]byte("hello world")) - request, err = s.newRequest("PUT", testSignatureV4Server.URL+"/bucketmultipartlist/object?uploadId="+uploadID+"&partNumber=1", int64(buffer1.Len()), buffer1) - c.Assert(err, IsNil) - - response1, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response1.StatusCode, Equals, http.StatusOK) - - buffer2 := bytes.NewReader([]byte("hello world")) - request, err = s.newRequest("PUT", testSignatureV4Server.URL+"/bucketmultipartlist/object?uploadId="+uploadID+"&partNumber=2", int64(buffer2.Len()), buffer2) - c.Assert(err, IsNil) - - response2, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response2.StatusCode, Equals, http.StatusOK) - - request, err = s.newRequest("GET", testSignatureV4Server.URL+"/bucketmultipartlist?uploads", 0, nil) - c.Assert(err, IsNil) - - response3, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response3.StatusCode, Equals, http.StatusOK) - - decoder = xml.NewDecoder(response3.Body) - newResponse3 := &ListMultipartUploadsResponse{} - err = decoder.Decode(newResponse3) - c.Assert(err, IsNil) - c.Assert(newResponse3.Bucket, Equals, "bucketmultipartlist") -} - -func (s *MyAPISignatureV4Suite) TestObjectMultipartList(c *C) { - request, err := s.newRequest("PUT", testSignatureV4Server.URL+"/objectmultipartlist", 0, nil) - c.Assert(err, IsNil) - - client := http.Client{} - response, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, 200) - - request, err = s.newRequest("POST", testSignatureV4Server.URL+"/objectmultipartlist/object?uploads", 0, nil) - c.Assert(err, IsNil) - - response, err = client.Do(request) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - decoder := xml.NewDecoder(response.Body) - newResponse := &InitiateMultipartUploadResponse{} - - err = decoder.Decode(newResponse) - c.Assert(err, IsNil) - c.Assert(len(newResponse.UploadID) > 0, Equals, true) - uploadID := newResponse.UploadID - - buffer1 := bytes.NewReader([]byte("hello world")) - request, err = s.newRequest("PUT", testSignatureV4Server.URL+"/objectmultipartlist/object?uploadId="+uploadID+"&partNumber=1", int64(buffer1.Len()), buffer1) - c.Assert(err, IsNil) - - response1, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response1.StatusCode, Equals, http.StatusOK) - - buffer2 := bytes.NewReader([]byte("hello world")) - request, err = s.newRequest("PUT", testSignatureV4Server.URL+"/objectmultipartlist/object?uploadId="+uploadID+"&partNumber=2", int64(buffer2.Len()), buffer2) - c.Assert(err, IsNil) - - response2, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response2.StatusCode, Equals, http.StatusOK) - - request, err = s.newRequest("GET", testSignatureV4Server.URL+"/objectmultipartlist/object?uploadId="+uploadID, 0, nil) - c.Assert(err, IsNil) - - response3, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response3.StatusCode, Equals, http.StatusOK) - - request, err = s.newRequest("GET", testSignatureV4Server.URL+"/objectmultipartlist/object?max-parts=-2&uploadId="+uploadID, 0, nil) - c.Assert(err, IsNil) - - response4, err := client.Do(request) - c.Assert(err, IsNil) - verifyError(c, response4, "InvalidArgument", "Argument maxParts must be an integer between 1 and 10000.", http.StatusBadRequest) -} - -func (s *MyAPISignatureV4Suite) TestObjectMultipart(c *C) { - request, err := s.newRequest("PUT", testSignatureV4Server.URL+"/objectmultiparts", 0, nil) - c.Assert(err, IsNil) - - client := http.Client{} - response, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, 200) - - request, err = s.newRequest("POST", testSignatureV4Server.URL+"/objectmultiparts/object?uploads", 0, nil) - c.Assert(err, IsNil) - - client = http.Client{} - response, err = client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) - - decoder := xml.NewDecoder(response.Body) - newResponse := &InitiateMultipartUploadResponse{} - - err = decoder.Decode(newResponse) - c.Assert(err, IsNil) - c.Assert(len(newResponse.UploadID) > 0, Equals, true) - uploadID := newResponse.UploadID - - buffer1 := bytes.NewReader([]byte("hello world")) - request, err = s.newRequest("PUT", testSignatureV4Server.URL+"/objectmultiparts/object?uploadId="+uploadID+"&partNumber=1", int64(buffer1.Len()), buffer1) - c.Assert(err, IsNil) - - client = http.Client{} - response1, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response1.StatusCode, Equals, http.StatusOK) - - buffer2 := bytes.NewReader([]byte("hello world")) - request, err = s.newRequest("PUT", testSignatureV4Server.URL+"/objectmultiparts/object?uploadId="+uploadID+"&partNumber=2", int64(buffer2.Len()), buffer2) - c.Assert(err, IsNil) - - client = http.Client{} - response2, err := client.Do(request) - c.Assert(err, IsNil) - c.Assert(response2.StatusCode, Equals, http.StatusOK) - - // complete multipart upload - completeUploads := &donut.CompleteMultipartUpload{ - Part: []donut.CompletePart{ - { - PartNumber: 1, - ETag: response1.Header.Get("ETag"), - }, - { - PartNumber: 2, - ETag: response2.Header.Get("ETag"), - }, - }, - } - - completeBytes, err := xml.Marshal(completeUploads) - c.Assert(err, IsNil) - - request, err = s.newRequest("POST", testSignatureV4Server.URL+"/objectmultiparts/object?uploadId="+uploadID, int64(len(completeBytes)), bytes.NewReader(completeBytes)) - c.Assert(err, IsNil) - - response, err = client.Do(request) - c.Assert(err, IsNil) - c.Assert(response.StatusCode, Equals, http.StatusOK) -} diff --git a/server-api-signature-handler.go b/signature-handler.go similarity index 95% rename from server-api-signature-handler.go rename to signature-handler.go index 354fde159..8a7fdede7 100644 --- a/server-api-signature-handler.go +++ b/signature-handler.go @@ -21,9 +21,9 @@ import ( "net/http" "strings" - "github.com/minio/minio/pkg/crypto/sha256" - "github.com/minio/minio/pkg/probe" - signv4 "github.com/minio/minio/pkg/signature" + "github.com/minio/minio/pkg/fs" + "github.com/minio/minio-xl/pkg/crypto/sha256" + "github.com/minio/minio-xl/pkg/probe" ) type signatureHandler struct { @@ -63,8 +63,7 @@ func (s signatureHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { s.handler.ServeHTTP(w, r) return } - - var signature *signv4.Signature + var signature *fs.Signature if isRequestSignatureV4(r) { // For PUT and POST requests with payload, send the call upwards for verification. // Or PUT and POST requests without payload, verify here. diff --git a/signature-utils.go b/signature_utils_test.go similarity index 64% rename from signature-utils.go rename to signature_utils_test.go index f8b81f1dc..408933098 100644 --- a/signature-utils.go +++ b/signature_utils_test.go @@ -24,44 +24,9 @@ import ( "strings" "unicode/utf8" - "github.com/minio/minio/pkg/crypto/sha256" + "github.com/minio/minio-xl/pkg/crypto/sha256" ) -/// -/// Excerpts from @lsegal - https://github.com/aws/aws-sdk-js/issues/659#issuecomment-120477258 -/// -/// User-Agent: -/// -/// This is ignored from signing because signing this causes problems with generating pre-signed URLs -/// (that are executed by other agents) or when customers pass requests through proxies, which may -/// modify the user-agent. -/// -/// Content-Length: -/// -/// This is ignored from signing because generating a pre-signed URL should not provide a content-length -/// constraint, specifically when vending a S3 pre-signed PUT URL. The corollary to this is that when -/// sending regular requests (non-pre-signed), the signature contains a checksum of the body, which -/// implicitly validates the payload length (since changing the number of bytes would change the checksum) -/// and therefore this header is not valuable in the signature. -/// -/// Content-Type: -/// -/// Signing this header causes quite a number of problems in browser environments, where browsers -/// like to modify and normalize the content-type header in different ways. There is more information -/// on this in https://github.com/aws/aws-sdk-js/issues/244. Avoiding this field simplifies logic -/// and reduces the possibility of future bugs -/// -/// Authorization: -/// -/// Is skipped for obvious reasons -/// -var ignoredHeaders = map[string]bool{ - "Authorization": true, - "Content-Type": true, - "Content-Length": true, - "User-Agent": true, -} - // sum256Reader calculate sha256 sum for an input read seeker func sum256Reader(reader io.ReadSeeker) ([]byte, error) { h := sha256.New() diff --git a/typed-errors.go b/typed-errors.go index 8e4b2de88..0d86c55df 100644 --- a/typed-errors.go +++ b/typed-errors.go @@ -68,6 +68,3 @@ var errPolicyAlreadyExpired = errors.New("Policy already expired") // errPolicyMissingFields means that form values and policy header have some fields missing. var errPolicyMissingFields = errors.New("Some fields are missing or do not match in policy") - -// errMissingDateHeader means that date header is missing -var errMissingDateHeader = errors.New("Missing date header on the request") diff --git a/server-api-utils.go b/utils.go similarity index 66% rename from server-api-utils.go rename to utils.go index f57743ac6..467692bff 100644 --- a/server-api-utils.go +++ b/utils.go @@ -38,10 +38,6 @@ func isValidMD5(md5 string) bool { const ( // maximum object size per PUT request is 5GB maxObjectSize = 1024 * 1024 * 1024 * 5 - // mimimum object size per Multipart PUT request is 5MB - minMultiPartObjectSize = 1024 * 1024 * 5 - // minimum object size per PUT request is 1B - minObjectSize = 1 ) // isMaxObjectSize - verify if max object size @@ -55,27 +51,3 @@ func isMaxObjectSize(size string) bool { } return false } - -// isMinObjectSize - verify if min object size -func isMinObjectSize(size string) bool { - i, err := strconv.ParseInt(size, 10, 64) - if err != nil { - return true - } - if i < minObjectSize { - return true - } - return false -} - -// isMinMultipartObjectSize - verify if the uploaded multipart is of minimum size -func isMinMultipartObjectSize(size string) bool { - i, err := strconv.ParseInt(size, 10, 64) - if err != nil { - return true - } - if i < minMultiPartObjectSize { - return true - } - return false -} diff --git a/vendor/github.com/Sirupsen/logrus/entry_test.go b/vendor/github.com/Sirupsen/logrus/entry_test.go deleted file mode 100644 index 99c3b41d5..000000000 --- a/vendor/github.com/Sirupsen/logrus/entry_test.go +++ /dev/null @@ -1,77 +0,0 @@ -package logrus - -import ( - "bytes" - "fmt" - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestEntryWithError(t *testing.T) { - - assert := assert.New(t) - - defer func() { - ErrorKey = "error" - }() - - err := fmt.Errorf("kaboom at layer %d", 4711) - - assert.Equal(err, WithError(err).Data["error"]) - - logger := New() - logger.Out = &bytes.Buffer{} - entry := NewEntry(logger) - - assert.Equal(err, entry.WithError(err).Data["error"]) - - ErrorKey = "err" - - assert.Equal(err, entry.WithError(err).Data["err"]) - -} - -func TestEntryPanicln(t *testing.T) { - errBoom := fmt.Errorf("boom time") - - defer func() { - p := recover() - assert.NotNil(t, p) - - switch pVal := p.(type) { - case *Entry: - assert.Equal(t, "kaboom", pVal.Message) - assert.Equal(t, errBoom, pVal.Data["err"]) - default: - t.Fatalf("want type *Entry, got %T: %#v", pVal, pVal) - } - }() - - logger := New() - logger.Out = &bytes.Buffer{} - entry := NewEntry(logger) - entry.WithField("err", errBoom).Panicln("kaboom") -} - -func TestEntryPanicf(t *testing.T) { - errBoom := fmt.Errorf("boom again") - - defer func() { - p := recover() - assert.NotNil(t, p) - - switch pVal := p.(type) { - case *Entry: - assert.Equal(t, "kaboom true", pVal.Message) - assert.Equal(t, errBoom, pVal.Data["err"]) - default: - t.Fatalf("want type *Entry, got %T: %#v", pVal, pVal) - } - }() - - logger := New() - logger.Out = &bytes.Buffer{} - entry := NewEntry(logger) - entry.WithField("err", errBoom).Panicf("kaboom %v", true) -} diff --git a/vendor/github.com/Sirupsen/logrus/formatter_bench_test.go b/vendor/github.com/Sirupsen/logrus/formatter_bench_test.go deleted file mode 100644 index c6d290c77..000000000 --- a/vendor/github.com/Sirupsen/logrus/formatter_bench_test.go +++ /dev/null @@ -1,98 +0,0 @@ -package logrus - -import ( - "fmt" - "testing" - "time" -) - -// smallFields is a small size data set for benchmarking -var smallFields = Fields{ - "foo": "bar", - "baz": "qux", - "one": "two", - "three": "four", -} - -// largeFields is a large size data set for benchmarking -var largeFields = Fields{ - "foo": "bar", - "baz": "qux", - "one": "two", - "three": "four", - "five": "six", - "seven": "eight", - "nine": "ten", - "eleven": "twelve", - "thirteen": "fourteen", - "fifteen": "sixteen", - "seventeen": "eighteen", - "nineteen": "twenty", - "a": "b", - "c": "d", - "e": "f", - "g": "h", - "i": "j", - "k": "l", - "m": "n", - "o": "p", - "q": "r", - "s": "t", - "u": "v", - "w": "x", - "y": "z", - "this": "will", - "make": "thirty", - "entries": "yeah", -} - -var errorFields = Fields{ - "foo": fmt.Errorf("bar"), - "baz": fmt.Errorf("qux"), -} - -func BenchmarkErrorTextFormatter(b *testing.B) { - doBenchmark(b, &TextFormatter{DisableColors: true}, errorFields) -} - -func BenchmarkSmallTextFormatter(b *testing.B) { - doBenchmark(b, &TextFormatter{DisableColors: true}, smallFields) -} - -func BenchmarkLargeTextFormatter(b *testing.B) { - doBenchmark(b, &TextFormatter{DisableColors: true}, largeFields) -} - -func BenchmarkSmallColoredTextFormatter(b *testing.B) { - doBenchmark(b, &TextFormatter{ForceColors: true}, smallFields) -} - -func BenchmarkLargeColoredTextFormatter(b *testing.B) { - doBenchmark(b, &TextFormatter{ForceColors: true}, largeFields) -} - -func BenchmarkSmallJSONFormatter(b *testing.B) { - doBenchmark(b, &JSONFormatter{}, smallFields) -} - -func BenchmarkLargeJSONFormatter(b *testing.B) { - doBenchmark(b, &JSONFormatter{}, largeFields) -} - -func doBenchmark(b *testing.B, formatter Formatter, fields Fields) { - entry := &Entry{ - Time: time.Time{}, - Level: InfoLevel, - Message: "message", - Data: fields, - } - var d []byte - var err error - for i := 0; i < b.N; i++ { - d, err = formatter.Format(entry) - if err != nil { - b.Fatal(err) - } - b.SetBytes(int64(len(d))) - } -} diff --git a/vendor/github.com/Sirupsen/logrus/hook_test.go b/vendor/github.com/Sirupsen/logrus/hook_test.go deleted file mode 100644 index 13f34cb6f..000000000 --- a/vendor/github.com/Sirupsen/logrus/hook_test.go +++ /dev/null @@ -1,122 +0,0 @@ -package logrus - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -type TestHook struct { - Fired bool -} - -func (hook *TestHook) Fire(entry *Entry) error { - hook.Fired = true - return nil -} - -func (hook *TestHook) Levels() []Level { - return []Level{ - DebugLevel, - InfoLevel, - WarnLevel, - ErrorLevel, - FatalLevel, - PanicLevel, - } -} - -func TestHookFires(t *testing.T) { - hook := new(TestHook) - - LogAndAssertJSON(t, func(log *Logger) { - log.Hooks.Add(hook) - assert.Equal(t, hook.Fired, false) - - log.Print("test") - }, func(fields Fields) { - assert.Equal(t, hook.Fired, true) - }) -} - -type ModifyHook struct { -} - -func (hook *ModifyHook) Fire(entry *Entry) error { - entry.Data["wow"] = "whale" - return nil -} - -func (hook *ModifyHook) Levels() []Level { - return []Level{ - DebugLevel, - InfoLevel, - WarnLevel, - ErrorLevel, - FatalLevel, - PanicLevel, - } -} - -func TestHookCanModifyEntry(t *testing.T) { - hook := new(ModifyHook) - - LogAndAssertJSON(t, func(log *Logger) { - log.Hooks.Add(hook) - log.WithField("wow", "elephant").Print("test") - }, func(fields Fields) { - assert.Equal(t, fields["wow"], "whale") - }) -} - -func TestCanFireMultipleHooks(t *testing.T) { - hook1 := new(ModifyHook) - hook2 := new(TestHook) - - LogAndAssertJSON(t, func(log *Logger) { - log.Hooks.Add(hook1) - log.Hooks.Add(hook2) - - log.WithField("wow", "elephant").Print("test") - }, func(fields Fields) { - assert.Equal(t, fields["wow"], "whale") - assert.Equal(t, hook2.Fired, true) - }) -} - -type ErrorHook struct { - Fired bool -} - -func (hook *ErrorHook) Fire(entry *Entry) error { - hook.Fired = true - return nil -} - -func (hook *ErrorHook) Levels() []Level { - return []Level{ - ErrorLevel, - } -} - -func TestErrorHookShouldntFireOnInfo(t *testing.T) { - hook := new(ErrorHook) - - LogAndAssertJSON(t, func(log *Logger) { - log.Hooks.Add(hook) - log.Info("test") - }, func(fields Fields) { - assert.Equal(t, hook.Fired, false) - }) -} - -func TestErrorHookShouldFireOnError(t *testing.T) { - hook := new(ErrorHook) - - LogAndAssertJSON(t, func(log *Logger) { - log.Hooks.Add(hook) - log.Error("test") - }, func(fields Fields) { - assert.Equal(t, hook.Fired, true) - }) -} diff --git a/vendor/github.com/Sirupsen/logrus/json_formatter_test.go b/vendor/github.com/Sirupsen/logrus/json_formatter_test.go deleted file mode 100644 index 1d7087325..000000000 --- a/vendor/github.com/Sirupsen/logrus/json_formatter_test.go +++ /dev/null @@ -1,120 +0,0 @@ -package logrus - -import ( - "encoding/json" - "errors" - - "testing" -) - -func TestErrorNotLost(t *testing.T) { - formatter := &JSONFormatter{} - - b, err := formatter.Format(WithField("error", errors.New("wild walrus"))) - if err != nil { - t.Fatal("Unable to format entry: ", err) - } - - entry := make(map[string]interface{}) - err = json.Unmarshal(b, &entry) - if err != nil { - t.Fatal("Unable to unmarshal formatted entry: ", err) - } - - if entry["error"] != "wild walrus" { - t.Fatal("Error field not set") - } -} - -func TestErrorNotLostOnFieldNotNamedError(t *testing.T) { - formatter := &JSONFormatter{} - - b, err := formatter.Format(WithField("omg", errors.New("wild walrus"))) - if err != nil { - t.Fatal("Unable to format entry: ", err) - } - - entry := make(map[string]interface{}) - err = json.Unmarshal(b, &entry) - if err != nil { - t.Fatal("Unable to unmarshal formatted entry: ", err) - } - - if entry["omg"] != "wild walrus" { - t.Fatal("Error field not set") - } -} - -func TestFieldClashWithTime(t *testing.T) { - formatter := &JSONFormatter{} - - b, err := formatter.Format(WithField("time", "right now!")) - if err != nil { - t.Fatal("Unable to format entry: ", err) - } - - entry := make(map[string]interface{}) - err = json.Unmarshal(b, &entry) - if err != nil { - t.Fatal("Unable to unmarshal formatted entry: ", err) - } - - if entry["fields.time"] != "right now!" { - t.Fatal("fields.time not set to original time field") - } - - if entry["time"] != "0001-01-01T00:00:00Z" { - t.Fatal("time field not set to current time, was: ", entry["time"]) - } -} - -func TestFieldClashWithMsg(t *testing.T) { - formatter := &JSONFormatter{} - - b, err := formatter.Format(WithField("msg", "something")) - if err != nil { - t.Fatal("Unable to format entry: ", err) - } - - entry := make(map[string]interface{}) - err = json.Unmarshal(b, &entry) - if err != nil { - t.Fatal("Unable to unmarshal formatted entry: ", err) - } - - if entry["fields.msg"] != "something" { - t.Fatal("fields.msg not set to original msg field") - } -} - -func TestFieldClashWithLevel(t *testing.T) { - formatter := &JSONFormatter{} - - b, err := formatter.Format(WithField("level", "something")) - if err != nil { - t.Fatal("Unable to format entry: ", err) - } - - entry := make(map[string]interface{}) - err = json.Unmarshal(b, &entry) - if err != nil { - t.Fatal("Unable to unmarshal formatted entry: ", err) - } - - if entry["fields.level"] != "something" { - t.Fatal("fields.level not set to original level field") - } -} - -func TestJSONEntryEndsWithNewline(t *testing.T) { - formatter := &JSONFormatter{} - - b, err := formatter.Format(WithField("level", "something")) - if err != nil { - t.Fatal("Unable to format entry: ", err) - } - - if b[len(b)-1] != '\n' { - t.Fatal("Expected JSON log entry to end with a newline") - } -} diff --git a/vendor/github.com/Sirupsen/logrus/logrus_test.go b/vendor/github.com/Sirupsen/logrus/logrus_test.go deleted file mode 100644 index efaacea23..000000000 --- a/vendor/github.com/Sirupsen/logrus/logrus_test.go +++ /dev/null @@ -1,301 +0,0 @@ -package logrus - -import ( - "bytes" - "encoding/json" - "strconv" - "strings" - "sync" - "testing" - - "github.com/stretchr/testify/assert" -) - -func LogAndAssertJSON(t *testing.T, log func(*Logger), assertions func(fields Fields)) { - var buffer bytes.Buffer - var fields Fields - - logger := New() - logger.Out = &buffer - logger.Formatter = new(JSONFormatter) - - log(logger) - - err := json.Unmarshal(buffer.Bytes(), &fields) - assert.Nil(t, err) - - assertions(fields) -} - -func LogAndAssertText(t *testing.T, log func(*Logger), assertions func(fields map[string]string)) { - var buffer bytes.Buffer - - logger := New() - logger.Out = &buffer - logger.Formatter = &TextFormatter{ - DisableColors: true, - } - - log(logger) - - fields := make(map[string]string) - for _, kv := range strings.Split(buffer.String(), " ") { - if !strings.Contains(kv, "=") { - continue - } - kvArr := strings.Split(kv, "=") - key := strings.TrimSpace(kvArr[0]) - val := kvArr[1] - if kvArr[1][0] == '"' { - var err error - val, err = strconv.Unquote(val) - assert.NoError(t, err) - } - fields[key] = val - } - assertions(fields) -} - -func TestPrint(t *testing.T) { - LogAndAssertJSON(t, func(log *Logger) { - log.Print("test") - }, func(fields Fields) { - assert.Equal(t, fields["msg"], "test") - assert.Equal(t, fields["level"], "info") - }) -} - -func TestInfo(t *testing.T) { - LogAndAssertJSON(t, func(log *Logger) { - log.Info("test") - }, func(fields Fields) { - assert.Equal(t, fields["msg"], "test") - assert.Equal(t, fields["level"], "info") - }) -} - -func TestWarn(t *testing.T) { - LogAndAssertJSON(t, func(log *Logger) { - log.Warn("test") - }, func(fields Fields) { - assert.Equal(t, fields["msg"], "test") - assert.Equal(t, fields["level"], "warning") - }) -} - -func TestInfolnShouldAddSpacesBetweenStrings(t *testing.T) { - LogAndAssertJSON(t, func(log *Logger) { - log.Infoln("test", "test") - }, func(fields Fields) { - assert.Equal(t, fields["msg"], "test test") - }) -} - -func TestInfolnShouldAddSpacesBetweenStringAndNonstring(t *testing.T) { - LogAndAssertJSON(t, func(log *Logger) { - log.Infoln("test", 10) - }, func(fields Fields) { - assert.Equal(t, fields["msg"], "test 10") - }) -} - -func TestInfolnShouldAddSpacesBetweenTwoNonStrings(t *testing.T) { - LogAndAssertJSON(t, func(log *Logger) { - log.Infoln(10, 10) - }, func(fields Fields) { - assert.Equal(t, fields["msg"], "10 10") - }) -} - -func TestInfoShouldAddSpacesBetweenTwoNonStrings(t *testing.T) { - LogAndAssertJSON(t, func(log *Logger) { - log.Infoln(10, 10) - }, func(fields Fields) { - assert.Equal(t, fields["msg"], "10 10") - }) -} - -func TestInfoShouldNotAddSpacesBetweenStringAndNonstring(t *testing.T) { - LogAndAssertJSON(t, func(log *Logger) { - log.Info("test", 10) - }, func(fields Fields) { - assert.Equal(t, fields["msg"], "test10") - }) -} - -func TestInfoShouldNotAddSpacesBetweenStrings(t *testing.T) { - LogAndAssertJSON(t, func(log *Logger) { - log.Info("test", "test") - }, func(fields Fields) { - assert.Equal(t, fields["msg"], "testtest") - }) -} - -func TestWithFieldsShouldAllowAssignments(t *testing.T) { - var buffer bytes.Buffer - var fields Fields - - logger := New() - logger.Out = &buffer - logger.Formatter = new(JSONFormatter) - - localLog := logger.WithFields(Fields{ - "key1": "value1", - }) - - localLog.WithField("key2", "value2").Info("test") - err := json.Unmarshal(buffer.Bytes(), &fields) - assert.Nil(t, err) - - assert.Equal(t, "value2", fields["key2"]) - assert.Equal(t, "value1", fields["key1"]) - - buffer = bytes.Buffer{} - fields = Fields{} - localLog.Info("test") - err = json.Unmarshal(buffer.Bytes(), &fields) - assert.Nil(t, err) - - _, ok := fields["key2"] - assert.Equal(t, false, ok) - assert.Equal(t, "value1", fields["key1"]) -} - -func TestUserSuppliedFieldDoesNotOverwriteDefaults(t *testing.T) { - LogAndAssertJSON(t, func(log *Logger) { - log.WithField("msg", "hello").Info("test") - }, func(fields Fields) { - assert.Equal(t, fields["msg"], "test") - }) -} - -func TestUserSuppliedMsgFieldHasPrefix(t *testing.T) { - LogAndAssertJSON(t, func(log *Logger) { - log.WithField("msg", "hello").Info("test") - }, func(fields Fields) { - assert.Equal(t, fields["msg"], "test") - assert.Equal(t, fields["fields.msg"], "hello") - }) -} - -func TestUserSuppliedTimeFieldHasPrefix(t *testing.T) { - LogAndAssertJSON(t, func(log *Logger) { - log.WithField("time", "hello").Info("test") - }, func(fields Fields) { - assert.Equal(t, fields["fields.time"], "hello") - }) -} - -func TestUserSuppliedLevelFieldHasPrefix(t *testing.T) { - LogAndAssertJSON(t, func(log *Logger) { - log.WithField("level", 1).Info("test") - }, func(fields Fields) { - assert.Equal(t, fields["level"], "info") - assert.Equal(t, fields["fields.level"], 1.0) // JSON has floats only - }) -} - -func TestDefaultFieldsAreNotPrefixed(t *testing.T) { - LogAndAssertText(t, func(log *Logger) { - ll := log.WithField("herp", "derp") - ll.Info("hello") - ll.Info("bye") - }, func(fields map[string]string) { - for _, fieldName := range []string{"fields.level", "fields.time", "fields.msg"} { - if _, ok := fields[fieldName]; ok { - t.Fatalf("should not have prefixed %q: %v", fieldName, fields) - } - } - }) -} - -func TestDoubleLoggingDoesntPrefixPreviousFields(t *testing.T) { - - var buffer bytes.Buffer - var fields Fields - - logger := New() - logger.Out = &buffer - logger.Formatter = new(JSONFormatter) - - llog := logger.WithField("context", "eating raw fish") - - llog.Info("looks delicious") - - err := json.Unmarshal(buffer.Bytes(), &fields) - assert.NoError(t, err, "should have decoded first message") - assert.Equal(t, len(fields), 4, "should only have msg/time/level/context fields") - assert.Equal(t, fields["msg"], "looks delicious") - assert.Equal(t, fields["context"], "eating raw fish") - - buffer.Reset() - - llog.Warn("omg it is!") - - err = json.Unmarshal(buffer.Bytes(), &fields) - assert.NoError(t, err, "should have decoded second message") - assert.Equal(t, len(fields), 4, "should only have msg/time/level/context fields") - assert.Equal(t, fields["msg"], "omg it is!") - assert.Equal(t, fields["context"], "eating raw fish") - assert.Nil(t, fields["fields.msg"], "should not have prefixed previous `msg` entry") - -} - -func TestConvertLevelToString(t *testing.T) { - assert.Equal(t, "debug", DebugLevel.String()) - assert.Equal(t, "info", InfoLevel.String()) - assert.Equal(t, "warning", WarnLevel.String()) - assert.Equal(t, "error", ErrorLevel.String()) - assert.Equal(t, "fatal", FatalLevel.String()) - assert.Equal(t, "panic", PanicLevel.String()) -} - -func TestParseLevel(t *testing.T) { - l, err := ParseLevel("panic") - assert.Nil(t, err) - assert.Equal(t, PanicLevel, l) - - l, err = ParseLevel("fatal") - assert.Nil(t, err) - assert.Equal(t, FatalLevel, l) - - l, err = ParseLevel("error") - assert.Nil(t, err) - assert.Equal(t, ErrorLevel, l) - - l, err = ParseLevel("warn") - assert.Nil(t, err) - assert.Equal(t, WarnLevel, l) - - l, err = ParseLevel("warning") - assert.Nil(t, err) - assert.Equal(t, WarnLevel, l) - - l, err = ParseLevel("info") - assert.Nil(t, err) - assert.Equal(t, InfoLevel, l) - - l, err = ParseLevel("debug") - assert.Nil(t, err) - assert.Equal(t, DebugLevel, l) - - l, err = ParseLevel("invalid") - assert.Equal(t, "not a valid logrus Level: \"invalid\"", err.Error()) -} - -func TestGetSetLevelRace(t *testing.T) { - wg := sync.WaitGroup{} - for i := 0; i < 100; i++ { - wg.Add(1) - go func(i int) { - defer wg.Done() - if i%2 == 0 { - SetLevel(InfoLevel) - } else { - GetLevel() - } - }(i) - - } - wg.Wait() -} diff --git a/vendor/github.com/Sirupsen/logrus/text_formatter_test.go b/vendor/github.com/Sirupsen/logrus/text_formatter_test.go deleted file mode 100644 index e25a44f67..000000000 --- a/vendor/github.com/Sirupsen/logrus/text_formatter_test.go +++ /dev/null @@ -1,61 +0,0 @@ -package logrus - -import ( - "bytes" - "errors" - "testing" - "time" -) - -func TestQuoting(t *testing.T) { - tf := &TextFormatter{DisableColors: true} - - checkQuoting := func(q bool, value interface{}) { - b, _ := tf.Format(WithField("test", value)) - idx := bytes.Index(b, ([]byte)("test=")) - cont := bytes.Contains(b[idx+5:], []byte{'"'}) - if cont != q { - if q { - t.Errorf("quoting expected for: %#v", value) - } else { - t.Errorf("quoting not expected for: %#v", value) - } - } - } - - checkQuoting(false, "abcd") - checkQuoting(false, "v1.0") - checkQuoting(false, "1234567890") - checkQuoting(true, "/foobar") - checkQuoting(true, "x y") - checkQuoting(true, "x,y") - checkQuoting(false, errors.New("invalid")) - checkQuoting(true, errors.New("invalid argument")) -} - -func TestTimestampFormat(t *testing.T) { - checkTimeStr := func(format string) { - customFormatter := &TextFormatter{DisableColors: true, TimestampFormat: format} - customStr, _ := customFormatter.Format(WithField("test", "test")) - timeStart := bytes.Index(customStr, ([]byte)("time=")) - timeEnd := bytes.Index(customStr, ([]byte)("level=")) - timeStr := customStr[timeStart+5 : timeEnd-1] - if timeStr[0] == '"' && timeStr[len(timeStr)-1] == '"' { - timeStr = timeStr[1 : len(timeStr)-1] - } - if format == "" { - format = time.RFC3339 - } - _, e := time.Parse(format, (string)(timeStr)) - if e != nil { - t.Errorf("time string \"%s\" did not match provided time format \"%s\": %s", timeStr, format, e) - } - } - - checkTimeStr("2006-01-02T15:04:05.000000000Z07:00") - checkTimeStr("Mon Jan _2 15:04:05 2006") - checkTimeStr("") -} - -// TODO add tests for sorting etc., this requires a parser for the text -// formatter output. diff --git a/vendor/github.com/dustin/go-humanize/bigbytes_test.go b/vendor/github.com/dustin/go-humanize/bigbytes_test.go deleted file mode 100644 index da367d414..000000000 --- a/vendor/github.com/dustin/go-humanize/bigbytes_test.go +++ /dev/null @@ -1,219 +0,0 @@ -package humanize - -import ( - "math/big" - "testing" -) - -func TestBigByteParsing(t *testing.T) { - tests := []struct { - in string - exp uint64 - }{ - {"42", 42}, - {"42MB", 42000000}, - {"42MiB", 44040192}, - {"42mb", 42000000}, - {"42mib", 44040192}, - {"42MIB", 44040192}, - {"42 MB", 42000000}, - {"42 MiB", 44040192}, - {"42 mb", 42000000}, - {"42 mib", 44040192}, - {"42 MIB", 44040192}, - {"42.5MB", 42500000}, - {"42.5MiB", 44564480}, - {"42.5 MB", 42500000}, - {"42.5 MiB", 44564480}, - // No need to say B - {"42M", 42000000}, - {"42Mi", 44040192}, - {"42m", 42000000}, - {"42mi", 44040192}, - {"42MI", 44040192}, - {"42 M", 42000000}, - {"42 Mi", 44040192}, - {"42 m", 42000000}, - {"42 mi", 44040192}, - {"42 MI", 44040192}, - {"42.5M", 42500000}, - {"42.5Mi", 44564480}, - {"42.5 M", 42500000}, - {"42.5 Mi", 44564480}, - // Large testing, breaks when too much larger than - // this. - {"12.5 EB", uint64(12.5 * float64(EByte))}, - {"12.5 E", uint64(12.5 * float64(EByte))}, - {"12.5 EiB", uint64(12.5 * float64(EiByte))}, - } - - for _, p := range tests { - got, err := ParseBigBytes(p.in) - if err != nil { - t.Errorf("Couldn't parse %v: %v", p.in, err) - } else { - if got.Uint64() != p.exp { - t.Errorf("Expected %v for %v, got %v", - p.exp, p.in, got) - } - } - } -} - -func TestBigByteErrors(t *testing.T) { - got, err := ParseBigBytes("84 JB") - if err == nil { - t.Errorf("Expected error, got %v", got) - } - got, err = ParseBigBytes("") - if err == nil { - t.Errorf("Expected error parsing nothing") - } -} - -func bbyte(in uint64) string { - return BigBytes((&big.Int{}).SetUint64(in)) -} - -func bibyte(in uint64) string { - return BigIBytes((&big.Int{}).SetUint64(in)) -} - -func TestBigBytes(t *testing.T) { - testList{ - {"bytes(0)", bbyte(0), "0B"}, - {"bytes(1)", bbyte(1), "1B"}, - {"bytes(803)", bbyte(803), "803B"}, - {"bytes(999)", bbyte(999), "999B"}, - - {"bytes(1024)", bbyte(1024), "1.0kB"}, - {"bytes(1MB - 1)", bbyte(MByte - Byte), "1000kB"}, - - {"bytes(1MB)", bbyte(1024 * 1024), "1.0MB"}, - {"bytes(1GB - 1K)", bbyte(GByte - KByte), "1000MB"}, - - {"bytes(1GB)", bbyte(GByte), "1.0GB"}, - {"bytes(1TB - 1M)", bbyte(TByte - MByte), "1000GB"}, - - {"bytes(1TB)", bbyte(TByte), "1.0TB"}, - {"bytes(1PB - 1T)", bbyte(PByte - TByte), "999TB"}, - - {"bytes(1PB)", bbyte(PByte), "1.0PB"}, - {"bytes(1PB - 1T)", bbyte(EByte - PByte), "999PB"}, - - {"bytes(1EB)", bbyte(EByte), "1.0EB"}, - // Overflows. - // {"bytes(1EB - 1P)", Bytes((KByte*EByte)-PByte), "1023EB"}, - - {"bytes(0)", bibyte(0), "0B"}, - {"bytes(1)", bibyte(1), "1B"}, - {"bytes(803)", bibyte(803), "803B"}, - {"bytes(1023)", bibyte(1023), "1023B"}, - - {"bytes(1024)", bibyte(1024), "1.0KiB"}, - {"bytes(1MB - 1)", bibyte(MiByte - IByte), "1024KiB"}, - - {"bytes(1MB)", bibyte(1024 * 1024), "1.0MiB"}, - {"bytes(1GB - 1K)", bibyte(GiByte - KiByte), "1024MiB"}, - - {"bytes(1GB)", bibyte(GiByte), "1.0GiB"}, - {"bytes(1TB - 1M)", bibyte(TiByte - MiByte), "1024GiB"}, - - {"bytes(1TB)", bibyte(TiByte), "1.0TiB"}, - {"bytes(1PB - 1T)", bibyte(PiByte - TiByte), "1023TiB"}, - - {"bytes(1PB)", bibyte(PiByte), "1.0PiB"}, - {"bytes(1PB - 1T)", bibyte(EiByte - PiByte), "1023PiB"}, - - {"bytes(1EiB)", bibyte(EiByte), "1.0EiB"}, - // Overflows. - // {"bytes(1EB - 1P)", bibyte((KIByte*EIByte)-PiByte), "1023EB"}, - - {"bytes(5.5GiB)", bibyte(5.5 * GiByte), "5.5GiB"}, - - {"bytes(5.5GB)", bbyte(5.5 * GByte), "5.5GB"}, - }.validate(t) -} - -func TestVeryBigBytes(t *testing.T) { - b, _ := (&big.Int{}).SetString("15347691069326346944512", 10) - s := BigBytes(b) - if s != "15ZB" { - t.Errorf("Expected 15ZB, got %v", s) - } - s = BigIBytes(b) - if s != "13ZiB" { - t.Errorf("Expected 13ZiB, got %v", s) - } - - b, _ = (&big.Int{}).SetString("15716035654990179271180288", 10) - s = BigBytes(b) - if s != "16YB" { - t.Errorf("Expected 16YB, got %v", s) - } - s = BigIBytes(b) - if s != "13YiB" { - t.Errorf("Expected 13YiB, got %v", s) - } -} - -func TestVeryVeryBigBytes(t *testing.T) { - b, _ := (&big.Int{}).SetString("16093220510709943573688614912", 10) - s := BigBytes(b) - if s != "16093YB" { - t.Errorf("Expected 16093YB, got %v", s) - } - s = BigIBytes(b) - if s != "13312YiB" { - t.Errorf("Expected 13312YiB, got %v", s) - } -} - -func TestParseVeryBig(t *testing.T) { - tests := []struct { - in string - out string - }{ - {"16ZB", "16000000000000000000000"}, - {"16ZiB", "18889465931478580854784"}, - {"16.5ZB", "16500000000000000000000"}, - {"16.5ZiB", "19479761741837286506496"}, - {"16Z", "16000000000000000000000"}, - {"16Zi", "18889465931478580854784"}, - {"16.5Z", "16500000000000000000000"}, - {"16.5Zi", "19479761741837286506496"}, - - {"16YB", "16000000000000000000000000"}, - {"16YiB", "19342813113834066795298816"}, - {"16.5YB", "16500000000000000000000000"}, - {"16.5YiB", "19947276023641381382651904"}, - {"16Y", "16000000000000000000000000"}, - {"16Yi", "19342813113834066795298816"}, - {"16.5Y", "16500000000000000000000000"}, - {"16.5Yi", "19947276023641381382651904"}, - } - - for _, test := range tests { - x, err := ParseBigBytes(test.in) - if err != nil { - t.Errorf("Error parsing %q: %v", test.in, err) - continue - } - - if x.String() != test.out { - t.Errorf("Expected %q for %q, got %v", test.out, test.in, x) - } - } -} - -func BenchmarkParseBigBytes(b *testing.B) { - for i := 0; i < b.N; i++ { - ParseBigBytes("16.5Z") - } -} - -func BenchmarkBigBytes(b *testing.B) { - for i := 0; i < b.N; i++ { - bibyte(16.5 * GByte) - } -} diff --git a/vendor/github.com/dustin/go-humanize/bytes_test.go b/vendor/github.com/dustin/go-humanize/bytes_test.go deleted file mode 100644 index 7497fa00f..000000000 --- a/vendor/github.com/dustin/go-humanize/bytes_test.go +++ /dev/null @@ -1,144 +0,0 @@ -package humanize - -import ( - "testing" -) - -func TestByteParsing(t *testing.T) { - tests := []struct { - in string - exp uint64 - }{ - {"42", 42}, - {"42MB", 42000000}, - {"42MiB", 44040192}, - {"42mb", 42000000}, - {"42mib", 44040192}, - {"42MIB", 44040192}, - {"42 MB", 42000000}, - {"42 MiB", 44040192}, - {"42 mb", 42000000}, - {"42 mib", 44040192}, - {"42 MIB", 44040192}, - {"42.5MB", 42500000}, - {"42.5MiB", 44564480}, - {"42.5 MB", 42500000}, - {"42.5 MiB", 44564480}, - // No need to say B - {"42M", 42000000}, - {"42Mi", 44040192}, - {"42m", 42000000}, - {"42mi", 44040192}, - {"42MI", 44040192}, - {"42 M", 42000000}, - {"42 Mi", 44040192}, - {"42 m", 42000000}, - {"42 mi", 44040192}, - {"42 MI", 44040192}, - {"42.5M", 42500000}, - {"42.5Mi", 44564480}, - {"42.5 M", 42500000}, - {"42.5 Mi", 44564480}, - // Large testing, breaks when too much larger than - // this. - {"12.5 EB", uint64(12.5 * float64(EByte))}, - {"12.5 E", uint64(12.5 * float64(EByte))}, - {"12.5 EiB", uint64(12.5 * float64(EiByte))}, - } - - for _, p := range tests { - got, err := ParseBytes(p.in) - if err != nil { - t.Errorf("Couldn't parse %v: %v", p.in, err) - } - if got != p.exp { - t.Errorf("Expected %v for %v, got %v", - p.exp, p.in, got) - } - } -} - -func TestByteErrors(t *testing.T) { - got, err := ParseBytes("84 JB") - if err == nil { - t.Errorf("Expected error, got %v", got) - } - got, err = ParseBytes("") - if err == nil { - t.Errorf("Expected error parsing nothing") - } - got, err = ParseBytes("16 EiB") - if err == nil { - t.Errorf("Expected error, got %v", got) - } -} - -func TestBytes(t *testing.T) { - testList{ - {"bytes(0)", Bytes(0), "0B"}, - {"bytes(1)", Bytes(1), "1B"}, - {"bytes(803)", Bytes(803), "803B"}, - {"bytes(999)", Bytes(999), "999B"}, - - {"bytes(1024)", Bytes(1024), "1.0kB"}, - {"bytes(9999)", Bytes(9999), "10kB"}, - {"bytes(1MB - 1)", Bytes(MByte - Byte), "1000kB"}, - - {"bytes(1MB)", Bytes(1024 * 1024), "1.0MB"}, - {"bytes(1GB - 1K)", Bytes(GByte - KByte), "1000MB"}, - - {"bytes(1GB)", Bytes(GByte), "1.0GB"}, - {"bytes(1TB - 1M)", Bytes(TByte - MByte), "1000GB"}, - {"bytes(10MB)", Bytes(9999 * 1000), "10MB"}, - - {"bytes(1TB)", Bytes(TByte), "1.0TB"}, - {"bytes(1PB - 1T)", Bytes(PByte - TByte), "999TB"}, - - {"bytes(1PB)", Bytes(PByte), "1.0PB"}, - {"bytes(1PB - 1T)", Bytes(EByte - PByte), "999PB"}, - - {"bytes(1EB)", Bytes(EByte), "1.0EB"}, - // Overflows. - // {"bytes(1EB - 1P)", Bytes((KByte*EByte)-PByte), "1023EB"}, - - {"bytes(0)", IBytes(0), "0B"}, - {"bytes(1)", IBytes(1), "1B"}, - {"bytes(803)", IBytes(803), "803B"}, - {"bytes(1023)", IBytes(1023), "1023B"}, - - {"bytes(1024)", IBytes(1024), "1.0KiB"}, - {"bytes(1MB - 1)", IBytes(MiByte - IByte), "1024KiB"}, - - {"bytes(1MB)", IBytes(1024 * 1024), "1.0MiB"}, - {"bytes(1GB - 1K)", IBytes(GiByte - KiByte), "1024MiB"}, - - {"bytes(1GB)", IBytes(GiByte), "1.0GiB"}, - {"bytes(1TB - 1M)", IBytes(TiByte - MiByte), "1024GiB"}, - - {"bytes(1TB)", IBytes(TiByte), "1.0TiB"}, - {"bytes(1PB - 1T)", IBytes(PiByte - TiByte), "1023TiB"}, - - {"bytes(1PB)", IBytes(PiByte), "1.0PiB"}, - {"bytes(1PB - 1T)", IBytes(EiByte - PiByte), "1023PiB"}, - - {"bytes(1EiB)", IBytes(EiByte), "1.0EiB"}, - // Overflows. - // {"bytes(1EB - 1P)", IBytes((KIByte*EIByte)-PiByte), "1023EB"}, - - {"bytes(5.5GiB)", IBytes(5.5 * GiByte), "5.5GiB"}, - - {"bytes(5.5GB)", Bytes(5.5 * GByte), "5.5GB"}, - }.validate(t) -} - -func BenchmarkParseBytes(b *testing.B) { - for i := 0; i < b.N; i++ { - ParseBytes("16.5GB") - } -} - -func BenchmarkBytes(b *testing.B) { - for i := 0; i < b.N; i++ { - Bytes(16.5 * GByte) - } -} diff --git a/vendor/github.com/dustin/go-humanize/comma.go b/vendor/github.com/dustin/go-humanize/comma.go index 20711c152..b65ea6fa7 100644 --- a/vendor/github.com/dustin/go-humanize/comma.go +++ b/vendor/github.com/dustin/go-humanize/comma.go @@ -33,7 +33,7 @@ func Comma(v int64) string { j-- } parts[j] = strconv.Itoa(int(v)) - return sign + strings.Join(parts[j:len(parts)], ",") + return sign + strings.Join(parts[j:], ",") } // Commaf produces a string form of the given number in base 10 with @@ -97,5 +97,5 @@ func BigComma(b *big.Int) string { j-- } parts[j] = strconv.Itoa(int(b.Int64())) - return sign + strings.Join(parts[j:len(parts)], ",") + return sign + strings.Join(parts[j:], ",") } diff --git a/vendor/github.com/dustin/go-humanize/comma_test.go b/vendor/github.com/dustin/go-humanize/comma_test.go deleted file mode 100644 index 49040fb71..000000000 --- a/vendor/github.com/dustin/go-humanize/comma_test.go +++ /dev/null @@ -1,134 +0,0 @@ -package humanize - -import ( - "math" - "math/big" - "testing" -) - -func TestCommas(t *testing.T) { - testList{ - {"0", Comma(0), "0"}, - {"10", Comma(10), "10"}, - {"100", Comma(100), "100"}, - {"1,000", Comma(1000), "1,000"}, - {"10,000", Comma(10000), "10,000"}, - {"100,000", Comma(100000), "100,000"}, - {"10,000,000", Comma(10000000), "10,000,000"}, - {"10,100,000", Comma(10100000), "10,100,000"}, - {"10,010,000", Comma(10010000), "10,010,000"}, - {"10,001,000", Comma(10001000), "10,001,000"}, - {"123,456,789", Comma(123456789), "123,456,789"}, - {"maxint", Comma(9.223372e+18), "9,223,372,000,000,000,000"}, - {"minint", Comma(-9.223372e+18), "-9,223,372,000,000,000,000"}, - {"-123,456,789", Comma(-123456789), "-123,456,789"}, - {"-10,100,000", Comma(-10100000), "-10,100,000"}, - {"-10,010,000", Comma(-10010000), "-10,010,000"}, - {"-10,001,000", Comma(-10001000), "-10,001,000"}, - {"-10,000,000", Comma(-10000000), "-10,000,000"}, - {"-100,000", Comma(-100000), "-100,000"}, - {"-10,000", Comma(-10000), "-10,000"}, - {"-1,000", Comma(-1000), "-1,000"}, - {"-100", Comma(-100), "-100"}, - {"-10", Comma(-10), "-10"}, - }.validate(t) -} - -func TestCommafs(t *testing.T) { - testList{ - {"0", Commaf(0), "0"}, - {"10.11", Commaf(10.11), "10.11"}, - {"100", Commaf(100), "100"}, - {"1,000", Commaf(1000), "1,000"}, - {"10,000", Commaf(10000), "10,000"}, - {"100,000", Commaf(100000), "100,000"}, - {"834,142.32", Commaf(834142.32), "834,142.32"}, - {"10,000,000", Commaf(10000000), "10,000,000"}, - {"10,100,000", Commaf(10100000), "10,100,000"}, - {"10,010,000", Commaf(10010000), "10,010,000"}, - {"10,001,000", Commaf(10001000), "10,001,000"}, - {"123,456,789", Commaf(123456789), "123,456,789"}, - {"maxf64", Commaf(math.MaxFloat64), "179,769,313,486,231,570,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000"}, - {"minf64", Commaf(math.SmallestNonzeroFloat64), "0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005"}, - {"-123,456,789", Commaf(-123456789), "-123,456,789"}, - {"-10,100,000", Commaf(-10100000), "-10,100,000"}, - {"-10,010,000", Commaf(-10010000), "-10,010,000"}, - {"-10,001,000", Commaf(-10001000), "-10,001,000"}, - {"-10,000,000", Commaf(-10000000), "-10,000,000"}, - {"-100,000", Commaf(-100000), "-100,000"}, - {"-10,000", Commaf(-10000), "-10,000"}, - {"-1,000", Commaf(-1000), "-1,000"}, - {"-100.11", Commaf(-100.11), "-100.11"}, - {"-10", Commaf(-10), "-10"}, - }.validate(t) -} - -func BenchmarkCommas(b *testing.B) { - for i := 0; i < b.N; i++ { - Comma(1234567890) - } -} - -func BenchmarkCommaf(b *testing.B) { - for i := 0; i < b.N; i++ { - Commaf(1234567890.83584) - } -} - -func BenchmarkBigCommas(b *testing.B) { - for i := 0; i < b.N; i++ { - BigComma(big.NewInt(1234567890)) - } -} - -func bigComma(i int64) string { - return BigComma(big.NewInt(i)) -} - -func TestBigCommas(t *testing.T) { - testList{ - {"0", bigComma(0), "0"}, - {"10", bigComma(10), "10"}, - {"100", bigComma(100), "100"}, - {"1,000", bigComma(1000), "1,000"}, - {"10,000", bigComma(10000), "10,000"}, - {"100,000", bigComma(100000), "100,000"}, - {"10,000,000", bigComma(10000000), "10,000,000"}, - {"10,100,000", bigComma(10100000), "10,100,000"}, - {"10,010,000", bigComma(10010000), "10,010,000"}, - {"10,001,000", bigComma(10001000), "10,001,000"}, - {"123,456,789", bigComma(123456789), "123,456,789"}, - {"maxint", bigComma(9.223372e+18), "9,223,372,000,000,000,000"}, - {"minint", bigComma(-9.223372e+18), "-9,223,372,000,000,000,000"}, - {"-123,456,789", bigComma(-123456789), "-123,456,789"}, - {"-10,100,000", bigComma(-10100000), "-10,100,000"}, - {"-10,010,000", bigComma(-10010000), "-10,010,000"}, - {"-10,001,000", bigComma(-10001000), "-10,001,000"}, - {"-10,000,000", bigComma(-10000000), "-10,000,000"}, - {"-100,000", bigComma(-100000), "-100,000"}, - {"-10,000", bigComma(-10000), "-10,000"}, - {"-1,000", bigComma(-1000), "-1,000"}, - {"-100", bigComma(-100), "-100"}, - {"-10", bigComma(-10), "-10"}, - }.validate(t) -} - -func TestVeryBigCommas(t *testing.T) { - tests := []struct{ in, exp string }{ - { - "84889279597249724975972597249849757294578485", - "84,889,279,597,249,724,975,972,597,249,849,757,294,578,485", - }, - { - "-84889279597249724975972597249849757294578485", - "-84,889,279,597,249,724,975,972,597,249,849,757,294,578,485", - }, - } - for _, test := range tests { - n, _ := (&big.Int{}).SetString(test.in, 10) - got := BigComma(n) - if test.exp != got { - t.Errorf("Expected %q, got %q", test.exp, got) - } - } -} diff --git a/vendor/github.com/dustin/go-humanize/common_test.go b/vendor/github.com/dustin/go-humanize/common_test.go deleted file mode 100644 index fc7db1516..000000000 --- a/vendor/github.com/dustin/go-humanize/common_test.go +++ /dev/null @@ -1,18 +0,0 @@ -package humanize - -import ( - "testing" -) - -type testList []struct { - name, got, exp string -} - -func (tl testList) validate(t *testing.T) { - for _, test := range tl { - if test.got != test.exp { - t.Errorf("On %v, expected '%v', but got '%v'", - test.name, test.exp, test.got) - } - } -} diff --git a/vendor/github.com/dustin/go-humanize/ftoa_test.go b/vendor/github.com/dustin/go-humanize/ftoa_test.go deleted file mode 100644 index 40d13bd71..000000000 --- a/vendor/github.com/dustin/go-humanize/ftoa_test.go +++ /dev/null @@ -1,55 +0,0 @@ -package humanize - -import ( - "fmt" - "regexp" - "strconv" - "testing" -) - -func TestFtoa(t *testing.T) { - testList{ - {"200", Ftoa(200), "200"}, - {"2", Ftoa(2), "2"}, - {"2.2", Ftoa(2.2), "2.2"}, - {"2.02", Ftoa(2.02), "2.02"}, - {"200.02", Ftoa(200.02), "200.02"}, - }.validate(t) -} - -func BenchmarkFtoaRegexTrailing(b *testing.B) { - trailingZerosRegex := regexp.MustCompile(`\.?0+$`) - - b.ResetTimer() - for i := 0; i < b.N; i++ { - trailingZerosRegex.ReplaceAllString("2.00000", "") - trailingZerosRegex.ReplaceAllString("2.0000", "") - trailingZerosRegex.ReplaceAllString("2.000", "") - trailingZerosRegex.ReplaceAllString("2.00", "") - trailingZerosRegex.ReplaceAllString("2.0", "") - trailingZerosRegex.ReplaceAllString("2", "") - } -} - -func BenchmarkFtoaFunc(b *testing.B) { - for i := 0; i < b.N; i++ { - stripTrailingZeros("2.00000") - stripTrailingZeros("2.0000") - stripTrailingZeros("2.000") - stripTrailingZeros("2.00") - stripTrailingZeros("2.0") - stripTrailingZeros("2") - } -} - -func BenchmarkFmtF(b *testing.B) { - for i := 0; i < b.N; i++ { - fmt.Sprintf("%f", 2.03584) - } -} - -func BenchmarkStrconvF(b *testing.B) { - for i := 0; i < b.N; i++ { - strconv.FormatFloat(2.03584, 'f', 6, 64) - } -} diff --git a/vendor/github.com/dustin/go-humanize/number_test.go b/vendor/github.com/dustin/go-humanize/number_test.go deleted file mode 100644 index dd38a5bb9..000000000 --- a/vendor/github.com/dustin/go-humanize/number_test.go +++ /dev/null @@ -1,78 +0,0 @@ -package humanize - -import ( - "math" - "testing" -) - -type TestStruct struct { - name string - format string - num float64 - formatted string -} - -func TestFormatFloat(t *testing.T) { - tests := []TestStruct{ - {"default", "", 12345.6789, "12,345.68"}, - {"#", "#", 12345.6789, "12345.678900000"}, - {"#.", "#.", 12345.6789, "12346"}, - {"#,#", "#,#", 12345.6789, "12345,7"}, - {"#,##", "#,##", 12345.6789, "12345,68"}, - {"#,###", "#,###", 12345.6789, "12345,679"}, - {"#,###.", "#,###.", 12345.6789, "12,346"}, - {"#,###.##", "#,###.##", 12345.6789, "12,345.68"}, - {"#,###.###", "#,###.###", 12345.6789, "12,345.679"}, - {"#,###.####", "#,###.####", 12345.6789, "12,345.6789"}, - {"#.###,######", "#.###,######", 12345.6789, "12.345,678900"}, - {"#\u202f###,##", "#\u202f###,##", 12345.6789, "12 345,68"}, - - // special cases - {"NaN", "#", math.NaN(), "NaN"}, - {"+Inf", "#", math.Inf(1), "Infinity"}, - {"-Inf", "#", math.Inf(-1), "-Infinity"}, - {"signStr <= -0.000000001", "", -0.000000002, "-0.00"}, - {"signStr = 0", "", 0, "0.00"}, - {"Format directive must start with +", "+000", 12345.6789, "+12345.678900000"}, - } - - for _, test := range tests { - got := FormatFloat(test.format, test.num) - if got != test.formatted { - t.Errorf("On %v (%v, %v), got %v, wanted %v", - test.name, test.format, test.num, got, test.formatted) - } - } - // Test a single integer - got := FormatInteger("#", 12345) - if got != "12345.000000000" { - t.Errorf("On %v (%v, %v), got %v, wanted %v", - "integerTest", "#", 12345, got, "12345.000000000") - } - // Test the things that could panic - panictests := []TestStruct{ - {"RenderFloat(): invalid positive sign directive", "-", 12345.6789, "12,345.68"}, - {"RenderFloat(): thousands separator directive must be followed by 3 digit-specifiers", "0.01", 12345.6789, "12,345.68"}, - } - for _, test := range panictests { - didPanic := false - var message interface{} - func() { - - defer func() { - if message = recover(); message != nil { - didPanic = true - } - }() - - // call the target function - _ = FormatFloat(test.format, test.num) - - }() - if didPanic != true { - t.Errorf("On %v, should have panic and did not.", - test.name) - } - } - -} diff --git a/vendor/github.com/dustin/go-humanize/ordinals_test.go b/vendor/github.com/dustin/go-humanize/ordinals_test.go deleted file mode 100644 index 51d85ee7a..000000000 --- a/vendor/github.com/dustin/go-humanize/ordinals_test.go +++ /dev/null @@ -1,22 +0,0 @@ -package humanize - -import ( - "testing" -) - -func TestOrdinals(t *testing.T) { - testList{ - {"0", Ordinal(0), "0th"}, - {"1", Ordinal(1), "1st"}, - {"2", Ordinal(2), "2nd"}, - {"3", Ordinal(3), "3rd"}, - {"4", Ordinal(4), "4th"}, - {"10", Ordinal(10), "10th"}, - {"11", Ordinal(11), "11th"}, - {"12", Ordinal(12), "12th"}, - {"13", Ordinal(13), "13th"}, - {"101", Ordinal(101), "101st"}, - {"102", Ordinal(102), "102nd"}, - {"103", Ordinal(103), "103rd"}, - }.validate(t) -} diff --git a/vendor/github.com/dustin/go-humanize/si_test.go b/vendor/github.com/dustin/go-humanize/si_test.go deleted file mode 100644 index 32fb386b5..000000000 --- a/vendor/github.com/dustin/go-humanize/si_test.go +++ /dev/null @@ -1,98 +0,0 @@ -package humanize - -import ( - "math" - "testing" -) - -func TestSI(t *testing.T) { - tests := []struct { - name string - num float64 - formatted string - }{ - {"e-24", 1e-24, "1yF"}, - {"e-21", 1e-21, "1zF"}, - {"e-18", 1e-18, "1aF"}, - {"e-15", 1e-15, "1fF"}, - {"e-12", 1e-12, "1pF"}, - {"e-12", 2.2345e-12, "2.2345pF"}, - {"e-12", 2.23e-12, "2.23pF"}, - {"e-11", 2.23e-11, "22.3pF"}, - {"e-10", 2.2e-10, "220pF"}, - {"e-9", 2.2e-9, "2.2nF"}, - {"e-8", 2.2e-8, "22nF"}, - {"e-7", 2.2e-7, "220nF"}, - {"e-6", 2.2e-6, "2.2µF"}, - {"e-6", 1e-6, "1µF"}, - {"e-5", 2.2e-5, "22µF"}, - {"e-4", 2.2e-4, "220µF"}, - {"e-3", 2.2e-3, "2.2mF"}, - {"e-2", 2.2e-2, "22mF"}, - {"e-1", 2.2e-1, "220mF"}, - {"e+0", 2.2e-0, "2.2F"}, - {"e+0", 2.2, "2.2F"}, - {"e+1", 2.2e+1, "22F"}, - {"0", 0, "0F"}, - {"e+1", 22, "22F"}, - {"e+2", 2.2e+2, "220F"}, - {"e+2", 220, "220F"}, - {"e+3", 2.2e+3, "2.2kF"}, - {"e+3", 2200, "2.2kF"}, - {"e+4", 2.2e+4, "22kF"}, - {"e+4", 22000, "22kF"}, - {"e+5", 2.2e+5, "220kF"}, - {"e+6", 2.2e+6, "2.2MF"}, - {"e+6", 1e+6, "1MF"}, - {"e+7", 2.2e+7, "22MF"}, - {"e+8", 2.2e+8, "220MF"}, - {"e+9", 2.2e+9, "2.2GF"}, - {"e+10", 2.2e+10, "22GF"}, - {"e+11", 2.2e+11, "220GF"}, - {"e+12", 2.2e+12, "2.2TF"}, - {"e+15", 2.2e+15, "2.2PF"}, - {"e+18", 2.2e+18, "2.2EF"}, - {"e+21", 2.2e+21, "2.2ZF"}, - {"e+24", 2.2e+24, "2.2YF"}, - - // special case - {"1F", 1000 * 1000, "1MF"}, - {"1F", 1e6, "1MF"}, - } - - for _, test := range tests { - got := SI(test.num, "F") - if got != test.formatted { - t.Errorf("On %v (%v), got %v, wanted %v", - test.name, test.num, got, test.formatted) - } - - gotf, gotu, err := ParseSI(test.formatted) - if err != nil { - t.Errorf("Error parsing %v (%v): %v", test.name, test.formatted, err) - continue - } - - if math.Abs(1-(gotf/test.num)) > 0.01 { - t.Errorf("On %v (%v), got %v, wanted %v (±%v)", - test.name, test.formatted, gotf, test.num, - math.Abs(1-(gotf/test.num))) - } - if gotu != "F" { - t.Errorf("On %v (%v), expected unit F, got %v", - test.name, test.formatted, gotu) - } - } - - // Parse error - gotf, gotu, err := ParseSI("x1.21JW") // 1.21 jigga whats - if err == nil { - t.Errorf("Expected error on x1.21JW, got %v %v", gotf, gotu) - } -} - -func BenchmarkParseSI(b *testing.B) { - for i := 0; i < b.N; i++ { - ParseSI("2.2346ZB") - } -} diff --git a/vendor/github.com/dustin/go-humanize/times_test.go b/vendor/github.com/dustin/go-humanize/times_test.go deleted file mode 100644 index 528daa4ec..000000000 --- a/vendor/github.com/dustin/go-humanize/times_test.go +++ /dev/null @@ -1,71 +0,0 @@ -package humanize - -import ( - "math" - "testing" - "time" -) - -func TestPast(t *testing.T) { - now := time.Now().Unix() - testList{ - {"now", Time(time.Unix(now, 0)), "now"}, - {"1 second ago", Time(time.Unix(now-1, 0)), "1 second ago"}, - {"12 seconds ago", Time(time.Unix(now-12, 0)), "12 seconds ago"}, - {"30 seconds ago", Time(time.Unix(now-30, 0)), "30 seconds ago"}, - {"45 seconds ago", Time(time.Unix(now-45, 0)), "45 seconds ago"}, - {"1 minute ago", Time(time.Unix(now-63, 0)), "1 minute ago"}, - {"15 minutes ago", Time(time.Unix(now-15*Minute, 0)), "15 minutes ago"}, - {"1 hour ago", Time(time.Unix(now-63*Minute, 0)), "1 hour ago"}, - {"2 hours ago", Time(time.Unix(now-2*Hour, 0)), "2 hours ago"}, - {"21 hours ago", Time(time.Unix(now-21*Hour, 0)), "21 hours ago"}, - {"1 day ago", Time(time.Unix(now-26*Hour, 0)), "1 day ago"}, - {"2 days ago", Time(time.Unix(now-49*Hour, 0)), "2 days ago"}, - {"3 days ago", Time(time.Unix(now-3*Day, 0)), "3 days ago"}, - {"1 week ago (1)", Time(time.Unix(now-7*Day, 0)), "1 week ago"}, - {"1 week ago (2)", Time(time.Unix(now-12*Day, 0)), "1 week ago"}, - {"2 weeks ago", Time(time.Unix(now-15*Day, 0)), "2 weeks ago"}, - {"1 month ago", Time(time.Unix(now-39*Day, 0)), "1 month ago"}, - {"3 months ago", Time(time.Unix(now-99*Day, 0)), "3 months ago"}, - {"1 year ago (1)", Time(time.Unix(now-365*Day, 0)), "1 year ago"}, - {"1 year ago (1)", Time(time.Unix(now-400*Day, 0)), "1 year ago"}, - {"2 years ago (1)", Time(time.Unix(now-548*Day, 0)), "2 years ago"}, - {"2 years ago (2)", Time(time.Unix(now-725*Day, 0)), "2 years ago"}, - {"2 years ago (3)", Time(time.Unix(now-800*Day, 0)), "2 years ago"}, - {"3 years ago", Time(time.Unix(now-3*Year, 0)), "3 years ago"}, - {"long ago", Time(time.Unix(now-LongTime, 0)), "a long while ago"}, - }.validate(t) -} - -func TestFuture(t *testing.T) { - now := time.Now().Unix() - testList{ - {"now", Time(time.Unix(now, 0)), "now"}, - {"1 second from now", Time(time.Unix(now+1, 0)), "1 second from now"}, - {"12 seconds from now", Time(time.Unix(now+12, 0)), "12 seconds from now"}, - {"30 seconds from now", Time(time.Unix(now+30, 0)), "30 seconds from now"}, - {"45 seconds from now", Time(time.Unix(now+45, 0)), "45 seconds from now"}, - {"15 minutes from now", Time(time.Unix(now+15*Minute, 0)), "15 minutes from now"}, - {"2 hours from now", Time(time.Unix(now+2*Hour, 0)), "2 hours from now"}, - {"21 hours from now", Time(time.Unix(now+21*Hour, 0)), "21 hours from now"}, - {"1 day from now", Time(time.Unix(now+26*Hour, 0)), "1 day from now"}, - {"2 days from now", Time(time.Unix(now+49*Hour, 0)), "2 days from now"}, - {"3 days from now", Time(time.Unix(now+3*Day, 0)), "3 days from now"}, - {"1 week from now (1)", Time(time.Unix(now+7*Day, 0)), "1 week from now"}, - {"1 week from now (2)", Time(time.Unix(now+12*Day, 0)), "1 week from now"}, - {"2 weeks from now", Time(time.Unix(now+15*Day, 0)), "2 weeks from now"}, - {"1 month from now", Time(time.Unix(now+30*Day, 0)), "1 month from now"}, - {"1 year from now", Time(time.Unix(now+365*Day, 0)), "1 year from now"}, - {"2 years from now", Time(time.Unix(now+2*Year, 0)), "2 years from now"}, - {"a while from now", Time(time.Unix(now+LongTime, 0)), "a long while from now"}, - }.validate(t) -} - -func TestRange(t *testing.T) { - start := time.Time{} - end := time.Unix(math.MaxInt64, math.MaxInt64) - x := RelTime(start, end, "ago", "from now") - if x != "a long while from now" { - t.Errorf("Expected a long while from now, got %q", x) - } -} diff --git a/vendor/github.com/elazarl/go-bindata-assetfs/LICENSE b/vendor/github.com/elazarl/go-bindata-assetfs/LICENSE deleted file mode 100644 index 5782c7269..000000000 --- a/vendor/github.com/elazarl/go-bindata-assetfs/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -Copyright (c) 2014, Elazar Leibovich -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/elazarl/go-bindata-assetfs/README.md b/vendor/github.com/elazarl/go-bindata-assetfs/README.md deleted file mode 100644 index 795d3d320..000000000 --- a/vendor/github.com/elazarl/go-bindata-assetfs/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# go-bindata-assetfs - -Serve embedded files from [jteeuwen/go-bindata](https://github.com/jteeuwen/go-bindata) with `net/http`. - -[GoDoc](http://godoc.org/github.com/elazarl/go-bindata-assetfs) - -### Installation - -Install with - - $ go get github.com/jteeuwen/go-bindata/... - $ go get github.com/elazarl/go-bindata-assetfs/... - -### Creating embedded data - -Usage is identical to [jteeuwen/go-bindata](https://github.com/jteeuwen/go-bindata) usage, -instead of running `go-bindata` run `go-bindata-assetfs`. - -The tool will create a `bindata_assetfs.go` file, which contains the embedded data. - -A typical use case is - - $ go-bindata-assetfs data/... - -### Using assetFS in your code - -The generated file provides an `assetFS()` function that returns a `http.Filesystem` -wrapping the embedded files. What you usually want to do is: - - http.Handle("/", http.FileServer(assetFS())) - -This would run an HTTP server serving the embedded files. - -## Without running binary tool - -You can always just run the `go-bindata` tool, and then - -use - - import "github.com/elazarl/go-bindata-assetfs" - ... - http.Handle("/", - http.FileServer( - &assetfs.AssetFS{Asset: Asset, AssetDir: AssetDir, Prefix: "data"})) - -to serve files embedded from the `data` directory. diff --git a/vendor/github.com/elazarl/go-bindata-assetfs/assetfs.go b/vendor/github.com/elazarl/go-bindata-assetfs/assetfs.go deleted file mode 100644 index 5174d5a6d..000000000 --- a/vendor/github.com/elazarl/go-bindata-assetfs/assetfs.go +++ /dev/null @@ -1,147 +0,0 @@ -package assetfs - -import ( - "bytes" - "errors" - "io" - "io/ioutil" - "net/http" - "os" - "path" - "path/filepath" - "time" -) - -var ( - fileTimestamp = time.Now() -) - -// FakeFile implements os.FileInfo interface for a given path and size -type FakeFile struct { - // Path is the path of this file - Path string - // Dir marks of the path is a directory - Dir bool - // Len is the length of the fake file, zero if it is a directory - Len int64 -} - -func (f *FakeFile) Name() string { - _, name := filepath.Split(f.Path) - return name -} - -func (f *FakeFile) Mode() os.FileMode { - mode := os.FileMode(0644) - if f.Dir { - return mode | os.ModeDir - } - return mode -} - -func (f *FakeFile) ModTime() time.Time { - return fileTimestamp -} - -func (f *FakeFile) Size() int64 { - return f.Len -} - -func (f *FakeFile) IsDir() bool { - return f.Mode().IsDir() -} - -func (f *FakeFile) Sys() interface{} { - return nil -} - -// AssetFile implements http.File interface for a no-directory file with content -type AssetFile struct { - *bytes.Reader - io.Closer - FakeFile -} - -func NewAssetFile(name string, content []byte) *AssetFile { - return &AssetFile{ - bytes.NewReader(content), - ioutil.NopCloser(nil), - FakeFile{name, false, int64(len(content))}} -} - -func (f *AssetFile) Readdir(count int) ([]os.FileInfo, error) { - return nil, errors.New("not a directory") -} - -func (f *AssetFile) Size() int64 { - return f.FakeFile.Size() -} - -func (f *AssetFile) Stat() (os.FileInfo, error) { - return f, nil -} - -// AssetDirectory implements http.File interface for a directory -type AssetDirectory struct { - AssetFile - ChildrenRead int - Children []os.FileInfo -} - -func NewAssetDirectory(name string, children []string, fs *AssetFS) *AssetDirectory { - fileinfos := make([]os.FileInfo, 0, len(children)) - for _, child := range children { - _, err := fs.AssetDir(filepath.Join(name, child)) - fileinfos = append(fileinfos, &FakeFile{child, err == nil, 0}) - } - return &AssetDirectory{ - AssetFile{ - bytes.NewReader(nil), - ioutil.NopCloser(nil), - FakeFile{name, true, 0}, - }, - 0, - fileinfos} -} - -func (f *AssetDirectory) Readdir(count int) ([]os.FileInfo, error) { - if count <= 0 { - return f.Children, nil - } - if f.ChildrenRead+count > len(f.Children) { - count = len(f.Children) - f.ChildrenRead - } - rv := f.Children[f.ChildrenRead : f.ChildrenRead+count] - f.ChildrenRead += count - return rv, nil -} - -func (f *AssetDirectory) Stat() (os.FileInfo, error) { - return f, nil -} - -// AssetFS implements http.FileSystem, allowing -// embedded files to be served from net/http package. -type AssetFS struct { - // Asset should return content of file in path if exists - Asset func(path string) ([]byte, error) - // AssetDir should return list of files in the path - AssetDir func(path string) ([]string, error) - // Prefix would be prepended to http requests - Prefix string -} - -func (fs *AssetFS) Open(name string) (http.File, error) { - name = path.Join(fs.Prefix, name) - if len(name) > 0 && name[0] == '/' { - name = name[1:] - } - if b, err := fs.Asset(name); err == nil { - return NewAssetFile(name, b), nil - } - if children, err := fs.AssetDir(name); err == nil { - return NewAssetDirectory(name, children, fs), nil - } else { - return nil, err - } -} diff --git a/vendor/github.com/elazarl/go-bindata-assetfs/doc.go b/vendor/github.com/elazarl/go-bindata-assetfs/doc.go deleted file mode 100644 index a664249f3..000000000 --- a/vendor/github.com/elazarl/go-bindata-assetfs/doc.go +++ /dev/null @@ -1,13 +0,0 @@ -// assetfs allows packages to serve static content embedded -// with the go-bindata tool with the standard net/http package. -// -// See https://github.com/jteeuwen/go-bindata for more information -// about embedding binary data with go-bindata. -// -// Usage example, after running -// $ go-bindata data/... -// use: -// http.Handle("/", -// http.FileServer( -// &assetfs.AssetFS{Asset: Asset, AssetDir: AssetDir, Prefix: "data"})) -package assetfs diff --git a/vendor/github.com/facebookgo/clock/clock_test.go b/vendor/github.com/facebookgo/clock/clock_test.go deleted file mode 100644 index 452622e19..000000000 --- a/vendor/github.com/facebookgo/clock/clock_test.go +++ /dev/null @@ -1,536 +0,0 @@ -package clock_test - -import ( - "fmt" - "os" - "runtime" - "sync" - "sync/atomic" - "testing" - "time" - - "github.com/facebookgo/clock" -) - -// Ensure that the clock's After channel sends at the correct time. -func TestClock_After(t *testing.T) { - var ok bool - go func() { - time.Sleep(10 * time.Millisecond) - ok = true - }() - go func() { - time.Sleep(30 * time.Millisecond) - t.Fatal("too late") - }() - gosched() - - <-clock.New().After(20 * time.Millisecond) - if !ok { - t.Fatal("too early") - } -} - -// Ensure that the clock's AfterFunc executes at the correct time. -func TestClock_AfterFunc(t *testing.T) { - var ok bool - go func() { - time.Sleep(10 * time.Millisecond) - ok = true - }() - go func() { - time.Sleep(30 * time.Millisecond) - t.Fatal("too late") - }() - gosched() - - var wg sync.WaitGroup - wg.Add(1) - clock.New().AfterFunc(20*time.Millisecond, func() { - wg.Done() - }) - wg.Wait() - if !ok { - t.Fatal("too early") - } -} - -// Ensure that the clock's time matches the standary library. -func TestClock_Now(t *testing.T) { - a := time.Now().Round(time.Second) - b := clock.New().Now().Round(time.Second) - if !a.Equal(b) { - t.Errorf("not equal: %s != %s", a, b) - } -} - -// Ensure that the clock sleeps for the appropriate amount of time. -func TestClock_Sleep(t *testing.T) { - var ok bool - go func() { - time.Sleep(10 * time.Millisecond) - ok = true - }() - go func() { - time.Sleep(30 * time.Millisecond) - t.Fatal("too late") - }() - gosched() - - clock.New().Sleep(20 * time.Millisecond) - if !ok { - t.Fatal("too early") - } -} - -// Ensure that the clock ticks correctly. -func TestClock_Tick(t *testing.T) { - var ok bool - go func() { - time.Sleep(10 * time.Millisecond) - ok = true - }() - go func() { - time.Sleep(50 * time.Millisecond) - t.Fatal("too late") - }() - gosched() - - c := clock.New().Tick(20 * time.Millisecond) - <-c - <-c - if !ok { - t.Fatal("too early") - } -} - -// Ensure that the clock's ticker ticks correctly. -func TestClock_Ticker(t *testing.T) { - var ok bool - go func() { - time.Sleep(100 * time.Millisecond) - ok = true - }() - go func() { - time.Sleep(200 * time.Millisecond) - t.Fatal("too late") - }() - gosched() - - ticker := clock.New().Ticker(50 * time.Millisecond) - <-ticker.C - <-ticker.C - if !ok { - t.Fatal("too early") - } -} - -// Ensure that the clock's ticker can stop correctly. -func TestClock_Ticker_Stp(t *testing.T) { - var ok bool - go func() { - time.Sleep(10 * time.Millisecond) - ok = true - }() - gosched() - - ticker := clock.New().Ticker(20 * time.Millisecond) - <-ticker.C - ticker.Stop() - select { - case <-ticker.C: - t.Fatal("unexpected send") - case <-time.After(30 * time.Millisecond): - } -} - -// Ensure that the clock's timer waits correctly. -func TestClock_Timer(t *testing.T) { - var ok bool - go func() { - time.Sleep(10 * time.Millisecond) - ok = true - }() - go func() { - time.Sleep(30 * time.Millisecond) - t.Fatal("too late") - }() - gosched() - - timer := clock.New().Timer(20 * time.Millisecond) - <-timer.C - if !ok { - t.Fatal("too early") - } -} - -// Ensure that the clock's timer can be stopped. -func TestClock_Timer_Stop(t *testing.T) { - var ok bool - go func() { - time.Sleep(10 * time.Millisecond) - ok = true - }() - - timer := clock.New().Timer(20 * time.Millisecond) - timer.Stop() - select { - case <-timer.C: - t.Fatal("unexpected send") - case <-time.After(30 * time.Millisecond): - } -} - -// Ensure that the mock's After channel sends at the correct time. -func TestMock_After(t *testing.T) { - var ok int32 - clock := clock.NewMock() - - // Create a channel to execute after 10 mock seconds. - ch := clock.After(10 * time.Second) - go func(ch <-chan time.Time) { - <-ch - atomic.StoreInt32(&ok, 1) - }(ch) - - // Move clock forward to just before the time. - clock.Add(9 * time.Second) - if atomic.LoadInt32(&ok) == 1 { - t.Fatal("too early") - } - - // Move clock forward to the after channel's time. - clock.Add(1 * time.Second) - if atomic.LoadInt32(&ok) == 0 { - t.Fatal("too late") - } -} - -// Ensure that the mock's AfterFunc executes at the correct time. -func TestMock_AfterFunc(t *testing.T) { - var ok int32 - clock := clock.NewMock() - - // Execute function after duration. - clock.AfterFunc(10*time.Second, func() { - atomic.StoreInt32(&ok, 1) - }) - - // Move clock forward to just before the time. - clock.Add(9 * time.Second) - if atomic.LoadInt32(&ok) == 1 { - t.Fatal("too early") - } - - // Move clock forward to the after channel's time. - clock.Add(1 * time.Second) - if atomic.LoadInt32(&ok) == 0 { - t.Fatal("too late") - } -} - -// Ensure that the mock's AfterFunc doesn't execute if stopped. -func TestMock_AfterFunc_Stop(t *testing.T) { - // Execute function after duration. - clock := clock.NewMock() - timer := clock.AfterFunc(10*time.Second, func() { - t.Fatal("unexpected function execution") - }) - gosched() - - // Stop timer & move clock forward. - timer.Stop() - clock.Add(10 * time.Second) - gosched() -} - -// Ensure that the mock's current time can be changed. -func TestMock_Now(t *testing.T) { - clock := clock.NewMock() - if now := clock.Now(); !now.Equal(time.Unix(0, 0)) { - t.Fatalf("expected epoch, got: ", now) - } - - // Add 10 seconds and check the time. - clock.Add(10 * time.Second) - if now := clock.Now(); !now.Equal(time.Unix(10, 0)) { - t.Fatalf("expected epoch, got: ", now) - } -} - -// Ensure that the mock can sleep for the correct time. -func TestMock_Sleep(t *testing.T) { - var ok int32 - clock := clock.NewMock() - - // Create a channel to execute after 10 mock seconds. - go func() { - clock.Sleep(10 * time.Second) - atomic.StoreInt32(&ok, 1) - }() - gosched() - - // Move clock forward to just before the sleep duration. - clock.Add(9 * time.Second) - if atomic.LoadInt32(&ok) == 1 { - t.Fatal("too early") - } - - // Move clock forward to the after the sleep duration. - clock.Add(1 * time.Second) - if atomic.LoadInt32(&ok) == 0 { - t.Fatal("too late") - } -} - -// Ensure that the mock's Tick channel sends at the correct time. -func TestMock_Tick(t *testing.T) { - var n int32 - clock := clock.NewMock() - - // Create a channel to increment every 10 seconds. - go func() { - tick := clock.Tick(10 * time.Second) - for { - <-tick - atomic.AddInt32(&n, 1) - } - }() - gosched() - - // Move clock forward to just before the first tick. - clock.Add(9 * time.Second) - if atomic.LoadInt32(&n) != 0 { - t.Fatalf("expected 0, got %d", n) - } - - // Move clock forward to the start of the first tick. - clock.Add(1 * time.Second) - if atomic.LoadInt32(&n) != 1 { - t.Fatalf("expected 1, got %d", n) - } - - // Move clock forward over several ticks. - clock.Add(30 * time.Second) - if atomic.LoadInt32(&n) != 4 { - t.Fatalf("expected 4, got %d", n) - } -} - -// Ensure that the mock's Ticker channel sends at the correct time. -func TestMock_Ticker(t *testing.T) { - var n int32 - clock := clock.NewMock() - - // Create a channel to increment every microsecond. - go func() { - ticker := clock.Ticker(1 * time.Microsecond) - for { - <-ticker.C - atomic.AddInt32(&n, 1) - } - }() - gosched() - - // Move clock forward. - clock.Add(10 * time.Microsecond) - if atomic.LoadInt32(&n) != 10 { - t.Fatalf("unexpected: %d", n) - } -} - -// Ensure that the mock's Ticker channel won't block if not read from. -func TestMock_Ticker_Overflow(t *testing.T) { - clock := clock.NewMock() - ticker := clock.Ticker(1 * time.Microsecond) - clock.Add(10 * time.Microsecond) - ticker.Stop() -} - -// Ensure that the mock's Ticker can be stopped. -func TestMock_Ticker_Stop(t *testing.T) { - var n int32 - clock := clock.NewMock() - - // Create a channel to increment every second. - ticker := clock.Ticker(1 * time.Second) - go func() { - for { - <-ticker.C - atomic.AddInt32(&n, 1) - } - }() - gosched() - - // Move clock forward. - clock.Add(5 * time.Second) - if atomic.LoadInt32(&n) != 5 { - t.Fatalf("expected 5, got: %d", n) - } - - ticker.Stop() - - // Move clock forward again. - clock.Add(5 * time.Second) - if atomic.LoadInt32(&n) != 5 { - t.Fatalf("still expected 5, got: %d", n) - } -} - -// Ensure that multiple tickers can be used together. -func TestMock_Ticker_Multi(t *testing.T) { - var n int32 - clock := clock.NewMock() - - go func() { - a := clock.Ticker(1 * time.Microsecond) - b := clock.Ticker(3 * time.Microsecond) - - for { - select { - case <-a.C: - atomic.AddInt32(&n, 1) - case <-b.C: - atomic.AddInt32(&n, 100) - } - } - }() - gosched() - - // Move clock forward. - clock.Add(10 * time.Microsecond) - gosched() - if atomic.LoadInt32(&n) != 310 { - t.Fatalf("unexpected: %d", n) - } -} - -func ExampleMock_After() { - // Create a new mock clock. - clock := clock.NewMock() - count := 0 - - // Create a channel to execute after 10 mock seconds. - go func() { - <-clock.After(10 * time.Second) - count = 100 - }() - runtime.Gosched() - - // Print the starting value. - fmt.Printf("%s: %d\n", clock.Now().UTC(), count) - - // Move the clock forward 5 seconds and print the value again. - clock.Add(5 * time.Second) - fmt.Printf("%s: %d\n", clock.Now().UTC(), count) - - // Move the clock forward 5 seconds to the tick time and check the value. - clock.Add(5 * time.Second) - fmt.Printf("%s: %d\n", clock.Now().UTC(), count) - - // Output: - // 1970-01-01 00:00:00 +0000 UTC: 0 - // 1970-01-01 00:00:05 +0000 UTC: 0 - // 1970-01-01 00:00:10 +0000 UTC: 100 -} - -func ExampleMock_AfterFunc() { - // Create a new mock clock. - clock := clock.NewMock() - count := 0 - - // Execute a function after 10 mock seconds. - clock.AfterFunc(10*time.Second, func() { - count = 100 - }) - runtime.Gosched() - - // Print the starting value. - fmt.Printf("%s: %d\n", clock.Now().UTC(), count) - - // Move the clock forward 10 seconds and print the new value. - clock.Add(10 * time.Second) - fmt.Printf("%s: %d\n", clock.Now().UTC(), count) - - // Output: - // 1970-01-01 00:00:00 +0000 UTC: 0 - // 1970-01-01 00:00:10 +0000 UTC: 100 -} - -func ExampleMock_Sleep() { - // Create a new mock clock. - clock := clock.NewMock() - count := 0 - - // Execute a function after 10 mock seconds. - go func() { - clock.Sleep(10 * time.Second) - count = 100 - }() - runtime.Gosched() - - // Print the starting value. - fmt.Printf("%s: %d\n", clock.Now().UTC(), count) - - // Move the clock forward 10 seconds and print the new value. - clock.Add(10 * time.Second) - fmt.Printf("%s: %d\n", clock.Now().UTC(), count) - - // Output: - // 1970-01-01 00:00:00 +0000 UTC: 0 - // 1970-01-01 00:00:10 +0000 UTC: 100 -} - -func ExampleMock_Ticker() { - // Create a new mock clock. - clock := clock.NewMock() - count := 0 - - // Increment count every mock second. - go func() { - ticker := clock.Ticker(1 * time.Second) - for { - <-ticker.C - count++ - } - }() - runtime.Gosched() - - // Move the clock forward 10 seconds and print the new value. - clock.Add(10 * time.Second) - fmt.Printf("Count is %d after 10 seconds\n", count) - - // Move the clock forward 5 more seconds and print the new value. - clock.Add(5 * time.Second) - fmt.Printf("Count is %d after 15 seconds\n", count) - - // Output: - // Count is 10 after 10 seconds - // Count is 15 after 15 seconds -} - -func ExampleMock_Timer() { - // Create a new mock clock. - clock := clock.NewMock() - count := 0 - - // Increment count after a mock second. - go func() { - timer := clock.Timer(1 * time.Second) - <-timer.C - count++ - }() - runtime.Gosched() - - // Move the clock forward 10 seconds and print the new value. - clock.Add(10 * time.Second) - fmt.Printf("Count is %d after 10 seconds\n", count) - - // Output: - // Count is 1 after 10 seconds -} - -func warn(v ...interface{}) { fmt.Fprintln(os.Stderr, v...) } -func warnf(msg string, v ...interface{}) { fmt.Fprintf(os.Stderr, msg+"\n", v...) } - -func gosched() { time.Sleep(1 * time.Millisecond) } diff --git a/vendor/github.com/facebookgo/httpdown/httpdown_test.go b/vendor/github.com/facebookgo/httpdown/httpdown_test.go deleted file mode 100644 index e582e22b6..000000000 --- a/vendor/github.com/facebookgo/httpdown/httpdown_test.go +++ /dev/null @@ -1,677 +0,0 @@ -package httpdown_test - -import ( - "bytes" - "crypto/tls" - "errors" - "fmt" - "io/ioutil" - "net" - "net/http" - "os" - "regexp" - "sync" - "sync/atomic" - "testing" - "time" - - "github.com/facebookgo/clock" - "github.com/facebookgo/ensure" - "github.com/facebookgo/freeport" - "github.com/facebookgo/httpdown" - "github.com/facebookgo/stats" -) - -type onCloseListener struct { - net.Listener - mutex sync.Mutex - onClose chan struct{} -} - -func (o *onCloseListener) Close() error { - // Listener is closed twice, once by Grace, and once by the http library, so - // we guard against a double close of the chan. - defer func() { - o.mutex.Lock() - defer o.mutex.Unlock() - if o.onClose != nil { - close(o.onClose) - o.onClose = nil - } - }() - return o.Listener.Close() -} - -func NewOnCloseListener(l net.Listener) (net.Listener, chan struct{}) { - c := make(chan struct{}) - return &onCloseListener{Listener: l, onClose: c}, c -} - -type closeErrListener struct { - net.Listener - err error -} - -func (c *closeErrListener) Close() error { - c.Listener.Close() - return c.err -} - -type acceptErrListener struct { - net.Listener - err chan error -} - -func (c *acceptErrListener) Accept() (net.Conn, error) { - return nil, <-c.err -} - -type closeErrConn struct { - net.Conn - unblockClose chan chan struct{} -} - -func (c *closeErrConn) Close() error { - ch := <-c.unblockClose - - // Close gets called multiple times, but only the first one gets this ch - if ch != nil { - defer close(ch) - } - - return c.Conn.Close() -} - -type closeErrConnListener struct { - net.Listener - unblockClose chan chan struct{} -} - -func (l *closeErrConnListener) Accept() (net.Conn, error) { - c, err := l.Listener.Accept() - if err != nil { - return c, err - } - return &closeErrConn{Conn: c, unblockClose: l.unblockClose}, nil -} - -func TestHTTPStopWithNoRequest(t *testing.T) { - t.Parallel() - listener, err := net.Listen("tcp", "127.0.0.1:0") - ensure.Nil(t, err) - - statsDone := make(chan struct{}, 2) - hc := &stats.HookClient{ - BumpSumHook: func(key string, val float64) { - if key == "serve" && val == 1 { - statsDone <- struct{}{} - } - if key == "stop" && val == 1 { - statsDone <- struct{}{} - } - }, - } - - server := &http.Server{} - down := &httpdown.HTTP{Stats: hc} - s := down.Serve(server, listener) - ensure.Nil(t, s.Stop()) - <-statsDone - <-statsDone -} - -func TestHTTPStopWithFinishedRequest(t *testing.T) { - t.Parallel() - hello := []byte("hello") - fin := make(chan struct{}) - okHandler := func(w http.ResponseWriter, r *http.Request) { - defer close(fin) - w.Write(hello) - } - - listener, err := net.Listen("tcp", "127.0.0.1:0") - ensure.Nil(t, err) - server := &http.Server{Handler: http.HandlerFunc(okHandler)} - transport := &http.Transport{} - client := &http.Client{Transport: transport} - down := &httpdown.HTTP{} - s := down.Serve(server, listener) - res, err := client.Get(fmt.Sprintf("http://%s/", listener.Addr().String())) - ensure.Nil(t, err) - actualBody, err := ioutil.ReadAll(res.Body) - ensure.Nil(t, err) - ensure.DeepEqual(t, actualBody, hello) - ensure.Nil(t, res.Body.Close()) - - // At this point the request is finished, and the connection should be alive - // but idle (because we have keep alive enabled by default in our Transport). - ensure.Nil(t, s.Stop()) - <-fin - - ensure.Nil(t, s.Wait()) -} - -func TestHTTPStopWithActiveRequest(t *testing.T) { - t.Parallel() - const count = 10000 - hello := []byte("hello") - finOkHandler := make(chan struct{}) - okHandler := func(w http.ResponseWriter, r *http.Request) { - defer close(finOkHandler) - w.WriteHeader(200) - for i := 0; i < count; i++ { - w.Write(hello) - } - } - - listener, err := net.Listen("tcp", "127.0.0.1:0") - ensure.Nil(t, err) - server := &http.Server{Handler: http.HandlerFunc(okHandler)} - transport := &http.Transport{} - client := &http.Client{Transport: transport} - down := &httpdown.HTTP{} - s := down.Serve(server, listener) - res, err := client.Get(fmt.Sprintf("http://%s/", listener.Addr().String())) - ensure.Nil(t, err) - - finStop := make(chan struct{}) - go func() { - defer close(finStop) - ensure.Nil(t, s.Stop()) - }() - - actualBody, err := ioutil.ReadAll(res.Body) - ensure.Nil(t, err) - ensure.DeepEqual(t, actualBody, bytes.Repeat(hello, count)) - ensure.Nil(t, res.Body.Close()) - <-finOkHandler - <-finStop -} - -func TestNewRequestAfterStop(t *testing.T) { - t.Parallel() - const count = 10000 - hello := []byte("hello") - finOkHandler := make(chan struct{}) - unblockOkHandler := make(chan struct{}) - okHandler := func(w http.ResponseWriter, r *http.Request) { - defer close(finOkHandler) - w.WriteHeader(200) - const diff = 500 - for i := 0; i < count-diff; i++ { - w.Write(hello) - } - <-unblockOkHandler - for i := 0; i < diff; i++ { - w.Write(hello) - } - } - - listener, err := net.Listen("tcp", "127.0.0.1:0") - listener, onClose := NewOnCloseListener(listener) - ensure.Nil(t, err) - server := &http.Server{Handler: http.HandlerFunc(okHandler)} - transport := &http.Transport{} - client := &http.Client{Transport: transport} - down := &httpdown.HTTP{} - s := down.Serve(server, listener) - res, err := client.Get(fmt.Sprintf("http://%s/", listener.Addr().String())) - ensure.Nil(t, err) - - finStop := make(chan struct{}) - go func() { - defer close(finStop) - ensure.Nil(t, s.Stop()) - }() - - // Wait until the listener is closed. - <-onClose - - // Now the next request should not be able to connect as the listener is - // now closed. - _, err = client.Get(fmt.Sprintf("http://%s/", listener.Addr().String())) - - // We should just get "connection refused" here, but sometimes, very rarely, - // we get a "connection reset" instead. Unclear why this happens. - ensure.Err(t, err, regexp.MustCompile("(connection refused|connection reset by peer)$")) - - // Unblock the handler and ensure we finish writing the rest of the body - // successfully. - close(unblockOkHandler) - actualBody, err := ioutil.ReadAll(res.Body) - ensure.Nil(t, err) - ensure.DeepEqual(t, actualBody, bytes.Repeat(hello, count)) - ensure.Nil(t, res.Body.Close()) - <-finOkHandler - <-finStop -} - -func TestHTTPListenerCloseError(t *testing.T) { - t.Parallel() - expectedError := errors.New("foo") - listener, err := net.Listen("tcp", "127.0.0.1:0") - listener = &closeErrListener{Listener: listener, err: expectedError} - ensure.Nil(t, err) - server := &http.Server{} - down := &httpdown.HTTP{} - s := down.Serve(server, listener) - ensure.DeepEqual(t, s.Stop(), expectedError) -} - -func TestHTTPServeError(t *testing.T) { - t.Parallel() - expectedError := errors.New("foo") - listener, err := net.Listen("tcp", "127.0.0.1:0") - errChan := make(chan error) - listener = &acceptErrListener{Listener: listener, err: errChan} - ensure.Nil(t, err) - server := &http.Server{} - down := &httpdown.HTTP{} - s := down.Serve(server, listener) - errChan <- expectedError - ensure.DeepEqual(t, s.Wait(), expectedError) - ensure.Nil(t, s.Stop()) -} - -func TestHTTPWithinStopTimeout(t *testing.T) { - t.Parallel() - hello := []byte("hello") - finOkHandler := make(chan struct{}) - okHandler := func(w http.ResponseWriter, r *http.Request) { - defer close(finOkHandler) - w.WriteHeader(200) - w.Write(hello) - } - - listener, err := net.Listen("tcp", "127.0.0.1:0") - ensure.Nil(t, err) - server := &http.Server{Handler: http.HandlerFunc(okHandler)} - transport := &http.Transport{} - client := &http.Client{Transport: transport} - down := &httpdown.HTTP{StopTimeout: time.Minute} - s := down.Serve(server, listener) - res, err := client.Get(fmt.Sprintf("http://%s/", listener.Addr().String())) - ensure.Nil(t, err) - - finStop := make(chan struct{}) - go func() { - defer close(finStop) - ensure.Nil(t, s.Stop()) - }() - - actualBody, err := ioutil.ReadAll(res.Body) - ensure.Nil(t, err) - ensure.DeepEqual(t, actualBody, hello) - ensure.Nil(t, res.Body.Close()) - <-finOkHandler - <-finStop -} - -func TestHTTPStopTimeoutMissed(t *testing.T) { - t.Parallel() - - klock := clock.NewMock() - - const count = 10000 - hello := []byte("hello") - finOkHandler := make(chan struct{}) - unblockOkHandler := make(chan struct{}) - okHandler := func(w http.ResponseWriter, r *http.Request) { - defer close(finOkHandler) - w.Header().Set("Content-Length", fmt.Sprint(len(hello)*count)) - w.WriteHeader(200) - for i := 0; i < count/2; i++ { - w.Write(hello) - } - <-unblockOkHandler - for i := 0; i < count/2; i++ { - w.Write(hello) - } - } - - listener, err := net.Listen("tcp", "127.0.0.1:0") - ensure.Nil(t, err) - server := &http.Server{Handler: http.HandlerFunc(okHandler)} - transport := &http.Transport{} - client := &http.Client{Transport: transport} - down := &httpdown.HTTP{ - StopTimeout: time.Minute, - Clock: klock, - } - s := down.Serve(server, listener) - res, err := client.Get(fmt.Sprintf("http://%s/", listener.Addr().String())) - ensure.Nil(t, err) - - finStop := make(chan struct{}) - go func() { - defer close(finStop) - ensure.Nil(t, s.Stop()) - }() - - klock.Wait(clock.Calls{After: 1}) // wait for Stop to call After - klock.Add(down.StopTimeout) - - _, err = ioutil.ReadAll(res.Body) - ensure.Err(t, err, regexp.MustCompile("^unexpected EOF$")) - ensure.Nil(t, res.Body.Close()) - close(unblockOkHandler) - <-finOkHandler - <-finStop -} - -func TestHTTPKillTimeout(t *testing.T) { - t.Parallel() - - klock := clock.NewMock() - - statsDone := make(chan struct{}, 1) - hc := &stats.HookClient{ - BumpSumHook: func(key string, val float64) { - if key == "kill" && val == 1 { - statsDone <- struct{}{} - } - }, - } - - const count = 10000 - hello := []byte("hello") - finOkHandler := make(chan struct{}) - unblockOkHandler := make(chan struct{}) - okHandler := func(w http.ResponseWriter, r *http.Request) { - defer close(finOkHandler) - w.Header().Set("Content-Length", fmt.Sprint(len(hello)*count)) - w.WriteHeader(200) - for i := 0; i < count/2; i++ { - w.Write(hello) - } - <-unblockOkHandler - for i := 0; i < count/2; i++ { - w.Write(hello) - } - } - - listener, err := net.Listen("tcp", "127.0.0.1:0") - ensure.Nil(t, err) - server := &http.Server{Handler: http.HandlerFunc(okHandler)} - transport := &http.Transport{} - client := &http.Client{Transport: transport} - down := &httpdown.HTTP{ - StopTimeout: time.Minute, - KillTimeout: time.Minute, - Stats: hc, - Clock: klock, - } - s := down.Serve(server, listener) - res, err := client.Get(fmt.Sprintf("http://%s/", listener.Addr().String())) - ensure.Nil(t, err) - - finStop := make(chan struct{}) - go func() { - defer close(finStop) - ensure.Nil(t, s.Stop()) - }() - - klock.Wait(clock.Calls{After: 1}) // wait for Stop to call After - klock.Add(down.StopTimeout) - - _, err = ioutil.ReadAll(res.Body) - ensure.Err(t, err, regexp.MustCompile("^unexpected EOF$")) - ensure.Nil(t, res.Body.Close()) - close(unblockOkHandler) - <-finOkHandler - <-finStop - <-statsDone -} - -func TestHTTPKillTimeoutMissed(t *testing.T) { - t.Parallel() - - klock := clock.NewMock() - - statsDone := make(chan struct{}, 1) - hc := &stats.HookClient{ - BumpSumHook: func(key string, val float64) { - if key == "kill.timeout" && val == 1 { - statsDone <- struct{}{} - } - }, - } - - const count = 10000 - hello := []byte("hello") - finOkHandler := make(chan struct{}) - unblockOkHandler := make(chan struct{}) - okHandler := func(w http.ResponseWriter, r *http.Request) { - defer close(finOkHandler) - w.Header().Set("Content-Length", fmt.Sprint(len(hello)*count)) - w.WriteHeader(200) - for i := 0; i < count/2; i++ { - w.Write(hello) - } - <-unblockOkHandler - for i := 0; i < count/2; i++ { - w.Write(hello) - } - } - - listener, err := net.Listen("tcp", "127.0.0.1:0") - ensure.Nil(t, err) - unblockConnClose := make(chan chan struct{}, 1) - listener = &closeErrConnListener{ - Listener: listener, - unblockClose: unblockConnClose, - } - - server := &http.Server{Handler: http.HandlerFunc(okHandler)} - transport := &http.Transport{} - client := &http.Client{Transport: transport} - down := &httpdown.HTTP{ - StopTimeout: time.Minute, - KillTimeout: time.Minute, - Stats: hc, - Clock: klock, - } - s := down.Serve(server, listener) - res, err := client.Get(fmt.Sprintf("http://%s/", listener.Addr().String())) - ensure.Nil(t, err) - - // Start the Stop process. - finStop := make(chan struct{}) - go func() { - defer close(finStop) - ensure.Nil(t, s.Stop()) - }() - - klock.Wait(clock.Calls{After: 1}) // wait for Stop to call After - klock.Add(down.StopTimeout) // trigger stop timeout - klock.Wait(clock.Calls{After: 2}) // wait for Kill to call After - klock.Add(down.KillTimeout) // trigger kill timeout - - // We hit both the StopTimeout & the KillTimeout. - <-finStop - - // Then we unblock the Close, so we get an unexpected EOF since we close - // before we finish writing the response. - connCloseDone := make(chan struct{}) - unblockConnClose <- connCloseDone - <-connCloseDone - close(unblockConnClose) - - // Then we unblock the handler which tries to write the rest of the data. - close(unblockOkHandler) - - _, err = ioutil.ReadAll(res.Body) - ensure.Err(t, err, regexp.MustCompile("^unexpected EOF$")) - ensure.Nil(t, res.Body.Close()) - <-finOkHandler - <-statsDone -} - -func TestDoubleStop(t *testing.T) { - t.Parallel() - listener, err := net.Listen("tcp", "127.0.0.1:0") - ensure.Nil(t, err) - server := &http.Server{} - down := &httpdown.HTTP{} - s := down.Serve(server, listener) - ensure.Nil(t, s.Stop()) - ensure.Nil(t, s.Stop()) -} - -func TestExistingConnState(t *testing.T) { - t.Parallel() - hello := []byte("hello") - fin := make(chan struct{}) - okHandler := func(w http.ResponseWriter, r *http.Request) { - defer close(fin) - w.Write(hello) - } - - var called int32 - listener, err := net.Listen("tcp", "127.0.0.1:0") - ensure.Nil(t, err) - server := &http.Server{ - Handler: http.HandlerFunc(okHandler), - ConnState: func(c net.Conn, s http.ConnState) { - atomic.AddInt32(&called, 1) - }, - } - transport := &http.Transport{} - client := &http.Client{Transport: transport} - down := &httpdown.HTTP{} - s := down.Serve(server, listener) - res, err := client.Get(fmt.Sprintf("http://%s/", listener.Addr().String())) - ensure.Nil(t, err) - actualBody, err := ioutil.ReadAll(res.Body) - ensure.Nil(t, err) - ensure.DeepEqual(t, actualBody, hello) - ensure.Nil(t, res.Body.Close()) - - ensure.Nil(t, s.Stop()) - <-fin - - ensure.True(t, atomic.LoadInt32(&called) > 0) -} - -func TestHTTPDefaultListenError(t *testing.T) { - if os.Getuid() == 0 { - t.Skip("cant run this test as root") - } - - statsDone := make(chan struct{}, 1) - hc := &stats.HookClient{ - BumpSumHook: func(key string, val float64) { - if key == "listen.error" && val == 1 { - statsDone <- struct{}{} - } - }, - } - - t.Parallel() - down := &httpdown.HTTP{Stats: hc} - _, err := down.ListenAndServe(&http.Server{}) - ensure.Err(t, err, regexp.MustCompile("listen tcp :80: bind: permission denied")) - <-statsDone -} - -func TestHTTPSDefaultListenError(t *testing.T) { - if os.Getuid() == 0 { - t.Skip("cant run this test as root") - } - t.Parallel() - - cert, err := tls.X509KeyPair(localhostCert, localhostKey) - if err != nil { - t.Fatalf("error loading cert: %v", err) - } - - down := &httpdown.HTTP{} - _, err = down.ListenAndServe(&http.Server{ - TLSConfig: &tls.Config{ - NextProtos: []string{"http/1.1"}, - Certificates: []tls.Certificate{cert}, - }, - }) - ensure.Err(t, err, regexp.MustCompile("listen tcp :443: bind: permission denied")) -} - -func TestTLS(t *testing.T) { - t.Parallel() - port, err := freeport.Get() - ensure.Nil(t, err) - - cert, err := tls.X509KeyPair(localhostCert, localhostKey) - if err != nil { - t.Fatalf("error loading cert: %v", err) - } - const count = 10000 - hello := []byte("hello") - finOkHandler := make(chan struct{}) - okHandler := func(w http.ResponseWriter, r *http.Request) { - defer close(finOkHandler) - w.WriteHeader(200) - for i := 0; i < count; i++ { - w.Write(hello) - } - } - - server := &http.Server{ - Addr: fmt.Sprintf("0.0.0.0:%d", port), - Handler: http.HandlerFunc(okHandler), - TLSConfig: &tls.Config{ - NextProtos: []string{"http/1.1"}, - Certificates: []tls.Certificate{cert}, - }, - } - transport := &http.Transport{ - TLSClientConfig: &tls.Config{ - InsecureSkipVerify: true, - }, - } - client := &http.Client{Transport: transport} - down := &httpdown.HTTP{} - s, err := down.ListenAndServe(server) - ensure.Nil(t, err) - res, err := client.Get(fmt.Sprintf("https://%s/", server.Addr)) - ensure.Nil(t, err) - - finStop := make(chan struct{}) - go func() { - defer close(finStop) - ensure.Nil(t, s.Stop()) - }() - - actualBody, err := ioutil.ReadAll(res.Body) - ensure.Nil(t, err) - ensure.DeepEqual(t, actualBody, bytes.Repeat(hello, count)) - ensure.Nil(t, res.Body.Close()) - <-finOkHandler - <-finStop -} - -// localhostCert is a PEM-encoded TLS cert with SAN IPs -// "127.0.0.1" and "[::1]", expiring at the last second of 2049 (the end -// of ASN.1 time). -// generated from src/pkg/crypto/tls: -// go run generate_cert.go --rsa-bits 512 --host 127.0.0.1,::1,example.com --ca --start-date "Jan 1 00:00:00 1970" --duration=1000000h -var localhostCert = []byte(`-----BEGIN CERTIFICATE----- -MIIBdzCCASOgAwIBAgIBADALBgkqhkiG9w0BAQUwEjEQMA4GA1UEChMHQWNtZSBD -bzAeFw03MDAxMDEwMDAwMDBaFw00OTEyMzEyMzU5NTlaMBIxEDAOBgNVBAoTB0Fj -bWUgQ28wWjALBgkqhkiG9w0BAQEDSwAwSAJBALyCfqwwip8BvTKgVKGdmjZTU8DD -ndR+WALmFPIRqn89bOU3s30olKiqYEju/SFoEvMyFRT/TWEhXHDaufThqaMCAwEA -AaNoMGYwDgYDVR0PAQH/BAQDAgCkMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA8GA1Ud -EwEB/wQFMAMBAf8wLgYDVR0RBCcwJYILZXhhbXBsZS5jb22HBH8AAAGHEAAAAAAA -AAAAAAAAAAAAAAEwCwYJKoZIhvcNAQEFA0EAr/09uy108p51rheIOSnz4zgduyTl -M+4AmRo8/U1twEZLgfAGG/GZjREv2y4mCEUIM3HebCAqlA5jpRg76Rf8jw== ------END CERTIFICATE-----`) - -// localhostKey is the private key for localhostCert. -var localhostKey = []byte(`-----BEGIN RSA PRIVATE KEY----- -MIIBOQIBAAJBALyCfqwwip8BvTKgVKGdmjZTU8DDndR+WALmFPIRqn89bOU3s30o -lKiqYEju/SFoEvMyFRT/TWEhXHDaufThqaMCAwEAAQJAPXuWUxTV8XyAt8VhNQER -LgzJcUKb9JVsoS1nwXgPksXnPDKnL9ax8VERrdNr+nZbj2Q9cDSXBUovfdtehcdP -qQIhAO48ZsPylbTrmtjDEKiHT2Ik04rLotZYS2U873J6I7WlAiEAypDjYxXyafv/ -Yo1pm9onwcetQKMW8CS3AjuV9Axzj6cCIEx2Il19fEMG4zny0WPlmbrcKvD/DpJQ -4FHrzsYlIVTpAiAas7S1uAvneqd0l02HlN9OxQKKlbUNXNme+rnOnOGS2wIgS0jW -zl1jvrOSJeP1PpAHohWz6LOhEr8uvltWkN6x3vE= ------END RSA PRIVATE KEY-----`) diff --git a/vendor/github.com/facebookgo/stats/stats_test.go b/vendor/github.com/facebookgo/stats/stats_test.go deleted file mode 100644 index b53df71b1..000000000 --- a/vendor/github.com/facebookgo/stats/stats_test.go +++ /dev/null @@ -1,77 +0,0 @@ -package stats_test - -import ( - "testing" - - "github.com/facebookgo/ensure" - "github.com/facebookgo/stats" -) - -// Ensure calling End works even when a BumpTimeHook isn't provided. -func TestHookClientBumpTime(t *testing.T) { - (&stats.HookClient{}).BumpTime("foo").End() -} - -func TestPrefixClient(t *testing.T) { - const ( - prefix1 = "prefix1" - prefix2 = "prefix2" - avgKey = "avg" - avgVal = float64(1) - sumKey = "sum" - sumVal = float64(2) - histogramKey = "histogram" - histogramVal = float64(3) - timeKey = "time" - ) - - var keys []string - hc := &stats.HookClient{ - BumpAvgHook: func(key string, val float64) { - keys = append(keys, key) - ensure.DeepEqual(t, val, avgVal) - }, - BumpSumHook: func(key string, val float64) { - keys = append(keys, key) - ensure.DeepEqual(t, val, sumVal) - }, - BumpHistogramHook: func(key string, val float64) { - keys = append(keys, key) - ensure.DeepEqual(t, val, histogramVal) - }, - BumpTimeHook: func(key string) interface { - End() - } { - return multiEnderTest{ - EndHook: func() { - keys = append(keys, key) - }, - } - }, - } - - pc := stats.PrefixClient([]string{prefix1, prefix2}, hc) - pc.BumpAvg(avgKey, avgVal) - pc.BumpSum(sumKey, sumVal) - pc.BumpHistogram(histogramKey, histogramVal) - pc.BumpTime(timeKey).End() - - ensure.SameElements(t, keys, []string{ - prefix1 + avgKey, - prefix1 + sumKey, - prefix1 + histogramKey, - prefix1 + timeKey, - prefix2 + avgKey, - prefix2 + sumKey, - prefix2 + histogramKey, - prefix2 + timeKey, - }) -} - -type multiEnderTest struct { - EndHook func() -} - -func (e multiEnderTest) End() { - e.EndHook() -} diff --git a/vendor/github.com/fatih/color/color_test.go b/vendor/github.com/fatih/color/color_test.go deleted file mode 100644 index 053b561d6..000000000 --- a/vendor/github.com/fatih/color/color_test.go +++ /dev/null @@ -1,212 +0,0 @@ -package color - -import ( - "bytes" - "fmt" - "os" - "testing" - - "github.com/shiena/ansicolor" -) - -// Testing colors is kinda different. First we test for given colors and their -// escaped formatted results. Next we create some visual tests to be tested. -// Each visual test includes the color name to be compared. -func TestColor(t *testing.T) { - rb := new(bytes.Buffer) - Output = rb - - NoColor = false - - testColors := []struct { - text string - code Attribute - }{ - {text: "black", code: FgBlack}, - {text: "red", code: FgRed}, - {text: "green", code: FgGreen}, - {text: "yellow", code: FgYellow}, - {text: "blue", code: FgBlue}, - {text: "magent", code: FgMagenta}, - {text: "cyan", code: FgCyan}, - {text: "white", code: FgWhite}, - } - - for _, c := range testColors { - New(c.code).Print(c.text) - - line, _ := rb.ReadString('\n') - scannedLine := fmt.Sprintf("%q", line) - colored := fmt.Sprintf("\x1b[%dm%s\x1b[0m", c.code, c.text) - escapedForm := fmt.Sprintf("%q", colored) - - fmt.Printf("%s\t: %s\n", c.text, line) - - if scannedLine != escapedForm { - t.Errorf("Expecting %s, got '%s'\n", escapedForm, scannedLine) - } - } -} - -func TestColorEquals(t *testing.T) { - fgblack1 := New(FgBlack) - fgblack2 := New(FgBlack) - bgblack := New(BgBlack) - fgbgblack := New(FgBlack, BgBlack) - fgblackbgred := New(FgBlack, BgRed) - fgred := New(FgRed) - bgred := New(BgRed) - - if !fgblack1.Equals(fgblack2) { - t.Error("Two black colors are not equal") - } - - if fgblack1.Equals(bgblack) { - t.Error("Fg and bg black colors are equal") - } - - if fgblack1.Equals(fgbgblack) { - t.Error("Fg black equals fg/bg black color") - } - - if fgblack1.Equals(fgred) { - t.Error("Fg black equals Fg red") - } - - if fgblack1.Equals(bgred) { - t.Error("Fg black equals Bg red") - } - - if fgblack1.Equals(fgblackbgred) { - t.Error("Fg black equals fg black bg red") - } -} - -func TestNoColor(t *testing.T) { - rb := new(bytes.Buffer) - Output = rb - - testColors := []struct { - text string - code Attribute - }{ - {text: "black", code: FgBlack}, - {text: "red", code: FgRed}, - {text: "green", code: FgGreen}, - {text: "yellow", code: FgYellow}, - {text: "blue", code: FgBlue}, - {text: "magent", code: FgMagenta}, - {text: "cyan", code: FgCyan}, - {text: "white", code: FgWhite}, - } - - for _, c := range testColors { - p := New(c.code) - p.DisableColor() - p.Print(c.text) - - line, _ := rb.ReadString('\n') - if line != c.text { - t.Errorf("Expecting %s, got '%s'\n", c.text, line) - } - } - - // global check - NoColor = true - defer func() { - NoColor = false - }() - for _, c := range testColors { - p := New(c.code) - p.Print(c.text) - - line, _ := rb.ReadString('\n') - if line != c.text { - t.Errorf("Expecting %s, got '%s'\n", c.text, line) - } - } - -} - -func TestColorVisual(t *testing.T) { - // First Visual Test - fmt.Println("") - Output = ansicolor.NewAnsiColorWriter(os.Stdout) - - New(FgRed).Printf("red\t") - New(BgRed).Print(" ") - New(FgRed, Bold).Println(" red") - - New(FgGreen).Printf("green\t") - New(BgGreen).Print(" ") - New(FgGreen, Bold).Println(" green") - - New(FgYellow).Printf("yellow\t") - New(BgYellow).Print(" ") - New(FgYellow, Bold).Println(" yellow") - - New(FgBlue).Printf("blue\t") - New(BgBlue).Print(" ") - New(FgBlue, Bold).Println(" blue") - - New(FgMagenta).Printf("magenta\t") - New(BgMagenta).Print(" ") - New(FgMagenta, Bold).Println(" magenta") - - New(FgCyan).Printf("cyan\t") - New(BgCyan).Print(" ") - New(FgCyan, Bold).Println(" cyan") - - New(FgWhite).Printf("white\t") - New(BgWhite).Print(" ") - New(FgWhite, Bold).Println(" white") - fmt.Println("") - - // Second Visual test - Black("black") - Red("red") - Green("green") - Yellow("yellow") - Blue("blue") - Magenta("magenta") - Cyan("cyan") - White("white") - - // Third visual test - fmt.Println() - Set(FgBlue) - fmt.Println("is this blue?") - Unset() - - Set(FgMagenta) - fmt.Println("and this magenta?") - Unset() - - // Fourth Visual test - fmt.Println() - blue := New(FgBlue).PrintlnFunc() - blue("blue text with custom print func") - - red := New(FgRed).PrintfFunc() - red("red text with a printf func: %d\n", 123) - - put := New(FgYellow).SprintFunc() - warn := New(FgRed).SprintFunc() - - fmt.Fprintf(Output, "this is a %s and this is %s.\n", put("warning"), warn("error")) - - info := New(FgWhite, BgGreen).SprintFunc() - fmt.Fprintf(Output, "this %s rocks!\n", info("package")) - - // Fifth Visual Test - fmt.Println() - - fmt.Fprintln(Output, BlackString("black")) - fmt.Fprintln(Output, RedString("red")) - fmt.Fprintln(Output, GreenString("green")) - fmt.Fprintln(Output, YellowString("yellow")) - fmt.Fprintln(Output, BlueString("blue")) - fmt.Fprintln(Output, MagentaString("magenta")) - fmt.Fprintln(Output, CyanString("cyan")) - fmt.Fprintln(Output, WhiteString("white")) -} diff --git a/vendor/github.com/fatih/structs/field_test.go b/vendor/github.com/fatih/structs/field_test.go deleted file mode 100644 index 46187d655..000000000 --- a/vendor/github.com/fatih/structs/field_test.go +++ /dev/null @@ -1,324 +0,0 @@ -package structs - -import ( - "reflect" - "testing" -) - -// A test struct that defines all cases -type Foo struct { - A string - B int `structs:"y"` - C bool `json:"c"` - d string // not exported - E *Baz - x string `xml:"x"` // not exported, with tag - Y []string - Z map[string]interface{} - *Bar // embedded -} - -type Baz struct { - A string - B int -} - -type Bar struct { - E string - F int - g []string -} - -func newStruct() *Struct { - b := &Bar{ - E: "example", - F: 2, - g: []string{"zeynep", "fatih"}, - } - - // B and x is not initialized for testing - f := &Foo{ - A: "gopher", - C: true, - d: "small", - E: nil, - Y: []string{"example"}, - Z: nil, - } - f.Bar = b - - return New(f) -} - -func TestField_Set(t *testing.T) { - s := newStruct() - - f := s.Field("A") - err := f.Set("fatih") - if err != nil { - t.Error(err) - } - - if f.Value().(string) != "fatih" { - t.Errorf("Setted value is wrong: %s want: %s", f.Value().(string), "fatih") - } - - f = s.Field("Y") - err = f.Set([]string{"override", "with", "this"}) - if err != nil { - t.Error(err) - } - - sliceLen := len(f.Value().([]string)) - if sliceLen != 3 { - t.Errorf("Setted values slice length is wrong: %d, want: %d", sliceLen, 3) - } - - f = s.Field("C") - err = f.Set(false) - if err != nil { - t.Error(err) - } - - if f.Value().(bool) { - t.Errorf("Setted value is wrong: %s want: %s", f.Value().(bool), false) - } - - // let's pass a different type - f = s.Field("A") - err = f.Set(123) // Field A is of type string, but we are going to pass an integer - if err == nil { - t.Error("Setting a field's value with a different type than the field's type should return an error") - } - - // old value should be still there :) - if f.Value().(string) != "fatih" { - t.Errorf("Setted value is wrong: %s want: %s", f.Value().(string), "fatih") - } - - // let's access an unexported field, which should give an error - f = s.Field("d") - err = f.Set("large") - if err != errNotExported { - t.Error(err) - } - - // let's set a pointer to struct - b := &Bar{ - E: "gopher", - F: 2, - } - - f = s.Field("Bar") - err = f.Set(b) - if err != nil { - t.Error(err) - } - - baz := &Baz{ - A: "helloWorld", - B: 42, - } - - f = s.Field("E") - err = f.Set(baz) - if err != nil { - t.Error(err) - } - - ba := s.Field("E").Value().(*Baz) - - if ba.A != "helloWorld" { - t.Errorf("could not set baz. Got: %s Want: helloWorld", ba.A) - } -} - -func TestField(t *testing.T) { - s := newStruct() - - defer func() { - err := recover() - if err == nil { - t.Error("Retrieveing a non existing field from the struct should panic") - } - }() - - _ = s.Field("no-field") -} - -func TestField_Kind(t *testing.T) { - s := newStruct() - - f := s.Field("A") - if f.Kind() != reflect.String { - t.Errorf("Field A has wrong kind: %s want: %s", f.Kind(), reflect.String) - } - - f = s.Field("B") - if f.Kind() != reflect.Int { - t.Errorf("Field B has wrong kind: %s want: %s", f.Kind(), reflect.Int) - } - - // unexported - f = s.Field("d") - if f.Kind() != reflect.String { - t.Errorf("Field d has wrong kind: %s want: %s", f.Kind(), reflect.String) - } -} - -func TestField_Tag(t *testing.T) { - s := newStruct() - - v := s.Field("B").Tag("json") - if v != "" { - t.Errorf("Field's tag value of a non existing tag should return empty, got: %s", v) - } - - v = s.Field("C").Tag("json") - if v != "c" { - t.Errorf("Field's tag value of the existing field C should return 'c', got: %s", v) - } - - v = s.Field("d").Tag("json") - if v != "" { - t.Errorf("Field's tag value of a non exported field should return empty, got: %s", v) - } - - v = s.Field("x").Tag("xml") - if v != "x" { - t.Errorf("Field's tag value of a non exported field with a tag should return 'x', got: %s", v) - } - - v = s.Field("A").Tag("json") - if v != "" { - t.Errorf("Field's tag value of a existing field without a tag should return empty, got: %s", v) - } -} - -func TestField_Value(t *testing.T) { - s := newStruct() - - v := s.Field("A").Value() - val, ok := v.(string) - if !ok { - t.Errorf("Field's value of a A should be string") - } - - if val != "gopher" { - t.Errorf("Field's value of a existing tag should return 'gopher', got: %s", val) - } - - defer func() { - err := recover() - if err == nil { - t.Error("Value of a non exported field from the field should panic") - } - }() - - // should panic - _ = s.Field("d").Value() -} - -func TestField_IsEmbedded(t *testing.T) { - s := newStruct() - - if !s.Field("Bar").IsEmbedded() { - t.Errorf("Fields 'Bar' field is an embedded field") - } - - if s.Field("d").IsEmbedded() { - t.Errorf("Fields 'd' field is not an embedded field") - } -} - -func TestField_IsExported(t *testing.T) { - s := newStruct() - - if !s.Field("Bar").IsExported() { - t.Errorf("Fields 'Bar' field is an exported field") - } - - if !s.Field("A").IsExported() { - t.Errorf("Fields 'A' field is an exported field") - } - - if s.Field("d").IsExported() { - t.Errorf("Fields 'd' field is not an exported field") - } -} - -func TestField_IsZero(t *testing.T) { - s := newStruct() - - if s.Field("A").IsZero() { - t.Errorf("Fields 'A' field is an initialized field") - } - - if !s.Field("B").IsZero() { - t.Errorf("Fields 'B' field is not an initialized field") - } -} - -func TestField_Name(t *testing.T) { - s := newStruct() - - if s.Field("A").Name() != "A" { - t.Errorf("Fields 'A' field should have the name 'A'") - } -} - -func TestField_Field(t *testing.T) { - s := newStruct() - - e := s.Field("Bar").Field("E") - - val, ok := e.Value().(string) - if !ok { - t.Error("The value of the field 'e' inside 'Bar' struct should be string") - } - - if val != "example" { - t.Errorf("The value of 'e' should be 'example, got: %s", val) - } - - defer func() { - err := recover() - if err == nil { - t.Error("Field of a non existing nested struct should panic") - } - }() - - _ = s.Field("Bar").Field("e") -} - -func TestField_Fields(t *testing.T) { - s := newStruct() - fields := s.Field("Bar").Fields() - - if len(fields) != 3 { - t.Errorf("We expect 3 fields in embedded struct, was: %d", len(fields)) - } -} - -func TestField_FieldOk(t *testing.T) { - s := newStruct() - - b, ok := s.FieldOk("Bar") - if !ok { - t.Error("The field 'Bar' should exists.") - } - - e, ok := b.FieldOk("E") - if !ok { - t.Error("The field 'E' should exists.") - } - - val, ok := e.Value().(string) - if !ok { - t.Error("The value of the field 'e' inside 'Bar' struct should be string") - } - - if val != "example" { - t.Errorf("The value of 'e' should be 'example, got: %s", val) - } -} diff --git a/vendor/github.com/fatih/structs/structs_example_test.go b/vendor/github.com/fatih/structs/structs_example_test.go deleted file mode 100644 index 32bb82937..000000000 --- a/vendor/github.com/fatih/structs/structs_example_test.go +++ /dev/null @@ -1,351 +0,0 @@ -package structs - -import ( - "fmt" - "time" -) - -func ExampleNew() { - type Server struct { - Name string - ID int32 - Enabled bool - } - - server := &Server{ - Name: "Arslan", - ID: 123456, - Enabled: true, - } - - s := New(server) - - fmt.Printf("Name : %v\n", s.Name()) - fmt.Printf("Values : %v\n", s.Values()) - fmt.Printf("Value of ID : %v\n", s.Field("ID").Value()) - // Output: - // Name : Server - // Values : [Arslan 123456 true] - // Value of ID : 123456 - -} - -func ExampleMap() { - type Server struct { - Name string - ID int32 - Enabled bool - } - - s := &Server{ - Name: "Arslan", - ID: 123456, - Enabled: true, - } - - m := Map(s) - - fmt.Printf("%#v\n", m["Name"]) - fmt.Printf("%#v\n", m["ID"]) - fmt.Printf("%#v\n", m["Enabled"]) - // Output: - // "Arslan" - // 123456 - // true - -} - -func ExampleMap_tags() { - // Custom tags can change the map keys instead of using the fields name - type Server struct { - Name string `structs:"server_name"` - ID int32 `structs:"server_id"` - Enabled bool `structs:"enabled"` - } - - s := &Server{ - Name: "Zeynep", - ID: 789012, - } - - m := Map(s) - - // access them by the custom tags defined above - fmt.Printf("%#v\n", m["server_name"]) - fmt.Printf("%#v\n", m["server_id"]) - fmt.Printf("%#v\n", m["enabled"]) - // Output: - // "Zeynep" - // 789012 - // false - -} - -func ExampleMap_nested() { - // By default field with struct types are processed too. We can stop - // processing them via "omitnested" tag option. - type Server struct { - Name string `structs:"server_name"` - ID int32 `structs:"server_id"` - Time time.Time `structs:"time,omitnested"` // do not convert to map[string]interface{} - } - - const shortForm = "2006-Jan-02" - t, _ := time.Parse("2006-Jan-02", "2013-Feb-03") - - s := &Server{ - Name: "Zeynep", - ID: 789012, - Time: t, - } - - m := Map(s) - - // access them by the custom tags defined above - fmt.Printf("%v\n", m["server_name"]) - fmt.Printf("%v\n", m["server_id"]) - fmt.Printf("%v\n", m["time"].(time.Time)) - // Output: - // Zeynep - // 789012 - // 2013-02-03 00:00:00 +0000 UTC -} - -func ExampleMap_omitEmpty() { - // By default field with struct types of zero values are processed too. We - // can stop processing them via "omitempty" tag option. - type Server struct { - Name string `structs:",omitempty"` - ID int32 `structs:"server_id,omitempty"` - Location string - } - - // Only add location - s := &Server{ - Location: "Tokyo", - } - - m := Map(s) - - // map contains only the Location field - fmt.Printf("%v\n", m) - // Output: - // map[Location:Tokyo] -} - -func ExampleValues() { - type Server struct { - Name string - ID int32 - Enabled bool - } - - s := &Server{ - Name: "Fatih", - ID: 135790, - Enabled: false, - } - - m := Values(s) - - fmt.Printf("Values: %+v\n", m) - // Output: - // Values: [Fatih 135790 false] -} - -func ExampleValues_omitEmpty() { - // By default field with struct types of zero values are processed too. We - // can stop processing them via "omitempty" tag option. - type Server struct { - Name string `structs:",omitempty"` - ID int32 `structs:"server_id,omitempty"` - Location string - } - - // Only add location - s := &Server{ - Location: "Ankara", - } - - m := Values(s) - - // values contains only the Location field - fmt.Printf("Values: %+v\n", m) - // Output: - // Values: [Ankara] -} - -func ExampleValues_tags() { - type Location struct { - City string - Country string - } - - type Server struct { - Name string - ID int32 - Enabled bool - Location Location `structs:"-"` // values from location are not included anymore - } - - s := &Server{ - Name: "Fatih", - ID: 135790, - Enabled: false, - Location: Location{City: "Ankara", Country: "Turkey"}, - } - - // Let get all values from the struct s. Note that we don't include values - // from the Location field - m := Values(s) - - fmt.Printf("Values: %+v\n", m) - // Output: - // Values: [Fatih 135790 false] -} - -func ExampleFields() { - type Access struct { - Name string - LastAccessed time.Time - Number int - } - - s := &Access{ - Name: "Fatih", - LastAccessed: time.Now(), - Number: 1234567, - } - - fields := Fields(s) - - for i, field := range fields { - fmt.Printf("[%d] %+v\n", i, field.Name()) - } - - // Output: - // [0] Name - // [1] LastAccessed - // [2] Number -} - -func ExampleFields_nested() { - type Person struct { - Name string - Number int - } - - type Access struct { - Person Person - HasPermission bool - LastAccessed time.Time - } - - s := &Access{ - Person: Person{Name: "fatih", Number: 1234567}, - LastAccessed: time.Now(), - HasPermission: true, - } - - // Let's get all fields from the struct s. - fields := Fields(s) - - for _, field := range fields { - if field.Name() == "Person" { - fmt.Printf("Access.Person.Name: %+v\n", field.Field("Name").Value()) - } - } - - // Output: - // Access.Person.Name: fatih -} - -func ExampleField() { - type Person struct { - Name string - Number int - } - - type Access struct { - Person Person - HasPermission bool - LastAccessed time.Time - } - - access := &Access{ - Person: Person{Name: "fatih", Number: 1234567}, - LastAccessed: time.Now(), - HasPermission: true, - } - - // Create a new Struct type - s := New(access) - - // Get the Field type for "Person" field - p := s.Field("Person") - - // Get the underlying "Name field" and print the value of it - name := p.Field("Name") - - fmt.Printf("Value of Person.Access.Name: %+v\n", name.Value()) - - // Output: - // Value of Person.Access.Name: fatih - -} - -func ExampleIsZero() { - type Server struct { - Name string - ID int32 - Enabled bool - } - - // Nothing is initalized - a := &Server{} - isZeroA := IsZero(a) - - // Name and Enabled is initialized, but not ID - b := &Server{ - Name: "Golang", - Enabled: true, - } - isZeroB := IsZero(b) - - fmt.Printf("%#v\n", isZeroA) - fmt.Printf("%#v\n", isZeroB) - // Output: - // true - // false -} - -func ExampleHasZero() { - // Let's define an Access struct. Note that the "Enabled" field is not - // going to be checked because we added the "structs" tag to the field. - type Access struct { - Name string - LastAccessed time.Time - Number int - Enabled bool `structs:"-"` - } - - // Name and Number is not initialized. - a := &Access{ - LastAccessed: time.Now(), - } - hasZeroA := HasZero(a) - - // Name and Number is initialized. - b := &Access{ - Name: "Fatih", - LastAccessed: time.Now(), - Number: 12345, - } - hasZeroB := HasZero(b) - - fmt.Printf("%#v\n", hasZeroA) - fmt.Printf("%#v\n", hasZeroB) - // Output: - // true - // false -} diff --git a/vendor/github.com/fatih/structs/structs_test.go b/vendor/github.com/fatih/structs/structs_test.go deleted file mode 100644 index 14e3de72f..000000000 --- a/vendor/github.com/fatih/structs/structs_test.go +++ /dev/null @@ -1,898 +0,0 @@ -package structs - -import ( - "fmt" - "reflect" - "testing" - "time" -) - -func TestMapNonStruct(t *testing.T) { - foo := []string{"foo"} - - defer func() { - err := recover() - if err == nil { - t.Error("Passing a non struct into Map should panic") - } - }() - - // this should panic. We are going to recover and and test it - _ = Map(foo) -} - -func TestStructIndexes(t *testing.T) { - type C struct { - something int - Props map[string]interface{} - } - - defer func() { - err := recover() - if err != nil { - fmt.Printf("err %+v\n", err) - t.Error("Using mixed indexes should not panic") - } - }() - - // They should not panic - _ = Map(&C{}) - _ = Fields(&C{}) - _ = Values(&C{}) - _ = IsZero(&C{}) - _ = HasZero(&C{}) -} - -func TestMap(t *testing.T) { - var T = struct { - A string - B int - C bool - }{ - A: "a-value", - B: 2, - C: true, - } - - a := Map(T) - - if typ := reflect.TypeOf(a).Kind(); typ != reflect.Map { - t.Errorf("Map should return a map type, got: %v", typ) - } - - // we have three fields - if len(a) != 3 { - t.Errorf("Map should return a map of len 3, got: %d", len(a)) - } - - inMap := func(val interface{}) bool { - for _, v := range a { - if reflect.DeepEqual(v, val) { - return true - } - } - - return false - } - - for _, val := range []interface{}{"a-value", 2, true} { - if !inMap(val) { - t.Errorf("Map should have the value %v", val) - } - } - -} - -func TestMap_Tag(t *testing.T) { - var T = struct { - A string `structs:"x"` - B int `structs:"y"` - C bool `structs:"z"` - }{ - A: "a-value", - B: 2, - C: true, - } - - a := Map(T) - - inMap := func(key interface{}) bool { - for k := range a { - if reflect.DeepEqual(k, key) { - return true - } - } - return false - } - - for _, key := range []string{"x", "y", "z"} { - if !inMap(key) { - t.Errorf("Map should have the key %v", key) - } - } - -} - -func TestMap_CustomTag(t *testing.T) { - var T = struct { - A string `json:"x"` - B int `json:"y"` - C bool `json:"z"` - D struct { - E string `json:"jkl"` - } `json:"nested"` - }{ - A: "a-value", - B: 2, - C: true, - } - T.D.E = "e-value" - - s := New(T) - s.TagName = "json" - - a := s.Map() - - inMap := func(key interface{}) bool { - for k := range a { - if reflect.DeepEqual(k, key) { - return true - } - } - return false - } - - for _, key := range []string{"x", "y", "z"} { - if !inMap(key) { - t.Errorf("Map should have the key %v", key) - } - } - - nested, ok := a["nested"].(map[string]interface{}) - if !ok { - t.Fatalf("Map should contain the D field that is tagged as 'nested'") - } - - e, ok := nested["jkl"].(string) - if !ok { - t.Fatalf("Map should contain the D.E field that is tagged as 'jkl'") - } - - if e != "e-value" { - t.Errorf("D.E field should be equal to 'e-value', got: '%v'", e) - } - -} - -func TestMap_MultipleCustomTag(t *testing.T) { - var A = struct { - X string `aa:"ax"` - }{"a_value"} - - aStruct := New(A) - aStruct.TagName = "aa" - - var B = struct { - X string `bb:"bx"` - }{"b_value"} - - bStruct := New(B) - bStruct.TagName = "bb" - - a, b := aStruct.Map(), bStruct.Map() - if !reflect.DeepEqual(a, map[string]interface{}{"ax": "a_value"}) { - t.Error("Map should have field ax with value a_value") - } - - if !reflect.DeepEqual(b, map[string]interface{}{"bx": "b_value"}) { - t.Error("Map should have field bx with value b_value") - } -} - -func TestMap_OmitEmpty(t *testing.T) { - type A struct { - Name string - Value string `structs:",omitempty"` - Time time.Time `structs:",omitempty"` - } - a := A{} - - m := Map(a) - - _, ok := m["Value"].(map[string]interface{}) - if ok { - t.Error("Map should not contain the Value field that is tagged as omitempty") - } - - _, ok = m["Time"].(map[string]interface{}) - if ok { - t.Error("Map should not contain the Time field that is tagged as omitempty") - } -} - -func TestMap_OmitNested(t *testing.T) { - type A struct { - Name string - Value string - Time time.Time `structs:",omitnested"` - } - a := A{Time: time.Now()} - - type B struct { - Desc string - A A - } - b := &B{A: a} - - m := Map(b) - - in, ok := m["A"].(map[string]interface{}) - if !ok { - t.Error("Map nested structs is not available in the map") - } - - // should not happen - if _, ok := in["Time"].(map[string]interface{}); ok { - t.Error("Map nested struct should omit recursiving parsing of Time") - } - - if _, ok := in["Time"].(time.Time); !ok { - t.Error("Map nested struct should stop parsing of Time at is current value") - } -} - -func TestMap_Nested(t *testing.T) { - type A struct { - Name string - } - a := &A{Name: "example"} - - type B struct { - A *A - } - b := &B{A: a} - - m := Map(b) - - if typ := reflect.TypeOf(m).Kind(); typ != reflect.Map { - t.Errorf("Map should return a map type, got: %v", typ) - } - - in, ok := m["A"].(map[string]interface{}) - if !ok { - t.Error("Map nested structs is not available in the map") - } - - if name := in["Name"].(string); name != "example" { - t.Errorf("Map nested struct's name field should give example, got: %s", name) - } -} - -func TestMap_Anonymous(t *testing.T) { - type A struct { - Name string - } - a := &A{Name: "example"} - - type B struct { - *A - } - b := &B{} - b.A = a - - m := Map(b) - - if typ := reflect.TypeOf(m).Kind(); typ != reflect.Map { - t.Errorf("Map should return a map type, got: %v", typ) - } - - in, ok := m["A"].(map[string]interface{}) - if !ok { - t.Error("Embedded structs is not available in the map") - } - - if name := in["Name"].(string); name != "example" { - t.Errorf("Embedded A struct's Name field should give example, got: %s", name) - } -} - -func TestStruct(t *testing.T) { - var T = struct{}{} - - if !IsStruct(T) { - t.Errorf("T should be a struct, got: %T", T) - } - - if !IsStruct(&T) { - t.Errorf("T should be a struct, got: %T", T) - } - -} - -func TestValues(t *testing.T) { - var T = struct { - A string - B int - C bool - }{ - A: "a-value", - B: 2, - C: true, - } - - s := Values(T) - - if typ := reflect.TypeOf(s).Kind(); typ != reflect.Slice { - t.Errorf("Values should return a slice type, got: %v", typ) - } - - inSlice := func(val interface{}) bool { - for _, v := range s { - if reflect.DeepEqual(v, val) { - return true - } - } - return false - } - - for _, val := range []interface{}{"a-value", 2, true} { - if !inSlice(val) { - t.Errorf("Values should have the value %v", val) - } - } -} - -func TestValues_OmitEmpty(t *testing.T) { - type A struct { - Name string - Value int `structs:",omitempty"` - } - - a := A{Name: "example"} - s := Values(a) - - if len(s) != 1 { - t.Errorf("Values of omitted empty fields should be not counted") - } - - if s[0].(string) != "example" { - t.Errorf("Values of omitted empty fields should left the value example") - } -} - -func TestValues_OmitNested(t *testing.T) { - type A struct { - Name string - Value int - } - - a := A{ - Name: "example", - Value: 123, - } - - type B struct { - A A `structs:",omitnested"` - C int - } - b := &B{A: a, C: 123} - - s := Values(b) - - if len(s) != 2 { - t.Errorf("Values of omitted nested struct should be not counted") - } - - inSlice := func(val interface{}) bool { - for _, v := range s { - if reflect.DeepEqual(v, val) { - return true - } - } - return false - } - - for _, val := range []interface{}{123, a} { - if !inSlice(val) { - t.Errorf("Values should have the value %v", val) - } - } -} - -func TestValues_Nested(t *testing.T) { - type A struct { - Name string - } - a := A{Name: "example"} - - type B struct { - A A - C int - } - b := &B{A: a, C: 123} - - s := Values(b) - - inSlice := func(val interface{}) bool { - for _, v := range s { - if reflect.DeepEqual(v, val) { - return true - } - } - return false - } - - for _, val := range []interface{}{"example", 123} { - if !inSlice(val) { - t.Errorf("Values should have the value %v", val) - } - } -} - -func TestValues_Anonymous(t *testing.T) { - type A struct { - Name string - } - a := A{Name: "example"} - - type B struct { - A - C int - } - b := &B{C: 123} - b.A = a - - s := Values(b) - - inSlice := func(val interface{}) bool { - for _, v := range s { - if reflect.DeepEqual(v, val) { - return true - } - } - return false - } - - for _, val := range []interface{}{"example", 123} { - if !inSlice(val) { - t.Errorf("Values should have the value %v", val) - } - } -} - -func TestNames(t *testing.T) { - var T = struct { - A string - B int - C bool - }{ - A: "a-value", - B: 2, - C: true, - } - - s := Names(T) - - if len(s) != 3 { - t.Errorf("Names should return a slice of len 3, got: %d", len(s)) - } - - inSlice := func(val string) bool { - for _, v := range s { - if reflect.DeepEqual(v, val) { - return true - } - } - return false - } - - for _, val := range []string{"A", "B", "C"} { - if !inSlice(val) { - t.Errorf("Names should have the value %v", val) - } - } -} - -func TestFields(t *testing.T) { - var T = struct { - A string - B int - C bool - }{ - A: "a-value", - B: 2, - C: true, - } - - s := Fields(T) - - if len(s) != 3 { - t.Errorf("Fields should return a slice of len 3, got: %d", len(s)) - } - - inSlice := func(val string) bool { - for _, v := range s { - if reflect.DeepEqual(v.Name(), val) { - return true - } - } - return false - } - - for _, val := range []string{"A", "B", "C"} { - if !inSlice(val) { - t.Errorf("Fields should have the value %v", val) - } - } -} - -func TestFields_OmitNested(t *testing.T) { - type A struct { - Name string - Enabled bool - } - a := A{Name: "example"} - - type B struct { - A A - C int - Value string `structs:"-"` - Number int - } - b := &B{A: a, C: 123} - - s := Fields(b) - - if len(s) != 3 { - t.Errorf("Fields should omit nested struct. Expecting 2 got: %d", len(s)) - } - - inSlice := func(val interface{}) bool { - for _, v := range s { - if reflect.DeepEqual(v.Name(), val) { - return true - } - } - return false - } - - for _, val := range []interface{}{"A", "C"} { - if !inSlice(val) { - t.Errorf("Fields should have the value %v", val) - } - } -} - -func TestFields_Anonymous(t *testing.T) { - type A struct { - Name string - } - a := A{Name: "example"} - - type B struct { - A - C int - } - b := &B{C: 123} - b.A = a - - s := Fields(b) - - inSlice := func(val interface{}) bool { - for _, v := range s { - if reflect.DeepEqual(v.Name(), val) { - return true - } - } - return false - } - - for _, val := range []interface{}{"A", "C"} { - if !inSlice(val) { - t.Errorf("Fields should have the value %v", val) - } - } -} - -func TestIsZero(t *testing.T) { - var T = struct { - A string - B int - C bool `structs:"-"` - D []string - }{} - - ok := IsZero(T) - if !ok { - t.Error("IsZero should return true because none of the fields are initialized.") - } - - var X = struct { - A string - F *bool - }{ - A: "a-value", - } - - ok = IsZero(X) - if ok { - t.Error("IsZero should return false because A is initialized") - } - - var Y = struct { - A string - B int - }{ - A: "a-value", - B: 123, - } - - ok = IsZero(Y) - if ok { - t.Error("IsZero should return false because A and B is initialized") - } -} - -func TestIsZero_OmitNested(t *testing.T) { - type A struct { - Name string - D string - } - a := A{Name: "example"} - - type B struct { - A A `structs:",omitnested"` - C int - } - b := &B{A: a, C: 123} - - ok := IsZero(b) - if ok { - t.Error("IsZero should return false because A, B and C are initialized") - } - - aZero := A{} - bZero := &B{A: aZero} - - ok = IsZero(bZero) - if !ok { - t.Error("IsZero should return true because neither A nor B is initialized") - } - -} - -func TestIsZero_Nested(t *testing.T) { - type A struct { - Name string - D string - } - a := A{Name: "example"} - - type B struct { - A A - C int - } - b := &B{A: a, C: 123} - - ok := IsZero(b) - if ok { - t.Error("IsZero should return false because A, B and C are initialized") - } - - aZero := A{} - bZero := &B{A: aZero} - - ok = IsZero(bZero) - if !ok { - t.Error("IsZero should return true because neither A nor B is initialized") - } - -} - -func TestIsZero_Anonymous(t *testing.T) { - type A struct { - Name string - D string - } - a := A{Name: "example"} - - type B struct { - A - C int - } - b := &B{C: 123} - b.A = a - - ok := IsZero(b) - if ok { - t.Error("IsZero should return false because A, B and C are initialized") - } - - aZero := A{} - bZero := &B{} - bZero.A = aZero - - ok = IsZero(bZero) - if !ok { - t.Error("IsZero should return true because neither A nor B is initialized") - } -} - -func TestHasZero(t *testing.T) { - var T = struct { - A string - B int - C bool `structs:"-"` - D []string - }{ - A: "a-value", - B: 2, - } - - ok := HasZero(T) - if !ok { - t.Error("HasZero should return true because A and B are initialized.") - } - - var X = struct { - A string - F *bool - }{ - A: "a-value", - } - - ok = HasZero(X) - if !ok { - t.Error("HasZero should return true because A is initialized") - } - - var Y = struct { - A string - B int - }{ - A: "a-value", - B: 123, - } - - ok = HasZero(Y) - if ok { - t.Error("HasZero should return false because A and B is initialized") - } -} - -func TestHasZero_OmitNested(t *testing.T) { - type A struct { - Name string - D string - } - a := A{Name: "example"} - - type B struct { - A A `structs:",omitnested"` - C int - } - b := &B{A: a, C: 123} - - // Because the Field A inside B is omitted HasZero should return false - // because it will stop iterating deeper andnot going to lookup for D - ok := HasZero(b) - if ok { - t.Error("HasZero should return false because A and C are initialized") - } -} - -func TestHasZero_Nested(t *testing.T) { - type A struct { - Name string - D string - } - a := A{Name: "example"} - - type B struct { - A A - C int - } - b := &B{A: a, C: 123} - - ok := HasZero(b) - if !ok { - t.Error("HasZero should return true because D is not initialized") - } -} - -func TestHasZero_Anonymous(t *testing.T) { - type A struct { - Name string - D string - } - a := A{Name: "example"} - - type B struct { - A - C int - } - b := &B{C: 123} - b.A = a - - ok := HasZero(b) - if !ok { - t.Error("HasZero should return false because D is not initialized") - } -} - -func TestName(t *testing.T) { - type Foo struct { - A string - B bool - } - f := &Foo{} - - n := Name(f) - if n != "Foo" { - t.Errorf("Name should return Foo, got: %s", n) - } - - unnamed := struct{ Name string }{Name: "Cihangir"} - m := Name(unnamed) - if m != "" { - t.Errorf("Name should return empty string for unnamed struct, got: %s", n) - } - - defer func() { - err := recover() - if err == nil { - t.Error("Name should panic if a non struct is passed") - } - }() - - Name([]string{}) -} - -func TestNestedNilPointer(t *testing.T) { - type Collar struct { - Engraving string - } - - type Dog struct { - Name string - Collar *Collar - } - - type Person struct { - Name string - Dog *Dog - } - - person := &Person{ - Name: "John", - } - - personWithDog := &Person{ - Name: "Ron", - Dog: &Dog{ - Name: "Rover", - }, - } - - personWithDogWithCollar := &Person{ - Name: "Kon", - Dog: &Dog{ - Name: "Ruffles", - Collar: &Collar{ - Engraving: "If lost, call Kon", - }, - }, - } - - defer func() { - err := recover() - if err != nil { - fmt.Printf("err %+v\n", err) - t.Error("Internal nil pointer should not panic") - } - }() - - _ = Map(person) // Panics - _ = Map(personWithDog) // Panics - _ = Map(personWithDogWithCollar) // Doesn't panic -} diff --git a/vendor/github.com/fatih/structs/tags_test.go b/vendor/github.com/fatih/structs/tags_test.go deleted file mode 100644 index 5d12724f1..000000000 --- a/vendor/github.com/fatih/structs/tags_test.go +++ /dev/null @@ -1,46 +0,0 @@ -package structs - -import "testing" - -func TestParseTag_Name(t *testing.T) { - tags := []struct { - tag string - has bool - }{ - {"", false}, - {"name", true}, - {"name,opt", true}, - {"name , opt, opt2", false}, // has a single whitespace - {", opt, opt2", false}, - } - - for _, tag := range tags { - name, _ := parseTag(tag.tag) - - if (name != "name") && tag.has { - t.Errorf("Parse tag should return name: %#v", tag) - } - } -} - -func TestParseTag_Opts(t *testing.T) { - tags := []struct { - opts string - has bool - }{ - {"name", false}, - {"name,opt", true}, - {"name , opt, opt2", false}, // has a single whitespace - {",opt, opt2", true}, - {", opt3, opt4", false}, - } - - // search for "opt" - for _, tag := range tags { - _, opts := parseTag(tag.opts) - - if opts.Has("opt") != tag.has { - t.Errorf("Tag opts should have opt: %#v", tag) - } - } -} diff --git a/vendor/github.com/gorilla/context/context_test.go b/vendor/github.com/gorilla/context/context_test.go deleted file mode 100644 index 9814c501e..000000000 --- a/vendor/github.com/gorilla/context/context_test.go +++ /dev/null @@ -1,161 +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" - "testing" -) - -type keyType int - -const ( - key1 keyType = iota - key2 -) - -func TestContext(t *testing.T) { - assertEqual := func(val interface{}, exp interface{}) { - if val != exp { - t.Errorf("Expected %v, got %v.", exp, val) - } - } - - r, _ := http.NewRequest("GET", "http://localhost:8080/", nil) - emptyR, _ := http.NewRequest("GET", "http://localhost:8080/", nil) - - // Get() - assertEqual(Get(r, key1), nil) - - // Set() - Set(r, key1, "1") - assertEqual(Get(r, key1), "1") - assertEqual(len(data[r]), 1) - - Set(r, key2, "2") - assertEqual(Get(r, key2), "2") - assertEqual(len(data[r]), 2) - - //GetOk - value, ok := GetOk(r, key1) - assertEqual(value, "1") - assertEqual(ok, true) - - value, ok = GetOk(r, "not exists") - assertEqual(value, nil) - assertEqual(ok, false) - - Set(r, "nil value", nil) - value, ok = GetOk(r, "nil value") - assertEqual(value, nil) - assertEqual(ok, true) - - // GetAll() - values := GetAll(r) - assertEqual(len(values), 3) - - // GetAll() for empty request - values = GetAll(emptyR) - if values != nil { - t.Error("GetAll didn't return nil value for invalid request") - } - - // GetAllOk() - values, ok = GetAllOk(r) - assertEqual(len(values), 3) - assertEqual(ok, true) - - // GetAllOk() for empty request - values, ok = GetAllOk(emptyR) - assertEqual(value, nil) - assertEqual(ok, false) - - // Delete() - Delete(r, key1) - assertEqual(Get(r, key1), nil) - assertEqual(len(data[r]), 2) - - Delete(r, key2) - assertEqual(Get(r, key2), nil) - assertEqual(len(data[r]), 1) - - // Clear() - Clear(r) - assertEqual(len(data), 0) -} - -func parallelReader(r *http.Request, key string, iterations int, wait, done chan struct{}) { - <-wait - for i := 0; i < iterations; i++ { - Get(r, key) - } - done <- struct{}{} - -} - -func parallelWriter(r *http.Request, key, value string, iterations int, wait, done chan struct{}) { - <-wait - for i := 0; i < iterations; i++ { - Set(r, key, value) - } - done <- struct{}{} - -} - -func benchmarkMutex(b *testing.B, numReaders, numWriters, iterations int) { - - b.StopTimer() - r, _ := http.NewRequest("GET", "http://localhost:8080/", nil) - done := make(chan struct{}) - b.StartTimer() - - for i := 0; i < b.N; i++ { - wait := make(chan struct{}) - - for i := 0; i < numReaders; i++ { - go parallelReader(r, "test", iterations, wait, done) - } - - for i := 0; i < numWriters; i++ { - go parallelWriter(r, "test", "123", iterations, wait, done) - } - - close(wait) - - for i := 0; i < numReaders+numWriters; i++ { - <-done - } - - } - -} - -func BenchmarkMutexSameReadWrite1(b *testing.B) { - benchmarkMutex(b, 1, 1, 32) -} -func BenchmarkMutexSameReadWrite2(b *testing.B) { - benchmarkMutex(b, 2, 2, 32) -} -func BenchmarkMutexSameReadWrite4(b *testing.B) { - benchmarkMutex(b, 4, 4, 32) -} -func BenchmarkMutex1(b *testing.B) { - benchmarkMutex(b, 2, 8, 32) -} -func BenchmarkMutex2(b *testing.B) { - benchmarkMutex(b, 16, 4, 64) -} -func BenchmarkMutex3(b *testing.B) { - benchmarkMutex(b, 1, 2, 128) -} -func BenchmarkMutex4(b *testing.B) { - benchmarkMutex(b, 128, 32, 256) -} -func BenchmarkMutex5(b *testing.B) { - benchmarkMutex(b, 1024, 2048, 64) -} -func BenchmarkMutex6(b *testing.B) { - benchmarkMutex(b, 2048, 1024, 512) -} diff --git a/vendor/github.com/gorilla/mux/README.md b/vendor/github.com/gorilla/mux/README.md index bf49ebd96..55dd4e59a 100644 --- a/vendor/github.com/gorilla/mux/README.md +++ b/vendor/github.com/gorilla/mux/README.md @@ -1,6 +1,6 @@ mux === -[![GoDoc](https://godoc.org/github.com/gorilla/securecookie?status.svg)](https://godoc.org/github.com/gorilla/securecookie) +[![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.png?branch=master)](https://travis-ci.org/gorilla/mux) Package gorilla/mux implements a request router and dispatcher. @@ -60,8 +60,8 @@ Routes can also be restricted to a domain or subdomain. Just define a host pattern to be matched. They can also have variables: r := mux.NewRouter() - // Only matches if domain is "www.domain.com". - r.Host("www.domain.com") + // Only matches if domain is "www.example.com". + r.Host("www.example.com") // Matches a dynamic subdomain. r.Host("{subdomain:[a-z]+}.domain.com") @@ -94,7 +94,7 @@ There are several other matchers that can be added. To match path prefixes: ...and finally, it is possible to combine several matchers in a single route: r.HandleFunc("/products", ProductsHandler). - Host("www.domain.com"). + Host("www.example.com"). Methods("GET"). Schemes("http") @@ -103,11 +103,11 @@ a way to group several routes that share the same requirements. We call it "subrouting". For example, let's say we have several URLs that should only match when the -host is "www.domain.com". Create a route for that host and get a "subrouter" +host is `www.example.com`. Create a route for that host and get a "subrouter" from it: r := mux.NewRouter() - s := r.Host("www.domain.com").Subrouter() + s := r.Host("www.example.com").Subrouter() Then register routes in the subrouter: @@ -116,7 +116,7 @@ Then register routes in the subrouter: s.HandleFunc("/articles/{category}/{id:[0-9]+}"), ArticleHandler) The three URL paths we registered above will only be tested if the domain is -"www.domain.com", because the subrouter is tested first. This is not +`www.example.com`, because the subrouter is tested first. This is not only convenient, but also optimizes request matching. You can create subrouters combining any attribute matchers accepted by a route. diff --git a/vendor/github.com/gorilla/mux/bench_test.go b/vendor/github.com/gorilla/mux/bench_test.go deleted file mode 100644 index c5f97b2b2..000000000 --- a/vendor/github.com/gorilla/mux/bench_test.go +++ /dev/null @@ -1,21 +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 mux - -import ( - "net/http" - "testing" -) - -func BenchmarkMux(b *testing.B) { - router := new(Router) - handler := func(w http.ResponseWriter, r *http.Request) {} - router.HandleFunc("/v1/{v1}", handler) - - request, _ := http.NewRequest("GET", "/v1/anything", nil) - for i := 0; i < b.N; i++ { - router.ServeHTTP(nil, request) - } -} diff --git a/vendor/github.com/gorilla/mux/doc.go b/vendor/github.com/gorilla/mux/doc.go index 442babab8..49798cb5c 100644 --- a/vendor/github.com/gorilla/mux/doc.go +++ b/vendor/github.com/gorilla/mux/doc.go @@ -60,8 +60,8 @@ Routes can also be restricted to a domain or subdomain. Just define a host pattern to be matched. They can also have variables: r := mux.NewRouter() - // Only matches if domain is "www.domain.com". - r.Host("www.domain.com") + // Only matches if domain is "www.example.com". + r.Host("www.example.com") // Matches a dynamic subdomain. r.Host("{subdomain:[a-z]+}.domain.com") @@ -94,7 +94,7 @@ There are several other matchers that can be added. To match path prefixes: ...and finally, it is possible to combine several matchers in a single route: r.HandleFunc("/products", ProductsHandler). - Host("www.domain.com"). + Host("www.example.com"). Methods("GET"). Schemes("http") @@ -103,11 +103,11 @@ a way to group several routes that share the same requirements. We call it "subrouting". For example, let's say we have several URLs that should only match when the -host is "www.domain.com". Create a route for that host and get a "subrouter" +host is "www.example.com". Create a route for that host and get a "subrouter" from it: r := mux.NewRouter() - s := r.Host("www.domain.com").Subrouter() + s := r.Host("www.example.com").Subrouter() Then register routes in the subrouter: @@ -116,7 +116,7 @@ Then register routes in the subrouter: s.HandleFunc("/articles/{category}/{id:[0-9]+}"), ArticleHandler) The three URL paths we registered above will only be tested if the domain is -"www.domain.com", because the subrouter is tested first. This is not +"www.example.com", because the subrouter is tested first. This is not only convenient, but also optimizes request matching. You can create subrouters combining any attribute matchers accepted by a route. diff --git a/vendor/github.com/gorilla/mux/mux_test.go b/vendor/github.com/gorilla/mux/mux_test.go deleted file mode 100644 index 5732d2da3..000000000 --- a/vendor/github.com/gorilla/mux/mux_test.go +++ /dev/null @@ -1,1334 +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 mux - -import ( - "fmt" - "net/http" - "strings" - "testing" - - "github.com/gorilla/context" -) - -func (r *Route) GoString() string { - matchers := make([]string, len(r.matchers)) - for i, m := range r.matchers { - matchers[i] = fmt.Sprintf("%#v", m) - } - return fmt.Sprintf("&Route{matchers:[]matcher{%s}}", strings.Join(matchers, ", ")) -} - -func (r *routeRegexp) GoString() string { - return fmt.Sprintf("&routeRegexp{template: %q, matchHost: %t, matchQuery: %t, strictSlash: %t, regexp: regexp.MustCompile(%q), reverse: %q, varsN: %v, varsR: %v", r.template, r.matchHost, r.matchQuery, r.strictSlash, r.regexp.String(), r.reverse, r.varsN, r.varsR) -} - -type routeTest struct { - title string // title of the test - route *Route // the route being tested - request *http.Request // a request to test the route - vars map[string]string // the expected vars of the match - host string // the expected host of the match - path string // the expected path of the match - shouldMatch bool // whether the request is expected to match the route at all - shouldRedirect bool // whether the request should result in a redirect -} - -func TestHost(t *testing.T) { - // newRequestHost a new request with a method, url, and host header - newRequestHost := func(method, url, host string) *http.Request { - req, err := http.NewRequest(method, url, nil) - if err != nil { - panic(err) - } - req.Host = host - return req - } - - tests := []routeTest{ - { - title: "Host route match", - route: new(Route).Host("aaa.bbb.ccc"), - request: newRequest("GET", "http://aaa.bbb.ccc/111/222/333"), - vars: map[string]string{}, - host: "aaa.bbb.ccc", - path: "", - shouldMatch: true, - }, - { - title: "Host route, wrong host in request URL", - route: new(Route).Host("aaa.bbb.ccc"), - request: newRequest("GET", "http://aaa.222.ccc/111/222/333"), - vars: map[string]string{}, - host: "aaa.bbb.ccc", - path: "", - shouldMatch: false, - }, - { - title: "Host route with port, match", - route: new(Route).Host("aaa.bbb.ccc:1234"), - request: newRequest("GET", "http://aaa.bbb.ccc:1234/111/222/333"), - vars: map[string]string{}, - host: "aaa.bbb.ccc:1234", - path: "", - shouldMatch: true, - }, - { - title: "Host route with port, wrong port in request URL", - route: new(Route).Host("aaa.bbb.ccc:1234"), - request: newRequest("GET", "http://aaa.bbb.ccc:9999/111/222/333"), - vars: map[string]string{}, - host: "aaa.bbb.ccc:1234", - path: "", - shouldMatch: false, - }, - { - title: "Host route, match with host in request header", - route: new(Route).Host("aaa.bbb.ccc"), - request: newRequestHost("GET", "/111/222/333", "aaa.bbb.ccc"), - vars: map[string]string{}, - host: "aaa.bbb.ccc", - path: "", - shouldMatch: true, - }, - { - title: "Host route, wrong host in request header", - route: new(Route).Host("aaa.bbb.ccc"), - request: newRequestHost("GET", "/111/222/333", "aaa.222.ccc"), - vars: map[string]string{}, - host: "aaa.bbb.ccc", - path: "", - shouldMatch: false, - }, - // BUG {new(Route).Host("aaa.bbb.ccc:1234"), newRequestHost("GET", "/111/222/333", "aaa.bbb.ccc:1234"), map[string]string{}, "aaa.bbb.ccc:1234", "", true}, - { - title: "Host route with port, wrong host in request header", - route: new(Route).Host("aaa.bbb.ccc:1234"), - request: newRequestHost("GET", "/111/222/333", "aaa.bbb.ccc:9999"), - vars: map[string]string{}, - host: "aaa.bbb.ccc:1234", - path: "", - shouldMatch: false, - }, - { - title: "Host route with pattern, match", - route: new(Route).Host("aaa.{v1:[a-z]{3}}.ccc"), - request: newRequest("GET", "http://aaa.bbb.ccc/111/222/333"), - vars: map[string]string{"v1": "bbb"}, - host: "aaa.bbb.ccc", - path: "", - shouldMatch: true, - }, - { - title: "Host route with pattern, additional capturing group, match", - route: new(Route).Host("aaa.{v1:[a-z]{2}(b|c)}.ccc"), - request: newRequest("GET", "http://aaa.bbb.ccc/111/222/333"), - vars: map[string]string{"v1": "bbb"}, - host: "aaa.bbb.ccc", - path: "", - shouldMatch: true, - }, - { - title: "Host route with pattern, wrong host in request URL", - route: new(Route).Host("aaa.{v1:[a-z]{3}}.ccc"), - request: newRequest("GET", "http://aaa.222.ccc/111/222/333"), - vars: map[string]string{"v1": "bbb"}, - host: "aaa.bbb.ccc", - path: "", - shouldMatch: false, - }, - { - title: "Host route with multiple patterns, match", - route: new(Route).Host("{v1:[a-z]{3}}.{v2:[a-z]{3}}.{v3:[a-z]{3}}"), - request: newRequest("GET", "http://aaa.bbb.ccc/111/222/333"), - vars: map[string]string{"v1": "aaa", "v2": "bbb", "v3": "ccc"}, - host: "aaa.bbb.ccc", - path: "", - shouldMatch: true, - }, - { - title: "Host route with multiple patterns, wrong host in request URL", - route: new(Route).Host("{v1:[a-z]{3}}.{v2:[a-z]{3}}.{v3:[a-z]{3}}"), - request: newRequest("GET", "http://aaa.222.ccc/111/222/333"), - vars: map[string]string{"v1": "aaa", "v2": "bbb", "v3": "ccc"}, - host: "aaa.bbb.ccc", - path: "", - shouldMatch: false, - }, - { - title: "Host route with hyphenated name and pattern, match", - route: new(Route).Host("aaa.{v-1:[a-z]{3}}.ccc"), - request: newRequest("GET", "http://aaa.bbb.ccc/111/222/333"), - vars: map[string]string{"v-1": "bbb"}, - host: "aaa.bbb.ccc", - path: "", - shouldMatch: true, - }, - { - title: "Host route with hyphenated name and pattern, additional capturing group, match", - route: new(Route).Host("aaa.{v-1:[a-z]{2}(b|c)}.ccc"), - request: newRequest("GET", "http://aaa.bbb.ccc/111/222/333"), - vars: map[string]string{"v-1": "bbb"}, - host: "aaa.bbb.ccc", - path: "", - shouldMatch: true, - }, - { - title: "Host route with multiple hyphenated names and patterns, match", - route: new(Route).Host("{v-1:[a-z]{3}}.{v-2:[a-z]{3}}.{v-3:[a-z]{3}}"), - request: newRequest("GET", "http://aaa.bbb.ccc/111/222/333"), - vars: map[string]string{"v-1": "aaa", "v-2": "bbb", "v-3": "ccc"}, - host: "aaa.bbb.ccc", - path: "", - shouldMatch: true, - }, - { - title: "Path route with single pattern with pipe, match", - route: new(Route).Path("/{category:a|b/c}"), - request: newRequest("GET", "http://localhost/a"), - vars: map[string]string{"category": "a"}, - host: "", - path: "/a", - shouldMatch: true, - }, - { - title: "Path route with single pattern with pipe, match", - route: new(Route).Path("/{category:a|b/c}"), - request: newRequest("GET", "http://localhost/b/c"), - vars: map[string]string{"category": "b/c"}, - host: "", - path: "/b/c", - shouldMatch: true, - }, - { - title: "Path route with multiple patterns with pipe, match", - route: new(Route).Path("/{category:a|b/c}/{product}/{id:[0-9]+}"), - request: newRequest("GET", "http://localhost/a/product_name/1"), - vars: map[string]string{"category": "a", "product": "product_name", "id": "1"}, - host: "", - path: "/a/product_name/1", - shouldMatch: true, - }, - { - title: "Path route with multiple patterns with pipe, match", - route: new(Route).Path("/{category:a|b/c}/{product}/{id:[0-9]+}"), - request: newRequest("GET", "http://localhost/b/c/product_name/1"), - vars: map[string]string{"category": "b/c", "product": "product_name", "id": "1"}, - host: "", - path: "/b/c/product_name/1", - shouldMatch: true, - }, - } - for _, test := range tests { - testRoute(t, test) - } -} - -func TestPath(t *testing.T) { - tests := []routeTest{ - { - title: "Path route, match", - route: new(Route).Path("/111/222/333"), - request: newRequest("GET", "http://localhost/111/222/333"), - vars: map[string]string{}, - host: "", - path: "/111/222/333", - shouldMatch: true, - }, - { - title: "Path route, match with trailing slash in request and path", - route: new(Route).Path("/111/"), - request: newRequest("GET", "http://localhost/111/"), - vars: map[string]string{}, - host: "", - path: "/111/", - shouldMatch: true, - }, - { - title: "Path route, do not match with trailing slash in path", - route: new(Route).Path("/111/"), - request: newRequest("GET", "http://localhost/111"), - vars: map[string]string{}, - host: "", - path: "/111", - shouldMatch: false, - }, - { - title: "Path route, do not match with trailing slash in request", - route: new(Route).Path("/111"), - request: newRequest("GET", "http://localhost/111/"), - vars: map[string]string{}, - host: "", - path: "/111/", - shouldMatch: false, - }, - { - title: "Path route, wrong path in request in request URL", - route: new(Route).Path("/111/222/333"), - request: newRequest("GET", "http://localhost/1/2/3"), - vars: map[string]string{}, - host: "", - path: "/111/222/333", - shouldMatch: false, - }, - { - title: "Path route with pattern, match", - route: new(Route).Path("/111/{v1:[0-9]{3}}/333"), - request: newRequest("GET", "http://localhost/111/222/333"), - vars: map[string]string{"v1": "222"}, - host: "", - path: "/111/222/333", - shouldMatch: true, - }, - { - title: "Path route with pattern, URL in request does not match", - route: new(Route).Path("/111/{v1:[0-9]{3}}/333"), - request: newRequest("GET", "http://localhost/111/aaa/333"), - vars: map[string]string{"v1": "222"}, - host: "", - path: "/111/222/333", - shouldMatch: false, - }, - { - title: "Path route with multiple patterns, match", - route: new(Route).Path("/{v1:[0-9]{3}}/{v2:[0-9]{3}}/{v3:[0-9]{3}}"), - request: newRequest("GET", "http://localhost/111/222/333"), - vars: map[string]string{"v1": "111", "v2": "222", "v3": "333"}, - host: "", - path: "/111/222/333", - shouldMatch: true, - }, - { - title: "Path route with multiple patterns, URL in request does not match", - route: new(Route).Path("/{v1:[0-9]{3}}/{v2:[0-9]{3}}/{v3:[0-9]{3}}"), - request: newRequest("GET", "http://localhost/111/aaa/333"), - vars: map[string]string{"v1": "111", "v2": "222", "v3": "333"}, - host: "", - path: "/111/222/333", - shouldMatch: false, - }, - { - title: "Path route with multiple patterns with pipe, match", - route: new(Route).Path("/{category:a|(b/c)}/{product}/{id:[0-9]+}"), - request: newRequest("GET", "http://localhost/a/product_name/1"), - vars: map[string]string{"category": "a", "product": "product_name", "id": "1"}, - host: "", - path: "/a/product_name/1", - shouldMatch: true, - }, - { - title: "Path route with hyphenated name and pattern, match", - route: new(Route).Path("/111/{v-1:[0-9]{3}}/333"), - request: newRequest("GET", "http://localhost/111/222/333"), - vars: map[string]string{"v-1": "222"}, - host: "", - path: "/111/222/333", - shouldMatch: true, - }, - { - title: "Path route with multiple hyphenated names and patterns, match", - route: new(Route).Path("/{v-1:[0-9]{3}}/{v-2:[0-9]{3}}/{v-3:[0-9]{3}}"), - request: newRequest("GET", "http://localhost/111/222/333"), - vars: map[string]string{"v-1": "111", "v-2": "222", "v-3": "333"}, - host: "", - path: "/111/222/333", - shouldMatch: true, - }, - { - title: "Path route with multiple hyphenated names and patterns with pipe, match", - route: new(Route).Path("/{product-category:a|(b/c)}/{product-name}/{product-id:[0-9]+}"), - request: newRequest("GET", "http://localhost/a/product_name/1"), - vars: map[string]string{"product-category": "a", "product-name": "product_name", "product-id": "1"}, - host: "", - path: "/a/product_name/1", - shouldMatch: true, - }, - } - - for _, test := range tests { - testRoute(t, test) - } -} - -func TestPathPrefix(t *testing.T) { - tests := []routeTest{ - { - title: "PathPrefix route, match", - route: new(Route).PathPrefix("/111"), - request: newRequest("GET", "http://localhost/111/222/333"), - vars: map[string]string{}, - host: "", - path: "/111", - shouldMatch: true, - }, - { - title: "PathPrefix route, match substring", - route: new(Route).PathPrefix("/1"), - request: newRequest("GET", "http://localhost/111/222/333"), - vars: map[string]string{}, - host: "", - path: "/1", - shouldMatch: true, - }, - { - title: "PathPrefix route, URL prefix in request does not match", - route: new(Route).PathPrefix("/111"), - request: newRequest("GET", "http://localhost/1/2/3"), - vars: map[string]string{}, - host: "", - path: "/111", - shouldMatch: false, - }, - { - title: "PathPrefix route with pattern, match", - route: new(Route).PathPrefix("/111/{v1:[0-9]{3}}"), - request: newRequest("GET", "http://localhost/111/222/333"), - vars: map[string]string{"v1": "222"}, - host: "", - path: "/111/222", - shouldMatch: true, - }, - { - title: "PathPrefix route with pattern, URL prefix in request does not match", - route: new(Route).PathPrefix("/111/{v1:[0-9]{3}}"), - request: newRequest("GET", "http://localhost/111/aaa/333"), - vars: map[string]string{"v1": "222"}, - host: "", - path: "/111/222", - shouldMatch: false, - }, - { - title: "PathPrefix route with multiple patterns, match", - route: new(Route).PathPrefix("/{v1:[0-9]{3}}/{v2:[0-9]{3}}"), - request: newRequest("GET", "http://localhost/111/222/333"), - vars: map[string]string{"v1": "111", "v2": "222"}, - host: "", - path: "/111/222", - shouldMatch: true, - }, - { - title: "PathPrefix route with multiple patterns, URL prefix in request does not match", - route: new(Route).PathPrefix("/{v1:[0-9]{3}}/{v2:[0-9]{3}}"), - request: newRequest("GET", "http://localhost/111/aaa/333"), - vars: map[string]string{"v1": "111", "v2": "222"}, - host: "", - path: "/111/222", - shouldMatch: false, - }, - } - - for _, test := range tests { - testRoute(t, test) - } -} - -func TestHostPath(t *testing.T) { - tests := []routeTest{ - { - title: "Host and Path route, match", - route: new(Route).Host("aaa.bbb.ccc").Path("/111/222/333"), - request: newRequest("GET", "http://aaa.bbb.ccc/111/222/333"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Host and Path route, wrong host in request URL", - route: new(Route).Host("aaa.bbb.ccc").Path("/111/222/333"), - request: newRequest("GET", "http://aaa.222.ccc/111/222/333"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: false, - }, - { - title: "Host and Path route with pattern, match", - route: new(Route).Host("aaa.{v1:[a-z]{3}}.ccc").Path("/111/{v2:[0-9]{3}}/333"), - request: newRequest("GET", "http://aaa.bbb.ccc/111/222/333"), - vars: map[string]string{"v1": "bbb", "v2": "222"}, - host: "aaa.bbb.ccc", - path: "/111/222/333", - shouldMatch: true, - }, - { - title: "Host and Path route with pattern, URL in request does not match", - route: new(Route).Host("aaa.{v1:[a-z]{3}}.ccc").Path("/111/{v2:[0-9]{3}}/333"), - request: newRequest("GET", "http://aaa.222.ccc/111/222/333"), - vars: map[string]string{"v1": "bbb", "v2": "222"}, - host: "aaa.bbb.ccc", - path: "/111/222/333", - shouldMatch: false, - }, - { - title: "Host and Path route with multiple patterns, match", - route: new(Route).Host("{v1:[a-z]{3}}.{v2:[a-z]{3}}.{v3:[a-z]{3}}").Path("/{v4:[0-9]{3}}/{v5:[0-9]{3}}/{v6:[0-9]{3}}"), - request: newRequest("GET", "http://aaa.bbb.ccc/111/222/333"), - vars: map[string]string{"v1": "aaa", "v2": "bbb", "v3": "ccc", "v4": "111", "v5": "222", "v6": "333"}, - host: "aaa.bbb.ccc", - path: "/111/222/333", - shouldMatch: true, - }, - { - title: "Host and Path route with multiple patterns, URL in request does not match", - route: new(Route).Host("{v1:[a-z]{3}}.{v2:[a-z]{3}}.{v3:[a-z]{3}}").Path("/{v4:[0-9]{3}}/{v5:[0-9]{3}}/{v6:[0-9]{3}}"), - request: newRequest("GET", "http://aaa.222.ccc/111/222/333"), - vars: map[string]string{"v1": "aaa", "v2": "bbb", "v3": "ccc", "v4": "111", "v5": "222", "v6": "333"}, - host: "aaa.bbb.ccc", - path: "/111/222/333", - shouldMatch: false, - }, - } - - for _, test := range tests { - testRoute(t, test) - } -} - -func TestHeaders(t *testing.T) { - // newRequestHeaders creates a new request with a method, url, and headers - newRequestHeaders := func(method, url string, headers map[string]string) *http.Request { - req, err := http.NewRequest(method, url, nil) - if err != nil { - panic(err) - } - for k, v := range headers { - req.Header.Add(k, v) - } - return req - } - - tests := []routeTest{ - { - title: "Headers route, match", - route: new(Route).Headers("foo", "bar", "baz", "ding"), - request: newRequestHeaders("GET", "http://localhost", map[string]string{"foo": "bar", "baz": "ding"}), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Headers route, bad header values", - route: new(Route).Headers("foo", "bar", "baz", "ding"), - request: newRequestHeaders("GET", "http://localhost", map[string]string{"foo": "bar", "baz": "dong"}), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: false, - }, - { - title: "Headers route, regex header values to match", - route: new(Route).Headers("foo", "ba[zr]"), - request: newRequestHeaders("GET", "http://localhost", map[string]string{"foo": "bar"}), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: false, - }, - { - title: "Headers route, regex header values to match", - route: new(Route).HeadersRegexp("foo", "ba[zr]"), - request: newRequestHeaders("GET", "http://localhost", map[string]string{"foo": "baz"}), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: true, - }, - } - - for _, test := range tests { - testRoute(t, test) - } - -} - -func TestMethods(t *testing.T) { - tests := []routeTest{ - { - title: "Methods route, match GET", - route: new(Route).Methods("GET", "POST"), - request: newRequest("GET", "http://localhost"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Methods route, match POST", - route: new(Route).Methods("GET", "POST"), - request: newRequest("POST", "http://localhost"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Methods route, bad method", - route: new(Route).Methods("GET", "POST"), - request: newRequest("PUT", "http://localhost"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: false, - }, - } - - for _, test := range tests { - testRoute(t, test) - } -} - -func TestQueries(t *testing.T) { - tests := []routeTest{ - { - title: "Queries route, match", - route: new(Route).Queries("foo", "bar", "baz", "ding"), - request: newRequest("GET", "http://localhost?foo=bar&baz=ding"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Queries route, match with a query string", - route: new(Route).Host("www.example.com").Path("/api").Queries("foo", "bar", "baz", "ding"), - request: newRequest("GET", "http://www.example.com/api?foo=bar&baz=ding"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Queries route, match with a query string out of order", - route: new(Route).Host("www.example.com").Path("/api").Queries("foo", "bar", "baz", "ding"), - request: newRequest("GET", "http://www.example.com/api?baz=ding&foo=bar"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Queries route, bad query", - route: new(Route).Queries("foo", "bar", "baz", "ding"), - request: newRequest("GET", "http://localhost?foo=bar&baz=dong"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: false, - }, - { - title: "Queries route with pattern, match", - route: new(Route).Queries("foo", "{v1}"), - request: newRequest("GET", "http://localhost?foo=bar"), - vars: map[string]string{"v1": "bar"}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Queries route with multiple patterns, match", - route: new(Route).Queries("foo", "{v1}", "baz", "{v2}"), - request: newRequest("GET", "http://localhost?foo=bar&baz=ding"), - vars: map[string]string{"v1": "bar", "v2": "ding"}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Queries route with regexp pattern, match", - route: new(Route).Queries("foo", "{v1:[0-9]+}"), - request: newRequest("GET", "http://localhost?foo=10"), - vars: map[string]string{"v1": "10"}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Queries route with regexp pattern, regexp does not match", - route: new(Route).Queries("foo", "{v1:[0-9]+}"), - request: newRequest("GET", "http://localhost?foo=a"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: false, - }, - { - title: "Queries route with regexp pattern with quantifier, match", - route: new(Route).Queries("foo", "{v1:[0-9]{1}}"), - request: newRequest("GET", "http://localhost?foo=1"), - vars: map[string]string{"v1": "1"}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Queries route with regexp pattern with quantifier, additional variable in query string, match", - route: new(Route).Queries("foo", "{v1:[0-9]{1}}"), - request: newRequest("GET", "http://localhost?bar=2&foo=1"), - vars: map[string]string{"v1": "1"}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Queries route with regexp pattern with quantifier, regexp does not match", - route: new(Route).Queries("foo", "{v1:[0-9]{1}}"), - request: newRequest("GET", "http://localhost?foo=12"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: false, - }, - { - title: "Queries route with regexp pattern with quantifier, additional capturing group", - route: new(Route).Queries("foo", "{v1:[0-9]{1}(a|b)}"), - request: newRequest("GET", "http://localhost?foo=1a"), - vars: map[string]string{"v1": "1a"}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Queries route with regexp pattern with quantifier, additional variable in query string, regexp does not match", - route: new(Route).Queries("foo", "{v1:[0-9]{1}}"), - request: newRequest("GET", "http://localhost?foo=12"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: false, - }, - { - title: "Queries route with hyphenated name, match", - route: new(Route).Queries("foo", "{v-1}"), - request: newRequest("GET", "http://localhost?foo=bar"), - vars: map[string]string{"v-1": "bar"}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Queries route with multiple hyphenated names, match", - route: new(Route).Queries("foo", "{v-1}", "baz", "{v-2}"), - request: newRequest("GET", "http://localhost?foo=bar&baz=ding"), - vars: map[string]string{"v-1": "bar", "v-2": "ding"}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Queries route with hyphenate name and pattern, match", - route: new(Route).Queries("foo", "{v-1:[0-9]+}"), - request: newRequest("GET", "http://localhost?foo=10"), - vars: map[string]string{"v-1": "10"}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Queries route with hyphenated name and pattern with quantifier, additional capturing group", - route: new(Route).Queries("foo", "{v-1:[0-9]{1}(a|b)}"), - request: newRequest("GET", "http://localhost?foo=1a"), - vars: map[string]string{"v-1": "1a"}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Queries route with empty value, should match", - route: new(Route).Queries("foo", ""), - request: newRequest("GET", "http://localhost?foo=bar"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Queries route with empty value and no parameter in request, should not match", - route: new(Route).Queries("foo", ""), - request: newRequest("GET", "http://localhost"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: false, - }, - { - title: "Queries route with empty value and empty parameter in request, should match", - route: new(Route).Queries("foo", ""), - request: newRequest("GET", "http://localhost?foo="), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Queries route with overlapping value, should not match", - route: new(Route).Queries("foo", "bar"), - request: newRequest("GET", "http://localhost?foo=barfoo"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: false, - }, - { - title: "Queries route with no parameter in request, should not match", - route: new(Route).Queries("foo", "{bar}"), - request: newRequest("GET", "http://localhost"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: false, - }, - { - title: "Queries route with empty parameter in request, should match", - route: new(Route).Queries("foo", "{bar}"), - request: newRequest("GET", "http://localhost?foo="), - vars: map[string]string{"foo": ""}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Queries route, bad submatch", - route: new(Route).Queries("foo", "bar", "baz", "ding"), - request: newRequest("GET", "http://localhost?fffoo=bar&baz=dingggg"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: false, - }, - } - - for _, test := range tests { - testRoute(t, test) - } -} - -func TestSchemes(t *testing.T) { - tests := []routeTest{ - // Schemes - { - title: "Schemes route, match https", - route: new(Route).Schemes("https", "ftp"), - request: newRequest("GET", "https://localhost"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Schemes route, match ftp", - route: new(Route).Schemes("https", "ftp"), - request: newRequest("GET", "ftp://localhost"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "Schemes route, bad scheme", - route: new(Route).Schemes("https", "ftp"), - request: newRequest("GET", "http://localhost"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: false, - }, - } - for _, test := range tests { - testRoute(t, test) - } -} - -func TestMatcherFunc(t *testing.T) { - m := func(r *http.Request, m *RouteMatch) bool { - if r.URL.Host == "aaa.bbb.ccc" { - return true - } - return false - } - - tests := []routeTest{ - { - title: "MatchFunc route, match", - route: new(Route).MatcherFunc(m), - request: newRequest("GET", "http://aaa.bbb.ccc"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: true, - }, - { - title: "MatchFunc route, non-match", - route: new(Route).MatcherFunc(m), - request: newRequest("GET", "http://aaa.222.ccc"), - vars: map[string]string{}, - host: "", - path: "", - shouldMatch: false, - }, - } - - for _, test := range tests { - testRoute(t, test) - } -} - -func TestBuildVarsFunc(t *testing.T) { - tests := []routeTest{ - { - title: "BuildVarsFunc set on route", - route: new(Route).Path(`/111/{v1:\d}{v2:.*}`).BuildVarsFunc(func(vars map[string]string) map[string]string { - vars["v1"] = "3" - vars["v2"] = "a" - return vars - }), - request: newRequest("GET", "http://localhost/111/2"), - path: "/111/3a", - shouldMatch: true, - }, - { - title: "BuildVarsFunc set on route and parent route", - route: new(Route).PathPrefix(`/{v1:\d}`).BuildVarsFunc(func(vars map[string]string) map[string]string { - vars["v1"] = "2" - return vars - }).Subrouter().Path(`/{v2:\w}`).BuildVarsFunc(func(vars map[string]string) map[string]string { - vars["v2"] = "b" - return vars - }), - request: newRequest("GET", "http://localhost/1/a"), - path: "/2/b", - shouldMatch: true, - }, - } - - for _, test := range tests { - testRoute(t, test) - } -} - -func TestSubRouter(t *testing.T) { - subrouter1 := new(Route).Host("{v1:[a-z]+}.google.com").Subrouter() - subrouter2 := new(Route).PathPrefix("/foo/{v1}").Subrouter() - - tests := []routeTest{ - { - route: subrouter1.Path("/{v2:[a-z]+}"), - request: newRequest("GET", "http://aaa.google.com/bbb"), - vars: map[string]string{"v1": "aaa", "v2": "bbb"}, - host: "aaa.google.com", - path: "/bbb", - shouldMatch: true, - }, - { - route: subrouter1.Path("/{v2:[a-z]+}"), - request: newRequest("GET", "http://111.google.com/111"), - vars: map[string]string{"v1": "aaa", "v2": "bbb"}, - host: "aaa.google.com", - path: "/bbb", - shouldMatch: false, - }, - { - route: subrouter2.Path("/baz/{v2}"), - request: newRequest("GET", "http://localhost/foo/bar/baz/ding"), - vars: map[string]string{"v1": "bar", "v2": "ding"}, - host: "", - path: "/foo/bar/baz/ding", - shouldMatch: true, - }, - { - route: subrouter2.Path("/baz/{v2}"), - request: newRequest("GET", "http://localhost/foo/bar"), - vars: map[string]string{"v1": "bar", "v2": "ding"}, - host: "", - path: "/foo/bar/baz/ding", - shouldMatch: false, - }, - } - - for _, test := range tests { - testRoute(t, test) - } -} - -func TestNamedRoutes(t *testing.T) { - r1 := NewRouter() - r1.NewRoute().Name("a") - r1.NewRoute().Name("b") - r1.NewRoute().Name("c") - - r2 := r1.NewRoute().Subrouter() - r2.NewRoute().Name("d") - r2.NewRoute().Name("e") - r2.NewRoute().Name("f") - - r3 := r2.NewRoute().Subrouter() - r3.NewRoute().Name("g") - r3.NewRoute().Name("h") - r3.NewRoute().Name("i") - - if r1.namedRoutes == nil || len(r1.namedRoutes) != 9 { - t.Errorf("Expected 9 named routes, got %v", r1.namedRoutes) - } else if r1.Get("i") == nil { - t.Errorf("Subroute name not registered") - } -} - -func TestStrictSlash(t *testing.T) { - r := NewRouter() - r.StrictSlash(true) - - tests := []routeTest{ - { - title: "Redirect path without slash", - route: r.NewRoute().Path("/111/"), - request: newRequest("GET", "http://localhost/111"), - vars: map[string]string{}, - host: "", - path: "/111/", - shouldMatch: true, - shouldRedirect: true, - }, - { - title: "Do not redirect path with slash", - route: r.NewRoute().Path("/111/"), - request: newRequest("GET", "http://localhost/111/"), - vars: map[string]string{}, - host: "", - path: "/111/", - shouldMatch: true, - shouldRedirect: false, - }, - { - title: "Redirect path with slash", - route: r.NewRoute().Path("/111"), - request: newRequest("GET", "http://localhost/111/"), - vars: map[string]string{}, - host: "", - path: "/111", - shouldMatch: true, - shouldRedirect: true, - }, - { - title: "Do not redirect path without slash", - route: r.NewRoute().Path("/111"), - request: newRequest("GET", "http://localhost/111"), - vars: map[string]string{}, - host: "", - path: "/111", - shouldMatch: true, - shouldRedirect: false, - }, - { - title: "Propagate StrictSlash to subrouters", - route: r.NewRoute().PathPrefix("/static/").Subrouter().Path("/images/"), - request: newRequest("GET", "http://localhost/static/images"), - vars: map[string]string{}, - host: "", - path: "/static/images/", - shouldMatch: true, - shouldRedirect: true, - }, - { - title: "Ignore StrictSlash for path prefix", - route: r.NewRoute().PathPrefix("/static/"), - request: newRequest("GET", "http://localhost/static/logo.png"), - vars: map[string]string{}, - host: "", - path: "/static/", - shouldMatch: true, - shouldRedirect: false, - }, - } - - for _, test := range tests { - testRoute(t, test) - } -} - -func TestWalkSingleDepth(t *testing.T) { - r0 := NewRouter() - r1 := NewRouter() - r2 := NewRouter() - - r0.Path("/g") - r0.Path("/o") - r0.Path("/d").Handler(r1) - r0.Path("/r").Handler(r2) - r0.Path("/a") - - r1.Path("/z") - r1.Path("/i") - r1.Path("/l") - r1.Path("/l") - - r2.Path("/i") - r2.Path("/l") - r2.Path("/l") - - paths := []string{"g", "o", "r", "i", "l", "l", "a"} - depths := []int{0, 0, 0, 1, 1, 1, 0} - i := 0 - err := r0.Walk(func(route *Route, router *Router, ancestors []*Route) error { - matcher := route.matchers[0].(*routeRegexp) - if matcher.template == "/d" { - return SkipRouter - } - if len(ancestors) != depths[i] { - t.Errorf(`Expected depth of %d at i = %d; got "%s"`, depths[i], i, len(ancestors)) - } - if matcher.template != "/"+paths[i] { - t.Errorf(`Expected "/%s" at i = %d; got "%s"`, paths[i], i, matcher.template) - } - i++ - return nil - }) - if err != nil { - panic(err) - } - if i != len(paths) { - t.Errorf("Expected %d routes, found %d", len(paths), i) - } -} - -func TestWalkNested(t *testing.T) { - router := NewRouter() - - g := router.Path("/g").Subrouter() - o := g.PathPrefix("/o").Subrouter() - r := o.PathPrefix("/r").Subrouter() - i := r.PathPrefix("/i").Subrouter() - l1 := i.PathPrefix("/l").Subrouter() - l2 := l1.PathPrefix("/l").Subrouter() - l2.Path("/a") - - paths := []string{"/g", "/g/o", "/g/o/r", "/g/o/r/i", "/g/o/r/i/l", "/g/o/r/i/l/l", "/g/o/r/i/l/l/a"} - idx := 0 - err := router.Walk(func(route *Route, router *Router, ancestors []*Route) error { - path := paths[idx] - tpl := route.regexp.path.template - if tpl != path { - t.Errorf(`Expected %s got %s`, path, tpl) - } - idx++ - return nil - }) - if err != nil { - panic(err) - } - if idx != len(paths) { - t.Errorf("Expected %d routes, found %d", len(paths), idx) - } -} - -// ---------------------------------------------------------------------------- -// Helpers -// ---------------------------------------------------------------------------- - -func getRouteTemplate(route *Route) string { - host, path := "none", "none" - if route.regexp != nil { - if route.regexp.host != nil { - host = route.regexp.host.template - } - if route.regexp.path != nil { - path = route.regexp.path.template - } - } - return fmt.Sprintf("Host: %v, Path: %v", host, path) -} - -func testRoute(t *testing.T, test routeTest) { - request := test.request - route := test.route - vars := test.vars - shouldMatch := test.shouldMatch - host := test.host - path := test.path - url := test.host + test.path - shouldRedirect := test.shouldRedirect - - var match RouteMatch - ok := route.Match(request, &match) - if ok != shouldMatch { - msg := "Should match" - if !shouldMatch { - msg = "Should not match" - } - t.Errorf("(%v) %v:\nRoute: %#v\nRequest: %#v\nVars: %v\n", test.title, msg, route, request, vars) - return - } - if shouldMatch { - if test.vars != nil && !stringMapEqual(test.vars, match.Vars) { - t.Errorf("(%v) Vars not equal: expected %v, got %v", test.title, vars, match.Vars) - return - } - if host != "" { - u, _ := test.route.URLHost(mapToPairs(match.Vars)...) - if host != u.Host { - t.Errorf("(%v) URLHost not equal: expected %v, got %v -- %v", test.title, host, u.Host, getRouteTemplate(route)) - return - } - } - if path != "" { - u, _ := route.URLPath(mapToPairs(match.Vars)...) - if path != u.Path { - t.Errorf("(%v) URLPath not equal: expected %v, got %v -- %v", test.title, path, u.Path, getRouteTemplate(route)) - return - } - } - if url != "" { - u, _ := route.URL(mapToPairs(match.Vars)...) - if url != u.Host+u.Path { - t.Errorf("(%v) URL not equal: expected %v, got %v -- %v", test.title, url, u.Host+u.Path, getRouteTemplate(route)) - return - } - } - if shouldRedirect && match.Handler == nil { - t.Errorf("(%v) Did not redirect", test.title) - return - } - if !shouldRedirect && match.Handler != nil { - t.Errorf("(%v) Unexpected redirect", test.title) - return - } - } -} - -// Tests that the context is cleared or not cleared properly depending on -// the configuration of the router -func TestKeepContext(t *testing.T) { - func1 := func(w http.ResponseWriter, r *http.Request) {} - - r := NewRouter() - r.HandleFunc("/", func1).Name("func1") - - req, _ := http.NewRequest("GET", "http://localhost/", nil) - context.Set(req, "t", 1) - - res := new(http.ResponseWriter) - r.ServeHTTP(*res, req) - - if _, ok := context.GetOk(req, "t"); ok { - t.Error("Context should have been cleared at end of request") - } - - r.KeepContext = true - - req, _ = http.NewRequest("GET", "http://localhost/", nil) - context.Set(req, "t", 1) - - r.ServeHTTP(*res, req) - if _, ok := context.GetOk(req, "t"); !ok { - t.Error("Context should NOT have been cleared at end of request") - } - -} - -type TestA301ResponseWriter struct { - hh http.Header - status int -} - -func (ho TestA301ResponseWriter) Header() http.Header { - return http.Header(ho.hh) -} - -func (ho TestA301ResponseWriter) Write(b []byte) (int, error) { - return 0, nil -} - -func (ho TestA301ResponseWriter) WriteHeader(code int) { - ho.status = code -} - -func Test301Redirect(t *testing.T) { - m := make(http.Header) - - func1 := func(w http.ResponseWriter, r *http.Request) {} - func2 := func(w http.ResponseWriter, r *http.Request) {} - - r := NewRouter() - r.HandleFunc("/api/", func2).Name("func2") - r.HandleFunc("/", func1).Name("func1") - - req, _ := http.NewRequest("GET", "http://localhost//api/?abc=def", nil) - - res := TestA301ResponseWriter{ - hh: m, - status: 0, - } - r.ServeHTTP(&res, req) - - if "http://localhost/api/?abc=def" != res.hh["Location"][0] { - t.Errorf("Should have complete URL with query string") - } -} - -// https://plus.google.com/101022900381697718949/posts/eWy6DjFJ6uW -func TestSubrouterHeader(t *testing.T) { - expected := "func1 response" - func1 := func(w http.ResponseWriter, r *http.Request) { - fmt.Fprint(w, expected) - } - func2 := func(http.ResponseWriter, *http.Request) {} - - r := NewRouter() - s := r.Headers("SomeSpecialHeader", "").Subrouter() - s.HandleFunc("/", func1).Name("func1") - r.HandleFunc("/", func2).Name("func2") - - req, _ := http.NewRequest("GET", "http://localhost/", nil) - req.Header.Add("SomeSpecialHeader", "foo") - match := new(RouteMatch) - matched := r.Match(req, match) - if !matched { - t.Errorf("Should match request") - } - if match.Route.GetName() != "func1" { - t.Errorf("Expecting func1 handler, got %s", match.Route.GetName()) - } - resp := NewRecorder() - match.Handler.ServeHTTP(resp, req) - if resp.Body.String() != expected { - t.Errorf("Expecting %q", expected) - } -} - -// mapToPairs converts a string map to a slice of string pairs -func mapToPairs(m map[string]string) []string { - var i int - p := make([]string, len(m)*2) - for k, v := range m { - p[i] = k - p[i+1] = v - i += 2 - } - return p -} - -// stringMapEqual checks the equality of two string maps -func stringMapEqual(m1, m2 map[string]string) bool { - nil1 := m1 == nil - nil2 := m2 == nil - if nil1 != nil2 || len(m1) != len(m2) { - return false - } - for k, v := range m1 { - if v != m2[k] { - return false - } - } - return true -} - -// newRequest is a helper function to create a new request with a method and url -func newRequest(method, url string) *http.Request { - req, err := http.NewRequest(method, url, nil) - if err != nil { - panic(err) - } - return req -} diff --git a/vendor/github.com/gorilla/mux/old_test.go b/vendor/github.com/gorilla/mux/old_test.go deleted file mode 100644 index 1f7c190c0..000000000 --- a/vendor/github.com/gorilla/mux/old_test.go +++ /dev/null @@ -1,714 +0,0 @@ -// Old tests ported to Go1. This is a mess. Want to drop it one day. - -// Copyright 2011 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 mux - -import ( - "bytes" - "net/http" - "testing" -) - -// ---------------------------------------------------------------------------- -// ResponseRecorder -// ---------------------------------------------------------------------------- -// 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. - -// ResponseRecorder is an implementation of http.ResponseWriter that -// records its mutations for later inspection in tests. -type ResponseRecorder struct { - Code int // the HTTP response code from WriteHeader - HeaderMap http.Header // the HTTP response headers - Body *bytes.Buffer // if non-nil, the bytes.Buffer to append written data to - Flushed bool -} - -// NewRecorder returns an initialized ResponseRecorder. -func NewRecorder() *ResponseRecorder { - return &ResponseRecorder{ - HeaderMap: make(http.Header), - Body: new(bytes.Buffer), - } -} - -// DefaultRemoteAddr is the default remote address to return in RemoteAddr if -// an explicit DefaultRemoteAddr isn't set on ResponseRecorder. -const DefaultRemoteAddr = "1.2.3.4" - -// Header returns the response headers. -func (rw *ResponseRecorder) Header() http.Header { - return rw.HeaderMap -} - -// Write always succeeds and writes to rw.Body, if not nil. -func (rw *ResponseRecorder) Write(buf []byte) (int, error) { - if rw.Body != nil { - rw.Body.Write(buf) - } - if rw.Code == 0 { - rw.Code = http.StatusOK - } - return len(buf), nil -} - -// WriteHeader sets rw.Code. -func (rw *ResponseRecorder) WriteHeader(code int) { - rw.Code = code -} - -// Flush sets rw.Flushed to true. -func (rw *ResponseRecorder) Flush() { - rw.Flushed = true -} - -// ---------------------------------------------------------------------------- - -func TestRouteMatchers(t *testing.T) { - var scheme, host, path, query, method string - var headers map[string]string - var resultVars map[bool]map[string]string - - router := NewRouter() - router.NewRoute().Host("{var1}.google.com"). - Path("/{var2:[a-z]+}/{var3:[0-9]+}"). - Queries("foo", "bar"). - Methods("GET"). - Schemes("https"). - Headers("x-requested-with", "XMLHttpRequest") - router.NewRoute().Host("www.{var4}.com"). - PathPrefix("/foo/{var5:[a-z]+}/{var6:[0-9]+}"). - Queries("baz", "ding"). - Methods("POST"). - Schemes("http"). - Headers("Content-Type", "application/json") - - reset := func() { - // Everything match. - scheme = "https" - host = "www.google.com" - path = "/product/42" - query = "?foo=bar" - method = "GET" - headers = map[string]string{"X-Requested-With": "XMLHttpRequest"} - resultVars = map[bool]map[string]string{ - true: {"var1": "www", "var2": "product", "var3": "42"}, - false: {}, - } - } - - reset2 := func() { - // Everything match. - scheme = "http" - host = "www.google.com" - path = "/foo/product/42/path/that/is/ignored" - query = "?baz=ding" - method = "POST" - headers = map[string]string{"Content-Type": "application/json"} - resultVars = map[bool]map[string]string{ - true: {"var4": "google", "var5": "product", "var6": "42"}, - false: {}, - } - } - - match := func(shouldMatch bool) { - url := scheme + "://" + host + path + query - request, _ := http.NewRequest(method, url, nil) - for key, value := range headers { - request.Header.Add(key, value) - } - - var routeMatch RouteMatch - matched := router.Match(request, &routeMatch) - if matched != shouldMatch { - // Need better messages. :) - if matched { - t.Errorf("Should match.") - } else { - t.Errorf("Should not match.") - } - } - - if matched { - currentRoute := routeMatch.Route - if currentRoute == nil { - t.Errorf("Expected a current route.") - } - vars := routeMatch.Vars - expectedVars := resultVars[shouldMatch] - if len(vars) != len(expectedVars) { - t.Errorf("Expected vars: %v Got: %v.", expectedVars, vars) - } - for name, value := range vars { - if expectedVars[name] != value { - t.Errorf("Expected vars: %v Got: %v.", expectedVars, vars) - } - } - } - } - - // 1st route -------------------------------------------------------------- - - // Everything match. - reset() - match(true) - - // Scheme doesn't match. - reset() - scheme = "http" - match(false) - - // Host doesn't match. - reset() - host = "www.mygoogle.com" - match(false) - - // Path doesn't match. - reset() - path = "/product/notdigits" - match(false) - - // Query doesn't match. - reset() - query = "?foo=baz" - match(false) - - // Method doesn't match. - reset() - method = "POST" - match(false) - - // Header doesn't match. - reset() - headers = map[string]string{} - match(false) - - // Everything match, again. - reset() - match(true) - - // 2nd route -------------------------------------------------------------- - - // Everything match. - reset2() - match(true) - - // Scheme doesn't match. - reset2() - scheme = "https" - match(false) - - // Host doesn't match. - reset2() - host = "sub.google.com" - match(false) - - // Path doesn't match. - reset2() - path = "/bar/product/42" - match(false) - - // Query doesn't match. - reset2() - query = "?foo=baz" - match(false) - - // Method doesn't match. - reset2() - method = "GET" - match(false) - - // Header doesn't match. - reset2() - headers = map[string]string{} - match(false) - - // Everything match, again. - reset2() - match(true) -} - -type headerMatcherTest struct { - matcher headerMatcher - headers map[string]string - result bool -} - -var headerMatcherTests = []headerMatcherTest{ - { - matcher: headerMatcher(map[string]string{"x-requested-with": "XMLHttpRequest"}), - headers: map[string]string{"X-Requested-With": "XMLHttpRequest"}, - result: true, - }, - { - matcher: headerMatcher(map[string]string{"x-requested-with": ""}), - headers: map[string]string{"X-Requested-With": "anything"}, - result: true, - }, - { - matcher: headerMatcher(map[string]string{"x-requested-with": "XMLHttpRequest"}), - headers: map[string]string{}, - result: false, - }, -} - -type hostMatcherTest struct { - matcher *Route - url string - vars map[string]string - result bool -} - -var hostMatcherTests = []hostMatcherTest{ - { - matcher: NewRouter().NewRoute().Host("{foo:[a-z][a-z][a-z]}.{bar:[a-z][a-z][a-z]}.{baz:[a-z][a-z][a-z]}"), - url: "http://abc.def.ghi/", - vars: map[string]string{"foo": "abc", "bar": "def", "baz": "ghi"}, - result: true, - }, - { - matcher: NewRouter().NewRoute().Host("{foo:[a-z][a-z][a-z]}.{bar:[a-z][a-z][a-z]}.{baz:[a-z][a-z][a-z]}"), - url: "http://a.b.c/", - vars: map[string]string{"foo": "abc", "bar": "def", "baz": "ghi"}, - result: false, - }, -} - -type methodMatcherTest struct { - matcher methodMatcher - method string - result bool -} - -var methodMatcherTests = []methodMatcherTest{ - { - matcher: methodMatcher([]string{"GET", "POST", "PUT"}), - method: "GET", - result: true, - }, - { - matcher: methodMatcher([]string{"GET", "POST", "PUT"}), - method: "POST", - result: true, - }, - { - matcher: methodMatcher([]string{"GET", "POST", "PUT"}), - method: "PUT", - result: true, - }, - { - matcher: methodMatcher([]string{"GET", "POST", "PUT"}), - method: "DELETE", - result: false, - }, -} - -type pathMatcherTest struct { - matcher *Route - url string - vars map[string]string - result bool -} - -var pathMatcherTests = []pathMatcherTest{ - { - matcher: NewRouter().NewRoute().Path("/{foo:[0-9][0-9][0-9]}/{bar:[0-9][0-9][0-9]}/{baz:[0-9][0-9][0-9]}"), - url: "http://localhost:8080/123/456/789", - vars: map[string]string{"foo": "123", "bar": "456", "baz": "789"}, - result: true, - }, - { - matcher: NewRouter().NewRoute().Path("/{foo:[0-9][0-9][0-9]}/{bar:[0-9][0-9][0-9]}/{baz:[0-9][0-9][0-9]}"), - url: "http://localhost:8080/1/2/3", - vars: map[string]string{"foo": "123", "bar": "456", "baz": "789"}, - result: false, - }, -} - -type schemeMatcherTest struct { - matcher schemeMatcher - url string - result bool -} - -var schemeMatcherTests = []schemeMatcherTest{ - { - matcher: schemeMatcher([]string{"http", "https"}), - url: "http://localhost:8080/", - result: true, - }, - { - matcher: schemeMatcher([]string{"http", "https"}), - url: "https://localhost:8080/", - result: true, - }, - { - matcher: schemeMatcher([]string{"https"}), - url: "http://localhost:8080/", - result: false, - }, - { - matcher: schemeMatcher([]string{"http"}), - url: "https://localhost:8080/", - result: false, - }, -} - -type urlBuildingTest struct { - route *Route - vars []string - url string -} - -var urlBuildingTests = []urlBuildingTest{ - { - route: new(Route).Host("foo.domain.com"), - vars: []string{}, - url: "http://foo.domain.com", - }, - { - route: new(Route).Host("{subdomain}.domain.com"), - vars: []string{"subdomain", "bar"}, - url: "http://bar.domain.com", - }, - { - route: new(Route).Host("foo.domain.com").Path("/articles"), - vars: []string{}, - url: "http://foo.domain.com/articles", - }, - { - route: new(Route).Path("/articles"), - vars: []string{}, - url: "/articles", - }, - { - route: new(Route).Path("/articles/{category}/{id:[0-9]+}"), - vars: []string{"category", "technology", "id", "42"}, - url: "/articles/technology/42", - }, - { - route: new(Route).Host("{subdomain}.domain.com").Path("/articles/{category}/{id:[0-9]+}"), - vars: []string{"subdomain", "foo", "category", "technology", "id", "42"}, - url: "http://foo.domain.com/articles/technology/42", - }, -} - -func TestHeaderMatcher(t *testing.T) { - for _, v := range headerMatcherTests { - request, _ := http.NewRequest("GET", "http://localhost:8080/", nil) - for key, value := range v.headers { - request.Header.Add(key, value) - } - var routeMatch RouteMatch - result := v.matcher.Match(request, &routeMatch) - if result != v.result { - if v.result { - t.Errorf("%#v: should match %v.", v.matcher, request.Header) - } else { - t.Errorf("%#v: should not match %v.", v.matcher, request.Header) - } - } - } -} - -func TestHostMatcher(t *testing.T) { - for _, v := range hostMatcherTests { - request, _ := http.NewRequest("GET", v.url, nil) - var routeMatch RouteMatch - result := v.matcher.Match(request, &routeMatch) - vars := routeMatch.Vars - if result != v.result { - if v.result { - t.Errorf("%#v: should match %v.", v.matcher, v.url) - } else { - t.Errorf("%#v: should not match %v.", v.matcher, v.url) - } - } - if result { - if len(vars) != len(v.vars) { - t.Errorf("%#v: vars length should be %v, got %v.", v.matcher, len(v.vars), len(vars)) - } - for name, value := range vars { - if v.vars[name] != value { - t.Errorf("%#v: expected value %v for key %v, got %v.", v.matcher, v.vars[name], name, value) - } - } - } else { - if len(vars) != 0 { - t.Errorf("%#v: vars length should be 0, got %v.", v.matcher, len(vars)) - } - } - } -} - -func TestMethodMatcher(t *testing.T) { - for _, v := range methodMatcherTests { - request, _ := http.NewRequest(v.method, "http://localhost:8080/", nil) - var routeMatch RouteMatch - result := v.matcher.Match(request, &routeMatch) - if result != v.result { - if v.result { - t.Errorf("%#v: should match %v.", v.matcher, v.method) - } else { - t.Errorf("%#v: should not match %v.", v.matcher, v.method) - } - } - } -} - -func TestPathMatcher(t *testing.T) { - for _, v := range pathMatcherTests { - request, _ := http.NewRequest("GET", v.url, nil) - var routeMatch RouteMatch - result := v.matcher.Match(request, &routeMatch) - vars := routeMatch.Vars - if result != v.result { - if v.result { - t.Errorf("%#v: should match %v.", v.matcher, v.url) - } else { - t.Errorf("%#v: should not match %v.", v.matcher, v.url) - } - } - if result { - if len(vars) != len(v.vars) { - t.Errorf("%#v: vars length should be %v, got %v.", v.matcher, len(v.vars), len(vars)) - } - for name, value := range vars { - if v.vars[name] != value { - t.Errorf("%#v: expected value %v for key %v, got %v.", v.matcher, v.vars[name], name, value) - } - } - } else { - if len(vars) != 0 { - t.Errorf("%#v: vars length should be 0, got %v.", v.matcher, len(vars)) - } - } - } -} - -func TestSchemeMatcher(t *testing.T) { - for _, v := range schemeMatcherTests { - request, _ := http.NewRequest("GET", v.url, nil) - var routeMatch RouteMatch - result := v.matcher.Match(request, &routeMatch) - if result != v.result { - if v.result { - t.Errorf("%#v: should match %v.", v.matcher, v.url) - } else { - t.Errorf("%#v: should not match %v.", v.matcher, v.url) - } - } - } -} - -func TestUrlBuilding(t *testing.T) { - - for _, v := range urlBuildingTests { - u, _ := v.route.URL(v.vars...) - url := u.String() - if url != v.url { - t.Errorf("expected %v, got %v", v.url, url) - /* - reversePath := "" - reverseHost := "" - if v.route.pathTemplate != nil { - reversePath = v.route.pathTemplate.Reverse - } - if v.route.hostTemplate != nil { - reverseHost = v.route.hostTemplate.Reverse - } - - t.Errorf("%#v:\nexpected: %q\ngot: %q\nreverse path: %q\nreverse host: %q", v.route, v.url, url, reversePath, reverseHost) - */ - } - } - - ArticleHandler := func(w http.ResponseWriter, r *http.Request) { - } - - router := NewRouter() - router.HandleFunc("/articles/{category}/{id:[0-9]+}", ArticleHandler).Name("article") - - url, _ := router.Get("article").URL("category", "technology", "id", "42") - expected := "/articles/technology/42" - if url.String() != expected { - t.Errorf("Expected %v, got %v", expected, url.String()) - } -} - -func TestMatchedRouteName(t *testing.T) { - routeName := "stock" - router := NewRouter() - route := router.NewRoute().Path("/products/").Name(routeName) - - url := "http://www.domain.com/products/" - request, _ := http.NewRequest("GET", url, nil) - var rv RouteMatch - ok := router.Match(request, &rv) - - if !ok || rv.Route != route { - t.Errorf("Expected same route, got %+v.", rv.Route) - } - - retName := rv.Route.GetName() - if retName != routeName { - t.Errorf("Expected %q, got %q.", routeName, retName) - } -} - -func TestSubRouting(t *testing.T) { - // Example from docs. - router := NewRouter() - subrouter := router.NewRoute().Host("www.domain.com").Subrouter() - route := subrouter.NewRoute().Path("/products/").Name("products") - - url := "http://www.domain.com/products/" - request, _ := http.NewRequest("GET", url, nil) - var rv RouteMatch - ok := router.Match(request, &rv) - - if !ok || rv.Route != route { - t.Errorf("Expected same route, got %+v.", rv.Route) - } - - u, _ := router.Get("products").URL() - builtUrl := u.String() - // Yay, subroute aware of the domain when building! - if builtUrl != url { - t.Errorf("Expected %q, got %q.", url, builtUrl) - } -} - -func TestVariableNames(t *testing.T) { - route := new(Route).Host("{arg1}.domain.com").Path("/{arg1}/{arg2:[0-9]+}") - if route.err == nil { - t.Errorf("Expected error for duplicated variable names") - } -} - -func TestRedirectSlash(t *testing.T) { - var route *Route - var routeMatch RouteMatch - r := NewRouter() - - r.StrictSlash(false) - route = r.NewRoute() - if route.strictSlash != false { - t.Errorf("Expected false redirectSlash.") - } - - r.StrictSlash(true) - route = r.NewRoute() - if route.strictSlash != true { - t.Errorf("Expected true redirectSlash.") - } - - route = new(Route) - route.strictSlash = true - route.Path("/{arg1}/{arg2:[0-9]+}/") - request, _ := http.NewRequest("GET", "http://localhost/foo/123", nil) - routeMatch = RouteMatch{} - _ = route.Match(request, &routeMatch) - vars := routeMatch.Vars - if vars["arg1"] != "foo" { - t.Errorf("Expected foo.") - } - if vars["arg2"] != "123" { - t.Errorf("Expected 123.") - } - rsp := NewRecorder() - routeMatch.Handler.ServeHTTP(rsp, request) - if rsp.HeaderMap.Get("Location") != "http://localhost/foo/123/" { - t.Errorf("Expected redirect header.") - } - - route = new(Route) - route.strictSlash = true - route.Path("/{arg1}/{arg2:[0-9]+}") - request, _ = http.NewRequest("GET", "http://localhost/foo/123/", nil) - routeMatch = RouteMatch{} - _ = route.Match(request, &routeMatch) - vars = routeMatch.Vars - if vars["arg1"] != "foo" { - t.Errorf("Expected foo.") - } - if vars["arg2"] != "123" { - t.Errorf("Expected 123.") - } - rsp = NewRecorder() - routeMatch.Handler.ServeHTTP(rsp, request) - if rsp.HeaderMap.Get("Location") != "http://localhost/foo/123" { - t.Errorf("Expected redirect header.") - } -} - -// Test for the new regexp library, still not available in stable Go. -func TestNewRegexp(t *testing.T) { - var p *routeRegexp - var matches []string - - tests := map[string]map[string][]string{ - "/{foo:a{2}}": { - "/a": nil, - "/aa": {"aa"}, - "/aaa": nil, - "/aaaa": nil, - }, - "/{foo:a{2,}}": { - "/a": nil, - "/aa": {"aa"}, - "/aaa": {"aaa"}, - "/aaaa": {"aaaa"}, - }, - "/{foo:a{2,3}}": { - "/a": nil, - "/aa": {"aa"}, - "/aaa": {"aaa"}, - "/aaaa": nil, - }, - "/{foo:[a-z]{3}}/{bar:[a-z]{2}}": { - "/a": nil, - "/ab": nil, - "/abc": nil, - "/abcd": nil, - "/abc/ab": {"abc", "ab"}, - "/abc/abc": nil, - "/abcd/ab": nil, - }, - `/{foo:\w{3,}}/{bar:\d{2,}}`: { - "/a": nil, - "/ab": nil, - "/abc": nil, - "/abc/1": nil, - "/abc/12": {"abc", "12"}, - "/abcd/12": {"abcd", "12"}, - "/abcd/123": {"abcd", "123"}, - }, - } - - for pattern, paths := range tests { - p, _ = newRouteRegexp(pattern, false, false, false, false) - for path, result := range paths { - matches = p.regexp.FindStringSubmatch(path) - if result == nil { - if matches != nil { - t.Errorf("%v should not match %v.", pattern, path) - } - } else { - if len(matches) != len(result)+1 { - t.Errorf("Expected %v matches, got %v.", len(result)+1, len(matches)) - } else { - for k, v := range result { - if matches[k+1] != v { - t.Errorf("Expected %v, got %v.", v, matches[k+1]) - } - } - } - } - } - } -} diff --git a/vendor/github.com/gorilla/mux/route.go b/vendor/github.com/gorilla/mux/route.go index 75481b579..890130460 100644 --- a/vendor/github.com/gorilla/mux/route.go +++ b/vendor/github.com/gorilla/mux/route.go @@ -255,7 +255,7 @@ func (r *Route) HeadersRegexp(pairs ...string) *Route { // For example: // // r := mux.NewRouter() -// r.Host("www.domain.com") +// r.Host("www.example.com") // r.Host("{subdomain}.domain.com") // r.Host("{subdomain:[a-z]+}.domain.com") // @@ -414,7 +414,7 @@ func (r *Route) BuildVarsFunc(f BuildVarsFunc) *Route { // It will test the inner routes only if the parent route matched. For example: // // r := mux.NewRouter() -// s := r.Host("www.domain.com").Subrouter() +// s := r.Host("www.example.com").Subrouter() // s.HandleFunc("/products/", ProductsHandler) // s.HandleFunc("/products/{key}", ProductHandler) // s.HandleFunc("/articles/{category}/{id:[0-9]+}"), ArticleHandler) diff --git a/vendor/github.com/gorilla/rpc/v2/LICENSE b/vendor/github.com/gorilla/rpc/v2/LICENSE deleted file mode 100644 index 0e5fb8728..000000000 --- a/vendor/github.com/gorilla/rpc/v2/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2012 Rodrigo Moraes. 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/gorilla/rpc/v2/README.md b/vendor/github.com/gorilla/rpc/v2/README.md deleted file mode 100644 index 8f9af9a8d..000000000 --- a/vendor/github.com/gorilla/rpc/v2/README.md +++ /dev/null @@ -1,6 +0,0 @@ -rpc -=== - -gorilla/rpc is a foundation for RPC over HTTP services, providing access to the exported methods of an object through HTTP requests. - -Read the full documentation here: http://www.gorillatoolkit.org/pkg/rpc diff --git a/vendor/github.com/gorilla/rpc/v2/compression_selector.go b/vendor/github.com/gorilla/rpc/v2/compression_selector.go deleted file mode 100644 index bbf3fd1ef..000000000 --- a/vendor/github.com/gorilla/rpc/v2/compression_selector.go +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// 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 rpc - -import ( - "compress/flate" - "compress/gzip" - "io" - "net/http" - "strings" - "unicode" -) - -// gzipWriter writes and closes the gzip writer. -type gzipWriter struct { - w *gzip.Writer -} - -func (gw *gzipWriter) Write(p []byte) (n int, err error) { - defer gw.w.Close() - return gw.w.Write(p) -} - -// gzipEncoder implements the gzip compressed http encoder. -type gzipEncoder struct { -} - -func (enc *gzipEncoder) Encode(w http.ResponseWriter) io.Writer { - w.Header().Set("Content-Encoding", "gzip") - return &gzipWriter{gzip.NewWriter(w)} -} - -// flateWriter writes and closes the flate writer. -type flateWriter struct { - w *flate.Writer -} - -func (fw *flateWriter) Write(p []byte) (n int, err error) { - defer fw.w.Close() - return fw.w.Write(p) -} - -// flateEncoder implements the flate compressed http encoder. -type flateEncoder struct { -} - -func (enc *flateEncoder) Encode(w http.ResponseWriter) io.Writer { - fw, err := flate.NewWriter(w, flate.DefaultCompression) - if err != nil { - return w - } - w.Header().Set("Content-Encoding", "deflate") - return &flateWriter{fw} -} - -// CompressionSelector generates the compressed http encoder. -type CompressionSelector struct { -} - -// acceptedEnc returns the first compression type in "Accept-Encoding" header -// field of the request. -func acceptedEnc(req *http.Request) string { - encHeader := req.Header.Get("Accept-Encoding") - if encHeader == "" { - return "" - } - encTypes := strings.FieldsFunc(encHeader, func(r rune) bool { - return unicode.IsSpace(r) || r == ',' - }) - for _, enc := range encTypes { - if enc == "gzip" || enc == "deflate" { - return enc - } - } - return "" -} - -// Select method selects the correct compression encoder based on http HEADER. -func (_ *CompressionSelector) Select(r *http.Request) Encoder { - switch acceptedEnc(r) { - case "gzip": - return &gzipEncoder{} - case "flate": - return &flateEncoder{} - } - return DefaultEncoder -} diff --git a/vendor/github.com/gorilla/rpc/v2/doc.go b/vendor/github.com/gorilla/rpc/v2/doc.go deleted file mode 100644 index 301d5dc06..000000000 --- a/vendor/github.com/gorilla/rpc/v2/doc.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// 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 gorilla/rpc is a foundation for RPC over HTTP services, providing -access to the exported methods of an object through HTTP requests. - -This package derives from the standard net/rpc package but uses a single HTTP -request per call instead of persistent connections. Other differences -compared to net/rpc: - - - Multiple codecs can be registered in the same server. - - A codec is chosen based on the "Content-Type" header from the request. - - Service methods also receive http.Request as parameter. - - This package can be used on Google App Engine. - -Let's setup a server and register a codec and service: - - import ( - "http" - "github.com/gorilla/rpc/v2" - "github.com/gorilla/rpc/v2/json" - ) - - func init() { - s := rpc.NewServer() - s.RegisterCodec(json.NewCodec(), "application/json") - s.RegisterService(new(HelloService), "") - http.Handle("/rpc", s) - } - -This server handles requests to the "/rpc" path using a JSON codec. -A codec is tied to a content type. In the example above, the JSON codec is -registered to serve requests with "application/json" as the value for the -"Content-Type" header. If the header includes a charset definition, it is -ignored; only the media-type part is taken into account. - -A service can be registered using a name. If the name is empty, like in the -example above, it will be inferred from the service type. - -That's all about the server setup. Now let's define a simple service: - - type HelloArgs struct { - Who string - } - - type HelloReply struct { - Message string - } - - type HelloService struct {} - - func (h *HelloService) Say(r *http.Request, args *HelloArgs, reply *HelloReply) error { - reply.Message = "Hello, " + args.Who + "!" - return nil - } - -The example above defines a service with a method "HelloService.Say" and -the arguments and reply related to that method. - -The service must be exported (begin with an upper case letter) or local -(defined in the package registering the service). - -When a service is registered, the server inspects the service methods -and make available the ones that follow these rules: - - - The method name is exported. - - The method has three arguments: *http.Request, *args, *reply. - - All three arguments are pointers. - - The second and third arguments are exported or local. - - The method has return type error. - -All other methods are ignored. - -Gorilla has packages with common RPC codecs. Check out their documentation: - - JSON: http://gorilla-web.appspot.com/pkg/rpc/json -*/ -package rpc diff --git a/vendor/github.com/gorilla/rpc/v2/encoder_selector.go b/vendor/github.com/gorilla/rpc/v2/encoder_selector.go deleted file mode 100644 index 333361f3a..000000000 --- a/vendor/github.com/gorilla/rpc/v2/encoder_selector.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// 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 rpc - -import ( - "io" - "net/http" -) - -// Encoder interface contains the encoder for http response. -// Eg. gzip, flate compressions. -type Encoder interface { - Encode(w http.ResponseWriter) io.Writer -} - -type encoder struct { -} - -func (_ *encoder) Encode(w http.ResponseWriter) io.Writer { - return w -} - -var DefaultEncoder = &encoder{} - -// EncoderSelector interface provides a way to select encoder using the http -// request. Typically people can use this to check HEADER of the request and -// figure out client capabilities. -// Eg. "Accept-Encoding" tells about supported compressions. -type EncoderSelector interface { - Select(r *http.Request) Encoder -} - -type encoderSelector struct { -} - -func (_ *encoderSelector) Select(_ *http.Request) Encoder { - return DefaultEncoder -} - -var DefaultEncoderSelector = &encoderSelector{} diff --git a/vendor/github.com/gorilla/rpc/v2/json/client.go b/vendor/github.com/gorilla/rpc/v2/json/client.go deleted file mode 100644 index be05788e2..000000000 --- a/vendor/github.com/gorilla/rpc/v2/json/client.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Copyright 2012-2013 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 json - -import ( - "encoding/json" - "fmt" - "io" - "math/rand" -) - -// ---------------------------------------------------------------------------- -// Request and Response -// ---------------------------------------------------------------------------- - -// clientRequest represents a JSON-RPC request sent by a client. -type clientRequest struct { - // A String containing the name of the method to be invoked. - Method string `json:"method"` - // Object to pass as request parameter to the method. - Params [1]interface{} `json:"params"` - // The request id. This can be of any type. It is used to match the - // response with the request that it is replying to. - Id uint64 `json:"id"` -} - -// clientResponse represents a JSON-RPC response returned to a client. -type clientResponse struct { - Result *json.RawMessage `json:"result"` - Error interface{} `json:"error"` - Id uint64 `json:"id"` -} - -// EncodeClientRequest encodes parameters for a JSON-RPC client request. -func EncodeClientRequest(method string, args interface{}) ([]byte, error) { - c := &clientRequest{ - Method: method, - Params: [1]interface{}{args}, - Id: uint64(rand.Int63()), - } - return json.Marshal(c) -} - -// DecodeClientResponse decodes the response body of a client request into -// the interface reply. -func DecodeClientResponse(r io.Reader, reply interface{}) error { - var c clientResponse - if err := json.NewDecoder(r).Decode(&c); err != nil { - return err - } - if c.Error != nil { - return &Error{Data: c.Error} - } - if c.Result == nil { - return fmt.Errorf("Unexpected null result") - } - return json.Unmarshal(*c.Result, reply) -} diff --git a/vendor/github.com/gorilla/rpc/v2/json/doc.go b/vendor/github.com/gorilla/rpc/v2/json/doc.go deleted file mode 100644 index 3f92b9cb3..000000000 --- a/vendor/github.com/gorilla/rpc/v2/json/doc.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// 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 gorilla/rpc/json provides a codec for JSON-RPC over HTTP services. - -To register the codec in a RPC server: - - import ( - "http" - "github.com/gorilla/rpc/v2" - "github.com/gorilla/rpc/v2/json" - ) - - func init() { - s := rpc.NewServer() - s.RegisterCodec(json.NewCodec(), "application/json") - // [...] - http.Handle("/rpc", s) - } - -A codec is tied to a content type. In the example above, the server will use -the JSON codec for requests with "application/json" as the value for the -"Content-Type" header. - -This package follows the JSON-RPC 1.0 specification: - - http://json-rpc.org/wiki/specification - -Request format is: - - method: - The name of the method to be invoked, as a string in dotted notation - as in "Service.Method". - params: - An array with a single object to pass as argument to the method. - id: - The request id, a uint. It is used to match the response with the - request that it is replying to. - -Response format is: - - result: - The Object that was returned by the invoked method, - or null in case there was an error invoking the method. - error: - An Error object if there was an error invoking the method, - or null if there was no error. - id: - The same id as the request it is responding to. - -Check the gorilla/rpc documentation for more details: - - http://gorilla-web.appspot.com/pkg/rpc -*/ -package json diff --git a/vendor/github.com/gorilla/rpc/v2/json/json_test.go b/vendor/github.com/gorilla/rpc/v2/json/json_test.go deleted file mode 100644 index 50017db74..000000000 --- a/vendor/github.com/gorilla/rpc/v2/json/json_test.go +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// 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 json - -import ( - "bytes" - "encoding/json" - "errors" - "net/http" - "net/http/httptest" - "reflect" - "testing" - - "github.com/gorilla/rpc/v2" -) - -var ( - ErrResponseError = errors.New("response error") - ErrResponseJsonError = &Error{Data: map[string]interface{}{ - "stackstrace": map[string]interface{}{"0": "foo()"}, - "error": "a message", - }} -) - -type Service1Request struct { - A int - B int -} - -type Service1Response struct { - Result int -} - -type Service1 struct { -} - -func (t *Service1) Multiply(r *http.Request, req *Service1Request, res *Service1Response) error { - res.Result = req.A * req.B - return nil -} - -func (t *Service1) ResponseError(r *http.Request, req *Service1Request, res *Service1Response) error { - return ErrResponseError -} - -func (t *Service1) ResponseJsonError(r *http.Request, req *Service1Request, res *Service1Response) error { - return ErrResponseJsonError -} - -func execute(t *testing.T, s *rpc.Server, method string, req, res interface{}) error { - if !s.HasMethod(method) { - t.Fatal("Expected to be registered:", method) - } - - buf, _ := EncodeClientRequest(method, req) - body := bytes.NewBuffer(buf) - r, _ := http.NewRequest("POST", "http://localhost:8080/", body) - r.Header.Set("Content-Type", "application/json") - - w := httptest.NewRecorder() - s.ServeHTTP(w, r) - - return DecodeClientResponse(w.Body, res) -} - -func executeRaw(t *testing.T, s *rpc.Server, req json.RawMessage) (int, *bytes.Buffer) { - r, _ := http.NewRequest("POST", "http://localhost:8080/", bytes.NewBuffer(req)) - r.Header.Set("Content-Type", "application/json") - - w := httptest.NewRecorder() - s.ServeHTTP(w, r) - - return w.Code, w.Body -} - -func field(name string, blob json.RawMessage) (v interface{}, ok bool) { - var obj map[string]interface{} - if err := json.Unmarshal(blob, &obj); err != nil { - return nil, false - } - v, ok = obj[name] - return -} - -func TestService(t *testing.T) { - s := rpc.NewServer() - s.RegisterCodec(NewCodec(), "application/json") - s.RegisterService(new(Service1), "") - - var res Service1Response - if err := execute(t, s, "Service1.Multiply", &Service1Request{4, 2}, &res); err != nil { - t.Error("Expected err to be nil, but got", err) - } - if res.Result != 8 { - t.Error("Expected res.Result to be 8, but got", res.Result) - } - if err := execute(t, s, "Service1.ResponseError", &Service1Request{4, 2}, &res); err == nil { - t.Errorf("Expected to get %q, but got nil", ErrResponseError) - } else if err.Error() != ErrResponseError.Error() { - t.Errorf("Expected to get %q, but got %q", ErrResponseError, err) - } - if code, res := executeRaw(t, s, json.RawMessage(`{"method":"Service1.Multiply","params":null,"id":5}`)); code != 400 { - t.Error("Expected response code to be 400, but got", code) - } else if v, ok := field("result", res.Bytes()); !ok || v != nil { - t.Errorf("Expected ok to be true and v to be nil, but got %v and %v", ok, v) - } - if err := execute(t, s, "Service1.ResponseJsonError", &Service1Request{4, 2}, &res); err == nil { - t.Errorf("Expected to get %q, but got nil", ErrResponseError) - } else if jsonErr, ok := err.(*Error); !ok { - t.Error("Expected err to be of a *json.Error type") - } else if !reflect.DeepEqual(jsonErr.Data, ErrResponseJsonError.Data) { - t.Errorf("Expected jsonErr to be %q, but got %q", ErrResponseJsonError, jsonErr) - } -} - -func TestClientNullResult(t *testing.T) { - data := `{"jsonrpc": "2.0", "id": 8674665223082153551, "result": null}` - reader := bytes.NewReader([]byte(data)) - - var reply interface{} - - err := DecodeClientResponse(reader, &reply) - if err == nil { - t.Fatal(err) - } - if err.Error() != "Unexpected null result" { - t.Fatalf("Unexpected error: %s", err) - } -} diff --git a/vendor/github.com/gorilla/rpc/v2/json/server.go b/vendor/github.com/gorilla/rpc/v2/json/server.go deleted file mode 100644 index 8fafbe3ad..000000000 --- a/vendor/github.com/gorilla/rpc/v2/json/server.go +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// 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 json - -import ( - "encoding/json" - "errors" - "fmt" - "net/http" - - "github.com/gorilla/rpc/v2" -) - -var null = json.RawMessage([]byte("null")) - -// An Error is a wrapper for a JSON interface value. It can be used by either -// a service's handler func to write more complex JSON data to an error field -// of a server's response, or by a client to read it. -type Error struct { - Data interface{} -} - -func (e *Error) Error() string { - return fmt.Sprintf("%v", e.Data) -} - -// ---------------------------------------------------------------------------- -// Request and Response -// ---------------------------------------------------------------------------- - -// serverRequest represents a JSON-RPC request received by the server. -type serverRequest struct { - // A String containing the name of the method to be invoked. - Method string `json:"method"` - // An Array of objects to pass as arguments to the method. - Params *json.RawMessage `json:"params"` - // The request id. This can be of any type. It is used to match the - // response with the request that it is replying to. - Id *json.RawMessage `json:"id"` -} - -// serverResponse represents a JSON-RPC response returned by the server. -type serverResponse struct { - // The Object that was returned by the invoked method. This must be null - // in case there was an error invoking the method. - Result interface{} `json:"result"` - // An Error object if there was an error invoking the method. It must be - // null if there was no error. - Error interface{} `json:"error"` - // This must be the same id as the request it is responding to. - Id *json.RawMessage `json:"id"` -} - -// ---------------------------------------------------------------------------- -// Codec -// ---------------------------------------------------------------------------- - -// NewCodec returns a new JSON Codec. -func NewCodec() *Codec { - return &Codec{} -} - -// Codec creates a CodecRequest to process each request. -type Codec struct { -} - -// NewRequest returns a CodecRequest. -func (c *Codec) NewRequest(r *http.Request) rpc.CodecRequest { - return newCodecRequest(r) -} - -// ---------------------------------------------------------------------------- -// CodecRequest -// ---------------------------------------------------------------------------- - -// newCodecRequest returns a new CodecRequest. -func newCodecRequest(r *http.Request) rpc.CodecRequest { - // Decode the request body and check if RPC method is valid. - req := new(serverRequest) - err := json.NewDecoder(r.Body).Decode(req) - r.Body.Close() - return &CodecRequest{request: req, err: err} -} - -// CodecRequest decodes and encodes a single request. -type CodecRequest struct { - request *serverRequest - err error -} - -// Method returns the RPC method for the current request. -// -// The method uses a dotted notation as in "Service.Method". -func (c *CodecRequest) Method() (string, error) { - if c.err == nil { - return c.request.Method, nil - } - return "", c.err -} - -// ReadRequest fills the request object for the RPC method. -func (c *CodecRequest) ReadRequest(args interface{}) error { - if c.err == nil { - if c.request.Params != nil { - // JSON params is array value. RPC params is struct. - // Unmarshal into array containing the request struct. - params := [1]interface{}{args} - c.err = json.Unmarshal(*c.request.Params, ¶ms) - } else { - c.err = errors.New("rpc: method request ill-formed: missing params field") - } - } - return c.err -} - -// WriteResponse encodes the response and writes it to the ResponseWriter. -func (c *CodecRequest) WriteResponse(w http.ResponseWriter, reply interface{}) { - if c.request.Id != nil { - // Id is null for notifications and they don't have a response. - res := &serverResponse{ - Result: reply, - Error: &null, - Id: c.request.Id, - } - c.writeServerResponse(w, 200, res) - } -} - -func (c *CodecRequest) WriteError(w http.ResponseWriter, _ int, err error) { - res := &serverResponse{ - Result: &null, - Id: c.request.Id, - } - if jsonErr, ok := err.(*Error); ok { - res.Error = jsonErr.Data - } else { - res.Error = err.Error() - } - c.writeServerResponse(w, 400, res) -} - -func (c *CodecRequest) writeServerResponse(w http.ResponseWriter, status int, res *serverResponse) { - b, err := json.Marshal(res) - if err == nil { - w.WriteHeader(status) - w.Header().Set("Content-Type", "application/json; charset=utf-8") - w.Write(b) - } else { - // Not sure in which case will this happen. But seems harmless. - rpc.WriteError(w, 400, err.Error()) - } -} diff --git a/vendor/github.com/gorilla/rpc/v2/map.go b/vendor/github.com/gorilla/rpc/v2/map.go deleted file mode 100644 index dda42161c..000000000 --- a/vendor/github.com/gorilla/rpc/v2/map.go +++ /dev/null @@ -1,164 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// 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 rpc - -import ( - "fmt" - "net/http" - "reflect" - "strings" - "sync" - "unicode" - "unicode/utf8" -) - -var ( - // Precompute the reflect.Type of error and http.Request - typeOfError = reflect.TypeOf((*error)(nil)).Elem() - typeOfRequest = reflect.TypeOf((*http.Request)(nil)).Elem() -) - -// ---------------------------------------------------------------------------- -// service -// ---------------------------------------------------------------------------- - -type service struct { - name string // name of service - rcvr reflect.Value // receiver of methods for the service - rcvrType reflect.Type // type of the receiver - methods map[string]*serviceMethod // registered methods -} - -type serviceMethod struct { - method reflect.Method // receiver method - argsType reflect.Type // type of the request argument - replyType reflect.Type // type of the response argument -} - -// ---------------------------------------------------------------------------- -// serviceMap -// ---------------------------------------------------------------------------- - -// serviceMap is a registry for services. -type serviceMap struct { - mutex sync.Mutex - services map[string]*service -} - -// register adds a new service using reflection to extract its methods. -func (m *serviceMap) register(rcvr interface{}, name string) error { - // Setup service. - s := &service{ - name: name, - rcvr: reflect.ValueOf(rcvr), - rcvrType: reflect.TypeOf(rcvr), - methods: make(map[string]*serviceMethod), - } - if name == "" { - s.name = reflect.Indirect(s.rcvr).Type().Name() - if !isExported(s.name) { - return fmt.Errorf("rpc: type %q is not exported", s.name) - } - } - if s.name == "" { - return fmt.Errorf("rpc: no service name for type %q", - s.rcvrType.String()) - } - // Setup methods. - for i := 0; i < s.rcvrType.NumMethod(); i++ { - method := s.rcvrType.Method(i) - mtype := method.Type - // Method must be exported. - if method.PkgPath != "" { - continue - } - // Method needs four ins: receiver, *http.Request, *args, *reply. - if mtype.NumIn() != 4 { - continue - } - // First argument must be a pointer and must be http.Request. - reqType := mtype.In(1) - if reqType.Kind() != reflect.Ptr || reqType.Elem() != typeOfRequest { - continue - } - // Second argument must be a pointer and must be exported. - args := mtype.In(2) - if args.Kind() != reflect.Ptr || !isExportedOrBuiltin(args) { - continue - } - // Third argument must be a pointer and must be exported. - reply := mtype.In(3) - if reply.Kind() != reflect.Ptr || !isExportedOrBuiltin(reply) { - continue - } - // Method needs one out: error. - if mtype.NumOut() != 1 { - continue - } - if returnType := mtype.Out(0); returnType != typeOfError { - continue - } - s.methods[method.Name] = &serviceMethod{ - method: method, - argsType: args.Elem(), - replyType: reply.Elem(), - } - } - if len(s.methods) == 0 { - return fmt.Errorf("rpc: %q has no exported methods of suitable type", - s.name) - } - // Add to the map. - m.mutex.Lock() - defer m.mutex.Unlock() - if m.services == nil { - m.services = make(map[string]*service) - } else if _, ok := m.services[s.name]; ok { - return fmt.Errorf("rpc: service already defined: %q", s.name) - } - m.services[s.name] = s - return nil -} - -// get returns a registered service given a method name. -// -// The method name uses a dotted notation as in "Service.Method". -func (m *serviceMap) get(method string) (*service, *serviceMethod, error) { - parts := strings.Split(method, ".") - if len(parts) != 2 { - err := fmt.Errorf("rpc: service/method request ill-formed: %q", method) - return nil, nil, err - } - m.mutex.Lock() - service := m.services[parts[0]] - m.mutex.Unlock() - if service == nil { - err := fmt.Errorf("rpc: can't find service %q", method) - return nil, nil, err - } - serviceMethod := service.methods[parts[1]] - if serviceMethod == nil { - err := fmt.Errorf("rpc: can't find method %q", method) - return nil, nil, err - } - return service, serviceMethod, nil -} - -// isExported returns true of a string is an exported (upper case) name. -func isExported(name string) bool { - rune, _ := utf8.DecodeRuneInString(name) - return unicode.IsUpper(rune) -} - -// isExportedOrBuiltin returns true if a type is exported or a builtin. -func isExportedOrBuiltin(t reflect.Type) bool { - for t.Kind() == reflect.Ptr { - t = t.Elem() - } - // PkgPath will be non-empty even for an exported type, - // so we need to check the type name as well. - return isExported(t.Name()) || t.PkgPath() == "" -} diff --git a/vendor/github.com/gorilla/rpc/v2/server.go b/vendor/github.com/gorilla/rpc/v2/server.go deleted file mode 100644 index b552cb3c7..000000000 --- a/vendor/github.com/gorilla/rpc/v2/server.go +++ /dev/null @@ -1,158 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// 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 rpc - -import ( - "fmt" - "net/http" - "reflect" - "strings" -) - -// ---------------------------------------------------------------------------- -// Codec -// ---------------------------------------------------------------------------- - -// Codec creates a CodecRequest to process each request. -type Codec interface { - NewRequest(*http.Request) CodecRequest -} - -// CodecRequest decodes a request and encodes a response using a specific -// serialization scheme. -type CodecRequest interface { - // Reads the request and returns the RPC method name. - Method() (string, error) - // Reads the request filling the RPC method args. - ReadRequest(interface{}) error - // Writes the response using the RPC method reply. - WriteResponse(http.ResponseWriter, interface{}) - // Writes an error produced by the server. - WriteError(w http.ResponseWriter, status int, err error) -} - -// ---------------------------------------------------------------------------- -// Server -// ---------------------------------------------------------------------------- - -// NewServer returns a new RPC server. -func NewServer() *Server { - return &Server{ - codecs: make(map[string]Codec), - services: new(serviceMap), - } -} - -// Server serves registered RPC services using registered codecs. -type Server struct { - codecs map[string]Codec - services *serviceMap -} - -// RegisterCodec adds a new codec to the server. -// -// Codecs are defined to process a given serialization scheme, e.g., JSON or -// XML. A codec is chosen based on the "Content-Type" header from the request, -// excluding the charset definition. -func (s *Server) RegisterCodec(codec Codec, contentType string) { - s.codecs[strings.ToLower(contentType)] = codec -} - -// RegisterService adds a new service to the server. -// -// The name parameter is optional: if empty it will be inferred from -// the receiver type name. -// -// Methods from the receiver will be extracted if these rules are satisfied: -// -// - The receiver is exported (begins with an upper case letter) or local -// (defined in the package registering the service). -// - The method name is exported. -// - The method has three arguments: *http.Request, *args, *reply. -// - All three arguments are pointers. -// - The second and third arguments are exported or local. -// - The method has return type error. -// -// All other methods are ignored. -func (s *Server) RegisterService(receiver interface{}, name string) error { - return s.services.register(receiver, name) -} - -// HasMethod returns true if the given method is registered. -// -// The method uses a dotted notation as in "Service.Method". -func (s *Server) HasMethod(method string) bool { - if _, _, err := s.services.get(method); err == nil { - return true - } - return false -} - -// ServeHTTP -func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { - if r.Method != "POST" { - WriteError(w, 405, "rpc: POST method required, received "+r.Method) - return - } - contentType := r.Header.Get("Content-Type") - idx := strings.Index(contentType, ";") - if idx != -1 { - contentType = contentType[:idx] - } - codec := s.codecs[strings.ToLower(contentType)] - if codec == nil { - WriteError(w, 415, "rpc: unrecognized Content-Type: "+contentType) - return - } - // Create a new codec request. - codecReq := codec.NewRequest(r) - // Get service method to be called. - method, errMethod := codecReq.Method() - if errMethod != nil { - codecReq.WriteError(w, 400, errMethod) - return - } - serviceSpec, methodSpec, errGet := s.services.get(method) - if errGet != nil { - codecReq.WriteError(w, 400, errGet) - return - } - // Decode the args. - args := reflect.New(methodSpec.argsType) - if errRead := codecReq.ReadRequest(args.Interface()); errRead != nil { - codecReq.WriteError(w, 400, errRead) - return - } - // Call the service method. - reply := reflect.New(methodSpec.replyType) - errValue := methodSpec.method.Func.Call([]reflect.Value{ - serviceSpec.rcvr, - reflect.ValueOf(r), - args, - reply, - }) - // Cast the result to error if needed. - var errResult error - errInter := errValue[0].Interface() - if errInter != nil { - errResult = errInter.(error) - } - // Prevents Internet Explorer from MIME-sniffing a response away - // from the declared content-type - w.Header().Set("x-content-type-options", "nosniff") - // Encode the response. - if errResult == nil { - codecReq.WriteResponse(w, reply.Interface()) - } else { - codecReq.WriteError(w, 400, errResult) - } -} - -func WriteError(w http.ResponseWriter, status int, msg string) { - w.WriteHeader(status) - w.Header().Set("Content-Type", "text/plain; charset=utf-8") - fmt.Fprint(w, msg) -} diff --git a/vendor/github.com/gorilla/rpc/v2/server_test.go b/vendor/github.com/gorilla/rpc/v2/server_test.go deleted file mode 100644 index d2cddfca2..000000000 --- a/vendor/github.com/gorilla/rpc/v2/server_test.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// 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 rpc - -import ( - "net/http" - "testing" -) - -type Service1Request struct { - A int - B int -} - -type Service1Response struct { - Result int -} - -type Service1 struct { -} - -func (t *Service1) Multiply(r *http.Request, req *Service1Request, res *Service1Response) error { - res.Result = req.A * req.B - return nil -} - -type Service2 struct { -} - -func TestRegisterService(t *testing.T) { - var err error - s := NewServer() - service1 := new(Service1) - service2 := new(Service2) - - // Inferred name. - err = s.RegisterService(service1, "") - if err != nil || !s.HasMethod("Service1.Multiply") { - t.Errorf("Expected to be registered: Service1.Multiply") - } - // Provided name. - err = s.RegisterService(service1, "Foo") - if err != nil || !s.HasMethod("Foo.Multiply") { - t.Errorf("Expected to be registered: Foo.Multiply") - } - // No methods. - err = s.RegisterService(service2, "") - if err == nil { - t.Errorf("Expected error on service2") - } -} diff --git a/vendor/github.com/minio/cli/app.go b/vendor/github.com/minio/cli/app.go index 4e5b90d76..f0df8ef2d 100644 --- a/vendor/github.com/minio/cli/app.go +++ b/vendor/github.com/minio/cli/app.go @@ -1,6 +1,7 @@ package cli import ( + "errors" "fmt" "io" "os" @@ -18,8 +19,10 @@ import ( type App struct { // The name of the program. Defaults to os.Args[0] Name string - // Description of the program. + // Usage of the program. Usage string + // Description of the program. + Description string // Version of the program Version string // List of commands to execute @@ -290,6 +293,9 @@ func (a *App) RunAsSubcommand(ctx *Context) (err error) { if c != nil { return c.Run(context) } + fmt.Fprintf(a.Writer, "Incorrect Usage.\n\n") + ShowSubcommandHelp(context) + return errors.New("Command not found") } // Run default Action diff --git a/vendor/github.com/minio/cli/app_test.go b/vendor/github.com/minio/cli/app_test.go deleted file mode 100644 index 98653c42e..000000000 --- a/vendor/github.com/minio/cli/app_test.go +++ /dev/null @@ -1,587 +0,0 @@ -package cli_test - -import ( - "flag" - "fmt" - "os" - "testing" - - "github.com/minio/cli" -) - -func ExampleApp() { - // set args for examples sake - os.Args = []string{"greet", "--name", "Jeremy"} - - app := cli.NewApp() - app.Name = "greet" - app.Flags = []cli.Flag{ - cli.StringFlag{Name: "name", Value: "bob", Usage: "a name to say"}, - } - app.Action = func(c *cli.Context) { - fmt.Printf("Hello %v\n", c.String("name")) - } - app.Author = "Harrison" - app.Email = "harrison@lolwut.com" - app.Authors = []cli.Author{{Name: "Oliver Allen", Email: "oliver@toyshop.com"}} - app.Run(os.Args) - // Output: - // Hello Jeremy -} - -func ExampleAppSubcommand() { - // set args for examples sake - os.Args = []string{"say", "hi", "english", "--name", "Jeremy"} - app := cli.NewApp() - app.Name = "say" - app.Commands = []cli.Command{ - { - Name: "hello", - Aliases: []string{"hi"}, - Usage: "use it to see a description", - Description: "This is how we describe hello the function", - Subcommands: []cli.Command{ - { - Name: "english", - Aliases: []string{"en"}, - Usage: "sends a greeting in english", - Description: "greets someone in english", - Flags: []cli.Flag{ - cli.StringFlag{ - Name: "name", - Value: "Bob", - Usage: "Name of the person to greet", - }, - }, - Action: func(c *cli.Context) { - fmt.Println("Hello,", c.String("name")) - }, - }, - }, - }, - } - - app.Run(os.Args) - // Output: - // Hello, Jeremy -} - -func ExampleAppHelp() { - // set args for examples sake - os.Args = []string{"greet", "h", "describeit"} - - app := cli.NewApp() - app.Name = "greet" - app.Flags = []cli.Flag{ - cli.StringFlag{Name: "name", Value: "bob", Usage: "a name to say"}, - } - app.Commands = []cli.Command{ - { - Name: "describeit", - Aliases: []string{"d"}, - Usage: "use it to see a description", - Description: "This is how we describe describeit the function", - Action: func(c *cli.Context) { - fmt.Printf("i like to describe things") - }, - }, - } - app.Run(os.Args) - // Output: - // NAME: - // describeit - use it to see a description - // - // USAGE: - // command describeit [arguments...] - // - // DESCRIPTION: - // This is how we describe describeit the function -} - -func TestApp_Run(t *testing.T) { - s := "" - - app := cli.NewApp() - app.Action = func(c *cli.Context) { - s = s + c.Args().First() - } - - err := app.Run([]string{"command", "foo"}) - expect(t, err, nil) - err = app.Run([]string{"command", "bar"}) - expect(t, err, nil) - expect(t, s, "foobar") -} - -var commandAppTests = []struct { - name string - expected bool -}{ - {"foobar", true}, - {"batbaz", true}, - {"b", true}, - {"f", true}, - {"bat", false}, - {"nothing", false}, -} - -func TestApp_Command(t *testing.T) { - app := cli.NewApp() - fooCommand := cli.Command{Name: "foobar", Aliases: []string{"f"}} - batCommand := cli.Command{Name: "batbaz", Aliases: []string{"b"}} - app.Commands = []cli.Command{ - fooCommand, - batCommand, - } - - for _, test := range commandAppTests { - expect(t, app.Command(test.name) != nil, test.expected) - } -} - -func TestApp_CommandWithArgBeforeFlags(t *testing.T) { - var parsedOption, firstArg string - - app := cli.NewApp() - command := cli.Command{ - Name: "cmd", - Flags: []cli.Flag{ - cli.StringFlag{Name: "option", Value: "", Usage: "some option"}, - }, - Action: func(c *cli.Context) { - parsedOption = c.String("option") - firstArg = c.Args().First() - }, - } - app.Commands = []cli.Command{command} - - app.Run([]string{"", "cmd", "my-arg", "--option", "my-option"}) - - expect(t, parsedOption, "my-option") - expect(t, firstArg, "my-arg") -} - -func TestApp_RunAsSubcommandParseFlags(t *testing.T) { - var context *cli.Context - - a := cli.NewApp() - a.Commands = []cli.Command{ - { - Name: "foo", - Action: func(c *cli.Context) { - context = c - }, - Flags: []cli.Flag{ - cli.StringFlag{ - Name: "lang", - Value: "english", - Usage: "language for the greeting", - }, - }, - Before: func(_ *cli.Context) error { return nil }, - }, - } - a.Run([]string{"", "foo", "--lang", "spanish", "abcd"}) - - expect(t, context.Args().Get(0), "abcd") - expect(t, context.String("lang"), "spanish") -} - -func TestApp_CommandWithFlagBeforeTerminator(t *testing.T) { - var parsedOption string - var args []string - - app := cli.NewApp() - command := cli.Command{ - Name: "cmd", - Flags: []cli.Flag{ - cli.StringFlag{Name: "option", Value: "", Usage: "some option"}, - }, - Action: func(c *cli.Context) { - parsedOption = c.String("option") - args = c.Args() - }, - } - app.Commands = []cli.Command{command} - - app.Run([]string{"", "cmd", "my-arg", "--option", "my-option", "--", "--notARealFlag"}) - - expect(t, parsedOption, "my-option") - expect(t, args[0], "my-arg") - expect(t, args[1], "--") - expect(t, args[2], "--notARealFlag") -} - -func TestApp_CommandWithNoFlagBeforeTerminator(t *testing.T) { - var args []string - - app := cli.NewApp() - command := cli.Command{ - Name: "cmd", - Action: func(c *cli.Context) { - args = c.Args() - }, - } - app.Commands = []cli.Command{command} - - app.Run([]string{"", "cmd", "my-arg", "--", "notAFlagAtAll"}) - - expect(t, args[0], "my-arg") - expect(t, args[1], "--") - expect(t, args[2], "notAFlagAtAll") -} - -func TestApp_Float64Flag(t *testing.T) { - var meters float64 - - app := cli.NewApp() - app.Flags = []cli.Flag{ - cli.Float64Flag{Name: "height", Value: 1.5, Usage: "Set the height, in meters"}, - } - app.Action = func(c *cli.Context) { - meters = c.Float64("height") - } - - app.Run([]string{"", "--height", "1.93"}) - expect(t, meters, 1.93) -} - -func TestApp_ParseSliceFlags(t *testing.T) { - var parsedOption, firstArg string - var parsedIntSlice []int - var parsedStringSlice []string - - app := cli.NewApp() - command := cli.Command{ - Name: "cmd", - Flags: []cli.Flag{ - cli.IntSliceFlag{Name: "p", Value: &cli.IntSlice{}, Usage: "set one or more ip addr"}, - cli.StringSliceFlag{Name: "ip", Value: &cli.StringSlice{}, Usage: "set one or more ports to open"}, - }, - Action: func(c *cli.Context) { - parsedIntSlice = c.IntSlice("p") - parsedStringSlice = c.StringSlice("ip") - parsedOption = c.String("option") - firstArg = c.Args().First() - }, - } - app.Commands = []cli.Command{command} - - app.Run([]string{"", "cmd", "my-arg", "-p", "22", "-p", "80", "-ip", "8.8.8.8", "-ip", "8.8.4.4"}) - - IntsEquals := func(a, b []int) bool { - if len(a) != len(b) { - return false - } - for i, v := range a { - if v != b[i] { - return false - } - } - return true - } - - StrsEquals := func(a, b []string) bool { - if len(a) != len(b) { - return false - } - for i, v := range a { - if v != b[i] { - return false - } - } - return true - } - var expectedIntSlice = []int{22, 80} - var expectedStringSlice = []string{"8.8.8.8", "8.8.4.4"} - - if !IntsEquals(parsedIntSlice, expectedIntSlice) { - t.Errorf("%v does not match %v", parsedIntSlice, expectedIntSlice) - } - - if !StrsEquals(parsedStringSlice, expectedStringSlice) { - t.Errorf("%v does not match %v", parsedStringSlice, expectedStringSlice) - } -} - -func TestApp_DefaultStdout(t *testing.T) { - app := cli.NewApp() - - if app.Writer != os.Stdout { - t.Error("Default output writer not set.") - } -} - -type mockWriter struct { - written []byte -} - -func (fw *mockWriter) Write(p []byte) (n int, err error) { - if fw.written == nil { - fw.written = p - } else { - fw.written = append(fw.written, p...) - } - - return len(p), nil -} - -func (fw *mockWriter) GetWritten() (b []byte) { - return fw.written -} - -func TestApp_SetStdout(t *testing.T) { - w := &mockWriter{} - - app := cli.NewApp() - app.Name = "test" - app.Writer = w - - err := app.Run([]string{"help"}) - - if err != nil { - t.Fatalf("Run error: %s", err) - } - - if len(w.written) == 0 { - t.Error("App did not write output to desired writer.") - } -} - -func TestApp_BeforeFunc(t *testing.T) { - beforeRun, subcommandRun := false, false - beforeError := fmt.Errorf("fail") - var err error - - app := cli.NewApp() - - app.Before = func(c *cli.Context) error { - beforeRun = true - s := c.String("opt") - if s == "fail" { - return beforeError - } - - return nil - } - - app.Commands = []cli.Command{ - { - Name: "sub", - Action: func(c *cli.Context) { - subcommandRun = true - }, - }, - } - - app.Flags = []cli.Flag{ - cli.StringFlag{Name: "opt"}, - } - - // run with the Before() func succeeding - err = app.Run([]string{"command", "--opt", "succeed", "sub"}) - - if err != nil { - t.Fatalf("Run error: %s", err) - } - - if beforeRun == false { - t.Errorf("Before() not executed when expected") - } - - if subcommandRun == false { - t.Errorf("Subcommand not executed when expected") - } - - // reset - beforeRun, subcommandRun = false, false - - // run with the Before() func failing - err = app.Run([]string{"command", "--opt", "fail", "sub"}) - - // should be the same error produced by the Before func - if err != beforeError { - t.Errorf("Run error expected, but not received") - } - - if beforeRun == false { - t.Errorf("Before() not executed when expected") - } - - if subcommandRun == true { - t.Errorf("Subcommand executed when NOT expected") - } - -} - -func TestApp_AfterFunc(t *testing.T) { - afterRun, subcommandRun := false, false - afterError := fmt.Errorf("fail") - var err error - - app := cli.NewApp() - - app.After = func(c *cli.Context) error { - afterRun = true - s := c.String("opt") - if s == "fail" { - return afterError - } - - return nil - } - - app.Commands = []cli.Command{ - { - Name: "sub", - Action: func(c *cli.Context) { - subcommandRun = true - }, - }, - } - - app.Flags = []cli.Flag{ - cli.StringFlag{Name: "opt"}, - } - - // run with the After() func succeeding - err = app.Run([]string{"command", "--opt", "succeed", "sub"}) - - if err != nil { - t.Fatalf("Run error: %s", err) - } - - if afterRun == false { - t.Errorf("After() not executed when expected") - } - - if subcommandRun == false { - t.Errorf("Subcommand not executed when expected") - } - - // reset - afterRun, subcommandRun = false, false - - // run with the Before() func failing - err = app.Run([]string{"command", "--opt", "fail", "sub"}) - - // should be the same error produced by the Before func - if err != afterError { - t.Errorf("Run error expected, but not received") - } - - if afterRun == false { - t.Errorf("After() not executed when expected") - } - - if subcommandRun == false { - t.Errorf("Subcommand not executed when expected") - } -} - -func TestAppNoHelpFlag(t *testing.T) { - oldFlag := cli.HelpFlag - defer func() { - cli.HelpFlag = oldFlag - }() - - cli.HelpFlag = cli.BoolFlag{} - - app := cli.NewApp() - err := app.Run([]string{"test", "-h"}) - - if err != flag.ErrHelp { - t.Errorf("expected error about missing help flag, but got: %s (%T)", err, err) - } -} - -func TestAppHelpPrinter(t *testing.T) { - oldPrinter := cli.HelpPrinter - defer func() { - cli.HelpPrinter = oldPrinter - }() - - var wasCalled = false - cli.HelpPrinter = func(template string, data interface{}) { - wasCalled = true - } - - app := cli.NewApp() - app.Run([]string{"-h"}) - - if wasCalled == false { - t.Errorf("Help printer expected to be called, but was not") - } -} - -func TestAppVersionPrinter(t *testing.T) { - oldPrinter := cli.VersionPrinter - defer func() { - cli.VersionPrinter = oldPrinter - }() - - var wasCalled = false - cli.VersionPrinter = func(c *cli.Context) { - wasCalled = true - } - - app := cli.NewApp() - ctx := cli.NewContext(app, nil, nil) - cli.ShowVersion(ctx) - - if wasCalled == false { - t.Errorf("Version printer expected to be called, but was not") - } -} - -func TestAppCommandNotFound(t *testing.T) { - beforeRun, subcommandRun := false, false - app := cli.NewApp() - - app.CommandNotFound = func(c *cli.Context, command string) { - beforeRun = true - } - - app.Commands = []cli.Command{ - { - Name: "bar", - Action: func(c *cli.Context) { - subcommandRun = true - }, - }, - } - - app.Run([]string{"command", "foo"}) - - expect(t, beforeRun, true) - expect(t, subcommandRun, false) -} - -func TestGlobalFlagsInSubcommands(t *testing.T) { - subcommandRun := false - app := cli.NewApp() - - app.Flags = []cli.Flag{ - cli.BoolFlag{Name: "debug, d", Usage: "Enable debugging"}, - } - - app.Commands = []cli.Command{ - { - Name: "foo", - Subcommands: []cli.Command{ - { - Name: "bar", - Action: func(c *cli.Context) { - if c.GlobalBool("debug") { - subcommandRun = true - } - }, - }, - }, - }, - } - - app.Run([]string{"command", "-d", "foo", "bar"}) - - expect(t, subcommandRun, true) -} diff --git a/vendor/github.com/minio/cli/cli_test.go b/vendor/github.com/minio/cli/cli_test.go deleted file mode 100644 index c097b3b8f..000000000 --- a/vendor/github.com/minio/cli/cli_test.go +++ /dev/null @@ -1,100 +0,0 @@ -package cli_test - -import ( - "os" - - "github.com/minio/cli" -) - -func Example() { - app := cli.NewApp() - app.Name = "todo" - app.Usage = "task list on the command line" - app.Commands = []cli.Command{ - { - Name: "add", - Aliases: []string{"a"}, - Usage: "add a task to the list", - Action: func(c *cli.Context) { - println("added task: ", c.Args().First()) - }, - }, - { - Name: "complete", - Aliases: []string{"c"}, - Usage: "complete a task on the list", - Action: func(c *cli.Context) { - println("completed task: ", c.Args().First()) - }, - }, - } - - app.Run(os.Args) -} - -func ExampleSubcommand() { - app := cli.NewApp() - app.Name = "say" - app.Commands = []cli.Command{ - { - Name: "hello", - Aliases: []string{"hi"}, - Usage: "use it to see a description", - Description: "This is how we describe hello the function", - Subcommands: []cli.Command{ - { - Name: "english", - Aliases: []string{"en"}, - Usage: "sends a greeting in english", - Description: "greets someone in english", - Flags: []cli.Flag{ - cli.StringFlag{ - Name: "name", - Value: "Bob", - Usage: "Name of the person to greet", - }, - }, - Action: func(c *cli.Context) { - println("Hello, ", c.String("name")) - }, - }, { - Name: "spanish", - Aliases: []string{"sp"}, - Usage: "sends a greeting in spanish", - Flags: []cli.Flag{ - cli.StringFlag{ - Name: "surname", - Value: "Jones", - Usage: "Surname of the person to greet", - }, - }, - Action: func(c *cli.Context) { - println("Hola, ", c.String("surname")) - }, - }, { - Name: "french", - Aliases: []string{"fr"}, - Usage: "sends a greeting in french", - Flags: []cli.Flag{ - cli.StringFlag{ - Name: "nickname", - Value: "Stevie", - Usage: "Nickname of the person to greet", - }, - }, - Action: func(c *cli.Context) { - println("Bonjour, ", c.String("nickname")) - }, - }, - }, - }, { - Name: "bye", - Usage: "says goodbye", - Action: func(c *cli.Context) { - println("bye") - }, - }, - } - - app.Run(os.Args) -} diff --git a/vendor/github.com/minio/cli/command.go b/vendor/github.com/minio/cli/command.go index a0955af30..9f5e6a573 100644 --- a/vendor/github.com/minio/cli/command.go +++ b/vendor/github.com/minio/cli/command.go @@ -163,6 +163,9 @@ func (c Command) startApp(ctx *Context) error { // set CommandNotFound app.CommandNotFound = ctx.App.CommandNotFound + app.CustomAppHelpTemplate = c.CustomHelpTemplate + app.HideVersion = ctx.App.HideVersion + // set the flags and commands app.Commands = c.Subcommands app.Flags = c.Flags diff --git a/vendor/github.com/minio/cli/command_test.go b/vendor/github.com/minio/cli/command_test.go deleted file mode 100644 index 08adc15d1..000000000 --- a/vendor/github.com/minio/cli/command_test.go +++ /dev/null @@ -1,49 +0,0 @@ -package cli_test - -import ( - "flag" - "testing" - - "github.com/minio/cli" -) - -func TestCommandDoNotIgnoreFlags(t *testing.T) { - app := cli.NewApp() - set := flag.NewFlagSet("test", 0) - test := []string{"blah", "blah", "-break"} - set.Parse(test) - - c := cli.NewContext(app, set, set) - - command := cli.Command{ - Name: "test-cmd", - Aliases: []string{"tc"}, - Usage: "this is for testing", - Description: "testing", - Action: func(_ *cli.Context) {}, - } - err := command.Run(c) - - expect(t, err.Error(), "flag provided but not defined: -break") -} - -func TestCommandIgnoreFlags(t *testing.T) { - app := cli.NewApp() - set := flag.NewFlagSet("test", 0) - test := []string{"blah", "blah"} - set.Parse(test) - - c := cli.NewContext(app, set, set) - - command := cli.Command{ - Name: "test-cmd", - Aliases: []string{"tc"}, - Usage: "this is for testing", - Description: "testing", - Action: func(_ *cli.Context) {}, - SkipFlagParsing: true, - } - err := command.Run(c) - - expect(t, err, nil) -} diff --git a/vendor/github.com/minio/cli/context_test.go b/vendor/github.com/minio/cli/context_test.go deleted file mode 100644 index 207161d74..000000000 --- a/vendor/github.com/minio/cli/context_test.go +++ /dev/null @@ -1,111 +0,0 @@ -package cli_test - -import ( - "flag" - "testing" - "time" - - "github.com/minio/cli" -) - -func TestNewContext(t *testing.T) { - set := flag.NewFlagSet("test", 0) - set.Int("myflag", 12, "doc") - globalSet := flag.NewFlagSet("test", 0) - globalSet.Int("myflag", 42, "doc") - command := cli.Command{Name: "mycommand"} - c := cli.NewContext(nil, set, globalSet) - c.Command = command - expect(t, c.Int("myflag"), 12) - expect(t, c.GlobalInt("myflag"), 42) - expect(t, c.Command.Name, "mycommand") -} - -func TestContext_Int(t *testing.T) { - set := flag.NewFlagSet("test", 0) - set.Int("myflag", 12, "doc") - c := cli.NewContext(nil, set, set) - expect(t, c.Int("myflag"), 12) -} - -func TestContext_Duration(t *testing.T) { - set := flag.NewFlagSet("test", 0) - set.Duration("myflag", time.Duration(12*time.Second), "doc") - c := cli.NewContext(nil, set, set) - expect(t, c.Duration("myflag"), time.Duration(12*time.Second)) -} - -func TestContext_String(t *testing.T) { - set := flag.NewFlagSet("test", 0) - set.String("myflag", "hello world", "doc") - c := cli.NewContext(nil, set, set) - expect(t, c.String("myflag"), "hello world") -} - -func TestContext_Bool(t *testing.T) { - set := flag.NewFlagSet("test", 0) - set.Bool("myflag", false, "doc") - c := cli.NewContext(nil, set, set) - expect(t, c.Bool("myflag"), false) -} - -func TestContext_BoolT(t *testing.T) { - set := flag.NewFlagSet("test", 0) - set.Bool("myflag", true, "doc") - c := cli.NewContext(nil, set, set) - expect(t, c.BoolT("myflag"), true) -} - -func TestContext_Args(t *testing.T) { - set := flag.NewFlagSet("test", 0) - set.Bool("myflag", false, "doc") - c := cli.NewContext(nil, set, set) - set.Parse([]string{"--myflag", "bat", "baz"}) - expect(t, len(c.Args()), 2) - expect(t, c.Bool("myflag"), true) -} - -func TestContext_IsSet(t *testing.T) { - set := flag.NewFlagSet("test", 0) - set.Bool("myflag", false, "doc") - set.String("otherflag", "hello world", "doc") - globalSet := flag.NewFlagSet("test", 0) - globalSet.Bool("myflagGlobal", true, "doc") - c := cli.NewContext(nil, set, globalSet) - set.Parse([]string{"--myflag", "bat", "baz"}) - globalSet.Parse([]string{"--myflagGlobal", "bat", "baz"}) - expect(t, c.IsSet("myflag"), true) - expect(t, c.IsSet("otherflag"), false) - expect(t, c.IsSet("bogusflag"), false) - expect(t, c.IsSet("myflagGlobal"), false) -} - -func TestContext_GlobalIsSet(t *testing.T) { - set := flag.NewFlagSet("test", 0) - set.Bool("myflag", false, "doc") - set.String("otherflag", "hello world", "doc") - globalSet := flag.NewFlagSet("test", 0) - globalSet.Bool("myflagGlobal", true, "doc") - globalSet.Bool("myflagGlobalUnset", true, "doc") - c := cli.NewContext(nil, set, globalSet) - set.Parse([]string{"--myflag", "bat", "baz"}) - globalSet.Parse([]string{"--myflagGlobal", "bat", "baz"}) - expect(t, c.GlobalIsSet("myflag"), false) - expect(t, c.GlobalIsSet("otherflag"), false) - expect(t, c.GlobalIsSet("bogusflag"), false) - expect(t, c.GlobalIsSet("myflagGlobal"), true) - expect(t, c.GlobalIsSet("myflagGlobalUnset"), false) - expect(t, c.GlobalIsSet("bogusGlobal"), false) -} - -func TestContext_NumFlags(t *testing.T) { - set := flag.NewFlagSet("test", 0) - set.Bool("myflag", false, "doc") - set.String("otherflag", "hello world", "doc") - globalSet := flag.NewFlagSet("test", 0) - globalSet.Bool("myflagGlobal", true, "doc") - c := cli.NewContext(nil, set, globalSet) - set.Parse([]string{"--myflag", "--otherflag=foo"}) - globalSet.Parse([]string{"--myflagGlobal"}) - expect(t, c.NumFlags(), 2) -} diff --git a/vendor/github.com/minio/cli/flag_test.go b/vendor/github.com/minio/cli/flag_test.go deleted file mode 100644 index cda91c559..000000000 --- a/vendor/github.com/minio/cli/flag_test.go +++ /dev/null @@ -1,742 +0,0 @@ -package cli_test - -import ( - "fmt" - "os" - "reflect" - "strings" - "testing" - - "github.com/minio/cli" -) - -var boolFlagTests = []struct { - name string - expected string -}{ - {"help", "--help\t"}, - {"h", "-h\t"}, -} - -func TestBoolFlagHelpOutput(t *testing.T) { - - for _, test := range boolFlagTests { - flag := cli.BoolFlag{Name: test.name} - output := flag.String() - - if output != test.expected { - t.Errorf("%s does not match %s", output, test.expected) - } - } -} - -var stringFlagTests = []struct { - name string - value string - expected string -}{ - {"help", "", "--help \t"}, - {"h", "", "-h \t"}, - {"h", "", "-h \t"}, - {"test", "Something", "--test \"Something\"\t"}, -} - -func TestStringFlagHelpOutput(t *testing.T) { - - for _, test := range stringFlagTests { - flag := cli.StringFlag{Name: test.name, Value: test.value} - output := flag.String() - - if output != test.expected { - t.Errorf("%s does not match %s", output, test.expected) - } - } -} - -func TestStringFlagWithEnvVarHelpOutput(t *testing.T) { - os.Clearenv() - os.Setenv("APP_FOO", "derp") - for _, test := range stringFlagTests { - flag := cli.StringFlag{Name: test.name, Value: test.value, EnvVar: "APP_FOO"} - output := flag.String() - - if !strings.HasSuffix(output, " [$APP_FOO]") { - t.Errorf("%s does not end with [$APP_FOO]", output) - } - } -} - -var stringSliceFlagTests = []struct { - name string - value *cli.StringSlice - expected string -}{ - {"help", func() *cli.StringSlice { - s := &cli.StringSlice{} - s.Set("") - return s - }(), "--help [--help option --help option]\t"}, - {"h", func() *cli.StringSlice { - s := &cli.StringSlice{} - s.Set("") - return s - }(), "-h [-h option -h option]\t"}, - {"h", func() *cli.StringSlice { - s := &cli.StringSlice{} - s.Set("") - return s - }(), "-h [-h option -h option]\t"}, - {"test", func() *cli.StringSlice { - s := &cli.StringSlice{} - s.Set("Something") - return s - }(), "--test [--test option --test option]\t"}, -} - -func TestStringSliceFlagHelpOutput(t *testing.T) { - - for _, test := range stringSliceFlagTests { - flag := cli.StringSliceFlag{Name: test.name, Value: test.value} - output := flag.String() - - if output != test.expected { - t.Errorf("%q does not match %q", output, test.expected) - } - } -} - -func TestStringSliceFlagWithEnvVarHelpOutput(t *testing.T) { - os.Clearenv() - os.Setenv("APP_QWWX", "11,4") - for _, test := range stringSliceFlagTests { - flag := cli.StringSliceFlag{Name: test.name, Value: test.value, EnvVar: "APP_QWWX"} - output := flag.String() - - if !strings.HasSuffix(output, " [$APP_QWWX]") { - t.Errorf("%q does not end with [$APP_QWWX]", output) - } - } -} - -var intFlagTests = []struct { - name string - expected string -}{ - {"help", "--help \"0\"\t"}, - {"h", "-h \"0\"\t"}, -} - -func TestIntFlagHelpOutput(t *testing.T) { - - for _, test := range intFlagTests { - flag := cli.IntFlag{Name: test.name} - output := flag.String() - - if output != test.expected { - t.Errorf("%s does not match %s", output, test.expected) - } - } -} - -func TestIntFlagWithEnvVarHelpOutput(t *testing.T) { - os.Clearenv() - os.Setenv("APP_BAR", "2") - for _, test := range intFlagTests { - flag := cli.IntFlag{Name: test.name, EnvVar: "APP_BAR"} - output := flag.String() - - if !strings.HasSuffix(output, " [$APP_BAR]") { - t.Errorf("%s does not end with [$APP_BAR]", output) - } - } -} - -var durationFlagTests = []struct { - name string - expected string -}{ - {"help", "--help \"0\"\t"}, - {"h", "-h \"0\"\t"}, -} - -func TestDurationFlagHelpOutput(t *testing.T) { - - for _, test := range durationFlagTests { - flag := cli.DurationFlag{Name: test.name} - output := flag.String() - - if output != test.expected { - t.Errorf("%s does not match %s", output, test.expected) - } - } -} - -func TestDurationFlagWithEnvVarHelpOutput(t *testing.T) { - os.Clearenv() - os.Setenv("APP_BAR", "2h3m6s") - for _, test := range durationFlagTests { - flag := cli.DurationFlag{Name: test.name, EnvVar: "APP_BAR"} - output := flag.String() - - if !strings.HasSuffix(output, " [$APP_BAR]") { - t.Errorf("%s does not end with [$APP_BAR]", output) - } - } -} - -var intSliceFlagTests = []struct { - name string - value *cli.IntSlice - expected string -}{ - {"help", &cli.IntSlice{}, "--help [--help option --help option]\t"}, - {"h", &cli.IntSlice{}, "-h [-h option -h option]\t"}, - {"h", &cli.IntSlice{}, "-h [-h option -h option]\t"}, - {"test", func() *cli.IntSlice { - i := &cli.IntSlice{} - i.Set("9") - return i - }(), "--test [--test option --test option]\t"}, -} - -func TestIntSliceFlagHelpOutput(t *testing.T) { - - for _, test := range intSliceFlagTests { - flag := cli.IntSliceFlag{Name: test.name, Value: test.value} - output := flag.String() - - if output != test.expected { - t.Errorf("%q does not match %q", output, test.expected) - } - } -} - -func TestIntSliceFlagWithEnvVarHelpOutput(t *testing.T) { - os.Clearenv() - os.Setenv("APP_SMURF", "42,3") - for _, test := range intSliceFlagTests { - flag := cli.IntSliceFlag{Name: test.name, Value: test.value, EnvVar: "APP_SMURF"} - output := flag.String() - - if !strings.HasSuffix(output, " [$APP_SMURF]") { - t.Errorf("%q does not end with [$APP_SMURF]", output) - } - } -} - -var float64FlagTests = []struct { - name string - expected string -}{ - {"help", "--help \"0\"\t"}, - {"h", "-h \"0\"\t"}, -} - -func TestFloat64FlagHelpOutput(t *testing.T) { - - for _, test := range float64FlagTests { - flag := cli.Float64Flag{Name: test.name} - output := flag.String() - - if output != test.expected { - t.Errorf("%s does not match %s", output, test.expected) - } - } -} - -func TestFloat64FlagWithEnvVarHelpOutput(t *testing.T) { - os.Clearenv() - os.Setenv("APP_BAZ", "99.4") - for _, test := range float64FlagTests { - flag := cli.Float64Flag{Name: test.name, EnvVar: "APP_BAZ"} - output := flag.String() - - if !strings.HasSuffix(output, " [$APP_BAZ]") { - t.Errorf("%s does not end with [$APP_BAZ]", output) - } - } -} - -var genericFlagTests = []struct { - name string - value cli.Generic - expected string -}{ - {"test", &Parser{"abc", "def"}, "--test \"abc,def\"\ttest flag"}, - {"t", &Parser{"abc", "def"}, "-t \"abc,def\"\ttest flag"}, -} - -func TestGenericFlagHelpOutput(t *testing.T) { - - for _, test := range genericFlagTests { - flag := cli.GenericFlag{Name: test.name, Value: test.value, Usage: "test flag"} - output := flag.String() - - if output != test.expected { - t.Errorf("%q does not match %q", output, test.expected) - } - } -} - -func TestGenericFlagWithEnvVarHelpOutput(t *testing.T) { - os.Clearenv() - os.Setenv("APP_ZAP", "3") - for _, test := range genericFlagTests { - flag := cli.GenericFlag{Name: test.name, EnvVar: "APP_ZAP"} - output := flag.String() - - if !strings.HasSuffix(output, " [$APP_ZAP]") { - t.Errorf("%s does not end with [$APP_ZAP]", output) - } - } -} - -func TestParseMultiString(t *testing.T) { - (&cli.App{ - Flags: []cli.Flag{ - cli.StringFlag{Name: "serve, s"}, - }, - Action: func(ctx *cli.Context) { - if ctx.String("serve") != "10" { - t.Errorf("main name not set") - } - if ctx.String("s") != "10" { - t.Errorf("short name not set") - } - }, - }).Run([]string{"run", "-s", "10"}) -} - -func TestParseMultiStringFromEnv(t *testing.T) { - os.Clearenv() - os.Setenv("APP_COUNT", "20") - (&cli.App{ - Flags: []cli.Flag{ - cli.StringFlag{Name: "count, c", EnvVar: "APP_COUNT"}, - }, - Action: func(ctx *cli.Context) { - if ctx.String("count") != "20" { - t.Errorf("main name not set") - } - if ctx.String("c") != "20" { - t.Errorf("short name not set") - } - }, - }).Run([]string{"run"}) -} - -func TestParseMultiStringFromEnvCascade(t *testing.T) { - os.Clearenv() - os.Setenv("APP_COUNT", "20") - (&cli.App{ - Flags: []cli.Flag{ - cli.StringFlag{Name: "count, c", EnvVar: "COMPAT_COUNT,APP_COUNT"}, - }, - Action: func(ctx *cli.Context) { - if ctx.String("count") != "20" { - t.Errorf("main name not set") - } - if ctx.String("c") != "20" { - t.Errorf("short name not set") - } - }, - }).Run([]string{"run"}) -} - -func TestParseMultiStringSlice(t *testing.T) { - (&cli.App{ - Flags: []cli.Flag{ - cli.StringSliceFlag{Name: "serve, s", Value: &cli.StringSlice{}}, - }, - Action: func(ctx *cli.Context) { - if !reflect.DeepEqual(ctx.StringSlice("serve"), []string{"10", "20"}) { - t.Errorf("main name not set") - } - if !reflect.DeepEqual(ctx.StringSlice("s"), []string{"10", "20"}) { - t.Errorf("short name not set") - } - }, - }).Run([]string{"run", "-s", "10", "-s", "20"}) -} - -func TestParseMultiStringSliceFromEnv(t *testing.T) { - os.Clearenv() - os.Setenv("APP_INTERVALS", "20,30,40") - - (&cli.App{ - Flags: []cli.Flag{ - cli.StringSliceFlag{Name: "intervals, i", Value: &cli.StringSlice{}, EnvVar: "APP_INTERVALS"}, - }, - Action: func(ctx *cli.Context) { - if !reflect.DeepEqual(ctx.StringSlice("intervals"), []string{"20", "30", "40"}) { - t.Errorf("main name not set from env") - } - if !reflect.DeepEqual(ctx.StringSlice("i"), []string{"20", "30", "40"}) { - t.Errorf("short name not set from env") - } - }, - }).Run([]string{"run"}) -} - -func TestParseMultiStringSliceFromEnvCascade(t *testing.T) { - os.Clearenv() - os.Setenv("APP_INTERVALS", "20,30,40") - - (&cli.App{ - Flags: []cli.Flag{ - cli.StringSliceFlag{Name: "intervals, i", Value: &cli.StringSlice{}, EnvVar: "COMPAT_INTERVALS,APP_INTERVALS"}, - }, - Action: func(ctx *cli.Context) { - if !reflect.DeepEqual(ctx.StringSlice("intervals"), []string{"20", "30", "40"}) { - t.Errorf("main name not set from env") - } - if !reflect.DeepEqual(ctx.StringSlice("i"), []string{"20", "30", "40"}) { - t.Errorf("short name not set from env") - } - }, - }).Run([]string{"run"}) -} - -func TestParseMultiInt(t *testing.T) { - a := cli.App{ - Flags: []cli.Flag{ - cli.IntFlag{Name: "serve, s"}, - }, - Action: func(ctx *cli.Context) { - if ctx.Int("serve") != 10 { - t.Errorf("main name not set") - } - if ctx.Int("s") != 10 { - t.Errorf("short name not set") - } - }, - } - a.Run([]string{"run", "-s", "10"}) -} - -func TestParseMultiIntFromEnv(t *testing.T) { - os.Clearenv() - os.Setenv("APP_TIMEOUT_SECONDS", "10") - a := cli.App{ - Flags: []cli.Flag{ - cli.IntFlag{Name: "timeout, t", EnvVar: "APP_TIMEOUT_SECONDS"}, - }, - Action: func(ctx *cli.Context) { - if ctx.Int("timeout") != 10 { - t.Errorf("main name not set") - } - if ctx.Int("t") != 10 { - t.Errorf("short name not set") - } - }, - } - a.Run([]string{"run"}) -} - -func TestParseMultiIntFromEnvCascade(t *testing.T) { - os.Clearenv() - os.Setenv("APP_TIMEOUT_SECONDS", "10") - a := cli.App{ - Flags: []cli.Flag{ - cli.IntFlag{Name: "timeout, t", EnvVar: "COMPAT_TIMEOUT_SECONDS,APP_TIMEOUT_SECONDS"}, - }, - Action: func(ctx *cli.Context) { - if ctx.Int("timeout") != 10 { - t.Errorf("main name not set") - } - if ctx.Int("t") != 10 { - t.Errorf("short name not set") - } - }, - } - a.Run([]string{"run"}) -} - -func TestParseMultiIntSlice(t *testing.T) { - (&cli.App{ - Flags: []cli.Flag{ - cli.IntSliceFlag{Name: "serve, s", Value: &cli.IntSlice{}}, - }, - Action: func(ctx *cli.Context) { - if !reflect.DeepEqual(ctx.IntSlice("serve"), []int{10, 20}) { - t.Errorf("main name not set") - } - if !reflect.DeepEqual(ctx.IntSlice("s"), []int{10, 20}) { - t.Errorf("short name not set") - } - }, - }).Run([]string{"run", "-s", "10", "-s", "20"}) -} - -func TestParseMultiIntSliceFromEnv(t *testing.T) { - os.Clearenv() - os.Setenv("APP_INTERVALS", "20,30,40") - - (&cli.App{ - Flags: []cli.Flag{ - cli.IntSliceFlag{Name: "intervals, i", Value: &cli.IntSlice{}, EnvVar: "APP_INTERVALS"}, - }, - Action: func(ctx *cli.Context) { - if !reflect.DeepEqual(ctx.IntSlice("intervals"), []int{20, 30, 40}) { - t.Errorf("main name not set from env") - } - if !reflect.DeepEqual(ctx.IntSlice("i"), []int{20, 30, 40}) { - t.Errorf("short name not set from env") - } - }, - }).Run([]string{"run"}) -} - -func TestParseMultiIntSliceFromEnvCascade(t *testing.T) { - os.Clearenv() - os.Setenv("APP_INTERVALS", "20,30,40") - - (&cli.App{ - Flags: []cli.Flag{ - cli.IntSliceFlag{Name: "intervals, i", Value: &cli.IntSlice{}, EnvVar: "COMPAT_INTERVALS,APP_INTERVALS"}, - }, - Action: func(ctx *cli.Context) { - if !reflect.DeepEqual(ctx.IntSlice("intervals"), []int{20, 30, 40}) { - t.Errorf("main name not set from env") - } - if !reflect.DeepEqual(ctx.IntSlice("i"), []int{20, 30, 40}) { - t.Errorf("short name not set from env") - } - }, - }).Run([]string{"run"}) -} - -func TestParseMultiFloat64(t *testing.T) { - a := cli.App{ - Flags: []cli.Flag{ - cli.Float64Flag{Name: "serve, s"}, - }, - Action: func(ctx *cli.Context) { - if ctx.Float64("serve") != 10.2 { - t.Errorf("main name not set") - } - if ctx.Float64("s") != 10.2 { - t.Errorf("short name not set") - } - }, - } - a.Run([]string{"run", "-s", "10.2"}) -} - -func TestParseMultiFloat64FromEnv(t *testing.T) { - os.Clearenv() - os.Setenv("APP_TIMEOUT_SECONDS", "15.5") - a := cli.App{ - Flags: []cli.Flag{ - cli.Float64Flag{Name: "timeout, t", EnvVar: "APP_TIMEOUT_SECONDS"}, - }, - Action: func(ctx *cli.Context) { - if ctx.Float64("timeout") != 15.5 { - t.Errorf("main name not set") - } - if ctx.Float64("t") != 15.5 { - t.Errorf("short name not set") - } - }, - } - a.Run([]string{"run"}) -} - -func TestParseMultiFloat64FromEnvCascade(t *testing.T) { - os.Clearenv() - os.Setenv("APP_TIMEOUT_SECONDS", "15.5") - a := cli.App{ - Flags: []cli.Flag{ - cli.Float64Flag{Name: "timeout, t", EnvVar: "COMPAT_TIMEOUT_SECONDS,APP_TIMEOUT_SECONDS"}, - }, - Action: func(ctx *cli.Context) { - if ctx.Float64("timeout") != 15.5 { - t.Errorf("main name not set") - } - if ctx.Float64("t") != 15.5 { - t.Errorf("short name not set") - } - }, - } - a.Run([]string{"run"}) -} - -func TestParseMultiBool(t *testing.T) { - a := cli.App{ - Flags: []cli.Flag{ - cli.BoolFlag{Name: "serve, s"}, - }, - Action: func(ctx *cli.Context) { - if ctx.Bool("serve") != true { - t.Errorf("main name not set") - } - if ctx.Bool("s") != true { - t.Errorf("short name not set") - } - }, - } - a.Run([]string{"run", "--serve"}) -} - -func TestParseMultiBoolFromEnv(t *testing.T) { - os.Clearenv() - os.Setenv("APP_DEBUG", "1") - a := cli.App{ - Flags: []cli.Flag{ - cli.BoolFlag{Name: "debug, d", EnvVar: "APP_DEBUG"}, - }, - Action: func(ctx *cli.Context) { - if ctx.Bool("debug") != true { - t.Errorf("main name not set from env") - } - if ctx.Bool("d") != true { - t.Errorf("short name not set from env") - } - }, - } - a.Run([]string{"run"}) -} - -func TestParseMultiBoolFromEnvCascade(t *testing.T) { - os.Clearenv() - os.Setenv("APP_DEBUG", "1") - a := cli.App{ - Flags: []cli.Flag{ - cli.BoolFlag{Name: "debug, d", EnvVar: "COMPAT_DEBUG,APP_DEBUG"}, - }, - Action: func(ctx *cli.Context) { - if ctx.Bool("debug") != true { - t.Errorf("main name not set from env") - } - if ctx.Bool("d") != true { - t.Errorf("short name not set from env") - } - }, - } - a.Run([]string{"run"}) -} - -func TestParseMultiBoolT(t *testing.T) { - a := cli.App{ - Flags: []cli.Flag{ - cli.BoolTFlag{Name: "serve, s"}, - }, - Action: func(ctx *cli.Context) { - if ctx.BoolT("serve") != true { - t.Errorf("main name not set") - } - if ctx.BoolT("s") != true { - t.Errorf("short name not set") - } - }, - } - a.Run([]string{"run", "--serve"}) -} - -func TestParseMultiBoolTFromEnv(t *testing.T) { - os.Clearenv() - os.Setenv("APP_DEBUG", "0") - a := cli.App{ - Flags: []cli.Flag{ - cli.BoolTFlag{Name: "debug, d", EnvVar: "APP_DEBUG"}, - }, - Action: func(ctx *cli.Context) { - if ctx.BoolT("debug") != false { - t.Errorf("main name not set from env") - } - if ctx.BoolT("d") != false { - t.Errorf("short name not set from env") - } - }, - } - a.Run([]string{"run"}) -} - -func TestParseMultiBoolTFromEnvCascade(t *testing.T) { - os.Clearenv() - os.Setenv("APP_DEBUG", "0") - a := cli.App{ - Flags: []cli.Flag{ - cli.BoolTFlag{Name: "debug, d", EnvVar: "COMPAT_DEBUG,APP_DEBUG"}, - }, - Action: func(ctx *cli.Context) { - if ctx.BoolT("debug") != false { - t.Errorf("main name not set from env") - } - if ctx.BoolT("d") != false { - t.Errorf("short name not set from env") - } - }, - } - a.Run([]string{"run"}) -} - -type Parser [2]string - -func (p *Parser) Set(value string) error { - parts := strings.Split(value, ",") - if len(parts) != 2 { - return fmt.Errorf("invalid format") - } - - (*p)[0] = parts[0] - (*p)[1] = parts[1] - - return nil -} - -func (p *Parser) String() string { - return fmt.Sprintf("%s,%s", p[0], p[1]) -} - -func TestParseGeneric(t *testing.T) { - a := cli.App{ - Flags: []cli.Flag{ - cli.GenericFlag{Name: "serve, s", Value: &Parser{}}, - }, - Action: func(ctx *cli.Context) { - if !reflect.DeepEqual(ctx.Generic("serve"), &Parser{"10", "20"}) { - t.Errorf("main name not set") - } - if !reflect.DeepEqual(ctx.Generic("s"), &Parser{"10", "20"}) { - t.Errorf("short name not set") - } - }, - } - a.Run([]string{"run", "-s", "10,20"}) -} - -func TestParseGenericFromEnv(t *testing.T) { - os.Clearenv() - os.Setenv("APP_SERVE", "20,30") - a := cli.App{ - Flags: []cli.Flag{ - cli.GenericFlag{Name: "serve, s", Value: &Parser{}, EnvVar: "APP_SERVE"}, - }, - Action: func(ctx *cli.Context) { - if !reflect.DeepEqual(ctx.Generic("serve"), &Parser{"20", "30"}) { - t.Errorf("main name not set from env") - } - if !reflect.DeepEqual(ctx.Generic("s"), &Parser{"20", "30"}) { - t.Errorf("short name not set from env") - } - }, - } - a.Run([]string{"run"}) -} - -func TestParseGenericFromEnvCascade(t *testing.T) { - os.Clearenv() - os.Setenv("APP_FOO", "99,2000") - a := cli.App{ - Flags: []cli.Flag{ - cli.GenericFlag{Name: "foos", Value: &Parser{}, EnvVar: "COMPAT_FOO,APP_FOO"}, - }, - Action: func(ctx *cli.Context) { - if !reflect.DeepEqual(ctx.Generic("foos"), &Parser{"99", "2000"}) { - t.Errorf("value not set from env") - } - }, - } - a.Run([]string{"run"}) -} diff --git a/vendor/github.com/minio/cli/helpers_test.go b/vendor/github.com/minio/cli/helpers_test.go deleted file mode 100644 index cdc4feb2f..000000000 --- a/vendor/github.com/minio/cli/helpers_test.go +++ /dev/null @@ -1,19 +0,0 @@ -package cli_test - -import ( - "reflect" - "testing" -) - -/* Test Helpers */ -func expect(t *testing.T, a interface{}, b interface{}) { - if a != b { - t.Errorf("Expected %v (type %v) - Got %v (type %v)", b, reflect.TypeOf(b), a, reflect.TypeOf(a)) - } -} - -func refute(t *testing.T, a interface{}, b interface{}) { - if a == b { - t.Errorf("Did not expect %v (type %v) - Got %v (type %v)", b, reflect.TypeOf(b), a, reflect.TypeOf(a)) - } -} diff --git a/pkg/atomic/atomic.go b/vendor/github.com/minio/minio-xl/pkg/atomic/atomic.go similarity index 100% rename from pkg/atomic/atomic.go rename to vendor/github.com/minio/minio-xl/pkg/atomic/atomic.go diff --git a/pkg/atomic/atomic_test.go b/vendor/github.com/minio/minio-xl/pkg/atomic/atomic_test.go similarity index 100% rename from pkg/atomic/atomic_test.go rename to vendor/github.com/minio/minio-xl/pkg/atomic/atomic_test.go diff --git a/pkg/cpu/cpu.go b/vendor/github.com/minio/minio-xl/pkg/cpu/cpu.go similarity index 100% rename from pkg/cpu/cpu.go rename to vendor/github.com/minio/minio-xl/pkg/cpu/cpu.go diff --git a/pkg/cpu/cpu_amd64.s b/vendor/github.com/minio/minio-xl/pkg/cpu/cpu_amd64.s similarity index 100% rename from pkg/cpu/cpu_amd64.s rename to vendor/github.com/minio/minio-xl/pkg/cpu/cpu_amd64.s diff --git a/pkg/cpu/cpu_test.go b/vendor/github.com/minio/minio-xl/pkg/cpu/cpu_test.go similarity index 97% rename from pkg/cpu/cpu_test.go rename to vendor/github.com/minio/minio-xl/pkg/cpu/cpu_test.go index 8286413e9..a39787f1e 100644 --- a/pkg/cpu/cpu_test.go +++ b/vendor/github.com/minio/minio-xl/pkg/cpu/cpu_test.go @@ -23,7 +23,7 @@ import ( "strings" "testing" - "github.com/minio/minio/pkg/cpu" + "github.com/minio/minio-xl/pkg/cpu" . "gopkg.in/check.v1" ) diff --git a/pkg/cpu/doc.go b/vendor/github.com/minio/minio-xl/pkg/cpu/doc.go similarity index 100% rename from pkg/cpu/doc.go rename to vendor/github.com/minio/minio-xl/pkg/cpu/doc.go diff --git a/pkg/crypto/sha1/LICENSE b/vendor/github.com/minio/minio-xl/pkg/crypto/sha256/LICENSE similarity index 100% rename from pkg/crypto/sha1/LICENSE rename to vendor/github.com/minio/minio-xl/pkg/crypto/sha256/LICENSE diff --git a/pkg/crypto/sha256/sha256-avx-asm_linux.S b/vendor/github.com/minio/minio-xl/pkg/crypto/sha256/sha256-avx-asm_linux.S similarity index 100% rename from pkg/crypto/sha256/sha256-avx-asm_linux.S rename to vendor/github.com/minio/minio-xl/pkg/crypto/sha256/sha256-avx-asm_linux.S diff --git a/pkg/crypto/sha256/sha256-avx2-asm_linux.S b/vendor/github.com/minio/minio-xl/pkg/crypto/sha256/sha256-avx2-asm_linux.S similarity index 100% rename from pkg/crypto/sha256/sha256-avx2-asm_linux.S rename to vendor/github.com/minio/minio-xl/pkg/crypto/sha256/sha256-avx2-asm_linux.S diff --git a/pkg/crypto/sha256/sha256-ssse3-asm_linux.S b/vendor/github.com/minio/minio-xl/pkg/crypto/sha256/sha256-ssse3-asm_linux.S similarity index 100% rename from pkg/crypto/sha256/sha256-ssse3-asm_linux.S rename to vendor/github.com/minio/minio-xl/pkg/crypto/sha256/sha256-ssse3-asm_linux.S diff --git a/pkg/crypto/sha256/sha256_darwin.go b/vendor/github.com/minio/minio-xl/pkg/crypto/sha256/sha256_darwin.go similarity index 100% rename from pkg/crypto/sha256/sha256_darwin.go rename to vendor/github.com/minio/minio-xl/pkg/crypto/sha256/sha256_darwin.go diff --git a/pkg/crypto/sha256/sha256_linux.go b/vendor/github.com/minio/minio-xl/pkg/crypto/sha256/sha256_linux.go similarity index 98% rename from pkg/crypto/sha256/sha256_linux.go rename to vendor/github.com/minio/minio-xl/pkg/crypto/sha256/sha256_linux.go index 13516c271..0c6b44a2f 100644 --- a/pkg/crypto/sha256/sha256_linux.go +++ b/vendor/github.com/minio/minio-xl/pkg/crypto/sha256/sha256_linux.go @@ -14,7 +14,7 @@ import ( "hash" "io" - "github.com/minio/minio/pkg/cpu" + "github.com/minio/minio-xl/pkg/cpu" ) // The size of a SHA256 checksum in bytes. diff --git a/pkg/crypto/sha256/sha256_linux_test.go b/vendor/github.com/minio/minio-xl/pkg/crypto/sha256/sha256_linux_test.go similarity index 100% rename from pkg/crypto/sha256/sha256_linux_test.go rename to vendor/github.com/minio/minio-xl/pkg/crypto/sha256/sha256_linux_test.go diff --git a/pkg/crypto/sha256/sha256_windows.go b/vendor/github.com/minio/minio-xl/pkg/crypto/sha256/sha256_windows.go similarity index 100% rename from pkg/crypto/sha256/sha256_windows.go rename to vendor/github.com/minio/minio-xl/pkg/crypto/sha256/sha256_windows.go diff --git a/pkg/crypto/sha256/sha256block_linux.go b/vendor/github.com/minio/minio-xl/pkg/crypto/sha256/sha256block_linux.go similarity index 100% rename from pkg/crypto/sha256/sha256block_linux.go rename to vendor/github.com/minio/minio-xl/pkg/crypto/sha256/sha256block_linux.go diff --git a/pkg/crypto/sha256/LICENSE b/vendor/github.com/minio/minio-xl/pkg/crypto/sha512/LICENSE similarity index 100% rename from pkg/crypto/sha256/LICENSE rename to vendor/github.com/minio/minio-xl/pkg/crypto/sha512/LICENSE diff --git a/pkg/crypto/sha512/sha512-avx-asm_linux.S b/vendor/github.com/minio/minio-xl/pkg/crypto/sha512/sha512-avx-asm_linux.S similarity index 100% rename from pkg/crypto/sha512/sha512-avx-asm_linux.S rename to vendor/github.com/minio/minio-xl/pkg/crypto/sha512/sha512-avx-asm_linux.S diff --git a/pkg/crypto/sha512/sha512-avx2-asm_linux.S b/vendor/github.com/minio/minio-xl/pkg/crypto/sha512/sha512-avx2-asm_linux.S similarity index 100% rename from pkg/crypto/sha512/sha512-avx2-asm_linux.S rename to vendor/github.com/minio/minio-xl/pkg/crypto/sha512/sha512-avx2-asm_linux.S diff --git a/pkg/crypto/sha512/sha512-ssse3-asm_linux.S b/vendor/github.com/minio/minio-xl/pkg/crypto/sha512/sha512-ssse3-asm_linux.S similarity index 100% rename from pkg/crypto/sha512/sha512-ssse3-asm_linux.S rename to vendor/github.com/minio/minio-xl/pkg/crypto/sha512/sha512-ssse3-asm_linux.S diff --git a/pkg/crypto/sha512/sha512_darwin.go b/vendor/github.com/minio/minio-xl/pkg/crypto/sha512/sha512_darwin.go similarity index 100% rename from pkg/crypto/sha512/sha512_darwin.go rename to vendor/github.com/minio/minio-xl/pkg/crypto/sha512/sha512_darwin.go diff --git a/pkg/crypto/sha512/sha512_linux.go b/vendor/github.com/minio/minio-xl/pkg/crypto/sha512/sha512_linux.go similarity index 98% rename from pkg/crypto/sha512/sha512_linux.go rename to vendor/github.com/minio/minio-xl/pkg/crypto/sha512/sha512_linux.go index 8daac0b8d..6ebe99ca6 100644 --- a/pkg/crypto/sha512/sha512_linux.go +++ b/vendor/github.com/minio/minio-xl/pkg/crypto/sha512/sha512_linux.go @@ -15,7 +15,7 @@ import ( "hash" "io" - "github.com/minio/minio/pkg/cpu" + "github.com/minio/minio-xl/pkg/cpu" ) // The size of a SHA512 checksum in bytes. diff --git a/pkg/crypto/sha512/sha512_linux_test.go b/vendor/github.com/minio/minio-xl/pkg/crypto/sha512/sha512_linux_test.go similarity index 100% rename from pkg/crypto/sha512/sha512_linux_test.go rename to vendor/github.com/minio/minio-xl/pkg/crypto/sha512/sha512_linux_test.go diff --git a/pkg/crypto/sha512/sha512_windows.go b/vendor/github.com/minio/minio-xl/pkg/crypto/sha512/sha512_windows.go similarity index 100% rename from pkg/crypto/sha512/sha512_windows.go rename to vendor/github.com/minio/minio-xl/pkg/crypto/sha512/sha512_windows.go diff --git a/pkg/crypto/sha512/sha512block_linux.go b/vendor/github.com/minio/minio-xl/pkg/crypto/sha512/sha512block_linux.go similarity index 100% rename from pkg/crypto/sha512/sha512block_linux.go rename to vendor/github.com/minio/minio-xl/pkg/crypto/sha512/sha512block_linux.go diff --git a/pkg/minhttp/LICENSE.Facebook b/vendor/github.com/minio/minio-xl/pkg/minhttp/LICENSE.Facebook similarity index 100% rename from pkg/minhttp/LICENSE.Facebook rename to vendor/github.com/minio/minio-xl/pkg/minhttp/LICENSE.Facebook diff --git a/pkg/minhttp/LICENSE.Minio b/vendor/github.com/minio/minio-xl/pkg/minhttp/LICENSE.Minio similarity index 100% rename from pkg/minhttp/LICENSE.Minio rename to vendor/github.com/minio/minio-xl/pkg/minhttp/LICENSE.Minio diff --git a/pkg/minhttp/http_nix.go b/vendor/github.com/minio/minio-xl/pkg/minhttp/http_nix.go similarity index 99% rename from pkg/minhttp/http_nix.go rename to vendor/github.com/minio/minio-xl/pkg/minhttp/http_nix.go index 0b7017c56..93d7f37bb 100644 --- a/pkg/minhttp/http_nix.go +++ b/vendor/github.com/minio/minio-xl/pkg/minhttp/http_nix.go @@ -34,7 +34,7 @@ import ( "time" "github.com/facebookgo/httpdown" - "github.com/minio/minio/pkg/probe" + "github.com/minio/minio-xl/pkg/probe" ) // An app contains one or more servers and their associated configuration. diff --git a/pkg/minhttp/http_windows.go b/vendor/github.com/minio/minio-xl/pkg/minhttp/http_windows.go similarity index 99% rename from pkg/minhttp/http_windows.go rename to vendor/github.com/minio/minio-xl/pkg/minhttp/http_windows.go index 103e922d6..223418a18 100644 --- a/pkg/minhttp/http_windows.go +++ b/vendor/github.com/minio/minio-xl/pkg/minhttp/http_windows.go @@ -34,7 +34,7 @@ import ( "time" "github.com/facebookgo/httpdown" - "github.com/minio/minio/pkg/probe" + "github.com/minio/minio-xl/pkg/probe" ) // An app contains one or more servers and their associated configuration. diff --git a/pkg/minhttp/kill_windows.go b/vendor/github.com/minio/minio-xl/pkg/minhttp/kill_windows.go similarity index 100% rename from pkg/minhttp/kill_windows.go rename to vendor/github.com/minio/minio-xl/pkg/minhttp/kill_windows.go diff --git a/pkg/minhttp/listen.go b/vendor/github.com/minio/minio-xl/pkg/minhttp/listen.go similarity index 100% rename from pkg/minhttp/listen.go rename to vendor/github.com/minio/minio-xl/pkg/minhttp/listen.go diff --git a/pkg/minhttp/net.go b/vendor/github.com/minio/minio-xl/pkg/minhttp/net.go similarity index 99% rename from pkg/minhttp/net.go rename to vendor/github.com/minio/minio-xl/pkg/minhttp/net.go index d651a5093..8bc1fdba9 100644 --- a/pkg/minhttp/net.go +++ b/vendor/github.com/minio/minio-xl/pkg/minhttp/net.go @@ -25,7 +25,7 @@ import ( "strings" "sync" - "github.com/minio/minio/pkg/probe" + "github.com/minio/minio-xl/pkg/probe" ) // This package is a fork https://github.com/facebookgo/grace diff --git a/pkg/probe/probe.go b/vendor/github.com/minio/minio-xl/pkg/probe/probe.go similarity index 100% rename from pkg/probe/probe.go rename to vendor/github.com/minio/minio-xl/pkg/probe/probe.go diff --git a/pkg/probe/probe_test.go b/vendor/github.com/minio/minio-xl/pkg/probe/probe_test.go similarity index 97% rename from pkg/probe/probe_test.go rename to vendor/github.com/minio/minio-xl/pkg/probe/probe_test.go index b27ab270b..96cdc47a0 100644 --- a/pkg/probe/probe_test.go +++ b/vendor/github.com/minio/minio-xl/pkg/probe/probe_test.go @@ -19,7 +19,7 @@ import ( "os" "testing" - "github.com/minio/minio/pkg/probe" + "github.com/minio/minio-xl/pkg/probe" . "gopkg.in/check.v1" ) diff --git a/pkg/probe/wrapper.go b/vendor/github.com/minio/minio-xl/pkg/probe/wrapper.go similarity index 100% rename from pkg/probe/wrapper.go rename to vendor/github.com/minio/minio-xl/pkg/probe/wrapper.go diff --git a/pkg/quick/errorutil.go b/vendor/github.com/minio/minio-xl/pkg/quick/errorutil.go similarity index 100% rename from pkg/quick/errorutil.go rename to vendor/github.com/minio/minio-xl/pkg/quick/errorutil.go diff --git a/pkg/quick/quick.go b/vendor/github.com/minio/minio-xl/pkg/quick/quick.go similarity index 99% rename from pkg/quick/quick.go rename to vendor/github.com/minio/minio-xl/pkg/quick/quick.go index 37d3ca2fc..65c7ca3de 100644 --- a/pkg/quick/quick.go +++ b/vendor/github.com/minio/minio-xl/pkg/quick/quick.go @@ -30,7 +30,7 @@ import ( "sync" "github.com/fatih/structs" - "github.com/minio/minio/pkg/probe" + "github.com/minio/minio-xl/pkg/probe" ) // Config - generic config interface functions diff --git a/pkg/quick/quick_test.go b/vendor/github.com/minio/minio-xl/pkg/quick/quick_test.go similarity index 99% rename from pkg/quick/quick_test.go rename to vendor/github.com/minio/minio-xl/pkg/quick/quick_test.go index c61646c33..babdc6d2e 100644 --- a/pkg/quick/quick_test.go +++ b/vendor/github.com/minio/minio-xl/pkg/quick/quick_test.go @@ -22,7 +22,7 @@ import ( "os" "testing" - "github.com/minio/minio/pkg/quick" + "github.com/minio/minio-xl/pkg/quick" . "gopkg.in/check.v1" ) diff --git a/vendor/github.com/olekukonko/ts/ts_test.go b/vendor/github.com/olekukonko/ts/ts_test.go deleted file mode 100644 index 4998e7c01..000000000 --- a/vendor/github.com/olekukonko/ts/ts_test.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2014 Oleku Konko All rights reserved. -// Use of this source code is governed by a MIT -// license that can be found in the LICENSE file. - -// This module is a Terminal API for the Go Programming Language. -// The protocols were written in pure Go and works on windows and unix systems - -package ts - -import ( - "fmt" - "testing" -) - -func ExampleGetSize() { - size, _ := GetSize() - fmt.Println(size.Col()) // Get Width - fmt.Println(size.Row()) // Get Height - fmt.Println(size.PosX()) // Get X position - fmt.Println(size.PosY()) // Get Y position -} - -func TestSize(t *testing.T) { - size, err := GetSize() - - if err != nil { - t.Fatal(err) - } - if size.Col() == 0 || size.Row() == 0 { - t.Fatalf("Screen Size Failed") - } -} diff --git a/vendor/github.com/rs/cors/bench_test.go b/vendor/github.com/rs/cors/bench_test.go deleted file mode 100644 index b6e3721de..000000000 --- a/vendor/github.com/rs/cors/bench_test.go +++ /dev/null @@ -1,88 +0,0 @@ -package cors - -import ( - "net/http" - "testing" -) - -type FakeResponse struct { - header http.Header -} - -func (r FakeResponse) Header() http.Header { - return r.header -} - -func (r FakeResponse) WriteHeader(n int) { -} - -func (r FakeResponse) Write(b []byte) (n int, err error) { - return len(b), nil -} - -func BenchmarkWithout(b *testing.B) { - res := FakeResponse{http.Header{}} - req, _ := http.NewRequest("GET", "http://example.com/foo", nil) - - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - testHandler.ServeHTTP(res, req) - } -} - -func BenchmarkDefault(b *testing.B) { - res := FakeResponse{http.Header{}} - req, _ := http.NewRequest("GET", "http://example.com/foo", nil) - req.Header.Add("Origin", "somedomain.com") - handler := Default().Handler(testHandler) - - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - handler.ServeHTTP(res, req) - } -} - -func BenchmarkAllowedOrigin(b *testing.B) { - res := FakeResponse{http.Header{}} - req, _ := http.NewRequest("GET", "http://example.com/foo", nil) - req.Header.Add("Origin", "somedomain.com") - c := New(Options{ - AllowedOrigins: []string{"somedomain.com"}, - }) - handler := c.Handler(testHandler) - - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - handler.ServeHTTP(res, req) - } -} - -func BenchmarkPreflight(b *testing.B) { - res := FakeResponse{http.Header{}} - req, _ := http.NewRequest("OPTIONS", "http://example.com/foo", nil) - req.Header.Add("Access-Control-Request-Method", "GET") - handler := Default().Handler(testHandler) - - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - handler.ServeHTTP(res, req) - } -} - -func BenchmarkPreflightHeader(b *testing.B) { - res := FakeResponse{http.Header{}} - req, _ := http.NewRequest("OPTIONS", "http://example.com/foo", nil) - req.Header.Add("Access-Control-Request-Method", "GET") - req.Header.Add("Access-Control-Request-Headers", "Accept") - handler := Default().Handler(testHandler) - - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - handler.ServeHTTP(res, req) - } -} diff --git a/vendor/github.com/rs/cors/cors_test.go b/vendor/github.com/rs/cors/cors_test.go deleted file mode 100644 index 28672a001..000000000 --- a/vendor/github.com/rs/cors/cors_test.go +++ /dev/null @@ -1,371 +0,0 @@ -package cors - -import ( - "net/http" - "net/http/httptest" - "regexp" - "strings" - "testing" -) - -var testHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Write([]byte("bar")) -}) - -func assertHeaders(t *testing.T, resHeaders http.Header, reqHeaders map[string]string) { - for name, value := range reqHeaders { - if actual := strings.Join(resHeaders[name], ", "); actual != value { - t.Errorf("Invalid header `%s', wanted `%s', got `%s'", name, value, actual) - } - } -} - -func TestNoConfig(t *testing.T) { - s := New(Options{ - // Intentionally left blank. - }) - - res := httptest.NewRecorder() - req, _ := http.NewRequest("GET", "http://example.com/foo", nil) - - s.Handler(testHandler).ServeHTTP(res, req) - - assertHeaders(t, res.Header(), map[string]string{ - "Vary": "Origin", - "Access-Control-Allow-Origin": "", - "Access-Control-Allow-Methods": "", - "Access-Control-Allow-Headers": "", - "Access-Control-Allow-Credentials": "", - "Access-Control-Max-Age": "", - "Access-Control-Expose-Headers": "", - }) -} - -func TestMatchAllOrigin(t *testing.T) { - s := New(Options{ - AllowedOrigins: []string{"*"}, - }) - - res := httptest.NewRecorder() - req, _ := http.NewRequest("GET", "http://example.com/foo", nil) - req.Header.Add("Origin", "http://foobar.com") - - s.Handler(testHandler).ServeHTTP(res, req) - - assertHeaders(t, res.Header(), map[string]string{ - "Vary": "Origin", - "Access-Control-Allow-Origin": "http://foobar.com", - "Access-Control-Allow-Methods": "", - "Access-Control-Allow-Headers": "", - "Access-Control-Allow-Credentials": "", - "Access-Control-Max-Age": "", - "Access-Control-Expose-Headers": "", - }) -} - -func TestAllowedOrigin(t *testing.T) { - s := New(Options{ - AllowedOrigins: []string{"http://foobar.com"}, - }) - - res := httptest.NewRecorder() - req, _ := http.NewRequest("GET", "http://example.com/foo", nil) - req.Header.Add("Origin", "http://foobar.com") - - s.Handler(testHandler).ServeHTTP(res, req) - - assertHeaders(t, res.Header(), map[string]string{ - "Vary": "Origin", - "Access-Control-Allow-Origin": "http://foobar.com", - "Access-Control-Allow-Methods": "", - "Access-Control-Allow-Headers": "", - "Access-Control-Allow-Credentials": "", - "Access-Control-Max-Age": "", - "Access-Control-Expose-Headers": "", - }) -} - -func TestWildcardOrigin(t *testing.T) { - s := New(Options{ - AllowedOrigins: []string{"http://*.bar.com"}, - }) - - res := httptest.NewRecorder() - req, _ := http.NewRequest("GET", "http://example.com/foo", nil) - req.Header.Add("Origin", "http://foo.bar.com") - - s.Handler(testHandler).ServeHTTP(res, req) - - assertHeaders(t, res.Header(), map[string]string{ - "Vary": "Origin", - "Access-Control-Allow-Origin": "http://foo.bar.com", - "Access-Control-Allow-Methods": "", - "Access-Control-Allow-Headers": "", - "Access-Control-Allow-Credentials": "", - "Access-Control-Max-Age": "", - "Access-Control-Expose-Headers": "", - }) -} - -func TestDisallowedOrigin(t *testing.T) { - s := New(Options{ - AllowedOrigins: []string{"http://foobar.com"}, - }) - - res := httptest.NewRecorder() - req, _ := http.NewRequest("GET", "http://example.com/foo", nil) - req.Header.Add("Origin", "http://barbaz.com") - - s.Handler(testHandler).ServeHTTP(res, req) - - assertHeaders(t, res.Header(), map[string]string{ - "Vary": "Origin", - "Access-Control-Allow-Origin": "", - "Access-Control-Allow-Methods": "", - "Access-Control-Allow-Headers": "", - "Access-Control-Allow-Credentials": "", - "Access-Control-Max-Age": "", - "Access-Control-Expose-Headers": "", - }) -} - -func TestDisallowedWildcardOrigin(t *testing.T) { - s := New(Options{ - AllowedOrigins: []string{"http://*.bar.com"}, - }) - - res := httptest.NewRecorder() - req, _ := http.NewRequest("GET", "http://example.com/foo", nil) - req.Header.Add("Origin", "http://foo.baz.com") - - s.Handler(testHandler).ServeHTTP(res, req) - - assertHeaders(t, res.Header(), map[string]string{ - "Vary": "Origin", - "Access-Control-Allow-Origin": "", - "Access-Control-Allow-Methods": "", - "Access-Control-Allow-Headers": "", - "Access-Control-Allow-Credentials": "", - "Access-Control-Max-Age": "", - "Access-Control-Expose-Headers": "", - }) -} - -func TestAllowedOriginFunc(t *testing.T) { - r, _ := regexp.Compile("^http://foo") - s := New(Options{ - AllowOriginFunc: func(o string) bool { - return r.MatchString(o) - }, - }) - - req, _ := http.NewRequest("GET", "http://example.com/foo", nil) - - res := httptest.NewRecorder() - req.Header.Set("Origin", "http://foobar.com") - s.Handler(testHandler).ServeHTTP(res, req) - assertHeaders(t, res.Header(), map[string]string{ - "Access-Control-Allow-Origin": "http://foobar.com", - }) - - res = httptest.NewRecorder() - req.Header.Set("Origin", "http://barfoo.com") - s.Handler(testHandler).ServeHTTP(res, req) - assertHeaders(t, res.Header(), map[string]string{ - "Access-Control-Allow-Origin": "", - }) -} - -func TestAllowedMethod(t *testing.T) { - s := New(Options{ - AllowedOrigins: []string{"http://foobar.com"}, - AllowedMethods: []string{"PUT", "DELETE"}, - }) - - res := httptest.NewRecorder() - req, _ := http.NewRequest("OPTIONS", "http://example.com/foo", nil) - req.Header.Add("Origin", "http://foobar.com") - req.Header.Add("Access-Control-Request-Method", "PUT") - - s.Handler(testHandler).ServeHTTP(res, req) - - assertHeaders(t, res.Header(), map[string]string{ - "Vary": "Origin, Access-Control-Request-Method, Access-Control-Request-Headers", - "Access-Control-Allow-Origin": "http://foobar.com", - "Access-Control-Allow-Methods": "PUT", - "Access-Control-Allow-Headers": "", - "Access-Control-Allow-Credentials": "", - "Access-Control-Max-Age": "", - "Access-Control-Expose-Headers": "", - }) -} - -func TestDisallowedMethod(t *testing.T) { - s := New(Options{ - AllowedOrigins: []string{"http://foobar.com"}, - AllowedMethods: []string{"PUT", "DELETE"}, - }) - - res := httptest.NewRecorder() - req, _ := http.NewRequest("OPTIONS", "http://example.com/foo", nil) - req.Header.Add("Origin", "http://foobar.com") - req.Header.Add("Access-Control-Request-Method", "PATCH") - - s.Handler(testHandler).ServeHTTP(res, req) - - assertHeaders(t, res.Header(), map[string]string{ - "Vary": "Origin, Access-Control-Request-Method, Access-Control-Request-Headers", - "Access-Control-Allow-Origin": "", - "Access-Control-Allow-Methods": "", - "Access-Control-Allow-Headers": "", - "Access-Control-Allow-Credentials": "", - "Access-Control-Max-Age": "", - "Access-Control-Expose-Headers": "", - }) -} - -func TestAllowedHeader(t *testing.T) { - s := New(Options{ - AllowedOrigins: []string{"http://foobar.com"}, - AllowedHeaders: []string{"X-Header-1", "x-header-2"}, - }) - - res := httptest.NewRecorder() - req, _ := http.NewRequest("OPTIONS", "http://example.com/foo", nil) - req.Header.Add("Origin", "http://foobar.com") - req.Header.Add("Access-Control-Request-Method", "GET") - req.Header.Add("Access-Control-Request-Headers", "X-Header-2, X-HEADER-1") - - s.Handler(testHandler).ServeHTTP(res, req) - - assertHeaders(t, res.Header(), map[string]string{ - "Vary": "Origin, Access-Control-Request-Method, Access-Control-Request-Headers", - "Access-Control-Allow-Origin": "http://foobar.com", - "Access-Control-Allow-Methods": "GET", - "Access-Control-Allow-Headers": "X-Header-2, X-Header-1", - "Access-Control-Allow-Credentials": "", - "Access-Control-Max-Age": "", - "Access-Control-Expose-Headers": "", - }) -} - -func TestAllowedWildcardHeader(t *testing.T) { - s := New(Options{ - AllowedOrigins: []string{"http://foobar.com"}, - AllowedHeaders: []string{"*"}, - }) - - res := httptest.NewRecorder() - req, _ := http.NewRequest("OPTIONS", "http://example.com/foo", nil) - req.Header.Add("Origin", "http://foobar.com") - req.Header.Add("Access-Control-Request-Method", "GET") - req.Header.Add("Access-Control-Request-Headers", "X-Header-2, X-HEADER-1") - - s.Handler(testHandler).ServeHTTP(res, req) - - assertHeaders(t, res.Header(), map[string]string{ - "Vary": "Origin, Access-Control-Request-Method, Access-Control-Request-Headers", - "Access-Control-Allow-Origin": "http://foobar.com", - "Access-Control-Allow-Methods": "GET", - "Access-Control-Allow-Headers": "X-Header-2, X-Header-1", - "Access-Control-Allow-Credentials": "", - "Access-Control-Max-Age": "", - "Access-Control-Expose-Headers": "", - }) -} - -func TestDisallowedHeader(t *testing.T) { - s := New(Options{ - AllowedOrigins: []string{"http://foobar.com"}, - AllowedHeaders: []string{"X-Header-1", "x-header-2"}, - }) - - res := httptest.NewRecorder() - req, _ := http.NewRequest("OPTIONS", "http://example.com/foo", nil) - req.Header.Add("Origin", "http://foobar.com") - req.Header.Add("Access-Control-Request-Method", "GET") - req.Header.Add("Access-Control-Request-Headers", "X-Header-3, X-Header-1") - - s.Handler(testHandler).ServeHTTP(res, req) - - assertHeaders(t, res.Header(), map[string]string{ - "Vary": "Origin, Access-Control-Request-Method, Access-Control-Request-Headers", - "Access-Control-Allow-Origin": "", - "Access-Control-Allow-Methods": "", - "Access-Control-Allow-Headers": "", - "Access-Control-Allow-Credentials": "", - "Access-Control-Max-Age": "", - "Access-Control-Expose-Headers": "", - }) -} - -func TestOriginHeader(t *testing.T) { - s := New(Options{ - AllowedOrigins: []string{"http://foobar.com"}, - }) - - res := httptest.NewRecorder() - req, _ := http.NewRequest("OPTIONS", "http://example.com/foo", nil) - req.Header.Add("Origin", "http://foobar.com") - req.Header.Add("Access-Control-Request-Method", "GET") - req.Header.Add("Access-Control-Request-Headers", "origin") - - s.Handler(testHandler).ServeHTTP(res, req) - - assertHeaders(t, res.Header(), map[string]string{ - "Vary": "Origin, Access-Control-Request-Method, Access-Control-Request-Headers", - "Access-Control-Allow-Origin": "http://foobar.com", - "Access-Control-Allow-Methods": "GET", - "Access-Control-Allow-Headers": "Origin", - "Access-Control-Allow-Credentials": "", - "Access-Control-Max-Age": "", - "Access-Control-Expose-Headers": "", - }) -} - -func TestExposedHeader(t *testing.T) { - s := New(Options{ - AllowedOrigins: []string{"http://foobar.com"}, - ExposedHeaders: []string{"X-Header-1", "x-header-2"}, - }) - - res := httptest.NewRecorder() - req, _ := http.NewRequest("GET", "http://example.com/foo", nil) - req.Header.Add("Origin", "http://foobar.com") - - s.Handler(testHandler).ServeHTTP(res, req) - - assertHeaders(t, res.Header(), map[string]string{ - "Vary": "Origin", - "Access-Control-Allow-Origin": "http://foobar.com", - "Access-Control-Allow-Methods": "", - "Access-Control-Allow-Headers": "", - "Access-Control-Allow-Credentials": "", - "Access-Control-Max-Age": "", - "Access-Control-Expose-Headers": "X-Header-1, X-Header-2", - }) -} - -func TestAllowedCredentials(t *testing.T) { - s := New(Options{ - AllowedOrigins: []string{"http://foobar.com"}, - AllowCredentials: true, - }) - - res := httptest.NewRecorder() - req, _ := http.NewRequest("OPTIONS", "http://example.com/foo", nil) - req.Header.Add("Origin", "http://foobar.com") - req.Header.Add("Access-Control-Request-Method", "GET") - - s.Handler(testHandler).ServeHTTP(res, req) - - assertHeaders(t, res.Header(), map[string]string{ - "Vary": "Origin, Access-Control-Request-Method, Access-Control-Request-Headers", - "Access-Control-Allow-Origin": "http://foobar.com", - "Access-Control-Allow-Methods": "GET", - "Access-Control-Allow-Headers": "", - "Access-Control-Allow-Credentials": "true", - "Access-Control-Max-Age": "", - "Access-Control-Expose-Headers": "", - }) -} diff --git a/vendor/github.com/rs/cors/utils_test.go b/vendor/github.com/rs/cors/utils_test.go deleted file mode 100644 index 83053b3fc..000000000 --- a/vendor/github.com/rs/cors/utils_test.go +++ /dev/null @@ -1,70 +0,0 @@ -package cors - -import ( - "strings" - "testing" -) - -func TestWildcard(t *testing.T) { - w := wildcard{"foo", "bar"} - if !w.match("foobar") { - t.Error("foo*bar should match foobar") - } - if !w.match("foobazbar") { - t.Error("foo*bar should match foobazbar") - } - if w.match("foobaz") { - t.Error("foo*bar should not match foobaz") - } - - w = wildcard{"foo", "oof"} - if w.match("foof") { - t.Error("foo*oof should not match foof") - } -} - -func TestConvert(t *testing.T) { - s := convert([]string{"A", "b", "C"}, strings.ToLower) - e := []string{"a", "b", "c"} - if s[0] != e[0] || s[1] != e[1] || s[2] != e[2] { - t.Errorf("%v != %v", s, e) - } -} - -func TestParseHeaderList(t *testing.T) { - h := parseHeaderList("header, second-header, THIRD-HEADER, Numb3r3d-H34d3r") - e := []string{"Header", "Second-Header", "Third-Header", "Numb3r3d-H34d3r"} - if h[0] != e[0] || h[1] != e[1] || h[2] != e[2] { - t.Errorf("%v != %v", h, e) - } -} - -func TestParseHeaderListEmpty(t *testing.T) { - if len(parseHeaderList("")) != 0 { - t.Error("should be empty sclice") - } - if len(parseHeaderList(" , ")) != 0 { - t.Error("should be empty sclice") - } -} - -func BenchmarkParseHeaderList(b *testing.B) { - b.ReportAllocs() - for i := 0; i < b.N; i++ { - parseHeaderList("header, second-header, THIRD-HEADER") - } -} - -func BenchmarkParseHeaderListSingle(b *testing.B) { - b.ReportAllocs() - for i := 0; i < b.N; i++ { - parseHeaderList("header") - } -} - -func BenchmarkParseHeaderListNormalized(b *testing.B) { - b.ReportAllocs() - for i := 0; i < b.N; i++ { - parseHeaderList("Header1, Header2, Third-Header") - } -} diff --git a/vendor/github.com/shiena/ansicolor/ansicolor_test.go b/vendor/github.com/shiena/ansicolor/ansicolor_test.go deleted file mode 100644 index 4feeb1de6..000000000 --- a/vendor/github.com/shiena/ansicolor/ansicolor_test.go +++ /dev/null @@ -1,25 +0,0 @@ -package ansicolor_test - -import ( - "bytes" - "testing" - - "github.com/shiena/ansicolor" -) - -func TestNewAnsiColor1(t *testing.T) { - inner := bytes.NewBufferString("") - w := ansicolor.NewAnsiColorWriter(inner) - if w == inner { - t.Errorf("Get %#v, want %#v", w, inner) - } -} - -func TestNewAnsiColor2(t *testing.T) { - inner := bytes.NewBufferString("") - w1 := ansicolor.NewAnsiColorWriter(inner) - w2 := ansicolor.NewAnsiColorWriter(w1) - if w1 != w2 { - t.Errorf("Get %#v, want %#v", w1, w2) - } -} diff --git a/vendor/github.com/shiena/ansicolor/ansicolor_windows_test.go b/vendor/github.com/shiena/ansicolor/ansicolor_windows_test.go deleted file mode 100644 index 6c126d517..000000000 --- a/vendor/github.com/shiena/ansicolor/ansicolor_windows_test.go +++ /dev/null @@ -1,236 +0,0 @@ -// Copyright 2014 shiena Authors. All rights reserved. -// Use of this source code is governed by a MIT-style -// license that can be found in the LICENSE file. - -// +build windows - -package ansicolor_test - -import ( - "bytes" - "fmt" - "syscall" - "testing" - - "github.com/shiena/ansicolor" - . "github.com/shiena/ansicolor" -) - -func TestWritePlanText(t *testing.T) { - inner := bytes.NewBufferString("") - w := ansicolor.NewAnsiColorWriter(inner) - expected := "plain text" - fmt.Fprintf(w, expected) - actual := inner.String() - if actual != expected { - t.Errorf("Get %s, want %s", actual, expected) - } -} - -func TestWriteParseText(t *testing.T) { - inner := bytes.NewBufferString("") - w := ansicolor.NewAnsiColorWriter(inner) - - inputTail := "\x1b[0mtail text" - expectedTail := "tail text" - fmt.Fprintf(w, inputTail) - actualTail := inner.String() - inner.Reset() - if actualTail != expectedTail { - t.Errorf("Get %s, want %s", actualTail, expectedTail) - } - - inputHead := "head text\x1b[0m" - expectedHead := "head text" - fmt.Fprintf(w, inputHead) - actualHead := inner.String() - inner.Reset() - if actualHead != expectedHead { - t.Errorf("Get %s, want %s", actualHead, expectedHead) - } - - inputBothEnds := "both ends \x1b[0m text" - expectedBothEnds := "both ends text" - fmt.Fprintf(w, inputBothEnds) - actualBothEnds := inner.String() - inner.Reset() - if actualBothEnds != expectedBothEnds { - t.Errorf("Get %s, want %s", actualBothEnds, expectedBothEnds) - } - - inputManyEsc := "\x1b\x1b\x1b\x1b[0m many esc" - expectedManyEsc := "\x1b\x1b\x1b many esc" - fmt.Fprintf(w, inputManyEsc) - actualManyEsc := inner.String() - inner.Reset() - if actualManyEsc != expectedManyEsc { - t.Errorf("Get %s, want %s", actualManyEsc, expectedManyEsc) - } - - expectedSplit := "split text" - for _, ch := range "split \x1b[0m text" { - fmt.Fprintf(w, string(ch)) - } - actualSplit := inner.String() - inner.Reset() - if actualSplit != expectedSplit { - t.Errorf("Get %s, want %s", actualSplit, expectedSplit) - } -} - -type screenNotFoundError struct { - error -} - -func writeAnsiColor(expectedText, colorCode string) (actualText string, actualAttributes uint16, err error) { - inner := bytes.NewBufferString("") - w := ansicolor.NewAnsiColorWriter(inner) - fmt.Fprintf(w, "\x1b[%sm%s", colorCode, expectedText) - - actualText = inner.String() - screenInfo := GetConsoleScreenBufferInfo(uintptr(syscall.Stdout)) - if screenInfo != nil { - actualAttributes = screenInfo.WAttributes - } else { - err = &screenNotFoundError{} - } - return -} - -type testParam struct { - text string - attributes uint16 - ansiColor string -} - -func TestWriteAnsiColorText(t *testing.T) { - screenInfo := GetConsoleScreenBufferInfo(uintptr(syscall.Stdout)) - if screenInfo == nil { - t.Fatal("Could not get ConsoleScreenBufferInfo") - } - defer ChangeColor(screenInfo.WAttributes) - defaultFgColor := screenInfo.WAttributes & uint16(0x0007) - defaultBgColor := screenInfo.WAttributes & uint16(0x0070) - defaultFgIntensity := screenInfo.WAttributes & uint16(0x0008) - defaultBgIntensity := screenInfo.WAttributes & uint16(0x0080) - - fgParam := []testParam{ - {"foreground black ", uint16(0x0000 | 0x0000), "30"}, - {"foreground red ", uint16(0x0004 | 0x0000), "31"}, - {"foreground green ", uint16(0x0002 | 0x0000), "32"}, - {"foreground yellow ", uint16(0x0006 | 0x0000), "33"}, - {"foreground blue ", uint16(0x0001 | 0x0000), "34"}, - {"foreground magenta", uint16(0x0005 | 0x0000), "35"}, - {"foreground cyan ", uint16(0x0003 | 0x0000), "36"}, - {"foreground white ", uint16(0x0007 | 0x0000), "37"}, - {"foreground default", defaultFgColor | 0x0000, "39"}, - {"foreground light gray ", uint16(0x0000 | 0x0008 | 0x0000), "90"}, - {"foreground light red ", uint16(0x0004 | 0x0008 | 0x0000), "91"}, - {"foreground light green ", uint16(0x0002 | 0x0008 | 0x0000), "92"}, - {"foreground light yellow ", uint16(0x0006 | 0x0008 | 0x0000), "93"}, - {"foreground light blue ", uint16(0x0001 | 0x0008 | 0x0000), "94"}, - {"foreground light magenta", uint16(0x0005 | 0x0008 | 0x0000), "95"}, - {"foreground light cyan ", uint16(0x0003 | 0x0008 | 0x0000), "96"}, - {"foreground light white ", uint16(0x0007 | 0x0008 | 0x0000), "97"}, - } - - bgParam := []testParam{ - {"background black ", uint16(0x0007 | 0x0000), "40"}, - {"background red ", uint16(0x0007 | 0x0040), "41"}, - {"background green ", uint16(0x0007 | 0x0020), "42"}, - {"background yellow ", uint16(0x0007 | 0x0060), "43"}, - {"background blue ", uint16(0x0007 | 0x0010), "44"}, - {"background magenta", uint16(0x0007 | 0x0050), "45"}, - {"background cyan ", uint16(0x0007 | 0x0030), "46"}, - {"background white ", uint16(0x0007 | 0x0070), "47"}, - {"background default", uint16(0x0007) | defaultBgColor, "49"}, - {"background light gray ", uint16(0x0007 | 0x0000 | 0x0080), "100"}, - {"background light red ", uint16(0x0007 | 0x0040 | 0x0080), "101"}, - {"background light green ", uint16(0x0007 | 0x0020 | 0x0080), "102"}, - {"background light yellow ", uint16(0x0007 | 0x0060 | 0x0080), "103"}, - {"background light blue ", uint16(0x0007 | 0x0010 | 0x0080), "104"}, - {"background light magenta", uint16(0x0007 | 0x0050 | 0x0080), "105"}, - {"background light cyan ", uint16(0x0007 | 0x0030 | 0x0080), "106"}, - {"background light white ", uint16(0x0007 | 0x0070 | 0x0080), "107"}, - } - - resetParam := []testParam{ - {"all reset", defaultFgColor | defaultBgColor | defaultFgIntensity | defaultBgIntensity, "0"}, - {"all reset", defaultFgColor | defaultBgColor | defaultFgIntensity | defaultBgIntensity, ""}, - } - - boldParam := []testParam{ - {"bold on", uint16(0x0007 | 0x0008), "1"}, - {"bold off", uint16(0x0007), "21"}, - } - - underscoreParam := []testParam{ - {"underscore on", uint16(0x0007 | 0x8000), "4"}, - {"underscore off", uint16(0x0007), "24"}, - } - - blinkParam := []testParam{ - {"blink on", uint16(0x0007 | 0x0080), "5"}, - {"blink off", uint16(0x0007), "25"}, - } - - mixedParam := []testParam{ - {"both black, bold, underline, blink", uint16(0x0000 | 0x0000 | 0x0008 | 0x8000 | 0x0080), "30;40;1;4;5"}, - {"both red, bold, underline, blink", uint16(0x0004 | 0x0040 | 0x0008 | 0x8000 | 0x0080), "31;41;1;4;5"}, - {"both green, bold, underline, blink", uint16(0x0002 | 0x0020 | 0x0008 | 0x8000 | 0x0080), "32;42;1;4;5"}, - {"both yellow, bold, underline, blink", uint16(0x0006 | 0x0060 | 0x0008 | 0x8000 | 0x0080), "33;43;1;4;5"}, - {"both blue, bold, underline, blink", uint16(0x0001 | 0x0010 | 0x0008 | 0x8000 | 0x0080), "34;44;1;4;5"}, - {"both magenta, bold, underline, blink", uint16(0x0005 | 0x0050 | 0x0008 | 0x8000 | 0x0080), "35;45;1;4;5"}, - {"both cyan, bold, underline, blink", uint16(0x0003 | 0x0030 | 0x0008 | 0x8000 | 0x0080), "36;46;1;4;5"}, - {"both white, bold, underline, blink", uint16(0x0007 | 0x0070 | 0x0008 | 0x8000 | 0x0080), "37;47;1;4;5"}, - {"both default, bold, underline, blink", uint16(defaultFgColor | defaultBgColor | 0x0008 | 0x8000 | 0x0080), "39;49;1;4;5"}, - } - - assertTextAttribute := func(expectedText string, expectedAttributes uint16, ansiColor string) { - actualText, actualAttributes, err := writeAnsiColor(expectedText, ansiColor) - if actualText != expectedText { - t.Errorf("Get %s, want %s", actualText, expectedText) - } - if err != nil { - t.Fatal("Could not get ConsoleScreenBufferInfo") - } - if actualAttributes != expectedAttributes { - t.Errorf("Text: %s, Get 0x%04x, want 0x%04x", expectedText, actualAttributes, expectedAttributes) - } - } - - for _, v := range fgParam { - ResetColor() - assertTextAttribute(v.text, v.attributes, v.ansiColor) - } - - for _, v := range bgParam { - ChangeColor(uint16(0x0070 | 0x0007)) - assertTextAttribute(v.text, v.attributes, v.ansiColor) - } - - for _, v := range resetParam { - ChangeColor(uint16(0x0000 | 0x0070 | 0x0008)) - assertTextAttribute(v.text, v.attributes, v.ansiColor) - } - - ResetColor() - for _, v := range boldParam { - assertTextAttribute(v.text, v.attributes, v.ansiColor) - } - - ResetColor() - for _, v := range underscoreParam { - assertTextAttribute(v.text, v.attributes, v.ansiColor) - } - - ResetColor() - for _, v := range blinkParam { - assertTextAttribute(v.text, v.attributes, v.ansiColor) - } - - for _, v := range mixedParam { - ResetColor() - assertTextAttribute(v.text, v.attributes, v.ansiColor) - } -} diff --git a/vendor/github.com/shiena/ansicolor/example_test.go b/vendor/github.com/shiena/ansicolor/example_test.go deleted file mode 100644 index f2ac67c17..000000000 --- a/vendor/github.com/shiena/ansicolor/example_test.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2014 shiena Authors. All rights reserved. -// Use of this source code is governed by a MIT-style -// license that can be found in the LICENSE file. - -package ansicolor_test - -import ( - "fmt" - "os" - - "github.com/shiena/ansicolor" -) - -func ExampleNewAnsiColorWriter() { - w := ansicolor.NewAnsiColorWriter(os.Stdout) - text := "%sforeground %sbold%s %sbackground%s\n" - fmt.Fprintf(w, text, "\x1b[31m", "\x1b[1m", "\x1b[21m", "\x1b[41;32m", "\x1b[0m") - fmt.Fprintf(w, text, "\x1b[32m", "\x1b[1m", "\x1b[21m", "\x1b[42;31m", "\x1b[0m") - fmt.Fprintf(w, text, "\x1b[33m", "\x1b[1m", "\x1b[21m", "\x1b[43;34m", "\x1b[0m") - fmt.Fprintf(w, text, "\x1b[34m", "\x1b[1m", "\x1b[21m", "\x1b[44;33m", "\x1b[0m") - fmt.Fprintf(w, text, "\x1b[35m", "\x1b[1m", "\x1b[21m", "\x1b[45;36m", "\x1b[0m") - fmt.Fprintf(w, text, "\x1b[36m", "\x1b[1m", "\x1b[21m", "\x1b[46;35m", "\x1b[0m") - fmt.Fprintf(w, text, "\x1b[37m", "\x1b[1m", "\x1b[21m", "\x1b[47;30m", "\x1b[0m") -} diff --git a/vendor/github.com/shiena/ansicolor/export_test.go b/vendor/github.com/shiena/ansicolor/export_test.go deleted file mode 100644 index 6d2f7c074..000000000 --- a/vendor/github.com/shiena/ansicolor/export_test.go +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2014 shiena Authors. All rights reserved. -// Use of this source code is governed by a MIT-style -// license that can be found in the LICENSE file. - -// +build windows - -package ansicolor - -import "syscall" - -var GetConsoleScreenBufferInfo = getConsoleScreenBufferInfo - -func ChangeColor(color uint16) { - setConsoleTextAttribute(uintptr(syscall.Stdout), color) -} - -func ResetColor() { - ChangeColor(uint16(0x0007)) -} diff --git a/vendor/github.com/weekface/mgorus/LICENSE b/vendor/github.com/weekface/mgorus/LICENSE deleted file mode 100644 index 20efd1b3e..000000000 --- a/vendor/github.com/weekface/mgorus/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION 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/weekface/mgorus/README.md b/vendor/github.com/weekface/mgorus/README.md deleted file mode 100644 index fb4e5128c..000000000 --- a/vendor/github.com/weekface/mgorus/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# Mongodb Hooks for [Logrus](https://github.com/Sirupsen/logrus) :walrus: - -## Install - -```shell -$ go get github.com/weekface/mgorus -``` - -## Usage - -```go -package main - -import ( - "github.com/Sirupsen/logrus" - "github.com/weekface/mgorus" -) - -func main() { - log := logrus.New() - hooker, err := mgorus.NewHooker("localhost:27017", "db", "collection") - if err == nil { - log.Hooks.Add(hooker) - } - - log.WithFields(logrus.Fields{ - "name": "zhangsan", - "age": 28, - }).Error("Hello world!") -} -``` - -## License -*MIT* diff --git a/vendor/github.com/weekface/mgorus/mgorus.go b/vendor/github.com/weekface/mgorus/mgorus.go deleted file mode 100644 index 02fb63c08..000000000 --- a/vendor/github.com/weekface/mgorus/mgorus.go +++ /dev/null @@ -1,47 +0,0 @@ -package mgorus - -import ( - "fmt" - - "github.com/Sirupsen/logrus" - "gopkg.in/mgo.v2" - "gopkg.in/mgo.v2/bson" -) - -type hooker struct { - c *mgo.Collection -} - -type M bson.M - -func NewHooker(mgoUrl, db, collection string) (*hooker, error) { - session, err := mgo.Dial(mgoUrl) - if err != nil { - return nil, err - } - - return &hooker{c: session.DB(db).C(collection)}, nil -} - -func (h *hooker) Fire(entry *logrus.Entry) error { - entry.Data["Level"] = entry.Level.String() - entry.Data["Time"] = entry.Time - entry.Data["Message"] = entry.Message - mgoErr := h.c.Insert(M(entry.Data)) - if mgoErr != nil { - return fmt.Errorf("Failed to send log entry to mongodb: %s", mgoErr) - } - - return nil -} - -func (h *hooker) Levels() []logrus.Level { - return []logrus.Level{ - logrus.PanicLevel, - logrus.FatalLevel, - logrus.ErrorLevel, - logrus.WarnLevel, - logrus.InfoLevel, - logrus.DebugLevel, - } -} diff --git a/vendor/gopkg.in/check.v1/benchmark_test.go b/vendor/gopkg.in/check.v1/benchmark_test.go deleted file mode 100644 index 4dd827c16..000000000 --- a/vendor/gopkg.in/check.v1/benchmark_test.go +++ /dev/null @@ -1,91 +0,0 @@ -// These tests verify the test running logic. - -package check_test - -import ( - "time" - . "gopkg.in/check.v1" -) - -var benchmarkS = Suite(&BenchmarkS{}) - -type BenchmarkS struct{} - -func (s *BenchmarkS) TestCountSuite(c *C) { - suitesRun += 1 -} - -func (s *BenchmarkS) TestBasicTestTiming(c *C) { - helper := FixtureHelper{sleepOn: "Test1", sleep: 1000000 * time.Nanosecond} - output := String{} - runConf := RunConf{Output: &output, Verbose: true} - Run(&helper, &runConf) - - expected := "PASS: check_test\\.go:[0-9]+: FixtureHelper\\.Test1\t0\\.001s\n" + - "PASS: check_test\\.go:[0-9]+: FixtureHelper\\.Test2\t0\\.000s\n" - c.Assert(output.value, Matches, expected) -} - -func (s *BenchmarkS) TestStreamTestTiming(c *C) { - helper := FixtureHelper{sleepOn: "SetUpSuite", sleep: 1000000 * time.Nanosecond} - output := String{} - runConf := RunConf{Output: &output, Stream: true} - Run(&helper, &runConf) - - expected := "(?s).*\nPASS: check_test\\.go:[0-9]+: FixtureHelper\\.SetUpSuite\t *0\\.001s\n.*" - c.Assert(output.value, Matches, expected) -} - -func (s *BenchmarkS) TestBenchmark(c *C) { - helper := FixtureHelper{sleep: 100000} - output := String{} - runConf := RunConf{ - Output: &output, - Benchmark: true, - BenchmarkTime: 10000000, - Filter: "Benchmark1", - } - Run(&helper, &runConf) - c.Check(helper.calls[0], Equals, "SetUpSuite") - c.Check(helper.calls[1], Equals, "SetUpTest") - c.Check(helper.calls[2], Equals, "Benchmark1") - c.Check(helper.calls[3], Equals, "TearDownTest") - c.Check(helper.calls[4], Equals, "SetUpTest") - c.Check(helper.calls[5], Equals, "Benchmark1") - c.Check(helper.calls[6], Equals, "TearDownTest") - // ... and more. - - expected := "PASS: check_test\\.go:[0-9]+: FixtureHelper\\.Benchmark1\t *100\t *[12][0-9]{5} ns/op\n" - c.Assert(output.value, Matches, expected) -} - -func (s *BenchmarkS) TestBenchmarkBytes(c *C) { - helper := FixtureHelper{sleep: 100000} - output := String{} - runConf := RunConf{ - Output: &output, - Benchmark: true, - BenchmarkTime: 10000000, - Filter: "Benchmark2", - } - Run(&helper, &runConf) - - expected := "PASS: check_test\\.go:[0-9]+: FixtureHelper\\.Benchmark2\t *100\t *[12][0-9]{5} ns/op\t *[4-9]\\.[0-9]{2} MB/s\n" - c.Assert(output.value, Matches, expected) -} - -func (s *BenchmarkS) TestBenchmarkMem(c *C) { - helper := FixtureHelper{sleep: 100000} - output := String{} - runConf := RunConf{ - Output: &output, - Benchmark: true, - BenchmarkMem: true, - BenchmarkTime: 10000000, - Filter: "Benchmark3", - } - Run(&helper, &runConf) - - expected := "PASS: check_test\\.go:[0-9]+: FixtureHelper\\.Benchmark3\t *100\t *[12][0-9]{5} ns/op\t *[0-9]+ B/op\t *[1-9] allocs/op\n" - c.Assert(output.value, Matches, expected) -} diff --git a/vendor/gopkg.in/check.v1/bootstrap_test.go b/vendor/gopkg.in/check.v1/bootstrap_test.go deleted file mode 100644 index e55f327c7..000000000 --- a/vendor/gopkg.in/check.v1/bootstrap_test.go +++ /dev/null @@ -1,82 +0,0 @@ -// These initial tests are for bootstrapping. They verify that we can -// basically use the testing infrastructure itself to check if the test -// system is working. -// -// These tests use will break down the test runner badly in case of -// errors because if they simply fail, we can't be sure the developer -// will ever see anything (because failing means the failing system -// somehow isn't working! :-) -// -// Do not assume *any* internal functionality works as expected besides -// what's actually tested here. - -package check_test - -import ( - "fmt" - "gopkg.in/check.v1" - "strings" -) - -type BootstrapS struct{} - -var boostrapS = check.Suite(&BootstrapS{}) - -func (s *BootstrapS) TestCountSuite(c *check.C) { - suitesRun += 1 -} - -func (s *BootstrapS) TestFailedAndFail(c *check.C) { - if c.Failed() { - critical("c.Failed() must be false first!") - } - c.Fail() - if !c.Failed() { - critical("c.Fail() didn't put the test in a failed state!") - } - c.Succeed() -} - -func (s *BootstrapS) TestFailedAndSucceed(c *check.C) { - c.Fail() - c.Succeed() - if c.Failed() { - critical("c.Succeed() didn't put the test back in a non-failed state") - } -} - -func (s *BootstrapS) TestLogAndGetTestLog(c *check.C) { - c.Log("Hello there!") - log := c.GetTestLog() - if log != "Hello there!\n" { - critical(fmt.Sprintf("Log() or GetTestLog() is not working! Got: %#v", log)) - } -} - -func (s *BootstrapS) TestLogfAndGetTestLog(c *check.C) { - c.Logf("Hello %v", "there!") - log := c.GetTestLog() - if log != "Hello there!\n" { - critical(fmt.Sprintf("Logf() or GetTestLog() is not working! Got: %#v", log)) - } -} - -func (s *BootstrapS) TestRunShowsErrors(c *check.C) { - output := String{} - check.Run(&FailHelper{}, &check.RunConf{Output: &output}) - if strings.Index(output.value, "Expected failure!") == -1 { - critical(fmt.Sprintf("RunWithWriter() output did not contain the "+ - "expected failure! Got: %#v", - output.value)) - } -} - -func (s *BootstrapS) TestRunDoesntShowSuccesses(c *check.C) { - output := String{} - check.Run(&SuccessHelper{}, &check.RunConf{Output: &output}) - if strings.Index(output.value, "Expected success!") != -1 { - critical(fmt.Sprintf("RunWithWriter() output contained a successful "+ - "test! Got: %#v", - output.value)) - } -} diff --git a/vendor/gopkg.in/check.v1/check_test.go b/vendor/gopkg.in/check.v1/check_test.go deleted file mode 100644 index 871b32527..000000000 --- a/vendor/gopkg.in/check.v1/check_test.go +++ /dev/null @@ -1,207 +0,0 @@ -// This file contains just a few generic helpers which are used by the -// other test files. - -package check_test - -import ( - "flag" - "fmt" - "os" - "regexp" - "runtime" - "testing" - "time" - - "gopkg.in/check.v1" -) - -// We count the number of suites run at least to get a vague hint that the -// test suite is behaving as it should. Otherwise a bug introduced at the -// very core of the system could go unperceived. -const suitesRunExpected = 8 - -var suitesRun int = 0 - -func Test(t *testing.T) { - check.TestingT(t) - if suitesRun != suitesRunExpected && flag.Lookup("check.f").Value.String() == "" { - critical(fmt.Sprintf("Expected %d suites to run rather than %d", - suitesRunExpected, suitesRun)) - } -} - -// ----------------------------------------------------------------------- -// Helper functions. - -// Break down badly. This is used in test cases which can't yet assume -// that the fundamental bits are working. -func critical(error string) { - fmt.Fprintln(os.Stderr, "CRITICAL: "+error) - os.Exit(1) -} - -// Return the file line where it's called. -func getMyLine() int { - if _, _, line, ok := runtime.Caller(1); ok { - return line - } - return -1 -} - -// ----------------------------------------------------------------------- -// Helper type implementing a basic io.Writer for testing output. - -// Type implementing the io.Writer interface for analyzing output. -type String struct { - value string -} - -// The only function required by the io.Writer interface. Will append -// written data to the String.value string. -func (s *String) Write(p []byte) (n int, err error) { - s.value += string(p) - return len(p), nil -} - -// Trivial wrapper to test errors happening on a different file -// than the test itself. -func checkEqualWrapper(c *check.C, obtained, expected interface{}) (result bool, line int) { - return c.Check(obtained, check.Equals, expected), getMyLine() -} - -// ----------------------------------------------------------------------- -// Helper suite for testing basic fail behavior. - -type FailHelper struct { - testLine int -} - -func (s *FailHelper) TestLogAndFail(c *check.C) { - s.testLine = getMyLine() - 1 - c.Log("Expected failure!") - c.Fail() -} - -// ----------------------------------------------------------------------- -// Helper suite for testing basic success behavior. - -type SuccessHelper struct{} - -func (s *SuccessHelper) TestLogAndSucceed(c *check.C) { - c.Log("Expected success!") -} - -// ----------------------------------------------------------------------- -// Helper suite for testing ordering and behavior of fixture. - -type FixtureHelper struct { - calls []string - panicOn string - skip bool - skipOnN int - sleepOn string - sleep time.Duration - bytes int64 -} - -func (s *FixtureHelper) trace(name string, c *check.C) { - s.calls = append(s.calls, name) - if name == s.panicOn { - panic(name) - } - if s.sleep > 0 && s.sleepOn == name { - time.Sleep(s.sleep) - } - if s.skip && s.skipOnN == len(s.calls)-1 { - c.Skip("skipOnN == n") - } -} - -func (s *FixtureHelper) SetUpSuite(c *check.C) { - s.trace("SetUpSuite", c) -} - -func (s *FixtureHelper) TearDownSuite(c *check.C) { - s.trace("TearDownSuite", c) -} - -func (s *FixtureHelper) SetUpTest(c *check.C) { - s.trace("SetUpTest", c) -} - -func (s *FixtureHelper) TearDownTest(c *check.C) { - s.trace("TearDownTest", c) -} - -func (s *FixtureHelper) Test1(c *check.C) { - s.trace("Test1", c) -} - -func (s *FixtureHelper) Test2(c *check.C) { - s.trace("Test2", c) -} - -func (s *FixtureHelper) Benchmark1(c *check.C) { - s.trace("Benchmark1", c) - for i := 0; i < c.N; i++ { - time.Sleep(s.sleep) - } -} - -func (s *FixtureHelper) Benchmark2(c *check.C) { - s.trace("Benchmark2", c) - c.SetBytes(1024) - for i := 0; i < c.N; i++ { - time.Sleep(s.sleep) - } -} - -func (s *FixtureHelper) Benchmark3(c *check.C) { - var x []int64 - s.trace("Benchmark3", c) - for i := 0; i < c.N; i++ { - time.Sleep(s.sleep) - x = make([]int64, 5) - _ = x - } -} - -// ----------------------------------------------------------------------- -// Helper which checks the state of the test and ensures that it matches -// the given expectations. Depends on c.Errorf() working, so shouldn't -// be used to test this one function. - -type expectedState struct { - name string - result interface{} - failed bool - log string -} - -// Verify the state of the test. Note that since this also verifies if -// the test is supposed to be in a failed state, no other checks should -// be done in addition to what is being tested. -func checkState(c *check.C, result interface{}, expected *expectedState) { - failed := c.Failed() - c.Succeed() - log := c.GetTestLog() - matched, matchError := regexp.MatchString("^"+expected.log+"$", log) - if matchError != nil { - c.Errorf("Error in matching expression used in testing %s", - expected.name) - } else if !matched { - c.Errorf("%s logged:\n----------\n%s----------\n\nExpected:\n----------\n%s\n----------", - expected.name, log, expected.log) - } - if result != expected.result { - c.Errorf("%s returned %#v rather than %#v", - expected.name, result, expected.result) - } - if failed != expected.failed { - if failed { - c.Errorf("%s has failed when it shouldn't", expected.name) - } else { - c.Errorf("%s has not failed when it should", expected.name) - } - } -} diff --git a/vendor/gopkg.in/check.v1/checkers_test.go b/vendor/gopkg.in/check.v1/checkers_test.go deleted file mode 100644 index 5c6974746..000000000 --- a/vendor/gopkg.in/check.v1/checkers_test.go +++ /dev/null @@ -1,272 +0,0 @@ -package check_test - -import ( - "errors" - "gopkg.in/check.v1" - "reflect" - "runtime" -) - -type CheckersS struct{} - -var _ = check.Suite(&CheckersS{}) - -func testInfo(c *check.C, checker check.Checker, name string, paramNames []string) { - info := checker.Info() - if info.Name != name { - c.Fatalf("Got name %s, expected %s", info.Name, name) - } - if !reflect.DeepEqual(info.Params, paramNames) { - c.Fatalf("Got param names %#v, expected %#v", info.Params, paramNames) - } -} - -func testCheck(c *check.C, checker check.Checker, result bool, error string, params ...interface{}) ([]interface{}, []string) { - info := checker.Info() - if len(params) != len(info.Params) { - c.Fatalf("unexpected param count in test; expected %d got %d", len(info.Params), len(params)) - } - names := append([]string{}, info.Params...) - result_, error_ := checker.Check(params, names) - if result_ != result || error_ != error { - c.Fatalf("%s.Check(%#v) returned (%#v, %#v) rather than (%#v, %#v)", - info.Name, params, result_, error_, result, error) - } - return params, names -} - -func (s *CheckersS) TestComment(c *check.C) { - bug := check.Commentf("a %d bc", 42) - comment := bug.CheckCommentString() - if comment != "a 42 bc" { - c.Fatalf("Commentf returned %#v", comment) - } -} - -func (s *CheckersS) TestIsNil(c *check.C) { - testInfo(c, check.IsNil, "IsNil", []string{"value"}) - - testCheck(c, check.IsNil, true, "", nil) - testCheck(c, check.IsNil, false, "", "a") - - testCheck(c, check.IsNil, true, "", (chan int)(nil)) - testCheck(c, check.IsNil, false, "", make(chan int)) - testCheck(c, check.IsNil, true, "", (error)(nil)) - testCheck(c, check.IsNil, false, "", errors.New("")) - testCheck(c, check.IsNil, true, "", ([]int)(nil)) - testCheck(c, check.IsNil, false, "", make([]int, 1)) - testCheck(c, check.IsNil, false, "", int(0)) -} - -func (s *CheckersS) TestNotNil(c *check.C) { - testInfo(c, check.NotNil, "NotNil", []string{"value"}) - - testCheck(c, check.NotNil, false, "", nil) - testCheck(c, check.NotNil, true, "", "a") - - testCheck(c, check.NotNil, false, "", (chan int)(nil)) - testCheck(c, check.NotNil, true, "", make(chan int)) - testCheck(c, check.NotNil, false, "", (error)(nil)) - testCheck(c, check.NotNil, true, "", errors.New("")) - testCheck(c, check.NotNil, false, "", ([]int)(nil)) - testCheck(c, check.NotNil, true, "", make([]int, 1)) -} - -func (s *CheckersS) TestNot(c *check.C) { - testInfo(c, check.Not(check.IsNil), "Not(IsNil)", []string{"value"}) - - testCheck(c, check.Not(check.IsNil), false, "", nil) - testCheck(c, check.Not(check.IsNil), true, "", "a") -} - -type simpleStruct struct { - i int -} - -func (s *CheckersS) TestEquals(c *check.C) { - testInfo(c, check.Equals, "Equals", []string{"obtained", "expected"}) - - // The simplest. - testCheck(c, check.Equals, true, "", 42, 42) - testCheck(c, check.Equals, false, "", 42, 43) - - // Different native types. - testCheck(c, check.Equals, false, "", int32(42), int64(42)) - - // With nil. - testCheck(c, check.Equals, false, "", 42, nil) - - // Slices - testCheck(c, check.Equals, false, "runtime error: comparing uncomparable type []uint8", []byte{1, 2}, []byte{1, 2}) - - // Struct values - testCheck(c, check.Equals, true, "", simpleStruct{1}, simpleStruct{1}) - testCheck(c, check.Equals, false, "", simpleStruct{1}, simpleStruct{2}) - - // Struct pointers - testCheck(c, check.Equals, false, "", &simpleStruct{1}, &simpleStruct{1}) - testCheck(c, check.Equals, false, "", &simpleStruct{1}, &simpleStruct{2}) -} - -func (s *CheckersS) TestDeepEquals(c *check.C) { - testInfo(c, check.DeepEquals, "DeepEquals", []string{"obtained", "expected"}) - - // The simplest. - testCheck(c, check.DeepEquals, true, "", 42, 42) - testCheck(c, check.DeepEquals, false, "", 42, 43) - - // Different native types. - testCheck(c, check.DeepEquals, false, "", int32(42), int64(42)) - - // With nil. - testCheck(c, check.DeepEquals, false, "", 42, nil) - - // Slices - testCheck(c, check.DeepEquals, true, "", []byte{1, 2}, []byte{1, 2}) - testCheck(c, check.DeepEquals, false, "", []byte{1, 2}, []byte{1, 3}) - - // Struct values - testCheck(c, check.DeepEquals, true, "", simpleStruct{1}, simpleStruct{1}) - testCheck(c, check.DeepEquals, false, "", simpleStruct{1}, simpleStruct{2}) - - // Struct pointers - testCheck(c, check.DeepEquals, true, "", &simpleStruct{1}, &simpleStruct{1}) - testCheck(c, check.DeepEquals, false, "", &simpleStruct{1}, &simpleStruct{2}) -} - -func (s *CheckersS) TestHasLen(c *check.C) { - testInfo(c, check.HasLen, "HasLen", []string{"obtained", "n"}) - - testCheck(c, check.HasLen, true, "", "abcd", 4) - testCheck(c, check.HasLen, true, "", []int{1, 2}, 2) - testCheck(c, check.HasLen, false, "", []int{1, 2}, 3) - - testCheck(c, check.HasLen, false, "n must be an int", []int{1, 2}, "2") - testCheck(c, check.HasLen, false, "obtained value type has no length", nil, 2) -} - -func (s *CheckersS) TestErrorMatches(c *check.C) { - testInfo(c, check.ErrorMatches, "ErrorMatches", []string{"value", "regex"}) - - testCheck(c, check.ErrorMatches, false, "Error value is nil", nil, "some error") - testCheck(c, check.ErrorMatches, false, "Value is not an error", 1, "some error") - testCheck(c, check.ErrorMatches, true, "", errors.New("some error"), "some error") - testCheck(c, check.ErrorMatches, true, "", errors.New("some error"), "so.*or") - - // Verify params mutation - params, names := testCheck(c, check.ErrorMatches, false, "", errors.New("some error"), "other error") - c.Assert(params[0], check.Equals, "some error") - c.Assert(names[0], check.Equals, "error") -} - -func (s *CheckersS) TestMatches(c *check.C) { - testInfo(c, check.Matches, "Matches", []string{"value", "regex"}) - - // Simple matching - testCheck(c, check.Matches, true, "", "abc", "abc") - testCheck(c, check.Matches, true, "", "abc", "a.c") - - // Must match fully - testCheck(c, check.Matches, false, "", "abc", "ab") - testCheck(c, check.Matches, false, "", "abc", "bc") - - // String()-enabled values accepted - testCheck(c, check.Matches, true, "", reflect.ValueOf("abc"), "a.c") - testCheck(c, check.Matches, false, "", reflect.ValueOf("abc"), "a.d") - - // Some error conditions. - testCheck(c, check.Matches, false, "Obtained value is not a string and has no .String()", 1, "a.c") - testCheck(c, check.Matches, false, "Can't compile regex: error parsing regexp: missing closing ]: `[c$`", "abc", "a[c") -} - -func (s *CheckersS) TestPanics(c *check.C) { - testInfo(c, check.Panics, "Panics", []string{"function", "expected"}) - - // Some errors. - testCheck(c, check.Panics, false, "Function has not panicked", func() bool { return false }, "BOOM") - testCheck(c, check.Panics, false, "Function must take zero arguments", 1, "BOOM") - - // Plain strings. - testCheck(c, check.Panics, true, "", func() { panic("BOOM") }, "BOOM") - testCheck(c, check.Panics, false, "", func() { panic("KABOOM") }, "BOOM") - testCheck(c, check.Panics, true, "", func() bool { panic("BOOM") }, "BOOM") - - // Error values. - testCheck(c, check.Panics, true, "", func() { panic(errors.New("BOOM")) }, errors.New("BOOM")) - testCheck(c, check.Panics, false, "", func() { panic(errors.New("KABOOM")) }, errors.New("BOOM")) - - type deep struct{ i int } - // Deep value - testCheck(c, check.Panics, true, "", func() { panic(&deep{99}) }, &deep{99}) - - // Verify params/names mutation - params, names := testCheck(c, check.Panics, false, "", func() { panic(errors.New("KABOOM")) }, errors.New("BOOM")) - c.Assert(params[0], check.ErrorMatches, "KABOOM") - c.Assert(names[0], check.Equals, "panic") - - // Verify a nil panic - testCheck(c, check.Panics, true, "", func() { panic(nil) }, nil) - testCheck(c, check.Panics, false, "", func() { panic(nil) }, "NOPE") -} - -func (s *CheckersS) TestPanicMatches(c *check.C) { - testInfo(c, check.PanicMatches, "PanicMatches", []string{"function", "expected"}) - - // Error matching. - testCheck(c, check.PanicMatches, true, "", func() { panic(errors.New("BOOM")) }, "BO.M") - testCheck(c, check.PanicMatches, false, "", func() { panic(errors.New("KABOOM")) }, "BO.M") - - // Some errors. - testCheck(c, check.PanicMatches, false, "Function has not panicked", func() bool { return false }, "BOOM") - testCheck(c, check.PanicMatches, false, "Function must take zero arguments", 1, "BOOM") - - // Plain strings. - testCheck(c, check.PanicMatches, true, "", func() { panic("BOOM") }, "BO.M") - testCheck(c, check.PanicMatches, false, "", func() { panic("KABOOM") }, "BOOM") - testCheck(c, check.PanicMatches, true, "", func() bool { panic("BOOM") }, "BO.M") - - // Verify params/names mutation - params, names := testCheck(c, check.PanicMatches, false, "", func() { panic(errors.New("KABOOM")) }, "BOOM") - c.Assert(params[0], check.Equals, "KABOOM") - c.Assert(names[0], check.Equals, "panic") - - // Verify a nil panic - testCheck(c, check.PanicMatches, false, "Panic value is not a string or an error", func() { panic(nil) }, "") -} - -func (s *CheckersS) TestFitsTypeOf(c *check.C) { - testInfo(c, check.FitsTypeOf, "FitsTypeOf", []string{"obtained", "sample"}) - - // Basic types - testCheck(c, check.FitsTypeOf, true, "", 1, 0) - testCheck(c, check.FitsTypeOf, false, "", 1, int64(0)) - - // Aliases - testCheck(c, check.FitsTypeOf, false, "", 1, errors.New("")) - testCheck(c, check.FitsTypeOf, false, "", "error", errors.New("")) - testCheck(c, check.FitsTypeOf, true, "", errors.New("error"), errors.New("")) - - // Structures - testCheck(c, check.FitsTypeOf, false, "", 1, simpleStruct{}) - testCheck(c, check.FitsTypeOf, false, "", simpleStruct{42}, &simpleStruct{}) - testCheck(c, check.FitsTypeOf, true, "", simpleStruct{42}, simpleStruct{}) - testCheck(c, check.FitsTypeOf, true, "", &simpleStruct{42}, &simpleStruct{}) - - // Some bad values - testCheck(c, check.FitsTypeOf, false, "Invalid sample value", 1, interface{}(nil)) - testCheck(c, check.FitsTypeOf, false, "", interface{}(nil), 0) -} - -func (s *CheckersS) TestImplements(c *check.C) { - testInfo(c, check.Implements, "Implements", []string{"obtained", "ifaceptr"}) - - var e error - var re runtime.Error - testCheck(c, check.Implements, true, "", errors.New(""), &e) - testCheck(c, check.Implements, false, "", errors.New(""), &re) - - // Some bad values - testCheck(c, check.Implements, false, "ifaceptr should be a pointer to an interface variable", 0, errors.New("")) - testCheck(c, check.Implements, false, "ifaceptr should be a pointer to an interface variable", 0, interface{}(nil)) - testCheck(c, check.Implements, false, "", interface{}(nil), &e) -} diff --git a/vendor/gopkg.in/check.v1/export_test.go b/vendor/gopkg.in/check.v1/export_test.go deleted file mode 100644 index 0e6cfe0f2..000000000 --- a/vendor/gopkg.in/check.v1/export_test.go +++ /dev/null @@ -1,9 +0,0 @@ -package check - -func PrintLine(filename string, line int) (string, error) { - return printLine(filename, line) -} - -func Indent(s, with string) string { - return indent(s, with) -} diff --git a/vendor/gopkg.in/check.v1/fixture_test.go b/vendor/gopkg.in/check.v1/fixture_test.go deleted file mode 100644 index 2bff9e163..000000000 --- a/vendor/gopkg.in/check.v1/fixture_test.go +++ /dev/null @@ -1,484 +0,0 @@ -// Tests for the behavior of the test fixture system. - -package check_test - -import ( - . "gopkg.in/check.v1" -) - -// ----------------------------------------------------------------------- -// Fixture test suite. - -type FixtureS struct{} - -var fixtureS = Suite(&FixtureS{}) - -func (s *FixtureS) TestCountSuite(c *C) { - suitesRun += 1 -} - -// ----------------------------------------------------------------------- -// Basic fixture ordering verification. - -func (s *FixtureS) TestOrder(c *C) { - helper := FixtureHelper{} - Run(&helper, nil) - c.Check(helper.calls[0], Equals, "SetUpSuite") - c.Check(helper.calls[1], Equals, "SetUpTest") - c.Check(helper.calls[2], Equals, "Test1") - c.Check(helper.calls[3], Equals, "TearDownTest") - c.Check(helper.calls[4], Equals, "SetUpTest") - c.Check(helper.calls[5], Equals, "Test2") - c.Check(helper.calls[6], Equals, "TearDownTest") - c.Check(helper.calls[7], Equals, "TearDownSuite") - c.Check(len(helper.calls), Equals, 8) -} - -// ----------------------------------------------------------------------- -// Check the behavior when panics occur within tests and fixtures. - -func (s *FixtureS) TestPanicOnTest(c *C) { - helper := FixtureHelper{panicOn: "Test1"} - output := String{} - Run(&helper, &RunConf{Output: &output}) - c.Check(helper.calls[0], Equals, "SetUpSuite") - c.Check(helper.calls[1], Equals, "SetUpTest") - c.Check(helper.calls[2], Equals, "Test1") - c.Check(helper.calls[3], Equals, "TearDownTest") - c.Check(helper.calls[4], Equals, "SetUpTest") - c.Check(helper.calls[5], Equals, "Test2") - c.Check(helper.calls[6], Equals, "TearDownTest") - c.Check(helper.calls[7], Equals, "TearDownSuite") - c.Check(len(helper.calls), Equals, 8) - - expected := "^\n-+\n" + - "PANIC: check_test\\.go:[0-9]+: FixtureHelper.Test1\n\n" + - "\\.\\.\\. Panic: Test1 \\(PC=[xA-F0-9]+\\)\n\n" + - ".+:[0-9]+\n" + - " in (go)?panic\n" + - ".*check_test.go:[0-9]+\n" + - " in FixtureHelper.trace\n" + - ".*check_test.go:[0-9]+\n" + - " in FixtureHelper.Test1\n" + - "(.|\n)*$" - - c.Check(output.value, Matches, expected) -} - -func (s *FixtureS) TestPanicOnSetUpTest(c *C) { - helper := FixtureHelper{panicOn: "SetUpTest"} - output := String{} - Run(&helper, &RunConf{Output: &output}) - c.Check(helper.calls[0], Equals, "SetUpSuite") - c.Check(helper.calls[1], Equals, "SetUpTest") - c.Check(helper.calls[2], Equals, "TearDownTest") - c.Check(helper.calls[3], Equals, "TearDownSuite") - c.Check(len(helper.calls), Equals, 4) - - expected := "^\n-+\n" + - "PANIC: check_test\\.go:[0-9]+: " + - "FixtureHelper\\.SetUpTest\n\n" + - "\\.\\.\\. Panic: SetUpTest \\(PC=[xA-F0-9]+\\)\n\n" + - ".+:[0-9]+\n" + - " in (go)?panic\n" + - ".*check_test.go:[0-9]+\n" + - " in FixtureHelper.trace\n" + - ".*check_test.go:[0-9]+\n" + - " in FixtureHelper.SetUpTest\n" + - "(.|\n)*" + - "\n-+\n" + - "PANIC: check_test\\.go:[0-9]+: " + - "FixtureHelper\\.Test1\n\n" + - "\\.\\.\\. Panic: Fixture has panicked " + - "\\(see related PANIC\\)\n$" - - c.Check(output.value, Matches, expected) -} - -func (s *FixtureS) TestPanicOnTearDownTest(c *C) { - helper := FixtureHelper{panicOn: "TearDownTest"} - output := String{} - Run(&helper, &RunConf{Output: &output}) - c.Check(helper.calls[0], Equals, "SetUpSuite") - c.Check(helper.calls[1], Equals, "SetUpTest") - c.Check(helper.calls[2], Equals, "Test1") - c.Check(helper.calls[3], Equals, "TearDownTest") - c.Check(helper.calls[4], Equals, "TearDownSuite") - c.Check(len(helper.calls), Equals, 5) - - expected := "^\n-+\n" + - "PANIC: check_test\\.go:[0-9]+: " + - "FixtureHelper.TearDownTest\n\n" + - "\\.\\.\\. Panic: TearDownTest \\(PC=[xA-F0-9]+\\)\n\n" + - ".+:[0-9]+\n" + - " in (go)?panic\n" + - ".*check_test.go:[0-9]+\n" + - " in FixtureHelper.trace\n" + - ".*check_test.go:[0-9]+\n" + - " in FixtureHelper.TearDownTest\n" + - "(.|\n)*" + - "\n-+\n" + - "PANIC: check_test\\.go:[0-9]+: " + - "FixtureHelper\\.Test1\n\n" + - "\\.\\.\\. Panic: Fixture has panicked " + - "\\(see related PANIC\\)\n$" - - c.Check(output.value, Matches, expected) -} - -func (s *FixtureS) TestPanicOnSetUpSuite(c *C) { - helper := FixtureHelper{panicOn: "SetUpSuite"} - output := String{} - Run(&helper, &RunConf{Output: &output}) - c.Check(helper.calls[0], Equals, "SetUpSuite") - c.Check(helper.calls[1], Equals, "TearDownSuite") - c.Check(len(helper.calls), Equals, 2) - - expected := "^\n-+\n" + - "PANIC: check_test\\.go:[0-9]+: " + - "FixtureHelper.SetUpSuite\n\n" + - "\\.\\.\\. Panic: SetUpSuite \\(PC=[xA-F0-9]+\\)\n\n" + - ".+:[0-9]+\n" + - " in (go)?panic\n" + - ".*check_test.go:[0-9]+\n" + - " in FixtureHelper.trace\n" + - ".*check_test.go:[0-9]+\n" + - " in FixtureHelper.SetUpSuite\n" + - "(.|\n)*$" - - c.Check(output.value, Matches, expected) -} - -func (s *FixtureS) TestPanicOnTearDownSuite(c *C) { - helper := FixtureHelper{panicOn: "TearDownSuite"} - output := String{} - Run(&helper, &RunConf{Output: &output}) - c.Check(helper.calls[0], Equals, "SetUpSuite") - c.Check(helper.calls[1], Equals, "SetUpTest") - c.Check(helper.calls[2], Equals, "Test1") - c.Check(helper.calls[3], Equals, "TearDownTest") - c.Check(helper.calls[4], Equals, "SetUpTest") - c.Check(helper.calls[5], Equals, "Test2") - c.Check(helper.calls[6], Equals, "TearDownTest") - c.Check(helper.calls[7], Equals, "TearDownSuite") - c.Check(len(helper.calls), Equals, 8) - - expected := "^\n-+\n" + - "PANIC: check_test\\.go:[0-9]+: " + - "FixtureHelper.TearDownSuite\n\n" + - "\\.\\.\\. Panic: TearDownSuite \\(PC=[xA-F0-9]+\\)\n\n" + - ".+:[0-9]+\n" + - " in (go)?panic\n" + - ".*check_test.go:[0-9]+\n" + - " in FixtureHelper.trace\n" + - ".*check_test.go:[0-9]+\n" + - " in FixtureHelper.TearDownSuite\n" + - "(.|\n)*$" - - c.Check(output.value, Matches, expected) -} - -// ----------------------------------------------------------------------- -// A wrong argument on a test or fixture will produce a nice error. - -func (s *FixtureS) TestPanicOnWrongTestArg(c *C) { - helper := WrongTestArgHelper{} - output := String{} - Run(&helper, &RunConf{Output: &output}) - c.Check(helper.calls[0], Equals, "SetUpSuite") - c.Check(helper.calls[1], Equals, "SetUpTest") - c.Check(helper.calls[2], Equals, "TearDownTest") - c.Check(helper.calls[3], Equals, "SetUpTest") - c.Check(helper.calls[4], Equals, "Test2") - c.Check(helper.calls[5], Equals, "TearDownTest") - c.Check(helper.calls[6], Equals, "TearDownSuite") - c.Check(len(helper.calls), Equals, 7) - - expected := "^\n-+\n" + - "PANIC: fixture_test\\.go:[0-9]+: " + - "WrongTestArgHelper\\.Test1\n\n" + - "\\.\\.\\. Panic: WrongTestArgHelper\\.Test1 argument " + - "should be \\*check\\.C\n" - - c.Check(output.value, Matches, expected) -} - -func (s *FixtureS) TestPanicOnWrongSetUpTestArg(c *C) { - helper := WrongSetUpTestArgHelper{} - output := String{} - Run(&helper, &RunConf{Output: &output}) - c.Check(len(helper.calls), Equals, 0) - - expected := - "^\n-+\n" + - "PANIC: fixture_test\\.go:[0-9]+: " + - "WrongSetUpTestArgHelper\\.SetUpTest\n\n" + - "\\.\\.\\. Panic: WrongSetUpTestArgHelper\\.SetUpTest argument " + - "should be \\*check\\.C\n" - - c.Check(output.value, Matches, expected) -} - -func (s *FixtureS) TestPanicOnWrongSetUpSuiteArg(c *C) { - helper := WrongSetUpSuiteArgHelper{} - output := String{} - Run(&helper, &RunConf{Output: &output}) - c.Check(len(helper.calls), Equals, 0) - - expected := - "^\n-+\n" + - "PANIC: fixture_test\\.go:[0-9]+: " + - "WrongSetUpSuiteArgHelper\\.SetUpSuite\n\n" + - "\\.\\.\\. Panic: WrongSetUpSuiteArgHelper\\.SetUpSuite argument " + - "should be \\*check\\.C\n" - - c.Check(output.value, Matches, expected) -} - -// ----------------------------------------------------------------------- -// Nice errors also when tests or fixture have wrong arg count. - -func (s *FixtureS) TestPanicOnWrongTestArgCount(c *C) { - helper := WrongTestArgCountHelper{} - output := String{} - Run(&helper, &RunConf{Output: &output}) - c.Check(helper.calls[0], Equals, "SetUpSuite") - c.Check(helper.calls[1], Equals, "SetUpTest") - c.Check(helper.calls[2], Equals, "TearDownTest") - c.Check(helper.calls[3], Equals, "SetUpTest") - c.Check(helper.calls[4], Equals, "Test2") - c.Check(helper.calls[5], Equals, "TearDownTest") - c.Check(helper.calls[6], Equals, "TearDownSuite") - c.Check(len(helper.calls), Equals, 7) - - expected := "^\n-+\n" + - "PANIC: fixture_test\\.go:[0-9]+: " + - "WrongTestArgCountHelper\\.Test1\n\n" + - "\\.\\.\\. Panic: WrongTestArgCountHelper\\.Test1 argument " + - "should be \\*check\\.C\n" - - c.Check(output.value, Matches, expected) -} - -func (s *FixtureS) TestPanicOnWrongSetUpTestArgCount(c *C) { - helper := WrongSetUpTestArgCountHelper{} - output := String{} - Run(&helper, &RunConf{Output: &output}) - c.Check(len(helper.calls), Equals, 0) - - expected := - "^\n-+\n" + - "PANIC: fixture_test\\.go:[0-9]+: " + - "WrongSetUpTestArgCountHelper\\.SetUpTest\n\n" + - "\\.\\.\\. Panic: WrongSetUpTestArgCountHelper\\.SetUpTest argument " + - "should be \\*check\\.C\n" - - c.Check(output.value, Matches, expected) -} - -func (s *FixtureS) TestPanicOnWrongSetUpSuiteArgCount(c *C) { - helper := WrongSetUpSuiteArgCountHelper{} - output := String{} - Run(&helper, &RunConf{Output: &output}) - c.Check(len(helper.calls), Equals, 0) - - expected := - "^\n-+\n" + - "PANIC: fixture_test\\.go:[0-9]+: " + - "WrongSetUpSuiteArgCountHelper\\.SetUpSuite\n\n" + - "\\.\\.\\. Panic: WrongSetUpSuiteArgCountHelper" + - "\\.SetUpSuite argument should be \\*check\\.C\n" - - c.Check(output.value, Matches, expected) -} - -// ----------------------------------------------------------------------- -// Helper test suites with wrong function arguments. - -type WrongTestArgHelper struct { - FixtureHelper -} - -func (s *WrongTestArgHelper) Test1(t int) { -} - -type WrongSetUpTestArgHelper struct { - FixtureHelper -} - -func (s *WrongSetUpTestArgHelper) SetUpTest(t int) { -} - -type WrongSetUpSuiteArgHelper struct { - FixtureHelper -} - -func (s *WrongSetUpSuiteArgHelper) SetUpSuite(t int) { -} - -type WrongTestArgCountHelper struct { - FixtureHelper -} - -func (s *WrongTestArgCountHelper) Test1(c *C, i int) { -} - -type WrongSetUpTestArgCountHelper struct { - FixtureHelper -} - -func (s *WrongSetUpTestArgCountHelper) SetUpTest(c *C, i int) { -} - -type WrongSetUpSuiteArgCountHelper struct { - FixtureHelper -} - -func (s *WrongSetUpSuiteArgCountHelper) SetUpSuite(c *C, i int) { -} - -// ----------------------------------------------------------------------- -// Ensure fixture doesn't run without tests. - -type NoTestsHelper struct { - hasRun bool -} - -func (s *NoTestsHelper) SetUpSuite(c *C) { - s.hasRun = true -} - -func (s *NoTestsHelper) TearDownSuite(c *C) { - s.hasRun = true -} - -func (s *FixtureS) TestFixtureDoesntRunWithoutTests(c *C) { - helper := NoTestsHelper{} - output := String{} - Run(&helper, &RunConf{Output: &output}) - c.Check(helper.hasRun, Equals, false) -} - -// ----------------------------------------------------------------------- -// Verify that checks and assertions work correctly inside the fixture. - -type FixtureCheckHelper struct { - fail string - completed bool -} - -func (s *FixtureCheckHelper) SetUpSuite(c *C) { - switch s.fail { - case "SetUpSuiteAssert": - c.Assert(false, Equals, true) - case "SetUpSuiteCheck": - c.Check(false, Equals, true) - } - s.completed = true -} - -func (s *FixtureCheckHelper) SetUpTest(c *C) { - switch s.fail { - case "SetUpTestAssert": - c.Assert(false, Equals, true) - case "SetUpTestCheck": - c.Check(false, Equals, true) - } - s.completed = true -} - -func (s *FixtureCheckHelper) Test(c *C) { - // Do nothing. -} - -func (s *FixtureS) TestSetUpSuiteCheck(c *C) { - helper := FixtureCheckHelper{fail: "SetUpSuiteCheck"} - output := String{} - Run(&helper, &RunConf{Output: &output}) - c.Assert(output.value, Matches, - "\n---+\n"+ - "FAIL: fixture_test\\.go:[0-9]+: "+ - "FixtureCheckHelper\\.SetUpSuite\n\n"+ - "fixture_test\\.go:[0-9]+:\n"+ - " c\\.Check\\(false, Equals, true\\)\n"+ - "\\.+ obtained bool = false\n"+ - "\\.+ expected bool = true\n\n") - c.Assert(helper.completed, Equals, true) -} - -func (s *FixtureS) TestSetUpSuiteAssert(c *C) { - helper := FixtureCheckHelper{fail: "SetUpSuiteAssert"} - output := String{} - Run(&helper, &RunConf{Output: &output}) - c.Assert(output.value, Matches, - "\n---+\n"+ - "FAIL: fixture_test\\.go:[0-9]+: "+ - "FixtureCheckHelper\\.SetUpSuite\n\n"+ - "fixture_test\\.go:[0-9]+:\n"+ - " c\\.Assert\\(false, Equals, true\\)\n"+ - "\\.+ obtained bool = false\n"+ - "\\.+ expected bool = true\n\n") - c.Assert(helper.completed, Equals, false) -} - -// ----------------------------------------------------------------------- -// Verify that logging within SetUpTest() persists within the test log itself. - -type FixtureLogHelper struct { - c *C -} - -func (s *FixtureLogHelper) SetUpTest(c *C) { - s.c = c - c.Log("1") -} - -func (s *FixtureLogHelper) Test(c *C) { - c.Log("2") - s.c.Log("3") - c.Log("4") - c.Fail() -} - -func (s *FixtureLogHelper) TearDownTest(c *C) { - s.c.Log("5") -} - -func (s *FixtureS) TestFixtureLogging(c *C) { - helper := FixtureLogHelper{} - output := String{} - Run(&helper, &RunConf{Output: &output}) - c.Assert(output.value, Matches, - "\n---+\n"+ - "FAIL: fixture_test\\.go:[0-9]+: "+ - "FixtureLogHelper\\.Test\n\n"+ - "1\n2\n3\n4\n5\n") -} - -// ----------------------------------------------------------------------- -// Skip() within fixture methods. - -func (s *FixtureS) TestSkipSuite(c *C) { - helper := FixtureHelper{skip: true, skipOnN: 0} - output := String{} - result := Run(&helper, &RunConf{Output: &output}) - c.Assert(output.value, Equals, "") - c.Assert(helper.calls[0], Equals, "SetUpSuite") - c.Assert(helper.calls[1], Equals, "TearDownSuite") - c.Assert(len(helper.calls), Equals, 2) - c.Assert(result.Skipped, Equals, 2) -} - -func (s *FixtureS) TestSkipTest(c *C) { - helper := FixtureHelper{skip: true, skipOnN: 1} - output := String{} - result := Run(&helper, &RunConf{Output: &output}) - c.Assert(helper.calls[0], Equals, "SetUpSuite") - c.Assert(helper.calls[1], Equals, "SetUpTest") - c.Assert(helper.calls[2], Equals, "SetUpTest") - c.Assert(helper.calls[3], Equals, "Test2") - c.Assert(helper.calls[4], Equals, "TearDownTest") - c.Assert(helper.calls[5], Equals, "TearDownSuite") - c.Assert(len(helper.calls), Equals, 6) - c.Assert(result.Skipped, Equals, 1) -} diff --git a/vendor/gopkg.in/check.v1/foundation_test.go b/vendor/gopkg.in/check.v1/foundation_test.go deleted file mode 100644 index 8ecf7915f..000000000 --- a/vendor/gopkg.in/check.v1/foundation_test.go +++ /dev/null @@ -1,335 +0,0 @@ -// These tests check that the foundations of gocheck are working properly. -// They already assume that fundamental failing is working already, though, -// since this was tested in bootstrap_test.go. Even then, some care may -// still have to be taken when using external functions, since they should -// of course not rely on functionality tested here. - -package check_test - -import ( - "fmt" - "gopkg.in/check.v1" - "log" - "os" - "regexp" - "strings" -) - -// ----------------------------------------------------------------------- -// Foundation test suite. - -type FoundationS struct{} - -var foundationS = check.Suite(&FoundationS{}) - -func (s *FoundationS) TestCountSuite(c *check.C) { - suitesRun += 1 -} - -func (s *FoundationS) TestErrorf(c *check.C) { - // Do not use checkState() here. It depends on Errorf() working. - expectedLog := fmt.Sprintf("foundation_test.go:%d:\n"+ - " c.Errorf(\"Error %%v!\", \"message\")\n"+ - "... Error: Error message!\n\n", - getMyLine()+1) - c.Errorf("Error %v!", "message") - failed := c.Failed() - c.Succeed() - if log := c.GetTestLog(); log != expectedLog { - c.Logf("Errorf() logged %#v rather than %#v", log, expectedLog) - c.Fail() - } - if !failed { - c.Logf("Errorf() didn't put the test in a failed state") - c.Fail() - } -} - -func (s *FoundationS) TestError(c *check.C) { - expectedLog := fmt.Sprintf("foundation_test.go:%d:\n"+ - " c\\.Error\\(\"Error \", \"message!\"\\)\n"+ - "\\.\\.\\. Error: Error message!\n\n", - getMyLine()+1) - c.Error("Error ", "message!") - checkState(c, nil, - &expectedState{ - name: "Error(`Error `, `message!`)", - failed: true, - log: expectedLog, - }) -} - -func (s *FoundationS) TestFailNow(c *check.C) { - defer (func() { - if !c.Failed() { - c.Error("FailNow() didn't fail the test") - } else { - c.Succeed() - if c.GetTestLog() != "" { - c.Error("Something got logged:\n" + c.GetTestLog()) - } - } - })() - - c.FailNow() - c.Log("FailNow() didn't stop the test") -} - -func (s *FoundationS) TestSucceedNow(c *check.C) { - defer (func() { - if c.Failed() { - c.Error("SucceedNow() didn't succeed the test") - } - if c.GetTestLog() != "" { - c.Error("Something got logged:\n" + c.GetTestLog()) - } - })() - - c.Fail() - c.SucceedNow() - c.Log("SucceedNow() didn't stop the test") -} - -func (s *FoundationS) TestFailureHeader(c *check.C) { - output := String{} - failHelper := FailHelper{} - check.Run(&failHelper, &check.RunConf{Output: &output}) - header := fmt.Sprintf(""+ - "\n-----------------------------------"+ - "-----------------------------------\n"+ - "FAIL: check_test.go:%d: FailHelper.TestLogAndFail\n", - failHelper.testLine) - if strings.Index(output.value, header) == -1 { - c.Errorf(""+ - "Failure didn't print a proper header.\n"+ - "... Got:\n%s... Expected something with:\n%s", - output.value, header) - } -} - -func (s *FoundationS) TestFatal(c *check.C) { - var line int - defer (func() { - if !c.Failed() { - c.Error("Fatal() didn't fail the test") - } else { - c.Succeed() - expected := fmt.Sprintf("foundation_test.go:%d:\n"+ - " c.Fatal(\"Die \", \"now!\")\n"+ - "... Error: Die now!\n\n", - line) - if c.GetTestLog() != expected { - c.Error("Incorrect log:", c.GetTestLog()) - } - } - })() - - line = getMyLine() + 1 - c.Fatal("Die ", "now!") - c.Log("Fatal() didn't stop the test") -} - -func (s *FoundationS) TestFatalf(c *check.C) { - var line int - defer (func() { - if !c.Failed() { - c.Error("Fatalf() didn't fail the test") - } else { - c.Succeed() - expected := fmt.Sprintf("foundation_test.go:%d:\n"+ - " c.Fatalf(\"Die %%s!\", \"now\")\n"+ - "... Error: Die now!\n\n", - line) - if c.GetTestLog() != expected { - c.Error("Incorrect log:", c.GetTestLog()) - } - } - })() - - line = getMyLine() + 1 - c.Fatalf("Die %s!", "now") - c.Log("Fatalf() didn't stop the test") -} - -func (s *FoundationS) TestCallerLoggingInsideTest(c *check.C) { - log := fmt.Sprintf(""+ - "foundation_test.go:%d:\n"+ - " result := c.Check\\(10, check.Equals, 20\\)\n"+ - "\\.\\.\\. obtained int = 10\n"+ - "\\.\\.\\. expected int = 20\n\n", - getMyLine()+1) - result := c.Check(10, check.Equals, 20) - checkState(c, result, - &expectedState{ - name: "Check(10, Equals, 20)", - result: false, - failed: true, - log: log, - }) -} - -func (s *FoundationS) TestCallerLoggingInDifferentFile(c *check.C) { - result, line := checkEqualWrapper(c, 10, 20) - testLine := getMyLine() - 1 - log := fmt.Sprintf(""+ - "foundation_test.go:%d:\n"+ - " result, line := checkEqualWrapper\\(c, 10, 20\\)\n"+ - "check_test.go:%d:\n"+ - " return c.Check\\(obtained, check.Equals, expected\\), getMyLine\\(\\)\n"+ - "\\.\\.\\. obtained int = 10\n"+ - "\\.\\.\\. expected int = 20\n\n", - testLine, line) - checkState(c, result, - &expectedState{ - name: "Check(10, Equals, 20)", - result: false, - failed: true, - log: log, - }) -} - -// ----------------------------------------------------------------------- -// ExpectFailure() inverts the logic of failure. - -type ExpectFailureSucceedHelper struct{} - -func (s *ExpectFailureSucceedHelper) TestSucceed(c *check.C) { - c.ExpectFailure("It booms!") - c.Error("Boom!") -} - -type ExpectFailureFailHelper struct{} - -func (s *ExpectFailureFailHelper) TestFail(c *check.C) { - c.ExpectFailure("Bug #XYZ") -} - -func (s *FoundationS) TestExpectFailureFail(c *check.C) { - helper := ExpectFailureFailHelper{} - output := String{} - result := check.Run(&helper, &check.RunConf{Output: &output}) - - expected := "" + - "^\n-+\n" + - "FAIL: foundation_test\\.go:[0-9]+:" + - " ExpectFailureFailHelper\\.TestFail\n\n" + - "\\.\\.\\. Error: Test succeeded, but was expected to fail\n" + - "\\.\\.\\. Reason: Bug #XYZ\n$" - - matched, err := regexp.MatchString(expected, output.value) - if err != nil { - c.Error("Bad expression: ", expected) - } else if !matched { - c.Error("ExpectFailure() didn't log properly:\n", output.value) - } - - c.Assert(result.ExpectedFailures, check.Equals, 0) -} - -func (s *FoundationS) TestExpectFailureSucceed(c *check.C) { - helper := ExpectFailureSucceedHelper{} - output := String{} - result := check.Run(&helper, &check.RunConf{Output: &output}) - - c.Assert(output.value, check.Equals, "") - c.Assert(result.ExpectedFailures, check.Equals, 1) -} - -func (s *FoundationS) TestExpectFailureSucceedVerbose(c *check.C) { - helper := ExpectFailureSucceedHelper{} - output := String{} - result := check.Run(&helper, &check.RunConf{Output: &output, Verbose: true}) - - expected := "" + - "FAIL EXPECTED: foundation_test\\.go:[0-9]+:" + - " ExpectFailureSucceedHelper\\.TestSucceed \\(It booms!\\)\t *[.0-9]+s\n" - - matched, err := regexp.MatchString(expected, output.value) - if err != nil { - c.Error("Bad expression: ", expected) - } else if !matched { - c.Error("ExpectFailure() didn't log properly:\n", output.value) - } - - c.Assert(result.ExpectedFailures, check.Equals, 1) -} - -// ----------------------------------------------------------------------- -// Skip() allows stopping a test without positive/negative results. - -type SkipTestHelper struct{} - -func (s *SkipTestHelper) TestFail(c *check.C) { - c.Skip("Wrong platform or whatever") - c.Error("Boom!") -} - -func (s *FoundationS) TestSkip(c *check.C) { - helper := SkipTestHelper{} - output := String{} - check.Run(&helper, &check.RunConf{Output: &output}) - - if output.value != "" { - c.Error("Skip() logged something:\n", output.value) - } -} - -func (s *FoundationS) TestSkipVerbose(c *check.C) { - helper := SkipTestHelper{} - output := String{} - check.Run(&helper, &check.RunConf{Output: &output, Verbose: true}) - - expected := "SKIP: foundation_test\\.go:[0-9]+: SkipTestHelper\\.TestFail" + - " \\(Wrong platform or whatever\\)" - matched, err := regexp.MatchString(expected, output.value) - if err != nil { - c.Error("Bad expression: ", expected) - } else if !matched { - c.Error("Skip() didn't log properly:\n", output.value) - } -} - -// ----------------------------------------------------------------------- -// Check minimum *log.Logger interface provided by *check.C. - -type minLogger interface { - Output(calldepth int, s string) error -} - -func (s *BootstrapS) TestMinLogger(c *check.C) { - var logger minLogger - logger = log.New(os.Stderr, "", 0) - logger = c - logger.Output(0, "Hello there") - expected := `\[LOG\] [0-9]+:[0-9][0-9]\.[0-9][0-9][0-9] +Hello there\n` - output := c.GetTestLog() - c.Assert(output, check.Matches, expected) -} - -// ----------------------------------------------------------------------- -// Ensure that suites with embedded types are working fine, including the -// the workaround for issue 906. - -type EmbeddedInternalS struct { - called bool -} - -type EmbeddedS struct { - EmbeddedInternalS -} - -var embeddedS = check.Suite(&EmbeddedS{}) - -func (s *EmbeddedS) TestCountSuite(c *check.C) { - suitesRun += 1 -} - -func (s *EmbeddedInternalS) TestMethod(c *check.C) { - c.Error("TestMethod() of the embedded type was called!?") -} - -func (s *EmbeddedS) TestMethod(c *check.C) { - // http://code.google.com/p/go/issues/detail?id=906 - c.Check(s.called, check.Equals, false) // Go issue 906 is affecting the runner? - s.called = true -} diff --git a/vendor/gopkg.in/check.v1/helpers_test.go b/vendor/gopkg.in/check.v1/helpers_test.go deleted file mode 100644 index 4baa656ba..000000000 --- a/vendor/gopkg.in/check.v1/helpers_test.go +++ /dev/null @@ -1,519 +0,0 @@ -// These tests verify the inner workings of the helper methods associated -// with check.T. - -package check_test - -import ( - "gopkg.in/check.v1" - "os" - "reflect" - "runtime" - "sync" -) - -var helpersS = check.Suite(&HelpersS{}) - -type HelpersS struct{} - -func (s *HelpersS) TestCountSuite(c *check.C) { - suitesRun += 1 -} - -// ----------------------------------------------------------------------- -// Fake checker and bug info to verify the behavior of Assert() and Check(). - -type MyChecker struct { - info *check.CheckerInfo - params []interface{} - names []string - result bool - error string -} - -func (checker *MyChecker) Info() *check.CheckerInfo { - if checker.info == nil { - return &check.CheckerInfo{Name: "MyChecker", Params: []string{"myobtained", "myexpected"}} - } - return checker.info -} - -func (checker *MyChecker) Check(params []interface{}, names []string) (bool, string) { - rparams := checker.params - rnames := checker.names - checker.params = append([]interface{}{}, params...) - checker.names = append([]string{}, names...) - if rparams != nil { - copy(params, rparams) - } - if rnames != nil { - copy(names, rnames) - } - return checker.result, checker.error -} - -type myCommentType string - -func (c myCommentType) CheckCommentString() string { - return string(c) -} - -func myComment(s string) myCommentType { - return myCommentType(s) -} - -// ----------------------------------------------------------------------- -// Ensure a real checker actually works fine. - -func (s *HelpersS) TestCheckerInterface(c *check.C) { - testHelperSuccess(c, "Check(1, Equals, 1)", true, func() interface{} { - return c.Check(1, check.Equals, 1) - }) -} - -// ----------------------------------------------------------------------- -// Tests for Check(), mostly the same as for Assert() following these. - -func (s *HelpersS) TestCheckSucceedWithExpected(c *check.C) { - checker := &MyChecker{result: true} - testHelperSuccess(c, "Check(1, checker, 2)", true, func() interface{} { - return c.Check(1, checker, 2) - }) - if !reflect.DeepEqual(checker.params, []interface{}{1, 2}) { - c.Fatalf("Bad params for check: %#v", checker.params) - } -} - -func (s *HelpersS) TestCheckSucceedWithoutExpected(c *check.C) { - checker := &MyChecker{result: true, info: &check.CheckerInfo{Params: []string{"myvalue"}}} - testHelperSuccess(c, "Check(1, checker)", true, func() interface{} { - return c.Check(1, checker) - }) - if !reflect.DeepEqual(checker.params, []interface{}{1}) { - c.Fatalf("Bad params for check: %#v", checker.params) - } -} - -func (s *HelpersS) TestCheckFailWithExpected(c *check.C) { - checker := &MyChecker{result: false} - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " return c\\.Check\\(1, checker, 2\\)\n" + - "\\.+ myobtained int = 1\n" + - "\\.+ myexpected int = 2\n\n" - testHelperFailure(c, "Check(1, checker, 2)", false, false, log, - func() interface{} { - return c.Check(1, checker, 2) - }) -} - -func (s *HelpersS) TestCheckFailWithExpectedAndComment(c *check.C) { - checker := &MyChecker{result: false} - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " return c\\.Check\\(1, checker, 2, myComment\\(\"Hello world!\"\\)\\)\n" + - "\\.+ myobtained int = 1\n" + - "\\.+ myexpected int = 2\n" + - "\\.+ Hello world!\n\n" - testHelperFailure(c, "Check(1, checker, 2, msg)", false, false, log, - func() interface{} { - return c.Check(1, checker, 2, myComment("Hello world!")) - }) -} - -func (s *HelpersS) TestCheckFailWithExpectedAndStaticComment(c *check.C) { - checker := &MyChecker{result: false} - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " // Nice leading comment\\.\n" + - " return c\\.Check\\(1, checker, 2\\) // Hello there\n" + - "\\.+ myobtained int = 1\n" + - "\\.+ myexpected int = 2\n\n" - testHelperFailure(c, "Check(1, checker, 2, msg)", false, false, log, - func() interface{} { - // Nice leading comment. - return c.Check(1, checker, 2) // Hello there - }) -} - -func (s *HelpersS) TestCheckFailWithoutExpected(c *check.C) { - checker := &MyChecker{result: false, info: &check.CheckerInfo{Params: []string{"myvalue"}}} - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " return c\\.Check\\(1, checker\\)\n" + - "\\.+ myvalue int = 1\n\n" - testHelperFailure(c, "Check(1, checker)", false, false, log, - func() interface{} { - return c.Check(1, checker) - }) -} - -func (s *HelpersS) TestCheckFailWithoutExpectedAndMessage(c *check.C) { - checker := &MyChecker{result: false, info: &check.CheckerInfo{Params: []string{"myvalue"}}} - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " return c\\.Check\\(1, checker, myComment\\(\"Hello world!\"\\)\\)\n" + - "\\.+ myvalue int = 1\n" + - "\\.+ Hello world!\n\n" - testHelperFailure(c, "Check(1, checker, msg)", false, false, log, - func() interface{} { - return c.Check(1, checker, myComment("Hello world!")) - }) -} - -func (s *HelpersS) TestCheckWithMissingExpected(c *check.C) { - checker := &MyChecker{result: true} - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " return c\\.Check\\(1, checker\\)\n" + - "\\.+ Check\\(myobtained, MyChecker, myexpected\\):\n" + - "\\.+ Wrong number of parameters for MyChecker: " + - "want 3, got 2\n\n" - testHelperFailure(c, "Check(1, checker, !?)", false, false, log, - func() interface{} { - return c.Check(1, checker) - }) -} - -func (s *HelpersS) TestCheckWithTooManyExpected(c *check.C) { - checker := &MyChecker{result: true} - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " return c\\.Check\\(1, checker, 2, 3\\)\n" + - "\\.+ Check\\(myobtained, MyChecker, myexpected\\):\n" + - "\\.+ Wrong number of parameters for MyChecker: " + - "want 3, got 4\n\n" - testHelperFailure(c, "Check(1, checker, 2, 3)", false, false, log, - func() interface{} { - return c.Check(1, checker, 2, 3) - }) -} - -func (s *HelpersS) TestCheckWithError(c *check.C) { - checker := &MyChecker{result: false, error: "Some not so cool data provided!"} - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " return c\\.Check\\(1, checker, 2\\)\n" + - "\\.+ myobtained int = 1\n" + - "\\.+ myexpected int = 2\n" + - "\\.+ Some not so cool data provided!\n\n" - testHelperFailure(c, "Check(1, checker, 2)", false, false, log, - func() interface{} { - return c.Check(1, checker, 2) - }) -} - -func (s *HelpersS) TestCheckWithNilChecker(c *check.C) { - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " return c\\.Check\\(1, nil\\)\n" + - "\\.+ Check\\(obtained, nil!\\?, \\.\\.\\.\\):\n" + - "\\.+ Oops\\.\\. you've provided a nil checker!\n\n" - testHelperFailure(c, "Check(obtained, nil)", false, false, log, - func() interface{} { - return c.Check(1, nil) - }) -} - -func (s *HelpersS) TestCheckWithParamsAndNamesMutation(c *check.C) { - checker := &MyChecker{result: false, params: []interface{}{3, 4}, names: []string{"newobtained", "newexpected"}} - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " return c\\.Check\\(1, checker, 2\\)\n" + - "\\.+ newobtained int = 3\n" + - "\\.+ newexpected int = 4\n\n" - testHelperFailure(c, "Check(1, checker, 2) with mutation", false, false, log, - func() interface{} { - return c.Check(1, checker, 2) - }) -} - -// ----------------------------------------------------------------------- -// Tests for Assert(), mostly the same as for Check() above. - -func (s *HelpersS) TestAssertSucceedWithExpected(c *check.C) { - checker := &MyChecker{result: true} - testHelperSuccess(c, "Assert(1, checker, 2)", nil, func() interface{} { - c.Assert(1, checker, 2) - return nil - }) - if !reflect.DeepEqual(checker.params, []interface{}{1, 2}) { - c.Fatalf("Bad params for check: %#v", checker.params) - } -} - -func (s *HelpersS) TestAssertSucceedWithoutExpected(c *check.C) { - checker := &MyChecker{result: true, info: &check.CheckerInfo{Params: []string{"myvalue"}}} - testHelperSuccess(c, "Assert(1, checker)", nil, func() interface{} { - c.Assert(1, checker) - return nil - }) - if !reflect.DeepEqual(checker.params, []interface{}{1}) { - c.Fatalf("Bad params for check: %#v", checker.params) - } -} - -func (s *HelpersS) TestAssertFailWithExpected(c *check.C) { - checker := &MyChecker{result: false} - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " c\\.Assert\\(1, checker, 2\\)\n" + - "\\.+ myobtained int = 1\n" + - "\\.+ myexpected int = 2\n\n" - testHelperFailure(c, "Assert(1, checker, 2)", nil, true, log, - func() interface{} { - c.Assert(1, checker, 2) - return nil - }) -} - -func (s *HelpersS) TestAssertFailWithExpectedAndMessage(c *check.C) { - checker := &MyChecker{result: false} - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " c\\.Assert\\(1, checker, 2, myComment\\(\"Hello world!\"\\)\\)\n" + - "\\.+ myobtained int = 1\n" + - "\\.+ myexpected int = 2\n" + - "\\.+ Hello world!\n\n" - testHelperFailure(c, "Assert(1, checker, 2, msg)", nil, true, log, - func() interface{} { - c.Assert(1, checker, 2, myComment("Hello world!")) - return nil - }) -} - -func (s *HelpersS) TestAssertFailWithoutExpected(c *check.C) { - checker := &MyChecker{result: false, info: &check.CheckerInfo{Params: []string{"myvalue"}}} - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " c\\.Assert\\(1, checker\\)\n" + - "\\.+ myvalue int = 1\n\n" - testHelperFailure(c, "Assert(1, checker)", nil, true, log, - func() interface{} { - c.Assert(1, checker) - return nil - }) -} - -func (s *HelpersS) TestAssertFailWithoutExpectedAndMessage(c *check.C) { - checker := &MyChecker{result: false, info: &check.CheckerInfo{Params: []string{"myvalue"}}} - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " c\\.Assert\\(1, checker, myComment\\(\"Hello world!\"\\)\\)\n" + - "\\.+ myvalue int = 1\n" + - "\\.+ Hello world!\n\n" - testHelperFailure(c, "Assert(1, checker, msg)", nil, true, log, - func() interface{} { - c.Assert(1, checker, myComment("Hello world!")) - return nil - }) -} - -func (s *HelpersS) TestAssertWithMissingExpected(c *check.C) { - checker := &MyChecker{result: true} - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " c\\.Assert\\(1, checker\\)\n" + - "\\.+ Assert\\(myobtained, MyChecker, myexpected\\):\n" + - "\\.+ Wrong number of parameters for MyChecker: " + - "want 3, got 2\n\n" - testHelperFailure(c, "Assert(1, checker, !?)", nil, true, log, - func() interface{} { - c.Assert(1, checker) - return nil - }) -} - -func (s *HelpersS) TestAssertWithError(c *check.C) { - checker := &MyChecker{result: false, error: "Some not so cool data provided!"} - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " c\\.Assert\\(1, checker, 2\\)\n" + - "\\.+ myobtained int = 1\n" + - "\\.+ myexpected int = 2\n" + - "\\.+ Some not so cool data provided!\n\n" - testHelperFailure(c, "Assert(1, checker, 2)", nil, true, log, - func() interface{} { - c.Assert(1, checker, 2) - return nil - }) -} - -func (s *HelpersS) TestAssertWithNilChecker(c *check.C) { - log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + - " c\\.Assert\\(1, nil\\)\n" + - "\\.+ Assert\\(obtained, nil!\\?, \\.\\.\\.\\):\n" + - "\\.+ Oops\\.\\. you've provided a nil checker!\n\n" - testHelperFailure(c, "Assert(obtained, nil)", nil, true, log, - func() interface{} { - c.Assert(1, nil) - return nil - }) -} - -// ----------------------------------------------------------------------- -// Ensure that values logged work properly in some interesting cases. - -func (s *HelpersS) TestValueLoggingWithArrays(c *check.C) { - checker := &MyChecker{result: false} - log := "(?s)helpers_test.go:[0-9]+:.*\nhelpers_test.go:[0-9]+:\n" + - " return c\\.Check\\(\\[\\]byte{1, 2}, checker, \\[\\]byte{1, 3}\\)\n" + - "\\.+ myobtained \\[\\]uint8 = \\[\\]byte{0x1, 0x2}\n" + - "\\.+ myexpected \\[\\]uint8 = \\[\\]byte{0x1, 0x3}\n\n" - testHelperFailure(c, "Check([]byte{1}, chk, []byte{3})", false, false, log, - func() interface{} { - return c.Check([]byte{1, 2}, checker, []byte{1, 3}) - }) -} - -func (s *HelpersS) TestValueLoggingWithMultiLine(c *check.C) { - checker := &MyChecker{result: false} - log := "(?s)helpers_test.go:[0-9]+:.*\nhelpers_test.go:[0-9]+:\n" + - " return c\\.Check\\(\"a\\\\nb\\\\n\", checker, \"a\\\\nb\\\\nc\"\\)\n" + - "\\.+ myobtained string = \"\" \\+\n" + - "\\.+ \"a\\\\n\" \\+\n" + - "\\.+ \"b\\\\n\"\n" + - "\\.+ myexpected string = \"\" \\+\n" + - "\\.+ \"a\\\\n\" \\+\n" + - "\\.+ \"b\\\\n\" \\+\n" + - "\\.+ \"c\"\n\n" - testHelperFailure(c, `Check("a\nb\n", chk, "a\nb\nc")`, false, false, log, - func() interface{} { - return c.Check("a\nb\n", checker, "a\nb\nc") - }) -} - -func (s *HelpersS) TestValueLoggingWithMultiLineException(c *check.C) { - // If the newline is at the end of the string, don't log as multi-line. - checker := &MyChecker{result: false} - log := "(?s)helpers_test.go:[0-9]+:.*\nhelpers_test.go:[0-9]+:\n" + - " return c\\.Check\\(\"a b\\\\n\", checker, \"a\\\\nb\"\\)\n" + - "\\.+ myobtained string = \"a b\\\\n\"\n" + - "\\.+ myexpected string = \"\" \\+\n" + - "\\.+ \"a\\\\n\" \\+\n" + - "\\.+ \"b\"\n\n" - testHelperFailure(c, `Check("a b\n", chk, "a\nb")`, false, false, log, - func() interface{} { - return c.Check("a b\n", checker, "a\nb") - }) -} - -// ----------------------------------------------------------------------- -// MakeDir() tests. - -type MkDirHelper struct { - path1 string - path2 string - isDir1 bool - isDir2 bool - isDir3 bool - isDir4 bool -} - -func (s *MkDirHelper) SetUpSuite(c *check.C) { - s.path1 = c.MkDir() - s.isDir1 = isDir(s.path1) -} - -func (s *MkDirHelper) Test(c *check.C) { - s.path2 = c.MkDir() - s.isDir2 = isDir(s.path2) -} - -func (s *MkDirHelper) TearDownSuite(c *check.C) { - s.isDir3 = isDir(s.path1) - s.isDir4 = isDir(s.path2) -} - -func (s *HelpersS) TestMkDir(c *check.C) { - helper := MkDirHelper{} - output := String{} - check.Run(&helper, &check.RunConf{Output: &output}) - c.Assert(output.value, check.Equals, "") - c.Check(helper.isDir1, check.Equals, true) - c.Check(helper.isDir2, check.Equals, true) - c.Check(helper.isDir3, check.Equals, true) - c.Check(helper.isDir4, check.Equals, true) - c.Check(helper.path1, check.Not(check.Equals), - helper.path2) - c.Check(isDir(helper.path1), check.Equals, false) - c.Check(isDir(helper.path2), check.Equals, false) -} - -func isDir(path string) bool { - if stat, err := os.Stat(path); err == nil { - return stat.IsDir() - } - return false -} - -// Concurrent logging should not corrupt the underling buffer. -// Use go test -race to detect the race in this test. -func (s *HelpersS) TestConcurrentLogging(c *check.C) { - defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(runtime.NumCPU())) - var start, stop sync.WaitGroup - start.Add(1) - for i, n := 0, runtime.NumCPU()*2; i < n; i++ { - stop.Add(1) - go func(i int) { - start.Wait() - for j := 0; j < 30; j++ { - c.Logf("Worker %d: line %d", i, j) - } - stop.Done() - }(i) - } - start.Done() - stop.Wait() -} - -// ----------------------------------------------------------------------- -// Test the TestName function - -type TestNameHelper struct { - name1 string - name2 string - name3 string - name4 string - name5 string -} - -func (s *TestNameHelper) SetUpSuite(c *check.C) { s.name1 = c.TestName() } -func (s *TestNameHelper) SetUpTest(c *check.C) { s.name2 = c.TestName() } -func (s *TestNameHelper) Test(c *check.C) { s.name3 = c.TestName() } -func (s *TestNameHelper) TearDownTest(c *check.C) { s.name4 = c.TestName() } -func (s *TestNameHelper) TearDownSuite(c *check.C) { s.name5 = c.TestName() } - -func (s *HelpersS) TestTestName(c *check.C) { - helper := TestNameHelper{} - output := String{} - check.Run(&helper, &check.RunConf{Output: &output}) - c.Check(helper.name1, check.Equals, "") - c.Check(helper.name2, check.Equals, "TestNameHelper.Test") - c.Check(helper.name3, check.Equals, "TestNameHelper.Test") - c.Check(helper.name4, check.Equals, "TestNameHelper.Test") - c.Check(helper.name5, check.Equals, "") -} - -// ----------------------------------------------------------------------- -// A couple of helper functions to test helper functions. :-) - -func testHelperSuccess(c *check.C, name string, expectedResult interface{}, closure func() interface{}) { - var result interface{} - defer (func() { - if err := recover(); err != nil { - panic(err) - } - checkState(c, result, - &expectedState{ - name: name, - result: expectedResult, - failed: false, - log: "", - }) - })() - result = closure() -} - -func testHelperFailure(c *check.C, name string, expectedResult interface{}, shouldStop bool, log string, closure func() interface{}) { - var result interface{} - defer (func() { - if err := recover(); err != nil { - panic(err) - } - checkState(c, result, - &expectedState{ - name: name, - result: expectedResult, - failed: true, - log: log, - }) - })() - result = closure() - if shouldStop { - c.Logf("%s didn't stop when it should", name) - } -} diff --git a/vendor/gopkg.in/check.v1/printer_test.go b/vendor/gopkg.in/check.v1/printer_test.go deleted file mode 100644 index 538b2d52e..000000000 --- a/vendor/gopkg.in/check.v1/printer_test.go +++ /dev/null @@ -1,104 +0,0 @@ -package check_test - -import ( - . "gopkg.in/check.v1" -) - -var _ = Suite(&PrinterS{}) - -type PrinterS struct{} - -func (s *PrinterS) TestCountSuite(c *C) { - suitesRun += 1 -} - -var printTestFuncLine int - -func init() { - printTestFuncLine = getMyLine() + 3 -} - -func printTestFunc() { - println(1) // Comment1 - if 2 == 2 { // Comment2 - println(3) // Comment3 - } - switch 5 { - case 6: println(6) // Comment6 - println(7) - } - switch interface{}(9).(type) {// Comment9 - case int: println(10) - println(11) - } - select { - case <-(chan bool)(nil): println(14) - println(15) - default: println(16) - println(17) - } - println(19, - 20) - _ = func() { println(21) - println(22) - } - println(24, func() { - println(25) - }) - // Leading comment - // with multiple lines. - println(29) // Comment29 -} - -var printLineTests = []struct { - line int - output string -}{ - {1, "println(1) // Comment1"}, - {2, "if 2 == 2 { // Comment2\n ...\n}"}, - {3, "println(3) // Comment3"}, - {5, "switch 5 {\n...\n}"}, - {6, "case 6:\n println(6) // Comment6\n ..."}, - {7, "println(7)"}, - {9, "switch interface{}(9).(type) { // Comment9\n...\n}"}, - {10, "case int:\n println(10)\n ..."}, - {14, "case <-(chan bool)(nil):\n println(14)\n ..."}, - {15, "println(15)"}, - {16, "default:\n println(16)\n ..."}, - {17, "println(17)"}, - {19, "println(19,\n 20)"}, - {20, "println(19,\n 20)"}, - {21, "_ = func() {\n println(21)\n println(22)\n}"}, - {22, "println(22)"}, - {24, "println(24, func() {\n println(25)\n})"}, - {25, "println(25)"}, - {26, "println(24, func() {\n println(25)\n})"}, - {29, "// Leading comment\n// with multiple lines.\nprintln(29) // Comment29"}, -} - -func (s *PrinterS) TestPrintLine(c *C) { - for _, test := range printLineTests { - output, err := PrintLine("printer_test.go", printTestFuncLine+test.line) - c.Assert(err, IsNil) - c.Assert(output, Equals, test.output) - } -} - -var indentTests = []struct { - in, out string -}{ - {"", ""}, - {"\n", "\n"}, - {"a", ">>>a"}, - {"a\n", ">>>a\n"}, - {"a\nb", ">>>a\n>>>b"}, - {" ", ">>> "}, -} - -func (s *PrinterS) TestIndent(c *C) { - for _, test := range indentTests { - out := Indent(test.in, ">>>") - c.Assert(out, Equals, test.out) - } - -} diff --git a/vendor/gopkg.in/check.v1/run_test.go b/vendor/gopkg.in/check.v1/run_test.go deleted file mode 100644 index f41fffc3f..000000000 --- a/vendor/gopkg.in/check.v1/run_test.go +++ /dev/null @@ -1,419 +0,0 @@ -// These tests verify the test running logic. - -package check_test - -import ( - "errors" - . "gopkg.in/check.v1" - "os" - "sync" -) - -var runnerS = Suite(&RunS{}) - -type RunS struct{} - -func (s *RunS) TestCountSuite(c *C) { - suitesRun += 1 -} - -// ----------------------------------------------------------------------- -// Tests ensuring result counting works properly. - -func (s *RunS) TestSuccess(c *C) { - output := String{} - result := Run(&SuccessHelper{}, &RunConf{Output: &output}) - c.Check(result.Succeeded, Equals, 1) - c.Check(result.Failed, Equals, 0) - c.Check(result.Skipped, Equals, 0) - c.Check(result.Panicked, Equals, 0) - c.Check(result.FixturePanicked, Equals, 0) - c.Check(result.Missed, Equals, 0) - c.Check(result.RunError, IsNil) -} - -func (s *RunS) TestFailure(c *C) { - output := String{} - result := Run(&FailHelper{}, &RunConf{Output: &output}) - c.Check(result.Succeeded, Equals, 0) - c.Check(result.Failed, Equals, 1) - c.Check(result.Skipped, Equals, 0) - c.Check(result.Panicked, Equals, 0) - c.Check(result.FixturePanicked, Equals, 0) - c.Check(result.Missed, Equals, 0) - c.Check(result.RunError, IsNil) -} - -func (s *RunS) TestFixture(c *C) { - output := String{} - result := Run(&FixtureHelper{}, &RunConf{Output: &output}) - c.Check(result.Succeeded, Equals, 2) - c.Check(result.Failed, Equals, 0) - c.Check(result.Skipped, Equals, 0) - c.Check(result.Panicked, Equals, 0) - c.Check(result.FixturePanicked, Equals, 0) - c.Check(result.Missed, Equals, 0) - c.Check(result.RunError, IsNil) -} - -func (s *RunS) TestPanicOnTest(c *C) { - output := String{} - helper := &FixtureHelper{panicOn: "Test1"} - result := Run(helper, &RunConf{Output: &output}) - c.Check(result.Succeeded, Equals, 1) - c.Check(result.Failed, Equals, 0) - c.Check(result.Skipped, Equals, 0) - c.Check(result.Panicked, Equals, 1) - c.Check(result.FixturePanicked, Equals, 0) - c.Check(result.Missed, Equals, 0) - c.Check(result.RunError, IsNil) -} - -func (s *RunS) TestPanicOnSetUpTest(c *C) { - output := String{} - helper := &FixtureHelper{panicOn: "SetUpTest"} - result := Run(helper, &RunConf{Output: &output}) - c.Check(result.Succeeded, Equals, 0) - c.Check(result.Failed, Equals, 0) - c.Check(result.Skipped, Equals, 0) - c.Check(result.Panicked, Equals, 0) - c.Check(result.FixturePanicked, Equals, 1) - c.Check(result.Missed, Equals, 2) - c.Check(result.RunError, IsNil) -} - -func (s *RunS) TestPanicOnSetUpSuite(c *C) { - output := String{} - helper := &FixtureHelper{panicOn: "SetUpSuite"} - result := Run(helper, &RunConf{Output: &output}) - c.Check(result.Succeeded, Equals, 0) - c.Check(result.Failed, Equals, 0) - c.Check(result.Skipped, Equals, 0) - c.Check(result.Panicked, Equals, 0) - c.Check(result.FixturePanicked, Equals, 1) - c.Check(result.Missed, Equals, 2) - c.Check(result.RunError, IsNil) -} - -// ----------------------------------------------------------------------- -// Check result aggregation. - -func (s *RunS) TestAdd(c *C) { - result := &Result{ - Succeeded: 1, - Skipped: 2, - Failed: 3, - Panicked: 4, - FixturePanicked: 5, - Missed: 6, - ExpectedFailures: 7, - } - result.Add(&Result{ - Succeeded: 10, - Skipped: 20, - Failed: 30, - Panicked: 40, - FixturePanicked: 50, - Missed: 60, - ExpectedFailures: 70, - }) - c.Check(result.Succeeded, Equals, 11) - c.Check(result.Skipped, Equals, 22) - c.Check(result.Failed, Equals, 33) - c.Check(result.Panicked, Equals, 44) - c.Check(result.FixturePanicked, Equals, 55) - c.Check(result.Missed, Equals, 66) - c.Check(result.ExpectedFailures, Equals, 77) - c.Check(result.RunError, IsNil) -} - -// ----------------------------------------------------------------------- -// Check the Passed() method. - -func (s *RunS) TestPassed(c *C) { - c.Assert((&Result{}).Passed(), Equals, true) - c.Assert((&Result{Succeeded: 1}).Passed(), Equals, true) - c.Assert((&Result{Skipped: 1}).Passed(), Equals, true) - c.Assert((&Result{Failed: 1}).Passed(), Equals, false) - c.Assert((&Result{Panicked: 1}).Passed(), Equals, false) - c.Assert((&Result{FixturePanicked: 1}).Passed(), Equals, false) - c.Assert((&Result{Missed: 1}).Passed(), Equals, false) - c.Assert((&Result{RunError: errors.New("!")}).Passed(), Equals, false) -} - -// ----------------------------------------------------------------------- -// Check that result printing is working correctly. - -func (s *RunS) TestPrintSuccess(c *C) { - result := &Result{Succeeded: 5} - c.Check(result.String(), Equals, "OK: 5 passed") -} - -func (s *RunS) TestPrintFailure(c *C) { - result := &Result{Failed: 5} - c.Check(result.String(), Equals, "OOPS: 0 passed, 5 FAILED") -} - -func (s *RunS) TestPrintSkipped(c *C) { - result := &Result{Skipped: 5} - c.Check(result.String(), Equals, "OK: 0 passed, 5 skipped") -} - -func (s *RunS) TestPrintExpectedFailures(c *C) { - result := &Result{ExpectedFailures: 5} - c.Check(result.String(), Equals, "OK: 0 passed, 5 expected failures") -} - -func (s *RunS) TestPrintPanicked(c *C) { - result := &Result{Panicked: 5} - c.Check(result.String(), Equals, "OOPS: 0 passed, 5 PANICKED") -} - -func (s *RunS) TestPrintFixturePanicked(c *C) { - result := &Result{FixturePanicked: 5} - c.Check(result.String(), Equals, "OOPS: 0 passed, 5 FIXTURE-PANICKED") -} - -func (s *RunS) TestPrintMissed(c *C) { - result := &Result{Missed: 5} - c.Check(result.String(), Equals, "OOPS: 0 passed, 5 MISSED") -} - -func (s *RunS) TestPrintAll(c *C) { - result := &Result{Succeeded: 1, Skipped: 2, ExpectedFailures: 3, - Panicked: 4, FixturePanicked: 5, Missed: 6} - c.Check(result.String(), Equals, - "OOPS: 1 passed, 2 skipped, 3 expected failures, 4 PANICKED, "+ - "5 FIXTURE-PANICKED, 6 MISSED") -} - -func (s *RunS) TestPrintRunError(c *C) { - result := &Result{Succeeded: 1, Failed: 1, - RunError: errors.New("Kaboom!")} - c.Check(result.String(), Equals, "ERROR: Kaboom!") -} - -// ----------------------------------------------------------------------- -// Verify that the method pattern flag works correctly. - -func (s *RunS) TestFilterTestName(c *C) { - helper := FixtureHelper{} - output := String{} - runConf := RunConf{Output: &output, Filter: "Test[91]"} - Run(&helper, &runConf) - c.Check(helper.calls[0], Equals, "SetUpSuite") - c.Check(helper.calls[1], Equals, "SetUpTest") - c.Check(helper.calls[2], Equals, "Test1") - c.Check(helper.calls[3], Equals, "TearDownTest") - c.Check(helper.calls[4], Equals, "TearDownSuite") - c.Check(len(helper.calls), Equals, 5) -} - -func (s *RunS) TestFilterTestNameWithAll(c *C) { - helper := FixtureHelper{} - output := String{} - runConf := RunConf{Output: &output, Filter: ".*"} - Run(&helper, &runConf) - c.Check(helper.calls[0], Equals, "SetUpSuite") - c.Check(helper.calls[1], Equals, "SetUpTest") - c.Check(helper.calls[2], Equals, "Test1") - c.Check(helper.calls[3], Equals, "TearDownTest") - c.Check(helper.calls[4], Equals, "SetUpTest") - c.Check(helper.calls[5], Equals, "Test2") - c.Check(helper.calls[6], Equals, "TearDownTest") - c.Check(helper.calls[7], Equals, "TearDownSuite") - c.Check(len(helper.calls), Equals, 8) -} - -func (s *RunS) TestFilterSuiteName(c *C) { - helper := FixtureHelper{} - output := String{} - runConf := RunConf{Output: &output, Filter: "FixtureHelper"} - Run(&helper, &runConf) - c.Check(helper.calls[0], Equals, "SetUpSuite") - c.Check(helper.calls[1], Equals, "SetUpTest") - c.Check(helper.calls[2], Equals, "Test1") - c.Check(helper.calls[3], Equals, "TearDownTest") - c.Check(helper.calls[4], Equals, "SetUpTest") - c.Check(helper.calls[5], Equals, "Test2") - c.Check(helper.calls[6], Equals, "TearDownTest") - c.Check(helper.calls[7], Equals, "TearDownSuite") - c.Check(len(helper.calls), Equals, 8) -} - -func (s *RunS) TestFilterSuiteNameAndTestName(c *C) { - helper := FixtureHelper{} - output := String{} - runConf := RunConf{Output: &output, Filter: "FixtureHelper\\.Test2"} - Run(&helper, &runConf) - c.Check(helper.calls[0], Equals, "SetUpSuite") - c.Check(helper.calls[1], Equals, "SetUpTest") - c.Check(helper.calls[2], Equals, "Test2") - c.Check(helper.calls[3], Equals, "TearDownTest") - c.Check(helper.calls[4], Equals, "TearDownSuite") - c.Check(len(helper.calls), Equals, 5) -} - -func (s *RunS) TestFilterAllOut(c *C) { - helper := FixtureHelper{} - output := String{} - runConf := RunConf{Output: &output, Filter: "NotFound"} - Run(&helper, &runConf) - c.Check(len(helper.calls), Equals, 0) -} - -func (s *RunS) TestRequirePartialMatch(c *C) { - helper := FixtureHelper{} - output := String{} - runConf := RunConf{Output: &output, Filter: "est"} - Run(&helper, &runConf) - c.Check(len(helper.calls), Equals, 8) -} - -func (s *RunS) TestFilterError(c *C) { - helper := FixtureHelper{} - output := String{} - runConf := RunConf{Output: &output, Filter: "]["} - result := Run(&helper, &runConf) - c.Check(result.String(), Equals, - "ERROR: Bad filter expression: error parsing regexp: missing closing ]: `[`") - c.Check(len(helper.calls), Equals, 0) -} - -// ----------------------------------------------------------------------- -// Verify that List works correctly. - -func (s *RunS) TestListFiltered(c *C) { - names := List(&FixtureHelper{}, &RunConf{Filter: "1"}) - c.Assert(names, DeepEquals, []string{ - "FixtureHelper.Test1", - }) -} - -func (s *RunS) TestList(c *C) { - names := List(&FixtureHelper{}, &RunConf{}) - c.Assert(names, DeepEquals, []string{ - "FixtureHelper.Test1", - "FixtureHelper.Test2", - }) -} - -// ----------------------------------------------------------------------- -// Verify that verbose mode prints tests which pass as well. - -func (s *RunS) TestVerboseMode(c *C) { - helper := FixtureHelper{} - output := String{} - runConf := RunConf{Output: &output, Verbose: true} - Run(&helper, &runConf) - - expected := "PASS: check_test\\.go:[0-9]+: FixtureHelper\\.Test1\t *[.0-9]+s\n" + - "PASS: check_test\\.go:[0-9]+: FixtureHelper\\.Test2\t *[.0-9]+s\n" - - c.Assert(output.value, Matches, expected) -} - -func (s *RunS) TestVerboseModeWithFailBeforePass(c *C) { - helper := FixtureHelper{panicOn: "Test1"} - output := String{} - runConf := RunConf{Output: &output, Verbose: true} - Run(&helper, &runConf) - - expected := "(?s).*PANIC.*\n-+\n" + // Should have an extra line. - "PASS: check_test\\.go:[0-9]+: FixtureHelper\\.Test2\t *[.0-9]+s\n" - - c.Assert(output.value, Matches, expected) -} - -// ----------------------------------------------------------------------- -// Verify the stream output mode. In this mode there's no output caching. - -type StreamHelper struct { - l2 sync.Mutex - l3 sync.Mutex -} - -func (s *StreamHelper) SetUpSuite(c *C) { - c.Log("0") -} - -func (s *StreamHelper) Test1(c *C) { - c.Log("1") - s.l2.Lock() - s.l3.Lock() - go func() { - s.l2.Lock() // Wait for "2". - c.Log("3") - s.l3.Unlock() - }() -} - -func (s *StreamHelper) Test2(c *C) { - c.Log("2") - s.l2.Unlock() - s.l3.Lock() // Wait for "3". - c.Fail() - c.Log("4") -} - -func (s *RunS) TestStreamMode(c *C) { - helper := &StreamHelper{} - output := String{} - runConf := RunConf{Output: &output, Stream: true} - Run(helper, &runConf) - - expected := "START: run_test\\.go:[0-9]+: StreamHelper\\.SetUpSuite\n0\n" + - "PASS: run_test\\.go:[0-9]+: StreamHelper\\.SetUpSuite\t *[.0-9]+s\n\n" + - "START: run_test\\.go:[0-9]+: StreamHelper\\.Test1\n1\n" + - "PASS: run_test\\.go:[0-9]+: StreamHelper\\.Test1\t *[.0-9]+s\n\n" + - "START: run_test\\.go:[0-9]+: StreamHelper\\.Test2\n2\n3\n4\n" + - "FAIL: run_test\\.go:[0-9]+: StreamHelper\\.Test2\n\n" - - c.Assert(output.value, Matches, expected) -} - -type StreamMissHelper struct{} - -func (s *StreamMissHelper) SetUpSuite(c *C) { - c.Log("0") - c.Fail() -} - -func (s *StreamMissHelper) Test1(c *C) { - c.Log("1") -} - -func (s *RunS) TestStreamModeWithMiss(c *C) { - helper := &StreamMissHelper{} - output := String{} - runConf := RunConf{Output: &output, Stream: true} - Run(helper, &runConf) - - expected := "START: run_test\\.go:[0-9]+: StreamMissHelper\\.SetUpSuite\n0\n" + - "FAIL: run_test\\.go:[0-9]+: StreamMissHelper\\.SetUpSuite\n\n" + - "START: run_test\\.go:[0-9]+: StreamMissHelper\\.Test1\n" + - "MISS: run_test\\.go:[0-9]+: StreamMissHelper\\.Test1\n\n" - - c.Assert(output.value, Matches, expected) -} - -// ----------------------------------------------------------------------- -// Verify that that the keep work dir request indeed does so. - -type WorkDirSuite struct {} - -func (s *WorkDirSuite) Test(c *C) { - c.MkDir() -} - -func (s *RunS) TestKeepWorkDir(c *C) { - output := String{} - runConf := RunConf{Output: &output, Verbose: true, KeepWorkDir: true} - result := Run(&WorkDirSuite{}, &runConf) - - c.Assert(result.String(), Matches, ".*\nWORK=" + result.WorkDir) - - stat, err := os.Stat(result.WorkDir) - c.Assert(err, IsNil) - c.Assert(stat.IsDir(), Equals, true) -} diff --git a/vendor/gopkg.in/mgo.v2/LICENSE b/vendor/gopkg.in/mgo.v2/LICENSE deleted file mode 100644 index 770c7672b..000000000 --- a/vendor/gopkg.in/mgo.v2/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -mgo - MongoDB driver for Go - -Copyright (c) 2010-2013 - Gustavo Niemeyer - -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 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/gopkg.in/mgo.v2/Makefile b/vendor/gopkg.in/mgo.v2/Makefile deleted file mode 100644 index 51bee7322..000000000 --- a/vendor/gopkg.in/mgo.v2/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -startdb: - @testdb/setup.sh start - -stopdb: - @testdb/setup.sh stop diff --git a/vendor/gopkg.in/mgo.v2/README.md b/vendor/gopkg.in/mgo.v2/README.md deleted file mode 100644 index f4e452c04..000000000 --- a/vendor/gopkg.in/mgo.v2/README.md +++ /dev/null @@ -1,4 +0,0 @@ -The MongoDB driver for Go -------------------------- - -Please go to [http://labix.org/mgo](http://labix.org/mgo) for all project details. diff --git a/vendor/gopkg.in/mgo.v2/auth.go b/vendor/gopkg.in/mgo.v2/auth.go deleted file mode 100644 index dc26e52f5..000000000 --- a/vendor/gopkg.in/mgo.v2/auth.go +++ /dev/null @@ -1,467 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// 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 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 mgo - -import ( - "crypto/md5" - "crypto/sha1" - "encoding/hex" - "errors" - "fmt" - "sync" - - "gopkg.in/mgo.v2/bson" - "gopkg.in/mgo.v2/internal/scram" -) - -type authCmd struct { - Authenticate int - - Nonce string - User string - Key string -} - -type startSaslCmd struct { - StartSASL int `bson:"startSasl"` -} - -type authResult struct { - ErrMsg string - Ok bool -} - -type getNonceCmd struct { - GetNonce int -} - -type getNonceResult struct { - Nonce string - Err string "$err" - Code int -} - -type logoutCmd struct { - Logout int -} - -type saslCmd struct { - Start int `bson:"saslStart,omitempty"` - Continue int `bson:"saslContinue,omitempty"` - ConversationId int `bson:"conversationId,omitempty"` - Mechanism string `bson:"mechanism,omitempty"` - Payload []byte -} - -type saslResult struct { - Ok bool `bson:"ok"` - NotOk bool `bson:"code"` // Server <= 2.3.2 returns ok=1 & code>0 on errors (WTF?) - Done bool - - ConversationId int `bson:"conversationId"` - Payload []byte - ErrMsg string -} - -type saslStepper interface { - Step(serverData []byte) (clientData []byte, done bool, err error) - Close() -} - -func (socket *mongoSocket) getNonce() (nonce string, err error) { - socket.Lock() - for socket.cachedNonce == "" && socket.dead == nil { - debugf("Socket %p to %s: waiting for nonce", socket, socket.addr) - socket.gotNonce.Wait() - } - if socket.cachedNonce == "mongos" { - socket.Unlock() - return "", errors.New("Can't authenticate with mongos; see http://j.mp/mongos-auth") - } - debugf("Socket %p to %s: got nonce", socket, socket.addr) - nonce, err = socket.cachedNonce, socket.dead - socket.cachedNonce = "" - socket.Unlock() - if err != nil { - nonce = "" - } - return -} - -func (socket *mongoSocket) resetNonce() { - debugf("Socket %p to %s: requesting a new nonce", socket, socket.addr) - op := &queryOp{} - op.query = &getNonceCmd{GetNonce: 1} - op.collection = "admin.$cmd" - op.limit = -1 - op.replyFunc = func(err error, reply *replyOp, docNum int, docData []byte) { - if err != nil { - socket.kill(errors.New("getNonce: "+err.Error()), true) - return - } - result := &getNonceResult{} - err = bson.Unmarshal(docData, &result) - if err != nil { - socket.kill(errors.New("Failed to unmarshal nonce: "+err.Error()), true) - return - } - debugf("Socket %p to %s: nonce unmarshalled: %#v", socket, socket.addr, result) - if result.Code == 13390 { - // mongos doesn't yet support auth (see http://j.mp/mongos-auth) - result.Nonce = "mongos" - } else if result.Nonce == "" { - var msg string - if result.Err != "" { - msg = fmt.Sprintf("Got an empty nonce: %s (%d)", result.Err, result.Code) - } else { - msg = "Got an empty nonce" - } - socket.kill(errors.New(msg), true) - return - } - socket.Lock() - if socket.cachedNonce != "" { - socket.Unlock() - panic("resetNonce: nonce already cached") - } - socket.cachedNonce = result.Nonce - socket.gotNonce.Signal() - socket.Unlock() - } - err := socket.Query(op) - if err != nil { - socket.kill(errors.New("resetNonce: "+err.Error()), true) - } -} - -func (socket *mongoSocket) Login(cred Credential) error { - socket.Lock() - if cred.Mechanism == "" && socket.serverInfo.MaxWireVersion >= 3 { - cred.Mechanism = "SCRAM-SHA-1" - } - for _, sockCred := range socket.creds { - if sockCred == cred { - debugf("Socket %p to %s: login: db=%q user=%q (already logged in)", socket, socket.addr, cred.Source, cred.Username) - socket.Unlock() - return nil - } - } - if socket.dropLogout(cred) { - debugf("Socket %p to %s: login: db=%q user=%q (cached)", socket, socket.addr, cred.Source, cred.Username) - socket.creds = append(socket.creds, cred) - socket.Unlock() - return nil - } - socket.Unlock() - - debugf("Socket %p to %s: login: db=%q user=%q", socket, socket.addr, cred.Source, cred.Username) - - var err error - switch cred.Mechanism { - case "", "MONGODB-CR", "MONGO-CR": // Name changed to MONGODB-CR in SERVER-8501. - err = socket.loginClassic(cred) - case "PLAIN": - err = socket.loginPlain(cred) - case "MONGODB-X509": - err = socket.loginX509(cred) - default: - // Try SASL for everything else, if it is available. - err = socket.loginSASL(cred) - } - - if err != nil { - debugf("Socket %p to %s: login error: %s", socket, socket.addr, err) - } else { - debugf("Socket %p to %s: login successful", socket, socket.addr) - } - return err -} - -func (socket *mongoSocket) loginClassic(cred Credential) error { - // Note that this only works properly because this function is - // synchronous, which means the nonce won't get reset while we're - // using it and any other login requests will block waiting for a - // new nonce provided in the defer call below. - nonce, err := socket.getNonce() - if err != nil { - return err - } - defer socket.resetNonce() - - psum := md5.New() - psum.Write([]byte(cred.Username + ":mongo:" + cred.Password)) - - ksum := md5.New() - ksum.Write([]byte(nonce + cred.Username)) - ksum.Write([]byte(hex.EncodeToString(psum.Sum(nil)))) - - key := hex.EncodeToString(ksum.Sum(nil)) - - cmd := authCmd{Authenticate: 1, User: cred.Username, Nonce: nonce, Key: key} - res := authResult{} - return socket.loginRun(cred.Source, &cmd, &res, func() error { - if !res.Ok { - return errors.New(res.ErrMsg) - } - socket.Lock() - socket.dropAuth(cred.Source) - socket.creds = append(socket.creds, cred) - socket.Unlock() - return nil - }) -} - -type authX509Cmd struct { - Authenticate int - User string - Mechanism string -} - -func (socket *mongoSocket) loginX509(cred Credential) error { - cmd := authX509Cmd{Authenticate: 1, User: cred.Username, Mechanism: "MONGODB-X509"} - res := authResult{} - return socket.loginRun(cred.Source, &cmd, &res, func() error { - if !res.Ok { - return errors.New(res.ErrMsg) - } - socket.Lock() - socket.dropAuth(cred.Source) - socket.creds = append(socket.creds, cred) - socket.Unlock() - return nil - }) -} - -func (socket *mongoSocket) loginPlain(cred Credential) error { - cmd := saslCmd{Start: 1, Mechanism: "PLAIN", Payload: []byte("\x00" + cred.Username + "\x00" + cred.Password)} - res := authResult{} - return socket.loginRun(cred.Source, &cmd, &res, func() error { - if !res.Ok { - return errors.New(res.ErrMsg) - } - socket.Lock() - socket.dropAuth(cred.Source) - socket.creds = append(socket.creds, cred) - socket.Unlock() - return nil - }) -} - -func (socket *mongoSocket) loginSASL(cred Credential) error { - var sasl saslStepper - var err error - if cred.Mechanism == "SCRAM-SHA-1" { - // SCRAM is handled without external libraries. - sasl = saslNewScram(cred) - } else if len(cred.ServiceHost) > 0 { - sasl, err = saslNew(cred, cred.ServiceHost) - } else { - sasl, err = saslNew(cred, socket.Server().Addr) - } - if err != nil { - return err - } - defer sasl.Close() - - // The goal of this logic is to carry a locked socket until the - // local SASL step confirms the auth is valid; the socket needs to be - // locked so that concurrent action doesn't leave the socket in an - // auth state that doesn't reflect the operations that took place. - // As a simple case, imagine inverting login=>logout to logout=>login. - // - // The logic below works because the lock func isn't called concurrently. - locked := false - lock := func(b bool) { - if locked != b { - locked = b - if b { - socket.Lock() - } else { - socket.Unlock() - } - } - } - - lock(true) - defer lock(false) - - start := 1 - cmd := saslCmd{} - res := saslResult{} - for { - payload, done, err := sasl.Step(res.Payload) - if err != nil { - return err - } - if done && res.Done { - socket.dropAuth(cred.Source) - socket.creds = append(socket.creds, cred) - break - } - lock(false) - - cmd = saslCmd{ - Start: start, - Continue: 1 - start, - ConversationId: res.ConversationId, - Mechanism: cred.Mechanism, - Payload: payload, - } - start = 0 - err = socket.loginRun(cred.Source, &cmd, &res, func() error { - // See the comment on lock for why this is necessary. - lock(true) - if !res.Ok || res.NotOk { - return fmt.Errorf("server returned error on SASL authentication step: %s", res.ErrMsg) - } - return nil - }) - if err != nil { - return err - } - if done && res.Done { - socket.dropAuth(cred.Source) - socket.creds = append(socket.creds, cred) - break - } - } - - return nil -} - -func saslNewScram(cred Credential) *saslScram { - credsum := md5.New() - credsum.Write([]byte(cred.Username + ":mongo:" + cred.Password)) - client := scram.NewClient(sha1.New, cred.Username, hex.EncodeToString(credsum.Sum(nil))) - return &saslScram{cred: cred, client: client} -} - -type saslScram struct { - cred Credential - client *scram.Client -} - -func (s *saslScram) Close() {} - -func (s *saslScram) Step(serverData []byte) (clientData []byte, done bool, err error) { - more := s.client.Step(serverData) - return s.client.Out(), !more, s.client.Err() -} - -func (socket *mongoSocket) loginRun(db string, query, result interface{}, f func() error) error { - var mutex sync.Mutex - var replyErr error - mutex.Lock() - - op := queryOp{} - op.query = query - op.collection = db + ".$cmd" - op.limit = -1 - op.replyFunc = func(err error, reply *replyOp, docNum int, docData []byte) { - defer mutex.Unlock() - - if err != nil { - replyErr = err - return - } - - err = bson.Unmarshal(docData, result) - if err != nil { - replyErr = err - } else { - // Must handle this within the read loop for the socket, so - // that concurrent login requests are properly ordered. - replyErr = f() - } - } - - err := socket.Query(&op) - if err != nil { - return err - } - mutex.Lock() // Wait. - return replyErr -} - -func (socket *mongoSocket) Logout(db string) { - socket.Lock() - cred, found := socket.dropAuth(db) - if found { - debugf("Socket %p to %s: logout: db=%q (flagged)", socket, socket.addr, db) - socket.logout = append(socket.logout, cred) - } - socket.Unlock() -} - -func (socket *mongoSocket) LogoutAll() { - socket.Lock() - if l := len(socket.creds); l > 0 { - debugf("Socket %p to %s: logout all (flagged %d)", socket, socket.addr, l) - socket.logout = append(socket.logout, socket.creds...) - socket.creds = socket.creds[0:0] - } - socket.Unlock() -} - -func (socket *mongoSocket) flushLogout() (ops []interface{}) { - socket.Lock() - if l := len(socket.logout); l > 0 { - debugf("Socket %p to %s: logout all (flushing %d)", socket, socket.addr, l) - for i := 0; i != l; i++ { - op := queryOp{} - op.query = &logoutCmd{1} - op.collection = socket.logout[i].Source + ".$cmd" - op.limit = -1 - ops = append(ops, &op) - } - socket.logout = socket.logout[0:0] - } - socket.Unlock() - return -} - -func (socket *mongoSocket) dropAuth(db string) (cred Credential, found bool) { - for i, sockCred := range socket.creds { - if sockCred.Source == db { - copy(socket.creds[i:], socket.creds[i+1:]) - socket.creds = socket.creds[:len(socket.creds)-1] - return sockCred, true - } - } - return cred, false -} - -func (socket *mongoSocket) dropLogout(cred Credential) (found bool) { - for i, sockCred := range socket.logout { - if sockCred == cred { - copy(socket.logout[i:], socket.logout[i+1:]) - socket.logout = socket.logout[:len(socket.logout)-1] - return true - } - } - return false -} diff --git a/vendor/gopkg.in/mgo.v2/auth_test.go b/vendor/gopkg.in/mgo.v2/auth_test.go deleted file mode 100644 index eb42ab1d6..000000000 --- a/vendor/gopkg.in/mgo.v2/auth_test.go +++ /dev/null @@ -1,1180 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// 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 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 mgo_test - -import ( - "crypto/tls" - "flag" - "fmt" - "io/ioutil" - "net" - "net/url" - "os" - "runtime" - "sync" - "time" - - . "gopkg.in/check.v1" - "gopkg.in/mgo.v2" -) - -func (s *S) TestAuthLoginDatabase(c *C) { - // Test both with a normal database and with an authenticated shard. - for _, addr := range []string{"localhost:40002", "localhost:40203"} { - session, err := mgo.Dial(addr) - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"n": 1}) - c.Assert(err, ErrorMatches, "unauthorized|need to login|not authorized .*") - - admindb := session.DB("admin") - - err = admindb.Login("root", "wrong") - c.Assert(err, ErrorMatches, "auth fail(s|ed)|.*Authentication failed.") - - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - err = coll.Insert(M{"n": 1}) - c.Assert(err, IsNil) - } -} - -func (s *S) TestAuthLoginSession(c *C) { - // Test both with a normal database and with an authenticated shard. - for _, addr := range []string{"localhost:40002", "localhost:40203"} { - session, err := mgo.Dial(addr) - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"n": 1}) - c.Assert(err, ErrorMatches, "unauthorized|need to login|not authorized .*") - - cred := mgo.Credential{ - Username: "root", - Password: "wrong", - } - err = session.Login(&cred) - c.Assert(err, ErrorMatches, "auth fail(s|ed)|.*Authentication failed.") - - cred.Password = "rapadura" - - err = session.Login(&cred) - c.Assert(err, IsNil) - - err = coll.Insert(M{"n": 1}) - c.Assert(err, IsNil) - } -} - -func (s *S) TestAuthLoginLogout(c *C) { - // Test both with a normal database and with an authenticated shard. - for _, addr := range []string{"localhost:40002", "localhost:40203"} { - session, err := mgo.Dial(addr) - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - admindb.Logout() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"n": 1}) - c.Assert(err, ErrorMatches, "unauthorized|need to login|not authorized .*") - - // Must have dropped auth from the session too. - session = session.Copy() - defer session.Close() - - coll = session.DB("mydb").C("mycoll") - err = coll.Insert(M{"n": 1}) - c.Assert(err, ErrorMatches, "unauthorized|need to login|not authorized .*") - } -} - -func (s *S) TestAuthLoginLogoutAll(c *C) { - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - session.LogoutAll() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"n": 1}) - c.Assert(err, ErrorMatches, "unauthorized|need to login|not authorized .*") - - // Must have dropped auth from the session too. - session = session.Copy() - defer session.Close() - - coll = session.DB("mydb").C("mycoll") - err = coll.Insert(M{"n": 1}) - c.Assert(err, ErrorMatches, "unauthorized|need to login|not authorized .*") -} - -func (s *S) TestAuthUpsertUserErrors(c *C) { - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - mydb := session.DB("mydb") - - err = mydb.UpsertUser(&mgo.User{}) - c.Assert(err, ErrorMatches, "user has no Username") - - err = mydb.UpsertUser(&mgo.User{Username: "user", Password: "pass", UserSource: "source"}) - c.Assert(err, ErrorMatches, "user has both Password/PasswordHash and UserSource set") - - err = mydb.UpsertUser(&mgo.User{Username: "user", Password: "pass", OtherDBRoles: map[string][]mgo.Role{"db": nil}}) - c.Assert(err, ErrorMatches, "user with OtherDBRoles is only supported in the admin or \\$external databases") -} - -func (s *S) TestAuthUpsertUser(c *C) { - if !s.versionAtLeast(2, 4) { - c.Skip("UpsertUser only works on 2.4+") - } - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - mydb := session.DB("mydb") - - ruser := &mgo.User{ - Username: "myruser", - Password: "mypass", - Roles: []mgo.Role{mgo.RoleRead}, - } - rwuser := &mgo.User{ - Username: "myrwuser", - Password: "mypass", - Roles: []mgo.Role{mgo.RoleReadWrite}, - } - - err = mydb.UpsertUser(ruser) - c.Assert(err, IsNil) - err = mydb.UpsertUser(rwuser) - c.Assert(err, IsNil) - - err = mydb.Login("myruser", "mypass") - c.Assert(err, IsNil) - - admindb.Logout() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"n": 1}) - c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") - - err = mydb.Login("myrwuser", "mypass") - c.Assert(err, IsNil) - - err = coll.Insert(M{"n": 1}) - c.Assert(err, IsNil) - - myotherdb := session.DB("myotherdb") - - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - // Test UserSource. - rwuserother := &mgo.User{ - Username: "myrwuser", - UserSource: "mydb", - Roles: []mgo.Role{mgo.RoleRead}, - } - - err = myotherdb.UpsertUser(rwuserother) - if s.versionAtLeast(2, 6) { - c.Assert(err, ErrorMatches, `MongoDB 2.6\+ does not support the UserSource setting`) - return - } - c.Assert(err, IsNil) - - admindb.Logout() - - // Test indirection via UserSource: we can't write to it, because - // the roles for myrwuser are different there. - othercoll := myotherdb.C("myothercoll") - err = othercoll.Insert(M{"n": 1}) - c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") - - // Reading works, though. - err = othercoll.Find(nil).One(nil) - c.Assert(err, Equals, mgo.ErrNotFound) - - // Can't login directly into the database using UserSource, though. - err = myotherdb.Login("myrwuser", "mypass") - c.Assert(err, ErrorMatches, "auth fail(s|ed)|.*Authentication failed.") -} - -func (s *S) TestAuthUpsertUserOtherDBRoles(c *C) { - if !s.versionAtLeast(2, 4) { - c.Skip("UpsertUser only works on 2.4+") - } - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - ruser := &mgo.User{ - Username: "myruser", - Password: "mypass", - OtherDBRoles: map[string][]mgo.Role{"mydb": []mgo.Role{mgo.RoleRead}}, - } - - err = admindb.UpsertUser(ruser) - c.Assert(err, IsNil) - defer admindb.RemoveUser("myruser") - - admindb.Logout() - err = admindb.Login("myruser", "mypass") - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"n": 1}) - c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") - - err = coll.Find(nil).One(nil) - c.Assert(err, Equals, mgo.ErrNotFound) -} - -func (s *S) TestAuthUpsertUserUpdates(c *C) { - if !s.versionAtLeast(2, 4) { - c.Skip("UpsertUser only works on 2.4+") - } - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - mydb := session.DB("mydb") - - // Insert a user that can read. - user := &mgo.User{ - Username: "myruser", - Password: "mypass", - Roles: []mgo.Role{mgo.RoleRead}, - } - err = mydb.UpsertUser(user) - c.Assert(err, IsNil) - - // Now update the user password. - user = &mgo.User{ - Username: "myruser", - Password: "mynewpass", - } - err = mydb.UpsertUser(user) - c.Assert(err, IsNil) - - // Login with the new user. - usession, err := mgo.Dial("myruser:mynewpass@localhost:40002/mydb") - c.Assert(err, IsNil) - defer usession.Close() - - // Can read, but not write. - err = usession.DB("mydb").C("mycoll").Find(nil).One(nil) - c.Assert(err, Equals, mgo.ErrNotFound) - err = usession.DB("mydb").C("mycoll").Insert(M{"ok": 1}) - c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") - - // Update the user role. - user = &mgo.User{ - Username: "myruser", - Roles: []mgo.Role{mgo.RoleReadWrite}, - } - err = mydb.UpsertUser(user) - c.Assert(err, IsNil) - - // Dial again to ensure the password hasn't changed. - usession, err = mgo.Dial("myruser:mynewpass@localhost:40002/mydb") - c.Assert(err, IsNil) - defer usession.Close() - - // Now it can write. - err = usession.DB("mydb").C("mycoll").Insert(M{"ok": 1}) - c.Assert(err, IsNil) -} - -func (s *S) TestAuthAddUser(c *C) { - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - mydb := session.DB("mydb") - err = mydb.AddUser("myruser", "mypass", true) - c.Assert(err, IsNil) - err = mydb.AddUser("mywuser", "mypass", false) - c.Assert(err, IsNil) - - err = mydb.Login("myruser", "mypass") - c.Assert(err, IsNil) - - admindb.Logout() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"n": 1}) - c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") - - err = mydb.Login("mywuser", "mypass") - c.Assert(err, IsNil) - - err = coll.Insert(M{"n": 1}) - c.Assert(err, IsNil) -} - -func (s *S) TestAuthAddUserReplaces(c *C) { - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - mydb := session.DB("mydb") - err = mydb.AddUser("myuser", "myoldpass", false) - c.Assert(err, IsNil) - err = mydb.AddUser("myuser", "mynewpass", true) - c.Assert(err, IsNil) - - admindb.Logout() - - err = mydb.Login("myuser", "myoldpass") - c.Assert(err, ErrorMatches, "auth fail(s|ed)|.*Authentication failed.") - err = mydb.Login("myuser", "mynewpass") - c.Assert(err, IsNil) - - // ReadOnly flag was changed too. - err = mydb.C("mycoll").Insert(M{"n": 1}) - c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") -} - -func (s *S) TestAuthRemoveUser(c *C) { - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - mydb := session.DB("mydb") - err = mydb.AddUser("myuser", "mypass", true) - c.Assert(err, IsNil) - err = mydb.RemoveUser("myuser") - c.Assert(err, IsNil) - err = mydb.RemoveUser("myuser") - c.Assert(err, Equals, mgo.ErrNotFound) - - err = mydb.Login("myuser", "mypass") - c.Assert(err, ErrorMatches, "auth fail(s|ed)|.*Authentication failed.") -} - -func (s *S) TestAuthLoginTwiceDoesNothing(c *C) { - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - oldStats := mgo.GetStats() - - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - newStats := mgo.GetStats() - c.Assert(newStats.SentOps, Equals, oldStats.SentOps) -} - -func (s *S) TestAuthLoginLogoutLoginDoesNothing(c *C) { - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - oldStats := mgo.GetStats() - - admindb.Logout() - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - newStats := mgo.GetStats() - c.Assert(newStats.SentOps, Equals, oldStats.SentOps) -} - -func (s *S) TestAuthLoginSwitchUser(c *C) { - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"n": 1}) - c.Assert(err, IsNil) - - err = admindb.Login("reader", "rapadura") - c.Assert(err, IsNil) - - // Can't write. - err = coll.Insert(M{"n": 1}) - c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") - - // But can read. - result := struct{ N int }{} - err = coll.Find(nil).One(&result) - c.Assert(err, IsNil) - c.Assert(result.N, Equals, 1) -} - -func (s *S) TestAuthLoginChangePassword(c *C) { - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - mydb := session.DB("mydb") - err = mydb.AddUser("myuser", "myoldpass", false) - c.Assert(err, IsNil) - - err = mydb.Login("myuser", "myoldpass") - c.Assert(err, IsNil) - - err = mydb.AddUser("myuser", "mynewpass", true) - c.Assert(err, IsNil) - - err = mydb.Login("myuser", "mynewpass") - c.Assert(err, IsNil) - - admindb.Logout() - - // The second login must be in effect, which means read-only. - err = mydb.C("mycoll").Insert(M{"n": 1}) - c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") -} - -func (s *S) TestAuthLoginCachingWithSessionRefresh(c *C) { - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - session.Refresh() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"n": 1}) - c.Assert(err, IsNil) -} - -func (s *S) TestAuthLoginCachingWithSessionCopy(c *C) { - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - session = session.Copy() - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"n": 1}) - c.Assert(err, IsNil) -} - -func (s *S) TestAuthLoginCachingWithSessionClone(c *C) { - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - session = session.Clone() - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"n": 1}) - c.Assert(err, IsNil) -} - -func (s *S) TestAuthLoginCachingWithNewSession(c *C) { - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - session = session.New() - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"n": 1}) - c.Assert(err, ErrorMatches, "unauthorized|need to login|not authorized .*") -} - -func (s *S) TestAuthLoginCachingAcrossPool(c *C) { - // Logins are cached even when the conenction goes back - // into the pool. - - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - // Add another user to test the logout case at the same time. - mydb := session.DB("mydb") - err = mydb.AddUser("myuser", "mypass", false) - c.Assert(err, IsNil) - - err = mydb.Login("myuser", "mypass") - c.Assert(err, IsNil) - - // Logout root explicitly, to test both cases. - admindb.Logout() - - // Give socket back to pool. - session.Refresh() - - // Brand new session, should use socket from the pool. - other := session.New() - defer other.Close() - - oldStats := mgo.GetStats() - - err = other.DB("admin").Login("root", "rapadura") - c.Assert(err, IsNil) - err = other.DB("mydb").Login("myuser", "mypass") - c.Assert(err, IsNil) - - // Both logins were cached, so no ops. - newStats := mgo.GetStats() - c.Assert(newStats.SentOps, Equals, oldStats.SentOps) - - // And they actually worked. - err = other.DB("mydb").C("mycoll").Insert(M{"n": 1}) - c.Assert(err, IsNil) - - other.DB("admin").Logout() - - err = other.DB("mydb").C("mycoll").Insert(M{"n": 1}) - c.Assert(err, IsNil) -} - -func (s *S) TestAuthLoginCachingAcrossPoolWithLogout(c *C) { - // Now verify that logouts are properly flushed if they - // are not revalidated after leaving the pool. - - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - // Add another user to test the logout case at the same time. - mydb := session.DB("mydb") - err = mydb.AddUser("myuser", "mypass", true) - c.Assert(err, IsNil) - - err = mydb.Login("myuser", "mypass") - c.Assert(err, IsNil) - - // Just some data to query later. - err = session.DB("mydb").C("mycoll").Insert(M{"n": 1}) - c.Assert(err, IsNil) - - // Give socket back to pool. - session.Refresh() - - // Brand new session, should use socket from the pool. - other := session.New() - defer other.Close() - - oldStats := mgo.GetStats() - - err = other.DB("mydb").Login("myuser", "mypass") - c.Assert(err, IsNil) - - // Login was cached, so no ops. - newStats := mgo.GetStats() - c.Assert(newStats.SentOps, Equals, oldStats.SentOps) - - // Can't write, since root has been implicitly logged out - // when the collection went into the pool, and not revalidated. - err = other.DB("mydb").C("mycoll").Insert(M{"n": 1}) - c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") - - // But can read due to the revalidated myuser login. - result := struct{ N int }{} - err = other.DB("mydb").C("mycoll").Find(nil).One(&result) - c.Assert(err, IsNil) - c.Assert(result.N, Equals, 1) -} - -func (s *S) TestAuthEventual(c *C) { - // Eventual sessions don't keep sockets around, so they are - // an interesting test case. - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - admindb := session.DB("admin") - err = admindb.Login("root", "rapadura") - c.Assert(err, IsNil) - - err = session.DB("mydb").C("mycoll").Insert(M{"n": 1}) - c.Assert(err, IsNil) - - var wg sync.WaitGroup - wg.Add(20) - - for i := 0; i != 10; i++ { - go func() { - defer wg.Done() - var result struct{ N int } - err := session.DB("mydb").C("mycoll").Find(nil).One(&result) - c.Assert(err, IsNil) - c.Assert(result.N, Equals, 1) - }() - } - - for i := 0; i != 10; i++ { - go func() { - defer wg.Done() - err := session.DB("mydb").C("mycoll").Insert(M{"n": 1}) - c.Assert(err, IsNil) - }() - } - - wg.Wait() -} - -func (s *S) TestAuthURL(c *C) { - session, err := mgo.Dial("mongodb://root:rapadura@localhost:40002/") - c.Assert(err, IsNil) - defer session.Close() - - err = session.DB("mydb").C("mycoll").Insert(M{"n": 1}) - c.Assert(err, IsNil) -} - -func (s *S) TestAuthURLWrongCredentials(c *C) { - session, err := mgo.Dial("mongodb://root:wrong@localhost:40002/") - if session != nil { - session.Close() - } - c.Assert(err, ErrorMatches, "auth fail(s|ed)|.*Authentication failed.") - c.Assert(session, IsNil) -} - -func (s *S) TestAuthURLWithNewSession(c *C) { - // When authentication is in the URL, the new session will - // actually carry it on as well, even if logged out explicitly. - session, err := mgo.Dial("mongodb://root:rapadura@localhost:40002/") - c.Assert(err, IsNil) - defer session.Close() - - session.DB("admin").Logout() - - // Do it twice to ensure it passes the needed data on. - session = session.New() - defer session.Close() - session = session.New() - defer session.Close() - - err = session.DB("mydb").C("mycoll").Insert(M{"n": 1}) - c.Assert(err, IsNil) -} - -func (s *S) TestAuthURLWithDatabase(c *C) { - session, err := mgo.Dial("mongodb://root:rapadura@localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - mydb := session.DB("mydb") - err = mydb.AddUser("myruser", "mypass", true) - c.Assert(err, IsNil) - - // Test once with database, and once with source. - for i := 0; i < 2; i++ { - var url string - if i == 0 { - url = "mongodb://myruser:mypass@localhost:40002/mydb" - } else { - url = "mongodb://myruser:mypass@localhost:40002/admin?authSource=mydb" - } - usession, err := mgo.Dial(url) - c.Assert(err, IsNil) - defer usession.Close() - - ucoll := usession.DB("mydb").C("mycoll") - err = ucoll.FindId(0).One(nil) - c.Assert(err, Equals, mgo.ErrNotFound) - err = ucoll.Insert(M{"n": 1}) - c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") - } -} - -func (s *S) TestDefaultDatabase(c *C) { - tests := []struct{ url, db string }{ - {"mongodb://root:rapadura@localhost:40002", "test"}, - {"mongodb://root:rapadura@localhost:40002/admin", "admin"}, - {"mongodb://localhost:40001", "test"}, - {"mongodb://localhost:40001/", "test"}, - {"mongodb://localhost:40001/mydb", "mydb"}, - } - - for _, test := range tests { - session, err := mgo.Dial(test.url) - c.Assert(err, IsNil) - defer session.Close() - - c.Logf("test: %#v", test) - c.Assert(session.DB("").Name, Equals, test.db) - - scopy := session.Copy() - c.Check(scopy.DB("").Name, Equals, test.db) - scopy.Close() - } -} - -func (s *S) TestAuthDirect(c *C) { - // Direct connections must work to the master and slaves. - for _, port := range []string{"40031", "40032", "40033"} { - url := fmt.Sprintf("mongodb://root:rapadura@localhost:%s/?connect=direct", port) - session, err := mgo.Dial(url) - c.Assert(err, IsNil) - defer session.Close() - - session.SetMode(mgo.Monotonic, true) - - var result struct{} - err = session.DB("mydb").C("mycoll").Find(nil).One(&result) - c.Assert(err, Equals, mgo.ErrNotFound) - } -} - -func (s *S) TestAuthDirectWithLogin(c *C) { - // Direct connections must work to the master and slaves. - for _, port := range []string{"40031", "40032", "40033"} { - url := fmt.Sprintf("mongodb://localhost:%s/?connect=direct", port) - session, err := mgo.Dial(url) - c.Assert(err, IsNil) - defer session.Close() - - session.SetMode(mgo.Monotonic, true) - session.SetSyncTimeout(3 * time.Second) - - err = session.DB("admin").Login("root", "rapadura") - c.Assert(err, IsNil) - - var result struct{} - err = session.DB("mydb").C("mycoll").Find(nil).One(&result) - c.Assert(err, Equals, mgo.ErrNotFound) - } -} - -func (s *S) TestAuthScramSha1Cred(c *C) { - if !s.versionAtLeast(2, 7, 7) { - c.Skip("SCRAM-SHA-1 tests depend on 2.7.7") - } - cred := &mgo.Credential{ - Username: "root", - Password: "rapadura", - Mechanism: "SCRAM-SHA-1", - Source: "admin", - } - host := "localhost:40002" - c.Logf("Connecting to %s...", host) - session, err := mgo.Dial(host) - c.Assert(err, IsNil) - defer session.Close() - - mycoll := session.DB("admin").C("mycoll") - - c.Logf("Connected! Testing the need for authentication...") - err = mycoll.Find(nil).One(nil) - c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") - - c.Logf("Authenticating...") - err = session.Login(cred) - c.Assert(err, IsNil) - c.Logf("Authenticated!") - - c.Logf("Connected! Testing the need for authentication...") - err = mycoll.Find(nil).One(nil) - c.Assert(err, Equals, mgo.ErrNotFound) -} - -func (s *S) TestAuthScramSha1URL(c *C) { - if !s.versionAtLeast(2, 7, 7) { - c.Skip("SCRAM-SHA-1 tests depend on 2.7.7") - } - host := "localhost:40002" - c.Logf("Connecting to %s...", host) - session, err := mgo.Dial(fmt.Sprintf("root:rapadura@%s?authMechanism=SCRAM-SHA-1", host)) - c.Assert(err, IsNil) - defer session.Close() - - mycoll := session.DB("admin").C("mycoll") - - c.Logf("Connected! Testing the need for authentication...") - err = mycoll.Find(nil).One(nil) - c.Assert(err, Equals, mgo.ErrNotFound) -} - -func (s *S) TestAuthX509Cred(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - binfo, err := session.BuildInfo() - c.Assert(err, IsNil) - if binfo.OpenSSLVersion == "" { - c.Skip("server does not support SSL") - } - - clientCertPEM, err := ioutil.ReadFile("testdb/client.pem") - c.Assert(err, IsNil) - - clientCert, err := tls.X509KeyPair(clientCertPEM, clientCertPEM) - c.Assert(err, IsNil) - - tlsConfig := &tls.Config{ - // Isolating tests to client certs, don't care about server validation. - InsecureSkipVerify: true, - Certificates: []tls.Certificate{clientCert}, - } - - var host = "localhost:40003" - c.Logf("Connecting to %s...", host) - session, err = mgo.DialWithInfo(&mgo.DialInfo{ - Addrs: []string{host}, - DialServer: func(addr *mgo.ServerAddr) (net.Conn, error) { - return tls.Dial("tcp", addr.String(), tlsConfig) - }, - }) - c.Assert(err, IsNil) - defer session.Close() - - err = session.Login(&mgo.Credential{Username: "root", Password: "rapadura"}) - c.Assert(err, IsNil) - - // This needs to be kept in sync with client.pem - x509Subject := "CN=localhost,OU=Client,O=MGO,L=MGO,ST=MGO,C=GO" - - externalDB := session.DB("$external") - var x509User mgo.User = mgo.User{ - Username: x509Subject, - OtherDBRoles: map[string][]mgo.Role{"admin": []mgo.Role{mgo.RoleRoot}}, - } - err = externalDB.UpsertUser(&x509User) - c.Assert(err, IsNil) - - session.LogoutAll() - - c.Logf("Connected! Ensuring authentication is required...") - names, err := session.DatabaseNames() - c.Assert(err, ErrorMatches, "not authorized .*") - - cred := &mgo.Credential{ - Username: x509Subject, - Mechanism: "MONGODB-X509", - Source: "$external", - } - - c.Logf("Authenticating...") - err = session.Login(cred) - c.Assert(err, IsNil) - c.Logf("Authenticated!") - - names, err = session.DatabaseNames() - c.Assert(err, IsNil) - c.Assert(len(names) > 0, Equals, true) -} - -var ( - plainFlag = flag.String("plain", "", "Host to test PLAIN authentication against (depends on custom environment)") - plainUser = "einstein" - plainPass = "password" -) - -func (s *S) TestAuthPlainCred(c *C) { - if *plainFlag == "" { - c.Skip("no -plain") - } - cred := &mgo.Credential{ - Username: plainUser, - Password: plainPass, - Source: "$external", - Mechanism: "PLAIN", - } - c.Logf("Connecting to %s...", *plainFlag) - session, err := mgo.Dial(*plainFlag) - c.Assert(err, IsNil) - defer session.Close() - - records := session.DB("records").C("records") - - c.Logf("Connected! Testing the need for authentication...") - err = records.Find(nil).One(nil) - c.Assert(err, ErrorMatches, "unauthorized|not authorized .*") - - c.Logf("Authenticating...") - err = session.Login(cred) - c.Assert(err, IsNil) - c.Logf("Authenticated!") - - c.Logf("Connected! Testing the need for authentication...") - err = records.Find(nil).One(nil) - c.Assert(err, Equals, mgo.ErrNotFound) -} - -func (s *S) TestAuthPlainURL(c *C) { - if *plainFlag == "" { - c.Skip("no -plain") - } - c.Logf("Connecting to %s...", *plainFlag) - session, err := mgo.Dial(fmt.Sprintf("%s:%s@%s?authMechanism=PLAIN", url.QueryEscape(plainUser), url.QueryEscape(plainPass), *plainFlag)) - c.Assert(err, IsNil) - defer session.Close() - - c.Logf("Connected! Testing the need for authentication...") - err = session.DB("records").C("records").Find(nil).One(nil) - c.Assert(err, Equals, mgo.ErrNotFound) -} - -var ( - kerberosFlag = flag.Bool("kerberos", false, "Test Kerberos authentication (depends on custom environment)") - kerberosHost = "ldaptest.10gen.cc" - kerberosUser = "drivers@LDAPTEST.10GEN.CC" - - winKerberosPasswordEnv = "MGO_KERBEROS_PASSWORD" -) - -// Kerberos has its own suite because it talks to a remote server -// that is prepared to authenticate against a kerberos deployment. -type KerberosSuite struct{} - -var _ = Suite(&KerberosSuite{}) - -func (kerberosSuite *KerberosSuite) SetUpSuite(c *C) { - mgo.SetDebug(true) - mgo.SetStats(true) -} - -func (kerberosSuite *KerberosSuite) TearDownSuite(c *C) { - mgo.SetDebug(false) - mgo.SetStats(false) -} - -func (kerberosSuite *KerberosSuite) SetUpTest(c *C) { - mgo.SetLogger((*cLogger)(c)) - mgo.ResetStats() -} - -func (kerberosSuite *KerberosSuite) TearDownTest(c *C) { - mgo.SetLogger(nil) -} - -func (kerberosSuite *KerberosSuite) TestAuthKerberosCred(c *C) { - if !*kerberosFlag { - c.Skip("no -kerberos") - } - cred := &mgo.Credential{ - Username: kerberosUser, - Mechanism: "GSSAPI", - } - windowsAppendPasswordToCredential(cred) - c.Logf("Connecting to %s...", kerberosHost) - session, err := mgo.Dial(kerberosHost) - c.Assert(err, IsNil) - defer session.Close() - - c.Logf("Connected! Testing the need for authentication...") - n, err := session.DB("kerberos").C("test").Find(M{}).Count() - c.Assert(err, ErrorMatches, ".*authorized.*") - - c.Logf("Authenticating...") - err = session.Login(cred) - c.Assert(err, IsNil) - c.Logf("Authenticated!") - - n, err = session.DB("kerberos").C("test").Find(M{}).Count() - c.Assert(err, IsNil) - c.Assert(n, Equals, 1) -} - -func (kerberosSuite *KerberosSuite) TestAuthKerberosURL(c *C) { - if !*kerberosFlag { - c.Skip("no -kerberos") - } - c.Logf("Connecting to %s...", kerberosHost) - connectUri := url.QueryEscape(kerberosUser) + "@" + kerberosHost + "?authMechanism=GSSAPI" - if runtime.GOOS == "windows" { - connectUri = url.QueryEscape(kerberosUser) + ":" + url.QueryEscape(getWindowsKerberosPassword()) + "@" + kerberosHost + "?authMechanism=GSSAPI" - } - session, err := mgo.Dial(connectUri) - c.Assert(err, IsNil) - defer session.Close() - n, err := session.DB("kerberos").C("test").Find(M{}).Count() - c.Assert(err, IsNil) - c.Assert(n, Equals, 1) -} - -func (kerberosSuite *KerberosSuite) TestAuthKerberosServiceName(c *C) { - if !*kerberosFlag { - c.Skip("no -kerberos") - } - - wrongServiceName := "wrong" - rightServiceName := "mongodb" - - cred := &mgo.Credential{ - Username: kerberosUser, - Mechanism: "GSSAPI", - Service: wrongServiceName, - } - windowsAppendPasswordToCredential(cred) - - c.Logf("Connecting to %s...", kerberosHost) - session, err := mgo.Dial(kerberosHost) - c.Assert(err, IsNil) - defer session.Close() - - c.Logf("Authenticating with incorrect service name...") - err = session.Login(cred) - c.Assert(err, ErrorMatches, ".*@LDAPTEST.10GEN.CC not found.*") - - cred.Service = rightServiceName - c.Logf("Authenticating with correct service name...") - err = session.Login(cred) - c.Assert(err, IsNil) - c.Logf("Authenticated!") - - n, err := session.DB("kerberos").C("test").Find(M{}).Count() - c.Assert(err, IsNil) - c.Assert(n, Equals, 1) -} - -func (kerberosSuite *KerberosSuite) TestAuthKerberosServiceHost(c *C) { - if !*kerberosFlag { - c.Skip("no -kerberos") - } - - wrongServiceHost := "eggs.bacon.tk" - rightServiceHost := kerberosHost - - cred := &mgo.Credential{ - Username: kerberosUser, - Mechanism: "GSSAPI", - ServiceHost: wrongServiceHost, - } - windowsAppendPasswordToCredential(cred) - - c.Logf("Connecting to %s...", kerberosHost) - session, err := mgo.Dial(kerberosHost) - c.Assert(err, IsNil) - defer session.Close() - - c.Logf("Authenticating with incorrect service host...") - err = session.Login(cred) - c.Assert(err, ErrorMatches, ".*@LDAPTEST.10GEN.CC not found.*") - - cred.ServiceHost = rightServiceHost - c.Logf("Authenticating with correct service host...") - err = session.Login(cred) - c.Assert(err, IsNil) - c.Logf("Authenticated!") - - n, err := session.DB("kerberos").C("test").Find(M{}).Count() - c.Assert(err, IsNil) - c.Assert(n, Equals, 1) -} - -// No kinit on SSPI-style Kerberos, so we need to provide a password. In order -// to avoid inlining password, require it to be set as an environment variable, -// for instance: `SET MGO_KERBEROS_PASSWORD=this_isnt_the_password` -func getWindowsKerberosPassword() string { - pw := os.Getenv(winKerberosPasswordEnv) - if pw == "" { - panic(fmt.Sprintf("Need to set %v environment variable to run Kerberos tests on Windows", winKerberosPasswordEnv)) - } - return pw -} - -func windowsAppendPasswordToCredential(cred *mgo.Credential) { - if runtime.GOOS == "windows" { - cred.Password = getWindowsKerberosPassword() - } -} diff --git a/vendor/gopkg.in/mgo.v2/bson/LICENSE b/vendor/gopkg.in/mgo.v2/bson/LICENSE deleted file mode 100644 index 890326017..000000000 --- a/vendor/gopkg.in/mgo.v2/bson/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -BSON library for Go - -Copyright (c) 2010-2012 - Gustavo Niemeyer - -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 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/gopkg.in/mgo.v2/bson/bson.go b/vendor/gopkg.in/mgo.v2/bson/bson.go deleted file mode 100644 index 41816b874..000000000 --- a/vendor/gopkg.in/mgo.v2/bson/bson.go +++ /dev/null @@ -1,705 +0,0 @@ -// BSON library for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// 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 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 bson is an implementation of the BSON specification for Go: -// -// http://bsonspec.org -// -// It was created as part of the mgo MongoDB driver for Go, but is standalone -// and may be used on its own without the driver. -package bson - -import ( - "bytes" - "crypto/md5" - "crypto/rand" - "encoding/binary" - "encoding/hex" - "errors" - "fmt" - "io" - "os" - "reflect" - "runtime" - "strings" - "sync" - "sync/atomic" - "time" -) - -// -------------------------------------------------------------------------- -// The public API. - -// A value implementing the bson.Getter interface will have its GetBSON -// method called when the given value has to be marshalled, and the result -// of this method will be marshaled in place of the actual object. -// -// If GetBSON returns return a non-nil error, the marshalling procedure -// will stop and error out with the provided value. -type Getter interface { - GetBSON() (interface{}, error) -} - -// A value implementing the bson.Setter interface will receive the BSON -// value via the SetBSON method during unmarshaling, and the object -// itself will not be changed as usual. -// -// If setting the value works, the method should return nil or alternatively -// bson.SetZero to set the respective field to its zero value (nil for -// pointer types). If SetBSON returns a value of type bson.TypeError, the -// BSON value will be omitted from a map or slice being decoded and the -// unmarshalling will continue. If it returns any other non-nil error, the -// unmarshalling procedure will stop and error out with the provided value. -// -// This interface is generally useful in pointer receivers, since the method -// will want to change the receiver. A type field that implements the Setter -// interface doesn't have to be a pointer, though. -// -// Unlike the usual behavior, unmarshalling onto a value that implements a -// Setter interface will NOT reset the value to its zero state. This allows -// the value to decide by itself how to be unmarshalled. -// -// For example: -// -// type MyString string -// -// func (s *MyString) SetBSON(raw bson.Raw) error { -// return raw.Unmarshal(s) -// } -// -type Setter interface { - SetBSON(raw Raw) error -} - -// SetZero may be returned from a SetBSON method to have the value set to -// its respective zero value. When used in pointer values, this will set the -// field to nil rather than to the pre-allocated value. -var SetZero = errors.New("set to zero") - -// M is a convenient alias for a map[string]interface{} map, useful for -// dealing with BSON in a native way. For instance: -// -// bson.M{"a": 1, "b": true} -// -// There's no special handling for this type in addition to what's done anyway -// for an equivalent map type. Elements in the map will be dumped in an -// undefined ordered. See also the bson.D type for an ordered alternative. -type M map[string]interface{} - -// D represents a BSON document containing ordered elements. For example: -// -// bson.D{{"a", 1}, {"b", true}} -// -// In some situations, such as when creating indexes for MongoDB, the order in -// which the elements are defined is important. If the order is not important, -// using a map is generally more comfortable. See bson.M and bson.RawD. -type D []DocElem - -// DocElem is an element of the bson.D document representation. -type DocElem struct { - Name string - Value interface{} -} - -// Map returns a map out of the ordered element name/value pairs in d. -func (d D) Map() (m M) { - m = make(M, len(d)) - for _, item := range d { - m[item.Name] = item.Value - } - return m -} - -// The Raw type represents raw unprocessed BSON documents and elements. -// Kind is the kind of element as defined per the BSON specification, and -// Data is the raw unprocessed data for the respective element. -// Using this type it is possible to unmarshal or marshal values partially. -// -// Relevant documentation: -// -// http://bsonspec.org/#/specification -// -type Raw struct { - Kind byte - Data []byte -} - -// RawD represents a BSON document containing raw unprocessed elements. -// This low-level representation may be useful when lazily processing -// documents of uncertain content, or when manipulating the raw content -// documents in general. -type RawD []RawDocElem - -// See the RawD type. -type RawDocElem struct { - Name string - Value Raw -} - -// ObjectId is a unique ID identifying a BSON value. It must be exactly 12 bytes -// long. MongoDB objects by default have such a property set in their "_id" -// property. -// -// http://www.mongodb.org/display/DOCS/Object+IDs -type ObjectId string - -// ObjectIdHex returns an ObjectId from the provided hex representation. -// Calling this function with an invalid hex representation will -// cause a runtime panic. See the IsObjectIdHex function. -func ObjectIdHex(s string) ObjectId { - d, err := hex.DecodeString(s) - if err != nil || len(d) != 12 { - panic(fmt.Sprintf("Invalid input to ObjectIdHex: %q", s)) - } - return ObjectId(d) -} - -// IsObjectIdHex returns whether s is a valid hex representation of -// an ObjectId. See the ObjectIdHex function. -func IsObjectIdHex(s string) bool { - if len(s) != 24 { - return false - } - _, err := hex.DecodeString(s) - return err == nil -} - -// objectIdCounter is atomically incremented when generating a new ObjectId -// using NewObjectId() function. It's used as a counter part of an id. -var objectIdCounter uint32 = 0 - -// machineId stores machine id generated once and used in subsequent calls -// to NewObjectId function. -var machineId = readMachineId() - -// readMachineId generates machine id and puts it into the machineId global -// variable. If this function fails to get the hostname, it will cause -// a runtime error. -func readMachineId() []byte { - var sum [3]byte - id := sum[:] - hostname, err1 := os.Hostname() - if err1 != nil { - _, err2 := io.ReadFull(rand.Reader, id) - if err2 != nil { - panic(fmt.Errorf("cannot get hostname: %v; %v", err1, err2)) - } - return id - } - hw := md5.New() - hw.Write([]byte(hostname)) - copy(id, hw.Sum(nil)) - return id -} - -// NewObjectId returns a new unique ObjectId. -func NewObjectId() ObjectId { - var b [12]byte - // Timestamp, 4 bytes, big endian - binary.BigEndian.PutUint32(b[:], uint32(time.Now().Unix())) - // Machine, first 3 bytes of md5(hostname) - b[4] = machineId[0] - b[5] = machineId[1] - b[6] = machineId[2] - // Pid, 2 bytes, specs don't specify endianness, but we use big endian. - pid := os.Getpid() - b[7] = byte(pid >> 8) - b[8] = byte(pid) - // Increment, 3 bytes, big endian - i := atomic.AddUint32(&objectIdCounter, 1) - b[9] = byte(i >> 16) - b[10] = byte(i >> 8) - b[11] = byte(i) - return ObjectId(b[:]) -} - -// NewObjectIdWithTime returns a dummy ObjectId with the timestamp part filled -// with the provided number of seconds from epoch UTC, and all other parts -// filled with zeroes. It's not safe to insert a document with an id generated -// by this method, it is useful only for queries to find documents with ids -// generated before or after the specified timestamp. -func NewObjectIdWithTime(t time.Time) ObjectId { - var b [12]byte - binary.BigEndian.PutUint32(b[:4], uint32(t.Unix())) - return ObjectId(string(b[:])) -} - -// String returns a hex string representation of the id. -// Example: ObjectIdHex("4d88e15b60f486e428412dc9"). -func (id ObjectId) String() string { - return fmt.Sprintf(`ObjectIdHex("%x")`, string(id)) -} - -// Hex returns a hex representation of the ObjectId. -func (id ObjectId) Hex() string { - return hex.EncodeToString([]byte(id)) -} - -// MarshalJSON turns a bson.ObjectId into a json.Marshaller. -func (id ObjectId) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%x"`, string(id))), nil -} - -var nullBytes = []byte("null") - -// UnmarshalJSON turns *bson.ObjectId into a json.Unmarshaller. -func (id *ObjectId) UnmarshalJSON(data []byte) error { - if len(data) == 2 && data[0] == '"' && data[1] == '"' || bytes.Equal(data, nullBytes) { - *id = "" - return nil - } - if len(data) != 26 || data[0] != '"' || data[25] != '"' { - return errors.New(fmt.Sprintf("Invalid ObjectId in JSON: %s", string(data))) - } - var buf [12]byte - _, err := hex.Decode(buf[:], data[1:25]) - if err != nil { - return errors.New(fmt.Sprintf("Invalid ObjectId in JSON: %s (%s)", string(data), err)) - } - *id = ObjectId(string(buf[:])) - return nil -} - -// Valid returns true if id is valid. A valid id must contain exactly 12 bytes. -func (id ObjectId) Valid() bool { - return len(id) == 12 -} - -// byteSlice returns byte slice of id from start to end. -// Calling this function with an invalid id will cause a runtime panic. -func (id ObjectId) byteSlice(start, end int) []byte { - if len(id) != 12 { - panic(fmt.Sprintf("Invalid ObjectId: %q", string(id))) - } - return []byte(string(id)[start:end]) -} - -// Time returns the timestamp part of the id. -// It's a runtime error to call this method with an invalid id. -func (id ObjectId) Time() time.Time { - // First 4 bytes of ObjectId is 32-bit big-endian seconds from epoch. - secs := int64(binary.BigEndian.Uint32(id.byteSlice(0, 4))) - return time.Unix(secs, 0) -} - -// Machine returns the 3-byte machine id part of the id. -// It's a runtime error to call this method with an invalid id. -func (id ObjectId) Machine() []byte { - return id.byteSlice(4, 7) -} - -// Pid returns the process id part of the id. -// It's a runtime error to call this method with an invalid id. -func (id ObjectId) Pid() uint16 { - return binary.BigEndian.Uint16(id.byteSlice(7, 9)) -} - -// Counter returns the incrementing value part of the id. -// It's a runtime error to call this method with an invalid id. -func (id ObjectId) Counter() int32 { - b := id.byteSlice(9, 12) - // Counter is stored as big-endian 3-byte value - return int32(uint32(b[0])<<16 | uint32(b[1])<<8 | uint32(b[2])) -} - -// The Symbol type is similar to a string and is used in languages with a -// distinct symbol type. -type Symbol string - -// Now returns the current time with millisecond precision. MongoDB stores -// timestamps with the same precision, so a Time returned from this method -// will not change after a roundtrip to the database. That's the only reason -// why this function exists. Using the time.Now function also works fine -// otherwise. -func Now() time.Time { - return time.Unix(0, time.Now().UnixNano()/1e6*1e6) -} - -// MongoTimestamp is a special internal type used by MongoDB that for some -// strange reason has its own datatype defined in BSON. -type MongoTimestamp int64 - -type orderKey int64 - -// MaxKey is a special value that compares higher than all other possible BSON -// values in a MongoDB database. -var MaxKey = orderKey(1<<63 - 1) - -// MinKey is a special value that compares lower than all other possible BSON -// values in a MongoDB database. -var MinKey = orderKey(-1 << 63) - -type undefined struct{} - -// Undefined represents the undefined BSON value. -var Undefined undefined - -// Binary is a representation for non-standard binary values. Any kind should -// work, but the following are known as of this writing: -// -// 0x00 - Generic. This is decoded as []byte(data), not Binary{0x00, data}. -// 0x01 - Function (!?) -// 0x02 - Obsolete generic. -// 0x03 - UUID -// 0x05 - MD5 -// 0x80 - User defined. -// -type Binary struct { - Kind byte - Data []byte -} - -// RegEx represents a regular expression. The Options field may contain -// individual characters defining the way in which the pattern should be -// applied, and must be sorted. Valid options as of this writing are 'i' for -// case insensitive matching, 'm' for multi-line matching, 'x' for verbose -// mode, 'l' to make \w, \W, and similar be locale-dependent, 's' for dot-all -// mode (a '.' matches everything), and 'u' to make \w, \W, and similar match -// unicode. The value of the Options parameter is not verified before being -// marshaled into the BSON format. -type RegEx struct { - Pattern string - Options string -} - -// JavaScript is a type that holds JavaScript code. If Scope is non-nil, it -// will be marshaled as a mapping from identifiers to values that may be -// used when evaluating the provided Code. -type JavaScript struct { - Code string - Scope interface{} -} - -// DBPointer refers to a document id in a namespace. -// -// This type is deprecated in the BSON specification and should not be used -// except for backwards compatibility with ancient applications. -type DBPointer struct { - Namespace string - Id ObjectId -} - -const initialBufferSize = 64 - -func handleErr(err *error) { - if r := recover(); r != nil { - if _, ok := r.(runtime.Error); ok { - panic(r) - } else if _, ok := r.(externalPanic); ok { - panic(r) - } else if s, ok := r.(string); ok { - *err = errors.New(s) - } else if e, ok := r.(error); ok { - *err = e - } else { - panic(r) - } - } -} - -// Marshal serializes the in value, which may be a map or a struct value. -// In the case of struct values, only exported fields will be serialized. -// The lowercased field name is used as the key for each exported field, -// but this behavior may be changed using the respective field tag. -// The tag may also contain flags to tweak the marshalling behavior for -// the field. The tag formats accepted are: -// -// "[][,[,]]" -// -// `(...) bson:"[][,[,]]" (...)` -// -// 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. -// -// minsize Marshal an int64 value as an int32, if that's feasible -// while preserving the numeric value. -// -// 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 bson keys of other struct fields. -// -// Some examples: -// -// type T struct { -// A bool -// B int "myb" -// C string "myc,omitempty" -// D string `bson:",omitempty" json:"jsonkey"` -// E int64 ",minsize" -// F int64 "myf,omitempty,minsize" -// } -// -func Marshal(in interface{}) (out []byte, err error) { - defer handleErr(&err) - e := &encoder{make([]byte, 0, initialBufferSize)} - e.addDoc(reflect.ValueOf(in)) - return e.out, nil -} - -// Unmarshal deserializes data from in into the out value. The out value -// must be a map, a pointer to a struct, or a pointer to a bson.D value. -// The lowercased field name is used as the key for each exported field, -// but this behavior may be changed using the respective field tag. -// The tag may also contain flags to tweak the marshalling behavior for -// the field. The tag formats accepted are: -// -// "[][,[,]]" -// -// `(...) bson:"[][,[,]]" (...)` -// -// The following flags are currently supported during unmarshal (see the -// Marshal method for other flags): -// -// inline Inline the field, which must be a struct or a map. -// Inlined structs are handled as if its fields were part -// of the outer struct. An inlined map causes keys that do -// not match any other struct field to be inserted in the -// map rather than being discarded as usual. -// -// The target field or element types of out may not necessarily match -// the BSON values of the provided data. The following conversions are -// made automatically: -// -// - Numeric types are converted if at least the integer part of the -// value would be preserved correctly -// - Bools are converted to numeric types as 1 or 0 -// - Numeric types are converted to bools as true if not 0 or false otherwise -// - Binary and string BSON data is converted to a string, array or byte slice -// -// If the value would not fit the type and cannot be converted, it's -// silently skipped. -// -// Pointer values are initialized when necessary. -func Unmarshal(in []byte, out interface{}) (err error) { - if raw, ok := out.(*Raw); ok { - raw.Kind = 3 - raw.Data = in - return nil - } - defer handleErr(&err) - v := reflect.ValueOf(out) - switch v.Kind() { - case reflect.Ptr: - fallthrough - case reflect.Map: - d := newDecoder(in) - d.readDocTo(v) - case reflect.Struct: - return errors.New("Unmarshal can't deal with struct values. Use a pointer.") - default: - return errors.New("Unmarshal needs a map or a pointer to a struct.") - } - return nil -} - -// Unmarshal deserializes raw into the out value. If the out value type -// is not compatible with raw, a *bson.TypeError is returned. -// -// See the Unmarshal function documentation for more details on the -// unmarshalling process. -func (raw Raw) Unmarshal(out interface{}) (err error) { - defer handleErr(&err) - v := reflect.ValueOf(out) - switch v.Kind() { - case reflect.Ptr: - v = v.Elem() - fallthrough - case reflect.Map: - d := newDecoder(raw.Data) - good := d.readElemTo(v, raw.Kind) - if !good { - return &TypeError{v.Type(), raw.Kind} - } - case reflect.Struct: - return errors.New("Raw Unmarshal can't deal with struct values. Use a pointer.") - default: - return errors.New("Raw Unmarshal needs a map or a valid pointer.") - } - return nil -} - -type TypeError struct { - Type reflect.Type - Kind byte -} - -func (e *TypeError) Error() string { - return fmt.Sprintf("BSON kind 0x%02x isn't compatible with type %s", e.Kind, e.Type.String()) -} - -// -------------------------------------------------------------------------- -// Maintain a mapping of keys to structure field indexes - -type structInfo struct { - FieldsMap map[string]fieldInfo - FieldsList []fieldInfo - InlineMap int - Zero reflect.Value -} - -type fieldInfo struct { - Key string - Num int - OmitEmpty bool - MinSize bool - Inline []int -} - -var structMap = make(map[reflect.Type]*structInfo) -var structMapMutex sync.RWMutex - -type externalPanic string - -func (e externalPanic) String() string { - return string(e) -} - -func getStructInfo(st reflect.Type) (*structInfo, error) { - structMapMutex.RLock() - sinfo, found := structMap[st] - structMapMutex.RUnlock() - if found { - return sinfo, nil - } - n := st.NumField() - fieldsMap := make(map[string]fieldInfo) - fieldsList := make([]fieldInfo, 0, n) - inlineMap := -1 - for i := 0; i != n; i++ { - field := st.Field(i) - if field.PkgPath != "" { - continue // Private field - } - - info := fieldInfo{Num: i} - - tag := field.Tag.Get("bson") - if tag == "" && strings.Index(string(field.Tag), ":") < 0 { - tag = string(field.Tag) - } - if tag == "-" { - continue - } - - // XXX Drop this after a few releases. - if s := strings.Index(tag, "/"); s >= 0 { - recommend := tag[:s] - for _, c := range tag[s+1:] { - switch c { - case 'c': - recommend += ",omitempty" - case 's': - recommend += ",minsize" - default: - msg := fmt.Sprintf("Unsupported flag %q in tag %q of type %s", string([]byte{uint8(c)}), tag, st) - panic(externalPanic(msg)) - } - } - msg := fmt.Sprintf("Replace tag %q in field %s of type %s by %q", tag, field.Name, st, recommend) - panic(externalPanic(msg)) - } - - inline := false - fields := strings.Split(tag, ",") - if len(fields) > 1 { - for _, flag := range fields[1:] { - switch flag { - case "omitempty": - info.OmitEmpty = true - case "minsize": - info.MinSize = true - case "inline": - inline = true - default: - msg := fmt.Sprintf("Unsupported flag %q in tag %q of type %s", flag, tag, st) - panic(externalPanic(msg)) - } - } - 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: - sinfo, err := getStructInfo(field.Type) - if err != nil { - return nil, err - } - 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...) - } - fieldsMap[finfo.Key] = finfo - fieldsList = append(fieldsList, finfo) - } - default: - panic("Option ,inline needs a struct value 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) - } - - fieldsList = append(fieldsList, info) - fieldsMap[info.Key] = info - } - sinfo = &structInfo{ - fieldsMap, - fieldsList, - inlineMap, - reflect.New(st).Elem(), - } - structMapMutex.Lock() - structMap[st] = sinfo - structMapMutex.Unlock() - return sinfo, nil -} diff --git a/vendor/gopkg.in/mgo.v2/bson/bson_test.go b/vendor/gopkg.in/mgo.v2/bson/bson_test.go deleted file mode 100644 index eb2e9f41e..000000000 --- a/vendor/gopkg.in/mgo.v2/bson/bson_test.go +++ /dev/null @@ -1,1605 +0,0 @@ -// BSON library for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// 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 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. -// gobson - BSON library for Go. - -package bson_test - -import ( - "encoding/binary" - "encoding/json" - "errors" - "net/url" - "reflect" - "testing" - "time" - - . "gopkg.in/check.v1" - "gopkg.in/mgo.v2/bson" -) - -func TestAll(t *testing.T) { - TestingT(t) -} - -type S struct{} - -var _ = Suite(&S{}) - -// Wrap up the document elements contained in data, prepending the int32 -// length of the data, and appending the '\x00' value closing the document. -func wrapInDoc(data string) string { - result := make([]byte, len(data)+5) - binary.LittleEndian.PutUint32(result, uint32(len(result))) - copy(result[4:], []byte(data)) - return string(result) -} - -func makeZeroDoc(value interface{}) (zero interface{}) { - v := reflect.ValueOf(value) - t := v.Type() - switch t.Kind() { - case reflect.Map: - mv := reflect.MakeMap(t) - zero = mv.Interface() - case reflect.Ptr: - pv := reflect.New(v.Type().Elem()) - zero = pv.Interface() - case reflect.Slice, reflect.Int: - zero = reflect.New(t).Interface() - default: - panic("unsupported doc type") - } - return zero -} - -func testUnmarshal(c *C, data string, obj interface{}) { - zero := makeZeroDoc(obj) - err := bson.Unmarshal([]byte(data), zero) - c.Assert(err, IsNil) - c.Assert(zero, DeepEquals, obj) -} - -type testItemType struct { - obj interface{} - data string -} - -// -------------------------------------------------------------------------- -// Samples from bsonspec.org: - -var sampleItems = []testItemType{ - {bson.M{"hello": "world"}, - "\x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00"}, - {bson.M{"BSON": []interface{}{"awesome", float64(5.05), 1986}}, - "1\x00\x00\x00\x04BSON\x00&\x00\x00\x00\x020\x00\x08\x00\x00\x00" + - "awesome\x00\x011\x00333333\x14@\x102\x00\xc2\x07\x00\x00\x00\x00"}, -} - -func (s *S) TestMarshalSampleItems(c *C) { - for i, item := range sampleItems { - data, err := bson.Marshal(item.obj) - c.Assert(err, IsNil) - c.Assert(string(data), Equals, item.data, Commentf("Failed on item %d", i)) - } -} - -func (s *S) TestUnmarshalSampleItems(c *C) { - for i, item := range sampleItems { - value := bson.M{} - err := bson.Unmarshal([]byte(item.data), value) - c.Assert(err, IsNil) - c.Assert(value, DeepEquals, item.obj, Commentf("Failed on item %d", i)) - } -} - -// -------------------------------------------------------------------------- -// Every type, ordered by the type flag. These are not wrapped with the -// length and last \x00 from the document. wrapInDoc() computes them. -// Note that all of them should be supported as two-way conversions. - -var allItems = []testItemType{ - {bson.M{}, - ""}, - {bson.M{"_": float64(5.05)}, - "\x01_\x00333333\x14@"}, - {bson.M{"_": "yo"}, - "\x02_\x00\x03\x00\x00\x00yo\x00"}, - {bson.M{"_": bson.M{"a": true}}, - "\x03_\x00\x09\x00\x00\x00\x08a\x00\x01\x00"}, - {bson.M{"_": []interface{}{true, false}}, - "\x04_\x00\r\x00\x00\x00\x080\x00\x01\x081\x00\x00\x00"}, - {bson.M{"_": []byte("yo")}, - "\x05_\x00\x02\x00\x00\x00\x00yo"}, - {bson.M{"_": bson.Binary{0x80, []byte("udef")}}, - "\x05_\x00\x04\x00\x00\x00\x80udef"}, - {bson.M{"_": bson.Undefined}, // Obsolete, but still seen in the wild. - "\x06_\x00"}, - {bson.M{"_": bson.ObjectId("0123456789ab")}, - "\x07_\x000123456789ab"}, - {bson.M{"_": bson.DBPointer{"testnamespace", bson.ObjectId("0123456789ab")}}, - "\x0C_\x00\x0e\x00\x00\x00testnamespace\x000123456789ab"}, - {bson.M{"_": false}, - "\x08_\x00\x00"}, - {bson.M{"_": true}, - "\x08_\x00\x01"}, - {bson.M{"_": time.Unix(0, 258e6)}, // Note the NS <=> MS conversion. - "\x09_\x00\x02\x01\x00\x00\x00\x00\x00\x00"}, - {bson.M{"_": nil}, - "\x0A_\x00"}, - {bson.M{"_": bson.RegEx{"ab", "cd"}}, - "\x0B_\x00ab\x00cd\x00"}, - {bson.M{"_": bson.JavaScript{"code", nil}}, - "\x0D_\x00\x05\x00\x00\x00code\x00"}, - {bson.M{"_": bson.Symbol("sym")}, - "\x0E_\x00\x04\x00\x00\x00sym\x00"}, - {bson.M{"_": bson.JavaScript{"code", bson.M{"": nil}}}, - "\x0F_\x00\x14\x00\x00\x00\x05\x00\x00\x00code\x00" + - "\x07\x00\x00\x00\x0A\x00\x00"}, - {bson.M{"_": 258}, - "\x10_\x00\x02\x01\x00\x00"}, - {bson.M{"_": bson.MongoTimestamp(258)}, - "\x11_\x00\x02\x01\x00\x00\x00\x00\x00\x00"}, - {bson.M{"_": int64(258)}, - "\x12_\x00\x02\x01\x00\x00\x00\x00\x00\x00"}, - {bson.M{"_": int64(258 << 32)}, - "\x12_\x00\x00\x00\x00\x00\x02\x01\x00\x00"}, - {bson.M{"_": bson.MaxKey}, - "\x7F_\x00"}, - {bson.M{"_": bson.MinKey}, - "\xFF_\x00"}, -} - -func (s *S) TestMarshalAllItems(c *C) { - for i, item := range allItems { - data, err := bson.Marshal(item.obj) - c.Assert(err, IsNil) - c.Assert(string(data), Equals, wrapInDoc(item.data), Commentf("Failed on item %d: %#v", i, item)) - } -} - -func (s *S) TestUnmarshalAllItems(c *C) { - for i, item := range allItems { - value := bson.M{} - err := bson.Unmarshal([]byte(wrapInDoc(item.data)), value) - c.Assert(err, IsNil) - c.Assert(value, DeepEquals, item.obj, Commentf("Failed on item %d: %#v", i, item)) - } -} - -func (s *S) TestUnmarshalRawAllItems(c *C) { - for i, item := range allItems { - if len(item.data) == 0 { - continue - } - value := item.obj.(bson.M)["_"] - if value == nil { - continue - } - pv := reflect.New(reflect.ValueOf(value).Type()) - raw := bson.Raw{item.data[0], []byte(item.data[3:])} - c.Logf("Unmarshal raw: %#v, %#v", raw, pv.Interface()) - err := raw.Unmarshal(pv.Interface()) - c.Assert(err, IsNil) - c.Assert(pv.Elem().Interface(), DeepEquals, value, Commentf("Failed on item %d: %#v", i, item)) - } -} - -func (s *S) TestUnmarshalRawIncompatible(c *C) { - raw := bson.Raw{0x08, []byte{0x01}} // true - err := raw.Unmarshal(&struct{}{}) - c.Assert(err, ErrorMatches, "BSON kind 0x08 isn't compatible with type struct \\{\\}") -} - -func (s *S) TestUnmarshalZeroesStruct(c *C) { - data, err := bson.Marshal(bson.M{"b": 2}) - c.Assert(err, IsNil) - type T struct{ A, B int } - v := T{A: 1} - err = bson.Unmarshal(data, &v) - c.Assert(err, IsNil) - c.Assert(v.A, Equals, 0) - c.Assert(v.B, Equals, 2) -} - -func (s *S) TestUnmarshalZeroesMap(c *C) { - data, err := bson.Marshal(bson.M{"b": 2}) - c.Assert(err, IsNil) - m := bson.M{"a": 1} - err = bson.Unmarshal(data, &m) - c.Assert(err, IsNil) - c.Assert(m, DeepEquals, bson.M{"b": 2}) -} - -func (s *S) TestUnmarshalNonNilInterface(c *C) { - data, err := bson.Marshal(bson.M{"b": 2}) - c.Assert(err, IsNil) - m := bson.M{"a": 1} - var i interface{} - i = m - err = bson.Unmarshal(data, &i) - c.Assert(err, IsNil) - c.Assert(i, DeepEquals, bson.M{"b": 2}) - c.Assert(m, DeepEquals, bson.M{"a": 1}) -} - -// -------------------------------------------------------------------------- -// Some one way marshaling operations which would unmarshal differently. - -var oneWayMarshalItems = []testItemType{ - // These are being passed as pointers, and will unmarshal as values. - {bson.M{"": &bson.Binary{0x02, []byte("old")}}, - "\x05\x00\x07\x00\x00\x00\x02\x03\x00\x00\x00old"}, - {bson.M{"": &bson.Binary{0x80, []byte("udef")}}, - "\x05\x00\x04\x00\x00\x00\x80udef"}, - {bson.M{"": &bson.RegEx{"ab", "cd"}}, - "\x0B\x00ab\x00cd\x00"}, - {bson.M{"": &bson.JavaScript{"code", nil}}, - "\x0D\x00\x05\x00\x00\x00code\x00"}, - {bson.M{"": &bson.JavaScript{"code", bson.M{"": nil}}}, - "\x0F\x00\x14\x00\x00\x00\x05\x00\x00\x00code\x00" + - "\x07\x00\x00\x00\x0A\x00\x00"}, - - // There's no float32 type in BSON. Will encode as a float64. - {bson.M{"": float32(5.05)}, - "\x01\x00\x00\x00\x00@33\x14@"}, - - // The array will be unmarshaled as a slice instead. - {bson.M{"": [2]bool{true, false}}, - "\x04\x00\r\x00\x00\x00\x080\x00\x01\x081\x00\x00\x00"}, - - // The typed slice will be unmarshaled as []interface{}. - {bson.M{"": []bool{true, false}}, - "\x04\x00\r\x00\x00\x00\x080\x00\x01\x081\x00\x00\x00"}, - - // Will unmarshal as a []byte. - {bson.M{"": bson.Binary{0x00, []byte("yo")}}, - "\x05\x00\x02\x00\x00\x00\x00yo"}, - {bson.M{"": bson.Binary{0x02, []byte("old")}}, - "\x05\x00\x07\x00\x00\x00\x02\x03\x00\x00\x00old"}, - - // No way to preserve the type information here. We might encode as a zero - // value, but this would mean that pointer values in structs wouldn't be - // able to correctly distinguish between unset and set to the zero value. - {bson.M{"": (*byte)(nil)}, - "\x0A\x00"}, - - // No int types smaller than int32 in BSON. Could encode this as a char, - // but it would still be ambiguous, take more, and be awkward in Go when - // loaded without typing information. - {bson.M{"": byte(8)}, - "\x10\x00\x08\x00\x00\x00"}, - - // There are no unsigned types in BSON. Will unmarshal as int32 or int64. - {bson.M{"": uint32(258)}, - "\x10\x00\x02\x01\x00\x00"}, - {bson.M{"": uint64(258)}, - "\x12\x00\x02\x01\x00\x00\x00\x00\x00\x00"}, - {bson.M{"": uint64(258 << 32)}, - "\x12\x00\x00\x00\x00\x00\x02\x01\x00\x00"}, - - // This will unmarshal as int. - {bson.M{"": int32(258)}, - "\x10\x00\x02\x01\x00\x00"}, - - // That's a special case. The unsigned value is too large for an int32, - // so an int64 is used instead. - {bson.M{"": uint32(1<<32 - 1)}, - "\x12\x00\xFF\xFF\xFF\xFF\x00\x00\x00\x00"}, - {bson.M{"": uint(1<<32 - 1)}, - "\x12\x00\xFF\xFF\xFF\xFF\x00\x00\x00\x00"}, -} - -func (s *S) TestOneWayMarshalItems(c *C) { - for i, item := range oneWayMarshalItems { - data, err := bson.Marshal(item.obj) - c.Assert(err, IsNil) - c.Assert(string(data), Equals, wrapInDoc(item.data), - Commentf("Failed on item %d", i)) - } -} - -// -------------------------------------------------------------------------- -// Two-way tests for user-defined structures using the samples -// from bsonspec.org. - -type specSample1 struct { - Hello string -} - -type specSample2 struct { - BSON []interface{} "BSON" -} - -var structSampleItems = []testItemType{ - {&specSample1{"world"}, - "\x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00"}, - {&specSample2{[]interface{}{"awesome", float64(5.05), 1986}}, - "1\x00\x00\x00\x04BSON\x00&\x00\x00\x00\x020\x00\x08\x00\x00\x00" + - "awesome\x00\x011\x00333333\x14@\x102\x00\xc2\x07\x00\x00\x00\x00"}, -} - -func (s *S) TestMarshalStructSampleItems(c *C) { - for i, item := range structSampleItems { - data, err := bson.Marshal(item.obj) - c.Assert(err, IsNil) - c.Assert(string(data), Equals, item.data, - Commentf("Failed on item %d", i)) - } -} - -func (s *S) TestUnmarshalStructSampleItems(c *C) { - for _, item := range structSampleItems { - testUnmarshal(c, item.data, item.obj) - } -} - -func (s *S) Test64bitInt(c *C) { - var i int64 = (1 << 31) - if int(i) > 0 { - data, err := bson.Marshal(bson.M{"i": int(i)}) - c.Assert(err, IsNil) - c.Assert(string(data), Equals, wrapInDoc("\x12i\x00\x00\x00\x00\x80\x00\x00\x00\x00")) - - var result struct{ I int } - err = bson.Unmarshal(data, &result) - c.Assert(err, IsNil) - c.Assert(int64(result.I), Equals, i) - } -} - -// -------------------------------------------------------------------------- -// Generic two-way struct marshaling tests. - -var bytevar = byte(8) -var byteptr = &bytevar - -var structItems = []testItemType{ - {&struct{ Ptr *byte }{nil}, - "\x0Aptr\x00"}, - {&struct{ Ptr *byte }{&bytevar}, - "\x10ptr\x00\x08\x00\x00\x00"}, - {&struct{ Ptr **byte }{&byteptr}, - "\x10ptr\x00\x08\x00\x00\x00"}, - {&struct{ Byte byte }{8}, - "\x10byte\x00\x08\x00\x00\x00"}, - {&struct{ Byte byte }{0}, - "\x10byte\x00\x00\x00\x00\x00"}, - {&struct { - V byte "Tag" - }{8}, - "\x10Tag\x00\x08\x00\x00\x00"}, - {&struct { - V *struct { - Byte byte - } - }{&struct{ Byte byte }{8}}, - "\x03v\x00" + "\x0f\x00\x00\x00\x10byte\x00\b\x00\x00\x00\x00"}, - {&struct{ priv byte }{}, ""}, - - // The order of the dumped fields should be the same in the struct. - {&struct{ A, C, B, D, F, E *byte }{}, - "\x0Aa\x00\x0Ac\x00\x0Ab\x00\x0Ad\x00\x0Af\x00\x0Ae\x00"}, - - {&struct{ V bson.Raw }{bson.Raw{0x03, []byte("\x0f\x00\x00\x00\x10byte\x00\b\x00\x00\x00\x00")}}, - "\x03v\x00" + "\x0f\x00\x00\x00\x10byte\x00\b\x00\x00\x00\x00"}, - {&struct{ V bson.Raw }{bson.Raw{0x10, []byte("\x00\x00\x00\x00")}}, - "\x10v\x00" + "\x00\x00\x00\x00"}, - - // Byte arrays. - {&struct{ V [2]byte }{[2]byte{'y', 'o'}}, - "\x05v\x00\x02\x00\x00\x00\x00yo"}, -} - -func (s *S) TestMarshalStructItems(c *C) { - for i, item := range structItems { - data, err := bson.Marshal(item.obj) - c.Assert(err, IsNil) - c.Assert(string(data), Equals, wrapInDoc(item.data), - Commentf("Failed on item %d", i)) - } -} - -func (s *S) TestUnmarshalStructItems(c *C) { - for _, item := range structItems { - testUnmarshal(c, wrapInDoc(item.data), item.obj) - } -} - -func (s *S) TestUnmarshalRawStructItems(c *C) { - for i, item := range structItems { - raw := bson.Raw{0x03, []byte(wrapInDoc(item.data))} - zero := makeZeroDoc(item.obj) - err := raw.Unmarshal(zero) - c.Assert(err, IsNil) - c.Assert(zero, DeepEquals, item.obj, Commentf("Failed on item %d: %#v", i, item)) - } -} - -func (s *S) TestUnmarshalRawNil(c *C) { - // Regression test: shouldn't try to nil out the pointer itself, - // as it's not settable. - raw := bson.Raw{0x0A, []byte{}} - err := raw.Unmarshal(&struct{}{}) - c.Assert(err, IsNil) -} - -// -------------------------------------------------------------------------- -// One-way marshaling tests. - -type dOnIface struct { - D interface{} -} - -type ignoreField struct { - Before string - Ignore string `bson:"-"` - After string -} - -var marshalItems = []testItemType{ - // Ordered document dump. Will unmarshal as a dictionary by default. - {bson.D{{"a", nil}, {"c", nil}, {"b", nil}, {"d", nil}, {"f", nil}, {"e", true}}, - "\x0Aa\x00\x0Ac\x00\x0Ab\x00\x0Ad\x00\x0Af\x00\x08e\x00\x01"}, - {MyD{{"a", nil}, {"c", nil}, {"b", nil}, {"d", nil}, {"f", nil}, {"e", true}}, - "\x0Aa\x00\x0Ac\x00\x0Ab\x00\x0Ad\x00\x0Af\x00\x08e\x00\x01"}, - {&dOnIface{bson.D{{"a", nil}, {"c", nil}, {"b", nil}, {"d", true}}}, - "\x03d\x00" + wrapInDoc("\x0Aa\x00\x0Ac\x00\x0Ab\x00\x08d\x00\x01")}, - - {bson.RawD{{"a", bson.Raw{0x0A, nil}}, {"c", bson.Raw{0x0A, nil}}, {"b", bson.Raw{0x08, []byte{0x01}}}}, - "\x0Aa\x00" + "\x0Ac\x00" + "\x08b\x00\x01"}, - {MyRawD{{"a", bson.Raw{0x0A, nil}}, {"c", bson.Raw{0x0A, nil}}, {"b", bson.Raw{0x08, []byte{0x01}}}}, - "\x0Aa\x00" + "\x0Ac\x00" + "\x08b\x00\x01"}, - {&dOnIface{bson.RawD{{"a", bson.Raw{0x0A, nil}}, {"c", bson.Raw{0x0A, nil}}, {"b", bson.Raw{0x08, []byte{0x01}}}}}, - "\x03d\x00" + wrapInDoc("\x0Aa\x00"+"\x0Ac\x00"+"\x08b\x00\x01")}, - - {&ignoreField{"before", "ignore", "after"}, - "\x02before\x00\a\x00\x00\x00before\x00\x02after\x00\x06\x00\x00\x00after\x00"}, - - // Marshalling a Raw document does nothing. - {bson.Raw{0x03, []byte(wrapInDoc("anything"))}, - "anything"}, - {bson.Raw{Data: []byte(wrapInDoc("anything"))}, - "anything"}, -} - -func (s *S) TestMarshalOneWayItems(c *C) { - for _, item := range marshalItems { - data, err := bson.Marshal(item.obj) - c.Assert(err, IsNil) - c.Assert(string(data), Equals, wrapInDoc(item.data)) - } -} - -// -------------------------------------------------------------------------- -// One-way unmarshaling tests. - -var unmarshalItems = []testItemType{ - // Field is private. Should not attempt to unmarshal it. - {&struct{ priv byte }{}, - "\x10priv\x00\x08\x00\x00\x00"}, - - // Wrong casing. Field names are lowercased. - {&struct{ Byte byte }{}, - "\x10Byte\x00\x08\x00\x00\x00"}, - - // Ignore non-existing field. - {&struct{ Byte byte }{9}, - "\x10boot\x00\x08\x00\x00\x00" + "\x10byte\x00\x09\x00\x00\x00"}, - - // Do not unmarshal on ignored field. - {&ignoreField{"before", "", "after"}, - "\x02before\x00\a\x00\x00\x00before\x00" + - "\x02-\x00\a\x00\x00\x00ignore\x00" + - "\x02after\x00\x06\x00\x00\x00after\x00"}, - - // Ignore unsuitable types silently. - {map[string]string{"str": "s"}, - "\x02str\x00\x02\x00\x00\x00s\x00" + "\x10int\x00\x01\x00\x00\x00"}, - {map[string][]int{"array": []int{5, 9}}, - "\x04array\x00" + wrapInDoc("\x100\x00\x05\x00\x00\x00"+"\x021\x00\x02\x00\x00\x00s\x00"+"\x102\x00\x09\x00\x00\x00")}, - - // Wrong type. Shouldn't init pointer. - {&struct{ Str *byte }{}, - "\x02str\x00\x02\x00\x00\x00s\x00"}, - {&struct{ Str *struct{ Str string } }{}, - "\x02str\x00\x02\x00\x00\x00s\x00"}, - - // Ordered document. - {&struct{ bson.D }{bson.D{{"a", nil}, {"c", nil}, {"b", nil}, {"d", true}}}, - "\x03d\x00" + wrapInDoc("\x0Aa\x00\x0Ac\x00\x0Ab\x00\x08d\x00\x01")}, - - // Raw document. - {&bson.Raw{0x03, []byte(wrapInDoc("\x10byte\x00\x08\x00\x00\x00"))}, - "\x10byte\x00\x08\x00\x00\x00"}, - - // RawD document. - {&struct{ bson.RawD }{bson.RawD{{"a", bson.Raw{0x0A, []byte{}}}, {"c", bson.Raw{0x0A, []byte{}}}, {"b", bson.Raw{0x08, []byte{0x01}}}}}, - "\x03rawd\x00" + wrapInDoc("\x0Aa\x00\x0Ac\x00\x08b\x00\x01")}, - - // Decode old binary. - {bson.M{"_": []byte("old")}, - "\x05_\x00\x07\x00\x00\x00\x02\x03\x00\x00\x00old"}, - - // Decode old binary without length. According to the spec, this shouldn't happen. - {bson.M{"_": []byte("old")}, - "\x05_\x00\x03\x00\x00\x00\x02old"}, -} - -func (s *S) TestUnmarshalOneWayItems(c *C) { - for _, item := range unmarshalItems { - testUnmarshal(c, wrapInDoc(item.data), item.obj) - } -} - -func (s *S) TestUnmarshalNilInStruct(c *C) { - // Nil is the default value, so we need to ensure it's indeed being set. - b := byte(1) - v := &struct{ Ptr *byte }{&b} - err := bson.Unmarshal([]byte(wrapInDoc("\x0Aptr\x00")), v) - c.Assert(err, IsNil) - c.Assert(v, DeepEquals, &struct{ Ptr *byte }{nil}) -} - -// -------------------------------------------------------------------------- -// Marshalling error cases. - -type structWithDupKeys struct { - Name byte - Other byte "name" // Tag should precede. -} - -var marshalErrorItems = []testItemType{ - {bson.M{"": uint64(1 << 63)}, - "BSON has no uint64 type, and value is too large to fit correctly in an int64"}, - {bson.M{"": bson.ObjectId("tooshort")}, - "ObjectIDs must be exactly 12 bytes long \\(got 8\\)"}, - {int64(123), - "Can't marshal int64 as a BSON document"}, - {bson.M{"": 1i}, - "Can't marshal complex128 in a BSON document"}, - {&structWithDupKeys{}, - "Duplicated key 'name' in struct bson_test.structWithDupKeys"}, - {bson.Raw{0x0A, []byte{}}, - "Attempted to unmarshal Raw kind 10 as a document"}, - {&inlineCantPtr{&struct{ A, B int }{1, 2}}, - "Option ,inline needs a struct value or map field"}, - {&inlineDupName{1, struct{ A, B int }{2, 3}}, - "Duplicated key 'a' in struct bson_test.inlineDupName"}, - {&inlineDupMap{}, - "Multiple ,inline maps in struct bson_test.inlineDupMap"}, - {&inlineBadKeyMap{}, - "Option ,inline needs a map with string keys in struct bson_test.inlineBadKeyMap"}, - {&inlineMap{A: 1, M: map[string]interface{}{"a": 1}}, - `Can't have key "a" in inlined map; conflicts with struct field`}, -} - -func (s *S) TestMarshalErrorItems(c *C) { - for _, item := range marshalErrorItems { - data, err := bson.Marshal(item.obj) - c.Assert(err, ErrorMatches, item.data) - c.Assert(data, IsNil) - } -} - -// -------------------------------------------------------------------------- -// Unmarshalling error cases. - -type unmarshalErrorType struct { - obj interface{} - data string - error string -} - -var unmarshalErrorItems = []unmarshalErrorType{ - // Tag name conflicts with existing parameter. - {&structWithDupKeys{}, - "\x10name\x00\x08\x00\x00\x00", - "Duplicated key 'name' in struct bson_test.structWithDupKeys"}, - - // Non-string map key. - {map[int]interface{}{}, - "\x10name\x00\x08\x00\x00\x00", - "BSON map must have string keys. Got: map\\[int\\]interface \\{\\}"}, - - {nil, - "\xEEname\x00", - "Unknown element kind \\(0xEE\\)"}, - - {struct{ Name bool }{}, - "\x10name\x00\x08\x00\x00\x00", - "Unmarshal can't deal with struct values. Use a pointer."}, - - {123, - "\x10name\x00\x08\x00\x00\x00", - "Unmarshal needs a map or a pointer to a struct."}, -} - -func (s *S) TestUnmarshalErrorItems(c *C) { - for _, item := range unmarshalErrorItems { - data := []byte(wrapInDoc(item.data)) - var value interface{} - switch reflect.ValueOf(item.obj).Kind() { - case reflect.Map, reflect.Ptr: - value = makeZeroDoc(item.obj) - case reflect.Invalid: - value = bson.M{} - default: - value = item.obj - } - err := bson.Unmarshal(data, value) - c.Assert(err, ErrorMatches, item.error) - } -} - -type unmarshalRawErrorType struct { - obj interface{} - raw bson.Raw - error string -} - -var unmarshalRawErrorItems = []unmarshalRawErrorType{ - // Tag name conflicts with existing parameter. - {&structWithDupKeys{}, - bson.Raw{0x03, []byte("\x10byte\x00\x08\x00\x00\x00")}, - "Duplicated key 'name' in struct bson_test.structWithDupKeys"}, - - {&struct{}{}, - bson.Raw{0xEE, []byte{}}, - "Unknown element kind \\(0xEE\\)"}, - - {struct{ Name bool }{}, - bson.Raw{0x10, []byte("\x08\x00\x00\x00")}, - "Raw Unmarshal can't deal with struct values. Use a pointer."}, - - {123, - bson.Raw{0x10, []byte("\x08\x00\x00\x00")}, - "Raw Unmarshal needs a map or a valid pointer."}, -} - -func (s *S) TestUnmarshalRawErrorItems(c *C) { - for i, item := range unmarshalRawErrorItems { - err := item.raw.Unmarshal(item.obj) - c.Assert(err, ErrorMatches, item.error, Commentf("Failed on item %d: %#v\n", i, item)) - } -} - -var corruptedData = []string{ - "\x04\x00\x00\x00\x00", // Shorter than minimum - "\x06\x00\x00\x00\x00", // Not enough data - "\x05\x00\x00", // Broken length - "\x05\x00\x00\x00\xff", // Corrupted termination - "\x0A\x00\x00\x00\x0Aooop\x00", // Unfinished C string - - // Array end past end of string (s[2]=0x07 is correct) - wrapInDoc("\x04\x00\x09\x00\x00\x00\x0A\x00\x00"), - - // Array end within string, but past acceptable. - wrapInDoc("\x04\x00\x08\x00\x00\x00\x0A\x00\x00"), - - // Document end within string, but past acceptable. - wrapInDoc("\x03\x00\x08\x00\x00\x00\x0A\x00\x00"), - - // String with corrupted end. - wrapInDoc("\x02\x00\x03\x00\x00\x00yo\xFF"), -} - -func (s *S) TestUnmarshalMapDocumentTooShort(c *C) { - for _, data := range corruptedData { - err := bson.Unmarshal([]byte(data), bson.M{}) - c.Assert(err, ErrorMatches, "Document is corrupted") - - err = bson.Unmarshal([]byte(data), &struct{}{}) - c.Assert(err, ErrorMatches, "Document is corrupted") - } -} - -// -------------------------------------------------------------------------- -// Setter test cases. - -var setterResult = map[string]error{} - -type setterType struct { - received interface{} -} - -func (o *setterType) SetBSON(raw bson.Raw) error { - err := raw.Unmarshal(&o.received) - if err != nil { - panic("The panic:" + err.Error()) - } - if s, ok := o.received.(string); ok { - if result, ok := setterResult[s]; ok { - return result - } - } - return nil -} - -type ptrSetterDoc struct { - Field *setterType "_" -} - -type valSetterDoc struct { - Field setterType "_" -} - -func (s *S) TestUnmarshalAllItemsWithPtrSetter(c *C) { - for _, item := range allItems { - for i := 0; i != 2; i++ { - var field *setterType - if i == 0 { - obj := &ptrSetterDoc{} - err := bson.Unmarshal([]byte(wrapInDoc(item.data)), obj) - c.Assert(err, IsNil) - field = obj.Field - } else { - obj := &valSetterDoc{} - err := bson.Unmarshal([]byte(wrapInDoc(item.data)), obj) - c.Assert(err, IsNil) - field = &obj.Field - } - if item.data == "" { - // Nothing to unmarshal. Should be untouched. - if i == 0 { - c.Assert(field, IsNil) - } else { - c.Assert(field.received, IsNil) - } - } else { - expected := item.obj.(bson.M)["_"] - c.Assert(field, NotNil, Commentf("Pointer not initialized (%#v)", expected)) - c.Assert(field.received, DeepEquals, expected) - } - } - } -} - -func (s *S) TestUnmarshalWholeDocumentWithSetter(c *C) { - obj := &setterType{} - err := bson.Unmarshal([]byte(sampleItems[0].data), obj) - c.Assert(err, IsNil) - c.Assert(obj.received, DeepEquals, bson.M{"hello": "world"}) -} - -func (s *S) TestUnmarshalSetterOmits(c *C) { - setterResult["2"] = &bson.TypeError{} - setterResult["4"] = &bson.TypeError{} - defer func() { - delete(setterResult, "2") - delete(setterResult, "4") - }() - - m := map[string]*setterType{} - data := wrapInDoc("\x02abc\x00\x02\x00\x00\x001\x00" + - "\x02def\x00\x02\x00\x00\x002\x00" + - "\x02ghi\x00\x02\x00\x00\x003\x00" + - "\x02jkl\x00\x02\x00\x00\x004\x00") - err := bson.Unmarshal([]byte(data), m) - c.Assert(err, IsNil) - c.Assert(m["abc"], NotNil) - c.Assert(m["def"], IsNil) - c.Assert(m["ghi"], NotNil) - c.Assert(m["jkl"], IsNil) - - c.Assert(m["abc"].received, Equals, "1") - c.Assert(m["ghi"].received, Equals, "3") -} - -func (s *S) TestUnmarshalSetterErrors(c *C) { - boom := errors.New("BOOM") - setterResult["2"] = boom - defer delete(setterResult, "2") - - m := map[string]*setterType{} - data := wrapInDoc("\x02abc\x00\x02\x00\x00\x001\x00" + - "\x02def\x00\x02\x00\x00\x002\x00" + - "\x02ghi\x00\x02\x00\x00\x003\x00") - err := bson.Unmarshal([]byte(data), m) - c.Assert(err, Equals, boom) - c.Assert(m["abc"], NotNil) - c.Assert(m["def"], IsNil) - c.Assert(m["ghi"], IsNil) - - c.Assert(m["abc"].received, Equals, "1") -} - -func (s *S) TestDMap(c *C) { - d := bson.D{{"a", 1}, {"b", 2}} - c.Assert(d.Map(), DeepEquals, bson.M{"a": 1, "b": 2}) -} - -func (s *S) TestUnmarshalSetterSetZero(c *C) { - setterResult["foo"] = bson.SetZero - defer delete(setterResult, "field") - - data, err := bson.Marshal(bson.M{"field": "foo"}) - c.Assert(err, IsNil) - - m := map[string]*setterType{} - err = bson.Unmarshal([]byte(data), m) - c.Assert(err, IsNil) - - value, ok := m["field"] - c.Assert(ok, Equals, true) - c.Assert(value, IsNil) -} - -// -------------------------------------------------------------------------- -// Getter test cases. - -type typeWithGetter struct { - result interface{} - err error -} - -func (t *typeWithGetter) GetBSON() (interface{}, error) { - if t == nil { - return "", nil - } - return t.result, t.err -} - -type docWithGetterField struct { - Field *typeWithGetter "_" -} - -func (s *S) TestMarshalAllItemsWithGetter(c *C) { - for i, item := range allItems { - if item.data == "" { - continue - } - obj := &docWithGetterField{} - obj.Field = &typeWithGetter{result: item.obj.(bson.M)["_"]} - data, err := bson.Marshal(obj) - c.Assert(err, IsNil) - c.Assert(string(data), Equals, wrapInDoc(item.data), - Commentf("Failed on item #%d", i)) - } -} - -func (s *S) TestMarshalWholeDocumentWithGetter(c *C) { - obj := &typeWithGetter{result: sampleItems[0].obj} - data, err := bson.Marshal(obj) - c.Assert(err, IsNil) - c.Assert(string(data), Equals, sampleItems[0].data) -} - -func (s *S) TestGetterErrors(c *C) { - e := errors.New("oops") - - obj1 := &docWithGetterField{} - obj1.Field = &typeWithGetter{sampleItems[0].obj, e} - data, err := bson.Marshal(obj1) - c.Assert(err, ErrorMatches, "oops") - c.Assert(data, IsNil) - - obj2 := &typeWithGetter{sampleItems[0].obj, e} - data, err = bson.Marshal(obj2) - c.Assert(err, ErrorMatches, "oops") - c.Assert(data, IsNil) -} - -type intGetter int64 - -func (t intGetter) GetBSON() (interface{}, error) { - return int64(t), nil -} - -type typeWithIntGetter struct { - V intGetter ",minsize" -} - -func (s *S) TestMarshalShortWithGetter(c *C) { - obj := typeWithIntGetter{42} - data, err := bson.Marshal(obj) - c.Assert(err, IsNil) - m := bson.M{} - err = bson.Unmarshal(data, m) - c.Assert(err, IsNil) - c.Assert(m["v"], Equals, 42) -} - -func (s *S) TestMarshalWithGetterNil(c *C) { - obj := docWithGetterField{} - data, err := bson.Marshal(obj) - c.Assert(err, IsNil) - m := bson.M{} - err = bson.Unmarshal(data, m) - c.Assert(err, IsNil) - c.Assert(m, DeepEquals, bson.M{"_": ""}) -} - -// -------------------------------------------------------------------------- -// Cross-type conversion tests. - -type crossTypeItem struct { - obj1 interface{} - obj2 interface{} -} - -type condStr struct { - V string ",omitempty" -} -type condStrNS struct { - V string `a:"A" bson:",omitempty" b:"B"` -} -type condBool struct { - V bool ",omitempty" -} -type condInt struct { - V int ",omitempty" -} -type condUInt struct { - V uint ",omitempty" -} -type condFloat struct { - V float64 ",omitempty" -} -type condIface struct { - V interface{} ",omitempty" -} -type condPtr struct { - V *bool ",omitempty" -} -type condSlice struct { - V []string ",omitempty" -} -type condMap struct { - V map[string]int ",omitempty" -} -type namedCondStr struct { - V string "myv,omitempty" -} -type condTime struct { - V time.Time ",omitempty" -} -type condStruct struct { - V struct{ A []int } ",omitempty" -} - -type shortInt struct { - V int64 ",minsize" -} -type shortUint struct { - V uint64 ",minsize" -} -type shortIface struct { - V interface{} ",minsize" -} -type shortPtr struct { - V *int64 ",minsize" -} -type shortNonEmptyInt struct { - V int64 ",minsize,omitempty" -} - -type inlineInt struct { - V struct{ A, B int } ",inline" -} -type inlineCantPtr struct { - V *struct{ A, B int } ",inline" -} -type inlineDupName struct { - A int - V struct{ A, B int } ",inline" -} -type inlineMap struct { - A int - M map[string]interface{} ",inline" -} -type inlineMapInt struct { - A int - M map[string]int ",inline" -} -type inlineMapMyM struct { - A int - M MyM ",inline" -} -type inlineDupMap struct { - M1 map[string]interface{} ",inline" - M2 map[string]interface{} ",inline" -} -type inlineBadKeyMap struct { - M map[int]int ",inline" -} - -type getterSetterD bson.D - -func (s getterSetterD) GetBSON() (interface{}, error) { - if len(s) == 0 { - return bson.D{}, nil - } - return bson.D(s[:len(s)-1]), nil -} - -func (s *getterSetterD) SetBSON(raw bson.Raw) error { - var doc bson.D - err := raw.Unmarshal(&doc) - doc = append(doc, bson.DocElem{"suffix", true}) - *s = getterSetterD(doc) - return err -} - -type getterSetterInt int - -func (i getterSetterInt) GetBSON() (interface{}, error) { - return bson.D{{"a", int(i)}}, nil -} - -func (i *getterSetterInt) SetBSON(raw bson.Raw) error { - var doc struct{ A int } - err := raw.Unmarshal(&doc) - *i = getterSetterInt(doc.A) - return err -} - -type ifaceType interface { - Hello() -} - -type ifaceSlice []ifaceType - -func (s *ifaceSlice) SetBSON(raw bson.Raw) error { - var ns []int - if err := raw.Unmarshal(&ns); err != nil { - return err - } - *s = make(ifaceSlice, ns[0]) - return nil -} - -func (s ifaceSlice) GetBSON() (interface{}, error) { - return []int{len(s)}, nil -} - -type ( - MyString string - MyBytes []byte - MyBool bool - MyD []bson.DocElem - MyRawD []bson.RawDocElem - MyM map[string]interface{} -) - -var ( - truevar = true - falsevar = false - - int64var = int64(42) - int64ptr = &int64var - intvar = int(42) - intptr = &intvar - - gsintvar = getterSetterInt(42) -) - -func parseURL(s string) *url.URL { - u, err := url.Parse(s) - if err != nil { - panic(err) - } - return u -} - -// That's a pretty fun test. It will dump the first item, generate a zero -// value equivalent to the second one, load the dumped data onto it, and then -// verify that the resulting value is deep-equal to the untouched second value. -// Then, it will do the same in the *opposite* direction! -var twoWayCrossItems = []crossTypeItem{ - // int<=>int - {&struct{ I int }{42}, &struct{ I int8 }{42}}, - {&struct{ I int }{42}, &struct{ I int32 }{42}}, - {&struct{ I int }{42}, &struct{ I int64 }{42}}, - {&struct{ I int8 }{42}, &struct{ I int32 }{42}}, - {&struct{ I int8 }{42}, &struct{ I int64 }{42}}, - {&struct{ I int32 }{42}, &struct{ I int64 }{42}}, - - // uint<=>uint - {&struct{ I uint }{42}, &struct{ I uint8 }{42}}, - {&struct{ I uint }{42}, &struct{ I uint32 }{42}}, - {&struct{ I uint }{42}, &struct{ I uint64 }{42}}, - {&struct{ I uint8 }{42}, &struct{ I uint32 }{42}}, - {&struct{ I uint8 }{42}, &struct{ I uint64 }{42}}, - {&struct{ I uint32 }{42}, &struct{ I uint64 }{42}}, - - // float32<=>float64 - {&struct{ I float32 }{42}, &struct{ I float64 }{42}}, - - // int<=>uint - {&struct{ I uint }{42}, &struct{ I int }{42}}, - {&struct{ I uint }{42}, &struct{ I int8 }{42}}, - {&struct{ I uint }{42}, &struct{ I int32 }{42}}, - {&struct{ I uint }{42}, &struct{ I int64 }{42}}, - {&struct{ I uint8 }{42}, &struct{ I int }{42}}, - {&struct{ I uint8 }{42}, &struct{ I int8 }{42}}, - {&struct{ I uint8 }{42}, &struct{ I int32 }{42}}, - {&struct{ I uint8 }{42}, &struct{ I int64 }{42}}, - {&struct{ I uint32 }{42}, &struct{ I int }{42}}, - {&struct{ I uint32 }{42}, &struct{ I int8 }{42}}, - {&struct{ I uint32 }{42}, &struct{ I int32 }{42}}, - {&struct{ I uint32 }{42}, &struct{ I int64 }{42}}, - {&struct{ I uint64 }{42}, &struct{ I int }{42}}, - {&struct{ I uint64 }{42}, &struct{ I int8 }{42}}, - {&struct{ I uint64 }{42}, &struct{ I int32 }{42}}, - {&struct{ I uint64 }{42}, &struct{ I int64 }{42}}, - - // int <=> float - {&struct{ I int }{42}, &struct{ I float64 }{42}}, - - // int <=> bool - {&struct{ I int }{1}, &struct{ I bool }{true}}, - {&struct{ I int }{0}, &struct{ I bool }{false}}, - - // uint <=> float64 - {&struct{ I uint }{42}, &struct{ I float64 }{42}}, - - // uint <=> bool - {&struct{ I uint }{1}, &struct{ I bool }{true}}, - {&struct{ I uint }{0}, &struct{ I bool }{false}}, - - // float64 <=> bool - {&struct{ I float64 }{1}, &struct{ I bool }{true}}, - {&struct{ I float64 }{0}, &struct{ I bool }{false}}, - - // string <=> string and string <=> []byte - {&struct{ S []byte }{[]byte("abc")}, &struct{ S string }{"abc"}}, - {&struct{ S []byte }{[]byte("def")}, &struct{ S bson.Symbol }{"def"}}, - {&struct{ S string }{"ghi"}, &struct{ S bson.Symbol }{"ghi"}}, - - // map <=> struct - {&struct { - A struct { - B, C int - } - }{struct{ B, C int }{1, 2}}, - map[string]map[string]int{"a": map[string]int{"b": 1, "c": 2}}}, - - {&struct{ A bson.Symbol }{"abc"}, map[string]string{"a": "abc"}}, - {&struct{ A bson.Symbol }{"abc"}, map[string][]byte{"a": []byte("abc")}}, - {&struct{ A []byte }{[]byte("abc")}, map[string]string{"a": "abc"}}, - {&struct{ A uint }{42}, map[string]int{"a": 42}}, - {&struct{ A uint }{42}, map[string]float64{"a": 42}}, - {&struct{ A uint }{1}, map[string]bool{"a": true}}, - {&struct{ A int }{42}, map[string]uint{"a": 42}}, - {&struct{ A int }{42}, map[string]float64{"a": 42}}, - {&struct{ A int }{1}, map[string]bool{"a": true}}, - {&struct{ A float64 }{42}, map[string]float32{"a": 42}}, - {&struct{ A float64 }{42}, map[string]int{"a": 42}}, - {&struct{ A float64 }{42}, map[string]uint{"a": 42}}, - {&struct{ A float64 }{1}, map[string]bool{"a": true}}, - {&struct{ A bool }{true}, map[string]int{"a": 1}}, - {&struct{ A bool }{true}, map[string]uint{"a": 1}}, - {&struct{ A bool }{true}, map[string]float64{"a": 1}}, - {&struct{ A **byte }{&byteptr}, map[string]byte{"a": 8}}, - - // url.URL <=> string - {&struct{ URL *url.URL }{parseURL("h://e.c/p")}, map[string]string{"url": "h://e.c/p"}}, - {&struct{ URL url.URL }{*parseURL("h://e.c/p")}, map[string]string{"url": "h://e.c/p"}}, - - // Slices - {&struct{ S []int }{[]int{1, 2, 3}}, map[string][]int{"s": []int{1, 2, 3}}}, - {&struct{ S *[]int }{&[]int{1, 2, 3}}, map[string][]int{"s": []int{1, 2, 3}}}, - - // Conditionals - {&condBool{true}, map[string]bool{"v": true}}, - {&condBool{}, map[string]bool{}}, - {&condInt{1}, map[string]int{"v": 1}}, - {&condInt{}, map[string]int{}}, - {&condUInt{1}, map[string]uint{"v": 1}}, - {&condUInt{}, map[string]uint{}}, - {&condFloat{}, map[string]int{}}, - {&condStr{"yo"}, map[string]string{"v": "yo"}}, - {&condStr{}, map[string]string{}}, - {&condStrNS{"yo"}, map[string]string{"v": "yo"}}, - {&condStrNS{}, map[string]string{}}, - {&condSlice{[]string{"yo"}}, map[string][]string{"v": []string{"yo"}}}, - {&condSlice{}, map[string][]string{}}, - {&condMap{map[string]int{"k": 1}}, bson.M{"v": bson.M{"k": 1}}}, - {&condMap{}, map[string][]string{}}, - {&condIface{"yo"}, map[string]string{"v": "yo"}}, - {&condIface{""}, map[string]string{"v": ""}}, - {&condIface{}, map[string]string{}}, - {&condPtr{&truevar}, map[string]bool{"v": true}}, - {&condPtr{&falsevar}, map[string]bool{"v": false}}, - {&condPtr{}, map[string]string{}}, - - {&condTime{time.Unix(123456789, 123e6)}, map[string]time.Time{"v": time.Unix(123456789, 123e6)}}, - {&condTime{}, map[string]string{}}, - - {&condStruct{struct{ A []int }{[]int{1}}}, bson.M{"v": bson.M{"a": []interface{}{1}}}}, - {&condStruct{struct{ A []int }{}}, bson.M{}}, - - {&namedCondStr{"yo"}, map[string]string{"myv": "yo"}}, - {&namedCondStr{}, map[string]string{}}, - - {&shortInt{1}, map[string]interface{}{"v": 1}}, - {&shortInt{1 << 30}, map[string]interface{}{"v": 1 << 30}}, - {&shortInt{1 << 31}, map[string]interface{}{"v": int64(1 << 31)}}, - {&shortUint{1 << 30}, map[string]interface{}{"v": 1 << 30}}, - {&shortUint{1 << 31}, map[string]interface{}{"v": int64(1 << 31)}}, - {&shortIface{int64(1) << 31}, map[string]interface{}{"v": int64(1 << 31)}}, - {&shortPtr{int64ptr}, map[string]interface{}{"v": intvar}}, - - {&shortNonEmptyInt{1}, map[string]interface{}{"v": 1}}, - {&shortNonEmptyInt{1 << 31}, map[string]interface{}{"v": int64(1 << 31)}}, - {&shortNonEmptyInt{}, map[string]interface{}{}}, - - {&inlineInt{struct{ A, B int }{1, 2}}, map[string]interface{}{"a": 1, "b": 2}}, - {&inlineMap{A: 1, M: map[string]interface{}{"b": 2}}, map[string]interface{}{"a": 1, "b": 2}}, - {&inlineMap{A: 1, M: nil}, map[string]interface{}{"a": 1}}, - {&inlineMapInt{A: 1, M: map[string]int{"b": 2}}, map[string]int{"a": 1, "b": 2}}, - {&inlineMapInt{A: 1, M: nil}, map[string]int{"a": 1}}, - {&inlineMapMyM{A: 1, M: MyM{"b": MyM{"c": 3}}}, map[string]interface{}{"a": 1, "b": map[string]interface{}{"c": 3}}}, - - // []byte <=> MyBytes - {&struct{ B MyBytes }{[]byte("abc")}, map[string]string{"b": "abc"}}, - {&struct{ B MyBytes }{[]byte{}}, map[string]string{"b": ""}}, - {&struct{ B MyBytes }{}, map[string]bool{}}, - {&struct{ B []byte }{[]byte("abc")}, map[string]MyBytes{"b": []byte("abc")}}, - - // bool <=> MyBool - {&struct{ B MyBool }{true}, map[string]bool{"b": true}}, - {&struct{ B MyBool }{}, map[string]bool{"b": false}}, - {&struct{ B MyBool }{}, map[string]string{}}, - {&struct{ B bool }{}, map[string]MyBool{"b": false}}, - - // arrays - {&struct{ V [2]int }{[...]int{1, 2}}, map[string][2]int{"v": [2]int{1, 2}}}, - {&struct{ V [2]byte }{[...]byte{1, 2}}, map[string][2]byte{"v": [2]byte{1, 2}}}, - - // zero time - {&struct{ V time.Time }{}, map[string]interface{}{"v": time.Time{}}}, - - // zero time + 1 second + 1 millisecond; overflows int64 as nanoseconds - {&struct{ V time.Time }{time.Unix(-62135596799, 1e6).Local()}, - map[string]interface{}{"v": time.Unix(-62135596799, 1e6).Local()}}, - - // bson.D <=> []DocElem - {&bson.D{{"a", bson.D{{"b", 1}, {"c", 2}}}}, &bson.D{{"a", bson.D{{"b", 1}, {"c", 2}}}}}, - {&bson.D{{"a", bson.D{{"b", 1}, {"c", 2}}}}, &MyD{{"a", MyD{{"b", 1}, {"c", 2}}}}}, - {&struct{ V MyD }{MyD{{"a", 1}}}, &bson.D{{"v", bson.D{{"a", 1}}}}}, - - // bson.RawD <=> []RawDocElem - {&bson.RawD{{"a", bson.Raw{0x08, []byte{0x01}}}}, &bson.RawD{{"a", bson.Raw{0x08, []byte{0x01}}}}}, - {&bson.RawD{{"a", bson.Raw{0x08, []byte{0x01}}}}, &MyRawD{{"a", bson.Raw{0x08, []byte{0x01}}}}}, - - // bson.M <=> map - {bson.M{"a": bson.M{"b": 1, "c": 2}}, MyM{"a": MyM{"b": 1, "c": 2}}}, - {bson.M{"a": bson.M{"b": 1, "c": 2}}, map[string]interface{}{"a": map[string]interface{}{"b": 1, "c": 2}}}, - - // bson.M <=> map[MyString] - {bson.M{"a": bson.M{"b": 1, "c": 2}}, map[MyString]interface{}{"a": map[MyString]interface{}{"b": 1, "c": 2}}}, - - // json.Number <=> int64, float64 - {&struct{ N json.Number }{"5"}, map[string]interface{}{"n": int64(5)}}, - {&struct{ N json.Number }{"5.05"}, map[string]interface{}{"n": 5.05}}, - {&struct{ N json.Number }{"9223372036854776000"}, map[string]interface{}{"n": float64(1 << 63)}}, - - // bson.D <=> non-struct getter/setter - {&bson.D{{"a", 1}}, &getterSetterD{{"a", 1}, {"suffix", true}}}, - {&bson.D{{"a", 42}}, &gsintvar}, - - // Interface slice setter. - {&struct{ V ifaceSlice }{ifaceSlice{nil, nil, nil}}, bson.M{"v": []interface{}{3}}}, -} - -// Same thing, but only one way (obj1 => obj2). -var oneWayCrossItems = []crossTypeItem{ - // map <=> struct - {map[string]interface{}{"a": 1, "b": "2", "c": 3}, map[string]int{"a": 1, "c": 3}}, - - // inline map elides badly typed values - {map[string]interface{}{"a": 1, "b": "2", "c": 3}, &inlineMapInt{A: 1, M: map[string]int{"c": 3}}}, - - // Can't decode int into struct. - {bson.M{"a": bson.M{"b": 2}}, &struct{ A bool }{}}, - - // Would get decoded into a int32 too in the opposite direction. - {&shortIface{int64(1) << 30}, map[string]interface{}{"v": 1 << 30}}, - - // Ensure omitempty on struct with private fields works properly. - {&struct { - V struct{ v time.Time } ",omitempty" - }{}, map[string]interface{}{}}, -} - -func testCrossPair(c *C, dump interface{}, load interface{}) { - c.Logf("Dump: %#v", dump) - c.Logf("Load: %#v", load) - zero := makeZeroDoc(load) - data, err := bson.Marshal(dump) - c.Assert(err, IsNil) - c.Logf("Dumped: %#v", string(data)) - err = bson.Unmarshal(data, zero) - c.Assert(err, IsNil) - c.Logf("Loaded: %#v", zero) - c.Assert(zero, DeepEquals, load) -} - -func (s *S) TestTwoWayCrossPairs(c *C) { - for _, item := range twoWayCrossItems { - testCrossPair(c, item.obj1, item.obj2) - testCrossPair(c, item.obj2, item.obj1) - } -} - -func (s *S) TestOneWayCrossPairs(c *C) { - for _, item := range oneWayCrossItems { - testCrossPair(c, item.obj1, item.obj2) - } -} - -// -------------------------------------------------------------------------- -// ObjectId hex representation test. - -func (s *S) TestObjectIdHex(c *C) { - id := bson.ObjectIdHex("4d88e15b60f486e428412dc9") - c.Assert(id.String(), Equals, `ObjectIdHex("4d88e15b60f486e428412dc9")`) - c.Assert(id.Hex(), Equals, "4d88e15b60f486e428412dc9") -} - -func (s *S) TestIsObjectIdHex(c *C) { - test := []struct { - id string - valid bool - }{ - {"4d88e15b60f486e428412dc9", true}, - {"4d88e15b60f486e428412dc", false}, - {"4d88e15b60f486e428412dc9e", false}, - {"4d88e15b60f486e428412dcx", false}, - } - for _, t := range test { - c.Assert(bson.IsObjectIdHex(t.id), Equals, t.valid) - } -} - -// -------------------------------------------------------------------------- -// ObjectId parts extraction tests. - -type objectIdParts struct { - id bson.ObjectId - timestamp int64 - machine []byte - pid uint16 - counter int32 -} - -var objectIds = []objectIdParts{ - objectIdParts{ - bson.ObjectIdHex("4d88e15b60f486e428412dc9"), - 1300816219, - []byte{0x60, 0xf4, 0x86}, - 0xe428, - 4271561, - }, - objectIdParts{ - bson.ObjectIdHex("000000000000000000000000"), - 0, - []byte{0x00, 0x00, 0x00}, - 0x0000, - 0, - }, - objectIdParts{ - bson.ObjectIdHex("00000000aabbccddee000001"), - 0, - []byte{0xaa, 0xbb, 0xcc}, - 0xddee, - 1, - }, -} - -func (s *S) TestObjectIdPartsExtraction(c *C) { - for i, v := range objectIds { - t := time.Unix(v.timestamp, 0) - c.Assert(v.id.Time(), Equals, t, Commentf("#%d Wrong timestamp value", i)) - c.Assert(v.id.Machine(), DeepEquals, v.machine, Commentf("#%d Wrong machine id value", i)) - c.Assert(v.id.Pid(), Equals, v.pid, Commentf("#%d Wrong pid value", i)) - c.Assert(v.id.Counter(), Equals, v.counter, Commentf("#%d Wrong counter value", i)) - } -} - -func (s *S) TestNow(c *C) { - before := time.Now() - time.Sleep(1e6) - now := bson.Now() - time.Sleep(1e6) - after := time.Now() - c.Assert(now.After(before) && now.Before(after), Equals, true, Commentf("now=%s, before=%s, after=%s", now, before, after)) -} - -// -------------------------------------------------------------------------- -// ObjectId generation tests. - -func (s *S) TestNewObjectId(c *C) { - // Generate 10 ids - ids := make([]bson.ObjectId, 10) - for i := 0; i < 10; i++ { - ids[i] = bson.NewObjectId() - } - for i := 1; i < 10; i++ { - prevId := ids[i-1] - id := ids[i] - // Test for uniqueness among all other 9 generated ids - for j, tid := range ids { - if j != i { - c.Assert(id, Not(Equals), tid, Commentf("Generated ObjectId is not unique")) - } - } - // Check that timestamp was incremented and is within 30 seconds of the previous one - secs := id.Time().Sub(prevId.Time()).Seconds() - c.Assert((secs >= 0 && secs <= 30), Equals, true, Commentf("Wrong timestamp in generated ObjectId")) - // Check that machine ids are the same - c.Assert(id.Machine(), DeepEquals, prevId.Machine()) - // Check that pids are the same - c.Assert(id.Pid(), Equals, prevId.Pid()) - // Test for proper increment - delta := int(id.Counter() - prevId.Counter()) - c.Assert(delta, Equals, 1, Commentf("Wrong increment in generated ObjectId")) - } -} - -func (s *S) TestNewObjectIdWithTime(c *C) { - t := time.Unix(12345678, 0) - id := bson.NewObjectIdWithTime(t) - c.Assert(id.Time(), Equals, t) - c.Assert(id.Machine(), DeepEquals, []byte{0x00, 0x00, 0x00}) - c.Assert(int(id.Pid()), Equals, 0) - c.Assert(int(id.Counter()), Equals, 0) -} - -// -------------------------------------------------------------------------- -// ObjectId JSON marshalling. - -type jsonType struct { - Id bson.ObjectId -} - -var jsonIdTests = []struct { - value jsonType - json string - marshal bool - unmarshal bool - error string -}{{ - value: jsonType{Id: bson.ObjectIdHex("4d88e15b60f486e428412dc9")}, - json: `{"Id":"4d88e15b60f486e428412dc9"}`, - marshal: true, - unmarshal: true, -}, { - value: jsonType{}, - json: `{"Id":""}`, - marshal: true, - unmarshal: true, -}, { - value: jsonType{}, - json: `{"Id":null}`, - marshal: false, - unmarshal: true, -}, { - json: `{"Id":"4d88e15b60f486e428412dc9A"}`, - error: `Invalid ObjectId in JSON: "4d88e15b60f486e428412dc9A"`, - marshal: false, - unmarshal: true, -}, { - json: `{"Id":"4d88e15b60f486e428412dcZ"}`, - error: `Invalid ObjectId in JSON: "4d88e15b60f486e428412dcZ" .*`, - marshal: false, - unmarshal: true, -}} - -func (s *S) TestObjectIdJSONMarshaling(c *C) { - for _, test := range jsonIdTests { - if test.marshal { - data, err := json.Marshal(&test.value) - if test.error == "" { - c.Assert(err, IsNil) - c.Assert(string(data), Equals, test.json) - } else { - c.Assert(err, ErrorMatches, test.error) - } - } - - if test.unmarshal { - var value jsonType - err := json.Unmarshal([]byte(test.json), &value) - if test.error == "" { - c.Assert(err, IsNil) - c.Assert(value, DeepEquals, test.value) - } else { - c.Assert(err, ErrorMatches, test.error) - } - } - } -} - -// -------------------------------------------------------------------------- -// Some simple benchmarks. - -type BenchT struct { - A, B, C, D, E, F string -} - -type BenchRawT struct { - A string - B int - C bson.M - D []float64 -} - -func (s *S) BenchmarkUnmarhsalStruct(c *C) { - v := BenchT{A: "A", D: "D", E: "E"} - data, err := bson.Marshal(&v) - if err != nil { - panic(err) - } - c.ResetTimer() - for i := 0; i < c.N; i++ { - err = bson.Unmarshal(data, &v) - } - if err != nil { - panic(err) - } -} - -func (s *S) BenchmarkUnmarhsalMap(c *C) { - m := bson.M{"a": "a", "d": "d", "e": "e"} - data, err := bson.Marshal(&m) - if err != nil { - panic(err) - } - c.ResetTimer() - for i := 0; i < c.N; i++ { - err = bson.Unmarshal(data, &m) - } - if err != nil { - panic(err) - } -} - -func (s *S) BenchmarkUnmarshalRaw(c *C) { - var err error - m := BenchRawT{ - A: "test_string", - B: 123, - C: bson.M{ - "subdoc_int": 12312, - "subdoc_doc": bson.M{"1": 1}, - }, - D: []float64{0.0, 1.3333, -99.9997, 3.1415}, - } - data, err := bson.Marshal(&m) - if err != nil { - panic(err) - } - raw := bson.Raw{} - c.ResetTimer() - for i := 0; i < c.N; i++ { - err = bson.Unmarshal(data, &raw) - } - if err != nil { - panic(err) - } -} diff --git a/vendor/gopkg.in/mgo.v2/bson/decode.go b/vendor/gopkg.in/mgo.v2/bson/decode.go deleted file mode 100644 index bdd2e0287..000000000 --- a/vendor/gopkg.in/mgo.v2/bson/decode.go +++ /dev/null @@ -1,825 +0,0 @@ -// BSON library for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// 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 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. -// gobson - BSON library for Go. - -package bson - -import ( - "fmt" - "math" - "net/url" - "reflect" - "strconv" - "sync" - "time" -) - -type decoder struct { - in []byte - i int - docType reflect.Type -} - -var typeM = reflect.TypeOf(M{}) - -func newDecoder(in []byte) *decoder { - return &decoder{in, 0, typeM} -} - -// -------------------------------------------------------------------------- -// Some helper functions. - -func corrupted() { - panic("Document is corrupted") -} - -func settableValueOf(i interface{}) reflect.Value { - v := reflect.ValueOf(i) - sv := reflect.New(v.Type()).Elem() - sv.Set(v) - return sv -} - -// -------------------------------------------------------------------------- -// Unmarshaling of documents. - -const ( - setterUnknown = iota - setterNone - setterType - setterAddr -) - -var setterStyles map[reflect.Type]int -var setterIface reflect.Type -var setterMutex sync.RWMutex - -func init() { - var iface Setter - setterIface = reflect.TypeOf(&iface).Elem() - setterStyles = make(map[reflect.Type]int) -} - -func setterStyle(outt reflect.Type) int { - setterMutex.RLock() - style := setterStyles[outt] - setterMutex.RUnlock() - if style == setterUnknown { - setterMutex.Lock() - defer setterMutex.Unlock() - if outt.Implements(setterIface) { - setterStyles[outt] = setterType - } else if reflect.PtrTo(outt).Implements(setterIface) { - setterStyles[outt] = setterAddr - } else { - setterStyles[outt] = setterNone - } - style = setterStyles[outt] - } - return style -} - -func getSetter(outt reflect.Type, out reflect.Value) Setter { - style := setterStyle(outt) - if style == setterNone { - return nil - } - if style == setterAddr { - if !out.CanAddr() { - return nil - } - out = out.Addr() - } else if outt.Kind() == reflect.Ptr && out.IsNil() { - out.Set(reflect.New(outt.Elem())) - } - return out.Interface().(Setter) -} - -func clearMap(m reflect.Value) { - var none reflect.Value - for _, k := range m.MapKeys() { - m.SetMapIndex(k, none) - } -} - -func (d *decoder) readDocTo(out reflect.Value) { - var elemType reflect.Type - outt := out.Type() - outk := outt.Kind() - - for { - if outk == reflect.Ptr && out.IsNil() { - out.Set(reflect.New(outt.Elem())) - } - if setter := getSetter(outt, out); setter != nil { - var raw Raw - d.readDocTo(reflect.ValueOf(&raw)) - err := setter.SetBSON(raw) - if _, ok := err.(*TypeError); err != nil && !ok { - panic(err) - } - return - } - if outk == reflect.Ptr { - out = out.Elem() - outt = out.Type() - outk = out.Kind() - continue - } - break - } - - var fieldsMap map[string]fieldInfo - var inlineMap reflect.Value - start := d.i - - origout := out - if outk == reflect.Interface { - if d.docType.Kind() == reflect.Map { - mv := reflect.MakeMap(d.docType) - out.Set(mv) - out = mv - } else { - dv := reflect.New(d.docType).Elem() - out.Set(dv) - out = dv - } - outt = out.Type() - outk = outt.Kind() - } - - docType := d.docType - keyType := typeString - convertKey := false - switch outk { - case reflect.Map: - keyType = outt.Key() - if keyType.Kind() != reflect.String { - panic("BSON map must have string keys. Got: " + outt.String()) - } - if keyType != typeString { - convertKey = true - } - elemType = outt.Elem() - if elemType == typeIface { - d.docType = outt - } - if out.IsNil() { - out.Set(reflect.MakeMap(out.Type())) - } else if out.Len() > 0 { - clearMap(out) - } - case reflect.Struct: - if outt != typeRaw { - sinfo, err := getStructInfo(out.Type()) - if err != nil { - panic(err) - } - fieldsMap = sinfo.FieldsMap - out.Set(sinfo.Zero) - if sinfo.InlineMap != -1 { - inlineMap = out.Field(sinfo.InlineMap) - if !inlineMap.IsNil() && inlineMap.Len() > 0 { - clearMap(inlineMap) - } - elemType = inlineMap.Type().Elem() - if elemType == typeIface { - d.docType = inlineMap.Type() - } - } - } - case reflect.Slice: - switch outt.Elem() { - case typeDocElem: - origout.Set(d.readDocElems(outt)) - return - case typeRawDocElem: - origout.Set(d.readRawDocElems(outt)) - return - } - fallthrough - default: - panic("Unsupported document type for unmarshalling: " + out.Type().String()) - } - - end := int(d.readInt32()) - end += d.i - 4 - if end <= d.i || end > len(d.in) || d.in[end-1] != '\x00' { - corrupted() - } - for d.in[d.i] != '\x00' { - kind := d.readByte() - name := d.readCStr() - if d.i >= end { - corrupted() - } - - switch outk { - case reflect.Map: - e := reflect.New(elemType).Elem() - if d.readElemTo(e, kind) { - k := reflect.ValueOf(name) - if convertKey { - k = k.Convert(keyType) - } - out.SetMapIndex(k, e) - } - case reflect.Struct: - if outt == typeRaw { - d.dropElem(kind) - } else { - if info, ok := fieldsMap[name]; ok { - if info.Inline == nil { - d.readElemTo(out.Field(info.Num), kind) - } else { - d.readElemTo(out.FieldByIndex(info.Inline), kind) - } - } else if inlineMap.IsValid() { - if inlineMap.IsNil() { - inlineMap.Set(reflect.MakeMap(inlineMap.Type())) - } - e := reflect.New(elemType).Elem() - if d.readElemTo(e, kind) { - inlineMap.SetMapIndex(reflect.ValueOf(name), e) - } - } else { - d.dropElem(kind) - } - } - case reflect.Slice: - } - - if d.i >= end { - corrupted() - } - } - d.i++ // '\x00' - if d.i != end { - corrupted() - } - d.docType = docType - - if outt == typeRaw { - out.Set(reflect.ValueOf(Raw{0x03, d.in[start:d.i]})) - } -} - -func (d *decoder) readArrayDocTo(out reflect.Value) { - end := int(d.readInt32()) - end += d.i - 4 - if end <= d.i || end > len(d.in) || d.in[end-1] != '\x00' { - corrupted() - } - i := 0 - l := out.Len() - for d.in[d.i] != '\x00' { - if i >= l { - panic("Length mismatch on array field") - } - kind := d.readByte() - for d.i < end && d.in[d.i] != '\x00' { - d.i++ - } - if d.i >= end { - corrupted() - } - d.i++ - d.readElemTo(out.Index(i), kind) - if d.i >= end { - corrupted() - } - i++ - } - if i != l { - panic("Length mismatch on array field") - } - d.i++ // '\x00' - if d.i != end { - corrupted() - } -} - -func (d *decoder) readSliceDoc(t reflect.Type) interface{} { - tmp := make([]reflect.Value, 0, 8) - elemType := t.Elem() - - end := int(d.readInt32()) - end += d.i - 4 - if end <= d.i || end > len(d.in) || d.in[end-1] != '\x00' { - corrupted() - } - for d.in[d.i] != '\x00' { - kind := d.readByte() - for d.i < end && d.in[d.i] != '\x00' { - d.i++ - } - if d.i >= end { - corrupted() - } - d.i++ - e := reflect.New(elemType).Elem() - if d.readElemTo(e, kind) { - tmp = append(tmp, e) - } - if d.i >= end { - corrupted() - } - } - d.i++ // '\x00' - if d.i != end { - corrupted() - } - - n := len(tmp) - slice := reflect.MakeSlice(t, n, n) - for i := 0; i != n; i++ { - slice.Index(i).Set(tmp[i]) - } - return slice.Interface() -} - -var typeSlice = reflect.TypeOf([]interface{}{}) -var typeIface = typeSlice.Elem() - -func (d *decoder) readDocElems(typ reflect.Type) reflect.Value { - docType := d.docType - d.docType = typ - slice := make([]DocElem, 0, 8) - d.readDocWith(func(kind byte, name string) { - e := DocElem{Name: name} - v := reflect.ValueOf(&e.Value) - if d.readElemTo(v.Elem(), kind) { - slice = append(slice, e) - } - }) - slicev := reflect.New(typ).Elem() - slicev.Set(reflect.ValueOf(slice)) - d.docType = docType - return slicev -} - -func (d *decoder) readRawDocElems(typ reflect.Type) reflect.Value { - docType := d.docType - d.docType = typ - slice := make([]RawDocElem, 0, 8) - d.readDocWith(func(kind byte, name string) { - e := RawDocElem{Name: name} - v := reflect.ValueOf(&e.Value) - if d.readElemTo(v.Elem(), kind) { - slice = append(slice, e) - } - }) - slicev := reflect.New(typ).Elem() - slicev.Set(reflect.ValueOf(slice)) - d.docType = docType - return slicev -} - -func (d *decoder) readDocWith(f func(kind byte, name string)) { - end := int(d.readInt32()) - end += d.i - 4 - if end <= d.i || end > len(d.in) || d.in[end-1] != '\x00' { - corrupted() - } - for d.in[d.i] != '\x00' { - kind := d.readByte() - name := d.readCStr() - if d.i >= end { - corrupted() - } - f(kind, name) - if d.i >= end { - corrupted() - } - } - d.i++ // '\x00' - if d.i != end { - corrupted() - } -} - -// -------------------------------------------------------------------------- -// Unmarshaling of individual elements within a document. - -var blackHole = settableValueOf(struct{}{}) - -func (d *decoder) dropElem(kind byte) { - d.readElemTo(blackHole, kind) -} - -// Attempt to decode an element from the document and put it into out. -// If the types are not compatible, the returned ok value will be -// false and out will be unchanged. -func (d *decoder) readElemTo(out reflect.Value, kind byte) (good bool) { - - start := d.i - - if kind == '\x03' { - // Delegate unmarshaling of documents. - outt := out.Type() - outk := out.Kind() - switch outk { - case reflect.Interface, reflect.Ptr, reflect.Struct, reflect.Map: - d.readDocTo(out) - return true - } - if setterStyle(outt) != setterNone { - d.readDocTo(out) - return true - } - if outk == reflect.Slice { - switch outt.Elem() { - case typeDocElem: - out.Set(d.readDocElems(outt)) - case typeRawDocElem: - out.Set(d.readRawDocElems(outt)) - } - return true - } - d.readDocTo(blackHole) - return true - } - - var in interface{} - - switch kind { - case 0x01: // Float64 - in = d.readFloat64() - case 0x02: // UTF-8 string - in = d.readStr() - case 0x03: // Document - panic("Can't happen. Handled above.") - case 0x04: // Array - outt := out.Type() - if setterStyle(outt) != setterNone { - // Skip the value so its data is handed to the setter below. - d.dropElem(kind) - break - } - for outt.Kind() == reflect.Ptr { - outt = outt.Elem() - } - switch outt.Kind() { - case reflect.Array: - d.readArrayDocTo(out) - return true - case reflect.Slice: - in = d.readSliceDoc(outt) - default: - in = d.readSliceDoc(typeSlice) - } - case 0x05: // Binary - b := d.readBinary() - if b.Kind == 0x00 || b.Kind == 0x02 { - in = b.Data - } else { - in = b - } - case 0x06: // Undefined (obsolete, but still seen in the wild) - in = Undefined - case 0x07: // ObjectId - in = ObjectId(d.readBytes(12)) - case 0x08: // Bool - in = d.readBool() - case 0x09: // Timestamp - // MongoDB handles timestamps as milliseconds. - i := d.readInt64() - if i == -62135596800000 { - in = time.Time{} // In UTC for convenience. - } else { - in = time.Unix(i/1e3, i%1e3*1e6) - } - case 0x0A: // Nil - in = nil - case 0x0B: // RegEx - in = d.readRegEx() - case 0x0C: - in = DBPointer{Namespace: d.readStr(), Id: ObjectId(d.readBytes(12))} - case 0x0D: // JavaScript without scope - in = JavaScript{Code: d.readStr()} - case 0x0E: // Symbol - in = Symbol(d.readStr()) - case 0x0F: // JavaScript with scope - d.i += 4 // Skip length - js := JavaScript{d.readStr(), make(M)} - d.readDocTo(reflect.ValueOf(js.Scope)) - in = js - case 0x10: // Int32 - in = int(d.readInt32()) - case 0x11: // Mongo-specific timestamp - in = MongoTimestamp(d.readInt64()) - case 0x12: // Int64 - in = d.readInt64() - case 0x7F: // Max key - in = MaxKey - case 0xFF: // Min key - in = MinKey - default: - panic(fmt.Sprintf("Unknown element kind (0x%02X)", kind)) - } - - outt := out.Type() - - if outt == typeRaw { - out.Set(reflect.ValueOf(Raw{kind, d.in[start:d.i]})) - return true - } - - if setter := getSetter(outt, out); setter != nil { - err := setter.SetBSON(Raw{kind, d.in[start:d.i]}) - if err == SetZero { - out.Set(reflect.Zero(outt)) - return true - } - if err == nil { - return true - } - if _, ok := err.(*TypeError); !ok { - panic(err) - } - return false - } - - if in == nil { - out.Set(reflect.Zero(outt)) - return true - } - - outk := outt.Kind() - - // Dereference and initialize pointer if necessary. - first := true - for outk == reflect.Ptr { - if !out.IsNil() { - out = out.Elem() - } else { - elem := reflect.New(outt.Elem()) - if first { - // Only set if value is compatible. - first = false - defer func(out, elem reflect.Value) { - if good { - out.Set(elem) - } - }(out, elem) - } else { - out.Set(elem) - } - out = elem - } - outt = out.Type() - outk = outt.Kind() - } - - inv := reflect.ValueOf(in) - if outt == inv.Type() { - out.Set(inv) - return true - } - - switch outk { - case reflect.Interface: - out.Set(inv) - return true - case reflect.String: - switch inv.Kind() { - case reflect.String: - out.SetString(inv.String()) - return true - case reflect.Slice: - if b, ok := in.([]byte); ok { - out.SetString(string(b)) - return true - } - case reflect.Int, reflect.Int64: - if outt == typeJSONNumber { - out.SetString(strconv.FormatInt(inv.Int(), 10)) - return true - } - case reflect.Float64: - if outt == typeJSONNumber { - out.SetString(strconv.FormatFloat(inv.Float(), 'f', -1, 64)) - return true - } - } - case reflect.Slice, reflect.Array: - // Remember, array (0x04) slices are built with the correct - // element type. If we are here, must be a cross BSON kind - // conversion (e.g. 0x05 unmarshalling on string). - if outt.Elem().Kind() != reflect.Uint8 { - break - } - switch inv.Kind() { - case reflect.String: - slice := []byte(inv.String()) - out.Set(reflect.ValueOf(slice)) - return true - case reflect.Slice: - switch outt.Kind() { - case reflect.Array: - reflect.Copy(out, inv) - case reflect.Slice: - out.SetBytes(inv.Bytes()) - } - return true - } - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - switch inv.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - out.SetInt(inv.Int()) - return true - case reflect.Float32, reflect.Float64: - out.SetInt(int64(inv.Float())) - return true - case reflect.Bool: - if inv.Bool() { - out.SetInt(1) - } else { - out.SetInt(0) - } - return true - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - panic("can't happen: no uint types in BSON (!?)") - } - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - switch inv.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - out.SetUint(uint64(inv.Int())) - return true - case reflect.Float32, reflect.Float64: - out.SetUint(uint64(inv.Float())) - return true - case reflect.Bool: - if inv.Bool() { - out.SetUint(1) - } else { - out.SetUint(0) - } - return true - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - panic("Can't happen. No uint types in BSON.") - } - case reflect.Float32, reflect.Float64: - switch inv.Kind() { - case reflect.Float32, reflect.Float64: - out.SetFloat(inv.Float()) - return true - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - out.SetFloat(float64(inv.Int())) - return true - case reflect.Bool: - if inv.Bool() { - out.SetFloat(1) - } else { - out.SetFloat(0) - } - return true - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - panic("Can't happen. No uint types in BSON?") - } - case reflect.Bool: - switch inv.Kind() { - case reflect.Bool: - out.SetBool(inv.Bool()) - return true - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - out.SetBool(inv.Int() != 0) - return true - case reflect.Float32, reflect.Float64: - out.SetBool(inv.Float() != 0) - return true - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - panic("Can't happen. No uint types in BSON?") - } - case reflect.Struct: - if outt == typeURL && inv.Kind() == reflect.String { - u, err := url.Parse(inv.String()) - if err != nil { - panic(err) - } - out.Set(reflect.ValueOf(u).Elem()) - return true - } - } - - return false -} - -// -------------------------------------------------------------------------- -// Parsers of basic types. - -func (d *decoder) readRegEx() RegEx { - re := RegEx{} - re.Pattern = d.readCStr() - re.Options = d.readCStr() - return re -} - -func (d *decoder) readBinary() Binary { - l := d.readInt32() - b := Binary{} - b.Kind = d.readByte() - b.Data = d.readBytes(l) - if b.Kind == 0x02 && len(b.Data) >= 4 { - // Weird obsolete format with redundant length. - b.Data = b.Data[4:] - } - return b -} - -func (d *decoder) readStr() string { - l := d.readInt32() - b := d.readBytes(l - 1) - if d.readByte() != '\x00' { - corrupted() - } - return string(b) -} - -func (d *decoder) readCStr() string { - start := d.i - end := start - l := len(d.in) - for ; end != l; end++ { - if d.in[end] == '\x00' { - break - } - } - d.i = end + 1 - if d.i > l { - corrupted() - } - return string(d.in[start:end]) -} - -func (d *decoder) readBool() bool { - if d.readByte() == 1 { - return true - } - return false -} - -func (d *decoder) readFloat64() float64 { - return math.Float64frombits(uint64(d.readInt64())) -} - -func (d *decoder) readInt32() int32 { - b := d.readBytes(4) - return int32((uint32(b[0]) << 0) | - (uint32(b[1]) << 8) | - (uint32(b[2]) << 16) | - (uint32(b[3]) << 24)) -} - -func (d *decoder) readInt64() int64 { - b := d.readBytes(8) - return int64((uint64(b[0]) << 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 (d *decoder) readByte() byte { - i := d.i - d.i++ - if d.i > len(d.in) { - corrupted() - } - return d.in[i] -} - -func (d *decoder) readBytes(length int32) []byte { - start := d.i - d.i += int(length) - if d.i > len(d.in) { - corrupted() - } - return d.in[start : start+int(length)] -} diff --git a/vendor/gopkg.in/mgo.v2/bson/encode.go b/vendor/gopkg.in/mgo.v2/bson/encode.go deleted file mode 100644 index e1015091b..000000000 --- a/vendor/gopkg.in/mgo.v2/bson/encode.go +++ /dev/null @@ -1,503 +0,0 @@ -// BSON library for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// 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 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. -// gobson - BSON library for Go. - -package bson - -import ( - "encoding/json" - "fmt" - "math" - "net/url" - "reflect" - "strconv" - "time" -) - -// -------------------------------------------------------------------------- -// Some internal infrastructure. - -var ( - typeBinary = reflect.TypeOf(Binary{}) - typeObjectId = reflect.TypeOf(ObjectId("")) - typeDBPointer = reflect.TypeOf(DBPointer{"", ObjectId("")}) - typeSymbol = reflect.TypeOf(Symbol("")) - typeMongoTimestamp = reflect.TypeOf(MongoTimestamp(0)) - typeOrderKey = reflect.TypeOf(MinKey) - typeDocElem = reflect.TypeOf(DocElem{}) - typeRawDocElem = reflect.TypeOf(RawDocElem{}) - typeRaw = reflect.TypeOf(Raw{}) - typeURL = reflect.TypeOf(url.URL{}) - typeTime = reflect.TypeOf(time.Time{}) - typeString = reflect.TypeOf("") - typeJSONNumber = reflect.TypeOf(json.Number("")) -) - -const itoaCacheSize = 32 - -var itoaCache []string - -func init() { - itoaCache = make([]string, itoaCacheSize) - for i := 0; i != itoaCacheSize; i++ { - itoaCache[i] = strconv.Itoa(i) - } -} - -func itoa(i int) string { - if i < itoaCacheSize { - return itoaCache[i] - } - return strconv.Itoa(i) -} - -// -------------------------------------------------------------------------- -// Marshaling of the document value itself. - -type encoder struct { - out []byte -} - -func (e *encoder) addDoc(v reflect.Value) { - for { - if vi, ok := v.Interface().(Getter); ok { - getv, err := vi.GetBSON() - if err != nil { - panic(err) - } - v = reflect.ValueOf(getv) - continue - } - if v.Kind() == reflect.Ptr { - v = v.Elem() - continue - } - break - } - - if v.Type() == typeRaw { - raw := v.Interface().(Raw) - if raw.Kind != 0x03 && raw.Kind != 0x00 { - panic("Attempted to unmarshal Raw kind " + strconv.Itoa(int(raw.Kind)) + " as a document") - } - e.addBytes(raw.Data...) - return - } - - start := e.reserveInt32() - - switch v.Kind() { - case reflect.Map: - e.addMap(v) - case reflect.Struct: - e.addStruct(v) - case reflect.Array, reflect.Slice: - e.addSlice(v) - default: - panic("Can't marshal " + v.Type().String() + " as a BSON document") - } - - e.addBytes(0) - e.setInt32(start, int32(len(e.out)-start)) -} - -func (e *encoder) addMap(v reflect.Value) { - for _, k := range v.MapKeys() { - e.addElem(k.String(), v.MapIndex(k), false) - } -} - -func (e *encoder) addStruct(v reflect.Value) { - sinfo, err := getStructInfo(v.Type()) - if err != nil { - panic(err) - } - var value reflect.Value - if sinfo.InlineMap >= 0 { - m := v.Field(sinfo.InlineMap) - if m.Len() > 0 { - for _, k := range m.MapKeys() { - ks := k.String() - if _, found := sinfo.FieldsMap[ks]; found { - panic(fmt.Sprintf("Can't have key %q in inlined map; conflicts with struct field", ks)) - } - e.addElem(ks, m.MapIndex(k), false) - } - } - } - for _, info := range sinfo.FieldsList { - if info.Inline == nil { - value = v.Field(info.Num) - } else { - value = v.FieldByIndex(info.Inline) - } - if info.OmitEmpty && isZero(value) { - continue - } - e.addElem(info.Key, value, info.MinSize) - } -} - -func isZero(v reflect.Value) bool { - switch v.Kind() { - case reflect.String: - return len(v.String()) == 0 - case reflect.Ptr, reflect.Interface: - 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.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.Bool: - return !v.Bool() - case reflect.Struct: - vt := v.Type() - if vt == typeTime { - return v.Interface().(time.Time).IsZero() - } - for i := 0; i < v.NumField(); i++ { - if vt.Field(i).PkgPath != "" { - continue // Private field - } - if !isZero(v.Field(i)) { - return false - } - } - return true - } - return false -} - -func (e *encoder) addSlice(v reflect.Value) { - vi := v.Interface() - if d, ok := vi.(D); ok { - for _, elem := range d { - e.addElem(elem.Name, reflect.ValueOf(elem.Value), false) - } - return - } - if d, ok := vi.(RawD); ok { - for _, elem := range d { - e.addElem(elem.Name, reflect.ValueOf(elem.Value), false) - } - return - } - l := v.Len() - et := v.Type().Elem() - if et == typeDocElem { - for i := 0; i < l; i++ { - elem := v.Index(i).Interface().(DocElem) - e.addElem(elem.Name, reflect.ValueOf(elem.Value), false) - } - return - } - if et == typeRawDocElem { - for i := 0; i < l; i++ { - elem := v.Index(i).Interface().(RawDocElem) - e.addElem(elem.Name, reflect.ValueOf(elem.Value), false) - } - return - } - for i := 0; i < l; i++ { - e.addElem(itoa(i), v.Index(i), false) - } -} - -// -------------------------------------------------------------------------- -// Marshaling of elements in a document. - -func (e *encoder) addElemName(kind byte, name string) { - e.addBytes(kind) - e.addBytes([]byte(name)...) - e.addBytes(0) -} - -func (e *encoder) addElem(name string, v reflect.Value, minSize bool) { - - if !v.IsValid() { - e.addElemName('\x0A', name) - return - } - - if getter, ok := v.Interface().(Getter); ok { - getv, err := getter.GetBSON() - if err != nil { - panic(err) - } - e.addElem(name, reflect.ValueOf(getv), minSize) - return - } - - switch v.Kind() { - - case reflect.Interface: - e.addElem(name, v.Elem(), minSize) - - case reflect.Ptr: - e.addElem(name, v.Elem(), minSize) - - case reflect.String: - s := v.String() - switch v.Type() { - case typeObjectId: - if len(s) != 12 { - panic("ObjectIDs must be exactly 12 bytes long (got " + - strconv.Itoa(len(s)) + ")") - } - e.addElemName('\x07', name) - e.addBytes([]byte(s)...) - case typeSymbol: - e.addElemName('\x0E', name) - e.addStr(s) - case typeJSONNumber: - n := v.Interface().(json.Number) - if i, err := n.Int64(); err == nil { - e.addElemName('\x12', name) - e.addInt64(i) - } else if f, err := n.Float64(); err == nil { - e.addElemName('\x01', name) - e.addFloat64(f) - } else { - panic("failed to convert json.Number to a number: " + s) - } - default: - e.addElemName('\x02', name) - e.addStr(s) - } - - case reflect.Float32, reflect.Float64: - e.addElemName('\x01', name) - e.addFloat64(v.Float()) - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - u := v.Uint() - if int64(u) < 0 { - panic("BSON has no uint64 type, and value is too large to fit correctly in an int64") - } else if u <= math.MaxInt32 && (minSize || v.Kind() <= reflect.Uint32) { - e.addElemName('\x10', name) - e.addInt32(int32(u)) - } else { - e.addElemName('\x12', name) - e.addInt64(int64(u)) - } - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - switch v.Type() { - case typeMongoTimestamp: - e.addElemName('\x11', name) - e.addInt64(v.Int()) - - case typeOrderKey: - if v.Int() == int64(MaxKey) { - e.addElemName('\x7F', name) - } else { - e.addElemName('\xFF', name) - } - - default: - i := v.Int() - if (minSize || v.Type().Kind() != reflect.Int64) && i >= math.MinInt32 && i <= math.MaxInt32 { - // It fits into an int32, encode as such. - e.addElemName('\x10', name) - e.addInt32(int32(i)) - } else { - e.addElemName('\x12', name) - e.addInt64(i) - } - } - - case reflect.Bool: - e.addElemName('\x08', name) - if v.Bool() { - e.addBytes(1) - } else { - e.addBytes(0) - } - - case reflect.Map: - e.addElemName('\x03', name) - e.addDoc(v) - - case reflect.Slice: - vt := v.Type() - et := vt.Elem() - if et.Kind() == reflect.Uint8 { - e.addElemName('\x05', name) - e.addBinary('\x00', v.Bytes()) - } else if et == typeDocElem || et == typeRawDocElem { - e.addElemName('\x03', name) - e.addDoc(v) - } else { - e.addElemName('\x04', name) - e.addDoc(v) - } - - case reflect.Array: - et := v.Type().Elem() - if et.Kind() == reflect.Uint8 { - e.addElemName('\x05', name) - if v.CanAddr() { - e.addBinary('\x00', v.Slice(0, v.Len()).Interface().([]byte)) - } else { - n := v.Len() - e.addInt32(int32(n)) - e.addBytes('\x00') - for i := 0; i < n; i++ { - el := v.Index(i) - e.addBytes(byte(el.Uint())) - } - } - } else { - e.addElemName('\x04', name) - e.addDoc(v) - } - - case reflect.Struct: - switch s := v.Interface().(type) { - - case Raw: - kind := s.Kind - if kind == 0x00 { - kind = 0x03 - } - e.addElemName(kind, name) - e.addBytes(s.Data...) - - case Binary: - e.addElemName('\x05', name) - e.addBinary(s.Kind, s.Data) - - case DBPointer: - e.addElemName('\x0C', name) - e.addStr(s.Namespace) - if len(s.Id) != 12 { - panic("ObjectIDs must be exactly 12 bytes long (got " + - strconv.Itoa(len(s.Id)) + ")") - } - e.addBytes([]byte(s.Id)...) - - case RegEx: - e.addElemName('\x0B', name) - e.addCStr(s.Pattern) - e.addCStr(s.Options) - - case JavaScript: - if s.Scope == nil { - e.addElemName('\x0D', name) - e.addStr(s.Code) - } else { - e.addElemName('\x0F', name) - start := e.reserveInt32() - e.addStr(s.Code) - e.addDoc(reflect.ValueOf(s.Scope)) - e.setInt32(start, int32(len(e.out)-start)) - } - - case time.Time: - // MongoDB handles timestamps as milliseconds. - e.addElemName('\x09', name) - e.addInt64(s.Unix()*1000 + int64(s.Nanosecond()/1e6)) - - case url.URL: - e.addElemName('\x02', name) - e.addStr(s.String()) - - case undefined: - e.addElemName('\x06', name) - - default: - e.addElemName('\x03', name) - e.addDoc(v) - } - - default: - panic("Can't marshal " + v.Type().String() + " in a BSON document") - } -} - -// -------------------------------------------------------------------------- -// Marshaling of base types. - -func (e *encoder) addBinary(subtype byte, v []byte) { - if subtype == 0x02 { - // Wonder how that brilliant idea came to life. Obsolete, luckily. - e.addInt32(int32(len(v) + 4)) - e.addBytes(subtype) - e.addInt32(int32(len(v))) - } else { - e.addInt32(int32(len(v))) - e.addBytes(subtype) - } - e.addBytes(v...) -} - -func (e *encoder) addStr(v string) { - e.addInt32(int32(len(v) + 1)) - e.addCStr(v) -} - -func (e *encoder) addCStr(v string) { - e.addBytes([]byte(v)...) - e.addBytes(0) -} - -func (e *encoder) reserveInt32() (pos int) { - pos = len(e.out) - e.addBytes(0, 0, 0, 0) - return pos -} - -func (e *encoder) setInt32(pos int, v int32) { - e.out[pos+0] = byte(v) - e.out[pos+1] = byte(v >> 8) - e.out[pos+2] = byte(v >> 16) - e.out[pos+3] = byte(v >> 24) -} - -func (e *encoder) addInt32(v int32) { - u := uint32(v) - e.addBytes(byte(u), byte(u>>8), byte(u>>16), byte(u>>24)) -} - -func (e *encoder) addInt64(v int64) { - u := uint64(v) - e.addBytes(byte(u), byte(u>>8), byte(u>>16), byte(u>>24), - byte(u>>32), byte(u>>40), byte(u>>48), byte(u>>56)) -} - -func (e *encoder) addFloat64(v float64) { - e.addInt64(int64(math.Float64bits(v))) -} - -func (e *encoder) addBytes(v ...byte) { - e.out = append(e.out, v...) -} diff --git a/vendor/gopkg.in/mgo.v2/bulk.go b/vendor/gopkg.in/mgo.v2/bulk.go deleted file mode 100644 index 23f450853..000000000 --- a/vendor/gopkg.in/mgo.v2/bulk.go +++ /dev/null @@ -1,71 +0,0 @@ -package mgo - -// Bulk represents an operation that can be prepared with several -// orthogonal changes before being delivered to the server. -// -// WARNING: This API is still experimental. -// -// Relevant documentation: -// -// http://blog.mongodb.org/post/84922794768/mongodbs-new-bulk-api -// -type Bulk struct { - c *Collection - ordered bool - inserts []interface{} -} - -// BulkError holds an error returned from running a Bulk operation. -// -// TODO: This is private for the moment, until we understand exactly how -// to report these multi-errors in a useful and convenient way. -type bulkError struct { - err error -} - -// BulkResult holds the results for a bulk operation. -type BulkResult struct { - // Be conservative while we understand exactly how to report these - // results in a useful and convenient way, and also how to emulate - // them with prior servers. - private bool -} - -func (e *bulkError) Error() string { - return e.err.Error() -} - -// Bulk returns a value to prepare the execution of a bulk operation. -// -// WARNING: This API is still experimental. -// -func (c *Collection) Bulk() *Bulk { - return &Bulk{c: c, ordered: true} -} - -// Unordered puts the bulk operation in unordered mode. -// -// In unordered mode the indvidual operations may be sent -// out of order, which means latter operations may proceed -// even if prior ones have failed. -func (b *Bulk) Unordered() { - b.ordered = false -} - -// Insert queues up the provided documents for insertion. -func (b *Bulk) Insert(docs ...interface{}) { - b.inserts = append(b.inserts, docs...) -} - -// Run runs all the operations queued up. -func (b *Bulk) Run() (*BulkResult, error) { - op := &insertOp{b.c.FullName, b.inserts, 0} - if !b.ordered { - op.flags = 1 // ContinueOnError - } - _, err := b.c.writeQuery(op) - if err != nil { - return nil, &bulkError{err} - } - return &BulkResult{}, nil -} diff --git a/vendor/gopkg.in/mgo.v2/bulk_test.go b/vendor/gopkg.in/mgo.v2/bulk_test.go deleted file mode 100644 index d231d59d0..000000000 --- a/vendor/gopkg.in/mgo.v2/bulk_test.go +++ /dev/null @@ -1,131 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2010-2014 - Gustavo Niemeyer -// -// 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 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 mgo_test - -import ( - . "gopkg.in/check.v1" - "gopkg.in/mgo.v2" -) - -func (s *S) TestBulkInsert(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - bulk := coll.Bulk() - bulk.Insert(M{"n": 1}) - bulk.Insert(M{"n": 2}, M{"n": 3}) - r, err := bulk.Run() - c.Assert(err, IsNil) - c.Assert(r, FitsTypeOf, &mgo.BulkResult{}) - - type doc struct{ N int } - var res []doc - err = coll.Find(nil).Sort("n").All(&res) - c.Assert(err, IsNil) - c.Assert(res, DeepEquals, []doc{{1}, {2}, {3}}) -} - -func (s *S) TestBulkInsertError(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - bulk := coll.Bulk() - bulk.Insert(M{"_id": 1}, M{"_id": 2}, M{"_id": 2}, M{"_id": 3}) - _, err = bulk.Run() - c.Assert(err, ErrorMatches, ".*duplicate key.*") - - type doc struct { - N int `_id` - } - var res []doc - err = coll.Find(nil).Sort("_id").All(&res) - c.Assert(err, IsNil) - c.Assert(res, DeepEquals, []doc{{1}, {2}}) -} - -func (s *S) TestBulkInsertErrorUnordered(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - bulk := coll.Bulk() - bulk.Unordered() - bulk.Insert(M{"_id": 1}, M{"_id": 2}, M{"_id": 2}, M{"_id": 3}) - _, err = bulk.Run() - c.Assert(err, ErrorMatches, ".*duplicate key.*") - - type doc struct { - N int `_id` - } - var res []doc - err = coll.Find(nil).Sort("_id").All(&res) - c.Assert(err, IsNil) - c.Assert(res, DeepEquals, []doc{{1}, {2}, {3}}) -} - -func (s *S) TestBulkInsertErrorUnorderedSplitBatch(c *C) { - // The server has a batch limit of 1000 documents when using write commands. - // This artificial limit did not exist with the old wire protocol, so to - // avoid compatibility issues the implementation internally split batches - // into the proper size and delivers them one by one. This test ensures that - // the behavior of unordered (that is, continue on error) remains correct - // when errors happen and there are batches left. - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - bulk := coll.Bulk() - bulk.Unordered() - - const total = 4096 - type doc struct { - Id int `_id` - } - docs := make([]interface{}, total) - for i := 0; i < total; i++ { - docs[i] = doc{i} - } - docs[1] = doc{0} - bulk.Insert(docs...) - _, err = bulk.Run() - c.Assert(err, ErrorMatches, ".*duplicate key.*") - - n, err := coll.Count() - c.Assert(err, IsNil) - c.Assert(n, Equals, total-1) - - var res doc - err = coll.FindId(1500).One(&res) - c.Assert(err, IsNil) - c.Assert(res.Id, Equals, 1500) -} diff --git a/vendor/gopkg.in/mgo.v2/cluster.go b/vendor/gopkg.in/mgo.v2/cluster.go deleted file mode 100644 index 9ea0cb9c1..000000000 --- a/vendor/gopkg.in/mgo.v2/cluster.go +++ /dev/null @@ -1,632 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// 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 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 mgo - -import ( - "errors" - "fmt" - "net" - "sync" - "time" - - "gopkg.in/mgo.v2/bson" -) - -// --------------------------------------------------------------------------- -// Mongo cluster encapsulation. -// -// A cluster enables the communication with one or more servers participating -// in a mongo cluster. This works with individual servers, a replica set, -// a replica pair, one or multiple mongos routers, etc. - -type mongoCluster struct { - sync.RWMutex - serverSynced sync.Cond - userSeeds []string - dynaSeeds []string - servers mongoServers - masters mongoServers - references int - syncing bool - direct bool - failFast bool - syncCount uint - setName string - cachedIndex map[string]bool - sync chan bool - dial dialer -} - -func newCluster(userSeeds []string, direct, failFast bool, dial dialer, setName string) *mongoCluster { - cluster := &mongoCluster{ - userSeeds: userSeeds, - references: 1, - direct: direct, - failFast: failFast, - dial: dial, - setName: setName, - } - cluster.serverSynced.L = cluster.RWMutex.RLocker() - cluster.sync = make(chan bool, 1) - stats.cluster(+1) - go cluster.syncServersLoop() - return cluster -} - -// Acquire increases the reference count for the cluster. -func (cluster *mongoCluster) Acquire() { - cluster.Lock() - cluster.references++ - debugf("Cluster %p acquired (refs=%d)", cluster, cluster.references) - cluster.Unlock() -} - -// Release decreases the reference count for the cluster. Once -// it reaches zero, all servers will be closed. -func (cluster *mongoCluster) Release() { - cluster.Lock() - if cluster.references == 0 { - panic("cluster.Release() with references == 0") - } - cluster.references-- - debugf("Cluster %p released (refs=%d)", cluster, cluster.references) - if cluster.references == 0 { - for _, server := range cluster.servers.Slice() { - server.Close() - } - // Wake up the sync loop so it can die. - cluster.syncServers() - stats.cluster(-1) - } - cluster.Unlock() -} - -func (cluster *mongoCluster) LiveServers() (servers []string) { - cluster.RLock() - for _, serv := range cluster.servers.Slice() { - servers = append(servers, serv.Addr) - } - cluster.RUnlock() - return servers -} - -func (cluster *mongoCluster) removeServer(server *mongoServer) { - cluster.Lock() - cluster.masters.Remove(server) - other := cluster.servers.Remove(server) - cluster.Unlock() - if other != nil { - other.Close() - log("Removed server ", server.Addr, " from cluster.") - } - server.Close() -} - -type isMasterResult struct { - IsMaster bool - Secondary bool - Primary string - Hosts []string - Passives []string - Tags bson.D - Msg string - SetName string `bson:"setName"` - MaxWireVersion int `bson:"maxWireVersion"` -} - -func (cluster *mongoCluster) isMaster(socket *mongoSocket, result *isMasterResult) error { - // Monotonic let's it talk to a slave and still hold the socket. - session := newSession(Monotonic, cluster, 10*time.Second) - session.setSocket(socket) - err := session.Run("ismaster", result) - session.Close() - return err -} - -type possibleTimeout interface { - Timeout() bool -} - -var syncSocketTimeout = 5 * time.Second - -func (cluster *mongoCluster) syncServer(server *mongoServer) (info *mongoServerInfo, hosts []string, err error) { - var syncTimeout time.Duration - if raceDetector { - // This variable is only ever touched by tests. - globalMutex.Lock() - syncTimeout = syncSocketTimeout - globalMutex.Unlock() - } else { - syncTimeout = syncSocketTimeout - } - - addr := server.Addr - log("SYNC Processing ", addr, "...") - - // Retry a few times to avoid knocking a server down for a hiccup. - var result isMasterResult - var tryerr error - for retry := 0; ; retry++ { - if retry == 3 || retry == 1 && cluster.failFast { - return nil, nil, tryerr - } - if retry > 0 { - // Don't abuse the server needlessly if there's something actually wrong. - if err, ok := tryerr.(possibleTimeout); ok && err.Timeout() { - // Give a chance for waiters to timeout as well. - cluster.serverSynced.Broadcast() - } - time.Sleep(syncShortDelay) - } - - // It's not clear what would be a good timeout here. Is it - // better to wait longer or to retry? - socket, _, err := server.AcquireSocket(0, syncTimeout) - if err != nil { - tryerr = err - logf("SYNC Failed to get socket to %s: %v", addr, err) - continue - } - err = cluster.isMaster(socket, &result) - socket.Release() - if err != nil { - tryerr = err - logf("SYNC Command 'ismaster' to %s failed: %v", addr, err) - continue - } - debugf("SYNC Result of 'ismaster' from %s: %#v", addr, result) - break - } - - if cluster.setName != "" && result.SetName != cluster.setName { - logf("SYNC Server %s is not a member of replica set %q", addr, cluster.setName) - return nil, nil, fmt.Errorf("server %s is not a member of replica set %q", addr, cluster.setName) - } - - if result.IsMaster { - debugf("SYNC %s is a master.", addr) - if !server.info.Master { - // Made an incorrect assumption above, so fix stats. - stats.conn(-1, false) - stats.conn(+1, true) - } - } else if result.Secondary { - debugf("SYNC %s is a slave.", addr) - } else if cluster.direct { - logf("SYNC %s in unknown state. Pretending it's a slave due to direct connection.", addr) - } else { - logf("SYNC %s is neither a master nor a slave.", addr) - // Let stats track it as whatever was known before. - return nil, nil, errors.New(addr + " is not a master nor slave") - } - - info = &mongoServerInfo{ - Master: result.IsMaster, - Mongos: result.Msg == "isdbgrid", - Tags: result.Tags, - SetName: result.SetName, - MaxWireVersion: result.MaxWireVersion, - } - - hosts = make([]string, 0, 1+len(result.Hosts)+len(result.Passives)) - if result.Primary != "" { - // First in the list to speed up master discovery. - hosts = append(hosts, result.Primary) - } - hosts = append(hosts, result.Hosts...) - hosts = append(hosts, result.Passives...) - - debugf("SYNC %s knows about the following peers: %#v", addr, hosts) - return info, hosts, nil -} - -type syncKind bool - -const ( - completeSync syncKind = true - partialSync syncKind = false -) - -func (cluster *mongoCluster) addServer(server *mongoServer, info *mongoServerInfo, syncKind syncKind) { - cluster.Lock() - current := cluster.servers.Search(server.ResolvedAddr) - if current == nil { - if syncKind == partialSync { - cluster.Unlock() - server.Close() - log("SYNC Discarding unknown server ", server.Addr, " due to partial sync.") - return - } - cluster.servers.Add(server) - if info.Master { - cluster.masters.Add(server) - log("SYNC Adding ", server.Addr, " to cluster as a master.") - } else { - log("SYNC Adding ", server.Addr, " to cluster as a slave.") - } - } else { - if server != current { - panic("addServer attempting to add duplicated server") - } - if server.Info().Master != info.Master { - if info.Master { - log("SYNC Server ", server.Addr, " is now a master.") - cluster.masters.Add(server) - } else { - log("SYNC Server ", server.Addr, " is now a slave.") - cluster.masters.Remove(server) - } - } - } - server.SetInfo(info) - debugf("SYNC Broadcasting availability of server %s", server.Addr) - cluster.serverSynced.Broadcast() - cluster.Unlock() -} - -func (cluster *mongoCluster) getKnownAddrs() []string { - cluster.RLock() - max := len(cluster.userSeeds) + len(cluster.dynaSeeds) + cluster.servers.Len() - seen := make(map[string]bool, max) - known := make([]string, 0, max) - - add := func(addr string) { - if _, found := seen[addr]; !found { - seen[addr] = true - known = append(known, addr) - } - } - - for _, addr := range cluster.userSeeds { - add(addr) - } - for _, addr := range cluster.dynaSeeds { - add(addr) - } - for _, serv := range cluster.servers.Slice() { - add(serv.Addr) - } - cluster.RUnlock() - - return known -} - -// syncServers injects a value into the cluster.sync channel to force -// an iteration of the syncServersLoop function. -func (cluster *mongoCluster) syncServers() { - select { - case cluster.sync <- true: - default: - } -} - -// How long to wait for a checkup of the cluster topology if nothing -// else kicks a synchronization before that. -const syncServersDelay = 30 * time.Second -const syncShortDelay = 500 * time.Millisecond - -// syncServersLoop loops while the cluster is alive to keep its idea of -// the server topology up-to-date. It must be called just once from -// newCluster. The loop iterates once syncServersDelay has passed, or -// if somebody injects a value into the cluster.sync channel to force a -// synchronization. A loop iteration will contact all servers in -// parallel, ask them about known peers and their own role within the -// cluster, and then attempt to do the same with all the peers -// retrieved. -func (cluster *mongoCluster) syncServersLoop() { - for { - debugf("SYNC Cluster %p is starting a sync loop iteration.", cluster) - - cluster.Lock() - if cluster.references == 0 { - cluster.Unlock() - break - } - cluster.references++ // Keep alive while syncing. - direct := cluster.direct - cluster.Unlock() - - cluster.syncServersIteration(direct) - - // We just synchronized, so consume any outstanding requests. - select { - case <-cluster.sync: - default: - } - - cluster.Release() - - // Hold off before allowing another sync. No point in - // burning CPU looking for down servers. - if !cluster.failFast { - time.Sleep(syncShortDelay) - } - - cluster.Lock() - if cluster.references == 0 { - cluster.Unlock() - break - } - cluster.syncCount++ - // Poke all waiters so they have a chance to timeout or - // restart syncing if they wish to. - cluster.serverSynced.Broadcast() - // Check if we have to restart immediately either way. - restart := !direct && cluster.masters.Empty() || cluster.servers.Empty() - cluster.Unlock() - - if restart { - log("SYNC No masters found. Will synchronize again.") - time.Sleep(syncShortDelay) - continue - } - - debugf("SYNC Cluster %p waiting for next requested or scheduled sync.", cluster) - - // Hold off until somebody explicitly requests a synchronization - // or it's time to check for a cluster topology change again. - select { - case <-cluster.sync: - case <-time.After(syncServersDelay): - } - } - debugf("SYNC Cluster %p is stopping its sync loop.", cluster) -} - -func (cluster *mongoCluster) server(addr string, tcpaddr *net.TCPAddr) *mongoServer { - cluster.RLock() - server := cluster.servers.Search(tcpaddr.String()) - cluster.RUnlock() - if server != nil { - return server - } - return newServer(addr, tcpaddr, cluster.sync, cluster.dial) -} - -func resolveAddr(addr string) (*net.TCPAddr, error) { - // This hack allows having a timeout on resolution. - conn, err := net.DialTimeout("udp4", addr, 10*time.Second) - if err != nil { - log("SYNC Failed to resolve server address: ", addr) - return nil, errors.New("failed to resolve server address: " + addr) - } - tcpaddr := (*net.TCPAddr)(conn.RemoteAddr().(*net.UDPAddr)) - conn.Close() - if tcpaddr.String() != addr { - debug("SYNC Address ", addr, " resolved as ", tcpaddr.String()) - } - return tcpaddr, nil -} - -type pendingAdd struct { - server *mongoServer - info *mongoServerInfo -} - -func (cluster *mongoCluster) syncServersIteration(direct bool) { - log("SYNC Starting full topology synchronization...") - - var wg sync.WaitGroup - var m sync.Mutex - notYetAdded := make(map[string]pendingAdd) - addIfFound := make(map[string]bool) - seen := make(map[string]bool) - syncKind := partialSync - - var spawnSync func(addr string, byMaster bool) - spawnSync = func(addr string, byMaster bool) { - wg.Add(1) - go func() { - defer wg.Done() - - tcpaddr, err := resolveAddr(addr) - if err != nil { - log("SYNC Failed to start sync of ", addr, ": ", err.Error()) - return - } - resolvedAddr := tcpaddr.String() - - m.Lock() - if byMaster { - if pending, ok := notYetAdded[resolvedAddr]; ok { - delete(notYetAdded, resolvedAddr) - m.Unlock() - cluster.addServer(pending.server, pending.info, completeSync) - return - } - addIfFound[resolvedAddr] = true - } - if seen[resolvedAddr] { - m.Unlock() - return - } - seen[resolvedAddr] = true - m.Unlock() - - server := cluster.server(addr, tcpaddr) - info, hosts, err := cluster.syncServer(server) - if err != nil { - cluster.removeServer(server) - return - } - - m.Lock() - add := direct || info.Master || addIfFound[resolvedAddr] - if add { - syncKind = completeSync - } else { - notYetAdded[resolvedAddr] = pendingAdd{server, info} - } - m.Unlock() - if add { - cluster.addServer(server, info, completeSync) - } - if !direct { - for _, addr := range hosts { - spawnSync(addr, info.Master) - } - } - }() - } - - knownAddrs := cluster.getKnownAddrs() - for _, addr := range knownAddrs { - spawnSync(addr, false) - } - wg.Wait() - - if syncKind == completeSync { - logf("SYNC Synchronization was complete (got data from primary).") - for _, pending := range notYetAdded { - cluster.removeServer(pending.server) - } - } else { - logf("SYNC Synchronization was partial (cannot talk to primary).") - for _, pending := range notYetAdded { - cluster.addServer(pending.server, pending.info, partialSync) - } - } - - cluster.Lock() - ml := cluster.masters.Len() - logf("SYNC Synchronization completed: %d master(s) and %d slave(s) alive.", ml, cluster.servers.Len()-ml) - - // Update dynamic seeds, but only if we have any good servers. Otherwise, - // leave them alone for better chances of a successful sync in the future. - if syncKind == completeSync { - dynaSeeds := make([]string, cluster.servers.Len()) - for i, server := range cluster.servers.Slice() { - dynaSeeds[i] = server.Addr - } - cluster.dynaSeeds = dynaSeeds - debugf("SYNC New dynamic seeds: %#v\n", dynaSeeds) - } - cluster.Unlock() -} - -// AcquireSocket returns a socket to a server in the cluster. If slaveOk is -// true, it will attempt to return a socket to a slave server. If it is -// false, the socket will necessarily be to a master server. -func (cluster *mongoCluster) AcquireSocket(slaveOk bool, syncTimeout time.Duration, socketTimeout time.Duration, serverTags []bson.D, poolLimit int) (s *mongoSocket, err error) { - var started time.Time - var syncCount uint - warnedLimit := false - for { - cluster.RLock() - for { - ml := cluster.masters.Len() - sl := cluster.servers.Len() - debugf("Cluster has %d known masters and %d known slaves.", ml, sl-ml) - if ml > 0 || slaveOk && sl > 0 { - break - } - if started.IsZero() { - // Initialize after fast path above. - started = time.Now() - syncCount = cluster.syncCount - } else if syncTimeout != 0 && started.Before(time.Now().Add(-syncTimeout)) || cluster.failFast && cluster.syncCount != syncCount { - cluster.RUnlock() - return nil, errors.New("no reachable servers") - } - log("Waiting for servers to synchronize...") - cluster.syncServers() - - // Remember: this will release and reacquire the lock. - cluster.serverSynced.Wait() - } - - var server *mongoServer - if slaveOk { - server = cluster.servers.BestFit(serverTags) - } else { - server = cluster.masters.BestFit(nil) - } - cluster.RUnlock() - - if server == nil { - // Must have failed the requested tags. Sleep to avoid spinning. - time.Sleep(1e8) - continue - } - - s, abended, err := server.AcquireSocket(poolLimit, socketTimeout) - if err == errPoolLimit { - if !warnedLimit { - warnedLimit = true - log("WARNING: Per-server connection limit reached.") - } - time.Sleep(100 * time.Millisecond) - continue - } - if err != nil { - cluster.removeServer(server) - cluster.syncServers() - continue - } - if abended && !slaveOk { - var result isMasterResult - err := cluster.isMaster(s, &result) - if err != nil || !result.IsMaster { - logf("Cannot confirm server %s as master (%v)", server.Addr, err) - s.Release() - cluster.syncServers() - time.Sleep(100 * time.Millisecond) - continue - } - } - return s, nil - } - panic("unreached") -} - -func (cluster *mongoCluster) CacheIndex(cacheKey string, exists bool) { - cluster.Lock() - if cluster.cachedIndex == nil { - cluster.cachedIndex = make(map[string]bool) - } - if exists { - cluster.cachedIndex[cacheKey] = true - } else { - delete(cluster.cachedIndex, cacheKey) - } - cluster.Unlock() -} - -func (cluster *mongoCluster) HasCachedIndex(cacheKey string) (result bool) { - cluster.RLock() - if cluster.cachedIndex != nil { - result = cluster.cachedIndex[cacheKey] - } - cluster.RUnlock() - return -} - -func (cluster *mongoCluster) ResetIndexCache() { - cluster.Lock() - cluster.cachedIndex = make(map[string]bool) - cluster.Unlock() -} diff --git a/vendor/gopkg.in/mgo.v2/cluster_test.go b/vendor/gopkg.in/mgo.v2/cluster_test.go deleted file mode 100644 index 0b0b09a4b..000000000 --- a/vendor/gopkg.in/mgo.v2/cluster_test.go +++ /dev/null @@ -1,1657 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// 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 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 mgo_test - -import ( - "fmt" - "io" - "net" - "strings" - "sync" - "time" - - . "gopkg.in/check.v1" - "gopkg.in/mgo.v2" - "gopkg.in/mgo.v2/bson" -) - -func (s *S) TestNewSession(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - // Do a dummy operation to wait for connection. - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"_id": 1}) - c.Assert(err, IsNil) - - // Tweak safety and query settings to ensure other has copied those. - session.SetSafe(nil) - session.SetBatch(-1) - other := session.New() - defer other.Close() - session.SetSafe(&mgo.Safe{}) - - // Clone was copied while session was unsafe, so no errors. - otherColl := other.DB("mydb").C("mycoll") - err = otherColl.Insert(M{"_id": 1}) - c.Assert(err, IsNil) - - // Original session was made safe again. - err = coll.Insert(M{"_id": 1}) - c.Assert(err, NotNil) - - // With New(), each session has its own socket now. - stats := mgo.GetStats() - c.Assert(stats.MasterConns, Equals, 2) - c.Assert(stats.SocketsInUse, Equals, 2) - - // Ensure query parameters were cloned. - err = otherColl.Insert(M{"_id": 2}) - c.Assert(err, IsNil) - - // Ping the database to ensure the nonce has been received already. - c.Assert(other.Ping(), IsNil) - - mgo.ResetStats() - - iter := otherColl.Find(M{}).Iter() - c.Assert(err, IsNil) - - m := M{} - ok := iter.Next(m) - c.Assert(ok, Equals, true) - err = iter.Close() - c.Assert(err, IsNil) - - // If Batch(-1) is in effect, a single document must have been received. - stats = mgo.GetStats() - c.Assert(stats.ReceivedDocs, Equals, 1) -} - -func (s *S) TestCloneSession(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - // Do a dummy operation to wait for connection. - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"_id": 1}) - c.Assert(err, IsNil) - - // Tweak safety and query settings to ensure clone is copying those. - session.SetSafe(nil) - session.SetBatch(-1) - clone := session.Clone() - defer clone.Close() - session.SetSafe(&mgo.Safe{}) - - // Clone was copied while session was unsafe, so no errors. - cloneColl := clone.DB("mydb").C("mycoll") - err = cloneColl.Insert(M{"_id": 1}) - c.Assert(err, IsNil) - - // Original session was made safe again. - err = coll.Insert(M{"_id": 1}) - c.Assert(err, NotNil) - - // With Clone(), same socket is shared between sessions now. - stats := mgo.GetStats() - c.Assert(stats.SocketsInUse, Equals, 1) - c.Assert(stats.SocketRefs, Equals, 2) - - // Refreshing one of them should let the original socket go, - // while preserving the safety settings. - clone.Refresh() - err = cloneColl.Insert(M{"_id": 1}) - c.Assert(err, IsNil) - - // Must have used another connection now. - stats = mgo.GetStats() - c.Assert(stats.SocketsInUse, Equals, 2) - c.Assert(stats.SocketRefs, Equals, 2) - - // Ensure query parameters were cloned. - err = cloneColl.Insert(M{"_id": 2}) - c.Assert(err, IsNil) - - // Ping the database to ensure the nonce has been received already. - c.Assert(clone.Ping(), IsNil) - - mgo.ResetStats() - - iter := cloneColl.Find(M{}).Iter() - c.Assert(err, IsNil) - - m := M{} - ok := iter.Next(m) - c.Assert(ok, Equals, true) - err = iter.Close() - c.Assert(err, IsNil) - - // If Batch(-1) is in effect, a single document must have been received. - stats = mgo.GetStats() - c.Assert(stats.ReceivedDocs, Equals, 1) -} - -func (s *S) TestSetModeStrong(c *C) { - session, err := mgo.Dial("localhost:40012") - c.Assert(err, IsNil) - defer session.Close() - - session.SetMode(mgo.Monotonic, false) - session.SetMode(mgo.Strong, false) - - c.Assert(session.Mode(), Equals, mgo.Strong) - - result := M{} - cmd := session.DB("admin").C("$cmd") - err = cmd.Find(M{"ismaster": 1}).One(&result) - c.Assert(err, IsNil) - c.Assert(result["ismaster"], Equals, true) - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"a": 1}) - c.Assert(err, IsNil) - - // Wait since the sync also uses sockets. - for len(session.LiveServers()) != 3 { - c.Log("Waiting for cluster sync to finish...") - time.Sleep(5e8) - } - - stats := mgo.GetStats() - c.Assert(stats.MasterConns, Equals, 1) - c.Assert(stats.SlaveConns, Equals, 2) - c.Assert(stats.SocketsInUse, Equals, 1) - - session.SetMode(mgo.Strong, true) - - stats = mgo.GetStats() - c.Assert(stats.SocketsInUse, Equals, 0) -} - -func (s *S) TestSetModeMonotonic(c *C) { - // Must necessarily connect to a slave, otherwise the - // master connection will be available first. - session, err := mgo.Dial("localhost:40012") - c.Assert(err, IsNil) - defer session.Close() - - session.SetMode(mgo.Monotonic, false) - - c.Assert(session.Mode(), Equals, mgo.Monotonic) - - result := M{} - cmd := session.DB("admin").C("$cmd") - err = cmd.Find(M{"ismaster": 1}).One(&result) - c.Assert(err, IsNil) - c.Assert(result["ismaster"], Equals, false) - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"a": 1}) - c.Assert(err, IsNil) - - result = M{} - err = cmd.Find(M{"ismaster": 1}).One(&result) - c.Assert(err, IsNil) - c.Assert(result["ismaster"], Equals, true) - - // Wait since the sync also uses sockets. - for len(session.LiveServers()) != 3 { - c.Log("Waiting for cluster sync to finish...") - time.Sleep(5e8) - } - - stats := mgo.GetStats() - c.Assert(stats.MasterConns, Equals, 1) - c.Assert(stats.SlaveConns, Equals, 2) - c.Assert(stats.SocketsInUse, Equals, 2) - - session.SetMode(mgo.Monotonic, true) - - stats = mgo.GetStats() - c.Assert(stats.SocketsInUse, Equals, 0) -} - -func (s *S) TestSetModeMonotonicAfterStrong(c *C) { - // Test that a strong session shifting to a monotonic - // one preserves the socket untouched. - - session, err := mgo.Dial("localhost:40012") - c.Assert(err, IsNil) - defer session.Close() - - // Insert something to force a connection to the master. - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"a": 1}) - c.Assert(err, IsNil) - - session.SetMode(mgo.Monotonic, false) - - // Wait since the sync also uses sockets. - for len(session.LiveServers()) != 3 { - c.Log("Waiting for cluster sync to finish...") - time.Sleep(5e8) - } - - // Master socket should still be reserved. - stats := mgo.GetStats() - c.Assert(stats.SocketsInUse, Equals, 1) - - // Confirm it's the master even though it's Monotonic by now. - result := M{} - cmd := session.DB("admin").C("$cmd") - err = cmd.Find(M{"ismaster": 1}).One(&result) - c.Assert(err, IsNil) - c.Assert(result["ismaster"], Equals, true) -} - -func (s *S) TestSetModeStrongAfterMonotonic(c *C) { - // Test that shifting from Monotonic to Strong while - // using a slave socket will keep the socket reserved - // until the master socket is necessary, so that no - // switch over occurs unless it's actually necessary. - - // Must necessarily connect to a slave, otherwise the - // master connection will be available first. - session, err := mgo.Dial("localhost:40012") - c.Assert(err, IsNil) - defer session.Close() - - session.SetMode(mgo.Monotonic, false) - - // Ensure we're talking to a slave, and reserve the socket. - result := M{} - err = session.Run("ismaster", &result) - c.Assert(err, IsNil) - c.Assert(result["ismaster"], Equals, false) - - // Switch to a Strong session. - session.SetMode(mgo.Strong, false) - - // Wait since the sync also uses sockets. - for len(session.LiveServers()) != 3 { - c.Log("Waiting for cluster sync to finish...") - time.Sleep(5e8) - } - - // Slave socket should still be reserved. - stats := mgo.GetStats() - c.Assert(stats.SocketsInUse, Equals, 1) - - // But any operation will switch it to the master. - result = M{} - err = session.Run("ismaster", &result) - c.Assert(err, IsNil) - c.Assert(result["ismaster"], Equals, true) -} - -func (s *S) TestSetModeMonotonicWriteOnIteration(c *C) { - // Must necessarily connect to a slave, otherwise the - // master connection will be available first. - session, err := mgo.Dial("localhost:40012") - c.Assert(err, IsNil) - defer session.Close() - - session.SetMode(mgo.Monotonic, false) - - c.Assert(session.Mode(), Equals, mgo.Monotonic) - - coll1 := session.DB("mydb").C("mycoll1") - coll2 := session.DB("mydb").C("mycoll2") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - err := coll1.Insert(M{"n": n}) - c.Assert(err, IsNil) - } - - // Release master so we can grab a slave again. - session.Refresh() - - // Wait until synchronization is done. - for { - n, err := coll1.Count() - c.Assert(err, IsNil) - if n == len(ns) { - break - } - } - - iter := coll1.Find(nil).Batch(2).Iter() - i := 0 - m := M{} - for iter.Next(&m) { - i++ - if i > 3 { - err := coll2.Insert(M{"n": 47 + i}) - c.Assert(err, IsNil) - } - } - c.Assert(i, Equals, len(ns)) -} - -func (s *S) TestSetModeEventual(c *C) { - // Must necessarily connect to a slave, otherwise the - // master connection will be available first. - session, err := mgo.Dial("localhost:40012") - c.Assert(err, IsNil) - defer session.Close() - - session.SetMode(mgo.Eventual, false) - - c.Assert(session.Mode(), Equals, mgo.Eventual) - - result := M{} - err = session.Run("ismaster", &result) - c.Assert(err, IsNil) - c.Assert(result["ismaster"], Equals, false) - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"a": 1}) - c.Assert(err, IsNil) - - result = M{} - err = session.Run("ismaster", &result) - c.Assert(err, IsNil) - c.Assert(result["ismaster"], Equals, false) - - // Wait since the sync also uses sockets. - for len(session.LiveServers()) != 3 { - c.Log("Waiting for cluster sync to finish...") - time.Sleep(5e8) - } - - stats := mgo.GetStats() - c.Assert(stats.MasterConns, Equals, 1) - c.Assert(stats.SlaveConns, Equals, 2) - c.Assert(stats.SocketsInUse, Equals, 0) -} - -func (s *S) TestSetModeEventualAfterStrong(c *C) { - // Test that a strong session shifting to an eventual - // one preserves the socket untouched. - - session, err := mgo.Dial("localhost:40012") - c.Assert(err, IsNil) - defer session.Close() - - // Insert something to force a connection to the master. - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"a": 1}) - c.Assert(err, IsNil) - - session.SetMode(mgo.Eventual, false) - - // Wait since the sync also uses sockets. - for len(session.LiveServers()) != 3 { - c.Log("Waiting for cluster sync to finish...") - time.Sleep(5e8) - } - - // Master socket should still be reserved. - stats := mgo.GetStats() - c.Assert(stats.SocketsInUse, Equals, 1) - - // Confirm it's the master even though it's Eventual by now. - result := M{} - cmd := session.DB("admin").C("$cmd") - err = cmd.Find(M{"ismaster": 1}).One(&result) - c.Assert(err, IsNil) - c.Assert(result["ismaster"], Equals, true) - - session.SetMode(mgo.Eventual, true) - - stats = mgo.GetStats() - c.Assert(stats.SocketsInUse, Equals, 0) -} - -func (s *S) TestPrimaryShutdownStrong(c *C) { - if *fast { - c.Skip("-fast") - } - - session, err := mgo.Dial("localhost:40021") - c.Assert(err, IsNil) - defer session.Close() - - // With strong consistency, this will open a socket to the master. - result := &struct{ Host string }{} - err = session.Run("serverStatus", result) - c.Assert(err, IsNil) - - // Kill the master. - host := result.Host - s.Stop(host) - - // This must fail, since the connection was broken. - err = session.Run("serverStatus", result) - c.Assert(err, Equals, io.EOF) - - // With strong consistency, it fails again until reset. - err = session.Run("serverStatus", result) - c.Assert(err, Equals, io.EOF) - - session.Refresh() - - // Now we should be able to talk to the new master. - // Increase the timeout since this may take quite a while. - session.SetSyncTimeout(3 * time.Minute) - - err = session.Run("serverStatus", result) - c.Assert(err, IsNil) - c.Assert(result.Host, Not(Equals), host) - - // Insert some data to confirm it's indeed a master. - err = session.DB("mydb").C("mycoll").Insert(M{"n": 42}) - c.Assert(err, IsNil) -} - -func (s *S) TestPrimaryHiccup(c *C) { - if *fast { - c.Skip("-fast") - } - - session, err := mgo.Dial("localhost:40021") - c.Assert(err, IsNil) - defer session.Close() - - // With strong consistency, this will open a socket to the master. - result := &struct{ Host string }{} - err = session.Run("serverStatus", result) - c.Assert(err, IsNil) - - // Establish a few extra sessions to create spare sockets to - // the master. This increases a bit the chances of getting an - // incorrect cached socket. - var sessions []*mgo.Session - for i := 0; i < 20; i++ { - sessions = append(sessions, session.Copy()) - err = sessions[len(sessions)-1].Run("serverStatus", result) - c.Assert(err, IsNil) - } - for i := range sessions { - sessions[i].Close() - } - - // Kill the master, but bring it back immediatelly. - host := result.Host - s.Stop(host) - s.StartAll() - - // This must fail, since the connection was broken. - err = session.Run("serverStatus", result) - c.Assert(err, Equals, io.EOF) - - // With strong consistency, it fails again until reset. - err = session.Run("serverStatus", result) - c.Assert(err, Equals, io.EOF) - - session.Refresh() - - // Now we should be able to talk to the new master. - // Increase the timeout since this may take quite a while. - session.SetSyncTimeout(3 * time.Minute) - - // Insert some data to confirm it's indeed a master. - err = session.DB("mydb").C("mycoll").Insert(M{"n": 42}) - c.Assert(err, IsNil) -} - -func (s *S) TestPrimaryShutdownMonotonic(c *C) { - if *fast { - c.Skip("-fast") - } - - session, err := mgo.Dial("localhost:40021") - c.Assert(err, IsNil) - defer session.Close() - - session.SetMode(mgo.Monotonic, true) - - // Insert something to force a switch to the master. - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"a": 1}) - c.Assert(err, IsNil) - - // Wait a bit for this to be synchronized to slaves. - time.Sleep(3 * time.Second) - - result := &struct{ Host string }{} - err = session.Run("serverStatus", result) - c.Assert(err, IsNil) - - // Kill the master. - host := result.Host - s.Stop(host) - - // This must fail, since the connection was broken. - err = session.Run("serverStatus", result) - c.Assert(err, Equals, io.EOF) - - // With monotonic consistency, it fails again until reset. - err = session.Run("serverStatus", result) - c.Assert(err, Equals, io.EOF) - - session.Refresh() - - // Now we should be able to talk to the new master. - err = session.Run("serverStatus", result) - c.Assert(err, IsNil) - c.Assert(result.Host, Not(Equals), host) -} - -func (s *S) TestPrimaryShutdownMonotonicWithSlave(c *C) { - if *fast { - c.Skip("-fast") - } - - session, err := mgo.Dial("localhost:40021") - c.Assert(err, IsNil) - defer session.Close() - - ssresult := &struct{ Host string }{} - imresult := &struct{ IsMaster bool }{} - - // Figure the master while still using the strong session. - err = session.Run("serverStatus", ssresult) - c.Assert(err, IsNil) - err = session.Run("isMaster", imresult) - c.Assert(err, IsNil) - master := ssresult.Host - c.Assert(imresult.IsMaster, Equals, true, Commentf("%s is not the master", master)) - - // Create new monotonic session with an explicit address to ensure - // a slave is synchronized before the master, otherwise a connection - // with the master may be used below for lack of other options. - var addr string - switch { - case strings.HasSuffix(ssresult.Host, ":40021"): - addr = "localhost:40022" - case strings.HasSuffix(ssresult.Host, ":40022"): - addr = "localhost:40021" - case strings.HasSuffix(ssresult.Host, ":40023"): - addr = "localhost:40021" - default: - c.Fatal("Unknown host: ", ssresult.Host) - } - - session, err = mgo.Dial(addr) - c.Assert(err, IsNil) - defer session.Close() - - session.SetMode(mgo.Monotonic, true) - - // Check the address of the socket associated with the monotonic session. - c.Log("Running serverStatus and isMaster with monotonic session") - err = session.Run("serverStatus", ssresult) - c.Assert(err, IsNil) - err = session.Run("isMaster", imresult) - c.Assert(err, IsNil) - slave := ssresult.Host - c.Assert(imresult.IsMaster, Equals, false, Commentf("%s is not a slave", slave)) - - c.Assert(master, Not(Equals), slave) - - // Kill the master. - s.Stop(master) - - // Session must still be good, since we were talking to a slave. - err = session.Run("serverStatus", ssresult) - c.Assert(err, IsNil) - - c.Assert(ssresult.Host, Equals, slave, - Commentf("Monotonic session moved from %s to %s", slave, ssresult.Host)) - - // If we try to insert something, it'll have to hold until the new - // master is available to move the connection, and work correctly. - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"a": 1}) - c.Assert(err, IsNil) - - // Must now be talking to the new master. - err = session.Run("serverStatus", ssresult) - c.Assert(err, IsNil) - err = session.Run("isMaster", imresult) - c.Assert(err, IsNil) - c.Assert(imresult.IsMaster, Equals, true, Commentf("%s is not the master", master)) - - // ... which is not the old one, since it's still dead. - c.Assert(ssresult.Host, Not(Equals), master) -} - -func (s *S) TestPrimaryShutdownEventual(c *C) { - if *fast { - c.Skip("-fast") - } - - session, err := mgo.Dial("localhost:40021") - c.Assert(err, IsNil) - defer session.Close() - - result := &struct{ Host string }{} - err = session.Run("serverStatus", result) - c.Assert(err, IsNil) - master := result.Host - - session.SetMode(mgo.Eventual, true) - - // Should connect to the master when needed. - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"a": 1}) - c.Assert(err, IsNil) - - // Wait a bit for this to be synchronized to slaves. - time.Sleep(3 * time.Second) - - // Kill the master. - s.Stop(master) - - // Should still work, with the new master now. - coll = session.DB("mydb").C("mycoll") - err = coll.Insert(M{"a": 1}) - c.Assert(err, IsNil) - - err = session.Run("serverStatus", result) - c.Assert(err, IsNil) - c.Assert(result.Host, Not(Equals), master) -} - -func (s *S) TestPreserveSocketCountOnSync(c *C) { - if *fast { - c.Skip("-fast") - } - - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - stats := mgo.GetStats() - for stats.MasterConns+stats.SlaveConns != 3 { - stats = mgo.GetStats() - c.Log("Waiting for all connections to be established...") - time.Sleep(5e8) - } - - c.Assert(stats.SocketsAlive, Equals, 3) - - // Kill the master (with rs1, 'a' is always the master). - s.Stop("localhost:40011") - - // Wait for the logic to run for a bit and bring it back. - startedAll := make(chan bool) - go func() { - time.Sleep(5e9) - s.StartAll() - startedAll <- true - }() - - // Do not allow the test to return before the goroutine above is done. - defer func() { - <-startedAll - }() - - // Do an action to kick the resync logic in, and also to - // wait until the cluster recognizes the server is back. - result := struct{ Ok bool }{} - err = session.Run("getLastError", &result) - c.Assert(err, IsNil) - c.Assert(result.Ok, Equals, true) - - for i := 0; i != 20; i++ { - stats = mgo.GetStats() - if stats.SocketsAlive == 3 { - break - } - c.Logf("Waiting for 3 sockets alive, have %d", stats.SocketsAlive) - time.Sleep(5e8) - } - - // Ensure the number of sockets is preserved after syncing. - stats = mgo.GetStats() - c.Assert(stats.SocketsAlive, Equals, 3) - c.Assert(stats.SocketsInUse, Equals, 1) - c.Assert(stats.SocketRefs, Equals, 1) -} - -// Connect to the master of a deployment with a single server, -// run an insert, and then ensure the insert worked and that a -// single connection was established. -func (s *S) TestTopologySyncWithSingleMaster(c *C) { - // Use hostname here rather than IP, to make things trickier. - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"a": 1, "b": 2}) - c.Assert(err, IsNil) - - // One connection used for discovery. Master socket recycled for - // insert. Socket is reserved after insert. - stats := mgo.GetStats() - c.Assert(stats.MasterConns, Equals, 1) - c.Assert(stats.SlaveConns, Equals, 0) - c.Assert(stats.SocketsInUse, Equals, 1) - - // Refresh session and socket must be released. - session.Refresh() - stats = mgo.GetStats() - c.Assert(stats.SocketsInUse, Equals, 0) -} - -func (s *S) TestTopologySyncWithSlaveSeed(c *C) { - // That's supposed to be a slave. Must run discovery - // and find out master to insert successfully. - session, err := mgo.Dial("localhost:40012") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - coll.Insert(M{"a": 1, "b": 2}) - - result := struct{ Ok bool }{} - err = session.Run("getLastError", &result) - c.Assert(err, IsNil) - c.Assert(result.Ok, Equals, true) - - // One connection to each during discovery. Master - // socket recycled for insert. - stats := mgo.GetStats() - c.Assert(stats.MasterConns, Equals, 1) - c.Assert(stats.SlaveConns, Equals, 2) - - // Only one socket reference alive, in the master socket owned - // by the above session. - c.Assert(stats.SocketsInUse, Equals, 1) - - // Refresh it, and it must be gone. - session.Refresh() - stats = mgo.GetStats() - c.Assert(stats.SocketsInUse, Equals, 0) -} - -func (s *S) TestSyncTimeout(c *C) { - if *fast { - c.Skip("-fast") - } - - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - s.Stop("localhost:40001") - - timeout := 3 * time.Second - session.SetSyncTimeout(timeout) - started := time.Now() - - // Do something. - result := struct{ Ok bool }{} - err = session.Run("getLastError", &result) - c.Assert(err, ErrorMatches, "no reachable servers") - c.Assert(started.Before(time.Now().Add(-timeout)), Equals, true) - c.Assert(started.After(time.Now().Add(-timeout*2)), Equals, true) -} - -func (s *S) TestDialWithTimeout(c *C) { - if *fast { - c.Skip("-fast") - } - - timeout := 2 * time.Second - started := time.Now() - - // 40009 isn't used by the test servers. - session, err := mgo.DialWithTimeout("localhost:40009", timeout) - if session != nil { - session.Close() - } - c.Assert(err, ErrorMatches, "no reachable servers") - c.Assert(session, IsNil) - c.Assert(started.Before(time.Now().Add(-timeout)), Equals, true) - c.Assert(started.After(time.Now().Add(-timeout*2)), Equals, true) -} - -func (s *S) TestSocketTimeout(c *C) { - if *fast { - c.Skip("-fast") - } - - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - s.Freeze("localhost:40001") - - timeout := 3 * time.Second - session.SetSocketTimeout(timeout) - started := time.Now() - - // Do something. - result := struct{ Ok bool }{} - err = session.Run("getLastError", &result) - c.Assert(err, ErrorMatches, ".*: i/o timeout") - c.Assert(started.Before(time.Now().Add(-timeout)), Equals, true) - c.Assert(started.After(time.Now().Add(-timeout*2)), Equals, true) -} - -func (s *S) TestSocketTimeoutOnDial(c *C) { - if *fast { - c.Skip("-fast") - } - - timeout := 1 * time.Second - - defer mgo.HackSyncSocketTimeout(timeout)() - - s.Freeze("localhost:40001") - - started := time.Now() - - session, err := mgo.DialWithTimeout("localhost:40001", timeout) - c.Assert(err, ErrorMatches, "no reachable servers") - c.Assert(session, IsNil) - - c.Assert(started.Before(time.Now().Add(-timeout)), Equals, true) - c.Assert(started.After(time.Now().Add(-20*time.Second)), Equals, true) -} - -func (s *S) TestSocketTimeoutOnInactiveSocket(c *C) { - if *fast { - c.Skip("-fast") - } - - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - timeout := 2 * time.Second - session.SetSocketTimeout(timeout) - - // Do something that relies on the timeout and works. - c.Assert(session.Ping(), IsNil) - - // Freeze and wait for the timeout to go by. - s.Freeze("localhost:40001") - time.Sleep(timeout + 500*time.Millisecond) - s.Thaw("localhost:40001") - - // Do something again. The timeout above should not have killed - // the socket as there was nothing to be done. - c.Assert(session.Ping(), IsNil) -} - -func (s *S) TestDialWithReplicaSetName(c *C) { - seedLists := [][]string{ - // rs1 primary and rs2 primary - []string{"localhost:40011", "localhost:40021"}, - // rs1 primary and rs2 secondary - []string{"localhost:40011", "localhost:40022"}, - // rs1 secondary and rs2 primary - []string{"localhost:40012", "localhost:40021"}, - // rs1 secondary and rs2 secondary - []string{"localhost:40012", "localhost:40022"}, - } - - rs2Members := []string{":40021", ":40022", ":40023"} - - verifySyncedServers := func(session *mgo.Session, numServers int) { - // wait for the server(s) to be synced - for len(session.LiveServers()) != numServers { - c.Log("Waiting for cluster sync to finish...") - time.Sleep(5e8) - } - - // ensure none of the rs2 set members are communicated with - for _, addr := range session.LiveServers() { - for _, rs2Member := range rs2Members { - c.Assert(strings.HasSuffix(addr, rs2Member), Equals, false) - } - } - } - - // only communication with rs1 members is expected - for _, seedList := range seedLists { - info := mgo.DialInfo{ - Addrs: seedList, - Timeout: 5 * time.Second, - ReplicaSetName: "rs1", - } - - session, err := mgo.DialWithInfo(&info) - c.Assert(err, IsNil) - verifySyncedServers(session, 3) - session.Close() - - info.Direct = true - session, err = mgo.DialWithInfo(&info) - c.Assert(err, IsNil) - verifySyncedServers(session, 1) - session.Close() - - connectionUrl := fmt.Sprintf("mongodb://%v/?replicaSet=rs1", strings.Join(seedList, ",")) - session, err = mgo.Dial(connectionUrl) - c.Assert(err, IsNil) - verifySyncedServers(session, 3) - session.Close() - - connectionUrl += "&connect=direct" - session, err = mgo.Dial(connectionUrl) - c.Assert(err, IsNil) - verifySyncedServers(session, 1) - session.Close() - } - -} - -func (s *S) TestDirect(c *C) { - session, err := mgo.Dial("localhost:40012?connect=direct") - c.Assert(err, IsNil) - defer session.Close() - - // We know that server is a slave. - session.SetMode(mgo.Monotonic, true) - - result := &struct{ Host string }{} - err = session.Run("serverStatus", result) - c.Assert(err, IsNil) - c.Assert(strings.HasSuffix(result.Host, ":40012"), Equals, true) - - stats := mgo.GetStats() - c.Assert(stats.SocketsAlive, Equals, 1) - c.Assert(stats.SocketsInUse, Equals, 1) - c.Assert(stats.SocketRefs, Equals, 1) - - // We've got no master, so it'll timeout. - session.SetSyncTimeout(5e8 * time.Nanosecond) - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"test": 1}) - c.Assert(err, ErrorMatches, "no reachable servers") - - // Writing to the local database is okay. - coll = session.DB("local").C("mycoll") - defer coll.RemoveAll(nil) - id := bson.NewObjectId() - err = coll.Insert(M{"_id": id}) - c.Assert(err, IsNil) - - // Data was stored in the right server. - n, err := coll.Find(M{"_id": id}).Count() - c.Assert(err, IsNil) - c.Assert(n, Equals, 1) - - // Server hasn't changed. - result.Host = "" - err = session.Run("serverStatus", result) - c.Assert(err, IsNil) - c.Assert(strings.HasSuffix(result.Host, ":40012"), Equals, true) -} - -func (s *S) TestDirectToUnknownStateMember(c *C) { - session, err := mgo.Dial("localhost:40041?connect=direct") - c.Assert(err, IsNil) - defer session.Close() - - session.SetMode(mgo.Monotonic, true) - - result := &struct{ Host string }{} - err = session.Run("serverStatus", result) - c.Assert(err, IsNil) - c.Assert(strings.HasSuffix(result.Host, ":40041"), Equals, true) - - // We've got no master, so it'll timeout. - session.SetSyncTimeout(5e8 * time.Nanosecond) - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"test": 1}) - c.Assert(err, ErrorMatches, "no reachable servers") - - // Slave is still reachable. - result.Host = "" - err = session.Run("serverStatus", result) - c.Assert(err, IsNil) - c.Assert(strings.HasSuffix(result.Host, ":40041"), Equals, true) -} - -func (s *S) TestFailFast(c *C) { - info := mgo.DialInfo{ - Addrs: []string{"localhost:99999"}, - Timeout: 5 * time.Second, - FailFast: true, - } - - started := time.Now() - - _, err := mgo.DialWithInfo(&info) - c.Assert(err, ErrorMatches, "no reachable servers") - - c.Assert(started.After(time.Now().Add(-time.Second)), Equals, true) -} - -type OpCounters struct { - Insert int - Query int - Update int - Delete int - GetMore int - Command int -} - -func getOpCounters(server string) (c *OpCounters, err error) { - session, err := mgo.Dial(server + "?connect=direct") - if err != nil { - return nil, err - } - defer session.Close() - session.SetMode(mgo.Monotonic, true) - result := struct{ OpCounters }{} - err = session.Run("serverStatus", &result) - return &result.OpCounters, err -} - -func (s *S) TestMonotonicSlaveOkFlagWithMongos(c *C) { - session, err := mgo.Dial("localhost:40021") - c.Assert(err, IsNil) - defer session.Close() - - ssresult := &struct{ Host string }{} - imresult := &struct{ IsMaster bool }{} - - // Figure the master while still using the strong session. - err = session.Run("serverStatus", ssresult) - c.Assert(err, IsNil) - err = session.Run("isMaster", imresult) - c.Assert(err, IsNil) - master := ssresult.Host - c.Assert(imresult.IsMaster, Equals, true, Commentf("%s is not the master", master)) - - // Collect op counters for everyone. - opc21a, err := getOpCounters("localhost:40021") - c.Assert(err, IsNil) - opc22a, err := getOpCounters("localhost:40022") - c.Assert(err, IsNil) - opc23a, err := getOpCounters("localhost:40023") - c.Assert(err, IsNil) - - // Do a SlaveOk query through MongoS - - mongos, err := mgo.Dial("localhost:40202") - c.Assert(err, IsNil) - defer mongos.Close() - - mongos.SetMode(mgo.Monotonic, true) - - coll := mongos.DB("mydb").C("mycoll") - result := &struct{}{} - for i := 0; i != 5; i++ { - err := coll.Find(nil).One(result) - c.Assert(err, Equals, mgo.ErrNotFound) - } - - // Collect op counters for everyone again. - opc21b, err := getOpCounters("localhost:40021") - c.Assert(err, IsNil) - opc22b, err := getOpCounters("localhost:40022") - c.Assert(err, IsNil) - opc23b, err := getOpCounters("localhost:40023") - c.Assert(err, IsNil) - - masterPort := master[strings.Index(master, ":")+1:] - - var masterDelta, slaveDelta int - switch masterPort { - case "40021": - masterDelta = opc21b.Query - opc21a.Query - slaveDelta = (opc22b.Query - opc22a.Query) + (opc23b.Query - opc23a.Query) - case "40022": - masterDelta = opc22b.Query - opc22a.Query - slaveDelta = (opc21b.Query - opc21a.Query) + (opc23b.Query - opc23a.Query) - case "40023": - masterDelta = opc23b.Query - opc23a.Query - slaveDelta = (opc21b.Query - opc21a.Query) + (opc22b.Query - opc22a.Query) - default: - c.Fatal("Uh?") - } - - c.Check(masterDelta, Equals, 0) // Just the counting itself. - c.Check(slaveDelta, Equals, 5) // The counting for both, plus 5 queries above. -} - -func (s *S) TestRemovalOfClusterMember(c *C) { - if *fast { - c.Skip("-fast") - } - - master, err := mgo.Dial("localhost:40021") - c.Assert(err, IsNil) - defer master.Close() - - // Wait for cluster to fully sync up. - for i := 0; i < 10; i++ { - if len(master.LiveServers()) == 3 { - break - } - time.Sleep(5e8) - } - if len(master.LiveServers()) != 3 { - c.Fatalf("Test started with bad cluster state: %v", master.LiveServers()) - } - - result := &struct { - IsMaster bool - Me string - }{} - slave := master.Copy() - slave.SetMode(mgo.Monotonic, true) // Monotonic can hold a non-master socket persistently. - err = slave.Run("isMaster", result) - c.Assert(err, IsNil) - c.Assert(result.IsMaster, Equals, false) - slaveAddr := result.Me - - defer func() { - master.Refresh() - master.Run(bson.D{{"$eval", `rs.add("` + slaveAddr + `")`}}, nil) - master.Close() - slave.Close() - }() - - c.Logf("========== Removing slave: %s ==========", slaveAddr) - - master.Run(bson.D{{"$eval", `rs.remove("` + slaveAddr + `")`}}, nil) - - master.Refresh() - - // Give the cluster a moment to catch up by doing a roundtrip to the master. - err = master.Ping() - c.Assert(err, IsNil) - - time.Sleep(3e9) - - // This must fail since the slave has been taken off the cluster. - err = slave.Ping() - c.Assert(err, NotNil) - - for i := 0; i < 15; i++ { - if len(master.LiveServers()) == 2 { - break - } - time.Sleep(time.Second) - } - live := master.LiveServers() - if len(live) != 2 { - c.Errorf("Removed server still considered live: %#s", live) - } - - c.Log("========== Test succeeded. ==========") -} - -func (s *S) TestPoolLimitSimple(c *C) { - for test := 0; test < 2; test++ { - var session *mgo.Session - var err error - if test == 0 { - session, err = mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - session.SetPoolLimit(1) - } else { - session, err = mgo.Dial("localhost:40001?maxPoolSize=1") - c.Assert(err, IsNil) - } - defer session.Close() - - // Put one socket in use. - c.Assert(session.Ping(), IsNil) - - done := make(chan time.Duration) - - // Now block trying to get another one due to the pool limit. - go func() { - copy := session.Copy() - defer copy.Close() - started := time.Now() - c.Check(copy.Ping(), IsNil) - done <- time.Now().Sub(started) - }() - - time.Sleep(300 * time.Millisecond) - - // Put the one socket back in the pool, freeing it for the copy. - session.Refresh() - delay := <-done - c.Assert(delay > 300*time.Millisecond, Equals, true, Commentf("Delay: %s", delay)) - } -} - -func (s *S) TestPoolLimitMany(c *C) { - if *fast { - c.Skip("-fast") - } - - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - stats := mgo.GetStats() - for stats.MasterConns+stats.SlaveConns != 3 { - stats = mgo.GetStats() - c.Log("Waiting for all connections to be established...") - time.Sleep(500 * time.Millisecond) - } - c.Assert(stats.SocketsAlive, Equals, 3) - - const poolLimit = 64 - session.SetPoolLimit(poolLimit) - - // Consume the whole limit for the master. - var master []*mgo.Session - for i := 0; i < poolLimit; i++ { - s := session.Copy() - defer s.Close() - c.Assert(s.Ping(), IsNil) - master = append(master, s) - } - - before := time.Now() - go func() { - time.Sleep(3e9) - master[0].Refresh() - }() - - // Then, a single ping must block, since it would need another - // connection to the master, over the limit. Once the goroutine - // above releases its socket, it should move on. - session.Ping() - delay := time.Now().Sub(before) - c.Assert(delay > 3e9, Equals, true) - c.Assert(delay < 6e9, Equals, true) -} - -func (s *S) TestSetModeEventualIterBug(c *C) { - session1, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session1.Close() - - session1.SetMode(mgo.Eventual, false) - - coll1 := session1.DB("mydb").C("mycoll") - - const N = 100 - for i := 0; i < N; i++ { - err = coll1.Insert(M{"_id": i}) - c.Assert(err, IsNil) - } - - c.Logf("Waiting until secondary syncs") - for { - n, err := coll1.Count() - c.Assert(err, IsNil) - if n == N { - c.Logf("Found all") - break - } - } - - session2, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session2.Close() - - session2.SetMode(mgo.Eventual, false) - - coll2 := session2.DB("mydb").C("mycoll") - - i := 0 - iter := coll2.Find(nil).Batch(10).Iter() - var result struct{} - for iter.Next(&result) { - i++ - } - c.Assert(iter.Close(), Equals, nil) - c.Assert(i, Equals, N) -} - -func (s *S) TestCustomDialOld(c *C) { - dials := make(chan bool, 16) - dial := func(addr net.Addr) (net.Conn, error) { - tcpaddr, ok := addr.(*net.TCPAddr) - if !ok { - return nil, fmt.Errorf("unexpected address type: %T", addr) - } - dials <- true - return net.DialTCP("tcp", nil, tcpaddr) - } - info := mgo.DialInfo{ - Addrs: []string{"localhost:40012"}, - Dial: dial, - } - - // Use hostname here rather than IP, to make things trickier. - session, err := mgo.DialWithInfo(&info) - c.Assert(err, IsNil) - defer session.Close() - - const N = 3 - for i := 0; i < N; i++ { - select { - case <-dials: - case <-time.After(5 * time.Second): - c.Fatalf("expected %d dials, got %d", N, i) - } - } - select { - case <-dials: - c.Fatalf("got more dials than expected") - case <-time.After(100 * time.Millisecond): - } -} - -func (s *S) TestCustomDialNew(c *C) { - dials := make(chan bool, 16) - dial := func(addr *mgo.ServerAddr) (net.Conn, error) { - dials <- true - if addr.TCPAddr().Port == 40012 { - c.Check(addr.String(), Equals, "localhost:40012") - } - return net.DialTCP("tcp", nil, addr.TCPAddr()) - } - info := mgo.DialInfo{ - Addrs: []string{"localhost:40012"}, - DialServer: dial, - } - - // Use hostname here rather than IP, to make things trickier. - session, err := mgo.DialWithInfo(&info) - c.Assert(err, IsNil) - defer session.Close() - - const N = 3 - for i := 0; i < N; i++ { - select { - case <-dials: - case <-time.After(5 * time.Second): - c.Fatalf("expected %d dials, got %d", N, i) - } - } - select { - case <-dials: - c.Fatalf("got more dials than expected") - case <-time.After(100 * time.Millisecond): - } -} - -func (s *S) TestPrimaryShutdownOnAuthShard(c *C) { - if *fast { - c.Skip("-fast") - } - - // Dial the shard. - session, err := mgo.Dial("localhost:40203") - c.Assert(err, IsNil) - defer session.Close() - - // Login and insert something to make it more realistic. - session.DB("admin").Login("root", "rapadura") - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(bson.M{"n": 1}) - c.Assert(err, IsNil) - - // Dial the replica set to figure the master out. - rs, err := mgo.Dial("root:rapadura@localhost:40031") - c.Assert(err, IsNil) - defer rs.Close() - - // With strong consistency, this will open a socket to the master. - result := &struct{ Host string }{} - err = rs.Run("serverStatus", result) - c.Assert(err, IsNil) - - // Kill the master. - host := result.Host - s.Stop(host) - - // This must fail, since the connection was broken. - err = rs.Run("serverStatus", result) - c.Assert(err, Equals, io.EOF) - - // This won't work because the master just died. - err = coll.Insert(bson.M{"n": 2}) - c.Assert(err, NotNil) - - // Refresh session and wait for re-election. - session.Refresh() - for i := 0; i < 60; i++ { - err = coll.Insert(bson.M{"n": 3}) - if err == nil { - break - } - c.Logf("Waiting for replica set to elect a new master. Last error: %v", err) - time.Sleep(500 * time.Millisecond) - } - c.Assert(err, IsNil) - - count, err := coll.Count() - c.Assert(count > 1, Equals, true) -} - -func (s *S) TestNearestSecondary(c *C) { - defer mgo.HackPingDelay(3 * time.Second)() - - rs1a := "127.0.0.1:40011" - rs1b := "127.0.0.1:40012" - rs1c := "127.0.0.1:40013" - s.Freeze(rs1b) - - session, err := mgo.Dial(rs1a) - c.Assert(err, IsNil) - defer session.Close() - - // Wait for the sync up to run through the first couple of servers. - for len(session.LiveServers()) != 2 { - c.Log("Waiting for two servers to be alive...") - time.Sleep(100 * time.Millisecond) - } - - // Extra delay to ensure the third server gets penalized. - time.Sleep(500 * time.Millisecond) - - // Release third server. - s.Thaw(rs1b) - - // Wait for it to come up. - for len(session.LiveServers()) != 3 { - c.Log("Waiting for all servers to be alive...") - time.Sleep(100 * time.Millisecond) - } - - session.SetMode(mgo.Monotonic, true) - var result struct{ Host string } - - // See which slave picks the line, several times to avoid chance. - for i := 0; i < 10; i++ { - session.Refresh() - err = session.Run("serverStatus", &result) - c.Assert(err, IsNil) - c.Assert(hostPort(result.Host), Equals, hostPort(rs1c)) - } - - if *fast { - // Don't hold back for several seconds. - return - } - - // Now hold the other server for long enough to penalize it. - s.Freeze(rs1c) - time.Sleep(5 * time.Second) - s.Thaw(rs1c) - - // Wait for the ping to be processed. - time.Sleep(500 * time.Millisecond) - - // Repeating the test should now pick the former server consistently. - for i := 0; i < 10; i++ { - session.Refresh() - err = session.Run("serverStatus", &result) - c.Assert(err, IsNil) - c.Assert(hostPort(result.Host), Equals, hostPort(rs1b)) - } -} - -func (s *S) TestConnectCloseConcurrency(c *C) { - restore := mgo.HackPingDelay(500 * time.Millisecond) - defer restore() - var wg sync.WaitGroup - const n = 500 - wg.Add(n) - for i := 0; i < n; i++ { - go func() { - defer wg.Done() - session, err := mgo.Dial("localhost:40001") - if err != nil { - c.Fatal(err) - } - time.Sleep(1) - session.Close() - }() - } - wg.Wait() -} - -func (s *S) TestSelectServers(c *C) { - if !s.versionAtLeast(2, 2) { - c.Skip("read preferences introduced in 2.2") - } - - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - session.SetMode(mgo.Eventual, true) - - var result struct{ Host string } - - session.Refresh() - session.SelectServers(bson.D{{"rs1", "b"}}) - err = session.Run("serverStatus", &result) - c.Assert(err, IsNil) - c.Assert(hostPort(result.Host), Equals, "40012") - - session.Refresh() - session.SelectServers(bson.D{{"rs1", "c"}}) - err = session.Run("serverStatus", &result) - c.Assert(err, IsNil) - c.Assert(hostPort(result.Host), Equals, "40013") -} - -func (s *S) TestSelectServersWithMongos(c *C) { - if !s.versionAtLeast(2, 2) { - c.Skip("read preferences introduced in 2.2") - } - - session, err := mgo.Dial("localhost:40021") - c.Assert(err, IsNil) - defer session.Close() - - ssresult := &struct{ Host string }{} - imresult := &struct{ IsMaster bool }{} - - // Figure the master while still using the strong session. - err = session.Run("serverStatus", ssresult) - c.Assert(err, IsNil) - err = session.Run("isMaster", imresult) - c.Assert(err, IsNil) - master := ssresult.Host - c.Assert(imresult.IsMaster, Equals, true, Commentf("%s is not the master", master)) - - var slave1, slave2 string - switch hostPort(master) { - case "40021": - slave1, slave2 = "b", "c" - case "40022": - slave1, slave2 = "a", "c" - case "40023": - slave1, slave2 = "a", "b" - } - - // Collect op counters for everyone. - opc21a, err := getOpCounters("localhost:40021") - c.Assert(err, IsNil) - opc22a, err := getOpCounters("localhost:40022") - c.Assert(err, IsNil) - opc23a, err := getOpCounters("localhost:40023") - c.Assert(err, IsNil) - - // Do a SlaveOk query through MongoS - mongos, err := mgo.Dial("localhost:40202") - c.Assert(err, IsNil) - defer mongos.Close() - - mongos.SetMode(mgo.Monotonic, true) - - mongos.Refresh() - mongos.SelectServers(bson.D{{"rs2", slave1}}) - coll := mongos.DB("mydb").C("mycoll") - result := &struct{}{} - for i := 0; i != 5; i++ { - err := coll.Find(nil).One(result) - c.Assert(err, Equals, mgo.ErrNotFound) - } - - mongos.Refresh() - mongos.SelectServers(bson.D{{"rs2", slave2}}) - coll = mongos.DB("mydb").C("mycoll") - for i := 0; i != 7; i++ { - err := coll.Find(nil).One(result) - c.Assert(err, Equals, mgo.ErrNotFound) - } - - // Collect op counters for everyone again. - opc21b, err := getOpCounters("localhost:40021") - c.Assert(err, IsNil) - opc22b, err := getOpCounters("localhost:40022") - c.Assert(err, IsNil) - opc23b, err := getOpCounters("localhost:40023") - c.Assert(err, IsNil) - - switch hostPort(master) { - case "40021": - c.Check(opc21b.Query-opc21a.Query, Equals, 0) - c.Check(opc22b.Query-opc22a.Query, Equals, 5) - c.Check(opc23b.Query-opc23a.Query, Equals, 7) - case "40022": - c.Check(opc21b.Query-opc21a.Query, Equals, 5) - c.Check(opc22b.Query-opc22a.Query, Equals, 0) - c.Check(opc23b.Query-opc23a.Query, Equals, 7) - case "40023": - c.Check(opc21b.Query-opc21a.Query, Equals, 5) - c.Check(opc22b.Query-opc22a.Query, Equals, 7) - c.Check(opc23b.Query-opc23a.Query, Equals, 0) - default: - c.Fatal("Uh?") - } -} diff --git a/vendor/gopkg.in/mgo.v2/doc.go b/vendor/gopkg.in/mgo.v2/doc.go deleted file mode 100644 index 9316c5554..000000000 --- a/vendor/gopkg.in/mgo.v2/doc.go +++ /dev/null @@ -1,31 +0,0 @@ -// Package mgo offers a rich MongoDB driver for Go. -// -// Details about the mgo project (pronounced as "mango") are found -// in its web page: -// -// http://labix.org/mgo -// -// Usage of the driver revolves around the concept of sessions. To -// get started, obtain a session using the Dial function: -// -// session, err := mgo.Dial(url) -// -// This will establish one or more connections with the cluster of -// servers defined by the url parameter. From then on, the cluster -// may be queried with multiple consistency rules (see SetMode) and -// documents retrieved with statements such as: -// -// c := session.DB(database).C(collection) -// err := c.Find(query).One(&result) -// -// New sessions are typically created by calling session.Copy on the -// initial session obtained at dial time. These new sessions will share -// the same cluster information and connection cache, and may be easily -// handed into other methods and functions for organizing logic. -// Every session created must have its Close method called at the end -// of its life time, so its resources may be put back in the pool or -// collected, depending on the case. -// -// For more details, see the documentation for the types and methods. -// -package mgo diff --git a/vendor/gopkg.in/mgo.v2/export_test.go b/vendor/gopkg.in/mgo.v2/export_test.go deleted file mode 100644 index 690f84d38..000000000 --- a/vendor/gopkg.in/mgo.v2/export_test.go +++ /dev/null @@ -1,33 +0,0 @@ -package mgo - -import ( - "time" -) - -func HackPingDelay(newDelay time.Duration) (restore func()) { - globalMutex.Lock() - defer globalMutex.Unlock() - - oldDelay := pingDelay - restore = func() { - globalMutex.Lock() - pingDelay = oldDelay - globalMutex.Unlock() - } - pingDelay = newDelay - return -} - -func HackSyncSocketTimeout(newTimeout time.Duration) (restore func()) { - globalMutex.Lock() - defer globalMutex.Unlock() - - oldTimeout := syncSocketTimeout - restore = func() { - globalMutex.Lock() - syncSocketTimeout = oldTimeout - globalMutex.Unlock() - } - syncSocketTimeout = newTimeout - return -} diff --git a/vendor/gopkg.in/mgo.v2/gridfs.go b/vendor/gopkg.in/mgo.v2/gridfs.go deleted file mode 100644 index 54b3dd50e..000000000 --- a/vendor/gopkg.in/mgo.v2/gridfs.go +++ /dev/null @@ -1,755 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// 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 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 mgo - -import ( - "crypto/md5" - "encoding/hex" - "errors" - "hash" - "io" - "os" - "sync" - "time" - - "gopkg.in/mgo.v2/bson" -) - -type GridFS struct { - Files *Collection - Chunks *Collection -} - -type gfsFileMode int - -const ( - gfsClosed gfsFileMode = 0 - gfsReading gfsFileMode = 1 - gfsWriting gfsFileMode = 2 -) - -type GridFile struct { - m sync.Mutex - c sync.Cond - gfs *GridFS - mode gfsFileMode - err error - - chunk int - offset int64 - - wpending int - wbuf []byte - wsum hash.Hash - - rbuf []byte - rcache *gfsCachedChunk - - doc gfsFile -} - -type gfsFile struct { - Id interface{} "_id" - ChunkSize int "chunkSize" - UploadDate time.Time "uploadDate" - Length int64 ",minsize" - MD5 string - Filename string ",omitempty" - ContentType string "contentType,omitempty" - Metadata *bson.Raw ",omitempty" -} - -type gfsChunk struct { - Id interface{} "_id" - FilesId interface{} "files_id" - N int - Data []byte -} - -type gfsCachedChunk struct { - wait sync.Mutex - n int - data []byte - err error -} - -func newGridFS(db *Database, prefix string) *GridFS { - return &GridFS{db.C(prefix + ".files"), db.C(prefix + ".chunks")} -} - -func (gfs *GridFS) newFile() *GridFile { - file := &GridFile{gfs: gfs} - file.c.L = &file.m - //runtime.SetFinalizer(file, finalizeFile) - return file -} - -func finalizeFile(file *GridFile) { - file.Close() -} - -// Create creates a new file with the provided name in the GridFS. If the file -// name already exists, a new version will be inserted with an up-to-date -// uploadDate that will cause it to be atomically visible to the Open and -// OpenId methods. If the file name is not important, an empty name may be -// provided and the file Id used instead. -// -// It's important to Close files whether they are being written to -// or read from, and to check the err result to ensure the operation -// completed successfully. -// -// A simple example inserting a new file: -// -// func check(err error) { -// if err != nil { -// panic(err.String()) -// } -// } -// file, err := db.GridFS("fs").Create("myfile.txt") -// check(err) -// n, err := file.Write([]byte("Hello world!")) -// check(err) -// err = file.Close() -// check(err) -// fmt.Printf("%d bytes written\n", n) -// -// The io.Writer interface is implemented by *GridFile and may be used to -// help on the file creation. For example: -// -// file, err := db.GridFS("fs").Create("myfile.txt") -// check(err) -// messages, err := os.Open("/var/log/messages") -// check(err) -// defer messages.Close() -// err = io.Copy(file, messages) -// check(err) -// err = file.Close() -// check(err) -// -func (gfs *GridFS) Create(name string) (file *GridFile, err error) { - file = gfs.newFile() - file.mode = gfsWriting - file.wsum = md5.New() - file.doc = gfsFile{Id: bson.NewObjectId(), ChunkSize: 255 * 1024, Filename: name} - return -} - -// OpenId returns the file with the provided id, for reading. -// If the file isn't found, err will be set to mgo.ErrNotFound. -// -// It's important to Close files whether they are being written to -// or read from, and to check the err result to ensure the operation -// completed successfully. -// -// The following example will print the first 8192 bytes from the file: -// -// func check(err error) { -// if err != nil { -// panic(err.String()) -// } -// } -// file, err := db.GridFS("fs").OpenId(objid) -// check(err) -// b := make([]byte, 8192) -// n, err := file.Read(b) -// check(err) -// fmt.Println(string(b)) -// check(err) -// err = file.Close() -// check(err) -// fmt.Printf("%d bytes read\n", n) -// -// The io.Reader interface is implemented by *GridFile and may be used to -// deal with it. As an example, the following snippet will dump the whole -// file into the standard output: -// -// file, err := db.GridFS("fs").OpenId(objid) -// check(err) -// err = io.Copy(os.Stdout, file) -// check(err) -// err = file.Close() -// check(err) -// -func (gfs *GridFS) OpenId(id interface{}) (file *GridFile, err error) { - var doc gfsFile - err = gfs.Files.Find(bson.M{"_id": id}).One(&doc) - if err != nil { - return - } - file = gfs.newFile() - file.mode = gfsReading - file.doc = doc - return -} - -// Open returns the most recently uploaded file with the provided -// name, for reading. If the file isn't found, err will be set -// to mgo.ErrNotFound. -// -// It's important to Close files whether they are being written to -// or read from, and to check the err result to ensure the operation -// completed successfully. -// -// The following example will print the first 8192 bytes from the file: -// -// file, err := db.GridFS("fs").Open("myfile.txt") -// check(err) -// b := make([]byte, 8192) -// n, err := file.Read(b) -// check(err) -// fmt.Println(string(b)) -// check(err) -// err = file.Close() -// check(err) -// fmt.Printf("%d bytes read\n", n) -// -// The io.Reader interface is implemented by *GridFile and may be used to -// deal with it. As an example, the following snippet will dump the whole -// file into the standard output: -// -// file, err := db.GridFS("fs").Open("myfile.txt") -// check(err) -// err = io.Copy(os.Stdout, file) -// check(err) -// err = file.Close() -// check(err) -// -func (gfs *GridFS) Open(name string) (file *GridFile, err error) { - var doc gfsFile - err = gfs.Files.Find(bson.M{"filename": name}).Sort("-uploadDate").One(&doc) - if err != nil { - return - } - file = gfs.newFile() - file.mode = gfsReading - file.doc = doc - return -} - -// OpenNext opens the next file from iter for reading, sets *file to it, -// and returns true on the success case. If no more documents are available -// on iter or an error occurred, *file is set to nil and the result is false. -// Errors will be available via iter.Err(). -// -// The iter parameter must be an iterator on the GridFS files collection. -// Using the GridFS.Find method is an easy way to obtain such an iterator, -// but any iterator on the collection will work. -// -// If the provided *file is non-nil, OpenNext will close it before attempting -// to iterate to the next element. This means that in a loop one only -// has to worry about closing files when breaking out of the loop early -// (break, return, or panic). -// -// For example: -// -// gfs := db.GridFS("fs") -// query := gfs.Find(nil).Sort("filename") -// iter := query.Iter() -// var f *mgo.GridFile -// for gfs.OpenNext(iter, &f) { -// fmt.Printf("Filename: %s\n", f.Name()) -// } -// if iter.Close() != nil { -// panic(iter.Close()) -// } -// -func (gfs *GridFS) OpenNext(iter *Iter, file **GridFile) bool { - if *file != nil { - // Ignoring the error here shouldn't be a big deal - // as we're reading the file and the loop iteration - // for this file is finished. - _ = (*file).Close() - } - var doc gfsFile - if !iter.Next(&doc) { - *file = nil - return false - } - f := gfs.newFile() - f.mode = gfsReading - f.doc = doc - *file = f - return true -} - -// Find runs query on GridFS's files collection and returns -// the resulting Query. -// -// This logic: -// -// gfs := db.GridFS("fs") -// iter := gfs.Find(nil).Iter() -// -// Is equivalent to: -// -// files := db.C("fs" + ".files") -// iter := files.Find(nil).Iter() -// -func (gfs *GridFS) Find(query interface{}) *Query { - return gfs.Files.Find(query) -} - -// RemoveId deletes the file with the provided id from the GridFS. -func (gfs *GridFS) RemoveId(id interface{}) error { - err := gfs.Files.Remove(bson.M{"_id": id}) - if err != nil { - return err - } - _, err = gfs.Chunks.RemoveAll(bson.D{{"files_id", id}}) - return err -} - -type gfsDocId struct { - Id interface{} "_id" -} - -// Remove deletes all files with the provided name from the GridFS. -func (gfs *GridFS) Remove(name string) (err error) { - iter := gfs.Files.Find(bson.M{"filename": name}).Select(bson.M{"_id": 1}).Iter() - var doc gfsDocId - for iter.Next(&doc) { - if e := gfs.RemoveId(doc.Id); e != nil { - err = e - } - } - if err == nil { - err = iter.Close() - } - return err -} - -func (file *GridFile) assertMode(mode gfsFileMode) { - switch file.mode { - case mode: - return - case gfsWriting: - panic("GridFile is open for writing") - case gfsReading: - panic("GridFile is open for reading") - case gfsClosed: - panic("GridFile is closed") - default: - panic("internal error: missing GridFile mode") - } -} - -// SetChunkSize sets size of saved chunks. Once the file is written to, it -// will be split in blocks of that size and each block saved into an -// independent chunk document. The default chunk size is 256kb. -// -// It is a runtime error to call this function once the file has started -// being written to. -func (file *GridFile) SetChunkSize(bytes int) { - file.assertMode(gfsWriting) - debugf("GridFile %p: setting chunk size to %d", file, bytes) - file.m.Lock() - file.doc.ChunkSize = bytes - file.m.Unlock() -} - -// Id returns the current file Id. -func (file *GridFile) Id() interface{} { - return file.doc.Id -} - -// SetId changes the current file Id. -// -// It is a runtime error to call this function once the file has started -// being written to, or when the file is not open for writing. -func (file *GridFile) SetId(id interface{}) { - file.assertMode(gfsWriting) - file.m.Lock() - file.doc.Id = id - file.m.Unlock() -} - -// Name returns the optional file name. An empty string will be returned -// in case it is unset. -func (file *GridFile) Name() string { - return file.doc.Filename -} - -// SetName changes the optional file name. An empty string may be used to -// unset it. -// -// It is a runtime error to call this function when the file is not open -// for writing. -func (file *GridFile) SetName(name string) { - file.assertMode(gfsWriting) - file.m.Lock() - file.doc.Filename = name - file.m.Unlock() -} - -// ContentType returns the optional file content type. An empty string will be -// returned in case it is unset. -func (file *GridFile) ContentType() string { - return file.doc.ContentType -} - -// ContentType changes the optional file content type. An empty string may be -// used to unset it. -// -// It is a runtime error to call this function when the file is not open -// for writing. -func (file *GridFile) SetContentType(ctype string) { - file.assertMode(gfsWriting) - file.m.Lock() - file.doc.ContentType = ctype - file.m.Unlock() -} - -// GetMeta unmarshals the optional "metadata" field associated with the -// file into the result parameter. The meaning of keys under that field -// is user-defined. For example: -// -// result := struct{ INode int }{} -// err = file.GetMeta(&result) -// if err != nil { -// panic(err.String()) -// } -// fmt.Printf("inode: %d\n", result.INode) -// -func (file *GridFile) GetMeta(result interface{}) (err error) { - file.m.Lock() - if file.doc.Metadata != nil { - err = bson.Unmarshal(file.doc.Metadata.Data, result) - } - file.m.Unlock() - return -} - -// SetMeta changes the optional "metadata" field associated with the -// file. The meaning of keys under that field is user-defined. -// For example: -// -// file.SetMeta(bson.M{"inode": inode}) -// -// It is a runtime error to call this function when the file is not open -// for writing. -func (file *GridFile) SetMeta(metadata interface{}) { - file.assertMode(gfsWriting) - data, err := bson.Marshal(metadata) - file.m.Lock() - if err != nil && file.err == nil { - file.err = err - } else { - file.doc.Metadata = &bson.Raw{Data: data} - } - file.m.Unlock() -} - -// Size returns the file size in bytes. -func (file *GridFile) Size() (bytes int64) { - file.m.Lock() - bytes = file.doc.Length - file.m.Unlock() - return -} - -// MD5 returns the file MD5 as a hex-encoded string. -func (file *GridFile) MD5() (md5 string) { - return file.doc.MD5 -} - -// UploadDate returns the file upload time. -func (file *GridFile) UploadDate() time.Time { - return file.doc.UploadDate -} - -// SetUploadDate changes the file upload time. -// -// It is a runtime error to call this function when the file is not open -// for writing. -func (file *GridFile) SetUploadDate(t time.Time) { - file.assertMode(gfsWriting) - file.m.Lock() - file.doc.UploadDate = t - file.m.Unlock() -} - -// Close flushes any pending changes in case the file is being written -// to, waits for any background operations to finish, and closes the file. -// -// It's important to Close files whether they are being written to -// or read from, and to check the err result to ensure the operation -// completed successfully. -func (file *GridFile) Close() (err error) { - file.m.Lock() - defer file.m.Unlock() - if file.mode == gfsWriting { - if len(file.wbuf) > 0 && file.err == nil { - file.insertChunk(file.wbuf) - file.wbuf = file.wbuf[0:0] - } - file.completeWrite() - } else if file.mode == gfsReading && file.rcache != nil { - file.rcache.wait.Lock() - file.rcache = nil - } - file.mode = gfsClosed - debugf("GridFile %p: closed", file) - return file.err -} - -func (file *GridFile) completeWrite() { - for file.wpending > 0 { - debugf("GridFile %p: waiting for %d pending chunks to complete file write", file, file.wpending) - file.c.Wait() - } - if file.err == nil { - hexsum := hex.EncodeToString(file.wsum.Sum(nil)) - if file.doc.UploadDate.IsZero() { - file.doc.UploadDate = bson.Now() - } - file.doc.MD5 = hexsum - file.err = file.gfs.Files.Insert(file.doc) - file.gfs.Chunks.EnsureIndexKey("files_id", "n") - } - if file.err != nil { - file.gfs.Chunks.RemoveAll(bson.D{{"files_id", file.doc.Id}}) - } -} - -// Abort cancels an in-progress write, preventing the file from being -// automically created and ensuring previously written chunks are -// removed when the file is closed. -// -// It is a runtime error to call Abort when the file was not opened -// for writing. -func (file *GridFile) Abort() { - if file.mode != gfsWriting { - panic("file.Abort must be called on file opened for writing") - } - file.err = errors.New("write aborted") -} - -// Write writes the provided data to the file and returns the -// number of bytes written and an error in case something -// wrong happened. -// -// The file will internally cache the data so that all but the last -// chunk sent to the database have the size defined by SetChunkSize. -// This also means that errors may be deferred until a future call -// to Write or Close. -// -// The parameters and behavior of this function turn the file -// into an io.Writer. -func (file *GridFile) Write(data []byte) (n int, err error) { - file.assertMode(gfsWriting) - file.m.Lock() - debugf("GridFile %p: writing %d bytes", file, len(data)) - defer file.m.Unlock() - - if file.err != nil { - return 0, file.err - } - - n = len(data) - file.doc.Length += int64(n) - chunkSize := file.doc.ChunkSize - - if len(file.wbuf)+len(data) < chunkSize { - file.wbuf = append(file.wbuf, data...) - return - } - - // First, flush file.wbuf complementing with data. - if len(file.wbuf) > 0 { - missing := chunkSize - len(file.wbuf) - if missing > len(data) { - missing = len(data) - } - file.wbuf = append(file.wbuf, data[:missing]...) - data = data[missing:] - file.insertChunk(file.wbuf) - file.wbuf = file.wbuf[0:0] - } - - // Then, flush all chunks from data without copying. - for len(data) > chunkSize { - size := chunkSize - if size > len(data) { - size = len(data) - } - file.insertChunk(data[:size]) - data = data[size:] - } - - // And append the rest for a future call. - file.wbuf = append(file.wbuf, data...) - - return n, file.err -} - -func (file *GridFile) insertChunk(data []byte) { - n := file.chunk - file.chunk++ - debugf("GridFile %p: adding to checksum: %q", file, string(data)) - file.wsum.Write(data) - - for file.doc.ChunkSize*file.wpending >= 1024*1024 { - // Hold on.. we got a MB pending. - file.c.Wait() - if file.err != nil { - return - } - } - - file.wpending++ - - debugf("GridFile %p: inserting chunk %d with %d bytes", file, n, len(data)) - - // We may not own the memory of data, so rather than - // simply copying it, we'll marshal the document ahead of time. - data, err := bson.Marshal(gfsChunk{bson.NewObjectId(), file.doc.Id, n, data}) - if err != nil { - file.err = err - return - } - - go func() { - err := file.gfs.Chunks.Insert(bson.Raw{Data: data}) - file.m.Lock() - file.wpending-- - if err != nil && file.err == nil { - file.err = err - } - file.c.Broadcast() - file.m.Unlock() - }() -} - -// Seek sets the offset for the next Read or Write on file to -// offset, interpreted according to whence: 0 means relative to -// the origin of the file, 1 means relative to the current offset, -// and 2 means relative to the end. It returns the new offset and -// an error, if any. -func (file *GridFile) Seek(offset int64, whence int) (pos int64, err error) { - file.m.Lock() - debugf("GridFile %p: seeking for %s (whence=%d)", file, offset, whence) - defer file.m.Unlock() - switch whence { - case os.SEEK_SET: - case os.SEEK_CUR: - offset += file.offset - case os.SEEK_END: - offset += file.doc.Length - default: - panic("unsupported whence value") - } - if offset > file.doc.Length { - return file.offset, errors.New("seek past end of file") - } - if offset == file.doc.Length { - // If we're seeking to the end of the file, - // no need to read anything. This enables - // a client to find the size of the file using only the - // io.ReadSeeker interface with low overhead. - file.offset = offset - return file.offset, nil - } - chunk := int(offset / int64(file.doc.ChunkSize)) - if chunk+1 == file.chunk && offset >= file.offset { - file.rbuf = file.rbuf[int(offset-file.offset):] - file.offset = offset - return file.offset, nil - } - file.offset = offset - file.chunk = chunk - file.rbuf = nil - file.rbuf, err = file.getChunk() - if err == nil { - file.rbuf = file.rbuf[int(file.offset-int64(chunk)*int64(file.doc.ChunkSize)):] - } - return file.offset, err -} - -// Read reads into b the next available data from the file and -// returns the number of bytes written and an error in case -// something wrong happened. At the end of the file, n will -// be zero and err will be set to os.EOF. -// -// The parameters and behavior of this function turn the file -// into an io.Reader. -func (file *GridFile) Read(b []byte) (n int, err error) { - file.assertMode(gfsReading) - file.m.Lock() - debugf("GridFile %p: reading at offset %d into buffer of length %d", file, file.offset, len(b)) - defer file.m.Unlock() - if file.offset == file.doc.Length { - return 0, io.EOF - } - for err == nil { - i := copy(b, file.rbuf) - n += i - file.offset += int64(i) - file.rbuf = file.rbuf[i:] - if i == len(b) || file.offset == file.doc.Length { - break - } - b = b[i:] - file.rbuf, err = file.getChunk() - } - return n, err -} - -func (file *GridFile) getChunk() (data []byte, err error) { - cache := file.rcache - file.rcache = nil - if cache != nil && cache.n == file.chunk { - debugf("GridFile %p: Getting chunk %d from cache", file, file.chunk) - cache.wait.Lock() - data, err = cache.data, cache.err - } else { - debugf("GridFile %p: Fetching chunk %d", file, file.chunk) - var doc gfsChunk - err = file.gfs.Chunks.Find(bson.D{{"files_id", file.doc.Id}, {"n", file.chunk}}).One(&doc) - data = doc.Data - } - file.chunk++ - if int64(file.chunk)*int64(file.doc.ChunkSize) < file.doc.Length { - // Read the next one in background. - cache = &gfsCachedChunk{n: file.chunk} - cache.wait.Lock() - debugf("GridFile %p: Scheduling chunk %d for background caching", file, file.chunk) - // Clone the session to avoid having it closed in between. - chunks := file.gfs.Chunks - session := chunks.Database.Session.Clone() - go func(id interface{}, n int) { - defer session.Close() - chunks = chunks.With(session) - var doc gfsChunk - cache.err = chunks.Find(bson.D{{"files_id", id}, {"n", n}}).One(&doc) - cache.data = doc.Data - cache.wait.Unlock() - }(file.doc.Id, file.chunk) - file.rcache = cache - } - debugf("Returning err: %#v", err) - return -} diff --git a/vendor/gopkg.in/mgo.v2/gridfs_test.go b/vendor/gopkg.in/mgo.v2/gridfs_test.go deleted file mode 100644 index 5a6ed5559..000000000 --- a/vendor/gopkg.in/mgo.v2/gridfs_test.go +++ /dev/null @@ -1,708 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// 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 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 mgo_test - -import ( - "io" - "os" - "time" - - . "gopkg.in/check.v1" - "gopkg.in/mgo.v2" - "gopkg.in/mgo.v2/bson" -) - -func (s *S) TestGridFSCreate(c *C) { - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - db := session.DB("mydb") - - before := bson.Now() - - gfs := db.GridFS("fs") - file, err := gfs.Create("") - c.Assert(err, IsNil) - - n, err := file.Write([]byte("some data")) - c.Assert(err, IsNil) - c.Assert(n, Equals, 9) - - err = file.Close() - c.Assert(err, IsNil) - - after := bson.Now() - - // Check the file information. - result := M{} - err = db.C("fs.files").Find(nil).One(result) - c.Assert(err, IsNil) - - fileId, ok := result["_id"].(bson.ObjectId) - c.Assert(ok, Equals, true) - c.Assert(fileId.Valid(), Equals, true) - result["_id"] = "" - - ud, ok := result["uploadDate"].(time.Time) - c.Assert(ok, Equals, true) - c.Assert(ud.After(before) && ud.Before(after), Equals, true) - result["uploadDate"] = "" - - expected := M{ - "_id": "", - "length": 9, - "chunkSize": 255 * 1024, - "uploadDate": "", - "md5": "1e50210a0202497fb79bc38b6ade6c34", - } - c.Assert(result, DeepEquals, expected) - - // Check the chunk. - result = M{} - err = db.C("fs.chunks").Find(nil).One(result) - c.Assert(err, IsNil) - - chunkId, ok := result["_id"].(bson.ObjectId) - c.Assert(ok, Equals, true) - c.Assert(chunkId.Valid(), Equals, true) - result["_id"] = "" - - expected = M{ - "_id": "", - "files_id": fileId, - "n": 0, - "data": []byte("some data"), - } - c.Assert(result, DeepEquals, expected) - - // Check that an index was created. - indexes, err := db.C("fs.chunks").Indexes() - c.Assert(err, IsNil) - c.Assert(len(indexes), Equals, 2) - c.Assert(indexes[1].Key, DeepEquals, []string{"files_id", "n"}) -} - -func (s *S) TestGridFSFileDetails(c *C) { - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - db := session.DB("mydb") - - gfs := db.GridFS("fs") - - file, err := gfs.Create("myfile1.txt") - c.Assert(err, IsNil) - - n, err := file.Write([]byte("some")) - c.Assert(err, IsNil) - c.Assert(n, Equals, 4) - - c.Assert(file.Size(), Equals, int64(4)) - - n, err = file.Write([]byte(" data")) - c.Assert(err, IsNil) - c.Assert(n, Equals, 5) - - c.Assert(file.Size(), Equals, int64(9)) - - id, _ := file.Id().(bson.ObjectId) - c.Assert(id.Valid(), Equals, true) - c.Assert(file.Name(), Equals, "myfile1.txt") - c.Assert(file.ContentType(), Equals, "") - - var info interface{} - err = file.GetMeta(&info) - c.Assert(err, IsNil) - c.Assert(info, IsNil) - - file.SetId("myid") - file.SetName("myfile2.txt") - file.SetContentType("text/plain") - file.SetMeta(M{"any": "thing"}) - - c.Assert(file.Id(), Equals, "myid") - c.Assert(file.Name(), Equals, "myfile2.txt") - c.Assert(file.ContentType(), Equals, "text/plain") - - err = file.GetMeta(&info) - c.Assert(err, IsNil) - c.Assert(info, DeepEquals, bson.M{"any": "thing"}) - - err = file.Close() - c.Assert(err, IsNil) - - c.Assert(file.MD5(), Equals, "1e50210a0202497fb79bc38b6ade6c34") - - ud := file.UploadDate() - now := time.Now() - c.Assert(ud.Before(now), Equals, true) - c.Assert(ud.After(now.Add(-3*time.Second)), Equals, true) - - result := M{} - err = db.C("fs.files").Find(nil).One(result) - c.Assert(err, IsNil) - - result["uploadDate"] = "" - - expected := M{ - "_id": "myid", - "length": 9, - "chunkSize": 255 * 1024, - "uploadDate": "", - "md5": "1e50210a0202497fb79bc38b6ade6c34", - "filename": "myfile2.txt", - "contentType": "text/plain", - "metadata": M{"any": "thing"}, - } - c.Assert(result, DeepEquals, expected) -} - -func (s *S) TestGridFSSetUploadDate(c *C) { - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - db := session.DB("mydb") - - gfs := db.GridFS("fs") - file, err := gfs.Create("") - c.Assert(err, IsNil) - - t := time.Date(2014, 1, 1, 1, 1, 1, 0, time.Local) - file.SetUploadDate(t) - - err = file.Close() - c.Assert(err, IsNil) - - // Check the file information. - result := M{} - err = db.C("fs.files").Find(nil).One(result) - c.Assert(err, IsNil) - - ud := result["uploadDate"].(time.Time) - if !ud.Equal(t) { - c.Fatalf("want upload date %s, got %s", t, ud) - } -} - -func (s *S) TestGridFSCreateWithChunking(c *C) { - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - db := session.DB("mydb") - - gfs := db.GridFS("fs") - - file, err := gfs.Create("") - c.Assert(err, IsNil) - - file.SetChunkSize(5) - - // Smaller than the chunk size. - n, err := file.Write([]byte("abc")) - c.Assert(err, IsNil) - c.Assert(n, Equals, 3) - - // Boundary in the middle. - n, err = file.Write([]byte("defg")) - c.Assert(err, IsNil) - c.Assert(n, Equals, 4) - - // Boundary at the end. - n, err = file.Write([]byte("hij")) - c.Assert(err, IsNil) - c.Assert(n, Equals, 3) - - // Larger than the chunk size, with 3 chunks. - n, err = file.Write([]byte("klmnopqrstuv")) - c.Assert(err, IsNil) - c.Assert(n, Equals, 12) - - err = file.Close() - c.Assert(err, IsNil) - - // Check the file information. - result := M{} - err = db.C("fs.files").Find(nil).One(result) - c.Assert(err, IsNil) - - fileId, _ := result["_id"].(bson.ObjectId) - c.Assert(fileId.Valid(), Equals, true) - result["_id"] = "" - result["uploadDate"] = "" - - expected := M{ - "_id": "", - "length": 22, - "chunkSize": 5, - "uploadDate": "", - "md5": "44a66044834cbe55040089cabfc102d5", - } - c.Assert(result, DeepEquals, expected) - - // Check the chunks. - iter := db.C("fs.chunks").Find(nil).Sort("n").Iter() - dataChunks := []string{"abcde", "fghij", "klmno", "pqrst", "uv"} - for i := 0; ; i++ { - result = M{} - if !iter.Next(result) { - if i != 5 { - c.Fatalf("Expected 5 chunks, got %d", i) - } - break - } - c.Assert(iter.Close(), IsNil) - - result["_id"] = "" - - expected = M{ - "_id": "", - "files_id": fileId, - "n": i, - "data": []byte(dataChunks[i]), - } - c.Assert(result, DeepEquals, expected) - } -} - -func (s *S) TestGridFSAbort(c *C) { - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - db := session.DB("mydb") - - gfs := db.GridFS("fs") - file, err := gfs.Create("") - c.Assert(err, IsNil) - - file.SetChunkSize(5) - - n, err := file.Write([]byte("some data")) - c.Assert(err, IsNil) - c.Assert(n, Equals, 9) - - var count int - for i := 0; i < 10; i++ { - count, err = db.C("fs.chunks").Count() - if count > 0 || err != nil { - break - } - } - c.Assert(err, IsNil) - c.Assert(count, Equals, 1) - - file.Abort() - - err = file.Close() - c.Assert(err, ErrorMatches, "write aborted") - - count, err = db.C("fs.chunks").Count() - c.Assert(err, IsNil) - c.Assert(count, Equals, 0) -} - -func (s *S) TestGridFSCloseConflict(c *C) { - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - db := session.DB("mydb") - - db.C("fs.files").EnsureIndex(mgo.Index{Key: []string{"filename"}, Unique: true}) - - // For a closing-time conflict - err = db.C("fs.files").Insert(M{"filename": "foo.txt"}) - c.Assert(err, IsNil) - - gfs := db.GridFS("fs") - file, err := gfs.Create("foo.txt") - c.Assert(err, IsNil) - - _, err = file.Write([]byte("some data")) - c.Assert(err, IsNil) - - err = file.Close() - c.Assert(mgo.IsDup(err), Equals, true) - - count, err := db.C("fs.chunks").Count() - c.Assert(err, IsNil) - c.Assert(count, Equals, 0) -} - -func (s *S) TestGridFSOpenNotFound(c *C) { - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - db := session.DB("mydb") - - gfs := db.GridFS("fs") - file, err := gfs.OpenId("non-existent") - c.Assert(err == mgo.ErrNotFound, Equals, true) - c.Assert(file, IsNil) - - file, err = gfs.Open("non-existent") - c.Assert(err == mgo.ErrNotFound, Equals, true) - c.Assert(file, IsNil) -} - -func (s *S) TestGridFSReadAll(c *C) { - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - db := session.DB("mydb") - - gfs := db.GridFS("fs") - file, err := gfs.Create("") - c.Assert(err, IsNil) - id := file.Id() - - file.SetChunkSize(5) - - n, err := file.Write([]byte("abcdefghijklmnopqrstuv")) - c.Assert(err, IsNil) - c.Assert(n, Equals, 22) - - err = file.Close() - c.Assert(err, IsNil) - - file, err = gfs.OpenId(id) - c.Assert(err, IsNil) - - b := make([]byte, 30) - n, err = file.Read(b) - c.Assert(n, Equals, 22) - c.Assert(err, IsNil) - - n, err = file.Read(b) - c.Assert(n, Equals, 0) - c.Assert(err == io.EOF, Equals, true) - - err = file.Close() - c.Assert(err, IsNil) -} - -func (s *S) TestGridFSReadChunking(c *C) { - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - db := session.DB("mydb") - - gfs := db.GridFS("fs") - - file, err := gfs.Create("") - c.Assert(err, IsNil) - - id := file.Id() - - file.SetChunkSize(5) - - n, err := file.Write([]byte("abcdefghijklmnopqrstuv")) - c.Assert(err, IsNil) - c.Assert(n, Equals, 22) - - err = file.Close() - c.Assert(err, IsNil) - - file, err = gfs.OpenId(id) - c.Assert(err, IsNil) - - b := make([]byte, 30) - - // Smaller than the chunk size. - n, err = file.Read(b[:3]) - c.Assert(err, IsNil) - c.Assert(n, Equals, 3) - c.Assert(b[:3], DeepEquals, []byte("abc")) - - // Boundary in the middle. - n, err = file.Read(b[:4]) - c.Assert(err, IsNil) - c.Assert(n, Equals, 4) - c.Assert(b[:4], DeepEquals, []byte("defg")) - - // Boundary at the end. - n, err = file.Read(b[:3]) - c.Assert(err, IsNil) - c.Assert(n, Equals, 3) - c.Assert(b[:3], DeepEquals, []byte("hij")) - - // Larger than the chunk size, with 3 chunks. - n, err = file.Read(b) - c.Assert(err, IsNil) - c.Assert(n, Equals, 12) - c.Assert(b[:12], DeepEquals, []byte("klmnopqrstuv")) - - n, err = file.Read(b) - c.Assert(n, Equals, 0) - c.Assert(err == io.EOF, Equals, true) - - err = file.Close() - c.Assert(err, IsNil) -} - -func (s *S) TestGridFSOpen(c *C) { - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - db := session.DB("mydb") - - gfs := db.GridFS("fs") - - file, err := gfs.Create("myfile.txt") - c.Assert(err, IsNil) - file.Write([]byte{'1'}) - file.Close() - - file, err = gfs.Create("myfile.txt") - c.Assert(err, IsNil) - file.Write([]byte{'2'}) - file.Close() - - file, err = gfs.Open("myfile.txt") - c.Assert(err, IsNil) - defer file.Close() - - var b [1]byte - - _, err = file.Read(b[:]) - c.Assert(err, IsNil) - c.Assert(string(b[:]), Equals, "2") -} - -func (s *S) TestGridFSSeek(c *C) { - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - db := session.DB("mydb") - - gfs := db.GridFS("fs") - file, err := gfs.Create("") - c.Assert(err, IsNil) - id := file.Id() - - file.SetChunkSize(5) - - n, err := file.Write([]byte("abcdefghijklmnopqrstuv")) - c.Assert(err, IsNil) - c.Assert(n, Equals, 22) - - err = file.Close() - c.Assert(err, IsNil) - - b := make([]byte, 5) - - file, err = gfs.OpenId(id) - c.Assert(err, IsNil) - - o, err := file.Seek(3, os.SEEK_SET) - c.Assert(err, IsNil) - c.Assert(o, Equals, int64(3)) - _, err = file.Read(b) - c.Assert(err, IsNil) - c.Assert(b, DeepEquals, []byte("defgh")) - - o, err = file.Seek(5, os.SEEK_CUR) - c.Assert(err, IsNil) - c.Assert(o, Equals, int64(13)) - _, err = file.Read(b) - c.Assert(err, IsNil) - c.Assert(b, DeepEquals, []byte("nopqr")) - - o, err = file.Seek(0, os.SEEK_END) - c.Assert(err, IsNil) - c.Assert(o, Equals, int64(22)) - n, err = file.Read(b) - c.Assert(err, Equals, io.EOF) - c.Assert(n, Equals, 0) - - o, err = file.Seek(-10, os.SEEK_END) - c.Assert(err, IsNil) - c.Assert(o, Equals, int64(12)) - _, err = file.Read(b) - c.Assert(err, IsNil) - c.Assert(b, DeepEquals, []byte("mnopq")) - - o, err = file.Seek(8, os.SEEK_SET) - c.Assert(err, IsNil) - c.Assert(o, Equals, int64(8)) - _, err = file.Read(b) - c.Assert(err, IsNil) - c.Assert(b, DeepEquals, []byte("ijklm")) - - // Trivial seek forward within same chunk. Already - // got the data, shouldn't touch the database. - sent := mgo.GetStats().SentOps - o, err = file.Seek(1, os.SEEK_CUR) - c.Assert(err, IsNil) - c.Assert(o, Equals, int64(14)) - c.Assert(mgo.GetStats().SentOps, Equals, sent) - _, err = file.Read(b) - c.Assert(err, IsNil) - c.Assert(b, DeepEquals, []byte("opqrs")) - - // Try seeking past end of file. - file.Seek(3, os.SEEK_SET) - o, err = file.Seek(23, os.SEEK_SET) - c.Assert(err, ErrorMatches, "seek past end of file") - c.Assert(o, Equals, int64(3)) -} - -func (s *S) TestGridFSRemoveId(c *C) { - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - db := session.DB("mydb") - - gfs := db.GridFS("fs") - - file, err := gfs.Create("myfile.txt") - c.Assert(err, IsNil) - file.Write([]byte{'1'}) - file.Close() - - file, err = gfs.Create("myfile.txt") - c.Assert(err, IsNil) - file.Write([]byte{'2'}) - id := file.Id() - file.Close() - - err = gfs.RemoveId(id) - c.Assert(err, IsNil) - - file, err = gfs.Open("myfile.txt") - c.Assert(err, IsNil) - defer file.Close() - - var b [1]byte - - _, err = file.Read(b[:]) - c.Assert(err, IsNil) - c.Assert(string(b[:]), Equals, "1") - - n, err := db.C("fs.chunks").Find(M{"files_id": id}).Count() - c.Assert(err, IsNil) - c.Assert(n, Equals, 0) -} - -func (s *S) TestGridFSRemove(c *C) { - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - db := session.DB("mydb") - - gfs := db.GridFS("fs") - - file, err := gfs.Create("myfile.txt") - c.Assert(err, IsNil) - file.Write([]byte{'1'}) - file.Close() - - file, err = gfs.Create("myfile.txt") - c.Assert(err, IsNil) - file.Write([]byte{'2'}) - file.Close() - - err = gfs.Remove("myfile.txt") - c.Assert(err, IsNil) - - _, err = gfs.Open("myfile.txt") - c.Assert(err == mgo.ErrNotFound, Equals, true) - - n, err := db.C("fs.chunks").Find(nil).Count() - c.Assert(err, IsNil) - c.Assert(n, Equals, 0) -} - -func (s *S) TestGridFSOpenNext(c *C) { - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - db := session.DB("mydb") - - gfs := db.GridFS("fs") - - file, err := gfs.Create("myfile1.txt") - c.Assert(err, IsNil) - file.Write([]byte{'1'}) - file.Close() - - file, err = gfs.Create("myfile2.txt") - c.Assert(err, IsNil) - file.Write([]byte{'2'}) - file.Close() - - var f *mgo.GridFile - var b [1]byte - - iter := gfs.Find(nil).Sort("-filename").Iter() - - ok := gfs.OpenNext(iter, &f) - c.Assert(ok, Equals, true) - c.Check(f.Name(), Equals, "myfile2.txt") - - _, err = f.Read(b[:]) - c.Assert(err, IsNil) - c.Assert(string(b[:]), Equals, "2") - - ok = gfs.OpenNext(iter, &f) - c.Assert(ok, Equals, true) - c.Check(f.Name(), Equals, "myfile1.txt") - - _, err = f.Read(b[:]) - c.Assert(err, IsNil) - c.Assert(string(b[:]), Equals, "1") - - ok = gfs.OpenNext(iter, &f) - c.Assert(ok, Equals, false) - c.Assert(iter.Close(), IsNil) - c.Assert(f, IsNil) - - // Do it again with a more restrictive query to make sure - // it's actually taken into account. - iter = gfs.Find(bson.M{"filename": "myfile1.txt"}).Iter() - - ok = gfs.OpenNext(iter, &f) - c.Assert(ok, Equals, true) - c.Check(f.Name(), Equals, "myfile1.txt") - - ok = gfs.OpenNext(iter, &f) - c.Assert(ok, Equals, false) - c.Assert(iter.Close(), IsNil) - c.Assert(f, IsNil) -} diff --git a/vendor/gopkg.in/mgo.v2/internal/sasl/sasl.c b/vendor/gopkg.in/mgo.v2/internal/sasl/sasl.c deleted file mode 100644 index 8be0bc459..000000000 --- a/vendor/gopkg.in/mgo.v2/internal/sasl/sasl.c +++ /dev/null @@ -1,77 +0,0 @@ -// +build !windows - -#include -#include -#include -#include - -static int mgo_sasl_simple(void *context, int id, const char **result, unsigned int *len) -{ - if (!result) { - return SASL_BADPARAM; - } - switch (id) { - case SASL_CB_USER: - *result = (char *)context; - break; - case SASL_CB_AUTHNAME: - *result = (char *)context; - break; - case SASL_CB_LANGUAGE: - *result = NULL; - break; - default: - return SASL_BADPARAM; - } - if (len) { - *len = *result ? strlen(*result) : 0; - } - return SASL_OK; -} - -typedef int (*callback)(void); - -static int mgo_sasl_secret(sasl_conn_t *conn, void *context, int id, sasl_secret_t **result) -{ - if (!conn || !result || id != SASL_CB_PASS) { - return SASL_BADPARAM; - } - *result = (sasl_secret_t *)context; - return SASL_OK; -} - -sasl_callback_t *mgo_sasl_callbacks(const char *username, const char *password) -{ - sasl_callback_t *cb = malloc(4 * sizeof(sasl_callback_t)); - int n = 0; - - size_t len = strlen(password); - sasl_secret_t *secret = (sasl_secret_t*)malloc(sizeof(sasl_secret_t) + len); - if (!secret) { - free(cb); - return NULL; - } - strcpy((char *)secret->data, password); - secret->len = len; - - cb[n].id = SASL_CB_PASS; - cb[n].proc = (callback)&mgo_sasl_secret; - cb[n].context = secret; - n++; - - cb[n].id = SASL_CB_USER; - cb[n].proc = (callback)&mgo_sasl_simple; - cb[n].context = (char*)username; - n++; - - cb[n].id = SASL_CB_AUTHNAME; - cb[n].proc = (callback)&mgo_sasl_simple; - cb[n].context = (char*)username; - n++; - - cb[n].id = SASL_CB_LIST_END; - cb[n].proc = NULL; - cb[n].context = NULL; - - return cb; -} diff --git a/vendor/gopkg.in/mgo.v2/internal/sasl/sasl.go b/vendor/gopkg.in/mgo.v2/internal/sasl/sasl.go deleted file mode 100644 index 8375dddf8..000000000 --- a/vendor/gopkg.in/mgo.v2/internal/sasl/sasl.go +++ /dev/null @@ -1,138 +0,0 @@ -// Package sasl is an implementation detail of the mgo package. -// -// This package is not meant to be used by itself. -// - -// +build !windows - -package sasl - -// #cgo LDFLAGS: -lsasl2 -// -// struct sasl_conn {}; -// -// #include -// #include -// -// sasl_callback_t *mgo_sasl_callbacks(const char *username, const char *password); -// -import "C" - -import ( - "fmt" - "strings" - "sync" - "unsafe" -) - -type saslStepper interface { - Step(serverData []byte) (clientData []byte, done bool, err error) - Close() -} - -type saslSession struct { - conn *C.sasl_conn_t - step int - mech string - - cstrings []*C.char - callbacks *C.sasl_callback_t -} - -var initError error -var initOnce sync.Once - -func initSASL() { - rc := C.sasl_client_init(nil) - if rc != C.SASL_OK { - initError = saslError(rc, nil, "cannot initialize SASL library") - } -} - -func New(username, password, mechanism, service, host string) (saslStepper, error) { - initOnce.Do(initSASL) - if initError != nil { - return nil, initError - } - - ss := &saslSession{mech: mechanism} - if service == "" { - service = "mongodb" - } - if i := strings.Index(host, ":"); i >= 0 { - host = host[:i] - } - ss.callbacks = C.mgo_sasl_callbacks(ss.cstr(username), ss.cstr(password)) - rc := C.sasl_client_new(ss.cstr(service), ss.cstr(host), nil, nil, ss.callbacks, 0, &ss.conn) - if rc != C.SASL_OK { - ss.Close() - return nil, saslError(rc, nil, "cannot create new SASL client") - } - return ss, nil -} - -func (ss *saslSession) cstr(s string) *C.char { - cstr := C.CString(s) - ss.cstrings = append(ss.cstrings, cstr) - return cstr -} - -func (ss *saslSession) Close() { - for _, cstr := range ss.cstrings { - C.free(unsafe.Pointer(cstr)) - } - ss.cstrings = nil - - if ss.callbacks != nil { - C.free(unsafe.Pointer(ss.callbacks)) - } - - // The documentation of SASL dispose makes it clear that this should only - // be done when the connection is done, not when the authentication phase - // is done, because an encryption layer may have been negotiated. - // Even then, we'll do this for now, because it's simpler and prevents - // keeping track of this state for every socket. If it breaks, we'll fix it. - C.sasl_dispose(&ss.conn) -} - -func (ss *saslSession) Step(serverData []byte) (clientData []byte, done bool, err error) { - ss.step++ - if ss.step > 10 { - return nil, false, fmt.Errorf("too many SASL steps without authentication") - } - var cclientData *C.char - var cclientDataLen C.uint - var rc C.int - if ss.step == 1 { - var mechanism *C.char // ignored - must match cred - rc = C.sasl_client_start(ss.conn, ss.cstr(ss.mech), nil, &cclientData, &cclientDataLen, &mechanism) - } else { - var cserverData *C.char - var cserverDataLen C.uint - if len(serverData) > 0 { - cserverData = (*C.char)(unsafe.Pointer(&serverData[0])) - cserverDataLen = C.uint(len(serverData)) - } - rc = C.sasl_client_step(ss.conn, cserverData, cserverDataLen, nil, &cclientData, &cclientDataLen) - } - if cclientData != nil && cclientDataLen > 0 { - clientData = C.GoBytes(unsafe.Pointer(cclientData), C.int(cclientDataLen)) - } - if rc == C.SASL_OK { - return clientData, true, nil - } - if rc == C.SASL_CONTINUE { - return clientData, false, nil - } - return nil, false, saslError(rc, ss.conn, "cannot establish SASL session") -} - -func saslError(rc C.int, conn *C.sasl_conn_t, msg string) error { - var detail string - if conn == nil { - detail = C.GoString(C.sasl_errstring(rc, nil, nil)) - } else { - detail = C.GoString(C.sasl_errdetail(conn)) - } - return fmt.Errorf(msg + ": " + detail) -} diff --git a/vendor/gopkg.in/mgo.v2/internal/sasl/sasl_windows.c b/vendor/gopkg.in/mgo.v2/internal/sasl/sasl_windows.c deleted file mode 100644 index dd6a88ab6..000000000 --- a/vendor/gopkg.in/mgo.v2/internal/sasl/sasl_windows.c +++ /dev/null @@ -1,118 +0,0 @@ -#include "sasl_windows.h" - -static const LPSTR SSPI_PACKAGE_NAME = "kerberos"; - -SECURITY_STATUS SEC_ENTRY sspi_acquire_credentials_handle(CredHandle *cred_handle, char *username, char *password, char *domain) -{ - SEC_WINNT_AUTH_IDENTITY auth_identity; - SECURITY_INTEGER ignored; - - auth_identity.Flags = SEC_WINNT_AUTH_IDENTITY_ANSI; - auth_identity.User = (LPSTR) username; - auth_identity.UserLength = strlen(username); - auth_identity.Password = (LPSTR) password; - auth_identity.PasswordLength = strlen(password); - auth_identity.Domain = (LPSTR) domain; - auth_identity.DomainLength = strlen(domain); - return call_sspi_acquire_credentials_handle(NULL, SSPI_PACKAGE_NAME, SECPKG_CRED_OUTBOUND, NULL, &auth_identity, NULL, NULL, cred_handle, &ignored); -} - -int sspi_step(CredHandle *cred_handle, int has_context, CtxtHandle *context, PVOID *buffer, ULONG *buffer_length, char *target) -{ - SecBufferDesc inbuf; - SecBuffer in_bufs[1]; - SecBufferDesc outbuf; - SecBuffer out_bufs[1]; - - if (has_context > 0) { - // If we already have a context, we now have data to send. - // Put this data in an inbuf. - inbuf.ulVersion = SECBUFFER_VERSION; - inbuf.cBuffers = 1; - inbuf.pBuffers = in_bufs; - in_bufs[0].pvBuffer = *buffer; - in_bufs[0].cbBuffer = *buffer_length; - in_bufs[0].BufferType = SECBUFFER_TOKEN; - } - - outbuf.ulVersion = SECBUFFER_VERSION; - outbuf.cBuffers = 1; - outbuf.pBuffers = out_bufs; - out_bufs[0].pvBuffer = NULL; - out_bufs[0].cbBuffer = 0; - out_bufs[0].BufferType = SECBUFFER_TOKEN; - - ULONG context_attr = 0; - - int ret = call_sspi_initialize_security_context(cred_handle, - has_context > 0 ? context : NULL, - (LPSTR) target, - ISC_REQ_ALLOCATE_MEMORY | ISC_REQ_MUTUAL_AUTH, - 0, - SECURITY_NETWORK_DREP, - has_context > 0 ? &inbuf : NULL, - 0, - context, - &outbuf, - &context_attr, - NULL); - - *buffer = malloc(out_bufs[0].cbBuffer); - *buffer_length = out_bufs[0].cbBuffer; - memcpy(*buffer, out_bufs[0].pvBuffer, *buffer_length); - - return ret; -} - -int sspi_send_client_authz_id(CtxtHandle *context, PVOID *buffer, ULONG *buffer_length, char *user_plus_realm) -{ - SecPkgContext_Sizes sizes; - SECURITY_STATUS status = call_sspi_query_context_attributes(context, SECPKG_ATTR_SIZES, &sizes); - - if (status != SEC_E_OK) { - return status; - } - - size_t user_plus_realm_length = strlen(user_plus_realm); - int msgSize = 4 + user_plus_realm_length; - char *msg = malloc((sizes.cbSecurityTrailer + msgSize + sizes.cbBlockSize) * sizeof(char)); - msg[sizes.cbSecurityTrailer + 0] = 1; - msg[sizes.cbSecurityTrailer + 1] = 0; - msg[sizes.cbSecurityTrailer + 2] = 0; - msg[sizes.cbSecurityTrailer + 3] = 0; - memcpy(&msg[sizes.cbSecurityTrailer + 4], user_plus_realm, user_plus_realm_length); - - SecBuffer wrapBufs[3]; - SecBufferDesc wrapBufDesc; - wrapBufDesc.cBuffers = 3; - wrapBufDesc.pBuffers = wrapBufs; - wrapBufDesc.ulVersion = SECBUFFER_VERSION; - - wrapBufs[0].cbBuffer = sizes.cbSecurityTrailer; - wrapBufs[0].BufferType = SECBUFFER_TOKEN; - wrapBufs[0].pvBuffer = msg; - - wrapBufs[1].cbBuffer = msgSize; - wrapBufs[1].BufferType = SECBUFFER_DATA; - wrapBufs[1].pvBuffer = msg + sizes.cbSecurityTrailer; - - wrapBufs[2].cbBuffer = sizes.cbBlockSize; - wrapBufs[2].BufferType = SECBUFFER_PADDING; - wrapBufs[2].pvBuffer = msg + sizes.cbSecurityTrailer + msgSize; - - status = call_sspi_encrypt_message(context, SECQOP_WRAP_NO_ENCRYPT, &wrapBufDesc, 0); - if (status != SEC_E_OK) { - free(msg); - return status; - } - - *buffer_length = wrapBufs[0].cbBuffer + wrapBufs[1].cbBuffer + wrapBufs[2].cbBuffer; - *buffer = malloc(*buffer_length); - - memcpy(*buffer, wrapBufs[0].pvBuffer, wrapBufs[0].cbBuffer); - memcpy(*buffer + wrapBufs[0].cbBuffer, wrapBufs[1].pvBuffer, wrapBufs[1].cbBuffer); - memcpy(*buffer + wrapBufs[0].cbBuffer + wrapBufs[1].cbBuffer, wrapBufs[2].pvBuffer, wrapBufs[2].cbBuffer); - - free(msg); - return SEC_E_OK; -} diff --git a/vendor/gopkg.in/mgo.v2/internal/sasl/sasl_windows.go b/vendor/gopkg.in/mgo.v2/internal/sasl/sasl_windows.go deleted file mode 100644 index 3302cfe05..000000000 --- a/vendor/gopkg.in/mgo.v2/internal/sasl/sasl_windows.go +++ /dev/null @@ -1,140 +0,0 @@ -package sasl - -// #include "sasl_windows.h" -import "C" - -import ( - "fmt" - "strings" - "sync" - "unsafe" -) - -type saslStepper interface { - Step(serverData []byte) (clientData []byte, done bool, err error) - Close() -} - -type saslSession struct { - // Credentials - mech string - service string - host string - userPlusRealm string - target string - domain string - - // Internal state - authComplete bool - errored bool - step int - - // C internal state - credHandle C.CredHandle - context C.CtxtHandle - hasContext C.int - - // Keep track of pointers we need to explicitly free - stringsToFree []*C.char -} - -var initError error -var initOnce sync.Once - -func initSSPI() { - rc := C.load_secur32_dll() - if rc != 0 { - initError = fmt.Errorf("Error loading libraries: %v", rc) - } -} - -func New(username, password, mechanism, service, host string) (saslStepper, error) { - initOnce.Do(initSSPI) - ss := &saslSession{mech: mechanism, hasContext: 0, userPlusRealm: username} - if service == "" { - service = "mongodb" - } - if i := strings.Index(host, ":"); i >= 0 { - host = host[:i] - } - ss.service = service - ss.host = host - - usernameComponents := strings.Split(username, "@") - if len(usernameComponents) < 2 { - return nil, fmt.Errorf("Username '%v' doesn't contain a realm!", username) - } - user := usernameComponents[0] - ss.domain = usernameComponents[1] - ss.target = fmt.Sprintf("%s/%s", ss.service, ss.host) - - var status C.SECURITY_STATUS - // Step 0: call AcquireCredentialsHandle to get a nice SSPI CredHandle - if len(password) > 0 { - status = C.sspi_acquire_credentials_handle(&ss.credHandle, ss.cstr(user), ss.cstr(password), ss.cstr(ss.domain)) - } else { - status = C.sspi_acquire_credentials_handle(&ss.credHandle, ss.cstr(user), nil, ss.cstr(ss.domain)) - } - if status != C.SEC_E_OK { - ss.errored = true - return nil, fmt.Errorf("Couldn't create new SSPI client, error code %v", status) - } - return ss, nil -} - -func (ss *saslSession) cstr(s string) *C.char { - cstr := C.CString(s) - ss.stringsToFree = append(ss.stringsToFree, cstr) - return cstr -} - -func (ss *saslSession) Close() { - for _, cstr := range ss.stringsToFree { - C.free(unsafe.Pointer(cstr)) - } -} - -func (ss *saslSession) Step(serverData []byte) (clientData []byte, done bool, err error) { - ss.step++ - if ss.step > 10 { - return nil, false, fmt.Errorf("too many SSPI steps without authentication") - } - var buffer C.PVOID - var bufferLength C.ULONG - if len(serverData) > 0 { - buffer = (C.PVOID)(unsafe.Pointer(&serverData[0])) - bufferLength = C.ULONG(len(serverData)) - } - var status C.int - if ss.authComplete { - // Step 3: last bit of magic to use the correct server credentials - status = C.sspi_send_client_authz_id(&ss.context, &buffer, &bufferLength, ss.cstr(ss.userPlusRealm)) - } else { - // Step 1 + Step 2: set up security context with the server and TGT - status = C.sspi_step(&ss.credHandle, ss.hasContext, &ss.context, &buffer, &bufferLength, ss.cstr(ss.target)) - } - if buffer != C.PVOID(nil) { - defer C.free(unsafe.Pointer(buffer)) - } - if status != C.SEC_E_OK && status != C.SEC_I_CONTINUE_NEEDED { - ss.errored = true - return nil, false, ss.handleSSPIErrorCode(status) - } - - clientData = C.GoBytes(unsafe.Pointer(buffer), C.int(bufferLength)) - if status == C.SEC_E_OK { - ss.authComplete = true - return clientData, true, nil - } else { - ss.hasContext = 1 - return clientData, false, nil - } -} - -func (ss *saslSession) handleSSPIErrorCode(code C.int) error { - switch { - case code == C.SEC_E_TARGET_UNKNOWN: - return fmt.Errorf("Target %v@%v not found", ss.target, ss.domain) - } - return fmt.Errorf("Unknown error doing step %v, error code %v", ss.step, code) -} diff --git a/vendor/gopkg.in/mgo.v2/internal/sasl/sasl_windows.h b/vendor/gopkg.in/mgo.v2/internal/sasl/sasl_windows.h deleted file mode 100644 index 94321b208..000000000 --- a/vendor/gopkg.in/mgo.v2/internal/sasl/sasl_windows.h +++ /dev/null @@ -1,7 +0,0 @@ -#include - -#include "sspi_windows.h" - -SECURITY_STATUS SEC_ENTRY sspi_acquire_credentials_handle(CredHandle* cred_handle, char* username, char* password, char* domain); -int sspi_step(CredHandle* cred_handle, int has_context, CtxtHandle* context, PVOID* buffer, ULONG* buffer_length, char* target); -int sspi_send_client_authz_id(CtxtHandle* context, PVOID* buffer, ULONG* buffer_length, char* user_plus_realm); diff --git a/vendor/gopkg.in/mgo.v2/internal/sasl/sspi_windows.c b/vendor/gopkg.in/mgo.v2/internal/sasl/sspi_windows.c deleted file mode 100644 index 63f9a6f86..000000000 --- a/vendor/gopkg.in/mgo.v2/internal/sasl/sspi_windows.c +++ /dev/null @@ -1,96 +0,0 @@ -// Code adapted from the NodeJS kerberos library: -// -// https://github.com/christkv/kerberos/tree/master/lib/win32/kerberos_sspi.c -// -// Under the terms of the Apache License, Version 2.0: -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -#include - -#include "sspi_windows.h" - -static HINSTANCE sspi_secur32_dll = NULL; - -int load_secur32_dll() -{ - sspi_secur32_dll = LoadLibrary("secur32.dll"); - if (sspi_secur32_dll == NULL) { - return GetLastError(); - } - return 0; -} - -SECURITY_STATUS SEC_ENTRY call_sspi_encrypt_message(PCtxtHandle phContext, unsigned long fQOP, PSecBufferDesc pMessage, unsigned long MessageSeqNo) -{ - if (sspi_secur32_dll == NULL) { - return -1; - } - encryptMessage_fn pfn_encryptMessage = (encryptMessage_fn) GetProcAddress(sspi_secur32_dll, "EncryptMessage"); - if (!pfn_encryptMessage) { - return -2; - } - return (*pfn_encryptMessage)(phContext, fQOP, pMessage, MessageSeqNo); -} - -SECURITY_STATUS SEC_ENTRY call_sspi_acquire_credentials_handle( - LPSTR pszPrincipal, LPSTR pszPackage, unsigned long fCredentialUse, - void *pvLogonId, void *pAuthData, SEC_GET_KEY_FN pGetKeyFn, void *pvGetKeyArgument, - PCredHandle phCredential, PTimeStamp ptsExpiry) -{ - if (sspi_secur32_dll == NULL) { - return -1; - } - acquireCredentialsHandle_fn pfn_acquireCredentialsHandle; -#ifdef _UNICODE - pfn_acquireCredentialsHandle = (acquireCredentialsHandle_fn) GetProcAddress(sspi_secur32_dll, "AcquireCredentialsHandleW"); -#else - pfn_acquireCredentialsHandle = (acquireCredentialsHandle_fn) GetProcAddress(sspi_secur32_dll, "AcquireCredentialsHandleA"); -#endif - if (!pfn_acquireCredentialsHandle) { - return -2; - } - return (*pfn_acquireCredentialsHandle)( - pszPrincipal, pszPackage, fCredentialUse, pvLogonId, pAuthData, - pGetKeyFn, pvGetKeyArgument, phCredential, ptsExpiry); -} - -SECURITY_STATUS SEC_ENTRY call_sspi_initialize_security_context( - PCredHandle phCredential, PCtxtHandle phContext, LPSTR pszTargetName, - unsigned long fContextReq, unsigned long Reserved1, unsigned long TargetDataRep, - PSecBufferDesc pInput, unsigned long Reserved2, PCtxtHandle phNewContext, - PSecBufferDesc pOutput, unsigned long *pfContextAttr, PTimeStamp ptsExpiry) -{ - if (sspi_secur32_dll == NULL) { - return -1; - } - initializeSecurityContext_fn pfn_initializeSecurityContext; -#ifdef _UNICODE - pfn_initializeSecurityContext = (initializeSecurityContext_fn) GetProcAddress(sspi_secur32_dll, "InitializeSecurityContextW"); -#else - pfn_initializeSecurityContext = (initializeSecurityContext_fn) GetProcAddress(sspi_secur32_dll, "InitializeSecurityContextA"); -#endif - if (!pfn_initializeSecurityContext) { - return -2; - } - return (*pfn_initializeSecurityContext)( - phCredential, phContext, pszTargetName, fContextReq, Reserved1, TargetDataRep, - pInput, Reserved2, phNewContext, pOutput, pfContextAttr, ptsExpiry); -} - -SECURITY_STATUS SEC_ENTRY call_sspi_query_context_attributes(PCtxtHandle phContext, unsigned long ulAttribute, void *pBuffer) -{ - if (sspi_secur32_dll == NULL) { - return -1; - } - queryContextAttributes_fn pfn_queryContextAttributes; -#ifdef _UNICODE - pfn_queryContextAttributes = (queryContextAttributes_fn) GetProcAddress(sspi_secur32_dll, "QueryContextAttributesW"); -#else - pfn_queryContextAttributes = (queryContextAttributes_fn) GetProcAddress(sspi_secur32_dll, "QueryContextAttributesA"); -#endif - if (!pfn_queryContextAttributes) { - return -2; - } - return (*pfn_queryContextAttributes)(phContext, ulAttribute, pBuffer); -} diff --git a/vendor/gopkg.in/mgo.v2/internal/sasl/sspi_windows.h b/vendor/gopkg.in/mgo.v2/internal/sasl/sspi_windows.h deleted file mode 100644 index d28327031..000000000 --- a/vendor/gopkg.in/mgo.v2/internal/sasl/sspi_windows.h +++ /dev/null @@ -1,70 +0,0 @@ -// Code adapted from the NodeJS kerberos library: -// -// https://github.com/christkv/kerberos/tree/master/lib/win32/kerberos_sspi.h -// -// Under the terms of the Apache License, Version 2.0: -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -#ifndef SSPI_WINDOWS_H -#define SSPI_WINDOWS_H - -#define SECURITY_WIN32 1 - -#include -#include - -int load_secur32_dll(); - -SECURITY_STATUS SEC_ENTRY call_sspi_encrypt_message(PCtxtHandle phContext, unsigned long fQOP, PSecBufferDesc pMessage, unsigned long MessageSeqNo); - -typedef DWORD (WINAPI *encryptMessage_fn)(PCtxtHandle phContext, ULONG fQOP, PSecBufferDesc pMessage, ULONG MessageSeqNo); - -SECURITY_STATUS SEC_ENTRY call_sspi_acquire_credentials_handle( - LPSTR pszPrincipal, // Name of principal - LPSTR pszPackage, // Name of package - unsigned long fCredentialUse, // Flags indicating use - void *pvLogonId, // Pointer to logon ID - void *pAuthData, // Package specific data - SEC_GET_KEY_FN pGetKeyFn, // Pointer to GetKey() func - void *pvGetKeyArgument, // Value to pass to GetKey() - PCredHandle phCredential, // (out) Cred Handle - PTimeStamp ptsExpiry // (out) Lifetime (optional) -); - -typedef DWORD (WINAPI *acquireCredentialsHandle_fn)( - LPSTR pszPrincipal, LPSTR pszPackage, unsigned long fCredentialUse, - void *pvLogonId, void *pAuthData, SEC_GET_KEY_FN pGetKeyFn, void *pvGetKeyArgument, - PCredHandle phCredential, PTimeStamp ptsExpiry -); - -SECURITY_STATUS SEC_ENTRY call_sspi_initialize_security_context( - PCredHandle phCredential, // Cred to base context - PCtxtHandle phContext, // Existing context (OPT) - LPSTR pszTargetName, // Name of target - unsigned long fContextReq, // Context Requirements - unsigned long Reserved1, // Reserved, MBZ - unsigned long TargetDataRep, // Data rep of target - PSecBufferDesc pInput, // Input Buffers - unsigned long Reserved2, // Reserved, MBZ - PCtxtHandle phNewContext, // (out) New Context handle - PSecBufferDesc pOutput, // (inout) Output Buffers - unsigned long *pfContextAttr, // (out) Context attrs - PTimeStamp ptsExpiry // (out) Life span (OPT) -); - -typedef DWORD (WINAPI *initializeSecurityContext_fn)( - PCredHandle phCredential, PCtxtHandle phContext, LPSTR pszTargetName, unsigned long fContextReq, - unsigned long Reserved1, unsigned long TargetDataRep, PSecBufferDesc pInput, unsigned long Reserved2, - PCtxtHandle phNewContext, PSecBufferDesc pOutput, unsigned long *pfContextAttr, PTimeStamp ptsExpiry); - -SECURITY_STATUS SEC_ENTRY call_sspi_query_context_attributes( - PCtxtHandle phContext, // Context to query - unsigned long ulAttribute, // Attribute to query - void *pBuffer // Buffer for attributes -); - -typedef DWORD (WINAPI *queryContextAttributes_fn)( - PCtxtHandle phContext, unsigned long ulAttribute, void *pBuffer); - -#endif // SSPI_WINDOWS_H diff --git a/vendor/gopkg.in/mgo.v2/internal/scram/scram.go b/vendor/gopkg.in/mgo.v2/internal/scram/scram.go deleted file mode 100644 index 80cda9135..000000000 --- a/vendor/gopkg.in/mgo.v2/internal/scram/scram.go +++ /dev/null @@ -1,266 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2014 - Gustavo Niemeyer -// -// 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 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. - -// Pacakage scram implements a SCRAM-{SHA-1,etc} client per RFC5802. -// -// http://tools.ietf.org/html/rfc5802 -// -package scram - -import ( - "bytes" - "crypto/hmac" - "crypto/rand" - "encoding/base64" - "fmt" - "hash" - "strconv" - "strings" -) - -// Client implements a SCRAM-* client (SCRAM-SHA-1, SCRAM-SHA-256, etc). -// -// A Client may be used within a SASL conversation with logic resembling: -// -// var in []byte -// var client = scram.NewClient(sha1.New, user, pass) -// for client.Step(in) { -// out := client.Out() -// // send out to server -// in := serverOut -// } -// if client.Err() != nil { -// // auth failed -// } -// -type Client struct { - newHash func() hash.Hash - - user string - pass string - step int - out bytes.Buffer - err error - - clientNonce []byte - serverNonce []byte - saltedPass []byte - authMsg bytes.Buffer -} - -// NewClient returns a new SCRAM-* client with the provided hash algorithm. -// -// For SCRAM-SHA-1, for example, use: -// -// client := scram.NewClient(sha1.New, user, pass) -// -func NewClient(newHash func() hash.Hash, user, pass string) *Client { - c := &Client{ - newHash: newHash, - user: user, - pass: pass, - } - c.out.Grow(256) - c.authMsg.Grow(256) - return c -} - -// Out returns the data to be sent to the server in the current step. -func (c *Client) Out() []byte { - if c.out.Len() == 0 { - return nil - } - return c.out.Bytes() -} - -// Err returns the error that ocurred, or nil if there were no errors. -func (c *Client) Err() error { - return c.err -} - -// SetNonce sets the client nonce to the provided value. -// If not set, the nonce is generated automatically out of crypto/rand on the first step. -func (c *Client) SetNonce(nonce []byte) { - c.clientNonce = nonce -} - -var escaper = strings.NewReplacer("=", "=3D", ",", "=2C") - -// Step processes the incoming data from the server and makes the -// next round of data for the server available via Client.Out. -// Step returns false if there are no errors and more data is -// still expected. -func (c *Client) Step(in []byte) bool { - c.out.Reset() - if c.step > 2 || c.err != nil { - return false - } - c.step++ - switch c.step { - case 1: - c.err = c.step1(in) - case 2: - c.err = c.step2(in) - case 3: - c.err = c.step3(in) - } - return c.step > 2 || c.err != nil -} - -func (c *Client) step1(in []byte) error { - if len(c.clientNonce) == 0 { - const nonceLen = 6 - buf := make([]byte, nonceLen + b64.EncodedLen(nonceLen)) - if _, err := rand.Read(buf[:nonceLen]); err != nil { - return fmt.Errorf("cannot read random SCRAM-SHA-1 nonce from operating system: %v", err) - } - c.clientNonce = buf[nonceLen:] - b64.Encode(c.clientNonce, buf[:nonceLen]) - } - c.authMsg.WriteString("n=") - escaper.WriteString(&c.authMsg, c.user) - c.authMsg.WriteString(",r=") - c.authMsg.Write(c.clientNonce) - - c.out.WriteString("n,,") - c.out.Write(c.authMsg.Bytes()) - return nil -} - -var b64 = base64.StdEncoding - -func (c *Client) step2(in []byte) error { - c.authMsg.WriteByte(',') - c.authMsg.Write(in) - - fields := bytes.Split(in, []byte(",")) - if len(fields) != 3 { - return fmt.Errorf("expected 3 fields in first SCRAM-SHA-1 server message, got %d: %q", len(fields), in) - } - if !bytes.HasPrefix(fields[0], []byte("r=")) || len(fields[0]) < 2 { - return fmt.Errorf("server sent an invalid SCRAM-SHA-1 nonce: %q", fields[0]) - } - if !bytes.HasPrefix(fields[1], []byte("s=")) || len(fields[1]) < 6 { - return fmt.Errorf("server sent an invalid SCRAM-SHA-1 salt: %q", fields[1]) - } - if !bytes.HasPrefix(fields[2], []byte("i=")) || len(fields[2]) < 6 { - return fmt.Errorf("server sent an invalid SCRAM-SHA-1 iteration count: %q", fields[2]) - } - - c.serverNonce = fields[0][2:] - if !bytes.HasPrefix(c.serverNonce, c.clientNonce) { - return fmt.Errorf("server SCRAM-SHA-1 nonce is not prefixed by client nonce: got %q, want %q+\"...\"", c.serverNonce, c.clientNonce) - } - - salt := make([]byte, b64.DecodedLen(len(fields[1][2:]))) - n, err := b64.Decode(salt, fields[1][2:]) - if err != nil { - return fmt.Errorf("cannot decode SCRAM-SHA-1 salt sent by server: %q", fields[1]) - } - salt = salt[:n] - iterCount, err := strconv.Atoi(string(fields[2][2:])) - if err != nil { - return fmt.Errorf("server sent an invalid SCRAM-SHA-1 iteration count: %q", fields[2]) - } - c.saltPassword(salt, iterCount) - - c.authMsg.WriteString(",c=biws,r=") - c.authMsg.Write(c.serverNonce) - - c.out.WriteString("c=biws,r=") - c.out.Write(c.serverNonce) - c.out.WriteString(",p=") - c.out.Write(c.clientProof()) - return nil -} - -func (c *Client) step3(in []byte) error { - var isv, ise bool - var fields = bytes.Split(in, []byte(",")) - if len(fields) == 1 { - isv = bytes.HasPrefix(fields[0], []byte("v=")) - ise = bytes.HasPrefix(fields[0], []byte("e=")) - } - if ise { - return fmt.Errorf("SCRAM-SHA-1 authentication error: %s", fields[0][2:]) - } else if !isv { - return fmt.Errorf("unsupported SCRAM-SHA-1 final message from server: %q", in) - } - if !bytes.Equal(c.serverSignature(), fields[0][2:]) { - return fmt.Errorf("cannot authenticate SCRAM-SHA-1 server signature: %q", fields[0][2:]) - } - return nil -} - -func (c *Client) saltPassword(salt []byte, iterCount int) { - mac := hmac.New(c.newHash, []byte(c.pass)) - mac.Write(salt) - mac.Write([]byte{0, 0, 0, 1}) - ui := mac.Sum(nil) - hi := make([]byte, len(ui)) - copy(hi, ui) - for i := 1; i < iterCount; i++ { - mac.Reset() - mac.Write(ui) - mac.Sum(ui[:0]) - for j, b := range ui { - hi[j] ^= b - } - } - c.saltedPass = hi -} - -func (c *Client) clientProof() []byte { - mac := hmac.New(c.newHash, c.saltedPass) - mac.Write([]byte("Client Key")) - clientKey := mac.Sum(nil) - hash := c.newHash() - hash.Write(clientKey) - storedKey := hash.Sum(nil) - mac = hmac.New(c.newHash, storedKey) - mac.Write(c.authMsg.Bytes()) - clientProof := mac.Sum(nil) - for i, b := range clientKey { - clientProof[i] ^= b - } - clientProof64 := make([]byte, b64.EncodedLen(len(clientProof))) - b64.Encode(clientProof64, clientProof) - return clientProof64 -} - -func (c *Client) serverSignature() []byte { - mac := hmac.New(c.newHash, c.saltedPass) - mac.Write([]byte("Server Key")) - serverKey := mac.Sum(nil) - - mac = hmac.New(c.newHash, serverKey) - mac.Write(c.authMsg.Bytes()) - serverSignature := mac.Sum(nil) - - encoded := make([]byte, b64.EncodedLen(len(serverSignature))) - b64.Encode(encoded, serverSignature) - return encoded -} diff --git a/vendor/gopkg.in/mgo.v2/internal/scram/scram_test.go b/vendor/gopkg.in/mgo.v2/internal/scram/scram_test.go deleted file mode 100644 index 9c20fdfc4..000000000 --- a/vendor/gopkg.in/mgo.v2/internal/scram/scram_test.go +++ /dev/null @@ -1,67 +0,0 @@ -package scram_test - -import ( - "crypto/sha1" - "testing" - - . "gopkg.in/check.v1" - "gopkg.in/mgo.v2/internal/scram" - "strings" -) - -var _ = Suite(&S{}) - -func Test(t *testing.T) { TestingT(t) } - -type S struct{} - -var tests = [][]string{{ - "U: user pencil", - "N: fyko+d2lbbFgONRv9qkxdawL", - "C: n,,n=user,r=fyko+d2lbbFgONRv9qkxdawL", - "S: r=fyko+d2lbbFgONRv9qkxdawL3rfcNHYJY1ZVvWVs7j,s=QSXCR+Q6sek8bf92,i=4096", - "C: c=biws,r=fyko+d2lbbFgONRv9qkxdawL3rfcNHYJY1ZVvWVs7j,p=v0X8v3Bz2T0CJGbJQyF0X+HI4Ts=", - "S: v=rmF9pqV8S7suAoZWja4dJRkFsKQ=", -}, { - "U: root fe8c89e308ec08763df36333cbf5d3a2", - "N: OTcxNDk5NjM2MzE5", - "C: n,,n=root,r=OTcxNDk5NjM2MzE5", - "S: r=OTcxNDk5NjM2MzE581Ra3provgG0iDsMkDiIAlrh4532dDLp,s=XRDkVrFC9JuL7/F4tG0acQ==,i=10000", - "C: c=biws,r=OTcxNDk5NjM2MzE581Ra3provgG0iDsMkDiIAlrh4532dDLp,p=6y1jp9R7ETyouTXS9fW9k5UHdBc=", - "S: v=LBnd9dUJRxdqZiEq91NKP3z/bHA=", -}} - -func (s *S) TestExamples(c *C) { - for _, steps := range tests { - if len(steps) < 2 || len(steps[0]) < 3 || !strings.HasPrefix(steps[0], "U: ") { - c.Fatalf("Invalid test: %#v", steps) - } - auth := strings.Fields(steps[0][3:]) - client := scram.NewClient(sha1.New, auth[0], auth[1]) - first, done := true, false - c.Logf("-----") - c.Logf("%s", steps[0]) - for _, step := range steps[1:] { - c.Logf("%s", step) - switch step[:3] { - case "N: ": - client.SetNonce([]byte(step[3:])) - case "C: ": - if first { - first = false - done = client.Step(nil) - } - c.Assert(done, Equals, false) - c.Assert(client.Err(), IsNil) - c.Assert(string(client.Out()), Equals, step[3:]) - case "S: ": - first = false - done = client.Step([]byte(step[3:])) - default: - panic("invalid test line: " + step) - } - } - c.Assert(done, Equals, true) - c.Assert(client.Err(), IsNil) - } -} diff --git a/vendor/gopkg.in/mgo.v2/log.go b/vendor/gopkg.in/mgo.v2/log.go deleted file mode 100644 index 53eb4237b..000000000 --- a/vendor/gopkg.in/mgo.v2/log.go +++ /dev/null @@ -1,133 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// 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 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 mgo - -import ( - "fmt" - "sync" -) - -// --------------------------------------------------------------------------- -// Logging integration. - -// Avoid importing the log type information unnecessarily. There's a small cost -// associated with using an interface rather than the type. Depending on how -// often the logger is plugged in, it would be worth using the type instead. -type log_Logger interface { - Output(calldepth int, s string) error -} - -var ( - globalLogger log_Logger - globalDebug bool - globalMutex sync.Mutex -) - -// RACE WARNING: There are known data races when logging, which are manually -// silenced when the race detector is in use. These data races won't be -// observed in typical use, because logging is supposed to be set up once when -// the application starts. Having raceDetector as a constant, the compiler -// should elide the locks altogether in actual use. - -// Specify the *log.Logger object where log messages should be sent to. -func SetLogger(logger log_Logger) { - if raceDetector { - globalMutex.Lock() - defer globalMutex.Unlock() - } - globalLogger = logger -} - -// Enable the delivery of debug messages to the logger. Only meaningful -// if a logger is also set. -func SetDebug(debug bool) { - if raceDetector { - globalMutex.Lock() - defer globalMutex.Unlock() - } - globalDebug = debug -} - -func log(v ...interface{}) { - if raceDetector { - globalMutex.Lock() - defer globalMutex.Unlock() - } - if globalLogger != nil { - globalLogger.Output(2, fmt.Sprint(v...)) - } -} - -func logln(v ...interface{}) { - if raceDetector { - globalMutex.Lock() - defer globalMutex.Unlock() - } - if globalLogger != nil { - globalLogger.Output(2, fmt.Sprintln(v...)) - } -} - -func logf(format string, v ...interface{}) { - if raceDetector { - globalMutex.Lock() - defer globalMutex.Unlock() - } - if globalLogger != nil { - globalLogger.Output(2, fmt.Sprintf(format, v...)) - } -} - -func debug(v ...interface{}) { - if raceDetector { - globalMutex.Lock() - defer globalMutex.Unlock() - } - if globalDebug && globalLogger != nil { - globalLogger.Output(2, fmt.Sprint(v...)) - } -} - -func debugln(v ...interface{}) { - if raceDetector { - globalMutex.Lock() - defer globalMutex.Unlock() - } - if globalDebug && globalLogger != nil { - globalLogger.Output(2, fmt.Sprintln(v...)) - } -} - -func debugf(format string, v ...interface{}) { - if raceDetector { - globalMutex.Lock() - defer globalMutex.Unlock() - } - if globalDebug && globalLogger != nil { - globalLogger.Output(2, fmt.Sprintf(format, v...)) - } -} diff --git a/vendor/gopkg.in/mgo.v2/queue.go b/vendor/gopkg.in/mgo.v2/queue.go deleted file mode 100644 index e9245de70..000000000 --- a/vendor/gopkg.in/mgo.v2/queue.go +++ /dev/null @@ -1,91 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// 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 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 mgo - -type queue struct { - elems []interface{} - nelems, popi, pushi int -} - -func (q *queue) Len() int { - return q.nelems -} - -func (q *queue) Push(elem interface{}) { - //debugf("Pushing(pushi=%d popi=%d cap=%d): %#v\n", - // q.pushi, q.popi, len(q.elems), elem) - if q.nelems == len(q.elems) { - q.expand() - } - q.elems[q.pushi] = elem - q.nelems++ - q.pushi = (q.pushi + 1) % len(q.elems) - //debugf(" Pushed(pushi=%d popi=%d cap=%d): %#v\n", - // q.pushi, q.popi, len(q.elems), elem) -} - -func (q *queue) Pop() (elem interface{}) { - //debugf("Popping(pushi=%d popi=%d cap=%d)\n", - // q.pushi, q.popi, len(q.elems)) - if q.nelems == 0 { - return nil - } - elem = q.elems[q.popi] - q.elems[q.popi] = nil // Help GC. - q.nelems-- - q.popi = (q.popi + 1) % len(q.elems) - //debugf(" Popped(pushi=%d popi=%d cap=%d): %#v\n", - // q.pushi, q.popi, len(q.elems), elem) - return elem -} - -func (q *queue) expand() { - curcap := len(q.elems) - var newcap int - if curcap == 0 { - newcap = 8 - } else if curcap < 1024 { - newcap = curcap * 2 - } else { - newcap = curcap + (curcap / 4) - } - elems := make([]interface{}, newcap) - - if q.popi == 0 { - copy(elems, q.elems) - q.pushi = curcap - } else { - newpopi := newcap - (curcap - q.popi) - copy(elems, q.elems[:q.popi]) - copy(elems[newpopi:], q.elems[q.popi:]) - q.popi = newpopi - } - for i := range q.elems { - q.elems[i] = nil // Help GC. - } - q.elems = elems -} diff --git a/vendor/gopkg.in/mgo.v2/queue_test.go b/vendor/gopkg.in/mgo.v2/queue_test.go deleted file mode 100644 index bd0ab550f..000000000 --- a/vendor/gopkg.in/mgo.v2/queue_test.go +++ /dev/null @@ -1,101 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// 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 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 mgo - -import ( - . "gopkg.in/check.v1" -) - -type QS struct{} - -var _ = Suite(&QS{}) - -func (s *QS) TestSequentialGrowth(c *C) { - q := queue{} - n := 2048 - for i := 0; i != n; i++ { - q.Push(i) - } - for i := 0; i != n; i++ { - c.Assert(q.Pop(), Equals, i) - } -} - -var queueTestLists = [][]int{ - // {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} - {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, - - // {8, 9, 10, 11, ... 2, 3, 4, 5, 6, 7} - {0, 1, 2, 3, 4, 5, 6, 7, -1, -1, 8, 9, 10, 11}, - - // {8, 9, 10, 11, ... 2, 3, 4, 5, 6, 7} - {0, 1, 2, 3, -1, -1, 4, 5, 6, 7, 8, 9, 10, 11}, - - // {0, 1, 2, 3, 4, 5, 6, 7, 8} - {0, 1, 2, 3, 4, 5, 6, 7, 8, - -1, -1, -1, -1, -1, -1, -1, -1, -1, - 0, 1, 2, 3, 4, 5, 6, 7, 8}, -} - -func (s *QS) TestQueueTestLists(c *C) { - test := []int{} - testi := 0 - reset := func() { - test = test[0:0] - testi = 0 - } - push := func(i int) { - test = append(test, i) - } - pop := func() (i int) { - if testi == len(test) { - return -1 - } - i = test[testi] - testi++ - return - } - - for _, list := range queueTestLists { - reset() - q := queue{} - for _, n := range list { - if n == -1 { - c.Assert(q.Pop(), Equals, pop(), Commentf("With list %#v", list)) - } else { - q.Push(n) - push(n) - } - } - - for n := pop(); n != -1; n = pop() { - c.Assert(q.Pop(), Equals, n, Commentf("With list %#v", list)) - } - - c.Assert(q.Pop(), Equals, nil, Commentf("With list %#v", list)) - } -} diff --git a/vendor/gopkg.in/mgo.v2/raceoff.go b/vendor/gopkg.in/mgo.v2/raceoff.go deleted file mode 100644 index e60b14144..000000000 --- a/vendor/gopkg.in/mgo.v2/raceoff.go +++ /dev/null @@ -1,5 +0,0 @@ -// +build !race - -package mgo - -const raceDetector = false diff --git a/vendor/gopkg.in/mgo.v2/raceon.go b/vendor/gopkg.in/mgo.v2/raceon.go deleted file mode 100644 index 737b08ece..000000000 --- a/vendor/gopkg.in/mgo.v2/raceon.go +++ /dev/null @@ -1,5 +0,0 @@ -// +build race - -package mgo - -const raceDetector = true diff --git a/vendor/gopkg.in/mgo.v2/saslimpl.go b/vendor/gopkg.in/mgo.v2/saslimpl.go deleted file mode 100644 index 0d25f25cb..000000000 --- a/vendor/gopkg.in/mgo.v2/saslimpl.go +++ /dev/null @@ -1,11 +0,0 @@ -//+build sasl - -package mgo - -import ( - "gopkg.in/mgo.v2/internal/sasl" -) - -func saslNew(cred Credential, host string) (saslStepper, error) { - return sasl.New(cred.Username, cred.Password, cred.Mechanism, cred.Service, host) -} diff --git a/vendor/gopkg.in/mgo.v2/saslstub.go b/vendor/gopkg.in/mgo.v2/saslstub.go deleted file mode 100644 index 6e9e30986..000000000 --- a/vendor/gopkg.in/mgo.v2/saslstub.go +++ /dev/null @@ -1,11 +0,0 @@ -//+build !sasl - -package mgo - -import ( - "fmt" -) - -func saslNew(cred Credential, host string) (saslStepper, error) { - return nil, fmt.Errorf("SASL support not enabled during build (-tags sasl)") -} diff --git a/vendor/gopkg.in/mgo.v2/server.go b/vendor/gopkg.in/mgo.v2/server.go deleted file mode 100644 index d5086a290..000000000 --- a/vendor/gopkg.in/mgo.v2/server.go +++ /dev/null @@ -1,448 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// 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 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 mgo - -import ( - "errors" - "net" - "sort" - "sync" - "time" - - "gopkg.in/mgo.v2/bson" -) - -// --------------------------------------------------------------------------- -// Mongo server encapsulation. - -type mongoServer struct { - sync.RWMutex - Addr string - ResolvedAddr string - tcpaddr *net.TCPAddr - unusedSockets []*mongoSocket - liveSockets []*mongoSocket - closed bool - abended bool - sync chan bool - dial dialer - pingValue time.Duration - pingIndex int - pingCount uint32 - pingWindow [6]time.Duration - info *mongoServerInfo -} - -type dialer struct { - old func(addr net.Addr) (net.Conn, error) - new func(addr *ServerAddr) (net.Conn, error) -} - -func (dial dialer) isSet() bool { - return dial.old != nil || dial.new != nil -} - -type mongoServerInfo struct { - Master bool - Mongos bool - Tags bson.D - MaxWireVersion int - SetName string -} - -var defaultServerInfo mongoServerInfo - -func newServer(addr string, tcpaddr *net.TCPAddr, sync chan bool, dial dialer) *mongoServer { - server := &mongoServer{ - Addr: addr, - ResolvedAddr: tcpaddr.String(), - tcpaddr: tcpaddr, - sync: sync, - dial: dial, - info: &defaultServerInfo, - } - // Once so the server gets a ping value, then loop in background. - server.pinger(false) - go server.pinger(true) - return server -} - -var errPoolLimit = errors.New("per-server connection limit reached") -var errServerClosed = errors.New("server was closed") - -// AcquireSocket returns a socket for communicating with the server. -// This will attempt to reuse an old connection, if one is available. Otherwise, -// it will establish a new one. The returned socket is owned by the call site, -// and will return to the cache when the socket has its Release method called -// the same number of times as AcquireSocket + Acquire were called for it. -// If the poolLimit argument is greater than zero and the number of sockets in -// use in this server is greater than the provided limit, errPoolLimit is -// returned. -func (server *mongoServer) AcquireSocket(poolLimit int, timeout time.Duration) (socket *mongoSocket, abended bool, err error) { - for { - server.Lock() - abended = server.abended - if server.closed { - server.Unlock() - return nil, abended, errServerClosed - } - n := len(server.unusedSockets) - if poolLimit > 0 && len(server.liveSockets)-n >= poolLimit { - server.Unlock() - return nil, false, errPoolLimit - } - if n > 0 { - socket = server.unusedSockets[n-1] - server.unusedSockets[n-1] = nil // Help GC. - server.unusedSockets = server.unusedSockets[:n-1] - info := server.info - server.Unlock() - err = socket.InitialAcquire(info, timeout) - if err != nil { - continue - } - } else { - server.Unlock() - socket, err = server.Connect(timeout) - if err == nil { - server.Lock() - // We've waited for the Connect, see if we got - // closed in the meantime - if server.closed { - server.Unlock() - socket.Release() - socket.Close() - return nil, abended, errServerClosed - } - server.liveSockets = append(server.liveSockets, socket) - server.Unlock() - } - } - return - } - panic("unreachable") -} - -// Connect establishes a new connection to the server. This should -// generally be done through server.AcquireSocket(). -func (server *mongoServer) Connect(timeout time.Duration) (*mongoSocket, error) { - server.RLock() - master := server.info.Master - dial := server.dial - server.RUnlock() - - logf("Establishing new connection to %s (timeout=%s)...", server.Addr, timeout) - var conn net.Conn - var err error - switch { - case !dial.isSet(): - // Cannot do this because it lacks timeout support. :-( - //conn, err = net.DialTCP("tcp", nil, server.tcpaddr) - conn, err = net.DialTimeout("tcp", server.ResolvedAddr, timeout) - case dial.old != nil: - conn, err = dial.old(server.tcpaddr) - case dial.new != nil: - conn, err = dial.new(&ServerAddr{server.Addr, server.tcpaddr}) - default: - panic("dialer is set, but both dial.old and dial.new are nil") - } - if err != nil { - logf("Connection to %s failed: %v", server.Addr, err.Error()) - return nil, err - } - logf("Connection to %s established.", server.Addr) - - stats.conn(+1, master) - return newSocket(server, conn, timeout), nil -} - -// Close forces closing all sockets that are alive, whether -// they're currently in use or not. -func (server *mongoServer) Close() { - server.Lock() - server.closed = true - liveSockets := server.liveSockets - unusedSockets := server.unusedSockets - server.liveSockets = nil - server.unusedSockets = nil - server.Unlock() - logf("Connections to %s closing (%d live sockets).", server.Addr, len(liveSockets)) - for i, s := range liveSockets { - s.Close() - liveSockets[i] = nil - } - for i := range unusedSockets { - unusedSockets[i] = nil - } -} - -// RecycleSocket puts socket back into the unused cache. -func (server *mongoServer) RecycleSocket(socket *mongoSocket) { - server.Lock() - if !server.closed { - server.unusedSockets = append(server.unusedSockets, socket) - } - server.Unlock() -} - -func removeSocket(sockets []*mongoSocket, socket *mongoSocket) []*mongoSocket { - for i, s := range sockets { - if s == socket { - copy(sockets[i:], sockets[i+1:]) - n := len(sockets) - 1 - sockets[n] = nil - sockets = sockets[:n] - break - } - } - return sockets -} - -// AbendSocket notifies the server that the given socket has terminated -// abnormally, and thus should be discarded rather than cached. -func (server *mongoServer) AbendSocket(socket *mongoSocket) { - server.Lock() - server.abended = true - if server.closed { - server.Unlock() - return - } - server.liveSockets = removeSocket(server.liveSockets, socket) - server.unusedSockets = removeSocket(server.unusedSockets, socket) - server.Unlock() - // Maybe just a timeout, but suggest a cluster sync up just in case. - select { - case server.sync <- true: - default: - } -} - -func (server *mongoServer) SetInfo(info *mongoServerInfo) { - server.Lock() - server.info = info - server.Unlock() -} - -func (server *mongoServer) Info() *mongoServerInfo { - server.Lock() - info := server.info - server.Unlock() - return info -} - -func (server *mongoServer) hasTags(serverTags []bson.D) bool { -NextTagSet: - for _, tags := range serverTags { - NextReqTag: - for _, req := range tags { - for _, has := range server.info.Tags { - if req.Name == has.Name { - if req.Value == has.Value { - continue NextReqTag - } - continue NextTagSet - } - } - continue NextTagSet - } - return true - } - return false -} - -var pingDelay = 5 * time.Second - -func (server *mongoServer) pinger(loop bool) { - var delay time.Duration - if raceDetector { - // This variable is only ever touched by tests. - globalMutex.Lock() - delay = pingDelay - globalMutex.Unlock() - } else { - delay = pingDelay - } - op := queryOp{ - collection: "admin.$cmd", - query: bson.D{{"ping", 1}}, - flags: flagSlaveOk, - limit: -1, - } - for { - if loop { - time.Sleep(delay) - } - op := op - socket, _, err := server.AcquireSocket(0, 3*delay) - if err == nil { - start := time.Now() - _, _ = socket.SimpleQuery(&op) - delay := time.Now().Sub(start) - - server.pingWindow[server.pingIndex] = delay - server.pingIndex = (server.pingIndex + 1) % len(server.pingWindow) - server.pingCount++ - var max time.Duration - for i := 0; i < len(server.pingWindow) && uint32(i) < server.pingCount; i++ { - if server.pingWindow[i] > max { - max = server.pingWindow[i] - } - } - socket.Release() - server.Lock() - if server.closed { - loop = false - } - server.pingValue = max - server.Unlock() - logf("Ping for %s is %d ms", server.Addr, max/time.Millisecond) - } else if err == errServerClosed { - return - } - if !loop { - return - } - } -} - -type mongoServerSlice []*mongoServer - -func (s mongoServerSlice) Len() int { - return len(s) -} - -func (s mongoServerSlice) Less(i, j int) bool { - return s[i].ResolvedAddr < s[j].ResolvedAddr -} - -func (s mongoServerSlice) Swap(i, j int) { - s[i], s[j] = s[j], s[i] -} - -func (s mongoServerSlice) Sort() { - sort.Sort(s) -} - -func (s mongoServerSlice) Search(resolvedAddr string) (i int, ok bool) { - n := len(s) - i = sort.Search(n, func(i int) bool { - return s[i].ResolvedAddr >= resolvedAddr - }) - return i, i != n && s[i].ResolvedAddr == resolvedAddr -} - -type mongoServers struct { - slice mongoServerSlice -} - -func (servers *mongoServers) Search(resolvedAddr string) (server *mongoServer) { - if i, ok := servers.slice.Search(resolvedAddr); ok { - return servers.slice[i] - } - return nil -} - -func (servers *mongoServers) Add(server *mongoServer) { - servers.slice = append(servers.slice, server) - servers.slice.Sort() -} - -func (servers *mongoServers) Remove(other *mongoServer) (server *mongoServer) { - if i, found := servers.slice.Search(other.ResolvedAddr); found { - server = servers.slice[i] - copy(servers.slice[i:], servers.slice[i+1:]) - n := len(servers.slice) - 1 - servers.slice[n] = nil // Help GC. - servers.slice = servers.slice[:n] - } - return -} - -func (servers *mongoServers) Slice() []*mongoServer { - return ([]*mongoServer)(servers.slice) -} - -func (servers *mongoServers) Get(i int) *mongoServer { - return servers.slice[i] -} - -func (servers *mongoServers) Len() int { - return len(servers.slice) -} - -func (servers *mongoServers) Empty() bool { - return len(servers.slice) == 0 -} - -// BestFit returns the best guess of what would be the most interesting -// server to perform operations on at this point in time. -func (servers *mongoServers) BestFit(serverTags []bson.D) *mongoServer { - var best *mongoServer - for _, next := range servers.slice { - if best == nil { - best = next - best.RLock() - if serverTags != nil && !next.info.Mongos && !best.hasTags(serverTags) { - best.RUnlock() - best = nil - } - continue - } - next.RLock() - swap := false - switch { - case serverTags != nil && !next.info.Mongos && !next.hasTags(serverTags): - // Must have requested tags. - case next.info.Master != best.info.Master: - // Prefer slaves. - swap = best.info.Master - case absDuration(next.pingValue-best.pingValue) > 15*time.Millisecond: - // Prefer nearest server. - swap = next.pingValue < best.pingValue - case len(next.liveSockets)-len(next.unusedSockets) < len(best.liveSockets)-len(best.unusedSockets): - // Prefer servers with less connections. - swap = true - } - if swap { - best.RUnlock() - best = next - } else { - next.RUnlock() - } - } - if best != nil { - best.RUnlock() - } - return best -} - -func absDuration(d time.Duration) time.Duration { - if d < 0 { - return -d - } - return d -} diff --git a/vendor/gopkg.in/mgo.v2/session.go b/vendor/gopkg.in/mgo.v2/session.go deleted file mode 100644 index 036f44a63..000000000 --- a/vendor/gopkg.in/mgo.v2/session.go +++ /dev/null @@ -1,4224 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// 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 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 mgo - -import ( - "crypto/md5" - "encoding/hex" - "errors" - "fmt" - "math" - "net" - "net/url" - "reflect" - "sort" - "strconv" - "strings" - "sync" - "time" - - "gopkg.in/mgo.v2/bson" -) - -type mode int - -const ( - Eventual mode = 0 - Monotonic mode = 1 - Strong mode = 2 -) - -// When changing the Session type, check if newSession and copySession -// need to be updated too. - -type Session struct { - m sync.RWMutex - cluster_ *mongoCluster - slaveSocket *mongoSocket - masterSocket *mongoSocket - slaveOk bool - consistency mode - queryConfig query - safeOp *queryOp - syncTimeout time.Duration - sockTimeout time.Duration - defaultdb string - sourcedb string - dialCred *Credential - creds []Credential - poolLimit int -} - -type Database struct { - Session *Session - Name string -} - -type Collection struct { - Database *Database - Name string // "collection" - FullName string // "db.collection" -} - -type Query struct { - m sync.Mutex - session *Session - query // Enables default settings in session. -} - -type query struct { - op queryOp - prefetch float64 - limit int32 -} - -type getLastError struct { - CmdName int "getLastError,omitempty" - W interface{} "w,omitempty" - WTimeout int "wtimeout,omitempty" - FSync bool "fsync,omitempty" - J bool "j,omitempty" -} - -type Iter struct { - m sync.Mutex - gotReply sync.Cond - session *Session - server *mongoServer - docData queue - err error - op getMoreOp - prefetch float64 - limit int32 - docsToReceive int - docsBeforeMore int - timeout time.Duration - timedout bool -} - -var ( - ErrNotFound = errors.New("not found") - ErrCursor = errors.New("invalid cursor") -) - -const defaultPrefetch = 0.25 - -// Dial establishes a new session to the cluster identified by the given seed -// server(s). The session will enable communication with all of the servers in -// the cluster, so the seed servers are used only to find out about the cluster -// topology. -// -// Dial will timeout after 10 seconds if a server isn't reached. The returned -// session will timeout operations after one minute by default if servers -// aren't available. To customize the timeout, see DialWithTimeout, -// SetSyncTimeout, and SetSocketTimeout. -// -// This method is generally called just once for a given cluster. Further -// sessions to the same cluster are then established using the New or Copy -// methods on the obtained session. This will make them share the underlying -// cluster, and manage the pool of connections appropriately. -// -// Once the session is not useful anymore, Close must be called to release the -// resources appropriately. -// -// The seed servers must be provided in the following format: -// -// [mongodb://][user:pass@]host1[:port1][,host2[:port2],...][/database][?options] -// -// For example, it may be as simple as: -// -// localhost -// -// Or more involved like: -// -// mongodb://myuser:mypass@localhost:40001,otherhost:40001/mydb -// -// If the port number is not provided for a server, it defaults to 27017. -// -// The username and password provided in the URL will be used to authenticate -// into the database named after the slash at the end of the host names, or -// into the "admin" database if none is provided. The authentication information -// will persist in sessions obtained through the New method as well. -// -// The following connection options are supported after the question mark: -// -// connect=direct -// -// Disables the automatic replica set server discovery logic, and -// forces the use of servers provided only (even if secondaries). -// Note that to talk to a secondary the consistency requirements -// must be relaxed to Monotonic or Eventual via SetMode. -// -// -// authSource= -// -// Informs the database used to establish credentials and privileges -// with a MongoDB server. Defaults to the database name provided via -// the URL path, and "admin" if that's unset. -// -// -// authMechanism= -// -// Defines the protocol for credential negotiation. Defaults to "MONGODB-CR", -// which is the default username/password challenge-response mechanism. -// -// -// gssapiServiceName= -// -// Defines the service name to use when authenticating with the GSSAPI -// mechanism. Defaults to "mongodb". -// -// maxPoolSize= -// -// Defines the per-server socket pool limit. Defaults to 4096. -// See Session.SetPoolLimit for details. -// -// -// Relevant documentation: -// -// http://docs.mongodb.org/manual/reference/connection-string/ -// -func Dial(url string) (*Session, error) { - session, err := DialWithTimeout(url, 10*time.Second) - if err == nil { - session.SetSyncTimeout(1 * time.Minute) - session.SetSocketTimeout(1 * time.Minute) - } - return session, err -} - -// DialWithTimeout works like Dial, but uses timeout as the amount of time to -// wait for a server to respond when first connecting and also on follow up -// operations in the session. If timeout is zero, the call may block -// forever waiting for a connection to be made. -// -// See SetSyncTimeout for customizing the timeout for the session. -func DialWithTimeout(url string, timeout time.Duration) (*Session, error) { - info, err := ParseURL(url) - if err != nil { - return nil, err - } - info.Timeout = timeout - return DialWithInfo(info) -} - -// ParseURL parses a MongoDB URL as accepted by the Dial function and returns -// a value suitable for providing into DialWithInfo. -// -// See Dial for more details on the format of url. -func ParseURL(url string) (*DialInfo, error) { - uinfo, err := extractURL(url) - if err != nil { - return nil, err - } - direct := false - mechanism := "" - service := "" - source := "" - setName := "" - poolLimit := 0 - for k, v := range uinfo.options { - switch k { - case "authSource": - source = v - case "authMechanism": - mechanism = v - case "gssapiServiceName": - service = v - case "replicaSet": - setName = v - case "maxPoolSize": - poolLimit, err = strconv.Atoi(v) - if err != nil { - return nil, errors.New("bad value for maxPoolSize: " + v) - } - case "connect": - if v == "direct" { - direct = true - break - } - if v == "replicaSet" { - break - } - fallthrough - default: - return nil, errors.New("unsupported connection URL option: " + k + "=" + v) - } - } - info := DialInfo{ - Addrs: uinfo.addrs, - Direct: direct, - Database: uinfo.db, - Username: uinfo.user, - Password: uinfo.pass, - Mechanism: mechanism, - Service: service, - Source: source, - PoolLimit: poolLimit, - ReplicaSetName: setName, - } - return &info, nil -} - -// DialInfo holds options for establishing a session with a MongoDB cluster. -// To use a URL, see the Dial function. -type DialInfo struct { - // Addrs holds the addresses for the seed servers. - Addrs []string - - // Direct informs whether to establish connections only with the - // specified seed servers, or to obtain information for the whole - // cluster and establish connections with further servers too. - Direct bool - - // Timeout is the amount of time to wait for a server to respond when - // first connecting and on follow up operations in the session. If - // timeout is zero, the call may block forever waiting for a connection - // to be established. - Timeout time.Duration - - // FailFast will cause connection and query attempts to fail faster when - // the server is unavailable, instead of retrying until the configured - // timeout period. Note that an unavailable server may silently drop - // packets instead of rejecting them, in which case it's impossible to - // distinguish it from a slow server, so the timeout stays relevant. - FailFast bool - - // Database is the default database name used when the Session.DB method - // is called with an empty name, and is also used during the intial - // authentication if Source is unset. - Database string - - // ReplicaSetName, if specified, will prevent the obtained session from - // communicating with any server which is not part of a replica set - // with the given name. The default is to communicate with any server - // specified or discovered via the servers contacted. - ReplicaSetName string - - // Source is the database used to establish credentials and privileges - // with a MongoDB server. Defaults to the value of Database, if that is - // set, or "admin" otherwise. - Source string - - // Service defines the service name to use when authenticating with the GSSAPI - // mechanism. Defaults to "mongodb". - Service string - - // ServiceHost defines which hostname to use when authenticating - // with the GSSAPI mechanism. If not specified, defaults to the MongoDB - // server's address. - ServiceHost string - - // Mechanism defines the protocol for credential negotiation. - // Defaults to "MONGODB-CR". - Mechanism string - - // Username and Password inform the credentials for the initial authentication - // done on the database defined by the Source field. See Session.Login. - Username string - Password string - - // PoolLimit defines the per-server socket pool limit. Defaults to 4096. - // See Session.SetPoolLimit for details. - PoolLimit int - - // DialServer optionally specifies the dial function for establishing - // connections with the MongoDB servers. - DialServer func(addr *ServerAddr) (net.Conn, error) - - // WARNING: This field is obsolete. See DialServer above. - Dial func(addr net.Addr) (net.Conn, error) -} - -// ServerAddr represents the address for establishing a connection to an -// individual MongoDB server. -type ServerAddr struct { - str string - tcp *net.TCPAddr -} - -// String returns the address that was provided for the server before resolution. -func (addr *ServerAddr) String() string { - return addr.str -} - -// TCPAddr returns the resolved TCP address for the server. -func (addr *ServerAddr) TCPAddr() *net.TCPAddr { - return addr.tcp -} - -// DialWithInfo establishes a new session to the cluster identified by info. -func DialWithInfo(info *DialInfo) (*Session, error) { - addrs := make([]string, len(info.Addrs)) - for i, addr := range info.Addrs { - p := strings.LastIndexAny(addr, "]:") - if p == -1 || addr[p] != ':' { - // XXX This is untested. The test suite doesn't use the standard port. - addr += ":27017" - } - addrs[i] = addr - } - cluster := newCluster(addrs, info.Direct, info.FailFast, dialer{info.Dial, info.DialServer}, info.ReplicaSetName) - session := newSession(Eventual, cluster, info.Timeout) - session.defaultdb = info.Database - if session.defaultdb == "" { - session.defaultdb = "test" - } - session.sourcedb = info.Source - if session.sourcedb == "" { - session.sourcedb = info.Database - if session.sourcedb == "" { - session.sourcedb = "admin" - } - } - if info.Username != "" { - source := session.sourcedb - if info.Source == "" && - (info.Mechanism == "GSSAPI" || info.Mechanism == "PLAIN" || info.Mechanism == "MONGODB-X509") { - source = "$external" - } - session.dialCred = &Credential{ - Username: info.Username, - Password: info.Password, - Mechanism: info.Mechanism, - Service: info.Service, - ServiceHost: info.ServiceHost, - Source: source, - } - session.creds = []Credential{*session.dialCred} - } - if info.PoolLimit > 0 { - session.poolLimit = info.PoolLimit - } - cluster.Release() - - // People get confused when we return a session that is not actually - // established to any servers yet (e.g. what if url was wrong). So, - // ping the server to ensure there's someone there, and abort if it - // fails. - if err := session.Ping(); err != nil { - session.Close() - return nil, err - } - session.SetMode(Strong, true) - return session, nil -} - -func isOptSep(c rune) bool { - return c == ';' || c == '&' -} - -type urlInfo struct { - addrs []string - user string - pass string - db string - options map[string]string -} - -func extractURL(s string) (*urlInfo, error) { - if strings.HasPrefix(s, "mongodb://") { - s = s[10:] - } - info := &urlInfo{options: make(map[string]string)} - if c := strings.Index(s, "?"); c != -1 { - for _, pair := range strings.FieldsFunc(s[c+1:], isOptSep) { - l := strings.SplitN(pair, "=", 2) - if len(l) != 2 || l[0] == "" || l[1] == "" { - return nil, errors.New("connection option must be key=value: " + pair) - } - info.options[l[0]] = l[1] - } - s = s[:c] - } - if c := strings.Index(s, "@"); c != -1 { - pair := strings.SplitN(s[:c], ":", 2) - if len(pair) > 2 || pair[0] == "" { - return nil, errors.New("credentials must be provided as user:pass@host") - } - var err error - info.user, err = url.QueryUnescape(pair[0]) - if err != nil { - return nil, fmt.Errorf("cannot unescape username in URL: %q", pair[0]) - } - if len(pair) > 1 { - info.pass, err = url.QueryUnescape(pair[1]) - if err != nil { - return nil, fmt.Errorf("cannot unescape password in URL") - } - } - s = s[c+1:] - } - if c := strings.Index(s, "/"); c != -1 { - info.db = s[c+1:] - s = s[:c] - } - info.addrs = strings.Split(s, ",") - return info, nil -} - -func newSession(consistency mode, cluster *mongoCluster, timeout time.Duration) (session *Session) { - cluster.Acquire() - session = &Session{ - cluster_: cluster, - syncTimeout: timeout, - sockTimeout: timeout, - poolLimit: 4096, - } - debugf("New session %p on cluster %p", session, cluster) - session.SetMode(consistency, true) - session.SetSafe(&Safe{}) - session.queryConfig.prefetch = defaultPrefetch - return session -} - -func copySession(session *Session, keepCreds bool) (s *Session) { - cluster := session.cluster() - cluster.Acquire() - if session.masterSocket != nil { - session.masterSocket.Acquire() - } - if session.slaveSocket != nil { - session.slaveSocket.Acquire() - } - var creds []Credential - if keepCreds { - creds = make([]Credential, len(session.creds)) - copy(creds, session.creds) - } else if session.dialCred != nil { - creds = []Credential{*session.dialCred} - } - scopy := *session - scopy.m = sync.RWMutex{} - scopy.creds = creds - s = &scopy - debugf("New session %p on cluster %p (copy from %p)", s, cluster, session) - return s -} - -// LiveServers returns a list of server addresses which are -// currently known to be alive. -func (s *Session) LiveServers() (addrs []string) { - s.m.RLock() - addrs = s.cluster().LiveServers() - s.m.RUnlock() - return addrs -} - -// DB returns a value representing the named database. If name -// is empty, the database name provided in the dialed URL is -// used instead. If that is also empty, "test" is used as a -// fallback in a way equivalent to the mongo shell. -// -// Creating this value is a very lightweight operation, and -// involves no network communication. -func (s *Session) DB(name string) *Database { - if name == "" { - name = s.defaultdb - } - return &Database{s, name} -} - -// C returns a value representing the named collection. -// -// Creating this value is a very lightweight operation, and -// involves no network communication. -func (db *Database) C(name string) *Collection { - return &Collection{db, name, db.Name + "." + name} -} - -// With returns a copy of db that uses session s. -func (db *Database) With(s *Session) *Database { - newdb := *db - newdb.Session = s - return &newdb -} - -// With returns a copy of c that uses session s. -func (c *Collection) With(s *Session) *Collection { - newdb := *c.Database - newdb.Session = s - newc := *c - newc.Database = &newdb - return &newc -} - -// GridFS returns a GridFS value representing collections in db that -// follow the standard GridFS specification. -// The provided prefix (sometimes known as root) will determine which -// collections to use, and is usually set to "fs" when there is a -// single GridFS in the database. -// -// See the GridFS Create, Open, and OpenId methods for more details. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/GridFS -// http://www.mongodb.org/display/DOCS/GridFS+Tools -// http://www.mongodb.org/display/DOCS/GridFS+Specification -// -func (db *Database) GridFS(prefix string) *GridFS { - return newGridFS(db, prefix) -} - -// Run issues the provided command on the db database and unmarshals -// its result in the respective argument. The cmd argument may be either -// a string with the command name itself, in which case an empty document of -// the form bson.M{cmd: 1} will be used, or it may be a full command document. -// -// Note that MongoDB considers the first marshalled key as the command -// name, so when providing a command with options, it's important to -// use an ordering-preserving document, such as a struct value or an -// instance of bson.D. For instance: -// -// db.Run(bson.D{{"create", "mycollection"}, {"size", 1024}}) -// -// For privilleged commands typically run on the "admin" database, see -// the Run method in the Session type. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Commands -// http://www.mongodb.org/display/DOCS/List+of+Database+CommandSkips -// -func (db *Database) Run(cmd interface{}, result interface{}) error { - socket, err := db.Session.acquireSocket(true) - if err != nil { - return err - } - defer socket.Release() - - // This is an optimized form of db.C("$cmd").Find(cmd).One(result). - return db.run(socket, cmd, result) -} - -// Credential holds details to authenticate with a MongoDB server. -type Credential struct { - // Username and Password hold the basic details for authentication. - // Password is optional with some authentication mechanisms. - Username string - Password string - - // Source is the database used to establish credentials and privileges - // with a MongoDB server. Defaults to the default database provided - // during dial, or "admin" if that was unset. - Source string - - // Service defines the service name to use when authenticating with the GSSAPI - // mechanism. Defaults to "mongodb". - Service string - - // ServiceHost defines which hostname to use when authenticating - // with the GSSAPI mechanism. If not specified, defaults to the MongoDB - // server's address. - ServiceHost string - - // Mechanism defines the protocol for credential negotiation. - // Defaults to "MONGODB-CR". - Mechanism string -} - -// Login authenticates with MongoDB using the provided credential. The -// authentication is valid for the whole session and will stay valid until -// Logout is explicitly called for the same database, or the session is -// closed. -func (db *Database) Login(user, pass string) error { - return db.Session.Login(&Credential{Username: user, Password: pass, Source: db.Name}) -} - -// Login authenticates with MongoDB using the provided credential. The -// authentication is valid for the whole session and will stay valid until -// Logout is explicitly called for the same database, or the session is -// closed. -func (s *Session) Login(cred *Credential) error { - socket, err := s.acquireSocket(true) - if err != nil { - return err - } - defer socket.Release() - - credCopy := *cred - if cred.Source == "" { - if cred.Mechanism == "GSSAPI" { - credCopy.Source = "$external" - } else { - credCopy.Source = s.sourcedb - } - } - err = socket.Login(credCopy) - if err != nil { - return err - } - - s.m.Lock() - s.creds = append(s.creds, credCopy) - s.m.Unlock() - return nil -} - -func (s *Session) socketLogin(socket *mongoSocket) error { - for _, cred := range s.creds { - if err := socket.Login(cred); err != nil { - return err - } - } - return nil -} - -// Logout removes any established authentication credentials for the database. -func (db *Database) Logout() { - session := db.Session - dbname := db.Name - session.m.Lock() - found := false - for i, cred := range session.creds { - if cred.Source == dbname { - copy(session.creds[i:], session.creds[i+1:]) - session.creds = session.creds[:len(session.creds)-1] - found = true - break - } - } - if found { - if session.masterSocket != nil { - session.masterSocket.Logout(dbname) - } - if session.slaveSocket != nil { - session.slaveSocket.Logout(dbname) - } - } - session.m.Unlock() -} - -// LogoutAll removes all established authentication credentials for the session. -func (s *Session) LogoutAll() { - s.m.Lock() - for _, cred := range s.creds { - if s.masterSocket != nil { - s.masterSocket.Logout(cred.Source) - } - if s.slaveSocket != nil { - s.slaveSocket.Logout(cred.Source) - } - } - s.creds = s.creds[0:0] - s.m.Unlock() -} - -// User represents a MongoDB user. -// -// Relevant documentation: -// -// http://docs.mongodb.org/manual/reference/privilege-documents/ -// http://docs.mongodb.org/manual/reference/user-privileges/ -// -type User struct { - // Username is how the user identifies itself to the system. - Username string `bson:"user"` - - // Password is the plaintext password for the user. If set, - // the UpsertUser method will hash it into PasswordHash and - // unset it before the user is added to the database. - Password string `bson:",omitempty"` - - // PasswordHash is the MD5 hash of Username+":mongo:"+Password. - PasswordHash string `bson:"pwd,omitempty"` - - // CustomData holds arbitrary data admins decide to associate - // with this user, such as the full name or employee id. - CustomData interface{} `bson:"customData,omitempty"` - - // Roles indicates the set of roles the user will be provided. - // See the Role constants. - Roles []Role `bson:"roles"` - - // OtherDBRoles allows assigning roles in other databases from - // user documents inserted in the admin database. This field - // only works in the admin database. - OtherDBRoles map[string][]Role `bson:"otherDBRoles,omitempty"` - - // UserSource indicates where to look for this user's credentials. - // It may be set to a database name, or to "$external" for - // consulting an external resource such as Kerberos. UserSource - // must not be set if Password or PasswordHash are present. - // - // WARNING: This setting was only ever supported in MongoDB 2.4, - // and is now obsolete. - UserSource string `bson:"userSource,omitempty"` -} - -type Role string - -const ( - // Relevant documentation: - // - // http://docs.mongodb.org/manual/reference/user-privileges/ - // - RoleRoot Role = "root" - RoleRead Role = "read" - RoleReadAny Role = "readAnyDatabase" - RoleReadWrite Role = "readWrite" - RoleReadWriteAny Role = "readWriteAnyDatabase" - RoleDBAdmin Role = "dbAdmin" - RoleDBAdminAny Role = "dbAdminAnyDatabase" - RoleUserAdmin Role = "userAdmin" - RoleUserAdminAny Role = "userAdminAnyDatabase" - RoleClusterAdmin Role = "clusterAdmin" -) - -// UpsertUser updates the authentication credentials and the roles for -// a MongoDB user within the db database. If the named user doesn't exist -// it will be created. -// -// This method should only be used from MongoDB 2.4 and on. For older -// MongoDB releases, use the obsolete AddUser method instead. -// -// Relevant documentation: -// -// http://docs.mongodb.org/manual/reference/user-privileges/ -// http://docs.mongodb.org/manual/reference/privilege-documents/ -// -func (db *Database) UpsertUser(user *User) error { - if user.Username == "" { - return fmt.Errorf("user has no Username") - } - if (user.Password != "" || user.PasswordHash != "") && user.UserSource != "" { - return fmt.Errorf("user has both Password/PasswordHash and UserSource set") - } - if len(user.OtherDBRoles) > 0 && db.Name != "admin" && db.Name != "$external" { - return fmt.Errorf("user with OtherDBRoles is only supported in the admin or $external databases") - } - - // Attempt to run this using 2.6+ commands. - rundb := db - if user.UserSource != "" { - // Compatibility logic for the userSource field of MongoDB <= 2.4.X - rundb = db.Session.DB(user.UserSource) - } - err := rundb.runUserCmd("updateUser", user) - // retry with createUser when isAuthError in order to enable the "localhost exception" - if isNotFound(err) || isAuthError(err) { - return rundb.runUserCmd("createUser", user) - } - if !isNoCmd(err) { - return err - } - - // Command does not exist. Fallback to pre-2.6 behavior. - var set, unset bson.D - if user.Password != "" { - psum := md5.New() - psum.Write([]byte(user.Username + ":mongo:" + user.Password)) - set = append(set, bson.DocElem{"pwd", hex.EncodeToString(psum.Sum(nil))}) - unset = append(unset, bson.DocElem{"userSource", 1}) - } else if user.PasswordHash != "" { - set = append(set, bson.DocElem{"pwd", user.PasswordHash}) - unset = append(unset, bson.DocElem{"userSource", 1}) - } - if user.UserSource != "" { - set = append(set, bson.DocElem{"userSource", user.UserSource}) - unset = append(unset, bson.DocElem{"pwd", 1}) - } - if user.Roles != nil || user.OtherDBRoles != nil { - set = append(set, bson.DocElem{"roles", user.Roles}) - if len(user.OtherDBRoles) > 0 { - set = append(set, bson.DocElem{"otherDBRoles", user.OtherDBRoles}) - } else { - unset = append(unset, bson.DocElem{"otherDBRoles", 1}) - } - } - users := db.C("system.users") - err = users.Update(bson.D{{"user", user.Username}}, bson.D{{"$unset", unset}, {"$set", set}}) - if err == ErrNotFound { - set = append(set, bson.DocElem{"user", user.Username}) - if user.Roles == nil && user.OtherDBRoles == nil { - // Roles must be sent, as it's the way MongoDB distinguishes - // old-style documents from new-style documents in pre-2.6. - set = append(set, bson.DocElem{"roles", user.Roles}) - } - err = users.Insert(set) - } - return err -} - -func isNoCmd(err error) bool { - e, ok := err.(*QueryError) - return ok && (e.Code == 59 || e.Code == 13390 || strings.HasPrefix(e.Message, "no such cmd:")) -} - -func isNotFound(err error) bool { - e, ok := err.(*QueryError) - return ok && e.Code == 11 -} - -func isAuthError(err error) bool { - e, ok := err.(*QueryError) - return ok && e.Code == 13 -} - -func (db *Database) runUserCmd(cmdName string, user *User) error { - cmd := make(bson.D, 0, 16) - cmd = append(cmd, bson.DocElem{cmdName, user.Username}) - if user.Password != "" { - cmd = append(cmd, bson.DocElem{"pwd", user.Password}) - } - var roles []interface{} - for _, role := range user.Roles { - roles = append(roles, role) - } - for db, dbroles := range user.OtherDBRoles { - for _, role := range dbroles { - roles = append(roles, bson.D{{"role", role}, {"db", db}}) - } - } - if roles != nil || user.Roles != nil || cmdName == "createUser" { - cmd = append(cmd, bson.DocElem{"roles", roles}) - } - err := db.Run(cmd, nil) - if !isNoCmd(err) && user.UserSource != "" && (user.UserSource != "$external" || db.Name != "$external") { - return fmt.Errorf("MongoDB 2.6+ does not support the UserSource setting") - } - return err -} - -// AddUser creates or updates the authentication credentials of user within -// the db database. -// -// WARNING: This method is obsolete and should only be used with MongoDB 2.2 -// or earlier. For MongoDB 2.4 and on, use UpsertUser instead. -func (db *Database) AddUser(username, password string, readOnly bool) error { - // Try to emulate the old behavior on 2.6+ - user := &User{Username: username, Password: password} - if db.Name == "admin" { - if readOnly { - user.Roles = []Role{RoleReadAny} - } else { - user.Roles = []Role{RoleReadWriteAny} - } - } else { - if readOnly { - user.Roles = []Role{RoleRead} - } else { - user.Roles = []Role{RoleReadWrite} - } - } - err := db.runUserCmd("updateUser", user) - if isNotFound(err) { - return db.runUserCmd("createUser", user) - } - if !isNoCmd(err) { - return err - } - - // Command doesn't exist. Fallback to pre-2.6 behavior. - psum := md5.New() - psum.Write([]byte(username + ":mongo:" + password)) - digest := hex.EncodeToString(psum.Sum(nil)) - c := db.C("system.users") - _, err = c.Upsert(bson.M{"user": username}, bson.M{"$set": bson.M{"user": username, "pwd": digest, "readOnly": readOnly}}) - return err -} - -// RemoveUser removes the authentication credentials of user from the database. -func (db *Database) RemoveUser(user string) error { - err := db.Run(bson.D{{"dropUser", user}}, nil) - if isNoCmd(err) { - users := db.C("system.users") - return users.Remove(bson.M{"user": user}) - } - if isNotFound(err) { - return ErrNotFound - } - return err -} - -type indexSpec struct { - Name, NS string - Key bson.D - Unique bool ",omitempty" - DropDups bool "dropDups,omitempty" - Background bool ",omitempty" - Sparse bool ",omitempty" - Bits, Min, Max int ",omitempty" - BucketSize float64 "bucketSize,omitempty" - ExpireAfter int "expireAfterSeconds,omitempty" - Weights bson.D ",omitempty" - DefaultLanguage string "default_language,omitempty" - LanguageOverride string "language_override,omitempty" -} - -type Index struct { - Key []string // Index key fields; prefix name with dash (-) for descending order - Unique bool // Prevent two documents from having the same index key - DropDups bool // Drop documents with the same index key as a previously indexed one - Background bool // Build index in background and return immediately - Sparse bool // Only index documents containing the Key fields - - // If ExpireAfter is defined the server will periodically delete - // documents with indexed time.Time older than the provided delta. - ExpireAfter time.Duration - - // Name holds the stored index name. On creation this field is ignored and the index name - // is automatically computed by EnsureIndex based on the index key - Name string - - // Properties for spatial indexes. - Bits, Min, Max int - BucketSize float64 - - // Properties for text indexes. - DefaultLanguage string - LanguageOverride string - - // Weights defines the significance of provided fields relative to other - // fields in a text index. The score for a given word in a document is derived - // from the weighted sum of the frequency for each of the indexed fields in - // that document. The default field weight is 1. - Weights map[string]int -} - -type indexKeyInfo struct { - name string - key bson.D - weights bson.D -} - -func parseIndexKey(key []string) (*indexKeyInfo, error) { - var keyInfo indexKeyInfo - isText := false - var order interface{} - for _, field := range key { - raw := field - if keyInfo.name != "" { - keyInfo.name += "_" - } - var kind string - if field != "" { - if field[0] == '$' { - if c := strings.Index(field, ":"); c > 1 && c < len(field)-1 { - kind = field[1:c] - field = field[c+1:] - keyInfo.name += field + "_" + kind - } else { - field = "\x00" - } - } - switch field[0] { - case 0: - // Logic above failed. Reset and error. - field = "" - case '@': - order = "2d" - field = field[1:] - // The shell used to render this field as key_ instead of key_2d, - // and mgo followed suit. This has been fixed in recent server - // releases, and mgo followed as well. - keyInfo.name += field + "_2d" - case '-': - order = -1 - field = field[1:] - keyInfo.name += field + "_-1" - case '+': - field = field[1:] - fallthrough - default: - if kind == "" { - order = 1 - keyInfo.name += field + "_1" - } else { - order = kind - } - } - } - if field == "" || kind != "" && order != kind { - return nil, fmt.Errorf(`invalid index key: want "[$:][-]", got %q`, raw) - } - if kind == "text" { - if !isText { - keyInfo.key = append(keyInfo.key, bson.DocElem{"_fts", "text"}, bson.DocElem{"_ftsx", 1}) - isText = true - } - keyInfo.weights = append(keyInfo.weights, bson.DocElem{field, 1}) - } else { - keyInfo.key = append(keyInfo.key, bson.DocElem{field, order}) - } - } - if keyInfo.name == "" { - return nil, errors.New("invalid index key: no fields provided") - } - return &keyInfo, nil -} - -// EnsureIndexKey ensures an index with the given key exists, creating it -// if necessary. -// -// This example: -// -// err := collection.EnsureIndexKey("a", "b") -// -// Is equivalent to: -// -// err := collection.EnsureIndex(mgo.Index{Key: []string{"a", "b"}}) -// -// See the EnsureIndex method for more details. -func (c *Collection) EnsureIndexKey(key ...string) error { - return c.EnsureIndex(Index{Key: key}) -} - -// EnsureIndex ensures an index with the given key exists, creating it with -// the provided parameters if necessary. EnsureIndex does not modify a previously -// existent index with a matching key. The old index must be dropped first instead. -// -// Once EnsureIndex returns successfully, following requests for the same index -// will not contact the server unless Collection.DropIndex is used to drop the -// same index, or Session.ResetIndexCache is called. -// -// For example: -// -// index := Index{ -// Key: []string{"lastname", "firstname"}, -// Unique: true, -// DropDups: true, -// Background: true, // See notes. -// Sparse: true, -// } -// err := collection.EnsureIndex(index) -// -// The Key value determines which fields compose the index. The index ordering -// will be ascending by default. To obtain an index with a descending order, -// the field name should be prefixed by a dash (e.g. []string{"-time"}). It can -// also be optionally prefixed by an index kind, as in "$text:summary" or -// "$2d:-point". The key string format is: -// -// [$:][-] -// -// If the Unique field is true, the index must necessarily contain only a single -// document per Key. With DropDups set to true, documents with the same key -// as a previously indexed one will be dropped rather than an error returned. -// -// If Background is true, other connections will be allowed to proceed using -// the collection without the index while it's being built. Note that the -// session executing EnsureIndex will be blocked for as long as it takes for -// the index to be built. -// -// If Sparse is true, only documents containing the provided Key fields will be -// included in the index. When using a sparse index for sorting, only indexed -// documents will be returned. -// -// If ExpireAfter is non-zero, the server will periodically scan the collection -// and remove documents containing an indexed time.Time field with a value -// older than ExpireAfter. See the documentation for details: -// -// http://docs.mongodb.org/manual/tutorial/expire-data -// -// Other kinds of indexes are also supported through that API. Here is an example: -// -// index := Index{ -// Key: []string{"$2d:loc"}, -// Bits: 26, -// } -// err := collection.EnsureIndex(index) -// -// The example above requests the creation of a "2d" index for the "loc" field. -// -// The 2D index bounds may be changed using the Min and Max attributes of the -// Index value. The default bound setting of (-180, 180) is suitable for -// latitude/longitude pairs. -// -// The Bits parameter sets the precision of the 2D geohash values. If not -// provided, 26 bits are used, which is roughly equivalent to 1 foot of -// precision for the default (-180, 180) index bounds. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Indexes -// http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ -// http://www.mongodb.org/display/DOCS/Indexing+as+a+Background+Operation -// http://www.mongodb.org/display/DOCS/Geospatial+Indexing -// http://www.mongodb.org/display/DOCS/Multikeys -// -func (c *Collection) EnsureIndex(index Index) error { - keyInfo, err := parseIndexKey(index.Key) - if err != nil { - return err - } - - session := c.Database.Session - cacheKey := c.FullName + "\x00" + keyInfo.name - if session.cluster().HasCachedIndex(cacheKey) { - return nil - } - - spec := indexSpec{ - Name: keyInfo.name, - NS: c.FullName, - Key: keyInfo.key, - Unique: index.Unique, - DropDups: index.DropDups, - Background: index.Background, - Sparse: index.Sparse, - Bits: index.Bits, - Min: index.Min, - Max: index.Max, - BucketSize: index.BucketSize, - ExpireAfter: int(index.ExpireAfter / time.Second), - Weights: keyInfo.weights, - DefaultLanguage: index.DefaultLanguage, - LanguageOverride: index.LanguageOverride, - } - -NextField: - for name, weight := range index.Weights { - for i, elem := range spec.Weights { - if elem.Name == name { - spec.Weights[i].Value = weight - continue NextField - } - } - panic("weight provided for field that is not part of index key: " + name) - } - - cloned := session.Clone() - defer cloned.Close() - cloned.SetMode(Strong, false) - cloned.EnsureSafe(&Safe{}) - db := c.Database.With(cloned) - - // Try with a command first. - err = db.Run(bson.D{{"createIndexes", c.Name}, {"indexes", []indexSpec{spec}}}, nil) - if isNoCmd(err) { - // Command not yet supported. Insert into the indexes collection instead. - err = db.C("system.indexes").Insert(&spec) - } - if err == nil { - session.cluster().CacheIndex(cacheKey, true) - } - return err -} - -// DropIndex removes the index with key from the collection. -// -// The key value determines which fields compose the index. The index ordering -// will be ascending by default. To obtain an index with a descending order, -// the field name should be prefixed by a dash (e.g. []string{"-time"}). -// -// For example: -// -// err := collection.DropIndex("lastname", "firstname") -// -// See the EnsureIndex method for more details on indexes. -func (c *Collection) DropIndex(key ...string) error { - keyInfo, err := parseIndexKey(key) - if err != nil { - return err - } - - session := c.Database.Session - cacheKey := c.FullName + "\x00" + keyInfo.name - session.cluster().CacheIndex(cacheKey, false) - - session = session.Clone() - defer session.Close() - session.SetMode(Strong, false) - - db := c.Database.With(session) - result := struct { - ErrMsg string - Ok bool - }{} - err = db.Run(bson.D{{"dropIndexes", c.Name}, {"index", keyInfo.name}}, &result) - if err != nil { - return err - } - if !result.Ok { - return errors.New(result.ErrMsg) - } - return nil -} - -// Indexes returns a list of all indexes for the collection. -// -// For example, this snippet would drop all available indexes: -// -// indexes, err := collection.Indexes() -// if err != nil { -// return err -// } -// for _, index := range indexes { -// err = collection.DropIndex(index.Key...) -// if err != nil { -// return err -// } -// } -// -// See the EnsureIndex method for more details on indexes. -func (c *Collection) Indexes() (indexes []Index, err error) { - // Clone session and set it to Monotonic mode so that the server - // used for the query may be safely obtained afterwards, if - // necessary for iteration when a cursor is received. - session := c.Database.Session - cloned := session.Clone() - cloned.SetMode(Monotonic, false) - defer cloned.Close() - - batchSize := int(cloned.queryConfig.op.limit) - - // Try with a command. - var result struct { - Indexes []bson.Raw - - Cursor struct { - FirstBatch []bson.Raw "firstBatch" - NS string - Id int64 - } - } - var iter *Iter - err = c.Database.With(cloned).Run(bson.D{{"listIndexes", c.Name}, {"cursor", bson.D{{"batchSize", batchSize}}}}, &result) - if err == nil { - firstBatch := result.Indexes - if firstBatch == nil { - firstBatch = result.Cursor.FirstBatch - } - ns := strings.SplitN(result.Cursor.NS, ".", 2) - if len(ns) < 2 { - iter = c.With(cloned).NewIter(nil, firstBatch, result.Cursor.Id, nil) - } else { - iter = cloned.DB(ns[0]).C(ns[1]).NewIter(nil, firstBatch, result.Cursor.Id, nil) - } - } else if isNoCmd(err) { - // Command not yet supported. Query the database instead. - iter = c.Database.C("system.indexes").Find(bson.M{"ns": c.FullName}).Iter() - } else { - return nil, err - } - - var spec indexSpec - for iter.Next(&spec) { - indexes = append(indexes, indexFromSpec(spec)) - } - if err = iter.Close(); err != nil { - return nil, err - } - sort.Sort(indexSlice(indexes)) - return indexes, nil -} - -func indexFromSpec(spec indexSpec) Index { - return Index{ - Name: spec.Name, - Key: simpleIndexKey(spec.Key), - Unique: spec.Unique, - DropDups: spec.DropDups, - Background: spec.Background, - Sparse: spec.Sparse, - ExpireAfter: time.Duration(spec.ExpireAfter) * time.Second, - } -} - -type indexSlice []Index - -func (idxs indexSlice) Len() int { return len(idxs) } -func (idxs indexSlice) Less(i, j int) bool { return idxs[i].Name < idxs[j].Name } -func (idxs indexSlice) Swap(i, j int) { idxs[i], idxs[j] = idxs[j], idxs[i] } - -func simpleIndexKey(realKey bson.D) (key []string) { - for i := range realKey { - field := realKey[i].Name - vi, ok := realKey[i].Value.(int) - if !ok { - vf, _ := realKey[i].Value.(float64) - vi = int(vf) - } - if vi == 1 { - key = append(key, field) - continue - } - if vi == -1 { - key = append(key, "-"+field) - continue - } - if vs, ok := realKey[i].Value.(string); ok { - key = append(key, "$"+vs+":"+field) - continue - } - panic("Got unknown index key type for field " + field) - } - return -} - -// ResetIndexCache() clears the cache of previously ensured indexes. -// Following requests to EnsureIndex will contact the server. -func (s *Session) ResetIndexCache() { - s.cluster().ResetIndexCache() -} - -// New creates a new session with the same parameters as the original -// session, including consistency, batch size, prefetching, safety mode, -// etc. The returned session will use sockets from the pool, so there's -// a chance that writes just performed in another session may not yet -// be visible. -// -// Login information from the original session will not be copied over -// into the new session unless it was provided through the initial URL -// for the Dial function. -// -// See the Copy and Clone methods. -// -func (s *Session) New() *Session { - s.m.Lock() - scopy := copySession(s, false) - s.m.Unlock() - scopy.Refresh() - return scopy -} - -// Copy works just like New, but preserves the exact authentication -// information from the original session. -func (s *Session) Copy() *Session { - s.m.Lock() - scopy := copySession(s, true) - s.m.Unlock() - scopy.Refresh() - return scopy -} - -// Clone works just like Copy, but also reuses the same socket as the original -// session, in case it had already reserved one due to its consistency -// guarantees. This behavior ensures that writes performed in the old session -// are necessarily observed when using the new session, as long as it was a -// strong or monotonic session. That said, it also means that long operations -// may cause other goroutines using the original session to wait. -func (s *Session) Clone() *Session { - s.m.Lock() - scopy := copySession(s, true) - s.m.Unlock() - return scopy -} - -// Close terminates the session. It's a runtime error to use a session -// after it has been closed. -func (s *Session) Close() { - s.m.Lock() - if s.cluster_ != nil { - debugf("Closing session %p", s) - s.unsetSocket() - s.cluster_.Release() - s.cluster_ = nil - } - s.m.Unlock() -} - -func (s *Session) cluster() *mongoCluster { - if s.cluster_ == nil { - panic("Session already closed") - } - return s.cluster_ -} - -// Refresh puts back any reserved sockets in use and restarts the consistency -// guarantees according to the current consistency setting for the session. -func (s *Session) Refresh() { - s.m.Lock() - s.slaveOk = s.consistency != Strong - s.unsetSocket() - s.m.Unlock() -} - -// SetMode changes the consistency mode for the session. -// -// In the Strong consistency mode reads and writes will always be made to -// the primary server using a unique connection so that reads and writes are -// fully consistent, ordered, and observing the most up-to-date data. -// This offers the least benefits in terms of distributing load, but the -// most guarantees. See also Monotonic and Eventual. -// -// In the Monotonic consistency mode reads may not be entirely up-to-date, -// but they will always see the history of changes moving forward, the data -// read will be consistent across sequential queries in the same session, -// and modifications made within the session will be observed in following -// queries (read-your-writes). -// -// In practice, the Monotonic mode is obtained by performing initial reads -// on a unique connection to an arbitrary secondary, if one is available, -// and once the first write happens, the session connection is switched over -// to the primary server. This manages to distribute some of the reading -// load with secondaries, while maintaining some useful guarantees. -// -// In the Eventual consistency mode reads will be made to any secondary in the -// cluster, if one is available, and sequential reads will not necessarily -// be made with the same connection. This means that data may be observed -// out of order. Writes will of course be issued to the primary, but -// independent writes in the same Eventual session may also be made with -// independent connections, so there are also no guarantees in terms of -// write ordering (no read-your-writes guarantees either). -// -// The Eventual mode is the fastest and most resource-friendly, but is -// also the one offering the least guarantees about ordering of the data -// read and written. -// -// If refresh is true, in addition to ensuring the session is in the given -// consistency mode, the consistency guarantees will also be reset (e.g. -// a Monotonic session will be allowed to read from secondaries again). -// This is equivalent to calling the Refresh function. -// -// Shifting between Monotonic and Strong modes will keep a previously -// reserved connection for the session unless refresh is true or the -// connection is unsuitable (to a secondary server in a Strong session). -func (s *Session) SetMode(consistency mode, refresh bool) { - s.m.Lock() - debugf("Session %p: setting mode %d with refresh=%v (master=%p, slave=%p)", s, consistency, refresh, s.masterSocket, s.slaveSocket) - s.consistency = consistency - if refresh { - s.slaveOk = s.consistency != Strong - s.unsetSocket() - } else if s.consistency == Strong { - s.slaveOk = false - } else if s.masterSocket == nil { - s.slaveOk = true - } - s.m.Unlock() -} - -// Mode returns the current consistency mode for the session. -func (s *Session) Mode() mode { - s.m.RLock() - mode := s.consistency - s.m.RUnlock() - return mode -} - -// SetSyncTimeout sets the amount of time an operation with this session -// will wait before returning an error in case a connection to a usable -// server can't be established. Set it to zero to wait forever. The -// default value is 7 seconds. -func (s *Session) SetSyncTimeout(d time.Duration) { - s.m.Lock() - s.syncTimeout = d - s.m.Unlock() -} - -// SetSocketTimeout sets the amount of time to wait for a non-responding -// socket to the database before it is forcefully closed. -func (s *Session) SetSocketTimeout(d time.Duration) { - s.m.Lock() - s.sockTimeout = d - if s.masterSocket != nil { - s.masterSocket.SetTimeout(d) - } - if s.slaveSocket != nil { - s.slaveSocket.SetTimeout(d) - } - s.m.Unlock() -} - -// SetCursorTimeout changes the standard timeout period that the server -// enforces on created cursors. The only supported value right now is -// 0, which disables the timeout. The standard server timeout is 10 minutes. -func (s *Session) SetCursorTimeout(d time.Duration) { - s.m.Lock() - if d == 0 { - s.queryConfig.op.flags |= flagNoCursorTimeout - } else { - panic("SetCursorTimeout: only 0 (disable timeout) supported for now") - } - s.m.Unlock() -} - -// SetPoolLimit sets the maximum number of sockets in use in a single server -// before this session will block waiting for a socket to be available. -// The default limit is 4096. -// -// This limit must be set to cover more than any expected workload of the -// application. It is a bad practice and an unsupported use case to use the -// database driver to define the concurrency limit of an application. Prevent -// such concurrency "at the door" instead, by properly restricting the amount -// of used resources and number of goroutines before they are created. -func (s *Session) SetPoolLimit(limit int) { - s.m.Lock() - s.poolLimit = limit - s.m.Unlock() -} - -// SetBatch sets the default batch size used when fetching documents from the -// database. It's possible to change this setting on a per-query basis as -// well, using the Query.Batch method. -// -// The default batch size is defined by the database itself. As of this -// writing, MongoDB will use an initial size of min(100 docs, 4MB) on the -// first batch, and 4MB on remaining ones. -func (s *Session) SetBatch(n int) { - if n == 1 { - // Server interprets 1 as -1 and closes the cursor (!?) - n = 2 - } - s.m.Lock() - s.queryConfig.op.limit = int32(n) - s.m.Unlock() -} - -// SetPrefetch sets the default point at which the next batch of results will be -// requested. When there are p*batch_size remaining documents cached in an -// Iter, the next batch will be requested in background. For instance, when -// using this: -// -// session.SetBatch(200) -// session.SetPrefetch(0.25) -// -// and there are only 50 documents cached in the Iter to be processed, the -// next batch of 200 will be requested. It's possible to change this setting on -// a per-query basis as well, using the Prefetch method of Query. -// -// The default prefetch value is 0.25. -func (s *Session) SetPrefetch(p float64) { - s.m.Lock() - s.queryConfig.prefetch = p - s.m.Unlock() -} - -// See SetSafe for details on the Safe type. -type Safe struct { - W int // Min # of servers to ack before success - WMode string // Write mode for MongoDB 2.0+ (e.g. "majority") - WTimeout int // Milliseconds to wait for W before timing out - FSync bool // Should servers sync to disk before returning success - J bool // Wait for next group commit if journaling; no effect otherwise -} - -// Safe returns the current safety mode for the session. -func (s *Session) Safe() (safe *Safe) { - s.m.Lock() - defer s.m.Unlock() - if s.safeOp != nil { - cmd := s.safeOp.query.(*getLastError) - safe = &Safe{WTimeout: cmd.WTimeout, FSync: cmd.FSync, J: cmd.J} - switch w := cmd.W.(type) { - case string: - safe.WMode = w - case int: - safe.W = w - } - } - return -} - -// SetSafe changes the session safety mode. -// -// If the safe parameter is nil, the session is put in unsafe mode, and writes -// become fire-and-forget, without error checking. The unsafe mode is faster -// since operations won't hold on waiting for a confirmation. -// -// If the safe parameter is not nil, any changing query (insert, update, ...) -// will be followed by a getLastError command with the specified parameters, -// to ensure the request was correctly processed. -// -// The safe.W parameter determines how many servers should confirm a write -// before the operation is considered successful. If set to 0 or 1, the -// command will return as soon as the primary is done with the request. -// If safe.WTimeout is greater than zero, it determines how many milliseconds -// to wait for the safe.W servers to respond before returning an error. -// -// Starting with MongoDB 2.0.0 the safe.WMode parameter can be used instead -// of W to request for richer semantics. If set to "majority" the server will -// wait for a majority of members from the replica set to respond before -// returning. Custom modes may also be defined within the server to create -// very detailed placement schemas. See the data awareness documentation in -// the links below for more details (note that MongoDB internally reuses the -// "w" field name for WMode). -// -// If safe.FSync is true and journaling is disabled, the servers will be -// forced to sync all files to disk immediately before returning. If the -// same option is true but journaling is enabled, the server will instead -// await for the next group commit before returning. -// -// Since MongoDB 2.0.0, the safe.J option can also be used instead of FSync -// to force the server to wait for a group commit in case journaling is -// enabled. The option has no effect if the server has journaling disabled. -// -// For example, the following statement will make the session check for -// errors, without imposing further constraints: -// -// session.SetSafe(&mgo.Safe{}) -// -// The following statement will force the server to wait for a majority of -// members of a replica set to return (MongoDB 2.0+ only): -// -// session.SetSafe(&mgo.Safe{WMode: "majority"}) -// -// The following statement, on the other hand, ensures that at least two -// servers have flushed the change to disk before confirming the success -// of operations: -// -// session.EnsureSafe(&mgo.Safe{W: 2, FSync: true}) -// -// The following statement, on the other hand, disables the verification -// of errors entirely: -// -// session.SetSafe(nil) -// -// See also the EnsureSafe method. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/getLastError+Command -// http://www.mongodb.org/display/DOCS/Verifying+Propagation+of+Writes+with+getLastError -// http://www.mongodb.org/display/DOCS/Data+Center+Awareness -// -func (s *Session) SetSafe(safe *Safe) { - s.m.Lock() - s.safeOp = nil - s.ensureSafe(safe) - s.m.Unlock() -} - -// EnsureSafe compares the provided safety parameters with the ones -// currently in use by the session and picks the most conservative -// choice for each setting. -// -// That is: -// -// - safe.WMode is always used if set. -// - safe.W is used if larger than the current W and WMode is empty. -// - safe.FSync is always used if true. -// - safe.J is used if FSync is false. -// - safe.WTimeout is used if set and smaller than the current WTimeout. -// -// For example, the following statement will ensure the session is -// at least checking for errors, without enforcing further constraints. -// If a more conservative SetSafe or EnsureSafe call was previously done, -// the following call will be ignored. -// -// session.EnsureSafe(&mgo.Safe{}) -// -// See also the SetSafe method for details on what each option means. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/getLastError+Command -// http://www.mongodb.org/display/DOCS/Verifying+Propagation+of+Writes+with+getLastError -// http://www.mongodb.org/display/DOCS/Data+Center+Awareness -// -func (s *Session) EnsureSafe(safe *Safe) { - s.m.Lock() - s.ensureSafe(safe) - s.m.Unlock() -} - -func (s *Session) ensureSafe(safe *Safe) { - if safe == nil { - return - } - - var w interface{} - if safe.WMode != "" { - w = safe.WMode - } else if safe.W > 0 { - w = safe.W - } - - var cmd getLastError - if s.safeOp == nil { - cmd = getLastError{1, w, safe.WTimeout, safe.FSync, safe.J} - } else { - // Copy. We don't want to mutate the existing query. - cmd = *(s.safeOp.query.(*getLastError)) - if cmd.W == nil { - cmd.W = w - } else if safe.WMode != "" { - cmd.W = safe.WMode - } else if i, ok := cmd.W.(int); ok && safe.W > i { - cmd.W = safe.W - } - if safe.WTimeout > 0 && safe.WTimeout < cmd.WTimeout { - cmd.WTimeout = safe.WTimeout - } - if safe.FSync { - cmd.FSync = true - cmd.J = false - } else if safe.J && !cmd.FSync { - cmd.J = true - } - } - s.safeOp = &queryOp{ - query: &cmd, - collection: "admin.$cmd", - limit: -1, - } -} - -// Run issues the provided command on the "admin" database and -// and unmarshals its result in the respective argument. The cmd -// argument may be either a string with the command name itself, in -// which case an empty document of the form bson.M{cmd: 1} will be used, -// or it may be a full command document. -// -// Note that MongoDB considers the first marshalled key as the command -// name, so when providing a command with options, it's important to -// use an ordering-preserving document, such as a struct value or an -// instance of bson.D. For instance: -// -// db.Run(bson.D{{"create", "mycollection"}, {"size", 1024}}) -// -// For commands on arbitrary databases, see the Run method in -// the Database type. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Commands -// http://www.mongodb.org/display/DOCS/List+of+Database+CommandSkips -// -func (s *Session) Run(cmd interface{}, result interface{}) error { - return s.DB("admin").Run(cmd, result) -} - -// SelectServers restricts communication to servers configured with the -// given tags. For example, the following statement restricts servers -// used for reading operations to those with both tag "disk" set to -// "ssd" and tag "rack" set to 1: -// -// session.SelectSlaves(bson.D{{"disk", "ssd"}, {"rack", 1}}) -// -// Multiple sets of tags may be provided, in which case the used server -// must match all tags within any one set. -// -// If a connection was previously assigned to the session due to the -// current session mode (see Session.SetMode), the tag selection will -// only be enforced after the session is refreshed. -// -// Relevant documentation: -// -// http://docs.mongodb.org/manual/tutorial/configure-replica-set-tag-sets -// -func (s *Session) SelectServers(tags ...bson.D) { - s.m.Lock() - s.queryConfig.op.serverTags = tags - s.m.Unlock() -} - -// Ping runs a trivial ping command just to get in touch with the server. -func (s *Session) Ping() error { - return s.Run("ping", nil) -} - -// Fsync flushes in-memory writes to disk on the server the session -// is established with. If async is true, the call returns immediately, -// otherwise it returns after the flush has been made. -func (s *Session) Fsync(async bool) error { - return s.Run(bson.D{{"fsync", 1}, {"async", async}}, nil) -} - -// FsyncLock locks all writes in the specific server the session is -// established with and returns. Any writes attempted to the server -// after it is successfully locked will block until FsyncUnlock is -// called for the same server. -// -// This method works on secondaries as well, preventing the oplog from -// being flushed while the server is locked, but since only the server -// connected to is locked, for locking specific secondaries it may be -// necessary to establish a connection directly to the secondary (see -// Dial's connect=direct option). -// -// As an important caveat, note that once a write is attempted and -// blocks, follow up reads will block as well due to the way the -// lock is internally implemented in the server. More details at: -// -// https://jira.mongodb.org/browse/SERVER-4243 -// -// FsyncLock is often used for performing consistent backups of -// the database files on disk. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/fsync+Command -// http://www.mongodb.org/display/DOCS/Backups -// -func (s *Session) FsyncLock() error { - return s.Run(bson.D{{"fsync", 1}, {"lock", true}}, nil) -} - -// FsyncUnlock releases the server for writes. See FsyncLock for details. -func (s *Session) FsyncUnlock() error { - return s.DB("admin").C("$cmd.sys.unlock").Find(nil).One(nil) // WTF? -} - -// Find prepares a query using the provided document. The document may be a -// map or a struct value capable of being marshalled with bson. The map -// may be a generic one using interface{} for its key and/or values, such as -// bson.M, or it may be a properly typed map. Providing nil as the document -// is equivalent to providing an empty document such as bson.M{}. -// -// Further details of the query may be tweaked using the resulting Query value, -// and then executed to retrieve results using methods such as One, For, -// Iter, or Tail. -// -// In case the resulting document includes a field named $err or errmsg, which -// are standard ways for MongoDB to return query errors, the returned err will -// be set to a *QueryError value including the Err message and the Code. In -// those cases, the result argument is still unmarshalled into with the -// received document so that any other custom values may be obtained if -// desired. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Querying -// http://www.mongodb.org/display/DOCS/Advanced+Queries -// -func (c *Collection) Find(query interface{}) *Query { - session := c.Database.Session - session.m.RLock() - q := &Query{session: session, query: session.queryConfig} - session.m.RUnlock() - q.op.query = query - q.op.collection = c.FullName - return q -} - -type repairCmd struct { - RepairCursor string `bson:"repairCursor"` - Cursor *repairCmdCursor ",omitempty" -} - -type repairCmdCursor struct { - BatchSize int `bson:"batchSize,omitempty"` -} - -// Repair returns an iterator that goes over all recovered documents in the -// collection, in a best-effort manner. This is most useful when there are -// damaged data files. Multiple copies of the same document may be returned -// by the iterator. -// -// Repair is supported in MongoDB 2.7.8 and later. -func (c *Collection) Repair() *Iter { - // Clone session and set it to Monotonic mode so that the server - // used for the query may be safely obtained afterwards, if - // necessary for iteration when a cursor is received. - session := c.Database.Session - cloned := session.Clone() - cloned.SetMode(Monotonic, false) - defer cloned.Close() - - batchSize := int(cloned.queryConfig.op.limit) - - var result struct { - Cursor struct { - FirstBatch []bson.Raw "firstBatch" - Id int64 - } - } - - cmd := repairCmd{ - RepairCursor: c.Name, - Cursor: &repairCmdCursor{batchSize}, - } - - clonedc := c.With(cloned) - err := clonedc.Database.Run(cmd, &result) - return clonedc.NewIter(session, result.Cursor.FirstBatch, result.Cursor.Id, err) -} - -// FindId is a convenience helper equivalent to: -// -// query := collection.Find(bson.M{"_id": id}) -// -// See the Find method for more details. -func (c *Collection) FindId(id interface{}) *Query { - return c.Find(bson.D{{"_id", id}}) -} - -type Pipe struct { - session *Session - collection *Collection - pipeline interface{} - allowDisk bool - batchSize int -} - -type pipeCmd struct { - Aggregate string - Pipeline interface{} - Cursor *pipeCmdCursor ",omitempty" - Explain bool ",omitempty" - AllowDisk bool "allowDiskUse,omitempty" -} - -type pipeCmdCursor struct { - BatchSize int `bson:"batchSize,omitempty"` -} - -// Pipe prepares a pipeline to aggregate. The pipeline document -// must be a slice built in terms of the aggregation framework language. -// -// For example: -// -// pipe := collection.Pipe([]bson.M{{"$match": bson.M{"name": "Otavio"}}}) -// iter := pipe.Iter() -// -// Relevant documentation: -// -// http://docs.mongodb.org/manual/reference/aggregation -// http://docs.mongodb.org/manual/applications/aggregation -// http://docs.mongodb.org/manual/tutorial/aggregation-examples -// -func (c *Collection) Pipe(pipeline interface{}) *Pipe { - session := c.Database.Session - session.m.RLock() - batchSize := int(session.queryConfig.op.limit) - session.m.RUnlock() - return &Pipe{ - session: session, - collection: c, - pipeline: pipeline, - batchSize: batchSize, - } -} - -// Iter executes the pipeline and returns an iterator capable of going -// over all the generated results. -func (p *Pipe) Iter() *Iter { - // Clone session and set it to Monotonic mode so that the server - // used for the query may be safely obtained afterwards, if - // necessary for iteration when a cursor is received. - cloned := p.session.Clone() - cloned.SetMode(Monotonic, false) - defer cloned.Close() - c := p.collection.With(cloned) - - var result struct { - // 2.4, no cursors. - Result []bson.Raw - - // 2.6+, with cursors. - Cursor struct { - FirstBatch []bson.Raw "firstBatch" - Id int64 - } - } - - cmd := pipeCmd{ - Aggregate: c.Name, - Pipeline: p.pipeline, - AllowDisk: p.allowDisk, - Cursor: &pipeCmdCursor{p.batchSize}, - } - err := c.Database.Run(cmd, &result) - if e, ok := err.(*QueryError); ok && e.Message == `unrecognized field "cursor` { - cmd.Cursor = nil - cmd.AllowDisk = false - err = c.Database.Run(cmd, &result) - } - firstBatch := result.Result - if firstBatch == nil { - firstBatch = result.Cursor.FirstBatch - } - return c.NewIter(p.session, firstBatch, result.Cursor.Id, err) -} - -// NewIter returns a newly created iterator with the provided parameters. -// Using this method is not recommended unless the desired functionality -// is not yet exposed via a more convenient interface (Find, Pipe, etc). -// -// The optional session parameter associates the lifetime of the returned -// iterator to an arbitrary session. If nil, the iterator will be bound to -// c's session. -// -// Documents in firstBatch will be individually provided by the returned -// iterator before documents from cursorId are made available. If cursorId -// is zero, only the documents in firstBatch are provided. -// -// If err is not nil, the iterator's Err method will report it after -// exhausting documents in firstBatch. -// -// NewIter must be called right after the cursor id is obtained, and must not -// be called on a collection in Eventual mode, because the cursor id is -// associated with the specific server that returned it. The provided session -// parameter may be in any mode or state, though. -// -func (c *Collection) NewIter(session *Session, firstBatch []bson.Raw, cursorId int64, err error) *Iter { - var server *mongoServer - csession := c.Database.Session - csession.m.RLock() - socket := csession.masterSocket - if socket == nil { - socket = csession.slaveSocket - } - if socket != nil { - server = socket.Server() - } - csession.m.RUnlock() - - if server == nil { - if csession.Mode() == Eventual { - panic("Collection.NewIter called in Eventual mode") - } - if err == nil { - err = errors.New("server not available") - } - } - - if session == nil { - session = csession - } - - iter := &Iter{ - session: session, - server: server, - timeout: -1, - err: err, - } - iter.gotReply.L = &iter.m - for _, doc := range firstBatch { - iter.docData.Push(doc.Data) - } - if cursorId != 0 { - iter.op.cursorId = cursorId - iter.op.collection = c.FullName - iter.op.replyFunc = iter.replyFunc() - } - return iter -} - -// All works like Iter.All. -func (p *Pipe) All(result interface{}) error { - return p.Iter().All(result) -} - -// One executes the pipeline and unmarshals the first item from the -// result set into the result parameter. -// It returns ErrNotFound if no items are generated by the pipeline. -func (p *Pipe) One(result interface{}) error { - iter := p.Iter() - if iter.Next(result) { - return nil - } - if err := iter.Err(); err != nil { - return err - } - return ErrNotFound -} - -// Explain returns a number of details about how the MongoDB server would -// execute the requested pipeline, such as the number of objects examined, -// the number of times the read lock was yielded to allow writes to go in, -// and so on. -// -// For example: -// -// var m bson.M -// err := collection.Pipe(pipeline).Explain(&m) -// if err == nil { -// fmt.Printf("Explain: %#v\n", m) -// } -// -func (p *Pipe) Explain(result interface{}) error { - c := p.collection - cmd := pipeCmd{ - Aggregate: c.Name, - Pipeline: p.pipeline, - AllowDisk: p.allowDisk, - Explain: true, - } - return c.Database.Run(cmd, result) -} - -// AllowDiskUse enables writing to the "/_tmp" server directory so -// that aggregation pipelines do not have to be held entirely in memory. -func (p *Pipe) AllowDiskUse() *Pipe { - p.allowDisk = true - return p -} - -// Batch sets the batch size used when fetching documents from the database. -// It's possible to change this setting on a per-session basis as well, using -// the Batch method of Session. -// -// The default batch size is defined by the database server. -func (p *Pipe) Batch(n int) *Pipe { - p.batchSize = n - return p -} - -type LastError struct { - Err string - Code, N, Waited int - FSyncFiles int `bson:"fsyncFiles"` - WTimeout bool - UpdatedExisting bool `bson:"updatedExisting"` - UpsertedId interface{} `bson:"upserted"` -} - -func (err *LastError) Error() string { - return err.Err -} - -type queryError struct { - Err string "$err" - ErrMsg string - Assertion string - Code int - AssertionCode int "assertionCode" - LastError *LastError "lastErrorObject" -} - -type QueryError struct { - Code int - Message string - Assertion bool -} - -func (err *QueryError) Error() string { - return err.Message -} - -// IsDup returns whether err informs of a duplicate key error because -// a primary key index or a secondary unique index already has an entry -// with the given value. -func IsDup(err error) bool { - // Besides being handy, helps with MongoDB bugs SERVER-7164 and SERVER-11493. - // What follows makes me sad. Hopefully conventions will be more clear over time. - switch e := err.(type) { - case *LastError: - return e.Code == 11000 || e.Code == 11001 || e.Code == 12582 || e.Code == 16460 && strings.Contains(e.Err, " E11000 ") - case *QueryError: - return e.Code == 11000 || e.Code == 11001 || e.Code == 12582 - } - return false -} - -// Insert inserts one or more documents in the respective collection. In -// case the session is in safe mode (see the SetSafe method) and an error -// happens while inserting the provided documents, the returned error will -// be of type *LastError. -func (c *Collection) Insert(docs ...interface{}) error { - _, err := c.writeQuery(&insertOp{c.FullName, docs, 0}) - return err -} - -// Update finds a single document matching the provided selector document -// and modifies it according to the update document. -// If the session is in safe mode (see SetSafe) a ErrNotFound error is -// returned if a document isn't found, or a value of type *LastError -// when some other error is detected. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Updating -// http://www.mongodb.org/display/DOCS/Atomic+Operations -// -func (c *Collection) Update(selector interface{}, update interface{}) error { - lerr, err := c.writeQuery(&updateOp{c.FullName, selector, update, 0}) - if err == nil && lerr != nil && !lerr.UpdatedExisting { - return ErrNotFound - } - return err -} - -// UpdateId is a convenience helper equivalent to: -// -// err := collection.Update(bson.M{"_id": id}, update) -// -// See the Update method for more details. -func (c *Collection) UpdateId(id interface{}, update interface{}) error { - return c.Update(bson.D{{"_id", id}}, update) -} - -// ChangeInfo holds details about the outcome of an update operation. -type ChangeInfo struct { - Updated int // Number of existing documents updated - Removed int // Number of documents removed - UpsertedId interface{} // Upserted _id field, when not explicitly provided -} - -// UpdateAll finds all documents matching the provided selector document -// and modifies them according to the update document. -// If the session is in safe mode (see SetSafe) details of the executed -// operation are returned in info or an error of type *LastError when -// some problem is detected. It is not an error for the update to not be -// applied on any documents because the selector doesn't match. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Updating -// http://www.mongodb.org/display/DOCS/Atomic+Operations -// -func (c *Collection) UpdateAll(selector interface{}, update interface{}) (info *ChangeInfo, err error) { - lerr, err := c.writeQuery(&updateOp{c.FullName, selector, update, 2}) - if err == nil && lerr != nil { - info = &ChangeInfo{Updated: lerr.N} - } - return info, err -} - -// Upsert finds a single document matching the provided selector document -// and modifies it according to the update document. If no document matching -// the selector is found, the update document is applied to the selector -// document and the result is inserted in the collection. -// If the session is in safe mode (see SetSafe) details of the executed -// operation are returned in info, or an error of type *LastError when -// some problem is detected. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Updating -// http://www.mongodb.org/display/DOCS/Atomic+Operations -// -func (c *Collection) Upsert(selector interface{}, update interface{}) (info *ChangeInfo, err error) { - lerr, err := c.writeQuery(&updateOp{c.FullName, selector, update, 1}) - if err == nil && lerr != nil { - info = &ChangeInfo{} - if lerr.UpdatedExisting { - info.Updated = lerr.N - } else { - info.UpsertedId = lerr.UpsertedId - } - } - return info, err -} - -// UpsertId is a convenience helper equivalent to: -// -// info, err := collection.Upsert(bson.M{"_id": id}, update) -// -// See the Upsert method for more details. -func (c *Collection) UpsertId(id interface{}, update interface{}) (info *ChangeInfo, err error) { - return c.Upsert(bson.D{{"_id", id}}, update) -} - -// Remove finds a single document matching the provided selector document -// and removes it from the database. -// If the session is in safe mode (see SetSafe) a ErrNotFound error is -// returned if a document isn't found, or a value of type *LastError -// when some other error is detected. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Removing -// -func (c *Collection) Remove(selector interface{}) error { - lerr, err := c.writeQuery(&deleteOp{c.FullName, selector, 1}) - if err == nil && lerr != nil && lerr.N == 0 { - return ErrNotFound - } - return err -} - -// RemoveId is a convenience helper equivalent to: -// -// err := collection.Remove(bson.M{"_id": id}) -// -// See the Remove method for more details. -func (c *Collection) RemoveId(id interface{}) error { - return c.Remove(bson.D{{"_id", id}}) -} - -// RemoveAll finds all documents matching the provided selector document -// and removes them from the database. In case the session is in safe mode -// (see the SetSafe method) and an error happens when attempting the change, -// the returned error will be of type *LastError. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Removing -// -func (c *Collection) RemoveAll(selector interface{}) (info *ChangeInfo, err error) { - lerr, err := c.writeQuery(&deleteOp{c.FullName, selector, 0}) - if err == nil && lerr != nil { - info = &ChangeInfo{Removed: lerr.N} - } - return info, err -} - -// DropDatabase removes the entire database including all of its collections. -func (db *Database) DropDatabase() error { - return db.Run(bson.D{{"dropDatabase", 1}}, nil) -} - -// DropCollection removes the entire collection including all of its documents. -func (c *Collection) DropCollection() error { - return c.Database.Run(bson.D{{"drop", c.Name}}, nil) -} - -// The CollectionInfo type holds metadata about a collection. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/createCollection+Command -// http://www.mongodb.org/display/DOCS/Capped+Collections -// -type CollectionInfo struct { - // DisableIdIndex prevents the automatic creation of the index - // on the _id field for the collection. - DisableIdIndex bool - - // ForceIdIndex enforces the automatic creation of the index - // on the _id field for the collection. Capped collections, - // for example, do not have such an index by default. - ForceIdIndex bool - - // If Capped is true new documents will replace old ones when - // the collection is full. MaxBytes must necessarily be set - // to define the size when the collection wraps around. - // MaxDocs optionally defines the number of documents when it - // wraps, but MaxBytes still needs to be set. - Capped bool - MaxBytes int - MaxDocs int -} - -// Create explicitly creates the c collection with details of info. -// MongoDB creates collections automatically on use, so this method -// is only necessary when creating collection with non-default -// characteristics, such as capped collections. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/createCollection+Command -// http://www.mongodb.org/display/DOCS/Capped+Collections -// -func (c *Collection) Create(info *CollectionInfo) error { - cmd := make(bson.D, 0, 4) - cmd = append(cmd, bson.DocElem{"create", c.Name}) - if info.Capped { - if info.MaxBytes < 1 { - return fmt.Errorf("Collection.Create: with Capped, MaxBytes must also be set") - } - cmd = append(cmd, bson.DocElem{"capped", true}) - cmd = append(cmd, bson.DocElem{"size", info.MaxBytes}) - if info.MaxDocs > 0 { - cmd = append(cmd, bson.DocElem{"max", info.MaxDocs}) - } - } - if info.DisableIdIndex { - cmd = append(cmd, bson.DocElem{"autoIndexId", false}) - } - if info.ForceIdIndex { - cmd = append(cmd, bson.DocElem{"autoIndexId", true}) - } - return c.Database.Run(cmd, nil) -} - -// Batch sets the batch size used when fetching documents from the database. -// It's possible to change this setting on a per-session basis as well, using -// the Batch method of Session. -// -// The default batch size is defined by the database itself. As of this -// writing, MongoDB will use an initial size of min(100 docs, 4MB) on the -// first batch, and 4MB on remaining ones. -func (q *Query) Batch(n int) *Query { - if n == 1 { - // Server interprets 1 as -1 and closes the cursor (!?) - n = 2 - } - q.m.Lock() - q.op.limit = int32(n) - q.m.Unlock() - return q -} - -// Prefetch sets the point at which the next batch of results will be requested. -// When there are p*batch_size remaining documents cached in an Iter, the next -// batch will be requested in background. For instance, when using this: -// -// query.Batch(200).Prefetch(0.25) -// -// and there are only 50 documents cached in the Iter to be processed, the -// next batch of 200 will be requested. It's possible to change this setting on -// a per-session basis as well, using the SetPrefetch method of Session. -// -// The default prefetch value is 0.25. -func (q *Query) Prefetch(p float64) *Query { - q.m.Lock() - q.prefetch = p - q.m.Unlock() - return q -} - -// Skip skips over the n initial documents from the query results. Note that -// this only makes sense with capped collections where documents are naturally -// ordered by insertion time, or with sorted results. -func (q *Query) Skip(n int) *Query { - q.m.Lock() - q.op.skip = int32(n) - q.m.Unlock() - return q -} - -// Limit restricts the maximum number of documents retrieved to n, and also -// changes the batch size to the same value. Once n documents have been -// returned by Next, the following call will return ErrNotFound. -func (q *Query) Limit(n int) *Query { - q.m.Lock() - switch { - case n == 1: - q.limit = 1 - q.op.limit = -1 - case n == math.MinInt32: // -MinInt32 == -MinInt32 - q.limit = math.MaxInt32 - q.op.limit = math.MinInt32 + 1 - case n < 0: - q.limit = int32(-n) - q.op.limit = int32(n) - default: - q.limit = int32(n) - q.op.limit = int32(n) - } - q.m.Unlock() - return q -} - -// Select enables selecting which fields should be retrieved for the results -// found. For example, the following query would only retrieve the name field: -// -// err := collection.Find(nil).Select(bson.M{"name": 1}).One(&result) -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields -// -func (q *Query) Select(selector interface{}) *Query { - q.m.Lock() - q.op.selector = selector - q.m.Unlock() - return q -} - -// Sort asks the database to order returned documents according to the -// provided field names. A field name may be prefixed by - (minus) for -// it to be sorted in reverse order. -// -// For example: -// -// query1 := collection.Find(nil).Sort("firstname", "lastname") -// query2 := collection.Find(nil).Sort("-age") -// query3 := collection.Find(nil).Sort("$natural") -// query4 := collection.Find(nil).Select(bson.M{"score": bson.M{"$meta": "textScore"}}).Sort("$textScore:score") -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order -// -func (q *Query) Sort(fields ...string) *Query { - q.m.Lock() - var order bson.D - for _, field := range fields { - n := 1 - var kind string - if field != "" { - if field[0] == '$' { - if c := strings.Index(field, ":"); c > 1 && c < len(field)-1 { - kind = field[1:c] - field = field[c+1:] - } - } - switch field[0] { - case '+': - field = field[1:] - case '-': - n = -1 - field = field[1:] - } - } - if field == "" { - panic("Sort: empty field name") - } - if kind == "textScore" { - order = append(order, bson.DocElem{field, bson.M{"$meta": kind}}) - } else { - order = append(order, bson.DocElem{field, n}) - } - } - q.op.options.OrderBy = order - q.op.hasOptions = true - q.m.Unlock() - return q -} - -// Explain returns a number of details about how the MongoDB server would -// execute the requested query, such as the number of objects examined, -// the number of times the read lock was yielded to allow writes to go in, -// and so on. -// -// For example: -// -// m := bson.M{} -// err := collection.Find(bson.M{"filename": name}).Explain(m) -// if err == nil { -// fmt.Printf("Explain: %#v\n", m) -// } -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Optimization -// http://www.mongodb.org/display/DOCS/Query+Optimizer -// -func (q *Query) Explain(result interface{}) error { - q.m.Lock() - clone := &Query{session: q.session, query: q.query} - q.m.Unlock() - clone.op.options.Explain = true - clone.op.hasOptions = true - if clone.op.limit > 0 { - clone.op.limit = -q.op.limit - } - iter := clone.Iter() - if iter.Next(result) { - return nil - } - return iter.Close() -} - -// Hint will include an explicit "hint" in the query to force the server -// to use a specified index, potentially improving performance in some -// situations. The provided parameters are the fields that compose the -// key of the index to be used. For details on how the indexKey may be -// built, see the EnsureIndex method. -// -// For example: -// -// query := collection.Find(bson.M{"firstname": "Joe", "lastname": "Winter"}) -// query.Hint("lastname", "firstname") -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Optimization -// http://www.mongodb.org/display/DOCS/Query+Optimizer -// -func (q *Query) Hint(indexKey ...string) *Query { - q.m.Lock() - keyInfo, err := parseIndexKey(indexKey) - q.op.options.Hint = keyInfo.key - q.op.hasOptions = true - q.m.Unlock() - if err != nil { - panic(err) - } - return q -} - -// SetMaxScan constrains the query to stop after scanning the specified -// number of documents. -// -// This modifier is generally used to prevent potentially long running -// queries from disrupting performance by scanning through too much data. -func (q *Query) SetMaxScan(n int) *Query { - q.m.Lock() - q.op.options.MaxScan = n - q.op.hasOptions = true - q.m.Unlock() - return q -} - -// SetMaxTime constrains the query to stop after running for the specified time. -// -// When the time limit is reached MongoDB automatically cancels the query. -// This can be used to efficiently prevent and identify unexpectedly slow queries. -// -// A few important notes about the mechanism enforcing this limit: -// -// - Requests can block behind locking operations on the server, and that blocking -// time is not accounted for. In other words, the timer starts ticking only after -// the actual start of the query when it initially acquires the appropriate lock; -// -// - Operations are interrupted only at interrupt points where an operation can be -// safely aborted – the total execution time may exceed the specified value; -// -// - The limit can be applied to both CRUD operations and commands, but not all -// commands are interruptible; -// -// - While iterating over results, computing follow up batches is included in the -// total time and the iteration continues until the alloted time is over, but -// network roundtrips are not taken into account for the limit. -// -// - This limit does not override the inactive cursor timeout for idle cursors -// (default is 10 min). -// -// This mechanism was introduced in MongoDB 2.6. -// -// Relevant documentation: -// -// http://blog.mongodb.org/post/83621787773/maxtimems-and-query-optimizer-introspection-in -// -func (q *Query) SetMaxTime(d time.Duration) *Query { - q.m.Lock() - q.op.options.MaxTimeMS = int(d / time.Millisecond) - q.op.hasOptions = true - q.m.Unlock() - return q -} - -// Snapshot will force the performed query to make use of an available -// index on the _id field to prevent the same document from being returned -// more than once in a single iteration. This might happen without this -// setting in situations when the document changes in size and thus has to -// be moved while the iteration is running. -// -// Because snapshot mode traverses the _id index, it may not be used with -// sorting or explicit hints. It also cannot use any other index for the -// query. -// -// Even with snapshot mode, items inserted or deleted during the query may -// or may not be returned; that is, this mode is not a true point-in-time -// snapshot. -// -// The same effect of Snapshot may be obtained by using any unique index on -// field(s) that will not be modified (best to use Hint explicitly too). -// A non-unique index (such as creation time) may be made unique by -// appending _id to the index when creating it. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/How+to+do+Snapshotted+Queries+in+the+Mongo+Database -// -func (q *Query) Snapshot() *Query { - q.m.Lock() - q.op.options.Snapshot = true - q.op.hasOptions = true - q.m.Unlock() - return q -} - -// Comment adds a comment to the query to identify it in the database profiler output. -// -// Relevant documentation: -// -// http://docs.mongodb.org/manual/reference/operator/meta/comment -// http://docs.mongodb.org/manual/reference/command/profile -// http://docs.mongodb.org/manual/administration/analyzing-mongodb-performance/#database-profiling -// -func (q *Query) Comment(comment string) *Query { - q.m.Lock() - q.op.options.Comment = comment - q.op.hasOptions = true - q.m.Unlock() - return q -} - -// LogReplay enables an option that optimizes queries that are typically -// made on the MongoDB oplog for replaying it. This is an internal -// implementation aspect and most likely uninteresting for other uses. -// It has seen at least one use case, though, so it's exposed via the API. -func (q *Query) LogReplay() *Query { - q.m.Lock() - q.op.flags |= flagLogReplay - q.m.Unlock() - return q -} - -func checkQueryError(fullname string, d []byte) error { - l := len(d) - if l < 16 { - return nil - } - if d[5] == '$' && d[6] == 'e' && d[7] == 'r' && d[8] == 'r' && d[9] == '\x00' && d[4] == '\x02' { - goto Error - } - if len(fullname) < 5 || fullname[len(fullname)-5:] != ".$cmd" { - return nil - } - for i := 0; i+8 < l; i++ { - if d[i] == '\x02' && d[i+1] == 'e' && d[i+2] == 'r' && d[i+3] == 'r' && d[i+4] == 'm' && d[i+5] == 's' && d[i+6] == 'g' && d[i+7] == '\x00' { - goto Error - } - } - return nil - -Error: - result := &queryError{} - bson.Unmarshal(d, result) - if result.LastError != nil { - return result.LastError - } - if result.Err == "" && result.ErrMsg == "" { - return nil - } - if result.AssertionCode != 0 && result.Assertion != "" { - return &QueryError{Code: result.AssertionCode, Message: result.Assertion, Assertion: true} - } - if result.Err != "" { - return &QueryError{Code: result.Code, Message: result.Err} - } - return &QueryError{Code: result.Code, Message: result.ErrMsg} -} - -// One executes the query and unmarshals the first obtained document into the -// result argument. The result must be a struct or map value capable of being -// unmarshalled into by gobson. This function blocks until either a result -// is available or an error happens. For example: -// -// err := collection.Find(bson.M{"a", 1}).One(&result) -// -// In case the resulting document includes a field named $err or errmsg, which -// are standard ways for MongoDB to return query errors, the returned err will -// be set to a *QueryError value including the Err message and the Code. In -// those cases, the result argument is still unmarshalled into with the -// received document so that any other custom values may be obtained if -// desired. -// -func (q *Query) One(result interface{}) (err error) { - q.m.Lock() - session := q.session - op := q.op // Copy. - q.m.Unlock() - - socket, err := session.acquireSocket(true) - if err != nil { - return err - } - defer socket.Release() - - op.flags |= session.slaveOkFlag() - op.limit = -1 - - data, err := socket.SimpleQuery(&op) - if err != nil { - return err - } - if data == nil { - return ErrNotFound - } - if result != nil { - err = bson.Unmarshal(data, result) - if err == nil { - debugf("Query %p document unmarshaled: %#v", q, result) - } else { - debugf("Query %p document unmarshaling failed: %#v", q, err) - return err - } - } - return checkQueryError(op.collection, data) -} - -// run duplicates the behavior of collection.Find(query).One(&result) -// as performed by Database.Run, specializing the logic for running -// database commands on a given socket. -func (db *Database) run(socket *mongoSocket, cmd, result interface{}) (err error) { - // Database.Run: - if name, ok := cmd.(string); ok { - cmd = bson.D{{name, 1}} - } - - // Collection.Find: - session := db.Session - session.m.RLock() - op := session.queryConfig.op // Copy. - session.m.RUnlock() - op.query = cmd - op.collection = db.Name + ".$cmd" - - // Query.One: - op.flags |= session.slaveOkFlag() - op.limit = -1 - - data, err := socket.SimpleQuery(&op) - if err != nil { - return err - } - if data == nil { - return ErrNotFound - } - if result != nil { - err = bson.Unmarshal(data, result) - if err == nil { - var res bson.M - bson.Unmarshal(data, &res) - debugf("Run command unmarshaled: %#v, result: %#v", op, res) - } else { - debugf("Run command unmarshaling failed: %#v", op, err) - return err - } - } - return checkQueryError(op.collection, data) -} - -// The DBRef type implements support for the database reference MongoDB -// convention as supported by multiple drivers. This convention enables -// cross-referencing documents between collections and databases using -// a structure which includes a collection name, a document id, and -// optionally a database name. -// -// See the FindRef methods on Session and on Database. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Database+References -// -type DBRef struct { - Collection string `bson:"$ref"` - Id interface{} `bson:"$id"` - Database string `bson:"$db,omitempty"` -} - -// NOTE: Order of fields for DBRef above does matter, per documentation. - -// FindRef returns a query that looks for the document in the provided -// reference. If the reference includes the DB field, the document will -// be retrieved from the respective database. -// -// See also the DBRef type and the FindRef method on Session. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Database+References -// -func (db *Database) FindRef(ref *DBRef) *Query { - var c *Collection - if ref.Database == "" { - c = db.C(ref.Collection) - } else { - c = db.Session.DB(ref.Database).C(ref.Collection) - } - return c.FindId(ref.Id) -} - -// FindRef returns a query that looks for the document in the provided -// reference. For a DBRef to be resolved correctly at the session level -// it must necessarily have the optional DB field defined. -// -// See also the DBRef type and the FindRef method on Database. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Database+References -// -func (s *Session) FindRef(ref *DBRef) *Query { - if ref.Database == "" { - panic(errors.New(fmt.Sprintf("Can't resolve database for %#v", ref))) - } - c := s.DB(ref.Database).C(ref.Collection) - return c.FindId(ref.Id) -} - -// CollectionNames returns the collection names present in the db database. -func (db *Database) CollectionNames() (names []string, err error) { - // Clone session and set it to Monotonic mode so that the server - // used for the query may be safely obtained afterwards, if - // necessary for iteration when a cursor is received. - session := db.Session - cloned := session.Clone() - cloned.SetMode(Monotonic, false) - defer cloned.Close() - - batchSize := int(cloned.queryConfig.op.limit) - - // Try with a command. - var result struct { - Collections []bson.Raw - - Cursor struct { - FirstBatch []bson.Raw "firstBatch" - NS string - Id int64 - } - } - err = db.With(cloned).Run(bson.D{{"listCollections", 1}, {"cursor", bson.D{{"batchSize", batchSize}}}}, &result) - if err == nil { - firstBatch := result.Collections - if firstBatch == nil { - firstBatch = result.Cursor.FirstBatch - } - var iter *Iter - ns := strings.SplitN(result.Cursor.NS, ".", 2) - if len(ns) < 2 { - iter = db.With(cloned).C("").NewIter(nil, firstBatch, result.Cursor.Id, nil) - } else { - iter = cloned.DB(ns[0]).C(ns[1]).NewIter(nil, firstBatch, result.Cursor.Id, nil) - } - var coll struct{ Name string } - for iter.Next(&coll) { - names = append(names, coll.Name) - } - if err := iter.Close(); err != nil { - return nil, err - } - sort.Strings(names) - return names, err - } - if err != nil && !isNoCmd(err) { - return nil, err - } - - // Command not yet supported. Query the database instead. - nameIndex := len(db.Name) + 1 - iter := db.C("system.namespaces").Find(nil).Iter() - var coll struct{ Name string } - for iter.Next(&coll) { - if strings.Index(coll.Name, "$") < 0 || strings.Index(coll.Name, ".oplog.$") >= 0 { - names = append(names, coll.Name[nameIndex:]) - } - } - if err := iter.Close(); err != nil { - return nil, err - } - sort.Strings(names) - return names, nil -} - -type dbNames struct { - Databases []struct { - Name string - Empty bool - } -} - -// DatabaseNames returns the names of non-empty databases present in the cluster. -func (s *Session) DatabaseNames() (names []string, err error) { - var result dbNames - err = s.Run("listDatabases", &result) - if err != nil { - return nil, err - } - for _, db := range result.Databases { - if !db.Empty { - names = append(names, db.Name) - } - } - sort.Strings(names) - return names, nil -} - -// Iter executes the query and returns an iterator capable of going over all -// the results. Results will be returned in batches of configurable -// size (see the Batch method) and more documents will be requested when a -// configurable number of documents is iterated over (see the Prefetch method). -func (q *Query) Iter() *Iter { - q.m.Lock() - session := q.session - op := q.op - prefetch := q.prefetch - limit := q.limit - q.m.Unlock() - - iter := &Iter{ - session: session, - prefetch: prefetch, - limit: limit, - timeout: -1, - } - iter.gotReply.L = &iter.m - iter.op.collection = op.collection - iter.op.limit = op.limit - iter.op.replyFunc = iter.replyFunc() - iter.docsToReceive++ - op.replyFunc = iter.op.replyFunc - op.flags |= session.slaveOkFlag() - - socket, err := session.acquireSocket(true) - if err != nil { - iter.err = err - } else { - iter.server = socket.Server() - err = socket.Query(&op) - if err != nil { - // Must lock as the query above may call replyFunc. - iter.m.Lock() - iter.err = err - iter.m.Unlock() - } - socket.Release() - } - return iter -} - -// Tail returns a tailable iterator. Unlike a normal iterator, a -// tailable iterator may wait for new values to be inserted in the -// collection once the end of the current result set is reached, -// A tailable iterator may only be used with capped collections. -// -// The timeout parameter indicates how long Next will block waiting -// for a result before timing out. If set to -1, Next will not -// timeout, and will continue waiting for a result for as long as -// the cursor is valid and the session is not closed. If set to 0, -// Next times out as soon as it reaches the end of the result set. -// Otherwise, Next will wait for at least the given number of -// seconds for a new document to be available before timing out. -// -// On timeouts, Next will unblock and return false, and the Timeout -// method will return true if called. In these cases, Next may still -// be called again on the same iterator to check if a new value is -// available at the current cursor position, and again it will block -// according to the specified timeoutSecs. If the cursor becomes -// invalid, though, both Next and Timeout will return false and -// the query must be restarted. -// -// The following example demonstrates timeout handling and query -// restarting: -// -// iter := collection.Find(nil).Sort("$natural").Tail(5 * time.Second) -// for { -// for iter.Next(&result) { -// fmt.Println(result.Id) -// lastId = result.Id -// } -// if iter.Err() != nil { -// return iter.Close() -// } -// if iter.Timeout() { -// continue -// } -// query := collection.Find(bson.M{"_id": bson.M{"$gt": lastId}}) -// iter = query.Sort("$natural").Tail(5 * time.Second) -// } -// iter.Close() -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Tailable+Cursors -// http://www.mongodb.org/display/DOCS/Capped+Collections -// http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order -// -func (q *Query) Tail(timeout time.Duration) *Iter { - q.m.Lock() - session := q.session - op := q.op - prefetch := q.prefetch - q.m.Unlock() - - iter := &Iter{session: session, prefetch: prefetch} - iter.gotReply.L = &iter.m - iter.timeout = timeout - iter.op.collection = op.collection - iter.op.limit = op.limit - iter.op.replyFunc = iter.replyFunc() - iter.docsToReceive++ - op.replyFunc = iter.op.replyFunc - op.flags |= flagTailable | flagAwaitData | session.slaveOkFlag() - - socket, err := session.acquireSocket(true) - if err != nil { - iter.err = err - } else { - iter.server = socket.Server() - err = socket.Query(&op) - if err != nil { - // Must lock as the query above may call replyFunc. - iter.m.Lock() - iter.err = err - iter.m.Unlock() - } - socket.Release() - } - return iter -} - -func (s *Session) slaveOkFlag() (flag queryOpFlags) { - s.m.RLock() - if s.slaveOk { - flag = flagSlaveOk - } - s.m.RUnlock() - return -} - -// Err returns nil if no errors happened during iteration, or the actual -// error otherwise. -// -// In case a resulting document included a field named $err or errmsg, which are -// standard ways for MongoDB to report an improper query, the returned value has -// a *QueryError type, and includes the Err message and the Code. -func (iter *Iter) Err() error { - iter.m.Lock() - err := iter.err - iter.m.Unlock() - if err == ErrNotFound { - return nil - } - return err -} - -// Close kills the server cursor used by the iterator, if any, and returns -// nil if no errors happened during iteration, or the actual error otherwise. -// -// Server cursors are automatically closed at the end of an iteration, which -// means close will do nothing unless the iteration was interrupted before -// the server finished sending results to the driver. If Close is not called -// in such a situation, the cursor will remain available at the server until -// the default cursor timeout period is reached. No further problems arise. -// -// Close is idempotent. That means it can be called repeatedly and will -// return the same result every time. -// -// In case a resulting document included a field named $err or errmsg, which are -// standard ways for MongoDB to report an improper query, the returned value has -// a *QueryError type. -func (iter *Iter) Close() error { - iter.m.Lock() - cursorId := iter.op.cursorId - iter.op.cursorId = 0 - err := iter.err - iter.m.Unlock() - if cursorId == 0 { - if err == ErrNotFound { - return nil - } - return err - } - socket, err := iter.acquireSocket() - if err == nil { - // TODO Batch kills. - err = socket.Query(&killCursorsOp{[]int64{cursorId}}) - socket.Release() - } - - iter.m.Lock() - if err != nil && (iter.err == nil || iter.err == ErrNotFound) { - iter.err = err - } else if iter.err != ErrNotFound { - err = iter.err - } - iter.m.Unlock() - return err -} - -// Timeout returns true if Next returned false due to a timeout of -// a tailable cursor. In those cases, Next may be called again to continue -// the iteration at the previous cursor position. -func (iter *Iter) Timeout() bool { - iter.m.Lock() - result := iter.timedout - iter.m.Unlock() - return result -} - -// Next retrieves the next document from the result set, blocking if necessary. -// This method will also automatically retrieve another batch of documents from -// the server when the current one is exhausted, or before that in background -// if pre-fetching is enabled (see the Query.Prefetch and Session.SetPrefetch -// methods). -// -// Next returns true if a document was successfully unmarshalled onto result, -// and false at the end of the result set or if an error happened. -// When Next returns false, the Err method should be called to verify if -// there was an error during iteration. -// -// For example: -// -// iter := collection.Find(nil).Iter() -// for iter.Next(&result) { -// fmt.Printf("Result: %v\n", result.Id) -// } -// if err := iter.Close(); err != nil { -// return err -// } -// -func (iter *Iter) Next(result interface{}) bool { - iter.m.Lock() - iter.timedout = false - timeout := time.Time{} - for iter.err == nil && iter.docData.Len() == 0 && (iter.docsToReceive > 0 || iter.op.cursorId != 0) { - if iter.docsToReceive == 0 { - if iter.timeout >= 0 { - if timeout.IsZero() { - timeout = time.Now().Add(iter.timeout) - } - if time.Now().After(timeout) { - iter.timedout = true - iter.m.Unlock() - return false - } - } - iter.getMore() - if iter.err != nil { - break - } - } - iter.gotReply.Wait() - } - - // Exhaust available data before reporting any errors. - if docData, ok := iter.docData.Pop().([]byte); ok { - close := false - if iter.limit > 0 { - iter.limit-- - if iter.limit == 0 { - if iter.docData.Len() > 0 { - iter.m.Unlock() - panic(fmt.Errorf("data remains after limit exhausted: %d", iter.docData.Len())) - } - iter.err = ErrNotFound - close = true - } - } - if iter.op.cursorId != 0 && iter.err == nil { - iter.docsBeforeMore-- - if iter.docsBeforeMore == -1 { - iter.getMore() - } - } - iter.m.Unlock() - - if close { - iter.Close() - } - err := bson.Unmarshal(docData, result) - if err != nil { - debugf("Iter %p document unmarshaling failed: %#v", iter, err) - iter.m.Lock() - if iter.err == nil { - iter.err = err - } - iter.m.Unlock() - return false - } - debugf("Iter %p document unmarshaled: %#v", iter, result) - // XXX Only have to check first document for a query error? - err = checkQueryError(iter.op.collection, docData) - if err != nil { - iter.m.Lock() - if iter.err == nil { - iter.err = err - } - iter.m.Unlock() - return false - } - return true - } else if iter.err != nil { - debugf("Iter %p returning false: %s", iter, iter.err) - iter.m.Unlock() - return false - } else if iter.op.cursorId == 0 { - iter.err = ErrNotFound - debugf("Iter %p exhausted with cursor=0", iter) - iter.m.Unlock() - return false - } - - panic("unreachable") -} - -// All retrieves all documents from the result set into the provided slice -// and closes the iterator. -// -// The result argument must necessarily be the address for a slice. The slice -// may be nil or previously allocated. -// -// WARNING: Obviously, All must not be used with result sets that may be -// potentially large, since it may consume all memory until the system -// crashes. Consider building the query with a Limit clause to ensure the -// result size is bounded. -// -// For instance: -// -// var result []struct{ Value int } -// iter := collection.Find(nil).Limit(100).Iter() -// err := iter.All(&result) -// if err != nil { -// return err -// } -// -func (iter *Iter) All(result interface{}) error { - resultv := reflect.ValueOf(result) - if resultv.Kind() != reflect.Ptr || resultv.Elem().Kind() != reflect.Slice { - panic("result argument must be a slice address") - } - slicev := resultv.Elem() - slicev = slicev.Slice(0, slicev.Cap()) - elemt := slicev.Type().Elem() - i := 0 - for { - if slicev.Len() == i { - elemp := reflect.New(elemt) - if !iter.Next(elemp.Interface()) { - break - } - slicev = reflect.Append(slicev, elemp.Elem()) - slicev = slicev.Slice(0, slicev.Cap()) - } else { - if !iter.Next(slicev.Index(i).Addr().Interface()) { - break - } - } - i++ - } - resultv.Elem().Set(slicev.Slice(0, i)) - return iter.Close() -} - -// All works like Iter.All. -func (q *Query) All(result interface{}) error { - return q.Iter().All(result) -} - -// The For method is obsolete and will be removed in a future release. -// See Iter as an elegant replacement. -func (q *Query) For(result interface{}, f func() error) error { - return q.Iter().For(result, f) -} - -// The For method is obsolete and will be removed in a future release. -// See Iter as an elegant replacement. -func (iter *Iter) For(result interface{}, f func() error) (err error) { - valid := false - v := reflect.ValueOf(result) - if v.Kind() == reflect.Ptr { - v = v.Elem() - switch v.Kind() { - case reflect.Map, reflect.Ptr, reflect.Interface, reflect.Slice: - valid = v.IsNil() - } - } - if !valid { - panic("For needs a pointer to nil reference value. See the documentation.") - } - zero := reflect.Zero(v.Type()) - for { - v.Set(zero) - if !iter.Next(result) { - break - } - err = f() - if err != nil { - return err - } - } - return iter.Err() -} - -// acquireSocket acquires a socket from the same server that the iterator -// cursor was obtained from. -// -// WARNING: This method must not be called with iter.m locked. Acquiring the -// socket depends on the cluster sync loop, and the cluster sync loop might -// attempt actions which cause replyFunc to be called, inducing a deadlock. -func (iter *Iter) acquireSocket() (*mongoSocket, error) { - socket, err := iter.session.acquireSocket(true) - if err != nil { - return nil, err - } - if socket.Server() != iter.server { - // Socket server changed during iteration. This may happen - // with Eventual sessions, if a Refresh is done, or if a - // monotonic session gets a write and shifts from secondary - // to primary. Our cursor is in a specific server, though. - iter.session.m.Lock() - sockTimeout := iter.session.sockTimeout - iter.session.m.Unlock() - socket.Release() - socket, _, err = iter.server.AcquireSocket(0, sockTimeout) - if err != nil { - return nil, err - } - err := iter.session.socketLogin(socket) - if err != nil { - socket.Release() - return nil, err - } - } - return socket, nil -} - -func (iter *Iter) getMore() { - // Increment now so that unlocking the iterator won't cause a - // different goroutine to get here as well. - iter.docsToReceive++ - iter.m.Unlock() - socket, err := iter.acquireSocket() - iter.m.Lock() - if err != nil { - iter.err = err - return - } - defer socket.Release() - - debugf("Iter %p requesting more documents", iter) - if iter.limit > 0 { - // The -1 below accounts for the fact docsToReceive was incremented above. - limit := iter.limit - int32(iter.docsToReceive-1) - int32(iter.docData.Len()) - if limit < iter.op.limit { - iter.op.limit = limit - } - } - if err := socket.Query(&iter.op); err != nil { - iter.docsToReceive-- - iter.err = err - } -} - -type countCmd struct { - Count string - Query interface{} - Limit int32 ",omitempty" - Skip int32 ",omitempty" -} - -// Count returns the total number of documents in the result set. -func (q *Query) Count() (n int, err error) { - q.m.Lock() - session := q.session - op := q.op - limit := q.limit - q.m.Unlock() - - c := strings.Index(op.collection, ".") - if c < 0 { - return 0, errors.New("Bad collection name: " + op.collection) - } - - dbname := op.collection[:c] - cname := op.collection[c+1:] - query := op.query - if query == nil { - query = bson.D{} - } - result := struct{ N int }{} - err = session.DB(dbname).Run(countCmd{cname, query, limit, op.skip}, &result) - return result.N, err -} - -// Count returns the total number of documents in the collection. -func (c *Collection) Count() (n int, err error) { - return c.Find(nil).Count() -} - -type distinctCmd struct { - Collection string "distinct" - Key string - Query interface{} ",omitempty" -} - -// Distinct unmarshals into result the list of distinct values for the given key. -// -// For example: -// -// var result []int -// err := collection.Find(bson.M{"gender": "F"}).Distinct("age", &result) -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/Aggregation -// -func (q *Query) Distinct(key string, result interface{}) error { - q.m.Lock() - session := q.session - op := q.op // Copy. - q.m.Unlock() - - c := strings.Index(op.collection, ".") - if c < 0 { - return errors.New("Bad collection name: " + op.collection) - } - - dbname := op.collection[:c] - cname := op.collection[c+1:] - - var doc struct{ Values bson.Raw } - err := session.DB(dbname).Run(distinctCmd{cname, key, op.query}, &doc) - if err != nil { - return err - } - return doc.Values.Unmarshal(result) -} - -type mapReduceCmd struct { - Collection string "mapreduce" - Map string ",omitempty" - Reduce string ",omitempty" - Finalize string ",omitempty" - Limit int32 ",omitempty" - Out interface{} - Query interface{} ",omitempty" - Sort interface{} ",omitempty" - Scope interface{} ",omitempty" - Verbose bool ",omitempty" -} - -type mapReduceResult struct { - Results bson.Raw - Result bson.Raw - TimeMillis int64 "timeMillis" - Counts struct{ Input, Emit, Output int } - Ok bool - Err string - Timing *MapReduceTime -} - -type MapReduce struct { - Map string // Map Javascript function code (required) - Reduce string // Reduce Javascript function code (required) - Finalize string // Finalize Javascript function code (optional) - Out interface{} // Output collection name or document. If nil, results are inlined into the result parameter. - Scope interface{} // Optional global scope for Javascript functions - Verbose bool -} - -type MapReduceInfo struct { - InputCount int // Number of documents mapped - EmitCount int // Number of times reduce called emit - OutputCount int // Number of documents in resulting collection - Database string // Output database, if results are not inlined - Collection string // Output collection, if results are not inlined - Time int64 // Time to run the job, in nanoseconds - VerboseTime *MapReduceTime // Only defined if Verbose was true -} - -type MapReduceTime struct { - Total int64 // Total time, in nanoseconds - Map int64 "mapTime" // Time within map function, in nanoseconds - EmitLoop int64 "emitLoop" // Time within the emit/map loop, in nanoseconds -} - -// MapReduce executes a map/reduce job for documents covered by the query. -// That kind of job is suitable for very flexible bulk aggregation of data -// performed at the server side via Javascript functions. -// -// Results from the job may be returned as a result of the query itself -// through the result parameter in case they'll certainly fit in memory -// and in a single document. If there's the possibility that the amount -// of data might be too large, results must be stored back in an alternative -// collection or even a separate database, by setting the Out field of the -// provided MapReduce job. In that case, provide nil as the result parameter. -// -// These are some of the ways to set Out: -// -// nil -// Inline results into the result parameter. -// -// bson.M{"replace": "mycollection"} -// The output will be inserted into a collection which replaces any -// existing collection with the same name. -// -// bson.M{"merge": "mycollection"} -// This option will merge new data into the old output collection. In -// other words, if the same key exists in both the result set and the -// old collection, the new key will overwrite the old one. -// -// bson.M{"reduce": "mycollection"} -// If documents exist for a given key in the result set and in the old -// collection, then a reduce operation (using the specified reduce -// function) will be performed on the two values and the result will be -// written to the output collection. If a finalize function was -// provided, this will be run after the reduce as well. -// -// bson.M{...., "db": "mydb"} -// Any of the above options can have the "db" key included for doing -// the respective action in a separate database. -// -// The following is a trivial example which will count the number of -// occurrences of a field named n on each document in a collection, and -// will return results inline: -// -// job := &mgo.MapReduce{ -// Map: "function() { emit(this.n, 1) }", -// Reduce: "function(key, values) { return Array.sum(values) }", -// } -// var result []struct { Id int "_id"; Value int } -// _, err := collection.Find(nil).MapReduce(job, &result) -// if err != nil { -// return err -// } -// for _, item := range result { -// fmt.Println(item.Value) -// } -// -// This function is compatible with MongoDB 1.7.4+. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/MapReduce -// -func (q *Query) MapReduce(job *MapReduce, result interface{}) (info *MapReduceInfo, err error) { - q.m.Lock() - session := q.session - op := q.op // Copy. - limit := q.limit - q.m.Unlock() - - c := strings.Index(op.collection, ".") - if c < 0 { - return nil, errors.New("Bad collection name: " + op.collection) - } - - dbname := op.collection[:c] - cname := op.collection[c+1:] - - cmd := mapReduceCmd{ - Collection: cname, - Map: job.Map, - Reduce: job.Reduce, - Finalize: job.Finalize, - Out: fixMROut(job.Out), - Scope: job.Scope, - Verbose: job.Verbose, - Query: op.query, - Sort: op.options.OrderBy, - Limit: limit, - } - - if cmd.Out == nil { - cmd.Out = bson.D{{"inline", 1}} - } - - var doc mapReduceResult - err = session.DB(dbname).Run(&cmd, &doc) - if err != nil { - return nil, err - } - if doc.Err != "" { - return nil, errors.New(doc.Err) - } - - info = &MapReduceInfo{ - InputCount: doc.Counts.Input, - EmitCount: doc.Counts.Emit, - OutputCount: doc.Counts.Output, - Time: doc.TimeMillis * 1e6, - } - - if doc.Result.Kind == 0x02 { - err = doc.Result.Unmarshal(&info.Collection) - info.Database = dbname - } else if doc.Result.Kind == 0x03 { - var v struct{ Collection, Db string } - err = doc.Result.Unmarshal(&v) - info.Collection = v.Collection - info.Database = v.Db - } - - if doc.Timing != nil { - info.VerboseTime = doc.Timing - info.VerboseTime.Total *= 1e6 - info.VerboseTime.Map *= 1e6 - info.VerboseTime.EmitLoop *= 1e6 - } - - if err != nil { - return nil, err - } - if result != nil { - return info, doc.Results.Unmarshal(result) - } - return info, nil -} - -// The "out" option in the MapReduce command must be ordered. This was -// found after the implementation was accepting maps for a long time, -// so rather than breaking the API, we'll fix the order if necessary. -// Details about the order requirement may be seen in MongoDB's code: -// -// http://goo.gl/L8jwJX -// -func fixMROut(out interface{}) interface{} { - outv := reflect.ValueOf(out) - if outv.Kind() != reflect.Map || outv.Type().Key() != reflect.TypeOf("") { - return out - } - outs := make(bson.D, outv.Len()) - - outTypeIndex := -1 - for i, k := range outv.MapKeys() { - ks := k.String() - outs[i].Name = ks - outs[i].Value = outv.MapIndex(k).Interface() - switch ks { - case "normal", "replace", "merge", "reduce", "inline": - outTypeIndex = i - } - } - if outTypeIndex > 0 { - outs[0], outs[outTypeIndex] = outs[outTypeIndex], outs[0] - } - return outs -} - -// Change holds fields for running a findAndModify MongoDB command via -// the Query.Apply method. -type Change struct { - Update interface{} // The update document - Upsert bool // Whether to insert in case the document isn't found - Remove bool // Whether to remove the document found rather than updating - ReturnNew bool // Should the modified document be returned rather than the old one -} - -type findModifyCmd struct { - Collection string "findAndModify" - Query, Update, Sort, Fields interface{} ",omitempty" - Upsert, Remove, New bool ",omitempty" -} - -type valueResult struct { - Value bson.Raw - LastError LastError "lastErrorObject" -} - -// Apply runs the findAndModify MongoDB command, which allows updating, upserting -// or removing a document matching a query and atomically returning either the old -// version (the default) or the new version of the document (when ReturnNew is true). -// If no objects are found Apply returns ErrNotFound. -// -// The Sort and Select query methods affect the result of Apply. In case -// multiple documents match the query, Sort enables selecting which document to -// act upon by ordering it first. Select enables retrieving only a selection -// of fields of the new or old document. -// -// This simple example increments a counter and prints its new value: -// -// change := mgo.Change{ -// Update: bson.M{"$inc": bson.M{"n": 1}}, -// ReturnNew: true, -// } -// info, err = col.Find(M{"_id": id}).Apply(change, &doc) -// fmt.Println(doc.N) -// -// This method depends on MongoDB >= 2.0 to work properly. -// -// Relevant documentation: -// -// http://www.mongodb.org/display/DOCS/findAndModify+Command -// http://www.mongodb.org/display/DOCS/Updating -// http://www.mongodb.org/display/DOCS/Atomic+Operations -// -func (q *Query) Apply(change Change, result interface{}) (info *ChangeInfo, err error) { - q.m.Lock() - session := q.session - op := q.op // Copy. - q.m.Unlock() - - c := strings.Index(op.collection, ".") - if c < 0 { - return nil, errors.New("bad collection name: " + op.collection) - } - - dbname := op.collection[:c] - cname := op.collection[c+1:] - - cmd := findModifyCmd{ - Collection: cname, - Update: change.Update, - Upsert: change.Upsert, - Remove: change.Remove, - New: change.ReturnNew, - Query: op.query, - Sort: op.options.OrderBy, - Fields: op.selector, - } - - session = session.Clone() - defer session.Close() - session.SetMode(Strong, false) - - var doc valueResult - err = session.DB(dbname).Run(&cmd, &doc) - if err != nil { - if qerr, ok := err.(*QueryError); ok && qerr.Message == "No matching object found" { - return nil, ErrNotFound - } - return nil, err - } - if doc.LastError.N == 0 { - return nil, ErrNotFound - } - if doc.Value.Kind != 0x0A && result != nil { - err = doc.Value.Unmarshal(result) - if err != nil { - return nil, err - } - } - info = &ChangeInfo{} - lerr := &doc.LastError - if lerr.UpdatedExisting { - info.Updated = lerr.N - } else if change.Remove { - info.Removed = lerr.N - } else if change.Upsert { - info.UpsertedId = lerr.UpsertedId - } - return info, nil -} - -// The BuildInfo type encapsulates details about the running MongoDB server. -// -// Note that the VersionArray field was introduced in MongoDB 2.0+, but it is -// internally assembled from the Version information for previous versions. -// In both cases, VersionArray is guaranteed to have at least 4 entries. -type BuildInfo struct { - Version string - VersionArray []int `bson:"versionArray"` // On MongoDB 2.0+; assembled from Version otherwise - GitVersion string `bson:"gitVersion"` - OpenSSLVersion string `bson:"OpenSSLVersion"` - SysInfo string `bson:"sysInfo"` - Bits int - Debug bool - MaxObjectSize int `bson:"maxBsonObjectSize"` -} - -// VersionAtLeast returns whether the BuildInfo version is greater than or -// equal to the provided version number. If more than one number is -// provided, numbers will be considered as major, minor, and so on. -func (bi *BuildInfo) VersionAtLeast(version ...int) bool { - for i := range version { - if i == len(bi.VersionArray) { - return false - } - if bi.VersionArray[i] < version[i] { - return false - } - } - return true -} - -// BuildInfo retrieves the version and other details about the -// running MongoDB server. -func (s *Session) BuildInfo() (info BuildInfo, err error) { - err = s.Run(bson.D{{"buildInfo", "1"}}, &info) - if len(info.VersionArray) == 0 { - for _, a := range strings.Split(info.Version, ".") { - i, err := strconv.Atoi(a) - if err != nil { - break - } - info.VersionArray = append(info.VersionArray, i) - } - } - for len(info.VersionArray) < 4 { - info.VersionArray = append(info.VersionArray, 0) - } - if i := strings.IndexByte(info.GitVersion, ' '); i >= 0 { - // Strip off the " modules: enterprise" suffix. This is a _git version_. - // That information may be moved to another field if people need it. - info.GitVersion = info.GitVersion[:i] - } - return -} - -// --------------------------------------------------------------------------- -// Internal session handling helpers. - -func (s *Session) acquireSocket(slaveOk bool) (*mongoSocket, error) { - - // Read-only lock to check for previously reserved socket. - s.m.RLock() - if s.masterSocket != nil { - socket := s.masterSocket - socket.Acquire() - s.m.RUnlock() - return socket, nil - } - if s.slaveSocket != nil && s.slaveOk && slaveOk { - socket := s.slaveSocket - socket.Acquire() - s.m.RUnlock() - return socket, nil - } - s.m.RUnlock() - - // No go. We may have to request a new socket and change the session, - // so try again but with an exclusive lock now. - s.m.Lock() - defer s.m.Unlock() - - if s.masterSocket != nil { - s.masterSocket.Acquire() - return s.masterSocket, nil - } - if s.slaveSocket != nil && s.slaveOk && slaveOk { - s.slaveSocket.Acquire() - return s.slaveSocket, nil - } - - // Still not good. We need a new socket. - sock, err := s.cluster().AcquireSocket(slaveOk && s.slaveOk, s.syncTimeout, s.sockTimeout, s.queryConfig.op.serverTags, s.poolLimit) - if err != nil { - return nil, err - } - - // Authenticate the new socket. - if err = s.socketLogin(sock); err != nil { - sock.Release() - return nil, err - } - - // Keep track of the new socket, if necessary. - // Note that, as a special case, if the Eventual session was - // not refreshed (s.slaveSocket != nil), it means the developer - // asked to preserve an existing reserved socket, so we'll - // keep a master one around too before a Refresh happens. - if s.consistency != Eventual || s.slaveSocket != nil { - s.setSocket(sock) - } - - // Switch over a Monotonic session to the master. - if !slaveOk && s.consistency == Monotonic { - s.slaveOk = false - } - - return sock, nil -} - -// setSocket binds socket to this section. -func (s *Session) setSocket(socket *mongoSocket) { - info := socket.Acquire() - if info.Master { - if s.masterSocket != nil { - panic("setSocket(master) with existing master socket reserved") - } - s.masterSocket = socket - } else { - if s.slaveSocket != nil { - panic("setSocket(slave) with existing slave socket reserved") - } - s.slaveSocket = socket - } -} - -// unsetSocket releases any slave and/or master sockets reserved. -func (s *Session) unsetSocket() { - if s.masterSocket != nil { - s.masterSocket.Release() - } - if s.slaveSocket != nil { - s.slaveSocket.Release() - } - s.masterSocket = nil - s.slaveSocket = nil -} - -func (iter *Iter) replyFunc() replyFunc { - return func(err error, op *replyOp, docNum int, docData []byte) { - iter.m.Lock() - iter.docsToReceive-- - if err != nil { - iter.err = err - debugf("Iter %p received an error: %s", iter, err.Error()) - } else if docNum == -1 { - debugf("Iter %p received no documents (cursor=%d).", iter, op.cursorId) - if op != nil && op.cursorId != 0 { - // It's a tailable cursor. - iter.op.cursorId = op.cursorId - } else if op != nil && op.cursorId == 0 && op.flags&1 == 1 { - // Cursor likely timed out. - iter.err = ErrCursor - } else { - iter.err = ErrNotFound - } - } else { - rdocs := int(op.replyDocs) - if docNum == 0 { - iter.docsToReceive += rdocs - 1 - docsToProcess := iter.docData.Len() + rdocs - if iter.limit == 0 || int32(docsToProcess) < iter.limit { - iter.docsBeforeMore = docsToProcess - int(iter.prefetch*float64(rdocs)) - } else { - iter.docsBeforeMore = -1 - } - iter.op.cursorId = op.cursorId - } - // XXX Handle errors and flags. - debugf("Iter %p received reply document %d/%d (cursor=%d)", iter, docNum+1, rdocs, op.cursorId) - iter.docData.Push(docData) - } - iter.gotReply.Broadcast() - iter.m.Unlock() - } -} - -type writeCmdResult struct { - Ok bool - N int - NModified int `bson:"nModified"` - Upserted []struct { - Index int - Id interface{} `_id` - } - Errors []struct { - Ok bool - Index int - Code int - N int - ErrMsg string - } `bson:"writeErrors"` - ConcernError struct { - Code int - ErrMsg string - } `bson:"writeConcernError"` -} - -// writeQuery runs the given modifying operation, potentially followed up -// by a getLastError command in case the session is in safe mode. The -// LastError result is made available in lerr, and if lerr.Err is set it -// will also be returned as err. -func (c *Collection) writeQuery(op interface{}) (lerr *LastError, err error) { - s := c.Database.Session - dbname := c.Database.Name - socket, err := s.acquireSocket(dbname == "local") - if err != nil { - return nil, err - } - defer socket.Release() - - s.m.RLock() - safeOp := s.safeOp - s.m.RUnlock() - - // TODO Enable this path for wire version 2 as well. - if socket.ServerInfo().MaxWireVersion >= 3 { - // Servers with a more recent write protocol benefit from write commands. - if op, ok := op.(*insertOp); ok && len(op.documents) > 1000 { - var firstErr error - // Maximum batch size is 1000. Must split out in separate operations for compatibility. - all := op.documents - for i := 0; i < len(all); i += 1000 { - l := i + 1000 - if l > len(all) { - l = len(all) - } - op.documents = all[i:l] - _, err := c.writeCommand(socket, safeOp, op) - if err != nil { - if op.flags&1 != 0 { - if firstErr == nil { - firstErr = err - } - } else { - return nil, err - } - } - } - return nil, firstErr - } - return c.writeCommand(socket, safeOp, op) - } - - if safeOp == nil { - return nil, socket.Query(op) - } - - var mutex sync.Mutex - var replyData []byte - var replyErr error - mutex.Lock() - query := *safeOp // Copy the data. - query.collection = dbname + ".$cmd" - query.replyFunc = func(err error, reply *replyOp, docNum int, docData []byte) { - replyData = docData - replyErr = err - mutex.Unlock() - } - err = socket.Query(op, &query) - if err != nil { - return nil, err - } - mutex.Lock() // Wait. - if replyErr != nil { - return nil, replyErr // XXX TESTME - } - if hasErrMsg(replyData) { - // Looks like getLastError itself failed. - err = checkQueryError(query.collection, replyData) - if err != nil { - return nil, err - } - } - result := &LastError{} - bson.Unmarshal(replyData, &result) - debugf("Result from writing query: %#v", result) - if result.Err != "" { - return result, result - } - return result, nil -} - -func (c *Collection) writeCommand(socket *mongoSocket, safeOp *queryOp, op interface{}) (lerr *LastError, err error) { - var writeConcern interface{} - if safeOp == nil { - writeConcern = bson.D{{"w", 0}} - } else { - writeConcern = safeOp.query.(*getLastError) - } - - var cmd bson.D - switch op := op.(type) { - case *insertOp: - // http://docs.mongodb.org/manual/reference/command/insert - cmd = bson.D{ - {"insert", c.Name}, - {"documents", op.documents}, - {"writeConcern", writeConcern}, - {"ordered", op.flags&1 == 0}, - } - case *updateOp: - // http://docs.mongodb.org/manual/reference/command/update - selector := op.selector - if selector == nil { - selector = bson.D{} - } - cmd = bson.D{ - {"update", c.Name}, - {"updates", []bson.D{{{"q", selector}, {"u", op.update}, {"upsert", op.flags&1 != 0}, {"multi", op.flags&2 != 0}}}}, - {"writeConcern", writeConcern}, - //{"ordered", }, - } - case *deleteOp: - // http://docs.mongodb.org/manual/reference/command/delete - selector := op.selector - if selector == nil { - selector = bson.D{} - } - cmd = bson.D{ - {"delete", c.Name}, - {"deletes", []bson.D{{{"q", selector}, {"limit", op.flags & 1}}}}, - {"writeConcern", writeConcern}, - //{"ordered", }, - } - } - - var result writeCmdResult - err = c.Database.run(socket, cmd, &result) - debugf("Write command result: %#v (err=%v)", result, err) - lerr = &LastError{ - UpdatedExisting: result.N > 0 && len(result.Upserted) == 0, - N: result.N, - } - if len(result.Upserted) > 0 { - lerr.UpsertedId = result.Upserted[0].Id - } - if len(result.Errors) > 0 { - e := result.Errors[0] - if !e.Ok { - lerr.Code = e.Code - lerr.Err = e.ErrMsg - err = lerr - } - } else if result.ConcernError.Code != 0 { - e := result.ConcernError - lerr.Code = e.Code - lerr.Err = e.ErrMsg - err = lerr - } - - if err == nil && safeOp == nil { - return nil, nil - } - return lerr, err -} - -func hasErrMsg(d []byte) bool { - l := len(d) - for i := 0; i+8 < l; i++ { - if d[i] == '\x02' && d[i+1] == 'e' && d[i+2] == 'r' && d[i+3] == 'r' && d[i+4] == 'm' && d[i+5] == 's' && d[i+6] == 'g' && d[i+7] == '\x00' { - return true - } - } - return false -} diff --git a/vendor/gopkg.in/mgo.v2/session_test.go b/vendor/gopkg.in/mgo.v2/session_test.go deleted file mode 100644 index 3ec5550a4..000000000 --- a/vendor/gopkg.in/mgo.v2/session_test.go +++ /dev/null @@ -1,3704 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// 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 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 mgo_test - -import ( - "flag" - "fmt" - "math" - "reflect" - "runtime" - "sort" - "strconv" - "strings" - "time" - - . "gopkg.in/check.v1" - "gopkg.in/mgo.v2" - "gopkg.in/mgo.v2/bson" -) - -func (s *S) TestRunString(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - result := struct{ Ok int }{} - err = session.Run("ping", &result) - c.Assert(err, IsNil) - c.Assert(result.Ok, Equals, 1) -} - -func (s *S) TestRunValue(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - result := struct{ Ok int }{} - err = session.Run(M{"ping": 1}, &result) - c.Assert(err, IsNil) - c.Assert(result.Ok, Equals, 1) -} - -func (s *S) TestPing(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - // Just ensure the nonce has been received. - result := struct{}{} - err = session.Run("ping", &result) - - mgo.ResetStats() - - err = session.Ping() - c.Assert(err, IsNil) - - // Pretty boring. - stats := mgo.GetStats() - c.Assert(stats.SentOps, Equals, 1) - c.Assert(stats.ReceivedOps, Equals, 1) -} - -func (s *S) TestURLSingle(c *C) { - session, err := mgo.Dial("mongodb://localhost:40001/") - c.Assert(err, IsNil) - defer session.Close() - - result := struct{ Ok int }{} - err = session.Run("ping", &result) - c.Assert(err, IsNil) - c.Assert(result.Ok, Equals, 1) -} - -func (s *S) TestURLMany(c *C) { - session, err := mgo.Dial("mongodb://localhost:40011,localhost:40012/") - c.Assert(err, IsNil) - defer session.Close() - - result := struct{ Ok int }{} - err = session.Run("ping", &result) - c.Assert(err, IsNil) - c.Assert(result.Ok, Equals, 1) -} - -func (s *S) TestURLParsing(c *C) { - urls := []string{ - "localhost:40001?foo=1&bar=2", - "localhost:40001?foo=1;bar=2", - } - for _, url := range urls { - session, err := mgo.Dial(url) - if session != nil { - session.Close() - } - c.Assert(err, ErrorMatches, "unsupported connection URL option: (foo=1|bar=2)") - } -} - -func (s *S) TestInsertFindOne(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"a": 1, "b": 2}) - c.Assert(err, IsNil) - err = coll.Insert(M{"a": 1, "b": 3}) - c.Assert(err, IsNil) - - result := struct{ A, B int }{} - - err = coll.Find(M{"a": 1}).Sort("b").One(&result) - c.Assert(err, IsNil) - c.Assert(result.A, Equals, 1) - c.Assert(result.B, Equals, 2) -} - -func (s *S) TestInsertFindOneNil(c *C) { - session, err := mgo.Dial("localhost:40002") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - err = coll.Find(nil).One(nil) - c.Assert(err, ErrorMatches, "unauthorized.*|not authorized.*") -} - -func (s *S) TestInsertFindOneMap(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"a": 1, "b": 2}) - c.Assert(err, IsNil) - result := make(M) - err = coll.Find(M{"a": 1}).One(result) - c.Assert(err, IsNil) - c.Assert(result["a"], Equals, 1) - c.Assert(result["b"], Equals, 2) -} - -func (s *S) TestInsertFindAll(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"a": 1, "b": 2}) - c.Assert(err, IsNil) - err = coll.Insert(M{"a": 3, "b": 4}) - c.Assert(err, IsNil) - - type R struct{ A, B int } - var result []R - - assertResult := func() { - c.Assert(len(result), Equals, 2) - c.Assert(result[0].A, Equals, 1) - c.Assert(result[0].B, Equals, 2) - c.Assert(result[1].A, Equals, 3) - c.Assert(result[1].B, Equals, 4) - } - - // nil slice - err = coll.Find(nil).Sort("a").All(&result) - c.Assert(err, IsNil) - assertResult() - - // Previously allocated slice - allocd := make([]R, 5) - result = allocd - err = coll.Find(nil).Sort("a").All(&result) - c.Assert(err, IsNil) - assertResult() - - // Ensure result is backed by the originally allocated array - c.Assert(&result[0], Equals, &allocd[0]) - - // Non-pointer slice error - f := func() { coll.Find(nil).All(result) } - c.Assert(f, Panics, "result argument must be a slice address") - - // Non-slice error - f = func() { coll.Find(nil).All(new(int)) } - c.Assert(f, Panics, "result argument must be a slice address") -} - -func (s *S) TestFindRef(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - db1 := session.DB("db1") - db1col1 := db1.C("col1") - - db2 := session.DB("db2") - db2col1 := db2.C("col1") - - err = db1col1.Insert(M{"_id": 1, "n": 1}) - c.Assert(err, IsNil) - err = db1col1.Insert(M{"_id": 2, "n": 2}) - c.Assert(err, IsNil) - err = db2col1.Insert(M{"_id": 2, "n": 3}) - c.Assert(err, IsNil) - - result := struct{ N int }{} - - ref1 := &mgo.DBRef{Collection: "col1", Id: 1} - ref2 := &mgo.DBRef{Collection: "col1", Id: 2, Database: "db2"} - - err = db1.FindRef(ref1).One(&result) - c.Assert(err, IsNil) - c.Assert(result.N, Equals, 1) - - err = db1.FindRef(ref2).One(&result) - c.Assert(err, IsNil) - c.Assert(result.N, Equals, 3) - - err = db2.FindRef(ref1).One(&result) - c.Assert(err, Equals, mgo.ErrNotFound) - - err = db2.FindRef(ref2).One(&result) - c.Assert(err, IsNil) - c.Assert(result.N, Equals, 3) - - err = session.FindRef(ref2).One(&result) - c.Assert(err, IsNil) - c.Assert(result.N, Equals, 3) - - f := func() { session.FindRef(ref1).One(&result) } - c.Assert(f, PanicMatches, "Can't resolve database for &mgo.DBRef{Collection:\"col1\", Id:1, Database:\"\"}") -} - -func (s *S) TestDatabaseAndCollectionNames(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - db1 := session.DB("db1") - db1col1 := db1.C("col1") - db1col2 := db1.C("col2") - - db2 := session.DB("db2") - db2col1 := db2.C("col3") - - err = db1col1.Insert(M{"_id": 1}) - c.Assert(err, IsNil) - err = db1col2.Insert(M{"_id": 1}) - c.Assert(err, IsNil) - err = db2col1.Insert(M{"_id": 1}) - c.Assert(err, IsNil) - - names, err := session.DatabaseNames() - c.Assert(err, IsNil) - if !reflect.DeepEqual(names, []string{"db1", "db2"}) { - // 2.4+ has "local" as well. - c.Assert(names, DeepEquals, []string{"db1", "db2", "local"}) - } - - // Try to exercise cursor logic. 2.8.0-rc3 still ignores this. - session.SetBatch(2) - - names, err = db1.CollectionNames() - c.Assert(err, IsNil) - c.Assert(names, DeepEquals, []string{"col1", "col2", "system.indexes"}) - - names, err = db2.CollectionNames() - c.Assert(err, IsNil) - c.Assert(names, DeepEquals, []string{"col3", "system.indexes"}) -} - -func (s *S) TestSelect(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - coll.Insert(M{"a": 1, "b": 2}) - - result := struct{ A, B int }{} - - err = coll.Find(M{"a": 1}).Select(M{"b": 1}).One(&result) - c.Assert(err, IsNil) - c.Assert(result.A, Equals, 0) - c.Assert(result.B, Equals, 2) -} - -func (s *S) TestInlineMap(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - var v, result1 struct { - A int - M map[string]int ",inline" - } - - v.A = 1 - v.M = map[string]int{"b": 2} - err = coll.Insert(v) - c.Assert(err, IsNil) - - noId := M{"_id": 0} - - err = coll.Find(nil).Select(noId).One(&result1) - c.Assert(err, IsNil) - c.Assert(result1.A, Equals, 1) - c.Assert(result1.M, DeepEquals, map[string]int{"b": 2}) - - var result2 M - err = coll.Find(nil).Select(noId).One(&result2) - c.Assert(err, IsNil) - c.Assert(result2, DeepEquals, M{"a": 1, "b": 2}) - -} - -func (s *S) TestUpdate(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - err := coll.Insert(M{"k": n, "n": n}) - c.Assert(err, IsNil) - } - - // No changes is a no-op and shouldn't return an error. - err = coll.Update(M{"k": 42}, M{"$set": M{"n": 42}}) - c.Assert(err, IsNil) - - err = coll.Update(M{"k": 42}, M{"$inc": M{"n": 1}}) - c.Assert(err, IsNil) - - result := make(M) - err = coll.Find(M{"k": 42}).One(result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 43) - - err = coll.Update(M{"k": 47}, M{"k": 47, "n": 47}) - c.Assert(err, Equals, mgo.ErrNotFound) - - err = coll.Find(M{"k": 47}).One(result) - c.Assert(err, Equals, mgo.ErrNotFound) -} - -func (s *S) TestUpdateId(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - err := coll.Insert(M{"_id": n, "n": n}) - c.Assert(err, IsNil) - } - - err = coll.UpdateId(42, M{"$inc": M{"n": 1}}) - c.Assert(err, IsNil) - - result := make(M) - err = coll.FindId(42).One(result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 43) - - err = coll.UpdateId(47, M{"k": 47, "n": 47}) - c.Assert(err, Equals, mgo.ErrNotFound) - - err = coll.FindId(47).One(result) - c.Assert(err, Equals, mgo.ErrNotFound) -} - -func (s *S) TestUpdateNil(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - err = coll.Insert(M{"k": 42, "n": 42}) - c.Assert(err, IsNil) - err = coll.Update(nil, M{"$inc": M{"n": 1}}) - c.Assert(err, IsNil) - - result := make(M) - err = coll.Find(M{"k": 42}).One(result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 43) - - err = coll.Insert(M{"k": 45, "n": 45}) - c.Assert(err, IsNil) - _, err = coll.UpdateAll(nil, M{"$inc": M{"n": 1}}) - c.Assert(err, IsNil) - - err = coll.Find(M{"k": 42}).One(result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 44) - err = coll.Find(M{"k": 45}).One(result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 46) -} - -func (s *S) TestUpsert(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - err := coll.Insert(M{"k": n, "n": n}) - c.Assert(err, IsNil) - } - - info, err := coll.Upsert(M{"k": 42}, M{"k": 42, "n": 24}) - c.Assert(err, IsNil) - c.Assert(info.Updated, Equals, 1) - c.Assert(info.UpsertedId, IsNil) - - result := M{} - err = coll.Find(M{"k": 42}).One(result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 24) - - // Insert with internally created id. - info, err = coll.Upsert(M{"k": 47}, M{"k": 47, "n": 47}) - c.Assert(err, IsNil) - c.Assert(info.Updated, Equals, 0) - c.Assert(info.UpsertedId, NotNil) - - err = coll.Find(M{"k": 47}).One(result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 47) - - result = M{} - err = coll.Find(M{"_id": info.UpsertedId}).One(result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 47) - - // Insert with provided id. - info, err = coll.Upsert(M{"k": 48}, M{"k": 48, "n": 48, "_id": 48}) - c.Assert(err, IsNil) - c.Assert(info.Updated, Equals, 0) - if s.versionAtLeast(2, 6) { - c.Assert(info.UpsertedId, Equals, 48) - } else { - c.Assert(info.UpsertedId, IsNil) // Unfortunate, but that's what Mongo gave us. - } - - err = coll.Find(M{"k": 48}).One(result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 48) -} - -func (s *S) TestUpsertId(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - err := coll.Insert(M{"_id": n, "n": n}) - c.Assert(err, IsNil) - } - - info, err := coll.UpsertId(42, M{"n": 24}) - c.Assert(err, IsNil) - c.Assert(info.Updated, Equals, 1) - c.Assert(info.UpsertedId, IsNil) - - result := M{} - err = coll.FindId(42).One(result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 24) - - info, err = coll.UpsertId(47, M{"_id": 47, "n": 47}) - c.Assert(err, IsNil) - c.Assert(info.Updated, Equals, 0) - if s.versionAtLeast(2, 6) { - c.Assert(info.UpsertedId, Equals, 47) - } else { - c.Assert(info.UpsertedId, IsNil) - } - - err = coll.FindId(47).One(result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 47) -} - -func (s *S) TestUpdateAll(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - err := coll.Insert(M{"k": n, "n": n}) - c.Assert(err, IsNil) - } - - // Don't actually modify the documents. Should still report 4 matching updates. - info, err := coll.UpdateAll(M{"k": M{"$gt": 42}}, M{"$unset": M{"missing": 1}}) - c.Assert(err, IsNil) - c.Assert(info.Updated, Equals, 4) - - info, err = coll.UpdateAll(M{"k": M{"$gt": 42}}, M{"$inc": M{"n": 1}}) - c.Assert(err, IsNil) - c.Assert(info.Updated, Equals, 4) - - result := make(M) - err = coll.Find(M{"k": 42}).One(result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 42) - - err = coll.Find(M{"k": 43}).One(result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 44) - - err = coll.Find(M{"k": 44}).One(result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 45) - - if !s.versionAtLeast(2, 6) { - // 2.6 made this invalid. - info, err = coll.UpdateAll(M{"k": 47}, M{"k": 47, "n": 47}) - c.Assert(err, Equals, nil) - c.Assert(info.Updated, Equals, 0) - } -} - -func (s *S) TestRemove(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - err := coll.Insert(M{"n": n}) - c.Assert(err, IsNil) - } - - err = coll.Remove(M{"n": M{"$gt": 42}}) - c.Assert(err, IsNil) - - result := &struct{ N int }{} - err = coll.Find(M{"n": 42}).One(result) - c.Assert(err, IsNil) - c.Assert(result.N, Equals, 42) - - err = coll.Find(M{"n": 43}).One(result) - c.Assert(err, Equals, mgo.ErrNotFound) - - err = coll.Find(M{"n": 44}).One(result) - c.Assert(err, IsNil) - c.Assert(result.N, Equals, 44) -} - -func (s *S) TestRemoveId(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - err = coll.Insert(M{"_id": 40}, M{"_id": 41}, M{"_id": 42}) - c.Assert(err, IsNil) - - err = coll.RemoveId(41) - c.Assert(err, IsNil) - - c.Assert(coll.FindId(40).One(nil), IsNil) - c.Assert(coll.FindId(41).One(nil), Equals, mgo.ErrNotFound) - c.Assert(coll.FindId(42).One(nil), IsNil) -} - -func (s *S) TestRemoveUnsafe(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - session.SetSafe(nil) - - coll := session.DB("mydb").C("mycoll") - - err = coll.Insert(M{"_id": 40}, M{"_id": 41}, M{"_id": 42}) - c.Assert(err, IsNil) - - err = coll.RemoveId(41) - c.Assert(err, IsNil) - - c.Assert(coll.FindId(40).One(nil), IsNil) - c.Assert(coll.FindId(41).One(nil), Equals, mgo.ErrNotFound) - c.Assert(coll.FindId(42).One(nil), IsNil) -} - -func (s *S) TestRemoveAll(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - err := coll.Insert(M{"n": n}) - c.Assert(err, IsNil) - } - - info, err := coll.RemoveAll(M{"n": M{"$gt": 42}}) - c.Assert(err, IsNil) - c.Assert(info.Updated, Equals, 0) - c.Assert(info.Removed, Equals, 4) - c.Assert(info.UpsertedId, IsNil) - - result := &struct{ N int }{} - err = coll.Find(M{"n": 42}).One(result) - c.Assert(err, IsNil) - c.Assert(result.N, Equals, 42) - - err = coll.Find(M{"n": 43}).One(result) - c.Assert(err, Equals, mgo.ErrNotFound) - - err = coll.Find(M{"n": 44}).One(result) - c.Assert(err, Equals, mgo.ErrNotFound) - - info, err = coll.RemoveAll(nil) - c.Assert(err, IsNil) - c.Assert(info.Updated, Equals, 0) - c.Assert(info.Removed, Equals, 3) - c.Assert(info.UpsertedId, IsNil) - - n, err := coll.Find(nil).Count() - c.Assert(err, IsNil) - c.Assert(n, Equals, 0) -} - -func (s *S) TestDropDatabase(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - db1 := session.DB("db1") - db1.C("col").Insert(M{"_id": 1}) - - db2 := session.DB("db2") - db2.C("col").Insert(M{"_id": 1}) - - err = db1.DropDatabase() - c.Assert(err, IsNil) - - names, err := session.DatabaseNames() - c.Assert(err, IsNil) - if !reflect.DeepEqual(names, []string{"db2"}) { - // 2.4+ has "local" as well. - c.Assert(names, DeepEquals, []string{"db2", "local"}) - } - - err = db2.DropDatabase() - c.Assert(err, IsNil) - - names, err = session.DatabaseNames() - c.Assert(err, IsNil) - if !reflect.DeepEqual(names, []string(nil)) { - // 2.4+ has "local" as well. - c.Assert(names, DeepEquals, []string{"local"}) - } -} - -func (s *S) TestDropCollection(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - db := session.DB("db1") - db.C("col1").Insert(M{"_id": 1}) - db.C("col2").Insert(M{"_id": 1}) - - err = db.C("col1").DropCollection() - c.Assert(err, IsNil) - - names, err := db.CollectionNames() - c.Assert(err, IsNil) - c.Assert(names, DeepEquals, []string{"col2", "system.indexes"}) - - err = db.C("col2").DropCollection() - c.Assert(err, IsNil) - - names, err = db.CollectionNames() - c.Assert(err, IsNil) - c.Assert(names, DeepEquals, []string{"system.indexes"}) -} - -func (s *S) TestCreateCollectionCapped(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - info := &mgo.CollectionInfo{ - Capped: true, - MaxBytes: 1024, - MaxDocs: 3, - } - err = coll.Create(info) - c.Assert(err, IsNil) - - ns := []int{1, 2, 3, 4, 5} - for _, n := range ns { - err := coll.Insert(M{"n": n}) - c.Assert(err, IsNil) - } - - n, err := coll.Find(nil).Count() - c.Assert(err, IsNil) - c.Assert(n, Equals, 3) -} - -func (s *S) TestCreateCollectionNoIndex(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - info := &mgo.CollectionInfo{ - DisableIdIndex: true, - } - err = coll.Create(info) - c.Assert(err, IsNil) - - err = coll.Insert(M{"n": 1}) - c.Assert(err, IsNil) - - indexes, err := coll.Indexes() - c.Assert(indexes, HasLen, 0) -} - -func (s *S) TestCreateCollectionForceIndex(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - info := &mgo.CollectionInfo{ - ForceIdIndex: true, - Capped: true, - MaxBytes: 1024, - } - err = coll.Create(info) - c.Assert(err, IsNil) - - err = coll.Insert(M{"n": 1}) - c.Assert(err, IsNil) - - indexes, err := coll.Indexes() - c.Assert(indexes, HasLen, 1) -} - -func (s *S) TestIsDupValues(c *C) { - c.Assert(mgo.IsDup(nil), Equals, false) - c.Assert(mgo.IsDup(&mgo.LastError{Code: 1}), Equals, false) - c.Assert(mgo.IsDup(&mgo.QueryError{Code: 1}), Equals, false) - c.Assert(mgo.IsDup(&mgo.LastError{Code: 11000}), Equals, true) - c.Assert(mgo.IsDup(&mgo.QueryError{Code: 11000}), Equals, true) - c.Assert(mgo.IsDup(&mgo.LastError{Code: 11001}), Equals, true) - c.Assert(mgo.IsDup(&mgo.QueryError{Code: 11001}), Equals, true) - c.Assert(mgo.IsDup(&mgo.LastError{Code: 12582}), Equals, true) - c.Assert(mgo.IsDup(&mgo.QueryError{Code: 12582}), Equals, true) - lerr := &mgo.LastError{Code: 16460, Err: "error inserting 1 documents to shard ... caused by :: E11000 duplicate key error index: ..."} - c.Assert(mgo.IsDup(lerr), Equals, true) -} - -func (s *S) TestIsDupPrimary(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - err = coll.Insert(M{"_id": 1}) - c.Assert(err, IsNil) - err = coll.Insert(M{"_id": 1}) - c.Assert(err, ErrorMatches, ".*duplicate key error.*") - c.Assert(mgo.IsDup(err), Equals, true) -} - -func (s *S) TestIsDupUnique(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - index := mgo.Index{ - Key: []string{"a", "b"}, - Unique: true, - } - - coll := session.DB("mydb").C("mycoll") - - err = coll.EnsureIndex(index) - c.Assert(err, IsNil) - - err = coll.Insert(M{"a": 1, "b": 1}) - c.Assert(err, IsNil) - err = coll.Insert(M{"a": 1, "b": 1}) - c.Assert(err, ErrorMatches, ".*duplicate key error.*") - c.Assert(mgo.IsDup(err), Equals, true) -} - -func (s *S) TestIsDupCapped(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - info := &mgo.CollectionInfo{ - ForceIdIndex: true, - Capped: true, - MaxBytes: 1024, - } - err = coll.Create(info) - c.Assert(err, IsNil) - - err = coll.Insert(M{"_id": 1}) - c.Assert(err, IsNil) - err = coll.Insert(M{"_id": 1}) - // The error was different for capped collections before 2.6. - c.Assert(err, ErrorMatches, ".*duplicate key.*") - // The issue is reduced by using IsDup. - c.Assert(mgo.IsDup(err), Equals, true) -} - -func (s *S) TestIsDupFindAndModify(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - err = coll.EnsureIndex(mgo.Index{Key: []string{"n"}, Unique: true}) - c.Assert(err, IsNil) - - err = coll.Insert(M{"n": 1}) - c.Assert(err, IsNil) - err = coll.Insert(M{"n": 2}) - c.Assert(err, IsNil) - _, err = coll.Find(M{"n": 1}).Apply(mgo.Change{Update: M{"$inc": M{"n": 1}}}, bson.M{}) - c.Assert(err, ErrorMatches, ".*duplicate key error.*") - c.Assert(mgo.IsDup(err), Equals, true) -} - -func (s *S) TestFindAndModify(c *C) { - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - err = coll.Insert(M{"n": 42}) - - session.SetMode(mgo.Monotonic, true) - - result := M{} - info, err := coll.Find(M{"n": 42}).Apply(mgo.Change{Update: M{"$inc": M{"n": 1}}}, result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 42) - c.Assert(info.Updated, Equals, 1) - c.Assert(info.Removed, Equals, 0) - c.Assert(info.UpsertedId, IsNil) - - // A nil result parameter should be acceptable. - info, err = coll.Find(M{"n": 43}).Apply(mgo.Change{Update: M{"$unset": M{"missing": 1}}}, nil) - c.Assert(err, IsNil) - c.Assert(info.Updated, Equals, 1) - c.Assert(info.Removed, Equals, 0) - c.Assert(info.UpsertedId, IsNil) - - result = M{} - info, err = coll.Find(M{"n": 43}).Apply(mgo.Change{Update: M{"$inc": M{"n": 1}}, ReturnNew: true}, result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 44) - c.Assert(info.Updated, Equals, 1) - c.Assert(info.Removed, Equals, 0) - c.Assert(info.UpsertedId, IsNil) - - result = M{} - info, err = coll.Find(M{"n": 50}).Apply(mgo.Change{Upsert: true, Update: M{"n": 51, "o": 52}}, result) - c.Assert(err, IsNil) - c.Assert(result["n"], IsNil) - c.Assert(info.Updated, Equals, 0) - c.Assert(info.Removed, Equals, 0) - c.Assert(info.UpsertedId, NotNil) - - result = M{} - info, err = coll.Find(nil).Sort("-n").Apply(mgo.Change{Update: M{"$inc": M{"n": 1}}, ReturnNew: true}, result) - c.Assert(err, IsNil) - c.Assert(result["n"], Equals, 52) - c.Assert(info.Updated, Equals, 1) - c.Assert(info.Removed, Equals, 0) - c.Assert(info.UpsertedId, IsNil) - - result = M{} - info, err = coll.Find(M{"n": 52}).Select(M{"o": 1}).Apply(mgo.Change{Remove: true}, result) - c.Assert(err, IsNil) - c.Assert(result["n"], IsNil) - c.Assert(result["o"], Equals, 52) - c.Assert(info.Updated, Equals, 0) - c.Assert(info.Removed, Equals, 1) - c.Assert(info.UpsertedId, IsNil) - - result = M{} - info, err = coll.Find(M{"n": 60}).Apply(mgo.Change{Remove: true}, result) - c.Assert(err, Equals, mgo.ErrNotFound) - c.Assert(len(result), Equals, 0) - c.Assert(info, IsNil) -} - -func (s *S) TestFindAndModifyBug997828(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - err = coll.Insert(M{"n": "not-a-number"}) - - result := make(M) - _, err = coll.Find(M{"n": "not-a-number"}).Apply(mgo.Change{Update: M{"$inc": M{"n": 1}}}, result) - c.Assert(err, ErrorMatches, `(exception: )?Cannot apply \$inc .*`) - if s.versionAtLeast(2, 1) { - qerr, _ := err.(*mgo.QueryError) - c.Assert(qerr, NotNil, Commentf("err: %#v", err)) - if s.versionAtLeast(2, 6) { - // Oh, the dance of error codes. :-( - c.Assert(qerr.Code, Equals, 16837) - } else { - c.Assert(qerr.Code, Equals, 10140) - } - } else { - lerr, _ := err.(*mgo.LastError) - c.Assert(lerr, NotNil, Commentf("err: %#v", err)) - c.Assert(lerr.Code, Equals, 10140) - } -} - -func (s *S) TestCountCollection(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42} - for _, n := range ns { - err := coll.Insert(M{"n": n}) - c.Assert(err, IsNil) - } - - n, err := coll.Count() - c.Assert(err, IsNil) - c.Assert(n, Equals, 3) -} - -func (s *S) TestCountQuery(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42} - for _, n := range ns { - err := coll.Insert(M{"n": n}) - c.Assert(err, IsNil) - } - - n, err := coll.Find(M{"n": M{"$gt": 40}}).Count() - c.Assert(err, IsNil) - c.Assert(n, Equals, 2) -} - -func (s *S) TestCountQuerySorted(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42} - for _, n := range ns { - err := coll.Insert(M{"n": n}) - c.Assert(err, IsNil) - } - - n, err := coll.Find(M{"n": M{"$gt": 40}}).Sort("n").Count() - c.Assert(err, IsNil) - c.Assert(n, Equals, 2) -} - -func (s *S) TestCountSkipLimit(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44} - for _, n := range ns { - err := coll.Insert(M{"n": n}) - c.Assert(err, IsNil) - } - - n, err := coll.Find(nil).Skip(1).Limit(3).Count() - c.Assert(err, IsNil) - c.Assert(n, Equals, 3) - - n, err = coll.Find(nil).Skip(1).Limit(5).Count() - c.Assert(err, IsNil) - c.Assert(n, Equals, 4) -} - -func (s *S) TestQueryExplain(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42} - for _, n := range ns { - err := coll.Insert(M{"n": n}) - c.Assert(err, IsNil) - } - - m := M{} - query := coll.Find(nil).Limit(2) - err = query.Explain(m) - c.Assert(err, IsNil) - if m["queryPlanner"] != nil { - c.Assert(m["executionStats"].(M)["totalDocsExamined"], Equals, 2) - } else { - c.Assert(m["cursor"], Equals, "BasicCursor") - c.Assert(m["nscanned"], Equals, 2) - c.Assert(m["n"], Equals, 2) - } - - n := 0 - var result M - iter := query.Iter() - for iter.Next(&result) { - n++ - } - c.Assert(iter.Close(), IsNil) - c.Assert(n, Equals, 2) -} - -func (s *S) TestQuerySetMaxScan(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42} - for _, n := range ns { - err := coll.Insert(M{"n": n}) - c.Assert(err, IsNil) - } - - query := coll.Find(nil).SetMaxScan(2) - var result []M - err = query.All(&result) - c.Assert(err, IsNil) - c.Assert(result, HasLen, 2) -} - -func (s *S) TestQuerySetMaxTime(c *C) { - if !s.versionAtLeast(2, 6) { - c.Skip("SetMaxTime only supported in 2.6+") - } - - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - coll := session.DB("mydb").C("mycoll") - - for i := 0; i < 1000; i++ { - err := coll.Insert(M{"n": i}) - c.Assert(err, IsNil) - } - - query := coll.Find(nil) - query.SetMaxTime(1 * time.Millisecond) - query.Batch(2) - var result []M - err = query.All(&result) - c.Assert(err, ErrorMatches, "operation exceeded time limit") -} - -func (s *S) TestQueryHint(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - coll.EnsureIndexKey("a") - - m := M{} - err = coll.Find(nil).Hint("a").Explain(m) - c.Assert(err, IsNil) - - if m["queryPlanner"] != nil { - m = m["queryPlanner"].(M) - m = m["winningPlan"].(M) - m = m["inputStage"].(M) - c.Assert(m["indexName"], Equals, "a_1") - } else { - c.Assert(m["indexBounds"], NotNil) - c.Assert(m["indexBounds"].(M)["a"], NotNil) - } -} - -func (s *S) TestQueryComment(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - db := session.DB("mydb") - coll := db.C("mycoll") - - err = db.Run(bson.M{"profile": 2}, nil) - c.Assert(err, IsNil) - - ns := []int{40, 41, 42} - for _, n := range ns { - err := coll.Insert(M{"n": n}) - c.Assert(err, IsNil) - } - - query := coll.Find(bson.M{"n": 41}) - query.Comment("some comment") - err = query.One(nil) - c.Assert(err, IsNil) - - query = coll.Find(bson.M{"n": 41}) - query.Comment("another comment") - err = query.One(nil) - c.Assert(err, IsNil) - - n, err := session.DB("mydb").C("system.profile").Find(bson.M{"query.$query.n": 41, "query.$comment": "some comment"}).Count() - c.Assert(err, IsNil) - c.Assert(n, Equals, 1) -} - -func (s *S) TestFindOneNotFound(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - result := struct{ A, B int }{} - err = coll.Find(M{"a": 1}).One(&result) - c.Assert(err, Equals, mgo.ErrNotFound) - c.Assert(err, ErrorMatches, "not found") - c.Assert(err == mgo.ErrNotFound, Equals, true) -} - -func (s *S) TestFindNil(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"n": 1}) - c.Assert(err, IsNil) - - result := struct{ N int }{} - - err = coll.Find(nil).One(&result) - c.Assert(err, IsNil) - c.Assert(result.N, Equals, 1) -} - -func (s *S) TestFindId(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"_id": 41, "n": 41}) - c.Assert(err, IsNil) - err = coll.Insert(M{"_id": 42, "n": 42}) - c.Assert(err, IsNil) - - result := struct{ N int }{} - - err = coll.FindId(42).One(&result) - c.Assert(err, IsNil) - c.Assert(result.N, Equals, 42) -} - -func (s *S) TestFindIterAll(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - coll.Insert(M{"n": n}) - } - - session.Refresh() // Release socket. - - mgo.ResetStats() - - iter := coll.Find(M{"n": M{"$gte": 42}}).Sort("$natural").Prefetch(0).Batch(2).Iter() - result := struct{ N int }{} - for i := 2; i < 7; i++ { - ok := iter.Next(&result) - c.Assert(ok, Equals, true) - c.Assert(result.N, Equals, ns[i]) - if i == 1 { - stats := mgo.GetStats() - c.Assert(stats.ReceivedDocs, Equals, 2) - } - } - - ok := iter.Next(&result) - c.Assert(ok, Equals, false) - c.Assert(iter.Close(), IsNil) - - session.Refresh() // Release socket. - - stats := mgo.GetStats() - c.Assert(stats.SentOps, Equals, 3) // 1*QUERY_OP + 2*GET_MORE_OP - c.Assert(stats.ReceivedOps, Equals, 3) // and their REPLY_OPs. - c.Assert(stats.ReceivedDocs, Equals, 5) - c.Assert(stats.SocketsInUse, Equals, 0) -} - -func (s *S) TestFindIterTwiceWithSameQuery(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - for i := 40; i != 47; i++ { - coll.Insert(M{"n": i}) - } - - query := coll.Find(M{}).Sort("n") - - result1 := query.Skip(1).Iter() - result2 := query.Skip(2).Iter() - - result := struct{ N int }{} - ok := result2.Next(&result) - c.Assert(ok, Equals, true) - c.Assert(result.N, Equals, 42) - ok = result1.Next(&result) - c.Assert(ok, Equals, true) - c.Assert(result.N, Equals, 41) -} - -func (s *S) TestFindIterWithoutResults(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - coll.Insert(M{"n": 42}) - - iter := coll.Find(M{"n": 0}).Iter() - - result := struct{ N int }{} - ok := iter.Next(&result) - c.Assert(ok, Equals, false) - c.Assert(iter.Close(), IsNil) - c.Assert(result.N, Equals, 0) -} - -func (s *S) TestFindIterLimit(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - coll.Insert(M{"n": n}) - } - - session.Refresh() // Release socket. - - mgo.ResetStats() - - query := coll.Find(M{"n": M{"$gte": 42}}).Sort("$natural").Limit(3) - iter := query.Iter() - - result := struct{ N int }{} - for i := 2; i < 5; i++ { - ok := iter.Next(&result) - c.Assert(ok, Equals, true) - c.Assert(result.N, Equals, ns[i]) - } - - ok := iter.Next(&result) - c.Assert(ok, Equals, false) - c.Assert(iter.Close(), IsNil) - - session.Refresh() // Release socket. - - stats := mgo.GetStats() - c.Assert(stats.SentOps, Equals, 2) // 1*QUERY_OP + 1*KILL_CURSORS_OP - c.Assert(stats.ReceivedOps, Equals, 1) // and its REPLY_OP - c.Assert(stats.ReceivedDocs, Equals, 3) - c.Assert(stats.SocketsInUse, Equals, 0) -} - -var cursorTimeout = flag.Bool("cursor-timeout", false, "Enable cursor timeout test") - -func (s *S) TestFindIterCursorTimeout(c *C) { - if !*cursorTimeout { - c.Skip("-cursor-timeout") - } - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - type Doc struct { - Id int "_id" - } - - coll := session.DB("test").C("test") - coll.Remove(nil) - for i := 0; i < 100; i++ { - err = coll.Insert(Doc{i}) - c.Assert(err, IsNil) - } - - session.SetBatch(1) - iter := coll.Find(nil).Iter() - var doc Doc - if !iter.Next(&doc) { - c.Fatalf("iterator failed to return any documents") - } - - for i := 10; i > 0; i-- { - c.Logf("Sleeping... %d minutes to go...", i) - time.Sleep(1*time.Minute + 2*time.Second) - } - - // Drain any existing documents that were fetched. - if !iter.Next(&doc) { - c.Fatalf("iterator with timed out cursor failed to return previously cached document") - } - if iter.Next(&doc) { - c.Fatalf("timed out cursor returned document") - } - - c.Assert(iter.Err(), Equals, mgo.ErrCursor) -} - -func (s *S) TestTooManyItemsLimitBug(c *C) { - if *fast { - c.Skip("-fast") - } - - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(runtime.NumCPU())) - - mgo.SetDebug(false) - coll := session.DB("mydb").C("mycoll") - words := strings.Split("foo bar baz", " ") - for i := 0; i < 5; i++ { - words = append(words, words...) - } - doc := bson.D{{"words", words}} - inserts := 10000 - limit := 5000 - iters := 0 - c.Assert(inserts > limit, Equals, true) - for i := 0; i < inserts; i++ { - err := coll.Insert(&doc) - c.Assert(err, IsNil) - } - iter := coll.Find(nil).Limit(limit).Iter() - for iter.Next(&doc) { - if iters%100 == 0 { - c.Logf("Seen %d docments", iters) - } - iters++ - } - c.Assert(iter.Close(), IsNil) - c.Assert(iters, Equals, limit) -} - -func serverCursorsOpen(session *mgo.Session) int { - var result struct { - Cursors struct { - TotalOpen int `bson:"totalOpen"` - TimedOut int `bson:"timedOut"` - } - } - err := session.Run("serverStatus", &result) - if err != nil { - panic(err) - } - return result.Cursors.TotalOpen -} - -func (s *S) TestFindIterLimitWithMore(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - // Insane amounts of logging otherwise due to the - // amount of data being shuffled. - mgo.SetDebug(false) - defer mgo.SetDebug(true) - - // Should amount to more than 4MB bson payload, - // the default limit per result chunk. - const total = 4096 - var d struct{ A [1024]byte } - docs := make([]interface{}, total) - for i := 0; i < total; i++ { - docs[i] = &d - } - err = coll.Insert(docs...) - c.Assert(err, IsNil) - - n, err := coll.Count() - c.Assert(err, IsNil) - c.Assert(n, Equals, total) - - // First, try restricting to a single chunk with a negative limit. - nresults := 0 - iter := coll.Find(nil).Limit(-total).Iter() - var discard struct{} - for iter.Next(&discard) { - nresults++ - } - if nresults < total/2 || nresults >= total { - c.Fatalf("Bad result size with negative limit: %d", nresults) - } - - cursorsOpen := serverCursorsOpen(session) - - // Try again, with a positive limit. Should reach the end now, - // using multiple chunks. - nresults = 0 - iter = coll.Find(nil).Limit(total).Iter() - for iter.Next(&discard) { - nresults++ - } - c.Assert(nresults, Equals, total) - - // Ensure the cursor used is properly killed. - c.Assert(serverCursorsOpen(session), Equals, cursorsOpen) - - // Edge case, -MinInt == -MinInt. - nresults = 0 - iter = coll.Find(nil).Limit(math.MinInt32).Iter() - for iter.Next(&discard) { - nresults++ - } - if nresults < total/2 || nresults >= total { - c.Fatalf("Bad result size with MinInt32 limit: %d", nresults) - } -} - -func (s *S) TestFindIterLimitWithBatch(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - coll.Insert(M{"n": n}) - } - - // Ping the database to ensure the nonce has been received already. - c.Assert(session.Ping(), IsNil) - - session.Refresh() // Release socket. - - mgo.ResetStats() - - query := coll.Find(M{"n": M{"$gte": 42}}).Sort("$natural").Limit(3).Batch(2) - iter := query.Iter() - result := struct{ N int }{} - for i := 2; i < 5; i++ { - ok := iter.Next(&result) - c.Assert(ok, Equals, true) - c.Assert(result.N, Equals, ns[i]) - if i == 3 { - stats := mgo.GetStats() - c.Assert(stats.ReceivedDocs, Equals, 2) - } - } - - ok := iter.Next(&result) - c.Assert(ok, Equals, false) - c.Assert(iter.Close(), IsNil) - - session.Refresh() // Release socket. - - stats := mgo.GetStats() - c.Assert(stats.SentOps, Equals, 3) // 1*QUERY_OP + 1*GET_MORE_OP + 1*KILL_CURSORS_OP - c.Assert(stats.ReceivedOps, Equals, 2) // and its REPLY_OPs - c.Assert(stats.ReceivedDocs, Equals, 3) - c.Assert(stats.SocketsInUse, Equals, 0) -} - -func (s *S) TestFindIterSortWithBatch(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - coll.Insert(M{"n": n}) - } - - // Without this, the logic above breaks because Mongo refuses to - // return a cursor with an in-memory sort. - coll.EnsureIndexKey("n") - - // Ping the database to ensure the nonce has been received already. - c.Assert(session.Ping(), IsNil) - - session.Refresh() // Release socket. - - mgo.ResetStats() - - query := coll.Find(M{"n": M{"$lte": 44}}).Sort("-n").Batch(2) - iter := query.Iter() - ns = []int{46, 45, 44, 43, 42, 41, 40} - result := struct{ N int }{} - for i := 2; i < len(ns); i++ { - c.Logf("i=%d", i) - ok := iter.Next(&result) - c.Assert(ok, Equals, true) - c.Assert(result.N, Equals, ns[i]) - if i == 3 { - stats := mgo.GetStats() - c.Assert(stats.ReceivedDocs, Equals, 2) - } - } - - ok := iter.Next(&result) - c.Assert(ok, Equals, false) - c.Assert(iter.Close(), IsNil) - - session.Refresh() // Release socket. - - stats := mgo.GetStats() - c.Assert(stats.SentOps, Equals, 3) // 1*QUERY_OP + 2*GET_MORE_OP - c.Assert(stats.ReceivedOps, Equals, 3) // and its REPLY_OPs - c.Assert(stats.ReceivedDocs, Equals, 5) - c.Assert(stats.SocketsInUse, Equals, 0) -} - -// Test tailable cursors in a situation where Next has to sleep to -// respect the timeout requested on Tail. -func (s *S) TestFindTailTimeoutWithSleep(c *C) { - if *fast { - c.Skip("-fast") - } - - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - cresult := struct{ ErrMsg string }{} - - db := session.DB("mydb") - err = db.Run(bson.D{{"create", "mycoll"}, {"capped", true}, {"size", 1024}}, &cresult) - c.Assert(err, IsNil) - c.Assert(cresult.ErrMsg, Equals, "") - coll := db.C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - coll.Insert(M{"n": n}) - } - - session.Refresh() // Release socket. - - mgo.ResetStats() - - timeout := 3 * time.Second - - query := coll.Find(M{"n": M{"$gte": 42}}).Sort("$natural").Prefetch(0).Batch(2) - iter := query.Tail(timeout) - - n := len(ns) - result := struct{ N int }{} - for i := 2; i != n; i++ { - ok := iter.Next(&result) - c.Assert(ok, Equals, true) - c.Assert(iter.Err(), IsNil) - c.Assert(iter.Timeout(), Equals, false) - c.Assert(result.N, Equals, ns[i]) - if i == 3 { // The batch boundary. - stats := mgo.GetStats() - c.Assert(stats.ReceivedDocs, Equals, 2) - } - } - - mgo.ResetStats() - - // The following call to Next will block. - go func() { - // The internal AwaitData timing of MongoDB is around 2 seconds, - // so this should force mgo to sleep at least once by itself to - // respect the requested timeout. - time.Sleep(timeout + 5e8*time.Nanosecond) - session := session.New() - defer session.Close() - coll := session.DB("mydb").C("mycoll") - coll.Insert(M{"n": 47}) - }() - - c.Log("Will wait for Next with N=47...") - ok := iter.Next(&result) - c.Assert(ok, Equals, true) - c.Assert(iter.Err(), IsNil) - c.Assert(iter.Timeout(), Equals, false) - c.Assert(result.N, Equals, 47) - c.Log("Got Next with N=47!") - - // The following may break because it depends a bit on the internal - // timing used by MongoDB's AwaitData logic. If it does, the problem - // will be observed as more GET_MORE_OPs than predicted: - // 1*QUERY for nonce + 1*GET_MORE_OP on Next + 1*GET_MORE_OP on Next after sleep + - // 1*INSERT_OP + 1*QUERY_OP for getLastError on insert of 47 - stats := mgo.GetStats() - if s.versionAtLeast(3, 0) { // TODO Will be 2.6 when write commands are enabled for it. - c.Assert(stats.SentOps, Equals, 4) - } else { - c.Assert(stats.SentOps, Equals, 5) - } - c.Assert(stats.ReceivedOps, Equals, 4) // REPLY_OPs for 1*QUERY_OP for nonce + 2*GET_MORE_OPs + 1*QUERY_OP - c.Assert(stats.ReceivedDocs, Equals, 3) // nonce + N=47 result + getLastError response - - c.Log("Will wait for a result which will never come...") - - started := time.Now() - ok = iter.Next(&result) - c.Assert(ok, Equals, false) - c.Assert(iter.Err(), IsNil) - c.Assert(iter.Timeout(), Equals, true) - c.Assert(started.Before(time.Now().Add(-timeout)), Equals, true) - - c.Log("Will now reuse the timed out tail cursor...") - - coll.Insert(M{"n": 48}) - ok = iter.Next(&result) - c.Assert(ok, Equals, true) - c.Assert(iter.Close(), IsNil) - c.Assert(iter.Timeout(), Equals, false) - c.Assert(result.N, Equals, 48) -} - -// Test tailable cursors in a situation where Next never gets to sleep once -// to respect the timeout requested on Tail. -func (s *S) TestFindTailTimeoutNoSleep(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - cresult := struct{ ErrMsg string }{} - - db := session.DB("mydb") - err = db.Run(bson.D{{"create", "mycoll"}, {"capped", true}, {"size", 1024}}, &cresult) - c.Assert(err, IsNil) - c.Assert(cresult.ErrMsg, Equals, "") - coll := db.C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - coll.Insert(M{"n": n}) - } - - session.Refresh() // Release socket. - - mgo.ResetStats() - - timeout := 1 * time.Second - - query := coll.Find(M{"n": M{"$gte": 42}}).Sort("$natural").Prefetch(0).Batch(2) - iter := query.Tail(timeout) - - n := len(ns) - result := struct{ N int }{} - for i := 2; i != n; i++ { - ok := iter.Next(&result) - c.Assert(ok, Equals, true) - c.Assert(iter.Err(), IsNil) - c.Assert(iter.Timeout(), Equals, false) - c.Assert(result.N, Equals, ns[i]) - if i == 3 { // The batch boundary. - stats := mgo.GetStats() - c.Assert(stats.ReceivedDocs, Equals, 2) - } - } - - mgo.ResetStats() - - // The following call to Next will block. - go func() { - // The internal AwaitData timing of MongoDB is around 2 seconds, - // so this item should arrive within the AwaitData threshold. - time.Sleep(5e8) - session := session.New() - defer session.Close() - coll := session.DB("mydb").C("mycoll") - coll.Insert(M{"n": 47}) - }() - - c.Log("Will wait for Next with N=47...") - ok := iter.Next(&result) - c.Assert(ok, Equals, true) - c.Assert(iter.Err(), IsNil) - c.Assert(iter.Timeout(), Equals, false) - c.Assert(result.N, Equals, 47) - c.Log("Got Next with N=47!") - - // The following may break because it depends a bit on the internal - // timing used by MongoDB's AwaitData logic. If it does, the problem - // will be observed as more GET_MORE_OPs than predicted: - // 1*QUERY_OP for nonce + 1*GET_MORE_OP on Next + - // 1*INSERT_OP + 1*QUERY_OP for getLastError on insert of 47 - stats := mgo.GetStats() - if s.versionAtLeast(3, 0) { // TODO Will be 2.6 when write commands are enabled for it. - c.Assert(stats.SentOps, Equals, 3) - } else { - c.Assert(stats.SentOps, Equals, 4) - } - c.Assert(stats.ReceivedOps, Equals, 3) // REPLY_OPs for 1*QUERY_OP for nonce + 1*GET_MORE_OPs and 1*QUERY_OP - c.Assert(stats.ReceivedDocs, Equals, 3) // nonce + N=47 result + getLastError response - - c.Log("Will wait for a result which will never come...") - - started := time.Now() - ok = iter.Next(&result) - c.Assert(ok, Equals, false) - c.Assert(iter.Err(), IsNil) - c.Assert(iter.Timeout(), Equals, true) - c.Assert(started.Before(time.Now().Add(-timeout)), Equals, true) - - c.Log("Will now reuse the timed out tail cursor...") - - coll.Insert(M{"n": 48}) - ok = iter.Next(&result) - c.Assert(ok, Equals, true) - c.Assert(iter.Close(), IsNil) - c.Assert(iter.Timeout(), Equals, false) - c.Assert(result.N, Equals, 48) -} - -// Test tailable cursors in a situation where Next never gets to sleep once -// to respect the timeout requested on Tail. -func (s *S) TestFindTailNoTimeout(c *C) { - if *fast { - c.Skip("-fast") - } - - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - cresult := struct{ ErrMsg string }{} - - db := session.DB("mydb") - err = db.Run(bson.D{{"create", "mycoll"}, {"capped", true}, {"size", 1024}}, &cresult) - c.Assert(err, IsNil) - c.Assert(cresult.ErrMsg, Equals, "") - coll := db.C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - coll.Insert(M{"n": n}) - } - - session.Refresh() // Release socket. - - mgo.ResetStats() - - query := coll.Find(M{"n": M{"$gte": 42}}).Sort("$natural").Prefetch(0).Batch(2) - iter := query.Tail(-1) - c.Assert(err, IsNil) - - n := len(ns) - result := struct{ N int }{} - for i := 2; i != n; i++ { - ok := iter.Next(&result) - c.Assert(ok, Equals, true) - c.Assert(result.N, Equals, ns[i]) - if i == 3 { // The batch boundary. - stats := mgo.GetStats() - c.Assert(stats.ReceivedDocs, Equals, 2) - } - } - - mgo.ResetStats() - - // The following call to Next will block. - go func() { - time.Sleep(5e8) - session := session.New() - defer session.Close() - coll := session.DB("mydb").C("mycoll") - coll.Insert(M{"n": 47}) - }() - - c.Log("Will wait for Next with N=47...") - ok := iter.Next(&result) - c.Assert(ok, Equals, true) - c.Assert(iter.Err(), IsNil) - c.Assert(iter.Timeout(), Equals, false) - c.Assert(result.N, Equals, 47) - c.Log("Got Next with N=47!") - - // The following may break because it depends a bit on the internal - // timing used by MongoDB's AwaitData logic. If it does, the problem - // will be observed as more GET_MORE_OPs than predicted: - // 1*QUERY_OP for nonce + 1*GET_MORE_OP on Next + - // 1*INSERT_OP + 1*QUERY_OP for getLastError on insert of 47 - stats := mgo.GetStats() - if s.versionAtLeast(3, 0) { // TODO Will be 2.6 when write commands are enabled for it. - c.Assert(stats.SentOps, Equals, 3) - } else { - c.Assert(stats.SentOps, Equals, 4) - } - c.Assert(stats.ReceivedOps, Equals, 3) // REPLY_OPs for 1*QUERY_OP for nonce + 1*GET_MORE_OPs and 1*QUERY_OP - c.Assert(stats.ReceivedDocs, Equals, 3) // nonce + N=47 result + getLastError response - - c.Log("Will wait for a result which will never come...") - - gotNext := make(chan bool) - go func() { - ok := iter.Next(&result) - gotNext <- ok - }() - - select { - case ok := <-gotNext: - c.Fatalf("Next returned: %v", ok) - case <-time.After(3e9): - // Good. Should still be sleeping at that point. - } - - // Closing the session should cause Next to return. - session.Close() - - select { - case ok := <-gotNext: - c.Assert(ok, Equals, false) - c.Assert(iter.Err(), ErrorMatches, "Closed explicitly") - c.Assert(iter.Timeout(), Equals, false) - case <-time.After(1e9): - c.Fatal("Closing the session did not unblock Next") - } -} - -func (s *S) TestIterNextResetsResult(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{1, 2, 3} - for _, n := range ns { - coll.Insert(M{"n" + strconv.Itoa(n): n}) - } - - query := coll.Find(nil).Sort("$natural") - - i := 0 - var sresult *struct{ N1, N2, N3 int } - iter := query.Iter() - for iter.Next(&sresult) { - switch i { - case 0: - c.Assert(sresult.N1, Equals, 1) - c.Assert(sresult.N2+sresult.N3, Equals, 0) - case 1: - c.Assert(sresult.N2, Equals, 2) - c.Assert(sresult.N1+sresult.N3, Equals, 0) - case 2: - c.Assert(sresult.N3, Equals, 3) - c.Assert(sresult.N1+sresult.N2, Equals, 0) - } - i++ - } - c.Assert(iter.Close(), IsNil) - - i = 0 - var mresult M - iter = query.Iter() - for iter.Next(&mresult) { - delete(mresult, "_id") - switch i { - case 0: - c.Assert(mresult, DeepEquals, M{"n1": 1}) - case 1: - c.Assert(mresult, DeepEquals, M{"n2": 2}) - case 2: - c.Assert(mresult, DeepEquals, M{"n3": 3}) - } - i++ - } - c.Assert(iter.Close(), IsNil) - - i = 0 - var iresult interface{} - iter = query.Iter() - for iter.Next(&iresult) { - mresult, ok := iresult.(bson.M) - c.Assert(ok, Equals, true, Commentf("%#v", iresult)) - delete(mresult, "_id") - switch i { - case 0: - c.Assert(mresult, DeepEquals, bson.M{"n1": 1}) - case 1: - c.Assert(mresult, DeepEquals, bson.M{"n2": 2}) - case 2: - c.Assert(mresult, DeepEquals, bson.M{"n3": 3}) - } - i++ - } - c.Assert(iter.Close(), IsNil) -} - -func (s *S) TestFindForOnIter(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - coll.Insert(M{"n": n}) - } - - session.Refresh() // Release socket. - - mgo.ResetStats() - - query := coll.Find(M{"n": M{"$gte": 42}}).Sort("$natural").Prefetch(0).Batch(2) - iter := query.Iter() - - i := 2 - var result *struct{ N int } - err = iter.For(&result, func() error { - c.Assert(i < 7, Equals, true) - c.Assert(result.N, Equals, ns[i]) - if i == 1 { - stats := mgo.GetStats() - c.Assert(stats.ReceivedDocs, Equals, 2) - } - i++ - return nil - }) - c.Assert(err, IsNil) - - session.Refresh() // Release socket. - - stats := mgo.GetStats() - c.Assert(stats.SentOps, Equals, 3) // 1*QUERY_OP + 2*GET_MORE_OP - c.Assert(stats.ReceivedOps, Equals, 3) // and their REPLY_OPs. - c.Assert(stats.ReceivedDocs, Equals, 5) - c.Assert(stats.SocketsInUse, Equals, 0) -} - -func (s *S) TestFindFor(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - coll.Insert(M{"n": n}) - } - - session.Refresh() // Release socket. - - mgo.ResetStats() - - query := coll.Find(M{"n": M{"$gte": 42}}).Sort("$natural").Prefetch(0).Batch(2) - - i := 2 - var result *struct{ N int } - err = query.For(&result, func() error { - c.Assert(i < 7, Equals, true) - c.Assert(result.N, Equals, ns[i]) - if i == 1 { - stats := mgo.GetStats() - c.Assert(stats.ReceivedDocs, Equals, 2) - } - i++ - return nil - }) - c.Assert(err, IsNil) - - session.Refresh() // Release socket. - - stats := mgo.GetStats() - c.Assert(stats.SentOps, Equals, 3) // 1*QUERY_OP + 2*GET_MORE_OP - c.Assert(stats.ReceivedOps, Equals, 3) // and their REPLY_OPs. - c.Assert(stats.ReceivedDocs, Equals, 5) - c.Assert(stats.SocketsInUse, Equals, 0) -} - -func (s *S) TestFindForStopOnError(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - coll.Insert(M{"n": n}) - } - - query := coll.Find(M{"n": M{"$gte": 42}}) - i := 2 - var result *struct{ N int } - err = query.For(&result, func() error { - c.Assert(i < 4, Equals, true) - c.Assert(result.N, Equals, ns[i]) - if i == 3 { - return fmt.Errorf("stop!") - } - i++ - return nil - }) - c.Assert(err, ErrorMatches, "stop!") -} - -func (s *S) TestFindForResetsResult(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{1, 2, 3} - for _, n := range ns { - coll.Insert(M{"n" + strconv.Itoa(n): n}) - } - - query := coll.Find(nil).Sort("$natural") - - i := 0 - var sresult *struct{ N1, N2, N3 int } - err = query.For(&sresult, func() error { - switch i { - case 0: - c.Assert(sresult.N1, Equals, 1) - c.Assert(sresult.N2+sresult.N3, Equals, 0) - case 1: - c.Assert(sresult.N2, Equals, 2) - c.Assert(sresult.N1+sresult.N3, Equals, 0) - case 2: - c.Assert(sresult.N3, Equals, 3) - c.Assert(sresult.N1+sresult.N2, Equals, 0) - } - i++ - return nil - }) - c.Assert(err, IsNil) - - i = 0 - var mresult M - err = query.For(&mresult, func() error { - delete(mresult, "_id") - switch i { - case 0: - c.Assert(mresult, DeepEquals, M{"n1": 1}) - case 1: - c.Assert(mresult, DeepEquals, M{"n2": 2}) - case 2: - c.Assert(mresult, DeepEquals, M{"n3": 3}) - } - i++ - return nil - }) - c.Assert(err, IsNil) - - i = 0 - var iresult interface{} - err = query.For(&iresult, func() error { - mresult, ok := iresult.(bson.M) - c.Assert(ok, Equals, true, Commentf("%#v", iresult)) - delete(mresult, "_id") - switch i { - case 0: - c.Assert(mresult, DeepEquals, bson.M{"n1": 1}) - case 1: - c.Assert(mresult, DeepEquals, bson.M{"n2": 2}) - case 2: - c.Assert(mresult, DeepEquals, bson.M{"n3": 3}) - } - i++ - return nil - }) - c.Assert(err, IsNil) -} - -func (s *S) TestFindIterSnapshot(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - // Insane amounts of logging otherwise due to the - // amount of data being shuffled. - mgo.SetDebug(false) - defer mgo.SetDebug(true) - - coll := session.DB("mydb").C("mycoll") - - var a [1024000]byte - - for n := 0; n < 10; n++ { - err := coll.Insert(M{"_id": n, "n": n, "a1": &a}) - c.Assert(err, IsNil) - } - - query := coll.Find(M{"n": M{"$gt": -1}}).Batch(2).Prefetch(0) - query.Snapshot() - iter := query.Iter() - - seen := map[int]bool{} - result := struct { - Id int "_id" - }{} - for iter.Next(&result) { - if len(seen) == 2 { - // Grow all entries so that they have to move. - // Backwards so that the order is inverted. - for n := 10; n >= 0; n-- { - _, err := coll.Upsert(M{"_id": n}, M{"$set": M{"a2": &a}}) - c.Assert(err, IsNil) - } - } - if seen[result.Id] { - c.Fatalf("seen duplicated key: %d", result.Id) - } - seen[result.Id] = true - } - c.Assert(iter.Close(), IsNil) -} - -func (s *S) TestSort(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - coll.Insert(M{"a": 1, "b": 1}) - coll.Insert(M{"a": 2, "b": 2}) - coll.Insert(M{"a": 2, "b": 1}) - coll.Insert(M{"a": 0, "b": 1}) - coll.Insert(M{"a": 2, "b": 0}) - coll.Insert(M{"a": 0, "b": 2}) - coll.Insert(M{"a": 1, "b": 2}) - coll.Insert(M{"a": 0, "b": 0}) - coll.Insert(M{"a": 1, "b": 0}) - - query := coll.Find(M{}) - query.Sort("-a") // Should be ignored. - query.Sort("-b", "a") - iter := query.Iter() - - l := make([]int, 18) - r := struct{ A, B int }{} - for i := 0; i != len(l); i += 2 { - ok := iter.Next(&r) - c.Assert(ok, Equals, true) - c.Assert(err, IsNil) - l[i] = r.A - l[i+1] = r.B - } - - c.Assert(l, DeepEquals, []int{0, 2, 1, 2, 2, 2, 0, 1, 1, 1, 2, 1, 0, 0, 1, 0, 2, 0}) -} - -func (s *S) TestSortWithBadArgs(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - f1 := func() { coll.Find(nil).Sort("") } - f2 := func() { coll.Find(nil).Sort("+") } - f3 := func() { coll.Find(nil).Sort("foo", "-") } - - for _, f := range []func(){f1, f2, f3} { - c.Assert(f, PanicMatches, "Sort: empty field name") - } -} - -func (s *S) TestSortScoreText(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - err = coll.EnsureIndex(mgo.Index{ - Key: []string{"$text:a", "$text:b"}, - }) - c.Assert(err, IsNil) - - err = coll.Insert(M{ - "a": "none", - "b": "twice: foo foo", - }) - c.Assert(err, IsNil) - err = coll.Insert(M{ - "a": "just once: foo", - "b": "none", - }) - c.Assert(err, IsNil) - err = coll.Insert(M{ - "a": "many: foo foo foo", - "b": "none", - }) - c.Assert(err, IsNil) - err = coll.Insert(M{ - "a": "none", - "b": "none", - "c": "ignore: foo", - }) - c.Assert(err, IsNil) - - query := coll.Find(M{"$text": M{"$search": "foo"}}) - query.Select(M{"score": M{"$meta": "textScore"}}) - query.Sort("$textScore:score") - iter := query.Iter() - - var r struct{ A, B string } - var results []string - for iter.Next(&r) { - results = append(results, r.A, r.B) - } - - c.Assert(results, DeepEquals, []string{ - "many: foo foo foo", "none", - "none", "twice: foo foo", - "just once: foo", "none", - }) -} - -func (s *S) TestPrefetching(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - const total = 600 - mgo.SetDebug(false) - docs := make([]interface{}, total) - for i := 0; i != total; i++ { - docs[i] = bson.D{{"n", i}} - } - err = coll.Insert(docs...) - c.Assert(err, IsNil) - - for testi := 0; testi < 5; testi++ { - mgo.ResetStats() - - var iter *mgo.Iter - var beforeMore int - - switch testi { - case 0: // The default session value. - session.SetBatch(100) - iter = coll.Find(M{}).Iter() - beforeMore = 75 - - case 2: // Changing the session value. - session.SetBatch(100) - session.SetPrefetch(0.27) - iter = coll.Find(M{}).Iter() - beforeMore = 73 - - case 1: // Changing via query methods. - iter = coll.Find(M{}).Prefetch(0.27).Batch(100).Iter() - beforeMore = 73 - - case 3: // With prefetch on first document. - iter = coll.Find(M{}).Prefetch(1.0).Batch(100).Iter() - beforeMore = 0 - - case 4: // Without prefetch. - iter = coll.Find(M{}).Prefetch(0).Batch(100).Iter() - beforeMore = 100 - } - - pings := 0 - for batchi := 0; batchi < len(docs)/100-1; batchi++ { - c.Logf("Iterating over %d documents on batch %d", beforeMore, batchi) - var result struct{ N int } - for i := 0; i < beforeMore; i++ { - ok := iter.Next(&result) - c.Assert(ok, Equals, true, Commentf("iter.Err: %v", iter.Err())) - } - beforeMore = 99 - c.Logf("Done iterating.") - - session.Run("ping", nil) // Roundtrip to settle down. - pings++ - - stats := mgo.GetStats() - c.Assert(stats.ReceivedDocs, Equals, (batchi+1)*100+pings) - - c.Logf("Iterating over one more document on batch %d", batchi) - ok := iter.Next(&result) - c.Assert(ok, Equals, true, Commentf("iter.Err: %v", iter.Err())) - c.Logf("Done iterating.") - - session.Run("ping", nil) // Roundtrip to settle down. - pings++ - - stats = mgo.GetStats() - c.Assert(stats.ReceivedDocs, Equals, (batchi+2)*100+pings) - } - } -} - -func (s *S) TestSafeSetting(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - // Check the default - safe := session.Safe() - c.Assert(safe.W, Equals, 0) - c.Assert(safe.WMode, Equals, "") - c.Assert(safe.WTimeout, Equals, 0) - c.Assert(safe.FSync, Equals, false) - c.Assert(safe.J, Equals, false) - - // Tweak it - session.SetSafe(&mgo.Safe{W: 1, WTimeout: 2, FSync: true}) - safe = session.Safe() - c.Assert(safe.W, Equals, 1) - c.Assert(safe.WMode, Equals, "") - c.Assert(safe.WTimeout, Equals, 2) - c.Assert(safe.FSync, Equals, true) - c.Assert(safe.J, Equals, false) - - // Reset it again. - session.SetSafe(&mgo.Safe{}) - safe = session.Safe() - c.Assert(safe.W, Equals, 0) - c.Assert(safe.WMode, Equals, "") - c.Assert(safe.WTimeout, Equals, 0) - c.Assert(safe.FSync, Equals, false) - c.Assert(safe.J, Equals, false) - - // Ensure safety to something more conservative. - session.SetSafe(&mgo.Safe{W: 5, WTimeout: 6, J: true}) - safe = session.Safe() - c.Assert(safe.W, Equals, 5) - c.Assert(safe.WMode, Equals, "") - c.Assert(safe.WTimeout, Equals, 6) - c.Assert(safe.FSync, Equals, false) - c.Assert(safe.J, Equals, true) - - // Ensure safety to something less conservative won't change it. - session.EnsureSafe(&mgo.Safe{W: 4, WTimeout: 7}) - safe = session.Safe() - c.Assert(safe.W, Equals, 5) - c.Assert(safe.WMode, Equals, "") - c.Assert(safe.WTimeout, Equals, 6) - c.Assert(safe.FSync, Equals, false) - c.Assert(safe.J, Equals, true) - - // But to something more conservative will. - session.EnsureSafe(&mgo.Safe{W: 6, WTimeout: 4, FSync: true}) - safe = session.Safe() - c.Assert(safe.W, Equals, 6) - c.Assert(safe.WMode, Equals, "") - c.Assert(safe.WTimeout, Equals, 4) - c.Assert(safe.FSync, Equals, true) - c.Assert(safe.J, Equals, false) - - // Even more conservative. - session.EnsureSafe(&mgo.Safe{WMode: "majority", WTimeout: 2}) - safe = session.Safe() - c.Assert(safe.W, Equals, 0) - c.Assert(safe.WMode, Equals, "majority") - c.Assert(safe.WTimeout, Equals, 2) - c.Assert(safe.FSync, Equals, true) - c.Assert(safe.J, Equals, false) - - // WMode always overrides, whatever it is, but J doesn't. - session.EnsureSafe(&mgo.Safe{WMode: "something", J: true}) - safe = session.Safe() - c.Assert(safe.W, Equals, 0) - c.Assert(safe.WMode, Equals, "something") - c.Assert(safe.WTimeout, Equals, 2) - c.Assert(safe.FSync, Equals, true) - c.Assert(safe.J, Equals, false) - - // EnsureSafe with nil does nothing. - session.EnsureSafe(nil) - safe = session.Safe() - c.Assert(safe.W, Equals, 0) - c.Assert(safe.WMode, Equals, "something") - c.Assert(safe.WTimeout, Equals, 2) - c.Assert(safe.FSync, Equals, true) - c.Assert(safe.J, Equals, false) - - // Changing the safety of a cloned session doesn't touch the original. - clone := session.Clone() - defer clone.Close() - clone.EnsureSafe(&mgo.Safe{WMode: "foo"}) - safe = session.Safe() - c.Assert(safe.WMode, Equals, "something") -} - -func (s *S) TestSafeInsert(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - // Insert an element with a predefined key. - err = coll.Insert(M{"_id": 1}) - c.Assert(err, IsNil) - - mgo.ResetStats() - - // Session should be safe by default, so inserting it again must fail. - err = coll.Insert(M{"_id": 1}) - c.Assert(err, ErrorMatches, ".*E11000 duplicate.*") - c.Assert(err.(*mgo.LastError).Code, Equals, 11000) - - // It must have sent two operations (INSERT_OP + getLastError QUERY_OP) - stats := mgo.GetStats() - - // TODO Will be 2.6 when write commands are enabled for it. - if s.versionAtLeast(3, 0) { - c.Assert(stats.SentOps, Equals, 1) - } else { - c.Assert(stats.SentOps, Equals, 2) - } - - mgo.ResetStats() - - // If we disable safety, though, it won't complain. - session.SetSafe(nil) - err = coll.Insert(M{"_id": 1}) - c.Assert(err, IsNil) - - // Must have sent a single operation this time (just the INSERT_OP) - stats = mgo.GetStats() - c.Assert(stats.SentOps, Equals, 1) -} - -func (s *S) TestSafeParameters(c *C) { - session, err := mgo.Dial("localhost:40011") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - // Tweak the safety parameters to something unachievable. - session.SetSafe(&mgo.Safe{W: 4, WTimeout: 100}) - err = coll.Insert(M{"_id": 1}) - c.Assert(err, ErrorMatches, "timeout|timed out waiting for slaves|Not enough data-bearing nodes|waiting for replication timed out") // :-( - if !s.versionAtLeast(2, 6) { - // 2.6 turned it into a query error. - c.Assert(err.(*mgo.LastError).WTimeout, Equals, true) - } -} - -func (s *S) TestQueryErrorOne(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - result := struct { - Err string "$err" - }{} - - err = coll.Find(M{"a": 1}).Select(M{"a": M{"b": 1}}).One(&result) - c.Assert(err, ErrorMatches, ".*Unsupported projection option:.*") - c.Assert(err.(*mgo.QueryError).Message, Matches, ".*Unsupported projection option:.*") - if s.versionAtLeast(2, 6) { - // Oh, the dance of error codes. :-( - c.Assert(err.(*mgo.QueryError).Code, Equals, 17287) - } else { - c.Assert(err.(*mgo.QueryError).Code, Equals, 13097) - } - - // The result should be properly unmarshalled with QueryError - c.Assert(result.Err, Matches, ".*Unsupported projection option:.*") -} - -func (s *S) TestQueryErrorNext(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - result := struct { - Err string "$err" - }{} - - iter := coll.Find(M{"a": 1}).Select(M{"a": M{"b": 1}}).Iter() - - ok := iter.Next(&result) - c.Assert(ok, Equals, false) - - err = iter.Close() - c.Assert(err, ErrorMatches, ".*Unsupported projection option:.*") - c.Assert(err.(*mgo.QueryError).Message, Matches, ".*Unsupported projection option:.*") - if s.versionAtLeast(2, 6) { - // Oh, the dance of error codes. :-( - c.Assert(err.(*mgo.QueryError).Code, Equals, 17287) - } else { - c.Assert(err.(*mgo.QueryError).Code, Equals, 13097) - } - c.Assert(iter.Err(), Equals, err) - - // The result should be properly unmarshalled with QueryError - c.Assert(result.Err, Matches, ".*Unsupported projection option:.*") -} - -var indexTests = []struct { - index mgo.Index - expected M -}{{ - mgo.Index{ - Key: []string{"a"}, - Background: true, - }, - M{ - "name": "a_1", - "key": M{"a": 1}, - "ns": "mydb.mycoll", - "background": true, - }, -}, { - mgo.Index{ - Key: []string{"a", "-b"}, - Unique: true, - DropDups: true, - }, - M{ - "name": "a_1_b_-1", - "key": M{"a": 1, "b": -1}, - "ns": "mydb.mycoll", - "unique": true, - "dropDups": true, - }, -}, { - mgo.Index{ - Key: []string{"@loc_old"}, // Obsolete - Min: -500, - Max: 500, - Bits: 32, - }, - M{ - "name": "loc_old_2d", - "key": M{"loc_old": "2d"}, - "ns": "mydb.mycoll", - "min": -500, - "max": 500, - "bits": 32, - }, -}, { - mgo.Index{ - Key: []string{"$2d:loc"}, - Min: -500, - Max: 500, - Bits: 32, - }, - M{ - "name": "loc_2d", - "key": M{"loc": "2d"}, - "ns": "mydb.mycoll", - "min": -500, - "max": 500, - "bits": 32, - }, -}, { - mgo.Index{ - Key: []string{"$geoHaystack:loc", "type"}, - BucketSize: 1, - }, - M{ - "name": "loc_geoHaystack_type_1", - "key": M{"loc": "geoHaystack", "type": 1}, - "ns": "mydb.mycoll", - "bucketSize": 1.0, - }, -}, { - mgo.Index{ - Key: []string{"$text:a", "$text:b"}, - Weights: map[string]int{"b": 42}, - }, - M{ - "name": "a_text_b_text", - "key": M{"_fts": "text", "_ftsx": 1}, - "ns": "mydb.mycoll", - "weights": M{"a": 1, "b": 42}, - "default_language": "english", - "language_override": "language", - "textIndexVersion": 2, - }, -}, { - mgo.Index{ - Key: []string{"$text:a"}, - DefaultLanguage: "portuguese", - LanguageOverride: "idioma", - }, - M{ - "name": "a_text", - "key": M{"_fts": "text", "_ftsx": 1}, - "ns": "mydb.mycoll", - "weights": M{"a": 1}, - "default_language": "portuguese", - "language_override": "idioma", - "textIndexVersion": 2, - }, -}, { - mgo.Index{ - Key: []string{"$text:$**"}, - }, - M{ - "name": "$**_text", - "key": M{"_fts": "text", "_ftsx": 1}, - "ns": "mydb.mycoll", - "weights": M{"$**": 1}, - "default_language": "english", - "language_override": "language", - "textIndexVersion": 2, - }, -}} - -func (s *S) TestEnsureIndex(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - idxs := session.DB("mydb").C("system.indexes") - - for _, test := range indexTests { - if !s.versionAtLeast(2, 4) && test.expected["weights"] != nil { - // No text indexes until 2.4. - continue - } - - err = coll.EnsureIndex(test.index) - c.Assert(err, IsNil) - - obtained := M{} - err = idxs.Find(M{"name": test.expected["name"]}).One(obtained) - c.Assert(err, IsNil) - - delete(obtained, "v") - - if s.versionAtLeast(2, 7) { - // Was deprecated in 2.6, and not being reported by 2.7+. - delete(test.expected, "dropDups") - } - - c.Assert(obtained, DeepEquals, test.expected) - - err = coll.DropIndex(test.index.Key...) - c.Assert(err, IsNil) - } -} - -func (s *S) TestEnsureIndexWithBadInfo(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - err = coll.EnsureIndex(mgo.Index{}) - c.Assert(err, ErrorMatches, "invalid index key:.*") - - err = coll.EnsureIndex(mgo.Index{Key: []string{""}}) - c.Assert(err, ErrorMatches, "invalid index key:.*") -} - -func (s *S) TestEnsureIndexWithUnsafeSession(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - session.SetSafe(nil) - - coll := session.DB("mydb").C("mycoll") - - err = coll.Insert(M{"a": 1}) - c.Assert(err, IsNil) - - err = coll.Insert(M{"a": 1}) - c.Assert(err, IsNil) - - // Should fail since there are duplicated entries. - index := mgo.Index{ - Key: []string{"a"}, - Unique: true, - } - - err = coll.EnsureIndex(index) - c.Assert(err, ErrorMatches, ".*duplicate key error.*") -} - -func (s *S) TestEnsureIndexKey(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - err = coll.EnsureIndexKey("a") - c.Assert(err, IsNil) - - err = coll.EnsureIndexKey("a", "-b") - c.Assert(err, IsNil) - - sysidx := session.DB("mydb").C("system.indexes") - - result1 := M{} - err = sysidx.Find(M{"name": "a_1"}).One(result1) - c.Assert(err, IsNil) - - result2 := M{} - err = sysidx.Find(M{"name": "a_1_b_-1"}).One(result2) - c.Assert(err, IsNil) - - delete(result1, "v") - expected1 := M{ - "name": "a_1", - "key": M{"a": 1}, - "ns": "mydb.mycoll", - } - c.Assert(result1, DeepEquals, expected1) - - delete(result2, "v") - expected2 := M{ - "name": "a_1_b_-1", - "key": M{"a": 1, "b": -1}, - "ns": "mydb.mycoll", - } - c.Assert(result2, DeepEquals, expected2) -} - -func (s *S) TestEnsureIndexDropIndex(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - err = coll.EnsureIndexKey("a") - c.Assert(err, IsNil) - - err = coll.EnsureIndexKey("-b") - c.Assert(err, IsNil) - - err = coll.DropIndex("-b") - c.Assert(err, IsNil) - - sysidx := session.DB("mydb").C("system.indexes") - dummy := &struct{}{} - - err = sysidx.Find(M{"name": "a_1"}).One(dummy) - c.Assert(err, IsNil) - - err = sysidx.Find(M{"name": "b_1"}).One(dummy) - c.Assert(err, Equals, mgo.ErrNotFound) - - err = coll.DropIndex("a") - c.Assert(err, IsNil) - - err = sysidx.Find(M{"name": "a_1"}).One(dummy) - c.Assert(err, Equals, mgo.ErrNotFound) - - err = coll.DropIndex("a") - c.Assert(err, ErrorMatches, "index not found.*") -} - -func (s *S) TestEnsureIndexCaching(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - err = coll.EnsureIndexKey("a") - c.Assert(err, IsNil) - - mgo.ResetStats() - - // Second EnsureIndex should be cached and do nothing. - err = coll.EnsureIndexKey("a") - c.Assert(err, IsNil) - - stats := mgo.GetStats() - c.Assert(stats.SentOps, Equals, 0) - - // Resetting the cache should make it contact the server again. - session.ResetIndexCache() - - err = coll.EnsureIndexKey("a") - c.Assert(err, IsNil) - - stats = mgo.GetStats() - c.Assert(stats.SentOps > 0, Equals, true) - - // Dropping the index should also drop the cached index key. - err = coll.DropIndex("a") - c.Assert(err, IsNil) - - mgo.ResetStats() - - err = coll.EnsureIndexKey("a") - c.Assert(err, IsNil) - - stats = mgo.GetStats() - c.Assert(stats.SentOps > 0, Equals, true) -} - -func (s *S) TestEnsureIndexGetIndexes(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - err = coll.EnsureIndexKey("-b") - c.Assert(err, IsNil) - - err = coll.EnsureIndexKey("a") - c.Assert(err, IsNil) - - // Obsolete. - err = coll.EnsureIndexKey("@c") - c.Assert(err, IsNil) - - err = coll.EnsureIndexKey("$2d:d") - c.Assert(err, IsNil) - - // Try to exercise cursor logic. 2.8.0-rc3 still ignores this. - session.SetBatch(2) - - indexes, err := coll.Indexes() - c.Assert(err, IsNil) - - c.Assert(indexes[0].Name, Equals, "_id_") - c.Assert(indexes[1].Name, Equals, "a_1") - c.Assert(indexes[1].Key, DeepEquals, []string{"a"}) - c.Assert(indexes[2].Name, Equals, "b_-1") - c.Assert(indexes[2].Key, DeepEquals, []string{"-b"}) - c.Assert(indexes[3].Name, Equals, "c_2d") - c.Assert(indexes[3].Key, DeepEquals, []string{"$2d:c"}) - c.Assert(indexes[4].Name, Equals, "d_2d") - c.Assert(indexes[4].Key, DeepEquals, []string{"$2d:d"}) -} - -func (s *S) TestEnsureIndexEvalGetIndexes(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - err = session.Run(bson.D{{"eval", "db.getSiblingDB('mydb').mycoll.ensureIndex({b: -1})"}}, nil) - c.Assert(err, IsNil) - err = session.Run(bson.D{{"eval", "db.getSiblingDB('mydb').mycoll.ensureIndex({a: 1})"}}, nil) - c.Assert(err, IsNil) - err = session.Run(bson.D{{"eval", "db.getSiblingDB('mydb').mycoll.ensureIndex({c: -1, e: 1})"}}, nil) - c.Assert(err, IsNil) - err = session.Run(bson.D{{"eval", "db.getSiblingDB('mydb').mycoll.ensureIndex({d: '2d'})"}}, nil) - c.Assert(err, IsNil) - - indexes, err := coll.Indexes() - c.Assert(err, IsNil) - - c.Assert(indexes[0].Name, Equals, "_id_") - c.Assert(indexes[1].Name, Equals, "a_1") - c.Assert(indexes[1].Key, DeepEquals, []string{"a"}) - c.Assert(indexes[2].Name, Equals, "b_-1") - c.Assert(indexes[2].Key, DeepEquals, []string{"-b"}) - c.Assert(indexes[3].Name, Equals, "c_-1_e_1") - c.Assert(indexes[3].Key, DeepEquals, []string{"-c", "e"}) - if s.versionAtLeast(2, 2) { - c.Assert(indexes[4].Name, Equals, "d_2d") - c.Assert(indexes[4].Key, DeepEquals, []string{"$2d:d"}) - } else { - c.Assert(indexes[4].Name, Equals, "d_") - c.Assert(indexes[4].Key, DeepEquals, []string{"$2d:d"}) - } -} - -var testTTL = flag.Bool("test-ttl", false, "test TTL collections (may take 1 minute)") - -func (s *S) TestEnsureIndexExpireAfter(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - session.SetSafe(nil) - - coll := session.DB("mydb").C("mycoll") - - err = coll.Insert(M{"n": 1, "t": time.Now().Add(-120 * time.Second)}) - c.Assert(err, IsNil) - err = coll.Insert(M{"n": 2, "t": time.Now()}) - c.Assert(err, IsNil) - - // Should fail since there are duplicated entries. - index := mgo.Index{ - Key: []string{"t"}, - ExpireAfter: 1 * time.Minute, - } - - err = coll.EnsureIndex(index) - c.Assert(err, IsNil) - - indexes, err := coll.Indexes() - c.Assert(err, IsNil) - c.Assert(indexes[1].Name, Equals, "t_1") - c.Assert(indexes[1].ExpireAfter, Equals, 1*time.Minute) - - if *testTTL { - worked := false - stop := time.Now().Add(70 * time.Second) - for time.Now().Before(stop) { - n, err := coll.Count() - c.Assert(err, IsNil) - if n == 1 { - worked = true - break - } - c.Assert(n, Equals, 2) - c.Logf("Still has 2 entries...") - time.Sleep(1 * time.Second) - } - if !worked { - c.Fatalf("TTL index didn't work") - } - } -} - -func (s *S) TestDistinct(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - for _, i := range []int{1, 4, 6, 2, 2, 3, 4} { - coll.Insert(M{"n": i}) - } - - var result []int - err = coll.Find(M{"n": M{"$gt": 2}}).Sort("n").Distinct("n", &result) - - sort.IntSlice(result).Sort() - c.Assert(result, DeepEquals, []int{3, 4, 6}) -} - -func (s *S) TestMapReduce(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - for _, i := range []int{1, 4, 6, 2, 2, 3, 4} { - coll.Insert(M{"n": i}) - } - - job := &mgo.MapReduce{ - Map: "function() { emit(this.n, 1); }", - Reduce: "function(key, values) { return Array.sum(values); }", - } - var result []struct { - Id int "_id" - Value int - } - - info, err := coll.Find(M{"n": M{"$gt": 2}}).MapReduce(job, &result) - c.Assert(err, IsNil) - c.Assert(info.InputCount, Equals, 4) - c.Assert(info.EmitCount, Equals, 4) - c.Assert(info.OutputCount, Equals, 3) - c.Assert(info.VerboseTime, IsNil) - - expected := map[int]int{3: 1, 4: 2, 6: 1} - for _, item := range result { - c.Logf("Item: %#v", &item) - c.Assert(item.Value, Equals, expected[item.Id]) - expected[item.Id] = -1 - } -} - -func (s *S) TestMapReduceFinalize(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - for _, i := range []int{1, 4, 6, 2, 2, 3, 4} { - coll.Insert(M{"n": i}) - } - - job := &mgo.MapReduce{ - Map: "function() { emit(this.n, 1) }", - Reduce: "function(key, values) { return Array.sum(values) }", - Finalize: "function(key, count) { return {count: count} }", - } - var result []struct { - Id int "_id" - Value struct{ Count int } - } - _, err = coll.Find(nil).MapReduce(job, &result) - c.Assert(err, IsNil) - - expected := map[int]int{1: 1, 2: 2, 3: 1, 4: 2, 6: 1} - for _, item := range result { - c.Logf("Item: %#v", &item) - c.Assert(item.Value.Count, Equals, expected[item.Id]) - expected[item.Id] = -1 - } -} - -func (s *S) TestMapReduceToCollection(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - for _, i := range []int{1, 4, 6, 2, 2, 3, 4} { - coll.Insert(M{"n": i}) - } - - job := &mgo.MapReduce{ - Map: "function() { emit(this.n, 1); }", - Reduce: "function(key, values) { return Array.sum(values); }", - Out: "mr", - } - - info, err := coll.Find(nil).MapReduce(job, nil) - c.Assert(err, IsNil) - c.Assert(info.InputCount, Equals, 7) - c.Assert(info.EmitCount, Equals, 7) - c.Assert(info.OutputCount, Equals, 5) - c.Assert(info.Collection, Equals, "mr") - c.Assert(info.Database, Equals, "mydb") - - expected := map[int]int{1: 1, 2: 2, 3: 1, 4: 2, 6: 1} - var item *struct { - Id int "_id" - Value int - } - mr := session.DB("mydb").C("mr") - iter := mr.Find(nil).Iter() - for iter.Next(&item) { - c.Logf("Item: %#v", &item) - c.Assert(item.Value, Equals, expected[item.Id]) - expected[item.Id] = -1 - } - c.Assert(iter.Close(), IsNil) -} - -func (s *S) TestMapReduceToOtherDb(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - for _, i := range []int{1, 4, 6, 2, 2, 3, 4} { - coll.Insert(M{"n": i}) - } - - job := &mgo.MapReduce{ - Map: "function() { emit(this.n, 1); }", - Reduce: "function(key, values) { return Array.sum(values); }", - Out: bson.D{{"replace", "mr"}, {"db", "otherdb"}}, - } - - info, err := coll.Find(nil).MapReduce(job, nil) - c.Assert(err, IsNil) - c.Assert(info.InputCount, Equals, 7) - c.Assert(info.EmitCount, Equals, 7) - c.Assert(info.OutputCount, Equals, 5) - c.Assert(info.Collection, Equals, "mr") - c.Assert(info.Database, Equals, "otherdb") - - expected := map[int]int{1: 1, 2: 2, 3: 1, 4: 2, 6: 1} - var item *struct { - Id int "_id" - Value int - } - mr := session.DB("otherdb").C("mr") - iter := mr.Find(nil).Iter() - for iter.Next(&item) { - c.Logf("Item: %#v", &item) - c.Assert(item.Value, Equals, expected[item.Id]) - expected[item.Id] = -1 - } - c.Assert(iter.Close(), IsNil) -} - -func (s *S) TestMapReduceOutOfOrder(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - for _, i := range []int{1, 4, 6, 2, 2, 3, 4} { - coll.Insert(M{"n": i}) - } - - job := &mgo.MapReduce{ - Map: "function() { emit(this.n, 1); }", - Reduce: "function(key, values) { return Array.sum(values); }", - Out: bson.M{"a": "a", "z": "z", "replace": "mr", "db": "otherdb", "b": "b", "y": "y"}, - } - - info, err := coll.Find(nil).MapReduce(job, nil) - c.Assert(err, IsNil) - c.Assert(info.Collection, Equals, "mr") - c.Assert(info.Database, Equals, "otherdb") -} - -func (s *S) TestMapReduceScope(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - coll.Insert(M{"n": 1}) - - job := &mgo.MapReduce{ - Map: "function() { emit(this.n, x); }", - Reduce: "function(key, values) { return Array.sum(values); }", - Scope: M{"x": 42}, - } - - var result []bson.M - _, err = coll.Find(nil).MapReduce(job, &result) - c.Assert(len(result), Equals, 1) - c.Assert(result[0]["value"], Equals, 42.0) -} - -func (s *S) TestMapReduceVerbose(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - for i := 0; i < 100; i++ { - err = coll.Insert(M{"n": i}) - c.Assert(err, IsNil) - } - - job := &mgo.MapReduce{ - Map: "function() { emit(this.n, 1); }", - Reduce: "function(key, values) { return Array.sum(values); }", - Verbose: true, - } - - info, err := coll.Find(nil).MapReduce(job, nil) - c.Assert(err, IsNil) - c.Assert(info.VerboseTime, NotNil) -} - -func (s *S) TestMapReduceLimit(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - for _, i := range []int{1, 4, 6, 2, 2, 3, 4} { - coll.Insert(M{"n": i}) - } - - job := &mgo.MapReduce{ - Map: "function() { emit(this.n, 1); }", - Reduce: "function(key, values) { return Array.sum(values); }", - } - - var result []bson.M - _, err = coll.Find(nil).Limit(3).MapReduce(job, &result) - c.Assert(err, IsNil) - c.Assert(len(result), Equals, 3) -} - -func (s *S) TestBuildInfo(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - info, err := session.BuildInfo() - c.Assert(err, IsNil) - - var v []int - for i, a := range strings.Split(info.Version, ".") { - for _, token := range []string{"-rc", "-pre"} { - if i == 2 && strings.Contains(a, token) { - a = a[:strings.Index(a, token)] - info.VersionArray[len(info.VersionArray)-1] = 0 - } - } - n, err := strconv.Atoi(a) - c.Assert(err, IsNil) - v = append(v, n) - } - for len(v) < 4 { - v = append(v, 0) - } - - c.Assert(info.VersionArray, DeepEquals, v) - c.Assert(info.GitVersion, Matches, "[a-z0-9]+") - c.Assert(info.SysInfo, Matches, ".*[0-9:]+.*") - if info.Bits != 32 && info.Bits != 64 { - c.Fatalf("info.Bits is %d", info.Bits) - } - if info.MaxObjectSize < 8192 { - c.Fatalf("info.MaxObjectSize seems too small: %d", info.MaxObjectSize) - } -} - -func (s *S) TestZeroTimeRoundtrip(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - var d struct{ T time.Time } - conn := session.DB("mydb").C("mycoll") - err = conn.Insert(d) - c.Assert(err, IsNil) - - var result bson.M - err = conn.Find(nil).One(&result) - c.Assert(err, IsNil) - t, isTime := result["t"].(time.Time) - c.Assert(isTime, Equals, true) - c.Assert(t, Equals, time.Time{}) -} - -func (s *S) TestFsyncLock(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - clone := session.Clone() - defer clone.Close() - - err = session.FsyncLock() - c.Assert(err, IsNil) - - done := make(chan time.Time) - go func() { - time.Sleep(3e9) - now := time.Now() - err := session.FsyncUnlock() - c.Check(err, IsNil) - done <- now - }() - - err = clone.DB("mydb").C("mycoll").Insert(bson.M{"n": 1}) - unlocked := time.Now() - unlocking := <-done - c.Assert(err, IsNil) - - c.Assert(unlocked.After(unlocking), Equals, true) - c.Assert(unlocked.Sub(unlocking) < 1e9, Equals, true) -} - -func (s *S) TestFsync(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - // Not much to do here. Just a smoke check. - err = session.Fsync(false) - c.Assert(err, IsNil) - err = session.Fsync(true) - c.Assert(err, IsNil) -} - -func (s *S) TestRepairCursor(c *C) { - if !s.versionAtLeast(2, 7) { - c.Skip("RepairCursor only works on 2.7+") - } - - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - session.SetBatch(2) - - coll := session.DB("mydb").C("mycoll3") - err = coll.DropCollection() - - ns := []int{0, 10, 20, 30, 40, 50} - for _, n := range ns { - coll.Insert(M{"n": n}) - } - - repairIter := coll.Repair() - - c.Assert(repairIter.Err(), IsNil) - - result := struct{ N int }{} - resultCounts := map[int]int{} - for repairIter.Next(&result) { - resultCounts[result.N]++ - } - - c.Assert(repairIter.Next(&result), Equals, false) - c.Assert(repairIter.Err(), IsNil) - c.Assert(repairIter.Close(), IsNil) - - // Verify that the results of the repair cursor are valid. - // The repair cursor can return multiple copies - // of the same document, so to check correctness we only - // need to verify that at least 1 of each document was returned. - - for _, key := range ns { - c.Assert(resultCounts[key] > 0, Equals, true) - } -} - -func (s *S) TestPipeIter(c *C) { - if !s.versionAtLeast(2, 1) { - c.Skip("Pipe only works on 2.1+") - } - - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - coll.Insert(M{"n": n}) - } - - pipe := coll.Pipe([]M{{"$match": M{"n": M{"$gte": 42}}}}) - - // Ensure cursor logic is working by forcing a small batch. - pipe.Batch(2) - - // Smoke test for AllowDiskUse. - pipe.AllowDiskUse() - - iter := pipe.Iter() - result := struct{ N int }{} - for i := 2; i < 7; i++ { - ok := iter.Next(&result) - c.Assert(ok, Equals, true) - c.Assert(result.N, Equals, ns[i]) - } - - c.Assert(iter.Next(&result), Equals, false) - c.Assert(iter.Close(), IsNil) -} - -func (s *S) TestPipeAll(c *C) { - if !s.versionAtLeast(2, 1) { - c.Skip("Pipe only works on 2.1+") - } - - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - err := coll.Insert(M{"n": n}) - c.Assert(err, IsNil) - } - - var result []struct{ N int } - err = coll.Pipe([]M{{"$match": M{"n": M{"$gte": 42}}}}).All(&result) - c.Assert(err, IsNil) - for i := 2; i < 7; i++ { - c.Assert(result[i-2].N, Equals, ns[i]) - } -} - -func (s *S) TestPipeOne(c *C) { - if !s.versionAtLeast(2, 1) { - c.Skip("Pipe only works on 2.1+") - } - - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - coll.Insert(M{"a": 1, "b": 2}) - - result := struct{ A, B int }{} - - pipe := coll.Pipe([]M{{"$project": M{"a": 1, "b": M{"$add": []interface{}{"$b", 1}}}}}) - err = pipe.One(&result) - c.Assert(err, IsNil) - c.Assert(result.A, Equals, 1) - c.Assert(result.B, Equals, 3) - - pipe = coll.Pipe([]M{{"$match": M{"a": 2}}}) - err = pipe.One(&result) - c.Assert(err, Equals, mgo.ErrNotFound) -} - -func (s *S) TestPipeExplain(c *C) { - if !s.versionAtLeast(2, 1) { - c.Skip("Pipe only works on 2.1+") - } - - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - coll.Insert(M{"a": 1, "b": 2}) - - pipe := coll.Pipe([]M{{"$project": M{"a": 1, "b": M{"$add": []interface{}{"$b", 1}}}}}) - - // The explain command result changes across versions. - var result struct{ Ok int } - err = pipe.Explain(&result) - c.Assert(err, IsNil) - c.Assert(result.Ok, Equals, 1) -} - -func (s *S) TestBatch1Bug(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - for i := 0; i < 3; i++ { - err := coll.Insert(M{"n": i}) - c.Assert(err, IsNil) - } - - var ns []struct{ N int } - err = coll.Find(nil).Batch(1).All(&ns) - c.Assert(err, IsNil) - c.Assert(len(ns), Equals, 3) - - session.SetBatch(1) - err = coll.Find(nil).All(&ns) - c.Assert(err, IsNil) - c.Assert(len(ns), Equals, 3) -} - -func (s *S) TestInterfaceIterBug(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - - for i := 0; i < 3; i++ { - err := coll.Insert(M{"n": i}) - c.Assert(err, IsNil) - } - - var result interface{} - - i := 0 - iter := coll.Find(nil).Sort("n").Iter() - for iter.Next(&result) { - c.Assert(result.(bson.M)["n"], Equals, i) - i++ - } - c.Assert(iter.Close(), IsNil) -} - -func (s *S) TestFindIterCloseKillsCursor(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - cursors := serverCursorsOpen(session) - - coll := session.DB("mydb").C("mycoll") - ns := []int{40, 41, 42, 43, 44, 45, 46} - for _, n := range ns { - err = coll.Insert(M{"n": n}) - c.Assert(err, IsNil) - } - - iter := coll.Find(nil).Batch(2).Iter() - c.Assert(iter.Next(bson.M{}), Equals, true) - - c.Assert(iter.Close(), IsNil) - c.Assert(serverCursorsOpen(session), Equals, cursors) -} - -func (s *S) TestLogReplay(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - for i := 0; i < 5; i++ { - err = coll.Insert(M{"ts": time.Now()}) - c.Assert(err, IsNil) - } - - iter := coll.Find(nil).LogReplay().Iter() - if s.versionAtLeast(2, 6) { - // This used to fail in 2.4. Now it's just a smoke test. - c.Assert(iter.Err(), IsNil) - } else { - c.Assert(iter.Next(bson.M{}), Equals, false) - c.Assert(iter.Err(), ErrorMatches, "no ts field in query") - } -} - -func (s *S) TestSetCursorTimeout(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - err = coll.Insert(M{"n": 42}) - - // This is just a smoke test. Won't wait 10 minutes for an actual timeout. - - session.SetCursorTimeout(0) - - var result struct{ N int } - iter := coll.Find(nil).Iter() - c.Assert(iter.Next(&result), Equals, true) - c.Assert(result.N, Equals, 42) - c.Assert(iter.Next(&result), Equals, false) -} - -func (s *S) TestNewIterNoServer(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - data, err := bson.Marshal(bson.M{"a": 1}) - - coll := session.DB("mydb").C("mycoll") - iter := coll.NewIter(nil, []bson.Raw{{3, data}}, 42, nil) - - var result struct{ A int } - ok := iter.Next(&result) - c.Assert(ok, Equals, true) - c.Assert(result.A, Equals, 1) - - ok = iter.Next(&result) - c.Assert(ok, Equals, false) - - c.Assert(iter.Err(), ErrorMatches, "server not available") -} - -func (s *S) TestNewIterNoServerPresetErr(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - data, err := bson.Marshal(bson.M{"a": 1}) - - coll := session.DB("mydb").C("mycoll") - iter := coll.NewIter(nil, []bson.Raw{{3, data}}, 42, fmt.Errorf("my error")) - - var result struct{ A int } - ok := iter.Next(&result) - c.Assert(ok, Equals, true) - c.Assert(result.A, Equals, 1) - - ok = iter.Next(&result) - c.Assert(ok, Equals, false) - - c.Assert(iter.Err(), ErrorMatches, "my error") -} - -// -------------------------------------------------------------------------- -// Some benchmarks that require a running database. - -func (s *S) BenchmarkFindIterRaw(c *C) { - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - defer session.Close() - - coll := session.DB("mydb").C("mycoll") - doc := bson.D{ - {"f2", "a short string"}, - {"f3", bson.D{{"1", "one"}, {"2", 2.0}}}, - {"f4", []string{"a", "b", "c", "d", "e", "f", "g"}}, - } - - for i := 0; i < c.N+1; i++ { - err := coll.Insert(doc) - c.Assert(err, IsNil) - } - - session.SetBatch(c.N) - - var raw bson.Raw - iter := coll.Find(nil).Iter() - iter.Next(&raw) - c.ResetTimer() - i := 0 - for iter.Next(&raw) { - i++ - } - c.StopTimer() - c.Assert(iter.Err(), IsNil) - c.Assert(i, Equals, c.N) -} diff --git a/vendor/gopkg.in/mgo.v2/socket.go b/vendor/gopkg.in/mgo.v2/socket.go deleted file mode 100644 index f6882d501..000000000 --- a/vendor/gopkg.in/mgo.v2/socket.go +++ /dev/null @@ -1,677 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// 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 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 mgo - -import ( - "errors" - "net" - "sync" - "time" - - "gopkg.in/mgo.v2/bson" -) - -type replyFunc func(err error, reply *replyOp, docNum int, docData []byte) - -type mongoSocket struct { - sync.Mutex - server *mongoServer // nil when cached - conn net.Conn - timeout time.Duration - addr string // For debugging only. - nextRequestId uint32 - replyFuncs map[uint32]replyFunc - references int - creds []Credential - logout []Credential - cachedNonce string - gotNonce sync.Cond - dead error - serverInfo *mongoServerInfo -} - -type queryOpFlags uint32 - -const ( - _ queryOpFlags = 1 << iota - flagTailable - flagSlaveOk - flagLogReplay - flagNoCursorTimeout - flagAwaitData -) - -type queryOp struct { - collection string - query interface{} - skip int32 - limit int32 - selector interface{} - flags queryOpFlags - replyFunc replyFunc - - options queryWrapper - hasOptions bool - serverTags []bson.D -} - -type queryWrapper struct { - Query interface{} "$query" - OrderBy interface{} "$orderby,omitempty" - Hint interface{} "$hint,omitempty" - Explain bool "$explain,omitempty" - Snapshot bool "$snapshot,omitempty" - ReadPreference bson.D "$readPreference,omitempty" - MaxScan int "$maxScan,omitempty" - MaxTimeMS int "$maxTimeMS,omitempty" - Comment string "$comment,omitempty" -} - -func (op *queryOp) finalQuery(socket *mongoSocket) interface{} { - if op.flags&flagSlaveOk != 0 && len(op.serverTags) > 0 && socket.ServerInfo().Mongos { - op.hasOptions = true - op.options.ReadPreference = bson.D{{"mode", "secondaryPreferred"}, {"tags", op.serverTags}} - } - if op.hasOptions { - if op.query == nil { - var empty bson.D - op.options.Query = empty - } else { - op.options.Query = op.query - } - debugf("final query is %#v\n", &op.options) - return &op.options - } - return op.query -} - -type getMoreOp struct { - collection string - limit int32 - cursorId int64 - replyFunc replyFunc -} - -type replyOp struct { - flags uint32 - cursorId int64 - firstDoc int32 - replyDocs int32 -} - -type insertOp struct { - collection string // "database.collection" - documents []interface{} // One or more documents to insert - flags uint32 -} - -type updateOp struct { - collection string // "database.collection" - selector interface{} - update interface{} - flags uint32 -} - -type deleteOp struct { - collection string // "database.collection" - selector interface{} - flags uint32 -} - -type killCursorsOp struct { - cursorIds []int64 -} - -type requestInfo struct { - bufferPos int - replyFunc replyFunc -} - -func newSocket(server *mongoServer, conn net.Conn, timeout time.Duration) *mongoSocket { - socket := &mongoSocket{ - conn: conn, - addr: server.Addr, - server: server, - replyFuncs: make(map[uint32]replyFunc), - } - socket.gotNonce.L = &socket.Mutex - if err := socket.InitialAcquire(server.Info(), timeout); err != nil { - panic("newSocket: InitialAcquire returned error: " + err.Error()) - } - stats.socketsAlive(+1) - debugf("Socket %p to %s: initialized", socket, socket.addr) - socket.resetNonce() - go socket.readLoop() - return socket -} - -// Server returns the server that the socket is associated with. -// It returns nil while the socket is cached in its respective server. -func (socket *mongoSocket) Server() *mongoServer { - socket.Lock() - server := socket.server - socket.Unlock() - return server -} - -// ServerInfo returns details for the server at the time the socket -// was initially acquired. -func (socket *mongoSocket) ServerInfo() *mongoServerInfo { - socket.Lock() - serverInfo := socket.serverInfo - socket.Unlock() - return serverInfo -} - -// InitialAcquire obtains the first reference to the socket, either -// right after the connection is made or once a recycled socket is -// being put back in use. -func (socket *mongoSocket) InitialAcquire(serverInfo *mongoServerInfo, timeout time.Duration) error { - socket.Lock() - if socket.references > 0 { - panic("Socket acquired out of cache with references") - } - if socket.dead != nil { - dead := socket.dead - socket.Unlock() - return dead - } - socket.references++ - socket.serverInfo = serverInfo - socket.timeout = timeout - stats.socketsInUse(+1) - stats.socketRefs(+1) - socket.Unlock() - return nil -} - -// Acquire obtains an additional reference to the socket. -// The socket will only be recycled when it's released as many -// times as it's been acquired. -func (socket *mongoSocket) Acquire() (info *mongoServerInfo) { - socket.Lock() - if socket.references == 0 { - panic("Socket got non-initial acquire with references == 0") - } - // We'll track references to dead sockets as well. - // Caller is still supposed to release the socket. - socket.references++ - stats.socketRefs(+1) - serverInfo := socket.serverInfo - socket.Unlock() - return serverInfo -} - -// Release decrements a socket reference. The socket will be -// recycled once its released as many times as it's been acquired. -func (socket *mongoSocket) Release() { - socket.Lock() - if socket.references == 0 { - panic("socket.Release() with references == 0") - } - socket.references-- - stats.socketRefs(-1) - if socket.references == 0 { - stats.socketsInUse(-1) - server := socket.server - socket.Unlock() - socket.LogoutAll() - // If the socket is dead server is nil. - if server != nil { - server.RecycleSocket(socket) - } - } else { - socket.Unlock() - } -} - -// SetTimeout changes the timeout used on socket operations. -func (socket *mongoSocket) SetTimeout(d time.Duration) { - socket.Lock() - socket.timeout = d - socket.Unlock() -} - -type deadlineType int - -const ( - readDeadline deadlineType = 1 - writeDeadline deadlineType = 2 -) - -func (socket *mongoSocket) updateDeadline(which deadlineType) { - var when time.Time - if socket.timeout > 0 { - when = time.Now().Add(socket.timeout) - } - whichstr := "" - switch which { - case readDeadline | writeDeadline: - whichstr = "read/write" - socket.conn.SetDeadline(when) - case readDeadline: - whichstr = "read" - socket.conn.SetReadDeadline(when) - case writeDeadline: - whichstr = "write" - socket.conn.SetWriteDeadline(when) - default: - panic("invalid parameter to updateDeadline") - } - debugf("Socket %p to %s: updated %s deadline to %s ahead (%s)", socket, socket.addr, whichstr, socket.timeout, when) -} - -// Close terminates the socket use. -func (socket *mongoSocket) Close() { - socket.kill(errors.New("Closed explicitly"), false) -} - -func (socket *mongoSocket) kill(err error, abend bool) { - socket.Lock() - if socket.dead != nil { - debugf("Socket %p to %s: killed again: %s (previously: %s)", socket, socket.addr, err.Error(), socket.dead.Error()) - socket.Unlock() - return - } - logf("Socket %p to %s: closing: %s (abend=%v)", socket, socket.addr, err.Error(), abend) - socket.dead = err - socket.conn.Close() - stats.socketsAlive(-1) - replyFuncs := socket.replyFuncs - socket.replyFuncs = make(map[uint32]replyFunc) - server := socket.server - socket.server = nil - socket.gotNonce.Broadcast() - socket.Unlock() - for _, replyFunc := range replyFuncs { - logf("Socket %p to %s: notifying replyFunc of closed socket: %s", socket, socket.addr, err.Error()) - replyFunc(err, nil, -1, nil) - } - if abend { - server.AbendSocket(socket) - } -} - -func (socket *mongoSocket) SimpleQuery(op *queryOp) (data []byte, err error) { - var wait, change sync.Mutex - var replyDone bool - var replyData []byte - var replyErr error - wait.Lock() - op.replyFunc = func(err error, reply *replyOp, docNum int, docData []byte) { - change.Lock() - if !replyDone { - replyDone = true - replyErr = err - if err == nil { - replyData = docData - } - } - change.Unlock() - wait.Unlock() - } - err = socket.Query(op) - if err != nil { - return nil, err - } - wait.Lock() - change.Lock() - data = replyData - err = replyErr - change.Unlock() - return data, err -} - -func (socket *mongoSocket) Query(ops ...interface{}) (err error) { - - if lops := socket.flushLogout(); len(lops) > 0 { - ops = append(lops, ops...) - } - - buf := make([]byte, 0, 256) - - // Serialize operations synchronously to avoid interrupting - // other goroutines while we can't really be sending data. - // Also, record id positions so that we can compute request - // ids at once later with the lock already held. - requests := make([]requestInfo, len(ops)) - requestCount := 0 - - for _, op := range ops { - debugf("Socket %p to %s: serializing op: %#v", socket, socket.addr, op) - start := len(buf) - var replyFunc replyFunc - switch op := op.(type) { - - case *updateOp: - buf = addHeader(buf, 2001) - buf = addInt32(buf, 0) // Reserved - buf = addCString(buf, op.collection) - buf = addInt32(buf, int32(op.flags)) - debugf("Socket %p to %s: serializing selector document: %#v", socket, socket.addr, op.selector) - buf, err = addBSON(buf, op.selector) - if err != nil { - return err - } - debugf("Socket %p to %s: serializing update document: %#v", socket, socket.addr, op.update) - buf, err = addBSON(buf, op.update) - if err != nil { - return err - } - - case *insertOp: - buf = addHeader(buf, 2002) - buf = addInt32(buf, int32(op.flags)) - buf = addCString(buf, op.collection) - for _, doc := range op.documents { - debugf("Socket %p to %s: serializing document for insertion: %#v", socket, socket.addr, doc) - buf, err = addBSON(buf, doc) - if err != nil { - return err - } - } - - case *queryOp: - buf = addHeader(buf, 2004) - buf = addInt32(buf, int32(op.flags)) - buf = addCString(buf, op.collection) - buf = addInt32(buf, op.skip) - buf = addInt32(buf, op.limit) - buf, err = addBSON(buf, op.finalQuery(socket)) - if err != nil { - return err - } - if op.selector != nil { - buf, err = addBSON(buf, op.selector) - if err != nil { - return err - } - } - replyFunc = op.replyFunc - - case *getMoreOp: - buf = addHeader(buf, 2005) - buf = addInt32(buf, 0) // Reserved - buf = addCString(buf, op.collection) - buf = addInt32(buf, op.limit) - buf = addInt64(buf, op.cursorId) - replyFunc = op.replyFunc - - case *deleteOp: - buf = addHeader(buf, 2006) - buf = addInt32(buf, 0) // Reserved - buf = addCString(buf, op.collection) - buf = addInt32(buf, int32(op.flags)) - debugf("Socket %p to %s: serializing selector document: %#v", socket, socket.addr, op.selector) - buf, err = addBSON(buf, op.selector) - if err != nil { - return err - } - - case *killCursorsOp: - buf = addHeader(buf, 2007) - buf = addInt32(buf, 0) // Reserved - buf = addInt32(buf, int32(len(op.cursorIds))) - for _, cursorId := range op.cursorIds { - buf = addInt64(buf, cursorId) - } - - default: - panic("internal error: unknown operation type") - } - - setInt32(buf, start, int32(len(buf)-start)) - - if replyFunc != nil { - request := &requests[requestCount] - request.replyFunc = replyFunc - request.bufferPos = start - requestCount++ - } - } - - // Buffer is ready for the pipe. Lock, allocate ids, and enqueue. - - socket.Lock() - if socket.dead != nil { - dead := socket.dead - socket.Unlock() - debugf("Socket %p to %s: failing query, already closed: %s", socket, socket.addr, socket.dead.Error()) - // XXX This seems necessary in case the session is closed concurrently - // with a query being performed, but it's not yet tested: - for i := 0; i != requestCount; i++ { - request := &requests[i] - if request.replyFunc != nil { - request.replyFunc(dead, nil, -1, nil) - } - } - return dead - } - - wasWaiting := len(socket.replyFuncs) > 0 - - // Reserve id 0 for requests which should have no responses. - requestId := socket.nextRequestId + 1 - if requestId == 0 { - requestId++ - } - socket.nextRequestId = requestId + uint32(requestCount) - for i := 0; i != requestCount; i++ { - request := &requests[i] - setInt32(buf, request.bufferPos+4, int32(requestId)) - socket.replyFuncs[requestId] = request.replyFunc - requestId++ - } - - debugf("Socket %p to %s: sending %d op(s) (%d bytes)", socket, socket.addr, len(ops), len(buf)) - stats.sentOps(len(ops)) - - socket.updateDeadline(writeDeadline) - _, err = socket.conn.Write(buf) - if !wasWaiting && requestCount > 0 { - socket.updateDeadline(readDeadline) - } - socket.Unlock() - return err -} - -func fill(r net.Conn, b []byte) error { - l := len(b) - n, err := r.Read(b) - for n != l && err == nil { - var ni int - ni, err = r.Read(b[n:]) - n += ni - } - return err -} - -// Estimated minimum cost per socket: 1 goroutine + memory for the largest -// document ever seen. -func (socket *mongoSocket) readLoop() { - p := make([]byte, 36) // 16 from header + 20 from OP_REPLY fixed fields - s := make([]byte, 4) - conn := socket.conn // No locking, conn never changes. - for { - // XXX Handle timeouts, , etc - err := fill(conn, p) - if err != nil { - socket.kill(err, true) - return - } - - totalLen := getInt32(p, 0) - responseTo := getInt32(p, 8) - opCode := getInt32(p, 12) - - // Don't use socket.server.Addr here. socket is not - // locked and socket.server may go away. - debugf("Socket %p to %s: got reply (%d bytes)", socket, socket.addr, totalLen) - - _ = totalLen - - if opCode != 1 { - socket.kill(errors.New("opcode != 1, corrupted data?"), true) - return - } - - reply := replyOp{ - flags: uint32(getInt32(p, 16)), - cursorId: getInt64(p, 20), - firstDoc: getInt32(p, 28), - replyDocs: getInt32(p, 32), - } - - stats.receivedOps(+1) - stats.receivedDocs(int(reply.replyDocs)) - - socket.Lock() - replyFunc, ok := socket.replyFuncs[uint32(responseTo)] - if ok { - delete(socket.replyFuncs, uint32(responseTo)) - } - socket.Unlock() - - if replyFunc != nil && reply.replyDocs == 0 { - replyFunc(nil, &reply, -1, nil) - } else { - for i := 0; i != int(reply.replyDocs); i++ { - err := fill(conn, s) - if err != nil { - if replyFunc != nil { - replyFunc(err, nil, -1, nil) - } - socket.kill(err, true) - return - } - - b := make([]byte, int(getInt32(s, 0))) - - // copy(b, s) in an efficient way. - b[0] = s[0] - b[1] = s[1] - b[2] = s[2] - b[3] = s[3] - - err = fill(conn, b[4:]) - if err != nil { - if replyFunc != nil { - replyFunc(err, nil, -1, nil) - } - socket.kill(err, true) - return - } - - if globalDebug && globalLogger != nil { - m := bson.M{} - if err := bson.Unmarshal(b, m); err == nil { - debugf("Socket %p to %s: received document: %#v", socket, socket.addr, m) - } - } - - if replyFunc != nil { - replyFunc(nil, &reply, i, b) - } - - // XXX Do bound checking against totalLen. - } - } - - socket.Lock() - if len(socket.replyFuncs) == 0 { - // Nothing else to read for now. Disable deadline. - socket.conn.SetReadDeadline(time.Time{}) - } else { - socket.updateDeadline(readDeadline) - } - socket.Unlock() - - // XXX Do bound checking against totalLen. - } -} - -var emptyHeader = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - -func addHeader(b []byte, opcode int) []byte { - i := len(b) - b = append(b, emptyHeader...) - // Enough for current opcodes. - b[i+12] = byte(opcode) - b[i+13] = byte(opcode >> 8) - return b -} - -func addInt32(b []byte, i int32) []byte { - return append(b, byte(i), byte(i>>8), byte(i>>16), byte(i>>24)) -} - -func addInt64(b []byte, i int64) []byte { - return append(b, byte(i), byte(i>>8), byte(i>>16), byte(i>>24), - byte(i>>32), byte(i>>40), byte(i>>48), byte(i>>56)) -} - -func addCString(b []byte, s string) []byte { - b = append(b, []byte(s)...) - b = append(b, 0) - return b -} - -func addBSON(b []byte, doc interface{}) ([]byte, error) { - if doc == nil { - return append(b, 5, 0, 0, 0, 0), nil - } - data, err := bson.Marshal(doc) - if err != nil { - return b, err - } - return append(b, data...), nil -} - -func setInt32(b []byte, pos int, i int32) { - b[pos] = byte(i) - b[pos+1] = byte(i >> 8) - b[pos+2] = byte(i >> 16) - b[pos+3] = byte(i >> 24) -} - -func getInt32(b []byte, pos int) int32 { - return (int32(b[pos+0])) | - (int32(b[pos+1]) << 8) | - (int32(b[pos+2]) << 16) | - (int32(b[pos+3]) << 24) -} - -func getInt64(b []byte, pos int) int64 { - return (int64(b[pos+0])) | - (int64(b[pos+1]) << 8) | - (int64(b[pos+2]) << 16) | - (int64(b[pos+3]) << 24) | - (int64(b[pos+4]) << 32) | - (int64(b[pos+5]) << 40) | - (int64(b[pos+6]) << 48) | - (int64(b[pos+7]) << 56) -} diff --git a/vendor/gopkg.in/mgo.v2/stats.go b/vendor/gopkg.in/mgo.v2/stats.go deleted file mode 100644 index 59723e60c..000000000 --- a/vendor/gopkg.in/mgo.v2/stats.go +++ /dev/null @@ -1,147 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// 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 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 mgo - -import ( - "sync" -) - -var stats *Stats -var statsMutex sync.Mutex - -func SetStats(enabled bool) { - statsMutex.Lock() - if enabled { - if stats == nil { - stats = &Stats{} - } - } else { - stats = nil - } - statsMutex.Unlock() -} - -func GetStats() (snapshot Stats) { - statsMutex.Lock() - snapshot = *stats - statsMutex.Unlock() - return -} - -func ResetStats() { - statsMutex.Lock() - debug("Resetting stats") - old := stats - stats = &Stats{} - // These are absolute values: - stats.Clusters = old.Clusters - stats.SocketsInUse = old.SocketsInUse - stats.SocketsAlive = old.SocketsAlive - stats.SocketRefs = old.SocketRefs - statsMutex.Unlock() - return -} - -type Stats struct { - Clusters int - MasterConns int - SlaveConns int - SentOps int - ReceivedOps int - ReceivedDocs int - SocketsAlive int - SocketsInUse int - SocketRefs int -} - -func (stats *Stats) cluster(delta int) { - if stats != nil { - statsMutex.Lock() - stats.Clusters += delta - statsMutex.Unlock() - } -} - -func (stats *Stats) conn(delta int, master bool) { - if stats != nil { - statsMutex.Lock() - if master { - stats.MasterConns += delta - } else { - stats.SlaveConns += delta - } - statsMutex.Unlock() - } -} - -func (stats *Stats) sentOps(delta int) { - if stats != nil { - statsMutex.Lock() - stats.SentOps += delta - statsMutex.Unlock() - } -} - -func (stats *Stats) receivedOps(delta int) { - if stats != nil { - statsMutex.Lock() - stats.ReceivedOps += delta - statsMutex.Unlock() - } -} - -func (stats *Stats) receivedDocs(delta int) { - if stats != nil { - statsMutex.Lock() - stats.ReceivedDocs += delta - statsMutex.Unlock() - } -} - -func (stats *Stats) socketsInUse(delta int) { - if stats != nil { - statsMutex.Lock() - stats.SocketsInUse += delta - statsMutex.Unlock() - } -} - -func (stats *Stats) socketsAlive(delta int) { - if stats != nil { - statsMutex.Lock() - stats.SocketsAlive += delta - statsMutex.Unlock() - } -} - -func (stats *Stats) socketRefs(delta int) { - if stats != nil { - statsMutex.Lock() - stats.SocketRefs += delta - statsMutex.Unlock() - } -} diff --git a/vendor/gopkg.in/mgo.v2/suite_test.go b/vendor/gopkg.in/mgo.v2/suite_test.go deleted file mode 100644 index 140e5a09a..000000000 --- a/vendor/gopkg.in/mgo.v2/suite_test.go +++ /dev/null @@ -1,254 +0,0 @@ -// mgo - MongoDB driver for Go -// -// Copyright (c) 2010-2012 - Gustavo Niemeyer -// -// 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 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 mgo_test - -import ( - "errors" - "flag" - "fmt" - "net" - "os/exec" - "runtime" - "strconv" - "testing" - "time" - - . "gopkg.in/check.v1" - "gopkg.in/mgo.v2" - "gopkg.in/mgo.v2/bson" -) - -var fast = flag.Bool("fast", false, "Skip slow tests") - -type M bson.M - -type cLogger C - -func (c *cLogger) Output(calldepth int, s string) error { - ns := time.Now().UnixNano() - t := float64(ns%100e9) / 1e9 - ((*C)(c)).Logf("[LOG] %.05f %s", t, s) - return nil -} - -func TestAll(t *testing.T) { - TestingT(t) -} - -type S struct { - session *mgo.Session - stopped bool - build mgo.BuildInfo - frozen []string -} - -func (s *S) versionAtLeast(v ...int) (result bool) { - for i := range v { - if i == len(s.build.VersionArray) { - return false - } - if s.build.VersionArray[i] != v[i] { - return s.build.VersionArray[i] >= v[i] - } - } - return true -} - -var _ = Suite(&S{}) - -func (s *S) SetUpSuite(c *C) { - mgo.SetDebug(true) - mgo.SetStats(true) - s.StartAll() - - session, err := mgo.Dial("localhost:40001") - c.Assert(err, IsNil) - s.build, err = session.BuildInfo() - c.Check(err, IsNil) - session.Close() -} - -func (s *S) SetUpTest(c *C) { - err := run("mongo --nodb testdb/dropall.js") - if err != nil { - panic(err.Error()) - } - mgo.SetLogger((*cLogger)(c)) - mgo.ResetStats() -} - -func (s *S) TearDownTest(c *C) { - if s.stopped { - s.StartAll() - } - for _, host := range s.frozen { - if host != "" { - s.Thaw(host) - } - } - var stats mgo.Stats - for i := 0; ; i++ { - stats = mgo.GetStats() - if stats.SocketsInUse == 0 && stats.SocketsAlive == 0 { - break - } - if i == 20 { - c.Fatal("Test left sockets in a dirty state") - } - c.Logf("Waiting for sockets to die: %d in use, %d alive", stats.SocketsInUse, stats.SocketsAlive) - time.Sleep(500 * time.Millisecond) - } - for i := 0; ; i++ { - stats = mgo.GetStats() - if stats.Clusters == 0 { - break - } - if i == 60 { - c.Fatal("Test left clusters alive") - } - c.Logf("Waiting for clusters to die: %d alive", stats.Clusters) - time.Sleep(1 * time.Second) - } -} - -func (s *S) Stop(host string) { - // Give a moment for slaves to sync and avoid getting rollback issues. - panicOnWindows() - time.Sleep(2 * time.Second) - err := run("cd _testdb && supervisorctl stop " + supvName(host)) - if err != nil { - panic(err) - } - s.stopped = true -} - -func (s *S) pid(host string) int { - output, err := exec.Command("lsof", "-iTCP:"+hostPort(host), "-sTCP:LISTEN", "-Fp").CombinedOutput() - if err != nil { - panic(err) - } - pidstr := string(output[1 : len(output)-1]) - pid, err := strconv.Atoi(pidstr) - if err != nil { - panic("cannot convert pid to int: " + pidstr) - } - return pid -} - -func (s *S) Freeze(host string) { - err := stop(s.pid(host)) - if err != nil { - panic(err) - } - s.frozen = append(s.frozen, host) -} - -func (s *S) Thaw(host string) { - err := cont(s.pid(host)) - if err != nil { - panic(err) - } - for i, frozen := range s.frozen { - if frozen == host { - s.frozen[i] = "" - } - } -} - -func (s *S) StartAll() { - // Restart any stopped nodes. - run("cd _testdb && supervisorctl start all") - err := run("cd testdb && mongo --nodb wait.js") - if err != nil { - panic(err) - } - s.stopped = false -} - -func run(command string) error { - var output []byte - var err error - if runtime.GOOS == "windows" { - output, err = exec.Command("cmd", "/C", command).CombinedOutput() - } else { - output, err = exec.Command("/bin/sh", "-c", command).CombinedOutput() - } - - if err != nil { - msg := fmt.Sprintf("Failed to execute: %s: %s\n%s", command, err.Error(), string(output)) - return errors.New(msg) - } - return nil -} - -var supvNames = map[string]string{ - "40001": "db1", - "40002": "db2", - "40011": "rs1a", - "40012": "rs1b", - "40013": "rs1c", - "40021": "rs2a", - "40022": "rs2b", - "40023": "rs2c", - "40031": "rs3a", - "40032": "rs3b", - "40033": "rs3c", - "40041": "rs4a", - "40101": "cfg1", - "40102": "cfg2", - "40103": "cfg3", - "40201": "s1", - "40202": "s2", - "40203": "s3", -} - -// supvName returns the supervisord name for the given host address. -func supvName(host string) string { - host, port, err := net.SplitHostPort(host) - if err != nil { - panic(err) - } - name, ok := supvNames[port] - if !ok { - panic("Unknown host: " + host) - } - return name -} - -func hostPort(host string) string { - _, port, err := net.SplitHostPort(host) - if err != nil { - panic(err) - } - return port -} - -func panicOnWindows() { - if runtime.GOOS == "windows" { - panic("the test suite is not yet fully supported on Windows") - } -} diff --git a/vendor/gopkg.in/mgo.v2/syscall_test.go b/vendor/gopkg.in/mgo.v2/syscall_test.go deleted file mode 100644 index b8bbd7b34..000000000 --- a/vendor/gopkg.in/mgo.v2/syscall_test.go +++ /dev/null @@ -1,15 +0,0 @@ -// +build !windows - -package mgo_test - -import ( - "syscall" -) - -func stop(pid int) (err error) { - return syscall.Kill(pid, syscall.SIGSTOP) -} - -func cont(pid int) (err error) { - return syscall.Kill(pid, syscall.SIGCONT) -} diff --git a/vendor/gopkg.in/mgo.v2/syscall_windows_test.go b/vendor/gopkg.in/mgo.v2/syscall_windows_test.go deleted file mode 100644 index f2deaca86..000000000 --- a/vendor/gopkg.in/mgo.v2/syscall_windows_test.go +++ /dev/null @@ -1,11 +0,0 @@ -package mgo_test - -func stop(pid int) (err error) { - panicOnWindows() // Always does. - return nil -} - -func cont(pid int) (err error) { - panicOnWindows() // Always does. - return nil -} diff --git a/vendor/vendor.json b/vendor/vendor.json index 2927c2176..caa64402f 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -9,58 +9,23 @@ }, { "path": "github.com/dustin/go-humanize", - "revision": "1c212aae1d02984808182b98b0da7a3e07e4c770", - "revisionTime": "2015-08-09T13:14:05-07:00" - }, - { - "path": "github.com/elazarl/go-bindata-assetfs", - "revision": "d5cac425555ca5cf00694df246e04f05e6a55150", - "revisionTime": "2015-08-13T07:46:22+03:00" - }, - { - "path": "github.com/facebookgo/clock", - "revision": "600d898af40aa09a7a93ecb9265d87b0504b6f03", - "revisionTime": "2015-04-09T18:09:13-07:00" - }, - { - "path": "github.com/facebookgo/httpdown", - "revision": "9229879964ff32fc4e42c7ba6b4745efce39023c", - "revisionTime": "2015-08-07T22:21:07Z" - }, - { - "path": "github.com/facebookgo/stats", - "revision": "31fb71caf5a4f04c9f8bb3fa8e7c2597ba6eb50a", - "revisionTime": "2015-06-12T18:29:15Z" + "revision": "c20a8bde38c8f5ba06f6600edf473705c96829d1", + "revisionTime": "2015-08-24T01:38:10-07:00" }, { "path": "github.com/fatih/color", "revision": "76d423163af754ff6423d2d9be0057fbf03c57c2", "revisionTime": "2015-08-24T00:44:34+03:00" }, - { - "path": "github.com/fatih/structs", - "revision": "a9f7daa9c2729e97450c2da2feda19130a367d8f", - "revisionTime": "2015-05-26T09:43:52+03:00" - }, { "path": "github.com/gorilla/context", - "revision": "215affda49addc4c8ef7e2534915df2c8c35c6cd", - "revisionTime": "2014-12-17T08:02:51-08:00" + "revision": "1c83b3eabd45b6d76072b66b746c20815fb2872d", + "revisionTime": "2015-08-19T22:12:45-07:00" }, { "path": "github.com/gorilla/mux", - "revision": "5112c33f3a6ef694c1e5784b68981f08b3f0327c", - "revisionTime": "2015-08-11T22:16:22-07:00" - }, - { - "path": "github.com/gorilla/rpc/v2", - "revision": "74aa4b5cceca1188df2c7128f7ede4c92893701e", - "revisionTime": "2015-08-09T21:43:58-07:00" - }, - { - "path": "github.com/gorilla/rpc/v2/json", - "revision": "74aa4b5cceca1188df2c7128f7ede4c92893701e", - "revisionTime": "2015-08-09T21:43:58-07:00" + "revision": "ee1815431e497d3850809578c93ab6705f1a19f7", + "revisionTime": "2015-08-19T22:15:06-07:00" }, { "path": "github.com/mattn/go-isatty", @@ -69,13 +34,43 @@ }, { "path": "github.com/minio/cli", - "revision": "ee386baecc113eef2b8945df429120a5aec319ef", - "revisionTime": "2015-08-19T11:23:55-07:00" + "revision": "be072a094b77c259fcb232a3bdef6ed26760a5e6", + "revisionTime": "2015-10-13T13:54:28-07:00" }, { - "path": "github.com/olekukonko/ts", - "revision": "ecf753e7c962639ab5a1fb46f7da627d4c0a04b8", - "revisionTime": "2014-04-12T15:01:45-07:00" + "path": "github.com/minio/minio-xl/pkg/atomic", + "revision": "fc18620590fdb28b9e371a8cb036e9470c1cf39c", + "revisionTime": "2015-10-16T10:19:00-07:00" + }, + { + "path": "github.com/minio/minio-xl/pkg/cpu", + "revision": "fc18620590fdb28b9e371a8cb036e9470c1cf39c", + "revisionTime": "2015-10-16T10:19:00-07:00" + }, + { + "path": "github.com/minio/minio-xl/pkg/crypto/sha256", + "revision": "fc18620590fdb28b9e371a8cb036e9470c1cf39c", + "revisionTime": "2015-10-16T10:19:00-07:00" + }, + { + "path": "github.com/minio/minio-xl/pkg/crypto/sha512", + "revision": "fc18620590fdb28b9e371a8cb036e9470c1cf39c", + "revisionTime": "2015-10-16T10:19:00-07:00" + }, + { + "path": "github.com/minio/minio-xl/pkg/minhttp", + "revision": "fc18620590fdb28b9e371a8cb036e9470c1cf39c", + "revisionTime": "2015-10-16T10:19:00-07:00" + }, + { + "path": "github.com/minio/minio-xl/pkg/probe", + "revision": "fc18620590fdb28b9e371a8cb036e9470c1cf39c", + "revisionTime": "2015-10-16T10:19:00-07:00" + }, + { + "path": "github.com/minio/minio-xl/pkg/quick", + "revision": "fc18620590fdb28b9e371a8cb036e9470c1cf39c", + "revisionTime": "2015-10-16T10:19:00-07:00" }, { "path": "github.com/rs/cors", @@ -87,35 +82,10 @@ "revision": "a5e2b567a4dd6cc74545b8a4f27c9d63b9e7735b", "revisionTime": "2015-07-19T16:15:31+09:00" }, - { - "path": "github.com/weekface/mgorus", - "revision": "9a3ff865bf11d949ab7084198479139d9746c68f", - "revisionTime": "2015-09-01T11:57:24+08:00" - }, { "path": "gopkg.in/check.v1", "revision": "11d3bc7aa68e238947792f30573146a3231fc0f1", "revisionTime": "2015-07-29T10:04:31+02:00" - }, - { - "path": "gopkg.in/mgo.v2", - "revision": "f4923a569136442e900b8cf5c1a706c0a8b0883c", - "revisionTime": "2015-08-21T12:30:02-03:00" - }, - { - "path": "gopkg.in/mgo.v2/bson", - "revision": "f4923a569136442e900b8cf5c1a706c0a8b0883c", - "revisionTime": "2015-08-21T12:30:02-03:00" - }, - { - "path": "gopkg.in/mgo.v2/internal/sasl", - "revision": "f4923a569136442e900b8cf5c1a706c0a8b0883c", - "revisionTime": "2015-08-21T12:30:02-03:00" - }, - { - "path": "gopkg.in/mgo.v2/internal/scram", - "revision": "f4923a569136442e900b8cf5c1a706c0a8b0883c", - "revisionTime": "2015-08-21T12:30:02-03:00" } ] } diff --git a/verify-runtime.go b/verify-runtime.go index 661d1e18f..b611a06c8 100644 --- a/verify-runtime.go +++ b/verify-runtime.go @@ -90,6 +90,6 @@ func checkGolangRuntimeVersion() { v1 := newVersion(getNormalizedGolangVersion()) v2 := newVersion(minGolangRuntimeVersion) if v1.LessThan(v2) { - Errorln("Old Golang runtime version ‘" + v1.String() + "’ detected., ‘mc’ requires minimum go1.5.1 or later.") + Fatalln("Old Golang runtime version ‘" + v1.String() + "’ detected., ‘mc’ requires minimum go1.5.1 or later.") } } diff --git a/version.go b/version.go index ca3a65533..af50d592f 100644 --- a/version.go +++ b/version.go @@ -3,5 +3,5 @@ package main -const minioVersion = "Sat, 19 Sep 2015 06:15:16 GMT" -const minioReleaseTag = "RELEASE.Sat-19-Sep-2015-06-15-16-GMT" +const minioVersion = "Sun, 11 Oct 2015 06:14:24 GMT" +const minioReleaseTag = "RELEASE.Sun-11-Oct-2015-06-14-24-GMT"