diff --git a/.changelog/13539.txt b/.changelog/13539.txt
new file mode 100644
index 00000000000..8f77a29e839
--- /dev/null
+++ b/.changelog/13539.txt
@@ -0,0 +1,3 @@
+```release-note:improvement
+build: Update go toolchain to 1.18.5
+```
diff --git a/.changelog/13670.txt b/.changelog/13670.txt
new file mode 100644
index 00000000000..04e3541e3dd
--- /dev/null
+++ b/.changelog/13670.txt
@@ -0,0 +1,3 @@
+```release-note:bug
+ui: Fixed a bug where task memory was reported as zero on systems using cgroups v2
+```
diff --git a/.changelog/13755.txt b/.changelog/13755.txt
new file mode 100644
index 00000000000..3b1c2c051ae
--- /dev/null
+++ b/.changelog/13755.txt
@@ -0,0 +1,3 @@
+```release-note:improvement
+template: Templates support new uid/gid parameter pair
+```
\ No newline at end of file
diff --git a/.changelog/13907.txt b/.changelog/13907.txt
new file mode 100644
index 00000000000..50dc4a0ce19
--- /dev/null
+++ b/.changelog/13907.txt
@@ -0,0 +1,3 @@
+```release-note:improvement
+template: Expose consul-template configuration options at the client level for `nomad_retry`.
+```
diff --git a/.changelog/13919.txt b/.changelog/13919.txt
new file mode 100644
index 00000000000..559d948d863
--- /dev/null
+++ b/.changelog/13919.txt
@@ -0,0 +1,3 @@
+```release-note:improvement
+csi: Add `stage_publish_base_dir` field to `csi_plugin` block to support plugins that require a specific staging/publishing directory for mounts
+```
diff --git a/.changelog/13971.txt b/.changelog/13971.txt
new file mode 100644
index 00000000000..3873e254e11
--- /dev/null
+++ b/.changelog/13971.txt
@@ -0,0 +1,3 @@
+```release-note:improvement
+qemu: use shorter socket file names to reduce the chance of hitting the max path length
+```
diff --git a/.changelog/13972.txt b/.changelog/13972.txt
new file mode 100644
index 00000000000..330faea98a1
--- /dev/null
+++ b/.changelog/13972.txt
@@ -0,0 +1,3 @@
+```release-note:improvement
+template: add script change_mode that allows scripts to be executed on template change
+```
\ No newline at end of file
diff --git a/.changelog/13991.txt b/.changelog/13991.txt
new file mode 100644
index 00000000000..ec57024a45a
--- /dev/null
+++ b/.changelog/13991.txt
@@ -0,0 +1,3 @@
+```release-note:bug
+ui: when creating a secure variable, check against your namespaces rather than assuming default
+```
diff --git a/.changelog/14000.txt b/.changelog/14000.txt
new file mode 100644
index 00000000000..3db5ca3b648
--- /dev/null
+++ b/.changelog/14000.txt
@@ -0,0 +1,3 @@
+```release-note:bug
+qemu: restore the monitor socket path when restoring a QEMU task.
+```
diff --git a/.changelog/14001.txt b/.changelog/14001.txt
new file mode 100644
index 00000000000..026c80f8136
--- /dev/null
+++ b/.changelog/14001.txt
@@ -0,0 +1,3 @@
+```release-note:bug
+deployments: Fixed a bug that prevented auto-approval if canaries were marked as unhealthy during deployment
+```
diff --git a/.changelog/14025.txt b/.changelog/14025.txt
new file mode 100644
index 00000000000..762fa2f7e5c
--- /dev/null
+++ b/.changelog/14025.txt
@@ -0,0 +1,3 @@
+```release-note:improvement
+deps: Update go.etcd.io/bbolt to v1.3.6
+```
diff --git a/.changelog/14065.txt b/.changelog/14065.txt
new file mode 100644
index 00000000000..eef7084eeb2
--- /dev/null
+++ b/.changelog/14065.txt
@@ -0,0 +1,3 @@
+```release-note:bug
+cli: Fixed a bug where job validation requeset was not sent to leader
+```
diff --git a/.changelog/14069.txt b/.changelog/14069.txt
new file mode 100644
index 00000000000..9076fc3d6b6
--- /dev/null
+++ b/.changelog/14069.txt
@@ -0,0 +1,3 @@
+```release-note:bug
+cli: Fixed a bug where the memory usage reported by Allocation Resource Utilization is zero on systems using cgroups v2
+```
diff --git a/.changelog/14088.txt b/.changelog/14088.txt
new file mode 100644
index 00000000000..e8963029aaa
--- /dev/null
+++ b/.changelog/14088.txt
@@ -0,0 +1,3 @@
+```release-note:bug
+cli: Fixed a bug where vault token not respected in plan command
+```
diff --git a/.changelog/14089.txt b/.changelog/14089.txt
new file mode 100644
index 00000000000..c2a0d3e5059
--- /dev/null
+++ b/.changelog/14089.txt
@@ -0,0 +1,3 @@
+```release-note:improvement
+driver/docker: Added config option to disable container healthcheck
+```
diff --git a/.changelog/14103.txt b/.changelog/14103.txt
new file mode 100644
index 00000000000..af78d62dc1c
--- /dev/null
+++ b/.changelog/14103.txt
@@ -0,0 +1,3 @@
+```release-note:improvement
+deps: Update google.golang.org/grpc to v1.48.0
+```
diff --git a/.changelog/14112.txt b/.changelog/14112.txt
new file mode 100644
index 00000000000..19c11fa04ae
--- /dev/null
+++ b/.changelog/14112.txt
@@ -0,0 +1,3 @@
+```release-note:improvement
+deps: Update fsouza/go-dockerclient to v1.8.2
+```
diff --git a/.changelog/14115.txt b/.changelog/14115.txt
new file mode 100644
index 00000000000..e8a7f86b6ea
--- /dev/null
+++ b/.changelog/14115.txt
@@ -0,0 +1,3 @@
+```release-note:bug
+ui: Removes duplicate breadcrumb header when navigating from child job back to parent.
+```
diff --git a/.changelog/14127.txt b/.changelog/14127.txt
new file mode 100644
index 00000000000..61c0368774e
--- /dev/null
+++ b/.changelog/14127.txt
@@ -0,0 +1,7 @@
+```release-note:improvement
+client: add option to restart all tasks of an allocation, regardless of lifecycle type or state.
+```
+
+```release-note:improvement
+client: only start poststop tasks after poststart tasks are done.
+```
diff --git a/.changelog/14132.txt b/.changelog/14132.txt
new file mode 100644
index 00000000000..a93b804ce49
--- /dev/null
+++ b/.changelog/14132.txt
@@ -0,0 +1,3 @@
+```release-note:improvement
+build: update to go1.19
+```
diff --git a/.changelog/14138.txt b/.changelog/14138.txt
new file mode 100644
index 00000000000..0978a97ce52
--- /dev/null
+++ b/.changelog/14138.txt
@@ -0,0 +1,3 @@
+```release-note:improvement
+ui: add general keyboard navigation to the Nomad UI
+```
\ No newline at end of file
diff --git a/.changelog/14140.txt b/.changelog/14140.txt
new file mode 100644
index 00000000000..c3d9115ae8a
--- /dev/null
+++ b/.changelog/14140.txt
@@ -0,0 +1,3 @@
+```release-note:improvement
+cli: `acl policy info` output format has changed to improve readability with large policy documents
+```
diff --git a/.changelog/14145.txt b/.changelog/14145.txt
new file mode 100644
index 00000000000..5a543dac8de
--- /dev/null
+++ b/.changelog/14145.txt
@@ -0,0 +1,3 @@
+```release-note:bug
+api: cleanup whitespace from failed api response body
+```
diff --git a/.changelog/14171.txt b/.changelog/14171.txt
new file mode 100644
index 00000000000..ca84601d615
--- /dev/null
+++ b/.changelog/14171.txt
@@ -0,0 +1,3 @@
+```release-note:improvement
+sentinel: add the ability to reference the namespace and Nomad acl token in policies
+```
diff --git a/.changelog/14199.txt b/.changelog/14199.txt
new file mode 100644
index 00000000000..a2b21ffdb15
--- /dev/null
+++ b/.changelog/14199.txt
@@ -0,0 +1,3 @@
+```release-note:feature
+[ui] Services table: Display task-level services in addition to group-level services.
+```
diff --git a/.changelog/14203.txt b/.changelog/14203.txt
new file mode 100644
index 00000000000..f331d84c878
--- /dev/null
+++ b/.changelog/14203.txt
@@ -0,0 +1,3 @@
+```release-note:bug
+template: Fixed a bug where job templates would use `uid` and `gid` 0 after upgrading to Nomad 1.3.3, causing tasks to fail with the error `failed looking up user: managing file ownership is not supported on Windows`.
+```
diff --git a/.changelog/14212.txt b/.changelog/14212.txt
new file mode 100644
index 00000000000..e0e9809b40e
--- /dev/null
+++ b/.changelog/14212.txt
@@ -0,0 +1,3 @@
+```release-note:breaking-change
+audit (Enterprise): fixed inconsistency in event filter logic
+```
diff --git a/.changelog/14223.txt b/.changelog/14223.txt
new file mode 100644
index 00000000000..e8fceaa7c1c
--- /dev/null
+++ b/.changelog/14223.txt
@@ -0,0 +1,3 @@
+```release-note:improvement
+ui: Add button to restart all tasks in an allocation.
+```
diff --git a/.changelog/14224.txt b/.changelog/14224.txt
new file mode 100644
index 00000000000..8e05f384d30
--- /dev/null
+++ b/.changelog/14224.txt
@@ -0,0 +1,3 @@
+```release-note:bug
+ui: Fixed a bug that caused the allocation details page to display the stats bar chart even if the task was pending.
+```
diff --git a/.changelog/14248.txt b/.changelog/14248.txt
new file mode 100644
index 00000000000..32b4e40e9e0
--- /dev/null
+++ b/.changelog/14248.txt
@@ -0,0 +1,3 @@
+```release-note:bug
+client: Fixed a bug where user lookups would hang or panic
+```
diff --git a/.changelog/14297.txt b/.changelog/14297.txt
new file mode 100644
index 00000000000..207eb385890
--- /dev/null
+++ b/.changelog/14297.txt
@@ -0,0 +1,3 @@
+```release-note:bug
+client/logmon: fixed a bug where logmon cannot find nomad executable
+```
diff --git a/.changelog/14298.txt b/.changelog/14298.txt
new file mode 100644
index 00000000000..1072f7bebf2
--- /dev/null
+++ b/.changelog/14298.txt
@@ -0,0 +1,7 @@
+```release-note:bug
+vault: Fixed a bug where changing the Vault configuration `namespace` field was not detected as a change during server configuration reload.
+```
+
+```release-note:bug
+vault: Fixed a bug where Vault clients were recreated when the server configuration was reloaded, even if there were no changes to the Vault configuration.
+```
diff --git a/.circleci/config.yml b/.circleci/config.yml
index 080f3fac008..442ca1ad407 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -171,7 +171,11 @@ jobs:
mkdir -p $GOTESTSUM_PATH
- install-golang:
target_directory: "c:"
- - run: go version
+ - run:
+ name: Show installed Go version
+ command: |
+ export PATH=/c/go/bin:/c/gopath/bin:$PATH
+ go version
- install-vault:
version: $VAULT_VERSION
- run: vault version
@@ -457,7 +461,7 @@ executors:
go:
working_directory: /go/src/github.com/hashicorp/nomad
docker:
- - image: docker.mirror.hashicorp.services/golang:1.18.3
+ - image: docker.mirror.hashicorp.services/golang:1.19
resource_class: medium
environment:
<<: *common_envs
@@ -470,7 +474,7 @@ executors:
resource_class: large
environment: &machine_env
<<: *common_envs
- GOLANG_VERSION: 1.18.3
+ GOLANG_VERSION: 1.19
go-macos:
working_directory: ~/go/src/github.com/hashicorp/nomad
@@ -479,7 +483,7 @@ executors:
environment:
<<: *common_envs
GOPATH: /Users/distiller/go
- GOLANG_VERSION: 1.18.3
+ GOLANG_VERSION: 1.19
go-windows:
machine:
@@ -491,7 +495,7 @@ executors:
GOPATH: c:\gopath
GOBIN: c:\gopath\bin
GOTESTSUM_PATH: c:\tmp\test-reports
- GOLANG_VERSION: 1.18.3
+ GOLANG_VERSION: 1.19
GOTESTSUM_VERSION: 1.7.0
VAULT_VERSION: 1.4.1
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 52c3b0b0110..e24c03941e3 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -186,10 +186,18 @@ jobs:
echo "Version ${{ github.event.inputs.version }} is a prerelease, skipping update of LAST_RELEASE"
fi
+ - name: Remove generated files
+ run: |
+ # These generated files are only needed when building the final
+ # binary and should be not be present in the repository afterwards.
+ find . -name '*.generated.go' | xargs git rm
+ git status
+
- name: Commit post-release changes
run: |
- # Display stated and unstaged diffs.
- git diff --color=always HEAD
+ # Display staged and unstaged diffs, skipping deleted files to avoid
+ # cluttering the output with the generated files.
+ git diff --diff-filter=d --color=always HEAD
git add -A .
if ! git diff-index --quiet HEAD --; then
git commit --message 'Prepare for next release'
diff --git a/.github/workflows/test-core.yaml b/.github/workflows/test-core.yaml
index c7317b31c8c..c71c256d362 100644
--- a/.github/workflows/test-core.yaml
+++ b/.github/workflows/test-core.yaml
@@ -21,7 +21,7 @@ on:
- 'website/**'
env:
VERBOSE: 1
- GO_VERSION: 1.18.3
+ GO_VERSION: 1.19
GOBIN: /usr/local/bin
GOTESTARCH: amd64
CONSUL_VERSION: 1.11.3
diff --git a/.go-version b/.go-version
index b9fb27ab4f7..815d5ca06d5 100644
--- a/.go-version
+++ b/.go-version
@@ -1 +1 @@
-1.18.3
+1.19.0
diff --git a/.release/ci.hcl b/.release/ci.hcl
index dab8087af49..8883245039b 100644
--- a/.release/ci.hcl
+++ b/.release/ci.hcl
@@ -13,10 +13,7 @@ project "nomad" {
release_branches = [
"main",
- "release/1.0.x",
- "release/1.1.x",
- "release/1.2.x",
- "release/1.3.x",
+ "release/**",
]
}
}
@@ -225,3 +222,17 @@ event "promote-production-packaging" {
on = "always"
}
}
+
+event "post-publish-website" {
+ depends = ["promote-production-packaging"]
+
+ action "post-publish-website" {
+ organization = "hashicorp"
+ repository = "crt-workflows-common"
+ workflow = "post-publish-website"
+ }
+
+ notification {
+ on = "always"
+ }
+}
diff --git a/.semgrep/api_errorf.yml b/.semgrep/api_errorf.yml
new file mode 100644
index 00000000000..703c5bf29f0
--- /dev/null
+++ b/.semgrep/api_errorf.yml
@@ -0,0 +1,11 @@
+rules:
+ - id: "fmt_errorf_unformatted_use"
+ patterns:
+ - pattern: fmt.Errorf("...")
+ message: "Use of fmt.Errorf without formatting. Please use errors.New"
+ languages:
+ - "go"
+ severity: "WARNING"
+ paths:
+ include:
+ - "./api/*"
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 74bc7ab9fff..4c225a6d7cd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,25 @@
+## 1.3.3 (August 05, 2022)
+
+IMPROVEMENTS:
+
+* build: Update go toolchain to 1.18.5 [[GH-13956](https://github.com/hashicorp/nomad/pull/13956)]
+* csi: Add `stage_publish_base_dir` field to `csi_plugin` block to support plugins that require a specific staging/publishing directory for mounts [[GH-13919](https://github.com/hashicorp/nomad/issues/13919)]
+* qemu: use shorter socket file names to reduce the chance of hitting the max path length [[GH-13971](https://github.com/hashicorp/nomad/issues/13971)]
+* template: Expose consul-template configuration options at the client level for `nomad_retry`. [[GH-13907](https://github.com/hashicorp/nomad/issues/13907)]
+* template: Templates support new uid/gid parameter pair [[GH-13755](https://github.com/hashicorp/nomad/issues/13755)]
+* ui: Reorder and apply the same style to the Evaluations list page filters to match the Job list page. [[GH-13866](https://github.com/hashicorp/nomad/issues/13866)]
+
+BUG FIXES:
+
+* acl: Fixed a bug where the timestamp for expiring one-time tokens was not deterministic between servers [[GH-13737](https://github.com/hashicorp/nomad/issues/13737)]
+* deployments: Fixed a bug that prevented auto-approval if canaries were marked as unhealthy during deployment [[GH-14001](https://github.com/hashicorp/nomad/issues/14001)]
+* metrics: Fixed a bug where blocked evals with no class produced no dc:class scope metrics [[GH-13786](https://github.com/hashicorp/nomad/issues/13786)]
+* namespaces: Fixed a bug that allowed deleting a namespace that contained a CSI volume [[GH-13880](https://github.com/hashicorp/nomad/issues/13880)]
+* qemu: restore the monitor socket path when restoring a QEMU task. [[GH-14000](https://github.com/hashicorp/nomad/issues/14000)]
+* servicedisco: Fixed a bug where non-unique services would escape job validation [[GH-13869](https://github.com/hashicorp/nomad/issues/13869)]
+* ui: Add missing breadcrumb in the Evaluations page. [[GH-13865](https://github.com/hashicorp/nomad/issues/13865)]
+* ui: Fixed a bug where task memory was reported as zero on systems using cgroups v2 [[GH-13670](https://github.com/hashicorp/nomad/issues/13670)]
+
## 1.3.2 (July 13, 2022)
IMPROVEMENTS:
@@ -204,6 +226,17 @@ BUG FIXES:
* ui: fix broken link to task-groups in the Recent Allocations table in the Job Detail overview page. [[GH-12765](https://github.com/hashicorp/nomad/issues/12765)]
* ui: fix the unit for the task row memory usage metric [[GH-11980](https://github.com/hashicorp/nomad/issues/11980)]
+## 1.2.10 (August 05, 2022)
+
+BUG FIXES:
+
+* acl: Fixed a bug where the timestamp for expiring one-time tokens was not deterministic between servers [[GH-13737](https://github.com/hashicorp/nomad/issues/13737)]
+* build: Update go toolchain to 1.18.5 [[GH-13956](https://github.com/hashicorp/nomad/pull/13956)]
+* deployments: Fixed a bug that prevented auto-approval if canaries were marked as unhealthy during deployment [[GH-14001](https://github.com/hashicorp/nomad/issues/14001)]
+* metrics: Fixed a bug where blocked evals with no class produced no dc:class scope metrics [[GH-13786](https://github.com/hashicorp/nomad/issues/13786)]
+* namespaces: Fixed a bug that allowed deleting a namespace that contained a CSI volume [[GH-13880](https://github.com/hashicorp/nomad/issues/13880)]
+* qemu: restore the monitor socket path when restoring a QEMU task. [[GH-14000](https://github.com/hashicorp/nomad/issues/14000)]
+
## 1.2.9 (July 13, 2022)
BUG FIXES:
@@ -453,6 +486,15 @@ BUG FIXES:
* server: Fixed a panic on arm64 platform when dispatching a job with a payload [[GH-11396](https://github.com/hashicorp/nomad/issues/11396)]
* server: Fixed a panic that may occur when preempting multiple allocations on the same node [[GH-11346](https://github.com/hashicorp/nomad/issues/11346)]
+## 1.1.16 (August 05, 2022)
+
+BUG FIXES:
+
+* acl: Fixed a bug where the timestamp for expiring one-time tokens was not deterministic between servers [[GH-13737](https://github.com/hashicorp/nomad/issues/13737)]
+* deployments: Fixed a bug that prevented auto-approval if canaries were marked as unhealthy during deployment [[GH-14001](https://github.com/hashicorp/nomad/issues/14001)]
+* namespaces: Fixed a bug that allowed deleting a namespace that contained a CSI volume [[GH-13880](https://github.com/hashicorp/nomad/issues/13880)]
+* qemu: restore the monitor socket path when restoring a QEMU task. [[GH-14000](https://github.com/hashicorp/nomad/issues/14000)]
+
## 1.1.15 (July 13, 2022)
BUG FIXES:
diff --git a/GNUmakefile b/GNUmakefile
index 1c017108663..5f1d99c6ee2 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -21,7 +21,7 @@ ifndef BIN
BIN := $(GOPATH)/bin
endif
-GO_TAGS ?=
+GO_TAGS ?= osusergo
ifeq ($(CI),true)
GO_TAGS := codegen_generated $(GO_TAGS)
@@ -49,7 +49,7 @@ PROTO_COMPARE_TAG ?= v1.0.3$(if $(findstring ent,$(GO_TAGS)),+ent,)
# LAST_RELEASE is the git sha of the latest release corresponding to this branch. main should have the latest
# published release, and release branches should point to the latest published release in the X.Y release line.
-LAST_RELEASE ?= v1.3.2
+LAST_RELEASE ?= v1.3.3
default: help
@@ -143,9 +143,9 @@ deps: ## Install build and development dependencies
lint-deps: ## Install linter dependencies
## Keep versions in sync with tools/go.mod (see https://github.com/golang/go/issues/30515)
@echo "==> Updating linter dependencies..."
- go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.46.2
+ go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.48.0
go install github.com/client9/misspell/cmd/misspell@v0.3.4
- go install github.com/hashicorp/go-hclog/hclogvet@v0.1.4
+ go install github.com/hashicorp/go-hclog/hclogvet@v0.1.5
.PHONY: git-hooks
git-dir = $(shell git rev-parse --git-dir)
@@ -179,6 +179,9 @@ check: ## Lint the source code
@echo "==> Check API package is isolated from rest"
@cd ./api && if go list --test -f '{{ join .Deps "\n" }}' . | grep github.com/hashicorp/nomad/ | grep -v -e /nomad/api/ -e nomad/api.test; then echo " /api package depends the ^^ above internal nomad packages. Remove such dependency"; exit 1; fi
+ @echo "==> Check command package does not import structs"
+ @cd ./command && if go list -f '{{ join .Imports "\n" }}' . | grep github.com/hashicorp/nomad/nomad/structs; then echo " /command package imports the structs pkg. Remove such import"; exit 1; fi
+
@echo "==> Checking Go mod.."
@GO111MODULE=on $(MAKE) tidy
@if (git status --porcelain | grep -Eq "go\.(mod|sum)"); then \
@@ -210,12 +213,12 @@ generate-all: generate-structs proto generate-examples ## Generate structs, prot
.PHONY: generate-structs
generate-structs: LOCAL_PACKAGES = $(shell go list ./...)
generate-structs: ## Update generated code
- @echo "--> Running go generate..."
+ @echo "==> Running go generate..."
@go generate $(LOCAL_PACKAGES)
.PHONY: proto
proto: ## Generate protobuf bindings
- @echo "--> Generating proto bindings..."
+ @echo "==> Generating proto bindings..."
@buf --config tools/buf/buf.yaml --template tools/buf/buf.gen.yaml generate
.PHONY: generate-examples
@@ -232,7 +235,7 @@ changelog: ## Generate changelog from entries
## that do not successfully compile without rendering
.PHONY: hclfmt
hclfmt: ## Format HCL files with hclfmt
- @echo "--> Formatting HCL"
+ @echo "==> Formatting HCL"
@find . -name '.terraform' -prune \
-o -name 'upstart.nomad' -prune \
-o -name '.git' -prune \
@@ -245,10 +248,10 @@ hclfmt: ## Format HCL files with hclfmt
.PHONY: tidy
tidy: ## Tidy up the go mod files
- @echo "--> Tidy up submodules"
+ @echo "==> Tidy up submodules"
@cd tools && go mod tidy
@cd api && go mod tidy
- @echo "--> Tidy nomad module"
+ @echo "==> Tidy nomad module"
@go mod tidy
.PHONY: dev
@@ -357,24 +360,24 @@ testcluster: ## Bring up a Linux test cluster using Vagrant. Set PROVIDER if nec
.PHONY: static-assets
static-assets: ## Compile the static routes to serve alongside the API
- @echo "--> Generating static assets"
+ @echo "==> Generating static assets"
@go-bindata-assetfs -pkg agent -prefix ui -modtime 1480000000 -tags ui -o bindata_assetfs.go ./ui/dist/...
@mv bindata_assetfs.go command/agent
.PHONY: test-ui
test-ui: ## Run Nomad UI test suite
- @echo "--> Installing JavaScript assets"
+ @echo "==> Installing JavaScript assets"
@cd ui && npm rebuild node-sass
@cd ui && yarn install
- @echo "--> Running ember tests"
+ @echo "==> Running ember tests"
@cd ui && npm test
.PHONY: ember-dist
ember-dist: ## Build the static UI assets from source
- @echo "--> Installing JavaScript assets"
+ @echo "==> Installing JavaScript assets"
@cd ui && yarn install --silent --network-timeout 300000
@cd ui && npm rebuild node-sass
- @echo "--> Building Ember application"
+ @echo "==> Building Ember application"
@cd ui && npm run build
.PHONY: dev-ui
diff --git a/README.md b/README.md
index 13e3bc29034..c9dadcf1970 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,6 @@
-Nomad [![Build Status](https://circleci.com/gh/hashicorp/nomad.svg?style=svg)](https://circleci.com/gh/hashicorp/nomad) [![Discuss](https://img.shields.io/badge/discuss-nomad-00BC7F?style=flat)](https://discuss.hashicorp.com/c/nomad)
+Nomad
+[![License: MPL 2.0](https://img.shields.io/badge/License-MPL_2.0-brightgreen.svg)](LICENSE)
+[![Discuss](https://img.shields.io/badge/discuss-nomad-00BC7F?style=flat)](https://discuss.hashicorp.com/c/nomad)
===
@@ -14,8 +16,6 @@ Nomad is supported on Linux, Windows, and macOS. A commercial version of Nomad,
* Website: https://nomadproject.io
* Tutorials: [HashiCorp Learn](https://learn.hashicorp.com/nomad)
* Forum: [Discuss](https://discuss.hashicorp.com/c/nomad)
-* Mailing List: [Google Groups](https://groups.google.com/group/nomad-tool)
-* Gitter: [hashicorp-nomad](https://gitter.im/hashicorp-nomad/Lobby)
Nomad provides several key features:
diff --git a/acl/acl_test.go b/acl/acl_test.go
index 57c3cfa2b51..51c1a618972 100644
--- a/acl/acl_test.go
+++ b/acl/acl_test.go
@@ -586,6 +586,31 @@ func TestSecureVariablesMatching(t *testing.T) {
op: "read",
allow: false,
},
+ {
+ name: "wildcard with more specific denied path",
+ policy: `namespace "ns" {
+ secure_variables {
+ path "*" { capabilities = ["list"] }
+ path "system/*" { capabilities = ["deny"] }}}`,
+ ns: "ns",
+ path: "system/not-allowed",
+ op: "list",
+ allow: false,
+ },
+ {
+ name: "multiple namespace with overlapping paths",
+ policy: `namespace "ns" {
+ secure_variables {
+ path "*" { capabilities = ["list"] }
+ path "system/*" { capabilities = ["deny"] }}}
+ namespace "prod" {
+ secure_variables {
+ path "*" { capabilities = ["list"]}}}`,
+ ns: "prod",
+ path: "system/is-allowed",
+ op: "list",
+ allow: true,
+ },
}
for _, tc := range tests {
diff --git a/acl/policy.go b/acl/policy.go
index d74df4437d6..7059f8b1782 100644
--- a/acl/policy.go
+++ b/acl/policy.go
@@ -75,6 +75,7 @@ const (
SecureVariablesCapabilityRead = "read"
SecureVariablesCapabilityWrite = "write"
SecureVariablesCapabilityDestroy = "destroy"
+ SecureVariablesCapabilityDeny = "deny"
)
// Policy represents a parsed HCL or JSON policy.
@@ -187,7 +188,7 @@ func isNamespaceCapabilityValid(cap string) bool {
func isPathCapabilityValid(cap string) bool {
switch cap {
case SecureVariablesCapabilityWrite, SecureVariablesCapabilityRead,
- SecureVariablesCapabilityList, SecureVariablesCapabilityDestroy:
+ SecureVariablesCapabilityList, SecureVariablesCapabilityDestroy, SecureVariablesCapabilityDeny:
return true
default:
return false
@@ -269,6 +270,8 @@ func expandSecureVariablesCapabilities(caps []string) []string {
var foundRead, foundList bool
for _, cap := range caps {
switch cap {
+ case SecureVariablesCapabilityDeny:
+ return []string{SecureVariablesCapabilityDeny}
case SecureVariablesCapabilityRead:
foundRead = true
case SecureVariablesCapabilityList:
@@ -325,14 +328,17 @@ func Parse(rules string) (*Policy, error) {
}
if ns.SecureVariables != nil {
+ if len(ns.SecureVariables.Paths) == 0 {
+ return nil, fmt.Errorf("Invalid secure variable policy: no secure variable paths in namespace %s", ns.Name)
+ }
for _, pathPolicy := range ns.SecureVariables.Paths {
if pathPolicy.PathSpec == "" {
- return nil, fmt.Errorf("Invalid missing secure variable path in namespace %#v", ns)
+ return nil, fmt.Errorf("Invalid missing secure variable path in namespace %s", ns.Name)
}
for _, cap := range pathPolicy.Capabilities {
if !isPathCapabilityValid(cap) {
return nil, fmt.Errorf(
- "Invalid secure variable capability '%s' in namespace %#v", cap, ns)
+ "Invalid secure variable capability '%s' in namespace %s", cap, ns.Name)
}
}
pathPolicy.Capabilities = expandSecureVariablesCapabilities(pathPolicy.Capabilities)
diff --git a/acl/policy_test.go b/acl/policy_test.go
index 4ad25fbf943..bd8f6eba6fa 100644
--- a/acl/policy_test.go
+++ b/acl/policy_test.go
@@ -198,6 +198,17 @@ func TestParse(t *testing.T) {
"Invalid namespace policy",
nil,
},
+ {
+ `
+ namespace "dev" {
+ secure_variables "*" {
+ capabilities = ["read", "write"]
+ }
+ }
+ `,
+ "Invalid secure variable policy: no secure variable paths in namespace dev",
+ nil,
+ },
{
`
namespace "default" {
diff --git a/api/acl.go b/api/acl.go
index 0562a87d940..f3a3afc2017 100644
--- a/api/acl.go
+++ b/api/acl.go
@@ -2,7 +2,6 @@ package api
import (
"errors"
- "fmt"
"time"
)
@@ -29,7 +28,7 @@ func (a *ACLPolicies) List(q *QueryOptions) ([]*ACLPolicyListStub, *QueryMeta, e
// Upsert is used to create or update a policy
func (a *ACLPolicies) Upsert(policy *ACLPolicy, q *WriteOptions) (*WriteMeta, error) {
if policy == nil || policy.Name == "" {
- return nil, fmt.Errorf("missing policy name")
+ return nil, errors.New("missing policy name")
}
wm, err := a.client.write("/v1/acl/policy/"+policy.Name, policy, nil, q)
if err != nil {
@@ -41,7 +40,7 @@ func (a *ACLPolicies) Upsert(policy *ACLPolicy, q *WriteOptions) (*WriteMeta, er
// Delete is used to delete a policy
func (a *ACLPolicies) Delete(policyName string, q *WriteOptions) (*WriteMeta, error) {
if policyName == "" {
- return nil, fmt.Errorf("missing policy name")
+ return nil, errors.New("missing policy name")
}
wm, err := a.client.delete("/v1/acl/policy/"+policyName, nil, nil, q)
if err != nil {
@@ -53,7 +52,7 @@ func (a *ACLPolicies) Delete(policyName string, q *WriteOptions) (*WriteMeta, er
// Info is used to query a specific policy
func (a *ACLPolicies) Info(policyName string, q *QueryOptions) (*ACLPolicy, *QueryMeta, error) {
if policyName == "" {
- return nil, nil, fmt.Errorf("missing policy name")
+ return nil, nil, errors.New("missing policy name")
}
var resp ACLPolicy
wm, err := a.client.query("/v1/acl/policy/"+policyName, &resp, q)
@@ -114,7 +113,7 @@ func (a *ACLTokens) List(q *QueryOptions) ([]*ACLTokenListStub, *QueryMeta, erro
// Create is used to create a token
func (a *ACLTokens) Create(token *ACLToken, q *WriteOptions) (*ACLToken, *WriteMeta, error) {
if token.AccessorID != "" {
- return nil, nil, fmt.Errorf("cannot specify Accessor ID")
+ return nil, nil, errors.New("cannot specify Accessor ID")
}
var resp ACLToken
wm, err := a.client.write("/v1/acl/token", token, &resp, q)
@@ -127,7 +126,7 @@ func (a *ACLTokens) Create(token *ACLToken, q *WriteOptions) (*ACLToken, *WriteM
// Update is used to update an existing token
func (a *ACLTokens) Update(token *ACLToken, q *WriteOptions) (*ACLToken, *WriteMeta, error) {
if token.AccessorID == "" {
- return nil, nil, fmt.Errorf("missing accessor ID")
+ return nil, nil, errors.New("missing accessor ID")
}
var resp ACLToken
wm, err := a.client.write("/v1/acl/token/"+token.AccessorID,
@@ -141,7 +140,7 @@ func (a *ACLTokens) Update(token *ACLToken, q *WriteOptions) (*ACLToken, *WriteM
// Delete is used to delete a token
func (a *ACLTokens) Delete(accessorID string, q *WriteOptions) (*WriteMeta, error) {
if accessorID == "" {
- return nil, fmt.Errorf("missing accessor ID")
+ return nil, errors.New("missing accessor ID")
}
wm, err := a.client.delete("/v1/acl/token/"+accessorID, nil, nil, q)
if err != nil {
@@ -153,7 +152,7 @@ func (a *ACLTokens) Delete(accessorID string, q *WriteOptions) (*WriteMeta, erro
// Info is used to query a token
func (a *ACLTokens) Info(accessorID string, q *QueryOptions) (*ACLToken, *QueryMeta, error) {
if accessorID == "" {
- return nil, nil, fmt.Errorf("missing accessor ID")
+ return nil, nil, errors.New("missing accessor ID")
}
var resp ACLToken
wm, err := a.client.query("/v1/acl/token/"+accessorID, &resp, q)
@@ -181,7 +180,7 @@ func (a *ACLTokens) UpsertOneTimeToken(q *WriteOptions) (*OneTimeToken, *WriteMe
return nil, nil, err
}
if resp == nil {
- return nil, nil, fmt.Errorf("no one-time token returned")
+ return nil, nil, errors.New("no one-time token returned")
}
return resp.OneTimeToken, wm, nil
}
@@ -189,7 +188,7 @@ func (a *ACLTokens) UpsertOneTimeToken(q *WriteOptions) (*OneTimeToken, *WriteMe
// ExchangeOneTimeToken is used to create a one-time token
func (a *ACLTokens) ExchangeOneTimeToken(secret string, q *WriteOptions) (*ACLToken, *WriteMeta, error) {
if secret == "" {
- return nil, nil, fmt.Errorf("missing secret ID")
+ return nil, nil, errors.New("missing secret ID")
}
req := &OneTimeTokenExchangeRequest{OneTimeSecretID: secret}
var resp *OneTimeTokenExchangeResponse
@@ -198,7 +197,7 @@ func (a *ACLTokens) ExchangeOneTimeToken(secret string, q *WriteOptions) (*ACLTo
return nil, nil, err
}
if resp == nil {
- return nil, nil, fmt.Errorf("no ACL token returned")
+ return nil, nil, errors.New("no ACL token returned")
}
return resp.Token, wm, nil
}
@@ -306,10 +305,20 @@ type ACLPolicy struct {
Name string
Description string
Rules string
+ JobACL *JobACL
+
CreateIndex uint64
ModifyIndex uint64
}
+// JobACL represents an ACL policy's attachment to a job, group, or task.
+type JobACL struct {
+ Namespace string
+ JobID string
+ Group string
+ Task string
+}
+
// ACLToken represents a client token which is used to Authenticate
type ACLToken struct {
AccessorID string
diff --git a/api/allocations.go b/api/allocations.go
index 67fc6ca2989..dc2ebb27900 100644
--- a/api/allocations.go
+++ b/api/allocations.go
@@ -2,16 +2,17 @@ package api
import (
"context"
- "fmt"
+ "errors"
"io"
"sort"
+ "strings"
"time"
)
var (
// NodeDownErr marks an operation as not able to complete since the node is
// down.
- NodeDownErr = fmt.Errorf("node down")
+ NodeDownErr = errors.New("node down")
)
const (
@@ -28,6 +29,10 @@ const (
AllocClientStatusLost = "lost"
)
+const (
+ AllocRestartReasonWithinPolicy = "Restart within policy"
+)
+
// Allocations is used to query the alloc-related endpoints.
type Allocations struct {
client *Client
@@ -67,15 +72,19 @@ func (a *Allocations) Info(allocID string, q *QueryOptions) (*Allocation, *Query
// the task environment.
//
// The parameters are:
-// * ctx: context to set deadlines or timeout
-// * allocation: the allocation to execute command inside
-// * task: the task's name to execute command in
-// * tty: indicates whether to start a pseudo-tty for the command
-// * stdin, stdout, stderr: the std io to pass to command.
-// If tty is true, then streams need to point to a tty that's alive for the whole process
-// * terminalSizeCh: A channel to send new tty terminal sizes
+// - ctx: context to set deadlines or timeout
+// - allocation: the allocation to execute command inside
+// - task: the task's name to execute command in
+// - tty: indicates whether to start a pseudo-tty for the command
+// - stdin, stdout, stderr: the std io to pass to command.
+// If tty is true, then streams need to point to a tty that's alive for the whole process
+// - terminalSizeCh: A channel to send new tty terminal sizes
//
// The call blocks until command terminates (or an error occurs), and returns the exit code.
+//
+// Note: for cluster topologies where API consumers don't have network access to
+// Nomad clients, set api.ClientConnTimeout to a small value (ex 1ms) to avoid
+// long pauses on this API call.
func (a *Allocations) Exec(ctx context.Context,
alloc *Allocation, task string, tty bool, command []string,
stdin io.Reader, stdout, stderr io.Writer,
@@ -99,19 +108,46 @@ func (a *Allocations) Exec(ctx context.Context,
return s.run(ctx)
}
+// Stats gets allocation resource usage statistics about an allocation.
+//
+// Note: for cluster topologies where API consumers don't have network access to
+// Nomad clients, set api.ClientConnTimeout to a small value (ex 1ms) to avoid
+// long pauses on this API call.
func (a *Allocations) Stats(alloc *Allocation, q *QueryOptions) (*AllocResourceUsage, error) {
var resp AllocResourceUsage
- path := fmt.Sprintf("/v1/client/allocation/%s/stats", alloc.ID)
- _, err := a.client.query(path, &resp, q)
+ _, err := a.client.query("/v1/client/allocation/"+alloc.ID+"/stats", &resp, q)
return &resp, err
}
+// Checks gets status information for nomad service checks that exist in the allocation.
+//
+// Note: for cluster topologies where API consumers don't have network access to
+// Nomad clients, set api.ClientConnTimeout to a small value (ex 1ms) to avoid
+// long pauses on this API call.
+func (a *Allocations) Checks(allocID string, q *QueryOptions) (AllocCheckStatuses, error) {
+ var resp AllocCheckStatuses
+ _, err := a.client.query("/v1/client/allocation/"+allocID+"/checks", &resp, q)
+ return resp, err
+}
+
+// GC forces a garbage collection of client state for an allocation.
+//
+// Note: for cluster topologies where API consumers don't have network access to
+// Nomad clients, set api.ClientConnTimeout to a small value (ex 1ms) to avoid
+// long pauses on this API call.
func (a *Allocations) GC(alloc *Allocation, q *QueryOptions) error {
var resp struct{}
_, err := a.client.query("/v1/client/allocation/"+alloc.ID+"/gc", &resp, nil)
return err
}
+// Restart restarts the tasks that are currently running or a specific task if
+// taskName is provided. An error is returned if the task to be restarted is
+// not running.
+//
+// Note: for cluster topologies where API consumers don't have network access to
+// Nomad clients, set api.ClientConnTimeout to a small value (ex 1ms) to avoid
+// long pauses on this API call.
func (a *Allocations) Restart(alloc *Allocation, taskName string, q *QueryOptions) error {
req := AllocationRestartRequest{
TaskName: taskName,
@@ -122,6 +158,27 @@ func (a *Allocations) Restart(alloc *Allocation, taskName string, q *QueryOption
return err
}
+// RestartAllTasks restarts all tasks in the allocation, regardless of
+// lifecycle type or state. Tasks will restart following their lifecycle order.
+//
+// Note: for cluster topologies where API consumers don't have network access to
+// Nomad clients, set api.ClientConnTimeout to a small value (ex 1ms) to avoid
+// long pauses on this API call.
+func (a *Allocations) RestartAllTasks(alloc *Allocation, q *QueryOptions) error {
+ req := AllocationRestartRequest{
+ AllTasks: true,
+ }
+
+ var resp struct{}
+ _, err := a.client.putQuery("/v1/client/allocation/"+alloc.ID+"/restart", &req, &resp, q)
+ return err
+}
+
+// Stop stops an allocation.
+//
+// Note: for cluster topologies where API consumers don't have network access to
+// Nomad clients, set api.ClientConnTimeout to a small value (ex 1ms) to avoid
+// long pauses on this API call.
func (a *Allocations) Stop(alloc *Allocation, q *QueryOptions) (*AllocStopResponse, error) {
var resp AllocStopResponse
_, err := a.client.putQuery("/v1/allocation/"+alloc.ID+"/stop", nil, &resp, q)
@@ -136,6 +193,11 @@ type AllocStopResponse struct {
WriteMeta
}
+// Signal sends a signal to the allocation.
+//
+// Note: for cluster topologies where API consumers don't have network access to
+// Nomad clients, set api.ClientConnTimeout to a small value (ex 1ms) to avoid
+// long pauses on this API call.
func (a *Allocations) Signal(alloc *Allocation, q *QueryOptions, task, signal string) error {
req := AllocSignalRequest{
Signal: signal,
@@ -403,6 +465,7 @@ func (a Allocation) RescheduleInfo(t time.Time) (int, int) {
type AllocationRestartRequest struct {
TaskName string
+ AllTasks bool
}
type AllocSignalRequest struct {
@@ -473,12 +536,12 @@ type ExecStreamingInput struct {
TTYSize *TerminalSize `json:"tty_size,omitempty"`
}
-// ExecStreamingExitResults captures the exit code of just completed nomad exec command
+// ExecStreamingExitResult captures the exit code of just completed nomad exec command
type ExecStreamingExitResult struct {
ExitCode int `json:"exit_code"`
}
-// ExecStreamingInput represents an output streaming entity, e.g. stdout/stderr update or termination
+// ExecStreamingOutput represents an output streaming entity, e.g. stdout/stderr update or termination
//
// At most one of these fields should be set: `Stdout`, `Stderr`, or `Result`.
// If `Exited` is true, then `Result` is non-nil, and other fields are nil.
@@ -489,3 +552,12 @@ type ExecStreamingOutput struct {
Exited bool `json:"exited,omitempty"`
Result *ExecStreamingExitResult `json:"result,omitempty"`
}
+
+func AllocSuffix(name string) string {
+ idx := strings.LastIndex(name, "[")
+ if idx == -1 {
+ return ""
+ }
+ suffix := name[idx:]
+ return suffix
+}
diff --git a/api/allocations_test.go b/api/allocations_test.go
index 4f2993e82f2..3af6c54b246 100644
--- a/api/allocations_test.go
+++ b/api/allocations_test.go
@@ -159,13 +159,13 @@ func TestAllocations_RescheduleInfo(t *testing.T) {
testutil.Parallel(t)
// Create a job, task group and alloc
job := &Job{
- Name: stringToPtr("foo"),
- Namespace: stringToPtr(DefaultNamespace),
- ID: stringToPtr("bar"),
- ParentID: stringToPtr("lol"),
+ Name: pointerOf("foo"),
+ Namespace: pointerOf(DefaultNamespace),
+ ID: pointerOf("bar"),
+ ParentID: pointerOf("lol"),
TaskGroups: []*TaskGroup{
{
- Name: stringToPtr("bar"),
+ Name: pointerOf("bar"),
Tasks: []*Task{
{
Name: "task1",
@@ -205,8 +205,8 @@ func TestAllocations_RescheduleInfo(t *testing.T) {
{
desc: "no reschedule events",
reschedulePolicy: &ReschedulePolicy{
- Attempts: intToPtr(3),
- Interval: timeToPtr(15 * time.Minute),
+ Attempts: pointerOf(3),
+ Interval: pointerOf(15 * time.Minute),
},
expAttempted: 0,
expTotal: 3,
@@ -214,8 +214,8 @@ func TestAllocations_RescheduleInfo(t *testing.T) {
{
desc: "all reschedule events within interval",
reschedulePolicy: &ReschedulePolicy{
- Attempts: intToPtr(3),
- Interval: timeToPtr(15 * time.Minute),
+ Attempts: pointerOf(3),
+ Interval: pointerOf(15 * time.Minute),
},
time: time.Now(),
rescheduleTracker: &RescheduleTracker{
@@ -231,8 +231,8 @@ func TestAllocations_RescheduleInfo(t *testing.T) {
{
desc: "some reschedule events outside interval",
reschedulePolicy: &ReschedulePolicy{
- Attempts: intToPtr(3),
- Interval: timeToPtr(15 * time.Minute),
+ Attempts: pointerOf(3),
+ Interval: pointerOf(15 * time.Minute),
},
time: time.Now(),
rescheduleTracker: &RescheduleTracker{
@@ -276,13 +276,13 @@ func TestAllocations_ExecErrors(t *testing.T) {
a := c.Allocations()
job := &Job{
- Name: stringToPtr("foo"),
- Namespace: stringToPtr(DefaultNamespace),
- ID: stringToPtr("bar"),
- ParentID: stringToPtr("lol"),
+ Name: pointerOf("foo"),
+ Namespace: pointerOf(DefaultNamespace),
+ ID: pointerOf("bar"),
+ ParentID: pointerOf("lol"),
TaskGroups: []*TaskGroup{
{
- Name: stringToPtr("bar"),
+ Name: pointerOf("bar"),
Tasks: []*Task{
{
Name: "task1",
@@ -392,9 +392,9 @@ func TestAllocation_ClientTerminalStatus(t *testing.T) {
func TestAllocations_ShouldMigrate(t *testing.T) {
testutil.Parallel(t)
- require.True(t, DesiredTransition{Migrate: boolToPtr(true)}.ShouldMigrate())
+ require.True(t, DesiredTransition{Migrate: pointerOf(true)}.ShouldMigrate())
require.False(t, DesiredTransition{}.ShouldMigrate())
- require.False(t, DesiredTransition{Migrate: boolToPtr(false)}.ShouldMigrate())
+ require.False(t, DesiredTransition{Migrate: pointerOf(false)}.ShouldMigrate())
}
func TestAllocations_Services(t *testing.T) {
diff --git a/api/api.go b/api/api.go
index 8d3fc46d87b..9a16a8333d6 100644
--- a/api/api.go
+++ b/api/api.go
@@ -25,7 +25,9 @@ import (
var (
// ClientConnTimeout is the timeout applied when attempting to contact a
// client directly before switching to a connection through the Nomad
- // server.
+ // server. For cluster topologies where API consumers don't have network
+ // access to Nomad clients, set this to a small value (ex 1ms) to avoid
+ // pausing on client APIs such as AllocFS.
ClientConnTimeout = 1 * time.Second
)
@@ -33,6 +35,11 @@ const (
// AllNamespacesNamespace is a sentinel Namespace value to indicate that api should search for
// jobs and allocations in all the namespaces the requester can access.
AllNamespacesNamespace = "*"
+
+ // PermissionDeniedErrorContent is the string content of an error returned
+ // by the API which indicates the caller does not have permission to
+ // perform the action.
+ PermissionDeniedErrorContent = "Permission denied"
)
// QueryOptions are used to parametrize a query
@@ -340,9 +347,9 @@ func DefaultConfig() *Config {
// otherwise, returns the same client
func cloneWithTimeout(httpClient *http.Client, t time.Duration) (*http.Client, error) {
if httpClient == nil {
- return nil, fmt.Errorf("nil HTTP client")
+ return nil, errors.New("nil HTTP client")
} else if httpClient.Transport == nil {
- return nil, fmt.Errorf("nil HTTP client transport")
+ return nil, errors.New("nil HTTP client transport")
}
if t.Nanoseconds() < 0 {
@@ -393,7 +400,7 @@ func ConfigureTLS(httpClient *http.Client, tlsConfig *TLSConfig) error {
return nil
}
if httpClient == nil {
- return fmt.Errorf("config HTTP Client must be set")
+ return errors.New("config HTTP Client must be set")
}
var clientCert tls.Certificate
@@ -407,7 +414,7 @@ func ConfigureTLS(httpClient *http.Client, tlsConfig *TLSConfig) error {
}
foundClientCert = true
} else {
- return fmt.Errorf("Both client cert and client key must be provided")
+ return errors.New("Both client cert and client key must be provided")
}
} else if len(tlsConfig.ClientCertPEM) != 0 || len(tlsConfig.ClientKeyPEM) != 0 {
if len(tlsConfig.ClientCertPEM) != 0 && len(tlsConfig.ClientKeyPEM) != 0 {
@@ -418,7 +425,7 @@ func ConfigureTLS(httpClient *http.Client, tlsConfig *TLSConfig) error {
}
foundClientCert = true
} else {
- return fmt.Errorf("Both client cert and client key must be provided")
+ return errors.New("Both client cert and client key must be provided")
}
}
@@ -844,7 +851,7 @@ func (c *Client) websocket(endpoint string, q *QueryOptions) (*websocket.Conn, *
transport, ok := c.httpClient.Transport.(*http.Transport)
if !ok {
- return nil, nil, fmt.Errorf("unsupported transport")
+ return nil, nil, errors.New("unsupported transport")
}
dialer := websocket.Dialer{
ReadBufferSize: 4096,
@@ -1091,9 +1098,10 @@ func requireOK(d time.Duration, resp *http.Response, e error) (time.Duration, *h
}
if resp.StatusCode != 200 {
var buf bytes.Buffer
- io.Copy(&buf, resp.Body)
- resp.Body.Close()
- return d, nil, fmt.Errorf("Unexpected response code: %d (%s)", resp.StatusCode, buf.Bytes())
+ _, _ = io.Copy(&buf, resp.Body)
+ _ = resp.Body.Close()
+ body := strings.TrimSpace(buf.String())
+ return d, nil, fmt.Errorf("Unexpected response code: %d (%s)", resp.StatusCode, body)
}
return d, resp, nil
}
diff --git a/api/api_test.go b/api/api_test.go
index ce845c10fbe..8987f534d5a 100644
--- a/api/api_test.go
+++ b/api/api_test.go
@@ -501,7 +501,7 @@ func TestCloneHttpClient(t *testing.T) {
client := defaultHttpClient()
originalTransport := client.Transport.(*http.Transport)
originalTransport.Proxy = func(*http.Request) (*url.URL, error) {
- return nil, fmt.Errorf("stub function")
+ return nil, errors.New("stub function")
}
t.Run("closing with negative timeout", func(t *testing.T) {
diff --git a/api/compose_test.go b/api/compose_test.go
index c70b244cdc5..2fe750a6da1 100644
--- a/api/compose_test.go
+++ b/api/compose_test.go
@@ -15,13 +15,13 @@ func TestCompose(t *testing.T) {
SetMeta("foo", "bar").
Constrain(NewConstraint("kernel.name", "=", "linux")).
Require(&Resources{
- CPU: intToPtr(1250),
- MemoryMB: intToPtr(1024),
- DiskMB: intToPtr(2048),
+ CPU: pointerOf(1250),
+ MemoryMB: pointerOf(1024),
+ DiskMB: pointerOf(2048),
Networks: []*NetworkResource{
{
CIDR: "0.0.0.0/0",
- MBits: intToPtr(100),
+ MBits: pointerOf(100),
ReservedPorts: []Port{{"", 80, 0, ""}, {"", 443, 0, ""}},
},
},
@@ -47,11 +47,11 @@ func TestCompose(t *testing.T) {
// Check that the composed result looks correct
expect := &Job{
- Region: stringToPtr("global"),
- ID: stringToPtr("job1"),
- Name: stringToPtr("myjob"),
- Type: stringToPtr(JobTypeService),
- Priority: intToPtr(2),
+ Region: pointerOf("global"),
+ ID: pointerOf("job1"),
+ Name: pointerOf("myjob"),
+ Type: pointerOf(JobTypeService),
+ Priority: pointerOf(2),
Datacenters: []string{
"dc1",
},
@@ -67,8 +67,8 @@ func TestCompose(t *testing.T) {
},
TaskGroups: []*TaskGroup{
{
- Name: stringToPtr("grp1"),
- Count: intToPtr(2),
+ Name: pointerOf("grp1"),
+ Count: pointerOf(2),
Constraints: []*Constraint{
{
LTarget: "kernel.name",
@@ -81,13 +81,13 @@ func TestCompose(t *testing.T) {
LTarget: "${node.class}",
RTarget: "large",
Operand: "=",
- Weight: int8ToPtr(50),
+ Weight: pointerOf(int8(50)),
},
},
Spreads: []*Spread{
{
Attribute: "${node.datacenter}",
- Weight: int8ToPtr(30),
+ Weight: pointerOf(int8(30)),
SpreadTarget: []*SpreadTarget{
{
Value: "dc1",
@@ -105,13 +105,13 @@ func TestCompose(t *testing.T) {
Name: "task1",
Driver: "exec",
Resources: &Resources{
- CPU: intToPtr(1250),
- MemoryMB: intToPtr(1024),
- DiskMB: intToPtr(2048),
+ CPU: pointerOf(1250),
+ MemoryMB: pointerOf(1024),
+ DiskMB: pointerOf(2048),
Networks: []*NetworkResource{
{
CIDR: "0.0.0.0/0",
- MBits: intToPtr(100),
+ MBits: pointerOf(100),
ReservedPorts: []Port{
{"", 80, 0, ""},
{"", 443, 0, ""},
diff --git a/api/consul.go b/api/consul.go
index db25a16640e..9a76bfb3294 100644
--- a/api/consul.go
+++ b/api/consul.go
@@ -1,6 +1,8 @@
package api
-import "time"
+import (
+ "time"
+)
// Consul represents configuration related to consul.
type Consul struct {
@@ -121,11 +123,11 @@ func (st *SidecarTask) Canonicalize() {
}
if st.KillTimeout == nil {
- st.KillTimeout = timeToPtr(5 * time.Second)
+ st.KillTimeout = pointerOf(5 * time.Second)
}
if st.ShutdownDelay == nil {
- st.ShutdownDelay = timeToPtr(0)
+ st.ShutdownDelay = pointerOf(time.Duration(0))
}
}
@@ -313,7 +315,7 @@ func (p *ConsulGatewayProxy) Canonicalize() {
if p.ConnectTimeout == nil {
// same as the default from consul
- p.ConnectTimeout = timeToPtr(defaultGatewayConnectTimeout)
+ p.ConnectTimeout = pointerOf(defaultGatewayConnectTimeout)
}
if len(p.EnvoyGatewayBindAddresses) == 0 {
@@ -347,7 +349,7 @@ func (p *ConsulGatewayProxy) Copy() *ConsulGatewayProxy {
}
return &ConsulGatewayProxy{
- ConnectTimeout: timeToPtr(*p.ConnectTimeout),
+ ConnectTimeout: pointerOf(*p.ConnectTimeout),
EnvoyGatewayBindTaggedAddresses: p.EnvoyGatewayBindTaggedAddresses,
EnvoyGatewayBindAddresses: binds,
EnvoyGatewayNoDefaultBind: p.EnvoyGatewayNoDefaultBind,
diff --git a/api/consul_test.go b/api/consul_test.go
index 2556ab662ce..ce27572957f 100644
--- a/api/consul_test.go
+++ b/api/consul_test.go
@@ -39,7 +39,7 @@ func TestConsul_MergeNamespace(t *testing.T) {
testutil.Parallel(t)
t.Run("already set", func(t *testing.T) {
a := &Consul{Namespace: "foo"}
- ns := stringToPtr("bar")
+ ns := pointerOf("bar")
a.MergeNamespace(ns)
require.Equal(t, "foo", a.Namespace)
require.Equal(t, "bar", *ns)
@@ -47,7 +47,7 @@ func TestConsul_MergeNamespace(t *testing.T) {
t.Run("inherit", func(t *testing.T) {
a := &Consul{Namespace: ""}
- ns := stringToPtr("bar")
+ ns := pointerOf("bar")
a.MergeNamespace(ns)
require.Equal(t, "bar", a.Namespace)
require.Equal(t, "bar", *ns)
@@ -228,9 +228,9 @@ func TestSidecarTask_Canonicalize(t *testing.T) {
t.Run("non empty sidecar_task resources", func(t *testing.T) {
exp := DefaultResources()
- exp.MemoryMB = intToPtr(333)
+ exp.MemoryMB = pointerOf(333)
st := &SidecarTask{
- Resources: &Resources{MemoryMB: intToPtr(333)},
+ Resources: &Resources{MemoryMB: pointerOf(333)},
}
st.Canonicalize()
require.Equal(t, exp, st.Resources)
@@ -263,7 +263,7 @@ func TestConsulGateway_Canonicalize(t *testing.T) {
},
}
cg.Canonicalize()
- require.Equal(t, timeToPtr(5*time.Second), cg.Proxy.ConnectTimeout)
+ require.Equal(t, pointerOf(5*time.Second), cg.Proxy.ConnectTimeout)
require.True(t, cg.Proxy.EnvoyGatewayBindTaggedAddresses)
require.Nil(t, cg.Proxy.EnvoyGatewayBindAddresses)
require.True(t, cg.Proxy.EnvoyGatewayNoDefaultBind)
@@ -283,7 +283,7 @@ func TestConsulGateway_Copy(t *testing.T) {
gateway := &ConsulGateway{
Proxy: &ConsulGatewayProxy{
- ConnectTimeout: timeToPtr(3 * time.Second),
+ ConnectTimeout: pointerOf(3 * time.Second),
EnvoyGatewayBindTaggedAddresses: true,
EnvoyGatewayBindAddresses: map[string]*ConsulGatewayBindAddress{
"listener1": {Address: "10.0.0.1", Port: 2000},
diff --git a/api/csi.go b/api/csi.go
index 5eb5d1b71b3..c9d355d625e 100644
--- a/api/csi.go
+++ b/api/csi.go
@@ -229,6 +229,11 @@ const (
CSIVolumeAccessModeMultiNodeMultiWriter CSIVolumeAccessMode = "multi-node-multi-writer"
)
+const (
+ CSIVolumeTypeHost = "host"
+ CSIVolumeTypeCSI = "csi"
+)
+
// CSIMountOptions contain optional additional configuration that can be used
// when specifying that a Volume should be used with VolumeAccessTypeMount.
type CSIMountOptions struct {
@@ -244,6 +249,18 @@ type CSIMountOptions struct {
ExtraKeysHCL []string `hcl1:",unusedKeys" json:"-"` // report unexpected keys
}
+func (o *CSIMountOptions) Merge(p *CSIMountOptions) {
+ if p == nil {
+ return
+ }
+ if p.FSType != "" {
+ o.FSType = p.FSType
+ }
+ if p.MountFlags != nil {
+ o.MountFlags = p.MountFlags
+ }
+}
+
// CSISecrets contain optional additional credentials that may be needed by
// the storage provider. These values will be redacted when reported in the
// API or in Nomad's logs.
diff --git a/api/deployments.go b/api/deployments.go
index 4a4844246fa..1c8011a6fbb 100644
--- a/api/deployments.go
+++ b/api/deployments.go
@@ -136,6 +136,17 @@ func (d *Deployments) SetAllocHealth(deploymentID string, healthy, unhealthy []s
return &resp, wm, nil
}
+const (
+ DeploymentStatusRunning = "running"
+ DeploymentStatusPaused = "paused"
+ DeploymentStatusFailed = "failed"
+ DeploymentStatusSuccessful = "successful"
+ DeploymentStatusCancelled = "cancelled"
+ DeploymentStatusPending = "pending"
+ DeploymentStatusBlocked = "blocked"
+ DeploymentStatusUnblocking = "unblocking"
+)
+
// Deployment is used to serialize an deployment.
type Deployment struct {
// ID is a generated UUID for the deployment
diff --git a/api/evaluations.go b/api/evaluations.go
index 1acf70db7d9..bcb0eb2b960 100644
--- a/api/evaluations.go
+++ b/api/evaluations.go
@@ -64,6 +64,14 @@ func (e *Evaluations) Allocations(evalID string, q *QueryOptions) ([]*Allocation
return resp, qm, nil
}
+const (
+ EvalStatusBlocked = "blocked"
+ EvalStatusPending = "pending"
+ EvalStatusComplete = "complete"
+ EvalStatusFailed = "failed"
+ EvalStatusCancelled = "canceled"
+)
+
// Evaluation is used to serialize an evaluation.
type Evaluation struct {
ID string
diff --git a/api/event_stream_test.go b/api/event_stream_test.go
index d0f55f91f47..72c742cac3b 100644
--- a/api/event_stream_test.go
+++ b/api/event_stream_test.go
@@ -240,8 +240,8 @@ func TestEventStream_PayloadValueHelpers(t *testing.T) {
j, err := event.Job()
require.NoError(t, err)
require.Equal(t, &Job{
- ID: stringToPtr("some-id"),
- Namespace: stringToPtr("some-namespace-id"),
+ ID: pointerOf("some-id"),
+ Namespace: pointerOf("some-namespace-id"),
}, j)
},
},
diff --git a/api/fs.go b/api/fs.go
index e0a8383e9fb..8b63a388c9d 100644
--- a/api/fs.go
+++ b/api/fs.go
@@ -51,7 +51,10 @@ func (c *Client) AllocFS() *AllocFS {
return &AllocFS{client: c}
}
-// List is used to list the files at a given path of an allocation directory
+// List is used to list the files at a given path of an allocation directory.
+// Note: for cluster topologies where API consumers don't have network access to
+// Nomad clients, set api.ClientConnTimeout to a small value (ex 1ms) to avoid
+// long pauses on this API call.
func (a *AllocFS) List(alloc *Allocation, path string, q *QueryOptions) ([]*AllocFileInfo, *QueryMeta, error) {
if q == nil {
q = &QueryOptions{}
@@ -70,7 +73,10 @@ func (a *AllocFS) List(alloc *Allocation, path string, q *QueryOptions) ([]*Allo
return resp, qm, nil
}
-// Stat is used to stat a file at a given path of an allocation directory
+// Stat is used to stat a file at a given path of an allocation directory.
+// Note: for cluster topologies where API consumers don't have network access to
+// Nomad clients, set api.ClientConnTimeout to a small value (ex 1ms) to avoid
+// long pauses on this API call.
func (a *AllocFS) Stat(alloc *Allocation, path string, q *QueryOptions) (*AllocFileInfo, *QueryMeta, error) {
if q == nil {
q = &QueryOptions{}
@@ -91,6 +97,9 @@ func (a *AllocFS) Stat(alloc *Allocation, path string, q *QueryOptions) (*AllocF
// ReadAt is used to read bytes at a given offset until limit at the given path
// in an allocation directory. If limit is <= 0, there is no limit.
+// Note: for cluster topologies where API consumers don't have network access to
+// Nomad clients, set api.ClientConnTimeout to a small value (ex 1ms) to avoid
+// long pauses on this API call.
func (a *AllocFS) ReadAt(alloc *Allocation, path string, offset int64, limit int64, q *QueryOptions) (io.ReadCloser, error) {
reqPath := fmt.Sprintf("/v1/client/fs/readat/%s", alloc.ID)
@@ -103,7 +112,10 @@ func (a *AllocFS) ReadAt(alloc *Allocation, path string, offset int64, limit int
}
// Cat is used to read contents of a file at the given path in an allocation
-// directory
+// directory.
+// Note: for cluster topologies where API consumers don't have network access to
+// Nomad clients, set api.ClientConnTimeout to a small value (ex 1ms) to avoid
+// long pauses on this API call.
func (a *AllocFS) Cat(alloc *Allocation, path string, q *QueryOptions) (io.ReadCloser, error) {
reqPath := fmt.Sprintf("/v1/client/fs/cat/%s", alloc.ID)
return queryClientNode(a.client, alloc, reqPath, q,
@@ -120,6 +132,10 @@ func (a *AllocFS) Cat(alloc *Allocation, path string, q *QueryOptions) (io.ReadC
// * cancel: A channel that when closed, streaming will end.
//
// The return value is a channel that will emit StreamFrames as they are read.
+//
+// Note: for cluster topologies where API consumers don't have network access to
+// Nomad clients, set api.ClientConnTimeout to a small value (ex 1ms) to avoid
+// long pauses on this API call.
func (a *AllocFS) Stream(alloc *Allocation, path, origin string, offset int64,
cancel <-chan struct{}, q *QueryOptions) (<-chan *StreamFrame, <-chan error) {
@@ -224,6 +240,10 @@ func queryClientNode(c *Client, alloc *Allocation, reqPath string, q *QueryOptio
// reached.
//
// Unexpected (non-EOF) errors will be sent on the error chan.
+//
+// Note: for cluster topologies where API consumers don't have network access to
+// Nomad clients, set api.ClientConnTimeout to a small value (ex 1ms) to avoid
+// long pauses on this API call.
func (a *AllocFS) Logs(alloc *Allocation, follow bool, task, logType, origin string,
offset int64, cancel <-chan struct{}, q *QueryOptions) (<-chan *StreamFrame, <-chan error) {
diff --git a/api/fs_test.go b/api/fs_test.go
index 449239f9654..fc03a9f764e 100644
--- a/api/fs_test.go
+++ b/api/fs_test.go
@@ -2,6 +2,7 @@ package api
import (
"bytes"
+ "errors"
"fmt"
"io"
"reflect"
@@ -47,7 +48,7 @@ func TestFS_Logs(t *testing.T) {
return false, fmt.Errorf("node not ready: %s", nodes[0].Status)
}
if _, ok := nodes[0].Drivers["mock_driver"]; !ok {
- return false, fmt.Errorf("mock_driver not ready")
+ return false, errors.New("mock_driver not ready")
}
return true, nil
}, func(err error) {
@@ -62,13 +63,13 @@ func TestFS_Logs(t *testing.T) {
}
job := &Job{
- ID: stringToPtr("TestFS_Logs"),
- Region: stringToPtr("global"),
+ ID: pointerOf("TestFS_Logs"),
+ Region: pointerOf("global"),
Datacenters: []string{"dc1"},
- Type: stringToPtr("batch"),
+ Type: pointerOf("batch"),
TaskGroups: []*TaskGroup{
{
- Name: stringToPtr("TestFS_LogsGroup"),
+ Name: pointerOf("TestFS_LogsGroup"),
Tasks: []*Task{
{
Name: "logger",
@@ -279,7 +280,7 @@ func TestFS_FrameReader_Error(t *testing.T) {
r.SetUnblockTime(10 * time.Millisecond)
// Send an error
- expected := fmt.Errorf("test error")
+ expected := errors.New("test error")
errCh <- expected
// Read a little
diff --git a/api/go.mod b/api/go.mod
index a478988b765..12cc0c25595 100644
--- a/api/go.mod
+++ b/api/go.mod
@@ -1,6 +1,6 @@
module github.com/hashicorp/nomad/api
-go 1.17
+go 1.19
require (
github.com/docker/go-units v0.4.0
@@ -11,11 +11,13 @@ require (
github.com/kr/pretty v0.3.0
github.com/mitchellh/go-testing-interface v1.14.1
github.com/mitchellh/mapstructure v1.5.0
+ github.com/shoenig/test v0.3.1
github.com/stretchr/testify v1.8.0
)
require (
github.com/davecgh/go-spew v1.1.1 // indirect
+ github.com/google/go-cmp v0.5.8 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
diff --git a/api/go.sum b/api/go.sum
index 01a972f5fca..098f2e8cd37 100644
--- a/api/go.sum
+++ b/api/go.sum
@@ -4,6 +4,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
+github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
+github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/hashicorp/cronexpr v1.1.1 h1:NJZDd87hGXjoZBdvyCF9mX4DCq5Wy7+A/w+A7q0wn6c=
@@ -29,6 +31,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k=
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
+github.com/shoenig/test v0.3.1 h1:dhGZztS6nQuvJ0o0RtUiQHaEO4hhArh/WmWwik3Ols0=
+github.com/shoenig/test v0.3.1/go.mod h1:xYtyGBC5Q3kzCNyJg/SjgNpfAa2kvmgA0i5+lQso8x0=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
diff --git a/api/internal/testutil/freeport/freeport.go b/api/internal/testutil/freeport/freeport.go
index f21698de723..3c08df5c222 100644
--- a/api/internal/testutil/freeport/freeport.go
+++ b/api/internal/testutil/freeport/freeport.go
@@ -3,7 +3,7 @@
package freeport
import (
- "fmt"
+ "errors"
"math/rand"
"net"
"sync"
@@ -110,7 +110,7 @@ func Free(n int) (ports []int, err error) {
defer mu.Unlock()
if n > blockSize-1 {
- return nil, fmt.Errorf("freeport: block size too small")
+ return nil, errors.New("freeport: block size too small")
}
// Reserve a port block
diff --git a/api/ioutil.go b/api/ioutil.go
index 4f585dba061..fe3cce5ac87 100644
--- a/api/ioutil.go
+++ b/api/ioutil.go
@@ -5,13 +5,13 @@ import (
"crypto/sha256"
"crypto/sha512"
"encoding/base64"
- "fmt"
+ "errors"
"hash"
"io"
"strings"
)
-var errMismatchChecksum = fmt.Errorf("mismatch checksum")
+var errMismatchChecksum = errors.New("mismatch checksum")
// checksumValidatingReader is a wrapper reader that validates
// the checksum of the underlying reader.
@@ -38,7 +38,7 @@ type checksumValidatingReader struct {
func newChecksumValidatingReader(r io.ReadCloser, digest string) (io.ReadCloser, error) {
parts := strings.SplitN(digest, "=", 2)
if len(parts) != 2 {
- return nil, fmt.Errorf("invalid digest format")
+ return nil, errors.New("invalid digest format")
}
algo := parts[0]
diff --git a/api/ioutil_test.go b/api/ioutil_test.go
index 97e43f694ad..99a18b66f42 100644
--- a/api/ioutil_test.go
+++ b/api/ioutil_test.go
@@ -5,7 +5,7 @@ import (
"crypto/sha256"
"crypto/sha512"
"encoding/base64"
- "fmt"
+ "errors"
"hash"
"io"
"io/ioutil"
@@ -73,7 +73,7 @@ func TestChecksumValidatingReader_PropagatesError(t *testing.T) {
defer pr.Close()
defer pw.Close()
- expectedErr := fmt.Errorf("some error")
+ expectedErr := errors.New("some error")
go func() {
pw.Write([]byte("some input"))
diff --git a/api/jobs.go b/api/jobs.go
index c781c628a05..4fc048dd51c 100644
--- a/api/jobs.go
+++ b/api/jobs.go
@@ -1,6 +1,7 @@
package api
import (
+ "errors"
"fmt"
"net/url"
"sort"
@@ -44,6 +45,16 @@ const (
RegisterEnforceIndexErrPrefix = "Enforcing job modify index"
)
+const (
+ // JobPeriodicLaunchSuffix is the string appended to the periodic jobs ID
+ // when launching derived instances of it.
+ JobPeriodicLaunchSuffix = "/periodic-"
+
+ // JobDispatchLaunchSuffix is the string appended to the parameterized job's ID
+ // when dispatching instances of it.
+ JobDispatchLaunchSuffix = "/dispatch-"
+)
+
// Jobs is used to access the job-specific endpoints.
type Jobs struct {
client *Client
@@ -178,7 +189,7 @@ func (j *Jobs) Scale(jobID, group string, count *int, message string, error bool
var count64 *int64
if count != nil {
- count64 = int64ToPtr(int64(*count))
+ count64 = pointerOf(int64(*count))
}
req := &ScalingRequest{
Count: count64,
@@ -390,7 +401,7 @@ func (j *Jobs) Plan(job *Job, diff bool, q *WriteOptions) (*JobPlanResponse, *Wr
func (j *Jobs) PlanOpts(job *Job, opts *PlanOptions, q *WriteOptions) (*JobPlanResponse, *WriteMeta, error) {
if job == nil {
- return nil, nil, fmt.Errorf("must pass non-nil job")
+ return nil, nil, errors.New("must pass non-nil job")
}
// Setup the request
@@ -502,15 +513,15 @@ type UpdateStrategy struct {
// jobs with the old policy or for populating field defaults.
func DefaultUpdateStrategy() *UpdateStrategy {
return &UpdateStrategy{
- Stagger: timeToPtr(30 * time.Second),
- MaxParallel: intToPtr(1),
- HealthCheck: stringToPtr("checks"),
- MinHealthyTime: timeToPtr(10 * time.Second),
- HealthyDeadline: timeToPtr(5 * time.Minute),
- ProgressDeadline: timeToPtr(10 * time.Minute),
- AutoRevert: boolToPtr(false),
- Canary: intToPtr(0),
- AutoPromote: boolToPtr(false),
+ Stagger: pointerOf(30 * time.Second),
+ MaxParallel: pointerOf(1),
+ HealthCheck: pointerOf("checks"),
+ MinHealthyTime: pointerOf(10 * time.Second),
+ HealthyDeadline: pointerOf(5 * time.Minute),
+ ProgressDeadline: pointerOf(10 * time.Minute),
+ AutoRevert: pointerOf(false),
+ Canary: pointerOf(0),
+ AutoPromote: pointerOf(false),
}
}
@@ -522,39 +533,39 @@ func (u *UpdateStrategy) Copy() *UpdateStrategy {
copy := new(UpdateStrategy)
if u.Stagger != nil {
- copy.Stagger = timeToPtr(*u.Stagger)
+ copy.Stagger = pointerOf(*u.Stagger)
}
if u.MaxParallel != nil {
- copy.MaxParallel = intToPtr(*u.MaxParallel)
+ copy.MaxParallel = pointerOf(*u.MaxParallel)
}
if u.HealthCheck != nil {
- copy.HealthCheck = stringToPtr(*u.HealthCheck)
+ copy.HealthCheck = pointerOf(*u.HealthCheck)
}
if u.MinHealthyTime != nil {
- copy.MinHealthyTime = timeToPtr(*u.MinHealthyTime)
+ copy.MinHealthyTime = pointerOf(*u.MinHealthyTime)
}
if u.HealthyDeadline != nil {
- copy.HealthyDeadline = timeToPtr(*u.HealthyDeadline)
+ copy.HealthyDeadline = pointerOf(*u.HealthyDeadline)
}
if u.ProgressDeadline != nil {
- copy.ProgressDeadline = timeToPtr(*u.ProgressDeadline)
+ copy.ProgressDeadline = pointerOf(*u.ProgressDeadline)
}
if u.AutoRevert != nil {
- copy.AutoRevert = boolToPtr(*u.AutoRevert)
+ copy.AutoRevert = pointerOf(*u.AutoRevert)
}
if u.Canary != nil {
- copy.Canary = intToPtr(*u.Canary)
+ copy.Canary = pointerOf(*u.Canary)
}
if u.AutoPromote != nil {
- copy.AutoPromote = boolToPtr(*u.AutoPromote)
+ copy.AutoPromote = pointerOf(*u.AutoPromote)
}
return copy
@@ -566,39 +577,39 @@ func (u *UpdateStrategy) Merge(o *UpdateStrategy) {
}
if o.Stagger != nil {
- u.Stagger = timeToPtr(*o.Stagger)
+ u.Stagger = pointerOf(*o.Stagger)
}
if o.MaxParallel != nil {
- u.MaxParallel = intToPtr(*o.MaxParallel)
+ u.MaxParallel = pointerOf(*o.MaxParallel)
}
if o.HealthCheck != nil {
- u.HealthCheck = stringToPtr(*o.HealthCheck)
+ u.HealthCheck = pointerOf(*o.HealthCheck)
}
if o.MinHealthyTime != nil {
- u.MinHealthyTime = timeToPtr(*o.MinHealthyTime)
+ u.MinHealthyTime = pointerOf(*o.MinHealthyTime)
}
if o.HealthyDeadline != nil {
- u.HealthyDeadline = timeToPtr(*o.HealthyDeadline)
+ u.HealthyDeadline = pointerOf(*o.HealthyDeadline)
}
if o.ProgressDeadline != nil {
- u.ProgressDeadline = timeToPtr(*o.ProgressDeadline)
+ u.ProgressDeadline = pointerOf(*o.ProgressDeadline)
}
if o.AutoRevert != nil {
- u.AutoRevert = boolToPtr(*o.AutoRevert)
+ u.AutoRevert = pointerOf(*o.AutoRevert)
}
if o.Canary != nil {
- u.Canary = intToPtr(*o.Canary)
+ u.Canary = pointerOf(*o.Canary)
}
if o.AutoPromote != nil {
- u.AutoPromote = boolToPtr(*o.AutoPromote)
+ u.AutoPromote = pointerOf(*o.AutoPromote)
}
}
@@ -695,15 +706,15 @@ type Multiregion struct {
func (m *Multiregion) Canonicalize() {
if m.Strategy == nil {
m.Strategy = &MultiregionStrategy{
- MaxParallel: intToPtr(0),
- OnFailure: stringToPtr(""),
+ MaxParallel: pointerOf(0),
+ OnFailure: pointerOf(""),
}
} else {
if m.Strategy.MaxParallel == nil {
- m.Strategy.MaxParallel = intToPtr(0)
+ m.Strategy.MaxParallel = pointerOf(0)
}
if m.Strategy.OnFailure == nil {
- m.Strategy.OnFailure = stringToPtr("")
+ m.Strategy.OnFailure = pointerOf("")
}
}
if m.Regions == nil {
@@ -711,7 +722,7 @@ func (m *Multiregion) Canonicalize() {
}
for _, region := range m.Regions {
if region.Count == nil {
- region.Count = intToPtr(1)
+ region.Count = pointerOf(1)
}
if region.Datacenters == nil {
region.Datacenters = []string{}
@@ -729,13 +740,13 @@ func (m *Multiregion) Copy() *Multiregion {
copy := new(Multiregion)
if m.Strategy != nil {
copy.Strategy = new(MultiregionStrategy)
- copy.Strategy.MaxParallel = intToPtr(*m.Strategy.MaxParallel)
- copy.Strategy.OnFailure = stringToPtr(*m.Strategy.OnFailure)
+ copy.Strategy.MaxParallel = pointerOf(*m.Strategy.MaxParallel)
+ copy.Strategy.OnFailure = pointerOf(*m.Strategy.OnFailure)
}
for _, region := range m.Regions {
copyRegion := new(MultiregionRegion)
copyRegion.Name = region.Name
- copyRegion.Count = intToPtr(*region.Count)
+ copyRegion.Count = pointerOf(*region.Count)
copyRegion.Datacenters = append(copyRegion.Datacenters, region.Datacenters...)
for k, v := range region.Meta {
copyRegion.Meta[k] = v
@@ -768,19 +779,19 @@ type PeriodicConfig struct {
func (p *PeriodicConfig) Canonicalize() {
if p.Enabled == nil {
- p.Enabled = boolToPtr(true)
+ p.Enabled = pointerOf(true)
}
if p.Spec == nil {
- p.Spec = stringToPtr("")
+ p.Spec = pointerOf("")
}
if p.SpecType == nil {
- p.SpecType = stringToPtr(PeriodicSpecCron)
+ p.SpecType = pointerOf(PeriodicSpecCron)
}
if p.ProhibitOverlap == nil {
- p.ProhibitOverlap = boolToPtr(false)
+ p.ProhibitOverlap = pointerOf(false)
}
if p.TimeZone == nil || *p.TimeZone == "" {
- p.TimeZone = stringToPtr("UTC")
+ p.TimeZone = pointerOf("UTC")
}
}
@@ -893,70 +904,70 @@ func (j *Job) IsMultiregion() bool {
func (j *Job) Canonicalize() {
if j.ID == nil {
- j.ID = stringToPtr("")
+ j.ID = pointerOf("")
}
if j.Name == nil {
- j.Name = stringToPtr(*j.ID)
+ j.Name = pointerOf(*j.ID)
}
if j.ParentID == nil {
- j.ParentID = stringToPtr("")
+ j.ParentID = pointerOf("")
}
if j.Namespace == nil {
- j.Namespace = stringToPtr(DefaultNamespace)
+ j.Namespace = pointerOf(DefaultNamespace)
}
if j.Priority == nil {
- j.Priority = intToPtr(50)
+ j.Priority = pointerOf(50)
}
if j.Stop == nil {
- j.Stop = boolToPtr(false)
+ j.Stop = pointerOf(false)
}
if j.Region == nil {
- j.Region = stringToPtr(GlobalRegion)
+ j.Region = pointerOf(GlobalRegion)
}
if j.Namespace == nil {
- j.Namespace = stringToPtr("default")
+ j.Namespace = pointerOf("default")
}
if j.Type == nil {
- j.Type = stringToPtr("service")
+ j.Type = pointerOf("service")
}
if j.AllAtOnce == nil {
- j.AllAtOnce = boolToPtr(false)
+ j.AllAtOnce = pointerOf(false)
}
if j.ConsulToken == nil {
- j.ConsulToken = stringToPtr("")
+ j.ConsulToken = pointerOf("")
}
if j.ConsulNamespace == nil {
- j.ConsulNamespace = stringToPtr("")
+ j.ConsulNamespace = pointerOf("")
}
if j.VaultToken == nil {
- j.VaultToken = stringToPtr("")
+ j.VaultToken = pointerOf("")
}
if j.VaultNamespace == nil {
- j.VaultNamespace = stringToPtr("")
+ j.VaultNamespace = pointerOf("")
}
if j.NomadTokenID == nil {
- j.NomadTokenID = stringToPtr("")
+ j.NomadTokenID = pointerOf("")
}
if j.Status == nil {
- j.Status = stringToPtr("")
+ j.Status = pointerOf("")
}
if j.StatusDescription == nil {
- j.StatusDescription = stringToPtr("")
+ j.StatusDescription = pointerOf("")
}
if j.Stable == nil {
- j.Stable = boolToPtr(false)
+ j.Stable = pointerOf(false)
}
if j.Version == nil {
- j.Version = uint64ToPtr(0)
+ j.Version = pointerOf(uint64(0))
}
if j.CreateIndex == nil {
- j.CreateIndex = uint64ToPtr(0)
+ j.CreateIndex = pointerOf(uint64(0))
}
if j.ModifyIndex == nil {
- j.ModifyIndex = uint64ToPtr(0)
+ j.ModifyIndex = pointerOf(uint64(0))
}
if j.JobModifyIndex == nil {
- j.JobModifyIndex = uint64ToPtr(0)
+ j.JobModifyIndex = pointerOf(uint64(0))
}
if j.Periodic != nil {
j.Periodic.Canonicalize()
diff --git a/api/jobs_test.go b/api/jobs_test.go
index 6cc8b3abf17..f6e3b3094c8 100644
--- a/api/jobs_test.go
+++ b/api/jobs_test.go
@@ -61,23 +61,23 @@ func TestJobs_Register_PreserveCounts(t *testing.T) {
task := NewTask("task", "exec").
SetConfig("command", "/bin/sleep").
Require(&Resources{
- CPU: intToPtr(100),
- MemoryMB: intToPtr(256),
+ CPU: pointerOf(100),
+ MemoryMB: pointerOf(256),
}).
SetLogConfig(&LogConfig{
- MaxFiles: intToPtr(1),
- MaxFileSizeMB: intToPtr(2),
+ MaxFiles: pointerOf(1),
+ MaxFileSizeMB: pointerOf(2),
})
group1 := NewTaskGroup("group1", 1).
AddTask(task).
RequireDisk(&EphemeralDisk{
- SizeMB: intToPtr(25),
+ SizeMB: pointerOf(25),
})
group2 := NewTaskGroup("group2", 2).
AddTask(task).
RequireDisk(&EphemeralDisk{
- SizeMB: intToPtr(25),
+ SizeMB: pointerOf(25),
})
job := NewBatchJob("job", "redis", "global", 1).
@@ -94,11 +94,11 @@ func TestJobs_Register_PreserveCounts(t *testing.T) {
// Update the job, new groups to test PreserveCounts
group1.Count = nil
- group2.Count = intToPtr(0)
+ group2.Count = pointerOf(0)
group3 := NewTaskGroup("group3", 3).
AddTask(task).
RequireDisk(&EphemeralDisk{
- SizeMB: intToPtr(25),
+ SizeMB: pointerOf(25),
})
job.AddTaskGroup(group3)
@@ -133,23 +133,23 @@ func TestJobs_Register_NoPreserveCounts(t *testing.T) {
task := NewTask("task", "exec").
SetConfig("command", "/bin/sleep").
Require(&Resources{
- CPU: intToPtr(100),
- MemoryMB: intToPtr(256),
+ CPU: pointerOf(100),
+ MemoryMB: pointerOf(256),
}).
SetLogConfig(&LogConfig{
- MaxFiles: intToPtr(1),
- MaxFileSizeMB: intToPtr(2),
+ MaxFiles: pointerOf(1),
+ MaxFileSizeMB: pointerOf(2),
})
group1 := NewTaskGroup("group1", 1).
AddTask(task).
RequireDisk(&EphemeralDisk{
- SizeMB: intToPtr(25),
+ SizeMB: pointerOf(25),
})
group2 := NewTaskGroup("group2", 2).
AddTask(task).
RequireDisk(&EphemeralDisk{
- SizeMB: intToPtr(25),
+ SizeMB: pointerOf(25),
})
job := NewBatchJob("job", "redis", "global", 1).
@@ -165,12 +165,12 @@ func TestJobs_Register_NoPreserveCounts(t *testing.T) {
assertWriteMeta(t, wm)
// Update the job, new groups to test PreserveCounts
- group1.Count = intToPtr(0)
+ group1.Count = pointerOf(0)
group2.Count = nil
group3 := NewTaskGroup("group3", 3).
AddTask(task).
RequireDisk(&EphemeralDisk{
- SizeMB: intToPtr(25),
+ SizeMB: pointerOf(25),
})
job.AddTaskGroup(group3)
@@ -288,79 +288,79 @@ func TestJobs_Canonicalize(t *testing.T) {
},
},
expected: &Job{
- ID: stringToPtr(""),
- Name: stringToPtr(""),
- Region: stringToPtr("global"),
- Namespace: stringToPtr(DefaultNamespace),
- Type: stringToPtr("service"),
- ParentID: stringToPtr(""),
- Priority: intToPtr(50),
- AllAtOnce: boolToPtr(false),
- ConsulToken: stringToPtr(""),
- ConsulNamespace: stringToPtr(""),
- VaultToken: stringToPtr(""),
- VaultNamespace: stringToPtr(""),
- NomadTokenID: stringToPtr(""),
- Status: stringToPtr(""),
- StatusDescription: stringToPtr(""),
- Stop: boolToPtr(false),
- Stable: boolToPtr(false),
- Version: uint64ToPtr(0),
- CreateIndex: uint64ToPtr(0),
- ModifyIndex: uint64ToPtr(0),
- JobModifyIndex: uint64ToPtr(0),
+ ID: pointerOf(""),
+ Name: pointerOf(""),
+ Region: pointerOf("global"),
+ Namespace: pointerOf(DefaultNamespace),
+ Type: pointerOf("service"),
+ ParentID: pointerOf(""),
+ Priority: pointerOf(50),
+ AllAtOnce: pointerOf(false),
+ ConsulToken: pointerOf(""),
+ ConsulNamespace: pointerOf(""),
+ VaultToken: pointerOf(""),
+ VaultNamespace: pointerOf(""),
+ NomadTokenID: pointerOf(""),
+ Status: pointerOf(""),
+ StatusDescription: pointerOf(""),
+ Stop: pointerOf(false),
+ Stable: pointerOf(false),
+ Version: pointerOf(uint64(0)),
+ CreateIndex: pointerOf(uint64(0)),
+ ModifyIndex: pointerOf(uint64(0)),
+ JobModifyIndex: pointerOf(uint64(0)),
Update: &UpdateStrategy{
- Stagger: timeToPtr(30 * time.Second),
- MaxParallel: intToPtr(1),
- HealthCheck: stringToPtr("checks"),
- MinHealthyTime: timeToPtr(10 * time.Second),
- HealthyDeadline: timeToPtr(5 * time.Minute),
- ProgressDeadline: timeToPtr(10 * time.Minute),
- AutoRevert: boolToPtr(false),
- Canary: intToPtr(0),
- AutoPromote: boolToPtr(false),
+ Stagger: pointerOf(30 * time.Second),
+ MaxParallel: pointerOf(1),
+ HealthCheck: pointerOf("checks"),
+ MinHealthyTime: pointerOf(10 * time.Second),
+ HealthyDeadline: pointerOf(5 * time.Minute),
+ ProgressDeadline: pointerOf(10 * time.Minute),
+ AutoRevert: pointerOf(false),
+ Canary: pointerOf(0),
+ AutoPromote: pointerOf(false),
},
TaskGroups: []*TaskGroup{
{
- Name: stringToPtr(""),
- Count: intToPtr(1),
+ Name: pointerOf(""),
+ Count: pointerOf(1),
EphemeralDisk: &EphemeralDisk{
- Sticky: boolToPtr(false),
- Migrate: boolToPtr(false),
- SizeMB: intToPtr(300),
+ Sticky: pointerOf(false),
+ Migrate: pointerOf(false),
+ SizeMB: pointerOf(300),
},
RestartPolicy: &RestartPolicy{
- Delay: timeToPtr(15 * time.Second),
- Attempts: intToPtr(2),
- Interval: timeToPtr(30 * time.Minute),
- Mode: stringToPtr("fail"),
+ Delay: pointerOf(15 * time.Second),
+ Attempts: pointerOf(2),
+ Interval: pointerOf(30 * time.Minute),
+ Mode: pointerOf("fail"),
},
ReschedulePolicy: &ReschedulePolicy{
- Attempts: intToPtr(0),
- Interval: timeToPtr(0),
- DelayFunction: stringToPtr("exponential"),
- Delay: timeToPtr(30 * time.Second),
- MaxDelay: timeToPtr(1 * time.Hour),
- Unlimited: boolToPtr(true),
+ Attempts: pointerOf(0),
+ Interval: pointerOf(time.Duration(0)),
+ DelayFunction: pointerOf("exponential"),
+ Delay: pointerOf(30 * time.Second),
+ MaxDelay: pointerOf(1 * time.Hour),
+ Unlimited: pointerOf(true),
},
Consul: &Consul{
Namespace: "",
},
Update: &UpdateStrategy{
- Stagger: timeToPtr(30 * time.Second),
- MaxParallel: intToPtr(1),
- HealthCheck: stringToPtr("checks"),
- MinHealthyTime: timeToPtr(10 * time.Second),
- HealthyDeadline: timeToPtr(5 * time.Minute),
- ProgressDeadline: timeToPtr(10 * time.Minute),
- AutoRevert: boolToPtr(false),
- Canary: intToPtr(0),
- AutoPromote: boolToPtr(false),
+ Stagger: pointerOf(30 * time.Second),
+ MaxParallel: pointerOf(1),
+ HealthCheck: pointerOf("checks"),
+ MinHealthyTime: pointerOf(10 * time.Second),
+ HealthyDeadline: pointerOf(5 * time.Minute),
+ ProgressDeadline: pointerOf(10 * time.Minute),
+ AutoRevert: pointerOf(false),
+ Canary: pointerOf(0),
+ AutoPromote: pointerOf(false),
},
Migrate: DefaultMigrateStrategy(),
Tasks: []*Task{
{
- KillTimeout: timeToPtr(5 * time.Second),
+ KillTimeout: pointerOf(5 * time.Second),
LogConfig: DefaultLogConfig(),
Resources: DefaultResources(),
RestartPolicy: defaultServiceJobRestartPolicy(),
@@ -373,7 +373,7 @@ func TestJobs_Canonicalize(t *testing.T) {
{
name: "batch",
input: &Job{
- Type: stringToPtr("batch"),
+ Type: pointerOf("batch"),
TaskGroups: []*TaskGroup{
{
Tasks: []*Task{
@@ -383,56 +383,56 @@ func TestJobs_Canonicalize(t *testing.T) {
},
},
expected: &Job{
- ID: stringToPtr(""),
- Name: stringToPtr(""),
- Region: stringToPtr("global"),
- Namespace: stringToPtr(DefaultNamespace),
- Type: stringToPtr("batch"),
- ParentID: stringToPtr(""),
- Priority: intToPtr(50),
- AllAtOnce: boolToPtr(false),
- ConsulToken: stringToPtr(""),
- ConsulNamespace: stringToPtr(""),
- VaultToken: stringToPtr(""),
- VaultNamespace: stringToPtr(""),
- NomadTokenID: stringToPtr(""),
- Status: stringToPtr(""),
- StatusDescription: stringToPtr(""),
- Stop: boolToPtr(false),
- Stable: boolToPtr(false),
- Version: uint64ToPtr(0),
- CreateIndex: uint64ToPtr(0),
- ModifyIndex: uint64ToPtr(0),
- JobModifyIndex: uint64ToPtr(0),
+ ID: pointerOf(""),
+ Name: pointerOf(""),
+ Region: pointerOf("global"),
+ Namespace: pointerOf(DefaultNamespace),
+ Type: pointerOf("batch"),
+ ParentID: pointerOf(""),
+ Priority: pointerOf(50),
+ AllAtOnce: pointerOf(false),
+ ConsulToken: pointerOf(""),
+ ConsulNamespace: pointerOf(""),
+ VaultToken: pointerOf(""),
+ VaultNamespace: pointerOf(""),
+ NomadTokenID: pointerOf(""),
+ Status: pointerOf(""),
+ StatusDescription: pointerOf(""),
+ Stop: pointerOf(false),
+ Stable: pointerOf(false),
+ Version: pointerOf(uint64(0)),
+ CreateIndex: pointerOf(uint64(0)),
+ ModifyIndex: pointerOf(uint64(0)),
+ JobModifyIndex: pointerOf(uint64(0)),
TaskGroups: []*TaskGroup{
{
- Name: stringToPtr(""),
- Count: intToPtr(1),
+ Name: pointerOf(""),
+ Count: pointerOf(1),
EphemeralDisk: &EphemeralDisk{
- Sticky: boolToPtr(false),
- Migrate: boolToPtr(false),
- SizeMB: intToPtr(300),
+ Sticky: pointerOf(false),
+ Migrate: pointerOf(false),
+ SizeMB: pointerOf(300),
},
RestartPolicy: &RestartPolicy{
- Delay: timeToPtr(15 * time.Second),
- Attempts: intToPtr(3),
- Interval: timeToPtr(24 * time.Hour),
- Mode: stringToPtr("fail"),
+ Delay: pointerOf(15 * time.Second),
+ Attempts: pointerOf(3),
+ Interval: pointerOf(24 * time.Hour),
+ Mode: pointerOf("fail"),
},
ReschedulePolicy: &ReschedulePolicy{
- Attempts: intToPtr(1),
- Interval: timeToPtr(24 * time.Hour),
- DelayFunction: stringToPtr("constant"),
- Delay: timeToPtr(5 * time.Second),
- MaxDelay: timeToPtr(0),
- Unlimited: boolToPtr(false),
+ Attempts: pointerOf(1),
+ Interval: pointerOf(24 * time.Hour),
+ DelayFunction: pointerOf("constant"),
+ Delay: pointerOf(5 * time.Second),
+ MaxDelay: pointerOf(time.Duration(0)),
+ Unlimited: pointerOf(false),
},
Consul: &Consul{
Namespace: "",
},
Tasks: []*Task{
{
- KillTimeout: timeToPtr(5 * time.Second),
+ KillTimeout: pointerOf(5 * time.Second),
LogConfig: DefaultLogConfig(),
Resources: DefaultResources(),
RestartPolicy: defaultBatchJobRestartPolicy(),
@@ -445,13 +445,13 @@ func TestJobs_Canonicalize(t *testing.T) {
{
name: "partial",
input: &Job{
- Name: stringToPtr("foo"),
- Namespace: stringToPtr("bar"),
- ID: stringToPtr("bar"),
- ParentID: stringToPtr("lol"),
+ Name: pointerOf("foo"),
+ Namespace: pointerOf("bar"),
+ ID: pointerOf("bar"),
+ ParentID: pointerOf("lol"),
TaskGroups: []*TaskGroup{
{
- Name: stringToPtr("bar"),
+ Name: pointerOf("bar"),
Tasks: []*Task{
{
Name: "task1",
@@ -461,74 +461,74 @@ func TestJobs_Canonicalize(t *testing.T) {
},
},
expected: &Job{
- Namespace: stringToPtr("bar"),
- ID: stringToPtr("bar"),
- Name: stringToPtr("foo"),
- Region: stringToPtr("global"),
- Type: stringToPtr("service"),
- ParentID: stringToPtr("lol"),
- Priority: intToPtr(50),
- AllAtOnce: boolToPtr(false),
- ConsulToken: stringToPtr(""),
- ConsulNamespace: stringToPtr(""),
- VaultToken: stringToPtr(""),
- VaultNamespace: stringToPtr(""),
- NomadTokenID: stringToPtr(""),
- Stop: boolToPtr(false),
- Stable: boolToPtr(false),
- Version: uint64ToPtr(0),
- Status: stringToPtr(""),
- StatusDescription: stringToPtr(""),
- CreateIndex: uint64ToPtr(0),
- ModifyIndex: uint64ToPtr(0),
- JobModifyIndex: uint64ToPtr(0),
+ Namespace: pointerOf("bar"),
+ ID: pointerOf("bar"),
+ Name: pointerOf("foo"),
+ Region: pointerOf("global"),
+ Type: pointerOf("service"),
+ ParentID: pointerOf("lol"),
+ Priority: pointerOf(50),
+ AllAtOnce: pointerOf(false),
+ ConsulToken: pointerOf(""),
+ ConsulNamespace: pointerOf(""),
+ VaultToken: pointerOf(""),
+ VaultNamespace: pointerOf(""),
+ NomadTokenID: pointerOf(""),
+ Stop: pointerOf(false),
+ Stable: pointerOf(false),
+ Version: pointerOf(uint64(0)),
+ Status: pointerOf(""),
+ StatusDescription: pointerOf(""),
+ CreateIndex: pointerOf(uint64(0)),
+ ModifyIndex: pointerOf(uint64(0)),
+ JobModifyIndex: pointerOf(uint64(0)),
Update: &UpdateStrategy{
- Stagger: timeToPtr(30 * time.Second),
- MaxParallel: intToPtr(1),
- HealthCheck: stringToPtr("checks"),
- MinHealthyTime: timeToPtr(10 * time.Second),
- HealthyDeadline: timeToPtr(5 * time.Minute),
- ProgressDeadline: timeToPtr(10 * time.Minute),
- AutoRevert: boolToPtr(false),
- Canary: intToPtr(0),
- AutoPromote: boolToPtr(false),
+ Stagger: pointerOf(30 * time.Second),
+ MaxParallel: pointerOf(1),
+ HealthCheck: pointerOf("checks"),
+ MinHealthyTime: pointerOf(10 * time.Second),
+ HealthyDeadline: pointerOf(5 * time.Minute),
+ ProgressDeadline: pointerOf(10 * time.Minute),
+ AutoRevert: pointerOf(false),
+ Canary: pointerOf(0),
+ AutoPromote: pointerOf(false),
},
TaskGroups: []*TaskGroup{
{
- Name: stringToPtr("bar"),
- Count: intToPtr(1),
+ Name: pointerOf("bar"),
+ Count: pointerOf(1),
EphemeralDisk: &EphemeralDisk{
- Sticky: boolToPtr(false),
- Migrate: boolToPtr(false),
- SizeMB: intToPtr(300),
+ Sticky: pointerOf(false),
+ Migrate: pointerOf(false),
+ SizeMB: pointerOf(300),
},
RestartPolicy: &RestartPolicy{
- Delay: timeToPtr(15 * time.Second),
- Attempts: intToPtr(2),
- Interval: timeToPtr(30 * time.Minute),
- Mode: stringToPtr("fail"),
+ Delay: pointerOf(15 * time.Second),
+ Attempts: pointerOf(2),
+ Interval: pointerOf(30 * time.Minute),
+ Mode: pointerOf("fail"),
},
ReschedulePolicy: &ReschedulePolicy{
- Attempts: intToPtr(0),
- Interval: timeToPtr(0),
- DelayFunction: stringToPtr("exponential"),
- Delay: timeToPtr(30 * time.Second),
- MaxDelay: timeToPtr(1 * time.Hour),
- Unlimited: boolToPtr(true),
+ Attempts: pointerOf(0),
+ Interval: pointerOf(time.Duration(0)),
+ DelayFunction: pointerOf("exponential"),
+ Delay: pointerOf(30 * time.Second),
+ MaxDelay: pointerOf(1 * time.Hour),
+ Unlimited: pointerOf(true),
},
Consul: &Consul{
Namespace: "",
},
Update: &UpdateStrategy{
- Stagger: timeToPtr(30 * time.Second),
- MaxParallel: intToPtr(1),
- HealthCheck: stringToPtr("checks"),
- MinHealthyTime: timeToPtr(10 * time.Second),
- HealthyDeadline: timeToPtr(5 * time.Minute),
- ProgressDeadline: timeToPtr(10 * time.Minute),
- AutoRevert: boolToPtr(false),
- Canary: intToPtr(0),
- AutoPromote: boolToPtr(false),
+ Stagger: pointerOf(30 * time.Second),
+ MaxParallel: pointerOf(1),
+ HealthCheck: pointerOf("checks"),
+ MinHealthyTime: pointerOf(10 * time.Second),
+ HealthyDeadline: pointerOf(5 * time.Minute),
+ ProgressDeadline: pointerOf(10 * time.Minute),
+ AutoRevert: pointerOf(false),
+ Canary: pointerOf(0),
+ AutoPromote: pointerOf(false),
},
Migrate: DefaultMigrateStrategy(),
Tasks: []*Task{
@@ -536,7 +536,7 @@ func TestJobs_Canonicalize(t *testing.T) {
Name: "task1",
LogConfig: DefaultLogConfig(),
Resources: DefaultResources(),
- KillTimeout: timeToPtr(5 * time.Second),
+ KillTimeout: pointerOf(5 * time.Second),
RestartPolicy: defaultServiceJobRestartPolicy(),
},
},
@@ -547,29 +547,29 @@ func TestJobs_Canonicalize(t *testing.T) {
{
name: "example_template",
input: &Job{
- ID: stringToPtr("example_template"),
- Name: stringToPtr("example_template"),
+ ID: pointerOf("example_template"),
+ Name: pointerOf("example_template"),
Datacenters: []string{"dc1"},
- Type: stringToPtr("service"),
+ Type: pointerOf("service"),
Update: &UpdateStrategy{
- MaxParallel: intToPtr(1),
- AutoPromote: boolToPtr(true),
+ MaxParallel: pointerOf(1),
+ AutoPromote: pointerOf(true),
},
TaskGroups: []*TaskGroup{
{
- Name: stringToPtr("cache"),
- Count: intToPtr(1),
+ Name: pointerOf("cache"),
+ Count: pointerOf(1),
RestartPolicy: &RestartPolicy{
- Interval: timeToPtr(5 * time.Minute),
- Attempts: intToPtr(10),
- Delay: timeToPtr(25 * time.Second),
- Mode: stringToPtr("delay"),
+ Interval: pointerOf(5 * time.Minute),
+ Attempts: pointerOf(10),
+ Delay: pointerOf(25 * time.Second),
+ Mode: pointerOf("delay"),
},
Update: &UpdateStrategy{
- AutoRevert: boolToPtr(true),
+ AutoRevert: pointerOf(true),
},
EphemeralDisk: &EphemeralDisk{
- SizeMB: intToPtr(300),
+ SizeMB: pointerOf(300),
},
Tasks: []*Task{
{
@@ -583,14 +583,14 @@ func TestJobs_Canonicalize(t *testing.T) {
},
RestartPolicy: &RestartPolicy{
// inherit other values from TG
- Attempts: intToPtr(20),
+ Attempts: pointerOf(20),
},
Resources: &Resources{
- CPU: intToPtr(500),
- MemoryMB: intToPtr(256),
+ CPU: pointerOf(500),
+ MemoryMB: pointerOf(256),
Networks: []*NetworkResource{
{
- MBits: intToPtr(10),
+ MBits: pointerOf(10),
DynamicPorts: []Port{
{
Label: "db",
@@ -617,13 +617,13 @@ func TestJobs_Canonicalize(t *testing.T) {
},
Templates: []*Template{
{
- EmbeddedTmpl: stringToPtr("---"),
- DestPath: stringToPtr("local/file.yml"),
+ EmbeddedTmpl: pointerOf("---"),
+ DestPath: pointerOf("local/file.yml"),
},
{
- EmbeddedTmpl: stringToPtr("FOO=bar\n"),
- DestPath: stringToPtr("local/file.env"),
- Envvars: boolToPtr(true),
+ EmbeddedTmpl: pointerOf("FOO=bar\n"),
+ DestPath: pointerOf("local/file.env"),
+ Envvars: pointerOf(true),
},
},
},
@@ -632,75 +632,75 @@ func TestJobs_Canonicalize(t *testing.T) {
},
},
expected: &Job{
- Namespace: stringToPtr(DefaultNamespace),
- ID: stringToPtr("example_template"),
- Name: stringToPtr("example_template"),
- ParentID: stringToPtr(""),
- Priority: intToPtr(50),
- Region: stringToPtr("global"),
- Type: stringToPtr("service"),
- AllAtOnce: boolToPtr(false),
- ConsulToken: stringToPtr(""),
- ConsulNamespace: stringToPtr(""),
- VaultToken: stringToPtr(""),
- VaultNamespace: stringToPtr(""),
- NomadTokenID: stringToPtr(""),
- Stop: boolToPtr(false),
- Stable: boolToPtr(false),
- Version: uint64ToPtr(0),
- Status: stringToPtr(""),
- StatusDescription: stringToPtr(""),
- CreateIndex: uint64ToPtr(0),
- ModifyIndex: uint64ToPtr(0),
- JobModifyIndex: uint64ToPtr(0),
+ Namespace: pointerOf(DefaultNamespace),
+ ID: pointerOf("example_template"),
+ Name: pointerOf("example_template"),
+ ParentID: pointerOf(""),
+ Priority: pointerOf(50),
+ Region: pointerOf("global"),
+ Type: pointerOf("service"),
+ AllAtOnce: pointerOf(false),
+ ConsulToken: pointerOf(""),
+ ConsulNamespace: pointerOf(""),
+ VaultToken: pointerOf(""),
+ VaultNamespace: pointerOf(""),
+ NomadTokenID: pointerOf(""),
+ Stop: pointerOf(false),
+ Stable: pointerOf(false),
+ Version: pointerOf(uint64(0)),
+ Status: pointerOf(""),
+ StatusDescription: pointerOf(""),
+ CreateIndex: pointerOf(uint64(0)),
+ ModifyIndex: pointerOf(uint64(0)),
+ JobModifyIndex: pointerOf(uint64(0)),
Datacenters: []string{"dc1"},
Update: &UpdateStrategy{
- Stagger: timeToPtr(30 * time.Second),
- MaxParallel: intToPtr(1),
- HealthCheck: stringToPtr("checks"),
- MinHealthyTime: timeToPtr(10 * time.Second),
- HealthyDeadline: timeToPtr(5 * time.Minute),
- ProgressDeadline: timeToPtr(10 * time.Minute),
- AutoRevert: boolToPtr(false),
- Canary: intToPtr(0),
- AutoPromote: boolToPtr(true),
+ Stagger: pointerOf(30 * time.Second),
+ MaxParallel: pointerOf(1),
+ HealthCheck: pointerOf("checks"),
+ MinHealthyTime: pointerOf(10 * time.Second),
+ HealthyDeadline: pointerOf(5 * time.Minute),
+ ProgressDeadline: pointerOf(10 * time.Minute),
+ AutoRevert: pointerOf(false),
+ Canary: pointerOf(0),
+ AutoPromote: pointerOf(true),
},
TaskGroups: []*TaskGroup{
{
- Name: stringToPtr("cache"),
- Count: intToPtr(1),
+ Name: pointerOf("cache"),
+ Count: pointerOf(1),
RestartPolicy: &RestartPolicy{
- Interval: timeToPtr(5 * time.Minute),
- Attempts: intToPtr(10),
- Delay: timeToPtr(25 * time.Second),
- Mode: stringToPtr("delay"),
+ Interval: pointerOf(5 * time.Minute),
+ Attempts: pointerOf(10),
+ Delay: pointerOf(25 * time.Second),
+ Mode: pointerOf("delay"),
},
ReschedulePolicy: &ReschedulePolicy{
- Attempts: intToPtr(0),
- Interval: timeToPtr(0),
- DelayFunction: stringToPtr("exponential"),
- Delay: timeToPtr(30 * time.Second),
- MaxDelay: timeToPtr(1 * time.Hour),
- Unlimited: boolToPtr(true),
+ Attempts: pointerOf(0),
+ Interval: pointerOf(time.Duration(0)),
+ DelayFunction: pointerOf("exponential"),
+ Delay: pointerOf(30 * time.Second),
+ MaxDelay: pointerOf(1 * time.Hour),
+ Unlimited: pointerOf(true),
},
EphemeralDisk: &EphemeralDisk{
- Sticky: boolToPtr(false),
- Migrate: boolToPtr(false),
- SizeMB: intToPtr(300),
+ Sticky: pointerOf(false),
+ Migrate: pointerOf(false),
+ SizeMB: pointerOf(300),
},
Consul: &Consul{
Namespace: "",
},
Update: &UpdateStrategy{
- Stagger: timeToPtr(30 * time.Second),
- MaxParallel: intToPtr(1),
- HealthCheck: stringToPtr("checks"),
- MinHealthyTime: timeToPtr(10 * time.Second),
- HealthyDeadline: timeToPtr(5 * time.Minute),
- ProgressDeadline: timeToPtr(10 * time.Minute),
- AutoRevert: boolToPtr(true),
- Canary: intToPtr(0),
- AutoPromote: boolToPtr(true),
+ Stagger: pointerOf(30 * time.Second),
+ MaxParallel: pointerOf(1),
+ HealthCheck: pointerOf("checks"),
+ MinHealthyTime: pointerOf(10 * time.Second),
+ HealthyDeadline: pointerOf(5 * time.Minute),
+ ProgressDeadline: pointerOf(10 * time.Minute),
+ AutoRevert: pointerOf(true),
+ Canary: pointerOf(0),
+ AutoPromote: pointerOf(true),
},
Migrate: DefaultMigrateStrategy(),
Tasks: []*Task{
@@ -714,18 +714,18 @@ func TestJobs_Canonicalize(t *testing.T) {
}},
},
RestartPolicy: &RestartPolicy{
- Interval: timeToPtr(5 * time.Minute),
- Attempts: intToPtr(20),
- Delay: timeToPtr(25 * time.Second),
- Mode: stringToPtr("delay"),
+ Interval: pointerOf(5 * time.Minute),
+ Attempts: pointerOf(20),
+ Delay: pointerOf(25 * time.Second),
+ Mode: pointerOf("delay"),
},
Resources: &Resources{
- CPU: intToPtr(500),
- Cores: intToPtr(0),
- MemoryMB: intToPtr(256),
+ CPU: pointerOf(500),
+ Cores: pointerOf(0),
+ MemoryMB: pointerOf(256),
Networks: []*NetworkResource{
{
- MBits: intToPtr(10),
+ MBits: pointerOf(10),
DynamicPorts: []Port{
{
Label: "db",
@@ -754,34 +754,34 @@ func TestJobs_Canonicalize(t *testing.T) {
},
},
},
- KillTimeout: timeToPtr(5 * time.Second),
+ KillTimeout: pointerOf(5 * time.Second),
LogConfig: DefaultLogConfig(),
Templates: []*Template{
{
- SourcePath: stringToPtr(""),
- DestPath: stringToPtr("local/file.yml"),
- EmbeddedTmpl: stringToPtr("---"),
- ChangeMode: stringToPtr("restart"),
- ChangeSignal: stringToPtr(""),
- Splay: timeToPtr(5 * time.Second),
- Perms: stringToPtr("0644"),
- LeftDelim: stringToPtr("{{"),
- RightDelim: stringToPtr("}}"),
- Envvars: boolToPtr(false),
- VaultGrace: timeToPtr(0),
+ SourcePath: pointerOf(""),
+ DestPath: pointerOf("local/file.yml"),
+ EmbeddedTmpl: pointerOf("---"),
+ ChangeMode: pointerOf("restart"),
+ ChangeSignal: pointerOf(""),
+ Splay: pointerOf(5 * time.Second),
+ Perms: pointerOf("0644"),
+ LeftDelim: pointerOf("{{"),
+ RightDelim: pointerOf("}}"),
+ Envvars: pointerOf(false),
+ VaultGrace: pointerOf(time.Duration(0)),
},
{
- SourcePath: stringToPtr(""),
- DestPath: stringToPtr("local/file.env"),
- EmbeddedTmpl: stringToPtr("FOO=bar\n"),
- ChangeMode: stringToPtr("restart"),
- ChangeSignal: stringToPtr(""),
- Splay: timeToPtr(5 * time.Second),
- Perms: stringToPtr("0644"),
- LeftDelim: stringToPtr("{{"),
- RightDelim: stringToPtr("}}"),
- Envvars: boolToPtr(true),
- VaultGrace: timeToPtr(0),
+ SourcePath: pointerOf(""),
+ DestPath: pointerOf("local/file.env"),
+ EmbeddedTmpl: pointerOf("FOO=bar\n"),
+ ChangeMode: pointerOf("restart"),
+ ChangeSignal: pointerOf(""),
+ Splay: pointerOf(5 * time.Second),
+ Perms: pointerOf("0644"),
+ LeftDelim: pointerOf("{{"),
+ RightDelim: pointerOf("}}"),
+ Envvars: pointerOf(true),
+ VaultGrace: pointerOf(time.Duration(0)),
},
},
},
@@ -794,48 +794,48 @@ func TestJobs_Canonicalize(t *testing.T) {
{
name: "periodic",
input: &Job{
- ID: stringToPtr("bar"),
+ ID: pointerOf("bar"),
Periodic: &PeriodicConfig{},
},
expected: &Job{
- Namespace: stringToPtr(DefaultNamespace),
- ID: stringToPtr("bar"),
- ParentID: stringToPtr(""),
- Name: stringToPtr("bar"),
- Region: stringToPtr("global"),
- Type: stringToPtr("service"),
- Priority: intToPtr(50),
- AllAtOnce: boolToPtr(false),
- ConsulToken: stringToPtr(""),
- ConsulNamespace: stringToPtr(""),
- VaultToken: stringToPtr(""),
- VaultNamespace: stringToPtr(""),
- NomadTokenID: stringToPtr(""),
- Stop: boolToPtr(false),
- Stable: boolToPtr(false),
- Version: uint64ToPtr(0),
- Status: stringToPtr(""),
- StatusDescription: stringToPtr(""),
- CreateIndex: uint64ToPtr(0),
- ModifyIndex: uint64ToPtr(0),
- JobModifyIndex: uint64ToPtr(0),
+ Namespace: pointerOf(DefaultNamespace),
+ ID: pointerOf("bar"),
+ ParentID: pointerOf(""),
+ Name: pointerOf("bar"),
+ Region: pointerOf("global"),
+ Type: pointerOf("service"),
+ Priority: pointerOf(50),
+ AllAtOnce: pointerOf(false),
+ ConsulToken: pointerOf(""),
+ ConsulNamespace: pointerOf(""),
+ VaultToken: pointerOf(""),
+ VaultNamespace: pointerOf(""),
+ NomadTokenID: pointerOf(""),
+ Stop: pointerOf(false),
+ Stable: pointerOf(false),
+ Version: pointerOf(uint64(0)),
+ Status: pointerOf(""),
+ StatusDescription: pointerOf(""),
+ CreateIndex: pointerOf(uint64(0)),
+ ModifyIndex: pointerOf(uint64(0)),
+ JobModifyIndex: pointerOf(uint64(0)),
Update: &UpdateStrategy{
- Stagger: timeToPtr(30 * time.Second),
- MaxParallel: intToPtr(1),
- HealthCheck: stringToPtr("checks"),
- MinHealthyTime: timeToPtr(10 * time.Second),
- HealthyDeadline: timeToPtr(5 * time.Minute),
- ProgressDeadline: timeToPtr(10 * time.Minute),
- AutoRevert: boolToPtr(false),
- Canary: intToPtr(0),
- AutoPromote: boolToPtr(false),
+ Stagger: pointerOf(30 * time.Second),
+ MaxParallel: pointerOf(1),
+ HealthCheck: pointerOf("checks"),
+ MinHealthyTime: pointerOf(10 * time.Second),
+ HealthyDeadline: pointerOf(5 * time.Minute),
+ ProgressDeadline: pointerOf(10 * time.Minute),
+ AutoRevert: pointerOf(false),
+ Canary: pointerOf(0),
+ AutoPromote: pointerOf(false),
},
Periodic: &PeriodicConfig{
- Enabled: boolToPtr(true),
- Spec: stringToPtr(""),
- SpecType: stringToPtr(PeriodicSpecCron),
- ProhibitOverlap: boolToPtr(false),
- TimeZone: stringToPtr("UTC"),
+ Enabled: pointerOf(true),
+ Spec: pointerOf(""),
+ SpecType: pointerOf(PeriodicSpecCron),
+ ProhibitOverlap: pointerOf(false),
+ TimeZone: pointerOf("UTC"),
},
},
},
@@ -843,34 +843,34 @@ func TestJobs_Canonicalize(t *testing.T) {
{
name: "update_merge",
input: &Job{
- Name: stringToPtr("foo"),
- ID: stringToPtr("bar"),
- ParentID: stringToPtr("lol"),
+ Name: pointerOf("foo"),
+ ID: pointerOf("bar"),
+ ParentID: pointerOf("lol"),
Update: &UpdateStrategy{
- Stagger: timeToPtr(1 * time.Second),
- MaxParallel: intToPtr(1),
- HealthCheck: stringToPtr("checks"),
- MinHealthyTime: timeToPtr(10 * time.Second),
- HealthyDeadline: timeToPtr(6 * time.Minute),
- ProgressDeadline: timeToPtr(7 * time.Minute),
- AutoRevert: boolToPtr(false),
- Canary: intToPtr(0),
- AutoPromote: boolToPtr(false),
+ Stagger: pointerOf(1 * time.Second),
+ MaxParallel: pointerOf(1),
+ HealthCheck: pointerOf("checks"),
+ MinHealthyTime: pointerOf(10 * time.Second),
+ HealthyDeadline: pointerOf(6 * time.Minute),
+ ProgressDeadline: pointerOf(7 * time.Minute),
+ AutoRevert: pointerOf(false),
+ Canary: pointerOf(0),
+ AutoPromote: pointerOf(false),
},
TaskGroups: []*TaskGroup{
{
- Name: stringToPtr("bar"),
+ Name: pointerOf("bar"),
Consul: &Consul{
Namespace: "",
},
Update: &UpdateStrategy{
- Stagger: timeToPtr(2 * time.Second),
- MaxParallel: intToPtr(2),
- HealthCheck: stringToPtr("manual"),
- MinHealthyTime: timeToPtr(1 * time.Second),
- AutoRevert: boolToPtr(true),
- Canary: intToPtr(1),
- AutoPromote: boolToPtr(true),
+ Stagger: pointerOf(2 * time.Second),
+ MaxParallel: pointerOf(2),
+ HealthCheck: pointerOf("manual"),
+ MinHealthyTime: pointerOf(1 * time.Second),
+ AutoRevert: pointerOf(true),
+ Canary: pointerOf(1),
+ AutoPromote: pointerOf(true),
},
Tasks: []*Task{
{
@@ -879,7 +879,7 @@ func TestJobs_Canonicalize(t *testing.T) {
},
},
{
- Name: stringToPtr("baz"),
+ Name: pointerOf("baz"),
Tasks: []*Task{
{
Name: "task1",
@@ -889,74 +889,74 @@ func TestJobs_Canonicalize(t *testing.T) {
},
},
expected: &Job{
- Namespace: stringToPtr(DefaultNamespace),
- ID: stringToPtr("bar"),
- Name: stringToPtr("foo"),
- Region: stringToPtr("global"),
- Type: stringToPtr("service"),
- ParentID: stringToPtr("lol"),
- Priority: intToPtr(50),
- AllAtOnce: boolToPtr(false),
- ConsulToken: stringToPtr(""),
- ConsulNamespace: stringToPtr(""),
- VaultToken: stringToPtr(""),
- VaultNamespace: stringToPtr(""),
- NomadTokenID: stringToPtr(""),
- Stop: boolToPtr(false),
- Stable: boolToPtr(false),
- Version: uint64ToPtr(0),
- Status: stringToPtr(""),
- StatusDescription: stringToPtr(""),
- CreateIndex: uint64ToPtr(0),
- ModifyIndex: uint64ToPtr(0),
- JobModifyIndex: uint64ToPtr(0),
+ Namespace: pointerOf(DefaultNamespace),
+ ID: pointerOf("bar"),
+ Name: pointerOf("foo"),
+ Region: pointerOf("global"),
+ Type: pointerOf("service"),
+ ParentID: pointerOf("lol"),
+ Priority: pointerOf(50),
+ AllAtOnce: pointerOf(false),
+ ConsulToken: pointerOf(""),
+ ConsulNamespace: pointerOf(""),
+ VaultToken: pointerOf(""),
+ VaultNamespace: pointerOf(""),
+ NomadTokenID: pointerOf(""),
+ Stop: pointerOf(false),
+ Stable: pointerOf(false),
+ Version: pointerOf(uint64(0)),
+ Status: pointerOf(""),
+ StatusDescription: pointerOf(""),
+ CreateIndex: pointerOf(uint64(0)),
+ ModifyIndex: pointerOf(uint64(0)),
+ JobModifyIndex: pointerOf(uint64(0)),
Update: &UpdateStrategy{
- Stagger: timeToPtr(1 * time.Second),
- MaxParallel: intToPtr(1),
- HealthCheck: stringToPtr("checks"),
- MinHealthyTime: timeToPtr(10 * time.Second),
- HealthyDeadline: timeToPtr(6 * time.Minute),
- ProgressDeadline: timeToPtr(7 * time.Minute),
- AutoRevert: boolToPtr(false),
- Canary: intToPtr(0),
- AutoPromote: boolToPtr(false),
+ Stagger: pointerOf(1 * time.Second),
+ MaxParallel: pointerOf(1),
+ HealthCheck: pointerOf("checks"),
+ MinHealthyTime: pointerOf(10 * time.Second),
+ HealthyDeadline: pointerOf(6 * time.Minute),
+ ProgressDeadline: pointerOf(7 * time.Minute),
+ AutoRevert: pointerOf(false),
+ Canary: pointerOf(0),
+ AutoPromote: pointerOf(false),
},
TaskGroups: []*TaskGroup{
{
- Name: stringToPtr("bar"),
- Count: intToPtr(1),
+ Name: pointerOf("bar"),
+ Count: pointerOf(1),
EphemeralDisk: &EphemeralDisk{
- Sticky: boolToPtr(false),
- Migrate: boolToPtr(false),
- SizeMB: intToPtr(300),
+ Sticky: pointerOf(false),
+ Migrate: pointerOf(false),
+ SizeMB: pointerOf(300),
},
RestartPolicy: &RestartPolicy{
- Delay: timeToPtr(15 * time.Second),
- Attempts: intToPtr(2),
- Interval: timeToPtr(30 * time.Minute),
- Mode: stringToPtr("fail"),
+ Delay: pointerOf(15 * time.Second),
+ Attempts: pointerOf(2),
+ Interval: pointerOf(30 * time.Minute),
+ Mode: pointerOf("fail"),
},
ReschedulePolicy: &ReschedulePolicy{
- Attempts: intToPtr(0),
- Interval: timeToPtr(0),
- DelayFunction: stringToPtr("exponential"),
- Delay: timeToPtr(30 * time.Second),
- MaxDelay: timeToPtr(1 * time.Hour),
- Unlimited: boolToPtr(true),
+ Attempts: pointerOf(0),
+ Interval: pointerOf(time.Duration(0)),
+ DelayFunction: pointerOf("exponential"),
+ Delay: pointerOf(30 * time.Second),
+ MaxDelay: pointerOf(1 * time.Hour),
+ Unlimited: pointerOf(true),
},
Consul: &Consul{
Namespace: "",
},
Update: &UpdateStrategy{
- Stagger: timeToPtr(2 * time.Second),
- MaxParallel: intToPtr(2),
- HealthCheck: stringToPtr("manual"),
- MinHealthyTime: timeToPtr(1 * time.Second),
- HealthyDeadline: timeToPtr(6 * time.Minute),
- ProgressDeadline: timeToPtr(7 * time.Minute),
- AutoRevert: boolToPtr(true),
- Canary: intToPtr(1),
- AutoPromote: boolToPtr(true),
+ Stagger: pointerOf(2 * time.Second),
+ MaxParallel: pointerOf(2),
+ HealthCheck: pointerOf("manual"),
+ MinHealthyTime: pointerOf(1 * time.Second),
+ HealthyDeadline: pointerOf(6 * time.Minute),
+ ProgressDeadline: pointerOf(7 * time.Minute),
+ AutoRevert: pointerOf(true),
+ Canary: pointerOf(1),
+ AutoPromote: pointerOf(true),
},
Migrate: DefaultMigrateStrategy(),
Tasks: []*Task{
@@ -964,46 +964,46 @@ func TestJobs_Canonicalize(t *testing.T) {
Name: "task1",
LogConfig: DefaultLogConfig(),
Resources: DefaultResources(),
- KillTimeout: timeToPtr(5 * time.Second),
+ KillTimeout: pointerOf(5 * time.Second),
RestartPolicy: defaultServiceJobRestartPolicy(),
},
},
},
{
- Name: stringToPtr("baz"),
- Count: intToPtr(1),
+ Name: pointerOf("baz"),
+ Count: pointerOf(1),
EphemeralDisk: &EphemeralDisk{
- Sticky: boolToPtr(false),
- Migrate: boolToPtr(false),
- SizeMB: intToPtr(300),
+ Sticky: pointerOf(false),
+ Migrate: pointerOf(false),
+ SizeMB: pointerOf(300),
},
RestartPolicy: &RestartPolicy{
- Delay: timeToPtr(15 * time.Second),
- Attempts: intToPtr(2),
- Interval: timeToPtr(30 * time.Minute),
- Mode: stringToPtr("fail"),
+ Delay: pointerOf(15 * time.Second),
+ Attempts: pointerOf(2),
+ Interval: pointerOf(30 * time.Minute),
+ Mode: pointerOf("fail"),
},
ReschedulePolicy: &ReschedulePolicy{
- Attempts: intToPtr(0),
- Interval: timeToPtr(0),
- DelayFunction: stringToPtr("exponential"),
- Delay: timeToPtr(30 * time.Second),
- MaxDelay: timeToPtr(1 * time.Hour),
- Unlimited: boolToPtr(true),
+ Attempts: pointerOf(0),
+ Interval: pointerOf(time.Duration(0)),
+ DelayFunction: pointerOf("exponential"),
+ Delay: pointerOf(30 * time.Second),
+ MaxDelay: pointerOf(1 * time.Hour),
+ Unlimited: pointerOf(true),
},
Consul: &Consul{
Namespace: "",
},
Update: &UpdateStrategy{
- Stagger: timeToPtr(1 * time.Second),
- MaxParallel: intToPtr(1),
- HealthCheck: stringToPtr("checks"),
- MinHealthyTime: timeToPtr(10 * time.Second),
- HealthyDeadline: timeToPtr(6 * time.Minute),
- ProgressDeadline: timeToPtr(7 * time.Minute),
- AutoRevert: boolToPtr(false),
- Canary: intToPtr(0),
- AutoPromote: boolToPtr(false),
+ Stagger: pointerOf(1 * time.Second),
+ MaxParallel: pointerOf(1),
+ HealthCheck: pointerOf("checks"),
+ MinHealthyTime: pointerOf(10 * time.Second),
+ HealthyDeadline: pointerOf(6 * time.Minute),
+ ProgressDeadline: pointerOf(7 * time.Minute),
+ AutoRevert: pointerOf(false),
+ Canary: pointerOf(0),
+ AutoPromote: pointerOf(false),
},
Migrate: DefaultMigrateStrategy(),
Tasks: []*Task{
@@ -1011,7 +1011,7 @@ func TestJobs_Canonicalize(t *testing.T) {
Name: "task1",
LogConfig: DefaultLogConfig(),
Resources: DefaultResources(),
- KillTimeout: timeToPtr(5 * time.Second),
+ KillTimeout: pointerOf(5 * time.Second),
RestartPolicy: defaultServiceJobRestartPolicy(),
},
},
@@ -1023,35 +1023,35 @@ func TestJobs_Canonicalize(t *testing.T) {
{
name: "restart_merge",
input: &Job{
- Name: stringToPtr("foo"),
- ID: stringToPtr("bar"),
- ParentID: stringToPtr("lol"),
+ Name: pointerOf("foo"),
+ ID: pointerOf("bar"),
+ ParentID: pointerOf("lol"),
TaskGroups: []*TaskGroup{
{
- Name: stringToPtr("bar"),
+ Name: pointerOf("bar"),
RestartPolicy: &RestartPolicy{
- Delay: timeToPtr(15 * time.Second),
- Attempts: intToPtr(2),
- Interval: timeToPtr(30 * time.Minute),
- Mode: stringToPtr("fail"),
+ Delay: pointerOf(15 * time.Second),
+ Attempts: pointerOf(2),
+ Interval: pointerOf(30 * time.Minute),
+ Mode: pointerOf("fail"),
},
Tasks: []*Task{
{
Name: "task1",
RestartPolicy: &RestartPolicy{
- Attempts: intToPtr(5),
- Delay: timeToPtr(1 * time.Second),
+ Attempts: pointerOf(5),
+ Delay: pointerOf(1 * time.Second),
},
},
},
},
{
- Name: stringToPtr("baz"),
+ Name: pointerOf("baz"),
RestartPolicy: &RestartPolicy{
- Delay: timeToPtr(20 * time.Second),
- Attempts: intToPtr(2),
- Interval: timeToPtr(30 * time.Minute),
- Mode: stringToPtr("fail"),
+ Delay: pointerOf(20 * time.Second),
+ Attempts: pointerOf(2),
+ Interval: pointerOf(30 * time.Minute),
+ Mode: pointerOf("fail"),
},
Consul: &Consul{
Namespace: "",
@@ -1065,74 +1065,74 @@ func TestJobs_Canonicalize(t *testing.T) {
},
},
expected: &Job{
- Namespace: stringToPtr(DefaultNamespace),
- ID: stringToPtr("bar"),
- Name: stringToPtr("foo"),
- Region: stringToPtr("global"),
- Type: stringToPtr("service"),
- ParentID: stringToPtr("lol"),
- Priority: intToPtr(50),
- AllAtOnce: boolToPtr(false),
- ConsulToken: stringToPtr(""),
- ConsulNamespace: stringToPtr(""),
- VaultToken: stringToPtr(""),
- VaultNamespace: stringToPtr(""),
- NomadTokenID: stringToPtr(""),
- Stop: boolToPtr(false),
- Stable: boolToPtr(false),
- Version: uint64ToPtr(0),
- Status: stringToPtr(""),
- StatusDescription: stringToPtr(""),
- CreateIndex: uint64ToPtr(0),
- ModifyIndex: uint64ToPtr(0),
- JobModifyIndex: uint64ToPtr(0),
+ Namespace: pointerOf(DefaultNamespace),
+ ID: pointerOf("bar"),
+ Name: pointerOf("foo"),
+ Region: pointerOf("global"),
+ Type: pointerOf("service"),
+ ParentID: pointerOf("lol"),
+ Priority: pointerOf(50),
+ AllAtOnce: pointerOf(false),
+ ConsulToken: pointerOf(""),
+ ConsulNamespace: pointerOf(""),
+ VaultToken: pointerOf(""),
+ VaultNamespace: pointerOf(""),
+ NomadTokenID: pointerOf(""),
+ Stop: pointerOf(false),
+ Stable: pointerOf(false),
+ Version: pointerOf(uint64(0)),
+ Status: pointerOf(""),
+ StatusDescription: pointerOf(""),
+ CreateIndex: pointerOf(uint64(0)),
+ ModifyIndex: pointerOf(uint64(0)),
+ JobModifyIndex: pointerOf(uint64(0)),
Update: &UpdateStrategy{
- Stagger: timeToPtr(30 * time.Second),
- MaxParallel: intToPtr(1),
- HealthCheck: stringToPtr("checks"),
- MinHealthyTime: timeToPtr(10 * time.Second),
- HealthyDeadline: timeToPtr(5 * time.Minute),
- ProgressDeadline: timeToPtr(10 * time.Minute),
- AutoRevert: boolToPtr(false),
- Canary: intToPtr(0),
- AutoPromote: boolToPtr(false),
+ Stagger: pointerOf(30 * time.Second),
+ MaxParallel: pointerOf(1),
+ HealthCheck: pointerOf("checks"),
+ MinHealthyTime: pointerOf(10 * time.Second),
+ HealthyDeadline: pointerOf(5 * time.Minute),
+ ProgressDeadline: pointerOf(10 * time.Minute),
+ AutoRevert: pointerOf(false),
+ Canary: pointerOf(0),
+ AutoPromote: pointerOf(false),
},
TaskGroups: []*TaskGroup{
{
- Name: stringToPtr("bar"),
- Count: intToPtr(1),
+ Name: pointerOf("bar"),
+ Count: pointerOf(1),
EphemeralDisk: &EphemeralDisk{
- Sticky: boolToPtr(false),
- Migrate: boolToPtr(false),
- SizeMB: intToPtr(300),
+ Sticky: pointerOf(false),
+ Migrate: pointerOf(false),
+ SizeMB: pointerOf(300),
},
RestartPolicy: &RestartPolicy{
- Delay: timeToPtr(15 * time.Second),
- Attempts: intToPtr(2),
- Interval: timeToPtr(30 * time.Minute),
- Mode: stringToPtr("fail"),
+ Delay: pointerOf(15 * time.Second),
+ Attempts: pointerOf(2),
+ Interval: pointerOf(30 * time.Minute),
+ Mode: pointerOf("fail"),
},
ReschedulePolicy: &ReschedulePolicy{
- Attempts: intToPtr(0),
- Interval: timeToPtr(0),
- DelayFunction: stringToPtr("exponential"),
- Delay: timeToPtr(30 * time.Second),
- MaxDelay: timeToPtr(1 * time.Hour),
- Unlimited: boolToPtr(true),
+ Attempts: pointerOf(0),
+ Interval: pointerOf(time.Duration(0)),
+ DelayFunction: pointerOf("exponential"),
+ Delay: pointerOf(30 * time.Second),
+ MaxDelay: pointerOf(1 * time.Hour),
+ Unlimited: pointerOf(true),
},
Consul: &Consul{
Namespace: "",
},
Update: &UpdateStrategy{
- Stagger: timeToPtr(30 * time.Second),
- MaxParallel: intToPtr(1),
- HealthCheck: stringToPtr("checks"),
- MinHealthyTime: timeToPtr(10 * time.Second),
- HealthyDeadline: timeToPtr(5 * time.Minute),
- ProgressDeadline: timeToPtr(10 * time.Minute),
- AutoRevert: boolToPtr(false),
- Canary: intToPtr(0),
- AutoPromote: boolToPtr(false),
+ Stagger: pointerOf(30 * time.Second),
+ MaxParallel: pointerOf(1),
+ HealthCheck: pointerOf("checks"),
+ MinHealthyTime: pointerOf(10 * time.Second),
+ HealthyDeadline: pointerOf(5 * time.Minute),
+ ProgressDeadline: pointerOf(10 * time.Minute),
+ AutoRevert: pointerOf(false),
+ Canary: pointerOf(0),
+ AutoPromote: pointerOf(false),
},
Migrate: DefaultMigrateStrategy(),
Tasks: []*Task{
@@ -1140,51 +1140,51 @@ func TestJobs_Canonicalize(t *testing.T) {
Name: "task1",
LogConfig: DefaultLogConfig(),
Resources: DefaultResources(),
- KillTimeout: timeToPtr(5 * time.Second),
+ KillTimeout: pointerOf(5 * time.Second),
RestartPolicy: &RestartPolicy{
- Attempts: intToPtr(5),
- Delay: timeToPtr(1 * time.Second),
- Interval: timeToPtr(30 * time.Minute),
- Mode: stringToPtr("fail"),
+ Attempts: pointerOf(5),
+ Delay: pointerOf(1 * time.Second),
+ Interval: pointerOf(30 * time.Minute),
+ Mode: pointerOf("fail"),
},
},
},
},
{
- Name: stringToPtr("baz"),
- Count: intToPtr(1),
+ Name: pointerOf("baz"),
+ Count: pointerOf(1),
EphemeralDisk: &EphemeralDisk{
- Sticky: boolToPtr(false),
- Migrate: boolToPtr(false),
- SizeMB: intToPtr(300),
+ Sticky: pointerOf(false),
+ Migrate: pointerOf(false),
+ SizeMB: pointerOf(300),
},
RestartPolicy: &RestartPolicy{
- Delay: timeToPtr(20 * time.Second),
- Attempts: intToPtr(2),
- Interval: timeToPtr(30 * time.Minute),
- Mode: stringToPtr("fail"),
+ Delay: pointerOf(20 * time.Second),
+ Attempts: pointerOf(2),
+ Interval: pointerOf(30 * time.Minute),
+ Mode: pointerOf("fail"),
},
ReschedulePolicy: &ReschedulePolicy{
- Attempts: intToPtr(0),
- Interval: timeToPtr(0),
- DelayFunction: stringToPtr("exponential"),
- Delay: timeToPtr(30 * time.Second),
- MaxDelay: timeToPtr(1 * time.Hour),
- Unlimited: boolToPtr(true),
+ Attempts: pointerOf(0),
+ Interval: pointerOf(time.Duration(0)),
+ DelayFunction: pointerOf("exponential"),
+ Delay: pointerOf(30 * time.Second),
+ MaxDelay: pointerOf(1 * time.Hour),
+ Unlimited: pointerOf(true),
},
Consul: &Consul{
Namespace: "",
},
Update: &UpdateStrategy{
- Stagger: timeToPtr(30 * time.Second),
- MaxParallel: intToPtr(1),
- HealthCheck: stringToPtr("checks"),
- MinHealthyTime: timeToPtr(10 * time.Second),
- HealthyDeadline: timeToPtr(5 * time.Minute),
- ProgressDeadline: timeToPtr(10 * time.Minute),
- AutoRevert: boolToPtr(false),
- Canary: intToPtr(0),
- AutoPromote: boolToPtr(false),
+ Stagger: pointerOf(30 * time.Second),
+ MaxParallel: pointerOf(1),
+ HealthCheck: pointerOf("checks"),
+ MinHealthyTime: pointerOf(10 * time.Second),
+ HealthyDeadline: pointerOf(5 * time.Minute),
+ ProgressDeadline: pointerOf(10 * time.Minute),
+ AutoRevert: pointerOf(false),
+ Canary: pointerOf(0),
+ AutoPromote: pointerOf(false),
},
Migrate: DefaultMigrateStrategy(),
Tasks: []*Task{
@@ -1192,12 +1192,12 @@ func TestJobs_Canonicalize(t *testing.T) {
Name: "task1",
LogConfig: DefaultLogConfig(),
Resources: DefaultResources(),
- KillTimeout: timeToPtr(5 * time.Second),
+ KillTimeout: pointerOf(5 * time.Second),
RestartPolicy: &RestartPolicy{
- Delay: timeToPtr(20 * time.Second),
- Attempts: intToPtr(2),
- Interval: timeToPtr(30 * time.Minute),
- Mode: stringToPtr("fail"),
+ Delay: pointerOf(20 * time.Second),
+ Attempts: pointerOf(2),
+ Interval: pointerOf(30 * time.Minute),
+ Mode: pointerOf("fail"),
},
},
},
@@ -1209,14 +1209,14 @@ func TestJobs_Canonicalize(t *testing.T) {
{
name: "multiregion",
input: &Job{
- Name: stringToPtr("foo"),
- ID: stringToPtr("bar"),
- ParentID: stringToPtr("lol"),
+ Name: pointerOf("foo"),
+ ID: pointerOf("bar"),
+ ParentID: pointerOf("lol"),
Multiregion: &Multiregion{
Regions: []*MultiregionRegion{
{
Name: "west",
- Count: intToPtr(1),
+ Count: pointerOf(1),
},
},
},
@@ -1224,49 +1224,49 @@ func TestJobs_Canonicalize(t *testing.T) {
expected: &Job{
Multiregion: &Multiregion{
Strategy: &MultiregionStrategy{
- MaxParallel: intToPtr(0),
- OnFailure: stringToPtr(""),
+ MaxParallel: pointerOf(0),
+ OnFailure: pointerOf(""),
},
Regions: []*MultiregionRegion{
{
Name: "west",
- Count: intToPtr(1),
+ Count: pointerOf(1),
Datacenters: []string{},
Meta: map[string]string{},
},
},
},
- Namespace: stringToPtr(DefaultNamespace),
- ID: stringToPtr("bar"),
- Name: stringToPtr("foo"),
- Region: stringToPtr("global"),
- Type: stringToPtr("service"),
- ParentID: stringToPtr("lol"),
- Priority: intToPtr(50),
- AllAtOnce: boolToPtr(false),
- ConsulToken: stringToPtr(""),
- ConsulNamespace: stringToPtr(""),
- VaultToken: stringToPtr(""),
- VaultNamespace: stringToPtr(""),
- NomadTokenID: stringToPtr(""),
- Stop: boolToPtr(false),
- Stable: boolToPtr(false),
- Version: uint64ToPtr(0),
- Status: stringToPtr(""),
- StatusDescription: stringToPtr(""),
- CreateIndex: uint64ToPtr(0),
- ModifyIndex: uint64ToPtr(0),
- JobModifyIndex: uint64ToPtr(0),
+ Namespace: pointerOf(DefaultNamespace),
+ ID: pointerOf("bar"),
+ Name: pointerOf("foo"),
+ Region: pointerOf("global"),
+ Type: pointerOf("service"),
+ ParentID: pointerOf("lol"),
+ Priority: pointerOf(50),
+ AllAtOnce: pointerOf(false),
+ ConsulToken: pointerOf(""),
+ ConsulNamespace: pointerOf(""),
+ VaultToken: pointerOf(""),
+ VaultNamespace: pointerOf(""),
+ NomadTokenID: pointerOf(""),
+ Stop: pointerOf(false),
+ Stable: pointerOf(false),
+ Version: pointerOf(uint64(0)),
+ Status: pointerOf(""),
+ StatusDescription: pointerOf(""),
+ CreateIndex: pointerOf(uint64(0)),
+ ModifyIndex: pointerOf(uint64(0)),
+ JobModifyIndex: pointerOf(uint64(0)),
Update: &UpdateStrategy{
- Stagger: timeToPtr(30 * time.Second),
- MaxParallel: intToPtr(1),
- HealthCheck: stringToPtr("checks"),
- MinHealthyTime: timeToPtr(10 * time.Second),
- HealthyDeadline: timeToPtr(5 * time.Minute),
- ProgressDeadline: timeToPtr(10 * time.Minute),
- AutoRevert: boolToPtr(false),
- Canary: intToPtr(0),
- AutoPromote: boolToPtr(false),
+ Stagger: pointerOf(30 * time.Second),
+ MaxParallel: pointerOf(1),
+ HealthCheck: pointerOf("checks"),
+ MinHealthyTime: pointerOf(10 * time.Second),
+ HealthyDeadline: pointerOf(5 * time.Minute),
+ ProgressDeadline: pointerOf(10 * time.Minute),
+ AutoRevert: pointerOf(false),
+ Canary: pointerOf(0),
+ AutoPromote: pointerOf(false),
},
},
},
@@ -1356,13 +1356,13 @@ func TestJobs_Revert(t *testing.T) {
assertWriteMeta(t, wm)
// Fail revert at incorrect enforce
- _, _, err = jobs.Revert(*job.ID, 0, uint64ToPtr(10), nil, "", "")
+ _, _, err = jobs.Revert(*job.ID, 0, pointerOf(uint64(10)), nil, "", "")
if err == nil || !strings.Contains(err.Error(), "enforcing version") {
t.Fatalf("expected enforcement error: %v", err)
}
// Works at correct index
- revertResp, wm, err := jobs.Revert(*job.ID, 0, uint64ToPtr(1), nil, "", "")
+ revertResp, wm, err := jobs.Revert(*job.ID, 0, pointerOf(uint64(1)), nil, "", "")
if err != nil {
t.Fatalf("err: %s", err)
}
@@ -1442,13 +1442,13 @@ func TestJobs_ScaleInvalidAction(t *testing.T) {
// Register test job
job := testJob()
- job.ID = stringToPtr("TestJobs_Scale")
+ job.ID = pointerOf("TestJobs_Scale")
_, wm, err := jobs.Register(job, nil)
require.NoError(err)
assertWriteMeta(t, wm)
// Perform a scaling action with bad group name, verify error
- _, _, err = jobs.Scale(*job.ID, "incorrect-group-name", intToPtr(2),
+ _, _, err = jobs.Scale(*job.ID, "incorrect-group-name", pointerOf(2),
"because", false, nil, nil)
require.Error(err)
require.Contains(err.Error(), "does not exist")
@@ -1952,11 +1952,11 @@ func TestJobs_NewBatchJob(t *testing.T) {
testutil.Parallel(t)
job := NewBatchJob("job1", "myjob", "global", 5)
expect := &Job{
- Region: stringToPtr("global"),
- ID: stringToPtr("job1"),
- Name: stringToPtr("myjob"),
- Type: stringToPtr(JobTypeBatch),
- Priority: intToPtr(5),
+ Region: pointerOf("global"),
+ ID: pointerOf("job1"),
+ Name: pointerOf("myjob"),
+ Type: pointerOf(JobTypeBatch),
+ Priority: pointerOf(5),
}
if !reflect.DeepEqual(job, expect) {
t.Fatalf("expect: %#v, got: %#v", expect, job)
@@ -1967,11 +1967,11 @@ func TestJobs_NewServiceJob(t *testing.T) {
testutil.Parallel(t)
job := NewServiceJob("job1", "myjob", "global", 5)
expect := &Job{
- Region: stringToPtr("global"),
- ID: stringToPtr("job1"),
- Name: stringToPtr("myjob"),
- Type: stringToPtr(JobTypeService),
- Priority: intToPtr(5),
+ Region: pointerOf("global"),
+ ID: pointerOf("job1"),
+ Name: pointerOf("myjob"),
+ Type: pointerOf(JobTypeService),
+ Priority: pointerOf(5),
}
if !reflect.DeepEqual(job, expect) {
t.Fatalf("expect: %#v, got: %#v", expect, job)
@@ -1982,11 +1982,11 @@ func TestJobs_NewSystemJob(t *testing.T) {
testutil.Parallel(t)
job := NewSystemJob("job1", "myjob", "global", 5)
expect := &Job{
- Region: stringToPtr("global"),
- ID: stringToPtr("job1"),
- Name: stringToPtr("myjob"),
- Type: stringToPtr(JobTypeSystem),
- Priority: intToPtr(5),
+ Region: pointerOf("global"),
+ ID: pointerOf("job1"),
+ Name: pointerOf("myjob"),
+ Type: pointerOf(JobTypeSystem),
+ Priority: pointerOf(5),
}
if !reflect.DeepEqual(job, expect) {
t.Fatalf("expect: %#v, got: %#v", expect, job)
@@ -1997,11 +1997,11 @@ func TestJobs_NewSysbatchJob(t *testing.T) {
testutil.Parallel(t)
job := NewSysbatchJob("job1", "myjob", "global", 5)
expect := &Job{
- Region: stringToPtr("global"),
- ID: stringToPtr("job1"),
- Name: stringToPtr("myjob"),
- Type: stringToPtr(JobTypeSysbatch),
- Priority: intToPtr(5),
+ Region: pointerOf("global"),
+ ID: pointerOf("job1"),
+ Name: pointerOf("myjob"),
+ Type: pointerOf(JobTypeSysbatch),
+ Priority: pointerOf(5),
}
require.Equal(t, expect, job)
}
@@ -2085,13 +2085,13 @@ func TestJobs_AddAffinity(t *testing.T) {
LTarget: "kernel.version",
RTarget: "4.6",
Operand: "=",
- Weight: int8ToPtr(100),
+ Weight: pointerOf(int8(100)),
},
{
LTarget: "${node.datacenter}",
RTarget: "dc2",
Operand: "=",
- Weight: int8ToPtr(50),
+ Weight: pointerOf(int8(50)),
},
}
if !reflect.DeepEqual(job.Affinities, expect) {
@@ -2145,7 +2145,7 @@ func TestJobs_AddSpread(t *testing.T) {
expect := []*Spread{
{
Attribute: "${meta.rack}",
- Weight: int8ToPtr(100),
+ Weight: pointerOf(int8(100)),
SpreadTarget: []*SpreadTarget{
{
Value: "r1",
@@ -2155,7 +2155,7 @@ func TestJobs_AddSpread(t *testing.T) {
},
{
Attribute: "${node.datacenter}",
- Weight: int8ToPtr(100),
+ Weight: pointerOf(int8(100)),
SpreadTarget: []*SpreadTarget{
{
Value: "dc1",
@@ -2186,7 +2186,7 @@ func TestJobs_ScaleAction(t *testing.T) {
newCount := origCount + 1
// Trying to scale against a target before it exists returns an error
- _, _, err := jobs.Scale(id, "missing", intToPtr(newCount), "this won't work",
+ _, _, err := jobs.Scale(id, "missing", pointerOf(newCount), "this won't work",
false, nil, nil)
require.Error(err)
require.Contains(err.Error(), "not found")
@@ -2198,7 +2198,7 @@ func TestJobs_ScaleAction(t *testing.T) {
// Perform scaling action
scalingResp, wm, err := jobs.Scale(id, groupName,
- intToPtr(newCount), "need more instances", false,
+ pointerOf(newCount), "need more instances", false,
map[string]interface{}{
"meta": "data",
}, nil)
diff --git a/api/nodes_test.go b/api/nodes_test.go
index a811826edce..6d4de0747ad 100644
--- a/api/nodes_test.go
+++ b/api/nodes_test.go
@@ -669,15 +669,15 @@ func TestNodeStatValueFormatting(t *testing.T) {
}{
{
"true",
- StatValue{BoolVal: boolToPtr(true)},
+ StatValue{BoolVal: pointerOf(true)},
},
{
"false",
- StatValue{BoolVal: boolToPtr(false)},
+ StatValue{BoolVal: pointerOf(false)},
},
{
"myvalue",
- StatValue{StringVal: stringToPtr("myvalue")},
+ StatValue{StringVal: pointerOf("myvalue")},
},
{
"2.718",
@@ -710,28 +710,28 @@ func TestNodeStatValueFormatting(t *testing.T) {
{
"2",
StatValue{
- IntNumeratorVal: int64ToPtr(2),
+ IntNumeratorVal: pointerOf(int64(2)),
},
},
{
"2 / 3",
StatValue{
- IntNumeratorVal: int64ToPtr(2),
- IntDenominatorVal: int64ToPtr(3),
+ IntNumeratorVal: pointerOf(int64(2)),
+ IntDenominatorVal: pointerOf(int64(3)),
},
},
{
"2 MHz",
StatValue{
- IntNumeratorVal: int64ToPtr(2),
+ IntNumeratorVal: pointerOf(int64(2)),
Unit: "MHz",
},
},
{
"2 / 3 MHz",
StatValue{
- IntNumeratorVal: int64ToPtr(2),
- IntDenominatorVal: int64ToPtr(3),
+ IntNumeratorVal: pointerOf(int64(2)),
+ IntDenominatorVal: pointerOf(int64(3)),
Unit: "MHz",
},
},
diff --git a/api/quota.go b/api/quota.go
index be4e46c7e95..ecfb82e8e31 100644
--- a/api/quota.go
+++ b/api/quota.go
@@ -126,6 +126,12 @@ type QuotaLimit struct {
// useful for once we support GPUs
RegionLimit *Resources
+ // SecureVariablesLimit is the maximum total size of all secure
+ // variables SecureVariable.EncryptedData. A value of zero is
+ // treated as unlimited and a negative value is treated as fully
+ // disallowed.
+ SecureVariablesLimit *int `mapstructure:"secure_variables_limit" hcl:"secure_variables_limit,optional"`
+
// Hash is the hash of the object and is used to make replication efficient.
Hash []byte
}
diff --git a/api/resources.go b/api/resources.go
index b5ada2d9ec1..43f6bbe86ad 100644
--- a/api/resources.go
+++ b/api/resources.go
@@ -38,7 +38,7 @@ func (r *Resources) Canonicalize() {
// CPU will be set to the default if cores is nil above.
// If cpu is nil here then cores has been set and cpu should be 0
if r.CPU == nil {
- r.CPU = intToPtr(0)
+ r.CPU = pointerOf(0)
}
if r.MemoryMB == nil {
@@ -55,9 +55,9 @@ func (r *Resources) Canonicalize() {
// and should be kept in sync.
func DefaultResources() *Resources {
return &Resources{
- CPU: intToPtr(100),
- Cores: intToPtr(0),
- MemoryMB: intToPtr(300),
+ CPU: pointerOf(100),
+ Cores: pointerOf(0),
+ MemoryMB: pointerOf(300),
}
}
@@ -68,9 +68,9 @@ func DefaultResources() *Resources {
// IN nomad/structs/structs.go and should be kept in sync.
func MinResources() *Resources {
return &Resources{
- CPU: intToPtr(1),
- Cores: intToPtr(0),
- MemoryMB: intToPtr(10),
+ CPU: pointerOf(1),
+ Cores: pointerOf(0),
+ MemoryMB: pointerOf(10),
}
}
@@ -268,7 +268,7 @@ type RequestedDevice struct {
func (d *RequestedDevice) Canonicalize() {
if d.Count == nil {
- d.Count = uint64ToPtr(1)
+ d.Count = pointerOf(uint64(1))
}
for _, a := range d.Affinities {
diff --git a/api/resources_test.go b/api/resources_test.go
index 2f9904ba6e5..de67c74a0ae 100644
--- a/api/resources_test.go
+++ b/api/resources_test.go
@@ -23,25 +23,25 @@ func TestResources_Canonicalize(t *testing.T) {
{
name: "cores",
input: &Resources{
- Cores: intToPtr(2),
- MemoryMB: intToPtr(1024),
+ Cores: pointerOf(2),
+ MemoryMB: pointerOf(1024),
},
expected: &Resources{
- CPU: intToPtr(0),
- Cores: intToPtr(2),
- MemoryMB: intToPtr(1024),
+ CPU: pointerOf(0),
+ Cores: pointerOf(2),
+ MemoryMB: pointerOf(1024),
},
},
{
name: "cpu",
input: &Resources{
- CPU: intToPtr(500),
- MemoryMB: intToPtr(1024),
+ CPU: pointerOf(500),
+ MemoryMB: pointerOf(1024),
},
expected: &Resources{
- CPU: intToPtr(500),
- Cores: intToPtr(0),
- MemoryMB: intToPtr(1024),
+ CPU: pointerOf(500),
+ Cores: pointerOf(0),
+ MemoryMB: pointerOf(1024),
},
},
}
diff --git a/api/scaling.go b/api/scaling.go
index 2266c895987..32259c9f415 100644
--- a/api/scaling.go
+++ b/api/scaling.go
@@ -35,7 +35,7 @@ func (s *Scaling) GetPolicy(id string, q *QueryOptions) (*ScalingPolicy, *QueryM
func (p *ScalingPolicy) Canonicalize(taskGroupCount int) {
if p.Enabled == nil {
- p.Enabled = boolToPtr(true)
+ p.Enabled = pointerOf(true)
}
if p.Min == nil {
var m int64 = int64(taskGroupCount)
diff --git a/api/scaling_test.go b/api/scaling_test.go
index 0d4a703c6ba..af9dff3b5e9 100644
--- a/api/scaling_test.go
+++ b/api/scaling_test.go
@@ -24,7 +24,7 @@ func TestScalingPolicies_ListPolicies(t *testing.T) {
// Register a job with a scaling policy
job := testJob()
job.TaskGroups[0].Scaling = &ScalingPolicy{
- Max: int64ToPtr(100),
+ Max: pointerOf(int64(100)),
}
_, _, err = jobs.Register(job, nil)
require.NoError(err)
@@ -77,9 +77,9 @@ func TestScalingPolicies_GetPolicy(t *testing.T) {
// Register a job with a scaling policy
job := testJob()
policy := &ScalingPolicy{
- Enabled: boolToPtr(true),
- Min: int64ToPtr(1),
- Max: int64ToPtr(1),
+ Enabled: pointerOf(true),
+ Min: pointerOf(int64(1)),
+ Max: pointerOf(int64(1)),
Policy: map[string]interface{}{
"key": "value",
},
diff --git a/api/sentinel.go b/api/sentinel.go
index fdccd9f6b64..74c88dd6384 100644
--- a/api/sentinel.go
+++ b/api/sentinel.go
@@ -1,6 +1,8 @@
package api
-import "fmt"
+import (
+ "errors"
+)
// SentinelPolicies is used to query the Sentinel Policy endpoints.
type SentinelPolicies struct {
@@ -25,7 +27,7 @@ func (a *SentinelPolicies) List(q *QueryOptions) ([]*SentinelPolicyListStub, *Qu
// Upsert is used to create or update a policy
func (a *SentinelPolicies) Upsert(policy *SentinelPolicy, q *WriteOptions) (*WriteMeta, error) {
if policy == nil || policy.Name == "" {
- return nil, fmt.Errorf("missing policy name")
+ return nil, errors.New("missing policy name")
}
wm, err := a.client.write("/v1/sentinel/policy/"+policy.Name, policy, nil, q)
if err != nil {
@@ -37,7 +39,7 @@ func (a *SentinelPolicies) Upsert(policy *SentinelPolicy, q *WriteOptions) (*Wri
// Delete is used to delete a policy
func (a *SentinelPolicies) Delete(policyName string, q *WriteOptions) (*WriteMeta, error) {
if policyName == "" {
- return nil, fmt.Errorf("missing policy name")
+ return nil, errors.New("missing policy name")
}
wm, err := a.client.delete("/v1/sentinel/policy/"+policyName, nil, nil, q)
if err != nil {
@@ -49,7 +51,7 @@ func (a *SentinelPolicies) Delete(policyName string, q *WriteOptions) (*WriteMet
// Info is used to query a specific policy
func (a *SentinelPolicies) Info(policyName string, q *QueryOptions) (*SentinelPolicy, *QueryMeta, error) {
if policyName == "" {
- return nil, nil, fmt.Errorf("missing policy name")
+ return nil, nil, errors.New("missing policy name")
}
var resp SentinelPolicy
wm, err := a.client.query("/v1/sentinel/policy/"+policyName, &resp, q)
diff --git a/api/services.go b/api/services.go
index 55d2b01c278..8d9b4157bab 100644
--- a/api/services.go
+++ b/api/services.go
@@ -144,7 +144,7 @@ func (c *CheckRestart) Canonicalize() {
}
if c.Grace == nil {
- c.Grace = timeToPtr(1 * time.Second)
+ c.Grace = pointerOf(1 * time.Second)
}
}
diff --git a/api/services_test.go b/api/services_test.go
index 5de82e17f2a..c33fa429c33 100644
--- a/api/services_test.go
+++ b/api/services_test.go
@@ -24,8 +24,8 @@ func TestServiceRegistrations_Delete(t *testing.T) {
func TestService_Canonicalize(t *testing.T) {
testutil.Parallel(t)
- j := &Job{Name: stringToPtr("job")}
- tg := &TaskGroup{Name: stringToPtr("group")}
+ j := &Job{Name: pointerOf("job")}
+ tg := &TaskGroup{Name: pointerOf("group")}
task := &Task{Name: "task"}
s := &Service{
TaggedAddresses: make(map[string]string),
@@ -45,8 +45,8 @@ func TestService_Canonicalize(t *testing.T) {
func TestServiceCheck_Canonicalize(t *testing.T) {
testutil.Parallel(t)
- j := &Job{Name: stringToPtr("job")}
- tg := &TaskGroup{Name: stringToPtr("group")}
+ j := &Job{Name: pointerOf("job")}
+ tg := &TaskGroup{Name: pointerOf("group")}
task := &Task{Name: "task"}
s := &Service{
Checks: []ServiceCheck{
@@ -64,8 +64,8 @@ func TestServiceCheck_Canonicalize(t *testing.T) {
func TestService_Check_PassFail(t *testing.T) {
testutil.Parallel(t)
- job := &Job{Name: stringToPtr("job")}
- tg := &TaskGroup{Name: stringToPtr("group")}
+ job := &Job{Name: pointerOf("job")}
+ tg := &TaskGroup{Name: pointerOf("group")}
task := &Task{Name: "task"}
t.Run("enforce minimums", func(t *testing.T) {
@@ -100,13 +100,13 @@ func TestService_Check_PassFail(t *testing.T) {
func TestService_CheckRestart(t *testing.T) {
testutil.Parallel(t)
- job := &Job{Name: stringToPtr("job")}
- tg := &TaskGroup{Name: stringToPtr("group")}
+ job := &Job{Name: pointerOf("job")}
+ tg := &TaskGroup{Name: pointerOf("group")}
task := &Task{Name: "task"}
service := &Service{
CheckRestart: &CheckRestart{
Limit: 11,
- Grace: timeToPtr(11 * time.Second),
+ Grace: pointerOf(11 * time.Second),
IgnoreWarnings: true,
},
Checks: []ServiceCheck{
@@ -114,7 +114,7 @@ func TestService_CheckRestart(t *testing.T) {
Name: "all-set",
CheckRestart: &CheckRestart{
Limit: 22,
- Grace: timeToPtr(22 * time.Second),
+ Grace: pointerOf(22 * time.Second),
IgnoreWarnings: true,
},
},
@@ -122,7 +122,7 @@ func TestService_CheckRestart(t *testing.T) {
Name: "some-set",
CheckRestart: &CheckRestart{
Limit: 33,
- Grace: timeToPtr(33 * time.Second),
+ Grace: pointerOf(33 * time.Second),
},
},
{
@@ -148,8 +148,8 @@ func TestService_CheckRestart(t *testing.T) {
func TestService_Connect_proxy_settings(t *testing.T) {
testutil.Parallel(t)
- job := &Job{Name: stringToPtr("job")}
- tg := &TaskGroup{Name: stringToPtr("group")}
+ job := &Job{Name: pointerOf("job")}
+ tg := &TaskGroup{Name: pointerOf("group")}
task := &Task{Name: "task"}
service := &Service{
Connect: &ConsulConnect{
@@ -183,8 +183,8 @@ func TestService_Tags(t *testing.T) {
r := require.New(t)
// canonicalize does not modify eto or tags
- job := &Job{Name: stringToPtr("job")}
- tg := &TaskGroup{Name: stringToPtr("group")}
+ job := &Job{Name: pointerOf("job")}
+ tg := &TaskGroup{Name: pointerOf("group")}
task := &Task{Name: "task"}
service := &Service{
Tags: []string{"a", "b"},
diff --git a/api/tasks.go b/api/tasks.go
index 6cdb44da3a3..c8a1c0b3f1b 100644
--- a/api/tasks.go
+++ b/api/tasks.go
@@ -64,6 +64,24 @@ type AllocResourceUsage struct {
Timestamp int64
}
+// AllocCheckStatus contains the current status of a nomad service discovery check.
+type AllocCheckStatus struct {
+ ID string
+ Check string
+ Group string
+ Mode string
+ Output string
+ Service string
+ Task string
+ Status string
+ StatusCode int
+ Timestamp int64
+}
+
+// AllocCheckStatuses holds the set of nomad service discovery checks within
+// the allocation (including group and task level service checks).
+type AllocCheckStatuses map[string]AllocCheckStatus
+
// RestartPolicy defines how the Nomad client restarts
// tasks in a taskgroup when they fail
type RestartPolicy struct {
@@ -170,13 +188,13 @@ func NewAffinity(lTarget string, operand string, rTarget string, weight int8) *A
LTarget: lTarget,
RTarget: rTarget,
Operand: operand,
- Weight: int8ToPtr(weight),
+ Weight: pointerOf(int8(weight)),
}
}
func (a *Affinity) Canonicalize() {
if a.Weight == nil {
- a.Weight = int8ToPtr(50)
+ a.Weight = pointerOf(int8(50))
}
}
@@ -187,35 +205,35 @@ func NewDefaultReschedulePolicy(jobType string) *ReschedulePolicy {
// This needs to be in sync with DefaultServiceJobReschedulePolicy
// in nomad/structs/structs.go
dp = &ReschedulePolicy{
- Delay: timeToPtr(30 * time.Second),
- DelayFunction: stringToPtr("exponential"),
- MaxDelay: timeToPtr(1 * time.Hour),
- Unlimited: boolToPtr(true),
+ Delay: pointerOf(30 * time.Second),
+ DelayFunction: pointerOf("exponential"),
+ MaxDelay: pointerOf(1 * time.Hour),
+ Unlimited: pointerOf(true),
- Attempts: intToPtr(0),
- Interval: timeToPtr(0),
+ Attempts: pointerOf(0),
+ Interval: pointerOf(time.Duration(0)),
}
case "batch":
// This needs to be in sync with DefaultBatchJobReschedulePolicy
// in nomad/structs/structs.go
dp = &ReschedulePolicy{
- Attempts: intToPtr(1),
- Interval: timeToPtr(24 * time.Hour),
- Delay: timeToPtr(5 * time.Second),
- DelayFunction: stringToPtr("constant"),
+ Attempts: pointerOf(1),
+ Interval: pointerOf(24 * time.Hour),
+ Delay: pointerOf(5 * time.Second),
+ DelayFunction: pointerOf("constant"),
- MaxDelay: timeToPtr(0),
- Unlimited: boolToPtr(false),
+ MaxDelay: pointerOf(time.Duration(0)),
+ Unlimited: pointerOf(false),
}
case "system":
dp = &ReschedulePolicy{
- Attempts: intToPtr(0),
- Interval: timeToPtr(0),
- Delay: timeToPtr(0),
- DelayFunction: stringToPtr(""),
- MaxDelay: timeToPtr(0),
- Unlimited: boolToPtr(false),
+ Attempts: pointerOf(0),
+ Interval: pointerOf(time.Duration(0)),
+ Delay: pointerOf(time.Duration(0)),
+ DelayFunction: pointerOf(""),
+ MaxDelay: pointerOf(time.Duration(0)),
+ Unlimited: pointerOf(false),
}
default:
@@ -223,12 +241,12 @@ func NewDefaultReschedulePolicy(jobType string) *ReschedulePolicy {
// function and we need to ensure a non-nil object is returned so that
// the canonicalization runs without panicking.
dp = &ReschedulePolicy{
- Attempts: intToPtr(0),
- Interval: timeToPtr(0),
- Delay: timeToPtr(0),
- DelayFunction: stringToPtr(""),
- MaxDelay: timeToPtr(0),
- Unlimited: boolToPtr(false),
+ Attempts: pointerOf(0),
+ Interval: pointerOf(time.Duration(0)),
+ Delay: pointerOf(time.Duration(0)),
+ DelayFunction: pointerOf(""),
+ MaxDelay: pointerOf(time.Duration(0)),
+ Unlimited: pointerOf(false),
}
}
return dp
@@ -276,14 +294,14 @@ func NewSpreadTarget(value string, percent uint8) *SpreadTarget {
func NewSpread(attribute string, weight int8, spreadTargets []*SpreadTarget) *Spread {
return &Spread{
Attribute: attribute,
- Weight: int8ToPtr(weight),
+ Weight: pointerOf(int8(weight)),
SpreadTarget: spreadTargets,
}
}
func (s *Spread) Canonicalize() {
if s.Weight == nil {
- s.Weight = int8ToPtr(50)
+ s.Weight = pointerOf(int8(50))
}
}
@@ -296,21 +314,21 @@ type EphemeralDisk struct {
func DefaultEphemeralDisk() *EphemeralDisk {
return &EphemeralDisk{
- Sticky: boolToPtr(false),
- Migrate: boolToPtr(false),
- SizeMB: intToPtr(300),
+ Sticky: pointerOf(false),
+ Migrate: pointerOf(false),
+ SizeMB: pointerOf(300),
}
}
func (e *EphemeralDisk) Canonicalize() {
if e.Sticky == nil {
- e.Sticky = boolToPtr(false)
+ e.Sticky = pointerOf(false)
}
if e.Migrate == nil {
- e.Migrate = boolToPtr(false)
+ e.Migrate = pointerOf(false)
}
if e.SizeMB == nil {
- e.SizeMB = intToPtr(300)
+ e.SizeMB = pointerOf(300)
}
}
@@ -325,10 +343,10 @@ type MigrateStrategy struct {
func DefaultMigrateStrategy() *MigrateStrategy {
return &MigrateStrategy{
- MaxParallel: intToPtr(1),
- HealthCheck: stringToPtr("checks"),
- MinHealthyTime: timeToPtr(10 * time.Second),
- HealthyDeadline: timeToPtr(5 * time.Minute),
+ MaxParallel: pointerOf(1),
+ HealthCheck: pointerOf("checks"),
+ MinHealthyTime: pointerOf(10 * time.Second),
+ HealthyDeadline: pointerOf(5 * time.Minute),
}
}
@@ -405,10 +423,10 @@ type VolumeMount struct {
func (vm *VolumeMount) Canonicalize() {
if vm.PropagationMode == nil {
- vm.PropagationMode = stringToPtr(VolumeMountPropagationPrivate)
+ vm.PropagationMode = pointerOf(VolumeMountPropagationPrivate)
}
if vm.ReadOnly == nil {
- vm.ReadOnly = boolToPtr(false)
+ vm.ReadOnly = pointerOf(false)
}
}
@@ -439,22 +457,22 @@ type TaskGroup struct {
// NewTaskGroup creates a new TaskGroup.
func NewTaskGroup(name string, count int) *TaskGroup {
return &TaskGroup{
- Name: stringToPtr(name),
- Count: intToPtr(count),
+ Name: pointerOf(name),
+ Count: pointerOf(count),
}
}
// Canonicalize sets defaults and merges settings that should be inherited from the job
func (g *TaskGroup) Canonicalize(job *Job) {
if g.Name == nil {
- g.Name = stringToPtr("")
+ g.Name = pointerOf("")
}
if g.Count == nil {
if g.Scaling != nil && g.Scaling.Min != nil {
- g.Count = intToPtr(int(*g.Scaling.Min))
+ g.Count = pointerOf(int(*g.Scaling.Min))
} else {
- g.Count = intToPtr(1)
+ g.Count = pointerOf(1)
}
}
if g.Scaling != nil {
@@ -558,10 +576,10 @@ func (g *TaskGroup) Canonicalize(job *Job) {
// in nomad/structs/structs.go
func defaultServiceJobRestartPolicy() *RestartPolicy {
return &RestartPolicy{
- Delay: timeToPtr(15 * time.Second),
- Attempts: intToPtr(2),
- Interval: timeToPtr(30 * time.Minute),
- Mode: stringToPtr(RestartPolicyModeFail),
+ Delay: pointerOf(15 * time.Second),
+ Attempts: pointerOf(2),
+ Interval: pointerOf(30 * time.Minute),
+ Mode: pointerOf(RestartPolicyModeFail),
}
}
@@ -569,10 +587,10 @@ func defaultServiceJobRestartPolicy() *RestartPolicy {
// in nomad/structs/structs.go
func defaultBatchJobRestartPolicy() *RestartPolicy {
return &RestartPolicy{
- Delay: timeToPtr(15 * time.Second),
- Attempts: intToPtr(3),
- Interval: timeToPtr(24 * time.Hour),
- Mode: stringToPtr(RestartPolicyModeFail),
+ Delay: pointerOf(15 * time.Second),
+ Attempts: pointerOf(3),
+ Interval: pointerOf(24 * time.Hour),
+ Mode: pointerOf(RestartPolicyModeFail),
}
}
@@ -623,17 +641,17 @@ type LogConfig struct {
func DefaultLogConfig() *LogConfig {
return &LogConfig{
- MaxFiles: intToPtr(10),
- MaxFileSizeMB: intToPtr(10),
+ MaxFiles: pointerOf(10),
+ MaxFileSizeMB: pointerOf(10),
}
}
func (l *LogConfig) Canonicalize() {
if l.MaxFiles == nil {
- l.MaxFiles = intToPtr(10)
+ l.MaxFiles = pointerOf(10)
}
if l.MaxFileSizeMB == nil {
- l.MaxFileSizeMB = intToPtr(10)
+ l.MaxFileSizeMB = pointerOf(10)
}
}
@@ -694,7 +712,7 @@ func (t *Task) Canonicalize(tg *TaskGroup, job *Job) {
t.Resources.Canonicalize()
if t.KillTimeout == nil {
- t.KillTimeout = timeToPtr(5 * time.Second)
+ t.KillTimeout = pointerOf(5 * time.Second)
}
if t.LogConfig == nil {
t.LogConfig = DefaultLogConfig()
@@ -746,11 +764,11 @@ type TaskArtifact struct {
func (a *TaskArtifact) Canonicalize() {
if a.GetterMode == nil {
- a.GetterMode = stringToPtr("any")
+ a.GetterMode = pointerOf("any")
}
if a.GetterSource == nil {
// Shouldn't be possible, but we don't want to panic
- a.GetterSource = stringToPtr("")
+ a.GetterSource = pointerOf("")
}
if len(a.GetterOptions) == 0 {
a.GetterOptions = nil
@@ -768,7 +786,7 @@ func (a *TaskArtifact) Canonicalize() {
a.RelativeDest = &dest
default:
// Default to a directory
- a.RelativeDest = stringToPtr("local/")
+ a.RelativeDest = pointerOf("local/")
}
}
}
@@ -791,14 +809,39 @@ func (wc *WaitConfig) Copy() *WaitConfig {
return nwc
}
+type ChangeScript struct {
+ Command *string `mapstructure:"command" hcl:"command"`
+ Args []string `mapstructure:"args" hcl:"args,optional"`
+ Timeout *time.Duration `mapstructure:"timeout" hcl:"timeout,optional"`
+ FailOnError *bool `mapstructure:"fail_on_error" hcl:"fail_on_error"`
+}
+
+func (ch *ChangeScript) Canonicalize() {
+ if ch.Command == nil {
+ ch.Command = pointerOf("")
+ }
+ if ch.Args == nil {
+ ch.Args = []string{}
+ }
+ if ch.Timeout == nil {
+ ch.Timeout = pointerOf(5 * time.Second)
+ }
+ if ch.FailOnError == nil {
+ ch.FailOnError = pointerOf(false)
+ }
+}
+
type Template struct {
SourcePath *string `mapstructure:"source" hcl:"source,optional"`
DestPath *string `mapstructure:"destination" hcl:"destination,optional"`
EmbeddedTmpl *string `mapstructure:"data" hcl:"data,optional"`
ChangeMode *string `mapstructure:"change_mode" hcl:"change_mode,optional"`
+ ChangeScript *ChangeScript `mapstructure:"change_script" hcl:"change_script,block"`
ChangeSignal *string `mapstructure:"change_signal" hcl:"change_signal,optional"`
Splay *time.Duration `mapstructure:"splay" hcl:"splay,optional"`
Perms *string `mapstructure:"perms" hcl:"perms,optional"`
+ Uid *int `mapstructure:"uid" hcl:"uid,optional"`
+ Gid *int `mapstructure:"gid" hcl:"gid,optional"`
LeftDelim *string `mapstructure:"left_delimiter" hcl:"left_delimiter,optional"`
RightDelim *string `mapstructure:"right_delimiter" hcl:"right_delimiter,optional"`
Envvars *bool `mapstructure:"env" hcl:"env,optional"`
@@ -808,46 +851,49 @@ type Template struct {
func (tmpl *Template) Canonicalize() {
if tmpl.SourcePath == nil {
- tmpl.SourcePath = stringToPtr("")
+ tmpl.SourcePath = pointerOf("")
}
if tmpl.DestPath == nil {
- tmpl.DestPath = stringToPtr("")
+ tmpl.DestPath = pointerOf("")
}
if tmpl.EmbeddedTmpl == nil {
- tmpl.EmbeddedTmpl = stringToPtr("")
+ tmpl.EmbeddedTmpl = pointerOf("")
}
if tmpl.ChangeMode == nil {
- tmpl.ChangeMode = stringToPtr("restart")
+ tmpl.ChangeMode = pointerOf("restart")
}
if tmpl.ChangeSignal == nil {
if *tmpl.ChangeMode == "signal" {
- tmpl.ChangeSignal = stringToPtr("SIGHUP")
+ tmpl.ChangeSignal = pointerOf("SIGHUP")
} else {
- tmpl.ChangeSignal = stringToPtr("")
+ tmpl.ChangeSignal = pointerOf("")
}
} else {
sig := *tmpl.ChangeSignal
- tmpl.ChangeSignal = stringToPtr(strings.ToUpper(sig))
+ tmpl.ChangeSignal = pointerOf(strings.ToUpper(sig))
+ }
+ if tmpl.ChangeScript != nil {
+ tmpl.ChangeScript.Canonicalize()
}
if tmpl.Splay == nil {
- tmpl.Splay = timeToPtr(5 * time.Second)
+ tmpl.Splay = pointerOf(5 * time.Second)
}
if tmpl.Perms == nil {
- tmpl.Perms = stringToPtr("0644")
+ tmpl.Perms = pointerOf("0644")
}
if tmpl.LeftDelim == nil {
- tmpl.LeftDelim = stringToPtr("{{")
+ tmpl.LeftDelim = pointerOf("{{")
}
if tmpl.RightDelim == nil {
- tmpl.RightDelim = stringToPtr("}}")
+ tmpl.RightDelim = pointerOf("}}")
}
if tmpl.Envvars == nil {
- tmpl.Envvars = boolToPtr(false)
+ tmpl.Envvars = pointerOf(false)
}
//COMPAT(0.12) VaultGrace is deprecated and unused as of Vault 0.5
if tmpl.VaultGrace == nil {
- tmpl.VaultGrace = timeToPtr(0)
+ tmpl.VaultGrace = pointerOf(time.Duration(0))
}
}
@@ -861,16 +907,16 @@ type Vault struct {
func (v *Vault) Canonicalize() {
if v.Env == nil {
- v.Env = boolToPtr(true)
+ v.Env = pointerOf(true)
}
if v.Namespace == nil {
- v.Namespace = stringToPtr("")
+ v.Namespace = pointerOf("")
}
if v.ChangeMode == nil {
- v.ChangeMode = stringToPtr("restart")
+ v.ChangeMode = pointerOf("restart")
}
if v.ChangeSignal == nil {
- v.ChangeSignal = stringToPtr("SIGHUP")
+ v.ChangeSignal = pointerOf("SIGHUP")
}
}
@@ -1032,14 +1078,17 @@ type TaskCSIPluginConfig struct {
// CSIPluginType instructs Nomad on how to handle processing a plugin
Type CSIPluginType `mapstructure:"type" hcl:"type,optional"`
- // MountDir is the destination that nomad should mount in its CSI
- // directory for the plugin. It will then expect a file called CSISocketName
- // to be created by the plugin, and will provide references into
- // "MountDir/CSIIntermediaryDirname/VolumeName/AllocID for mounts.
- //
- // Default is /csi.
+ // MountDir is the directory (within its container) in which the plugin creates a
+ // socket (called CSISocketName) for communication with Nomad. Default is /csi.
MountDir string `mapstructure:"mount_dir" hcl:"mount_dir,optional"`
+ // StagePublishBaseDir is the base directory (within its container) in which the plugin
+ // mounts volumes being staged and bind mounts volumes being published.
+ // e.g. staging_target_path = {StagePublishBaseDir}/staging/{volume-id}/{usage-mode}
+ // e.g. target_path = {StagePublishBaseDir}/per-alloc/{alloc-id}/{volume-id}/{usage-mode}
+ // Default is /local/csi.
+ StagePublishBaseDir string `mapstructure:"stage_publish_base_dir" hcl:"stage_publish_base_dir,optional"`
+
// HealthTimeout is the time after which the CSI plugin tasks will be killed
// if the CSI Plugin is not healthy.
HealthTimeout time.Duration `mapstructure:"health_timeout" hcl:"health_timeout,optional"`
@@ -1050,6 +1099,10 @@ func (t *TaskCSIPluginConfig) Canonicalize() {
t.MountDir = "/csi"
}
+ if t.StagePublishBaseDir == "" {
+ t.StagePublishBaseDir = filepath.Join("/local", "csi")
+ }
+
if t.HealthTimeout == 0 {
t.HealthTimeout = 30 * time.Second
}
diff --git a/api/tasks_test.go b/api/tasks_test.go
index 02e20506a6e..b0312263d0e 100644
--- a/api/tasks_test.go
+++ b/api/tasks_test.go
@@ -15,8 +15,8 @@ func TestTaskGroup_NewTaskGroup(t *testing.T) {
testutil.Parallel(t)
grp := NewTaskGroup("grp1", 2)
expect := &TaskGroup{
- Name: stringToPtr("grp1"),
- Count: intToPtr(2),
+ Name: pointerOf("grp1"),
+ Count: pointerOf(2),
}
if !reflect.DeepEqual(grp, expect) {
t.Fatalf("expect: %#v, got: %#v", expect, grp)
@@ -79,13 +79,13 @@ func TestTaskGroup_AddAffinity(t *testing.T) {
LTarget: "kernel.version",
RTarget: "4.6",
Operand: "=",
- Weight: int8ToPtr(100),
+ Weight: pointerOf(int8(100)),
},
{
LTarget: "${node.affinity}",
RTarget: "dc2",
Operand: "=",
- Weight: int8ToPtr(50),
+ Weight: pointerOf(int8(50)),
},
}
if !reflect.DeepEqual(grp.Affinities, expect) {
@@ -143,7 +143,7 @@ func TestTaskGroup_AddSpread(t *testing.T) {
expect := []*Spread{
{
Attribute: "${meta.rack}",
- Weight: int8ToPtr(100),
+ Weight: pointerOf(int8(100)),
SpreadTarget: []*SpreadTarget{
{
Value: "r1",
@@ -153,7 +153,7 @@ func TestTaskGroup_AddSpread(t *testing.T) {
},
{
Attribute: "${node.datacenter}",
- Weight: int8ToPtr(100),
+ Weight: pointerOf(int8(100)),
SpreadTarget: []*SpreadTarget{
{
Value: "dc1",
@@ -263,13 +263,13 @@ func TestTask_Require(t *testing.T) {
// Create some require resources
resources := &Resources{
- CPU: intToPtr(1250),
- MemoryMB: intToPtr(128),
- DiskMB: intToPtr(2048),
+ CPU: pointerOf(1250),
+ MemoryMB: pointerOf(128),
+ DiskMB: pointerOf(2048),
Networks: []*NetworkResource{
{
CIDR: "0.0.0.0/0",
- MBits: intToPtr(100),
+ MBits: pointerOf(100),
ReservedPorts: []Port{{"", 80, 0, ""}, {"", 443, 0, ""}},
},
},
@@ -340,13 +340,13 @@ func TestTask_AddAffinity(t *testing.T) {
LTarget: "kernel.version",
RTarget: "4.6",
Operand: "=",
- Weight: int8ToPtr(100),
+ Weight: pointerOf(int8(100)),
},
{
LTarget: "${node.datacenter}",
RTarget: "dc2",
Operand: "=",
- Weight: int8ToPtr(50),
+ Weight: pointerOf(int8(50)),
},
}
if !reflect.DeepEqual(task.Affinities, expect) {
@@ -357,8 +357,8 @@ func TestTask_AddAffinity(t *testing.T) {
func TestTask_Artifact(t *testing.T) {
testutil.Parallel(t)
a := TaskArtifact{
- GetterSource: stringToPtr("http://localhost/foo.txt"),
- GetterMode: stringToPtr("file"),
+ GetterSource: pointerOf("http://localhost/foo.txt"),
+ GetterMode: pointerOf("file"),
GetterHeaders: make(map[string]string),
GetterOptions: make(map[string]string),
}
@@ -396,10 +396,10 @@ func TestTask_Canonicalize_TaskLifecycle(t *testing.T) {
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
tg := &TaskGroup{
- Name: stringToPtr("foo"),
+ Name: pointerOf("foo"),
}
j := &Job{
- ID: stringToPtr("test"),
+ ID: pointerOf("test"),
}
tc.task.Canonicalize(tg, j)
require.Equal(t, tc.expected, tc.task.Lifecycle)
@@ -429,16 +429,16 @@ func TestTask_Template_WaitConfig_Canonicalize_and_Copy(t *testing.T) {
{
name: "all-fields",
task: taskWithWait(&WaitConfig{
- Min: timeToPtr(5),
- Max: timeToPtr(10),
+ Min: pointerOf(time.Duration(5)),
+ Max: pointerOf(time.Duration(10)),
}),
canonicalized: &WaitConfig{
- Min: timeToPtr(5),
- Max: timeToPtr(10),
+ Min: pointerOf(time.Duration(5)),
+ Max: pointerOf(time.Duration(10)),
},
copied: &WaitConfig{
- Min: timeToPtr(5),
- Max: timeToPtr(10),
+ Min: pointerOf(time.Duration(5)),
+ Max: pointerOf(time.Duration(10)),
},
},
{
@@ -456,25 +456,25 @@ func TestTask_Template_WaitConfig_Canonicalize_and_Copy(t *testing.T) {
{
name: "min-only",
task: taskWithWait(&WaitConfig{
- Min: timeToPtr(5),
+ Min: pointerOf(time.Duration(5)),
}),
canonicalized: &WaitConfig{
- Min: timeToPtr(5),
+ Min: pointerOf(time.Duration(5)),
},
copied: &WaitConfig{
- Min: timeToPtr(5),
+ Min: pointerOf(time.Duration(5)),
},
},
{
name: "max-only",
task: taskWithWait(&WaitConfig{
- Max: timeToPtr(10),
+ Max: pointerOf(time.Duration(10)),
}),
canonicalized: &WaitConfig{
- Max: timeToPtr(10),
+ Max: pointerOf(time.Duration(10)),
},
copied: &WaitConfig{
- Max: timeToPtr(10),
+ Max: pointerOf(time.Duration(10)),
},
},
}
@@ -482,10 +482,10 @@ func TestTask_Template_WaitConfig_Canonicalize_and_Copy(t *testing.T) {
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
tg := &TaskGroup{
- Name: stringToPtr("foo"),
+ Name: pointerOf("foo"),
}
j := &Job{
- ID: stringToPtr("test"),
+ ID: pointerOf("test"),
}
require.Equal(t, tc.copied, tc.task.Templates[0].Wait.Copy())
tc.task.Canonicalize(tg, j)
@@ -504,10 +504,10 @@ func TestTask_Canonicalize_Vault(t *testing.T) {
name: "empty",
input: &Vault{},
expected: &Vault{
- Env: boolToPtr(true),
- Namespace: stringToPtr(""),
- ChangeMode: stringToPtr("restart"),
- ChangeSignal: stringToPtr("SIGHUP"),
+ Env: pointerOf(true),
+ Namespace: pointerOf(""),
+ ChangeMode: pointerOf("restart"),
+ ChangeSignal: pointerOf("SIGHUP"),
},
},
}
@@ -525,22 +525,22 @@ func TestTaskGroup_Canonicalize_Update(t *testing.T) {
testutil.Parallel(t)
// Job with an Empty() Update
job := &Job{
- ID: stringToPtr("test"),
+ ID: pointerOf("test"),
Update: &UpdateStrategy{
- AutoRevert: boolToPtr(false),
- AutoPromote: boolToPtr(false),
- Canary: intToPtr(0),
- HealthCheck: stringToPtr(""),
- HealthyDeadline: timeToPtr(0),
- ProgressDeadline: timeToPtr(0),
- MaxParallel: intToPtr(0),
- MinHealthyTime: timeToPtr(0),
- Stagger: timeToPtr(0),
+ AutoRevert: pointerOf(false),
+ AutoPromote: pointerOf(false),
+ Canary: pointerOf(0),
+ HealthCheck: pointerOf(""),
+ HealthyDeadline: pointerOf(time.Duration(0)),
+ ProgressDeadline: pointerOf(time.Duration(0)),
+ MaxParallel: pointerOf(0),
+ MinHealthyTime: pointerOf(time.Duration(0)),
+ Stagger: pointerOf(time.Duration(0)),
},
}
job.Canonicalize()
tg := &TaskGroup{
- Name: stringToPtr("foo"),
+ Name: pointerOf("foo"),
}
tg.Canonicalize(job)
assert.NotNil(t, job.Update)
@@ -552,15 +552,15 @@ func TestTaskGroup_Canonicalize_Scaling(t *testing.T) {
require := require.New(t)
job := &Job{
- ID: stringToPtr("test"),
+ ID: pointerOf("test"),
}
job.Canonicalize()
tg := &TaskGroup{
- Name: stringToPtr("foo"),
+ Name: pointerOf("foo"),
Count: nil,
Scaling: &ScalingPolicy{
Min: nil,
- Max: int64ToPtr(10),
+ Max: pointerOf(int64(10)),
Policy: nil,
Enabled: nil,
CreateIndex: 0,
@@ -578,7 +578,7 @@ func TestTaskGroup_Canonicalize_Scaling(t *testing.T) {
// count == nil => count = Scaling.Min
tg.Count = nil
- tg.Scaling.Min = int64ToPtr(5)
+ tg.Scaling.Min = pointerOf(int64(5))
tg.Canonicalize(job)
require.NotNil(tg.Count)
require.NotNil(tg.Scaling.Min)
@@ -586,7 +586,7 @@ func TestTaskGroup_Canonicalize_Scaling(t *testing.T) {
require.EqualValues(*tg.Count, *tg.Scaling.Min)
// Scaling.Min == nil => Scaling.Min == count
- tg.Count = intToPtr(5)
+ tg.Count = pointerOf(5)
tg.Scaling.Min = nil
tg.Canonicalize(job)
require.NotNil(tg.Count)
@@ -595,8 +595,8 @@ func TestTaskGroup_Canonicalize_Scaling(t *testing.T) {
require.EqualValues(*tg.Scaling.Min, *tg.Count)
// both present, both persisted
- tg.Count = intToPtr(5)
- tg.Scaling.Min = int64ToPtr(1)
+ tg.Count = pointerOf(5)
+ tg.Scaling.Min = pointerOf(int64(1))
tg.Canonicalize(job)
require.NotNil(tg.Count)
require.NotNil(tg.Scaling.Min)
@@ -607,32 +607,32 @@ func TestTaskGroup_Canonicalize_Scaling(t *testing.T) {
func TestTaskGroup_Merge_Update(t *testing.T) {
testutil.Parallel(t)
job := &Job{
- ID: stringToPtr("test"),
+ ID: pointerOf("test"),
Update: &UpdateStrategy{},
}
job.Canonicalize()
// Merge and canonicalize part of an update stanza
tg := &TaskGroup{
- Name: stringToPtr("foo"),
+ Name: pointerOf("foo"),
Update: &UpdateStrategy{
- AutoRevert: boolToPtr(true),
- Canary: intToPtr(5),
- HealthCheck: stringToPtr("foo"),
+ AutoRevert: pointerOf(true),
+ Canary: pointerOf(5),
+ HealthCheck: pointerOf("foo"),
},
}
tg.Canonicalize(job)
require.Equal(t, &UpdateStrategy{
- AutoRevert: boolToPtr(true),
- AutoPromote: boolToPtr(false),
- Canary: intToPtr(5),
- HealthCheck: stringToPtr("foo"),
- HealthyDeadline: timeToPtr(5 * time.Minute),
- ProgressDeadline: timeToPtr(10 * time.Minute),
- MaxParallel: intToPtr(1),
- MinHealthyTime: timeToPtr(10 * time.Second),
- Stagger: timeToPtr(30 * time.Second),
+ AutoRevert: pointerOf(true),
+ AutoPromote: pointerOf(false),
+ Canary: pointerOf(5),
+ HealthCheck: pointerOf("foo"),
+ HealthyDeadline: pointerOf(5 * time.Minute),
+ ProgressDeadline: pointerOf(10 * time.Minute),
+ MaxParallel: pointerOf(1),
+ MinHealthyTime: pointerOf(10 * time.Second),
+ Stagger: pointerOf(30 * time.Second),
}, tg.Update)
}
@@ -661,44 +661,44 @@ func TestTaskGroup_Canonicalize_MigrateStrategy(t *testing.T) {
jobMigrate: nil,
taskMigrate: nil,
expected: &MigrateStrategy{
- MaxParallel: intToPtr(1),
- HealthCheck: stringToPtr("checks"),
- MinHealthyTime: timeToPtr(10 * time.Second),
- HealthyDeadline: timeToPtr(5 * time.Minute),
+ MaxParallel: pointerOf(1),
+ HealthCheck: pointerOf("checks"),
+ MinHealthyTime: pointerOf(10 * time.Second),
+ HealthyDeadline: pointerOf(5 * time.Minute),
},
},
{
desc: "Empty job migrate strategy",
jobType: "service",
jobMigrate: &MigrateStrategy{
- MaxParallel: intToPtr(0),
- HealthCheck: stringToPtr(""),
- MinHealthyTime: timeToPtr(0),
- HealthyDeadline: timeToPtr(0),
+ MaxParallel: pointerOf(0),
+ HealthCheck: pointerOf(""),
+ MinHealthyTime: pointerOf(time.Duration(0)),
+ HealthyDeadline: pointerOf(time.Duration(0)),
},
taskMigrate: nil,
expected: &MigrateStrategy{
- MaxParallel: intToPtr(0),
- HealthCheck: stringToPtr(""),
- MinHealthyTime: timeToPtr(0),
- HealthyDeadline: timeToPtr(0),
+ MaxParallel: pointerOf(0),
+ HealthCheck: pointerOf(""),
+ MinHealthyTime: pointerOf(time.Duration(0)),
+ HealthyDeadline: pointerOf(time.Duration(0)),
},
},
{
desc: "Inherit from job",
jobType: "service",
jobMigrate: &MigrateStrategy{
- MaxParallel: intToPtr(3),
- HealthCheck: stringToPtr("checks"),
- MinHealthyTime: timeToPtr(2),
- HealthyDeadline: timeToPtr(2),
+ MaxParallel: pointerOf(3),
+ HealthCheck: pointerOf("checks"),
+ MinHealthyTime: pointerOf(time.Duration(2)),
+ HealthyDeadline: pointerOf(time.Duration(2)),
},
taskMigrate: nil,
expected: &MigrateStrategy{
- MaxParallel: intToPtr(3),
- HealthCheck: stringToPtr("checks"),
- MinHealthyTime: timeToPtr(2),
- HealthyDeadline: timeToPtr(2),
+ MaxParallel: pointerOf(3),
+ HealthCheck: pointerOf("checks"),
+ MinHealthyTime: pointerOf(time.Duration(2)),
+ HealthyDeadline: pointerOf(time.Duration(2)),
},
},
{
@@ -706,67 +706,67 @@ func TestTaskGroup_Canonicalize_MigrateStrategy(t *testing.T) {
jobType: "service",
jobMigrate: nil,
taskMigrate: &MigrateStrategy{
- MaxParallel: intToPtr(3),
- HealthCheck: stringToPtr("checks"),
- MinHealthyTime: timeToPtr(2),
- HealthyDeadline: timeToPtr(2),
+ MaxParallel: pointerOf(3),
+ HealthCheck: pointerOf("checks"),
+ MinHealthyTime: pointerOf(time.Duration(2)),
+ HealthyDeadline: pointerOf(time.Duration(2)),
},
expected: &MigrateStrategy{
- MaxParallel: intToPtr(3),
- HealthCheck: stringToPtr("checks"),
- MinHealthyTime: timeToPtr(2),
- HealthyDeadline: timeToPtr(2),
+ MaxParallel: pointerOf(3),
+ HealthCheck: pointerOf("checks"),
+ MinHealthyTime: pointerOf(time.Duration(2)),
+ HealthyDeadline: pointerOf(time.Duration(2)),
},
},
{
desc: "Merge from job",
jobType: "service",
jobMigrate: &MigrateStrategy{
- MaxParallel: intToPtr(11),
+ MaxParallel: pointerOf(11),
},
taskMigrate: &MigrateStrategy{
- HealthCheck: stringToPtr("checks"),
- MinHealthyTime: timeToPtr(2),
- HealthyDeadline: timeToPtr(2),
+ HealthCheck: pointerOf("checks"),
+ MinHealthyTime: pointerOf(time.Duration(2)),
+ HealthyDeadline: pointerOf(time.Duration(2)),
},
expected: &MigrateStrategy{
- MaxParallel: intToPtr(11),
- HealthCheck: stringToPtr("checks"),
- MinHealthyTime: timeToPtr(2),
- HealthyDeadline: timeToPtr(2),
+ MaxParallel: pointerOf(11),
+ HealthCheck: pointerOf("checks"),
+ MinHealthyTime: pointerOf(time.Duration(2)),
+ HealthyDeadline: pointerOf(time.Duration(2)),
},
},
{
desc: "Override from group",
jobType: "service",
jobMigrate: &MigrateStrategy{
- MaxParallel: intToPtr(11),
+ MaxParallel: pointerOf(11),
},
taskMigrate: &MigrateStrategy{
- MaxParallel: intToPtr(5),
- HealthCheck: stringToPtr("checks"),
- MinHealthyTime: timeToPtr(2),
- HealthyDeadline: timeToPtr(2),
+ MaxParallel: pointerOf(5),
+ HealthCheck: pointerOf("checks"),
+ MinHealthyTime: pointerOf(time.Duration(2)),
+ HealthyDeadline: pointerOf(time.Duration(2)),
},
expected: &MigrateStrategy{
- MaxParallel: intToPtr(5),
- HealthCheck: stringToPtr("checks"),
- MinHealthyTime: timeToPtr(2),
- HealthyDeadline: timeToPtr(2),
+ MaxParallel: pointerOf(5),
+ HealthCheck: pointerOf("checks"),
+ MinHealthyTime: pointerOf(time.Duration(2)),
+ HealthyDeadline: pointerOf(time.Duration(2)),
},
},
{
desc: "Parallel from job, defaulting",
jobType: "service",
jobMigrate: &MigrateStrategy{
- MaxParallel: intToPtr(5),
+ MaxParallel: pointerOf(5),
},
taskMigrate: nil,
expected: &MigrateStrategy{
- MaxParallel: intToPtr(5),
- HealthCheck: stringToPtr("checks"),
- MinHealthyTime: timeToPtr(10 * time.Second),
- HealthyDeadline: timeToPtr(5 * time.Minute),
+ MaxParallel: pointerOf(5),
+ HealthCheck: pointerOf("checks"),
+ MinHealthyTime: pointerOf(10 * time.Second),
+ HealthyDeadline: pointerOf(5 * time.Minute),
},
},
}
@@ -774,13 +774,13 @@ func TestTaskGroup_Canonicalize_MigrateStrategy(t *testing.T) {
for _, tc := range testCases {
t.Run(tc.desc, func(t *testing.T) {
job := &Job{
- ID: stringToPtr("test"),
+ ID: pointerOf("test"),
Migrate: tc.jobMigrate,
- Type: stringToPtr(tc.jobType),
+ Type: pointerOf(tc.jobType),
}
job.Canonicalize()
tg := &TaskGroup{
- Name: stringToPtr("foo"),
+ Name: pointerOf("foo"),
Migrate: tc.taskMigrate,
}
tg.Canonicalize(job)
@@ -793,12 +793,12 @@ func TestTaskGroup_Canonicalize_MigrateStrategy(t *testing.T) {
func TestSpread_Canonicalize(t *testing.T) {
testutil.Parallel(t)
job := &Job{
- ID: stringToPtr("test"),
- Type: stringToPtr("batch"),
+ ID: pointerOf("test"),
+ Type: pointerOf("batch"),
}
job.Canonicalize()
tg := &TaskGroup{
- Name: stringToPtr("foo"),
+ Name: pointerOf("foo"),
}
type testCase struct {
desc string
@@ -818,7 +818,7 @@ func TestSpread_Canonicalize(t *testing.T) {
"Zero spread",
&Spread{
Attribute: "test",
- Weight: int8ToPtr(0),
+ Weight: pointerOf(int8(0)),
},
0,
},
@@ -826,7 +826,7 @@ func TestSpread_Canonicalize(t *testing.T) {
"Non Zero spread",
&Spread{
Attribute: "test",
- Weight: int8ToPtr(100),
+ Weight: pointerOf(int8(100)),
},
100,
},
@@ -854,48 +854,48 @@ func Test_NewDefaultReschedulePolicy(t *testing.T) {
desc: "service job type",
inputJobType: "service",
expected: &ReschedulePolicy{
- Attempts: intToPtr(0),
- Interval: timeToPtr(0),
- Delay: timeToPtr(30 * time.Second),
- DelayFunction: stringToPtr("exponential"),
- MaxDelay: timeToPtr(1 * time.Hour),
- Unlimited: boolToPtr(true),
+ Attempts: pointerOf(0),
+ Interval: pointerOf(time.Duration(0)),
+ Delay: pointerOf(30 * time.Second),
+ DelayFunction: pointerOf("exponential"),
+ MaxDelay: pointerOf(1 * time.Hour),
+ Unlimited: pointerOf(true),
},
},
{
desc: "batch job type",
inputJobType: "batch",
expected: &ReschedulePolicy{
- Attempts: intToPtr(1),
- Interval: timeToPtr(24 * time.Hour),
- Delay: timeToPtr(5 * time.Second),
- DelayFunction: stringToPtr("constant"),
- MaxDelay: timeToPtr(0),
- Unlimited: boolToPtr(false),
+ Attempts: pointerOf(1),
+ Interval: pointerOf(24 * time.Hour),
+ Delay: pointerOf(5 * time.Second),
+ DelayFunction: pointerOf("constant"),
+ MaxDelay: pointerOf(time.Duration(0)),
+ Unlimited: pointerOf(false),
},
},
{
desc: "system job type",
inputJobType: "system",
expected: &ReschedulePolicy{
- Attempts: intToPtr(0),
- Interval: timeToPtr(0),
- Delay: timeToPtr(0),
- DelayFunction: stringToPtr(""),
- MaxDelay: timeToPtr(0),
- Unlimited: boolToPtr(false),
+ Attempts: pointerOf(0),
+ Interval: pointerOf(time.Duration(0)),
+ Delay: pointerOf(time.Duration(0)),
+ DelayFunction: pointerOf(""),
+ MaxDelay: pointerOf(time.Duration(0)),
+ Unlimited: pointerOf(false),
},
},
{
desc: "unrecognised job type",
inputJobType: "unrecognised",
expected: &ReschedulePolicy{
- Attempts: intToPtr(0),
- Interval: timeToPtr(0),
- Delay: timeToPtr(0),
- DelayFunction: stringToPtr(""),
- MaxDelay: timeToPtr(0),
- Unlimited: boolToPtr(false),
+ Attempts: pointerOf(0),
+ Interval: pointerOf(time.Duration(0)),
+ Delay: pointerOf(time.Duration(0)),
+ DelayFunction: pointerOf(""),
+ MaxDelay: pointerOf(time.Duration(0)),
+ Unlimited: pointerOf(false),
},
},
}
@@ -912,13 +912,13 @@ func TestTaskGroup_Canonicalize_Consul(t *testing.T) {
testutil.Parallel(t)
t.Run("override job consul in group", func(t *testing.T) {
job := &Job{
- ID: stringToPtr("job"),
- ConsulNamespace: stringToPtr("ns1"),
+ ID: pointerOf("job"),
+ ConsulNamespace: pointerOf("ns1"),
}
job.Canonicalize()
tg := &TaskGroup{
- Name: stringToPtr("group"),
+ Name: pointerOf("group"),
Consul: &Consul{Namespace: "ns2"},
}
tg.Canonicalize(job)
@@ -929,13 +929,13 @@ func TestTaskGroup_Canonicalize_Consul(t *testing.T) {
t.Run("inherit job consul in group", func(t *testing.T) {
job := &Job{
- ID: stringToPtr("job"),
- ConsulNamespace: stringToPtr("ns1"),
+ ID: pointerOf("job"),
+ ConsulNamespace: pointerOf("ns1"),
}
job.Canonicalize()
tg := &TaskGroup{
- Name: stringToPtr("group"),
+ Name: pointerOf("group"),
Consul: nil, // not set, inherit from job
}
tg.Canonicalize(job)
@@ -946,13 +946,13 @@ func TestTaskGroup_Canonicalize_Consul(t *testing.T) {
t.Run("set in group only", func(t *testing.T) {
job := &Job{
- ID: stringToPtr("job"),
+ ID: pointerOf("job"),
ConsulNamespace: nil,
}
job.Canonicalize()
tg := &TaskGroup{
- Name: stringToPtr("group"),
+ Name: pointerOf("group"),
Consul: &Consul{Namespace: "ns2"},
}
tg.Canonicalize(job)
diff --git a/api/util_test.go b/api/util_test.go
index 7e5f2e1b575..efaecdf498e 100644
--- a/api/util_test.go
+++ b/api/util_test.go
@@ -27,18 +27,18 @@ func testJob() *Job {
task := NewTask("task1", "raw_exec").
SetConfig("command", "/bin/sleep").
Require(&Resources{
- CPU: intToPtr(100),
- MemoryMB: intToPtr(256),
+ CPU: pointerOf(100),
+ MemoryMB: pointerOf(256),
}).
SetLogConfig(&LogConfig{
- MaxFiles: intToPtr(1),
- MaxFileSizeMB: intToPtr(2),
+ MaxFiles: pointerOf(1),
+ MaxFileSizeMB: pointerOf(2),
})
group := NewTaskGroup("group1", 1).
AddTask(task).
RequireDisk(&EphemeralDisk{
- SizeMB: intToPtr(25),
+ SizeMB: pointerOf(25),
})
job := NewBatchJob("job1", "redis", "global", 1).
@@ -52,18 +52,18 @@ func testJobWithScalingPolicy() *Job {
job := testJob()
job.TaskGroups[0].Scaling = &ScalingPolicy{
Policy: map[string]interface{}{},
- Min: int64ToPtr(1),
- Max: int64ToPtr(5),
- Enabled: boolToPtr(true),
+ Min: pointerOf(int64(1)),
+ Max: pointerOf(int64(5)),
+ Enabled: pointerOf(true),
}
return job
}
func testPeriodicJob() *Job {
job := testJob().AddPeriodicConfig(&PeriodicConfig{
- Enabled: boolToPtr(true),
- Spec: stringToPtr("*/30 * * * *"),
- SpecType: stringToPtr("cron"),
+ Enabled: pointerOf(true),
+ Spec: pointerOf("*/30 * * * *"),
+ SpecType: pointerOf("cron"),
})
return job
}
@@ -109,8 +109,8 @@ func testQuotaSpec() *QuotaSpec {
{
Region: "global",
RegionLimit: &Resources{
- CPU: intToPtr(2000),
- MemoryMB: intToPtr(2000),
+ CPU: pointerOf(2000),
+ MemoryMB: pointerOf(2000),
},
},
},
diff --git a/api/utils.go b/api/utils.go
index 9e54306f6b6..a8e1c02e456 100644
--- a/api/utils.go
+++ b/api/utils.go
@@ -3,44 +3,8 @@ package api
import (
"strconv"
"strings"
- "time"
)
-// boolToPtr returns the pointer to a boolean
-func boolToPtr(b bool) *bool {
- return &b
-}
-
-// int8ToPtr returns the pointer to an int8
-func int8ToPtr(i int8) *int8 {
- return &i
-}
-
-// intToPtr returns the pointer to an int
-func intToPtr(i int) *int {
- return &i
-}
-
-// uint64ToPtr returns the pointer to an uint64
-func uint64ToPtr(u uint64) *uint64 {
- return &u
-}
-
-// int64ToPtr returns the pointer to a int64
-func int64ToPtr(i int64) *int64 {
- return &i
-}
-
-// stringToPtr returns the pointer to a string
-func stringToPtr(str string) *string {
- return &str
-}
-
-// timeToPtr returns the pointer to a time stamp
-func timeToPtr(t time.Duration) *time.Duration {
- return &t
-}
-
// formatFloat converts the floating-point number f to a string,
// after rounding it to the passed unit.
//
@@ -61,3 +25,8 @@ func formatFloat(f float64, maxPrec int) string {
return v[:sublen]
}
+
+// pointerOf returns a pointer to a.
+func pointerOf[A any](a A) *A {
+ return &a
+}
diff --git a/api/utils_test.go b/api/utils_test.go
index 7e0d789bda5..969b1562bb4 100644
--- a/api/utils_test.go
+++ b/api/utils_test.go
@@ -4,6 +4,7 @@ import (
"testing"
"github.com/hashicorp/nomad/api/internal/testutil"
+ "github.com/shoenig/test/must"
"github.com/stretchr/testify/require"
)
@@ -39,3 +40,14 @@ func TestFormatRoundedFloat(t *testing.T) {
require.Equal(t, c.expected, formatFloat(c.input, 3))
}
}
+
+func Test_PointerOf(t *testing.T) {
+ s := "hello"
+ sPtr := pointerOf(s)
+
+ must.Eq(t, s, *sPtr)
+
+ b := "bye"
+ sPtr = &b
+ must.NotEq(t, s, *sPtr)
+}
diff --git a/client/acl.go b/client/acl.go
index 43d994bc4dd..bf666fbaa05 100644
--- a/client/acl.go
+++ b/client/acl.go
@@ -81,7 +81,7 @@ func (c *Client) ResolveSecretToken(secretID string) (*structs.ACLToken, error)
func (c *Client) resolveTokenAndACL(secretID string) (*acl.ACL, *structs.ACLToken, error) {
// Fast-path if ACLs are disabled
- if !c.config.ACLEnabled {
+ if !c.GetConfig().ACLEnabled {
return nil, nil, nil
}
defer metrics.MeasureSince([]string{"client", "acl", "resolve_token"}, time.Now())
@@ -127,7 +127,7 @@ func (c *Client) resolveTokenValue(secretID string) (*structs.ACLToken, error) {
raw, ok := c.tokenCache.Get(secretID)
if ok {
cached := raw.(*cachedACLValue)
- if cached.Age() <= c.config.ACLTokenTTL {
+ if cached.Age() <= c.GetConfig().ACLTokenTTL {
return cached.Token, nil
}
}
@@ -179,7 +179,7 @@ func (c *Client) resolvePolicies(secretID string, policies []string) ([]*structs
// Check if the cached value is valid or expired
cached := raw.(*cachedACLValue)
- if cached.Age() <= c.config.ACLPolicyTTL {
+ if cached.Age() <= c.GetConfig().ACLPolicyTTL {
out = append(out, cached.Policy)
} else {
expired = append(expired, cached.Policy)
diff --git a/client/agent_endpoint.go b/client/agent_endpoint.go
index 12993c4985c..6508fbebe1c 100644
--- a/client/agent_endpoint.go
+++ b/client/agent_endpoint.go
@@ -12,7 +12,7 @@ import (
"github.com/hashicorp/nomad/command/agent/host"
"github.com/hashicorp/nomad/command/agent/monitor"
"github.com/hashicorp/nomad/command/agent/pprof"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/nomad/structs"
metrics "github.com/armon/go-metrics"
@@ -42,7 +42,7 @@ func (a *Agent) Profile(args *structs.AgentPprofRequest, reply *structs.AgentPpr
}
// If ACLs are disabled, EnableDebug must be enabled
- if aclObj == nil && !a.c.config.EnableDebug {
+ if aclObj == nil && !a.c.GetConfig().EnableDebug {
return structs.ErrPermissionDenied
}
@@ -89,16 +89,16 @@ func (a *Agent) monitor(conn io.ReadWriteCloser) {
encoder := codec.NewEncoder(conn, structs.MsgpackHandle)
if err := decoder.Decode(&args); err != nil {
- handleStreamResultError(err, helper.Int64ToPtr(500), encoder)
+ handleStreamResultError(err, pointer.Of(int64(500)), encoder)
return
}
// Check acl
if aclObj, err := a.c.ResolveToken(args.AuthToken); err != nil {
- handleStreamResultError(err, helper.Int64ToPtr(403), encoder)
+ handleStreamResultError(err, pointer.Of(int64(403)), encoder)
return
} else if aclObj != nil && !aclObj.AllowAgentRead() {
- handleStreamResultError(structs.ErrPermissionDenied, helper.Int64ToPtr(403), encoder)
+ handleStreamResultError(structs.ErrPermissionDenied, pointer.Of(int64(403)), encoder)
return
}
@@ -108,7 +108,7 @@ func (a *Agent) monitor(conn io.ReadWriteCloser) {
}
if logLevel == log.NoLevel {
- handleStreamResultError(errors.New("Unknown log level"), helper.Int64ToPtr(400), encoder)
+ handleStreamResultError(errors.New("Unknown log level"), pointer.Of(int64(400)), encoder)
return
}
@@ -206,7 +206,7 @@ OUTER:
}
if streamErr != nil {
- handleStreamResultError(streamErr, helper.Int64ToPtr(500), encoder)
+ handleStreamResultError(streamErr, pointer.Of(int64(500)), encoder)
return
}
}
@@ -218,7 +218,7 @@ func (a *Agent) Host(args *structs.HostDataRequest, reply *structs.HostDataRespo
return err
}
if (aclObj != nil && !aclObj.AllowAgentRead()) ||
- (aclObj == nil && !a.c.config.EnableDebug) {
+ (aclObj == nil && !a.c.GetConfig().EnableDebug) {
return structs.ErrPermissionDenied
}
diff --git a/client/alloc_endpoint.go b/client/alloc_endpoint.go
index a0bfc3920e9..52ab8f414e6 100644
--- a/client/alloc_endpoint.go
+++ b/client/alloc_endpoint.go
@@ -12,7 +12,7 @@ import (
"github.com/hashicorp/go-msgpack/codec"
"github.com/hashicorp/nomad/acl"
cstructs "github.com/hashicorp/nomad/client/structs"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/uuid"
nstructs "github.com/hashicorp/nomad/nomad/structs"
"github.com/hashicorp/nomad/plugins/drivers"
@@ -102,7 +102,7 @@ func (a *Allocations) Restart(args *nstructs.AllocRestartRequest, reply *nstruct
return nstructs.ErrPermissionDenied
}
- return a.c.RestartAllocation(args.AllocID, args.TaskName)
+ return a.c.RestartAllocation(args.AllocID, args.TaskName, args.AllTasks)
}
// Stats is used to collect allocation statistics
@@ -183,7 +183,7 @@ func (a *Allocations) execImpl(encoder *codec.Encoder, decoder *codec.Decoder, e
// Decode the arguments
var req cstructs.AllocExecRequest
if err := decoder.Decode(&req); err != nil {
- return helper.Int64ToPtr(500), err
+ return pointer.Of(int64(500)), err
}
if a.c.GetConfig().DisableRemoteExec {
@@ -191,13 +191,13 @@ func (a *Allocations) execImpl(encoder *codec.Encoder, decoder *codec.Decoder, e
}
if req.AllocID == "" {
- return helper.Int64ToPtr(400), allocIDNotPresentErr
+ return pointer.Of(int64(400)), allocIDNotPresentErr
}
ar, err := a.c.getAllocRunner(req.AllocID)
if err != nil {
- code := helper.Int64ToPtr(500)
+ code := pointer.Of(int64(500))
if nstructs.IsErrUnknownAllocation(err) {
- code = helper.Int64ToPtr(404)
+ code = pointer.Of(int64(404))
}
return code, err
@@ -232,17 +232,17 @@ func (a *Allocations) execImpl(encoder *codec.Encoder, decoder *codec.Decoder, e
// Validate the arguments
if req.Task == "" {
- return helper.Int64ToPtr(400), taskNotPresentErr
+ return pointer.Of(int64(400)), taskNotPresentErr
}
if len(req.Cmd) == 0 {
- return helper.Int64ToPtr(400), errors.New("command is not present")
+ return pointer.Of(int64(400)), errors.New("command is not present")
}
capabilities, err := ar.GetTaskDriverCapabilities(req.Task)
if err != nil {
- code := helper.Int64ToPtr(500)
+ code := pointer.Of(int64(500))
if nstructs.IsErrUnknownAllocation(err) {
- code = helper.Int64ToPtr(404)
+ code = pointer.Of(int64(404))
}
return code, err
@@ -258,9 +258,9 @@ func (a *Allocations) execImpl(encoder *codec.Encoder, decoder *codec.Decoder, e
allocState, err := a.c.GetAllocState(req.AllocID)
if err != nil {
- code := helper.Int64ToPtr(500)
+ code := pointer.Of(int64(500))
if nstructs.IsErrUnknownAllocation(err) {
- code = helper.Int64ToPtr(404)
+ code = pointer.Of(int64(404))
}
return code, err
@@ -269,11 +269,11 @@ func (a *Allocations) execImpl(encoder *codec.Encoder, decoder *codec.Decoder, e
// Check that the task is there
taskState := allocState.TaskStates[req.Task]
if taskState == nil {
- return helper.Int64ToPtr(400), fmt.Errorf("unknown task name %q", req.Task)
+ return pointer.Of(int64(400)), fmt.Errorf("unknown task name %q", req.Task)
}
if taskState.StartedAt.IsZero() {
- return helper.Int64ToPtr(404), fmt.Errorf("task %q not started yet.", req.Task)
+ return pointer.Of(int64(404)), fmt.Errorf("task %q not started yet.", req.Task)
}
ctx, cancel := context.WithCancel(context.Background())
@@ -281,12 +281,12 @@ func (a *Allocations) execImpl(encoder *codec.Encoder, decoder *codec.Decoder, e
h := ar.GetTaskExecHandler(req.Task)
if h == nil {
- return helper.Int64ToPtr(404), fmt.Errorf("task %q is not running.", req.Task)
+ return pointer.Of(int64(404)), fmt.Errorf("task %q is not running.", req.Task)
}
err = h(ctx, req.Cmd, req.Tty, newExecStream(decoder, encoder))
if err != nil {
- code := helper.Int64ToPtr(500)
+ code := pointer.Of(int64(500))
return code, err
}
diff --git a/client/alloc_endpoint_test.go b/client/alloc_endpoint_test.go
index c8f2560d02b..f3c6e3e2bfd 100644
--- a/client/alloc_endpoint_test.go
+++ b/client/alloc_endpoint_test.go
@@ -68,6 +68,45 @@ func TestAllocations_Restart(t *testing.T) {
})
}
+func TestAllocations_RestartAllTasks(t *testing.T) {
+ ci.Parallel(t)
+
+ require := require.New(t)
+ client, cleanup := TestClient(t, nil)
+ defer cleanup()
+
+ alloc := mock.LifecycleAlloc()
+ require.Nil(client.addAlloc(alloc, ""))
+
+ // Can't restart all tasks while specifying a task name.
+ req := &nstructs.AllocRestartRequest{
+ AllocID: alloc.ID,
+ AllTasks: true,
+ TaskName: "web",
+ }
+ var resp nstructs.GenericResponse
+ err := client.ClientRPC("Allocations.Restart", &req, &resp)
+ require.Error(err)
+
+ // Good request.
+ req = &nstructs.AllocRestartRequest{
+ AllocID: alloc.ID,
+ AllTasks: true,
+ }
+
+ testutil.WaitForResult(func() (bool, error) {
+ var resp2 nstructs.GenericResponse
+ err := client.ClientRPC("Allocations.Restart", &req, &resp2)
+ if err != nil && strings.Contains(err.Error(), "not running") {
+ return false, err
+ }
+
+ return true, nil
+ }, func(err error) {
+ t.Fatalf("err: %v", err)
+ })
+}
+
func TestAllocations_Restart_ACL(t *testing.T) {
ci.Parallel(t)
require := require.New(t)
diff --git a/client/allocdir/alloc_dir_test.go b/client/allocdir/alloc_dir_test.go
index b2467483ebb..e8871b4a672 100644
--- a/client/allocdir/alloc_dir_test.go
+++ b/client/allocdir/alloc_dir_test.go
@@ -82,8 +82,9 @@ func TestAllocDir_BuildAlloc(t *testing.T) {
}
// HACK: This function is copy/pasted from client.testutil to prevent a test
-// import cycle, due to testutil transitively importing allocdir. This
-// should be fixed after DriverManager is implemented.
+//
+// import cycle, due to testutil transitively importing allocdir. This
+// should be fixed after DriverManager is implemented.
func MountCompatible(t *testing.T) {
if runtime.GOOS == "windows" {
t.Skip("Windows does not support mount")
diff --git a/client/allochealth/tracker.go b/client/allochealth/tracker.go
index 87820d9ed67..1de1cb12fc0 100644
--- a/client/allochealth/tracker.go
+++ b/client/allochealth/tracker.go
@@ -258,8 +258,9 @@ func (t *Tracker) setTaskHealth(healthy, terminal bool) {
// returns true if health is propagated and no more health monitoring is needed
//
// todo: this is currently being shared by watchConsulEvents and watchNomadEvents,
-// and must be split up if/when we support registering services (and thus checks)
-// of different providers.
+//
+// and must be split up if/when we support registering services (and thus checks)
+// of different providers.
func (t *Tracker) setCheckHealth(healthy bool) bool {
t.lock.Lock()
defer t.lock.Unlock()
diff --git a/client/allocrunner/alloc_runner.go b/client/allocrunner/alloc_runner.go
index 624c3145e9b..1d50c2595bb 100644
--- a/client/allocrunner/alloc_runner.go
+++ b/client/allocrunner/alloc_runner.go
@@ -11,6 +11,7 @@ import (
"github.com/hashicorp/nomad/client/allocdir"
"github.com/hashicorp/nomad/client/allocrunner/interfaces"
"github.com/hashicorp/nomad/client/allocrunner/state"
+ "github.com/hashicorp/nomad/client/allocrunner/tasklifecycle"
"github.com/hashicorp/nomad/client/allocrunner/taskrunner"
"github.com/hashicorp/nomad/client/allocwatcher"
"github.com/hashicorp/nomad/client/config"
@@ -27,8 +28,7 @@ import (
cstate "github.com/hashicorp/nomad/client/state"
cstructs "github.com/hashicorp/nomad/client/structs"
"github.com/hashicorp/nomad/client/vaultclient"
- agentconsul "github.com/hashicorp/nomad/command/agent/consul"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/nomad/structs"
"github.com/hashicorp/nomad/plugins/device"
"github.com/hashicorp/nomad/plugins/drivers"
@@ -172,7 +172,9 @@ type allocRunner struct {
// restore.
serversContactedCh chan struct{}
- taskHookCoordinator *taskHookCoordinator
+ // taskCoordinator is used to controlled when tasks are allowed to run
+ // depending on their lifecycle configuration.
+ taskCoordinator *tasklifecycle.Coordinator
shutdownDelayCtx context.Context
shutdownDelayCancelFn context.CancelFunc
@@ -247,7 +249,7 @@ func NewAllocRunner(config *Config) (*allocRunner, error) {
// Create alloc dir
ar.allocDir = allocdir.NewAllocDir(ar.logger, config.ClientConfig.AllocDir, alloc.ID)
- ar.taskHookCoordinator = newTaskHookCoordinator(ar.logger, tg.Tasks)
+ ar.taskCoordinator = tasklifecycle.NewCoordinator(ar.logger, tg.Tasks, ar.waitCh)
shutdownDelayCtx, shutdownDelayCancel := context.WithCancel(context.Background())
ar.shutdownDelayCtx = shutdownDelayCtx
@@ -270,27 +272,27 @@ func NewAllocRunner(config *Config) (*allocRunner, error) {
func (ar *allocRunner) initTaskRunners(tasks []*structs.Task) error {
for _, task := range tasks {
trConfig := &taskrunner.Config{
- Alloc: ar.alloc,
- ClientConfig: ar.clientConfig,
- Task: task,
- TaskDir: ar.allocDir.NewTaskDir(task.Name),
- Logger: ar.logger,
- StateDB: ar.stateDB,
- StateUpdater: ar,
- DynamicRegistry: ar.dynamicRegistry,
- Consul: ar.consulClient,
- ConsulProxies: ar.consulProxiesClient,
- ConsulSI: ar.sidsClient,
- Vault: ar.vaultClient,
- DeviceStatsReporter: ar.deviceStatsReporter,
- CSIManager: ar.csiManager,
- DeviceManager: ar.devicemanager,
- DriverManager: ar.driverManager,
- ServersContactedCh: ar.serversContactedCh,
- StartConditionMetCtx: ar.taskHookCoordinator.startConditionForTask(task),
- ShutdownDelayCtx: ar.shutdownDelayCtx,
- ServiceRegWrapper: ar.serviceRegWrapper,
- Getter: ar.getter,
+ Alloc: ar.alloc,
+ ClientConfig: ar.clientConfig,
+ Task: task,
+ TaskDir: ar.allocDir.NewTaskDir(task.Name),
+ Logger: ar.logger,
+ StateDB: ar.stateDB,
+ StateUpdater: ar,
+ DynamicRegistry: ar.dynamicRegistry,
+ Consul: ar.consulClient,
+ ConsulProxies: ar.consulProxiesClient,
+ ConsulSI: ar.sidsClient,
+ Vault: ar.vaultClient,
+ DeviceStatsReporter: ar.deviceStatsReporter,
+ CSIManager: ar.csiManager,
+ DeviceManager: ar.devicemanager,
+ DriverManager: ar.driverManager,
+ ServersContactedCh: ar.serversContactedCh,
+ StartConditionMetCh: ar.taskCoordinator.StartConditionForTask(task),
+ ShutdownDelayCtx: ar.shutdownDelayCtx,
+ ServiceRegWrapper: ar.serviceRegWrapper,
+ Getter: ar.getter,
}
if ar.cpusetManager != nil {
@@ -388,26 +390,12 @@ func (ar *allocRunner) shouldRun() bool {
// runTasks is used to run the task runners and block until they exit.
func (ar *allocRunner) runTasks() {
- // Start all tasks
+ // Start and wait for all tasks.
for _, task := range ar.tasks {
go task.Run()
}
-
- // Block on all tasks except poststop tasks
for _, task := range ar.tasks {
- if !task.IsPoststopTask() {
- <-task.WaitCh()
- }
- }
-
- // Signal poststop tasks to proceed to main runtime
- ar.taskHookCoordinator.StartPoststopTasks()
-
- // Wait for poststop tasks to finish before proceeding
- for _, task := range ar.tasks {
- if task.IsPoststopTask() {
- <-task.WaitCh()
- }
+ <-task.WaitCh()
}
}
@@ -461,7 +449,7 @@ func (ar *allocRunner) Restore() error {
states[tr.Task().Name] = tr.TaskState()
}
- ar.taskHookCoordinator.taskStateUpdated(states)
+ ar.taskCoordinator.Restore(states)
return nil
}
@@ -558,45 +546,69 @@ func (ar *allocRunner) handleTaskStateUpdates() {
}
}
- // if all live runners are sidecars - kill alloc
- if killEvent == nil && hasSidecars && !hasNonSidecarTasks(liveRunners) {
- killEvent = structs.NewTaskEvent(structs.TaskMainDead)
- }
-
- // If there's a kill event set and live runners, kill them
- if killEvent != nil && len(liveRunners) > 0 {
-
- // Log kill reason
- switch killEvent.Type {
- case structs.TaskLeaderDead:
- ar.logger.Debug("leader task dead, destroying all tasks", "leader_task", killTask)
- case structs.TaskMainDead:
- ar.logger.Debug("main tasks dead, destroying all sidecar tasks")
- default:
- ar.logger.Debug("task failure, destroying all tasks", "failed_task", killTask)
+ if len(liveRunners) > 0 {
+ // if all live runners are sidecars - kill alloc
+ onlySidecarsRemaining := hasSidecars && !hasNonSidecarTasks(liveRunners)
+ if killEvent == nil && onlySidecarsRemaining {
+ killEvent = structs.NewTaskEvent(structs.TaskMainDead)
}
- // Emit kill event for live runners
- for _, tr := range liveRunners {
- tr.EmitEvent(killEvent)
- }
+ // If there's a kill event set and live runners, kill them
+ if killEvent != nil {
+
+ // Log kill reason
+ switch killEvent.Type {
+ case structs.TaskLeaderDead:
+ ar.logger.Debug("leader task dead, destroying all tasks", "leader_task", killTask)
+ case structs.TaskMainDead:
+ ar.logger.Debug("main tasks dead, destroying all sidecar tasks")
+ default:
+ ar.logger.Debug("task failure, destroying all tasks", "failed_task", killTask)
+ }
+
+ // Emit kill event for live runners
+ for _, tr := range liveRunners {
+ tr.EmitEvent(killEvent)
+ }
- // Kill 'em all
- states = ar.killTasks()
+ // Kill 'em all
+ states = ar.killTasks()
+
+ // Wait for TaskRunners to exit before continuing. This will
+ // prevent looping before TaskRunners have transitioned to
+ // Dead.
+ for _, tr := range liveRunners {
+ ar.logger.Info("waiting for task to exit", "task", tr.Task().Name)
+ select {
+ case <-tr.WaitCh():
+ case <-ar.waitCh:
+ }
+ }
+ }
+ } else {
+ // If there are no live runners left kill all non-poststop task
+ // runners to unblock them from the alloc restart loop.
+ for _, tr := range ar.tasks {
+ if tr.IsPoststopTask() {
+ continue
+ }
- // Wait for TaskRunners to exit before continuing to
- // prevent looping before TaskRunners have transitioned
- // to Dead.
- for _, tr := range liveRunners {
- ar.logger.Info("killing task", "task", tr.Task().Name)
select {
case <-tr.WaitCh():
case <-ar.waitCh:
+ default:
+ // Kill task runner without setting an event because the
+ // task is already dead, it's just waiting in the alloc
+ // restart loop.
+ err := tr.Kill(context.TODO(), nil)
+ if err != nil {
+ ar.logger.Warn("failed to kill task", "task", tr.Task().Name, "error", err)
+ }
}
}
}
- ar.taskHookCoordinator.taskStateUpdated(states)
+ ar.taskCoordinator.TaskStateUpdated(states)
// Get the client allocation
calloc := ar.clientAlloc(states)
@@ -609,6 +621,28 @@ func (ar *allocRunner) handleTaskStateUpdates() {
}
}
+// hasNonSidecarTasks returns false if all the passed tasks are sidecar tasks
+func hasNonSidecarTasks(tasks []*taskrunner.TaskRunner) bool {
+ for _, tr := range tasks {
+ if !tr.IsSidecarTask() {
+ return true
+ }
+ }
+
+ return false
+}
+
+// hasSidecarTasks returns true if any of the passed tasks are sidecar tasks
+func hasSidecarTasks(tasks map[string]*taskrunner.TaskRunner) bool {
+ for _, tr := range tasks {
+ if tr.IsSidecarTask() {
+ return true
+ }
+ }
+
+ return false
+}
+
// killTasks kills all task runners, leader (if there is one) first. Errors are
// logged except taskrunner.ErrTaskNotRunning which is ignored. Task states
// after Kill has been called are returned.
@@ -637,7 +671,7 @@ func (ar *allocRunner) killTasks() map[string]*structs.TaskState {
break
}
- // Kill the rest non-sidecar or poststop tasks concurrently
+ // Kill the rest non-sidecar and non-poststop tasks concurrently
wg := sync.WaitGroup{}
for name, tr := range ar.tasks {
// Filter out poststop and sidecar tasks so that they stop after all the other tasks are killed
@@ -727,7 +761,7 @@ func (ar *allocRunner) clientAlloc(taskStates map[string]*structs.TaskState) *st
if a.ClientStatus == structs.AllocClientStatusFailed &&
alloc.DeploymentID != "" && !a.DeploymentStatus.HasHealth() {
a.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(false),
+ Healthy: pointer.Of(false),
}
}
@@ -1194,19 +1228,37 @@ func (ar *allocRunner) GetTaskEventHandler(taskName string) drivermanager.EventH
return nil
}
-// RestartTask signalls the task runner for the provided task to restart.
-func (ar *allocRunner) RestartTask(taskName string, taskEvent *structs.TaskEvent) error {
+// Restart satisfies the WorkloadRestarter interface and restarts all tasks
+// that are currently running.
+func (ar *allocRunner) Restart(ctx context.Context, event *structs.TaskEvent, failure bool) error {
+ return ar.restartTasks(ctx, event, failure, false)
+}
+
+// RestartTask restarts the provided task.
+func (ar *allocRunner) RestartTask(taskName string, event *structs.TaskEvent) error {
tr, ok := ar.tasks[taskName]
if !ok {
return fmt.Errorf("Could not find task runner for task: %s", taskName)
}
- return tr.Restart(context.TODO(), taskEvent, false)
+ return tr.Restart(context.TODO(), event, false)
}
-// Restart satisfies the WorkloadRestarter interface restarts all task runners
-// concurrently
-func (ar *allocRunner) Restart(ctx context.Context, event *structs.TaskEvent, failure bool) error {
+// RestartRunning restarts all tasks that are currently running.
+func (ar *allocRunner) RestartRunning(event *structs.TaskEvent) error {
+ return ar.restartTasks(context.TODO(), event, false, false)
+}
+
+// RestartAll restarts all tasks in the allocation, including dead ones. They
+// will restart following their lifecycle order.
+func (ar *allocRunner) RestartAll(event *structs.TaskEvent) error {
+ // Restart the taskCoordinator to allow dead tasks to run again.
+ ar.taskCoordinator.Restart()
+ return ar.restartTasks(context.TODO(), event, false, true)
+}
+
+// restartTasks restarts all task runners concurrently.
+func (ar *allocRunner) restartTasks(ctx context.Context, event *structs.TaskEvent, failure bool, force bool) error {
waitCh := make(chan struct{})
var err *multierror.Error
var errMutex sync.Mutex
@@ -1219,10 +1271,19 @@ func (ar *allocRunner) Restart(ctx context.Context, event *structs.TaskEvent, fa
defer close(waitCh)
for tn, tr := range ar.tasks {
wg.Add(1)
- go func(taskName string, r agentconsul.WorkloadRestarter) {
+ go func(taskName string, taskRunner *taskrunner.TaskRunner) {
defer wg.Done()
- e := r.Restart(ctx, event, failure)
- if e != nil {
+
+ var e error
+ if force {
+ e = taskRunner.ForceRestart(ctx, event.Copy(), failure)
+ } else {
+ e = taskRunner.Restart(ctx, event.Copy(), failure)
+ }
+
+ // Ignore ErrTaskNotRunning errors since tasks that are not
+ // running are expected to not be restarted.
+ if e != nil && e != taskrunner.ErrTaskNotRunning {
errMutex.Lock()
defer errMutex.Unlock()
err = multierror.Append(err, fmt.Errorf("failed to restart task %s: %v", taskName, e))
@@ -1240,25 +1301,6 @@ func (ar *allocRunner) Restart(ctx context.Context, event *structs.TaskEvent, fa
return err.ErrorOrNil()
}
-// RestartAll signalls all task runners in the allocation to restart and passes
-// a copy of the task event to each restart event.
-// Returns any errors in a concatenated form.
-func (ar *allocRunner) RestartAll(taskEvent *structs.TaskEvent) error {
- var err *multierror.Error
-
- // run alloc task restart hooks
- ar.taskRestartHooks()
-
- for tn := range ar.tasks {
- rerr := ar.RestartTask(tn, taskEvent.Copy())
- if rerr != nil {
- err = multierror.Append(err, rerr)
- }
- }
-
- return err.ErrorOrNil()
-}
-
// Signal sends a signal request to task runners inside an allocation. If the
// taskName is empty, then it is sent to all tasks.
func (ar *allocRunner) Signal(taskName, signal string) error {
diff --git a/client/allocrunner/alloc_runner_test.go b/client/allocrunner/alloc_runner_test.go
index 1ff8a59125f..90b94657b3d 100644
--- a/client/allocrunner/alloc_runner_test.go
+++ b/client/allocrunner/alloc_runner_test.go
@@ -10,8 +10,11 @@ import (
"time"
"github.com/hashicorp/consul/api"
+ multierror "github.com/hashicorp/go-multierror"
"github.com/hashicorp/nomad/ci"
"github.com/hashicorp/nomad/client/allochealth"
+ "github.com/hashicorp/nomad/client/allocrunner/tasklifecycle"
+ "github.com/hashicorp/nomad/client/allocrunner/taskrunner"
"github.com/hashicorp/nomad/client/allocwatcher"
"github.com/hashicorp/nomad/client/serviceregistration"
regMock "github.com/hashicorp/nomad/client/serviceregistration/mock"
@@ -481,6 +484,464 @@ func TestAllocRunner_Lifecycle_Poststop(t *testing.T) {
}
+func TestAllocRunner_Lifecycle_Restart(t *testing.T) {
+ ci.Parallel(t)
+
+ // test cases can use this default or override w/ taskDefs param
+ alloc := mock.LifecycleAllocFromTasks([]mock.LifecycleTaskDef{
+ {Name: "main", RunFor: "100s", ExitCode: 0, Hook: "", IsSidecar: false},
+ {Name: "prestart-oneshot", RunFor: "1s", ExitCode: 0, Hook: "prestart", IsSidecar: false},
+ {Name: "prestart-sidecar", RunFor: "100s", ExitCode: 0, Hook: "prestart", IsSidecar: true},
+ {Name: "poststart-oneshot", RunFor: "1s", ExitCode: 0, Hook: "poststart", IsSidecar: false},
+ {Name: "poststart-sidecar", RunFor: "100s", ExitCode: 0, Hook: "poststart", IsSidecar: true},
+ {Name: "poststop", RunFor: "1s", ExitCode: 0, Hook: "poststop", IsSidecar: false},
+ })
+ alloc.Job.Type = structs.JobTypeService
+ rp := &structs.RestartPolicy{
+ Attempts: 1,
+ Interval: 10 * time.Minute,
+ Delay: 1 * time.Nanosecond,
+ Mode: structs.RestartPolicyModeFail,
+ }
+
+ ev := &structs.TaskEvent{Type: structs.TaskRestartSignal}
+
+ testCases := []struct {
+ name string
+ taskDefs []mock.LifecycleTaskDef
+ isBatch bool
+ hasLeader bool
+ action func(*allocRunner, *structs.Allocation) error
+ expectedErr string
+ expectedAfter map[string]structs.TaskState
+ }{
+ {
+ name: "restart entire allocation",
+ action: func(ar *allocRunner, alloc *structs.Allocation) error {
+ return ar.RestartAll(ev)
+ },
+ expectedAfter: map[string]structs.TaskState{
+ "main": structs.TaskState{State: "running", Restarts: 1},
+ "prestart-oneshot": structs.TaskState{State: "dead", Restarts: 1},
+ "prestart-sidecar": structs.TaskState{State: "running", Restarts: 1},
+ "poststart-oneshot": structs.TaskState{State: "dead", Restarts: 1},
+ "poststart-sidecar": structs.TaskState{State: "running", Restarts: 1},
+ "poststop": structs.TaskState{State: "pending", Restarts: 0},
+ },
+ },
+ {
+ name: "restart only running tasks",
+ action: func(ar *allocRunner, alloc *structs.Allocation) error {
+ return ar.RestartRunning(ev)
+ },
+ expectedAfter: map[string]structs.TaskState{
+ "main": structs.TaskState{State: "running", Restarts: 1},
+ "prestart-oneshot": structs.TaskState{State: "dead", Restarts: 0},
+ "prestart-sidecar": structs.TaskState{State: "running", Restarts: 1},
+ "poststart-oneshot": structs.TaskState{State: "dead", Restarts: 0},
+ "poststart-sidecar": structs.TaskState{State: "running", Restarts: 1},
+ "poststop": structs.TaskState{State: "pending", Restarts: 0},
+ },
+ },
+ {
+ name: "batch job restart entire allocation",
+ taskDefs: []mock.LifecycleTaskDef{
+ {Name: "main", RunFor: "100s", ExitCode: 1, Hook: "", IsSidecar: false},
+ {Name: "prestart-oneshot", RunFor: "1s", ExitCode: 0, Hook: "prestart", IsSidecar: false},
+ {Name: "prestart-sidecar", RunFor: "100s", ExitCode: 0, Hook: "prestart", IsSidecar: true},
+ {Name: "poststart-oneshot", RunFor: "1s", ExitCode: 0, Hook: "poststart", IsSidecar: false},
+ {Name: "poststart-sidecar", RunFor: "100s", ExitCode: 0, Hook: "poststart", IsSidecar: true},
+ {Name: "poststop", RunFor: "1s", ExitCode: 0, Hook: "poststop", IsSidecar: false},
+ },
+ isBatch: true,
+ action: func(ar *allocRunner, alloc *structs.Allocation) error {
+ return ar.RestartAll(ev)
+ },
+ expectedAfter: map[string]structs.TaskState{
+ "main": structs.TaskState{State: "running", Restarts: 1},
+ "prestart-oneshot": structs.TaskState{State: "dead", Restarts: 1},
+ "prestart-sidecar": structs.TaskState{State: "running", Restarts: 1},
+ "poststart-oneshot": structs.TaskState{State: "dead", Restarts: 1},
+ "poststart-sidecar": structs.TaskState{State: "running", Restarts: 1},
+ "poststop": structs.TaskState{State: "pending", Restarts: 0},
+ },
+ },
+ {
+ name: "batch job restart only running tasks ",
+ taskDefs: []mock.LifecycleTaskDef{
+ {Name: "main", RunFor: "100s", ExitCode: 1, Hook: "", IsSidecar: false},
+ {Name: "prestart-oneshot", RunFor: "1s", ExitCode: 0, Hook: "prestart", IsSidecar: false},
+ {Name: "prestart-sidecar", RunFor: "100s", ExitCode: 0, Hook: "prestart", IsSidecar: true},
+ {Name: "poststart-oneshot", RunFor: "1s", ExitCode: 0, Hook: "poststart", IsSidecar: false},
+ {Name: "poststart-sidecar", RunFor: "100s", ExitCode: 0, Hook: "poststart", IsSidecar: true},
+ {Name: "poststop", RunFor: "1s", ExitCode: 0, Hook: "poststop", IsSidecar: false},
+ },
+ isBatch: true,
+ action: func(ar *allocRunner, alloc *structs.Allocation) error {
+ return ar.RestartRunning(ev)
+ },
+ expectedAfter: map[string]structs.TaskState{
+ "main": structs.TaskState{State: "running", Restarts: 1},
+ "prestart-oneshot": structs.TaskState{State: "dead", Restarts: 0},
+ "prestart-sidecar": structs.TaskState{State: "running", Restarts: 1},
+ "poststart-oneshot": structs.TaskState{State: "dead", Restarts: 0},
+ "poststart-sidecar": structs.TaskState{State: "running", Restarts: 1},
+ "poststop": structs.TaskState{State: "pending", Restarts: 0},
+ },
+ },
+ {
+ name: "restart entire allocation with leader",
+ hasLeader: true,
+ action: func(ar *allocRunner, alloc *structs.Allocation) error {
+ return ar.RestartAll(ev)
+ },
+ expectedAfter: map[string]structs.TaskState{
+ "main": structs.TaskState{State: "running", Restarts: 1},
+ "prestart-oneshot": structs.TaskState{State: "dead", Restarts: 1},
+ "prestart-sidecar": structs.TaskState{State: "running", Restarts: 1},
+ "poststart-oneshot": structs.TaskState{State: "dead", Restarts: 1},
+ "poststart-sidecar": structs.TaskState{State: "running", Restarts: 1},
+ "poststop": structs.TaskState{State: "pending", Restarts: 0},
+ },
+ },
+ {
+ name: "stop from server",
+ action: func(ar *allocRunner, alloc *structs.Allocation) error {
+ stopAlloc := alloc.Copy()
+ stopAlloc.DesiredStatus = structs.AllocDesiredStatusStop
+ ar.Update(stopAlloc)
+ return nil
+ },
+ expectedAfter: map[string]structs.TaskState{
+ "main": structs.TaskState{State: "dead", Restarts: 0},
+ "prestart-oneshot": structs.TaskState{State: "dead", Restarts: 0},
+ "prestart-sidecar": structs.TaskState{State: "dead", Restarts: 0},
+ "poststart-oneshot": structs.TaskState{State: "dead", Restarts: 0},
+ "poststart-sidecar": structs.TaskState{State: "dead", Restarts: 0},
+ "poststop": structs.TaskState{State: "dead", Restarts: 0},
+ },
+ },
+ {
+ name: "restart main task",
+ action: func(ar *allocRunner, alloc *structs.Allocation) error {
+ return ar.RestartTask("main", ev)
+ },
+ expectedAfter: map[string]structs.TaskState{
+ "main": structs.TaskState{State: "running", Restarts: 1},
+ "prestart-oneshot": structs.TaskState{State: "dead", Restarts: 0},
+ "prestart-sidecar": structs.TaskState{State: "running", Restarts: 0},
+ "poststart-oneshot": structs.TaskState{State: "dead", Restarts: 0},
+ "poststart-sidecar": structs.TaskState{State: "running", Restarts: 0},
+ "poststop": structs.TaskState{State: "pending", Restarts: 0},
+ },
+ },
+ {
+ name: "restart leader main task",
+ hasLeader: true,
+ action: func(ar *allocRunner, alloc *structs.Allocation) error {
+ return ar.RestartTask("main", ev)
+ },
+ expectedAfter: map[string]structs.TaskState{
+ "main": structs.TaskState{State: "running", Restarts: 1},
+ "prestart-oneshot": structs.TaskState{State: "dead", Restarts: 0},
+ "prestart-sidecar": structs.TaskState{State: "running", Restarts: 0},
+ "poststart-oneshot": structs.TaskState{State: "dead", Restarts: 0},
+ "poststart-sidecar": structs.TaskState{State: "running", Restarts: 0},
+ "poststop": structs.TaskState{State: "pending", Restarts: 0},
+ },
+ },
+ {
+ name: "main task fails and restarts once",
+ taskDefs: []mock.LifecycleTaskDef{
+ {Name: "main", RunFor: "2s", ExitCode: 1, Hook: "", IsSidecar: false},
+ {Name: "prestart-oneshot", RunFor: "1s", ExitCode: 0, Hook: "prestart", IsSidecar: false},
+ {Name: "prestart-sidecar", RunFor: "100s", ExitCode: 0, Hook: "prestart", IsSidecar: true},
+ {Name: "poststart-oneshot", RunFor: "1s", ExitCode: 0, Hook: "poststart", IsSidecar: false},
+ {Name: "poststart-sidecar", RunFor: "100s", ExitCode: 0, Hook: "poststart", IsSidecar: true},
+ {Name: "poststop", RunFor: "1s", ExitCode: 0, Hook: "poststop", IsSidecar: false},
+ },
+ action: func(ar *allocRunner, alloc *structs.Allocation) error {
+ time.Sleep(3 * time.Second) // make sure main task has exited
+ return nil
+ },
+ expectedAfter: map[string]structs.TaskState{
+ "main": structs.TaskState{State: "dead", Restarts: 1},
+ "prestart-oneshot": structs.TaskState{State: "dead", Restarts: 0},
+ "prestart-sidecar": structs.TaskState{State: "dead", Restarts: 0},
+ "poststart-oneshot": structs.TaskState{State: "dead", Restarts: 0},
+ "poststart-sidecar": structs.TaskState{State: "dead", Restarts: 0},
+ "poststop": structs.TaskState{State: "dead", Restarts: 0},
+ },
+ },
+ {
+ name: "leader main task fails and restarts once",
+ taskDefs: []mock.LifecycleTaskDef{
+ {Name: "main", RunFor: "2s", ExitCode: 1, Hook: "", IsSidecar: false},
+ {Name: "prestart-oneshot", RunFor: "1s", ExitCode: 0, Hook: "prestart", IsSidecar: false},
+ {Name: "prestart-sidecar", RunFor: "100s", ExitCode: 0, Hook: "prestart", IsSidecar: true},
+ {Name: "poststart-oneshot", RunFor: "1s", ExitCode: 0, Hook: "poststart", IsSidecar: false},
+ {Name: "poststart-sidecar", RunFor: "100s", ExitCode: 0, Hook: "poststart", IsSidecar: true},
+ {Name: "poststop", RunFor: "1s", ExitCode: 0, Hook: "poststop", IsSidecar: false},
+ },
+ hasLeader: true,
+ action: func(ar *allocRunner, alloc *structs.Allocation) error {
+ time.Sleep(3 * time.Second) // make sure main task has exited
+ return nil
+ },
+ expectedAfter: map[string]structs.TaskState{
+ "main": structs.TaskState{State: "dead", Restarts: 1},
+ "prestart-oneshot": structs.TaskState{State: "dead", Restarts: 0},
+ "prestart-sidecar": structs.TaskState{State: "dead", Restarts: 0},
+ "poststart-oneshot": structs.TaskState{State: "dead", Restarts: 0},
+ "poststart-sidecar": structs.TaskState{State: "dead", Restarts: 0},
+ "poststop": structs.TaskState{State: "dead", Restarts: 0},
+ },
+ },
+ {
+ name: "main stopped unexpectedly and restarts once",
+ taskDefs: []mock.LifecycleTaskDef{
+ {Name: "main", RunFor: "2s", ExitCode: 0, Hook: "", IsSidecar: false},
+ {Name: "prestart-oneshot", RunFor: "1s", ExitCode: 0, Hook: "prestart", IsSidecar: false},
+ {Name: "prestart-sidecar", RunFor: "100s", ExitCode: 0, Hook: "prestart", IsSidecar: true},
+ {Name: "poststart-oneshot", RunFor: "1s", ExitCode: 0, Hook: "poststart", IsSidecar: false},
+ {Name: "poststart-sidecar", RunFor: "100s", ExitCode: 0, Hook: "poststart", IsSidecar: true},
+ {Name: "poststop", RunFor: "1s", ExitCode: 0, Hook: "poststop", IsSidecar: false},
+ },
+ action: func(ar *allocRunner, alloc *structs.Allocation) error {
+ time.Sleep(3 * time.Second) // make sure main task has exited
+ return nil
+ },
+ expectedAfter: map[string]structs.TaskState{
+ "main": structs.TaskState{State: "dead", Restarts: 1},
+ "prestart-oneshot": structs.TaskState{State: "dead", Restarts: 0},
+ "prestart-sidecar": structs.TaskState{State: "dead", Restarts: 0},
+ "poststart-oneshot": structs.TaskState{State: "dead", Restarts: 0},
+ "poststart-sidecar": structs.TaskState{State: "dead", Restarts: 0},
+ "poststop": structs.TaskState{State: "dead", Restarts: 0},
+ },
+ },
+ {
+ name: "leader main stopped unexpectedly and restarts once",
+ taskDefs: []mock.LifecycleTaskDef{
+ {Name: "main", RunFor: "2s", ExitCode: 0, Hook: "", IsSidecar: false},
+ {Name: "prestart-oneshot", RunFor: "1s", ExitCode: 0, Hook: "prestart", IsSidecar: false},
+ {Name: "prestart-sidecar", RunFor: "100s", ExitCode: 0, Hook: "prestart", IsSidecar: true},
+ {Name: "poststart-oneshot", RunFor: "1s", ExitCode: 0, Hook: "poststart", IsSidecar: false},
+ {Name: "poststart-sidecar", RunFor: "100s", ExitCode: 0, Hook: "poststart", IsSidecar: true},
+ {Name: "poststop", RunFor: "1s", ExitCode: 0, Hook: "poststop", IsSidecar: false},
+ },
+ action: func(ar *allocRunner, alloc *structs.Allocation) error {
+ time.Sleep(3 * time.Second) // make sure main task has exited
+ return nil
+ },
+ expectedAfter: map[string]structs.TaskState{
+ "main": structs.TaskState{State: "dead", Restarts: 1},
+ "prestart-oneshot": structs.TaskState{State: "dead", Restarts: 0},
+ "prestart-sidecar": structs.TaskState{State: "dead", Restarts: 0},
+ "poststart-oneshot": structs.TaskState{State: "dead", Restarts: 0},
+ "poststart-sidecar": structs.TaskState{State: "dead", Restarts: 0},
+ "poststop": structs.TaskState{State: "dead", Restarts: 0},
+ },
+ },
+ {
+ name: "failed main task cannot be restarted",
+ taskDefs: []mock.LifecycleTaskDef{
+ {Name: "main", RunFor: "2s", ExitCode: 1, Hook: "", IsSidecar: false},
+ {Name: "prestart-oneshot", RunFor: "1s", ExitCode: 0, Hook: "prestart", IsSidecar: false},
+ {Name: "prestart-sidecar", RunFor: "100s", ExitCode: 0, Hook: "prestart", IsSidecar: true},
+ {Name: "poststart-oneshot", RunFor: "1s", ExitCode: 0, Hook: "poststart", IsSidecar: false},
+ {Name: "poststart-sidecar", RunFor: "100s", ExitCode: 0, Hook: "poststart", IsSidecar: true},
+ {Name: "poststop", RunFor: "1s", ExitCode: 0, Hook: "poststop", IsSidecar: false},
+ },
+ action: func(ar *allocRunner, alloc *structs.Allocation) error {
+ // make sure main task has had a chance to restart once on its
+ // own and fail again before we try to manually restart it
+ time.Sleep(5 * time.Second)
+ return ar.RestartTask("main", ev)
+ },
+ expectedErr: "Task not running",
+ expectedAfter: map[string]structs.TaskState{
+ "main": structs.TaskState{State: "dead", Restarts: 1},
+ "prestart-oneshot": structs.TaskState{State: "dead", Restarts: 0},
+ "prestart-sidecar": structs.TaskState{State: "dead", Restarts: 0},
+ "poststart-oneshot": structs.TaskState{State: "dead", Restarts: 0},
+ "poststart-sidecar": structs.TaskState{State: "dead", Restarts: 0},
+ "poststop": structs.TaskState{State: "dead", Restarts: 0},
+ },
+ },
+ {
+ name: "restart prestart-sidecar task",
+ action: func(ar *allocRunner, alloc *structs.Allocation) error {
+ return ar.RestartTask("prestart-sidecar", ev)
+ },
+ expectedAfter: map[string]structs.TaskState{
+ "main": structs.TaskState{State: "running", Restarts: 0},
+ "prestart-oneshot": structs.TaskState{State: "dead", Restarts: 0},
+ "prestart-sidecar": structs.TaskState{State: "running", Restarts: 1},
+ "poststart-oneshot": structs.TaskState{State: "dead", Restarts: 0},
+ "poststart-sidecar": structs.TaskState{State: "running", Restarts: 0},
+ "poststop": structs.TaskState{State: "pending", Restarts: 0},
+ },
+ },
+ {
+ name: "restart poststart-sidecar task",
+ action: func(ar *allocRunner, alloc *structs.Allocation) error {
+ return ar.RestartTask("poststart-sidecar", ev)
+ },
+ expectedAfter: map[string]structs.TaskState{
+ "main": structs.TaskState{State: "running", Restarts: 0},
+ "prestart-oneshot": structs.TaskState{State: "dead", Restarts: 0},
+ "prestart-sidecar": structs.TaskState{State: "running", Restarts: 0},
+ "poststart-oneshot": structs.TaskState{State: "dead", Restarts: 0},
+ "poststart-sidecar": structs.TaskState{State: "running", Restarts: 1},
+ "poststop": structs.TaskState{State: "pending", Restarts: 0},
+ },
+ },
+ }
+
+ for _, tc := range testCases {
+ tc := tc
+ t.Run(tc.name, func(t *testing.T) {
+ ci.Parallel(t)
+
+ alloc := alloc.Copy()
+ alloc.Job.TaskGroups[0].RestartPolicy = rp
+ if tc.taskDefs != nil {
+ alloc = mock.LifecycleAllocFromTasks(tc.taskDefs)
+ alloc.Job.Type = structs.JobTypeService
+ }
+ for _, task := range alloc.Job.TaskGroups[0].Tasks {
+ task.RestartPolicy = rp // tasks inherit the group policy
+ }
+ if tc.hasLeader {
+ for _, task := range alloc.Job.TaskGroups[0].Tasks {
+ if task.Name == "main" {
+ task.Leader = true
+ }
+ }
+ }
+ if tc.isBatch {
+ alloc.Job.Type = structs.JobTypeBatch
+ }
+
+ conf, cleanup := testAllocRunnerConfig(t, alloc)
+ defer cleanup()
+ ar, err := NewAllocRunner(conf)
+ require.NoError(t, err)
+ defer destroy(ar)
+ go ar.Run()
+
+ upd := conf.StateUpdater.(*MockStateUpdater)
+
+ // assert our "before" states:
+ // - all one-shot tasks should be dead but not failed
+ // - all main tasks and sidecars should be running
+ // - no tasks should have restarted
+ testutil.WaitForResult(func() (bool, error) {
+ last := upd.Last()
+ if last == nil {
+ return false, fmt.Errorf("no update")
+ }
+ if last.ClientStatus != structs.AllocClientStatusRunning {
+ return false, fmt.Errorf(
+ "expected alloc to be running not %s", last.ClientStatus)
+ }
+ var errs *multierror.Error
+
+ expectedBefore := map[string]string{
+ "main": "running",
+ "prestart-oneshot": "dead",
+ "prestart-sidecar": "running",
+ "poststart-oneshot": "dead",
+ "poststart-sidecar": "running",
+ "poststop": "pending",
+ }
+
+ for task, expected := range expectedBefore {
+ got, ok := last.TaskStates[task]
+ if !ok {
+ continue
+ }
+ if got.State != expected {
+ errs = multierror.Append(errs, fmt.Errorf(
+ "expected initial state of task %q to be %q not %q",
+ task, expected, got.State))
+ }
+ if got.Restarts != 0 {
+ errs = multierror.Append(errs, fmt.Errorf(
+ "expected no initial restarts of task %q, not %q",
+ task, got.Restarts))
+ }
+ if expected == "dead" && got.Failed {
+ errs = multierror.Append(errs, fmt.Errorf(
+ "expected ephemeral task %q to be dead but not failed",
+ task))
+ }
+
+ }
+ if errs.ErrorOrNil() != nil {
+ return false, errs.ErrorOrNil()
+ }
+ return true, nil
+ }, func(err error) {
+ require.NoError(t, err, "error waiting for initial state")
+ })
+
+ // perform the action
+ err = tc.action(ar, alloc.Copy())
+ if tc.expectedErr != "" {
+ require.EqualError(t, err, tc.expectedErr)
+ } else {
+ require.NoError(t, err)
+ }
+
+ // assert our "after" states
+ testutil.WaitForResult(func() (bool, error) {
+ last := upd.Last()
+ if last == nil {
+ return false, fmt.Errorf("no update")
+ }
+ var errs *multierror.Error
+ for task, expected := range tc.expectedAfter {
+ got, ok := last.TaskStates[task]
+ if !ok {
+ errs = multierror.Append(errs, fmt.Errorf(
+ "no final state found for task %q", task,
+ ))
+ }
+ if got.State != expected.State {
+ errs = multierror.Append(errs, fmt.Errorf(
+ "expected final state of task %q to be %q not %q",
+ task, expected.State, got.State))
+ }
+ if expected.State == "dead" {
+ if got.FinishedAt.IsZero() || got.StartedAt.IsZero() {
+ errs = multierror.Append(errs, fmt.Errorf(
+ "expected final state of task %q to have start and finish time", task))
+ }
+ if len(got.Events) < 2 {
+ errs = multierror.Append(errs, fmt.Errorf(
+ "expected final state of task %q to include at least 2 tasks", task))
+ }
+ }
+
+ if got.Restarts != expected.Restarts {
+ errs = multierror.Append(errs, fmt.Errorf(
+ "expected final restarts of task %q to be %v not %v",
+ task, expected.Restarts, got.Restarts))
+ }
+ }
+ if errs.ErrorOrNil() != nil {
+ return false, errs.ErrorOrNil()
+ }
+ return true, nil
+ }, func(err error) {
+ require.NoError(t, err, "error waiting for final state")
+ })
+ })
+ }
+}
+
func TestAllocRunner_TaskGroup_ShutdownDelay(t *testing.T) {
ci.Parallel(t)
@@ -803,28 +1264,44 @@ func TestAllocRunner_Restore_LifecycleHooks(t *testing.T) {
ar, err := NewAllocRunner(conf)
require.NoError(t, err)
- // We should see all tasks with Prestart hooks are not blocked from running:
- // i.e. the "init" and "side" task hook coordinator channels are closed
- require.Truef(t, isChannelClosed(ar.taskHookCoordinator.startConditionForTask(ar.tasks["init"].Task())), "init channel was open, should be closed")
- require.Truef(t, isChannelClosed(ar.taskHookCoordinator.startConditionForTask(ar.tasks["side"].Task())), "side channel was open, should be closed")
+ go ar.Run()
+ defer destroy(ar)
+
+ // Wait for the coordinator to transition from the "init" state.
+ tasklifecycle.WaitNotInitUntil(ar.taskCoordinator, time.Second, func() {
+ t.Fatalf("task coordinator didn't transition from init in time")
+ })
- isChannelClosed(ar.taskHookCoordinator.startConditionForTask(ar.tasks["side"].Task()))
+ // We should see all tasks with Prestart hooks are not blocked from running.
+ tasklifecycle.RequireTaskAllowed(t, ar.taskCoordinator, ar.tasks["init"].Task())
+ tasklifecycle.RequireTaskAllowed(t, ar.taskCoordinator, ar.tasks["side"].Task())
+ tasklifecycle.RequireTaskBlocked(t, ar.taskCoordinator, ar.tasks["web"].Task())
+ tasklifecycle.RequireTaskBlocked(t, ar.taskCoordinator, ar.tasks["poststart"].Task())
- // Mimic client dies while init task running, and client restarts after init task finished
+ // Mimic client dies while init task running, and client restarts after
+ // init task finished and web is running.
ar.tasks["init"].UpdateState(structs.TaskStateDead, structs.NewTaskEvent(structs.TaskTerminated))
ar.tasks["side"].UpdateState(structs.TaskStateRunning, structs.NewTaskEvent(structs.TaskStarted))
+ ar.tasks["web"].UpdateState(structs.TaskStateRunning, structs.NewTaskEvent(structs.TaskStarted))
- // Create a new AllocRunner to test RestoreState and Run
+ // Create a new AllocRunner to test Restore and Run.
ar2, err := NewAllocRunner(conf)
require.NoError(t, err)
+ require.NoError(t, ar2.Restore())
- if err := ar2.Restore(); err != nil {
- t.Fatalf("error restoring state: %v", err)
- }
+ go ar2.Run()
+ defer destroy(ar2)
- // We want to see Restore resume execution with correct hook ordering:
- // i.e. we should see the "web" main task hook coordinator channel is closed
- require.Truef(t, isChannelClosed(ar2.taskHookCoordinator.startConditionForTask(ar.tasks["web"].Task())), "web channel was open, should be closed")
+ // Wait for the coordinator to transition from the "init" state.
+ tasklifecycle.WaitNotInitUntil(ar.taskCoordinator, time.Second, func() {
+ t.Fatalf("task coordinator didn't transition from init in time")
+ })
+
+ // Restore resumes execution with correct lifecycle ordering.
+ tasklifecycle.RequireTaskBlocked(t, ar2.taskCoordinator, ar2.tasks["init"].Task())
+ tasklifecycle.RequireTaskAllowed(t, ar2.taskCoordinator, ar2.tasks["side"].Task())
+ tasklifecycle.RequireTaskAllowed(t, ar2.taskCoordinator, ar2.tasks["web"].Task())
+ tasklifecycle.RequireTaskAllowed(t, ar2.taskCoordinator, ar2.tasks["poststart"].Task())
}
func TestAllocRunner_Update_Semantics(t *testing.T) {
@@ -1195,7 +1672,7 @@ func TestAllocRunner_MoveAllocDir(t *testing.T) {
ar.Run()
defer destroy(ar)
- require.Equal(t, structs.AllocClientStatusComplete, ar.AllocState().ClientStatus)
+ WaitForClientState(t, ar, structs.AllocClientStatusComplete)
// Step 2. Modify its directory
task := alloc.Job.TaskGroups[0].Tasks[0]
@@ -1223,7 +1700,7 @@ func TestAllocRunner_MoveAllocDir(t *testing.T) {
ar2.Run()
defer destroy(ar2)
- require.Equal(t, structs.AllocClientStatusComplete, ar2.AllocState().ClientStatus)
+ WaitForClientState(t, ar, structs.AllocClientStatusComplete)
// Ensure that data from ar was moved to ar2
dataFile = filepath.Join(ar2.allocDir.SharedDir, "data", "data_file")
@@ -1811,3 +2288,113 @@ func TestAllocRunner_Lifecycle_Shutdown_Order(t *testing.T) {
last = upd.Last()
require.Less(t, last.TaskStates[sidecarTask.Name].FinishedAt, last.TaskStates[poststopTask.Name].FinishedAt)
}
+
+func TestHasSidecarTasks(t *testing.T) {
+ ci.Parallel(t)
+
+ testCases := []struct {
+ name string
+ lifecycle []*structs.TaskLifecycleConfig
+ hasSidecars bool
+ hasNonsidecars bool
+ }{
+ {
+ name: "all sidecar - one",
+ lifecycle: []*structs.TaskLifecycleConfig{
+ {
+ Hook: structs.TaskLifecycleHookPrestart,
+ Sidecar: true,
+ },
+ },
+ hasSidecars: true,
+ hasNonsidecars: false,
+ },
+ {
+ name: "all sidecar - multiple",
+ lifecycle: []*structs.TaskLifecycleConfig{
+ {
+ Hook: structs.TaskLifecycleHookPrestart,
+ Sidecar: true,
+ },
+ {
+ Hook: structs.TaskLifecycleHookPrestart,
+ Sidecar: true,
+ },
+ {
+ Hook: structs.TaskLifecycleHookPrestart,
+ Sidecar: true,
+ },
+ },
+ hasSidecars: true,
+ hasNonsidecars: false,
+ },
+ {
+ name: "some sidecars, some others",
+ lifecycle: []*structs.TaskLifecycleConfig{
+ nil,
+ {
+ Hook: structs.TaskLifecycleHookPrestart,
+ Sidecar: false,
+ },
+ {
+ Hook: structs.TaskLifecycleHookPrestart,
+ Sidecar: true,
+ },
+ },
+ hasSidecars: true,
+ hasNonsidecars: true,
+ },
+ {
+ name: "no sidecars",
+ lifecycle: []*structs.TaskLifecycleConfig{
+ nil,
+ {
+ Hook: structs.TaskLifecycleHookPrestart,
+ Sidecar: false,
+ },
+ nil,
+ },
+ hasSidecars: false,
+ hasNonsidecars: true,
+ },
+ }
+
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ // Create alloc with the given task lifecycle configurations.
+ alloc := mock.BatchAlloc()
+
+ tasks := []*structs.Task{}
+ resources := map[string]*structs.AllocatedTaskResources{}
+
+ tr := alloc.AllocatedResources.Tasks[alloc.Job.TaskGroups[0].Tasks[0].Name]
+
+ for i, lifecycle := range tc.lifecycle {
+ task := alloc.Job.TaskGroups[0].Tasks[0].Copy()
+ task.Name = fmt.Sprintf("task%d", i)
+ task.Lifecycle = lifecycle
+ tasks = append(tasks, task)
+ resources[task.Name] = tr
+ }
+
+ alloc.Job.TaskGroups[0].Tasks = tasks
+ alloc.AllocatedResources.Tasks = resources
+
+ // Create alloc runner.
+ arConf, cleanup := testAllocRunnerConfig(t, alloc)
+ defer cleanup()
+
+ ar, err := NewAllocRunner(arConf)
+ require.NoError(t, err)
+
+ require.Equal(t, tc.hasSidecars, hasSidecarTasks(ar.tasks), "sidecars")
+
+ runners := []*taskrunner.TaskRunner{}
+ for _, r := range ar.tasks {
+ runners = append(runners, r)
+ }
+ require.Equal(t, tc.hasNonsidecars, hasNonSidecarTasks(runners), "non-sidecars")
+
+ })
+ }
+}
diff --git a/client/allocrunner/alloc_runner_unix_test.go b/client/allocrunner/alloc_runner_unix_test.go
index ab3c777dd20..0859569101e 100644
--- a/client/allocrunner/alloc_runner_unix_test.go
+++ b/client/allocrunner/alloc_runner_unix_test.go
@@ -207,18 +207,18 @@ func TestAllocRunner_Restore_CompletedBatch(t *testing.T) {
go ar2.Run()
defer destroy(ar2)
- // AR waitCh must be closed even when task doesn't run again
+ // AR waitCh must be open as the task waits for a possible alloc restart.
select {
case <-ar2.WaitCh():
- case <-time.After(10 * time.Second):
- require.Fail(t, "alloc.waitCh wasn't closed")
+ require.Fail(t, "alloc.waitCh was closed")
+ default:
}
- // TR waitCh must be closed too!
+ // TR waitCh must be open too!
select {
case <-ar2.tasks[task.Name].WaitCh():
- case <-time.After(10 * time.Second):
- require.Fail(t, "tr.waitCh wasn't closed")
+ require.Fail(t, "tr.waitCh was closed")
+ default:
}
// Assert that events are unmodified, which they would if task re-run
diff --git a/client/allocrunner/csi_hook_test.go b/client/allocrunner/csi_hook_test.go
index 21d3fc91d7d..bb5362b9537 100644
--- a/client/allocrunner/csi_hook_test.go
+++ b/client/allocrunner/csi_hook_test.go
@@ -13,7 +13,7 @@ import (
"github.com/hashicorp/nomad/client/pluginmanager"
"github.com/hashicorp/nomad/client/pluginmanager/csimanager"
cstructs "github.com/hashicorp/nomad/client/structs"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/testlog"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
@@ -193,8 +193,8 @@ func TestCSIHook(t *testing.T) {
rpcer := mockRPCer{
alloc: alloc,
callCounts: callCounts,
- hasExistingClaim: helper.BoolToPtr(tc.startsWithClaims),
- schedulable: helper.BoolToPtr(!tc.startsUnschedulable),
+ hasExistingClaim: pointer.Of(tc.startsWithClaims),
+ schedulable: pointer.Of(!tc.startsUnschedulable),
}
ar := mockAllocRunner{
res: &cstructs.AllocHookResources{},
@@ -298,8 +298,8 @@ func TestCSIHook_claimVolumesFromAlloc_Validation(t *testing.T) {
rpcer := mockRPCer{
alloc: alloc,
callCounts: callCounts,
- hasExistingClaim: helper.BoolToPtr(false),
- schedulable: helper.BoolToPtr(true),
+ hasExistingClaim: pointer.Of(false),
+ schedulable: pointer.Of(true),
}
ar := mockAllocRunner{
diff --git a/client/allocrunner/group_service_hook_test.go b/client/allocrunner/group_service_hook_test.go
index 822ae04d72f..e05df8cbc19 100644
--- a/client/allocrunner/group_service_hook_test.go
+++ b/client/allocrunner/group_service_hook_test.go
@@ -10,7 +10,7 @@ import (
"github.com/hashicorp/nomad/client/serviceregistration/wrapper"
"github.com/hashicorp/nomad/client/taskenv"
agentconsul "github.com/hashicorp/nomad/command/agent/consul"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/testlog"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
@@ -74,7 +74,7 @@ func TestGroupServiceHook_ShutdownDelayUpdate(t *testing.T) {
ci.Parallel(t)
alloc := mock.Alloc()
- alloc.Job.TaskGroups[0].ShutdownDelay = helper.TimeToPtr(10 * time.Second)
+ alloc.Job.TaskGroups[0].ShutdownDelay = pointer.Of(10 * time.Second)
logger := testlog.HCLogger(t)
consulMockClient := regMock.NewServiceRegistrationHandler(logger)
@@ -95,7 +95,7 @@ func TestGroupServiceHook_ShutdownDelayUpdate(t *testing.T) {
require.NoError(t, h.Prerun())
// Incease shutdown Delay
- alloc.Job.TaskGroups[0].ShutdownDelay = helper.TimeToPtr(15 * time.Second)
+ alloc.Job.TaskGroups[0].ShutdownDelay = pointer.Of(15 * time.Second)
req := &interfaces.RunnerUpdateRequest{Alloc: alloc}
require.NoError(t, h.Update(req))
diff --git a/client/allocrunner/task_hook_coordinator.go b/client/allocrunner/task_hook_coordinator.go
deleted file mode 100644
index a056fa3eb83..00000000000
--- a/client/allocrunner/task_hook_coordinator.go
+++ /dev/null
@@ -1,199 +0,0 @@
-package allocrunner
-
-import (
- "context"
-
- "github.com/hashicorp/go-hclog"
- "github.com/hashicorp/nomad/client/allocrunner/taskrunner"
- "github.com/hashicorp/nomad/nomad/structs"
-)
-
-// TaskHookCoordinator helps coordinate when mainTasks start tasks can launch
-// namely after all Prestart Tasks have run, and after all BlockUntilCompleted have completed
-type taskHookCoordinator struct {
- logger hclog.Logger
-
- // constant for quickly starting all prestart tasks
- closedCh chan struct{}
-
- // Each context is used to gate task runners launching the tasks. A task
- // runner waits until the context associated its lifecycle context is
- // done/cancelled.
- mainTaskCtx context.Context
- mainTaskCtxCancel func()
-
- poststartTaskCtx context.Context
- poststartTaskCtxCancel func()
- poststopTaskCtx context.Context
- poststopTaskCtxCancel context.CancelFunc
-
- prestartSidecar map[string]struct{}
- prestartEphemeral map[string]struct{}
- mainTasksRunning map[string]struct{} // poststop: main tasks running -> finished
- mainTasksPending map[string]struct{} // poststart: main tasks pending -> running
-}
-
-func newTaskHookCoordinator(logger hclog.Logger, tasks []*structs.Task) *taskHookCoordinator {
- closedCh := make(chan struct{})
- close(closedCh)
-
- mainTaskCtx, mainCancelFn := context.WithCancel(context.Background())
- poststartTaskCtx, poststartCancelFn := context.WithCancel(context.Background())
- poststopTaskCtx, poststopTaskCancelFn := context.WithCancel(context.Background())
-
- c := &taskHookCoordinator{
- logger: logger,
- closedCh: closedCh,
- mainTaskCtx: mainTaskCtx,
- mainTaskCtxCancel: mainCancelFn,
- prestartSidecar: map[string]struct{}{},
- prestartEphemeral: map[string]struct{}{},
- mainTasksRunning: map[string]struct{}{},
- mainTasksPending: map[string]struct{}{},
- poststartTaskCtx: poststartTaskCtx,
- poststartTaskCtxCancel: poststartCancelFn,
- poststopTaskCtx: poststopTaskCtx,
- poststopTaskCtxCancel: poststopTaskCancelFn,
- }
- c.setTasks(tasks)
- return c
-}
-
-func (c *taskHookCoordinator) setTasks(tasks []*structs.Task) {
- for _, task := range tasks {
-
- if task.Lifecycle == nil {
- c.mainTasksPending[task.Name] = struct{}{}
- c.mainTasksRunning[task.Name] = struct{}{}
- continue
- }
-
- switch task.Lifecycle.Hook {
- case structs.TaskLifecycleHookPrestart:
- if task.Lifecycle.Sidecar {
- c.prestartSidecar[task.Name] = struct{}{}
- } else {
- c.prestartEphemeral[task.Name] = struct{}{}
- }
- case structs.TaskLifecycleHookPoststart:
- // Poststart hooks don't need to be tracked.
- case structs.TaskLifecycleHookPoststop:
- // Poststop hooks don't need to be tracked.
- default:
- c.logger.Error("invalid lifecycle hook", "task", task.Name, "hook", task.Lifecycle.Hook)
- }
- }
-
- if !c.hasPrestartTasks() {
- c.mainTaskCtxCancel()
- }
-}
-
-func (c *taskHookCoordinator) hasPrestartTasks() bool {
- return len(c.prestartSidecar)+len(c.prestartEphemeral) > 0
-}
-
-func (c *taskHookCoordinator) hasRunningMainTasks() bool {
- return len(c.mainTasksRunning) > 0
-}
-
-func (c *taskHookCoordinator) hasPendingMainTasks() bool {
- return len(c.mainTasksPending) > 0
-}
-
-func (c *taskHookCoordinator) startConditionForTask(task *structs.Task) <-chan struct{} {
- if task.Lifecycle == nil {
- return c.mainTaskCtx.Done()
- }
-
- switch task.Lifecycle.Hook {
- case structs.TaskLifecycleHookPrestart:
- // Prestart tasks start without checking status of other tasks
- return c.closedCh
- case structs.TaskLifecycleHookPoststart:
- return c.poststartTaskCtx.Done()
- case structs.TaskLifecycleHookPoststop:
- return c.poststopTaskCtx.Done()
- default:
- // it should never have a lifecycle stanza w/o a hook, so report an error but allow the task to start normally
- c.logger.Error("invalid lifecycle hook", "task", task.Name, "hook", task.Lifecycle.Hook)
- return c.mainTaskCtx.Done()
- }
-}
-
-// This is not thread safe! This must only be called from one thread per alloc runner.
-func (c *taskHookCoordinator) taskStateUpdated(states map[string]*structs.TaskState) {
- for task := range c.prestartSidecar {
- st := states[task]
- if st == nil || st.StartedAt.IsZero() {
- continue
- }
-
- delete(c.prestartSidecar, task)
- }
-
- for task := range c.prestartEphemeral {
- st := states[task]
- if st == nil || !st.Successful() {
- continue
- }
-
- delete(c.prestartEphemeral, task)
- }
-
- for task := range c.mainTasksRunning {
- st := states[task]
-
- if st == nil || st.State != structs.TaskStateDead {
- continue
- }
-
- delete(c.mainTasksRunning, task)
- }
-
- for task := range c.mainTasksPending {
- st := states[task]
- if st == nil || st.StartedAt.IsZero() {
- continue
- }
-
- delete(c.mainTasksPending, task)
- }
-
- if !c.hasPrestartTasks() {
- c.mainTaskCtxCancel()
- }
-
- if !c.hasPendingMainTasks() {
- c.poststartTaskCtxCancel()
- }
- if !c.hasRunningMainTasks() {
- c.poststopTaskCtxCancel()
- }
-}
-
-func (c *taskHookCoordinator) StartPoststopTasks() {
- c.poststopTaskCtxCancel()
-}
-
-// hasNonSidecarTasks returns false if all the passed tasks are sidecar tasks
-func hasNonSidecarTasks(tasks []*taskrunner.TaskRunner) bool {
- for _, tr := range tasks {
- if !tr.IsSidecarTask() {
- return true
- }
- }
-
- return false
-}
-
-// hasSidecarTasks returns true if any of the passed tasks are sidecar tasks
-func hasSidecarTasks(tasks map[string]*taskrunner.TaskRunner) bool {
- for _, tr := range tasks {
- if tr.IsSidecarTask() {
- return true
- }
- }
-
- return false
-}
diff --git a/client/allocrunner/task_hook_coordinator_test.go b/client/allocrunner/task_hook_coordinator_test.go
deleted file mode 100644
index 7399acdabb8..00000000000
--- a/client/allocrunner/task_hook_coordinator_test.go
+++ /dev/null
@@ -1,381 +0,0 @@
-package allocrunner
-
-import (
- "fmt"
- "testing"
- "time"
-
- "github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/client/allocrunner/taskrunner"
- "github.com/hashicorp/nomad/helper/testlog"
- "github.com/hashicorp/nomad/nomad/mock"
- "github.com/hashicorp/nomad/nomad/structs"
- "github.com/stretchr/testify/require"
-)
-
-func TestTaskHookCoordinator_OnlyMainApp(t *testing.T) {
- ci.Parallel(t)
-
- alloc := mock.Alloc()
- tasks := alloc.Job.TaskGroups[0].Tasks
- task := tasks[0]
- logger := testlog.HCLogger(t)
-
- coord := newTaskHookCoordinator(logger, tasks)
-
- ch := coord.startConditionForTask(task)
-
- require.Truef(t, isChannelClosed(ch), "%s channel was open, should be closed", task.Name)
-}
-
-func TestTaskHookCoordinator_PrestartRunsBeforeMain(t *testing.T) {
- ci.Parallel(t)
-
- logger := testlog.HCLogger(t)
-
- alloc := mock.LifecycleAlloc()
- tasks := alloc.Job.TaskGroups[0].Tasks
-
- mainTask := tasks[0]
- sideTask := tasks[1]
- initTask := tasks[2]
-
- coord := newTaskHookCoordinator(logger, tasks)
- initCh := coord.startConditionForTask(initTask)
- sideCh := coord.startConditionForTask(sideTask)
- mainCh := coord.startConditionForTask(mainTask)
-
- require.Truef(t, isChannelClosed(initCh), "%s channel was open, should be closed", initTask.Name)
- require.Truef(t, isChannelClosed(sideCh), "%s channel was open, should be closed", sideTask.Name)
- require.Falsef(t, isChannelClosed(mainCh), "%s channel was closed, should be open", mainTask.Name)
-}
-
-func TestTaskHookCoordinator_MainRunsAfterPrestart(t *testing.T) {
- ci.Parallel(t)
-
- logger := testlog.HCLogger(t)
-
- alloc := mock.LifecycleAlloc()
- tasks := alloc.Job.TaskGroups[0].Tasks
-
- mainTask := tasks[0]
- sideTask := tasks[1]
- initTask := tasks[2]
-
- coord := newTaskHookCoordinator(logger, tasks)
- initCh := coord.startConditionForTask(initTask)
- sideCh := coord.startConditionForTask(sideTask)
- mainCh := coord.startConditionForTask(mainTask)
-
- require.Truef(t, isChannelClosed(initCh), "%s channel was open, should be closed", initTask.Name)
- require.Truef(t, isChannelClosed(sideCh), "%s channel was open, should be closed", sideTask.Name)
- require.Falsef(t, isChannelClosed(mainCh), "%s channel was closed, should be open", mainTask.Name)
-
- states := map[string]*structs.TaskState{
- mainTask.Name: {
- State: structs.TaskStatePending,
- Failed: false,
- },
- initTask.Name: {
- State: structs.TaskStateDead,
- Failed: false,
- StartedAt: time.Now(),
- FinishedAt: time.Now(),
- },
- sideTask.Name: {
- State: structs.TaskStateRunning,
- Failed: false,
- StartedAt: time.Now(),
- },
- }
-
- coord.taskStateUpdated(states)
-
- require.Truef(t, isChannelClosed(initCh), "%s channel was open, should be closed", initTask.Name)
- require.Truef(t, isChannelClosed(sideCh), "%s channel was open, should be closed", sideTask.Name)
- require.Truef(t, isChannelClosed(mainCh), "%s channel was open, should be closed", mainTask.Name)
-}
-
-func TestTaskHookCoordinator_MainRunsAfterManyInitTasks(t *testing.T) {
- ci.Parallel(t)
-
- logger := testlog.HCLogger(t)
-
- alloc := mock.LifecycleAlloc()
- alloc.Job = mock.VariableLifecycleJob(structs.Resources{CPU: 100, MemoryMB: 256}, 1, 2, 0)
- tasks := alloc.Job.TaskGroups[0].Tasks
-
- mainTask := tasks[0]
- init1Task := tasks[1]
- init2Task := tasks[2]
-
- coord := newTaskHookCoordinator(logger, tasks)
- mainCh := coord.startConditionForTask(mainTask)
- init1Ch := coord.startConditionForTask(init1Task)
- init2Ch := coord.startConditionForTask(init2Task)
-
- require.Truef(t, isChannelClosed(init1Ch), "%s channel was open, should be closed", init1Task.Name)
- require.Truef(t, isChannelClosed(init2Ch), "%s channel was open, should be closed", init2Task.Name)
- require.Falsef(t, isChannelClosed(mainCh), "%s channel was closed, should be open", mainTask.Name)
-
- states := map[string]*structs.TaskState{
- mainTask.Name: {
- State: structs.TaskStatePending,
- Failed: false,
- },
- init1Task.Name: {
- State: structs.TaskStateDead,
- Failed: false,
- StartedAt: time.Now(),
- FinishedAt: time.Now(),
- },
- init2Task.Name: {
- State: structs.TaskStateDead,
- Failed: false,
- StartedAt: time.Now(),
- },
- }
-
- coord.taskStateUpdated(states)
-
- require.Truef(t, isChannelClosed(init1Ch), "%s channel was open, should be closed", init1Task.Name)
- require.Truef(t, isChannelClosed(init2Ch), "%s channel was open, should be closed", init2Task.Name)
- require.Truef(t, isChannelClosed(mainCh), "%s channel was open, should be closed", mainTask.Name)
-}
-
-func TestTaskHookCoordinator_FailedInitTask(t *testing.T) {
- ci.Parallel(t)
-
- logger := testlog.HCLogger(t)
-
- alloc := mock.LifecycleAlloc()
- alloc.Job = mock.VariableLifecycleJob(structs.Resources{CPU: 100, MemoryMB: 256}, 1, 2, 0)
- tasks := alloc.Job.TaskGroups[0].Tasks
-
- mainTask := tasks[0]
- init1Task := tasks[1]
- init2Task := tasks[2]
-
- coord := newTaskHookCoordinator(logger, tasks)
- mainCh := coord.startConditionForTask(mainTask)
- init1Ch := coord.startConditionForTask(init1Task)
- init2Ch := coord.startConditionForTask(init2Task)
-
- require.Truef(t, isChannelClosed(init1Ch), "%s channel was open, should be closed", init1Task.Name)
- require.Truef(t, isChannelClosed(init2Ch), "%s channel was open, should be closed", init2Task.Name)
- require.Falsef(t, isChannelClosed(mainCh), "%s channel was closed, should be open", mainTask.Name)
-
- states := map[string]*structs.TaskState{
- mainTask.Name: {
- State: structs.TaskStatePending,
- Failed: false,
- },
- init1Task.Name: {
- State: structs.TaskStateDead,
- Failed: false,
- StartedAt: time.Now(),
- FinishedAt: time.Now(),
- },
- init2Task.Name: {
- State: structs.TaskStateDead,
- Failed: true,
- StartedAt: time.Now(),
- },
- }
-
- coord.taskStateUpdated(states)
-
- require.Truef(t, isChannelClosed(init1Ch), "%s channel was open, should be closed", init1Task.Name)
- require.Truef(t, isChannelClosed(init2Ch), "%s channel was open, should be closed", init2Task.Name)
- require.Falsef(t, isChannelClosed(mainCh), "%s channel was closed, should be open", mainTask.Name)
-}
-
-func TestTaskHookCoordinator_SidecarNeverStarts(t *testing.T) {
- ci.Parallel(t)
-
- logger := testlog.HCLogger(t)
-
- alloc := mock.LifecycleAlloc()
- tasks := alloc.Job.TaskGroups[0].Tasks
-
- mainTask := tasks[0]
- sideTask := tasks[1]
- initTask := tasks[2]
-
- coord := newTaskHookCoordinator(logger, tasks)
- initCh := coord.startConditionForTask(initTask)
- sideCh := coord.startConditionForTask(sideTask)
- mainCh := coord.startConditionForTask(mainTask)
-
- require.Truef(t, isChannelClosed(initCh), "%s channel was open, should be closed", initTask.Name)
- require.Truef(t, isChannelClosed(sideCh), "%s channel was open, should be closed", sideTask.Name)
- require.Falsef(t, isChannelClosed(mainCh), "%s channel was closed, should be open", mainTask.Name)
-
- states := map[string]*structs.TaskState{
- mainTask.Name: {
- State: structs.TaskStatePending,
- Failed: false,
- },
- initTask.Name: {
- State: structs.TaskStateDead,
- Failed: false,
- StartedAt: time.Now(),
- FinishedAt: time.Now(),
- },
- sideTask.Name: {
- State: structs.TaskStatePending,
- Failed: false,
- },
- }
-
- coord.taskStateUpdated(states)
-
- require.Truef(t, isChannelClosed(initCh), "%s channel was open, should be closed", initTask.Name)
- require.Truef(t, isChannelClosed(sideCh), "%s channel was open, should be closed", sideTask.Name)
- require.Falsef(t, isChannelClosed(mainCh), "%s channel was closed, should be open", mainTask.Name)
-}
-
-func TestTaskHookCoordinator_PoststartStartsAfterMain(t *testing.T) {
- ci.Parallel(t)
-
- logger := testlog.HCLogger(t)
-
- alloc := mock.LifecycleAlloc()
- tasks := alloc.Job.TaskGroups[0].Tasks
-
- mainTask := tasks[0]
- sideTask := tasks[1]
- postTask := tasks[2]
-
- // Make the the third task a poststart hook
- postTask.Lifecycle.Hook = structs.TaskLifecycleHookPoststart
-
- coord := newTaskHookCoordinator(logger, tasks)
- postCh := coord.startConditionForTask(postTask)
- sideCh := coord.startConditionForTask(sideTask)
- mainCh := coord.startConditionForTask(mainTask)
-
- require.Truef(t, isChannelClosed(sideCh), "%s channel was open, should be closed", sideTask.Name)
- require.Falsef(t, isChannelClosed(mainCh), "%s channel was closed, should be open", mainTask.Name)
- require.Falsef(t, isChannelClosed(mainCh), "%s channel was closed, should be open", postTask.Name)
-
- states := map[string]*structs.TaskState{
- postTask.Name: {
- State: structs.TaskStatePending,
- Failed: false,
- },
- mainTask.Name: {
- State: structs.TaskStateRunning,
- Failed: false,
- StartedAt: time.Now(),
- },
- sideTask.Name: {
- State: structs.TaskStateRunning,
- Failed: false,
- StartedAt: time.Now(),
- },
- }
-
- coord.taskStateUpdated(states)
-
- require.Truef(t, isChannelClosed(postCh), "%s channel was open, should be closed", postTask.Name)
- require.Truef(t, isChannelClosed(sideCh), "%s channel was open, should be closed", sideTask.Name)
- require.Truef(t, isChannelClosed(mainCh), "%s channel was open, should be closed", mainTask.Name)
-}
-
-func isChannelClosed(ch <-chan struct{}) bool {
- select {
- case <-ch:
- return true
- default:
- return false
- }
-}
-
-func TestHasSidecarTasks(t *testing.T) {
- ci.Parallel(t)
-
- falseV, trueV := false, true
-
- cases := []struct {
- name string
- // nil if main task, false if non-sidecar hook, true if sidecar hook
- indicators []*bool
-
- hasSidecars bool
- hasNonsidecars bool
- }{
- {
- name: "all sidecar - one",
- indicators: []*bool{&trueV},
- hasSidecars: true,
- hasNonsidecars: false,
- },
- {
- name: "all sidecar - multiple",
- indicators: []*bool{&trueV, &trueV, &trueV},
- hasSidecars: true,
- hasNonsidecars: false,
- },
- {
- name: "some sidecars, some others",
- indicators: []*bool{nil, &falseV, &trueV},
- hasSidecars: true,
- hasNonsidecars: true,
- },
- {
- name: "no sidecars",
- indicators: []*bool{nil, &falseV, nil},
- hasSidecars: false,
- hasNonsidecars: true,
- },
- }
-
- for _, c := range cases {
- t.Run(c.name, func(t *testing.T) {
- alloc := allocWithSidecarIndicators(c.indicators)
- arConf, cleanup := testAllocRunnerConfig(t, alloc)
- defer cleanup()
-
- ar, err := NewAllocRunner(arConf)
- require.NoError(t, err)
-
- require.Equal(t, c.hasSidecars, hasSidecarTasks(ar.tasks), "sidecars")
-
- runners := []*taskrunner.TaskRunner{}
- for _, r := range ar.tasks {
- runners = append(runners, r)
- }
- require.Equal(t, c.hasNonsidecars, hasNonSidecarTasks(runners), "non-sidecars")
-
- })
- }
-}
-
-func allocWithSidecarIndicators(indicators []*bool) *structs.Allocation {
- alloc := mock.BatchAlloc()
-
- tasks := []*structs.Task{}
- resources := map[string]*structs.AllocatedTaskResources{}
-
- tr := alloc.AllocatedResources.Tasks[alloc.Job.TaskGroups[0].Tasks[0].Name]
-
- for i, indicator := range indicators {
- task := alloc.Job.TaskGroups[0].Tasks[0].Copy()
- task.Name = fmt.Sprintf("task%d", i)
- if indicator != nil {
- task.Lifecycle = &structs.TaskLifecycleConfig{
- Hook: structs.TaskLifecycleHookPrestart,
- Sidecar: *indicator,
- }
- }
- tasks = append(tasks, task)
- resources[task.Name] = tr
- }
-
- alloc.Job.TaskGroups[0].Tasks = tasks
-
- alloc.AllocatedResources.Tasks = resources
- return alloc
-
-}
diff --git a/client/allocrunner/tasklifecycle/coordinator.go b/client/allocrunner/tasklifecycle/coordinator.go
new file mode 100644
index 00000000000..90a8e7fc097
--- /dev/null
+++ b/client/allocrunner/tasklifecycle/coordinator.go
@@ -0,0 +1,427 @@
+package tasklifecycle
+
+import (
+ "fmt"
+ "sync"
+
+ "github.com/hashicorp/go-hclog"
+ "github.com/hashicorp/nomad/nomad/structs"
+)
+
+// coordinatorState represents a state of the task lifecycle Coordinator FSM.
+type coordinatorState uint8
+
+const (
+ coordinatorStateInit coordinatorState = iota
+ coordinatorStatePrestart
+ coordinatorStateMain
+ coordinatorStatePoststart
+ coordinatorStateWaitAlloc
+ coordinatorStatePoststop
+)
+
+func (s coordinatorState) String() string {
+ switch s {
+ case coordinatorStateInit:
+ return "init"
+ case coordinatorStatePrestart:
+ return "prestart"
+ case coordinatorStateMain:
+ return "main"
+ case coordinatorStatePoststart:
+ return "poststart"
+ case coordinatorStateWaitAlloc:
+ return "wait_alloc"
+ case coordinatorStatePoststop:
+ return "poststart"
+ }
+ panic(fmt.Sprintf("Unexpected task coordinator state %d", s))
+}
+
+// lifecycleStage represents a lifecycle configuration used for task
+// coordination.
+//
+// Not all possible combinations of hook X sidecar are defined, only the ones
+// that are relevant for coordinating task initialization order. For example, a
+// main task with sidecar set to `true` starts at the same time as a
+// non-sidecar main task, so there is no need to treat them differently.
+type lifecycleStage uint8
+
+const (
+ // lifecycleStagePrestartEphemeral are tasks with the "prestart" hook and
+ // sidecar set to "false".
+ lifecycleStagePrestartEphemeral lifecycleStage = iota
+
+ // lifecycleStagePrestartSidecar are tasks with the "prestart" hook and
+ // sidecar set to "true".
+ lifecycleStagePrestartSidecar
+
+ // lifecycleStageMain are tasks without a lifecycle or a lifecycle with an
+ // empty hook value.
+ lifecycleStageMain
+
+ // lifecycleStagePoststartEphemeral are tasks with the "poststart" hook and
+ // sidecar set to "false"
+ lifecycleStagePoststartEphemeral
+
+ // lifecycleStagePoststartSidecar are tasks with the "poststart" hook and
+ // sidecar set to "true".
+ lifecycleStagePoststartSidecar
+
+ // lifecycleStagePoststop are tasks with the "poststop" hook.
+ lifecycleStagePoststop
+)
+
+// Coordinator controls when tasks with a given lifecycle configuration are
+// allowed to start and run.
+//
+// It behaves like a finite state machine where each state transition blocks or
+// allows some task lifecycle types to run.
+type Coordinator struct {
+ logger hclog.Logger
+
+ // tasksByLifecycle is an index used to group and quickly access tasks by
+ // their lifecycle stage.
+ tasksByLifecycle map[lifecycleStage][]string
+
+ // currentState is the current state of the FSM. It must only be accessed
+ // while holding the lock.
+ currentState coordinatorState
+ currentStateLock sync.RWMutex
+
+ // gates store the gates that control each task lifecycle stage.
+ gates map[lifecycleStage]*Gate
+}
+
+// NewCoordinator returns a new Coordinator with all tasks initially blocked.
+func NewCoordinator(logger hclog.Logger, tasks []*structs.Task, shutdownCh <-chan struct{}) *Coordinator {
+ c := &Coordinator{
+ logger: logger.Named("task_coordinator"),
+ tasksByLifecycle: indexTasksByLifecycle(tasks),
+ gates: make(map[lifecycleStage]*Gate),
+ }
+
+ for lifecycle := range c.tasksByLifecycle {
+ c.gates[lifecycle] = NewGate(shutdownCh)
+ }
+
+ c.enterStateLocked(coordinatorStateInit)
+ return c
+}
+
+// Restart sets the Coordinator state back to "init" and is used to coordinate
+// a full alloc restart. Since all tasks will run again they need to be pending
+// before they are allowed to proceed.
+func (c *Coordinator) Restart() {
+ c.currentStateLock.Lock()
+ defer c.currentStateLock.Unlock()
+ c.enterStateLocked(coordinatorStateInit)
+}
+
+// Restore is used to set the Coordinator FSM to the correct state when an
+// alloc is restored. Must be called before the allocrunner is running.
+func (c *Coordinator) Restore(states map[string]*structs.TaskState) {
+ // Skip the "init" state when restoring since the tasks were likely already
+ // running, causing the Coordinator to be stuck waiting for them to be
+ // "pending".
+ c.enterStateLocked(coordinatorStatePrestart)
+ c.TaskStateUpdated(states)
+}
+
+// StartConditionForTask returns a channel that is unblocked when the task is
+// allowed to run.
+func (c *Coordinator) StartConditionForTask(task *structs.Task) <-chan struct{} {
+ lifecycle := taskLifecycleStage(task)
+ return c.gates[lifecycle].WaitCh()
+}
+
+// TaskStateUpdated notifies that a task state has changed. This may cause the
+// Coordinator to transition to another state.
+func (c *Coordinator) TaskStateUpdated(states map[string]*structs.TaskState) {
+ c.currentStateLock.Lock()
+ defer c.currentStateLock.Unlock()
+
+ // We may be able to move directly through some states (for example, when
+ // an alloc doesn't have any prestart task we can skip the prestart state),
+ // so loop until we stabilize.
+ // This is also important when restoring an alloc since we need to find the
+ // state where FSM was last positioned.
+ for {
+ nextState := c.nextStateLocked(states)
+ if nextState == c.currentState {
+ return
+ }
+
+ c.enterStateLocked(nextState)
+ }
+}
+
+// nextStateLocked returns the state the FSM should transition to given its
+// current internal state and the received states of the tasks.
+// The currentStateLock must be held before calling this method.
+func (c *Coordinator) nextStateLocked(states map[string]*structs.TaskState) coordinatorState {
+
+ // coordinatorStatePoststop is the terminal state of the FSM, and can be
+ // reached at any time.
+ if c.isAllocDone(states) {
+ return coordinatorStatePoststop
+ }
+
+ switch c.currentState {
+ case coordinatorStateInit:
+ if !c.isInitDone(states) {
+ return coordinatorStateInit
+ }
+ return coordinatorStatePrestart
+
+ case coordinatorStatePrestart:
+ if !c.isPrestartDone(states) {
+ return coordinatorStatePrestart
+ }
+ return coordinatorStateMain
+
+ case coordinatorStateMain:
+ if !c.isMainDone(states) {
+ return coordinatorStateMain
+ }
+ return coordinatorStatePoststart
+
+ case coordinatorStatePoststart:
+ if !c.isPoststartDone(states) {
+ return coordinatorStatePoststart
+ }
+ return coordinatorStateWaitAlloc
+
+ case coordinatorStateWaitAlloc:
+ if !c.isAllocDone(states) {
+ return coordinatorStateWaitAlloc
+ }
+ return coordinatorStatePoststop
+
+ case coordinatorStatePoststop:
+ return coordinatorStatePoststop
+ }
+
+ // If the code reaches here it's a programming error, since the switch
+ // statement should cover all possible states and return the next state.
+ panic(fmt.Sprintf("unexpected state %s", c.currentState))
+}
+
+// enterStateLocked updates the current state of the Coordinator FSM and
+// executes any action necessary for the state transition.
+// The currentStateLock must be held before calling this method.
+func (c *Coordinator) enterStateLocked(state coordinatorState) {
+ c.logger.Trace("state transition", "from", c.currentState, "to", state)
+
+ switch state {
+ case coordinatorStateInit:
+ c.block(lifecycleStagePrestartEphemeral)
+ c.block(lifecycleStagePrestartSidecar)
+ c.block(lifecycleStageMain)
+ c.block(lifecycleStagePoststartEphemeral)
+ c.block(lifecycleStagePoststartSidecar)
+ c.block(lifecycleStagePoststop)
+
+ case coordinatorStatePrestart:
+ c.block(lifecycleStageMain)
+ c.block(lifecycleStagePoststartEphemeral)
+ c.block(lifecycleStagePoststartSidecar)
+ c.block(lifecycleStagePoststop)
+
+ c.allow(lifecycleStagePrestartEphemeral)
+ c.allow(lifecycleStagePrestartSidecar)
+
+ case coordinatorStateMain:
+ c.block(lifecycleStagePrestartEphemeral)
+ c.block(lifecycleStagePoststartEphemeral)
+ c.block(lifecycleStagePoststartSidecar)
+ c.block(lifecycleStagePoststop)
+
+ c.allow(lifecycleStagePrestartSidecar)
+ c.allow(lifecycleStageMain)
+
+ case coordinatorStatePoststart:
+ c.block(lifecycleStagePrestartEphemeral)
+ c.block(lifecycleStagePoststop)
+
+ c.allow(lifecycleStagePrestartSidecar)
+ c.allow(lifecycleStageMain)
+ c.allow(lifecycleStagePoststartEphemeral)
+ c.allow(lifecycleStagePoststartSidecar)
+
+ case coordinatorStateWaitAlloc:
+ c.block(lifecycleStagePrestartEphemeral)
+ c.block(lifecycleStagePoststartEphemeral)
+ c.block(lifecycleStagePoststop)
+
+ c.allow(lifecycleStagePrestartSidecar)
+ c.allow(lifecycleStageMain)
+ c.allow(lifecycleStagePoststartSidecar)
+
+ case coordinatorStatePoststop:
+ c.block(lifecycleStagePrestartEphemeral)
+ c.block(lifecycleStagePrestartSidecar)
+ c.block(lifecycleStageMain)
+ c.block(lifecycleStagePoststartEphemeral)
+ c.block(lifecycleStagePoststartSidecar)
+
+ c.allow(lifecycleStagePoststop)
+ }
+
+ c.currentState = state
+}
+
+// isInitDone returns true when the following conditions are met:
+// - all tasks are in the "pending" state.
+func (c *Coordinator) isInitDone(states map[string]*structs.TaskState) bool {
+ for _, task := range states {
+ if task.State != structs.TaskStatePending {
+ return false
+ }
+ }
+ return true
+}
+
+// isPrestartDone returns true when the following conditions are met:
+// - there is at least one prestart task
+// - all ephemeral prestart tasks are successful.
+// - no ephemeral prestart task has failed.
+// - all prestart sidecar tasks are running.
+func (c *Coordinator) isPrestartDone(states map[string]*structs.TaskState) bool {
+ if !c.hasPrestart() {
+ return true
+ }
+
+ for _, task := range c.tasksByLifecycle[lifecycleStagePrestartEphemeral] {
+ if !states[task].Successful() {
+ return false
+ }
+ }
+ for _, task := range c.tasksByLifecycle[lifecycleStagePrestartSidecar] {
+ if states[task].State != structs.TaskStateRunning {
+ return false
+ }
+ }
+ return true
+}
+
+// isMainDone returns true when the following conditions are met:
+// - there is at least one main task.
+// - all main tasks are no longer "pending".
+func (c *Coordinator) isMainDone(states map[string]*structs.TaskState) bool {
+ if !c.hasMain() {
+ return true
+ }
+
+ for _, task := range c.tasksByLifecycle[lifecycleStageMain] {
+ if states[task].State == structs.TaskStatePending {
+ return false
+ }
+ }
+ return true
+}
+
+// isPoststartDone returns true when the following conditions are met:
+// - there is at least one poststart task.
+// - all ephemeral poststart tasks are in the "dead" state.
+func (c *Coordinator) isPoststartDone(states map[string]*structs.TaskState) bool {
+ if !c.hasPoststart() {
+ return true
+ }
+
+ for _, task := range c.tasksByLifecycle[lifecycleStagePoststartEphemeral] {
+ if states[task].State != structs.TaskStateDead {
+ return false
+ }
+ }
+ return true
+}
+
+// isAllocDone returns true when the following conditions are met:
+// - all non-poststop tasks are in the "dead" state.
+func (c *Coordinator) isAllocDone(states map[string]*structs.TaskState) bool {
+ for lifecycle, tasks := range c.tasksByLifecycle {
+ if lifecycle == lifecycleStagePoststop {
+ continue
+ }
+
+ for _, task := range tasks {
+ if states[task].State != structs.TaskStateDead {
+ return false
+ }
+ }
+ }
+ return true
+}
+
+func (c *Coordinator) hasPrestart() bool {
+ return len(c.tasksByLifecycle[lifecycleStagePrestartEphemeral])+
+ len(c.tasksByLifecycle[lifecycleStagePrestartSidecar]) > 0
+}
+
+func (c *Coordinator) hasMain() bool {
+ return len(c.tasksByLifecycle[lifecycleStageMain]) > 0
+}
+
+func (c *Coordinator) hasPoststart() bool {
+ return len(c.tasksByLifecycle[lifecycleStagePoststartEphemeral])+
+ len(c.tasksByLifecycle[lifecycleStagePoststartSidecar]) > 0
+}
+
+func (c *Coordinator) hasPoststop() bool {
+ return len(c.tasksByLifecycle[lifecycleStagePoststop]) > 0
+}
+
+// block is used to block the execution of tasks in the given lifecycle stage.
+func (c *Coordinator) block(lifecycle lifecycleStage) {
+ gate := c.gates[lifecycle]
+ if gate != nil {
+ gate.Close()
+ }
+}
+
+// allows is used to allow the execution of tasks in the given lifecycle stage.
+func (c *Coordinator) allow(lifecycle lifecycleStage) {
+ gate := c.gates[lifecycle]
+ if gate != nil {
+ gate.Open()
+ }
+}
+
+// indexTasksByLifecycle generates a map that groups tasks by their lifecycle
+// configuration. This makes it easier to retrieve tasks by these groups or to
+// determine if a task has a certain lifecycle configuration.
+func indexTasksByLifecycle(tasks []*structs.Task) map[lifecycleStage][]string {
+ index := make(map[lifecycleStage][]string)
+
+ for _, task := range tasks {
+ lifecycle := taskLifecycleStage(task)
+
+ if _, ok := index[lifecycle]; !ok {
+ index[lifecycle] = []string{}
+ }
+ index[lifecycle] = append(index[lifecycle], task.Name)
+ }
+
+ return index
+}
+
+// taskLifecycleStage returns the relevant lifecycle stage for a given task.
+func taskLifecycleStage(task *structs.Task) lifecycleStage {
+ if task.IsPrestart() {
+ if task.Lifecycle.Sidecar {
+ return lifecycleStagePrestartSidecar
+ }
+ return lifecycleStagePrestartEphemeral
+ } else if task.IsPoststart() {
+ if task.Lifecycle.Sidecar {
+ return lifecycleStagePoststartSidecar
+ }
+ return lifecycleStagePoststartEphemeral
+ } else if task.IsPoststop() {
+ return lifecycleStagePoststop
+ }
+
+ // Assume task is "main" by default.
+ return lifecycleStageMain
+}
diff --git a/client/allocrunner/tasklifecycle/coordinator_test.go b/client/allocrunner/tasklifecycle/coordinator_test.go
new file mode 100644
index 00000000000..3f86dcc99f3
--- /dev/null
+++ b/client/allocrunner/tasklifecycle/coordinator_test.go
@@ -0,0 +1,560 @@
+package tasklifecycle
+
+import (
+ "testing"
+ "time"
+
+ "github.com/hashicorp/nomad/ci"
+ "github.com/hashicorp/nomad/helper/testlog"
+ "github.com/hashicorp/nomad/nomad/mock"
+ "github.com/hashicorp/nomad/nomad/structs"
+)
+
+func TestCoordinator_OnlyMainApp(t *testing.T) {
+ ci.Parallel(t)
+
+ alloc := mock.Alloc()
+ tasks := alloc.Job.TaskGroups[0].Tasks
+ task := tasks[0]
+ logger := testlog.HCLogger(t)
+
+ shutdownCh := make(chan struct{})
+ defer close(shutdownCh)
+ coord := NewCoordinator(logger, tasks, shutdownCh)
+
+ // Tasks starts blocked.
+ RequireTaskBlocked(t, coord, task)
+
+ // When main is pending it's allowed to run.
+ states := map[string]*structs.TaskState{
+ task.Name: {
+ State: structs.TaskStatePending,
+ Failed: false,
+ },
+ }
+ coord.TaskStateUpdated(states)
+ RequireTaskAllowed(t, coord, task)
+
+ // After main is running, main tasks are still allowed to run.
+ states = map[string]*structs.TaskState{
+ task.Name: {
+ State: structs.TaskStateRunning,
+ Failed: false,
+ },
+ }
+ coord.TaskStateUpdated(states)
+ RequireTaskAllowed(t, coord, task)
+}
+
+func TestCoordinator_PrestartRunsBeforeMain(t *testing.T) {
+ ci.Parallel(t)
+
+ logger := testlog.HCLogger(t)
+
+ alloc := mock.LifecycleAlloc()
+ tasks := alloc.Job.TaskGroups[0].Tasks
+
+ mainTask := tasks[0]
+ sideTask := tasks[1]
+ initTask := tasks[2]
+
+ // Only use the tasks that we care about.
+ tasks = []*structs.Task{mainTask, sideTask, initTask}
+
+ shutdownCh := make(chan struct{})
+ defer close(shutdownCh)
+ coord := NewCoordinator(logger, tasks, shutdownCh)
+
+ // All tasks start blocked.
+ RequireTaskBlocked(t, coord, initTask)
+ RequireTaskBlocked(t, coord, sideTask)
+ RequireTaskBlocked(t, coord, mainTask)
+
+ // Set initial state, prestart tasks are allowed to run.
+ states := map[string]*structs.TaskState{
+ initTask.Name: {
+ State: structs.TaskStatePending,
+ Failed: false,
+ },
+ sideTask.Name: {
+ State: structs.TaskStatePending,
+ Failed: false,
+ },
+ mainTask.Name: {
+ State: structs.TaskStatePending,
+ Failed: false,
+ },
+ }
+ coord.TaskStateUpdated(states)
+ RequireTaskAllowed(t, coord, initTask)
+ RequireTaskAllowed(t, coord, sideTask)
+ RequireTaskBlocked(t, coord, mainTask)
+
+ // Sidecar task is running, main is blocked.
+ states = map[string]*structs.TaskState{
+ initTask.Name: {
+ State: structs.TaskStatePending,
+ Failed: false,
+ },
+ sideTask.Name: {
+ State: structs.TaskStateRunning,
+ Failed: false,
+ },
+ mainTask.Name: {
+ State: structs.TaskStatePending,
+ Failed: false,
+ },
+ }
+ coord.TaskStateUpdated(states)
+ RequireTaskAllowed(t, coord, initTask)
+ RequireTaskAllowed(t, coord, sideTask)
+ RequireTaskBlocked(t, coord, mainTask)
+
+ // Init task is running, main is blocked.
+ states = map[string]*structs.TaskState{
+ initTask.Name: {
+ State: structs.TaskStateRunning,
+ Failed: false,
+ },
+ sideTask.Name: {
+ State: structs.TaskStateRunning,
+ Failed: false,
+ },
+ mainTask.Name: {
+ State: structs.TaskStatePending,
+ Failed: false,
+ },
+ }
+ coord.TaskStateUpdated(states)
+ RequireTaskAllowed(t, coord, initTask)
+ RequireTaskAllowed(t, coord, sideTask)
+ RequireTaskBlocked(t, coord, mainTask)
+
+ // Init task is done, main is now allowed to run.
+ states = map[string]*structs.TaskState{
+ initTask.Name: {
+ State: structs.TaskStateDead,
+ Failed: false,
+ },
+ sideTask.Name: {
+ State: structs.TaskStateRunning,
+ Failed: false,
+ },
+ mainTask.Name: {
+ State: structs.TaskStatePending,
+ Failed: false,
+ },
+ }
+ coord.TaskStateUpdated(states)
+ RequireTaskBlocked(t, coord, initTask)
+ RequireTaskAllowed(t, coord, sideTask)
+ RequireTaskAllowed(t, coord, mainTask)
+}
+
+func TestCoordinator_MainRunsAfterManyInitTasks(t *testing.T) {
+ ci.Parallel(t)
+
+ logger := testlog.HCLogger(t)
+
+ alloc := mock.LifecycleAlloc()
+ alloc.Job = mock.VariableLifecycleJob(structs.Resources{CPU: 100, MemoryMB: 256}, 1, 2, 0)
+ tasks := alloc.Job.TaskGroups[0].Tasks
+
+ mainTask := tasks[0]
+ init1Task := tasks[1]
+ init2Task := tasks[2]
+
+ // Only use the tasks that we care about.
+ tasks = []*structs.Task{mainTask, init1Task, init2Task}
+
+ shutdownCh := make(chan struct{})
+ defer close(shutdownCh)
+ coord := NewCoordinator(logger, tasks, shutdownCh)
+
+ // All tasks start blocked.
+ RequireTaskBlocked(t, coord, init1Task)
+ RequireTaskBlocked(t, coord, init2Task)
+ RequireTaskBlocked(t, coord, mainTask)
+
+ // Set initial state, prestart tasks are allowed to run, main is blocked.
+ states := map[string]*structs.TaskState{
+ init1Task.Name: {
+ State: structs.TaskStatePending,
+ Failed: false,
+ },
+ init2Task.Name: {
+ State: structs.TaskStatePending,
+ Failed: false,
+ },
+ mainTask.Name: {
+ State: structs.TaskStatePending,
+ Failed: false,
+ },
+ }
+ coord.TaskStateUpdated(states)
+ RequireTaskAllowed(t, coord, init1Task)
+ RequireTaskAllowed(t, coord, init2Task)
+ RequireTaskBlocked(t, coord, mainTask)
+
+ // Init tasks complete, main is allowed to run.
+ states = map[string]*structs.TaskState{
+ init1Task.Name: {
+ State: structs.TaskStateDead,
+ Failed: false,
+ StartedAt: time.Now(),
+ FinishedAt: time.Now(),
+ },
+ init2Task.Name: {
+ State: structs.TaskStateDead,
+ Failed: false,
+ StartedAt: time.Now(),
+ },
+ mainTask.Name: {
+ State: structs.TaskStatePending,
+ Failed: false,
+ },
+ }
+ coord.TaskStateUpdated(states)
+ RequireTaskBlocked(t, coord, init1Task)
+ RequireTaskBlocked(t, coord, init2Task)
+ RequireTaskAllowed(t, coord, mainTask)
+}
+
+func TestCoordinator_FailedInitTask(t *testing.T) {
+ ci.Parallel(t)
+
+ logger := testlog.HCLogger(t)
+
+ alloc := mock.LifecycleAlloc()
+ alloc.Job = mock.VariableLifecycleJob(structs.Resources{CPU: 100, MemoryMB: 256}, 1, 2, 0)
+ tasks := alloc.Job.TaskGroups[0].Tasks
+
+ mainTask := tasks[0]
+ init1Task := tasks[1]
+ init2Task := tasks[2]
+
+ // Only use the tasks that we care about.
+ tasks = []*structs.Task{mainTask, init1Task, init2Task}
+
+ shutdownCh := make(chan struct{})
+ defer close(shutdownCh)
+ coord := NewCoordinator(logger, tasks, shutdownCh)
+
+ // All tasks start blocked.
+ RequireTaskBlocked(t, coord, init1Task)
+ RequireTaskBlocked(t, coord, init2Task)
+ RequireTaskBlocked(t, coord, mainTask)
+
+ // Set initial state, prestart tasks are allowed to run, main is blocked.
+ states := map[string]*structs.TaskState{
+ init1Task.Name: {
+ State: structs.TaskStatePending,
+ Failed: false,
+ },
+ init2Task.Name: {
+ State: structs.TaskStatePending,
+ Failed: false,
+ },
+ mainTask.Name: {
+ State: structs.TaskStatePending,
+ Failed: false,
+ },
+ }
+ coord.TaskStateUpdated(states)
+ RequireTaskAllowed(t, coord, init1Task)
+ RequireTaskAllowed(t, coord, init2Task)
+ RequireTaskBlocked(t, coord, mainTask)
+
+ // Init task dies, main is still blocked.
+ states = map[string]*structs.TaskState{
+ init1Task.Name: {
+ State: structs.TaskStateDead,
+ Failed: false,
+ StartedAt: time.Now(),
+ FinishedAt: time.Now(),
+ },
+ init2Task.Name: {
+ State: structs.TaskStateDead,
+ Failed: true,
+ StartedAt: time.Now(),
+ },
+ mainTask.Name: {
+ State: structs.TaskStatePending,
+ Failed: false,
+ },
+ }
+ coord.TaskStateUpdated(states)
+ RequireTaskAllowed(t, coord, init1Task)
+ RequireTaskAllowed(t, coord, init2Task)
+ RequireTaskBlocked(t, coord, mainTask)
+}
+
+func TestCoordinator_SidecarNeverStarts(t *testing.T) {
+ ci.Parallel(t)
+
+ logger := testlog.HCLogger(t)
+
+ alloc := mock.LifecycleAlloc()
+ tasks := alloc.Job.TaskGroups[0].Tasks
+
+ mainTask := tasks[0]
+ sideTask := tasks[1]
+ initTask := tasks[2]
+
+ // Only use the tasks that we care about.
+ tasks = []*structs.Task{mainTask, sideTask, initTask}
+
+ shutdownCh := make(chan struct{})
+ defer close(shutdownCh)
+ coord := NewCoordinator(logger, tasks, shutdownCh)
+
+ // All tasks start blocked.
+ RequireTaskBlocked(t, coord, initTask)
+ RequireTaskBlocked(t, coord, sideTask)
+ RequireTaskBlocked(t, coord, mainTask)
+
+ // Set initial state, prestart tasks are allowed to run, main is blocked.
+ states := map[string]*structs.TaskState{
+ initTask.Name: {
+ State: structs.TaskStatePending,
+ Failed: false,
+ },
+ sideTask.Name: {
+ State: structs.TaskStatePending,
+ Failed: false,
+ },
+ mainTask.Name: {
+ State: structs.TaskStatePending,
+ Failed: false,
+ },
+ }
+ coord.TaskStateUpdated(states)
+ RequireTaskAllowed(t, coord, initTask)
+ RequireTaskAllowed(t, coord, sideTask)
+ RequireTaskBlocked(t, coord, mainTask)
+
+ // Init completes, but sidecar not yet.
+ states = map[string]*structs.TaskState{
+ initTask.Name: {
+ State: structs.TaskStateDead,
+ Failed: false,
+ StartedAt: time.Now(),
+ FinishedAt: time.Now(),
+ },
+ sideTask.Name: {
+ State: structs.TaskStatePending,
+ Failed: false,
+ },
+ mainTask.Name: {
+ State: structs.TaskStatePending,
+ Failed: false,
+ },
+ }
+ coord.TaskStateUpdated(states)
+ RequireTaskAllowed(t, coord, initTask)
+ RequireTaskAllowed(t, coord, sideTask)
+ RequireTaskBlocked(t, coord, mainTask)
+}
+
+func TestCoordinator_PoststartStartsAfterMain(t *testing.T) {
+ ci.Parallel(t)
+
+ logger := testlog.HCLogger(t)
+
+ alloc := mock.LifecycleAlloc()
+ tasks := alloc.Job.TaskGroups[0].Tasks
+
+ mainTask := tasks[0]
+ sideTask := tasks[1]
+ postTask := tasks[2]
+
+ // Only use the tasks that we care about.
+ tasks = []*structs.Task{mainTask, sideTask, postTask}
+
+ // Make the the third task is a poststart hook
+ postTask.Lifecycle.Hook = structs.TaskLifecycleHookPoststart
+
+ shutdownCh := make(chan struct{})
+ defer close(shutdownCh)
+ coord := NewCoordinator(logger, tasks, shutdownCh)
+
+ // All tasks start blocked.
+ RequireTaskBlocked(t, coord, sideTask)
+ RequireTaskBlocked(t, coord, mainTask)
+ RequireTaskBlocked(t, coord, postTask)
+
+ // Set initial state, prestart tasks are allowed to run, main and poststart
+ // are blocked.
+ states := map[string]*structs.TaskState{
+ sideTask.Name: {
+ State: structs.TaskStatePending,
+ Failed: false,
+ },
+ mainTask.Name: {
+ State: structs.TaskStatePending,
+ Failed: false,
+ },
+ postTask.Name: {
+ State: structs.TaskStatePending,
+ Failed: false,
+ },
+ }
+ coord.TaskStateUpdated(states)
+ RequireTaskAllowed(t, coord, sideTask)
+ RequireTaskBlocked(t, coord, mainTask)
+ RequireTaskBlocked(t, coord, postTask)
+
+ // Sidecar and main running, poststart allowed to run.
+ states = map[string]*structs.TaskState{
+ sideTask.Name: {
+ State: structs.TaskStateRunning,
+ Failed: false,
+ StartedAt: time.Now(),
+ },
+ mainTask.Name: {
+ State: structs.TaskStateRunning,
+ Failed: false,
+ StartedAt: time.Now(),
+ },
+ postTask.Name: {
+ State: structs.TaskStatePending,
+ Failed: false,
+ },
+ }
+ coord.TaskStateUpdated(states)
+ RequireTaskAllowed(t, coord, sideTask)
+ RequireTaskAllowed(t, coord, mainTask)
+ RequireTaskAllowed(t, coord, postTask)
+}
+
+func TestCoordinator_Restore(t *testing.T) {
+ ci.Parallel(t)
+
+ task := mock.Job().TaskGroups[0].Tasks[0]
+
+ preEphemeral := task.Copy()
+ preEphemeral.Name = "pre_ephemeral"
+ preEphemeral.Lifecycle = &structs.TaskLifecycleConfig{
+ Hook: structs.TaskLifecycleHookPrestart,
+ Sidecar: false,
+ }
+
+ preSide := task.Copy()
+ preSide.Name = "pre_side"
+ preSide.Lifecycle = &structs.TaskLifecycleConfig{
+ Hook: structs.TaskLifecycleHookPrestart,
+ Sidecar: true,
+ }
+
+ main := task.Copy()
+ main.Name = "main"
+ main.Lifecycle = nil
+
+ postEphemeral := task.Copy()
+ postEphemeral.Name = "post_ephemeral"
+ postEphemeral.Lifecycle = &structs.TaskLifecycleConfig{
+ Hook: structs.TaskLifecycleHookPoststart,
+ Sidecar: false,
+ }
+
+ postSide := task.Copy()
+ postSide.Name = "post_side"
+ postSide.Lifecycle = &structs.TaskLifecycleConfig{
+ Hook: structs.TaskLifecycleHookPoststart,
+ Sidecar: true,
+ }
+
+ poststop := task.Copy()
+ poststop.Name = "poststop"
+ poststop.Lifecycle = &structs.TaskLifecycleConfig{
+ Hook: structs.TaskLifecycleHookPoststop,
+ Sidecar: false,
+ }
+
+ testCases := []struct {
+ name string
+ tasks []*structs.Task
+ tasksState map[string]*structs.TaskState
+ testFn func(*testing.T, *Coordinator)
+ }{
+ {
+ name: "prestart ephemeral running",
+ tasks: []*structs.Task{preEphemeral, preSide, main},
+ tasksState: map[string]*structs.TaskState{
+ preEphemeral.Name: {State: structs.TaskStateRunning},
+ preSide.Name: {State: structs.TaskStateRunning},
+ main.Name: {State: structs.TaskStatePending},
+ },
+ testFn: func(t *testing.T, c *Coordinator) {
+ RequireTaskBlocked(t, c, main)
+
+ RequireTaskAllowed(t, c, preEphemeral)
+ RequireTaskAllowed(t, c, preSide)
+ },
+ },
+ {
+ name: "prestart ephemeral complete",
+ tasks: []*structs.Task{preEphemeral, preSide, main},
+ tasksState: map[string]*structs.TaskState{
+ preEphemeral.Name: {State: structs.TaskStateDead},
+ preSide.Name: {State: structs.TaskStateRunning},
+ main.Name: {State: structs.TaskStatePending},
+ },
+ testFn: func(t *testing.T, c *Coordinator) {
+ RequireTaskBlocked(t, c, preEphemeral)
+
+ RequireTaskAllowed(t, c, preSide)
+ RequireTaskAllowed(t, c, main)
+ },
+ },
+ {
+ name: "main running",
+ tasks: []*structs.Task{main},
+ tasksState: map[string]*structs.TaskState{
+ main.Name: {State: structs.TaskStateRunning},
+ },
+ testFn: func(t *testing.T, c *Coordinator) {
+ RequireTaskAllowed(t, c, main)
+ },
+ },
+ {
+ name: "poststart with sidecar",
+ tasks: []*structs.Task{main, postEphemeral, postSide},
+ tasksState: map[string]*structs.TaskState{
+ main.Name: {State: structs.TaskStateRunning},
+ postEphemeral.Name: {State: structs.TaskStateDead},
+ postSide.Name: {State: structs.TaskStateRunning},
+ },
+ testFn: func(t *testing.T, c *Coordinator) {
+ RequireTaskBlocked(t, c, postEphemeral)
+
+ RequireTaskAllowed(t, c, main)
+ RequireTaskAllowed(t, c, postSide)
+ },
+ },
+ {
+ name: "poststop running",
+ tasks: []*structs.Task{main, poststop},
+ tasksState: map[string]*structs.TaskState{
+ main.Name: {State: structs.TaskStateDead},
+ poststop.Name: {State: structs.TaskStateRunning},
+ },
+ testFn: func(t *testing.T, c *Coordinator) {
+ RequireTaskBlocked(t, c, main)
+
+ RequireTaskAllowed(t, c, poststop)
+ },
+ },
+ }
+
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ shutdownCh := make(chan struct{})
+ defer close(shutdownCh)
+
+ c := NewCoordinator(testlog.HCLogger(t), tc.tasks, shutdownCh)
+ c.Restore(tc.tasksState)
+ tc.testFn(t, c)
+ })
+ }
+}
diff --git a/client/allocrunner/tasklifecycle/doc.go b/client/allocrunner/tasklifecycle/doc.go
new file mode 100644
index 00000000000..95d806fe7ff
--- /dev/null
+++ b/client/allocrunner/tasklifecycle/doc.go
@@ -0,0 +1,92 @@
+/*
+Package tasklifecycle manages the execution order of tasks based on their
+lifecycle configuration. Its main structs are the Coordinator and the Gate.
+
+The Coordinator is used by an allocRunner to signal if a taskRunner is allowed
+to start or not. It does so using a set of Gates, each for a given task
+lifecycle configuration.
+
+The Gate provides a channel that can be used to block its listener on demand.
+This is done by calling the Open() and Close() methods in the Gate which will
+cause activate or deactivate a producer at the other end of the channel.
+
+The allocRunner feeds task state updates to the Coordinator that then uses this
+information to determine which Gates it should open or close. Each Gate is
+connected to a taskRunner with a matching lifecycle configuration.
+
+In the diagrams below, a solid line from a Gate indicates that it's open
+(active), while a dashed line indicates that it's closed (inactive). A
+taskRunner connected to an open Gate is allowed to run, while one that is
+connected to a closed Gate is blocked.
+
+The Open/Close control line represents the Coordinator calling the Open() and
+Close() methods of the Gates.
+
+In this state, the Coordinator is allowing prestart tasks to run, while
+blocking the main tasks.
+
+ ┌────────┐
+ │ ALLOC │
+ │ RUNNER │
+ └───┬────┘
+ │
+ Task state
+ │
+ ┌────────────▼────────────┐
+ │Current state: │
+ │Prestart │ ┌─────────────┐
+ │ │ │ TASK RUNNER │
+ │ ┌───────────────────┼─────────┤ (Prestart) │
+ │ │ │ └─────────────┘
+ │ │ │
+ │ │ │ ┌─────────────┐
+ │ │ COORDINATOR │ │ TASK RUNNER │
+ │ │ ┌─ ─ ─┼─ ─ ─ ─┬╶┤ (Main) │
+ │ │ ╷ │ ╷ └─────────────┘
+ │ │ ╷ │ ╷
+ │ │ ╷ │ ╷ ┌─────────────┐
+ │ Prestart Main │ ╷ │ TASK RUNNER │
+ └─────┬─┬───────────┬─┬───┘ └╶┤ (Main) │
+ │ │Open/ ╷ │Open/ └─────────────┘
+ │ │Close ╷ │Close
+ ┌──┴─▼─┐ ┌──┴─▼─┐
+ │ GATE │ │ GATE │
+ └──────┘ └──────┘
+
+When the prestart task completes, the allocRunner will send a new batch of task
+states to the Coordinator that will cause it to transition to a state where it
+will close the Gate for prestart tasks, blocking their execution, and will open
+the Gate for main tasks, allowing them to start.
+
+ ┌────────┐
+ │ ALLOC │
+ │ RUNNER │
+ └───┬────┘
+ │
+ Task state
+ │
+ ┌────────────▼────────────┐
+ │Current state: │
+ │Main │ ┌─────────────┐
+ │ │ │ TASK RUNNER │
+ │ ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┼─ ─ ─ ─ ─┤ (Prestart) │
+ │ ╷ │ └─────────────┘
+ │ ╷ │
+ │ ╷ │ ┌─────────────┐
+ │ ╷ COORDINATOR │ │ TASK RUNNER │
+ │ ╷ ┌─────┼───────┬─┤ (Main) │
+ │ ╷ │ │ │ └─────────────┘
+ │ ╷ │ │ │
+ │ ╷ │ │ │ ┌─────────────┐
+ │ Prestart Main │ │ │ TASK RUNNER │
+ └─────┼─┬───────────┬─┬───┘ └─┤ (Main) │
+ ╷ │Open/ │ │Open/ └─────────────┘
+ ╷ │Close │ │Close
+ ┌──┴─▼─┐ ┌──┴─▼─┐
+ │ GATE │ │ GATE │
+ └──────┘ └──────┘
+
+Diagram source:
+https://asciiflow.com/#/share/eJyrVspLzE1VssorzcnRUcpJrEwtUrJSqo5RqohRsjI0MDTViVGqBDKNLA2ArJLUihIgJ0ZJAQYeTdmDB8XE5CGrVHD08fF3BjPRZYJC%2Ffxcg7DIEGk6VDWyUEhicbZCcUliSSp2hfgNR6BpxCmDmelcWlSUmlcCsdkKm62%2BiZmo7kEOCOK8jtVmrGZiMVchxDHYGzXEYSpIspVUpKAREOQaHOIYFKKpgGkvjcIDp8kk2t7zaEoDcWgCmsnO%2Fv5BLp5%2BjiH%2BQVhNbkKLjyY8LtNFAyDdCgoavo6efppQ0%2FDorkETrQGypxDtrxmkmEyiK8iJ24CiVGAeKyqBGgPNVWjmYk%2FrVE7X8LhBiwtEcQRSBcT%2B%2Bs4KyK5D4pOewlFMRglfuDy6vmkoLoaL1yDLwXUquDuGuCogq4aLYDd9CnbT0V2uVKtUCwCqNQgp)
+*/
+package tasklifecycle
diff --git a/client/allocrunner/tasklifecycle/gate.go b/client/allocrunner/tasklifecycle/gate.go
new file mode 100644
index 00000000000..02d96b29763
--- /dev/null
+++ b/client/allocrunner/tasklifecycle/gate.go
@@ -0,0 +1,87 @@
+package tasklifecycle
+
+const (
+ gateClosed = false
+ gateOpened = true
+)
+
+// Gate is used by the Coordinator to block or allow tasks from running.
+//
+// It provides a channel that taskRunners listens on to determine when they are
+// allowed to run. The Gate has an infinite loop that is either feeding this
+// channel (therefore allowing listeners to proceed) or not doing anything
+// (causing listeners to block an wait).
+//
+// The Coordinator uses the Gate Open() and Close() methods to control this
+// producer loop.
+type Gate struct {
+ sendCh chan struct{}
+ updateCh chan bool
+ shutdownCh <-chan struct{}
+}
+
+// NewGate returns a new Gate that is initially closed. The Gate should not be
+// used after the shutdownCh is closed.
+func NewGate(shutdownCh <-chan struct{}) *Gate {
+ g := &Gate{
+ sendCh: make(chan struct{}),
+ updateCh: make(chan bool),
+ shutdownCh: shutdownCh,
+ }
+ go g.run(gateClosed)
+
+ return g
+}
+
+// WaitCh returns a channel that the listener must block on before starting its
+// task.
+//
+// Callers must also check the state of the shutdownCh used to create the Gate
+// to avoid blocking indefinitely.
+func (g *Gate) WaitCh() <-chan struct{} {
+ return g.sendCh
+}
+
+// Open is used to allow listeners to proceed.
+// If the gate shutdownCh channel is closed, this method is a no-op so callers
+// should check its state.
+func (g *Gate) Open() {
+ select {
+ case <-g.shutdownCh:
+ case g.updateCh <- gateOpened:
+ }
+}
+
+// Close is used to block listeners from proceeding.
+// if the gate shutdownch channel is closed, this method is a no-op so callers
+// should check its state.
+func (g *Gate) Close() {
+ select {
+ case <-g.shutdownCh:
+ case g.updateCh <- gateClosed:
+ }
+}
+
+// run starts the infinite loop that feeds the channel if the Gate is opened.
+func (g *Gate) run(initState bool) {
+ isOpen := initState
+ for {
+ if isOpen {
+ select {
+ // Feed channel if the gate is open.
+ case g.sendCh <- struct{}{}:
+ case <-g.shutdownCh:
+ return
+ case isOpen = <-g.updateCh:
+ continue
+ }
+ } else {
+ select {
+ case <-g.shutdownCh:
+ return
+ case isOpen = <-g.updateCh:
+ continue
+ }
+ }
+ }
+}
diff --git a/client/allocrunner/tasklifecycle/gate_test.go b/client/allocrunner/tasklifecycle/gate_test.go
new file mode 100644
index 00000000000..3b77fadca91
--- /dev/null
+++ b/client/allocrunner/tasklifecycle/gate_test.go
@@ -0,0 +1,135 @@
+package tasklifecycle
+
+import (
+ "testing"
+ "time"
+
+ "github.com/hashicorp/nomad/ci"
+ "github.com/hashicorp/nomad/helper"
+)
+
+func TestGate(t *testing.T) {
+ ci.Parallel(t)
+
+ testCases := []struct {
+ name string
+ test func(*testing.T, *Gate)
+ }{
+ {
+ name: "starts blocked",
+ test: func(t *testing.T, g *Gate) {
+ requireChannelBlocking(t, g.WaitCh(), "wait")
+ },
+ },
+ {
+ name: "block",
+ test: func(t *testing.T, g *Gate) {
+ g.Close()
+ requireChannelBlocking(t, g.WaitCh(), "wait")
+ },
+ },
+ {
+ name: "allow",
+ test: func(t *testing.T, g *Gate) {
+ g.Open()
+ requireChannelPassing(t, g.WaitCh(), "wait")
+ },
+ },
+ {
+ name: "block twice",
+ test: func(t *testing.T, g *Gate) {
+ g.Close()
+ g.Close()
+ requireChannelBlocking(t, g.WaitCh(), "wait")
+ },
+ },
+ {
+ name: "allow twice",
+ test: func(t *testing.T, g *Gate) {
+ g.Open()
+ g.Open()
+ requireChannelPassing(t, g.WaitCh(), "wait")
+ },
+ },
+ {
+ name: "allow block allow",
+ test: func(t *testing.T, g *Gate) {
+ g.Open()
+ requireChannelPassing(t, g.WaitCh(), "first allow")
+ g.Close()
+ requireChannelBlocking(t, g.WaitCh(), "block")
+ g.Open()
+ requireChannelPassing(t, g.WaitCh(), "second allow")
+ },
+ },
+ {
+ name: "concurrent access",
+ test: func(t *testing.T, g *Gate) {
+ x := 100
+ go func() {
+ for i := 0; i < x; i++ {
+ g.Open()
+ }
+ }()
+ go func() {
+ for i := 0; i < x/10; i++ {
+ g.Close()
+ }
+ }()
+ requireChannelPassing(t, g.WaitCh(), "gate should be open")
+ },
+ },
+ }
+
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ shutdownCh := make(chan struct{})
+ defer close(shutdownCh)
+
+ g := NewGate(shutdownCh)
+ tc.test(t, g)
+ })
+ }
+}
+
+// TestGate_shutdown tests a gate with a closed shutdown channel.
+func TestGate_shutdown(t *testing.T) {
+ ci.Parallel(t)
+
+ // Create a Gate with a closed shutdownCh.
+ shutdownCh := make(chan struct{})
+ close(shutdownCh)
+
+ g := NewGate(shutdownCh)
+
+ // Test that Open() and Close() doesn't block forever.
+ openCh := make(chan struct{})
+ closeCh := make(chan struct{})
+
+ go func() {
+ g.Open()
+ close(openCh)
+ }()
+ go func() {
+ g.Close()
+ close(closeCh)
+ }()
+
+ timer, stop := helper.NewSafeTimer(time.Second)
+ defer stop()
+
+ select {
+ case <-openCh:
+ case <-timer.C:
+ t.Fatalf("timeout waiting for gate operations")
+ }
+
+ select {
+ case <-closeCh:
+ case <-timer.C:
+ t.Fatalf("timeout waiting for gate operations")
+ }
+
+ // A Gate with a shutdownCh should be closed.
+ requireChannelBlocking(t, g.WaitCh(), "gate should be closed")
+}
diff --git a/client/allocrunner/tasklifecycle/testing.go b/client/allocrunner/tasklifecycle/testing.go
new file mode 100644
index 00000000000..7e7ee0eb18f
--- /dev/null
+++ b/client/allocrunner/tasklifecycle/testing.go
@@ -0,0 +1,56 @@
+package tasklifecycle
+
+import (
+ "time"
+
+ "github.com/hashicorp/nomad/nomad/structs"
+ "github.com/hashicorp/nomad/testutil"
+ testing "github.com/mitchellh/go-testing-interface"
+)
+
+func RequireTaskBlocked(t testing.T, c *Coordinator, task *structs.Task) {
+ ch := c.StartConditionForTask(task)
+ requireChannelBlocking(t, ch, task.Name)
+}
+
+func RequireTaskAllowed(t testing.T, c *Coordinator, task *structs.Task) {
+ ch := c.StartConditionForTask(task)
+ requireChannelPassing(t, ch, task.Name)
+}
+
+func WaitNotInitUntil(c *Coordinator, until time.Duration, errorFunc func()) {
+ testutil.WaitForResultUntil(until,
+ func() (bool, error) {
+ c.currentStateLock.RLock()
+ defer c.currentStateLock.RUnlock()
+ return c.currentState != coordinatorStateInit, nil
+ },
+ func(_ error) {
+ errorFunc()
+ })
+}
+
+func requireChannelPassing(t testing.T, ch <-chan struct{}, name string) {
+ testutil.WaitForResult(func() (bool, error) {
+ return !isChannelBlocking(ch), nil
+ }, func(_ error) {
+ t.Fatalf("%s channel was blocking, should be passing", name)
+ })
+}
+
+func requireChannelBlocking(t testing.T, ch <-chan struct{}, name string) {
+ testutil.WaitForResult(func() (bool, error) {
+ return isChannelBlocking(ch), nil
+ }, func(_ error) {
+ t.Fatalf("%s channel was passing, should be blocking", name)
+ })
+}
+
+func isChannelBlocking(ch <-chan struct{}) bool {
+ select {
+ case <-ch:
+ return false
+ default:
+ return true
+ }
+}
diff --git a/client/allocrunner/taskrunner/connect_native_hook_test.go b/client/allocrunner/taskrunner/connect_native_hook_test.go
index 0718db1c823..9f40bd442f8 100644
--- a/client/allocrunner/taskrunner/connect_native_hook_test.go
+++ b/client/allocrunner/taskrunner/connect_native_hook_test.go
@@ -14,7 +14,7 @@ import (
"github.com/hashicorp/nomad/client/taskenv"
"github.com/hashicorp/nomad/client/testutil"
agentconsul "github.com/hashicorp/nomad/command/agent/consul"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/testlog"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/mock"
@@ -478,8 +478,8 @@ func TestTaskRunner_ConnectNativeHook_shareTLS(t *testing.T) {
// TLS config consumed by native application
ShareSSL: shareSSL,
- EnableSSL: helper.BoolToPtr(true),
- VerifySSL: helper.BoolToPtr(true),
+ EnableSSL: pointer.Of(true),
+ VerifySSL: pointer.Of(true),
CAFile: fakeCert,
CertFile: fakeCert,
KeyFile: fakeCert,
@@ -528,7 +528,7 @@ func TestTaskRunner_ConnectNativeHook_shareTLS(t *testing.T) {
// so make sure an unset value turns the feature on.
t.Run("share_ssl is true", func(t *testing.T) {
- try(t, helper.BoolToPtr(true))
+ try(t, pointer.Of(true))
})
t.Run("share_ssl is nil", func(t *testing.T) {
@@ -596,9 +596,9 @@ func TestTaskRunner_ConnectNativeHook_shareTLS_override(t *testing.T) {
Addr: consulConfig.Address,
// TLS config consumed by native application
- ShareSSL: helper.BoolToPtr(true),
- EnableSSL: helper.BoolToPtr(true),
- VerifySSL: helper.BoolToPtr(true),
+ ShareSSL: pointer.Of(true),
+ EnableSSL: pointer.Of(true),
+ VerifySSL: pointer.Of(true),
CAFile: fakeCert,
CertFile: fakeCert,
KeyFile: fakeCert,
diff --git a/client/allocrunner/taskrunner/envoy_bootstrap_hook.go b/client/allocrunner/taskrunner/envoy_bootstrap_hook.go
index 144a4a1607e..3cc9e4fd4d1 100644
--- a/client/allocrunner/taskrunner/envoy_bootstrap_hook.go
+++ b/client/allocrunner/taskrunner/envoy_bootstrap_hook.go
@@ -152,8 +152,8 @@ func newEnvoyBootstrapHook(c *envoyBootstrapHookConfig) *envoyBootstrapHook {
}
// getConsulNamespace will resolve the Consul namespace, choosing between
-// - agent config (low precedence)
-// - task group config (high precedence)
+// - agent config (low precedence)
+// - task group config (high precedence)
func (h *envoyBootstrapHook) getConsulNamespace() string {
var namespace string
if h.consulConfig.Namespace != "" {
diff --git a/client/allocrunner/taskrunner/envoy_bootstrap_hook_test.go b/client/allocrunner/taskrunner/envoy_bootstrap_hook_test.go
index c729db41a96..70ebe47b59b 100644
--- a/client/allocrunner/taskrunner/envoy_bootstrap_hook_test.go
+++ b/client/allocrunner/taskrunner/envoy_bootstrap_hook_test.go
@@ -23,8 +23,8 @@ import (
"github.com/hashicorp/nomad/client/taskenv"
"github.com/hashicorp/nomad/client/testutil"
agentconsul "github.com/hashicorp/nomad/command/agent/consul"
- "github.com/hashicorp/nomad/helper"
"github.com/hashicorp/nomad/helper/args"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/testlog"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/mock"
@@ -95,8 +95,8 @@ func TestEnvoyBootstrapHook_decodeTriState(t *testing.T) {
ci.Parallel(t)
require.Equal(t, "", decodeTriState(nil))
- require.Equal(t, "true", decodeTriState(helper.BoolToPtr(true)))
- require.Equal(t, "false", decodeTriState(helper.BoolToPtr(false)))
+ require.Equal(t, "true", decodeTriState(pointer.Of(true)))
+ require.Equal(t, "false", decodeTriState(pointer.Of(false)))
}
var (
diff --git a/client/allocrunner/taskrunner/envoy_version_hook.go b/client/allocrunner/taskrunner/envoy_version_hook.go
index 3501e27252a..ef958736d96 100644
--- a/client/allocrunner/taskrunner/envoy_version_hook.go
+++ b/client/allocrunner/taskrunner/envoy_version_hook.go
@@ -181,9 +181,9 @@ func (h *envoyVersionHook) tweakImage(configured string, supported map[string][]
// semver sanitizes the envoy version string coming from Consul into the format
// used by the Envoy project when publishing images (i.e. proper semver). This
// resulting string value does NOT contain the 'v' prefix for 2 reasons:
-// 1) the version library does not include the 'v'
-// 2) its plausible unofficial images use the 3 numbers without the prefix for
-// tagging their own images
+// 1. the version library does not include the 'v'
+// 2. its plausible unofficial images use the 3 numbers without the prefix for
+// tagging their own images
func semver(chosen string) (string, error) {
v, err := version.NewVersion(chosen)
if err != nil {
diff --git a/client/allocrunner/taskrunner/lifecycle.go b/client/allocrunner/taskrunner/lifecycle.go
index b812156a846..90c3d37189a 100644
--- a/client/allocrunner/taskrunner/lifecycle.go
+++ b/client/allocrunner/taskrunner/lifecycle.go
@@ -6,28 +6,103 @@ import (
"github.com/hashicorp/nomad/nomad/structs"
)
-// Restart a task. Returns immediately if no task is running. Blocks until
-// existing task exits or passed-in context is canceled.
+// Restart restarts a task that is already running. Returns an error if the
+// task is not running. Blocks until existing task exits or passed-in context
+// is canceled.
func (tr *TaskRunner) Restart(ctx context.Context, event *structs.TaskEvent, failure bool) error {
- tr.logger.Trace("Restart requested", "failure", failure)
+ tr.logger.Trace("Restart requested", "failure", failure, "event", event.GoString())
- // Grab the handle
- handle := tr.getDriverHandle()
+ taskState := tr.TaskState()
+ if taskState == nil {
+ return ErrTaskNotRunning
+ }
- // Check it is running
- if handle == nil {
+ switch taskState.State {
+ case structs.TaskStatePending, structs.TaskStateDead:
+ return ErrTaskNotRunning
+ }
+
+ return tr.restartImpl(ctx, event, failure)
+}
+
+// ForceRestart restarts a task that is already running or reruns it if dead.
+// Returns an error if the task is not able to rerun. Blocks until existing
+// task exits or passed-in context is canceled.
+//
+// Callers must restart the AllocRuner taskCoordinator beforehand to make sure
+// the task will be able to run again.
+func (tr *TaskRunner) ForceRestart(ctx context.Context, event *structs.TaskEvent, failure bool) error {
+ tr.logger.Trace("Force restart requested", "failure", failure, "event", event.GoString())
+
+ taskState := tr.TaskState()
+ if taskState == nil {
+ return ErrTaskNotRunning
+ }
+
+ tr.stateLock.Lock()
+ localState := tr.localState.Copy()
+ tr.stateLock.Unlock()
+
+ if localState == nil {
+ return ErrTaskNotRunning
+ }
+
+ switch taskState.State {
+ case structs.TaskStatePending:
+ return ErrTaskNotRunning
+
+ case structs.TaskStateDead:
+ // Tasks that are in the "dead" state are only allowed to restart if
+ // their Run() method is still active.
+ if localState.RunComplete {
+ return ErrTaskNotRunning
+ }
+ }
+
+ return tr.restartImpl(ctx, event, failure)
+}
+
+// restartImpl implements to task restart process.
+//
+// It should never be called directly as it doesn't verify if the task state
+// allows for a restart.
+func (tr *TaskRunner) restartImpl(ctx context.Context, event *structs.TaskEvent, failure bool) error {
+
+ // Check if the task is able to restart based on its state and the type of
+ // restart event that was triggered.
+ taskState := tr.TaskState()
+ if taskState == nil {
return ErrTaskNotRunning
}
// Emit the event since it may take a long time to kill
tr.EmitEvent(event)
- // Run the pre-kill hooks prior to restarting the task
- tr.preKill()
-
// Tell the restart tracker that a restart triggered the exit
tr.restartTracker.SetRestartTriggered(failure)
+ // Signal a restart to unblock tasks that are in the "dead" state, but
+ // don't block since the channel is buffered. Only one signal is enough to
+ // notify the tr.Run() loop.
+ // The channel must be signaled after SetRestartTriggered is called so the
+ // tr.Run() loop runs again.
+ if taskState.State == structs.TaskStateDead {
+ select {
+ case tr.restartCh <- struct{}{}:
+ default:
+ }
+ }
+
+ // Grab the handle to see if the task is still running and needs to be
+ // killed.
+ handle := tr.getDriverHandle()
+ if handle == nil {
+ return nil
+ }
+
+ // Run the pre-kill hooks prior to restarting the task
+ tr.preKill()
+
// Grab a handle to the wait channel that will timeout with context cancelation
// _before_ killing the task.
waitCh, err := handle.WaitCh(ctx)
@@ -69,14 +144,17 @@ func (tr *TaskRunner) Signal(event *structs.TaskEvent, s string) error {
// Kill a task. Blocks until task exits or context is canceled. State is set to
// dead.
func (tr *TaskRunner) Kill(ctx context.Context, event *structs.TaskEvent) error {
- tr.logger.Trace("Kill requested", "event_type", event.Type, "event_reason", event.KillReason)
+ tr.logger.Trace("Kill requested")
// Cancel the task runner to break out of restart delay or the main run
// loop.
tr.killCtxCancel()
// Emit kill event
- tr.EmitEvent(event)
+ if event != nil {
+ tr.logger.Trace("Kill event", "event_type", event.Type, "event_reason", event.KillReason)
+ tr.EmitEvent(event)
+ }
select {
case <-tr.WaitCh():
diff --git a/client/allocrunner/taskrunner/plugin_supervisor_hook.go b/client/allocrunner/taskrunner/plugin_supervisor_hook.go
index 4696bc53f38..a21c632f8da 100644
--- a/client/allocrunner/taskrunner/plugin_supervisor_hook.go
+++ b/client/allocrunner/taskrunner/plugin_supervisor_hook.go
@@ -22,11 +22,11 @@ import (
// to their requisite plugin manager.
//
// It provides a few things to a plugin task running inside Nomad. These are:
-// * A mount to the `csi_plugin.mount_dir` where the plugin will create its csi.sock
-// * A mount to `local/csi` that node plugins will use to stage volume mounts.
-// * When the task has started, it starts a loop of attempting to connect to the
-// plugin, to perform initial fingerprinting of the plugins capabilities before
-// notifying the plugin manager of the plugin.
+// - A mount to the `csi_plugin.mount_dir` where the plugin will create its csi.sock
+// - A mount to `local/csi` that node plugins will use to stage volume mounts.
+// - When the task has started, it starts a loop of attempting to connect to the
+// plugin, to perform initial fingerprinting of the plugins capabilities before
+// notifying the plugin manager of the plugin.
type csiPluginSupervisorHook struct {
logger hclog.Logger
alloc *structs.Allocation
@@ -81,7 +81,7 @@ var _ interfaces.TaskStopHook = &csiPluginSupervisorHook{}
// Per-allocation directories of unix domain sockets used to communicate
// with the CSI plugin. Nomad creates the directory and the plugin creates
// the socket file. This directory is bind-mounted to the
-// csi_plugin.mount_config dir in the plugin task.
+// csi_plugin.mount_dir in the plugin task.
//
// {plugin-type}/{plugin-id}/
// staging/
@@ -103,6 +103,16 @@ func newCSIPluginSupervisorHook(config *csiPluginSupervisorHookConfig) *csiPlugi
socketMountPoint := filepath.Join(config.clientStateDirPath, "csi",
"plugins", config.runner.Alloc().ID)
+ // In v1.3.0, Nomad started instructing CSI plugins to stage and publish
+ // within /local/csi. Plugins deployed after the introduction of
+ // StagePublishBaseDir default to StagePublishBaseDir = /local/csi. However,
+ // plugins deployed between v1.3.0 and the introduction of
+ // StagePublishBaseDir have StagePublishBaseDir = "". Default to /local/csi here
+ // to avoid breaking plugins that aren't redeployed.
+ if task.CSIPluginConfig.StagePublishBaseDir == "" {
+ task.CSIPluginConfig.StagePublishBaseDir = filepath.Join("/local", "csi")
+ }
+
if task.CSIPluginConfig.HealthTimeout == 0 {
task.CSIPluginConfig.HealthTimeout = 30 * time.Second
}
@@ -157,8 +167,7 @@ func (h *csiPluginSupervisorHook) Prestart(ctx context.Context,
}
// where the staging and per-alloc directories will be mounted
volumeStagingMounts := &drivers.MountConfig{
- // TODO(tgross): add this TaskPath to the CSIPluginConfig as well
- TaskPath: "/local/csi",
+ TaskPath: h.task.CSIPluginConfig.StagePublishBaseDir,
HostPath: h.mountPoint,
Readonly: false,
PropagationMode: "bidirectional",
@@ -238,13 +247,13 @@ func (h *csiPluginSupervisorHook) Poststart(_ context.Context, _ *interfaces.Tas
// the passed in context is terminated.
//
// The supervisor works by:
-// - Initially waiting for the plugin to become available. This loop is expensive
-// and may do things like create new gRPC Clients on every iteration.
-// - After receiving an initial healthy status, it will inform the plugin catalog
-// of the plugin, registering it with the plugins fingerprinted capabilities.
-// - We then perform a more lightweight check, simply probing the plugin on a less
-// frequent interval to ensure it is still alive, emitting task events when this
-// status changes.
+// - Initially waiting for the plugin to become available. This loop is expensive
+// and may do things like create new gRPC Clients on every iteration.
+// - After receiving an initial healthy status, it will inform the plugin catalog
+// of the plugin, registering it with the plugins fingerprinted capabilities.
+// - We then perform a more lightweight check, simply probing the plugin on a less
+// frequent interval to ensure it is still alive, emitting task events when this
+// status changes.
//
// Deeper fingerprinting of the plugin is implemented by the csimanager.
func (h *csiPluginSupervisorHook) ensureSupervisorLoop(ctx context.Context) {
@@ -360,7 +369,7 @@ func (h *csiPluginSupervisorHook) registerPlugin(client csi.CSIPlugin, socketPat
Options: map[string]string{
"Provider": info.Name, // vendor name
"MountPoint": h.mountPoint,
- "ContainerMountPoint": "/local/csi",
+ "ContainerMountPoint": h.task.CSIPluginConfig.StagePublishBaseDir,
},
}
}
diff --git a/client/allocrunner/taskrunner/remotetask_hook.go b/client/allocrunner/taskrunner/remotetask_hook.go
index 5a8ac03d12a..4fd9a63769b 100644
--- a/client/allocrunner/taskrunner/remotetask_hook.go
+++ b/client/allocrunner/taskrunner/remotetask_hook.go
@@ -32,10 +32,10 @@ func (h *remoteTaskHook) Name() string {
}
// Prestart performs 2 remote task driver related tasks:
-// 1. If there is no local handle, see if there is a handle propagated from a
-// previous alloc to be restored.
-// 2. If the alloc is lost make sure the task signal is set to detach instead
-// of kill.
+// 1. If there is no local handle, see if there is a handle propagated from a
+// previous alloc to be restored.
+// 2. If the alloc is lost make sure the task signal is set to detach instead
+// of kill.
func (h *remoteTaskHook) Prestart(ctx context.Context, req *interfaces.TaskPrestartRequest, resp *interfaces.TaskPrestartResponse) error {
if h.tr.getDriverHandle() != nil {
// Driver handle already exists so don't try to load remote
diff --git a/client/allocrunner/taskrunner/restarts/restarts.go b/client/allocrunner/taskrunner/restarts/restarts.go
index a117e8d49d1..0e39e471524 100644
--- a/client/allocrunner/taskrunner/restarts/restarts.go
+++ b/client/allocrunner/taskrunner/restarts/restarts.go
@@ -139,11 +139,11 @@ func (r *RestartTracker) GetCount() int {
// GetState returns the tasks next state given the set exit code and start
// error. One of the following states are returned:
-// * TaskRestarting - Task should be restarted
-// * TaskNotRestarting - Task should not be restarted and has exceeded its
-// restart policy.
-// * TaskTerminated - Task has terminated successfully and does not need a
-// restart.
+// - TaskRestarting - Task should be restarted
+// - TaskNotRestarting - Task should not be restarted and has exceeded its
+// restart policy.
+// - TaskTerminated - Task has terminated successfully and does not need a
+// restart.
//
// If TaskRestarting is returned, the duration is how long to wait until
// starting the task again.
diff --git a/client/allocrunner/taskrunner/sids_hook_test.go b/client/allocrunner/taskrunner/sids_hook_test.go
index d5951ed017e..c8f7657417c 100644
--- a/client/allocrunner/taskrunner/sids_hook_test.go
+++ b/client/allocrunner/taskrunner/sids_hook_test.go
@@ -22,7 +22,6 @@ import (
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
- "github.com/hashicorp/nomad/testutil"
"github.com/stretchr/testify/require"
"golang.org/x/sys/unix"
)
@@ -297,11 +296,7 @@ func TestTaskRunner_DeriveSIToken_UnWritableTokenFile(t *testing.T) {
go tr.Run()
// wait for task runner to finish running
- select {
- case <-tr.WaitCh():
- case <-time.After(time.Duration(testutil.TestMultiplier()*15) * time.Second):
- r.Fail("timed out waiting for task runner")
- }
+ testWaitForTaskToDie(t, tr)
// assert task exited un-successfully
finalState := tr.TaskState()
diff --git a/client/allocrunner/taskrunner/state/state.go b/client/allocrunner/taskrunner/state/state.go
index 5f83c476c80..a4bc26b0f0c 100644
--- a/client/allocrunner/taskrunner/state/state.go
+++ b/client/allocrunner/taskrunner/state/state.go
@@ -16,6 +16,11 @@ type LocalState struct {
// TaskHandle is the handle used to reattach to the task during recovery
TaskHandle *drivers.TaskHandle
+
+ // RunComplete is set to true when the TaskRunner.Run() method finishes.
+ // It is used to distinguish between a dead task that could be restarted
+ // and one that will never run again.
+ RunComplete bool
}
func NewLocalState() *LocalState {
@@ -52,6 +57,7 @@ func (s *LocalState) Copy() *LocalState {
Hooks: make(map[string]*HookState, len(s.Hooks)),
DriverNetwork: s.DriverNetwork.Copy(),
TaskHandle: s.TaskHandle.Copy(),
+ RunComplete: s.RunComplete,
}
// Copy the hook state
diff --git a/client/allocrunner/taskrunner/task_runner.go b/client/allocrunner/taskrunner/task_runner.go
index 981998b4f32..445cf044038 100644
--- a/client/allocrunner/taskrunner/task_runner.go
+++ b/client/allocrunner/taskrunner/task_runner.go
@@ -62,6 +62,11 @@ const (
// updates have come in since the last one was handled, we only need to
// handle the last one.
triggerUpdateChCap = 1
+
+ // restartChCap is the capacity for the restartCh used for triggering task
+ // restarts. It should be exactly 1 as even if multiple restarts have come
+ // we only need to handle the last one.
+ restartChCap = 1
)
type TaskRunner struct {
@@ -95,6 +100,9 @@ type TaskRunner struct {
// stateDB is for persisting localState and taskState
stateDB cstate.StateDB
+ // restartCh is used to signal that the task should restart.
+ restartCh chan struct{}
+
// shutdownCtx is used to exit the TaskRunner *without* affecting task state.
shutdownCtx context.Context
@@ -233,8 +241,8 @@ type TaskRunner struct {
// GetClientAllocs has been called in case of a failed restore.
serversContactedCh <-chan struct{}
- // startConditionMetCtx is done when TR should start the task
- startConditionMetCtx <-chan struct{}
+ // startConditionMetCh signals the TaskRunner when it should start the task
+ startConditionMetCh <-chan struct{}
// waitOnServers defaults to false but will be set true if a restore
// fails and the Run method should wait until serversContactedCh is
@@ -304,8 +312,8 @@ type Config struct {
// servers succeeds and allocs are synced.
ServersContactedCh chan struct{}
- // startConditionMetCtx is done when TR should start the task
- StartConditionMetCtx <-chan struct{}
+ // StartConditionMetCh signals the TaskRunner when it should start the task
+ StartConditionMetCh <-chan struct{}
// ShutdownDelayCtx is a context from the alloc runner which will
// tell us to exit early from shutdown_delay
@@ -367,6 +375,7 @@ func NewTaskRunner(config *Config) (*TaskRunner, error) {
shutdownCtx: trCtx,
shutdownCtxCancel: trCancel,
triggerUpdateCh: make(chan struct{}, triggerUpdateChCap),
+ restartCh: make(chan struct{}, restartChCap),
waitCh: make(chan struct{}),
csiManager: config.CSIManager,
cpusetCgroupPathGetter: config.CpusetCgroupPathGetter,
@@ -374,7 +383,7 @@ func NewTaskRunner(config *Config) (*TaskRunner, error) {
driverManager: config.DriverManager,
maxEvents: defaultMaxEvents,
serversContactedCh: config.ServersContactedCh,
- startConditionMetCtx: config.StartConditionMetCtx,
+ startConditionMetCh: config.StartConditionMetCh,
shutdownDelayCtx: config.ShutdownDelayCtx,
shutdownDelayCancelFn: config.ShutdownDelayCancelFn,
serviceRegWrapper: config.ServiceRegWrapper,
@@ -506,20 +515,25 @@ func (tr *TaskRunner) Run() {
tr.stateLock.RLock()
dead := tr.state.State == structs.TaskStateDead
+ runComplete := tr.localState.RunComplete
tr.stateLock.RUnlock()
- // if restoring a dead task, ensure that task is cleared and all post hooks
- // are called without additional state updates
+ // If restoring a dead task, ensure the task is cleared and, if the local
+ // state indicates that the previous Run() call is complete, execute all
+ // post stop hooks and exit early, otherwise proceed until the
+ // ALLOC_RESTART loop skipping MAIN since the task is dead.
if dead {
// do cleanup functions without emitting any additional events/work
// to handle cases where we restored a dead task where client terminated
// after task finished before completing post-run actions.
tr.clearDriverHandle()
tr.stateUpdater.TaskStateUpdated()
- if err := tr.stop(); err != nil {
- tr.logger.Error("stop failed on terminal task", "error", err)
+ if runComplete {
+ if err := tr.stop(); err != nil {
+ tr.logger.Error("stop failed on terminal task", "error", err)
+ }
+ return
}
- return
}
// Updates are handled asynchronously with the other hooks but each
@@ -541,27 +555,27 @@ func (tr *TaskRunner) Run() {
}
}
- select {
- case <-tr.startConditionMetCtx:
- tr.logger.Debug("lifecycle start condition has been met, proceeding")
- // yay proceed
- case <-tr.killCtx.Done():
- case <-tr.shutdownCtx.Done():
- return
- }
+ // Set the initial task state.
+ tr.stateUpdater.TaskStateUpdated()
timer, stop := helper.NewSafeTimer(0) // timer duration calculated JIT
defer stop()
MAIN:
for !tr.shouldShutdown() {
+ if dead {
+ break
+ }
+
select {
case <-tr.killCtx.Done():
break MAIN
case <-tr.shutdownCtx.Done():
// TaskRunner was told to exit immediately
return
- default:
+ case <-tr.startConditionMetCh:
+ tr.logger.Debug("lifecycle start condition has been met, proceeding")
+ // yay proceed
}
// Run the prestart hooks
@@ -671,6 +685,38 @@ MAIN:
// Mark the task as dead
tr.UpdateState(structs.TaskStateDead, nil)
+ // Wait here in case the allocation is restarted. Poststop tasks will never
+ // run again so skip them to avoid blocking forever.
+ if !tr.Task().IsPoststop() {
+ ALLOC_RESTART:
+ // Run in a loop to handle cases where restartCh is triggered but the
+ // task runner doesn't need to restart.
+ for {
+ select {
+ case <-tr.killCtx.Done():
+ break ALLOC_RESTART
+ case <-tr.shutdownCtx.Done():
+ return
+ case <-tr.restartCh:
+ // Restart without delay since the task is not running anymore.
+ restart, _ := tr.shouldRestart()
+ if restart {
+ // Set runner as not dead to allow the MAIN loop to run.
+ dead = false
+ goto MAIN
+ }
+ }
+ }
+ }
+
+ tr.stateLock.Lock()
+ tr.localState.RunComplete = true
+ err := tr.stateDB.PutTaskRunnerLocalState(tr.allocID, tr.taskName, tr.localState)
+ if err != nil {
+ tr.logger.Warn("error persisting task state on run loop exit", "error", err)
+ }
+ tr.stateLock.Unlock()
+
// Run the stop hooks
if err := tr.stop(); err != nil {
tr.logger.Error("stop failed", "error", err)
@@ -1197,8 +1243,10 @@ func (tr *TaskRunner) UpdateState(state string, event *structs.TaskEvent) {
tr.stateLock.Lock()
defer tr.stateLock.Unlock()
+ tr.logger.Trace("setting task state", "state", state)
+
if event != nil {
- tr.logger.Trace("setting task state", "state", state, "event", event.Type)
+ tr.logger.Trace("appending task event", "state", state, "event", event.Type)
// Append the event
tr.appendEvent(event)
@@ -1413,7 +1461,7 @@ func (tr *TaskRunner) UpdateStats(ru *cstructs.TaskResourceUsage) {
}
}
-//TODO Remove Backwardscompat or use tr.Alloc()?
+// TODO Remove Backwardscompat or use tr.Alloc()?
func (tr *TaskRunner) setGaugeForMemory(ru *cstructs.TaskResourceUsage) {
alloc := tr.Alloc()
var allocatedMem float32
@@ -1445,7 +1493,7 @@ func (tr *TaskRunner) setGaugeForMemory(ru *cstructs.TaskResourceUsage) {
}
}
-//TODO Remove Backwardscompat or use tr.Alloc()?
+// TODO Remove Backwardscompat or use tr.Alloc()?
func (tr *TaskRunner) setGaugeForCPU(ru *cstructs.TaskResourceUsage) {
alloc := tr.Alloc()
var allocatedCPU float32
diff --git a/client/allocrunner/taskrunner/task_runner_test.go b/client/allocrunner/taskrunner/task_runner_test.go
index 845ae4e1ce1..6c9eda48f70 100644
--- a/client/allocrunner/taskrunner/task_runner_test.go
+++ b/client/allocrunner/taskrunner/task_runner_test.go
@@ -31,7 +31,7 @@ import (
agentconsul "github.com/hashicorp/nomad/command/agent/consul"
mockdriver "github.com/hashicorp/nomad/drivers/mock"
"github.com/hashicorp/nomad/drivers/rawexec"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/testlog"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/mock"
@@ -118,7 +118,7 @@ func testTaskRunnerConfig(t *testing.T, alloc *structs.Allocation, taskName stri
shutdownDelayCtx, shutdownDelayCancelFn := context.WithCancel(context.Background())
- // Create a closed channel to mock TaskHookCoordinator.startConditionForTask.
+ // Create a closed channel to mock TaskCoordinator.startConditionForTask.
// Closed channel indicates this task is not blocked on prestart hooks.
closedCh := make(chan struct{})
close(closedCh)
@@ -142,7 +142,7 @@ func testTaskRunnerConfig(t *testing.T, alloc *structs.Allocation, taskName stri
DeviceManager: devicemanager.NoopMockManager(),
DriverManager: drivermanager.TestDriverManager(t),
ServersContactedCh: make(chan struct{}),
- StartConditionMetCtx: closedCh,
+ StartConditionMetCh: closedCh,
ShutdownDelayCtx: shutdownDelayCtx,
ShutdownDelayCancelFn: shutdownDelayCancelFn,
ServiceRegWrapper: wrapperMock,
@@ -335,7 +335,7 @@ func TestTaskRunner_Restore_Running(t *testing.T) {
defer newTR.Kill(context.Background(), structs.NewTaskEvent("cleanup"))
// Wait for new task runner to exit when the process does
- <-newTR.WaitCh()
+ testWaitForTaskToDie(t, newTR)
// Assert that the process was only started once
started := 0
@@ -349,6 +349,87 @@ func TestTaskRunner_Restore_Running(t *testing.T) {
assert.Equal(t, 1, started)
}
+// TestTaskRunner_Restore_Dead asserts that restoring a dead task will place it
+// back in the correct state. If the task was waiting for an alloc restart it
+// must be able to be restarted after restore, otherwise a restart must fail.
+func TestTaskRunner_Restore_Dead(t *testing.T) {
+ ci.Parallel(t)
+
+ alloc := mock.BatchAlloc()
+ alloc.Job.TaskGroups[0].Count = 1
+ task := alloc.Job.TaskGroups[0].Tasks[0]
+ task.Driver = "mock_driver"
+ task.Config = map[string]interface{}{
+ "run_for": "2s",
+ }
+ conf, cleanup := testTaskRunnerConfig(t, alloc, task.Name)
+ conf.StateDB = cstate.NewMemDB(conf.Logger) // "persist" state between task runners
+ defer cleanup()
+
+ // Run the first TaskRunner
+ origTR, err := NewTaskRunner(conf)
+ require.NoError(t, err)
+ go origTR.Run()
+ defer origTR.Kill(context.Background(), structs.NewTaskEvent("cleanup"))
+
+ // Wait for it to be dead
+ testWaitForTaskToDie(t, origTR)
+
+ // Cause TR to exit without shutting down task
+ origTR.Shutdown()
+
+ // Start a new TaskRunner and do the Restore
+ newTR, err := NewTaskRunner(conf)
+ require.NoError(t, err)
+ require.NoError(t, newTR.Restore())
+
+ go newTR.Run()
+ defer newTR.Kill(context.Background(), structs.NewTaskEvent("cleanup"))
+
+ // Verify that the TaskRunner is still active since it was recovered after
+ // a forced shutdown.
+ select {
+ case <-newTR.WaitCh():
+ require.Fail(t, "WaitCh is not blocking")
+ default:
+ }
+
+ // Verify that we can restart task.
+ // Retry a few times as the newTR.Run() may not have started yet.
+ testutil.WaitForResult(func() (bool, error) {
+ ev := &structs.TaskEvent{Type: structs.TaskRestartSignal}
+ err = newTR.ForceRestart(context.Background(), ev, false)
+ return err == nil, err
+ }, func(err error) {
+ require.NoError(t, err)
+ })
+ testWaitForTaskToStart(t, newTR)
+
+ // Kill task to verify that it's restored as dead and not able to restart.
+ newTR.Kill(context.Background(), nil)
+ testutil.WaitForResult(func() (bool, error) {
+ select {
+ case <-newTR.WaitCh():
+ return true, nil
+ default:
+ return false, fmt.Errorf("task still running")
+ }
+ }, func(err error) {
+ require.NoError(t, err)
+ })
+
+ newTR2, err := NewTaskRunner(conf)
+ require.NoError(t, err)
+ require.NoError(t, newTR2.Restore())
+
+ go newTR2.Run()
+ defer newTR2.Kill(context.Background(), structs.NewTaskEvent("cleanup"))
+
+ ev := &structs.TaskEvent{Type: structs.TaskRestartSignal}
+ err = newTR2.ForceRestart(context.Background(), ev, false)
+ require.Equal(t, err, ErrTaskNotRunning)
+}
+
// setupRestoreFailureTest starts a service, shuts down the task runner, and
// kills the task before restarting a new TaskRunner. The new TaskRunner is
// returned once it is running and waiting in pending along with a cleanup
@@ -603,11 +684,7 @@ func TestTaskRunner_TaskEnv_Interpolated(t *testing.T) {
defer cleanup()
// Wait for task to complete
- select {
- case <-tr.WaitCh():
- case <-time.After(3 * time.Second):
- require.Fail("timeout waiting for task to exit")
- }
+ testWaitForTaskToDie(t, tr)
// Get the mock driver plugin
driverPlugin, err := conf.DriverManager.Dispense(mockdriver.PluginID.Name)
@@ -654,7 +731,9 @@ func TestTaskRunner_TaskEnv_Chroot(t *testing.T) {
go tr.Run()
defer tr.Kill(context.Background(), structs.NewTaskEvent("cleanup"))
- // Wait for task to exit
+ // Wait for task to exit and kill the task runner to run the stop hooks.
+ testWaitForTaskToDie(t, tr)
+ tr.Kill(context.Background(), structs.NewTaskEvent("kill"))
timeout := 15 * time.Second
if testutil.IsCI() {
timeout = 120 * time.Second
@@ -703,7 +782,9 @@ func TestTaskRunner_TaskEnv_Image(t *testing.T) {
tr, conf, cleanup := runTestTaskRunner(t, alloc, task.Name)
defer cleanup()
- // Wait for task to exit
+ // Wait for task to exit and kill task runner to run the stop hooks.
+ testWaitForTaskToDie(t, tr)
+ tr.Kill(context.Background(), structs.NewTaskEvent("kill"))
select {
case <-tr.WaitCh():
case <-time.After(15 * time.Second):
@@ -750,7 +831,9 @@ func TestTaskRunner_TaskEnv_None(t *testing.T) {
%s
`, root, taskDir, taskDir, os.Getenv("PATH"))
- // Wait for task to exit
+ // Wait for task to exit and kill the task runner to run the stop hooks.
+ testWaitForTaskToDie(t, tr)
+ tr.Kill(context.Background(), structs.NewTaskEvent("kill"))
select {
case <-tr.WaitCh():
case <-time.After(15 * time.Second):
@@ -818,10 +901,7 @@ func TestTaskRunner_DevicePropogation(t *testing.T) {
defer tr.Kill(context.Background(), structs.NewTaskEvent("cleanup"))
// Wait for task to complete
- select {
- case <-tr.WaitCh():
- case <-time.After(3 * time.Second):
- }
+ testWaitForTaskToDie(t, tr)
// Get the mock driver plugin
driverPlugin, err := conf.DriverManager.Dispense(mockdriver.PluginID.Name)
@@ -1065,7 +1145,7 @@ func TestTaskRunner_NoShutdownDelay(t *testing.T) {
maxTimeToFailDuration := time.Duration(testutil.TestMultiplier()) * time.Second
alloc := mock.Alloc()
- alloc.DesiredTransition = structs.DesiredTransition{NoShutdownDelay: helper.BoolToPtr(true)}
+ alloc.DesiredTransition = structs.DesiredTransition{NoShutdownDelay: pointer.Of(true)}
task := alloc.Job.TaskGroups[0].Tasks[0]
task.Services[0].Tags = []string{"tag1"}
task.Services = task.Services[:1] // only need 1 for this test
@@ -1328,11 +1408,7 @@ func TestTaskRunner_CheckWatcher_Restart(t *testing.T) {
// Wait until the task exits. Don't simply wait for it to run as it may
// get restarted and terminated before the test is able to observe it
// running.
- select {
- case <-tr.WaitCh():
- case <-time.After(time.Duration(testutil.TestMultiplier()*15) * time.Second):
- require.Fail(t, "timeout")
- }
+ testWaitForTaskToDie(t, tr)
state := tr.TaskState()
actualEvents := make([]string, len(state.Events))
@@ -1421,11 +1497,7 @@ func TestTaskRunner_BlockForSIDSToken(t *testing.T) {
// task runner should exit now that it has been unblocked and it is a batch
// job with a zero sleep time
- select {
- case <-tr.WaitCh():
- case <-time.After(15 * time.Second * time.Duration(testutil.TestMultiplier())):
- r.Fail("timed out waiting for batch task to exist")
- }
+ testWaitForTaskToDie(t, tr)
// assert task exited successfully
finalState := tr.TaskState()
@@ -1478,11 +1550,7 @@ func TestTaskRunner_DeriveSIToken_Retry(t *testing.T) {
go tr.Run()
// assert task runner blocks on SI token
- select {
- case <-tr.WaitCh():
- case <-time.After(time.Duration(testutil.TestMultiplier()*15) * time.Second):
- r.Fail("timed out waiting for task runner")
- }
+ testWaitForTaskToDie(t, tr)
// assert task exited successfully
finalState := tr.TaskState()
@@ -1598,11 +1666,7 @@ func TestTaskRunner_BlockForVaultToken(t *testing.T) {
// TR should exit now that it's unblocked by vault as its a batch job
// with 0 sleeping.
- select {
- case <-tr.WaitCh():
- case <-time.After(15 * time.Second * time.Duration(testutil.TestMultiplier())):
- require.Fail(t, "timed out waiting for batch task to exit")
- }
+ testWaitForTaskToDie(t, tr)
// Assert task exited successfully
finalState := tr.TaskState()
@@ -1615,6 +1679,14 @@ func TestTaskRunner_BlockForVaultToken(t *testing.T) {
require.NoError(t, err)
require.Equal(t, token, string(data))
+ // Kill task runner to trigger stop hooks
+ tr.Kill(context.Background(), structs.NewTaskEvent("kill"))
+ select {
+ case <-tr.WaitCh():
+ case <-time.After(time.Duration(testutil.TestMultiplier()*15) * time.Second):
+ require.Fail(t, "timed out waiting for task runner to exit")
+ }
+
// Check the token was revoked
testutil.WaitForResult(func() (bool, error) {
if len(vaultClient.StoppedTokens()) != 1 {
@@ -1661,17 +1733,21 @@ func TestTaskRunner_DeriveToken_Retry(t *testing.T) {
defer tr.Kill(context.Background(), structs.NewTaskEvent("cleanup"))
go tr.Run()
- // Wait for TR to exit and check its state
+ // Wait for TR to die and check its state
+ testWaitForTaskToDie(t, tr)
+
+ state := tr.TaskState()
+ require.Equal(t, structs.TaskStateDead, state.State)
+ require.False(t, state.Failed)
+
+ // Kill task runner to trigger stop hooks
+ tr.Kill(context.Background(), structs.NewTaskEvent("kill"))
select {
case <-tr.WaitCh():
case <-time.After(time.Duration(testutil.TestMultiplier()*15) * time.Second):
require.Fail(t, "timed out waiting for task runner to exit")
}
- state := tr.TaskState()
- require.Equal(t, structs.TaskStateDead, state.State)
- require.False(t, state.Failed)
-
require.Equal(t, 1, count)
// Check that the token is on disk
@@ -1771,11 +1847,7 @@ func TestTaskRunner_Download_ChrootExec(t *testing.T) {
defer cleanup()
// Wait for task to run and exit
- select {
- case <-tr.WaitCh():
- case <-time.After(time.Duration(testutil.TestMultiplier()*15) * time.Second):
- require.Fail(t, "timed out waiting for task runner to exit")
- }
+ testWaitForTaskToDie(t, tr)
state := tr.TaskState()
require.Equal(t, structs.TaskStateDead, state.State)
@@ -1816,11 +1888,7 @@ func TestTaskRunner_Download_RawExec(t *testing.T) {
defer cleanup()
// Wait for task to run and exit
- select {
- case <-tr.WaitCh():
- case <-time.After(time.Duration(testutil.TestMultiplier()*15) * time.Second):
- require.Fail(t, "timed out waiting for task runner to exit")
- }
+ testWaitForTaskToDie(t, tr)
state := tr.TaskState()
require.Equal(t, structs.TaskStateDead, state.State)
@@ -1851,11 +1919,7 @@ func TestTaskRunner_Download_List(t *testing.T) {
defer cleanup()
// Wait for task to run and exit
- select {
- case <-tr.WaitCh():
- case <-time.After(time.Duration(testutil.TestMultiplier()*15) * time.Second):
- require.Fail(t, "timed out waiting for task runner to exit")
- }
+ testWaitForTaskToDie(t, tr)
state := tr.TaskState()
require.Equal(t, structs.TaskStateDead, state.State)
@@ -1902,11 +1966,7 @@ func TestTaskRunner_Download_Retries(t *testing.T) {
tr, _, cleanup := runTestTaskRunner(t, alloc, task.Name)
defer cleanup()
- select {
- case <-tr.WaitCh():
- case <-time.After(time.Duration(testutil.TestMultiplier()*15) * time.Second):
- require.Fail(t, "timed out waiting for task to exit")
- }
+ testWaitForTaskToDie(t, tr)
state := tr.TaskState()
require.Equal(t, structs.TaskStateDead, state.State)
@@ -2100,6 +2160,8 @@ func TestTaskRunner_RestartSignalTask_NotRunning(t *testing.T) {
case <-time.After(1 * time.Second):
}
+ require.Equal(t, structs.TaskStatePending, tr.TaskState().State)
+
// Send a signal and restart
err = tr.Signal(structs.NewTaskEvent("don't panic"), "QUIT")
require.EqualError(t, err, ErrTaskNotRunning.Error())
@@ -2110,12 +2172,7 @@ func TestTaskRunner_RestartSignalTask_NotRunning(t *testing.T) {
// Unblock and let it finish
waitCh <- struct{}{}
-
- select {
- case <-tr.WaitCh():
- case <-time.After(10 * time.Second):
- require.Fail(t, "timed out waiting for task to complete")
- }
+ testWaitForTaskToDie(t, tr)
// Assert the task ran and never restarted
state := tr.TaskState()
@@ -2153,11 +2210,7 @@ func TestTaskRunner_Run_RecoverableStartError(t *testing.T) {
tr, _, cleanup := runTestTaskRunner(t, alloc, task.Name)
defer cleanup()
- select {
- case <-tr.WaitCh():
- case <-time.After(time.Duration(testutil.TestMultiplier()*15) * time.Second):
- require.Fail(t, "timed out waiting for task to exit")
- }
+ testWaitForTaskToDie(t, tr)
state := tr.TaskState()
require.Equal(t, structs.TaskStateDead, state.State)
@@ -2202,11 +2255,7 @@ func TestTaskRunner_Template_Artifact(t *testing.T) {
go tr.Run()
// Wait for task to run and exit
- select {
- case <-tr.WaitCh():
- case <-time.After(15 * time.Second * time.Duration(testutil.TestMultiplier())):
- require.Fail(t, "timed out waiting for task runner to exit")
- }
+ testWaitForTaskToDie(t, tr)
state := tr.TaskState()
require.Equal(t, structs.TaskStateDead, state.State)
@@ -2536,7 +2585,9 @@ func TestTaskRunner_UnregisterConsul_Retries(t *testing.T) {
tr, err := NewTaskRunner(conf)
require.NoError(t, err)
defer tr.Kill(context.Background(), structs.NewTaskEvent("cleanup"))
- tr.Run()
+ go tr.Run()
+
+ testWaitForTaskToDie(t, tr)
state := tr.TaskState()
require.Equal(t, structs.TaskStateDead, state.State)
@@ -2562,7 +2613,17 @@ func TestTaskRunner_UnregisterConsul_Retries(t *testing.T) {
func testWaitForTaskToStart(t *testing.T, tr *TaskRunner) {
testutil.WaitForResult(func() (bool, error) {
ts := tr.TaskState()
- return ts.State == structs.TaskStateRunning, fmt.Errorf("%v", ts.State)
+ return ts.State == structs.TaskStateRunning, fmt.Errorf("expected task to be running, got %v", ts.State)
+ }, func(err error) {
+ require.NoError(t, err)
+ })
+}
+
+// testWaitForTaskToDie waits for the task to die or fails the test
+func testWaitForTaskToDie(t *testing.T, tr *TaskRunner) {
+ testutil.WaitForResult(func() (bool, error) {
+ ts := tr.TaskState()
+ return ts.State == structs.TaskStateDead, fmt.Errorf("expected task to be dead, got %v", ts.State)
}, func(err error) {
require.NoError(t, err)
})
diff --git a/client/allocrunner/taskrunner/template/template.go b/client/allocrunner/taskrunner/template/template.go
index 37c3f1da6eb..10d45ccb73e 100644
--- a/client/allocrunner/taskrunner/template/template.go
+++ b/client/allocrunner/taskrunner/template/template.go
@@ -20,7 +20,7 @@ import (
"github.com/hashicorp/nomad/client/allocrunner/taskrunner/interfaces"
"github.com/hashicorp/nomad/client/config"
"github.com/hashicorp/nomad/client/taskenv"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/nomad/structs"
)
@@ -54,6 +54,10 @@ type TaskTemplateManager struct {
// runner is the consul-template runner
runner *manager.Runner
+ // handle is used to execute scripts
+ handle interfaces.ScriptExecutor
+ handleLock sync.Mutex
+
// signals is a lookup map from the string representation of a signal to its
// actual signal
signals map[string]os.Signal
@@ -192,6 +196,14 @@ func (tm *TaskTemplateManager) Stop() {
}
}
+// SetDriverHandle sets the executor
+func (tm *TaskTemplateManager) SetDriverHandle(executor interfaces.ScriptExecutor) {
+ tm.handleLock.Lock()
+ defer tm.handleLock.Unlock()
+ tm.handle = executor
+
+}
+
// run is the long lived loop that handles errors and templates being rendered
func (tm *TaskTemplateManager) run() {
// Runner is nil if there are no templates
@@ -392,6 +404,7 @@ func (tm *TaskTemplateManager) onTemplateRendered(handledRenders map[string]time
var handling []string
signals := make(map[string]struct{})
+ scripts := []*structs.ChangeScript{}
restart := false
var splay time.Duration
@@ -436,6 +449,8 @@ func (tm *TaskTemplateManager) onTemplateRendered(handledRenders map[string]time
signals[tmpl.ChangeSignal] = struct{}{}
case structs.TemplateChangeModeRestart:
restart = true
+ case structs.TemplateChangeModeScript:
+ scripts = append(scripts, tmpl.ChangeScript)
case structs.TemplateChangeModeNoop:
continue
}
@@ -494,6 +509,72 @@ func (tm *TaskTemplateManager) onTemplateRendered(handledRenders map[string]time
}
}
+ // process script execution concurrently
+ var wg sync.WaitGroup
+ for _, script := range scripts {
+ wg.Add(1)
+ go tm.processScript(script, &wg)
+ }
+ wg.Wait()
+}
+
+// handleScriptError is a helper function that produces a TaskKilling event and
+// emits a message
+func (tm *TaskTemplateManager) handleScriptError(script *structs.ChangeScript, msg string) {
+ ev := structs.NewTaskEvent(structs.TaskHookFailed).SetDisplayMessage(msg)
+ tm.config.Events.EmitEvent(ev)
+
+ if script.FailOnError {
+ tm.config.Lifecycle.Kill(context.Background(),
+ structs.NewTaskEvent(structs.TaskKilling).
+ SetFailsTask().
+ SetDisplayMessage("Template script failed, task is being killed"))
+ }
+}
+
+// processScript is used for executing change_mode script and handling errors
+func (tm *TaskTemplateManager) processScript(script *structs.ChangeScript, wg *sync.WaitGroup) {
+ defer wg.Done()
+
+ if tm.handle == nil {
+ failureMsg := fmt.Sprintf(
+ "Template failed to run script %v with arguments %v because task driver doesn't support the exec operation",
+ script.Command,
+ script.Args,
+ )
+ tm.handleScriptError(script, failureMsg)
+ return
+ }
+ _, exitCode, err := tm.handle.Exec(script.Timeout, script.Command, script.Args)
+ if err != nil {
+ failureMsg := fmt.Sprintf(
+ "Template failed to run script %v with arguments %v on change: %v Exit code: %v",
+ script.Command,
+ script.Args,
+ err,
+ exitCode,
+ )
+ tm.handleScriptError(script, failureMsg)
+ return
+ }
+ if exitCode != 0 {
+ failureMsg := fmt.Sprintf(
+ "Template ran script %v with arguments %v on change but it exited with code code: %v",
+ script.Command,
+ script.Args,
+ exitCode,
+ )
+ tm.handleScriptError(script, failureMsg)
+ return
+ }
+ tm.config.Events.EmitEvent(structs.NewTaskEvent(structs.TaskHookMessage).
+ SetDisplayMessage(
+ fmt.Sprintf(
+ "Template successfully ran script %v with arguments: %v. Exit code: %v",
+ script.Command,
+ script.Args,
+ exitCode,
+ )))
}
// allTemplatesNoop returns whether all the managed templates have change mode noop.
@@ -611,7 +692,7 @@ func parseTemplateConfigs(config *TaskTemplateManagerConfig) (map[*ctconf.Templa
}
ct.Wait = &ctconf.WaitConfig{
- Enabled: helper.BoolToPtr(true),
+ Enabled: pointer.Of(true),
Min: tmpl.Wait.Min,
Max: tmpl.Wait.Max,
}
@@ -626,6 +707,14 @@ func parseTemplateConfigs(config *TaskTemplateManagerConfig) (map[*ctconf.Templa
m := os.FileMode(v)
ct.Perms = &m
}
+ // Set ownership
+ if tmpl.Uid != nil && *tmpl.Uid >= 0 {
+ ct.Uid = tmpl.Uid
+ }
+ if tmpl.Gid != nil && *tmpl.Gid >= 0 {
+ ct.Gid = tmpl.Gid
+ }
+
ct.Finalize()
ctmpls[ct] = tmpl
@@ -717,7 +806,7 @@ func newRunnerConfig(config *TaskTemplateManagerConfig,
if cc.ConsulConfig.EnableSSL != nil && *cc.ConsulConfig.EnableSSL {
verify := cc.ConsulConfig.VerifySSL != nil && *cc.ConsulConfig.VerifySSL
conf.Consul.SSL = &ctconf.SSLConfig{
- Enabled: helper.BoolToPtr(true),
+ Enabled: pointer.Of(true),
Verify: &verify,
Cert: &cc.ConsulConfig.CertFile,
Key: &cc.ConsulConfig.KeyFile,
@@ -732,7 +821,7 @@ func newRunnerConfig(config *TaskTemplateManagerConfig,
}
conf.Consul.Auth = &ctconf.AuthConfig{
- Enabled: helper.BoolToPtr(true),
+ Enabled: pointer.Of(true),
Username: &parts[0],
Password: &parts[1],
}
@@ -761,7 +850,7 @@ func newRunnerConfig(config *TaskTemplateManagerConfig,
// Set up the Vault config
// Always set these to ensure nothing is picked up from the environment
emptyStr := ""
- conf.Vault.RenewToken = helper.BoolToPtr(false)
+ conf.Vault.RenewToken = pointer.Of(false)
conf.Vault.Token = &emptyStr
if cc.VaultConfig != nil && cc.VaultConfig.IsEnabled() {
conf.Vault.Address = &cc.VaultConfig.Addr
@@ -780,7 +869,7 @@ func newRunnerConfig(config *TaskTemplateManagerConfig,
skipVerify := cc.VaultConfig.TLSSkipVerify != nil && *cc.VaultConfig.TLSSkipVerify
verify := !skipVerify
conf.Vault.SSL = &ctconf.SSLConfig{
- Enabled: helper.BoolToPtr(true),
+ Enabled: pointer.Of(true),
Verify: &verify,
Cert: &cc.VaultConfig.TLSCertFile,
Key: &cc.VaultConfig.TLSKeyFile,
@@ -790,8 +879,8 @@ func newRunnerConfig(config *TaskTemplateManagerConfig,
}
} else {
conf.Vault.SSL = &ctconf.SSLConfig{
- Enabled: helper.BoolToPtr(false),
- Verify: helper.BoolToPtr(false),
+ Enabled: pointer.Of(false),
+ Verify: pointer.Of(false),
Cert: &emptyStr,
Key: &emptyStr,
CaCert: &emptyStr,
@@ -817,6 +906,17 @@ func newRunnerConfig(config *TaskTemplateManagerConfig,
conf.Nomad.Namespace = &config.NomadNamespace
conf.Nomad.Transport.CustomDialer = cc.TemplateDialer
conf.Nomad.Token = &config.NomadToken
+ if cc.TemplateConfig != nil && cc.TemplateConfig.NomadRetry != nil {
+ // Set the user-specified Nomad RetryConfig
+ var err error
+ if err = cc.TemplateConfig.NomadRetry.Validate(); err != nil {
+ return nil, err
+ }
+ conf.Nomad.Retry, err = cc.TemplateConfig.NomadRetry.ToConsulTemplate()
+ if err != nil {
+ return nil, err
+ }
+ }
conf.Finalize()
return conf, nil
diff --git a/client/allocrunner/taskrunner/template/template_test.go b/client/allocrunner/taskrunner/template/template_test.go
index 0221cfe1ca5..e4d7ca69ebd 100644
--- a/client/allocrunner/taskrunner/template/template_test.go
+++ b/client/allocrunner/taskrunner/template/template_test.go
@@ -5,7 +5,6 @@ import (
"context"
"fmt"
"io"
- "io/ioutil"
"os"
"os/user"
"path/filepath"
@@ -16,6 +15,7 @@ import (
"strconv"
"strings"
"sync"
+ "syscall"
"testing"
"time"
@@ -25,7 +25,7 @@ import (
"github.com/hashicorp/nomad/client/allocdir"
"github.com/hashicorp/nomad/client/config"
"github.com/hashicorp/nomad/client/taskenv"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/testlog"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/mock"
@@ -33,6 +33,7 @@ import (
sconfig "github.com/hashicorp/nomad/nomad/structs/config"
"github.com/hashicorp/nomad/testutil"
"github.com/kr/pretty"
+ "github.com/shoenig/test/must"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
@@ -121,6 +122,16 @@ func (m *MockTaskHooks) EmitEvent(event *structs.TaskEvent) {
func (m *MockTaskHooks) SetState(state string, event *structs.TaskEvent) {}
+// mockExecutor implements script executor interface
+type mockExecutor struct {
+ DesiredExit int
+ DesiredErr error
+}
+
+func (m *mockExecutor) Exec(timeout time.Duration, cmd string, args []string) ([]byte, int, error) {
+ return []byte{}, m.DesiredExit, m.DesiredErr
+}
+
// testHarness is used to test the TaskTemplateManager by spinning up
// Consul/Vault as needed
type testHarness struct {
@@ -154,7 +165,7 @@ func newTestHarness(t *testing.T, templates []*structs.Template, consul, vault b
TemplateConfig: &config.ClientTemplateConfig{
FunctionDenylist: config.DefaultTemplateFunctionDenylist,
DisableSandbox: false,
- ConsulRetry: &config.RetryConfig{Backoff: helper.TimeToPtr(10 * time.Millisecond)},
+ ConsulRetry: &config.RetryConfig{Backoff: pointer.Of(10 * time.Millisecond)},
}},
emitRate: DefaultMaxTemplateEventRate,
}
@@ -211,7 +222,6 @@ func (h *testHarness) startWithErr() error {
EnvBuilder: h.envBuilder,
MaxTemplateEventRate: h.emitRate,
})
-
return err
}
@@ -379,7 +389,7 @@ func TestTaskTemplateManager_InvalidConfig(t *testing.T) {
func TestTaskTemplateManager_HostPath(t *testing.T) {
ci.Parallel(t)
// Make a template that will render immediately and write it to a tmp file
- f, err := ioutil.TempFile("", "")
+ f, err := os.CreateTemp("", "")
if err != nil {
t.Fatalf("Bad: %v", err)
}
@@ -415,7 +425,7 @@ func TestTaskTemplateManager_HostPath(t *testing.T) {
// Check the file is there
path := filepath.Join(harness.taskDir, file)
- raw, err := ioutil.ReadFile(path)
+ raw, err := os.ReadFile(path)
if err != nil {
t.Fatalf("Failed to read rendered template from %q: %v", path, err)
}
@@ -492,7 +502,7 @@ func TestTaskTemplateManager_Unblock_Static(t *testing.T) {
// Check the file is there
path := filepath.Join(harness.taskDir, file)
- raw, err := ioutil.ReadFile(path)
+ raw, err := os.ReadFile(path)
if err != nil {
t.Fatalf("Failed to read rendered template from %q: %v", path, err)
}
@@ -512,6 +522,8 @@ func TestTaskTemplateManager_Permissions(t *testing.T) {
DestPath: file,
ChangeMode: structs.TemplateChangeModeNoop,
Perms: "777",
+ Uid: pointer.Of(503),
+ Gid: pointer.Of(20),
}
harness := newTestHarness(t, []*structs.Template{template}, false, false)
@@ -535,6 +547,13 @@ func TestTaskTemplateManager_Permissions(t *testing.T) {
if m := fi.Mode(); m != os.ModePerm {
t.Fatalf("Got mode %v; want %v", m, os.ModePerm)
}
+
+ sys := fi.Sys()
+ uid := pointer.Of(int(sys.(*syscall.Stat_t).Uid))
+ gid := pointer.Of(int(sys.(*syscall.Stat_t).Gid))
+
+ must.Eq(t, template.Uid, uid)
+ must.Eq(t, template.Gid, gid)
}
func TestTaskTemplateManager_Unblock_Static_NomadEnv(t *testing.T) {
@@ -562,7 +581,7 @@ func TestTaskTemplateManager_Unblock_Static_NomadEnv(t *testing.T) {
// Check the file is there
path := filepath.Join(harness.taskDir, file)
- raw, err := ioutil.ReadFile(path)
+ raw, err := os.ReadFile(path)
if err != nil {
t.Fatalf("Failed to read rendered template from %q: %v", path, err)
}
@@ -587,7 +606,7 @@ func TestTaskTemplateManager_Unblock_Static_AlreadyRendered(t *testing.T) {
// Write the contents
path := filepath.Join(harness.taskDir, file)
- if err := ioutil.WriteFile(path, []byte(content), 0777); err != nil {
+ if err := os.WriteFile(path, []byte(content), 0777); err != nil {
t.Fatalf("Failed to write data: %v", err)
}
@@ -603,7 +622,7 @@ func TestTaskTemplateManager_Unblock_Static_AlreadyRendered(t *testing.T) {
// Check the file is there
path = filepath.Join(harness.taskDir, file)
- raw, err := ioutil.ReadFile(path)
+ raw, err := os.ReadFile(path)
if err != nil {
t.Fatalf("Failed to read rendered template from %q: %v", path, err)
}
@@ -649,7 +668,7 @@ func TestTaskTemplateManager_Unblock_Consul(t *testing.T) {
// Check the file is there
path := filepath.Join(harness.taskDir, file)
- raw, err := ioutil.ReadFile(path)
+ raw, err := os.ReadFile(path)
if err != nil {
t.Fatalf("Failed to read rendered template from %q: %v", path, err)
}
@@ -699,7 +718,7 @@ func TestTaskTemplateManager_Unblock_Vault(t *testing.T) {
// Check the file is there
path := filepath.Join(harness.taskDir, file)
- raw, err := ioutil.ReadFile(path)
+ raw, err := os.ReadFile(path)
if err != nil {
t.Fatalf("Failed to read rendered template from %q: %v", path, err)
}
@@ -744,7 +763,7 @@ func TestTaskTemplateManager_Unblock_Multi_Template(t *testing.T) {
// Check that the static file has been rendered
path := filepath.Join(harness.taskDir, staticFile)
- raw, err := ioutil.ReadFile(path)
+ raw, err := os.ReadFile(path)
if err != nil {
t.Fatalf("Failed to read rendered template from %q: %v", path, err)
}
@@ -765,7 +784,7 @@ func TestTaskTemplateManager_Unblock_Multi_Template(t *testing.T) {
// Check the consul file is there
path = filepath.Join(harness.taskDir, consulFile)
- raw, err = ioutil.ReadFile(path)
+ raw, err = os.ReadFile(path)
if err != nil {
t.Fatalf("Failed to read rendered template from %q: %v", path, err)
}
@@ -817,7 +836,7 @@ func TestTaskTemplateManager_FirstRender_Restored(t *testing.T) {
// Check the file is there
path := filepath.Join(harness.taskDir, file)
- raw, err := ioutil.ReadFile(path)
+ raw, err := os.ReadFile(path)
require.NoError(err, "Failed to read rendered template from %q", path)
require.Equal(content, string(raw), "Unexpected template data; got %s, want %q", raw, content)
@@ -911,7 +930,7 @@ func TestTaskTemplateManager_Rerender_Noop(t *testing.T) {
// Check the file is there
path := filepath.Join(harness.taskDir, file)
- raw, err := ioutil.ReadFile(path)
+ raw, err := os.ReadFile(path)
if err != nil {
t.Fatalf("Failed to read rendered template from %q: %v", path, err)
}
@@ -933,7 +952,7 @@ func TestTaskTemplateManager_Rerender_Noop(t *testing.T) {
// Check the file has been updated
path = filepath.Join(harness.taskDir, file)
- raw, err = ioutil.ReadFile(path)
+ raw, err = os.ReadFile(path)
if err != nil {
t.Fatalf("Failed to read rendered template from %q: %v", path, err)
}
@@ -1023,7 +1042,7 @@ OUTER:
// Check the files have been updated
path := filepath.Join(harness.taskDir, file1)
- raw, err := ioutil.ReadFile(path)
+ raw, err := os.ReadFile(path)
if err != nil {
t.Fatalf("Failed to read rendered template from %q: %v", path, err)
}
@@ -1033,7 +1052,7 @@ OUTER:
}
path = filepath.Join(harness.taskDir, file2)
- raw, err = ioutil.ReadFile(path)
+ raw, err = os.ReadFile(path)
if err != nil {
t.Fatalf("Failed to read rendered template from %q: %v", path, err)
}
@@ -1097,7 +1116,7 @@ OUTER:
// Check the files have been updated
path := filepath.Join(harness.taskDir, file1)
- raw, err := ioutil.ReadFile(path)
+ raw, err := os.ReadFile(path)
if err != nil {
t.Fatalf("Failed to read rendered template from %q: %v", path, err)
}
@@ -1132,7 +1151,7 @@ func TestTaskTemplateManager_Interpolate_Destination(t *testing.T) {
// Check the file is there
actual := fmt.Sprintf("%s.tmpl", harness.node.ID)
path := filepath.Join(harness.taskDir, actual)
- raw, err := ioutil.ReadFile(path)
+ raw, err := os.ReadFile(path)
if err != nil {
t.Fatalf("Failed to read rendered template from %q: %v", path, err)
}
@@ -1190,6 +1209,168 @@ func TestTaskTemplateManager_Signal_Error(t *testing.T) {
require.Contains(harness.mockHooks.KillEvent.DisplayMessage, "failed to send signals")
}
+func TestTaskTemplateManager_ScriptExecution(t *testing.T) {
+ ci.Parallel(t)
+
+ // Make a template that renders based on a key in Consul and triggers script
+ key1 := "bam"
+ key2 := "bar"
+ content1_1 := "cat"
+ content1_2 := "dog"
+ t1 := &structs.Template{
+ EmbeddedTmpl: `
+FOO={{key "bam"}}
+`,
+ DestPath: "test.env",
+ ChangeMode: structs.TemplateChangeModeScript,
+ ChangeScript: &structs.ChangeScript{
+ Command: "/bin/foo",
+ Args: []string{},
+ Timeout: 5 * time.Second,
+ FailOnError: false,
+ },
+ Envvars: true,
+ }
+ t2 := &structs.Template{
+ EmbeddedTmpl: `
+BAR={{key "bar"}}
+`,
+ DestPath: "test2.env",
+ ChangeMode: structs.TemplateChangeModeScript,
+ ChangeScript: &structs.ChangeScript{
+ Command: "/bin/foo",
+ Args: []string{},
+ Timeout: 5 * time.Second,
+ FailOnError: false,
+ },
+ Envvars: true,
+ }
+
+ me := mockExecutor{DesiredExit: 0, DesiredErr: nil}
+ harness := newTestHarness(t, []*structs.Template{t1, t2}, true, false)
+ harness.start(t)
+ harness.manager.SetDriverHandle(&me)
+ defer harness.stop()
+
+ // Ensure no unblock
+ select {
+ case <-harness.mockHooks.UnblockCh:
+ require.Fail(t, "Task unblock should not have been called")
+ case <-time.After(time.Duration(1*testutil.TestMultiplier()) * time.Second):
+ }
+
+ // Write the key to Consul
+ harness.consul.SetKV(t, key1, []byte(content1_1))
+ harness.consul.SetKV(t, key2, []byte(content1_1))
+
+ // Wait for the unblock
+ select {
+ case <-harness.mockHooks.UnblockCh:
+ case <-time.After(time.Duration(5*testutil.TestMultiplier()) * time.Second):
+ require.Fail(t, "Task unblock should have been called")
+ }
+
+ // Update the keys in Consul
+ harness.consul.SetKV(t, key1, []byte(content1_2))
+
+ // Wait for restart
+ timeout := time.After(time.Duration(5*testutil.TestMultiplier()) * time.Second)
+OUTER:
+ for {
+ select {
+ case <-harness.mockHooks.RestartCh:
+ require.Fail(t, "restart not expected")
+ case ev := <-harness.mockHooks.EmitEventCh:
+ if strings.Contains(ev.DisplayMessage, t1.ChangeScript.Command) {
+ break OUTER
+ }
+ case <-harness.mockHooks.SignalCh:
+ require.Fail(t, "signal not expected")
+ case <-timeout:
+ require.Fail(t, "should have received an event")
+ }
+ }
+}
+
+// TestTaskTemplateManager_ScriptExecutionFailTask tests whether we fail the
+// task upon script execution failure if that's how it's configured.
+func TestTaskTemplateManager_ScriptExecutionFailTask(t *testing.T) {
+ ci.Parallel(t)
+ require := require.New(t)
+
+ // Make a template that renders based on a key in Consul and triggers script
+ key1 := "bam"
+ key2 := "bar"
+ content1_1 := "cat"
+ content1_2 := "dog"
+ t1 := &structs.Template{
+ EmbeddedTmpl: `
+FOO={{key "bam"}}
+`,
+ DestPath: "test.env",
+ ChangeMode: structs.TemplateChangeModeScript,
+ ChangeScript: &structs.ChangeScript{
+ Command: "/bin/foo",
+ Args: []string{},
+ Timeout: 5 * time.Second,
+ FailOnError: true,
+ },
+ Envvars: true,
+ }
+ t2 := &structs.Template{
+ EmbeddedTmpl: `
+BAR={{key "bar"}}
+`,
+ DestPath: "test2.env",
+ ChangeMode: structs.TemplateChangeModeScript,
+ ChangeScript: &structs.ChangeScript{
+ Command: "/bin/foo",
+ Args: []string{},
+ Timeout: 5 * time.Second,
+ FailOnError: false,
+ },
+ Envvars: true,
+ }
+
+ me := mockExecutor{DesiredExit: 1, DesiredErr: fmt.Errorf("Script failed")}
+ harness := newTestHarness(t, []*structs.Template{t1, t2}, true, false)
+ harness.start(t)
+ harness.manager.SetDriverHandle(&me)
+ defer harness.stop()
+
+ // Ensure no unblock
+ select {
+ case <-harness.mockHooks.UnblockCh:
+ require.Fail("Task unblock should not have been called")
+ case <-time.After(time.Duration(1*testutil.TestMultiplier()) * time.Second):
+ }
+
+ // Write the key to Consul
+ harness.consul.SetKV(t, key1, []byte(content1_1))
+ harness.consul.SetKV(t, key2, []byte(content1_1))
+
+ // Wait for the unblock
+ select {
+ case <-harness.mockHooks.UnblockCh:
+ case <-time.After(time.Duration(5*testutil.TestMultiplier()) * time.Second):
+ require.Fail("Task unblock should have been called")
+ }
+
+ // Update the keys in Consul
+ harness.consul.SetKV(t, key1, []byte(content1_2))
+
+ // Wait for kill channel
+ select {
+ case <-harness.mockHooks.KillCh:
+ break
+ case <-time.After(time.Duration(1*testutil.TestMultiplier()) * time.Second):
+ require.Fail("Should have received a signals: %+v", harness.mockHooks)
+ }
+
+ require.NotNil(harness.mockHooks.KillEvent)
+ require.Contains(harness.mockHooks.KillEvent.DisplayMessage, "task is being killed")
+}
+
// TestTaskTemplateManager_FiltersProcessEnvVars asserts that we only render
// environment variables found in task env-vars and not read the nomad host
// process environment variables. nomad host process environment variables
@@ -1230,7 +1411,7 @@ TEST_ENV_NOT_FOUND: {{env "` + testenv + `_NOTFOUND" }}`
// Check the file is there
path := filepath.Join(harness.taskDir, file)
- raw, err := ioutil.ReadFile(path)
+ raw, err := os.ReadFile(path)
require.NoError(t, err)
require.Equal(t, expected, string(raw))
@@ -1286,7 +1467,7 @@ func TestTaskTemplateManager_Env_Missing(t *testing.T) {
d := t.TempDir()
// Fake writing the file so we don't have to run the whole template manager
- err := ioutil.WriteFile(filepath.Join(d, "exists.env"), []byte("FOO=bar\n"), 0644)
+ err := os.WriteFile(filepath.Join(d, "exists.env"), []byte("FOO=bar\n"), 0644)
if err != nil {
t.Fatalf("error writing template file: %v", err)
}
@@ -1319,7 +1500,7 @@ func TestTaskTemplateManager_Env_InterpolatedDest(t *testing.T) {
d := t.TempDir()
// Fake writing the file so we don't have to run the whole template manager
- err := ioutil.WriteFile(filepath.Join(d, "exists.env"), []byte("FOO=bar\n"), 0644)
+ err := os.WriteFile(filepath.Join(d, "exists.env"), []byte("FOO=bar\n"), 0644)
if err != nil {
t.Fatalf("error writing template file: %v", err)
}
@@ -1354,11 +1535,11 @@ func TestTaskTemplateManager_Env_Multi(t *testing.T) {
d := t.TempDir()
// Fake writing the files so we don't have to run the whole template manager
- err := ioutil.WriteFile(filepath.Join(d, "zzz.env"), []byte("FOO=bar\nSHARED=nope\n"), 0644)
+ err := os.WriteFile(filepath.Join(d, "zzz.env"), []byte("FOO=bar\nSHARED=nope\n"), 0644)
if err != nil {
t.Fatalf("error writing template file 1: %v", err)
}
- err = ioutil.WriteFile(filepath.Join(d, "aaa.env"), []byte("BAR=foo\nSHARED=yup\n"), 0644)
+ err = os.WriteFile(filepath.Join(d, "aaa.env"), []byte("BAR=foo\nSHARED=yup\n"), 0644)
if err != nil {
t.Fatalf("error writing template file 2: %v", err)
}
@@ -1478,7 +1659,7 @@ func TestTaskTemplateManager_Config_ServerName(t *testing.T) {
c := config.DefaultConfig()
c.Node = mock.Node()
c.VaultConfig = &sconfig.VaultConfig{
- Enabled: helper.BoolToPtr(true),
+ Enabled: pointer.Of(true),
Addr: "https://localhost/",
TLSServerName: "notlocalhost",
}
@@ -1506,7 +1687,7 @@ func TestTaskTemplateManager_Config_VaultNamespace(t *testing.T) {
c := config.DefaultConfig()
c.Node = mock.Node()
c.VaultConfig = &sconfig.VaultConfig{
- Enabled: helper.BoolToPtr(true),
+ Enabled: pointer.Of(true),
Addr: "https://localhost/",
TLSServerName: "notlocalhost",
Namespace: testNS,
@@ -1537,7 +1718,7 @@ func TestTaskTemplateManager_Config_VaultNamespace_TaskOverride(t *testing.T) {
c := config.DefaultConfig()
c.Node = mock.Node()
c.VaultConfig = &sconfig.VaultConfig{
- Enabled: helper.BoolToPtr(true),
+ Enabled: pointer.Of(true),
Addr: "https://localhost/",
TLSServerName: "notlocalhost",
Namespace: testNS,
@@ -1923,7 +2104,7 @@ func TestTaskTemplateManager_ClientTemplateConfig_Set(t *testing.T) {
clientConfig.Node = mock.Node()
clientConfig.VaultConfig = &sconfig.VaultConfig{
- Enabled: helper.BoolToPtr(true),
+ Enabled: pointer.Of(true),
Namespace: testNS,
}
@@ -1933,29 +2114,30 @@ func TestTaskTemplateManager_ClientTemplateConfig_Set(t *testing.T) {
// helper to reduce boilerplate
waitConfig := &config.WaitConfig{
- Min: helper.TimeToPtr(5 * time.Second),
- Max: helper.TimeToPtr(10 * time.Second),
+ Min: pointer.Of(5 * time.Second),
+ Max: pointer.Of(10 * time.Second),
}
// helper to reduce boilerplate
retryConfig := &config.RetryConfig{
- Attempts: helper.IntToPtr(5),
- Backoff: helper.TimeToPtr(5 * time.Second),
- MaxBackoff: helper.TimeToPtr(20 * time.Second),
+ Attempts: pointer.Of(5),
+ Backoff: pointer.Of(5 * time.Second),
+ MaxBackoff: pointer.Of(20 * time.Second),
}
- clientConfig.TemplateConfig.MaxStale = helper.TimeToPtr(5 * time.Second)
- clientConfig.TemplateConfig.BlockQueryWaitTime = helper.TimeToPtr(60 * time.Second)
+ clientConfig.TemplateConfig.MaxStale = pointer.Of(5 * time.Second)
+ clientConfig.TemplateConfig.BlockQueryWaitTime = pointer.Of(60 * time.Second)
clientConfig.TemplateConfig.Wait = waitConfig.Copy()
clientConfig.TemplateConfig.ConsulRetry = retryConfig.Copy()
clientConfig.TemplateConfig.VaultRetry = retryConfig.Copy()
+ clientConfig.TemplateConfig.NomadRetry = retryConfig.Copy()
alloc := mock.Alloc()
allocWithOverride := mock.Alloc()
allocWithOverride.Job.TaskGroups[0].Tasks[0].Templates = []*structs.Template{
{
Wait: &structs.WaitConfig{
- Min: helper.TimeToPtr(2 * time.Second),
- Max: helper.TimeToPtr(12 * time.Second),
+ Min: pointer.Of(2 * time.Second),
+ Max: pointer.Of(12 * time.Second),
},
},
}
@@ -1970,11 +2152,12 @@ func TestTaskTemplateManager_ClientTemplateConfig_Set(t *testing.T) {
{
"basic-wait-config",
&config.ClientTemplateConfig{
- MaxStale: helper.TimeToPtr(5 * time.Second),
- BlockQueryWaitTime: helper.TimeToPtr(60 * time.Second),
+ MaxStale: pointer.Of(5 * time.Second),
+ BlockQueryWaitTime: pointer.Of(60 * time.Second),
Wait: waitConfig.Copy(),
ConsulRetry: retryConfig.Copy(),
VaultRetry: retryConfig.Copy(),
+ NomadRetry: retryConfig.Copy(),
},
&TaskTemplateManagerConfig{
ClientConfig: clientConfig,
@@ -1983,29 +2166,31 @@ func TestTaskTemplateManager_ClientTemplateConfig_Set(t *testing.T) {
},
&config.Config{
TemplateConfig: &config.ClientTemplateConfig{
- MaxStale: helper.TimeToPtr(5 * time.Second),
- BlockQueryWaitTime: helper.TimeToPtr(60 * time.Second),
+ MaxStale: pointer.Of(5 * time.Second),
+ BlockQueryWaitTime: pointer.Of(60 * time.Second),
Wait: waitConfig.Copy(),
ConsulRetry: retryConfig.Copy(),
VaultRetry: retryConfig.Copy(),
+ NomadRetry: retryConfig.Copy(),
},
},
&templateconfig.TemplateConfig{
Wait: &templateconfig.WaitConfig{
- Enabled: helper.BoolToPtr(true),
- Min: helper.TimeToPtr(5 * time.Second),
- Max: helper.TimeToPtr(10 * time.Second),
+ Enabled: pointer.Of(true),
+ Min: pointer.Of(5 * time.Second),
+ Max: pointer.Of(10 * time.Second),
},
},
},
{
"template-override",
&config.ClientTemplateConfig{
- MaxStale: helper.TimeToPtr(5 * time.Second),
- BlockQueryWaitTime: helper.TimeToPtr(60 * time.Second),
+ MaxStale: pointer.Of(5 * time.Second),
+ BlockQueryWaitTime: pointer.Of(60 * time.Second),
Wait: waitConfig.Copy(),
ConsulRetry: retryConfig.Copy(),
VaultRetry: retryConfig.Copy(),
+ NomadRetry: retryConfig.Copy(),
},
&TaskTemplateManagerConfig{
ClientConfig: clientConfig,
@@ -2014,33 +2199,35 @@ func TestTaskTemplateManager_ClientTemplateConfig_Set(t *testing.T) {
},
&config.Config{
TemplateConfig: &config.ClientTemplateConfig{
- MaxStale: helper.TimeToPtr(5 * time.Second),
- BlockQueryWaitTime: helper.TimeToPtr(60 * time.Second),
+ MaxStale: pointer.Of(5 * time.Second),
+ BlockQueryWaitTime: pointer.Of(60 * time.Second),
Wait: waitConfig.Copy(),
ConsulRetry: retryConfig.Copy(),
VaultRetry: retryConfig.Copy(),
+ NomadRetry: retryConfig.Copy(),
},
},
&templateconfig.TemplateConfig{
Wait: &templateconfig.WaitConfig{
- Enabled: helper.BoolToPtr(true),
- Min: helper.TimeToPtr(2 * time.Second),
- Max: helper.TimeToPtr(12 * time.Second),
+ Enabled: pointer.Of(true),
+ Min: pointer.Of(2 * time.Second),
+ Max: pointer.Of(12 * time.Second),
},
},
},
{
"bounds-override",
&config.ClientTemplateConfig{
- MaxStale: helper.TimeToPtr(5 * time.Second),
- BlockQueryWaitTime: helper.TimeToPtr(60 * time.Second),
+ MaxStale: pointer.Of(5 * time.Second),
+ BlockQueryWaitTime: pointer.Of(60 * time.Second),
Wait: waitConfig.Copy(),
WaitBounds: &config.WaitConfig{
- Min: helper.TimeToPtr(3 * time.Second),
- Max: helper.TimeToPtr(11 * time.Second),
+ Min: pointer.Of(3 * time.Second),
+ Max: pointer.Of(11 * time.Second),
},
ConsulRetry: retryConfig.Copy(),
VaultRetry: retryConfig.Copy(),
+ NomadRetry: retryConfig.Copy(),
},
&TaskTemplateManagerConfig{
ClientConfig: clientConfig,
@@ -2049,30 +2236,31 @@ func TestTaskTemplateManager_ClientTemplateConfig_Set(t *testing.T) {
Templates: []*structs.Template{
{
Wait: &structs.WaitConfig{
- Min: helper.TimeToPtr(2 * time.Second),
- Max: helper.TimeToPtr(12 * time.Second),
+ Min: pointer.Of(2 * time.Second),
+ Max: pointer.Of(12 * time.Second),
},
},
},
},
&config.Config{
TemplateConfig: &config.ClientTemplateConfig{
- MaxStale: helper.TimeToPtr(5 * time.Second),
- BlockQueryWaitTime: helper.TimeToPtr(60 * time.Second),
+ MaxStale: pointer.Of(5 * time.Second),
+ BlockQueryWaitTime: pointer.Of(60 * time.Second),
Wait: waitConfig.Copy(),
WaitBounds: &config.WaitConfig{
- Min: helper.TimeToPtr(3 * time.Second),
- Max: helper.TimeToPtr(11 * time.Second),
+ Min: pointer.Of(3 * time.Second),
+ Max: pointer.Of(11 * time.Second),
},
ConsulRetry: retryConfig.Copy(),
VaultRetry: retryConfig.Copy(),
+ NomadRetry: retryConfig.Copy(),
},
},
&templateconfig.TemplateConfig{
Wait: &templateconfig.WaitConfig{
- Enabled: helper.BoolToPtr(true),
- Min: helper.TimeToPtr(3 * time.Second),
- Max: helper.TimeToPtr(11 * time.Second),
+ Enabled: pointer.Of(true),
+ Min: pointer.Of(3 * time.Second),
+ Max: pointer.Of(11 * time.Second),
},
},
},
@@ -2106,6 +2294,12 @@ func TestTaskTemplateManager_ClientTemplateConfig_Set(t *testing.T) {
require.Equal(t, *_case.ExpectedRunnerConfig.TemplateConfig.VaultRetry.Attempts, *runnerConfig.Vault.Retry.Attempts)
require.Equal(t, *_case.ExpectedRunnerConfig.TemplateConfig.VaultRetry.Backoff, *runnerConfig.Vault.Retry.Backoff)
require.Equal(t, *_case.ExpectedRunnerConfig.TemplateConfig.VaultRetry.MaxBackoff, *runnerConfig.Vault.Retry.MaxBackoff)
+ // Nomad Retry
+ require.NotNil(t, runnerConfig.Nomad)
+ require.NotNil(t, runnerConfig.Nomad.Retry)
+ require.Equal(t, *_case.ExpectedRunnerConfig.TemplateConfig.NomadRetry.Attempts, *runnerConfig.Nomad.Retry.Attempts)
+ require.Equal(t, *_case.ExpectedRunnerConfig.TemplateConfig.NomadRetry.Backoff, *runnerConfig.Nomad.Retry.Backoff)
+ require.Equal(t, *_case.ExpectedRunnerConfig.TemplateConfig.NomadRetry.MaxBackoff, *runnerConfig.Nomad.Retry.MaxBackoff)
// Test that wait_bounds are enforced
for _, tmpl := range *runnerConfig.Templates {
@@ -2135,8 +2329,8 @@ func TestTaskTemplateManager_Template_Wait_Set(t *testing.T) {
Templates: []*structs.Template{
{
Wait: &structs.WaitConfig{
- Min: helper.TimeToPtr(5 * time.Second),
- Max: helper.TimeToPtr(10 * time.Second),
+ Min: pointer.Of(5 * time.Second),
+ Max: pointer.Of(10 * time.Second),
},
},
},
@@ -2185,7 +2379,7 @@ func TestTaskTemplateManager_writeToFile_Disabled(t *testing.T) {
// Check the file is not there
path := filepath.Join(harness.taskDir, file)
- _, err := ioutil.ReadFile(path)
+ _, err := os.ReadFile(path)
require.Error(t, err)
}
@@ -2238,13 +2432,13 @@ func TestTaskTemplateManager_writeToFile(t *testing.T) {
// Check the templated file is there
path := filepath.Join(harness.taskDir, file)
- r, err := ioutil.ReadFile(path)
+ r, err := os.ReadFile(path)
require.NoError(t, err)
require.True(t, bytes.HasSuffix(r, []byte("...done\n")), string(r))
// Check that writeToFile was allowed
path = filepath.Join(harness.taskDir, "writetofile.out")
- r, err = ioutil.ReadFile(path)
+ r, err = os.ReadFile(path)
require.NoError(t, err)
require.Equal(t, "hello", string(r))
}
diff --git a/client/allocrunner/taskrunner/template_hook.go b/client/allocrunner/taskrunner/template_hook.go
index cdc6ee16f7b..4e14fcc43f2 100644
--- a/client/allocrunner/taskrunner/template_hook.go
+++ b/client/allocrunner/taskrunner/template_hook.go
@@ -115,6 +115,19 @@ func (h *templateHook) Prestart(ctx context.Context, req *interfaces.TaskPrestar
return nil
}
+func (h *templateHook) Poststart(ctx context.Context, req *interfaces.TaskPoststartRequest, resp *interfaces.TaskPoststartResponse) error {
+ if req.DriverExec != nil {
+ h.templateManager.SetDriverHandle(req.DriverExec)
+ } else {
+ for _, template := range h.config.templates {
+ if template.ChangeMode == structs.TemplateChangeModeScript {
+ return fmt.Errorf("template has change mode set to 'script' but the driver it uses does not provide exec capability")
+ }
+ }
+ }
+ return nil
+}
+
func (h *templateHook) newManager() (unblock chan struct{}, err error) {
unblock = make(chan struct{})
m, err := template.NewTaskTemplateManager(&template.TaskTemplateManagerConfig{
diff --git a/client/allocrunner/testing.go b/client/allocrunner/testing.go
index 6f2fd7b03df..44e3eb52479 100644
--- a/client/allocrunner/testing.go
+++ b/client/allocrunner/testing.go
@@ -4,6 +4,7 @@
package allocrunner
import (
+ "fmt"
"sync"
"testing"
@@ -20,6 +21,7 @@ import (
"github.com/hashicorp/nomad/client/state"
"github.com/hashicorp/nomad/client/vaultclient"
"github.com/hashicorp/nomad/nomad/structs"
+ "github.com/hashicorp/nomad/testutil"
"github.com/stretchr/testify/require"
)
@@ -104,3 +106,13 @@ func TestAllocRunnerFromAlloc(t *testing.T, alloc *structs.Allocation) (*allocRu
return ar, cleanup
}
+
+func WaitForClientState(t *testing.T, ar *allocRunner, state string) {
+ testutil.WaitForResult(func() (bool, error) {
+ got := ar.AllocState().ClientStatus
+ return got == state,
+ fmt.Errorf("expected alloc runner to be in state %s, got %s", state, got)
+ }, func(err error) {
+ require.NoError(t, err)
+ })
+}
diff --git a/client/client.go b/client/client.go
index 5d2194d3a8e..9e8253132ee 100644
--- a/client/client.go
+++ b/client/client.go
@@ -47,6 +47,7 @@ import (
"github.com/hashicorp/nomad/command/agent/consul"
"github.com/hashicorp/nomad/helper"
"github.com/hashicorp/nomad/helper/envoy"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/pool"
hstats "github.com/hashicorp/nomad/helper/stats"
"github.com/hashicorp/nomad/helper/tlsutil"
@@ -136,7 +137,7 @@ type ClientStatsReporter interface {
}
// AllocRunner is the interface implemented by the core alloc runner.
-//TODO Create via factory to allow testing Client with mock AllocRunners.
+// TODO Create via factory to allow testing Client with mock AllocRunners.
type AllocRunner interface {
Alloc() *structs.Allocation
AllocState() *arstate.State
@@ -159,6 +160,7 @@ type AllocRunner interface {
PersistState() error
RestartTask(taskName string, taskEvent *structs.TaskEvent) error
+ RestartRunning(taskEvent *structs.TaskEvent) error
RestartAll(taskEvent *structs.TaskEvent) error
Reconnect(update *structs.Allocation) error
@@ -170,15 +172,22 @@ type AllocRunner interface {
// are expected to register as a schedule-able node to the servers, and to
// run allocations as determined by the servers.
type Client struct {
- config *config.Config
- start time.Time
+ start time.Time
// stateDB is used to efficiently store client state.
stateDB state.StateDB
- // configCopy is a copy that should be passed to alloc-runners.
- configCopy *config.Config
- configLock sync.RWMutex
+ // config must only be accessed with lock held. To update the config, use the
+ // Client.UpdateConfig() helper. If you need more fine grained control use
+ // the following pattern:
+ //
+ // c.configLock.Lock()
+ // newConfig := c.config.Copy()
+ // //
+ // c.config = newConfig
+ // c.configLock.Unlock()
+ config *config.Config
+ configLock sync.Mutex
logger hclog.InterceptLogger
rpcLogger hclog.Logger
@@ -432,14 +441,8 @@ func NewClient(cfg *config.Config, consulCatalog consul.CatalogAPI, consulProxie
return nil, fmt.Errorf("node setup failed: %v", err)
}
- // Store the config copy before restoring state but after it has been
- // initialized.
- c.configLock.Lock()
- c.configCopy = c.config.Copy()
- c.configLock.Unlock()
-
fingerprintManager := NewFingerprintManager(
- c.configCopy.PluginSingletonLoader, c.GetConfig, c.configCopy.Node,
+ cfg.PluginSingletonLoader, c.GetConfig, cfg.Node,
c.shutdownCh, c.updateNodeFromFingerprint, c.logger)
c.pluginManagers = pluginmanager.New(c.logger)
@@ -468,8 +471,8 @@ func NewClient(cfg *config.Config, consulCatalog consul.CatalogAPI, consulProxie
// Setup the driver manager
driverConfig := &drivermanager.Config{
Logger: c.logger,
- Loader: c.configCopy.PluginSingletonLoader,
- PluginConfig: c.configCopy.NomadPluginConfig(),
+ Loader: cfg.PluginSingletonLoader,
+ PluginConfig: cfg.NomadPluginConfig(),
Updater: c.batchNodeUpdates.updateNodeFromDriver,
EventHandlerFactory: c.GetTaskEventHandler,
State: c.stateDB,
@@ -483,10 +486,10 @@ func NewClient(cfg *config.Config, consulCatalog consul.CatalogAPI, consulProxie
// Setup the device manager
devConfig := &devicemanager.Config{
Logger: c.logger,
- Loader: c.configCopy.PluginSingletonLoader,
- PluginConfig: c.configCopy.NomadPluginConfig(),
+ Loader: cfg.PluginSingletonLoader,
+ PluginConfig: cfg.NomadPluginConfig(),
Updater: c.batchNodeUpdates.updateNodeFromDevices,
- StatsInterval: c.configCopy.StatsCollectionInterval,
+ StatsInterval: cfg.StatsCollectionInterval,
State: c.stateDB,
}
devManager := devicemanager.New(devConfig)
@@ -512,7 +515,7 @@ func NewClient(cfg *config.Config, consulCatalog consul.CatalogAPI, consulProxie
go c.heartbeatStop.watch()
// Add the stats collector
- statsCollector := stats.NewHostStatsCollector(c.logger, c.config.AllocDir, c.devicemanager.AllStats)
+ statsCollector := stats.NewHostStatsCollector(c.logger, c.GetConfig().AllocDir, c.devicemanager.AllStats)
c.hostStatsCollector = statsCollector
// Add the garbage collector
@@ -528,16 +531,14 @@ func NewClient(cfg *config.Config, consulCatalog consul.CatalogAPI, consulProxie
go c.garbageCollector.Run()
// Set the preconfigured list of static servers
- c.configLock.RLock()
- if len(c.configCopy.Servers) > 0 {
- if _, err := c.setServersImpl(c.configCopy.Servers, true); err != nil {
+ if len(cfg.Servers) > 0 {
+ if _, err := c.setServersImpl(cfg.Servers, true); err != nil {
logger.Warn("none of the configured servers are valid", "error", err)
}
}
- c.configLock.RUnlock()
// Setup Consul discovery if enabled
- if c.configCopy.ConsulConfig.ClientAutoJoin != nil && *c.configCopy.ConsulConfig.ClientAutoJoin {
+ if cfg.ConsulConfig.ClientAutoJoin != nil && *cfg.ConsulConfig.ClientAutoJoin {
c.shutdownGroup.Go(c.consulDiscovery)
if c.servers.NumServers() == 0 {
// No configured servers; trigger discovery manually
@@ -571,7 +572,7 @@ func NewClient(cfg *config.Config, consulCatalog consul.CatalogAPI, consulProxie
"The safest way to proceed is to manually stop running task processes "+
"and remove Nomad's state and alloc directories before "+
"restarting. Lost allocations will be rescheduled.",
- "state_dir", c.config.StateDir, "alloc_dir", c.config.AllocDir)
+ "state_dir", cfg.StateDir, "alloc_dir", cfg.AllocDir)
logger.Error("Corrupt state is often caused by a bug. Please " +
"report as much information as possible to " +
"https://github.com/hashicorp/nomad/issues")
@@ -605,8 +606,9 @@ func (c *Client) Ready() <-chan struct{} {
// needed before we begin starting its various components.
func (c *Client) init() error {
// Ensure the state dir exists if we have one
- if c.config.StateDir != "" {
- if err := os.MkdirAll(c.config.StateDir, 0700); err != nil {
+ conf := c.GetConfig()
+ if conf.StateDir != "" {
+ if err := os.MkdirAll(conf.StateDir, 0700); err != nil {
return fmt.Errorf("failed creating state dir: %s", err)
}
@@ -622,12 +624,14 @@ func (c *Client) init() error {
return fmt.Errorf("failed to find temporary directory for the StateDir: %v", err)
}
- c.config.StateDir = p
+ conf = c.UpdateConfig(func(c *config.Config) {
+ c.StateDir = p
+ })
}
- c.logger.Info("using state directory", "state_dir", c.config.StateDir)
+ c.logger.Info("using state directory", "state_dir", conf.StateDir)
// Open the state database
- db, err := c.config.StateDBFactory(c.logger, c.config.StateDir)
+ db, err := conf.StateDBFactory(c.logger, conf.StateDir)
if err != nil {
return fmt.Errorf("failed to open state database: %v", err)
}
@@ -645,8 +649,8 @@ func (c *Client) init() error {
c.stateDB = db
// Ensure the alloc dir exists if we have one
- if c.config.AllocDir != "" {
- if err := os.MkdirAll(c.config.AllocDir, 0711); err != nil {
+ if conf.AllocDir != "" {
+ if err := os.MkdirAll(conf.AllocDir, 0711); err != nil {
return fmt.Errorf("failed creating alloc dir: %s", err)
}
} else {
@@ -666,30 +670,36 @@ func (c *Client) init() error {
return fmt.Errorf("failed to change directory permissions for the AllocDir: %v", err)
}
- c.config.AllocDir = p
+ conf = c.UpdateConfig(func(c *config.Config) {
+ c.AllocDir = p
+ })
}
- c.logger.Info("using alloc directory", "alloc_dir", c.config.AllocDir)
+ c.logger.Info("using alloc directory", "alloc_dir", conf.AllocDir)
reserved := ""
- if c.config.Node != nil && c.config.Node.ReservedResources != nil {
+ if conf.Node != nil && conf.Node.ReservedResources != nil {
// Node should always be non-nil due to initialization in the
// agent package, but don't risk a panic just for a long line.
- reserved = c.config.Node.ReservedResources.Networks.ReservedHostPorts
+ reserved = conf.Node.ReservedResources.Networks.ReservedHostPorts
}
c.logger.Info("using dynamic ports",
- "min", c.config.MinDynamicPort,
- "max", c.config.MaxDynamicPort,
+ "min", conf.MinDynamicPort,
+ "max", conf.MaxDynamicPort,
"reserved", reserved,
)
// Ensure cgroups are created on linux platform
if runtime.GOOS == "linux" && c.cpusetManager != nil {
// use the client configuration for reservable_cores if set
- cores := c.config.ReservableCores
+ cores := conf.ReservableCores
if len(cores) == 0 {
// otherwise lookup the effective cores from the parent cgroup
- cores, _ = cgutil.GetCPUsFromCgroup(c.config.CgroupParent)
+ cores, err = cgutil.GetCPUsFromCgroup(conf.CgroupParent)
+ if err != nil {
+ c.logger.Warn("failed to lookup cpuset from cgroup parent, and not set as reservable_cores", "parent", conf.CgroupParent)
+ // will continue with a disabled cpuset manager
+ }
}
if cpuErr := c.cpusetManager.Init(cores); cpuErr != nil {
// If the client cannot initialize the cgroup then reserved cores will not be reported and the cpuset manager
@@ -728,9 +738,9 @@ func (c *Client) reloadTLSConnections(newConfig *nconfig.TLSConfig) error {
// Keep the client configuration up to date as we use configuration values to
// decide on what type of connections to accept
- c.configLock.Lock()
- c.config.TLSConfig = newConfig
- c.configLock.Unlock()
+ c.UpdateConfig(func(c *config.Config) {
+ c.TLSConfig = newConfig
+ })
c.connPool.ReloadTLS(tlsWrap)
@@ -739,7 +749,8 @@ func (c *Client) reloadTLSConnections(newConfig *nconfig.TLSConfig) error {
// Reload allows a client to reload its configuration on the fly
func (c *Client) Reload(newConfig *config.Config) error {
- shouldReloadTLS, err := tlsutil.ShouldReloadRPCConnections(c.config.TLSConfig, newConfig.TLSConfig)
+ existing := c.GetConfig()
+ shouldReloadTLS, err := tlsutil.ShouldReloadRPCConnections(existing.TLSConfig, newConfig.TLSConfig)
if err != nil {
c.logger.Error("error parsing TLS configuration", "error", err)
return err
@@ -758,31 +769,50 @@ func (c *Client) Leave() error {
return nil
}
-// GetConfig returns the config of the client
+// GetConfig returns the config of the client. Do *not* mutate without first
+// calling Copy().
func (c *Client) GetConfig() *config.Config {
c.configLock.Lock()
defer c.configLock.Unlock()
- return c.configCopy
+ return c.config
+}
+
+// UpdateConfig allows mutating the configuration. The updated configuration is
+// returned.
+func (c *Client) UpdateConfig(cb func(*config.Config)) *config.Config {
+ c.configLock.Lock()
+ defer c.configLock.Unlock()
+
+ // Create a copy of the active config
+ newConfig := c.config.Copy()
+
+ // Pass the copy to the supplied callback for mutation
+ cb(newConfig)
+
+ // Set new config struct
+ c.config = newConfig
+
+ return newConfig
}
// Datacenter returns the datacenter for the given client
func (c *Client) Datacenter() string {
- return c.config.Node.Datacenter
+ return c.GetConfig().Node.Datacenter
}
// Region returns the region for the given client
func (c *Client) Region() string {
- return c.config.Region
+ return c.GetConfig().Region
}
// NodeID returns the node ID for the given client
func (c *Client) NodeID() string {
- return c.config.Node.ID
+ return c.GetConfig().Node.ID
}
// secretNodeID returns the secret node ID for the given client
func (c *Client) secretNodeID() string {
- return c.config.Node.SecretID
+ return c.GetConfig().Node.SecretID
}
// Shutdown is used to tear down the client
@@ -805,7 +835,7 @@ func (c *Client) Shutdown() error {
c.garbageCollector.Stop()
arGroup := group{}
- if c.config.DevMode {
+ if c.GetConfig().DevMode {
// In DevMode destroy all the running allocations.
for _, ar := range c.getAllocRunners() {
ar.Destroy()
@@ -896,27 +926,36 @@ func (c *Client) CollectAllAllocs() {
c.garbageCollector.CollectAll()
}
-func (c *Client) RestartAllocation(allocID, taskName string) error {
+func (c *Client) RestartAllocation(allocID, taskName string, allTasks bool) error {
+ if allTasks && taskName != "" {
+ return fmt.Errorf("task name cannot be set when restarting all tasks")
+ }
+
ar, err := c.getAllocRunner(allocID)
if err != nil {
return err
}
- event := structs.NewTaskEvent(structs.TaskRestartSignal).
- SetRestartReason("User requested restart")
-
if taskName != "" {
+ event := structs.NewTaskEvent(structs.TaskRestartSignal).
+ SetRestartReason("User requested task to restart")
return ar.RestartTask(taskName, event)
}
- return ar.RestartAll(event)
+ if allTasks {
+ event := structs.NewTaskEvent(structs.TaskRestartSignal).
+ SetRestartReason("User requested all tasks to restart")
+ return ar.RestartAll(event)
+ }
+
+ event := structs.NewTaskEvent(structs.TaskRestartSignal).
+ SetRestartReason("User requested running tasks to restart")
+ return ar.RestartRunning(event)
}
// Node returns the locally registered node
func (c *Client) Node() *structs.Node {
- c.configLock.RLock()
- defer c.configLock.RUnlock()
- return c.configCopy.Node
+ return c.GetConfig().Node
}
// getAllocRunner returns an AllocRunner or an UnknownAllocation error if the
@@ -1012,11 +1051,12 @@ func (c *Client) computeAllocatedDeviceGroupStats(devices []*structs.AllocatedDe
// allocation, and has been created by a trusted party that has privileged
// knowledge of the client's secret identifier
func (c *Client) ValidateMigrateToken(allocID, migrateToken string) bool {
- if !c.config.ACLEnabled {
+ conf := c.GetConfig()
+ if !conf.ACLEnabled {
return true
}
- return structs.CompareMigrateToken(allocID, c.secretNodeID(), migrateToken)
+ return structs.CompareMigrateToken(allocID, conf.Node.SecretID, migrateToken)
}
// GetAllocFS returns the AllocFS interface for the alloc dir of an allocation
@@ -1119,7 +1159,8 @@ func (c *Client) setServersImpl(in []string, force bool) (int, error) {
// If there are errors restoring a specific allocation it is marked
// as failed whenever possible.
func (c *Client) restoreState() error {
- if c.config.DevMode {
+ conf := c.GetConfig()
+ if conf.DevMode {
return nil
}
@@ -1163,11 +1204,10 @@ func (c *Client) restoreState() error {
prevAllocWatcher := allocwatcher.NoopPrevAlloc{}
prevAllocMigrator := allocwatcher.NoopPrevAlloc{}
- c.configLock.RLock()
arConf := &allocrunner.Config{
Alloc: alloc,
Logger: c.logger,
- ClientConfig: c.configCopy,
+ ClientConfig: conf,
StateDB: c.stateDB,
StateUpdater: c,
DeviceStatsReporter: c,
@@ -1188,7 +1228,6 @@ func (c *Client) restoreState() error {
RPCClient: c,
Getter: c.getter,
}
- c.configLock.RUnlock()
ar, err := allocrunner.NewAllocRunner(arConf)
if err != nil {
@@ -1248,8 +1287,8 @@ func (c *Client) restoreState() error {
// wait until it gets allocs from server to launch them.
//
// See:
-// * https://github.com/hashicorp/nomad/pull/6207
-// * https://github.com/hashicorp/nomad/issues/5984
+// - https://github.com/hashicorp/nomad/pull/6207
+// - https://github.com/hashicorp/nomad/issues/5984
//
// COMPAT(0.12): remove once upgrading from 0.9.5 is no longer supported
func (c *Client) hasLocalState(alloc *structs.Allocation) bool {
@@ -1332,13 +1371,13 @@ func (c *Client) NumAllocs() int {
return n
}
-// nodeID restores, or generates if necessary, a unique node ID and SecretID.
-// The node ID is, if available, a persistent unique ID. The secret ID is a
-// high-entropy random UUID.
-func (c *Client) nodeID() (id, secret string, err error) {
+// ensureNodeID restores, or generates if necessary, a unique node ID and
+// SecretID. The node ID is, if available, a persistent unique ID. The secret
+// ID is a high-entropy random UUID.
+func ensureNodeID(conf *config.Config) (id, secret string, err error) {
var hostID string
hostInfo, err := host.Info()
- if !c.config.NoHostUUID && err == nil {
+ if !conf.NoHostUUID && err == nil {
if hashed, ok := helper.HashUUID(hostInfo.HostID); ok {
hostID = hashed
}
@@ -1351,19 +1390,19 @@ func (c *Client) nodeID() (id, secret string, err error) {
}
// Do not persist in dev mode
- if c.config.DevMode {
+ if conf.DevMode {
return hostID, uuid.Generate(), nil
}
// Attempt to read existing ID
- idPath := filepath.Join(c.config.StateDir, "client-id")
+ idPath := filepath.Join(conf.StateDir, "client-id")
idBuf, err := ioutil.ReadFile(idPath)
if err != nil && !os.IsNotExist(err) {
return "", "", err
}
// Attempt to read existing secret ID
- secretPath := filepath.Join(c.config.StateDir, "secret-id")
+ secretPath := filepath.Join(conf.StateDir, "secret-id")
secretBuf, err := ioutil.ReadFile(secretPath)
if err != nil && !os.IsNotExist(err) {
return "", "", err
@@ -1398,13 +1437,18 @@ func (c *Client) nodeID() (id, secret string, err error) {
// setupNode is used to setup the initial node
func (c *Client) setupNode() error {
- node := c.config.Node
+ c.configLock.Lock()
+ defer c.configLock.Unlock()
+
+ newConfig := c.config.Copy()
+ node := newConfig.Node
if node == nil {
node = &structs.Node{}
- c.config.Node = node
+ newConfig.Node = node
}
+
// Generate an ID and secret for the node
- id, secretID, err := c.nodeID()
+ id, secretID, err := ensureNodeID(newConfig)
if err != nil {
return fmt.Errorf("node ID setup failed: %v", err)
}
@@ -1431,8 +1475,8 @@ func (c *Client) setupNode() error {
}
if node.NodeResources == nil {
node.NodeResources = &structs.NodeResources{}
- node.NodeResources.MinDynamicPort = c.config.MinDynamicPort
- node.NodeResources.MaxDynamicPort = c.config.MaxDynamicPort
+ node.NodeResources.MinDynamicPort = newConfig.MinDynamicPort
+ node.NodeResources.MaxDynamicPort = newConfig.MaxDynamicPort
}
if node.ReservedResources == nil {
node.ReservedResources = &structs.NodeReservedResources{}
@@ -1449,11 +1493,11 @@ func (c *Client) setupNode() error {
if node.Name == "" {
node.Name, _ = os.Hostname()
}
- node.CgroupParent = c.config.CgroupParent
+ node.CgroupParent = newConfig.CgroupParent
if node.HostVolumes == nil {
- if l := len(c.config.HostVolumes); l != 0 {
+ if l := len(newConfig.HostVolumes); l != 0 {
node.HostVolumes = make(map[string]*structs.ClientHostVolumeConfig, l)
- for k, v := range c.config.HostVolumes {
+ for k, v := range newConfig.HostVolumes {
if _, err := os.Stat(v.Path); err != nil {
return fmt.Errorf("failed to validate volume %s, err: %v", v.Name, err)
}
@@ -1462,9 +1506,9 @@ func (c *Client) setupNode() error {
}
}
if node.HostNetworks == nil {
- if l := len(c.config.HostNetworks); l != 0 {
+ if l := len(newConfig.HostNetworks); l != 0 {
node.HostNetworks = make(map[string]*structs.ClientHostNetworkConfig, l)
- for k, v := range c.config.HostNetworks {
+ for k, v := range newConfig.HostNetworks {
node.HostNetworks[k] = v.Copy()
}
}
@@ -1489,6 +1533,7 @@ func (c *Client) setupNode() error {
node.Meta["connect.proxy_concurrency"] = defaultConnectProxyConcurrency
}
+ c.config = newConfig
return nil
}
@@ -1499,34 +1544,35 @@ func (c *Client) updateNodeFromFingerprint(response *fingerprint.FingerprintResp
defer c.configLock.Unlock()
nodeHasChanged := false
+ newConfig := c.config.Copy()
for name, newVal := range response.Attributes {
- oldVal := c.config.Node.Attributes[name]
+ oldVal := newConfig.Node.Attributes[name]
if oldVal == newVal {
continue
}
nodeHasChanged = true
if newVal == "" {
- delete(c.config.Node.Attributes, name)
+ delete(newConfig.Node.Attributes, name)
} else {
- c.config.Node.Attributes[name] = newVal
+ newConfig.Node.Attributes[name] = newVal
}
}
// update node links and resources from the diff created from
// fingerprinting
for name, newVal := range response.Links {
- oldVal := c.config.Node.Links[name]
+ oldVal := newConfig.Node.Links[name]
if oldVal == newVal {
continue
}
nodeHasChanged = true
if newVal == "" {
- delete(c.config.Node.Links, name)
+ delete(newConfig.Node.Links, name)
} else {
- c.config.Node.Links[name] = newVal
+ newConfig.Node.Links[name] = newVal
}
}
@@ -1536,9 +1582,9 @@ func (c *Client) updateNodeFromFingerprint(response *fingerprint.FingerprintResp
if response.Resources != nil {
response.Resources.Networks = updateNetworks(
response.Resources.Networks,
- c.config)
- if !c.config.Node.Resources.Equals(response.Resources) {
- c.config.Node.Resources.Merge(response.Resources)
+ newConfig)
+ if !newConfig.Node.Resources.Equals(response.Resources) {
+ newConfig.Node.Resources.Merge(response.Resources)
nodeHasChanged = true
}
}
@@ -1548,26 +1594,27 @@ func (c *Client) updateNodeFromFingerprint(response *fingerprint.FingerprintResp
if response.NodeResources != nil {
response.NodeResources.Networks = updateNetworks(
response.NodeResources.Networks,
- c.config)
- if !c.config.Node.NodeResources.Equals(response.NodeResources) {
- c.config.Node.NodeResources.Merge(response.NodeResources)
+ newConfig)
+ if !newConfig.Node.NodeResources.Equals(response.NodeResources) {
+ newConfig.Node.NodeResources.Merge(response.NodeResources)
nodeHasChanged = true
}
- response.NodeResources.MinDynamicPort = c.config.MinDynamicPort
- response.NodeResources.MaxDynamicPort = c.config.MaxDynamicPort
- if c.config.Node.NodeResources.MinDynamicPort != response.NodeResources.MinDynamicPort ||
- c.config.Node.NodeResources.MaxDynamicPort != response.NodeResources.MaxDynamicPort {
+ response.NodeResources.MinDynamicPort = newConfig.MinDynamicPort
+ response.NodeResources.MaxDynamicPort = newConfig.MaxDynamicPort
+ if newConfig.Node.NodeResources.MinDynamicPort != response.NodeResources.MinDynamicPort ||
+ newConfig.Node.NodeResources.MaxDynamicPort != response.NodeResources.MaxDynamicPort {
nodeHasChanged = true
}
}
if nodeHasChanged {
- c.updateNodeLocked()
+ c.config = newConfig
+ c.updateNode()
}
- return c.configCopy.Node
+ return newConfig.Node
}
// updateNetworks filters and overrides network speed of host networks based
@@ -1608,7 +1655,7 @@ func updateNetworks(up structs.Networks, c *config.Config) structs.Networks {
// retryIntv calculates a retry interval value given the base
func (c *Client) retryIntv(base time.Duration) time.Duration {
- if c.config.DevMode {
+ if c.GetConfig().DevMode {
return devModeRetryIntv
}
return base + helper.RandomStagger(base)
@@ -1630,7 +1677,7 @@ func (c *Client) registerAndHeartbeat() {
// we want to do this quickly. We want to do it extra quickly
// in development mode.
var heartbeat <-chan time.Time
- if c.config.DevMode {
+ if c.GetConfig().DevMode {
heartbeat = time.After(0)
} else {
heartbeat = time.After(helper.RandomStagger(initialHeartbeatStagger))
@@ -1674,7 +1721,7 @@ func (c *Client) lastHeartbeat() time.Time {
// getHeartbeatRetryIntv is used to retrieve the time to wait before attempting
// another heartbeat.
func (c *Client) getHeartbeatRetryIntv(err error) time.Duration {
- if c.config.DevMode {
+ if c.GetConfig().DevMode {
return devModeRetryIntv
}
@@ -1860,9 +1907,8 @@ func (c *Client) retryRegisterNode() {
// registerNode is used to register the node or update the registration
func (c *Client) registerNode() error {
- node := c.Node()
req := structs.NodeRegisterRequest{
- Node: node,
+ Node: c.Node(),
WriteRequest: structs.WriteRequest{Region: c.Region()},
}
var resp structs.NodeUpdateResponse
@@ -1871,10 +1917,9 @@ func (c *Client) registerNode() error {
}
// Update the node status to ready after we register.
- c.configLock.Lock()
- node.Status = structs.NodeStatusReady
- c.config.Node.Status = structs.NodeStatusReady
- c.configLock.Unlock()
+ c.UpdateConfig(func(c *config.Config) {
+ c.Node.Status = structs.NodeStatusReady
+ })
c.logger.Info("node registration complete")
if len(resp.EvalIDs) != 0 {
@@ -2257,14 +2302,9 @@ OUTER:
}
}
-// updateNode updates the Node copy and triggers the client to send the updated
-// Node to the server. This should be done while the caller holds the
-// configLock lock.
-func (c *Client) updateNodeLocked() {
- // Update the config copy.
- node := c.config.Node.Copy()
- c.configCopy.Node = node
-
+// updateNode signals the client to send the updated
+// Node to the server.
+func (c *Client) updateNode() {
select {
case c.triggerNodeUpdate <- struct{}{}:
// Node update goroutine was released to execute
@@ -2382,7 +2422,7 @@ func makeFailedAlloc(add *structs.Allocation, err error) *structs.Allocation {
stripped.DeploymentStatus = add.DeploymentStatus.Copy()
} else {
stripped.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(false),
+ Healthy: pointer.Of(false),
Timestamp: failTime,
}
}
@@ -2494,20 +2534,16 @@ func (c *Client) addAlloc(alloc *structs.Allocation, migrateToken string) error
PreviousRunner: c.allocs[alloc.PreviousAllocation],
PreemptedRunners: preemptedAllocs,
RPC: c,
- Config: c.configCopy,
+ Config: c.GetConfig(),
MigrateToken: migrateToken,
Logger: c.logger,
}
prevAllocWatcher, prevAllocMigrator := allocwatcher.NewAllocWatcher(watcherConfig)
- // Copy the config since the node can be swapped out as it is being updated.
- // The long term fix is to pass in the config and node separately and then
- // we don't have to do a copy.
- c.configLock.RLock()
arConf := &allocrunner.Config{
Alloc: alloc,
Logger: c.logger,
- ClientConfig: c.configCopy,
+ ClientConfig: c.GetConfig(),
StateDB: c.stateDB,
Consul: c.consulService,
ConsulProxies: c.consulProxies,
@@ -2527,7 +2563,6 @@ func (c *Client) addAlloc(alloc *structs.Allocation, migrateToken string) error
RPCClient: c,
Getter: c.getter,
}
- c.configLock.RUnlock()
ar, err := allocrunner.NewAllocRunner(arConf)
if err != nil {
@@ -2556,7 +2591,7 @@ func (c *Client) setupConsulTokenClient() error {
// with vault.
func (c *Client) setupVaultClient() error {
var err error
- c.vaultClient, err = vaultclient.NewVaultClient(c.config.VaultConfig, c.logger, c.deriveToken)
+ c.vaultClient, err = vaultclient.NewVaultClient(c.GetConfig().VaultConfig, c.logger, c.deriveToken)
if err != nil {
return err
}
@@ -2577,7 +2612,7 @@ func (c *Client) setupVaultClient() error {
func (c *Client) setupNomadServiceRegistrationHandler() {
cfg := nsd.ServiceRegistrationHandlerCfg{
Datacenter: c.Datacenter(),
- Enabled: c.config.NomadServiceDiscovery,
+ Enabled: c.GetConfig().NomadServiceDiscovery,
NodeID: c.NodeID(),
NodeSecret: c.secretNodeID(),
Region: c.Region(),
@@ -2757,7 +2792,8 @@ func taskIsPresent(taskName string, tasks []*structs.Task) bool {
// triggerDiscovery causes a Consul discovery to begin (if one hasn't already)
func (c *Client) triggerDiscovery() {
- if c.configCopy.ConsulConfig.ClientAutoJoin != nil && *c.configCopy.ConsulConfig.ClientAutoJoin {
+ config := c.GetConfig()
+ if config.ConsulConfig.ClientAutoJoin != nil && *config.ConsulConfig.ClientAutoJoin {
select {
case c.triggerDiscoveryCh <- struct{}{}:
// Discovery goroutine was released to execute
@@ -2810,7 +2846,7 @@ func (c *Client) consulDiscoveryImpl() error {
},
}
- serviceName := c.configCopy.ConsulConfig.ServerServiceName
+ serviceName := c.GetConfig().ConsulConfig.ServerServiceName
var mErr multierror.Error
var nomadServers servers.Servers
consulLogger.Debug("bootstrap contacting Consul DCs", "consul_dcs", dcs)
@@ -2904,13 +2940,14 @@ func (c *Client) emitStats() {
next := time.NewTimer(0)
defer next.Stop()
for {
+ config := c.GetConfig()
select {
case <-next.C:
err := c.hostStatsCollector.Collect()
- next.Reset(c.config.StatsCollectionInterval)
+ next.Reset(config.StatsCollectionInterval)
if err != nil {
c.logger.Warn("error fetching host resource usage stats", "error", err)
- } else if c.config.PublishNodeMetrics {
+ } else if config.PublishNodeMetrics {
// Publish Node metrics if operator has opted in
c.emitHostStats()
}
@@ -2971,9 +3008,7 @@ func (c *Client) setGaugeForDiskStats(nodeID string, hStats *stats.HostStats, ba
// setGaugeForAllocationStats proxies metrics for allocation specific statistics
func (c *Client) setGaugeForAllocationStats(nodeID string, baseLabels []metrics.Label) {
- c.configLock.RLock()
- node := c.configCopy.Node
- c.configLock.RUnlock()
+ node := c.GetConfig().Node
total := node.NodeResources
res := node.ReservedResources
allocated := c.getAllocatedResources(node)
@@ -3072,14 +3107,11 @@ func (c *Client) emitClientMetrics() {
// labels takes the base labels and appends the node state
func (c *Client) labels() []metrics.Label {
- c.configLock.RLock()
- nodeStatus := c.configCopy.Node.Status
- nodeEligibility := c.configCopy.Node.SchedulingEligibility
- c.configLock.RUnlock()
+ node := c.Node()
return append(c.baseLabels,
- metrics.Label{Name: "node_status", Value: nodeStatus},
- metrics.Label{Name: "node_scheduling_eligibility", Value: nodeEligibility},
+ metrics.Label{Name: "node_status", Value: node.Status},
+ metrics.Label{Name: "node_scheduling_eligibility", Value: node.SchedulingEligibility},
)
}
diff --git a/client/client_test.go b/client/client_test.go
index 8d7fa6c435c..f41021a754d 100644
--- a/client/client_test.go
+++ b/client/client_test.go
@@ -191,63 +191,55 @@ func TestClient_Fingerprint_Periodic(t *testing.T) {
})
defer cleanup()
- node := c1.config.Node
- {
- // Ensure the mock driver is registered on the client
- testutil.WaitForResult(func() (bool, error) {
- c1.configLock.Lock()
- defer c1.configLock.Unlock()
+ // Ensure the mock driver is registered on the client
+ testutil.WaitForResult(func() (bool, error) {
+ node := c1.Node()
- // assert that the driver is set on the node attributes
- mockDriverInfoAttr := node.Attributes["driver.mock_driver"]
- if mockDriverInfoAttr == "" {
- return false, fmt.Errorf("mock driver is empty when it should be set on the node attributes")
- }
+ // assert that the driver is set on the node attributes
+ mockDriverInfoAttr := node.Attributes["driver.mock_driver"]
+ if mockDriverInfoAttr == "" {
+ return false, fmt.Errorf("mock driver is empty when it should be set on the node attributes")
+ }
- mockDriverInfo := node.Drivers["mock_driver"]
+ mockDriverInfo := node.Drivers["mock_driver"]
- // assert that the Driver information for the node is also set correctly
- if mockDriverInfo == nil {
- return false, fmt.Errorf("mock driver is nil when it should be set on node Drivers")
- }
- if !mockDriverInfo.Detected {
- return false, fmt.Errorf("mock driver should be set as detected")
- }
- if !mockDriverInfo.Healthy {
- return false, fmt.Errorf("mock driver should be set as healthy")
- }
- if mockDriverInfo.HealthDescription == "" {
- return false, fmt.Errorf("mock driver description should not be empty")
- }
- return true, nil
- }, func(err error) {
- t.Fatalf("err: %v", err)
- })
- }
+ // assert that the Driver information for the node is also set correctly
+ if mockDriverInfo == nil {
+ return false, fmt.Errorf("mock driver is nil when it should be set on node Drivers")
+ }
+ if !mockDriverInfo.Detected {
+ return false, fmt.Errorf("mock driver should be set as detected")
+ }
+ if !mockDriverInfo.Healthy {
+ return false, fmt.Errorf("mock driver should be set as healthy")
+ }
+ if mockDriverInfo.HealthDescription == "" {
+ return false, fmt.Errorf("mock driver description should not be empty")
+ }
+ return true, nil
+ }, func(err error) {
+ t.Fatalf("err: %v", err)
+ })
- {
- testutil.WaitForResult(func() (bool, error) {
- c1.configLock.Lock()
- defer c1.configLock.Unlock()
- mockDriverInfo := node.Drivers["mock_driver"]
- // assert that the Driver information for the node is also set correctly
- if mockDriverInfo == nil {
- return false, fmt.Errorf("mock driver is nil when it should be set on node Drivers")
- }
- if mockDriverInfo.Detected {
- return false, fmt.Errorf("mock driver should not be set as detected")
- }
- if mockDriverInfo.Healthy {
- return false, fmt.Errorf("mock driver should not be set as healthy")
- }
- if mockDriverInfo.HealthDescription == "" {
- return false, fmt.Errorf("mock driver description should not be empty")
- }
- return true, nil
- }, func(err error) {
- t.Fatalf("err: %v", err)
- })
- }
+ testutil.WaitForResult(func() (bool, error) {
+ mockDriverInfo := c1.Node().Drivers["mock_driver"]
+ // assert that the Driver information for the node is also set correctly
+ if mockDriverInfo == nil {
+ return false, fmt.Errorf("mock driver is nil when it should be set on node Drivers")
+ }
+ if mockDriverInfo.Detected {
+ return false, fmt.Errorf("mock driver should not be set as detected")
+ }
+ if mockDriverInfo.Healthy {
+ return false, fmt.Errorf("mock driver should not be set as healthy")
+ }
+ if mockDriverInfo.HealthDescription == "" {
+ return false, fmt.Errorf("mock driver description should not be empty")
+ }
+ return true, nil
+ }, func(err error) {
+ t.Fatalf("err: %v", err)
+ })
}
// TestClient_MixedTLS asserts that when a server is running with TLS enabled
@@ -1115,17 +1107,18 @@ func TestClient_UpdateNodeFromDevicesAccumulates(t *testing.T) {
})
// initial check
+ conf := client.GetConfig()
expectedResources := &structs.NodeResources{
// computed through test client initialization
- Networks: client.configCopy.Node.NodeResources.Networks,
- NodeNetworks: client.configCopy.Node.NodeResources.NodeNetworks,
- Disk: client.configCopy.Node.NodeResources.Disk,
+ Networks: conf.Node.NodeResources.Networks,
+ NodeNetworks: conf.Node.NodeResources.NodeNetworks,
+ Disk: conf.Node.NodeResources.Disk,
// injected
Cpu: structs.NodeCpuResources{
CpuShares: 123,
- ReservableCpuCores: client.configCopy.Node.NodeResources.Cpu.ReservableCpuCores,
- TotalCpuCores: client.configCopy.Node.NodeResources.Cpu.TotalCpuCores,
+ ReservableCpuCores: conf.Node.NodeResources.Cpu.ReservableCpuCores,
+ TotalCpuCores: conf.Node.NodeResources.Cpu.TotalCpuCores,
},
Memory: structs.NodeMemoryResources{MemoryMB: 1024},
Devices: []*structs.NodeDeviceResource{
@@ -1136,7 +1129,7 @@ func TestClient_UpdateNodeFromDevicesAccumulates(t *testing.T) {
},
}
- assert.EqualValues(t, expectedResources, client.configCopy.Node.NodeResources)
+ assert.EqualValues(t, expectedResources, conf.Node.NodeResources)
// overrides of values
@@ -1157,17 +1150,19 @@ func TestClient_UpdateNodeFromDevicesAccumulates(t *testing.T) {
},
})
+ conf = client.GetConfig()
+
expectedResources2 := &structs.NodeResources{
// computed through test client initialization
- Networks: client.configCopy.Node.NodeResources.Networks,
- NodeNetworks: client.configCopy.Node.NodeResources.NodeNetworks,
- Disk: client.configCopy.Node.NodeResources.Disk,
+ Networks: conf.Node.NodeResources.Networks,
+ NodeNetworks: conf.Node.NodeResources.NodeNetworks,
+ Disk: conf.Node.NodeResources.Disk,
// injected
Cpu: structs.NodeCpuResources{
CpuShares: 123,
- ReservableCpuCores: client.configCopy.Node.NodeResources.Cpu.ReservableCpuCores,
- TotalCpuCores: client.configCopy.Node.NodeResources.Cpu.TotalCpuCores,
+ ReservableCpuCores: conf.Node.NodeResources.Cpu.ReservableCpuCores,
+ TotalCpuCores: conf.Node.NodeResources.Cpu.TotalCpuCores,
},
Memory: structs.NodeMemoryResources{MemoryMB: 2048},
Devices: []*structs.NodeDeviceResource{
@@ -1182,7 +1177,7 @@ func TestClient_UpdateNodeFromDevicesAccumulates(t *testing.T) {
},
}
- assert.EqualValues(t, expectedResources2, client.configCopy.Node.NodeResources)
+ assert.EqualValues(t, expectedResources2, conf.Node.NodeResources)
}
diff --git a/client/config/artifact_test.go b/client/config/artifact_test.go
index 0b296f8f86f..a79b4b2b72f 100644
--- a/client/config/artifact_test.go
+++ b/client/config/artifact_test.go
@@ -5,7 +5,7 @@ import (
"time"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/nomad/structs/config"
"github.com/stretchr/testify/require"
)
@@ -34,72 +34,72 @@ func TestArtifactConfigFromAgent(t *testing.T) {
{
name: "invalid http read timeout",
config: &config.ArtifactConfig{
- HTTPReadTimeout: helper.StringToPtr("invalid"),
- HTTPMaxSize: helper.StringToPtr("100GB"),
- GCSTimeout: helper.StringToPtr("30m"),
- GitTimeout: helper.StringToPtr("30m"),
- HgTimeout: helper.StringToPtr("30m"),
- S3Timeout: helper.StringToPtr("30m"),
+ HTTPReadTimeout: pointer.Of("invalid"),
+ HTTPMaxSize: pointer.Of("100GB"),
+ GCSTimeout: pointer.Of("30m"),
+ GitTimeout: pointer.Of("30m"),
+ HgTimeout: pointer.Of("30m"),
+ S3Timeout: pointer.Of("30m"),
},
expectedError: "error parsing HTTPReadTimeout",
},
{
name: "invalid http max size",
config: &config.ArtifactConfig{
- HTTPReadTimeout: helper.StringToPtr("30m"),
- HTTPMaxSize: helper.StringToPtr("invalid"),
- GCSTimeout: helper.StringToPtr("30m"),
- GitTimeout: helper.StringToPtr("30m"),
- HgTimeout: helper.StringToPtr("30m"),
- S3Timeout: helper.StringToPtr("30m"),
+ HTTPReadTimeout: pointer.Of("30m"),
+ HTTPMaxSize: pointer.Of("invalid"),
+ GCSTimeout: pointer.Of("30m"),
+ GitTimeout: pointer.Of("30m"),
+ HgTimeout: pointer.Of("30m"),
+ S3Timeout: pointer.Of("30m"),
},
expectedError: "error parsing HTTPMaxSize",
},
{
name: "invalid gcs timeout",
config: &config.ArtifactConfig{
- HTTPReadTimeout: helper.StringToPtr("30m"),
- HTTPMaxSize: helper.StringToPtr("100GB"),
- GCSTimeout: helper.StringToPtr("invalid"),
- GitTimeout: helper.StringToPtr("30m"),
- HgTimeout: helper.StringToPtr("30m"),
- S3Timeout: helper.StringToPtr("30m"),
+ HTTPReadTimeout: pointer.Of("30m"),
+ HTTPMaxSize: pointer.Of("100GB"),
+ GCSTimeout: pointer.Of("invalid"),
+ GitTimeout: pointer.Of("30m"),
+ HgTimeout: pointer.Of("30m"),
+ S3Timeout: pointer.Of("30m"),
},
expectedError: "error parsing GCSTimeout",
},
{
name: "invalid git timeout",
config: &config.ArtifactConfig{
- HTTPReadTimeout: helper.StringToPtr("30m"),
- HTTPMaxSize: helper.StringToPtr("100GB"),
- GCSTimeout: helper.StringToPtr("30m"),
- GitTimeout: helper.StringToPtr("invalid"),
- HgTimeout: helper.StringToPtr("30m"),
- S3Timeout: helper.StringToPtr("30m"),
+ HTTPReadTimeout: pointer.Of("30m"),
+ HTTPMaxSize: pointer.Of("100GB"),
+ GCSTimeout: pointer.Of("30m"),
+ GitTimeout: pointer.Of("invalid"),
+ HgTimeout: pointer.Of("30m"),
+ S3Timeout: pointer.Of("30m"),
},
expectedError: "error parsing GitTimeout",
},
{
name: "invalid hg timeout",
config: &config.ArtifactConfig{
- HTTPReadTimeout: helper.StringToPtr("30m"),
- HTTPMaxSize: helper.StringToPtr("100GB"),
- GCSTimeout: helper.StringToPtr("30m"),
- GitTimeout: helper.StringToPtr("30m"),
- HgTimeout: helper.StringToPtr("invalid"),
- S3Timeout: helper.StringToPtr("30m"),
+ HTTPReadTimeout: pointer.Of("30m"),
+ HTTPMaxSize: pointer.Of("100GB"),
+ GCSTimeout: pointer.Of("30m"),
+ GitTimeout: pointer.Of("30m"),
+ HgTimeout: pointer.Of("invalid"),
+ S3Timeout: pointer.Of("30m"),
},
expectedError: "error parsing HgTimeout",
},
{
name: "invalid s3 timeout",
config: &config.ArtifactConfig{
- HTTPReadTimeout: helper.StringToPtr("30m"),
- HTTPMaxSize: helper.StringToPtr("100GB"),
- GCSTimeout: helper.StringToPtr("30m"),
- GitTimeout: helper.StringToPtr("30m"),
- HgTimeout: helper.StringToPtr("30m"),
- S3Timeout: helper.StringToPtr("invalid"),
+ HTTPReadTimeout: pointer.Of("30m"),
+ HTTPMaxSize: pointer.Of("100GB"),
+ GCSTimeout: pointer.Of("30m"),
+ GitTimeout: pointer.Of("30m"),
+ HgTimeout: pointer.Of("30m"),
+ S3Timeout: pointer.Of("invalid"),
},
expectedError: "error parsing S3Timeout",
},
diff --git a/client/config/config.go b/client/config/config.go
index 01d843e029b..9fde991006c 100644
--- a/client/config/config.go
+++ b/client/config/config.go
@@ -13,12 +13,14 @@ import (
"github.com/hashicorp/consul-template/config"
"github.com/hashicorp/nomad/client/lib/cgutil"
"github.com/hashicorp/nomad/command/agent/host"
+ "golang.org/x/exp/slices"
log "github.com/hashicorp/go-hclog"
"github.com/hashicorp/nomad/client/state"
"github.com/hashicorp/nomad/helper"
"github.com/hashicorp/nomad/helper/bufconndialer"
"github.com/hashicorp/nomad/helper/pluginutils/loader"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/nomad/structs"
structsc "github.com/hashicorp/nomad/nomad/structs/config"
"github.com/hashicorp/nomad/plugins/base"
@@ -358,6 +360,13 @@ type ClientTemplateConfig struct {
// to wait for the cluster to become available, as is customary in distributed
// systems.
VaultRetry *RetryConfig `hcl:"vault_retry,optional"`
+
+ // This controls the retry behavior when an error is returned from Nomad.
+ // Consul Template is highly fault tolerant, meaning it does not exit in the
+ // face of failure. Instead, it uses exponential back-off and retry functions
+ // to wait for the cluster to become available, as is customary in distributed
+ // systems.
+ NomadRetry *RetryConfig `hcl:"nomad_retry,optional"`
}
// Copy returns a deep copy of a ClientTemplateConfig
@@ -396,6 +405,10 @@ func (c *ClientTemplateConfig) Copy() *ClientTemplateConfig {
nc.VaultRetry = c.VaultRetry.Copy()
}
+ if c.NomadRetry != nil {
+ nc.NomadRetry = c.NomadRetry.Copy()
+ }
+
return nc
}
@@ -413,7 +426,8 @@ func (c *ClientTemplateConfig) IsEmpty() bool {
c.MaxStaleHCL == "" &&
c.Wait.IsEmpty() &&
c.ConsulRetry.IsEmpty() &&
- c.VaultRetry.IsEmpty()
+ c.VaultRetry.IsEmpty() &&
+ c.NomadRetry.IsEmpty()
}
// WaitConfig is mirrored from templateconfig.WaitConfig because we need to handle
@@ -524,7 +538,7 @@ func (wc *WaitConfig) ToConsulTemplate() (*config.WaitConfig, error) {
return nil, err
}
- result := &config.WaitConfig{Enabled: helper.BoolToPtr(true)}
+ result := &config.WaitConfig{Enabled: pointer.Of(true)}
if wc.Min != nil {
result.Min = wc.Min
@@ -667,7 +681,7 @@ func (rc *RetryConfig) ToConsulTemplate() (*config.RetryConfig, error) {
return nil, err
}
- result := &config.RetryConfig{Enabled: helper.BoolToPtr(true)}
+ result := &config.RetryConfig{Enabled: pointer.Of(true)}
if rc.Attempts != nil {
result.Attempts = rc.Attempts
@@ -685,8 +699,11 @@ func (rc *RetryConfig) ToConsulTemplate() (*config.RetryConfig, error) {
}
func (c *Config) Copy() *Config {
- nc := new(Config)
- *nc = *c
+ if c == nil {
+ return nil
+ }
+
+ nc := *c
nc.Node = nc.Node.Copy()
nc.Servers = helper.CopySliceString(nc.Servers)
nc.Options = helper.CopyMapStringString(nc.Options)
@@ -694,12 +711,9 @@ func (c *Config) Copy() *Config {
nc.ConsulConfig = c.ConsulConfig.Copy()
nc.VaultConfig = c.VaultConfig.Copy()
nc.TemplateConfig = c.TemplateConfig.Copy()
- if c.ReservableCores != nil {
- nc.ReservableCores = make([]uint16, len(c.ReservableCores))
- copy(nc.ReservableCores, c.ReservableCores)
- }
+ nc.ReservableCores = slices.Clone(c.ReservableCores)
nc.Artifact = c.Artifact.Copy()
- return nc
+ return &nc
}
// DefaultConfig returns the default configuration
@@ -723,17 +737,20 @@ func DefaultConfig() *Config {
TemplateConfig: &ClientTemplateConfig{
FunctionDenylist: DefaultTemplateFunctionDenylist,
DisableSandbox: false,
- BlockQueryWaitTime: helper.TimeToPtr(5 * time.Minute), // match Consul default
- MaxStale: helper.TimeToPtr(DefaultTemplateMaxStale), // match Consul default
+ BlockQueryWaitTime: pointer.Of(5 * time.Minute), // match Consul default
+ MaxStale: pointer.Of(DefaultTemplateMaxStale), // match Consul default
Wait: &WaitConfig{
- Min: helper.TimeToPtr(5 * time.Second),
- Max: helper.TimeToPtr(4 * time.Minute),
+ Min: pointer.Of(5 * time.Second),
+ Max: pointer.Of(4 * time.Minute),
},
ConsulRetry: &RetryConfig{
- Attempts: helper.IntToPtr(0), // unlimited
+ Attempts: pointer.Of(0), // unlimited
},
VaultRetry: &RetryConfig{
- Attempts: helper.IntToPtr(0), // unlimited
+ Attempts: pointer.Of(0), // unlimited
+ },
+ NomadRetry: &RetryConfig{
+ Attempts: pointer.Of(0), // unlimited
},
},
RPCHoldTimeout: 5 * time.Second,
diff --git a/client/config/config_test.go b/client/config/config_test.go
index 88f5bd1b741..fada640e25b 100644
--- a/client/config/config_test.go
+++ b/client/config/config_test.go
@@ -6,7 +6,7 @@ import (
"github.com/hashicorp/consul-template/config"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/stretchr/testify/require"
)
@@ -49,8 +49,8 @@ func TestConfigReadDefault(t *testing.T) {
func mockWaitConfig() *WaitConfig {
return &WaitConfig{
- Min: helper.TimeToPtr(5 * time.Second),
- Max: helper.TimeToPtr(10 * time.Second),
+ Min: pointer.Of(5 * time.Second),
+ Max: pointer.Of(10 * time.Second),
}
}
@@ -66,26 +66,26 @@ func TestWaitConfig_Copy(t *testing.T) {
"fully-populated",
mockWaitConfig(),
&WaitConfig{
- Min: helper.TimeToPtr(5 * time.Second),
- Max: helper.TimeToPtr(10 * time.Second),
+ Min: pointer.Of(5 * time.Second),
+ Max: pointer.Of(10 * time.Second),
},
},
{
"min-only",
&WaitConfig{
- Min: helper.TimeToPtr(5 * time.Second),
+ Min: pointer.Of(5 * time.Second),
},
&WaitConfig{
- Min: helper.TimeToPtr(5 * time.Second),
+ Min: pointer.Of(5 * time.Second),
},
},
{
"max-only",
&WaitConfig{
- Max: helper.TimeToPtr(5 * time.Second),
+ Max: pointer.Of(5 * time.Second),
},
&WaitConfig{
- Max: helper.TimeToPtr(5 * time.Second),
+ Max: pointer.Of(5 * time.Second),
},
},
}
@@ -122,7 +122,7 @@ func TestWaitConfig_IsEmpty(t *testing.T) {
{
"is-not-empty",
&WaitConfig{
- Min: helper.TimeToPtr(10 * time.Second),
+ Min: pointer.Of(10 * time.Second),
},
false,
},
@@ -148,8 +148,8 @@ func TestWaitConfig_IsEqual(t *testing.T) {
"are-equal",
mockWaitConfig(),
&WaitConfig{
- Min: helper.TimeToPtr(5 * time.Second),
- Max: helper.TimeToPtr(10 * time.Second),
+ Min: pointer.Of(5 * time.Second),
+ Max: pointer.Of(10 * time.Second),
},
true,
},
@@ -157,8 +157,8 @@ func TestWaitConfig_IsEqual(t *testing.T) {
"min-different",
mockWaitConfig(),
&WaitConfig{
- Min: helper.TimeToPtr(4 * time.Second),
- Max: helper.TimeToPtr(10 * time.Second),
+ Min: pointer.Of(4 * time.Second),
+ Max: pointer.Of(10 * time.Second),
},
false,
},
@@ -166,8 +166,8 @@ func TestWaitConfig_IsEqual(t *testing.T) {
"max-different",
mockWaitConfig(),
&WaitConfig{
- Min: helper.TimeToPtr(5 * time.Second),
- Max: helper.TimeToPtr(9 * time.Second),
+ Min: pointer.Of(5 * time.Second),
+ Max: pointer.Of(9 * time.Second),
},
false,
},
@@ -191,8 +191,8 @@ func TestWaitConfig_IsValid(t *testing.T) {
{
"is-valid",
&WaitConfig{
- Min: helper.TimeToPtr(5 * time.Second),
- Max: helper.TimeToPtr(10 * time.Second),
+ Min: pointer.Of(5 * time.Second),
+ Max: pointer.Of(10 * time.Second),
},
"",
},
@@ -209,15 +209,15 @@ func TestWaitConfig_IsValid(t *testing.T) {
{
"min-greater-than-max",
&WaitConfig{
- Min: helper.TimeToPtr(10 * time.Second),
- Max: helper.TimeToPtr(5 * time.Second),
+ Min: pointer.Of(10 * time.Second),
+ Max: pointer.Of(5 * time.Second),
},
"greater than",
},
{
"max-not-set",
&WaitConfig{
- Min: helper.TimeToPtr(10 * time.Second),
+ Min: pointer.Of(10 * time.Second),
},
"",
},
@@ -248,36 +248,36 @@ func TestWaitConfig_Merge(t *testing.T) {
"all-fields",
mockWaitConfig(),
&WaitConfig{
- Min: helper.TimeToPtr(4 * time.Second),
- Max: helper.TimeToPtr(9 * time.Second),
+ Min: pointer.Of(4 * time.Second),
+ Max: pointer.Of(9 * time.Second),
},
&WaitConfig{
- Min: helper.TimeToPtr(4 * time.Second),
- Max: helper.TimeToPtr(9 * time.Second),
+ Min: pointer.Of(4 * time.Second),
+ Max: pointer.Of(9 * time.Second),
},
},
{
"min-only",
mockWaitConfig(),
&WaitConfig{
- Min: helper.TimeToPtr(4 * time.Second),
- Max: helper.TimeToPtr(10 * time.Second),
+ Min: pointer.Of(4 * time.Second),
+ Max: pointer.Of(10 * time.Second),
},
&WaitConfig{
- Min: helper.TimeToPtr(4 * time.Second),
- Max: helper.TimeToPtr(10 * time.Second),
+ Min: pointer.Of(4 * time.Second),
+ Max: pointer.Of(10 * time.Second),
},
},
{
"max-only",
mockWaitConfig(),
&WaitConfig{
- Min: helper.TimeToPtr(5 * time.Second),
- Max: helper.TimeToPtr(9 * time.Second),
+ Min: pointer.Of(5 * time.Second),
+ Max: pointer.Of(9 * time.Second),
},
&WaitConfig{
- Min: helper.TimeToPtr(5 * time.Second),
- Max: helper.TimeToPtr(9 * time.Second),
+ Min: pointer.Of(5 * time.Second),
+ Max: pointer.Of(9 * time.Second),
},
},
}
@@ -298,14 +298,14 @@ func TestWaitConfig_ToConsulTemplate(t *testing.T) {
ci.Parallel(t)
expected := config.WaitConfig{
- Enabled: helper.BoolToPtr(true),
- Min: helper.TimeToPtr(5 * time.Second),
- Max: helper.TimeToPtr(10 * time.Second),
+ Enabled: pointer.Of(true),
+ Min: pointer.Of(5 * time.Second),
+ Max: pointer.Of(10 * time.Second),
}
clientWaitConfig := &WaitConfig{
- Min: helper.TimeToPtr(5 * time.Second),
- Max: helper.TimeToPtr(10 * time.Second),
+ Min: pointer.Of(5 * time.Second),
+ Max: pointer.Of(10 * time.Second),
}
actual, err := clientWaitConfig.ToConsulTemplate()
@@ -316,10 +316,10 @@ func TestWaitConfig_ToConsulTemplate(t *testing.T) {
func mockRetryConfig() *RetryConfig {
return &RetryConfig{
- Attempts: helper.IntToPtr(5),
- Backoff: helper.TimeToPtr(5 * time.Second),
+ Attempts: pointer.Of(5),
+ Backoff: pointer.Of(5 * time.Second),
BackoffHCL: "5s",
- MaxBackoff: helper.TimeToPtr(10 * time.Second),
+ MaxBackoff: pointer.Of(10 * time.Second),
MaxBackoffHCL: "10s",
}
}
@@ -335,29 +335,29 @@ func TestRetryConfig_Copy(t *testing.T) {
"fully-populated",
mockRetryConfig(),
&RetryConfig{
- Attempts: helper.IntToPtr(5),
- Backoff: helper.TimeToPtr(5 * time.Second),
+ Attempts: pointer.Of(5),
+ Backoff: pointer.Of(5 * time.Second),
BackoffHCL: "5s",
- MaxBackoff: helper.TimeToPtr(10 * time.Second),
+ MaxBackoff: pointer.Of(10 * time.Second),
MaxBackoffHCL: "10s",
},
},
{
"attempts-only",
&RetryConfig{
- Attempts: helper.IntToPtr(5),
+ Attempts: pointer.Of(5),
},
&RetryConfig{
- Attempts: helper.IntToPtr(5),
+ Attempts: pointer.Of(5),
},
},
{
"backoff-only",
&RetryConfig{
- Backoff: helper.TimeToPtr(5 * time.Second),
+ Backoff: pointer.Of(5 * time.Second),
},
&RetryConfig{
- Backoff: helper.TimeToPtr(5 * time.Second),
+ Backoff: pointer.Of(5 * time.Second),
},
},
{
@@ -372,10 +372,10 @@ func TestRetryConfig_Copy(t *testing.T) {
{
"max-backoff-only",
&RetryConfig{
- MaxBackoff: helper.TimeToPtr(10 * time.Second),
+ MaxBackoff: pointer.Of(10 * time.Second),
},
&RetryConfig{
- MaxBackoff: helper.TimeToPtr(10 * time.Second),
+ MaxBackoff: pointer.Of(10 * time.Second),
},
},
{
@@ -421,7 +421,7 @@ func TestRetryConfig_IsEmpty(t *testing.T) {
{
"is-not-empty",
&RetryConfig{
- Attempts: helper.IntToPtr(12),
+ Attempts: pointer.Of(12),
},
false,
},
@@ -447,10 +447,10 @@ func TestRetryConfig_IsEqual(t *testing.T) {
"are-equal",
mockRetryConfig(),
&RetryConfig{
- Attempts: helper.IntToPtr(5),
- Backoff: helper.TimeToPtr(5 * time.Second),
+ Attempts: pointer.Of(5),
+ Backoff: pointer.Of(5 * time.Second),
BackoffHCL: "5s",
- MaxBackoff: helper.TimeToPtr(10 * time.Second),
+ MaxBackoff: pointer.Of(10 * time.Second),
MaxBackoffHCL: "10s",
},
true,
@@ -459,10 +459,10 @@ func TestRetryConfig_IsEqual(t *testing.T) {
"attempts-different",
mockRetryConfig(),
&RetryConfig{
- Attempts: helper.IntToPtr(4),
- Backoff: helper.TimeToPtr(5 * time.Second),
+ Attempts: pointer.Of(4),
+ Backoff: pointer.Of(5 * time.Second),
BackoffHCL: "5s",
- MaxBackoff: helper.TimeToPtr(10 * time.Second),
+ MaxBackoff: pointer.Of(10 * time.Second),
MaxBackoffHCL: "10s",
},
false,
@@ -471,10 +471,10 @@ func TestRetryConfig_IsEqual(t *testing.T) {
"backoff-different",
mockRetryConfig(),
&RetryConfig{
- Attempts: helper.IntToPtr(5),
- Backoff: helper.TimeToPtr(4 * time.Second),
+ Attempts: pointer.Of(5),
+ Backoff: pointer.Of(4 * time.Second),
BackoffHCL: "5s",
- MaxBackoff: helper.TimeToPtr(10 * time.Second),
+ MaxBackoff: pointer.Of(10 * time.Second),
MaxBackoffHCL: "10s",
},
false,
@@ -483,10 +483,10 @@ func TestRetryConfig_IsEqual(t *testing.T) {
"backoff-hcl-different",
mockRetryConfig(),
&RetryConfig{
- Attempts: helper.IntToPtr(5),
- Backoff: helper.TimeToPtr(5 * time.Second),
+ Attempts: pointer.Of(5),
+ Backoff: pointer.Of(5 * time.Second),
BackoffHCL: "4s",
- MaxBackoff: helper.TimeToPtr(10 * time.Second),
+ MaxBackoff: pointer.Of(10 * time.Second),
MaxBackoffHCL: "10s",
},
false,
@@ -495,10 +495,10 @@ func TestRetryConfig_IsEqual(t *testing.T) {
"max-backoff-different",
mockRetryConfig(),
&RetryConfig{
- Attempts: helper.IntToPtr(5),
- Backoff: helper.TimeToPtr(5 * time.Second),
+ Attempts: pointer.Of(5),
+ Backoff: pointer.Of(5 * time.Second),
BackoffHCL: "5s",
- MaxBackoff: helper.TimeToPtr(9 * time.Second),
+ MaxBackoff: pointer.Of(9 * time.Second),
MaxBackoffHCL: "10s",
},
false,
@@ -507,10 +507,10 @@ func TestRetryConfig_IsEqual(t *testing.T) {
"max-backoff-hcl-different",
mockRetryConfig(),
&RetryConfig{
- Attempts: helper.IntToPtr(5),
- Backoff: helper.TimeToPtr(5 * time.Second),
+ Attempts: pointer.Of(5),
+ Backoff: pointer.Of(5 * time.Second),
BackoffHCL: "5s",
- MaxBackoff: helper.TimeToPtr(10 * time.Second),
+ MaxBackoff: pointer.Of(10 * time.Second),
MaxBackoffHCL: "9s",
},
false,
@@ -535,8 +535,8 @@ func TestRetryConfig_IsValid(t *testing.T) {
{
"is-valid",
&RetryConfig{
- Backoff: helper.TimeToPtr(5 * time.Second),
- MaxBackoff: helper.TimeToPtr(10 * time.Second),
+ Backoff: pointer.Of(5 * time.Second),
+ MaxBackoff: pointer.Of(10 * time.Second),
},
"",
},
@@ -553,30 +553,30 @@ func TestRetryConfig_IsValid(t *testing.T) {
{
"backoff-greater-than-max-backoff",
&RetryConfig{
- Backoff: helper.TimeToPtr(10 * time.Second),
- MaxBackoff: helper.TimeToPtr(5 * time.Second),
+ Backoff: pointer.Of(10 * time.Second),
+ MaxBackoff: pointer.Of(5 * time.Second),
},
"greater than max_backoff",
},
{
"backoff-not-set",
&RetryConfig{
- MaxBackoff: helper.TimeToPtr(10 * time.Second),
+ MaxBackoff: pointer.Of(10 * time.Second),
},
"",
},
{
"max-backoff-not-set",
&RetryConfig{
- Backoff: helper.TimeToPtr(2 * time.Minute),
+ Backoff: pointer.Of(2 * time.Minute),
},
"greater than default",
},
{
"max-backoff-unbounded",
&RetryConfig{
- Backoff: helper.TimeToPtr(10 * time.Second),
- MaxBackoff: helper.TimeToPtr(0 * time.Second),
+ Backoff: pointer.Of(10 * time.Second),
+ MaxBackoff: pointer.Of(0 * time.Second),
},
"",
},
@@ -607,17 +607,17 @@ func TestRetryConfig_Merge(t *testing.T) {
"all-fields",
mockRetryConfig(),
&RetryConfig{
- Attempts: helper.IntToPtr(4),
- Backoff: helper.TimeToPtr(4 * time.Second),
+ Attempts: pointer.Of(4),
+ Backoff: pointer.Of(4 * time.Second),
BackoffHCL: "4s",
- MaxBackoff: helper.TimeToPtr(9 * time.Second),
+ MaxBackoff: pointer.Of(9 * time.Second),
MaxBackoffHCL: "9s",
},
&RetryConfig{
- Attempts: helper.IntToPtr(4),
- Backoff: helper.TimeToPtr(4 * time.Second),
+ Attempts: pointer.Of(4),
+ Backoff: pointer.Of(4 * time.Second),
BackoffHCL: "4s",
- MaxBackoff: helper.TimeToPtr(9 * time.Second),
+ MaxBackoff: pointer.Of(9 * time.Second),
MaxBackoffHCL: "9s",
},
},
@@ -625,17 +625,17 @@ func TestRetryConfig_Merge(t *testing.T) {
"attempts-only",
mockRetryConfig(),
&RetryConfig{
- Attempts: helper.IntToPtr(4),
- Backoff: helper.TimeToPtr(5 * time.Second),
+ Attempts: pointer.Of(4),
+ Backoff: pointer.Of(5 * time.Second),
BackoffHCL: "5s",
- MaxBackoff: helper.TimeToPtr(10 * time.Second),
+ MaxBackoff: pointer.Of(10 * time.Second),
MaxBackoffHCL: "10s",
},
&RetryConfig{
- Attempts: helper.IntToPtr(4),
- Backoff: helper.TimeToPtr(5 * time.Second),
+ Attempts: pointer.Of(4),
+ Backoff: pointer.Of(5 * time.Second),
BackoffHCL: "5s",
- MaxBackoff: helper.TimeToPtr(10 * time.Second),
+ MaxBackoff: pointer.Of(10 * time.Second),
MaxBackoffHCL: "10s",
},
},
@@ -643,17 +643,17 @@ func TestRetryConfig_Merge(t *testing.T) {
"multi-field",
mockRetryConfig(),
&RetryConfig{
- Attempts: helper.IntToPtr(5),
- Backoff: helper.TimeToPtr(4 * time.Second),
+ Attempts: pointer.Of(5),
+ Backoff: pointer.Of(4 * time.Second),
BackoffHCL: "4s",
- MaxBackoff: helper.TimeToPtr(9 * time.Second),
+ MaxBackoff: pointer.Of(9 * time.Second),
MaxBackoffHCL: "9s",
},
&RetryConfig{
- Attempts: helper.IntToPtr(5),
- Backoff: helper.TimeToPtr(4 * time.Second),
+ Attempts: pointer.Of(5),
+ Backoff: pointer.Of(4 * time.Second),
BackoffHCL: "4s",
- MaxBackoff: helper.TimeToPtr(9 * time.Second),
+ MaxBackoff: pointer.Of(9 * time.Second),
MaxBackoffHCL: "9s",
},
},
@@ -675,10 +675,10 @@ func TestRetryConfig_ToConsulTemplate(t *testing.T) {
ci.Parallel(t)
expected := config.RetryConfig{
- Enabled: helper.BoolToPtr(true),
- Attempts: helper.IntToPtr(5),
- Backoff: helper.TimeToPtr(5 * time.Second),
- MaxBackoff: helper.TimeToPtr(10 * time.Second),
+ Enabled: pointer.Of(true),
+ Attempts: pointer.Of(5),
+ Backoff: pointer.Of(5 * time.Second),
+ MaxBackoff: pointer.Of(10 * time.Second),
}
actual := mockRetryConfig()
diff --git a/client/config/testing.go b/client/config/testing.go
index 0204073fb57..51150504492 100644
--- a/client/config/testing.go
+++ b/client/config/testing.go
@@ -7,7 +7,7 @@ import (
"time"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/testlog"
"github.com/hashicorp/nomad/nomad/mock"
testing "github.com/mitchellh/go-testing-interface"
@@ -59,7 +59,7 @@ func TestClientConfig(t testing.T) (*Config, func()) {
// Helps make sure we are respecting configured parent
conf.CgroupParent = "testing.slice"
- conf.VaultConfig.Enabled = helper.BoolToPtr(false)
+ conf.VaultConfig.Enabled = pointer.Of(false)
conf.DevMode = true
// Loosen GC threshold
diff --git a/client/devicemanager/manager_test.go b/client/devicemanager/manager_test.go
index c3da419e204..337f5c79525 100644
--- a/client/devicemanager/manager_test.go
+++ b/client/devicemanager/manager_test.go
@@ -11,8 +11,8 @@ import (
plugin "github.com/hashicorp/go-plugin"
"github.com/hashicorp/nomad/ci"
"github.com/hashicorp/nomad/client/state"
- "github.com/hashicorp/nomad/helper"
"github.com/hashicorp/nomad/helper/pluginutils/loader"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/testlog"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/structs"
@@ -42,7 +42,7 @@ var (
},
Attributes: map[string]*psstructs.Attribute{
"memory": {
- Int: helper.Int64ToPtr(4),
+ Int: pointer.Of(int64(4)),
Unit: "GB",
},
},
@@ -61,7 +61,7 @@ var (
},
Attributes: map[string]*psstructs.Attribute{
"memory": {
- Int: helper.Int64ToPtr(2),
+ Int: pointer.Of(int64(2)),
Unit: "GB",
},
},
@@ -74,14 +74,14 @@ var (
InstanceStats: map[string]*device.DeviceStats{
nvidiaDevice0ID: {
Summary: &psstructs.StatValue{
- IntNumeratorVal: helper.Int64ToPtr(212),
+ IntNumeratorVal: pointer.Of(int64(212)),
Unit: "F",
Desc: "Temperature",
},
},
nvidiaDevice1ID: {
Summary: &psstructs.StatValue{
- IntNumeratorVal: helper.Int64ToPtr(218),
+ IntNumeratorVal: pointer.Of(int64(218)),
Unit: "F",
Desc: "Temperature",
},
@@ -96,7 +96,7 @@ var (
InstanceStats: map[string]*device.DeviceStats{
intelDeviceID: {
Summary: &psstructs.StatValue{
- IntNumeratorVal: helper.Int64ToPtr(220),
+ IntNumeratorVal: pointer.Of(int64(220)),
Unit: "F",
Desc: "Temperature",
},
diff --git a/client/driver_manager_test.go b/client/driver_manager_test.go
index 8a930b75eba..996b64ff1e6 100644
--- a/client/driver_manager_test.go
+++ b/client/driver_manager_test.go
@@ -22,10 +22,11 @@ func TestDriverManager_Fingerprint_Run(t *testing.T) {
testClient, cleanup := TestClient(t, nil)
defer cleanup()
+ conf := testClient.GetConfig()
dm := drivermanager.New(&drivermanager.Config{
Logger: testClient.logger,
- Loader: testClient.config.PluginSingletonLoader,
- PluginConfig: testClient.configCopy.NomadPluginConfig(),
+ Loader: conf.PluginSingletonLoader,
+ PluginConfig: conf.NomadPluginConfig(),
Updater: testClient.updateNodeFromDriver,
EventHandlerFactory: testClient.GetTaskEventHandler,
State: testClient.stateDB,
@@ -35,7 +36,7 @@ func TestDriverManager_Fingerprint_Run(t *testing.T) {
defer dm.Shutdown()
testutil.WaitForResult(func() (bool, error) {
- node := testClient.configCopy.Node
+ node := testClient.Node()
d, ok := node.Drivers["mock_driver"]
if !ok {
@@ -73,10 +74,11 @@ func TestDriverManager_Fingerprint_Periodic(t *testing.T) {
})
defer cleanup()
+ conf := testClient.GetConfig()
dm := drivermanager.New(&drivermanager.Config{
Logger: testClient.logger,
- Loader: testClient.config.PluginSingletonLoader,
- PluginConfig: testClient.configCopy.NomadPluginConfig(),
+ Loader: conf.PluginSingletonLoader,
+ PluginConfig: conf.NomadPluginConfig(),
Updater: testClient.updateNodeFromDriver,
EventHandlerFactory: testClient.GetTaskEventHandler,
State: testClient.stateDB,
@@ -134,10 +136,11 @@ func TestDriverManager_NodeAttributes_Run(t *testing.T) {
})
defer cleanup()
+ conf := testClient.GetConfig()
dm := drivermanager.New(&drivermanager.Config{
Logger: testClient.logger,
- Loader: testClient.config.PluginSingletonLoader,
- PluginConfig: testClient.configCopy.NomadPluginConfig(),
+ Loader: conf.PluginSingletonLoader,
+ PluginConfig: conf.NomadPluginConfig(),
Updater: testClient.updateNodeFromDriver,
EventHandlerFactory: testClient.GetTaskEventHandler,
State: testClient.stateDB,
diff --git a/client/dynamicplugins/registry.go b/client/dynamicplugins/registry.go
index 65f8c355cbc..3059c1a2763 100644
--- a/client/dynamicplugins/registry.go
+++ b/client/dynamicplugins/registry.go
@@ -98,7 +98,8 @@ type PluginInfo struct {
// PluginConnectionInfo is the data required to connect to the plugin.
// note: We currently only support Unix Domain Sockets, but this may be expanded
-// to support other connection modes in the future.
+//
+// to support other connection modes in the future.
type PluginConnectionInfo struct {
// SocketPath is the path to the plugins api socket.
SocketPath string
diff --git a/client/fingerprint/env_aws_cpu.go b/client/fingerprint/env_aws_cpu.go
index d27c80aa797..5678a1105f8 100644
--- a/client/fingerprint/env_aws_cpu.go
+++ b/client/fingerprint/env_aws_cpu.go
@@ -382,6 +382,7 @@ var instanceTypeCPU = map[string]CPU{
"m6id.metal": newCPU(128, 3.5),
"m6id.xlarge": newCPU(4, 3.5),
"mac1.metal": newCPU(12, 3.2),
+ "mac2.metal": newCPU(8, 3.2),
"p2.16xlarge": newCPU(64, 2.3),
"p2.8xlarge": newCPU(32, 2.7),
"p2.xlarge": newCPU(4, 2.7),
@@ -462,6 +463,17 @@ var instanceTypeCPU = map[string]CPU{
"r5n.large": newCPU(2, 3.1),
"r5n.metal": newCPU(96, 3.1),
"r5n.xlarge": newCPU(4, 3.1),
+ "r6a.12xlarge": newCPU(48, 3.6),
+ "r6a.16xlarge": newCPU(64, 3.6),
+ "r6a.24xlarge": newCPU(96, 3.6),
+ "r6a.2xlarge": newCPU(8, 3.6),
+ "r6a.32xlarge": newCPU(128, 3.6),
+ "r6a.48xlarge": newCPU(192, 3.6),
+ "r6a.4xlarge": newCPU(16, 3.6),
+ "r6a.8xlarge": newCPU(32, 3.6),
+ "r6a.large": newCPU(2, 3.6),
+ "r6a.metal": newCPU(192, 3.6),
+ "r6a.xlarge": newCPU(4, 3.6),
"r6g.12xlarge": newCPU(48, 2.5),
"r6g.16xlarge": newCPU(64, 2.5),
"r6g.2xlarge": newCPU(8, 2.5),
@@ -490,6 +502,16 @@ var instanceTypeCPU = map[string]CPU{
"r6i.large": newCPU(2, 3.5),
"r6i.metal": newCPU(128, 3.5),
"r6i.xlarge": newCPU(4, 3.5),
+ "r6id.12xlarge": newCPU(48, 3.5),
+ "r6id.16xlarge": newCPU(64, 3.5),
+ "r6id.24xlarge": newCPU(96, 3.5),
+ "r6id.2xlarge": newCPU(8, 3.5),
+ "r6id.32xlarge": newCPU(128, 3.5),
+ "r6id.4xlarge": newCPU(16, 3.5),
+ "r6id.8xlarge": newCPU(32, 3.5),
+ "r6id.large": newCPU(2, 3.5),
+ "r6id.metal": newCPU(128, 3.5),
+ "r6id.xlarge": newCPU(4, 3.5),
"t2.2xlarge": newCPU(8, 2.3),
"t2.large": newCPU(2, 2.3),
"t2.medium": newCPU(2, 2.3),
diff --git a/client/fs_endpoint.go b/client/fs_endpoint.go
index 2796c45c2b3..3d988520ac4 100644
--- a/client/fs_endpoint.go
+++ b/client/fs_endpoint.go
@@ -23,7 +23,7 @@ import (
"github.com/hashicorp/nomad/client/allocdir"
sframer "github.com/hashicorp/nomad/client/lib/streamframer"
cstructs "github.com/hashicorp/nomad/client/structs"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/nomad/structs"
)
@@ -166,32 +166,32 @@ func (f *FileSystem) stream(conn io.ReadWriteCloser) {
encoder := codec.NewEncoder(conn, structs.MsgpackHandle)
if err := decoder.Decode(&req); err != nil {
- handleStreamResultError(err, helper.Int64ToPtr(500), encoder)
+ handleStreamResultError(err, pointer.Of(int64(500)), encoder)
return
}
if req.AllocID == "" {
- handleStreamResultError(allocIDNotPresentErr, helper.Int64ToPtr(400), encoder)
+ handleStreamResultError(allocIDNotPresentErr, pointer.Of(int64(400)), encoder)
return
}
alloc, err := f.c.GetAlloc(req.AllocID)
if err != nil {
- handleStreamResultError(structs.NewErrUnknownAllocation(req.AllocID), helper.Int64ToPtr(404), encoder)
+ handleStreamResultError(structs.NewErrUnknownAllocation(req.AllocID), pointer.Of(int64(404)), encoder)
return
}
// Check read permissions
if aclObj, err := f.c.ResolveToken(req.QueryOptions.AuthToken); err != nil {
- handleStreamResultError(err, helper.Int64ToPtr(403), encoder)
+ handleStreamResultError(err, pointer.Of(int64(403)), encoder)
return
} else if aclObj != nil && !aclObj.AllowNsOp(alloc.Namespace, acl.NamespaceCapabilityReadFS) {
- handleStreamResultError(structs.ErrPermissionDenied, helper.Int64ToPtr(403), encoder)
+ handleStreamResultError(structs.ErrPermissionDenied, pointer.Of(int64(403)), encoder)
return
}
// Validate the arguments
if req.Path == "" {
- handleStreamResultError(pathNotPresentErr, helper.Int64ToPtr(400), encoder)
+ handleStreamResultError(pathNotPresentErr, pointer.Of(int64(400)), encoder)
return
}
switch req.Origin {
@@ -199,15 +199,15 @@ func (f *FileSystem) stream(conn io.ReadWriteCloser) {
case "":
req.Origin = "start"
default:
- handleStreamResultError(invalidOrigin, helper.Int64ToPtr(400), encoder)
+ handleStreamResultError(invalidOrigin, pointer.Of(int64(400)), encoder)
return
}
fs, err := f.c.GetAllocFS(req.AllocID)
if err != nil {
- code := helper.Int64ToPtr(500)
+ code := pointer.Of(int64(500))
if structs.IsErrUnknownAllocation(err) {
- code = helper.Int64ToPtr(404)
+ code = pointer.Of(int64(404))
}
handleStreamResultError(err, code, encoder)
@@ -217,13 +217,13 @@ func (f *FileSystem) stream(conn io.ReadWriteCloser) {
// Calculate the offset
fileInfo, err := fs.Stat(req.Path)
if err != nil {
- handleStreamResultError(err, helper.Int64ToPtr(400), encoder)
+ handleStreamResultError(err, pointer.Of(int64(400)), encoder)
return
}
if fileInfo.IsDir {
handleStreamResultError(
fmt.Errorf("file %q is a directory", req.Path),
- helper.Int64ToPtr(400), encoder)
+ pointer.Of(int64(400)), encoder)
return
}
@@ -325,7 +325,7 @@ OUTER:
}
if streamErr != nil {
- handleStreamResultError(streamErr, helper.Int64ToPtr(500), encoder)
+ handleStreamResultError(streamErr, pointer.Of(int64(500)), encoder)
return
}
}
@@ -341,17 +341,17 @@ func (f *FileSystem) logs(conn io.ReadWriteCloser) {
encoder := codec.NewEncoder(conn, structs.MsgpackHandle)
if err := decoder.Decode(&req); err != nil {
- handleStreamResultError(err, helper.Int64ToPtr(500), encoder)
+ handleStreamResultError(err, pointer.Of(int64(500)), encoder)
return
}
if req.AllocID == "" {
- handleStreamResultError(allocIDNotPresentErr, helper.Int64ToPtr(400), encoder)
+ handleStreamResultError(allocIDNotPresentErr, pointer.Of(int64(400)), encoder)
return
}
alloc, err := f.c.GetAlloc(req.AllocID)
if err != nil {
- handleStreamResultError(structs.NewErrUnknownAllocation(req.AllocID), helper.Int64ToPtr(404), encoder)
+ handleStreamResultError(structs.NewErrUnknownAllocation(req.AllocID), pointer.Of(int64(404)), encoder)
return
}
@@ -370,13 +370,13 @@ func (f *FileSystem) logs(conn io.ReadWriteCloser) {
// Validate the arguments
if req.Task == "" {
- handleStreamResultError(taskNotPresentErr, helper.Int64ToPtr(400), encoder)
+ handleStreamResultError(taskNotPresentErr, pointer.Of(int64(400)), encoder)
return
}
switch req.LogType {
case "stdout", "stderr":
default:
- handleStreamResultError(logTypeNotPresentErr, helper.Int64ToPtr(400), encoder)
+ handleStreamResultError(logTypeNotPresentErr, pointer.Of(int64(400)), encoder)
return
}
switch req.Origin {
@@ -384,15 +384,15 @@ func (f *FileSystem) logs(conn io.ReadWriteCloser) {
case "":
req.Origin = "start"
default:
- handleStreamResultError(invalidOrigin, helper.Int64ToPtr(400), encoder)
+ handleStreamResultError(invalidOrigin, pointer.Of(int64(400)), encoder)
return
}
fs, err := f.c.GetAllocFS(req.AllocID)
if err != nil {
- code := helper.Int64ToPtr(500)
+ code := pointer.Of(int64(500))
if structs.IsErrUnknownAllocation(err) {
- code = helper.Int64ToPtr(404)
+ code = pointer.Of(int64(404))
}
handleStreamResultError(err, code, encoder)
@@ -401,9 +401,9 @@ func (f *FileSystem) logs(conn io.ReadWriteCloser) {
allocState, err := f.c.GetAllocState(req.AllocID)
if err != nil {
- code := helper.Int64ToPtr(500)
+ code := pointer.Of(int64(500))
if structs.IsErrUnknownAllocation(err) {
- code = helper.Int64ToPtr(404)
+ code = pointer.Of(int64(404))
}
handleStreamResultError(err, code, encoder)
@@ -415,7 +415,7 @@ func (f *FileSystem) logs(conn io.ReadWriteCloser) {
if taskState == nil {
handleStreamResultError(
fmt.Errorf("unknown task name %q", req.Task),
- helper.Int64ToPtr(400),
+ pointer.Of(int64(400)),
encoder)
return
}
@@ -423,7 +423,7 @@ func (f *FileSystem) logs(conn io.ReadWriteCloser) {
if taskState.StartedAt.IsZero() {
handleStreamResultError(
fmt.Errorf("task %q not started yet. No logs available", req.Task),
- helper.Int64ToPtr(404),
+ pointer.Of(int64(404)),
encoder)
return
}
diff --git a/client/heartbeatstop.go b/client/heartbeatstop.go
index a3e57b10e1f..b75dea9c11b 100644
--- a/client/heartbeatstop.go
+++ b/client/heartbeatstop.go
@@ -70,7 +70,7 @@ func (h *heartbeatStop) shouldStopAfter(now time.Time, interval time.Duration) b
func (h *heartbeatStop) watch() {
// If we never manage to successfully contact the server, we want to stop our allocs
// after duration + start time
- h.lastOk = time.Now()
+ h.setLastOk(time.Now())
stop := make(chan string, 1)
var now time.Time
var interval time.Duration
diff --git a/client/lib/cgutil/cgutil_linux.go b/client/lib/cgutil/cgutil_linux.go
index 1333d0cc13b..b2cc9a4268c 100644
--- a/client/lib/cgutil/cgutil_linux.go
+++ b/client/lib/cgutil/cgutil_linux.go
@@ -78,9 +78,7 @@ func ConfigureBasicCgroups(config *lcc.Config) error {
if err = os.MkdirAll(path, 0755); err != nil {
return err
}
- config.Cgroups.Paths = map[string]string{
- subsystem: path,
- }
+ config.Cgroups.Path = path
return nil
}
diff --git a/client/lib/cgutil/cgutil_linux_test.go b/client/lib/cgutil/cgutil_linux_test.go
index ed3ae87bd85..2def4dcbae8 100644
--- a/client/lib/cgutil/cgutil_linux_test.go
+++ b/client/lib/cgutil/cgutil_linux_test.go
@@ -86,7 +86,7 @@ func TestUtil_GetCPUsFromCgroup(t *testing.T) {
}
func create(t *testing.T, name string) {
- mgr, err := fs2.NewManager(nil, filepath.Join(CgroupRoot, name), rootless)
+ mgr, err := fs2.NewManager(nil, filepath.Join(CgroupRoot, name))
require.NoError(t, err)
if err = mgr.Apply(CreationPID); err != nil {
_ = cgroups.RemovePath(name)
diff --git a/client/lib/cgutil/cpuset_manager_v1.go b/client/lib/cgutil/cpuset_manager_v1.go
index f0fa3252746..ce89cd2bfdf 100644
--- a/client/lib/cgutil/cpuset_manager_v1.go
+++ b/client/lib/cgutil/cpuset_manager_v1.go
@@ -298,21 +298,6 @@ func (c *cpusetManagerV1) signalReconcile() {
}
}
-func (c *cpusetManagerV1) getCpuset(group string) (cpuset.CPUSet, error) {
- man := fs.NewManager(
- &configs.Cgroup{
- Path: filepath.Join(c.cgroupParent, group),
- },
- map[string]string{"cpuset": filepath.Join(c.cgroupParentPath, group)},
- false,
- )
- stats, err := man.GetStats()
- if err != nil {
- return cpuset.CPUSet{}, err
- }
- return cpuset.New(stats.CPUSetStats.CPUs...), nil
-}
-
func (c *cpusetManagerV1) getCgroupPathsForTask(allocID, task string) (absolute, relative string) {
return filepath.Join(c.reservedCpusetPath(), fmt.Sprintf("%s-%s", allocID, task)),
filepath.Join(c.cgroupParent, ReservedCpusetCgroupName, fmt.Sprintf("%s-%s", allocID, task))
@@ -332,11 +317,25 @@ func getCPUsFromCgroupV1(group string) ([]uint16, error) {
return nil, err
}
- man := fs.NewManager(&configs.Cgroup{Path: group}, map[string]string{"cpuset": cgroupPath}, false)
+ cgroup := &configs.Cgroup{
+ Path: group,
+ Resources: new(configs.Resources),
+ }
+
+ paths := map[string]string{
+ "cpuset": cgroupPath,
+ }
+
+ man, err := fs.NewManager(cgroup, paths)
+ if err != nil {
+ return nil, err
+ }
+
stats, err := man.GetStats()
if err != nil {
return nil, err
}
+
return stats.CPUSetStats.CPUs, nil
}
diff --git a/client/lib/cgutil/cpuset_manager_v2.go b/client/lib/cgutil/cpuset_manager_v2.go
index 74a8a4f4f74..1dd5a92b0ab 100644
--- a/client/lib/cgutil/cpuset_manager_v2.go
+++ b/client/lib/cgutil/cpuset_manager_v2.go
@@ -31,10 +31,6 @@ const (
// in case for e.g. Nomad tasks should be further constrained by an externally
// configured systemd cgroup.
DefaultCgroupParentV2 = "nomad.slice"
-
- // rootless is (for now) always false; Nomad clients require root, so we
- // assume to not need to do the extra plumbing for rootless cgroups.
- rootless = false
)
// nothing is used for treating a map like a set with no values
@@ -145,7 +141,7 @@ func (c *cpusetManagerV2) CgroupPathFor(allocID, task string) CgroupPathGetter {
for {
path := c.pathOf(makeID(allocID, task))
- mgr, err := fs2.NewManager(nil, path, rootless)
+ mgr, err := fs2.NewManager(nil, path)
if err != nil {
return "", err
}
@@ -229,7 +225,7 @@ func (c *cpusetManagerV2) cleanup() {
}
}
-//pathOf returns the absolute path to a task with identity id.
+// pathOf returns the absolute path to a task with identity id.
func (c *cpusetManagerV2) pathOf(id identity) string {
return filepath.Join(c.parentAbs, makeScope(id))
}
@@ -239,7 +235,7 @@ func (c *cpusetManagerV2) pathOf(id identity) string {
// We avoid removing a cgroup if it still contains a PID, as the cpuset manager
// may be initially empty on a Nomad client restart.
func (c *cpusetManagerV2) remove(path string) {
- mgr, err := fs2.NewManager(nil, path, rootless)
+ mgr, err := fs2.NewManager(nil, path)
if err != nil {
c.logger.Warn("failed to create manager", "path", path, "err", err)
return
@@ -267,14 +263,16 @@ func (c *cpusetManagerV2) write(id identity, set cpuset.CPUSet) {
path := c.pathOf(id)
// make a manager for the cgroup
- m, err := fs2.NewManager(nil, path, rootless)
+ m, err := fs2.NewManager(new(configs.Cgroup), path)
if err != nil {
c.logger.Error("failed to manage cgroup", "path", path, "err", err)
+ return
}
// create the cgroup
if err = m.Apply(CreationPID); err != nil {
c.logger.Error("failed to apply cgroup", "path", path, "err", err)
+ return
}
// set the cpuset value for the cgroup
@@ -282,13 +280,14 @@ func (c *cpusetManagerV2) write(id identity, set cpuset.CPUSet) {
CpusetCpus: set.String(),
}); err != nil {
c.logger.Error("failed to set cgroup", "path", path, "err", err)
+ return
}
}
// ensureParentCgroup will create parent cgroup for the manager if it does not
// exist yet. No PIDs are added to any cgroup yet.
func (c *cpusetManagerV2) ensureParent() error {
- mgr, err := fs2.NewManager(nil, c.parentAbs, rootless)
+ mgr, err := fs2.NewManager(nil, c.parentAbs)
if err != nil {
return err
}
diff --git a/client/lib/cgutil/group_killer.go b/client/lib/cgutil/group_killer.go
index bcfefe632dd..9f966c49902 100644
--- a/client/lib/cgutil/group_killer.go
+++ b/client/lib/cgutil/group_killer.go
@@ -60,7 +60,7 @@ func (d *killer) v1(cgroup *configs.Cgroup) error {
}
// the actual path to our tasks freezer cgroup
- path := cgroup.Paths[freezer]
+ path := cgroup.Path
d.logger.Trace("killing processes", "cgroup_path", path, "cgroup_version", "v1", "executor_pid", d.pid)
@@ -109,7 +109,7 @@ func (d *killer) v2(cgroup *configs.Cgroup) error {
d.logger.Trace("killing processes", "cgroup_path", path, "cgroup_version", "v2", "executor_pid", d.pid, "existing_pids", existingPIDs)
- mgr, err := fs2.NewManager(cgroup, "", rootless)
+ mgr, err := fs2.NewManager(cgroup, "")
if err != nil {
return fmt.Errorf("failed to create v2 cgroup manager: %w", err)
}
@@ -117,7 +117,7 @@ func (d *killer) v2(cgroup *configs.Cgroup) error {
// move executor PID into the root init.scope so we can kill the task pids
// without killing the executor (which is the process running this code, doing
// the killing)
- init, err := fs2.NewManager(nil, filepath.Join(CgroupRoot, "init.scope"), rootless)
+ init, err := fs2.NewManager(nil, filepath.Join(CgroupRoot, "init.scope"))
if err != nil {
return fmt.Errorf("failed to create v2 init cgroup manager: %w", err)
}
diff --git a/client/lib/resources/containment_linux.go b/client/lib/resources/containment_linux.go
index 279e03e6c3a..4c878f7d7f3 100644
--- a/client/lib/resources/containment_linux.go
+++ b/client/lib/resources/containment_linux.go
@@ -36,7 +36,7 @@ func (c *containment) Apply(pid int) error {
// for v2 use manager to create and enter the cgroup
if cgutil.UseV2 {
- mgr, err := fs2.NewManager(c.cgroup, "", false)
+ mgr, err := fs2.NewManager(c.cgroup, "")
if err != nil {
return fmt.Errorf("failed to create v2 cgroup manager for containment: %w", err)
}
@@ -55,7 +55,7 @@ func (c *containment) Apply(pid int) error {
}
// for v1 a random cgroup was created already; just enter it
- if err := cgroups.EnterPid(c.cgroup.Paths, pid); err != nil {
+ if err := cgroups.EnterPid(map[string]string{"freezer": c.cgroup.Path}, pid); err != nil {
return fmt.Errorf("failed to add pid to v1 cgroup: %w", err)
}
@@ -89,7 +89,7 @@ func (c *containment) GetPIDs() PIDs {
if cgutil.UseV2 {
path = filepath.Join(cgutil.CgroupRoot, c.cgroup.Path)
} else {
- path = c.cgroup.Paths["freezer"]
+ path = c.cgroup.Path
}
// find the pids in the cgroup under containment
diff --git a/client/logmon/plugin.go b/client/logmon/plugin.go
index 5d97b751d10..a21777357cb 100644
--- a/client/logmon/plugin.go
+++ b/client/logmon/plugin.go
@@ -5,22 +5,27 @@ import (
"os"
"os/exec"
- hclog "github.com/hashicorp/go-hclog"
- plugin "github.com/hashicorp/go-plugin"
+ "github.com/hashicorp/go-hclog"
+ "github.com/hashicorp/go-plugin"
"github.com/hashicorp/nomad/client/logmon/proto"
"github.com/hashicorp/nomad/plugins/base"
"google.golang.org/grpc"
)
+var bin = getBin()
+
+func getBin() string {
+ b, err := os.Executable()
+ if err != nil {
+ panic(err)
+ }
+ return b
+}
+
// LaunchLogMon launches a new logmon or reattaches to an existing one.
// TODO: Integrate with base plugin loader
func LaunchLogMon(logger hclog.Logger, reattachConfig *plugin.ReattachConfig) (LogMon, *plugin.Client, error) {
logger = logger.Named("logmon")
- bin, err := os.Executable()
- if err != nil {
- return nil, nil, err
- }
-
conf := &plugin.ClientConfig{
HandshakeConfig: base.Handshake,
Plugins: map[string]plugin.Plugin{
diff --git a/client/node_updater.go b/client/node_updater.go
index 1be3e15d418..a2746cf189a 100644
--- a/client/node_updater.go
+++ b/client/node_updater.go
@@ -41,18 +41,20 @@ SEND_BATCH:
c.configLock.Lock()
defer c.configLock.Unlock()
+ newConfig := c.config.Copy()
+
// csi updates
var csiChanged bool
c.batchNodeUpdates.batchCSIUpdates(func(name string, info *structs.CSIInfo) {
- if c.updateNodeFromCSIControllerLocked(name, info) {
- if c.config.Node.CSIControllerPlugins[name].UpdateTime.IsZero() {
- c.config.Node.CSIControllerPlugins[name].UpdateTime = time.Now()
+ if c.updateNodeFromCSIControllerLocked(name, info, newConfig.Node) {
+ if newConfig.Node.CSIControllerPlugins[name].UpdateTime.IsZero() {
+ newConfig.Node.CSIControllerPlugins[name].UpdateTime = time.Now()
}
csiChanged = true
}
- if c.updateNodeFromCSINodeLocked(name, info) {
- if c.config.Node.CSINodePlugins[name].UpdateTime.IsZero() {
- c.config.Node.CSINodePlugins[name].UpdateTime = time.Now()
+ if c.updateNodeFromCSINodeLocked(name, info, newConfig.Node) {
+ if newConfig.Node.CSINodePlugins[name].UpdateTime.IsZero() {
+ newConfig.Node.CSINodePlugins[name].UpdateTime = time.Now()
}
csiChanged = true
}
@@ -61,10 +63,10 @@ SEND_BATCH:
// driver node updates
var driverChanged bool
c.batchNodeUpdates.batchDriverUpdates(func(driver string, info *structs.DriverInfo) {
- if c.updateNodeFromDriverLocked(driver, info) {
- c.config.Node.Drivers[driver] = info
- if c.config.Node.Drivers[driver].UpdateTime.IsZero() {
- c.config.Node.Drivers[driver].UpdateTime = time.Now()
+ if c.applyNodeUpdatesFromDriver(driver, info, newConfig.Node) {
+ newConfig.Node.Drivers[driver] = info
+ if newConfig.Node.Drivers[driver].UpdateTime.IsZero() {
+ newConfig.Node.Drivers[driver].UpdateTime = time.Now()
}
driverChanged = true
}
@@ -80,7 +82,8 @@ SEND_BATCH:
// only update the node if changes occurred
if driverChanged || devicesChanged || csiChanged {
- c.updateNodeLocked()
+ c.config = newConfig
+ c.updateNode()
}
close(c.fpInitialized)
@@ -92,24 +95,27 @@ func (c *Client) updateNodeFromCSI(name string, info *structs.CSIInfo) {
c.configLock.Lock()
defer c.configLock.Unlock()
+ newConfig := c.config.Copy()
+
changed := false
- if c.updateNodeFromCSIControllerLocked(name, info) {
- if c.config.Node.CSIControllerPlugins[name].UpdateTime.IsZero() {
- c.config.Node.CSIControllerPlugins[name].UpdateTime = time.Now()
+ if c.updateNodeFromCSIControllerLocked(name, info, newConfig.Node) {
+ if newConfig.Node.CSIControllerPlugins[name].UpdateTime.IsZero() {
+ newConfig.Node.CSIControllerPlugins[name].UpdateTime = time.Now()
}
changed = true
}
- if c.updateNodeFromCSINodeLocked(name, info) {
- if c.config.Node.CSINodePlugins[name].UpdateTime.IsZero() {
- c.config.Node.CSINodePlugins[name].UpdateTime = time.Now()
+ if c.updateNodeFromCSINodeLocked(name, info, newConfig.Node) {
+ if newConfig.Node.CSINodePlugins[name].UpdateTime.IsZero() {
+ newConfig.Node.CSINodePlugins[name].UpdateTime = time.Now()
}
changed = true
}
if changed {
- c.updateNodeLocked()
+ c.config = newConfig
+ c.updateNode()
}
}
@@ -119,7 +125,7 @@ func (c *Client) updateNodeFromCSI(name string, info *structs.CSIInfo) {
//
// It is safe to call for all CSI Updates, but will only perform changes when
// a ControllerInfo field is present.
-func (c *Client) updateNodeFromCSIControllerLocked(name string, info *structs.CSIInfo) bool {
+func (c *Client) updateNodeFromCSIControllerLocked(name string, info *structs.CSIInfo, node *structs.Node) bool {
var changed bool
if info.ControllerInfo == nil {
return false
@@ -127,15 +133,15 @@ func (c *Client) updateNodeFromCSIControllerLocked(name string, info *structs.CS
i := info.Copy()
i.NodeInfo = nil
- oldController, hadController := c.config.Node.CSIControllerPlugins[name]
+ oldController, hadController := node.CSIControllerPlugins[name]
if !hadController {
// If the controller info has not yet been set, do that here
changed = true
- c.config.Node.CSIControllerPlugins[name] = i
+ node.CSIControllerPlugins[name] = i
} else {
// The controller info has already been set, fix it up
if !oldController.Equal(i) {
- c.config.Node.CSIControllerPlugins[name] = i
+ node.CSIControllerPlugins[name] = i
changed = true
}
@@ -162,7 +168,7 @@ func (c *Client) updateNodeFromCSIControllerLocked(name string, info *structs.CS
//
// It is safe to call for all CSI Updates, but will only perform changes when
// a NodeInfo field is present.
-func (c *Client) updateNodeFromCSINodeLocked(name string, info *structs.CSIInfo) bool {
+func (c *Client) updateNodeFromCSINodeLocked(name string, info *structs.CSIInfo, node *structs.Node) bool {
var changed bool
if info.NodeInfo == nil {
return false
@@ -170,15 +176,15 @@ func (c *Client) updateNodeFromCSINodeLocked(name string, info *structs.CSIInfo)
i := info.Copy()
i.ControllerInfo = nil
- oldNode, hadNode := c.config.Node.CSINodePlugins[name]
+ oldNode, hadNode := node.CSINodePlugins[name]
if !hadNode {
// If the Node info has not yet been set, do that here
changed = true
- c.config.Node.CSINodePlugins[name] = i
+ node.CSINodePlugins[name] = i
} else {
// The node info has already been set, fix it up
if !oldNode.Equal(info) {
- c.config.Node.CSINodePlugins[name] = i
+ node.CSINodePlugins[name] = i
changed = true
}
@@ -205,30 +211,33 @@ func (c *Client) updateNodeFromDriver(name string, info *structs.DriverInfo) {
c.configLock.Lock()
defer c.configLock.Unlock()
- if c.updateNodeFromDriverLocked(name, info) {
- c.config.Node.Drivers[name] = info
- if c.config.Node.Drivers[name].UpdateTime.IsZero() {
- c.config.Node.Drivers[name].UpdateTime = time.Now()
+ newConfig := c.config.Copy()
+
+ if c.applyNodeUpdatesFromDriver(name, info, newConfig.Node) {
+ newConfig.Node.Drivers[name] = info
+ if newConfig.Node.Drivers[name].UpdateTime.IsZero() {
+ newConfig.Node.Drivers[name].UpdateTime = time.Now()
}
- c.updateNodeLocked()
+
+ c.config = newConfig
+ c.updateNode()
}
}
-// updateNodeFromDriverLocked makes the changes to the node from a driver update
-// but does not send the update to the server. c.configLock must be held before
-// calling this func
-func (c *Client) updateNodeFromDriverLocked(name string, info *structs.DriverInfo) bool {
+// applyNodeUpdatesFromDriver applies changes to the passed in node. true is
+// returned if the node has changed.
+func (c *Client) applyNodeUpdatesFromDriver(name string, info *structs.DriverInfo, node *structs.Node) bool {
var hasChanged bool
- hadDriver := c.config.Node.Drivers[name] != nil
+ hadDriver := node.Drivers[name] != nil
if !hadDriver {
// If the driver info has not yet been set, do that here
hasChanged = true
for attrName, newVal := range info.Attributes {
- c.config.Node.Attributes[attrName] = newVal
+ node.Attributes[attrName] = newVal
}
} else {
- oldVal := c.config.Node.Drivers[name]
+ oldVal := node.Drivers[name]
// The driver info has already been set, fix it up
if oldVal.Detected != info.Detected {
hasChanged = true
@@ -247,16 +256,16 @@ func (c *Client) updateNodeFromDriverLocked(name string, info *structs.DriverInf
}
for attrName, newVal := range info.Attributes {
- oldVal := c.config.Node.Drivers[name].Attributes[attrName]
+ oldVal := node.Drivers[name].Attributes[attrName]
if oldVal == newVal {
continue
}
hasChanged = true
if newVal == "" {
- delete(c.config.Node.Attributes, attrName)
+ delete(node.Attributes, attrName)
} else {
- c.config.Node.Attributes[attrName] = newVal
+ node.Attributes[attrName] = newVal
}
}
}
@@ -266,16 +275,14 @@ func (c *Client) updateNodeFromDriverLocked(name string, info *structs.DriverInf
// their attributes as DriverInfo
driverName := fmt.Sprintf("driver.%s", name)
if info.Detected {
- c.config.Node.Attributes[driverName] = "1"
+ node.Attributes[driverName] = "1"
} else {
- delete(c.config.Node.Attributes, driverName)
+ delete(node.Attributes, driverName)
}
return hasChanged
}
-// updateNodeFromFingerprint updates the node with the result of
-// fingerprinting the node from the diff that was created
func (c *Client) updateNodeFromDevices(devices []*structs.NodeDeviceResource) {
c.configLock.Lock()
defer c.configLock.Unlock()
@@ -284,7 +291,7 @@ func (c *Client) updateNodeFromDevices(devices []*structs.NodeDeviceResource) {
// dispatched task resources and not appropriate for expressing
// node available device resources
if c.updateNodeFromDevicesLocked(devices) {
- c.updateNodeLocked()
+ c.updateNode()
}
}
@@ -294,7 +301,9 @@ func (c *Client) updateNodeFromDevices(devices []*structs.NodeDeviceResource) {
func (c *Client) updateNodeFromDevicesLocked(devices []*structs.NodeDeviceResource) bool {
if !structs.DevicesEquals(c.config.Node.NodeResources.Devices, devices) {
c.logger.Debug("new devices detected", "devices", len(devices))
- c.config.Node.NodeResources.Devices = devices
+ newConfig := c.config.Copy()
+ newConfig.Node.NodeResources.Devices = devices
+ c.config = newConfig
return true
}
diff --git a/client/pluginmanager/csimanager/doc.go b/client/pluginmanager/csimanager/doc.go
index 42400a09241..298bf18bf7a 100644
--- a/client/pluginmanager/csimanager/doc.go
+++ b/client/pluginmanager/csimanager/doc.go
@@ -1,15 +1,16 @@
-/**
+/*
+*
csimanager manages locally running CSI Plugins on a Nomad host, and provides a
few different interfaces.
It provides:
-- a pluginmanager.PluginManager implementation that is used to fingerprint and
- heartbeat local node plugins
-- (TODO) a csimanager.AttachmentWaiter implementation that can be used to wait for an
- external CSIVolume to be attached to the node before returning
-- (TODO) a csimanager.NodeController implementation that is used to manage the node-local
- portions of the CSI specification, and encompassess volume staging/publishing
-- (TODO) a csimanager.VolumeChecker implementation that can be used by hooks to ensure
- their volumes are healthy(ish)
+ - a pluginmanager.PluginManager implementation that is used to fingerprint and
+ heartbeat local node plugins
+ - (TODO) a csimanager.AttachmentWaiter implementation that can be used to wait for an
+ external CSIVolume to be attached to the node before returning
+ - (TODO) a csimanager.NodeController implementation that is used to manage the node-local
+ portions of the CSI specification, and encompassess volume staging/publishing
+ - (TODO) a csimanager.VolumeChecker implementation that can be used by hooks to ensure
+ their volumes are healthy(ish)
*/
package csimanager
diff --git a/client/rpc.go b/client/rpc.go
index 7d1dfb6e40f..9bc439ad03d 100644
--- a/client/rpc.go
+++ b/client/rpc.go
@@ -47,9 +47,11 @@ func (c *Client) StreamingRpcHandler(method string) (structs.StreamingRpcHandler
// RPC is used to forward an RPC call to a nomad server, or fail if no servers.
func (c *Client) RPC(method string, args interface{}, reply interface{}) error {
+ conf := c.GetConfig()
+
// Invoke the RPCHandler if it exists
- if c.config.RPCHandler != nil {
- return c.config.RPCHandler.RPC(method, args, reply)
+ if conf.RPCHandler != nil {
+ return conf.RPCHandler.RPC(method, args, reply)
}
// We will try to automatically retry requests that fail due to things like server unavailability
@@ -60,7 +62,7 @@ func (c *Client) RPC(method string, args interface{}, reply interface{}) error {
// to the leader they may also allow for an RPCHoldTimeout while waiting for leader election.
// That's OK, we won't double up because we are using it here not as a sleep but
// as a hint to give up
- deadline = deadline.Add(c.config.RPCHoldTimeout)
+ deadline = deadline.Add(conf.RPCHoldTimeout)
// If its a blocking query, allow the time specified by the request
if info, ok := args.(structs.RPCInfo); ok {
@@ -109,7 +111,7 @@ TRY:
}
// Wait to avoid thundering herd
- timer, cancel := helper.NewSafeTimer(helper.RandomStagger(c.config.RPCHoldTimeout / structs.JitterFraction))
+ timer, cancel := helper.NewSafeTimer(helper.RandomStagger(conf.RPCHoldTimeout / structs.JitterFraction))
defer cancel()
select {
diff --git a/client/serviceregistration/checks/client.go b/client/serviceregistration/checks/client.go
index c26431436f4..caf823848f8 100644
--- a/client/serviceregistration/checks/client.go
+++ b/client/serviceregistration/checks/client.go
@@ -9,6 +9,7 @@ import (
"net/http"
"net/url"
"strconv"
+ "strings"
"time"
"github.com/hashicorp/go-cleanhttp"
@@ -162,6 +163,8 @@ func (c *checker) checkHTTP(ctx context.Context, qc *QueryContext, q *Query) *st
qr.Status = structs.CheckFailure
return qr
}
+ request.Header = q.Headers
+ request.Body = io.NopCloser(strings.NewReader(q.Body))
request = request.WithContext(ctx)
result, err := c.httpClient.Do(request)
diff --git a/client/serviceregistration/checks/client_test.go b/client/serviceregistration/checks/client_test.go
index 2f6cb7fb47f..2553bb9ce50 100644
--- a/client/serviceregistration/checks/client_test.go
+++ b/client/serviceregistration/checks/client_test.go
@@ -12,6 +12,7 @@ import (
"time"
"github.com/hashicorp/nomad/ci"
+ "github.com/hashicorp/nomad/helper"
"github.com/hashicorp/nomad/helper/freeport"
"github.com/hashicorp/nomad/helper/testlog"
"github.com/hashicorp/nomad/nomad/mock"
@@ -20,6 +21,13 @@ import (
"oss.indeed.com/go/libtime/libtimetest"
)
+func splitURL(u string) (string, string) {
+ // get the address and port for http server
+ tokens := strings.Split(u, ":")
+ addr, port := strings.TrimPrefix(tokens[1], "//"), tokens[2]
+ return addr, port
+}
+
func TestChecker_Do_HTTP(t *testing.T) {
ci.Parallel(t)
@@ -49,8 +57,7 @@ func TestChecker_Do_HTTP(t *testing.T) {
defer ts.Close()
// get the address and port for http server
- tokens := strings.Split(ts.URL, ":")
- addr, port := strings.TrimPrefix(tokens[1], "//"), tokens[2]
+ addr, port := splitURL(ts.URL)
// create a mock clock so we can assert time is set
now := time.Date(2022, 1, 2, 3, 4, 5, 6, time.UTC)
@@ -200,6 +207,119 @@ func bigResponse() (string, string) {
return s, s[:outputSizeLimit]
}
+func TestChecker_Do_HTTP_extras(t *testing.T) {
+ ci.Parallel(t)
+
+ // record the method, body, and headers of the request
+ var (
+ method string
+ body []byte
+ headers map[string][]string
+ )
+
+ ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ method = r.Method
+ body, _ = io.ReadAll(r.Body)
+ headers = helper.CopyMap(r.Header)
+ w.WriteHeader(http.StatusOK)
+ }))
+ defer ts.Close()
+
+ // get the address and port for http server
+ addr, port := splitURL(ts.URL)
+
+ // make headers from key-value pairs
+ makeHeaders := func(more ...[2]string) http.Header {
+ h := make(http.Header)
+ for _, extra := range more {
+ h.Set(extra[0], extra[1])
+ }
+ return h
+ }
+
+ encoding := [2]string{"Accept-Encoding", "gzip"}
+ agent := [2]string{"User-Agent", "Go-http-client/1.1"}
+
+ cases := []struct {
+ name string
+ method string
+ body string
+ headers map[string][]string
+ }{
+ {
+ name: "method GET",
+ method: "GET",
+ headers: makeHeaders(encoding, agent),
+ },
+ {
+ name: "method Get",
+ method: "Get",
+ headers: makeHeaders(encoding, agent),
+ },
+ {
+ name: "method HEAD",
+ method: "HEAD",
+ headers: makeHeaders(agent),
+ },
+ {
+ name: "extra headers",
+ method: "GET",
+ headers: makeHeaders(encoding, agent,
+ [2]string{"X-My-Header", "hello"},
+ [2]string{"Authorization", "Basic ZWxhc3RpYzpjaGFuZ2VtZQ=="},
+ ),
+ },
+ {
+ name: "with body",
+ method: "POST",
+ headers: makeHeaders(encoding, agent),
+ body: "some payload",
+ },
+ }
+
+ for _, tc := range cases {
+ qc := &QueryContext{
+ ID: "abc123",
+ CustomAddress: addr,
+ ServicePortLabel: port,
+ Networks: nil,
+ NetworkStatus: mock.NewNetworkStatus(addr),
+ Ports: nil,
+ Group: "group",
+ Task: "task",
+ Service: "service",
+ Check: "check",
+ }
+
+ q := &Query{
+ Mode: structs.Healthiness,
+ Type: "http",
+ Timeout: 1 * time.Second,
+ AddressMode: "auto",
+ PortLabel: port,
+ Protocol: "http",
+ Path: "/",
+ Method: tc.method,
+ Headers: tc.headers,
+ Body: tc.body,
+ }
+
+ t.Run(tc.name, func(t *testing.T) {
+ logger := testlog.HCLogger(t)
+ c := New(logger)
+ ctx := context.Background()
+ result := c.Do(ctx, qc, q)
+ must.Eq(t, http.StatusOK, result.StatusCode,
+ must.Sprintf("test.URL: %s", ts.URL),
+ must.Sprintf("headers: %v", tc.headers),
+ )
+ must.Eq(t, tc.method, method)
+ must.Eq(t, tc.body, string(body))
+ must.Eq(t, tc.headers, headers)
+ })
+ }
+}
+
func TestChecker_Do_TCP(t *testing.T) {
ci.Parallel(t)
@@ -311,7 +431,7 @@ func TestChecker_Do_TCP(t *testing.T) {
switch tc.tcpMode {
case "ok":
// simulate tcp server by listening
- go tcpServer(ctx, tc.tcpPort)
+ tcpServer(t, ctx, tc.tcpPort)
case "hang":
// simulate tcp hang by setting an already expired context
timeout, stop := context.WithDeadline(ctx, now.Add(-1*time.Second))
@@ -327,16 +447,25 @@ func TestChecker_Do_TCP(t *testing.T) {
}
}
-func tcpServer(ctx context.Context, port int) {
+// tcpServer will start a tcp listener that accepts connections and closes them.
+// The caller can close the listener by cancelling ctx.
+func tcpServer(t *testing.T, ctx context.Context, port int) {
var lc net.ListenConfig
- l, _ := lc.Listen(ctx, "tcp", net.JoinHostPort(
+ l, err := lc.Listen(ctx, "tcp", net.JoinHostPort(
"localhost", fmt.Sprintf("%d", port),
))
- defer func() {
+ must.NoError(t, err, must.Sprint("port", port))
+ t.Cleanup(func() {
_ = l.Close()
- }()
- con, _ := l.Accept()
- defer func() {
- _ = con.Close()
+ })
+
+ go func() {
+ // caller can stop us by cancelling ctx
+ for {
+ _, acceptErr := l.Accept()
+ if acceptErr != nil {
+ return
+ }
+ }
}()
}
diff --git a/client/serviceregistration/checks/result.go b/client/serviceregistration/checks/result.go
index 8ef5859ce70..5b4c359bf95 100644
--- a/client/serviceregistration/checks/result.go
+++ b/client/serviceregistration/checks/result.go
@@ -1,8 +1,10 @@
package checks
import (
+ "net/http"
"time"
+ "github.com/hashicorp/nomad/helper"
"github.com/hashicorp/nomad/nomad/structs"
)
@@ -18,9 +20,11 @@ func GetCheckQuery(c *structs.ServiceCheck) *Query {
Timeout: c.Timeout,
AddressMode: c.AddressMode,
PortLabel: c.PortLabel,
+ Protocol: protocol,
Path: c.Path,
Method: c.Method,
- Protocol: protocol,
+ Headers: helper.CopyMap(c.Header),
+ Body: c.Body,
}
}
@@ -35,9 +39,11 @@ type Query struct {
AddressMode string // host, driver, or alloc
PortLabel string // label or value
- Protocol string // http checks only (http or https)
- Path string // http checks only
- Method string // http checks only
+ Protocol string // http checks only (http or https)
+ Path string // http checks only
+ Method string // http checks only
+ Headers http.Header // http checks only
+ Body string // http checks only
}
// A QueryContext contains allocation and service parameters necessary for
diff --git a/client/state/08types.go b/client/state/08types.go
index a10d537f0af..b4cc54bf702 100644
--- a/client/state/08types.go
+++ b/client/state/08types.go
@@ -16,7 +16,6 @@ import (
// changed over the life-cycle of the alloc_runner in Nomad 0.8.
//
// https://github.com/hashicorp/nomad/blob/v0.8.6/client/alloc_runner.go#L146-L153
-//
type allocRunnerMutableState08 struct {
// AllocClientStatus does not need to be upgraded as it is computed
// from task states.
diff --git a/client/state/upgrade.go b/client/state/upgrade.go
index 31f8c3bef6d..b2a1394e114 100644
--- a/client/state/upgrade.go
+++ b/client/state/upgrade.go
@@ -82,15 +82,14 @@ func backupDB(bdb *bbolt.DB, dst string) error {
// UpgradeAllocs upgrades the boltdb schema. Example 0.8 schema:
//
-// * allocations
-// * 15d83e8a-74a2-b4da-3f17-ed5c12895ea8
-// * echo
-// - simple-all (342 bytes)
-// - alloc (2827 bytes)
-// - alloc-dir (166 bytes)
-// - immutable (15 bytes)
-// - mutable (1294 bytes)
-//
+// allocations
+// 15d83e8a-74a2-b4da-3f17-ed5c12895ea8
+// echo
+// simple-all (342 bytes)
+// alloc (2827 bytes)
+// alloc-dir (166 bytes)
+// immutable (15 bytes)
+// mutable (1294 bytes)
func UpgradeAllocs(logger hclog.Logger, tx *boltdd.Tx) error {
btx := tx.BoltTx()
allocationsBucket := btx.Bucket(allocationsBucketName)
diff --git a/client/taskenv/env.go b/client/taskenv/env.go
index d40b52ab95c..7fb6a27cc2e 100644
--- a/client/taskenv/env.go
+++ b/client/taskenv/env.go
@@ -903,7 +903,6 @@ func (b *Builder) SetDriverNetwork(n *drivers.DriverNetwork) *Builder {
// Handled by setAlloc -> otherPorts:
//
// Task: NOMAD_TASK_{IP,PORT,ADDR}__ # Always host values
-//
func buildNetworkEnv(envMap map[string]string, nets structs.Networks, driverNet *drivers.DriverNetwork) {
for _, n := range nets {
for _, p := range n.ReservedPorts {
diff --git a/client/taskenv/services_test.go b/client/taskenv/services_test.go
index eadf49c5055..525b6a84d34 100644
--- a/client/taskenv/services_test.go
+++ b/client/taskenv/services_test.go
@@ -5,7 +5,7 @@ import (
"time"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/nomad/structs"
"github.com/stretchr/testify/require"
)
@@ -282,17 +282,17 @@ func TestInterpolate_interpolateConnect(t *testing.T) {
}},
},
Meta: map[string]string{"${meta1}": "${meta2}"},
- KillTimeout: helper.TimeToPtr(1 * time.Second),
+ KillTimeout: pointer.Of(1 * time.Second),
LogConfig: &structs.LogConfig{
MaxFiles: 1,
MaxFileSizeMB: 2,
},
- ShutdownDelay: helper.TimeToPtr(2 * time.Second),
+ ShutdownDelay: pointer.Of(2 * time.Second),
KillSignal: "${signal1}",
},
Gateway: &structs.ConsulGateway{
Proxy: &structs.ConsulGatewayProxy{
- ConnectTimeout: helper.TimeToPtr(3 * time.Second),
+ ConnectTimeout: pointer.Of(3 * time.Second),
EnvoyGatewayBindTaggedAddresses: true,
EnvoyGatewayBindAddresses: map[string]*structs.ConsulGatewayBindAddress{
"${bind1}": {
@@ -390,17 +390,17 @@ func TestInterpolate_interpolateConnect(t *testing.T) {
}},
},
Meta: map[string]string{"_meta1": "_meta2"},
- KillTimeout: helper.TimeToPtr(1 * time.Second),
+ KillTimeout: pointer.Of(1 * time.Second),
LogConfig: &structs.LogConfig{
MaxFiles: 1,
MaxFileSizeMB: 2,
},
- ShutdownDelay: helper.TimeToPtr(2 * time.Second),
+ ShutdownDelay: pointer.Of(2 * time.Second),
KillSignal: "_signal1",
},
Gateway: &structs.ConsulGateway{
Proxy: &structs.ConsulGatewayProxy{
- ConnectTimeout: helper.TimeToPtr(3 * time.Second),
+ ConnectTimeout: pointer.Of(3 * time.Second),
EnvoyGatewayBindTaggedAddresses: true,
EnvoyGatewayBindAddresses: map[string]*structs.ConsulGatewayBindAddress{
"_bind1": {
diff --git a/client/testing.go b/client/testing.go
index 564f4273d1f..121b2b33c34 100644
--- a/client/testing.go
+++ b/client/testing.go
@@ -94,7 +94,6 @@ func TestRPCOnlyClient(t testing.T, srvAddr net.Addr, rpcs map[string]interface{
client := &Client{config: conf, logger: testlog.HCLogger(t)}
client.servers = servers.New(client.logger, client.shutdownCh, client)
- client.configCopy = client.config.Copy()
client.rpcServer = rpc.NewServer()
for name, rpc := range rpcs {
diff --git a/command/acl_bootstrap.go b/command/acl_bootstrap.go
index b1d07968b51..785d6cc1ee7 100644
--- a/command/acl_bootstrap.go
+++ b/command/acl_bootstrap.go
@@ -132,16 +132,33 @@ func (c *ACLBootstrapCommand) Run(args []string) int {
return 0
}
-// formatKVPolicy returns a K/V formatted policy
-func formatKVPolicy(policy *api.ACLPolicy) string {
+// formatACLPolicy returns formatted policy
+func formatACLPolicy(policy *api.ACLPolicy) string {
output := []string{
fmt.Sprintf("Name|%s", policy.Name),
fmt.Sprintf("Description|%s", policy.Description),
- fmt.Sprintf("Rules|%s", policy.Rules),
fmt.Sprintf("CreateIndex|%v", policy.CreateIndex),
fmt.Sprintf("ModifyIndex|%v", policy.ModifyIndex),
}
- return formatKV(output)
+
+ formattedOut := formatKV(output)
+
+ if policy.JobACL != nil {
+ output := []string{
+ fmt.Sprintf("Namespace|%v", policy.JobACL.Namespace),
+ fmt.Sprintf("JobID|%v", policy.JobACL.JobID),
+ fmt.Sprintf("Group|%v", policy.JobACL.Group),
+ fmt.Sprintf("Task|%v", policy.JobACL.Task),
+ }
+ formattedOut += "\n\n[bold]Associated Workload[reset]\n"
+ formattedOut += formatKV(output)
+ }
+
+ // these are potentially large blobs so leave till the end
+ formattedOut += "\n\n[bold]Rules[reset]\n\n"
+ formattedOut += policy.Rules
+
+ return formattedOut
}
// outputACLToken formats and outputs the ACL token via the UI in the correct
diff --git a/command/acl_bootstrap_test.go b/command/acl_bootstrap_test.go
index 58c24795623..d15d5b86d5c 100644
--- a/command/acl_bootstrap_test.go
+++ b/command/acl_bootstrap_test.go
@@ -1,7 +1,6 @@
package command
import (
- "io/ioutil"
"os"
"testing"
@@ -9,13 +8,12 @@ import (
"github.com/hashicorp/nomad/command/agent"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/mitchellh/cli"
- "github.com/stretchr/testify/assert"
+ "github.com/shoenig/test/must"
"github.com/stretchr/testify/require"
)
func TestACLBootstrapCommand(t *testing.T) {
ci.Parallel(t)
- assert := assert.New(t)
// create a acl-enabled server without bootstrapping the token
config := func(c *agent.Config) {
@@ -24,18 +22,18 @@ func TestACLBootstrapCommand(t *testing.T) {
}
srv, _, url := testServer(t, true, config)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
- assert.Nil(srv.RootToken)
+ must.Nil(t, srv.RootToken)
ui := cli.NewMockUi()
cmd := &ACLBootstrapCommand{Meta: Meta{Ui: ui, flagAddress: url}}
code := cmd.Run([]string{"-address=" + url})
- assert.Equal(0, code)
+ must.Zero(t, code)
out := ui.OutputWriter.String()
- assert.Contains(out, "Secret ID")
+ must.StrContains(t, out, "Secret ID")
require.Contains(t, out, "Expiry Time = ")
}
@@ -43,43 +41,41 @@ func TestACLBootstrapCommand(t *testing.T) {
// fail.
func TestACLBootstrapCommand_ExistingBootstrapToken(t *testing.T) {
ci.Parallel(t)
- assert := assert.New(t)
config := func(c *agent.Config) {
c.ACL.Enabled = true
}
srv, _, url := testServer(t, true, config)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
- assert.NotNil(srv.RootToken)
+ must.NotNil(t, srv.RootToken)
ui := cli.NewMockUi()
cmd := &ACLBootstrapCommand{Meta: Meta{Ui: ui, flagAddress: url}}
code := cmd.Run([]string{"-address=" + url})
- assert.Equal(1, code)
+ must.One(t, code)
out := ui.OutputWriter.String()
- assert.NotContains(out, "Secret ID")
+ must.StrNotContains(t, out, "Secret ID")
}
// Attempting to bootstrap a token on a non-ACL enabled server should fail.
func TestACLBootstrapCommand_NonACLServer(t *testing.T) {
ci.Parallel(t)
- assert := assert.New(t)
srv, _, url := testServer(t, true, nil)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
ui := cli.NewMockUi()
cmd := &ACLBootstrapCommand{Meta: Meta{Ui: ui, flagAddress: url}}
code := cmd.Run([]string{"-address=" + url})
- assert.Equal(1, code)
+ must.One(t, code)
out := ui.OutputWriter.String()
- assert.NotContains(out, "Secret ID")
+ must.StrNotContains(t, out, "Secret ID")
}
// Attempting to bootstrap the server with an operator provided token in a file should
@@ -96,27 +92,26 @@ func TestACLBootstrapCommand_WithOperatorFileBootstrapToken(t *testing.T) {
mockToken := mock.ACLToken()
// Create temp file
- f, err := ioutil.TempFile("", "nomad-token.token")
- assert.Nil(t, err)
- defer os.Remove(f.Name())
+ file, rm := getTempFile(t, "nomad-token.token")
+ t.Cleanup(rm)
// Write the token to the file
- err = ioutil.WriteFile(f.Name(), []byte(mockToken.SecretID), 0700)
- assert.Nil(t, err)
+ err := os.WriteFile(file, []byte(mockToken.SecretID), 0700)
+ must.NoError(t, err)
srv, _, url := testServer(t, true, config)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
- require.Nil(t, srv.RootToken)
+ must.Nil(t, srv.RootToken)
ui := cli.NewMockUi()
cmd := &ACLBootstrapCommand{Meta: Meta{Ui: ui, flagAddress: url}}
- code := cmd.Run([]string{"-address=" + url, f.Name()})
- assert.Equal(t, 0, code)
+ code := cmd.Run([]string{"-address=" + url, file})
+ must.Zero(t, code)
out := ui.OutputWriter.String()
- assert.Contains(t, out, mockToken.SecretID)
+ must.StrContains(t, out, mockToken.SecretID)
require.Contains(t, out, "Expiry Time = ")
}
@@ -135,25 +130,24 @@ func TestACLBootstrapCommand_WithBadOperatorFileBootstrapToken(t *testing.T) {
invalidToken := "invalid-token"
// Create temp file
- f, err := ioutil.TempFile("", "nomad-token.token")
- assert.Nil(t, err)
- defer os.Remove(f.Name())
+ file, cleanup := getTempFile(t, "nomad-token.token")
+ t.Cleanup(cleanup)
// Write the token to the file
- err = ioutil.WriteFile(f.Name(), []byte(invalidToken), 0700)
- assert.Nil(t, err)
+ err := os.WriteFile(file, []byte(invalidToken), 0700)
+ must.NoError(t, err)
srv, _, url := testServer(t, true, config)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
- assert.Nil(t, srv.RootToken)
+ must.Nil(t, srv.RootToken)
ui := cli.NewMockUi()
cmd := &ACLBootstrapCommand{Meta: Meta{Ui: ui, flagAddress: url}}
- code := cmd.Run([]string{"-address=" + url, f.Name()})
- assert.Equal(t, 1, code)
+ code := cmd.Run([]string{"-address=" + url, file})
+ must.One(t, code)
out := ui.OutputWriter.String()
- assert.NotContains(t, out, invalidToken)
+ must.StrNotContains(t, out, invalidToken)
}
diff --git a/command/acl_policy_apply.go b/command/acl_policy_apply.go
index 02c5ef45618..42726a8d76d 100644
--- a/command/acl_policy_apply.go
+++ b/command/acl_policy_apply.go
@@ -32,6 +32,21 @@ Apply Options:
-description
Specifies a human readable description for the policy.
+ -job
+ Attaches the policy to the specified job. Requires that -namespace is
+ also set.
+
+ -namespace
+ Attaches the policy to the specified namespace. Requires that -job is
+ also set.
+
+ -group
+ Attaches the policy to the specified task group. Requires that -namespace
+ and -job are also set.
+
+ -task
+ Attaches the policy to the specified task. Requires that -namespace, -job
+ and -group are also set.
`
return strings.TrimSpace(helpText)
}
@@ -53,9 +68,16 @@ func (c *ACLPolicyApplyCommand) Name() string { return "acl policy apply" }
func (c *ACLPolicyApplyCommand) Run(args []string) int {
var description string
+ var jobID, group, task string // namespace is included in default flagset
+
flags := c.Meta.FlagSet(c.Name(), FlagSetClient)
flags.Usage = func() { c.Ui.Output(c.Help()) }
flags.StringVar(&description, "description", "", "")
+
+ flags.StringVar(&jobID, "job", "", "attach policy to job")
+ flags.StringVar(&group, "group", "", "attach policy to group")
+ flags.StringVar(&task, "task", "", "attach policy to task")
+
if err := flags.Parse(args); err != nil {
return 1
}
@@ -89,12 +111,36 @@ func (c *ACLPolicyApplyCommand) Run(args []string) int {
}
}
+ f := flags.Lookup("namespace")
+ namespace := f.Value.String()
+
+ if jobID != "" && namespace == "" {
+ c.Ui.Error("-namespace is required if -job is set")
+ return 1
+ }
+ if group != "" && jobID == "" {
+ c.Ui.Error("-job is required if -group is set")
+ return 1
+ }
+ if task != "" && group == "" {
+ c.Ui.Error("-group is required if -task is set")
+ return 1
+ }
+
// Construct the policy
ap := &api.ACLPolicy{
Name: policyName,
Description: description,
Rules: string(rawPolicy),
}
+ if namespace != "" {
+ ap.JobACL = &api.JobACL{
+ Namespace: namespace,
+ JobID: jobID,
+ Group: group,
+ Task: task,
+ }
+ }
// Get the HTTP client
client, err := c.Meta.Client()
diff --git a/command/acl_policy_apply_test.go b/command/acl_policy_apply_test.go
index 076d0a55121..d69fe9d6051 100644
--- a/command/acl_policy_apply_test.go
+++ b/command/acl_policy_apply_test.go
@@ -1,31 +1,29 @@
package command
import (
- "io/ioutil"
"os"
- "strings"
"testing"
"github.com/hashicorp/nomad/ci"
"github.com/hashicorp/nomad/command/agent"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/mitchellh/cli"
- "github.com/stretchr/testify/assert"
+ "github.com/shoenig/test/must"
)
func TestACLPolicyApplyCommand(t *testing.T) {
ci.Parallel(t)
- assert := assert.New(t)
+
config := func(c *agent.Config) {
c.ACL.Enabled = true
}
srv, _, url := testServer(t, true, config)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
// Bootstrap an initial ACL token
token := srv.RootToken
- assert.NotNil(token, "failed to bootstrap ACL token")
+ must.NotNil(t, token)
ui := cli.NewMockUi()
cmd := &ACLPolicyApplyCommand{Meta: Meta{Ui: ui, flagAddress: url}}
@@ -34,25 +32,22 @@ func TestACLPolicyApplyCommand(t *testing.T) {
policy := mock.ACLPolicy()
// Get a file
- f, err := ioutil.TempFile("", "nomad-test")
- assert.Nil(err)
- defer os.Remove(f.Name())
+ file, rm := getTempFile(t, "nomad-test")
+ t.Cleanup(rm)
// Write the policy to the file
- err = ioutil.WriteFile(f.Name(), []byte(policy.Rules), 0700)
- assert.Nil(err)
+ err := os.WriteFile(file, []byte(policy.Rules), 0700)
+ must.NoError(t, err)
// Attempt to apply a policy without a valid management token
- code := cmd.Run([]string{"-address=" + url, "-token=foo", "test-policy", f.Name()})
- assert.Equal(1, code)
+ code := cmd.Run([]string{"-address=" + url, "-token=foo", "test-policy", file})
+ must.One(t, code)
// Apply a policy with a valid management token
- code = cmd.Run([]string{"-address=" + url, "-token=" + token.SecretID, "test-policy", f.Name()})
- assert.Equal(0, code)
+ code = cmd.Run([]string{"-address=" + url, "-token=" + token.SecretID, "test-policy", file})
+ must.Zero(t, code)
// Check the output
out := ui.OutputWriter.String()
- if !strings.Contains(out, "Successfully wrote") {
- t.Fatalf("bad: %v", out)
- }
+ must.StrContains(t, out, "Successfully wrote")
}
diff --git a/command/acl_policy_delete_test.go b/command/acl_policy_delete_test.go
index 2ca29382788..dc9f915d8a9 100644
--- a/command/acl_policy_delete_test.go
+++ b/command/acl_policy_delete_test.go
@@ -2,7 +2,6 @@ package command
import (
"fmt"
- "strings"
"testing"
"github.com/hashicorp/nomad/acl"
@@ -11,23 +10,23 @@ import (
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
"github.com/mitchellh/cli"
- "github.com/stretchr/testify/assert"
+ "github.com/shoenig/test/must"
)
func TestACLPolicyDeleteCommand(t *testing.T) {
ci.Parallel(t)
- assert := assert.New(t)
config := func(c *agent.Config) {
c.ACL.Enabled = true
}
srv, _, url := testServer(t, true, config)
+ defer stopTestAgent(srv)
+
state := srv.Agent.Server().State()
- defer srv.Shutdown()
// Bootstrap an initial ACL token
token := srv.RootToken
- assert.NotNil(token, "failed to bootstrap ACL token")
+ must.NotNil(t, token)
// Create a test ACLPolicy
policy := &structs.ACLPolicy{
@@ -35,7 +34,7 @@ func TestACLPolicyDeleteCommand(t *testing.T) {
Rules: acl.PolicyWrite,
}
policy.SetHash()
- assert.Nil(state.UpsertACLPolicies(structs.MsgTypeTestSetup, 1000, []*structs.ACLPolicy{policy}))
+ must.NoError(t, state.UpsertACLPolicies(structs.MsgTypeTestSetup, 1000, []*structs.ACLPolicy{policy}))
ui := cli.NewMockUi()
cmd := &ACLPolicyDeleteCommand{Meta: Meta{Ui: ui, flagAddress: url}}
@@ -43,15 +42,13 @@ func TestACLPolicyDeleteCommand(t *testing.T) {
// Delete the policy without a valid token fails
invalidToken := mock.ACLToken()
code := cmd.Run([]string{"-address=" + url, "-token=" + invalidToken.SecretID, policy.Name})
- assert.Equal(1, code)
+ must.One(t, code)
// Delete the policy with a valid management token
code = cmd.Run([]string{"-address=" + url, "-token=" + token.SecretID, policy.Name})
- assert.Equal(0, code)
+ must.Zero(t, code)
// Check the output
out := ui.OutputWriter.String()
- if !strings.Contains(out, fmt.Sprintf("Successfully deleted %s policy", policy.Name)) {
- t.Fatalf("bad: %v", out)
- }
+ must.StrContains(t, out, fmt.Sprintf("Successfully deleted %s policy", policy.Name))
}
diff --git a/command/acl_policy_info.go b/command/acl_policy_info.go
index beeae5f293f..4ddf320e58d 100644
--- a/command/acl_policy_info.go
+++ b/command/acl_policy_info.go
@@ -74,6 +74,6 @@ func (c *ACLPolicyInfoCommand) Run(args []string) int {
return 1
}
- c.Ui.Output(formatKVPolicy(policy))
+ c.Ui.Output(c.Colorize().Color(formatACLPolicy(policy)))
return 0
}
diff --git a/command/acl_policy_info_test.go b/command/acl_policy_info_test.go
index 828b4022b20..8d54dd8a379 100644
--- a/command/acl_policy_info_test.go
+++ b/command/acl_policy_info_test.go
@@ -1,7 +1,6 @@
package command
import (
- "strings"
"testing"
"github.com/hashicorp/nomad/ci"
@@ -9,23 +8,23 @@ import (
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
"github.com/mitchellh/cli"
- "github.com/stretchr/testify/assert"
+ "github.com/shoenig/test/must"
)
func TestACLPolicyInfoCommand(t *testing.T) {
ci.Parallel(t)
- assert := assert.New(t)
+
config := func(c *agent.Config) {
c.ACL.Enabled = true
}
srv, _, url := testServer(t, true, config)
state := srv.Agent.Server().State()
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
// Bootstrap an initial ACL token
token := srv.RootToken
- assert.NotNil(token, "failed to bootstrap ACL token")
+ must.NotNil(t, token)
// Create a test ACLPolicy
policy := &structs.ACLPolicy{
@@ -33,7 +32,7 @@ func TestACLPolicyInfoCommand(t *testing.T) {
Rules: "node { policy = \"read\" }",
}
policy.SetHash()
- assert.Nil(state.UpsertACLPolicies(structs.MsgTypeTestSetup, 1000, []*structs.ACLPolicy{policy}))
+ must.NoError(t, state.UpsertACLPolicies(structs.MsgTypeTestSetup, 1000, []*structs.ACLPolicy{policy}))
ui := cli.NewMockUi()
cmd := &ACLPolicyInfoCommand{Meta: Meta{Ui: ui, flagAddress: url}}
@@ -41,15 +40,13 @@ func TestACLPolicyInfoCommand(t *testing.T) {
// Attempt to apply a policy without a valid management token
invalidToken := mock.ACLToken()
code := cmd.Run([]string{"-address=" + url, "-token=" + invalidToken.SecretID, policy.Name})
- assert.Equal(1, code)
+ must.One(t, code)
// Apply a policy with a valid management token
code = cmd.Run([]string{"-address=" + url, "-token=" + token.SecretID, policy.Name})
- assert.Equal(0, code)
+ must.Zero(t, code)
// Check the output
out := ui.OutputWriter.String()
- if !strings.Contains(out, policy.Name) {
- t.Fatalf("bad: %v", out)
- }
+ must.StrContains(t, out, policy.Name)
}
diff --git a/command/acl_policy_list_test.go b/command/acl_policy_list_test.go
index ce3f2bcf7e5..e72749d2e21 100644
--- a/command/acl_policy_list_test.go
+++ b/command/acl_policy_list_test.go
@@ -1,7 +1,6 @@
package command
import (
- "strings"
"testing"
"github.com/hashicorp/nomad/acl"
@@ -10,23 +9,23 @@ import (
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
"github.com/mitchellh/cli"
- "github.com/stretchr/testify/assert"
+ "github.com/shoenig/test/must"
)
func TestACLPolicyListCommand(t *testing.T) {
ci.Parallel(t)
- assert := assert.New(t)
+
config := func(c *agent.Config) {
c.ACL.Enabled = true
}
srv, _, url := testServer(t, true, config)
state := srv.Agent.Server().State()
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
// Bootstrap an initial ACL token
token := srv.RootToken
- assert.NotNil(token, "failed to bootstrap ACL token")
+ must.NotNil(t, token)
// Create a test ACLPolicy
policy := &structs.ACLPolicy{
@@ -34,7 +33,7 @@ func TestACLPolicyListCommand(t *testing.T) {
Rules: acl.PolicyWrite,
}
policy.SetHash()
- assert.Nil(state.UpsertACLPolicies(structs.MsgTypeTestSetup, 1000, []*structs.ACLPolicy{policy}))
+ must.NoError(t, state.UpsertACLPolicies(structs.MsgTypeTestSetup, 1000, []*structs.ACLPolicy{policy}))
ui := cli.NewMockUi()
cmd := &ACLPolicyListCommand{Meta: Meta{Ui: ui, flagAddress: url}}
@@ -42,25 +41,20 @@ func TestACLPolicyListCommand(t *testing.T) {
// Attempt to list policies without a valid management token
invalidToken := mock.ACLToken()
code := cmd.Run([]string{"-address=" + url, "-token=" + invalidToken.SecretID})
- assert.Equal(1, code)
+ must.One(t, code)
// Apply a policy with a valid management token
code = cmd.Run([]string{"-address=" + url, "-token=" + token.SecretID})
- assert.Equal(0, code)
+ must.Zero(t, code)
// Check the output
out := ui.OutputWriter.String()
- if !strings.Contains(out, policy.Name) {
- t.Fatalf("bad: %v", out)
- }
+ must.StrContains(t, out, policy.Name)
// List json
- if code := cmd.Run([]string{"-address=" + url, "-token=" + token.SecretID, "-json"}); code != 0 {
- t.Fatalf("expected exit 0, got: %d; %v", code, ui.ErrorWriter.String())
- }
+ must.Zero(t, cmd.Run([]string{"-address=" + url, "-token=" + token.SecretID, "-json"}))
+
out = ui.OutputWriter.String()
- if !strings.Contains(out, "CreateIndex") {
- t.Fatalf("expected json output, got: %s", out)
- }
+ must.StrContains(t, out, "CreateIndex")
ui.OutputWriter.Reset()
}
diff --git a/command/acl_token_create_test.go b/command/acl_token_create_test.go
index b6b4223dafa..e5c656a70fc 100644
--- a/command/acl_token_create_test.go
+++ b/command/acl_token_create_test.go
@@ -7,6 +7,7 @@ import (
"github.com/hashicorp/nomad/ci"
"github.com/hashicorp/nomad/command/agent"
"github.com/mitchellh/cli"
+ "github.com/shoenig/test/must"
"github.com/stretchr/testify/require"
)
@@ -18,18 +19,18 @@ func TestACLTokenCreateCommand(t *testing.T) {
}
srv, _, url := testServer(t, true, config)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
// Bootstrap an initial ACL token
token := srv.RootToken
- require.NotNil(t, token, "failed to bootstrap ACL token")
+ must.NotNil(t, token)
ui := cli.NewMockUi()
cmd := &ACLTokenCreateCommand{Meta: Meta{Ui: ui, flagAddress: url}}
// Request to create a new token without providing a valid management token
code := cmd.Run([]string{"-address=" + url, "-token=foo", "-policy=foo", "-type=client"})
- require.Equal(t, 1, code)
+ must.One(t, code)
// Request to create a new token with a valid management token that does
// not have an expiry set.
diff --git a/command/acl_token_delete_test.go b/command/acl_token_delete_test.go
index 8da29208d8e..4c1a85e1a83 100644
--- a/command/acl_token_delete_test.go
+++ b/command/acl_token_delete_test.go
@@ -2,7 +2,6 @@ package command
import (
"fmt"
- "strings"
"testing"
"github.com/hashicorp/nomad/acl"
@@ -11,22 +10,22 @@ import (
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
"github.com/mitchellh/cli"
- "github.com/stretchr/testify/assert"
+ "github.com/shoenig/test/must"
)
func TestACLTokenDeleteCommand_ViaEnvVariable(t *testing.T) {
ci.Parallel(t)
- assert := assert.New(t)
+
config := func(c *agent.Config) {
c.ACL.Enabled = true
}
srv, _, url := testServer(t, true, config)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
// Bootstrap an initial ACL token
token := srv.RootToken
- assert.NotNil(token, "failed to bootstrap ACL token")
+ must.NotNil(t, token)
ui := cli.NewMockUi()
cmd := &ACLTokenDeleteCommand{Meta: Meta{Ui: ui, flagAddress: url}}
@@ -36,21 +35,19 @@ func TestACLTokenDeleteCommand_ViaEnvVariable(t *testing.T) {
mockToken := mock.ACLToken()
mockToken.Policies = []string{acl.PolicyWrite}
mockToken.SetHash()
- assert.Nil(state.UpsertACLTokens(structs.MsgTypeTestSetup, 1000, []*structs.ACLToken{mockToken}))
+ must.NoError(t, state.UpsertACLTokens(structs.MsgTypeTestSetup, 1000, []*structs.ACLToken{mockToken}))
// Attempt to delete a token without providing a valid token with delete
// permissions
code := cmd.Run([]string{"-address=" + url, "-token=foo", mockToken.AccessorID})
- assert.Equal(1, code)
+ must.One(t, code)
// Delete a token using a valid management token set via an environment
// variable
code = cmd.Run([]string{"-address=" + url, "-token=" + token.SecretID, mockToken.AccessorID})
- assert.Equal(0, code)
+ must.Zero(t, code)
// Check the output
out := ui.OutputWriter.String()
- if !strings.Contains(out, fmt.Sprintf("Token %s successfully deleted", mockToken.AccessorID)) {
- t.Fatalf("bad: %v", out)
- }
+ must.StrContains(t, out, fmt.Sprintf("Token %s successfully deleted", mockToken.AccessorID))
}
diff --git a/command/acl_token_info_test.go b/command/acl_token_info_test.go
index 23a6e15b95d..3725393a3cb 100644
--- a/command/acl_token_info_test.go
+++ b/command/acl_token_info_test.go
@@ -1,35 +1,29 @@
package command
import (
- "os"
- "strings"
"testing"
"github.com/hashicorp/nomad/acl"
- "github.com/hashicorp/nomad/ci"
"github.com/hashicorp/nomad/command/agent"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
"github.com/mitchellh/cli"
- "github.com/stretchr/testify/assert"
+ "github.com/shoenig/test/must"
)
func TestACLTokenInfoCommand_ViaEnvVar(t *testing.T) {
- ci.Parallel(t)
- defer os.Setenv("NOMAD_TOKEN", os.Getenv("NOMAD_TOKEN"))
-
- assert := assert.New(t)
config := func(c *agent.Config) {
c.ACL.Enabled = true
}
srv, _, url := testServer(t, true, config)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
+
state := srv.Agent.Server().State()
// Bootstrap an initial ACL token
token := srv.RootToken
- assert.NotNil(token, "failed to bootstrap ACL token")
+ must.NotNil(t, token)
ui := cli.NewMockUi()
cmd := &ACLTokenInfoCommand{Meta: Meta{Ui: ui, flagAddress: url}}
@@ -38,28 +32,26 @@ func TestACLTokenInfoCommand_ViaEnvVar(t *testing.T) {
mockToken := mock.ACLToken()
mockToken.Policies = []string{acl.PolicyWrite}
mockToken.SetHash()
- assert.Nil(state.UpsertACLTokens(structs.MsgTypeTestSetup, 1000, []*structs.ACLToken{mockToken}))
+ must.NoError(t, state.UpsertACLTokens(structs.MsgTypeTestSetup, 1000, []*structs.ACLToken{mockToken}))
// Attempt to fetch info on a token without providing a valid management
// token
invalidToken := mock.ACLToken()
- os.Setenv("NOMAD_TOKEN", invalidToken.SecretID)
+ t.Setenv("NOMAD_TOKEN", invalidToken.SecretID)
code := cmd.Run([]string{"-address=" + url, mockToken.AccessorID})
- assert.Equal(1, code)
+ must.One(t, code)
// Fetch info on a token with a valid management token
- os.Setenv("NOMAD_TOKEN", token.SecretID)
+ t.Setenv("NOMAD_TOKEN", token.SecretID)
code = cmd.Run([]string{"-address=" + url, mockToken.AccessorID})
- assert.Equal(0, code)
+ must.Zero(t, code)
// Fetch info on a token with a valid management token via a CLI option
- os.Setenv("NOMAD_TOKEN", "")
+ t.Setenv("NOMAD_TOKEN", "")
code = cmd.Run([]string{"-address=" + url, "-token=" + token.SecretID, mockToken.AccessorID})
- assert.Equal(0, code)
+ must.Zero(t, code)
// Check the output
out := ui.OutputWriter.String()
- if !strings.Contains(out, mockToken.AccessorID) {
- t.Fatalf("bad: %v", out)
- }
+ must.StrContains(t, out, mockToken.AccessorID)
}
diff --git a/command/acl_token_list_test.go b/command/acl_token_list_test.go
index 59622838bc8..8ea91674daf 100644
--- a/command/acl_token_list_test.go
+++ b/command/acl_token_list_test.go
@@ -1,7 +1,6 @@
package command
import (
- "strings"
"testing"
"github.com/hashicorp/nomad/acl"
@@ -10,29 +9,30 @@ import (
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
"github.com/mitchellh/cli"
- "github.com/stretchr/testify/assert"
+ "github.com/shoenig/test/must"
)
func TestACLTokenListCommand(t *testing.T) {
ci.Parallel(t)
- assert := assert.New(t)
+
config := func(c *agent.Config) {
c.ACL.Enabled = true
}
srv, _, url := testServer(t, true, config)
+ defer stopTestAgent(srv)
+
state := srv.Agent.Server().State()
- defer srv.Shutdown()
// Bootstrap an initial ACL token
token := srv.RootToken
- assert.NotNil(token, "failed to bootstrap ACL token")
+ must.NotNil(t, token)
// Create a valid token
mockToken := mock.ACLToken()
mockToken.Policies = []string{acl.PolicyWrite}
mockToken.SetHash()
- assert.Nil(state.UpsertACLTokens(structs.MsgTypeTestSetup, 1000, []*structs.ACLToken{mockToken}))
+ must.NoError(t, state.UpsertACLTokens(structs.MsgTypeTestSetup, 1000, []*structs.ACLToken{mockToken}))
ui := cli.NewMockUi()
cmd := &ACLTokenListCommand{Meta: Meta{Ui: ui, flagAddress: url}}
@@ -40,25 +40,20 @@ func TestACLTokenListCommand(t *testing.T) {
// Attempt to list tokens without a valid management token
invalidToken := mock.ACLToken()
code := cmd.Run([]string{"-address=" + url, "-token=" + invalidToken.SecretID})
- assert.Equal(1, code)
+ must.One(t, code)
// Apply a token with a valid management token
code = cmd.Run([]string{"-address=" + url, "-token=" + token.SecretID})
- assert.Equal(0, code)
+ must.Zero(t, code)
// Check the output
out := ui.OutputWriter.String()
- if !strings.Contains(out, mockToken.Name) {
- t.Fatalf("bad: %v", out)
- }
+ must.StrContains(t, out, mockToken.Name)
// List json
- if code := cmd.Run([]string{"-address=" + url, "-token=" + token.SecretID, "-json"}); code != 0 {
- t.Fatalf("expected exit 0, got: %d; %v", code, ui.ErrorWriter.String())
- }
+ must.Zero(t, cmd.Run([]string{"-address=" + url, "-token=" + token.SecretID, "-json"}))
+
out = ui.OutputWriter.String()
- if !strings.Contains(out, "CreateIndex") {
- t.Fatalf("expected json output, got: %s", out)
- }
+ must.StrContains(t, out, "CreateIndex")
ui.OutputWriter.Reset()
}
diff --git a/command/acl_token_self_test.go b/command/acl_token_self_test.go
index d907cd78118..e8eb494392f 100644
--- a/command/acl_token_self_test.go
+++ b/command/acl_token_self_test.go
@@ -1,35 +1,29 @@
package command
import (
- "os"
- "strings"
"testing"
"github.com/hashicorp/nomad/acl"
- "github.com/hashicorp/nomad/ci"
"github.com/hashicorp/nomad/command/agent"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
"github.com/mitchellh/cli"
- "github.com/stretchr/testify/assert"
+ "github.com/shoenig/test/must"
)
func TestACLTokenSelfCommand_ViaEnvVar(t *testing.T) {
- ci.Parallel(t)
- defer os.Setenv("NOMAD_TOKEN", os.Getenv("NOMAD_TOKEN"))
-
- assert := assert.New(t)
config := func(c *agent.Config) {
c.ACL.Enabled = true
}
srv, _, url := testServer(t, true, config)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
+
state := srv.Agent.Server().State()
// Bootstrap an initial ACL token
token := srv.RootToken
- assert.NotNil(token, "failed to bootstrap ACL token")
+ must.NotNil(t, token)
ui := cli.NewMockUi()
cmd := &ACLTokenSelfCommand{Meta: Meta{Ui: ui, flagAddress: url}}
@@ -38,23 +32,21 @@ func TestACLTokenSelfCommand_ViaEnvVar(t *testing.T) {
mockToken := mock.ACLToken()
mockToken.Policies = []string{acl.PolicyWrite}
mockToken.SetHash()
- assert.Nil(state.UpsertACLTokens(structs.MsgTypeTestSetup, 1000, []*structs.ACLToken{mockToken}))
+ must.NoError(t, state.UpsertACLTokens(structs.MsgTypeTestSetup, 1000, []*structs.ACLToken{mockToken}))
// Attempt to fetch info on a token without providing a valid management
// token
invalidToken := mock.ACLToken()
- os.Setenv("NOMAD_TOKEN", invalidToken.SecretID)
+ t.Setenv("NOMAD_TOKEN", invalidToken.SecretID)
code := cmd.Run([]string{"-address=" + url})
- assert.Equal(1, code)
+ must.One(t, code)
// Fetch info on a token with a valid token
- os.Setenv("NOMAD_TOKEN", mockToken.SecretID)
+ t.Setenv("NOMAD_TOKEN", mockToken.SecretID)
code = cmd.Run([]string{"-address=" + url})
- assert.Equal(0, code)
+ must.Zero(t, code)
// Check the output
out := ui.OutputWriter.String()
- if !strings.Contains(out, mockToken.AccessorID) {
- t.Fatalf("bad: %v", out)
- }
+ must.StrContains(t, out, mockToken.AccessorID)
}
diff --git a/command/acl_token_update_test.go b/command/acl_token_update_test.go
index e980022178b..7ad70c8d770 100644
--- a/command/acl_token_update_test.go
+++ b/command/acl_token_update_test.go
@@ -9,23 +9,22 @@ import (
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
"github.com/mitchellh/cli"
- "github.com/stretchr/testify/assert"
+ "github.com/shoenig/test/must"
)
func TestACLTokenUpdateCommand(t *testing.T) {
ci.Parallel(t)
- assert := assert.New(t)
config := func(c *agent.Config) {
c.ACL.Enabled = true
}
srv, _, url := testServer(t, true, config)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
// Bootstrap an initial ACL token
token := srv.RootToken
- assert.NotNil(token, "failed to bootstrap ACL token")
+ must.NotNil(t, token)
ui := cli.NewMockUi()
cmd := &ACLTokenUpdateCommand{Meta: Meta{Ui: ui, flagAddress: url}}
@@ -35,19 +34,19 @@ func TestACLTokenUpdateCommand(t *testing.T) {
mockToken := mock.ACLToken()
mockToken.Policies = []string{acl.PolicyWrite}
mockToken.SetHash()
- assert.Nil(state.UpsertACLTokens(structs.MsgTypeTestSetup, 1000, []*structs.ACLToken{mockToken}))
+ must.NoError(t, state.UpsertACLTokens(structs.MsgTypeTestSetup, 1000, []*structs.ACLToken{mockToken}))
// Request to update a new token without providing a valid management token
invalidToken := mock.ACLToken()
code := cmd.Run([]string{"--token=" + invalidToken.SecretID, "-address=" + url, "-name=bar", mockToken.AccessorID})
- assert.Equal(1, code)
+ must.One(t, code)
// Request to update a new token with a valid management token
code = cmd.Run([]string{"--token=" + token.SecretID, "-address=" + url, "-name=bar", mockToken.AccessorID})
- assert.Equal(0, code)
+ must.Zero(t, code)
// Check the output
out := ui.OutputWriter.String()
- assert.Contains(out, mockToken.AccessorID)
- assert.Contains(out, "bar")
+ must.StrContains(t, out, mockToken.AccessorID)
+ must.StrContains(t, out, "bar")
}
diff --git a/command/agent/agent.go b/command/agent/agent.go
index b001799e5e8..198be61223d 100644
--- a/command/agent/agent.go
+++ b/command/agent/agent.go
@@ -1163,15 +1163,17 @@ func (a *Agent) Reload(newConfig *Config) error {
a.configLock.Lock()
defer a.configLock.Unlock()
- updatedLogging := newConfig != nil && (newConfig.LogLevel != a.config.LogLevel)
+ current := a.config.Copy()
+
+ updatedLogging := newConfig != nil && (newConfig.LogLevel != current.LogLevel)
if newConfig == nil || newConfig.TLSConfig == nil && !updatedLogging {
return fmt.Errorf("cannot reload agent with nil configuration")
}
if updatedLogging {
- a.config.LogLevel = newConfig.LogLevel
- a.logger.SetLevel(log.LevelFromString(newConfig.LogLevel))
+ current.LogLevel = newConfig.LogLevel
+ a.logger.SetLevel(log.LevelFromString(current.LogLevel))
}
// Update eventer config
@@ -1191,10 +1193,10 @@ func (a *Agent) Reload(newConfig *Config) error {
// Completely reload the agent's TLS configuration (moving from non-TLS to
// TLS, or vice versa)
// This does not handle errors in loading the new TLS configuration
- a.config.TLSConfig = newConfig.TLSConfig.Copy()
+ current.TLSConfig = newConfig.TLSConfig.Copy()
}
- if !a.config.TLSConfig.IsEmpty() && !newConfig.TLSConfig.IsEmpty() {
+ if !current.TLSConfig.IsEmpty() && !newConfig.TLSConfig.IsEmpty() {
// This is just a TLS configuration reload, we don't need to refresh
// existing network connections
@@ -1203,26 +1205,31 @@ func (a *Agent) Reload(newConfig *Config) error {
// as this allows us to dynamically reload configurations not only
// on the Agent but on the Server and Client too (they are
// referencing the same keyloader).
- keyloader := a.config.TLSConfig.GetKeyLoader()
+ keyloader := current.TLSConfig.GetKeyLoader()
_, err := keyloader.LoadKeyPair(newConfig.TLSConfig.CertFile, newConfig.TLSConfig.KeyFile)
if err != nil {
return err
}
- a.config.TLSConfig = newConfig.TLSConfig
- a.config.TLSConfig.KeyLoader = keyloader
+
+ current.TLSConfig = newConfig.TLSConfig
+ current.TLSConfig.KeyLoader = keyloader
+ a.config = current
return nil
- } else if newConfig.TLSConfig.IsEmpty() && !a.config.TLSConfig.IsEmpty() {
+ } else if newConfig.TLSConfig.IsEmpty() && !current.TLSConfig.IsEmpty() {
a.logger.Warn("downgrading agent's existing TLS configuration to plaintext")
fullUpdateTLSConfig()
- } else if !newConfig.TLSConfig.IsEmpty() && a.config.TLSConfig.IsEmpty() {
+ } else if !newConfig.TLSConfig.IsEmpty() && current.TLSConfig.IsEmpty() {
a.logger.Info("upgrading from plaintext configuration to TLS")
fullUpdateTLSConfig()
}
+ // Set agent config to the updated config
+ a.config = current
return nil
}
-// GetConfig creates a locked reference to the agent's config
+// GetConfig returns the current agent configuration. The Config should *not*
+// be mutated directly. First call Config.Copy.
func (a *Agent) GetConfig() *Config {
a.configLock.Lock()
defer a.configLock.Unlock()
diff --git a/command/agent/agent_endpoint.go b/command/agent/agent_endpoint.go
index 4c407280280..baebe025280 100644
--- a/command/agent/agent_endpoint.go
+++ b/command/agent/agent_endpoint.go
@@ -23,7 +23,6 @@ import (
"github.com/hashicorp/nomad/nomad"
"github.com/hashicorp/nomad/nomad/structs"
"github.com/hashicorp/serf/serf"
- "github.com/mitchellh/copystructure"
)
type Member struct {
@@ -81,11 +80,8 @@ func (s *HTTPServer) AgentSelfRequest(resp http.ResponseWriter, req *http.Reques
Member: nomadMember(member),
Stats: s.agent.Stats(),
}
- if ac, err := copystructure.Copy(s.agent.config); err != nil {
- return nil, CodedError(500, err.Error())
- } else {
- self.Config = ac.(*Config)
- }
+
+ self.Config = s.agent.GetConfig().Copy()
if self.Config != nil && self.Config.Vault != nil && self.Config.Vault.Token != "" {
self.Config.Vault.Token = ""
diff --git a/command/agent/agent_endpoint_test.go b/command/agent/agent_endpoint_test.go
index 85bc61d446a..0572b84ac02 100644
--- a/command/agent/agent_endpoint_test.go
+++ b/command/agent/agent_endpoint_test.go
@@ -22,7 +22,7 @@ import (
"github.com/hashicorp/nomad/acl"
"github.com/hashicorp/nomad/api"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/pool"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
@@ -455,7 +455,7 @@ func TestHTTP_AgentMonitor(t *testing.T) {
func TestAgent_PprofRequest_Permissions(t *testing.T) {
ci.Parallel(t)
- trueP, falseP := helper.BoolToPtr(true), helper.BoolToPtr(false)
+ trueP, falseP := pointer.Of(true), pointer.Of(false)
cases := []struct {
acl *bool
debug *bool
@@ -463,7 +463,7 @@ func TestAgent_PprofRequest_Permissions(t *testing.T) {
}{
// manually set to false because test helpers
// enable to true by default
- // enableDebug: helper.BoolToPtr(false),
+ // enableDebug: pointer.Of(false),
{debug: nil, ok: false},
{debug: trueP, ok: true},
{debug: falseP, ok: false},
diff --git a/command/agent/agent_test.go b/command/agent/agent_test.go
index 0aaab64321f..56df743e1a0 100644
--- a/command/agent/agent_test.go
+++ b/command/agent/agent_test.go
@@ -15,7 +15,7 @@ import (
"github.com/hashicorp/nomad/ci"
cstructs "github.com/hashicorp/nomad/client/structs"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/testlog"
"github.com/hashicorp/nomad/nomad/structs"
"github.com/hashicorp/nomad/nomad/structs/config"
@@ -259,7 +259,7 @@ func TestAgent_ServerConfig_Limits_Error(t *testing.T) {
expectedErr: "rpc_handshake_timeout must be >= 0",
limits: config.Limits{
RPCHandshakeTimeout: "-5s",
- RPCMaxConnsPerClient: helper.IntToPtr(100),
+ RPCMaxConnsPerClient: pointer.Of(100),
},
},
{
@@ -267,7 +267,7 @@ func TestAgent_ServerConfig_Limits_Error(t *testing.T) {
expectedErr: "error parsing rpc_handshake_timeout",
limits: config.Limits{
RPCHandshakeTimeout: "s",
- RPCMaxConnsPerClient: helper.IntToPtr(100),
+ RPCMaxConnsPerClient: pointer.Of(100),
},
},
{
@@ -275,7 +275,7 @@ func TestAgent_ServerConfig_Limits_Error(t *testing.T) {
expectedErr: "error parsing rpc_handshake_timeout",
limits: config.Limits{
RPCHandshakeTimeout: "",
- RPCMaxConnsPerClient: helper.IntToPtr(100),
+ RPCMaxConnsPerClient: pointer.Of(100),
},
},
{
@@ -283,7 +283,7 @@ func TestAgent_ServerConfig_Limits_Error(t *testing.T) {
expectedErr: "rpc_max_conns_per_client must be > 25; found: -100",
limits: config.Limits{
RPCHandshakeTimeout: "5s",
- RPCMaxConnsPerClient: helper.IntToPtr(-100),
+ RPCMaxConnsPerClient: pointer.Of(-100),
},
},
{
@@ -291,7 +291,7 @@ func TestAgent_ServerConfig_Limits_Error(t *testing.T) {
expectedErr: "rpc_max_conns_per_client must be > 25; found: 20",
limits: config.Limits{
RPCHandshakeTimeout: "5s",
- RPCMaxConnsPerClient: helper.IntToPtr(config.LimitsNonStreamingConnsPerClient),
+ RPCMaxConnsPerClient: pointer.Of(config.LimitsNonStreamingConnsPerClient),
},
},
}
@@ -335,21 +335,21 @@ func TestAgent_ServerConfig_Limits_OK(t *testing.T) {
name: "Zeros are valid",
limits: config.Limits{
RPCHandshakeTimeout: "0s",
- RPCMaxConnsPerClient: helper.IntToPtr(0),
+ RPCMaxConnsPerClient: pointer.Of(0),
},
},
{
name: "Low limits are valid",
limits: config.Limits{
RPCHandshakeTimeout: "1ms",
- RPCMaxConnsPerClient: helper.IntToPtr(26),
+ RPCMaxConnsPerClient: pointer.Of(26),
},
},
{
name: "High limits are valid",
limits: config.Limits{
RPCHandshakeTimeout: "5h",
- RPCMaxConnsPerClient: helper.IntToPtr(100000),
+ RPCMaxConnsPerClient: pointer.Of(100000),
},
},
}
@@ -389,12 +389,12 @@ func TestAgent_ServerConfig_PlanRejectionTracker(t *testing.T) {
{
name: "valid config",
trackerConfig: &PlanRejectionTracker{
- Enabled: helper.BoolToPtr(true),
+ Enabled: pointer.Of(true),
NodeThreshold: 123,
NodeWindow: 17 * time.Minute,
},
expectedConfig: &PlanRejectionTracker{
- Enabled: helper.BoolToPtr(true),
+ Enabled: pointer.Of(true),
NodeThreshold: 123,
NodeWindow: 17 * time.Minute,
},
@@ -466,7 +466,7 @@ func TestAgent_ServerConfig_RaftMultiplier_Ok(t *testing.T) {
},
{
- multiplier: helper.IntToPtr(0),
+ multiplier: pointer.Of(0),
electionTimout: 1 * time.Second,
heartbeatTimeout: 1 * time.Second,
@@ -474,7 +474,7 @@ func TestAgent_ServerConfig_RaftMultiplier_Ok(t *testing.T) {
commitTimeout: 50 * time.Millisecond,
},
{
- multiplier: helper.IntToPtr(1),
+ multiplier: pointer.Of(1),
electionTimout: 1 * time.Second,
heartbeatTimeout: 1 * time.Second,
@@ -482,7 +482,7 @@ func TestAgent_ServerConfig_RaftMultiplier_Ok(t *testing.T) {
commitTimeout: 50 * time.Millisecond,
},
{
- multiplier: helper.IntToPtr(5),
+ multiplier: pointer.Of(5),
electionTimout: 5 * time.Second,
heartbeatTimeout: 5 * time.Second,
@@ -490,7 +490,7 @@ func TestAgent_ServerConfig_RaftMultiplier_Ok(t *testing.T) {
commitTimeout: 250 * time.Millisecond,
},
{
- multiplier: helper.IntToPtr(6),
+ multiplier: pointer.Of(6),
electionTimout: 6 * time.Second,
heartbeatTimeout: 6 * time.Second,
@@ -498,7 +498,7 @@ func TestAgent_ServerConfig_RaftMultiplier_Ok(t *testing.T) {
commitTimeout: 300 * time.Millisecond,
},
{
- multiplier: helper.IntToPtr(10),
+ multiplier: pointer.Of(10),
electionTimout: 10 * time.Second,
heartbeatTimeout: 10 * time.Second,
@@ -622,7 +622,7 @@ func TestAgent_ClientConfig(t *testing.T) {
// Test the default, and then custom setting of the client service
// discovery boolean.
require.True(t, c.NomadServiceDiscovery)
- conf.Client.NomadServiceDiscovery = helper.BoolToPtr(false)
+ conf.Client.NomadServiceDiscovery = pointer.Of(false)
c, err = a.clientConfig()
require.NoError(t, err)
require.False(t, c.NomadServiceDiscovery)
@@ -674,7 +674,7 @@ func TestAgent_HTTPCheck(t *testing.T) {
AdvertiseAddrs: &AdvertiseAddrs{HTTP: "advertise:4646"},
normalizedAddrs: &NormalizedAddrs{HTTP: []string{"normalized:4646"}},
Consul: &config.ConsulConfig{
- ChecksUseAdvertise: helper.BoolToPtr(false),
+ ChecksUseAdvertise: pointer.Of(false),
},
TLSConfig: &config.TLSConfig{EnableHTTP: false},
},
@@ -703,7 +703,7 @@ func TestAgent_HTTPCheck(t *testing.T) {
t.Run("Plain HTTP + ChecksUseAdvertise", func(t *testing.T) {
a := agent()
- a.config.Consul.ChecksUseAdvertise = helper.BoolToPtr(true)
+ a.config.Consul.ChecksUseAdvertise = pointer.Of(true)
check := a.agentHTTPCheck(false)
if check == nil {
t.Fatalf("expected non-nil check")
@@ -844,9 +844,9 @@ func TestServer_Reload_TLS_Shared_Keyloader(t *testing.T) {
}
assert.Nil(agent.Reload(newConfig))
- assert.Equal(agent.Config.TLSConfig.CertFile, newConfig.TLSConfig.CertFile)
- assert.Equal(agent.Config.TLSConfig.KeyFile, newConfig.TLSConfig.KeyFile)
- assert.Equal(agent.Config.TLSConfig.GetKeyLoader(), originalKeyloader)
+ assert.Equal(agent.Agent.config.TLSConfig.CertFile, newConfig.TLSConfig.CertFile)
+ assert.Equal(agent.Agent.config.TLSConfig.KeyFile, newConfig.TLSConfig.KeyFile)
+ assert.Equal(agent.Agent.config.TLSConfig.GetKeyLoader(), originalKeyloader)
// Assert is passed through on the server correctly
if assert.NotNil(agent.server.GetConfig().TLSConfig) {
@@ -1082,7 +1082,40 @@ func TestServer_Reload_TLS_DowngradeFromTLS(t *testing.T) {
err := agent.Reload(newConfig)
assert.Nil(err)
- assert.True(agentConfig.TLSConfig.IsEmpty())
+ assert.True(agent.config.TLSConfig.IsEmpty())
+}
+
+func TestServer_Reload_VaultConfig(t *testing.T) {
+ ci.Parallel(t)
+
+ agent := NewTestAgent(t, t.Name(), func(c *Config) {
+ c.Server.NumSchedulers = pointer.Of(0)
+ c.Vault = &config.VaultConfig{
+ Enabled: pointer.Of(true),
+ Token: "vault-token",
+ Namespace: "vault-namespace",
+ Addr: "https://vault.consul:8200",
+ }
+ })
+ defer agent.Shutdown()
+
+ newConfig := agent.GetConfig().Copy()
+ newConfig.Vault = &config.VaultConfig{
+ Enabled: pointer.Of(true),
+ Token: "vault-token",
+ Namespace: "another-namespace",
+ Addr: "https://vault.consul:8200",
+ }
+
+ sconf, err := convertServerConfig(newConfig)
+ must.NoError(t, err)
+ agent.finalizeServerConfig(sconf)
+
+ // TODO: the vault client isn't accessible here, and we don't actually
+ // overwrite the agent's server config on reload. We probably should? See
+ // tests in nomad/server_test.go for verification of this code path's
+ // behavior on the VaultClient
+ must.NoError(t, agent.server.Reload(sconf))
}
func TestServer_ShouldReload_ReturnFalseForNoChanges(t *testing.T) {
diff --git a/command/agent/alloc_endpoint.go b/command/agent/alloc_endpoint.go
index e7e1e1d092b..c043fe0240e 100644
--- a/command/agent/alloc_endpoint.go
+++ b/command/agent/alloc_endpoint.go
@@ -283,6 +283,7 @@ func (s *HTTPServer) allocRestart(allocID string, resp http.ResponseWriter, req
// Explicitly parse the body separately to disallow overriding AllocID in req Body.
var reqBody struct {
TaskName string
+ AllTasks bool
}
err := json.NewDecoder(req.Body).Decode(&reqBody)
if err != nil && err != io.EOF {
@@ -291,6 +292,9 @@ func (s *HTTPServer) allocRestart(allocID string, resp http.ResponseWriter, req
if reqBody.TaskName != "" {
args.TaskName = reqBody.TaskName
}
+ if reqBody.AllTasks {
+ args.AllTasks = reqBody.AllTasks
+ }
// Determine the handler to use
useLocalClient, useClientRPC, useServerRPC := s.rpcHandlerForAlloc(allocID)
diff --git a/command/agent/alloc_endpoint_test.go b/command/agent/alloc_endpoint_test.go
index cfae04dd991..f85cf296fb7 100644
--- a/command/agent/alloc_endpoint_test.go
+++ b/command/agent/alloc_endpoint_test.go
@@ -17,7 +17,7 @@ import (
"github.com/hashicorp/nomad/acl"
"github.com/hashicorp/nomad/ci"
"github.com/hashicorp/nomad/client/allocdir"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
@@ -724,7 +724,7 @@ func TestHTTP_AllocSnapshot_Atomic(t *testing.T) {
ci.Parallel(t)
httpTest(t, func(c *Config) {
// Disable the schedulers
- c.Server.NumSchedulers = helper.IntToPtr(0)
+ c.Server.NumSchedulers = pointer.Of(0)
}, func(s *TestAgent) {
// Create an alloc
state := s.server.State()
diff --git a/command/agent/bindata_assetfs.go b/command/agent/bindata_assetfs.go
index 4bff6d94501..1f804f18400 100644
--- a/command/agent/bindata_assetfs.go
+++ b/command/agent/bindata_assetfs.go
@@ -1,14 +1,14 @@
// Code generated by go-bindata.
// sources:
-// ui/dist/assets/chunk.143.1dbf1aabb9053887ddf7.js
-// ui/dist/assets/chunk.178.9068d2f119b2a5a281b5.js
+// ui/dist/assets/chunk.143.5522fd209ce9704412ef.js
+// ui/dist/assets/chunk.178.e64db8b78adc0145d64f.js
// ui/dist/assets/chunk.331.2bf16a8aab827bcd7550.js
// ui/dist/assets/chunk.401.018c1d72186cc4f1a80c.js
// ui/dist/assets/chunk.401.018c1d72186cc4f1a80c.js.LICENSE.txt
// ui/dist/assets/chunk.963.d2bf17539aee784129b8.js
// ui/dist/assets/chunk.963.d2bf17539aee784129b8.js.LICENSE.txt
// ui/dist/assets/nomad-ui-5e1f695edd3f904b7aa332b07823351b.css
-// ui/dist/assets/nomad-ui-d5e967105da9cad5ea23f87d55ec3360.js
+// ui/dist/assets/nomad-ui-b06790dbfc5c3ebfedc4382c3dbae114.js
// ui/dist/assets/vendor-194b1e0d68d11ef7a4bf334eb30ba74d.js
// ui/dist/assets/vendor-2178567ff7c98706522514fb07f7d3be.css
// ui/dist/crossdomain.xml
@@ -96,42 +96,42 @@ func (fi bindataFileInfo) Sys() interface{} {
return nil
}
-var _distAssetsChunk1431dbf1aabb9053887ddf7Js = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x5a\x5f\x73\xe3\x36\x92\x7f\xf7\xa7\xb0\xf1\xa0\x25\xca\x14\x2d\x92\xe2\xdf\x09\x3c\x97\x4b\xb2\x55\x57\xb5\x1b\xa7\x2a\xd9\x27\x9d\xca\x05\x93\x90\x45\x9b\x04\x15\x00\xf4\x8c\xc6\xd6\x7d\xf6\xab\x46\x83\x94\x26\x89\x9d\xf1\xcb\xa4\x7f\xcd\x06\xd0\xe8\xff\x50\xfc\xc4\xd5\xf9\xed\xad\xe8\xee\x84\xba\xe5\x83\xe9\x6f\x9b\x6e\xd7\x2b\x73\x7b\xfb\xc1\xf3\x28\xbb\x7e\x86\xef\xc2\x57\xbe\xf1\xb5\x2f\xfd\x9e\x3d\xa7\xd9\x62\x51\x7a\x96\x35\x7e\xd7\xec\x99\x04\x57\x7c\x43\xca\x7c\x19\x27\xbe\xa5\x83\x07\x7d\x02\x15\x29\x8b\x34\x8b\x91\x9e\xd7\x5f\x48\x99\x44\x45\x3a\x41\x2b\x7c\xc2\x79\xfc\x44\xca\x28\x4f\x92\x09\x5a\x81\x13\x4e\xbb\x27\x65\x96\x4f\xf2\xed\xde\x0a\x9c\x70\x3a\x4e\xca\x28\x5e\x14\x13\xc4\x1d\x8e\x1c\xcd\x49\x19\x2f\x8a\x6c\x82\x56\xe0\x84\x63\x24\x29\xb3\x2c\xca\x27\x88\x47\x4c\x1c\x0b\xa7\x4b\x7d\x21\x65\x1c\xe3\xe1\x78\x1b\x87\xee\x04\x29\xc3\x70\xb9\x40\xda\x7e\x99\xe0\x3d\x29\x97\x45\xe2\x68\xfb\x69\x82\x1d\x29\xd3\x62\x99\x21\x6d\x3f\x4d\x50\x92\x32\x4c\xc2\x04\xe9\xf9\x5d\x4d\xca\xe5\x22\x8d\x26\x88\xfb\x4c\x1c\x3c\x71\x94\xef\x49\x99\x67\x49\x8c\x34\x7a\x68\x84\x8a\x94\xf1\x32\x72\x34\xde\x60\x84\xb0\x61\x12\xe2\x75\x34\xee\xef\x60\xc5\x49\x99\xa5\x59\x84\x34\x1a\x68\x84\xf6\xa6\x71\x81\xb4\xbb\xb8\x83\x4f\xa4\x5c\x66\x61\x8c\x34\x6e\x38\xc2\x3d\x29\x93\x3c\x5a\x20\x8d\x61\xe1\x60\xcd\x49\xb9\x0c\xe3\x10\x69\x5c\x35\x42\x41\xca\x38\xc5\x50\xab\xc5\x9c\x1b\xab\x7c\x34\xc1\xf1\x3a\x23\xa7\xda\x92\x32\x8d\x96\xe9\x04\xd1\xc2\x13\x07\xe5\xc7\x0d\x9f\x48\x99\x2f\x96\x05\xd2\x68\x34\x07\x45\x4b\xca\x64\xb1\x48\x91\x46\x6d\x47\x28\xe7\x7c\x00\xc9\x13\xe8\xd6\x4e\x1c\xb0\x5e\x91\x9d\x40\x0c\xa9\x23\xe7\xfe\x0e\x5c\x99\x27\x13\x74\xce\x9d\x38\x8d\x80\xc0\x98\xe4\x1b\xe1\x42\xe5\xc8\xb1\x1a\xe6\xc5\x04\x9d\x92\x47\x8e\x24\x65\x12\x2f\x96\x13\x44\x81\x23\x47\x7e\x21\x65\xb4\xcc\xe3\x09\x62\x22\x1d\x39\xfa\x1e\xf2\x3c\x2d\x26\xe8\x32\xdf\x71\x7a\x52\x86\x59\x82\xbb\x61\xc8\x4d\x10\xe8\x65\x9e\x23\x3d\xaf\x21\x38\xe3\x3c\x9b\x20\xee\x73\xe4\x74\x9f\x49\x19\xa5\xc9\x11\xa2\x26\x47\xce\x00\xd6\x5b\x14\xc5\x04\xd1\x9e\x13\x07\x4f\x1f\x4f\x34\x70\xcd\xd0\xd1\xee\xd6\x0e\x0e\x90\xe7\x98\xbf\x62\x70\x69\x8f\x70\x03\x2e\x8b\xf1\xee\x1b\xe7\xaf\x11\x36\xa4\x0c\xe3\x3c\x42\x1a\xcf\x9a\x60\x4b\xca\xbc\x48\x0a\x07\xf0\x66\x23\xee\x49\x99\x25\x18\x6b\x1b\xbc\xf4\x04\x15\x29\xa3\x10\xa5\x94\x0d\x97\x24\xcf\xd3\x09\xba\xf4\x38\x72\xb6\xa4\x0c\x8b\x34\x9b\x20\x2a\x31\x71\xd0\x5e\x6e\xbf\x3d\xc4\x49\x81\x9a\xef\x5d\xd8\x20\xbc\xe7\xa4\xcc\xf3\x22\x44\x1a\x75\x1d\x61\x4d\xca\x22\x41\xf7\xdd\x63\xa9\x99\x60\x4b\xca\x30\x4f\x13\xa4\xf1\xe4\x11\xf6\xdd\xbc\x16\x4f\x60\xba\x65\xfe\x15\x07\x77\x38\x61\xb6\x1c\xca\x6e\x9e\x63\xf0\x8c\x1c\xa7\x83\x63\x0e\x50\x27\x8b\x1c\x69\x57\x36\x11\x6e\xa1\xd8\x46\x4b\x47\xa3\x0e\x23\x04\xef\x24\x8b\x05\xd2\xae\x2a\x3a\xa8\x48\xb9\xcc\xb1\x8e\x6f\xd1\x48\x13\x84\xb3\xf2\x74\x89\xb4\xfb\xe4\xe0\x7e\xce\xa1\x4a\x2f\xd2\xc5\x04\xd1\x8c\x8e\xd3\xd4\xa4\x4c\x8a\x65\x84\x34\xfa\x6a\x84\x70\xeb\x22\x0a\x91\x46\x23\x8c\xd0\x90\x32\xcd\x72\x47\x5b\x97\x16\x71\x96\x4f\xd0\x85\xdc\xc8\xc1\x13\x9d\xfc\x03\xf4\xbc\x0c\xfd\xfb\xe0\x1a\xde\x08\x9f\xa0\xbe\xa5\x8e\x76\xe5\x0e\xe1\x23\xd4\x70\x24\x30\xf8\x2c\xfd\x08\x81\x93\x44\x48\xbb\x38\x72\xb0\x23\x65\x9c\x60\x0b\x7b\xc4\x2b\x4f\x10\x5a\xe6\x32\xc3\x6d\x5d\xbf\x1c\x61\x6f\x1d\x1d\x22\x3d\xfa\x1d\xe1\x00\x7d\x14\xfb\xee\xe3\xe0\xda\xaa\x83\x10\xa5\x6e\x6f\x17\xa4\x88\x5a\xa8\x8c\x11\x5a\xb3\x75\x65\x71\x84\xbd\x4d\x8a\x02\xe9\x31\x47\x10\x1a\x88\xff\x38\x47\xda\xa5\x83\x83\x4f\x10\xca\xcb\x10\x69\x17\xd9\x08\x3b\xe8\x2e\x05\x76\xb5\xce\xf5\x86\x11\x36\xa4\xcc\xd3\x28\x45\x1a\xc3\x74\x84\x8f\xa4\x5c\xc6\x68\xb2\x0e\x2d\x38\xc1\x16\xee\x81\x41\xdf\xb5\xee\x5a\x0e\x4a\x70\x0c\xaa\xd4\x49\xe7\x27\x07\x15\x44\x33\x0e\x38\x9d\x72\xc1\xed\x20\x18\x7a\x81\x81\xde\xe9\x79\xb7\xb7\x25\x3e\x9c\xe0\x58\xf4\x1d\x07\x1d\x33\xca\x1b\x98\x9b\xc2\x25\xd2\x6e\x8c\x72\x70\x0f\xcd\x06\xab\x94\xdb\x64\x84\xf2\x8e\x94\x69\x1e\x2d\x91\x46\x3d\x47\x28\x6c\x42\x66\x48\x8f\xf9\x89\xb0\x05\x37\x85\x48\xce\x61\x34\x5a\xc6\xcb\x23\x74\x46\x1a\x39\xce\xab\x88\xa0\x2a\x84\x61\x84\x34\x1a\xda\xc1\xbe\x9a\xb7\xb2\x82\x81\x2b\x49\x8f\xd8\xcd\x60\xc8\xda\x71\xdb\xe7\x8a\x04\x2b\xb5\x85\xce\xc5\x8e\x03\x1e\xc9\xb1\x1c\xec\x9c\x47\x46\x08\xc3\x44\x86\xd4\x1c\xa6\xa4\xa2\xc0\x73\x2d\x74\xb9\x3b\x72\xf0\x54\x2b\xad\xa0\x9d\x45\x58\xc7\x95\xeb\x65\x23\x84\xc1\x20\x49\x43\xa4\xf1\x93\x83\xba\x86\xde\x8a\xe6\xd7\xb5\x6b\xb5\x0e\x0a\x48\x99\x0c\x49\x97\x40\x88\x1a\xf0\x26\x3a\x57\x37\xce\xb9\x0e\x3e\xda\xae\x96\x20\x3d\x36\x39\x84\x2d\xd4\x91\xa5\xa3\x5d\x59\x71\xf0\x77\xa8\xdd\xd8\x35\xf5\xef\xae\x94\x3b\x08\xb5\x32\xca\xf0\x5c\x35\xaf\xf6\xca\xc6\x72\x9a\x9e\x30\x5c\x40\x8f\x3c\xe7\x46\xb7\x06\x8e\x89\x70\xc8\xd5\xae\xf2\x8d\xf0\x09\x9e\x00\x98\x57\xfa\xc9\xbd\x08\x1c\x84\xe7\x80\xb3\x82\x7b\x0a\x20\x32\x9c\x94\x69\x88\x21\x62\xb0\x7c\x4d\x10\xa2\x2b\xc4\xfe\x6b\x5c\x68\x4d\xd0\x00\xc0\x11\xd6\xb8\xe6\x3f\xe1\x7b\x52\xc6\x4e\x25\x83\xb3\xcc\x04\xb7\xa4\x8c\xc3\x10\xb7\xc7\x4a\x3c\xc1\x47\x52\x46\x49\x94\x21\x8d\x2a\x8e\xb0\x9d\xef\xb6\x10\xae\x38\x52\x59\xe8\x02\x78\xe4\x6c\xed\x50\x14\x3a\x30\x0e\x49\x88\x15\x8c\x03\xd8\x62\x8d\x72\xd3\x81\x83\x5f\x5a\xdb\x6d\x42\x07\xc6\xee\xe3\x70\x07\xa6\xc5\xa9\xc5\x7c\x99\x3a\xeb\x12\x63\x66\xe4\xb8\x59\x6d\x62\x3a\x8f\xe0\xb2\xe1\x7e\x5e\x41\x45\x4f\x71\x2e\xb0\xd0\xcd\xf8\x8e\x03\xe1\x95\x3a\x61\x17\x5e\x23\x54\x30\xea\x66\x48\xba\xc1\x17\xd1\x17\x38\x30\x2a\x90\x1e\xd5\x0a\x17\xc9\x09\x63\x34\x8f\xe3\x39\x25\x71\xcd\x53\x63\x3b\x87\xa3\xc7\x46\x62\xe1\xe7\xf9\x4e\x8b\xc1\xce\x91\xd8\x82\x47\x86\x2b\xcc\x96\xb7\xef\x49\x99\x26\x91\xa3\xd1\x66\x0e\x7e\xd9\xda\xfb\x16\x09\xc6\xba\x85\xae\x4c\x4c\x9c\xed\x23\xc4\x76\x1c\x4f\xd0\x45\xfb\xc4\xe9\x7a\x52\xc6\x98\x7d\x16\x61\x98\x4c\x0c\xf3\x89\x94\x49\x96\x14\x13\x44\xab\x65\x49\x71\x38\xdb\x0c\xb2\x32\x4d\x2f\xcf\xa5\x27\xa8\x7d\x58\x2b\xd6\x7b\x82\x9e\x29\x61\x06\x25\xcf\x8d\xa7\xe8\x61\x12\x82\x2f\xcf\xcd\xc6\xbb\x30\x41\xef\x69\x5f\xd0\x71\x89\x14\x9f\xce\x7f\x52\xaa\x57\x1e\xf9\x81\x4b\xd9\x9b\xf3\x4d\x23\xeb\xf3\xae\xaf\x87\x56\x9c\xff\x83\x5c\x8a\x4b\xf2\x0f\x42\xcf\xcc\x56\xf5\x9f\xce\x55\x50\xf5\xb5\x60\xe4\xdf\x37\x3f\xfe\xe7\x5f\x3f\xdd\xfe\x7c\xf3\xdb\xed\x3f\x6f\xfe\xf3\xf3\x8f\xc4\x57\x07\x77\xae\x5e\x89\xf5\x41\x06\x8f\x62\xaf\xd9\x78\xbc\x47\x9f\xdd\xd7\x9b\xbb\x07\x51\x19\xfb\xd5\xd3\xf4\xe0\xcb\x40\x09\xdd\xb7\x4f\x82\xf5\xbe\x08\xc4\xe7\x5d\xaf\x8c\x66\xd2\x97\x41\x53\xb3\x34\x5b\x2c\x0e\x7e\x1e\x27\xf1\x1f\x7f\x42\xf0\xe5\xd9\x51\xda\xd3\xec\x56\xf0\xe6\xb6\xf6\x25\x12\xca\xff\xd4\xc8\xba\xff\x14\xd8\x1f\x2a\xbe\x1f\x4c\xff\x3f\xf6\x67\x8a\x1f\xf7\x92\x77\x4d\x75\x54\x4b\x4c\x7a\x85\x8c\x31\xae\xee\x87\x4e\x48\xa3\x83\x56\xc8\x7b\xb3\xfd\x28\x3d\x82\x1b\xef\xe5\x2d\xb9\x14\xb4\x3c\x61\x18\xcb\xf1\xbe\x57\x8a\xef\x83\x9d\xea\x4d\x6f\xf6\x3b\x11\xe8\xb6\xa9\x44\x50\xf1\xb6\xf5\xa6\xed\xfc\x90\xd2\xc3\x2b\x2a\xfd\xba\x97\x7f\xa9\xcf\x78\x92\xde\xcb\xea\xbd\x27\x69\x8f\x70\xa9\x85\x22\xfe\x6a\xed\x7b\x7f\xf6\x81\xf1\xd2\x38\x49\xe8\x81\x52\x10\xbd\xe3\x5a\xa4\xcb\xf9\x83\x7e\x5d\x7c\x59\x84\xc5\x28\x5e\x0d\xea\x49\xd4\x73\xae\x54\xff\xe9\x8d\x25\x45\xb4\xcc\xc6\x25\x75\xfc\xba\x5c\x94\xa6\x47\x31\xd8\x95\xef\x5f\x17\x4e\xf2\xf8\x2b\xe9\xcf\xcd\x1b\x1a\x24\x71\x12\x9e\x08\x6f\x7a\xd5\x71\xf3\xba\x78\x16\xa5\x27\x0a\xcf\x75\xc5\x5b\xf1\x86\xda\x71\x12\x9f\x4a\x8b\x56\x58\x99\xd7\x57\xc4\xe9\x22\x39\x5d\xb1\xe5\xbb\x37\xf6\x4f\x92\xfc\x54\x1b\xd3\x74\xe2\x6f\x6f\x10\x66\x79\x71\xba\x46\x71\xa9\x9b\xb7\x95\x8a\xd2\xf8\x78\x8d\x41\x71\xf8\xfe\x66\x24\x84\x93\x49\x6d\x1c\xcf\xb5\xe1\xea\x9e\x1b\x71\x55\xf5\xdd\xae\x97\x10\x83\x57\x10\xd6\xbc\x9d\xc3\x17\xec\x96\xaf\xee\x96\xc7\xd9\xe2\x5b\xf7\x7b\x73\xa3\x24\x49\x8b\x57\x36\xd2\x42\x3d\x35\x95\xd0\x57\xf3\x6f\xd8\x27\xcc\xc3\xc9\x49\x9b\xf6\x2d\x63\x2f\xb3\xc5\x64\x8a\xcd\x80\x23\xd6\xeb\xf7\xcc\xb2\xe5\x28\xdc\xe8\x79\xb3\x7b\x23\x33\xc3\x70\xf2\x48\xdb\xd7\x5c\x6f\x83\x46\x1a\xa1\xf4\xdf\xc5\x57\x14\x46\xd3\x19\xad\x1a\x6e\x3b\xfe\xc6\x29\x59\x76\xcc\x8d\xae\x87\xd2\xf1\x86\xf2\x51\x56\x7c\x2d\x6b\xc3\xf1\x4b\x2f\xdf\x88\xdf\x38\xca\xa2\x71\x91\xec\xe7\x15\xd7\x6f\x08\x67\x45\x38\xa9\xfe\xfb\x20\xd4\x7e\xae\x8d\x6a\xe4\xfd\x1b\x56\xca\xb2\x29\x3d\x8c\xf8\x6c\xe6\x42\x42\x5f\x52\xf3\xb6\x31\x6f\x65\x6d\x92\x4d\xc6\x35\x8d\x69\xc5\xdf\x28\x56\x2c\x92\xe9\x16\x9f\xb5\xe1\x6f\xed\xbd\x5c\xa4\xd3\xde\x9f\x8d\x50\xdd\x9c\xd7\x75\x2f\xe7\x9b\xe6\x0d\xdb\x46\x69\x81\xb6\x7d\xea\x9b\xfa\x5c\x9f\xb4\x1b\xbb\xc5\xab\x0b\x03\xe1\xc5\x71\x48\x03\xb3\x15\xd2\x33\x81\x09\xee\x1a\x59\x7b\xc6\x8f\xe2\x38\xf4\xa3\x98\xc2\x9e\xf4\xe0\x17\xcb\x22\x2a\x8f\xcd\xc5\x57\xf4\xd9\x75\x21\x6c\x93\x4c\x89\xdf\x87\x46\x09\xff\x94\x5b\xb3\x5a\x6c\x1a\x29\x0e\x7e\x18\x15\x51\x29\xd8\xf5\x33\x19\xb4\x38\x07\x9f\x54\x86\x9c\xf4\x5d\xb7\xda\x23\xff\x65\x73\xee\x8a\xef\x76\x6d\x53\xd9\x22\x42\xe8\xc1\x8f\x93\x6c\xf9\x9e\xe5\x53\xca\xdb\xc5\xd0\xf4\xdf\xb1\xb8\x16\x77\xc3\x3d\x2c\x2c\xe2\x65\xf8\xbe\x85\xda\xa8\x7e\xcf\xef\x5a\x01\xcb\xd3\x28\x7f\xd7\xb9\x5b\xd1\xee\x84\x82\x95\x59\x14\x16\xef\x59\xd9\xdb\x49\x08\x56\xe6\x59\xf6\xae\x33\xd5\x20\xdb\xbe\xdf\xd9\xa5\xef\xb4\xb1\xab\x86\xd6\x50\x51\x9a\xbe\x67\xa9\x11\xdd\xae\xe5\x46\xcc\x37\xbc\x32\xbd\xda\xdb\x3b\x2f\x93\x77\xee\xa1\xcd\xfc\x13\x6f\xa0\xa0\xd9\xf5\x45\xb1\xf8\xb6\xf5\xf7\x6d\xd3\x75\x7f\x0c\x92\x34\xfc\x56\xc3\x8d\xcb\x8d\xe2\xd5\x63\x23\xef\xaf\x76\xaa\xe9\x1a\xd3\x3c\x09\x7d\x55\xf1\x6a\x6b\x2d\x12\x47\xdf\xa8\x8d\xdd\x45\xd4\xf3\x8e\xef\xf4\x9c\xcb\x7a\xae\x85\x81\xfb\x1c\xfc\x86\x3d\x9f\x4c\xe6\xfc\x38\x99\x37\x2b\xb1\x3e\x6b\x36\x9e\x4d\xf4\xc5\x05\x63\x8a\xba\x64\x56\xe3\xfe\x67\x20\x69\xac\x24\x7b\x6e\xea\x52\xf8\x6d\xcf\x6b\x51\x97\x17\xa1\xef\x44\xca\xe7\xc3\x61\x9c\xef\xfb\x95\x58\xe3\xf8\x67\xc6\x1d\x7c\xe3\x1f\x69\x4e\x7d\x13\xe0\x0e\xec\x62\x71\xfc\x70\xe0\x41\x07\xc3\x36\x5b\xad\x7d\x1e\xdc\x30\xcf\xfd\xdf\x3a\x98\xad\xed\x03\x01\x55\xee\x59\x78\xb5\x38\xdb\xf4\xca\xab\xd8\xe2\x43\xf5\x9d\x70\x43\xf1\x87\xea\xf2\x92\x3e\x03\xff\x89\xab\x95\x5d\xb9\x66\x62\x55\xad\xfd\x06\x8e\x19\xd8\xe2\xc3\xf0\x9d\x19\x85\x87\xcb\x4b\xea\x5d\x84\x33\xf9\xf2\xd2\x5f\x33\x49\x67\xb3\xd3\x07\x00\x0f\x6e\x68\x20\x9e\x84\xda\x7b\x9e\x60\xd7\x3c\xb8\x59\x89\xb5\x67\x56\xc3\x9a\x52\xfa\xd1\x04\x1a\xea\x89\xf0\x86\xf9\xdc\x0f\x69\xe9\x35\xec\x22\xf4\xe5\x77\xfd\x6c\xe6\xf5\x4c\x52\x0a\xf6\x6c\xe8\xb3\x18\xe5\x2a\x2b\x67\xcd\xf8\xc0\xb4\x47\xcf\x26\x63\x3f\xcc\x66\x9e\x62\x0f\xf4\x30\x3e\x52\xd4\x41\x32\xf9\xf2\x82\x17\x84\x05\x15\x3b\x5e\xf0\x7a\x31\x9b\x89\x55\x35\x0f\xd7\xab\x68\x7d\x2d\x3f\x54\xf3\x39\x85\x1b\x32\x64\x9e\x59\xda\x5d\xfd\xe0\xf3\x40\x32\xe1\xde\x25\x8a\x89\xd9\x4c\x04\xb7\xb7\x42\xff\xdb\x3e\xa0\x3e\x7a\x94\x5d\x8b\xa0\x16\x1b\x3e\xb4\xa6\xb4\x68\x74\x20\x0f\x6a\x4f\xf9\xcf\xbc\x54\x07\xea\xab\x83\x6f\x98\xb3\xcd\xbd\x30\xbf\x8c\x63\xfe\xcd\xe6\xa3\x60\xd7\x7f\xf9\xc1\x13\x14\xa2\x15\x8e\xb3\xaf\x82\xdb\x5b\x9f\x07\xe6\xe4\x31\xe1\x6b\xfb\xe4\x0b\x67\x7a\x36\xf3\x04\x33\xdb\x46\x7b\x82\x52\x3f\x9f\xe9\x31\xf8\x04\xd8\x90\xb8\x52\xc4\x18\x6c\xdc\x6f\xce\xe1\x12\x76\xe9\x12\x96\x9e\xde\xe7\xab\x75\x61\x0a\x9f\xc9\x78\xe0\xc9\x7a\xdb\x98\x26\xd9\x03\x98\x46\x8e\xb7\xab\x94\xe0\x46\x78\x72\x68\x5b\x7a\xc6\x03\xe5\x49\x74\x59\x0f\xa9\xa3\x98\x7a\x79\x59\xc1\x37\xdf\x78\xcf\x07\xea\x1b\x6f\xb5\x86\x7f\x0d\x5d\x4f\xbe\x6a\x58\x64\xf5\xfa\xf0\x27\xc5\x9b\xd9\xec\xe2\xff\x54\xd0\xc8\x5a\x7c\xbe\x81\xe0\xf8\xd0\x30\xe3\x35\x94\x1e\x0d\x78\xf3\x49\xfe\xa2\xfa\x9d\x50\x66\xff\x33\xef\x84\xf6\x1a\x1a\x6c\x7a\xf5\x13\xaf\xb6\x9e\xa7\xd8\x75\xbf\x52\x6b\x66\xfd\xb4\x52\x6b\x3a\xbd\xa6\xfb\xd1\x87\xf8\xcd\x07\xe7\x49\xbf\xa7\xbe\x84\x08\xa8\x99\xed\xae\xec\x7a\x4c\x8c\x73\x73\xde\xc8\x73\x45\x79\xd0\x43\x7e\xd1\xd9\xec\x02\x48\x61\x49\xa7\x0c\xb6\xd9\x51\x19\xf8\xe6\x3f\x0b\x39\x74\x42\x41\x33\x2a\x2f\x16\xfe\xbd\x30\xa5\x5a\x99\xf5\x81\xc2\x21\x1b\xf6\x0c\xff\x11\x10\x6d\xbf\xa8\xbe\x6b\xb4\x08\x20\xfd\xbf\xce\xa8\x0d\x0d\x94\xa8\x87\x4a\x78\x9e\x87\x2f\x66\x60\xae\xcc\xda\x6a\xe8\x2b\x4a\xfd\xd5\x9a\x52\x9f\x07\x03\x6c\x44\xaa\xed\x20\x1f\x03\xfb\xcc\x0f\xa2\xbb\x4d\x98\xf2\x9c\xf3\xbb\x3c\xca\xee\xaa\x3a\x4b\x92\x85\x1d\x6c\x79\xd0\x35\xb2\xf9\x41\xeb\x7f\xda\x50\x07\x35\xfa\xf1\xca\xee\xf8\xe3\xc3\x74\xcb\xf5\x89\x91\xb1\x44\xd9\xb3\x35\x5c\x40\x32\xf2\x97\x7f\x40\x50\xc2\x29\x2d\xc3\x77\xbe\xdf\xbb\x6a\xa4\x57\x62\x4d\xe1\x9f\x60\x37\xe8\xad\xa7\xe8\x99\x68\xb5\xb0\xb9\xd6\xf8\xc3\x57\x05\xd5\xd0\xd1\xf6\x0f\xac\xee\x2b\xfb\x20\x06\x87\xff\xd4\x0a\xfb\x36\xfe\xef\xfd\x6f\xfc\x1e\x5c\xee\x11\x5d\xa9\x66\x67\x08\xf5\xb1\xb4\x3d\x7c\x55\xda\x60\x87\x96\x3d\xac\x2a\x5b\xaf\x5b\xd8\xe2\x7b\x63\x54\x73\x37\x18\x58\xaa\x2a\x42\x19\x13\x2f\x2f\x7f\xfc\x52\x73\xc3\xe7\x9f\xc4\xdd\x8e\x57\x8f\x20\x22\x2f\x0d\x7d\x6e\x58\x7b\x76\xa7\x04\x7f\x3c\x1c\x9a\x97\x17\x6f\x80\x12\xe9\x35\x47\xfd\x30\x19\x9c\x8a\x47\xc5\x68\x50\x6d\xb9\xd2\xc2\x30\x32\x98\xcd\x3c\x27\x7e\x13\xc0\xd0\xdd\x0f\x86\x85\xd1\x02\x6a\x4e\x35\x9b\x35\x81\xfe\x4a\x03\xd9\xcb\x4a\x10\xfb\x91\xfa\x7f\xfc\xf8\x95\x7a\x3e\x28\x07\x22\xaa\x62\x82\xfa\x60\x60\xb6\x52\x6b\x9b\x87\x35\x73\x71\xf3\xdc\x04\xbd\x14\x4a\xf5\x8a\x01\x05\xad\x84\xd9\xcc\xac\x5a\xc1\xd5\x6f\xa8\x8e\xd7\x61\xf6\x4a\xa6\x5d\x87\xab\x45\x2b\x8c\xb0\x3f\x03\xf9\x4d\xb0\xe3\x4a\x48\xf3\x73\x5f\x0b\xd0\xf7\x88\x02\x25\xba\xfe\x49\xfc\xb0\x6d\xda\xda\x6b\xa8\x2f\x67\x33\x79\xcc\x43\x28\x6b\x9e\xa1\x14\xe2\x75\xac\xd8\x9e\xa1\x07\xbf\x63\x5a\x98\xf1\xe8\x1a\xc7\x5e\xab\x13\x86\x81\xff\x0c\x11\x58\x12\x67\x2b\xe2\xe3\x23\xb4\x6c\x0e\xd4\x0f\x23\xb1\xa4\x67\xc7\x3b\x9d\xae\x9e\xb8\xd4\x9f\xae\xfa\xc7\xef\xc0\xa4\xfe\x30\x9b\x4d\xce\xdb\x0a\x5e\x07\x7c\xb7\x13\xb2\x1e\xef\x71\x80\xd4\x50\x0c\x87\x08\x89\x19\x5e\x93\x8b\xb1\x3e\xfd\xba\xef\xee\xfa\x76\x36\xc3\xff\x06\xa6\xff\xd5\x3e\x74\x7e\xe3\xf7\xaf\x57\x85\x3f\xcb\xfa\xcf\x4f\xbc\x1d\x44\x49\xb0\x26\x93\x03\xf5\x5f\x5b\x4c\x8e\xa5\x9b\x8c\xcb\x2e\x16\x58\x4f\x64\x57\x83\xa2\x9e\x08\x76\xdc\x6c\x35\xcc\x03\x22\xa8\xe0\x22\x4a\xc8\x97\x17\xef\x08\x18\xd4\x60\x01\x35\x63\xc7\xc8\xd5\xd0\x5c\x71\x0d\x13\xcf\x15\xf1\x4f\xfe\xea\x87\x3d\x87\xcb\xb8\x5c\x1c\xce\x78\xb0\x09\x1e\xa6\x20\xc2\xbf\xf8\xc1\xe2\xa7\xe8\x47\xa8\xaa\x25\x3a\x0b\x82\x05\x12\x57\x53\x48\x74\x6a\x30\xc5\xf5\x2a\x5a\x9f\x64\xb9\xb4\x3f\x50\xba\x72\xe7\x79\x9e\xb1\x83\x8a\x66\xb0\x0f\xf4\x60\x09\x35\xfa\x64\x29\x9b\xba\x09\x0f\x76\x97\x3c\x18\x3c\xf0\xe9\xf1\x57\xce\x33\x1e\xb4\x5e\xef\x7b\x06\xeb\xcb\xa8\xd7\x6c\x66\x55\xf1\x70\x63\x80\xf6\x00\x54\x94\xfa\xda\xfd\x5c\x2a\x99\x99\xcd\xe0\x61\xce\x6b\xc2\x18\x33\x01\xf8\xf5\x23\xe9\x1a\xad\xe1\xbd\x5a\x22\x83\xfa\x3d\xc8\x99\x00\xa3\xef\x48\x41\xbe\x9d\x35\x41\x27\xb4\xe6\xf7\x82\x91\x7f\xf5\xbc\x6e\xe4\xfd\xb9\xad\xc1\xe7\xe4\x52\x5d\x92\xf3\x0d\x6f\x5a\x51\x07\xff\x2b\x3d\x72\x29\x2f\x49\x79\x4e\x2e\xfb\x4b\x42\xa1\x02\x48\xde\x09\x46\x7e\x00\x61\x58\x69\xef\x63\x2b\xc3\x7e\x27\x98\xf4\x9b\x00\x06\x54\xa1\x0d\xeb\x7d\xbd\x0a\xd7\x36\x1c\xa9\x8f\x15\x7e\x4e\x2e\x95\xaf\x30\x3e\x6f\x82\x07\xa6\xd8\xf5\x82\x31\x7b\xdb\x33\x9c\x5c\xbc\xaf\x7f\x5f\xf5\x57\xbd\xdf\xf8\xc3\x9a\x19\xff\x81\x59\x5f\xf5\x81\xee\x3b\x61\x9b\x24\xd8\x0a\xfb\x23\x8e\x82\x1a\xba\x5d\x63\xbb\x5d\xe3\x6b\x30\x1f\x0f\xba\x95\x5e\xb3\x66\xa5\xd7\x76\x4e\x1b\x28\x4e\x59\x83\xc7\xe9\x01\x96\xa8\xd9\x0c\x52\xfa\xc3\xc3\x77\xfd\x58\x7e\x1f\x2e\x2f\xa9\x64\xfd\xea\x01\x06\x53\xf0\x0b\xcc\x8b\x62\x25\xd7\xf8\xef\x6a\xb1\xf6\xa8\x0f\x14\x5b\x1c\x67\xa8\x1b\xaf\xa2\x30\x3b\xdd\xb7\xfd\x1d\x6f\x7f\xdb\x36\x3a\x70\x55\xce\x1a\xea\x2f\x5a\xcd\x3b\x44\x5f\x5e\x56\xeb\x33\x33\xd5\x25\x75\x52\x12\x16\x14\xe6\x6b\x88\x3b\x76\xca\x46\x96\x7b\x8f\xc3\x3b\xdc\x83\xb4\xb9\x71\x6d\xca\x5f\x15\x69\xbc\xc6\xac\xe1\x1e\x3c\xcf\x29\xc5\x78\x1d\xd8\x6b\x52\x79\x9c\xc4\x20\x85\x12\x03\xf5\xff\xb2\x7d\xb2\x01\x8e\x3a\xfb\xff\x00\x00\x00\xff\xff\x67\xf6\x5e\x5b\xa0\x27\x00\x00")
+var _distAssetsChunk1435522fd209ce9704412efJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x5a\x5f\x73\xe3\x36\x92\x7f\xf7\xa7\xb0\xf1\xa0\x25\xca\x14\x2d\x92\xe2\xdf\x09\x3c\x97\x4b\xb2\x55\x57\xb5\x1b\xa7\x2a\xd9\x27\x9d\xca\x05\x93\x90\x45\x9b\x04\x15\x00\xf4\x8c\xc6\xd6\x7d\xf6\xab\x46\x83\x94\x26\x89\x9d\xf1\xcb\xa4\x7f\xcd\x06\xd0\xe8\xff\x50\xfc\xc4\xd5\xf9\xed\xad\xe8\xee\x84\xba\xe5\x83\xe9\x6f\x9b\x6e\xd7\x2b\x73\x7b\xfb\xc1\xf3\x28\xbb\x7e\x86\xef\xc2\x57\xbe\xf1\xb5\x2f\xfd\x9e\x3d\xa7\xd9\x62\x51\x7a\x96\x35\x7e\xd7\xec\x99\x04\x57\x7c\x43\xca\x7c\x19\x27\xbe\xa5\x83\x07\x7d\x02\x15\x29\x8b\x34\x8b\x91\x9e\xd7\x5f\x48\x99\x44\x45\x3a\x41\x2b\x7c\xc2\x79\xfc\x44\xca\x28\x4f\x92\x09\x5a\x81\x13\x4e\xbb\x27\x65\x96\x4f\xf2\xed\xde\x0a\x9c\x70\x3a\x4e\xca\x28\x5e\x14\x13\xc4\x1d\x8e\x1c\xcd\x49\x19\x2f\x8a\x6c\x82\x56\xe0\x84\x63\x24\x29\xb3\x2c\xca\x27\x88\x47\x4c\x1c\x0b\xa7\x4b\x7d\x21\x65\x1c\xe3\xe1\x78\x1b\x87\xee\x04\x29\xc3\x70\xb9\x40\xda\x7e\x99\xe0\x3d\x29\x97\x45\xe2\x68\xfb\x69\x82\x1d\x29\xd3\x62\x99\x21\x6d\x3f\x4d\x50\x92\x32\x4c\xc2\x04\xe9\xf9\x5d\x4d\xca\xe5\x22\x8d\x26\x88\xfb\x4c\x1c\x3c\x71\x94\xef\x49\x99\x67\x49\x8c\x34\x7a\x68\x84\x8a\x94\xf1\x32\x72\x34\xde\x60\x84\xb0\x61\x12\xe2\x75\x34\xee\xef\x60\xc5\x49\x99\xa5\x59\x84\x34\x1a\x68\x84\xf6\xa6\x71\x81\xb4\xbb\xb8\x83\x4f\xa4\x5c\x66\x61\x8c\x34\x6e\x38\xc2\x3d\x29\x93\x3c\x5a\x20\x8d\x61\xe1\x60\xcd\x49\xb9\x0c\xe3\x10\x69\x5c\x35\x42\x41\xca\x38\xc5\x50\xab\xc5\x9c\x1b\xab\x7c\x34\xc1\xf1\x3a\x23\xa7\xda\x92\x32\x8d\x96\xe9\x04\xd1\xc2\x13\x07\xe5\xc7\x0d\x9f\x48\x99\x2f\x96\x05\xd2\x68\x34\x07\x45\x4b\xca\x64\xb1\x48\x91\x46\x6d\x47\x28\xe7\x7c\x00\xc9\x13\xe8\xd6\x4e\x1c\xb0\x5e\x91\x9d\x40\x0c\xa9\x23\xe7\xfe\x0e\x5c\x99\x27\x13\x74\xce\x9d\x38\x8d\x80\xc0\x98\xe4\x1b\xe1\x42\xe5\xc8\xb1\x1a\xe6\xc5\x04\x9d\x92\x47\x8e\x24\x65\x12\x2f\x96\x13\x44\x81\x23\x47\x7e\x21\x65\xb4\xcc\xe3\x09\x62\x22\x1d\x39\xfa\x1e\xf2\x3c\x2d\x26\xe8\x32\xdf\x71\x7a\x52\x86\x59\x82\xbb\x61\xc8\x4d\x10\xe8\x65\x9e\x23\x3d\xaf\x21\x38\xe3\x3c\x9b\x20\xee\x73\xe4\x74\x9f\x49\x19\xa5\xc9\x11\xa2\x26\x47\xce\x00\xd6\x5b\x14\xc5\x04\xd1\x9e\x13\x07\x4f\x1f\x4f\x34\x70\xcd\xd0\xd1\xee\xd6\x0e\x0e\x90\xe7\x98\xbf\x62\x70\x69\x8f\x70\x03\x2e\x8b\xf1\xee\x1b\xe7\xaf\x11\x36\xa4\x0c\xe3\x3c\x42\x1a\xcf\x9a\x60\x4b\xca\xbc\x48\x0a\x07\xf0\x66\x23\xee\x49\x99\x25\x18\x6b\x1b\xbc\xf4\x04\x15\x29\xa3\x10\xa5\x94\x0d\x97\x24\xcf\xd3\x09\xba\xf4\x38\x72\xb6\xa4\x0c\x8b\x34\x9b\x20\x2a\x31\x71\xd0\x5e\x6e\xbf\x3d\xc4\x49\x81\x9a\xef\x5d\xd8\x20\xbc\xe7\xa4\xcc\xf3\x22\x44\x1a\x75\x1d\x61\x4d\xca\x22\x41\xf7\xdd\x63\xa9\x99\x60\x4b\xca\x30\x4f\x13\xa4\xf1\xe4\x11\xf6\xdd\xbc\x16\x4f\x60\xba\x65\xfe\x15\x07\x77\x38\x61\xb6\x1c\xca\x6e\x9e\x63\xf0\x8c\x1c\xa7\x83\x63\x0e\x50\x27\x8b\x1c\x69\x57\x36\x11\x6e\xa1\xd8\x46\x4b\x47\xa3\x0e\x23\x04\xef\x24\x8b\x05\xd2\xae\x2a\x3a\xa8\x48\xb9\xcc\xb1\x8e\x6f\xd1\x48\x13\x84\xb3\xf2\x74\x89\xb4\xfb\xe4\xe0\x7e\xce\xa1\x4a\x2f\xd2\xc5\x04\xd1\x8c\x8e\xd3\xd4\xa4\x4c\x8a\x65\x84\x34\xfa\x6a\x84\x70\xeb\x22\x0a\x91\x46\x23\x8c\xd0\x90\x32\xcd\x72\x47\x5b\x97\x16\x71\x96\x4f\xd0\x85\xdc\xc8\xc1\x13\x9d\xfc\x03\xf4\xbc\x0c\xfd\xfb\xe0\x1a\xde\x08\x9f\xa0\xbe\xa5\x8e\x76\xe5\x0e\xe1\x23\xd4\x70\x24\x30\xf8\x2c\xfd\x08\x81\x93\x44\x48\xbb\x38\x72\xb0\x23\x65\x9c\x60\x0b\x7b\xc4\x2b\x4f\x10\x5a\xe6\x32\xc3\x6d\x5d\xbf\x1c\x61\x6f\x1d\x1d\x22\x3d\xfa\x1d\xe1\x00\x7d\x14\xfb\xee\xe3\xe0\xda\xaa\x83\x10\xa5\x6e\x6f\x17\xa4\x88\x5a\xa8\x8c\x11\x5a\xb3\x75\x65\x71\x84\xbd\x4d\x8a\x02\xe9\x31\x47\x10\x1a\x88\xff\x38\x47\xda\xa5\x83\x83\x4f\x10\xca\xcb\x10\x69\x17\xd9\x08\x3b\xe8\x2e\x05\x76\xb5\xce\xf5\x86\x11\x36\xa4\xcc\xd3\x28\x45\x1a\xc3\x74\x84\x8f\xa4\x5c\xc6\x68\xb2\x0e\x2d\x38\xc1\x16\xee\x81\x41\xdf\xb5\xee\x5a\x0e\x4a\x70\x0c\xaa\xd4\x49\xe7\x27\x07\x15\x44\x33\x0e\x38\x9d\x72\xc1\xed\x20\x18\x7a\x81\x81\xde\xe9\x79\xb7\xb7\x25\x3e\x9c\xe0\x58\xf4\x1d\x07\x1d\x33\xca\x1b\x98\x9b\xc2\x25\xd2\x6e\x8c\x72\x70\x0f\xcd\x06\xab\x94\xdb\x64\x84\xf2\x8e\x94\x69\x1e\x2d\x91\x46\x3d\x47\x28\x6c\x42\x66\x48\x8f\xf9\x89\xb0\x05\x37\x85\x48\xce\x61\x34\x5a\xc6\xcb\x23\x74\x46\x1a\x39\xce\xab\x88\xa0\x2a\x84\x61\x84\x34\x1a\xda\xc1\xbe\x9a\xb7\xb2\x82\x81\x2b\x49\x8f\xd8\xcd\x60\xc8\xda\x71\xdb\xe7\x8a\x04\x2b\xb5\x85\xce\xc5\x8e\x03\x1e\xc9\xb1\x1c\xec\x9c\x47\x46\x08\xc3\x44\x86\xd4\x1c\xa6\xa4\xa2\xc0\x73\x2d\x74\xb9\x3b\x72\xf0\x54\x2b\xad\xa0\x9d\x45\x58\xc7\x95\xeb\x65\x23\x84\xc1\x20\x49\x43\xa4\xf1\x93\x83\xba\x86\xde\x8a\xe6\xd7\xb5\x6b\xb5\x0e\x0a\x48\x99\x0c\x49\x97\x40\x88\x1a\xf0\x26\x3a\x57\x37\xce\xb9\x0e\x3e\xda\xae\x96\x20\x3d\x36\x39\x84\x2d\xd4\x91\xa5\xa3\x5d\x59\x71\xf0\x77\xa8\xdd\xd8\x35\xf5\xef\xae\x94\x3b\x08\xb5\x32\xca\xf0\x5c\x35\xaf\xf6\xca\xc6\x72\x9a\x9e\x30\x5c\x40\x8f\x3c\xe7\x46\xb7\x06\x8e\x89\x70\xc8\xd5\xae\xf2\x8d\xf0\x09\x9e\x00\x98\x57\xfa\xc9\xbd\x08\x1c\x84\xe7\x80\xb3\x82\x7b\x0a\x20\x32\x9c\x94\x69\x88\x21\x62\xb0\x7c\x4d\x10\xa2\x2b\xc4\xfe\x6b\x5c\x68\x4d\xd0\x00\xc0\x11\xd6\xb8\xe6\x3f\xe1\x7b\x52\xc6\x4e\x25\x83\xb3\xcc\x04\xb7\xa4\x8c\xc3\x10\xb7\xc7\x4a\x3c\xc1\x47\x52\x46\x49\x94\x21\x8d\x2a\x8e\xb0\x9d\xef\xb6\x10\xae\x38\x52\x59\xe8\x02\x78\xe4\x6c\xed\x50\x14\x3a\x30\x0e\x49\x88\x15\x8c\x03\xd8\x62\x8d\x72\xd3\x81\x83\x5f\x5a\xdb\x6d\x42\x07\xc6\xee\xe3\x70\x07\xa6\xc5\xa9\xc5\x7c\x99\x3a\xeb\x12\x63\x66\xe4\xb8\x59\x6d\x62\x3a\x8f\xe0\xb2\xe1\x7e\x5e\x41\x45\x4f\x71\x2e\xb0\xd0\xcd\xf8\x8e\x03\xe1\x95\x3a\x61\x17\x5e\x23\x54\x30\xea\x66\x48\xba\xc1\x17\xd1\x17\x38\x30\x2a\x90\x1e\xd5\x0a\x17\xc9\x09\x63\x34\x8f\xe3\x39\x25\x71\xcd\x53\x63\x3b\x87\xa3\xc7\x46\x62\xe1\xe7\xf9\x4e\x8b\xc1\xce\x91\xd8\x82\x47\x86\x2b\xcc\x96\xb7\xef\x49\x99\x26\x91\xa3\xd1\x66\x0e\x7e\xd9\xda\xfb\x16\x09\xc6\xba\x85\xae\x4c\x4c\x9c\xed\x23\xc4\x76\x1c\x4f\xd0\x45\xfb\xc4\xe9\x7a\x52\xc6\x98\x7d\x16\x61\x98\x4c\x0c\xf3\x89\x94\x49\x96\x14\x13\x44\xab\x65\x49\x71\x38\xdb\x0c\xb2\x32\x4d\x2f\xcf\xa5\x27\xa8\x7d\x58\x2b\xd6\x7b\x82\x9e\x29\x61\x06\x25\xcf\x8d\xa7\xe8\x61\x12\x82\x2f\xcf\xcd\xc6\xbb\x30\x41\xef\x69\x5f\xd0\x71\x89\x14\x9f\xce\x7f\x52\xaa\x57\x1e\xf9\x81\x4b\xd9\x9b\xf3\x4d\x23\xeb\xf3\xae\xaf\x87\x56\x9c\xff\x83\x5c\x8a\x4b\xf2\x0f\x42\xcf\xcc\x56\xf5\x9f\xce\x55\x50\xf5\xb5\x60\xe4\xdf\x37\x3f\xfe\xe7\x5f\x3f\xdd\xfe\x7c\xf3\xdb\xed\x3f\x6f\xfe\xf3\xf3\x8f\xc4\x57\x07\x77\xae\x5e\x89\xf5\x41\x06\x8f\x62\xaf\xd9\x78\xbc\x47\x9f\xdd\xd7\x9b\xbb\x07\x51\x19\xfb\xd5\xd3\xf4\xe0\xcb\x40\x09\xdd\xb7\x4f\x82\xf5\xbe\x08\xc4\xe7\x5d\xaf\x8c\x66\xd2\x97\x41\x53\xb3\x34\x5b\x2c\x0e\x7e\x11\x45\x7f\xfa\x09\xc1\x97\x67\x47\x69\x4f\xb3\x5b\xc1\x9b\xdb\xda\x97\x48\x28\xff\x53\x23\xeb\xfe\x53\x60\x7f\xa8\xf8\x7e\x30\xfd\xff\xd8\x9f\x29\x7e\xdc\x4b\xde\x35\xd5\x51\x2d\x31\xe9\x15\x32\xc6\xb8\xba\x1f\x3a\x21\x8d\x0e\x5a\x21\xef\xcd\xf6\xa3\xf4\x08\x6e\xbc\x97\xb7\xe4\x52\xd0\xf2\x84\x61\x2c\xc7\xfb\x5e\x29\xbe\x0f\x76\xaa\x37\xbd\xd9\xef\x44\xa0\xdb\xa6\x12\x41\xc5\xdb\xd6\x9b\xb6\xf3\x43\x4a\x0f\xaf\xa8\xf4\xeb\x5e\xfe\xa5\x3e\xe3\x49\x7a\x2f\xab\xf7\x9e\xa4\x3d\xc2\xa5\x16\x8a\xf8\xab\xb5\xef\xfd\xd9\x07\xc6\x4b\xe3\x24\xa1\x07\x4a\x41\xf4\x8e\x6b\x91\x2e\xe7\x0f\xfa\x75\xf1\x65\x11\x16\xa3\x78\x35\xa8\x27\x51\xcf\xb9\x52\xfd\xa7\x37\x96\x14\xd1\x32\x1b\x97\xd4\xf1\xeb\x72\x51\x9a\x1e\xc5\x60\x57\xbe\x7f\x5d\x38\xc9\xe3\xaf\xa4\x3f\x37\x6f\x68\x90\xc4\x49\x78\x22\xbc\xe9\x55\xc7\xcd\xeb\xe2\x59\x94\x9e\x28\x3c\xd7\x15\x6f\xc5\x1b\x6a\xc7\x49\x7c\x2a\x2d\x5a\x61\x65\x5e\x5f\x11\xa7\x8b\xe4\x74\xc5\x96\xef\xde\xd8\x3f\x49\xf2\x53\x6d\x4c\xd3\x89\xbf\xbd\x41\x98\xe5\xc5\xe9\x1a\xc5\xa5\x6e\xde\x56\x2a\x4a\xe3\xe3\x35\x06\xc5\xe1\xfb\x9b\x91\x10\x4e\x26\xb5\x71\x3c\xd7\x86\xab\x7b\x6e\xc4\x55\xd5\x77\xbb\x5e\x42\x0c\x5e\x41\x58\xf3\x76\x0e\x5f\xb0\x5b\xbe\xba\x5b\x1e\x67\x8b\x6f\xdd\xef\xcd\x8d\x92\x24\x2d\x5e\xd9\x48\x0b\xf5\xd4\x54\x42\x5f\xcd\xbf\x61\x9f\x30\x0f\x27\x27\x6d\xda\xb7\x8c\xbd\xcc\x16\x93\x29\x36\x03\x8e\x58\xaf\xdf\x33\xcb\x96\xa3\x70\xa3\xe7\xcd\xee\x8d\xcc\x0c\xc3\xc9\x23\x6d\x5f\x73\xbd\x0d\x1a\x69\x84\xd2\x7f\x17\x5f\x51\x18\x4d\x67\xb4\x6a\xb8\xed\xf8\x1b\xa7\x64\xd9\x31\x37\xba\x1e\x4a\xc7\x1b\xca\x47\x59\xf1\xb5\xac\x0d\xc7\x2f\xbd\x7c\x23\x7e\xe3\x28\x8b\xc6\x45\xb2\x9f\x57\x5c\xbf\x21\x9c\x15\xe1\xa4\xfa\xef\x83\x50\xfb\xb9\x36\xaa\x91\xf7\x6f\x58\x29\xcb\xa6\xf4\x30\xe2\xb3\x99\x0b\x09\x7d\x49\xcd\xdb\xc6\xbc\x95\xb5\x49\x36\x19\xd7\x34\xa6\x15\x7f\xa3\x58\xb1\x48\xa6\x5b\x7c\xd6\x86\xbf\xb5\xf7\x72\x91\x4e\x7b\x7f\x36\x42\x75\x73\x5e\xd7\xbd\x9c\x6f\x9a\x37\x6c\x1b\xa5\x05\xda\xf6\xa9\x6f\xea\x73\x7d\xd2\x6e\xec\x16\xaf\x2e\x0c\x84\x17\xc7\x21\x0d\xcc\x56\x48\xcf\x04\x26\xb8\x6b\x64\xed\x19\x3f\x8a\xe3\xd0\x8f\x62\x0a\x7b\xd2\x83\x1f\xe6\xcb\x65\x79\x6c\x2e\xbe\xa2\xcf\xae\x0b\x61\x9b\x64\x4a\xfc\x3e\x34\x4a\xf8\xa7\xdc\x9a\xd5\x62\xd3\x48\x71\xf0\xc3\xa8\x88\x4a\xc1\xae\x9f\xc9\xa0\xc5\x39\xf8\xa4\x32\xe4\xa4\xef\xba\xd5\x1e\xf9\x2f\x9b\x73\x57\x7c\xb7\x6b\x9b\xca\x16\x11\x42\x0f\x7e\x9c\x64\xcb\xf7\x2c\x9f\x52\xde\x2e\x8e\x93\xf8\x3d\x8b\x6b\x71\x37\xdc\xc3\xc2\x22\x5e\x86\xef\x5b\xa8\x8d\xea\xf7\xfc\xae\x15\xb0\x3c\x8d\xf2\x77\x9d\xbb\x15\xed\x4e\x28\x58\x99\x45\x61\xf1\x9e\x95\xbd\x9d\x84\x60\x65\x9e\x65\xef\x3a\x53\x0d\xb2\xed\xfb\x9d\x5d\xfa\x4e\x1b\xbb\x6a\x68\x0d\x15\xa5\xe9\x7b\x96\x1a\xd1\xed\x5a\x6e\xc4\x7c\xc3\x2b\xd3\xab\xbd\xbd\xf3\x32\x79\xe7\x1e\xda\xcc\x3f\xf1\x06\x0a\x9a\x5d\x5f\x14\x8b\x6f\x5b\x7f\xdf\x36\x5d\xf7\xc7\x20\x49\xc3\x6f\x35\xdc\xb8\xdc\x28\x5e\x3d\x36\xf2\xfe\x6a\xa7\x9a\xae\x31\xcd\x93\xd0\x57\x15\xaf\xb6\xd6\x22\x71\xf4\x8d\xda\xd8\x5d\x44\x3d\xef\xf8\x4e\xcf\xb9\xac\xe7\x5a\x18\xb8\xcf\xc1\x6f\xd8\xf3\xc9\x64\xce\x8f\x93\x79\xb3\x12\xeb\xb3\x66\xe3\xd9\x44\x5f\x5c\x30\xa6\xa8\x4b\x66\x35\xee\x7f\x06\x92\xc6\x4a\xb2\xe7\xa6\x2e\x85\xdf\xf6\xbc\x16\x75\x79\x11\xfa\x4e\xa4\x7c\x3e\x1c\xc6\xf9\xbe\x5f\x89\x35\x8e\x7f\x66\xdc\xc1\x37\xfe\x91\xe6\xd4\x37\x01\xee\xc0\x2e\x16\xc7\x0f\x07\x1e\x74\x30\x6c\xb3\xd5\xda\xe7\xc1\x0d\xf3\xdc\xff\xad\x83\xd9\xda\x3e\x10\x50\xe5\x9e\x85\x57\x8b\xb3\x4d\xaf\xbc\x8a\x2d\x3e\x54\xdf\x09\x37\x14\x7f\xa8\x2e\x2f\xe9\x33\xf0\x9f\xb8\x5a\xd9\x95\x6b\x26\x56\xd5\xda\x6f\xe0\x98\x81\x2d\x3e\x0c\xdf\x99\x51\x78\xb8\xbc\xa4\xde\x45\x38\x93\x2f\x2f\xfd\x35\x93\x74\x36\x3b\x7d\x00\xf0\xe0\x86\x06\xe2\x49\xa8\xbd\xe7\x09\x76\xcd\x83\x9b\x95\x58\x7b\x66\x35\xac\x29\xa5\x1f\x4d\xa0\xa1\x9e\x08\x6f\x98\xcf\xfd\x90\x96\x5e\xc3\x2e\x42\x5f\x7e\xd7\xcf\x66\x5e\xcf\x24\xa5\x60\xcf\x86\x3e\x8b\x51\xae\xb2\x72\xd6\x8c\x0f\x4c\x7b\xf4\x6c\x32\xf6\xc3\x6c\xe6\x29\xf6\x40\x0f\xe3\x23\x45\x1d\x24\x93\x2f\x2f\x78\x41\x58\x50\xb1\xe3\x05\xaf\x17\xb3\x99\x58\x55\xf3\x70\xbd\x8a\xd6\xd7\xf2\x43\x35\x9f\x53\xb8\x21\x43\xe6\x99\xa5\xdd\xd5\x0f\x3e\x0f\x24\x13\xee\x5d\xa2\x98\x98\xcd\x44\x70\x7b\x2b\xf4\xbf\xed\x03\xea\xa3\x47\xd9\xb5\x08\x6a\xb1\xe1\x43\x6b\x4a\x8b\x46\x07\xf2\xa0\xf6\x94\xff\xcc\x4b\x75\xa0\xbe\x3a\xf8\x86\x39\xdb\xdc\x0b\xf3\xcb\x38\xe6\xdf\x6c\x3e\x0a\x76\xfd\x97\x1f\x3c\x41\x21\x5a\xe1\x38\xfb\x2a\xb8\xbd\xf5\x79\x60\x4e\x1e\x13\xbe\xb6\x4f\xbe\x70\xa6\x67\x33\x4f\x30\xb3\x6d\xb4\x27\x28\xf5\xf3\x99\x1e\x83\x4f\x80\x0d\x89\x2b\x45\x8c\xc1\xc6\xfd\xe6\x1c\x2e\x61\x97\x2e\x61\xe9\xe9\x7d\xbe\x5a\x17\xa6\xf0\x99\x8c\x07\x9e\xac\xb7\x8d\x69\x92\x3d\x80\x69\xe4\x78\xbb\x4a\x09\x6e\x84\x27\x87\xb6\xa5\x67\x3c\x50\x9e\x44\x97\xf5\x90\x3a\x8a\xa9\x97\x97\x15\x7c\xf3\x8d\xf7\x7c\xa0\xbe\xf1\x56\x6b\xf8\xd7\xd0\xf5\xe4\xab\x86\x45\x56\xaf\x0f\x7f\x52\xbc\x99\xcd\x2e\xfe\x4f\x05\x8d\xac\xc5\xe7\x1b\x08\x8e\x0f\x0d\x33\x5e\x43\xe9\xd1\x80\x37\x9f\xe4\x2f\xaa\xdf\x09\x65\xf6\x3f\xf3\x4e\x68\xaf\xa1\xc1\xa6\x57\x3f\xf1\x6a\xeb\x79\x8a\x5d\xf7\x2b\xb5\x66\xd6\x4f\x2b\xb5\xa6\xd3\x6b\xba\x1f\x7d\x88\xdf\x7c\x70\x9e\xf4\x7b\xea\x4b\x88\x80\x9a\xd9\xee\xca\xae\xc7\xc4\x38\x37\xe7\x8d\x3c\x57\x94\x07\x3d\xe4\x17\x9d\xcd\x2e\x80\x14\x96\x74\xca\x60\x9b\x1d\x95\x81\x6f\xfe\xb3\x90\x43\x27\x14\x34\xa3\xf2\x62\xe1\xdf\x0b\x53\xaa\x95\x59\x1f\x28\x1c\xb2\x61\xcf\xf0\x1f\x01\xd1\xf6\x8b\xea\xbb\x46\x8b\x00\xd2\xff\xeb\x8c\xda\xd0\x40\x89\x7a\xa8\x84\xe7\x79\xf8\x62\x06\xe6\xca\xac\xad\x86\xbe\xa2\xd4\x5f\xad\x29\xf5\x79\x30\xc0\x46\xa4\xda\x0e\xf2\x31\xb0\xcf\xfc\x20\xba\xdb\x84\x29\xcf\x39\xbf\xcb\xa3\xec\xae\xaa\xb3\x24\x59\xd8\xc1\x96\x07\x5d\x23\x9b\x1f\xb4\xfe\xa7\x0d\x75\x50\xa3\x1f\xaf\xec\x8e\x3f\x3e\x4c\xb7\x5c\x9f\x18\x19\x4b\x94\x3d\x5b\xc3\x05\x24\x23\x7f\xf9\x07\x04\x25\x9c\xd2\x32\x7c\xe7\xfb\xbd\xab\x46\x7a\x25\xd6\x14\xfe\x09\x76\x83\xde\x7a\x8a\x9e\x89\x56\x0b\x9b\x6b\x8d\x3f\x7c\x55\x50\x0d\x1d\x6d\xff\xc0\xea\xbe\xb2\x0f\x62\x70\xf8\x4f\xad\xb0\x6f\xe3\xff\xde\xff\xc6\xef\xc1\xe5\x1e\xd1\x95\x6a\x76\x86\x50\x1f\x4b\xdb\xc3\x57\xa5\x0d\x76\x68\xd9\xc3\xaa\xb2\xf5\xba\x85\x2d\xbe\x37\x46\x35\x77\x83\x81\xa5\xaa\x22\x94\x31\xf1\xf2\xf2\xc7\x2f\x35\x37\x7c\xfe\x49\xdc\xed\x78\xf5\x08\x22\xf2\xd2\xd0\xe7\x86\xb5\x67\x77\x4a\xf0\xc7\xc3\xa1\x79\x79\xf1\x06\x28\x91\x5e\x73\xd4\x0f\x93\xc1\xa9\x78\x54\x8c\x06\xd5\x96\x2b\x2d\x0c\x23\x83\xd9\xcc\x73\xe2\x37\x01\x0c\xdd\xfd\x60\x58\x18\x2d\xa0\xe6\x54\xb3\x59\x13\xe8\xaf\x34\x90\xbd\xac\x04\xb1\x1f\xa9\xff\xc7\x8f\x5f\xa9\xe7\x83\x72\x20\xa2\x2a\x26\xa8\x0f\x06\x66\x2b\xb5\xb6\x79\x58\x33\x17\x37\xcf\x4d\xd0\x4b\xa1\x54\xaf\x18\x50\xd0\x4a\x98\xcd\xcc\xaa\x15\x5c\xfd\x86\xea\x78\x1d\x66\xaf\x64\xda\x75\xb8\x5a\xb4\xc2\x08\xfb\x33\x90\xdf\x04\x3b\xae\x84\x34\x3f\xf7\xb5\x00\x7d\x8f\x28\x50\xa2\xeb\x9f\xc4\x0f\xdb\xa6\xad\xbd\x86\xfa\x72\x36\x93\xc7\x3c\x84\xb2\xe6\x19\x4a\x21\x5e\xc7\x8a\xed\x19\x7a\xf0\x3b\xa6\x85\x19\x8f\xae\x71\xec\xb5\x3a\x61\x18\xf8\xcf\x10\x81\x25\x71\xb6\x22\x3e\x3e\x42\xcb\xe6\x40\xfd\x30\x12\x4b\x7a\x76\xbc\xd3\xe9\xea\x89\x4b\xfd\xe9\xaa\x7f\xfc\x0e\x4c\xea\x0f\xb3\xd9\xe4\xbc\xad\xe0\x75\xc0\x77\x3b\x21\xeb\xf1\x1e\x07\x48\x0d\xc5\x70\x88\x90\x98\xe1\x35\xb9\x18\xeb\xd3\xaf\xfb\xee\xae\x6f\x67\x33\xfc\x6f\x60\xfa\x5f\xed\x43\xe7\x37\x7e\xff\x7a\x55\xf8\xb3\xac\xff\xfc\xc4\xdb\x41\x94\x04\x6b\x32\x39\x50\xff\xb5\xc5\xe4\x58\xba\xc9\xb8\xec\x62\x81\xf5\x44\x76\x35\x28\xea\x89\x60\xc7\xcd\x56\xc3\x3c\x20\x82\x0a\x2e\xa2\x84\x7c\x79\xf1\x8e\x80\x41\x0d\x16\x50\x33\x76\x8c\x5c\x0d\xcd\x15\xd7\x30\xf1\x5c\x11\xff\xe4\xaf\x7e\xd8\x73\xb8\x8c\xcb\xc5\xe1\x8c\x07\x9b\xe0\x61\x0a\x22\xfc\x8b\x1f\x2c\x7e\x8a\x7e\x84\xaa\x5a\xa2\xb3\x20\x58\x20\x71\x35\x85\x44\xa7\x06\x53\x5c\xaf\xa2\xf5\x49\x96\x4b\xfb\x03\xa5\x2b\x77\x9e\xe7\x19\x3b\xa8\x68\x06\xfb\x40\x0f\x96\x50\xa3\x4f\x96\xb2\xa9\x9b\xf0\x60\x77\xc9\x83\xc1\x03\x9f\x1e\x7f\xe5\x3c\xe3\x41\xeb\xf5\xbe\x67\xb0\xbe\x8c\x7a\xcd\x66\x56\x15\x0f\x37\x06\x68\x0f\x40\x45\xa9\xaf\xdd\xcf\xa5\x92\x99\xd9\x0c\x1e\xe6\xbc\x26\x8c\x31\x13\x80\x5f\x3f\x92\xae\xd1\x1a\xde\xab\x25\x32\xa8\xdf\x83\x9c\x09\x30\xfa\x8e\x14\xe4\xdb\x59\x13\x74\x42\x6b\x7e\x2f\x18\xf9\x57\xcf\xeb\x46\xde\x9f\xdb\x1a\x7c\x4e\x2e\xd5\x25\x39\xdf\xf0\xa6\x15\x75\xf0\xbf\xd2\x23\x97\xf2\x92\x94\xe7\xe4\xb2\xbf\x24\x14\x2a\x80\xe4\x9d\x60\xe4\x07\x10\x86\x95\xf6\x3e\xb6\x32\xec\x77\x82\x49\xbf\x09\x60\x40\x15\xda\xb0\xde\xd7\xab\x70\x6d\xc3\x91\xfa\x58\xe1\xe7\xe4\x52\xf9\x0a\xe3\xf3\x26\x78\x60\x8a\x5d\x2f\x18\xb3\xb7\x3d\xc3\xc9\xc5\xfb\xfa\xf7\x55\x7f\xd5\xfb\x8d\x3f\xac\x99\xf1\x1f\x98\xf5\x55\x1f\xe8\xbe\x13\xb6\x49\x82\xad\xb0\x3f\xe2\x28\xa8\xa1\xdb\x35\xb6\xdb\x35\xbe\x06\xf3\xf1\xa0\x5b\xe9\x35\x6b\x56\x7a\x6d\xe7\xb4\x81\xe2\x94\x35\x78\x9c\x1e\x60\x89\x9a\xcd\x20\xa5\x3f\x3c\x7c\xd7\x8f\xe5\xf7\xe1\xf2\x92\x4a\xd6\xaf\x1e\x60\x30\x05\xbf\xc0\xbc\x28\x56\x72\x8d\xff\xae\x16\x6b\x8f\xfa\x40\xb1\xc5\x71\x86\xba\xf1\x2a\x0a\xb3\xd3\x7d\xdb\xdf\xf1\xf6\xb7\x6d\xa3\x03\x57\xe5\xac\xa1\xfe\xa2\xd5\xbc\x43\xf4\xe5\x65\xb5\x3e\x33\x53\x5d\x52\x27\x25\x61\x41\x61\xbe\x86\xb8\x63\xa7\x6c\x64\xb9\xf7\x38\xbc\xc3\x3d\x48\x9b\x1b\xd7\xa6\xfc\x55\x91\xc6\x6b\xcc\x1a\xee\xc1\xf3\x9c\x52\x8c\xd7\x81\xbd\x26\x55\x44\xd1\x02\xa4\x50\x62\xa0\xfe\x5f\xb6\x4f\x36\xc0\x51\x67\xff\x1f\x00\x00\xff\xff\x4f\x6f\x01\x55\xa0\x27\x00\x00")
-func distAssetsChunk1431dbf1aabb9053887ddf7JsBytes() ([]byte, error) {
+func distAssetsChunk1435522fd209ce9704412efJsBytes() ([]byte, error) {
return bindataRead(
- _distAssetsChunk1431dbf1aabb9053887ddf7Js,
- "dist/assets/chunk.143.1dbf1aabb9053887ddf7.js",
+ _distAssetsChunk1435522fd209ce9704412efJs,
+ "dist/assets/chunk.143.5522fd209ce9704412ef.js",
)
}
-func distAssetsChunk1431dbf1aabb9053887ddf7Js() (*asset, error) {
- bytes, err := distAssetsChunk1431dbf1aabb9053887ddf7JsBytes()
+func distAssetsChunk1435522fd209ce9704412efJs() (*asset, error) {
+ bytes, err := distAssetsChunk1435522fd209ce9704412efJsBytes()
if err != nil {
return nil, err
}
- info := bindataFileInfo{name: "dist/assets/chunk.143.1dbf1aabb9053887ddf7.js", size: 10144, mode: os.FileMode(420), modTime: time.Unix(1480000000, 0)}
+ info := bindataFileInfo{name: "dist/assets/chunk.143.5522fd209ce9704412ef.js", size: 10144, mode: os.FileMode(420), modTime: time.Unix(1480000000, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
-var _distAssetsChunk1789068d2f119b2a5a281b5Js = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x55\x51\x6f\xe2\x38\x10\x7e\xe7\x57\x00\x0f\x91\x47\xb8\xde\xd0\xad\x76\x5b\xe8\xb0\xb7\xba\xbb\x87\x7b\x38\x71\xd2\xee\x5b\x14\x45\x86\x0c\xe0\x36\xd8\xd4\x71\xe8\x45\x21\xff\xfd\xe4\x98\x94\x4a\x57\x1e\xf6\x05\x26\xe3\xef\x9b\x19\x8f\xbf\xb1\x8f\xd2\x0e\xb3\x8c\xf6\x2b\xb2\x99\xac\x9c\xc9\xd4\xfe\x60\xac\xcb\xb2\x39\x63\x80\x8b\xc6\xaf\x13\xb7\xd8\x3c\xdc\x3d\xdc\xce\x36\x95\x5e\x3b\x65\x34\x23\x6e\xa1\x79\x55\x3a\x37\xaf\x22\x23\xa9\x32\x8b\x96\x5e\x2a\x65\x89\xbf\xf7\xe6\x98\xd3\x46\x69\x6a\xf9\xfd\x97\xbb\xfb\x99\xa7\x71\xd3\x87\x75\x5c\x0f\x48\xd0\xbf\x3e\x5f\x89\xcc\x61\xa0\x70\x1d\x0c\xdb\x47\xea\x8a\xfb\x5e\x39\xf3\x57\x57\xda\x1f\xb5\x96\x7b\xb5\xc6\x4b\x2d\xd0\x58\x72\x95\xd5\xc3\x29\x22\x4a\xbb\xad\xf6\xa4\x5d\x29\x0a\xd2\x5b\xb7\xfb\xa6\xd9\x38\x04\xae\x75\x36\x9e\x10\xcc\xde\x39\x5c\xe7\x61\xdf\xad\x95\xb5\x38\x58\xe3\x8c\xab\x0f\x24\xca\x42\xad\x49\xac\x65\x51\xb0\xb7\x70\x7c\x0a\xd0\x5e\x29\xe9\x47\xad\x3f\xac\xa7\xcf\x54\xd6\x7a\xfd\xab\x99\x1c\x1b\xff\x66\x4d\xbc\xb5\x9f\xd6\xa4\x56\x66\xcc\x93\x94\xb3\xb7\x1c\x6f\x29\x0c\xfb\x7c\x77\x0f\x2d\x80\x27\x3c\xbd\x54\x64\xeb\xeb\xd0\xaf\x9f\x3f\x3f\xf4\xd8\x97\x4a\x2b\x77\x1d\xfa\x30\xfd\xd2\x21\x8f\x46\xe5\x43\xc7\xc6\xb6\x3c\x1e\xae\xa3\x6f\xe3\xdb\x5b\x0f\x87\xb6\xe5\x06\x9b\x76\xd0\x83\x86\xce\xb7\xc3\x9f\xb6\x46\x93\x50\x3a\x50\x1b\xd6\x85\x8c\x47\x88\x1a\xfa\x3e\xf5\x2a\x18\x78\xa4\xea\x90\xd8\xa8\x7c\x46\xbc\x30\x32\xa7\x7c\x36\x9a\xf2\x33\x64\xd6\xb4\xed\xe0\xcc\xb3\x09\xa5\xa1\x79\xaa\x8f\xc0\x15\xbf\xd8\x0e\xb8\x12\x21\x02\x8e\xe2\xcb\x42\xeb\xc4\x1e\x2d\x27\x4c\x52\xee\xc4\x12\x99\xe5\x86\x6b\xae\xbc\x32\xd5\x86\x8d\x4c\x28\x59\xe2\xf4\x53\x3c\xd8\x18\xcb\x72\x8c\xe7\xf9\x23\x9d\x25\x35\xcf\x27\x13\x68\xbc\xff\x28\x6d\xd2\x31\x53\xa4\x24\x4f\x79\xe5\xd3\x64\x18\xcf\xb3\x47\xd3\x83\xb3\xc9\x04\xd8\x68\x1a\xa9\xd3\x49\x2e\x50\x41\x14\x2d\x57\x4f\xb4\x76\xe2\x99\xea\x92\x39\xb1\x04\x41\x47\xb2\x35\x63\x84\x0b\x27\x96\x09\xa5\xcc\x24\x59\x0a\x00\xdf\x8c\x28\x0f\x5e\x21\x2c\xbb\xb9\xe1\x53\x98\xb1\x0a\x47\x53\xae\x1e\x65\x14\x31\x89\x0a\xc0\xf7\xb3\x82\x86\x7a\x5c\xde\xe1\xba\x36\x16\xa8\x19\x0c\xde\x9a\x5d\x44\x11\xb3\x58\x40\xdb\xf6\xcd\x6b\x15\xaa\xd3\x29\x6c\xd0\x13\x72\xbc\x6c\x70\x11\x47\x11\x25\xf9\xcd\x34\x4d\x6e\xd3\x85\x9a\xe7\x37\x37\xe0\x77\x88\xc1\x39\xe8\xec\xf3\xd6\x5b\xee\x44\x8e\xdd\x95\x80\x8b\xbe\x2d\x43\x33\x54\x7a\x68\xc1\x09\xe3\xbb\x0b\x51\x34\xf2\x26\x75\xe6\xb9\x01\xe1\x6e\xf8\xc7\x9a\x03\x59\x57\xfb\x35\xde\x90\xae\xf6\x64\xe5\xaa\xa0\xd9\x28\xe6\x5b\x72\x33\x9b\x98\xb4\xf5\x03\x21\x4c\x9f\xe4\xcc\xbf\x8c\xd1\x4e\x96\xcb\x57\xdd\x47\x0a\x92\xf0\x50\xee\x84\x45\xc2\x45\x33\xae\x74\xc8\x96\x8f\x47\xe8\x29\x66\x33\xfc\x51\xef\x57\xa6\x88\xa2\xf0\x2f\x9c\xf9\xe1\xac\xd2\xdb\x9f\x72\x7b\xbd\xc2\xff\x63\x79\x73\x94\x45\x45\xb3\xf1\xdf\x26\xaf\x0a\x1a\xb7\xc0\xaf\x91\xc7\x59\x46\xe5\x19\xd6\xd3\x46\x71\xd8\x9b\xde\xe7\xbe\x50\x46\xe2\x20\xdd\xae\xf4\xca\x24\xb1\xde\xa9\x22\xb7\xa4\x4f\x27\x76\xf9\xc0\x24\x05\x4e\xc0\xdf\xdd\xcf\xd8\x4c\xbf\xde\xcf\xe2\x76\xe0\xc4\x52\x3c\xa1\xc5\x45\x8c\x88\x94\xd8\xb4\x53\x82\xed\x04\xde\xa3\x35\x57\x3c\x91\xbc\xe2\x59\x8a\x86\x17\x18\x7b\x0d\x49\x51\x9a\x3d\x31\xe6\xa9\xa3\x40\x05\x08\x1a\xd7\xfe\x20\xab\xee\x20\x2b\xae\x21\x8a\x98\x13\xfb\x44\xa7\x58\x25\x3a\xed\x04\x98\x41\x90\x4f\xc6\x1c\xb4\x9e\x62\xa3\xc8\x32\x03\xf3\xe2\x51\xf6\x8a\x2a\x26\x13\x50\x28\x93\xc2\x4f\x9c\xd7\x81\x1f\x04\x4a\x54\x1a\x7e\x93\x38\x65\xc0\xbd\x85\x71\x3f\xdd\x4e\x2c\x59\x0e\xfe\x42\xd9\x16\x66\x25\x8b\x9f\x3b\x55\x8a\x57\x5a\x1d\xe4\xfa\xf9\xf7\x5d\xa5\x9f\x3f\x78\xb6\x7e\x01\x7a\x3a\x25\xe9\xc0\x88\x8d\xb1\x7f\xca\xf5\x8e\x59\xb1\x52\x3a\x67\xba\x2a\x0a\x1e\x03\x70\x23\x0e\x55\xb9\xc3\xf7\xee\xe0\x0a\x0e\x03\xd0\x02\xf3\x02\x5b\x9e\x2f\x34\x9e\xdc\xc5\xd3\x34\x1c\x8b\x63\xfe\xb9\x04\x08\x93\xa8\xf1\x1a\xca\xbf\x8a\x1e\x15\x10\x1a\xf8\x87\x4f\x31\x6a\x9f\x6a\xf0\x5f\x00\x00\x00\xff\xff\xc7\x25\x62\xd2\xab\x07\x00\x00")
+var _distAssetsChunk178E64db8b78adc0145d64fJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x55\x51\x6f\xe2\x38\x10\x7e\xe7\x57\x00\x0f\x91\x47\xb8\xde\xa4\x5b\xed\x76\xa1\xc3\xde\xea\xee\x1e\xee\xe1\xc4\x49\xdd\xb7\x28\x8a\x0c\x19\xc0\x6d\xb0\xa9\xe3\xd0\x43\x21\xff\xfd\xe4\x98\x94\x4a\x57\x1e\xf6\x05\x26\xe3\xef\x9b\x19\x8f\xbf\xb1\x0f\xd2\x0e\xf3\x9c\x76\x4b\xb2\xb9\xac\x9d\xc9\xd5\x6e\x6f\xac\xcb\xf3\x19\x63\x80\xf3\xc6\xaf\x13\xb7\xd8\x24\xf7\x77\x77\xd3\x75\xad\x57\x4e\x19\xcd\x88\x5b\x68\x5e\x95\x2e\xcc\xab\xc8\x49\xaa\xdc\xa2\xa5\x97\x5a\x59\xe2\xef\xbd\x05\x16\xb4\x56\x9a\x5a\xfe\xf5\x4b\x72\x37\xf5\x34\x6e\xfa\xb0\x8e\xeb\x01\x09\xfa\xd7\xe7\xab\x90\x39\x0c\x14\xae\x83\x61\xfb\x48\x5d\x71\x3f\x6a\x67\xfe\xea\x4a\xfb\xe3\xa8\xe5\x4e\xad\xf0\x52\x0b\x34\x96\x5c\x6d\xf5\x30\x41\x44\x69\x37\xf5\x8e\xb4\xab\x44\x49\x7a\xe3\xb6\xdf\x35\x1b\x87\xc0\x47\x9d\x8f\x27\x04\xd3\x77\x0e\xd7\x79\xd8\x0f\x6b\xe5\x51\xec\xad\x71\xc6\x1d\xf7\x24\xaa\x52\xad\x48\xac\x64\x59\xb2\xb7\x70\x3c\x01\x68\xaf\x94\xf4\x78\xd4\x1f\xd6\xd3\x67\xaa\x8e\x7a\xf5\xab\x99\x1c\x1b\xff\x66\x4d\xbc\xb1\x9f\x56\xa4\x96\x66\xcc\xd3\x8c\xb3\xb7\x1c\x6f\x29\x0c\xfb\x7c\x77\x0f\x2d\x80\x27\x3c\xbd\xd4\x64\x8f\xd7\xa1\x5f\x3f\x7f\xfe\xd6\x63\x5f\x6a\xad\xdc\x75\xe8\xb7\xe4\x4b\x87\x3c\x18\x55\x0c\x1d\x1b\xdb\xea\xb0\xbf\x8e\xbe\x8d\x6f\x6f\x3d\x1c\xda\x96\x1b\x6c\xda\x41\x0f\x1a\x3a\xdf\x0e\x7f\xda\x1a\x4d\x4a\xd9\x40\xad\x59\x17\x32\x1e\x21\x6a\xe8\xfb\xd4\xab\x60\xe0\x91\xaa\x43\x62\xa3\x8a\x29\xf1\xd2\xc8\x82\x8a\xe9\x28\xe1\x67\xc8\xb4\x69\xdb\xc1\x99\x67\x53\xca\x42\xf3\x54\x1f\x81\x2b\x7e\xb1\x1d\x70\x25\x42\x04\x1c\xc5\x97\x85\xd6\x89\x1d\x5a\x4e\x98\x66\xdc\x89\x05\x32\xcb\x0d\xd7\x5c\x79\x65\xaa\x35\x1b\x99\x50\xb2\xc4\xe4\x53\x3c\x58\x1b\xcb\x0a\x8c\x67\xc5\x03\x9d\x25\x35\x2b\x26\x13\x68\xbc\xff\x20\x6d\xda\x31\x33\xa4\xb4\xc8\x78\xed\xd3\xe4\x18\xcf\xf2\x07\xd3\x83\xf3\xc9\x04\xd8\x28\x89\xd4\xe9\x24\xe7\xa8\x20\x8a\x16\xcb\x27\x5a\x39\xf1\x4c\xc7\x8a\x39\xb1\x00\x41\x07\xb2\x47\xc6\x08\xe7\x4e\x2c\x52\xca\x98\x49\xf3\x0c\x00\xbe\x1b\x51\xed\xbd\x42\x58\x7e\x73\xc3\x13\x98\xb2\x1a\x47\x09\x57\x0f\x32\x8a\x98\x44\x05\xe0\xfb\x59\x43\x43\x3d\xae\xe8\x70\x5d\x1b\x4b\xd4\x0c\x06\x6f\xcd\x2e\xa3\x88\x59\x2c\xa1\x6d\xfb\xe6\xb5\x0a\xd5\xe9\x14\x36\xe8\x09\x05\x5e\x36\x38\x8f\xa3\x88\xd2\xe2\x26\xc9\xd2\xdb\x6c\xae\x66\xc5\xcd\x0d\xf8\x1d\x62\x70\x0e\x3a\xfb\xbc\xf5\x96\x3b\x51\x60\x77\x25\xe0\xbc\x6f\xcb\xd0\x0c\x95\x1e\x5a\x70\xc2\xf8\xee\x42\x14\x8d\xbc\x49\x9d\x79\x6e\x40\xb8\x1b\xfe\xb1\x66\x4f\xd6\x1d\xfd\x1a\x6f\x48\xd7\x3b\xb2\x72\x59\xd2\x74\x14\xf3\x0d\xb9\xa9\x4d\x4d\xd6\xfa\x81\x10\xa6\x4f\x72\xe6\x5f\xc6\x68\x2b\xab\xc5\xab\xee\x23\x05\x49\x78\x28\x77\xc2\x22\xe1\xbc\x19\xd7\x3a\x64\x2b\xc6\x23\xf4\x14\xb3\x1e\x3e\x1e\x77\x4b\x53\x46\x51\xf8\x17\xce\x3c\x3a\xab\xf4\xe6\xa7\xdc\x5c\xaf\xf0\xff\x58\xde\x1c\x64\x59\xd3\x74\xfc\xb7\x29\xea\x92\xc6\x2d\xf0\x6b\xe4\x71\x9e\x53\x75\x86\xf5\xb4\x51\x1c\xf6\xa6\x77\x85\x2f\x94\x91\xd8\x4b\xb7\xad\xbc\x32\x49\xac\xb6\xaa\x2c\x2c\xe9\xd3\x89\x5d\x3e\x30\xcd\x80\x13\xf0\x77\xf7\x33\x36\xc9\xd7\xfb\x69\xdc\x0e\x9c\x58\x88\x27\xb4\x38\x8f\x11\x91\x52\x9b\x75\x4a\xb0\x9d\xc0\x7b\xb4\xe6\x8a\xa7\x92\xd7\x3c\xcf\xd0\xf0\x12\x63\xaf\x21\x29\x2a\xb3\x23\xc6\x3c\x75\x14\xa8\x00\x41\xe3\xda\x1f\x64\xdd\x1d\x64\xcd\x35\x44\x11\x73\x62\x97\xea\x0c\xeb\x54\x67\x9d\x00\x73\x08\xf2\xc9\x99\x83\xd6\x53\x6c\x14\x59\x66\x60\x56\x3e\xc8\x5e\x51\xe5\x64\x02\x0a\x65\x5a\xfa\x89\xf3\x3a\xf0\x83\x40\xa9\xca\xc2\x6f\x1a\x67\x0c\xb8\xb7\x30\xee\xa7\xdb\x89\x05\x2b\xc0\x5f\x28\x9b\xd2\x2c\x65\xf9\x73\xab\x2a\xf1\x4a\xcb\xbd\x5c\x3d\xff\xbe\xad\xf5\xf3\x07\xcf\xd6\x2f\x40\x4f\xa7\x34\x1b\x18\xb1\x36\xf6\x4f\xb9\xda\x32\x2b\x96\x4a\x17\x4c\xd7\x65\xc9\x63\x00\x6e\xc4\xbe\xae\xb6\xf8\xde\x1d\x5c\xc1\x61\x00\x5a\x60\x5e\x60\x8b\xf3\x85\xc6\xd3\xbb\x38\xc9\xc2\xb1\x38\xe6\x9f\x4b\x80\x30\x89\x1a\xaf\xa1\xfc\xab\xe8\x51\x01\xa1\x81\x7f\xf8\x14\xa3\xf6\xa9\x06\xff\x05\x00\x00\xff\xff\x56\x39\xd1\xcf\xab\x07\x00\x00")
-func distAssetsChunk1789068d2f119b2a5a281b5JsBytes() ([]byte, error) {
+func distAssetsChunk178E64db8b78adc0145d64fJsBytes() ([]byte, error) {
return bindataRead(
- _distAssetsChunk1789068d2f119b2a5a281b5Js,
- "dist/assets/chunk.178.9068d2f119b2a5a281b5.js",
+ _distAssetsChunk178E64db8b78adc0145d64fJs,
+ "dist/assets/chunk.178.e64db8b78adc0145d64f.js",
)
}
-func distAssetsChunk1789068d2f119b2a5a281b5Js() (*asset, error) {
- bytes, err := distAssetsChunk1789068d2f119b2a5a281b5JsBytes()
+func distAssetsChunk178E64db8b78adc0145d64fJs() (*asset, error) {
+ bytes, err := distAssetsChunk178E64db8b78adc0145d64fJsBytes()
if err != nil {
return nil, err
}
- info := bindataFileInfo{name: "dist/assets/chunk.178.9068d2f119b2a5a281b5.js", size: 1963, mode: os.FileMode(420), modTime: time.Unix(1480000000, 0)}
+ info := bindataFileInfo{name: "dist/assets/chunk.178.e64db8b78adc0145d64f.js", size: 1963, mode: os.FileMode(420), modTime: time.Unix(1480000000, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
@@ -256,22 +256,22 @@ func distAssetsNomadUi5e1f695edd3f904b7aa332b07823351bCss() (*asset, error) {
return a, nil
}
-var _distAssetsNomadUiD5e967105da9cad5ea23f87d55ec3360Js = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\xfb\x76\xdb\x36\xf6\x28\x8e\xff\xef\xa7\x50\x78\x32\x3e\xc4\x04\x92\x2d\xe7\x32\xad\x66\x58\x37\xb7\x4e\x33\x9f\xa4\xc9\xc4\xe9\xe7\x33\x73\x34\x5e\x35\x44\x42\x12\x12\x8a\x60\x49\xd0\xb6\x22\x73\xad\xf3\x1a\xbf\x17\xf8\x3d\xd8\x79\x92\xef\xc2\x95\x20\x48\xea\x62\x3b\x6d\xd3\xa6\x6b\xb5\xb5\x08\x60\x03\xd8\x00\x36\xf6\xde\xd8\x17\xaf\xc8\x71\x2f\x67\x19\x09\x99\xb7\x17\xe1\x29\x49\xb0\xef\x25\x74\x81\xa2\x7e\x41\x0e\xd0\x84\xc4\x84\x11\x9c\x1f\xa0\x49\xce\x32\x14\x32\x0f\x8e\x3d\x7c\x99\xd2\x8c\xe5\x1e\xf4\xf0\x62\x82\xb3\x7e\x88\x12\x0f\x7a\xdf\x8a\x1f\x07\x39\xce\xce\x49\x88\xab\x0f\x74\xf2\x1e\xf3\x76\xf5\xdf\x07\x21\x5d\xa4\x05\xc3\x91\x77\x0a\xfd\x69\x91\x84\x8c\xd0\xc4\xc7\x90\x41\x02\x13\x98\x81\xd5\x39\xca\x7a\x31\xa4\x10\xc1\x1c\x16\x30\x84\x11\x4c\xe1\x02\x4e\xf6\x74\xdd\xde\x54\xd7\x06\x2b\xb2\xbf\xff\x5a\x40\x1d\xc8\x19\xbc\xc9\x68\x8a\x33\xb6\x14\x35\x56\x38\x29\x16\x38\x43\x93\x18\x8f\xc8\xa0\xfa\x01\x43\x9a\x4c\xc9\xac\xd0\x25\xf6\x4f\x78\x91\x11\xa6\xbe\xeb\x3f\xe1\x39\x8a\x0b\xfe\x81\x24\x84\x11\x14\x93\x8f\x38\x3b\xae\xfd\x1a\x84\x28\x8e\xfd\x04\x8c\xce\x29\x89\x7a\x87\x25\x28\xcd\x60\xe7\x8d\xa9\x05\xab\x72\x2f\xc3\xac\xc8\x92\x9e\x1a\xfb\x07\xbc\xcc\xfd\x04\x0c\xa6\x34\x7b\x8e\xc2\xb9\x6f\xa1\x05\xac\xe2\x31\x3e\x0d\x92\x31\x3e\x2d\x01\x80\xb1\x35\x8d\xe0\xce\x1d\xfb\x27\x8c\x6b\x13\x11\xa5\xb5\x99\xf9\x9e\x98\x87\x47\x92\x5e\x7c\x75\x15\xdb\xe3\x07\xfb\xfb\x7e\x6c\xe6\x1b\xdc\x39\x04\x30\x0e\xc8\x20\x8f\x49\x88\x7d\x30\xc8\xf0\x39\xce\x72\xf9\x57\x54\x84\xd8\x1a\xa0\x58\x05\x35\x1b\xb5\x8a\xe0\xea\x8a\x94\x00\xc6\x00\x66\xfb\xfb\x12\x21\x77\x82\xa0\xd6\x9f\xe8\x4e\x8c\xa6\xfe\xfd\x38\x6e\x62\x35\xd3\x58\x85\xb5\xc2\x40\x7e\x04\x50\xfe\x3f\x68\xf6\xd0\xbd\x31\x62\x3e\xbd\xa4\x88\xf9\xff\xcb\xae\x6a\xde\x4f\x3f\xe1\xfc\x15\x8d\x8a\x18\x7b\x70\x25\xb7\xc0\x9d\xc3\x12\x40\xcc\xeb\xa2\x22\x66\x6a\x08\x7b\x31\x66\xbd\x59\xe0\xc7\x81\x7f\x08\xb3\x41\x42\x19\xf0\x3d\x46\x3f\xe0\x64\x80\xc2\xf8\x79\xc2\x51\x1a\x79\x00\x52\x59\x8e\x7f\x2e\x50\x6c\x6a\xe4\x38\x9e\xbe\x13\x7f\xb1\x65\xca\xcf\xce\x02\x25\x68\x86\x17\x38\x61\x1e\x80\x88\x37\x49\x06\xfa\xc4\x00\xdf\xfb\x29\x41\x0b\x9c\xa7\x48\x9c\x33\x07\xc4\x1b\x1a\x93\x90\xe0\x7c\x30\x3e\xf5\x00\xcc\x1b\x6d\xd7\x56\x2f\x1a\xd5\xf3\x65\xce\xf0\x62\x30\xc5\x88\x15\x99\xae\x16\x06\x61\x8c\xf2\xbc\x87\x2f\x19\x4e\xa2\xbc\xc7\x06\x8f\x05\xa5\x58\xae\x42\x9a\xe4\x2c\x2b\x42\x46\x33\x5f\xee\x74\xb1\x1b\xf6\xf2\x22\xc5\x99\x3f\x18\x0c\x50\x36\x2b\xf8\xbc\x72\x00\xa7\x3e\x9b\x93\x1c\xaa\x2e\x3c\x18\x41\xfe\xbb\xfa\x2e\x46\xea\xc1\xd4\xf9\x3c\x59\xa6\x28\xcf\x1f\x17\x6c\x4e\x33\xf2\x11\xf1\x0d\xe8\xc1\x85\x53\xc9\xcc\xef\x45\xfe\xaa\xc2\x25\x9c\xa8\x6a\x24\xf0\xd4\xf2\x79\xd0\x67\x81\x57\xe1\x13\x90\xc4\xc7\x81\xa8\x75\xbc\x86\xa8\x28\x62\x00\x2d\xe2\x72\xe7\xb0\x4e\x52\xee\x1c\x56\x64\x84\x6f\x99\x11\x1e\xb3\xd3\x80\x94\x33\xcc\x7a\xd5\x02\xfa\xe6\xe0\xf0\x3e\x07\xe6\xfb\xb1\xc7\xa9\x72\x32\xf3\x82\x80\xef\x09\x3a\x75\xcb\xeb\x3f\x47\x62\xdd\x66\x98\x01\xbf\x5e\x00\xc5\xdc\x3c\x30\x32\x13\x16\x03\xc8\x8a\x18\xe7\xdf\xd1\xec\x07\x6b\x1c\x7c\x07\xcb\xa9\x0f\xaa\xf1\x29\x22\x25\xa1\xce\x30\xeb\xdc\x40\x1e\xb8\xba\x1a\x9f\x82\x01\xa3\x8f\xb3\x0c\x2d\x2d\x32\xe1\x73\x72\x10\x7c\x23\xe0\x67\x41\x35\x50\x02\x3d\x31\x8c\x7f\x9c\xbc\xfe\x61\x60\x06\xa2\x00\xc1\x58\x8d\x64\x4a\x92\xe8\x15\x62\xe1\x9c\x24\xb3\x6a\xb4\x19\xc4\x40\xd3\xcf\x78\x7f\x9f\x0d\xd2\x22\x9f\xfb\xd9\x80\xd7\xf6\x7d\x1c\x7c\x83\x05\x44\x4e\x10\x00\x00\x90\x95\x00\x8e\x4f\x81\x98\x7a\x88\x52\x73\xaf\x7d\x47\xb3\xc7\x71\x5c\xf5\x6d\x56\xe3\x46\xf3\xc5\x90\x81\xe0\x1b\xdf\xb7\xd6\x64\xdd\x54\x2d\x92\xcf\x24\x9a\x56\x4f\xad\x31\x8e\x48\x19\xb0\x3d\x1c\x60\x4e\xc8\x43\xc4\x7c\x02\xf8\x25\x80\x81\x9c\x92\x59\xa9\x17\x49\x18\x17\x11\xce\x4d\xdb\x25\xbf\x38\xec\xcd\xd5\x58\xf4\x41\x4e\x17\x58\xf4\x5a\x1f\xab\xdd\xbd\x1e\x23\x51\xe0\x7d\x0c\x80\x44\xa4\xa6\x09\xce\x16\x76\x28\x46\xa9\xfe\x78\x91\xbf\xc9\x70\x8e\x13\xe6\x8e\xca\x90\x16\xab\x87\xb2\x63\xd9\x39\x66\xc5\x3e\x22\x01\x1e\x2c\x50\xfa\x64\xe9\x7b\x3f\x88\xfd\xbd\x47\xa6\x3e\xa9\x40\x30\x00\x74\x1f\x82\x32\x27\x01\x19\x4c\x49\xcc\x70\xa6\x76\x87\xa9\xe9\xfd\xd9\x03\xa0\xb6\x78\x66\xb3\x26\x41\x82\x2f\x7a\x6f\xf1\xec\xf9\x65\xea\x93\x41\x86\xd3\x98\x0f\xe2\xe0\x3f\x7f\x3e\x98\x41\x6f\xc0\x1b\xc2\x2c\x60\x83\x18\x27\x33\x36\xef\x13\xf5\x87\xde\x97\xd9\xdf\xf0\x60\x41\x73\xa6\xa7\xf1\x74\x8e\x38\x0b\x85\xb3\x67\x64\x3a\xc5\x19\x4e\x42\xcc\x77\xee\x82\x17\xfb\x09\x38\x5e\xd9\x95\xcd\x9c\xf9\x1f\x23\x02\x37\x00\x1a\x65\xe5\x08\x97\x00\xae\x81\xc1\xaf\xba\x8d\x60\x7e\x28\x38\x93\x36\x78\xf5\xf8\x5f\x3f\x9d\x3c\xfe\xee\xf9\x4f\x2f\x7e\x78\xf7\xfc\xef\xcf\xdf\x96\x60\xd0\x09\x58\x4f\x37\xb9\xba\xb2\x57\xc0\xd0\x1b\x70\x6c\xfe\x54\x77\x38\x28\x4b\x18\x05\x73\x3f\x1c\xa4\x19\x65\x94\xd3\xb7\xea\x16\x18\x73\x18\x9c\xee\x9e\xc2\x95\x4b\x4f\xeb\xd4\xd6\xa2\xae\xd0\xba\xf4\xc5\x44\x4b\x00\x53\xb7\x07\x75\x9f\xdc\x5a\x07\x0b\xb7\x83\xd6\x9b\x69\x1c\xdf\xb4\x9f\x49\x03\x55\xed\x97\xdb\x98\xde\xb4\x27\xa7\x9f\x06\xbd\xf0\xe0\x18\x9d\x42\x75\x2d\xce\x30\x7b\x7d\x91\xe8\x6b\xf1\x19\xce\xc3\x8c\xa4\xfc\xde\xdf\x00\x03\x40\xab\x42\xa3\xcf\x75\xd4\xd9\x83\xe3\x7c\xc7\xee\xd7\x82\x5b\x3f\x12\x4d\x97\x3c\x38\x2e\x76\xec\xd5\x34\x75\x7a\x08\xc1\x5e\xc5\x37\xce\x38\x15\x5f\x27\x72\xcd\xe4\xaa\x5a\xf2\xd6\x5a\xc1\xec\x06\x02\x97\xe4\xd4\x32\x28\x04\xae\x4a\xc4\xca\xbf\x48\x2d\x7f\x04\xa9\xa5\x08\x7c\xc5\x96\xd1\x0c\xf8\xed\x54\xac\x8b\xe6\x78\xa9\x62\x87\x14\xf7\xf1\x98\x6f\xda\xb7\x18\x45\xaf\xb3\xff\xc9\x08\xe3\xa7\x5d\x48\x44\x64\x6b\x11\x84\x36\x64\x0b\x35\xe4\x2e\xd9\x02\x26\xad\xd2\x85\xe4\x64\x21\x0b\xbc\x10\x25\x7c\x44\x1e\x4c\xe4\x27\x9f\x04\x08\xfc\x56\x55\x06\x9c\xb1\xda\x80\xd3\x8a\x49\x15\x88\x35\x4c\x7f\xa7\x28\xd8\x64\x55\x17\x28\x15\x7c\x50\x05\x00\xdb\x1c\xaa\xe8\x71\x20\x9a\x2f\x05\x77\xc4\x17\x0f\x85\xcc\x07\x8a\x63\xc4\xc1\x37\x5e\xc6\x71\x1a\x04\x01\xbe\xba\xf2\x2e\xc4\x5a\xf3\x1f\x80\x5f\xee\x28\xc8\x7d\x5a\x27\xc3\x6a\x09\xc6\xd9\x4d\xef\x28\x07\xf2\xa6\xfd\x27\xee\xdf\x4d\xc4\x7b\x27\x88\x00\x52\x9b\xa6\x53\x9b\xa6\x17\x9b\x68\x7a\x1c\xd3\x50\x33\x06\x5f\x08\xfb\x17\xc2\xfe\xdb\x27\xec\x27\x45\xca\x77\xe9\xf3\x4b\x1c\xb6\x12\xf3\xa6\x50\xf9\x2d\x46\xe1\x7c\x10\xd6\x64\xc8\x4f\x43\xd6\xc5\xa0\x3e\x3b\xb2\x6e\x61\xd4\xdf\x4e\x40\xc7\x52\x40\xaf\x48\xf5\x5a\x01\xdd\x13\x54\xa6\x8f\xc5\x8a\x75\xd2\x63\x89\xbb\x4f\x46\x8f\xed\x6d\x73\x7d\x1a\x5c\xdf\x7c\xd7\xa7\xbb\x61\x4c\x7e\x1d\x66\x5a\xbe\x5e\x54\x94\x37\xfa\x9c\x5e\x2d\xd2\x2f\xd7\xc4\x1f\xe1\x9a\x58\xdc\x22\xff\xff\x03\x8d\xb0\xe0\xf4\xd4\x55\x71\x5b\x30\x0d\xeb\xb5\x9b\x30\x81\x76\xab\x9e\x6f\x79\x49\xb5\x5d\x4c\x91\xe2\xc1\x0d\xab\x5b\xa8\xb7\x06\xab\x40\xb1\xa4\xa1\x2c\x69\xe3\xf5\x35\xfe\xaa\x8b\x61\xb2\x8d\x2a\x1a\x8e\x25\x3b\x0e\x15\x27\x7e\xda\x09\xbc\x2e\x41\x6c\x0d\xdd\x80\x2d\x61\x11\xa4\x7e\xfe\x89\x98\xfb\xb0\x05\xb6\xc5\xc7\xdf\x50\x21\x58\x07\xdd\xb5\x73\x85\x1e\x6d\xd3\x6d\xb5\x15\x24\x00\x73\xfb\xc6\xda\xdc\xbf\x9e\xea\x16\x4a\xb6\xed\x40\x39\x23\xc8\x41\x75\x13\x4d\xcc\x8b\x8f\xd9\xc4\x4a\x7f\xfd\xcd\xa1\x45\xfb\x4c\xe1\xf8\xf0\xf4\xd8\xfe\x31\x1a\x9f\x42\xd6\x6c\x3b\x6c\x6d\x3b\xb4\xdb\x0e\x79\xdb\x3d\x71\xa2\x7a\x49\x80\xb7\x17\x4b\xf9\xbc\x5a\xa5\x52\xa3\x82\xae\xf8\x25\xe6\x3c\x58\x54\x94\x6f\xb1\x81\x57\x78\x4f\x27\xbf\x1a\xa3\xa0\xcd\x1c\xe0\x14\xce\xab\xa5\x9a\x7d\x4e\x4c\xc3\xf2\x0b\xd3\xf0\x47\x60\x1a\xce\x6f\x51\xb6\x7c\x5b\x24\x09\x49\x66\x37\xe2\x19\xf2\x14\x87\x64\x4a\x42\x23\x3a\x29\xd8\xb9\x06\xde\xe8\xf5\x24\x44\xb1\xec\x95\x5e\xb3\x57\x63\x9a\x71\x73\x14\x3c\x23\x79\xaa\x1e\xd7\xb4\xd5\xc6\xf6\x6c\x4b\x71\x5d\xa1\x3c\xbc\x6e\xc3\xe8\xba\x0d\xd3\x1b\x70\x58\x33\x8b\xc3\x2a\x2c\x9b\x0f\xeb\x3b\x5f\x53\x5c\x99\x79\x58\x25\x2f\x49\xce\x1e\xc7\xb1\x07\xa7\xcd\x32\x8d\x7c\x0f\xce\x15\x67\x26\x56\x67\x59\x3d\x15\xa9\x8b\xf5\x0d\xce\x16\x24\xcf\x09\x4d\xf2\xee\xdb\x73\xeb\x1b\x50\x29\x71\xaf\x7d\xfd\xee\xa0\xd0\xb5\x1f\xbd\x00\x18\x4c\x63\xc4\x74\x23\x43\xd9\x6e\xc8\x0e\x54\x44\x1e\x0f\x6c\xf5\x44\x59\xf5\xe7\x6a\x91\x59\xed\x21\x9e\x69\xbb\x82\x76\xea\xe0\xa8\x4a\xb6\x58\x21\x51\xaf\xe3\xe0\xc0\xb1\x97\x17\x93\x05\x61\x7d\x7e\xdd\x2b\x76\x79\x13\x0d\xe9\xb2\xd5\x69\xb1\xbc\xb0\xa1\xb7\xce\x4a\x51\x9f\x9d\x40\xf2\xcd\xdd\x0d\xd1\x22\x21\xbb\x40\x8d\x54\x33\x05\xb8\x84\x8b\x60\xe9\xa7\x2e\x7f\xcf\xcf\xdb\xcd\xd9\xfb\x49\x0b\x68\x75\x64\x6f\xce\xde\x4f\x5b\x80\x9b\x53\x7f\x0b\x6f\xe3\x2d\xe0\x2b\xc2\xc1\x59\xf6\x9b\xc1\x77\xa0\x77\x5c\x91\x5b\xbd\x80\x6f\x03\x08\xc0\xd4\x96\x0c\x9c\xde\x37\xdf\xa6\xdb\xbc\x89\xef\x06\x72\xfd\x88\x3a\x2e\x6f\x38\x0e\x6f\x86\x8f\x8a\x0b\xd8\xa1\x77\xfb\xb6\x86\xe3\xe8\x66\x23\xa8\x5f\xfd\xb5\x51\xa4\xb6\x8e\xf3\x7c\x83\xdc\x92\xe1\x90\x2e\x16\x38\x89\x7e\xad\xf7\xa5\x2f\xba\xce\x2f\x62\xcb\x6f\x5d\x6c\xa9\x74\x9d\x28\xe1\x6c\x6b\xb4\x4c\xd0\x82\x84\x8f\xd3\x34\x26\xf2\x61\xf6\x84\x7c\x24\xc9\xcc\x58\x2b\x7a\xd0\x9b\xa3\xdc\x62\x2b\x6e\x45\xb3\xa9\x8e\xfe\xe3\x30\xc4\x29\x23\xc9\xec\x75\xf2\x38\x59\xda\x26\x52\x4d\x3d\xe7\x3a\x4b\xa6\x2e\x65\x67\xdd\x6a\xfb\x96\xb4\x9b\x72\xd0\x4d\xfd\xa6\x83\xa6\x56\x2d\xe7\xfa\x79\x3b\x6c\xcb\xda\x19\x57\xaf\x5d\x0d\x4e\x6b\xe3\x9a\xfa\xad\x06\xa8\x55\xb1\xf7\x4c\x42\xe8\x59\x20\x7a\x12\x86\xd7\xa5\x01\xd5\x58\xf9\x04\x3a\x50\x17\xb1\x9f\x4c\x13\xba\x61\x57\x5e\x5f\x31\xba\x71\xbb\xaf\xd3\x93\x6e\x71\x44\x77\x56\x98\x6e\x86\xd9\xd4\x9c\x6e\xd4\x20\x46\x28\x65\x38\xcb\x0f\xfa\xef\x73\x9a\xf4\x51\x4a\xea\x77\xb0\xbc\x55\xfb\x11\x62\x48\xd7\x3d\x30\x35\x9d\xbb\x15\xac\x76\x26\x77\x9d\x0d\x8c\xa3\xc3\xaa\xbe\x47\x66\x98\x8d\x2c\xe1\x4f\x9f\x08\x3d\xcb\xb2\x04\xeb\xa7\xb9\xd6\x3e\xd1\x54\xaa\x30\x7c\x0b\x73\x6c\x90\x74\x49\xd0\xc8\xf6\x56\x05\xad\x36\x05\x24\xf0\x41\xf0\x8d\x27\x26\x74\xb0\x10\xcb\x94\x4b\xbf\x90\x14\xb1\xf9\x77\x34\x7b\xb7\x4c\x7f\x09\xcf\x90\x22\x8b\xbf\xa3\xd9\x77\x24\x89\xde\xe2\x90\x66\x91\x0f\xe4\x34\xc6\x70\x30\x18\xe0\xd3\x4a\xf8\xde\xb3\xc9\x57\xd5\xea\x71\x1c\xf3\x99\x61\x50\x5a\xea\x6e\xb2\x61\x15\x37\x5a\x24\xe9\x9a\x17\x9c\x49\xe5\x63\xb6\x4b\x0b\x46\xe2\xfc\x00\x45\x51\x9f\xd1\x3e\xc7\x56\x93\x4b\xbc\xbd\x75\x4e\xb6\x5e\xe7\x4d\xb6\x23\x39\xa3\xa9\x07\x93\xa0\xc6\xc0\x61\xd6\xbb\xf6\x83\x86\xf7\xe6\xf5\xc9\x3b\x4f\xaf\x8b\x01\x9b\xa8\x15\x94\x7e\x2f\x44\x8f\x5a\x39\xe9\x34\xd6\x3b\x19\x90\x08\x7a\xd6\x92\x00\xcb\xcd\x45\x34\x41\xef\xd1\xa5\x9f\x41\x06\xca\xd2\xf7\x0e\xc4\x34\x00\x64\x3d\x92\xf4\xf0\xe6\x4d\x99\xec\xbe\x29\x93\x32\xc3\x39\x43\x19\x93\x27\x56\x4e\x86\x04\x67\x77\x57\x67\x77\x57\x62\x44\x73\x9a\xb3\xab\x2b\xef\xc0\x2b\xd5\x87\x22\x8b\xdf\x64\x78\x4a\x2e\x7d\x50\x9e\x95\xca\xf4\xc2\xda\x67\x07\x77\x57\x78\x40\xa2\xf2\x40\x41\x3e\x6b\x4e\x90\x40\xef\xcd\x8f\xef\x3c\xb8\xe2\xc4\x72\xc4\xf6\xf7\x57\xef\x50\xfe\x41\x78\x31\x08\xba\x14\xe7\x72\x38\x76\x43\xe5\x6b\xa7\x18\x31\x1c\xbd\xc5\x3f\x17\x38\x67\xfe\xd9\xc1\xf9\x50\x0f\x62\x9a\x1f\xc4\xb9\xee\xff\x98\x6f\xd7\xe0\xee\x0a\x27\x21\x8d\xf0\x8f\x6f\x5f\x3c\xa5\x8b\x94\x26\x9c\x01\x60\xa0\x3c\x03\x03\x36\xc7\x89\x9f\x81\x32\x67\x88\x5d\xbb\x3f\xde\x78\xe7\x1e\x4b\x94\x2f\x93\xd0\x6c\xa3\x5e\xc6\xf7\x27\x99\xfa\x78\x40\x3f\x00\xa3\x65\xe3\x97\x87\x0f\xf6\xd4\xa2\xb0\x00\x5d\x20\xc2\x7a\x78\xc0\xf0\x25\xf3\xc1\x1e\x9b\x67\xf4\x62\xc5\x7b\x1a\xe1\x01\x1f\x46\x91\x43\x46\x4f\x84\x57\xd9\x88\x13\x3c\x56\xda\x74\x22\xd9\x40\x27\x2c\x42\xde\x72\xad\x6d\xf6\xfb\x55\xee\x6c\xed\xf7\x20\xdf\x0a\x4d\xb2\xc2\xc7\x9e\xf7\xa7\x34\xeb\xe3\x2c\xa3\x59\xb3\x42\x86\x17\xf4\x1c\xf7\x33\x71\x7a\x9a\xc5\x09\xed\xc7\x18\x45\x58\xb7\x6f\x75\x35\x96\xb2\xab\x24\x1d\xea\x0d\x6e\xaf\x29\x15\x7e\x0e\x22\xec\xe2\x8b\x08\xfb\xbb\x15\x61\x71\xa5\xc4\xd5\x77\xa2\xfd\xc9\x3b\x1f\x7a\x42\xbe\x9d\x04\x7e\xf7\xe3\x51\x98\x61\x26\x9e\x8b\xea\x72\x60\x76\x4d\xa6\x89\x77\xfa\x4b\x7b\xcf\xc2\xd4\x71\x1a\x56\x52\xa6\xf9\xae\x9c\xbc\x22\x4b\xf8\x9c\x0b\x1a\x90\x6b\x6e\x4a\xfb\xb8\xd6\x6c\x5e\x24\x6a\xf6\x38\x8d\x55\x04\x76\xe5\xfd\xab\xff\x83\xa0\x27\x42\x90\xf7\x46\xb8\x2c\xe7\x28\x89\x62\xfc\x16\xe7\x29\x4d\x72\xac\xd9\x1b\xb5\x27\x1f\x1e\xf2\xad\x81\xf7\xf7\x49\x10\x04\x68\xf0\xc3\xeb\x9f\x5e\x3e\x7f\xfc\xec\xf9\xdb\xe3\x04\x5f\xf4\x90\xc6\xf1\x48\xe0\x72\xe0\x40\xaa\xa1\xb6\x9c\x2a\x5e\xce\x80\x96\x6d\xa6\x15\x8b\x57\x55\x1e\x84\xc2\x7d\xd0\xc7\xc1\x37\xfc\x86\xf0\xf9\xde\x35\x5c\x06\xb6\xad\x42\x1f\x1e\x0e\x3d\xed\x15\x39\x3e\x95\xd7\x43\x0f\x97\x00\x94\xfc\xce\x7d\x9d\x32\xf1\x68\x62\x79\x58\x36\x58\xa1\xa3\x56\x56\xe8\xc8\x66\x85\x8e\xc4\x43\x90\xf0\xc5\xe4\x04\x5e\xb8\x04\xf2\x3f\x82\x55\x09\x60\x85\x76\xe5\x23\x9a\xcf\x69\x11\x47\xea\x55\xe2\x2d\x9e\x09\x96\x07\x98\x0b\xad\x51\x1f\x85\x8c\x9c\x9b\x8a\x7b\x6c\x7f\xdf\xc7\x41\x5d\xa6\x90\xf3\xeb\x0f\xef\x04\x01\x1e\x90\x24\xc2\x97\xaf\xa7\xbe\x77\xec\x81\xe3\xb3\xbb\x2b\x5c\xee\x67\xa2\x71\x70\x77\xc5\xca\xb3\x91\xf8\x74\x6c\x7f\x2a\x05\x14\x50\xd6\x10\xef\xe0\x07\x12\xb9\x44\xdf\xa3\xfc\x15\x4a\x96\xd5\x15\xd1\x58\x2d\x5d\xa3\xbe\x62\xe2\x96\xf7\x49\xf0\x8d\xe1\x0d\xa5\xdf\x3f\x8c\x03\x36\x90\x77\xd9\x80\x24\x82\x0e\x7e\x47\x33\x3f\xe1\x44\xdb\x76\x76\xc6\x83\x14\xe3\x0f\x8f\x05\xc1\xaa\x3b\xb5\x72\x5c\x9d\xdd\x5d\xc5\x82\x32\x94\x03\x12\x9d\x81\x20\x08\xd8\x80\x44\xc0\x71\x32\xf6\x0f\x21\xb5\xf6\x09\x67\x28\x01\x80\x5c\x56\x68\x4a\x21\xd5\x96\x80\x59\x50\x79\x66\x73\xc6\x0f\xd2\xc0\xe5\xf9\x0c\x37\xb7\xbf\xef\x13\x15\x4e\x00\x2d\x30\x27\x95\xc0\x67\x00\x92\xfd\xfd\x4c\x7a\x6b\x13\x00\x20\x36\xbf\x5a\x98\x22\x0c\x00\xa4\xbc\x42\x91\xe4\x73\x32\x65\x3e\x05\x30\x0b\xb2\xc1\x7b\x4a\x12\xdf\x3b\xf0\x00\xbc\x13\xef\xef\x67\xfb\xfb\xde\x81\x77\x27\x08\xb2\x41\x38\x47\xd9\x63\xe6\x1f\xf2\x4b\x26\x0b\xbc\x03\xef\x5e\x06\x60\xa6\x66\xf4\x63\x1a\x21\x86\x8d\x64\xd5\x2e\x42\xa9\xe2\xfa\x79\x2c\x61\x18\x2c\xfc\xa2\xd5\x5b\x95\xdd\x92\x33\x69\xe4\xf6\xa0\xbd\x55\x6f\xab\x03\x07\xbc\x22\x8a\xdb\x3d\x28\xb5\xb6\x04\xb0\xb0\x35\x24\x85\xad\x21\x99\xac\x67\x26\x23\x9c\xc6\x74\xb9\xd8\x42\x7f\x50\x09\x9d\xbf\xa8\xf6\x60\x8a\x48\xcc\x39\x22\x4d\x89\xe4\xd1\xf2\x48\xe4\xf1\x8b\x2f\xe9\x10\xdf\x18\xf4\xac\x99\x01\xe8\x1d\x70\x38\x5e\x8b\x04\xc7\x05\x1c\x2e\x30\x2a\x09\x67\xf5\xcc\x34\x7b\x11\x49\x11\x27\xcd\xe8\x82\x32\x7c\x1b\x83\x50\xa0\x76\x1f\x07\x7c\x1c\xc7\x1c\x75\x25\x28\x2b\x2e\xf3\x16\x64\x65\x4f\x1a\xff\x8d\x09\x4c\x4e\x03\x3c\xc8\xd3\x98\x30\x41\xa3\x61\xc6\x59\x41\xf9\xf3\x40\x28\xda\xb3\x41\x4a\x53\x1f\x08\xde\x86\x72\xb1\xd3\x3a\xfd\x5c\xe0\x2c\x0f\xee\xae\xe2\xd2\x88\x90\xc9\xfe\xbe\x4f\xef\x05\x67\xc7\x77\x57\x49\x79\x06\x20\xdd\x5e\x11\x82\xf9\x4e\xd9\x4a\x11\xf2\xab\xe9\xb4\x9a\xec\x47\x25\x91\x6f\x66\x2b\x34\x8e\xc8\x60\x81\xf9\x85\x9c\xe0\x4b\x26\x58\x9b\x11\x1b\x7b\x97\x7d\x39\x4f\xfe\x51\x52\x9e\xd3\x12\xb6\x68\xa4\x14\xcb\xc3\x59\xc3\x64\x4f\x5f\x5f\x64\x80\x18\xcb\x7c\x9b\x0f\xbc\xba\xaa\xf4\x8e\x31\x5f\x37\x39\xbe\x0d\x84\xf6\xb8\xe2\x68\xef\xae\x32\x6b\x59\x8b\x38\xbe\x13\x04\x7e\xc2\xbb\x92\xcb\xa0\xee\x63\x60\xed\xb8\x64\x7f\x3f\x19\x64\x38\x46\x0c\x47\xfc\xb6\x8f\xf9\x6d\x2f\x7e\x05\x2c\x2b\xf0\xd9\x28\xde\x41\x2f\xf6\x9e\x4e\xfa\xb9\x32\x4d\xd8\x8e\x42\xf5\xcd\xe0\xfb\x24\xca\x7f\xd9\x9d\xd1\xb5\x4e\x35\x8e\xa4\xa5\x92\x27\x8c\x5d\x09\x94\xb6\x25\xde\x2e\x8a\x43\x81\xa0\x62\xb1\x40\xd9\xf2\x0f\x82\x22\x35\xd9\x5d\x91\xc4\x19\xb9\x1d\xa9\xca\x6f\x49\xc1\x2a\x24\x72\xf6\x8e\xda\x37\x91\x8c\xf3\xc2\x68\x86\xf5\x71\xe4\x8c\xaa\xc0\x14\x80\x89\xab\xea\x6c\xc1\xaa\xbc\xc9\xde\xd3\xc9\x40\xdc\x66\xaa\xa5\x77\x20\x3b\xf3\x00\x1c\x67\xa7\x81\xb0\x5c\x4b\x51\xc6\x49\x5d\xbd\x41\xcb\x4d\x96\x38\x37\xd9\x3f\xe8\xe4\xc5\xb3\x51\x06\xff\x41\x27\xff\x2d\x17\x60\x84\x07\x89\x88\x6e\x22\xee\xb3\xad\x15\x5f\x6b\xcc\xc1\x37\xed\xef\xb5\xcb\xd8\x28\x94\x0c\x70\xbb\x95\xc5\x6d\x2d\x70\x76\xe3\x97\x92\x95\x3a\x06\x23\xef\x40\x1f\x88\x52\x28\x01\x04\xa9\xe5\x24\x79\x4e\xd2\xef\x50\x1c\x4f\x50\xf8\xe1\x25\x49\x3e\xe4\xbf\xc0\xc3\xc9\x14\xb3\x70\xfe\x16\x5d\x3c\xe3\x60\x89\x56\x67\xd5\x76\x6b\xd7\x1e\xb4\xf6\x5f\x73\x53\x31\xe8\xfd\xfd\xf9\x3b\x0f\x94\x53\x9a\x85\xf8\x0d\xce\x08\x8d\x48\x68\x94\xb1\x02\x40\xaa\xbe\xda\x82\xeb\x36\xba\xfe\x66\xff\x9c\x55\x53\xc0\x0e\x44\x87\x1d\x43\x12\xfb\x1c\x94\x65\xce\x68\x7a\x6b\xf3\x7c\xf6\xfc\xe5\xf3\x77\xcf\x3d\x50\xaa\x03\xb7\xe5\x64\xb8\x14\x5a\x8d\x9e\x37\xb5\xee\xf0\x3f\xaf\x9b\x80\x75\x50\xbf\x7f\xfa\x72\x84\xe1\x53\x94\xd0\x84\x84\x42\x6a\x51\x5c\x67\x1a\xa3\xa4\x83\x03\xbe\xba\x52\x3f\x7e\x22\xd1\x13\x3c\xa5\x19\x3e\x41\xe7\xd2\x84\x2a\xb1\xe8\x13\xdc\xee\xe1\x85\x59\x4b\x10\xa3\xa4\x6d\xdc\x59\x73\xdc\x23\x3d\x84\x04\x5b\x5b\x8f\x93\x2d\x0f\xc0\x67\x64\x3a\x95\xd3\x50\x02\x3f\x0e\xbe\xf1\xf1\xe0\xc5\xb3\x80\xc1\x44\x88\xbc\x6f\xd0\x32\xa6\x28\x12\xf8\xeb\x8b\x6e\xe1\xea\x3d\x9d\xbc\x89\x51\x92\x8f\x84\x16\x96\x57\xc4\xf8\x83\x1a\xa4\x55\x8f\x01\x00\x40\x99\x15\x89\x1b\x4c\x4b\xa2\xb8\x9a\xe3\xd3\x0c\x57\x42\xaf\x9e\xe3\x2e\xf3\xe0\xcb\x50\x08\xc9\x79\xe7\x85\x68\x59\xfb\x6a\x60\x35\x69\xbc\x42\xff\xae\x43\x13\x7c\x8b\xa0\x1f\x42\xeb\x2d\xc7\x17\x5f\xff\x00\x2a\x3e\xa8\x39\xf4\xd8\x19\xdb\x53\x5a\x24\x6c\x94\xc0\x57\x38\xcf\xd1\x0c\x8f\x32\xf8\x0e\x65\x33\xcc\x46\xab\xbf\x67\xb4\x48\x47\xac\x84\xaf\x30\xaf\x78\x42\x8b\x2c\xc4\x23\x43\xed\xbd\x92\x8f\x5b\x5b\xdd\x8a\xa1\xdf\xc6\xc0\x35\xc0\x6d\xc6\xae\x36\x9e\x8c\x19\x38\x41\x39\x7e\xf4\xe0\xb9\xb8\x7c\xe4\xe3\x10\xf0\x33\x20\x07\xcf\x9c\xab\x32\x5b\x7f\x55\x5a\x51\x29\xaf\xfd\x94\xec\xbe\xf9\xfc\xc2\xdc\xce\xb4\xce\x1f\xb6\x29\xf5\xda\x24\x97\xa6\x16\x96\x6c\xa1\x85\x5d\xc9\xb8\x6c\x65\x09\x76\x61\x48\x12\xce\x25\x7c\x96\x6f\xf5\x39\x66\xcf\x63\x32\x23\x93\x18\xbb\x74\xcb\x14\xa9\xc0\x85\xf0\xce\x21\x28\x73\xcc\x5e\x24\x78\xeb\x16\x43\xd1\xa2\xfe\xd1\x48\xc8\x0d\xae\xb4\xe3\x68\x91\x88\x63\x2c\xc2\xe2\x50\xe1\x0a\x56\xdb\xb9\x72\x79\xce\x1f\x68\x84\x5f\x3c\x1b\x09\x20\xd6\x30\x46\xec\xd8\xd3\xb3\xf0\x46\x1e\x31\x53\xf2\x04\x25\xc8\x10\x49\x6e\x3c\x52\x01\x65\xd7\x31\x3e\xe3\x8d\x4e\x52\x1c\x8e\xd4\xaa\xa3\x3c\x27\xb3\xc4\x5f\x3d\xc3\x28\x8a\x49\x82\x47\x87\xf0\xc5\x2c\xe1\x24\x5d\xa8\x3b\xff\x41\x27\x39\x5f\x74\x61\x7e\xa0\x98\xa2\x67\xd5\xf0\xed\xbe\xf5\xac\x1c\xc0\x25\x67\xf4\x0c\xf4\xfe\x90\xef\xfc\x10\x25\x21\x8e\x15\x9c\x5d\x79\xa8\xed\x90\xe0\xf2\x1c\xed\x48\x10\x8a\xd2\x9d\x64\x83\x34\x2e\x66\x64\x07\xc3\x99\xdf\xb0\x05\xd4\x8a\x2d\x53\x3c\xf2\x44\xfc\x61\xc9\xd0\xff\x5c\xe0\x6c\xf9\x06\x65\x68\x91\xbf\xa3\x8f\x19\xcb\x7e\x09\x4e\x7e\x7b\xd1\x5a\x3a\x00\xfd\x66\x75\x75\x6d\xd8\xdf\x10\xd3\x86\xd8\x2f\xa9\x9c\x8b\xad\x1e\x78\xef\x79\x07\x28\x8c\x3d\x48\xd6\x5b\xfa\x90\xeb\x5a\xfa\x90\xd3\x20\xd9\x01\xf7\x75\x57\x83\x6d\xd5\x40\xbf\xa9\xb5\xd8\x60\x0b\x58\x9f\xe1\xaf\x6c\x0d\x68\xbf\x05\xb7\xa8\x52\x1b\x6f\xc2\xb6\x1e\xf5\xcf\x67\x8a\x7d\xaf\x6b\xbd\xf4\x55\xe3\x80\xab\x8b\x0b\x0d\x24\x10\x50\x8a\x55\x5c\x9e\x09\x4d\xfd\x5c\x3d\x6f\x36\x2a\x02\x1d\x9b\x97\xa8\x40\x20\x56\x5d\x7c\x29\x58\x21\x41\xc2\x6b\x6d\x64\x14\x23\xbb\x21\x0d\x56\x8f\x79\x6f\xa3\x6c\x20\x2d\x7d\x24\xa2\x73\x3f\xe6\xe2\x55\xbe\x20\x79\x3e\x8a\xcb\x8d\x77\x1e\x2d\x77\x51\xd9\xe9\x77\xb7\x75\x26\x4e\x3b\x6a\xef\x28\x63\x7d\x7c\x19\xce\x51\x32\xc3\xdd\xa6\x48\xc6\x97\x66\xef\x76\x5c\x1d\x68\xe0\x67\x8e\xa5\x07\xd9\x64\x36\x09\x33\xe9\xc8\xb3\xd9\x7c\x32\xc3\x1e\xcc\x54\xe0\xad\x24\x88\xb7\x0e\xbc\x95\x74\x5a\x47\x25\x1d\xd6\x51\x89\x6b\x1d\x95\xd4\xec\x78\x92\x35\x76\x3c\x25\x50\x0f\xd4\x10\xd5\x68\x6b\x1e\x90\x26\x6d\x45\x9c\xb6\xd2\x8e\xc3\xcc\xb1\xa2\x30\x9e\xef\x74\x98\xe9\x18\x9d\x06\xb9\xb0\x17\x38\xc1\xf1\xd4\x6f\x11\xd7\xb5\x25\xe5\xa4\x20\x71\xf4\xe3\xdb\x97\x3e\x28\xe5\x2e\x3c\xc8\x71\x3c\x3d\x53\x3a\xa8\x4a\x8b\xd0\xa2\x86\x35\x67\xa0\xae\x58\x50\x7b\x79\x25\xfe\xaf\x75\x0a\xac\xa6\x53\x50\x55\xd8\x20\xa1\xd9\x42\x20\xd1\x7c\xc3\x40\x98\x6e\x0c\x48\x04\x38\x9f\xa6\x77\xf0\xeb\x04\xbf\x23\x0b\x2c\x9e\x8e\x5a\xd5\x0f\xdd\xf3\xa1\x09\x66\x64\x81\x0f\x34\xa8\x33\x87\x2f\x53\xa0\x4f\x84\x39\x0e\x67\xd0\x6a\xda\x13\x11\x19\x5d\xbd\x58\x95\x01\xde\xd3\x4f\x5f\x4d\x34\x90\xf5\x68\x60\x1c\x0d\xa4\x0d\x0d\xa4\x05\x0d\xac\x86\x06\x2d\xe9\xf1\x5b\x62\x25\x6d\x68\x12\x7c\xd1\x4b\x8c\xd9\xbc\x0a\xb8\x96\x59\x4f\xe6\xb9\x39\x31\x45\x60\xbd\xe7\x87\xc1\x4d\x5e\xf4\x61\x1a\xac\x4a\x68\x9b\xf5\x85\x1d\x66\x7d\xe9\x18\x9f\x06\xa1\x32\xeb\x4b\xeb\x66\x7d\xf6\x4f\x98\xba\x66\x7d\x69\xa7\x59\x5f\x7a\x75\x95\xba\x66\x7d\x69\xdd\xac\x2f\x0d\x8a\x6d\xcc\xfa\x6a\xa2\x83\x8f\x60\x0e\x31\xb8\xba\xc2\x25\x80\x29\x80\x91\xf5\xbc\x97\x3a\x46\x77\xa9\x32\xeb\xab\x7d\x3f\x4e\x9b\xe4\x20\x32\x66\x7d\xe9\x7a\xb3\x3e\xb7\x87\x76\x52\xc0\x87\x98\xf2\xe9\x29\xb3\xbe\x20\x85\x19\xd8\xe3\x24\xd4\x0a\xe2\x62\xd9\x42\xd0\xf5\xf7\xcd\x39\x8d\x8b\xc5\xe7\xf1\xca\x78\x7d\x89\x02\x4a\x49\xe9\x27\x12\x8d\x3c\xf9\xe7\x80\x44\x9f\x87\x9c\xd1\xf9\xb8\xb3\x23\x87\xd0\x29\x05\x9a\xf7\x74\x98\xdd\xd2\xcd\x1f\x07\x7e\xb2\xe3\xcd\xbf\x39\xdc\xa6\xb6\x78\xaa\xa2\x6d\x66\xbf\xd9\x68\x9b\x3b\x19\x50\xda\xda\x79\x43\x3f\xf9\x75\x83\xab\xb0\x19\x55\xba\x18\x95\x7a\x03\x94\x62\xdb\xea\xf5\xe3\x37\x53\x95\x8b\x25\x29\x03\xb2\x57\xeb\x59\x56\xde\xbd\xdf\xab\x2b\xdf\x1e\x45\x02\x4c\xf7\x8e\xa2\x52\xf0\x8f\xca\x59\xa8\xfe\x74\x4a\x84\x19\xcd\xfe\xbe\x99\xc1\x9d\x20\xc8\x8e\xad\xd1\x66\xa5\x15\xbb\xa3\xa1\xe6\xd4\x26\xe5\x31\xe8\x10\x48\x7a\xa9\xbf\x51\x20\xd1\x6d\xff\x29\xd0\xd0\xd1\xf2\x9f\x4d\x1c\xb5\x1b\x23\xda\x93\xcd\x60\x5c\x7f\x28\xd6\xa6\x42\x1d\xef\xf9\x99\x58\x2f\xd7\x5c\xe8\x40\x99\x0b\xa5\x3e\xe5\x13\xbd\x9c\x67\xff\x85\x97\xb7\x63\x0a\xeb\x4c\x55\x81\x76\x68\xa5\x60\x30\xf6\xf7\xe5\xff\x2b\xce\x94\x73\x12\x34\x48\x2c\x4e\x02\x55\xe7\x30\xb7\x59\x89\xe2\x66\xac\x44\xe4\xb2\x12\x45\x07\x2b\x11\x71\x56\xa2\x50\xac\x44\x54\x67\x25\xec\x9f\x30\x72\x59\x89\xa8\x93\x95\x88\xae\xae\x22\x97\x95\x88\xea\xac\x44\x14\xe4\xbb\xb3\x12\x9c\x65\xd7\xac\x44\x04\x60\x68\xad\x58\xe4\x5c\xf4\x91\x62\x25\x6a\xdf\x8f\xa3\x26\x91\x09\x0d\x2b\x11\xad\x67\x25\xdc\x1e\xba\xa5\x8a\x88\x4f\x4f\xb2\x12\x59\x10\xc1\x44\xb2\x12\x56\x44\x38\xc7\x1b\xa5\x9a\x61\xfd\x4c\x0b\x63\xe8\x7b\xc1\x59\xcd\x86\x8a\xf1\x5d\x8d\xad\xcb\x2e\xde\xf2\xb2\x6b\xbd\xde\x5c\x97\x9e\x94\xc6\xcb\x29\x89\xe3\x35\x6e\x40\x75\x37\x1f\xed\xc6\x23\xc8\x61\xdf\x78\x04\xed\x28\x4e\xd7\xbd\x7e\xb6\x73\xea\x71\xa2\x52\xc8\x12\x12\xd8\x7b\x1e\x0b\xf3\xff\x56\x53\xd8\x93\xe5\x62\x42\xe3\x5c\xdd\xd3\xc1\xba\x3a\x1c\x0c\x5f\x8a\x24\x48\x8c\x6d\xb6\x19\x5f\xb5\x78\x9b\x2c\x6e\xf9\x18\xad\xf3\x54\x02\x20\x24\x96\x22\x9f\x0f\x84\x02\x46\x78\xc3\x68\x2b\x75\xd2\x12\xc6\xe2\x33\x72\x58\xaa\x76\xf4\x96\x7e\x8c\xd7\x72\x1c\xc1\xa5\x15\xfa\xf2\x8b\xa3\xd4\xef\xd5\x51\xca\x62\x83\xa7\x81\xef\x86\xbc\xa0\x3b\x84\xbc\xd0\x1e\x45\x82\x26\xbe\x24\xb9\x15\xf2\xc2\x38\x21\x49\xa9\x5e\x47\xba\x10\xda\x0f\xb5\xa5\xc9\xd4\xbf\x63\x6f\x19\xfe\x1b\x5f\x5d\xdd\xc1\xe2\x8e\x57\x0f\xc0\x77\x86\x7b\x5a\x97\x53\xa3\x44\xb2\x8e\xda\x91\x77\xee\xe8\x0c\x63\xfb\xfb\xfe\x90\x53\x7a\xf5\xf3\xea\xca\x13\x0e\x2e\x82\xfa\x8f\x0f\x4f\x41\xe9\xf3\x85\x16\xea\x22\xfe\x09\x34\x9c\x58\xd4\xe0\x4c\xec\x55\x7b\x80\x53\x9a\xf9\xfc\x2c\xb0\x60\xf8\x57\xf6\x37\x97\xe1\xf9\x2b\xbb\x77\x4f\x13\x4d\x69\x8d\x5b\x31\x3a\xcc\xe6\x7a\x98\xe0\x7a\xd8\x9f\x8e\x8e\x23\xb5\xda\x9c\x03\xbd\x73\xd8\x76\x92\x18\x58\x29\x12\x30\x66\xa7\x9c\xb5\x1d\x6d\x20\x8b\x79\x2b\x6d\x20\x38\xaf\x5e\x1a\x3b\x9b\xfa\x04\x80\x91\x35\xa6\x8e\x01\x75\xef\xd0\x4d\x24\x9b\x08\xc7\xa1\xca\x77\x08\x97\xfe\xaa\x54\xbc\x9d\xe1\x38\x23\x1c\x63\x86\x7b\x89\x74\x4d\x52\xa5\x81\x62\xfc\xc4\xb7\xe3\x95\xf8\xdf\xc8\xfe\xc6\x39\x74\x68\x2d\xa3\xf4\x5b\xba\xbb\x32\xae\x5e\x03\x79\x97\x92\xe9\xd2\x4f\x40\x79\x56\xf9\x28\x71\x56\x1c\xcb\x1b\x51\xf2\xb2\xb4\xc9\xcb\x3e\x68\xe5\x65\x1f\xd8\xab\xfa\x40\xac\xaa\xdc\x36\x2a\xcc\x8c\x7c\xd2\x55\x2f\xb3\x42\xd5\xa7\xb8\x7b\x48\x01\xcc\x5d\x63\x34\x3e\x8e\x64\xb0\xa0\x11\x16\x41\x5c\xc0\x5f\xfd\x43\xc8\x64\xa0\xc2\xf8\xea\x6a\x55\x42\xaf\x6e\xd7\x3d\xb8\x90\xc6\x2c\xfb\xfb\xbe\xc2\x81\x84\x68\x0e\x23\x6f\xfb\x82\x7f\xff\x8e\x66\x7e\x0e\xf4\x9e\x16\xa1\x30\xd7\x02\x46\x13\x9a\xb1\xa7\x34\x61\x19\x8d\x63\x9c\x0d\xf8\x2c\x50\xab\x93\x46\x2e\x35\xaf\x70\x25\xab\x8c\x0a\x28\xb4\x94\xa8\x74\xa4\xaf\x44\xf2\x1a\x1c\xbb\xf9\x8d\xb1\x5b\x04\x75\xdd\xa9\x85\x34\xa1\x9a\xf7\xaa\xae\x3d\x21\xeb\x8c\x43\x18\x9d\x06\x85\xe5\x45\xb1\x17\xd5\x57\xa8\xda\x25\x52\x46\x8a\x80\x40\x4c\x73\xe1\x72\x00\x2b\xec\xa1\x0d\xcb\x12\x6d\x5e\x96\xc2\x2c\x4b\x1a\x6c\x02\xbc\xfd\xb2\x84\xce\xb2\xa4\x72\x59\xa2\xd2\xb5\xc2\xb9\xe3\xe3\x1e\x49\x72\x86\x92\x10\xd3\x69\x2f\x1b\x3c\xe6\x7d\x3c\xe7\x3c\xe8\xd5\x95\x57\xfd\xf0\x02\xe5\x5e\x0b\x80\xe5\x14\xa9\xe5\x7b\xf9\x26\x92\xcb\xf5\x2d\x9a\xeb\xfb\xb0\x75\x7d\x1f\xda\xeb\xfb\xd0\x5a\xdf\x70\xcd\xfa\x8a\x0c\x8d\xe2\x3f\x92\x43\xf6\x60\x26\x97\x38\x82\xe9\x69\x10\xda\x4b\x9c\xae\x5f\xe2\xb4\x6b\x89\x0b\x98\xd9\x8b\x9c\xaf\x59\xe0\x74\xf3\x02\x9f\xdd\x5d\x45\x5d\x74\x28\x03\xe5\x99\x59\xff\x45\xb0\xae\xcf\xed\xd7\x3e\x72\xd6\x7e\x21\xd7\x3e\x2d\x9b\x5e\x95\x71\x50\x33\x4e\xb7\x89\x0f\xa4\xb5\xeb\x36\x1e\x34\x55\x90\x1c\x7d\x56\x54\xd5\x55\x55\x63\x84\x21\x62\x2c\x1b\xb5\xb5\x92\x1c\x21\xa8\x02\xa1\x6a\x47\x4d\xbb\x77\xdb\x65\x93\xaa\x48\xa8\x44\x44\x6e\x65\x3a\x72\xab\x74\xa8\x01\x41\x10\x64\x63\x62\xf5\x73\x0a\x40\x8b\x23\x27\xea\x70\xe4\xcc\x70\x4c\x51\xf4\xd6\xb2\xcb\xbe\x0d\x95\x86\xd8\x09\xa3\x3b\x43\xe8\xac\x9a\x54\x25\xc8\xf5\x56\x95\x92\x46\x1d\x5a\x06\x04\xa2\x00\x0f\x6a\xd6\xe2\x34\xf3\x99\x10\xbe\xbc\x09\x8e\x69\x32\xcb\xdf\x51\xce\xc0\xa0\xc1\x07\x92\x44\xfb\xfb\x9e\x7a\x3b\xae\xbe\x81\xea\xe1\x45\x9c\x60\xbe\x11\x11\x5f\xcc\xb2\xb7\x28\x72\xd6\x9b\xe0\x1e\xea\x19\x58\x3d\x9a\xf5\x14\x08\x28\x08\x02\x46\x51\x8f\xb0\xde\x05\xca\x7b\xa2\x1d\x49\xa2\xf2\xcc\x0a\xa4\x81\xc7\xf2\xe3\xa9\x2f\x80\x82\x41\x4c\x92\x0f\xca\x09\x8d\x04\xd2\xbf\x39\xd9\xdf\x17\xd9\x4e\x37\x9c\x10\x06\x00\xb4\x42\xd1\xf3\xb3\x5b\xb9\xa1\xbb\xa7\x96\x59\x27\x7c\x3c\x3c\x05\x7b\x75\xf1\xb4\xae\x25\x54\x9c\x04\x91\x7b\xae\xec\xb2\x5d\x37\x47\x85\xee\xef\x53\x75\xb2\xe4\xa1\x21\xe5\xfa\x37\x45\x48\x02\x6b\x3d\x02\x8d\xfb\x63\xcf\x3c\x91\xf1\x8b\xfd\x89\xae\xa1\x9d\xce\xbc\x51\xbd\x82\xf2\x81\x36\xc5\xc2\xb0\x25\xc7\x99\x12\x0a\x38\x92\xd0\x40\xba\x90\x66\x01\x93\xe7\xc4\xfe\x18\x07\xc9\x98\x9c\xfa\x0c\x8a\x94\xcf\x2a\xd1\x73\x0c\x4a\x00\x35\x9d\xdf\x9a\xca\x6b\x32\x2f\x71\xd5\x3a\xb9\x55\x39\xaa\xfb\xc6\xb7\xfa\xfc\x43\x2b\xae\x8f\xe5\x3c\x27\xb9\xf1\xd3\xab\x2b\x36\x36\xc1\x03\x5e\xc8\x6f\x26\x27\xf0\xfe\xbe\xb3\x5b\x72\x6b\xb7\x24\x9c\x63\xe2\x14\x7a\x8b\x20\x01\x25\x2c\x82\x49\x3d\xaa\x99\x25\xa9\x8c\x93\x5b\x72\x1b\x0e\xdd\x4e\x94\xcc\x73\x6b\x1d\xd4\x22\xab\x4d\xdb\xd5\x53\x69\xda\xaa\x8f\xaa\x6b\x89\xa4\xbe\x29\xc3\x39\x8d\xcf\x71\x66\x3e\x70\x1a\xd8\xb7\xfa\xad\xbd\xaf\xc9\x91\x1f\xe0\xe4\x9c\x64\x34\x11\x1e\xb3\xad\xfa\x24\xb0\x32\xca\x83\xf8\x97\x55\x5a\xdc\xd6\x7b\x1e\xbd\x56\xd8\xc7\x58\x09\xba\x0b\xd1\x91\x74\xf1\xf7\xa0\x09\x18\x32\xb0\xbf\x57\xb5\x53\x1a\xbd\xea\x68\xe0\x14\x55\x6d\xde\x9a\x75\xab\xac\x3e\xed\x57\x3a\x0a\x85\xb5\xba\xb9\xe9\x68\xd7\x28\x5a\x77\xd0\x24\xc3\xe8\x43\x4a\x49\xc2\x6a\x0f\x77\xb5\xb5\xbe\x8d\xb7\xd3\xea\xc3\x6a\x41\x27\x24\xc6\x23\xcf\x5f\xa0\xcb\xfe\x05\x89\xd8\x7c\xd4\xfb\xcb\xa3\xaf\xd2\x4b\xe0\x41\xb1\xd0\x8c\x97\x91\xa4\x2a\xfb\x5a\x94\x45\x38\xff\xc0\x68\x5a\x2f\x1c\x1e\x7e\x25\x5b\xce\x0a\xc6\x70\x16\xe3\x3c\xaf\x43\xfe\xfa\xd1\x21\x2f\x2f\x5b\x67\x1f\xea\x88\x0a\xfd\x85\x08\x46\x9a\xe5\x07\xb3\x98\x2c\x16\x1c\xdb\xb5\x63\xa5\xbe\x56\x0d\x0e\xfa\x69\x46\xce\x11\xc3\x07\xf2\x30\x35\x20\x7d\x46\x81\x0b\xcd\xd8\xf3\x83\xbe\x8a\xff\xd8\xc7\xb1\x88\xcc\xda\x47\x31\x6b\xa5\x30\xa6\xcd\xa7\x78\x68\x97\xda\x14\x33\xee\x81\x3c\xa0\xbe\x4d\x0f\xdb\xdf\xa6\xd7\xcc\xe4\x37\x3b\x8b\xbd\x75\xb3\x40\x51\x44\x93\x7e\x48\xd3\x65\x7f\x52\x30\xe6\x3a\xcb\xaa\xbd\x17\x13\xfe\x6f\x3a\xa1\x28\x8b\xec\xd6\x76\xbb\xcf\x72\x3b\x8a\xc0\x93\xfd\x05\x4d\x08\xa3\xee\x91\xec\x88\xae\x56\x2d\x69\xe7\xeb\x4c\x84\x27\x85\x1d\x6f\x0d\x87\x34\x43\x8c\x66\x79\xad\xb1\xeb\x7e\xc3\x2f\x0b\x9c\x1f\xc4\x74\xd6\xfd\xb2\x22\x15\x81\x5d\x0f\x54\xbf\x82\x42\xff\x4b\xe4\xb3\xdf\xbd\x42\x5f\xb2\xdb\x93\x60\xec\xe9\x47\xc4\x0b\x94\x71\xb6\x8f\x24\x53\xea\xf1\xd3\x29\x77\x3b\xcb\x50\x88\xbd\x53\xfd\x00\x20\x94\x95\xf1\x80\xa1\x99\x90\xbd\x7d\x4f\x67\xd7\x49\x6a\xb1\xb5\x45\xb8\xc6\x01\x89\x3c\xe8\xc5\xf8\x1c\xc7\x22\x84\x77\x76\x8e\xb3\xc1\x8a\x44\x50\x06\x88\x2a\x3d\x00\x91\xef\x87\xb7\x6e\x59\xa3\xec\x0c\x2b\xc3\x9a\xe8\xb7\x6a\x58\x63\x1e\x3e\x74\x3e\x55\xb9\xbe\xe6\x39\x44\xa0\xcc\xfd\xaa\x10\x3a\x19\x1f\x9d\x3a\x1f\x73\x0f\x4e\xaa\x4f\x8a\xfe\xfd\x98\x71\xec\x1f\x9c\x0f\x0f\x54\x3c\x5e\x45\x16\xab\x8a\x24\x3f\x61\x19\x46\x0b\xf1\x78\x2c\x2c\x0d\x35\x50\x3a\x9b\x99\xfe\x4b\x9a\xbc\xe4\x9d\x3c\x15\x96\xa6\x3e\x58\x89\x58\x70\x0a\x9a\xd4\xda\xb8\x11\xe1\xe4\xf8\x8f\xd5\x3c\x7e\x22\x91\x37\x52\x33\xe5\x7f\x43\x56\xab\x65\xfd\x3d\x20\xd1\x48\x46\x2c\x17\x95\x95\x88\x67\x36\x15\x24\xc1\x2a\xa6\xb3\x9f\xc4\x9c\x65\x45\xf1\x27\x1c\xe3\xd3\x11\xab\xdb\xaf\x4b\x80\x42\xb7\xa0\xc2\x92\xd9\xfd\xc8\x4f\x00\x92\x32\x22\xd1\x8b\x24\xc7\x19\x7b\x2e\xef\x7d\xcd\xbf\x0f\x1a\x05\xf5\x5d\x27\xd5\xf2\xc2\x21\xe0\xa5\xc0\x96\xaf\xdd\x7b\xf5\x4f\x95\x05\x48\x0e\x53\x7c\x3b\xb6\xfe\x1e\x30\x44\xe2\x91\xe7\xed\x61\x65\x6e\xf0\x9f\x64\x30\x18\x08\x6b\x5e\x92\xcc\x7a\x31\x9d\xf5\xc4\xdc\x7a\x8c\xf6\x94\x19\xb0\xf8\x5d\x0e\x06\x83\xff\x24\xff\x49\xce\xd4\x10\x72\xcc\x7c\xb3\x5e\xe6\x55\x6e\x10\x0a\xff\x03\x9f\xa3\xeb\x3b\xcc\xc2\xf9\x08\x07\xdf\xac\x8d\xb6\x8a\x01\x4c\xc5\x5a\x4a\xbc\xd6\x96\x17\x16\x59\x5c\xfb\xfc\x63\x16\x43\x31\x7e\x21\xd9\xe7\x98\x89\x0d\xc2\xe9\xbf\x3d\x43\xe1\x56\x5f\x1b\xa6\xdc\xc0\x58\x7d\xab\xef\x2b\xdc\x8e\x53\x46\x67\xb3\x18\xcb\x7d\xea\x2b\xf8\x02\x58\x2e\x3e\xbd\x12\x3e\x9c\xea\x87\xf4\x5a\x57\xd3\xe4\xcd\xcc\x71\xaf\x6d\x75\x2e\xf2\x47\xc1\xc2\x0f\x3f\x6d\x94\xb0\x1a\xf8\x1a\x3e\xb7\x8b\x15\xb6\xa6\x3d\x80\x61\x2d\x62\x58\x10\x02\x70\x75\x55\x6c\x56\x00\xd8\xbc\x92\x89\x23\xdc\xcf\xe8\x45\x0b\x9f\x78\x4d\xa6\x49\x32\x49\xf4\x1c\x67\x19\x89\x84\xb9\xa7\xc9\x7b\xd2\x99\x10\xc5\x14\x64\x45\x12\x53\x9a\x56\xac\x2a\x4d\xc2\x22\xcb\x70\x12\x2e\x6d\x16\x6b\x8e\xe3\x94\x0b\x5f\x31\xfa\xb8\xe4\xac\x6c\xf8\xa1\x9b\x01\xb3\xe6\x99\x33\xc4\xf2\x3e\xbf\xd8\x3e\x58\xd3\x6b\x67\xe8\xd6\x58\xc3\x68\x76\x4d\x5e\x4d\x26\xcd\x24\x9c\xc1\x25\x3c\x87\x17\xf0\x23\x7c\x0f\x2f\xe1\x6b\xf8\x06\x7e\x80\xaf\x2a\x9e\xee\xe4\x73\xb2\x28\xf9\xe9\x57\x62\x40\xdf\x7d\x61\x40\x7f\xef\x0c\x28\xbf\x16\x9f\x06\xbe\x78\x78\x8b\x2c\x86\x92\x71\xd6\x64\x21\xbf\x8a\xc3\x2b\xcc\x75\x81\xef\xb9\x94\xca\x23\x79\x9f\x24\x0c\x67\x32\x8a\xa9\x07\xe0\x44\xb6\x42\x8c\x65\x64\x52\x30\xfc\x84\x24\x11\x49\x66\xbc\x71\x84\x18\xea\x33\x9c\xb3\xbe\x1d\xa0\xdf\xfa\x2c\x12\x32\x77\x15\x66\x18\x45\xfd\x5a\x18\xf9\xa9\xe4\x83\x2b\x9e\x57\x38\xb0\xdc\xa9\xc4\x76\xde\x8e\x24\x33\x00\xe0\x9c\x57\xcd\x6c\xf6\xb8\xd6\x4b\xf5\x63\x40\xac\xdc\x5d\xb3\x40\x84\x14\x45\x31\x41\x7c\xfc\x82\x66\x0d\xc2\xb4\x18\xc4\x28\x67\x12\xfb\x1e\x80\xcb\xb6\x5a\x0b\xbc\xa0\xd9\xb2\x5e\xf1\x9c\x57\xcc\x07\x0c\xe5\x1f\x40\xb5\x11\xff\xec\x83\x55\x44\x57\x64\xea\xab\x67\x0a\xc4\x72\xc0\xb2\xe5\x6a\x49\x70\x1c\xf5\xac\x78\xb1\x02\x70\x4a\xe3\xd8\x93\xaf\x37\x38\xf2\xc1\x20\xc5\xd9\x94\x66\x8b\xda\xe5\x2e\x6a\xca\x07\x02\x11\x41\x40\x3e\x21\xe3\xfa\x95\x6d\x55\x39\x04\xa5\xe8\x4c\x0e\x8f\x2c\x30\x2d\x18\xf0\x1f\x1e\x1e\x82\xf2\x62\x4e\x62\x2c\x47\x86\x13\x7e\xc4\xde\xd0\x38\xe6\x38\x2d\x01\x18\x44\x99\xe0\x2a\x52\xff\x22\x58\xf8\x17\xc1\xc4\xf7\x3f\x3a\x82\x44\xb2\x83\x5e\xf6\xa4\x6e\x80\xf4\x5e\xd9\x25\x9d\xd4\x83\x20\x5f\xaa\xcf\x3f\xa9\xcf\xf6\x3a\xca\x83\xa1\x4b\x42\x9a\x30\x7c\xc9\xdc\xcf\x0e\x72\x0c\xfc\xda\xf4\x3c\xf8\xda\xe9\x3e\x4c\x0b\x0f\xbe\x71\x3e\xca\x55\xf6\xe0\x07\xe7\xbb\x88\xdd\x74\xc2\x3b\xf2\xe0\x2b\x2b\x6a\xb3\xe8\xdb\x07\x66\xb1\xc5\xba\xb6\x6f\x3e\x6d\xe8\x14\x36\xf8\xc8\xe9\xb6\x4c\x64\x05\x58\x72\x8c\xd5\xef\x92\x4b\x12\x4f\xf9\x65\xcd\x65\x08\x71\x6b\xf3\xed\xe1\x1f\x42\xbe\xb7\x3f\x2e\x45\x11\xf0\xc7\x8a\x37\x14\x3f\x21\x3e\x05\x9c\x45\x7f\x8b\x43\x4c\xce\xb1\x78\x1b\xb6\x39\xf4\xfa\x77\x9b\x81\x14\x88\x78\x27\xaf\x7a\xc3\x9a\xd7\x3f\xae\x9c\x01\x1e\x8b\x27\xe0\x3c\x9c\x63\x4e\xc5\x5e\x27\x21\xa7\x4a\x68\xca\x70\xf6\x16\x27\x11\xe7\x18\x04\xa2\x9f\x01\x39\xb3\x0a\xdf\x03\x19\x79\x41\x18\xf3\x97\x25\x7c\x1f\xbc\xf3\x3f\xb6\xbd\xf4\x90\x5b\xe2\x2d\x2f\xdd\x0e\x34\xf3\x7a\x5b\x1d\xbc\x76\x3b\x70\xf6\xe9\x78\x7a\xd3\x1e\x1a\x18\x12\xdb\x76\x3c\xdf\xcc\x16\xb7\xb4\x03\xf0\xa3\xcd\x0e\xbf\x71\x47\x2f\x8e\xd1\x78\x76\xd3\x31\x7f\x70\xe1\xea\x93\x38\x5e\xde\x14\xf4\x2b\x17\xb4\x7d\x98\xc7\xe7\x37\x05\x7f\x11\x7c\xe4\x02\xc2\x85\xf9\x77\xcf\xc9\x8b\xf1\xcc\x95\xe0\xab\x53\x21\x42\xb9\x0f\x48\xfe\x06\x65\x1c\xec\xfe\xbe\xcc\x8e\x51\x3d\x6f\xdb\x4e\x2e\x35\xca\x28\xa2\x82\xac\x26\x28\xfc\x30\xcb\x68\xc1\xeb\x88\x60\x49\x77\x86\x82\x2b\xa8\xe2\x10\xe6\x6f\xb0\xb8\xae\x3d\x00\x74\xe6\x0d\x5d\xe8\x81\x3d\x1c\xe7\xb8\x27\x8c\x3e\x55\xa0\x79\x94\x7f\x10\x91\xa1\xec\x38\x71\x16\x38\x41\x81\x13\x26\xa3\x9a\xab\xb1\x0e\xa4\x05\x07\x17\x27\x9d\x93\x6b\x6e\x32\xeb\x85\xec\xe9\x0e\xa2\x13\xdf\x80\x1b\x9e\x0a\xb6\x4e\x0b\xd9\x10\x61\x8a\x84\xd4\x12\x5e\xed\x20\xa7\x48\xe6\xf9\x77\x98\x0e\xff\x17\x97\x48\xce\xbf\x48\x24\x7f\x04\x89\xe4\x22\xf0\x69\x8b\x8a\xbb\x99\x0a\x72\x81\x59\x46\xc2\x4a\xfb\x5d\x63\xc1\x15\x6f\xd1\xe4\xd7\x8b\x35\x95\xdb\xd8\xf6\x66\x42\x79\xd5\xaf\xba\xcd\xf4\xdd\xd3\x96\x41\xde\xd4\xe4\xbd\x0c\x8a\x1c\x47\x22\x5f\xfc\xda\x6a\x66\x30\xab\x0c\x0b\x1d\x69\xf4\x4a\x74\x00\xf5\xcf\xa7\x6f\x7e\x2c\x3d\x00\xa9\xef\x9f\xfb\xfe\xe4\x06\x09\x30\x97\x9d\x3c\xf4\xd2\x66\x96\xdf\x69\x2d\x4d\xbd\x8c\xe4\x2f\x29\x8a\xa4\xc2\x7a\x58\x7d\x56\x4f\x19\xf5\xba\x66\x82\x06\x57\x33\x9b\xaf\x76\xf3\xd7\xeb\xdb\x7c\xee\xf0\xce\x4f\xf9\x54\xcd\x7b\xa4\x68\x1b\x04\xf2\x96\x94\x3d\x1c\x4b\x81\x74\x4a\xbd\x11\xff\x2b\x42\xc9\x0c\x67\x9e\x69\xaf\xaf\xd6\x95\xac\x3d\xc2\xa5\x68\x2c\xcc\xf4\x14\x30\x7c\x75\xa5\xbb\xe7\xbf\x80\xa5\xc8\x1e\x5b\x1d\x9d\x0a\x98\xfc\xbe\x42\x8c\xe1\xe8\x44\x02\xb7\x85\x38\x6d\x91\x55\x01\xb3\xc7\x29\xc4\x51\xd9\xfc\xc9\x92\x71\xd9\xda\x34\x14\xdb\x04\x8c\xda\x66\x67\xb5\xfa\x1e\x67\xec\xa3\xdb\x0a\x7a\xaf\xbe\xff\xe8\x19\x92\x5d\x1b\xe2\x5b\xb5\x7b\x2a\xf4\xed\x3c\x32\xb3\x33\x9d\x8d\xe9\xbd\x22\x4f\xbc\x9d\x47\xdc\x80\xf6\xf4\xcd\x8f\xce\x04\x4a\xe0\x72\x98\x62\x07\x6c\x97\x1c\x73\xd2\xde\x16\xc0\x89\xcd\xa1\x4e\x83\xf3\x7a\x4d\xc9\xa1\xe6\x37\x4f\xad\xee\xc0\x35\x1c\x6a\x71\x53\xd0\xe7\xcd\xa9\x6d\x97\x33\xbc\xd9\xcc\x41\x86\x03\xb9\xb6\xbd\xb7\x4b\x0a\xbe\xa6\xfd\x96\x7d\xe9\x7d\xea\xc1\x71\x7a\xdd\xfe\x0c\x0c\xa7\xcf\x45\x30\xe1\xcc\xf7\xc2\xd6\xce\x5f\xec\xc8\x62\x16\x79\x7f\x82\xda\x2d\x1a\x0c\x57\xd9\x06\x26\x22\xb9\x54\x89\x71\x40\x02\xc2\xae\xcc\x64\x2d\x31\x79\xc5\x3a\xe6\x9f\x9b\xf1\x9e\x74\x3a\x30\x39\xab\xb7\xd4\x14\xda\xc8\x57\xe9\xaa\x59\xbb\x42\xef\x29\x4d\x18\x22\x09\xbf\x41\x7f\x2e\x70\x81\xa3\xc7\xbc\x28\x87\xbc\x72\x8c\x19\x56\x3f\xa7\x88\xc4\xa6\x2c\x93\x7a\x17\xf5\x4b\xe4\x70\xac\x7e\xc6\x34\x67\xea\xcf\x22\xf9\x90\xd0\x8b\x44\xfe\x2a\x3d\x11\xab\x76\x60\xe5\x88\x80\x99\xef\xa3\x2d\x5f\xd3\xdb\xae\xe4\x5c\x3f\xfb\xa2\x25\x2d\x18\x67\x7e\x38\x9b\xb1\x66\x17\x55\x4d\x5a\x10\xa0\xaf\x61\x5d\x45\xc4\x7d\xaf\x7f\xda\x84\x6a\xa1\x1d\x9c\xe1\x04\x67\x88\xe1\x97\x78\x86\x93\xe8\x25\x49\x3e\xd4\xbc\xb6\xf1\xfe\xbe\x27\x31\x2d\x7c\xf4\x8e\x2d\xcf\x82\x7c\xb4\x92\xc0\x46\x22\xa0\x41\xe5\x4a\x31\x66\xa7\x00\x56\x01\x1b\xf0\xc0\x58\x2e\xd7\x72\x6e\x0c\x08\x17\x15\x4b\x49\xfa\x44\x22\x6c\xc4\x90\xbc\x69\xef\x38\xd2\xb1\x99\x75\x95\x0f\xac\x43\x8e\xae\x36\xc8\x0c\x33\xcb\xe1\xce\xb3\xb7\x8b\xc2\x7b\xb5\x61\x3c\xe8\xd9\x5b\xc6\x83\x5e\x6d\xd3\x48\xee\xcd\xda\x36\x1e\xf4\xaa\x8d\xe3\x41\xaf\xb6\x75\x8c\x23\xc8\x78\x15\xa3\x09\x8e\x47\xde\x3f\x25\x02\x95\x60\x86\x07\xf5\xad\xab\x95\xf0\x23\x8d\x68\x18\x9b\xb5\x18\x29\x5d\x62\x63\x8d\xc4\xf7\xf7\x74\x02\x75\x23\x50\x42\xdd\xdd\x89\x1a\x6b\xd5\xa1\xb3\xe9\xad\x2e\x73\x53\x37\x46\x4b\x9c\xe5\xa3\xa3\xdd\x7a\x37\xed\xad\xfe\xb5\xa2\xd3\x74\x5f\x3f\x81\x56\xef\x99\xae\xb9\x53\x9f\xba\x95\xd5\xe5\x53\xb5\x9c\x55\x9f\x0e\x45\xb0\x3a\x0d\x4d\xdd\x9d\x7a\x35\xcd\xac\x6e\x7f\x94\xeb\x5e\xf5\x5a\xdb\x08\x76\xa7\x85\xae\xb9\x53\x9f\xba\x15\x80\x73\x1c\xa7\x23\xef\xb1\xd9\xe7\x3d\x92\xf7\x54\x69\x2f\x27\x49\x88\x7b\x84\xe5\xbd\x84\x46\x98\x97\x44\x24\x0f\x69\x92\xe0\x90\xe1\x68\xe0\x55\xe3\xfd\x4e\x6c\xf2\x6a\xb8\x35\x3a\x69\x8d\x76\xaa\xea\xed\x34\x58\xd5\xc8\x42\xcf\x4b\x9a\xb3\xaa\x33\x8b\xd4\x5a\x5d\xc5\xa2\xce\x4e\x1d\x89\x26\xa0\x3c\x15\x89\xce\x90\xc5\x25\x44\x81\xa0\x79\x1e\x4c\x83\x71\x7c\x0a\x17\xed\x91\x0f\x2c\x16\x03\xd5\x92\xac\xf3\xa6\x00\x4e\x6a\x20\xa7\x6e\xa8\x91\x45\x87\xfe\x61\x3a\xc6\xa7\xc1\x42\xe9\x1f\xa6\x75\xfd\x83\xfd\x13\x4e\x5d\xfd\xc3\xb4\x53\xff\x30\xbd\xba\x9a\xba\xfa\x87\x69\x5d\xff\x30\x0d\xd2\xdd\x43\x8d\x84\x30\x32\xa1\x46\xa6\x00\x4e\x2c\xfd\xc3\xd4\xd1\x0e\x4c\x95\xfe\xa1\xf6\xfd\x78\xda\xd4\x3f\x4c\x8c\xfe\x61\xba\x5e\xff\xe0\xf6\xd0\xce\x74\xf0\x21\x4e\xf9\xf4\xe4\x95\x46\x03\xc4\xb9\x3b\x2a\xa3\x8d\x58\x8a\x36\x8b\xdb\x2b\x76\xe1\xf6\x8a\x49\x82\xce\xb7\x55\x29\x76\x24\x0b\x6e\x5a\x56\xec\xa0\x3c\x54\x5a\x2e\xd8\x50\x1e\x56\xdc\xdf\xf4\x73\x52\x1c\xce\xbf\x28\xf0\xfe\x08\x0a\xbc\x59\xe0\xc7\xf2\xc1\xbd\xa6\xc0\xa3\x92\xe1\xc7\x3f\x17\x28\x06\xbe\x97\xd1\x82\xf1\x79\x09\xa3\x22\xf6\x96\xff\x52\xfc\x6e\x75\x06\x6d\xae\x6d\x30\xcd\xb5\x16\xf0\x46\x40\xfa\x19\xa5\xac\x52\x1a\xd2\x0c\xf8\xde\x34\x7f\x91\x3f\x96\x26\x0c\xd0\x9b\xe6\x6f\x29\x65\xe6\x03\x80\x71\xd3\x42\x76\x17\x35\xdb\x54\xb1\xda\x72\xac\x26\x8f\xaf\xf9\x6e\x77\x9e\x36\xca\x6a\x63\x81\x0b\xb7\x9c\xc4\x38\xe7\x57\x9f\xae\x30\x51\x2a\xb3\x12\x46\xc1\xbc\x6e\xb8\xa6\xfb\xbf\xb5\xb7\xc9\xd4\xed\xc1\x9e\xc9\x98\xde\xd8\x6e\xaf\x09\xbe\x8e\x8c\x31\xba\x69\x17\x93\x46\x17\x2e\x3e\x6f\xae\x09\x6a\x33\x09\x9c\x6d\xbc\x86\xb4\x54\x9c\xf7\x73\x1c\x36\x33\x38\x76\xde\x43\x5b\xde\x2e\x3a\xdd\xe1\xed\x1c\x78\x95\x90\xc8\x3e\xed\x8d\x68\x8d\xd5\x89\x29\xc1\xd5\x55\xb2\xb7\x29\x03\x8b\x85\x8c\x09\xca\x49\xd8\x8f\x32\x9a\x46\xf4\x22\xe9\xeb\x67\xc5\x16\x7f\x9a\x7a\xcd\x2d\x60\x7c\x96\xbe\x35\xce\x5c\x58\x46\xa4\xcd\xf1\x0d\xf0\xa1\x61\xfc\x0e\xf0\x71\x13\x3c\x7c\xa6\xf3\xcf\x30\x8a\xc2\xac\x58\x4c\x5a\x89\x44\xdd\x69\xaa\xf1\xf6\x6d\x31\xae\x0d\x5f\xc9\x0d\x6c\x69\xc5\x86\xa2\x2f\x9c\xdd\x1f\x81\xb3\xcb\x39\x67\x57\xa7\xeb\xd9\x8d\x7d\x85\xaa\xed\x9b\xdb\x1e\x43\xf4\x37\xeb\x31\x24\xb4\x0c\x19\x9e\x91\x9c\x09\x8b\xb6\xea\x4f\x15\x24\xbe\x9a\x90\xa9\xf6\xc4\x7c\xf3\x25\x83\x16\xe1\x75\xcd\xaa\xd2\x46\xc3\x0b\x12\xc7\xcf\x70\xce\x32\xba\x34\xf6\x77\xb5\x6f\x72\x7c\x36\x7c\x11\x73\x15\xf9\xb1\xcd\xe9\xd4\xb0\x7e\x6b\x91\x0f\x9c\x4e\xf4\x10\x04\xd3\x89\xc4\x59\xda\xfc\xa6\xd3\x0e\x81\x53\x05\xeb\x29\xc7\xe9\xa8\x9a\xed\xf5\xbb\xb2\x60\x38\x9d\xc5\x36\xef\x96\x6f\x4f\x8e\xdb\x23\x6a\xb7\x28\x0f\x18\x5e\xa4\x31\x62\xb8\x3f\x45\xfc\xf8\x2c\xdb\x89\x71\x83\x64\x6f\xa0\xce\xb7\xe5\xa1\xa8\x2d\x2f\x84\x01\xea\x3b\x35\xd4\xef\xe4\x48\x81\xbf\x22\xd1\xc8\xfb\xc7\xe2\xd1\x5f\x86\x4f\xfe\xfb\xbe\x07\x27\x31\x0d\x3f\x8c\xfe\xf7\x78\x3c\x1e\x7e\x05\x87\x70\x3c\xbe\x7f\x08\x0f\xe1\xd8\x53\x08\x39\xe5\xff\xc0\xb1\xb7\xaf\xaf\xc3\x53\x38\x45\x71\x8e\xe1\xd8\x13\x36\xc8\xde\xe9\xe9\xff\x86\x32\xf8\x81\xd4\xfd\x6d\xc0\xf0\x60\xce\xb1\x2c\x7c\x8a\x48\xc8\x5e\xd1\x08\x0b\xab\xb6\x2e\x6a\xd5\x65\x90\xfc\xfb\xa5\x56\xe2\xd5\x44\x8e\xd7\x49\xd4\x61\x63\x51\xfe\x4f\x04\x60\xb1\xcf\x44\xe8\xcc\x37\x0a\xc6\x99\xa1\x14\xe9\xcd\x02\x34\x4f\x5c\xad\x69\xda\xc1\x1a\x4c\x38\x6b\x90\x2a\xd6\x60\x52\x67\x0d\xec\x9f\x70\xe2\xb2\x06\x93\x4e\xd6\x60\x72\x75\x35\x71\x59\x83\x49\x9d\x35\x98\x04\xd1\xee\x5a\xd3\x02\x86\x46\x6b\x3a\x01\x70\x61\xb1\x06\x13\xe7\xe2\x9e\x28\xd6\xa0\xf6\xfd\x78\xd2\x5c\xcc\x85\x61\x0d\x26\xeb\x59\x03\xb7\x87\xf6\xfd\xc8\x87\x38\xe1\xd3\xd3\x5a\xd3\x09\xa7\x6f\xfc\x00\xd8\x0a\x46\x8b\xde\xc9\xd8\x6a\x39\x66\x4f\xf5\x09\xd4\x34\x00\xf8\x08\xe6\x3b\xb0\xa7\xf9\x81\x61\x82\xaf\x4f\x17\x9d\xca\x55\x1d\x9a\xc4\xcb\x4f\x96\x6a\x5a\x45\x46\xda\x48\x08\xbf\x4a\x2f\xff\xcf\xf3\x93\xf4\xdf\x35\x42\x78\x08\xbd\x98\x78\xa7\x70\x3c\x3c\xe2\xff\x81\xde\x7f\xfe\x93\xf4\x7a\xfc\xc3\x57\x70\x7c\xff\x6b\x78\x78\x2a\x43\xe4\x8d\xc7\xde\xb7\xd2\xf5\x93\x97\x71\xca\x39\x84\x63\x0f\x65\x33\x49\x37\x79\x79\x45\x36\xc7\x1c\xb2\x00\xc5\x7f\x3c\x18\x42\x5d\x9f\x11\x16\x63\x4f\x54\xe7\x15\x7a\xe2\x1f\xd1\xfb\x21\xf4\xa2\xb8\x31\x0e\xa7\x02\xeb\xa8\xa0\xaa\x34\xba\x69\x87\x74\xbf\xbb\x83\x68\xcb\x0e\xc4\x03\xd1\xd6\x1d\x38\x1f\xc5\xfc\xdb\x70\xd0\x0d\x5e\x35\x91\xbf\x79\x6d\xf9\xd3\xae\x20\xba\xe0\xd7\xd7\xb7\x52\xdc\xaa\x2e\xaf\x98\x24\x1f\xfa\x8c\x7a\xd0\x23\xd3\x5d\xef\x30\x7d\x2a\xba\xee\x32\x29\x4f\xad\x39\x85\x99\x13\x48\x08\xd8\xfc\x4a\x7b\x78\xf4\x8e\x91\x34\x32\xc3\x5f\xe7\x6c\x76\x0a\x9c\x5b\xca\x97\xc6\x66\xfa\x8b\x7c\xf9\x07\x92\x2f\x25\x89\xcd\x37\x93\xd8\xaf\x1f\xdf\xff\xef\x7f\x46\xaf\x8f\x6c\x12\xdb\xa4\xa3\x34\x51\x4e\x5e\xde\xb7\x11\x15\xe4\xf2\x88\x57\xfa\x0b\x1c\x2a\xd2\x7a\x78\x0a\x35\x6f\xaa\xeb\xf2\xb3\xce\x01\x54\x25\xc2\x3f\xe1\x0d\xca\xc4\x5e\x5d\x43\x82\x0d\x71\x11\x9d\x3c\x84\x47\x16\xfd\x9e\x26\xfc\x20\xf1\x41\x68\xf0\x35\x8a\x62\x51\x6e\xf9\x30\xed\x91\xfc\x49\x91\x2f\xeb\x14\x5c\x53\xcf\x96\x7b\xc4\x2a\x16\xf4\xef\x01\x7c\x04\xbd\xff\xe5\xc9\x3f\x3d\x94\x11\xd4\x97\xb4\x0e\x7a\xb1\xb2\xd8\x6d\x27\xc0\xff\xef\xff\xfe\xff\xbb\xc8\xe9\x1a\x0a\xab\x10\xd6\x36\x8d\x93\x22\x0c\x71\x9e\xab\x99\x34\x6b\x64\x38\x17\x88\x6c\xbf\xaa\x3a\xa6\x6a\x5f\x9c\x0f\xac\x05\x17\xcf\x1b\x7c\xb9\x45\xb8\x45\x5e\xc7\x7b\x4f\x27\xc2\x1c\x40\xc6\xb4\xf4\x3a\xbb\x5f\xb7\xae\x8d\xeb\xab\xeb\x02\xdd\xf2\x12\xe5\xff\xc8\x0d\xd5\xfb\x07\x9d\xb4\xb5\x6f\x5e\x9d\x5b\x5e\x9f\xcd\x3b\xae\x3e\x51\xe8\xb1\x8c\x13\xe0\x48\x3c\x91\xb5\x5c\xac\x6b\x87\xd0\x79\xad\xbb\xd7\xe4\xda\xfb\x58\xed\x96\xed\x77\xf5\xb5\x17\xfa\x50\x7e\xdf\x6a\x79\xb7\x58\xdc\xad\x96\x56\x61\xff\xe1\x51\x6d\x04\xd0\x9b\xa3\xfc\xe9\x9c\xc4\x51\x86\x05\x22\xbc\x6a\x03\x78\xd0\xfb\x87\x18\xe4\xd6\x08\xdf\x72\x2b\x54\x1b\xa1\x1a\xc6\xc6\xe5\x5f\xc7\xba\x35\x19\xae\xb6\x85\x5f\xb7\xec\xfc\xeb\xa9\x56\x00\x54\x2f\x0e\x9a\x85\x32\xef\x18\x1e\x0a\xb5\xfb\x37\x89\xfa\x44\x84\x7e\x91\x8c\x15\x34\x7c\xd6\xae\x2c\x16\xdf\x1c\x6b\x54\x05\x45\xe0\x23\xdf\xa7\x8e\xb6\xc0\x04\xb3\x5d\x71\x21\xfa\x3d\x9d\xb8\xa9\x2e\xb3\x99\x12\x9d\xf9\xe6\x2b\xd5\x35\xc2\xd9\x8d\xd2\xba\x38\x94\xb9\xe2\x1d\x6d\x9c\x64\x9b\x3a\xa6\xf2\x6a\x91\x76\x8e\xb6\xb3\x81\xa8\x28\x3c\xe9\x74\x15\xc7\x1a\xde\xdc\x6f\xe3\x6c\x6b\x75\x17\x6d\x03\x00\x20\xad\x2b\xd6\x68\xc3\xfb\x51\x5d\x80\xd7\xee\xca\x06\xe2\x74\x47\x6d\x56\xb5\x58\x27\x6a\xe6\xb0\xd8\x28\x6a\x86\x73\x94\xb1\x7e\x9a\x91\x05\x61\xe4\x1c\xe7\x07\x28\xc3\xe8\x13\x29\xe1\x34\x97\x1b\xdd\xef\xe7\x73\x94\xe2\xa6\xd3\x60\x6a\x4c\x4b\x0f\x8a\x84\xfc\x5c\xe0\x76\xf9\x74\xbb\x00\x74\x9f\x87\x85\xcf\x97\xa8\x75\x7f\x10\x3e\x7d\xb2\x99\x4f\x3f\x79\xfd\xdf\xb3\xe9\x43\xf6\xca\x55\x85\x44\x78\x9a\xb7\x2a\x43\x24\x27\x90\x60\x94\xfd\x3d\x43\x11\x91\xf2\xa1\x60\x62\x2f\x87\x1e\xf4\x0e\xcd\xaf\x23\xfb\xd7\xb2\x56\xb6\xe4\x65\x43\xf1\xeb\x21\xbf\xf9\x8e\xbe\xb6\x54\xd0\x34\xa6\x99\xf4\x02\xd2\xf7\xd6\x43\xce\x26\xd9\x75\xa6\x24\x8e\x5f\x44\xa6\xfc\xa8\x79\xb9\x1d\x8a\x28\x02\xa9\xea\xf0\x50\x99\x37\xeb\xfe\xe9\x74\x9a\x63\x4e\x25\x0e\xff\x54\xcd\xb1\x85\x8f\x6e\x40\xc1\x49\xd4\x80\x31\x3c\xec\x82\xd2\xb8\x91\x35\xd0\x30\x26\xe9\x1b\xc4\xe6\x5e\xeb\xec\x16\x28\xff\xb0\x71\x76\xa9\x6e\x2e\xc6\xc5\x11\xa2\x80\x79\x91\x57\x07\x27\xa8\x6b\x0d\xd8\x9a\x31\xb6\xfd\x1c\x42\x4f\x0a\x23\x8f\xf4\x5a\x09\x98\xbd\x8a\x83\x6b\x59\x33\x29\xc2\xb5\xee\x9e\xfa\xd0\xf9\x5e\xea\x1a\xba\x2c\x5b\x3b\xf4\x43\xce\x38\x87\xac\x05\x15\x7c\x0f\xd6\x36\x9d\xf9\xf1\x10\x7a\x22\x7a\xb1\xd5\xdb\x91\xd9\x6a\xde\x1c\x93\xd9\x9c\x59\x65\xf7\xab\x32\x01\x5c\xe1\xa0\xc8\x62\xff\x7f\x55\x38\x30\x7b\x12\x7a\xc0\x33\x0d\xf8\x4a\xf7\xc5\x84\xdb\x5b\x99\xb5\xae\x5a\x1d\x6d\x58\x11\xf1\x30\x83\x44\xba\x5a\xe8\x7d\xab\x26\xe2\x7d\xab\x86\x6d\x38\xb5\x6d\x78\xaf\xd6\x9b\x78\x1d\x07\xa6\x03\x5b\xd2\x4a\x8d\x25\xf6\x42\x9f\xcf\x43\x9b\xeb\x35\x0a\x05\xd6\x84\x8d\xd5\xb5\xe3\xce\x98\x58\x8d\x12\x5f\x3a\xf3\x95\xf9\xae\xb0\xaf\xcd\xf6\xe4\x7b\x8a\xd9\x95\xad\x1c\xa1\x29\x3d\x6e\xfb\x38\x72\x3e\x9e\x84\x28\xc6\xfb\xfb\x32\x05\x55\x55\x26\x33\x27\xe9\xc4\xe3\x4e\xf5\xb2\xd7\xf1\xbd\x6f\x7f\x17\x20\xee\x0d\xcb\x33\xe1\x0d\xcb\x17\x03\x65\x4b\xe9\x0e\x1b\x16\xd9\x39\x7e\x85\xd9\x9c\x46\x56\xc0\x89\x95\x24\xbf\x23\x4f\x14\xbf\x14\x3f\x3c\x98\x33\x9c\x3e\x9e\x32\xac\xbf\x9f\xe8\xdf\x9e\xb9\xda\xf1\xd8\x1a\x0d\xaf\x23\x1d\x64\x39\x38\xe3\x74\x7b\x29\x46\x38\xc2\x70\x29\xff\x60\xf0\x92\x5f\x40\x23\x02\x97\xe2\xff\x49\x59\xcd\x5e\xc1\x15\x5e\xe0\x1c\x08\xf0\x81\x84\x5b\xa5\x85\x91\x3d\x5a\xf3\x38\x05\xea\x5a\x8b\x44\xfa\x07\x89\x4f\x3c\x4e\x4e\x01\x18\x5c\x8a\xcc\x22\xd8\x67\x63\x72\x0a\x00\x18\x2c\x45\x15\xe6\xcb\x62\xe5\x95\x2a\x46\x2f\x52\x5b\x89\xc1\xf3\x0d\x76\xe3\xc1\x73\x20\xb7\x3e\xf8\x43\x9f\xf9\x87\xfc\x8f\xe1\x86\x69\x94\x30\x0c\x16\x7e\x51\xf3\x43\x55\xdb\xfc\xe6\xc6\x93\x91\x0b\x5a\x9f\x94\x5b\xb0\x99\xac\xc5\x4f\x5c\x27\x15\x4c\xe0\x74\x77\xa9\x60\xde\x47\x49\x42\x99\xb4\x0e\xfe\x44\xe2\x81\xae\xbe\xce\x3d\xb4\x21\x26\x28\x78\xfd\x9c\x2d\x63\xac\x93\x89\x6e\x12\x19\x1a\xae\xa0\x5f\xb8\xef\xdf\x3b\xf7\x5d\x6c\xe6\xbe\xc9\xd3\xec\xe7\x17\x5f\xa7\xb4\xc6\x7d\x0f\x85\xd6\xfb\xc8\x70\x47\x7d\x79\x34\xec\xd3\x20\xb9\xb1\x87\x15\x03\xc6\x6b\x3c\xae\x2a\x9c\xf0\xad\xe9\x75\x70\x62\x42\x9f\x7d\x04\x6b\xaa\x76\x57\xed\x0e\xc7\x5e\x9a\xd1\x10\xe7\x39\x8e\x6c\x95\x78\xa5\x78\x3f\x6a\x51\x7c\x1f\x1a\x2e\x4c\x0e\x59\x84\x3b\xa3\x09\x43\xb1\x35\x7a\xc5\x82\xc9\xc1\xdf\x87\x63\x2f\xb7\x06\xdb\xaa\x32\x1f\x42\xcf\x44\xd9\xe7\xf3\x56\xaf\x9a\x06\x00\x1a\x0e\x97\x2f\xad\x87\xc2\x8a\x4f\x25\x49\x44\x42\xc4\x68\xc6\x99\x55\xa5\xf0\xe3\x2d\x88\x36\x4f\xe7\x8c\x17\xc9\xfb\x48\xff\x3a\x95\x98\x7f\x60\xf7\xf8\x00\x8e\xef\x7f\x25\xb4\xf6\x9e\x8a\x9d\xaa\xd1\xf5\xc0\x42\x57\x8e\x63\x1c\x5a\x6b\x20\x18\x35\x3d\x40\xfb\xab\x8b\xcb\xae\x67\x5e\xd3\xba\xe3\x89\xb5\xfb\x81\xd5\x5e\x08\xc3\x5e\x77\xc9\x38\x0e\x6b\x79\xdf\x1a\x58\x37\xd7\xf9\x01\x73\xca\x5a\x5b\x53\xad\x20\xc4\x28\xe4\xfc\xa8\x0c\x1b\xdb\x47\x59\x86\x96\x5a\x2d\x28\xb4\x85\xd3\x64\x2b\xb5\xe0\xfa\xeb\x60\x1d\x8f\x1a\x06\x7e\xde\xf4\xef\x4e\x6a\x5a\xc2\xd6\xf3\x62\xb8\xc4\x95\xcc\x6d\x52\xdd\xd3\xe2\x37\x8c\xf1\x94\x59\x1f\xf9\xcf\x52\xf0\x20\xe6\xa4\x18\x46\x24\x57\x7c\x08\xbf\x35\x46\x0c\x5a\x23\x1f\x11\x28\x23\x20\x8c\x12\x28\x16\x56\x30\x26\xb1\xcd\x98\x90\xa9\x7f\x87\x5c\x5d\xdd\x21\x2a\x41\x9a\xd6\x38\xf2\x65\xd1\xf7\x04\x19\xe4\x34\x63\x4f\x96\x3e\xb3\x89\xb1\x48\x1b\x57\x65\xa2\xa3\x01\xf6\x45\x86\x53\x88\x82\xc4\x07\xf2\x6f\x05\x61\x55\x8d\x69\x44\xa0\x38\x82\x23\xe1\x0d\x34\x67\x8b\xf8\x04\x4d\x31\xf0\xcf\x58\x86\x92\x9c\x8f\x76\x24\xfe\xe2\xe4\xcb\x3f\x4c\x2f\xe1\xdd\x15\x2d\xd3\x4b\x70\x06\xe4\x0c\x46\x64\x1c\x9f\x42\x73\x08\x47\x67\x77\x57\xfc\x4b\xd9\x43\xac\x77\x77\x85\xca\x33\xa8\x8f\x9b\xc2\x9e\xe9\x59\x7b\x89\xf8\x04\x94\x25\x00\x65\x4b\x09\xd6\x28\xfd\x80\x97\x1c\x93\xe2\xeb\x63\x6b\xec\x4d\x96\xee\xce\x1d\xb2\xbf\xef\xb3\x63\xc1\xda\xa9\xc4\x76\x0c\x04\x41\x50\x7d\x20\x90\x81\x11\x0e\x82\x80\x80\xd2\x3d\xb8\x26\x06\xa7\x58\xe5\x6a\x48\x22\xc0\xa2\x0a\xb1\xde\x56\xe4\x63\x57\xfb\xdb\x4e\x95\xe1\xd8\x08\x48\x9b\x35\xb4\x68\x33\x3c\x00\x91\xad\xab\xcd\xeb\x6d\x1a\x64\x09\x8e\xe3\xad\xf5\xc3\xeb\x21\x39\x1d\x23\x9b\x1d\x0c\xd7\xb1\x83\x05\x0c\x77\x67\x07\x19\xa5\x31\x23\xed\xf9\xb8\x7e\x17\x46\x49\x0f\x9e\x3f\x7c\xfc\xe4\xe2\xf2\x7e\x0b\x2f\x60\xdd\x68\x12\x2f\x0a\x19\xd6\xad\x36\x3c\x95\x2f\x32\xc2\x39\x8e\x24\xb5\x0b\xcd\xb0\x0a\x47\x8a\x21\xb8\xdf\xa5\x9a\xa1\xee\xd3\x9a\xc3\x2b\x1c\x59\xbc\x82\x7e\x3d\x7f\xe0\xde\x68\xea\x0d\xd0\x79\x2b\xfe\x0a\x3e\x92\xf5\x1f\x8a\xcb\x32\x23\x38\xd7\x57\xe4\x43\xf9\x08\x5a\x2c\xc4\x07\xe7\x6e\x7d\x28\xaf\x71\x7c\x69\x5d\x9d\xf5\x7b\xe9\xa1\xf3\x62\xb9\x49\xa5\x25\x4c\x83\x0c\xae\xbe\x95\xec\x07\xb4\x6e\x37\xf5\x20\xcb\x89\x37\xff\xdd\x62\x05\x2b\xae\xb3\xf6\x9b\x4e\x1a\xc8\xf2\x35\x08\xaf\x77\xd1\xa9\xb5\xfd\x95\xec\x8c\x1a\xc3\x39\xff\x22\x86\x7d\x11\xc3\x7e\xef\x62\xd8\xe5\x93\xc3\x90\xfc\x85\xfc\x9e\xc4\xb0\x87\xce\x95\x71\xce\x8f\x4d\x58\x93\xc4\x7a\x95\x08\x45\x42\xce\xc5\x48\x05\x3e\xf4\xac\x82\x9c\xa1\xd9\x0c\x37\x1e\x64\x6e\x51\x7a\x8b\x7f\x87\x92\x9b\x32\x30\x7b\xa8\x7a\xd1\x18\x6e\x31\x2e\xfb\xdc\x65\x39\xe8\x5d\xf6\xd5\xd4\xae\x71\xd7\x9d\x6f\x21\xd4\xc1\x30\x58\x89\x78\x95\x23\x4f\xc6\x0d\xef\x87\x24\x0b\x63\x2c\x9f\x15\x20\x49\xa6\x74\x24\x92\x71\xd5\xbe\x97\x30\x32\xcd\xaa\x20\x93\xaa\xb6\x57\x0a\x49\x31\xbd\xb9\xa4\x28\x5f\x5d\x2c\xa9\x50\x7e\xb8\x96\x5c\xc8\xc8\x02\x4b\xc6\x68\x94\x68\x21\x71\x7b\xc1\x90\x4f\x88\x06\x96\x5c\xb8\x97\xec\xef\xfb\x34\xa0\xd5\x2d\x21\xe5\x63\x14\x1c\xc2\x3c\xb8\x33\xd4\x77\x1d\xed\x14\x1b\xf7\xd0\xfe\xfe\x9d\x7c\x7f\xff\x15\x62\xf3\x01\x9a\xe4\x3e\xed\x23\xf0\xb7\xfb\x87\xc7\x79\x70\xe7\x70\x94\xef\xef\xfb\x1c\x0e\x30\x74\x36\x3f\xee\x0f\x1f\x8e\x0e\x61\x1a\xc4\x7e\x52\x17\x37\x7b\x28\xa0\xf0\xba\x32\xa7\x94\x37\xe1\xdd\x55\xa1\xc4\x4e\xbe\xe1\x46\xe1\x98\x88\x4c\xcd\xa7\xd0\x10\xaf\x51\x64\xbe\xd9\x74\x6b\x94\x8b\x90\xa3\xea\x13\x8e\xbc\x91\xe7\x29\xd1\x95\xcb\xaa\xa2\x45\xd9\xc3\xe7\x38\x61\x52\x66\x4d\xbf\xc8\xac\x7f\x40\x99\x35\x5d\x2f\xb3\xa6\x5b\xc8\xac\xd2\x7a\xf0\x4b\x08\xca\x5f\x3c\x04\x65\x1b\xea\xdb\x02\x50\xbe\xa7\x93\xc1\x2a\x95\xf1\xf3\xb5\xb1\xa7\x8e\x2b\x69\x7e\x47\x18\x45\xfa\x47\xf9\xab\x86\x8b\x5c\x1b\x0b\xb2\x75\xbb\xc9\x48\x90\xcd\x10\x8c\xef\xe9\xa4\x23\xe4\xa2\xb2\x61\xb4\x43\x2c\x3a\x08\xaa\xa2\x28\x5a\x5f\x6c\x24\x35\x03\x25\xea\x14\x05\x26\x66\x9c\x8b\xf3\x66\xb0\xc4\xcd\x61\x07\xdb\x1a\xeb\x10\x82\x55\xeb\x67\x18\x59\x81\xf1\xec\x61\xb6\xc6\x0e\xfc\x12\x7d\xee\x4b\xf4\xb9\xdd\xa2\xcf\x09\x51\xa2\x4f\x0b\x96\x93\x08\x77\x24\x8c\xae\x2a\xdc\x6a\x12\xec\x5f\x21\x6e\x89\xcc\x26\xda\x4f\x68\x84\x9b\x89\x0f\xb7\x49\x78\xb8\x53\x16\x42\x4b\xbf\x73\x81\x98\x90\x3e\x4c\x8d\x05\xb9\x24\x49\x7e\x70\x41\xd8\xdc\xca\x07\x7f\x4e\x72\x32\x21\x31\x61\xcb\x7e\x84\x99\x0e\xc3\xd4\x11\x47\x65\xe7\xdc\x85\xf2\x2e\x75\x72\x82\xec\x35\x63\xe5\x7d\x0e\x66\xbf\xb3\x2f\x1a\xaf\xdf\xbb\xc6\x8b\xb3\x4c\xcb\xc0\x17\x66\x78\xc8\xcd\x15\x58\xc8\xaf\xb5\x5c\x81\x8d\xd3\xdd\x4c\x16\x18\xca\x28\x81\xe2\x38\xbe\xc5\xb1\x64\xe3\xe7\x24\xad\x85\xf3\xce\x75\x66\x0d\x6a\x73\x5b\x1c\xac\xf8\x4d\x73\x22\xb3\x89\x15\xb9\xe0\x6e\xd2\xa0\xf0\xfd\x45\x9d\xa7\xf2\x89\x9b\xca\xdf\x18\x62\xe9\xcc\x45\xcd\x48\x10\xad\x71\x20\xe6\xf5\x24\x75\x2a\xda\x1e\x24\x02\xd1\xd0\x67\x81\x18\x98\x07\x48\xe2\x4b\x1e\x08\x7c\x22\x2e\x58\x0f\x44\x91\x32\x95\x41\xa3\x2b\xad\x5b\x72\x4b\x69\xdd\xea\xec\x1d\x9f\xea\x1e\xde\xdf\xc7\x26\xa9\xd3\x80\xcd\x71\x22\xf3\x30\x4a\xa1\x51\x0c\xcf\xa4\x76\xc2\x70\x78\x78\xc8\xaf\x85\xb2\x22\xad\xdf\xa3\x24\x8a\x45\x10\x1c\x32\xf5\x23\x1a\x0a\x4c\x0f\xe6\x24\x8a\x70\x02\x2c\x18\x56\x62\x37\x91\x88\x6a\xd5\x3a\x94\xee\x4e\x9d\xb8\x39\xed\x90\x61\x33\x9c\x4e\x6d\xfd\x95\xf1\x67\x6d\xd7\x69\x33\x50\x2b\xc7\xb4\xf0\xdb\x69\xdf\xa1\x8a\x28\x7a\x51\x86\x88\xe0\x2e\x83\x20\xc0\xc7\x9e\xe2\xb3\x19\xbe\x64\x3d\x2b\x85\x49\x82\x63\x32\x23\x93\x18\xb7\x57\xbb\x40\x99\x80\x31\xf2\x44\xf0\xb2\xd6\x3a\x4a\x3d\x35\xf2\xbc\xb2\x84\x93\x60\xe6\x2f\xda\xf2\xe1\xdd\x56\xae\xe5\xa9\xdb\x81\xda\x9f\xe3\xf0\xa6\x90\x1d\xb8\x6d\x8b\xb0\x5d\x8a\x8a\xcd\x60\x00\x5c\xd8\x92\x7c\x1a\x2c\x38\x67\x97\x8a\x7f\x2d\x6e\x6e\xb9\x25\x7f\xb3\x53\x1c\xe1\xdf\x63\xfc\xc6\x90\xa6\xcb\xbe\x52\x9d\x6f\xc2\x42\x5b\xb2\xe9\x9b\x28\x29\x60\x5e\xb1\x54\xc5\xe7\xa8\xa6\x08\x8d\x9a\xa2\x7e\xbb\x5a\x38\x55\xda\x08\xd2\x96\x5a\x96\xd5\x52\xbe\x8a\x04\xed\xca\x29\x1b\x40\x9d\xf4\x95\x54\x49\x5f\x8f\xf0\x7d\x37\x93\x2c\x56\x6a\x82\x12\x70\xce\x48\x38\xbb\xf0\xc9\xfa\xad\xca\x8b\xae\xb8\xb8\x9b\xe2\x2b\x15\x3a\x1d\x54\x4c\xd2\x09\x45\x59\xf4\xce\x4a\xdd\x5a\x58\xd9\xa8\xf4\x68\xac\x88\x4c\xea\x3d\x07\x6b\x6f\x73\x2b\x2a\x53\xfe\x9b\x8d\xca\x54\xc2\xa8\x26\xc5\xa7\x2d\xf3\x58\x08\x1d\xc1\xe4\x66\x61\x96\xe6\xae\x7a\x60\xd2\xc1\x82\xcf\x39\x0b\x3e\x51\x2c\xf8\xbc\xce\x82\xdb\x3f\xe1\xdc\x65\xc1\xe7\x9d\x2c\xf8\xfc\xea\x6a\xee\xb2\xe0\xf3\x3a\x0b\x3e\x0f\x16\xbb\xab\x07\xb8\xbc\xa4\xd5\x03\x73\x00\xa7\x16\x0b\x3e\x77\x18\xe4\xb9\x62\xc1\x6b\xdf\x8f\xe7\xcd\xd5\x99\x1a\x16\x7c\xbe\x9e\x05\x77\x7b\x68\xdf\x60\x7c\x88\x73\x3e\x3d\xa5\x63\x0b\xe6\x8e\x8a\xc0\xce\x03\x69\x59\x37\x6d\x22\xa6\x11\xca\x0f\x50\x18\xe2\x54\xc4\x94\xff\xbd\x5a\x2c\x9d\x14\xf7\xf0\xbd\xbf\x4f\xfe\xee\xfa\x0e\xea\x60\xc8\xe6\xe1\x32\x42\x79\xdf\xa0\xa3\xcb\xf6\x68\x81\x48\xd2\xe2\x2a\xaf\x8b\xe7\xf7\xed\xc2\xb7\x38\xa4\x8b\x05\x4e\x22\xf9\x90\x5d\x03\xde\xea\xc8\x77\x64\x35\x7e\xdc\x4b\xf0\x45\x8f\xef\x62\xde\x96\x4e\x85\x57\x50\xef\x3d\x9d\xf4\x38\x4f\xd9\x4b\xe8\x45\x6f\x82\x7b\x11\x4e\x63\xba\xc4\xd1\xa0\xdd\x8d\xaf\xf1\xc1\xbc\xfa\x1e\x8a\xf7\xe6\x39\x0e\x3f\xd4\x5e\x24\xdb\xc2\x8a\xc8\x40\x45\xd5\x83\xeb\x0e\x6f\xa9\xf6\x16\xfb\x95\x6c\x85\xf8\x10\x22\x32\x9d\xe6\x7d\x41\x29\x6e\xdb\x38\xc8\x51\x0d\x65\x38\xa7\x45\x16\xe2\xbc\x2f\xfa\xec\x8a\xab\x78\x5b\xfb\x3f\xde\xbc\xff\xa3\xc7\x47\xcb\x87\x97\x0f\xde\x3b\x66\x23\x9e\xc4\x86\x31\x1e\xb1\x51\xb4\xc1\x35\x92\x4d\x68\xb4\x5c\x73\x08\x58\xb6\x2e\xb0\x8c\xa7\xfc\x2a\x55\xf1\x53\x19\x6f\x7f\x9d\x6d\x81\xc7\xec\xf3\x28\xec\x49\xe0\xd8\xb3\x72\xfd\x19\xb3\xf3\xde\xab\xef\x3f\x5e\x1f\x92\xcc\x41\x68\x01\x23\x4f\xd6\x03\xb3\x1c\x44\x39\xfa\xec\x69\x3d\x23\xd3\x29\xe6\x5c\x27\xde\x66\x3c\x6d\x20\xb4\xe1\x87\xdc\x47\x3a\x43\x68\x4e\x66\x09\x8e\x9e\x89\xaa\xa7\xb7\x04\x59\xe7\x13\xdc\x04\xbc\x9b\x6e\xed\xb6\xe4\x86\x2c\xb6\x92\xc2\xc6\x14\x84\x8d\x90\xb6\x5d\x4a\x0b\x63\xe4\xb3\x01\x53\x99\xdd\xcb\x8e\xfb\xc3\xee\x52\x62\x67\x73\xaf\x06\x8b\xed\x1d\xdf\x60\x2f\xfd\xa9\xf7\xa9\x76\x53\x8a\xb3\x10\x27\xec\x13\x6d\xa7\x4d\xd0\x37\x5d\x59\x1b\x9c\x8a\x75\xcc\x9e\x1d\x5c\x89\x9d\xbb\xa0\xeb\x46\x92\x82\x08\xed\x30\xb6\x11\x00\xaa\x67\x0a\x7e\x4b\x9b\xc8\xd5\x96\xdb\xa4\x18\x1e\x1c\xc2\xea\x4b\x56\x63\x07\x72\xab\x04\x5f\x86\x71\x11\xe1\xa8\xce\x30\x68\x25\x91\xda\xf3\x55\x97\x48\x76\x23\x06\x22\xb2\x12\x47\x38\xd6\xae\xa6\xd6\x76\xed\x68\xa0\x32\x13\xab\x36\xa5\x1d\x18\xaf\xca\xc3\xf7\xcd\xe1\xb1\x47\x12\x7e\xaf\xe4\xd8\x1b\xe1\xbf\x1d\x1e\x7b\x11\xd6\x3f\x3d\xcf\x4a\xac\x4e\xd7\x19\x24\xc4\x90\x6e\x7c\xbb\x91\x8b\x92\x2f\x88\xb0\x1f\xfc\xb4\xd7\xb3\xf5\x72\x13\xd3\x10\xc5\xfd\x9c\xd1\x0c\xcd\x6a\x21\xeb\x85\x1d\x99\x78\xd9\x75\xde\x67\xb6\x0b\xb8\x52\x29\x09\xa2\xcf\xe9\xdd\x25\xfd\xf2\xee\xf2\x7b\x7f\x77\x91\x2c\xe3\x62\x33\xcb\xf8\x5f\x7f\x79\xfb\xe4\xbf\xfe\x72\xf8\x3f\xeb\x44\xa6\xca\x72\x97\xcb\x4d\xe6\xfc\x5a\x86\xb0\x87\xf2\x28\xc7\x28\x11\xd4\xec\xc7\x24\xc2\x59\xce\x28\x95\x81\x24\x0a\xfb\xa7\x63\x97\xeb\x55\x41\x00\xd7\x02\x71\x6c\x8a\x87\x5a\xfe\x92\x16\xb5\x0d\xfb\x64\x1c\x3d\x2e\x18\x5d\x20\x61\x61\x1c\x2f\xed\x18\x8d\x1d\x12\x5b\x45\x96\x5a\xae\xa2\xd6\xa0\x8a\x36\x8a\xba\xb8\xa1\xb5\x42\x62\x57\x97\x2e\x14\x5b\x54\xfc\x81\x13\x39\x2d\x16\xb2\x1e\x4a\xd3\x78\xd9\x63\x73\x9c\xe3\x9e\x96\x47\x7a\xe1\x1c\x25\x33\xfe\xbb\x76\xc3\xb8\x62\xe3\xba\x5e\xde\xd1\x5e\xc2\x0f\x58\x8f\x5f\x33\x0e\x9c\xde\x94\x66\x52\x40\x65\x28\xff\xd0\x9b\x65\xb4\x48\x7b\x68\x86\x48\x02\xf9\x8c\xf8\x69\xed\x45\xcb\x04\x2d\x48\x28\x86\x47\x54\x5a\xc9\x9c\x7c\x24\xc9\xac\x47\x12\x3e\x5c\x21\xdc\x8a\xfd\x4d\x44\x82\xad\x2e\x7e\xb3\x31\xdc\x36\xe4\x0b\x4e\x45\x9a\xe3\x35\x43\x04\xb5\x9b\x7d\x4b\x41\x48\xfe\x36\x4f\x27\x9d\x06\xdb\x47\xb6\xc1\xb6\xda\x66\xd5\xa6\x16\x2f\x62\xb6\x39\x7c\x35\x02\x7b\x0f\xaf\xe1\xb8\x94\xc5\xf9\xda\x08\xcb\x24\x49\x0b\xa6\xa3\xc5\x08\x61\x5e\xdc\xa0\x86\x21\x13\x5b\xe9\x45\xf2\x6e\x8e\xbf\x2b\x58\x91\xe1\x2a\xe4\x0b\x4d\xe4\x86\xa8\x8c\xcd\x85\x01\x7a\x4b\x13\x09\xce\x36\x09\x17\xe8\x10\xbd\x4d\xe8\x65\x97\xa9\x37\xff\xe7\x19\x4d\xfe\xdf\xff\xfd\xff\xb1\x5e\x3e\xa7\x17\x72\x77\x88\x2d\xb1\x7b\x64\xd0\xd3\xa6\x12\x42\xd8\x77\xd7\x82\xfa\x09\x8b\x0a\x46\x67\xb3\x18\xf7\x55\xd8\xbf\xed\x79\x42\x75\xe8\xd6\xb9\xec\x4e\x54\x58\x99\xcc\x8a\x1c\x23\x00\xd6\x4f\xf0\x33\x92\x2f\xf2\x1c\xc5\xd6\x32\xc3\x3b\x43\x00\xf3\x1b\x04\x96\x89\x94\xda\xba\x9d\x12\xc2\x42\xbd\x1d\xeb\x6a\x6d\xab\xa8\x62\xd1\x94\x6d\x94\xd0\xb7\xed\x72\x55\x05\x7f\xb5\x40\x49\xc1\x4b\x9f\x69\xe4\x08\x54\x94\x8d\x3d\xae\x5b\xb7\x0e\x2e\x50\x8c\xa7\x3b\x20\xb8\x5d\x87\x52\xbf\x5d\x04\xa9\x9f\xdb\x6f\x6d\x1d\x78\xb8\x79\x20\x92\xd0\xed\xa9\xf5\x40\xc4\x03\xc1\x23\xe2\xe8\xda\xdd\x35\xac\x9d\xee\x0c\xcb\x12\x40\xa7\xf3\xd6\x5b\x0b\x8e\xe9\xd6\x66\xc6\x9b\xa1\x01\x98\xd7\x1e\x28\xeb\x4d\x9a\xf4\xec\xda\xbd\x37\x41\x39\x5d\xe7\xb6\x56\x6f\xb2\x4e\xa8\x58\xc0\xc9\x56\x42\x05\x56\x51\x2d\x3f\x85\x33\xe0\x3a\x91\x40\xf1\xcf\xb7\x96\x34\x85\x6e\xe6\xd8\xce\xef\xe1\x97\xd9\xbf\x86\x27\x5b\x29\xb9\x25\x5e\xdc\x9b\x65\x33\x07\xb3\x15\xff\x52\x01\xef\xba\xa6\x8f\xda\xee\xb4\x77\x73\x9c\xe1\xde\x05\xff\x8f\x80\x90\x6b\xbf\x14\xce\x1e\x58\x1c\x43\x3e\xda\x8a\x13\x48\x33\xec\x68\x28\x86\x0d\x05\x44\x1b\x84\x16\x1d\x39\x8a\x71\xc6\xd6\xea\xc8\x3b\xd1\xb7\x81\x07\xd9\xcc\x81\xc4\x2a\x5a\x5a\x07\x0b\x32\x6c\x61\x41\x14\xc1\x5a\xc3\x7f\xbc\xfe\x80\x96\x5b\xaa\x5e\x84\x13\xb2\x5e\x51\x47\xfd\x2f\x2e\xdc\x6d\x2f\x58\x01\x63\xdd\xe5\x8a\xd6\x25\xd8\xa9\xcf\x69\xeb\xdb\x4a\x5e\x1e\x79\x2d\x0d\x4d\x11\xb8\x18\x82\x61\x60\x05\xa3\x8d\x36\x9a\x51\xc7\x2d\xd7\x43\x45\xd2\xd2\x5a\x6f\x0b\xf7\xc5\x34\xea\x10\x9e\x17\x5c\x78\x8e\x94\xf0\xbc\xa8\x0b\xcf\xf6\x4f\xb8\x70\x85\xe7\x45\xa7\xf0\xbc\xb8\xba\x5a\xb8\xc2\xf3\xa2\x2e\x3c\x2f\x82\x70\xf7\x17\xd3\x1c\x16\xe6\xc5\x74\x01\x60\x6a\x09\xcf\x0b\x47\xb4\x5d\x28\xe1\xb9\xf6\xfd\x78\xd1\x14\x9e\x53\x23\x3c\x2f\xd6\x0b\xcf\x6e\x0f\xed\x34\x96\x0f\x71\xc1\xa7\xa7\x84\x67\xf9\xc8\x64\x19\xc8\x5a\x57\x0d\x5a\x77\xd5\x50\x88\xb6\xba\x6a\xea\xe2\x50\x1f\x85\x21\xcd\xa2\xed\x53\xad\x5e\xf3\xf6\x69\x57\x5a\x75\xdb\xbd\xd8\x2e\xec\xe2\xc3\x35\xdf\xaf\xa0\xc9\x23\x2e\xaf\xba\x2f\x56\xc7\x5f\xb4\x5f\x9f\x89\xf6\x6b\xb9\x99\x97\xba\xff\x7f\x5e\xb3\x87\xef\x86\xff\xb2\x79\x29\x4b\x1b\xc5\x85\x59\x5b\xf9\xe4\x99\xcc\x02\x42\xe1\x64\x79\x87\x77\x11\x85\xde\x84\x5e\xe2\x48\x67\x63\x76\x34\x66\x61\x4c\x73\x11\x23\xe2\x14\x5a\x7f\x9f\xd6\xfc\xc4\x75\x5d\x29\xfa\xd6\x9d\xee\xc7\x63\xef\x5b\x79\x84\xb5\xdb\x74\x4b\x34\x94\xa1\xe1\x0a\x3c\xa2\x34\x69\x9b\xd2\x41\x1d\x09\xb7\xf6\xd7\xa9\x4c\x3b\xd0\x92\x64\xa3\xf2\x00\x47\x09\x59\xc8\x29\x87\x34\x61\x88\x24\x38\x53\x3a\x8a\x2a\x08\x81\xa9\xf3\x54\x57\x39\x59\xe3\xa2\xdf\x95\xbf\x21\x2f\x16\x22\x0e\x29\xf4\xbe\x55\x8c\x00\xff\x93\x03\x8d\x63\x94\xe6\x32\x72\xca\x07\x92\xbe\xc5\x39\x96\x33\x93\x41\x68\x1c\xb5\xa0\xf6\xa5\x3f\x52\xf8\x17\x7e\xfb\x2c\x2b\x70\x2d\x66\xcb\xae\xf9\xa1\xbe\x32\x30\xe7\x18\x89\x3e\xcc\xb8\x25\x23\xf7\x52\x6b\x78\xc4\xfa\x3f\x6c\xc1\xf3\x29\xf4\x4e\xe4\x76\xdb\x3a\xef\x44\x83\xff\x8c\xf1\x74\x63\x1e\x2e\xc5\xef\x3e\x3a\x15\x9b\xca\x71\x52\x6f\x0f\x06\x60\xf5\x39\xac\x49\x03\x4a\xdf\x58\x17\x0b\x5a\x35\x5d\x2e\x08\x31\x5c\xa1\x3a\x74\x79\x77\x38\xf6\x18\xca\x3f\xfc\x5d\x94\x41\x2f\xa9\xb2\x4e\x6c\xcc\x30\xb1\x0d\x8a\xf4\x55\xb7\x46\x07\x5d\x7f\x37\x15\x6f\x67\xee\x39\xe8\xee\x64\x6d\x86\x15\x7b\xf2\xfa\xf6\xad\x19\x48\xbc\xf9\xb1\x13\x7b\xbd\x46\x76\x8e\x0d\xd6\x02\xdb\x0c\x42\x3d\xdb\xde\xc2\xe3\xf1\xda\xe3\x52\x3b\x58\x1d\xd8\x36\x4f\xc9\xbf\x24\xc2\x5f\xe1\xc5\x35\x10\xde\x6d\x44\x71\x3b\x38\xdf\xfa\x55\x7d\x6b\xb4\x77\x54\xd4\x1f\x9b\x29\xeb\x9a\x39\xed\x8e\xda\x6a\x18\x72\x61\xd3\x67\xe4\xc6\xa5\x8a\x49\xce\x6c\x3e\xd9\xd3\x81\x3b\x6a\x3a\xdd\x16\xde\x3a\x44\x19\xa7\xf2\x45\x12\x0b\xcb\xd6\x5d\xad\xd1\xba\x2e\xe5\x75\xc2\xe9\x79\xe0\x87\xd2\x6d\xa8\xcb\x2c\x5a\xdd\xd4\xc1\x9d\x43\xa5\xd8\x6c\xbf\xde\xa4\x6f\x93\x15\x48\x42\x45\xe6\x30\x21\xb8\xf5\x68\x9e\xc7\x58\x38\xaf\x48\xbb\xff\xef\x65\xb8\x8e\xf4\xf2\xac\xb2\xb4\xa6\x95\xa5\xf5\xf0\x10\xec\xd4\xab\xa7\x7b\x3d\x4c\x2f\xbd\x56\x88\xb9\x71\x72\x62\x38\x67\x24\x99\x1d\x1f\x8e\x1e\x3c\xd4\xdd\x5c\x20\xc2\xbf\xbd\xa3\x6f\xe4\xf5\x19\x70\x44\x81\x41\x94\xd1\xd4\x07\x30\xba\x81\x9e\xbb\x72\x45\xaa\xf7\xe0\xc1\x54\xa9\xb8\xe7\xc6\xba\x5b\xb2\x46\x70\xe1\x14\x74\x31\x16\xc6\xc1\x4a\x57\x34\x0c\x83\x76\x78\xd2\xdc\x54\x15\xa6\xc2\x59\x8d\x00\x77\xcd\xff\x50\x98\x5e\x70\xce\xb0\x52\xe8\x56\x3a\x0a\x75\x0a\x06\x24\x7f\xa3\x63\xad\x5c\x5d\xb5\x42\x2a\x6d\xfb\x92\x9a\x57\x52\x0d\x90\xb9\x0b\xf7\x2c\x1b\x94\xc2\xd8\xa0\x60\x88\x07\x21\x2d\x12\x06\x9b\x4d\xbb\x6d\x50\x74\x8d\x4e\x5b\x94\x12\xa6\xc1\xcc\x8f\xea\x2e\x39\xee\x3a\x7d\x3a\xdd\xf8\xc2\xed\xdc\x6c\x81\x4f\xd7\xe7\xc4\xed\xb3\x73\x77\x7d\x8a\x31\xb8\xc7\x56\x24\x6e\x12\x7e\x51\x51\x8b\x5e\xff\x76\x3c\xa3\x6a\x90\x8d\x7c\xb1\x4b\xba\xa6\x76\x08\x00\x46\xb6\xb2\x3f\xb2\x95\xfd\xe7\xeb\x34\x30\x4b\x78\x7e\x1d\x0d\x8c\xbc\x25\x3e\x69\xca\xf4\x6d\x4c\x86\x36\xea\x57\x3a\x55\x33\x8e\x02\x47\xaa\x6b\x36\x68\x63\x60\x28\x95\x17\x96\x3f\x00\x9c\xc1\x25\x3c\x87\x17\xf0\x23\x7c\x0f\x2f\xe1\x6b\xf8\xa6\xd2\xd0\x7c\xf8\x9c\x34\x34\xaf\xbe\x68\x68\xfe\x18\x1a\x9a\x93\xcd\x1a\x9a\xbf\xe7\x4f\x8a\xf9\xec\xc9\xcb\x0e\x0d\x8d\xf0\x0c\xcf\x99\x98\xc3\xd3\xca\xbd\xaf\xae\xb2\xe9\x7c\x1d\xb3\x5b\x37\xd4\x16\x76\x61\xb7\xc2\x42\x48\x33\x8f\x6a\xf1\x68\x05\x27\xeb\x6d\x1c\xa2\x13\x9d\xb6\xa2\xed\x9e\x79\x57\x73\x74\x17\x6f\x32\xba\x20\x39\xe6\x72\x77\x2c\x03\x0e\x1a\xb3\x29\x9d\x88\xb6\xa1\xc4\xe8\x56\x60\x3c\x68\x13\xb8\x5d\xcc\x0d\xeb\x98\x93\x13\x3c\x52\xf2\x54\x93\x0a\xb7\xaa\xae\x78\xc9\x8b\x86\xfa\xaa\x86\x49\xf7\xd5\xf1\xa8\x5a\x27\x46\xd3\x1e\x3d\xe7\x74\x18\x5f\xf4\x48\x92\x48\x72\x69\xa9\x9a\x76\xd2\x46\xb8\x1d\x61\x14\x29\x30\xa2\xb3\x6d\x3a\xea\xb2\xf1\x92\x59\xbd\xe2\xa2\x2b\x4f\x6e\x43\x10\x14\x69\x46\xd7\x2a\x3f\x64\xfe\xcd\xcd\x2a\x90\x5b\x54\xaa\xac\xb5\x53\x9a\x3f\xa8\x66\xca\x61\xe4\x29\xaa\xcb\xd3\xeb\x06\x66\x1a\xf4\x1b\xe6\x4e\x3f\xe8\xa2\x51\x87\x34\xde\xd4\x3e\xe9\x69\xbd\xa7\x93\x1f\xaa\x91\x6c\x3b\xa5\x1d\x6d\xcb\xc4\xfd\xbd\xd5\x2e\xdc\x90\x84\x56\xda\xb1\x43\xef\x5b\x87\x37\x17\xbc\x41\x3b\x33\xee\x59\x39\xa1\xeb\xe7\x54\x7d\x74\x41\x59\x45\x9d\x20\x5b\x08\xc5\xce\x48\x49\xb8\x14\xcf\xc8\x39\xde\x1d\x31\x75\xcb\x00\x4d\x27\x0c\xc0\x6d\x3c\x08\x36\x8d\x6e\x81\x48\xd2\x39\x30\x61\xb9\xd8\x97\xf6\x63\x6b\x2c\x06\x0f\x2d\xcf\xa9\x35\x96\x79\x4c\xea\x7c\x37\x64\x00\x6e\xb8\xcd\x38\x7a\x30\x2e\x51\xbe\x13\x23\x7a\x1c\xc7\xef\xf4\xd0\xda\xb4\x60\x5d\xbe\x36\xef\x50\xfe\x61\xb3\x36\xcb\x71\x40\xd1\x46\x74\x71\xed\x40\xca\xfe\x7b\x8f\xd5\xd7\x6b\x00\x0c\x71\xbc\x2e\xe5\x75\xfd\x88\x88\xb0\xb4\x47\x0f\x4c\x24\x5e\xdd\xff\xd3\x37\x3f\xb6\x5a\x9f\xa2\x38\x16\x4b\xa8\x10\xe4\x7d\x6b\x82\xf0\x42\xfe\xf7\x33\x69\x85\xaa\x1e\x08\x24\x2c\xfb\x69\xe4\x91\x75\x39\xa1\x38\x7e\x9a\x16\x0a\xf1\x26\x90\xaf\xae\xf9\x97\x8e\x9a\xa6\x87\xd6\x10\xc8\x6b\x6a\x1b\xc8\x5f\x35\xf3\xc9\x33\xbd\xfa\xce\x71\xfd\x8e\x66\x6f\x8d\xee\xf2\x54\x6b\x89\x4d\xe0\xf9\x4d\x29\xc8\x9d\xc5\xb2\xa2\xf7\x72\x32\xdc\xbf\xc8\x50\x9a\xd6\xcf\xea\x26\x35\x74\x57\x16\x67\xa7\xaf\x5f\x6b\xd7\x48\xf5\xe9\x2f\xb0\x71\xa4\x13\xe1\x96\x7b\xc7\xae\xbc\xd5\xf6\xe9\x68\x70\x1b\x3b\x48\x82\x7e\xf5\xe4\xd3\x6e\xa3\x4d\xca\xf5\x9d\xb7\x51\xdb\xeb\x5b\xe7\xa6\xf2\x42\x1a\xe7\x29\x4a\x3c\xe8\x1d\xdd\x16\x95\x74\xb7\xe7\x56\xef\x35\xdb\x81\x6a\x22\xcb\x51\xc2\x6f\x38\x5a\xeb\x19\xa7\x56\x3f\x5e\xcf\x89\xf7\x7e\x68\x07\x7c\x3f\xb4\x76\x2f\x3f\x31\x72\x1f\xbe\xa5\x17\x79\x73\xd3\x8a\x0a\x03\xc1\x54\x76\x3c\xda\xa8\x47\xf3\xa1\xc5\x0a\xf1\x36\xfc\x9c\x55\x79\x2f\xe4\x53\xd3\xb7\xe6\xf5\xe3\x5b\x15\x6c\x8a\xff\x29\xb1\xd6\x64\xed\x75\x30\x73\x01\xcd\x3a\x1c\xc3\x23\xfb\xf4\x89\x2e\xde\xd9\xb3\x78\xa1\x12\x78\xc0\x5a\xc2\x10\x13\x65\x9d\x0f\xc5\x0a\xba\xbe\xd0\xde\xc2\xad\x87\x4f\x77\x79\x7f\xbb\x2e\xed\xbe\xea\x3d\x0f\xcd\x11\x76\x27\xda\xe0\xd7\xe4\xe8\xec\xf6\x9b\x5f\x79\x6e\xc9\xc3\xe2\x1a\xec\xde\x5a\xc3\x47\x9d\x60\xf4\x54\x06\xe3\x8f\x0c\x0d\xae\xe4\xc7\x24\xa1\xec\xb1\x08\x2d\xe0\xad\x09\xab\x3f\x7c\xd0\x62\x23\x89\xaa\x66\x8e\xd8\xa9\x01\x76\xe1\xea\x46\xd6\x9a\x6d\x43\x51\x06\x84\x6d\x63\x79\xa6\x8b\x6e\x63\x8d\xce\x71\x5f\xf0\xb7\xae\x24\xd8\xe4\x6e\x1b\xcd\xb9\xb0\x6d\x81\xd8\x6a\x85\x6b\x27\xfc\xa1\x75\xc2\xeb\x51\x79\x6c\x85\x00\x4d\x97\x4f\xa4\x59\x04\x49\x3e\x28\x93\x97\x4d\xf7\x8f\x77\xba\xb5\x94\xec\xb4\x3c\xd8\x12\x4e\x17\x84\xe6\x2d\x55\xe7\xde\x1f\x36\x6f\xa4\x2d\x37\x10\xff\x23\xa4\x8b\x14\x85\xac\x97\x16\x71\xdc\xcf\xc4\x57\xf3\x18\xa5\x44\x94\x1d\xf6\xd9\xc3\xb5\xc9\x20\xf8\x3f\xda\x5e\xa6\x89\x94\xcd\x0f\xc8\xed\x9b\xb1\x5b\x9d\x72\xbd\xad\xd4\xb0\x3b\x6f\x12\x55\x77\xb5\x7a\xac\xeb\x56\xdf\x34\xe4\x0e\x59\xff\x26\x87\xe0\x96\x04\x7e\x67\xc6\x96\xb6\xaf\xe5\x72\xf1\x5c\x7d\xdc\x0d\xf4\x00\x9b\x91\x56\xc4\x8e\xa0\xbd\x3d\xba\xb6\x66\x3a\xb6\x9d\xe4\xa6\x5c\x5f\xf6\xb8\x63\xb2\x46\xb8\xb0\xa8\xd8\x23\x6b\x05\x8d\xd9\x08\xe7\x50\x64\x00\x93\xff\x16\x6f\x02\xf6\xa2\xe2\xc8\x7c\xcb\x19\x92\x6f\x50\xe6\x22\x53\x93\x7a\x24\xc3\x8f\x18\x2e\x5c\x7f\xab\x01\xb5\xbe\x9f\xbb\x1f\x24\x64\x9b\xc9\xd1\x22\xc6\xa3\xad\x96\xda\xf0\xfa\x2d\x2b\xde\x45\x04\x1e\x6d\xa6\x02\x5d\x1b\x66\x1d\x4d\x51\x04\xb5\x6e\x37\x62\xc2\x3d\x30\x67\xd1\x65\xb6\x35\xd7\xda\x2f\x73\x99\xc1\x9a\xcd\x89\xfd\x98\x17\xd2\x24\x44\xac\xcd\xde\xa4\x16\x2c\x48\xf1\x5e\x22\xf7\x4c\x24\x9e\xf3\x78\x35\xa4\x03\x38\xb7\xe7\x9e\xe1\x50\xc4\x6d\x2b\x83\xd5\xe2\x9f\x3d\xe8\x2d\x0a\xe3\xa3\x58\x0b\x62\xd8\x6a\xe2\x32\x47\x62\x34\x24\x11\xeb\x96\x5f\xd7\xb8\x25\x44\xd9\x5a\x8f\xc6\x9f\x02\x5f\x84\xc3\x2d\x3a\xed\x5a\x5a\xdf\x29\x02\xaf\x8a\x1a\xa6\x8d\x47\x8a\xca\x78\x24\x6c\x31\x1e\xa9\x82\x01\xda\x5e\x1b\x26\xb0\xaa\x2a\xcb\x70\x8e\xd9\x0b\xab\x4b\x1f\x58\x86\x25\x69\xe7\x50\x65\x1e\x93\xa6\x07\x08\x2e\x03\x31\x3e\x61\x1f\xa1\x1e\x4a\x44\x9a\x73\x39\xb9\xd6\x17\x14\x6d\xe4\xd1\x31\xf3\xca\x3d\xbb\x04\x60\x0f\x5f\x5d\xf9\x3b\x60\xe0\xc6\x28\x58\x74\xa0\x00\x83\x55\xcb\x44\xd9\xfa\x89\xb2\xb5\x13\x55\xce\x73\xd2\xb3\x93\xff\x1d\xe0\x01\xa3\x27\x22\x81\x9d\x18\xd3\x4d\xe7\x32\xd9\xd2\x4e\x68\x7d\x14\xe5\x0f\xca\x9a\x27\xa3\x05\xc3\x99\x31\xe6\x31\xdf\x5b\x54\x79\x70\xde\xac\xd3\xa2\xb5\x81\x33\xb7\x5a\x97\xf8\x06\x97\xcd\xd8\xcd\x58\x9a\x0c\xfd\x02\xe1\x9b\xf5\xf0\xf8\x61\x97\x86\x62\x1e\x3c\x77\x86\xde\xfe\xdc\x08\x2f\x9c\x6a\x6a\xcd\x3f\x3a\x9f\xdb\x5f\x1a\xe1\x7b\xa7\x1a\x4d\x1e\xa7\x69\x4c\x38\x55\xb8\x6c\x14\x3d\xab\x02\xbc\xbc\x6e\x14\x3e\x97\xfd\xbe\x51\x86\x58\x33\xcc\x7a\x2d\xc8\xb6\x32\x03\xf0\xdd\x55\x57\x40\x8c\x95\xc5\x56\xfb\x12\x9d\x3a\x30\x1d\x50\x2d\xcd\x04\x78\xd1\xca\xbc\x40\x6c\x67\x92\x05\x59\xc0\x0f\x21\xfa\xc4\xd6\x58\x90\x04\xac\x0a\xfd\x03\x93\x80\xd5\xe2\xfa\x40\x7e\x5c\x45\xaf\xdf\x0c\x8f\xbd\x1e\x4a\x7a\x68\x36\xcb\xf0\x0c\x31\x11\xbe\x67\x8f\x4c\x7d\x72\x75\x95\xe8\x19\xc5\x01\xf9\xdb\xe1\xfe\x7e\xf2\xb7\xc3\xab\x2b\xf2\x0d\xff\xeb\x9b\x43\x95\xab\xcb\xe3\x8b\xba\x24\xc9\x4c\x44\x68\x90\xa9\x8a\x70\xd4\x50\xa4\x5e\x90\x38\xf6\xb4\x39\x46\xbc\xbf\xef\xd3\x7b\xc1\x59\xef\xee\xea\x9d\x4f\x40\xd9\xbb\xbb\xca\xca\x33\x00\xc9\xfe\xbe\x1f\x5f\x5d\xb5\x96\x89\x6f\x7f\xcb\x59\x46\x93\xd9\x37\x77\x57\x72\x72\x68\x92\xd3\xb8\x60\xf8\xb1\x1e\xfc\x33\x32\x9d\x96\x3d\x3a\xed\x3d\x7d\xf3\xe3\xdf\x0e\x54\x6d\x09\x39\x91\x9d\xf2\xc9\x46\x1e\x80\x89\xdb\x57\xb2\xa6\x2f\x85\xba\xee\xee\x64\x05\xbb\xc7\x61\x10\x68\x14\x1f\xf3\x6e\x07\xde\x48\x80\x45\x61\x46\xf3\xdc\x82\xae\x2a\x95\x3d\x2b\x0e\xbd\x01\x34\x38\x83\xfe\x21\xcc\x2d\x2b\x2f\x0a\x4a\x15\xd7\xdb\x13\xdb\xaf\xbe\xcd\xad\x3d\x58\x59\xbf\x6c\xdc\x57\xc6\xdc\xc4\x67\x90\x80\xe0\x1b\x11\x60\x3c\x09\xf0\x58\xc6\xf9\x15\x5a\xba\xd3\xbd\xe4\xea\xca\x4f\x82\x95\xd3\x76\x34\x3e\x85\xbc\xd2\x48\xd6\x2d\x61\xbd\x55\x90\x40\x36\x48\x8b\x7c\xee\x27\x00\x98\xa0\x9c\x42\x09\x1a\x04\x01\x19\x68\xe6\xd6\x58\x2a\x8e\xb3\x63\xa1\x49\x1b\x19\x05\x9a\xdb\xe5\x88\x54\x69\xcd\x5a\xac\x28\x3b\x4e\xc4\x40\x33\x4b\x7c\x53\xc1\xec\x38\x69\x20\xa1\x48\xf2\x39\x99\x32\x9f\x80\x51\xb3\x50\x4c\x81\x00\xc8\x4a\x00\xc7\xa7\xc0\xd8\x73\xba\xaf\x6f\x6b\x89\x90\xca\x78\xf7\xcd\x50\x92\x9b\x96\xd7\x9e\x75\xe6\xa1\xee\x90\xa6\x24\x66\x38\x7b\xb2\xf4\x3d\x4b\xdc\xe0\x88\x05\xaa\x1f\xdd\x4b\xdb\xa3\xc0\x8d\x3b\x32\xcf\x01\xb5\xde\x6c\xb5\x9b\x4b\x44\xb7\x59\x24\x09\x2a\x68\x21\xa0\xee\xa0\xec\x4e\x6b\xaa\x21\x97\x0c\xcb\x9b\x7f\x50\x64\xf1\x77\x34\xf3\x3d\x9a\x32\xb2\x20\x1f\xf1\xc0\xc8\x10\xcd\xbe\xf2\xb8\x98\xc1\xd5\xcf\x05\xce\x96\x6f\x50\x86\x16\xf9\x68\x65\x0c\x11\x46\xcd\xea\xb6\x39\x41\x59\x02\xb8\xa2\x19\x99\x91\x64\xc4\xca\xe0\x82\x24\x11\xbd\x18\xe8\x83\xad\x76\xf9\xd9\xdd\x15\x2b\xef\xae\x70\x79\x56\x6e\xf1\xfa\x22\x8c\xd3\xf8\x49\xdf\xd3\xc7\x06\x1f\xab\x38\x72\x0d\xe6\x25\xb8\xd3\x51\x00\x59\xd0\x51\x02\x46\x06\x58\x93\xcb\xa9\xe0\x35\xcb\x2c\x90\xcd\x42\xd0\x82\xd6\xad\xe6\x0a\x19\x28\x91\xde\x3f\x32\x3c\x38\xa3\x19\x7e\x6a\xb8\x17\xbf\x0d\x74\x8e\xf8\xfd\x6b\xe5\x84\x50\x89\x27\x14\xc7\x51\x71\x9e\x00\x72\xfe\x5e\x95\x0a\xbe\xa2\xca\xde\x00\x00\x18\x84\x88\x85\x73\x29\x03\x90\xa9\x7f\x47\xb0\xd3\x11\x89\x9e\x8a\xc4\x0d\x80\xd7\x61\xf3\x8c\x5e\xf4\xb0\xc8\x9a\x98\x2f\x93\x50\x47\x64\xea\x1c\xae\xc9\x64\x81\x2e\x10\x61\x9b\xa9\xf1\xde\xf6\xc7\x85\x53\x25\xc9\x35\xe6\x7e\x2b\xca\xbb\xf0\x62\xd8\xad\x4f\x84\x19\x7e\x2c\x1b\xb6\x70\xb6\xe1\x72\xbe\xc6\xcb\xa1\xe2\x54\x85\x4b\x43\xd9\x22\x27\x58\x1e\xfe\xc6\x7f\xef\xea\xca\x5f\x23\xb0\x28\xdb\x46\x4b\x5e\x51\x86\x8d\xa5\x6d\x6a\x66\x6c\xfb\xb1\x36\xe9\x2f\x1b\xeb\xe9\x0e\x32\xb0\x1b\xd4\x3d\x32\x4a\x38\x0d\x5e\xf9\x13\xdb\xe2\x59\x0b\x22\xe3\xec\x96\xf2\x60\xcc\xdd\x1e\xda\x44\x9a\x4f\x62\x02\x7f\xc8\x89\xdd\xac\xa5\xfb\x36\x69\xe9\xd3\x8d\x60\xd9\x18\x41\xa7\x20\xf6\x29\x06\xd1\x13\x83\x38\x77\x07\x61\x8b\x5b\xb7\xd0\xad\x5a\xec\x0b\xb7\x9b\x0e\xc9\xed\xf6\x7a\xfc\xe8\xf6\xa8\xa3\xe6\xdc\x5a\x0f\xef\xdd\x1e\x3a\xe4\xc9\xdb\xeb\xd1\xe9\x6f\x1b\x0b\x88\x5d\xe2\x1a\xed\x0c\x1c\xc0\x89\xed\xfc\xd0\xd8\xce\xe2\xcd\xf1\xda\x23\x50\xed\xd7\x77\xa2\xdf\x19\xaf\xdd\x8b\x06\xe0\x74\x73\xe9\x2e\xae\xa5\x05\x18\xdf\x78\x21\x5f\x37\xa1\x5b\x8a\x84\x71\x7a\x53\xf8\x6f\x9a\xf0\x95\x2e\x62\xbc\xb8\xe5\x4d\x58\x33\x78\xbe\xf6\x2a\xd4\xa0\x38\x4b\x31\x01\x95\x6b\xc7\x3b\x37\x96\x2f\x8a\x22\x6f\xe4\x71\x76\xc1\x8e\xdd\xfb\xd3\x3a\xcf\x9b\x13\xf8\xd3\xb5\x3c\x6f\xa4\xf2\xfa\x97\x8f\x7b\xa2\xea\x64\x45\x12\x53\x9a\x5a\xfe\x3a\x42\x67\xe9\x41\x2f\xba\xdf\x17\xa9\xcd\xe5\x9f\x32\x77\xf9\xce\x01\x4e\xe0\x7c\xaf\x1e\x35\x44\xd6\x20\x81\xed\x83\x82\xc1\x1e\x99\xfa\xad\x2b\x7b\xb2\x5c\x4c\x68\x9c\xab\xac\x4b\xed\xd1\x86\x54\x1d\x0e\x86\xed\xef\xfb\x49\x90\x28\x19\xcd\x72\x18\xa9\x22\xf2\x6c\xda\x40\x7c\x8c\x96\x7f\x4b\x09\x00\x80\x44\xb0\x96\x03\x11\x29\x54\xf8\x9e\x28\xa5\x43\x8f\x54\x1e\x37\x4b\x91\xe9\x95\x66\x3e\x1f\x29\x0b\x86\x7f\x65\x7f\x33\x8a\x57\x25\x9e\xfd\x95\xdd\xbb\xa7\xe7\xcf\xb7\xfd\x9d\xc0\xd4\x18\xb3\xd3\x63\xfb\xc7\x68\x55\xee\xb1\x3f\x1d\x1d\xcf\x14\x5a\xb8\xb0\x7d\xe7\xb0\xcd\x57\x87\x81\xd5\x85\x5c\x8a\x31\x3b\xe5\x3b\x70\xb4\x61\x86\x79\xab\x66\x95\xe0\xdc\xc7\x9b\x4e\x57\xee\x13\x00\x46\xd6\x98\x3a\x06\xd4\xad\xba\xdd\x84\x7d\x02\x19\x10\x79\xea\xf4\x69\xac\x10\x7c\xfe\x39\xf9\x5f\x5d\xfc\xb2\x19\xaf\x4c\xbf\x1f\xbf\xf8\x7d\xfd\x31\xfc\xbe\xde\x6f\xf6\xfb\x5a\xfc\xd7\xf7\x14\xfd\xfc\xdd\xb9\x93\xca\x44\x98\x9d\xaa\x7c\x25\x55\xf4\x1d\x71\x0f\xf5\xda\x2e\xa7\x9e\x6d\x7e\x95\x49\x5b\x0f\x93\xdf\xa1\x8a\xb4\x63\x1b\x1e\xd0\xe4\x2d\xce\xc9\x47\x6c\xdb\x69\x35\xa3\x4c\x77\xd7\x12\x2e\x60\x0b\x5a\xe4\x78\x41\xcf\x71\xd5\x7f\x8e\xd9\x4b\x3c\xc3\x49\xf4\x86\xe6\x44\x9b\xf5\x75\x35\x8d\x31\x3a\x77\x02\xf6\x3a\xe6\x86\x0f\xac\xc1\xe4\x73\x7a\x21\x61\x5b\x30\xc5\x73\xb8\x6b\x5e\xec\xfa\x5c\x69\x43\xa5\xfc\x7c\x56\x59\x29\xc9\x6b\x5d\xd9\xe3\xcd\xb5\xe0\xa3\x8d\xb7\x78\xa1\x92\x86\x3a\x30\x28\xc4\xec\x93\xf3\x99\xf2\xa5\xef\xf0\xf9\xaa\x59\xe1\xc8\xee\xa5\x45\x09\x09\x69\xd2\x53\x51\x40\x64\x04\xe3\x4b\xcb\x9b\x4e\xc6\x23\xbc\xac\xc2\x1b\x2f\x1b\x85\xcb\xaa\xf0\x82\x44\x6c\xde\xa8\x20\xbf\x9a\x4a\xee\x14\x55\xad\xb9\x35\xc9\x76\x13\x3a\x13\x4d\xe7\xa1\x1d\xa9\x49\xb6\x36\xf6\x49\xcd\x88\x3a\xeb\x6d\xfa\x98\xb2\x96\x6b\x89\x5a\x52\x47\x85\x2e\x92\xb1\x85\xba\x70\xe2\xd6\x5a\xae\x9f\x50\x47\x2b\x39\xa8\x4d\xd3\x70\x5c\x5a\x42\xcc\x25\xda\x8e\x18\x52\x5e\x4c\x12\x5c\xcd\x53\xd7\x55\xb3\x1c\x7a\x2e\x14\xf1\xb1\x9a\x60\x5b\x85\xa5\x55\xe1\xf2\xa8\x0d\xc2\x91\x05\xa1\xad\xc2\xf2\xc8\xc6\xce\x36\x81\x6c\x8e\xea\x26\xc1\xae\x79\xb0\x36\xdb\x39\x99\xa3\x14\x6f\x63\xae\xa4\x0f\xa4\xd9\x05\x15\x95\x13\x80\xa4\xf3\x9c\x22\x6b\x47\x70\x2c\x2b\x42\x2f\xb4\x89\x9a\x70\x8a\xc0\x97\xac\x8f\x92\x70\xce\x45\x1c\x4f\x90\x06\x79\xa0\x2f\x1b\x6d\xf5\xc6\x79\x64\x36\x8e\x55\xb8\xb4\x4f\x79\x45\xa0\x14\xc6\xf4\x84\xbf\xb6\x27\x8c\x99\xd4\x14\x49\x92\xf4\x56\xc5\x50\xab\x83\x55\x3e\x80\x0d\xff\x87\x2e\x42\x68\xa2\xae\xb7\x42\x5f\x67\xf4\x58\x6d\xec\xd6\xee\xb7\x37\x7c\x1b\x0a\x9b\xa3\xb6\x55\xb1\x96\xa3\xb6\x0e\x0e\xba\x33\x29\xd0\x58\xe8\xb6\xc8\x93\x55\xc1\x26\x4f\xf5\x35\x51\x15\x96\x55\xa1\x4d\xbb\xac\x1a\xf3\x06\x81\xfe\x4c\x96\x6e\x0d\xf2\x0d\xc1\xd8\x01\xf9\xc3\xaa\x50\x34\xb7\xa8\xc8\xa3\x8a\x8a\x58\xc5\x4b\xab\x58\xd3\x10\xbb\xf5\x91\xd5\xba\x59\xac\xe9\xc7\x67\x8a\x72\x1d\xe8\xa9\x3d\x60\x97\x8a\x5a\x77\xbf\xe6\x3e\x2e\x38\x2b\x7e\x57\xbf\xad\x36\xb7\x63\x7f\xe9\x1e\x1e\x95\x84\xce\x5c\xf0\x8f\x6a\xb7\x9a\x0b\xac\x7e\x08\xdc\x1a\xcb\xd6\xb3\xe4\xd6\x72\x0e\x94\x7b\xdf\xdb\x55\x9b\x07\xc7\xe6\x6c\x48\x7e\x32\xa7\x17\xc9\x56\xdb\xd6\x8a\x50\x4d\xe3\xe5\xac\x66\x63\x6c\x31\x37\x0f\xeb\xc3\x78\x97\x11\x94\x48\x2b\xc4\xdc\x0a\x3a\xf0\x90\x43\x21\x09\xcb\xbd\xce\xea\xaa\xbc\xf5\xfe\x72\x07\x65\x9d\x26\xc3\xf2\x25\x33\x9c\xf7\xec\x55\x71\x46\xf6\x92\x24\x38\x37\xf1\xd9\xea\xc3\x53\x47\xed\xd0\x39\x57\x22\x34\x41\x34\xc3\xef\x48\xf8\xe1\xdf\xce\xc1\x3a\x74\x4e\x51\xad\xee\x6d\x1d\x23\xef\x07\x7c\xe1\xfd\x52\x74\x6a\x03\x6e\x3d\x87\x26\x35\x10\x2b\x9f\x9a\x51\xec\x6c\xfc\x2d\x70\xb9\x0b\xb8\x4f\x8a\xee\x2a\xc3\xe3\x2f\x8d\x72\xcd\x2f\xb5\xa2\xbc\xc6\x0b\x89\x9b\xa3\x7e\x88\x24\x91\xb5\x10\xa6\xea\x36\xaf\xf1\x35\x6d\xd6\x10\xab\x66\xe5\xdb\xe2\xaa\x3e\x2d\xc6\x1d\x03\x71\xd5\xd7\xf6\x01\x38\xbb\xd6\xa5\x97\x88\x63\xb9\xc3\xda\x68\xa2\xb3\xf5\xc2\xe8\x06\x9b\x57\x45\xd7\xbc\xb5\x25\xf9\x64\x34\xc7\x59\x8e\x1f\xf0\xc5\x4e\xb1\x50\xeb\x82\xa5\x5e\x0a\x3b\x1c\xe5\xc3\x4e\x74\xea\x5a\x5d\x52\x66\x7b\xdd\x2e\x59\xb3\x29\x6f\xb6\xb7\x6f\x93\x3a\xbb\x3c\x15\x6a\xae\x05\x1d\xc1\x2d\x1a\x52\xe7\x47\x9c\xd1\x36\x99\x73\x56\x30\x86\xb3\xff\xe1\x6c\xc3\x4b\x11\x53\xb7\x4d\xee\x6c\x50\x63\x47\xec\xec\x06\xb2\x86\x06\x37\xf3\x2b\x75\xfa\x56\x28\x27\xec\x87\x75\x35\x58\x9f\x51\x1a\x33\x92\x3a\xb1\xa6\x6b\x2a\x22\xfd\xae\x2e\xfc\x0e\x90\xf6\x5c\x3f\x75\x19\x12\x05\x69\x7d\xf0\x23\x8e\x54\xea\x3a\xed\x6f\x2b\x1a\xd3\x8c\xe1\xe8\x44\xf9\xb5\x6c\xf6\xe4\x71\xfc\x78\xc4\xcc\x1f\x5a\xce\x44\xc3\x86\xff\x50\x83\xa9\x7e\xc0\x99\xf5\x3a\x37\x6d\xb0\xb1\x7e\xaf\xda\xb1\x6c\xd6\x25\xec\xaa\x6f\xee\x7a\x7f\x9b\x7c\x6e\xd6\x74\xa9\xdc\x81\x6a\x4e\x71\x0f\x2c\x37\xa1\x76\x40\x6d\x27\xa5\xe9\x34\xdc\x18\x45\xbb\x6a\x47\x65\x09\x31\x7e\x3a\xb9\x54\x6a\xd8\xbe\x4e\x50\x88\x64\x96\x33\x4e\xcd\xe5\x46\x9a\xd0\xf5\x33\xa9\x39\x55\x2e\x32\xc6\xc1\x46\xba\xcd\x98\x94\x23\xc2\x8d\xa7\xdd\xe9\x66\x9a\xd8\x51\x61\xf1\xcf\xd7\x76\x9a\xe1\x07\xa6\xc3\x6b\x06\x5e\x06\xab\x05\x49\x46\xde\x2b\x92\x78\x70\x81\x23\x82\xf8\x0f\xf1\x7f\xfe\x5b\xfe\xe2\x7f\xa7\x5f\x7f\x3d\xf2\xbe\xfe\x9a\x0b\x1f\x0b\x74\x39\xf2\x5e\xa1\x4b\x0f\x2a\xaf\xae\x91\xb9\xa0\xa1\xe5\x2c\x36\x12\x77\x44\x09\x5f\x07\x26\x92\xe7\x40\xbe\x51\xfa\xde\xbd\xc1\xe1\x9f\x3c\xe9\xb3\xf3\x26\xf0\xc3\x1b\x44\x58\x3d\xd7\x11\x56\xa5\x60\x14\x29\x5b\x7c\xfd\x59\x4b\x41\xa9\xf3\x3d\x17\x12\x8e\x09\xb6\x6a\x7f\x56\x04\xc4\xc4\x57\xd5\x65\xe2\x4a\xfb\x57\xe5\x91\x71\x5e\x73\xa3\xa8\xce\xa0\x71\xc7\xb8\x50\x15\x5c\x12\x09\x1f\x1d\xb5\x16\xbe\x95\x43\x7d\x78\xd8\x5a\xaa\xec\x3e\x1d\x60\xf7\xdc\x8f\x02\x48\x05\x80\x6f\x33\x6d\xd5\x73\x34\xac\xbe\x33\x12\x7e\xe0\x37\x91\x2e\x1b\x3e\xac\xca\x34\xb5\x36\xed\xee\x57\x65\x52\x89\xc8\x4b\x5f\x4f\xa7\x39\xe6\x93\x71\x0b\xff\xad\x46\x5a\xef\x42\x0e\xd4\x6d\x2e\xbf\xd6\x3b\x3c\x38\x6a\x0e\xe5\xdf\xc3\x1d\x80\xb6\x34\x3f\x5a\xd3\xbc\xde\xfb\x26\x90\xe6\x0e\xd7\xd3\xac\xfa\xa8\x2a\xf1\x83\xa3\xb1\x37\x78\xf4\xe7\x96\x6e\xaa\xba\xe9\xd7\x5f\x9b\xaa\x0f\xbe\x5a\x5f\x77\x81\x2e\xab\xba\xeb\xab\xd6\x04\x67\xdd\xa8\x15\xdb\x83\x87\xca\xfc\x31\x7f\xa1\xf2\x23\xb7\x19\x42\xdb\x0e\x9c\x7f\x63\xcd\x14\xd0\xca\x39\x54\x05\xfc\xb5\x1f\xa1\xda\xa0\x69\x52\x7a\x5c\x45\x42\x90\x76\xca\xd5\x20\xec\x74\xcd\x55\xaa\x66\x39\xd2\xd0\x32\x67\x5b\x5d\x8e\x0e\xe1\x72\xa4\x1d\xb4\x2a\x85\xfe\x60\xd9\x97\x20\xcd\x11\x38\x38\x82\x82\x4c\x8c\x8e\x0e\xa1\x32\xe1\x74\x6a\xc0\x84\x53\xd6\xc6\x48\x50\x96\xd1\x8b\x7e\x91\x7a\x23\xf5\x67\xc4\xa9\x47\x29\x8d\xea\x2b\xcd\xb7\x0f\x56\x64\x2a\x6d\x3a\x45\x3f\x8e\x61\xb7\xbc\x49\x84\x51\xf7\x02\x5d\x7a\x40\xdb\x23\x5b\xdf\xd3\xaf\xbf\xf6\x84\x2b\x8c\x5b\x9f\xd3\x60\x00\x93\xe0\xe8\xa1\x71\x92\x18\x70\xc6\x71\x70\x79\x2f\xf9\x06\xab\x3f\xf7\xf7\x7d\xf5\xa7\xa0\xa7\x81\x27\x3c\xed\x39\xc0\xaa\x2e\xab\xea\xb2\xf5\x75\x8f\xfe\x5c\x83\x5c\xaf\x3d\x27\x51\x84\xf9\x90\xc6\xe2\x89\xf7\x54\x59\x03\x8c\x4f\xcb\x6a\xd4\x58\xcf\x9f\xd9\xe6\xf1\x1c\x5d\x63\x7c\xaa\x27\x79\x79\x12\xa2\x18\xfb\x8c\x4f\x8e\x7f\x18\x9f\xdd\x5d\xe1\x52\xae\xc6\xd9\x29\xcc\x02\xd2\x20\x71\x9c\xee\x29\x2c\xac\xc4\x70\x46\x18\xf2\xb1\x8d\x56\x82\x07\x19\x5d\x72\xf0\x97\xa3\x4c\xef\x8a\xfa\xa1\xef\x3f\x84\xb2\x91\xe7\x95\x90\x33\xca\xa3\xd5\xe5\x90\x57\x1e\xb6\xd5\x86\x97\x47\xbc\xec\x68\x64\x91\x85\x7f\xf7\x8f\x4a\x7e\xd1\xb1\xd1\xea\x72\xd4\x36\x38\xb8\x54\x26\xea\xf5\xa3\xd6\x4f\xc0\xc1\xd1\x3a\x3a\xe8\x74\x2d\xf7\x2a\xd1\x5b\x35\x29\xe5\x86\x9b\x20\xd9\x93\x73\xae\x44\xed\xbe\x3b\x1c\xd1\x62\x4e\x66\x73\x9c\x89\xf3\x59\x35\x7a\x85\xd8\x7c\xb0\x40\x97\x7e\xfb\x19\x6f\x4b\xf3\xae\xce\xb8\xca\xcb\x8e\x2e\xc9\xa2\x58\xfc\xab\x0b\xa2\xd5\x29\x14\x49\x46\x67\x98\x01\xdf\xd9\x08\x50\x9e\x84\xab\xab\x1f\x8a\xc5\x04\x67\x83\x57\x2f\x7e\xf8\xe9\xe4\xf1\x77\xcf\x7f\x7a\xf1\xc3\xbb\xe7\x7f\x7f\xfe\x56\x76\x15\xd3\x8b\x8e\xe1\x93\xe4\xba\xc3\x57\xfb\xae\x66\xe1\x2d\x8c\xa9\x5e\x92\x04\xa3\x0c\xf8\x60\x10\xd1\x05\x22\x89\x3f\x56\x46\xd8\x7a\xc2\xa7\x60\x90\x71\xa9\xf2\x2d\x2d\x92\xc8\x94\xea\x55\x39\x75\x87\xdc\xb6\x56\xad\x97\xb8\x3e\x09\xfc\xef\xaa\x39\x70\x57\xf0\x5a\xf0\xac\xf6\x2a\x07\xbf\xd8\x80\x6d\x5b\xe8\x98\x1f\x87\xf6\x5d\x3d\xac\x9d\x02\x7e\x34\xd6\xec\x3c\xc1\x88\xb8\x27\xa7\x94\xc6\x84\x32\xe1\xb2\x45\xab\x2b\x6a\x2e\x0e\xb2\xf6\x1b\xb1\x17\x51\xd6\x3e\x16\x45\x23\x11\x49\x0a\xb6\x9f\xbe\xfe\xd0\xdc\x07\xba\x57\x79\x2b\x69\x05\xb8\x33\x6b\x8b\xd0\xeb\xf3\xec\xac\x9e\x06\x57\x71\x23\xea\x6c\x2a\x32\x4d\x2f\x92\x63\x17\xcd\xff\x53\x21\xc5\x81\x36\xaa\x5f\x3e\x75\x1a\x51\x1a\x9a\x62\x81\x75\x01\xb4\xf6\xf5\x4b\x0e\xb2\xc2\xa7\xe6\x30\x5c\x27\x26\x0b\xa9\xc3\x51\x7f\xb8\x27\xfd\x81\x34\xda\x03\x77\x4c\x56\xf5\xd6\x31\xb6\x2e\x4b\xe3\x9e\xde\x01\x59\x2b\xa1\xd8\x1f\xb9\xe9\x2b\x58\x86\x92\x9c\x0b\x29\xa3\x9e\xf8\x33\x46\x0c\xff\xcb\xbf\xbb\x62\x65\x7a\x09\xce\x00\x94\xcf\x0f\xa3\xb3\x4a\xf6\x3c\x84\xda\x09\x44\xec\xb5\xc1\x72\x58\xae\x2b\x94\xc8\x6e\x61\xce\x0e\x8e\xac\x76\x77\x57\xf8\xcf\x6b\x2a\xee\xd6\xe5\xbd\x2d\xba\x3c\xb3\x96\x54\xa8\xd6\xd7\x9c\x11\xad\xe0\x1d\x75\x9c\x96\x12\x0a\x30\xa3\x5d\x51\xbc\x61\x9b\xb6\xf7\x25\x96\xa5\x2c\x47\xcd\x51\xb9\xed\x6f\x69\x58\x5b\x6d\x2f\x3d\x2c\xeb\x9c\xe0\x4b\xe6\x9e\x91\x4a\x94\xb8\x37\xfc\x0b\x64\xc1\x4a\xea\x7d\x47\xc2\x8e\x01\x76\x92\x22\x5c\x42\x52\xd5\xcd\x99\xb0\x4e\xee\x98\xb4\xac\x9e\x04\xaf\x7d\xbf\xfb\x42\xec\xb7\x5f\xa1\xe0\xa0\xe3\x3b\xcc\x82\xd5\xe5\xc8\xe7\x3c\x22\x19\x5c\x82\x83\x23\xde\x8b\xe4\xc0\x92\xba\x0f\x6f\xeb\xb6\x61\x6a\x21\x08\x54\x3a\xd0\x51\x66\xaf\x1f\x51\xc5\xcc\x2a\x96\x57\x56\x65\x93\xe5\xec\x4e\x83\xc8\x81\x86\x32\x58\xde\x93\x3e\xab\xb6\x76\xcf\x62\xcf\x2b\x39\x1f\xb4\xa6\xa6\x38\x8b\xf1\xb4\xf2\xef\x92\x92\xbf\xf4\xed\x12\x2c\x7f\xa5\xd1\xb3\x60\x56\x5c\x4d\xb5\xce\x4b\x7f\xe9\xaf\x4a\xe8\x96\xc3\x55\x09\x57\x5a\x79\xd2\xc1\xc0\xd8\x9a\x94\x35\xf2\x16\x68\x33\x1d\xc5\x60\xb0\x40\xa9\x08\x98\xe1\x1b\xa6\x98\x9d\x2a\x7b\x59\x3c\x66\xa7\x25\x00\x60\xc0\xe7\xf1\x64\xa9\xcd\x40\x41\xc5\xc3\xab\x17\x60\x1f\xac\x44\x1a\x9d\x04\x5f\x32\x20\xdd\xf1\xac\xf3\x10\xdc\x39\x2c\x01\x28\xb5\x8d\xa0\xf6\x33\x13\x97\x8e\x22\xf0\xc6\x3a\x4e\x79\x99\xc9\x3d\x29\x77\xaa\xe5\x8a\xd6\xa8\xa7\xae\x19\xc7\xc4\xce\xf8\xba\x55\xf5\x03\x5c\x36\x2c\x0e\xab\x6a\x66\x91\x4d\x1a\x23\xb9\x92\x01\x1e\xc4\x68\x89\xb3\x7f\x95\xcd\x07\x09\x2b\x59\x4e\xed\x7b\x80\xcb\xb6\xf7\x0b\xbf\xa3\xb6\xb2\x37\x2e\x61\x14\x7c\xf4\xc3\x5a\x8a\x19\xf5\x82\x7f\x6b\xce\x41\xa9\xdb\xc3\xfc\xd6\xbd\xb8\x16\x6e\x17\x4a\x7d\xf6\x29\x13\xd5\xb4\xf4\xa8\x35\x73\x9f\xae\xdb\xa9\xdb\xad\x56\xfa\xdd\x1e\x2e\xe7\x6e\x17\x0d\xfd\xe1\x2d\xfa\xc2\xd5\x7b\xd2\x86\x1d\xbb\x64\xbf\x69\x05\x00\x60\x68\x3b\xea\x38\xdd\x18\xab\xe1\x6b\xf7\x63\x20\xac\xef\xc8\x35\xc1\xbd\x76\x7f\x2e\xa0\x0d\xdd\x36\x6c\x9c\xaf\xdf\x71\x03\xd4\xc6\xae\xdd\x07\xd4\x9b\xf4\xed\xc2\x5a\xdf\x79\xeb\xfb\xed\xb5\xbb\x6f\x85\xe6\x0c\x20\xb4\xb3\x2a\xbd\x59\xe7\xdb\xf5\x1e\xbe\x01\x25\x00\x7b\x3b\xfa\x76\x89\x78\x66\xb7\xeb\xd9\xb5\x6d\x7e\xa4\x35\xae\x5f\x9d\x2e\x5c\xd2\x61\x44\xf8\x71\x55\x4e\x5b\xe1\xe7\xe4\x75\x13\x7d\xf1\x7e\xf9\x63\x78\xbf\xa4\x9b\xbd\x5f\xbe\xfa\x7e\xf2\x3a\xfc\xe7\xe1\x3f\x5b\xb2\x1e\xb9\x51\x6b\xad\x50\x43\x1e\xf4\xa4\xaf\x5e\x5b\x1a\x1f\x99\x7f\xa2\x35\x75\x0f\x3f\xea\xa7\x26\xbb\x4f\xd3\xd7\x45\xdc\x01\xcf\x64\xe2\xdc\x8d\xae\x1c\xac\x3d\x15\x86\x6d\xb1\xf0\x4b\xe5\xc6\x39\x58\xd7\x43\x6b\x88\xe4\x0d\x61\x81\x77\x49\x96\x53\x05\xc8\xdf\x94\x29\xa7\xca\x7e\xf3\xcb\x65\xbc\xd9\x76\xc5\x8c\x87\xcb\x91\x95\x86\x26\x2f\x26\x0b\xc2\xde\x91\x6d\x1d\x5c\xb6\xef\xac\x05\xfd\x22\xa2\xd6\x06\xd7\x93\xb5\x1d\xb8\x4e\x29\xeb\xb2\x3a\xd7\x8d\x92\xb6\x49\xac\xdc\xd8\x57\xdd\xe9\x7d\x37\xa7\x52\x6e\x8f\xbb\x7c\x83\xc9\x6e\x4a\xaa\x5c\x9f\xef\x96\x79\x8d\x77\x98\xf2\x56\x99\x8c\x6f\x7d\xd6\xd7\x5c\xe2\x5a\x28\x38\xaf\x2b\xd9\xf1\xaf\xbe\x2c\x37\x1d\xe6\x06\xe3\xb9\x96\x88\xbc\x4e\x68\xdd\x9a\x49\x8f\x34\x5b\xe9\x2f\x68\xc2\xe6\x7d\x76\xed\xf0\xb5\x19\xbd\x58\x17\xbd\x76\x11\xf8\xe8\x06\x96\x30\xa1\xb6\xc2\xe0\xab\x9d\x2b\x1b\x94\xd0\x58\x24\x48\xf4\x16\x2a\x24\x65\x75\xdb\x59\x5a\xc9\x04\x5f\xf4\x32\x13\xe7\xd1\x52\x5a\x35\x62\x42\x0e\x6f\x37\xf6\x23\xdb\xa1\xeb\x35\x65\x9f\x20\x2c\xa5\x8c\x6d\x15\xa6\x45\xb0\x92\x6a\x49\x6c\x05\xa9\xac\x28\x88\xfa\x5c\x7d\x80\x16\x2d\x50\x85\xd6\x17\xd8\xb2\xc9\x47\xcc\x01\xa1\xd4\x86\x72\xe5\xaa\xee\x6b\x51\x31\x6b\x23\x50\x25\x9d\x83\x50\xe5\x9b\xc7\xd1\x00\x54\x96\x25\xcc\x83\xc8\x47\xb5\xd0\x1d\x7c\x9f\x8d\xe9\x6d\xe9\x2a\x0a\x17\xbe\xde\xb2\xb7\xd7\x85\xd3\x81\xc5\xf1\xc1\x71\xbc\xb5\x14\xdb\x05\x03\x40\x64\xcb\xae\xc8\x96\x5d\x17\xeb\x64\xd7\x14\x2e\xb6\x8a\x4b\x52\x45\xe0\xfe\xa5\x63\x91\x74\x08\xa4\x52\x82\xa3\x10\x55\xc2\x68\xfe\x45\xbe\xfb\x63\xc8\x77\xc5\x66\xf9\x2e\xfb\x61\xf9\x22\x5f\xbc\xfd\xca\x89\x6e\xa0\x93\x04\x3e\xd2\x86\xcd\xf7\x05\x9b\x65\xdb\x27\x57\xd2\x99\x9d\xf6\xe3\xa8\xcd\xd3\xa0\xca\x9f\x13\x87\x05\x1f\x83\xe5\xb5\xdf\x26\xc3\x39\xdc\x4b\x25\x25\x99\x5c\x55\x9d\x59\xb5\xc6\x2a\x51\x52\x87\xac\xd4\x0a\x79\x6d\xc6\x37\xcf\x24\x63\x10\xa1\x0f\x84\xa3\x88\xcc\xf2\x66\xc7\x3f\xf0\x9e\xbe\xf9\x51\xe4\x75\xf3\x9a\x23\xb0\x12\x9b\xd5\xb2\xbc\x99\xbc\x6e\xf5\x8c\x6f\x0a\x5f\x0f\x84\x93\x5f\x33\x99\xdb\xc3\x7a\xb2\xb5\x87\x95\x31\xb9\x9b\x86\xa0\x42\xae\x93\x34\x6e\x5d\xe5\x8d\x79\x7b\x3f\x21\x0e\x65\x84\xbf\xdb\x45\xe3\xa3\x9d\xd0\xf8\x68\x17\x34\xae\xab\xec\xa2\xd1\xe2\xbc\x9d\xa4\x7c\xc3\x2a\x9b\xca\xbc\x71\x2a\x5a\x82\x15\xe8\x00\x15\xcd\x90\x12\xb5\x28\x11\x2d\xc1\x24\xd6\x46\x91\xa8\x3a\x30\x9e\xe5\x32\x4f\x10\xcd\x22\x91\x44\xe5\xdc\xa4\xd3\xf1\x2e\x3d\xe8\x1d\xea\x1f\xfc\xc6\x1a\x7a\x1d\x5d\xca\xd6\x4f\x79\xe3\xef\x1b\xbd\x77\xe7\x88\x4b\x69\xbc\xac\xbb\xc7\x30\xed\x5d\x7a\xea\xb8\xa0\x0a\x77\x93\x61\x6f\x68\x85\x57\x99\xa3\x78\x2a\x5c\x4b\x5a\xbf\xd5\x6a\x9a\x31\x75\x8f\x6a\x9d\x90\x02\x2d\xc5\xd6\xfd\x9a\x88\xe5\xb6\xb0\xb3\xcb\xd9\xc9\xe4\x54\xea\x39\x95\x70\xae\x35\xe5\x5a\x95\x88\xce\x91\x7e\x64\x22\x0f\x5b\x04\x32\x69\x43\x4c\x9e\x11\xe3\xd2\xa0\x52\x88\x08\xa7\x9b\xed\xe4\x22\xcd\xc9\xac\x93\x86\xc2\xc0\xa7\xbb\x66\x54\x80\x49\x6b\x4e\x05\x69\x6f\x01\x59\x60\x36\x91\xb4\x35\x85\x3e\x09\x10\xf8\xad\xea\xcc\x85\xdd\x1f\x8a\xa7\x8e\xb1\xc3\x5c\xdb\xee\x08\x5b\x50\xf7\x10\xb4\x56\xee\x1f\x95\xce\xf5\x68\x5e\xb9\xd5\x33\x3c\xae\x3d\xbc\xdf\x1b\x96\x25\x44\x41\xee\xd3\x4f\xfb\xac\xec\x74\xe0\x5e\xe1\xbb\x3c\x2d\xad\x05\x04\x20\xb5\x39\x73\x6a\x73\xe6\xe1\x3a\xce\xbc\x80\xe1\x66\xce\x9c\xe4\x2c\x23\x93\x42\x48\xf8\x13\x94\x6d\xcb\x9d\x57\xec\xb6\xf8\xdd\x8f\x70\x48\x33\xc4\x68\x96\xbb\x45\xcd\x08\x80\x9c\x88\x4d\x49\x1c\x37\x9e\x93\x0e\x44\x78\xd5\x04\x89\x12\x09\x37\xa4\xe9\xd2\xfc\xe0\x1b\x25\x23\x11\x5f\x13\x91\x93\xad\x10\xc1\x1b\x45\x20\x41\x91\x08\x41\x1e\xe8\xe8\x7e\x5f\xd8\x40\x11\x73\xc0\xd5\xb4\x17\xe4\x92\x24\xf9\x81\xed\xe1\xa4\xb2\x0a\x39\xaf\x5e\xa9\x09\x59\x77\x20\xcc\xad\xfa\x26\x66\x61\x73\xb6\x15\x6e\x36\x84\x2e\x84\x2a\x6a\xa1\x3c\xf0\x22\x74\x21\x9c\xc1\x25\x3c\x87\x17\xf0\x23\x7c\x0f\x2f\x2b\x31\xe4\xf5\xe7\xf4\x26\xf6\xe6\x57\x8a\x44\xf7\xe1\x8b\xac\xf6\xc7\x90\xd5\x5e\x05\x22\x66\x66\xf0\x0d\xbe\xc7\xc4\xdd\x7a\x12\xf8\x13\x2e\xbf\x2d\xa4\x3b\x87\x78\x69\x01\xbe\xa7\xd3\x74\x35\x48\x1a\x80\x53\xa7\xfa\x13\x92\x44\x24\x99\xf1\x56\x24\xff\x41\x38\xc5\x8c\x48\xde\x4f\xc4\x5f\x1e\x80\xf3\x40\x58\xd4\x6b\x1a\xa3\xac\xc7\xc4\xc4\x00\x9c\xf1\xc2\x54\x8f\x15\xf8\xda\x07\xd7\x32\x82\x58\x2a\xf1\xd2\xb4\xf7\x22\xc4\x90\x07\xe0\x39\x2f\x48\x06\x74\x92\xe3\xec\x5c\x8c\xfa\x27\x5e\x32\xf8\x16\xa3\x70\x3e\x90\xc8\x80\xc2\xe4\x0d\x9a\xc1\x96\x1e\x80\x13\xff\x22\x98\xfa\xfe\xc7\x3a\x4b\xe1\x33\xe3\x9a\x28\xbf\xf8\x91\x19\x16\xd8\x42\xe7\xfa\x46\xeb\x5c\x25\xe6\xe4\xc2\xbd\xd6\x2e\x58\x7c\xc4\x26\xab\xd0\x1b\x93\x1d\xe8\x84\xef\x5d\xc5\xa7\xc9\x16\x6f\x6a\xae\x84\xcf\x10\x2b\x16\x6e\x91\xc6\xb2\x07\xef\x0c\xab\x2e\x6a\xce\xcb\x26\x4b\xd1\x1b\xe3\x2e\x96\x7f\x78\x11\x29\x48\x82\x5f\x10\xb8\xb2\x34\xbe\xc2\xec\x91\xdf\x10\xca\x33\x83\x17\x43\x7e\xc6\x38\x4b\xb0\x40\xa9\x65\x1d\xa8\x0f\xd8\x2b\x78\x68\x6c\x0e\xb1\x34\x33\x14\x47\x4d\x66\x61\x51\xd6\x86\x99\x22\x88\xd6\x22\x8c\x28\x14\x46\x77\xf9\x08\xc1\x58\x18\x7c\xbc\x24\xc9\x87\x51\x0e\xe7\x38\x4e\x47\x45\x19\x10\xed\xd3\x73\x5d\x10\x50\xa4\xd0\x1b\x25\xc6\x70\x34\x3e\x60\x90\x0a\xff\x9a\x11\x56\x14\xe3\x10\x26\x60\xcd\xc4\x0e\x58\x59\x02\x50\x46\x44\x05\x25\xd6\x96\x87\x6a\xf5\x07\x8d\x82\xda\x76\xd8\xab\x99\xf7\xea\x00\xfb\x22\x2d\xc7\x89\xb8\x5e\x69\xe6\x0b\x21\x8b\xe3\xb7\x72\x8a\x95\x57\xaf\x8f\x01\x24\xc1\x19\x3f\x7b\x7d\xbe\x70\xfd\xbb\xd2\xf8\x72\x56\x90\xe8\x3b\x9a\xc9\x05\x02\xe5\x99\xd4\x48\xe7\x98\x59\x61\x61\x57\x62\xff\x8d\x18\x94\x2b\x3e\x22\x82\x16\x38\x1d\x87\x31\x49\xdf\x20\x36\xf7\x00\x6f\xfd\x98\xc9\x23\x8e\x7d\x8f\x44\x1e\x24\x00\xb2\x01\x4d\xfc\x5a\xe0\x06\x69\xf1\x29\x9c\x77\xb2\x22\xa9\x5b\x80\x62\xe6\x57\xc2\xaf\xd8\x93\xd5\xf7\x96\x6d\xac\x67\xf9\x38\x8e\x7d\x6f\xe6\x01\x49\x49\x70\xe4\x1b\x27\xfd\x3b\x43\xeb\xa3\x71\xd8\xe7\x9f\x4b\x50\xa5\x67\xcb\x70\xc2\x19\x5e\x3e\x5d\x5f\xac\xd3\x8f\x69\x84\x18\xe6\xb3\xc9\xed\x55\xaa\x7d\x6e\x6b\x5a\x88\x0a\xea\xd7\xaa\xa5\x42\xed\x97\xca\xc8\x27\xd1\x8c\xa1\x38\x46\x23\x06\x0d\xe9\x4b\x4a\x29\x50\xd0\xcd\x4b\x5f\x33\x85\x45\x01\x33\x91\x90\x71\xf0\x0d\x96\x37\xcf\x37\x87\x00\xec\xa1\xea\xce\x55\xd4\x7b\x25\x48\x62\x8e\x19\xf0\xb1\xc9\x17\xc9\x84\xd9\x13\x27\xea\x79\x80\xf5\x56\xf2\x06\x13\x94\xe5\x62\xa1\x6b\x48\x17\xa7\x1f\x41\xd9\x95\x38\x66\x00\xc0\x30\x40\x2a\xfa\xf1\x5e\x3e\xc0\x97\x84\x89\xcb\x74\x41\xcf\xb1\x2f\x01\x47\x41\x3e\x50\xee\x42\x03\x94\xa6\x9c\x4a\x0a\x68\x66\xbb\xa8\xe8\x21\xf6\x38\x6b\x3b\xa6\xee\x05\xc9\xcf\x61\x0e\x49\x80\xeb\x33\x17\xc3\x09\x82\x80\xe9\x81\xed\xe1\xed\x37\xc9\x21\xe0\x97\x45\xa3\xf6\x61\xd7\x96\xea\xda\xac\x4c\x9f\xe1\x24\x20\x83\x84\x46\x9c\xb1\x98\x61\xf6\xe4\x09\xbd\xf4\xc5\xcd\x3c\xb8\xbc\x97\x48\x13\xe7\x83\xa3\x3d\x31\xc9\x41\x1e\xce\x31\xbf\x8a\x7d\x0f\x4d\x19\xce\xde\x8a\x7d\x23\x7d\x6d\x61\x95\xc2\xc4\x3d\x30\x87\x00\xd8\xa3\x70\x6f\x40\xb8\x12\x16\xe8\x71\xa9\x76\xff\x5e\x1e\xe4\x83\x05\xce\x66\xd8\x8f\x00\xcc\x07\x88\x31\x71\xa4\x51\x9e\x7b\x62\x3d\x15\x92\x49\x80\xab\x4b\xfa\xea\xea\x4c\x60\xbb\x7f\x77\xc5\x06\x62\xbf\xbc\x9e\xfa\x18\x94\x67\x4a\xfe\x1d\x58\x73\x57\xc4\x77\x4c\x60\xb2\xbf\x9f\x98\xd5\x50\xeb\xb2\xbf\x6f\x90\x5a\x15\xdf\xb1\x8b\x2d\xf4\xca\x14\x3c\xf6\x3d\xb7\xbf\x2f\xf5\xb8\x42\x58\x38\x1d\xa8\x6c\xd0\x3e\x18\xbc\xa7\x24\xf1\xbd\x9e\x27\xf2\x28\xca\x39\xf1\x3d\xda\x67\x38\x67\x7d\x39\x76\x19\x57\x42\xed\x59\x33\xb5\x1a\xf2\xe4\x96\xf2\xa0\xa1\xc0\x69\x80\x55\x52\x30\x16\x1c\xe9\xcb\xea\x50\x4c\x47\xa0\x61\x7f\x9f\xf5\xfb\x50\xfd\x08\x82\x20\xec\x0f\xe5\x27\xfa\x67\xac\xdf\xc7\xfa\xec\x9e\x97\x5e\x7a\x25\x5c\x70\x60\xbc\x40\x5e\x25\xf7\x7c\x0b\xd0\xf1\xe1\x68\x08\x44\x3d\x71\x52\x26\x41\x6e\x1f\xb9\x01\x43\xd9\x0c\x33\x7d\xf0\xf8\x14\xc6\xf8\x14\x80\xbd\x49\xe3\x3c\x09\xcd\x18\xa8\x2f\xab\x67\x9a\xcb\xcf\x4a\x27\x97\xea\xdf\x5a\x20\xf7\x86\x87\x87\x7f\x32\xb5\x2e\x3d\xb8\x00\x6a\xab\x4c\xc0\xa0\x12\xe4\x7c\x30\x88\x8a\x4c\x28\x7e\xfc\xa3\xc3\xc3\x2e\xa8\xa2\xbd\x98\xcd\xd4\x99\x8d\xe0\x04\xd5\x54\xd4\x51\x4f\xf0\x45\xef\x71\x96\xa1\xa5\xaf\x4c\xea\xf3\xab\xab\x21\xe0\x07\x3b\xf6\x7d\xce\x16\xa3\x3c\x27\xb3\x04\xf8\x2b\x79\x37\xb3\x12\x62\x00\x00\xd8\x9b\xae\xc7\x40\xeb\xa0\xd4\xdf\x4b\x75\x31\x25\xc7\xde\xc3\xc3\x3f\x79\xa3\x43\x50\xe1\x8d\xa4\xfd\x94\x5f\x71\xf0\xac\xc8\x62\xff\x7f\x69\xff\x0d\x71\x2b\x96\xe0\xcc\xc5\x9c\x86\xf3\x28\xbd\xf4\x46\x0a\x8d\xba\x8e\x71\x08\xaa\xaa\x19\xc7\x20\xff\x10\xf6\xfa\xf7\x81\x37\xf2\x78\x7d\x89\xeb\xa9\xb3\x7a\x1a\x45\x67\x13\x2e\x59\x71\xdc\xf0\x63\x58\x9e\x81\xeb\xae\x09\x3f\x79\x0d\xa6\xc1\xbe\x6e\x40\x45\xfe\xf9\x8c\xbd\xc6\x3e\xe1\xd3\xb4\xb0\x28\xd0\xa7\xce\x51\xfd\xb4\xe6\x82\xb6\xab\xa7\x97\x46\x39\x28\xa5\x02\x40\xda\x68\x7f\x8f\x92\x28\x16\xae\xa4\x82\xec\xd3\x24\xc4\x92\x57\x69\xdc\xba\xa0\x2c\xe1\xfb\xe0\x83\xff\xb1\x96\x86\x43\x30\xc9\xe3\xf9\x4d\x75\x49\x97\x2e\xe0\x3a\x6b\x3c\x9e\xdd\xb4\x03\x07\xfc\x4f\x6a\xe0\xcb\xcd\xba\xa9\x96\x76\x00\x7e\xb4\x35\x52\x0e\x6c\x8b\x37\xf1\xe0\xf8\x7c\xc7\x1e\xec\xd6\x4e\x3f\x17\xc1\x47\x00\xae\xae\x2e\xc4\xbf\x96\x12\xec\x64\xa3\x92\x2b\x43\x24\xe9\xa7\x34\x15\xba\xfa\xeb\x69\xb8\xb4\x8a\xca\xd2\x3b\xad\x55\x4a\x69\xf5\x55\x22\xdd\xa2\x42\x61\x4a\xa4\x0e\x4b\xff\x7d\xbe\x41\x97\xb4\x4e\x25\x15\xd3\x10\xc5\xfd\x9c\xd1\x0c\xcd\xf0\x7a\xad\x93\x54\x8c\x18\xd5\x13\xac\x69\x9d\xf6\x9a\x41\xfd\x3f\x07\x7d\xd3\xfb\x5f\x49\xdf\x74\xf9\x45\xdf\xf4\x7b\xd7\x37\x71\xb6\xe1\x75\xe0\x17\x52\xb1\xc0\xd0\x4c\xf0\x6a\xbe\xe7\x71\x31\x43\x68\x84\x2a\xa5\x8f\x38\x9f\xcf\x38\x61\x79\x9d\x2a\xcb\xee\x55\x09\xa0\x48\xe0\x9e\xd9\x9a\xa3\x66\x06\x33\xa9\xab\x50\xb4\xe0\x9f\x05\x09\x3f\x28\x10\xe3\x43\xb1\x37\x52\xa9\x24\xc2\x3f\x17\x28\x06\xbe\xa7\x93\xfc\x3e\x6b\xb6\x90\xa8\xf7\xa0\x17\x16\x39\xa3\x0b\x4f\xa5\x24\xaf\x6b\x9e\x30\x8a\x62\x92\xe0\xe7\x89\x0e\xff\xa5\xbb\x7e\x91\x3f\x95\xcd\x74\x7b\xdd\x83\x07\xb7\xe8\x14\x40\xa1\x84\x8b\x5b\xd3\x9f\x93\xa9\x2f\xf9\x68\x29\x2e\x2a\x37\xd5\xbd\x5a\x40\x15\x59\x34\x20\xb9\xc0\x22\x49\x66\x02\xff\x64\x8f\x65\xcb\x15\x11\x26\x75\xb4\x6e\x52\xa7\x67\x02\x06\x09\x4a\x68\x8e\x43\x9a\x44\xb9\x0f\x4a\x99\x2a\x31\x33\xf8\x15\xab\x59\xf1\xd7\x29\xca\x72\xac\xf2\x48\x65\x83\x05\xce\x73\x34\xc3\xa0\xd4\x92\xd2\xea\x99\x02\x3b\x22\xf0\xc5\x2c\xa1\x19\x3e\x59\xe6\x0c\x2f\xfe\x41\x27\xb9\x4a\x78\x2b\xee\x8f\xea\x6b\xb9\x57\x7d\x55\x2b\x17\xac\x1c\x34\x8f\x6a\x23\x56\x1f\x61\x1d\xcd\xf5\x3a\x70\x0d\xca\x55\x14\x84\xee\x0a\xd0\x19\xe2\xa8\x6d\xdc\x70\x4a\xb3\x10\x0b\x6c\xcb\xf2\xea\x77\x09\xb9\xb8\xcc\x31\xef\x14\x1c\xcb\x44\xf6\xf6\x82\x55\x85\x9c\x40\x37\xcb\x23\x55\xa4\x59\x2f\x59\x95\x59\xeb\xa4\x0a\xc4\x9a\xf8\x19\x28\xf9\xa6\x2f\x7c\x7f\xee\x3c\x98\xb2\x1d\xcc\x47\xdf\x6b\x55\xa6\x18\x83\xd6\xdb\xbc\x37\xea\x47\x63\xfd\x20\xe4\x67\xfd\xdd\xde\x1a\xfc\x94\xbf\x37\xe1\xa7\x9c\x33\x63\x37\xaa\xe6\x5f\xff\xee\x60\x5b\xca\xf5\x1f\xed\x42\x43\x29\x74\x2e\x7b\x5d\xba\x66\x65\xab\x74\xf6\x06\x54\xe3\xf8\xea\xfc\xf2\x06\x09\xee\x69\xf6\x9c\x81\x98\x5c\xf3\xa5\x5e\x05\xb0\x2a\xf5\x4a\x81\x55\x19\x91\xe8\x2d\x0e\x31\x39\x6f\xaa\xa6\xea\xdf\x45\x58\x50\x97\xbe\x34\xba\xb7\x31\xd6\x44\xd3\xda\xd9\x9f\x56\x77\x29\x17\x8a\x31\xbf\xec\x1b\xa7\x6f\x7f\x5f\x4c\x8e\xdf\xaf\x8d\x32\x2e\xb2\xea\x14\xa9\x6d\x34\xd7\x90\xe5\xb1\xd2\xdc\x7a\xc3\xde\xf7\xb4\xc8\x3c\xc5\xa4\x78\xc3\xb9\x57\x42\x5d\xf6\x40\x94\xe5\xa6\xf0\x81\x5d\xf8\x95\x53\xf8\x95\x5d\x38\x3c\x72\x4a\x87\x47\xb5\xe2\xde\x33\xb4\xac\xca\x22\xab\xc8\xac\xb2\x2c\x53\xa4\xbe\x3c\x55\xe1\x19\x24\xf6\x1b\x31\x05\x6a\x8b\x72\x5c\xbb\x72\xf4\xc6\x91\x5f\xdb\x68\xd2\x46\xea\x3f\x3a\x2c\x53\xce\x4c\x24\xec\x99\xce\xab\x0f\x56\x78\xe0\x7c\xe3\x22\xd3\x2c\xb8\xf4\xe7\x35\x91\xa9\x76\x12\xc6\xe1\x4d\x25\x9b\xa5\xdb\xc1\xda\xc3\x74\xf3\x24\x88\xe7\x8d\x09\x35\xce\xe3\xcd\x33\x21\x76\x74\x61\x6f\x5c\x0f\x8e\xab\x7b\x7e\xb3\x90\xb5\x19\x1e\x80\xf3\x5a\x2a\x49\xa7\x89\xda\x51\x32\x17\xe3\x6e\xbd\xe9\xa6\x4e\x0f\x17\xad\x5b\xc3\x83\xe3\xc9\x4d\xd1\x37\x0d\xe6\x5c\x52\x9c\xda\x52\xe2\xeb\x4d\x52\x22\xe6\x3b\x5b\xca\x67\x39\x89\xf0\x04\x65\x07\x11\x66\x88\xc4\x37\xb1\x58\xee\x32\x4e\xae\x35\x6f\xc9\x9e\x18\xdd\x37\x32\x64\xce\x10\xc3\x42\x77\x9f\xaf\x93\xf6\xa4\x50\x62\x19\x1a\x54\xd2\xde\xde\x67\x9d\xe3\xee\x8b\xc4\xf5\xfb\x95\xb8\x24\x13\xfe\x71\xb3\x35\xf6\xdf\xdf\xb1\x87\x2f\xde\x9e\x1f\xd4\xbc\x6d\x1f\x58\x06\xd4\x32\xf8\xcc\xf3\x73\x14\x3f\x93\x87\xf6\xd4\x71\xb0\x95\x66\xb6\x43\x13\xb4\xda\xfb\x56\x29\xa8\x4f\xf9\xf1\x3e\x47\x71\x5f\x9e\xf6\x3e\x3f\xe8\x28\x96\x1e\x5f\x9e\x1a\xaf\x30\x9a\x1d\xbb\x6e\x64\x43\x9d\x21\xc3\xe4\xba\x91\x74\xc3\x89\xeb\x4d\xf2\x13\x12\xe1\x27\x28\x7b\x9d\x62\x61\xf4\xe8\x51\xf9\x47\x65\x2c\x7e\xdf\xb6\x05\x8f\x69\x8e\x4f\x24\x24\x35\x0b\x2f\x44\x29\x2b\x32\x2e\xe9\xe1\xcb\x10\xa7\x4c\xbf\xca\xf1\x61\xb0\xac\xc0\xd0\x63\xd9\x58\xbc\x3d\x88\x99\x64\xf4\xe2\xb4\x61\xce\xea\x38\xb8\x91\xfc\x25\x45\x91\xf0\x8f\x68\xf5\x6d\xeb\x74\x04\xb6\x2c\x6e\x95\xcd\x95\x31\x46\x55\x1f\x7a\x73\x94\xf7\x45\xd2\x00\x19\xc6\x0b\xb7\x3b\x94\x56\xc0\xe4\xda\x3c\x50\x6b\x63\xfe\xd3\xd5\xf5\x76\x31\xb4\x2d\x7b\x7b\x7b\xd6\x92\xdd\x5f\x3b\x67\x31\x17\x91\x78\xbb\x3f\xc7\x28\x52\xf6\xbd\x9d\x98\x18\x42\x6f\x52\x30\x26\x11\x21\xbd\xb7\xe5\xef\x1e\xc9\xfb\xd2\xc6\x51\x84\xc1\x96\xa5\x0f\xec\xda\x72\xf5\x1f\x3a\xae\x02\xad\xbb\x60\x5d\x9a\x01\xd7\x13\xf8\x91\x00\x88\x92\x50\x44\x40\x6f\x3a\xff\xee\x82\xcb\x0d\x08\x0a\x69\xc2\x10\x49\x36\xe1\xa8\xd9\x50\x09\xe2\x9b\x22\xb4\x1f\x42\x6f\x3e\xb4\xcc\x9d\x09\x8b\x31\xc7\xab\xf0\xad\x5e\xb7\xaf\x7a\xbd\x1f\x28\xeb\x7d\x47\x8b\x24\x6a\x83\xdb\x16\xd0\xdd\x74\x79\x54\xed\xe8\x62\x22\x0d\xf2\xd7\x75\xf4\x6e\x8e\x7b\x19\xfe\xb9\xc0\x39\xc3\x51\xaf\xe2\x23\x7a\x21\x2d\xe2\xa8\x97\x50\xd6\x9b\xe0\xde\x94\x0f\x65\xd0\xfb\x37\x2d\x7a\x0b\xb4\xd4\x5f\x51\xc1\xe6\x34\x23\x1f\x71\xd4\x63\xb4\x77\x4e\xf0\x85\xe0\xe0\x2d\x28\xb0\x47\x98\x68\x31\x47\xe7\xb8\x37\xc1\x38\xe9\xcd\x50\x36\x41\x33\xdc\x0b\x69\x2c\x79\x5d\xd8\xa3\x59\x8f\xcd\x71\xef\xc5\xb3\x1e\xc9\x7b\x24\x39\x47\x31\x89\x06\xdb\x4e\xfc\xe6\xa7\xea\xa4\x08\x43\xb1\xc7\x37\x9e\x2b\x45\x65\xb7\x39\x58\x6d\x6b\xbf\x55\x44\xff\xa1\xcc\xa6\x90\xb1\x17\x51\x7b\x4c\xff\x16\x0f\xe9\x49\xb1\x48\x71\xd6\x8f\xf1\x94\xf5\x18\x9a\xf1\x3d\x96\x66\x44\x78\xd9\xae\x5b\x7b\xa7\x53\x86\x58\x91\xaf\xed\x73\x07\xfc\xff\x21\xe8\x8b\x77\x0a\xd7\xee\x97\x09\xbd\xc4\x51\x5f\xdf\x2c\xfc\xe4\x2f\x50\xab\x2f\xcd\x36\xed\xfb\x13\x1a\x2d\x7b\x24\xe1\xe2\x48\x5f\xf0\x2d\x44\x0a\x3f\xb2\xfa\x43\x61\x3d\x98\xc6\x68\x39\xea\x4d\x63\x7c\xf9\xd7\xcd\xd4\xa9\x2d\xe1\x84\x00\x24\xc3\x97\xf6\x1e\x0d\x86\x47\x0f\x33\xbc\x58\x07\xaa\xd7\x7b\x5e\xd1\x0c\xc9\xbe\xe4\x3b\xd3\xac\xc3\x8e\x29\x88\xff\xf6\x4d\x50\xf3\x11\x27\x1a\xc5\x22\xd9\xbc\xa9\x6b\xe1\x03\x10\xe9\x3e\xab\x1d\x6d\x18\xce\x16\x1b\xda\xf4\x7a\xff\xa0\x93\x2e\x58\xed\xb3\xed\xd5\x58\x86\xbf\x58\xec\xdc\x82\x46\x22\x0f\xea\xb7\x19\x2d\x98\xa0\x13\x6e\x3e\x13\x7e\x42\xd3\x18\x91\xe4\x1f\x74\xf2\x42\x26\x59\xf9\xd6\x33\x67\x37\xa9\x45\xec\x50\x69\x47\xde\xd3\x49\x3e\x10\x91\x4e\xd6\xb2\x83\x2d\xc3\x87\xad\x3d\xae\x99\x93\x20\xae\x9d\x35\xd6\xa2\xe4\x97\x5b\xaf\x77\x19\x99\xfd\x7f\xec\xbd\xfb\x7a\xdb\x36\xbe\x28\xfa\xbf\x9f\x42\xe1\xee\x78\x11\x13\x88\xb6\x93\x66\x2e\x9a\x61\x3d\x69\xd2\xae\x76\x56\x33\xc9\x89\xd3\xb5\xf6\xda\x1a\xed\x86\x22\x21\x09\x31\x49\x70\x08\xc8\xb6\x22\x73\x7f\xe7\x35\xce\xeb\x9d\x27\xd9\x1f\xae\x04\x41\xea\xee\xb4\x75\xe3\xf9\xbe\x4e\x2c\x10\xd7\x1f\x80\xdf\x0d\xbf\xcb\x94\x73\x74\xbd\xaf\x17\xfb\x6d\x9c\x15\x42\x44\xf7\xf5\xf5\x62\x35\x64\x36\x1d\xfc\xdf\xe0\x9d\x78\x53\x62\x52\x62\x76\x30\x7c\x0b\xd5\xcf\x03\x70\xad\xff\xbd\x10\x42\xa6\xcb\x12\x6e\x0f\x5b\x45\x01\xff\x6c\xa1\x14\x25\xb7\xae\x8e\xb5\xb3\xe5\x18\x3f\xe3\x09\x4b\xa3\x58\x18\xdd\xf4\xbe\x8d\x70\x3a\x2f\xd1\xa1\x47\x6d\x16\x51\xd3\xa7\xea\x72\x25\x17\xb4\xdf\xb1\xdb\x9e\x99\xb0\x82\x70\x4d\x22\x9c\xa2\xe4\xdd\xbf\x3f\x4f\x53\x12\x77\x30\xa7\xdb\xb0\x1b\x49\x94\x4f\xd7\x30\xaa\x1b\x39\x0e\xce\xe8\xae\xdd\x90\xd6\x66\xec\x4d\xfb\x3b\xb9\x1d\x67\x6c\xaf\x99\xf6\x4b\xe6\xe3\x72\x93\x73\x75\xc2\x6e\x73\xee\x2f\x7b\x56\x4a\xdd\xf2\xc4\x22\xd0\x8d\x1e\x3d\x35\xd4\x93\x96\x47\x70\x47\x86\xdb\x7d\x4e\xc8\x6a\x69\x25\x41\x34\x46\x79\x82\x72\x46\x5f\x45\xc5\xaa\x53\xa1\x16\xf0\xd4\x5e\x40\x2e\x33\x69\x45\x32\xff\xaa\x01\xdb\x97\x75\x9d\x99\xb0\x27\xd3\x11\x44\xd5\xcf\x9a\xbb\x93\x7e\x13\x96\xb2\xa7\x51\x5f\xe5\x3f\x7b\x6a\xca\x5b\x0d\x55\xee\xf0\xf6\xb8\xca\xe6\xae\xb6\x96\x2b\x22\xad\x0f\x9b\xeb\x67\x38\x67\xdd\xda\x61\xa3\xae\xf3\xfd\x4b\x7b\x6a\x3a\x23\x6f\xdb\x29\xd8\x94\xb4\x06\xb1\xbe\x75\x40\x79\xa5\xae\x0e\x7a\x38\x91\x8b\xeb\x3c\x0c\x3b\xdf\xdb\x4f\x78\x5b\xdf\xa2\x94\xd3\x0f\x8b\x63\xff\xa4\xd7\xb5\x7d\xb1\x56\xab\x52\x7a\x9b\x35\x15\xfb\x6a\x38\x7a\x46\xcb\x21\x57\x5f\x6b\x27\x68\x2f\x8e\x72\xa5\xcb\xb8\xc2\x74\x2e\x74\xc8\x2d\xcd\xc3\x06\xb8\xdc\x09\x49\xd0\x1c\xf4\x0e\xe2\xe4\xbe\x52\xe4\x86\x53\x62\x49\x73\x6f\x11\x2d\x48\x4e\xd1\x4e\x19\x05\xd7\x0b\xaf\xb4\x3f\x99\xa7\x69\x7f\x9c\xa2\x2d\xf5\xaa\x67\xcf\x2c\x1c\xf6\x81\xca\x65\xcb\x08\x0b\x5d\x69\x38\xd7\xce\x71\x3d\x92\x5d\x1d\xcf\xcc\x15\x6e\x64\x22\x47\x59\xe2\x21\x1b\x4b\x15\x0e\x1f\xc1\x31\xee\x24\xb7\x23\x9c\xa5\x48\x20\x38\xa9\xa6\x87\xda\xe5\xbf\x2f\x14\x1c\x7d\x32\x67\x14\x27\xbc\x55\x2a\xd5\xdb\x7d\x5a\xe0\x3c\x47\xa5\x8e\x0b\x60\x92\x17\xa6\x38\xbf\xec\x33\x62\x07\x05\x70\x23\xa5\xad\x4a\x6e\x68\xe6\xd8\x9f\x98\x49\x76\x3c\x1f\xaa\xdb\xd2\xb7\x6e\x8b\xa0\x09\x94\x77\xc9\x37\xa2\x7f\x85\xd1\x35\x67\x2e\xb6\x88\x3c\xb0\xf2\x79\x72\x5d\x18\x82\x0f\xa1\x4f\xa5\x35\x5b\x16\xb1\x78\x86\xe8\x05\x13\xae\xe1\x4b\xd5\xc5\x40\x3e\x45\x88\x00\x56\xeb\xaa\x2d\x79\xb5\x81\x47\x95\x96\xaf\xaa\x94\x45\xdc\xa6\x06\xe3\x39\x5d\x88\xda\xc9\x36\xb5\x05\x36\x13\xd5\x0b\xc7\x14\xa8\xdc\x23\xa7\x62\xf3\xd9\xa5\x95\x2c\xb1\xd6\x59\xb6\x72\x25\xd6\x4f\x23\xad\x74\x89\xfa\xfd\xc0\xa4\x49\x74\x32\x38\x4e\x57\x64\x70\x54\x46\x3c\x26\xe7\x9a\x7c\xd0\xed\x4a\x2e\x57\x7f\xad\x6c\xe6\x40\xbc\x67\x22\xb6\x94\x8f\x56\x83\x25\x8d\x4b\x92\xa6\x2a\x8b\x07\x94\xbf\x64\xc0\x80\x01\xae\xaa\x10\x1d\xb1\x47\x2a\x03\x91\x98\xd9\xf1\x31\xd6\xbf\xe5\x94\x94\xcd\x8c\x0e\xa1\x80\xa1\x9d\xfe\x40\x65\x59\x72\xe9\xb4\x33\xdd\x7a\xa6\xf2\xcf\x20\x26\xb9\xc8\xb2\x56\x1f\x55\x95\xfe\x09\x95\x51\x19\xcf\x16\x3e\x58\xb2\x72\x21\x03\x5e\x18\x5b\x40\x8e\x3a\xc2\x30\xf4\x95\x83\x55\x6b\x50\x70\x7b\x6b\xde\x29\xd1\xb9\xfc\x73\x80\x02\x75\xb7\x78\x3d\x7a\x84\x27\xbe\xb6\x31\xac\x8d\x06\x03\xca\xca\x88\xe1\xc9\xc2\x07\x01\x4e\x94\x9f\x16\x4e\x00\x08\x24\xdb\xf2\xbd\x2e\x2b\x4a\x74\x85\xc9\x9c\xf2\xbe\x00\xf0\x87\x41\x10\xb0\x80\x11\xe9\x19\xa2\xcc\xd8\x5a\xd3\x1a\x69\x7b\x36\x26\xdd\xeb\x48\x8a\x02\x71\x7e\xfd\xf7\xff\xcc\xff\x99\xb7\xd9\x84\x9e\x38\x38\x03\x91\x1f\x87\x69\x33\xc4\xea\xbd\xce\x5b\xd1\x33\xa9\xa5\x9a\x8c\x93\x0e\x10\x72\x64\x55\xb3\xc0\x65\x60\xbb\x02\x4c\xaa\xb3\x28\x67\xd4\x57\x69\x35\xa4\x2b\xd2\x0c\xa7\x49\x89\x72\x00\x6a\x7f\x26\x31\xba\xcb\xd2\x1d\x3a\x7e\xc4\x22\xd1\x2f\x52\x66\x66\xdb\x1d\x20\x5e\xb9\xb2\x55\xd4\x6b\x5a\x0a\xff\x9b\x57\xaf\x5f\x3e\xff\xe1\xa7\x17\x3f\xbc\xbe\xf8\xc6\x03\x55\x05\xb3\xf0\xda\x2f\x9c\xe0\xff\x36\x36\x18\xd2\x43\x6d\x4c\xc6\x1d\x23\x68\x84\x32\x9c\x1f\x6e\xc1\xd2\xea\xdd\xe0\xa4\xc3\x6d\xa6\x66\xed\xde\x15\x5a\x3b\xdc\x3e\x6a\xea\xf6\x7d\x77\x29\x43\xda\xa6\xd4\x62\x4c\x61\x04\xe6\x0c\x7a\x87\xe1\x5e\x56\x8f\xea\x8e\xd9\x90\xfd\x86\xf9\xd6\xe1\x5f\x56\xf7\x02\x60\xd1\xb0\x98\x6a\x56\x6d\xbc\xe1\xec\x3d\x60\xa3\x17\x67\xc0\xc2\xb6\xa0\xfa\xb0\x2e\xd8\xcc\x47\xf8\x61\x63\xb0\x99\x6d\x59\xa4\x43\xcd\xad\x4c\xe5\xba\x0e\xc9\xd3\x45\x97\xf5\x14\x58\xde\x95\x11\x4b\xb9\xd9\x88\xe5\xc3\x7f\xff\x10\xd3\xab\x3f\x3c\x6f\x84\x14\xdc\x5e\x38\xd9\x4f\x28\x59\x25\xb0\x76\x30\xe9\x9b\x85\x8f\xae\xed\x6a\x0f\xa9\x5e\x2d\x4f\xcd\x73\xa5\xda\x6d\x61\x2c\xa0\xa2\x50\xcb\x97\xc9\x53\x4b\xe1\xe4\xa8\x42\xba\x5e\x24\xbd\x66\xa4\x38\x1d\x41\xf1\x89\xab\xad\x78\xb2\x29\x66\x9c\x13\x79\xaf\x36\x3b\xd9\xf8\xc6\xa3\x5f\x64\x75\xb4\xb9\x3f\x34\xa2\xcd\xd9\x33\x91\xab\x77\xfc\x5c\x65\xe1\x33\xe8\x7d\xec\x4b\x9f\xd2\xde\xd9\xe9\x5f\x7a\x38\xa7\x88\x0d\x7a\xa7\x7f\xe9\x15\xca\x85\x7a\xd0\x8b\xc6\x94\xa4\x73\x86\x78\x99\x88\x8b\xd4\x17\xb6\xb5\x74\xd0\xcb\x89\x0c\x00\x27\x41\xf8\xa5\x02\xc2\x53\x38\xf4\xa4\x82\xaa\x44\x71\x94\xc6\x2f\xe6\xe5\x15\xa2\x36\x44\xea\x89\xad\x80\xec\x93\x66\x24\x3f\x27\xaa\x1f\x1f\x40\xba\x0d\x7a\xe2\x18\xf0\xcd\x9f\xe1\x62\x17\xd5\xa0\x3a\x62\x9e\xf0\x72\x1d\xc9\x80\x75\x89\x67\xe2\x34\xea\x07\xb2\x2f\xa1\x47\x59\x49\x2e\xb9\x58\xf5\x3f\xfe\xf8\xcd\x9f\xbe\x7d\xfe\x27\xaf\x51\xae\x52\x8a\x7b\xda\x38\xc0\x9b\xe0\x34\x15\x4e\x73\xb9\xa5\xc7\xd8\xa0\x67\xf7\x62\x5c\xc6\x75\xe0\xbc\xf8\xa6\x9e\x08\xbd\xa9\x83\x05\xc6\x0b\xab\x7c\x51\xcf\x90\x0b\x94\x5f\x3a\xe3\x5f\xcf\x30\x43\x9e\xbb\x84\x71\x1a\x49\xa5\xdf\xa1\xd3\x42\x2b\xa6\x85\xee\x76\x5a\x32\x88\xe9\x0a\x05\xec\x4a\xbd\x00\x3f\x67\x6d\x11\xbf\xa3\x17\x1b\xcf\x74\x07\x5b\x6c\xbf\xed\x72\x7c\xc3\xf1\x7b\x87\xc6\xd2\x8a\x1b\x68\xa1\x83\x55\x9a\x49\xfe\xad\x4b\xed\x59\x6b\x55\xff\xd4\x42\x49\x6d\x2d\x2c\x5c\x33\xcc\xca\x70\xa1\x9d\xea\x93\x8d\xb7\xee\x49\x97\x2a\x75\xf3\x7d\x6b\x6b\x0a\x6b\xda\x2b\x68\x92\x8b\xb7\xb7\x98\xca\xb3\x2d\xef\xf9\x1d\x6c\xe1\x1f\x34\xae\xb9\xfb\x6d\xb3\xba\x5e\xb1\x55\xa2\xe6\x1f\x3a\xcf\x7f\x97\xfa\xeb\xd9\x1e\xf1\xfc\xc5\x4f\x11\xfd\xd2\x7e\x53\x10\x1a\x79\xbe\x35\xf2\x1a\x73\x88\x51\xf5\xaf\xa5\xfe\x22\xb9\x8c\x5d\x87\xb4\xee\x2b\xca\x13\x0f\x7a\x45\x49\xae\x70\x82\x4a\x7a\x22\x3b\xe9\x37\x91\xb4\x0c\x88\x29\xbd\xab\x57\xea\xb5\x3a\x18\x34\xf7\xdc\x78\xd0\x9b\xe4\xfb\x2a\xac\x3a\xd8\x87\x55\xda\x2b\x69\xef\xbd\x86\xe1\x2c\xa1\xf0\x92\x34\x1e\x99\xc0\x66\x55\xd3\x8d\xac\xe8\x0d\x8a\xfb\x0c\x95\x19\xce\xa3\xcd\x06\xfe\x37\xbc\x66\x3f\x4a\x12\x92\xf7\x27\x98\x6d\x17\x54\x70\xe7\x58\x81\xca\xc8\xfd\xe8\x6e\x1c\x59\x89\xf2\x44\xb5\x43\xa4\xe9\x05\x5b\x56\x9b\xc0\x4f\x37\x05\x15\xcb\xad\xa0\x62\xfb\xc6\x96\xe2\x33\x92\x29\x1a\x70\xf0\x2d\x66\xcf\x39\x28\xa5\x1b\xe5\x44\xfd\x0a\x55\xd6\x73\x3d\xc7\x20\x25\x51\x22\xbe\xf8\x08\x38\x9f\x48\x81\x72\x7f\x5d\xac\x22\x53\xd5\x03\x1c\x3c\x13\xcc\xfc\xee\xb8\x0f\x3a\x92\xa8\x9e\x85\xac\xea\x0c\x27\xaf\x5b\x72\x7c\xdc\x59\xec\x23\x50\x55\xe0\xf6\x36\xb5\xce\x1f\xd9\xe6\xfc\x9d\xf0\x65\xf4\x95\xb1\xde\x9e\x51\x09\x28\x2a\xaf\x70\xdc\x11\xc3\x72\x8a\x72\x54\x72\xc9\x47\x9c\xf4\x79\x99\xb6\xab\x88\xe1\xad\xcf\x7b\x05\xb7\x5c\x9f\xd4\xed\xc1\x73\xe3\xb7\xea\xb9\x21\x43\x6b\x89\x18\x6f\xb6\xa3\xbc\xef\xd3\x2d\xbd\x78\xb7\x0f\x7b\x2c\xec\xf9\x4a\x3b\xec\xf1\xfc\x57\x1b\xf6\x58\x60\x26\x11\x4c\x26\xad\x49\x93\x40\x1b\xfa\x42\xfe\x58\xa6\xbe\xf0\x47\xb5\x7e\x2e\x4d\x1a\xe7\xd2\x69\x25\xd7\x0e\x97\x1f\xc8\x58\xba\x66\x7e\x20\x63\x68\x52\xc6\xc8\x22\x2b\xbb\x4c\x44\x2f\xeb\x32\x58\xe7\x9d\x53\x39\x98\xcd\xef\x0a\x54\x15\x9c\x87\xb1\x4f\x6d\x4d\x90\x06\xf4\x30\x0f\x70\xce\xa1\x7b\xa8\x2e\xd0\xe9\x9f\x48\xd5\x2b\xde\x5a\x4f\xd5\x6e\x0d\x20\x6d\xa4\x29\x09\x29\x00\xb7\xb7\x91\x85\x7a\x93\xad\x50\xaf\x4c\x9a\x20\xd5\x11\xdb\x6a\x9c\xb6\xc4\x8c\xf2\x68\xe7\x77\x44\xc6\x95\x5a\xa9\x71\xc7\xf2\x95\x57\x8c\xd3\xa1\xdc\x02\x46\xb9\x3d\x30\x44\x9e\xbd\xbe\x14\x68\xb6\xa5\x46\x35\xf5\xd9\x3a\x68\xce\xa1\x64\x6a\x1b\x42\xd4\x1d\xef\x46\x46\x59\x86\xaf\x8f\xdc\xd0\xc5\xf7\xc3\x1b\xf2\xf2\x17\x8a\x7b\xf3\xea\x81\x96\x7f\x0e\xb4\xfc\x22\xf4\x23\x29\x31\x90\x12\xa8\xe8\x69\x28\x91\x8f\x65\xda\x62\xeb\x2d\xa7\x0f\xdf\xd3\x77\x33\x4c\xdf\x99\xf4\x8f\x00\x52\x19\xaf\xc6\x8a\x39\x23\x09\x49\x60\x37\xf3\x60\x9d\x32\x32\xe0\xe4\x2c\xc8\xa3\x0c\xc1\x5c\x05\x38\x9e\xb7\xfa\xa8\x6b\x5b\xe9\x53\x55\xa0\x64\x19\xe5\xe3\x42\x3a\xdb\x28\x53\x84\x52\x06\xc6\x5d\xd5\xd2\x83\xc2\x39\x07\xf1\xfa\x49\x6b\xb0\xba\x22\x5f\x98\x30\x4f\xa0\x6f\x39\xb6\x4f\xc4\x2b\x30\x0d\x86\x23\x4f\x05\xe6\x29\x55\xe0\x4f\x31\x54\x57\x3b\x2e\x96\xeb\x48\x99\x2a\x20\x4f\x3d\x37\xa9\xc4\x68\x54\x16\xa9\x2e\x54\x34\x9d\xae\x8a\xd4\x06\x9d\x0e\x66\xdd\x9c\xbd\xa9\x2b\xea\x68\x28\x89\x04\x31\xb0\x35\xe4\xaa\xaf\xce\x07\x6b\xb7\xc4\x4e\xf1\xdf\xb4\xd2\xc1\xb1\xcb\x80\x92\x92\x29\x60\xd3\xff\xc2\x6c\xf6\x76\x9e\xe7\x38\x9f\x36\x96\x75\x41\x4a\x86\xf3\xa9\x07\xe0\xf4\x80\xd8\x2e\x3a\x20\xb4\x66\x4f\x16\x4e\xa0\x68\x4c\xe5\x31\xbd\x72\xca\x37\x6d\xaa\x89\x82\xe2\x44\xb0\xb6\x77\xe7\xe3\xca\x1a\xb4\x1d\x1c\xdb\xdd\x87\x3a\xa6\xf5\xa5\x8e\x78\x6d\x01\xc5\xa4\xf0\xa9\x3b\xe0\x30\x45\x89\xea\xfd\xb5\xd3\xb6\x71\x25\x1f\x9d\x35\x6c\x34\xba\x6e\xa6\x15\x28\xdb\x62\x25\x1b\x97\xf2\x08\x4f\x7c\x24\x36\x3c\xc0\xb9\x48\x21\x48\x7d\x3b\xeb\xae\x8e\x22\xde\x63\x21\x52\x56\x13\x1a\xf3\x33\xf5\x9b\xff\x13\x65\x82\x2f\xfd\x89\x77\x14\x2a\x2b\x93\xfa\xf8\xe8\xbb\x7e\x7c\x6c\x2a\xf3\x8f\x3f\x89\x21\x56\xb4\x11\x68\x41\x8e\xf4\xe8\x4c\xe5\x12\xa1\x6f\x90\x88\xda\xfe\xbc\xbe\xd4\x8e\x55\x40\x37\xca\x88\xf2\x85\x30\x7a\xf0\x0a\xd9\xde\x13\x01\x50\x6d\x14\xa2\xc2\xc3\x74\x9d\x17\xd7\x42\x67\x13\x9e\xd0\xf4\x45\x87\xac\x0f\xa4\x6d\x99\x6f\x19\x94\x00\x00\x87\x23\x39\x62\xf7\xe5\x71\x37\xae\x75\x81\x1b\x91\x87\x79\x1f\xc7\xc7\xf2\x5f\x07\x82\xdd\x70\x05\x26\x84\xb8\x38\x7e\x26\x1c\xba\x53\x55\xcc\xcd\x0c\xc5\x84\xf1\x8c\x3e\x23\x4c\x75\x04\x2a\x99\x58\xe7\xb5\x94\x7a\x64\x0f\xa2\xc4\xd0\xa1\xc6\xb1\x95\xf2\xd1\xf7\xf9\x3f\xd0\xf5\x7f\x09\x65\x8c\xe6\x69\x38\x05\xca\xc3\x0e\xa9\xc9\x96\x7f\x90\x2d\xf8\x48\x59\x07\x57\xe0\x2f\x42\x06\x35\xad\x72\x2e\xd9\x2c\xc2\x57\xfe\xb4\x53\xb2\xc1\x77\x24\xd9\x5c\xb9\x23\x68\x24\x34\x8c\x0e\xed\xda\xe9\x78\x1d\xed\x15\x66\x2c\x9b\x84\xa8\xad\x7b\x03\x70\x6a\xcb\x56\xce\x3c\x3a\x2f\xa0\x34\x75\xd9\x69\x06\xdd\xfd\x38\x63\x5f\xbb\xe0\xdd\x8c\xcb\x0f\xb7\x8a\xd9\x62\x48\x69\x20\xb3\xd3\x7a\x3b\xbb\x71\x96\xfb\xb1\xb5\xdc\x16\x21\x3a\x3c\xa6\xd0\x87\xd5\x83\x50\x19\xd5\xe7\xd0\x18\xb6\x2b\xfb\xd7\xe4\xf0\xf0\xc8\x3e\xce\x10\xab\xb8\x8f\xe1\x64\xc7\x5d\x5a\xd1\x91\xb3\x4f\xaf\xdd\x25\x36\x08\xf6\xe1\x61\x80\xdd\xd5\x19\xe4\xba\x93\x75\xcf\xaa\x3e\xd6\xdf\x6f\x07\x33\xef\x3f\xa2\xdb\x91\x33\xec\x74\xa7\xd0\xbd\xc2\x97\x30\x8b\x28\xc9\x45\x32\x5d\x5b\x2b\xb1\x6d\x28\xa5\x55\x69\xa8\x8c\xae\x22\x79\xaa\x1e\xc0\x1e\x12\xc5\x3e\x08\xc5\x0d\xa1\x78\xde\xce\xe2\x77\xb8\x3a\x5b\x3d\x59\xdd\x8f\x34\x7e\x2a\xf0\x90\x7e\xd4\xd3\xcf\x65\x6a\x0d\x21\x67\xd2\x27\x29\xb9\x96\x2a\xef\x3c\xc8\xd1\x0d\xd3\x79\x33\x4c\x0c\x58\x1d\xe0\xbd\x11\x04\x76\x5d\x9a\x19\x11\xb0\x7f\x40\x63\x52\xa0\xde\x57\xbd\xc0\xc6\x01\x7d\xcc\x50\xe6\x01\x2e\xb8\x9c\x69\xf6\x56\x98\xcd\x4b\x27\x63\x7a\x7b\xfb\xa8\x55\x06\x96\x13\x52\xfa\x22\x9f\x42\x8f\x4c\x7a\x08\xb0\x40\xa4\x75\x13\x1d\x7f\x1d\x51\x4c\xc5\xb1\x81\xba\x58\x44\xd4\x10\x45\x47\x56\x44\xd9\xe6\x7b\xa3\xac\x99\x45\x37\xd2\xe6\x5e\x9e\xbb\xca\xd8\xb4\x9b\xc4\x02\xed\xc9\xc8\xf4\x02\xa2\xbe\xca\x3f\x04\xc2\xaf\xfc\xa5\x34\x13\x1b\x9c\x42\x35\x02\x1d\x0c\x39\x6e\x00\x47\x7a\xee\x58\xce\xdd\x88\x06\xf2\x35\x93\xe3\xe4\x17\x4a\x13\x20\x82\xc5\xfb\x18\xc0\x3c\x14\x81\x4d\xbf\x4d\x49\xc4\x7c\x3e\xcb\x72\x8a\xf3\x77\xa4\x00\xb0\xec\xfa\xf2\x35\x61\x8c\x64\x00\x92\x10\x37\x12\x29\xc2\x28\x64\x43\xc1\x93\x67\x38\xff\x3e\x4f\xd0\x0d\xf0\x99\x4a\x65\x21\xa7\x0b\xc0\xe8\x28\x52\x7f\x3f\x0e\xf3\xc7\xe4\x71\x09\x23\x0d\x23\x1a\x14\x73\x3a\xf3\x31\xa8\x98\x16\x38\xf4\x17\x0f\x04\x93\x34\x62\x3e\x68\x67\x89\x41\x8d\x4d\x60\x22\x75\x4e\xa3\x16\xae\x73\xb2\xe4\x21\xfe\x2b\x53\xd9\x5f\xfa\x67\xe7\x6c\x88\x1f\x9f\x8d\x02\x03\xc9\x32\x44\xf5\x5c\xd2\x88\x32\x79\xc5\x8e\x38\x1a\x29\x5b\x47\xa0\x6c\x26\x91\x7c\x15\xb1\x19\xdf\x5f\x7e\xac\xfb\x66\xbd\x22\x59\x46\x9d\xcf\x67\xd5\x69\x90\x40\x8b\x38\xbc\xf4\xd2\x95\x19\x20\x00\x8f\xcf\x64\x66\x0e\x00\xba\xd2\x54\x1a\xe4\x30\xc4\x9f\xd0\x70\xb9\x95\xba\xd2\xbe\xe4\x87\x64\xae\x6c\xf4\xe3\x24\xae\x74\x06\x95\x88\x63\xff\xc1\x54\xfb\x75\xd9\x31\xe7\x1b\xb9\x0b\x52\x8e\x71\x92\xa0\xdc\x44\xa3\x3a\xe4\x25\xa8\xf5\x2c\xd2\x69\x6f\xcc\x09\x85\x78\xb0\xb8\xa3\x07\xa2\xa8\xe3\x81\xc8\xb5\xe9\xb8\x03\xaa\xc5\xc8\x25\x67\x43\x6b\x9a\x45\x7e\xb5\x34\xab\x82\x34\x4c\xad\xa3\x32\x37\xb3\x8f\x43\xeb\x69\x33\x09\x0f\x61\xd6\x61\x16\x2e\x2b\x68\xb3\x7a\xc9\x0a\x56\x2f\xe3\xac\x5e\xa2\x58\xbd\xac\xc9\xea\xd9\x3f\x61\xe6\xb2\x7a\xd9\x4a\x56\x2f\xbb\xbd\xcd\x5c\x56\x2f\x6b\xb2\x7a\x59\x18\x6f\xc3\xea\x71\xb4\x6b\x54\x5c\x3e\x85\x73\x88\xc0\xed\x2d\xaa\x00\xcc\x00\x2c\x2c\x56\x2f\x73\x18\xb1\x4c\xb1\x7a\x8d\xf2\xf3\xac\xbd\x35\x85\x61\xf5\xb2\xf5\xac\x9e\x3b\x42\xf7\xe9\xe2\x53\xcc\xf8\xf2\x24\xab\x47\xc2\x0c\x96\x61\x0a\xc0\xed\x6d\x79\xe4\x44\x40\xb5\x50\x41\xb4\x11\x15\xd0\x93\x71\x89\xa2\x24\x2e\xe7\xd9\x78\x6b\x1f\x04\xf7\xbd\x53\xbc\x58\x1e\x60\xfb\x55\x27\x8b\xad\x65\x8d\xe4\xe7\x7d\xf8\xbb\x1b\xac\x54\x84\x7e\x2a\xdf\x09\x6a\xc4\x94\x47\x57\x1c\x5d\x77\xd8\xa5\xd5\x90\xf7\x00\x54\xcf\x50\x91\x4e\xf1\x67\x25\xeb\xac\xb3\x6b\x4d\x68\xdf\xde\x2e\xf5\x08\xd5\x48\x7c\x20\x8c\xcc\x01\x4c\xfd\x79\x48\xfc\x79\x18\xf9\x7e\x7c\xc0\x23\x44\x62\xa5\xc5\xec\x9c\x82\x08\xf7\x9e\xb4\x9e\x1e\x74\x28\xfa\xc4\x7e\x01\x60\xc2\x08\xb3\xf9\x41\x66\x7e\xaa\x93\x5d\x5a\x7d\xbb\x0a\x61\x5e\x35\xa0\x45\x8a\x99\xef\x9d\x88\x14\x90\x7c\xcb\xfc\x3c\xc0\xf4\x9b\xac\x60\x0b\xd0\x50\x43\x4b\x8e\x49\x68\x58\x39\xdb\x8c\xbf\x3a\x05\xcb\x3c\x7c\xff\xc5\x12\x0d\x71\xff\x6c\x24\x7a\xab\x4e\x44\x76\xa7\x0a\xa5\x14\xf5\xf2\x90\xd5\x29\x32\x05\x0f\x27\x5e\x80\x06\x0c\xf2\xaa\x83\x9c\xef\x79\x25\x94\xd8\x75\x35\xc9\x84\x1d\x1f\xfb\x68\x88\x0c\x47\x36\x0a\x30\xfd\x21\xa2\x4c\xe0\x23\x24\xbc\xf2\x62\x0b\x2f\x8f\x43\xaf\x01\xc0\x49\x38\xa4\x23\x38\x0b\x37\xb1\x01\x76\x1f\x5e\xf3\x14\x4c\x1b\x03\x2c\x5c\x14\x3d\x5b\x81\xa2\x17\x1c\x45\xcf\x14\x8a\x5e\x34\x51\xb4\xfd\x13\x2e\x5c\x14\xbd\x58\x89\xa2\x17\xb7\xb7\x0b\x17\x45\x2f\x9a\x28\x7a\x11\x4e\x76\x47\xd1\x19\x1c\x1b\x14\xbd\x00\x70\x6a\xa1\xe8\x85\x83\x40\x17\x0a\x45\x37\xca\xcf\x17\x6d\x14\x3d\x35\x28\x7a\xb1\x1e\x45\xbb\x23\x74\x23\x0b\x3e\xc5\x05\x5f\x9e\x3c\xe1\xf3\x30\xe6\xe8\x79\x6e\xfe\x13\x78\xda\x8e\x4f\x5d\xa3\x90\x62\x2b\x3c\x4d\xae\xe9\x5d\x26\x72\x3a\x1c\x5b\xd7\xf6\x26\x35\xde\x9e\xdd\x27\xeb\x92\xe9\x83\x42\xeb\x73\x50\x68\x2d\x3a\xc8\xb2\xa6\xc9\x0d\xe2\x29\x82\x29\x5a\xcf\x9d\x9a\x2e\x6f\xaa\xd4\x26\xc3\x35\xc1\x33\x56\x1e\x96\x01\x85\x0c\x13\x47\xca\xc5\x37\x39\x2b\xb1\x30\x1c\xf8\x9e\xbe\xc4\xa5\xb6\xea\xd8\xae\xb2\xc8\xc3\x92\xb4\x53\x1f\xa9\xfa\xb2\xaa\xdb\x3a\x18\x8e\x3c\xe1\x22\x25\xbe\x52\x52\xb2\x97\xd2\xcf\x46\xaa\x8d\x79\x81\x86\xb3\x60\x23\xfc\xa9\xef\x67\xbb\xca\x55\x9d\x52\x15\x96\xfa\x26\x9f\x85\x12\x84\x1e\xc0\xb9\x72\xa8\x07\x9f\x88\xaf\x9b\x69\xf6\xc5\x06\x89\x8e\x7b\xa1\x3f\x2a\x58\x4c\xac\x58\x15\xf5\xe6\x3a\x2f\xe1\xee\xde\x9f\x77\x96\x0e\xea\x52\xf3\xe0\x2d\x0e\x83\x2f\x72\x44\x75\xb6\x01\xad\x61\x64\xd3\x45\xe1\x66\x39\x31\xbd\x9d\x4b\x23\x9a\x81\xcd\x77\xc9\x50\x1b\xe2\x7d\xe6\xa5\xb3\xf3\x2e\x3f\x65\x6f\x35\x97\x75\x2f\xf0\x47\x24\xac\x04\xce\x3d\x7e\x47\xbc\x01\x82\x58\x65\x96\xa9\xc1\x27\x5a\x7d\xbd\xf0\x19\xd0\xf9\x68\x05\xf8\x74\x31\x02\xb0\x0c\xb1\x7e\xfe\xcf\x9b\xaf\xec\xcd\xc3\x76\x5e\xd6\xa8\x6b\x50\x56\x15\xe8\x7e\x3e\xf4\xe0\x90\x6c\xd6\x91\x64\x2b\x1a\x73\xd1\xd3\x7e\x85\x69\x56\xb4\xb8\xd2\x61\xb4\xe3\x20\xf6\x05\x5f\x3b\xc6\xa2\x40\xdb\xbd\x58\xb7\x9b\x39\x3d\x8f\x43\xa7\xef\xc6\xb1\xbe\x8b\xe8\x0b\x4e\xff\xea\x66\x1c\xfe\xc6\xec\xf4\xdb\x7d\x3e\xb7\x7b\x65\xde\xa6\x23\x07\x6e\x45\x98\x71\x4e\xac\xe1\xd5\xbf\xd8\x82\xe3\x32\xa8\xb3\x8f\x72\xd6\x7a\x88\xfb\x99\xa5\xe3\x9a\xc3\x9a\xdf\x47\xc9\x38\xde\x96\x04\x4b\x81\xd0\x13\x10\x0f\x04\x1e\x12\x54\x68\x5b\xff\x8a\x2e\xc2\x33\x5f\x29\x9e\xce\x57\x88\xa7\x2a\x26\x0c\x9b\xbd\x23\xfc\x4c\x2d\x3a\x45\xd1\x12\x89\x80\x58\xfe\xc9\xff\xfe\xe7\xc9\x89\xc8\x36\xc6\x42\x94\xc7\x24\x41\x3f\xbe\xfd\xde\xb8\xee\x69\x37\x08\xe6\x37\xd6\xa4\x31\xa3\x20\xf6\x5a\x80\xf5\x11\x38\x67\x03\x2e\xa3\x6a\xc9\xb4\x82\x49\x68\xbb\x03\x14\xa1\x67\x4d\xcb\x83\x59\xc8\xb1\xe3\x78\xa3\xf0\xd8\x70\x29\xb0\x7b\xe0\xb7\xde\xfe\x38\x73\x85\xc7\xf1\x0a\xce\x97\xcb\x8d\xe1\x58\x71\xbe\xb3\x26\xe7\x6b\xff\x84\x33\x97\xf3\x9d\xad\xe4\x7c\x67\xb7\xb7\x33\x97\xf3\x9d\x35\x39\xdf\x59\x98\xed\x2e\x3c\x72\x31\x45\x0b\x8f\x33\x00\x27\x16\xe7\x3b\x73\xf8\xd2\x99\xe2\x7c\x1b\xe5\xe7\xb3\x36\xe7\x3b\x31\x9c\xef\x6c\x3d\xe7\xeb\x8e\xd0\x7d\x9f\xf8\x14\x67\x7c\x79\xf2\x60\x6a\x0f\x0f\x29\x34\x5a\x66\xfd\x16\x0a\x8b\xb7\x40\x61\x1c\x83\x37\xf1\x96\x40\x42\x6b\x7c\x19\xf6\x12\x25\x4b\x7a\x55\xb4\x5d\x18\x64\x1a\x7f\x7a\x92\x92\x69\xfb\x23\xc3\x19\x22\xf3\x9d\xdd\x4c\xec\x3c\xbf\x70\x2e\x31\xe4\x5a\xbf\x07\xf8\x06\x5e\xc2\x57\xf0\xa2\xc6\x9f\x3f\xdd\x27\x09\xf5\xdd\x2f\xe4\xff\xf0\xe2\x41\x32\xfe\x1c\x24\xe3\x97\xa1\x2f\x04\xce\xb9\xa3\x99\x6e\x44\xe4\x91\xf4\xb1\xcf\xaf\xb1\x92\x37\xe7\x9b\xf4\xd4\x38\x45\x3a\xca\xa3\x71\x20\xb0\x88\x3c\x65\x11\x0b\x5e\x48\x3f\xb4\x77\x8a\xd3\x95\xcf\xc7\x53\xa6\x3f\x0b\x71\x04\x3e\x43\x5f\x9a\x94\xbb\x3a\x35\x30\xef\xfd\x85\x85\xa6\xe6\xf9\x65\x4e\xae\x73\xed\x24\xb0\xba\x22\x65\x25\x8a\xb2\xda\x98\xbf\xd3\x15\x22\xc0\x89\x67\x71\x04\xda\x31\x40\x60\x52\x00\xa7\xad\x96\x71\xc4\x7e\x2c\xd3\xff\xc2\x6c\x46\xe6\xec\x2d\x9a\xaa\x4c\xc2\x22\xd5\x67\xb0\x94\xd6\x80\xb2\x18\xd2\x19\x99\xa7\xc9\xf7\xd2\x9e\x58\x96\x55\x1e\x80\x8b\x56\x9f\x98\xfe\x10\x95\x53\x3e\x2c\x97\x04\x3d\x00\xaf\xd6\x4d\x78\x89\x13\x98\x93\x04\x05\x33\xc6\x8a\xe7\x49\x52\x56\x7c\xbe\x88\xc5\xb3\x57\x44\xc4\x04\x9d\x53\x74\x81\xca\x2b\xb1\x19\xd7\xad\x9e\x24\x8d\x90\x23\x41\x1b\xf6\x2e\x10\x00\xfc\xd8\x5e\xbd\xb0\x1e\x78\x67\x90\x39\xef\xec\x8d\x30\x77\x57\x3f\x7e\x14\xce\x6d\xba\x73\x31\x8b\xba\xb6\x3d\xb1\xd8\xff\x10\x26\xbe\x7f\xe3\x30\x7a\xf9\x0e\x8c\xde\x4f\x9a\x9d\x93\xef\x9e\xda\x95\x40\x17\xcb\x3d\xf1\xe0\x1b\x55\xfe\xae\xfd\xb8\x61\x9d\x5b\xf1\xb2\xf1\x6e\x25\xeb\xf8\x6e\xd5\xcb\xc6\x3b\x4b\xad\xe0\x96\x71\xe0\xba\x65\x35\x0c\x84\x3e\x47\x17\xe7\xe4\x05\xc9\x73\x7d\x03\xed\x2f\x0e\xc8\xcf\xd0\x53\x6b\x80\x26\x80\x9f\xd9\xdf\xd4\x1e\x88\x80\x59\x35\x50\xcc\x51\xbb\x74\xa0\xc5\xe7\xcf\xef\xe6\xf7\xf4\x47\x75\xbf\xe0\x2b\xa7\x8a\x88\x5f\x81\xa2\x4c\x86\x7e\xb8\x70\xc0\xaa\xbf\x0a\xc5\x92\xf6\xdc\x68\x5c\xc9\x96\x46\xc2\x41\x0b\xb7\xb7\x9e\x57\x3f\xb6\x50\x16\x95\x4c\x58\xab\xfa\x1e\xce\xa2\x29\x3a\xf1\xc0\xb9\xfc\xcb\x1b\x34\x3f\x33\x74\xc3\x4e\x3c\xce\xf1\x35\x8a\xa3\xa2\x48\xb1\xdc\xc6\x13\x11\x11\x18\x9c\x6b\x9c\x30\x30\x58\x44\x3a\x98\xb4\x2f\xb5\x3b\xd9\x5a\x0d\xf3\xfe\x8b\x65\xb3\x44\x3a\x72\x9c\xbc\x1f\x78\x5e\xb7\x4c\x20\x58\xfc\x2f\x96\x46\x7f\x52\xbd\xd7\xf2\xc0\xfb\x93\xab\xb3\x13\xb9\xc3\x9c\x7f\x8b\x23\x76\xa2\xea\x35\x30\x54\x75\xce\x99\xf8\x50\x0a\x09\xf5\x84\x7d\xe9\x53\xa0\x83\x8a\xb6\x17\xd1\xd4\xc7\x48\x1c\xd5\x81\x95\x8e\x8f\x7d\xf4\x38\x7c\x7f\x5c\x8a\x5f\xa1\x9a\x81\xaa\x6f\xa3\xb4\xea\x3d\x80\x48\x6e\xac\xc6\x37\x46\x5b\xa5\x40\xab\x7c\x4f\x8c\x5e\xab\x06\xb9\x28\x52\xe7\xef\x5c\x9e\x4b\xbb\xe2\xed\xad\x27\xc2\xa4\x37\x1b\x97\x28\x4a\x22\xe6\x29\xe2\x3a\xe0\xe8\xd7\x33\x27\x4b\x82\xa0\xb1\x4d\x42\xf2\xb2\x60\xd7\x40\x94\x42\x66\x73\x40\xae\xb7\x45\xaf\xa7\xea\xde\x80\xf7\x0d\x50\x9a\x4b\xcc\xe5\xb7\x93\x13\xb5\xbd\x6a\x6f\x6a\x9c\x68\x4d\xae\x75\x68\xd6\x1e\xa3\xe6\x61\x39\xa2\xd7\x58\x04\x61\xd5\x60\x01\xcb\x38\xa2\x48\x82\x70\x20\xe7\xb5\x14\xaf\x96\x08\x92\xc9\x84\x22\x36\x38\x85\x29\xce\x30\x1b\x3c\x43\x5f\x56\x47\xa2\xb2\x80\x6d\x77\xe5\xfa\x32\x72\x42\xd0\x7f\x86\xbe\x6c\xb5\xae\xf7\xb6\xbb\x0b\xde\x86\x94\x78\x8a\xf3\x81\x87\xf2\xc4\xab\x8e\x14\x1a\x6f\x56\xaf\x2a\x01\xa1\x94\x4c\xa7\xa8\xb4\xa0\xb3\xdd\x69\x80\x2a\xa7\xbe\x05\x7d\x99\xc7\xd9\x42\x82\x72\x31\x0d\x9c\xa9\x77\x2e\x32\x21\x5f\x64\xf8\x42\x7f\x99\x92\xe9\xb7\x7c\xdf\x07\x28\xfc\xaa\x8e\xa8\x5b\x72\x29\x7f\xa8\xdc\x7c\x2e\x51\x1e\xd4\xd9\xeb\xde\xca\xfc\x77\x3e\x02\xd0\x3f\x85\xd4\x72\xe3\x01\x23\x10\xb0\x19\xca\x85\xbf\x92\x8f\x8e\x8f\x51\x40\x2e\x6f\x6f\x45\x2f\x39\xba\x61\x22\xf2\xa8\x54\x0a\x23\x00\x11\x00\xc2\xc4\xb0\xfb\x33\x00\x50\xa4\x53\x7a\x87\x6e\xd8\x00\x41\xe9\x4e\x36\x30\x07\x42\x9e\x2d\x38\x2f\xd3\xba\xec\xc7\x32\xad\x40\xd5\xea\x69\xc9\x66\x25\xb9\x6e\x9d\x59\x09\x35\xe6\xbb\x54\xe7\x14\xe8\xcc\xd8\x79\xe2\x8b\xdc\x18\x84\x43\x96\x18\xa2\x8d\x94\x2b\x94\xc4\xf4\xda\x19\x4a\x74\x65\xf8\x09\x7d\x50\x74\x7c\x19\xc7\x53\xca\x26\x13\xa0\x9a\x12\x46\xbe\x43\x51\xd2\xd5\x95\xa2\x5c\x75\x79\x9b\xc2\x10\x46\xde\xc9\x90\xcd\xad\xd6\xe2\xf4\xac\x6d\xed\xae\xaf\xd1\x8b\x4d\xa6\x4f\x41\x15\xd1\x45\x1e\xf7\x12\x72\x9d\xa7\x24\x4a\xbe\xc5\x29\x72\x11\xcf\xae\x87\x92\x95\x0b\xd5\x01\x0e\xa3\xeb\x08\xb3\xde\x4e\x27\x70\x15\xc6\x77\x0f\x26\x02\x23\x61\x47\xfc\x08\xdf\xde\x3e\xc2\x01\xb9\x04\xf2\x48\xe4\xe8\x5a\xc6\x6a\x96\x0c\xa1\x59\x5a\x4f\x0b\xea\xa2\x55\x1d\x25\x89\xf3\x4b\x38\x9f\x36\xcd\x9b\x73\x35\x73\x1c\x8c\x53\x32\xf6\x01\x2c\xb5\xc1\xee\x8f\x6f\x7f\x50\xb7\x4c\x0a\x2e\x3f\xbe\xfd\xc1\xcf\xb9\x3c\x93\x90\x58\xb0\x6f\xea\xab\x36\xb9\xf6\x22\x0f\x1c\xa5\xc1\xac\x44\x93\xb0\x84\x69\x20\x03\x80\x87\xde\x4f\xe3\x34\xca\x2f\x3d\x98\x06\x25\x4a\x43\x2f\x27\xa4\x40\x39\x2a\x7b\x39\x29\xd1\x04\x95\x25\xdf\x9f\x34\xd0\x93\xaf\x5f\x28\xa0\x19\x67\x4c\x92\x45\x10\x15\x05\xca\x93\x17\x33\x9c\x26\x3e\x17\xa7\x02\xe1\xaf\xe7\x03\xd1\x6f\x46\xae\x90\x0f\xa0\x35\xf3\x12\x5d\x91\x4b\x6b\xe6\xa5\x0e\x83\x8d\xd5\x11\x71\x2e\x1a\x06\x55\x55\xc1\xd7\xe1\x0b\xff\xa6\xe9\x95\x72\xa9\x42\x81\xdc\x8d\x3b\xde\x1b\x77\x00\xcd\xe1\xde\xd9\x08\x4e\xff\x8e\x40\x35\x2c\x36\xeb\xeb\xd7\xb4\x07\xf0\xc6\x56\xd3\x5f\xba\xab\x31\xac\xe9\xe1\x5e\x5a\xaf\xdc\xbe\x3b\xb8\xdb\xc3\xdd\xb4\x2e\xda\x2b\xb0\x19\xe4\xe1\xe4\x8e\xb7\xa3\x53\xf4\x1c\xce\x76\xdc\x94\xae\x5e\x9c\xad\xe9\x1c\xd7\x83\xc3\xe9\x5e\x43\x6d\xe8\xdd\x92\x5c\x87\x8b\x5d\x0f\x98\x69\xbb\x61\x0c\x2d\x99\x0e\xaf\xf6\x38\xc2\x5b\xac\xc1\x12\x83\x87\xd7\x7b\x0c\xa1\x1a\xaf\x1f\x45\xb2\x4d\x1e\x1c\x7e\xdc\x71\x04\xd5\x70\x7d\xef\x36\x65\xdf\xc9\x60\x7d\x75\x2f\xeb\x07\xd4\xb4\x7f\xff\xc1\x4c\x0f\x9b\x07\x7a\x27\x32\x30\x1d\x32\xd0\x3b\xc9\x50\xac\x3d\x06\x2e\xc7\xb4\xf7\x80\x1d\xbc\xd7\xba\x81\x6d\xc6\x64\xff\x41\x1b\xbd\x38\x03\x7e\x08\x6f\x00\xb8\xbd\xfd\x20\xfe\xb3\x5e\x25\x5e\x6e\xf1\x2a\x91\x62\x4e\xc2\x3f\x45\xf4\x29\xa3\xbf\x2e\xef\xe3\x23\x69\xba\x53\xd4\xab\xcd\xfa\xb0\x72\xa5\xf6\xaa\x5c\xf5\xf0\xe9\x86\xd2\xda\x18\x52\x74\x1a\xcd\xa7\xa8\x2f\x92\x52\xec\xfb\x40\x9e\xa0\xf1\x7c\xda\x7a\x5e\x12\xd1\xbf\xf3\xc8\x7a\x3a\xb7\x9c\x59\x93\xa7\x7d\x3a\x8b\x0a\xf4\x89\x62\x92\xea\x17\x26\x79\xac\xd6\x5b\x3a\xfe\xec\x4f\x33\x0f\x46\x8b\x9f\xc5\xd3\xcc\x22\xf4\x85\xe1\x20\x6d\x3e\xcd\xa8\x9b\xe6\xd9\xf7\x4e\x59\x0d\x36\xec\x28\xe4\xce\x40\x8f\x17\x69\x0f\x37\x8f\x11\x16\xa5\x5e\x97\xd1\xa0\x8c\x92\xaf\xde\x6a\x1a\x5f\xca\x28\xc1\x73\x7e\x09\xaf\x95\x2f\x9f\x7c\xaa\x59\x5b\x07\x7a\x05\x2a\x63\xc9\xe3\xcf\x85\x09\xe1\x64\x53\xb8\xdd\xc8\x0a\xb7\xbb\x19\xb3\x69\xdb\x3d\xb5\x4a\x09\x79\x5d\x68\x2f\xb9\xf9\x45\xae\xdf\xad\xce\x61\xf8\x82\xcf\x4e\xc4\xb0\xea\xe3\x7c\x42\xbc\xfa\xb3\xca\x73\x70\x5a\x97\xe8\xdc\x06\x56\x91\x5e\xf7\x97\xca\x74\x44\xae\xbe\xe9\x82\xf8\x48\x69\x65\xcd\xec\xa4\x62\x40\x2c\xe1\xc4\xaf\xff\x7e\xec\x54\x53\x3a\x18\x59\x4f\xe9\x00\x58\x94\x6a\xd5\x62\xfa\x7d\x62\xc6\x79\x6f\x9d\x8a\x3e\xff\xd6\xff\x62\x29\x5e\x6c\xa6\x73\x9c\x7c\x4b\x4a\x19\x5e\x06\x28\xbd\x64\x16\xd1\xcb\x55\x8d\xf9\xb7\xb5\x8d\xe5\x96\x3b\xa6\x89\x02\x56\x27\x4f\xa4\x27\x47\x14\x5f\x4e\x4b\x32\xcf\x93\xe7\x65\xac\x95\x23\x4b\xd9\x6c\x80\xa0\x84\xd8\x80\x55\x02\x2a\x47\xad\x34\x56\x11\x6f\x14\x88\x00\x36\x6f\xe5\x50\x08\x04\x22\xa5\x9d\xfe\xd9\x67\x20\x88\x49\x59\x97\x30\x20\xb5\xfd\xcf\xf3\x69\x8a\xfc\xbe\xf0\x65\x7d\xf3\xfd\xc9\x13\x10\xa0\x3c\x91\x85\x75\x99\x4a\xfc\x24\xa0\xba\x76\x82\x50\x6d\xe6\x00\xff\xbc\x53\xad\x0b\x1f\xab\xbf\x7e\x8f\xf9\xac\xf7\x8c\x45\x2d\x15\x5f\x32\x12\xfa\x4b\x9c\xa1\x9c\xca\x50\x52\x55\xbb\x68\xb9\xd9\x57\xdd\x17\x99\x40\x80\x52\x61\x89\xc4\x14\x47\x5a\x57\xa6\x30\x1e\x46\xd4\x5f\x8a\x03\x31\x40\x50\x79\x27\xa3\x93\x27\x55\x77\x44\x6a\x15\x3c\x96\xe4\x31\x92\xe7\xac\x7b\xbe\xc0\xb1\x13\xd5\x68\x46\xd8\x28\x6e\xe2\x6d\x27\x5d\x2d\x01\x9c\x34\xad\x37\x27\x8e\x28\x96\x7e\x9f\x08\x85\x8a\x46\x77\x3b\x8e\xa3\x7a\x58\x3f\x8c\xbc\x89\x87\x0c\xa3\x7a\x58\x3f\x8c\x46\xd3\xdb\xd8\x59\x76\x35\x5c\xdf\x7b\xe3\xc2\x6f\xa7\x1c\x5a\xd3\x7e\xfd\x58\xfa\xda\x4a\xdd\xd0\x4e\xc3\x98\xa6\xce\x08\xe3\x70\xc2\x05\x9a\xf1\x4e\x56\xa2\xd3\x94\x8c\xa3\x54\x24\x21\xda\xde\x35\xc7\xb5\xb9\xda\x9a\x31\xb5\xdc\xa8\x3b\xc3\xb2\xdc\x07\x83\xa6\xf9\x03\xf7\xfa\x39\x70\xaf\xca\x8d\x65\xbd\x99\x50\xf3\xf6\xec\xe3\xc0\xdf\xe9\x68\x42\x0d\x1f\xc8\x77\xdb\x83\x44\x19\x26\x50\xc7\x0e\x24\x52\xe5\x38\x7c\x74\x2a\xdc\x52\x56\xce\xec\x53\x3b\xaa\x54\x24\xff\x2e\xca\xc6\xf3\x72\x8a\xca\x17\xf2\x25\x62\x59\x55\x90\x84\x73\x3f\x6d\xe8\x4f\xd5\x8a\xee\x4c\xbf\x1f\xb9\x23\xdc\xf9\x0b\x82\xf1\x52\xdf\xc1\x70\x55\x41\x9f\xa2\xa8\x8c\x67\x27\x31\xc9\x59\x49\x36\xa7\x2b\x59\x1f\xa4\x42\x7e\x8c\x49\x2e\x63\x01\xc6\x8b\x6d\xb2\x4b\x38\x7a\x87\xdd\xa2\x70\xd7\x08\x7a\x72\x9f\x10\xf4\xec\x01\x41\x7f\x0e\x08\x7a\xaa\x22\x5f\xe3\xa6\x7a\xa1\x71\xf5\xec\x84\x39\xda\xc7\x71\x3d\x46\x57\xed\x54\x3c\x7d\xe3\xfa\xc8\x22\x7a\x09\xea\x4d\xf8\xbd\x8f\xea\x10\xbb\x0b\x8c\xd2\xa4\xb7\xf6\x6d\xdb\x3b\xb9\x3a\x3b\x51\xd8\x60\x32\xff\xf8\x71\xe1\xc1\x65\x86\xd8\x8c\x24\x03\xef\xcd\xeb\x8b\x77\x1e\x1c\x93\x64\x31\xf8\xfb\xc5\xeb\x7f\x04\x94\x95\x38\x9f\xe2\xc9\xc2\x5f\x2a\x73\x89\x17\x32\xbd\xae\x70\x93\xf3\xa0\x58\x68\x11\xc5\x68\xe0\xfd\xde\xab\x40\xc5\xd1\xbf\x9a\x42\xf0\x81\x92\xdc\x07\x30\x0f\x71\xf0\x4a\xa6\xec\x0e\x3e\x90\x31\xbd\xbd\x1d\x8e\x84\x5b\x9b\x2e\xcc\x49\x82\x64\x69\x6a\x95\x0a\x2d\xab\x2c\x26\x56\xb1\x08\xf8\x2b\x8b\x23\xab\xb8\x48\xe7\x53\x9c\xcb\x72\x1a\xe6\xea\xe8\x9e\xc2\xb3\xd3\x3a\x61\xb1\x48\x7d\xfd\xfd\xcb\x01\x83\x17\x31\x29\xd0\x60\x88\x61\x3e\xaa\x42\x9d\x95\x78\xc9\x51\xf6\xc0\xfb\x40\xc6\x1e\xc4\xc9\x20\x17\x61\xc5\xe5\xda\x30\x4c\xa3\x31\x4a\x07\xef\xbf\x58\xe2\xaa\xf7\x55\x4f\x79\x93\x00\xbe\x23\xe5\x96\x63\xb5\x47\xca\xc5\xa3\x1c\x4e\x4c\xf7\x4c\x74\x19\x87\xe9\x01\xd3\xb7\x95\xd3\x62\x15\xab\x66\x9e\x84\xe4\x80\x61\xac\xf8\xce\x7c\x18\xd6\x00\xd6\x07\x32\xfe\xbe\x6b\xe8\xbc\x39\x83\x22\x8c\xd6\xcf\xa0\x35\xaa\xdc\x65\x35\xa2\x0d\xb3\x25\x3f\x58\x83\x4c\xd8\xed\xd2\xc1\x58\x26\x2d\xa1\x83\x09\x94\xc7\x65\x30\x83\xea\x80\x0c\xa6\x55\x88\x83\x77\xe5\x3c\x57\x41\x63\xd5\x00\xc3\xa5\xa8\x29\x12\x91\x2d\x7c\xef\xef\x64\x4c\x3d\x48\x61\x0e\x33\x00\x49\x21\x6a\x0e\x68\x05\x9b\xb5\x5e\x08\x71\x9d\x7a\x70\x0e\x4b\x38\xae\x2b\xce\xdd\x8a\x8d\x60\xb7\x31\x4c\xe1\xa4\xae\x1c\xbb\x95\xdf\x45\xf4\xb2\xa7\x83\x9d\x26\x90\xc0\x59\x5d\x39\x69\x4d\xe1\xe2\xfb\xde\x1b\xb9\x34\x0f\x16\x30\x82\xd3\xba\x72\x51\x09\x9a\x11\xf9\x71\x48\x7d\x3f\xb9\x13\x66\x70\xe2\x84\x51\x2f\x14\xd3\x37\x69\xda\x0a\x67\x86\x17\x34\x4e\xca\x12\xe1\x5c\x08\x7c\xf2\x33\xf8\x2a\x4f\x8c\x09\x2f\x1f\xb6\x76\x53\xe6\xff\x3f\x5c\x89\x62\x47\xe1\xa3\xd3\xea\x12\x2d\x5e\x92\xeb\xdc\xca\xee\x55\xc7\x2f\x97\x86\x33\x02\x65\xf1\x2d\x08\x18\xf9\x81\x5c\xa3\xf2\x45\xc4\xc9\xe3\x91\x87\xf3\x62\xce\xbc\x47\x21\x3b\x3e\x16\x56\xb3\x51\x89\x22\xf5\xf3\x44\x86\x0c\xbf\x44\x8b\xe3\x63\x5f\xe6\x8b\x47\x39\x7b\x29\xf7\x40\x67\x0b\x93\x99\x7f\xf6\xd7\x4a\xc9\xa0\xfa\x48\x05\xbe\x86\xde\x4f\xcd\xb5\x78\x72\x94\x66\x61\x30\xc6\xb9\x8c\x1f\xc3\xb1\x82\xb6\xeb\x89\x92\xe4\x1b\x3e\xc1\x1f\x30\x65\x28\x47\xa5\xef\x5d\xa2\x45\x22\x2c\x3b\x44\x1f\x4e\xcf\xa0\xba\xc6\x69\xfa\x12\x51\x56\x92\x85\x3b\xe9\x8e\x4f\x4e\x5c\x1c\x3d\xaa\xb4\x16\xda\x6d\x60\x62\xc5\x0d\xa7\x42\xa1\xa6\x72\xac\xc9\x1f\xea\xad\x56\xc3\xb6\x42\x39\x9d\x97\xe8\x15\xce\x71\x36\xcf\x7e\x10\x41\x66\xf8\x16\x3b\x41\x68\xbe\x3a\xab\x64\xf3\xd7\x85\x66\xc4\x04\x65\x10\x7b\xc8\x91\x91\xd4\x36\xab\x70\xf8\xac\x8c\x72\x99\x72\xf7\x1d\xf1\x79\x3d\x41\xe9\x3c\x88\x02\x9c\xc0\xa5\x50\xf5\x49\x0b\x84\xc1\xb2\xc6\x93\xd2\x20\x55\xfc\x5d\x55\x40\x91\x83\x6d\xfa\x97\x5a\x42\x6d\xf0\x26\x47\x01\x0d\x94\xbc\xcb\x2c\x03\x1b\x95\xa3\x40\xe0\xee\xdd\x26\xae\xb0\xf2\x56\x53\xa7\x58\x93\xea\x40\x23\x73\x35\x7d\x8b\x70\x99\x9e\xd4\x46\x76\x76\xd5\x88\xce\x6f\x11\x3d\xd1\x5d\x45\x19\x29\x91\x54\xaf\xf2\xbd\x43\xc7\xc7\xbe\x75\x26\x42\x24\x8f\xcd\x6b\x99\xd5\xf3\x75\xf9\x2e\x1a\x4b\x27\x47\x4e\x7a\xe4\x1d\x17\x0a\x6a\x63\x88\xa7\xf8\x3a\x7e\x28\x61\x19\xe6\x81\x62\xe5\xa8\xaf\x24\xa1\x82\x63\x81\xbe\xec\xbd\xcf\x4a\xac\x0c\x42\xd2\xf0\xd1\x76\x75\xfb\xfd\x48\x25\xfb\x38\x2a\x8f\x8f\xd3\xe3\x63\x15\x90\x7e\x4c\xe6\x8e\x0e\x97\xcf\x1b\x9e\x3d\x3b\x05\x15\xc9\x5f\xa4\x84\xca\xdb\x22\x67\xef\x7d\x43\xe3\xa8\x10\xa7\x88\x29\x4c\xc3\xbb\xb1\x03\xaa\xae\x53\x42\x07\xeb\xd6\x12\x8c\xd3\x79\xe9\x83\x0a\x80\x2a\x8e\xd2\x78\x9e\x46\x0c\xbd\x51\x89\xa6\x0d\x8e\x5c\x32\x52\x70\xd2\x8c\x26\x6c\x80\xa1\x54\x57\xe7\x55\x88\x82\x29\x62\x5f\x93\xb9\x60\x71\x25\xd5\x7c\xcb\x77\x46\x9b\xe9\x2f\x45\xec\xcb\xc1\xb2\xd9\x0e\x8a\xce\xaa\xaa\xaa\x60\x11\xce\xfc\xa4\x33\x16\x7f\x7a\x47\x82\x75\xe6\x8e\xa0\xad\x0b\xef\x6a\x80\xb1\x3b\x80\xa6\x4c\x87\x47\x1a\x70\x3a\x56\x19\xd2\xb6\xb7\x52\x69\xb7\x06\x30\xb1\x95\xb9\xce\x00\x1d\x28\x74\xff\xf1\xba\x3a\x5b\x3f\xbc\x8d\x98\xf7\x1f\xb7\xd1\xcb\x86\x01\x6b\x64\x72\xc0\x78\x56\x27\xeb\x87\x73\x31\xd3\x61\x7b\xd9\xe8\x69\xc3\xc0\x16\x42\x39\x60\x50\xbb\x17\x67\xc0\x38\x4c\x00\xb8\xbd\x8d\xc5\x7f\xb5\x46\x67\x51\x6b\x74\x44\xba\xba\xa3\x32\xd4\x21\x79\xff\x8a\xd5\x1f\xe7\xef\xe9\x8c\x5c\xe3\x7c\xca\x25\x08\x55\x56\xf5\xc8\xa4\xf7\xc5\x52\x57\xa9\xde\x0f\xf4\x17\xed\xff\xf3\xc5\x12\x55\x3d\xff\x8b\x65\x59\x7d\xb1\xcc\xcf\xbd\xc7\xde\xc0\xf3\x2a\xf0\xbe\xaa\x85\xf8\xe9\x46\xf5\xd9\x9c\x31\x54\xf6\x33\x94\xcf\x3b\x95\x66\x3b\xf8\x7c\x3f\x3c\x42\x3c\xe8\xb8\xee\xaf\x8e\x2b\x0e\xfd\xb2\x95\x36\x4c\x79\xb1\x19\x8e\xb0\x91\x00\x8c\xcf\xa1\x29\x75\xe2\x1d\xec\xed\xdc\x07\x06\xf7\xe1\x41\xf3\x00\x91\x15\x6a\x4a\x86\xb0\x31\x5a\xa9\xda\xa2\xc2\x0a\x1c\xd2\x9a\xb2\x07\xea\xc4\x4a\xb7\xb7\xc3\x11\x10\xb1\x95\xea\x70\xe2\xda\x8f\x04\xc9\xf6\x6a\x69\x79\xc8\xec\xdf\xea\xbc\x7b\x6a\x7d\x9c\x07\xc3\xe7\xfd\xb3\x81\x5d\x90\x9f\x9f\x0d\xf0\x5f\x73\x5e\x8c\xbf\xe2\x3f\x4e\x39\x3b\xd5\xf5\x5a\x31\x25\x8c\xfc\x9d\x8c\xe9\xb7\xa4\x34\x8b\xe1\x37\x05\x4f\xfc\x47\xe8\xf6\xf6\x91\x9a\x0a\x4e\x3c\xd0\xf4\x19\x61\x2b\xf3\x74\x09\x79\xd5\xf6\xdf\xe4\xcc\xb8\x07\xce\xc5\xbf\x57\x24\x9d\x67\x88\x7a\x42\xff\x45\xbd\xa3\x95\x7c\x37\x5b\x23\x16\x98\x29\x55\x22\x80\x72\xeb\xbd\xc5\xbc\x86\xb0\x4f\xf5\xde\x62\xd8\xc2\xbb\x1a\xc1\x5d\x81\x73\xbc\x38\x95\xdc\x4c\x1e\xd7\x77\xc1\x31\x9e\x45\x22\x53\xb0\xcb\xdb\xce\x4c\x9f\x9c\xd5\xf4\xe9\xf3\xc8\x41\x2b\x1c\x97\xfb\xed\x00\x2d\x5b\xdb\xcd\xee\x67\x36\xd0\x99\xb2\xfc\x7e\x99\x49\x27\x06\xad\xd7\x7b\x23\x46\x97\xf8\x5b\x22\x7c\xfb\x51\xc3\x02\xb5\x0a\x39\xb5\xe9\x65\xba\xd1\xa2\x1d\x02\x92\x0a\xf3\x91\xd2\xa7\x61\xea\xd3\x90\xf8\xfe\xfc\x00\x2b\xed\xb8\x15\x86\xc0\x3e\x1a\x9c\xec\xeb\x1a\x7c\x58\x65\xbc\x18\x1b\xd3\x6e\xe6\x16\x51\x11\xbc\xa1\x59\x56\x1b\x31\xc6\x2d\x23\x46\xe3\xa3\xcc\xc1\x65\x45\x28\xa4\x65\xdc\x08\x4a\x48\xcb\xd8\xca\x97\x78\xe2\x81\x73\x53\x9c\x09\x67\xb8\x93\xff\x1d\xfc\xfe\x9f\x27\x7e\xf0\x7b\xf0\xc5\x09\x18\x9e\x8d\x06\xfa\xbb\xb2\x31\xfb\x9e\x2f\xeb\x15\x62\x51\x97\x86\x72\x8d\xf9\x18\x0b\xf2\x88\xcd\xcb\x28\x15\x76\x66\xda\x96\xcc\x94\xca\xec\x13\x02\x81\x17\xe1\xdc\xc2\x5c\x59\xe8\xe9\x65\x79\x70\x1c\x0e\xa3\x11\x9c\x6c\x8c\x94\x35\x77\x3d\x71\x54\x0c\xb2\x59\xa3\xeb\xa9\x1b\x26\x6b\xb2\x82\x51\x9c\x72\x46\x71\xa2\x18\xc5\x69\x93\x51\xb4\x7f\xc2\xa9\xcb\x28\x4e\x57\x32\x8a\xd3\xdb\xdb\xa9\xcb\x28\x4e\x9b\x8c\xe2\x34\x1c\xef\x1e\x26\xab\x80\x99\x09\x93\x35\x05\x70\x66\x31\x8a\x53\x87\x8d\x9b\x2a\x46\xb1\x51\x7e\x3e\x6d\x33\x8a\x33\xc3\x28\x4e\xd7\x33\x8a\xee\x08\xdd\xa8\x82\x4f\x71\xca\x97\x27\x8f\x37\x0d\xe7\x5c\x3a\xa3\xe6\x3f\x11\x2e\xcb\x8a\x05\xb5\x4b\x86\x74\x7c\xb5\xe8\xc7\x24\x41\x19\x2e\x4b\xe2\x18\x73\x35\xbf\xad\x69\xe5\xa0\x5f\xb0\xdc\x19\xe5\xad\x6c\xa0\xd9\xb2\x86\x08\xf5\xe8\x14\x4e\x11\xeb\x48\x7a\x62\x30\x10\x67\x6d\x36\xac\xfc\x03\x19\xf7\xa5\x6e\xb6\x4f\x45\x6a\xd0\xfe\x38\xea\xb6\x66\x33\x24\xa8\xab\x9b\x04\x53\x89\x53\x31\xc9\x65\x0f\x77\x6b\xe0\x76\xbf\xa8\xd4\xdc\x50\xa9\xf5\xa4\xa6\x1b\xf8\x8a\x90\x31\x9b\xea\xe8\x94\xb2\x82\x0d\xf3\x20\xff\xfd\xc2\xca\xe7\x1a\x8c\x17\x26\x37\x74\xe9\xfb\xd1\x1d\x08\x32\x69\xb4\x20\x73\x26\x11\xa8\xb7\x6e\xa7\xeb\x26\x9b\x16\x26\x08\x9a\xae\x2c\xde\x1c\xd4\x55\xae\x8b\xec\x45\xd9\x01\x19\x79\xd7\xc6\x4e\xfb\x5f\x73\x34\x47\xc9\x00\x41\x21\x20\xe0\x7c\x3a\x60\xb0\x94\x59\x0c\x07\x18\x4a\xeb\x79\x86\x06\x39\x4c\xd0\xb4\x8c\x12\x94\x0c\x4a\x38\x89\x70\x8a\x92\x41\x0a\x53\x42\xd9\x80\xc0\x9c\xb0\x8b\x78\x86\xf8\x86\x26\x83\x08\xaa\x08\x30\x03\x2a\x0d\xbd\x83\x55\xf0\x35\x2f\xb0\xf2\x41\xd7\xfb\x7f\xc4\x54\x3c\xa5\x91\xd0\x0f\x32\xd0\xb0\x20\x03\xef\x5f\xaa\x46\x8a\xa6\x28\x4f\x7e\xc0\xf9\xe5\xa0\x29\x94\x48\x00\xb9\x16\x0c\x43\xdd\x70\x04\xac\xe7\x6a\x3d\xb7\xfa\x2c\xd8\x72\x4c\x05\xf5\xb4\x2e\x14\x60\xf4\xc4\x58\xc7\xc4\xa8\xa9\xb3\xf3\xd4\x4c\xd3\x1d\x26\x07\xd3\x68\x81\x4a\x3a\x78\x52\xcf\x52\x65\x9e\xf4\x8c\x3e\xa7\x3d\xc9\x52\x57\xd9\x79\x8e\xba\xe5\x5e\xf0\x7b\xa1\xce\x90\x9e\x5a\xde\x31\xb5\xd8\xd4\xd9\x79\x6e\xa6\xe9\x5e\x93\x33\x5e\xeb\x72\x6e\xb4\x63\x6e\x3a\xa0\xd1\xee\x53\xd3\x2d\x77\xd9\xd9\x19\x4a\x8b\x81\x77\x41\x32\x64\x45\xcf\xa6\xbd\x09\x29\x05\xf7\xd8\xfb\x40\xc6\xbd\x6b\x54\xa2\x9e\xbe\x8f\x3d\x52\xf6\xf8\x3d\xec\xc5\x2a\xe2\xc8\x15\x66\x8b\xc0\xab\x97\xf8\x52\x55\xd4\x6b\x2c\x3b\xd6\x98\x98\x3a\x3b\x2f\xd2\x34\xfd\x24\xab\xcc\x09\xeb\xd1\x79\x1c\x23\x4a\x27\xf3\x34\xe5\x8b\x4d\x70\x22\x8a\xcb\x79\x6e\x2f\xf3\x5b\x81\x94\xf4\x22\xd3\x8e\x45\x4e\x54\x8d\x9d\x97\xa8\x1a\xee\x75\xc0\x7e\x20\x94\xe9\x49\x91\x8e\x49\xa5\xe2\xfb\xce\x53\x12\xcd\xf6\x9a\xd0\x3f\x08\xeb\x19\x6c\xad\x67\x16\x75\xcc\x2c\x27\xac\x4f\xeb\x8a\x3b\x4f\xd1\xa6\x0a\x7b\x1c\x8e\x7f\x90\x0d\x47\xc3\xcc\xad\x87\x73\x46\x7a\x6c\x86\x28\xea\xe9\x27\x72\xaf\x1a\x55\x15\x8c\xc3\xc8\x12\x36\x12\x69\x99\xec\xc1\x22\x1c\xa6\x23\x98\x6d\x94\x61\xa2\x86\x13\x37\x6f\x0a\xe0\xb8\xd1\xe5\xc4\x95\x5f\xb2\x15\xf2\x0b\x17\x5d\xc2\x4c\xc9\x2f\x93\xa6\xfc\x62\xff\x84\x13\x57\x7e\x99\xac\x94\x5f\x26\xb7\xb7\x13\x57\x7e\x99\x34\xe5\x97\x49\x58\xec\x2e\xbf\xc4\x30\x31\xf2\xcb\x04\xc0\xb1\x25\xbf\x4c\x1c\xe9\x62\xa2\xe4\x97\x46\xf9\xf9\xa4\x2d\xbf\x8c\x8d\xfc\x32\x59\x2f\xbf\xb8\x23\x74\x33\x91\x7c\x8a\x13\xbe\x3c\x9d\xc6\x2b\xe2\xf2\x0b\x91\x72\x8b\xed\x65\xbc\x43\x3a\xbf\x36\x9f\x55\x8a\x0c\x83\x6b\xb8\xf7\x8e\x2c\xc2\x1d\xca\x34\xc3\x7f\x2b\x40\xf3\x39\xe2\xd0\x3e\x35\x48\x04\x05\xea\x3c\x8e\x17\x8b\x6c\x4c\x52\xe5\x41\x9d\x77\x1f\x59\x55\x87\x77\xc3\x8e\x8f\xfd\x3c\xcc\x4d\xe6\x7d\x33\x97\x7a\x83\x37\x9d\x7a\x3e\x47\xeb\x44\x56\x00\x00\x88\x45\x26\xa7\x20\x2a\x8a\x74\x21\x9e\x45\x2a\xd5\x19\xae\xee\x6f\xa8\x00\xc9\xd7\xa7\x1d\x9c\x3d\xc9\x6b\x7d\x3c\x62\xbd\x52\xa4\xa8\xb5\x75\x38\x22\x27\x6b\x49\xae\xad\x0c\x13\x32\xfc\xdf\x4b\x4c\x8b\x34\x5a\xd4\x76\x7f\x17\xf3\x2c\x8b\x44\xe4\x73\xf5\x4c\xd0\x40\x8b\x8f\xec\x24\xb4\xa6\x3f\x8e\x1b\x25\x8b\xec\x64\xd1\x50\x9d\xbd\x49\xa3\x18\xcd\x48\x9a\x08\x87\x3f\x3b\x88\xdd\xaa\x7e\x54\x60\xbb\xc6\xd8\x2a\x82\x9c\x43\x10\x9c\xf8\x72\x9e\x27\x23\xcb\xcd\xe6\x59\x94\xe3\x8f\x28\xf9\xbb\xee\xf2\x0e\x46\x16\xc4\x7d\xd5\xc8\x5d\x80\xb6\x00\x23\x66\x65\x7e\x0a\xb7\xe3\xbb\x99\x51\xff\xa0\x19\xd5\x7b\xf5\x42\xdb\x7c\x5b\x8e\xa0\x4a\xda\x7a\x2e\x8d\x54\x4f\x8d\x78\x65\x0a\x24\xa7\x61\x7e\x2a\xbe\xdb\xfc\xd6\xb2\x82\x29\xe0\x6c\x80\xf9\xa1\xd8\x4d\xfd\xbb\x3a\xda\x0f\x1a\xde\x60\x5c\xa2\xe8\x52\xc6\x27\x54\x82\xd3\x00\x05\xf6\xd4\x3b\x0f\xad\x6d\x97\xa5\xde\xe2\xad\x8e\x8c\x98\xa3\x43\x8c\x9a\x65\xec\xd6\x99\xde\x92\x09\x29\x7d\xa5\xfb\xec\x91\x49\xe7\xd6\x58\x7d\x00\x0d\x0a\x65\x3b\xd7\x58\xbb\x96\x6e\x06\x28\x68\x00\xfc\xf1\x63\x7b\x01\x82\xe3\xe2\x52\xa9\x01\x79\xf3\xbb\x62\x12\x07\x28\xb0\x37\xb1\x59\xc7\xc8\x2a\x03\x14\x34\xf7\xbe\x59\x6f\x35\xb0\x9a\xf5\xb4\x80\x31\x40\x41\x63\xf3\x1f\x3f\xae\x2a\x57\x7f\xa5\x03\x04\x34\xb8\x12\x52\xfa\x9c\xae\xb0\xf0\xec\x2f\xec\xaf\x46\x71\xa1\x20\xfe\x17\xf6\xf8\xb1\xa6\x56\xd2\xf1\xde\xd4\x18\xb2\xd1\xb9\xfd\x63\xb0\xac\x8e\xd8\xef\x9e\x9c\xe7\x8a\x88\xf9\x18\xc0\x47\xa7\x5d\xbc\x10\xa7\x43\x92\x50\x0c\xd9\x08\x54\x00\x0c\x36\xd0\x23\xda\x49\x41\x30\xa2\x3e\xda\xf4\xfe\x46\x7d\x0c\xc0\xc0\x9a\xd3\x8a\x09\xad\x26\x51\x9b\x68\x25\x86\x0c\x08\xcb\x38\x6d\x45\x5a\xf9\xcb\x0a\x22\x00\x74\x28\x4c\x50\x55\x3b\x04\x81\xe1\x2c\x48\x82\x8a\x94\x2c\x54\x2a\xe5\x87\xd0\x3e\xdd\xa1\x7d\x1a\xcf\x52\x2e\xd4\x9c\xb0\xeb\x77\x13\xfb\xc7\x1e\xa0\x19\xfb\x07\xd3\xd7\xc2\xee\xee\xd1\xd9\x1e\x61\x7f\x9a\x73\x3f\xa9\xff\xec\x67\x88\x95\x38\xde\x36\x97\xec\x6f\xf1\x65\xb7\x09\x1b\xda\xa7\x3a\x84\xda\x6e\xaf\xbc\x12\x3e\xe4\x0a\x95\x25\x4e\xf8\xc1\xec\x5b\x19\x37\x32\x92\xed\x01\x46\xe9\xaf\x28\x81\xe9\x64\x71\xac\xef\xd7\xf8\xc1\x38\xea\x73\x30\x8e\x9a\x84\x3e\x91\xe9\x12\xea\x7b\x40\x52\xfd\xdc\x9d\x36\x51\x15\xc3\x19\x4a\x71\x8e\xb4\x1f\xa0\x6d\x51\x25\xcc\xb4\x87\x23\xa0\xbc\xfd\x9a\xb9\x08\xeb\x6b\xa0\xcc\xac\xf8\xbe\x08\x89\x60\x9c\x61\x11\xfb\xb6\x33\x7a\x91\x4a\xec\xb5\xaa\xb5\x07\x20\xf1\x93\x30\xf2\xfd\xe2\xce\x53\xbe\x5b\x53\xb6\x13\xbf\x67\xbf\xda\xc4\xef\x56\xc6\xbf\x7a\xea\x8e\xdc\x67\xef\x83\x4a\xd5\xe7\x75\xec\x44\x7d\x6f\xa4\x50\x90\xe7\x84\x45\xad\x8e\x5b\x59\x04\x1b\x15\xea\x80\xfd\xc2\x3d\xce\x57\x99\x98\xb5\x5f\xc2\xb2\x3a\xc2\x13\x9f\x9f\x7e\x0c\xf2\x80\xce\xc8\xf5\xcb\x88\xf1\x0b\x7c\x84\x52\x8a\x54\xb5\x34\x44\x81\xc4\x83\xcf\x99\x8f\xfb\x67\x40\xea\xd9\xd4\x8c\x03\x6a\x1f\x1e\xa2\xad\xda\xec\xd2\x23\xa2\x7d\x12\xca\x3a\xf4\x71\xaa\x82\xee\xbc\x9e\xf8\x5e\x12\x2d\x3c\x10\x24\x78\x32\xf1\x9b\x95\x88\x5b\x09\xf2\x7f\xa8\x07\xbe\x3a\x3d\x3e\xf6\x1b\x33\xd6\xdc\xd3\xb2\x86\xee\x80\xc1\x0c\xb1\x68\x90\x57\x9c\xb9\xaa\x60\x16\x8e\xfd\xa2\xa1\x8d\xb3\x4f\xd7\x90\x1e\x6c\xa3\xdf\xec\xbd\xb5\x19\xd2\x58\x7f\x13\x37\xb8\xa1\x0f\x00\x8b\x46\xa0\x94\x66\xfd\xae\x43\xb2\x5d\x3c\x9e\xcd\xdd\x38\x23\x27\x61\x01\xc0\xed\x6d\x22\xfe\xb3\x28\xf2\x64\x2b\x8a\x8c\x27\x93\xfe\x04\xa3\x34\xa1\xfd\x28\x4f\xfa\xf2\x7c\xfd\xc6\xf9\x94\xa3\x6d\xa0\xb2\x46\x57\xd8\xce\x17\xbd\x3f\x6c\x3a\x0c\xd1\xd6\x30\x1f\xf7\xc1\x8c\x7c\xf2\x0b\x45\x80\x7c\x08\xd1\xf0\x59\x70\x68\xd3\xda\x7c\xbd\x25\x36\xf2\x6b\xdb\x36\x76\xb4\x0c\x4c\x30\xfd\x26\xc1\x0c\x25\x03\x4c\xfb\x48\xfc\x25\xa2\x1b\x3e\x4f\x12\x59\x16\x25\x89\x2a\x7a\x89\x52\xa4\x2a\x26\xf2\x4f\x6d\x25\xc9\x4c\x26\x2d\x3e\x5e\x20\x32\x75\x41\x4f\xf6\xab\x19\xc5\xee\x3a\x62\x18\xcd\x2c\x76\x57\x79\x69\xc6\x2a\xfd\x79\x98\xfa\x7e\x7c\x80\xc1\xca\xc4\x24\x7a\xe6\xe8\x4c\x6e\x83\x2e\xbb\x42\xe5\x98\x50\x65\x4a\x39\x36\xc2\xaf\x5a\x06\x4c\x94\x91\x7e\xfd\x45\x4e\xde\x78\x8a\xd7\x1f\xf4\x94\xb5\xb7\xb8\x48\xcf\x39\xf3\xe3\x66\xc8\x77\xdd\xf1\x90\x1c\x4a\xdd\x8b\x76\xe7\x6a\x6e\xc3\xe8\x2e\xdc\x07\x9d\xbe\xcd\xf2\x0e\xe7\x4b\xe6\x61\xcc\x29\xf5\x5c\xfc\x77\xb4\x83\xef\x92\x3c\xdc\xb4\x88\x98\xf0\x34\xb4\xe9\x52\xfb\xcd\xca\x2a\x64\x65\x14\x5f\xca\x14\xe6\xab\xbc\x9c\xdc\x30\x3f\x51\x59\x46\x8b\x15\x91\x81\x72\xd2\x17\x8a\x4a\xe8\x31\xcc\xb8\xe4\x2d\x7f\x38\x39\x2c\x33\x44\xa9\xb0\xd4\x2d\x49\xd6\x8f\x92\xa8\x60\xa8\xec\xa3\x2e\x3b\xc0\xad\x13\x57\xd6\x94\xf0\xfa\x3e\x51\xc2\x8f\xbf\x10\x25\xfc\xf0\x40\x09\x3f\x07\x4a\x78\x13\xfa\x49\xf8\xc1\x90\x88\x06\x41\x40\x60\x79\xdd\x8c\x06\xac\x31\xba\x2e\x96\x37\xd2\xe0\xf3\x8f\x3a\xc3\x9e\x30\x6b\xd4\x0b\xd5\xa5\x25\xfa\xd7\x1c\x97\xc2\xc2\xc4\xf9\x22\x30\x41\x5d\x2c\xf3\xbe\x44\x19\x0a\x65\x78\x01\x59\xa0\x9b\x87\xc8\xfc\xa9\xd2\x1e\xf1\xd6\x21\x92\xff\xc2\x3a\xa2\x6f\x88\xe4\xbf\xb2\x48\x4c\x35\x44\xf2\xdf\xea\x2a\x4a\x71\x22\xb4\xf1\x4b\xeb\xab\xe7\x35\x87\x3a\x3e\x7e\x54\x77\xa7\xc3\x06\xc8\xaa\xef\x5f\x61\x4a\x71\x3e\xed\xe9\xba\x3d\x2e\x9d\xf6\x44\x02\x29\xc4\x50\xd9\xf3\x54\x5e\x31\x91\x69\xcc\x0b\xde\xbb\xf1\x55\x15\x44\x87\x38\x10\x08\x16\x25\x87\x93\xb4\x0f\x4d\xb2\xa3\x36\xe7\xee\x46\x88\x01\x7c\x1d\xfa\x22\x46\x35\x51\x81\xa7\x96\x49\x49\x0a\x79\xbc\xc6\x07\xa8\xd4\xaf\x1d\x37\xbe\x89\x73\xce\x74\x74\xbe\x99\x53\xce\x61\xfe\xad\x10\x3c\x3d\x38\x75\xbe\x15\xd1\x22\x25\x51\xe2\xc1\x45\xf7\x87\xef\x22\xfa\x8d\x84\xd0\x95\x73\x7c\x05\xe0\xa8\x07\x85\xb2\xee\x39\xf0\x87\x23\x00\x8e\xb4\x6a\x46\x39\x02\x22\x13\xa2\x28\x47\xd7\xbd\x1b\x5f\x38\xbf\x0d\x10\xd4\xc7\x61\xc0\xa0\x38\x8f\x03\x11\x67\x5c\xfc\xf9\x22\xa2\x08\xf8\xfe\x29\x8c\x82\x9c\xc8\x1f\x08\x00\x6d\x42\x6a\x5e\x2b\x3f\x90\x71\xc0\xd7\x75\xde\x2e\x12\xda\x18\x04\x84\xdf\x32\x10\x49\xd1\xfd\x66\x25\x73\xfc\xf0\x47\x2e\xee\xb3\x08\xa7\x34\x78\x85\x58\xf4\x56\x4d\x4b\x04\xc5\xe2\x68\x12\x6f\xdf\x56\xfa\xc5\x47\xa9\x6c\x7b\x06\xa4\x3f\x49\x0d\xfa\x90\x71\x7c\x1d\x47\xcc\xc7\x52\xb9\x35\x8b\xe8\x1b\x09\xe3\xda\xc6\x61\x42\xca\x31\x4e\x12\x94\x37\x0d\x1c\x56\x0e\xac\x3a\x50\xe9\xe2\xc5\xdf\x7a\x0d\x75\xa7\x06\xa3\x84\x3b\xf5\xa9\xb9\x20\x7d\xf9\x35\x32\xf8\x96\x94\x99\x8e\xbe\x23\xcf\x80\x8e\x00\x73\xaa\x1c\x72\xe2\x92\xa4\xe9\x3b\x22\xb3\x79\xa9\xe8\xe1\x24\x7f\xa9\xfa\x43\x49\x50\xa0\x72\x22\x7a\xa9\xe2\x28\x8f\x91\x49\x97\xb6\x3e\x38\x0c\xa8\x7e\x6f\xf7\xc2\x1b\x95\x0b\x95\x6f\x72\x59\xb9\xf0\xae\xc9\x2d\x0b\xbf\x42\x43\x26\x50\xcc\x28\x64\x12\x4d\x99\xa3\xda\x88\xff\x66\x00\x63\xd6\xae\xd0\xa2\x82\x2d\x3f\x10\xcd\x8a\x63\x94\x92\x7c\x4a\xf9\x3c\x6b\xcb\x78\x10\xe0\x44\x86\x71\x13\x39\x15\x83\x7a\xce\x7f\x27\xe3\xef\x5f\x56\x7f\xfb\x62\x89\x85\xe7\xbd\xf3\x61\xb5\x0f\xa9\x15\x21\x27\xd7\xa9\xbf\x2c\x1f\x26\x91\x11\xd9\xca\xb0\x76\x7b\xeb\xbd\x20\xf3\x54\x9a\x7b\xea\xb5\xf4\x78\xf3\x23\x7b\xdb\x8a\x39\x9d\xa9\x27\x5e\xa6\x13\xd3\x35\xf7\xae\xaa\x9c\x02\xb9\x4f\x12\xd1\x04\x98\xbe\x43\x94\xdd\xde\xaa\x44\x65\xba\xaa\x7f\x0a\x85\x6a\x92\x22\x99\x92\x8c\xea\x66\x0e\x4a\x09\x1f\x9d\x35\x4e\x51\x9c\xa2\x88\x8f\xd9\x3c\x68\xea\x64\xd8\xbd\xc1\x95\x5b\x8d\xc2\xaf\x96\x28\xa8\xc9\x16\x54\x94\x4c\x85\xc5\x69\xaf\x5b\x7d\x17\x1e\x2a\xf6\x1c\xdf\x3a\xb4\x4d\x15\x37\xa8\x5b\xa3\x23\xaf\x45\xe9\x54\x93\xc0\x6b\xf6\x5c\xaf\xfe\x94\xcb\x6f\x93\xf0\x83\x3f\xee\x74\xc8\xcd\xef\xc8\x21\x77\xe6\x8e\x60\x82\xb8\xde\xd5\x08\x53\x77\x04\x9b\xe0\xdc\x01\x61\x6d\x39\x17\x0d\x47\x55\x05\xe0\xc2\x1d\xd6\xd0\xb2\x4f\x31\xa6\xe7\xf1\x31\xaf\x56\x8c\x59\x93\xc9\x4f\x31\xf6\xa3\x33\x3e\xb6\x33\xb2\x25\xa5\x6e\x1f\x77\xa4\xbb\x07\x00\xc7\x8d\xd4\x4a\xce\x79\x11\x38\x7a\xff\x61\x54\xfb\xf5\x83\xd8\x98\x7d\xbb\xa0\xea\xab\x9b\x3b\x23\x35\x22\xaa\xbf\xde\x46\x01\x80\x12\xcc\x5c\x0f\xbc\xd5\x0f\xe6\x4e\xfa\xa0\xd5\x72\x7f\xb7\xa0\xbf\xad\x44\xdf\xaa\x5b\x18\x8b\x9e\x93\x94\xc4\x51\xda\xa7\x8c\x94\xd1\xf4\xae\x13\x0e\x69\xcd\x00\xbc\x86\x1f\xe1\x07\x78\x53\x6b\x08\x5e\xdf\x27\x0d\xc1\x9b\x5f\x48\x43\x70\xf9\xa0\x21\xf8\x1c\x34\x04\xaf\x4c\xb6\xa4\xcd\xde\x96\x0a\xbd\x28\xbb\x83\xd2\xb6\x3b\xf8\x29\x96\xc1\x82\x75\x8e\xa4\x3a\x2b\x91\xc2\x56\xaf\x24\x82\xf8\x3b\x19\xbf\x49\x23\x99\x22\x59\xe6\x4c\x5a\x53\xf3\x1b\x85\xce\x78\xdd\xac\x35\x64\x91\x46\xf9\xeb\x39\x2b\xe6\x4c\x78\x69\x28\x8b\x0c\x27\x5e\xb2\xcd\x86\xf9\x40\xe4\x0a\xb6\xf8\x66\x25\x4b\x88\x77\xfb\x2e\xe6\x94\x58\xcc\x29\x27\x99\x25\x45\x3d\x11\x35\xa5\xc9\xa9\xca\x0f\x32\x22\x68\x33\x51\x3c\x62\xbe\x6c\xa6\x88\x2c\x53\xdb\xde\xc9\xb3\xd6\x89\x8c\x51\xe8\x4e\x32\x8d\x72\x1f\x1c\x59\x9d\xd6\x8b\x87\x68\xab\xc9\xa7\x51\xde\x39\x77\x55\xee\x39\x9d\xd7\x13\xee\xe6\xaf\x01\x08\x92\x92\x14\x3e\x80\x93\xd5\xa0\x2f\x17\x4b\x2f\x47\xd7\x46\x80\x53\x87\xe4\xdc\x59\x5d\x39\xcf\x7d\x30\x70\x0a\x65\xe8\x03\xbf\x16\xcd\xeb\xb0\x3e\x0a\x22\x38\x17\x89\x5b\x98\xf3\xa5\xf6\x31\x92\xe1\x7a\x6e\x6f\x8d\x07\xf8\x91\x7d\x18\x54\x90\x45\x65\xc7\x21\x04\xff\x8d\x70\x6c\xc2\x4e\x1a\x4e\xb8\xd0\x2b\xe7\x2d\xe0\xb9\x3b\x26\xaf\xf0\x2a\xc0\x8a\xcc\x5f\x07\xa8\x5b\x5e\xeb\x78\x16\x8c\x94\xa8\x56\x90\xbc\x76\xb4\x2d\x5a\x2f\xf2\xa6\xd3\x01\x19\x59\x77\xef\x4d\xdb\xeb\x58\x17\x99\x7b\xef\x94\xdb\x87\xde\xf9\x52\x1f\xae\xe6\x87\x1a\x6e\xed\x06\x4d\xc0\x99\x05\xce\xc8\x35\xc7\x26\x0a\x63\x78\xf0\xda\x59\x2a\xaf\x20\x91\x88\xa9\xf2\xd1\xa9\x52\x08\x6c\xf4\xc1\x6d\x28\x76\xd6\x83\x37\xea\xbd\xca\x9c\x12\xe5\x20\xa2\x56\xed\x18\x0b\x69\x60\x54\xd4\xaa\x82\xec\x64\xe8\x35\xb8\x90\x4e\x20\xf5\x82\x24\xc8\x54\xe2\xe7\x17\x53\x15\x41\x17\xe7\x53\x95\xf7\xbe\x51\x8c\x12\xab\x54\xf6\x9a\xa3\xeb\x97\x9c\x0c\x60\x15\x18\x55\xd9\x36\xb1\x68\x8a\x9c\x29\xd6\xc0\x3c\x97\x4b\x1f\x78\x6a\xa7\x2b\x75\x2d\x96\x9b\x8f\xac\x83\x23\x5a\x9f\x5a\x7b\xdf\x75\x39\xa4\x7b\x7a\xa7\x98\x2e\xae\x72\x43\x56\xe7\xb7\xb8\x53\x5a\xaf\xe0\x22\xbc\xf4\xa7\xad\xf0\x8b\x77\x28\x25\x5e\xb9\x03\xdc\xb9\x1c\xda\xee\x5f\x9e\x91\x6d\x6c\x81\x3a\x5b\x02\x38\x6d\x24\x08\x6f\xd6\xaa\xcf\xdd\x4e\xb2\xd1\xaa\x3e\x9c\xc1\xae\x5b\xfb\xe1\xde\xd2\xe1\xc1\xaa\xea\x8f\x5d\x63\x38\x17\x7d\x58\xdc\xf1\xb6\x88\xeb\xb4\x9d\x88\xd7\xd1\xce\x81\xd2\x07\x77\x05\x12\x0f\x1d\x9e\x4a\xfd\xa6\x05\x1a\x85\xca\x0e\x4f\xa2\x3e\x0b\xa7\x00\xdc\xde\xce\x6c\xb1\xf4\xd5\x36\x62\x69\x21\x01\xb7\x9b\x5f\x65\xf7\x1b\xf5\x81\x0f\xc9\x4a\x92\x81\xa4\x16\x06\xa3\x07\x39\xe7\x73\x90\x73\x68\xd8\x4a\x92\xb5\xca\x4e\x66\x7b\x93\x67\x71\xd2\x0c\xc6\xa9\x6d\x9e\xc9\xaf\xd6\xe6\x59\xe8\xaa\xbf\xb1\xa6\xdd\x78\x22\x55\x65\x02\xf4\xd5\x4c\x84\xdd\x97\x84\x19\x75\xd5\x42\x95\xd6\x6d\x77\x7f\x5f\xca\x27\x32\xc5\x30\xff\x83\xb0\xde\xb7\xa4\x8c\x51\xef\x87\x68\x9e\xc7\x33\x0f\x26\x0a\x61\x62\x92\x0f\x9a\xb6\xc4\x06\x6d\x29\x89\xa5\x12\x31\x26\xa3\x66\x78\xc5\x26\xf0\x87\xf9\xdd\xab\x2f\x45\xf6\xd9\xaa\x02\xd0\x19\xb9\x05\x44\x11\x86\x72\x5b\x3a\xba\xa1\x2b\x27\x48\xa4\x33\xb4\xb5\x29\xfb\x0f\x6a\x77\xb2\x7e\x38\xbd\xc1\xfb\x8f\x65\x7a\x58\x17\xfc\x92\x6e\x4b\x45\x4e\x1a\x2f\x7f\xfd\x78\x86\xd3\x64\x03\x65\x59\x69\x95\xbb\x85\x2b\xff\xe6\xa0\xcd\x0f\x44\xe3\xb7\x4c\x34\x74\x28\x32\x1c\x44\x29\x8e\x28\xf0\xbd\xfa\xa5\x15\xc5\x24\x41\x89\x7a\x74\xee\x0c\x3b\x56\x98\x6f\xc4\xa1\x3c\xf9\xc1\x94\xc7\x3c\x19\xd5\x44\x27\xfa\xd5\x12\x1d\xeb\x95\xff\xef\x17\xaf\xff\xe1\xcb\xd8\xef\x48\x68\xe3\x50\x28\xe2\xc8\x48\x2d\x5c\xe3\xcd\x5a\x29\x63\x18\x58\xd6\xce\xb6\x15\x8c\x42\xea\x93\xee\xc7\xb3\xf2\x50\x06\xb7\xbb\x67\x3e\x3f\x0f\x0e\xd3\xcd\x88\x6f\x65\x6b\x00\x89\x8d\xfb\x08\xd8\x35\x4c\x89\xc6\x7d\x8c\x9e\x08\x9c\x57\x8a\xbc\x0f\x7b\x25\xcd\xdd\x02\x35\x9a\x59\x64\xf8\x06\xe7\xf4\x84\x92\x52\x80\x6d\xdf\x07\x9a\xce\x2c\x8f\x0f\xa6\x9b\x0f\xa6\x9b\x0f\xb4\x67\xad\xe9\x66\x24\xd5\xcf\x0d\x27\x06\xc7\xd5\x5d\x3a\x0a\x94\x41\x89\xa2\xe4\x75\x9e\x2e\x80\xef\xcd\x29\x2a\x2f\x10\x63\x38\x9f\x72\x64\x3a\x45\x17\xf8\x23\xaa\x53\x4a\x3a\x71\x31\x59\x44\x2f\x65\x0a\xba\x60\x38\xd2\x4f\x3b\xad\x5a\x1a\xe9\xc8\x3a\x89\x1c\x53\xd3\x44\x83\x91\xd4\x8b\x4e\xfd\x25\xc5\x94\x5d\x08\xb7\x38\x8f\xb3\x96\xbe\x63\x44\xe8\xb7\x62\x55\xa4\x46\x06\x00\x3b\xd8\x15\xea\x68\xf3\xae\x5d\xa1\x0d\x89\xda\xba\xf0\x63\x5b\x9b\xad\x8b\x38\xa2\xd3\x1b\xd6\xf5\x8d\xe3\x7a\x24\x1e\xc7\xdc\xaf\x2a\xfc\xfe\x1b\x29\x08\x8a\x4f\xb5\x41\xa2\xda\x82\x96\x0d\x23\x07\xcf\x3b\xc2\x01\xd4\x36\x63\x94\xde\x84\x2f\x0c\xb2\xbf\xb2\x52\x1f\xd4\x7b\xe6\x68\x77\xcd\x1b\x48\x5d\xc3\x13\x79\x0e\xa4\xd2\x5a\x75\xb6\xaa\x51\xbd\x8f\xa2\x89\xd0\x07\xbf\x89\xa6\x38\x8f\x94\x54\x24\x63\x82\xc8\x97\x9c\x7a\xbd\x26\x07\x1b\xf3\x9b\x60\x38\xeb\xb4\x13\xba\xf3\x44\xc9\x2d\x3b\xa1\xe6\xb6\xdf\xd9\x38\x2d\x6b\xa1\x7a\x63\x0f\xf7\xfb\x70\xba\xb6\xf6\x6f\x2b\x47\xd4\x55\x8d\x37\x18\xc8\xd4\xac\xc4\x16\x9a\xe6\xee\xa6\xce\x08\x2d\xdb\x26\xfb\x8c\x1f\xae\xf8\x6d\x99\x31\xb9\xd7\xe4\x70\xad\x6f\x16\x8e\x01\xb8\xbd\xcd\x6c\x1e\xed\x66\x47\x1e\x0d\xb5\x03\x61\xdf\x67\x07\xd9\x5d\xd2\x86\x5a\x79\x40\x1b\x0a\x9a\x9f\x23\x15\xfc\x4b\x4c\x33\x2c\xc2\x82\xb5\xe2\xb2\x6c\x15\x7b\xc4\xda\xc1\x76\x6c\x40\x2a\x43\xb1\xed\x99\x73\xa2\xcd\x86\xcb\xc8\x99\x1b\xd3\xaf\xaf\xb6\x9d\x6a\x4d\x71\x27\x06\xfc\x7e\x7b\x0e\x3f\x30\xbf\xbf\x6d\xe6\x77\xa6\x98\xdf\x74\x0b\xe6\x97\x34\x0c\x88\x12\x44\x65\x84\x77\xc9\x71\xba\xbe\xb1\xfb\x21\xb5\xb1\xe3\xc0\xe2\xba\xbe\xaa\x27\x67\xd7\xf1\xb5\x15\x92\xbd\x23\x59\xb2\x98\xe9\x27\xc7\x8d\x9c\xfd\x13\xb0\x71\x78\x3f\x31\xf1\xa0\x40\xe8\xf2\x79\x9a\x4a\xf0\x79\x40\xa4\xa4\x52\x19\xaf\x8d\x66\x7f\x7d\x66\xd9\x58\xe7\xc7\xd6\x86\x09\x70\x9b\x90\xc1\x48\xa4\x8f\xe2\x73\xc3\xf4\x9b\x9b\x22\xca\x13\xe1\x1d\xa1\x0d\x7e\xd4\x83\xbf\xb0\x11\xbd\x90\x26\xa2\x81\x40\x87\xb2\xee\xdf\x9b\xd0\x55\xa1\x32\x8f\x2c\xd5\x7d\x18\xa2\xdb\x5b\x4b\xbd\x84\x84\x21\x07\xbf\x85\x32\xda\xa7\x08\xce\x2a\x79\x60\x6b\xc5\x43\x69\x68\x16\x65\x88\x1f\x7d\x20\x42\x08\xaa\x33\x08\x46\xa0\x2a\x50\x49\x31\x55\x69\x58\xf7\x9a\x62\xc8\x94\x0f\x1c\x61\x78\xb2\xd0\x7b\xfc\x62\x16\xe5\x53\x24\xfc\xcf\x15\x28\x3c\xe9\x27\x3d\x69\xfa\x7d\xdd\xb9\x9d\x7d\xe1\x8e\x70\xd7\x06\x14\x99\x3b\x40\xeb\x5e\x1c\xce\x3f\x3b\x23\x58\xfb\x29\x24\x80\x6d\x9f\x2e\x56\x76\x02\x60\x6c\xb3\xb9\x93\x96\xef\xba\xde\x33\x3e\x9a\x16\x9e\x77\x1c\xcf\xde\xf9\xb5\xc3\xd9\x87\x78\xff\xe5\x35\x7a\x71\x06\x34\x6e\xe8\x16\x0b\x35\xdb\x91\x85\x4a\x23\x61\x4c\xb6\x43\x78\xc3\x43\xed\xcc\x77\x56\x4e\x1a\x73\x80\x3a\xaa\x4a\xcd\x17\x15\xf7\x89\x2f\xca\x7e\x21\x65\xe4\x43\xcc\xbb\xcf\x82\x1f\x9b\x84\x7e\x2a\x55\x7b\xb6\xc8\x28\x83\x9d\xe0\x55\xa6\xbf\x96\x41\xaf\xd1\x31\x49\xa4\x50\x87\xaa\x92\x26\xc1\x39\xf3\x84\xf7\x74\x46\x58\xc3\x14\x5b\xb4\xb5\xed\x10\xda\x26\x05\x6f\x64\xab\xde\x4b\x0b\xcd\x38\x86\x05\x79\xd3\x10\x5a\x35\xb0\x03\x8a\x81\x4a\x1a\xde\x46\x77\xb9\x9e\x49\x84\xd3\x1d\x17\xf3\x6d\x84\xd3\xed\x57\xc2\x07\xe8\x5c\x46\x7a\x58\x5e\xbd\xac\xad\x20\xcd\x4c\x28\x97\x0b\x99\x9a\xb9\x9e\xa4\x72\xbf\x15\xe1\x50\x61\xa1\x75\x9e\x12\xc8\x1e\x8c\x15\xc7\xab\x3f\xf0\x39\x1b\xfe\xb9\x61\x62\xc2\x85\x76\x18\x87\xe3\x66\x22\x39\xd3\xd1\xe1\x41\x61\x12\xb7\x6f\x39\x97\xc3\x23\xc2\x98\x64\x6a\xbb\x46\x56\xb3\x88\x65\x91\x46\xb1\xc8\xd4\xdf\xe7\xb3\x9a\x97\xe8\x37\x14\x5f\x6d\x4f\xf5\xd1\xcf\x23\x19\x1d\xaa\x28\x2a\x51\xcc\x77\xcd\x0a\x3d\x7e\xb8\x86\xc8\xe1\x79\x04\x5c\x91\xd0\xfd\x64\x98\xa2\xbe\x8e\xbf\x73\x78\x04\xdb\x9a\xd9\x49\x7e\x21\xfe\xa1\x78\xe0\x1f\x3e\x07\xfe\x21\x33\x31\x73\xd7\xea\x73\xda\x09\x63\x39\x8d\xb5\x53\x03\xc8\x68\xb6\x19\x49\xf0\x64\xf1\x7d\x9e\xa0\x1b\x11\xd1\x76\x6b\x72\xb7\xbd\x81\x8d\x16\xb3\x6b\xfb\x9a\xf8\xd7\x6a\x5f\x03\x93\xce\xe7\x4b\xaf\x09\xa5\x64\xc5\x3b\xe6\xa3\x53\x3b\x12\x6e\x9d\xc7\xc4\x52\x15\x19\xcb\x4c\x1d\xe4\x7e\xa9\x50\xd1\xa0\xc9\x0c\xd9\x48\x10\x04\x6c\x86\x72\x11\xd9\x00\x99\xc8\xb9\x8d\x19\x59\xf7\x46\xde\xa4\x53\xf8\x0c\x00\xce\xc3\x70\xc1\xbb\x9e\xc8\x7a\x15\x94\x7d\x38\xea\xbf\x3d\x88\x02\x9c\x00\xc1\x51\x14\x4d\xaa\x7f\xf7\xfa\x93\x66\xff\x2d\x38\x4a\x16\x63\xa7\xf4\xb9\xed\x3e\x00\x9c\xdb\xf2\xb9\x33\x66\x13\x60\x3b\xa9\x04\xd6\xf5\xe3\x0c\xda\xc5\xe7\x64\x3b\x92\x4b\xca\x22\x46\xfb\x63\x72\xb3\x4d\x8c\xba\x26\x5d\x5c\xc5\xd3\xc0\xf2\x8e\xb8\x9a\x34\xdc\x9d\x89\xd9\x88\x47\xf4\x73\x77\x8d\x47\xca\x5f\x2b\x1e\x11\x46\xd6\xb9\x75\x1e\xa2\x7a\xfa\x34\xb4\xde\xd1\xe7\xe1\x21\x37\x06\x26\x6e\x0e\xb5\xf9\x0a\xda\x9e\x70\xda\x3e\x57\xb4\x3d\x69\xd2\x76\xfb\x27\x4c\x5c\xda\x9e\xac\xa4\xed\xc9\xed\x6d\xe2\xd2\xf6\xa4\x49\xdb\x93\x90\xee\x9e\x43\x8d\xf3\x54\x3a\x87\x5a\x02\x60\x6c\xd1\xf6\xc4\xa1\xbc\x89\xa2\xed\x8d\xf2\xf3\xa4\xbd\x37\xb1\xa1\xed\xc9\x7a\xda\xee\x8e\xd0\x7d\xbc\xf8\x14\x13\xbe\x3c\x95\xce\x22\x4c\x60\x2e\x13\xa8\xd9\xfa\xaf\x1d\x73\x59\xd8\x77\xfb\x6e\x5f\x48\x57\xbd\x88\x36\xdf\x4f\x1f\x18\xdd\x07\x46\xf7\x57\xc8\xe8\x96\xbb\x32\xba\x13\x52\xc6\xe8\x05\x49\xd3\xa8\xa0\x32\x90\xf0\x03\x57\xdb\x52\x43\xe9\x22\x07\x58\x22\x13\x4f\x93\x77\xd9\xf6\xe1\xb2\x21\xb7\xef\xf8\x78\xd9\x95\xe0\x54\xf0\xc2\x6e\x04\x82\xaa\x5a\xfb\xf0\x68\xcf\x7a\x28\x85\x24\xeb\xf1\x51\x64\x71\x05\xa3\x8e\x77\x52\x2c\x03\x35\x07\x4d\x68\x00\x1d\x7a\xe9\x68\xfb\x77\xd4\xed\xde\x4e\x77\x7c\xf9\xdc\xe7\xb5\xf3\x67\xe7\xd6\x1d\xf8\xdf\x15\xeb\xbc\x89\x61\xdf\xfb\x05\x6f\x75\x2f\xeb\x07\x6c\xbc\x50\xee\x2a\x8e\x34\x1e\x26\xef\x5c\x24\x60\x11\xbd\xec\x4f\xb5\xb1\xe3\xdd\x18\x57\xfd\x62\x3e\x0d\x47\xed\x5c\x03\xf7\xe1\xf9\x70\xfa\x0b\x71\x45\x8b\x07\xae\xe8\x73\xe0\x8a\xae\x76\xf0\x65\x68\xa9\xff\x5c\x0f\x85\x79\xd3\xc7\xa0\x61\xed\x1c\xaf\xf7\x3f\x28\xee\xd6\xff\x60\xe6\x98\x85\x69\xf3\xae\x69\x9b\x73\x99\xae\xf1\x30\x98\xae\xf5\x30\x98\x75\x38\x0b\x8c\xd5\x40\xb3\x86\xb3\xc0\x3b\xcb\x68\x7c\xa2\xdd\x05\x08\x23\xa6\x7c\x4b\x9e\xa8\x46\xc8\x16\x4b\x24\x79\x99\xbd\xfd\x0f\x2a\x98\x85\x8b\x66\xe2\xa2\x3b\x27\xed\x4e\xff\x8d\xa5\xef\x44\x64\xd7\x74\xe3\x24\x56\x72\x86\x6c\x98\xed\xd3\x1d\x07\x6a\x1c\xe4\x66\xe2\x28\x17\x74\x0d\xa3\xfa\xf9\xc1\xb6\x53\x6e\xf7\xed\xe3\x34\x8c\x0f\x7f\x7d\x55\x29\xa8\x2c\x4e\xe1\x6a\x57\x4e\x41\x06\x92\x7f\xb0\x22\x7a\xb0\x22\x7a\x60\x03\xee\x21\x1b\xb0\x97\x15\x51\x23\xfc\xdf\x07\x32\x3e\x92\x66\x38\x28\xa0\x4c\x84\x1f\x6c\x86\x42\x53\x9e\x10\xd0\x4b\x50\xc4\x45\xca\x5d\xac\x6f\x2e\x18\x29\x7a\x7f\xe7\x34\x7b\xad\xd9\x0d\x1f\x57\xc7\x25\xd9\x64\x36\xe4\x4e\x1e\xea\xb0\xed\x28\x98\x20\x16\xcf\xde\x46\x56\xe0\x36\x1f\x1c\xc9\x3c\x52\x3d\x16\xf0\xb9\x40\xd4\x1d\xde\xcd\x51\x44\x30\x60\xc7\xb5\x44\x3a\xa0\x25\xd4\xbf\x75\x20\x45\xdd\x9d\x01\x91\x4e\x83\xae\xa1\x84\xb7\x84\x52\x54\xb2\x4d\x60\xc2\x50\xa6\x34\x6f\xc2\xe9\xd3\xd9\x25\x29\xca\x20\x0b\x8b\xda\x2a\xbf\x10\xf3\x74\x8d\x90\xc4\xd4\xe4\x0a\xb6\x36\x44\x32\x9d\x7d\x02\x43\xa4\x7a\x3e\xbf\xb8\x31\x12\x2a\x31\x49\x70\xbc\x73\xb4\xae\x4f\x6f\x70\xe4\x3e\xcd\xd5\xd1\x9b\x84\xfe\x4b\x06\x15\x32\x37\xdd\xc4\xe9\x10\x1f\xdf\xa8\x65\xf9\x20\x90\x47\xdd\x67\xe1\x57\x4b\xe4\x33\x20\xb3\x8d\xa6\x8d\x67\x2f\x12\x7a\x56\x97\x1e\x8c\x42\x2b\xf8\x0d\x0d\x37\x31\x75\x79\xc3\xc6\xcc\xea\x88\x8b\x2e\xf6\xc7\xd8\x7d\x07\xa3\x2b\xa8\x5b\xcc\xa9\x1b\x55\xd4\x2d\x6e\x52\xb7\xb8\xc1\x2b\xb8\xd4\x2d\x5e\x49\xdd\xe2\xdb\xdb\xd8\xa5\x6e\x71\x93\xba\xc5\x61\xb4\xfb\x3b\x18\x67\x83\xf4\x3b\x58\x0c\xe0\xdc\xa2\x6e\xb1\x43\x7b\x62\x45\xdd\x1a\xe5\xe7\x71\x9b\xba\xcd\x0d\x75\x8b\xd7\x53\x37\x77\x84\xee\xc3\xc7\xa7\x18\xf3\xe5\x49\x74\xa1\xde\xc0\x2c\xfe\x6d\x57\x73\xb0\x92\x5c\xdf\xa1\xd1\xd7\x0c\xa5\x05\x2a\xe9\x49\x1a\x7d\x5c\xf4\x63\xa9\x21\xfc\x14\xb6\x5e\xf7\x83\x25\x2d\x7e\x21\x96\x34\x7b\x60\x49\x3f\x07\x96\x74\xec\x66\x72\x67\xa5\x07\x3a\x6d\xd5\xcc\x45\xf7\x30\xed\xe3\x9c\xa1\x92\x93\x84\x2b\x54\x57\xdf\x1c\x40\x9d\xb7\x07\xbe\x1f\x1d\xc0\x04\x25\x8e\xce\x89\x2a\xde\x26\x69\xba\x22\xce\xdd\x62\x65\xc7\xe1\xb2\x42\x16\x2f\x55\xd4\xf1\xa1\x65\xf8\x59\x0f\xe7\x09\x2a\x50\x9e\x08\x7b\xf6\x2a\x96\x4f\x57\x60\x29\x38\x78\x8e\x9d\xc4\xc3\x03\xf0\x87\xe6\x25\xeb\xef\x64\x0c\xd1\x48\x6a\x9d\xfe\x4e\xc6\x9a\x01\x5e\x7e\x20\xe3\x01\xaa\x04\x17\xbc\x45\xae\xa0\x00\x0b\x03\x31\x61\xc2\xf5\x5f\x98\xcd\xfe\xa1\x9f\xd3\x38\xa9\xa6\x61\xe6\x47\x9f\x54\x8d\x34\x77\x47\xb8\x6b\x7f\xb8\xb8\x35\x80\x0e\x89\x71\x67\x1e\x77\xcd\xfe\xd5\x76\xec\xa4\x03\xeb\xec\x00\xc0\xa8\x11\xc7\x2a\x8c\x38\xaf\x49\xf4\x7f\x16\xdd\x1c\x6f\x43\x37\xe9\x7c\x9c\x47\x57\x9d\xa4\xd3\x7a\xd1\xd9\x9e\xd9\xfc\x94\x96\x60\x87\x07\x0b\x8d\xa3\xfc\x7e\x98\x81\x09\x6b\xd0\x19\x17\xf8\xde\xf2\xcb\x5f\x2a\x1f\xc8\x77\x51\xe7\x85\x16\xac\xb6\x22\x8c\xbe\x7a\x39\x3e\x97\x7d\x0d\x50\x30\x8b\xa8\xed\xea\x09\x8e\x8f\x1f\xf9\x32\x8c\x0c\x3a\x3e\x96\x9f\x55\xec\x0e\xa0\xe2\xc8\xc4\x51\xce\xff\xf3\xbd\x12\x45\x49\x4f\x3a\x16\x7b\x9d\xb6\x69\x02\xa0\x94\x33\xe7\x0f\x86\x69\x0f\x86\x69\x2e\x72\xe1\xe0\x91\xc6\xb0\xfb\x30\xe6\x9b\x8c\xcf\x0c\x7a\x3a\x4c\xdb\xbc\xdb\xf3\xf2\x51\x3b\x0c\xc6\x7d\x60\xe1\x67\xbf\x10\x0b\x3f\x7d\x60\xe1\x7f\xeb\x2c\xbc\xd4\xaf\x2e\xc2\xa1\x4a\x9c\x5f\x67\xc7\x37\xe9\xf6\x47\x8d\x17\xe8\xbc\xcd\xd4\x1b\x44\xb1\xc5\x7b\xb4\xaa\x1b\x88\x74\xf9\xea\x29\xba\xb3\xc2\x32\x9f\x73\xc4\x00\x39\x3b\xab\xca\x2a\xfd\x3e\xbd\x32\x57\x4e\x3b\xd3\x8d\xee\xce\xea\xc6\x03\x47\x96\x23\xaa\xae\x20\xce\x09\x7b\x47\x8c\xde\xb7\xf1\x55\x24\xd9\x41\x32\x65\xeb\x11\x9e\xf8\x48\x27\xe4\x59\x3d\x08\x68\xab\x82\x53\x74\x85\xd2\x81\x77\x1d\x95\xb9\xa7\xd2\xdf\x7a\x6f\x91\x6a\xd1\xfb\x2e\x4a\x7a\xff\x20\xbd\x6f\x26\x13\x81\x47\x6d\xdd\xb0\xac\xc5\x70\x3e\xed\x31\xd2\x8b\xf2\x1e\xe6\x22\x05\x8e\xa3\xb4\x47\xd2\x04\x95\x3d\xdd\x47\x42\x10\xcd\xff\xff\xff\xf7\xff\x63\xbd\xa2\x24\xfc\xb8\xf7\xa2\x5e\x8e\xae\xf5\x77\xaf\x02\x47\x28\xa5\x68\x3d\xa0\x3c\xb0\x55\x3e\x52\x24\x1b\xd6\x79\x84\x9a\x46\x7f\xb5\x6d\x1f\x5a\x6d\xd4\xb7\xee\x79\x41\x41\x2b\x89\xf2\x29\x17\x4f\x5a\x7a\x74\x09\x93\x96\x12\xbd\x99\xb5\x49\x6e\x6b\xfd\xd0\xd0\x32\x61\xd8\x49\x76\xd4\xe6\x02\xe6\xc4\x37\x2d\x0c\x30\x7d\x5d\xa0\x5c\x3a\xf2\x5a\x55\xc7\x84\x22\x99\x07\x68\xb2\xc2\xde\xc1\x94\xab\x43\x68\x0c\x14\x54\xd8\x41\x0e\x82\x17\x64\x9e\x33\xf7\x45\xa4\xb1\x75\xea\x4e\xb1\x10\x05\xf5\xd3\xf3\xed\xed\x70\xa4\x51\x36\x3a\xff\xe0\x23\xf0\x98\x69\x54\x78\x03\x4f\xc1\x63\x9f\x05\x59\x54\x7c\xbd\xf0\x3d\xde\x48\x99\x1b\x18\x6c\x79\x0d\xad\x1f\xbc\xfe\xe0\x54\xd9\x51\xbe\x90\x91\x0a\xbb\x0c\x18\xf4\x84\xe4\x15\xf6\xc0\xe6\xcb\x52\x31\x32\x9d\xa6\xe8\x25\x9e\x4c\x74\x3c\x7d\x59\x62\x90\x9a\x06\x2e\x10\x96\x10\xd3\x15\x96\x10\xe5\x5d\x85\x2a\x6c\xf6\x6f\xed\xc0\x1e\x76\x09\x76\x6b\xc7\x30\xc1\x19\xc7\x40\x75\xbb\xa0\x85\x2b\xda\xae\x1f\xa3\x86\xf4\xfe\x26\x1d\x56\x1f\x2d\x4b\x0b\x77\x6b\xcc\x91\xfe\x44\x26\x10\x8a\x84\x5d\xd7\x99\xc7\x55\xb6\x6d\x06\xe0\x47\x5d\xb8\x08\x70\x1e\xa7\xf3\x04\x51\x9f\x05\xef\xf8\x4c\xcf\xd1\xe3\xb3\x01\x3a\xb2\x83\x02\xeb\x93\xec\xa3\x40\xe6\xb0\x6d\xdc\x84\x8f\xe2\xb2\xa0\x40\x02\xaa\xf9\x8d\x5f\x8c\x9a\x6d\xba\x69\x0a\x10\xe7\xe8\xf1\x07\x9f\x81\x01\xaa\x76\xe0\xba\x69\x9f\xb2\x12\x45\xd9\xce\xdc\xb7\x64\xa7\xc9\x15\x2a\x4b\x9c\x70\x58\xf6\x2d\x1b\xce\x8c\x64\x7b\xb8\xbe\x77\x6a\xc3\x39\x4b\x7d\xf4\xa0\xec\xfd\x7c\x38\x45\xa5\xec\x25\xae\xbe\x97\xa4\xda\x1d\xc3\xd1\xf7\x32\x9c\xa1\x14\xe7\x48\xf3\x81\x76\x4c\x64\xdf\x07\xe1\x57\xc3\x11\x58\xc3\x01\x2a\x63\x45\xe2\xc7\x61\xe4\xfb\xc9\xee\x9e\x1c\x52\x0e\xdc\xa0\x53\xd2\x83\xd9\x8a\xa5\xe2\xd7\xaa\x58\x82\x24\x7c\x74\x0a\xfd\x34\x34\x5c\x05\xc0\xb9\x5f\xae\x0d\xef\xc0\x81\xa0\xf6\x95\xec\x24\x0e\x96\xc3\x74\x14\x12\x41\xec\xa3\x3c\x27\x2c\x62\x28\xf9\x4f\x05\x2d\x97\x0d\x31\x5b\xa6\xfd\x94\x65\xf2\x99\x77\x98\xf3\x79\xf5\xc5\x32\x7c\x08\xe7\x38\x7c\xdf\xe7\xd7\x28\xfc\x4a\x75\x95\x73\x8c\x81\x27\x3e\x3f\xe4\x18\xe4\x01\x9d\x91\xeb\x97\x11\xe3\xf7\xd4\xe6\x59\xd3\x10\x05\x12\xd9\x3d\x67\x3e\xee\x9f\x29\xeb\x17\x2b\xf7\x4d\x2a\xf9\x0c\x7b\x0a\x20\x10\x16\x02\xaf\x27\xbe\x97\x44\x0b\x7d\x5e\xad\x36\x6c\x73\x9b\x23\x22\x18\x2c\x3f\x82\xfc\x37\xf5\xc0\x57\xa7\xc7\xc7\x7e\x63\x9e\x40\xe5\x59\x58\x2a\x78\x0c\x18\xcc\x10\x8b\x06\x79\x25\x5f\xc9\x8b\x30\xf3\x13\x9b\x38\xd6\xa7\xef\xf0\x00\x6e\x4e\xd7\xad\x3d\xdb\x8e\xa5\xd8\xd0\x07\x80\x89\x4d\xed\xe3\x30\xe1\x04\x39\x16\xff\xed\xa4\xbc\xa6\x24\xef\x5f\x61\x74\x8d\xb6\x4e\xb6\xbd\x95\x7e\x69\x53\x02\x1a\x48\xef\x48\xc1\xad\x13\x9b\xb8\xe2\xb0\xb5\x2e\x95\xd1\xc4\xaa\x61\x3d\x6b\x4d\xd2\x39\x4e\xbe\x43\x78\x3a\x63\x83\x59\x44\xfb\xe2\x77\x7f\x26\x0a\x6a\x8b\x2e\xdb\x90\x9b\x0a\x89\xba\xf4\xa3\x30\xf5\x7d\x7a\xe7\xb1\x62\x44\xf7\x3f\x4b\x18\x4d\x3e\xd4\x05\x2b\x6b\xc1\xc1\x35\xc7\x12\xa6\x5e\x94\xe4\x42\xba\x82\x4f\xa4\x5b\x13\xb5\x0e\x66\x22\xe7\x7b\xc1\x4a\x0f\x16\xe1\x90\x8c\x60\xb6\xd1\xa8\x84\x36\xe2\x27\xaa\xd6\x9c\x5f\xb5\x3f\x4c\x5c\xfd\x75\xb6\x82\x5d\x99\x70\x76\x25\x53\xec\xca\xa4\xc9\xae\xd8\x3f\xe1\xc4\x65\x57\x26\x2b\xd9\x95\xc9\xed\xed\xc4\x65\x57\x26\x4d\x76\x65\x12\x16\xbb\xeb\xaf\x39\xab\xa6\xf5\xd7\x13\x00\xc7\x16\xbb\x32\x71\x98\x89\x89\x62\x57\x1a\xe5\xe7\x93\x36\x51\x1a\x1b\x76\x65\xb2\x9e\x5d\x71\x47\xe8\x3e\x56\x7c\x8a\x13\xbe\x3c\xc9\xae\x44\x21\xe5\x68\x25\x12\xff\x09\x35\xb6\xed\x20\xb4\x43\xe6\x97\x14\x4f\x50\xbc\x88\x39\x13\x3c\x8b\x4a\x76\x80\x9d\xc9\xbe\xe8\x06\xce\x6b\x26\x39\x7e\x60\x92\x3f\x07\x26\x39\x31\xa4\xa1\x61\xa4\x9b\xb6\x50\x3a\x8b\xe8\xe5\x05\xa7\xaf\x9c\xd3\x60\xa8\x13\xed\xd7\x75\x26\x38\xc7\x74\x86\x92\xe7\xac\xd3\xfd\x99\x57\x0c\xcc\x79\xff\x87\xd0\xb0\xc1\xd2\xf7\xe3\x75\x26\xa3\x82\xb9\x13\x46\x18\x2f\x78\x0d\xcb\x25\xd6\x8c\x7b\x7c\x6c\xcc\x5c\xb5\x1a\xc7\x99\xb7\xf2\x97\xf5\x30\xed\x2b\x83\x0e\x81\xe6\xf5\x7c\xd7\xf4\xec\xf4\x56\xaf\xd0\xea\x52\x17\xca\x4e\xcd\x02\x7f\x88\xc6\x28\x95\xbd\x3e\x32\xdd\xe8\x66\x5e\x33\xe5\x79\x1b\x34\x35\x23\x6a\xd4\x02\x1e\xc5\x09\x8a\xa3\xd2\x03\xe7\xe6\xcf\x81\xfd\x1d\x15\x33\xc4\xef\x57\xea\x81\x73\x14\xd0\xf9\x98\xb2\xd2\x3f\x85\x48\x1a\x5b\x70\x36\xb1\xef\x01\x29\xe5\x37\x78\xa8\x1a\xbc\xdb\xe5\xc0\x9a\xaf\x6a\xed\x78\x8e\xc6\x4e\x2c\x3e\x1b\xdc\xd2\xc8\x76\xa7\x91\x9a\xed\xd7\x8f\xd5\xdc\x85\x3d\xfc\x61\x9d\x0e\xb6\xf0\x89\x4d\x76\x44\xf5\xfb\x9a\x13\x76\xa4\x39\xbc\x03\x6f\x96\x4e\x55\xc9\x7d\x78\x79\x1c\xff\x42\x2f\x8f\x0f\x59\x0a\x3e\x0b\x52\x39\x5b\xeb\xcf\xe2\x50\x37\x1d\xbb\xce\xdc\x74\x0f\xd6\xe4\x51\x7f\xd4\x94\x54\xbd\x55\x52\x52\x32\x9b\x8a\x52\x0f\x76\xb3\xc9\x0b\x1f\x49\x12\x22\x03\x32\xa0\x17\x24\x2b\xa2\x12\xf9\x0b\x9f\xc9\x72\xc0\x0f\x12\x6d\xf5\xba\xae\xc3\x8e\xbe\x64\x37\xa9\xef\x4f\xb6\xcf\xac\xb0\x2e\x9f\x82\x9a\x82\xdc\x15\xbb\x50\xaf\xb6\xe9\xe5\x21\xfd\x12\x7f\xd0\x00\x7c\x67\x55\xd4\x19\x19\xd6\x54\xa5\x26\x41\x43\x93\x16\xbf\x99\x45\x14\xb5\x74\x42\xf5\x2c\x6e\x6f\x4d\x01\x85\x2c\x5c\x7a\x45\x89\x84\x6e\xa5\x6f\x68\x2a\xf5\x06\xc3\x11\xac\x3f\x28\x0a\xac\x8b\x09\x65\x2b\x1a\x98\x2f\x8d\x16\xb2\x98\x14\x94\xff\xc8\x22\x9c\xf3\x3f\xaa\x23\x54\xe3\x0a\x64\xf4\x4e\x38\x94\x3b\x7f\x7b\x8b\x8e\x70\x93\x4d\x38\x3e\x66\xc3\xf7\x5f\x2c\x9d\xd2\x8a\xbe\x1f\x05\xc5\x9c\xce\x7c\xc4\x77\xf3\x48\x77\x33\x1c\xc1\x3c\x44\xe1\x57\x36\xbf\xa4\x58\x24\x8d\xb9\x58\x20\x26\x13\xa4\x28\x9f\xb2\xd9\x5f\x91\xfa\xe3\xf8\xd8\xc7\xb2\x47\xf1\x6a\x3a\xf0\xde\x28\x38\x78\x10\xd3\xe7\x82\x05\x18\xb0\x61\x27\xd8\x46\x01\x25\x19\xf2\x73\x50\x01\xd8\xec\xe3\x55\x84\x73\xbb\xbd\x1a\x5a\x55\xbf\xbd\xe5\x1d\x76\xc1\x75\x75\x8f\x6f\x74\x75\x6f\xc5\x27\x52\x34\x06\x34\xbb\x50\xf7\x08\x20\x76\xf8\x23\xe7\x14\x6d\xc7\xb9\xc4\xeb\x7a\x70\x22\xf1\xb7\xf2\x3f\xac\xb9\x04\x87\x7b\x0f\xb5\x73\x41\x74\xde\xa3\xc3\xd5\x7d\x9d\x09\x06\xd4\x59\x9c\x76\xde\x31\x6f\x70\xda\xbe\x61\xde\xe0\x4c\x5c\x90\xc1\x93\x8e\xcb\xe4\x0d\x9e\x76\x5e\x3e\x6f\xf0\xa5\xb9\x62\x83\x67\xd5\x91\x1d\x8d\x42\x23\xc0\xf7\x5f\x2c\xa7\x43\xd4\xbc\x39\xa3\xaa\xff\xc5\x52\x3e\xff\x57\xef\x37\xbe\x86\xa5\x38\xef\x66\xe6\x3a\x43\x1d\xea\x42\x91\xc3\xdc\xce\x0b\xd5\x62\xf1\xca\x79\x9e\x12\x7e\x54\xbd\xe4\x69\x9f\xa2\x54\x59\xab\xc8\x9f\x1c\x5f\xcb\x3f\xa3\x1b\x4c\xd5\x5f\x2a\x5c\x70\xf2\xb4\x3f\x21\x65\x16\x31\xf9\x37\xc3\x19\xaa\x0b\x56\xa7\x99\x52\x33\xeb\x53\xb6\x48\x51\xdf\x64\xad\x5a\xdd\x60\x9e\xe3\x7f\xcd\x51\xba\x58\x6d\xdc\x66\x73\x96\x92\x3f\x6a\xe4\x83\x85\xd7\xf0\x23\xfc\x00\x6f\xe0\x6b\xf8\xa6\xde\x9c\xcb\xfb\xc4\x78\xbe\x7a\x60\x00\x7f\xeb\x0c\xa0\xc4\x55\x17\x9c\x64\xa2\x1e\xce\x29\x8b\xf2\x18\x91\x49\xef\x39\xbf\x6e\xe7\xf2\x8d\xe8\x02\x0c\x5e\x45\x6c\x16\x94\x64\x9e\x27\x3e\x02\xf0\xa7\xd0\x9c\x62\x43\xc1\xcb\x30\x3f\x37\x56\x3f\x81\xb8\xc2\xef\x70\x86\x7c\x30\x70\x4a\x7f\xc0\x39\x8a\x4a\x9f\x2f\x43\x93\xde\x73\xda\x8c\x60\xc2\x7c\x04\x45\xc8\xdd\x21\x1e\x01\x30\x18\x9e\xc2\x33\x63\x3e\x53\x06\x65\x94\x4f\xd1\x5b\x31\x97\xe1\xd9\x29\x64\x23\x10\x24\x84\xa3\x4f\x9f\x6f\x5b\x05\xdf\xa9\xd9\xf1\xb9\x71\xfe\x36\x0f\xeb\xee\xb3\xe8\xa6\xd1\xf7\xed\xed\x99\x09\x17\xf6\xd5\xd9\xf1\xb1\x9f\x87\x17\x7e\x0e\x00\x5c\x31\xe9\xc6\xe0\x0c\x9e\x9d\xd6\x83\x0f\x4f\x61\x3e\x02\x95\x60\xa9\x5f\x84\x7e\xc6\xb9\xd4\xc2\x4a\xea\x25\x9d\x7b\x01\x1c\xbb\x1f\x12\x44\x63\x0f\xc0\xc9\x01\x9c\xe8\xa5\xe2\x17\xaf\x71\xc2\x66\x75\x8e\x58\x5d\xac\x5e\x34\x4c\xe6\xd6\x4b\x63\x2a\x25\xd9\x84\x3a\x6f\xab\xfe\x22\x55\x1e\x2f\x23\x36\xcf\x4c\xd2\xd6\xf6\xc7\xc8\x83\xd7\xce\x37\x46\x48\xca\x70\xf1\x86\x50\xe5\xe6\xfd\xd1\xa9\x80\x52\x24\xcd\x1f\x3e\x38\x1f\x4a\x14\x25\x0b\x0f\xde\xb8\x1d\x72\xb0\x7d\x9f\x78\xf0\xb5\xf3\xc1\xb2\x38\xe3\x9f\xdf\x58\x4c\xf1\x0d\xbf\x0a\x8e\x4d\x94\x70\xa5\x15\x1f\x6e\x6f\xc5\xab\xb8\xd4\x65\x2d\x56\x55\x5d\xa8\xaa\x12\xef\x88\xba\x49\xc4\xa2\xae\xaa\xbc\xfc\xbc\xf9\x93\x37\x76\x8a\x94\x81\x57\xbb\x1e\x08\x26\x69\xc4\x7c\x30\x68\x7e\x1a\xe8\x7c\xb7\xf3\xf2\x0a\x75\x0d\x2b\x3e\xdc\xde\x7a\xa9\x38\x9b\x5e\x75\xf3\xad\x20\x83\x35\xf5\xb7\x17\x2e\xbf\x9d\xb7\x4a\x06\xe8\x3c\x36\x47\x9d\x83\x45\x75\xe2\xfd\x6e\xdc\xfb\x5d\x02\x7b\xbf\xfb\x6e\xf0\xbb\x57\x1e\x18\xcc\x4d\xa5\x89\xaa\x00\x3d\x50\x2d\x54\xed\x2e\xf8\xb5\x46\x54\x25\x5d\x5d\x05\x4f\xfe\x4f\xe9\xc9\xbd\xb3\x4e\x9e\x56\x2f\x36\x24\x1a\xeb\xfb\x11\x9e\xf8\x8f\xb4\xe6\x53\x61\x32\x16\x22\xe9\xc8\x25\xb6\xda\x60\x0d\x59\xa4\x66\x5b\x4f\x89\x2f\x98\xa2\x12\x23\x0a\x7c\xd6\x1a\xff\x3f\xf9\xd6\xef\x3b\xfe\xa2\x3d\xbe\x81\x96\x1e\x4b\x5d\x96\x0b\xce\x93\x38\x30\x74\xee\x91\x3c\xd6\x17\x1c\x15\x99\x8a\xd6\x3a\xe4\x97\xdb\xdb\x9f\x80\x2c\xe4\xe7\x47\x86\x94\x58\x3c\xbf\xc1\xf4\xf5\x64\x42\x91\x0a\x60\x28\xe0\x02\x3b\x41\x20\x07\x79\x2b\x42\x1a\x6a\x17\x19\x51\x7d\x80\xa0\x38\x91\x4c\xfa\xca\x40\x1c\xb6\x10\x36\x83\x3e\x0b\xbf\x62\x43\x34\x02\x40\x59\x71\xac\x87\xb7\x86\x0c\x16\x24\x26\x97\x83\x2f\x1a\x83\x6b\x90\x2f\xe4\x94\x3b\x06\x35\x6b\xb5\x06\xc7\x61\x13\xd8\xb6\xd8\x57\xf8\x58\x0d\xb4\x12\x94\x0b\x05\xca\x77\x2d\x50\xde\xb8\xa0\x14\xf3\x52\x50\xe3\xdf\xdc\x79\x6f\xb5\xfe\xc8\x2c\x8a\xf3\xba\x5f\x13\xc6\x48\xe6\x03\x49\x75\x64\x4b\xb9\xb9\x20\x60\x38\xbe\xa4\xfe\x33\xf9\x87\xb9\xeb\x72\x39\xef\xc4\x37\x77\x7c\x7b\xc2\xe1\x93\xdf\x0b\x22\x1e\x23\x9c\xfa\xe8\xe4\xec\xc9\x29\x78\x7c\x66\x80\x25\x86\xd0\x94\x8c\x6f\xa0\xaf\x6c\xf6\x38\x05\x1d\x62\x98\x8f\x42\x74\xa4\x09\xbd\x9f\xf7\x31\x38\xf1\x59\xff\x8c\x13\xf1\xe1\xe8\x68\x42\x4a\x5f\xd8\xa5\x85\xa7\x7f\x21\x7f\x65\x7f\x21\x8f\x1f\x83\x54\x8a\xa6\xf8\x71\xf9\x7b\x62\x16\x9b\x56\xc0\xc7\x90\xd5\x9b\x3f\x3c\x1b\xf5\xf1\xf0\x74\xf4\xd5\xd9\x39\xa7\xbb\x03\x79\xd0\x17\x5d\xd0\x6c\x6d\x68\x13\x72\x6f\x39\x89\x6b\x02\x6e\x61\x01\x4e\xdc\x65\xaa\xca\x05\xb4\x3a\xe1\xf8\xef\x25\x4e\x38\x3e\x35\xa3\x0f\x61\x10\x04\x68\x14\x5a\x0d\x0f\x19\x5f\xfd\xba\xc0\x1f\x91\xdf\xd7\x8e\x62\x57\x11\x7d\x89\x33\x94\x4b\xeb\x1d\x41\xc3\x1b\x93\xf3\x3c\xeb\x90\x49\x73\x05\xfb\xd1\x45\x51\x54\x85\x87\x7a\x67\xcd\x77\x17\xf5\x35\x10\x66\xe1\x17\x42\xd0\x22\xa5\xef\x05\x37\x52\xb6\xaa\xcd\x81\x8e\x8f\x85\x89\xf8\xd7\x5f\x93\x1b\x1f\x04\x92\x65\xa8\x77\xe3\xbf\xf8\xac\x0e\x1f\x75\xb1\x7e\x54\xb1\xf6\x7a\xad\xf2\xec\xd6\x98\x51\x1c\x60\xce\xc2\x9d\xca\x0b\x28\x27\xd9\xaf\x0f\xbb\x04\x0e\xa8\xa7\xbd\xa9\x07\x31\x60\xbf\xc6\x94\x62\x99\xca\xe0\xdb\xd9\x18\x73\x22\x10\x64\xea\x3c\xc8\x9b\x29\x79\x42\x1f\x40\x79\x4f\xec\x0b\xa5\xbe\xa8\xd5\x2e\x53\x34\x61\x03\x04\xc5\xa0\x03\xd6\x47\x90\x8b\xee\x18\xca\x65\x0c\xf2\x3e\xae\x2a\x92\x7f\x9f\x53\x54\x32\x63\x8d\xaf\x20\x19\x22\x39\x61\x19\x06\xc7\x9e\x95\x21\x3c\x69\xcd\xb2\x0a\x80\xfb\x6b\x77\x62\x46\xae\x50\xd9\x67\x51\x39\x45\xcc\xab\xd1\xa6\xec\xff\x79\x4d\xe4\x82\x31\xce\xa5\xfb\xb5\xc6\xeb\x47\x2c\x20\xb9\xef\x65\x64\x4e\x11\xca\x85\xc9\x77\x33\xce\x47\x6b\x3e\x05\x11\x9e\xe6\xbe\x5c\x03\x18\x9e\x8e\x8e\x72\x95\x73\xec\x15\xef\xe5\x7f\x86\x0c\x62\x9f\x01\x28\xb4\xd0\x34\x9e\x21\x2e\xb9\x00\xdf\x8b\x26\x0c\x95\xd2\x7d\xd3\x83\x39\x14\x06\x8b\x79\xa0\xd9\x56\x2e\xeb\x09\x75\x96\x35\xa1\x8c\x70\x76\xf6\x8e\xe6\xe3\xf4\x9d\xa2\x48\x74\xce\x67\xb1\x5c\x3b\x55\x69\xc4\xc8\xeb\x09\xa0\xd6\x13\x3e\x03\x2a\xd4\x93\xc5\x46\x48\xfb\x9f\x66\x69\x14\x0e\xb9\xcc\x5c\xb5\xb6\x83\x2f\xc8\xdc\x41\x4e\x9b\x6e\x6f\xeb\xbf\x95\x38\xd5\xe0\x48\x96\xf2\x90\x0e\x18\x94\xa4\x1c\x43\x79\x36\x07\x39\x14\xf4\x6b\x50\x2a\x8f\xf6\x14\xb1\xa5\x66\x49\x07\xa9\x24\xf8\xc4\x76\x8e\x4d\x6f\x6f\xfd\x34\x14\xb1\x00\x3c\x48\xc2\xe1\x52\xf2\x04\x7a\xf0\x6a\xa4\x8f\x62\x64\x51\xea\x31\xa6\xf2\xc4\xd5\x32\x57\xc0\xaf\x01\x9c\x87\x2c\xc0\xf9\x95\x3c\xea\x30\x0e\x89\x32\x47\x54\x64\x47\x9b\x23\xa2\x61\x3a\x12\x7c\x56\xde\x5c\x9c\x88\xee\xac\xc6\xa3\x61\xe4\xe7\x70\x0e\xcf\x44\x34\x94\x21\xed\x9f\x8d\x60\xc2\xff\x90\x4e\x53\x85\x46\x36\x45\x18\x1f\x1f\x3f\x4a\xce\xe3\xc1\xbc\x1f\x0f\xf1\xe8\xab\x64\x88\x47\xfd\xf9\x79\x32\x88\xe1\x52\x92\x65\xc9\xe9\xcc\xb3\xc1\x52\xf2\xa6\x0c\x25\xff\x73\xb0\x05\xf3\x58\xf0\x95\x41\xd3\xe6\xbf\x07\x0e\xc3\x57\x0c\xcb\x11\x50\x5d\x17\x15\x14\xaf\xd5\x03\xa2\x96\xd4\x67\xfd\xb3\xaa\x02\x40\xbc\xb5\x44\x31\xf3\x01\x4c\xc2\xd8\x68\x30\x28\x29\x99\x01\x8c\x40\x60\xd1\x98\xfa\x28\x10\xbd\xc9\xff\x17\xeb\x00\x7d\xf3\x91\xb5\x3f\x02\x7e\xcc\x61\x11\xd6\x75\xfc\xc4\xa9\x05\xfa\x08\xc0\x2c\x8c\x83\x09\x4e\xf9\xf5\xf0\x73\x6b\x3c\xe6\xe7\x1d\xd5\xff\x5a\x3c\x3e\x3b\x05\xca\x55\xc9\x3a\xbd\x59\xfb\x94\x37\x46\x83\x5d\x4c\x6e\x28\x11\xa4\x86\x71\xdd\x56\x00\x97\xe3\xca\xbc\xfd\xa9\x1c\x81\xfe\xd9\x69\x55\x95\xd2\xc9\x7b\x16\x95\xcc\x6f\xa2\xce\xe3\x63\xd9\x2a\x23\xf3\x9c\xbd\x7c\xfa\x8d\x2c\xa5\xbe\x42\x37\x39\xba\x61\xca\x16\x7a\xb9\xa2\x9e\x28\x16\xf2\x69\xf8\x48\x11\x0e\x7d\xa5\x95\xfd\x44\xfb\x9e\x8a\x62\x1b\xa7\x70\x6c\x02\xaa\x56\xe7\x4b\xd5\xdd\x4b\x44\x59\x49\x16\x28\x51\x0f\x35\xa6\x04\xe7\x53\x7e\xf1\x76\x42\xee\x9a\xb8\x03\xa9\x86\xaa\x09\x24\x80\xbb\x75\xb4\xe8\xe8\x68\xb1\x5f\x47\x53\xcd\x5a\x39\xbd\x19\x96\x0b\x80\x4a\xd9\xba\x62\x92\xbf\xd0\x61\x3a\xea\xfb\x46\xf2\xe7\xcd\xcf\x0a\xf6\xdd\x1f\x39\x4b\xd7\x26\x96\xcb\x6d\xb8\x14\x7a\x35\xd5\xde\x77\x92\x34\x87\x48\xa5\x06\x97\xfc\x85\xc5\x3a\x98\x2f\x82\x71\xd0\x07\xc5\x3a\x89\x55\x05\x67\xe1\x2b\x7f\x62\xbf\x46\x28\x2d\xcd\x10\x07\x42\x4f\x8e\x92\xbd\x9f\x21\x0c\x99\x33\x0c\xce\x69\x55\x01\x38\x75\x47\xd4\x0a\xa0\x4f\x37\xe4\xc2\x1d\xb2\xd6\x2d\x7d\x8a\x41\x1f\x71\x84\x09\xaf\xdc\x41\x1b\x6a\xab\x4f\xb2\x58\xf1\xf0\x53\x01\x78\xbd\x72\xe8\xe8\xd3\x8c\x3c\x1c\xf1\x61\x3f\xba\xc3\xb6\xf4\x6d\x9f\x74\xd5\x1f\xdc\xe1\x8d\x36\xef\x93\x0e\x7b\xe3\x0e\xab\x74\x85\x9f\xee\x64\xbd\x6e\xc1\x59\xab\x21\x87\xd9\xa1\x8f\x86\x6f\xdc\xbe\x1d\x4d\xe6\x70\x7c\xe8\x08\x4e\xff\x8a\x75\x11\x91\x79\xb6\xf5\x34\xec\xec\x00\xc0\x89\xfd\xa8\xeb\x0c\xb3\x38\x74\x98\xc5\x56\xc3\xd8\x4a\x33\x0f\x0e\x13\x4d\x86\x76\x1c\xac\xd1\xcd\xfa\x11\xb5\x4c\xb6\xff\xca\x4c\x0f\xeb\x07\x72\xe9\xd5\xfe\x03\xb6\x7a\x72\x06\x9e\xd8\x2f\xd6\x2f\x36\x3f\x02\x53\xd6\x8f\xe2\x98\x94\xc9\x3e\xb1\x48\xd6\x7a\x43\x3e\x58\xf6\x3d\x58\xf6\x3d\x3c\xec\x7e\x6a\xcb\xbe\x86\x7f\x54\x7d\x93\x95\x95\x5f\xb7\x53\x68\xdb\xbc\xfd\x12\x2d\x3c\xe8\x51\x32\x2f\x63\x14\x0c\x47\x9e\x8a\xf9\x5b\xe7\xe4\x11\x51\x99\xd1\x8b\x28\x9e\x6d\x70\x38\x4d\xef\xc6\xf2\x4e\x4e\x08\x27\x9e\x6d\x32\xc7\x67\x57\x9b\xd2\x8d\xed\x68\xc9\xf5\x4c\x1f\x9d\x59\x4d\xea\x49\x1b\xdb\x3a\x92\xbf\x13\xee\xf5\x3e\x58\xca\xb7\x3f\x89\x9f\x50\x72\x21\xfa\x77\x25\x89\xba\x0b\xc8\x64\xc9\x25\x5a\xc0\x3c\x7c\x8f\x19\xca\x82\x2f\x96\xac\x7a\x0f\x4b\x53\xb5\x9e\x08\x4c\x55\xa1\x84\xa9\x50\x81\xa4\x46\xfd\x41\x42\x61\x8f\x9f\x7c\xbd\xf0\x73\x28\x36\x63\x8a\x18\xf0\x53\xc8\x80\xd1\x29\xf2\x01\x06\x29\x94\x81\x19\x06\xe4\xfc\xd1\x23\x12\xa8\x1f\x65\x55\x01\xd0\x78\x81\x32\x91\xb3\xf5\x72\xc5\x61\xab\xba\xcc\xb3\x24\x14\x0f\x0f\x13\xed\x74\xec\xc0\x71\x3b\xb3\xf5\xb5\x3d\x38\x96\x66\x6d\xdb\x2f\x6b\xb9\x9f\xc8\xe2\x6b\x37\xfa\x79\x62\xfe\xea\x8f\x49\xb2\x6d\xa2\xc9\xdf\x5c\x86\xfc\x47\x67\xc2\xe7\x51\x47\x14\xf9\xf5\xa5\xc8\x5f\xb9\x6b\x33\x14\x25\x9f\x66\xd7\x0c\x81\x2e\x7f\x5e\xc6\xe0\xce\xe2\x4d\x0a\x82\xd1\x49\x6b\x24\xd4\xf8\xf1\x69\x56\xb2\xdc\x71\x15\xda\x1a\x60\xda\x4f\xa5\xbe\xc2\xe4\x6c\x13\x73\x1e\x88\x90\xb5\x26\x5e\xad\xea\x69\x7d\xbc\xda\x8e\xf1\xf7\x27\x3b\xa5\x36\x3d\x59\xd5\xbd\x88\x2f\xa4\x6b\x8d\xe7\x8c\x91\x5c\x79\xe7\xa8\x68\x2d\x5e\xfd\xd9\x8e\x53\x54\x97\xd5\xcb\x6d\x76\x86\x65\xfa\x65\xce\x1e\x54\x24\x7f\x91\x12\x2a\x48\x13\xc9\x79\x27\x22\xd8\x3f\x3f\xde\xfa\xbf\x5d\xa2\x0c\x8a\x63\x5e\x44\x53\x9c\xeb\xb4\xdb\x77\xc6\xdd\x6f\xe3\x99\xd9\x99\x67\xe6\x21\x4e\xf6\x03\x43\xfc\x89\x42\xa7\x94\x6b\x98\xd2\x16\xc3\x4b\xf1\x47\xe4\x41\xaf\x88\xa6\xdd\x8e\xa1\x0d\x56\xb8\x51\xb7\xcd\x3c\xb7\xea\x76\x45\xe6\xb3\x2b\x89\x9e\xa0\x47\x8b\x52\x60\xae\x8e\x20\x2d\x5d\xb5\x65\xcf\xdb\x32\xd7\x3b\x64\x80\x57\xfc\x5a\x1d\xa1\x25\xf9\xd5\x46\x68\x31\x19\x52\xc4\x96\x3c\x79\x56\x97\x48\x28\x9d\x59\x55\x24\x74\xe1\x13\x15\x30\x98\x33\xe7\xf4\x39\x73\x2c\x83\x78\xb3\xfe\x19\xf8\xbd\x64\xa2\xf1\x47\xf4\xf8\x4c\x54\xe7\xb0\x7d\xde\x32\x2f\xc0\x56\xab\xba\x89\x7c\x1c\x90\x11\x4e\xe4\xbe\xc9\xd7\x3f\x0f\x28\x4f\x9e\x88\xb2\x37\xd1\x14\x39\xbd\x09\x7b\x9d\x95\x4d\x4f\x4c\xf7\xb2\x13\x3e\xe4\x0f\x38\xaf\x6d\x81\x96\x72\x81\x03\x04\xf9\xa7\x01\x83\x7a\x98\x01\x56\xef\xbe\x78\xe2\x9f\x89\x68\x2f\x5a\xcf\x7c\xa4\xdf\x5e\x8d\xb1\xc4\x19\x64\x7d\x04\x60\x19\x9a\xf5\x61\xc8\x1e\x23\xf0\xd8\x18\xcf\x0a\x73\x61\xbf\xec\x73\xf4\x88\xf9\x6e\xf0\x6b\xdb\x78\xd1\xf5\x97\x7c\x02\xff\x10\xc1\xe8\x06\xf9\x63\x26\x5e\xc3\xa4\x07\x13\x6d\x45\xd4\x93\xf0\x0a\x9b\xc0\x47\x4d\x51\x46\x02\x42\x22\x3f\x26\xa6\x23\x04\x99\x6c\x85\x20\x53\x1e\x1e\xda\xc5\x15\x2b\xc4\x49\xd9\xce\x9f\xb8\xbb\xa9\x23\xba\x38\x23\xc8\xc3\xb5\x87\x2f\x8e\x6a\xb8\xbe\x77\x7d\x0e\xf6\x90\xc0\x4c\xd3\xf5\x23\x98\xb3\xb8\x5d\xb4\xbe\x15\x6d\x37\xac\x02\xd3\x2d\xc3\xf4\xb5\x9b\x39\x3d\xef\x16\x3b\xc7\xe1\x9a\xcc\xef\xad\x43\xe9\xdc\x03\x79\x6e\x3f\x89\x49\xe5\x23\xfe\xb5\xe9\x88\x3b\x72\x19\x3e\xf0\x7a\xbf\x65\x5e\x2f\xeb\x70\x6b\x96\x67\xd3\x44\x2b\x6b\x46\xca\x53\xdf\xa2\xd5\x0c\xe2\x4a\x7e\x6d\x39\x1c\x41\x4c\xbf\x9d\xa7\x9c\xf8\xa1\xa4\xf2\x00\x4c\xfd\x79\x48\xb6\xd7\x72\xfe\x26\x19\xb1\x15\x9a\x53\x9b\xb3\x92\xab\x91\x71\x3c\x05\xbb\x80\x38\xab\x90\x91\x04\xa5\x03\x24\x78\x04\x4e\xd4\x8b\x15\x44\xfd\x70\x4f\xd1\x4d\xda\xc9\x5d\x09\xd7\x06\xed\xa4\x51\x1f\x3a\x2a\xc4\xac\x02\xe0\x68\x3b\xd4\x2a\x72\xbe\xf7\xc7\xdb\xea\x0d\xef\x2e\x86\xd2\x83\xa4\xfe\x80\xbd\x7f\x01\x49\xdd\xc2\xde\xb3\x3a\x9c\x5f\x97\xd6\x4f\x7b\xd8\x91\x8e\x98\x80\x98\x2a\x2f\x63\x07\xcb\x77\xaa\x21\x95\xf3\x7c\x1d\x4b\xc9\xcd\x6a\x3e\x48\x10\x8d\x07\x91\xf0\xdb\x6b\x13\x05\x99\x43\x43\x24\x48\xe7\x82\x39\xff\xa7\x5b\x7a\x6f\x26\x4a\xaf\x4d\xa6\x00\x2c\xfd\x38\x4c\xfd\x38\x54\x81\x57\xb3\xed\x63\xaf\x76\x11\x0f\x93\x13\xab\x31\x31\xcf\x12\x8b\x75\x89\x0a\x2b\x2e\xe7\xe1\xb8\x24\x59\xad\x75\x10\x2a\xde\xce\x4a\xb4\x73\xd1\x58\x51\x6d\x52\xd3\xb0\x98\xd4\x06\xcb\xcd\xe5\x3b\x01\x09\x2c\xeb\xb1\x2d\x30\x70\xd2\xd9\xd4\x09\x93\xe9\x84\xe6\xec\x9a\xf1\x1e\xd1\x39\x3b\xbb\x59\x17\xa0\x73\x9f\x40\x9d\x16\xf2\x17\xff\x7f\xff\xde\x8d\x98\x98\xf1\x27\x12\x36\x14\x50\x3e\xdd\xb3\xcc\xa7\x02\xca\xc6\x27\x89\xdd\x81\x42\x22\x7e\x02\xfb\xb4\xc0\x79\xde\x92\x45\xb7\x8b\xd9\xf0\x4b\xe4\x25\x3b\x9c\x2d\x2e\xa2\x39\xe5\xc2\xe2\x7d\x48\x4d\xd6\x91\x05\x4c\x4f\x9f\x86\xb6\x51\xe3\xde\x99\xc0\x3a\xcd\x1a\x1f\x32\x83\xfd\x56\x32\x83\x65\xd1\x62\x8c\xfa\x38\xef\xd7\xf6\xb7\xd6\x3d\x97\x28\xce\xad\xb3\xb6\xfd\xc8\x0d\xa0\xb5\xf3\x4d\x5f\xd9\x40\x2d\xca\x6b\xdc\xb8\x47\xa7\x70\x8a\x58\x87\xc9\xaf\x41\x04\x55\x05\x36\x42\x61\x9e\x32\xac\xd8\xba\x7e\x52\x92\x22\x21\xd7\x9f\xc4\x3a\xd1\x8a\x56\xf3\xc9\x72\x36\x3c\x98\x2b\x3e\x98\x2b\x7e\xe6\x32\xdf\x2c\xec\x4c\x59\x6c\x6e\xf6\x66\xdd\x5c\xf7\xa7\x1d\xd4\x70\x5d\x3c\x86\x36\x13\x24\xc2\x42\xbf\x2b\x4a\x5f\x1d\xbe\xaa\x70\xac\x0e\x6d\x23\x0f\x5d\x56\x63\x2a\x6d\xce\x21\x5d\x8f\x7c\xb0\xac\xe2\xa8\x60\xf3\x12\x19\xc7\x27\x61\xb0\x57\x37\x40\xa0\x4a\x70\xf2\x16\xc5\x08\x5f\xa1\xe7\x8c\x95\x54\xcf\x39\x68\x95\x37\x1d\xb2\x75\x1f\x47\x4a\x16\xe3\xd3\x3a\x3e\x46\xc7\xc7\x0d\x3f\xd6\xd7\x79\xdc\xed\xcb\xaa\x1c\x9b\x0a\xe5\x66\xf2\x52\xf5\x06\xaa\x76\x99\x76\x69\xd3\x23\x2a\x03\x76\xbb\xb9\xaf\x53\x4d\x89\xbb\x89\xd8\xf2\x12\x2d\x06\xac\x32\x21\x06\x94\x2f\xb2\x81\xab\xbe\x44\x47\xd8\xca\x20\x04\xce\x71\x50\x0a\x7f\x5f\x79\xfa\x7c\x06\x06\x38\x88\x92\xc4\xfc\x94\xb3\x36\xe0\xc5\xa0\x22\x05\xca\x5f\xe7\xcf\xcb\x92\x5c\xbf\xe4\x53\x15\xa4\x4e\xc7\x44\xae\x61\x0f\x2d\x20\xdd\xde\x7e\xc9\xaf\x9e\x40\x30\x2f\x48\x82\xea\xfa\x1a\x88\xfe\x9f\x43\xeb\x3b\xaf\x6f\xff\x06\xdb\xf9\x9c\x19\x70\xf5\x59\x89\xa7\x53\x54\x7a\x80\x4b\xa0\xcf\xb5\x9a\xc3\xf7\xa2\x12\x47\x7d\x72\x2d\x6c\xf9\x71\x98\x90\x78\xde\xd1\xcf\xfb\xff\xf1\xc5\x12\x55\xbd\xba\x37\x79\x68\xdf\x83\x23\x2c\xe2\x1b\x4e\x48\x3c\x17\x1e\x8d\x41\xc1\x11\x52\xce\x5e\xca\x6b\xe0\x03\x50\x55\x28\xa5\xa8\x87\xcc\x7e\x71\x60\x09\x28\xb6\xea\x56\xac\x8c\x04\x36\xfb\x01\x53\x66\x80\xf8\xe4\x8f\x8d\x75\x2f\xbb\xcf\x1f\x9e\xf0\x4d\xaf\x47\x89\x85\x29\x13\x03\xcd\xad\xdf\x1e\x4a\x7c\x61\xeb\xd6\x05\xbb\xee\x91\xbc\x78\x72\xc1\x78\xe2\x3f\xfd\xd3\x8a\x99\x07\xd2\x3f\x5e\x74\x8a\xc9\x9c\x2a\xb7\xcd\x0b\x3c\x4e\x71\x3e\x3d\xe2\xd7\x07\xad\x85\xa9\x1e\xc1\x39\x13\xed\x11\x72\x74\xc3\xf6\xeb\xfd\xe9\x13\xbb\x6b\xed\xec\x4a\x51\x9e\xf8\xda\xe8\x0c\xa2\x15\x3b\xde\x36\xfc\x35\x48\xee\x53\x44\x61\xac\xf1\xe4\xe1\x86\xb8\x4e\xdf\x7a\xa5\x3b\x24\x53\xeb\x6a\xef\xa8\xeb\x5b\xc0\x69\xa0\x8f\xfd\x47\x73\x3b\x5a\x3f\xac\x7d\xdb\x0e\x58\xa1\xdd\xcb\xaa\x67\x89\x5d\xac\x9a\x85\x5d\x46\x1a\x2d\xc8\x7c\xdb\x40\xdf\xbf\xa4\xda\xa5\xc1\x52\xd8\x53\xff\x04\x16\xcd\xff\x3e\x67\x0c\x95\xbf\x56\xbb\x66\xb1\x78\x8a\x3f\x22\x25\x3a\x6d\x2b\x31\xe9\x6c\xd1\x6b\xf4\x43\x86\x63\x4f\xef\xa3\xfd\x32\xf9\x14\x7a\xa9\x39\x45\xe5\x05\x62\x0c\xe7\x53\x7a\x2f\xb4\x53\x30\x35\x11\xac\x85\xa2\x52\xbe\x14\xa4\x96\x01\xdd\x05\xfe\x88\x5e\x1b\x3a\x71\x76\x0a\x9f\x3c\x83\xcf\x4e\x47\xc2\x30\x79\xa6\x02\x78\x55\x15\x8c\x1a\x3a\x2e\xea\x82\x62\x1e\x0e\xb1\x49\x14\x1a\x1f\x96\xf2\xbe\x70\x15\x5b\xf1\x0a\x41\xb0\xe0\x82\x60\xac\x04\xc1\xa2\x29\x08\xda\x3f\x61\xe1\x0a\x82\xc5\x4a\x41\xb0\xb8\xbd\x2d\x5c\x41\xb0\x68\x0a\x82\x45\x38\xdf\x5d\xb1\x15\x41\x6a\x14\x5b\x05\x80\x89\x25\x08\x16\x8e\x98\x56\x28\x41\xb0\x51\x7e\x5e\xb4\xf7\x39\x31\x82\x60\xb1\x5e\x10\x74\x47\xe8\x3e\xaa\x7c\x8a\x05\x5f\x9e\x56\x6c\x15\x5a\xb1\x65\x2b\x3b\xea\xcb\x46\x36\xe2\xa6\x34\x8a\x05\x13\xd4\x9f\x44\x38\x9d\x97\x3b\x1a\x12\x9d\xac\x36\x3d\x37\x48\x0a\xa6\x35\x9a\x22\xf7\x11\x4d\x45\xa1\x76\x7d\x20\xa5\x0a\x80\x2f\xb2\x0c\x07\x06\x78\xdf\x4a\xd8\x71\x88\x71\x30\xa2\xe4\xdd\xbf\x3f\x4f\x53\x12\x7b\x7c\x8b\xee\x06\xc1\x11\x2b\xcc\xbd\x18\x5d\x47\xb9\xd7\x1f\x9a\x03\xab\x8f\x96\xba\xbe\x3d\xd7\x1a\x37\xa6\xbf\x56\xdc\x58\x55\x90\x86\xa5\x85\xd5\xe6\x9d\x2b\x89\xc3\x61\x3e\x82\xc9\x61\x38\x2d\x73\x71\x5a\xb2\x02\xa7\x65\x1c\xa7\x25\x0a\xa7\x65\x4d\x9c\x66\xff\x84\x99\x8b\xd3\xb2\x95\x38\x2d\xbb\xbd\xcd\x5c\x9c\x96\x35\x71\x5a\x66\x85\x28\xda\x1a\xa7\x71\xa4\xa0\x71\x5a\x06\x60\x61\xe1\xb4\xcc\xc1\x38\x99\xc2\x69\x8d\xf2\xf3\xac\xbd\x3f\x85\xc1\x69\xd9\x7a\x9c\xe6\x8e\xd0\x7d\xc4\xf8\x14\x33\xbe\x3c\xa5\xdc\x0a\x33\x58\x4a\x9c\x66\x30\x1a\xcc\x2c\x9c\x16\x6d\xc6\x69\xf3\x29\xce\xfb\x11\xbf\x08\xc2\x58\xb4\x9d\x01\xad\xab\x99\x5b\xff\x33\xf6\x28\x5b\xef\xe2\x15\x93\x9c\x95\x24\x4d\x51\x69\xc1\xd8\xb3\xbd\xb4\x72\x92\x20\xfb\xdb\xdd\x78\x81\xc9\x7d\x7d\x6e\x0d\xa9\xa8\xa0\x0e\x93\xec\x7e\xe9\xd0\xdd\xd5\xca\x89\x56\x6d\xa3\xb8\xa8\x47\xf0\x41\x15\xd1\x45\x1e\xf7\x9c\x52\xa3\x92\x72\xa7\x74\x7c\x2c\x6d\x2d\xea\xce\x6b\xd5\x43\x74\x1d\x61\xd6\xeb\x6c\x26\x34\x4f\x56\xff\x47\xed\x18\x55\x7e\xf7\xcc\xb5\xee\x4c\xc6\x9f\xb8\x60\x11\xa3\xef\xc4\x63\x66\x29\xf4\x0d\xae\xac\xb2\xf1\xa1\xab\x20\x85\x88\x53\x98\xa1\x7c\xbe\x6f\x36\xa9\x03\x1e\x6f\x8c\x1d\x71\x7d\x8f\xa2\xfb\x76\x8f\x74\x8c\xbc\xa1\x17\x0d\x72\xc2\xfc\x61\x82\x29\x1f\x28\x19\x01\x4f\x3b\x29\xb6\x3f\xfc\x1b\xce\x8b\x39\x73\xcb\xe5\x6f\x4e\xf9\x42\x6f\x86\x93\x04\xe5\xde\x08\xfc\x1b\xf4\x18\xba\x61\x51\x89\x3a\x06\xf8\xb7\x21\x8b\xc6\x22\xdc\xdd\x68\x45\x67\xea\x73\xe8\xf5\xcf\x78\x67\xa3\xe0\x03\xc1\xb9\xef\xc1\x9e\x07\x74\x92\xd7\x96\xad\xae\x3a\x16\x1e\xf0\x7d\x72\xc0\x4d\x8e\x34\x13\x23\x95\x89\x2a\x6b\x1b\x17\x77\xa2\x0e\xfd\x7d\x5d\xf6\x52\xad\xa1\x59\x9e\x2a\x4f\x4f\xab\xb9\xab\x71\xfc\x45\xd4\xfb\xf9\x2f\xa0\xde\x5f\xab\x68\xff\x79\x15\xeb\x1a\x85\xdc\x81\x5e\xfd\x3d\x70\x8a\xe9\x1d\xeb\xd5\x2b\x11\x08\xb3\x91\x63\xb7\xa5\x73\x2c\x42\x4b\x03\xb8\x39\xe5\x2e\x59\xaf\x77\x1c\x37\xc6\x7b\x48\xbd\xfb\xab\x48\xbd\x9b\x86\x04\x80\xdb\xdb\xf4\x90\xac\xbb\x9c\x4e\x46\xa9\x0e\xf0\xdb\x61\x1f\x42\xf9\xa7\x88\xa1\x95\x8d\x82\x0f\xf4\x7e\xda\x85\xc8\x55\xec\xb6\xe6\x7b\xbc\xd8\x6b\xbe\x30\x69\x04\x23\x2c\x62\x0a\xd7\xfd\x4a\xae\xdd\xae\xb8\xb9\x83\xdf\x0e\x2c\x4e\x34\xe2\x3f\x14\x26\xa6\xa3\x7b\x0f\x9b\x7d\x41\x71\xff\x57\x7e\x32\x46\x13\x52\xa2\x7e\xfd\xcc\xb9\x17\x20\xdc\x6e\xee\x3f\x5c\x72\xd2\xcf\x22\x16\xcf\x10\xed\x67\x88\x52\xe9\x18\xbc\x1f\x6c\x3a\xba\xba\xff\xf0\x39\xf4\xc0\xfc\x76\x4e\x8a\xd0\x77\xce\x48\x9a\xec\x8f\x52\x1b\x7d\xfc\x06\x20\x62\x53\x8b\xa9\x54\x86\xef\x0b\x98\x76\x57\xf7\x1f\x3e\x14\x45\x65\x3c\x3b\x18\xaf\x38\xdd\xdc\x7f\xb8\x1c\xc8\x98\xdc\x73\x7e\xa4\xc4\x59\x54\x2e\xfa\x19\x62\x25\x8e\x4f\x6c\x25\xe2\x76\x6a\x3e\x86\xb2\x22\x8d\x18\xea\x4f\x22\x2e\x8b\x2f\x34\xec\x56\x39\xba\x48\xc0\xc6\x24\x97\x7e\x6c\xf1\xa2\xee\x2a\x41\xe3\xf9\xb4\x6d\xe8\xb0\x4d\x7e\xfa\x68\xa5\xd9\xb7\x76\x9b\x95\x3a\x44\x4b\x8a\x83\xb3\x5a\x9b\x38\xbd\x4f\xe6\xdf\x8b\x07\x33\xec\xdf\xba\x19\xb6\xd4\xa8\x5d\x29\x93\xa9\x12\x45\x0c\xbd\x53\xf7\xec\x5b\x79\xcd\x80\xbf\xc4\xc9\xc0\x7b\x33\x3e\xfd\xef\xc7\xec\xcf\xff\xcb\x83\xe3\x94\xc4\x97\x83\x7f\x1b\x0e\x87\x67\x67\xf0\x74\x04\x87\x4f\xbe\x84\x22\xc7\xb1\x7d\xbf\xbd\x11\x1c\x9e\xfd\x11\x9e\x8d\xe0\xf0\x4b\x38\x7c\xfa\x27\x51\x71\xf8\xf4\x14\x9e\xc2\xa1\x8c\x87\xe3\x8d\x46\x23\xa1\x25\x35\x55\xce\xd6\x55\x39\x7b\xc2\xff\x0f\x7a\xff\xfc\x67\xde\xeb\x89\xde\x4f\xa1\x37\xfb\x52\xfc\x25\xc6\x17\xce\xc0\x3d\x4c\xfb\xcf\x3c\xb7\xba\x6c\xf0\xe5\x19\x1c\x3e\xf9\x13\x1c\x3e\xfd\x23\x7c\x6a\x8d\xa4\xe7\x3b\x82\x5e\x5c\xcc\x3d\x33\xe0\x90\x37\xef\xbd\x78\xf3\xa3\xe9\x62\x04\x87\x23\xf1\x61\x73\x4f\x19\xca\x38\x86\x72\x3a\x7b\x25\x4a\xdb\xfd\xf1\x6f\x62\xd2\xb0\xd5\x95\x5c\x85\xae\xac\xfe\x5f\x96\xc9\x26\x4f\xdb\x60\x39\x35\x30\xd1\x7b\x32\x2d\xa3\x62\xa6\x36\xa5\x0d\x18\xbe\x92\x3f\xc3\x2f\xe5\x64\xe1\x70\xe8\xfd\x4d\xa6\xfc\x91\xff\x0a\xe7\x61\x7b\x67\x44\x06\x1c\xb1\x4a\x51\x4d\x2c\x41\xa4\xd0\x80\x52\xd1\x2c\x2a\x0f\xd5\x18\x02\xf0\x4f\x0c\xb8\xfe\xc0\xbf\x75\xfc\xfd\xc7\xae\x01\x14\xf4\x9a\xff\xe8\x49\x4a\x10\xe8\xff\xe9\x65\x9c\xc2\x27\x70\xe8\x3d\x2f\x91\x98\x57\x6b\x3d\x31\x49\x49\x79\xa1\xb2\x4d\xff\x4d\x3c\x43\xe8\xa5\x3d\x85\xc3\x7a\x3d\x6a\x26\x56\x75\x55\xfa\xa5\x7d\x22\xd5\x02\xf9\x17\xfe\xc1\x2a\xd7\x93\xe2\x97\xc3\x6c\xb1\x82\x78\x73\xba\xcf\xe0\xd0\x7b\x27\x23\xd3\x4b\x48\xca\xcb\x84\x69\x9f\xe6\x51\x51\x2c\xec\x65\x68\xda\x6c\xc3\xb7\x09\x02\x7e\x27\x52\xdc\xb1\xcd\x4e\xa5\x33\x73\x42\xe4\x1b\x86\x69\xa0\x3e\x3d\xe3\xcb\x7f\xf2\x67\x0d\x82\x3e\xbd\xe6\xf2\x5d\x4f\xfe\xd3\xf7\x56\x00\xc8\xdb\x58\x41\x7d\xf9\x93\x3c\xc9\x72\xc8\xa7\xe6\xe0\xff\x01\x0e\xbd\x3c\xca\x90\x3a\xf6\x4f\x2d\x18\xef\x79\x7b\x7b\x6b\xd7\x2e\x49\x4a\x0d\x2c\xd9\xff\x33\xf8\x27\xd5\xff\x1f\xe5\x91\x98\x67\x1e\xf4\x84\xb3\xa6\x75\x24\x9b\xd3\x3b\x18\x33\xec\x37\xd1\x3f\xef\x3f\xd1\x3d\x06\x55\x03\xa9\x9c\x57\x0c\x25\xff\xdd\xda\xa8\x66\x87\x1d\x28\xab\x31\x5a\xbb\x9d\x68\xf3\x07\xf8\x47\x79\x42\x9c\xcf\xe2\xe3\x33\xe7\x43\x27\x0e\x94\x08\xed\xec\xd4\xc2\x00\x22\xa3\xbd\x7e\xef\xfb\x5b\x81\xca\x58\xbe\x01\x9b\x2d\xb2\x2a\x58\x18\x40\x21\x8e\x34\xa2\xec\xb5\xe6\x09\x4d\xe3\x16\x2e\xe8\xc0\xc0\x75\x82\x23\xe7\x56\x1e\x76\xa6\xf5\x65\xa7\xac\x24\xc2\x83\x7b\xd5\x19\x5e\xb5\x88\x95\xc7\xa4\x77\xa2\x49\x51\x47\x4f\x25\xe2\xac\x32\x4a\x9e\x8b\xac\x56\xcd\xf6\xd0\xeb\xbd\x23\x2c\x4a\xef\xf0\x42\x6c\x5c\xe5\x9f\xef\x6c\x95\x7f\x5e\xbf\xca\xa1\xe1\x48\xe0\xd0\x7b\x85\xbf\xf6\xcc\x29\xec\x5a\xf4\x16\x0b\xd8\x66\xd2\x1d\xb3\x5d\x33\x43\x7b\x2e\x2b\xef\x9f\xd7\x46\xac\x2e\x7e\xf0\x8e\x23\xc6\x4a\x7e\x4d\x62\x0f\x6a\x62\x0c\x3d\x9c\xdc\xb8\x45\x1a\xe5\xf0\x4f\x23\x38\x89\x52\x8a\xf8\x92\x70\xd2\xc7\x2a\x7d\x8a\xf8\x21\x4d\x43\x78\xbd\x09\x97\xca\xfe\xa5\xb2\x06\xd0\x3e\xc3\x19\xea\x9b\xde\x50\x14\xcf\x3c\xe8\xf5\x85\x2f\x7c\x3f\x2a\xcb\x88\x0b\x6c\x8a\x7d\xf7\xa0\xc2\x3b\x7d\xfd\xb4\x9d\xf4\x67\xa8\x64\x1f\xbb\x3e\x8c\x17\x4c\xf4\xe8\x48\x9c\x2a\x9c\x49\x5f\x21\xb6\xd1\xbf\xc1\x4c\x70\xc8\xff\x88\x32\x34\xd8\x4d\x64\x0d\x66\x63\xea\x41\x4c\x2f\x78\x39\x7b\x45\x12\x34\x78\x74\x56\x49\xf3\x85\xeb\xd0\x8f\x39\x3b\x1d\x29\x5b\x67\xe0\xeb\xe5\x4a\xbb\x18\xda\x2f\xd1\x14\x53\x56\x2e\x3c\x00\x13\x5e\x93\xda\x41\x62\x6c\xab\x25\x58\xb4\x3e\xab\x4e\x02\x16\xd1\x4b\x2a\x03\xc1\xaa\xbb\x04\x60\x26\x7d\x29\xf9\x27\x50\x8b\x39\xbf\xf7\xc1\x32\x21\xf2\x0d\x5f\xb7\x2e\x48\x9a\x06\x05\x2a\x39\xe8\x7c\x00\x17\x18\xa5\x89\x6c\x8b\x33\x44\xe6\x0c\xf8\x67\xa7\xa7\xa0\xba\x9e\xe1\x14\xf9\x8f\xf2\xc0\xe4\x0b\x47\x94\xe1\x7c\x2a\x64\xfd\xb1\x63\x87\x51\xee\x60\x87\x31\xb5\x12\x31\x68\x7b\x21\xfa\x56\x83\x05\x4e\x94\x53\xa5\xae\x56\x08\x63\x2f\x93\xe6\x5e\x04\xa0\x91\xab\xee\x4a\x44\x2e\xbf\xc8\xdc\xde\xb6\xcd\x54\xab\x62\xfd\x55\x26\xe7\xd6\x76\x4b\x8d\x9a\x9d\x53\x0c\xa6\x88\x69\x33\x27\xd7\xde\x6a\x55\xe6\x78\xd5\xfd\xb9\xd8\x51\x91\xd6\x41\x2c\xee\xbd\xde\x93\x2f\x54\x32\x42\x39\xfb\xf7\x40\xa7\x83\x97\x17\xa4\xbb\x33\x75\x0c\xea\x38\x6a\x9c\x7d\x1a\x20\x51\x2c\x13\x7a\xaa\xe4\xe4\xb2\x57\x2e\x86\x5b\x12\xb1\xe8\xbe\x89\x4a\xcc\x30\x82\xf2\xe8\xa8\x3f\xb2\xf5\x79\x63\x64\xdd\xee\xc5\x9b\x1f\x07\x1a\x87\x6f\x53\x5f\xca\x40\xd2\xe4\x55\x64\xdd\x35\x74\x77\xed\xd8\x9e\x08\x05\x3f\x21\xde\xaa\xc1\x78\x85\x24\xca\xa7\xa8\xf4\x06\xfc\x6f\x75\x77\x65\x22\xff\x9a\x0d\x5d\x3f\xc8\x38\x9d\x23\xba\x7a\x88\x12\x25\xfc\x2b\x29\x13\x9c\x47\xa9\x57\x09\x92\xa0\xed\x63\xd4\x42\x55\x8e\x42\x79\x64\xeb\x3b\x56\x5d\xe3\x34\x55\xe6\x74\xc6\xc6\xc7\x2e\x6b\x5e\x10\xbb\x8f\x38\xca\x63\x94\x3e\x4f\x53\xed\xdb\xa8\x41\x4a\xf1\x34\x8f\xd2\x37\xd1\x9c\x22\x6b\xa0\x0a\x4e\xc2\x85\x3f\x76\x33\x62\x74\x5c\xb3\x61\x7c\xa8\x4f\x9e\x33\x4e\x43\xa7\x37\x0f\x12\x54\xa0\x3c\x41\x39\xfb\x0f\xb4\x78\x21\x54\x67\x9b\x3d\xd8\x56\xf5\x07\xe0\xd8\xf6\x5f\x73\x06\x56\x10\xf1\xe0\x30\xd9\x71\x08\xdd\x72\x7d\xff\x9a\x48\x0d\x8b\x1d\xbb\x57\x0d\x9d\xde\x67\xee\x06\x69\x04\x77\x78\xae\xb9\xf6\xce\x8b\x34\x66\x74\x6b\x17\xc2\x8e\xe6\xce\xec\xc7\xb6\xd3\xe0\x35\xf4\x4f\x21\x0b\x28\x62\x2f\x34\xdd\xd4\xfa\x23\xe0\x5f\xc1\xeb\x5d\xd5\xc2\x4d\x22\xbd\xbf\x66\xd8\xad\x5c\xd7\x21\x79\xba\xe8\x0e\x7f\x78\x57\xda\xb4\x72\xb3\x36\xed\xe9\x1f\x2e\xe7\xcf\x4e\xbe\xfb\xd0\xd0\xa6\xd9\x72\x43\x4c\xd2\x79\x96\xd3\x1e\x45\x31\xc9\x93\x75\x3a\x9c\x96\xc8\x21\x9b\xae\xd0\xf5\x34\x6a\xe2\x3c\xc5\x39\xea\x0b\x14\xdc\xa9\x34\xd0\xfc\x6b\x51\x92\x69\x89\xb8\x68\xd4\x50\x0e\xe8\xe2\x9e\x14\xeb\xcf\x46\xd0\xeb\x61\xda\xa7\x59\x94\xa6\x8a\x29\x7d\x06\x9f\xc8\xca\x5a\x0a\xd0\x7a\xc0\x27\x23\x78\xaa\xf9\xf2\x91\x9c\x91\x97\x45\x9c\xc7\x3c\x5b\xa1\xbf\xa8\x59\xe0\x27\x6d\xd1\xb0\x25\x4e\x76\x2b\xc7\xd6\x6a\xcb\x24\xe0\xf8\x0a\x32\x9c\xe3\x6c\x9e\xad\x86\x61\x2d\x26\xe7\xe4\xba\x8c\x8a\x0e\xd9\xe4\xcc\x2c\x54\x88\x0f\x8c\xb3\xe6\xa2\xda\xa8\x2d\x35\x6f\xc3\x96\xaf\x14\x61\x35\xe3\x4d\xca\x9a\x19\x56\x5f\xc5\xb3\xd9\xee\x8c\x6e\xe3\x12\xae\xe2\x75\xe5\x7b\xc0\x9a\xdb\x5f\x42\x61\x8b\xaa\xae\x08\xf0\x01\xd8\xc9\x10\xbc\x39\xa5\x9c\x24\x87\xa0\x83\x4f\xfe\x50\x64\x96\x30\x67\x38\xa5\x27\xf3\x1c\xb3\xd6\xdb\xff\x86\x87\xa2\xa3\x76\xf8\x9b\xfb\xf0\x48\x34\x7b\x78\x24\xfa\x3c\x1e\x89\xa6\x9b\xc9\xda\x97\xff\xfd\xf8\x3f\xbf\xbd\x79\x9d\x3e\x3c\x12\x7d\x46\x8f\x44\xb6\xe6\xd4\x51\xc7\xd9\x6f\x29\xb6\x7e\x55\x92\xc4\x15\xaf\x45\x1d\x6a\x2e\xa3\x44\x95\xca\xd9\xb5\x8f\x3f\xdf\x39\xb5\xcd\x7c\x23\xab\x1c\x7a\x7f\x13\x2f\x1f\xee\xe3\xd6\x8a\x11\xf5\x33\x49\xd7\xdb\xcf\x9a\x87\x9f\x6d\x35\xd5\xcf\x3e\x63\x45\xf5\x1f\xee\x4c\x85\xfb\x87\x5f\xb1\xa2\xfa\x8f\x77\xb6\xca\x3f\x3e\x28\xaa\x3b\x14\xd5\x87\xab\x9f\xd7\xcb\xa1\x3b\x6b\x9f\xf7\xe0\xba\x39\x8b\xbb\x4e\xb1\xbc\xd8\x59\xb1\xfc\xb3\xe9\x82\x8b\x03\x74\xc1\x93\xf5\xba\xe0\x4c\xe9\x82\x27\x8e\x2e\x78\xbc\xab\x2e\xf8\x20\xf5\x2e\xef\x8b\xef\xcf\x9d\x6b\x77\x3f\x0b\xf5\x6b\x07\x55\x95\x3e\xcc\x1d\x43\x09\x0f\x46\x0b\x84\x35\xec\xa1\xc1\x26\x01\x6f\xe6\xba\x03\x9a\x7a\x81\x5d\x4d\x09\x22\xc3\xa5\xa0\xe0\x83\xf7\x5f\x2c\xfd\x53\x38\x0f\xe4\xad\xbd\xd0\x97\xf6\x3b\x7e\x99\x01\xe7\x89\x5f\x7d\xf7\xd1\x03\x95\x99\xf1\x7b\xa8\x88\xe8\x00\x9d\x28\x9f\x49\x7b\xbf\xaa\x51\xc5\x57\xd1\x09\x92\xad\x16\xa2\x5a\x6e\xb1\x16\x59\x73\xbb\xe5\x7c\xcd\x51\x90\x5c\x0e\xfe\x7a\xb7\xe5\xe8\x9c\x70\xbf\x56\xdd\x76\x16\xce\xfc\xe2\x67\xd1\x6d\x8f\xdd\x91\x8c\x92\x36\x39\xb4\xeb\xf6\x12\x76\x54\xd2\x76\x34\x07\xb0\x68\x64\xc5\xb6\x95\x2d\x8b\x75\x4a\xda\x29\x5c\xec\xaa\xa4\xe5\x54\xe5\x53\x29\x63\xda\xe1\xe9\xef\x42\x41\xf3\x60\xb2\xfb\xa0\x8d\xf9\x6d\x69\x63\xb6\x30\xd9\xfd\xee\x3f\x1e\xff\xaf\xff\xf8\xd3\xf8\xe4\x67\xd6\xc6\x28\x15\xbd\xf8\xe7\xe9\x83\x6e\xe6\x1e\xea\x66\xba\x74\x05\x0f\x9a\x8b\x07\xcd\xc5\x83\xe6\xe2\xae\x35\x17\x7f\xe3\xac\xd4\x05\x93\x0a\x8a\xbf\x19\x3c\x7c\xff\x95\x19\x7c\x5d\xdb\x58\xc9\xd1\xad\x95\x19\xe4\x00\x65\x06\xf9\xb9\x94\x19\x1b\x0c\xdb\x32\xc7\xb0\xcd\xd8\xad\x8c\xdd\x0f\xf5\xb1\xb8\x33\x63\x38\xa5\xb5\xc0\x13\xff\x91\x0d\x33\x37\x0d\xb8\x12\x41\x9b\x16\x66\x13\x9c\x27\x5f\x2f\x64\xec\x49\x4f\x49\x6a\x7a\x8a\x41\x1e\x65\x08\x68\x1e\x13\x1d\x1f\x3b\x36\x67\x9d\x6a\x8e\x15\xb3\xe8\x71\x2c\x72\x27\x13\xe9\xd2\x62\xa0\x6d\xd4\x26\xe8\x97\xd3\x95\x34\x65\x6e\xbd\x2c\x4b\x25\x60\xca\x1a\xc2\x72\xb8\xab\x26\xab\x86\x98\x65\xb7\x08\x7f\x05\xb2\xfd\xe2\x67\x93\xed\x9d\x91\x6a\x03\xb2\xb4\x4e\xc6\x75\x57\xa9\xb8\xc4\xa1\xae\x2a\x20\x0c\xf3\x9a\xc3\xd6\xd7\xfc\x93\x0e\x3c\x73\x07\xbe\x3b\x5d\x46\x7b\xcb\x84\x2e\x63\xfe\xa9\x74\x19\x77\x60\x70\x46\xae\x70\x82\x4a\x7a\x22\x84\x25\x4e\x68\x52\xa9\x93\x9c\xe1\x82\x1e\x62\x72\xd6\xa9\xce\xd8\x10\x4a\xbd\x19\x74\xf0\xae\x84\xc3\x68\x0b\xe1\xf0\xcd\x97\xd1\x97\xcf\xd9\x37\x0d\xe1\xf0\x4f\xf0\xac\xb6\xd4\x3a\xab\x79\xfb\x49\xae\xec\xfd\x23\x9b\x9f\x97\xf0\x7b\xdb\x04\x9f\xa8\x6b\xb1\xf7\xdd\x95\x94\x04\x32\x52\x6f\xa4\xde\x71\xed\xdb\xa6\x79\x1f\x41\xbb\x3d\xe8\xcd\x22\x3a\xdb\x92\x03\x59\xb7\xb1\xeb\x98\x11\x1a\xfa\xa9\x43\xf4\xf3\x83\xe3\xc0\x77\x2e\xbc\x0e\x79\x4c\x7e\xc5\x21\x8f\xe7\x61\x6a\x5d\xca\x78\xc5\x5a\x92\x70\x58\x9a\x78\xee\xc5\x61\xb1\x8f\xc7\x6e\x1c\xba\x62\x85\x7a\x6a\x3c\x44\xa3\xb0\x50\xea\xa9\x71\x53\x3d\x65\xff\x84\x63\x57\x3d\x35\x5e\xa9\x9e\x1a\xdf\xde\x8e\x5d\xf5\xd4\xb8\xa9\x9e\x1a\x87\xc9\xee\x71\xe8\xe6\x30\x36\x71\xe8\xc6\x00\x66\x96\x7a\x6a\xec\x28\x8f\xc6\x4a\x3d\xd5\x28\x3f\x1f\xb7\x37\x2a\x33\xea\xa9\xf1\x7a\xf5\x94\x3b\x42\xf7\x59\xe3\x53\x1c\xf3\xe5\xa9\x58\xde\xe1\x18\xa6\xd2\xb4\xcf\x44\x3e\x86\x63\x0b\xfb\xd2\x75\xd8\x37\x82\x74\x1b\xec\x7b\xb3\xe8\xb3\x68\x7a\x0f\x32\x88\xd4\x89\x5b\xef\x36\x67\x2b\x97\x6c\x48\xde\xa7\xd7\x98\xc5\xb3\x56\xce\xd6\xad\xc3\xdc\xae\xa1\x29\x4e\x2a\xf7\x5a\x97\x3d\xbf\x4f\xba\xec\xf8\x41\x97\xfd\x5b\xd7\x65\xf3\xdb\x96\xa8\xcc\xef\xcd\x5c\xe9\x0b\xca\x50\x16\xc8\xab\x42\x45\x1a\xf8\xfd\xc3\xfe\xce\xb5\x54\x2e\x3a\xf5\x20\x51\x22\xb5\x2e\x2f\xc9\x9c\xf1\x7b\x18\x39\xe5\x94\x91\x12\x79\x90\x5a\x92\x36\x25\x25\x43\xc9\x5b\x39\x2d\x47\xe0\x9e\x22\xd6\x9e\x78\xc0\xc8\xf3\xb2\x8c\x16\x3e\x10\x09\xd0\x7d\x50\x4d\x09\x23\xb2\x03\x13\x16\x58\x4e\x80\x0b\x00\xb9\x8c\xa8\xfb\x8e\xf8\xde\x07\xc2\x39\x96\xa5\x08\x40\xfb\x26\x2a\xa3\x8c\x0e\x96\xb2\xdb\x01\xaa\x54\x52\xe1\xd8\x4f\x1b\xec\xb3\x5a\xe0\x30\x37\x84\xf9\x30\xee\x3e\x72\x47\xd0\xa0\xba\xb3\x11\x68\x6b\x0d\x12\xe8\x77\x36\x80\xdb\xbd\xbd\x81\x1e\x1c\x96\x9b\x25\x94\x35\xed\x39\x5a\xb1\x24\x95\xd4\x96\x54\x92\x0a\x80\xa3\xf5\x74\x40\x2b\xda\xfa\x22\x2c\x70\x3b\x4d\x40\x07\x31\xd8\x26\x7b\xad\xfb\x0a\xba\x4f\x00\x74\x9d\xbd\xb6\xa6\x1d\xc9\x7d\xa2\x1d\xc5\x2f\x94\xb9\x36\x7b\xa0\x59\x9f\x03\xcd\x1a\x73\x89\x51\x84\xa9\xb7\x99\x44\x48\x5a\x74\xac\x56\xb0\x7d\x9f\x78\xd6\x85\x73\x54\xb5\x56\xad\x73\xa5\xcd\x23\x25\x12\xda\xce\xb7\xfc\xee\x26\xcd\xac\x0b\xad\x46\x40\x61\x3b\x00\x53\xdf\xa7\x07\x90\xca\xa4\x49\xfa\xe6\x8a\x22\x16\xad\x14\x17\x7c\x39\x12\xa6\x49\x47\xfa\x8b\xd8\x69\xc7\x70\x86\x74\x7d\x5d\x96\xe2\xfc\xf2\x1d\xb1\xd3\x69\x88\xcc\x59\xad\xe0\xfa\x42\x20\xcd\x7c\xfa\x49\x89\x84\x3b\x40\xc3\x95\x95\x1c\x4e\x46\x29\x00\xb7\xb7\x91\x4d\x1e\xc6\x9b\xc4\x04\x1a\x47\x9a\x32\x50\xe5\xa3\xd7\x24\x0e\xdb\x9a\xcf\x74\x27\x40\x8f\x49\xd1\xe9\x07\x79\xb7\xfa\x28\x95\xbf\x6a\x5b\xee\x6d\x27\xf5\x0a\xbe\x42\xdf\x5c\x89\x65\xdf\x07\xb5\x8a\xf5\x04\xd3\xb6\xf5\x93\xbb\x1c\x4c\x70\xca\x50\xf9\xf5\xc2\xf7\x66\x11\x7d\x21\x1e\x1e\x25\xdb\x28\x9e\x3c\xf8\x1d\xe2\x27\xa8\x98\xd3\x99\xbf\xe4\x3f\x07\x39\xba\xee\xbd\x8c\x18\x5f\xc0\x3c\x67\x03\x14\xd4\xcf\x9c\x81\x28\xaa\x74\xde\x08\xa6\x46\xab\x4d\x30\x9d\x8e\x87\xa7\x23\x4d\xa7\xd8\xf1\x31\x13\x2f\x66\x7f\x45\xc3\xd3\x91\xf8\xeb\xf8\x18\x05\xf3\x9c\xce\xf0\x84\xa9\xa1\x65\x0d\x3d\x30\xaf\xa7\x06\x84\x48\xc6\x5e\x68\x18\x7b\xb6\x1e\xa6\xd4\x8a\x4b\xc4\xe7\xea\xac\xb8\x8e\x67\xc0\x2f\xe3\x00\x05\xa8\x2c\x49\x79\xee\x89\x7f\xbc\x81\x27\x5e\x57\xa0\x98\x05\x92\xb3\x10\xbd\x0d\x64\xde\x10\x52\x2c\x80\x8f\x40\x05\x80\xce\x3a\x2d\x4e\x89\x61\xb6\xad\x93\xa3\xd2\x65\x58\x36\x9a\xf5\x37\xe8\x89\x4e\x83\x39\x4e\x3c\x10\x86\x61\x5d\x13\x35\x3e\x49\x7c\x2d\xb2\x1a\x7f\x23\x93\x3b\xb0\x08\xa7\xd4\x07\x03\xb7\xc7\x10\x55\x1d\xd5\x5a\x93\x0a\xa5\xd6\x1e\xd2\x86\x16\x6e\xee\x1c\xf9\x38\x1c\xe2\xfa\xc5\x60\xef\xd4\x63\xab\xde\x0c\x1e\xb2\x91\xfd\x3a\xb2\x91\x91\x30\xd3\x1a\xb9\x3d\xb3\x91\xa9\x28\xba\x63\x72\xd3\x29\x5b\xb8\x79\x14\x7f\xa6\x44\x4b\x30\x95\xc8\x7e\xb5\x9c\xf1\xb3\xb3\xee\xc5\x03\xeb\xfe\x39\xb0\xee\x59\xe8\x13\xe9\x1c\xd3\xc8\x30\x65\x5f\x13\x6f\x52\xbf\x3d\xf5\xa3\x24\x91\x92\x7e\x24\x9d\xdd\x4b\x14\x25\x75\x83\x77\xa8\xcc\x38\xe3\xef\xfb\x73\x87\xc5\xc1\x7b\xb2\x38\x86\x03\xaf\xfb\x6f\x25\xd3\xfc\xa9\xf1\xd1\x30\x3f\xf1\xaf\x95\xf9\x31\x8b\x4a\xd0\x98\xcc\xf3\x18\x79\xf0\xec\xd9\x69\x33\x7f\x30\x45\xec\xc2\xac\xaa\x99\x30\xab\xb1\x5c\xa4\x33\xe8\x8b\x69\x00\x28\x88\xbe\xee\x57\xb9\xdd\x48\x73\x9a\xba\xb4\x8a\x53\x14\x95\xfe\xca\x3e\xb9\xec\xb6\x55\x3f\x15\x8c\xc3\xc2\x9f\xdb\x92\x42\xa3\xa3\x3b\x48\xa2\xdf\xec\xbd\x01\x15\x21\xf0\x6c\xfb\xae\xbe\xa6\x1b\x00\xe7\x8d\xf7\xf5\x66\x5d\x01\xab\xfd\x87\x92\xcd\x9d\x21\x68\x38\xe7\x02\x10\x05\x35\x9a\x1f\xbb\x8c\xb0\x05\x48\x99\xd5\xcc\x9c\x0e\x54\xe7\x46\x6c\xdc\x3b\x88\x40\x55\xdf\xf1\x6c\x33\x25\x2c\xaf\x50\xd9\x8f\xa6\xeb\x74\x6d\x2b\x3c\x08\x76\x24\x90\x66\xf8\x19\x4a\x0b\x54\xd2\x93\x34\xfa\xb8\xe8\xc7\x29\x8e\x2f\xf7\xa3\x96\x90\x48\xcc\x61\xa5\x59\x7e\xf0\x54\x78\x20\xb7\xbf\x7e\x72\x7b\x15\xfa\x91\x36\xdf\xd4\x9a\x32\xc6\xf1\x03\x95\xa5\x0e\x11\x76\x6f\xa8\x34\xa6\x63\xa8\x94\xc2\x0f\xc7\x2b\x4e\x3b\x2b\x45\x2c\xa6\xcf\x45\xad\x01\xa6\x7d\x53\x3f\x96\x64\xdb\x98\x99\xf6\x4b\x32\x67\x38\x9f\x6a\xbb\x52\x1c\x44\x29\x8e\x78\xf3\x9f\xd4\x33\x8c\x7a\xe3\x50\xe1\x17\xcb\x86\x3a\x6f\x2a\xef\xbb\xaa\xa9\x0c\x6b\x7f\x7c\xfb\x83\xc8\x01\x99\x85\xd4\xcf\xc2\xb9\xef\xbb\xb1\x11\x37\x5a\x93\x74\x72\x02\xda\xe2\xf3\x27\xfd\xe8\xe2\x9a\x82\xea\x72\x65\x0a\x0a\xb1\xd8\x3b\xe8\xb3\x50\x4d\x14\xe0\xdc\x97\xd8\x15\x7c\x1a\xfe\x59\x48\xfa\x1a\xec\x2e\x42\x97\xd3\x83\x2c\x44\xc1\x14\xe5\xa8\x8c\x18\xd2\x5b\xcc\x71\x39\xff\x57\xab\x32\xf9\x6c\xb5\xe5\xe6\xfb\x2f\x96\x48\xbe\xa5\x95\x84\x48\xd8\xaa\x0b\x77\x0a\xfb\x67\xa0\x32\x9f\x6d\xe8\x07\xb4\x48\x31\xf3\xbd\x73\xa1\xc8\xa8\xde\x07\x25\x12\x39\x67\xfc\x93\xdf\x7d\x79\x7a\x32\x85\xde\xdf\x84\x10\xcf\xba\xca\x2b\x81\x97\x7d\xb0\x14\x5c\x21\xc7\xd4\x2f\x78\x01\xf0\x87\x3e\x08\xbf\x5a\xfd\x40\xb7\x66\x29\x52\x21\x31\xea\x8c\xc6\x67\xb6\xf3\x70\x3b\xc6\x56\x20\x39\xd3\xf5\x1d\xd8\xf5\x35\x3a\xd6\x7b\xbc\x47\x0c\x3c\xd3\xd4\x89\x23\x97\x85\x63\xce\x13\x64\xe6\x3f\x4b\xaa\xbd\xda\x92\x96\xd3\xf9\x38\x8f\xae\x3e\x63\x5b\x12\x8a\xf3\x69\x8a\x74\x02\x21\x9d\xa3\xf5\x44\x86\xb6\xff\x34\xb6\x8c\xeb\x5c\x2a\x15\x25\xbf\x33\x43\x46\xb2\xd9\x90\x91\xbe\x9c\xfd\xf8\x75\xfc\xe1\xeb\x95\x5e\x6e\x26\xdd\x6e\xed\xdf\xd6\xf2\x45\x93\xde\x4c\x76\xc0\x70\x93\xff\xcb\xfb\x9b\x04\xae\x64\xfd\x24\xf7\xf9\x4d\x1e\xc9\x74\xc0\xba\xe0\x5b\x25\x30\xfe\x4d\xf3\xac\x22\x7b\x82\x1a\xb8\xe1\x7f\xf5\xa4\x61\x1a\x89\xaf\xd0\xeb\x42\xba\x2e\x8d\xa0\x65\x78\x39\xd4\xd1\x6c\x52\x94\x4f\xd9\x8c\x7f\xd5\xe1\xcc\x4d\x34\x1a\x53\xff\x89\xb6\xc9\xac\xbb\x16\xfc\x3e\x9f\xb5\xec\xda\xb4\xd4\x53\xaa\x13\xd9\x8d\xd6\x65\x16\x68\x45\xbb\x6b\x27\x2b\xea\x17\x25\x9a\xe0\x1b\xc7\xf1\xe6\x4b\xe5\x0e\x33\x58\x19\x9a\xcf\xee\xd5\xcc\xca\xc9\x46\x00\x75\x62\x06\x1d\x7e\xa7\xed\x88\xc6\x97\xdc\x08\xb4\xb3\xc1\xdf\xa6\xde\x56\xf9\x97\x89\x04\x64\x59\x9e\x36\x33\x27\x7a\x53\xfe\x7f\x91\x06\xe5\x66\x3b\xd4\x75\x57\x72\x9d\x15\x6a\xc7\x33\x49\xcd\x37\x08\x8d\xba\x75\x5e\xba\x54\xea\x6a\x6d\xc6\x47\xe2\x12\x2d\x34\x51\xe2\x9f\xa9\x3e\x10\xa0\xb2\x8f\x87\x60\xa5\x11\x5b\x5e\xa2\xc5\x80\x55\x21\x3a\xb2\x3a\xcc\x65\x2d\xe5\xf7\xdf\x28\xf3\x19\xe8\xd2\x51\x37\x0e\x1e\x8c\xc3\x61\x69\xa4\xc8\x64\x63\xea\xe2\xb4\x25\xb2\xea\x9e\x38\x2f\x66\x7f\x7d\xd0\x4e\xff\x2a\xb4\xd3\xeb\x35\xd3\xeb\x6c\x45\x09\x8c\x36\xda\x8a\x76\x78\xb6\x6d\x7c\xff\xcc\x48\x26\xff\x48\x9e\xca\x96\xd2\xa5\x4d\x16\xd8\x7f\x53\x95\x05\x26\x79\x6a\x62\xcd\x3b\x31\x1c\x95\x33\x5c\x32\x2f\xb5\x73\xe9\xca\x18\x02\x77\x12\x3b\x56\xdc\xfc\x2e\xa6\x80\xdf\xfd\x9b\x6f\xc5\x6c\xac\x67\x9a\xda\x77\x0d\x67\x48\x7d\xf5\x7e\xf7\xdd\xe0\x77\xaf\x06\xbf\xbb\xf0\xe4\x7b\xe3\xc2\x6d\x65\x7c\xd9\x54\xc8\x10\xdf\x0b\xce\xfe\xcf\xef\x54\xed\x39\x45\x2a\x33\x79\xfd\x62\xf7\xa8\xbe\xf9\x3a\x19\x90\x7c\xc9\x54\xb7\x56\xa2\xa2\xf6\x83\x26\xaf\x0c\x59\x48\xcc\x78\x62\x59\xcc\x47\xd0\x47\xe1\x57\xc2\xef\x27\xe6\x8c\x32\x17\x5a\x56\x56\xe2\x2b\xa3\x2c\xca\x0a\x00\x94\x96\x33\x50\x2b\xd2\xa2\xc2\x3b\x9c\x21\x15\x21\x5d\x3c\xae\xf6\x26\xa4\xec\xb1\x19\xea\xa5\x11\x65\x3d\x11\x1d\x25\xaa\x23\x90\xe2\xe1\xd9\xa8\x8f\x87\xa7\x23\xe8\x65\x54\x98\x1b\x54\xb0\x77\x8d\xd9\xac\x27\x36\x86\xf6\xca\x28\x9f\xe2\x7c\xda\x9b\x94\x24\xeb\x7d\xb1\xcc\x7d\x36\x3c\x1d\x81\xaa\xc7\x88\xfa\x75\x36\x02\xd5\xfb\xea\x46\x86\x12\x17\xb7\x57\x2e\x3d\x97\x1a\x65\x71\xa8\xf8\x9c\x80\x0f\xe0\xb0\x84\xd1\x68\xbb\xc5\x51\xc9\xe6\x98\x89\x46\x20\xa0\xf3\x31\xe3\x42\xaf\xff\x0c\x7a\x19\xce\xe7\x0c\x49\x63\xc2\x97\x5c\x8a\xe2\x52\x30\x0a\x24\x6f\x70\x3e\x7c\x15\xb1\x59\x90\xe1\xdc\x2f\x21\x05\x30\x1a\x0d\x86\x14\xea\x87\x61\xf3\xa6\x9b\x07\x7c\x71\xe8\x2d\x99\xe7\x89\xcf\xc9\x2f\x1b\x81\x20\x21\x59\x84\x73\x7f\x0e\x60\x5e\x2d\x5a\x8b\xc2\xa1\x8f\x6e\x6f\x87\x23\xf1\x20\xfb\xf5\xc2\x6f\x1f\x85\x73\xed\xa9\x7d\xc1\xa2\xf8\xd2\x1b\x18\xc7\x6d\x41\xd1\x86\x39\x2c\x47\xe1\x90\x53\x7a\x3d\x0b\x69\x1b\xc3\x97\x05\xd4\xf4\x8f\x8f\x7d\x59\xaf\x05\x28\x0c\x84\x52\x56\x41\xf5\x07\x9c\xa3\xa8\x04\x1c\x8b\x5a\xeb\x60\x9c\x2d\x32\xeb\xa8\x21\x71\x0a\x73\x00\xe5\xaf\xe8\xc6\x3f\x83\x25\xe0\xb2\x98\x65\xc7\xbe\x0d\xee\x99\xd3\x7e\x8c\xd2\xf4\xb7\x1b\x85\xfa\x55\xfc\x1f\xff\xba\x49\xbe\xbd\x74\xa2\x50\xaf\x4b\x01\xa5\x23\x3d\x77\x26\x70\x3a\x93\xce\x3c\x7f\x93\xc0\xab\x39\xaa\xad\xb8\xa6\x1a\xe0\xbf\x50\xc4\x61\xca\x50\x51\xa0\xb2\x8f\xf3\x62\xee\x9a\xda\xec\xfd\x24\xba\x52\x7d\x7c\xc8\x5b\x29\x4c\x8e\x1e\x0c\x1d\x1f\xd4\xb7\x3f\x93\xa1\x63\xe7\x6b\x69\xe3\xae\xa8\xb7\xd1\xb4\x53\x29\x1b\xab\x88\x20\x09\xa6\x42\x68\x1e\x60\xda\xd7\x7f\xdb\xc5\xff\x97\xbd\x77\xdd\x6e\xdb\xc8\x1a\x44\xff\xeb\x15\xe6\x0f\x85\x95\xd1\x07\xc4\x45\x4a\x4a\x77\x66\xfa\xb0\x03\x7b\x1c\xd9\x6e\x3b\x5f\x6c\x6b\x2c\x25\x7d\x7a\x78\xb4\x6c\x90\x28\x92\x25\x81\x00\x03\x14\x25\xd1\x12\xd6\x9a\xc7\x38\xe7\xf5\xe6\x49\xce\xaa\xfb\x05\x05\x10\x24\x25\xc7\x6a\xab\xd7\x4a\x5b\x44\x55\xed\x5d\xf7\xda\xf7\x8d\x79\x16\x3c\xed\x13\x4d\xc4\x9f\xa0\x14\x0a\x71\x71\xde\xcb\x52\xf8\xcf\x68\x19\x88\x35\x0f\x40\xe6\x2f\xc2\xc8\xf7\x47\x77\x64\x60\x26\xcc\x0f\x67\x28\xf5\x80\x66\x8e\x48\x43\xd3\x1f\x6a\x1f\x78\x2c\x05\xed\x8b\xd2\x6d\xfe\x78\x70\xa0\x6b\x6b\xa9\xfc\x3a\x8d\x92\xdf\x59\x13\xa5\xaf\x8d\xbf\x56\x7d\xad\xa1\x98\x45\xe9\x28\x87\x64\x7a\x84\xfe\xd4\x18\xcf\x4f\xcc\xb3\x3d\xba\xde\xdb\xf3\x79\x29\xaf\x2e\x07\x63\x4d\x00\x57\xe6\xb1\x50\x16\x7e\x15\x62\x10\x94\x31\x6c\x42\xc9\x44\xb2\x33\x94\x0a\x94\xb2\xfa\x16\x28\x0b\x88\xe9\x9f\xe4\x6a\x42\x63\xdf\xf3\x76\xc3\xd0\x52\x35\xdf\x08\x4b\x3a\x4a\x58\x8c\x93\x2c\xcb\x7d\x49\x71\x88\x69\x50\x54\x87\xe8\xa5\xad\xb1\x0e\x82\x1d\xa5\xcd\xb4\xf6\x06\x5e\xd9\xd3\x12\x26\x05\xec\x98\x20\xc3\x6a\xbd\x32\x87\x05\xc4\xa7\xf0\x1a\xbf\x21\x47\x94\x8c\xea\x87\xff\x1e\x92\x21\x5d\xc0\xe5\x51\x16\xc3\xbd\x3d\x7f\x25\x10\x32\x2b\x84\x03\x97\x13\x23\x5b\xb0\xef\x7e\x50\xf2\x8e\x42\x2a\x3c\x4f\x6d\xfd\xf9\x18\xc0\xaa\x06\x3d\x0e\x67\xfe\xc8\x10\x10\x9b\x73\x30\x28\xb6\x95\x5d\x57\xe0\xf3\xed\xe1\x81\x01\x6a\xad\xd4\xae\x01\x11\x80\x91\x21\xc4\x36\xeb\xc9\x9d\xb8\x39\x2a\x05\xa2\x19\x95\xd8\xb0\x9b\x63\x92\x10\x9a\x11\x99\x3b\x69\x73\x74\x16\x9c\x55\xa3\x93\x1b\x6f\x9b\x01\x2a\x20\x16\xba\x45\x38\x0a\x82\xdb\xdb\x05\xfd\xcf\xc8\xbc\x60\x0a\xd6\x34\x1b\x84\x72\x1d\xdb\x6d\x9c\xc3\x68\x86\xd2\x49\x77\x8c\x92\xd6\x89\x2b\x14\xf1\xe8\x8a\x78\x28\xf1\xcc\xd0\x35\x4a\x8b\xfd\x2b\x94\xc6\xd9\x55\x37\x87\x05\xfa\x4c\x0e\xc3\x1d\x91\x96\xff\x2e\x86\x05\x5f\x9c\x22\xbe\x7c\xa4\x88\xbf\x05\x8a\xf8\x4a\x52\xc4\x4a\xa7\x37\xcf\xa1\x83\x08\x66\xd4\x2f\xea\xb2\x83\x2a\x68\xd8\xa4\x17\x61\x9c\xa3\xe1\x02\xeb\x54\x72\x1c\xe1\xa8\x8b\x61\x81\xbb\x49\x36\xe9\x8e\x12\x24\x2c\x1d\x52\x57\xd8\x2b\x1a\x1b\x43\x73\x3a\x4d\xb2\xc9\x04\xe6\xbd\x49\x86\xb3\xd7\x30\x8a\xbd\x40\x8b\x81\x45\xa5\x00\xc2\xd1\xf0\x3d\x7d\x9b\x59\xe6\x85\x0f\x30\x8d\x85\xda\x9a\xdb\x57\x8d\xf2\x2c\x49\x4e\xb3\xd3\x6c\x4e\x85\xb3\xa3\x4d\x3a\x70\x1a\xa1\x44\xef\x00\xbd\x2a\x6b\x01\x51\x10\xbc\x75\x96\xfa\x1e\xa6\x16\x52\xdc\x02\x92\x77\xfa\x84\x76\xeb\x64\x99\x8e\xa6\x79\x96\xa2\xcf\x22\x23\x9c\xd6\x09\x0e\x81\x86\x8f\x39\x11\x77\xaf\x88\x3b\x24\xc0\x8f\xc7\x6b\xc1\x27\x1d\xcf\xfc\x79\x18\xf9\xf3\xb0\xf0\xfd\x99\xc9\x61\xf8\xd8\x94\x57\xc5\xbe\x94\xad\x8a\x68\xce\x8d\x8e\x56\x4b\xc1\x35\x54\x16\x9e\xba\x41\x89\xe2\x19\xcd\x7b\xe4\xc9\xf7\xc4\x53\x45\x54\x40\xc2\xbf\x1a\x6d\xd8\x78\x85\xd5\xa8\xf8\x3a\xce\x92\x24\xbb\x32\x6b\xe6\xf0\x8f\x05\x2c\xf0\xab\x3c\x9a\x41\x56\x22\x4c\x4b\xa6\x64\x1b\x39\xc2\x92\xa1\xa4\x6a\x86\xc2\x3a\xa7\x22\x92\xc5\x28\xfe\x00\x47\x10\x5d\xc2\xe7\x18\xe7\x85\x0c\x1b\x55\xf9\xae\x2f\x0f\x75\xc5\xa8\x6e\xd4\x11\x57\xd7\xa9\x4d\xca\x37\xd6\x29\xd9\x4b\xa5\xf6\x83\xa0\xa1\x11\x15\x38\xe1\x9d\xc5\x84\x62\x8f\x0a\xc8\xc6\xd2\x57\x34\xb7\x9c\x89\x43\xde\x03\x52\x41\x6d\xd8\x9d\x61\x0e\xa3\x8b\x1d\xda\x94\x0e\xd8\xd5\xf4\x40\xc4\xb4\x8a\x50\xe2\x6e\xaa\x96\xac\xa9\xbd\xb6\x88\xc2\xf1\x8f\xfc\x54\x20\xfb\xe6\xfe\xce\xe6\x7e\x50\x96\xec\xa0\xbe\x8e\xd2\x38\xa1\x11\xed\x0d\xf9\x3b\x4c\x28\xf9\xc8\x98\x0c\x7d\x85\xf7\xf6\xd8\x4d\x24\x3e\x3e\x4f\xd1\x8c\xee\x75\x5a\xea\xfb\x7e\x10\x3e\xbd\xa9\xf6\x15\xf2\x7b\xe1\x35\x44\x93\x29\xee\x42\x79\x4d\xcc\xbb\xb0\x37\x4a\x10\x4c\x31\x2b\xfa\xe9\x07\x31\x2a\x1d\x6b\x48\xae\x52\xe7\xf7\xc3\xf2\x02\x2e\x5f\x64\x57\xa9\x18\x08\x63\xbd\x7c\xd8\x9b\x41\x1c\xfd\x27\x5c\xde\xde\xc2\xde\x08\xe7\xc9\x7f\xc2\x65\xb0\xb7\xf7\xdf\x7e\xd4\xf9\x17\xc2\x8c\xcc\x73\xc8\x5c\x69\xe8\xb1\xf3\x95\xab\x13\x1f\xe7\x44\x57\x73\x06\x3b\xb8\x97\xc3\x59\x76\x09\x9f\x27\xc9\x07\x42\xd3\x15\xb2\x05\x0a\xe3\x6c\x44\x4f\x26\x97\x97\x7e\x60\xcc\xef\x0e\xe2\x9c\xce\xbb\x2c\xe6\xdc\x18\x9f\xdd\x00\xe0\x5e\x14\xc7\xac\x1e\x0a\x4a\xb2\xe9\xdf\xd0\x48\x8d\x2f\x13\xc1\xb9\xca\x5d\x6f\x16\x38\x22\xa6\x8d\x51\x92\x3c\xbf\x8c\x50\x42\x1e\x65\x36\x99\xbe\x6e\xf3\xfa\xd1\x58\x70\x4f\xbf\xad\xf9\xb7\xde\x10\xa5\xcc\xc8\x5a\xcc\x35\xef\x28\xe9\x25\x75\x19\xfa\x15\x15\x18\xa6\x30\xf7\x3d\xd6\x90\x43\x31\x41\x1b\x48\xcd\xd5\xe1\xf5\xcd\x8f\x06\x5a\x39\x87\x55\x94\x17\x70\x49\x4d\x30\x38\x4e\x13\x88\x11\x64\xce\x9e\x3e\x47\x91\x63\x02\xc5\x60\xd9\x02\xaf\x33\x5e\xd9\x69\x67\xd3\x95\xfd\x26\xfb\xec\x03\xa1\xc0\xa1\x3a\x8d\xf4\x22\xcb\x14\x17\x5c\xb7\xc4\x41\xe9\x5c\x77\xf7\x69\x86\xbd\x02\x2f\x13\xd8\x9b\xd2\x5a\x62\x87\xa3\x34\x85\xb9\x3c\x98\xd9\x78\x4c\x58\xac\x6c\xde\xfd\xcb\xc1\x13\x6f\x7e\xed\x95\xda\x8b\x2e\x1e\x5b\x31\x55\xf2\x14\x87\x07\x65\x21\xdf\x3e\xfe\x18\x1e\x67\xcc\xcc\x4d\x34\x62\x77\x81\x90\xb7\x54\x41\x38\x3e\x8b\x31\x36\xbe\xb2\x62\xb6\x5a\xd2\x27\x75\xdd\xdc\x28\x4c\xa1\x75\xa7\x82\x61\x78\xe9\xcf\x74\xf6\x91\xbd\x81\x83\xc5\xb6\xe2\x88\xb1\x0d\x98\x3d\xa3\x77\x61\xfe\x67\x01\x16\x2f\xf1\xf6\xe6\x7f\xf3\x70\x46\xf8\xe3\xb9\xfc\x4f\x0f\xc1\xb7\x8a\xfb\x25\x74\x5e\x77\x92\x67\x8b\x79\xab\x90\x16\x2b\x93\x2b\xae\xb2\xc4\x6f\xe7\x87\xd6\x6c\x95\xdf\xa8\xdd\xb7\x8c\x1c\x18\x7b\x0c\x26\x60\x09\x2e\xc1\x95\x62\x93\x3f\x3f\x24\x36\xf9\xfc\x4f\x62\x93\xaf\x1f\xd9\xe4\x6f\x81\x4d\x7e\x1f\xfa\x85\xd3\xee\xdf\xb6\xdf\x27\xdc\xaf\x7d\x61\x54\xad\xfe\x47\xac\x55\x33\xeb\xac\xc0\x08\xe3\x7e\x4d\x61\x44\x0a\xff\x41\xca\x98\x9f\xba\x32\xef\x17\xe6\xff\xaa\xc2\x79\x36\xec\xe5\x8b\x34\x45\xe9\xe4\x05\x9c\x27\xd9\x92\x8b\x63\x67\x8c\x8d\xd5\xfc\x01\xaa\xb5\x80\x97\x92\x41\xcd\xa3\x11\x35\x78\xae\xb4\x60\xc8\x81\x86\xad\x18\x45\x09\x4a\x27\xbd\x19\x22\x4c\xed\x78\x9d\x16\xd1\xb5\x17\x80\xc2\x9f\x86\x0b\x7f\x1a\x8e\x7c\x7f\xb2\x45\xe4\x8f\xcf\x9c\x9b\x1b\x45\xa9\x07\x96\x9c\xc5\x3b\xd7\xe2\x51\x53\xdc\x82\xab\x3c\x77\x2b\xbd\x24\x10\xd6\xe7\x4b\x0e\x46\x7c\x76\x4c\xd7\x95\x16\x5c\x4b\xce\x9c\x2b\xb0\x96\xb9\x3c\xb2\x2a\xfd\x8b\x1b\x30\x71\x15\xe2\x29\xbc\xc6\x16\x84\x51\x94\x92\xff\xd2\x0c\x13\x72\x30\x4a\x60\xe7\x3c\x1b\xb2\xb1\x80\x1b\x09\x8b\xf1\x5a\xf2\x67\x19\x3c\xf3\xfe\x95\x2d\x3a\x51\x0e\xd3\xff\xc0\x9d\x88\x90\x40\x30\xee\xe0\xac\xc3\x40\x90\x1e\x75\xe8\x76\x2b\x38\x8f\x57\x19\x1f\x03\xc0\x30\x57\x5b\x75\xe2\x45\x8e\xd2\x49\x27\xea\xc4\x6a\x46\xc4\x55\x9d\xa5\x47\xdc\x2d\x81\xfb\x27\x30\x1d\x4b\x64\x38\x28\x08\x19\x35\xf9\x09\xe0\x59\xc0\xfd\x31\xde\xb2\xfc\xd5\x36\x2d\x59\xd9\x41\xfc\xda\xdd\xf5\x77\xe1\xed\x2d\x99\x0c\xc2\x60\xcd\x50\x1a\x70\x8b\x4f\xba\x8c\x3f\xb1\x6f\x02\x74\x74\xbd\x05\xe8\xe8\xda\x00\xfd\x94\x7d\x2b\xe9\x8f\xdf\xe6\x2b\x81\xfe\xdd\x86\x76\x7b\xab\xf5\x53\xc0\xaf\xd5\x43\x8a\x83\xcf\xd9\xa7\x28\xe1\x3c\x1d\xfd\x1e\x04\xac\x1b\x84\xc0\x5f\xb7\x23\x28\xd5\x3b\xf2\x54\xcc\x61\xad\x76\x72\x55\x47\xd8\x27\xc8\x3d\x52\x2c\xa5\xda\xb1\x4b\xa9\xb6\x0c\xaf\xfd\x89\xe1\x86\x49\x8e\xf1\x00\xdd\x51\x7c\x9c\xcb\x0a\x78\x76\xc0\xb7\x27\x34\xaf\x6c\xc8\x8e\x3b\x62\x30\xdf\x16\x8b\x85\x43\xbb\x28\x3c\x30\x98\xad\x56\x2b\xd5\xb6\x0e\xc0\x44\x57\x2b\x59\x78\xe4\x49\xf4\xc0\x60\xb8\x26\x16\xd5\x76\x25\x0e\x76\x24\x3d\x30\x18\xaf\x8f\x83\xb7\x6d\xc6\xc1\xcf\xe7\x5a\x4e\xc1\x4e\x00\x2d\xd0\xbc\xa0\xfc\xf6\x56\x88\x28\x08\x0b\xd5\x34\x9c\x10\x86\x66\x2a\xff\x53\x64\xfb\xb1\xad\xf4\x33\x8f\xbb\xa5\xfb\x7b\xdf\x8a\xfb\x49\x32\x77\x84\xdb\x0a\x93\xd3\xc2\xa6\xac\xca\xf7\xe4\xc5\xe5\xbc\x6a\xb0\x4c\xdf\x7e\x58\xec\x53\xdc\x76\x21\x4f\x80\xb1\xa9\xf7\x31\x88\x40\xc1\xc8\x75\x27\x17\xa4\x26\xf3\xea\x21\xf1\x40\x9f\xff\x24\x1e\xe8\xfc\x91\x07\xfa\x77\xe7\x81\x18\x21\x7e\x7d\x13\x0d\x69\xd4\xd7\x9b\xb2\xe4\x5c\xd1\x82\xa5\xbd\x31\xf8\x9f\x61\x76\x0d\xe3\x6e\x21\xdc\x66\x3c\x79\x85\x70\xc6\x47\x31\x29\x8b\x02\xe6\x27\x10\x63\xc2\xfb\xf4\x92\x6c\xf2\x36\x8b\xa1\x27\x15\x6c\xce\xc0\x83\xbd\x1b\x14\x03\x96\x5c\x18\xe3\xf9\xf3\x38\xce\x4b\x96\x02\xe9\x84\xf9\xad\x72\x46\xc8\x68\xcd\xd2\xab\x30\xed\x13\xe7\x7b\x32\x2e\x30\x0b\xa8\xb6\xef\xb7\x3c\xf1\xa8\xa6\x89\x45\xa6\x35\x43\x1b\x0a\xda\x89\x0b\x29\x9f\x93\x29\x38\xca\x52\x9c\xd3\xac\x13\xcf\x52\x78\xd5\xb1\xbe\xd1\x40\x66\xd7\x80\x07\x29\x93\x7d\xe3\x2a\x11\xfa\xf7\x29\xbb\xc0\x18\xa1\xcd\xd4\x0e\xfc\x13\x40\x56\x33\x69\xf3\x1e\x3e\x4d\xa4\x96\x2e\x27\x7c\x05\x23\x98\x71\x76\x01\xd3\x5e\xb4\xc0\xd3\x2c\x47\x9f\x61\xfc\x81\xa9\x25\xfc\x14\xdc\xb0\xdc\x24\x7d\xc8\x93\x94\x94\x54\x7f\xaa\xb9\x10\xe0\xe0\x2c\xe8\xe1\x29\x4c\x69\x80\x32\x18\x00\x1f\x53\xa5\x49\x9e\x5d\x75\x60\x8f\x2f\x36\x40\xcf\x94\x18\x3d\xcd\x8e\xb2\x34\x15\x4b\xbb\x7b\x10\x08\x75\x50\x1a\xfb\xde\x38\x42\x49\x46\x06\x97\xc9\xc5\xc0\x65\x40\x55\x8f\x0b\xdf\x1f\xb7\x0c\x29\xe3\x62\xe7\xae\x04\xe7\x46\xc6\xaa\x5c\xc4\xc5\x67\x7d\x1f\x79\x60\x62\xf1\x69\x7a\xf4\x43\x76\x24\x3e\x6b\x8c\xa0\xfd\x4d\x6d\x25\xaa\x52\x13\x9f\xad\x81\x6b\x25\xc6\xea\x79\xe0\x10\xfe\x45\x95\x19\x8b\xed\x81\x1f\xf5\xb2\x8a\xc6\xf3\xb3\xa1\x81\x7c\x5b\xd5\x95\x5e\x19\x6a\xd4\xa5\x35\x09\x42\x51\x7a\xa9\xf1\xa0\x6c\x6f\xdb\x0c\x00\xe5\x40\xb5\x23\x65\x1c\x27\xb2\x68\xe1\xa7\xfd\xcb\xc3\x7d\x36\xb0\xfd\x31\x7d\x83\x8b\x7d\x9e\xf4\xd9\x6e\x8c\x62\x2f\x28\x3f\xed\xe8\x14\x87\xb6\xe3\xfb\x9f\xf6\xf7\xbf\xbb\x81\xe5\x77\x37\xb8\xfc\x24\xba\xc4\x4e\x99\x64\x6a\x6f\xc8\x32\xf4\x25\xad\x02\x68\x98\x3c\xa9\xf6\x2c\xcb\x02\x52\xb3\x79\x19\x45\x87\x7c\xdd\x0d\x43\x28\x58\x12\x43\xf4\xad\xa9\x7c\xd8\x34\x41\x19\x38\x8f\x4d\xb7\x11\x37\xa7\x76\xaa\xf9\xc9\x22\xcd\x34\x33\x4c\x6d\xc5\x58\xe4\xeb\xd7\x30\x8a\xeb\x01\x52\x91\xbb\xde\x23\x73\xc9\x0f\x19\x8c\xd3\x08\x25\xf5\x30\xa8\x74\xbd\x11\x86\x7d\xea\x0c\x58\xfa\x6e\x3e\x20\xac\xd5\x34\x3c\xf7\xc7\x26\xfd\x4f\x8f\xd4\x00\xdf\x11\x73\x35\xb1\x11\x98\x87\xf3\xce\xf0\x2c\x6d\x3c\x6c\xb9\xb7\xd7\x43\x58\x60\xc5\xf3\x40\x98\xc3\x55\xc4\xbb\xab\x61\x00\xc6\x3a\xe5\x5e\x85\x2e\xde\x9c\x36\xa1\x08\x6a\xda\x5a\x38\x2e\xed\xa9\x11\x57\x03\x61\x0e\xef\x74\x72\xf8\xd1\x5c\x8b\xc3\x71\x02\x68\x9e\x25\xfd\xfc\x6e\x8e\xcb\x80\xd2\x8c\x50\xda\x1e\x6d\x8c\x4c\x59\x2f\xad\x44\x74\xca\x14\x68\x5b\x20\x62\x56\x4a\x8d\x88\x2a\x6f\xf3\xc6\x08\x1d\xaf\xbc\x81\x78\x18\x8e\x09\x6f\x3a\xd4\x95\x6c\xed\xd8\xcc\x8a\x7a\x4d\xe6\xd6\xbe\x4b\x35\x5b\xa3\x35\xea\xdd\x45\xb8\x5a\xc1\x63\x82\x2b\xf0\x19\x9c\x83\x6b\xf0\x1e\x1c\x2b\x7e\xf3\xe2\x21\xf1\x9b\x6f\xff\x24\x7e\xf3\xe4\x91\xdf\xfc\x77\xe7\x37\x09\x77\xf9\x51\x72\x97\x96\xce\x6d\xe4\xe0\x39\xd5\xfd\x51\xd5\xb6\xc5\xac\x7e\x0b\x6d\x5b\x4e\x0d\x5b\x39\x03\xd9\x22\x95\xeb\xac\x12\x52\x8b\x66\x8a\xbd\x51\xe4\x31\x40\xc5\x07\x26\x02\x2e\x85\x02\xad\x5a\x9f\x2a\x7d\x78\x82\x48\x9e\x19\x74\x70\x26\xb4\x67\x89\xa1\xd2\x3b\xa1\x75\x46\xf3\x85\x16\x1b\xdb\x0b\xc0\xb4\xae\x26\xcb\xd9\x69\x56\x9e\x34\x25\xa0\x45\x63\x9f\x5b\xee\x45\xb8\x08\x70\xbe\xac\x58\xc7\xb2\x6e\xce\xb3\x24\xf1\x82\x5e\x82\xd2\x0b\x18\xfb\xba\x89\xae\x4e\xc8\x46\xb8\x78\x49\xc3\x5c\x53\x4a\x75\x14\xe1\xd1\xd4\x0c\x86\x69\x54\x39\x08\x4a\x47\x8e\xdb\x1f\x55\x8e\x5b\x66\x98\x43\xc3\xd5\x1c\x67\x49\xc2\x73\xdc\xf6\xe2\x9c\x52\xfe\x0b\x7f\x19\x8e\xfc\x65\x18\xfb\xfe\xe5\x16\xbc\xe6\x85\x99\x34\x80\xab\xf4\xe4\x67\x4e\x2f\x7f\xb6\x3e\xd7\x64\xf7\x3c\xe7\xd5\xde\x3a\x38\xce\xb7\x7a\x53\x35\x4d\x12\xe4\x68\xbe\xf0\xc0\xb5\x85\x87\x27\x61\x05\xef\xad\xef\x63\x88\x47\x53\xba\xe6\x1e\x38\xd6\x38\x40\x63\xb6\xb4\x40\x08\x76\xb2\x60\x96\x0f\x88\xb4\x67\xf9\x6c\x4d\x55\x65\x4f\x6e\x63\x2f\x08\x74\x56\xaf\x5d\x9e\x56\x05\x47\xe3\xc5\x03\xae\xe6\x14\x7b\x55\xc3\xcb\x36\x5f\x35\x1b\x91\x3a\x20\x5e\xe0\x4a\x9e\xab\xf0\x30\x3d\x6a\xb0\xa1\xde\xb1\xb5\xcd\xef\x4e\xc3\xf0\x98\xd4\x44\xad\x8b\x6d\x05\xab\x95\x68\xc9\x65\xcb\x12\x5c\x85\x27\xfe\xe5\x7d\xe6\x87\xf8\x6c\x23\x10\x3c\xe0\x5d\x21\x38\xaf\x8e\xc0\x9d\xfb\x76\x6b\x55\x98\x85\xc7\xd8\xed\x1e\x18\xa8\xbb\x76\x35\x91\xdb\x00\x28\x00\x97\x3a\x85\xeb\x1a\x5c\x3b\xcd\x9b\xa3\x5d\x33\x6c\x79\x3a\xda\xe9\xdc\x6a\xda\x5a\x38\xae\xed\xe5\xa1\x37\xcd\x60\xbc\xed\x62\xbc\xb7\xe1\x8a\xcb\x6a\x30\xdd\x16\xf4\xb1\x0d\x5a\xbf\xef\x06\x93\xed\x85\x09\x97\x84\x67\x59\xca\xff\x34\xde\xe5\x63\x2b\xde\x65\xad\xd8\x7d\xed\xe3\xf2\x6e\x93\xec\x4a\x66\xbc\xd4\x1d\x02\x1f\x0e\x7b\x31\x7d\x24\xf3\xbf\x05\x32\x7f\xd2\x90\x7c\x2a\xed\xc1\x3f\x16\x51\x12\xf8\x56\x88\xda\x0f\xe4\xd7\x3b\x46\x35\xab\x27\x57\x4f\x22\x45\xa9\x84\xde\x58\x46\xba\xdf\x1e\x52\x37\xcf\x32\x2c\xdc\xde\xd2\x5e\x96\x07\xbe\x37\x2e\xde\xc8\x48\xa2\xde\xb8\xf8\x90\x65\xf8\x8d\x8a\x0f\x9a\xb4\x0f\xe4\xe0\xa2\x43\xc7\x56\x5c\xdc\x98\x53\x7c\xe2\xbb\x8e\x7c\x5e\x29\x33\xfa\x02\x66\x76\x39\x4a\x60\xf1\x2b\x4a\x2f\x44\x05\xee\x1b\x45\x1d\xda\xa7\x96\xa7\xb3\x88\xc2\x7a\x57\xe6\x37\x73\x1b\x83\x3e\x92\xed\xd3\x53\xcd\xaa\xe0\xcd\xc9\xd8\x3e\xac\xfd\xb0\x82\xc2\x9e\xcf\xed\xdd\xfe\xa5\x4f\xb7\xf6\x14\x4d\x56\x3e\x45\x54\xc4\x79\x3f\x11\x64\xe5\xc5\x9c\x7f\x59\xb9\xcf\xdd\x5c\x33\x89\x1d\xb9\x96\xc5\xc9\x0c\xfc\x94\x47\x96\x32\xa4\x09\x6c\x1a\xab\x85\x46\x78\xee\x17\xee\x18\x30\xae\xb8\xdd\x02\xd0\x0a\x67\x59\xd9\xa5\xcd\x6f\x8d\xbc\xea\x89\xc9\xe2\xab\x92\xa7\x29\x97\xaa\x47\xb1\x4f\x09\xbf\xa9\xbe\xbe\x90\xa3\x20\xec\x7a\x96\x9e\xd2\x79\xa0\xfa\xfe\xe0\xf6\x36\xd5\xff\x5b\x27\x16\x95\x0c\x86\xb3\x22\xe0\xa1\xb5\xf5\xee\x2e\x0e\x21\xaa\x89\x43\x88\x99\x6d\x6d\x35\xe0\x1f\x29\xd8\x41\x63\x6a\x17\x29\x42\xd3\xfd\xf4\x97\x03\xc1\x92\x42\x3d\xb8\x77\xb1\x18\x16\x38\xf7\x0f\xc0\xe1\x8f\x41\x0f\xe7\x68\xe6\x07\x65\xaf\xd7\xd3\x8a\x04\x84\xee\xe1\x01\x10\x7f\xcb\xaa\x9f\xf4\x48\x6e\x68\xf5\x54\xce\xb3\xee\x25\xfa\x7c\x47\xc9\xf3\xea\xc8\x51\xe5\x83\xe2\x0e\x2e\x49\xbe\x4e\xa3\x39\xac\x5a\x66\xcd\xd9\x2a\x21\x58\xec\x53\x17\xaf\x6e\x81\x73\x82\xbb\x51\x4e\x0e\x16\xec\x92\xa9\x95\x93\xef\x54\x1d\x2e\x1e\x02\x09\xfb\xfe\x91\x84\xfd\x16\x48\xd8\xe3\xd0\xa7\x32\xe9\x85\xb2\xac\x11\x66\xb5\x04\x66\x41\x65\xd0\x9b\x5f\xe9\xd7\x56\xc2\x6f\x41\xec\x89\xef\xdc\x53\x51\x51\x79\xd7\x52\x54\x39\xcf\x92\x6c\xb2\x54\xae\xef\xa2\x84\xbd\x4b\xef\xa8\xea\x76\xec\x2c\xd3\x33\x99\x4e\x9d\x35\x5e\xc6\x13\xa8\x59\xdb\xc8\xde\xc4\x13\xf8\x9e\xba\x6e\x2a\x13\x15\x51\x76\x89\xe0\xd5\x9c\x9a\x4a\x25\x8b\x59\x5a\x28\x97\x0a\x51\x61\x8a\x26\xd3\x04\x4d\xa6\x58\x47\x7f\x55\x19\x96\x36\xb5\x52\x10\x6b\x95\x9e\x90\xcb\x47\xca\x5f\xb9\xb9\xff\x09\x0d\x66\xcd\xb0\x6b\xe2\x46\x31\x4f\x34\x12\xe8\x08\xa6\x18\xe6\x85\xb8\xf4\xc3\xc3\xdb\xdb\xc3\x30\x64\x6f\x83\xd5\x7f\xfe\x1c\xec\x8a\x20\x95\xc2\xbe\xde\x05\x4e\x64\x81\x84\xd4\xda\x46\x80\x0f\x44\x9a\x08\x6e\x97\x75\x89\xe8\x98\x03\x1f\x06\xfb\xf4\xd3\x0c\x46\xf4\xd7\xd3\xde\x8f\x32\xe7\x26\x03\xf9\xc6\x1e\x0d\x3f\x88\x75\x9d\xbd\xbd\xf5\x59\xf8\x5b\x73\x1a\xb8\xa9\xbf\xf9\x51\x0f\x91\xad\x77\xf7\xa7\xf0\x87\x03\x31\x97\x2f\x60\x5a\xd8\xae\x2d\x95\x06\x4f\x7f\x3c\x28\x49\x97\x5f\x65\xf9\x3b\x6e\xc2\xc3\x6d\x7e\x48\xad\x3e\x04\x6a\x3c\x7d\xa8\xcd\x17\x60\x92\xa3\x3e\xec\xe5\xb0\xc8\x16\xf9\x08\x0a\x55\x06\x18\xcd\x17\xc6\xe7\xd1\x7c\x01\x34\xce\xad\x3f\x38\x03\xa8\x38\xe1\x41\xee\xfb\xbb\x87\xa5\xe8\x80\xda\x52\x66\x58\x58\xd8\x1b\xc2\x24\x4b\x27\x05\x4f\x53\xef\x05\x3d\x14\xfb\x62\x61\x34\x5d\x4e\x1f\x52\xc3\xc3\x3e\x06\xe7\xd9\xf0\x4d\xdc\x47\x80\x3a\xbe\xfc\x27\x5c\xf6\x7f\x39\x79\xff\xae\xc7\x5e\x3a\x34\x5e\xfa\x03\x44\xc3\xa4\x71\xbb\x6b\x42\x38\x9e\x05\x6a\x48\x1c\x22\x8c\x3f\xb8\xc7\xe6\x28\x27\x83\x64\x75\x8e\x59\x4c\xda\x26\x30\xfb\x58\x83\xd7\x58\x7f\x34\x5f\xec\x63\x0a\xdc\x9a\xb2\xe1\x02\x25\xf1\x29\xdf\xc7\x4e\x0a\x89\xae\xb2\x30\x71\xa4\x5f\xb4\x45\x00\x28\x1c\x9c\x81\x94\xfc\x5f\x4e\x5e\x3c\xa8\x5e\x37\x18\x3e\xbd\xa1\x84\x95\x5a\x42\x41\x55\xd1\x1b\x15\xb1\x84\xb0\xd0\xca\xf4\x6a\x6e\xa2\x9d\x94\xd5\xc2\x01\xc8\x07\xb0\x87\xe2\xb3\x10\x97\x81\x68\x42\x1f\x59\x6c\xa2\x14\xc0\x8c\xc5\x4e\xa9\xe5\x09\x5d\x6d\x80\xc2\x7c\x80\xcf\x28\xcd\x87\x78\x87\x76\x44\x34\x64\xbd\x07\xc6\x2e\x42\xc1\x0e\xd2\xc7\xcd\x7a\x95\x06\x32\xdf\x43\xda\x13\x5b\x64\x27\x19\x64\x67\xb7\xb7\x3e\xf9\x27\x1c\x9c\x05\x80\xfc\x21\xea\xab\xbe\x17\x61\x2a\xdf\x59\xba\x4d\xc3\xa7\x3e\x1c\x60\xed\x68\x10\x20\xd6\x17\x0a\xcf\xfa\x26\x27\x08\x06\x01\xb8\xa1\xfc\xe4\x8d\x76\x1f\xf5\x75\xea\xa3\xd0\x93\xd4\xa6\xd1\x0c\xf2\x9d\x5e\xf4\x0b\x46\x7a\xa8\xb4\xbd\x4c\xaf\xa2\x1d\xb8\x37\x69\x0c\xaf\xfb\x09\x10\x69\x25\xc8\x69\xa0\x8e\x68\xcc\xb5\x9f\x86\x61\xee\x53\x85\x9e\x2b\xf0\xb1\x3f\x38\xfc\x11\xfc\x55\x0b\x7a\x4c\x2f\x3d\x16\x32\x39\xf0\x53\x1e\xaa\x59\xc8\x91\x83\x20\x28\x77\x8c\x2b\x36\x5c\x00\x24\x43\x2f\xab\xad\x98\xa5\x2f\x22\x1c\x51\x95\x5a\xcd\x67\x7f\xc0\xb2\xf1\x7a\x2c\x49\x31\x8c\xbb\x74\xc0\x1e\x21\x0f\x09\xf1\xdf\x47\xe5\x59\x50\x8e\xa2\x39\x5e\xe4\x50\x84\x6a\x80\x66\xd0\x81\x50\x7a\x2e\x61\x98\xcf\x50\x0a\x7f\x37\x6f\x5c\x3f\x28\x8b\x69\x76\x45\xf6\xac\xc8\x8f\x6b\x66\xed\x7d\xc7\x22\x17\x1e\x80\xb4\x57\x58\x49\x7b\x49\x11\x35\x11\x95\xd9\x3a\x64\x7c\x17\x55\x21\xb4\x7f\x87\x21\x7c\x46\x26\xbf\x0f\xed\xaa\xed\xd1\x88\xa8\x27\x7c\xc6\x48\x0d\x57\xde\x04\xf5\xdd\x86\xc7\x46\x7d\xca\x9e\x61\xf3\xaa\xa5\x9a\x8b\x9f\xb3\x05\xe5\x7d\x8f\xa8\x79\xe9\x07\x1a\x79\x91\xad\xaa\xe3\xf5\x17\x73\xac\xbf\xf9\xe1\x4d\x02\xc7\xb8\xcf\xed\xb1\x59\x7c\x86\xff\xfb\x09\xd9\x07\x63\xfc\x04\xf5\xae\x50\x8c\xa7\xfb\x3f\x00\x9c\xcd\xcd\x3a\xff\x7a\x82\xc8\xc6\x29\xcb\x29\x8a\xa1\xe8\x1f\x5f\x10\x17\x6a\x2a\x88\x89\x8a\x22\x1b\xa1\x08\x6b\x04\x51\xc1\x43\xbb\x68\xe3\xd6\x5a\x85\x61\x53\x29\x3d\x1a\x5a\x11\x25\xa2\xc8\x3d\x69\x52\x0e\xda\x69\xb2\x9d\xf7\x44\x15\xeb\x08\x0e\x6a\x01\x9c\xed\xd0\x7c\xd7\xc6\x75\xa8\x36\x43\x75\x97\x95\x2c\x52\xb9\xbe\x59\x04\x58\x11\x84\x90\xc2\xe5\x6a\xec\x92\xc6\xf0\xbc\xd3\x6d\x6d\x4f\x92\xbe\x1d\xcc\x67\x61\x93\xd9\xa0\xf9\xc0\xef\x61\x36\xa0\xbc\xeb\x55\x20\x9e\x8d\x3b\x89\xf6\xf6\x50\xdb\x4e\x1e\xd0\x4e\x8a\x7b\xf0\xa7\xc3\x83\xdb\x5b\xf9\xa3\xf7\xdf\x7f\xfc\xde\x4d\x9a\xf1\x4c\xdf\x5c\xe1\xf4\x5c\xed\x46\x2b\xd7\x37\xdf\xa0\xa5\x7e\xf8\xd5\x82\xb8\xae\x06\xbb\xd4\x7d\x14\x44\x1b\xeb\xb3\x36\x49\xdb\x5f\x44\xf5\x37\xf3\x8d\x8b\x44\x36\x03\xbf\x30\xf3\xf7\x7f\x92\xdb\xe4\xa7\xff\xeb\xe0\xe0\xd9\x61\xff\x87\x92\x86\xa7\x14\xd3\x74\x63\x4f\x93\x20\x7a\x0f\xa4\x57\xb0\x63\x72\x4b\xe7\x57\xe6\x1b\x9b\xc2\x6b\x1c\xf0\xd0\x55\xe2\xd4\x53\xdb\xa5\x04\xa5\x90\x3c\x9a\xa3\x45\x7e\x09\xfd\x82\xfd\xfb\x73\x54\x10\xc6\x07\x87\xab\x26\x12\xa0\xf0\xc2\x8c\x75\xf3\xc7\x02\xe6\x4b\x36\x6b\x59\xee\x7f\x1a\x50\x69\xa1\x6a\xd0\x45\x71\xe8\x7d\x77\x83\x7b\x28\x2e\xbd\xb3\x4f\x41\xdd\xb5\x1d\x80\x34\x7c\x9e\xe7\xd1\xb2\x37\xce\xb3\x59\x03\x8a\xe7\x49\xe2\x7b\x9c\x2a\xed\xf4\x86\x51\xde\x43\x45\x57\x66\xa2\x0a\x14\xfd\xa1\x11\x6a\x34\xbb\x7c\x81\x7d\xcf\xd1\xbb\x33\x2f\xa0\xc4\x4e\x01\xb1\x7e\xaa\x62\x80\xf4\x86\x3d\x21\x2d\xeb\x72\x4a\xcf\x1a\x36\xa1\x7c\x69\x6f\xea\xc6\x4f\x07\xcf\x19\x81\x01\x04\x88\xd0\x42\x1a\x27\x27\xfe\xba\xf0\x61\xed\x0c\x91\xff\xed\xa4\x6e\x62\xf4\xad\x0f\x07\x07\x67\x00\x81\xc3\x83\x03\xd0\xfb\x91\xcc\x26\xf9\x74\xa8\x7d\xda\x81\x8c\x90\x3b\xf1\x31\x48\xc9\x07\x8d\x56\xcc\xc9\xbb\x91\x84\x83\x03\xd0\xfb\x1b\x38\x3c\x03\x59\x38\xa0\x7f\xd8\xe8\x72\x06\xe2\xd4\xef\xf5\x7a\x1f\x7d\x04\xe0\xe0\x87\x33\x90\x10\x8a\xf1\xe0\x2c\x00\xe6\xe7\x8c\x7c\x3e\x3c\x63\x4e\x3b\x95\x6b\x20\x67\x43\xc6\xe1\x53\xe8\xe3\x40\xc6\xe6\x92\x1c\x7f\x78\x73\x6d\x3d\xcb\x60\x69\xbd\xc1\x65\x19\x04\x65\x09\xe6\xe1\x7b\x3f\x36\x8c\x21\xb8\x70\x63\x90\xdf\x91\x96\x69\x66\x63\x90\x62\x92\x01\xea\x31\x63\xbe\xcd\xdd\xbd\x35\xf7\x30\x21\xff\x22\x58\xa9\x6a\xc8\x42\xab\x84\x30\xf7\x81\xd7\xa0\xe9\x07\x67\x65\x49\x23\x34\x59\x5d\xd0\xa5\x3d\xf7\x3a\xf8\xa9\x1b\xb3\x2e\xcc\xb9\x57\xfc\x13\x37\x7e\x2e\xa9\xba\x0f\xd4\x64\xca\x03\xb0\xac\xec\x35\x4d\x08\x76\x2f\xcb\x7e\xdd\x3f\x00\xcb\xfe\x01\x5d\xef\x4b\x1b\x7b\x45\xcc\x76\x2f\x93\xfe\x43\x49\x03\x1e\x58\xb8\x9d\x12\xbc\x7b\x5d\xf4\xcf\xd5\x13\xa7\xcb\x07\xef\x65\xfa\xe9\xbc\x9f\xd7\x20\xe6\xa2\xc7\xed\x3d\x91\x2c\xf0\x86\x50\x66\x2d\xff\x8d\x06\x30\x01\x88\x75\xd3\x30\x0b\xa5\xc9\x00\x6f\x8e\xd3\x82\xd3\x8c\xd4\x62\x9a\x37\xc7\x6a\x03\x5a\x8d\xf6\x54\x6a\x2a\xb7\x40\x29\x80\x34\xa3\xd3\x98\xd0\xcd\xd1\xe9\x40\x9a\xd1\xb9\xf8\xd8\xcd\xf1\x3a\xa1\x35\x77\xa0\x8e\x16\xdf\xbc\x13\xb5\x10\x9b\x3b\xa2\xd1\xf0\x9b\xe3\xd6\x81\xac\x38\x42\x55\x72\x7f\x8b\x73\xe4\x00\x66\xa1\x8f\x03\xc3\x9d\x48\x7b\x31\x60\xef\xfa\x09\x94\xe2\x91\x65\x1f\xf6\x96\x4f\x44\x08\xce\xfd\x1f\xca\x8a\x63\x0f\x48\x85\xec\x21\x0f\x9d\x49\x1e\x69\x72\x90\xe2\x8f\x1c\xb3\xc4\x21\xf3\xec\xca\xc7\xbd\xeb\x2e\xec\x5d\x83\x1f\x82\x27\xda\xb7\x65\x17\xf6\x96\xe0\x87\x20\x28\x69\x7b\xa1\x01\x65\x8e\x3c\xf9\x4f\xe8\x59\xda\x47\xfb\x79\x50\x71\xf1\x51\x09\xe9\x04\xdc\x3c\xe4\xd0\x76\x8c\x61\xa5\xdf\x23\x3e\xa0\xfc\x7b\xa4\x8d\xe4\xa3\x65\xaa\x82\x18\x01\x8b\xc2\xa7\x02\x43\xa0\x61\x3d\xf5\x83\x9b\x71\x96\xfb\x34\xad\x4e\x28\x35\x70\x9c\xad\x03\x38\xa4\xbe\xfe\x84\xdf\xf1\x61\x00\x50\x78\xf0\x77\xf4\x13\xfc\x3b\x7a\xf2\x24\xc0\x03\x74\xa6\x1a\x0c\x90\x4c\x11\x87\x25\x93\x30\x20\xdd\x87\xbd\x25\xa1\xad\x95\x16\xf1\xb8\xad\xc2\x7f\x5f\x11\x7a\x5f\x9f\x1d\x85\x08\x78\x1a\xeb\x42\x32\x87\x6a\x48\x8d\x81\x8b\x22\x2c\x51\x37\xec\x8d\xb2\x74\x14\x61\x1f\x1b\x52\x75\x26\xa3\xfd\x79\x69\xfa\x9d\x17\x27\x02\xab\x47\x58\x91\x01\x8f\x17\x16\x4d\x26\x39\x9c\x44\x58\xef\x8c\xd4\x78\x58\x9d\x72\xf5\xbb\x2a\x7e\x27\x6c\xe2\x93\x90\xe9\x49\x20\x67\x62\xc9\x6f\xae\x64\xa1\x02\xf6\xd1\x7c\xd1\x3f\x10\x2a\x9e\x83\xd2\xee\x0a\x79\x85\xea\x3a\xd1\x6a\x66\x36\xec\xc5\x26\xa6\x25\xfb\x29\x63\x14\xee\xd0\xbe\x84\x5b\x37\x8b\xd4\x38\x45\x2b\x03\x66\x75\x8d\x8d\x1e\x92\xcd\x47\xfc\x68\xf3\xf1\x2d\xd8\x7c\xcc\xab\xf9\xad\xd7\xb1\xe9\x18\x69\x66\x7a\x1e\xc8\xb8\x0d\x83\xfc\x8a\x66\x30\x2d\xc8\x6d\x44\xc5\x8f\x1e\x88\xac\x0a\xf3\x28\x8e\xe9\x89\x2b\xac\x82\x2a\xc3\xbd\xd0\x2c\x20\xa6\x22\x28\x77\xe5\xfe\xd1\xb4\x75\xcf\x9c\x5f\x7d\x53\x8a\xcc\xaf\x9d\xa0\x7f\xc8\xec\x12\xa8\x91\xe1\x6b\x17\x78\x49\x5f\x90\x6a\xbc\xdf\xbf\xc2\xb1\x5d\x8d\x97\x3c\xf9\xe1\x80\x79\xa2\x71\xd9\x60\x03\xc8\xee\xa1\x51\xf3\x5f\x8c\xdf\x76\x56\x7d\xf2\x03\x37\x9f\x58\x36\x56\xa2\x55\x66\x51\x71\xd1\x80\xf5\x09\xfd\x9b\xc3\xe1\x71\x3a\x71\xe4\x1e\xba\x02\xf5\xe4\x87\xef\xf5\x51\x4a\x44\x6f\x62\xd9\xe4\x93\x21\xac\xec\x92\xd2\x2e\x4d\xf9\x9b\xf7\x26\x0b\x14\xbf\xca\x72\xa6\x7e\x08\x78\x1c\x15\x1a\x1b\xce\x5e\x4a\xed\x19\x63\x44\x0b\x7b\x87\x9a\x5f\x65\xba\x9e\xeb\xbd\xb7\x54\x1f\x2c\x1f\x27\x4a\xe9\x45\xc3\xc2\x17\xdb\x82\x1b\x1d\x74\xe9\xa3\xc5\x7f\x04\x5d\x59\x0d\x5b\xd5\xb0\x5e\x2d\x08\xca\xa8\x58\xa6\xa3\x4e\x0e\x93\x2c\xa2\x2f\xa7\x14\xb5\xcb\xde\xa2\xe2\x38\xca\xc9\xd1\xdf\xdb\xf3\xa3\xab\x08\x61\x7b\x38\xac\xb1\xf0\x46\x25\xa7\x2c\xd4\x45\xf2\x2f\x22\x1c\xf1\x78\x96\xe6\x51\x0b\x82\x32\xa7\x91\xda\xa5\xaa\xd6\xaa\x10\x42\x5d\x31\xd0\xd5\x57\xd5\xf8\x41\xb6\xf8\xda\xc8\x79\x02\xba\x0f\xb2\x07\xba\x34\xbc\x25\xd2\x1d\xbc\xcb\x0d\x80\x2c\xe8\x32\x82\xa7\x35\xa0\xf5\xbb\x19\x94\x0e\x29\x0f\xa3\x34\x13\x88\x6f\x58\x56\xbd\x3e\x2a\x43\x9e\xb6\xa3\xaa\xc5\x03\x6e\x7d\xd1\xab\x6c\xb4\x28\xea\x94\x49\xb4\x90\x1a\x5d\x94\x6a\x5b\xfe\x9c\x2c\x72\x63\x7b\xe8\x2d\x48\x61\x1d\x34\xd6\xb0\x1c\x25\x30\xca\x5f\x8b\xd1\x98\x3a\x1d\x5b\x15\xac\x25\xcf\xd0\x31\x72\x53\xa8\x3a\xad\xd4\x0a\x6d\x95\xb6\xa5\x85\x4a\x8f\xa9\xf0\xcd\x62\x91\xbc\x50\x9f\xef\xba\x61\xb7\xd2\xc9\xc1\xa0\x1c\x65\x29\x8e\x50\xca\x6d\xc1\x4f\x85\xb9\x52\xab\x2b\xa2\xc8\x66\x90\x6b\x41\x0c\x3b\x27\x61\x7c\xc6\x2c\x82\x4c\xc0\x7b\x7b\x35\xa6\x56\x8e\x46\xbf\x64\xc3\x37\x71\x20\x95\x65\x74\x2f\x6a\xe7\xc1\xbe\xed\xe8\x93\x8c\xc2\x03\x90\x86\x07\x96\x76\xe4\x6c\x87\xb0\x74\xdc\x20\xa7\x93\x8d\x3b\xc2\x1e\xe1\x46\xb3\x8e\x8a\x2c\xeb\xaa\x42\x37\x88\x5a\x94\x61\x06\x46\x61\x46\xba\x39\x38\x38\xa3\xb8\xe2\x30\xfa\x1e\x76\x0f\xc1\x3c\x2c\xc8\xbf\x3b\xa3\xbd\x3d\x3f\x7e\x12\xf6\x7e\x04\x73\xf2\xff\x01\x58\x90\x0f\xdd\x2e\x98\x77\xbb\x01\xe0\x1a\x18\xdd\x96\x2c\x03\x2c\xbf\x45\xff\xf0\xe0\xe0\x7b\x04\x78\xaa\x71\xfa\x2b\x02\x94\x47\xef\xcb\xdc\x9b\x31\x38\x08\xc0\x75\x1f\x7d\x0f\x9f\xf8\xa3\x67\x07\xfd\xde\x8f\xc1\x13\x7f\xf1\xac\xf7\x63\xff\x20\x00\xd2\x37\xa1\x9f\xe9\x5e\x4b\xec\xbe\x38\xa1\x79\xa8\x09\x71\xb6\xa2\x07\xa9\xd1\x83\xc2\xee\xc1\x9c\xf5\x20\xdd\xa2\x07\xe8\x49\x18\x81\xf4\x49\x58\x94\x9c\x73\x27\xcc\x8a\x34\xf4\x4b\xc0\x68\xbe\xf8\x00\x67\x11\x22\x57\x5f\xff\x86\x8d\xb6\xf7\xa3\xdd\x11\xd8\x45\xdf\x43\x70\x10\x94\xbc\xa1\xd1\x24\xad\x69\x92\xf2\x26\xa3\xf9\xe2\x57\x42\xa7\x90\xba\x95\x7b\x93\x8a\x44\x0c\x8a\xc5\x7c\xea\x39\xc2\x75\x00\x94\x65\x59\x82\x2c\x8c\xfd\xc4\x10\x5b\x51\x92\xef\x5e\xc4\xd2\x64\x4a\x07\x67\x62\x4e\xb9\x3a\x28\xaa\x74\xc0\xa6\x2e\xef\x45\x3c\x7f\x40\x70\x17\x36\x6e\x49\xb8\xde\x0b\xce\x1f\x4b\x6a\xe8\x66\xe1\xfc\xc2\x4a\x28\x0b\xbb\x22\x63\xd6\x12\xfb\xd5\xc1\xa0\x47\x59\x93\xf6\xd9\x15\x59\x96\x99\xcd\x11\xd1\xf6\xcd\x48\x74\x22\x65\x73\x54\x06\x94\x66\x84\x6e\x9d\xd2\x86\x78\x5d\xc0\x9a\xd1\x9b\xd4\xc6\xe6\x98\x2d\x38\xcd\x48\x4d\xc2\x64\x73\xa4\x16\x9c\x66\xa4\x8a\xc2\xd9\x1c\xa1\x06\xa3\x0d\xb2\xbb\x58\xd2\x0a\x24\x0b\x71\xa2\xfb\x50\xce\x57\xca\xc1\x72\xc4\xa3\xe5\xb5\x72\xe5\xc7\x70\x36\x4f\x22\x0c\xbb\xe3\x88\xf0\xfb\x4b\x97\x14\xac\xad\xf8\xcc\x15\x9a\xcc\xf2\xc8\x6a\x9f\xd9\x47\xc9\xcf\x66\x0f\x49\x7e\x36\x7c\x94\x9f\xfd\xbb\xcb\xcf\x18\x31\x3e\xe6\xbe\xb5\x34\x45\xe1\x29\x3f\x45\xaf\xd8\x21\x0a\xfc\x1b\x14\xf7\xbd\x62\xf4\x7e\x1f\x3e\x3f\x7f\xef\x81\x61\x92\x8d\x2e\xfa\xff\x31\x18\x0c\x0e\xff\x06\x0e\xc1\x60\xf0\xc3\xdf\xc0\xe0\x2f\xff\x1d\x1c\x9e\xb1\xb4\x27\x83\x01\xa7\xab\xbc\x71\x5a\x78\x67\x60\x30\xf8\xcb\x01\x38\x00\xfc\xeb\xd9\x19\x10\xbf\x69\x31\xff\x1f\x18\x78\x7b\xbc\x6b\xde\x19\x18\x47\x49\x01\xc1\xc0\xa3\x21\xa8\x3c\xe0\x4d\xa3\x62\xea\x9d\x9d\xfd\x07\x98\xd1\x31\x51\x02\xb7\xe9\xc2\xe8\x4d\x87\x85\x07\x68\x78\x56\x34\xa2\x51\x2d\xfb\xbb\x87\xd4\x28\x86\xda\xf3\x95\x22\xda\x41\x51\x1b\x7e\x8b\x12\x8f\x1f\x69\x66\x71\x3f\xd8\xc1\xf9\x92\x7d\xc9\x61\x41\x26\x4f\x8b\xc3\xc5\x54\x06\x99\x10\x6f\x64\xe9\xc9\x62\x34\x82\x45\xe1\x6b\xf5\xed\x70\x5b\x30\xcf\xb3\x3c\xbc\xa1\xd6\xef\x7d\x58\x8a\x96\xcc\x1a\x5e\xd5\x08\x4a\x1a\xae\xd9\x12\x6d\xe6\x6b\x88\x36\x67\xc2\x11\x8c\x45\xb4\x1a\x71\x09\xe5\x4c\x66\x69\x25\xbd\x53\xe1\x0c\xc4\x77\x3e\x8b\xa7\x34\x9a\xd3\xdc\x70\xdb\xfa\x79\x51\x2c\x2d\xae\x54\xab\xad\x62\x53\xf1\xea\x6f\xe2\xc4\x76\x4c\x32\xab\x93\x0a\xc2\x23\x8c\x4f\x1c\xbb\x6a\xe0\x8e\x46\xcb\x85\x61\xe8\x0b\xa3\x6b\xad\x79\x12\x15\x38\xb8\xbd\x95\xa7\x08\x3e\x63\x7f\xf6\x29\x0b\xcf\xc0\x8d\x17\x09\x87\xcf\xa6\x57\x86\xdd\xda\x55\x13\x4d\x2b\x8c\x35\x89\xdc\x4d\x9c\xf5\xf9\xa2\x9c\x32\x7c\x25\xad\x23\xd6\xc8\xc1\x96\xf3\xa2\x67\xcf\xa6\xbc\xa6\x1a\x8e\xa3\x2e\x2f\x14\xb5\xc9\xc9\x10\xae\x3d\x37\x6c\x92\xfb\x10\xb0\xd9\xe9\x63\x20\x07\xd3\x47\x80\x8f\xa3\x9f\x02\xb6\x7a\xfd\xbc\xa4\x13\x23\x94\xb0\x6b\xb7\x2e\xc5\x2e\x37\x76\xb8\xb2\xfb\x66\x9b\x95\x52\xd4\x72\x36\x7c\x1e\xb9\x4b\x28\xed\xf4\x84\xba\x5a\xb6\x57\x7d\xad\xf4\xb4\xcd\x65\x09\x46\xe1\xd0\x5f\x18\x66\x5a\x6c\x8b\x0e\x92\xfb\x64\x07\x6c\xa4\xe2\x00\xdc\x2b\xd6\xb9\x8d\xd5\x38\x5e\xdb\x47\xa7\xb0\xa0\xcb\x45\x5a\x8b\x88\xab\x01\x11\x80\x85\x4e\xbd\x99\x11\x30\x80\x7f\x00\x70\xaf\x80\xf8\x48\x5c\xc0\xe2\xe9\x08\xfc\x31\x98\x04\x2b\xa9\xbb\xab\xac\x5b\x60\x38\xef\x0e\x17\x18\x53\xa2\xb3\x15\x95\x67\x6b\x34\xed\x24\x8d\x2d\xe3\xcc\xf2\x54\x27\x1b\x06\x94\xad\x4d\xdd\xa8\x48\xbd\xe5\x43\x22\xf5\x2e\xff\xa4\x00\xb2\x57\x8f\x24\xe6\xbf\x3b\x89\x49\x68\xad\xcf\x9c\xd6\x8a\xac\xe0\x2e\xd6\x0d\xc0\x93\x38\x46\xee\x28\x2f\x69\x82\x52\x78\x0a\xaf\x71\x7f\x1a\x15\x5d\xf6\xb3\x8b\x69\xaa\x2d\x6f\x1c\x91\x6a\x3f\x47\xa3\x8b\x49\x9e\x2d\xd2\x98\x56\x61\x1f\xbb\x43\xf9\x55\xa5\x3d\x11\x21\xa8\x0a\x1c\x61\xe8\x01\x0f\xc5\x09\x54\xb9\x1d\xed\xd2\x79\x9e\xcd\xe6\x32\xb3\x63\xe2\x22\x18\xc7\x59\xee\xff\xfd\xef\x54\xeb\xd2\x81\xa1\x88\x9d\x9a\xf4\xae\x22\x84\x5f\x65\x39\x4d\xff\x1c\xf8\x32\x29\xf4\x30\x8b\x97\x34\x5f\xc5\xe8\xc2\xe3\x2e\x77\xd2\xd9\x85\xeb\x02\x7c\xd8\x63\xea\x9b\x80\x3b\x86\x53\xed\x1a\x4a\x27\x47\x64\xdb\xe6\x2c\xc3\x3a\x2f\x62\x49\x3f\x68\x8e\xe6\x37\x74\x24\x94\x74\x2c\xfc\x59\xb8\xf0\xfd\xe1\x16\xca\xf1\x4b\x11\x90\x26\x4e\x20\xcb\x6a\xe6\x79\xea\x2b\x0b\x96\xe9\xf8\xce\x7a\x58\x5b\x40\xbb\xfe\x16\x16\x45\x34\x81\x66\x05\xd7\x18\x99\x67\xda\xa5\x54\xc8\x6b\x81\x71\x54\xbb\x04\x4d\xd2\x0f\x4c\x3e\xa3\x7f\x57\x9b\xc6\xfc\x6e\xad\xfb\x52\xc6\xdd\xa1\xd3\x27\x03\x31\xa8\xef\xc7\x90\x39\x94\x18\xfd\x9a\x5a\xd5\xd8\x7c\xbc\x67\xe1\x4b\xdf\x2f\x70\x81\x62\x28\xc3\x32\x94\x59\xca\x5b\xfb\xc1\x0d\xf9\x41\x2b\x93\xbf\xe5\xba\xf9\x76\x3c\x5e\xad\x8b\x4c\x1f\xe8\x40\x60\x84\x2c\x65\x3b\xf5\x55\x96\xeb\x1d\x75\x82\x95\x7b\x9a\x7a\xb3\xe9\xee\x4e\xf5\x98\x0c\x22\x6e\x24\x07\x93\xa9\x5c\x38\xb0\xc8\x92\x4b\x6e\xa1\xa0\x8d\x57\xa4\xb6\x51\xf0\xab\x3b\x96\xd2\x85\xe3\xf0\xca\x1f\x9a\x99\xe4\xd8\x8a\xdc\x45\x52\xeb\x0a\x68\xe7\xa2\x6e\x9f\x7a\x70\x62\x63\x72\xef\x8b\xed\x43\xae\x5a\x68\xd4\x6c\x82\x01\x6a\x4d\xfa\xd5\x80\x08\xc0\x50\x27\xfd\x2c\x54\xce\x7d\xb6\x39\x5a\x37\xb8\xe6\x2e\xf0\xfd\xb7\x39\x52\x01\xc0\x42\x33\x0b\x87\x41\x70\x7b\x3b\xa3\xff\x69\xf4\xee\xe7\x1a\x7a\x56\xa4\x9a\x2a\xf6\x35\x2d\xe8\xbe\x9e\xe9\xc8\x49\xd7\x8a\x66\xae\xd0\x4f\x35\xf9\xf7\xa8\xcf\x5c\x77\xce\x12\x8d\x38\x88\x53\x46\x41\xe5\x20\xd9\xb9\x9b\x57\x3b\x0b\xfd\xbc\xe5\xdb\x41\x59\x76\xd6\x8b\x1d\xd7\x3b\xc2\xb8\x77\x80\x43\x11\x41\x99\x85\x72\x00\x3e\x0a\x93\xe0\x6b\xa5\x8e\x4d\x83\x1d\xdb\xa2\x28\x8b\x21\x13\x2d\x9c\x67\x43\x3b\x2e\x07\x2d\x6c\x0c\x66\x22\x62\x76\x67\x39\xb9\x56\xe1\xc5\x07\xc2\x80\xc4\xac\x22\x80\x81\x00\xfc\xae\x26\x73\xf1\x79\x36\x34\xc2\x67\xa8\xd4\xd0\x14\xc9\xed\xad\x27\xa4\x69\x14\xd2\x30\x87\x51\x3c\xca\x17\xb3\x61\x21\xe5\x0c\x46\x34\x95\xf3\x6c\xc8\x82\xa9\x48\x84\xd4\x68\x44\x09\x16\x06\x37\xd4\xae\xac\xef\xfd\x92\x0d\x0b\x0f\x44\xf9\xa4\xe8\x0f\x48\x6f\x8b\x1e\x4a\x63\x78\xed\xb1\x77\xe4\x8f\xf9\xcf\x0b\x94\xc4\x30\x0f\xfc\x1b\x0b\x5a\x70\x56\x02\x1e\xe9\x81\x0e\x92\xa2\x24\x9f\x10\x4e\x60\xdf\x23\xec\x70\x87\xa7\x82\x66\xa8\x2c\x7b\x06\x03\x27\x19\xbf\x96\x95\x1b\xe0\x1e\x8a\xff\x89\xf0\x54\x22\xac\x44\x7d\x51\x98\x74\x3d\x87\xc0\x54\x4c\xb3\x1c\xbf\x89\x05\x0e\x77\xfc\x51\x0f\xc0\xb3\xf2\xac\x2c\x41\x14\xe6\xda\x45\x52\xc8\x4d\xbd\x08\xb5\xc8\x9c\xa3\x70\x9b\xcb\x1d\xcc\xc3\x9b\x12\xe8\x1c\xd0\xa8\x86\x03\x9a\x13\x0e\x68\xc4\x39\xa0\xb9\xc9\x01\xe9\x3f\xc1\xdc\xe6\x80\xe6\xb5\x1c\xd0\xfc\xf6\x76\x6e\x73\x40\x73\x93\x03\x9a\x87\x8b\x36\x1c\x90\xee\xa4\x80\xfd\x08\x14\x00\x06\xb7\xb7\xb0\x0c\xc0\x3c\x00\xb1\xc6\x01\xcd\x2d\xfe\x64\xce\x39\x20\xe3\xfb\xb3\x79\xf5\xc4\xc6\x92\x03\x9a\x37\x73\x40\x36\x06\xf7\xa5\x43\xba\x38\x27\xc3\xe3\x1c\x50\x38\x07\x79\xb0\x43\xee\x37\x2d\x96\xb3\xf6\x2c\x64\x1b\x3e\x0b\xfb\x22\x8e\xad\xf1\x3c\xac\x07\xe0\xcb\xba\x17\xb4\xb0\x60\x6f\xd3\xe7\xb6\xcf\x21\x97\xf3\xd4\x05\x41\x05\xb9\x12\xb5\x24\x0f\x31\x0c\x6a\x16\xca\x98\xa6\x2a\x09\xc9\x3c\xc2\x53\x2f\x00\x6d\x9f\x5d\xd7\x53\x9b\x70\x66\x84\x52\x0b\x32\xa3\xd9\x4d\x91\xe5\x32\x51\x78\xdf\x23\xbf\xbc\x12\xd0\xaf\x84\x3e\x62\x84\x70\xdf\x8b\x61\x31\xf2\xca\x33\x05\x45\x6f\xe6\x01\xef\x1d\x0b\x3a\xa4\x97\xaa\xe6\x8c\xc5\x4a\xa4\x61\x34\x9e\x8a\xfc\x1a\x49\x6d\xfe\xc7\x44\xb2\x75\x39\x0d\x05\xb0\x7c\x99\xe2\x1c\xc1\xc2\x2e\x47\xc5\x2b\x44\xa6\xd5\xfc\x4a\x98\x19\x11\xfc\x84\x19\x35\xe3\x29\x79\x06\x7e\x85\x94\xf5\x3f\x49\xa2\x62\x6a\xbf\xcd\xa4\x8e\x78\x84\x61\xaf\xc0\x51\x8e\x0b\xd2\xc6\xf7\xf6\xbd\xe0\x19\xec\x7f\xa2\x59\x12\x3f\xb9\xae\x79\x17\x78\x7a\xeb\xa7\xe4\xba\x5f\x45\x7c\xe6\xa6\xf5\x8d\x03\x54\x00\x62\x03\xe5\xe3\x1b\xf0\x55\xbc\x01\xf7\x73\xff\x73\xb2\x69\x6d\xe6\xc0\x2d\x06\xd7\x25\xd8\xb2\x88\x95\x64\x97\x30\xcf\x51\x4c\x56\xad\x5b\xc9\x6a\xb0\x6e\x56\xb6\x19\xba\x46\x69\xb1\x4f\x0e\x3e\x01\xb8\x32\x61\x5b\x7d\x4c\xda\xab\x08\x8f\xa6\xd5\x1a\x33\x26\x16\xea\x8e\xf3\x6c\xd6\x8d\xe2\x68\x8e\x61\xde\x65\xda\xa1\x15\x81\x6b\xc9\xd2\xb0\xc7\xa1\x21\xc1\x1b\xb8\x00\x6f\xc1\x09\xf8\xb8\xa3\xb9\x1a\x3e\x20\x39\xfd\xd1\x9f\x24\xa7\x7f\xf1\x28\xa7\xff\x16\xe4\xf4\xcf\x43\x7f\xce\x6c\x22\x44\xfe\x32\xc6\xc9\x52\xa1\x61\xa1\x32\x76\x8b\xd2\x04\x15\xf8\x24\xcb\x69\xe4\x20\x96\x52\x2d\xd1\xa8\x19\xbf\x46\x29\x1a\xf0\x7c\x6a\x46\x66\x70\x86\xc8\x11\x19\x93\x5e\x8e\xbd\xff\x01\xa3\xd1\xb4\xc7\xc3\xb2\xb3\x24\x6b\x8e\xe6\x92\xe5\xeb\xf1\xfb\x52\x34\xe4\xc1\x12\x69\xbe\xb5\x51\x8f\x5e\x3d\x8c\xe3\x36\x32\x9a\x7b\x01\x58\x32\x0d\x40\x36\xa4\xf9\xa2\xd5\x0c\xa4\xf0\x5a\x33\x6b\x33\x2c\xaa\xbd\x00\x5c\x32\xb5\x85\xcb\x90\xc4\x4c\xdb\x26\xa6\x53\xe5\x47\xe6\x5f\x20\xf6\x3d\x03\x28\xf3\x30\x4f\x20\x86\x9e\x33\x5d\x1b\x57\x98\x0b\xa6\xf6\x28\x5b\x24\x71\xe7\x5d\x86\x3b\x27\x38\x9b\x77\x74\x1e\x37\xe6\x24\x08\xe1\xf4\xfd\x03\x10\xab\xd0\xc8\x10\x78\xb3\x28\x8d\x26\x50\x13\x73\x74\x12\x34\x86\xa3\xe5\x88\xc9\x64\xa9\x1e\xe1\x6a\xbd\xd1\xe5\x90\x12\x55\xfe\x7a\xdd\xfe\xc0\x5a\xdd\x6d\xcf\x3f\x9b\x74\xb4\xaf\x72\xad\xb1\x2f\x7e\x21\x41\x06\x2d\x48\xeb\x53\x33\xf1\x9c\xc8\x28\x77\x6a\xa6\xa9\x13\x79\xe2\x8e\xee\x84\x10\x3f\x72\x13\xe2\x7c\x43\x1f\x35\x10\xe2\xa2\x5b\xe4\x90\x9e\x66\xe4\x98\xaa\x5c\x75\xa7\x5a\x3b\x18\x9f\xb0\xe3\x2d\xb2\xd5\x49\xa8\xf3\x1c\xc2\xd9\x9c\xfa\xb9\xb3\x7b\xe6\xd4\x34\x28\xba\xb0\xa0\xd1\x73\xf5\x8e\x2a\x5b\xde\x56\xe7\x66\xae\x2f\xed\x89\x55\xce\x37\x8d\x5e\xe5\xa3\x66\x79\x44\x2f\x01\x79\x8d\x68\xa9\xec\x9a\xaf\x0d\x2f\xb8\xbd\x1d\x9c\xa9\x98\xa9\xfc\xfe\xe0\xde\x8a\xec\x86\xa8\x87\x5a\xbd\x4d\x6c\x78\x6c\x15\xca\x2c\x7d\x81\x8a\x19\x2a\x0a\xdf\xb1\xd5\x19\x77\xc2\x2f\x94\x7f\x8a\x19\x72\x4b\x0c\xcd\x5b\x86\x45\x8b\xa4\x61\x50\x53\xcc\x7c\x41\xe5\x0c\x4b\x5d\x0c\xe4\x31\x02\x55\x89\xae\x0f\x62\x29\x89\x8b\x0b\x46\x83\x73\xab\x9c\x28\x2d\x10\x81\x7f\x9a\xd1\x9c\x3b\x7e\x53\xba\x1d\x0f\xe0\xa0\x24\x7f\xb0\xe4\x7d\x9c\xfa\xa0\x11\xd6\xf5\xbc\x7d\x7e\x10\x3e\xd5\xf4\x3a\x02\xad\x07\x08\x5e\x80\xce\x82\xb2\x04\xe7\xe1\x0b\xff\xb3\x2b\xd7\xdd\x5d\x65\xb3\xb9\xb6\x11\x88\x6c\x7d\x77\x85\xe0\xbd\x8d\x40\x3f\x5a\xdb\xab\x73\x8e\x2b\xfd\x37\x4e\xe7\xf6\x29\xc3\x2f\x6c\x04\xc2\xea\x6a\xb8\x2d\x64\x0b\x2e\x67\x68\x06\xe3\xd5\x2a\x19\x47\xbb\x00\x7c\xd6\x15\x32\xf6\xa4\x88\xb3\x48\x73\xd9\xad\x05\x5e\x1d\x63\x13\xc3\x5b\x7b\x5e\xb4\x8b\x6c\xfb\x8c\x76\x16\x6c\xfb\x26\xf0\xc0\x60\xb9\xe6\x38\x2a\x20\xac\xf1\x9c\x38\x0e\x82\x71\xfb\x0e\x2e\xb7\x1d\xd4\x47\x1b\x85\xe3\x02\x1f\x5c\xdd\xf1\xd4\xa9\x6b\x65\x0d\xd3\x36\x37\x84\xe6\x3d\x26\x2f\xbc\xcd\x31\x29\x10\x16\xaa\xcf\xba\x52\xf1\xf9\xa6\xd2\x03\x76\x37\x37\x0b\x0f\xbe\x7c\x12\x1f\xf2\xd2\xd4\xa9\xc9\x94\x0e\x4a\xd9\xd9\x6a\xba\x1f\xa1\x8b\x61\x6f\x54\x54\x5c\xb0\x97\x58\x44\x39\x6f\xd2\xcb\xf4\xb4\xbc\xb3\xaa\xa5\x41\xd6\xcb\xb2\xb3\xb2\x4d\x24\x96\x56\xd3\xbf\xbd\x04\x9f\x43\x79\x78\x62\x7c\xd1\xf1\x47\x59\xfe\xb7\x2b\xcb\x17\x39\x6d\x2b\x42\xf9\x47\x51\xfe\xa3\x28\xff\xdb\x12\xe5\xd3\xeb\xb0\xa5\x3c\xbf\x51\x26\xdf\x28\x7a\xdf\x4c\x3e\xfe\x18\xca\xeb\x51\xfe\xfc\x60\xe4\xcf\x73\x9e\x81\x58\x7f\x47\xa9\xd1\x28\x45\x23\x53\x11\x7f\x19\x49\x24\xa3\x4a\x2d\x19\x64\xbe\xb6\x0c\x32\xba\x83\xd8\x64\xbc\xaf\x76\x88\x31\x3e\x3e\xd6\xd1\x85\x34\x33\x5e\x29\x8c\x2a\x69\x34\x88\xc8\xe9\x7f\xb5\x7d\xb2\x5c\x0b\xb2\xd1\xc9\xed\x73\x0a\x47\x6d\x3c\xc8\xb5\x1b\x7b\x3e\x4f\x50\x83\x21\x66\x45\xaf\xea\x22\x5f\x6d\x17\x23\xa7\xb2\xd5\xd6\xcb\xd2\x9f\x0e\x63\xce\x2c\x86\x45\x77\x9c\x89\x4b\xbb\x52\x21\xcd\xba\x09\x8c\x62\x58\x5b\x21\xc3\xb8\x0b\xaf\x47\xd3\x28\x9d\xc0\x76\x9a\xd1\xc6\x94\x9e\xea\x45\x38\x7f\x48\x2f\xc2\xf5\x9f\xa4\x09\x7d\x4c\x24\xfa\x4d\xbc\x44\x22\x91\xa8\xae\xcf\xe4\x97\x24\x77\x13\x72\x96\xcc\xdd\x25\x47\x34\x90\xec\xe0\x4c\x68\x50\x1b\x6b\x54\xf4\xa8\x95\x1a\xe3\x5a\xfc\xd3\xda\x92\x49\x45\xb1\x29\x4a\x96\xd6\x03\x85\xd6\x78\xa0\xce\x75\xc7\x9e\x89\xca\x22\x7a\x6e\x25\x4a\xbd\xb2\xbe\x73\xd1\xbf\x9d\x31\xd4\xe2\x73\x73\x38\x21\xcf\xae\xc7\xfe\x25\x3c\x6e\x96\xc2\x53\x34\x83\xa7\xa4\x79\xdf\xcb\x30\xa6\x0c\xee\xb5\x7c\x0f\x27\x9a\x69\x99\xf8\xaa\xb7\x61\xde\x46\xd7\xe6\xb3\xaa\x98\x4e\xfa\xe1\x04\xdb\x1e\xde\xf4\x73\x0f\x67\x27\x34\xad\xa4\xaf\xd5\xa5\x8b\xa2\x34\x48\x2c\x75\x28\xa7\x0f\x74\x4f\x7e\xe6\x82\xfe\xd7\x83\xbf\xb8\x20\xb3\x95\x45\xe9\x28\x59\x10\x68\xde\x5f\x0f\xfe\xe2\xa9\x26\x7f\x6d\xd7\xe4\xaf\xb2\xc9\x8f\x07\x07\x6d\x9a\xfc\x78\x70\x20\x9b\xbc\xcb\x7e\xa5\x4f\x8e\xab\x5d\x07\xa5\x05\x8e\xd2\x11\xcc\xc6\x1d\xa9\x2e\xe5\xed\xde\x9f\x9e\xbe\xe4\x2f\xd1\xaa\xa6\x32\x23\x6f\x89\xa7\x79\x76\x25\x1c\xe9\x95\xce\x8d\x6d\x21\x1a\xc3\xef\xd2\x0b\x9e\x39\xdc\x92\xf2\xec\x4a\x03\x5e\x06\x41\x5f\x79\x1e\x61\x58\x60\x94\x4e\x6e\x6f\x2b\xed\xc8\x26\xce\x12\xd8\xbb\x8a\xf2\xd4\xf7\x7e\x7b\xf7\xe1\xe5\xd1\xfb\xdf\x5f\x7e\x78\xfe\xf3\xaf\x2f\x3b\x2f\x3f\x7c\x78\xff\xa1\xef\x01\x7d\xa9\xa8\x1f\xd2\x65\xf8\xde\x5f\x56\x9c\x45\x26\x1e\x18\xe0\x3b\xd2\x25\x5d\xd9\x18\x64\xda\x9d\xbb\xc2\xf0\xd9\xc6\x20\xf4\x6d\x77\x85\xc0\x02\x2f\x0e\x0f\x73\xd6\x5a\x25\x42\x71\x37\x0d\xc0\xd2\x0c\xe0\x5f\xad\x76\xc4\xb2\x43\x0e\xe2\x4d\x70\xb0\xc6\xcd\x58\xe8\x39\x65\xfa\xbc\xb5\x10\xb0\x76\xab\x61\xff\x95\xa9\xf2\xd6\x86\xfd\xd7\x95\xb0\xc9\x91\xa6\xca\xbc\x35\x61\xd3\xab\x60\x05\x6c\x71\x45\xb4\xd3\xea\xd5\x35\x5e\x85\x45\xbb\x50\xda\xe9\xf7\x1a\xda\x37\xe3\x52\xb7\x10\xd3\xf1\xad\x85\x48\x6b\x6c\x61\x59\xea\xec\xc9\x71\x19\x04\x3b\x8d\xec\x09\x33\xf9\x59\x29\x48\xff\xa2\x0a\x82\x1a\xcf\x2e\xa7\x5f\x17\x0a\x77\x0f\x81\x8f\x43\x0f\x15\xaf\xb2\x7c\x88\xe2\x18\xa6\x5e\x80\x52\x1e\xae\x25\xb8\x1f\x7a\x7c\x3d\x15\x0e\x9f\x63\xfe\xef\x57\x35\xd5\x34\x7a\x34\xed\xd6\x26\x6a\xb3\x23\x3e\x20\x4d\x71\xc6\x80\xb1\x07\x95\xfb\x34\x29\xed\x19\x9f\x88\x9e\x98\x88\x4a\x0b\x14\x7b\xc1\xba\x0a\x32\x73\x76\x1b\xa4\xa0\x55\x43\xe3\xd5\x0a\xa3\x36\x0c\xb7\x62\xce\x5d\xd2\xd3\x24\x8b\xa3\x62\xda\xa3\xf9\x0e\x0a\x38\x62\x72\x80\x56\xe6\xcc\xa2\x08\x46\xf9\x68\x6a\x17\xae\x94\xc5\x56\xea\xfe\x31\xef\x16\x30\x67\x2f\xe8\x9d\x5a\x32\x83\x53\x70\x04\x5e\x80\xe7\xe0\x1d\x78\x09\x3e\x80\x57\xe0\x0d\xf8\x15\xfc\xac\xb8\xfa\xd7\x0f\x89\xab\xff\xe3\x4f\xe2\xea\x7f\x7f\xe4\xea\xbf\x05\xae\xfe\x1f\xdc\xbe\x59\x37\x1d\xe6\x2c\x79\xbd\x31\x32\xb5\x36\x18\x9c\x79\xd2\x1e\x52\x7d\xc8\xd2\x64\x79\xac\x3e\x0a\xe6\xdd\x80\x75\x89\x0a\x34\x4c\xf4\xf4\x5c\xac\x2d\x0b\x95\x89\xb2\x54\xfa\xac\xea\x1f\x7f\xc9\x86\xfa\x4f\x69\x69\x4c\x59\x7f\x2c\x0d\xb0\x45\xce\x74\x33\xf9\xd7\xd4\xac\x64\x58\x69\x4f\x1c\x65\xf4\x8a\xa3\xa5\xd4\xfc\x39\xee\xc5\x50\xde\x55\xf1\xff\x94\x3c\x79\xe0\x7b\x7f\xcc\x55\x6f\xb9\xd9\x73\x63\x6d\x32\x0c\x6e\x40\xdc\x58\x4f\x8e\xef\x73\x8b\xb5\x60\x26\xdd\x57\x51\xc1\xa7\x9e\xf6\xfc\xbc\xa6\x21\xbc\xa4\x6f\x1e\x6b\x83\x11\x55\x79\x5f\xd7\xd4\x8d\x73\x44\x8e\x90\x69\x33\xfe\xbe\xa6\xf2\x34\x2b\xf0\xef\x59\xb2\x98\xd9\x46\xe6\xc7\x35\x51\x05\xa1\xae\xa5\xe0\xb9\x3d\xa4\xf5\xf7\xcb\x04\x4d\xc8\x36\x11\x29\x9f\x65\xc1\x9b\x14\xca\x22\xae\xc6\xc0\x81\x9e\x92\x78\xa4\x49\x1c\x82\xdb\x5b\xae\xc8\x48\x33\xdc\x29\x20\xee\xb0\xc6\x28\x41\x78\xe9\xed\x68\xea\x00\xf5\x99\xd3\xc0\x90\x6a\x2b\x7a\x71\x4e\x4d\xd3\x2f\xea\x23\x23\x8a\x58\x88\x14\xce\x38\x89\x26\xcf\x8b\x17\x79\x84\x52\x69\x34\x50\x51\xc3\x30\x83\x54\x5a\x49\x58\xbd\x17\x9c\x40\xb9\xa2\x5f\x4f\x70\x36\x9f\xc3\xf8\x5d\x86\xd1\x58\x0a\xeb\x77\x0f\x9c\x6a\x9b\x0a\xc6\x83\x40\x26\x22\x37\x67\x03\x5a\xb3\x81\xb3\x79\x27\x26\xed\xf4\x89\x20\x5f\x29\x30\x3e\x0d\xd8\x98\x86\xb7\x8d\xd3\x50\x19\xe8\x38\xcb\x47\x90\x8d\xf3\xe6\xcd\x24\xcd\x72\x78\x42\x99\xfa\x5f\xb2\x61\xa1\x2f\x6b\xcc\x06\x9d\x47\x18\x4e\x96\x3d\x64\xd5\x2c\xb5\x71\xb7\x1a\x19\x45\x5b\x1d\x5a\x5c\x3b\xac\x93\x1a\x27\x07\xa4\xe6\x35\x00\x1f\xdb\xde\x8a\x75\x77\x96\x7e\x53\x9c\xae\x0d\x4c\x6f\xfd\xbb\xef\x1f\x59\x96\xfc\xa8\xd6\x92\x1f\x2c\xd6\xb2\xe9\xff\xc3\x2d\x7a\x64\x24\x24\x3e\x8e\x26\xb0\xef\xcd\xa3\x09\xa4\x16\x36\xf4\xa2\x3c\x85\xf9\xac\xef\xb1\xbf\x85\xdd\x4d\x5b\x6b\x1c\x70\x63\x3d\x19\x7d\xfd\x51\x21\xe5\xda\x0d\xdb\xd7\xe2\x3a\xd0\x92\x5f\xb2\x21\x0b\x9e\x40\x7f\xb1\x3b\xb3\x4f\x2d\x67\x16\x05\x15\x84\x8a\xc1\xb8\x8e\xa5\x1c\xe8\x5c\x7f\x70\x3c\xbd\x80\x2d\xa0\xf1\x49\x7a\xa3\x68\x5f\xb5\xb9\xf1\x80\x06\x99\x4c\xd3\x09\x21\x6f\xc1\xdf\xd4\x47\xcb\xe8\x68\x96\xc5\x68\xbc\xa4\x49\xf7\x3d\xb3\x92\x61\x7b\x74\xa0\xca\xec\x37\x96\x0e\xe6\xb5\xc3\xb7\xe1\x05\x17\x26\x5b\x65\x6c\x9d\xc0\x73\xab\x94\xd9\x56\x1b\x29\x38\xdf\xd9\x55\x1c\x2f\xf4\xcb\xba\x3a\x74\xee\x3e\xd4\x95\x8a\x69\x7c\xc5\x2b\x88\xc1\x55\xef\x61\x46\xf0\xfc\xa1\xb9\x4d\xe8\xd7\x93\x59\x1a\xd7\x96\xc8\xab\xd5\xba\x53\x0f\x1d\x55\x7e\xa3\xe1\xdf\x5b\x54\x74\x5f\xd3\x87\xfa\x70\xf9\x3b\xc6\xde\x1b\xf0\xc6\x9e\x0e\x31\x1a\x0f\xfc\x6a\x15\xa9\xab\xd3\x03\x3f\x6b\x8e\x1f\xec\x98\xd1\x04\xc2\x2a\xd3\xb3\x64\x6d\xb9\x1f\xcc\x19\xad\x5a\x25\xb4\x2c\xa6\xda\xda\x49\xec\x05\xd6\x8e\x9f\x7e\x45\x6b\x17\x13\x0b\x0f\x5b\x25\xb4\x64\x24\x95\xea\x3e\xe9\x43\xa0\x6f\x8c\x3e\x06\xd6\x4e\xb0\xa2\xab\xb0\xfe\x39\x28\x45\x86\xd6\xf7\xd3\xf0\xe9\xae\x0f\x79\x26\xa9\xbd\xbd\x5d\xa8\x04\xf9\xa9\x32\x94\xe5\xf7\x65\x40\x18\x85\x5d\x1f\xab\xea\xb8\x52\x7d\x9e\x44\x28\xa5\xa9\x5d\x58\xfd\x5d\x1f\xa9\xea\x48\xaf\xae\x7b\xa5\xd1\x1c\xfa\xcc\x3c\x4f\x4d\x9b\x4b\x74\x51\x93\xc4\xca\xa4\xd9\xd8\x02\xd3\x73\x48\xe3\xe3\xd9\x90\x34\x57\x1c\x46\xc5\x79\xca\xf3\x86\x51\x72\x8a\xe7\xd1\x60\xbd\x60\x54\x5c\x3d\x30\x4e\xe6\x79\x15\x3f\x1e\x05\xe3\xb5\x22\xee\x9c\xc3\xd3\x89\x3f\x0b\x08\x0f\xef\x5a\x39\x7d\x7e\x70\xb3\xab\x41\x50\x6f\x2d\x4f\x0f\x64\xde\xd9\xfc\xa3\x49\x27\x55\x08\x24\x50\x4f\x17\x39\x51\x31\x87\x20\x47\xe6\xa2\xd6\x4e\x41\x94\x50\x2c\x20\x56\xe7\xe8\x15\xdb\xa2\x06\x91\x56\xb9\xb3\x61\x50\xc6\x72\x04\x4b\xb3\x72\xe3\x45\xc4\xb0\xa9\x2b\xb0\x35\x51\x94\x2f\xd2\x95\x24\x11\x8d\xd4\xcc\xba\xa8\x65\x65\xa2\x3b\x5d\x5d\x36\x37\x17\x70\xd9\xf7\xe6\xe2\x69\xe2\x61\x90\x78\xe8\x38\xf2\x12\xd3\xf2\x9c\xc5\xbd\x96\xe5\x3c\x0e\xb6\x2c\x97\xce\x9c\xa2\xc2\x91\xf8\x20\x6a\x8c\x23\x44\xc3\x1a\xf2\xf2\x57\xec\xa7\x28\x4d\xb2\x42\x4a\xfa\xbc\x5f\xc9\x0f\x51\xb2\x48\x2f\xd2\xec\x4a\xc6\x32\xf2\x7e\xe3\xbf\xcb\x33\x7d\x7c\xbf\x54\x83\x54\x55\xaf\x2d\x80\x43\x9a\x53\xb7\x37\xce\xb3\x99\x9f\xc2\xab\xce\x09\xe4\xd9\xb1\xea\x4e\xb5\xef\xe3\xf0\x29\x0d\xbe\xcd\xaf\x8f\xdb\x5b\xed\x6e\xc2\x3d\x79\x2d\x05\x41\xd0\x9b\x45\x73\x72\x50\xcc\xbb\x87\x12\x85\xd1\x08\xcb\xd0\x58\x54\x83\x2d\x42\x4b\xbf\x4f\x47\x75\xe1\xa5\xe9\x8a\x72\xa2\x85\xf2\x97\x92\xbb\x0c\x7c\x4b\x13\x0b\xcc\x01\xff\x92\x0d\xc9\x3d\x16\x04\x00\xb3\xf4\x79\x81\xcc\x0d\xec\xd3\x49\x85\x22\x30\x54\x29\xee\x3b\x3e\x8d\x7a\x3c\x2e\x31\x99\xed\xa7\x8c\x8f\xdf\xb8\xaa\xb7\x1d\xbe\x46\x9b\x34\x4f\x02\x04\x35\xab\xce\xa7\x02\xb6\x99\x8a\x02\xe2\x57\xd1\x08\x62\xc5\xbe\x6b\x9e\x85\xa4\x47\xb0\xd2\x0b\x1c\x10\xde\xc3\x74\xc3\x92\x6f\x7a\x3b\x35\xdb\x51\x5d\xeb\x00\x1c\xe9\xca\x97\xdf\xcd\x9a\xd5\xf7\xb4\x9d\xe6\x6d\x15\x90\x66\xac\x2e\x91\x4c\x2b\xa5\xdc\x4a\x28\x16\xde\x17\xa1\x85\xd9\xf0\x46\x1c\x6f\xab\xdd\x7d\x5e\x03\x9e\xd3\xd3\x83\xe9\xb6\x08\xde\xd9\x08\x1c\x24\xf9\xf6\xde\x77\x2f\x2b\x58\x1c\x54\xfd\x60\xb9\x2d\x9a\x0f\xb5\x68\xe8\xfd\xb4\xbd\xc3\xdd\xab\x5a\x04\x82\xb7\xd8\xde\xdd\xce\xc2\xa0\x73\xa6\x60\xf0\x79\xcd\x1d\x3c\x37\xe4\xa2\x4d\x27\x46\x27\x01\x3d\x30\x38\x5f\xf7\x42\xd0\x9b\xb7\xc1\xc4\x09\x44\x0f\x0c\xae\x37\x42\x25\xda\xb7\xc1\xa5\x11\x92\x1e\x18\xbc\xdf\x08\x9f\x0e\xc3\xc2\xf9\xa6\xba\x2b\x4c\x16\x6c\x70\xbc\xed\xa6\xf8\xb5\x82\x42\x71\x71\x83\x8b\x6d\xa1\xff\x6c\x43\xd7\x19\xc1\xc1\xdb\x3b\xde\xd1\x75\xb4\xb9\x07\x06\x27\x6b\x2e\x4d\x2d\xa8\xe6\x5d\x61\xd2\xdf\x6b\xb9\x97\x36\xc1\x59\xb1\x15\xab\xf4\xfa\xe6\x98\x5d\xc0\x9a\xd1\x6b\x94\xff\xe6\x68\x75\x20\x2b\x47\xab\x8b\x4c\xb6\x18\xa7\x06\xa6\x19\xa5\x22\xb2\x3d\x30\xf8\xb8\x26\x22\xad\x71\x2b\x2c\xfa\xbb\x75\xba\x19\x2e\x5d\xb8\x6a\x60\x3c\xd2\xcd\x57\xfe\xb1\xae\xf2\x7f\x96\xa5\x08\x67\x75\xf9\xda\xea\x4d\x2c\xa4\x1a\x16\x3d\x34\xe7\x4f\x26\x94\x4e\x37\x72\xee\x40\x4e\xc9\xb3\x97\xc0\x4b\x98\x78\x67\xaa\x9c\x7d\x00\x1e\x4a\xc7\x99\x17\xe8\xd6\x19\x69\xeb\x05\xda\xc0\x2c\xa3\x95\x67\x44\xbd\x31\xc6\x7a\x86\x17\x5a\xca\xbe\x75\x0c\x30\xd6\x31\xaa\x68\x74\x82\x68\x67\x54\x01\x5e\x83\x3f\x76\xaa\x36\x03\x0f\xc1\xb0\xe2\x1f\x7f\x92\x61\xc5\x2f\x8f\x86\x15\xdf\x82\x61\xc5\x6f\xdc\x5d\x22\xe5\xa6\xc5\x81\x88\x66\x56\x08\x77\x09\x6c\x85\x94\x4b\xb9\x25\xee\xdc\x55\x18\x4d\x78\xd3\x19\x2b\xcd\x61\x14\xbf\x4f\x93\x65\xe0\x7b\x8b\x02\xe6\x27\x10\x63\x94\x4e\x8a\x9e\xd4\x38\x71\xc3\x8b\x45\x93\x8d\xc1\x11\xb9\xab\x85\x09\x45\x63\x4d\xe6\xd6\xce\xed\x28\x1a\x6b\xbe\x88\x70\x34\x82\x29\xa3\x81\x26\x2b\xab\xff\x0e\xf3\x42\x8b\x33\xd7\x5c\x97\x52\xfc\xc2\xca\x22\xd7\x75\xa7\xa9\x70\x05\xd1\xb8\x40\x31\xba\xab\x56\xb5\x8d\x7e\x7f\x6e\xd5\x44\xf5\xfd\xbc\x5d\x7d\xd1\xff\xeb\x35\xfa\x6f\xb1\xb5\xb0\xa6\xcf\x8e\x6e\xb9\x30\xbf\x77\x1b\xcb\xbc\xe3\x5b\xef\xb8\xc1\x4c\xe6\xa2\xd1\x4c\xe6\xad\x59\xca\xb7\xfa\x91\x7c\x20\x7b\x86\x39\x2c\x38\xb1\x94\xd7\xa9\xad\xbc\x36\x25\x75\x03\x0f\x49\xd5\x16\x0b\x03\x98\x15\x08\x43\xa9\x8a\x8d\xf5\x89\xb8\xe4\xe3\x3f\x0b\xc0\x7a\xc1\xec\x7e\xe7\xe4\x85\x7e\xa0\x64\xd0\x35\x59\x5a\x19\x9a\x07\x4e\xad\x2a\xec\x24\x83\x23\xeb\x33\x3f\xc3\x52\x2d\xfb\x8f\x2f\xac\x68\xe7\x07\xbe\xef\xd1\xb9\x57\x2a\x73\xd8\xe7\x39\x70\xe8\x17\xb5\xa9\xfa\x5e\xcc\xdb\xf1\x2d\xd5\x97\x73\xcb\xbe\xd2\x5d\xd5\xf7\x2e\xd9\xee\x2a\xcf\xd4\x90\x6c\x85\xf8\xef\x15\x85\xf8\x73\x6b\x12\x1a\xb5\xe2\xff\x68\xd0\x8a\xcb\x59\x9c\x8b\x03\xe3\xe9\x1f\xc5\xa1\x31\x3e\x1a\x07\xc7\x28\x51\x87\xc7\xfc\xcc\x86\x48\xbf\xfe\x6e\xab\xb2\x39\xde\x77\xd6\x72\xdb\xe7\xf6\x65\x5d\xb9\xde\x9b\x0f\x75\x95\x64\xc7\x5e\xd5\xd6\xe0\x7d\x7c\x63\x55\xd0\x85\xa0\xbf\xba\xcb\xb8\x04\xf3\x67\x1b\x34\x3d\xfb\xec\x72\x00\xaf\xad\x42\xfd\x40\x83\x3f\x56\x2a\xa8\xf5\x03\xac\x1d\x57\x43\x25\x43\x27\xb2\x85\x1e\x81\xdd\x96\x42\x77\x90\xc5\x90\x5f\xf5\xba\xee\xa0\x77\x85\xf0\x34\x5b\x60\xdf\xf3\x36\xd4\x23\xf0\x65\xa5\xaf\x92\xa9\x43\xc8\xea\x75\x08\xb4\xd1\x3a\xfa\x03\x6d\xf8\x74\x9f\xd8\x6a\x36\x49\xc2\xe8\xba\xb4\x37\xfa\x47\xa9\x70\x83\x51\xbc\x54\xea\x36\xfa\x4b\x94\xc5\xba\x3e\xec\x05\x55\x86\x01\x01\x5f\x58\xd3\x69\xd0\xe5\x27\xd9\x5e\x6a\x51\x05\x0c\xf1\x41\xd6\x40\xc5\x28\x4b\x53\x38\xc2\x9a\xca\xee\x85\xfe\xd1\x54\xbf\xa9\x4d\xbf\xee\x82\x6b\xbb\xe7\x0e\xb4\x45\xfa\xe1\x5b\x6f\xa9\x55\xcb\x0d\xd7\x9b\x1f\xe9\x75\xc7\x2f\xee\xe0\x3b\x18\xbc\xbc\x54\xd6\x1b\x39\x6f\xb6\xe9\xb0\xe9\x3d\x65\xeb\x5e\x8d\x21\x4e\x75\xf9\xae\xe4\x31\xa8\x68\x24\x7c\x4a\x03\x80\x8e\x22\xec\xe3\x1e\xce\xe8\x8c\xf9\x41\x10\x80\xc1\x59\xe0\xd6\xd6\x42\x5d\xcb\x48\x66\x6d\xc3\xb9\xe2\xd7\x6b\xf3\x54\xd9\x8a\x55\xd6\x6a\x5d\xdd\xaa\x41\x97\x55\xad\x6a\xd8\x33\x0e\x4d\x13\x1a\xa8\xdb\xd4\x68\x8f\x38\x02\xf6\xba\xf5\x53\x60\xf5\x4f\xe4\x4c\x06\x49\xa8\x19\xc6\xe8\x77\x43\x00\x32\xa3\x28\x56\x66\x91\x51\x88\xd5\x65\xab\x37\x51\x5f\x55\x6d\xc3\xbc\x87\xad\xb9\xa6\x36\xaf\xb3\xe8\xe1\xde\x38\xc6\x55\x4f\x2d\x7a\x22\x55\x3d\xaa\x54\xe7\x66\x80\xa2\xae\xdb\x9c\x87\xd7\x35\x2f\x15\x5a\x3f\x55\xf5\xd3\x4a\x7d\xed\x10\xd2\xca\xb9\x6e\x5a\xa4\xdb\xc2\x8c\x11\xa1\x66\x61\xf8\x34\x57\x30\x20\x35\x02\x08\x58\x5b\x7f\x37\xb9\xbd\xdd\x15\xfe\x46\xc5\x4b\x39\x7d\xd4\x06\x29\xa3\x00\x79\x99\xb2\x45\x15\xff\x6b\xa9\x7e\x5e\xd8\xea\xe7\x49\x86\x33\xb2\xb9\x9a\xcc\x5d\x6c\xe7\x28\x18\x94\x25\xf8\x18\xfe\xe2\x9f\xe8\xf2\x53\x93\x58\xbe\xb3\xc0\xb2\xa7\x36\x1e\x07\xd9\xbd\x7d\x06\xc4\x23\x1b\x4b\xaa\x5c\x69\xb7\x8c\xd3\x69\x43\x16\xc4\xff\xf6\x41\x71\x9f\xdb\xa0\x15\x51\xbd\x7d\x40\x5c\x0b\xb4\x69\x98\xa0\x58\xd6\xd5\x42\xf6\x5a\x30\x01\x38\xd1\xe5\xeb\xef\xec\xd1\xd8\x64\xf5\xf6\xa1\x78\x5f\xd6\xa2\xe0\x94\xf9\xf6\xa6\x01\x1f\x6a\x51\xe8\xf4\xc5\xf6\x16\x02\xaf\x6a\xf1\xc8\xa7\x7c\x7b\x03\x81\x37\xf5\x48\xf8\x1b\xb8\xbd\x75\x80\x85\x41\x67\x00\x98\x6d\xc0\x5a\xfb\xcb\x68\x6e\x6d\x30\x37\x26\xb1\xf2\x1b\x6f\x69\x03\x4e\x2b\x94\xc6\x4e\xb8\xda\x0c\x9d\x21\xa5\x6a\x81\x53\xed\x8a\x16\xc6\x0a\x4d\x00\xda\x61\x13\xdb\xa3\x85\xc1\x42\x43\xfb\x66\x5c\xa6\xcc\xaa\x95\xc5\x42\x43\x7b\x0b\xd7\xaf\xf6\xd6\x37\x2c\x88\xde\x6f\xaf\xdb\x77\x83\x17\x16\x44\x5b\x9b\x26\xbc\xae\x1c\x5d\x9d\x85\xdf\xde\x38\xe1\x0f\x1b\xbe\x21\x05\xd8\xde\x3a\xc1\x82\x2e\xc8\x14\x7a\x50\xdb\xea\xac\xdd\x10\xac\x85\x3e\xd1\xd5\xba\xbf\xad\xd6\x1a\x16\x68\x7f\x9e\x2c\x26\x28\x7d\x8c\x4c\x70\xaf\x91\x09\xd4\x3c\x37\x68\x68\x57\xa5\xfe\x6a\xe9\x59\x7f\x67\xaa\x57\x47\x9e\xaf\x06\xd5\x2b\x5b\x27\x19\x6e\xf5\x31\xfe\xdc\x63\xfc\xb9\x47\x85\x6a\xab\xf8\x73\x05\xd3\x9b\x29\x85\xaa\x76\x2b\x07\x60\xc1\xd4\xad\x42\x05\xc5\x0b\x6a\x55\x50\x5c\x3b\xdb\x42\x91\x1a\x9b\x80\xa9\x42\x56\xe8\x69\x53\xb7\xb2\x6c\xe6\x28\x53\xca\xb2\xa1\xa5\xfd\xca\x1d\xda\xaf\x44\xd7\x7e\x51\xff\x00\xea\xdd\xa5\x5d\x96\xaf\x61\x94\xe0\xe9\x92\x4c\x68\x96\x4b\x6b\x92\x18\x3a\x0b\xe6\x79\x76\x89\x62\xf2\x3c\x05\x9a\xb8\xaa\x8d\x56\xec\xdc\xa9\x15\x1b\x5b\xe1\xeb\x2a\xb3\xed\x81\xa9\x55\xc5\x20\x15\x26\xcd\x71\xee\xee\x49\x07\xa6\x45\xc6\xb3\x35\x54\xe7\x15\x0d\xd5\xd2\xea\xa2\xa5\xa1\x42\xb1\x67\x96\xd9\xa1\xe2\xcf\x1d\xfa\x17\x3b\x1a\xa0\x49\xff\xd9\x31\x01\x19\xf1\x76\x2c\xe8\x8e\xcf\x6d\x94\x2c\x4c\xc8\x3e\x5e\x7c\xfe\xbc\x3c\x69\xa8\x93\xe1\x8c\xc1\x65\x34\x0a\x55\xb7\x3a\xd3\x17\xb9\x04\x43\x05\xea\xf1\xf5\xe6\xff\x7a\x00\xf6\xf8\x1e\x0d\x00\xa6\xb9\x8d\xc6\xe1\x7b\x7f\xd8\x20\x28\xba\xab\x90\x6b\x53\x1b\x8f\x63\x27\x0e\x8a\x6d\xb1\x4c\x6c\x2c\x26\xdd\xbb\xd8\x16\xfe\xb2\x32\x0a\x25\xd3\xd9\x5a\xca\x65\x81\x36\x65\x3a\x68\x0d\x06\xb8\x16\x4c\x00\x86\x66\x60\x31\xa3\xa6\xbd\x19\xb7\xc1\x5a\x81\x65\xa1\xbe\xb4\x27\xd2\x60\xe0\xb6\x16\xeb\x5d\xd5\x80\x17\x0c\xdc\xd6\xc2\xbd\xcf\x36\x02\xeb\x0e\xd8\x5e\xc2\x67\xc1\x57\x37\x01\x5d\x96\xb6\x4c\x56\x1d\x0c\x6b\x39\x86\x76\xf0\xb7\xf6\xe4\xbf\xb8\x59\xbe\x22\x6e\x8b\xba\xf9\xb2\x5b\x73\x75\x70\x32\xa5\xb7\xe1\x37\x63\x1f\x96\x3c\x49\x07\x05\xb1\x23\xd4\xbc\xc2\x7f\x52\x2c\xb1\x88\x4d\xa6\x6e\x59\xef\xac\x04\xbc\x1a\x74\x14\xab\x4b\xf8\xac\x3c\xdb\x9c\xdf\x62\xff\xea\x19\x1d\xee\x2c\x17\xb3\x83\x21\x5b\x87\xf9\x6a\x93\x47\xb9\xad\xe1\xeb\x23\xf7\xf5\xc8\x7d\x3d\x72\x5f\x5b\x70\x5f\x2d\x18\xa6\x45\xc8\xcd\xf7\x6a\x4d\x39\x4f\x97\x73\x28\x78\xb0\xc6\x8a\x8c\x97\x51\x4c\x58\x25\x5e\xce\x8d\x76\x9d\xf5\x06\x67\x40\x58\x52\x96\x8a\x43\xd3\xda\x8c\xb2\xd9\x10\xa5\x86\x4b\x25\xb3\xba\x5c\x05\x4c\x53\x82\xd0\xbe\x6b\xbf\x65\x17\x67\x6c\x82\x9a\x23\x91\x0d\xcd\x4a\x06\xd7\x38\x5e\x95\x9c\xd7\xe6\x0b\x17\x34\x3e\xc0\x29\xa2\x56\x55\x53\xc6\xf6\x79\x67\xc1\x16\x7c\xdd\x74\x13\xbe\x6c\x4d\x2b\x44\x36\x61\x7d\xd9\x61\xfa\x91\xcc\x6a\xdf\x23\x54\xc3\x9a\x6c\x9a\xcd\x49\x5a\x6c\x9a\x36\x45\xcd\xec\x9a\x1c\xf1\x9c\x2f\xb0\xa7\x7f\xe3\x8b\x4c\xbf\x9e\xdb\x96\x77\xac\xc1\xd2\xe6\xde\xac\x0d\x52\xc7\xfc\x51\xd2\xd4\xcd\xfa\x19\x9e\xbf\x3a\xfb\xc7\x15\x26\x04\xb1\x6d\x30\xa6\xbf\xcf\x32\xb2\x82\xfc\x24\xcc\xb5\x52\x2a\x55\xe7\xe5\x54\x40\x6e\x9a\x67\xb1\x3e\xdb\xb0\x71\xbe\x50\xad\x5e\xab\xe5\xe3\xe1\x1a\x92\x02\x6a\x41\x17\xe4\xf2\x32\xc0\x8e\xa3\xe7\x0c\x24\xa2\x1f\x41\x69\xdf\x23\x4d\x7e\xb4\xcc\xc0\xf4\x6c\x2a\x0b\xa0\xf6\x41\x69\xe8\x56\xd3\xac\x67\xf8\x7e\xc4\x3c\x00\x0d\xb9\xee\x10\xa3\xd4\x1c\x7d\x16\x4f\xdb\xa1\x16\xe1\x61\x6f\x4f\x9f\x75\x52\x30\x38\x38\x7b\x86\x42\xf7\xa8\xfa\x56\x53\xba\x14\xbc\xd1\xde\x9e\x6f\x34\xa3\x83\x0c\x00\x69\xa1\x82\xd7\xb0\x65\x20\x9f\x28\x1a\x2d\x9a\x8c\x98\xf2\xa0\x6f\xb5\x60\x6b\xd3\xd4\x84\x9c\x81\x3e\x2a\x73\x58\x40\x72\xda\x50\x2a\x42\xb4\x90\x77\x64\x97\x4f\x87\x3a\x8c\x7a\x34\x16\xeb\x8c\xb6\xb4\x49\x89\x5c\x36\x29\x7a\x20\x16\x2e\x97\xc8\x5a\xcb\x25\xea\xe3\xb3\x70\x99\xc4\x34\x7c\xef\x8f\xbf\x80\xf1\xca\xc4\xc6\xa3\x71\xf3\x5b\x8b\x22\x96\x36\x70\xeb\x1a\xda\x5e\x18\x71\x59\x8b\x41\xdc\x64\x77\x21\x93\x18\x3b\x14\xc0\x7c\x04\xe9\x1a\xd2\x81\x5a\x30\x01\x18\x9b\x32\x09\x57\x4d\x39\xa0\x6d\x51\x4a\x22\xa0\x09\xa9\xe3\x3a\x69\x17\xb6\x7f\x25\x94\x66\xbc\xee\x00\x1c\x2d\xc2\x8c\xac\x84\x62\xe1\xbd\xb2\x77\x8e\x21\x7d\xd9\x5a\x74\xf1\xb9\xb2\x31\x1d\xf1\x31\xb6\x36\x17\xb2\x70\x6c\xe1\x9f\xde\x04\xc7\x9a\xb9\xf1\xb6\x82\x92\xb6\xd9\x16\xdb\xe6\x9f\x05\x89\x62\x84\xb3\x47\x1e\xef\x5b\xe0\xf1\x22\x57\xce\xde\x2a\x51\xc6\x42\xfb\x1a\x74\x75\x5e\xd3\x8c\xd1\x68\x8e\x06\x99\xef\x27\xb5\x59\x00\x55\xd0\x39\x45\xb8\xae\xa6\x15\x45\xd0\x39\x1d\x8f\x33\x1a\xde\x3b\x23\x43\x51\xa7\x42\x52\xae\x02\x74\x17\xf1\xe2\xac\xf0\x4f\xf6\x60\xc9\x2d\xb3\xfa\x7a\x49\x9a\x61\x90\x93\xa6\xdd\x30\x99\xab\xbe\x30\x0c\xca\x37\xc2\x26\x4c\xa8\x9a\xf0\x54\xae\xcf\xf6\x32\xe6\x26\x38\x16\xd2\x44\xbf\x3e\xa3\x56\xd7\xe7\xa5\x8c\x41\xf3\xf5\x08\x98\xff\x1d\xcd\x79\xf8\x3c\xdf\x8b\x39\x8f\x9d\x86\xf2\xcb\xd9\xf7\x7c\x89\xc0\x0b\xea\x01\x7e\xfb\x90\x24\xd1\x27\x7f\x92\x24\xfa\xe3\x23\x95\xf2\x2d\x50\x29\xa7\x32\x0f\xa5\x61\x07\x74\x29\xc3\x81\x59\xe6\x3a\xbc\xa0\xd6\x0e\x68\xde\xda\x0e\x68\x56\xa1\x72\xcc\xc8\xe1\x9c\x88\x10\x5f\xf4\xe4\x95\x0e\xda\xe8\xd2\xc8\x94\x30\x8f\x72\xea\x64\xc3\x93\xde\xf5\x6e\x34\x30\x4c\x8a\x53\x8a\x40\x0d\xda\xd0\x58\x24\x46\x15\x09\x6d\xda\x60\x92\x34\x69\x34\x49\xb2\x52\x5e\xfa\x89\x43\xf4\x9c\x55\x1c\xf2\xb9\xf7\x1c\xbf\x2f\xef\xc2\x36\x29\x5a\xcb\x36\xe9\xad\x95\x54\x53\x48\x58\xdf\x3a\x65\xdb\x57\x56\x69\x65\x67\xa8\xf4\x9b\x6f\x5d\x36\x4b\xe7\xbc\xf0\xe4\x8b\xfb\xed\xbb\x03\xe0\x9f\xa9\xae\xd8\x62\xf2\xb7\x15\x31\xf9\xb5\xd5\x79\x97\x35\xd3\x49\x83\x78\x5c\x94\x69\x06\x18\x2f\x53\xb2\xf0\x31\x73\xc3\x7f\xeb\x10\x6a\xbf\xb7\x66\xd3\x34\x96\x38\xb6\x4a\x19\x4d\x29\x43\x03\x5e\xac\xb4\x76\xd2\x22\x9d\x37\xd8\x3b\x69\xb5\xec\x58\x5f\x85\xed\x84\x5a\x39\xc1\x96\xa3\x26\x2d\x12\xde\x9a\xf4\x47\xa9\xfc\x49\x3b\xb0\xb7\x48\x8b\x29\x1a\x63\x56\xdb\xfb\x5e\x0a\xc3\x9f\x27\x49\xc7\xff\x3e\xf0\xe8\x9d\xc6\xbd\x51\x2f\xe0\xd2\x0b\x34\xbf\x42\x82\x5f\x5b\xe9\x80\x26\xee\xcc\x37\x8b\x7b\xeb\x7d\xef\x31\xd7\x5c\x3d\x0c\x7c\x53\xf4\x6e\x7e\x14\x9e\x55\x3f\x29\x17\xe3\xfe\xe0\x6c\x1b\x77\x43\xee\xf6\x2b\xc4\xba\xc5\x5a\xe6\x66\xa2\x33\x3c\xd4\x04\x80\x22\x3d\xdb\x3f\x11\x9e\x6a\xb1\xdb\x84\xa4\xf7\x32\xfc\x78\xcf\xb9\x44\xaf\x6c\x0c\xf7\x64\xdf\xf6\xd9\xc6\xe3\xb8\xb5\xb6\x17\xc7\x9e\xdb\x58\x4c\xfb\xb6\xad\xed\xa6\xae\x6d\xf8\x9a\x44\x7c\x6b\x9b\x29\x7b\xa9\x37\xb6\x34\xab\x05\x63\xa5\xb4\xb4\x10\x6e\x69\xdf\xd6\x0c\xab\x19\x75\xe5\x46\xdb\x20\x93\x6a\x15\x46\x33\x4e\x8b\xea\x58\x3f\xbd\x6a\x85\x6c\x31\xb3\x92\xda\x5b\xe5\x6e\x83\x38\x1f\xd7\x80\xbf\xb3\x20\xce\x17\x95\xab\xc7\x7c\xd7\xb6\xf7\xcf\xb4\xe0\xab\xcb\x75\x2d\xe9\x4a\x1d\x8c\xa6\xf4\xad\xa7\x6b\x71\xfc\xe2\xb2\xde\xda\x88\xcc\x62\xb5\x29\xa5\x0a\x8b\x7d\x4a\x7f\x75\xe7\x8c\x00\x73\xb2\xdc\x9c\x0f\x64\x7c\xb7\x62\xa7\x17\x7f\x12\x87\x3a\x7a\xe4\x50\xbf\x05\x0e\x35\x0e\xfd\xa4\xc6\x5a\x89\x70\x99\xcf\x2b\x89\xfb\xcc\x60\x57\x59\x4d\x5b\xb2\x24\x70\x55\xe3\xa8\x56\xaa\x5e\x23\x5b\x04\xa9\x53\xba\xc8\x08\x62\x80\x43\x49\x39\xa5\xec\x8b\x8f\xc2\x22\xf8\x4a\x65\x50\x60\xe1\xe6\xcc\xd8\x45\x54\xcb\x44\x2d\x0c\x7e\x50\x27\xa3\xf9\xdc\xf1\x44\x38\x97\x22\x70\x4d\x6b\xd3\x5f\xc1\x57\xb0\x96\xb6\xc5\xaf\x7c\x12\x34\x93\x5e\x29\x95\xa6\xc4\xff\x1f\xf3\x9f\x17\x28\x89\x61\x1e\xf8\x95\x41\x40\x2b\xcb\x11\x4f\xb6\x78\x7b\x2b\x7b\x5d\x06\x9a\xdd\x30\x63\x5d\xaa\x98\x34\x92\x9a\xdb\x29\xdf\x15\xea\x33\x4d\xe7\xf2\xc1\xdc\xf7\x4e\x1e\xc4\x3e\x1b\x42\x0f\x63\x6c\x70\xa7\x46\xe7\x9f\xd6\xc9\x70\x82\xaf\x1c\x9f\x95\xf0\xef\x44\xd1\x03\x8a\x70\xe4\x47\x4e\x56\xe4\xae\xcc\x4d\x6c\xf8\xae\x19\xf7\xc0\x20\x59\x4d\x13\xb4\x80\x13\x80\x48\x27\x0f\x9c\xb8\xed\xf5\xf0\xc0\x20\xdb\x08\x79\x05\x50\x33\xf6\x2d\x54\xf5\x4d\x70\x2c\xa4\x91\x4e\x11\xc5\x2b\x29\x22\x48\xee\x31\xd6\xfd\x06\x1d\x48\x34\x9f\x27\x32\xf4\x7e\xbb\xf8\xd2\x93\x04\xcd\x66\x30\xdf\xc7\x79\x34\xba\xa0\x72\x9a\x5a\xb5\x88\x22\xad\x58\x46\x70\x1a\xee\x71\x34\x8d\x58\x17\xd8\xb7\x45\x61\xab\x3d\x66\xd1\x68\x8a\x52\x68\x0c\x61\x4b\xd5\xc6\x8e\x6d\xaf\xfe\x30\x54\x1a\xef\xff\x24\x82\xf1\xf8\x91\x60\xfc\x16\x08\xc6\x8b\xd0\x1f\x59\x74\x1b\x5a\x23\x6c\xfe\xb5\x4a\x26\x99\x43\x0f\xc4\x96\x41\xb4\x29\x98\x9a\xdb\xe6\xd2\xf2\x2a\xf0\xc0\x8c\x97\xbd\x77\xc7\xe1\x4f\xe1\x35\x3e\xcd\x2e\x20\xb9\xa1\xb8\xc0\xf9\xe5\x65\x94\x78\xba\x34\x47\x04\x5d\x6b\x48\xdb\xca\x8c\xbc\x85\x80\xe5\x14\xe6\x33\xaf\x6a\xf0\xcd\x00\x0f\xad\x0e\x31\x13\x34\xda\x19\x81\xc7\x12\x7c\x72\xd8\x3c\x17\x09\x8c\x7f\x5e\xd6\x62\x52\x9d\x1e\x5b\x73\xa2\x0d\xd4\xb6\x87\x9f\xe7\xf0\x12\x65\x8b\x82\x16\x17\x0e\xeb\x73\xde\x2d\xdb\x79\xd8\xe8\xd0\xa5\x6d\x64\xaf\x0f\xe1\xca\x6e\x49\x47\xf4\xd9\xc6\xa3\x86\x24\xf4\x12\xe5\xc7\x02\xc5\x70\x18\xe5\x6f\x8a\xf7\x73\xa8\x5c\xd4\x76\x77\x75\xe3\x5d\x32\xb1\x65\x54\x2c\xd3\x51\x27\xc9\xa2\xf8\xa5\xbc\xda\x99\x64\x96\x1a\x3f\x83\x1b\x75\xe3\xf7\xd3\x32\xc4\xe2\xca\x41\x21\xb3\x06\x4e\xf7\xf6\xd2\x1e\x8a\x9f\x91\xff\xeb\xdb\xd0\x79\x04\x44\xb2\x19\x69\xf4\xbb\x0f\x70\x94\xe5\xb1\xef\x29\x98\x1e\x40\xe0\x26\x87\x04\x3f\xb9\x05\xa3\x38\x9a\x63\x98\xbf\xe7\x39\x47\x49\x49\x84\x21\x29\x2a\xcb\x80\xf7\x75\x1a\xa5\x71\x02\x55\x6f\xa9\xe0\x98\x0b\x93\xc9\x6d\x5c\xe0\x28\x1d\xc1\x6c\xdc\x79\x9b\x2d\x0a\x48\x53\x1f\xdd\xde\x1a\x05\xff\x09\x97\xc3\x2c\xca\x59\x5a\xa4\xbd\x3d\xdf\x7b\x49\xc3\x28\x51\x3b\xe9\x51\x16\xc3\xdb\x5b\xef\x84\xae\x80\xfc\x12\x04\xc2\xca\x59\x9e\x91\x5e\x01\xd3\xd8\xf7\x7e\x7d\xff\xfc\xc5\xc7\x97\xbf\x3f\xff\xf5\xb7\xe7\xa7\x6f\xde\xbf\xf3\x8c\x09\x83\x65\x50\xa6\x34\x2d\x0b\xe9\xee\xd1\x34\x4a\x27\x34\xce\x5e\x02\x31\xb9\xe0\xe1\xdf\x8d\xc0\x93\xba\x4c\x9f\x31\x58\x9a\x60\xdf\xc6\x7b\xf4\xfa\xf9\xbb\x7f\xbc\xa4\x98\x4d\x9c\xb8\x0c\xca\x20\x28\x99\xc9\x92\x9a\x25\x25\xa6\x87\x34\x23\x25\x5f\x61\xbd\x25\x22\xcb\x6b\x2f\x61\x88\x7a\x28\x2e\x73\x38\xcb\x2e\xe1\x91\xfa\xec\x04\xca\xc9\x62\xbd\x35\xa5\x4b\x29\x79\x3e\xcd\x16\x49\xfc\x02\x51\xd2\xe2\x1d\xbc\xc6\x82\xf3\xe4\x1b\x6a\xd7\x67\xfb\x29\xf4\x0d\x05\xcc\x0c\xe2\x28\xd0\xae\x7f\xb8\xb7\x07\x7b\xf2\x50\x06\x55\xd0\xc7\x39\xbc\x54\xfb\x1d\xf3\x2c\xb6\xda\x41\x15\x3a\x54\x4d\x0b\xa4\x06\x54\x38\x13\x5c\x92\x9e\x69\xfa\x1b\xe9\xe6\x30\x4c\xb2\xd1\x85\x16\xe3\xf6\x67\xfe\x5b\x94\xaf\xca\x8b\xb9\x6d\xde\x4b\x96\x3b\x5e\x2b\x3f\x12\x1f\x4c\x0f\x8e\x53\x75\xe3\xb4\x1c\xd9\x79\x36\xec\xe6\x70\x82\x0a\xac\xf9\x8e\xfc\x92\x0d\x3b\x1f\xc4\x47\xbd\x66\x0c\x9d\x75\x5f\xa8\xcf\x6a\x46\x72\x94\xc5\x68\xd4\x3d\xcf\x86\xda\xb4\xb0\x8f\x9d\x5f\x58\xf6\x6e\xe9\x95\xd2\x65\x39\x4a\x75\xdf\x94\x0e\xcb\x7e\x65\xd4\x62\x5b\xdd\xac\xc6\xd2\xa5\xca\x7a\x94\x15\xeb\x16\x98\x50\xc2\x6a\xb8\x9c\xaa\xef\x9c\x90\xef\xa2\xaa\x38\x8d\x6a\x56\x4f\xe4\x17\x19\x5f\x39\x4b\x12\x94\x4e\x6c\xcc\x1f\xd8\x67\x1b\x79\x0c\xe7\x49\xb6\x24\x2f\x74\xf7\x2a\xc2\xa3\xa9\x36\x4d\x2f\x64\x51\xe7\x9f\xbc\xc8\x5c\xfa\xee\x38\x4b\x92\xec\xaa\xbb\x98\x5b\x9b\xa0\xf3\x8a\x16\x74\x7e\x53\x3d\x9f\x45\xd7\x5d\x15\x7b\xb9\x8b\xd1\x0c\x66\x0b\x95\x18\xf5\x6d\x74\xdd\x51\x51\x98\x3b\xa7\xbc\x58\x6f\x3d\x4f\xa2\xb4\x1b\x61\x0c\x67\x73\xc2\x0e\x68\x0d\x8f\x93\x28\xed\x3c\x17\x25\xe6\xb4\x92\x9e\x2e\x72\xe8\x9a\xd9\x57\xbc\x48\x34\xf8\x63\x01\x17\x30\xee\xd2\x76\x0a\xc1\xff\xa4\x5f\x3b\x3a\x77\x27\x37\x8c\xcc\xa6\xa5\xb6\x8b\xfa\xa4\x6f\xc2\x62\x14\x25\xfa\x61\x23\x3b\xf0\x84\x50\x7e\xf4\xc4\xb5\xd4\xfa\xb2\xa7\x6a\x0e\xe1\xc5\xf3\x24\x31\x92\x91\xde\x87\xfe\x77\x85\xff\x56\xdd\xe1\x14\x51\x58\xc5\xa1\x67\x3f\xd5\x91\xe8\x58\x15\xde\x65\x1d\x51\x87\x4d\xc3\x34\x2a\x58\x6e\xb2\xe2\x39\xe1\x35\x61\x6c\x49\x49\x38\x6d\x65\x47\x5b\xa6\xf4\xc6\x00\x9f\xed\xed\x19\x64\xca\x6e\x18\x92\x47\x94\x91\xfb\x30\x08\xc0\xee\x21\xbb\x97\xf9\x3b\xc0\x51\x69\x53\x3d\x38\xdb\x19\x67\xb9\xcf\x53\x15\x77\xb2\xb1\x81\x56\xd4\x43\xa1\x81\x26\xa4\x68\xbc\xef\xe9\x1f\xac\x23\x3b\xb2\x43\xbb\x88\xbc\x0b\xf3\x45\x31\xf5\x6f\x06\xf8\xac\xcf\x0b\xca\xa0\x14\x0b\x42\x7b\x94\x66\x6f\xc9\x29\x3b\x65\xcf\x0f\x21\x70\x60\xe8\x79\x3b\x22\x67\xf2\x0d\x23\xd9\xfa\x9e\xc8\x26\x61\x10\xae\x1a\x61\x86\xa9\x87\x22\x73\x51\xd1\xc8\xb9\xbe\x27\x6f\xda\x0e\x21\xee\x74\x8b\x0f\xa6\x55\xea\x50\x32\xad\xdc\x41\x63\xa6\xe5\xaf\xac\x44\x40\x26\x86\xb9\x9d\x1d\xfc\x1d\xfd\xa4\xbf\xa7\xbc\x22\x7f\xbf\xfe\x8e\x9e\x3c\x11\x33\x95\x86\x8e\x7a\x03\x74\x06\x06\xf9\x59\x68\xf2\x86\x20\x09\xf1\x20\x3f\x03\x59\x98\x0e\xf2\x33\xd2\x8f\x43\x3e\x9f\x6e\x34\x01\x9b\xbf\x4f\xdf\xdd\x24\x65\xbf\xf3\xdd\x4d\x56\xf6\x3e\x91\x56\xe4\x2d\x46\x7b\x7b\x68\xb7\xa9\x71\xf7\x90\xee\x0b\x19\xa5\xfb\x13\xe8\x28\x38\x9f\x82\x00\x10\x76\x0b\x59\x75\xcc\x1a\xa8\xb1\x77\xdd\xc3\x40\x1e\x38\x17\x8e\xde\x27\x6d\x03\x64\xa9\x22\xc0\x18\x5d\xc0\xa9\xfe\x90\x94\x51\x92\x44\x96\x18\x14\x43\x38\xe8\xf5\x7a\x8e\xef\x8c\xba\x95\xc4\xc8\x99\xf5\x9b\x82\xe5\xe4\x88\x71\xc9\x58\xf4\xc8\x3c\x9b\xfb\xc1\xce\x1a\x78\x1d\x88\x72\x38\xce\x61\x31\xe5\x3e\x7a\x62\xce\x64\x8d\xbd\x3d\xfd\x33\xdb\xe5\xcf\x68\x96\x16\x26\x05\x83\x79\x40\xf7\x63\xd0\x4b\xb2\xec\x62\x31\xf7\xbd\x3c\x5b\x60\xd8\xd7\xa4\x3d\x3d\x24\xa5\xa2\x1c\x55\x9f\x6d\xe1\x8f\xd4\x4f\x90\xf5\xcc\x17\x49\xd7\x29\x06\x4a\xfc\x01\x73\xaa\xe9\x2f\xa7\x55\x1d\x75\x16\x74\x1a\x93\x38\x30\x0c\xe0\x59\x88\x4b\x9c\x4d\x26\x09\xf4\xeb\xab\xf5\x18\x69\xf8\x3e\x4d\x96\x2f\x50\x31\x4f\xa2\x25\xbb\x08\x09\xc1\x57\x84\xbb\x2b\xab\x94\x26\xcc\x1b\x6b\xde\xb5\xf1\x59\x0b\x77\x56\x96\x20\x0e\x8f\xfd\x91\x21\xc8\x64\x4c\xf9\x20\xbb\x23\x61\xef\xdc\x46\x60\xd9\x9d\xdc\x15\x9e\x59\x75\x20\x4a\x50\x30\xa0\xcb\xb9\x31\x0a\x29\x00\x12\x2f\x10\x75\x07\x5d\x14\xf0\x2d\x93\x38\x06\xfe\x42\x9a\x01\xd2\x20\xf2\x47\x14\x8d\x7f\xc3\xe5\x98\x45\xff\xc6\xe4\x5d\x19\x0f\x6a\x7e\x2b\x01\xe7\xab\xfa\x37\xcd\x6c\x11\x6b\xdc\x5c\x07\xb4\xe2\x85\x18\xa4\x56\x55\x4b\x30\x59\x44\x79\x5c\xf4\x6f\x0c\xa6\x9d\x41\x30\x19\x79\xc2\x04\x97\x01\x18\xda\x0b\x62\x48\x4a\x06\x79\x8f\xca\x81\xe1\xe6\xa6\x3a\x95\x55\xe9\xd0\xad\x50\x06\xc0\x42\x6c\x76\x6f\x2d\x31\x7b\x13\x9c\x00\x8c\x74\x31\xbb\x85\xd4\x5c\xdc\xcd\x91\x5a\x70\x9a\x91\x3a\xa5\x0e\x9b\xe3\x76\x83\x6b\xee\x82\x2d\x49\xd8\x1c\x7b\x05\x52\x33\xe2\xe6\x03\xb1\x79\x37\x56\xc0\x6d\xee\x54\xab\xb3\xb5\x79\xdf\xda\x81\xb7\xba\x38\xb6\x0f\xa6\x66\xdb\x76\x1f\xa7\xb2\xfe\x35\x2d\x69\x3c\x3c\x7b\x03\x29\x61\xe6\xbd\x5e\x12\x93\xca\x34\x58\xa2\xd2\xfb\xc0\x4e\xde\xdc\x00\x2c\x5d\x6f\xd5\xe2\x9e\x50\xca\x01\x5f\xda\x58\x0d\x19\xef\xbd\xa2\xbe\xb2\x51\x1b\x12\xe4\xfb\x40\xed\x7d\xef\x95\xd4\x1a\xd5\x1e\x33\xf3\xd8\xbf\xcf\xc1\x9e\x57\x56\x57\x93\x7d\x7f\xc9\x77\x4f\xf0\x12\x9b\xdf\x2f\x12\x42\xf3\x2d\xc7\x18\x93\x6d\xd0\xd0\xf6\xab\x90\x10\x36\x65\x1b\x24\xb4\xfd\xaa\xfb\x9a\xf2\x0d\xdb\xdc\xc8\x0c\x40\x33\x1a\x83\x89\xd8\x1c\x99\x09\xa6\x19\x25\x63\x43\x36\xc7\xc5\xdb\x37\x23\xd1\x39\x91\x2d\xe8\x2c\x1d\x8a\x85\x70\xa4\x1b\x33\x5c\xac\x36\x66\xb8\x86\xa3\x76\x3e\x9c\x6d\x72\x63\x37\x44\x05\x64\x96\x9e\xb0\x18\x45\x73\xd8\xc5\x51\x71\xd1\xe5\xb9\x03\x6b\x6c\x41\x49\xc7\xba\xa3\x6c\x36\x8b\xd2\xb8\x0b\x63\x84\xb3\xbc\x7b\x8d\x61\x3e\xeb\x72\xed\xd2\x8a\xa6\x45\x36\xba\x80\x78\x55\x93\x39\x9b\x69\x04\x8b\xfd\x24\x1b\x45\x49\x97\x70\x77\xd1\x64\x85\xc3\x27\xd3\x79\xd4\x06\x1c\x64\x0e\x9f\x3b\x55\xa5\xff\x43\xb0\x8c\xb8\xf8\x93\x2c\x23\xde\x3e\x5a\x46\xfc\xbb\x5b\x46\x30\xf1\xd9\x49\xe8\xfd\x97\xc1\x5f\xfe\xf6\xf7\x1f\xfe\x7e\xf8\xd7\x1f\xfe\x7e\xf8\xe3\xc1\xdf\x0f\xff\xdb\x5f\x66\x1e\xb5\x9b\xf8\x18\xfa\x34\xd4\xa0\x4a\xf3\xcb\xaf\xad\x97\xd7\x70\x74\xc4\x2e\x03\x0f\x78\xfb\x43\x94\xee\x0f\x23\xf6\x8a\xd4\x18\xd7\x46\x15\xbb\x5a\x26\x4f\xe7\x42\x61\xee\x55\x9a\x33\xe7\xad\xc0\x17\x5a\xbe\xe7\x69\xfc\x61\x91\xa6\xe4\x2f\xdd\xdc\xcd\x23\x37\xd6\x3f\xf2\x6c\x31\x17\x0e\xa6\x79\x6f\x91\xa2\x3f\x5c\x0d\x4f\x45\xd5\x42\x85\x10\x2c\xb2\x9c\x8c\x85\x34\x59\xc0\xe3\x86\x16\x1a\xa6\x93\x2c\xc7\x2c\x21\x9f\x15\x62\xb0\x32\x40\xe5\x48\xaa\x4d\x83\x3e\x01\x37\x83\x33\xc0\x26\x01\x15\xcf\x47\x18\x5d\xc2\xd2\x03\x5a\x8d\x93\x69\x96\x63\x1a\x8e\x9e\x60\x7f\xc7\x2e\x66\xd9\x11\xfe\x5b\x37\x84\xd4\x7e\x30\xa5\xb6\x98\x64\xea\xe6\x0a\x50\xc1\x47\x56\x52\x1f\xd6\xcd\x2d\x61\x8e\xa5\x2b\x21\xb9\xcd\x35\xf3\x8c\x63\xcb\x51\x74\x69\x7d\xc7\x8c\x41\x12\x86\x19\x17\x6e\x03\x18\x6d\x48\x67\xaa\xed\x48\x6c\xb4\x2b\xab\x35\xeb\x05\x93\x91\xec\x1e\xaa\x06\x4d\x5b\x40\x1a\x7a\x88\xca\x2d\xf6\xc0\xb9\x85\xb7\xb2\x25\x80\xf0\x82\xd4\x67\x28\xc7\x30\xd6\xa1\x5c\x5b\x88\x8d\x38\xc0\xef\x35\x67\xcc\xa6\xad\xef\xb4\xbc\xd5\xb7\x96\x48\xf6\x08\xc3\xa7\x52\x53\x4e\xc3\xe1\xe9\xc7\xed\xf6\xd6\xcb\x19\xe8\x6a\x19\xcb\x79\xf8\xdb\x9c\x90\xff\x28\x8d\x12\x65\x97\xcb\x3f\x84\x29\xbc\xea\x40\xff\x66\x9c\xa5\xf8\x55\x34\x43\xc9\xb2\xef\xcd\xb2\x34\xe3\xcc\x11\xf9\xfc\x4f\x88\x26\x53\xdc\xf7\xfe\x7a\x70\xe0\x11\x6e\x0a\xa5\x71\x76\xd5\x23\x74\x80\x80\x1a\x1a\x20\x81\xf1\x8b\x59\x12\xfb\x27\x81\xeb\x73\x92\xfa\xde\x09\x0d\x97\xd6\x89\x3a\x64\x21\x3a\x38\xeb\x14\x38\xca\x71\x67\x99\x2d\xf2\x4e\x01\x8b\x82\x9c\x02\x6e\x52\x4e\x6a\x88\xb4\xbf\x68\xec\x33\xe1\xb4\x36\x5f\x5c\xd3\xb1\x7b\x48\xef\x3b\x28\x35\x8d\xa1\x55\x91\x9f\xc8\x67\x76\x7b\x6a\x80\xf3\xf3\xd2\xf7\x0a\x71\x64\xdd\x0d\x83\xbe\xb3\x25\x5d\x27\x28\x8e\xac\x0a\x1a\x28\xae\x05\xa6\x21\x55\xb9\x55\x2d\x77\x56\x71\x3b\x04\x41\x00\xe0\x33\x0d\x8e\x84\x4c\x9a\x09\x0d\x85\xaa\x2d\xe8\x0c\x42\xb5\x46\xc5\xc5\xb1\xa4\xba\xb8\x19\xcd\x4d\xa5\xff\x7d\x0c\x44\xf3\x3e\x02\xc6\x55\xd4\x4f\xcb\x10\xee\x08\x07\x55\x0d\xd6\xba\x50\xc4\x7a\x8b\x25\xdb\xdb\xf3\xd7\xdb\x17\x5e\x00\xf0\xed\xad\xab\x11\x29\x7d\xbb\x48\x30\x9a\x27\x50\xda\x2c\x15\x42\x47\xca\xf6\x51\x94\xc3\x0e\x3f\x15\xbd\xce\xe9\x14\x76\x54\xf7\x3b\x43\x98\x64\x57\x9d\xab\xa8\xe8\xb0\x50\x7d\x30\xee\x0c\x97\x9d\x3c\x4a\xe3\x6c\xd6\x89\xf3\xe8\xaa\xe7\x35\xf4\xaa\xb6\xe8\x68\x51\xe0\x6c\x86\x3e\x43\xb6\x77\xf9\x45\x07\x3a\x78\x0a\xd3\xce\x14\xe1\xce\xff\xf9\xdf\xff\x2f\xdb\x91\xff\xe7\x7f\xff\x7f\x64\xa3\xe7\x8b\xb4\x11\x93\xf3\x20\x7d\xfa\xae\x43\x1f\x6d\x36\xa0\x0e\x39\x86\x9d\x2e\xea\x74\x71\x87\x12\xfe\x9d\xef\x6e\xcc\xb0\xb7\x28\x28\x3b\xdf\xdd\x98\x6b\xd1\xd3\x1f\x18\xb6\x98\x65\xe7\x93\x1b\x9f\xf7\x5f\x06\x07\xb3\x9a\xbe\x60\x1e\xf5\x93\x8c\x93\xd7\xe0\xbf\x5e\x52\x9e\xe2\x39\xe3\x0c\xb8\x5d\x98\xab\xa8\x17\xc3\x02\xe7\xd9\xd2\x6f\x68\x4e\xaf\x28\x19\x4d\xc1\x77\xdc\x35\xd9\x1c\xa6\xcf\xd3\xf8\x88\x99\x6d\x9c\xd0\x87\xa4\x37\x24\xe7\x86\x5d\xd2\x46\x3f\x83\xd2\x55\x5d\x5d\x8c\x62\x92\x9e\xf9\x58\xba\x8b\x1b\x6f\xd3\x81\x50\x9c\xd1\x68\x9e\xe2\x39\x83\xe2\x2b\xad\x1a\x6a\x7f\x17\x84\xf1\x3c\x15\x60\x39\x3a\x13\x17\x69\x4d\x46\x19\x35\x8d\x92\x41\xe3\x0b\x41\x5e\xe0\x5e\x01\x47\x39\xc4\x01\xbf\x8e\x2a\x5b\xe8\x13\x37\x83\xc1\x59\x87\x0c\xb9\x13\x75\x18\x88\xce\x10\x8e\xa2\x45\x01\x3b\x7c\xc3\x18\xf7\x49\xd9\x41\x45\x27\xcd\x70\x27\xa2\x77\x56\xef\x53\x50\x96\x60\x12\xbe\xf5\xa7\xa6\xc3\x01\x27\x19\xee\xcc\x73\x7b\x59\x41\x71\xd7\x3e\xe8\x97\x36\x06\x4e\xc6\xdc\xa1\x93\xbb\x85\x40\x6e\x8e\xed\xa3\x8c\x5a\x90\x9b\x09\xea\xc1\x68\xb5\xcc\xa3\x3d\xb8\x00\x4c\x75\x19\xc8\x67\x7b\x94\x8d\x04\xda\xf6\xce\xf0\xe7\x36\xbe\x16\x34\xde\xf6\x5e\xf2\xd7\xd5\x1d\x6f\x93\x80\x77\x90\x5c\xc4\x46\x12\xdd\x6d\x6c\x4e\x7b\xbf\x8b\xeb\x86\x79\x86\xaf\xb5\x43\x54\x5b\x6b\x3b\xd8\xd3\x64\x13\x21\x6b\x09\xe2\x56\x80\xb2\x50\x4f\x75\x69\xdc\xc7\x95\xd2\xb8\xf3\x6c\xf8\x75\xc5\xaf\x5b\x2b\x38\x1c\xe9\xfd\xfa\x51\xe1\x56\x25\x75\xac\x11\x35\x2a\x97\xa8\x24\x8b\xa3\x62\xda\x43\x29\x86\x79\xc1\xc2\x1a\x37\xc4\x8a\x6b\x1d\x23\xee\xde\xa2\xc0\x81\xb7\xe0\x04\x7c\x04\xa7\xe0\x08\xbc\x00\xcf\x95\x98\xf0\xdd\x43\x12\x13\xbe\xfc\x93\xc4\x84\x1f\x1e\xc5\x84\xff\xee\x62\x42\xc2\x18\xbf\xe2\x31\xe1\x50\xeb\x74\x8e\x8b\x16\xd9\x49\xe6\x2b\x2b\x4a\xe9\xe0\x6c\x65\x55\x23\x73\xf7\x70\x65\xf5\xe3\x1c\x8e\xd1\xb5\x90\xd4\xe5\xba\xa4\xce\x99\x5a\x5e\x04\x55\xf9\x25\x1b\xf2\xb8\x73\xd3\xfa\x86\x1c\xb8\xa3\xd1\xa4\xd2\xa8\x4d\x88\xbb\x65\xa5\x15\xab\x47\x6e\x78\x33\xbe\x1d\xa1\x59\xed\xba\x56\x27\x1a\x32\xad\x08\x0b\xdd\x9a\x29\xb0\xc7\x47\xe8\x57\xba\x29\xec\x8c\x2c\x04\x95\x47\xe8\x3e\xa3\xd4\x88\x96\x77\xee\x28\x53\xd1\xf2\xae\xad\x68\x79\xa9\x1d\x2d\x4f\xb2\x3d\x9a\x6c\xba\x4d\x40\xbb\x77\x96\x9c\x52\x44\x50\x7b\xe7\xf4\xe5\x13\x11\xd4\x5e\xba\xa2\xd5\xed\x1e\xaa\x82\x2f\x17\xa9\x4e\x4f\xe3\x42\x7e\x9f\x70\xe3\x6a\x6e\x91\x41\xbf\xa9\x45\xeb\x7b\x31\x6f\xc7\x96\x8c\x9a\xfe\x93\xa5\x6b\x8e\x7a\xf7\xb2\x26\xea\xdd\xbb\x8a\x67\xdf\x85\x35\x43\x56\xd4\x3b\x33\x76\xc6\xcb\xba\xf0\x77\x07\xaa\xac\x2e\xfc\xdd\x4b\x47\xf6\x18\xf5\x4d\x6e\x5c\xe3\xab\xb1\x79\x8d\x12\x79\x40\x3d\x6d\x4b\x98\xa7\xe2\xad\xb5\x33\x2a\x87\xe4\xa4\xae\x82\x8e\xf6\x63\x5d\x25\xd1\x83\x53\xab\x82\x1e\x8c\xe9\xc8\x5d\xc6\x23\x29\xbd\xb0\x41\xd3\xa3\x45\x8f\x1e\x78\x5e\xd9\xb8\x27\xd3\xec\x0a\xa5\x13\xe5\x1a\xf3\x02\xe2\x08\x25\x85\x27\x1d\x0b\x6a\x33\x9e\x82\x8d\x03\x01\xba\xd2\xe7\x0c\x23\x4c\x7a\x2f\x9c\xbb\xe8\x2f\xe9\x97\x22\x4c\xc0\xc8\x85\xad\x5c\x53\x8c\xaf\xb6\xd3\x53\xc5\xe1\x49\xf9\x1c\x09\x02\x57\x78\x1c\xf1\xdf\xb2\x9c\xdf\x01\xa2\x98\xfd\xd4\x4a\xcd\xae\xb2\xf2\x0e\xef\xb1\x31\x4e\xa7\x7f\xdb\x4a\x47\x35\x21\x82\x97\x8e\x4e\xfc\xb7\xf2\x70\x8a\x62\xcd\xa7\x29\xb2\x1d\xd0\xd4\x3e\xd3\x6c\xe1\x53\x78\xd5\x39\x11\xd2\x22\xfd\xe6\xe7\x72\xe4\x58\x36\x2a\xbc\xc0\xf6\x45\x91\xf6\xfe\x38\x08\xc0\xe0\x2c\x08\x00\x0e\x69\xfa\x9f\xde\x38\xcf\x66\x3e\x0c\x54\xb0\xc2\x1d\x69\x58\x9c\xac\x11\x42\x51\x3f\x1a\x76\x1c\x43\x33\x00\x2a\x16\x12\xb3\xca\xa1\x0a\x02\x1a\x7a\x11\x53\x25\x9e\x5f\x71\x21\x12\xde\x43\x65\x10\x18\xa9\x9c\xd8\x81\xd3\x66\x6a\xbf\x37\xe8\xf6\x3e\x9e\xed\x03\x2e\x7a\x73\x4c\x16\x17\xba\xcb\x59\x22\xe4\x5f\xf8\xf4\x06\x8d\x7d\xd8\xc3\xb0\xc0\x3e\x0a\x14\x3c\xd4\x9b\x91\xad\xe1\xef\xfb\xbd\x27\xcf\x02\x06\x3b\x18\x1c\x9e\xed\x60\x6a\x57\x3f\x80\x67\xcf\xc8\xff\x3d\x39\xec\x1f\x0a\xf7\x09\x5c\x06\xe0\xa6\x0c\x00\x32\xfc\x49\xb0\x3e\x26\x76\x5f\xf7\x09\x37\xb1\x48\x71\x1f\x33\x4a\x39\xd0\xf5\x3c\x64\xd5\x16\x29\x7e\x7a\x18\x04\x20\xa5\xdd\xa0\x9d\xe7\x37\xfd\x86\x2b\x25\xee\xa7\xe6\x55\x4a\xad\x55\x62\xad\xf8\x0a\x21\x19\x01\x46\x74\xa5\xe2\xee\xc5\x0a\xf8\x92\x7d\xfa\xee\x46\x7c\x29\x3b\x3e\xf9\x41\xc7\x55\x06\x9f\xec\xb5\x7c\x40\x01\x46\xd7\x99\xf3\x55\x01\x46\xc9\xd6\x74\x29\x00\xb9\xb4\x5c\xd1\x84\xcf\xac\xdf\xea\xd8\xea\xfb\x66\x17\xf6\x50\xf1\x0e\x5e\x05\xf6\x57\x1a\x7c\x88\x11\x94\x34\x03\x04\x25\x2c\x03\x1a\x9f\x54\xcf\x01\xc6\xbb\xb3\x22\xf9\x17\x27\x50\x30\x70\x1c\xe5\x3e\x02\xd6\xd6\xa1\xde\xf0\x53\x24\xb3\x80\x55\x4e\xa6\xe8\x69\x2e\xce\xa1\x48\xc1\x45\x46\x23\x96\x22\x67\x43\x88\x99\xeb\x09\xe3\x36\x02\xa5\xea\x43\x63\x5f\xa5\xee\xda\xc5\x95\x76\x9c\x96\xb2\x9a\x20\xd5\x44\xc0\x37\xee\x52\xa9\x75\x43\x0a\x20\x0c\x74\x20\x6c\xa7\x26\x61\xae\xc2\x3b\xc9\xe3\xb9\xeb\xa7\x0a\x7e\xaa\x80\x25\x3d\xaa\xdc\x2c\xfe\x89\xf0\x94\x81\x2b\x83\xb6\x19\xc0\x2a\x61\x62\x4b\xf0\x3e\xfc\xe0\x5f\xdf\xab\xcc\xfc\xd8\xc6\x70\x4f\x71\x5b\x2f\x6c\x3c\x77\x99\xd1\xdb\x9e\x24\x23\xf6\x68\xbe\x46\xec\xd1\x5a\x30\x01\xb8\xd6\x05\x93\x16\x42\x47\xc4\xd3\x8d\xb1\x3a\x22\x9e\x1a\xa8\xdf\x56\xb6\x84\x95\xef\x6c\x6b\x79\xfc\x49\x2d\x06\x41\x4b\xdf\x41\x8c\xda\x5a\x1c\x3a\xcd\xb1\xbd\x00\xfe\xb4\x16\x8f\x78\x31\xb7\x17\xc2\x5b\x18\xcc\xdc\x6d\x1b\xef\x03\x33\x77\x5b\xd3\xee\x33\xa8\xda\x3b\x40\x29\xa5\x38\x2d\x90\x1a\xab\xd5\x42\xe5\xb0\x02\x46\x2b\x9c\x72\xe5\xa6\x9b\xe1\x93\xe2\x90\x16\xb8\x8c\x48\xc2\x93\xcd\xf0\x19\x91\x84\x9b\x70\x6a\x0f\xa7\x07\x06\xcb\x35\xb1\xe9\xad\x57\x5c\x57\xba\xdc\x07\x0c\x2e\xd7\xbd\xa1\x4c\xb1\x91\x81\xe9\xc8\x3e\x6f\x46\xb4\xe2\xab\x6d\x8f\xda\x8b\x1a\xf0\x22\x5a\xf1\xe7\x6d\x11\x3c\xaf\xdc\x17\x1a\x9b\x3e\x38\xdf\x5a\xe9\xa8\x2b\xb4\x5e\xb5\x53\x09\xd1\x28\x21\x6b\x2a\xb5\xa4\xc0\x1f\x7d\x59\x45\xc3\x5d\x29\xd3\xd2\x95\x01\x5b\x9d\x29\xa0\xdc\xe2\xbd\xf3\x6c\x58\x2b\x3a\x13\x4d\xf4\x3a\x95\x40\xa7\xe7\xd9\xd0\x19\xe5\x54\x53\xef\xa5\xad\xd7\x72\xdf\x54\x01\x57\xd7\xf5\xeb\xd6\xeb\xf1\xc2\x2b\x84\xa7\x5d\x39\x95\x5d\xea\x51\xc1\x6c\x2b\xbf\x90\x0a\x70\xa7\x9a\xe7\xe8\x21\x28\xfe\x4e\xff\x24\xc5\xdf\xd1\xa3\xe2\xef\x5b\x50\xfc\xbd\xe0\x8a\x3f\x6c\x5a\xbb\xab\x2c\x50\x8d\x86\xfe\x54\x79\x35\x6f\x34\x85\x37\x15\x52\x55\x05\x14\x8f\xb1\xa3\x73\x25\x9a\xe9\xff\xcc\xec\x9b\x3b\x83\xee\xd0\xac\x64\xa8\xa1\xc6\x8e\x32\xa5\x86\x9a\xb6\x57\x50\x4e\x56\x56\xe5\x23\xe1\xda\xbc\x66\xfd\xa8\x36\xc4\xcb\x76\xf3\x5c\x9d\x32\xae\x9d\x5b\xab\xa9\x8e\xf8\xb3\xa5\x83\x43\xb6\x0e\x4e\xca\x01\xc1\xa6\xda\xb8\xd3\x2f\xae\x3e\x73\xa9\xcb\xd8\x7c\xc9\x08\x50\x4c\xcd\x26\x26\xa2\xaf\xb9\x9a\x90\xf7\xfd\xd4\xa9\x73\x52\x5f\xe5\x7e\x35\xbe\xaa\x79\x35\x0a\x6c\xfd\xda\x69\x45\xbf\xf6\xc3\x8f\xea\x6b\xa3\x6e\xed\xb4\x41\xb7\xf6\x51\xd1\x24\xca\x99\xe1\xa3\x43\xe1\x74\xed\x2e\xe3\xc4\xf0\x7b\xab\xd4\x91\x1c\xfa\xd8\xae\x62\x1f\xec\x8b\xba\x0a\x62\xde\xde\xd6\x55\xd0\xa6\xf0\x64\x65\xe6\x2a\x69\x8d\xef\xa5\x2e\xe7\x19\x26\xc7\x8c\x6a\xdd\x2a\xa8\x78\xce\xe1\xd6\x73\x7b\x6b\x89\x40\x4d\xcf\x0c\x4b\x12\xca\xf7\x9a\x26\x0b\xe5\x3b\x4d\x93\x85\xaa\x7d\x86\x1c\x82\x4f\x97\x63\x47\x1a\x3e\xdd\xad\x11\x7b\xa6\x96\x23\xc7\xde\x9e\xbf\x5b\x23\xe9\x4c\xb9\x08\x32\x8b\xa1\xb0\xe7\xf6\x02\xd2\x62\x57\x97\x73\x22\xbd\x81\x31\x85\x01\x95\x44\xde\x49\x04\x77\x4d\xae\xaf\x60\xdd\x8f\x46\x6d\xdb\xd0\x90\x49\x56\xa8\x00\x70\xbf\x92\x1f\xa2\x64\x91\x5e\xa4\xd9\x95\x0a\xa7\xf7\x1b\xff\x6d\x6a\xec\xd8\xfa\xeb\x4a\x0b\x4d\xbb\x66\x68\xee\xaa\x17\xb5\x50\x49\x59\x2b\xe6\xd2\xc8\xad\x93\xd4\x4c\x9c\x3b\x87\x9e\x47\x73\x09\x80\x96\x9e\x87\xb5\xe2\x7a\x1e\xb8\xa6\x26\x4e\x59\xc4\x6e\x33\x11\xe6\x89\xbe\x83\x99\xd0\x2e\x98\xf5\x26\x43\x36\x5c\x67\x3e\x36\x96\xe0\x9f\x87\x47\xfe\x67\x5d\xa0\xc0\xd8\xf9\xad\x45\xde\x16\x54\x53\xe4\x9d\xae\x21\x01\xac\x05\x13\x80\xcf\x86\x64\xc7\xac\x69\x72\xb1\xeb\xe2\x31\xbd\x2f\x9b\xf0\xb8\x68\x44\x2a\x7f\x5e\x0b\x9f\x9b\xd2\x34\xf0\x5e\xdb\x0b\x65\x48\xae\xee\xc0\x12\xdc\x0d\x5e\x48\xae\xb6\x96\x42\x1f\xdb\x08\x1c\xef\xfd\xf6\xe9\xc2\x2e\x2a\x58\x2a\xba\x81\xad\x33\x86\xbd\xad\xc5\x21\x6e\xbf\xed\x73\x86\x9d\xd4\xe2\xd0\xee\x95\xc1\xf2\x8e\x4f\xe9\x16\x09\x39\x9a\xe0\x34\x9f\x20\xf3\x31\x6b\x27\xef\x6d\x02\xd0\x0a\x9b\xe1\x46\x71\xb5\x19\x42\xc3\x13\xdc\xc0\xf9\x59\x17\xa3\xbe\x68\x2f\x7a\x1b\xc9\x39\x68\x97\x82\x6d\x5d\xe9\xda\xea\x38\x1e\xdb\xa6\x5e\x5f\x5b\xfc\xa6\x85\xe8\x38\xcf\x86\x5d\x36\x03\x5d\x99\x2d\xa0\x49\x58\x57\x71\x3d\x58\x21\xbd\x03\x23\x10\x33\xe1\xd2\x1a\x06\xfc\xe0\xdd\x8e\x6d\x15\xff\x30\x24\x79\x1f\xfe\x24\x49\xde\xab\x47\x49\xde\xb7\x20\xc9\x7b\x13\xfa\x54\x12\x37\x6a\x6f\x6f\xdf\x58\xb5\x6a\x6f\xdf\x58\x9d\x5d\xf6\x47\x49\x54\xc8\xf0\x18\x49\x45\xa6\x28\xe5\x6d\x22\xd8\x48\x94\x24\xef\xb2\x18\x92\x8b\x85\x90\xb9\x5c\xcc\x96\x54\x04\x7e\xac\x12\x17\xad\x25\x6e\x51\xdf\xa5\xa3\x4c\x89\xfa\xae\x2a\x59\xe4\x59\x60\x59\x69\xc5\x6e\xca\x2f\xb5\x5e\x1d\x69\x3c\x77\x6f\xb8\x24\x25\xca\xbe\x5d\x6b\x95\xaa\x26\x86\x54\xa1\x16\xc8\x06\x86\xf9\xe6\x2c\x5f\x57\xc7\xe4\x6c\x9e\xf2\xd9\x7b\x5f\x5f\x5f\x07\xac\x1a\x1c\x5b\x22\x42\xdc\x2a\xa9\x3d\x17\xc9\x9c\x67\x43\x3e\x2c\x3d\x2d\xfd\x9a\x12\xc4\x97\x66\x6a\x1e\x21\x5e\xfa\xb0\xb5\x60\xb1\xbd\x65\xbd\x36\x35\x42\x86\x48\x67\x65\x5d\xf1\xe4\x99\xd6\x6d\x43\xb8\xf8\xa1\xd6\xa0\xfd\x83\x25\x76\x14\xeb\xa3\x15\xd9\x22\xc6\x0f\x4e\x11\xe3\x07\xb7\x88\x51\x2d\x91\x59\xc5\xce\x5d\xff\xb2\x4e\xdc\xf7\xd6\x76\x0f\x70\xed\xbf\x93\xba\x4a\xc6\xa0\x3e\x5a\xb5\x28\xdb\x7b\x5a\xfd\xa8\x9f\x24\x65\x42\xff\xd2\x21\xed\x7c\xe1\x2e\xe3\x0c\x94\x6d\x42\xcf\xb8\x1f\x49\xf4\xbe\xd3\x64\x90\xe2\x3e\xb0\xa4\x88\x76\xda\x03\x7a\x31\xf0\x88\xf9\xd5\xda\x02\x88\x6e\x8b\x49\x0b\xdc\xb7\xc3\x00\xf6\x50\x7c\x16\x34\xa6\xef\xcf\x62\x52\x89\x9f\xd7\x9e\x6e\xc4\xaf\x5f\x9b\x6d\x04\x97\xda\xbe\xc7\xb6\x38\x93\xed\x7c\x97\xf8\x32\x35\xc6\xd3\x20\xb8\x6c\x1a\x67\xca\xc6\xd9\x28\xcb\x8c\x35\xe3\xf0\x26\x11\x26\xe9\x10\xed\x2e\x15\x5f\x4a\xf9\xcc\x8d\x48\x55\x20\xfa\xe1\x14\xbc\xe2\xf0\x29\xd6\xa4\xa6\x28\xf6\x82\x30\x24\xff\x4a\xfb\xe1\x1b\x52\xd0\x87\x40\x1e\x9b\xfe\xca\x05\x04\x1a\xa6\x3e\x06\xa3\x1c\x46\x18\x9e\xa2\x19\xec\xff\xea\xe3\x00\x30\x19\x3f\xfd\xfd\xb3\x8f\x83\xb2\x34\x25\x69\xbf\x08\x44\xb6\xa0\x94\x65\x04\xb1\x52\x81\x68\xc9\x2c\xf0\x49\x25\x1f\xcb\xbb\x0c\x77\xaa\x39\x59\xa8\xf1\xa9\x2e\x52\x3d\x11\x1f\xee\x4e\xe6\x1a\xc3\x49\x1e\xc5\x50\xf7\x75\xe0\x1f\xbe\x8c\x54\xd6\xe9\x47\x51\x27\x8f\x64\x7b\xba\xe2\x4c\x51\x27\x80\x4c\x37\x77\x8e\x18\x59\x12\xc8\xbc\x5e\x02\x59\x71\x8e\x58\x57\x24\xab\x9d\xe4\x75\xe7\x40\x9e\xa9\xbb\x98\x02\xe3\xc6\x5f\x6f\x0e\xb4\xa6\x6b\x4d\x42\x86\x33\xd6\xb4\x49\x7d\xc1\xf9\xfc\x9e\xc8\x01\x03\xdb\x0a\x70\x47\x55\x01\xee\x45\xf8\xca\x3f\x36\x83\x29\xb3\x0c\x06\xf1\x1d\x59\x46\xbf\xad\x20\xb8\x7b\x73\xdb\x93\x5a\x1c\x77\x6b\x6e\xfb\xb1\x16\x8f\xb1\x55\xb6\x97\x76\x9e\xda\x88\x98\x58\x7d\x6b\xf9\xe6\x91\x03\xae\x49\xa2\x6c\x2f\xdf\x7c\x61\xe3\x30\x24\xcd\x5b\x8b\x36\x9f\xd7\x80\x17\x92\xe6\xad\x85\x9a\xef\x2a\x8b\x6c\xd2\x5a\x83\xcb\x6d\x31\x58\xf0\x15\x03\xd7\x46\x94\xe8\x6e\x1a\x80\x63\x5d\x82\x68\x61\xe0\xcc\xde\xe0\xf3\x9a\xe0\xd3\x16\xb0\x4d\xd5\x0c\x5a\x43\x35\x53\x0b\xa6\x19\xa1\xc9\x65\x53\xab\xd5\xb5\x30\xd9\x5c\x7a\x13\x2e\x9b\xb2\xd9\x66\x84\x15\x58\xad\x50\x1b\x17\xd8\xf5\x66\x28\x0d\xe1\x48\x0b\x9c\xe6\x65\xf6\x7e\x33\xa4\x26\xf3\xdf\x84\x55\x3d\x7a\x74\x7a\xdb\xaa\x0c\xea\x60\x58\xc8\x8e\x03\x25\x81\xfd\x95\x47\x14\xec\x60\x2a\xce\xd2\x32\x94\xa1\x4e\x36\xee\xc0\xc0\xdf\xc5\xb7\xb7\xa8\xa7\x08\xdf\x9f\x30\xa1\xf5\x71\xa8\x7f\x93\x0e\x7a\x58\x89\x2d\x7f\x6e\x09\x59\x91\xd0\x4f\x25\x64\xf5\x4d\x83\xac\xa4\x66\x6f\xda\x2b\x00\x68\x2d\xc4\x95\x2f\x2b\x74\x00\x6b\xc8\xdc\x57\x59\xee\x36\x0a\xd0\xb9\x14\x57\x49\xd1\xd5\x72\xc4\x0f\x49\x20\x3e\x7f\x14\x4c\x7f\x0b\x82\xe9\x59\xe8\x27\xcc\x50\xd1\x0c\xa8\xcc\x04\xbe\x99\xab\x48\x3b\x75\x01\x88\x56\x09\x21\x51\xad\x44\x91\xa6\xca\x25\x13\xbf\xe3\x92\x2d\xc6\xba\xa4\xa9\xe0\xe2\x20\xf1\x51\x3f\xf8\x0b\xab\x8c\xa6\x79\xcb\x3d\x30\xe2\xdf\x51\xb8\x7b\x08\x7c\x1c\x7a\xa8\x78\x19\x23\x16\x44\x1a\xa5\x3c\x25\x6f\x70\x3f\x1a\x9e\x12\xc6\x08\x8b\xe4\x6a\xe7\xd9\x90\x71\x58\x1f\x53\x78\xf5\x42\xeb\xf9\x2f\x27\xef\xdf\xf5\x0a\x9c\xa3\x74\x82\xc6\x4b\xc6\xdd\xa9\x91\x01\x9a\x8a\xed\x87\x40\x8f\x5e\xa9\x86\x00\x76\x0f\x82\x32\x4b\x59\x76\x5c\x5f\x63\x7c\x8c\x3a\x87\xa4\xce\xc9\x62\x38\x53\xbd\x61\xd3\x63\xb0\x59\xbe\x47\xdd\x94\xe9\x4c\xcb\x1e\xa3\xf8\x9f\x08\x4f\x95\x3f\x75\x59\x82\x22\x9c\xfb\x51\x95\x4a\x4f\xb6\xa5\x0f\x17\x36\x5c\xe3\x5e\xcf\xb6\x05\x3f\xb2\xc1\x8b\x1d\x32\xc8\xef\x88\xe7\x8b\x74\x05\xf6\x6c\x9d\xf7\x4b\xc4\x03\x69\xa1\xc4\xde\xfe\x01\x73\xbc\x57\xec\x14\x52\xad\xef\xce\xdd\x5c\x28\x51\xe8\xe7\x8e\x5b\xc3\x23\x57\xd7\xf6\x57\x05\x48\x9d\x97\x05\x3b\xcc\x00\x87\x6c\x4b\xb2\xe4\xa1\xc0\x47\x61\x16\x7c\xad\x0f\x2d\x39\x4e\x89\xb6\x2b\x17\xbc\xef\xa3\x70\x90\x9f\x81\x38\xdc\x66\x47\x82\x59\x78\x53\x02\xfd\x91\x8e\x6b\x1e\xe9\x19\x79\xa4\x63\xfe\x48\xcf\xcc\x47\x5a\xff\x09\x66\xf6\x23\x3d\xab\x7d\xa4\x67\xb7\xb7\x33\xfb\x91\x9e\x99\x8f\xf4\x2c\x1c\xb5\x79\xa4\xa9\x48\x47\x90\x88\x3e\xa1\xa6\x60\x70\x7b\x0b\xcb\x00\xcc\x02\x30\xd7\x1e\xe9\x99\xf5\x84\xce\xf8\x23\x6d\x7c\x7f\x36\xab\xae\xc8\x5c\x3e\xd2\xb3\xe6\x47\xda\xc6\xe0\xde\x54\xa4\x8b\x33\x32\x3c\xf6\x48\x67\xe1\x0c\x24\xc1\x0e\xd9\xbd\xdc\xa0\x02\xcc\xc1\x4c\xbb\x2b\xa2\x35\xee\x0a\x54\xcc\x59\x44\x9c\x07\x1d\x11\x93\x0c\x45\x4b\xc1\xba\x85\xcb\xdc\x26\x46\x34\xb6\x9b\x5c\x3b\x0a\x9e\x2f\x9b\x24\x8d\x87\x0f\x89\x8e\x1f\xff\x49\x86\x2d\xd3\x47\xfe\xe1\x5b\xe0\x1f\x26\x9c\x7f\xa8\xba\xa8\x65\x8e\xcf\x3d\xfd\xe8\x13\xe6\xc1\xa8\x62\x16\x16\x0d\x8e\x63\x8b\x55\xde\x51\x32\x64\xa1\xa6\xb4\x68\x63\xd1\x30\x76\x9b\x2e\xac\x69\x49\x30\x6e\xe3\x33\x34\x6e\xf0\x19\x1a\xea\xcc\x8f\x60\x64\xc4\x47\xe3\xfa\x8c\xad\x42\x5d\xf8\x3c\xb7\xca\x98\x60\xf7\xa5\xde\x7c\xc6\x15\xe9\x25\x18\x85\x53\x7f\x71\x0f\xc4\x7d\x6c\xc3\x35\x6f\xff\xad\xa9\xfb\xb9\x0d\xdf\x10\xbf\x47\xdb\x27\x8a\xb6\xc0\x3b\x26\x71\x50\x6c\xcd\x01\xe9\x0c\xc4\xa4\xfd\x4b\x5a\x1f\x5f\xba\xde\xfe\xb5\x41\xa0\xb5\xc6\xa3\xba\xfa\xe5\x54\xef\xe5\xe2\x21\xbd\x97\xa3\x3f\xe9\xbd\x8c\x1f\xdf\xcb\x6f\xe1\xbd\x9c\xf3\xf7\x12\x39\xde\xcb\x15\xec\xf1\x7a\x2f\xd9\xc2\x8a\xb5\x1b\xf1\xc7\x60\xb4\x8e\x71\xde\x7a\xcf\xde\xa8\xc6\xea\x6d\xe1\x12\xe5\x8d\xdc\x6f\x24\x0b\xcb\x66\x94\x5a\xf6\x6e\x65\x09\xa2\x30\xf6\x33\x67\x1c\xb5\xf4\x8e\x24\x3a\x85\x8d\xe1\x8e\x5e\xc3\x4c\xbf\xe8\xe7\xed\x2f\x7a\x9a\x23\x74\xc2\xfd\x58\x1e\x7c\x36\x81\x7b\x8d\x3a\x02\x46\xec\xfe\x7c\x4c\x3c\xf0\x98\x78\xe0\xf1\xb1\xda\x36\xf1\x40\xdc\x3a\xf1\xc0\xbc\x26\x4c\x7e\x25\x24\xc9\xac\x52\x71\x83\x90\x24\xdc\xeb\xa1\x1a\xfd\xfe\x79\x35\x13\x68\x4d\x10\xfc\x69\x63\x10\xfc\x49\x7b\x77\x8d\x65\x4b\xff\x0b\x67\x7e\x00\x36\x49\xc5\x28\x4a\x20\xcb\xf5\x06\x2f\xa9\xb1\x1b\x4b\x2c\x80\xd1\x0c\x7a\xda\x7d\xa7\xcc\x03\x29\x9c\x09\xc4\x01\x7f\x29\x6b\xe0\x78\x2a\xbc\xee\x33\x28\x43\x02\x53\xb0\xda\x11\xe8\x0f\xe8\x41\xbc\xaa\x26\x55\xa0\x93\x75\x42\xa0\xbe\xd4\xfb\x35\x8d\x8a\xa3\x6c\x41\x5d\xd7\x1d\x7d\x63\xca\xa8\x4a\x53\x95\x61\x51\x36\x0f\xb8\xad\xb0\xec\xe4\xd3\xc3\xbd\x3d\xf8\xb4\x0e\x02\xab\xbc\xff\x03\xe9\xec\xe7\xfa\xb4\x0c\x2c\xf1\x2a\x7d\x55\x00\xb7\x90\x55\xa1\xd7\x4b\xe1\x1f\xb2\x7a\xaf\xba\xb6\xdd\x26\xc9\x11\x34\xaf\x9a\x75\xd2\x24\x98\xb1\x5b\xed\x64\x09\xa3\x28\xad\xe6\x48\xf8\xba\x62\xb9\x6c\x95\xcc\xa0\x2e\xaf\x80\x1e\xe3\x65\xeb\xc4\x07\xae\xc0\xff\x76\xee\x01\xd3\xe0\xae\x92\x78\xa0\xea\x97\x5d\x9b\x76\x40\x0c\xc8\x4e\x3b\x50\xf1\x88\xb6\x73\x0f\x54\x4e\x82\x23\x01\xc1\x34\x5b\x24\xf1\xc9\x34\xbb\x52\xd5\x4e\xd1\x0c\x26\x28\x85\xd2\x9f\xa2\x7d\xd0\x96\x3f\x3b\x48\x4b\xcb\x78\x2c\xa8\xde\xad\x01\x55\xe2\xb1\xd4\xb9\x30\x20\x77\x38\x16\x6e\xa4\x8d\xb3\x2c\xc1\x68\x7e\x0a\xaf\xb1\x35\x07\xa3\x28\x25\xff\xa5\x19\xf6\x3d\x7a\xf1\x76\x98\xf6\x71\x91\x24\x40\xdd\x40\x7d\x6c\x84\x03\x57\xe1\xd1\xf5\x38\xd4\x65\xf0\xcc\xfb\x57\xb6\xe8\x44\x39\x4c\xff\x83\xcd\xfb\x15\xcb\x04\xc9\x00\xd3\xcc\x8f\x13\xe6\x3d\x6d\x03\xac\xdc\x70\x0c\x14\xeb\x59\xb5\x7d\x27\x5e\xe4\x28\x9d\x74\xa2\x8e\x52\x3f\x7b\x82\xb6\xbc\x93\x98\x32\x14\xa5\x74\xf7\x26\x40\xaa\x59\x93\x69\x1d\xff\x31\x00\xcd\x3d\x04\xa0\x59\x27\xe8\xbd\x16\x80\xc6\xb6\xf6\xcf\xee\x32\x00\xcd\x86\xf6\xfa\x22\x89\x34\xdb\x48\xae\xa0\x9d\xa4\xc6\x90\x50\xa7\xa3\x7c\x31\x1b\xca\x1b\xe6\x3c\x1b\xf6\x21\x20\x67\x4b\x5c\x25\x2a\x82\x92\xf0\x17\xc2\x08\x27\xb0\xef\x91\x8d\xda\xe1\x21\x22\x58\x97\x31\x88\xf2\x49\xd1\x1f\x48\xb3\x98\x9e\xce\x7e\x43\x80\xcf\x4a\x57\x30\xf7\x7b\x0a\xb5\x5e\x09\xe9\x4e\x1f\xfe\x2f\x12\xc9\x7d\xeb\xd8\xe3\x7f\x76\x24\xf7\x68\xdd\x30\x33\xb5\xad\xdb\x85\x60\x36\xc3\xb3\xcc\x36\x8c\xc4\xfc\xbc\x1e\x6f\x25\x5c\xbc\xa1\xed\xd8\xda\x0f\xa3\x12\x2b\xde\x72\x36\xd8\xda\x21\xa3\x1a\x28\xde\x11\xd6\x66\x6b\x97\x8c\xfa\x30\xf1\xd2\xac\x7d\x6b\xbf\x8c\x4a\x68\xec\x6a\x58\x9b\xad\x5d\x33\x2a\xf1\xb1\x1d\x74\xe0\xf6\xee\x19\xd5\x20\xd9\x8d\xa4\xe4\xf6\x61\xbf\x2d\x74\x1a\x81\xd5\xce\x67\xa3\xb6\x75\xf3\x21\xad\x84\xeb\xc9\x5b\xdb\xde\x37\xc1\x69\x46\x6a\xd2\x42\x9b\x23\xb5\xe0\xb4\x8a\x76\xaf\x5c\x78\x5a\xf8\x8c\x34\x01\xb0\xb0\x6d\x18\xf6\x7c\xff\x12\xe6\x45\xad\xd1\xcf\x7d\x19\xeb\x73\xe1\xf6\x46\xfa\xca\x47\xe9\xe6\xbf\xab\x74\x93\x11\xe0\xa3\xf0\x26\x8e\xd2\x09\xcc\xfb\x1e\x2a\xba\xec\x4f\x0f\x5c\x45\x79\x4a\x3f\x90\x3f\x28\xff\x40\x85\xa1\xb1\xdb\x52\x5e\x58\xba\x18\xd2\x24\x98\xe7\x59\xde\x4b\xe0\x25\x2d\xbf\x0b\x1b\x79\xa1\xe3\x70\x9a\xbf\x22\x3a\x33\xd4\xc8\x9d\x62\xbe\x7f\x03\x77\x61\x62\x9b\x73\xab\xd5\x8c\x5b\xdc\x26\x61\x51\x6b\x71\x4b\x46\xa0\x6b\x4d\x92\x5a\xad\x49\x52\xa3\x35\x49\x6c\xad\xc9\xca\x9d\x98\x69\x5a\x13\xc2\x2a\xd0\xe9\xf9\x95\xac\x8b\x70\xb7\xe6\x07\x61\x34\x50\x62\x0d\x63\xf5\xce\x6e\x6f\xc9\x5e\x40\xe9\x38\xf3\xca\x2c\x7d\x81\x8a\x19\xa2\x0d\x15\x1b\xc5\xe6\x9c\xf2\xfd\x41\x39\x8d\xd2\x38\x81\x2f\xc9\x27\xc9\x3e\xeb\xb5\xb8\x25\xfd\xe2\x7e\x2c\xe9\x4d\xa8\xd6\x68\x99\xb9\xcd\xaa\x87\xa0\x11\x42\x00\x22\xfd\x25\xb0\xf0\x69\x63\x5f\xeb\xa5\xab\x05\x62\xa1\x33\xec\xec\xe3\x76\x0f\x4f\xbe\x68\xe1\x1c\xb6\xca\xb1\x8b\x1d\xc4\x14\xe4\x77\x64\x24\x9f\x84\x7e\x6a\x5e\x0a\xb5\x99\x31\xda\x9b\xbe\x0b\xb7\x06\x65\xfd\x9e\x7f\xb5\xd6\xef\xd2\x2b\x45\x49\x01\x56\x38\xa6\x7c\xfa\xee\x06\x96\xff\xe3\xbb\x1b\x7c\x7b\x2b\xf3\x79\x94\x9f\xc8\x61\xca\xc2\x54\xdb\x3f\x91\x9a\x88\x22\x1c\x20\xc9\x25\x2f\xb6\xb3\xa8\x8f\x6d\x8b\xfa\x45\xcd\xdb\x1f\x93\xb7\x7f\xc1\xdf\xfe\xd8\x7c\xfb\xf5\x9f\x20\xb6\xdf\xfe\xb8\xf6\xed\x8f\x6f\x6f\x63\xfb\xed\x8f\xcd\xb7\x3f\x0e\x8b\xf5\x2d\xea\x09\xdd\x23\x2c\xea\xe3\x00\x8c\xb4\xb7\x3f\xb6\x5e\xe6\x98\xbf\xfd\xc6\xf7\x67\x71\x75\x95\x47\xf2\xed\x8f\x9b\xdf\x7e\x1b\x83\x7b\xa3\x92\x2e\xc6\x64\x78\xec\xed\xcf\xc3\x18\xa4\xcc\xa2\x5e\x33\xcf\xd6\x6e\x85\x64\xe5\xad\x40\x68\xdb\x19\x93\x6f\xac\x1b\x36\x72\x92\xa0\xd9\x0c\xe6\xfb\x38\x8f\x46\x17\x06\xf9\x59\x31\xc0\x50\x36\x14\xf4\x77\x77\x94\xa5\x4c\x05\x32\x5a\xae\xb6\xab\x68\x8a\xde\xd8\x22\x1a\xa5\xb2\xb9\xb8\x0f\x53\x09\xf0\x0e\xbc\x04\x1f\x76\xaa\x11\x0c\x1f\x82\xc1\xc4\x9b\x3f\xc9\x60\xe2\xd7\x47\x96\xe2\xdf\x9d\xa5\x20\xef\xfa\xcf\xa1\x3f\x65\x66\xeb\xec\xd9\x09\x7c\x4f\x5c\x37\xfb\xc5\x62\x36\x8b\xf2\xa5\x30\x2d\x28\x1a\x53\x90\xb0\x34\x81\xcb\x95\x15\xa5\x0d\xc2\xe5\xca\xaa\x46\x54\x84\xab\x95\xd5\x65\x5a\x3d\xaa\x67\xcf\xa8\x08\x3c\x50\x4b\xfe\xbd\xad\xee\x17\xc2\xcb\x13\x3a\x4c\x04\x8b\x1e\x35\x4e\x7e\xcf\xcc\xdc\x29\x29\x78\x09\x3f\xc0\x51\x36\x9b\xc1\x34\x66\x5a\x1e\x36\x23\x81\xc8\x01\x5d\x05\xc1\x2e\xbb\xe7\xd8\x87\x4f\x0e\x83\x1d\xfc\xac\xa2\x8c\xe2\x20\x7c\x1c\xf4\x39\xa5\x9d\xc6\xbe\x97\xc3\x68\x34\x85\xf1\xcb\x34\xa6\x79\x7c\x7b\x71\x9e\xcd\xfd\x00\x9c\xb7\x24\xb9\x5c\x64\xd6\x2b\xa1\x66\x65\x08\x8f\xb4\x77\x42\xe4\xed\x78\x65\x39\x20\xbf\xb7\xbe\x0b\x23\x45\xa1\xb3\x7f\x53\xe3\x6b\x50\x13\x11\xd1\x95\xf4\x8c\xcd\x18\x4f\x9a\xb2\x9c\xc3\xbe\x47\x68\xa0\xf5\x22\x28\xf2\xd4\xbf\x22\x4d\x74\x79\xa6\xf5\x58\x76\x45\xa9\xe7\x5f\xa9\xb4\x2a\x46\xa6\xfe\x57\x15\xb5\xfd\x49\xa5\xc4\x95\x9b\x5f\x95\xda\x49\xf9\x55\x89\x96\xcb\xed\xc8\x9e\x54\x33\x5d\xea\x8b\xba\x62\xd1\xa9\xe7\x75\x15\xf4\xbe\xbd\xab\xab\x24\xba\xf8\xd2\x5a\x42\x33\x49\xe8\x56\x09\xf0\xcf\x2a\x50\xa5\xcc\xfa\xfe\x12\xdb\xab\xa1\xce\xf3\x6c\x04\x09\x59\xf1\x81\x0f\x91\x1d\x2b\xb6\xeb\x99\x1e\x20\x7c\xcd\x83\x83\xf8\x37\x71\x84\xa3\x93\x6c\x91\x73\x2d\x37\x67\xb2\x53\x3d\x41\x78\x55\xf5\xab\x8a\x99\x39\x82\x38\xed\xce\xca\xb2\xb4\x5d\x06\xf2\x87\x96\x7b\x5c\x6b\x15\x7a\xdf\x7b\x2a\xe9\x78\x53\x74\x3c\x43\x55\x2c\x27\x48\x74\xee\x3c\x1b\xf6\xcc\xdc\xd8\x32\x83\x3e\xa1\xfe\x59\xc6\xfa\x74\x14\x61\x1f\x07\x01\x18\x9c\x05\xe4\xfe\xd5\x14\xd1\x70\x73\xa5\xb2\x7e\xc2\xd9\x03\x63\xaa\x94\x23\xa5\x52\xc6\x0d\x41\xf4\xc8\x2c\xe0\x35\x63\xe8\xb1\x93\xa9\x4d\xd2\x7e\x6f\xd0\xed\x7d\x3c\xdb\x17\x8f\x8b\x73\x9e\x98\xf1\x85\x9a\x20\x42\xb7\x88\xd4\xe6\x18\x16\xd8\x47\x81\x82\x88\x7a\xb3\x08\x8f\xa6\xfe\xbe\xdf\x7b\xf2\x2c\x60\xd0\x83\xc1\xe1\xd9\x0e\x26\xb4\x19\xf9\xbf\x67\xe4\xff\x9e\x1c\xf6\x0f\x4b\x19\xd7\x26\x00\x37\x65\x00\x50\xa8\xd3\x78\x58\x1f\x15\xbb\x76\xfb\x84\x0c\x5e\xa4\xb8\x8f\x19\x89\x67\x24\x85\xe7\xa9\xf8\x9f\x1e\x06\x01\x48\x69\x37\xe6\x7a\x5e\xff\xb5\x17\x89\xcd\xd5\x8a\x05\x4a\xad\x05\x62\x8d\xd8\xe2\x20\x69\x48\x28\xfa\x50\x39\x6d\xac\x80\xaf\x16\xe1\xdd\xf9\x97\xb2\xe3\x93\x1f\x74\x40\x65\xf0\x49\x2e\x63\xe5\xed\xff\x22\xb9\xed\x8d\x7b\xad\xa7\x5b\x80\x1a\xa9\xee\xad\xd4\xf1\x34\x36\xca\x0e\x1a\xfb\x49\x0f\x15\x2f\x60\x81\xf3\x6c\x89\xd2\x89\x91\xaf\xde\xfb\xde\xdb\x0d\x43\xfb\x8c\xef\xed\x25\xca\xea\x87\x19\x01\xb1\x2d\xe8\xa8\x6b\x80\x73\x9b\x38\x25\x1b\x66\xda\x4f\x5a\x66\xda\x4f\xb6\xc9\xb4\x9f\x85\xc9\x1a\x99\xf6\x33\x67\xa6\x7d\x6a\x83\x56\x4f\x39\xca\x17\x43\x52\xd9\x62\x45\xbd\x90\x4f\x28\x97\x2a\x71\xf3\x43\x6a\xbb\x44\x66\xf8\x99\xbe\xfc\x8a\x98\x63\x8f\x8e\xe0\x1b\x5d\x84\x66\x83\x45\x54\xa5\x0f\x00\xf6\x8a\x64\x31\x01\x37\x1a\x85\xd7\x37\xf3\xd7\xc2\x9e\xfe\xb3\x2c\x9b\x2d\x65\xc8\x3d\x63\x9f\x5a\x2c\x9e\xe8\x65\x3a\x7a\x4e\xa7\x4a\x4e\x4e\xe9\xf8\x76\xd3\xe2\x9a\x40\x63\x7f\x77\x15\xd1\x7e\x7b\xbb\x5b\x4b\xf6\xeb\xcf\x62\x13\xdd\xbf\x92\x83\x90\xe4\xff\x41\xb0\x03\xeb\x89\x7f\xc8\x89\xff\x86\x35\xf1\x58\xf4\xde\x12\x5c\x87\xbf\xfa\xe7\x86\x62\xb5\x4a\xd0\x6f\x6f\x80\xf0\xde\xc6\x72\xe7\x21\x67\x8e\x2b\xe3\x10\x2e\x50\x77\x85\xe1\xa2\x82\x41\xe3\x06\x06\x69\x8f\x0a\xc1\xe0\xe6\x26\x42\x9a\xdd\x38\x3f\xc4\x5e\x49\xe3\xa7\x5a\x68\x05\xa3\x71\x7f\x28\x4f\xaa\x28\x25\xcd\x7d\x6f\x48\x3f\x56\x91\x1a\xb1\x0f\xef\x0d\xf1\x69\x15\xb1\x4c\xc1\x7f\x6f\x48\x8f\xaa\x48\x35\xa6\xee\x5e\xf0\x7e\x4f\x11\xbf\xa8\xee\x62\x83\x61\xbc\x8b\x00\xad\x75\x18\xe4\x26\xba\x83\x18\xad\x75\x38\x8c\x3d\xb3\xb5\x29\xd0\xcb\x5a\x3c\x72\x8b\x6c\x6f\xfd\x63\xe3\x90\x2c\xe7\xf6\xf9\xfe\x2d\xc8\x8e\xc7\x62\xad\x90\x9b\x2b\x81\x05\xe0\x5c\xd7\x4f\x56\x26\xcf\x7e\xca\x37\xc7\xee\x80\xb5\x02\xb9\xfd\xf6\x6f\x81\xbb\x02\xca\x42\x7d\xae\xeb\x65\x7f\xa6\x92\xd0\xd7\xdc\x75\x6c\x21\xad\x25\x94\xac\x40\xf1\x62\xc2\x6d\xcc\x5d\x4b\xbd\x37\x64\x74\xfe\x6c\x55\xd0\x8f\xd1\x5a\x5e\x36\xaf\x9c\xee\x1d\xc3\x8a\xe8\x47\x3d\x7a\x63\x4b\xea\x03\xaf\xa3\x11\x7e\x4b\x78\xc2\x97\x29\xd9\x94\x31\xcb\xc7\x21\x8a\xc7\x8b\xcf\x9f\x39\x6b\xa1\xca\x0f\x54\x39\x27\x94\x5e\xa9\x6a\x14\x16\x2c\x58\x70\x3f\xca\x15\xa9\xb2\x8a\xbf\x46\xb2\x98\x78\x67\x65\x19\x18\x16\xa4\x56\xfd\x35\xe3\xf7\xce\x1a\x61\x05\x60\xa6\x2f\xfa\x30\xfc\xd5\x6c\x60\xd9\x8a\x6e\x6d\x3c\x3c\xb6\x11\x18\x04\xc8\xd6\x41\xd4\x67\x41\x6b\x55\xa1\x94\xdd\xaf\x1b\x7b\xeb\x32\xca\x3b\x54\xe9\x73\x77\x76\x03\xa8\x46\xbf\xe0\x05\x60\x03\x93\x02\xa6\x0b\x5c\x61\x58\x20\x50\xe8\x34\xf2\x03\x30\x32\x00\x51\x38\x30\xb9\x2d\xc5\x76\x7b\xe5\x19\xf0\xb3\xd0\x90\xbd\x07\x28\xf5\x93\x46\xa3\x29\x32\x59\x7c\x8d\xa2\xb5\x14\x82\xc9\x20\x3b\x0b\x23\x4d\xdc\xb9\x5c\xc7\x99\x81\x1c\xf5\x3e\x2c\x75\x39\xd6\x52\x38\x31\x08\x81\x66\x0e\xe7\x49\x34\x82\xbe\xb7\xef\x01\xaf\xb3\xdf\xf1\x02\xe1\xc4\xe0\x60\x4b\xa9\xff\x42\xc5\x6c\xc2\xb5\xcc\x45\x38\x40\x8f\xb6\x13\xdf\x90\xed\xc4\x4e\xe3\x85\x58\xc0\x9c\x4c\xcf\x57\x15\x83\x70\x9d\xa0\xc2\x5a\x2c\xe0\x57\x59\x3e\x44\x71\x0c\xd3\x2f\x10\x0d\x78\xad\x30\x89\x7c\x8e\x1b\x62\x3b\x6d\x16\x1f\xb1\x29\xe8\xa1\x16\x06\xd6\x0c\x7a\xc8\x8c\x42\x94\xb1\xc7\xe4\x21\x19\x7b\x2c\xff\x24\x63\x8f\xcb\x47\x63\x8f\x6f\xc1\xd8\xe3\x8a\x47\x3a\x46\x8a\x18\x13\xf7\x23\x41\x66\x44\x2f\xe4\x05\x9a\xa4\xd9\xb8\x81\xdc\xc1\x12\x45\x3a\x92\xc8\x55\x18\x4d\xb8\x6b\x86\x15\x27\x51\x7e\x5f\x34\xc4\x4f\x1c\xb5\x8e\x9f\xd8\x8a\x95\x9a\x48\x66\xc9\x1a\xa5\x8a\x4f\x28\xaa\xe8\xc3\x96\x01\x0a\x45\x21\xcf\xdb\x32\xb3\x3e\xf3\x21\x49\xde\x6c\x79\x7f\x21\xac\x96\x35\xe1\x0a\x96\x95\x70\x05\x7f\x53\x1f\xad\xe8\x03\xa8\xf8\x15\x46\x31\x35\xb3\x59\x36\x84\x1e\x98\x38\x42\x0f\x8c\xad\x91\x73\xef\x38\x3e\xfe\xa9\x0c\xd6\x18\x87\x97\xfe\xc8\x64\x8d\x2a\x33\x3f\xc8\xb7\x0f\xad\x68\x61\x31\x16\x6f\x7b\x6b\xf5\x99\x0d\x5f\xe4\xed\xd9\x3a\x28\xe4\xd0\x86\x2c\xb6\xd0\xf6\x01\x21\xc7\x36\x68\xc3\x03\x73\xeb\x48\x90\xd3\xca\xca\x1a\x5b\x60\xb0\xd8\x3a\x1a\xbe\x2e\xab\xb9\x6a\x4d\x8d\xb0\x7f\xbf\x2a\xc2\x8f\xc5\xb2\x20\xdd\x72\x32\x53\x1b\x11\x5d\xec\xdf\x8d\xe2\x6a\x36\x79\x0d\x48\xd2\x20\x79\x24\x0d\xbe\x05\xd2\x20\x0b\xfd\xb4\x92\xce\x99\xbd\xdb\x38\x9a\x50\xfa\xc0\xf7\xf3\x75\xc5\x35\x35\x2c\x8d\x47\x41\x52\xb6\x86\x69\x5b\x4f\xa3\xe1\x17\x60\x6a\xe8\xf1\xa3\x97\xd3\x69\x34\xa9\x18\x62\x69\xf1\x61\xd8\x88\x6f\x6f\xdd\x1b\x1d\x72\xdb\x11\x1c\x3e\xf5\x6f\x58\xc0\x06\x4e\xf4\x13\x3c\xd4\x14\x46\x18\x9b\xf0\x50\x29\x05\xc4\xa7\xd1\xd0\x74\xae\x52\x03\xa7\x0e\x56\x41\xf5\x06\x3d\xa5\x93\x34\x68\x21\xfb\xce\x6b\x1a\x07\x20\xd7\xe5\x9f\x89\x55\x91\xf6\x6a\x2d\x21\xbb\xab\xbd\x85\x24\xd7\x6f\xeb\x6c\xdd\x6b\x6c\x96\xa5\x08\x67\xeb\xdf\xda\xf2\xba\x42\x5f\x96\x83\xba\xab\xd7\x22\xdd\xc8\xc4\x17\x39\xc9\x4a\x8f\xf9\x01\x9e\xa9\x72\xf6\x01\x78\xd4\x25\x30\xd0\xdf\x99\xb4\xc5\x02\xb1\xf8\x20\xfb\x38\xbb\x80\x35\x9e\xd0\xdb\x05\xf3\x8c\xe6\xf3\x04\x09\x17\xf7\x36\x4e\xd0\x20\x61\x57\x8c\xc1\xf9\xab\x17\x6b\xf6\x90\x38\xfe\xe1\x9f\xc4\xf1\x8f\x1f\x9f\xf5\x6f\xe1\x59\x9f\x86\x7e\xa6\xe2\x61\x12\xae\x9a\x1e\xe3\x5e\x01\x47\x39\xc4\x82\x53\x57\x21\x25\x45\x69\x32\x3e\x25\x7f\x51\x66\xdd\x7c\xf3\xd3\x35\xee\xa7\x19\xbf\x7f\x28\x54\x95\xf7\x4c\x7c\xe6\x89\x8c\x47\xf6\x67\xd6\xb7\x4a\xa2\x00\x0a\xe5\x4d\xf1\x7b\x94\x20\xae\xb7\xb4\x4a\xde\xa4\x97\xaa\xcc\xc0\xfd\x01\x8e\xb2\x3c\x96\xec\x7b\x49\xc3\x31\x9c\x10\xf4\xd2\x2d\x9a\x26\xdf\x5f\xa4\x49\x16\xc5\xcf\x93\xc4\x0f\xca\x51\x02\xa3\x9c\xce\x02\x9f\x7d\x66\xe2\xc9\xec\xb6\xf8\x34\x61\xad\xe8\x86\xf5\x5b\x29\x73\xc4\x5b\xaf\xd7\xd1\xc7\xd0\xdf\x3d\x04\x66\xcf\xfb\xbb\x87\xa2\x9d\xde\x43\xa0\xe1\xa4\xdf\xfd\xa0\xbc\x84\x39\x1a\x2f\x69\xf7\x34\xbb\x53\xda\x01\xae\x77\x01\x58\x46\xdc\x7c\x7f\x95\xc2\x9c\x85\xdd\x0c\x7a\x49\x96\x5d\x2c\xe6\xbe\x17\xc5\xd1\x9c\x26\xe8\x67\x0b\xbd\xa3\x48\x13\x63\x8b\x00\x18\x00\x4c\xad\x1e\x4f\x60\x32\xf6\x83\x1e\x9e\xc2\xd4\xd7\xac\x73\xab\x3d\x9d\x28\x20\x63\x88\x47\xd3\x13\xb1\x9d\x9e\xa7\xf1\x71\x96\xa0\x11\xd5\xa3\xf7\xe6\x30\x1f\x67\xf9\xcc\x0f\x7a\x23\x6a\xa5\xdc\x66\xc6\x0e\x5c\x33\x56\x06\x95\x38\x61\xe6\x10\xc4\x99\xdc\x64\x45\xc8\x6d\x4d\xed\xf0\x16\xe1\xd8\x2f\xcc\x38\x2e\x74\x57\xdf\x59\x5c\xab\x91\x8d\x40\x24\xfa\xbe\x2b\x04\x71\x05\x01\x9f\x9f\xbb\xc8\x69\xe1\x9a\x1c\x71\xec\xee\x40\x86\x61\x42\x77\x9d\x4d\x0f\x0c\x92\xd6\x84\xec\x6a\x68\x01\x28\x74\xb2\xd6\xea\x80\x76\xfc\x36\xc7\xab\x03\xb1\xd0\x15\x3a\x15\x3d\x5d\x49\xa4\xe1\x6c\x9e\x25\xd9\x64\xa5\xba\xbf\x36\x80\x7a\x8b\x44\x1b\x2e\x5f\x62\xcb\xff\x77\x91\x22\x5c\xd4\xbb\xf0\x32\x42\xc3\xa1\xad\x71\xb9\xf0\x2a\x7a\xee\xed\x43\xa2\xe7\x4e\x1e\xe9\xaa\x7f\x77\xba\x8a\x49\x0d\x3e\x86\xc2\x39\xe9\x89\x8f\x6f\x6f\x0f\x02\x70\x4a\xdd\x9c\xde\xa4\x38\xe9\xbd\x5b\x90\xc3\xf3\x2a\xcb\x67\x11\xf6\xaf\x50\x1a\x67\x57\xbd\x34\xba\x44\x93\x08\x67\x79\x2f\xc9\x46\x51\x02\x6f\x6f\x3d\x72\x79\xdc\xcc\xa2\x6b\x34\x5b\xcc\x5e\xe5\xec\x0e\x79\x81\x26\x08\x17\xfd\x1f\xca\x80\x12\x70\x47\xa1\x1f\x99\x31\x7c\x8c\x68\xe6\xc5\x34\xbb\x3a\xcd\xe6\xd9\xef\xe8\xf3\x71\x96\x24\x28\x9d\xbc\xcb\x30\x39\xaf\x5c\xcb\xe2\x10\xe7\x50\x91\x35\x0f\x8a\x1d\xeb\x1e\xb6\x8b\x9a\x06\x7a\x50\x4f\xd6\x0c\x15\x27\xdc\x1c\x9f\xa9\x66\x56\x23\xca\x61\x41\x4d\xe4\xc8\xbd\x1a\xaf\x59\x7f\x5e\xa9\x8f\x33\x1c\x25\x6f\xe1\x2c\xa3\x86\x7d\xb3\x15\xe5\x43\x77\xf9\xd1\xf1\x6f\x2a\xdc\xba\xbb\x70\x5a\x29\x14\x6e\x08\x7a\xfc\x3f\xde\x65\x3e\x4d\x30\xfe\xa0\xf5\x7d\xb2\x35\x84\x65\xe3\xe8\x00\xfb\xf5\x01\x52\xf9\x49\x2c\xc7\x7c\x59\x3f\x2c\xab\x09\x1b\xe9\x55\xa5\x3e\x93\x4f\xa9\x4e\xaa\x68\xa4\xef\xa2\x19\x79\x0f\x1a\x06\x72\x73\x9e\x0d\x81\x51\xbf\x14\x6e\xd9\x0e\x1c\xef\xb2\x18\x8a\x08\xe7\xe6\x54\xa1\x21\xd9\xd1\x55\xf8\x29\x6b\x71\xbd\x85\x77\xf4\xdb\xc6\x88\xe5\x6f\x55\x88\xea\x2b\xf3\x5c\x49\x5f\x68\x51\x45\xf8\x80\xbc\x63\x9a\xa0\x0b\x2d\x6c\xb5\xe6\x85\xa4\xe4\xfd\xcd\x01\x74\xd9\x19\xe0\xee\x72\xfa\xe9\xd4\x03\xe7\x32\x41\xa6\x63\xfa\x9d\xfe\xa8\xd5\x20\xd4\x04\xb6\x71\x84\x79\xd4\x68\xb9\xad\x14\x9c\xc3\x83\x1f\xfe\xfa\x7d\x5d\xff\xe4\x21\xed\xcd\xf8\xbe\x13\x0f\xc6\x47\x70\x10\x7c\x4f\xda\x2a\xc8\x47\xc7\xbf\xb9\x7d\x6b\xdd\x10\x47\xf3\x85\xc3\x0f\x94\x5f\xb5\x01\x38\xa8\xf4\x99\x5d\xb6\x18\xc6\x0a\xcb\x29\x79\x61\xc9\x0d\x4c\xc3\x01\x30\x58\x3f\x2f\x31\x2c\x18\x2b\xd4\xd3\x5a\x07\x83\x83\xb3\x0a\xc8\xdf\x08\x39\x23\xc1\xb5\x01\x72\x78\x66\x0c\xb8\x65\x9f\x5e\xc3\x1c\x7f\xd6\xc1\x1d\x1d\xff\xc6\x62\x72\x7b\x6f\x5f\x7f\xf6\xac\xbe\x1d\x1d\xff\x56\xdb\xb1\x95\x90\xf4\x0e\x9a\x97\x86\x6b\xcd\x9d\x47\x9c\x2f\x55\xf5\xb2\x6a\xb3\x0b\xb4\x5b\xc7\xda\x0d\x6b\xe2\x32\xf6\xc7\x47\xb1\x1f\x72\x63\x48\xc7\x30\x27\xc7\xc7\x42\xe4\x18\xfb\xde\x9e\xbd\x94\xcf\xea\xaa\xee\xdb\x35\xfb\x07\x06\xe6\xa3\xe3\xdf\x5a\xa0\x3d\x3a\xfe\x4d\xc7\x79\x74\xfc\x9b\x03\xe1\xd1\xf1\x6f\xfb\x46\x1d\x8e\xaa\x7a\x2d\xfa\x81\xed\x01\xa7\x0a\xb9\x93\xe3\xe0\x6c\xc7\xd0\x76\x34\x5f\xef\xc2\x05\xb9\x52\x6b\x08\x93\x2c\x9d\x14\x3c\xd0\x95\x17\xf4\x50\x2c\x7d\xae\x1b\xd6\x51\x0b\x7e\x8f\x4c\x4c\x61\x18\xc2\xbd\x3d\xe4\x06\x1c\x86\xa1\x88\xa9\x4d\xae\x89\xdf\x30\x4a\xd0\xe7\x08\x3b\x52\x77\xa8\x97\x04\x0c\x30\x40\x67\x61\xf5\xb4\xd2\x6d\x0d\xf9\x26\xa5\xdb\x32\x00\x69\x08\x5d\x31\xcb\x5d\x1b\x19\xe4\xee\xba\x95\x8d\x28\x83\x75\x3b\xee\xa6\x3e\xee\xe1\xec\x15\xba\x86\xb1\xff\x43\x00\xec\xab\xa6\x8f\xf4\x4f\xfd\x6a\x87\x81\x63\x43\xb2\x6a\x29\x2b\x77\xee\xff\x7e\xba\x2f\xa0\x00\xb9\x95\x20\x39\x41\xc0\xde\x6f\xfd\x1c\x54\x37\x72\x3f\xdf\xa7\xb5\x4b\xba\x10\x8b\x14\xfd\xb1\x80\xcf\xad\x8d\x41\x5f\x3f\xfb\x44\x57\x9f\x6f\x3d\x26\x3c\x8a\xbd\xa0\x47\xa0\xf9\x41\x19\x15\xcb\x74\xd4\x29\x20\x36\x23\xf9\xc3\xbd\x3d\x3f\xba\x8a\x10\xee\xc0\x5e\x0e\x93\x2c\x8a\xfd\x00\x88\x0f\x34\x91\x00\xff\xa8\x44\x3b\x55\xc2\x85\x05\xf8\x87\x98\x74\xd1\xa5\x82\xa3\xe4\x07\xa9\xc3\xc2\xf8\x71\x6a\xfa\x45\x84\x23\x19\x12\x91\x6d\x35\x1c\x42\x2a\x07\xa3\xe9\x68\xa8\x2b\x96\x7c\xfc\xbb\xdc\xf0\x69\x07\xef\xed\xf9\x86\x6b\x28\x9d\x98\x10\x13\xd6\x0c\xc3\x6b\x1c\xd0\x30\xec\x27\x8d\x61\xd8\xef\xce\xe1\xf2\xa4\x12\x25\xd9\xa6\x66\xb6\x97\xcc\x5c\xd8\x58\x2c\x82\x68\x90\xdc\xbd\xa7\x5c\x87\xe2\x2e\x03\x60\xa1\xd6\xdd\xbe\xa9\x65\xcb\x5a\x21\x84\x0d\xa7\x71\x33\x7e\xb0\x3d\x91\x8e\x3b\x8e\x59\xba\xac\x19\x21\xd9\x01\xa6\x19\xb3\x41\xfb\x0f\x46\x6b\x47\x9e\xd6\xf9\xa2\x95\x78\x28\xb7\x30\x58\x37\xd6\xbd\xc6\x3f\xb5\x1c\x89\xbc\x1e\x37\x88\x78\xef\x04\xd3\x1a\x33\xbd\x76\x37\x88\x7b\x5f\x01\xd1\x6e\x36\xf5\x81\x0e\x37\x9c\xd6\xb5\x46\x29\x68\x45\x16\x08\x7f\x23\x7c\xad\xc7\x67\xf1\xa0\xd4\x27\x7d\x7d\x8c\x15\x4e\xb6\x35\x5e\xb6\x5b\x27\xdb\x20\x5d\xbd\x6b\x9d\x0f\x2c\xf3\x97\x5d\x0b\xad\x1b\x4e\x3b\xdc\xea\x65\x66\x0e\xb4\x1b\x21\xd6\x80\xac\xb8\xeb\x2a\xaf\x38\x73\xa9\x5d\xef\xa6\xab\x02\x69\xc6\x6a\x91\x7b\x1b\x44\xd9\xb7\x21\x34\xe3\x6b\xa0\x6a\x36\x08\x46\xdf\x04\x6d\xc5\x6c\xeb\x24\xd0\x5a\xa6\x39\x0d\x60\x56\xa2\x64\x24\xd0\x16\xc8\xb8\x08\xa7\x09\x8d\x9b\xba\xda\x1c\x6b\x0d\xbc\xa6\xc0\xff\x47\x4e\x3d\x0a\x79\xf6\xbb\x5c\x19\xea\xd2\x9f\x74\x49\x85\xfd\x18\x0e\x17\x95\x1c\xe2\x1b\x58\x8b\xd6\x36\x10\x11\x82\x0d\x35\xc6\xee\x01\x98\x40\xec\x20\x80\xa4\xa8\xab\x2c\xdd\x4e\xa1\x53\x98\xcc\x61\x5e\xec\x77\x61\x02\x67\xec\xaa\xd0\x46\xc6\x06\xc6\x8b\xba\xac\x6e\xb5\xc9\xc3\x1b\x6d\x94\x24\x5d\x34\xaa\x4f\xd8\x30\x9b\x67\x29\x4c\x31\xaf\xaf\x2b\xb0\x8a\xcb\x89\x43\x73\xa5\x19\x96\x69\xdd\xd1\xd5\x38\x2a\x10\xfe\x26\x9a\x85\x28\x49\xde\x90\xee\x86\x69\x55\xcd\x40\xfd\x9b\x98\x47\x04\xeb\x6e\xe0\xa7\xfa\x6e\xce\x9b\x67\x22\x8d\x5d\x4b\x8e\xf3\x05\x9e\x76\x45\x25\xbd\xf2\x57\xb9\xd8\xf5\x30\xe9\xf8\x5a\xc2\x8b\xd2\x78\xe5\xc6\x99\xcf\xa1\x7b\xc6\xe8\xa6\x29\x08\x8a\xea\xb4\xb1\x46\x0f\x6d\xe6\xf8\x50\xdb\x4e\x1e\xad\xbe\x72\xfe\x8a\x02\x4d\x52\xd7\xfc\xb1\x12\xfb\x8e\xe1\xf5\x1f\xda\xd4\xf1\x51\xb6\x9d\x3a\x5a\x7d\xd5\xd4\x0d\x91\xbd\xf1\xea\xaf\x2b\x5e\xe2\x7c\x8c\xac\xdb\x0a\x06\x37\x09\xc4\x4c\x18\x06\xa5\x84\xae\x47\xb0\xf9\x68\xa3\xcb\x8a\x34\xbd\xfb\x8b\x6a\x14\x25\xc9\x9a\xe7\x8e\x36\x79\x60\x5b\x87\x0d\xb3\x25\x40\x52\x79\xd5\xb6\x19\x45\x33\x98\x54\x82\xc2\xf3\xb9\x4b\x50\xb7\xc0\x39\x4a\x27\x8e\xb9\xe3\xcd\x1e\xdc\xfc\x89\xe1\xb6\x9e\x43\xd6\x60\xf5\x3c\x3a\xaf\xad\x51\x94\x1a\x55\xbe\xca\xe9\x5a\x35\xb0\x11\x4c\xba\xb5\xc7\x4b\x46\xf7\x77\xb5\x78\x90\xc3\x4d\x33\x27\x99\x6b\x2d\x25\xa9\xf5\x10\x87\x37\x47\x38\xda\xe8\xc0\xcb\x86\x5f\xe5\xa8\x9b\x8e\xbc\x1a\x72\xeb\x43\x2f\x9a\xac\x9c\xcf\xe9\x22\xbd\x58\xf7\xdd\xa1\x6d\x1e\xda\x2c\xb2\x81\xb6\x9d\x40\x52\x7b\xe5\xdc\x25\x84\xb2\x19\x2f\xd7\xdd\x89\xa2\xd9\x43\x9b\x41\x39\xdc\xb6\x93\xc8\x1b\xac\x9c\x47\x66\xd0\xb1\xee\x2e\xe4\xad\xbe\xca\x59\x5c\x39\xde\x05\x76\x5f\x60\xcd\xe3\x25\xad\xbe\xca\xf1\x36\xec\x1a\x31\xd8\xb6\x9b\x86\xd5\x5f\x39\x87\x45\xd1\x1d\xf1\xd4\x68\xeb\xb0\x0c\xec\x4c\xb6\xe4\x19\x14\xc7\x40\x4d\xb2\xe2\xa8\x98\xc2\x9c\xc5\xee\x95\x61\x9b\xf6\xff\x9f\xfd\xfd\x09\xf0\xba\x5e\xb0\x11\x33\x31\x2a\x0a\x9a\x9f\xed\xee\x19\x0a\xd9\xdb\x35\xaf\x27\xd5\xee\x81\xed\x34\x6d\xc0\x6d\xa1\x8a\x16\xab\x76\x5b\x0c\x47\x6b\x9e\x56\xd2\xe2\xa1\xcd\x1f\x19\x64\x6b\x78\xa3\x95\x73\x86\xe2\x2e\x4a\x0b\x98\x3b\x2f\xf6\x1c\xa6\x31\xcc\xab\xd3\xa6\x1a\x7d\x95\xb3\xb7\x72\xc4\x8b\x79\x1c\xb9\xaf\xf6\x86\x11\xf3\x46\x0f\x70\xc4\x79\x36\x5f\xf7\x60\x90\x26\x5f\xeb\x48\xab\x31\xd4\x44\xb7\xd7\x57\x1f\x3c\x5c\xed\x01\x1b\xd6\x3c\xbb\x82\x79\x97\x85\x11\xee\xa2\xa2\x3b\xe1\x69\xb0\x2b\xe3\xd7\x2b\xb6\x82\xf1\x55\xce\x48\x3d\x4c\x3a\x94\x63\x32\x92\x13\x3a\x90\x37\x05\xcf\x08\xde\x12\x47\x4d\xfb\xcd\x56\x81\xfd\x05\x9d\x22\xfa\x35\x16\x42\x82\x79\xf0\x6b\x71\x22\x27\x64\xe3\xe5\x10\x20\x56\xae\x48\x5a\x2c\x72\xd8\x2d\xa2\x31\xec\x4a\x0a\xb3\x4a\x7f\xe6\x19\x8a\x61\x4e\x5d\xc1\xbe\xa6\xe9\x7d\x49\x7b\x7f\x12\x8d\xe1\x91\xe8\xfb\x6b\x3a\xb0\xd5\xc3\xc6\x39\xf3\x2b\x5c\xe7\x9e\x17\xad\xbe\xa2\x19\x68\xb5\xc1\xc4\x60\xdb\xee\x26\x56\x7f\xe5\x1c\xfe\xd1\x1d\xba\xbd\x12\x6d\x0f\xc4\x0a\xeb\xd2\x8a\x55\xa1\x8e\x76\x8a\x5d\xd9\xdd\xf5\xd1\xde\x5e\xba\xb7\x47\x5d\xdc\x08\x03\x31\x81\x34\x33\x10\x0a\xc2\x30\x54\x1f\x72\xb0\x99\x0a\x04\xfe\xf1\xf3\xb2\x91\x63\x41\x9b\x70\x2c\xf0\x8f\xf6\xaa\x5a\xf8\xc7\x22\xfa\xaa\x8e\x57\xab\xcd\x45\x3b\xdd\x7a\x6b\x91\xda\xab\x36\x16\xb3\x32\xad\x6c\xae\x95\xc7\x53\xb5\xfb\x2a\xe7\xb0\xc5\x98\x37\x1a\xf0\x83\x1c\x6d\x1a\x6f\xb2\xbe\xac\xd5\x03\x1c\x6f\x12\x61\x0c\xdd\xca\xa8\x86\xf1\xf2\x56\x5f\xe5\x78\xeb\x61\xca\xc1\xb6\x84\xc9\xeb\xaf\x9c\x43\x6a\x1c\xdb\x1d\x2e\xb1\xfd\x6e\xb7\x30\x01\x6a\xf4\x61\xbf\x8b\xc0\x80\x34\xb6\x5e\x28\x27\x88\x3f\x15\x76\xbc\x6e\xf2\xac\xa5\x67\x21\x04\x37\x34\xbf\x58\x3f\x2f\x43\xac\x4b\xe3\xd8\x18\xb9\x53\x4b\x0a\x72\xca\xbf\xad\x8a\xe8\x64\x4d\x50\x95\x57\x9f\x65\x8c\xcd\xdb\xf2\x39\x36\x24\x87\x72\xa4\x81\x8f\x02\xe1\xf7\xe6\xbd\x7d\xfb\xf6\x6d\xe7\x05\xe8\xfc\xeb\x5f\xff\xfa\x97\xb7\xd1\x2b\xcc\x20\x9d\x36\xc8\x0e\x91\x3d\xc7\x6b\xbc\xc6\x62\x8a\x16\xb9\x30\xc2\xdc\x64\x1b\xd9\x50\xbe\x8a\x0d\x45\xf7\x76\x3f\x07\x49\x96\x4e\x5e\x65\xf9\xac\x9f\x58\x7b\x4b\xcb\xa5\x98\x83\x64\x93\x9d\x35\x85\x39\xfe\xfc\xef\x7d\xf4\xb8\x93\x65\x0a\xf2\xdb\x5b\xe6\x56\xb9\xc1\x3c\x9d\x67\xc3\x2e\x6a\x69\xf7\xd3\x18\xed\x4e\x13\xd9\xa3\xb1\x8f\xb9\xbb\x5f\xe7\x97\x93\xf7\xef\x7a\xf3\x28\x2f\xa0\x8f\x83\xde\x79\x86\x52\xdf\xfb\x1f\xdb\x1c\xb7\x5f\xb2\xe1\x9b\x38\x44\xad\xa7\x16\xad\x3d\x25\xb3\x2c\xc5\xd3\x2e\x2e\xee\xeb\x62\x02\x69\x28\x1d\xc0\x79\x46\xc7\xa7\x87\x5a\xc8\x0a\x59\x38\x38\x3c\x7b\xa6\xff\xe8\xdf\x94\xdc\x79\x32\x0f\xd3\x5e\x31\xcd\x72\xfc\xcc\xa3\xb7\x98\xd7\x67\xff\xbe\xe8\xbc\x7e\xdd\x9f\xcd\xfa\x45\xd1\xf9\x5f\xff\xcb\x5b\x71\x03\xe6\x5b\xac\xc2\x5b\x32\x47\xf7\x7c\xf3\xcd\x99\x5f\x00\x0d\x24\x7d\x37\xdb\xb3\x83\xb7\x9e\x79\x14\xa6\x3e\x1c\x1c\x9c\x05\x20\x0f\x99\xb2\x8c\x89\x19\x59\x92\x19\x90\x85\x98\xb9\xc9\x0a\x4b\xb7\x8c\x06\xfc\xd8\x0d\xb3\x67\xa9\x9f\x05\x7d\xf6\x23\x7f\x86\x9e\xa4\x7e\x1e\xf4\x11\x48\xc2\xec\x19\xda\xcf\xfa\x07\xe0\xe0\xa7\x64\x6f\x2f\xf9\xa9\x77\x70\xf8\xcc\xfb\xa9\x73\xf8\x5f\xbd\xfe\xdb\x08\x4f\x7b\x79\xb6\x48\x63\xff\xf0\xe0\xe0\xfb\x24\x78\xe2\xfd\x57\xaf\x34\x37\x15\x47\x83\x8a\x77\xd1\x3b\x1f\x06\xcf\x0e\xfa\x4f\x36\x8a\x06\xc9\xe6\xfc\x58\x4e\x79\xdd\x09\xb3\xf4\x61\x68\xed\x55\x95\xce\x66\xdf\x02\x75\x24\x63\x1b\x6c\x47\x26\xa9\x39\xfb\x06\x9e\x35\x39\x67\x77\xf2\xbe\x3d\xcc\x6b\x1c\x74\xfe\xe3\x5f\xff\xfa\x52\x77\xf9\x3d\x5f\xe3\x97\x59\xb2\x98\xc1\x2e\x0d\x41\xbc\xfd\x3d\xce\xf7\xd1\x0d\x8b\xbf\xd0\x47\xa1\xe7\x01\x54\x1c\xc3\x9c\xfa\x19\xf5\x53\xc0\xd0\xbd\xbc\xc6\x30\x2d\x50\x96\xea\x9b\xec\xd3\x77\x37\xa8\xfc\xee\x26\x7d\x96\xf7\x3d\xaf\xfc\xb4\xf9\x8c\xfd\x4e\x71\xd0\xb0\x01\xb5\x84\x48\xfd\x35\xb9\x62\xdf\xe6\xd9\xac\xbb\x99\xc8\xd7\x68\xfa\xd0\x18\xf1\x3c\x9b\xbd\x5c\x53\xf6\xab\xb5\x59\xc5\x90\x53\xc5\xd7\xfa\x52\x1c\xd9\xec\xab\x9c\xcd\xe6\x11\x3b\x75\xa5\x6e\x61\xee\xe4\x2b\xd5\x92\xd6\xc3\x9c\xb4\x07\x37\x69\x31\x55\x4e\x83\x81\xba\xb9\xfa\x4a\x0d\x05\x9a\x26\xab\xbd\x49\xce\x64\xb5\xe9\xd7\x34\x2a\xba\x29\xbc\x5e\xd7\x5e\x50\x36\x7b\x60\xb3\x37\x8d\x8a\x77\x74\xb4\x2d\x61\xf2\xfa\x6d\x66\x71\x9e\xc3\x4b\x94\x2d\xd6\xbd\xe7\x8d\xa6\x0f\x6f\x36\x8f\xe5\xa8\xdb\xcf\xa8\x68\xb3\x72\x56\xf1\x2c\xa1\x0a\xe2\x35\x8d\xee\x54\xbb\x87\x36\x9f\x78\x96\x9c\xd0\xf1\xb6\x9d\x4c\xde\x60\xe5\x4c\x2e\x66\x51\xba\xbe\xf5\xa2\x6c\xf6\xd0\xe6\x51\x0e\xb7\xed\x3c\xf2\x06\xab\x0c\x97\x50\xba\xae\xe9\x22\x69\xf1\xc0\x66\x8f\x0e\xb2\x25\x3c\x94\xae\x34\x5d\xe4\xf9\x9d\xd7\xbd\x17\x65\xb3\x87\x37\x7b\x7c\xb8\xed\xa7\x90\x36\x58\x3d\x8f\x09\x4a\x61\xb7\xb8\x9c\xb4\x15\x19\xb0\x39\x56\xed\x9c\xa0\x2c\x6f\x75\xde\xca\x1d\x6f\x99\xc9\xdd\x92\xed\xb3\x38\x83\x44\xc9\x17\xf6\xf6\x04\x6b\xf5\xcc\x60\xb3\x1c\xf2\x86\xdc\xb2\x21\x67\xe3\x38\xb9\x9c\x04\x2a\x53\x1f\xc8\x01\x26\x13\xd9\xcf\x25\xb7\xfb\x9a\x46\x75\x18\x46\x79\xd1\x9b\x45\x17\xf0\xe7\x6c\x91\xc6\xaf\x9d\x42\x8d\x55\xb0\x21\xa0\x0f\xd8\xf4\xf6\xf6\x86\xdd\x14\x34\x63\x48\x98\xac\xcc\x4e\xa3\x66\x1e\xc3\xbc\x80\x6b\xfb\x67\xa8\x76\x5f\xe5\x71\x58\x31\xe6\xcb\xec\x62\x5d\x07\x0d\xde\xe8\xab\x1c\x6d\xd3\xe1\x67\x43\x6d\x7d\xf4\x49\xf5\x95\xf3\x57\x74\xa3\x71\x8d\x8d\x06\x93\x80\x55\xab\x7e\x95\xf3\xb6\x72\x94\x79\x1e\x39\x99\x7a\x37\xf3\x26\x5b\x7c\x95\x83\x6d\xd8\x24\xc5\x73\x36\xd0\xb6\xbb\x84\xd5\x6f\x31\x81\x43\x38\x66\xc9\x1d\x5a\xec\x13\x5e\xf7\xab\x9c\xbb\xd5\xe3\xc4\x57\xd0\x6d\xd5\xe2\x1a\x28\xab\xfc\x20\x47\x3a\x4a\xd0\x7c\x98\x45\x79\xdc\x2d\x16\xf3\x39\xcb\x5b\x5b\x43\xc3\xcb\xaa\xab\xda\x7f\x95\x13\xd1\x74\x5c\x8e\xc4\x20\x4e\xd4\x1c\xb4\x3e\x3b\xd5\xc6\x2d\xa6\x1d\xce\xe6\x78\xbd\x9b\x88\xb5\xf8\x2a\xa7\x76\xe5\x60\x99\x21\xe5\x3a\x83\x7d\x88\xf6\xa2\xa8\x78\xb9\x96\xc5\x28\xaf\xdf\x62\x02\x85\xd5\xf1\x5d\x9a\x5d\x70\xd3\x63\x16\xd8\x9d\xbf\x00\x3e\x0e\xf6\xf6\x98\xd2\x39\xc4\x7b\x7b\x1e\xc7\x1b\xfe\xff\xec\xbd\x6b\x5b\xdb\x48\xd3\x30\xf8\x9d\x5f\x41\xb4\x59\x2e\xe9\xbd\x1b\x27\xf3\xbc\xcf\xbb\x1f\xfc\xac\x26\x37\x01\x92\x21\x13\x0e\x13\x48\x32\x33\xde\x5c\x8c\x2c\xb5\x6d\x81\x2c\x29\x52\x0b\x30\xe0\xff\xbe\x57\x1f\xd4\x67\xf9\x80\xcc\xdc\x30\xf1\x7c\x98\xe0\x3e\x54\x75\xb7\xba\xab\xaa\xab\xaa\xab\x7c\x34\xc9\x61\x36\xd8\x44\x0f\x31\x82\xc4\x25\xed\xf4\x38\x5e\x18\x71\xb9\x5d\x06\x63\xb8\x9d\x15\xcb\xc8\x30\x6a\x97\x27\xb9\xcf\x16\x9d\xf5\x32\x2c\x59\xeb\xf3\x6c\xe7\xbd\xf8\x6c\x9f\xe1\x1c\x2f\xb2\x78\x59\x77\x5a\xd2\xe5\xf9\xcd\xf4\x12\x4e\x96\x55\xda\x90\x2e\x4f\x72\xa6\xcd\x30\xe9\x34\x17\x04\x88\x1b\xcf\x5b\xb7\x24\xb8\x9d\x60\xc1\x2b\xbc\x5c\x1d\x4b\x20\x01\xb7\xfe\xa7\xe7\x04\x0e\x70\xfa\x15\x42\x59\xea\x7c\xe3\x9a\x23\x37\xee\xa0\xa0\x18\x42\xd4\x41\xc1\xf0\x28\x18\xc3\x0e\xca\x3e\x66\xd7\xb0\xd8\x0d\x4a\xe8\x7a\xde\xfd\x3d\x7a\x60\x74\x2e\x3c\x95\x5d\x3c\x93\xc7\xe1\x0e\x49\x16\xda\x53\xbf\x12\x75\xb4\xd2\xec\x99\x6d\x2a\x32\xb3\x05\xe1\x25\xd9\x5c\x1d\x6a\x82\xbf\x66\x18\x94\xcb\x2a\xf0\x45\xbf\x67\xb7\x7e\x7c\xc2\x0b\xaf\x22\xeb\x31\x77\x2d\x97\xb0\xa5\x27\x4f\x54\xdf\x36\x63\xe1\x16\x07\x37\x9f\x03\x24\xcb\xd8\xd2\x93\xe7\x67\x4b\x4f\x96\xb0\xa5\x27\xf3\x6d\xe9\xe3\xe0\x01\x5e\x29\xac\xd3\x93\x5c\xb9\x79\xb3\x5d\x7e\xaa\xcf\x71\x9e\x30\x8a\x03\x7b\x0c\x8a\x32\xcf\xd2\x32\xbe\x82\x5a\xdb\x27\x39\xc7\x66\x98\x6c\x82\x0b\x42\x24\xad\xe7\xae\x19\x91\xf6\xb7\x83\xc8\xaa\xad\xd2\xee\x02\x52\xe3\x27\xb9\x72\x8b\xcc\x34\x0c\x12\x98\x46\xc1\x22\xf7\x5b\xbd\xc7\xb3\x9d\x73\x14\x0f\x06\x8b\xcf\x97\xb4\x7e\xbe\x73\xb5\x3e\xdc\x9a\x39\xdf\x86\x47\x5a\x4f\x66\xce\xcd\x5e\x0e\x6c\x06\xd4\x3d\x76\xf1\x19\xb3\xf6\x4f\x75\xbe\x73\xbf\x31\xf1\xb8\x4d\xb3\xeb\x25\x66\x5c\xf7\x78\xd6\x73\x5e\x6e\xbe\xcf\x77\xae\x65\xd5\x47\x45\x43\x68\x44\xfb\x7c\x79\x8f\x67\x3b\x67\x94\x59\x9e\xe5\xce\x9a\x72\xdd\xe1\x39\xcf\x78\xa9\x33\xcc\xda\x3f\xe3\xf9\x2e\x33\xd7\xe7\x3b\xcf\x2a\x8d\x6f\x16\x98\x29\x69\xf6\x5c\x27\xb9\xf0\x97\x7c\x86\x33\x7c\x80\x93\xf9\x73\x74\x30\x4f\x97\xf1\x2e\x4f\x17\x70\x2d\x4f\xb3\xa5\xa3\x02\x92\x2e\xcf\x6d\xdd\xc8\x34\x17\x5d\xb7\x2c\x9b\x1b\xf1\x2d\xcd\xd0\xf6\x32\x31\x90\x68\xfb\x67\x68\xd7\x4e\x33\x44\x0c\xd5\xbf\x30\xb7\xcf\x85\xd7\x50\xee\xb6\xc0\x6a\x2e\xb5\x94\xcf\x70\x11\x97\x59\xb9\xf9\xcb\xb5\x88\x04\xf2\x3c\xe5\x0e\xea\x75\xb0\x6d\xbf\x19\xce\xa0\x4a\xa2\xdf\x93\x9c\x73\x33\x4c\x3a\xf0\x9d\xc5\x81\xd6\x1d\xe6\xae\x64\x8e\x7b\xda\x7d\x6f\x66\x2d\x64\xdd\xed\xb9\xad\x23\x9f\xee\xa2\xeb\xc8\x3a\xcc\x5d\x47\xab\xda\xcd\x4e\x9b\xb2\x27\xaa\x70\x9b\xb1\x6c\x8b\xd3\xf4\x6c\x2e\x1d\xcf\x83\x21\xdc\x46\x31\x4a\xac\x57\x42\x51\x6b\xeb\xd0\x7e\xdd\xac\x26\xe4\x58\x98\x90\x25\xc3\x71\x3c\x7b\x1a\xb0\x18\x64\x85\x55\x73\x61\xcb\x41\x53\x37\x7f\x92\x5f\x7e\xf6\x44\x0d\x2f\x82\xb9\xe4\x81\x74\x79\x92\x33\x6d\x86\x49\xa7\xb9\x20\x40\xdc\x78\xfe\xba\xe5\x70\x9b\xa6\x00\x5d\x7a\xf9\x44\xcf\x27\xb9\x8a\x73\xe7\xfd\x80\x09\x3f\xcd\x99\xce\xda\x2f\xf9\xe2\x96\x5b\xdc\x78\xee\xba\x25\x55\x11\x98\x89\x90\xe6\xbf\xad\x1a\x24\x30\x44\x26\x53\x69\xca\x9b\x97\x4a\x79\xf3\x7e\xf2\x7d\x3f\x7d\x83\xba\xe4\xb9\x11\x1f\x80\xe7\x3e\x2c\xeb\x27\x07\x40\x05\xfa\xe6\x28\x20\x86\xc3\xce\x12\x51\x40\x1e\xf8\xc6\xf9\xb9\xbe\x6f\xce\x97\x7d\xdc\x9c\x2f\xf8\xb2\xf9\x7b\xbe\x1d\xc1\x12\x16\xf1\x52\x7b\x4e\x0b\x01\xf4\x3d\xdf\x16\x20\x1e\x96\x83\x45\x8c\xe1\xa1\xdb\xee\x7b\xbe\x27\x80\xac\x3e\xef\x8a\x32\xc7\xff\xd4\x32\xad\x60\x91\x4e\x1f\x71\x89\x2a\x58\x2d\x4b\xf3\x69\x9f\x67\x76\x1a\xd9\x44\x17\x84\x48\x5a\xcf\x3b\x87\x45\x90\xea\x01\xe9\xe6\xae\x1d\xed\xf3\xcc\xd6\x8e\x4d\x74\x41\x88\xa4\xf5\xdc\xb5\x83\x51\x15\x2e\xbd\x78\xb4\xd3\x93\x5c\xbd\x39\xb3\x25\xda\x8b\xa5\xdd\xbb\x44\xbf\xa7\x3a\xe7\x66\x3f\x80\x02\xe6\x70\x69\x35\x0f\xeb\xf4\x24\x67\x3b\xe3\x7c\xb0\xa9\x2e\x7a\x40\x48\xf3\xf9\x7b\xe6\x0a\x16\x0d\x3e\xbb\xb3\x16\x90\xf6\x7a\x92\x2b\x38\x73\xbe\xe5\xa8\x1a\x0c\xec\x9a\x85\x19\xf3\xad\x7b\x3d\xc9\xf9\x36\xc3\xe4\x93\x5d\x10\x26\x6b\x3f\x77\x0d\xe3\x74\x58\x25\x41\x53\xaa\x39\x7e\xe1\x78\x95\xc4\x7d\x6b\xa7\x27\xa4\xa5\x29\x93\x78\x69\x06\x41\xfb\x3c\xc9\xbd\x30\x7b\xae\x59\xf1\x00\xee\x50\xf7\x7a\x7e\xf3\x45\xc1\xd2\x21\x1d\x48\x97\xe7\x38\xd3\xb2\x41\x05\x67\x2a\x1a\x49\xdb\x67\x38\xc5\x18\x25\x70\xf9\xf0\x50\xbc\xdb\x93\x9c\x71\x33\x4c\x31\xdd\x05\x81\xd6\x1d\xe6\xae\x63\x36\x1c\x26\x0f\xd4\x3b\xaa\x7d\x9f\xe4\x8a\x2e\x30\xf7\x07\x4d\xfa\x69\xce\x76\xc6\xfe\x61\x53\x5d\x74\xf7\x90\xe6\x73\xd7\xaf\x88\xed\xf6\x8c\x19\xe7\x0f\x77\x79\x6e\x6b\x47\xa6\xb9\xe8\xca\x15\xf1\x78\xfe\xba\x55\x69\xd8\xe0\xe2\x38\x73\xed\x58\xb7\x67\xb7\x7e\xf5\x74\x17\x5e\x43\xda\x61\xde\x3a\x56\x69\x04\x8b\x32\x6c\x78\xac\x3e\x63\x25\xa5\x8e\xcf\x6c\x2d\xe5\x29\x2f\x08\x56\x74\x99\xbf\x9e\xcb\xf3\x00\xda\xe7\x49\xae\xe2\xbc\xb9\xfe\x83\x7d\x33\xab\x3c\x7f\xd0\xe3\x5b\xd1\xef\x49\xce\x79\xc6\xb9\x10\x13\x5e\xf4\x58\xd4\x3d\xe6\xae\x25\xb2\x06\xd0\xd4\x37\x0a\x7a\x76\x0f\xbe\xc9\xc4\x16\x5d\x2d\x34\xf7\xc1\x37\x99\xc6\xb2\x66\x36\xd6\xe9\x99\xad\x5c\x3d\xd5\x05\x41\xd2\xe6\xf3\xd6\xcf\xea\x7e\x37\xe3\xac\x3e\x51\x47\xbc\x66\x98\xd7\x0b\x43\xbb\x9e\xbb\x56\x71\x92\x6c\x47\xb0\x44\x45\x66\xd5\x5f\x34\xe4\x5a\x57\xba\x3d\xc9\xd5\x9b\x33\x6b\x34\xca\xaa\x65\xb5\xdb\x75\xaf\x27\x39\xdf\x19\xbb\xa5\x9e\xec\xa2\x7b\x86\xb6\x9f\xb7\x86\x37\xdb\x71\xb8\x78\x32\xbb\x87\x84\xa3\xb5\x84\xa1\x95\x2c\xb6\x05\x5d\xfb\x3a\xff\x0a\xec\xbd\xfe\x06\x12\xbf\x87\x3a\x61\x12\x94\x25\x70\xe8\xe8\xfe\xc2\xff\x6c\xc7\xe5\xf6\xcb\xbb\x62\xfa\xd7\x37\x92\xe7\x29\x08\x91\x5b\x67\x30\xdb\x74\xbc\x05\x82\xca\xde\x11\x98\xdd\x64\xfa\x20\x0b\xf0\xcd\x41\x98\xa5\x7e\x61\xd7\xad\x26\xaa\xed\xb7\x90\x6d\xbf\xc9\xec\x0f\xb0\x8c\xeb\xe3\xcd\xf3\xf3\x7d\xbc\x59\xc2\xf9\xf1\xa6\xd9\xfb\x31\x4e\x63\x44\xcd\xef\x45\xf9\x2a\xc8\xf3\x6d\x98\x5e\xc9\xeb\xa6\xac\x8a\xb4\xbf\x90\x5b\x6f\x2e\xa8\x64\x00\xba\xbf\x17\xbf\x5e\x7f\xdb\x80\x9d\x38\xc5\x13\x70\x9d\x30\x4b\x51\x91\x25\x09\xd9\xef\x61\x96\x0e\x62\xbc\xa5\x4b\x58\x5c\xc5\x21\xec\xb2\x02\x12\x75\x8d\x77\xe0\x99\xcf\x9b\xdb\x3f\x28\xac\x1b\x9f\xb2\x8f\x9a\x34\xfa\x77\x69\x30\x86\x5d\x07\x2f\x48\x8d\x5b\x74\xeb\xa2\xe9\x5c\x45\xbf\xb1\xae\x28\xbb\x54\xc3\x72\x3e\xce\xca\x32\x34\x7c\xa1\xe8\xef\xa6\x75\x6d\x68\xfd\x37\xac\x2a\xc3\xdc\x62\x51\xf1\xb4\x83\x38\x85\xc5\x76\x04\xfb\xd5\x70\x3b\x88\x82\xbc\x21\x8c\x5e\x01\xcb\x2c\xb9\x82\xc5\xab\xfa\x8f\xf2\x15\x21\x59\x71\xd8\x08\xe5\xd1\x6c\x45\x6c\x0d\x1a\x47\x2f\xe6\xe8\x7a\x77\x6e\xf3\x06\xf0\x3a\x05\x1c\xc6\x25\x82\x85\xdb\x04\xac\x3b\x0e\xe2\xd4\x91\x12\x69\x4d\x97\x5c\x62\x21\x1b\x8e\xe3\x42\xcb\x4f\xa8\x6d\xdf\xd5\x2c\x0f\xaa\x97\xc7\xc4\xac\xac\x8b\x32\x11\xb4\xe8\x44\xa2\x00\x05\xf4\x7f\xd6\xbd\xf2\x6f\xd1\xea\x15\x59\xc7\x57\x25\x44\xd5\x13\x7d\x2e\xb6\xcc\x9c\x6d\x47\x82\x96\x4b\x3f\xe8\x64\xb7\xf9\x56\x7a\xcc\x04\x7a\xca\x47\xa6\x23\x91\x08\x01\xcf\xc5\x36\xd5\xa2\xa5\x99\xee\x18\x96\x09\x8b\xd0\x33\xdb\xfd\x02\x06\x97\x79\x16\xa7\x7a\x72\x3c\x23\x48\x8d\x02\x47\x94\x3f\x05\x8b\xb1\x3a\x45\x32\x85\xed\x20\xcf\x93\x38\x24\x31\x34\xb6\x87\x49\xd6\xb7\xbe\x93\x91\x05\x46\xca\xc3\x5e\xc1\xf4\x2a\x2e\xb2\xd4\xf6\x4c\x56\x73\xf7\xf3\xee\xf0\x38\x67\x32\xa0\x78\xe0\xbe\xf8\xe9\x85\x2f\xa5\xce\xa3\x03\xd8\x11\x83\x7b\x4f\xc6\x46\x61\xa5\xb8\x03\xd1\x2b\xe2\x09\x46\xce\x8b\x3a\x34\xeb\x75\x9c\x46\xd9\xb5\x97\xfa\xf4\x8f\x0d\x98\x94\x70\xb3\xa1\x2d\x9d\xac\x97\xfa\xf4\x0f\xd2\xf6\x4e\x6d\xcb\x43\xbe\x96\x30\x19\xb0\xec\xbc\x1b\xa9\x8f\x7f\x4d\x89\x37\x21\x48\xe6\x0f\x79\xa3\xf0\x1d\x7a\x1d\x16\xf0\x92\x37\x49\x57\x38\x08\x9f\x92\x5a\x2a\x4d\xc7\x83\x89\x2b\x40\x8e\xc9\x2e\x38\x29\xe0\x20\xbe\xf1\x40\xda\x2b\xbe\xdd\xdf\xbb\x29\x49\xd0\x00\x60\xa7\x80\x59\x0e\x53\xf7\x0e\x5f\x11\xf7\xe8\x0d\x51\x3e\xe9\x68\x14\x97\x9d\xf3\xb2\xca\x61\xd1\xc1\x5f\x79\xe2\xe2\x12\xc0\x17\x1e\x6f\x90\x04\x22\xb8\x89\x01\x4e\xa7\x9e\x37\x6d\xc9\xab\x1b\x7d\x2e\xeb\x33\xda\xbc\xe3\xa4\x23\x9b\x4e\xe7\xfa\x64\x2a\xfb\x78\x50\x04\x43\x1a\x46\xa2\x76\xfe\xd4\x68\xb1\xb8\xea\xf0\x06\xa2\xd7\xbc\xb0\x90\x50\x62\x8d\xa2\x7f\x77\x9b\xf7\x97\x59\x62\xbb\xe5\x6b\x8c\xfd\xc8\x96\xcf\x3a\x51\x99\xd6\xe9\x34\x6e\xce\xc2\x8d\xb3\x08\x26\x7c\x22\x56\xb2\x46\x18\x9c\xd1\x6e\x46\xe5\x2b\xcb\x5b\xf2\x47\xa0\xf6\x35\xbe\xb3\x22\x48\x4b\xfa\x44\x89\x04\x31\x6e\xe2\x03\x3a\x9b\x5f\x60\x75\x28\x0b\x63\xb2\x43\x60\x37\x31\x04\xe9\xec\x3e\x4f\x92\xdb\xcf\x4a\xab\x51\xcf\x65\x89\xd4\x1a\x75\x97\x66\x39\xa2\x44\x41\x1a\xc2\xed\x05\x04\x8a\xbf\x43\x0e\x9c\xb7\x35\xec\x12\xe0\x38\x08\x47\x71\x0a\xcb\x57\x10\xa3\x23\xb4\x4b\x3b\x30\x37\x25\x5a\x8d\x9d\xb3\x81\xcb\x13\xdd\x45\x58\xc0\x00\xc1\x43\x3a\x18\xcf\xbd\x8b\xa3\xae\x23\x8d\xe8\xbc\x8a\x1d\x80\xa5\x2e\x78\x83\xba\x77\xa2\x82\xa4\xd0\x9e\x02\xcc\x7c\xba\x4e\x1e\x14\x41\x92\xc0\xc4\x01\x64\xc4\x65\xf7\x0e\x91\xaf\x7c\xc7\xd6\xa4\xeb\x54\xe9\x65\x9a\x5d\xa7\x0e\xc8\xd2\xee\xdd\xd1\xfe\xef\x67\xdd\x3b\xea\x2f\x51\x76\x7b\x4e\x01\xbf\x57\xb0\x44\x47\xf0\x06\x9d\x10\x61\x9a\x0c\xac\x84\x69\xe4\xb9\xce\xe1\xf1\xde\xce\xc7\xf3\xdd\x8f\xc7\xa7\xfb\x8e\xf7\x6d\x0a\x4e\x3e\xed\x7f\xb1\x74\x3e\x29\xe0\xd5\xfc\xce\xbb\xbf\xec\x1c\xbd\xdf\x3f\x3f\xd9\x79\xbf\x7f\x7a\x7e\x7a\xf0\xe7\xbe\x0c\x29\x1c\x05\xe9\x10\x62\x20\xa7\x64\xbf\xce\x02\x74\x78\xbc\xb7\xff\xf1\xfc\xf3\xc9\xde\xce\xd9\xfe\x5e\xd7\xf9\xbf\xea\xf9\x4d\xf9\x0a\xb0\x92\x2e\x59\x50\x3e\xfd\x20\xb9\x0e\x26\x65\xb7\x77\x47\xc3\xfe\x76\x1d\xba\x77\xc2\x2c\x8d\xba\xce\x28\x28\xf7\xf0\xcf\x29\xe0\xd5\x34\x39\xc1\xf4\xdb\x14\xe0\x86\xdd\xbb\x29\x20\x25\xdd\xbb\xe9\x74\x0a\xca\x38\x82\xfd\xa0\xb0\x2d\xb3\x31\x0a\x03\x31\xe6\xf3\x35\x62\x06\xe8\xa0\x3c\xc6\x85\x12\xfa\x30\xc9\x4a\x48\xd0\xe3\xe6\x12\xa2\x7e\x55\x4e\x1c\x00\x6f\x62\x44\x3e\xc1\x38\xbb\x82\xbb\xc4\xa5\x0a\xed\xf3\x2d\xf2\x5b\x05\x8b\xc9\x49\x50\x04\x63\x48\xaf\xac\xf5\xa0\x70\x67\x0c\xeb\x2a\xbb\x84\xdd\xbb\xb2\x08\xbb\x4e\x92\x05\x91\xe8\x89\xb7\xc9\x5e\x96\xc2\xae\x53\x56\x61\x08\xcb\x12\x17\xec\x17\x45\x86\xa9\x31\xfe\xc7\xc1\xb3\xa7\x55\xdd\x3b\x98\xa2\x62\xd2\x25\x5f\x0b\x4b\x3b\xc3\xd4\x73\xe5\x8d\x4a\xce\x8c\xff\x33\xea\xe0\x15\x9c\x7a\x64\x07\x7e\x3c\xde\xd9\x3b\xdf\xff\xb2\xf3\xf1\xf3\xce\xd9\xc1\xf1\x51\x97\x4f\x98\xce\x4b\xec\x89\x2a\x8f\x02\x04\x9b\xe7\x84\x3f\x03\x19\x51\xc3\x30\x48\x95\x6d\x04\x9f\xf6\xcf\x3e\xfd\xc1\xf0\x61\x20\xb8\x4c\xda\x64\xf5\xd2\xd7\x3b\x16\x8f\x55\xfa\x78\xac\x92\x6f\x9b\xa3\x4c\x5a\x7d\xfc\xbd\xa6\x80\x34\xe9\xde\xcd\x9c\x2d\xdd\x03\x4b\xcc\xb6\x61\x38\xf2\x5e\x1a\x05\xa5\x3e\x16\xfc\x1f\xb8\x63\x4a\x9c\xb2\x7b\x17\x94\x93\x34\xdc\x54\x3f\x79\x89\x89\x26\xb0\xd5\x10\x6a\x0a\x86\x55\x50\x44\x65\xf7\x4e\xd9\xaa\x5d\xd7\xf3\x7f\x7e\xf1\x13\x60\x07\x87\xfe\x7c\x0d\xf4\x05\x11\xe9\xaa\xa5\x6d\x11\x8b\x84\xd4\x2f\xe2\x29\x50\x87\x3d\xaf\xc7\x66\x3c\x05\x69\x86\xde\xe2\x8d\xcc\xe4\x11\xff\xe7\x17\x71\x87\xec\xf0\xce\x38\x40\xe1\x08\x96\xee\x1d\x3f\xa0\xe4\xf4\xd4\x1f\xdb\x9b\xf2\x25\xbf\x9b\xbd\xe2\x64\x4d\x16\x3a\x5d\x64\x91\xa6\xde\xdc\xeb\xda\x38\xbe\x89\xd3\xf2\x15\x89\x71\xbe\x9d\x55\x08\x8f\xb0\xc1\xe0\x26\x1a\xd0\x5e\x4f\x53\xf4\x98\x35\xcb\x12\x06\x45\x38\xc2\xb0\xac\x86\x0e\x1a\xec\x81\x4d\x4e\x2b\x35\x5a\x85\xd9\x38\xaf\x48\xfe\x1a\x67\x50\x95\xb0\x73\x61\xb5\x70\x80\x62\x55\xdc\x59\x4a\xb3\xc7\x58\xb4\x7b\x47\xe7\x73\x06\x8b\x71\xd7\x71\x40\x12\x97\xe8\x2c\x3b\x25\x65\xf4\x25\x6a\x3d\x46\x39\x03\x5f\xbd\x68\xbd\x6f\x78\xa5\x28\x04\x3c\xa8\x92\x30\x70\x00\x6f\x82\x10\x1d\xe2\xfd\x7a\x2a\x55\xb9\xaf\x41\xda\x29\x60\x10\x95\x1e\xbe\xa2\xf0\x0a\xc7\x03\x05\x1c\xc2\x9b\x05\xdb\x0e\xaa\xdb\xdb\xc9\x82\x6d\xc5\x40\xf6\x53\xfc\xc5\x22\xfc\xf9\x25\x00\xbc\xf4\x27\xc0\x82\xe7\xbf\x13\x95\x87\xf4\xc0\xe1\x4a\x32\x3e\x09\x44\x01\x4b\x88\xa5\x8a\x38\xad\x89\x09\x4d\xc3\x42\x6e\xb2\xd4\x0b\x98\x08\x1d\x5b\x5b\xa4\xa4\x84\xc8\x75\xa4\x62\x07\xfc\xe4\x4d\x01\xfe\xe2\xfa\x12\x3b\xfa\xec\x3a\xbd\x6f\x0e\x4f\x22\x69\x0e\xce\x01\x8e\xfc\xc5\x48\x6b\xf3\x33\x6d\xa6\xf0\x7a\x93\xe7\x3f\x24\xb7\xeb\x8e\xdc\x0d\xdc\x95\xa3\xac\x4a\xa2\xd3\xac\x40\x78\x7a\x68\x54\xc0\x72\x94\x25\x51\xb7\xf3\xdf\x20\xc9\xe8\x15\xb8\xfb\x1a\x44\x31\x15\x91\xbb\x3f\xbd\x7e\x0d\x88\x32\x1b\x5f\xe7\x5e\xbc\x06\x84\x36\xed\x24\xc9\x19\x2e\x2b\x69\xc9\xcd\x49\x80\x10\x2c\xd2\x8f\x30\x1d\xa2\x51\xf7\x7f\xff\x17\x18\xc7\x29\x19\xf6\xee\x28\x28\x58\x29\x5f\xf7\x7a\xb1\xc9\xd8\x1a\xa7\x0b\x2e\xe1\x84\xb5\xd1\x17\xea\xfe\xbe\xf7\x0d\x9f\xec\x77\x9c\x37\x93\xa5\x1d\x42\xe4\x91\xdf\xf4\x50\xe3\x59\xd3\x4e\x30\x32\xd6\xde\xd8\x2d\x98\x70\xd9\xb6\x32\xfd\x28\xf8\xfb\x91\x7f\xf4\xed\xa4\x16\x3e\xf4\x33\x3a\xf2\xa6\xab\x7f\x1a\x20\xc5\xe9\x55\x3f\x7c\x6d\x4c\x61\xfb\xaf\x6e\x44\x5c\x28\x5d\x8f\xe8\xb1\xe0\xfd\xfd\x0b\xd8\x49\xc8\x87\xf0\x6a\x22\xa8\x6f\x8d\x0d\x0a\x08\xf9\x3d\xa2\xfc\x22\xf5\xc6\x3a\x6d\x6d\xa1\x4e\x5e\x95\x23\xb7\xd3\xe9\x28\xc4\x2b\xf5\xee\xe2\x81\x6b\x20\xe9\x0c\xe2\x04\xb3\x17\x17\xf9\x3f\xa7\x9d\x32\x1b\x43\xd7\x4d\xe5\x0f\x86\x7b\xfa\xbe\x0f\x3d\xcf\xf3\xa6\x18\x92\xb1\x63\xb5\x81\x48\xeb\xe2\x79\x40\xdf\x20\x6c\x98\x34\x5d\x69\xec\xb3\xea\x12\xb2\x85\x71\xa1\xb7\x31\x7b\xdf\x6d\x6d\xb9\xb1\x1f\x77\xc6\x41\xee\xba\xd0\xff\xf9\xae\x5e\x14\xd8\x89\x11\x1c\x6f\x88\x47\x3d\xf8\xa0\x0f\x2c\x9f\x97\xb3\x6f\x0f\xe0\x7b\x9b\x07\xc4\x82\xc5\xde\x54\x5e\x7c\xf9\xab\x2f\xba\xae\x77\xa8\x98\x70\xab\x37\x3e\xeb\x9f\xe0\x70\xff\x26\x27\x57\x65\x6e\xcc\x96\x96\x1d\x8a\x65\x47\xfe\xcf\x45\x07\xc1\x12\xb9\xea\x71\x21\xff\x4d\x43\x3c\x68\xb7\xf0\xee\xa6\x9c\xde\xcf\xf8\x1c\xfa\x0e\x25\xd3\xac\xd2\xf8\xbb\x8b\xcf\xde\x74\xbe\x19\xbb\xe6\xb0\x59\x41\x6e\x7a\xdb\x83\x20\x44\x59\x31\x59\x84\xcf\xd6\xda\xdf\x06\x7e\x4b\x4c\x1b\x8f\xc0\x5b\x25\x70\x45\x7d\xe8\x12\x1f\xf2\x9d\xf2\x17\x5b\xa5\xac\x40\x9d\x7f\xc3\x20\x1c\x75\x5e\xde\xc1\xe9\x5f\x9e\xf4\x51\x0c\x7e\x9c\x15\xa8\x1e\x04\x65\xa7\xb8\x64\x0f\x96\x21\x4c\xa3\x38\x1d\x62\xea\x2a\xa0\x52\xee\x37\x9f\x47\x9f\xd7\x8b\xfa\x8e\xae\xe9\xd7\xa0\x48\xe3\x74\x78\x52\xc4\x29\xa2\x0c\x90\x90\x46\x92\x10\x4f\x87\xd9\xe9\x74\x12\xe0\xcc\x86\x20\x28\x18\x9e\x2a\x25\x4d\xca\xb0\x59\x41\x3d\x33\x95\x5a\x61\x72\xc4\xb4\xc0\xb3\x90\x6c\x6d\xbd\x10\x2a\x67\xbc\x69\xe3\x74\x48\x0f\x35\xf4\x9d\xcf\x65\x9c\x0e\x37\x4f\xd5\xfe\x9b\xcc\x73\x65\x33\x67\x78\x37\x31\x07\xd9\x1c\xc3\x20\x2d\x37\xd1\x08\x6e\xe2\x41\x6f\x5e\xc7\x49\xb2\x99\xa5\xc9\x64\x13\xa3\xdf\xbc\x1e\xc1\x94\x54\x8e\xc9\xe6\x29\x37\xe9\x1d\x1e\x6c\xa6\x19\xab\x0c\xd2\xc9\x66\x36\xc0\x6d\xe2\xa2\x06\x1d\xc3\xba\x61\xc7\xd9\x28\xb6\xb6\x5c\xf8\x2f\xdf\xd9\x3c\x1b\x41\x3e\xa6\x4d\xb2\x59\x37\xe3\x72\x33\x82\x79\x01\xc3\x00\xc1\x68\x33\x4e\x37\x07\xc1\x55\x56\x60\x78\xda\xe0\x3b\x0e\x23\x65\x84\xac\xcc\x5b\xff\x17\xaf\xbd\xa9\x42\xf5\xa5\xef\x21\x5c\x5c\x30\x90\xb7\x54\xc1\xde\x91\xbf\x87\xd8\x90\x75\x8d\xf8\x74\x6f\x60\x87\x3d\x42\x75\xbd\x2e\x24\x47\x79\xba\xc8\xf9\x6d\xd0\x6e\x37\x9d\xf2\xc7\xd5\x48\xd5\xba\x6f\xb7\xf7\x0d\x2f\xd5\xa2\x77\x1a\x6a\x9f\xd9\x2e\x60\x19\xdf\x2e\x29\xf3\x17\x55\x9a\x90\x28\x96\x2a\x11\xd2\x7b\xc1\x2b\x98\x5a\xd2\x70\x3e\xbe\xe0\x4f\xa7\xf6\x09\xcf\x0c\xd2\x94\xd8\xf4\x6a\x48\x94\xc3\x5f\xa5\x4a\x4c\x0f\x8a\x4e\x96\x7a\xae\x13\xc5\xd1\x41\x5a\xc2\x02\xed\x27\x90\x5a\x15\xe4\x63\x4c\xa3\x63\x60\xd9\xaa\x4a\xe0\x71\x1a\x42\xcf\x75\x88\xba\xfb\x13\x71\x19\x74\xc8\x6e\xa6\x5b\x3a\x88\x22\x0a\xfc\x63\x5c\x22\x98\xc2\x82\x88\x67\x46\x69\x6d\x1d\xa2\x27\xc0\x32\x62\x0a\xb3\x63\xa9\xe9\xf4\xe3\x34\x22\x1b\xdd\xf3\x00\xad\xc7\x58\xf7\xf1\x72\x73\xf0\x0e\xf9\xb0\x90\x41\xb1\x21\xf0\xea\xbb\x72\xc3\x8a\x48\x36\x2d\xeb\x9a\x30\xcc\x14\xc6\xf2\xc8\x97\xe1\x9b\x98\xd6\x6d\x73\x4f\x97\xed\xab\xb8\x8c\xfb\x71\x12\xa3\xc9\x76\x04\x11\x6c\x7a\x84\x36\x6f\x1b\xff\x47\x77\x6d\x6c\xec\x5a\x31\x2b\x63\xcf\xee\x65\x21\x31\x18\x7e\xe1\x4d\xa4\xef\x14\xa7\xb1\xf6\x65\x90\xce\x4a\xee\xef\x5d\x69\xb3\x19\x88\xd8\x77\x32\xca\x95\x8d\x16\xb1\x31\x58\xb6\x9a\xe8\x48\xd9\x44\xfd\xdd\x0d\x80\x1e\x39\x0b\x74\xc7\xb4\x9f\x13\x1f\x91\x75\x0b\x2e\x3e\xa8\xe5\xb7\xe2\x20\x2b\xfa\x71\x14\xc1\x74\x9b\x9a\x1c\xe6\x92\xce\xc7\xf7\x3c\x90\xb4\x1e\xa8\xca\x77\xb9\x13\x99\x0b\x19\xa1\x89\xcb\x77\xf5\xa8\xb7\xb6\xa4\xed\x20\x95\x3b\x80\xc2\xc6\xd8\xcc\xba\x17\xaf\xeb\x0b\x08\xb5\x68\x63\xe9\x49\x58\xb2\xa7\x54\x75\xa0\x22\xb6\x82\xf9\x69\x16\x94\xc5\x75\x72\xe4\x43\x50\xdb\x27\x51\x1b\x6f\x8f\xf0\xe7\x24\xf2\xd8\x7c\x46\xa6\x45\x4e\x4a\x33\x14\x0f\x26\x14\xce\x63\xda\x4e\xcd\xaf\x45\x26\x20\xa9\xea\x9a\x16\xa6\x43\x2f\x2c\x2c\x98\x15\x63\xf8\xf4\x64\xaa\x6b\x66\xb7\xab\xca\x6b\x96\x06\x63\x58\xe6\x41\x08\xb7\xc9\x17\x43\x4d\x4b\xa6\x38\x22\xd6\xf9\x0a\xa9\x52\x7a\xb1\x5d\x4e\x7d\x98\x57\xb3\x76\x85\x9f\x9a\x3b\x7d\x52\x22\x38\xee\x32\x5f\x66\x8c\xc5\x73\x3d\x70\x91\xf5\x4b\xb1\x0b\xa9\x81\xa1\xae\x75\x70\xa5\xe3\x09\x7d\xf2\x30\x43\xd9\x87\xac\x5f\xf2\x53\x42\xf6\xab\x0a\xa2\x73\x91\xf5\x8f\xea\x35\xc3\x17\xde\x21\xd9\xd3\x91\x53\x1f\x07\x54\x04\x69\x19\x63\x88\x67\xd9\xa7\xac\x42\xb0\xc6\xa3\xa9\x98\xed\x9e\x14\xf2\xa7\x29\x70\xef\x35\x7b\x53\x58\x01\xfe\x56\x57\x84\xc8\xfe\xb3\x58\x5c\x04\x17\x9e\xd9\x7f\x8e\xd1\x5d\x13\xdd\x4e\x51\xb6\x30\x08\xd4\xdb\x70\xd9\x0d\xff\x77\xdf\x1a\xb8\x16\x19\xdc\xd5\xb3\x5e\xd4\x4c\x10\x06\x69\x08\x93\x9d\x24\xf9\xca\x3a\xd6\xc2\x7d\x0d\xa8\x33\xc8\x8a\xfd\x00\xd3\x6f\xe8\xff\x7c\x07\x3b\xbc\x03\xd5\x1f\x81\x12\x05\x05\x92\x3a\xb3\x73\x21\x31\x53\x95\x43\xa8\xed\x15\x46\x31\x8b\x43\xdb\x8e\x20\xdf\x5b\x23\xc2\x9f\xdf\x50\x45\xbf\x39\xa1\xae\x05\x31\x6d\xcb\x07\x09\xb4\xdf\x94\x50\x12\x0e\xe7\x78\xb2\x15\x0f\xdf\x2c\xce\x38\xd1\xc4\xb4\x97\x4d\x0e\x76\xf0\x95\x3f\x45\x1d\xcc\xa3\xb6\xb6\x94\x9f\x14\x77\xf9\x35\x46\x23\x8a\x98\xec\x1d\x4c\x98\xbd\xfb\xfb\xa6\x51\x83\x17\xaf\x35\x22\xdc\xb0\xe7\xf1\x20\xcb\x57\xc1\xd0\xc8\x4d\x32\x9b\xf1\x69\x7e\xc6\x74\xae\x86\x78\x41\xf3\x85\x6d\x8f\xb2\xd2\xe2\x99\x45\xb7\x35\xd9\x94\x20\x03\x01\x28\x41\x05\x42\x10\x81\x1c\x8c\x41\x1f\x0c\xc0\x08\x0c\xc1\x04\x5c\x81\x6b\x70\x0b\x2e\xc0\x0d\x38\x06\x27\x1b\xdc\x41\xee\x52\xf0\xd9\x78\x6b\xab\xe9\x6c\x20\xc5\x4e\x18\x77\xc4\x0f\x40\x5d\x49\xab\xba\x46\xfe\x09\xae\x8b\x18\xb1\xf2\xfa\x4f\x40\x0f\x56\x2c\x79\x1d\x15\x6f\x94\x5f\x9d\x30\x48\x12\x37\xf5\xba\xf4\xb4\x4d\xbd\x29\x1f\xec\xa1\x31\x61\xff\x6e\x5a\x6b\x67\xd8\xd8\x2f\xe1\xa4\x74\x53\x4f\x1c\x18\xd9\x1b\x29\xe9\xc1\x6f\x7e\xda\x83\xe4\xd0\x25\xd2\x34\xfc\x17\x2f\xe4\x9f\x20\x51\x26\x42\x6a\x95\x99\xb9\xf4\x2d\xa6\x13\xa7\x9b\xc9\xfd\x7d\x22\x8f\xdf\xdb\xda\x72\x13\x3e\x5f\xff\xc5\x6b\x8f\x78\x98\x92\x68\x4d\xae\x27\xd4\x45\x1d\x1a\xe0\x4f\x1a\x20\xf9\x0a\xb5\x59\x8a\x49\x8e\xf7\xf7\xf1\xd4\x03\x89\x07\x8a\xad\x2d\xba\x20\x2f\x7c\x5f\xc1\x47\xd0\x91\xd1\xa8\xe5\x6f\x12\x73\x55\x8b\x7a\x55\x81\x52\xe9\xd7\x52\x3b\xfd\xd7\x37\x31\x34\x6f\x8c\x04\x4f\x2f\xad\x12\xfc\xef\x43\x9c\x27\x35\xda\x9a\x40\xb4\x79\xea\xbb\xe4\x9d\x57\xda\x09\x10\x2a\x3c\xb7\x76\xbd\xf5\x40\x66\x2f\x0e\xec\xc5\xa5\xbd\xb8\x92\x8b\xef\x18\xfe\x2f\x64\x4c\xae\xe7\xff\xec\xde\x4d\xbd\xa9\x07\x42\x7b\xe7\xc8\x5e\x9c\xdb\x8b\xc7\xbe\x6e\x48\x0b\xa2\xa8\x20\xfe\x35\x0e\xa6\x0f\x8e\x07\xfa\x46\x93\x22\x0f\x77\xa2\x08\x4b\x67\x54\x3e\xed\x24\x30\x88\x60\xd1\xa9\xcb\x3d\x30\x30\xfa\xa0\x60\x58\x76\xfa\x55\x9c\x44\x8e\x07\x46\x3e\x71\x43\xde\x84\x37\x08\xa6\x51\xb9\xc9\x05\x5f\xaa\x85\x2f\xaa\x10\x65\x98\x72\x5b\x48\x3c\xb8\xa4\x0e\xc6\x0c\xb5\x03\x86\x84\x26\x8b\x72\x4c\x48\x1d\x30\xd1\x4a\xf9\xac\xae\xb4\x8a\x12\x16\x83\x13\x3c\x51\x70\xad\xd5\x14\x79\x48\x2b\x6e\xb5\x0a\x3c\x15\x07\x5c\xe8\x80\x50\x80\xaa\xd2\x01\x37\x5a\x39\xa6\x9a\x21\x16\x48\x0b\x07\x1c\xeb\x28\xe0\x90\x08\xbe\x27\xb4\x7c\x3a\x84\x68\x93\x2d\x62\x6d\x06\xbc\x63\x23\xef\x42\xc0\x06\xd4\x45\x53\xa2\x23\x16\xef\x1c\x0b\x71\x5f\x22\xd6\x52\x0c\x26\x2e\x3f\x92\x8f\xa2\xb1\x55\xc2\xaf\x1a\xbe\x9a\xef\x53\xdd\x33\x2b\x20\x60\x30\x29\xa0\xd2\x00\x71\xaf\xaf\x71\xe2\xe3\xe4\xfb\xbe\xcb\xb4\xd5\x78\x45\xbc\xfb\x7b\x7e\x38\xe1\x1b\xfa\x67\x17\xd2\x4f\xee\xdd\xdf\x3b\xce\x74\x0a\x86\xfe\xa1\x3b\xea\xe4\x45\x86\x32\x34\xc9\xa1\xf8\x88\xbd\xfa\x02\xf3\x0d\xdc\x29\xf4\xfa\xc5\x6b\xa0\xfa\x7f\x70\x8a\xfd\xe2\xb5\xe4\x5f\x59\x50\xe7\x43\x0f\x4c\x74\x0c\x74\x3b\xf4\x92\xb6\x80\xaf\x74\xc0\x7c\x47\xf5\xb2\xb6\xb0\xaf\x8d\x65\xe1\x9b\xb2\x17\xb4\x05\x7e\xab\x03\xe7\xfb\xba\x57\xb6\x85\x7d\xa1\xc3\xa6\x47\xa3\x57\xb5\x05\x7c\x63\xac\x08\x3b\x5d\xbd\xb0\x2d\xe8\x63\x1d\xb4\x7c\x40\x7b\x51\x5b\xf0\x27\xc6\x72\xb3\x33\xde\xcb\xdb\x82\x36\xbf\x23\xa5\xc2\xbd\xf1\xb7\xda\x8f\x6a\x08\xd1\xf1\x75\x5a\xf3\xb5\x3d\x58\x86\x45\x9c\x63\x5a\x6a\xed\xe9\x01\xa9\xd8\x80\x5f\x53\x10\x07\xf4\xfa\x4b\x22\xe0\x5d\x67\x63\x60\xc4\xc5\x01\xbd\xc1\x92\x08\xea\x9e\x1a\xfc\x91\x2c\x06\x9f\xce\x14\x83\x93\xda\x35\xe6\x41\xb2\xb0\xc5\x07\xcc\x26\x24\xcf\x78\xc2\x80\x19\x71\xdc\xaf\x10\xf5\x1f\xc9\xa2\xa0\x1c\x91\xab\x40\x51\xd6\xda\x10\x5d\xc4\x16\xa6\xca\x57\xe5\x28\x2b\xd0\x76\x55\xc5\x0d\x4a\x0e\x40\xe4\x6c\x4a\xb3\x17\x10\xb6\xc1\x25\x38\x04\xa7\xe0\x1c\x9c\x81\x5d\xb0\x07\x76\xc0\x11\xd8\x07\x9f\xc0\x3b\x70\x00\x3e\x82\xb7\xe0\x17\xf0\x1d\x7c\x01\xef\xc1\x07\xf0\x19\xbc\x04\x5f\xc1\x6f\xe0\x0f\xf0\x3b\xf8\x15\xfc\x09\x20\x04\x08\x82\x18\x82\x14\x82\x02\x82\x04\x82\x0c\x82\x00\x82\x12\x82\x0a\x82\x10\x82\x08\x82\x1c\x82\x31\x04\x7d\x08\x06\x10\x8c\x20\x18\x42\x30\x81\xe0\x0a\x82\x6b\x28\x64\xfc\x5b\xf8\x9c\x84\xfc\x0b\xb8\x96\xf2\xff\xe9\x52\x3e\x35\xc6\xdf\x40\xff\x2e\x67\x9e\x1b\x3f\x81\xa2\x4a\x53\xfc\xd7\x7f\x01\x7c\xec\x13\x88\x60\xf7\x7f\x83\xda\x9d\xfe\xbf\xc1\x20\x88\x13\x18\x75\xff\x0f\x48\xb2\x12\x75\xff\x9f\x29\xb9\x29\x1c\x43\xdf\x25\x52\x7e\x20\x64\x34\xa2\x58\xa5\x42\x7e\xd1\xe9\xc3\x24\x4b\x87\xe5\x59\x46\x55\xb7\x0e\x93\xeb\xd5\x8a\x34\x8b\x60\x2d\xda\x17\x76\xd1\xde\x2c\x1e\xdb\x8b\x89\x38\x9f\x74\x6a\x4a\xe4\x11\x4b\x66\x56\x15\x21\x2c\x6b\xc1\xbd\xb1\x76\xa4\x80\x4c\x2b\xa2\xa3\xf5\xc0\xd0\x5e\x3c\x51\x8a\x49\x26\x62\x2c\x47\x59\xdb\x5e\xdb\xda\xde\xda\x67\x70\x61\x2f\xbe\x31\xee\x1c\x0e\xe6\xf6\x7a\x61\x98\xc4\x30\x45\xa7\x54\x9e\xc0\xfc\x9a\xdc\x8b\x48\xb6\x48\xbd\x16\x38\xec\x93\x3b\x1e\xb8\x54\x90\xf6\xb3\x2c\x81\x01\xe6\x3f\x87\xf3\x10\x9c\x52\x04\x69\x96\x12\x8b\x3a\xe7\x3b\x67\x41\x79\xf9\xbe\xc8\xaa\xdc\xf1\xc0\xb9\xf9\xc9\x65\x06\x75\x17\xa7\xe4\xb0\x76\x49\x46\xd2\x1d\x51\x33\xf5\xc0\xd9\xa2\x5d\xeb\x74\x26\x6a\xf7\x5d\xda\x7d\x14\x94\x87\x41\x3a\x99\xd5\x19\x8e\x73\x04\xa3\xb7\x13\xb5\xff\xde\x12\xe8\x29\x04\xd1\xbf\xc4\x00\x76\x1a\xd6\xf5\xc8\x04\x2c\x1c\xef\x1d\x0f\xec\xcf\x5b\xf7\x4f\x46\x83\x8b\xac\xff\xa5\x96\x38\xf0\x8f\x8e\x90\x22\xde\x19\x8d\xe3\xf2\x38\x89\x68\x3b\xf1\xa5\x40\xc3\xf7\x3b\xb0\x5c\x77\x59\xed\x11\xb9\x7f\x10\x74\xbc\x8c\xb8\x7f\x7a\xe0\xa3\x71\xd6\x70\x8b\xed\x21\x45\xa5\xde\xfb\x99\x08\xf8\xb6\x19\x51\x27\x2a\x62\x3c\x21\xea\xbf\x85\x29\x46\xa7\x4a\x47\x30\x48\xd0\x68\xb2\x47\xaa\x88\x85\x87\xa2\xfe\xc5\x80\x43\xee\x49\x1e\xf8\xae\x8e\x69\xa7\x28\x82\x49\x3d\x30\x6a\x08\xf6\xc0\x17\x7b\x9b\x02\xd6\xde\x23\xdb\xc4\x02\xe3\x78\xe0\xbd\xa9\x3a\xe0\x8d\x88\x8a\xbf\x64\x5e\x90\x0e\xd0\xb7\xb6\x07\x3e\xcc\xfe\xc2\xc0\x19\x64\x49\x92\x5d\x7f\xce\xc5\x0b\x08\xa2\x99\xa5\x81\x42\x54\x70\xbc\xc2\x03\x9f\x35\xdd\x43\xb1\x84\xee\xe1\x16\xd6\x2a\x00\x1a\x0c\xe4\x25\xbb\xcf\xf3\x72\x22\x98\x1d\x44\x0e\xf8\xaa\xd7\x60\xda\x0e\x7e\xd3\x4b\x09\x61\x07\x7f\x18\xc5\xc2\x16\xf7\xbb\xad\xce\x01\xbf\xea\xc5\xda\x86\xfb\x53\xaf\x17\x64\x9c\x48\x6d\x6a\x25\xdb\xd5\x30\xfa\x24\x5a\x21\xa3\x95\x7c\x7e\x62\xa3\x76\x9c\x45\xf1\x60\x72\x90\x46\xf0\xc6\xc1\xf2\xa0\xb5\xfa\x2c\xc6\x83\x2b\x8c\x5a\x6a\xa0\x60\x9d\x93\x86\x6a\xda\x39\x33\x6b\x95\x6d\x11\x18\xf5\x11\x2c\xe3\x02\x46\x75\x83\xd2\x68\x10\x97\x9f\x18\x9d\xc7\x62\xab\x51\x79\x18\x0f\x8b\x80\xda\x90\x43\x4b\xf5\x49\x50\x60\x09\xc5\xc1\xc2\xae\x56\x69\xa1\xb9\x58\x1e\xd6\xbf\xa8\xba\xf3\xb1\xb8\x6c\xc2\x31\x89\x27\x96\xa9\x9b\xda\x29\x64\x1a\x4b\xde\x5a\xc3\xeb\xa0\x3c\xa9\xdb\x3a\x58\x2c\xd7\xea\xcd\xa3\xe5\x60\xc9\xdd\xbe\x6d\x14\x62\x88\xa5\x7b\xfd\x50\x90\x47\x7e\x0e\x16\xfa\xcd\x4d\xa9\x50\x03\x07\x5c\x43\x49\x15\x96\x27\x41\x9c\x7e\xc8\xfa\x07\x91\xd0\x62\x7d\x38\x3d\x3e\xea\xe4\x01\x16\x5d\x89\xea\x89\x33\x08\x26\x3e\x75\xe2\xc8\xf5\xbc\xde\xeb\x6f\x04\x02\x55\x1b\x90\x7d\x25\x40\xdc\xc0\x1e\x35\xa6\x48\xfb\xe6\xdb\xfd\xfd\x4f\xaf\x5f\x33\xcd\xd9\x29\x1b\x94\x40\xdb\x73\x72\xee\x09\x5b\xcb\x04\xdf\x6a\x97\xf3\xda\x4a\x24\x81\xf3\x24\xec\xbb\x98\xdc\x70\x48\x5c\x9e\x74\xe2\x72\x9b\x03\xad\x45\x4b\x52\x58\xc4\xe3\xa0\x98\x38\x42\xca\xc4\xa5\xf5\x0f\xa7\x96\x33\x71\x21\xf5\xe6\xa0\x02\x27\xfe\x9d\xc4\xc3\x11\x72\xb8\x4c\x8a\x8b\xf8\x33\x54\xeb\x9c\x71\x8b\x28\x28\x2e\x1d\x36\xf3\xe3\x24\xd2\x14\x86\xe2\xd0\xbf\x60\xea\xc1\x21\xf3\x1f\x10\xec\x93\x74\xe6\x04\x48\x03\x40\x80\x52\x9b\x9b\x65\xbf\x74\x6b\x24\xbc\x84\x00\x93\x0b\xf4\x07\x11\x1c\xbf\xe0\xa7\xc2\x4f\x9e\x98\xd4\x06\x71\x1a\xbd\x9d\x30\x9e\xc6\x1c\x18\x64\xf2\x48\x07\xac\x71\xc7\xd2\x8a\xc7\x60\xaf\x8e\x07\x90\x54\xdf\xc8\x67\x95\x21\xa1\x37\xee\x6b\x90\xa9\x5a\xda\x6e\x8f\x6e\xd1\xab\x2c\xa9\xc6\x70\x1f\x73\xa3\x52\x7d\xd3\x86\x91\x50\xb3\x60\xd5\xa7\x52\xae\x2b\xca\x92\xa0\x44\x64\x5f\x1f\x0f\x5c\xa7\xe7\x78\x74\x4e\xa3\xa0\xfc\xa4\x9d\x29\x9b\x02\xb8\x89\x0b\x7b\x3f\xbf\x66\x86\x46\x95\x26\xd5\xb0\x4f\x51\x96\xe7\x84\x4b\xd0\xee\x78\x48\x35\xf8\x17\xd2\xa2\x34\xf0\xde\xad\x2d\xa9\xd1\x0c\xee\xed\x6d\x6d\x39\x74\x97\x3b\xb5\x4e\x5a\xde\xb7\xd3\x12\x65\xfa\x2e\x2b\x51\x56\xc0\x0e\x8b\x92\xf4\x2e\x2b\x14\x31\xd4\xeb\x90\x1e\x94\xb0\x14\x90\x58\x59\x25\x93\xec\x22\x00\xea\x5e\x84\x6e\x41\x6f\x9a\x94\x4b\x02\x48\x4a\xde\x17\x93\x85\x25\x7b\x93\x2e\x75\xff\x29\x78\xe9\x5f\x40\xf7\xb3\xa2\x78\x65\xc1\xda\x56\xa5\x47\xff\x6a\x60\xe0\xa2\x4d\x7b\xb5\xf1\x6f\x06\x70\x22\x1d\xb5\x57\x1b\xff\x61\x00\xa6\x02\x56\x7b\xad\xf1\xef\x26\x64\x21\xa3\xb5\xd7\x1a\xff\x6a\x05\xbf\x0a\xa5\xf1\x9f\xe6\x56\x51\x25\xc5\xde\xb8\x2d\x0a\x08\x0d\x1c\x92\xb4\xd9\xeb\xb7\x85\x8f\x4c\xf8\x36\x81\xb5\x37\x68\x8b\x28\x36\x11\xc9\x32\x6f\x6f\xd4\x16\x41\x6a\x22\x50\xc4\xe6\xde\xb0\x2d\x86\xa2\x09\x03\x15\x9e\x7b\x93\xb6\x08\x12\x13\x81\x22\xbc\xf7\xae\xda\x62\xc8\x9a\x30\xb0\x29\x5c\xb7\x45\x10\x58\x10\x28\x57\x88\xde\x6d\x5b\x14\xa5\x89\x42\xbb\x85\xf4\x2e\x5a\x1b\xdf\x34\x04\x42\x5a\x76\x40\xef\x66\xbe\x41\xa5\xa9\xb3\x07\x3e\xcb\x36\x15\x83\x0f\x08\x91\xda\x01\xbd\xe3\x25\xf1\xc8\xbd\x35\x44\x95\xb9\x66\xd2\xc5\xac\x77\xd2\x76\xbd\x42\x1b\x7c\xe9\x6e\xd7\xbb\x5c\xf5\x17\x91\x6e\x12\x0e\xe8\x1d\x2e\xb9\x54\x72\x6f\x6d\xa9\x22\xdb\x54\xf8\x3d\xb4\x77\xda\x76\x22\xb9\x09\xdf\x76\x95\xed\x9d\xb7\x45\x34\x36\x11\xe9\xb7\xe1\xde\x59\x5b\x24\x7d\xeb\x6c\x2c\x17\xea\xde\x6e\x5b\x54\x83\x19\xa8\xd4\x3b\x79\x6f\xaf\x2d\xae\x91\x89\x4b\xbd\xd6\xf7\x76\xda\xa2\x18\x9a\x28\x6c\x9a\x81\xde\xd1\xaa\x4f\x8e\x74\x73\x76\x40\x6f\xff\x41\x44\x86\xf6\x9e\x43\xcd\x98\x9a\xb7\xf7\x69\xe9\xc3\x79\x9c\xcc\x25\x95\x48\x68\x45\x7a\xef\x96\x44\x80\x24\xf5\xf2\x4c\x24\xaa\x82\xba\x77\xb0\x24\x1e\xa5\xbb\x86\x6a\xd2\x28\x78\xa9\x2a\x9f\xde\xc7\x55\x7f\x7f\xfd\x6e\xee\x80\xde\xdb\x25\x27\x66\x80\x98\xb3\x8e\xda\x3d\xdc\x01\xbd\x5f\x96\xc4\xa8\x43\xd0\x10\x5e\x99\xab\x59\x6b\xc6\x7a\xdf\x5b\xbb\x10\x59\x65\x70\x4d\xb9\xd6\xfb\xb2\xea\xef\x64\xd1\x37\x38\xa0\xf7\x7e\xc9\x85\xb3\x41\x99\xf3\xb5\xec\xca\x08\x07\xf4\x3e\x2c\x8f\xdb\x06\x48\x43\xff\x59\x76\x2c\x39\x86\xb3\x3c\x4b\xc2\x2c\x2d\xab\x64\x3b\xcc\xd2\x94\x78\x8c\x2c\x16\xef\x52\x84\x0a\x5d\xd4\x6b\xc4\xf2\x86\x8b\xbc\xc0\x02\x05\x48\x36\x56\xe3\xe6\x9a\xf9\x6e\x4a\x8d\x30\x92\x8d\xaa\x8c\x23\x18\x06\xc5\x76\xed\x22\xe3\x81\x42\xb3\xa8\xa0\x06\x8b\x0a\xf1\x20\xa4\x8e\x13\x1b\x36\xeb\x0a\xd5\xbb\x01\xe4\xd7\x38\x4e\x6b\x2f\x9c\x94\xd6\xb8\xb1\x9f\x78\x4f\xd5\x3d\x64\x0a\x02\xbf\x90\x76\x56\x69\x4e\xa3\xf2\x7b\xe9\x37\x10\xfa\x6d\xce\x20\xc8\xfd\xbb\x29\x90\x9d\x4c\xc2\x06\x27\x93\xbc\x07\xbf\xf9\x21\x73\x32\xc9\x55\x27\x13\xf9\x27\xc8\x75\x27\x93\xbc\xd1\xc9\x24\xbf\xbf\xcf\x75\x27\x93\x5c\x75\x32\xc9\xfd\x6a\x11\x27\x13\xf2\x44\xb4\xd6\x80\xb9\x01\x28\x01\xf4\xee\xef\x21\x16\x3e\x3d\x10\x49\x4e\x26\xb9\xe6\x02\x92\x33\x27\x13\xa5\xfc\x4d\x6e\x7e\x9c\x88\x3b\x99\xe4\xb3\x9d\x4c\x74\x0c\xf6\xfd\x85\x87\x98\xe3\xe9\x31\x27\x13\x3f\x07\x85\x47\x5e\xda\x48\x0f\x1a\x24\x2a\x91\xcd\x22\x12\x11\xcc\x93\x6c\x32\x6e\x7a\x8a\xd1\xe4\x5d\xd6\xf8\xf2\xa8\x8d\xf3\xd9\x42\x6e\x66\x33\x9b\x55\xe3\xed\x60\x38\x2c\xe0\x30\x68\x7e\xd6\xf4\x08\x2e\x69\xc2\x7f\xec\xfd\x73\x72\x1f\xfb\xb0\xf6\x1e\xfb\xa7\x7b\x8f\x61\xe6\xf9\x99\x39\x7e\x65\x0b\x3a\x7e\x49\xbe\x32\x82\x3a\x10\x17\x19\x8b\x43\x98\xd6\x21\xc1\x62\x24\xda\x13\x44\x65\xaa\x3b\x8b\x71\x47\xab\xdc\xf0\xaa\xa8\x5d\xab\xc5\x95\xe3\xb4\x1a\x8f\x83\x22\x86\x25\x0b\x7b\x94\x17\xd9\x38\x43\x44\x0d\x31\xcb\xa9\xcc\x2c\x1e\xd0\xf0\x2d\xb5\x73\x55\x69\xba\x55\x8d\x66\xf8\x9b\x10\x47\x98\x6d\xb1\x18\xdb\x25\x19\xd7\x44\x78\x9c\xd9\xdc\x96\xca\xda\xf3\x4c\x99\x24\xb3\x55\x1e\x55\xec\x59\xb1\x64\xbf\x2c\x6b\xbb\x13\x9b\x2d\x5f\xaa\x2b\x3a\xfa\x20\x89\x83\x52\x80\xe8\x94\x55\x7f\x1c\x23\xa2\x8c\x64\x7e\x6b\xb2\x6f\x9f\xb9\x88\x0e\xd1\xae\x85\x30\xda\x0d\x52\x5a\xc0\x3c\xdb\xe6\x76\x63\x2a\x43\xa9\xdf\xc5\x32\xfd\xce\x32\x14\x24\xb5\x63\xdc\x82\x63\x24\x2a\x8a\xb2\x76\x9c\x9b\xdb\x89\x5d\xb1\x78\xaf\x93\x85\x7a\xf1\xab\x19\xef\x77\xd9\xb4\x2b\x3d\x70\xd8\xc2\x5f\xe7\xbd\xee\x96\x73\xca\x3c\x10\xde\xcb\x5e\x39\xe7\x66\xe1\xbb\xac\xf8\x48\xce\x94\x03\xce\xb4\x5a\x6d\x27\xed\x6a\xd5\xf5\x1e\xdf\xb3\x96\xd7\xb7\x10\x72\xc1\xdc\xd1\x9a\x48\xda\xce\x23\xad\xca\xb6\x8c\xfb\x5a\x1b\xf9\x08\x80\x4f\xf6\x51\x9f\x8a\xbd\x0b\xde\x69\x4d\xb4\x4d\x0a\x0e\xb4\x7a\x7d\x37\x82\x8f\xf6\x06\x74\xdb\x81\xb7\x56\xf0\xec\x8b\x83\x5f\xb4\x5a\x75\x43\x80\xef\x5a\xb5\xbe\x63\xc0\x17\xf9\xc5\x14\xfc\x5e\xc5\x05\x2c\x4f\x08\x99\x92\x6d\xe8\x9c\xd0\xd4\x66\x64\xfa\x15\x58\x64\x4f\x0b\xbd\x43\x19\xa1\x40\x24\xd6\xd6\x18\x92\xb7\xcc\xb0\x36\x99\x6b\x48\x88\x39\x9b\x55\x0a\x02\xc9\xec\xf0\xe2\xd9\x14\x7b\x30\x65\xf5\x9c\x28\x1d\xef\xfe\xbe\xf7\xcd\x13\x0e\x0b\x6c\x53\x91\xd6\xca\x46\x9b\xe1\x50\x22\xfb\x8e\xd4\xf3\xad\x43\x61\x0f\xaa\x44\xf5\x29\xc9\x83\xaa\x64\xce\x23\xcc\x59\xc4\x74\x27\xa1\x8f\x8c\xeb\x42\xfe\xab\x76\x21\x29\x4d\xe7\x11\x36\xff\xb9\x36\x79\x49\xec\xf5\x6a\xae\xc2\xcc\xf2\x78\x18\xcb\xf5\x27\x3d\x68\xe7\x29\x38\xf5\x3f\xb8\x87\x8f\x64\xae\x3e\xd7\x61\xaf\xc8\x5a\x7d\x66\x81\x2b\x11\x9e\xf6\x46\xeb\x5d\x1d\x81\x46\xbb\xda\xdb\xad\x35\xf8\xe6\x21\x21\x16\xec\x79\x0a\x99\x39\x30\x3c\x70\x28\xeb\x62\xf6\x8c\x4f\x5d\x9b\xd4\x5a\x5b\xb2\x77\xec\xa0\x15\xaa\xdd\xde\x9e\x7d\xa4\x63\x91\xcd\x5c\xad\x8d\xd8\xfb\x3a\x74\x1b\xef\x68\x6f\xca\xfe\xa4\xa3\x51\xd8\x4f\x7b\x43\xb6\x7d\xe7\x52\x0b\xf6\x52\xfb\x49\x38\x79\x2b\xbb\xe8\x5d\xc3\xd9\x90\x39\x64\x7b\x5b\xf6\x81\x8e\x45\x67\xb2\xed\xad\xd9\x1f\x75\x14\x06\x9f\x6e\x6f\xce\x7e\xdb\x80\x83\xb1\xfa\xf6\xb6\xec\x5f\xec\xeb\x54\x73\xfb\xde\x4d\x5b\x04\xdf\x75\x04\x9a\x3c\xd1\x3b\x6e\x8b\xe1\x8b\x8e\xc1\x90\x59\xda\x9b\xb0\xad\xd4\xa9\xb6\x92\x5d\x2e\x79\x30\x54\x2b\x99\x72\x38\x0e\x65\x75\xf7\xe7\x99\x8a\xac\x22\x88\xd3\xed\x12\x15\x01\x82\xc3\x99\xc1\x7e\x1f\xfe\x54\xb2\x29\x8b\x16\x55\xf8\xb0\x14\x69\x66\x60\x11\xa1\x1e\x1a\x3c\x27\xf5\xd0\x68\xad\x1e\xfa\x11\xd4\x43\x43\xdf\x2d\xe8\xa5\x57\xd7\xd0\x24\x4a\x31\x7b\x0a\x97\x29\x85\xe2\x99\x54\x40\x75\x14\xe4\xae\x1d\xc1\x20\x4a\xe2\x14\x3a\xe0\x35\x0b\x2d\x22\x54\x2f\x4a\x5d\xd5\x22\xfc\xc6\x80\x5f\xf6\x6a\x80\x21\xbb\xab\x0d\xf8\xdb\x81\x22\x84\x7b\xbc\x3a\xd2\xaa\xe3\x61\x9a\x15\xf0\x94\x04\x7e\xf8\x90\xf5\x4b\x07\xe4\x7a\x8b\xf2\x1d\x06\x11\x39\x60\xac\xd5\x90\x34\x2e\x02\x74\x1f\xd4\xe2\x7f\xe8\x8f\xdc\x4a\x65\x50\x75\xa3\x5e\xd1\x96\xea\x46\x3a\x70\x6d\x86\xed\x83\x4b\xe4\x3a\x06\x73\x91\xda\x47\x99\x18\x1b\x48\xf8\x3a\xb7\x8f\x32\xd1\xd7\x81\x6b\x9f\xaa\xfd\x2d\xac\x92\x79\xd2\x70\x16\x4f\x12\xef\x04\xb7\x4b\x54\xf5\x9b\x73\xe6\x36\xc4\xb2\x5a\xf0\xa1\xbd\x64\x6f\x5d\x34\xaa\xd5\x2c\xab\x86\x60\x57\x6f\x9f\x13\xbb\xfa\x65\xcd\xae\x7e\x04\x76\xf5\x9d\xbb\x02\x68\xd6\x8c\x82\x29\xc9\x6d\x4c\x0c\xd9\xc3\x63\x99\xc5\x81\xbd\xb8\xb4\x17\x57\xf6\xe2\xd0\x5e\x1c\xd9\x8b\x73\x7b\xf1\x58\x29\x66\xcc\xb7\x6f\x6f\x3b\xb0\x17\x8f\xec\xc5\x43\xfb\x42\x4d\x6c\x08\xaf\xec\x6d\xaf\x6d\x6d\x6f\x17\xf4\xbe\xb0\x31\xf3\xb7\xba\x7e\xbc\x0e\x6a\xf5\x96\x3f\x28\x8c\xb3\x22\x46\x13\x11\xd6\xaa\xae\xc1\x54\x5e\x04\xb4\xe2\xa5\x45\x3c\x1c\xc2\x02\x46\x6f\x27\x3c\xaa\x15\xaf\x94\x5e\x4c\x5c\x6a\x55\x17\xd4\x6d\xf9\x50\xef\x91\x45\x50\x56\xdb\xbf\xe5\xc2\x47\xad\x07\xc4\xb5\xe7\x5a\x6d\xad\x0f\x3a\xb3\x96\x2b\xca\x9c\x5d\xad\xc9\x75\x10\xa3\xcf\x29\x8a\x13\xa1\xc0\x7f\xab\xbd\xe5\x24\x39\xec\xb8\xee\xfe\xad\xf4\x86\x93\xd6\x1c\x69\x35\xfd\x24\x0b\x2f\x61\x44\x2b\xf7\xb5\x4a\xc5\xfb\xff\x93\xb5\x52\x55\xd6\xbf\xb5\x3d\x98\x3d\xb0\x56\xd2\x8e\x1f\xb9\x8c\x74\xe1\xff\xe2\xde\xda\x55\xa4\x69\xfb\x78\x4d\x1a\x6c\xb1\x71\xda\xcb\x5f\xc7\x3a\x70\xba\xf7\xda\x8b\x5d\x27\x06\x60\x79\xfb\xb6\x97\xb8\x2e\x75\xf8\xf2\x9b\xa1\xd6\x22\xd7\xa1\x0e\x9d\x1d\xa2\xf6\xa2\xd6\xa9\x31\x6e\x76\x0e\xdb\xeb\xbc\xcf\x75\xd0\xea\x51\x6e\xaf\xf3\x3e\x33\x76\x79\xad\x1d\x6e\xad\xec\xde\xb5\x83\x56\xb5\xc3\xad\x1f\x6c\xed\xe9\x58\x24\x9a\xb4\x0a\x0d\xb7\x71\x50\x65\xb2\xb6\x0a\xe5\xb6\xbe\x77\x38\x65\x5c\x85\x6e\x5b\x03\xae\x10\xd7\x55\x28\xb5\x35\xf8\x2b\x7e\x9d\xf5\xce\x0e\x7f\x55\x6f\xb3\x0e\x74\xf0\x2b\x7e\x99\xf5\xd1\x0e\x7f\x55\xef\xb2\x6e\xe5\x1b\xde\xf7\xc5\x6e\x78\x8f\xa3\x71\x5c\xde\x3f\x6e\x15\x31\x8f\x1f\x12\x86\x4d\xdc\x1a\x7f\x7d\x4e\xb7\xc6\x3f\xd7\xb7\xc6\x1f\xe1\xd6\x08\x21\x0b\x94\x5c\xe8\xd7\xc6\x4c\x2f\x65\x22\x06\xbb\x0b\x9a\x5a\xd1\x52\x29\x56\xef\x82\x66\x71\x68\x2f\x8e\xec\xc5\x2c\x36\xb2\xee\x84\x46\x6c\x50\xc4\xf1\x6c\x10\xc4\x49\x55\x40\x3d\x28\x93\xeb\xf9\x3f\xf7\xbe\x4d\x79\x14\x65\xab\x57\x9c\x59\x3c\xb0\x17\x8f\x68\xb1\xf0\x69\x33\xf4\x58\x34\x4d\x76\xf7\xc5\x4f\x53\x7e\x9d\xec\x67\x59\xe2\xb9\x2c\x5a\xc2\xd9\x7b\x6a\x6a\xe2\xe1\x1c\xea\xdb\xa5\xe1\x80\xc7\xf8\x66\x7d\xd5\x8c\x2d\x61\xe8\xae\xcd\x0a\x16\x86\xee\xd6\xfe\x85\x2e\x6c\x7a\xeb\x1b\x7b\xdb\x63\x5b\xdb\x13\x5b\xe1\xa5\x7d\xb1\x0e\xed\xc5\xa7\xda\x65\x38\x5e\xe2\x32\xfc\xab\x7e\x19\xae\xef\x95\x4a\xc5\x11\x13\x85\xcf\xb4\x4a\x71\xe1\xd9\xd5\x6a\xe8\x6d\x65\x4f\x2f\x95\xaf\x1a\x3b\x3a\x26\xf6\x9d\x8e\xac\xe5\x8a\xc0\xb9\xaf\x35\x51\x77\x82\xb8\x54\xfe\x6a\xbd\xc6\xbe\xd3\x6a\x85\xb0\x76\xa0\xd5\x28\x92\xd6\x47\xad\xb2\x80\x49\x80\x68\x65\x29\x3c\xbf\x7e\x15\x5a\xfb\x93\xfa\x28\xbd\xa3\x27\x49\xf2\x00\xfb\x95\x6b\xfd\xdf\xb2\x4d\xc9\xbd\xbf\x7e\x95\xbd\xf4\xbe\xe8\x43\x25\x91\x1d\xde\x6b\xa5\x8a\xc0\xf6\xc1\x5a\x49\xc5\x95\xcf\x5a\x9d\x22\x2a\xbd\xb4\x56\xd2\x8e\x5f\xb5\x3a\x49\x3c\xff\x4d\x1f\xa2\xb8\xee\xfd\xa1\x7f\x06\xe9\xb1\xf6\xef\x92\x2f\xdb\x28\x28\x3f\x64\x7d\x11\x54\x85\x06\x4c\x11\xad\xeb\x46\x78\x1b\xea\xad\xa4\x50\x48\xf4\xa4\x92\x58\x48\xa4\x07\xa5\xae\x9a\x7f\x55\x43\xfb\x29\x38\xf7\xff\x74\x4f\xed\x9a\x82\xd6\x77\xee\x33\x2b\xec\xfa\x54\xb5\xbf\x73\xef\xea\xf0\x25\x4d\x44\xeb\x2b\xf7\x9e\x0e\x9c\x69\x22\x5a\xdf\xb8\x77\x0c\xc0\x8a\x26\xa2\xf5\xb5\xfb\xc8\x58\xf5\x95\xc5\xd3\xde\xb7\x83\x56\x6f\xc5\xad\xef\xde\x9f\x74\x2c\x3a\x9d\x6b\x7f\xf1\x7e\x67\xee\x1c\xe5\x6a\xdc\xfa\xee\x7d\xa0\x23\x90\xae\xc6\xad\xef\xdd\x1f\x75\xe0\xea\xd5\xb8\xf5\xd5\xfb\xad\x0e\x5f\xa5\xf9\xed\xef\xde\xbf\xe8\x08\xec\x6c\xa3\xfd\x25\xfc\xbb\x8e\x48\xe2\x3c\xed\xef\xe0\x5f\x74\xe8\xd4\x59\xb4\xf5\xdd\xfb\xbd\xb1\x79\x68\x64\xa3\xd6\xb7\xee\x0f\x3a\x60\x55\xe7\xd1\xda\x77\xec\xb3\x1d\x3e\x53\x1a\xb4\xf6\x1c\x7b\xa9\x83\x57\x75\x1e\xad\x1d\xc7\xbe\xda\xe1\xb3\xe1\xb7\xf6\x1a\xfb\x4d\x07\x2f\x6b\xfb\x5a\xfb\x8b\xfd\x61\x6c\x1a\x49\x01\xdd\x3a\xdc\xc9\xef\x06\xc1\x94\x23\xd0\x1c\xb6\xd6\x42\xcb\xea\x20\x38\xf3\xcd\x35\x7d\x29\x54\x86\x81\x99\x1c\x73\xb1\x27\xd7\x0f\xd7\x0f\xad\x7d\xd2\xd6\xea\x9a\x7f\x8a\xba\xa6\xf6\x49\x13\xaa\x90\xe3\xeb\x14\x16\x9e\xab\x3b\xa5\x09\xff\xb3\xcc\x7e\xbf\x5f\x44\x89\x63\xfa\xa1\x2d\x63\xba\x1e\xe8\x2f\xa3\x4c\x47\x34\x98\xe2\x8d\x10\x99\x2e\x68\xe3\xe0\xc6\xf4\x3a\x1b\xc7\xa9\xe9\x70\x96\x67\x49\x1c\x4e\x66\x7a\x9a\xc9\x41\x5e\x56\xef\x6a\xc6\xe7\xf0\x08\x4e\x66\x64\x19\x1e\xc1\xaf\x8c\xac\xe4\x23\xb8\x94\xd5\x1f\xe3\xef\xf4\x25\x1b\x65\x25\xda\xa6\x81\x5d\x9e\x2a\x5f\x11\x3c\x65\xfc\x9c\x78\x4a\x7f\xcd\x53\x7e\x04\x9e\x32\x58\x94\xa7\xa8\x3e\x62\x66\x71\xd0\xc0\x81\xca\x16\x4c\x64\xac\xe8\x12\x2b\x46\xfc\xc7\x4a\xa4\xfd\x50\x2b\xcd\x03\x34\x12\x2c\x65\xcc\x35\xa0\x41\x74\x9c\x26\x13\xce\x57\xa6\x53\x50\xf9\x7d\xb7\xb4\x5c\xd9\x5a\x73\x89\xd0\x00\xbc\xa2\x24\x77\x91\x0e\x98\x4e\xb6\x3d\x8f\xc8\x75\xc0\x62\xbd\xda\x33\x8a\x52\xa6\xe6\x83\x59\xd4\xfc\x22\xeb\x6f\x47\x71\x99\x07\x28\x1c\xcd\x73\x0b\xd6\x08\x30\xa5\x51\x52\x28\x93\x35\x01\x5e\x13\xe0\x67\x42\x80\x63\xd9\x6f\xd4\x03\xa9\xfa\xb3\x50\x7f\x26\xea\xcf\x4c\xfd\x19\xac\x80\xda\xc6\x54\x37\x53\x6a\x24\xf4\x22\xeb\xef\xca\xba\x1b\x9d\x1c\xc3\xab\x20\x51\x1a\xe8\x94\x19\x37\x38\xd8\x33\x69\x73\x7d\xe2\x61\xf4\x21\xeb\xe3\x06\x82\x44\x97\x7e\xdf\x0d\x14\x5d\x20\xd3\x1b\xc5\xad\x45\x4c\x1d\xb2\x3e\xbd\xf6\x4e\x97\xa1\x8e\xc2\x58\xa1\x55\x5c\x48\x2c\x38\xf0\x1a\xae\xe2\x3e\xa2\x81\x36\xbe\x53\x7b\xbe\x13\x2c\xc5\x1a\xf2\x24\xb0\x3a\x14\xad\x44\x7e\xb7\x3c\x17\x11\x8c\x23\x7c\x4e\x8c\x23\x5a\x33\x8e\x1f\x81\x71\xe4\xec\xc9\x87\xc6\x29\xe2\x16\x7e\x32\x8c\xb7\x58\xb3\xcd\x61\x56\xf3\x70\xde\x12\x72\x5a\x3f\x18\x38\x20\x60\x1c\x20\x6c\x70\x8a\x28\xb5\x7a\x16\xa3\x99\xc6\x2e\xa8\x38\x77\x08\xfc\xc8\xcd\x54\x0a\x85\xa1\xb7\xa7\xdc\xa5\x0e\xd8\xb0\x66\xb6\x26\xdc\x95\x8e\x42\x99\x63\x7b\xea\x9d\xc9\x94\x35\x9f\x47\x59\xcb\x30\x48\xe0\xdf\x45\x5a\x05\x59\x2d\x9f\x13\x59\xad\xd6\x64\xf5\x47\x20\xab\x21\x27\xab\xa6\xcf\x5d\x03\x81\x95\xa2\xe1\xd1\x83\x84\x47\xf5\x70\x5a\x59\xca\x6e\x55\x19\x23\x85\xa5\x11\x69\x0c\x63\x2a\x39\x2d\x9d\x4e\x41\xe6\x57\x6e\x62\x9a\xb6\x5b\x53\xc3\x40\x87\x6b\x8c\xa1\x3d\x39\x4c\x64\x72\x15\x4e\x3d\x6f\x63\x26\xb9\x62\x81\x06\xff\xa3\xce\xe5\x8b\x44\x55\x5d\x91\x87\xb9\xa0\x98\x07\xcf\x89\x62\x7e\x5c\x53\xcc\x1f\x81\x62\xbe\x65\x4e\xe4\x36\x2f\xe5\xcc\xee\xba\x2d\x53\x4c\x1e\x34\x34\xd0\x7d\xce\xad\xc1\x29\xbf\x57\xb0\x92\xe2\x60\x96\x0b\x75\x22\xc9\xe1\xe2\x74\xc8\xbb\x55\x0b\x75\x63\xe1\xfa\x78\xaf\x70\xa1\x5e\x75\x2a\x48\xde\x2d\x5a\xa8\x1b\x95\x31\x79\xa7\x7c\xa1\x4e\x2c\x7d\x24\xef\x35\x5e\xa8\x57\x92\x95\x88\x77\x61\xaf\xa7\xc3\x2c\x49\x60\x88\xbb\x28\x2b\x6c\xac\x9d\xbe\x2a\xc6\x7c\xb5\x99\x28\xd8\xcc\x01\xb3\x47\xda\x65\x35\xae\xaf\x1b\xe5\xc7\xb8\x44\xc2\xdf\xde\x9a\xcc\xdc\x2c\x9e\xd8\x8b\xaf\xf4\xc9\xb1\x94\x9e\xbb\xa3\x38\x89\x0a\x98\x8a\xe9\x48\x25\x11\x0c\x22\xfe\x93\x3f\xeb\xa6\x43\x0c\x59\x39\x1b\xa4\xfe\xba\x7b\x19\x87\xf6\x03\x99\xcf\xd7\x2f\xbb\x0f\x66\x44\x14\xbd\xd1\xda\xa8\x1f\xea\x58\xab\xd5\xbf\xdb\x89\x56\xaf\x7d\xc6\x4b\xad\x5a\xff\xaa\x87\x5a\xbd\xfa\x91\x4f\xb5\x5a\xf5\x33\x73\x57\xfd\xba\x5a\xde\x12\x67\x5a\x9d\xb4\x09\xb8\xaf\x3e\x5f\x95\x0c\x05\x49\xdd\x71\x4f\xab\x34\x3e\xed\x8e\x7d\xc6\xa2\xc1\x91\xd6\x40\xf9\xf0\xdc\x75\x9f\xaf\x88\xfc\xe9\xb9\xe3\xbe\x32\x34\xd1\xf9\x9d\xf4\xae\xfb\xa3\xf1\x0e\x78\x15\x37\xbc\x1b\x1d\xae\x35\x90\x60\x6b\x15\xdd\xb1\x8e\x46\xdd\x75\xed\xcd\x43\x27\x3a\x02\x7d\xe3\xb6\xf7\x27\xb8\xd4\x51\x68\x7b\xbf\xbd\x03\xf7\xa1\x8e\x41\x3f\x3e\xed\x1d\xb9\x4f\x75\x14\xea\x09\x6c\xef\xc3\x7d\xae\x23\xd0\x0e\x71\x7b\x17\xee\x33\x1d\x83\x4c\x07\xda\x3b\x70\xef\xea\xe0\x65\x52\xd2\xde\x85\x7b\xcf\x38\x70\x32\x35\x6a\xef\xc2\xbd\xa3\xc3\x37\x08\x5a\x7b\x2f\xee\xa3\x86\x93\x20\xe1\x68\xed\xc0\xbd\xaf\xe3\x50\xc9\x6a\x7b\x1f\xee\x4f\xc6\x61\x53\x28\x73\x7b\x67\xee\x77\xd6\x2f\x2d\x4d\x61\xb5\x6f\xa9\xdf\xce\x53\xcf\x89\xe8\xaa\x6b\x93\xf8\xfa\x42\xf9\x8f\xbf\x50\x0a\x93\xb8\x79\xa1\x54\x4c\x1e\x92\x9b\x51\x61\x8b\xbd\x94\xd8\xe3\x34\x3d\x82\xcd\x9c\xc8\x74\xba\xc5\xbc\x24\x3b\xc0\xb4\x94\x4b\x19\x2a\x0c\x23\x79\x1d\x62\xde\x34\x92\x0f\x06\xc2\x32\x4e\x36\x11\x3a\xcb\xe6\x46\x64\x97\xa9\x07\xdb\x7b\xb8\x5b\xa3\x7d\x9d\xca\xa6\xab\xb7\xae\xd7\x4b\xf1\x08\x56\x75\x79\x35\x1f\xc1\xa0\x5e\x7f\x90\x47\x31\xa8\x13\x73\xd5\xdf\x6b\x45\x6f\x95\xd0\xea\x61\x4a\xd4\xa2\xbc\xca\xf5\x9c\x58\x8d\x49\xa8\x28\x61\x7f\xb4\x80\x1c\xe0\x57\xf0\x27\x80\x10\x20\x08\x62\x08\x52\x08\x0a\x08\x12\x08\x32\x08\x02\x08\x4a\x08\x2a\x08\x42\x08\x22\x08\x72\x08\xc6\x10\xf4\x21\x18\x40\x30\x82\x60\x08\xc1\x04\x82\x2b\x08\xae\x21\xb8\x85\xe0\x02\x82\x1b\x08\x8e\x21\x38\x81\xe0\x12\x82\x43\x08\x4e\x21\x38\x87\xe0\x0c\x82\x5d\x08\xf6\x20\xd8\x81\xe0\x08\x82\x7d\x08\x3e\x41\xf0\x0e\x82\x03\x08\x3e\x42\xf0\x16\x82\x5f\x20\xf8\x0e\xc1\x17\x08\xde\x43\xf0\x01\x82\xcf\x10\xbc\x84\xe0\x2b\x04\xbf\x41\xf0\x07\x04\xbf\x43\xf0\x2b\x04\x7f\x42\x00\x11\x40\x08\xc4\x08\xa4\x08\x14\x08\x24\x08\x64\x08\x04\x08\x94\x08\x54\x08\x84\x08\x44\x08\xe4\x08\x8c\x11\xe8\x23\x30\x40\x60\x84\xc0\x10\x09\xae\x3e\x41\xcf\x89\xad\x5f\xa1\x35\x5f\xff\xa7\xf3\x75\xc2\x4a\x37\xaf\x91\xdf\x73\xea\xcc\x94\xc0\xe9\x53\x47\x4f\xa7\x24\x81\x74\xe9\x1f\xb4\xec\x1b\x11\x04\x6e\x91\xef\x06\x54\x83\x6c\x8d\x3d\x69\x16\x57\xf6\xe2\xd0\x5e\x1c\x29\xc5\x6a\x0e\xae\xd4\x94\x31\xc6\x76\x28\x7d\x7b\xf1\xc0\x0e\x7c\x64\x2f\x1e\x2a\xc5\x4c\x7e\x99\x50\x6d\xae\x9c\xdd\x93\x88\x23\x55\x01\xa3\x6d\x89\xc4\x32\x3d\xa7\x65\xc8\xd7\x0d\xe5\xb7\x0d\xe5\x17\x72\x39\x0b\x0f\x22\x7e\x1e\x1b\x69\xa0\xc8\x93\x42\x12\x17\xe6\xc4\xac\x83\x45\x9c\x45\x71\xe8\x00\x27\x0f\x8a\x60\x0c\x11\x2c\xe2\x5b\xc2\x5d\x84\x2b\x99\x35\xb9\x14\x79\xb6\xcf\x82\x88\xa4\xb3\x12\xab\xd5\x17\x3f\x87\xe8\x47\x48\x6b\xe1\xbc\xa2\xb5\xcd\x83\x82\xa5\x5e\x3b\x37\x10\x52\x07\x6d\xd6\xa4\xce\x37\xe6\x78\xe0\xcc\x3e\x34\xd0\x3c\x37\x0f\xec\x2e\xdd\x87\x23\xbe\xab\x9b\x00\xa5\xc1\xd4\xf1\xc0\x9e\xfa\x25\x76\xd4\x9d\x61\xda\x55\x1a\x7d\x7c\x8e\xac\x8b\x2a\x99\x61\xf6\xd5\x98\x34\x5c\xab\xc8\xc3\xd6\x80\xd7\xf8\x0a\x4e\x1a\x65\x85\xbd\x85\x2d\x57\x1d\x0f\x7a\xf3\x4e\xcd\xdb\xc6\x30\x5b\xd2\x3d\x39\x1e\x38\xb0\xb7\xd5\x8c\x40\x1f\xed\xad\x0c\xab\xcf\x5b\x7b\x3b\xdd\xcc\xf3\x8b\xbd\x99\x61\xd7\xf9\x6e\x6f\xa7\x19\x72\xbe\xd8\x5b\x29\x36\x98\xf7\xf6\x36\xba\xb1\xe4\x43\xc3\xca\x49\x7a\x28\x0f\x7c\xb6\x37\xd2\x95\x49\x1e\x78\x39\x73\x35\xa4\x86\x5f\xed\x0d\x35\x33\xc9\x6f\x33\x06\x27\x35\xfb\xc3\x4e\xff\x7e\xb7\x9c\xde\x6d\x91\x87\x0b\xfc\xaa\xd7\xab\x19\x05\xff\xd4\xab\xe5\x1c\x8d\x1e\x80\x50\xaf\x17\xc1\x9b\x70\x3d\x82\xe6\xa9\x10\x6f\xb1\x3d\x10\x5b\xea\x85\xdf\x94\x07\x52\x03\x7e\x01\xc3\x6c\x3c\x86\x69\xc4\x02\x44\xf1\xe3\x55\x40\x93\x3e\x88\x03\x44\x53\x1c\x46\x3c\x25\x7a\x02\xe9\xaa\x8e\x83\xfc\xad\x3e\x6b\x6b\x0e\xf5\xcc\x04\xaf\xf6\x91\x7e\x7d\xd6\xba\x77\x7a\xdf\x1c\x0f\x04\x26\x04\x69\xb1\xd8\x08\x45\x4c\x06\x0f\x94\x6c\x8c\x41\x8a\xdb\xd2\x5c\x97\x2c\x20\xc4\xbe\x14\x08\xd0\x19\x05\x75\x27\xa9\xd8\x03\xd5\x6c\x7c\x77\x14\xa1\x14\xf5\x00\xc4\xe5\x09\xdd\xcc\x98\x30\x86\xed\xba\x47\x50\x23\x77\x94\x56\x8b\xec\xd9\xb9\xe5\xd3\xcb\xe9\x81\x05\x83\x51\xd2\x83\x4d\x3d\x30\x36\x47\x66\x24\x02\x05\x46\x51\x47\x64\x9b\xf2\x40\xdf\x04\xc1\x13\x2f\x0e\xa0\x5d\xee\x18\x99\x7d\xf2\x60\x92\x64\x01\xfe\x56\xc3\x86\x4e\x93\x86\xf2\x2b\xd8\x22\x17\xc5\x04\xf1\xd7\x57\x43\xb2\x05\xae\x21\xd3\x6a\xf0\x1a\xca\x78\x6f\x8d\xf2\x5a\xae\xc0\x17\x2d\xad\x8a\x7e\xa1\x1b\xb3\x0b\x0f\x24\x74\x6c\xd4\x05\x49\xb2\x83\x8e\x53\x2c\x74\x9e\x18\x95\x75\xac\x9d\xcb\x86\x1a\x25\x54\xce\xa1\xd1\x48\x09\x68\x71\x6a\x54\x2b\xe1\x3a\xce\x4d\x14\x92\xf6\xe2\xcc\xec\x0c\x51\xe0\xe0\x1b\xa5\x3e\x57\x2e\x4a\xec\x99\x75\xaa\x6c\xb1\x63\x34\x90\x84\x2f\x7c\x47\x6d\x00\xbd\x07\x51\x10\x27\xa5\x83\xef\xb0\xb3\x30\xf0\x76\x9f\x6c\xed\xc8\x1e\x7f\x67\xae\x19\x57\xa5\x1f\x98\xc3\x0b\x50\x10\xc2\x14\x61\x7a\x86\x2f\xcd\xfa\xe7\xe7\xc4\xd2\xc1\xf7\x69\x63\x39\x99\x67\xd8\x2f\x46\x55\x5c\x9e\x60\x71\x20\x48\x1c\x7c\x03\x6f\x82\xba\x9b\x55\x78\xc8\x5f\x9a\x5b\x48\xd6\xd5\xf7\x46\x2b\xd5\x38\xfa\xc1\xb6\xa3\x14\xdb\xe6\x67\xa3\x85\x66\x9a\x7c\x69\xae\x9d\x66\x59\xfc\xca\x5a\x6c\xf0\x16\xaa\x61\xf0\x37\x03\x82\x6c\x75\xfb\xc3\xa8\xd5\xac\x7e\xbf\x9b\x2b\x21\x9b\xbd\x7e\xb5\x6c\x20\xcd\x6a\xf5\x67\xd3\x1c\x45\x13\x88\x8c\x5d\xa0\xd8\x8c\x90\x51\xaf\x59\x64\x62\xa3\x01\xb7\x99\xa4\x4d\x55\xa5\x03\x0a\xa3\x4e\x61\x96\x89\x65\x58\x42\xac\x00\x99\x51\x2d\x4b\x15\x20\x30\xaa\xa5\xf0\x2e\xa5\x51\x49\x64\x89\x53\x84\x6f\x7e\xa0\x32\x6a\x55\x79\x42\xda\x83\xe1\xac\x29\xe8\x1c\xde\x01\x91\xd1\xdc\x1e\xc7\x29\x37\xc7\x57\xe5\x44\x6b\xb8\x27\x2f\xc1\xd8\x68\x66\xb2\xb8\xbe\xd1\xa6\xe6\x47\x60\x60\x54\x9d\xa7\xf0\x7a\x0f\x0e\x88\x96\x02\x7f\xbd\xd1\x9c\x16\x1f\x4e\x8f\x8f\x1c\x30\x44\x52\x8c\xbe\x38\xfa\x1a\xa3\xd1\x51\xbd\xd6\x5c\x47\xfe\xd7\xcb\x3b\xc4\xa3\xf5\x1d\x44\xd3\x7f\xb3\xdf\x72\x9c\x3d\x21\xf3\x91\x60\x7b\x6f\xde\x38\x8c\xdd\x39\xd3\xbf\xea\xd8\x7e\xf5\xae\xd3\x94\xef\x35\xe1\xbc\xbf\xa7\x3f\x65\x22\xb9\xb5\x45\x43\x00\x0a\xd2\xcb\x81\x25\x31\x4c\xd1\x29\x61\x34\x22\x2f\x2e\x53\x88\xd4\x69\x71\x31\xcb\xbb\xbf\x17\xda\x11\xb9\x9c\x00\x42\x45\x3c\x1e\xc3\x08\xcf\x59\x1b\x15\xcd\x7f\xab\xdd\x6b\xdf\x90\x2a\x3c\xd9\x4e\x01\xc9\xf3\x10\xf7\x55\xe7\x5f\x6f\xfe\xbf\x57\xaf\x80\xe3\x78\x5d\x5e\x4b\x60\xe3\x31\x27\xc1\xe4\x6c\x92\xeb\xb0\xeb\x19\xbf\x11\xfc\xa8\x6b\xce\xfd\x8d\xc6\x91\xba\xda\xd0\xe1\x38\xc7\x7b\x86\xc1\xa7\x7a\x22\x28\xe6\xb7\xd1\x34\x1b\x8e\xd3\x13\xf8\xb7\x09\x63\x61\x28\x94\xc6\xea\x25\x5d\x1b\x93\xd2\xed\x81\xb3\xba\x46\x9d\x38\x0d\x93\x2a\x82\xa5\x0b\xd9\x0a\xe3\xf1\x77\xb9\x2c\x49\x57\x93\x1e\x44\x6d\x25\xa5\x1b\x00\x91\xf4\x5d\x87\x5f\x01\xb8\x3a\x91\x98\x74\xfd\x9f\x5d\xd8\xc9\xab\x72\x84\x45\x2d\xe4\x01\xe8\x79\xa0\xf7\xcd\xeb\x54\x69\xfc\x9d\xc5\x92\xd4\x2f\x05\x1a\x2a\x89\x3a\xd4\xb8\xcc\x6b\xc4\xd2\x48\x6d\xb2\xbd\x86\x58\x96\xca\x9b\xf3\x38\x4b\x17\x0b\x96\xab\x99\x12\x14\x05\xac\xb2\x49\x24\xb8\x6c\xaf\xbc\x80\xf7\xf7\x1c\x1c\x93\xf5\x1d\xef\x4d\x5a\x25\x49\x17\x76\xca\xac\x40\x78\xd6\xb2\x60\xe6\xd1\xd6\x49\x50\x22\xaa\xea\x74\x64\xdc\xc6\x65\x66\xd6\x10\xe2\x81\x6b\xc7\xef\xd5\x1a\xe0\x2a\x49\x98\x3a\x14\xf9\xb0\x33\x88\x13\x04\x0b\x3c\x20\x2b\x21\xf6\xf8\xfe\x7f\x83\x16\x1d\x7a\xad\x62\x27\xc9\xb7\x29\xab\x15\xf4\x58\x1f\xbb\x4e\xaf\xf1\x04\xf8\xe0\xf9\x4d\xa4\x1e\x3c\x9c\x0e\x20\x0a\x47\x9f\x02\x89\x04\x2f\x62\x84\x74\xbc\x8e\xa5\x23\xa5\xd9\x24\x5d\xdb\x09\x3b\x6b\x8b\x02\x53\xfa\x50\x38\x25\xca\xf2\x05\xbb\x93\xa6\xb4\x57\x9e\x04\x8b\xce\x80\x34\xa5\xbd\x8a\x6a\xd1\x4e\xb8\x25\xed\x53\xe5\x51\xb0\x40\x12\x6e\xda\x8d\x35\x66\x63\x0c\x88\x65\x41\xfd\x70\x2a\x1f\x24\xfa\x72\xb4\x81\x8a\x09\x6b\x15\xfb\x98\x35\x76\x68\x57\xe8\x6d\x50\x6c\xf8\xb3\xda\x18\x68\xec\x11\x06\xda\x89\xcb\x23\x78\xcd\xf2\xaf\x97\x10\x1d\x44\x6f\x27\x27\x94\x59\xbb\xb8\x89\x9f\xd4\xd7\xbf\x4e\x01\xcb\x2c\xb9\xc2\xa0\xa7\x21\x66\x4a\x6e\xec\xdd\x21\x7f\xf6\xfa\x91\xb1\x58\x06\xef\x75\xd0\x08\xa6\x84\x0c\xdc\xcd\x1e\x27\x64\xe3\xd4\xc6\x06\xbd\xa9\xe7\x4d\xeb\x75\x9d\x12\x51\xaa\x7e\x7b\x26\x1d\x3b\xdf\x8f\xb7\xb6\xdc\xd8\xff\xeb\x30\x48\xab\x20\x49\x26\x9b\xa4\x65\xb4\x89\xb2\xcd\x97\x77\x68\xba\x39\x28\xb2\xf1\x26\x1a\xc1\xcd\xa3\x6c\x1c\x44\x9b\x9f\x0f\xfe\xaa\xf1\x35\x6d\x24\x82\x89\x08\x26\x14\xdd\xb4\x66\xf1\xd4\x03\x67\x91\x4f\xcd\x7b\xd4\x60\xbc\xa9\x31\xbd\x3b\x41\x30\xb8\x60\x73\x7f\xcf\x85\x13\x10\xb3\x0a\xe9\x33\xf3\x2b\x74\x2c\xd6\xcc\x75\xce\xe3\xe8\x2d\x1c\x64\x05\x3c\x0d\xae\x48\x30\x3e\xb2\x4b\xe8\x7d\x3f\x1e\x4c\xdc\x5e\x0c\xd0\x37\xcf\x63\x04\x2a\x95\x3f\x68\x0e\xe1\xe5\x27\x18\x66\x45\x24\x0b\x4a\x00\x79\x1b\xa9\xd8\x31\x4a\x55\x8a\xbf\x09\x99\x8b\xeb\x49\x1f\x36\x8e\x4c\xb4\xb2\x64\x06\x04\xfb\xe6\xc0\x88\x3c\xe2\x78\xd2\x9c\xbf\x79\x33\x92\xee\xb3\x4b\x08\x4d\xae\xcf\x28\x30\x90\x33\xf1\xf3\x8c\xfb\xf8\xa2\x21\xe5\xdb\x6f\x4e\xa2\x4f\xb8\x37\x0c\xb3\x08\x46\xf5\x77\xe1\xdf\xf7\x3a\x4e\xa3\xec\xba\x13\xa0\xac\xef\x32\x59\x81\xb4\xb8\xbf\x77\x1c\x6f\x3a\x05\xd7\xd0\xbf\x42\xee\x15\x54\x43\xac\x50\xa5\x48\x7b\x0f\xda\x5b\x0b\x74\x16\x72\xa6\xb5\xeb\xec\x85\x05\x36\xdf\x59\xed\xfd\x66\x6f\x2c\xe0\x59\xd0\xe6\xd6\x0e\xb3\xc7\xb6\xa1\x8b\x68\xd3\xad\xfd\x65\x4f\x2c\xf0\x25\x45\x53\x7b\x77\xd9\x4b\x0b\x82\xd5\x25\xd3\x3f\x6c\x84\xbe\xe2\x7c\xfa\xa7\x16\x44\x6a\x14\xd8\xd6\xae\xb3\xe7\x16\x14\x6a\x9c\xdc\xd6\x9e\xb3\x67\xb6\xe5\x92\x5d\x8f\x5a\xfb\xcd\xee\xda\x26\x41\x14\x80\xed\x5d\x66\xf7\x6c\x67\x81\x2b\x11\xdb\x7b\xcc\xee\xd8\xe0\xab\x8a\xc8\xf6\x4e\xb3\x47\x16\x24\xb2\x32\xb3\x7d\x30\xe4\xfd\x19\xcb\xc4\x15\x9d\xed\x83\x22\x7f\x9a\xb7\x5a\x02\x57\xeb\x00\xc9\x06\x22\x4d\x3d\x42\xa3\x24\xcf\xcb\x4c\x3f\x1b\x84\x07\xe4\x7a\x0b\x4e\x49\x6b\x42\xe3\x26\x2f\x87\x4f\xee\xbe\x10\x2e\x49\xa9\xb2\x58\xe6\xfd\xd9\x20\x74\x9c\xef\xec\xdf\x8f\x68\xbb\xda\x07\x56\x3e\xb0\xd1\x4b\xb1\x7a\xa7\x2b\xdf\x11\x92\xf6\xc8\x01\xbd\xf3\x65\x57\x4b\xee\x3e\xf7\xeb\x48\xda\x24\x07\xf4\xce\x96\xc5\x25\x77\x9f\x8b\x4b\x56\x2d\x39\xa0\xb7\xbb\xf4\xc4\xe4\xfe\x3a\xb6\x8f\x36\x62\x24\x9b\x2e\x7a\x7b\xad\x63\xfa\xdb\x84\x23\xc9\xfc\xd1\xdb\x69\x1d\xd4\xdf\xca\xd4\xea\xc7\xf5\x47\xad\x43\xf9\x5b\xc0\x4b\x66\x98\xde\x7e\xeb\x68\xfe\xb3\x56\x88\x99\x72\x7a\x9f\x5a\xc7\xf6\x9f\x85\x45\x7e\x6c\xf7\xae\x75\xb0\x7f\x0b\x26\xed\xbd\xdd\x41\xeb\x80\xff\x76\xb9\x4f\x7d\x72\xf7\xb1\x75\xdc\x7f\xdb\x8d\x47\x7b\x75\xf7\xb6\x75\xf0\x7f\x1b\xa5\xd4\x1f\xde\xfd\xd2\x3a\x07\x80\x05\x8b\xf6\xf6\xee\x7b\xeb\x4c\x00\x16\x1c\xca\xe3\xb8\x2f\xad\xb3\x01\x58\x30\xe8\x0f\xfc\xde\xb7\x45\xf2\xab\xed\xa4\x28\xaf\xe4\x3e\xb4\x45\xf1\xa7\x55\x44\xd3\x1f\xca\x7d\x6e\x8b\x06\xa2\xc6\xfd\x2b\xa1\x79\xd9\x16\x0d\xb2\xa0\xd1\x9e\xcb\x7d\x6d\x8b\x23\xb6\xe0\xd0\x1f\xb4\xfd\xd6\x16\x49\x6a\x41\x22\x9e\xad\xfd\xd1\x16\x7c\xd1\x0c\x1e\xef\xaa\xdf\x5b\xc7\x9f\xb1\xc0\x57\x4c\xc1\xbd\x5f\x5b\x47\xe4\xb2\x7e\x6a\xc9\x96\xda\xfb\xb3\xf5\x43\x10\x0b\x0a\xc5\x24\xdd\x83\xb0\x75\x6c\x34\x0b\x0e\x39\x6d\x09\x6a\x8d\xa1\xb2\x60\x90\x8d\xe3\xbd\xb8\x35\x8a\xd0\x76\xba\x9b\x2c\xec\xbd\xb4\x35\x3e\xf3\xc3\xd7\xf6\xf8\x5e\x01\x97\x96\x81\xb9\xb3\x9f\x2a\x91\x46\xb3\xf7\xb0\xe9\x0b\xd0\x4b\x56\x3f\x31\xc3\x96\x08\x7a\xd9\xd2\x33\xb4\xf8\x35\xce\xbf\xf4\x99\xbe\x85\xa0\x17\x2c\x8d\xba\xc1\x49\x51\x45\x9f\x5b\x56\xba\x21\x1d\x56\xb9\xfa\x25\xd6\x0d\xa2\x0e\xe8\x55\x4b\xcf\xd3\x00\x32\x77\x89\x1b\x1d\x3b\x7b\xe1\x03\xb1\x9b\xb0\xf4\x41\x8c\x6d\xa4\xc0\xe6\x87\xd2\x8b\x5a\xaf\x73\xdf\x82\xcb\x74\x66\xe9\xe5\xab\xff\xa0\x86\x8d\xd6\x01\xbd\xf1\xd2\x6b\x6a\x42\x99\xfb\x49\x25\xd3\x89\x03\x7a\xfd\xa5\x51\xca\xfd\x75\x64\x03\xcb\x72\x72\xbf\x9f\xde\xe0\x11\x48\xaa\x62\x9b\x71\x40\x6f\xb4\x3c\x65\x55\x41\xe8\x53\x1a\x59\xa6\xa4\xfb\x2b\xf5\x86\xad\x67\x36\x9c\x8b\x86\xda\x42\x7b\x93\xf6\x8b\x08\xe5\xa7\xa3\xb7\x68\xd6\xdb\xd1\x24\x1e\xc0\x70\x12\xb6\x8c\x13\x2a\x25\x5f\x59\x65\xa2\x95\x0d\x33\xfa\xf1\x73\x78\xf9\x98\xaf\x1f\x3e\xfe\xd3\x1f\x3e\x26\x10\x6d\x8e\xe7\x24\x59\x41\xf6\x24\x2b\x96\x30\x07\x7a\xac\x82\x65\xe2\x8d\x45\x92\x27\xb3\x08\x56\x50\x97\x8e\xb2\xec\x52\x84\x2a\xa8\x4b\xcb\x38\x82\x61\x50\xf0\x38\x05\x24\x66\x40\xae\x3e\x63\xa7\xf0\x56\x11\x12\x59\x03\x4c\x87\xd4\xfe\xe1\x7d\xa8\x03\xe6\xb3\x5a\xf1\xdb\xfb\xf1\x2c\xfa\x29\x5f\x92\x1e\x16\xb6\x74\x1d\xb3\x7e\x4d\x08\x9f\x37\x21\x14\x31\xeb\xeb\x04\x43\x1e\x71\x07\xe2\xa1\x95\x75\x3a\xd8\x98\x83\xea\xe1\x64\x30\x54\x9e\x1e\xe9\xa1\xe8\x47\x41\x39\x32\x03\xd0\x47\xb2\x47\xc4\x8c\x00\xf4\xcc\xeb\x66\xf5\x01\xe8\xe9\xb0\x1e\x21\xec\xbc\x32\xb3\xbf\x33\xec\x7c\x0a\xd1\x75\x56\x5c\x3e\x45\x61\x52\x8e\x3a\x22\xe8\xe9\xf0\x39\xd1\xd3\xc9\x9a\x9e\xfe\x08\xf4\xf4\x8a\x09\x96\xa6\x00\xb9\x90\x5c\xa9\x26\xef\x33\x8b\x4b\x7b\xfc\xac\x3a\xc8\x06\x0d\x3a\x80\xe5\xab\x87\x53\xe3\x21\xa7\xb0\x34\x26\x48\x1d\xf7\xaa\x2e\x0f\xe3\xa8\x10\xc9\x60\xeb\xd2\x38\x17\xb9\x60\x87\xe2\xa1\x25\xe4\x99\x60\x45\x69\x3f\xc6\x94\x65\xa0\x15\x33\x82\x33\xe2\xa4\x3c\xf2\x27\x6e\xa8\x12\x46\x3a\xa0\xf6\x34\x37\xd7\x41\xd3\x39\xb5\x27\xb6\x63\x1d\x30\x5e\x96\xf6\x22\x6d\x5f\x07\x4b\x57\xb6\xbd\x9f\xea\xc0\x00\x4c\x3f\x4e\x7b\x2f\xd5\x91\x0e\x99\x7d\xdf\xf6\x0e\xaa\xa1\xcc\xd0\xae\x66\x32\xb4\x2c\x82\xdb\x54\x37\xff\xf0\x54\xb4\xab\x08\xb8\xd5\x26\x13\x81\x60\x77\x17\xcf\x89\xdd\xdd\xac\xd9\xdd\x8f\xc0\xee\x8e\x59\xa6\x81\xc2\xd4\xa3\x64\x0b\x87\x4a\x0a\x9a\xa2\xff\x88\x56\x1d\xd1\x77\xd1\x50\x53\xb5\x8a\x46\x0b\xbb\xf3\xe2\xa7\xa9\x1e\x7d\x6a\x56\xcb\xc8\x8e\x2a\xb7\x05\x87\x1a\x1b\xf3\x60\x46\x33\x12\x92\xea\xe1\x21\x2d\x2f\x94\xa4\xbb\x35\xe3\xac\x4b\xe5\xc0\x7e\x23\xad\x8e\xae\xe3\x50\x2b\x8d\x20\x82\x21\x51\x69\x4c\xb4\x9a\x7a\xbc\xe0\xca\x5a\xa1\xb8\xa1\x5f\x6b\x4d\xe8\xfb\x28\xea\x7a\x7d\x2b\x3d\xfe\x15\xe3\x3b\x1d\x65\x85\xf1\xda\x8d\x3c\x2a\x69\xf8\xd0\x8c\x5e\x90\x55\x1d\x42\xe4\xb9\x10\xfc\x45\xe9\x79\x87\xbd\x14\x26\x6f\x62\xff\x62\x2f\x1e\xc9\x18\xd5\x67\x27\xf4\x9d\x0f\x9b\xd6\x9b\xda\x22\xe3\x74\x99\xbb\x90\x33\x9d\x82\x81\x7f\xe3\xf6\x95\x2b\x23\x65\xae\xad\x85\x81\x91\x0e\x58\xfe\x52\xed\x85\x82\x46\xe0\x64\x99\xa9\x74\x30\xcf\xd8\x32\x13\x82\x07\xfa\xb2\xad\x65\x68\xac\xd3\x8a\x1e\xb4\x4c\x74\xc0\x62\x7f\xb6\x97\x16\xae\x74\xe0\x7c\x8b\xb7\x7f\xce\x72\x6d\x87\xad\x3e\xd6\x68\xfd\xa8\xe5\x56\xc7\x22\x1f\xb4\xf6\x4f\x5a\xac\x53\xa8\x0d\x90\xe3\x25\xb7\x90\xdc\x5b\xdb\x3e\x7d\x59\x6c\x3b\x9e\x2b\xb6\xc1\x2b\x6a\x75\x5d\x44\x2f\xbb\x8c\x38\xf7\x77\x89\x6f\x1b\xe6\xc5\xff\x39\x88\x6d\x57\x6b\xb1\xed\x47\x10\xdb\xae\xe7\x88\x6d\xa6\xc0\xb3\x48\xd0\x4f\x5d\x02\x63\x62\x51\xa8\x86\xa1\x8b\xe8\x4b\x1a\x16\x52\x8d\xc4\xfc\x7c\xb8\xb2\x62\xa2\x88\x46\xb5\x52\x62\xc2\x83\x35\x95\x65\x30\x84\x42\x33\x31\x11\x31\x9e\xea\x08\xa7\x7d\xad\x2a\xaa\x1f\xfa\x0c\xb4\x0a\x44\x08\xee\x48\x6f\xce\xae\x97\x43\xae\xb7\xc8\xfd\x2b\x37\x7a\x0c\x79\x62\xac\x03\xe6\xd3\x5b\x85\x86\x41\x83\x2d\xad\xd0\x2a\xd4\x0c\x1a\x74\xbe\xc8\xab\x50\x34\x68\xb0\xe9\x77\x6a\x2f\x39\x0c\x8d\x41\xd7\x9a\x84\xd6\x82\x43\x24\xf3\xc2\xeb\x79\xbc\x70\x06\x17\x7c\xac\x24\x8b\x2c\x3e\xf8\x8c\x5c\x8b\x58\x42\xdc\xae\xaa\x38\x32\x9b\xc5\xf9\x76\x1e\xe0\xc1\x36\x46\x14\x07\x01\x65\x2e\xff\xc9\x88\xe2\x92\x7f\x0a\x7c\x4e\x1c\x3a\x87\x6b\x16\xfd\x23\xb0\xe8\x31\xf4\xdd\x47\x08\xa9\x2d\x1c\x57\x72\x7b\xf3\x07\x84\xd4\xce\xa4\xec\x86\xc4\x74\xbc\x50\x44\x6d\x11\xe9\xb2\x21\xd0\xe5\xac\x00\xda\x0b\xe9\x95\x6e\x17\x6e\x79\x61\xb4\x2c\x60\x99\x55\x45\x48\x6a\x6f\x66\xd6\x1e\x1b\xb5\x51\x11\xc4\xe9\x76\x89\x8a\x00\xc1\xe1\x44\x44\xe2\xae\x23\x9a\x96\xe1\x08\x46\x55\x12\xa7\xc3\xfd\x24\x1e\xc6\xfd\x38\x21\xf1\x0f\x1c\x48\x7e\x91\xf0\xb5\x97\x75\x96\x44\xa1\x4a\x42\x28\xdf\x89\xa2\xa2\x8e\xc2\xdd\x54\x79\x3a\xab\xf2\x7c\x56\xcc\x5e\x29\x70\x2a\x61\x3b\x53\x16\x6d\x1b\x35\x84\xae\x65\x81\x67\x43\xf5\x5d\xee\xee\x02\x5d\xe4\x80\xaa\x7b\x0b\xb4\xbf\x8b\xcb\xc3\x78\x58\x04\x28\x4e\x87\x80\x77\x9e\x3a\x2c\xea\xf6\x83\x7a\x03\x1a\x8d\x00\x5f\xa3\x31\xa0\x23\x7b\xf8\x6e\xd9\x84\xc0\x02\x71\x37\x34\xa2\x17\x56\x16\x87\xdb\x6c\x33\xca\x4a\xb4\x7d\x95\x25\x15\x79\x92\xfb\xce\x18\x36\x7b\x42\x50\x87\x1b\xae\x35\x20\x3c\xde\xb6\xdc\x94\x55\xee\x29\x5d\x84\xaa\xf1\xa3\xd1\x43\xf7\xde\x67\x5d\x68\x00\x97\x3a\x06\xb7\xd4\x3e\x2e\xf7\xf0\x16\x26\x21\x5a\x9c\xb8\xdc\xaf\xf7\x25\x10\xb1\x6e\x7f\x79\x48\xa7\xef\x2d\x42\xd7\x46\x50\xd1\x69\x7e\xa9\xdd\xe2\xa0\x11\xa4\xd4\x01\xef\xf5\x4a\xfc\x85\x98\x4e\xe3\x83\x5e\x27\x8f\xfb\xb3\x5e\xd9\x70\x54\x5f\x1a\xed\xd8\xcb\xf6\xaf\xf6\x0a\x45\x25\xf4\x9b\xd1\x06\x0b\x53\x07\x91\x03\xfe\xd0\x6b\x94\x88\x19\xbf\xeb\xb5\xfc\x35\xd7\xaf\x7a\x0d\x3f\xf2\xe0\x4f\xbd\x0a\x25\xe5\x7e\x8a\x99\x72\xe4\x10\x19\x49\xad\x95\xa5\x40\x64\xd4\xd2\xd8\x17\xb1\x51\x2e\xc8\x21\x96\xb6\xcc\x4a\x58\x5c\x61\x74\x85\x51\x47\x28\xe5\x69\x4d\x28\xb1\x90\x66\x7c\x1c\xb1\x8f\x32\x73\xb4\x32\xf5\x0a\x2c\xd0\xd9\x83\x97\xd2\xa8\x22\xa7\xb5\x74\xb0\x28\xa8\x2f\x5d\x56\xa2\x2f\xe4\x9c\x96\x0e\x08\xa1\xac\xc8\x8e\xa2\x02\x4a\xba\x65\xf7\x35\x08\x04\xe7\xa3\x8a\x66\xb6\xee\x5e\x87\x35\x26\x1d\x73\xaa\xf6\x5e\xa0\x17\x6e\x49\x23\x66\xd6\x6f\xb2\x5d\x2d\x5c\x96\xd2\x81\x34\x55\x9e\xd7\xd2\xc5\x98\x11\x60\x50\x04\xb7\x53\xe8\xb6\x78\xa5\xcb\xe2\xec\xc9\x2f\x83\x97\x00\x2a\x51\x76\x02\x66\x5c\x13\xde\x65\x00\xb1\xe8\x83\x1c\xd6\xd6\x16\xfe\xc1\x69\x38\x8f\x42\x58\x22\x5a\x46\x74\xa1\xba\x5d\x61\xde\xf8\xc0\x8b\x9f\x3c\xa5\x82\xc3\x77\x3c\x2d\xac\x1f\x51\xb5\x4a\x42\x6b\xef\xf5\x37\x12\x93\x8f\x87\xe0\xeb\x48\xbc\x84\x06\xa5\x52\x28\xb4\x36\xe1\x9a\xd4\x0b\xe4\x82\xdc\x2f\x12\x2f\x52\xa7\xff\x52\xbc\xc2\x5a\xb7\xfd\xe2\x27\x2b\x24\x12\x1f\x44\x83\x66\xf0\x06\x16\x82\x92\x32\x07\xbe\xc3\xb2\x32\x46\x50\x0f\x8a\x1a\x65\xd7\x29\x0f\x7d\x4a\x29\xdd\x1b\x5a\xd8\x65\xb1\xeb\x6a\xd2\xfa\x86\x1e\x75\x62\x7b\x61\x55\xf5\xc1\x7e\x23\xf5\xee\x3a\x71\xca\xa5\x20\x1b\xee\x83\xd0\x88\x6e\x28\x90\xdc\xdf\xbf\xd0\x61\x3b\x41\x02\x0b\xb4\x1d\xc6\x45\x98\xc0\xed\x41\x9c\x24\x4e\xd7\x3e\xec\x30\x48\x43\x98\x68\x2d\xb9\xfc\x8f\x07\xae\xf7\x20\x6c\x1f\xb7\xd0\x3a\x85\x23\x18\x5e\x2a\x65\xd3\x12\xa2\x7a\x48\xc6\xe8\xf9\x58\xcd\x48\x7e\x5e\xd7\x15\x31\xda\x16\x90\x1a\x1b\x82\xda\x11\x69\xce\xeb\xc8\x83\x20\x54\x8d\x46\xb5\xe3\x0b\xde\x3c\xb2\x05\x46\x21\x7d\xb7\x05\xc6\x21\x21\xa5\x23\xe9\x5a\x26\x3f\x25\x5b\x06\xdf\x58\x67\xc7\xec\x63\x60\x69\x6b\x42\xc4\x21\x0b\x61\xb9\xb7\x14\x00\xa9\x4b\x0d\x85\x6e\x0a\x5a\xb6\x20\x14\xb9\x4b\xad\x12\xfc\xe2\xe7\xd0\xfd\xfe\x18\xb6\xb3\xf7\x06\x64\x59\x0e\x6a\xaf\x04\xfb\x60\x8e\x5c\x88\x52\xed\x15\x61\x9f\x0d\xf0\xb2\x34\xd6\xde\x76\xf6\xd2\x80\xdf\xb0\x7f\xdb\xdb\xd1\xbe\x9a\xa8\x56\x16\x18\xee\xb7\x06\xd8\x2b\x0e\x0b\xf7\x87\x89\xa6\x96\x4c\xdb\x07\x84\xfb\xdd\x00\xbe\xe2\x70\x70\xbf\x1a\x08\x44\xb4\x83\xd6\x91\xe0\xfe\x34\x80\x0b\x11\xbb\x7d\x2c\x38\x08\x0d\xf0\xb2\x98\xde\x3e\x18\x1c\x32\x11\x28\xce\x08\xad\x03\xc1\xc5\x26\x02\x16\x28\xaf\x75\x04\xb8\xd4\x04\x2d\xdd\x37\xda\x87\x7e\x2b\xac\xf0\xd9\x95\xa5\x7d\xb4\xb7\xc4\x04\xaf\xdd\x7a\x7a\xc7\xad\x7d\xfc\x4d\x1c\xf2\xc5\xa9\x77\xd2\xda\x61\x56\xdf\x3c\xf4\x76\xb3\x58\x24\x37\x6b\x4f\x0f\x7c\x57\xde\xef\x6b\x08\x72\xea\xc2\x72\xb8\x24\xf4\x9c\xfa\xad\xcc\x04\x2d\x87\xbb\x3a\x5d\x12\xbe\xe8\xab\x21\x09\x2c\x07\x4c\x09\x56\x72\xbe\xea\x4f\x60\xb9\xf6\x2d\x16\xbe\x6d\x2e\x94\x39\xeb\x67\xde\x0c\x17\x8b\xe4\x36\x0f\xc8\x1c\xb4\xb6\x9b\x24\x0d\xe9\xb6\x14\x62\x2b\x98\x39\xa8\xb5\x9b\x26\x0d\xf3\xb6\x14\x56\x1d\x82\x86\xb0\xb4\xd1\x88\x3a\x58\x47\xeb\x98\x6f\x95\x09\xbd\x56\x7f\xb4\x8f\xf7\x16\x9a\xc0\x15\x0d\x4a\xfb\x58\x6f\xc6\xca\xa8\xd7\x5f\x1a\xe4\x6d\xa9\xaf\xa1\x43\x98\xf3\xf9\x2d\x01\x54\x0e\x96\xc4\x68\x09\x9f\xb2\x0c\x4a\x72\x6f\xa7\x31\xe0\xda\xa0\xa5\x60\xe6\xa0\xd6\x2e\xdc\x34\x28\xdc\xd2\x34\x45\x86\xb0\x1c\x42\x7c\xc3\xa7\x31\xe2\xda\x20\x25\x50\x34\xc4\xdf\x95\x87\xc1\x70\x96\xd9\x3d\xaf\xe3\xc6\x6c\x0f\x68\x44\x94\xd5\x3c\x8a\x5b\xe4\xb9\xf0\x3c\x83\xb8\xb0\x5b\x5f\x3e\x27\xb3\xf5\xe1\xda\x6a\xfd\x23\x58\xad\x4f\xf9\x73\x62\xdd\x9c\x5b\xd8\x5f\xae\x25\xf6\xe2\xcc\x5e\xac\xbc\x8a\xd3\x5e\xc3\x31\xbb\xb8\xf8\x19\xaa\x3f\x23\xf5\x67\xae\xfe\x1c\xab\x3f\x75\x77\xfd\x65\x7c\xd2\x2e\x15\x43\x55\xed\x46\x76\xc9\x93\xc5\x05\x09\x2c\x43\x18\x89\x90\x54\x23\xad\x49\x9a\x45\xb0\x64\x31\x98\xf0\x25\x64\x68\xad\xbf\x19\x05\x55\xa9\x78\xf1\x2b\xf5\x3b\x57\x41\x9c\x04\x44\xfe\xbf\xd2\x87\x80\xa7\xf6\x8e\x68\x8d\x71\xf7\x6b\x63\x84\x78\x86\x41\x9c\x22\xd1\xe6\xd6\x06\x42\x1a\xc2\x85\x56\x1f\xc5\x63\x98\xe2\xcb\xb7\xd4\xe6\x46\x6b\xf3\xbd\xca\x50\x20\xd5\x1f\x6b\xf5\x65\x98\x91\xe5\x39\xe1\xae\x75\x03\xff\xd0\xea\x82\xde\xfa\x75\xf7\x48\x07\x6c\xf9\x4a\xed\x9f\x1d\x0e\x8d\xe1\x6b\x1f\xba\xbd\x8f\xe0\xc4\x8e\x42\x2c\x72\x7b\x57\xc1\x2b\x2b\x0a\x69\xbb\xb5\xf7\x17\xbc\x36\x3e\x87\xba\x63\xdb\xeb\x4d\x6f\xcd\x0f\x6e\x6e\xfa\xf6\xea\xd3\x0b\xeb\x44\xe4\xcf\xd1\x5a\x85\x7a\xa3\xa3\xb0\x1d\xbd\xf6\x9a\xd4\x63\x1d\x8d\x7e\x7a\xdb\x6b\x50\x4f\x74\x14\x35\x01\x68\xaf\x40\x55\x1e\x1f\x9c\xce\x96\xfc\xaa\x61\x9c\x2e\xe2\x72\xb9\xa2\x97\x04\x73\xa2\x1d\x34\x79\x44\x0a\x31\xf0\xfc\x39\x89\x81\x67\x6b\x31\xf0\x47\x10\x03\x77\x59\x14\x84\x39\xe1\x63\x98\x9c\x67\xb6\x0a\xec\xc5\xa5\x1a\xb2\xab\xf6\xad\x2a\x51\x56\x04\x43\xb8\x1d\x66\x29\x2a\xb2\x24\x81\x85\xfe\x94\xd3\xf5\xfc\x9f\x7b\xdf\xa6\xdc\x75\xb2\x09\x02\x75\xb7\x6e\xe8\x1b\x2a\x83\x12\x0e\x89\x91\x52\xce\x65\xd5\xdc\x5e\x3c\x36\x1c\xa7\xc4\xb0\xcb\x5f\x6a\x03\xbe\x5c\xb8\x7f\x93\xd7\xce\x60\x7d\x3b\xcc\x81\xbd\x78\x64\xa0\x22\xac\x5a\x20\x61\xc2\x01\x07\x3f\x6c\x21\xf5\x9e\xeb\x79\xc2\x6b\xa9\xf4\x9c\xe7\x07\xce\xb3\x24\x1b\x92\x00\xbe\x57\x5a\x5d\x5e\x64\x57\x71\x84\xbf\xdb\xb5\x56\xc3\x6d\x38\xb7\x5a\x85\xb4\x40\x42\xfc\x3c\x97\x25\x60\x21\x71\x9a\x7d\x3e\xc1\xef\x55\x5c\xc8\x52\xa7\x05\x2e\x5f\xa8\x93\xe6\x36\x7c\xf5\xc0\xa5\x6d\x0c\x1c\xc4\xa1\xad\x56\x74\x3e\x95\xfc\x8c\xcc\x11\xe0\x73\x98\x15\x96\xcc\x8e\x66\xd3\x57\x7a\x79\x8d\x83\x80\x96\xc7\xd4\x08\x54\x6e\xf4\x4a\x94\x70\x40\x53\x30\xf1\xcf\xdc\xa1\xa2\x77\xe7\xf9\xc7\x5a\x0b\xc9\x57\x3a\x6c\x79\xdf\xb4\x17\x90\xaf\x8d\xa1\xf3\xad\xd7\x5e\x34\xbe\xd5\x81\x0b\x0b\x64\x6b\x99\xf8\x42\x87\xad\x1c\x80\xf6\x12\xf1\x8d\x0e\x9f\x9d\xa1\xf6\x42\xf0\x71\xf3\xc8\xc5\x31\x6c\x2f\x08\x9f\xcc\x58\x20\x7e\x0c\xdb\x0b\xc2\x97\x33\xd0\x88\xf3\xdc\x5e\x1a\x9e\x3b\x19\x71\x7e\x17\x7b\xa8\xbb\x38\x38\x0f\x0c\x65\xbd\xe9\xa1\x75\x67\x88\x25\x6d\x9f\x8e\xce\x8a\x40\x5a\xcc\xd6\xce\x07\x33\x26\xa0\x2c\xe3\x68\xc9\x65\x6c\x00\xa4\x2d\xe0\x50\xbe\x7d\xec\xce\xbc\x7d\x64\x49\x1c\x4e\xe6\x29\x9b\xb5\x5b\x04\x15\xa4\xa5\xc7\x55\xeb\x00\xbc\xeb\x1b\xc2\x53\xbf\x21\x8c\x7d\x37\xb6\x2b\x8a\x17\xd2\x1f\xdb\xa3\xaa\x99\x61\x28\x97\x09\xb3\x12\x59\xc3\x50\x46\xb6\x80\x93\x7a\xa8\xde\xa2\x4a\x30\xaf\xd4\x63\xf5\x92\x62\x1a\x1a\x3c\x94\x42\x54\xe6\xd6\x10\x95\x71\xfb\x10\x95\xf9\xac\x48\x92\xad\x95\xa4\x95\x0e\x9f\xcd\xba\xbd\xcc\x17\x5a\x21\xb3\x98\xea\xab\x8d\x80\x39\x33\x20\x30\xf3\x3a\xf9\x1b\x2d\x7d\x1b\x26\xdd\x7b\x0e\x44\x7a\xbc\x26\xd2\x3f\x02\x91\xee\x2f\x68\xcd\x6b\x88\x71\x39\xdf\x9a\xf7\x70\x75\x43\x2e\x3d\xd7\x39\xc8\x05\x45\xae\xcb\x93\xa0\x8f\x0f\x6b\xa5\x15\xa3\x8c\x93\x62\x5e\x46\x37\x50\x1d\xe7\x92\xc4\x53\x1f\xeb\x61\xcf\x29\x92\x55\xd0\x50\x0d\x34\x1b\xe7\x2a\x68\xa8\x06\x19\x4f\xb5\x3d\xf1\x8c\x74\xb0\x6c\xb5\x56\x1c\xa7\xbd\x3f\x8b\x2c\xab\x79\xa0\xb6\x45\x3a\xcc\x39\x84\x5a\xd5\xdb\x3f\xd4\xf9\x42\x90\xe8\xeb\xe7\x44\xa2\x6f\xd7\x24\xfa\x47\x20\xd1\x17\x9c\x44\x8b\x47\xdd\xea\x79\x11\xd4\xba\xb1\x45\x93\xc6\x9b\x91\xf3\x3e\x4c\xb2\x74\x58\x9e\x65\x9e\xeb\x5c\x64\xfd\x96\x41\x8b\x59\x54\xa0\xca\xde\x36\xb4\xa6\xd9\xb0\x47\x66\x7c\xb8\xa8\x7f\xcd\xdf\xa6\xca\xeb\x50\x8a\x08\x42\x75\x03\x78\x13\x26\x55\x04\xa3\x4f\x7a\xc3\xb1\xd6\x10\xaf\x0b\x8f\x25\x24\x15\x1e\x44\xc2\x05\x44\x2a\x96\x92\x7d\x8f\xb4\x5a\x39\x85\xfd\x50\xab\xe3\x39\x6e\x69\x66\xe8\x89\x56\x1d\x97\x27\x45\x16\xc2\xb2\x84\x11\xd7\xb1\x13\xbd\x2f\xef\x27\xbd\x92\x14\x51\x15\xf9\xa8\x3a\x52\x2e\xe3\x3a\xf8\xe2\x26\x7c\x03\x3b\x83\x38\x8d\xf8\xa3\x40\xfa\xbc\x4b\x19\x0a\x27\x40\x28\x1b\x0e\x13\xa8\xae\x16\x26\x26\xa4\x4b\xc3\x62\x76\xe2\x94\x94\x97\x2e\xf4\xde\xcc\x6a\xe8\xcf\x84\x52\xc0\x71\x76\x05\xe9\xa9\x72\xa1\xd7\x9d\xd9\x38\xaf\xca\x11\x6f\xca\x46\xbd\x93\x24\x5a\xb3\x77\x59\xf1\x89\x3d\x35\xa0\x8a\x16\xd4\x6a\x7c\x18\x1d\x5e\xc5\xfa\xf9\x82\x03\x16\x1f\x66\x49\xdf\xe0\x69\x1b\x56\x7a\xfb\x29\x03\xa5\x1f\xbd\x4c\xaa\x21\x57\xed\xff\xf5\xf2\xce\xf6\xc1\xd9\x2b\xcf\x57\x2c\x9c\xa6\xf2\x51\xa7\x7f\x91\x68\x56\xb7\x6a\x14\x24\xe3\xc8\xb4\x17\x8a\xc6\x3a\x8e\xc6\x53\xd7\x5e\x4c\xea\xeb\xb8\xc8\xc1\x6d\x2f\x27\x0d\x2c\x70\x0f\x56\xe2\x6f\x33\xb2\x40\x96\xc8\x47\x7b\xcb\xc2\x50\x47\x20\x53\xa0\x55\x84\xf7\xd4\xc0\x6b\x44\x6c\x15\x31\x3e\x35\x0c\x0a\x1d\x6c\x6f\x59\xd0\xc7\x6f\xa1\x71\x0e\xe8\xc5\x9d\x80\x88\x26\xf3\x55\xc8\xf3\xa1\x79\x20\x92\x15\xc8\xd6\x01\xcc\x24\x57\x6d\xc7\x33\x1b\xb8\x36\x3c\x25\x9c\xd9\xc5\xe2\x92\xfc\xdf\x21\xc1\xaf\xe3\x70\xae\xa5\xf7\xa7\x2b\xbd\x5f\x73\xe9\xdd\x94\xb1\x0b\xb3\xa2\xe9\x22\x2c\x02\x37\xe9\xdc\x79\xaa\xeb\x64\x98\xf4\xbd\xba\xac\x23\xb2\xbf\xf5\xc3\x05\xf2\x89\x2c\x46\x47\x5a\x8c\x4d\x5b\x1e\xe8\x89\x19\xed\x53\x66\x5b\x7a\xc0\x4f\xcc\x73\x28\xbb\xd1\xe3\x7d\x0a\xb9\x49\x0f\xf8\xc9\x34\x1d\x7a\xc4\xcf\x12\x05\x98\x5e\x0d\x1b\xc4\x6b\x3d\x64\xf9\x8c\x29\x08\x71\xcb\x11\x70\x1a\x41\xf0\xc6\xa4\x5b\xe9\x78\x4d\x52\x39\x11\xc8\xa9\x27\x49\x55\x14\x30\xa5\x97\x26\x49\xf2\x77\x76\x4f\x3e\xf3\x68\x16\xf5\xfc\xdf\xf0\x57\xaf\xb8\xb6\xcb\x7f\x1d\xc2\x71\x56\x4c\x1c\x23\x14\x3b\x19\xd4\x5f\x18\x5f\xe7\xe5\x1d\x89\xc1\x3e\x05\x91\x7f\xa5\x26\xfd\xa0\xc2\x55\x6b\x01\x31\xd7\xe1\x36\xec\x88\xf6\xe2\xe1\x58\xc7\xa4\xc8\x42\xad\xa5\xc4\xbe\x0e\x5e\xec\xcb\xf6\x82\xe2\xc0\x5c\x25\x2e\x0c\xb4\x16\x12\x47\x3a\xf0\x5a\x0f\xd8\x5a\x3e\x1c\x1a\x4b\x4e\x0f\xd8\x8a\x33\xc5\xcc\x0c\xb3\x5a\x40\x16\x17\xc2\x1a\x78\xfc\xb1\xe3\x8b\x2f\x18\x68\xf5\xa1\x59\x64\xd6\x0a\xcc\xb5\x08\xf4\x74\x45\xa0\x0b\x16\x8a\xdc\x92\x89\xf7\x01\xce\xc1\xb1\x4d\xcb\x68\xb6\x0d\x69\x90\x46\x11\xb6\x34\x2f\xe0\x55\x9c\x55\xa5\x78\x15\x7e\x10\xd5\xae\xbd\xb6\x76\x47\x59\x04\x4f\x59\x70\x14\xcc\x9f\xda\xab\x22\x45\xb8\x00\x53\xb9\x68\x1d\x9d\xa1\x6d\x94\xc7\x66\x53\x3b\xaa\x01\xcc\xaf\xb9\x5f\x43\x12\x4c\x4c\x4d\xa3\x89\xb2\x9e\xae\xa1\x75\xb4\xad\x09\xd7\x3e\x4e\x89\x76\x27\xb7\x07\x46\x58\x0d\x4b\xd5\xc0\xdb\x17\x6b\x15\xec\xb5\x01\x51\xbd\xde\xab\x60\xb2\x1a\x0a\xb4\x22\x1d\xcc\x50\x07\xcc\xbe\x7a\x7b\x1e\x3b\x99\xbf\xfc\x7c\x4f\xb4\xd7\xc4\x5c\xcd\xfa\x06\x02\x4f\x6b\x27\xcf\x7c\x09\x8d\x86\x08\x45\xf3\xa4\xd3\xa6\x62\x59\x60\xc3\xd4\x2f\x3c\x07\x49\xe0\x7a\x2d\x09\xfc\x08\x92\xc0\xad\x9e\x3a\x75\x15\x8f\xc4\x45\xf1\xec\xd4\xa9\x46\x4c\xe7\x3a\x19\xf2\xac\xc7\x40\x66\x37\xea\x41\xd6\xd0\xa7\x4d\xa2\x93\xab\xfa\xe9\x49\x5e\x09\xcd\xc7\x15\x8f\xcb\x4b\xee\xe8\x5c\x6e\x50\xcb\x0f\x83\x1b\x21\x2c\x5c\xf1\x07\xda\xe5\xa5\x10\x11\xea\xd2\x38\xcb\xa5\xf7\xe8\x75\x29\x5b\x0b\xa1\xf4\xe0\x35\x8c\xdc\x4d\xa4\xe4\x27\xd7\xaa\x3a\x99\x8c\x77\x15\xf7\xf2\x6b\x3d\xf7\x09\x9d\xf2\x2a\x04\x08\x2b\x68\xb2\x6a\xab\x90\x1a\x34\xe8\x74\xe1\x57\x21\x2b\x68\x80\xe9\xb7\x5b\x85\xac\xa0\x01\x16\x9f\x7f\x15\xe2\x82\x06\xbc\x4e\x0b\xbb\xda\x9c\x2a\xb7\xb3\x58\x76\x19\x06\xf6\x7b\xbe\xfe\xce\xf7\x29\xe6\x15\x9b\x95\x1f\x45\xb0\xf7\xbd\xe7\xc4\xde\x77\xd6\xec\xfd\x47\x60\xef\x47\x8b\xe6\x1c\x53\x19\xb9\x59\x5c\x36\x24\x06\x99\x95\x16\x45\x7b\x70\x5b\xe1\x93\x2b\x3e\x91\x12\x63\xfd\x85\xcf\x9e\x50\x56\x29\x22\x64\xa4\xa9\x3f\xbf\x7c\xec\x36\xc2\x13\x90\x7e\x26\x7f\x2a\x3d\x30\xf0\xe6\x3c\xb2\xe6\xbc\x67\xa5\x60\x11\x29\xd8\xcc\x47\xbf\x34\x10\xa7\x65\x74\xf2\xd9\x22\xc3\xc3\x2d\xbd\x4e\x02\xd3\x21\x1a\xfd\xfc\x1a\x8f\x6f\x68\x40\xa3\x57\x52\xf2\xcf\x51\x90\x66\x98\x6e\xf2\x3c\x64\x26\x8e\xbf\x5e\xde\xfd\x8b\x1a\x26\xe2\x31\x9c\xd6\x5e\x26\x75\xdf\xe9\x39\x2b\x61\x10\xa6\x7f\x61\x9c\x93\x16\x62\xd2\x9e\x6e\x2c\x39\xc5\xc4\x5e\x3c\x38\xde\xe3\x2f\x78\xc9\x27\xbb\xd6\x8a\xb5\x2f\x7a\xab\x55\xc3\xa2\xc8\x0a\xf1\xda\x98\x17\x5f\x05\xc9\x81\x14\xe0\xa6\x2e\x1f\x05\x35\xa0\x63\xad\x26\x4e\xc3\x02\x06\xc4\x3d\xe1\x44\xab\xa2\xeb\x7b\x69\x29\x65\xcb\x7d\xa8\x55\xf1\xd5\x3f\x35\x2a\xf0\x77\x3f\x37\x07\x75\x48\x2a\xce\xb4\x0a\x92\xcb\x6b\x97\x4b\x72\x57\xfe\x8e\x3b\xb1\xba\x6d\xb0\x25\x5d\xc5\x5b\x5c\x0d\x05\xfb\x2a\xab\x78\x88\xab\x41\xd6\x3e\xec\x2a\x9e\xe3\x6a\x18\xd8\xde\x58\xc5\x43\x5c\x1d\x32\xdb\x5e\xab\x78\x89\xab\x81\x16\x3b\x74\x15\xef\x6f\x35\xe0\xd2\x26\x5f\xc5\xb3\x5b\x7d\x3b\xae\x28\xff\xed\xa1\x0d\x30\x3b\x6a\xed\x03\xcf\x9c\xea\xd0\x45\xce\xc6\xd6\xcf\x66\xcf\x4d\xd8\x24\xe2\x72\xfb\xd7\xb2\x96\x6d\x42\x69\x46\xfb\x28\xdd\xbb\x3a\x6c\x42\x76\xda\x07\xe8\x9e\xc8\xe2\xff\xd1\x4c\xf1\x1f\x16\x57\x71\xb8\xa2\x88\x8e\x8f\xa3\xaf\x13\x82\xfc\xe0\x39\x09\xf2\xa3\xb5\x20\xff\x23\x08\xf2\x43\x5d\x4f\xd7\xf0\xfc\x8b\x17\x67\xaa\x9f\xd0\x2c\x27\xa3\x54\xce\xa3\x87\xc5\xbd\x2a\xd9\x0e\xb3\x34\xc5\x17\x72\x2c\xe1\x3f\x5c\x32\x1c\x28\xaf\x7b\xeb\x37\x60\x03\x49\x91\xf5\x91\x3e\xc5\x8a\xb4\x2a\x14\x0c\xa5\x87\x01\x75\x69\x96\x7e\x26\x69\xd8\x85\xd2\x6d\x20\x82\xc3\x90\xe1\xd6\x2a\xb7\xe9\x14\x84\xfe\xc8\xad\x2c\x4f\x7e\x5b\xab\xc5\x22\x1d\xb0\x34\x8f\xf6\xf2\x59\xae\x43\xa7\x4b\xd1\x5e\x3c\x1b\xeb\x80\xc5\x6a\xb6\x97\xcc\xfa\x3a\x70\xfe\x41\xda\xcb\x66\x95\xcc\x65\x86\x33\xb9\x4c\x1c\xc1\x30\x28\xb6\xf3\x22\xbb\x99\x6c\x57\x79\x89\x0a\x18\x8c\x57\xe3\x57\x32\xcf\x0f\x56\xb0\x8f\xf2\x39\xb1\x8f\x6a\xcd\x3e\x7e\x04\xf6\x11\x32\x9f\x57\xd3\x2b\xa3\x31\x64\xdc\xc3\xbd\x2b\x4a\x11\xbd\x01\xc5\x29\x31\x47\x53\x77\xbb\x8c\x51\xed\xba\x41\x92\x85\x41\xf2\x36\x4e\xa3\x13\x62\xc1\x09\x38\xed\xce\xfc\xca\x4d\xb4\xa8\x0a\x2a\xa8\xf6\xfe\x8d\x81\x8e\x43\x1b\x4d\x7b\x46\x91\xc8\x84\x2b\x5c\x98\x70\x3d\x84\x5e\x3d\x50\x20\x96\x68\xd8\xc6\x6a\x36\x5a\xc6\x37\x9a\x11\xee\xcf\x4e\x9c\xf1\x0e\x5c\x6c\xab\xe1\xa1\x32\x62\xb5\x61\xdb\x76\x34\x07\x21\x40\xbe\x53\x03\x2f\x1d\x90\xd2\x42\x37\xf6\x13\xef\xa9\x12\xe3\x29\x08\xfc\x42\xda\x89\xa5\x32\x83\xca\xc7\x7b\x3d\xf4\xdb\xec\x45\x90\xfb\x77\x53\x20\x93\xf3\xb0\x81\x9c\xe7\x98\x9c\x87\x8c\x9c\xe7\x2a\x39\x97\x7f\x82\x5c\x27\xe7\x79\x23\x39\xcf\xef\xef\x73\x9d\x9c\xe7\x2a\x39\xcf\xfd\x6a\x11\x72\x4e\xde\x03\xd6\x6a\x5e\x17\x5f\xe0\xa0\x77\x7f\x0f\x89\xf3\x08\x88\x24\x72\x9e\x6b\xc4\x36\x67\xe4\x5c\x29\x7f\x93\x9b\xdf\x25\xe2\xe4\x3c\x9f\x4d\xce\x75\x0c\xf6\xad\x85\x87\x98\xe3\xe9\x31\x72\xee\xe7\xa0\xf0\x36\xf0\x4e\x96\x6e\x9f\x12\x95\xc8\x16\xa1\x12\xd6\xcb\xf4\xb3\xa7\x13\x3a\x89\x78\x14\xca\xc0\x08\xec\x33\xa5\x0a\x6c\xf4\x6b\x8a\xb0\xa6\x08\x8c\x22\x58\x82\xf0\x3e\x5d\x0d\x5b\x93\x31\x7d\xc3\x4c\x58\xf2\x1c\xae\x4e\xa7\xeb\xab\xd3\x8f\x70\x75\x3a\x67\x9a\x37\x8b\xaf\xbc\x25\x54\x07\x4d\x48\xdb\xea\xa9\x1f\x2f\xae\xac\x61\x39\xf4\x70\x1d\xbc\x79\x64\x7b\x73\x98\x37\xc0\x18\x37\x94\xf7\x55\xb5\xe1\xa0\x85\xf2\xef\x90\x07\xa7\xa6\xd1\xfd\x6b\x0f\xb7\x43\x29\x1a\xb3\xf0\x6e\x3b\x94\x5d\xf2\x0f\xf6\x84\xc7\xfb\xa1\x11\xae\xfa\x4a\xab\xe1\x01\x7f\xaf\xb5\x0a\x9e\x9a\xfb\xd6\x5a\xa1\x64\x72\xbd\xd0\x9a\x54\x44\x37\x46\xdf\xa0\xdd\x68\x75\x05\x8d\xa0\x5b\xee\x72\xb2\x7b\xc2\xe6\x78\xdc\xd0\xf2\x4c\x8a\xa7\x7c\xa2\xb5\x11\xc4\xfb\x20\x1d\x64\xdc\x0c\x3d\x0d\xca\x49\x1a\x6e\x0e\x21\x12\x5e\xdd\xd6\x7c\xc8\x83\x38\x25\x41\x1b\x8a\xc8\x55\xdc\xfc\x11\xcf\xc8\x7e\xb0\x87\xc5\x89\x91\x7f\xea\x0e\xd4\x00\xd2\x2c\xed\xc2\x0a\x92\xac\x68\xa0\xe9\xb7\x5d\x45\x6a\x15\x0d\x30\xdf\x1e\xab\xc8\xa9\xa2\xaf\x87\x88\x4a\xbd\x82\x6c\x2a\x1a\x70\x11\x95\x7a\x05\x79\x54\x34\xd8\x7c\x9f\xaf\x22\x79\x8a\x15\xb6\x9a\xf4\x78\x05\xf9\x53\x34\x2c\xf2\x69\x5b\x45\xde\x14\x0d\x7c\xf3\x81\x5d\x45\x06\x95\x06\x64\xf2\x99\x6f\x6f\xd4\xbe\xd4\xd1\xe8\x64\xa3\xbd\x6d\x7b\x20\xeb\xab\xce\x17\x91\x3b\xd9\x31\x5f\x4b\x9c\x6b\x89\x73\x2d\x71\xae\x25\xce\xb5\xc4\xf9\x3c\x24\x4e\xbc\x0e\x6b\x59\x73\x2d\x6b\xae\x65\xcd\xb5\xac\xb9\x90\xac\x29\x08\xc6\xdf\x2b\x65\x62\x6a\x5f\x15\x30\xda\x96\x03\x77\xac\x30\x4b\xa0\x24\x7e\x0e\x92\xc0\x12\xec\xcc\x78\x1c\xb4\xb1\xf6\x9c\xf8\x71\x84\x31\x22\x71\xdc\x55\x29\xde\x1b\x08\xa6\xdd\x70\xea\xf3\xb8\x14\x44\x52\x8b\xd8\xf3\x1a\x2d\xb7\x9e\xf2\x76\xa3\x08\xae\x2d\x61\xd7\xd3\xd6\xa6\x2c\x0c\x57\x32\x64\x95\x4f\xd6\x90\x45\xc2\xa2\xf2\xa3\x2c\x85\xc4\x22\x42\x43\x11\x5c\x6f\xc4\x03\xf7\x05\xf4\xe8\x66\xa3\x8b\xbe\x89\x7c\xf9\x08\x41\xaf\x53\x66\x05\x92\xf6\xa9\x8b\xf7\xa3\xff\xb3\x8b\x7a\xf1\x37\x1f\xf6\xe2\x6f\x00\x79\x1e\xb8\x9b\xf2\x08\xba\xa1\x8b\xc0\x5d\x76\x05\x0b\x3c\x74\xfa\x81\xa7\x55\x7a\x99\x66\x22\x1a\x23\x3e\x84\x31\xf5\x20\xec\x88\x01\x7a\x3c\xe8\x16\x12\x41\xb7\xa4\x7a\x00\x69\xb8\xfa\x4a\x0d\xd1\x4e\x3e\x47\x7b\x21\x44\x83\x2a\xd0\x52\x29\x64\x5e\x54\xc9\xa6\xce\x1e\x08\xe4\xe0\x91\x4a\x18\xf8\x68\x16\x0d\x46\x41\x79\xf9\x9f\x08\xcf\xb4\x8e\xb5\xb0\x66\x25\xff\x24\x56\x22\xc7\x5a\x68\xba\xd7\x9b\x5e\x78\x99\x3d\xc7\x68\x60\x2f\x5e\x20\x18\x13\x6f\x1b\xda\x11\xb6\x89\xef\x7e\x25\xc5\x6a\x84\x66\xbc\x04\x4c\x79\xcc\x68\x09\x65\x3c\x4c\x83\xc4\x0c\x95\x00\x6f\x62\xb4\x4b\x2e\x76\x7a\xb8\x04\x35\xa2\xd2\x95\xf9\x56\x4f\x8f\x97\xc0\x5f\xff\xcc\x88\x98\xc0\xc6\xfc\x08\x31\x13\xe8\xb4\x1f\x21\x62\x42\xbd\x72\x8f\x10\x2e\x41\x2c\xfe\x23\x84\x4c\x58\x5d\x78\x25\x0b\xe0\xfa\x0d\xd9\xea\x63\x26\x88\x37\x64\x7f\x63\xd4\x04\xc2\x7d\x87\x45\x56\xe5\xdb\x11\xcc\x93\x6c\x82\x8f\xda\xac\x5c\x2c\xec\x26\xf4\xaa\x96\x3f\xd7\x01\x15\xd6\x01\x15\xd6\x3c\xfc\x3f\x11\x50\x41\xd5\xc0\x5b\x22\x27\xcc\x8c\xa8\x80\x3a\x43\x84\x79\x38\x2c\xe3\x02\x46\xbb\x41\x1a\x14\x44\xb7\xf3\x9a\x07\x41\xa2\xfd\x1a\x83\x1e\x51\x9d\x7a\x12\x07\xa5\xe7\x3a\x79\x12\x84\x0c\xca\x44\x28\x78\x4b\x16\x74\xc0\xd1\x23\x22\xa8\x69\xd3\xe7\xc5\x44\x50\x13\xa2\x9b\xc5\x23\x7b\xf1\xd0\x16\x84\x61\x15\x51\x08\x04\xa1\x34\x23\x10\xd0\x27\x60\x7a\x00\x82\xa0\x42\xd9\x27\xbc\xf5\x2d\xd1\x07\xf2\x22\x1b\x67\x84\x90\xea\x01\x08\x6a\xd5\xdb\x09\x69\x41\x94\x95\x7a\x2c\x82\x86\x75\x37\x43\x13\x48\x0d\x15\x85\xbd\x98\x93\xb6\x0f\xf4\x50\x05\xac\xc1\x59\x86\xb0\x48\xa0\x47\x2b\xa0\xe0\xc9\x08\x4a\x33\x64\x01\xd3\xe8\xd6\xd5\x7a\xec\x82\x2a\xd5\x1a\xe8\x31\x0c\xd8\x42\x9c\x14\xd9\xb0\x80\x65\xf9\x76\x32\x33\xa2\x81\xfc\x79\x1e\x21\x9a\x41\xba\xa2\xb8\xce\x46\x30\x03\x79\x93\x3c\x42\x24\x03\xb1\xcf\x1e\x21\x98\x81\x65\xab\x3e\x42\x5c\x83\xc6\xdd\xfe\x08\x61\x0e\xf4\x03\xf3\x08\xb1\x0e\x8c\x33\xf7\x08\x61\x0f\xd4\x63\xfb\x08\x91\x0f\xd4\x93\xff\x08\xe1\x0f\x34\xda\xf0\x08\x71\x10\x0c\xfa\xf3\x08\xf1\x10\x2c\x24\xec\xef\x8c\x8e\x20\x89\xf9\x25\x8b\xf3\xf2\x4f\x90\xec\x85\x24\x7f\xfc\x9c\x24\xf9\x93\xb5\x24\xff\x23\x48\xf2\x97\x2d\x25\xf9\x86\xd0\x68\x7a\x8c\x53\xab\xe2\xcd\x2c\x8e\xec\xc5\xb9\x3a\x42\xfe\x96\x52\x8a\xa6\xc8\x3d\x6b\x0a\x18\x44\x58\xda\x27\xc5\x92\x70\xdf\x6f\x21\x54\x1f\x8b\x14\x31\x2c\x02\x55\xad\x8e\x3b\x56\x44\xea\x91\x56\xca\x18\x9b\x50\xc6\x1d\x2b\xa2\xa8\xf0\xb5\x39\xe6\x59\xdb\xd3\x14\xaf\x32\x17\xd9\x8f\x75\x8f\x9a\x6b\xad\x82\xf3\x05\x21\xb4\x1f\xf3\xd8\x60\x78\xf4\x42\x64\x3f\xe6\xa9\x1a\xbf\xc4\x65\xdc\x4f\x84\x83\xcd\x74\x0a\x06\xfe\x89\xdb\xd7\xf2\xa7\xac\x2c\xda\xd6\x48\x07\xbe\x2a\xf9\x74\xa8\x03\xe6\x2b\xde\x5e\x38\x9d\xe8\xb0\xeb\x8f\xd6\x5e\x34\xbd\xd2\x41\xf3\xef\xde\x5e\x20\xbd\xd6\x61\x0b\x57\x95\xf6\xd9\xe8\x74\xd8\xd2\xee\x6b\x2f\x7b\x5e\xe8\xd0\xeb\x0d\xdc\x5e\xe4\xbc\xd1\x41\x4b\x67\xa0\xbd\xbc\xd9\x97\x45\x9c\xcb\x45\x45\x9c\x7f\xa4\xfa\x72\xc3\xf4\xd2\x7d\x0e\xc2\xce\xf9\x5a\xd8\xf9\x11\x84\x9d\xb3\x67\x23\xec\x2c\xa7\x85\x44\x9d\x30\x4b\x12\x18\x22\xcf\x75\xbe\x57\xb0\x12\x77\x5d\xa7\x44\x41\x81\xe2\x74\xc8\x0b\x18\xab\xe1\xbf\x31\x91\x49\x20\x82\xbc\x60\x10\xc4\x89\x04\x20\xc9\x4a\xc4\x7f\x30\xd7\x11\xf6\x9b\x29\x3b\x51\xa7\xac\xc6\x1e\xf3\x84\x2d\x3f\xc6\x25\x22\xfa\xce\x87\x8b\x5b\xa7\x72\x46\xbe\x5a\x74\x3a\x55\x24\xad\x89\x56\xaa\xce\xfa\x4a\xab\xd5\x17\xe1\x5a\xab\xd7\xd6\xe4\x56\xab\xd6\x97\xe8\x42\xab\x57\x57\xec\x46\xab\x95\x17\xf0\x58\xab\x53\xd7\x93\x2b\x3c\x4f\x65\x9f\x6c\xba\xa2\x5c\xd7\x59\xd7\xa1\x0c\x05\x49\xdd\xf1\x90\xcb\x71\x43\xff\xdc\x1d\x3d\x42\x92\xe1\x89\x0e\x77\x55\x22\xdc\x95\x0e\x58\xfd\x94\xab\xf0\x0b\xd6\x10\xe8\xbb\x61\x15\xee\xc1\x1a\x0a\x6d\x43\xad\xc2\x49\x58\xc3\xa0\xef\xc9\x55\x78\x08\x6b\x28\xd4\x6d\xbd\x0a\x1f\x61\x0d\x81\x7c\x32\x56\xe1\x15\xac\x81\xd7\x0e\xd7\x2a\x1c\x82\x35\x0c\xf2\xf9\x6c\xaf\x55\x3c\xd4\xc1\x2b\x47\xbc\xbd\x4e\x71\x24\x8b\xa9\x67\x8b\x89\xa9\xff\xd9\x2c\x05\x33\xb3\x13\x56\xe3\xed\x60\x38\x2c\xe0\x90\x3e\xbe\xb0\x4a\xb0\x20\xa1\xe2\xdc\x03\x0c\xf0\x60\x0f\xec\x80\x23\xb0\x0f\x3e\x81\x77\xe0\x40\xc8\xb5\x1f\x69\xb0\x0d\x0c\x35\xd6\xbc\x33\x37\xe2\x81\x6b\x75\x4d\x3c\x9d\x8c\xfb\x59\x52\xb2\xf8\x31\xfe\xac\x36\x18\x0c\xda\xda\x72\x53\x3f\x65\x19\xf6\x25\x39\x0e\xe9\xf1\xd3\x1b\x3d\x20\xf1\x18\x25\xb1\x73\xea\x79\x1e\x88\x49\x4e\xff\x4e\x90\xe7\xc9\x84\x88\x84\x53\x06\x2c\x16\x82\xf0\x5b\x2c\xcc\x0e\xb2\xc2\xc5\x23\x45\xfe\x4f\xff\x83\xfe\x5f\xce\x98\x99\x2e\xe5\x7f\xd0\xbf\xfe\x55\xcf\x9f\x06\xad\xe7\x2d\x7a\xe8\xdb\x1b\xf9\x47\xf7\x6e\xba\x81\xfe\xef\xff\x7a\xf3\x91\x2d\x8b\x1b\x7b\xe0\xc5\x6b\x9b\x08\x8d\xbc\xbb\xef\xf4\xb3\xf5\xd0\x37\x6f\xea\x79\xdd\x39\x33\x2c\xdf\xd8\x44\xc2\x18\x96\x2e\x9c\xe7\x1e\x5a\xba\xb1\xe7\x75\xa5\x31\x35\x0c\xa8\x59\x34\x9d\xb7\xfa\x31\x40\x1e\x9e\x44\xbd\xc0\x50\x2c\xf0\x2f\xcf\xe9\x5a\xf4\xbd\x8e\x7b\x54\x3f\x81\xda\x8c\xd3\x4d\x68\x5d\x79\x36\x6a\x86\x4d\x23\x4c\x3a\xd9\x92\x08\xd5\xd4\xeb\xc2\x1e\xfa\xe6\xc7\x40\x5a\xa4\x2f\xeb\xeb\xd8\x3f\xfd\x3a\x46\xfd\xdb\xdf\xfb\xd0\xff\x19\xde\xdf\xf7\xbe\x91\xfb\xd9\x07\xdf\xcd\x1a\xee\x67\x81\xfd\x7e\x36\xeb\x22\x66\x2a\x8c\x31\x5f\x13\x29\x38\x0d\x75\x32\x0b\x28\xc6\x73\x6f\xea\x0d\xae\xb2\xa4\x1a\xc3\x6d\x32\xeb\x98\x30\x1d\x43\x35\xed\xb9\x8e\xb0\x60\xd1\x21\x8e\xd5\x24\x19\x7d\xe3\x69\xc4\x45\xd6\x27\xe9\x2f\x3a\xc4\x79\x9e\x86\x52\xe7\x57\x2b\x39\xfd\x45\x50\x5e\x96\x9d\x7f\xc3\x20\x1c\x75\xa2\x22\xbe\x12\x7e\x25\x06\xb8\x40\x72\x6f\xb9\xa3\x3d\x78\x0e\x05\x10\x97\xef\xaa\x64\x10\x27\x09\x8c\xa6\x0e\x13\xe4\x99\x27\x4a\x22\xe5\x1b\xa5\xa9\xbe\x81\x92\x9b\x1b\xdf\x03\xe6\x34\x63\x49\xbb\xb1\x60\x3f\xa7\xe5\x5e\x4c\xbe\xc6\xf5\xcc\x89\xde\xa9\x70\x81\xfa\xf3\x30\xb8\x99\x3a\x58\xfe\xb6\xee\x82\x0b\xeb\xda\x24\x01\x82\x25\x7a\x17\xc4\x49\x55\xc0\x7d\xbc\x47\xc9\x42\x75\xa8\xb8\x7b\xf6\x9e\x0a\x5c\x9d\xde\x37\xb1\x36\x37\x06\x20\xa6\xbd\xeb\xdc\xc9\xb7\x15\xa0\xde\x2c\xf0\xc8\x8e\xad\x43\x10\xf9\x2c\x08\x98\x18\xaa\xe8\x4e\xac\x9d\x88\xb5\xe3\x14\x05\x08\x76\xd4\x7c\x18\x6a\xe7\xcb\x16\x17\xef\x5f\xe4\x8b\x77\xed\x3e\xf3\x8b\x72\xf1\x3e\xd5\x4a\x59\xde\x8c\x73\xad\x98\x7d\xeb\x33\xad\x98\x1d\xb1\x92\xfb\xc6\xf0\x1a\x7a\xb6\x4a\x07\xec\xe9\x5d\xd8\x41\x02\x3b\x5a\x05\x4d\x39\x70\xa4\x95\xca\xbb\x15\xec\x37\x54\xb2\x3d\x0a\x3e\x35\xd4\x93\x9d\x09\xde\x35\xd4\xee\xe7\x23\x88\xf9\x47\x42\x9b\x1d\x48\xd9\xf8\xc7\xb0\x18\x62\xf0\x28\x10\xef\x86\xdf\xba\x6f\xdd\xbb\x29\x7d\x1b\x8c\xbf\xe3\x10\x22\x9a\x18\x87\x9c\x77\xcf\xa3\x35\x24\xff\x0d\x81\x41\x8f\x76\xa9\x3d\x3c\xa6\x67\x62\x1c\xe4\x6f\x27\xae\x53\x9f\xfe\x4e\x95\xc6\xdf\x5d\xda\x4d\x3a\xf2\xa2\xeb\x7b\xfa\x6c\x87\xa0\xd4\xe8\x82\x83\xc5\x1e\x22\x60\x62\x88\x7c\x47\x1d\x89\x84\xfe\x29\x4f\xe6\x6f\x1c\x3a\x6d\x70\x04\x3e\xfd\xe4\x1e\x1e\xa3\xeb\x62\xb2\x4e\x8b\x8d\xbe\x8e\x77\x7f\x6f\xad\x73\x3c\x4f\x7a\xd9\x84\x25\x58\xff\x67\xf8\x2f\xe4\x81\xd7\x74\x14\xc4\xfe\x82\x77\x2a\x3b\xbb\xa5\xfe\x88\x8a\x4f\x73\xb1\x23\xee\xf0\x57\x52\x70\x6b\x8b\x3e\xea\xc6\x4b\x91\xda\x56\x80\x1e\xf3\xe3\xe2\x54\x39\xe1\xb6\x65\xa8\x29\x83\xa2\xc6\xf0\xfe\x65\x36\xd0\xd4\x10\xec\x85\x18\xad\x6c\xfe\x82\x26\xe9\xa0\x1f\x72\xc6\xd8\x05\xe1\x68\x06\xdb\x4c\x5c\x66\x82\x27\xdd\xd4\xe8\x83\xf5\x36\xa7\x55\xbc\x2d\xc0\x8d\xa6\x53\x70\xe8\x7f\x71\x2f\x4d\xfd\x54\x6b\x35\xd2\xa9\x0e\x97\xe9\xa7\x5a\xab\x8f\xce\x75\xc0\x75\xa6\xa0\xd6\x5a\xa3\x33\x1d\x32\x23\x9a\xed\xb5\x45\xbb\x3a\x64\x41\x77\xdb\xeb\x89\xf6\x74\xe0\x9c\x74\xb7\x57\x11\xed\x18\x03\xaf\xa9\x7f\x7b\xfd\xd0\x91\x0e\x9b\xe5\xac\x69\xad\x16\x32\xc0\xd6\x3c\x80\x2a\x85\xe6\x5d\x16\x9b\x3a\x7b\xe0\x52\x7e\xac\xa8\x61\x61\x5c\x82\xea\x85\x96\x42\x51\xf7\x9c\x0d\x3f\x50\x5c\x17\x47\x4b\xe2\x50\xf8\x8c\x8a\x67\x5f\xff\x0c\x0a\xc7\x6e\xef\x6f\xf6\xa9\x09\x7e\xcd\xf4\x7b\x93\xb6\x28\xde\x35\xa1\xa0\x02\x41\xef\x6a\xc5\x3b\xca\x64\xa1\xa0\x77\xbd\xe4\x17\xb1\xb0\x61\xf5\xbb\x1c\x34\x4d\x4a\x13\x77\x7a\xb7\x2b\x9e\x9d\xc1\xd6\x1d\xd0\xbb\x58\x72\x76\x26\x8c\xd9\xbb\xdb\xce\xce\x1d\xd0\xbb\x59\x12\x71\x03\xa0\xd9\xd8\x85\xe9\xff\x78\x49\x74\x75\xcf\x39\xf0\x39\x33\x77\x40\xef\x64\x59\x14\xa2\xb3\x86\xe5\x52\xd6\x1f\x7f\x98\x7a\xde\xc6\x4c\xfd\x71\xfd\x98\x70\x6e\x9c\x8a\xa7\xe2\xee\xd0\x4a\x59\xbc\x61\x3e\x81\x7a\x0e\x1a\xbe\xa3\xb5\xa6\xed\x9f\xae\x69\x4b\x20\xda\xdc\x67\x8a\xb5\xa4\x41\xb1\x56\xd8\x15\x6b\x66\x71\xa5\x14\xb3\xf7\x4a\xa1\xad\x30\x52\x0a\xc5\xc3\xae\x9c\x3e\xb9\x4e\xb3\x14\x7a\xae\x33\x88\xd3\xb8\x1c\xc1\x68\x87\x7b\x70\xc6\x9d\x20\x8d\x3c\xd7\x89\xcb\x9d\x10\xc5\x57\xd0\x91\xa5\x89\x4e\x5c\x7e\x62\xae\x72\x36\x4d\x1a\xa6\x3b\x9d\xcb\x38\x8d\xac\xfa\x33\x7a\x23\x90\xa1\xf1\xab\x0e\xbb\x5e\xf7\xbe\xd5\x1a\xb5\x98\xbf\x1a\x23\x30\xb9\xba\xcd\x92\x94\x56\xaa\x57\x80\xa7\x59\x04\x59\x05\x83\x3c\x51\x3f\x81\x47\x2e\xc0\x59\x55\x84\x84\x5f\x5d\xa9\xb5\xb2\xce\x92\xfb\xb8\x9a\xba\xb2\x92\x51\xea\xdb\x05\x23\xab\xd8\xd4\x3e\x3b\xb2\xbb\x41\xa0\x86\x65\xdb\x51\xb4\x3f\x37\x5a\x29\xa3\xf1\xc7\x66\x71\x81\xc8\x47\xe5\x2e\x0d\x75\x95\xf4\xc1\xb9\x4b\xc3\x8e\xe2\x47\x21\x34\x4f\x3b\xdc\x61\xb5\xde\x0a\xa7\x46\x4d\xbd\x1d\xb8\x06\xaa\xae\xaa\x3f\xc9\x99\x56\x2e\x96\x9c\xeb\xa0\x76\x34\x87\xd9\x3d\x49\xa3\x13\x97\xbb\x34\x87\xd7\x49\x91\xdd\x88\x7b\xb9\xab\xea\x3d\xd8\xa6\xbb\xbf\x77\x1c\x8f\x5e\xec\xcb\xaf\x31\x1a\xb9\x75\x02\x30\x9a\xcb\xa1\xcb\x2e\xf9\xb8\x87\x55\x77\xd1\xbc\x35\x97\xd1\x55\xd0\x99\x63\x16\x5e\x95\xb6\x01\x37\xec\x51\x3c\xfc\xde\x37\xeb\x65\x5f\xcc\xb3\x3e\x08\x75\x3c\x9b\x00\xc1\x5d\xbc\xef\x38\x9e\xbb\x1c\xa6\x51\x9c\x0e\xbb\x4e\x5c\x6e\xb3\xbf\x1d\xc0\xfc\x21\x68\x61\x11\x53\xe9\xa7\xde\x0a\xa4\xb4\xf6\x67\x70\x00\xdd\x05\xa4\x90\x26\xb6\x9d\xf6\x10\x8d\x3d\x13\x20\xf8\xed\xfe\x1e\x57\x44\x41\x71\xe9\x4c\x0b\x48\x96\x5a\xd3\xc2\x48\xd3\xab\x1b\x48\x0b\x34\x05\x17\xfe\x91\x7b\x6b\xbf\xac\xac\x42\x11\x71\xa3\x83\x5f\x95\x22\xe2\x58\x07\x5c\x0b\x58\xad\x15\x11\x27\x16\xc8\xf5\xf9\x6d\xaf\x8c\xb8\xd4\xa1\xcb\x24\xa0\xbd\x3a\xe2\xd0\x00\xcf\xa8\x48\x7b\x6d\xc4\xa9\x0e\x5a\x10\xa2\xf6\xea\x88\x73\x13\x38\xa7\x65\xed\x75\x12\x06\x6c\x99\x8a\x2d\xa6\x97\x98\x05\xc0\x03\xb7\xf2\xcd\x40\xc3\x46\xcc\x6c\x0b\x29\x26\xcc\x6e\x1a\xe4\x33\x7d\x95\x6a\xb2\xde\xfe\xf9\x9b\x15\x30\xa5\x9a\x54\x0f\xb1\xd4\xe0\x95\xee\xda\x24\x76\xf5\x49\x48\x3c\xa8\xbd\x36\x62\x4f\x87\xce\xdd\xe6\x5b\xeb\x21\x6c\x04\x87\x90\xfb\xc5\x14\x10\x4d\x9d\xb5\xe5\xb9\x95\xef\x95\xfb\xf3\xfc\x92\xfe\xde\x40\xdb\xfa\x9d\xf5\x91\xc3\x7c\xfc\x63\xfd\x8a\x76\x1e\xc5\xaf\x68\x6f\x11\xbf\xa2\xfd\xbf\xd7\xaf\x68\xef\x3f\xe3\x57\x74\xf4\x9c\xb4\x0e\xfb\xff\x21\xbf\xa2\x4f\x6b\x6d\xc7\x8f\xa0\xed\x78\xc7\x9e\x79\x58\x22\xcc\xad\x3e\x3e\x3c\x57\x7f\x68\x3a\x01\x7a\x79\x93\x8d\x41\xb5\x67\x4f\x64\x64\x1b\x4f\xe2\x01\x0c\x27\x61\x02\x85\x43\x91\x04\x4d\xd4\x02\xf1\x77\x87\x65\x09\x34\x42\xca\xeb\x2f\x43\xac\xf1\x69\xcc\xe2\x91\xbd\x78\x68\x2f\x9e\xa8\x53\xd0\x1c\xa4\xc6\xd4\x42\xda\x10\x95\xe7\xaa\x85\x83\xca\x91\xe4\x5e\xf2\x9e\xfa\x27\xd7\x6f\x39\x8e\x14\x45\xc5\xad\x56\x5a\x8b\x8d\x17\x5a\x39\xb9\xb7\x73\xb5\xc6\x91\xe2\x5a\x72\xac\x95\x4a\xdf\xe1\x44\xab\xd2\x6d\x4c\x97\x33\xeb\x89\x05\xe7\xb0\xa1\x09\x31\x83\x9d\x36\x54\x52\x13\xcc\x79\x43\xad\x66\xa9\x39\xd3\x9a\xd1\xaf\x73\x88\x3f\x8e\x50\x7e\x34\xba\xad\xec\xb8\x3b\xdc\x6d\xc5\xb6\x9f\x0d\xbf\x15\xbe\x3c\x47\xc1\x18\xba\x22\xa6\x2c\x2f\x67\x1a\x8f\xbb\x51\x96\x5d\x76\x21\x60\x1b\xb8\x8b\xa6\xbe\xda\x0e\x8b\x3b\x4e\xce\xee\xee\x8e\xef\xfb\x75\x50\xdc\x4d\xf4\x86\x97\x6f\xd7\xfb\xbf\x2b\x8a\x60\x3d\x7f\x87\x82\xc8\x4a\x64\x87\x51\x57\xc8\x40\x78\x99\x15\x4a\x96\xcb\x40\x44\x21\xe3\xc4\xce\x38\x88\x53\x67\x3a\x05\xd7\xfe\x27\xf7\x4a\xbf\xd4\xb0\x9d\xda\xfe\x11\xce\xad\x0e\x7d\x55\x8f\x70\x2e\x74\xc0\xfc\x9a\xd5\x5a\x6d\x71\xa3\x83\xa6\x47\xae\xbd\xd6\xe2\x58\x07\xcc\xec\xf9\xad\x15\x16\x06\x58\xc9\x9e\x1f\xce\xbf\xf5\x34\x75\xf6\xc0\x95\x7c\xeb\x39\xd1\x87\x2f\x91\x97\xf6\xaa\x8b\x26\xd8\x2c\x6d\x78\xbe\xe4\x34\xd4\xfe\xda\x4c\x2e\xf5\x99\x18\x16\xf7\xd6\xea\x8c\xc3\xd9\x28\xa8\x49\xbc\xf5\x03\x9c\xd3\x26\x2c\xd4\x35\xa1\xf5\x03\x9c\xf3\x26\xf8\xcc\xb2\xde\x5a\xa5\x71\xd6\x84\x40\xb7\xe1\xb7\xf6\xb2\xd8\xd5\x31\xa9\xcc\xa5\xbd\x56\xe3\x4a\x56\x0a\xbc\x9b\xa9\x14\xc8\x2e\x61\xba\xe0\x33\x7a\x53\x5d\x30\x2b\xc9\xf3\xac\x0b\xfd\x86\x19\xb6\xfa\x39\xdc\xbc\x6e\xd7\x37\xa0\x1f\xe1\x06\x74\xc1\xf3\x8a\xeb\x77\x97\xc2\x5e\xac\x46\xde\x16\xd6\xda\xcc\x16\x4c\x3b\xb0\xc3\x60\x81\xb7\x47\x41\x79\x18\xa4\xf8\x3a\x90\x67\x49\x1c\x4e\xf4\xe8\xdb\x22\x8f\x16\xb3\xb0\xc6\x91\x25\xe4\xf6\x32\xb7\x82\x6b\xee\x5d\x1e\x16\x10\x89\x98\xdb\xd7\xca\x95\x60\xac\x95\x0e\x93\xac\x2f\xc7\xdc\xae\xcb\xc3\x02\xf2\xc4\x38\x03\xad\x8e\x86\xb1\x1e\x69\xa5\x64\x9e\x24\x38\xde\xd0\x56\x33\xc1\x4c\xb3\x14\x6f\xd6\xeb\xca\x20\x0c\x61\x59\x66\x22\xb1\x16\x09\xc9\x7d\xab\xc5\xb7\x66\x73\xea\xa5\xed\x63\x72\x6b\xa0\x99\xf0\xd8\x3a\xd8\x77\x5f\x07\x5c\xaf\x6c\x7b\x81\x77\xa0\x83\x96\x3f\x4e\x7b\xb1\x77\xa4\x83\x67\x61\xca\x5b\x0b\xbd\x43\x1d\xb0\xd8\x22\xed\x05\xdf\x89\x15\x78\xbd\xcb\xda\xcb\xbf\x57\x3a\x7c\xb1\x51\x57\x1c\xf5\xfb\x62\x16\x5f\x37\x5f\x5b\x3d\x94\xc7\x3f\x7a\xee\xcd\x85\x4d\x00\x42\x6a\xb8\x78\x4e\x52\xc3\xcd\x5a\x6a\xf8\x11\xa4\x86\xe3\x39\xe1\x71\x4c\x96\x3f\x5b\x12\xb0\xea\x4d\x2d\x42\x46\xd8\x50\xce\xe2\x77\xc3\xef\x55\x90\x78\x2e\x23\xce\x4e\x58\xc6\x52\x7e\x4d\xc9\x4b\x8b\x6a\xa8\x2e\xb2\x3e\x71\xf5\x28\xf3\x80\xbc\xe5\x1c\xb7\x70\x8c\xba\x30\xd5\x8d\xb5\xb4\x70\xa1\xc8\x16\x03\xad\x94\x9a\x77\x85\xa4\x70\xa1\xc8\x0f\x43\xad\xb4\x80\x41\x74\x9c\x26\x13\x21\x22\xd4\x35\x39\x2c\x88\x47\xb1\x08\x69\x73\xc1\x3d\x9f\x76\x4f\x0f\x84\xf6\x53\x1e\x0e\x9d\x79\xad\x02\x9d\x4e\x41\xdf\xbf\x71\xc7\x8f\xa6\x94\x1a\xe8\xd0\x57\xa5\x94\x1a\xe9\x80\xeb\x55\x5d\x05\x7f\xd6\x57\x84\x32\xfe\x15\xf0\x66\x0d\xb0\xf8\xb6\xab\x60\xcc\x1a\x70\xb1\x3d\xda\x33\xe6\x6b\x1d\x38\xdb\x61\xed\x75\x51\xb7\xb6\x0d\xc2\x36\x69\x7b\x3f\x9a\xb1\x2c\x50\x1c\x2f\x20\x50\x30\xeb\xc4\x83\xfc\xd2\xff\x23\xb2\xc5\x12\x7e\xe9\xeb\x58\xc3\x6b\xf9\xe2\xe9\xca\x17\x97\x73\xbc\xd0\x1b\xc2\x3b\x98\xee\xd6\x82\xdb\xb3\xb7\x87\x2c\x58\x00\xf3\xf0\xa6\x85\x42\xe0\xa8\x05\x08\x5a\xbe\x07\xc3\x24\x28\x98\x97\xad\x2c\x52\x84\xaa\xe3\xb7\xd9\x9a\xf1\x1f\x26\x98\x68\x2e\xe2\xcd\x12\x48\x6e\x9f\xdb\xd8\x5e\xdc\x6f\x48\x88\xa2\x67\x04\x2f\x1e\x10\xbf\x98\xfa\x4f\xe9\x51\x8a\xd9\x72\x19\x41\x8a\x19\x03\xd0\x63\x14\xd7\x5c\x58\x0f\x51\x2c\x51\x75\x3d\x48\x71\x04\x4b\x14\xa7\xcc\xc5\x56\x0f\x53\x9c\x17\x59\x1e\xd0\x20\x4e\x87\x24\xdb\x96\x1e\xaf\x58\xb0\xd0\x1b\xc9\x66\x69\x7c\x1e\xcb\x83\x79\xcb\x46\xb1\x78\x37\xd3\x2a\x9a\xaf\xfb\x44\xcd\xf8\xcb\x1c\xce\x56\x12\xa7\x78\x60\xaa\xcb\x57\x21\xca\x58\x01\x4b\xcb\x42\xa5\x9a\x79\xd6\x9e\x39\x30\x3c\x30\x90\x2d\x3e\x13\x7d\x3a\xb5\xac\xb0\x02\x11\x47\x83\xcc\x65\xbe\x15\x08\x38\x1a\x68\x59\x0c\x59\x81\x90\xa3\x41\x57\xf6\x7c\x7b\x31\xe7\x42\x87\x6f\x1c\x9b\xf6\x56\xb6\x1b\x1d\x87\x24\xbc\xae\x36\xe1\xf5\xcc\x20\xc9\xfc\x6c\x2c\x95\xe1\xfa\xa1\x86\x9c\xc5\xe2\xbf\x81\x8f\xe0\x2d\xf8\x05\x7c\x07\x5f\xc0\x7b\xf0\x01\x7c\x06\x2f\xc1\x57\xf0\x1b\xf8\x03\xfc\x0e\x7e\x05\x7f\x02\x08\x85\xe4\x85\xe0\x73\x12\xbd\x62\xb8\x96\xbd\x7e\x04\xd9\x2b\x85\x0f\x34\x09\xf5\x61\x92\xa5\xc3\xf2\x2c\x63\x2f\xe8\x6a\xa9\x26\x33\xab\x73\x9a\xe1\x9f\xab\x85\x84\x25\x48\x7a\x62\x63\xb1\x13\x29\xb5\x95\x21\xf2\xe1\xcf\x0e\xe5\x84\x6d\x24\xdc\x11\xa6\x4d\x5a\xa1\xae\x49\x52\x23\x2d\x9b\xc5\xb9\x81\x2a\xac\x8a\x02\xa6\xe8\x2b\xc6\x58\x90\xe8\xc8\xb4\xe0\x13\x0c\x22\x1a\x33\x61\x6c\x5f\xac\xbe\x6a\xe1\x1a\xd8\x5b\x8d\xec\xc5\xc3\x06\xfd\xd7\xc4\xde\xfc\xca\x5e\x7c\xdd\x00\xe5\xd6\x3e\xf9\x0b\x7b\xb1\x19\xea\x2a\x4f\x82\x38\x3d\x88\xac\xc1\xac\xc2\x2c\x45\x45\x96\x24\xb0\x28\x7f\xa9\x13\x01\xc8\x85\xfb\x37\x39\x0c\x11\xc9\xbc\x7d\x62\xc7\x77\x69\x2f\x3e\x34\x5f\x6f\x66\x11\x94\x90\x90\x9f\x12\xf8\x53\x3b\x9c\x73\x7b\xf1\x99\xbd\x78\xb7\x85\x11\x12\x41\x91\xdb\x83\xac\x17\x8f\x64\xc5\x6b\xa8\xcc\xb9\x63\x2b\x66\x72\xc8\x91\x5e\xc7\x8e\x14\x8f\x64\xc5\x2b\xf4\x43\x21\x82\x59\xf1\x26\xda\x09\x11\x01\xad\x78\x0b\x7d\xbb\x1f\x34\x34\xa8\xb7\x3f\xf8\xa8\x37\xc0\x2b\x55\xa4\x41\x82\xe7\xfb\x56\xaf\x44\x59\x9e\x25\xd9\x90\x98\xbd\x7e\xd1\x2b\xa9\x51\x89\x8a\x2e\xdf\x8d\x4a\x84\x82\x70\x84\x57\x96\x36\xf8\xa2\x37\x28\xc3\x11\x8c\xaa\x24\x20\x19\x1c\xde\x1b\xab\x56\x64\x57\x71\x04\x0b\x07\x7c\xd0\xab\x30\xa3\x20\x22\xd9\x67\x63\xae\x7c\xdb\x7e\xa2\x79\xb0\x22\x07\xbc\x6c\x6e\x24\xf6\xe2\xd7\x19\x8d\xf8\x0e\x05\xbf\x19\x9f\x5d\xd9\xd0\x7f\x58\xab\x45\xf7\xdf\xcd\xaf\x4b\x45\xe3\xfd\x9b\x51\x50\x95\xa4\xcd\xaf\xc6\x40\x88\xb5\xf4\x20\x8d\xe0\x8d\x03\xfe\xd4\x6b\xc7\x59\x14\x0f\x26\xac\x16\x42\xe9\x6e\x65\x8b\x25\xd6\xeb\x74\x3a\xe4\xba\x64\x90\x63\x94\x11\xff\x5f\xd7\x03\x75\x13\x9d\x36\xf3\x16\xdf\x34\xf0\xbb\x59\x95\xea\xef\x37\xd5\x4d\xf9\x2f\xb9\x8c\xed\x43\xfa\x30\x37\xfa\x1a\xa3\xd1\x51\x7d\x76\x38\x90\xbf\x5e\xde\x91\x2e\xec\x18\x4e\xff\xcd\x7e\x73\x46\xa5\xb0\xb1\x4e\x1c\xb9\xde\xf4\x2f\x02\xd1\xfc\xb6\x98\xdb\x66\x85\xe5\x72\x69\x36\x7d\xa5\x97\xd7\x9f\x8e\x80\x96\xbf\x75\x23\x50\xb9\xd1\x2b\x51\xc2\x01\x4d\xc1\x9e\x1f\x43\x77\x57\x0b\x7c\x42\x89\x4d\x7b\xff\x80\x1d\x03\xf8\xaa\x1c\x04\x8e\xac\x90\xeb\xab\x57\x6b\x03\xc4\xbe\x65\x55\x28\xd5\x6c\x7f\x71\xff\x64\xc0\x36\x09\x6f\xfb\x3b\xfc\x3b\x03\x8b\x41\xbb\xdb\x9b\x26\x74\x14\x6a\x84\xa7\x6a\xbe\x8e\xa0\xb1\xb7\x07\x76\xd5\x48\x42\x3a\x2a\x9d\xcf\xb4\xbf\xcc\x7f\x6c\xc2\xc1\x59\x55\xfb\x2b\x7d\xf3\x82\xed\x32\x13\xc2\x02\x6e\xb4\x33\x21\x68\x0b\xf7\xd6\x98\x94\xcc\x5e\xdb\xdf\xef\x7f\x31\xe0\xcb\x1c\xba\xfd\x15\xff\xbb\x01\x5f\x66\xf2\xed\xfd\x67\xbf\x98\xf0\x35\x39\xa1\xbd\x0b\xed\x7b\x03\x87\x22\x6a\xb4\xf7\x9c\xfd\x60\x52\x2b\x2e\xad\xb4\x77\x9b\xfd\x6c\x40\xe7\x02\x4f\xfb\xe7\xc0\x2f\xcd\x43\x67\x91\x99\x7a\xd7\x6d\xf1\x7c\x9d\x81\x47\x48\x4c\xed\x03\x91\xfd\x36\x0b\x8f\x10\xbd\x7a\x17\xab\xa6\x24\x9a\xec\xb2\x58\xdc\xb1\x99\x10\x34\x4a\x32\x7f\xfd\x84\x14\xb2\x58\x18\xb2\xc5\xc1\x69\x43\xf9\xc3\x64\xfe\x8a\xe0\xdb\x3b\x69\xbb\xba\xbf\xdb\x31\x48\x1f\xf0\x72\xd5\x1f\xd0\x2e\xcf\x39\xa0\x77\xb8\xe4\x4a\x36\x00\xd2\xd6\xf0\x57\x8b\x7c\x60\x48\xff\xbd\xd3\xb6\xb3\xfc\xd3\x3c\x0f\xf2\x05\xa2\x77\xde\x16\x01\x84\x06\x06\xe5\x12\xd2\x3b\x6b\xfd\x2e\x41\xd6\x32\xa7\xb0\x49\xcd\x1c\x0f\x62\x58\x94\xaf\xa2\x38\xda\x8e\xd3\x92\x66\x33\x37\xb5\xcd\x05\x4c\x23\x58\x6c\x8b\xf6\xd6\x9e\x9a\xe2\xb9\xf9\x7d\x77\xa3\xc2\xae\xb1\x03\x9b\x88\xa3\xa8\x8a\x5f\xbc\x06\x43\x88\xba\x1c\xa7\xb8\x44\xd4\x13\x9f\x4e\xbd\x05\x26\x5e\xe5\x51\x53\x80\xbe\x39\x13\x67\x3d\x9f\xe3\xc4\xb3\x74\x3b\x4c\xe2\xf0\x72\x3b\xab\x50\x19\x47\xda\xf4\xa9\x51\x41\x69\xc0\xfb\x3e\xd7\xe9\x16\xb0\x8c\x6f\xad\xf3\xe4\x95\xfc\x43\x5b\x7b\x3e\xc7\x79\x97\x68\xa2\xe7\x0f\xa7\x73\x26\x15\xb6\xf9\xd2\x1e\xcf\x71\xae\xd7\x71\x92\x6c\x47\xb0\x44\x45\x66\xcf\x26\x3a\xe3\x34\x2b\x7d\x9f\xe7\xe4\xd3\x28\xbb\x9e\xb1\xc9\x57\x78\x7c\x0d\xbb\x0a\x8d\x55\x42\x14\xd5\x35\x1a\xcf\xd5\xb0\x24\x10\xf5\xe2\x6f\x3e\x62\x09\x4f\x52\x1f\xf9\x3f\xc7\xa4\xaa\xb6\xb1\xd1\x29\x74\x82\x28\xda\xbf\x82\x29\xfa\x18\x97\x08\xa6\xb0\x20\xc1\x01\xc9\xa4\x52\x0f\xb8\x9e\xff\xf3\x1d\x6b\x58\xc0\x71\x76\x05\x1b\xdb\x4e\xa7\x9e\xcc\x03\x63\xeb\x02\x16\x59\x85\xc8\x85\xc3\xb2\x5b\xb2\x0a\xc5\xe9\x90\x37\x11\x9d\x28\x63\x7e\x05\xd3\xab\xb8\xc8\x52\xe2\xd7\x66\x31\xba\x72\xcb\x62\xfa\xf7\x06\xf9\x58\x41\x4a\x1a\xa2\xfb\x2f\xb8\xf6\x1f\x2d\xa1\xfd\x4f\x79\xb2\xc7\x3a\x92\x1c\xb7\x1d\x74\xea\xb2\x33\x22\xcb\xd5\x2d\x8b\x2c\x43\x9f\x3f\x7d\x94\x1b\xb2\x22\x6f\x3a\x15\x63\x2b\x40\x41\x33\x2a\x48\xc7\x84\xea\x58\xf1\xf7\x71\x1d\x78\x03\x43\x07\xdc\xe5\x01\x1a\x75\x9d\x57\xf8\xd7\xab\xee\x45\xd6\x3f\x27\xba\xbb\x29\x68\xea\x26\x67\x78\xab\x3b\x77\x71\xe1\x39\x29\x5c\xa4\xbb\xde\x91\x76\x21\xe1\x69\xea\xa4\x16\xac\xf5\x45\xd6\x2f\x9d\x46\x58\x45\x85\xe5\x5d\xad\xbd\x04\xfc\xa1\xb3\x61\xe3\x51\x20\x2b\xa9\x7b\xe4\x0a\x76\x4b\x2e\x1d\xbd\x7d\x9e\x64\x13\xf2\x8d\xf5\x9a\xb8\xcc\x03\x14\x8e\xb4\x62\xc8\x93\x4d\xe8\x1d\x54\x85\x99\x5c\x13\x26\x31\x45\x60\x59\xba\x2c\x47\xf1\x98\x9c\xec\xa6\xb9\xf3\x60\xd2\x6c\xe2\xff\xab\x4c\xaa\x21\xfd\x0e\x56\x2c\x8d\x80\x68\x03\x79\x01\xb3\x08\x9e\xc7\xd1\x8c\x75\x1f\x67\x69\x8c\xb2\xc2\x3a\x72\xf2\xf0\xb8\x98\x81\x8f\x36\x90\xf0\x05\x43\x98\xa2\x87\x23\x64\xba\xac\x89\xbe\xba\x65\xdc\x3c\x06\x9e\xba\x60\x76\x03\x69\x90\xb4\x40\xda\xec\x0a\x32\xaa\x78\x9e\x01\xaf\xd6\x4c\x73\x78\xb4\x60\xde\x06\x57\x36\x0f\x9d\xbb\x8e\x5a\x51\xe7\xce\x87\x23\xaf\x3b\x2f\x9c\xbd\xf8\x83\x72\x1b\x53\x28\xd1\x73\x50\xea\xe7\x6b\x50\xca\xb5\xaf\xfe\x17\xfe\x53\x6f\xa3\xd1\x8e\x39\x33\x4f\xb2\xa1\x7e\x5e\x1e\x3e\x0e\xfb\xca\x95\x10\x61\x8e\x37\x63\xd9\xc8\x13\x73\xba\xf2\x8d\xa7\x5d\xe9\xac\x37\x4c\x33\xb4\x3d\xc8\xaa\x34\x12\xc3\xfa\x5f\x82\x56\xda\xd9\x73\xf9\x4a\xfa\xa4\xaf\x94\x20\xa5\x73\xb8\xb6\x28\xae\x53\x9a\xcd\x70\x69\x6f\xce\xb0\x79\x4d\xe8\x9b\xd4\x62\x1c\xdf\xc4\x29\x96\xb9\xd0\x68\x9b\x54\x52\x1f\x09\x0d\x42\x9a\xa1\x78\x30\x61\xb1\x5b\x1b\x1c\xda\x41\x46\x7d\x8d\x24\xaf\x2c\xe1\x40\x35\x7e\x4e\xfe\x53\xfd\xb5\xfb\xd4\x8f\xe0\x3e\x35\xf0\x5d\x16\x28\x9d\x6c\xfc\x4f\x30\xcc\x8a\xc8\xea\xd8\x94\x4a\xb9\xd8\xaf\x99\x84\x50\xa9\x7e\x25\x2e\x97\x2c\x3b\xb4\xc4\x15\x69\xf2\xbc\x05\x84\xcd\x31\x0f\xb3\x9d\x15\xd0\x01\x21\x33\xec\xd7\xc5\xec\xdc\x46\xb6\x62\x72\x62\xd9\xfb\xf8\x29\x89\x77\xf4\x95\x15\xd3\xeb\x0a\xda\xda\x82\x9d\x12\x22\xb7\x6e\xce\x7c\xa4\xc9\xaf\x4e\x0e\x8b\x41\x56\x8c\x5d\xe4\x79\x53\xe2\x75\x29\xee\x6c\x64\x9c\x1d\x5a\xa8\x8c\xb6\x83\x46\x30\x25\x09\xc1\x58\xc0\x6b\xe4\x43\xd9\x18\x8f\x85\x3d\x6a\x86\xdf\x90\x8d\xe1\x64\x6e\xc4\x5b\x9b\xae\x35\x93\x0a\x51\x0d\x0f\xdf\x88\xb4\x86\x3b\x49\xa2\xd8\xf6\x3d\xb9\x2d\x24\xa4\xb6\x13\xe2\x79\xb8\xee\x6b\x90\x89\xc4\x84\x64\x31\xbc\xe9\x14\x84\x7e\xdf\xad\xd4\x98\xa5\x64\x81\x7b\x98\x18\xe0\x5d\xd4\xfa\xf1\xb3\x8e\x80\x7d\xaa\xf6\x16\xe4\xdc\x0a\x99\x1a\x42\x5b\x5b\x8e\x2b\xf9\x42\x39\x58\x9e\x63\xbd\xe2\x1c\x5b\xe6\x5c\x0b\xf7\x7d\x8c\xab\x3b\x3d\x8f\xf1\xdc\xbb\x1e\xa6\xe8\x84\xea\x6d\xd8\x0e\x62\xec\x3b\xcd\xa3\x06\x2e\xf2\x1d\x04\xc7\x79\x12\x20\x16\x37\x29\x4e\x5d\x1a\xee\xdd\x7b\x9c\x6b\xb0\x7c\x71\x9c\x71\xf1\x9f\xb5\xd6\x8b\x08\x17\x45\x79\x95\x2f\xcf\xf7\x57\xf7\xd9\x6c\x57\x74\x4a\x79\x20\x51\xb8\x50\x11\x0b\xf9\xce\x2b\x67\xea\x43\xa6\x79\x29\xfc\x08\x86\x59\x04\x3f\x7f\x3a\xd8\xcd\xc6\x79\x96\xc2\x14\xb9\x08\x73\x0a\x42\x46\x48\xff\x77\x59\xa1\x08\xd2\x1d\x99\xbc\x6f\xc4\x03\x37\xa9\xa3\xc8\x89\x4b\x3b\xe6\x61\xbd\x84\x44\xa7\x77\x0b\xcc\xc1\x49\xb0\x7c\x7c\x77\x72\xbc\x6f\x32\xf5\x4b\x20\xc2\x1f\x09\x72\x32\xd7\x39\x28\xf7\x62\x2c\x69\xd4\xa0\x46\x41\x39\x72\xe9\xe0\x0b\x20\x50\x77\x13\x10\xc5\x05\xc4\x3b\x72\xb2\x9f\xa2\x22\x86\x65\x37\xe9\x24\xa5\x5b\x48\xf4\x2c\xd5\xe9\x19\x88\xcb\x77\x31\xde\x1e\x3f\x4d\xbd\xae\x15\x68\xdd\xe0\x35\xc0\x83\xef\xa2\xa9\x42\x20\x0d\x80\xd3\x12\xa2\x2a\xdf\xe5\xa6\x3f\x75\xb1\x65\xd0\xb1\x39\xde\xb4\xc6\x56\x50\x64\xc9\xd4\xd7\xe3\xff\xfe\xfc\x93\x24\x4e\x88\x68\xbf\x3f\xc9\xa1\x7f\x7f\x22\xa1\x7f\x29\xaf\xd1\x87\xa3\x1e\x4d\xc2\xc5\xa4\xe8\xbd\x0f\x1d\xa6\xaa\x8c\x79\xc0\x99\x8a\x99\x69\x6b\xde\xb1\xfa\x5b\x89\x9c\xf1\x29\x31\xc2\x78\xe0\xa2\x3a\x2b\x45\xec\x13\xa6\x49\x45\x81\xbc\x80\x70\x9c\x13\x6d\x20\xea\xd4\x3f\xa2\xb7\x13\xe1\xa0\xe4\x6d\x34\x54\xd0\xfd\x1f\x83\x98\xc7\x2c\x5e\xe0\xe3\x4d\x0b\x58\x42\xa4\x0f\x8f\x88\x26\x84\xad\x1d\xc1\x1b\xd4\x09\x83\x34\x84\x09\xe6\xf9\x5e\x5b\xb2\xd7\x14\x56\xdc\xbc\x3e\x35\x5c\xb3\x66\xd0\x3c\xcc\x40\x0a\x90\x6c\xac\x46\x0c\xcd\x7c\xb7\x58\xd0\x47\x99\x73\x2e\x90\x5a\x79\x17\x65\x44\x00\xf9\xb5\x94\x93\xd2\x02\x37\xf6\x13\xef\xa9\x5e\xbb\x14\x2a\x8f\x45\xbd\x2e\x12\x14\x3e\x5e\x86\x92\xbf\x88\x19\x29\xe7\xec\x21\x66\xe9\x59\x51\x80\x60\xe9\x18\x79\x50\x68\xaf\x42\xa4\x6d\x49\xe1\xb5\x08\x26\xe1\xfe\x75\x16\x94\x97\x9b\x2f\xef\xd0\x74\x33\xcd\xd0\x26\xb9\xec\x6f\x0e\xb2\x42\x72\x76\xdd\x7c\x79\xc7\x70\xc4\x91\xe3\x4d\xff\xc2\x52\x15\xe6\x48\xbe\xf3\xdf\xaf\xff\x9b\xc9\xd9\xc2\xb3\x82\xce\x20\xcf\x93\xb8\x1e\x36\x3d\x8c\x74\xaf\x01\xc8\x0f\x54\x31\x9d\x82\xc0\x2f\x24\xe1\xaf\xe4\xdf\xb4\xf2\x7b\x88\xcb\xae\xa1\xdf\x46\x0c\x04\xb9\x7f\x37\x05\xf2\x8d\x36\x6c\xb8\xd1\xe6\xf8\x46\x1b\xb2\x1b\x6d\xae\xde\x68\xe5\x9f\x20\xd7\x6f\xb4\x79\xe3\x8d\x36\xbf\xbf\xcf\xf5\x1b\x6d\xae\xde\x68\x73\xbf\x5a\xe4\x46\xab\x24\xab\x75\x03\x50\x02\xe8\xdd\xdf\x43\x2c\x43\x7b\x20\x92\x58\x50\xae\xdd\x37\x73\x76\xa3\x55\xca\xdf\xe4\xe6\x86\x8d\xf8\x8d\x36\x9f\x7d\xa3\xd5\x31\xd8\xcf\x1c\x1e\x62\x8e\xa7\xc7\x6e\xb4\x7e\x0e\x0a\x6f\x43\xd7\x9e\x08\x72\x91\x3d\x90\x02\xb6\x92\xd2\x19\x80\xe7\x28\xaa\xd7\x43\x7f\x86\xf2\x3a\x1f\xfa\x5a\x68\xb7\x92\xfa\x0e\x4d\x29\x43\x28\x77\x72\x7f\xff\x22\x91\xea\x54\xf2\x9f\xf9\x72\x1d\x08\xfc\xbf\x5e\xde\x25\xe4\x15\xff\xf4\xe5\x5d\xa1\xa4\xf4\x7a\xe5\x78\x6f\x1c\xa7\x8b\xc7\xf9\xf2\xae\x98\xfe\xb5\x61\xbf\x12\x64\xf4\x4a\x10\xf0\x2b\x81\x96\x76\xab\xdd\xed\x00\x4f\x8c\x24\xe9\xb4\x5d\x0e\x32\x7c\x39\x08\x96\xbe\x1c\xc8\x30\x57\x7b\x37\x10\x90\x9f\xf2\xd5\x60\xc9\x51\xb6\xbe\x19\x90\xd3\x4b\xec\x1b\x4f\xec\x76\x50\xab\xf6\x6a\x49\xa7\x51\xb7\xa7\xe4\xa4\xb3\x6f\x72\x4d\x05\xb7\x30\xc1\x93\x04\x9f\xc5\x24\xf3\x2a\x4d\xb2\x2c\x9f\x27\xaa\xd3\x17\xe3\x41\x14\xe0\xeb\x0c\x93\xdb\x39\x6d\x5c\x20\xd5\x8f\xc5\x74\x21\x0c\x17\xf9\x73\x32\x5c\x8c\xd7\x86\x8b\x1f\xc1\x70\xd1\xf7\xdd\x60\xc1\x08\x78\xb3\x05\xa8\x5c\x3c\x6e\x1c\xc4\x43\x07\x94\xcc\xbc\x50\x97\x97\x93\x12\xc1\xb1\x03\x2a\xbd\x5c\x35\x52\xe4\xfc\x6d\x28\x89\xda\x5d\x1b\x29\x62\xff\xae\x80\xc3\x38\x4b\xbb\x77\x05\x1c\x14\xb0\x1c\x1d\x62\x72\x83\x27\x36\x25\x82\xd9\xf7\x0a\x16\x93\x93\xa0\x08\xc6\xe5\xdf\x20\x97\x35\x2b\x20\xe4\x3b\x18\xf9\x52\xd3\xa0\x9c\xa4\xe1\x66\x1f\x0e\xb2\x02\x1e\x4a\x02\xcd\x26\xc2\x72\x07\xec\x48\x23\x3f\x4e\x93\x89\x87\xfc\x93\x22\x1b\xc7\x25\xec\x14\xb0\xcc\x92\x2b\xe8\xbe\x78\xed\x6d\xc0\xa4\x84\xa4\x57\xbc\x11\xfb\xb0\x83\x32\xb9\x5f\x27\x43\xe8\x0d\x12\x99\x38\xc9\xda\x79\x1d\x78\x13\x8e\x82\x74\x08\x8f\x53\x12\x11\xf7\x0c\x17\xbb\xb6\xbe\x5e\xd7\x86\x12\x15\x93\xbb\xe0\x3a\x88\xd1\x66\x3c\xa5\xac\x3d\x63\x66\xef\x85\x6f\xa1\x99\x37\xe5\x7e\x6d\xea\xf0\x3a\x03\x88\xc2\xd1\x29\x4c\x06\x64\x58\x3b\x69\x74\x52\x87\xc0\xf5\xb8\x1d\xa9\x16\x29\x3c\x50\x48\xfd\xe9\x4e\xa2\x00\x3e\xc6\x21\x4c\x4b\x68\xed\x13\x98\x7d\xc2\x11\x0c\x2f\xdf\x55\xb7\xb7\x93\x53\x18\x14\xe1\xe8\x04\x7f\xc8\x34\xb4\xf6\xdf\x40\x3e\x9d\x7d\xa2\x0a\x6e\x06\x50\xba\x31\xb9\x17\x82\x5c\xc5\x3a\x7e\x22\x2d\x1c\x0f\x14\x20\x05\xc1\x37\x6f\x8a\x05\x4e\xa3\x71\x39\xca\xaa\x24\x3a\x1d\x65\xd7\x9f\x6a\x88\x3c\x29\x09\x57\x61\x18\x9f\x8f\x62\x07\xa9\x39\x59\x05\x39\x6b\xe7\x58\x97\x32\x20\x59\x2b\xeb\x51\xde\xdf\xa7\x8c\xce\xbb\xf1\xd6\x56\xfc\xc2\xf7\x8b\xfb\xfb\x17\xf1\xd6\x56\xf1\xc2\xf7\x53\x6f\x6b\x4b\xb2\xab\x61\xae\x4a\x5e\x22\xba\x6c\xf6\x65\x13\x58\x10\xdf\xdf\xa7\x1e\x40\xb5\x8e\x86\x39\x3f\xd6\xc7\x3a\x9e\xfa\x10\xdc\xa1\xac\x7b\x27\x4d\xae\x7b\x97\x21\xd4\x4d\xa7\xd3\xa9\x8f\xd8\x90\x78\x7b\x30\x0a\x4a\x79\x63\xe3\x66\x56\xb5\xa5\x84\x24\x35\x3a\x15\x18\x72\xea\xfb\x8b\xae\xde\xd6\x16\xcd\x4e\x0d\x6f\x90\x47\xa5\x96\x3b\x76\xe6\x59\x0b\x76\xe8\x3d\x0f\x2c\x22\x6a\x16\x0c\x1e\xbe\x52\x16\x1a\xc0\x4c\x1a\xa7\x03\x1c\xc7\x9b\x7a\xe0\xff\xbc\x7e\xed\x4d\xa3\x38\x3a\x2b\x82\xb4\x8c\x65\x4f\x14\x32\x74\x4a\xbb\x3a\x71\x79\x06\x4b\x84\x3f\x24\x73\x09\x2d\x43\x8c\xfd\x2c\x73\x5f\x83\xd7\xde\xf4\x3a\x4e\x12\x13\xc0\xc2\x67\x9a\x4e\x90\xfc\xc0\x94\x0c\x6e\xc6\x69\x89\x82\x34\x84\xd9\x60\xb3\xe8\xec\xf4\xb3\x02\xed\xe3\xca\xfb\xfb\xa5\x35\x56\x53\x50\xfa\x63\x37\xd0\x9e\x12\x11\x76\x22\xe9\xa9\x5a\x1a\x2b\x75\x0c\x35\x63\x5a\x19\x86\xd0\xc0\xc0\xcc\xc4\xab\x42\x10\xe9\x08\xea\x14\x17\xab\x42\xa0\x81\x57\x36\x9c\x03\x7a\x19\x39\xd9\x59\x3a\xff\x2d\xd3\x0c\x30\x1e\x08\xe4\x27\x4c\x1a\x4a\x75\x8f\x3e\x1c\xa7\x06\x67\x36\x52\xb6\x11\x1f\x8a\x8b\x76\xd7\x50\x04\xb2\x6d\xbc\x3f\xeb\x4a\xc3\x1d\x30\x1f\x62\x68\xd0\xb5\x37\xb2\x2b\xd6\x20\x2b\xfa\x71\x14\xc1\x74\x9b\x65\x84\x6e\x50\xf2\xf0\x76\x0b\x84\x19\x15\x97\x9a\xea\x39\x5d\x6a\xc2\xf5\xa5\xe6\x47\xb8\xd4\x44\xbe\x9b\x69\x2e\x55\xb1\xee\x52\x55\x2c\xe5\x52\x55\xa9\xb7\x95\x80\x5d\x4b\x2a\xed\x72\xc3\x2e\x3d\x53\x59\xda\x57\x83\x78\xc8\x22\x46\x42\x62\x11\x38\x86\xaf\x54\xaa\xe9\xf4\xc8\x23\xd0\xae\xd5\x9b\x89\xe8\x50\x00\xf1\x8c\xb6\xb7\x20\x55\x58\x76\x10\xda\xb9\xc4\xe2\xda\x14\xf8\xa1\x9b\x3d\x26\xcf\x2a\x0d\x04\xab\x66\xbb\x99\x4c\x69\xa3\x05\x28\xed\xab\xda\xa3\xfd\x21\x04\x77\x69\x3d\xf9\xda\xd0\xbb\x7a\x43\xef\x02\xde\x85\x33\x74\xd2\xc1\x00\xc1\x82\xdf\xc8\x0d\x55\x65\x5c\x9e\x04\x05\x1e\x81\xe3\xbd\xc1\x17\x63\x7c\xd1\x71\x25\x95\xbc\xa1\xd1\xc4\xf7\x35\xaf\x6b\xd3\x75\x96\x8e\xb7\x36\xc2\xae\x8d\xb0\x8b\x1a\x61\x55\xfa\x34\xc3\x43\x68\x51\xff\x93\xd5\x7b\xf5\x2f\x13\x88\x7e\xc3\x74\x86\x7f\x0e\xb2\xe2\x60\x2d\x2b\xfe\x08\xb2\xe2\x88\x05\x9d\xd7\x3d\xf7\x6b\xd1\x4a\xa9\x4b\x28\x39\x1f\xc5\xb9\xa7\xbf\xd8\x6b\x70\xee\x67\x9e\xd6\x3b\x4a\x5b\xdd\xdf\xdf\x10\x4e\x97\xf3\xf7\xef\xdb\x55\xe9\x7d\xbb\xbf\xbf\x52\xac\xc4\x10\xcb\x6d\x2d\x88\x8f\xf8\xb8\x7e\x11\x60\x53\xb0\xd5\x9c\x93\x6a\x73\x06\x49\x30\xdc\x29\xf7\x8a\x20\x4e\xe3\x74\xe8\x00\xb4\xb5\x85\x3a\x31\x2f\x58\x48\x2f\x66\xea\xd7\xbd\x3b\xc3\x2a\x0b\x93\x78\x18\xf7\xe3\x24\x46\x13\xa2\x6f\x22\x1c\x10\x94\x28\xcb\x09\x2e\xa9\x2c\xd2\x7e\xab\x43\xec\xbe\xf8\x09\x94\xa3\xec\x9a\xfc\x3e\xc2\x72\x1c\xd3\x4f\x29\x15\x9f\x49\x4c\x8b\xc6\xea\x53\x94\xe5\x39\x8c\xb4\xfa\x69\xd3\x1b\x0a\x57\x7e\x44\x71\x48\x13\x85\xd8\xdf\x51\x00\xb9\xa5\xf2\xb5\x44\x7b\x39\x94\xa2\xd4\x95\x3e\x59\x18\xd8\x9f\x2c\xac\x4e\x17\x35\xb0\x3f\x59\x68\x1d\x5a\x2f\xb7\x42\x5e\x71\x64\xbd\xb1\x15\xc9\x63\xbc\x8b\x18\x2d\xc2\xf1\x17\x75\x06\x7e\xd4\xf7\x7a\x9a\x70\xb1\x28\xab\x5f\xdb\xb9\xd7\x6c\xfe\xe9\xb2\xf9\x3e\x63\xf3\x29\x27\x99\x1a\x8f\x8f\x2d\xef\xf2\xca\x79\xef\xf2\x96\x53\x22\x69\x26\x6f\xdd\x12\xce\xce\xa7\x6e\x09\x17\x27\x33\xb2\xbf\xcb\xf3\xee\x16\x78\x92\x47\xb8\x41\xe5\x8f\xdd\xd2\xc6\x0d\x92\x15\x9a\x3e\xca\x47\xe1\x06\x91\x15\x32\x25\xd4\xad\xb9\x40\xb9\xb8\x92\xbe\x8c\x9f\xe6\x8b\x8d\x02\x52\x97\xb4\xda\x9c\x87\xb8\xd1\xe3\x2c\x23\x41\x0e\xea\x0c\x37\xce\xe2\x4e\x56\x78\xb2\x3c\x62\x41\x2b\x25\xd9\x23\x98\x23\x78\x46\xd5\x15\x69\xd4\x02\xdf\x4d\xe6\x89\xe5\x69\xe3\x71\x6f\xa1\x64\xcb\x9e\x8b\x92\x4d\x52\x2f\x13\x1b\xbd\x14\xad\x02\x1f\xc9\x2e\x09\xa5\x21\x2b\x9a\x0b\x8b\xa2\xb9\xf4\x13\xe9\x14\x57\x7c\x3d\x42\x59\x09\x16\xb5\x53\x82\x8d\x75\x25\x58\xd4\xc0\xba\xc7\x98\x75\x47\x8c\x75\x8f\x55\xd6\x2d\xff\x04\x63\x9d\x75\x8f\x1b\x59\xf7\xf8\xfe\x7e\xac\xb3\xee\xb1\xca\xba\xc7\x7e\xb8\xbc\x12\x0c\x4b\x59\xb5\x12\x6c\xec\x81\x5c\x62\xdd\x63\x8d\xb1\x8e\x19\xeb\x56\xca\xdf\x8c\xcd\x8f\x9d\x73\xd6\x3d\x9e\xcd\xba\x75\x0c\xf6\xfd\x8a\x87\x38\xc6\xd3\xa3\xac\x3b\xf3\xc7\x20\xa1\x4a\x30\x59\x1b\x24\x4e\x5f\xb0\x20\xf1\x59\x8b\xc5\x6b\xb1\x78\x2d\x16\xff\x1d\x62\xf1\x6f\x98\xae\x5b\x32\xf5\x3c\x7b\xd1\x98\xb0\xb2\xaf\x14\x8a\x45\x3a\x56\x18\xd8\x5a\x52\x5e\x42\x52\xde\x58\x84\x7e\xf3\x7c\x0b\x7f\xa3\xa1\x15\x64\x82\xf2\x06\xcf\x89\xf2\x96\x6b\xca\xfb\x23\x50\xde\x6a\x71\x0b\xbe\x8d\x60\x06\x2a\xc1\x4c\x18\x65\x0c\x34\x87\x94\x8c\x2b\xee\x0b\x3a\x4f\x61\xea\xbe\x93\x42\xcb\x75\x99\xc9\x9a\xe7\xf2\x9a\x8a\xa7\xd4\xb3\xa3\xee\xd4\x47\xfb\x2f\x7c\xde\x5f\xde\xc1\x8e\x04\x75\xfa\xd7\x4c\xfb\xfb\x14\x24\x7e\xe9\x16\x8f\xa9\x9d\xce\x0c\x04\xab\xf6\x3a\x29\x64\x82\x58\x2d\x2a\xd0\xd2\x7f\x5f\xa9\x29\x56\xd6\xd2\xed\x5a\xba\x5d\xd3\xd8\x47\x94\x6e\xb9\x6d\xf7\x9f\x22\xde\x5a\x23\xb2\x95\x0e\xa0\x2f\x34\xbb\x56\x8b\xe2\x74\x56\xf8\x14\xcd\xc4\xca\x72\x26\x9d\x04\x43\xd8\xfd\x09\x7c\xcf\xcf\x88\x94\xec\x80\xef\x39\x4d\x49\xd1\x75\x9c\xe9\x5a\x5a\x5e\x95\x5e\x59\x63\x0e\x6b\xa5\xc7\x9a\x2d\xac\xd9\xc2\x9a\x2d\xfc\x6d\x6c\x61\x4d\xc7\x57\x43\xc7\x79\xd0\xf0\xe5\xd5\x1d\xb3\x92\xd4\x0b\x9a\x9a\x3d\x27\x9a\x1a\xac\x69\xea\x8f\x40\x53\x4b\xdf\x4d\xe7\x99\x4f\x17\xa2\x89\x99\xa6\xc1\x28\x18\xf5\xcb\xac\x0a\x8f\xe9\x14\x14\x7e\xe0\xa6\x8f\x7a\xc7\x4f\x0c\x0c\x2b\x56\x53\xa4\x32\x7d\x29\x17\xa4\x2f\x0b\xf9\x85\xab\x91\x4b\xfe\x46\xc1\x71\x9e\x4d\x7f\x41\xe7\x80\xc6\x20\x2b\x58\xd6\xa4\xf4\x84\x5b\x16\x41\x1f\x0c\xc0\x48\x90\xc9\xe1\x73\x22\x93\x93\x35\x99\xfc\x11\xc8\xe4\x95\xef\x56\x3e\x79\x83\xa7\xd8\xdb\x58\x1a\x11\x2c\x20\x89\x4a\xe6\xa3\x26\xe5\xf0\x8c\xa8\x33\xba\x26\x97\x7e\xa9\xe5\x0d\xfa\x93\x27\xfd\x2c\x1d\x0f\xe4\x1a\x4d\x4e\x75\x9a\xcc\xe3\x9c\x83\x72\xbe\x73\x8b\xd5\xb5\x65\xa8\x12\xe6\xb1\x88\xd8\xf2\x3d\xe7\x63\x79\x12\x61\x5b\xf8\x50\xd5\x65\xeb\xb3\x11\x2b\xb5\xd2\x2a\x82\x81\xad\x01\x21\x73\x23\xc6\x85\x74\x65\xb9\x1e\x95\x8d\x91\xec\xae\xe9\x42\xc3\x13\xc8\x08\x0b\x24\xe0\x9f\xbc\x0b\x3b\xd2\x1a\xca\xae\x35\x81\x11\xb1\x8d\x77\x6a\x78\x29\x2a\xb6\x91\xe9\x95\xce\xcd\xa4\x02\x88\x61\x2b\x15\x0b\x22\xf9\x14\x82\x99\xe6\x55\xb6\xc2\x36\x2b\x6b\xf3\x1c\x31\x4b\x1f\xfb\x13\x37\x7f\x4c\x86\xdb\xd7\x11\xa8\x3b\xa2\x57\xb5\x45\x30\xb0\x22\x90\x37\x55\xfb\x1c\xe7\x23\x2b\x8e\x15\x25\x37\xcf\x65\x91\xe4\x6a\x51\x91\xa4\xde\xcd\x2b\x7d\xab\xb6\x40\x64\xca\x47\x7b\xd0\x86\x05\x0d\x4a\x00\x25\x17\x26\xd0\xdf\x30\x5f\x89\x3d\x07\x21\x63\xb4\x16\x32\x7e\x04\x21\x63\xe8\xbb\xe4\x35\x5a\xa6\xe9\xb7\xb8\x94\x51\x35\x25\xa2\x09\xe7\x5d\xe1\x82\xa5\xf4\x5b\x03\x55\x34\xa8\x5f\xa0\x0d\xb4\x2b\x5e\xae\x95\xb3\x13\x3b\xb6\x15\x13\xf2\xd6\x5f\xa9\xde\xcb\x66\x1b\x97\xd2\xb8\x75\x3f\x9c\x1e\x1f\x75\xf2\x00\x6f\x3a\x28\xe2\x73\x7b\x9d\x8b\x2c\x4e\x5d\xe7\xdf\x8a\xb1\x5c\xa4\xb0\x91\x20\x74\xca\x3c\x89\x11\x69\x0a\x62\x1f\x75\xf2\x2c\x77\x3d\x90\xfa\x88\x81\x70\x3c\x90\xf9\x04\x4b\x89\x8a\x38\x1d\xc6\x83\xff\x9f\xbd\x77\xff\x6e\xdb\xc6\x1a\x45\x7f\xcf\x5f\xc1\xf2\xcb\xf8\x88\xa7\x24\x42\x80\x6f\xcd\xa8\xb9\x69\xd2\x7e\xce\x1c\xbb\xcd\x6a\x32\x9e\xbb\xae\x8f\xd7\x98\xa6\x60\x8b\x0d\x45\xea\x23\x29\x39\xb6\xa3\xff\xfd\xae\xbd\xc1\xb7\x28\x4b\x8a\x9d\xda\x69\x3d\xd3\xd0\x22\x00\xe2\x8d\xfd\xde\x1b\x57\x83\xe3\x42\xa1\x1e\x2f\x4f\xd5\xf0\xf3\xe7\xea\x86\xd4\x93\x2a\xa8\x66\xda\x4b\x63\x74\x91\x7f\xa9\xa7\x2f\x21\x73\xa2\xde\x08\x57\x76\xb1\x7f\x76\xa1\x1a\x9a\xae\xef\xa2\x3a\x65\x43\x54\x89\xf1\x68\x32\x08\xbe\x26\x1e\x9f\xad\x34\x70\xdf\xbc\xff\xb4\xdb\x42\x29\xb1\xbc\xb3\x77\xd8\x59\x6f\xcd\x02\x7d\xdf\x99\xfe\x08\x9a\xe8\xfb\xe2\x36\xf4\xdd\xb8\xa3\xee\xcb\x3d\xcd\xd7\xcb\x2d\xef\xc9\x3a\x3f\x5a\x11\x2f\x6d\x13\xef\x42\xe0\xef\x5d\x0d\xf2\xd3\xc7\x6a\x90\xaf\xfa\xa3\x9b\x99\x7f\xc1\xdf\x87\xd7\x3d\x0c\x95\x1a\xf3\x4f\xb9\x88\x6a\xb7\x9a\x97\xe5\x7e\x3e\xcf\x7a\x32\xf2\x34\xbc\xb8\xe0\x29\x1f\xff\x78\xd5\x93\x7b\x2b\x07\xa7\x66\x18\x43\xf1\x03\x4f\xa7\x7d\x15\x03\xad\xdf\xc7\xf5\x25\xab\x5c\x5f\x74\x2b\xd7\x07\x8b\x58\x6c\x10\x7f\x27\xae\x2f\x3a\x4e\x4e\x46\x7e\xe7\x52\x88\x6a\x92\x72\xb5\x9a\xcb\xb0\x39\x94\xb8\x9c\xac\xb4\x35\x39\x91\x18\x51\xd2\x9a\x13\x7f\xd9\x88\xc8\x7d\x3b\xfc\x54\x57\x79\xbf\xfa\xe8\xc9\xea\x4d\xcd\x10\xf9\x6a\x41\xe3\xc0\x88\x66\x3c\xfd\x0f\xf4\x73\x18\xe2\xfa\xfe\x27\x2f\xfa\x7e\x1e\x46\x39\x4f\x87\x22\x62\x60\x75\xe5\xc4\xcb\xd3\xb7\x6f\xa4\x20\x89\x73\x3f\x8c\x33\x49\x06\xf4\x21\x4b\x49\x2a\xfd\x33\x39\xeb\xcf\xf8\x25\x19\xf3\xfe\x9c\x0f\xf5\xd8\xbb\xd9\xa7\xc2\x8d\x3a\x1f\x95\x77\xc2\x8e\x46\xa3\xe4\xa5\x5c\xd4\x15\x66\x78\xc3\x05\x9f\xce\xf2\x2b\x79\xd8\x48\x15\x29\x6a\x38\x3a\x5d\x57\x77\xb4\x94\x4f\x55\x7f\x74\xfa\x1e\x17\xa0\x95\x95\x2e\xe5\x53\x21\x68\x7e\x16\x9e\x0f\xca\xe8\xec\x52\xf2\xf9\x73\xfa\xf9\x73\xf4\x72\x90\x8d\x4e\x07\xcf\x6f\xf8\x52\x39\x55\x93\xbd\x3d\x78\x7d\x7e\x93\x2d\x25\x3f\x1e\xe3\xa5\x1b\xa7\x8a\x1a\xad\x24\x87\x90\x9c\xae\x24\xfb\x90\x9c\x29\x43\x0e\x2d\x15\x0d\xd4\xc1\xae\x6f\x8e\x93\x93\x61\xae\x1e\xa7\x27\x43\x5f\x3d\x8e\x4e\x86\x61\x45\x41\x67\xa3\xe3\x04\x98\x86\x93\x8a\x34\x1d\x00\x28\xac\x16\x28\x1e\xf1\xe3\xf0\xa4\x8a\x07\xbf\xb7\x27\xcb\xdf\x8d\x46\xf9\xcb\x7c\x94\x03\xb8\x08\xfc\x7c\x70\x5a\xf4\x21\x5e\x9e\x2a\xc3\x70\x6f\x6f\x90\x8f\x30\x68\xa6\xa2\x02\x95\x90\x95\x77\x7a\x08\x28\x3f\x10\x5a\xbb\x64\xd4\x14\x4e\xfb\x15\x44\xcb\x9a\x2e\x35\xf3\xbb\xb9\xd4\x8c\xbb\x2e\x35\xf3\x35\x1c\xc2\x18\x38\x84\x79\xc1\x21\x8c\xdb\x1c\x42\xf3\x55\x1d\x77\x39\x84\xf1\x5a\x0e\x61\xfc\xf9\xf3\xb8\xcb\x21\x8c\xdb\x1c\xc2\x78\x94\xed\xee\x52\x93\xa8\x7e\xe5\x52\x33\x56\xd4\xa0\xc1\x21\x8c\x3b\xf4\xfb\xb8\xe0\x10\x5a\xe9\x2f\xc7\xab\xe0\x3a\xa8\x38\x84\xf1\xed\x1c\x42\xb7\x85\x7e\xd8\x07\x5d\x1c\xc3\xf0\x04\x87\x90\x8e\xc6\x6a\x2c\x5c\x6a\x9a\xd6\x16\x35\xca\x8c\x6e\x45\xf5\x78\x17\xf8\x7d\x1b\x61\x6f\xa3\x46\xd8\x4e\x49\xb0\xc2\xb4\x6f\x7f\x3b\xac\x90\xfe\x3f\x5b\xe5\x74\xbf\x05\xb6\xfc\xe2\x89\x2d\xff\x2b\xb0\xe5\x57\xc5\x1d\xb1\x5d\xb6\x1c\x6f\x38\x55\xdb\x1c\xfb\x2d\x81\x66\xe6\xbd\x4a\x80\xfe\x40\x33\x1b\xf9\xf9\xdd\x02\xcd\x4c\xfa\xf9\xf9\x49\x3b\x66\xfb\xac\x93\xdc\x61\xe7\x27\x6b\xe3\xcf\x9c\xf5\x95\x40\x48\x71\x7e\x8b\x19\x7b\x79\xff\xff\x7a\x1b\x76\xb5\x71\x6d\x5d\xde\x8d\x9f\x5d\xd1\x5d\x6a\x3a\xe2\xa4\xac\x4c\x8d\x56\x18\xf2\xb4\xc3\x87\xab\xc9\x68\x0d\xaf\x8d\x37\xd1\x46\x1b\x42\xc5\xb5\x2f\xbe\xb8\xf5\xf6\x14\xd5\x1f\x21\x84\x7d\x35\xcf\x93\xb7\x53\x80\xdd\x6f\xae\x62\x7f\x1a\x06\x03\xf9\x53\xce\xd3\xa9\xdc\x6a\x0a\x88\xd8\x30\xf6\x23\xa5\x92\x14\x94\xc1\xdd\xc5\xbd\x33\x18\x80\x7c\x5d\xa4\xec\xe3\x50\x8d\x4f\x46\xf9\x9a\x7b\x52\xb8\x1a\x16\x22\xff\x7f\xcd\xca\x66\x06\xf1\x56\x41\x6e\xd6\xdf\x14\x7c\xc7\x08\x37\xe3\xd1\xc5\xd7\x96\x31\x74\x1a\xb8\xf7\x68\xcb\xdd\x06\xee\xed\xd6\xdf\xb3\xde\x9a\xdb\x21\x74\xee\x2c\xc7\x38\xef\x6d\xe4\x6b\xc8\x31\xae\x36\x11\x37\x78\x65\x8e\x76\x91\x26\xf3\xd9\x17\x5f\xda\xf8\x48\x45\x19\x7f\x1a\x21\x46\x9b\x1d\x87\x55\xfa\x4f\x7d\x51\x63\x01\xd2\x6b\x40\xf9\x7e\x92\xa4\xf9\xdb\xb1\x10\x4e\xce\x10\x62\x63\x18\x79\x24\x65\x95\xe6\x95\x5c\x50\xd3\x2f\x58\x11\xfe\xfc\x6f\xd8\x04\xe2\xbd\xe7\x53\x52\x6f\x14\x00\x9e\xd0\x09\x7c\x11\x6e\x4b\xeb\xef\x11\x58\xed\x58\xd8\x69\xad\xd1\x11\xbc\x5b\xa0\x2f\x06\x7e\xd1\xf9\x0c\x10\xb0\x9c\xf1\xfc\x83\x9f\x7d\xac\xcd\xee\x65\x75\x6d\x33\xa2\xda\x6e\x8b\xcb\xed\x62\xaa\x3d\x31\x8a\x4f\x8c\xe2\x96\x8c\xe2\x37\x18\xe1\xe6\xf7\xe4\x6c\x97\xd0\x36\x50\xfc\x2e\x81\x55\xfb\x6e\x04\x7b\x32\xa0\x7b\x32\xa0\x7b\x62\xa2\x1f\xc6\x80\x4e\xf0\xd0\x5f\x62\x3d\xf7\x4f\x00\x1c\xdb\x98\xce\xad\xf0\xce\x7f\x5d\xd3\x39\x31\x67\x5f\xc1\x6e\xae\x7b\xf3\x01\x80\xe9\x1e\xa3\x39\x64\xb0\x6f\xfe\x2c\x66\x72\x30\x9b\xb5\x8d\x5c\xcf\xa8\xfc\xd9\x03\x1b\xc6\x89\xf5\x7e\xb2\x8a\xdb\xc1\x2a\x0e\x09\x0c\xdc\xa7\xf7\x71\x9d\xcf\x76\xb1\x4f\x1a\x41\xf1\x04\xcd\xf7\x6c\xf5\xe2\x9b\x6f\x01\x95\x8f\x9f\x50\xf9\x5f\x01\x95\xcf\x56\x22\x2e\xee\x14\x01\x25\x28\x2f\x1c\xf5\xe3\x2a\xce\x49\x95\xd8\xb9\xa7\x27\x68\x4b\xa8\xb3\x4e\x32\x1e\xbb\xb4\x72\xc0\xdc\x4a\xcc\x1c\x8e\xff\x1d\xe6\x35\xec\x6a\x59\x81\xe1\xed\x9e\x6a\x38\xaa\xa4\xc5\xe2\xfa\xc6\xba\x8e\x68\x39\xe2\x6a\x32\x8a\x48\xe4\x67\xf9\x5b\x60\x43\x7e\x3d\x47\xfb\xb0\xbf\x6b\xf4\xbb\xd1\x28\x79\x39\xc8\x47\x51\xb1\x97\x74\x35\x01\x92\xa0\x7c\x4d\xbe\xa7\x8a\x32\xcc\x47\x51\x71\x25\xa4\xbf\x22\xa8\xce\xd5\xb0\xb6\x12\xbb\x4d\x44\xed\xb7\x6c\xc1\x1a\x97\x8d\x97\x56\x6c\xc7\x7d\x82\x6b\xb5\x48\x6c\x18\x0e\xf5\x5a\x37\x74\x91\x34\x6c\xf0\x0d\x28\xf7\xa4\xd5\xeb\xc0\x8f\xe1\xdf\x40\xf6\x83\x80\xcf\x72\x29\xe5\x41\x32\x9d\xf2\x78\x5c\xdc\x1e\xb8\xb7\x97\x93\xd9\x3c\x9b\x94\x56\x79\xed\xfc\xf7\xf3\xe9\xd4\x4f\xf1\x3e\xd1\xaa\xcb\x13\x3f\x7b\x8d\x16\x0b\xc2\xc0\x40\x2e\xef\xb2\xac\x5a\x4a\xb9\x3f\x96\x0a\xa3\x86\xba\xfe\xde\x5e\x63\xe8\x60\xa5\x16\xd6\xa3\x74\x3d\xef\xde\x67\xad\x6c\x08\x87\x99\x8c\xc6\x83\xa8\x75\xdf\xa1\x7f\x9f\xa2\x65\xbf\x5b\xfd\xfd\x5f\xeb\xd4\x69\xe0\xbe\x85\xe3\xf3\x6e\x03\xe5\x59\xbd\x3f\xef\xbe\x26\x4e\x9f\x6d\x83\xd3\x9f\xe2\xf6\x3c\x05\x68\x78\xa2\x0c\xfe\xc8\x00\x0d\xb7\xa8\xc3\xfb\x63\x35\xbc\xea\xdc\xcd\xf2\x87\x87\x6d\x68\x29\xd9\x36\x47\x70\x28\x43\x2d\x97\x56\x66\x88\x72\x30\x11\x35\x06\x00\x79\x08\xca\x38\x9e\xad\xdc\x53\x76\x8b\x56\x79\x0b\x03\xf9\xdd\x14\xae\x0f\x17\x23\xa2\xad\xb4\xfc\xb3\x84\x8b\xa8\x30\xca\x9d\x2e\x7f\xbd\xab\x99\xd5\x5a\x04\xb5\xcb\x2d\x5f\x4f\xc2\xe3\x27\xbc\xf2\xd8\xf1\xca\x62\xcd\x5d\x5f\x42\x7a\xdc\xbc\xea\xab\x75\x3f\x48\xb6\xed\x1d\x60\x85\x64\x7a\x8d\x69\xd6\x2f\xc9\xb8\xf6\xd2\xde\xd1\x4e\x6b\xfd\xcd\x03\xb7\xc9\x95\x91\x99\x18\x77\xa4\xb0\x05\xbc\x9e\xf5\x09\x67\x6b\x19\x74\x5b\xa8\x2b\x7a\xde\x2b\xf0\x6d\x01\xe6\xcd\x12\xdf\xf6\xcd\xb8\x4d\xee\x2b\x4e\xf2\x55\x06\xac\x5f\xd1\x27\x50\xe1\xd2\xcf\xae\xe2\x40\xea\xbb\xa5\xa0\x0f\x73\xde\x87\xb7\x98\xda\x58\xef\xe1\x26\x6c\xa9\x36\xee\xed\xad\xa7\xb1\x16\x0b\x2f\x85\xf9\xd2\x55\xdb\x7a\xe6\x7e\x19\xc0\x59\xb7\xfa\xfb\x66\x00\xa7\xdd\x06\xee\x2d\xa2\xd3\x59\x6f\xcd\xc5\x56\xbc\x3b\x92\x3e\xef\xad\xfe\x9e\x6d\xa3\x26\xbd\x8d\x7c\x0d\xdb\xa8\xad\x84\xd1\x2f\xb0\x40\x79\xa5\xfe\xa3\xd2\xee\x6f\x4f\x00\x87\xe7\x03\xae\x54\x77\x0e\x9e\x73\x00\xca\xfe\xe5\x9b\x6a\x64\xd5\x1d\xbd\xf9\xe8\x07\xd4\x20\x0d\xb9\x5a\x8f\x7b\x98\x2f\x15\x65\x4d\x08\xcc\xf0\x7c\x90\x37\x5d\x38\x7f\x4f\xce\x9e\xe5\x04\x4a\x9c\xf9\xc1\xc7\x57\x79\x9e\x86\x67\x30\x9f\x03\x45\xcd\x09\xd6\xf0\x76\x3c\xa8\x94\x3b\x61\xf6\xd3\x38\xcc\xf1\xce\xc3\xef\xa8\xb2\xdc\xcd\x14\x41\x2c\xce\x2c\x4a\xae\xa6\x6b\xe9\xc0\x3f\xde\x06\x61\x3b\xe1\xc2\x1a\x73\xfc\x27\x1f\xf9\x27\x52\xf0\xf1\x92\x82\x17\x85\x31\x7e\x3f\x59\xd7\x3c\x8a\xb7\xd2\x7f\x30\xcf\x4d\xe2\x6f\xc5\xa9\xfe\x4d\xf3\x50\x17\x61\x46\xea\x6f\xba\x74\xdf\x8a\x60\x62\x37\xfb\xfc\x0d\xfe\xf6\xab\x1d\xea\xf5\xbc\xaf\xfa\xb7\x85\x07\xfe\x97\xc8\x2d\xc2\x96\xc8\xbc\xd4\x31\xb4\xa7\xbc\x48\xac\xa7\xf7\x64\x3b\xd1\x46\xcb\xe6\xbc\x35\xd4\x9a\x0c\x6b\x24\xaf\xb5\x43\xaf\xe7\xa0\x11\xce\xa6\x48\x5b\xb5\x40\x5f\xe3\xe5\x9e\x7c\x2d\x2f\xf7\xd5\xd1\xdd\xc7\x4d\xa8\x7d\x8d\xd4\xf3\xf0\xa7\x71\x78\xaf\xf1\x6d\x98\xcd\x0a\x62\x75\x6b\x11\xfe\x5a\x54\xf8\x07\x58\x89\xe7\x77\xb6\x12\x47\xde\xe2\x5b\xb0\x11\x6f\x73\x89\x1b\x81\x4b\xed\xc4\x23\xc0\x06\xbc\xca\xca\xb3\x15\xee\xb2\x5c\x71\x09\x75\x93\xe8\xc4\xdc\xb4\xb7\x59\x6e\xe4\x38\x77\x07\x77\x9f\x3f\xdf\x5e\x63\x8f\x55\x36\xae\x52\x36\x3a\x0e\x9f\x6c\xb2\x9f\x6c\xb2\x57\xc1\x56\x53\xef\xfe\xa4\x7c\x7c\x52\x3e\x3e\x71\x06\x7f\xa4\xf2\xb1\x6d\xf5\xd2\xaf\x7c\xfc\xa9\x55\xe6\x01\x94\x8f\xcd\x0e\x7c\x5d\xe5\x63\x6b\x3a\x76\x56\x3e\xb6\xfa\x59\x13\xda\x8d\xe4\xc7\xa1\x7c\x6c\xf5\xf3\xcf\xa7\x7c\xbc\x83\x1f\xcc\x57\x43\x2e\xbb\xab\x1e\xd5\x0b\xf5\x4a\x5d\xa8\x97\xea\xb5\xfa\xbb\xfa\x49\xfd\xb5\xc6\x32\xef\xbe\x25\x2c\xf3\xf1\x09\xcb\xfc\x15\xb0\xcc\xe1\xd6\xaa\xc8\xb6\x8b\x4b\xb6\x4e\x49\x39\x5f\x53\x9b\x96\xa1\x21\xe4\x55\xe9\x1e\xb3\x8d\x1e\x73\xbc\xbe\x60\x1b\xff\xcd\xd6\x17\x8c\xfc\x9c\x67\x79\x2d\xa4\x90\x15\x75\xda\x1f\x76\xb2\x56\xbd\x34\x7d\x71\xde\x17\xdd\xee\x53\xcc\xf4\x40\x65\x91\x74\xd0\x6d\xb4\xa5\x35\x52\xd4\xb3\xfb\x8d\x87\xf1\xae\xa9\x67\x2d\x75\x9f\xef\xda\x08\x7a\xd2\x49\x2e\xc6\x7c\xd1\x97\x5c\x4d\xc1\x55\x5f\x6e\xa1\xfa\x5a\xf4\xe5\x55\xb3\x75\xb9\xa6\xde\x7a\xf2\xae\xfb\x4a\xb4\xe6\xf2\xf7\xbe\x12\xab\x53\xfb\xa9\xaf\x18\x62\xb1\x5f\x0b\xc2\xe2\x01\x14\xb4\xc5\x6e\x6f\xe4\x16\x53\x53\x17\x12\x94\x4b\x75\x2c\x76\x54\xea\x36\x0e\xc0\x70\x13\xc9\xa2\x76\x0f\xc1\xb0\x6a\x7c\x86\x98\xb6\x29\xc3\x2b\x85\x0f\xbd\xb3\xdd\xaa\x34\xcc\xaa\x8a\x26\x7e\xf6\x7a\x12\x46\xe3\x94\xc7\xed\x0a\x8a\xad\xd4\xe7\x57\x94\xf7\x8b\x4b\x96\x95\xc2\xfa\x0b\x8d\xa5\x6f\xd1\x73\xf7\x3a\xd4\x97\xfb\x61\x6f\xef\x58\x9e\xf1\x34\x4c\xc6\x61\x20\xab\x32\xba\xea\xf3\x9c\xa7\xe1\x35\x1f\xcb\x27\x24\x8c\x83\x68\x3e\xe6\x40\x38\xe7\x7c\x3a\x83\x29\xfd\x70\x35\xe3\x4a\xcf\x7d\x75\x59\x92\x96\xef\x57\x43\x39\x9b\x9f\x4d\xc3\xfc\x43\x38\xe5\xb2\x0a\x39\x6f\x78\x16\xf0\x78\x1c\xc6\x17\x02\x2e\x6f\xe7\x34\x7f\x3e\xfa\x38\x38\xfb\x7a\x0a\xfa\x49\xb7\xfa\xfb\x56\xd0\x5f\x74\x1b\xb8\x37\x05\xfd\x55\x6f\xcd\x15\x0c\xbb\x3b\x29\xbb\xe8\x6d\xa0\xb4\x00\xb8\xb3\x3c\xfa\xb2\xb7\xfa\x0a\x92\xde\x5d\x26\x7d\xbd\x6e\x82\x1a\x26\x06\x77\xf6\x77\xfb\xbd\xb7\x91\x36\xc7\x72\x67\xbf\xb7\x4f\xbd\x8d\xac\xa2\x84\xe3\xd9\x5d\x5b\xfa\xb5\xb7\x25\xc1\x1b\x4d\xef\xac\x81\x68\xf2\x46\x87\x5b\xf1\x46\x8d\x40\x21\x77\x12\xb6\x15\x19\x65\xc8\xbc\x7e\x07\xbf\x7b\x0b\x13\xd0\x89\xcc\xb7\x51\x81\xbf\x36\x18\x40\x93\xa9\xaa\x19\xaa\x4f\xdf\x12\x43\xf5\xeb\x13\x43\xf5\x57\x60\xa8\xde\xb5\x03\x03\x74\x18\xaa\x60\x4d\x56\x83\x3b\x1a\xaf\x2d\x12\xf8\x11\x2f\x99\x9d\x68\x0b\xf6\x69\xba\xbe\x60\x0f\x57\x74\xd6\x2b\x43\xfc\x67\x72\xb6\x86\x13\x7a\x8f\xdd\x59\xcf\x16\xad\x40\x65\x45\x3d\xdf\x24\x82\x4c\x76\x62\x7b\x3e\xf5\x73\x38\x9f\x3a\x21\x02\x6a\x26\xe7\x53\x2f\xab\x72\xd5\x9b\x2b\x46\xb7\xe8\xcb\x6b\x0d\xf6\xb2\xaf\xc4\x2a\x46\xba\xee\x2b\x86\xa0\xf3\xf7\x6e\x0c\x02\x0c\x0f\x5d\x85\xa2\xaa\x02\x06\xde\x66\x88\xf6\x5d\x58\x58\xa2\x15\xf0\x64\x10\x16\xce\xa1\xd9\x3b\x3f\x85\x93\x20\x2b\x2f\x43\x22\x9c\x2c\x07\xca\x10\x99\xe5\x94\x67\x49\xb4\xe0\xca\x40\x69\x0a\x4c\x2b\xe1\x6b\x51\x43\x15\xe3\x29\x93\x15\xf4\x3a\xfc\xf1\xaa\x20\xd4\xd5\x5c\x34\xcd\x6b\x81\x6d\xcc\x2f\xeb\xd0\x09\x83\xd3\x0f\x7e\xf6\x51\x42\x9c\x85\xb1\x8f\xa5\xf3\x24\x95\x7e\x4f\xce\xa4\xe7\x37\x61\x8b\xe0\xc7\x38\xcd\xe7\xc9\x3c\x1e\x9f\x2a\xcf\xf2\x49\x9a\x5c\x4a\x9c\x04\xc9\x98\x8f\x64\x53\x37\x65\x95\x17\xe1\x86\xb1\xdb\x7e\x14\x29\x83\xe3\x90\x4c\xfc\xec\xd0\x8f\xaf\xba\x7e\x27\xe5\x18\xd5\xa2\x09\x3c\x34\xef\x31\x04\xcd\xaa\xed\x86\x72\x5b\x88\x86\x3e\x36\xb0\x69\x99\x17\x8e\x0a\x06\x45\xac\xc2\x2a\x7b\xf8\x7b\x72\x36\x6c\x45\x57\xa8\x58\x91\x70\x1b\xfe\x30\x5c\xe1\x0f\x71\x2c\xcd\x2f\xe0\x7d\xa5\x7c\x63\xc0\xbb\xb0\x94\x61\x0f\x97\x18\xde\x95\x4b\x0c\xd1\xb8\x78\xa9\x4e\x46\xbf\x0e\xce\xfb\xb8\x8b\xec\xde\xb8\x8b\x4e\x03\xf5\xe1\xbf\x3b\xfd\x7c\xd5\x5b\x79\x4d\xa0\xdf\x99\x76\x5e\xf4\x37\x20\x40\xd0\xdd\xa9\xe6\xcb\xde\xea\xdb\xf4\xff\x9d\x09\xe6\xeb\xde\x46\x7a\x48\xf3\x3b\x53\xcf\xbf\xf7\xb6\x24\x48\xf3\xb3\x3b\x9b\x63\x37\x49\xf3\x77\x5b\x91\xe6\x8b\xda\x36\xe9\x5b\xd4\x82\x03\x91\x5d\x93\xd4\x67\xdf\x12\x49\x7d\xfe\x44\x52\xff\x15\x48\xea\xc9\x9a\x7b\xd2\x1b\x3a\x8a\x7e\x25\x79\xc3\x2a\x36\xeb\xbf\x4a\x7d\xd5\x14\x76\x7e\xbf\x6a\xf2\xb3\x36\x8d\x5a\x2a\xc1\xcf\xda\x52\xf8\x71\x5f\x72\x6d\xf3\x38\xeb\xcb\xc6\x43\x3f\xbd\xbb\xea\xbc\x9e\xa4\xdd\x2d\x5b\xb7\x8c\xa6\xbc\x8b\x15\x6b\x30\x3a\x1f\xcc\xbf\xa6\x6a\x7d\xdc\x6d\xe0\xde\x04\x91\xb3\xde\x9a\x1b\xa6\xab\xf7\x60\x1c\xdb\xd7\x82\x40\x7d\x77\x96\x43\xce\x9b\xa8\x6f\xb2\x11\xf5\xa5\xf3\x6d\x9c\x77\x76\xb0\x58\x55\x23\x35\x79\xb6\x7a\x5f\xfb\xb7\x80\x88\xb2\x27\x44\xf4\x57\x40\x44\xf3\xed\x8d\xa1\xfb\x70\x81\xdf\x54\xd3\x96\xf7\xc9\xfb\xbd\xf7\xc9\xd7\xc9\xc5\x45\x72\x49\x8f\xdf\x2a\xef\x73\x5c\x9d\xc7\x6b\xac\x8a\xd7\x5e\x38\x70\x8b\xb9\x71\xc3\xd4\x78\xbb\xdb\xa5\x1a\x28\xa4\x51\x32\x48\xb9\x9f\xf3\x66\xcc\xa7\xb5\xbe\x6f\xa8\x68\xc5\x36\xc9\x98\x47\xbc\xfa\x4a\xdc\xb0\x9f\xb5\xef\xbf\x17\x2a\xb0\xf0\xde\xae\xd7\xcf\xfa\xaf\xd7\xbf\xaf\x06\x92\x95\x06\xca\x5b\x02\xef\xab\x85\xd6\x05\xfe\xf3\xdb\x40\x78\x9c\xe4\x1a\x8a\x5c\x76\x81\xe1\x6b\x22\xfe\xdd\x9f\x47\x66\xbc\x85\x47\x66\xcc\x2f\xeb\xf8\x6c\x03\xf9\x9d\x7f\xc1\x6b\x01\x12\x0a\x62\x1a\xa2\xa3\xbc\x27\xec\xb9\x3f\x9b\x45\x61\x50\x04\xef\x12\x54\x4a\xa1\xa7\xe0\xad\xc0\xcd\xf1\x6d\xf3\x97\xcc\xf2\x70\x1a\x5e\xf7\xdf\x31\xbc\x01\x05\x76\xb8\xc0\xc6\x77\xf3\x38\x4a\x92\x59\xa9\x97\xd9\xcc\xc1\xd5\xe8\x72\xfe\x2d\xa1\xcb\xe0\x09\x5d\xfe\x15\xd0\xe5\x18\xf8\xb6\x2f\x47\x97\xf3\x26\xba\x2c\x23\x28\xce\xdb\xe8\x32\xdb\x2e\x9c\xc3\xfa\xc8\x7d\x6b\xf1\x5e\xdb\x66\xa8\x04\x3e\xfe\xa5\x1f\xe6\xbd\x48\xb0\x5d\x77\x43\x9f\x93\x17\x1f\x45\x2d\x77\x43\x4e\xa6\xfe\xec\xc7\xab\x12\x1b\xaa\xc7\xe1\x49\x6f\xb9\xe3\x0d\x08\x57\x25\x84\xe4\x44\xdc\xc2\x28\x2e\xde\x51\x94\xe2\x15\x6a\x6f\x28\x00\xa0\xc1\xe2\x6a\x9e\x52\x48\xae\x28\x55\x80\xc6\x9b\xac\x8c\x53\x38\xe4\x24\x4b\xd2\x1c\xbe\x6e\x58\xae\x34\x36\x7c\x33\x76\x71\xb8\x5c\xa6\xdc\x0f\x26\x7c\xfc\x53\x3c\x2e\x67\x5e\xf4\x16\x60\x99\xbf\x61\x6e\x50\xa2\x1f\xf3\x4f\xb9\x52\x68\x1f\x7a\xd6\xa3\x82\xb4\x45\xd8\xc6\x22\x0a\xf5\x40\x11\xa1\x88\xfd\x51\x30\x48\xbe\x1e\x51\x90\x75\xab\xbf\x6f\xa2\xa0\x53\x7d\x3d\x9b\xb2\x7a\x1c\x13\x1f\x21\xca\x49\xe9\x35\x75\xc1\xf3\x5f\x2f\xe3\xf2\x40\xbe\xe1\x59\x90\x86\x33\x38\x41\xeb\xea\x50\xd4\x46\x8e\xa2\x26\x4d\xfa\x60\xbc\x0d\x7e\x7b\x9c\x77\x30\x88\xc3\x09\x93\xb3\xf0\x73\xde\x95\x7b\x74\xf0\x7d\xbd\x81\x8a\x83\xc1\xc7\x55\x50\x4e\x8c\xe2\x40\x22\x1e\x5f\xe4\x93\x66\xc8\x05\x81\x99\x5f\xe5\x03\xbd\x1d\xc1\xb4\x7f\x6b\x92\x72\x47\xab\x39\xc9\xa2\xf9\x85\x7a\xd3\x20\xb4\x87\x37\xbf\x27\x67\xbf\x34\xac\xde\x9a\xaf\x8d\x9b\xbc\x96\xcb\x1d\x82\x35\x54\xcb\x53\xb5\xbc\x05\x19\xb2\x53\x18\xe7\xaf\x4b\xd4\x35\xa1\x6b\xa1\xf2\x6c\xcf\x92\x0a\xf3\x38\x8c\x6b\x0d\x68\xda\x95\x69\x35\x96\xb5\x82\x5d\x08\x22\x0b\x20\x07\x15\x8c\x46\xa3\x18\x18\x8a\x66\xdd\xa3\xd1\x28\x57\x50\x75\x99\x96\xe1\x3b\xd2\x67\x2d\xea\xf2\x27\x98\x91\xc1\xe9\xbf\x62\x38\xb6\x52\x9e\x48\x50\xab\x54\xcc\x34\x6a\x31\x9f\xdf\xc4\x4b\x29\x8c\xa5\x0a\x12\x16\x97\xbb\x96\xc4\xa7\xa9\x9b\x2a\xca\x1b\xdb\x3a\xc5\x01\x6f\x2f\xf1\xad\x14\x26\x50\x8b\x42\xb2\x73\x0f\x81\xbb\x6f\xbb\x9a\x63\xf3\x1d\x1f\x4f\x84\xe8\x13\x21\xfa\xe7\x22\x44\x57\x2d\xee\x77\x13\xeb\xcf\xfb\xe3\x7b\xcf\x3b\x52\x9b\x7e\xf2\xb4\x89\x50\x84\x82\x1d\x8b\x93\x88\xfb\x63\x9e\xae\xca\x5c\xba\xb7\x51\x34\xe2\x79\xf5\x46\x83\x56\xfd\x0b\xe8\x65\x6f\x09\xcc\x92\x95\xe6\xe5\x14\x51\x4f\x3c\xe8\x15\xaa\xea\xfe\x03\x36\x77\x1b\x28\x65\x21\xf7\xd5\xc2\xf6\xb4\x4e\x01\x69\x8b\xbf\xbb\xa1\xd2\x26\x60\xc5\x65\x13\xf8\x54\x9b\xf8\xf1\x38\x0a\xe3\x8b\x3f\x04\xb1\xae\x2a\xa9\xc2\xc6\x6e\xde\x16\xe1\xe4\xc9\x2c\x89\x92\x8b\x7e\x5a\xe2\xcb\x82\x7f\xee\x8e\x6a\x9e\x44\x1f\x4f\x18\xe7\x2f\x82\x71\x76\x8b\xa5\xb9\x23\xc6\xe9\xa0\x90\x68\xc3\x85\x46\x15\x7e\x28\x74\xea\x5d\xb3\xb1\xd6\x8d\x0a\x75\xae\xac\xde\xa4\x3c\x4b\xe6\x69\xc0\x33\x00\xc3\x78\x83\x25\x1e\xf5\x6c\xf8\x1d\xad\x05\x05\x43\xf9\x7f\xcb\xcb\x56\x20\xca\x56\x85\x88\xb6\xda\x55\x2d\x5b\x28\x6a\xf5\xca\x82\x5b\x3d\x79\x3e\x7f\x1e\x14\x4a\x84\x91\x18\xe9\xf1\x49\x6b\x48\xc7\x27\x45\x57\x8e\x4f\xb6\xf6\xbf\xf9\x6b\x60\xc4\xea\xc6\x91\x34\x7b\xa1\x95\x9c\x69\x0f\x3e\xd0\xc6\x7e\xee\x37\x4a\xbf\xf8\x3d\x4b\x56\xf8\x84\x2f\xc0\x74\x6b\x3f\xa8\xfa\x72\xd3\x1e\xf2\x05\xcf\x87\x55\x9b\xf5\x0e\x28\x87\x09\x4c\xb5\xa2\x3c\xbb\x7d\x9c\xd0\x77\xcd\x9f\x85\x5b\x0f\x14\x0b\x3f\xd6\xc1\x6e\x58\xd4\x94\x67\xdb\xad\x28\x16\xfc\x36\x07\x29\x88\xdc\xd6\x20\xfb\xcb\x35\x34\x41\xed\x79\xf0\xc7\xfe\x2c\x7f\x28\x8d\xd7\x2e\x57\xf7\x85\xa3\x1b\xe8\x70\xc0\xe3\x9c\xa7\x43\x79\x1c\xc8\xaa\x3f\x1e\xa7\x3c\xcb\x86\xf2\xab\xf1\x38\x95\xd5\x8c\xa7\xe7\xef\x92\x34\x1f\xca\xf0\x94\xc5\xa5\x7d\x7e\x9e\xa7\x7f\xc0\x75\x7d\xcb\x38\x49\xa7\x38\xdb\x95\xfd\xf4\x77\xf9\x3a\x55\xde\xf1\x4d\x86\x1e\x9e\x43\x54\xdd\x2d\x4f\x6a\x5b\xf0\x29\xcf\x32\xff\x82\x8f\xe4\xdf\xf8\xff\xcc\x79\x96\xf3\xb1\xf4\x0a\x96\x58\xba\xf4\xb3\x5a\xf7\x27\x85\xb1\x94\xf1\x5c\x4a\xce\x25\x7f\xe1\x87\x11\x4a\x6f\xb0\x5c\x56\xdb\x90\x4b\x39\x79\xfb\x66\x94\x93\x5f\xfc\x29\x57\x73\xf2\xa6\x9a\xbb\x51\x4e\x3e\xf8\x17\xd9\xde\x9e\xf8\x4b\xc6\x81\x9a\x93\xdf\xf8\x45\x98\xc4\xdd\xac\x14\x53\x21\x7b\x16\xc0\x9c\x76\xf3\x61\xcf\x15\x58\xa5\x3d\xfe\x7a\x3a\x7e\xe3\xd9\x2c\x89\x33\x5e\x6e\xa7\xf3\x24\x1d\xa0\x19\xcc\xa8\x5a\xdb\x42\x2a\xa9\xa6\x38\x4d\xaf\xd2\xd4\xbf\x1a\xc4\x3f\x18\x2f\x63\xcd\x18\x22\x41\x66\xfc\x3d\xfa\x47\xfc\xf7\xe8\xfb\xef\x95\xf4\x38\xd2\x8c\x93\xfa\xd3\xe3\xa8\xba\xc1\xa8\xd3\x8d\x76\xbb\xe4\x10\xb7\x7c\xf6\xf9\xf3\xf1\x89\x4a\x08\x49\x1b\x3d\x7c\x1f\xc6\x17\x51\xa7\x3c\x10\x77\x65\x4f\xd3\xd5\x9e\x46\x8d\x9e\xa6\x3f\x98\x2f\x53\xcd\x84\x9e\x26\x23\xf3\xef\xc9\x3f\xd2\xbf\x27\xdf\x7f\xaf\x44\xc7\x89\x66\x36\x7b\x9a\xac\xeb\x69\x5f\xfb\x95\x03\xc2\x2f\xe8\x80\x10\x2b\x6a\x0c\xdd\x8e\xb6\x50\xdb\xb6\x8e\x7d\x83\x7e\xd9\x86\xd5\xa9\xd4\xb4\x1b\x81\x48\x0f\xdb\x22\x0e\x70\xaa\x46\x35\xc3\x92\x94\xab\x5e\x6e\x49\xd8\xb9\xfc\x2b\x5d\x98\xc9\xef\x89\xa2\xf5\x47\x83\xb4\xa3\xcc\x8b\xef\x1c\x08\xb0\x24\x71\xea\x58\x80\xd1\x63\x8d\x05\xa8\x26\x05\xa5\x2d\x40\xa7\x7a\xd3\xbe\xfd\x5c\xfe\x50\xbe\xca\x6a\x41\x00\x63\x12\x7a\x62\x64\x72\xe3\xfb\x8c\xcf\xfc\xd4\xcf\xf9\x2f\x7e\x9c\xa0\x74\xf7\x35\x5a\xc7\x08\xff\x70\xf9\x30\x19\x87\xe7\x57\xf8\x72\xa2\x74\xc1\xa7\x80\x9b\x02\x1e\x95\x55\x7f\xfe\x7c\xb3\x7c\xd6\x4c\x18\x75\xb8\xc8\x2c\x49\xf3\x41\xad\xfd\xab\xbc\x57\x80\x87\x84\x8f\xd5\x74\x74\x83\x43\xe0\xbd\x7c\x68\xd8\xe0\x43\xf9\xe8\x87\x14\xd8\xcf\xf0\x98\x9f\x28\x8a\x9a\x92\xdf\x4a\x8a\x7d\x94\x93\xc2\x9f\x80\x8f\xab\x44\x00\x88\xab\xa9\xd8\xd5\xec\x98\x9f\xa8\x29\x9c\xd4\x9c\xfc\x33\x39\x2b\x6c\x24\x91\x09\xfb\x6e\xd4\x4c\x7a\xd9\x7c\x19\xa2\x4c\xfd\x82\x03\x1b\xa0\xca\xff\x4c\xce\x48\x91\x21\x43\x3d\xef\x22\x3f\x8c\xff\x99\x9c\xbd\x1d\x8b\x1a\xde\xbe\x51\x05\x9c\x17\x62\xff\xc6\xef\xcf\x9f\x57\x2a\x6a\x5c\xa0\xd7\xd0\xc9\xa8\x45\x45\xab\x77\xdb\xad\x36\x70\xa2\x20\xc2\xc8\x82\x09\x87\x23\xf5\xd3\x02\x36\xfb\x68\xd0\x4c\xfb\x90\xfa\xc1\x47\x9e\xc2\xac\x2b\x44\x14\x50\x73\xf2\x36\x3b\x0c\x2f\x52\x3f\x0f\xe3\x0b\x28\xfe\x86\x67\x61\xca\xc7\x1f\x2a\x4d\x93\x28\x2e\xca\x00\xce\x7a\x97\xf2\x45\x98\xcc\xb3\xda\x81\x03\x31\xda\x6a\xf2\xcb\xbe\x44\x64\x06\xa0\xdf\xfc\x53\xde\xa9\xa1\x9d\xf4\xb2\x9b\x50\x7e\xf9\x73\x12\x45\xc9\xe5\xbf\x66\xb5\x6f\x37\x7e\x2d\x92\xe7\x98\xfc\xf6\xcd\xcb\x6e\x42\xf9\xf5\xbb\x94\xf3\xe9\x2c\xe7\xe3\x66\xe3\xd9\xa8\x37\x43\x20\xa6\x46\xd6\x8f\x57\xab\x83\x5e\xcd\xf9\xfc\xb9\x68\xeb\xdf\x7e\x56\x15\x18\x7d\xf7\xdd\xda\x8a\x6a\x15\xd3\xf6\xbb\xf8\xfd\xc4\x4f\xf9\xb8\x52\x0e\xf6\x14\x59\x53\x5b\x71\xb8\x10\x02\x65\x83\xf5\x27\xa4\x96\xae\xe0\xe1\x1f\xfd\x30\xe0\xe4\xf5\x6c\x0e\xff\xb0\xed\xec\xfb\x51\x0e\x2f\xd0\xbf\x56\xfa\xe7\xcf\xba\xca\x01\xb5\x27\xe9\x55\xf1\xe7\xf0\x47\x28\x2c\x7e\x43\xf9\x4e\xa6\xf8\xe2\x4d\x98\x7d\xc4\x87\x28\x0d\xbf\xa0\x6c\x23\x19\xcb\x29\x8a\x7a\xf3\x7a\x36\x1f\xde\x54\x0d\x0e\xf5\xa5\x2a\xaa\x1a\xde\x94\x55\x42\x1a\x7c\x34\xbc\x11\x9f\x0e\xf5\xe5\x12\x25\x40\xfd\x23\x06\x32\x2a\x1b\xa5\xe2\xaf\xda\x5b\xe4\x17\x9e\x5f\x26\xe9\x47\x28\x55\xfe\x54\xea\x92\x61\x12\x57\x10\x58\x1c\xff\x97\xe5\xbc\x55\x10\x0f\x6d\xde\xab\x52\x59\xb9\x76\xe1\xde\x5e\xd8\x54\x1c\xc2\x89\x16\x4a\x42\xb1\x91\x96\xca\x00\x2b\x54\xf3\xfa\x63\x45\x6c\xe7\x5e\x22\x6f\xa9\x42\x1f\x6b\x46\x7e\x5e\xe3\xb9\x60\xd4\x60\xe6\xc7\x77\x8b\xa6\x3a\xed\x46\x53\x1d\xaf\x91\x18\x4e\x01\x64\x8f\x0b\x89\xe1\xb4\x2d\x31\x6c\xbe\xaa\xd3\xae\xc4\x70\xba\x56\x62\x38\xfd\xfc\x79\xda\x95\x18\x4e\xdb\x12\xc3\xe9\x28\xd8\x3d\x9a\x6a\xa6\xce\xab\x68\xaa\x53\x45\x9d\x35\x24\x86\xd3\x8e\x3c\x6f\x5a\x48\x0c\x5b\xe9\x2f\xa7\xab\x48\x7c\x56\x49\x0c\xa7\xb7\x4b\x0c\xbb\x2d\xf4\xd3\x21\xd0\xc5\x29\x0c\xaf\x90\x18\x8e\xa6\x6a\x2a\xa2\xa9\x36\x1d\xaa\x6a\x1a\xca\xdf\x4c\x8f\x36\xd9\xd0\x26\x41\x2a\x18\xd2\x20\x99\x5d\xad\xb7\x19\xf4\x81\xdc\xde\x20\x97\x29\x6b\x0a\xe3\xf3\x88\x03\x91\xb6\x2a\x88\x4f\xf9\x34\x59\x70\x2d\x45\x6b\xdb\xba\xf6\x59\x12\x5d\x9d\x87\x51\xd4\x24\x8f\x11\x0b\x6e\x8a\xe1\xd0\x95\xce\x7f\x3b\xc4\xae\xa0\x71\x83\x8a\xca\x4d\xbf\xc0\x64\x6d\x96\x86\x53\x3f\xbd\xfa\x3f\x1c\x56\xe6\xed\x1b\xb9\xce\xc1\xe5\xfa\x65\x1e\x45\xbf\x2e\x78\x9a\x86\x18\x42\x46\x6c\xa4\xb2\x84\x58\xe0\x5b\x8b\x4c\xfd\xd9\x87\xe4\x95\x58\xf8\x76\x4e\x87\xb8\xc4\xcc\xe5\x47\x7e\xf5\x73\x92\x56\xf7\x86\xd4\x97\x09\x0f\x74\x35\x23\x81\x3f\x0b\x73\xdc\x2d\xca\xa0\x48\x98\x72\xf1\xca\x95\xf2\xe3\xa6\x63\x55\x93\x16\x0d\x47\xa7\xcf\x6f\x36\x55\x83\x3a\xc6\x2c\x8c\x2f\xe6\x91\x9f\x96\x15\x2b\xcb\xb7\x6f\x4e\x0b\x10\x2c\x17\xce\xdc\x32\x80\xdd\x97\x58\x7c\x16\xcd\xd3\xa2\xb6\x50\x19\x86\xcb\xd9\x3c\x9b\xbc\xf3\xaf\xd0\x6e\xad\xd5\x3e\x8a\x3f\x86\xc7\x27\x6a\x11\x9f\x69\x3c\x3c\x3e\x59\x3e\x6b\xc2\xc5\xbc\x01\x17\xd3\x0a\x1d\x44\x0d\x7b\x12\x80\xf8\x3f\xa7\xc9\xb4\x68\xe0\xff\xf0\xab\x41\x0a\x7c\x2b\x27\xf5\x49\xfa\x39\x49\x07\x91\xa2\xfa\x23\x5e\xdb\xa0\x44\xca\xdf\xd1\xf7\x6c\xea\x7f\xe4\xb8\x1c\xca\x20\x3f\x4e\x4f\xda\x14\xb3\x68\x4f\x74\x33\xaf\x7b\x19\x2f\x47\x49\x03\x73\xf8\x2a\x07\x30\x12\x12\x28\x57\x5c\xf7\xab\xa8\x31\xa0\xa6\xf2\x13\x91\x4a\x08\x89\xd1\xf4\x0d\x7d\xac\x30\x29\x5c\x61\x14\xea\x90\x56\xe2\xd2\xe0\xd5\x5d\x57\x98\x3e\xae\x66\xb4\xfb\x9e\x23\x93\x30\x80\x3f\xa3\xe3\x13\x6c\x14\xbf\xeb\xd9\xa4\x45\x8d\x3d\x39\xeb\xab\xbc\x59\xd6\x55\xd6\x9b\xba\xa8\xa9\x4e\x68\x57\x00\xdc\x28\xb0\x96\x9c\x08\xb5\x3a\xac\xde\xcb\x41\x38\x6a\xbe\xab\xf1\x88\x13\xff\x3c\xe7\x29\xbc\x29\x43\xc8\x86\x34\xa5\x26\xf5\x8e\xc3\x13\xc1\x3b\x1d\xc7\x27\x2d\x9e\x29\x5d\xc7\x33\xe5\xa3\xb4\xe4\x99\xc2\x2e\xcf\x84\x11\x04\xfc\x2c\x0b\x2f\x62\x65\x10\xaa\xb9\xa2\x86\xc5\x22\x09\x75\x47\xf3\x5c\x16\xe3\x6b\xa5\xf5\x6c\x19\x29\x1c\xc1\x24\x3d\xcb\x8f\x4f\x9f\xdf\xf0\x25\x16\x3b\x3d\x19\x85\x7f\xa3\xdc\x56\x71\xfa\x0e\xfd\x7c\x42\xce\xa3\x24\x49\x07\xe1\x0b\xca\x6d\x68\x4f\xd9\x20\x79\xfa\x59\x68\x7a\x9a\x82\x95\xfa\x30\x75\x3e\xed\x96\x6d\x01\xbb\xf6\x1d\xd9\xf3\x28\x7a\x9f\x27\x29\xd6\x57\x1f\x2a\x55\xec\x67\x98\x8c\x66\x09\x54\x7e\x8a\xdb\x05\xba\x42\xa4\x1f\x8c\x06\xca\xaf\xc5\x44\xc6\xc9\xcb\xe6\xcb\x70\xa0\x8c\x7e\xf8\x4e\xaf\xae\x1e\x1f\xe8\x6a\x4e\x00\x4f\x2a\xb0\x7a\x0d\x6b\xd8\x9a\xcf\xe3\xaa\x1c\x8e\x65\x45\x51\x9e\x71\x32\xe3\xfc\xe3\x2b\x64\xef\x37\x94\x2d\xb3\xa3\xc6\x91\xce\xab\xf5\x89\x47\x7e\x4d\x37\xae\x7c\x3d\x1a\x8d\x5a\x5c\x66\xd1\x7a\xfc\xd2\x27\x02\xd9\x8a\x3d\x37\x88\x31\x1e\x47\x1d\xf9\x44\xac\x97\x52\xa8\xf0\x7a\x40\x53\x13\x7c\x77\xe0\x2a\x02\xde\xb1\x9f\x4d\x78\x05\x67\x9b\xa2\xb1\x60\x23\x29\x32\x6e\x7a\xea\xaf\x8a\xc6\xba\xc4\x47\x93\x3c\xf8\x32\xe1\x58\x45\x27\xa4\xdf\x26\x9d\x10\x6d\x94\x86\xf5\xd1\x09\x69\x47\x96\x54\xf8\xe0\xfe\x32\x87\x59\x1d\xca\xb5\xc4\x43\x5e\xd6\x85\x9b\x58\xff\xf8\xa6\x86\x75\x0d\xd9\x53\x26\xab\x15\xd0\x6b\x24\xd7\x77\xd0\x2f\x3b\x42\xa5\x7a\xbe\xc3\xbd\xbd\x41\xd8\x94\xa1\x84\x85\x88\x23\x6c\xc8\x50\xc2\x8e\x0c\x25\x17\xbb\x3b\xbc\x55\x86\x52\x54\x24\x2a\xfc\x39\x49\x45\x4c\x88\x1e\xa1\x4a\x4f\x8b\x27\xbd\xf0\x2c\x54\x96\xfc\x53\x9e\xfa\x41\xde\xa4\x4b\xb2\x8e\x90\xac\x56\x33\x17\xda\x1c\x40\xd9\xbc\x06\x4e\x4a\x1d\x84\xa6\x34\xa6\x2f\x8c\x4c\x8b\xca\xdf\x0a\x52\xa3\x86\xf0\x61\x05\xe1\x6f\x9a\xea\xe4\x9b\x28\x8c\x3f\x66\xc3\x9b\x14\x3a\xc3\xc7\xc3\xd3\x17\xcf\x6f\xe2\x65\xe3\x2c\x35\x2f\x6a\x7f\xf1\xfc\x26\x5d\x9e\x2e\x81\x4b\xc4\x71\xad\x1d\x48\xeb\xe4\xf6\x5f\xc9\xd0\x3a\xb9\xa9\x1f\xc6\x5a\x96\x03\x46\xe9\xda\xf0\xec\x7a\x34\xbf\xae\xf1\x76\x2f\xad\x22\xeb\xba\x4e\x35\xfc\xef\x83\xae\x0f\xf1\xbf\xff\x0f\xe9\x41\xf2\x73\x92\x06\xfc\x0d\xf7\xc7\x51\x18\x73\x14\x20\xb4\x52\x0a\x3e\xac\x9f\x15\xdf\x64\x4e\xdd\x9c\x90\x3a\xa2\xea\x93\x5a\xe0\x49\x2d\xb0\xab\x5a\xa0\x05\x9d\xe5\x9f\xfd\x30\xe2\xe3\x0f\xff\x8d\xd2\xa9\x4c\x3e\xb9\x17\xf1\xff\x23\x10\x71\x3f\xab\x55\x10\xbf\x09\x68\xf7\xd3\xc2\x8f\x32\x35\xed\x92\x8e\x4d\xc8\x29\x09\xb1\x7e\xbc\xb7\x17\x17\x54\x5e\x41\x01\xff\x07\xad\x24\x79\xb3\xa6\x26\x1c\x7c\xe3\xe7\xfe\x00\x68\x45\x35\x5d\x6e\x53\xb4\x98\x24\xe4\xa0\xd2\x26\x3c\x1d\xf5\x25\x22\x1d\xdf\x97\x41\xd2\x46\x23\x05\x7f\xc9\x2b\x5e\x60\x70\x13\x8e\x87\x9c\xc0\xc4\x5c\xcd\xf8\xb0\x11\x88\x5c\xcb\xf2\xf9\x99\x8c\xd7\x7a\xaa\x79\xc5\xb5\x8d\xea\x9f\x9f\x3f\x1f\x9f\x54\xf1\xdc\x78\x57\xbc\x7b\x4c\x08\xe1\x82\x5b\xa8\x67\xb1\x81\xc4\x6a\xcf\x87\x6e\x93\x8a\x9a\x2b\x38\x0e\x54\x41\x94\xad\x29\xcf\x1a\x9d\x08\x9f\xa4\x92\x4f\x52\xc9\xdd\xa4\x92\xe7\xa9\x7f\xb1\xca\x08\x3c\x2e\x52\x62\x27\xfc\xfe\x7b\x72\xa6\xcd\x22\x3f\xfe\x42\xc3\xa0\x12\xdf\x3f\x6a\x63\xa0\x55\xcc\x83\xe6\x3e\x0d\xe4\xf4\x87\xdb\xfc\x54\x1a\xb2\x42\xf9\x56\x28\xfc\x06\x2d\xfc\xf4\x2a\x8e\x93\xbc\x88\x48\xd8\x56\x04\x66\x80\xad\x8e\x4f\x94\xd2\x5f\x16\xa5\xa9\x5d\x64\xd3\x31\xd6\xdc\xc5\x18\xa4\x8e\xac\xfa\x88\xf7\xf9\x8e\x9b\x60\x37\xe6\x10\x06\x0f\x9c\xe1\x23\xda\x29\x7d\x64\xce\x76\x24\x4a\x83\xb2\x39\x51\x2a\xda\x06\xbe\xbe\x07\x0e\xa1\x19\xa8\xf7\x56\xf1\xc8\xee\x1c\xc1\xd7\x00\x22\x61\x2f\xcb\x15\x2a\x37\x6b\xf8\xfc\xed\x58\xf2\xf6\x0c\xd7\xcc\x7d\xa5\x46\x8f\x47\x21\x29\x82\x63\xa2\x80\x35\x24\xab\x82\x88\xed\x8c\x54\xf2\xda\x48\x65\x45\xe0\x2a\xad\x13\xf1\xf3\xd1\x0f\xa1\x90\x98\x0a\xf8\x71\x7a\x82\x62\x54\x45\x48\x64\x2b\xf9\x6f\x4b\x7a\x51\xdf\x5d\x51\xd6\x9e\x56\xfc\x46\x29\x13\xee\x69\xa0\xfc\xec\xf4\x04\x25\xc3\xeb\x64\x15\x3b\xc3\xa3\x42\x1c\xd4\xbb\xc7\xee\x26\x72\xfb\xba\xdb\x6c\x47\xc3\xd5\xb8\x10\x77\x55\xb2\xae\x87\x31\x4d\xfd\x39\x8c\xc7\xfb\x42\x01\xd5\x90\x8a\x57\x1e\x47\x62\xc3\x24\xa3\x98\x54\x21\xeb\x70\x9b\xe2\xda\xa2\xdc\x37\xaf\xc5\x42\x4b\x95\xab\x37\x6f\xc2\xf3\xf3\x61\x4c\xe0\x4f\x06\x3c\x0f\xfe\x38\x0e\x4f\xd4\xb7\x6f\x86\xb0\x6f\xc8\xdb\x37\x4b\x0d\xfe\x16\x15\x2e\x4f\x55\x3c\x44\xc3\xee\xe9\x43\x36\x83\xaf\x3b\x7a\xef\xab\xe8\x0c\xc3\x86\x22\x80\x93\x3a\x1d\x75\x02\x8d\x72\xc8\x73\x0e\x9b\x25\xfe\x46\xb9\x0d\x1c\xcb\x1a\x23\xcc\x75\x53\x93\x14\x93\xb3\xf3\xd6\xbe\xfb\x96\x56\x65\x74\x1a\xd1\xd6\xab\xa1\xff\x4c\x42\xe5\x75\x67\x6b\x1b\xa1\x72\xeb\x02\x9b\xa1\xfc\xae\xf9\xfa\xcf\xe4\xac\x29\x5a\x5e\x11\x4a\xd4\x3b\xa4\x47\x0e\x51\xe1\xe9\x6a\x63\x56\x26\xd5\xf8\x56\xda\xe2\x21\xfa\x5e\x8f\xbb\xdb\x88\xfb\xed\x9b\x2e\xea\x7e\xe7\xa7\x3c\xce\xd1\x94\xac\xfc\xd9\x53\x4b\x99\x75\x4b\x5d\xc3\x46\x05\x85\x65\x58\x81\x9f\x4a\xd2\x20\x27\xef\x8a\x8b\x7f\xa4\x30\xce\x72\x3f\x0e\x78\x72\x5e\x60\x18\x94\x38\x96\xd9\x6f\x78\xee\x87\x11\x9a\xab\x15\x29\x8d\x6f\x91\xc1\xc4\xb6\x5a\x13\xbd\xae\xca\x66\xb1\x46\xbd\x9d\xaf\x7b\x2a\x2c\xda\xf9\x67\x72\x56\x0c\xa3\x54\x28\xa2\x9c\xa0\xa9\x29\x6f\x5d\x2d\xa0\xde\xb4\x5e\x87\xc7\xcd\x2a\x6a\x47\xa8\x0e\x81\xb4\x46\x3e\x1d\xd6\x82\xf6\xb0\x39\xf1\x7b\x7b\xd5\xc4\x7f\x37\x6a\x67\xbd\x6c\xbd\x95\xdc\xef\x4d\x25\x8f\x1f\xa6\xcb\x11\x57\xa3\x2f\x12\xdc\x1f\xfb\x27\x6b\xbe\x4b\x15\x72\x36\x0f\xa3\xf1\xbf\x7e\x3b\x18\xa4\x48\xe4\xa8\xa1\x2a\x9f\x87\xf1\x58\x44\x96\x93\x15\x92\xcd\xa2\x30\x1f\xc8\x2f\xe5\x86\xa8\xbf\x86\xe9\xb7\x88\xe9\xdb\xe7\xef\x56\x9d\x40\x32\x38\x7d\x7e\xe3\x2f\x9b\x9a\x80\xd3\x66\x78\xbe\x78\xa9\x2c\x97\x6a\x19\x8b\x75\xed\xe7\x65\x81\xf6\xb7\xea\x18\x30\x8c\xf0\x9a\x5b\xaa\xb5\xde\x61\x7d\x3d\x8d\x32\x3d\xdd\x58\x09\x04\xbf\xb9\x9a\x9e\x5a\x9a\x37\x94\xad\xab\xa0\x51\xa6\xa7\x86\x3a\x96\xfd\xda\x0a\xb0\x48\xcf\xa7\xed\x90\x43\x15\xdd\xd9\x57\xcf\x8b\xe7\x37\xd1\xf2\x45\xfb\x03\xe8\xcd\xef\xc9\xd9\x30\x2c\x21\x59\xc3\x97\x31\x5c\x03\x68\x30\x7e\x8b\xb2\x5c\xb6\x05\xfa\xb5\x72\xbd\x76\xe3\xaf\x01\x58\x2d\x23\x0d\x5f\x22\x49\xf9\xf2\xf9\x4d\xb8\x3c\x1d\xf2\x9d\x74\x3f\xf5\x49\xf8\xd3\xf0\xb0\x85\x8b\x07\x10\x84\x0d\x63\xaa\xaf\x4f\x15\xee\xc4\x0f\xc6\xc2\x0e\x75\x67\x81\x52\x98\x69\x61\x8f\x8f\xfb\x63\x12\x24\xdd\x04\xe1\x38\x1d\xca\xaf\xdf\xbe\xf9\x4d\x56\xc3\xd9\x50\x7e\xfb\x4e\x56\xa7\x67\x61\x9e\x0d\xe5\xc3\x1f\xc3\x3c\x7b\x58\x47\xb2\x5a\x0d\xf1\xf6\xdd\xb3\xda\xb3\x7a\x61\x0f\x62\x05\xb1\xeb\xdb\x77\xa3\xd3\xe3\xe7\x37\xf1\xf2\xe4\xb4\xc1\xf3\xa1\x31\x3e\x4f\x17\x7c\x8c\x86\xc6\x95\x60\xa9\x90\xec\xe3\xad\x2b\x9c\x1c\xf8\x67\x3c\x52\x61\x3d\x87\x9c\x1c\x41\x9f\xd5\x3c\x19\x72\xf2\x21\x51\xc3\xec\xcd\x55\xec\x4f\xc3\x60\xf8\x1d\x45\x63\x9b\x08\x4d\xf6\x45\xda\xdd\xeb\xd4\x9b\xb4\x78\x5e\x59\x45\x07\x49\x1c\xf8\xf9\x20\x52\xaa\xc8\x6c\xe2\xe6\x94\xfb\x94\x83\xc5\xc9\x98\x6b\x7c\xf1\xc8\x05\xbe\x3b\x6e\xe2\x3c\x44\x51\x57\x38\xe5\x59\xee\x4f\x67\x7f\xf0\x9e\xdd\x0d\x96\xa0\x0f\xfc\xad\x7a\xe7\x2f\x61\xf7\x8b\xd8\xda\xb5\x96\x39\xfa\xd6\x58\xa2\x88\x03\xf7\xbd\x12\x78\x79\xa3\xd4\x61\xa3\x96\x59\x8c\xa0\xa9\x65\x4e\x1f\xad\x96\x39\xea\xf0\x76\x61\xf6\x26\xf5\xc3\x38\x8c\x2f\x86\x32\xfe\x92\xd5\x49\x9e\xcf\x5e\x8d\x01\x68\xef\x7f\xf8\xf0\x4e\xf8\xfe\xd6\x11\x15\xe4\x5f\x92\x31\xaf\x9c\x29\x30\x07\xe1\xe0\x50\x2e\x21\x62\x9d\xd9\x68\xaf\xad\xd5\x7e\x93\x86\x22\x24\x99\xbc\x9f\x64\xf9\x51\x12\xcd\xa7\x3c\x03\x06\x71\x83\x35\x4e\x83\xc6\x0f\x97\x23\x5e\x86\x9c\xbc\xd5\x86\xe6\xf9\x4d\x3f\x3d\x1f\x36\xe8\xf9\x50\xed\x31\xd7\x51\xf3\x36\x79\xdf\xa6\xb9\x97\xf0\x3f\xd5\x1f\x35\xe3\x30\x67\xf5\x5e\x98\x37\x55\xa1\xc1\xdd\x54\xa1\xb3\xae\x2a\x34\x58\xa3\x0a\x9d\x1d\xf3\x93\x51\x50\xa8\x42\x67\x6d\x55\x68\xf3\x55\x9d\x75\x55\xa1\xb3\xb5\xaa\xd0\xd9\xe7\xcf\xb3\xae\x2a\x74\xd6\x56\x85\xce\x46\xf3\xdd\x55\xa1\xbe\x9a\x55\xaa\xd0\x99\xa2\x8e\x1b\xaa\xd0\x59\x47\x51\x39\x2b\x54\xa1\xad\xf4\x97\xb3\xd5\x8d\x3e\xae\x54\xa1\xb3\xdb\x55\xa1\xdd\x16\xfa\xcf\x2a\x74\x71\x06\xc3\x13\xaa\xd0\x74\x34\x53\x63\xa1\x0a\x6d\xdc\x79\xd3\x50\x85\x26\x1b\x61\xf3\x2c\x9a\x5f\x84\xbb\xea\x0d\xbf\x06\x5e\x2c\x38\x89\xc2\x62\xa0\xb9\xb7\x78\x5b\x86\x1e\x36\x8c\x54\xf9\x71\x58\x39\x59\xc7\x02\x2e\xc7\x28\x09\x5f\x4b\x2a\xf6\xdb\x9d\xb4\xc4\x39\xa7\x41\x16\xbe\x78\x7e\x03\xbf\x97\xa7\x0d\xab\x10\xbc\x15\xb7\x70\x2b\xcd\x49\x1d\x4f\x45\xf8\xa9\xd6\x92\x23\x28\x36\x0a\x07\xb1\x8a\x80\x09\x95\x7a\xad\xe2\xa3\x70\x90\x36\xf2\x36\xe9\x6e\x36\xd3\x37\xb3\x24\x0a\x83\x6f\xcf\x2e\xae\x15\xaf\xe0\xee\x1a\x2c\x18\xf9\x9f\x92\x5d\x99\x24\x59\xfe\x76\x36\x44\xc4\xf4\xf6\xdd\x63\x61\x4e\x44\x6f\x2a\x16\xbf\x87\x4f\x11\x25\x6a\x5e\xe5\x3e\x49\xfa\x35\x61\x97\xef\x78\x04\x2a\x4a\x32\x14\xef\xb0\x34\xe1\xa8\x0d\x8b\x9e\x85\xe7\x83\xde\x90\xc5\xef\xaf\xa6\x67\x49\x54\xdc\xf1\x1b\x8f\x6e\x2b\x03\xd5\xe4\x7b\x7b\x83\x78\x14\x57\x56\xfa\x55\x4f\xea\xf3\xd1\x5b\x45\x23\x32\x32\xf4\xb1\x81\x43\x91\x69\x0b\x51\x48\x4a\x60\x98\x57\x18\xb2\xac\x0c\x0e\x12\xd6\xc2\x1b\xc4\xcc\x65\xb0\x8b\x7c\x44\xff\x9e\xff\xa3\xeb\xab\xf0\xf7\xfc\xfb\xef\xcb\x91\x08\x13\xb7\xda\x47\x21\x6f\x3a\x2c\xe4\x27\xc3\x9b\xe5\xb3\xfc\x6f\xec\x65\x38\xa8\xac\xfe\xd5\xef\xf4\x3e\x7a\x00\x46\x86\x1b\x12\x40\xb5\xb2\x54\x94\xe1\x86\x11\x66\xbd\x9b\x3a\xe4\x40\x80\x6d\xfa\x74\x10\x2b\xca\xb0\xd1\xa7\x35\x1d\x5a\x7f\x6a\x36\xcd\x7e\x8c\x86\xcc\x4a\x35\xc1\x7c\xf9\xe7\xd1\xcd\xf4\x40\x6e\xa4\x94\xbb\xb1\x5d\x4a\xe9\x43\xd7\x9b\x4c\xee\x86\xa3\x57\xa3\xa6\x73\xd9\x6a\x76\x02\x04\xa5\x3f\x3a\x3e\xa9\x01\x4a\x8f\xd7\x50\x3e\x3a\x7d\x7e\xb3\xaa\x49\x14\x7a\x7c\xde\x34\xe6\x5c\xbe\x78\x7e\xc3\x09\x2a\xe6\x97\xa7\xcf\x92\xe3\xfc\xe4\xf3\xe7\x01\xfc\x19\xdd\xf8\xa5\xb3\xa0\x08\x5f\xfd\x76\x3c\x2c\x6b\x68\x85\x69\xe6\x4d\xa5\x4f\x2b\x1e\x46\x59\x6f\x47\x10\x5b\x84\x5c\x83\x46\x48\x27\x47\xf8\xb2\x71\x45\xf5\xcb\x5f\x00\xe0\x84\xf9\x65\xdb\x67\x3e\xe9\x31\x14\x40\x0d\xe8\xd4\xff\x04\xf0\x92\xaf\x54\x5d\xd8\x0e\x35\xb4\x5a\x95\x98\xe5\x46\x98\x71\xae\x83\x95\x68\xec\xb9\xa6\x3a\xa0\x4c\x4a\xaa\xeb\xf7\x24\x8c\x07\xb2\x26\x2b\x6a\x63\xea\xe2\x41\x8c\x2a\x61\x52\xa7\x29\xea\xcd\x52\xbd\xa9\x03\xeb\x0f\x63\x7e\x29\xbd\xf1\x73\x3e\x68\xe8\x70\x73\x54\xdc\x2a\x4b\x45\x6d\x19\xa6\xe2\x52\x0c\xc5\x8c\x14\xdd\x46\x95\x6a\x38\xee\xd1\x1c\xd7\x4d\x12\x5c\x40\xb5\x9b\xd4\xdc\x08\xab\xcb\x54\x9a\xbd\xf6\x0c\xbd\x10\x6c\xf5\xcd\x5b\x31\x5f\x6f\xdf\xa0\x15\xec\x72\x09\x2b\x58\x79\x3c\xfa\xd5\xc7\x4d\xfc\x16\xa9\x5c\x18\xaf\xc2\x07\x55\xf2\xbf\x66\xe3\xea\xc6\xa0\xd5\x18\x44\xc5\xca\x89\x89\x08\xc7\xc3\xb8\x39\xe9\x37\x61\xf6\x2e\x4d\x02\x9e\x65\x7c\x0c\x27\x79\xb9\xdc\xcd\x91\xa2\x3b\xa2\x27\x85\xf5\x1f\xa5\xb0\x06\x08\x52\x1b\xa7\xed\xa0\x9f\xde\x49\x47\xb9\x56\x43\xd9\xd4\x4f\x96\x0c\xe9\x71\xba\x4e\xaf\x28\x22\x65\xd6\xb2\x08\x71\x14\xd7\xd8\x4f\x9d\x28\x5f\x4d\xe9\x88\x20\x61\x45\xa9\x95\xae\x68\xc4\x1e\x46\x33\x95\x56\xb1\x6f\xfe\x6c\xb2\xe5\x63\x59\xec\x3e\x64\x34\xda\xfb\xf3\x41\x4d\x6c\xbb\xa1\x81\xc6\x45\x68\x20\x4c\x12\xc6\x14\xf5\x5b\x23\x28\x0f\x7e\x87\xfc\x76\xf9\x85\x60\xbe\x5f\x36\x5f\x6e\x8b\x7a\xb2\x0b\x1b\x9a\xd6\x82\xc8\x3f\xcf\x7e\x78\x57\x8c\xa2\x8c\x4e\x53\xec\x8d\x9e\x88\x0f\x0f\xb7\x41\x5e\xcf\xe6\x6b\xa2\x06\xa9\x65\x54\xa0\xdb\x02\x05\xa9\x22\x1c\x50\x7f\x74\x20\x0c\x2a\x25\x86\xde\x34\x79\x41\x9a\xf8\xf3\xe7\x41\x9d\x3b\x3a\x3e\xd9\x81\xcf\xdd\xbc\x9b\xd0\x06\xe0\x7e\xe0\x4b\x9b\xb9\xfd\xf6\x10\xf1\x66\x49\x4a\xef\xee\x5d\x87\x66\x0b\x04\x5b\x15\xe8\x8d\x4d\x72\x2c\x1f\xf2\xdc\x07\x3c\xbc\x93\x74\xa2\xd2\x6b\x3d\xad\xd8\x97\xaf\x58\x49\x3a\x05\x49\x1c\xf3\x20\x1f\xca\xaf\xc5\x0f\x20\x9e\xc2\x5b\x42\xce\x1c\xcb\x1f\xfc\x8b\x6c\xf7\x35\xc3\x5e\xcd\x53\x3e\xd6\x6a\x8a\xfb\x31\xc3\xf0\x7e\x38\xb8\x8a\xc0\x6e\x7e\xf3\x2f\x87\xf9\x72\x47\xc0\x03\x04\xeb\x13\xdc\xb9\xbf\x5d\x5c\xc4\xf9\x1d\xca\x6f\xc2\x6c\x16\xf9\x57\x87\xe2\xbd\xb9\x99\xd7\x81\xa8\xdd\xf6\x31\x2e\xdc\x45\x9a\xcc\x67\x5a\x6d\xc2\x76\x5f\x02\xd2\x87\xd0\x11\xbc\x8b\xfc\x80\x8f\x5f\xfb\xb1\x9f\x36\x22\x1b\xa2\x3d\x69\x9d\x13\x72\x11\x50\x51\x5c\xac\x2b\x75\xf3\xb6\xa2\xeb\x6e\x0f\xa5\xde\x98\xd7\x3f\x9b\x4f\x95\x2c\xe2\x75\x3e\x24\x51\xb7\x3b\x6c\xba\x10\x01\x69\xd7\xc6\x94\xfb\x12\x8b\x92\xa6\x84\xfc\x5b\x04\x55\xe9\x17\xc9\x2a\xe2\x5b\x91\xe9\x7b\x41\xcb\xa0\xa3\x7f\xdc\x6b\x3a\xd1\x30\x96\x58\x13\x7f\x45\x44\xfd\x6c\x4b\x74\x39\xf9\x69\x36\xe1\x30\x57\x11\xd2\xdd\x8d\x38\x47\x61\x3b\x0b\x85\xa5\x61\x65\xde\xd6\xfe\xac\x53\x96\xbc\x0f\xaf\xf9\xe1\x8f\x1b\x9d\x95\xd2\xed\x36\x59\x71\xb5\xcf\xe3\x3d\xe9\x3b\x07\x1c\x09\xe3\x30\x9b\xf0\xf1\x2b\x61\xa8\x5f\xbf\xde\x5b\xa8\x11\x98\xb7\x6f\x68\xc6\xaa\x70\x64\x75\xc0\xe7\x46\xf0\xd4\x86\x55\x65\xc1\x41\x86\x4d\x86\xb1\x9d\x77\xe8\x7f\xaa\xb3\xfd\x4f\xad\x12\xaf\xdf\xfd\x6b\x14\x92\xd7\xef\xfe\xd5\x48\x2b\xf6\x6f\xc5\x61\xf6\x6f\xf0\xbc\x77\x83\xdf\xcb\x4a\x25\x1f\xf9\x6d\x51\x39\x9f\x20\xe8\xae\x10\xb4\x15\x1b\xf3\x55\x10\xf0\x2c\x4b\x52\x34\xf2\x88\x3b\xe4\x60\xc6\x83\x94\xe7\x43\xf9\x3d\xfe\x7d\xfb\x46\x5e\xae\x07\x9e\xef\xd0\xbc\xe3\xed\x9b\x6c\x54\xfc\x06\x82\xa6\x4c\x46\xb1\x6e\x1b\x78\x96\x65\x36\xbb\x6c\x6e\x86\x82\x0b\x84\xed\x77\xf4\x08\xde\x22\xbe\xea\x93\x9e\x40\xec\x0b\xa8\x23\x8d\xfd\xe8\xed\x78\x28\xff\x54\xfe\x7e\xd3\xd4\x17\xc0\x4c\x8e\xc7\x7c\xdc\x92\x9c\xc3\x02\xc1\xf8\x78\x83\x40\x96\xf1\xb6\xe4\x66\xc8\xf1\xde\xb8\x3b\x77\x71\x74\x6b\x59\x4a\x6d\xf0\x78\x43\x3b\xb3\xa6\x75\x55\x99\x52\xd9\x58\x09\x20\x5c\xf4\x58\x18\x5a\xc5\xa3\x9c\xfc\xbb\x1a\x57\x79\x21\xc0\x6f\xed\x61\x8d\x30\x90\xfa\xbf\x3b\xc3\x17\xa9\x8d\x84\x66\x7c\x6e\xd4\xf7\xf5\x1a\x2c\xd6\x1a\xed\xb7\x6f\x9e\xa5\xb0\xf5\xc2\xbd\xbd\x95\x26\x2b\x85\x2e\x96\x88\xa1\x44\xb7\xfd\xa6\xa6\xb7\xe2\x4a\x1a\xf9\xb5\xe9\xfe\x6d\xe1\x85\x9a\x46\xa0\x3f\x55\x2b\x1f\x24\xe9\x38\x13\xfb\xa1\xd6\xe0\x60\x94\xd5\xb5\x31\x6d\x5b\xf5\xf5\x6d\xa1\x32\xa0\x4e\x36\xe0\xca\x4b\x0c\xfd\xda\x0c\x7b\xcb\x95\xa1\xe8\xe6\x9a\xfa\x97\x6b\xfa\xc8\xcb\xfb\x00\x4b\xdf\xf3\x3a\x6e\x4f\xda\x0a\x1e\xa4\xde\xd2\xb3\x1e\x4b\x80\x68\x14\xb7\x23\x1b\xfd\x88\x90\x10\xbd\xe7\xb8\xa2\x26\x0d\x1f\xf8\x54\x3d\xed\x09\x84\xf4\xfc\x86\x2f\x51\x37\x7b\x8a\x16\x3d\xdf\x25\xc5\x85\xc9\x55\xdc\xcd\xfa\xbe\x97\xa4\xbc\x44\xfb\x59\x52\x77\xa5\x15\x80\x5d\xa8\x6b\xe3\x5a\x1f\x9c\x2c\x47\xed\x68\x47\x3f\xf5\x0c\x6c\x10\xaa\x91\xca\x95\x67\x69\x27\x0c\x6e\xac\xa8\xc9\xde\x5e\x37\x95\x10\x92\x28\xaa\x8f\x26\x0c\xe1\x78\x18\x93\x70\x2c\xc2\x34\xc5\x04\xfe\x2c\xeb\x00\x00\x65\x60\x27\x7f\xf9\x77\x9c\x85\xec\xf6\x59\x38\x55\x33\xdc\xa4\xe9\xf2\xf6\xde\xb6\x4c\x3e\xe0\x60\xa2\x81\x71\xda\xb4\xeb\x88\xab\x7d\xdb\x35\x08\x89\x95\xc6\x06\x4f\x61\x53\x60\xf8\xe6\x6d\x14\x6e\xc8\x7d\xbc\xd0\x78\x9c\xcd\x53\xae\xa5\xfc\x22\xcc\xf0\xa2\xf3\x55\xa4\x94\x26\xe1\x98\xa7\x18\xf5\xbb\xfe\x70\xf5\xbb\x6f\xea\xe2\xaf\x62\xf4\x30\x4c\x3f\xea\x23\xd6\xb2\xdc\x4f\x2f\xfc\x9c\xaf\x14\x26\xbf\x67\xdf\xe2\x50\xfd\xb3\x30\x0a\xf3\xb0\x2b\x7b\x2d\x28\x53\x3f\xee\x2b\xf9\x2d\x0e\x13\x88\x82\x4c\x4b\xbb\x58\x7c\x87\xd8\x8c\xff\xcf\x45\x14\x4e\xa7\x3c\x7d\x01\x90\xf7\x23\x10\x56\xf5\x0d\xb6\xf3\x38\x4a\x92\x99\xac\xca\xc1\x1c\x58\x0a\xcd\x4f\xd3\xe4\x72\x65\xa2\x56\xee\x9e\xad\x7d\x69\xb2\xc1\xd3\x65\xae\x7f\x81\xcb\x5c\xe7\x2b\x97\xb9\x6e\x16\x23\x6e\xf4\x3e\x12\x7b\xbb\xe9\x7d\xe4\x3f\x56\xef\xa3\xe5\x05\xcf\xa5\xf3\x38\x1b\x94\xee\x3c\x25\x9e\x78\x05\x63\x18\x72\x75\xcc\xdb\x29\xb9\x9a\xf2\xc0\x8f\x82\xd7\x70\xae\xb2\x61\x28\x10\x7d\x69\x70\xb7\xf3\xd7\xd8\x3e\x20\xe6\xaa\x03\x62\xf2\x86\xbc\x63\x1f\x97\xb7\x1b\x5a\x5b\x6a\xd9\x6a\x10\x0e\x22\xde\x31\x5b\x9a\xaa\x28\x03\x58\x1d\xc1\x1e\x88\xc5\x19\x00\x15\x23\x02\xe6\x63\x9d\xa3\x63\x42\x48\xe3\x5d\xc5\x13\xbc\xec\x8c\xe4\x4b\x2a\x6e\xfc\xae\xac\x9e\xf3\xd1\x0f\xf9\x77\xa3\x11\x17\x96\xb4\x30\x19\x29\x0f\xf2\x6c\x65\x36\x5a\xa3\x97\x78\x33\xb6\x39\x27\xb3\xc2\xc4\xe3\xa7\x85\x1f\x29\x5d\x03\xca\x9b\x66\xee\x30\x57\xc3\x71\xd3\x51\xeb\x78\x9c\x04\xb8\x81\xc5\x7d\xbd\xef\xb9\xb8\x44\x64\x70\x7a\x0c\x8b\xa2\xf1\x85\x1f\x8d\xe4\xe7\x37\xe1\x52\x3e\x39\x55\xd4\xed\x0a\xe7\x58\xf8\xa4\x1e\x50\xd3\xc4\xa9\xde\x67\x41\xde\x33\xae\xaa\xef\x11\xcf\x8f\x73\x35\x3c\x19\x71\x41\xd5\xdd\x64\x9f\x86\xb1\x9a\x5d\x0d\x53\x35\xa0\x9f\x86\x89\x1a\xd0\xab\xa1\xaf\x06\xec\xd3\x30\x53\x03\x76\x35\x9c\xab\xfc\xd3\x30\x50\xf9\xd5\x70\xbc\x1c\xb5\xb1\x61\x15\x97\x13\x4e\xa4\x7a\x9c\x8a\x8b\x4c\xea\xd8\x89\xea\xd9\xc9\x08\x03\xae\x5f\xf0\xfc\xc7\xe4\xd3\x87\xe4\xc7\xe4\xd3\x2b\x40\x18\xca\x20\x24\xc9\xf9\x79\xc6\xf3\x03\x7e\x9e\xab\xe5\xcb\x87\x64\x56\xfd\xfe\x77\x38\xce\x27\xd5\xdb\x3e\x0f\x2f\x26\xb9\x1a\x37\xbf\x8a\x1b\x5f\xc5\xad\xaf\xe2\xd6\x57\x95\xd5\x6a\xf6\x69\x98\xc2\x48\x13\x1c\xa9\x8f\x23\xcd\x70\xa4\x73\x1c\x69\x00\x23\x1d\xc3\x48\x67\xaa\xcf\x87\x53\xd5\xcf\x86\x67\xcb\xe5\x00\x60\x78\x59\xc7\x78\x78\x7a\x28\x3d\xbf\x89\x97\xd2\xf3\x9b\x74\x29\xbd\x96\x9e\xdf\x24\xf0\xdb\x5f\xaa\xd2\xf3\x9b\x0c\x7e\xce\xf1\x67\x00\x3f\xc7\x40\x04\x57\xf3\x5b\xcf\xa3\xb0\xee\xae\x0f\xec\x40\x59\xb7\xa1\xd1\xf1\x2e\x6b\x5f\x72\x5c\x82\xc1\xe3\x98\x20\x86\xe6\xe3\x2f\xbe\xe5\x78\x85\xd2\x38\x3e\x59\x2e\x15\xb5\xd3\x60\xeb\x84\xca\xea\x71\x48\xc4\x91\x3c\xd9\x68\xcb\x7e\x4b\x35\x8a\xda\xc8\x5c\x69\xb2\x03\x16\xbe\xbc\xd1\x6e\x45\xb7\x37\xdb\x5c\x94\xbb\x0c\xb4\x51\x4b\xa7\xc1\xd6\x85\xd2\xf3\xdb\x69\xb9\xb3\x94\xfb\xe3\x20\x9d\x4f\xcf\xbe\x02\x09\xd7\x4b\xb2\x15\x24\x99\x9a\xd4\x04\x9b\xff\x44\xb0\xfd\x15\x08\xb6\x6c\x34\x88\xee\x9d\x60\x2b\xf7\x6e\x4d\xb0\x25\x8f\x96\x60\x2b\xc1\xc4\x8f\xd5\xa1\xdb\x89\x16\x11\x43\xad\x89\x1c\xf1\xbe\x42\xe4\xb4\x6b\x2f\x3d\x31\x1a\x5f\xf4\x50\x30\xcf\x9a\x0d\xe4\xcb\xa5\x9a\x8c\xfc\x41\xd4\x04\x38\x15\x8c\xf8\x6a\x18\xa1\xd3\xe0\xea\x70\x76\x82\x96\x9b\xea\x02\x38\xd1\x80\x99\x9d\xc6\xfb\x66\xf3\xcb\x9b\xef\xad\xad\xd3\x81\xa8\x09\xb4\xb3\xdb\x81\x76\xd0\x8d\x96\xfc\x67\x93\x30\x04\xc9\x98\x6b\xd3\x10\x6f\x79\x6f\x0d\x34\x5c\x5c\x69\x90\x29\xf2\xfa\x3f\xf8\x26\xc7\x2b\xe2\x1c\xac\x55\x55\xbd\x08\x92\xe9\x6c\x9e\xf3\xf1\x4e\x17\x5f\x88\x6a\x5f\xf0\x78\x11\xa6\x49\x8c\x51\xc3\x6f\x47\xc9\x35\x6d\x5d\x23\xe7\x59\xad\xe7\x0a\x1f\x2b\x60\xad\x3a\x3b\x7d\xa2\x24\xfe\x0a\x94\xc4\x19\x50\x12\xa8\x20\xe0\xff\x33\xf7\x23\x65\x20\x37\xf7\x38\x9c\xd3\x05\x8f\x92\x19\xbe\x55\x1a\x95\xfe\xa2\xb3\x34\x19\xcf\x83\xc2\x95\xd3\xbf\xad\x64\xce\x33\xa8\x2d\xdb\x32\xe2\x4d\x1f\xd9\x32\x2b\x14\xa1\x61\xf6\x86\x2f\x64\x75\x8e\x28\xbe\x99\xfc\x2e\x4d\xc6\xb2\x1a\xac\xa4\x7f\x80\xb6\xd5\xb1\x48\x5f\xce\xe3\x8f\x71\x52\xa3\x9d\xd6\xd5\x63\x71\xa1\x39\x2a\x7b\xa5\x72\x65\xb9\x54\xe7\xa3\xe9\x20\x6b\xa2\xa4\xa2\x07\xc7\xd1\x17\x63\x71\x71\x07\xaf\x1a\xac\xd6\x2c\x06\x71\x9c\xdc\xb5\xea\xf1\x6a\xd5\x62\x1e\x8e\xfd\xbb\x56\x9d\x35\xb1\xed\xd9\xed\xc0\x79\xca\xc7\xa1\xdf\x87\x6f\x53\xe1\x01\x19\x2e\x78\xb7\xf0\x57\xb0\x0a\x12\xfe\xfc\x15\x4a\x79\xb6\x85\xb5\x4c\xd1\xa3\x64\xf5\xba\x08\xd1\x7f\x91\xb3\x5a\x72\x37\x04\xf2\x10\xf1\x26\x36\x31\x05\xc5\xd7\x3f\x27\xe9\xd4\xcf\x81\x37\xa8\x63\x3c\x88\x41\xee\xed\x75\x53\x48\x32\xcf\x67\xf3\xe2\x93\xf2\xaa\xf2\x2d\xcd\x37\xe2\xdd\xcd\x37\xe2\xad\x2c\xa3\xc5\xba\xcc\xfc\x0b\xae\xe5\x61\x1e\x71\x2d\x0a\xb3\xde\xa5\xac\x8b\xac\xff\xec\x1b\xa4\x8b\xea\x21\xec\x3e\xe8\x6f\x71\xbc\x29\xcf\xc2\x6b\xae\x25\x67\x68\x4d\x97\xae\x01\x3a\xcd\x22\x5a\xf1\xed\xfa\x3a\xbe\xc1\x69\xc8\x92\xe0\x23\xcf\x37\x09\xa4\x6e\x83\x52\xf5\x3d\xdc\xdb\xde\xf7\x76\x3f\x84\x49\xb2\x7a\xef\xda\xdd\x45\x1c\xdf\xd0\xbd\x6b\xcb\x0b\x9e\x7f\xf0\xb3\x8f\x18\x1d\xf8\x3d\x2e\xa3\xd8\x74\xe1\xf9\xa0\x49\x6a\xa1\x8b\x77\x09\x80\x1b\x0b\xd7\x80\xcb\xc7\x25\x57\x1b\x85\xc0\xd9\xf9\x17\x5c\x3e\xd9\xdb\xfb\x8e\x36\x3f\xed\x2b\x43\x78\x0c\x9d\x1f\x2b\x25\x9d\xcc\x2f\x0b\xca\x7f\x50\x7a\xb2\x14\x7e\x2c\x7c\x3c\xfc\x8e\xaa\x19\x8f\xc7\x40\x41\x89\xcb\x8d\x3b\x05\x5e\x8a\xcb\x93\xe3\x22\x7d\x50\xc7\x5f\x98\x45\x7e\xc0\x07\x72\x96\x8f\xc3\x58\x56\xe1\x6f\x32\xcf\x65\x65\xa9\x0c\x07\xbd\x35\x8d\xbe\xd3\xd5\xde\xca\x4e\x6f\xca\x8f\x87\x37\x32\xa4\xc8\x43\xf9\xf9\xcd\x59\x9e\xf8\x03\x79\x1e\x67\xf3\x19\x1c\x00\x3e\x06\x54\x74\x88\x43\xfc\xbf\xf1\xff\x4d\x65\x65\x29\x2f\x97\xa7\x4b\x45\x59\x2e\x95\x67\x95\x96\x44\x9e\xe4\xf9\x2c\x1b\xca\xa3\xd1\xe8\x32\x8c\xc7\xc9\x25\x29\x6d\xb6\x04\x19\x15\x24\xd1\x4b\xf9\x32\xcb\x86\xf2\x50\xbe\xcc\x86\xb2\x8a\x17\x6e\xc4\x85\x18\x83\xa7\x0a\xf6\x5d\x21\x51\x92\x7c\x9c\xcf\x06\x72\xe1\x58\x3f\x6c\x9e\x22\xa0\xe6\x4f\x9f\xdf\xa4\x64\x92\x64\xf9\xe7\xcf\xdd\x76\x20\x75\xf9\x02\xf2\xe7\x69\xf4\x2e\xe5\xe7\xe1\xa7\x81\xb2\x3c\x55\x93\xc2\x61\x1f\xf7\x32\x8a\x51\x16\xfc\x37\x7e\x11\x26\xf1\xb3\xc6\x42\xfd\x9b\x9f\x15\xbb\xe6\xf4\xf9\x4d\xb8\x7c\x21\x82\x40\x07\x51\xd8\xbe\xae\x13\x23\xa4\xd4\xaf\x24\x1c\x2f\x5f\xf0\x4f\x3c\x78\x99\xfb\xd9\xc7\x11\x64\xc6\xfe\x94\x2f\xf7\xf2\xfc\x6a\x94\xa7\x73\xbe\x77\x99\xe1\x4d\x75\xd9\xc4\xff\xc8\x31\xe5\xf4\xfb\x41\xf2\xf2\x74\x2f\xc5\x1e\x8c\x9e\xdf\x24\xcb\xd3\xa1\x2c\x2b\xdf\x9f\xee\x05\xc9\x74\xea\xc7\x63\xa8\x25\x0e\x92\x31\xff\xd7\x6f\x6f\x5f\x27\xd3\x59\x12\xf3\x38\x1f\x9c\x1e\x57\x4a\xb2\xe5\xa9\x22\x62\x16\xa6\xed\x98\x85\xe5\x69\x7d\x8a\x59\xf8\xa7\x8b\x59\x18\x8d\x66\xe5\xf5\x6d\x3b\xc6\x2c\x2c\xf0\x5a\xee\xe7\x99\x26\xc4\xa7\x68\x40\x73\x11\x66\xf9\xa6\x4b\x8b\x56\xf0\x5e\x94\xce\xff\x33\xf5\x67\x4d\x0c\x38\xcf\xc3\x28\x7b\x81\x78\x87\x17\x31\x83\x5b\x6d\xad\x2f\x5b\x1f\xa2\xce\x17\x4f\xe6\x36\x4f\x32\x97\xb6\xb9\x0d\x3e\x83\x55\xa3\x9b\xcd\x21\x7f\xd3\x0d\x04\x4e\xe1\xcd\x91\x3e\x52\x9b\x9b\xb4\x11\xf1\x77\x8e\xc6\xb5\x31\x39\xf8\xed\x5f\x87\xfe\x6c\x40\xf5\xd2\x50\x42\x1c\xe5\xdf\xf8\x79\x4d\xf0\xce\x91\x1a\x12\xe7\x09\xf6\x79\x78\x3e\xf8\x8e\xb7\x6d\x75\xf3\x11\xdf\xdb\xe3\xa4\x31\x71\xcd\x5b\xfa\x01\xcf\xe6\xcb\x21\xe0\x33\xbc\x5a\x23\x1c\xcb\x80\x4a\xe3\x91\x8c\x61\xa9\x47\xa3\x51\xfe\xb2\x12\xf4\x0c\xa3\x4a\xe4\x93\x34\x0b\x88\x9f\x43\xb9\x3e\xe9\xb2\xea\x8f\xe6\x58\x63\x88\x06\xc4\x7e\xd1\xa7\xd2\x30\x58\xb4\x96\x2b\x7b\x7b\xdf\x95\x3f\x49\x98\xbd\xe1\x59\x9e\x26\x57\x7c\xdc\x9b\x1c\xc6\x17\xca\xc0\x57\x13\xe5\xf3\x67\x9f\x64\x3c\x1f\x24\x2a\x57\x54\xbf\x32\xeb\x8d\x49\x80\x17\xea\x0e\x6e\xce\x79\x1e\x4c\x86\x7c\xf4\x03\xd2\x03\xb8\xf4\xc4\x9f\xe7\x93\x04\xef\x51\xf9\x8d\xff\xcf\x9c\x67\x68\x08\x7d\x9c\x9c\x0c\xf9\xb2\x32\xcb\x9d\x63\xb5\xa1\x9a\x29\x6a\xaf\xc9\x42\xe9\x12\x14\x56\x48\xf7\x8e\x22\xa2\x3e\xcb\x02\x5c\x61\x59\x3d\xce\x49\x29\x90\xff\x22\x03\x05\x51\xcd\x6d\x6a\xfb\x60\x13\x26\x49\xd2\x5e\x9e\x18\x08\xc8\x22\xf7\x5b\x64\xfc\x0a\xda\x69\x37\x43\x84\x75\x8a\x92\x35\x28\x6f\x96\x26\xd3\x30\x03\x0e\xb9\xab\x2f\xe9\x2f\xe7\x0b\x67\xd1\xba\x58\x41\x15\x77\x1d\x85\x3a\xd5\xfc\x9e\x25\xb1\x76\x19\xe6\x13\xad\x9a\xad\xca\x47\x2d\x0e\xe6\x69\xca\xe3\xe0\x6a\x1d\x9a\x15\xaa\x18\x01\x43\x1b\xb6\x4e\xea\xb9\x3a\x51\x2f\xd4\x2b\x75\xa1\x5e\xaa\xd7\xea\xef\xea\x27\xf5\x57\xf5\x9d\xfa\xb1\x46\xc6\x87\xdf\x92\xb6\xe6\xfd\x13\xe5\xf0\x57\xa0\x1c\xfe\x33\x1a\xcc\x47\x78\xaf\x6c\x79\x38\x0b\x2b\x87\x92\x03\x94\x15\x35\x58\x29\x20\x58\xb3\x8c\x1c\x9f\xc8\x8a\x3a\xbe\x3d\x7b\x76\x7b\xf5\x15\xc0\x12\xef\x24\x2d\x93\xb3\x49\x32\x8f\xc6\xef\x27\xc9\xa5\xc8\xc9\x64\x45\x9d\x6e\xea\xea\xd9\x4a\x81\x2a\xa6\x5b\xd1\x9d\x73\x28\x91\x11\x60\x46\x95\x7a\x3f\xfc\xef\xd2\x80\x52\xe2\xa3\x9b\x83\x30\xe0\x71\xc6\x87\x37\x3f\x73\x3f\x9f\xa7\x1c\x23\x70\x2e\x9f\xe5\xe9\x55\xb9\x63\xae\x42\x1e\x8d\xa5\x7e\x24\xe9\x5f\x96\x78\xf2\xf4\xc5\xf3\x9b\x84\x54\x1d\x58\xbe\x80\x35\xf2\xf3\x24\x7d\x11\x89\x16\x4e\x15\x92\x4f\x78\x3c\x18\xe8\xaa\x5f\x2e\x8e\x32\xe0\x8a\xb2\x0c\xfc\x3c\x98\x34\x42\xf6\xa2\x1f\x8e\x3a\x59\xdb\xf7\xba\x6f\x83\xdb\xfa\x56\x74\x4c\x7e\xb1\xa0\x2f\x32\xee\xa7\xc1\xe4\xc5\xf9\xfc\xfa\xfa\x0a\x03\x89\xe4\x93\x64\x3c\x94\xdf\xfd\xfa\xfe\x83\xac\x9e\x25\xe3\xab\x6e\x84\xcc\x9b\x0f\xfc\x53\x3e\x94\xcf\xc5\xa4\x68\x63\x9e\x73\x6c\x5f\x43\xab\x55\x59\x7d\x9d\xc4\x39\x96\xa8\xa7\x5c\x46\xa4\x42\x92\x8f\xc5\x80\x2a\x65\xd8\x77\x14\x07\x74\x21\x44\x1c\x7e\x14\xfa\x99\x32\x90\x91\xfc\x28\x66\x9f\x44\x7e\x96\xbf\x9f\xa3\xb3\xeb\xf9\xbc\x38\x75\xb2\xa2\x5e\xb5\x3f\x09\x26\x3c\xf8\xf8\x33\x8c\xe1\x3d\x8e\xe7\x5d\xca\x33\x1e\x07\xe2\xf3\xea\xa3\xc5\xca\xb6\x28\x56\x80\x94\xad\x95\x4b\x2d\x36\xc9\xe5\x96\x72\xc2\x3e\xd2\xf9\xb0\x50\x0c\x16\x34\xcf\x75\xa1\x2f\x2c\x93\x0b\xea\xe0\xf7\x4e\x72\x73\xe8\xb2\xfa\xa9\x93\xbb\x6e\x94\xb2\xfa\x6b\xa7\x64\x54\x56\xf1\xae\xdb\x40\xfd\xf5\x4f\x42\x08\x27\xab\x1f\x0b\x9d\x25\x50\xc9\x11\xf7\xc7\x3c\x6d\x1c\x83\x7a\x07\x55\x17\xbc\x56\x52\xc1\x92\x5e\x2c\xd0\xf0\x90\xf7\x6c\xb2\x95\xdd\x0f\x3c\xec\x3c\x7b\x21\x1a\xaa\xb6\x3e\x5a\x5a\x03\x3e\x1e\x28\x4a\x23\x6d\x70\x93\xce\x02\xbc\x9b\x03\xe3\x4f\x37\x32\x0a\x07\xb8\x3c\x3c\xbf\x2a\xa1\xde\xeb\x89\x1f\x5f\xf0\x81\x2c\xaa\x26\xc5\x97\xb2\xa2\x72\x45\x51\x0a\x63\x7c\xff\x82\xc7\xf9\x7d\x0c\xef\x96\xf3\x8d\x6d\xbc\xc8\x78\x74\xde\x7f\xb2\x6f\x96\xcd\x91\x20\x56\xcd\x81\xc8\x17\x91\xb0\xf9\xde\x9e\xf8\x31\x1a\xe4\x23\x5e\xe0\x40\xa5\x81\x8a\xf2\xbd\xbd\xbc\xbc\x00\xb5\xb4\xf7\x2e\x5e\x87\xb9\x5a\xfc\x7a\x97\xf2\x94\x47\xdc\xcf\xf8\x30\x2c\xd3\x0e\x79\xee\x0b\x57\xc2\x65\x55\x71\x59\xd1\x33\x4e\x8a\x1b\xf2\x46\xb9\x1a\xee\xed\x0d\xea\x77\xbc\x78\xb5\x78\x59\x6a\x18\xcb\x52\x51\xe3\xf5\x45\xbe\x7f\x7e\x13\x2f\x4f\x1b\x81\xab\xab\xc9\x6f\x81\xf8\x3f\x64\x11\xa6\x48\xce\x65\xdb\xac\xc3\xe0\x46\xe0\x9c\x21\x27\xef\x51\x2d\x23\xba\xb9\xac\xf7\x4e\x81\xcf\x6e\xed\x78\x74\xe7\x8e\x17\xad\xf4\x77\xf9\xf8\xa4\xde\xc9\x0d\x94\xd7\xed\x52\x51\x87\x9a\x37\x65\xcc\xd1\xfb\x3c\x49\xfd\x0b\x4e\x90\x0a\x7e\xd5\x23\xde\xe5\xb5\x97\x6e\xae\xbc\xcc\x05\x9b\x95\x75\xdb\x12\x6c\x72\xb1\x59\x6b\xeb\x45\xfe\xbd\x2c\x3f\xdb\xaa\xb9\x51\xbe\xe4\x51\xc6\xa5\xbe\xc2\x29\x9f\x26\x0b\xfe\x36\xe7\xd3\x82\xf9\x78\xd5\xc2\xec\x38\xf2\x15\x92\x60\xd0\x76\x40\x46\x46\xbc\x24\x3e\x84\x73\xad\xac\xfc\x40\x1b\xdf\xbe\x15\xc3\xac\x26\xaf\xf9\xf5\x4a\xed\xc5\x1d\xa1\xcd\x39\x80\x53\x58\xb5\xd4\x4b\xb8\x88\x9e\xd6\x28\xb0\x6e\x64\xfd\x0e\x69\x84\xcb\x3d\x0f\xe3\xf1\xab\x28\x6a\x5d\xd5\xd9\x84\x94\x80\xc2\xfc\x20\x1f\xd4\x9b\xb3\xee\xf6\x2f\xcd\x46\x5b\xdb\xa2\x41\x04\xe5\x22\xc0\xce\xa0\xe1\x52\x2b\x66\x6a\x6f\x8f\x93\x2c\x99\x72\x6c\xa8\x19\xef\xb7\x21\xe0\x28\x5c\x4f\x0a\x12\xa0\x77\xfa\xd7\x21\x56\x59\xf9\xfc\x19\xc8\x28\xf5\x7a\xf4\x7e\x70\xd9\x27\x1c\xc8\xef\x49\x38\xf0\x7b\xb7\x81\x92\x21\xbf\xaf\x06\x3a\xd5\x0b\xac\x23\xab\xc7\xf3\xcd\xf2\x86\xbe\x0f\x15\xf5\xb2\x29\x6a\xe8\xd4\x8e\xe0\x0c\x45\x27\xdb\x4b\x35\x7a\x2a\xb8\xbd\x91\xd6\x4e\xbe\x4b\x63\xed\x8a\x6e\x6f\xb4\x38\xa8\x77\x69\x2e\xad\x38\x83\x5b\xa7\xb0\xc5\x6f\x1c\x07\xbb\x4e\x60\x9b\xc5\xb8\xad\xa5\x55\x9e\x45\x3d\xde\x75\x4c\x7d\x7c\xcf\xe6\x36\x5b\x80\x4d\x56\x8f\x67\x5f\xd4\x6a\xbb\x96\xdb\xdb\x6d\x50\xf9\xea\xf1\x74\xc7\xe6\x1a\x1f\x6f\x3b\xa3\xbf\x34\xdb\x3b\xfb\xe2\x49\xfd\x65\x6d\xcb\x9f\xba\x70\xa3\x4d\x93\x1f\x9f\xdf\x15\x6e\xfc\xda\x6d\x60\x3d\x59\x7f\x3c\xb9\x6b\x63\xef\xba\x8d\x55\x9c\xc1\xf1\xc5\x5d\xeb\xfe\xb8\x32\x53\x3d\xcc\xc5\xf1\xd5\x3d\xc3\xd9\x12\xeb\xc8\xea\xf1\x62\xc7\xe5\xaf\x3e\xed\x2c\xf9\x65\x53\xac\xfb\x9f\xdb\xe5\x9f\xc0\xdb\x6a\x53\xee\x67\xf3\xb4\xdf\xfa\xa7\x55\x60\xdd\x77\xdf\xa0\xe0\xb7\x27\x9e\xd7\x97\xcb\x7d\x7b\x4c\x7f\x7a\xef\x88\x58\x95\xc6\x76\x2e\x85\x58\x91\xe9\xe2\x69\xbd\x93\xcc\xb6\x96\xd4\xfe\xfe\x2d\x49\x6a\x3f\x3d\x49\x6a\xff\x0a\x92\xda\x5f\x0b\x49\x6d\x72\x9b\xec\x12\xfd\xd5\x36\x59\x0c\x89\x03\xad\xa0\x40\x53\x5c\xd5\x25\x64\x86\x82\xfb\x78\xcf\xa3\xf3\x41\x3b\x50\x94\x88\x2a\x37\xca\x8b\x1f\x6a\x5e\x88\xf3\xaa\x60\x6a\x83\x90\xf0\x34\x4d\xd2\xec\x65\xf9\xa3\xbc\xf0\x67\xcc\x73\x3f\x8c\x64\x65\x78\x7c\xa2\x60\xf5\x82\xbd\x78\xf5\xfa\x40\x2a\xcc\xa7\xa4\x71\x98\x09\x94\x31\x42\x77\xb7\x82\xeb\xca\x80\x99\xf0\x83\xa8\xc2\x27\xdf\x51\x05\xa3\xfb\xa0\xe0\x30\x10\x52\xc0\x94\xfb\xe3\x4a\x70\x08\x1d\xff\x80\x12\xcf\x35\xa2\xc3\xf1\xda\xe9\x83\x99\x08\xcf\x07\x45\xc3\x45\x35\xca\xaa\xb0\xb7\xca\x13\xbc\xce\xac\x88\x88\x57\x5d\x48\x72\xdc\x2c\x5b\xf1\x73\x22\x68\x55\x51\x1c\x00\x99\x1f\x27\xf1\xd5\x34\x99\x67\xb2\x72\xd2\x95\x8c\xa2\xbf\x5d\x21\x35\xef\x48\x46\xab\x01\x96\x91\xf8\xd6\x0d\x74\xba\x76\xa0\x8d\xfe\x75\xe6\x6c\xc6\xd3\xf3\x24\x9d\x0e\x14\xb5\x60\x7a\xcb\x99\xdf\xdb\x1b\xac\xfd\xaa\xea\x48\xf5\x35\xe2\x92\xb3\x5d\xcd\x2c\x7b\x6d\x10\x7e\x6f\x4b\x4c\xcf\x0b\x81\x66\x95\x5c\xe8\x23\x27\x45\x7a\x38\xfa\x4e\x17\x81\x86\xeb\x4d\xf3\xd5\x03\x0c\x57\xbd\x69\xcf\x8b\xac\x5e\x74\x7b\x5b\x67\x5d\x75\xb2\xfa\xa7\x54\x56\x17\xeb\xaa\xa8\x8b\x5c\xde\x5a\xd5\xab\x78\x5c\x17\xbd\x6e\xc8\x7a\xc5\x31\xae\x69\x81\xb5\xc2\x1b\xac\x46\xc4\x92\x44\x71\x50\xf1\x21\x57\x6e\xe0\x24\x8e\x46\xfc\xe5\x56\xa2\x9c\x46\x35\xb2\x32\xdc\xa6\xb5\x11\x5f\xfa\xd9\x55\x1c\x48\xfc\x53\x80\xc2\xdd\x5f\x63\xfe\x21\x9c\x72\x2c\xd2\x74\x9d\xdd\x05\xe0\xa9\xe1\xc8\xbf\xf4\xc3\x5c\xca\xc9\x9a\x6a\x9f\x35\xc1\x5d\x58\xfc\x58\xf6\x8a\xef\x00\x6f\x72\xe8\x41\xf7\x8a\xc3\x1f\x68\x03\x27\xd5\x17\x1a\xd2\xe6\xed\x86\x14\x6f\x37\x2c\x2d\x43\x45\x40\xc2\xba\xe5\xca\xe8\x72\x6f\x6f\x10\x1e\xcb\xff\xaf\xf6\x0b\x52\x3a\x62\xfb\x9c\x8c\x62\x45\x45\x35\x50\xad\x30\x52\x31\xca\x46\x79\x11\x52\xae\xde\x4c\x50\xb2\x90\x0d\x43\x35\x48\xf9\x98\xc7\x80\xb3\xb2\xa1\x5c\x08\xf9\xe4\xa5\xa2\x2c\x7b\xcc\x3a\x0a\x5b\xe0\x5a\x96\x53\x18\x84\xf6\xf2\x86\x1d\xef\xe5\x66\xf9\x36\xc3\xfc\x2c\xdf\xdb\xd3\x28\xc0\x76\x12\xc6\x63\xfe\xe9\xd7\xf3\x52\x46\x37\x92\x81\x2a\xe0\x6b\xa2\x8a\x54\xc2\xcf\xd6\x0d\x4b\x6a\x3c\x6a\x08\x2b\xe5\x97\xb2\xf2\x52\xde\x93\x87\xf2\x4b\xb9\x98\x35\xbc\x78\xe9\xf9\x4d\xbc\x44\x79\xf5\x72\xc0\xd5\x52\xbc\x9b\x37\x2e\x55\x14\x30\xae\x77\x5d\xd5\x1c\x4a\x65\x78\x3e\xfa\x00\x65\xe0\xc7\x01\x8f\x5e\x45\xd1\xe0\x06\x8b\xa1\x39\xb5\xc0\xdb\xb7\x41\xc8\xdd\x3e\x6b\x1c\xdd\x5b\xbe\x5c\x2e\xd5\xf3\xd1\xa7\xc1\xd9\xd7\x14\x76\x4d\x56\x1a\x28\xed\x40\xee\xab\x85\x6e\xfd\x02\x4e\xec\x26\x15\xea\xab\x41\x51\xcf\x9a\xbc\xde\x45\x77\x20\x5d\x90\x7d\x3c\xbf\xeb\x48\xae\x56\xe6\xaa\x51\x7b\x70\xd7\xda\x17\xb7\x0f\xa0\x06\xf5\xc7\x5f\xee\xfe\x5f\x34\x75\xb9\x76\x20\x8d\x56\x66\x77\x6d\xe5\xfa\xf6\x01\xb5\xd0\xd7\xf1\xf4\xae\xad\x9d\x35\x79\xfd\x5f\x6f\x67\x79\xe7\x19\x7a\xef\xe4\x79\x18\x5f\x6c\xed\xea\x22\xd8\xd0\x59\x75\x99\xec\x0b\xc4\x70\x5a\x26\x50\x5c\x9f\x73\x1e\xde\x83\x5b\xb3\xa7\xea\xbc\xe6\x40\x83\x6f\x89\x03\x1d\x3f\x71\xa0\x7f\x05\x0e\x74\x36\x1a\xc4\xc2\x90\xa2\x22\x3d\xc4\xee\x7f\xe7\x5f\xf0\xf7\xe1\x35\x97\x55\x66\x29\xc2\x6f\x65\xa5\xcc\x41\x72\x71\x98\x8c\x79\xc3\x1d\x47\x8d\x7a\x0b\x7e\x48\x66\xc9\x51\x78\xfd\x2e\x89\xa2\x30\xbe\xf8\x25\xc9\xf1\x98\xc1\x72\x6d\x1b\x51\xb0\x8f\x99\x08\xca\x50\xea\x55\x57\xfd\x82\x76\x2e\x73\xa2\xb2\x83\x59\x27\x23\x9b\x24\x97\xfd\x9d\x2a\x7c\xc4\xd1\xe2\x75\xdc\xb6\x25\xad\xdb\x39\x8e\xef\x6c\xed\xda\xad\xbc\xea\xea\x71\x7a\xd7\xba\xe7\xdd\xba\xd7\x8f\xf6\xee\xfe\xe8\x2d\x2b\xda\xd9\xed\x20\xf8\x12\xd8\xe2\x1e\x9f\xda\xad\x25\x8d\xad\x3b\x07\x3a\x50\x7b\x53\xa4\x8d\x27\x07\x8a\xbf\x18\x68\x9b\x03\x13\x16\x14\x91\x2b\x42\x94\x2b\xfd\x1a\x47\x57\xca\x40\xfe\x0f\x6e\x41\x45\xcd\x06\x2b\xce\x15\x95\xad\xca\x0d\x30\xd5\x58\x70\xd0\x8a\xf6\x20\x6e\x4e\x98\x03\xf0\x5a\x7e\xa9\x83\xa9\x38\x01\xdf\x40\xc8\x53\x15\xe6\x70\x79\xc1\xf3\xb7\xc0\xe5\xfd\x2c\x62\x79\x96\xfe\x01\xc7\xfc\xe4\xf3\x67\xba\xcc\x9a\xb9\xc0\xec\x41\xc6\xe8\xfb\x7c\xb9\x54\x9a\x30\xe8\x3f\xc5\xb1\xff\x62\x4b\xfe\x72\xd1\x5a\x36\xfc\x2b\x5e\x09\x45\x2b\xf7\x0b\xd6\xd6\x38\x07\x2c\xda\x74\x64\x0b\x00\xdd\x47\x94\x86\x3a\xe1\x46\xf6\x23\x9e\xe6\x5a\x10\xa6\x41\xc4\xb5\xf3\x30\x8a\xe4\xe1\xff\xfa\x47\xb6\xb8\x90\x16\x21\xbf\xfc\x31\xf9\x34\x92\x75\x49\x97\x98\x29\x31\x53\x96\x20\x7f\x24\xc7\x49\xcc\x65\xe9\xd3\x34\x8a\x33\xe1\xa8\x3a\x7c\xf1\xe2\xf2\xf2\x92\x5c\x1a\x24\x49\x2f\x5e\x30\x5d\xd7\x61\x0c\xf2\x0f\xff\x98\xf9\xf9\x04\x3f\xd2\xd2\x79\xc4\x47\x32\x5f\xf0\x38\x19\x8f\x65\x29\x88\xc2\x59\x37\x6d\x3c\x92\x0f\x29\x93\xd8\x6b\x9b\x98\xae\xc4\x24\x26\x15\x3f\x28\xcb\x4c\xf8\x45\xf5\xea\x3f\xad\x48\xd0\xa8\xfe\x9e\x3a\xc4\x62\x58\x4c\x62\xd7\x53\x2a\x51\x6b\xa2\xb1\x85\xc6\x26\x6c\xc1\xae\xa7\xba\x66\x4e\x34\x76\xe4\x4c\xd8\xc2\xbe\x2e\x47\x20\xf4\x44\xf9\xeb\x24\x4a\x52\xf9\xc5\x0f\xff\x80\xee\xfe\xf0\xbf\xd4\xf6\x64\x24\xf3\x3c\x0a\x63\xfe\xb0\xf3\x81\xc3\x61\x0b\x26\x86\x04\xc3\x71\x61\x24\x38\xa4\xeb\x29\xf1\x3c\xcd\x82\xf9\x72\x56\xe7\xcb\x81\x99\xf2\x88\xe7\x49\x54\x7f\x5d\xcc\x11\xfe\x57\xfd\xa6\xac\x9e\x3b\x0a\x05\xd9\x35\x2e\x80\x1e\xc0\xf4\x32\x49\xd7\x5c\xcd\x20\x96\xab\xb9\x9a\x9b\x89\x1f\x12\xfe\x93\xe0\x45\x82\x17\xf1\x03\xd2\xb6\x9c\xdb\x3c\x0d\xfd\xf8\x22\x7a\xe0\x59\xf5\x88\x65\x50\x89\xd1\x80\x12\xcb\x84\x86\x89\xa5\x1b\x1a\x25\xb6\xed\x49\x94\x38\x06\xd5\x0c\xa2\xeb\xec\x80\x1a\xf0\x22\x99\xc4\xf3\x02\x8d\x38\x8e\x46\x89\x61\x68\x8c\xd8\x1e\x15\x3f\x0d\x62\xda\x4c\xd2\x0f\x18\x71\x0c\x17\x66\xd6\xf3\xdc\xd7\x94\x78\xb6\x2d\x51\x8f\x18\x86\xc4\x88\xc7\x5c\x89\x41\x1d\xa6\x0d\x3f\x26\xd4\x22\xba\x6d\x5c\x1f\x52\x43\xa2\xee\xea\x4e\x5d\x68\xe6\x84\x2d\xcc\xcd\xd3\x99\xa6\xc9\xa5\x36\x4e\x2e\xe3\x87\xde\xa0\xc6\x82\x9a\x84\x3a\x11\x6c\x06\x0f\x77\xc4\x81\x2d\x51\x2b\xb2\x25\x5b\xb2\x35\x5b\xa3\xc4\xa4\xf8\x38\x80\x21\x3b\x84\x3a\x47\xc6\x44\x63\x5b\x8e\x30\xe2\xe7\xf9\x83\x8e\x90\x51\x89\xd2\x7d\x9b\xb8\x46\x84\x67\x00\x46\x79\xe0\x49\x76\xa4\xe1\x00\x25\x5b\xaa\x07\x08\xa5\x24\x6a\xec\x33\xba\xd8\x7a\x80\x69\x78\x31\x79\xd8\x11\x42\x97\x27\xf5\x1a\xe2\xf1\xf6\x0e\xa8\x25\x51\x37\x82\x05\x2c\x17\x51\x12\x8b\x08\x2b\x08\x53\x62\x2c\xb6\x1d\xe2\x7c\xf6\xb0\x7b\xd4\x90\x18\x3d\x2a\x57\xd0\x43\xe8\x75\x40\x5d\xc9\x8b\xc4\xe0\x8a\x25\x2c\x86\x47\x25\x28\x79\xc4\xe8\x64\xe3\xf0\xce\x92\x28\xbf\xef\x81\x95\x1d\x86\x33\x64\x4e\xac\x85\x1b\x39\x1a\x65\x13\xcd\x3a\xda\xa2\x3b\x49\xd9\x9d\xcb\x70\x9c\x4f\x46\x32\x75\x6d\x59\x9a\x60\x64\xeb\xe2\xa5\xd5\x4f\xea\xda\x12\xa6\xee\xd6\x3b\x5d\x27\x9e\x6b\x48\xb6\x41\x6c\x2f\x32\x88\xa1\x1b\x92\x4b\x6c\xdd\x92\x98\x4e\x1c\xc3\xd6\x1c\xe2\xd9\x01\xf5\x88\xa9\x39\xc4\x34\x1d\xc9\xa4\x44\x67\xa6\x44\x09\x63\xb6\x64\xe9\x84\x52\x06\xd0\xd1\x34\x1d\x9f\xe9\x44\x77\xa8\x54\xfc\xc1\x3e\x49\x4c\x32\x88\xeb\x45\x0e\xa1\xb6\x2b\x51\x97\xd8\x0e\x0d\x0c\xe2\x59\x80\xef\x89\x41\x99\x46\x09\xf5\x60\x49\x89\xeb\x6a\x94\x12\x0b\x5a\xb6\x88\x6b\x46\x9a\xeb\x11\x9b\x19\x92\x61\x12\x53\x37\xb0\x72\x4f\x54\xee\x15\x95\x6b\x06\x71\x5d\x80\xf1\xba\x4d\x23\x0d\x72\x6c\x2a\x39\xc4\xd1\xa9\x0f\x08\x4d\x94\x81\x66\x0c\x5b\x33\x89\xad\xb3\x03\xe2\xda\x8e\x64\x5a\xc4\x36\xed\xba\x88\x84\x79\xa2\xa0\x75\xe0\x50\xe2\x58\x86\xe4\x41\xd1\x46\x19\x91\x2b\x8a\x1e\x78\x8c\x50\x53\x32\x75\x62\x5b\xcc\x67\xc4\x74\x5d\x49\x3c\xa1\xac\x0e\x43\xa2\x0e\x71\x59\xa0\x19\x84\x9a\xf0\x91\xee\xc0\xd8\xa8\x03\xbd\xd3\x98\x41\x3c\xe8\xb6\x4e\x2c\xcf\x67\xc4\x02\x84\x25\xbe\x94\x28\x81\xde\xb8\x8e\x1b\x50\x46\x5c\x4f\x63\xc4\xd3\x6d\x98\x1c\x4b\xb7\x35\x9b\x58\x9e\x0b\x93\xe3\x51\x13\xaa\x33\xa8\x1b\x59\x44\xa7\xa6\x44\x0d\xa2\xdb\xd0\x11\x0f\x2a\x83\x67\xd9\x11\xdd\x24\x8e\x27\xfa\x61\xd6\xfd\xb0\xdd\xba\x23\xee\x16\x1d\x61\xae\x06\xdd\x61\xd0\x13\x93\x19\xd0\x13\x9b\xe1\x32\x59\x50\x1f\xb3\xae\x9b\x60\xe2\x2c\xf9\xa4\xa1\x7d\xdb\x23\xa0\x40\x3d\xc9\xd8\xb7\x7c\x20\x8a\xc4\x8c\x30\x89\x2d\xa8\x59\x27\x00\xa5\x35\x69\x27\x68\xec\xa8\xf5\x05\x10\x6a\x9a\x27\x51\x33\xd2\x2c\xcd\x6a\xe0\x07\xa0\x5d\x11\xce\x3a\x80\x2a\x1d\x04\xb3\x9e\xe4\x46\x9a\x27\x79\x1b\x61\x29\x4c\xd2\xa3\xa0\x49\x3d\xc9\x5a\x50\x73\xdf\x3a\xb2\x26\xd4\x04\xba\x85\xed\x5b\x01\x6c\x61\x9c\x2d\xe2\x15\x53\x16\xe0\x9e\x20\x1e\x92\xa6\x30\x65\x01\x16\x91\x98\x06\x69\x30\x67\x01\x6e\x7c\x0d\xbe\xc0\x49\xdb\x08\xdf\x3e\x15\xe3\xde\x3c\xae\x12\x02\xc2\x8c\x94\x00\xb0\x3b\x3b\x3d\xb3\xd7\x98\x8e\x4e\x37\x7a\xa7\x48\x00\x6b\xc2\x74\x9b\x38\x96\xe9\x33\xe2\xc0\x89\x70\xca\xc3\xc4\x88\x49\x81\x3a\xa4\x08\x2f\x2d\xa2\x5b\xec\x15\xc0\x0a\x89\x56\x65\x24\x40\x37\x36\xb3\x16\x1e\xf1\x74\xd6\xad\x01\xb6\x8e\x67\xc3\x01\x35\xdd\xc8\x25\x0c\x00\x03\x63\xf6\x4a\x31\xa0\x5f\x5d\x49\xc7\x22\x1a\x16\x79\xb5\x52\xc4\x90\xa8\x4d\x2c\xe6\x1c\x61\x7b\x7e\xa7\x1f\x1a\x74\x51\xa3\xc4\x72\x8c\x83\x7a\x44\xd7\x53\x0d\x8a\x00\xec\x36\x4c\xd7\x87\x73\x2b\xe1\xa3\x80\x70\x44\xf7\x6c\x6c\x16\xc8\x40\xe2\x59\xf6\x01\x80\x76\x1d\xc0\x96\x41\x0c\xd3\x90\x6c\xa2\x5b\xd0\x73\xaa\x03\x65\xe8\x59\xf6\xf5\x21\x40\x0c\x07\x20\xd1\xc2\x23\x8c\x06\xba\x04\x84\x31\x61\x36\x00\x7d\x97\x00\xc8\x07\x04\x11\xb9\x44\x77\x24\x93\x50\xc3\x38\xa2\x94\x98\x8e\x79\x50\x7d\x78\x3d\xa5\x3a\xf6\xc4\x24\xa6\x65\x61\x49\x0d\x4b\x76\x3a\xa8\x4b\xc4\x76\x11\xb4\x1a\x0b\x0d\x1a\x8b\x34\x17\x06\x6c\x12\x6a\x39\x0b\x00\xcf\xd7\xbd\xbb\xbc\xb1\xe3\xd2\xc4\x1f\x07\x7e\x76\xef\x58\x7e\x27\x02\x54\xa2\xcc\xf7\x88\xe7\x58\x92\x78\x8a\xc9\x37\x08\x73\x00\xc3\x1a\x9e\x1b\xe1\xf2\xc0\x66\x71\x99\xef\x10\xcf\x05\xac\x01\xcf\x62\x16\x98\x2d\x51\x46\x74\xcb\x3b\xb0\x10\x21\x50\x8f\xd8\xee\x2b\x8f\x78\xae\x84\x8f\x12\xef\x52\xe0\x9f\x6d\xe2\x30\xbb\xa8\x57\xbb\xad\x62\xaa\xd5\x15\x47\x94\x30\x20\x7d\x89\x65\x74\x2b\xd6\x05\xab\xb9\x32\x02\x5d\x6b\x8c\xe0\xfa\x10\x6a\x42\x78\xe0\x58\x1e\x71\x90\xce\x36\x90\x26\xf3\x6c\xd8\xd2\xa6\xe1\xe1\x28\x91\x54\x73\x7d\x03\xd8\x55\x7c\x14\x43\xa4\xb8\xd7\x8c\x03\x97\x50\xcb\x83\x9d\x6e\xd3\x57\x16\xe2\x2a\xf1\x2c\x8e\x9a\x18\xa2\x4e\x74\xa3\xac\x54\x5b\x5b\x2b\xd5\xca\x5a\x71\x74\xac\x18\x5d\xb7\x56\x20\xa3\x60\x7c\x90\x62\x49\xe2\x59\xe2\xd2\xaa\xef\xd7\x87\x00\xfa\x99\x00\x89\x3a\x60\x46\x21\xe1\x60\xe2\x5d\x40\x45\x4c\xd4\x98\x20\x07\x74\x91\x20\x20\xa3\x56\x94\x02\xf0\x8a\x89\xd2\x66\x60\x39\xbf\x78\xd0\x4d\xab\x4b\xc0\xdc\x12\x97\xf6\x4e\x8c\xcb\x70\x76\x0e\x28\x9c\x71\x58\x66\x0b\x09\xf3\x48\x63\x00\x3b\xe0\xf1\x9a\x32\xe2\xd9\x00\x34\x71\x8f\x99\x9e\x64\x49\x94\x49\x56\xa0\xc1\x6f\x80\x57\x36\xd1\x05\x5f\x42\xa8\x73\xe0\x42\x2d\x86\x24\xaa\x8b\x28\xb1\x61\x66\x6d\xe3\xb5\x43\x5c\x57\xb2\x89\x05\xa0\x83\xd9\xf0\x60\x40\xdf\x53\xc9\xdd\x37\x17\x6c\xc2\x88\x0e\x9c\xbd\x6e\x01\x33\x4f\x74\x8f\xd8\x36\xfc\x91\xe8\x82\x8a\xfc\x05\x42\x28\xc3\x04\xb2\xc8\x76\x30\xab\xf8\xd0\xa5\x01\x10\x4b\x00\x43\x3d\x60\xf3\x1d\x09\x40\x3c\x90\x0f\x19\x00\x18\x8d\x12\x46\x31\x41\x33\xf6\x99\x0e\x5c\xbe\x86\xad\x11\xdd\xd2\x88\x61\x10\xdd\xd3\x88\x6d\xc3\x1f\xba\xd0\xe8\x84\x89\x12\x0b\x8d\x06\xba\x46\x0c\x53\x23\xba\xa9\x11\xdb\xd1\xb0\xc4\x3e\xd3\x8f\xdc\xeb\xa9\x66\xc3\xac\x9a\x50\xd4\xac\x44\x06\xd5\xeb\x86\x1d\x11\xf8\x11\x8f\xc7\x7e\xfa\xa0\xb4\x83\x2d\x59\x13\x7a\xc4\x26\x1a\x5d\x18\xd7\x87\x8e\x78\xdb\x77\xe0\xc5\x94\xa8\x07\x93\x6d\x11\x0b\x70\x8b\x44\x81\x64\x00\x8e\x9b\xe8\x0c\x0e\xa3\x05\xa4\xf9\x91\xb3\x6f\x2e\x28\xbb\x3e\xa4\xae\x64\x2c\x8c\x89\x66\x1c\x19\xfb\xde\xc2\xd8\xb7\x8f\x8c\x7d\xeb\xb5\x29\x19\x92\x21\xc1\xd3\x2a\x28\x10\x04\x6c\x25\xfd\x81\xe7\x8c\xd6\xc4\x87\x46\xc5\xf9\x9a\x68\x74\xed\xec\xed\x3e\x46\x18\x48\xb5\x9e\x40\x0a\x1a\x92\xde\xfb\xbe\xef\xb6\x5f\x2d\x78\xa5\x4c\x33\xb6\xfa\xfa\xc1\x6a\x3b\x72\x5b\x85\x37\xbd\x62\x4d\x9b\x88\x5b\x61\xb7\xf4\xe8\xe4\xd0\x95\x5c\xd5\x69\xcb\x55\x9b\x72\x68\xa7\x21\x87\x36\x2a\x39\xb4\x05\x2c\x16\x8a\x51\x00\xb2\x51\x07\x92\xa9\x01\x50\x0a\x41\x15\x30\x76\x05\xd4\x43\x66\x0a\xb2\x1d\x91\x85\x0f\x51\x5e\xe4\x60\x29\x07\x3e\x11\x9f\x62\x2d\x90\x5d\xd4\xb0\xe3\xe4\x7e\x2d\x1e\x42\xec\x7d\xc2\x6c\x5b\x72\x89\x55\x50\x82\x8e\x6d\x4b\x1e\x71\x0c\x13\xd2\xf0\x9f\x78\x2b\xb2\x28\xc3\xb4\xe2\xb3\x22\x0b\x01\x00\xce\x16\x33\xcc\x88\x61\x96\x78\x52\x48\xd1\xf0\x79\x20\xb2\xb1\xa0\x55\x57\x5b\xb5\x7f\x7d\xf7\x35\x04\x88\x04\x34\x09\x62\x28\x14\x6e\xa2\xac\x3b\x13\x02\xb2\x52\xfe\xed\x49\x85\x5c\x5c\xc8\x3f\x5d\x6d\xb3\x28\xbc\x58\x8f\x59\xe4\x87\x0f\x2c\xbd\xf5\x60\x5e\x50\xa6\x67\x15\x08\x56\xec\x39\x48\x95\x2c\xc9\x12\x3f\xaa\x1d\x6a\x49\xa2\xa4\x48\xf5\xea\x3d\x2d\x92\xa9\xf8\x4f\xfc\xae\x76\xa9\x28\xbe\xed\xa4\x64\xff\x33\xf7\xd3\x47\x00\x01\x2c\xc9\x68\xb0\xac\x92\x60\x63\x2b\xae\xb6\x60\x61\xa5\x26\xe7\x5b\xf0\xb1\x25\x5b\x2b\xf8\x60\x4d\xd0\x9b\x30\x21\xe6\x01\xad\x8e\x7c\xe3\x08\xbb\x35\xfd\xd3\x38\xf4\x05\x10\x28\xb3\x6b\x10\x21\x4a\x96\x30\xa4\x5e\x80\x02\xcc\xec\x38\xcd\x8f\x50\x9e\x00\x33\x7f\x1f\xd2\x84\x7d\xeb\x7a\xea\x21\x34\xb0\x1e\x01\x34\xda\x48\x9b\xc1\xaa\x74\x84\xb7\x0d\xd1\x05\xfc\x6e\x8b\x6e\xa1\xf6\x9d\x81\x73\x21\xe2\x66\xb0\x57\x74\xc9\x91\xc4\xa6\x81\xfd\x53\x08\x1b\xa8\x54\x6c\x44\xe0\x56\xaa\x4c\x6a\x56\x1b\x51\x24\x9a\xf8\x1f\xab\x37\xea\x75\x7b\x8b\xa5\x3c\x7f\x78\xd5\x14\xc0\xf4\x08\x60\x98\xa5\x59\xfb\xdb\x1c\x0c\xe8\xf5\x03\xab\x2a\x1c\x89\x9a\x91\xa5\x61\xaf\xb7\xe9\x33\xca\x4c\x1f\x1b\xd1\xf4\xe5\xca\x7b\x0d\x8e\xcf\xbd\x0a\x4d\x5b\x33\xf4\x28\xa0\xdd\x5d\x27\xe9\x8b\xa9\x92\xa9\x59\x4d\x29\x20\x8e\xc8\x94\x4c\xc9\xd1\x9c\x4a\x3f\xcb\x0e\x28\x12\x97\xd4\x01\x36\xdc\xf2\xe0\xb1\x05\x2d\x83\x13\xfc\xf0\xa4\x0c\x0a\x7d\xa8\x73\x60\xa2\x0a\x96\x45\x38\x22\x01\xef\x90\x2a\x61\x54\x72\xa2\x86\x2e\xba\x28\xbf\xcd\xf8\x16\x69\x12\x3f\x3c\x38\xa3\xb6\x00\xb7\xb0\xfd\x99\x58\x27\xc9\x11\xfc\x02\x50\x64\x00\xec\x56\x34\xee\x5b\x8f\xee\xc1\xb5\xec\xd4\x22\x8e\x6e\xc1\x9a\xb8\xae\x15\x69\x26\xf0\xfd\x26\x0c\xac\xfa\x55\x8f\x6a\x55\xf1\xbe\xf5\x38\x1f\x5e\xd9\xee\x12\xe6\x59\xa8\x72\xb4\x22\x18\x9b\x84\x63\xab\x7e\xd5\x9a\x68\x69\x45\xf5\xbe\xf5\x28\x1f\x1a\x89\x61\x87\x85\x2e\x40\x9c\x42\xdc\xba\xd4\x46\x49\x29\x8c\xb2\x52\xbc\x1f\x14\x65\x37\x0f\x2d\x4a\x1e\x85\x76\x50\x40\x6f\xab\x00\xde\x56\x09\xbb\xad\x0e\xe8\xb6\x1a\x90\xbb\xc2\x6e\x26\x61\x48\x12\x0a\x38\x7b\xe4\x4c\x28\xb1\x16\x16\x61\xb0\x0f\x24\x46\x1c\x8d\xb8\x12\x45\xa5\xc4\x36\x73\xf1\x28\x90\x99\x30\x1b\x7b\x24\x16\x68\x53\x62\x69\xd4\xd8\xa7\x74\x61\x47\x16\x61\x96\x64\x10\x00\x2b\x28\x8a\x35\x60\x51\x34\x46\x6c\xe7\x68\x23\xcc\xc7\xf9\xdd\x59\xd3\xe8\xd6\xd4\xba\xdb\x21\xd6\x5d\xc9\x6d\xd2\xe1\xa6\xa4\xbf\xa6\xa4\xd0\x49\xe0\x5f\x33\x83\xbf\xa6\xf8\xbf\x86\xbf\x35\xfc\xab\xc1\x5f\xf3\x7a\xaa\x4b\x34\xa0\xc4\xb6\x25\x5d\x32\x50\x19\x27\x19\x92\xf1\xde\x82\x14\x07\xd0\xb8\x04\x84\x3b\xb0\x24\x58\x95\x61\x6a\x86\x64\x68\xc6\xf5\x14\xa5\xa6\x0b\x46\x18\x8b\x08\xe0\x3b\x83\x58\xc4\x22\x86\x49\x0c\x97\x38\x4c\xc3\x7f\x86\x2b\xe4\xcd\xe2\xdf\x11\x23\xba\x90\x87\xb6\x77\xdc\x7c\xac\x9d\xfb\xe1\xfd\x9f\x3e\x01\xfc\x91\x99\x70\xed\x03\x6a\x13\x13\xb9\x8b\x08\x46\x00\xff\x3f\xa0\x16\xda\x10\x60\x12\xfc\x5f\x32\x0e\x1c\x28\x2b\x31\x3d\x62\xc4\xf3\x3c\xcd\xd0\x18\xac\x32\x13\x1a\x4d\x13\x65\xef\x50\x4b\xad\x02\x85\xb9\x38\x74\x89\x6e\x03\x90\xf5\x90\x75\xb4\x60\x7e\x6d\x97\xc1\x4e\x32\xe0\x63\x0b\xa6\xd0\x35\x1c\x8d\x11\x1d\x6a\x27\x8e\x0e\x07\x1c\xc0\x15\x9a\x39\xa0\x55\x86\x4b\x81\x9d\xb4\xcd\x08\xb8\x3d\xa2\xdb\x4e\xc0\x88\x89\xaa\x52\xc9\x20\xae\x8b\x6d\xa2\x81\x91\x64\x11\xdd\xb0\x35\x62\x9a\xf8\xb1\xc7\xb0\x5a\x43\x32\x89\xe1\x50\xcd\x22\xae\x63\x8b\xdf\x0b\x8d\x05\x16\xd1\xd1\x0c\xd1\x24\xae\xed\x6a\x16\xd4\x88\x26\x13\xd4\x62\x84\x99\xf0\x29\x43\xdb\x43\xe6\x00\x2a\xb4\x19\xec\x7a\x66\x3b\x9a\x49\x3c\x0f\x06\xeb\xb8\x9e\x26\xac\x11\x1d\xcb\x21\x96\x6d\xc2\x66\x77\x98\xc4\x08\xb5\x71\x98\xcc\x83\xa5\x86\xa1\xd9\xa8\x7d\x30\x2d\xcd\x20\xa6\xc9\x88\x61\x33\x8d\xb8\x86\x0d\x83\xd5\x88\xc5\x50\xf7\xe2\x99\x1a\x61\x0c\xfa\xed\x32\x43\xa3\x44\x77\x3d\xe2\xe1\xac\x7a\x3a\x95\x18\xd1\x29\xcc\x38\x85\x63\x4b\x3c\xd7\xd1\x08\xd5\x29\x31\x3c\x4b\x43\x3b\x1b\x8a\xf6\x25\xb0\xb3\x19\x65\xc4\x64\x2e\x5a\x40\x42\x2a\x20\x6c\x18\xb5\xa9\xc3\x1e\xb6\x17\x0c\x4e\x39\xa5\x8e\xa4\x6b\x16\xb1\x61\x2b\x7a\xb6\x66\x13\xd3\x44\xdb\x11\xc7\xd4\x88\x6d\x31\xe8\x3e\x25\xd4\x70\xa0\xc7\x96\x03\x07\xc6\x65\x9a\x45\x28\x75\x35\x62\x99\x30\x3c\x07\x96\x82\xc2\x9c\x78\x90\x6f\x78\x54\x03\xc6\xdb\xf1\x4d\xe2\x02\x01\xe1\x7a\x95\xca\xd4\x86\x99\x72\x36\x43\x80\x64\xcc\x1f\x94\x98\x25\x26\xea\x30\x81\x9a\x45\x52\x9d\xa0\x39\xd2\x81\xdb\x31\x3b\x84\x8d\x7e\x3d\xb5\x08\x93\xf4\xb2\x4c\xf9\xef\x80\xda\x92\x1d\x21\x3d\x28\x21\x0d\x81\x65\x37\x8e\x3b\xce\x92\x88\x7f\x0d\x39\x84\x28\x32\xfc\x14\x85\xf1\xc7\xbe\x82\xd4\xf3\xbc\x17\x98\x2b\xff\xf0\x8f\x31\x3f\xcf\x8a\x69\x0b\xc7\x23\xf9\x4c\xcc\x8a\x2e\xe9\x13\x87\x2d\x98\xb7\xaf\x5f\x57\x9a\x19\x81\x95\x89\x6d\xe3\xd2\x1b\x46\x65\x87\x83\x7a\x9f\x23\xca\xea\x04\x94\xd7\x19\xed\x42\x28\xb1\x33\xba\x1f\x6a\x6c\xe2\x11\xc3\x30\x01\x80\x1a\x86\x29\x99\xfb\x06\xb4\xe0\x53\x89\x96\x2a\x4c\x89\x2e\x2c\xc8\xab\xd3\x50\x65\xe5\x12\xdb\xb6\x9b\x69\x1a\x3d\xb2\xb1\xfa\xc6\xb7\x1a\xbd\x3e\xb4\x88\x61\x49\x36\xd4\x1a\xc1\x96\x05\xc2\xcf\x70\x6d\xe2\x99\xc4\xb3\x0c\x8d\xd8\xa6\x41\x6c\x03\x77\xbf\x87\xe7\x06\x8e\x17\x1c\x4c\x0f\x8d\x31\x5c\x20\x87\x0d\xf1\x30\xf0\xc9\x88\x67\x62\xb6\x89\x28\x94\xea\x0b\x9c\x8e\x7d\xf7\x88\xea\x13\xf3\xfa\x10\xc7\x28\xe1\x44\xf9\xf0\xc0\x19\xd3\xa5\x52\xf2\x63\x18\x46\x23\xb5\x54\xd3\x1a\x86\x71\x3d\x65\x92\xfe\xb5\xbf\x90\x71\x99\x39\x2c\xaa\xb8\xd2\x5c\xfa\x34\x92\x01\x08\xfc\x4d\x96\xae\x46\xb2\x66\x13\xef\x6f\x15\xa2\xa5\xba\x45\xec\xbf\x35\xf6\x24\x73\xf0\x5d\x7c\xf9\xaf\x38\xcc\xb3\x91\x2c\x5c\xbc\x7e\x4c\xe6\xf1\x38\x8c\x2f\x7e\x4c\x3e\x89\x26\x7c\xf9\x87\x7f\x9c\xf3\xc3\x24\x9d\x4d\x92\x28\xb9\xb8\x92\x52\x7f\x1c\xce\xb3\x91\x4c\x65\x29\x8c\x47\xf2\xfb\x64\x9e\x06\xfc\x55\x34\x9b\xf8\xb2\x94\xf2\x6c\x1e\xe5\x23\x39\x9b\xf8\xe3\xe4\xf2\xfd\x0c\x1d\x7d\xe6\x39\x4f\x29\x76\x94\xff\x7a\x7e\x9e\xf1\x5c\x1a\x5f\x8d\x64\x4b\x7c\xde\x53\xb2\x53\x8b\xf8\xa6\x59\xcb\x7f\xfb\xf3\x2c\x0b\xfd\xf8\xc7\x68\x9e\x4a\x59\x3e\x7e\xc3\x17\x21\xc6\xba\x1a\xc9\xa4\x55\x6d\xeb\xd3\x4e\xb5\xf0\x71\xb3\x52\x3c\xd8\x87\x7e\x9e\x86\x9f\x24\xf4\x04\xc9\xc4\x71\xdd\xf8\x7f\x42\x99\xa4\x37\x5b\x6d\xd7\xfc\x42\x4c\xf2\x0f\xff\x48\x79\x90\xe3\x8c\x06\x32\xac\x95\x8e\xeb\xa4\x57\x6b\xe4\xb0\x86\xd9\x95\x27\x4b\xe9\xa7\x91\xcc\xb0\x02\x71\xb4\x2f\xa4\x3c\xf5\xe3\xec\x3c\x49\xa7\x23\x19\x7f\x46\x7e\xce\x07\x9a\x27\x69\x8e\xd2\x06\xb0\x3d\x70\xf3\x87\x7f\xcc\x33\x5e\x14\xfa\x2f\x5d\xd7\xcb\xb5\x1f\xc9\xf3\x34\x1a\xfc\x97\xaf\xc8\x12\x42\x92\xe1\x24\xe5\xe7\x23\xf9\xbf\xce\xa0\xe5\xc6\x27\x3f\xff\xfc\x73\x5f\x89\xa9\x9f\x7d\xc4\x31\x8d\xcb\x1e\xfc\xd7\xf9\xf9\x79\xd1\x5a\xab\x78\x80\x43\x81\xf2\xc5\x4c\x64\x79\x9a\x7c\xe4\x23\xf9\xbf\x7e\xfc\xf1\xb5\xf9\x86\xe2\x9c\xc0\xea\x5d\x89\x3f\xe5\xac\xd0\xc6\xac\xb8\x8d\x59\xb9\x90\xa0\xae\xa2\xfb\x63\x45\x5e\x3b\x41\x68\xcb\x00\xf9\x55\x5f\xcf\x37\xf5\x95\x37\xfa\xda\x33\x6d\xe5\xdc\xc6\x49\x7c\xcd\xd3\x44\xee\xf9\xb8\xd5\xbb\xf3\x6a\x79\xfe\xcb\x70\x8c\x57\x26\x6b\x12\x72\x00\xa1\xa9\xbd\xa0\x76\x17\x42\x77\x33\x5e\x5c\x74\xfe\x95\x84\x66\x32\xbb\xd2\xc4\xd5\xfc\x0f\x6c\x32\x4e\x80\x34\x7c\x4d\x0d\xc0\xc4\xc4\x45\x69\xb7\x01\x10\x9e\x4a\x34\x00\xa8\x25\xcc\xfb\x88\x6b\x02\x98\x02\xc4\x62\xae\x2a\x2d\xec\x9d\x95\x16\x13\xa0\x88\xdc\xeb\x43\x4f\xa2\xc6\xbe\xbd\x60\x13\x03\xbd\x7e\x34\x43\xb2\x27\xd6\x42\x63\x90\x76\x7d\x68\x4b\xde\x82\x4d\xec\x23\x6f\xdf\xbe\x9e\x5a\x9a\x1d\x10\xcb\x42\x38\x4b\x4c\x34\x9d\xc8\x34\xfc\x01\x48\x4a\xa3\xf0\x1b\x50\x8e\x84\x7f\x25\x44\x3e\xa6\xc4\xe8\x91\x35\x61\x0b\x4a\x74\xdd\x99\x50\x1d\x5f\x2c\xe2\x79\x68\x12\xa3\x1b\x47\xd4\xd9\xa7\xee\xc2\xdc\x37\xaf\xa7\xc8\x99\x69\xc6\x42\x33\xf6\x99\x81\x96\x02\x0e\xd1\xe9\x42\x33\x90\xc1\x37\x23\x34\x98\xda\xec\xb0\x82\x4b\x9b\x89\xf8\x53\x0f\xbb\xb6\x66\xb1\xb6\x66\xb5\xb6\x86\x58\x5b\xb6\x6e\x6d\x7b\xcc\x5b\x6d\xa2\x33\xeb\x8b\xd7\x97\x32\xc9\xd8\x75\xd5\x4a\xe9\xb8\xa9\x99\x1d\xe9\xb8\x45\xa8\x13\xd9\xc4\xf2\xd0\xe0\xfb\x80\xba\x12\xd5\xa3\x6d\x9c\xb2\xc6\x7e\xee\x9f\xf9\xd9\x83\xd2\xba\x94\x12\xcb\x01\xda\xdc\x64\xc2\xec\xdc\x12\x0c\x81\x43\x4d\x62\x9b\x4c\xfc\x82\x01\x33\xe0\x94\x89\x83\xbc\x99\x85\x9c\x80\xc9\x3c\xa9\xce\xf6\x90\xdf\x87\x42\x90\x66\x21\x0d\x55\xfc\xc4\xec\xf7\xd4\x24\x0e\x96\x32\x0d\x09\x5b\xc5\x9f\xc0\x5c\x3b\x84\x9a\xec\xb5\x4d\x5c\xc8\xd1\x45\x7f\x24\x8f\x30\xd7\x96\x0c\xc9\x81\x16\x8e\x4c\xe2\x5a\xce\x6b\x43\x32\x30\x55\x14\x65\x52\xd1\x79\x16\x88\xaa\x75\xc9\x45\xc6\x8b\x62\x21\xb7\x60\xc2\x5c\xcb\x59\xe0\x13\xb7\x8b\xe5\x30\xcd\x10\x9f\x43\x9a\xd6\x28\x05\x5d\xc1\x0e\x97\x5d\xb1\x8b\x2e\x50\x0b\x1e\x38\x45\x47\xd8\xbf\x40\xd7\x60\xa2\x88\x6e\x39\x1a\x31\x08\x05\x06\x0f\xf8\x39\xdd\x64\x1a\xb0\xaf\xb0\xe5\x28\xfc\x71\xa8\x46\x98\xc3\x5e\x9b\x84\xc1\x94\x51\xe4\x6d\x05\xff\x4c\xab\xee\x53\x16\x18\xc4\x73\x6d\x49\x47\x03\x5b\xa0\x34\xa9\x29\xb9\xf0\x21\x30\x7a\xa6\x41\x74\x87\x8a\x6a\x99\x5b\xd6\x0b\xb9\x44\x77\x20\x9f\x41\x07\x44\x37\xa0\x17\x38\x58\xb7\x18\x2c\xdd\x34\x58\xb3\x18\x2c\x63\x92\x81\x1e\x24\xd4\x84\xc1\x7a\xd0\xee\x42\x2b\xe6\x4d\x23\xcc\x2c\x87\xe9\xda\xc4\xd0\x60\x96\x88\x87\xbb\x80\x31\x60\xf2\x18\xee\x0b\x6a\x1a\xd8\x6f\x5a\xfc\xde\x30\x2c\x18\x0a\xc3\xae\x9b\x0e\x23\x06\x54\x2a\x56\xea\x35\xd3\xf1\xfb\xa2\x3f\xd4\x26\xd8\x41\xb1\x6b\xd8\x46\x73\xa6\x31\x8f\xfc\xab\xaf\x22\x29\x61\x12\x75\x89\x63\xbd\xb2\x89\x03\xec\x43\x6d\x28\x8e\x96\xcd\x94\xed\x33\xea\x7b\x92\x27\xb8\x11\xcd\xd3\xbc\x05\x23\xcc\xf2\xbb\xc5\x75\xb4\x4e\xba\xdd\xe6\x4d\x98\x71\x96\xae\x2d\x9e\x8b\xc6\x99\xae\x4b\x2c\x66\xfa\x36\xb1\x1d\xa0\x45\xe0\x59\xd8\x8f\x1b\x0c\xd8\x4c\x5d\xb7\x22\xd8\x16\xae\x46\x5c\x9b\x05\x84\xba\xc4\x34\x18\x31\x98\x45\x5c\xf8\x69\xa3\xf4\xca\x40\xc3\x72\x28\xc5\x88\xad\xd3\x48\xa3\xc4\xa3\xb0\x96\xd4\x71\xa0\xaf\x8e\x23\x89\x67\x51\xb7\xcd\x4c\x0d\x96\x25\xa2\xc4\x41\xb8\x07\x55\x1b\x3a\xf0\x50\xb0\x97\x4d\xe2\x08\xb5\x0f\xec\x45\xac\xda\x45\x09\x85\x89\x35\x9b\x68\x0b\xea\x50\xac\xd8\x90\xc4\xb3\xa8\x18\xf6\x24\xd4\x1e\x61\xd3\xa2\x1b\x01\x31\x75\x83\x30\xd3\x21\x8e\x6b\x11\x8b\xd9\xa2\x5e\xe2\x1a\x08\x83\x05\x27\xed\x18\x11\x8e\x50\xc2\xc1\xc2\x7c\xe0\x74\xd4\xfe\x3c\x3a\x0a\x5a\x98\x1d\xc1\x7c\x89\x99\x0b\x88\x69\x1b\x04\xd0\x29\x7a\xc0\x38\x62\x2a\x60\x52\x90\xcf\x74\x2d\xe1\x32\xc4\x60\xa2\x0d\x18\xa6\x6d\xd1\x23\x97\x30\x6b\xa2\x51\x62\x2d\x4c\xe2\xba\x76\x04\x7c\x1e\x6c\x6e\xe2\xa2\x44\x88\x6d\xd6\x0a\x8c\x79\x7c\xa5\xf9\xd1\xfd\xab\x3d\x0a\xd6\xdb\x33\x1d\xc9\x81\xd9\x70\x4d\xe2\x3a\x16\x0a\xd4\x00\xb4\x5a\x13\x8d\x11\x66\xba\x51\x65\x95\x3f\x21\x1e\x6c\x23\x62\xe9\x8c\x98\x9e\x0d\x3b\xc2\x45\x4f\x3c\xca\x22\xcd\x22\xba\x65\x68\xd6\xf5\x94\x12\x9d\x4a\x1e\xd1\x61\x5f\x10\xd7\xc5\x7f\x42\xa8\x04\xb3\x6a\x56\xed\x40\x9a\x46\x3c\xcf\x03\xfa\x88\x18\x8e\x83\x4f\x1b\x96\x9c\xa1\xcc\xd7\xda\xb7\x17\xd8\xac\x79\x9b\x22\x73\x77\xd3\x66\x26\x14\xb0\xb0\x37\x0c\x34\x1e\x73\x34\x94\xf6\x6b\x54\x7f\x2f\x0c\xcd\x1a\x96\x66\xab\xa6\x66\x85\xad\xd9\xf5\xa1\x4d\x3c\x0b\xc5\x89\xc6\x2b\x97\x50\x66\x49\xe2\x59\x88\x12\x5c\x62\x38\x12\x75\x88\x6e\x9a\x07\x75\xc9\xeb\x43\x78\x4a\x98\xb0\xf2\x95\x5e\x94\x17\x1f\xc3\x36\x72\x98\x5d\x3c\x89\xae\xdb\x62\x53\x8a\x29\x85\x77\x0d\x13\x18\xa1\x86\x27\x9e\x13\x8d\xe8\x94\x36\x66\x70\x02\xef\x07\x55\x93\x1b\xed\x58\xc4\x66\x2b\x83\x4b\x3f\xa8\x01\xfa\x1f\xbe\x4a\x62\xbe\xf1\xd1\xd9\xd3\x6b\xce\x86\x87\xeb\xea\xdc\x69\x5d\x0f\xf0\x00\xba\x12\x15\x27\x10\x9a\xc2\xa3\x61\xa0\xda\xc3\xb0\xeb\xd5\x35\xf7\xed\x85\x56\x1c\x07\x1d\x55\xac\x26\xc3\xc7\xf5\xd4\x25\x06\x43\xfd\x81\x17\x11\x97\x51\xe2\x02\xd9\xeb\x69\xc4\x65\x13\x84\x42\x1b\xd1\x5d\x11\x94\xf7\x11\x68\xe6\xee\x60\x7c\x02\x48\xb4\x47\xef\x24\xfc\x15\x60\x75\x20\xc9\x42\x59\x9c\x66\x12\xef\x80\xda\xc4\xc3\x15\xa1\xaf\x1c\xe2\xe9\x4c\x12\xcf\x62\x63\x30\x89\xe9\xd7\x53\x9b\x60\x2c\x01\x7a\xe0\x10\xd4\xd0\x78\xfd\x45\xcd\x40\x34\xdb\x50\x6c\x09\xdd\x10\x50\xb1\x40\xc5\x58\x16\x4a\x02\x25\x93\x6c\x34\x79\x19\x27\x41\xf6\x55\x20\xbd\x2b\x51\x3a\x61\x0b\x8f\x00\xdb\x03\x74\xb8\x56\x90\xde\xd0\x37\x98\x17\xc0\x53\x66\xa0\x21\x89\x0e\x93\x66\x61\x01\xad\x28\xb0\xd0\x28\xd0\xcf\x4c\x10\x78\xf8\x64\x12\x6a\x3e\xf7\xa9\xb1\x60\xfb\xd6\x82\xda\x13\xf4\xd4\xba\x3e\x74\x24\xea\x4e\x3c\xe0\x77\x1d\xe1\xe6\x60\xdc\xf2\x66\x1e\x01\x6f\xcc\xf6\x9d\xeb\x29\xc5\xf3\x7e\x44\x27\xf6\xc2\x46\xa4\x79\x84\x34\x33\x1c\x47\x27\x42\x76\xca\x20\x16\x2c\xe3\xfe\x66\xcb\x8f\x71\x72\x9b\xd7\xd7\x36\x53\x27\xac\x8e\xa4\xe0\xd3\x48\xa6\x4c\x96\x82\x2b\xf1\x37\xc5\x3f\xcd\x86\x2e\xe3\x28\xf1\x1f\xf6\xf4\x78\x92\x37\xd1\x4c\xf4\xa5\xb0\xf7\xad\xc8\x91\x1c\xc9\xd1\x9c\xeb\x43\x4b\xa2\xee\x02\x38\xdb\x85\xb0\xa8\x04\xe6\x77\xc2\x16\x9a\xb9\x6f\x2c\xcc\xeb\x29\xb5\x85\x7f\x00\x46\xae\xd8\x28\x03\xe0\xe3\xf0\xeb\xf8\xcb\x3b\x84\x01\x91\x6a\xa3\x27\x1c\xd2\xa1\x06\x33\xfd\x52\xe7\x04\xcf\x5a\xde\x6c\x1a\x68\x07\x64\xa3\x6c\x9d\x51\xc0\x81\xc0\x33\xe9\x14\xcb\x0b\xb2\xc2\x6a\x94\xb6\x25\x1d\x9d\xc4\x90\x86\x31\x98\x73\x50\xb7\x76\x7f\x34\x05\x4c\x33\x71\x2d\x73\xa1\x19\xa5\xc7\xa4\x65\x6a\xf0\x84\xd3\xaf\x23\xab\xaa\x23\xff\x04\x29\x98\x0b\xab\xc1\x88\x6e\xb8\xe2\x93\x7d\x9b\xe8\xc0\x79\xe9\x86\x3b\xc1\xe7\x02\x89\x26\x17\x8e\x81\xce\xf0\x65\xb3\x17\x06\x8f\x17\x3c\x4a\x66\x5c\xcb\xb8\x1f\xf1\xf1\xd7\xb1\xb7\x10\x2a\x70\xb3\xed\x62\x1d\x79\xc0\xd8\x21\x88\xa4\x4d\xf5\x09\xd1\x81\xed\x3f\x60\x4c\xb2\xdb\x1e\xd6\x28\x99\x72\x25\x13\x10\x99\xe1\xa2\x66\xc3\x80\x62\x14\x00\xc0\x86\x95\x29\xe9\x03\x17\x30\xb4\x67\x6a\x36\x2c\x33\x80\x05\x54\xd6\x52\x56\x2b\x7a\x80\x0a\xd7\x0d\xd8\x01\x06\x2a\x1b\x31\xf7\x00\x3e\xed\x3a\x84\xdb\x6d\x87\xf0\xeb\x43\xd1\x95\x08\x7b\xa7\x01\xf6\x3f\x60\x92\xbb\x70\x36\xdb\x02\xaf\xac\xc2\x63\xb0\xf4\x30\x25\xb3\x39\x46\x2a\xac\xe1\xbb\xca\x35\xb3\xa3\x58\xb3\xdb\x4a\x35\xc1\xf2\xb3\x85\x4d\x8c\xc8\x20\xb6\x0b\xf4\x87\xee\x1d\x98\x92\x47\x10\x92\xb3\x23\x1b\xa5\xc4\x84\x45\x9a\x83\xfb\xc1\x24\x66\x63\x3f\xe0\x6a\xe0\x7e\x30\x25\x87\xa0\xb3\xaa\xc4\x60\x69\x6c\x17\x18\x31\x46\x0f\x98\x2e\x36\x80\xa8\x50\x72\x09\x2e\x31\x63\xae\x06\xe4\x0d\x30\x85\xcc\x42\x23\x1b\xcb\x5c\xad\x35\x12\xd9\x1a\x66\x1f\x00\xb5\x35\xd9\xc2\x32\xa9\x5a\xad\x79\x5c\xac\xd7\xa3\x58\x30\x06\xbc\x92\x04\x64\x7e\x63\x91\xd0\xb7\xda\xc3\x40\x47\x00\x63\x4c\xc3\xd5\x4c\x42\x59\x3d\x15\x12\x71\x1d\xe1\x48\x6e\x1a\xae\x84\x79\x9d\x8f\x25\xfc\x18\x4e\x9a\xbb\xa0\xa8\x8c\xdf\xb0\x07\xdc\x08\xb9\x36\x5d\x17\xa6\xab\xb4\x6f\xfd\x21\x15\xa5\xd2\x7a\xd4\x58\x2d\xa9\x6f\xb5\x2a\x98\x10\x35\x17\x8b\xe9\x12\xd3\x11\x24\x00\xc5\x6b\x2d\x34\x68\xa2\xbb\x31\xe0\xec\x4d\x75\xcd\x85\xac\x4d\xdb\xcb\x23\xd0\x73\x87\x58\x16\x9a\x55\x38\x76\x6b\x8e\x3c\x13\x60\x92\x0e\x53\x40\x76\x80\xaa\xd5\x0e\xf9\x6a\x70\xd5\x20\x54\xb7\x81\xfa\x35\x9d\x06\xb8\xa4\x44\xf7\xd0\x39\xdb\x06\x30\xeb\x18\x00\x66\xdd\xbe\x29\xc5\x5c\x98\x7c\xd7\xe8\x7e\xae\xe1\xe7\x9a\x0b\x55\x63\x88\x81\xc6\xf7\x5a\x31\x23\x8d\xd6\xaf\x11\xc0\xea\x2b\xd0\xd9\x01\xf2\x4c\xdf\x0a\x3c\x33\xfd\x8b\xc1\x33\xd3\xb7\x01\xcf\x4e\x17\x3c\x53\x7d\x1b\xf8\xcc\x3f\xdd\x3f\x15\xb3\x23\xad\xe0\x1d\x59\x13\x98\x1a\x20\xd8\xb6\x88\x55\xd2\xd1\x4a\x2c\x60\x5a\xdd\x89\xc6\x8e\xa8\x87\x5e\x32\x1a\x45\x55\x13\x1a\x66\x7a\xc4\x45\x79\x9f\xd1\x8c\x89\x24\x5c\xb8\x8e\xa8\x3e\x61\x47\xc6\x44\xdb\x6c\x35\xcd\x3f\xcd\xfc\x78\xac\x45\x0f\xad\xeb\xb1\x24\x6a\x44\x8c\xc0\x06\x34\x30\x20\x8d\xc4\x88\x2b\x54\x07\xf8\x38\x70\x89\x23\x51\x1b\x1e\x54\xa2\xde\x42\xb3\x61\x42\xa8\xa9\x09\x21\x9c\x26\x3e\xc5\xb0\x3a\x28\x6f\x33\x59\x61\x29\x6f\x11\x43\x72\x88\x21\x51\x43\xb2\x16\xf6\x64\x0b\x34\x21\x66\x64\x9a\xa4\x0f\x6c\xb2\x69\x4a\xe6\xad\x33\x42\x1d\x82\x41\x87\x24\x00\x99\xfa\x91\x39\xd1\xec\xeb\xa9\x66\x4a\xd4\xbe\x7d\x4a\x6c\x62\x08\x39\xb9\x29\x51\x73\xab\x29\x39\x0f\x23\xae\xe1\x0d\x40\x5f\x47\x34\xe9\x61\x47\x88\xe5\xd0\x0e\xc3\x6a\x32\xaf\x60\x59\x4d\xe6\x6d\x66\x5a\x59\xc1\xb4\x16\x4f\x34\xef\x63\xfb\xde\x82\x12\x6b\xdf\x20\xd6\x82\x3a\x13\x6a\x1e\x51\x73\x9f\x7a\x18\xc7\xc2\x25\xd6\xc4\x3b\xa2\x0e\x8a\x1f\xad\x82\x61\x3d\x42\x01\x4c\xf5\x6e\x1e\x51\xda\x7c\x37\x8e\xdc\xe2\x15\xfb\xed\x1b\x92\x51\x1a\xad\x49\xc6\xc2\xaa\xdf\x35\x43\x32\x26\x5a\x2b\x41\x33\x8e\xcc\xe6\x07\x9a\x31\x01\x4e\x0d\xb8\x02\x89\x1d\x50\x1b\xad\x11\x4d\x13\x8d\x8f\x91\x95\x80\x5d\x6b\x62\x36\x85\x0c\x03\x2d\x99\x29\xf0\x15\x9e\x69\x94\xa5\xa8\x8e\x76\xdb\x12\xe0\x40\x8c\xc3\xe5\x41\x0d\x80\x67\xcb\x72\x22\x07\xad\xa0\xf5\xb2\x3e\x51\x6c\xb3\x0d\x33\xae\xfd\xc3\x9b\x73\xc3\x61\x30\x25\x73\x41\xd9\xbe\x7d\x64\x4e\xdc\xeb\xa9\x2d\x51\xfb\xc8\x41\x1f\xa4\x7d\x3b\xd0\x44\x30\x19\x8d\x49\x68\x61\x5a\x2b\xf5\x99\x85\xc6\xa5\x02\xc0\xb2\xa0\x88\x39\xc3\x34\x4c\x45\x95\xbd\x89\x3e\xf4\x1a\x9b\xb8\x85\xd0\x62\xdd\xdb\xa1\x2b\xb9\x13\xf3\xc8\xde\xca\x4f\x1e\xe7\xed\x51\xd0\x97\xba\xe4\x2c\xa8\x71\xab\x30\xc8\xb8\xfd\x5c\x95\x27\xca\x2c\xce\x95\x25\x84\x41\x56\x64\x49\x42\xd2\x00\xe9\x13\x40\xed\x0e\x3d\xc2\xd3\x63\x4f\x28\x3b\x42\x7d\xec\x76\x13\xf5\xb5\xcc\x0d\xfe\x00\xf0\x42\xf5\x03\x34\x24\xfe\x62\x08\x63\xdd\x02\x61\xf0\xbc\x33\xdf\x42\xc8\x60\x95\x26\x7a\x1a\x45\xf7\xcf\x22\xa9\xa0\x0c\x29\x46\x2a\xb5\x89\x6d\xb3\x08\xc8\x44\x4b\xe8\xb6\xd0\x0e\x17\xcd\x27\x0c\xf7\x80\x02\xdd\x68\x4a\x40\xbf\x0b\xcb\x67\xca\xa2\xca\x7b\xe7\xa0\xfc\x7c\xd3\x92\x09\x1b\xae\x07\x05\x07\x3a\xf0\x7c\x18\x4f\x45\x33\xe1\x64\x1a\x12\x10\x46\xd4\x3d\xb2\xf7\x8d\xeb\xa9\x21\x39\x13\xca\x4a\x2b\x9c\x4d\xa3\x89\xfc\x07\x0d\xc0\x83\xd6\x2d\xf6\x01\x1c\xaf\x7d\xdc\x40\x6c\xa1\x39\x13\x8b\xd8\x11\x31\x25\x36\x71\x8e\xec\x09\x10\xfa\x9b\xcf\x51\x12\x8d\x79\xfa\x08\x40\xb5\x2e\x99\xb5\x8d\x15\x25\x9e\x47\x3c\x4d\xf8\x8c\xa0\x3c\xa6\x6b\x8a\x63\x77\x4d\x71\xdc\x15\x53\x1c\x37\xda\x26\xea\x5c\x39\x03\x5f\x33\x6c\x06\xd3\x25\xbb\xec\xcf\xbd\x0e\x12\xb5\x1a\x6c\xdf\x3c\x72\x51\xb0\xb2\x9e\xf1\x2a\x06\x7b\xe1\xe7\xfc\xf2\xeb\x98\x2e\x30\x80\x1b\x9e\x44\x3d\xa2\xbb\xaf\x99\x0e\x24\xb7\x49\x0c\x11\x28\x99\x09\x9b\x0f\x46\x74\x13\xbd\xff\x4d\x74\xd5\xd0\x81\x8b\xd7\x6d\xc9\x20\xb6\xe5\x6a\x0e\xb1\x0c\x57\x72\x80\x73\x9d\x30\x42\x29\x0d\x84\x4e\x0f\x63\xec\x51\xa2\x3b\x18\x98\x19\x95\x5f\xae\x0e\xec\xa2\x6d\x31\xe2\x79\x22\x66\x33\x9a\x83\x00\xc9\xaa\x33\x00\xb0\x36\x2b\x7e\x52\x62\x3a\x18\x7d\x8b\xd8\xcc\x24\xb6\x27\x32\xd1\xc9\x01\x73\x75\x61\x6d\x8d\x6e\x07\x3a\x06\xb5\x43\xaf\x07\xc3\x34\x01\x4a\x62\xac\x10\x42\x19\x71\x25\x93\x30\xdb\x22\x9e\x61\x4b\x16\xc6\xb1\xd3\xa1\xa8\x06\x64\x82\x6d\x69\xc4\xd6\x19\xb1\xad\x7d\x8b\x38\xa6\xed\x8b\xb7\x52\xfd\x83\x99\x1a\xb1\xad\x80\xe8\xd8\x59\x6a\x43\x5d\x0c\xbd\x6f\x5d\x62\x99\x14\x66\xc3\x71\xf6\x0d\x62\x9b\xcc\x37\x4d\x42\x6d\x4f\x2a\xfe\x14\xdc\xb7\x65\x53\x40\xa2\xcc\x0e\x34\x98\x07\x8c\x29\xe6\xa1\xe5\x1a\xd1\x31\x84\x9a\x81\xbf\x26\x40\xd9\xd9\xb8\x67\x28\xee\x1a\xa2\xeb\xa6\x86\x4e\x1d\x50\x06\xe7\x64\x43\x1c\xa4\x42\xe5\xef\x02\x7d\x68\x10\xc3\x35\xf7\x31\x3c\x9f\x43\x27\x1e\x24\x1e\xc0\xd3\x93\x5c\xe2\x60\xd0\x34\x8a\xd1\xf7\x5c\xc0\x08\x0c\xf1\x02\x33\x35\x7c\x8a\x14\xcc\xa4\xe2\x29\xc1\x5a\xa1\x28\x5b\xdf\x0c\x93\x2e\xc2\xf3\xfc\xe1\x21\x92\x45\x5c\xab\x90\x76\x04\x84\x79\xc4\x72\xd1\xe2\x0c\x4e\x24\x25\x3a\x1a\x9d\x58\x96\xb1\xdf\x11\x74\x2f\xd8\xc4\x3b\xf2\x26\x6c\x21\x94\x58\x6d\xa1\x36\x6a\x85\x29\x9a\x93\x30\x53\x12\xcf\x4a\x42\x83\x1a\x0b\xcb\x32\x5e\x53\x97\x38\x9e\x64\xa1\xb1\x1b\xf5\x30\x5a\x2e\x46\x63\x31\x30\xae\x56\x20\xb8\x3a\x1d\x85\x1a\x18\xa3\xc2\xd3\x6c\x8c\x16\xe8\xbe\xa6\x3a\xa4\x19\x84\x19\xae\xe4\x22\xef\x27\xd9\x12\xaa\xde\x80\x84\x71\x3d\x4a\x18\x45\xd3\x29\xcb\xc5\xc1\x19\x28\xca\xc1\x00\x26\x28\xe3\x09\x08\x33\x34\xb4\x62\x31\x3c\x1b\x43\xb0\x59\x3a\x9a\xc3\xa0\x9b\x91\x65\x3b\x84\xa1\x90\xd5\x42\xd2\x40\xf7\x4c\xcd\x20\x8c\xda\x70\x62\x2c\x57\x23\xd4\xb5\x88\xe1\x68\xc4\x60\x0e\x71\x6c\xa8\xc9\xc0\x00\x78\xb6\x11\x69\x68\x4a\x66\x04\x58\x8b\x06\x07\x40\xc2\x6a\x0a\xd9\x15\x56\x03\xac\xa7\xe5\x5c\x1f\x3a\x18\x4a\x97\xe8\xae\x17\x10\xaa\xbb\xd0\x07\xc2\x70\xdb\xeb\x3a\x85\x37\x09\x7b\x44\x6c\xac\x9d\xd9\xf0\x6e\x9b\x2e\xec\x77\xcf\x92\x1a\x3d\x12\xad\x6a\xc4\xd0\xa9\x6f\x13\x5d\x07\x66\x06\x9e\xc5\xb1\x32\xd1\xff\x82\xda\xc6\x6b\x8f\x38\xb8\x69\xa9\x6b\xe0\xe6\x86\xf3\x0e\x90\xa0\xec\xc9\x7a\xa5\x6c\x7d\x6a\xa8\x44\xcd\x7d\x63\x21\xd8\x07\xd3\x81\x55\x2b\x19\x08\x7b\xa1\xb9\xd7\x53\x26\xb9\x0b\xcd\x9d\xb8\x75\x11\x4d\x94\x41\x9d\x9b\xb6\xe5\xb1\x78\x0c\xbc\xc1\x17\x9e\x0c\x73\x42\x17\xf6\x86\x40\xbb\x0b\xcd\x9e\xd0\x85\x66\x7e\x0b\xe7\x06\xe3\x78\xeb\xb0\xba\xf6\x44\xb3\x17\xb6\xb8\xbd\xc1\x11\x26\xd4\x18\x21\x0d\xd1\xfd\x82\x61\x1a\xa0\x6a\x73\x61\xef\x5b\x50\xdc\xbe\x9e\x5a\xc4\xb0\x6c\x21\x6f\x7d\x3a\x76\xbb\x1e\xbb\xfa\x48\xe4\xda\x59\xea\xc7\xc1\xe4\xa1\x63\x37\x30\xd7\x96\x3c\x62\x7b\x9e\x0f\x9b\xd1\x96\xc4\xb3\x14\x62\x5b\xa6\x21\x9e\x81\x5e\xfa\x63\x3a\x22\x41\x6a\x64\x12\xd7\x40\x66\x0d\x7f\x3b\xba\x23\x35\x4a\x48\xb0\x11\x81\xe4\x80\x69\x6a\x7c\x23\x7e\x5f\x1f\xba\x04\x70\xb6\x47\x3c\xd7\x5c\xd3\x03\xd6\xec\x81\x55\xf5\x00\x4f\x6b\x91\xc9\xa0\x6f\x6b\x7a\xc0\x44\x0f\x80\x0b\x2e\xd3\x5b\x3d\x98\xea\x1a\x9a\xec\x5a\x01\x71\x4d\xef\xcb\x2a\x81\x9e\xe3\xbe\x82\x67\xdd\xf3\x2d\x3a\x2e\x62\x06\xa3\xca\x87\x02\x4c\x11\xe1\xc8\xf1\x59\x40\x11\xb4\x55\x86\x27\x7b\xb5\x92\x2b\x51\x61\x9b\x69\x99\x0b\x62\xb8\x48\x66\x31\xe0\x69\x3d\x8d\x30\x74\xcf\x63\xb6\x46\x5c\x80\x6e\x8e\x63\x6a\xc4\xa2\x26\xb1\xd0\xec\x9c\xea\x36\x71\x5c\xf4\xd1\x75\x4c\x82\xc4\x8e\x6e\x3b\xf0\x35\x7a\xd3\x62\xa0\x65\xd1\x28\xb1\xdc\x23\x87\x38\xae\x81\xad\x1b\x92\x78\x8a\xd6\x5d\x02\x30\x05\xcd\xde\x59\xf1\x14\x19\x18\xdb\xca\xa1\x3e\x13\x56\xe8\xf8\x2c\xe1\x9e\x30\x88\x66\x94\x2d\x5c\x62\x1a\xe6\x6b\x0c\xfe\x8c\x5e\xa5\xb6\x23\xd9\x12\x75\x88\x89\x61\x43\x20\xb7\xbf\x4d\xa8\x12\xeb\xee\x64\x61\x7f\xc5\x84\xc1\x9c\xdb\x2e\x03\x42\x17\xcd\x51\x5d\x5b\xbc\x53\xe2\x98\x1e\xa1\xd4\x86\xa3\xee\x10\x1b\x9d\x75\x99\x4d\x1c\xcb\x03\x82\xd7\x24\x06\xa3\x1a\x5a\xd5\x02\x20\x60\xa8\x56\x64\xba\x57\xfe\x84\x7d\xac\xdb\x26\xc6\xb5\x76\x34\x62\x39\x6e\xe1\xa6\x4d\x89\x8d\xfb\x42\x47\x11\x8b\xce\xbc\x62\x8f\x30\x62\x61\x10\x5f\x5b\x77\x30\xc4\xbf\x31\xd1\xd0\x3f\x83\x38\xae\x89\x90\x13\x2a\xa5\x54\x74\xb1\xf8\xcd\x08\x63\x9b\xe5\x48\x00\x41\x82\x64\x3a\x0d\x1f\x38\x3e\x0a\x4a\x6f\x3d\x5c\x6b\x24\xec\xdd\x4a\xc7\x8a\xb6\x7a\x18\x72\xff\x55\x27\x4f\xa2\x4c\xf2\x88\x81\xfb\xbd\x9d\x81\x1f\x89\x67\xdf\x47\xd8\xd4\xf5\xd4\x24\x9e\x6d\xa0\x8f\xb6\xf9\x9a\xda\x40\xee\x4b\x80\xc9\x6d\xe4\xdc\x8a\x70\x75\x4e\x86\x2a\x3e\x01\xec\x6d\x0d\x3f\x01\xd4\x6a\x39\xfb\xc6\x02\x77\xca\xc4\x24\xba\xe1\xbc\x86\x5d\x60\x4b\xd4\x22\xb6\x09\x80\x10\x63\x06\xb2\xc2\x0d\x01\x7f\x65\x58\x8f\x86\xf5\x48\xa2\x69\x51\x0f\xde\xa6\x82\x35\x69\x58\xd5\x56\x6b\x36\x9b\xc3\xe4\x8a\x7b\x9a\x1f\x38\x1a\x8a\xe1\x01\xd5\xa0\xa3\x18\xd0\x13\xe1\x9d\x4d\x53\x23\xb6\x2d\x7e\xc0\x03\xf0\x9e\xe3\x96\x49\x52\x95\x4e\x1c\x61\x08\x68\x9a\x18\xdd\xa1\xcc\x13\x8e\x30\x5a\x99\x56\x7f\x74\x3d\x15\x3f\x75\x62\xd9\x28\x95\xf4\x58\x4f\x29\x0d\xab\x5d\xdb\x0d\x7a\x7b\x3f\x44\x90\x9a\xb2\x3d\xe2\xd9\x5a\x11\xb9\xdb\x40\xc4\xad\xdb\x2e\x1a\xc9\x17\xff\x7c\x46\x0c\x0f\x36\x9c\xe1\x55\xfe\xcf\x84\xe1\x75\x48\xe6\xc2\x21\x2e\x82\x5b\xc3\xc3\x02\x05\x7c\x11\x33\x86\xa0\xa7\x9d\x41\x09\x5a\xac\xda\xe6\x11\x4c\x15\x56\x8d\x40\xce\x70\xed\x46\x09\x06\xa0\xe3\x7a\xea\x10\x11\x1b\x71\xf3\xb4\xef\x30\xde\x5b\x27\x9e\x69\x06\x90\x41\x47\x18\x51\x1a\x40\x98\x87\x11\x20\x10\x1d\x39\x48\xaa\x51\xbc\x16\xc3\x2c\x23\x6f\x38\x3a\x30\xc8\x96\x81\x8e\x13\x18\x22\x02\xb2\xb0\xd8\x04\x66\xe9\x48\xd8\x30\x48\x8d\x7f\x47\x0e\x71\x27\x94\xb0\x80\x18\xcc\x04\x56\x9a\x58\x8e\x4d\xa8\x81\x47\x99\x18\x0e\x23\x0c\x83\x46\x10\x03\x89\x44\x4c\x71\x19\xda\x1d\x19\x36\x4e\x28\xca\x2f\x3c\x56\x4f\x98\x58\x0b\x69\xed\x64\x6f\x75\xdc\x52\x3e\x4b\xb2\x30\x4f\xd2\xab\x87\xd6\x4a\x50\xef\xc8\x6c\xc6\x76\xde\xb7\x5f\x03\x9f\x65\x62\x5c\x68\x73\x41\xad\x76\x54\xe8\x85\x11\x21\x83\x25\xb1\x85\x66\x4c\x9c\x66\x8c\xe8\xeb\x43\x4f\xb2\xf6\x9d\x05\x9b\xb0\x23\xeb\xfa\xd0\x91\xdc\x09\x5b\xb0\x7d\xe7\xc8\x05\x5a\xdd\x10\x2f\x48\xb9\x53\x2a\x59\xfb\xf6\xc2\x00\xd6\x04\x63\x71\x03\x45\x6f\x5c\x1f\xda\x92\x39\xa1\x6c\x41\xe9\xbe\x7d\xb4\x71\x1e\x2f\xe6\xe1\xfd\x47\x9d\xd8\xde\x72\x77\xbd\xb2\x46\xcc\x27\xb1\x88\x25\x22\x9a\x4e\x9c\x48\x23\x9e\x63\xc1\xbf\x03\x4a\xa5\x4a\x35\x83\xb6\xbb\xae\x44\x81\x89\x2d\x23\x48\xeb\x9a\xd1\x79\xb3\xab\x37\x6a\x68\x56\x40\xa8\x23\x1c\x42\x18\xf1\x8a\x10\x2e\xcc\x22\x86\x01\xff\x39\xa6\x43\xd0\x02\x08\xd5\x6d\xbe\x41\x28\x33\x25\xf1\xac\x40\x09\xe4\xbc\x82\x34\x43\x12\xcf\x82\x48\xa1\x12\xa5\x81\x46\x28\xd0\x0f\x3a\x10\x01\x4c\x23\x1e\x2a\xe8\x84\x7b\x03\x46\x7c\x87\x7f\x8e\x69\x6b\x04\x2d\x89\x20\xd5\x81\x61\x12\x6a\x3b\xc4\x83\x4f\x4d\x74\x4b\x2a\x32\x0c\xf1\x89\x41\x2c\xd7\xc0\x84\xa2\x2e\xd4\xf6\xa1\xdf\x10\xd2\x82\xc8\x84\xa1\xf5\x12\x74\x5d\x98\xfd\x53\xbc\xa1\xc8\x84\x7f\xa8\x3a\x41\xf8\xe1\x88\x0c\x51\x08\x6b\xf2\x88\xc9\x2c\x54\xb1\x53\xa2\x5b\x5a\x23\x1b\xb8\x57\x1d\x03\x87\x21\xe9\x86\xfe\x01\x4e\x11\x04\x56\x0f\xb0\xa3\xa5\xdb\x86\x2e\x42\xc6\x78\x00\x4a\xa0\x62\xac\xe5\x35\x35\x21\x09\x58\x2d\x53\x44\x33\x45\xad\xb0\x88\x21\x6b\x05\xc8\xb0\x01\xef\x05\x20\x40\xc7\x5a\xac\xa2\xdf\x5a\xd1\xbe\x45\x3c\x34\xc0\x31\x44\x9c\x36\xe1\x7b\x07\xd4\xb8\x23\xe9\x18\x9a\xde\x5e\xb0\x7d\xf7\xc8\x9e\x18\xd7\x53\x5b\x83\xed\x04\xb3\x68\x61\xd7\xc4\x64\x16\x8b\x2b\xe6\x10\x27\x13\x66\x1b\xef\x1d\xc1\x65\x44\x88\x05\x85\x99\xb0\x46\x10\x89\x62\x2b\x58\x30\x5c\xbb\xda\x1f\xd4\x86\x8a\x3d\x17\xc3\xfd\x10\xaf\x8a\xf3\x24\xb6\x42\x73\x93\x20\x8b\x8f\x7b\x07\x00\x28\xad\x39\x1e\xb1\xa8\x41\xbd\x11\x80\x57\x76\x4c\xb7\xda\x22\x9b\x0e\xec\x84\xfb\x51\x3e\xf9\x1a\x27\xd6\x13\xd1\x69\x23\xe4\x3a\xd0\x6b\x44\xb3\x0b\xbd\x94\x85\xc1\x19\x51\xb1\x06\xa5\x2c\x20\xe1\xe9\x3e\x5b\xb0\x89\x15\x31\x62\x69\xe6\x16\x06\xa6\x13\x1e\xcd\xfe\x44\x51\x43\xe1\x10\x34\x2f\x52\x64\x44\x77\x34\x87\x38\x16\x80\x29\xe2\x31\xf4\xe2\xc7\x10\x53\x9e\x44\xd1\x8f\x16\xad\x1d\x8a\x7b\x42\x49\x19\xaf\xd9\x44\x57\x28\x74\x42\x04\x72\x1a\x6f\xfd\xc0\xf0\xbe\x76\x20\xc4\x27\xe8\x61\x4d\x5c\xbb\x0c\x46\x28\xb5\x75\x2d\x59\xe5\x1d\xbe\xef\x06\xc0\x50\x32\x64\x08\x3d\xcd\x94\x4c\xcd\xcc\x8a\x9b\x22\x4c\xc9\x44\x99\x91\x0b\x15\x02\xd1\xec\x6a\x42\x3e\xbf\x79\xbf\xb5\xd6\xed\x31\xc8\xf9\x28\x05\x58\xdf\xb8\x3d\x80\x6a\xd4\xbe\x27\x27\x1c\x5a\x3a\xe1\x78\x65\xf0\x37\xaf\x19\xfc\xad\x1b\xe8\x14\xc5\x0b\x66\x20\x66\x5d\xd7\xcc\x6a\xe6\x27\xac\x1d\x8e\x3b\x2b\x63\x79\x07\x80\xe7\x0d\xbc\x02\x49\x33\x24\x0b\xcb\x31\x8c\x1a\x87\x07\xcc\xd0\xd0\xee\x83\x30\x00\x15\x50\x15\x06\x62\xdb\x04\x11\xc2\x0c\x48\xa0\xaf\x18\x3b\x4e\x97\xf4\x85\x39\x31\x8f\xf4\x7d\xfd\x7a\x6a\x49\x6c\x61\xec\xb3\x05\x9d\x98\x47\xe8\x9d\xc1\x30\xc1\xc4\x04\x73\xbf\x1d\x95\x39\x8c\xcf\x93\x47\x75\xe8\x03\x8b\x58\x22\x52\x98\x0e\x24\x28\xa0\x44\xf8\x9d\x69\xe5\x8b\x86\xef\xef\x85\xa5\xa6\x59\x84\xe5\xb7\x31\xb3\x3a\xfa\xe8\xf7\x4f\x75\xa2\x53\x21\xd6\x42\x6a\xc6\xaa\x2e\xb5\x32\x4d\x43\x23\x9e\x0b\x50\x1e\x65\x13\x0c\xc8\x6e\x20\xca\x99\x07\xe9\x18\xa0\xcd\x98\x88\xf8\x00\x01\xfa\xe0\x12\x9d\x01\x7d\xef\x5a\x84\xba\x16\x7e\x0b\x45\x7c\x00\x0f\x88\xb3\x0b\x91\x99\xa8\x1b\xb2\x27\x18\x9a\xe0\x08\xf8\xe3\x80\xe8\x40\x84\xbb\x36\x0a\x82\x1d\x6a\x16\x65\x50\xfa\x47\x98\x6b\x11\xbb\x4a\x81\x76\x45\xb3\xe8\xf9\x8b\x77\x55\x01\xe1\x61\xb9\x50\xa9\xa8\xbd\xec\xb2\xe8\xae\x5d\x8e\xc6\xde\x07\x80\x66\x1c\x51\xb6\x80\x71\x5f\xc3\x39\x74\x88\x03\x9d\x34\x4c\xf4\x52\x31\xad\x52\xb9\x68\x8a\xfb\x64\x4c\xe1\x3b\xef\x98\x06\xa4\x48\x84\x61\x5c\x00\xcb\xc5\xb9\xc0\x72\x19\x66\x52\x20\x59\x24\x62\x06\x84\x59\x0e\x94\x22\x26\xb4\x8b\xc1\x29\x28\xf3\x88\x03\x54\x94\x29\x51\x98\x0f\x03\x4d\x44\x8d\xd2\x0c\x0d\x3e\x63\x2e\x50\x22\xc8\x55\x41\x57\xa9\xe5\x60\x24\x0b\xb6\x39\x8c\x70\x73\x77\x3e\x0a\xd0\x76\x4f\x1b\x54\x17\xd4\x5e\x50\x7c\xa3\x6b\x6e\x11\x97\xc0\x66\x6e\xf1\xdb\x25\x94\x8a\xe8\x7f\x50\xc2\x20\xb6\xe5\x48\x55\x4e\xf5\x2c\xbe\x17\x6f\xc0\x15\x96\x39\x45\x2d\x18\x75\x14\xb5\xde\xe8\x25\xc4\x3c\xad\xca\x65\x1e\xec\x13\xab\x3c\x2d\x90\xe2\xfe\xa5\x0f\x8b\xfb\x6d\x1f\x96\x8f\xfc\x2b\x19\x68\x48\xd4\x5d\x18\xa8\x4b\xb3\xbd\x03\xea\x48\xe5\xb5\x55\xe2\x29\x22\xcf\x18\x44\xb7\x98\x66\x1c\x60\x69\xbc\xd6\xcc\x3e\x70\x25\xd4\xe8\xeb\x86\x64\x49\xa6\xe4\x46\x80\xce\x31\x6c\xa9\x66\x12\x86\x61\xaa\x5d\xc3\x3b\xa0\x84\x1a\x4c\xf2\x08\x75\xdd\x88\x12\x47\x67\x9a\x4d\x0c\xcb\x94\xf0\xa9\x61\x8a\x64\x12\x1b\x6f\x4c\xb5\x8a\x77\x91\x07\x4f\xc4\xd4\xfa\x46\xc3\xd2\xc8\xbf\xe2\xe9\xbd\xfb\xbf\xee\x06\x39\x88\x8b\x77\x27\x13\xdb\x00\x46\x99\xea\x28\xa8\x46\x76\xc8\x23\x3a\x2c\x35\x86\x0e\x45\x3d\x01\xfc\x9d\x68\x84\x46\x78\xcd\x17\xd1\x75\xc7\xa7\xc4\x41\xea\xa5\x54\x70\x10\x83\x42\x8e\x65\x42\x19\x9b\x6a\x18\xf5\x80\xda\x06\xda\xf7\x42\xad\xba\xab\x61\xb5\x06\x71\x0d\x71\x89\xb9\xa3\xd9\xc4\xc6\x88\xa8\x9e\x2e\x82\xb9\xa3\x0c\xcb\x60\xae\x4f\x4c\x06\x27\xa4\xd4\x7a\x10\xea\x9a\x84\x9a\x1e\x31\x18\xfe\x2b\x93\x75\xd3\x24\xcc\xb2\xe1\xc8\xf8\xc4\x70\x89\x51\xde\x75\x07\x6c\x21\xa1\xd4\x09\x8a\x78\x02\xae\xf8\x0b\xcc\x29\x35\x88\xce\xec\xff\x9f\xbd\x7f\xeb\x8d\x2b\xc9\xd5\x84\xe1\xbf\x12\xa8\xb9\x99\xb9\x08\x7e\x41\x06\xe3\x04\xec\xde\x80\x5b\x5d\xfd\xe9\x42\xc6\x7b\xd1\x18\xdd\xbe\xc8\xca\x52\x57\x1a\x9d\xb2\x6b\x24\x3b\x7b\xb7\x7e\xfd\x0b\x3e\x8c\xb5\x32\x75\xb2\x54\xb5\xcb\x63\xef\x0d\xc3\xce\xa5\x95\xb9\x0e\x71\x22\x19\x64\x04\xf9\x70\x6f\x8d\xb0\xcf\xd6\x7f\x15\xd8\xa3\x94\x72\xa7\x54\x2b\xa5\x52\x37\xa4\xbd\x1f\x73\xdf\x06\x4a\xcd\x4c\x5b\xbc\x12\xfb\x3f\x29\x95\x19\x32\xd4\x70\xce\x62\xd7\x47\x18\x54\x1d\xea\x25\x21\xc1\x46\xb5\xd3\x62\x05\xfb\x13\xe2\x0f\x65\xf4\xa2\xf5\x6d\x59\x36\x43\x28\xb3\x3b\x25\x52\x12\xeb\xb7\xd4\xb7\x94\xec\xc4\x77\x87\x4d\x38\x7a\xf7\xe7\xfd\x40\x77\xab\x75\xa5\x35\xa0\x4c\xdc\x04\x3c\xc6\xc3\x31\x5d\x93\x58\x1b\xea\xb0\xcf\x52\x82\xd9\xc9\xc4\x5c\xac\x11\x1d\x28\x0a\x84\xb0\x52\x74\x81\x3d\x83\x6a\xcd\x0b\x40\x5e\x90\x6c\x55\xb2\x2b\xba\xc1\x32\x5d\x6e\xb2\xf6\x88\xc9\x1f\x2e\x36\x64\xd9\x3e\xeb\xb0\x70\x9e\x3b\xb6\xea\xf9\x35\x97\xdf\xf1\x33\xf6\xa5\xf0\x6e\xe6\xb8\x96\xb2\x3c\x85\x94\x72\x5e\xb7\xb8\xd4\x6d\x3e\x09\xba\xd0\x02\xb0\xda\x85\x2e\xec\x76\x4e\x78\x25\xe3\xc9\xb6\xbe\x0d\x8f\xe1\x2b\x30\x0f\xb4\x61\x2f\xa6\x1b\x3f\x9b\x48\xcc\xc4\xcd\xe6\x17\x87\x79\xb5\xe3\x42\xc8\xc2\xc4\xf2\xbc\x1f\xc3\xef\x63\x35\x64\xd3\xe9\xc0\x63\x49\x03\x33\xd2\xc6\xcc\x38\xa1\x25\x44\x88\x4a\xc6\xae\xdb\x0e\xce\x51\xe0\xc8\xea\x44\x10\x69\xe9\x27\xb1\xfe\x10\x33\xf2\x00\xa0\x54\xed\x65\xa5\x4e\x5e\x53\xa3\x82\xb2\x91\x36\x7a\xc0\xc1\xdf\x6b\x3c\xa6\xe0\xb1\x01\x1e\xc3\xbe\x52\x36\x0e\xcb\xf6\xb9\xcf\x61\xdd\x97\x31\xee\xf3\x57\x33\xfe\xda\x3a\x4d\x28\x83\x46\xda\x98\x1c\x56\x1f\x30\x58\x5b\x18\xcc\xb8\x64\xb2\x47\x99\x9f\xe6\x9f\x7b\xec\x36\x26\xbb\x35\x4a\xe2\xcc\xa1\xc3\x4b\x01\xb7\xad\x7c\x5a\xb6\xce\x5f\xf5\x84\xbd\xea\xca\x5e\xd5\xb9\x2b\x3b\x77\x89\x93\x71\xdd\x50\x49\xd5\x3e\x2b\xf5\x67\x74\xfc\x9e\x52\xce\x08\xa5\xc6\x5e\xb1\x6f\xe7\xfa\x0d\x20\x97\xfa\x90\xed\xf4\x31\xdb\xc9\xca\x76\xfd\x11\xdb\xb5\x0d\xa9\xe9\x09\xac\xcf\xb2\xdd\x73\x5c\xb7\xb0\x83\x9c\x32\x5d\x05\x00\xf2\x03\xa6\xa3\x8c\x44\xd9\xfc\x98\xe7\x7c\xd1\xea\x59\x9e\x93\xcf\xf2\xdc\xd3\x4c\xc7\x33\x45\xf0\x3d\xa6\x6b\x4f\x31\x5d\x7b\xc8\x74\xfd\x84\xe9\xc6\x91\xe9\xe0\x5d\xa3\x55\x8e\xb3\x47\x23\xfe\xcc\x3e\xe7\xef\x61\xba\x84\xbd\xc3\xa4\x65\xbb\x34\x08\x6d\xcc\x93\x61\x52\x41\x8d\xcb\x1b\x32\x99\xb2\x42\x98\x78\xa2\x4c\x93\x34\xbe\x91\x32\xb9\x43\x7c\x67\x2c\x4d\xc8\x24\xc8\x45\x9c\x38\xaa\x33\xb1\xfd\x50\x35\x76\xea\x25\x23\xc3\x78\x1c\x94\x73\x0f\x85\x58\x79\x63\x4a\xd5\xaa\x58\x2d\xec\x56\x1a\x65\xfb\x7f\x8f\xdd\x5a\x3e\x65\xb7\x02\xe2\x30\x15\xd6\xd8\x4d\x74\xb2\xd9\x14\xf7\x93\xd9\xc6\xc2\x25\x75\x99\xcd\xd4\xd9\xcb\xf8\xc8\xd8\xab\x4e\xee\x5a\xd8\x4b\x9d\xbd\xea\xa6\x68\x31\x05\x91\xc3\x7a\xe2\xbd\x30\x90\x68\x4a\xa9\x48\x9f\x35\x31\x4e\x96\xf9\x37\xb3\x4f\x5e\xda\xc5\x3e\xaf\x9e\xbe\xea\xe4\xa3\x85\x91\x0a\x71\x7e\xc4\x47\xb2\xb0\xd1\xd8\xc0\x4f\x47\xeb\x03\x36\x12\x79\x34\x7b\x8d\x85\x8f\xe4\xf9\xe9\xab\xd8\x18\x14\xfb\xac\x9c\x64\xea\x6c\x85\x6a\xbd\xaa\xd7\x47\x4e\xaa\x94\x6b\xb3\xcf\x3d\x4e\xea\xfc\x14\x27\xe9\xca\x49\x65\xe5\xa4\x3c\x39\x49\xe6\x93\x26\x72\x4b\x03\x38\xf8\x3d\x3e\xc2\x8e\xc6\xe4\xa3\xbe\xf0\x91\xac\x6c\x54\xf7\x71\x60\x97\x43\xa9\x7c\xc6\xed\x75\xd1\x2b\xaf\x36\x3f\x7f\xe5\xe0\x04\x00\x0a\xa4\xa6\xfb\x4c\x35\x21\x12\xb6\xd5\x48\xa3\x20\xf9\xb5\x09\x80\x0e\x0c\xfc\x6a\x5f\x87\x46\xca\x9e\x8e\xbb\x12\x57\x47\xbc\x00\x46\x3d\x60\xe3\x79\x64\xbb\xec\x0f\x05\x3c\x04\x24\x22\x25\xbe\x58\xcb\x79\x8d\x27\x70\x10\x4f\xfe\xd0\x90\xd9\xc1\x13\x3b\xb8\x1d\xbc\x8b\xba\x4d\x58\x96\xb0\x2a\x48\xed\x4b\xd6\x30\x3d\x98\x65\x00\xe3\x79\x9b\xc2\x09\x3c\xd3\x6a\x50\x1f\x74\xeb\xcf\xa5\xc0\xa6\xfc\xfb\xc3\x91\x75\x17\x1d\xdc\x1a\x96\x39\x66\x58\xb7\xcc\x17\xf8\xa6\x9d\x6e\x53\xc4\xa3\xfe\x54\xc4\x53\x91\xf5\x80\x34\xf5\x7a\xa6\xf8\x55\xa2\x84\x79\x66\x15\xd5\xb3\x05\x0e\xea\x08\x0a\x15\xe4\xf0\xf2\x6a\xdf\xfe\x6a\x73\xf3\xfe\x0b\x81\xaa\x69\x1a\xa1\x98\xcc\xda\x77\x1a\x5c\x90\x5d\x1d\x00\x72\x24\xc8\x44\x5c\xa9\x76\xb6\xbf\x70\xf6\x06\x32\xa6\x9a\xfe\x22\x5c\x69\x78\xe6\xe0\x79\x69\x1f\x33\xfc\xbd\x99\x72\xe7\x43\xa6\x56\xdb\xd6\x58\xde\xb5\x1a\x92\x36\xc0\x30\x66\x58\x3b\xa6\xa4\xb1\x9a\x66\xa5\xea\x9b\x63\x99\x7a\xe9\x91\x72\x6b\x48\xd7\x4d\xbd\x14\x2a\x49\x00\x3a\x4e\xd5\x5d\x05\x5b\xa6\x5c\x8d\xfa\xb4\x0a\x95\xd6\x63\xa6\x51\x33\xce\x98\x7c\x1d\xb5\xc3\xb9\x27\xe3\x8a\xc0\xa5\x27\x62\xe7\xdb\x66\x00\x87\x77\x8b\x8e\x69\x9a\xcd\x7a\xef\x46\xbf\x8c\x34\x04\x91\x8a\x59\xf6\x25\xc1\x24\x47\x05\xfa\x86\xaa\xd9\x57\xbc\xa8\x62\xc4\xd8\xc3\xe9\x05\x80\x91\xa2\x7b\x9f\xcc\x87\x96\x0b\x4f\xdf\x47\xd8\xe7\xe9\x54\x04\x8e\xcc\x88\x77\xf5\x6d\x77\x81\x6f\x53\xae\x1b\xd3\x4d\xe1\x16\x29\x8b\x23\x8c\x89\xbc\xc0\x34\x58\x66\x36\xfb\xa3\xce\x6d\xb3\x5c\x1e\xd4\x39\xef\x6c\x26\xdf\xc2\x6a\xd1\xa9\x29\x75\x97\xc8\x4d\xdd\xb0\x28\x36\x39\x10\x9b\x2c\x6d\x8d\x78\xf8\x25\x2e\x15\xf0\x93\xd0\x2a\xa4\x91\x8e\x46\xc6\x94\x54\xa5\x53\xc9\x99\x86\x1d\x2f\x0a\x80\xef\x24\x59\xf5\xb5\x62\xb1\xc0\x04\xb2\x20\x31\x82\xf5\x59\x2b\xd8\xbd\xcc\xd3\x25\x34\x29\x7e\x61\xca\x0d\x67\xfb\x48\x0a\x27\xff\xde\xb6\x3e\x21\x9a\x15\x1d\x49\x6a\xa5\x91\x7b\xa4\xce\x42\x6c\x12\x57\x2a\xbc\xf1\xa9\x80\xc6\x5a\xa4\x9e\xac\x53\x3c\x91\xb6\x1c\x65\x78\x8b\xa4\xf0\x79\x63\xec\x6f\x2c\x53\x1b\x07\xb3\x1f\x23\xd3\x68\x75\x0b\x09\xcc\xc4\x2d\x53\x11\x78\x64\x28\xd3\xc0\xb6\x64\xad\x48\x2b\xdf\xcd\xa8\xed\xa9\x9f\x09\xfc\x42\x99\x49\x7c\x01\xcd\x33\x31\xe2\x24\x2b\x56\x63\xa4\xc1\x0b\xd5\xc8\xda\xa8\x3a\x3a\x55\x83\x2d\xe2\x64\x0b\x31\x92\x32\x9d\xb9\x58\x6f\xd8\x49\x37\xda\x38\x00\xd7\xe7\xee\xda\x3d\x5e\x33\x35\x2d\x7b\x00\xc2\x99\xc8\x53\xcf\xa3\xa5\x24\xd2\xf6\x7d\xa6\x9c\xef\xbd\xbb\xcc\xb4\x3b\xf1\x23\xdc\x84\x4d\xd8\x32\x8d\xdc\x2e\xb0\x7a\x54\xf6\x34\x5a\xa3\xc2\x48\xaa\x36\x86\x06\x35\x45\x12\x31\x6f\x0e\x09\x29\x65\x03\xbd\x39\xf8\x71\x92\x0c\x2a\x75\xd1\x10\x94\x91\x29\x37\x98\xfd\x0e\xeb\x7a\x10\x32\xb5\x3a\xb3\x7d\x8e\xf4\x67\x73\xb7\x19\xc6\xa6\x60\xb4\x61\xba\x21\x89\x28\xe5\xd2\x49\xed\x5c\xd5\xf4\x3e\xaa\x90\xe6\x6c\x56\x32\x15\x16\x1a\xdc\x28\x33\x82\x53\xaa\xd5\x13\x41\x85\xc6\x9a\x2c\xb7\x42\xd5\x58\xdf\x7f\xca\xd1\x7e\x33\xb9\x12\x41\x91\xdd\x48\x2a\x67\xec\x60\x1b\xd7\xdb\xcb\xa4\x00\x4c\xd6\x94\xdf\x6a\x46\x5c\x77\xaf\x62\x35\x45\xa5\x32\xd5\x93\xea\x0e\x68\xe9\x7b\x74\x7b\x34\x56\xb8\x7b\x8b\x74\xee\x4f\x42\x72\x91\x4c\x48\x52\x6e\xa1\xee\x5f\x0f\xcc\x05\x7c\xf2\xaf\xea\x63\xe2\x41\x36\xc9\xd8\x1b\x98\x31\x40\xe4\x94\xa1\x1b\xd3\x54\x01\xd8\x54\xf3\xea\x9d\x27\x85\x06\x22\x73\x4c\xec\x24\xac\xcf\xc0\x16\xce\xfe\x64\xa4\xe1\xee\x14\x34\xda\x96\xaa\x36\x93\xbb\xe4\x12\x2a\x19\x37\xcd\x1d\x77\xec\x19\x9a\x90\x43\xec\xa5\x0d\x9c\x4d\x0b\x42\x6e\x0e\x08\x50\x75\xa5\xcb\x36\x62\x4c\xc4\xd1\xff\xc0\xe2\x5e\x05\xf0\x7a\xcf\x5e\x03\x13\x8e\x19\xd0\x8f\xa6\x61\x0d\x6b\xc6\x82\x88\xc5\x67\x99\xb2\xfb\xe4\x75\x6b\x8b\x9d\x30\x23\x68\xbc\x92\x38\x4b\xf6\x6e\x75\x02\x8e\x4c\x16\x6b\x1d\xca\xd8\x5b\x7b\x4a\x7c\xa6\x27\xb0\xc3\x19\xd1\x15\xde\x13\x00\x92\xc1\x0a\x87\x77\x9e\xf5\x03\x8d\x66\x5d\xb1\xc9\xc4\xc9\x08\x94\x8f\x51\x52\xa3\x45\x74\x84\x97\x9f\xa7\x93\x42\xcd\x10\x03\xe8\x06\x99\xc0\xbe\xd6\x0b\x64\x7d\x5c\x01\xdd\x6a\x44\x3b\x72\x5f\xca\xcf\xdd\xbb\x01\x52\x6d\xa0\x3b\xe1\x2f\x65\x9d\xb0\x48\x3b\xde\x5a\x0f\x52\x05\xcf\x3b\x00\x4d\x5b\xde\xa1\x3e\x12\x70\x5f\x07\x18\x4e\x86\x5f\x49\xf3\x1d\xdc\xeb\x38\x00\x19\x66\x96\xec\x3e\x62\xae\x16\x06\x5a\x2e\xc0\x72\x97\xc6\x48\x6e\x88\x25\x10\xe3\x1e\x59\x59\xc8\x1e\x18\xc4\xb5\x52\xef\xf8\xac\x2b\x18\xdd\x34\x35\x1b\x5c\xa3\xb5\x14\xe1\xf3\x4a\x9c\x30\x41\xdb\x58\x02\xbc\x0c\xae\x22\x49\xd6\xe5\xec\x9c\xe0\xcb\x40\x7d\x1c\x53\xe0\x60\xba\xf5\xf4\x49\xb0\x30\x8e\x76\x06\x07\x23\xb8\x48\xaa\x7d\x4f\x82\xba\x94\x37\x4b\xb8\x46\x5a\xcd\xe4\x8e\x79\x08\xba\x75\x4e\x8c\xba\x14\x62\xd4\x83\xc4\x41\x82\x61\x1d\x0a\x3c\xdd\xef\xd7\x29\xa1\x4e\xd4\x0a\xc2\x26\xa4\x37\x6b\x02\x15\x53\x3e\xec\x67\xb5\x01\x70\x84\x21\xd6\x2d\xd2\x07\xf1\x18\xd0\x29\x64\xd8\xf5\x8e\xbf\xe8\x82\xb0\x76\xc1\xd2\x03\x48\xcd\x0b\x6a\xb7\xa9\x4e\xcc\x84\x94\x54\xbd\x13\xb4\xd4\xa5\x37\x50\xe5\x0c\xbb\x92\xa7\x1a\x92\x8d\x9b\x7a\x6a\x77\xd7\xdd\xac\xc1\xd8\x68\xa8\x82\x23\x1c\x2b\x89\xf5\x0d\x3b\xba\x01\x8e\xd3\x9c\xad\x80\x84\x2b\x9f\xeb\x87\x0a\x8a\xe9\xfd\x85\x8e\xc8\x98\x45\xad\x2e\x56\x15\xab\xc9\xde\x28\xc7\xf4\xa5\x2d\x31\xc3\x96\xe9\xa6\xb3\x47\xe2\x61\x84\x63\x7a\x5e\xee\x9b\x07\xd4\x13\xdc\x83\xda\xc9\xa7\xd8\x67\xf9\x1d\xee\x4a\x46\x3f\x27\x7d\xb7\x74\x9d\x95\x2e\xa6\x07\x7a\x5f\x2d\x5d\x45\xad\x6c\x4e\x09\xc7\x2d\xf5\x27\xe9\x26\x42\x50\x19\xd9\x58\x8d\xad\xe6\x5b\x12\x21\xc9\x95\xb4\x17\xca\x45\xa9\xc1\xde\xd0\xcf\x0d\xdd\x00\xe1\xf4\x97\x46\x4e\x3c\xdf\x94\xcd\x5b\xc8\x57\x86\x4b\x2f\x6b\xea\x1f\x36\x3f\xbf\x7b\xff\xc7\xc5\x63\x87\xed\x7e\x73\x7b\xfb\xa7\x1f\x6e\x3f\xde\x7c\xda\x7e\xfc\x74\x73\x15\xdf\x6d\x3f\xbc\x8f\xb3\x18\xa4\xef\x58\x32\x82\xdc\xab\xd1\xfc\x35\xce\x6d\xff\xbc\x4c\x3f\x9f\x7d\x5d\xfc\xf5\xe6\xc3\x2f\x37\x57\xb7\xb7\xab\x1d\x58\xf6\x35\xe4\x43\xdf\xc7\x1a\x72\xac\x31\x5f\xf6\x7d\x8d\xf9\x98\x71\xe3\xf3\xaf\xfb\x69\x73\x7b\xf5\x9a\x57\x9d\xe6\xe5\x40\xc6\xc1\xed\xfe\xc3\xed\x97\x02\xaf\xfa\x4d\x96\x70\x37\x1d\x6c\x17\x91\x3b\x2d\xb9\xcd\x8b\x99\xac\xd8\xbf\xdb\xe8\x12\x3d\x96\x50\x0e\xe2\x18\x1e\xf7\x53\x37\xa4\x87\x61\xd4\xf2\x08\x20\xc9\xee\x79\x10\x48\x1d\x85\x46\x48\xe7\x9d\x86\x17\xcb\xd4\x60\x54\x0d\xb3\xaf\x6c\xae\xc2\x5f\xfc\x9a\x82\x9f\x66\xac\xcb\xd9\xe7\x15\xc8\x1e\xa7\x5d\xfc\x4d\xec\x80\x37\xf4\x32\x3f\x4a\x81\x9f\x1e\xa6\xc0\xaf\x0f\x53\xe0\x1f\xfb\x6f\xf1\xba\xd9\x9d\x8c\xd5\x3a\x3a\xb1\xdc\xfa\x50\x05\x0c\xd5\xdd\x75\xec\xc4\x51\x0e\xb2\xab\x24\xc7\x4e\x8e\x4b\x27\xaf\x1f\xef\xe4\xb8\x74\xf2\x32\x00\x77\xd7\xc3\x7e\x51\x2b\xfe\xbc\x1e\x38\xed\xf8\x37\x75\xfb\x57\x27\xea\x5d\xe4\xcb\xfa\x98\xa2\xff\x86\xd0\x43\x0d\x0d\x1e\x96\xbf\x87\xa0\x2f\x3f\x4b\xcf\x28\xf3\x8b\x90\xf3\x02\x0c\xfd\x75\x7d\xc2\x39\x08\x53\xeb\x17\x66\xea\x85\x12\x72\xa8\x24\xb2\x37\xa3\x14\xab\xd8\x67\xc0\x5e\xee\x54\x03\x60\xff\x4a\x50\x64\x4f\x7b\xa2\x53\x09\x6b\x4e\x34\x57\x4e\xaa\xd9\x4c\x72\xc1\x83\x5a\x0f\xa6\xc5\xce\x72\xee\xde\x76\x1a\xe1\x77\xf4\xe9\xf9\xa0\x5a\x81\x54\x68\x4a\xd6\xe3\x31\x7b\x86\x3c\x7c\xef\x29\x45\x25\x84\xc6\x8d\x1c\x95\x60\x92\xea\x85\x55\xc4\xac\xc4\xcb\x97\x83\x87\x3d\xa7\xec\xaf\x57\xef\xbf\x09\xe1\x23\xe2\x1e\xb0\xaf\x90\xf0\xbb\x38\xfe\x18\x11\x6f\xd6\x29\xff\x2e\xd9\xbe\x63\x1a\x77\xd7\xd1\x54\x57\x81\x1b\x3c\xa7\x5d\x64\x79\x05\xde\xc6\xb1\xdb\xbf\xba\xf0\x79\xdd\x8c\x6a\x4d\xfd\x1d\x94\xfd\x87\xcd\xc2\x80\x33\xa9\xe8\xe1\xd7\x76\xf0\x2f\x1f\xe2\x66\xff\xce\x53\xd8\x6e\x71\xf9\x8b\xac\xd9\x66\xb8\x34\x54\x4a\x4d\xb0\xbe\x9a\x99\x14\x06\x68\xd3\x02\xd0\x4d\x93\x0d\xd9\x37\x3d\xb1\x72\x86\x4d\x29\xc4\x47\x4b\x5b\xe2\xa7\x45\x1a\x49\x41\x4c\x93\x54\x2a\x58\x3c\x51\xc9\x54\x1a\x62\x7c\x52\x53\x4f\x84\xd3\x29\x8b\x99\xc3\x8d\x58\x48\x52\x26\x36\x6d\x5b\xf0\x37\x08\x35\x78\x8f\x08\xe5\xe2\xde\x0d\x33\x64\x73\xbd\xda\x36\x34\x2a\x8d\x7a\xdc\x99\xb7\x97\x61\x2f\x73\x34\x4a\xc5\x41\x39\x8a\x15\x10\x97\x0a\x20\x8b\xf2\x12\x69\x2e\x3a\x48\x7b\x8b\xb3\xee\x1c\x29\x29\x52\x14\x44\x52\xc4\x46\xc1\x3d\x7f\x36\x9a\xb1\x27\x64\xe6\x83\x52\x1a\x56\x83\xc1\xd6\x14\x04\xd7\x63\x43\x2a\x64\x14\x45\x09\xa6\x33\xe7\x61\x26\x2a\x6f\x96\x4d\x8a\x5c\x4e\xe2\xbb\x60\x92\xa9\x6e\x89\xad\x45\x3a\xfc\xaf\x19\x91\x8c\xcc\x4a\x08\x6d\xb3\xf9\xb2\xf8\x5f\x98\x4d\x48\x43\xd4\xda\xb0\x57\x82\x30\xf3\x12\xe7\x64\xcd\x1a\x48\xb6\xa2\x66\x5f\x77\x33\xe7\x8b\x22\x7d\x8d\xd5\xa2\x60\x3b\x45\xad\x3e\x12\x05\x7e\xe0\x09\x59\x15\x06\x36\x74\xfd\x8c\x52\x99\x13\x6a\xc3\x52\x66\x1f\x08\x46\xe6\x8c\xd5\x4b\x04\xc3\x2a\xba\x03\xb9\x7a\x7d\x48\xb0\x19\x8d\x05\x5b\x33\x77\x80\x4d\x03\x7f\xbb\x82\x75\x0d\xc1\x5a\x7e\x41\x28\x08\x96\xc0\xd9\x07\x02\x2b\xe7\x9b\xfb\xf6\x9d\x2f\x26\xcd\xf1\xc3\x4a\xae\xd9\x8e\x8c\x65\x7c\xbb\xc0\x48\x6f\xdc\x5a\xb9\x45\xb9\x88\xdb\x5d\x7f\xac\xf7\x28\x21\x2c\xaf\x6a\x8e\x46\x43\x58\x6c\x82\x6f\x5f\x4e\x4e\x8b\xa8\x01\xe0\x11\x80\x17\x90\xe7\xba\x8a\x76\xac\x80\x78\x0b\x06\x25\xad\x11\x9b\xac\x8a\xd0\xba\x5a\x8e\xad\xc7\x2a\xb2\x2f\x34\x1b\xb9\xad\x7d\xd9\x80\x5a\xd0\x28\xe5\x98\x61\x81\x5a\x3f\x5b\xdf\x5b\xd7\x3f\x26\x05\x8c\x1b\x82\x4e\xf5\xcc\x66\xef\x26\x25\xe0\x6f\x75\x9f\x73\x63\xb4\x5b\x93\x45\x32\x40\x19\xc1\x28\xc3\x5e\xa3\x58\xc6\x3f\xa1\xa7\xe0\x63\x6f\x43\x6f\x23\x4f\xbd\xc1\x29\x72\x16\x8d\xd0\x45\xab\x55\x9b\x74\x2b\x7e\x12\x31\xe8\xa7\xb9\x10\xcf\x94\xef\x6d\xa8\x1f\x7f\x9d\x31\x1d\x48\x71\xc4\x54\x3b\xef\x94\xb8\xb6\x03\x75\xb6\x49\x7f\xf0\x7d\x4f\xed\xfb\x22\xeb\xfa\xc3\xfb\x0f\xdb\xdd\xcd\x87\xeb\xaf\x6c\x0e\x24\xac\x23\x73\xa3\x51\xcb\x97\xa6\x6e\x24\xf9\xf9\x1d\xd4\xad\xbf\x95\xba\xf9\x1b\x22\xef\x12\xfc\xf8\x0d\x91\xf7\x35\x44\x5a\x5c\x44\xda\x57\x9a\xd5\xe4\x38\xab\xdd\x7e\x9f\xce\x1e\x4e\x67\xa7\x03\xfe\xc7\x4d\x66\xc8\x7a\x5f\xa8\xb2\xcb\x27\x13\x55\x10\x5a\xf5\x10\xa9\xbf\x9c\x73\xcc\x45\xd8\xa7\x8f\xbb\xf4\x25\x55\xae\x41\x3d\xc1\x4c\xa8\x80\x2d\x1e\xdd\xb1\x71\x6d\x6a\xdc\x33\x75\x20\x8a\x56\xd9\xd9\x0f\xed\x0e\x8e\x4b\xa3\x87\x7c\x5e\x49\x58\x2f\x94\xf2\xa8\xfe\x30\xee\x28\x17\xcb\x0d\x77\x6f\x4f\xae\x6d\x3a\x76\xf0\xfa\xba\x8f\x97\xe0\xaa\x3f\x9a\x15\x9c\x90\x8c\xc3\x8e\xfe\xbb\x00\xfd\xd6\x58\xa1\x5c\x0c\x64\xb2\x74\x24\xcc\x56\x63\x26\xcd\xfd\xee\x9a\x0b\xa2\x44\xd3\x05\x17\x4a\x19\x59\xa2\x18\xfb\x82\x65\x29\xec\x89\x57\xda\xb0\x25\xd1\x2d\x15\xf8\xf7\x72\x25\xa0\xd2\xe7\x82\x5a\x99\xb9\xd7\xea\x2e\xda\xb9\x59\x21\x02\xcf\x9e\x61\xcd\x31\x8b\x74\x7f\x2c\x3e\x3e\x38\x0d\x5e\xa9\x75\x12\xfb\xf1\xcf\x45\x45\x9f\x19\xc7\x2f\x38\x0f\x7d\x1f\xcc\x3f\x7e\x30\x3f\xcf\x99\xff\xbc\xfd\x42\x7c\xf9\xdb\x56\x18\x6d\xde\x0e\x70\x40\xc8\x5b\xca\x99\x29\x75\xaa\xad\xcc\x3c\x13\x49\xe0\x35\x91\xdd\x6d\xa1\xea\x70\xb1\x3c\xb4\x45\x9b\xbc\xa4\xdb\x0c\xdb\x8b\xf5\x1f\xb6\x30\x9a\x29\x05\x26\xd3\x13\x22\xb8\x29\x57\x78\x41\x75\xd2\x9e\xe7\x1e\x9a\x29\x2d\x22\x65\x0a\x5b\xfb\x05\x38\x0c\x00\x9b\xa4\x8c\x85\x9d\x31\x22\xd5\x52\x4d\x25\x50\xec\xec\x61\x37\x62\x46\xc3\x14\xe8\x02\x70\xb4\xb0\x0b\x35\xd7\xbd\xa7\xe5\x97\xd1\xb7\x56\x18\x47\x2f\xa4\x8c\x8a\x4d\x9a\x48\x0d\x9b\xad\x55\x37\xbe\xa7\x78\xdc\x9e\xe3\xd1\x6d\x52\x41\x72\xd3\x26\xee\x95\xac\x55\x81\x4d\x43\x65\xcc\x66\xd8\x84\x09\x7f\x3a\xa8\xfc\xfe\x57\x61\x66\x53\x1f\x05\xe9\x5c\x3d\x15\xab\x94\x6e\x45\x1b\xb5\x61\xdb\x2c\x75\x40\x41\xa4\x0e\xa3\x9a\x18\xa6\x60\xcb\x7e\x22\x9c\x0f\xd8\x36\xb4\xc9\xe8\x44\xa9\x26\x77\x86\x76\x40\xa2\x76\x74\x4c\xb5\xaa\x72\x05\xa4\xb1\xf6\x79\x9c\xd7\xa4\xd9\x35\x81\x3b\xa6\x1f\x96\x1d\x2e\x5c\x48\x25\x54\x1a\x7d\x39\xce\x6b\x9a\x1d\xa9\x32\x63\x13\xcd\x8f\xcb\x25\x9b\x75\x13\x76\xcc\x65\xf8\xc6\x9a\xe9\x27\xd9\xa6\x33\x25\x66\xb9\xe7\xde\x0d\xfc\xa1\x31\x43\x79\x1a\xb4\x0d\x3b\x2e\xef\x6a\x6d\x82\x47\x69\xab\xf3\xb8\x34\xa9\x0d\x23\x18\xec\xbf\xa9\xa2\xe7\x6a\x35\x62\x13\xd3\x25\x84\x7d\xaf\xb1\xb4\x0a\x4f\x33\xa6\x84\x90\x8a\x3d\x2e\x8e\xee\xf0\x1b\x9c\x2a\x95\x42\xc2\x83\x6a\xed\x70\x77\x34\x62\x86\x27\x8d\xf5\x0b\xb2\x9f\x62\x03\xdc\xa9\xc7\xb8\x19\x9e\x4d\x8a\x74\x72\x4e\x89\x46\x74\x78\x49\x8f\x34\x6a\xf3\x13\xa9\x05\x2d\x77\x9f\xc5\x1a\xa9\xd9\xd8\x27\xd3\xf0\xaa\x23\xa2\xa6\x55\xdb\x01\x81\x49\x86\x33\x49\x85\x02\xd2\x01\x40\x32\xe0\x19\x8a\x7e\x9e\x9e\x92\x03\x5e\xba\x7d\x43\xb9\x55\xfb\xac\x7d\x01\x77\x4a\xa8\x4b\x03\xdf\x8d\x6e\xb0\xbc\x59\x4c\x0f\x2b\x07\xca\xd9\x7d\x9c\x2a\x34\x3d\x6b\x61\x52\x90\x22\x1c\xd2\x2b\xc1\xb1\x1f\x4c\xe8\xd9\x81\x4d\xf8\x0e\x82\x4e\x57\xa8\x55\xb1\x06\xdd\xbd\x6d\xd4\xa4\x07\x4e\x34\x6c\x10\x13\x30\x12\x4e\xdc\x63\x00\x0a\x57\x3c\x09\xa5\x5e\x5a\xef\xc1\xd0\x68\xe2\x64\x6f\xca\x4d\xe3\x38\x73\xe1\x81\xab\x9a\xb1\x5c\x8b\x90\xaa\x13\x47\xa5\x65\x9d\x8e\x65\xd9\xfb\xb0\x41\x5f\x47\xa2\x90\x6c\xb5\xdc\x64\x82\x53\xcf\xd2\xf8\x9e\x0b\x86\x5a\x47\x85\x63\xd3\xea\x47\x5c\x4c\x73\x43\x4f\xe6\x45\xe1\x37\xc5\x74\x9e\x48\x96\x83\x11\x81\xfb\xd2\xf9\x4f\xd6\x7c\x84\xa7\x58\x0f\x67\xfb\xac\x0e\xb6\xee\xda\x1c\x98\x06\x3e\xf3\x67\xc9\x9e\xae\x79\x3b\xcf\x86\x10\x84\x5b\x9d\x19\xac\x45\xca\xad\x93\x4c\xea\x95\x1a\x46\xd3\xee\x2e\xce\xff\xb5\x39\xa2\x62\x83\x1f\xc3\xdc\xc6\x75\x07\xf6\x62\x6c\xcd\x8e\xb7\x78\x30\x49\xb7\xe9\x34\x06\x20\xfe\xc7\xea\x2b\xdd\x2a\xc2\x1b\x6a\x28\x24\x40\xb4\x95\xa3\x63\x76\x83\xab\x6c\xc9\x5b\x00\x7a\xb9\x6a\xc9\xae\x9d\x5a\xef\x67\x18\x6d\xa4\x49\x8d\x7d\x1c\xe1\xb6\x27\x47\xb3\x85\xd3\x85\x6f\xf4\x66\xb4\x65\x14\x25\x05\xc4\x57\x43\x66\x36\xca\x0c\x4b\xc6\x3d\x37\xf1\x8b\x71\x2a\xac\x27\x78\xe6\x41\xf8\x5a\x47\x59\x6f\x0c\xeb\x5e\x08\xae\x8c\xee\x6d\xdd\x5b\x39\x1c\x4b\xcd\x98\x90\xb5\xc2\x5d\x40\xf2\x40\xeb\xa7\x6f\x36\x8c\x8b\x31\xc5\xe1\xc8\x73\x22\x76\x77\x37\x9b\x5c\x9a\xc7\x7a\x00\x3b\xc3\xde\xbb\xb5\xde\x8d\x78\x1a\xe3\x6c\xcf\xfb\xc9\xe8\xee\x46\xde\xa6\x03\x32\xcf\x2f\x5c\xf2\x26\x53\x01\x92\x87\x1d\x17\x37\x0e\x2b\x41\x5b\xc5\xa2\x90\x0d\x8f\x0c\x44\xa5\x14\x78\x92\x95\x75\x4f\xbd\x76\x4c\x71\x5b\x77\xeb\x31\x86\x87\x4e\xde\x23\xd5\x01\xc3\x19\x13\x99\x55\xc0\xc4\xb2\xd1\x60\x36\x55\x1d\x67\x2d\xc1\xd6\xb4\x59\x13\x53\x87\xcd\x6f\xb0\xa6\xc1\x6e\x3c\x5c\xc4\x61\xab\x1d\xd0\xc4\x1d\x06\x6d\xd9\x14\xeb\xef\xe0\xc7\x34\xf3\x3a\x89\x35\xb4\xe4\x03\x3a\xc1\xe8\x52\x40\xae\xcd\x7b\xc6\x7a\xb9\x34\xd0\xbd\x55\x3e\x62\x56\x16\x13\x26\x26\xc0\x54\xd4\x8b\xc2\x24\x61\x03\x00\x7a\x90\x61\x57\xee\xae\xd5\x26\x49\x13\xdd\x30\xdf\x7d\x32\x19\xee\x88\x2d\x98\x92\xac\x79\x1e\x31\xa0\xe8\x57\xb8\x72\xc2\x66\x92\x02\x57\x41\x33\x5b\x0a\xb2\x54\x11\xd2\xf9\xad\x10\x1e\x3e\x59\xcd\xd5\x08\x13\x4d\x25\x3b\xef\x30\x7a\xac\xec\xa8\x6a\xdf\xda\x08\x82\xd7\x10\xb8\xe0\x11\x63\x88\x8c\x31\xae\x76\xf2\xb0\xd6\xe7\x8c\xf2\xd8\xa8\x23\x2c\x88\x66\x29\xab\xa3\x9b\x6d\x7d\x06\x72\x6b\x15\xf3\x67\x77\xa7\x79\x29\x7d\x03\x27\x85\x25\xd6\x95\x83\x55\x09\xed\xda\x51\xc9\x8f\x8a\xaf\xe5\xb4\x78\x5e\x68\x6c\x16\x9e\x00\x7d\xa6\x19\xb9\xb0\xa1\x2a\x6a\x6e\x5b\xef\x1a\x2b\x1b\x31\xae\x56\x76\x96\xa5\xec\x2c\xf0\x6e\x5c\xca\xb6\xf1\x41\xd9\x95\xeb\x16\xd3\xaf\x51\x7c\x2d\xae\x17\xa0\x73\xca\xc6\x04\xa4\x7d\xd6\x8e\x64\x4a\x03\x6e\x7b\x66\xca\xd7\x0d\x0d\x1d\xf6\x59\xaf\x9b\xe4\xab\x48\xad\x5c\x86\x89\x0b\xc6\x6c\x61\xb6\x2d\xbb\x6c\xc2\xac\xc5\x79\x90\x94\xb6\xb1\x91\xb7\xcf\xca\x0e\x65\x09\xc0\x2a\x0d\x64\x00\x47\x56\xe1\xe9\xc5\x3f\xfb\xab\xad\x74\x50\x27\x21\x60\xca\xc4\x18\xc3\x1d\xc7\x26\x42\xc5\x4c\x6a\xe7\x0e\xb9\x3d\xe5\x33\xee\x35\x21\xe1\xf5\xb0\xfe\xc4\x4b\xcb\x14\xdd\x26\x20\x40\x69\xb3\xff\x51\x95\xa3\xe1\x23\x45\xfe\x9a\x7f\xfc\x7d\xe1\x30\xdd\x84\x20\x10\xf1\x32\x6f\x6d\xb6\x41\x87\xf8\xfa\x47\x9c\xa9\xe8\x4b\xf1\x4e\x6a\xdd\x55\x44\x38\xd8\x51\xb7\x89\xad\x34\x77\xa9\x81\x8c\x37\x1e\xc2\x2c\x00\x21\xd7\x78\xc2\xff\x40\x04\x0c\xe8\x5d\x0d\x6e\x95\xd5\x79\xd6\xcc\x06\xe3\x3e\x01\xb7\x0c\x78\x1b\xf6\xe2\xde\x61\xd9\x84\x6f\x86\xa3\xd3\x10\x18\xfd\x5c\x06\xf2\xb0\x5b\xa7\xc8\xe8\x77\xd7\xb1\x62\x90\x00\x67\xb4\x15\x6a\x70\x7c\x36\x2d\xb3\x47\xea\x05\xc9\xe3\x6a\x85\x53\xb7\xba\xcb\x27\x3a\xcf\xc4\x5e\xad\x1d\x91\x45\xd1\x74\xd3\x0d\xd4\x9f\x12\xe6\x1f\x1f\xf3\x86\x65\x1e\x80\x9b\x6d\x91\x4a\x37\x87\x14\x9b\x0f\xc6\xe8\x35\x0e\x2b\x21\x0a\x55\x5e\xe5\x9c\x5d\x82\x5f\x12\x26\xbe\xea\x6e\x64\x05\x0b\x2c\xa6\xde\x55\xe3\xc6\x90\xa9\x95\x1a\x06\x75\xed\x7e\x7e\x1c\xc4\xbf\x8e\xf4\xa4\xa1\xf3\xad\x2c\xa0\x76\xea\xe2\xbe\xe8\xb9\x1c\xdd\xb9\xeb\x30\xca\x55\xa7\x69\x28\xfc\xc0\x47\x82\x5e\x60\x9a\x8c\x5d\xe6\xa6\x26\xd6\x0b\x26\xa9\xfb\xe1\xb3\x3c\xad\x13\x1e\xe5\x24\xe4\x95\xa7\x34\x1d\x6a\x5a\x7e\x71\x09\xa9\x53\x42\x0a\x57\x13\xf6\x7e\x02\x5d\x99\x10\x65\x88\x55\xb7\x24\xbc\x37\x45\x11\xb2\xb1\x76\x4a\x79\x8b\xc1\xe0\x64\x73\x34\xd2\xd8\x53\xcb\x82\xf5\x3a\xf1\x78\x5e\x2a\x46\x54\x3d\x53\xb3\x19\xb9\x67\xcf\x64\x4c\x0d\xd6\x54\xab\x34\xc0\x07\x32\x36\xd4\x4a\xb3\xcf\x1a\xd6\x64\x23\x5e\x2b\xd5\xa1\xf6\x39\x6a\x5e\x58\x6f\xdd\x62\x9e\x99\x62\x00\xa6\x99\xf5\x4c\xb5\x97\xe5\x6a\xca\xee\x80\x79\x07\x4f\x44\xed\x73\x8e\xec\x76\x5f\x06\x8e\x7e\xaa\x40\x31\xdb\x98\x41\xe0\xc6\xc1\x71\xbf\xc4\x81\x0a\x53\x87\xed\x35\x04\x13\x49\xd1\x81\xa2\x5b\xf3\x24\x89\x24\x92\x3d\x3a\x42\xb9\x21\xde\xce\x0c\x11\x81\x65\xa9\x90\x4a\xad\xfb\xe8\x65\xe8\xb7\xd0\xcd\x90\xa4\xce\xfd\xf5\xba\x19\x7f\x70\xdc\x53\x4c\x00\x08\x45\x24\xb5\x51\x10\xa4\x71\xc5\x74\x60\x85\x6b\x87\x14\x4f\x00\xf2\xcb\x94\x4c\x21\xad\x94\x1a\x65\xb3\xe8\xdc\x08\x4e\xca\x3e\x85\x74\x54\x0a\x78\x62\xae\xd2\x98\x44\x27\x66\x32\x7d\x26\x6f\xac\xf1\xf6\x59\x7d\xb2\xcd\x90\xcc\xa6\xa9\xce\xa8\x0f\x9f\x6d\x49\x44\xa0\xbd\xd8\xc9\x86\x6a\x3b\x75\x4e\x85\x10\x46\xd2\xbe\x31\x0f\xeb\xe2\x62\x83\xa2\xc4\x08\xa6\x00\xf5\x22\xda\x4d\x90\x7a\xdc\xa3\x8e\xc4\xf5\x2e\xc8\x38\xca\xf0\xd1\x63\x63\xf3\x71\x5a\x8a\xcd\x87\xa4\x43\xb7\x73\xee\x15\x33\x16\x4d\xcc\x53\xcb\x4c\xb9\xcb\x9e\x86\x16\x0c\x2e\xa9\xb5\xb6\x52\x37\xb5\xb1\xc3\x17\xd5\x2c\x35\xd3\xb6\x1b\x50\x22\x72\x6a\x54\xd9\x97\x8d\x07\x34\x6e\xb2\xfa\x57\x32\xc3\x80\x1b\xfc\x29\x61\x7a\x89\x19\x05\xd2\x49\x15\x46\x7c\xb5\xa7\x4c\x29\x83\x31\xb9\xf2\x4d\x43\xb4\xfb\x00\xce\x81\x1f\x16\x07\xe4\x82\x29\xd9\xac\x98\x9a\x2b\x80\xb9\xa0\xfc\x0b\x42\x6c\x1b\xa9\x71\x43\xcb\xd6\x54\x4a\x45\x61\x3b\x59\xb5\x4c\x19\xcb\x64\x26\x81\x7d\xe3\x63\x70\x09\xe6\x54\x58\x55\x6d\xce\xa5\x46\xed\x62\x2d\xeb\x7b\xa3\x3a\x53\xb2\x6c\x44\x99\xf2\x5a\x3d\x6b\x50\xaa\x98\x7d\x6b\xf5\x58\xb7\x25\x3c\x0e\x06\x44\xb3\x16\x69\x0d\x32\xc9\x6e\xba\x1b\x0f\xa0\x7f\x87\x02\x8d\xdb\x8f\xa7\xd2\x43\x6d\x44\x8b\x09\x70\x0f\xdb\x00\xa8\x27\x8d\x52\xec\xc4\xbd\x4b\x66\x78\x26\x57\xa4\xdc\xcc\x26\xf9\xb1\xd2\xde\xa2\x8f\xb2\x8e\x6c\xbc\x33\xfc\xcc\x6e\x71\x85\x76\x30\x81\xd9\x1a\x55\xec\xfd\x40\x5f\x49\xd5\xb9\x66\xa8\xcf\x56\xd3\xa3\xbd\x98\x50\x71\x75\x49\xcb\x40\x58\x64\x4b\x05\x32\x46\x8c\x6f\x72\x21\x85\x2a\x6f\xc2\x10\x0a\xab\x55\x03\x5c\x5c\x60\x24\xda\x7b\xbb\x55\x39\xb3\xd5\xc1\xe3\x5a\xfc\x60\x05\x01\x74\x1c\xb5\x81\x15\x6e\xbf\xe7\xec\xeb\x04\xe2\x50\x26\x8d\x6d\xfe\xdd\x98\xe9\x57\x82\x1f\x17\x7b\xc8\x86\x03\x7a\x59\x07\x6e\x4a\x2f\xe5\xd8\xbd\x66\x66\x50\x1e\x47\x60\x4d\x46\x1c\xaf\xb5\x00\x56\x35\x0a\x41\x24\x62\xf3\xbf\xc2\xc5\x24\x33\xbc\xe9\xd9\x77\x73\xa2\x87\x06\xd9\xf4\x2a\xaa\x1b\xeb\x5f\xfb\x1c\xfd\xb6\x5d\x8d\x41\xea\x74\x3f\xcc\x2b\x10\x34\x60\x95\x0c\xe3\x74\x50\xf5\xcd\x11\x67\x96\xee\xaa\x23\x20\x50\xcd\xd8\x6a\x26\xc3\xb1\x81\x83\x00\x10\xca\xb5\x52\x6e\x85\x4a\xc1\xea\x24\xd0\xa5\x99\x1a\x1f\x4c\x57\xce\x3b\xb3\x77\x60\xc6\x00\x76\xb9\x34\x9b\x0e\x30\x40\x10\xef\x2a\x13\x89\x45\xea\x86\xc9\x97\x86\x56\x5c\x07\xb8\xc6\x2b\x56\x66\xd8\x23\xab\x56\xe6\x17\x80\xc9\xe8\xd4\x6c\x6b\x73\xe5\x2c\xd7\xe1\x27\x35\x59\xf7\xc8\x10\xb3\x56\x60\xac\xac\xb3\x43\x65\x84\xfa\x8c\xa0\xd4\xc6\x72\x5c\xae\xc1\x6c\x01\x31\xeb\x0c\x96\xc2\x4a\x44\xa4\x61\x64\xd8\x60\xb1\x58\xf3\x23\x36\xa2\xb4\x88\x9f\x20\x7c\xce\x4e\x52\x87\x8c\xd7\x4a\x2d\x57\xc8\xd5\xa6\x94\x47\x76\xf4\x97\x61\xda\x6d\xbf\xbb\xb6\xd9\xae\x53\x35\x73\xd1\xa4\x78\x71\xa9\xdd\xac\xbb\x28\xb5\x9d\xd1\xd9\xd6\x1b\x8b\x88\x37\x57\xfb\xb1\x10\xb3\x28\xb8\x1d\x19\x55\x89\x4d\xc0\x63\x81\xb1\x35\x24\xd7\xd2\x25\x12\x92\x92\x23\xfe\x58\x0f\x49\x83\x62\x8d\x5d\xb2\xec\x02\x02\x21\xfc\x19\x2f\x82\x71\xec\x53\xf1\x5a\x34\xd6\xe0\x20\x0f\x64\x4c\x71\xbe\x16\x2d\x53\xb5\x76\x32\x6c\xbc\x67\xaa\x29\xc7\x42\xb9\x21\x63\x7a\xf6\xc2\xe7\x40\xb9\xf2\xdc\x74\x8f\xb5\x69\x4a\xdc\xcd\x76\x68\xf6\x59\x6f\x61\x50\xb8\x53\xf2\x70\xa3\x0c\x0a\x0b\x20\x1a\xb9\xe9\xce\x06\xc6\x6c\x02\xd2\x75\x41\x11\x56\x18\xe2\xdc\xb1\xcf\x86\x57\x4c\x6b\x82\xb3\xe9\xf8\xa6\xef\xb3\x43\xc1\x20\xd0\xbd\x70\xc4\xf9\x76\xe2\x34\x4c\x85\x5f\xa1\x59\xc4\xa5\x17\x17\x0b\xa2\x1c\xb9\x6d\xf6\xbc\x29\xfc\x19\xc1\xe7\x19\x19\x0f\x97\x7a\xa0\xdf\xb6\x8b\xa5\xe0\x4d\x99\xf5\x30\x15\x14\xf5\x48\x48\x85\x5c\x53\xbe\x18\xa4\xd5\x34\xd1\xe2\xe6\xcf\x52\x8d\xbe\xd4\xc2\xe4\x22\x6a\xe1\xd3\xec\x22\x9d\xb1\xdb\x3d\x66\x35\x2a\x1e\xe6\xe4\xd2\xbb\xfa\xf4\xe9\xa4\xe6\x3d\xde\xb1\x36\x01\x00\x07\x1b\xe9\x3d\x03\x7a\x1d\x03\xb4\xf5\x79\xc2\xd4\x80\x06\x62\xb0\xae\x02\xb4\xfd\xa8\xc3\x91\xe1\x01\xde\x14\x8d\xa3\xa3\x09\x29\xa8\x53\x42\x05\xc0\x31\x1e\x82\xe9\x92\x0e\x6b\x08\xbc\x1a\x5d\x99\xf3\xc4\xe6\x1c\xdc\xb1\x7f\x69\x6c\x88\xec\xf3\xd0\x68\xb2\x76\xa0\x0a\x83\x9e\x2b\x4c\x16\xc4\x0b\x99\x48\xcc\xa4\xd6\xf8\x0e\x0d\x2c\x83\x09\x30\x1a\xd3\x60\xc6\x08\xd4\xde\x11\x47\x6a\xd3\xb0\x31\xd9\x30\xdd\x3f\xb5\xbb\x6b\x2b\x10\xcb\x54\xbd\x6c\xa3\x31\x27\x36\xac\x87\x11\x24\xc2\x27\x4a\xaf\xb1\x23\x10\xc8\xcf\x33\x75\xb3\x76\x63\xc3\xfa\xbf\x89\x1b\xb3\x25\x06\xc7\x8c\x00\x43\x0f\x5d\x84\x26\x62\xa6\xa5\x4d\x23\x10\x36\x39\x55\xc7\x38\x87\x8f\x9a\x19\x17\x03\x41\x80\xb0\x25\x46\x9f\xe7\x46\xa2\x1d\x46\x50\x1a\x05\x93\x0a\xd2\x5f\x62\x9f\xc6\x43\x5c\x31\x01\x9b\xd6\x23\xa6\x9e\x0c\x2a\xf2\x72\x12\x0a\xb7\x44\xee\x3e\xdd\x5c\x7d\xc9\xcd\x50\x86\xb1\x0f\x38\xff\xbd\x52\xb5\xbe\x00\xb6\x02\xd8\x36\x0a\x65\xec\x6f\x77\xdd\x68\x12\x64\xf9\x5e\xfe\xa6\x19\xa8\x36\x6f\x28\x60\x65\x44\x9d\x1a\xb5\xc7\x4a\x1d\x9d\xaf\x6d\xd8\x39\x00\x48\x3c\xa6\x1e\xe8\x95\x80\x8e\xef\xc6\x20\x46\x16\x36\xe5\xed\x95\xd2\xb0\xb3\xe1\x80\x06\x45\xcd\x1a\xec\xcd\xa3\x02\x8f\xa7\x41\xa9\x8c\x86\x08\xd4\x25\x1d\xb3\xaf\xe5\x24\xac\xfd\x39\xf2\xec\x28\x88\x1f\x8c\x4a\x59\x2f\x1a\x92\xaf\xe4\xbd\xd0\xe0\x6c\x86\xa9\x96\x37\xa3\x33\xe5\x9a\xc3\xf2\x77\x2e\x69\x79\xa6\x0a\x9b\x46\xd9\x0c\xa3\x72\x6f\x25\x83\x3d\x28\xba\x6a\xf0\xec\x0c\x66\x74\x22\x40\x6b\x66\x88\x1f\x26\xed\x90\xfb\x53\x01\x7b\xe2\x3f\x3a\x1c\x24\xf8\x38\x1d\x23\x4e\xfe\x47\x4a\x7d\xfc\xa5\x3e\x33\xde\x3f\x5f\x1d\xe2\x87\x5f\xbf\xd4\x66\xdb\x92\x3a\xce\xa6\xb4\x03\x02\x66\xfb\x3e\x2a\x30\x2c\x49\xbb\x0d\x5d\xe9\x00\x1c\x4f\x7c\x29\x48\x92\xdd\x04\x28\x2b\x08\x98\xa7\xde\xa8\x97\xcb\x4a\xb5\x94\x8b\xf9\x1a\x63\xc8\xec\xcb\xbb\x72\xc1\xc9\xe4\x4f\xc8\x07\x21\xcd\x79\x1f\x0b\xc1\x15\x42\xdb\x45\x0e\x50\x86\x0e\x6a\xbc\xb3\x47\x01\x58\x69\xce\x87\x58\x49\xfa\xde\x04\x92\xbb\x90\x1e\x5d\x05\x3e\xdd\xec\xff\xe7\xff\xf8\x75\xf3\xee\xfd\xc7\xf4\xff\xee\xdf\xbd\xbf\xda\xdc\xfc\x2f\xeb\xb4\x9f\xaf\xfe\x7e\xfb\xef\xff\xe6\x3f\xfc\xff\x6f\x36\x3f\xbf\xbb\x7a\xff\x31\xbc\xfb\xf9\x4f\x3f\xdc\xbb\xf5\x87\xf0\x1f\xfc\xa7\x1f\x98\xa9\xfc\x10\xfe\x65\x67\x83\x46\xed\x3f\x84\xff\x90\xf5\x57\xf9\xd3\x0f\x66\x3b\xc9\x0f\xe1\x97\xf9\x9a\xff\xfd\xfe\xdd\xc7\xdb\x3f\xfd\xf0\xe9\xf6\xea\xe6\x6f\xbf\x6e\xb6\x57\xff\xcf\xfb\xff\x7d\x7b\xf5\xc3\xbf\xff\xdb\xed\xc7\x0f\xbf\x06\x3b\xf8\xb0\x60\x0c\x5b\xff\x0b\x36\xbe\x71\xed\xc3\xdf\xff\x7e\x7b\xf5\xf1\x4f\x3f\x10\xd7\x1f\xee\xdf\xc8\xb9\xa7\xbf\xbc\x79\x7c\x63\xc9\x0f\x6e\xcc\x67\x83\x7f\x2c\x8f\x6f\xec\xf2\xe0\xc6\x52\xc6\xd9\x8f\x67\x8f\x6e\xe4\x87\xb7\xfd\xf8\x26\xfd\xf8\x57\x50\xd9\xfd\xbe\xfa\xf7\x7f\xfb\xff\x79\x17\x7e\x86\xfa\xbe\xf0\xd6\xfd\x7f\x19\x12\x7c\x85\x80\xfe\x46\x16\x8b\x94\x8a\x06\xce\x26\x5f\xcf\x32\xf0\x1d\x4d\x43\xe8\x88\x90\xef\x66\x70\x2c\x27\x6d\x42\x0f\x04\x9e\xd8\x4b\x58\x79\x1c\x10\xd2\x33\x20\x17\x5b\x6c\x99\xb8\xf4\x58\xb1\xfb\x93\x49\xd8\x64\x32\x0b\xbf\xa1\x52\xca\x11\x03\xd2\x8a\x4c\xcc\x41\xb7\x13\xf7\xcc\x71\x1e\x00\xc6\xcd\x65\xc0\xc3\x15\xce\x57\x17\x8d\x52\x0f\x83\x38\x23\x2b\x78\x51\x13\xe6\x5a\xef\xae\xd9\x31\x26\x4d\x5d\x82\xe9\x23\x05\x50\x2e\xa6\x6e\x36\xca\xc3\x14\xdc\x66\xd6\xbc\x47\xcb\xd7\x86\x09\x67\xd7\xa8\xf1\xc5\x4c\xf9\x6f\x3c\x6c\x4a\x09\x70\x4a\x10\x8d\xa9\xc0\xf5\x55\xe0\x84\xe4\x8c\xdf\xa5\xc7\x46\xb9\xe1\x3c\x67\x3b\xaf\x63\x02\x4a\xc1\x8d\xa9\xb0\xcd\x40\xee\xed\xea\xa7\x58\x99\x9c\xb3\x56\x1a\xd8\xa3\x2a\x05\x13\x3e\x3c\xb8\x86\xf5\xd6\x3c\xef\x0e\x18\xf4\x32\x28\x8c\x13\xce\x4f\xef\x3e\xfe\xf4\x69\xfb\x8f\xab\x8f\xdf\x80\x4b\x85\x10\x03\x6e\x5e\x74\x43\x35\xd3\x3a\x1f\x9a\x9a\x44\x22\x7b\xee\x36\x08\x46\x11\x0f\xae\x1b\xbf\xb5\x6c\x63\x59\x4b\x45\x70\xeb\xd8\x20\xba\xbb\xe6\x63\xa2\x4a\x11\x2a\xf9\xbc\x50\xc9\xba\x31\x6d\xce\x3e\xcb\x45\xf8\x9a\xb5\xa4\x17\x62\x03\x88\xb5\xd9\x0d\xb0\x2c\xaa\xf4\xd5\x86\x55\xac\x1b\x8c\xbb\xeb\xe6\x59\xc2\xcc\xc2\x95\x1d\x12\xcc\xec\x6d\x0c\x62\xa1\xd6\xeb\x79\x27\xd8\x25\x09\x5b\x0d\xad\x9f\x2e\xd4\xd7\xae\x7f\xfd\xeb\x3d\x10\x1a\x49\xd4\x33\x36\x36\x4b\x3d\x67\xa5\x91\xf7\x11\xde\x43\x78\xf4\x7c\x50\x4f\xd5\x68\xad\x0b\x7e\xca\xd9\xaa\x5e\x91\xa6\x6d\x5a\x30\xa5\x98\xd6\xb8\x33\x9d\xa1\xde\x6f\xb4\x19\xb1\x70\x09\xcd\x70\xec\x69\xd1\xb4\xac\xd1\xfe\xd0\x39\x0d\x0e\x8a\x3e\xab\x55\x1a\x65\x99\xd4\x12\x49\x56\x9f\xd6\x90\xb3\xe9\x95\xd3\xda\x71\xea\xea\x3f\x3c\x9c\xe3\x8a\x9c\xbd\x3c\xd1\x1c\x7b\xf8\x55\x13\xcd\x91\xf8\xbf\x11\xc9\xf9\xdf\x9c\x03\x3e\x2b\x89\xfe\x5e\xbe\xa8\xa2\x49\x52\xb2\x23\xb2\x6e\x1d\x96\xad\xc0\xd6\xef\xbe\x5e\xc1\x0b\x36\x45\xa9\x7d\x53\x2a\xb5\xdc\xc2\xfc\xe3\xc6\x76\x01\xd8\x84\xba\x23\x77\x05\x86\x10\x65\xb6\x19\x29\x22\x98\x9c\x09\xe6\x66\x66\xc4\x90\x07\xa5\xe1\x79\x7d\x91\x52\xb7\x01\xf0\x2a\xd9\x8f\x7d\xc9\xcb\xcb\x82\x1f\xe1\x2a\x86\x35\x31\x01\xfa\x0b\x6c\xbc\xac\x11\x3e\xe4\x66\x07\x98\x19\x91\x81\xb9\xec\xdb\x2c\x95\xc9\x54\x12\xf7\x19\xe2\xd1\xa2\xbb\x6a\x30\x09\xee\x35\x8b\x81\x59\x63\x46\xf6\x38\x12\xec\xb9\x8d\x06\xa8\x14\x8e\x48\xf5\x66\x46\x40\x61\x40\xd1\x20\x99\x0a\x7c\x6e\x7b\x5e\xb6\x31\xd9\x97\xfe\xb1\xda\x8c\x20\x76\x2d\x3e\x13\x4b\x97\x89\x7c\x64\x12\xc8\xac\xe4\xae\x65\x6e\x74\xe6\xb9\x40\x55\x28\x77\x2c\xa3\x14\x40\xbc\x54\x19\xd4\x3c\x3d\x1a\x36\xbf\x1b\x9a\xd7\x1d\xa1\x49\xa1\xf3\x78\x06\x3a\xcc\x5d\xbe\x96\x0a\x60\x62\x5f\xf3\xe4\xd4\xb1\x16\x8c\xed\x25\x78\x65\x03\x11\x24\xa9\x99\x3c\xc8\xec\x81\x64\x6d\xbd\xc7\x4c\x12\x2b\x35\x40\x34\x55\x41\xb2\x0f\x37\x07\x03\x03\x35\xac\x50\x85\x4d\x58\x93\xcd\xb7\x1d\xe0\x17\x10\x5e\x00\x3f\x29\xa6\x60\xd8\x10\xf4\x6e\xdd\x88\x05\xda\xe4\x28\x26\xad\x92\x60\x93\x93\x07\xe5\xd2\xdf\x0c\x1a\xcd\x74\x87\xd1\x56\x2c\x05\xa3\x82\x1e\x56\x28\xb1\x20\x27\x50\x5c\x9b\x41\xa3\x98\xb6\x37\x56\x37\x4a\x38\x86\x04\xc7\x55\x81\x3b\x77\x4a\x99\x1a\x5c\x15\x06\x3b\xa8\x80\x34\x75\x17\x28\x1e\x13\xb1\x4e\x61\x76\x4a\x8b\x66\xf2\x6d\xb4\x00\xd7\x69\xfe\x59\x3d\xf2\x6a\x04\xc0\xd6\xd6\x98\xb4\x21\x86\x81\x46\x05\xd4\x21\xa2\x90\x07\x39\xce\x66\xc4\x62\x6f\xc2\xae\x9c\x12\x3a\x92\x0b\xf6\xe1\xb1\xfe\xe8\x5b\xa8\xc9\x9d\x5b\xb0\x3a\x45\x49\xb0\xef\xd4\x7d\x69\xa8\x5a\xef\xb4\x12\x69\x8c\x0a\x67\x0b\x40\x06\x21\x60\xcb\x88\x4d\x6a\x86\xdf\xb8\xd1\x60\x53\x1f\x1e\x62\xb0\x83\x47\x4e\x64\x4f\xad\x89\x45\x16\x62\xf8\x8c\xa4\xc5\x21\x92\x49\xb3\x6f\xe9\xe7\xda\x7d\x23\x4e\xb0\x74\x3e\xe0\xa3\x51\x29\xf7\x0c\xec\x8d\x56\x99\x8a\x67\x8b\xae\xa6\x45\x63\xcb\x0f\x3b\xd5\xee\x24\x9e\x90\xb5\xb2\xb9\x2b\x94\x30\x32\x60\x64\x0f\xba\x28\xc5\xb3\xbd\x21\x0f\x28\x56\xcb\x6c\xdc\xd3\xc0\xaa\xae\xbd\x64\xa3\x36\x80\xc1\x8f\x73\xad\x0d\x7c\x6e\xcc\x5f\x00\x60\x35\xf1\xab\x4c\x86\x30\xac\x70\x48\x68\x4d\xd9\x15\xc0\x36\xb2\xbb\x02\xf6\xec\x28\x4a\x6d\xd3\xd5\x44\x67\x98\x7f\x56\xdf\x35\xeb\xb7\x3a\x02\xab\xd0\xd0\xe5\x8f\xcb\xdb\x4c\xca\xae\x4c\x3a\x26\x91\xf5\x24\xf6\xae\x14\x3e\xf4\xc8\x28\x93\x31\xb6\x9c\x99\x0a\x8a\x55\xe0\x18\x31\xf6\xec\xa1\x40\x66\xf6\x15\xb3\x84\x68\x03\x5f\x4f\x84\xfb\x41\x91\x4c\x1c\x2a\x55\xb8\xaa\x02\xa4\x31\x17\xaa\x59\x67\xb6\x9f\x8e\x34\xdc\x52\x87\x69\x1d\xf0\x3d\x14\x6c\xee\x97\x02\x88\x4b\x20\x64\x24\x78\xf8\xda\xf3\xb5\x23\x4a\x06\xf5\xad\x65\xaa\xba\xc6\x39\xb1\x82\xd2\x4a\xcf\x6f\x60\xf5\x06\x3f\x4e\x56\x90\x20\x0e\x87\xe7\x40\xf5\xa7\x50\x7a\xe0\x1c\x09\x7e\x5c\xb6\xf0\x9a\x56\x63\x65\x3d\xd9\x38\xff\x51\x53\x92\x3f\x3f\x35\x9b\x7c\x71\xc3\xf1\xfb\x94\xf2\x7d\x4a\xf9\x3e\xa5\x7c\x9f\x52\xbe\x4f\x29\xff\xad\xa6\x94\xcf\x5a\x29\xbf\x6c\x7f\xfd\x92\xfb\x20\x4a\x95\x43\xa3\x91\x74\x47\x35\x95\x3d\x53\xf3\x28\x55\x48\xce\x12\xb1\x04\x60\xa4\xaa\xc1\x8f\xb3\x19\x66\xe8\x21\x8a\xb2\xd3\xd0\xe3\x78\x53\x05\x12\x71\xae\xfb\x4c\x5a\xe0\x45\x70\x6b\x26\x26\x1c\xee\x7c\xe8\xa4\xe5\x8d\x02\x0e\xce\x8f\xfe\x60\xa1\x3e\x1a\xe0\xd4\xe0\xd0\x7e\x12\x2b\xfc\xe3\x1b\xcd\xb9\xdc\x47\xd2\x1d\x00\xca\x1f\x24\x99\x37\xee\x09\xbd\xf8\x43\x7b\x72\x6a\x23\x29\xab\x9c\x00\xfc\x5b\x7c\xe5\x4a\x9f\x28\x96\xa9\x74\x01\x95\x8e\x03\x69\x86\xd7\x71\xf7\xd4\xf4\xf3\x8e\x64\xf7\x73\x39\x37\x11\xb9\x87\xcb\x9d\xe6\x7a\x10\x2a\xbd\xef\xfd\xdb\x0e\x37\x6c\x4c\x3c\x4b\xf0\xa3\x93\x46\xc6\xe6\x39\x27\x3a\x41\xf1\xff\x1f\x2a\xbd\xfc\x55\xef\x35\xa7\x51\xb1\x09\x66\x90\xd6\xe6\x2f\x3b\x44\xeb\x3e\x3d\x6f\x54\xe0\x09\xad\x98\x42\x56\xd3\x79\x40\x54\xea\x3e\x5a\x77\x7b\x21\x33\x0d\x06\x36\x7b\x4d\x36\xa4\xba\x29\x68\x9b\x1f\x97\x0a\x65\x38\x33\xb0\x9c\x2c\x12\x65\x7d\xd3\x4b\x7e\xa2\x42\x9d\xa4\xf2\xe3\x66\xc5\xf9\x96\x44\xa9\xee\x05\xe1\x36\x76\x94\x07\x7d\xc7\x9e\x37\xb9\xf8\x1c\x56\x4e\xee\xcc\xf6\xce\x64\x4a\xc5\x12\x96\xe1\x4c\x83\xdd\xa4\x13\x07\xc5\x3f\xff\xf9\x2c\x95\x27\xf9\xe1\x1b\x59\x3c\x61\xa5\x56\x24\x74\x53\xa9\x76\x48\x7a\xa0\x58\x26\xd5\x93\xc0\xe4\x42\x23\x2b\xa9\x22\x34\xc2\x11\xc6\xf3\x82\x10\x0e\xc1\x48\x09\x7b\xc9\x59\xc9\xf5\x87\xa2\x34\x06\x62\x62\xb1\xe7\x9a\x86\xa7\x24\xc1\x86\x6e\x52\xeb\xe4\x06\x6a\x68\xba\x52\xbb\x78\xb4\x07\xc2\x88\xb9\x96\x79\x5c\xe4\x4d\x87\x46\x62\x42\xdc\x86\xa6\xce\xe3\x32\x8f\x0b\x96\x75\xc5\xc1\x55\x01\xe8\x2e\x5b\xd3\x9a\x58\x8c\xf6\x14\xee\xb0\x7d\x98\xea\x20\x46\x9a\x9a\x0f\x94\xf2\x7e\x02\x8e\xa7\xe2\xbf\x6d\x99\x04\xf1\x7a\x88\x11\x18\xb5\xcd\x53\xab\xc8\xe6\x71\x9d\xd6\x8b\xa5\x1f\x8c\xa3\xc0\x97\x1c\xfc\xb8\x54\xbb\x14\x63\xe1\x3c\xee\xde\xaa\xc9\xe4\x00\x87\x50\xa4\xad\x80\x5e\x00\x7e\xd3\x80\xc3\x42\xdc\xea\x08\xbb\xdd\x2a\x25\x65\xef\xf8\xf3\xa2\xb3\x8e\x42\x3a\xdc\x11\x1a\x09\xef\x3b\x12\x7a\x66\x80\x2f\xeb\x30\x66\x19\x88\x44\x1c\xfd\xd8\xaf\x39\x56\xca\xc8\xc8\xd3\xba\x1f\x56\x01\x53\x21\x5f\x90\x65\x26\xfb\xb4\xe3\x30\xfc\xba\x69\x48\xd8\xdf\x66\xda\xfe\x84\xcd\x77\x85\xaa\x5a\xfd\x55\xc3\x0f\xab\x4e\x8e\x55\x2b\x4d\x95\x86\x9a\x30\x3d\xae\x7e\x21\x9c\x49\x51\xa9\x32\x8f\x73\xce\xcd\x79\xee\x26\xcc\x52\xd3\x6b\x27\x93\x77\x1f\x77\x9f\x7e\xfa\x06\x56\xde\x97\x34\x96\x6d\xc9\x7d\x58\x86\x07\xea\x4b\xc9\x5b\x13\xb9\xc5\xc8\xb5\xd7\x12\x3a\xe5\xa6\xa1\x52\xcf\x23\xd8\x3c\x4e\x05\xce\x2f\xb5\x67\xf7\x39\xc5\x89\x3a\xce\xa7\x20\x18\x8e\xe1\x01\xe3\x19\x33\xcc\xf2\x48\x36\xad\xb7\x2e\x54\xe1\x02\x5e\x07\x82\x73\x4e\x4f\x31\x55\xf1\x8c\x9a\x42\xde\xfb\x93\x13\x1a\xc9\x63\x17\x91\xab\x1b\x0b\x9f\xcb\x49\x98\xb9\x74\x9a\xdb\x4e\x9e\x86\xb6\x9e\x9e\x1b\xef\xb8\x45\x06\xbf\x6c\xa3\x4f\x04\xe4\x0f\x36\xc5\x1e\x3e\x26\xb5\x66\xca\x5e\x9e\xe9\x2e\xd0\x73\x9b\xe7\xdb\x77\x63\x47\x11\xd3\xc1\xf0\x78\xd4\x19\xdf\x91\xaa\xa3\xe3\xb2\x98\x7e\x2b\x70\xf6\x36\x1b\xd0\x5a\x6a\x4d\x07\xe6\x23\x76\xdf\x55\x81\x6f\x9d\x20\x4a\xec\xf2\x9c\x47\xa8\xc3\xa3\x09\x78\xf6\x00\x76\x48\x85\xdf\x0c\x77\x0e\xb8\xe7\x1a\x10\xaa\xa3\x46\xf7\x32\x77\xce\x9a\xcd\x39\x0c\x6f\x93\x54\xa6\x11\x37\xa0\xb1\x65\x88\xb0\xa6\xee\x83\x74\x72\x4a\xc5\x13\x7f\xc3\xb2\xb4\x79\x41\x81\x06\x00\x47\x12\x36\xb3\x90\x1a\xc3\xaa\x94\x09\x12\x3b\xcf\xd1\x1a\xf0\xb6\x43\xf3\x66\xb3\x4a\x7b\x42\xde\xd6\x6a\x6c\x93\x0a\x4c\x1a\x84\x48\xd5\x66\xec\x23\xf6\xd7\x04\xde\xe8\xd3\x83\x0f\x94\xe0\x3e\x19\x75\x39\xed\xd3\xe9\xab\x01\x47\xa1\x0c\xa3\xa3\x46\x3a\x4c\x17\x18\x0e\xa2\x57\x1a\xa8\x2e\x1b\x8b\xce\xb3\x61\x6a\xd1\x99\x4c\x7a\x3d\x81\xef\x0f\x27\xf3\x16\x57\x2e\xfc\x38\x2c\x7c\xb2\xde\xb7\x32\x75\x7d\xe7\xbf\xef\xfc\xf7\xdf\x92\xff\x5e\x9a\xff\xf6\x9b\x2f\x35\xff\x39\x7a\x22\x8d\x82\x7c\xe1\x43\x2e\xe6\x5e\xeb\xc0\x26\xab\xc0\x8d\xa0\x52\x45\xd8\x41\x17\xb8\xe7\x2f\xd3\x39\xc2\x9b\x4b\x79\xe2\x77\xfb\x79\x3e\x0c\x97\xab\x7e\xde\x29\xcb\x45\x85\x4b\x24\x16\xdc\xde\xdc\x7f\x2a\x14\x6a\xaa\xe1\xc9\x42\xec\x76\x7f\x99\xbf\x0b\x04\x6c\xaa\x66\xed\x1b\xf8\xf0\xb6\xbc\x6e\xf3\x4a\x43\x9f\x5f\x58\xe7\xf2\x7e\x20\x94\xa4\x52\x6f\x65\x03\xa7\xff\x76\xcc\x71\x67\xa6\x79\xcf\xf9\x44\x73\x3f\xab\x7f\x91\xfa\x28\xf7\x49\xa2\x31\xca\x1e\xfe\x80\x91\xb1\x62\x88\xb6\xe8\xc5\x72\xf1\xc4\x4d\xec\x47\xd1\x2c\xe3\xe9\x57\x5c\xd8\x53\xd6\xab\xa2\xe7\xd9\x14\xe1\xa7\x5e\xf0\x44\x1d\x32\x71\x1d\x78\xce\xfd\x65\xbd\xe5\xfa\xf9\x96\x87\x93\xa7\x4e\xdf\xfe\x26\x3f\x7e\x7b\xf3\xdb\x76\x85\xb8\x14\x0c\x11\xa0\x48\xeb\x13\x43\x61\xbc\x5f\xea\x33\x43\x74\x71\x7c\xd7\xeb\x7a\xe4\x5e\xa7\xa2\xf8\xfa\xca\x3e\x01\x89\xce\x3e\xb9\xdf\x25\x00\x88\x58\x2c\xce\xd3\x2e\xc1\x4b\xf7\x1d\xf1\x78\xec\x91\x8a\x80\xdf\xf8\x5c\xe7\x1c\x39\x41\xda\xb9\x89\xd9\xbe\x5f\xf9\xa1\x36\xeb\x1f\xe4\x5b\x59\x34\xdf\xc9\x0f\x75\xbb\x38\xa2\x64\xf8\x6b\xe6\x95\x86\x8f\xfc\xf0\x64\x0f\x3d\xc5\xf3\x5f\x7a\x71\x1e\x09\x2f\x26\xe7\x3b\x79\x61\x86\x53\xb0\x5b\x06\xe3\xcb\x43\x56\xe5\x4e\xf2\x22\xab\x96\x23\xdf\xa7\x76\x51\xe1\x8e\xf3\x1c\xe3\xe7\x3f\x90\xef\x99\x46\xaf\x0b\xef\xbf\x92\xf5\x3f\x2f\x7c\x3f\x7c\xf8\x65\xff\x25\x9d\x7a\x85\x91\x36\x8d\xe1\x92\x5b\x91\x0d\x0b\x86\x31\x26\x64\x64\xa1\xef\xb5\xee\x62\xa7\x5a\x0f\x99\x4a\xae\x3b\xa5\x51\x37\xf0\xbf\xc3\xc1\xa9\x9d\xe1\x0c\x2b\xd4\xc6\x01\xa9\x16\x76\x42\xa3\x8c\x2d\x53\xcb\x66\x39\xe2\x12\xec\xbf\xb1\x9c\x56\x6a\x45\x3f\xbb\xc4\xc3\x42\xdc\xd9\x98\xa7\x22\x7a\xd4\x43\x8a\x6c\x16\x2d\x91\x3a\xe7\x50\x11\xad\x8c\xf4\x2e\x36\x52\xc3\x9d\xbf\x87\x6e\xa3\x99\xbd\x04\x05\x04\x69\x0e\x5a\x8b\x19\x19\xd8\xec\x4c\x00\xd6\x83\xe5\x13\x71\x0b\x13\xc1\xdf\xc5\x57\xbf\xc6\xb9\x4d\xa6\xed\x60\xe6\x6a\xd9\x0c\x78\xc4\xf9\xd1\x87\xaf\x63\x9b\xc7\x26\xf1\x97\x96\x83\x10\x43\x9b\xe7\x7a\x10\x6c\xd1\x65\x75\x2c\x66\x2a\x5c\x2e\x9b\xb1\xef\x2e\x66\x4a\x28\xc8\x04\x26\x2f\xb8\x0d\x28\x48\x4d\x48\x21\x87\x46\xae\xe5\xc1\x22\xcf\x93\x5d\x05\x1c\x84\x8d\x12\xa2\x56\xc6\x58\xd7\x93\x1d\x5f\x24\x37\x13\x02\x15\x29\x72\x64\x63\xc2\x48\x83\x1f\x9d\xea\x2b\x7c\x47\xac\x7b\xd0\x62\x3f\xf8\xa5\xb5\xd5\x95\x51\xa5\x80\x2a\x6d\xa9\x61\x17\x80\xb1\x48\x0c\xa8\xa0\x36\x00\xd3\x52\xd4\xcf\x9f\x5a\x91\x7c\x8a\xbe\xbf\x15\x0d\xbf\x00\xda\xa5\x51\xce\x0f\x7a\x11\x63\x26\x88\x3a\x6b\x75\x8b\x4e\x2a\x4e\x43\xd8\xd5\x98\x24\x84\xe0\x61\x84\x14\x1d\xc7\xdb\x97\x59\x0a\x17\x48\x7c\xeb\x32\x20\x34\xb4\x8c\x2e\xc3\x72\xf0\x40\x97\x95\x79\xce\x24\x90\x2c\xe2\x00\x08\x99\x91\x44\x4d\xa2\x09\x13\xa4\x1b\x92\x07\xdc\x87\x04\xe0\x00\x59\x6b\x63\x17\x8d\x3d\x2f\x07\x75\x6d\x3b\x63\xda\x37\x9c\x08\x0b\x8f\xcb\x12\xc9\x09\xc3\x83\x5f\x25\x62\x1b\x0b\xc1\x6e\xf6\x8a\x0c\x97\xf5\x22\xfb\x75\x69\xcb\x2c\x0a\x00\xef\x29\x90\x05\x91\x11\x42\x18\x2b\xfc\x1e\x85\xce\xf5\x11\xa3\xb0\x93\x4c\x04\xa3\x84\xfb\xd4\xcd\x4e\x50\x5a\x1e\x90\x19\x87\xf5\x99\x1a\x1e\x92\xa7\x49\x61\x56\x35\xc2\xeb\xfd\xe2\x64\xa0\x5e\x27\x47\xff\xf1\xe9\xa7\xab\x9b\xf7\x57\x1f\xaf\xbe\x05\x54\xaa\x06\x0f\x58\x61\x87\x7d\xc8\xa9\x22\xa4\xb6\x95\x61\x84\x84\xf1\xef\x76\xb6\x6f\x54\x3c\x1f\xa1\x22\x46\xd5\x26\x8f\xb1\x84\x14\xb2\x43\x3f\xd9\x6d\x4a\xb5\x8c\x68\xbc\x3f\x36\x8c\x4d\x25\x3a\x66\x0d\xce\xd8\xa9\xca\xc3\xf3\xf3\x55\x8d\x8d\x34\xe3\x3e\xf6\x44\x34\xeb\x9c\xd7\xab\x1b\x74\xfb\x58\xa7\xac\xce\x6f\x78\x89\xb1\xe7\xb6\x6e\xdd\x38\xaa\xce\x36\x22\x51\x4d\x24\xf5\x8c\x26\x54\x87\x10\x57\xbd\x50\x2a\x0d\xcb\x84\xc8\x3d\xae\xc8\x7b\xeb\x4d\x6b\x28\x23\x78\x19\xa8\x4c\xb0\xca\x20\x49\xae\xb8\x39\x0c\x45\x06\x5b\xc6\x79\x74\x6f\x18\x84\xda\xb8\xbb\x36\x11\x57\x14\x29\xe7\x8d\x95\x90\xbe\x05\x81\x40\xa4\xa9\x93\x8c\x82\xbf\x6a\x8a\x98\x36\xb5\xcf\xa2\x88\x29\x90\x48\x10\x4e\x85\x28\xc9\xd4\xb0\x05\x87\x38\x23\xdf\x32\x5c\x0f\xd2\x97\x33\x95\xe3\x05\x3c\x84\x4b\x69\xbd\x94\xda\x86\xb8\x76\xfb\x2c\x1d\xe8\x81\x30\x48\xe8\x96\xcb\x72\x4c\xa7\x11\xcf\x00\x2c\x32\x99\xb1\xd6\x2d\xd5\xbc\xc2\x29\xc9\xcc\xbc\xed\xef\xc1\xb7\xea\x95\x72\xbc\x22\xeb\x72\x44\x53\x8d\x11\x17\x2f\x86\x1c\x91\x8b\x90\x84\x79\x37\x33\xbe\x4a\x31\xc9\x70\x8c\x75\x47\x32\x51\x6c\x25\x2a\x25\x41\xc6\xca\xe4\x58\x33\x9e\x1b\x74\x26\xa7\xb6\x06\x21\xa9\xdc\x09\xf8\x09\x23\x43\xf6\x1e\x79\xc5\x97\x6a\xb2\x22\xaf\x1d\xb6\x85\x3b\xfc\x0b\x06\xf0\x5d\x6a\xdb\x14\xd2\x92\x83\x1f\x57\xb5\x00\x49\x6d\x3a\xd7\xbd\x0d\x15\xd7\xe1\xde\xe4\x6d\x41\x02\x99\x6b\xd3\x9e\x43\x33\xcf\x95\x7e\x4f\x37\xbc\x5e\xda\x3b\x7c\x88\xde\x8b\x54\xf6\x28\x1e\xcf\x39\x93\x6a\x23\xf1\x6d\xe2\x31\x28\x2b\x55\x41\x2a\xd3\x4a\x49\x91\x93\x7f\x43\xad\x57\xfb\x2c\x6c\x81\x14\xab\x05\x39\x57\x75\xe6\x5d\xed\xbe\x22\xed\x17\x3c\xad\x71\x03\x68\x17\x2b\x9b\x78\x06\x48\x81\xdf\xae\x7e\x3b\x7a\x36\x83\x9e\xc2\xac\x74\xf6\x04\xaf\x6d\xf6\x5d\x3e\xc9\x32\xde\x8e\xbf\x97\x3a\x71\xd4\x2a\x89\xbf\x2b\x97\x7b\xf1\x8b\x00\xf8\x61\x10\x78\x6e\xc5\x3e\xcb\xcf\xdc\x50\xa6\xb6\x8e\x85\xa8\x85\xc4\x05\x20\x27\xfd\xf6\x29\x92\xde\x2f\x49\x49\xcb\xc6\x91\x3a\x8e\x11\xc4\xf0\x15\xc0\x36\x3b\x1d\x91\x58\x10\x5d\xb9\x5f\x72\xa3\x62\x7b\x1e\xd9\x74\xa4\x1d\xe2\x32\x1c\x58\x66\xaf\x36\x13\x65\xac\x6f\xe4\x63\xf8\x2c\x70\xc8\xaa\x1a\x49\x90\x9c\x80\x5d\xf9\x2b\xb6\x4b\xae\x54\x97\x6c\xb2\x1e\xb0\xcc\x81\xbd\x0a\x4f\xce\x0a\xd4\x17\xe4\x8b\x2c\x9b\x8a\x1d\xeb\x93\x00\x7a\x9b\x74\x4c\xdd\x59\x0e\x0b\xb5\x89\xa8\x0d\x57\xb8\xa7\x70\x21\x63\x20\x30\x1d\x90\x74\x7b\x60\x96\xda\x18\x73\xd9\xe7\x48\xec\x65\xad\xc0\xcc\x30\x7d\xcf\xb3\x16\x3b\xb4\xc8\x92\x2d\x83\x8e\x69\xec\x19\xd1\x5e\x5b\x8f\xb1\xf6\xa0\xd4\x4e\x8e\xec\x2b\x54\x11\x66\x8f\xa8\x89\x01\x70\xa3\x3c\xd1\xbd\x00\x67\xc1\xdb\x59\x2a\x70\x7c\x11\x21\x16\xb1\x38\xe4\x28\x0b\xa9\x01\x32\x78\x15\x2e\x42\xa9\xdd\xc6\x85\x02\x97\x50\x84\x7e\x3f\x53\x36\x68\xc1\x94\xce\xfe\x88\x70\xc0\xc2\x6a\xfc\x0f\xd1\x02\x70\xa5\x51\xd0\x2d\x73\x78\xea\x84\x22\x98\x9b\x6e\x28\xa8\x4c\xa9\x82\x59\x2a\xad\x00\x44\x2e\x04\xdb\x7e\x46\xb4\xd6\xbc\xf5\x38\xf0\x84\xa8\x5b\xc4\x4f\xcf\xbc\x52\x35\xef\xe7\xdd\xa5\x6e\x80\xe4\xdb\xfa\x49\xf0\xaf\x5f\x38\xcc\x59\xce\xb4\x70\x63\x09\xe9\xe2\x72\x1b\x81\x9d\x55\x36\xf7\x3b\xdd\xc3\x4b\x65\x86\xf2\xb5\x45\x30\xf3\xf2\xcd\xa5\xc9\xf1\xd0\xee\x1d\x58\xf7\x4e\xd6\x46\x06\xa6\x48\xc0\x03\xfa\xd8\x81\x35\x95\x38\xb3\xa3\x96\xda\xe6\x71\x95\x67\x0a\x4c\x19\x35\x52\xe2\xd1\x16\xd9\xed\x73\x8a\xd7\x20\xdf\xcb\xad\xed\x35\xc8\x0f\x6a\x10\xa7\x60\xf5\x27\xea\x06\x30\x1d\x32\x8e\x70\x88\x40\xd4\xab\xba\x5b\xc4\x2e\x84\x8f\x35\x5b\x6b\xf1\xb9\x6b\x72\xc1\x3a\x37\x20\x83\xa3\x03\x3d\xe4\x99\x33\xbb\xae\x14\xa2\xc0\x49\x3e\x4e\x3a\x4b\xbd\x7b\x99\xcc\x5d\xca\x0c\x22\x36\x5a\x1d\x1b\x04\xa1\x72\x3b\xc9\x26\x0f\x70\x91\xed\x32\x29\xf8\xac\xb5\x94\x27\xde\x01\xe1\x84\x30\xa7\xec\x59\x67\xd3\x79\x32\x45\x3d\xa4\x1f\xc2\xc3\x05\x18\x0e\x9a\xfa\x8c\xb0\x46\x24\xb0\xd8\x24\x5e\xe5\x98\x64\x3c\x38\x25\x14\xa4\x6e\x5f\x66\x2c\x9f\xac\xcb\x32\x57\x9b\x74\x6b\xcd\x3e\xf7\xa9\xcb\xa4\xf8\x49\x63\x40\xbc\x3e\x1c\xfb\x99\xae\x3a\x15\xe8\x43\xe1\x34\xd3\xa4\xc0\x1d\x49\x8c\xae\x75\x4d\x24\x3f\x03\x80\x66\x23\x4d\x0b\x29\xdb\x19\x00\x25\x9d\x0a\xe0\x43\x4b\x45\xae\x63\x96\xb6\x41\xd6\xd5\x2c\x6b\x7d\x40\xdd\x5c\xd4\xc9\xb6\x2f\xa4\xc2\x2b\x55\x2c\x84\xa2\x0b\xb1\x2c\x3d\xcc\x65\xef\x2c\x6a\x4c\x54\xe0\x78\x58\x4e\xd3\xea\xb9\x2b\x5c\xe3\x4a\x82\x24\xba\x47\x70\x16\x84\x89\xb7\x6e\x06\x02\x4c\xf4\xa5\x6b\x80\x63\x90\x8b\x51\xb1\x7a\x28\xfa\xc1\x49\xed\xa8\x20\x81\xb3\xdb\x84\xb7\x60\xc4\x90\xeb\x92\xcb\x0e\xd0\xa4\x08\x7f\xf6\xa9\x22\x7b\x2e\xef\x0d\x95\x96\xe1\x9f\xb5\xd0\x31\x62\xd5\xb1\xb7\x2d\x7e\x48\x27\x80\x21\xac\xfc\x20\x11\x7d\x59\xf3\xd7\x2f\x82\x07\x08\x06\xf9\xa8\x64\xcd\x0b\xa7\x4c\xc7\xab\x00\x78\xc0\x75\x6b\x62\xee\xd9\x89\xf3\x8c\x07\x70\x5b\x66\x25\x1c\x92\xd5\x74\xe9\x6c\x64\x47\xab\x5b\x0e\x80\xaf\xb8\x94\x2d\x00\xdb\x1c\xb3\x0e\xa4\x9c\x4d\xb6\x65\x9f\xf4\x87\xef\xa6\x00\x60\xc3\x3e\xa6\xe7\x78\x2e\xf5\x8d\xe9\x49\x48\xd5\xb8\x92\x63\x33\x21\xb9\x3d\xaa\x08\xdd\x1f\x92\xa9\x82\xb8\xc6\x21\xf3\xd3\xf3\x14\x30\x03\x89\xd5\xcb\x4c\x29\xdf\x98\x52\x1d\x7b\x80\x36\x98\x3d\x89\x7c\x7d\x6c\xb6\x04\xa2\x4e\x4a\x35\x43\x75\xe3\x80\xe8\x27\xa4\x27\xd0\x1b\xb6\xae\xce\x86\x55\x9d\x3d\xd5\x66\x4f\x98\xe7\x84\x49\x90\x7d\x78\x0f\x10\x88\xd1\x8d\xf6\x04\x5b\xef\x52\x8f\xab\x0b\xd8\x30\xa9\xdd\x2a\xc5\x2e\x56\xe7\xfb\x3d\x4f\x71\x74\xc0\x37\x01\x86\xd1\x1a\xf5\x04\x78\x7c\xae\x9e\x7a\x36\xc2\x06\x8c\x66\x5c\x4f\xbd\xa3\x0c\xde\xc0\x57\x24\xf8\x71\x9d\xa5\x91\x7f\x70\xf8\x84\xb1\xa1\x2e\xcd\x3e\xc7\xcb\x8e\x44\xa1\xdc\xed\xb3\x12\x0d\x86\xbe\x51\xe7\xee\x19\x72\x97\x48\x6d\xd7\x9a\x2e\x95\xba\x6c\x9d\x5a\xe7\x8f\xea\x94\xeb\x92\xa8\x88\x7d\x56\xb2\x00\xa2\xe5\xd6\x88\x07\x28\x25\xb9\x92\xb0\x8f\x75\xd5\xc3\xa2\xe3\x78\x7f\x39\x3e\x86\x73\x2e\xe0\xac\x9a\x09\xe3\x6c\x9f\x93\xb9\xcc\xf8\xe0\xb0\x68\x56\x8e\x46\xe3\x20\x14\x70\xdb\x4d\xc5\x6c\x23\x24\x95\x37\xa3\xd7\x49\xa6\x37\x68\xa8\x26\x46\x87\xa9\xd5\x7d\x3f\x95\xf7\xe2\xbd\xee\x92\x77\xce\x70\x55\x4c\x23\xaa\x6b\x1a\x65\x87\x9d\x66\x68\xe3\xa0\x1f\xae\x03\xc4\x93\x01\x9c\xd0\xa8\x64\x93\x37\x15\x38\x8c\x33\xfd\xf4\xfa\x4a\x28\xc7\xf6\xb7\xab\x0f\xc1\x63\x4a\x43\xcf\x6e\x57\x95\xcf\x65\xb7\x8c\x3a\xb3\x01\x1b\xb1\x65\xc0\xc2\x1c\xf5\x00\xc7\xc9\xec\x54\xd8\x8c\xcd\x63\xbe\x5f\xbc\xcc\xc8\xb6\x38\xba\x09\xf0\x76\x26\x7b\x00\x34\x73\x03\x04\x7f\x3e\xe1\xb2\x45\x40\xf8\xdc\xca\xd3\x92\x92\xf5\xc2\x7e\x25\xce\x0d\x9c\x21\x3d\xcd\xfb\x71\x68\x39\x3f\x10\x02\x53\x06\xa8\x13\xf6\xe8\xc0\x2c\x80\x1e\x59\xb3\xce\x90\xcf\xb8\x88\x81\xa9\x3e\x82\xea\xd3\x22\xd0\xa7\x33\xef\x93\x82\x61\xc9\x04\x80\x5c\xad\x3c\xa1\xa2\x8e\xd9\x5a\x6b\x86\xdb\xb9\x0e\xfb\xdc\x9b\xc0\xcd\x90\xbc\x0f\x28\xeb\x3f\x97\xfd\xf4\x95\x72\x1b\x7d\xa2\xde\x79\x36\x7a\x80\xa8\x2a\xdb\x00\x30\x36\x20\xd7\x47\x4d\x88\x1c\x8c\x5a\x31\x23\x80\x8a\x29\xd7\x02\x79\x52\xb1\xde\xc0\x5d\xa8\xc1\x6d\xbe\xab\x6e\x0a\x15\xa8\x46\x47\x79\x31\x80\x3b\xdb\x75\xef\xfd\x54\x66\xdc\xf0\x33\x56\x51\x7e\x68\x15\x6d\xe0\xfd\x2c\x8b\x8b\x16\x66\x4b\xef\x79\x88\xdd\x06\x8c\x40\xeb\xfd\x06\xe8\xd4\xb9\x04\xb0\x52\xe3\x18\x73\x6a\xf6\xaf\xcd\x41\x29\xb5\x63\x7e\x15\x78\xc3\x9a\x22\x9a\xad\xbc\x7a\x2a\x06\xbd\x2e\xae\xc2\x6c\x90\xea\x9a\x57\x17\xef\x55\xed\x71\xd5\xe6\xbe\xf5\xc7\x7a\x77\x8d\x10\xe7\x1c\x8d\x79\xf6\x64\x33\xa4\x51\xb9\xc9\xc0\x6a\x5f\x3c\xd7\x47\x2e\xbb\x48\x15\x7e\x90\x88\xed\x43\xab\xec\x06\x42\xd6\xd9\x7a\x77\xad\xc8\xb9\xc0\x84\xb4\xe6\x46\x7e\x6d\xc0\xe8\x1c\x66\x83\xa2\x5b\x55\xe0\x95\xc9\x45\x1d\xe9\xe6\x74\xbb\x82\xe7\xb2\x80\xa9\xcb\xb9\x38\x2a\xd6\x1c\x92\xee\x13\xd8\x1e\x88\xd5\x91\xa9\x64\x97\x5b\x60\x76\xab\x4d\x57\xb5\x1f\x03\x53\xce\x1e\x15\x0f\x63\xa4\x37\x44\xa3\xaa\x62\x17\x7e\xbc\x01\x24\x66\xf0\xe3\xba\x0c\x54\x46\x68\x64\x82\x87\x3d\x35\xf1\xd0\xed\x51\x40\xc8\x44\x0a\x6f\xb0\xdf\xee\xd9\x22\x26\x33\x47\xb6\xca\xdd\xbd\x65\x98\xf5\xa1\x51\x2b\xfb\x09\x09\xab\xb2\x9e\x38\x8e\xa7\x90\x14\x34\xb9\xd8\x67\x69\xb2\x4d\x77\xb5\xde\x6f\xb1\x4f\xea\x49\xb1\x97\xd4\x7d\x47\x5c\x37\x9e\x13\x76\xc9\x0c\xeb\xf2\xcf\x44\xb3\x19\xf5\x36\x84\xec\x28\xfe\xa4\xe3\xa2\x93\xb4\x30\xa8\xe9\xd8\x58\xbf\xc0\x5d\x3a\xaf\x3a\xb9\x71\xbb\x50\x2b\x63\x2f\x9e\xe3\x18\x0a\x83\x74\x92\x95\x5e\xac\x7c\x33\x04\xef\xb5\x77\xda\xcf\x45\xf8\xee\x6d\xa3\x3e\x02\x03\x16\x6b\xef\x61\x0d\x04\xb4\xec\x4e\x79\xf5\x61\xb3\xc1\x31\x3a\x42\xce\xdb\xc4\xa7\xab\x31\x22\xc6\xdd\x1d\x20\xbf\xa9\x6d\x1c\xc7\xd5\x8f\x8b\x81\xb2\x20\x12\x5c\x03\x1f\x0e\x6e\x1b\xba\x35\xc9\x8e\x50\xe3\xea\x50\x90\x00\xc8\x74\x58\xb0\x3a\x91\x8a\x61\xec\x1b\x71\x76\xcf\x3d\x08\x84\x1d\xbb\x00\xaf\x14\x2b\x1a\x16\x49\xde\x4f\x70\x33\x90\xe7\x86\xca\x18\xf6\x59\xf5\x3d\x4c\x1a\x1e\x6b\x63\xda\x2e\x4c\xf8\x9c\x7d\x22\x04\x8d\xa6\x01\xc8\x5d\x46\xee\xf8\x04\xf8\x3d\xc0\xde\xd1\xc8\xb0\x06\x40\xec\x76\x76\x77\x9d\x09\xfe\xad\xa9\xda\x70\x68\x45\x4b\x4f\x4c\xb1\x5c\x00\x03\x8d\x1e\x01\x02\x04\x0b\x48\x6d\xd8\x67\xe9\x4c\xe8\x7a\x90\xb7\x3a\xec\x73\xef\xf7\xa4\x18\x85\x92\x09\xb9\x8e\x01\x48\xb8\x2e\x60\x9b\x09\x68\x5d\x7d\xb2\xcd\x23\xf5\x2f\x3f\x3e\xc6\x61\x39\x59\x5b\xfe\x46\xf6\x31\xbe\x2f\x30\x7f\x5f\x60\xfe\xbe\xc0\xfc\x7d\x81\xf9\xfb\x02\xf3\xf7\x05\xe6\xef\x0b\xcc\xdf\x17\x98\xbf\x2f\x30\x7f\x5f\x60\xfe\xbe\xc0\xfc\x7d\x81\xf9\x37\x2c\x30\x6f\xcc\xf8\x42\xb4\x6a\x5e\x85\x69\x19\x00\xb2\x7a\x72\x65\xf9\x79\xd6\xa8\x6c\x9f\x87\xac\xf1\x7d\x59\xf9\xfb\xb2\xf2\xf7\x65\xe5\xef\xcb\xca\xdf\x97\x95\xbf\x2f\x2b\xff\xd1\xcb\xca\x48\x89\xc6\x1e\x38\x7f\xb2\xae\xfc\xbb\x97\x93\x2f\x3a\x0d\xad\xa1\xd3\x70\xdf\xdb\xe7\x97\x93\x8f\x85\xdd\xbd\x1d\x34\xb4\x04\x23\x13\x3d\x2e\x2c\xf7\x2f\xbf\xb0\x2c\xdf\x17\x96\xff\x8b\x2d\x2c\x7f\xd6\x73\xf9\xfa\xdd\xf6\xe6\xc3\xed\x87\xbf\x7f\x29\xec\x57\xc4\x61\x85\xbc\xb3\x29\x9a\x0f\x38\x9e\xe7\xcb\xd3\xd0\xa4\x5c\xb2\x94\x87\xe1\x06\x2a\x23\xe4\x73\x99\x4f\xec\x22\xfe\x9c\x3e\xd6\xf9\xcf\x67\xe9\x41\xb8\x57\xf0\x07\xbd\xac\x4b\xe1\xf3\x7c\xf0\x07\x4f\xb0\xce\xcb\x9b\xfa\xd7\xf4\x54\x69\xfe\xe7\x5c\xec\xc1\x59\xde\xa3\xa7\xff\xfa\xd7\x3f\xbf\x49\xfd\x33\x7d\xf8\x85\x23\x9a\x9e\xea\xc8\xeb\x81\xea\xa7\x27\x3a\xeb\x73\x3d\x72\xf2\xd8\xf3\x0d\xfe\x2c\xe5\x7c\xf8\xc7\xc7\xcd\x97\x24\x1a\xd3\x9a\xc3\xa0\x22\x7d\xe3\xe7\x7e\x74\x00\x98\x84\x6c\x6a\x2d\xdc\xbf\xe2\xcc\x8c\x2b\x77\x6f\x19\xd9\xde\x43\x23\x53\x83\x86\x1b\x40\x66\x2c\x40\xa9\xc0\xf6\x03\x72\x82\x04\xa6\x32\x53\x4b\x95\x4e\x6c\x62\xb1\x65\xe4\x65\x92\x96\x77\xc6\xa8\x5b\x44\x0d\x7a\xd2\x17\xe2\x24\x9e\xdb\xad\x97\x03\x8d\x82\xf4\x47\x9e\x39\x10\xd8\x2c\x71\xe6\xe4\xe7\x1d\x18\xfd\x9e\x98\x05\xf4\x99\x8c\x83\x95\x9d\x31\x39\xcb\x04\xa9\xf2\x15\x34\x9b\xd1\x3b\x6f\x18\x8b\x61\xbc\x2e\x89\x25\x40\xb7\x01\x35\xcc\xf1\xfc\x45\x8f\xc9\x12\xbb\x59\xb7\x7b\x20\x9a\xb1\x29\x0d\xf7\x97\xcf\x91\xb6\xcc\xf1\xc7\x29\x89\x1f\xfc\xf7\x8c\x69\x5e\x68\xa4\x71\xd9\xcc\x08\x83\x21\x61\xba\x8b\x78\x3a\x20\x01\x92\x56\x96\x1d\xd6\xd8\xef\xae\x0b\x55\x80\x9a\x41\x47\x2d\xca\xa8\x56\xd2\x81\xa8\x09\x46\x46\xb7\x8c\x64\x6d\xec\x36\x38\xde\x85\xa4\x4e\xa5\x9a\x01\x85\x13\xbc\xac\x9e\x0c\x87\x98\x5d\xee\x36\x56\x01\x72\x86\x78\x7c\xb3\xd9\x15\x5b\x7c\xb5\x79\x8f\x00\xc7\xa2\xa5\x20\x01\xb3\x9f\x79\x4a\xe8\x56\x88\x71\x94\x03\x53\x6a\x48\x67\x95\x91\xc4\x55\x0b\x22\xe1\x5a\x6d\xfe\xd7\x17\x65\x11\x33\x5e\xb1\x72\x68\xaa\x0b\xf2\xe7\x34\x29\x8f\x08\x0c\x6b\xae\x35\x16\xca\x2c\x77\x6f\x91\x21\x6c\x12\x12\x12\x31\xcc\x1c\x9c\x05\x7f\x05\xb9\x65\x80\xab\x25\x18\x56\x31\x9d\xc6\x71\xc1\x2a\x54\x7e\x64\xa8\xf1\xd4\xbe\x5b\xb7\x05\x61\x2e\x1f\x33\xf2\xc2\x8a\xd8\x90\x4a\x9f\xe9\x3b\x5c\xd4\x43\x3f\xe0\x9d\xd3\x8b\xe9\x15\x4b\x96\x1f\x69\x03\xd6\x9b\x60\x2b\xba\x0d\xeb\x9e\x31\x90\x6f\x3a\x7b\xf6\x6d\xe4\xd4\xf4\x15\xb4\x96\xdb\xde\xde\x65\x3a\x1f\xd4\x13\xe4\x23\x64\xa4\xd9\x69\xc4\x8a\xb4\x31\x33\x21\x5c\x42\xd4\x1a\x68\xb7\xb2\x19\x7d\x80\x11\x5a\xf5\x15\x58\x05\xc8\x1c\x83\xe5\x3d\x2c\xbe\x03\x97\x0f\x59\xc3\x61\x4f\x9c\x2e\x55\xb2\xf5\x0f\x62\xe0\x15\x2a\x93\x1d\x86\xa9\x1e\xd5\x48\x62\x35\x00\xd4\x4c\xc2\x5e\x0f\x4c\xad\x30\xf8\x09\xea\x48\x02\xda\x8b\x77\x71\xb6\x2a\x25\x5f\xa6\x2e\x9e\xf6\x06\x59\x88\xfc\x44\x24\x1b\x11\xf3\xf0\x3c\xaa\xd9\x67\x6f\xe1\xe1\x57\x79\x18\xdd\xf1\xdd\x75\xc4\x62\xa1\xd9\xfe\xb9\x6d\x90\x6a\x70\xe6\x1b\x64\xc8\x94\xec\xf9\x8d\x8f\x3f\x2f\xd1\x74\x49\xee\xae\xd9\xb3\x88\xa4\x07\xcf\x25\x7f\x0e\x78\x8b\xa7\x0f\xa6\xe5\xc1\x93\x2c\x1b\xed\x2f\x67\xfc\xb4\x14\xfd\xd2\xd3\xc6\x77\x51\xfa\x5d\x94\x7e\x17\xa5\xdf\x45\xe9\x7f\x0f\x51\xfa\x79\xad\xf4\x66\xb3\xfd\x62\x11\xed\xbf\x09\xc6\x3f\x20\x5b\x66\xdd\x54\xca\x12\x70\x48\x53\xda\x66\xa9\x76\xe4\xba\x6b\x94\xb5\xbf\x79\x78\x87\x2c\xcf\x86\x87\x57\xb8\x50\x6d\x1a\x2a\x50\x3a\xea\xe3\x07\xe7\x73\x77\xd7\xdc\xb0\x17\xb4\x41\x26\x2b\x1c\x9c\xf0\xec\xb4\xd8\x0f\xbd\x9f\x23\x07\xef\x93\x77\xa8\x1d\x7b\x7b\xf3\xe0\x5a\xe8\xa4\xc0\x20\x94\xb1\x43\x00\xfa\xc3\x87\x71\xaa\xfe\xfa\xd3\xd8\x6c\xfe\xb3\xc8\x73\x23\xf5\x8d\xf8\x34\x7d\x1f\xae\xd7\x70\xd7\xed\x7e\xb3\xfd\xc7\x37\xc0\x5c\x8a\xbd\x20\x46\xe6\xe5\x8d\x98\x90\x0a\x7e\x9c\x1d\x6b\xb3\x7f\xc4\xf1\x80\x3f\xe7\x78\xe0\xf1\x9d\xb8\x18\xd6\xc3\xe3\xb7\xe0\x60\x53\xb6\x58\x57\x73\xe5\xcf\xbd\xe3\x60\xb7\xe1\x06\xa0\xda\xae\xde\x3a\xf7\x0b\x79\x7c\x0d\x6f\x38\xc4\xf5\xe9\xc7\xaf\xc7\xe1\x84\xa3\x12\xff\x58\xde\xfc\xae\x6c\xef\x0d\x5e\x10\xd6\x1d\xfd\xb9\x8e\xc3\x71\x67\x87\xcb\xcf\x75\x5b\x7c\xba\xdb\xe2\x49\xb7\xa1\xc7\x42\x21\x49\xe3\x71\xb7\x1c\x5f\xb2\xfb\x5c\xd3\x5f\x1c\x9d\xdd\x67\x7a\xfd\x41\xbf\xe5\x7a\x56\x4e\x56\x7f\x7e\x23\xb0\x68\x35\xdd\x89\x4d\x13\x79\xa6\xe7\x1e\x8e\xe3\x33\xcd\xfd\x5c\x9f\x1d\x9e\xee\x89\x27\x69\xf1\x99\x0e\xf3\xf1\x3b\xac\x83\xf8\xd9\xbe\x79\x4c\x91\x4f\xd1\x9b\xfc\xf8\xe7\xda\xfe\xf2\xfb\xfa\x4d\x1c\xf9\x0d\xdd\xf7\xb9\x86\xed\x3e\xd3\xf2\x17\xab\xfa\x32\x05\x39\x31\x86\x97\x78\x8c\x77\x71\xed\xbd\xcf\x8e\xc3\x33\x14\xf9\x90\x51\xcf\xfe\x2c\xf2\xe3\x33\x62\xf4\x1b\x99\xf9\x2a\x09\x86\x27\x1b\x8f\x32\xd2\xaf\xf1\xea\x4c\x24\x84\xad\xbd\xf0\xe4\x95\xf8\xe4\x95\x30\xaf\xec\xec\x37\x39\xd8\x19\xfc\xe1\xee\xae\x91\x66\x20\xa4\xc7\xc5\x84\xcf\xbe\xcc\x3e\xc6\x17\xf5\xcd\xe3\xcb\x83\x72\x0d\x22\x4f\xd7\x1c\x6a\x32\x83\x21\x2b\xef\xbc\x0e\x56\x52\x27\xc5\xba\xf9\x33\x4d\x7a\xa6\x18\x0e\x4f\x14\xb3\xd6\x0f\x8d\xdd\x79\x79\x5e\x12\xac\xba\xfa\xfc\x23\x4f\xf7\x69\x40\x7f\x3d\xd3\x5a\x41\x45\x9e\xef\x3f\xe3\xa1\x2a\x77\xd7\x68\xa0\xfd\xf8\xfc\xad\x4f\xbd\xdd\x5f\xff\xc4\x43\xc7\x8a\xf9\x98\xa2\x2c\x6f\x25\x72\x47\x3c\x35\xa6\x2f\x93\xce\xe1\xb9\x66\x1a\x35\xea\x67\x7b\x7b\xb6\x13\x65\x3c\x33\x9a\x2f\x77\x73\xfa\x6c\xdd\x7c\x40\xed\x74\x0e\x67\x7c\x7a\x38\x5f\xc1\x08\xcf\x8d\xa6\xf3\x9d\x3e\xdf\x77\x69\x92\xc2\x42\x53\xaf\xd2\xd1\x0e\xd7\xff\xdc\x7c\xd1\x44\xbd\x8a\xec\x1a\x9d\x6a\x85\x33\xa6\x19\xac\xa5\xd6\xe8\xde\xd4\x5d\x04\xab\x01\x48\x88\xd0\x23\x99\xc9\x59\x4b\xa4\x36\x0a\x0d\x69\x48\x62\x1d\x98\x14\x49\x70\x35\xc3\x2b\x27\xb7\x2d\x12\x30\xf4\xb2\xec\xd5\xcb\xe8\x66\x00\x02\x47\x53\x46\xa7\xee\x8b\x24\x5c\x91\x16\xa5\xfa\xb5\x88\x6b\x7b\x64\x66\x8c\x4a\x70\xf2\xec\xf6\x59\xac\x7e\xa4\x80\x96\xe4\x4e\x1d\x30\xf8\x73\x25\x2e\xf8\x93\x8b\x1c\xac\xf3\x8b\x59\xc9\x8d\x2b\x65\x14\x9c\xb1\x8a\xc5\x99\xfd\xfc\x96\xdd\x11\xa1\xe0\x22\x4f\xdc\xd0\x7c\x88\x99\x7a\x62\xb3\x91\x5b\xce\x54\x18\x89\xa4\xe1\x46\x0e\x2f\x5e\xa6\x3a\xda\xac\x31\x02\x03\xec\x04\x57\x0f\xf3\xc1\xa5\xcc\x71\x52\xa6\xf8\x39\x35\x64\xf7\x66\x34\x6b\x2d\xb9\x3d\x53\xf2\x5a\x70\xea\x4b\xc9\x75\x96\x2c\x6b\xd1\xf2\x64\xd9\xfd\x71\x7b\x81\x53\xf9\x7c\xd9\x6a\x66\xcc\x19\xe4\x04\xb3\x06\x49\xd4\x4a\x09\x3d\xf0\xc0\x5a\x48\xdf\xda\xd0\x5b\xcb\xa3\x20\x48\x00\xe9\x4c\xef\x9d\x93\xc2\x53\xad\xe6\x15\x5b\x36\x01\x31\x2c\xa3\x90\xe4\x19\xb9\xc5\xdf\x00\xbc\x58\xbf\x3a\xcf\x48\xc7\x58\x9e\xce\x8e\xa3\x8a\xeb\xa9\xac\x0f\xa7\xee\x28\xb0\xa3\x90\x0e\x63\x24\xcf\x46\xdf\x1c\x60\xb2\x14\x40\x62\x21\x52\x64\x8c\x6a\x54\x73\xb2\xa7\x58\x47\x2d\xf5\x71\x00\xce\x64\xa8\x2f\xbc\x48\xfb\x9d\xab\xbe\x73\xd5\x7f\x47\xae\x7a\x6e\xae\xba\xbe\xfa\xf9\xdd\x26\xfe\xba\xf9\x74\xbb\xf2\xd3\xcb\xfc\x12\xfe\xf9\xee\xe7\x8f\xbb\x3f\xfd\xd0\x7f\x08\xbb\xab\x77\xbf\xec\x3e\xe2\xf4\x1e\x1f\xf6\xd0\xef\x65\x53\x09\x7c\xa8\x3b\xb9\xe4\x73\xbe\xbb\xd6\x90\xe6\x97\x72\xf7\x44\x5d\xf6\x9b\x7f\x7d\xf1\xaa\xec\x6b\xcc\xb1\xc6\x7c\x5a\xfe\xf5\xd5\xfb\x4f\x5f\x75\x35\x25\x70\xdf\x71\x3d\x44\x39\xd7\x83\x98\xaa\x53\xee\x7f\x6d\x07\xd9\x71\xbd\xac\xe7\xfa\xd2\xb0\x5e\x5f\xdd\xee\xbe\x36\x88\xba\x7b\x10\x0e\xac\x87\x23\x6c\x05\x49\x8d\xe0\x9a\xfa\x26\x87\xc5\x6d\xb2\x1a\xa3\xa5\x64\xba\xfd\xe8\x65\x1e\x17\x35\x9b\x65\x8b\xbc\x40\x85\xd4\x53\x5e\x28\x02\x16\x91\xf7\x5b\xca\xc9\x5b\xda\x9a\xac\x15\x29\x85\xca\x3c\x4e\x3d\x56\x82\x6c\x21\xe0\x1c\x6f\x51\x1b\xb1\x67\xaf\x6e\x42\x45\xdb\xe6\xf8\x1e\xa5\x9a\xba\x5d\x19\xe5\x8d\xbd\x02\x58\xc3\xab\x9b\xa2\x78\x8d\x02\x15\xf7\x83\x42\xd2\x33\xce\x91\x18\xbe\x44\xb5\x1c\xdf\x04\xf4\xcd\x6e\x76\x6e\x11\x64\x15\x43\x03\x1b\x9f\x54\x49\xee\xae\xe1\x21\x89\x2c\xe7\x6f\x1a\x8d\xa6\xc1\x8f\xc7\x7b\x4c\xa1\x47\xb2\x93\xa3\x8b\x54\xeb\xcd\x53\x72\xed\x05\x7b\x40\x05\xa6\x6f\x26\x1e\x40\x6c\xec\x6b\x1d\x52\x20\x55\x64\xd9\xee\x77\x6f\xb9\x52\x29\xf6\xfa\xea\x11\x9c\xc0\xa4\x64\x6c\x1d\x68\xd2\x80\xfc\x60\x1b\x71\x5c\x5b\x1c\x67\x1d\x10\x13\x4a\x45\x79\x8b\x44\x4f\x59\xba\xcb\xaa\x5a\x65\x91\x49\x89\x21\x93\x10\x58\x91\x6a\xcc\x36\x29\x4d\xa4\x78\x25\xed\x8f\xdf\x6a\xd5\x6f\xdd\x2a\x77\xf7\xb6\x53\xef\x19\x18\xe6\x7b\xa5\x8c\x76\x20\xf2\xb1\x14\x8d\x42\x03\x6b\x15\xa7\x1d\xc0\x91\xea\x00\x6a\x7e\x79\xd3\x29\x99\xd9\xb1\x64\x46\xb1\x0e\xd3\x4d\x43\x2f\xb7\xb5\xaf\x53\x04\xee\x30\x35\x44\x0f\x8c\xde\xe7\x71\xce\xa2\xec\xc9\xfb\x44\xef\xae\x33\xbc\xe5\x94\x7a\x47\x9a\x67\x1b\x19\x40\x54\x5b\xd9\x78\x76\xac\x9e\xe2\x5c\x88\x91\xc8\x59\xcd\xec\xa9\xcd\x43\x64\x90\xd5\x27\x17\xec\xb1\xd5\xbb\x6b\x00\x1b\x5b\x4d\xd5\xef\x2d\x7e\xef\x26\x53\xc2\xc6\xdc\x3a\xa2\x75\x50\xe9\x6a\x14\xd0\x51\xf3\x15\xed\x59\x17\x06\xe0\xa6\x08\xfd\x14\xe4\x32\x6b\xa9\xcd\x46\x49\xb7\xe9\x4d\xa9\xf4\x8a\x2d\xdc\x91\x4c\x21\xb1\xe1\x1e\xa1\x6c\x24\xc8\xdc\xfa\x53\xac\x72\xcb\xfa\xda\x74\xf7\xb6\x87\xfa\xd9\x1b\xae\x19\x09\xee\x96\x5b\x90\x89\x68\xbd\xc5\xfe\xe9\xdd\x75\x1c\x41\x3e\xfb\x92\x97\x27\x9f\xdb\xdb\xcd\x2f\x57\xd1\xee\xfa\xba\xdb\x0e\x29\xc8\xb9\xda\x0c\xef\xc4\x3c\x06\x0d\xfc\x09\x72\x61\xac\xba\xd7\xa8\x3b\xd6\x2d\xae\x07\x89\x34\x82\x44\xb9\x54\x1f\x9d\x48\x23\x8a\xfd\xbb\x7b\x5b\xc3\xd8\xb1\x1c\xe4\xbc\x5e\x8e\xbb\xeb\x1e\xca\xb9\x09\xf0\x5d\x37\x01\xae\xb1\x9e\xd7\xcb\x8a\xeb\xaf\xee\x9a\x0f\x9f\x3e\xee\xdf\xbd\xff\xca\x9b\x32\x7f\x54\xef\x68\x50\x9b\xd1\x58\xce\xf5\x52\xef\xae\x4d\xcb\x3a\xaf\x36\xa9\xc9\x65\xbd\xbb\x4e\x21\x2f\xdf\x86\xf5\x24\xa3\xdf\xd0\x81\xaf\x98\xef\xac\xb7\x9e\xec\x24\xfb\xff\x7f\x63\xca\xeb\x21\x9d\xcb\x19\x02\x60\x29\x31\x0d\x08\x84\x0b\x2b\xfd\x99\xfe\x91\x27\xfa\xa7\x39\xf5\xe8\x65\x73\xea\xd1\x7b\xd4\xa3\x97\xfa\x4a\xea\x79\xf7\xfe\xd3\x6d\xdc\xbe\xbb\xd9\xee\xbf\x01\xee\x5a\x52\xaa\x2c\x19\x55\x70\xc2\x72\x6b\xd3\x43\xe0\xb4\xfe\x8f\xf3\x87\xc8\xe9\x6f\x48\x61\xb1\x64\xb0\xb8\x2e\x81\xf9\xbc\x59\x5f\x70\xfa\xad\xcd\xff\x16\x38\xa8\x05\xe6\x03\x2a\x1f\xe5\xbc\xdd\x5d\x97\x38\xfe\x73\x1d\x92\x02\xf7\xad\x5d\x06\xcc\x72\xcc\x54\x46\xec\xb1\xdf\xfa\x49\xe8\xf6\x09\xf6\xc5\xb4\xdf\xe8\x27\xf6\xdb\x2b\xbb\xee\xd7\xfd\xe6\xdd\xfb\xaf\x4b\x33\x3d\x70\x76\xe1\xf9\x1b\x28\xfe\xf6\xff\x7c\xda\xdc\x7c\x0b\x14\x3f\x42\x3e\x2f\x8b\xc4\x94\x60\x2c\x1e\xe4\xc0\xba\x85\xfd\x69\x02\xc0\xfe\x3d\x21\x14\xca\x43\xa1\x70\x1d\x25\x70\x7a\x3d\xf1\x5f\x7f\xf8\xf9\xd3\xfe\x69\x49\xf8\x9f\xcd\x88\x59\x42\xdf\x47\xa4\xe2\xeb\xfd\x62\x98\xc9\x1b\xb8\xee\x0b\xf5\x86\x60\x66\xc9\x17\x76\xcb\xb3\x15\xfc\xcd\xbd\x08\x8d\xa9\x5d\xf0\x08\x82\xc0\x22\x20\xed\xab\xe6\x8b\x82\x2f\x22\xc1\xef\xb8\xbb\x46\x56\x9e\x7a\xc1\x2d\x20\x14\x35\x99\x19\xa0\x7c\xd1\x70\xca\x23\x98\x1e\x5f\x5e\x61\x0c\x7f\xb8\xb9\x8a\xbb\x0f\x37\xef\xee\x3e\xbc\xff\xb8\xf9\xba\x24\x54\x03\xa7\x87\x04\x74\xbb\x10\xce\x4a\x2f\x27\x74\xc2\x12\x7e\xdb\x03\xb1\xfe\xb6\x07\x5e\xd5\x7b\x87\xab\x9b\x8f\xef\xb6\x5f\xb9\xef\x58\x42\x7f\xc0\x58\xb7\x6b\x3b\xd6\xb6\x86\xa5\xad\x26\x4e\xe5\x37\x75\x5d\x0a\xf5\x0f\xec\xb9\xf7\x57\x1f\xff\xf9\xe1\xe6\x1f\x5f\xb5\xc7\x52\xd0\x83\xee\x4c\xc1\x88\x66\x0b\x85\xba\x63\x2a\x6f\x98\x90\x35\x7d\x31\xb0\x6a\xe8\x54\x0e\xf1\xd1\xef\x4a\x25\xc8\xee\xd1\xef\x98\x81\x0e\x0f\x7f\x1d\xf6\x2d\x9d\x33\x1f\xf8\x3c\x6f\xdc\x51\xcd\x2d\x1e\xd9\xe5\x03\x9f\xeb\xa3\x72\x73\xe0\xf2\xc4\x8b\x50\xaa\xec\xca\xe6\x41\x6d\x90\x22\xed\x89\x6a\xa2\x60\x3d\xef\x87\xc8\xbb\x7e\x80\x3f\xeb\x83\x67\xe3\xfc\x76\x78\xe2\x9d\xf6\xf9\x4c\x59\x8f\x5f\x64\x9f\x73\x46\x69\xf7\x9a\x19\x65\x17\xed\xd7\xbb\xb7\x25\x48\x3a\x44\xdd\xe9\x41\xcf\xcb\xdd\xb5\xcd\xf7\x36\x06\xf6\x53\x7c\x71\x89\xe7\x87\xf7\x1f\x7e\xbe\x8a\xef\xde\xbf\xfb\xf8\x94\x9e\xf7\xfa\x85\x33\x23\xaf\x65\xe5\xcc\xce\x9f\x20\xbf\x7f\xff\xb7\x5f\xee\x51\xe0\x13\x84\xf5\xef\xff\xe6\x95\x08\xdb\xff\xf8\xd3\x0f\x9c\x7e\x08\xdb\x7f\xf9\xdf\x1b\xff\xf3\x44\x53\xc2\xc7\x9b\xcd\xfb\xdb\xbf\x7f\xb8\xb9\xfe\xd3\x0f\x38\xdd\x6f\x3e\x5e\xfd\x4f\x09\xf2\xbf\xee\x4d\x16\x88\xf7\xf9\xeb\x89\x52\x70\x50\x53\x0b\x4c\x11\x36\x2b\x96\xf5\x3e\x09\x4d\xcf\xc7\xe9\x4f\x70\xb7\xbe\x6a\xbb\xdf\xdc\xde\xfe\xe9\x87\x9f\xf6\xef\xde\xff\xe3\xdd\xfb\x5f\x7e\x78\xea\xdd\xcd\x5e\x7d\xd9\xe6\x9b\xfb\xe7\x5f\x1c\x3e\xfc\xba\xd9\xbe\xfb\xf8\xaf\x3f\xfd\x40\x25\xb9\x5b\xdd\x2f\xa7\x83\x73\xbd\xf9\x39\x62\xdf\xe2\xfd\x6f\x18\x93\x7b\x9d\x5f\x06\xd5\x50\x3b\xf1\xbd\xfd\x89\xec\x7e\x02\xfd\x20\x42\xed\x22\x17\xca\x41\x65\x1f\x0b\x95\x98\x49\xa3\xcd\xc4\xf9\xc0\x4c\xba\x8f\x9d\x46\x28\x54\x2f\x73\xa2\xb6\xcf\x66\xb1\x91\x46\x92\x90\x09\xf9\x71\xc2\x20\xe4\x75\xbd\x94\x44\x7a\x77\x9f\xb4\x3e\xbe\xfb\xfb\xbb\xed\xe6\xe3\xbb\x0f\xef\xe3\xcf\xef\x6e\x37\x3f\xed\xaf\x7e\xfe\xda\x26\x28\x77\xe2\x71\x51\x48\x7c\x31\x26\x20\x3c\xb3\xee\x85\x7a\x10\xea\x07\x77\xa6\x2d\x76\x29\x92\xe7\xfb\xb5\xbf\x99\x54\x0e\x65\xef\xea\xd7\x8e\x33\xb5\xbc\x17\xb3\x5b\x19\x0b\xfb\xb2\x8f\x48\xca\x98\xef\xae\xa3\xdd\x9c\xd9\xe6\x8d\x39\x71\x74\x88\xf1\x5d\x9c\x5a\x1b\xe3\x07\x9f\x30\x6a\x6c\x94\xe5\x92\x13\x99\xc2\x96\x09\x1b\x14\x55\x91\xbe\x3c\x2a\x95\x58\xed\x72\xc6\x55\x02\x28\x4e\x5b\x64\x82\x7d\x6e\xed\x30\x7f\x83\xc0\xa1\x0a\x50\xac\x42\xc8\x8e\x38\xec\x7d\xa4\x02\x47\x6a\xf6\xdf\xe0\x88\x9c\x69\x22\xb5\x00\x25\xc0\xd1\x09\x1c\x07\x00\xcb\xab\xe2\x79\x1b\xb5\x92\x44\xaa\x7d\x62\x5c\x1d\x6f\xa5\xc4\x17\xc6\x43\x4a\xfc\xb2\x25\x70\x8f\x08\xbe\xbe\x46\x2d\x41\x98\xca\x83\x59\x7d\x17\x75\x73\x5c\x94\x9a\x23\x53\x0f\x71\x0e\x4a\xfb\x4f\x0f\xca\x59\xa3\x9a\x83\x52\xaf\xa1\x86\x46\x2a\xc1\xf4\x32\x9b\x21\x56\x92\xaa\x87\xc8\xfb\x57\x29\x48\xf7\x7a\xf4\x5b\x30\x4b\x9f\xed\xd4\xfb\x66\xca\x13\x9d\x9a\xff\xb3\x9d\xaa\xaf\xed\x54\xd8\x3f\x36\x69\xd7\xb3\x1e\x3a\x25\xb1\x79\x9c\xed\x09\x09\xf5\xd6\x03\x38\x20\x0b\xca\xe1\xc5\x54\xcf\xb3\xcf\xbf\x88\x71\x34\xb0\xc9\x00\xe8\x2b\xa6\x81\x9c\xdc\x88\x61\xd0\xc0\xd4\x0b\x9b\xc0\xd1\x03\x57\xf4\x6c\x2a\x71\x5e\xe6\x0e\x70\x3b\xf6\x5b\x61\xea\x88\x1b\x8e\xf6\xa6\xe8\x77\x50\x17\x2c\xb7\xa9\xdf\x7b\x91\x83\xa4\xb9\xba\x96\xca\xbc\x88\x24\xa5\x1d\x5b\xa6\xf6\xa2\x02\xe3\x12\x8a\xed\x79\x39\x70\xdd\xb1\x5e\xea\xdd\xdb\x46\xa3\x48\x00\x4e\xdf\x32\x6f\x62\x19\x7c\x8c\x8e\xfc\x50\xeb\x4f\xf1\x99\x9f\xe2\xfd\xdf\xc2\xfa\xdb\xdd\x5b\x2e\x34\x54\x03\x97\x83\xec\x22\x0c\xf7\x6a\x83\x17\xd5\xbe\x63\x1d\x4b\x11\xb0\x30\x06\x82\x0e\x7e\x6f\xe1\x6f\x8e\x4f\xce\xd6\xf0\xdd\xb5\xdd\x3d\x4b\x6a\x97\x6d\xd7\x4c\x9a\xdb\x4f\xcf\xb4\xf3\xd1\x3b\xc6\xe6\xb5\xcd\x7c\x89\xc7\x7f\xfd\x92\x8b\xb6\x4e\x68\x94\xb4\xdc\x27\xb6\xf6\x80\xd8\x90\x85\x9e\x58\xc7\xb3\x04\x37\x6f\x87\x59\xdd\xed\xee\x5d\x64\x7d\x86\xec\xca\x42\x76\x5e\xf0\x8b\xa4\xe7\xb7\x2d\xe4\x67\x2f\xbe\x47\x80\xa3\x4d\x02\xdc\x4e\x54\x12\x46\xa0\x18\xdc\x21\xec\x64\x8c\x7e\x32\x1a\xe2\x1b\x4c\xcf\x93\x5c\x1f\xf7\x49\xee\x2d\x17\x5f\x6c\x8b\xc5\x7e\x28\xc0\xd9\x48\x29\x87\xf4\x5b\xca\xbb\x4f\x21\x56\x65\xbe\x7b\x8b\x24\xf5\x29\xe9\x05\x57\x94\x3b\xce\x39\x5d\xe2\x17\x50\xdc\xf0\x62\x5e\xa4\xb7\xd1\xfe\x38\x7a\xfb\x75\x73\xf3\xf1\xfd\xd5\xcd\x97\x20\x34\x47\x86\xec\xa4\xbc\x17\xe4\x76\x16\xca\x79\x9c\x77\xca\xca\x17\xc5\x44\x71\x2b\xe7\x72\xa8\x34\xc6\x4e\xa9\x34\xd9\x0b\xa9\xc2\x61\xae\xeb\x96\x86\xe9\x5a\x0d\xf8\x23\xcd\xcf\x64\xc2\x9b\x11\x82\x0a\x2b\x72\x47\x62\x3b\x6f\x3d\xd9\x53\xe5\x4c\x85\xdb\x96\x4a\x6f\x54\x14\x09\xab\x1b\x50\x38\xc4\x83\x0b\x79\x08\x35\x2d\x91\x9a\x32\x35\x51\xb8\x5a\xf4\xe3\xd9\xde\x1e\x27\xcd\x5b\xca\x83\x24\x67\x1a\x1d\xe8\x11\x00\x8c\xed\x2d\x92\x48\x27\x55\x64\x9f\xa6\xa2\xd1\x64\x16\x00\x52\x99\xf2\x28\xfb\xa8\x80\xb2\xc8\x54\xeb\x30\x75\xd2\x4a\xd2\x06\x27\x20\x31\xc5\x4a\xb1\xe3\x69\x6f\x04\xf3\xe8\x60\x52\x75\x79\x2d\x70\xbd\x10\xca\x4a\xad\x99\x32\x8e\xb0\x3c\x96\xbe\x11\x92\x82\x38\xb5\x75\xd7\x31\x23\x55\x65\x6b\x9f\x5f\x2b\x03\xbb\x57\x92\x11\xea\x04\xaa\x68\x70\xfa\x19\x7a\xce\x42\x47\x1a\x4a\x36\xe9\x16\x92\x9a\x2f\x06\x71\x41\x86\x3e\x2d\x0b\x1e\x54\x5a\xd1\x84\xda\x06\xe1\x96\x81\xd7\x80\x4b\xe0\xfe\xd4\xc0\xd4\x74\x6c\x01\x1f\xec\xde\x2c\x92\x99\x8a\x75\x59\x2b\x00\x5b\xd9\x9f\x60\xad\xfa\xfb\x72\x10\x52\xa4\xed\x96\xde\x36\xe4\x28\x99\x56\x21\x54\xa5\xe5\xb6\x8f\xd4\xb9\x52\xd3\x16\x94\xda\xb0\xa3\x70\x3d\x17\xb9\x34\xca\xd9\x45\x60\xf9\x5c\x9c\x34\xef\x65\x52\xff\xf8\x55\x7d\x1a\xcc\x4a\xca\xd8\xa2\xd7\x7a\x26\x66\x0c\x54\x60\xd8\x04\xc9\xa1\x02\x63\x50\x72\xf0\xe5\xdb\x5a\x4c\xdf\x51\xee\x31\x83\x0e\x5a\x04\x42\x0f\x9c\x21\x32\x62\x78\x99\xb2\xe6\x79\x3e\x1d\xa2\x7a\xa6\x26\x62\x74\x82\x60\xd9\xd6\xec\xbc\x82\xcc\x72\xae\x41\x29\x37\x35\x92\xcc\xd5\xf3\xbf\x27\x23\xb5\x81\x72\xac\x1a\x17\xc3\x73\x3f\x4b\x97\x37\x42\xd8\xe7\xee\x7d\x5d\xf9\xc8\x39\x87\x71\xaf\x6e\x6d\xd6\xad\xc6\x7c\xa6\xf6\x3d\x58\x4d\x9a\xd5\x2b\xe0\x5e\x38\x4d\x55\xea\x88\x64\x50\x3e\x22\x4c\xf5\x7c\x50\xca\x7a\x96\x71\x8d\x2b\x95\x6e\x8f\x58\x2d\x46\xb1\x13\x7f\xb8\x16\x8f\xf0\xed\x21\x23\x55\x74\xb3\x4b\xde\x09\xc1\x0b\x66\x2f\xcc\x2b\x81\x69\x27\x1b\xbf\x8d\x6c\x46\xac\x76\x24\x08\x46\x4c\x6f\xaf\x7a\x88\x40\x10\xda\x64\x62\xe0\xb8\xf3\xe8\xeb\x1a\x0c\x00\x62\x5a\xd7\x7d\x23\xa4\xa5\xce\x23\x6f\xec\x21\x54\xb6\x1e\x71\x7e\xb5\xcf\xc0\xe8\xdf\x57\x39\xe1\x48\xad\x18\x8b\x4b\x71\x0c\x4f\xab\x5b\x93\xba\xa7\x9c\x05\xfe\x63\xfd\xee\x3a\x52\x8d\x0b\x89\xa4\xce\xa1\x05\x64\x65\x4f\x45\xb1\x60\x7d\x1b\x31\xb7\xda\x93\x46\x17\x58\x76\x14\xed\xf0\x09\xe3\x5a\xed\x49\x3f\xc3\x8a\x22\x63\x87\xc8\xbf\xde\xbd\xad\x4e\x3a\x66\xa2\xe2\x11\xbf\x82\xd2\xe6\xa9\xdc\x7b\x7d\x8d\x72\xa6\x78\x49\x0b\x93\x70\x83\x86\x71\xfa\xde\xf6\x8a\xfc\xf0\xbf\xee\x37\xff\xfa\xfa\x06\xa0\x04\x96\xb3\xb9\x59\xb6\xee\x98\x05\xb9\xe5\x14\x8e\xdb\x66\x27\x1b\x66\x81\xd3\xdf\x24\x1c\x77\xcd\xee\xae\xe1\x1c\x99\x43\xba\x18\x81\xdb\x65\xdb\x77\x7c\x7d\x51\xee\x78\xfb\xbf\x09\x73\xcd\xf7\xdc\xcf\x2a\x69\x7b\xbc\x73\xd8\xac\x0b\x86\xdd\xc1\xe9\x6c\xb6\x1b\xff\xd7\x73\x96\xe3\x2e\xa2\xbf\xea\xee\xad\xf5\x85\xf7\x44\x2c\x17\x23\xb4\x03\x27\xd3\xd2\xcd\xd8\xb3\x7e\x95\x90\xa9\xf4\x80\x7f\xb7\xd8\x48\xc4\xe6\x22\x4e\xe2\xfc\x17\xfc\xcb\x2b\x36\x17\xd1\x93\x5f\x66\x6f\x11\x1a\x0b\xaa\xbf\xef\xd4\xfa\x88\xe5\xa2\x87\xe7\xe7\xd7\x63\x8d\xfe\xdb\xed\x93\xef\xb0\x8a\x1c\xe5\x10\xd5\x77\x0d\xf5\xb2\xed\x04\x0b\xcb\xaf\xe1\xf5\x6f\x6b\xe3\x9c\x73\x68\xd6\x16\x6b\x8a\xec\xac\x61\xe2\x2b\xe6\x58\xa6\xb8\x34\xb5\x9b\x63\xf9\x46\xf7\xd2\xd1\x99\xdf\xc0\x56\xfa\x08\x9c\xcd\x3e\xaa\xa0\x8a\x7a\x0e\xc3\xa8\x5e\x96\x9d\x1c\xea\xae\xbe\x96\x2a\xbe\xad\xbd\xf5\xe3\xb2\xdf\xdc\x59\xbf\xbf\x0e\xf8\xfa\x9d\xf5\xff\x0c\xbb\xfc\x7a\xf3\xe1\xf0\xee\xe7\x3f\xde\xfc\xfa\xbf\x2b\x34\x08\xca\x79\x6b\x7d\x2f\x34\x1c\x4b\x52\xfa\xc6\xd5\x05\x3f\xce\x7e\xc6\x55\x1a\x43\x0e\xa6\xf6\x20\xe8\xcc\x7d\xf0\x05\x9e\xfb\xfa\xc4\x33\x79\x9a\x5e\x89\x0f\x66\x23\xd6\x3d\x7e\x80\x32\x5c\xef\xae\x91\xc6\xbc\x40\x4b\xab\x97\x95\x6a\x6e\xf0\x83\x85\xfb\xe6\xb2\xc9\x87\xa9\xaa\xb4\xbd\x50\xf2\xcc\x22\x23\x63\x5d\x81\x44\x4d\x0d\x2d\xc3\x4a\xed\x78\xa6\x9f\xe0\xab\x27\x8e\x99\x32\x8f\xbd\x9f\x33\x25\xbd\xbb\x46\x7d\x81\x6a\x62\xea\x64\xd1\x7c\x5a\x9d\x83\xff\xb2\x56\x19\x35\x44\x05\xa3\x57\x70\x50\xe2\x6e\x4f\xa0\x1e\xad\x9d\x3c\x80\x7c\x24\xad\xdd\x5d\x9b\xbd\x85\xfb\x87\xb5\xa7\x8b\x55\x6e\xc0\xe8\x3f\x7a\xd4\x76\x80\xd7\x70\x81\x23\x6e\xef\x34\x9a\x2f\x8c\xa5\x54\x42\x21\xce\xf7\x8b\xe8\xad\x6d\x23\x0d\x31\x63\xd5\x7a\xa2\xd3\x58\x4b\x4c\x59\x2f\xb9\x50\x3f\x2d\xf7\xa0\xa4\xa9\x6d\x1e\xf6\xa3\x00\xca\xb6\x50\x69\xba\x87\xff\x30\x62\x27\x1a\xdc\x54\x87\x02\xdc\x80\xad\x29\x68\x7a\x6f\x15\x63\xd9\x83\x1f\xe7\x36\xac\x5f\x64\x2d\x97\x5c\x69\xbc\x42\x6c\x7c\xfa\x69\xff\x6e\x1b\x7f\xbe\xfa\xfb\xe6\xd3\xfe\xe3\x7f\xf1\xa9\x35\xb2\x29\x52\x23\x6f\x63\xa6\x51\xcc\xf4\x8f\x66\xc4\xf7\x12\x5b\xb4\xdf\x61\x85\x0b\x2d\x91\x2a\x88\x95\x69\xe3\x02\xab\x53\x7c\x7f\x3d\xfd\xc0\x64\x44\x5c\x4d\x12\x51\xf1\x84\x2c\x66\x2d\x63\x2b\x2a\xc3\xb5\x12\x27\xbb\xc8\x87\x08\x1c\xa3\x52\x00\x30\x8e\x3b\xce\xbb\x49\x29\xd9\x12\x1c\xdc\x91\x98\xc6\x48\xde\xa4\xd6\x03\x91\x77\x88\xa4\xbc\x15\x02\x9a\x0e\x8f\x80\x51\xae\xa1\x84\x86\xb9\xce\x23\xa5\xb1\x47\x06\x43\x9e\x43\xa1\xfc\x32\x5e\xe5\x1c\xd5\xfd\x87\xed\x3f\xbe\xf6\xa6\x60\x0e\xf9\x10\xa9\x6c\x84\x4c\x88\x2c\x7b\xef\x25\xa4\xcb\x6c\x96\x32\x96\x32\x03\x3a\x2e\xf0\x01\x50\x4a\xa5\xa0\xbb\xec\xdf\xae\x3c\xea\x42\x7d\xd8\xd7\x66\xce\xf5\x90\x76\x31\x93\x5a\x49\x76\x7d\x28\x35\x40\x1f\x19\xcb\xdb\xdf\x5b\xa6\x46\x0d\x36\xbb\x7d\x2e\x33\x22\x62\xa5\x87\xbe\xa5\xa4\x94\x33\xa5\x4e\xb5\x52\xea\xe1\xd9\x5e\xff\x52\x24\x70\x29\xa4\xd5\xe4\x47\x89\x84\x1d\x60\x7b\x4b\x8d\xd9\x8e\xbf\x91\x1f\xac\x12\x59\x3d\x09\x0c\xf2\x07\x95\xe8\x61\xfa\xf9\xee\x2d\x63\x37\xf5\x0f\x64\x8e\x17\x88\xf0\xff\x7c\xba\xfa\xf4\x87\x6f\xe3\xfc\x36\xd7\x34\x5e\x82\x73\x0a\x82\x73\xc2\xe9\xd7\xb7\xc2\xa1\x9f\x0f\xf7\x65\xee\x77\x6f\x25\xe8\xa1\xee\x4b\xcc\xb1\xc4\x97\xbd\xd0\x6e\x36\x3f\xbf\xfb\x10\x7f\xfa\xf4\xf1\xe3\x87\xf7\x71\xbb\xbb\xfa\xea\x7c\xc6\x12\xda\x36\x8a\xd1\xb8\x71\x97\x4d\xbd\xb1\x84\x72\x6b\x27\xa1\xf8\xbf\xe8\x5f\xa2\x9f\x98\x01\x19\x0b\x42\x98\xfe\x20\xdd\x5c\x16\xdd\xbc\x2f\xba\x79\x3f\xd5\xcd\xfb\xa2\x9b\xf7\x57\xea\xe6\xf7\x3a\xf9\xd3\xfb\x6f\xa4\x9b\xff\x93\x73\xd4\x97\xea\xad\x9b\xcd\xfb\x9f\x3f\x5c\x7f\x91\xdd\xac\x6e\xa2\xfb\x4c\x12\xb2\x1a\x60\x95\x22\xc3\xad\x2b\x14\x2a\x07\xce\x5b\x13\x65\x4b\x68\x63\xb1\x2a\xdb\xdf\x5d\xe4\xbc\x8d\x02\xfd\xd2\x77\x9a\xe7\xc5\x43\xe4\x7c\xe6\xaf\xc0\x6b\x90\xbd\x49\x76\x9c\x97\xad\xa8\x7c\xa6\xd4\x38\x28\x76\x8c\x1b\xdb\xdf\xb5\x20\x6a\x9d\x91\xc0\x67\x71\xe5\x62\x2a\x3b\xce\x5b\x6a\x63\xba\x7a\xe1\x89\xd5\xe7\x8b\x21\x97\x5b\x67\x5f\x97\x3f\xd9\xf4\xbe\xb3\xb1\x5c\x4d\x92\x67\xa2\x67\x34\xbe\x70\x83\x8d\xcc\x67\xef\x78\x69\xd4\xae\x7e\x7e\x77\x73\xb5\xfd\xf8\x25\xc6\x4d\x4c\xde\xf7\x9c\xcf\x64\x22\x92\x67\xee\xa1\x52\x63\x09\x83\x4c\x37\xcd\xa4\xb5\x86\x4e\x3d\x5f\xea\x85\x60\xc1\xa9\xb5\x7d\xec\x40\x8c\x6f\x54\x5b\x35\x15\xbc\xeb\x38\xeb\x54\x3a\x12\x75\x64\xc5\xa0\xc0\xab\x98\x92\x4d\x07\x5e\xc6\xcb\xbc\x7c\xf5\xf7\x9b\xab\xdb\x5d\xdc\xec\xaf\x6e\xbe\xae\x9a\x99\x3d\x40\x50\x6c\x92\x1b\x1c\x94\x24\x08\x21\x0e\xbc\x2a\xb6\xed\x77\xf5\x10\xeb\xde\x85\xa5\x1d\xde\x54\xec\xa5\xf8\xd1\x2d\x84\x12\x58\x36\xc5\x2c\x86\x72\x34\x1b\xe0\xc4\x52\x2e\x95\xa4\x9e\x15\x9b\xf6\x0b\x71\x09\x39\x00\x72\x3e\x63\x79\xb3\x07\x33\xe8\xa3\x98\x2d\xeb\x53\x90\xc2\xe8\xdf\x43\x20\x3f\x53\x18\x8f\x27\x4a\x8b\xc6\x14\xb5\x1c\x84\xd2\xd8\x66\x64\xb6\xe9\x23\xd4\x88\x18\xb7\x1a\x1b\x35\x85\x39\x28\x66\x4c\x73\x54\x42\x18\x73\x85\x4b\x08\xfc\x1c\x4c\x5b\x4e\x61\xec\xe4\x12\x8b\x37\x2f\xfa\x65\xac\x23\xf8\x4d\x98\x0a\xcd\x08\xb8\x52\x46\x50\x66\x81\x0d\x54\xfa\x49\x8c\xe1\x2a\x61\x61\xd6\x41\xb6\xe2\x0c\x72\xb6\x85\xee\xe6\x5e\xdf\x66\x42\x02\xa3\x4a\xd8\xc9\x40\xf8\x65\xcb\xb1\x3a\xb4\xd1\x9b\x87\x23\x6c\x12\xa3\x6f\x61\xb4\x86\x14\x6b\x14\xaa\x23\xd6\x58\x6f\xfd\x24\xd4\x58\xb7\x4c\xc0\x98\xcc\xc4\x4a\x75\x18\x79\x99\x19\xd7\xfa\x05\x20\xb1\x76\xed\x12\xb6\x5d\xb6\x29\x3a\xbf\xb8\xae\x7d\x73\x75\xfd\xee\x3f\xbe\x88\x4c\x6f\xa1\xec\x35\xe4\xa8\x21\x07\x80\x64\x9e\x73\xd9\x46\x40\xe3\xc7\x65\xeb\x25\x57\xc4\xc8\x0e\xa4\x18\xa8\x7c\x66\x22\x44\x21\x37\xca\x80\x34\xe0\x52\x03\x17\xff\xbf\x13\x78\xae\xb5\xc0\xf9\x89\x17\x33\x95\x5a\x40\x90\x15\x2e\x32\x65\x64\xd3\x3d\x33\x42\x86\x4b\x3f\x1b\xd4\x2b\x5c\x88\x35\x99\x44\x92\x2c\x01\xbb\x5d\xdc\xce\xcd\x1e\x6a\xa6\xb5\x59\xdf\x36\xa4\x41\x10\x1a\x0d\xba\x77\xcf\x00\xe6\xc3\xb2\x87\x49\xa9\x61\x73\x2e\xe5\xae\x18\xc7\x16\x46\xa8\x61\xe0\x0d\xf5\xb2\x9d\xd7\xad\xa9\xfc\x19\xa3\x33\x80\xee\x6a\x95\x2a\xc4\xa3\xc0\xad\x90\xcf\x58\x00\x61\xd8\x71\x81\xe1\x80\xd0\xac\x79\x6d\x6d\xdd\xcb\x43\xf6\xee\xa7\x9f\x3e\xbc\xff\xba\x61\x39\x54\x8b\x60\x98\x00\x7b\x9b\x2b\xbc\x0e\xb1\x6f\xa7\xdc\xa8\xb3\x44\xea\x8d\xb4\x7a\xe6\xbd\xaa\x00\x43\x48\xc8\xa4\x6a\x4a\x3f\x90\x85\x5b\xa4\xca\x40\xd2\x35\xd1\xd2\xfd\x04\x2b\x0b\xb7\x9e\x77\xa4\xe4\xf5\xa7\xb6\x61\x80\x46\xf0\x84\x8e\x70\x80\xd5\xf9\xb2\xb6\x35\x43\x06\xf9\x4b\xd4\xac\x92\x8a\x94\x91\x66\x48\x65\xab\x86\x44\xe2\x8c\xf4\x70\x63\xa6\xeb\x42\xa2\xc2\xe6\x09\x24\x36\x4c\x3d\xc1\x63\x26\xe9\xea\xb6\x2d\x20\x21\x29\xf6\xe6\x9a\x91\x65\xaa\x9a\x94\xb3\xda\x0a\x1e\x2c\x62\xef\xb0\x66\x97\xf9\x7a\xcd\x33\x49\x45\x1f\xa6\x0f\x54\x7b\x31\xf6\x78\xfb\x0a\x09\xcb\xd4\x2a\xb2\xee\xe1\xb5\x95\xb8\x96\xe8\xe1\xba\x40\x7a\xe0\xce\x24\xda\x22\x49\x83\xad\x04\xbf\x83\x04\xf7\x1a\x6e\x66\x1c\xa2\x1b\x7a\x45\x02\x9d\xda\x4e\x5e\xda\xfc\x9d\x5a\x8b\x63\xff\xd6\x4a\xb5\x98\x29\x39\x2a\xd2\xb9\x01\xbd\x99\x73\x8e\x54\xd8\xa8\x31\x7b\xa7\x1a\x63\xa0\xfd\xa8\x66\xaa\xa7\xed\x0f\x4b\xfb\x01\x87\x89\x96\x66\xea\xbd\x59\xb3\x3b\x1c\x61\xd1\xf0\x0a\x30\xdb\xac\x85\x14\xae\xb6\x2c\xd4\x9f\x1b\xac\xe0\x83\x45\xdc\x98\xaa\x03\x6a\x50\xef\x6a\x83\x0c\x3c\x64\xc7\x4e\x56\xcf\x24\x58\xc4\x29\x02\x6b\x4d\x82\x37\xfa\x7a\xdc\x31\x05\xcc\xf1\x8d\x5a\x2b\x69\xc9\x36\xf6\xc8\x16\xea\xd5\x10\xe2\x5c\x6c\xd8\x89\x47\xa7\xb2\x56\xdc\xc7\x5c\x82\x1f\x97\xfd\xe3\xb5\xcd\x67\x8d\x86\x51\x44\x25\xe6\xd0\xb1\xb5\x6d\x7f\xda\xa1\xec\x31\x83\xb2\x5c\x70\x0d\x22\xee\x0b\x49\x3a\x1a\xa5\x81\xd9\x91\x86\xc9\x0c\x16\x41\x01\x58\x43\x4b\xe5\xb4\x80\x49\x54\x93\xf6\xad\xef\x8c\x42\x7b\xb3\xaa\x81\x1c\x0b\xf6\xe2\xd2\x0c\xdf\x67\x40\x23\xa4\x70\x04\x14\xa8\x2f\xc7\x53\xdf\x7c\xfa\x9c\x6c\x78\x85\xfb\xf9\x74\x92\xbf\xfd\x78\xf3\x69\xfb\xf1\xd3\xcd\x55\x7c\xb7\xfd\xf0\x3e\xde\x7c\x7a\xff\xdb\x43\x00\x64\x86\x00\x08\x42\x00\xfa\x0f\xe1\xf6\xe3\xcd\x87\x7f\x5c\x3d\x8c\x01\xf0\x5f\xe3\x8c\x45\x50\x6b\xcc\xf3\x6f\x29\xaf\x7b\x8b\x7c\xa6\x21\xf1\xd7\x9b\x0f\xbf\xdc\x5c\xdd\xde\x7e\xbe\x24\x7d\xb6\xa7\x8f\x3e\xfe\xb7\x57\x9b\x9b\xed\xe2\x91\x32\x8b\xe6\x13\x18\x12\x7e\x88\x43\xc2\x3d\xd8\x6f\xbf\x6d\x2e\x15\xf2\x3d\x3d\x6a\x63\x1f\x01\xfc\x2d\xed\x4d\x25\x6d\x1c\xfc\x38\x69\xcc\xd4\xba\xb2\x7e\xdc\x62\xb0\x33\xce\xdb\x99\x8f\xd2\x7d\xc3\x0b\xd4\x06\x93\x02\xa5\xed\x49\x1a\x49\x3f\xd8\xbb\x4b\x50\x1a\xe3\x82\x1b\xe9\x08\x0c\x04\x84\x31\xcc\x84\x37\xc2\x3b\x83\xe6\xc7\x1c\x24\x74\xec\x1b\xdb\xab\xff\xe6\x90\x07\x28\xc5\xf4\xfb\xb0\xdc\x04\xae\xc1\x3e\xb4\x9f\x33\x9f\x06\x17\xdc\x5e\xdd\x1c\xbe\xee\x8e\x89\x59\x86\x7a\x26\xd4\x4a\x30\x8b\x0a\x19\x02\xdd\xde\x94\x33\x6b\x20\x9c\xb5\x5a\x09\xd0\xed\xc2\xd8\x71\xa5\xd1\xca\x99\x18\x07\x87\x61\xb6\xa9\xdf\x03\x00\xf5\x43\x44\xf2\xbf\x56\xf0\x99\xf6\x9f\x78\xf0\x4f\xa6\x72\x77\xcd\x00\xe5\x29\x1b\xf6\xd5\x73\x29\xc7\x38\x20\x9a\x3f\xf0\xe2\x1a\xe6\x0b\xf5\xe5\x0e\x55\xe4\xb4\x8d\x48\x5e\x08\x0f\x6a\x7f\x39\x3c\xa8\x01\x41\xd2\x0a\xd2\x1b\x9e\x5a\xaa\xa7\xd5\xe4\x32\x71\xed\xbc\xa2\x9c\xbf\x68\x4d\xeb\xa3\x9a\xaa\x57\xee\x02\x36\x5c\x79\xa6\xc2\x6d\xeb\xc9\x19\xdd\xb4\x2e\x8b\x65\xbd\xc7\x9e\xcc\xb1\xb2\x0f\x6b\xbb\x8b\xdc\x00\x5f\x9e\xa4\xfc\xf6\x1a\xbf\x20\x43\x6f\xaf\x3e\x7e\x7c\xf7\xfe\x97\xdb\xaf\xbb\xc3\x49\x8a\x9c\x41\xa3\x2f\xb0\x2b\x88\xfe\xa8\x8a\x3f\xc3\xb3\x5d\x22\xe1\x56\x04\xee\x8a\xff\xba\x17\x77\x0c\xab\x48\x0f\x81\x68\x12\xd1\x35\x8c\xa4\x9a\x6d\x10\xb3\xab\x0b\xc8\x89\x60\x7a\xcc\x88\x64\xef\x40\x5a\x05\xb3\x1d\x8c\xf9\x11\x46\x13\x09\xae\x8e\x3d\x9a\xcd\xc2\x66\x82\x58\x09\x91\x72\x37\x3d\xbb\xbc\x41\x7e\x04\x5d\x3d\xcc\x58\x03\xe2\x06\x22\xcd\x4c\xbc\x15\x39\x24\x74\x90\x0a\x9e\x0a\xf6\x94\x29\x3f\x36\x20\x50\x6b\xa8\x0c\xbc\x18\xef\xb5\x92\xa3\x95\x8c\x34\x61\xc3\x9e\xc4\x9a\x31\x7b\xbd\xc2\x52\xef\x8c\x6a\x27\x93\x52\xc4\x62\x8d\xb2\x46\xc3\xa1\x0b\x99\xf9\x29\xfb\xe5\xea\x39\x3b\xe1\x24\x86\x15\xf8\x8c\x15\xf8\x36\x0b\x3b\x3e\xc2\x83\xd8\x93\x45\x7b\xea\x38\xbc\xd2\x8b\xb3\x6f\x22\x94\x07\xe5\x59\x91\x59\x4b\x2a\x42\xc0\xfc\xea\x66\xe1\x2d\x6d\x58\x1b\x69\x85\x89\xfa\x2b\xbd\x07\x76\xba\x75\x32\x24\x45\x92\x6c\x7b\x8d\x75\xcc\xd2\x9b\x5b\x1f\x01\x68\x3c\x0d\x32\x7a\xed\xf1\x39\x24\x1e\xda\x83\x5e\x09\xcb\x70\xcd\xd1\x9c\x83\x09\x22\xb0\xf7\xae\x83\xbd\x50\x83\xaf\x46\xd5\x6d\x74\xd7\xc2\x14\xa1\x3b\x0f\x8d\x1a\xf5\x76\x9e\x05\x7c\x02\xbe\x05\xfb\x36\xcf\xec\xd7\x17\x59\xe6\xc3\xcd\x1f\xbe\xc6\xf4\x1b\xa1\x02\xaa\xc9\xb0\xcb\xb2\xe3\x72\x60\x13\x65\xb1\x04\x3d\xcf\x97\x63\xc7\x69\xfe\xc0\x29\xe8\xae\x5d\x72\x3e\xcf\xfe\x8b\xe2\x0e\x6e\x3b\xf5\xef\xdd\xfd\xf1\x48\x93\x5e\x76\x93\x4e\x54\x6b\x3d\x18\x95\x56\xec\x8b\x5b\x6f\x73\xcf\x08\x1c\x53\x78\xce\x71\x85\x70\xdb\x47\x40\xfe\x78\x9a\x4b\xc8\x2a\x41\x5e\x91\x31\x8c\x8e\xf8\x15\x18\x6c\xb7\x1f\x3e\xdd\x6c\xe1\x59\xf1\xb5\x9d\x6d\xb0\xc0\x39\x88\xb1\x33\x5e\x1a\x56\x52\x1b\xc7\xe3\xb9\x60\x0d\xd4\x04\x7c\x10\xbb\xcd\xa8\xac\x09\xd6\x1f\x92\xdd\xba\x5f\x2e\xc3\x15\x12\x4f\x07\x26\xbd\xe8\x26\xce\x1a\x83\x5d\x35\xcf\x67\xe7\x72\xaa\xca\xf0\x12\xfc\x78\x01\xe9\xe7\x95\x58\xee\xb0\xe1\xc1\xab\x12\x25\xe9\xe7\x4a\x9a\x2f\x33\x69\xde\x71\xda\x2b\x49\x37\xed\x45\x7a\x39\x98\xf2\x5f\x1a\x02\x03\x50\x8c\xdd\x29\xe3\x2c\x9b\x1d\x1a\x24\x58\xc1\x15\xfe\xad\xd9\x7e\xbf\x14\xab\xb3\xaf\xfc\x36\x5c\x60\xf2\x83\xc0\x6f\x3d\xef\x18\xaf\xdd\x9a\x51\x87\x79\xca\xaa\xba\xdc\x28\xf0\xbd\x95\x71\xd9\x40\x01\x2f\x8f\xf2\xc7\xcd\xcd\x37\xe0\x3d\x03\x7f\x40\x69\x17\xdc\x89\x7b\x10\xde\x7b\x8c\x5c\xa3\x94\x2f\x00\x7e\x28\xba\x8f\x0d\x13\x48\xe5\x0b\x16\xa0\x1d\xf3\x08\x9d\x6a\x0e\xf3\x7a\x21\xad\xa6\x37\xe5\x8b\x42\x5d\x82\xf8\xea\x95\xbd\xf6\x75\xbd\xf0\x2d\x78\x96\x3d\x6c\xab\xfc\xe6\xb6\x86\x7b\x5d\x98\xef\x75\xa1\xcb\xdc\x42\xba\x8f\x99\x1a\xf2\x91\x36\xa4\x89\x90\x1e\xb3\x4d\x52\xf0\xce\x56\xf2\x0c\x9e\x56\x74\x05\xa4\x58\x83\x1a\xad\xb8\x62\x17\xed\x5e\xf7\xe4\xc6\x6a\x32\xee\xb4\xd7\xbe\xdc\xcf\x9f\x7e\x8a\xfb\xab\xbf\x7f\xe5\xa5\x54\x63\x90\x60\x33\xe0\x45\xa3\x9e\x03\xe7\x73\xee\x97\xba\x93\x03\xf3\xb9\xfd\xb2\x87\x37\x5d\xa6\xd2\x2f\x18\x48\x49\xb1\xfa\x52\x27\x18\x0c\x87\x57\xb5\xf4\xc6\x4c\xae\xaf\xdb\x54\x45\xf5\xad\xc6\x38\x5c\x70\x25\x6e\x81\x0b\x40\x9b\xe4\x60\x53\x11\x71\xdb\xbb\x7b\xa1\xb7\x58\x43\xdf\x7b\x6b\x5f\x5c\x21\xbf\xfd\xf4\xeb\xaf\x5f\x79\x9a\x3d\x3a\x60\xb7\x36\x8f\xbe\xef\xb8\x2d\xa6\x10\xa5\x54\xe1\x7d\xac\x27\xee\xd8\x21\x99\x59\x25\x39\xaa\x23\x95\x3e\xf0\xcb\xce\x8b\x63\xb6\x91\x42\x04\xac\xcc\x86\x24\x75\xfb\x2c\x4b\x3d\x33\xe8\x27\x74\x24\xc4\xed\x27\x69\x71\x0b\xa5\x36\xfc\x48\x92\xf0\x59\x56\x9c\xa4\x75\xe2\xd1\x0e\x99\xc4\x77\xf6\x52\x33\xae\x22\x56\xc0\x89\x9b\x06\x56\x3b\xa9\xc3\xd6\x16\x06\x20\xa0\xcd\xf7\xcd\x8f\x1b\xf7\x51\x58\xaa\xc0\x6d\x10\xef\xf0\xae\x47\xd5\x43\x42\xab\xde\x17\x76\xcf\x39\x6f\x32\x74\x01\x3f\xce\xb8\xb5\x58\x4d\x99\x08\xf7\xaf\x2c\x36\x7a\xad\xf5\xee\xed\x20\x65\x41\x3e\x90\x7b\x85\x47\xc8\xa6\x24\xed\x8d\xb5\xbc\x06\x3f\xce\xfd\x3f\xc2\x5c\x2d\x62\x8f\xa4\xea\xba\xdd\xd2\x69\xd5\x14\xdb\x07\xad\x10\x4a\x3d\xaf\xed\xb8\x77\xad\x23\xdb\x95\x6c\x7d\x29\xaf\x76\x44\x4d\x4d\xfb\xa9\x62\xbd\xb4\xd6\xfa\xf0\xa1\x68\x3d\x73\xa9\x84\x34\xc6\xa7\x75\x4e\x1d\x8b\xbc\x77\x6f\x15\xb3\x30\xc3\xb9\xd0\x2a\xd9\xec\xb3\x06\x41\x8d\x8a\x91\x7a\x5c\x23\x9e\x7d\x8e\xea\x78\x6d\x5a\x58\x6b\x53\x1f\x0f\x92\x3d\x40\xdc\xfa\xe1\x89\x41\xe2\x85\x1c\x96\xde\x3b\xf6\x21\x83\x7a\xaa\x1f\xef\xae\x39\x91\x6a\x0d\x85\x52\xd1\xc7\x03\x3d\xac\x57\x1f\xbd\xc2\x08\x3c\x35\xa0\x70\xb6\x76\xff\x19\xc4\xaa\x59\xe1\x6d\x17\xad\x5e\x0f\x7b\x09\xd9\xc2\xdf\x14\x4a\x2a\xc1\x8f\x69\x85\xdd\x0f\x5c\xc9\xc7\xf5\x1e\x5d\x1f\x1b\x09\x67\xa6\x54\x6d\xca\xc9\x48\xe4\xdf\xbb\xf5\xf8\x8b\xb2\xf2\x9f\x9b\x5f\xbf\x19\x80\x23\x5f\x22\xba\xc8\x81\xcb\x3e\x03\xd1\xe1\x10\xf3\x39\x2b\xf6\x63\x68\x8c\x43\xcc\xd8\xc6\x1c\x26\x34\xc7\x88\x7a\xc8\xe7\x9c\x0e\xb2\x6b\x94\xf8\x00\x4d\xfc\x65\x6f\x35\xb4\xf8\xdb\x00\x25\xaa\x26\xf5\x12\x5f\x72\xda\x45\x39\xd8\xe9\x2e\x02\x32\x4b\x78\xaf\x68\xe2\xce\x5a\x3c\x42\xbe\x28\x01\x61\x95\xf9\x92\x75\x27\x97\x7e\x7e\x31\xc2\x8b\xa6\xc4\xed\xbf\xde\x6f\xdf\xbd\xff\xe5\x6b\x7b\xb1\xf0\x56\x9c\xd0\x95\x24\xd2\x60\xec\x7f\x63\x8f\xf8\x42\x52\x10\x3e\xc4\xba\x8b\xbe\x31\xfd\xdc\x2e\xb8\xc9\xd3\xf1\x68\x63\xba\x98\x61\xaf\xe7\x4a\x52\xb7\xd4\x4d\x73\x98\xae\xab\x00\x12\x68\x1a\xea\xdd\x5b\x0d\xf9\x50\x77\xf5\x02\x3e\x79\x95\x5a\x7d\xfa\xed\xe5\xd1\x1e\xbb\xbd\x3c\xe8\x0e\xbb\xde\xd8\xcb\xc1\xd6\xb7\xbd\x3d\xfa\xa6\x77\xf4\xdc\xe8\x66\x41\x93\xd0\x40\x75\x14\x1b\xfc\x17\xfa\xf2\xd8\x7c\xdc\xfc\xe1\xe3\x32\xc3\x74\x3b\x66\xde\x24\x1b\xa6\xac\x1e\x5b\x58\x4f\x56\xc2\xea\x90\x70\xff\xca\xb2\x1a\x56\x3f\xe3\xc4\xfb\xdb\xf5\x03\x2a\x52\xcd\xcc\x93\x86\x4d\x9b\x81\x4d\x9b\xb1\xa6\xd9\x2f\x40\x8e\x28\x79\x4f\x43\x72\xac\x6e\x58\x61\x2f\xa9\x75\xd3\xaf\x19\x56\x25\x53\x61\xac\xf2\x71\xd9\xe3\x9e\x68\xb7\x3f\x7e\x1f\x22\x83\xed\x9d\x7b\x93\x90\x50\xba\xd3\x13\xc5\xfa\xa2\x5f\xee\xa6\xe6\x9b\x64\xc6\xf1\x89\xda\xe1\xa6\x90\xf6\x11\xef\xf1\x23\x12\xb8\xb4\x16\x71\x3c\x2d\xe6\xf4\x5d\xa7\x0f\x1c\x1b\x16\x8e\x55\x7f\x91\x2c\x3e\xfc\xe3\xea\xfd\x1f\xbe\xdc\xe8\x98\x5e\x54\x42\xde\x34\xb8\x56\xf9\x31\xcd\x18\xf4\x04\xfc\x0d\x20\x4e\x87\x36\xe1\x7b\x07\xe9\xe0\x30\xa8\x15\xd9\x47\x4a\x63\x44\xe2\x2a\x6f\x1a\x15\x7b\x78\xe9\x75\xbc\xf3\xee\xba\x91\x76\xe0\x49\x77\xbc\x1f\x4b\xe1\x6b\x5a\xcd\x86\x3c\xa7\xcd\x1d\xda\xc3\xb2\xfc\x8a\x5f\x71\xad\xdc\x79\xdd\x8c\x05\x4b\x28\xeb\x7e\x45\x0a\xcc\xe1\xf8\xd3\xdc\x92\x44\x0e\x9f\x7c\xe2\xe3\xeb\x61\xcf\xfe\x4d\xd6\x9a\x25\xf8\x1b\x06\x3e\x01\xe2\x9a\xc9\x2c\xc3\x7d\xcc\xae\xf4\xb2\x0b\xe6\xc7\x9b\xcd\x1f\x8f\x9f\x0e\x1e\xe1\xa0\x07\x39\xcf\x97\xba\xab\x7b\x8e\xbc\xd3\x3d\x07\x06\x50\x86\x06\x2e\x88\x3c\x81\x07\x91\x07\xaa\x04\x89\x12\xe4\xbc\xad\x58\x73\x33\x78\x65\xde\xb7\xe3\xe7\xb7\x04\xd7\x22\x47\xe0\xb6\x93\xcb\x76\x3e\x10\xda\x57\x83\xcd\x3e\xfe\x82\x17\x37\x14\x3f\x7e\xfa\xe3\xc1\x52\x7e\xa3\x3b\x55\x3b\xc8\x0e\x7e\xb5\xc8\xa3\x5f\x00\xa2\x7a\x59\xce\xb3\xa9\x6b\x81\x27\xb8\xf2\x84\x54\x83\xeb\x53\xdd\xc9\xdd\xdb\x16\x86\x75\x33\x42\xc6\x64\x27\x97\xe3\xbc\x01\x6e\x18\xba\xc5\x84\x62\xbd\xbb\x8e\x35\x2a\x7c\x94\xf4\xb2\xec\xa2\x5e\xe6\xd7\x39\x2b\x7d\x7a\xff\xf7\x0f\xfb\x9f\xe3\xfe\xea\xf6\xf6\xeb\x82\xca\x92\x72\xe0\x4e\x65\x5c\x74\xb3\xae\x05\xee\x49\x5c\x61\x69\x17\xb3\x3e\x25\xed\x99\x14\x82\x15\x4b\x39\xac\x40\x36\x1f\xc1\x0e\x77\xd7\x83\xb8\x47\xce\xc4\xfd\xc2\xef\x57\x7b\x41\xb3\x33\xbc\x50\x3d\x50\xa0\xa0\x1c\x09\x58\x6b\x2b\x03\x6f\x78\x6d\x27\x5d\x7f\xb8\xf9\xea\x10\x47\x85\x7a\x9e\x0d\x1c\xf7\xfb\x23\x7b\x03\x1b\x42\xfa\xac\xc5\x23\xcc\xfb\x21\x4a\x84\xb2\x7a\xd7\x7a\xb0\x8e\x62\x2d\xd3\x17\xc5\xf8\xd8\x17\xf3\xdd\x5c\xdc\x87\xeb\x15\x7a\xf8\xa7\x5f\xf7\x1f\x36\x3f\x7f\x65\xff\xf5\xb4\x53\x84\xff\xc5\xba\xd3\x7d\x6c\xf6\x2f\x34\x6b\x77\x37\xf6\x00\xa7\x14\xc4\xc8\x09\x62\x2e\xcf\xf3\x41\xb1\x47\x98\x3c\x04\x33\xca\xe1\xe5\x55\xa8\x4f\xb7\x57\x37\x71\xf3\xf3\x57\xf6\xab\xb6\x81\x59\x35\x52\xec\x6c\x04\x8d\x7a\x8b\xb3\xa8\xfe\x2f\xf8\x97\xb9\x07\xe2\x0e\xc2\x77\xd7\x71\x98\xac\x3c\x87\xe5\x71\x90\x5d\x3e\x64\x6b\x7c\xde\x65\xd8\x28\x77\xd7\x23\xe8\xd6\x34\xac\x16\x52\x44\xc6\x19\x8d\xdd\x24\xbc\xc7\x02\x6c\xa1\x7d\x21\xe9\x76\x8e\x1a\xfb\x2b\x40\x1d\xd1\x61\x1f\x6e\x7e\xd9\xbc\x7f\x77\x07\x9c\xb0\xaf\xcd\x3c\xed\x32\x9f\xcb\x81\xfb\x4e\xd2\x65\x3b\x67\x40\xdc\xf3\x70\x5c\x72\xf1\xb4\x24\xfa\xf0\xdb\xe5\x38\xfd\x52\xfc\x8b\xc9\x96\x19\xb7\xb2\x5c\x7b\xf0\xed\xf4\xb1\xbe\x3c\x66\x52\x7e\x91\xee\x8b\x77\xeb\xf1\xf4\x72\xec\xba\x47\xac\x4b\xec\x70\x7c\xc5\x15\xa3\x62\x3d\xf9\xfa\xaa\x5e\xff\x06\x02\x75\xe5\x77\x13\x2a\x00\x6c\xff\x70\x42\xfc\x56\x42\x7e\x6d\xe2\xff\x1d\x11\xbe\x0f\xa3\x84\x81\x91\x5c\x1c\xff\xc3\x01\x3e\x42\x8e\x39\xe4\xdb\xe8\x39\x97\xa2\x7d\xf3\x13\xbf\x10\xfc\x1e\x53\x78\xe3\x08\xdd\xba\x31\x98\xa5\xce\xa1\xda\xf1\x16\x09\x60\x02\x52\xa9\x1c\xf8\xbc\x1e\xe2\xcb\xb9\x01\x4f\xfb\xf5\x5b\xd8\x06\xe1\x81\xbe\x3d\x2f\x97\x65\xc7\x7a\xf7\xb6\x84\xfc\x47\xc0\x96\x3b\x9e\x6d\x68\xdf\x40\x67\x7f\xbc\xda\x5c\x7f\xe5\x85\x1f\xc2\x0c\xc4\x94\x1d\xb4\x45\xdd\x57\xd0\xcf\x84\xca\xdf\xb8\x51\xef\xa1\xb9\xc3\x61\xbb\x1f\xce\x68\xa6\x0e\x5c\x03\x79\x71\xff\x16\x77\x36\xcc\xbe\xc9\x1c\xf3\xdf\x38\xd9\x85\x12\x46\x28\x67\xcd\x7e\x2f\x01\x49\xd0\x35\xd4\xd0\x6f\x97\x6e\x75\xb3\x6d\x8e\x2f\x7c\xb1\x0b\x15\x1a\x12\x11\x23\x43\xad\x5c\xf2\xd8\x31\x52\x6e\x8a\x0f\x67\xcf\x31\xcf\x1c\x36\x05\x00\xb3\x76\x82\xba\xe4\x2d\xd0\xc0\x42\x8a\xcd\x7d\x16\x5a\xc8\x84\x17\xb4\xf5\x79\xea\x10\x37\xe2\x15\x05\xe2\x95\xb6\x33\x18\x7e\xa6\x73\x86\x61\x95\x66\xe8\x5c\x2f\x6f\x91\x1f\xde\xdd\xbe\xfb\xe9\xdd\xfe\xdd\xc7\x7f\xc5\xdd\xbb\x9f\xbf\xba\x4a\xd9\xb6\x1e\x0d\x17\x3c\x1a\x6e\x5a\xb9\xf0\x3a\x81\xef\xb7\xd4\x48\x19\xae\xb5\x79\x2f\xe4\x4e\xee\x46\x00\x9e\xd2\xae\x5a\x77\x23\x58\x3b\x64\xd2\x1c\xd5\x7d\xa6\x9a\x9d\xe5\x81\xc5\xa6\x12\x99\xfd\x0f\x79\xac\x05\x32\x00\xc5\x4c\xa3\x53\xdb\x0b\xb1\x23\xfe\x58\x77\x22\x6d\x94\xe7\xc4\xce\x70\x29\x97\xd0\x10\x72\x48\x62\x77\x36\xeb\xfd\xa6\x6f\x78\x7a\x3b\x9f\xb8\x3b\x63\x21\x0c\x8e\xef\xc1\x0a\xc6\x1a\x5a\x31\x1b\xbc\xb9\xc1\x5c\xdc\x6b\x30\x47\xca\x73\xab\xb2\xeb\x1e\x4e\x2d\x72\xc1\xc3\x1e\x13\x6c\x88\x4a\xb2\xf3\xec\xa1\x28\x5e\xf0\xdd\xdb\x46\x00\x22\xeb\xfb\x89\x24\x56\xe0\xa0\x83\xac\xd9\x94\x3a\x7c\xa6\x53\xa7\xea\xfe\x5f\x13\x11\xcb\xc9\x34\x90\x88\x67\xaf\x8a\xf0\xdb\x81\x2b\xf4\xbd\xd7\xd4\x66\x94\x65\xba\x38\x79\x56\x24\xff\xe3\xf1\x89\x6b\x00\x22\xb2\x65\x0d\x42\xfc\x58\x9e\x37\xde\x5d\x2b\x65\x8e\xd4\xfa\x3e\x23\x82\x06\x98\xbb\x12\x89\xeb\x76\x66\xb1\x5a\x84\x53\xcc\x7b\xb8\x40\xbf\x22\xe1\xeb\x09\x75\xde\xee\x3e\xfc\xf3\x6b\x53\xa7\x52\x39\x6b\x0e\x8f\x6e\x03\xd3\xa8\xf2\xe7\x86\xfa\x76\x90\x00\x8f\x8e\x83\x13\xdd\xf6\x19\x62\xf4\x5d\xae\x93\x50\xd0\xb5\xab\x6f\x97\x98\x50\xfb\xac\x2c\xb1\xc6\x84\x06\x84\x82\x22\x83\xa2\x49\xb0\x13\xc1\x7f\x22\x9d\x42\x5e\x67\x89\x93\x31\x78\xa9\xef\xff\x79\xf5\xd3\xee\xc3\x87\xaf\x8b\x9d\x2f\x24\xad\x87\x41\xd9\x53\xab\x0b\x3b\xda\xc2\xba\xb4\x98\x6c\x5e\x2c\xf0\xab\x2b\x36\x63\xc2\x8b\x17\x31\x59\xcc\x85\x1a\xbc\x01\x6a\xa1\x51\x2a\xe0\xdd\x8c\xb3\xe1\xf4\x0f\xcc\xb5\x96\x85\x1a\x93\xa6\x46\xb5\xeb\x5c\xc6\x2d\x1a\x89\x0b\x52\x97\xc1\x05\x2e\x17\x0d\x99\x46\x29\xff\x1f\x7b\xff\xba\x1c\x37\x6e\xf5\x8d\xe2\xdf\x9f\xab\xe0\xc3\xfc\xff\x4f\x92\x1d\x52\x52\xb7\x0e\x96\x67\xd7\xfb\x3e\x96\x25\x7b\xc6\x1e\x5b\xd6\x58\xf2\x4c\x26\x8a\x2a\x85\x26\xd1\xdd\xb0\xd8\x44\x0f\x88\xd6\x61\xb2\x53\x95\x7b\x78\x3f\xec\x7a\x6f\x60\xdf\xc8\xbe\x93\x5c\xc9\x2e\xe2\x40\x02\x20\x40\x82\xec\x96\x2c\x27\x99\xaa\xb1\xdd\xdd\x04\x08\x2c\x2c\x2c\x2c\xac\xc3\x6f\x25\x63\xc6\xcd\xcf\x76\x47\xe5\x3a\xef\x8f\xb7\x76\x76\x0f\xcb\x0b\x3c\xdb\x60\xcf\x47\x02\xfa\x6f\xbc\xb5\x73\xf8\x6c\x6b\x7f\x87\xe7\xdb\xb1\x00\x90\x67\xc1\xfe\xd6\xf3\x83\x3d\xc0\x2b\xe0\xf1\x3f\xf9\xf8\x77\xb7\xf6\xcb\x9d\x96\x89\xa4\x8b\xdd\xc3\xdd\x64\x8b\xf9\xba\x98\xb1\xf6\xf9\xde\x16\xaf\x3b\x77\x10\x6f\x8d\x99\x1b\x75\x6f\x77\x2f\x16\x89\x15\xcf\xc7\xfb\xcc\xad\xcb\x4a\x5c\x3e\x3f\x2c\xc5\xd7\xb3\x7d\xc0\x30\x04\x03\xfe\xa7\xd0\xcd\x44\x62\xc2\xde\x98\x55\x46\xdb\x97\x7f\xca\x5f\xf7\x77\x9e\x6d\x1d\xee\x30\xe7\x39\xab\x78\x37\xde\x63\xf5\xda\x76\x0f\x9e\x05\x07\x5b\xfb\xcf\xc7\x25\xd5\x19\x22\xa1\x62\xe1\xdf\x3a\x64\x09\x24\x63\x16\x00\x3d\xda\xe1\xc5\xc9\xb6\x0e\x99\xd3\x7a\xeb\x39\x2f\x04\xba\xf3\x8c\xa1\x7c\x33\xda\xec\xc5\xfc\x07\x96\x3d\x22\x62\x59\x59\x98\x1e\x07\x4c\x15\x7d\xcd\x4b\x61\xbd\xc3\x8f\x31\x56\x1a\x74\x6f\xbc\x17\x1c\x6e\x3d\x1b\x1f\x96\x82\x90\x85\x42\xf3\x40\xe8\x03\x26\x18\x03\x86\xd6\xca\xfc\xdc\x07\x5b\x07\xbb\x25\x79\xc7\x2c\x00\xbb\x86\x03\xd9\x65\x8e\x86\x11\xb3\x8b\x3f\x7f\xc6\xa2\x0a\x0f\xc1\x78\xeb\x70\xff\x79\xc0\xff\x14\xbe\xbf\x43\x5e\x74\xff\x40\xe8\xaf\xac\x4a\xde\x2e\x0b\xa5\x7a\x3e\x0a\xf8\x5f\x25\x67\xb1\x79\x1d\x96\x32\x7b\x6f\xf4\x8c\x9d\xbb\x23\xa6\x6c\xb0\x3e\xf7\xca\xb3\xe0\x70\x4f\x8a\xff\xad\x7d\x86\xb4\xb7\x3f\x9a\x1f\x6c\x8d\xf7\x18\x50\xea\x3e\xcb\x52\x79\x9e\x6c\xed\xef\x8c\xb6\x0e\xc6\xbb\x5b\xfb\xac\xbe\xea\xde\xb3\xe7\x35\xbf\x95\x6c\xbc\xcb\xea\xdd\x8e\xb6\x9e\xb1\xb0\xdd\xf1\x1e\xd3\x0d\x18\xa7\xc6\x15\x1f\x97\x14\x3b\x64\xd7\x98\xf1\x6e\x5c\xb1\x39\xdb\x21\x8c\x05\xc7\xd2\xe3\x29\x77\xc8\x2e\xe7\xe4\x98\x73\x32\x13\x16\x8c\xe3\x58\xcb\xd1\x1e\xd7\x46\x0e\x18\x5c\x7b\xa9\x8e\xec\x1d\x1e\x3f\x67\x49\x63\xbb\xac\x66\xef\x88\x57\xeb\xde\x3d\x14\x61\xcf\xbb\x5b\xfb\x87\xfb\x60\x6f\x6b\xf7\x19\xc3\x4e\xac\xde\xc5\x14\xaf\x67\x7b\x7b\xcc\xa2\xf3\x6c\x6b\xcc\xc0\x02\x9f\x8f\xf6\x03\xfe\xa7\xb0\x3a\xb3\xf0\xd7\x67\xcf\x98\xe9\x75\x6f\x77\xbf\xe4\xe8\x31\xab\x07\xf8\x3c\xde\xda\x1d\xb3\x5c\x48\x56\xc6\x77\x87\xcd\xe8\x90\xe5\xdc\x95\x7f\x56\xce\xdd\x72\xf9\xf6\xf7\x19\x56\xfd\xb3\x5d\xf1\xa7\xcc\x07\x79\xce\xf3\x57\x76\xf6\x38\x47\x07\x25\x47\x77\x49\xba\xbf\xfd\xed\xf7\xbf\x8f\x52\x38\x45\x39\xfc\x9d\x28\x2f\xb0\x42\xdb\x14\x2e\x96\x19\xa0\xb0\xd8\x06\x59\x86\x39\xb4\x78\x11\x46\x97\x21\xbc\x5b\x62\x42\x8b\x30\x0a\x5f\xc0\xc5\x04\x92\xea\xc9\x78\x0a\x12\x8a\xc9\x7d\x78\x15\xfd\x6e\xba\xca\x93\xb2\xc5\xef\x60\x44\x7f\xff\xd7\x0f\x93\xcf\x30\xa1\x5b\xfc\x1d\x67\x04\x2f\x21\xa1\xf7\xbf\x83\x51\xf8\x97\xbf\xc0\xe2\x3d\x2b\x2b\x14\x46\x7f\xbd\x01\xd9\x0a\x7e\xf3\x9f\x3b\x7f\xfb\x7d\x04\xb7\x44\xbe\xe6\xff\xb8\xc1\x28\x0d\x76\xfe\xe3\x06\x90\x00\xfd\x8f\xdf\xed\x44\x74\x2b\x21\x10\x50\x78\x21\x5e\xfa\x9a\xbf\xf3\xf7\xbf\xfb\x2b\x4a\xbf\x09\xc9\x2e\xfa\x29\x1b\x4d\x51\x18\x4d\x32\x9c\x5c\x7f\xf3\xdb\xcb\xcb\xcb\xc3\xe8\x72\xf7\x79\xb4\x73\x15\xe5\xab\x2c\xe3\x7f\x5c\x5e\x86\x32\x1f\xf4\x2a\xba\xbc\xbc\xbc\x1c\x45\xe1\x9f\xff\x9c\x07\x41\xf9\x71\xef\x20\xba\x1c\x97\x8d\x9e\x45\x63\xa5\x91\xda\x9e\x7f\x16\xad\xc2\xab\xab\xe8\xf2\xaa\xfc\x4f\xff\x26\x9a\x82\xac\x80\xd1\x25\x07\x6e\xce\xc0\x3d\x5e\xd1\x30\x0a\x13\xbc\x58\xe2\x1c\xe6\xe5\xbf\xd9\x3d\x0d\xd2\xf0\xea\x4a\x56\x57\x3a\x05\x0b\xf8\x4d\xc7\x22\x6c\xcd\x27\x45\x18\xa1\xe2\x9c\x12\x94\xd0\xf7\x38\x85\xdf\xfc\xe7\xe8\x6f\xbf\xff\x8f\x9a\x68\xc8\x7f\x45\x95\x7f\x3f\xf5\xc5\x5d\xed\xbf\xfa\x96\xfe\xf2\xec\x40\x5d\xdc\xbd\x71\xb5\x58\xa3\x72\x29\xd5\x7f\xef\xee\x44\x3b\xd1\x65\x38\x21\x10\xa4\x09\x59\x2d\x26\x45\x58\x2e\x12\x5b\xbc\x2b\x75\x4d\x39\x03\xf0\xd5\xe7\xdc\x32\xae\x7e\x09\x5f\xb0\xa6\xa1\xe8\x70\x54\xf5\xa0\x2d\xf6\xa8\xfe\x56\x61\x9f\xbd\x36\xf6\xb9\x8a\x2e\x43\xd9\xb5\xe4\x14\x08\x92\x79\xc9\x16\x94\x80\xe4\x3a\x06\x84\x80\xfb\x30\x52\x26\xb0\x11\xf6\x51\xfe\xed\xc7\x49\xff\xd1\x9b\x93\xb6\xa7\x4f\x5e\x52\xbc\x41\xf9\xdb\xd1\xe9\x73\xa2\x32\xd3\x48\xac\xdc\x7e\x29\x2d\x2a\xfe\x29\xb5\xb6\x9f\x10\x9d\xbf\x83\x20\x45\xf9\xec\x3c\x03\xc5\xbc\x5c\xf4\x30\x88\x83\xe0\xa8\x9a\x73\x10\x46\xb2\x85\xba\xa5\xc2\x62\x8e\x09\x7d\x93\xf2\x16\x53\x94\xc1\xe2\xbe\xa0\x70\x11\x56\x8c\x58\xf1\x91\x64\xbe\x91\xc2\x7c\x4a\x57\xca\x90\xd4\x6f\x2d\x0c\x69\xe3\xe2\x05\x4e\x61\x56\xae\x44\x39\x9d\xf2\xef\x82\x82\x92\x87\x5e\xa0\xe2\x35\x2a\x89\x1a\xbe\xe0\x98\x0e\x98\xdc\xbf\xca\x29\x41\x90\xad\x5b\x81\x09\x95\xcb\x20\x3f\x9f\xc0\x22\x81\x79\x49\x0b\xe7\x98\x22\x95\x78\xea\x67\xf6\x56\xe5\xb3\x78\xbb\xf2\x4d\x63\x14\x6a\x6b\x75\x34\xc6\xf7\xea\xa8\x94\x6d\x6e\xca\x61\x8a\x28\x9b\x6d\x3d\xdc\xb8\x58\x4d\x72\x70\x13\x46\xe1\xb4\xd8\x9e\x10\x7c\x5b\x40\x32\x7c\x4b\x6d\x4f\x1f\x4c\x3e\x6f\xa3\x3c\x85\x77\x4f\x7d\x63\x65\xd7\x3b\x6f\x3f\x4f\x9f\x61\xf7\xc6\x0a\xad\x9b\x46\x32\x68\x0e\x16\x50\x95\xd3\x03\xb6\x07\xef\xca\xbe\x33\x46\x3b\x51\x58\xc0\x44\x36\x19\xed\x45\xc6\x17\x63\xed\xf1\xbd\x51\x35\x40\x48\x08\x26\x8c\xeb\xc4\x71\xc1\x0f\x8c\xd1\x0e\x9b\x14\xef\x48\xad\xc3\x12\xa0\x22\x4e\x41\x3e\x2b\xb9\x49\xeb\x37\x08\xac\x6d\x13\x9c\xad\x16\x79\x61\x7d\xd8\xf9\xb8\xe3\xe9\xea\xf9\x70\xbe\x5b\x4f\x93\xf1\x7e\x39\xac\x3d\x67\x33\xd1\xd0\x98\xb4\x68\x1a\x2a\x3a\x8e\xd1\x60\xd7\x3d\x84\x71\xdf\x77\xa5\xb0\x48\x08\x5a\x4a\xf1\xe6\xfd\xc6\xb6\xaf\x9b\x94\x2b\xe9\x90\xc0\x9c\x42\x02\xd3\xf2\xdf\x0b\x94\xa3\xc5\x6a\xd1\x49\x50\x0e\xec\x54\x13\x95\x7f\x36\x16\x7b\x3f\x0a\x71\x9e\x64\x28\xb9\x0e\x2b\x6d\x60\x57\x72\x68\x2d\xb7\x70\x7e\x82\x8a\x05\x2a\x0a\x9d\xe1\xf7\xa2\x3d\xed\x3d\x76\xe2\x7d\xb8\x06\xf7\x83\xc9\x62\xf9\xd2\xf8\x4a\xa8\xb5\xca\x0e\x52\x98\x6a\x64\x32\xd5\x2d\xa2\xf3\x78\x0e\x41\x4a\x30\x5e\xf0\x4f\xd3\x0c\xde\x59\x86\xaf\x2e\x87\x39\xb1\x5a\x30\xe8\x03\x75\x0b\x09\xdb\x96\x1a\xf1\x15\xd8\x89\x2e\xc7\xcf\x4b\xfd\x6f\xb5\x58\x42\xc2\x52\x16\x02\x0a\x66\x16\x91\x53\x1e\x4a\xab\xe2\x38\x03\x7c\x21\xae\x5a\x76\x60\xa3\x6d\x92\x21\x98\xd3\x73\xd6\x83\x63\x44\xad\x64\x76\x93\xc4\x10\x3f\xf2\x85\xa8\xf8\xb8\xca\x73\x7e\xcc\x29\xa2\xc8\xca\xe9\xf4\x16\xc7\x05\x85\xcb\xb8\x83\x99\x6a\xe1\xba\xa7\x08\xd7\xcf\xb8\x54\x38\x5b\x65\x6c\x14\x96\x0f\x29\x27\xb1\x4b\xf4\x7a\xf0\x28\x1f\xc0\xbe\x26\xdd\xd1\x2c\xff\xc8\x12\x30\x4a\x45\x25\xcd\xe0\x05\xbc\x63\xff\x4e\x40\x9e\xc0\xac\xfa\x84\xf3\x29\x22\x0b\xe3\x23\x1b\xf2\x7b\x5e\xbe\x9b\xcd\xe3\x16\x20\x8a\xf2\xd9\xb1\xf2\x33\x57\x7b\x44\x15\xba\x28\x7c\x81\x73\xf1\x6b\x39\x20\x4a\x56\x30\x0a\xcf\x29\x5e\x72\xc6\x0c\xa3\xf0\x98\xbd\x37\x28\xbf\x0b\xa3\xf0\x67\x58\x44\x81\xf6\xfb\x11\x81\xc1\x3d\x5e\x05\xc5\x8a\xc0\xff\x0e\x2e\xe6\xa8\x08\x6e\x51\x96\x05\x04\x16\xc9\x1c\x96\x87\x6c\x40\xe7\x30\xa8\x49\x1a\xe0\x3c\x00\x41\x8a\xa6\x53\x58\xde\xcc\x03\xce\x4e\x5b\xa1\xa2\x30\xe1\xe5\x91\xaa\x4f\xea\xeb\x2f\x64\xcb\x81\xb2\x32\x1d\x2d\xc4\x53\x04\x16\x14\x10\xea\x7c\xb0\x5a\x3f\xf1\x86\x67\xee\x37\xd4\xb2\xab\x65\xd1\x9f\xe8\xea\x7e\xe4\x64\x30\x17\x58\x7c\x2d\xd7\xd8\x7c\xaa\x65\x99\xd9\x73\xc6\x1a\xa3\x3c\x5e\x66\x20\x81\xca\xb2\x76\x91\xff\x0b\xad\x6c\xb3\xad\x73\x71\x6d\xe7\x83\x65\x7f\xdb\xbf\x10\x42\x9a\x0b\x29\x30\x2b\x4f\xcf\x39\xce\x32\x7c\x5b\xfe\xab\x58\x80\x2c\x2b\xff\x01\x32\x9c\xc3\x20\xc7\x31\x85\x77\x34\xae\x8a\x7a\xba\x0e\x95\xa6\xa8\x4c\x4d\x89\x5c\x73\xe2\xa1\x7a\xc3\xcf\xd0\x72\x82\x01\x49\x19\x8f\x59\x84\x1c\xef\xa8\xc1\xdd\xae\xb9\xd5\x02\x78\x82\xef\x60\x1a\x0b\xf5\xb2\x9a\x5b\xc7\xa9\xd8\x6c\x19\x4f\x70\x7a\x1f\xa0\x3c\x43\x39\x8c\x99\x0a\x8f\xb8\x39\xae\x45\xb1\xac\x09\x9c\x81\x09\xb4\xbd\x53\x3f\x71\x83\x13\x48\x01\xca\x8a\xb6\xb3\xcb\xd2\xf9\x12\x20\x12\x7c\xc6\x93\x38\x43\xf9\x75\xbb\xee\xaa\x2c\x39\xb4\xae\x22\xff\xef\x2d\x9e\xf4\x39\x30\x9e\x2b\x0b\x49\xf0\x8a\x32\x69\x20\x8e\xa1\xe8\xb2\x3c\x9f\x8a\x2d\x76\x92\x55\xb6\xa1\x1d\xc7\x31\x56\x31\x8c\xe4\x77\xa7\x99\xb0\x5d\x25\xe0\x7d\xd9\x55\x94\xb2\x8d\x69\x2e\xec\x4d\x6e\x56\x9f\x77\x63\xf4\x3e\x66\x47\xce\x06\x49\xce\xcf\xb0\x62\x8b\xff\x6d\xb9\xe1\xe1\x14\xf2\xfd\x34\x90\xc0\xac\x03\xd5\xb2\xb2\x0e\x91\xbd\x25\x96\x63\x6f\xf6\xdf\xcc\xa5\x9a\x5c\x4b\x3c\xeb\xba\x7c\x84\x3c\x73\x3f\xf8\x44\x51\x26\xe2\xf5\xfc\xf4\x47\x87\xf0\x68\xbf\xda\x0e\xd1\x2d\xdb\xaf\xab\xfd\x2f\xac\x2a\x83\x8d\x1c\x77\xfc\x92\xcd\x20\x25\x28\xb1\xdd\xf6\xa3\x30\x59\xae\x42\x97\x0e\xd2\x7d\x4f\x7d\xcc\x91\x2e\xe0\x82\x59\x69\xfa\x0e\xd6\x71\x47\xeb\x58\x2a\xb8\x58\xd2\xfb\x78\x21\x94\xa5\x8e\x05\xd3\x2c\x06\x5a\x4b\xc6\xb8\x2c\xac\xcc\x4d\x19\xe5\x3c\x41\x45\xfe\xe7\xdf\xd2\x80\x70\x8e\xea\x6f\x32\xb0\x0c\xc0\xc2\xc9\xea\xcb\x3f\xe4\xd9\xbd\x7c\x9f\xa2\x7f\x15\xc1\x8a\xed\x22\x68\x3c\x4e\xc4\x26\x2b\xb6\x86\x93\xbe\xaf\xe6\x23\xb8\x46\xb5\xcc\x52\x50\x5c\x97\xf7\x47\x58\xd8\x54\x8f\x42\xfc\xe2\x52\x3f\x36\x2c\x97\xac\xd4\xbd\x00\xc5\x75\xe1\x27\x7e\x94\x6b\x77\x53\x81\x09\xa3\xcb\xfd\xb1\x66\xb4\x85\xa9\x98\x79\x14\x66\x30\x9f\x71\x5b\x71\x88\x8a\x78\xba\xca\xb2\x78\x92\x41\x28\x34\xaf\x16\xe1\xe5\xec\xa7\xb9\x2b\x04\xf5\x77\x15\xea\x73\x16\xf0\x30\x75\x97\x57\x0f\x6e\x21\x50\x14\x72\xf5\xd5\x43\xec\xd4\x6c\xae\x05\x25\x68\xc9\x26\xea\x77\x20\x1e\xb2\xfe\x46\xd1\x65\xc8\x57\xcc\xcb\xb3\xd9\xdc\xe7\x25\x91\x24\x23\xa0\x22\xce\x01\x21\xea\x69\x64\xdb\x9e\xe6\xfb\xcb\xf9\xc4\x93\x4a\x8e\x31\x82\x2e\x09\x5e\x32\x35\x40\x28\x40\x3e\x43\x0a\x82\x53\xb0\x30\xb7\xa7\xeb\x0c\xef\x3d\x10\xb6\x85\xbc\x47\xc2\x56\xb3\xf7\x50\x14\x82\xda\x65\x53\x10\xbc\x03\x05\x0d\x5e\xdd\xe8\xba\x56\x8b\xc0\xe9\x39\x4b\x78\xc3\x94\xae\x0c\x14\x54\xd8\xfa\x29\xea\xb1\x00\x17\x68\xc0\x02\x78\xcc\xfa\xc7\xf2\x2c\x85\x45\xbf\x29\x7b\xf4\x7b\x7c\xf6\x69\xe3\x7d\xbe\x67\xa7\xb2\x6f\xb7\x6d\xe4\xd1\xd7\x8d\x1f\x5b\x03\xb6\xa9\x90\x57\x7b\xc6\x69\x21\x6c\x19\xcc\xbc\x2c\xa4\xd1\x58\x55\x2f\x2c\x16\xe7\xb0\x6c\x77\x2c\x0c\xd2\xda\xf3\x91\xc5\x73\xa7\xf6\xd6\x61\xdb\x11\x74\x18\x5b\x09\x21\x7d\xe3\x8d\xd8\x88\xa7\xa4\xb2\x9c\x62\xed\x80\xeb\x5c\xf5\x75\x34\x94\x23\x45\x29\x61\x16\xa3\x1c\xd3\x60\x0e\x6e\x60\x50\xae\x4f\x11\xac\x72\x8a\xb2\x80\xce\xe1\x7d\x00\x08\x0c\x50\x1e\x80\x4a\xa1\x61\x62\xec\x51\x54\x15\xe3\x80\x95\xbe\x46\xdb\xc9\xda\x5b\x07\x19\xae\x85\x04\xc1\x59\x39\x10\xaf\x0b\x73\xbb\x1d\x45\x57\x2f\x9c\x57\x68\xb7\xb6\xa0\x46\x07\x30\xe2\xf8\xdf\x66\xb9\x54\xd8\xdd\xd0\xe1\xed\x92\x64\xd6\xe3\x74\x5d\xf1\xf8\x1d\x2e\x68\x70\x94\xa6\x04\x16\x9b\x97\xe7\xef\xc1\x72\x09\x53\xb6\xc4\x9b\x15\xc0\xbb\xeb\x08\x60\x36\x70\xbb\xff\xb6\xf1\x98\x8b\x95\xb4\x07\xd9\x90\xf6\x14\xe1\x2b\x8c\x73\xf6\x33\xb6\x95\xb0\x7d\x5f\xbd\xc3\xce\x83\xd1\x7e\x74\x20\x34\x74\x11\xab\x1c\x36\xc6\x34\xc7\x05\x7d\xb3\x64\xea\xe9\x37\xcd\x5f\x59\x8c\x40\xe5\x27\xdb\x2b\x8f\x16\x32\x83\x34\x8c\xc2\xbf\x4c\x32\x20\x8c\x52\x7b\x51\x48\x84\xad\x06\x2f\x61\x0e\x49\x90\x63\x02\xa7\x90\x10\x87\x3b\xbc\x9b\x52\xd5\xa8\x78\xcb\x6f\xec\x4f\x55\xa3\x6b\xa5\x45\x2b\x45\x37\x43\xee\xc6\xc8\x28\x1e\xb4\xcc\xed\xec\xbf\xe7\x3e\x77\x77\x07\xd9\xbf\x0c\xb3\xbe\x7a\xcf\x82\xe4\x06\x25\xce\x3b\xd6\xa3\x9e\x04\xe7\x62\x2c\x4f\xec\x30\xa8\x48\xd4\xf7\x3c\xd8\xdf\xf0\x65\x6e\xfc\x70\xa7\x83\x7c\xc5\xa8\xf5\x15\x7d\xe4\xb8\xf7\xce\xba\x00\xb3\x21\x07\x4f\x7b\xa7\x1f\xf2\xe0\xd3\x32\xb5\xdd\xf9\xd6\xed\xf9\x18\xe7\x39\x4c\xe8\x7f\x6f\xbc\xe3\x4f\xcb\x82\x12\x08\x16\xde\xc4\xf0\x3b\x29\xf7\x9f\xde\x49\x79\xd0\x19\xf3\xe1\x41\xd5\xb5\xdf\x5c\xea\x78\xef\x36\x77\x4e\xcb\x1d\x94\xe1\x7c\xc6\x5c\x9b\x7e\x83\x12\x11\x74\xa3\xfd\xf2\xb6\x1f\x89\x30\x16\x75\x98\x14\xcc\x0a\x4b\xe4\xdc\xe3\xd1\x09\xe7\x7c\x27\x3d\xd2\x2a\x09\x5b\xa2\x3a\x82\x84\x6f\x39\xa6\xba\xfc\xcc\x8e\xaa\x53\x1c\x6e\x76\x30\xec\x72\xa4\x44\x9d\x3f\x53\xc3\xce\xa5\x2f\xdd\x36\xa6\x28\x2c\x50\x0a\x13\x40\xc4\xe1\x55\x32\x16\xc1\x77\xf7\x61\x14\xae\xe4\x86\xee\x08\x50\x77\x2f\xc3\xb3\xa8\xdc\xa6\x05\x45\x39\xbb\x5d\x9e\xaa\x7b\xe5\x1b\xfd\xb1\xf2\x06\x9a\xbd\x44\x79\x5a\xca\xe8\xd0\xbc\x9a\x3f\x6b\xb8\xf4\xbd\x08\xd6\x2e\x7a\x0e\xdc\x5a\xca\xfe\x86\xb5\x94\x4a\x5b\x04\xc5\xc7\x2a\xe8\x86\x59\xdd\x8a\xc7\xd0\x57\x3a\xfc\x7a\xcc\xb3\x27\x23\x81\xf8\xa8\xd6\x56\x61\xba\x95\x96\xc3\xc1\x11\xb3\x9b\x5b\x8f\x5b\x50\x9c\x11\x08\x17\x4b\x2a\x2d\xdd\x7e\x0b\x51\x12\xf4\x16\x90\x5c\x44\x9b\x6f\xd2\x9a\x20\x87\x13\xbc\xbc\xdf\xf4\x22\x84\x86\x05\x45\xbc\x8a\x34\xdd\x12\x3e\xf3\x77\x05\x8d\xf8\xf5\xd0\x2b\x78\xc4\xe8\x52\x0f\x3c\xf0\xbb\x65\x1a\xe1\x97\x7a\xc8\x65\x4d\x09\xdf\xb0\x4b\xa3\x7f\x6b\x4f\xed\x41\x98\x1e\x52\xca\xef\xc7\x35\xe8\xd1\x1d\x86\xd1\x3d\xcb\x76\x05\xa8\x63\x02\xaa\x40\xe8\x88\xdf\x50\x53\xcd\xb4\xec\x30\x0b\x37\xfb\xba\x17\xda\x67\xd6\x12\xc9\x51\x37\x6e\x73\x46\x0c\x59\xbd\xae\xa8\xa5\xf5\x96\x51\x8f\x62\xda\xf4\x12\x29\x51\x4d\x16\x72\xf2\x98\xdc\xcd\x2c\x4d\x7b\x30\xd3\x03\xaf\xce\x92\x20\x4c\x10\x6d\xb3\xa8\x0f\x5f\xa1\x33\xd1\xf9\xb0\x65\x92\xef\x1b\xb6\x95\x39\x55\xeb\xe9\x3d\x9a\xc8\xea\x8c\x1d\x5b\x8f\xa6\x8d\x58\xb2\x1e\x14\x5d\x2b\xb6\x4c\x93\x93\xfe\xf1\x65\xdd\x2b\xd5\x1d\x6b\x56\xf7\xb1\xe9\x3d\xf0\x20\x4b\xf4\x11\xb2\x3a\x69\xa9\xc5\x83\xea\xb9\x50\x3d\x58\x5f\xde\x59\x9f\xab\x1e\x13\x85\xba\x55\x08\x4e\x28\xa3\xb7\xda\x6f\xaf\x5f\xc7\x11\x5e\x91\xd8\xea\x50\x7e\x30\x2a\x8f\x77\x3c\xa8\x5c\x45\x9e\xb1\xdd\xc1\xa3\xdc\xcb\x8d\xf5\x1e\xbd\x0c\xdd\xbc\x3b\x9c\xee\x2d\x17\x43\x8f\x50\x36\x8b\x6e\xeb\xe7\x19\xae\x2f\xf0\x6b\xf9\x86\x8d\x80\xb6\x60\x86\xf3\xfe\x76\xc2\x81\xbe\xe2\x80\x27\x16\x28\x79\x04\x73\x50\x04\x13\x08\xf3\xa0\xa0\x98\x79\xcb\x40\x9e\x36\x1a\xcd\x00\x99\x80\x19\x0c\x12\x9c\x65\x30\xa1\x30\xdd\x5a\x6f\x45\xae\x14\x43\xc0\xa0\x8b\xa0\xc4\x52\x18\x59\xa2\xdb\x24\x97\xa6\x47\x2a\xc6\x44\x88\x8a\xd7\xab\x6c\x8a\xb2\x4c\xdc\x15\xfd\x5a\x55\x5e\x89\xea\xf5\x5f\xc8\x4d\x5d\x5d\x2c\x95\xf1\x3d\xc2\x35\xdf\x1e\xd6\xd6\x08\x5a\x6b\xa5\xe2\xd5\x95\x1a\x0f\x52\x94\xb7\x4f\x54\xe0\x0c\xd0\xde\xf1\x69\x87\x5f\x2c\x3e\xcd\xc3\xdb\xfc\xe6\x64\xb0\xff\xc3\xed\x9c\x28\xae\x83\x6f\x09\x5e\x2d\x37\xde\xf5\x31\x4b\xb7\x36\xb7\xfa\xfa\xfd\xbe\xc7\x29\x9a\xa2\x07\xe8\x98\xdf\xc4\x37\xde\xed\x8f\x90\x14\x6a\x6e\xe8\xa6\xfa\x3d\xc5\xe9\xe6\xa3\x25\xbe\x96\x00\xb5\xc3\xf5\x03\xd4\xc6\x63\x67\x10\x7c\x82\x73\xaa\x24\x55\x3d\xd7\xa2\xe0\x45\xee\x68\x5b\x5c\xd9\x73\xb7\xe5\xf8\x70\x13\x96\xe3\xd1\x6e\xf9\x39\xa4\xa5\x96\x84\x6f\xc3\xc8\xfa\x2f\x69\x9e\x57\xbe\xec\x81\x2a\x81\xa6\xe5\x0f\x89\xa0\x08\xbc\x83\xc9\x36\x5e\xc2\x5c\xe6\xe4\x36\xb3\x74\xa3\x90\xa5\xc1\x2f\x21\x61\xd9\x6e\x51\x98\xe0\xe5\x7d\xfd\x63\x79\x79\x8b\x29\x0e\xa3\xb0\xfc\x19\xd0\xb8\xbc\x29\xa3\x94\xdf\x27\x17\x80\x94\x0a\x06\x25\x28\xd1\x90\x7d\xc2\x0c\x4d\x61\x72\x9f\x64\x30\x4e\xe6\x3c\xb3\x31\x43\x05\x8d\x29\x98\xb0\x81\x53\x50\x5c\xc7\x7c\xb6\x9f\x31\x62\x03\xb5\x62\xd1\xd4\x89\xac\x31\x0b\x38\x8d\x29\x5a\x40\xa6\x44\x55\xc3\x91\x0f\xa4\xf1\x1c\x12\xfa\xab\xed\x87\xc9\x3d\x8f\xd5\x06\x79\xaa\x13\x8d\x91\x76\x30\xf4\x06\xc3\xc7\x78\x30\xf4\x0d\x1e\x79\xf9\xb4\xc1\x37\xde\x1c\xfd\x72\x7c\xf3\x6a\xf6\x9d\x1b\xff\xaa\x81\x68\xa4\x43\x24\x69\x3e\x00\x5f\x24\x2c\x0d\x65\xe5\xe1\xd0\x8a\xd8\x0a\x3c\xe8\xf2\x7e\x05\xb8\x45\xb3\xc5\xf9\xf9\xe8\xfc\xcd\x77\x6b\xe2\x16\x31\x6d\xa5\x36\x9f\x54\x39\x28\xb5\xad\x6f\x08\x5a\x11\xdb\x22\xca\x10\xea\x6e\x9f\x0c\x4c\x91\x3a\xa4\xa7\x8f\x52\xc4\xc4\xf2\x66\xf1\x89\x04\x9f\x3f\xec\x3e\xfa\x2a\x90\x8a\xb6\x3f\x4f\x66\xdf\x9f\xdd\xbd\x6d\x41\x2a\x32\xb6\xc9\x20\x8c\x22\x73\x53\xfc\x1b\x9d\xc8\x6e\x9c\xf9\x37\x3a\xd1\xbf\xd1\x89\x06\xab\xf1\x1e\xe8\x44\x03\xf0\x88\x74\x0e\x70\x05\xa2\x85\xae\x64\x6a\x11\x00\x78\xc6\xa2\x7c\x5a\x12\x12\xf7\x34\x2c\x0a\x61\xae\x51\x71\x8b\x1a\xb7\x24\x3b\xf8\x86\xc3\x05\xcf\x02\xa5\xf6\x3d\x06\x78\x15\xe9\x2f\x35\x17\x95\x02\x23\x8d\xd7\x8a\xa4\x04\x87\x01\x29\xc9\x2c\xbd\xde\xac\xe0\x5e\x44\xe7\xc2\x3c\x24\x82\xd2\x41\x13\x41\xa9\x3c\x01\x98\x65\xc8\x80\x53\x8a\x5c\x87\x03\x3f\xf8\xc5\x5f\xb2\xa5\x15\x69\xc9\xf2\xa4\xe5\x19\x3b\x36\xa3\xd6\xc3\x1a\x90\x4d\xcf\x9e\x2a\xa8\xcf\x05\x27\x0d\xc7\xf4\x31\xb1\x7c\xc4\x8f\x3e\x50\x3e\x25\x81\x5a\x40\x7c\x44\x4f\x6d\x60\x3c\xd6\x47\x84\xe4\x3d\x6c\xe2\xef\x5c\x88\x15\x79\x10\xe4\x9d\xaf\x08\x9d\x86\xa9\x5f\xc3\x71\x69\xda\x95\x15\x4f\xa7\xde\x79\xb9\x20\x30\x0d\x8e\x3c\x21\x52\x6a\x0d\xf2\xb9\x3d\x9d\xbf\xec\xed\x88\x3a\x5d\x9d\x8d\x83\xce\x2a\xc3\x4a\x22\x17\x73\xd1\x91\x5d\x88\x79\x3a\x3a\xfb\x51\x23\x08\x5e\x8b\x37\xeb\x04\xe9\x52\xb4\x5a\x89\xa2\x4d\xc6\xe5\x00\xf6\x50\x00\x1e\x96\x11\x4e\x08\xba\x81\xc4\x9b\x09\xec\x62\x3a\x65\x9d\x78\x1d\x73\x0f\x39\x97\x77\xd2\x1a\xe8\xad\xa0\x3a\x7d\xd1\xad\xd3\xad\xac\x8e\xa7\x4e\x34\xa4\x41\xea\x5f\x6f\xe9\xd6\x5f\xa8\xfd\x1b\xa5\xa7\x13\xfb\x66\xc7\x86\x62\xf2\x14\x41\x7a\x06\x0d\xf4\x9f\x16\xa3\x87\x9d\xaa\x5f\x18\x9d\x47\xa4\xbb\x73\x5c\x9e\x47\x46\xe2\x71\x6c\x2b\x21\xb2\x6e\x18\x60\xc5\x7b\xbc\xca\x9f\x46\xd2\xbb\x09\xa0\xd1\x76\x52\x6c\x32\xd3\x71\xd4\x9a\xe9\xd8\x46\xb4\xbe\xc9\x8f\x9b\x42\xb2\x79\xd4\x64\xf8\x93\x3a\xd9\x66\xe3\x7d\x9f\x41\xb2\x40\x45\xa1\x85\x8d\x6c\xaa\x6f\x1e\xa1\x19\x9c\xb3\x15\xdd\xac\x27\x79\x2d\xa8\x93\x87\xc9\x1f\x54\x61\x4e\x38\x8f\x3e\x52\xaa\x7d\x98\xb0\x20\x54\xef\x00\x61\x75\xa0\x4a\x1e\xd7\xd3\x48\x64\x17\x89\x76\xea\x18\x09\x04\x69\x29\xd0\xd9\x49\xf9\xb1\xdc\xbc\xfc\xaf\xed\x9f\x08\x12\xbe\x95\xcd\x0d\x4b\x11\xd8\x63\xdd\x7e\x75\xfe\xc6\x96\x51\xa3\x76\x68\x01\x5c\xb3\x85\x15\x17\x68\x8b\xf3\x47\x21\xfe\x56\xf0\x42\x77\xd5\x0c\x3f\xc5\x56\x57\xc5\x58\xa1\xe2\x0c\x12\x89\x0d\xcc\x9b\xbf\xba\xa3\x30\x2f\x94\x2c\x2b\x75\xe0\x52\x9c\x9a\x60\x3b\xb2\xf1\x09\x4c\x32\x40\xa4\xb5\x63\x29\xfb\x6e\x37\xec\x58\xde\xcc\x36\x6c\xf8\xa2\x89\xf8\x93\x83\x05\x2c\x96\x80\x0f\xbe\x27\xe6\xa9\xc1\x1b\x32\xc2\xf7\x6b\xa3\x4b\xeb\xae\xb4\x17\x74\x6a\x67\xb4\x26\x7f\x56\xd3\x71\xab\x2a\x5e\x3b\xa3\x5d\x2c\x7b\x23\x2f\x39\x3b\xf3\xb8\x59\x3f\xc4\xe5\xca\x71\xa5\x4a\xca\xe3\x49\x4b\x8d\x1c\x76\x97\xf2\xd0\x77\xda\xb5\x1d\x2d\x76\x52\x6e\xff\x7d\x8b\x0e\x04\x65\x76\xa9\xa4\x59\x3f\x50\xbf\x70\x5d\x54\x20\xe3\xe4\x97\x01\x93\xbb\x6d\x57\x00\x13\xed\xad\x4b\xe7\xef\x83\xfe\x70\x71\xbf\x1c\xd6\xb9\xbd\xbb\x93\xda\xe1\xe6\x77\x3b\x70\xe9\x2a\xe1\xba\x98\x40\x5e\x7a\x8a\xe7\xe1\xaa\x8b\x4f\x69\x15\xd3\xf0\x62\x90\xd5\xc9\xdc\xe8\x64\x2d\x28\x89\x5a\x72\x69\xaf\xbe\x5f\x3a\x15\xa5\x21\xef\x54\x0e\x70\xf5\x35\xd5\x6d\xd7\x25\x59\xed\xa3\xab\x9b\x79\x0a\x68\x39\x2e\xd8\x9d\xba\x71\x8a\x03\xd1\x7d\xb7\xc6\xe5\x94\xe6\xed\xfc\xee\x60\x59\x1b\x92\x8f\x03\xc7\xc7\xe7\x82\xeb\x0c\x6c\xf4\x8a\x34\xd1\x63\x16\x19\x4c\x41\x4c\xc1\x2c\x8c\xc2\x55\x9e\xc1\xa2\xf0\x0d\x64\xac\x63\x18\x45\x0c\x20\xbb\x53\x1b\x71\x8a\x95\xad\x50\x89\x47\xac\x83\x1c\x13\x9c\x27\x2c\x04\x48\xf4\xc0\x4f\xf3\x98\x39\x61\x4b\x3d\xf4\x06\x92\x02\xae\x1b\x0f\xf3\xf0\x91\x83\xdb\x19\x9e\x3d\xf9\xe0\xb2\x82\x1e\xbc\x2f\xd2\x83\x8b\xc1\x11\x31\x51\x18\xb0\x79\x3e\x6e\x64\x4c\x75\xd4\xdf\xa2\xd4\x72\x94\x84\xd6\x48\x33\x3f\x3f\x6c\xbb\xe7\x54\x46\x02\xd8\xc6\x6b\xca\x09\x9f\x6d\xc7\x3e\x65\x78\xb6\x2e\x3b\x97\x6b\xb0\x01\x6e\x5e\x2e\x33\xf4\x75\x94\x06\x4d\xde\xc1\xd1\x1c\xe7\x79\x4b\x54\xa4\x8a\x3c\xcd\x63\x1a\x59\x56\xe7\x2a\x4b\xcf\xe7\xf8\xf6\x23\x9c\xc9\xfc\x17\x25\xe4\xf5\xb2\xd1\xa2\x94\x89\x37\x90\x3f\x2d\x83\x29\x6b\x6e\x0f\x4f\x4b\x2a\x86\x3c\xb5\x0e\x2e\xcb\xbb\x0a\x66\xba\x02\x7f\xec\xca\xb6\x21\x76\x5b\x0a\xcb\xb6\x47\x78\x35\x94\x60\xf6\x44\x9c\xe0\x9c\x02\x94\x5b\x03\xbb\x1c\x4d\xec\x66\x67\xe3\xfd\xa8\x38\xc5\xef\x20\x48\x6d\x28\x16\x72\x87\x36\x43\x6f\x4a\x55\xb8\xbc\x69\x6a\x2a\xc1\x29\x0e\x8e\xb3\x55\x41\x21\x09\x64\x8f\x6d\xbe\xa7\xda\xe0\x5c\xac\x26\x22\xd6\xcb\x71\x8e\x5f\xcc\x61\x90\x88\xae\xe7\xa0\x08\x72\x1c\x64\xec\x0d\x16\xcb\xb2\x00\x44\xdc\x8b\x0e\x22\x86\x85\x58\x88\xc2\xed\x6c\x2b\x2c\x09\x66\xbc\x8b\xf0\xf6\x6c\x85\x52\x58\x6c\xe3\x15\x05\x33\xb8\x35\xa7\x8b\x36\x2c\x8e\x8f\x10\xa4\x01\x98\xe0\x15\x0d\x3e\xb0\x06\xe5\x95\x06\xdf\x40\x72\xbf\xd5\x36\x49\xab\xbf\x40\x23\xfe\x87\x8b\x8b\x57\x77\xc9\x1c\xe4\x36\x85\xa9\x27\xfd\x2f\xf0\x35\xcc\x03\xd9\x5d\xf0\x8a\x73\xd6\x86\x96\xe0\x35\x40\x19\x4c\x03\x8a\x03\x28\x5f\x40\xe7\x30\xc0\x39\x64\xc9\x02\x01\x2d\x5f\xbe\xd5\x9f\x00\xfb\x3b\x3b\x6b\x4f\xfc\x1c\x92\x1b\x48\xd6\x9f\xf0\x51\x50\xf0\x9e\xd8\xfe\x09\x96\x84\xdd\x01\x8d\x4c\xaa\x14\x50\x10\x4c\x09\x5e\x04\x13\xc8\x00\x7c\xcb\x9b\x2d\xc5\x8c\x1a\xb2\xce\x97\xdf\xd4\xf7\x76\xf6\x36\xb0\xe7\x68\xf0\x1a\xaf\xf2\x74\x9d\x79\xff\x34\x07\x34\xb8\xc7\xab\x3f\xff\x96\xc0\x20\xc3\xf8\xba\x9c\xd7\x14\x13\x6d\xde\x49\x29\x54\x99\x77\x69\x02\x83\x69\xf9\xca\xad\xe0\x0d\x0d\x20\xa2\x73\x48\x82\x14\x43\xee\x7a\x82\x77\xa8\xa0\x01\x26\x2c\xfc\x06\x10\xc8\xb0\x90\xc1\x8a\xce\x31\x41\xbf\x1a\xa4\xa4\x38\x28\x20\x0c\x50\x0f\x8a\xed\x6e\x84\x62\x47\xd5\x78\x2c\x3a\xb6\xf2\x46\xc6\xd4\x21\xd3\x48\x08\xb4\xc4\x64\x78\xd2\xf7\x67\xbc\x22\x4e\x37\xe6\x5e\xc3\x86\xc9\xd0\xed\x21\xa5\x28\x9f\x15\x5b\x6c\x08\x85\xcb\xe0\x70\x74\xfc\x8e\xef\xbc\x76\x98\x82\x72\x75\xd8\x42\x2c\x09\xbe\x41\x29\xdf\xba\x04\xfe\xb2\x42\x04\xa6\xc1\xb2\x76\x4c\x6c\x05\xc7\xe5\x39\x93\x30\x76\x30\xc7\x0c\xd2\x05\xca\x51\x41\xd9\xf9\x17\xa0\x69\x40\xe7\xa8\x08\x50\x11\x80\x9c\xef\x98\x96\x65\xec\x4f\xb4\x33\x31\x54\x60\xf3\xc4\x3c\x1e\xe9\x6e\x11\x9d\x73\x52\x15\x88\x42\x95\x56\x25\xfb\xde\x20\x78\xcb\xc8\xe0\x98\x7a\x9b\x97\xd8\x97\x61\xd7\x16\x6b\xe7\x78\x01\xe9\xbc\xdc\xd3\xb7\xa5\xac\xba\x25\x38\x9f\xd9\x8f\x2d\x6d\xd4\x96\x3f\xb5\xd4\x6f\xd5\x68\xc6\x22\xfd\xca\x8b\x24\xcc\x6f\x10\xc1\xf9\x02\xe6\x1c\xae\x2f\x85\x37\x30\xc3\x4b\xfe\xb9\x91\xc0\xad\x52\x63\x49\x60\x68\x28\x30\x05\x05\xc9\x35\x4b\x55\x53\xe6\xd3\xf4\xc2\x68\xaa\xd4\x39\x95\x71\x38\xbb\x76\x66\xec\x88\xaf\x73\x6a\x53\xe5\xdd\xd5\x1d\xfc\x56\x31\xe4\xe5\xe5\xd8\x08\xd1\xbe\x9d\xa3\xaa\x50\x85\xc2\xa6\x9f\xf1\xc4\xc9\x9b\xdf\x62\x65\x8d\x29\x0e\xde\xca\x67\x1d\xa6\xdf\xfe\x6f\x17\x88\x2b\xee\x01\x94\xaf\x3d\x56\x1e\x1a\x60\xae\xd0\x79\x3f\xd4\x53\xcf\x9e\xb5\xa5\x9e\xd9\x76\x91\xfd\xa6\xc5\x4c\x1a\x95\x31\xa1\xb8\x99\xc5\x4b\x40\x29\x24\x1c\x3a\xa0\x32\x37\xc0\x5f\xd6\x48\x5b\xab\x2f\x4c\xeb\xdf\xbe\x24\xdd\x9f\xf8\xcd\xeb\xe5\x4f\xaf\x96\x47\xdf\xdf\x1f\xfb\x66\x1c\x4a\x43\x7a\xfd\x23\x0f\x00\x8d\x42\x40\x66\x3c\xf0\xfd\xb8\x9a\xb9\x72\x13\xab\x90\x7f\x78\x6a\x51\xe5\xb0\x6a\xc9\x2b\xdb\xf5\x32\xee\x1a\xdc\xb6\xdf\x8b\xdb\xae\xdc\xa9\x8f\x73\x50\xcc\xd9\xac\x78\xe2\x2c\xe3\xc5\x0c\xdc\xe3\x15\x1d\xce\x60\x92\x06\x9b\x62\xae\xed\x0a\x46\xe9\x49\xf3\xd8\xf1\xe7\xe3\x97\x3b\xdf\x1f\xce\xbf\xf2\xac\x56\x9d\xe8\x9b\x5e\xc4\xaf\x23\xe7\x6e\xff\xc7\xd3\x1f\x3f\x3d\x3b\x39\x68\xb1\x30\x8a\x08\x15\xc5\x01\x6f\xb1\xcb\x55\xc5\xa5\xcc\xf8\x6a\x05\xa7\x4b\xc5\xd1\xb5\x88\x87\xb1\x5e\x01\x96\xeb\x1d\x0f\x9d\xa5\x97\xa1\x19\x9a\xa0\x0c\xd1\xfb\x57\x1e\x09\x7b\x6d\xd1\x9b\x8e\x87\x1d\xd7\xf2\xc6\xd3\x3d\x72\x01\x03\x47\xe0\xa1\x57\xc2\xde\xab\x7a\xc6\xfc\xda\xdd\x3f\xd4\xd0\x2b\x3b\xaf\x49\x58\x57\xaf\xc3\x73\xd0\x9c\x44\xef\x97\xad\x27\x69\x39\x38\x57\x6f\x4f\xc9\xd5\xb3\xa8\xd8\x56\x5a\x08\xcf\x74\xd8\x33\x91\xcf\x48\xe3\xf3\xa5\x94\x43\xc3\xb3\x14\x95\xa0\x78\x79\x42\x00\xca\xff\x45\xb6\x03\xab\x16\xcf\x26\xfc\x90\xbb\xa1\x41\xd5\x7f\xd9\xbd\x60\xa1\xc4\x13\xdd\x09\xe9\xbf\xd0\x2e\x78\xf0\x0d\x90\xfe\x9b\xf9\x9b\x54\x78\xa2\x8c\x5f\xcc\xf1\x2d\x63\x88\x73\x8e\x6a\x78\xaa\x30\x61\x4f\x40\x03\x94\x4f\x71\x9f\x7d\xf1\xc5\xe1\x0c\xf8\x46\x10\x13\xdf\xd4\x56\xb8\x98\xc3\x80\x2d\xbd\x15\x30\x92\x59\x74\x73\x9c\x42\xe5\x57\xc8\xfc\x12\x28\xe7\x9a\x43\x36\xa8\xca\x60\x07\xed\x36\x0f\x68\x50\x2d\xf6\x90\x63\xa1\x9d\xe7\x24\x9b\xb2\xdb\xdf\x13\x87\x3e\xb0\xed\x24\x5e\x86\xe5\x5f\x6f\x23\xf1\x79\x6f\x74\x23\xe5\xf0\x56\x6c\xa6\x62\x09\x93\x9a\x48\xd5\xe6\x61\x46\x3f\x13\x65\xf5\x9f\x79\xcb\x58\x99\xeb\x6b\xdf\x31\xff\x7a\x7b\xe5\x18\x2f\x96\x19\xa4\xfd\x22\x75\x5b\x36\x8b\x5a\xda\x96\x55\xb4\x65\xbb\x83\x6d\x9d\x7f\x1f\x3c\xcd\x5d\xf4\x15\xef\x1f\x7b\xf0\x11\xc5\x38\x9b\x00\xaf\xa0\x23\xf1\x68\x8c\x28\x5c\x94\x04\xa5\x78\x19\x33\xe0\x90\xee\x15\x12\x7d\x8d\x74\x8e\x6f\xdf\x51\x46\x41\x1a\x56\x01\x81\xd7\x9e\x89\x33\x34\x9b\x53\x4b\x38\x23\xb3\xf0\x16\x88\xc2\xba\xa6\xcc\x55\x2b\xc3\x54\x26\xcc\x03\x8b\xb1\xd2\xe8\xed\x4d\xa2\x2e\xf9\xa6\x16\xa9\x93\xd2\x6d\xf4\x74\x61\x26\x15\xab\xc9\x9c\xc3\x07\xb6\x91\xb8\xce\x02\x5a\xcf\x52\xeb\x7d\xed\x72\x88\x21\x39\x99\x1a\x52\x44\xa6\x2b\xa0\x72\xff\xf3\xd8\xbd\xd6\x8d\xdf\x04\xb4\x41\xc5\x11\x6f\xc6\x30\x08\x4f\x34\xe0\x99\x0b\x3c\x9b\x65\xd6\xb4\x58\x54\xbc\x12\x12\x4d\x8d\x28\x1c\x69\xa5\x42\xa9\x62\x1a\x75\xc1\xc7\xd4\xfd\x31\xa1\x61\x41\x8e\x09\x6f\x09\xa2\x32\x9e\x28\x34\x8a\xc7\xc9\x07\x9f\xbb\x5f\xac\x0e\x6f\xa7\x6b\x26\x86\x4d\xdd\x2b\x5b\x4c\x36\x37\x68\xdd\x9e\x50\xaa\x6f\x71\x8c\x33\x8a\x96\x62\x41\x43\x40\x10\x88\xa5\xd3\x90\x25\x95\xcb\xd3\x43\x50\xa1\x08\x12\x90\x07\x04\x26\x10\xdd\x40\x05\x3f\xbf\xad\xe2\x55\x73\x13\x87\xa5\x98\x8f\x13\x44\x92\x0c\x32\x27\x8f\x48\xaa\xbf\x0c\x6b\x88\x2e\x54\xc4\x53\x90\xb2\x2c\x9f\x75\xad\x0c\xb6\x79\x83\x59\x0d\x40\x51\xc1\xf3\x04\x39\x66\x45\x23\x63\x4a\x40\x5e\xb0\xe8\xfa\x0e\xc9\x64\xae\xa8\xa3\x8a\x49\x68\xcf\x86\x4a\x32\xb4\x9c\x60\x40\xd2\x0b\x05\xc7\xb9\xd9\x5f\x1f\xf0\xa8\x0d\x08\xb3\x92\x1c\xa4\x14\xde\xea\xc1\xa1\x9c\x23\x06\x4d\x42\x17\x92\x86\xb6\xad\x1c\xf0\x6c\x5a\xf2\xe8\x43\x41\x5a\x69\x30\x56\x61\x6d\x26\x6e\xe0\x57\x69\x3f\xa9\xe8\x55\xec\x1f\xb7\x80\xc7\x18\x96\x17\x7e\x1e\x75\xc5\x34\xb0\xff\x0e\x9b\xb6\x61\x17\x1e\xd5\x73\x9b\xf9\x74\x6d\x34\xaa\xcd\xae\x67\x63\x89\x76\x9b\xce\x3c\x8b\xc0\x96\xf3\x7e\x81\xf3\x2a\x56\xaa\x01\xfc\xd1\x29\x5d\x6d\xba\x1e\xb7\xb5\x31\xa5\xee\xbe\xf5\xb9\x02\x52\xd5\x1e\x6d\xa7\xa9\x95\x82\xf6\x2f\xbe\x2a\x3c\x2f\xe1\xda\xfd\xf2\x88\x5e\x7a\x75\x02\x0f\x81\x5c\xab\x8f\x42\x73\x2c\x45\x30\x2f\xa6\x65\x47\x41\xf4\x53\x1a\x9d\x0d\xd7\xb6\x4c\x3f\x00\xdd\x8e\xd2\x94\xc0\xc2\x97\x70\xcd\x8a\xac\x94\x2e\xcb\x2e\xbe\x38\xf8\xd5\x09\xa0\x80\xdf\x08\x87\x4e\x25\xad\x7a\xe8\x9c\x8c\xe3\xe4\x29\x39\x47\xe2\x64\x3e\x2a\x7c\x1b\x7b\x69\x8f\x3b\x7f\xeb\xc8\xbb\xd8\xf4\x4b\x81\xb4\xb5\xf0\xa8\x63\x3d\x56\xf9\x1c\x82\x8c\xce\xef\x45\x07\x0e\xe4\x1f\x8d\x30\xaa\xb2\x08\x32\x48\x4a\x95\x0c\x81\x5c\x5e\x09\x74\x3d\x91\xc9\x0b\xb5\x96\xad\x5b\x63\xec\x35\x38\x4b\x27\x78\xea\xd1\x67\x0a\x29\xab\x0e\xe5\xd7\xa5\x71\xcd\x2b\x0f\x34\x09\x65\xd7\xaf\x67\x57\x2e\x73\x35\xc5\x96\x60\xf0\xa3\x2c\x0b\x1a\x4f\x35\xd8\xaa\x1f\x6e\x9c\x83\x1d\x52\xee\x1b\x20\x80\xc2\xd9\x7d\x1f\xf0\xa7\x7e\x06\x41\x6f\x10\xa8\x8e\x96\xc4\x59\x6e\xba\x76\x31\xf1\xb9\x0c\x30\xa3\xf9\xbf\xaa\xd1\xb4\xa9\x43\xb8\xb4\x12\xb9\x0e\x16\x98\x62\x7d\x2d\x58\x60\xe5\x29\x3e\xa9\x60\xce\x1c\x59\xdf\xfd\xa4\xe8\x10\x51\x53\x11\x78\x45\x6c\x30\x50\x16\x12\x7b\x31\x1b\xab\x7e\x86\x49\x62\x96\xc9\x76\x0f\xb5\x6d\x70\x41\x10\xc7\xd6\x1f\x1c\x92\xda\xe7\x7d\x8d\x4b\xf9\xbe\x7e\x29\xaf\xec\x09\x36\x5b\x98\x39\xd9\x54\x5d\xc8\x4a\x3a\xb4\x4f\xc9\x90\x46\xc3\x5f\xe3\x78\x83\x9d\x36\xaa\xa4\xe9\xa0\xa2\x79\xde\x39\x68\xd8\xc9\x92\x43\x18\x52\x10\x47\x49\x77\xf5\xdd\x48\x51\x58\x7d\x88\xc2\x8f\x70\xa1\xdc\x8c\x9d\x83\xeb\xcd\xdc\x8d\x97\xb6\x42\x36\x74\xf2\xf7\x29\x0e\xe4\xd2\xfa\xec\x3f\x5b\xb2\xd8\xf0\x6d\xe8\x3b\x48\xeb\x16\xec\xb5\x01\x07\x6d\xbf\x67\x1e\xfb\x62\x5a\x4e\xf1\xa4\xf7\x1e\x34\x76\xe0\xe1\xa0\x37\x5d\x5e\x86\xcc\x2e\x7b\x03\xd8\xf5\x00\xa5\xf0\x68\x3a\x45\x1c\xa3\x7f\x67\x67\x27\xa2\x64\x05\xd7\x28\x49\xaa\xa7\x23\xf9\x42\x74\x3c\xd6\x36\x65\xbc\xc5\x0f\xe7\x0d\xed\x2c\x4f\x7e\xdd\x94\xde\xfa\x33\xc3\xa4\x6c\x67\xdb\x53\x3c\x08\x26\xe5\xb1\xd6\x40\xa8\x46\x2c\xb7\x9f\x65\x4e\x75\xad\x84\x95\x9c\x1e\x92\x16\xcd\x72\x4c\x20\x7f\x91\xcc\xd0\x0a\x4f\x31\x37\xe9\x39\x04\x6c\xfb\xb5\xac\xc9\x1d\x1e\x9a\x93\xc2\x21\xb6\x15\x6b\xa8\x6f\xcb\x55\x96\x71\xab\x5c\x27\xe9\x2d\x96\x52\xbd\x14\x00\x63\x2a\x5e\xac\xe9\x51\x4c\xa8\xac\x12\x40\x25\x0a\x95\xaa\xe2\xe5\xdb\x5f\x4a\x7c\x1a\xfb\x1b\xf8\xa0\xcc\x87\x5e\x56\x5e\xd8\x50\xd9\x0f\xa5\x92\x3b\x87\x04\xd1\x38\xc1\x19\x2b\x10\x53\x85\xed\xb1\xbb\xc0\x62\x89\x09\x05\xcc\x1c\xa9\xef\xa2\x28\x54\x44\x40\xc3\xca\xab\xff\xe6\x34\xf3\x32\xa1\xda\x30\xf1\x72\x51\xeb\x6b\xe3\x55\x9e\x76\x1a\x79\x5b\x18\xd3\xad\xf3\xf4\xb6\x59\x0d\x2c\x7f\xbb\x09\xc0\xeb\x20\xc7\xb7\x04\x2c\x7d\x02\x04\x2c\x7d\x70\x20\xa3\x78\xc6\xeb\x6f\x74\x4b\x29\xb3\x65\xf9\x5a\x01\x8a\xe4\x77\x45\xd1\x82\x3e\xda\x2c\xae\xf5\x7f\xd6\x78\x8f\x0e\x51\xa3\xbd\xb3\x4e\x1d\x66\x79\x40\x9d\x2f\xb4\xdb\x1d\x12\x31\x0c\x67\xe9\xe6\x61\x87\x7d\x7f\xf0\xc4\x07\x58\xc6\x07\x5b\xbb\xf7\x68\x56\xde\x31\x0d\x9c\xee\xc7\x5f\xbc\x85\x1c\xc7\xbf\x57\xaf\xc7\xea\x55\x57\xa9\x2f\xbc\x7a\x02\x7b\xfd\x8b\xaf\x5d\xfb\x0f\xbd\x31\xfe\x07\xc5\xc0\xf9\xd5\xa8\x76\x68\xde\x19\x28\x28\xdf\x92\xf0\x02\x2d\x9c\xb7\x58\x75\xf1\x3a\xef\xeb\x42\x29\x1f\xdb\x62\x30\x9a\xef\x5b\xff\xf2\x54\xa0\x3c\x81\x01\xc8\x95\xf8\x88\xe0\x16\x14\x41\xb1\x4a\x12\x58\x14\xd3\x55\x96\xdd\x07\x7c\xbf\x9b\xc1\xad\x56\x42\xb9\xaf\x01\x7e\x64\x38\xc5\x6a\xa4\x46\xef\x37\x5f\x45\x16\x13\xfd\xe3\x06\xc0\x3d\x7c\xbd\x91\xef\x70\x41\xdb\x8a\x8e\xb8\xed\x04\xc1\x62\x95\x95\x8f\xe7\x30\x58\x82\x54\x96\x77\x6b\x86\xd3\x1c\x65\x99\xca\x10\x20\x4f\x03\x0e\x7d\x16\x2c\x09\x2e\xf9\x02\x16\x01\x98\xcd\x08\x9c\x95\x8b\xd3\xa6\x93\x6d\x32\x96\xa6\x7b\x81\x3c\xe8\xeb\x54\x22\x7b\xaa\x90\x7d\x85\x54\x7d\x3b\x1a\xab\x61\x35\x39\x4e\xd7\x2a\x95\xd2\xc6\xe0\x8f\x33\xba\x8e\xfa\x28\x03\xb7\x9a\xeb\x8b\xc7\x00\x9f\x56\xdb\x35\x89\xa5\x9c\x9b\x4d\x82\xeb\xe1\xc2\x21\xc1\x0c\x73\xa4\x11\x43\x0c\xd2\x19\x54\xb0\x56\xba\x63\x88\xc3\x02\xd2\x33\x02\xe1\x82\xe1\x1f\xbf\x46\x19\x85\x24\x1c\x14\x25\x6c\xd7\x09\x80\xa7\x32\xd0\x7e\x30\x2e\xab\x11\x7a\x38\x4e\xfb\x13\x4b\x5e\x9a\x87\x92\x8b\x9d\x85\x7d\x63\xaa\x75\x7a\x39\x66\xd8\xd6\x52\x73\x96\xd6\xed\xc3\xee\x3e\x5d\xfe\x09\xcf\x9b\xb7\xdf\x15\xbb\x36\xee\x30\x9f\xdc\x6a\xd2\x56\xbe\x46\x13\x14\xaa\x91\x47\x1e\x1c\x2f\x70\x35\x91\x17\x05\xcc\x60\x52\x1b\x65\xce\xd9\x47\x26\xe3\x4f\xeb\xba\x03\x92\x08\xa2\x5d\xfd\x8b\x12\xfd\x5a\x75\xa4\xff\x6a\x89\xb4\xaf\x63\x5b\x5f\x83\x04\xd2\x1f\x56\x90\xdc\x9f\x01\x02\x16\x4c\x52\xfd\xb2\x54\x3a\x68\x37\x70\x6c\x64\x9a\x6f\xf1\xa4\x31\xc1\xb7\x7a\xf5\xce\xaa\xb1\xfc\x7e\xc0\xa4\x58\xd3\x47\x98\x8e\x88\x81\x37\x67\x54\xcb\xc3\x2a\x48\xbe\x39\x3d\xe5\xa7\x01\x33\x94\xad\xbd\x27\xa9\x86\x01\x16\x10\x90\x64\x7e\x01\x19\xfc\xf4\x0b\x9c\x1f\x73\xec\xcc\x28\x7c\xc1\xea\x78\xce\x71\x96\x96\xc2\x21\x7c\x81\xf2\xe5\x8a\xf2\x90\x16\x1b\xe6\xbf\x96\xbe\x51\xf7\x79\xd5\x88\xb2\xb6\xcc\x8c\xc0\x52\x20\x81\x99\x5a\xce\x45\xa4\xe1\x9e\xb3\xae\x54\xa5\x77\x6b\x6b\x8b\x5b\x09\x13\xbc\x58\x82\x44\x98\x0c\x97\x20\xe5\x5a\x91\x6d\xf2\xfd\x35\xa3\x3a\x90\xad\xa9\x1e\xa9\x34\xd5\xec\xda\x05\x66\x45\x2b\xed\x67\x05\x1b\xa5\x5a\x69\xc1\x8c\x7a\x33\x0e\x8b\xf6\xce\x5c\x41\xb8\xe3\x3d\x6b\x85\x86\x02\xfd\xca\x97\x54\xc0\xd7\xba\x5f\x72\xa5\x96\xfb\x9f\xc1\xf3\xb2\xa1\xf2\x5d\xb2\x22\x04\xe6\xe5\x5a\xc1\x9e\x05\xac\x9e\x47\xe3\x7d\xfb\xd8\x30\xa1\x12\x4b\x47\x7e\x56\xea\xff\x6b\xbc\x26\xca\x27\x65\xa8\xa0\xda\x3e\x52\xbb\x30\xbe\x57\xba\x2a\x17\x81\xd7\xb8\xc6\x98\x7a\x94\x9c\x50\x87\xcf\x6b\x96\x0c\xaa\xbf\x55\x1f\xe8\x46\x75\x88\x1c\x10\x2d\x4e\xa4\xcd\x7a\x50\x8f\xa1\x9c\x54\x3c\xa9\x8b\x32\x94\xd4\x5c\x12\xcc\x8c\x39\x4a\xba\x88\x6f\x89\x9a\x37\x27\x6e\xa7\xe0\x7a\xe3\x89\xc2\x17\x55\xda\x51\xc8\xd1\x8e\xde\x70\xf0\xa5\xf0\x98\x7d\x0a\xf8\x47\xff\xb1\xf2\x66\xe9\xa3\x0c\x78\x81\x53\x34\xbd\x97\x03\x7e\xcf\x3e\xf5\x1e\x30\x6b\x86\x1e\x6e\xc4\x57\x55\xa4\x6d\xdf\x91\x59\xed\x3a\x1b\x1d\xd7\x67\x3c\xd9\xaa\xb2\x9a\xfc\x06\xf5\x16\x4f\x1e\x78\x44\x3f\x42\x52\x54\xb9\xab\x5e\x63\x12\x2d\x06\x8d\xcb\xa3\xd0\x9c\xac\x5c\x38\xc0\xa7\xea\xd3\xf9\xf1\xd9\xa7\x07\xea\xf9\x3d\xbb\xd7\xf6\xb3\x74\xb6\x51\x4c\x5f\xc7\x41\x05\xf2\xb4\xc3\xe6\xc0\x59\xc4\x20\xc1\x39\x15\xae\x53\x9c\x1f\xb3\x4b\x92\x38\x5b\x76\xb5\x9b\x3b\xbf\xdd\xdb\xae\x4f\x33\x4c\xf1\x91\xd2\xa7\xd9\xd6\xcb\x3d\x68\xad\x59\xa2\xfc\x68\xaf\x58\x65\xb9\xa2\xb0\x62\x20\xe2\x4c\xeb\x34\x01\xe7\xe0\xa6\x3e\x83\x96\x8a\xca\xd5\xc7\x13\x50\xb7\x8b\xf3\xd5\x62\x02\x49\x5b\xce\x58\xa0\xdd\x12\x47\x5c\x62\x11\x5a\x88\x32\xd6\x8e\x16\xff\xf8\xfb\xff\xea\xec\x07\xe6\x69\x47\x2f\x46\x8c\xaf\xd9\x49\xa7\x9e\xd5\x46\x90\xee\xd3\x7a\xc4\x6f\xaf\x37\x9a\x34\xaa\x4d\x79\x0a\x15\xcb\xa7\x10\x5e\x39\xe1\x63\xad\xb3\xf0\x95\x8b\xe5\x30\x72\x96\x95\xd6\x35\x0c\xf9\x94\xe7\x10\xfe\xe7\x60\xa1\xb8\xca\x6c\x4c\x18\x73\xbd\xae\x5d\x1d\x72\xd2\xde\x69\xea\xbb\x32\x4b\xbc\xd9\xcd\xf0\x0d\x2e\x6f\xab\x35\x1c\xea\xd0\xcd\x63\x35\x88\xec\x06\x15\x68\x92\xb9\x5c\xb7\x12\x8c\xb3\x25\xb4\x64\xbd\xba\xc5\xcc\x49\x60\xb7\xc2\x75\xf0\xae\x78\xfd\xd8\xf1\xee\x8e\xc2\xc5\x02\x08\x04\xa7\xb0\x06\xaf\x67\x08\x07\x20\xbf\xd7\xee\x6f\x5d\xce\x24\x5b\xf4\xa1\x76\xa3\x7c\x50\xca\xbd\x07\x34\x99\xc3\x47\xa4\x9a\xe9\xd2\x29\xdf\xcf\x40\x20\x28\x24\x0b\xe7\x0e\x2a\x28\xc1\xce\x74\x73\xed\x61\x3b\x0d\xfb\x4b\xb6\xf6\x75\xb2\x6d\x84\xf6\x2b\xec\xa3\xec\x83\xa7\xb1\x9a\xf7\x78\x45\x02\x71\x75\x0e\xa6\xcc\xdc\x1a\x54\xb6\x9f\x8e\xfd\xa0\xfe\xa0\x18\x32\x9d\x61\x9b\xf6\x65\xaa\x9f\x69\x74\x6f\xff\xe2\x31\x1c\x09\x22\xcf\xf1\xb1\xab\x58\x3a\xec\x10\x9a\x95\xa1\x66\xdf\x57\xb2\x6c\xe5\xe0\x7a\x95\x7b\x1b\xad\x57\x39\x6e\x61\xbf\xb5\xeb\x55\xb6\x75\x7e\xbe\x9a\x70\x27\xe7\xa0\x37\xd8\xfb\x7c\x6f\x29\x22\xd8\x76\x8e\x77\x14\xac\xdc\x7b\x6a\x05\x2b\xab\xe0\xf2\xfd\x2f\x57\xb1\x52\x7d\x75\x21\xd7\xf0\x81\xca\x56\xee\x3b\xcb\x56\x5a\x1e\x10\x99\x71\x7d\xd2\x69\x2a\x67\x57\x01\x13\x9c\xa7\x80\xdc\xb7\xe5\x6f\x5b\xbb\x73\x0f\xa3\xa5\xad\xe3\xec\xb3\x27\xb0\xb8\x5f\xf5\xcf\x59\x92\x73\xdf\x55\x92\xb3\x59\xab\xb3\xeb\xf0\x09\x6d\x36\xf0\xef\x70\x41\xb9\x91\xc4\x65\x03\xef\x7d\x62\x0d\x3f\xb3\x44\x78\x89\x18\x4f\x9b\x87\x61\x53\x07\xd7\xf0\xa3\x4b\x25\x5c\xef\xf3\x4b\x95\xab\x07\x43\x4d\xdf\x9e\xd6\xa4\x53\xd0\x30\x80\xf9\x08\xa2\xf6\x4e\xcf\x19\x79\x36\xde\xed\x59\x5d\xb0\xa8\xa7\xe2\xd6\x0a\x27\xc3\x89\x3c\xc8\xec\xe5\x75\x7c\x79\x1f\x1c\xaa\xec\x7a\x66\x29\xe2\x39\xd0\x22\xe2\xff\xe6\x66\x3d\xa2\x16\x99\xdc\x18\xe6\x12\x3c\x4c\x98\x66\x7f\xfa\x09\xc7\xa0\x3a\x38\x02\x41\xfa\x21\xcf\xd8\x12\x87\x1f\xcb\x0d\xc5\xff\xda\xfe\x89\xc8\xa2\x42\xeb\x5d\xca\xd4\x1f\xae\xa2\xcb\x67\xee\xa2\xf7\x07\x5f\x5f\xd1\x7b\x9e\x29\xaf\x7b\x2e\x86\x5d\x17\xba\x2e\x08\x87\x56\x29\x7b\x0d\xef\x9b\x32\x56\xa6\xef\x33\x83\xb1\x9f\xb7\xa3\xde\xf2\x87\xa6\x5c\x2d\x5f\xc8\x43\x6e\xde\xc9\xd8\x03\xfe\xf1\xe2\x7e\x29\xb0\xd5\x5e\xdd\x2d\x41\x9e\xb2\xfa\xcf\x0c\x5e\x80\x83\xc4\x84\x91\xa8\xfc\x13\xf3\x2f\xc2\xaa\x7f\xc4\x2b\xb2\x4a\xb8\x81\x1e\x5e\xdb\xa6\x2f\x5c\x84\xfc\x59\x40\x6f\x9a\x3c\xcb\x37\x80\x48\xb7\x72\x0c\x24\x6a\x84\x33\x7a\x66\x92\xd4\x98\x95\x6d\x15\xf6\x75\x05\xd2\x47\xe0\x29\xe3\x1c\x2c\xef\xba\x8f\x18\xdb\x3c\xcc\x9b\x97\xa2\x09\xd9\x89\xb7\x66\xb2\xad\xfa\x9c\xb6\xc0\x98\xc4\xc5\x2d\xb3\x5a\x34\x78\x88\xa3\x4a\x54\xa8\x26\xf5\x82\xb9\x23\xf3\x4d\x69\xd8\xe8\x8d\xcb\xc2\xef\xc4\xbf\xa3\xf0\x53\xae\x7c\xef\x27\xc3\x3d\xd2\xc9\x7b\x2d\x87\x37\x47\x3d\x30\x60\x82\x58\xeb\xbe\x87\x58\x4f\x1e\xb0\x2d\x8d\xca\x66\x2c\xf7\x92\xa5\x61\x3e\xe0\xa1\x5a\x93\x06\x15\xf1\x72\x95\x65\x30\xf5\xc8\xa8\x1c\xb6\x1a\x43\xd7\x23\x08\xde\x81\x82\x5a\xc1\xb3\x3d\xd7\xc5\xf6\xe6\xb6\x04\xf5\xe7\x4a\x21\x38\x69\x48\x50\x56\x69\xc5\x46\x72\xa1\x5b\x13\x5a\xa4\xa8\xb1\xec\x66\x56\xba\xbb\x67\x35\x89\xe2\x8a\x27\x4e\xb4\xe5\x4c\xf8\xf1\xe7\x23\xa4\xca\xf8\x98\x8c\x0e\xd7\x32\x19\xd5\x66\x62\xbb\x9b\xc8\x42\x76\x9b\x10\x3c\x81\x45\x42\xd0\xb2\x8a\x7d\xf3\x9d\xe0\xa0\x9b\xaf\x4f\xc3\xb6\xfb\xaf\x8d\x89\xc6\xcf\x9b\x4c\x54\x1d\xa0\x6d\x38\x22\x47\x94\x12\x34\x59\xd1\x2e\x13\xbd\xfd\x38\x04\x55\x6b\x86\x0a\x47\x56\x09\x5d\x11\xf7\xe9\xb8\xa9\xfb\xb8\xc9\x45\xcf\xa3\x5d\xb5\xc2\x5e\x35\xaa\x33\x80\x48\xd1\xb8\x9f\x5b\xc7\x7f\x3e\xc7\x84\x17\x78\xad\xbf\x8b\x29\x10\xc8\xb8\xce\x28\x82\x36\xaf\xcc\x90\xe9\xfb\x89\x5b\x3f\x17\xa9\xd9\x78\x63\x6e\x1d\xfe\xdf\x29\x96\x17\x02\x27\x0f\x59\x29\xd4\xeb\x67\x3b\x75\x4d\x25\xa3\xa7\xf8\x61\xdf\x1f\xf6\xb6\x8d\x3d\xe2\x4d\xab\x41\xd1\x61\xd7\xac\x5e\x5e\x99\x3e\x5b\x48\x4b\xcd\x70\xcb\x00\xbf\xbd\xf4\x84\xe8\xfe\x1e\x52\xe0\xba\x78\x5b\x53\x2c\x17\x90\x82\x56\xd1\xb7\x29\x91\xb7\xfe\x3a\x59\x87\xea\x2b\xed\x3c\xa4\xdc\x70\xe9\x36\x50\xaa\x6d\x44\x9a\x9d\x62\xb6\xe8\x2e\x19\xd6\x75\xee\x0f\x74\x53\x5f\xcc\x51\x21\xd0\x7a\x83\xf2\x5f\xac\xd8\x78\xb9\x26\xbc\x3a\x7b\x8e\x83\x72\xb5\x82\x7a\x71\x86\x17\x9c\x68\x97\xa0\x16\x2e\x1f\xed\x5e\xb1\xa8\xa4\x30\x0a\x69\x18\x85\x04\xdf\x3a\xfe\x05\x42\x47\x09\x6b\x06\x2f\x22\xac\x21\xc5\x6a\x92\x83\x1b\x59\xd7\x1a\xc8\xcc\x8d\x05\x2b\x2f\x7c\x17\xa3\x84\x7d\xa4\x1c\xa1\x9e\x41\x9a\xe4\xb8\xfc\x69\x09\x09\xc3\x0c\x67\x75\x4c\x18\x1e\xc3\xf2\x3e\x9e\x48\xa8\x13\x7a\x8b\xe3\x82\xc2\x65\xfd\x0d\xc3\x16\x89\x97\x78\x89\x19\xd8\x63\xb8\xcc\x56\x04\x64\x3c\xea\x7e\x95\x67\x90\x25\x4d\x94\x3d\x02\x1a\xa7\x02\x09\xaf\xfe\x86\x55\xa1\x5d\xe0\x45\x39\xe2\x29\xc1\x8b\x38\x67\x33\x14\xb5\x91\xc5\x0f\x14\x8b\xaf\x05\x04\x46\xcc\xb3\x0e\xb7\x45\x12\x22\x4b\x5d\x8d\x79\x54\x41\x9c\x12\xbc\x4c\xf1\x6d\xf9\x0a\x1e\xf5\x11\x4f\xf0\x1d\x2b\xe0\x5d\xd0\x58\x89\xfa\x13\xdf\xf0\xad\xa7\xa6\xb9\xc5\x9c\xc6\xac\xcc\x37\x7b\x04\x24\x09\x26\x29\x6f\x93\x80\x25\xa2\x72\x76\x96\x1d\xdc\xb3\xc4\x2f\x2f\xc9\xbb\xf1\x42\xbf\x0b\x9c\x23\x5a\xf2\xc2\xd3\x2e\xf5\xbb\x9d\x9d\x5e\xdc\x4c\x3e\x7c\xfa\xa7\x2d\xf5\x5b\x9d\x2f\xb7\x28\x6d\xf8\x56\x42\x3d\x8e\x8e\x25\x01\x12\x08\xd2\x00\xcc\x34\x28\x71\xcd\xd5\xc7\x47\xab\xba\xc2\x32\x78\xc3\xad\xa5\x35\xa8\x39\xce\xdf\x95\x5f\x8a\x74\x26\x65\x1e\xfc\xd9\x06\xa5\x94\xdc\xab\x83\x66\x71\x9a\x67\x96\x0e\x1a\x65\x1e\xac\x80\xef\xb6\xa1\xab\xf6\xe5\x65\xe5\x4f\x62\xf6\x5c\x36\xef\x6f\x88\x62\x14\xb6\xc9\x4e\x53\xa0\xf6\x15\x84\x09\x28\xf7\x31\x7b\x57\x5c\xed\x13\x53\x3c\x4e\x31\x99\xa0\x34\x85\x79\x7d\x14\xf6\xde\xda\xa2\xf3\xcd\x6d\xee\xaf\xa2\x7c\x77\xf1\xcb\xe9\xf7\x3f\x4c\x0e\xb7\x3b\xf7\x74\x11\xda\x76\xe3\xf0\xc2\xd9\x0c\xba\x8c\x2f\x5a\xd3\x43\xae\x6f\xf2\xdc\x55\xae\xbf\xcd\xaf\xee\xae\x5e\xe4\x7e\xd8\x56\x55\xc7\x18\x76\x79\x84\x75\xa7\x44\x0b\xfd\xb3\x77\xee\xa2\x92\xa4\xb8\xe7\x9b\xa4\xb8\x3f\x24\x49\x51\xf0\xe8\xd6\xd6\x96\x6b\xef\x0e\x4c\x42\xee\x2c\x01\xb1\xc0\x13\x94\x41\xb7\x98\x75\xaa\xba\x5c\x81\x89\x5d\x6b\xaa\x93\xfe\x60\x70\x6e\xac\x48\x1b\x35\x52\x63\x6b\x64\x77\x33\x1f\xb6\xfe\xc5\xbd\x1e\xce\x74\x58\xd1\xb8\x2b\x07\x63\x13\xf3\x3a\xa7\x80\x36\xb3\xb4\xf9\xb7\xb6\x79\xd5\xbf\x0c\x98\x97\x68\xfc\x18\xf3\xaa\xb1\xff\x1b\x93\x3b\x51\x41\xfd\x9b\x33\x34\x7e\x1e\x30\x4d\xb5\x87\xc7\x98\xab\x4c\x09\x33\x27\xaa\xa6\x8a\x99\xb3\x54\x7f\x1b\x30\xc5\xaa\xf9\xa3\xcc\x8f\x45\x00\x35\xa7\xc7\xbf\xb6\xce\xae\xfe\x69\xc8\xe4\x44\xeb\xee\x6c\xf4\x41\x10\x43\x96\x00\xb1\x53\x76\x7c\x58\xec\x01\xcd\x3a\x65\xbe\x29\xd1\x75\x97\x1b\x4c\x86\xb6\x2b\x80\x5f\x47\x26\x74\xb8\x7e\x1e\xb4\x54\x6d\x06\x65\x41\x87\xfe\x69\x9e\xc8\x19\xde\xf6\xe6\xa4\x4f\x0e\xa2\xed\x25\x89\xc4\x3f\xa8\xdf\x56\xc4\xe3\x9d\x9d\xe5\x1d\xab\xc4\x44\x56\x79\x02\xe4\x6d\xba\x2d\x1c\xe4\x54\xfe\xb6\xc6\x58\xaa\x21\x34\xcb\x30\x5a\xdf\x59\x1f\x3e\xad\x2f\xb5\x85\x85\xdb\x26\xa8\xe8\x0b\xa2\xe4\x4d\x8b\x29\xbd\xc7\x6c\x52\xfd\x04\xb1\x4c\xc4\x38\x63\x36\x41\xc2\x9b\xf6\xbc\x60\x55\xde\xfb\x12\x4f\xd0\xe6\x37\x41\x15\x82\xd9\x33\xf4\xf0\x37\x3c\x8b\xcb\xdd\xd0\x2f\xae\x70\x70\x3a\x6d\x2d\xae\x9e\x5b\x30\xaf\xda\x52\x67\x2d\xc7\x06\xcb\x99\x3d\xe5\x19\xb5\x7d\xb3\x65\x5b\x72\x65\x5b\x32\x65\x9b\x5a\x74\x77\x9e\x6c\x3d\xe5\x91\x6a\xe6\xae\x6e\x16\x36\xbc\x13\x8f\x1b\x42\xfb\x01\x3f\x2c\x2d\xb7\x31\xbd\x9e\x49\xb9\xec\x47\x77\x4a\xee\x3f\xfe\xfe\xbf\xf4\x27\xba\x92\x6d\x2d\xa9\xb6\x75\x07\xe6\xc1\xea\x85\x0d\xd5\x25\x49\x36\x96\x5e\x5b\x85\x42\x8c\x98\x34\x9d\xc3\x1b\x82\x73\x89\xfe\x27\x17\xd0\x47\xcc\x6c\x24\xd3\xd6\x3e\x1a\x19\x0d\xe3\x37\x9c\xb5\x72\x6c\xfb\x99\xf7\xaf\x7c\xb2\x6b\x7b\xb9\x58\x0c\x9b\x20\xfb\xc5\x6d\x29\x70\xa6\x11\x0e\xf3\xcf\x9c\xe2\xa0\x36\xcd\x3c\x8c\xef\x05\x06\x49\xb6\x2a\x28\xac\x52\x02\xb3\x7b\x56\xeb\x3b\xc7\xd2\x27\xc3\x66\xd9\xea\x73\xb1\x67\x5f\x6a\xa4\xe2\x79\x86\x96\x1d\xf7\x00\x24\x13\x69\x96\x0f\x44\xb2\x53\x5c\x95\xac\xed\x9d\x4f\xd9\x4e\x37\xaf\xec\xe2\xa7\x42\x95\x06\x19\x1c\x49\xc2\x95\x09\xd1\x4c\x11\x76\x26\x02\xef\xba\x76\x7c\x77\xc2\xa9\x9d\xbe\x4e\x4b\xb5\xe6\xd7\x73\x98\xad\x99\x85\xba\x69\x7c\x36\x5c\x59\xdc\x46\xad\x98\xac\xed\xee\xaf\x0e\x8f\x97\xb0\x8e\xb3\x0a\x95\xdc\xe5\xc5\x86\x52\x5e\x0e\x45\x67\xaa\x9f\x10\xfe\xd2\xc7\x04\xbe\x61\xb7\x56\x86\x79\x85\xf1\x27\x6e\xfb\x3e\x7a\xb7\x7a\xf7\xf2\x8f\x17\x3f\x69\xb6\xef\x36\xf7\xd0\x1c\xf0\xf2\x29\x31\x57\xe9\x95\x10\x04\xae\x89\xed\xd8\x0c\xd6\x4e\x07\x88\xa0\x52\x5c\x2c\x51\x9e\xb3\x0b\x82\xf7\x7a\x89\xa6\x1b\x58\xb1\xf2\x3e\x96\xb3\x3e\x0d\x17\xcb\xd3\x5e\x3a\x72\x7f\xb0\x73\xf8\x71\xe7\xa3\xb1\x74\xbe\x71\x2f\x4d\xe3\xb2\x4f\xd4\x4b\xd8\x58\xe8\x52\x69\xa2\x60\xc6\xae\xc8\x51\xf8\x82\x12\x34\x9b\x41\x52\x21\x0f\x36\x8c\x5e\xbc\x6c\x31\x17\x0e\xaf\x72\xa5\x8e\x71\xad\xb4\x87\x29\xba\xd1\x40\x03\x03\x86\xeb\xc9\x54\xbc\x48\xf3\xeb\x69\x46\x9f\xca\x55\x28\xb8\xcb\x74\xbf\x6a\xd6\xb0\x77\x86\x5b\xb0\xc3\xa8\x22\xa8\x35\x52\x84\xff\x04\x92\x78\x89\x6f\x21\x91\x72\x6c\x49\xa0\x04\x2b\x17\x44\x63\x2f\xf9\x46\x95\xba\x55\x08\xa6\xb4\x0a\x59\x23\x2e\x2d\x7a\x5a\x35\x88\x91\x0a\xf3\x3a\x56\xdc\x02\x15\x04\x6f\x60\x12\xae\x8e\xcd\x3e\x10\x48\xf2\x32\x5e\x59\x81\x43\xcc\x70\xb9\x6e\x8c\xec\xe7\x94\x40\xb0\x90\x96\xa7\x73\xca\xc0\xd6\xce\xcb\x3b\x47\x78\x15\x85\x41\x86\x67\x41\xa1\x3c\xc2\xc7\xa1\xc1\xcf\xee\x45\x97\xbb\x87\x36\xca\xf3\xd8\x0d\xfe\x02\xd5\x91\x63\xf7\x4f\x55\xe4\x62\x9e\x20\x9f\xc1\x2e\x60\x8a\x40\xbc\x04\xab\x82\x45\x59\xf0\x4f\x19\x10\xe5\x2e\x9b\x55\xa0\x1a\xc0\xdc\x8d\xe3\xdf\xfe\x45\x77\x90\x56\x0a\xc8\x75\x67\xb0\x56\x68\xf7\x8f\xcb\xd9\xbd\xd0\xa6\xa7\xf8\xb4\xf9\x03\x0a\xef\xeb\x74\x68\xde\x60\x2d\x86\xd9\xc6\x61\x2f\xf6\x4f\x7d\xcc\x2b\xcc\xad\x1e\xde\x5a\x40\x09\x3b\xfe\xab\x23\xb7\x62\x8b\x78\x8a\x3c\x83\x4b\x1c\xd2\x77\xb3\x72\xdd\x88\x94\x79\xda\x82\x7d\xf2\xf9\xfa\x4f\xef\x27\xaf\xde\x99\x67\xb2\x48\x65\x74\x59\x62\x6d\x16\x77\x0d\x4a\xcd\xb3\x1c\x70\x43\xd4\x49\xb8\x7d\xe5\xd8\x17\x03\x91\x28\xd7\x6a\x5e\x84\x05\x7d\x5f\x22\xef\xa7\x70\x09\xf3\xb4\x08\x70\x5e\x97\xc6\x0d\x52\x99\x92\xd7\x29\x04\x46\x5e\xb5\xdd\x5c\xb5\x88\x1d\x57\x0b\xb1\x4f\x5c\x34\x2b\x6f\xfe\x0a\x76\xdc\x23\x11\xea\x16\x14\x01\x81\x45\x32\x87\x25\x57\xb5\xe0\xba\xeb\xb4\x99\xa3\x42\xb0\xae\x5f\x11\x82\x61\x24\xb9\x05\x85\x40\x23\x37\x03\x58\x1f\x96\x20\xcb\xfa\xa5\x7e\xe4\x98\x08\xdb\xe1\x06\x68\x61\x8a\x4e\x7b\x62\x71\xa8\x86\x6d\x5c\x8a\xc3\x59\xad\x82\xc5\x06\xf3\x82\xe0\x15\xe5\x85\x08\xb8\x49\x55\x23\x70\xb1\x05\x0c\xa8\x42\x63\x01\xba\x5c\x57\xba\x19\x4f\x5b\x39\x35\xb8\x4c\x19\xb4\x69\x9e\xb2\x9c\x15\x8a\xd5\x62\x57\x39\x87\x24\x36\x63\x79\xf2\x7e\xae\x81\xbb\x2b\x96\x68\xa1\x95\x2d\xc8\xa5\x49\x1c\xbe\x68\x9f\xf1\xa4\xd8\xfa\x8c\x27\x5b\x14\x14\xd7\xa2\x16\x92\x8e\xf4\x68\x41\xb5\xd6\x66\x5e\x0e\x2e\xe2\xae\xa6\x6a\x8c\xb6\xe7\xca\x17\x7c\x5b\xf6\x7f\xaa\xa7\xc3\xf8\x68\x87\xbe\x3d\x9a\x7a\x9e\xa1\xe6\x75\x30\xa2\x9b\xf3\xf4\xea\x24\xd6\xc1\x88\x53\xc7\x8e\x68\x63\x53\x11\x5a\xde\x36\x24\x2f\xce\x39\x30\x0e\xdf\xdb\x9d\x1c\xa7\xcf\xf3\x59\xaf\xee\xfc\x95\xa1\xc8\x76\xdc\xe2\x1c\xc6\xd6\xf0\x70\x95\x1a\xad\xb9\xb9\xcd\xe5\x60\x57\xd9\xca\x0d\xe8\x48\xd1\x6d\x61\x2e\xb3\x83\xf5\x76\xf0\x8d\x16\x0a\xd0\x77\x13\xab\x4e\x72\xde\xa5\x63\x71\x84\x4b\x4a\x26\x9c\x79\x6c\xad\x2e\x29\xc1\x84\x84\x0c\xe7\x92\x31\xa5\xee\x77\xfb\x3a\xff\x5d\x2a\x01\x1f\xbf\x55\x98\xba\x36\xf5\x90\xad\xae\xac\xd8\x73\x45\xc6\xb9\x56\xaf\x12\x34\xa1\x19\x1d\xe7\x21\xb1\x7b\xaf\xb9\x83\x36\x1a\x66\xb3\xc7\x25\xea\xdf\x4c\xf5\x58\x4c\xa5\xbb\x1e\x7c\x18\x8a\x4f\xcb\x93\x97\x74\xd9\xe1\xcd\x4e\xa1\x85\xcf\x5b\xce\xef\xe2\xac\x8e\x88\x69\x7d\xee\x23\x94\xf6\xd7\xab\xc6\x60\xca\xff\xb6\xb6\xb6\x5a\x7c\x5f\x5e\xac\x21\x95\x92\xb0\xe9\x3f\xef\xd6\x3e\xd6\xe2\x15\xde\x9d\x1d\xf1\xc2\x9d\xc5\xd8\xcc\xdc\x17\x8a\xb0\xd5\x91\xb3\xed\x37\x94\x5a\xe8\xb8\x07\xd4\x23\xa3\xa8\xc1\x29\x72\xa8\x36\xdc\x90\xf5\xc5\x90\xc5\x63\xa2\xfb\x32\x77\x3c\xb6\xc9\x40\xce\x57\x66\xa0\xd8\xb5\x9c\xc4\xbd\xb1\x20\xaa\x35\xea\x6c\x7b\xab\x8e\x15\x59\x5b\xcc\xf9\xcd\x4b\xcd\x48\x2d\xa6\x26\x8a\xa8\x45\x26\x5c\x7b\x41\x01\x2d\x2e\x08\x48\xae\xa5\x05\xeb\x9d\xf4\x84\x84\x2f\x20\x21\x98\x70\xc1\xba\x5c\x39\x6e\x37\xb5\x91\xb6\xec\x49\xfd\x62\x0a\x69\x32\x3f\x67\xdf\x9a\x15\xa0\xd5\x26\xaf\xf8\x4b\xec\x99\x2f\x9d\x6a\xde\x97\x23\x89\x28\x3d\xf7\x65\xa8\xa2\x79\x65\x74\x9b\x5e\x86\xf2\xeb\x98\x62\x99\x5f\x06\x08\x01\xf7\x75\x32\xdc\x67\x3c\x89\x51\x5a\x7f\x5e\xe0\x9c\xce\x5d\x29\x72\xf2\x9e\x20\x92\x5d\x78\xb2\x9e\x62\x9c\x2b\x47\xda\xd7\x68\xa8\x99\xf6\x1e\xca\x6a\xc8\x06\xf6\xc4\xcd\x86\x07\xc7\x7f\xbc\xf9\x7e\xf4\x3e\x53\xcd\x86\x2e\x1b\x8e\xce\x27\x7a\x54\x82\x22\xf3\xd4\x00\x05\xb1\x36\xe6\xf5\xb9\x66\x66\xdb\x49\xfb\x8f\xbf\xff\x3f\x4e\x37\xbe\xe0\x7c\x2f\x03\x92\x84\x0d\x1d\x68\x49\x3a\xc6\xab\x2c\x65\x10\xe7\x09\xce\x32\x98\xd0\x40\x6c\xa3\x4e\x43\xd2\xee\x43\xd8\x1c\x5b\x52\x76\x04\x56\x57\x32\x07\x84\x06\xc6\x94\x2c\x13\xb5\x5e\xb6\xa5\x60\x60\x1b\x92\xc2\xf4\x9c\xaf\x5c\x14\x06\xdb\x81\x56\x4f\x9f\xff\xfc\x11\x16\x90\xdc\x08\x93\x98\x93\x22\x3b\x51\xb8\x24\x78\x56\x05\x8e\xd6\x37\x5d\xf9\x75\xbd\x48\xa1\x26\x7a\x74\x04\xaa\xfd\x68\xac\x0f\x93\x6f\xad\x70\x09\x49\xc2\x72\x08\xc5\x73\x7b\x51\xb8\x00\x77\x61\x14\xba\x20\xc3\xf4\xe3\xbf\xd9\x4b\xab\x1a\xe2\xf0\xf4\xa8\xd1\x10\x86\x6a\xa0\x0b\x47\x90\xa7\x95\xfc\x12\x82\x72\xb0\xd8\x2a\x87\xfe\x60\x72\x4b\xe4\x11\x3e\x6d\xc9\x75\xf6\x7c\xf9\xeb\x2e\x9a\x7c\xe7\xf4\x64\x53\x30\x29\x44\x41\x47\x19\x7a\x69\xb1\xc0\xc8\x18\x3a\x2b\xba\x43\x98\xa1\xea\xc7\xa6\x03\xdb\xd0\xef\xcb\x23\x3c\xa1\xe8\x06\x1e\x57\xbb\xdc\x6e\xa1\xdd\x92\x09\x8e\xd6\x33\xbb\x14\x0d\xbc\x1f\x57\xa4\xf2\x87\x1b\x48\x6e\x10\xbc\xd5\xd4\x76\x2b\x72\x87\x75\xfc\x97\x97\xa3\x83\xf2\xbd\x8a\x06\x39\x45\x19\x2c\xde\xa1\xfc\xfa\xa8\x7a\xb1\x36\x8c\x9e\x26\xe8\xad\x69\x11\x13\x8c\xed\x57\x5f\xe7\x9d\xf7\x75\x39\x08\xe7\x9c\xba\xcc\x6f\x7a\x84\x48\xa5\x7d\xa0\xe9\x1a\x7b\x8c\x31\xce\x66\x77\xd9\x72\x19\x4f\x08\x04\x69\x42\x56\x8b\xb2\xdf\xa7\xbd\xc7\xe0\x2f\xc7\x2f\x5f\xdd\xfc\x70\xa6\xee\x31\x4b\xc4\x8e\xe3\x56\xca\xee\xe9\xe3\x48\xd3\x0b\x0c\x1d\x61\x64\x64\x58\xcb\xfe\x2e\xf7\xf6\xf8\x03\xe3\x92\x79\xc8\x8c\x81\x5f\x96\x24\x13\xcc\xa8\x5f\xbd\xf7\x0e\xb4\xeb\x74\xa8\x50\x78\x3b\x6c\xa4\x7c\xef\x46\x97\x21\xbd\x5f\x72\x2e\xaf\xc7\x6d\x1b\x86\x7c\xa7\x68\x68\x4f\x00\xdf\xe5\xdc\x3a\x56\x6d\xc6\x57\x82\x85\x43\x6d\xb1\x45\x77\x51\x98\x28\x0e\x73\xfd\x09\x08\x92\x79\x18\x85\x31\x2d\x35\xff\x58\xaa\xcd\x19\xe4\x00\x15\x82\x8f\xd8\xbf\xf3\x84\x1d\x5e\xd8\x2f\xfe\xc9\xc9\x82\x9b\x65\xef\x1a\x28\x42\x46\x10\x3d\x71\x0e\xdf\x2f\x7e\xfa\xfe\xe0\xd7\xf4\x7b\x4d\xff\x1d\x5b\x51\x18\x14\x14\xa2\xab\x26\xbf\x36\x2d\xe5\x23\x8b\x6a\x5b\xdd\x1f\x5b\xf3\xab\xcd\xeb\x65\xb1\x9a\xcc\xa1\xd0\x97\xb9\x96\x93\xe0\xac\x58\xb2\x04\x7f\x57\x39\x87\xb0\x51\x97\x9a\x85\x19\xf1\xc1\x74\xd8\x74\x1a\x8d\x78\xef\x5b\xca\xb5\x4f\xd9\x08\x6c\x9b\x0e\x51\x9d\xd4\x3b\xf1\x9e\x96\xb1\xc3\x5e\x1b\x29\xd8\x43\x3c\x21\x4e\x39\xb1\x94\xf9\x58\x0c\x69\xf5\xaf\xe1\x56\x58\x0d\xb0\xbe\x83\x8c\xc5\x45\x77\xe4\x09\xe9\xe0\xbf\x64\x5f\xc3\x42\x34\x06\xbd\x6f\x04\x78\x09\xca\xe8\xe3\x18\xb9\xd4\x0c\x6b\x64\xf0\x28\x52\xe5\x61\xc8\x76\x6a\x18\x85\x1c\x5f\x59\x8a\x3e\x29\xec\xca\xbf\x63\x94\xcb\xc0\x20\x54\xc4\x98\xed\x7f\x1d\x7a\xa6\x92\x28\x52\xf8\xf5\x94\x7b\x8d\x9e\x1e\x4a\xf4\x89\xc0\xe3\xa7\x2d\xf8\x0e\xc1\xdd\xfe\x9b\xd7\xcf\x7e\xd1\xd4\xe7\x91\xc8\xa0\x0a\xab\x28\x41\xf6\x31\xa8\xab\x0a\xb0\xe0\x34\x74\xc7\xff\x21\xe3\x05\x45\xe0\x1a\xcc\x05\xf3\x3e\x6b\xe2\xd2\x56\x1c\xd7\x12\x22\xea\xb3\xcb\xe6\x0d\xf7\x2a\x9d\x23\xa2\xf5\xc8\x7d\xe6\x6d\x5c\xaf\xa5\xe0\xfd\xc8\x58\xd3\xeb\xa6\xe7\x32\x3b\x3b\x72\x1b\x42\xeb\xad\xc1\x90\x69\x7c\xcf\x0e\x0a\xbd\xfb\xaf\xb2\xab\x42\x93\x93\x1c\xa3\xad\xde\x61\x96\xed\x33\x78\xd7\x30\x56\xd8\xe8\x9e\x99\x80\x02\x25\x55\x24\x7f\xcc\x0c\xe4\xb9\x61\x32\xe3\x21\xb3\xfa\x93\xbd\x7a\x5b\x7f\x8b\x39\x1b\x48\xe5\x31\xfa\x2b\xcc\x57\x0b\x48\x4a\x02\x7d\xf3\x9f\x3b\xd1\x0c\xd2\x6f\xaa\x77\xfe\xfe\xaf\x04\xd2\x15\xc9\x03\x2a\x49\xf4\xb7\xbf\xfd\x7e\x30\x8d\x44\xa4\xf4\x86\x68\x24\x7b\xfb\xa7\xa2\xd1\x66\x68\xf3\xb5\xd3\xa4\x91\xf5\xf2\xb4\x8f\xa3\xc5\x77\x7f\xfc\xe1\xdb\x93\xcf\xa6\x35\x67\x48\xf8\xaa\xf0\x8a\x7f\x99\xc0\x55\x81\xe3\x36\x07\xc5\x93\x8b\x56\x6d\x0f\xd3\x1a\x16\x82\xe8\x0a\x75\x10\x6b\x80\xdc\xb5\x28\x8c\x27\x95\x18\x06\xab\x01\xc8\x71\x33\x72\xa2\x16\x58\x54\x5a\xe5\x6d\x55\xc4\x47\x53\xd5\x36\x9e\x78\xb8\xe8\x36\x63\xfe\x15\xac\x83\x30\xb8\x2b\x77\x1d\x49\xcc\xe2\x84\x00\x24\xfd\x2f\x1c\x8e\x92\xfb\x03\x73\x4c\x83\xea\x63\x6b\x0f\xaf\x32\x34\x43\x02\x83\x35\x84\xf2\x03\xef\x01\xd6\xbf\xb9\x82\xe8\xcc\x80\xb5\xda\xb5\xad\xa1\x53\x58\xca\x47\x98\x43\x69\xe2\x59\xf4\x35\xf8\xf5\xe3\x07\xeb\x20\xe6\x94\x2e\x8f\xd2\x94\xf8\x2d\xb4\xd1\x58\xc3\xb0\xe8\xdf\xfc\x46\x0b\x35\xe8\x6a\xdb\x5c\xcb\xb9\xab\x62\x9a\xd7\x63\xbe\x8c\x6d\x17\xad\x40\x2b\xf7\xaa\x07\xd8\x54\x82\xd5\x15\x2d\x13\xda\xa8\x41\xb8\x63\xb1\xab\x44\xb7\x12\x08\xe2\xb4\xfd\xda\xfd\xd0\xfd\xb4\x5e\xe3\xf0\xdc\xa8\xd2\x6b\x80\x35\x3e\xed\x63\x39\xff\xfc\xf6\xfb\x6f\xef\x10\x78\xca\x4e\x16\xfd\x0c\x32\x9d\x2b\x12\xe4\xf4\x11\x1c\x2b\xc3\xc7\x5c\x27\x8f\x0e\x18\xf5\x7b\xd1\x78\xa3\x9e\x93\x41\xfb\xe5\x01\x1c\x26\x1a\x28\xf3\xd3\xde\x2b\x3f\x5d\xbc\xbf\xfb\x11\x8f\xbe\x37\x43\x29\x2c\xa6\xe4\x42\xc2\x34\x85\xc5\x2a\x49\x60\x0d\x65\x68\x86\x80\x99\x28\x8e\xe5\x56\x9b\x60\x92\x42\x92\x69\xce\x73\x66\xa0\x01\x14\x25\xee\x6d\xd6\xaa\xe1\x06\x20\xbb\x05\xf7\x35\xa7\xf5\x08\x92\x58\x22\x98\xfe\xa7\x87\x6a\x3b\xe6\x30\x56\xcb\xfb\xd8\x98\x73\xbb\xd5\x45\x7c\x75\x18\x8d\x3a\x4d\x24\x56\xb8\x0c\x2b\xd5\x65\xfc\xd4\x17\xa5\x79\x0f\x2a\xb3\x38\xac\xa0\x24\x1e\x72\x14\x84\xb7\xd0\xba\x71\x8d\x78\x20\x6a\x57\xb4\x6b\x5a\xf2\x2b\x28\xb5\x24\x43\xcb\x09\x06\x24\xbd\x80\x77\x0c\xba\x59\xf2\x40\x15\xcc\x16\x85\x2f\xb8\xc2\xce\xbc\x66\x6d\x84\xd7\xa4\xa4\xd2\xab\xc3\x17\x80\xf2\x14\x25\x80\xc2\x73\xc9\x75\x0d\x20\xd8\x0e\x2c\x68\xc9\x36\x15\x14\xac\xce\x3d\xe5\x16\xb8\xef\xc0\xd7\x73\xed\x04\x20\xb3\xec\x1d\x4b\x63\x5d\x87\x66\xe6\x95\x11\x81\x12\xfe\x57\x3d\x0e\x4d\x2b\x62\xa1\x78\x95\x6a\x74\x8f\x60\x96\x96\xda\x5c\x9a\xe2\x3c\xd6\xd1\xef\x6b\x6c\x7c\x0d\x30\xba\xe7\xa9\x50\x77\xb9\xd1\x33\x21\x45\x05\x37\x4a\x22\x01\x6b\xfb\xc4\x0f\x86\xed\x1d\x08\x3e\xad\x7e\x99\x37\xe0\x32\x6e\x9a\x7b\x59\xea\x17\x29\x9c\xda\xec\x05\xf2\xe7\x92\xf3\xcf\x80\x03\x03\x58\x3e\x44\x04\x3c\xa8\xa8\x5e\x05\x8a\x6b\x29\x5c\xee\xc2\x28\xdc\x91\x1f\xee\xd5\x0f\x1c\x59\x38\x0a\x47\x3b\x3b\xff\x7f\xf9\xdd\x1c\x32\x28\x00\xfd\x4b\x52\xf6\x31\x5e\xde\x55\x9f\xef\x95\xcf\x16\xdc\x29\x7f\x73\xfa\xac\x1e\xf3\x04\xa8\x56\x93\xd6\xcb\x60\x29\xf3\xf7\x38\x44\xd7\xae\x21\x97\x46\x87\xd1\xae\x16\x92\x5d\x05\x2d\x00\x56\xaf\x84\x1f\x7a\x27\x80\xae\x16\xa1\xb2\xef\xff\xc2\x7e\x56\x93\x06\xd4\xe7\xae\x5a\x01\xb1\xd4\xa3\x44\x49\xef\x9a\x83\x52\x22\x8b\xa3\x80\x81\x73\xf2\x3e\xe3\xb4\xec\xb4\x5e\x40\xed\xc2\x87\x0a\x25\x2a\x47\x1c\xd0\x51\x88\xf2\x3a\x3a\x87\xbf\x65\x5f\xc1\x4b\x60\x6f\x38\xa7\xf7\x99\x34\x62\xd8\xd9\x08\x9b\x6a\x79\xa8\x87\x6c\xec\x3b\xd2\x24\x25\x69\x1c\xc1\x1b\x0a\xb4\x92\xa1\x2f\xd7\x96\x83\xfd\x71\x43\xfe\x32\xb0\x53\x76\xe2\x39\x88\x1e\x55\x3f\x57\xc2\x57\x8b\x52\xb2\x6d\x06\xa7\xed\x82\xf7\x25\x69\x6d\x19\x0a\xf7\x59\xaa\x58\x5a\xe5\xdb\x18\x7e\x93\x57\x29\xd3\x96\xdc\x3e\xa3\x81\xbe\xe6\xa3\x48\x98\xfb\x4e\x95\x72\x0f\xcd\x2f\x95\x93\x2a\xe4\xbd\xc6\x86\xab\xbb\xbb\x7c\x67\x7d\x17\x57\x69\xef\xa2\x60\x0b\xbe\x55\xad\xe8\xdc\x54\xee\xb4\xb1\xd6\xb9\xa4\xa6\xbd\x23\x9b\x76\x31\x52\x9d\xf6\xaa\xf1\xa0\xf5\x72\x53\x9f\x82\xa9\xe0\x19\x71\x21\x74\x9e\x8a\x73\x50\xc4\x4c\x30\x2b\x67\xa2\x28\xcb\x62\x8f\xc6\x61\xc7\xe8\x20\x1f\xb4\x79\x72\x6d\xf6\x58\xd4\xeb\xd3\x3c\xed\x33\x71\xfc\x07\x78\x93\x7c\x82\xd4\x1d\x59\x56\xea\x8f\xa8\x38\x41\x45\x85\xf6\x53\x61\x62\xd7\x19\x01\x3a\x72\x90\xaa\xf5\xd5\x2d\x4b\x66\x50\xc4\x69\x55\x3e\xc4\xb0\xa7\xf2\xa2\x9f\x01\xfb\x2e\x8c\x42\xfe\xf7\x95\x21\x89\xd5\x4e\xc3\x53\x4c\x03\x90\x65\xf8\x16\xa6\x01\xc5\xdc\x02\x2b\xe1\xdb\xc2\x2b\x2d\xee\x2d\x54\xc3\x9c\x95\x1e\x53\xf1\x36\x2d\xb4\xbe\x7c\x58\x64\xa2\x05\xed\x23\x50\x22\xdd\xb5\x7a\x01\xa1\x4f\xca\x98\x14\xcd\x4c\xd1\xe3\xb2\x2a\xc4\x79\xb1\x9a\x2c\x10\x0d\x9b\xb9\x7b\x57\xd6\xe4\xf9\xdd\x26\x5a\xcf\x92\xc0\x1b\x98\xd3\x13\xf9\x52\x77\xe1\x85\x8a\x00\x8a\x90\xe3\xfa\x26\x2f\x76\x8d\x0b\x68\xa9\x69\x53\xe9\xca\x4c\xde\x94\xa3\xaf\xaf\x06\xee\xa3\x6e\xbe\x57\xab\x15\x0c\x0c\x20\x56\x43\xaa\x44\x1b\xb6\xe8\xc1\x07\x81\x3e\xe5\x50\x62\xd4\x1b\xe2\x94\xc9\x8b\x36\x25\x4c\x08\x55\xd9\x80\x1f\x3a\xa8\x88\x59\xb5\x55\xe5\xba\xdd\x56\x8f\xed\x40\xdb\x12\x47\x52\x05\x78\x81\xf3\x0b\x5e\xd5\x4a\x25\xa8\xc0\x29\x94\x28\x59\x57\x96\x34\x4c\xfb\x3d\xa7\xd9\xb2\xa6\xf5\x65\x2d\xd7\x43\x0a\xc8\x0c\xd2\xad\x64\x0e\x93\xeb\x3a\x01\xa0\x0b\x6b\xf8\x44\xf4\xae\x4d\xb0\xad\x76\xab\xf5\xfa\xcc\x20\x00\xab\x84\x7a\xf3\x9a\x7c\x31\x87\x01\x58\xe0\x55\x4e\x03\x3c\x0d\x28\x5a\xc0\x00\x88\x6d\xb9\x58\x15\x34\x28\x85\x65\x06\x29\x64\xaa\x17\xca\xb7\x1c\x84\x37\xef\x6b\x87\x6c\x03\xe7\x53\x1c\x27\x88\x24\x19\x8c\xf1\x8a\xca\x31\x78\xc1\x84\x38\x4f\x50\x17\x8b\x39\xc1\xf0\x6d\xab\xdb\x86\xc1\xca\xf8\x53\xd8\x67\x63\x37\xb3\xaa\xcc\xf6\xdc\x0e\xd1\xe6\x80\x64\x6b\x22\xb0\x55\x43\x15\x25\xd0\x7e\x58\xa1\xe4\xba\xda\x52\x66\x29\x02\x98\x9e\x34\x9f\xeb\xc1\xb4\xed\xbd\x18\x32\xc3\x83\x4d\x6b\x8d\x68\xdc\xa6\x11\x85\x57\x0e\x4c\xea\x8e\xe5\x13\xa3\x7c\x53\x1c\xaf\x0a\x8a\x2d\x50\xa4\xc3\x57\xb0\x5d\xe4\x68\x52\x4e\x85\x32\x6d\x51\xea\x42\x94\x2f\x57\x54\xd7\xdb\xf9\x77\xc6\x29\xb6\x04\xa4\x80\x32\x57\x90\x1d\x5f\x69\xc9\x13\x24\xac\xd3\x72\xd4\x62\x3d\x51\x38\x9a\xef\xee\xc8\x33\x67\xac\x29\xe0\x3c\x7b\x56\x1e\xd5\x8c\x48\x72\x69\x75\x55\x5c\xb1\x02\x99\x4f\x5d\x55\x87\x19\x9f\xc0\x90\xb3\xcc\xc2\x6a\xda\x2c\xeb\x71\x38\x93\xdd\xed\xbd\x34\x47\xdb\x26\x64\x2b\xad\xd9\x76\xfa\xed\x45\xa1\x84\x37\xb0\x5d\x90\xd5\xa0\x53\x6d\x81\x9a\x85\x83\xe5\x82\x8b\x22\x4e\x8c\x6d\xe6\x30\x5b\x06\xca\x52\x36\x83\x52\x75\x7a\xb4\x45\x1e\x18\xfc\xdd\x96\x4c\x6d\x53\xf8\x9f\xf6\x89\x3b\xc5\x24\x81\x27\x95\x1e\xe3\xc7\x06\x5a\xa3\x4d\x9e\xb3\xaf\xcb\x8e\xb9\x16\xfb\x90\x47\xed\x9b\x05\x83\x49\xa4\x30\xbb\x0f\x08\x5c\xe0\x1b\x18\x28\x5e\xe1\x60\x4a\xf0\x82\x61\x17\x0b\x07\xd7\x57\x70\xd2\x7e\x25\xdc\xc6\xd4\x99\xf3\xfb\x82\xc2\xc5\x5b\x3c\x29\xfa\xe8\x77\x8d\x96\x1b\xd5\xef\x98\x9a\xc5\xbb\x0f\xca\xfe\x1f\x92\xfb\xce\x29\x5e\xea\xfc\x86\x49\x50\xf0\x77\x33\x88\x8d\xaf\x95\xdf\xc4\xed\x3d\x96\xb7\xa0\x36\xce\xab\x81\x53\x6d\x6d\x03\x35\x7e\x4b\x9e\x87\x09\x2b\xe7\xb1\xf6\x45\x4c\x1c\x3e\xca\x00\x9a\xa4\xd6\x25\x90\x9b\x46\x9d\x13\x71\x8e\xde\xb8\x7a\x0e\x1d\xf3\x31\xc8\x13\xb1\x83\xfb\x59\xac\x2d\x78\xbb\x3c\x2e\x7b\x11\x46\x21\x5e\x52\x0d\x14\x95\xcf\x68\x01\xf3\x55\x55\x9f\x53\x66\x70\x55\x1e\x96\x5f\x56\x90\x25\x49\xd4\xce\x97\xaa\x68\xb1\x51\xcc\xd8\x00\x59\xf5\xc4\x2c\x77\x98\x8a\x36\x6a\x84\x82\xa5\x1c\x11\xe9\x93\x28\x85\x13\x40\xd4\xaf\x98\x09\xe8\xa9\x9b\xa6\x2e\x76\xce\xc7\x3f\x3c\xff\xf4\x69\x58\xd2\xa3\x60\x93\x11\xdf\xd4\x07\x95\xde\x4c\x60\xf9\xa6\x34\xae\xa9\x61\x9a\xfb\x8d\xd4\xc8\x71\x5d\xe6\x4a\xf8\x34\x5c\x26\xef\x03\x1e\x8c\xc6\xba\x0e\x23\xad\xed\x15\xcb\xc6\xd8\xab\xc0\x95\x77\xaf\x9a\x85\x32\xcb\x8d\x33\x65\x9b\x86\xc0\x19\x2a\x28\x24\x47\x89\x8c\x27\xd1\xcc\xc9\x15\xc6\x18\xeb\x6a\xbf\xb5\xab\x14\x7a\x76\xe6\xc6\x75\xea\x22\x84\xe5\xe2\xdb\x48\x3b\xd1\x84\xbe\x2c\x12\xe5\x86\xcb\xf2\xab\x40\x3f\x62\x64\xe4\x54\x38\x10\xd1\x3c\x4c\x30\xed\xee\x44\xfb\x2d\xe8\xd4\x6b\x0e\xa4\xa1\x14\x5b\x67\x1b\xda\x6b\xe2\x89\x28\xcb\x9a\xa2\x45\x0d\x20\x68\xba\x98\x7b\x89\xbe\x2b\x2e\x76\x31\x4f\x44\xe1\x2c\x28\xe3\x9d\x5e\x55\xbc\xfe\xe6\x24\x8c\x94\x7c\x95\xba\xb0\x54\x25\x21\x09\xbe\x41\x29\x24\xc5\x36\xef\x2c\x66\xfb\xa5\x14\xe6\x73\xb4\x2c\xa4\xcc\x64\x96\xf7\x14\xa5\x31\xca\x0b\x48\x58\x01\x63\x06\x2e\x8b\xb2\x2c\x4e\x61\x41\x09\xbe\x2f\x65\x6f\x5e\x05\xd4\xc6\x09\xcc\xb2\x9e\xc2\xd1\x43\x84\x6d\x56\x64\xde\xc1\x24\xa6\x90\x2c\x50\xce\xf6\xef\x93\x16\x8e\x3f\xcc\x4e\xd2\x1f\x7f\xc6\x07\xee\x80\x40\x39\x11\xe5\x56\xaa\x46\x98\xf5\x5c\x0b\x95\x36\x7e\x54\xff\x0f\x7f\xaa\x6f\xe3\x25\xcc\xbf\x92\xe8\xb2\xe3\xdd\xef\xdf\xfd\x3a\x23\xef\xb5\xe8\xb2\xbd\x5a\x04\xb3\xcc\x81\x72\x52\x81\x8a\xb5\x50\x6e\xfe\x1c\x2c\x60\xb1\x04\x89\x76\x8d\xa8\xe1\xe0\xc4\x4f\x52\xcd\x57\xfc\xd7\x5a\xd1\x00\xe5\x28\x13\xd1\x39\x6c\x6d\xea\x48\x1d\xa1\x3a\x07\x16\x4f\xc7\xe8\x4a\x09\x6f\xaa\xcf\xac\xca\xb5\xa3\x3e\x97\xaa\x6e\x9b\xf2\x31\x2d\x72\x5e\x79\xf0\x67\xbc\x0a\x52\x9c\xff\xe3\xef\xff\x9b\x06\x73\x70\x03\x83\xba\xca\x7a\x40\x31\x1b\x1d\xbf\x1c\x59\xab\x0c\x28\xca\x63\x58\x72\x41\xe8\x12\xdb\xfa\x85\x61\x8f\x87\xee\xe4\x05\x6e\x8b\xa8\xd2\x45\xf3\x2b\x36\x12\x4f\x81\xaa\x6b\x92\x09\xc8\x73\x4c\x45\x07\x55\x88\x26\x07\x03\x60\x3f\x49\xc1\x58\xe9\x90\x83\x70\x65\xcc\xbd\xb0\x71\xf1\xb6\xcd\x30\x98\x45\x46\xde\x93\x47\xbd\xf8\xb0\xbf\xfb\xeb\x8c\x1e\x5e\xb7\xd4\x48\x21\x69\x79\x3f\xc9\xd3\xb8\x61\x5c\x55\x5d\x6b\x66\x0b\x9b\xa5\xce\xf2\x30\x23\x96\xd9\x71\x15\xdb\x01\x8a\xeb\xb6\xfc\x14\x15\xbc\x4b\x09\x1b\x36\x54\x87\x2a\xf6\x48\x09\xf9\x19\x57\x41\x40\x55\xc0\x4f\xf5\xd5\x8e\xa6\x76\xb6\x5c\x4a\xf9\x3d\x5a\x76\x94\x30\x2c\xa6\xaa\xdf\xe4\x5e\xfb\x48\xc2\x28\x3c\xb0\xd3\xa4\x67\x2e\x93\x5a\xe7\x6b\x8e\x57\x59\xfa\x61\x09\xf3\x37\xf9\x29\xbc\xfd\x09\xe5\x29\xbe\x0d\x9b\xa1\x39\xf6\x4c\x1d\xd3\xd0\x50\xf6\x13\xa0\x3c\x00\x41\x0e\x6f\x83\x5b\xd1\x59\x87\x90\x10\xa2\x18\x35\x70\xe4\x8b\x39\xbe\x8d\x71\x1e\xcf\x99\x87\xde\x17\x81\xb5\x1e\xb5\xf5\x0d\x26\x1e\x77\x1d\x0c\x68\x4d\x89\x18\x20\x19\xb4\xcd\xfb\x40\xb2\x81\xbb\x64\x97\x80\x34\x12\x80\x9f\x9e\x7c\x98\x5c\x67\x3f\x5c\x9f\xbd\x5a\x98\xa9\xf3\xd6\xc3\x92\x5f\xe1\xe5\x39\xa9\xfb\x4d\xe6\x40\xa6\xce\xa8\x89\x2f\x7a\x04\x80\x60\x93\xce\x5a\x39\xe2\x45\x1f\xdc\x67\x99\xce\x42\x63\x03\x50\x03\x15\xbc\xe9\x55\x54\xd5\xa3\x14\xe5\xd5\x8c\xf2\x94\x0e\x64\x74\x4d\x40\xb9\xd0\x5d\xdb\xbd\x63\xf5\x10\x4c\x20\x54\xb5\xce\x25\x97\x8e\x5a\x85\x4b\x5b\xe8\xda\x9e\xe5\x7a\xba\x53\x95\x28\xbd\x00\xc5\x75\xe1\x0e\x60\xeb\x23\x4f\x1a\x17\xc3\xf1\x5e\x74\x10\x85\xbf\x09\x15\x0c\x85\xe2\x3a\x46\x94\x3b\x57\xea\xcb\x73\x68\xd8\xb3\x46\x86\x4a\xa2\xbe\xcf\x4a\x5d\x06\xc5\x7d\x65\xf9\xe9\xaa\x42\x37\x71\x5f\xb6\x75\x93\x68\xd3\x0e\x2d\xce\x99\x17\x55\xc0\xe1\x0b\x07\x25\x24\x5e\x88\xc3\xdb\xc5\x0a\x38\x7e\xc4\x2b\x0a\xdf\x14\x17\x73\x54\x5c\x68\xa3\x14\x4d\x0e\x15\xfb\x41\x0e\xf4\x92\xf5\x7c\x00\x65\x33\xa3\xbc\x82\x81\x29\xe9\x5a\x28\xcf\xea\xf4\xb6\xdb\xbe\xe1\x16\xbf\x6c\xae\xa7\x2d\x31\x96\xcb\xfa\x52\xb4\x29\xa5\x27\xb6\x38\x3d\xad\x6e\x4e\x73\x4d\x99\xb7\x14\xe5\x6f\x52\xfb\xea\x46\x1a\x89\x14\x92\xf5\x74\x73\xff\x4b\xae\x79\x4b\xf0\xfc\xc8\x70\x3e\x76\xb8\x2a\xb9\x26\x66\x42\x3c\x1a\x7a\xb8\x2b\x84\x90\xff\x64\xd1\x8c\x05\x48\x24\x33\x74\xd4\x28\x76\xbc\xd9\xd0\xa3\x5b\x3d\x5b\x37\x7a\x7c\x4f\x33\x78\x17\x2f\x40\x81\x73\x06\x41\xfc\xa4\x0f\xed\xcf\xf7\x2b\x74\x83\xb7\x3f\x1b\x87\xb6\x61\xa5\x55\x67\x64\x5c\x60\x59\xb8\x76\x79\x59\x96\x49\xd6\xea\xb3\x71\x82\xb3\xd5\x22\x2f\xea\x10\xdc\xab\xe6\x21\xcd\x2e\x74\x4b\xba\x22\xf0\x55\x06\x17\x12\x71\x54\x33\xaa\xaa\xcf\x12\x38\xcd\x38\x37\xeb\xcf\x8c\x6d\xcf\x98\x20\x57\xc6\x2d\xd7\xda\x5d\xbf\xb8\xef\xdd\x8e\x68\xef\xa6\xef\x54\xa5\x8f\x3c\xfe\xec\x17\x87\xc3\x68\x9f\xbf\x64\xcf\x22\x52\xd4\xe2\xeb\xfa\x14\x2c\x57\x6f\x63\xbf\xee\x39\xae\x0c\xe5\xfe\x7d\x51\xae\xe8\xb9\x58\xd0\x28\x7c\x21\x96\x90\x81\x6d\x53\xb8\x60\x46\xc7\x72\xd4\xee\xc8\x61\xcd\x12\x59\x7e\x58\xb1\x18\x52\x66\x91\x2c\x25\x51\x4c\x60\xc1\x0b\xde\xd9\xa5\x40\x95\x81\x33\x04\x99\x47\x25\xef\x66\x77\x75\xb3\x2c\xef\xd3\xde\xda\xef\xcf\xa7\x7f\xfc\xe9\xd7\x0f\x6f\x9c\xf7\xf5\xb6\x4a\xe4\x4a\x84\x68\xcf\xda\xcf\x34\x38\x5a\xd1\x39\x26\xe8\x57\x01\x7b\x65\xb9\xd4\x8f\x1d\x3d\x5a\x10\xa3\x0c\x65\x98\xe2\x6b\xc8\xec\xd8\x30\x21\x90\x9a\x0a\xe7\xcf\x78\x45\x94\x43\x7c\xd4\x48\x3e\xbe\xe2\x05\x4b\x29\xca\x67\xc5\x16\xeb\xcb\x55\x19\x3f\x3c\x3a\x7e\x17\xf0\xb7\xe9\xa7\x63\x90\x62\x58\x04\x39\xa6\x81\x30\xce\x07\x74\x0e\x2d\xb1\x45\x95\xd9\xcd\x19\xcd\x16\x26\xbc\x2a\x48\x23\x82\x48\x6d\xea\xa3\x8e\x11\xf8\xcb\x0a\x11\x98\xda\x9c\x22\x81\x62\x00\xdc\x0a\x8e\x71\x4e\x41\x42\x79\x19\x71\x90\x2e\x50\x8e\x0a\x4a\x00\xc5\x24\x40\xd3\x80\xce\x51\x11\xa0\x22\x00\x79\xc0\x92\xf9\x5c\x75\x3d\xce\xc4\xc4\x41\xfe\xe0\xc4\x2e\x85\x51\x5f\x02\x3f\x08\x79\x0b\x44\x61\x17\x7d\x03\x8a\x83\x1b\x04\x6f\x19\x21\xb7\xfc\x2b\x74\xf4\xd8\x0e\xe5\x0b\xdf\x4c\xcb\xf5\xe3\xd6\x5d\x90\x07\x15\xed\x82\x04\xe7\x53\x34\x5b\x11\x98\xb2\xc8\x0f\x3a\x87\xc1\xf1\xbb\x37\x51\x00\x56\x74\x0e\x73\xca\xf2\x3d\x19\x45\xbf\x71\x05\x5a\x48\x9f\x02\x53\xbd\x00\xca\x61\x3b\xee\xdc\x92\xc0\xb0\xd1\xb6\x6e\xa1\x9a\x93\x96\x04\x2f\x96\xda\xe5\xf4\xff\xa7\x92\x23\x60\xc2\x37\x58\xa1\x20\x56\x47\x3b\x28\xfe\xa0\x13\x06\x63\x58\x36\x7f\xe3\x00\xd8\xec\xf1\x52\x6c\x7f\x45\x08\xc8\xf9\xfc\xf6\xdd\x4f\x3f\xbc\xdc\x36\x73\x37\x2d\x80\x16\x92\x57\xd4\x54\x37\xc5\xc0\xa2\x4e\xfa\x8a\x05\xb0\x1a\xd0\x0e\x4e\xf4\x40\x55\xe0\xe8\x45\x42\x4a\xf5\xfe\x9c\x0a\xf6\xb9\x6c\x2d\x01\xa2\x3c\xda\x79\x43\x14\x06\x1d\x65\xf0\x6a\x6b\xcb\x97\x51\xf3\x06\xe7\x28\x21\x69\x4c\xd1\xa3\x12\x95\xa6\x98\xee\xda\xc2\x75\x1b\xc4\xf5\x52\x54\x6d\xeb\x34\xe2\xb5\x29\x40\x61\x83\xde\x68\x71\xb5\xfb\xac\x50\x14\xbe\x58\x8a\x8c\x5d\xff\x95\xaa\x46\xc5\x9b\x7a\xdc\xed\x6b\x63\x9c\x66\x19\x30\x06\x6e\xaf\x0b\x66\x75\x49\x39\xf5\xe7\x9a\xe6\xa6\x5e\x3c\x2d\xb6\x4b\xc9\xe3\xd0\x7b\x7b\x0a\x23\x4d\x5c\x6c\x5e\x12\xe1\xdb\xe2\xe9\x67\xcb\xfd\x09\x5d\xff\xe9\xd7\x57\x67\x0d\x74\x3c\xb5\x4c\x7f\x1d\xa2\x2f\xbe\x65\x08\xad\x19\x2e\x20\x69\x24\x14\xbf\x46\x59\x05\xf2\xcf\x4a\x8d\x73\x1f\x50\x23\xab\xb5\x61\xa0\x95\x0d\xf5\xdd\xd4\x6b\x13\xb0\x1a\xdf\xa2\xc0\x11\x87\x86\x30\x52\xf7\x3c\x77\xc5\x4e\xbd\x2b\xf4\x82\x1e\xe5\xbc\xa6\x45\x0c\xef\x96\x19\x26\xa2\xe0\x79\xff\xba\x7e\x9b\xdf\xc6\x3b\xda\x36\xb6\xc4\xdc\x38\x6c\x53\xad\x77\xec\x7a\x9e\x81\x56\x51\xbe\x4d\x9b\x71\x15\xa1\x77\x40\xf3\x3e\x21\x1a\x75\xe6\xd7\x20\x02\xd9\xbe\x79\x95\x53\x82\x44\x35\x09\x87\x41\x77\x57\x0d\x8f\xc2\x2b\x92\x70\xae\xc4\x84\xca\x9d\x2c\x3f\x9f\xc0\x22\x11\x08\x67\x36\x7e\xe5\x1e\x85\x13\xdb\xab\x95\x27\xaa\x4e\x8d\xef\x95\xce\x4b\xc6\xd5\x57\xa4\xd4\x8b\x03\xb9\x47\x27\x19\xd4\x60\x97\x3b\x19\x5b\x9d\x2f\x3f\x0e\xf8\x0a\x7b\x45\x31\xba\xba\x28\xc7\x1c\x4f\xee\xab\x5e\x38\x60\x3b\x5e\x6a\xa4\x09\x45\xd6\x18\x2a\x62\x7a\x8b\x39\x44\xb3\xf3\x4a\x54\x65\xb4\x5b\x23\xc4\x87\x8e\xe0\x9c\x1b\x5e\xaa\xba\x6c\x95\xf7\xca\x55\x7a\x24\x60\x2d\x36\x3e\x8e\xf7\x38\x65\x25\x85\x7d\x87\x52\x2a\x1f\xc1\x7b\x9c\xa2\x29\x12\x41\x30\x8e\xe1\xb4\xff\xa6\x0e\x94\xdf\xae\x06\xae\xba\x01\xcd\x0f\x58\xa8\x40\xdb\xce\x87\x39\x15\xd5\xe4\x1d\x42\xda\x53\x14\x8c\xa3\xcb\x50\x00\x8d\x3a\xed\xf9\x2d\x89\x78\xe2\x27\x4b\x7c\xb6\xcb\x4a\xe1\x12\x8b\x8e\xcb\xa9\xa3\x6d\xbb\xad\xa9\xd1\xb0\xb7\xd5\x29\x10\x65\x72\xda\x31\x1d\x7a\x5f\xb5\xeb\xff\x2a\x41\x16\xa0\x22\x10\xbe\x9c\xec\x3e\x60\xbd\x6c\xd9\xde\xe5\xcc\x20\xf4\x83\x79\x68\x04\xb6\x5a\x7f\x37\x95\xcf\x52\x75\xe0\x48\xc0\xa6\xe6\x29\xf4\x0b\xf3\x9a\x19\x66\xa8\xa0\x12\x9a\xbf\xfc\xb5\x3a\x2b\x62\xc1\xb1\xfd\xd5\x52\xa6\x3b\x6e\x5a\x25\x35\xc7\xf5\xc4\x55\xd3\x8b\xd7\xcb\x93\x93\xdb\xed\x97\x0d\xe0\xe6\xa6\x41\x45\xb2\x7c\x47\xf9\xe6\x9d\x47\xd1\x30\x2e\xf0\x2b\xb1\xec\xee\x63\xd4\xd0\x2e\xc4\x7a\x84\x6f\x8a\x13\x64\x49\xa4\x14\x37\x2f\x15\xe4\x6b\xca\x12\x5e\x95\xac\x22\x6b\xb0\x8e\x47\x3f\x48\xcb\x4d\xb2\x87\xfc\x58\x75\xbd\xda\x2e\x95\xcb\xb2\x08\xba\x91\x50\x4e\xea\xd4\x16\x50\xe6\x3a\x67\x5c\xf6\x3d\x0d\x8e\xd7\x3c\xef\xc4\xab\x4b\x82\xee\xbb\x89\x2a\xa8\xa1\x06\x5c\x9a\x8f\x8a\x83\x5a\x71\x02\x59\x6f\xa9\xde\xa3\x52\xb1\xa2\x9b\x89\x51\xf2\xad\xf2\x20\xd7\x72\x8a\xc6\xda\x5a\x1d\x74\x34\xbb\xbc\x0c\x59\x5a\xe0\x8d\xb0\x1d\xee\xec\xec\xd8\xa1\x78\x9d\x56\xbd\xfa\x66\xad\xc3\xdc\xae\xf2\x8c\xa3\xe9\x89\x82\xaa\x93\x7b\x0a\x95\x8f\x66\x65\xd5\xfe\xc2\xce\x90\x4a\x9b\x16\x7a\x5c\x68\x3f\x6d\x49\xf7\xfa\x87\xf7\x3f\xfc\xfa\xa7\x5f\xe7\x8e\x52\xa9\x39\x3e\xc6\x79\x5e\x15\xd9\x70\xa3\x4a\xe6\x98\xa2\x29\xe2\xa2\xaa\x54\xe7\xab\x62\xbe\x2e\xe4\x12\x45\x43\x60\x7c\x5a\x36\xda\x53\x1b\x1c\xb3\x58\xe0\x80\x15\xf5\x0d\x18\x29\x1d\xd6\x64\xa1\x16\x88\x66\x17\x73\xc8\x9e\x2e\x84\x11\x1d\x15\x0e\xcb\x1f\xbb\x99\x88\xe0\x10\x43\xcc\x96\x53\x04\x04\x06\x28\x07\x0c\x5e\x11\x4d\x32\xb8\x15\x1c\xcf\x61\x72\xcd\xf3\x7f\x71\x9e\x22\x36\x53\x3c\x55\x12\x82\xd9\x3f\xeb\xae\x4a\x55\x03\xe7\x5b\xdd\x16\x6f\xb3\x36\x75\xaf\xab\x2c\xfb\xc2\x05\x6d\xa9\x99\xf0\xcb\xeb\x96\x2e\xb5\xf8\xb3\xca\x99\xa0\x88\xb0\x92\x86\x17\xf7\x4b\xf8\xa6\xf8\x94\x5f\xe7\xac\x76\x84\xc3\x51\x63\x66\x3a\xd6\xd1\xf3\xb7\x73\x44\xa1\x76\xb9\xeb\xce\x7a\x0c\x53\x7c\x9b\x67\x18\xa4\xdc\x2a\xd3\x99\xe9\xf8\x23\x82\xb7\xc1\x47\x70\x1b\xbc\x6e\xb2\x88\x41\x5a\x25\x0d\x4b\x95\xc0\xa8\x78\x07\xc8\x4c\x3b\x4b\x99\x0c\x80\x60\x01\x04\x72\xbc\x3b\x39\x6b\xd3\xb3\x9f\x61\x8a\xbf\xe3\xeb\xdc\x35\xf3\xef\x24\x3b\xf8\xa6\xa0\x6e\x60\x68\x17\x00\x65\x1e\x43\x13\x8f\x75\xac\x85\x9d\xd8\x8f\x41\x65\x1e\x56\xca\x5f\xab\x4e\xc7\x2c\xb0\xa0\x88\x8c\x0c\xf3\x12\x35\xd5\x70\xa5\x71\xe3\x0c\xac\x0a\xc8\xd2\xb7\x01\xa1\x2c\x86\xa6\x50\x7e\x6f\x21\x52\xd3\xbe\x2d\x4e\xdc\xfd\x2b\xcf\x57\x33\xb4\x82\x78\x29\x06\x20\x3e\x65\x40\x02\xb7\x6a\xa9\xde\xa2\x4a\xbf\x55\xa3\x6a\xc7\xb8\xe8\xf2\xd0\xd9\x40\x21\x2d\x16\x1f\x3b\x26\xa1\x14\x35\xc7\x55\x19\x48\x06\x20\xad\xad\x8c\x00\x5f\x21\xd7\xba\xd5\xc8\x6d\xd9\x1d\xf2\x0e\x9b\xf1\x57\x4d\x36\xac\x16\x81\xc5\x43\xf2\xe2\xf5\xca\x6a\xd4\x6f\x12\x0f\x2a\xd2\x84\x35\xb0\x48\x97\x2a\x10\x3a\x77\x14\xeb\xf3\x9e\x0b\x5a\xf0\x7b\xb9\x7b\x2a\x87\xaa\x61\x90\x88\xd2\xfc\x1c\xb4\x98\x29\x9e\x6a\x34\x17\xfd\x44\xb2\x86\x01\x5a\x31\x69\xe9\x5f\x4b\xc5\xd5\x3d\x0d\x97\x9d\x57\xbb\xc3\x97\x6b\x3b\xc7\x59\x66\x4d\x45\x18\x6a\x59\xf8\x94\x17\xab\xe5\x92\x99\x32\xd9\xf9\x10\x5c\xb0\x12\xa9\x6e\x99\xd9\x66\x60\x08\x2c\xf6\x8f\x52\xdb\x38\x65\xbe\xef\x4f\x6f\x82\x04\xaf\xb2\x94\xc5\x96\x10\x98\xa7\x50\x68\x1f\xe5\x6a\x45\xc1\x64\xc5\xc2\x36\x82\x04\xe4\x41\x41\x51\x96\xc9\x50\x03\xae\xad\x04\x5c\x15\xcd\xee\x9b\xea\xc2\x7a\xe6\x8f\x6e\x01\x9a\xa9\x57\x86\xc7\x3a\x99\x9d\x06\x15\x8b\xb6\xa4\x02\x41\xdb\x0a\xc6\x39\xe2\xd8\x64\x1c\x5a\x75\x8b\xa8\xc2\x58\x79\x34\x6a\x1d\xcc\xfa\x4b\x28\xa5\x01\xca\x67\xb1\x30\xb5\xb0\x2d\xc5\x3f\xf4\xbe\x57\x94\xad\x36\x7d\x99\xe0\x37\xa4\xa7\x7d\x99\x38\x7e\xfb\xcb\xf9\xde\xeb\x5f\x76\x1c\x97\x09\xdd\x6c\x71\xa9\x63\x39\xd9\x4a\x58\xb9\x42\x93\xea\xa0\x74\xff\xf2\xe4\xe5\xcb\xb7\xa6\x45\xd8\xc8\xc4\x1f\xe8\xc8\xb1\x01\x17\x78\x04\x20\x58\x34\x75\x7f\x2f\xd9\x03\xd0\x43\x96\x34\x1f\x44\x94\xc7\x21\x82\x7e\x1e\x3e\x1a\xc3\xf4\xe3\x95\xa7\xcc\x16\xbd\x26\xdd\x56\xe3\xfe\x51\x16\xba\x55\xa8\x9b\xd9\x03\x52\xcc\xf7\x16\xd1\x65\x47\x1b\x15\xd1\x33\xb0\x9a\xc1\x98\x81\xa1\x3f\x75\x31\x3d\x3e\x80\x6f\x3f\xe4\xcf\x3f\xb9\xa0\xfb\xeb\xf2\x1d\x68\x31\x93\x9a\x81\x4c\x9f\xad\xd2\xfc\xa0\x70\xf8\x89\x16\xe2\xde\x14\x32\x3a\x04\x9c\x0e\x56\x5b\x45\x77\x1d\x80\x52\x8b\x03\xe4\x5b\x02\x52\x5e\x2f\x48\xc0\xfb\x8f\x54\x48\xff\xbb\x71\x18\x85\x23\xf9\xe9\x5e\xfb\xed\x7e\x5c\x7d\x6a\x16\x75\x2b\x07\xa6\x97\x72\xdb\x8f\x46\xfa\x33\x53\x94\x65\x6f\x52\xa3\xd4\x5b\x53\x15\x2d\x28\x5e\xd6\x0a\x55\x41\xe5\x8c\xf7\xa2\x10\x4f\xa7\x05\x4b\x68\x17\xa5\x05\xac\x68\xe5\xf6\x7e\x60\x9e\x36\x7a\xa9\x4a\x14\xf8\x94\x20\x50\x22\x68\xd5\x7a\x0a\x8d\x59\x2e\x40\x71\xed\x31\x4b\xe9\x91\x90\xd0\x71\x02\x8f\x78\x3f\x0a\x53\xa3\xe8\x1f\xe3\xcc\x23\x92\x84\x2d\x18\xed\x5d\xc6\xb0\xfa\xbd\x33\x7d\xfd\xc2\x04\xe4\x37\xa0\x08\x14\x84\xcc\xe6\x4a\xda\xd9\x49\x9f\xc1\x04\x24\xd7\x33\x82\x57\x79\xea\x9a\x47\xfd\x84\xcf\x64\x1a\x25\x29\x00\x81\xa0\xe2\xd2\x35\x4b\x52\xec\x0b\x8a\x0b\x1a\xac\x48\xf6\xbb\xdf\x84\x51\x83\x4f\xa3\xf0\xf7\x61\x05\x10\x5a\xae\x7a\xcc\x5d\xda\xd6\x56\xd5\xba\xd7\xad\xec\xd9\xfb\x5e\x57\x7e\x5e\x85\x03\x96\x12\xd4\xb9\xdd\xd5\x3b\x9b\x0b\x01\x40\x05\xa5\x6d\x8d\xb1\x6e\x40\xf1\x0b\xa3\x89\x9a\x7b\xa8\xc0\xf2\x5f\x86\x14\x53\x06\xdf\xc3\x71\x92\x17\x42\xa2\xd4\x19\x09\xe5\xaf\xca\x41\xae\x3e\xe6\xa8\xd8\xe9\x76\x64\x70\xc7\xc4\x12\x92\x04\xe6\x94\x5d\x15\x7b\x9d\x4b\xca\x19\xb2\xd9\xb3\x29\xc3\x13\x90\xb1\x1b\xf2\xd3\x0f\x0b\x3c\xfb\xf5\xed\x94\x7c\x9e\x99\xd5\xf9\x42\x59\x89\x4f\xf8\xfd\x6e\x26\x65\x77\x3a\x1c\xa0\x72\x0c\xe5\xe0\x06\xcd\x80\x35\x68\xac\xc1\xbe\xbc\xb3\x78\x42\x40\xde\x52\xc5\xbd\xb6\xa4\xcf\x56\x94\x42\x12\xd3\x0a\xc6\xb2\x81\xb0\xc0\x20\xf1\x5c\x57\xea\x9d\x66\x0e\x18\xce\xbf\x03\x8b\xc9\x8a\x30\xd0\x7f\x86\x21\xd5\xf4\xc7\xb5\x85\xe8\x56\x7f\xf8\x1c\x0d\x8d\xa2\xb8\x62\xfe\x88\x42\x06\x3a\x9f\xe1\x19\x0e\x79\x9e\xb7\x3e\xab\xef\xf0\x42\xea\x7d\x4a\x8e\xc8\x67\x09\xd8\xe9\x17\x8e\xb8\xdb\x31\x64\xbf\xe0\x69\x25\x95\x9d\x01\x64\x86\x51\x38\x5d\xfd\xfa\xeb\xfd\x39\x04\x24\x99\xeb\x40\xe2\xd2\xb1\xa1\x58\xd2\x42\x54\xbc\xc7\x13\xdd\x8c\x61\x58\x9d\x75\x0b\x60\x73\xb4\x66\xe6\xac\xcd\x68\x6a\x61\x32\xd8\x60\x31\x63\x3e\x3c\x0b\x24\x8c\xc2\xa3\xb3\x33\x1e\x65\x7e\x7b\x5e\xee\x8e\x09\xc6\xd7\xef\x50\x7e\xed\xb0\x90\xef\xf2\x17\x1d\x44\xe1\x76\x21\x1f\xdf\xae\x36\x05\x03\x3f\x0d\xa3\xf0\x2f\x93\x0c\xe4\x55\xc1\x24\xc2\x56\x35\xc7\x78\x09\x73\x48\x82\x1c\x13\x38\x85\x84\x54\x45\xdc\x74\xd6\x70\x18\x98\xaa\xc1\x79\x9a\x94\x6d\x4b\x07\x66\xbc\x78\x45\x35\xf7\x4f\x6f\x58\x15\xbe\xbc\x58\x95\x23\x7c\x09\x0a\xf8\xe9\xcd\xa7\x8f\xef\xda\xe6\xbe\x1f\x1d\xac\xd5\xf1\x23\x90\x8a\xbf\x77\xe3\x74\xfa\x91\x97\x5d\xdf\x38\x99\x6c\xfd\x3e\x02\x95\xd8\x6b\xfb\xf8\x27\x2c\x7b\x60\x4e\xe9\xb2\xf8\x66\x7b\x9b\x1d\x8b\x4b\x82\xd9\xd1\x85\xf0\x76\x8a\x93\xe2\xe1\x37\xc5\x09\x4e\x56\xa5\x02\xa1\x02\x62\x0e\x90\xc5\x4d\x51\xeb\x99\x8e\x57\x0d\xe4\xe8\xf8\x5d\x70\xc1\x1e\xed\x27\x5e\xdb\x74\xbd\xfa\xe4\x2d\x60\x82\xf3\x54\x9e\xbd\x3e\x27\xac\x3c\x61\xf8\x01\xea\x38\x6a\x9b\xfe\x8a\x14\x26\x98\x54\x67\x79\x58\xc3\xb2\xd5\x25\x61\x3c\x2e\x14\x9a\xfe\x50\x47\xd1\xb1\x13\x8f\xfb\x7f\x75\x0d\x42\x79\xa4\x45\x99\x08\x4c\x38\x17\x47\x2a\xb8\xd5\x0e\xe2\xa5\x75\x3b\xcc\x21\x95\x35\x7b\x2e\x35\x07\x09\xc4\x5b\xdb\x48\xb8\x56\xc8\xce\x73\x11\x5b\x53\x19\xc3\x99\xb3\xb0\xbc\xae\x73\xd5\xb0\x60\xe7\xe6\x76\x82\x73\x4a\x70\x26\x50\x53\x71\x1e\x17\xb7\x88\x26\x73\xe6\xf7\x1a\x62\x68\xd1\x14\xcf\x87\x50\x69\xcd\x71\x3f\x6d\xd5\x76\x0f\xe7\xaf\xde\xdc\xed\xfc\xaa\xa9\xb6\x7a\xa1\xd1\x1d\x7b\xa1\x92\x42\xd3\x6b\xaa\x2f\x38\xec\xe8\x1b\x5e\x10\x42\xa9\x5b\xc2\xfe\xfd\x1a\x27\xab\x0a\x98\x14\x33\x17\xf1\x8b\x94\xe0\x65\x8a\x6f\xf3\xe3\xaa\x86\x29\xc8\x92\x55\x39\xd2\x33\x5c\x20\x19\x92\xc8\x3b\x7f\xcf\xbd\x4b\xb5\xa7\x51\xa9\x4c\xa5\x7e\x57\x61\xe2\x9e\xbd\x09\xab\x82\x29\x94\xac\xa0\xbd\x5e\x2d\x1f\xf8\x55\xa3\x80\xd2\x58\xf1\x34\xc1\xbc\x58\x11\xf8\x1e\xe5\x68\xb1\x5a\xbc\x13\x15\xd3\x5b\x9e\xe7\xa0\xd1\xb2\x42\x4a\xcb\x83\xa5\x54\xff\xc0\x71\x5a\x3f\x90\x0b\x30\x69\x7f\x98\xd3\xed\xd5\x0d\xbf\x33\x0a\xcb\xae\xc6\x79\xb1\x24\xa8\x62\x97\x68\x50\xf4\xca\x6c\xb5\x5d\x61\x10\x18\xdf\x0b\xf2\x5a\x0c\xcf\xcc\x61\x8d\x09\x3c\xe7\xf0\xd8\x5e\xa8\x38\x61\x75\xc3\x76\x14\xc2\x73\x05\x93\x87\x58\x52\xb2\xc6\xfa\xd6\xb0\xb9\x1b\x95\x54\x07\x89\x05\x7d\xf3\x3e\xa0\x78\xf8\x4a\x20\x1f\xce\x7e\x59\xfe\xf0\xfd\xed\xc7\x5d\x29\x1e\xc2\xcb\x4b\x1d\x64\x36\x1c\x4c\xe3\x87\xc8\x79\x76\xb1\xee\x93\xa6\xf1\xeb\xf1\xb3\x37\x7b\x47\x77\x3f\xe9\x22\x58\x35\x22\x55\x12\xaa\x11\x42\x23\xaa\xb1\x19\xd0\x6f\x46\xdc\x5c\xb5\x47\x2a\xe0\xb7\x46\xd4\xa4\x12\x93\xa7\x14\x10\x52\x94\x87\xb7\xab\xc5\x32\xa0\xb8\xfb\x82\x60\x49\x20\xd6\x60\xe1\xea\xb1\xd4\xd5\x56\xdb\x06\xaa\xe3\x51\xb9\x46\xcd\x32\x9f\x93\x15\x35\x35\xa6\x8b\xfb\x25\x0c\xfe\xfc\xdb\xed\x3f\xff\x36\xa0\x38\xa8\xc9\x28\xa7\xb5\xdd\x36\x21\xcd\x90\xd6\x0c\x01\x66\xda\x0b\xc7\x86\x65\xc0\xeb\xc3\xc5\x8d\x60\xd4\xcd\x6e\x05\x6e\x11\xe2\x0a\xd8\xd3\xde\x00\x2f\x7f\xda\x49\xfe\x70\x94\xbf\xb5\xe1\xca\xd4\xd6\xf6\x25\x98\x41\x01\xff\xc4\x14\x64\x38\x35\xcb\x63\x29\xd0\x8a\xa5\x42\x2e\x38\xa8\xed\x26\x50\xf7\xce\xc9\x35\xa8\x43\xc5\xaa\xcc\xad\x99\x57\x66\x3d\xda\x0c\x2c\x0b\x98\xb2\xb5\x18\xf8\x86\xcd\x9b\xfc\x46\xeb\x9a\xfc\x6c\xc9\xaa\x76\x0b\x9a\x23\x4d\xa9\x31\xa3\xf2\x56\xd0\x81\x13\xe2\x6f\xb6\xf3\x0b\xe5\xa9\xd7\x0e\x14\x28\x55\xb0\x47\x2a\xda\x39\xad\x62\x95\xa9\x82\x83\xe3\x9d\xcf\xf1\xed\x47\x76\x43\x71\x64\xc3\x6a\xb7\xcf\x9a\x29\x70\x9e\x75\x66\xbd\x8d\xb5\x61\x39\xb0\x90\xeb\xff\xf8\x30\x6c\x29\x64\x1a\xef\x59\x26\x70\x2a\x71\xca\x39\x74\xc6\x7f\x05\xa7\x0a\x70\xb9\x63\x78\x6d\x85\xed\x54\x3c\x51\x3e\xf4\x26\x9e\x68\x63\x90\x35\x64\x84\x2b\x75\xce\xe2\xed\xc9\x57\xd5\x55\xfe\x16\xa5\x6d\x09\x81\x81\x35\xe9\xd2\xc5\x44\x9d\x53\xdd\x54\x72\x9e\x61\x3f\x1a\xb2\xf6\x3f\x61\x72\x9d\x61\x90\x7a\x6d\xbb\x5e\x6b\xe3\xb1\x2e\x35\x49\xf7\x6d\x51\x1f\x66\xb0\x07\x33\xd1\xf7\x09\xde\xe0\xff\x19\x05\xaf\xec\xe6\x23\x07\x99\x1b\x81\xb8\x21\x48\x12\xb8\xa4\x01\x81\x09\x5e\x2c\x60\x9e\x02\xfd\xb2\x66\x94\xef\xf3\x62\xce\x9e\x64\x28\x6f\x35\x0b\x9e\x41\xdd\x97\x14\x01\xab\x9f\x5b\x36\x6e\x0c\xa1\x3d\x61\xd9\x97\xf7\x3a\x23\x3e\x6b\x86\x2c\xb7\xdd\x02\xe5\xd6\xf4\x9a\xf2\xbf\x37\x39\x85\x33\x6e\x2f\x2b\xbe\x06\xee\x4c\x0a\x34\x60\x45\xce\x29\x26\x60\x06\x87\xf1\xe7\x30\xc2\xbb\xcc\xfa\xd9\xaa\xa0\x90\x7c\x15\xa4\x16\x75\xbc\xfb\x93\xfb\x98\xb7\x5c\x87\xdc\x0f\x31\xa1\x02\x92\x1b\x48\x86\x4c\xe8\x9c\xb7\x7c\x6a\x13\xa2\x78\x89\x33\x3c\xbb\x1f\x30\xa3\x0b\xd1\xf4\x09\x6c\x89\x13\x38\x59\xcd\x66\x28\x9f\x7d\x0d\x9b\xa2\xae\x83\x34\x84\x8f\xea\x72\x50\x6b\xf1\x52\xb7\xfe\xec\xd2\x88\xa5\xf3\xae\xe4\xe6\x16\x38\xc5\x29\xc6\x54\x75\x62\x89\x1b\x8d\xf2\xb5\x93\xd6\xf5\xa5\xa1\x2e\x19\xe9\x20\xfd\x4d\xf3\x00\xf4\x19\xf1\x20\x1a\xad\x97\xab\xc4\xed\x2f\xfa\x35\xd7\x96\x1d\xe9\xf2\xe0\xb4\x74\x6d\x5e\x74\xe3\x09\x48\xae\x53\x82\x97\xde\xf7\xd1\xcd\xdd\x21\x7d\xb3\x25\xdc\xee\x24\xcd\x89\xd4\x74\x0b\xd5\xde\xa6\x04\xe4\x43\xdd\x44\xb5\xf9\x64\xa3\x66\x19\x73\x2e\x4f\xdb\x32\x73\xfd\xfd\xc5\xdd\x9b\xdd\xc5\xc8\x1d\x96\xbb\xd3\x58\x1e\xfe\x7d\x78\x83\xe0\xed\x4b\xcc\xa2\x0d\x83\x9d\x60\xb4\xc3\xfe\x97\x3f\xde\x2d\x32\x26\xd9\xe6\x94\x2e\xbf\xd9\xde\xbe\xbd\xbd\xdd\xba\xdd\xdd\xc2\x64\xb6\x3d\xde\xd9\xd9\xd9\x2e\xbb\x77\xfe\xc8\xda\x6e\xdb\xb7\x84\x1e\xf9\xe8\x17\xeb\x28\xbf\xaa\x43\x1d\x1d\xb5\x72\xbc\xde\xb0\x37\x7e\xf0\x57\x1c\xee\x0d\x7f\x85\x55\x5e\x0d\x2b\x19\xa7\x2f\xfb\x46\x37\x89\x92\xe8\xf4\xc4\x37\xc8\x1f\x9e\x5f\x1f\xd2\xbb\x97\x3f\x1a\x1b\xa4\x19\xd7\xc2\xc3\x76\xd7\x0d\xf3\xa8\x09\x13\xcb\xfc\x4a\xfb\x2e\x50\xa2\xe4\x59\x6a\x65\x73\x1c\xfb\x51\xc8\xb2\x2d\x1b\x21\x80\x2c\xc3\x82\xaa\x66\xf9\xf2\x7d\x66\x7d\x08\x2d\x31\xd9\xf6\x9c\x38\x31\x32\x0c\xd2\xd6\x03\x83\x43\xb9\xbf\x29\x67\xf3\x1e\x52\xd0\x71\x5e\xd8\x0e\xb8\x70\x8a\x66\x09\x58\x56\xb1\x10\x26\xa5\xd4\xdf\x2c\xb4\x1a\xb5\xb4\xd1\x42\x39\xed\x36\xdf\x82\x12\xcc\xb3\x6d\x8d\xf0\x61\x83\x1a\x4e\x4b\x84\x0a\xaf\x2a\xe1\x21\x6d\x29\x0d\xce\x7c\x7f\xb5\x06\xde\xef\x74\xfd\xa6\x82\x9b\x64\x3f\x2e\xef\x82\xff\xf7\xff\x36\x34\x20\x2d\x67\xa2\x7c\xc4\xd4\xe9\x24\x58\x1b\x7b\x6f\x24\x5b\x5b\x50\x63\x8a\x36\xb4\x18\x16\xd8\x3d\x50\x55\xd2\xdc\x30\x98\xa8\x9a\x01\xd7\x13\x58\xee\xa4\x06\xc8\xd2\x4f\x92\xd5\xeb\xbe\x51\x29\xf6\x19\x4f\x62\x7e\xbb\x8d\x45\x91\x54\xc2\x2a\x0c\x3d\x69\x81\x76\xf6\xfe\xe7\xbd\x8f\xaf\xde\xdc\x99\x35\xb7\x38\xcc\x14\x0f\x08\xb3\x4e\xcc\x52\x8b\x9f\xd7\xc6\xd8\x69\x29\xc1\x34\x52\x6a\x4e\x94\xb4\x09\x73\x9e\x97\xde\x5a\x4f\x49\xee\xbc\x0e\x78\x2b\x25\x82\x4d\x8d\xc9\xbe\xb2\x65\xa3\xb9\xd3\xcf\x1c\x69\x67\x5e\xa9\x66\xb6\xb9\x45\xae\x6a\xc4\x83\xe1\x9f\x50\x11\x8f\x77\x76\x96\x77\xe5\x02\x50\xb2\xca\x13\xc0\xc1\xd7\x1c\x22\xcb\x3e\xa8\x26\x7e\x71\xd7\xbb\x9d\x7e\x11\xde\xaf\xe0\x31\xb4\x70\xe1\x67\x38\xeb\x02\x8a\x3c\x2f\xf5\xdb\x7d\xa3\x3a\x29\x4b\x8d\xb1\x38\x97\x2d\xaf\xae\xc4\x91\xfd\x7a\xa8\x8b\xb3\x7d\xbf\xbe\xbc\xae\x80\xea\x94\x63\x7f\xe4\x7e\x4f\xf2\x2e\x70\x8a\xa6\xf7\x5f\x84\xbc\xda\xab\xd7\x24\xaf\xb5\xaf\xc7\x20\xaf\xdc\x39\x38\x87\xb1\x89\xd0\xa0\x1f\xf0\xa3\x2b\xd3\x9b\x8b\x49\x5c\xdc\x02\x9a\xcc\x95\xcc\xaf\xcf\x78\x72\xce\x44\xa1\x25\xfb\xcb\x62\x42\xa9\x8f\xdf\xd5\x02\xe4\xe8\x57\x98\xbe\x95\x1d\xf4\xdb\x85\x3c\xbd\xab\x92\x4c\x71\xb1\x5a\x94\x62\x2e\x70\x4f\xcd\x3c\xdf\x99\xef\xef\x04\x15\xcb\x0c\xdc\xd7\xd5\x11\xcf\x79\x3f\x0e\xe6\xaa\xad\x15\x28\x2f\x5f\x11\xdb\x73\x2b\x4d\xd3\xd7\x81\x15\x70\xf0\xb8\x72\xf8\x32\x00\x93\x53\x40\x48\x5d\xfa\x4c\x17\xbc\xf5\xa3\x57\x57\x2c\x9c\xcf\x13\xbb\xd8\x51\x5f\x5e\x9b\x48\xd3\x8c\xd4\x7c\xbf\xa0\xca\x99\x1a\x22\xd3\x50\xee\xda\xf8\xb0\xd6\x68\x6c\xb5\xd9\x99\x4a\xc3\x0a\xad\xd7\x16\x0c\x8e\xb6\xc9\x75\x9b\x05\xce\xe9\xbc\x81\x31\x17\xe7\x6c\x2b\xa9\x4c\xc0\x0f\xe5\x09\xe8\x1b\x95\x62\x3d\xd8\x37\xae\x13\xa5\x70\x99\xe1\x7b\x36\xfe\x14\x52\x80\xb2\x27\x5f\x9c\xe2\xbb\x6f\xf7\xf7\x76\xde\xa6\x89\xa6\x14\x1d\x46\x63\xad\x2a\xb8\x64\x6d\x9e\x79\x58\x4e\xa4\x2a\x25\x58\x68\xeb\xc3\x41\xad\xf7\x85\x22\x55\x53\x63\x5b\x21\x4c\xd5\xc9\x8e\x02\x24\x2c\x7f\x0d\x2b\xed\x89\x31\x9a\xa5\xa7\xba\x1c\xdd\xe0\x2e\x94\xc1\xa8\x43\xef\xee\xcd\x12\xbb\xf9\x42\x79\xd4\x5a\xe5\x4b\x02\xa3\xcc\x41\x31\x17\x79\x91\x12\x49\xa8\x2f\xff\x36\xb9\xeb\x01\x19\xf8\xa9\x33\xee\xeb\xfd\x57\xf7\x8b\x0f\x70\xbf\xa5\xc2\xb6\x89\xe6\x57\xe1\xef\x04\x42\xb6\xb3\x51\xa2\x8a\x71\x9d\x57\x68\x5d\x68\x6a\x2b\xae\xab\xbc\x96\xe3\xcc\x38\x64\x27\xab\xc5\x12\x12\x1e\xe2\x45\xc1\x4c\x39\x67\xf5\x6e\x5d\x27\x6e\xdb\xe3\x5d\xc5\xbc\xb5\x26\xa2\x0e\x56\x71\x46\xf0\x02\x9b\x80\x93\x16\x5d\x4b\x1d\xf8\x04\xa4\x1c\x42\xea\x16\x90\x1c\xe5\x33\x3b\x9a\xd4\x47\xf1\x86\x40\x79\x85\xdf\x3d\xd9\x0b\x48\xd1\x3a\xca\x25\x40\x2c\x5b\xc6\xed\x37\x69\x2a\x91\x90\x68\x89\x45\x3f\x4a\x3f\x89\x4f\x5c\xd7\x1c\x14\x31\x5c\x2c\xe7\xa0\x40\x1a\x0b\xfd\x26\x74\x2f\x96\x74\xc4\x44\x61\xbe\x2a\x77\x95\x15\x32\xd7\x6a\x02\xf9\xbf\xda\xbc\x45\xbe\x6a\xaf\x9a\x1e\xe0\x18\x57\xb1\x9a\x2c\x10\xf5\xd3\x83\x4d\x4d\x78\x3c\xb0\xfb\x0d\xf9\xed\xaa\xaf\xb4\x62\xda\x63\x1b\x0a\x97\x02\x63\x18\xe8\x5c\x66\xaf\x94\xad\x80\x73\xa9\x57\x08\xe9\x58\xe2\x8b\xed\xbc\xdf\x4b\x7d\xc0\x18\xae\x5d\x8b\x72\x6c\x60\x67\x75\xeb\x9e\xb8\xf3\xa1\xd5\x65\xdb\x3c\xf4\x8c\x35\xf4\xb3\x0d\xd4\x45\x03\xe4\x49\x7f\xe5\x11\xcd\x58\xb7\x52\x54\x8b\x7e\x0d\x81\x5e\x00\xbd\x2b\xef\x79\xd4\x95\x99\x67\xd4\xea\x4d\x1b\x40\xf1\x76\x60\x64\xa9\xb4\x4a\x43\x9e\x88\x62\x35\xb5\x90\x4a\x41\x5c\x47\x0f\x78\xc0\xf3\xdf\xa9\x25\x3d\x6d\xb5\xe0\xed\xee\xc1\xf3\x6f\xff\x98\x9b\xc5\xd6\x1c\x1b\xc4\x75\xea\xf7\x2c\x6f\xa3\x94\xde\x6f\xbd\xda\xb6\x6d\x53\x13\x6d\xd3\x13\xdd\xbe\x2e\x3b\xa3\x15\x95\xb1\xec\x07\xf3\xb3\xe7\x46\x1e\x0f\xa9\xf9\x52\x5d\xe5\xe7\x9a\x49\x22\xaf\x2e\xc0\x76\x8c\x9e\x46\x43\x41\x81\x37\x27\xd6\xd3\xc0\xf5\xf8\x05\x28\xae\x03\x51\x2c\xbc\x47\xb3\x63\xc6\x56\x76\x90\x5f\x57\x9b\xba\xca\x4a\x8f\x46\xd2\x1a\xd2\xa3\x49\x9b\x52\xe2\x6a\x73\x2a\x4b\x7a\x7a\xbf\x04\x67\xab\x45\xbf\x26\xc7\x67\x9f\xfa\xd1\x0b\x2e\xb0\xf0\x39\x35\xcf\x76\x7b\x08\x8f\xce\x8a\xbd\x0b\xd1\x84\x1e\xc5\xc5\x58\xed\xf4\xbb\xea\xd8\xdb\x55\xca\xc6\xf0\x72\xfa\x2e\x63\xcc\x55\x74\xb9\x6b\x29\x82\x67\xa9\x27\xd3\x75\xce\x37\xef\x92\xcd\xf2\x24\x5a\xf9\x11\xc5\x28\xc2\x9e\x5a\xe3\x14\x71\x88\xfa\x47\x3a\x5c\x2a\x7b\xc0\xd3\x3e\x58\x7e\x3a\x3a\x7e\x37\x3b\x39\xbf\x75\x1e\x2c\xa2\xf6\x77\x60\x99\x5a\xe7\x29\x23\x82\xa2\x72\x7c\x4b\xc0\xd2\x7d\xcf\x31\x31\xa0\xb8\x1d\xa4\xed\x9a\x63\x44\x48\xf1\x66\x06\x38\xb4\xf3\x42\xc0\xf2\xe5\xd2\x63\x90\x03\xb3\x1a\x99\xf6\x58\x0a\x0b\x44\xb4\xe7\x54\x5c\xc6\xda\xcd\x1c\xfa\xbe\xb7\xd9\xa1\x3c\xf2\xae\x54\x6b\x66\xab\x65\xbe\x03\x08\x2b\xac\x3b\x6f\x93\x5e\x2d\x40\x58\x5e\x04\xe3\xfd\x06\xdb\x41\xcb\x75\xd0\x46\xbe\x21\x37\x9f\x8d\xb0\x4a\x1b\xc0\x58\x0f\xea\x32\x33\x72\xc7\xa1\x38\x88\xb6\x4c\xd3\xea\x41\xa3\x07\x99\xdd\x09\x5f\xb1\x8d\x4e\x4f\x70\xc1\x85\x00\x48\xfb\x82\x2c\xd0\x21\x2d\x9c\xf7\xfb\x39\x04\x19\x9d\xdf\x57\x2b\xa4\xef\x59\x29\x06\x36\xb6\x81\xbf\xe3\xaf\xdb\xe8\x22\x98\x53\xf8\x0a\x57\x61\x95\xb7\xaf\x43\x0a\x72\x59\xdd\x60\x23\xcb\xf0\x49\xbe\x6f\xa3\x0b\xd1\x9c\xc5\xb0\xa5\xf0\xb9\x8a\xf1\xb3\xb7\xe3\xd0\xad\x97\x43\x2b\xbd\xd3\xdb\x7a\xeb\x0a\xa3\xb0\x34\x3f\x81\x45\x42\xd0\x92\x5a\x62\xb6\xbb\x66\x69\x35\x65\xe8\xc6\x0b\x06\xc3\x3e\x5b\xcf\x0b\x61\xd1\xe2\x1e\x52\x67\xd4\x3c\x3f\x4f\x5b\x59\xfc\xf9\x97\xb3\xfb\xed\x1d\x62\xa2\x2a\x3e\xac\x15\xa2\xbe\xf6\x3e\x25\x2b\x44\x65\xce\xe3\x1e\x66\xa1\xcf\x85\xea\x62\x3e\xae\x31\x42\xde\x8e\x41\xcf\xab\xee\x29\x84\xa9\xe2\xcb\xf8\xef\x5e\x8d\x8f\x56\x14\x07\x1f\xe1\x0d\x24\xb4\x5f\x43\x3f\x3d\xd5\x7c\x9b\x90\x9a\x3d\x9a\x88\xe3\x34\x18\xd0\xb4\x3a\x02\x86\x34\x3e\x23\x78\x46\x60\x51\x04\x27\x6a\x41\x91\x47\xb4\x0d\x38\x0a\x4d\x36\x1e\x31\xc3\x27\x6a\x23\x81\x16\x62\xd6\x96\x32\xde\x16\xff\xa4\x76\xd7\xe1\x9a\x33\x3a\xae\x92\x5c\xd4\x2e\x96\xac\x29\x87\x6c\x0b\x4f\x71\x18\x85\x3f\x8b\x1b\x9c\x3b\x70\x44\xfe\x77\xba\x7d\x64\x2b\xac\xea\x3c\x73\xdb\x08\x65\x19\x1a\x58\x51\xcc\x77\x02\x1b\xdc\xcf\xac\xc8\xe0\x29\x0e\xfb\x91\xcf\x74\x37\x69\x93\x6f\xdc\x5b\x77\x34\x2f\x93\x76\x1f\x53\x1b\xfa\x5d\xc5\xbc\xd9\xc2\x72\x65\xe9\x7e\x79\xdb\x0d\xc0\xfb\xcd\x3e\xda\x93\x77\x67\x7e\xca\x58\x2b\xa3\x37\x98\x56\xab\x2a\x6a\x5a\x3d\xe4\xda\xee\x5a\xd6\x56\xec\x0d\x29\x36\x5e\xde\xeb\x2e\xc4\xe1\x58\x05\x8a\xa0\xd9\x88\x49\x6f\x98\x55\x8f\xe9\x66\x2c\x10\xbc\xf6\x2e\xad\xa5\xa2\x29\xe7\xec\x03\xea\x66\x45\x2c\xea\x7b\x3d\x71\xbd\xac\x00\xe0\x18\x2c\x0e\x97\x5a\xc9\x1c\xc3\x22\x65\xb1\x4e\xb1\xda\x98\x80\xc2\xf4\xa4\x9e\x71\x33\x94\x5b\x51\xe2\xb7\x50\x1a\x2a\x25\x54\x84\x33\x14\x08\x84\xe1\x93\xba\x28\x8f\x1e\x6d\x21\xd3\x6c\x45\x9d\xce\x05\x64\x51\x2a\x39\xa6\x2d\x91\x8e\x23\x4f\x3f\x7b\x6b\x85\xe0\x5d\x45\x61\x1b\xe2\xb4\xb7\x1f\x27\xa2\x94\x65\x50\xce\xc4\xbf\x54\xb7\x2d\x1c\xc4\x4e\x18\xcc\xd8\xa6\x55\x49\xdd\x6b\xf5\x6f\x8f\x2c\xfe\xed\x76\x80\x53\xe9\x39\xae\xdd\xc2\x04\x26\x98\xa8\xbe\x61\x08\x18\x52\x64\x4c\x09\x48\xae\x63\x59\x38\x45\xf5\x18\xa7\xbc\xfc\xb4\x11\x6f\xb5\xce\x36\x97\xfb\x6f\xf3\x5b\x1c\x4d\xa7\xf1\x14\xc1\x2c\x2d\x62\x90\xa7\x82\xe4\x4f\xfe\xfe\xf5\x7c\x6f\xf7\x97\x97\x3f\x7e\x3a\x70\xde\xbf\xd8\xbc\xe4\xc5\xc7\x96\x54\xc0\x76\x58\xb7\x64\xe0\xa4\x69\xca\x02\xc1\x74\x97\x96\x62\x7c\xb5\x29\xa1\x39\x08\x96\x6d\xa2\xe3\x51\xea\x4f\x55\x90\x24\xcd\x9a\x71\x25\x33\xf3\x82\x7b\xc6\x60\x3c\x41\xb7\x2c\xa3\x49\x60\xe6\xc2\x1c\x50\x9b\x2b\xb6\x2a\x40\xae\x39\xd4\x98\x3a\x83\xf5\x86\x1b\xea\x39\x65\xfb\xca\x4a\xb8\xfb\x8a\x42\x90\xf2\x08\x30\x3b\xe0\x4d\x10\xfc\xc1\x59\xfc\xd1\xf7\x0d\x29\xcc\x20\x6d\x7d\x47\xbc\xf6\x3b\x60\x8a\xda\x5f\xf1\x87\xed\xd8\x50\x76\x4c\xa0\x7c\x9b\x1e\xdf\xa6\x12\x55\xa7\xca\xa9\x9a\x38\xf3\x8d\x3b\x04\x7d\xe3\xcb\xe3\xcb\x9a\x81\xf6\x7d\xc2\xc1\x78\x35\xe6\x09\x8d\x19\xc1\x5b\xc5\x94\x16\x3a\xce\x9f\x87\xe0\x86\x07\x9b\xd2\x87\x2c\x7d\xb0\x29\xb5\x32\xdf\x63\xcd\x28\xf8\x1f\xff\x33\x18\xbe\x90\x03\x06\xbc\x06\x07\x69\x5b\xd0\xbe\xfb\x5a\xf5\x89\xe6\x05\xc2\xeb\x10\x92\x87\x72\xfb\x29\x64\x3d\x83\x06\x9d\x34\xe3\x3e\x27\xcd\xda\x07\x85\xf7\xdb\x3c\x24\x51\xb3\xaf\x76\x49\xd4\xef\x90\xb0\xf5\xde\x2e\x16\xfa\x1d\x10\xb6\xfe\x5b\xf7\xa8\x7a\x38\x74\x1f\x0c\x2e\x77\x4a\x65\x5f\xd3\x0e\x84\xe0\xaf\x6e\x17\x6b\x93\x91\x5a\xb4\x88\x66\x02\x95\x50\xaa\xa2\xf0\x45\xc5\xd9\x35\x01\x5e\x4b\x8d\xab\x1a\xd6\x87\x9a\xfd\x7d\x72\xa6\xca\xaf\xfe\xe6\xd4\xed\xc7\xaa\x6e\x3f\x15\xb9\x1b\xd5\x45\xa3\x5d\xc7\x4f\x70\x9e\xb0\x22\xcd\x19\xbe\x85\x24\x01\x45\x75\xa3\x67\xde\x96\x36\x7d\x7a\x80\xf2\x6f\xef\xe9\x41\x6e\x00\x4f\x5d\xdd\x27\xbf\x2e\x2e\x7e\xfc\x19\x59\xdd\x2d\xb5\xa8\x53\xb0\x80\xf8\xa4\xe4\x66\xd2\x04\x6c\xa7\x14\xd4\x5c\xaf\x5a\x3f\x0d\xf1\x64\x32\xbd\xa7\x2c\x1c\x35\x64\x61\x8f\x77\xb6\x89\xc4\xdd\x2b\x5d\xe2\xb7\x76\xd9\x26\x19\xdd\x72\xb1\xe7\x2b\xda\xc4\xa3\x5b\x38\xf6\x7c\x49\x8b\x8c\xac\x25\x64\x97\x7c\x74\x79\xd3\x1c\xfa\xc4\x04\x67\x9a\x11\xf4\x2d\x9e\x7c\xa3\xeb\x31\xca\x80\xdf\x9c\xb4\x6a\x33\x56\xb5\x60\x14\xd9\xf2\x98\x6f\x20\x99\xe0\x42\x63\xea\xb5\x88\xe5\x40\x27\xef\x29\xea\x43\x6b\xbe\x81\x53\xcc\x2b\xa3\xd3\xa5\xbd\xf2\x43\x9b\xd0\xef\xb4\x2b\x35\x55\xab\x67\x0a\x91\x9e\x59\x88\xa4\xe6\x24\xf4\x57\xb2\x84\xe4\x51\x74\xec\x61\x22\xa7\xed\xce\x3c\x58\xf3\x72\x4b\x9b\xa1\x57\x74\x1b\xc7\xf5\xbd\x03\xf6\x93\x30\xfd\x2f\x64\xfd\x84\x4b\xef\xdb\xd1\x66\x34\x2f\x6f\xe9\x52\xbb\xfe\xbf\xb1\x5c\x96\x74\x00\x0c\x9b\x7c\x51\x6c\xc9\x9f\x18\x68\x51\x03\xe8\xfb\x77\xc6\x86\x39\x54\x28\x53\x37\xb1\xec\x89\x4e\x9b\x51\xa5\xcc\x70\xb8\xa4\x38\xc1\xab\x9c\x2a\xfc\xf9\x5c\x7a\x81\x6c\xdc\xc7\x74\x40\xd3\x2b\xac\x6b\xae\xbb\x8e\xd8\xa1\x72\x0f\xd6\x9d\xb2\x5f\x7f\xdf\x2a\x2d\x0c\x89\xbb\x26\xbb\x34\x04\x76\x0b\x0c\xd2\x5a\x9a\xb5\x97\xc8\x1d\x35\x34\xeb\x51\x7f\xcd\x7a\xa8\xa0\x65\xe4\x02\xc5\x75\xb7\x1d\xb5\x43\xc0\xee\xad\x2b\x60\xf7\x7a\x09\xd8\x8d\x08\xd9\xb6\x57\xf6\x15\xb2\xcd\xbe\xd6\xb1\x83\xfa\xbe\x61\x1d\x3b\xa8\xef\x3b\x1e\xd7\x0e\x5a\x32\xa3\x21\x48\xf7\x2c\x82\x54\x17\x9e\xe5\x13\x47\xdc\x51\x68\xaf\x94\xd0\x14\xa2\xb6\xcd\xd0\xec\xc6\xbd\x25\x5a\x3c\xeb\x0d\x0b\x8f\x14\xa3\xfb\x2e\x31\xba\xef\x74\xa0\xf3\x9e\x8d\xc2\xae\xd2\x28\x71\xa0\x6c\xb5\x91\x63\x0e\x51\x98\x89\xaa\x62\x26\x8f\x4b\xf0\x35\xab\xe8\x30\x56\x73\x3f\x3a\xe8\x92\xd6\xeb\x69\xc5\xdd\x8c\xe7\xe2\xbf\x9e\xd2\x76\xaf\x21\x6d\xf7\x5a\xa5\xad\x27\x96\x3d\x7b\x6c\xaf\x0b\x78\xee\xca\x70\x60\xf2\x78\xe4\x28\x64\xe7\x6e\x18\x09\xd4\x42\x46\x07\x1e\xa6\xc7\x70\xe8\xe4\x62\x86\x51\x88\xf2\x14\xde\x99\xc9\xb0\x56\xdb\x07\x33\x7b\xb0\x68\x86\x56\x5f\xa2\xc3\x9c\x12\x97\x5f\xc7\xa8\x7c\x65\x52\x14\x71\x22\x8a\xe8\x55\x45\x8a\x52\x98\x0c\xb4\x9b\x3c\x80\x91\xa4\x58\x02\x5a\x4e\xe2\x69\x1b\x4a\xde\x16\xcf\xfe\x78\x57\xdc\x1f\x6a\xf1\x0f\xf5\x75\x14\x12\x82\x49\xd1\x9a\x5f\xae\x85\x3f\xd7\xf1\xe4\xce\xdb\x87\x16\x3d\xce\x40\x35\xcb\x56\x7b\x6a\x83\x13\x41\xbc\xe0\x55\xf9\x7a\xb7\x2e\xdc\xac\xf9\x69\x88\xd3\xb1\xe3\xa6\x5b\x4d\xab\x4b\xb9\x68\xc4\x1b\xd4\xd2\x71\x74\xd5\xb6\x8f\xdc\x9a\xbc\xaf\x8a\xc4\x41\xc3\x05\x12\xc5\x9e\x92\x3e\xfe\x1b\xf9\x0d\xce\x79\x08\x06\x0b\x82\xa2\x2b\x92\x07\x6c\x03\x36\x48\x5f\x11\x7e\x64\x10\xde\x4a\x73\x90\x07\x28\x2f\x28\xc8\x13\x18\xe0\x69\xf0\xe7\xdf\xea\x26\x5f\x1d\x3c\xef\xb7\x0e\x5b\x44\xf7\x12\x2c\x20\x05\xaf\xfb\xfb\xca\xd5\xc4\xba\x76\x47\x74\x23\x97\x0e\x15\xf1\x81\xa3\x89\xa5\x11\xb7\xf4\xba\x1e\x57\xf8\xa2\x52\xb9\x6b\x65\x8f\xeb\x93\xa1\x16\xec\x08\x39\x2b\x5f\x71\x84\x10\x0a\xef\x68\xb5\x53\x38\x35\xf7\xd9\x72\x4b\x68\x0e\xd1\x4a\x52\xdb\xa1\x6b\x2a\x43\xa9\x5e\x24\x56\x56\xea\x35\xa1\x1e\x51\x2a\xa2\xe5\xd2\x7a\x4b\xff\x1f\x1d\x27\x6d\x4b\x84\xa7\x95\xd6\xbc\x12\x6c\xe7\x78\x19\x9e\xda\x52\x14\xb1\xdb\x2f\x35\x7e\xe7\xbc\x6b\xc2\xb2\x16\x4e\xc2\x2a\xc2\x47\x36\xac\x1f\x13\x59\x26\x92\xd4\x38\xe7\x6f\x6f\x22\xd3\x5e\x35\x14\x06\xbd\x79\xa5\xa6\xd4\x89\x2b\x02\xe4\x78\xab\x7a\x48\xbc\xa4\x22\xb6\x8d\xfc\x9c\x64\x7b\x51\x28\x13\x8d\xcd\x0c\x78\x17\xdd\xc6\x3a\x4d\xe6\x30\x5b\xf6\xe5\x35\xd7\xca\x04\xdd\xec\xf2\x51\xfd\xa6\xfa\x96\x97\x7e\x65\x61\xaa\xb5\x4e\x6d\xe9\xfe\x3d\xa4\x20\x38\x03\x04\x2c\x1c\xef\xd6\x11\x86\x24\xaa\x50\x85\xce\xd2\x5e\xfd\xc0\x64\xb0\x04\xa7\x66\x62\xd1\xae\x2e\xc2\xec\x5c\xdd\xc1\xf4\xdd\x3b\x62\xbd\xa0\x53\xdb\x09\xb1\xeb\x30\x6a\x36\x42\x88\xb4\x0c\x0e\xa3\xe0\xc1\x12\xdc\x67\x18\xa4\xdf\x81\xe2\x95\x7b\xd3\x74\xe4\x19\x7b\x25\x9e\x04\xc1\x19\x7f\x95\xca\x4f\xca\x08\x3e\xf6\x90\x42\x6e\xe3\x14\xc3\x94\x04\x85\x78\x55\x27\x7c\xe3\x80\xdc\x96\xc0\xd4\xe4\x19\xc8\xae\x5e\x78\x50\xce\xb4\x86\x0e\x93\xb8\xbb\x4c\x1c\x70\x53\x18\xab\x19\xcd\xab\xfa\x72\x9d\xbf\x5b\xea\x28\xe4\xb2\x80\x04\xd7\x95\xbd\xe4\xe5\x62\xc1\xc1\x6d\xe9\x1c\xb2\x92\xd5\x45\x42\x20\xcc\x3f\xb2\x22\x8d\xef\xc4\x50\x29\x98\x9c\xf3\xfa\x5b\x19\xca\xe1\x29\xc3\x9a\x12\x15\xca\xc0\x0d\xe0\xc9\x65\x02\x98\x0e\x59\x67\x16\x94\x97\x9f\xf2\x90\x1a\x0b\x44\xca\x7e\x66\xa0\x9e\xcb\xe3\x7b\xbe\xc3\xc5\x92\xde\xc7\xb2\xc8\x70\xc7\x09\xaf\xa9\x9f\x5a\x4b\xc6\xcc\x26\x88\xa8\xa4\xc1\x09\x2a\x78\xed\xef\xd6\xed\xad\xa6\x35\xea\x7d\x9b\xf3\x91\xfd\xa2\x22\x48\x45\xd7\xc1\x14\x93\x80\xce\x51\x11\x7c\xc6\x93\x2d\x7f\x71\xe1\x22\xf7\x95\xfd\xbe\xd7\x90\x1d\x76\x2d\xbd\xc6\xba\x1a\x19\x50\x59\x2a\x4c\xbc\xad\x50\x8a\xc2\xd3\x61\x75\x0d\xaa\xcf\xcd\x91\x01\xa5\x65\x2a\xa0\x2d\xea\xbe\x7b\x4c\xb7\x73\x24\x42\xa2\xbb\x46\x94\x94\x8a\x6d\xe6\x31\x9e\x63\xf9\x60\xef\xc4\x4a\x71\xfe\x46\xe1\x8b\xcf\x78\xc2\x4a\x93\x52\x60\xde\x8e\xed\x17\xdc\x4a\xc7\x5f\xb0\x82\xf2\xe8\xe6\x3e\x2e\xcf\xb0\x05\x12\x1d\x32\xc8\xc8\x21\x37\x5c\x4e\xda\x8d\xdf\x72\xa5\x38\x78\xda\x77\xdc\xef\x9e\xfd\x01\xbf\xfe\xfe\xc3\xb5\xe3\x8e\xbb\x04\xa4\x80\xd5\x81\xf8\x98\xf7\xdc\xb3\xf2\xcd\x5d\x97\xdc\xf1\x55\x23\x33\x5a\x1b\x71\x27\x83\x36\xec\x61\xb2\x97\x0c\xe4\x5f\x66\xda\x19\xc8\x87\xcc\x5a\x19\xef\xe0\x49\x93\xd5\x97\x99\xf3\xc7\xd5\x90\x29\x2b\xa3\xed\x37\x63\xab\x83\x40\x8d\x10\x2c\x28\x3b\x2b\x85\x3d\x93\x0d\xab\x32\x64\x2a\x4d\xd4\x1b\x7b\x31\xc7\xb7\xaf\xd8\xc3\xef\xe5\x51\x7b\x65\xed\xbb\x02\x4f\xba\x8a\xc2\x1c\xde\xba\x4d\xa5\x9d\x84\x47\xf9\x14\x5b\x0f\xf4\xcd\x98\x04\x7a\xe9\x0a\xee\x75\x05\xc1\x5b\x3c\xf1\x52\x0c\xaa\x7d\x5f\x50\x18\x60\x12\x80\x15\x9d\x63\x12\x7c\x77\xfc\xae\xfc\xf4\xf6\xfc\xc3\x29\xab\xdc\xce\xac\x3a\xc6\xbd\x82\xe2\xe0\x1e\xaf\x48\x90\xf0\x6a\x97\x5b\xc1\x51\x50\x6e\x88\xe0\x16\x65\x59\x30\x81\x41\x79\x53\x83\x05\x85\x69\x30\x81\x53\x4c\x60\x40\xe7\xb0\x54\x24\x02\x54\x18\x3d\xf1\xee\x29\x4c\x7b\xe9\x18\xad\x76\x95\x04\xe6\x14\x12\x98\x8a\xd2\xa8\x68\xb1\x5a\x74\xd2\xd6\x7d\x98\x57\xab\xee\x3a\xcb\x2d\xac\x68\x62\x6d\x3a\x8f\xf5\x0f\xd7\xa0\x15\x99\xa2\x3f\xa4\x44\x4b\x96\x92\x6f\x7a\xff\xf0\x7b\xd6\x5b\x3c\x09\x4e\x2a\xfd\xbc\x79\x3f\xe2\xea\x0e\x4f\x67\x71\xc4\x3f\xb7\xac\x44\x07\x2a\xaa\x75\x81\xf6\xae\x2c\x75\xf2\xa4\x32\xe5\xb1\x40\x56\xbd\xcb\xee\xef\x70\xcb\xd2\x35\x6f\x7d\x5d\x77\xbe\x92\xea\x8e\xfb\x5e\xa9\x01\x79\x5c\xfc\x0e\x14\x79\xc9\xb5\xc4\xbf\xe4\xf0\xf6\x44\xef\x53\xa9\xb7\xb0\x84\x89\x1a\x11\xa0\xd5\x93\x3a\xe6\x75\x64\x54\x27\xe2\xc3\x5d\x0a\xf5\xa9\xfb\x5d\x08\xbb\x94\x68\x87\x1d\x11\xe6\x8c\xf7\x40\x51\xe0\x04\x01\x59\x68\xa7\xfb\xbe\xa2\x62\x6b\x1b\x97\x16\xd3\x20\x92\xb1\x9a\x89\xa8\xf8\xb8\xca\x73\x94\xcf\xa4\x45\xa4\xbc\x9a\xf1\x8f\x57\x2e\x36\x3f\x54\xaf\xe9\x65\x37\x1a\x6f\xef\xb3\xab\x0f\xbf\x31\x46\xb6\x35\xb7\xbd\xd9\x74\xcc\xb6\xf0\x46\xc3\x69\xea\xda\x4d\x67\x6c\x68\x0f\xa5\x3b\xf0\x89\xeb\x9a\x83\xa2\x2d\x94\x2f\x57\x75\x85\x7f\xa6\x83\xbf\xdc\x07\x56\xe2\xb6\x9c\xfb\x17\xe5\xe5\x1e\x15\xec\x68\x46\x5c\xa0\x12\xbe\xfc\xd5\xbd\xdf\x38\xab\xd9\xe9\x3e\x07\x37\x30\xc0\xb9\x7e\xfe\x7f\xd5\x67\xb7\xca\x18\xff\x62\x27\x77\x0b\xdf\x78\x9e\x5d\x29\x20\xd7\x1d\xa7\xd6\x48\x85\xe2\x11\x11\xab\x2f\xaa\x98\x07\x5d\x0a\x7d\x58\x51\xe6\x08\xe1\x91\xad\x57\xc2\x4e\xb1\xbe\x18\x77\x98\xa4\xeb\xd1\x36\x24\x71\x35\x92\x29\x40\x19\x4c\x2f\xbe\xad\x11\xcb\xc2\xba\xb4\x40\x68\x94\x38\x5b\xdf\x68\x7d\x9e\xcc\x61\xba\xca\x20\x09\x52\x72\x1f\x93\xd5\xc0\xb5\x31\xd6\x24\x6c\xde\xb6\x5b\x26\x68\xc0\x0e\xa8\x5e\xd3\xd1\xd8\xb5\x62\x8d\x6e\xba\xdd\xd9\x1a\x97\xec\xaa\xa1\x29\x6a\x5f\x92\x47\x46\xf6\xc0\x93\x91\x16\x46\x65\xbc\xe1\x28\xcb\x02\x0a\x8a\xeb\x22\x28\x56\x49\x02\x8b\xa2\xd4\xb5\xee\x03\x01\x23\x0b\xd3\x2d\x8f\xc4\x7f\xa7\xd5\xdf\x72\x2d\xd5\x28\xb2\x24\x10\x2e\x96\x75\x2d\xf1\xd7\xab\x6c\x8a\xb2\x4c\x78\x1a\xba\x5b\x98\x51\x49\x6d\x67\x96\xee\x69\x51\x18\xd4\xeb\xdc\xf2\xd4\xef\x83\xe0\xac\x1e\x60\xf0\x3b\x34\x2d\x4f\x81\x20\x99\x63\x5c\xc0\xf2\x4e\x48\x56\x79\x75\x76\x44\xe5\xc1\x52\xc0\x40\x41\xec\x95\xd7\x43\xa5\xbf\x82\xe2\xe5\x12\xa6\xbf\x6f\x93\x93\xeb\x9a\xe7\x05\x7f\xa9\x58\x0b\x0e\x40\xb0\xd6\xf5\x30\x30\xca\xd9\xf9\x52\xe0\x0c\x50\xe9\x39\xea\xa8\x0e\x1f\xae\x07\x13\xa6\x9e\x78\xbd\x71\xcb\x2d\x8d\x05\xad\x9c\xd8\xe5\xee\x26\x9d\xf8\xe5\xee\xa6\xed\x18\xe6\xee\x76\x1d\x38\xe6\xee\x86\xad\x58\xe6\xee\x66\xed\x78\xe6\xee\x76\x2d\x98\xe6\x2d\x2f\x6b\xc3\x35\x6f\xa1\xa5\x13\xdb\xbc\x85\x8e\x6e\x7c\xf3\x40\x4d\x0d\x76\x68\x5b\x6b\x60\x99\x05\xfa\x66\x54\xe3\x10\x37\x02\x76\x5e\x0d\xbf\x89\x8e\x54\xfd\x64\x22\x24\x05\x9b\xd3\xcb\x1e\xe7\x86\x58\x45\x58\xad\x7b\x47\x14\x1d\xb5\xdc\x12\xdb\xde\x78\xe5\x56\x8b\x3f\xb6\xe9\x2b\x5d\xb6\x9d\x3e\x56\x1c\x02\x0b\x48\x87\x9b\x70\xda\x57\xf9\x8a\x9f\x03\x09\x5c\xc0\x9c\xbe\x06\x28\x5b\x11\x68\x05\xc7\xaa\xb3\x67\x79\x29\x64\x5e\x4c\x25\xae\x3c\x67\x75\xb9\x64\xd3\x79\x56\x7b\xd0\xa2\x70\x09\x09\x8b\xad\x63\x37\x4f\x25\x1a\xd5\xe9\x99\xab\xc6\x16\x4f\xab\xc1\x6d\x16\x7d\x9f\x5b\x52\x36\xee\xa2\x5b\xf2\x3b\xd6\x93\x76\xd0\xed\xec\xff\x4a\xb6\xcf\x4e\x8f\xbc\x4a\x0e\xa6\x80\xc1\x66\x4d\x99\xbe\xb6\x42\xaa\x51\x6d\xa4\x48\x47\xcd\x35\x21\xdb\x16\x90\x56\x4e\x98\x6a\xbf\x55\xdf\xf1\x9d\xdc\x6c\xf5\xb2\x94\xbc\x51\xf8\x4a\xf0\xd1\x05\x2f\x04\xcf\x0e\xba\xe2\x25\xbe\x2b\xff\x29\x2a\x88\x0a\x9c\x73\x85\x87\xcb\x41\xbe\x2b\xd7\x85\x9e\xa8\x28\x5a\x17\x6a\xb5\xc4\x8f\xb0\xbc\x83\x1f\xa9\x25\x75\xc2\xf7\x1c\x1c\xec\x04\x14\x1f\x61\x82\x17\x0b\x98\xa7\xd5\x6f\x6f\xf1\xe4\x98\x15\xae\xe4\x47\x6d\xfd\xf2\xe3\x39\xca\x52\x02\xd9\x5e\xac\xca\x1c\x96\x0c\xb0\xbd\x04\x84\x16\xdb\xec\x08\x51\x8a\x1a\x7e\xe6\x6e\x8b\xcb\x66\x6d\x44\xa5\x91\x70\x66\xd7\xad\xd8\x17\xd5\xed\x3d\xc4\xf9\x09\x2a\x16\x48\x57\xe9\xb4\x67\x14\xd5\x3b\xc9\x20\x20\xaf\xf4\x1f\x5d\x2f\x16\x05\xf7\xf5\xe1\x96\x3b\x38\x4f\x33\xa8\x2d\xa3\x52\x59\x5b\xfb\xd5\xd9\x75\x51\x2e\x5d\x3c\x29\xd7\xae\x27\x35\x0a\x49\xec\x9e\xed\x1a\xf2\xa3\xe8\xdd\x05\xdb\xde\x54\x2b\xc8\xf8\x10\xb4\x71\x94\xd3\xf4\x1a\x22\x61\x9c\xec\xaa\xa1\xe9\xd5\x05\x47\xc5\xeb\xd9\x28\x05\x45\x4c\xcc\x7d\xd2\xb3\x8f\x66\x3d\xd8\xa1\x6b\x9d\xc8\x6d\xd8\xd2\x50\x29\x1e\x2a\xc3\x44\x1e\xb6\x54\x68\x39\x3e\xbf\xc3\xe5\x3f\xfa\x1d\x2e\xdb\x93\xaf\x21\xcf\xe1\xe7\x57\x47\x37\xc9\x77\xf8\xa5\x7a\xc4\x1c\x36\x50\xab\x8d\x55\x72\x6b\xd8\xba\x6a\xbe\x42\x61\xc4\x4f\x09\x5f\xfd\xdc\xd2\xbe\x0a\x4b\xc8\xdb\xca\xd4\x35\x9a\x5d\x88\x70\xef\x9e\xcd\xaa\xc3\xab\x7f\xcb\xba\x5a\x76\xbf\x86\xcd\xa3\xb1\xff\x64\x9b\x95\x00\xb9\x6d\x81\x50\xc9\x3c\x25\xf7\x95\x9f\x4f\x60\x91\xc0\x3c\x15\xf6\x18\x9e\xf6\xcb\x13\xab\x9c\x2e\x2a\xe3\x65\xcd\x63\xb9\xf7\x78\xd9\x29\xde\xd6\xaa\x79\xfd\x53\xae\x4d\x8a\x6c\xf8\x8c\x27\x67\xfc\xb8\xed\x9e\xac\x14\x1e\x95\xf6\x37\x4c\x58\xf0\x7d\xfd\x20\xfa\x68\x29\x27\xc1\x02\x52\x48\xd0\xaf\x30\x8d\x99\xbc\x7c\xea\x02\x24\x7f\xfd\xdd\xb7\x7b\x67\xbf\x8c\xff\xc9\x05\x48\x39\x89\x2a\x37\x48\xa6\x62\x53\x82\x16\x0b\x98\xca\x6c\x57\xbf\xed\x63\x97\x30\x97\x97\x21\x8f\x4f\x89\x73\xb0\x80\xc5\x12\x24\xd0\x6a\xbc\x10\xf7\x57\xbd\x8e\xaf\xc3\xe2\x68\x79\xda\x2c\xe1\x6b\x98\x45\xce\x00\x81\x39\xf5\x09\xcf\xd7\x4c\x28\x0a\x8d\x08\x5e\x31\xc8\xd6\x17\x12\x86\xfa\xc5\x2f\x2b\xc8\xed\x3c\xe5\xc6\x2b\xb6\xd8\xbe\x95\x04\x5c\xb2\xf7\xa9\x3e\xde\x71\xdd\x97\x4e\x08\xbd\x45\xa4\xfc\x1a\x29\x59\x31\x3e\xd6\x4f\x31\x27\x73\x10\x91\x91\xc2\xe5\x67\x8d\x72\x18\x89\x6d\x8f\x5b\x78\xc1\x71\x63\x59\xfb\xec\x61\x8e\x0b\x4c\x12\x78\x8c\xb3\x0c\x2c\x0b\x6e\xae\x94\x13\x9e\x83\x42\x7d\xab\x3f\xeb\xfe\x2b\x9c\x54\xde\x3e\xce\x50\x47\x03\x59\x88\x23\xad\x19\x4a\xd4\xef\xec\x6b\x85\x64\x1c\xe0\x26\xe1\xb9\x45\x03\x3c\xe1\xde\x8e\x0d\x4b\x5b\xbf\xcc\x03\x7b\x58\x41\x77\xee\x81\xd1\x49\x10\x9c\x62\x9e\x40\x75\x44\x29\x41\x93\x15\x85\x66\x68\x5f\xb7\x75\xda\x37\x3f\xa1\xf1\xee\x0b\xe1\x64\x0a\x50\x11\x24\x38\x9f\xa2\xd9\x8a\xc0\x34\xb8\x45\x74\x1e\xe4\x38\x28\xd9\x22\x00\xd5\xb8\xb6\x7c\x07\xd6\xb6\x4a\xce\x8c\x86\x01\x91\x5f\xd6\xb9\x0d\xe7\x36\x91\xbe\xb1\xb6\x0f\xcd\xe1\xcf\x0f\xad\x59\x53\x6f\xcf\x3f\x9c\xda\x40\x24\x42\x2b\xb8\xf9\xe7\x82\xcf\xda\xde\x89\x0b\x50\xc0\xd6\x77\xc9\xb9\x4b\x02\x6b\xd6\x4d\x32\x14\xdf\xa2\x3c\xc5\xb7\xe5\xf8\x61\x06\x0a\xaa\xd7\xcf\xb3\xf1\xbe\x91\x8c\xd7\xe4\xb0\xfa\xb4\x32\x53\x9f\x5c\xec\xec\xc1\x50\x0d\xce\xf1\xf1\x3f\x3c\x92\x5e\xce\x22\xee\xae\x63\x8a\xeb\x1b\x3e\xb3\x6e\x97\x2b\x17\xdf\x20\x78\xcb\x92\xf2\x06\xe9\xee\x16\x05\xfb\x11\x34\xf9\xa7\xae\xc3\xff\xf1\x62\xe7\xdd\xc5\x87\x3f\xfc\xf0\x4f\xae\xc3\x77\x3b\x07\x9b\xfa\x32\x98\x95\x5b\x79\x8e\xb3\x4c\x75\x6b\x1b\x32\x4f\x59\xea\x76\x6f\x9e\xa7\x5a\xf8\x05\x8c\x10\xb5\x89\xdc\x5f\x2b\x8b\xc2\x17\xc9\x8a\x94\xca\xf3\x99\x38\xe6\x35\x25\x4d\x62\xe5\xf8\xe9\x6a\x5f\xc0\x24\xd0\x18\xff\xa6\x2c\x04\xda\xe6\x7f\x30\xf9\x52\x39\x2e\x9e\xb6\x70\x79\xfb\xf2\xe8\xe2\x39\x3a\xe9\x29\x5c\x1a\x31\xb7\xe5\x51\xa9\xea\x2c\x6c\x7b\xb6\x96\x05\x3c\x8c\xc6\x96\x6e\xcc\x9c\x44\xb7\x91\xb9\xa4\x75\xb1\x9a\xe4\xe0\x26\x8c\x84\xc5\x79\x38\x3f\x88\xc5\x7a\x48\x66\xa8\xcd\xeb\x4f\x9b\x21\x4e\xfe\xf4\xf6\xf8\xd7\x3f\x4c\xfe\xe4\x57\xf2\xd1\xae\x6d\xbe\xc5\x93\xe0\x1d\x58\xe5\xc9\x9c\xe9\xfa\x86\x5e\xc8\x97\x54\x3f\x82\xaf\xcc\x14\x2e\x01\x77\x27\xd0\x5d\x24\xff\x35\xad\x0e\x75\x87\xca\x4f\xc2\xd2\xa0\x2b\x4f\x9c\xab\xc7\x22\x33\xc2\x96\x1b\xec\x4a\x19\xb9\x52\x6c\x27\xaa\xa5\x64\xab\xce\x13\xee\x34\x6c\x54\x40\x35\x6f\x95\x68\x69\x87\xd0\xb4\xe7\x9c\xb7\x04\x45\x54\xb9\xd8\x5d\x73\x09\x28\xc6\x19\x45\xcb\x60\xb1\xca\x28\xaa\x6e\x6e\x66\xa2\xc8\xcf\x78\x15\xa4\x38\xff\xc7\xdf\xff\x37\xe5\x61\xdc\x4b\x48\x16\xa8\x28\x10\xce\x03\x8a\x03\x75\x59\x0a\xd9\x41\x1d\x12\x12\x8a\xaf\xac\x41\x16\xdd\x24\xb1\x2a\xc2\x7a\x64\xcd\xae\x29\x7b\xda\x42\x77\xf9\x8d\xc5\x88\x8f\xc1\x84\xc2\xb4\x3a\x55\x95\x08\x4a\x5e\x50\x58\xc9\xb3\x71\xc1\x17\xda\x7b\x6a\xe4\x0b\x70\xae\xdb\xb5\x86\x14\x16\x3c\x81\xe5\xc5\x52\x39\x9f\x1d\x7d\x56\xd7\x8b\x19\x64\x69\x2f\xaa\x73\x5a\x3d\x24\x3b\x4d\x6c\xf6\x5b\x97\x32\xa6\xee\x43\xd9\xac\x8c\x9a\xa1\x82\xaa\x03\xd2\xba\x30\xbe\x57\xaf\x16\x57\x51\x58\xde\xc3\xe3\x29\xc6\xd4\x63\x07\x85\xeb\x86\x45\xea\x1d\x94\xa3\x89\x27\xba\x51\x6e\x49\x30\x0b\x55\x94\xb6\x46\x1f\x6b\x65\x79\xd4\x74\x58\x23\x4d\x96\xb9\x2f\x28\x5c\xf0\x1a\x6a\xab\x2c\x3d\x9f\xe3\xdb\x53\x29\xbb\xac\x70\x8b\xbd\x87\xce\xba\xda\xea\x31\x09\x3e\x0d\xd6\xac\x71\x63\x75\x89\xa8\xdc\x00\xf1\xeb\x39\x4e\xb3\xa8\x5b\xe7\x18\xcf\x65\x02\x68\x70\x64\xda\xc0\x7d\x83\x11\xdb\x07\x24\xcd\xad\x5e\x83\x61\x0f\x3f\xc4\x30\xa8\xc4\x7d\xed\x1e\xc4\xc5\xfd\xb2\x8b\xf5\x06\x0d\x61\x49\x10\x26\x48\x6c\xde\xee\x61\x9c\x89\xc7\x7b\x0d\xa5\x19\x72\x6a\xf4\xaa\x14\x80\xd6\xda\xb5\x24\x2d\x99\xe1\xce\xbb\x2d\xdd\x8b\xab\x98\x9f\x55\xaf\xcd\xbd\xe0\x08\x75\x2d\x09\x7a\x0d\xb9\x67\x85\x39\x5b\xb6\x50\xbf\xe8\x6f\x1d\x82\x93\xab\x38\xed\x31\xaf\xdc\x21\xe9\x8a\x7a\x75\xc6\xbc\xb6\x47\xbc\xaa\x9a\x1f\xaf\x2d\xc4\xc5\x75\x8f\x32\x28\x38\x3f\xae\xaa\x25\x35\xb0\xe9\x8d\x40\xcd\x33\x30\x43\x39\x30\xd2\x05\x9d\x33\xe2\xab\x5e\x5e\x01\xae\x6a\x87\x5b\xdd\x81\xaf\x3d\xbc\x6e\x13\xe7\x75\x22\x69\x9b\x51\xbc\xf2\x2b\x14\xb4\x54\xee\x8f\xa8\xcb\xe0\xf7\x8f\xbf\xff\xaf\xd6\xf6\x30\x4f\x5b\x5a\xe3\xa9\xb3\x71\xbb\x16\xe3\x6f\xb2\x56\x99\x98\xb9\xdb\x08\xbc\xd1\x98\xb8\x3a\xee\x55\x32\x95\x4f\x21\xec\x2d\x2d\xc5\xb0\x45\x91\xce\xc3\xb2\xb3\x64\x0e\x6f\x08\xce\xe3\x0c\x4e\xa9\x0a\x6b\x33\x28\xd0\xbc\x1c\x78\x2e\xb0\x1b\xda\x07\x2e\x9f\x5a\x6f\xd0\x32\x95\x7c\xe8\xa8\x15\x10\x50\x93\x01\xb9\x32\xe5\x4e\xd0\x70\x9b\xec\x2d\xd6\xac\x51\xc7\xdd\xa2\xb1\x13\xba\x3d\x43\x72\xf8\x83\x7d\x42\xa7\xd8\xbc\x1e\x76\x4d\x6c\x90\xfb\xe7\x14\x07\x04\x2e\x00\x62\x69\xaa\x19\xba\x29\xff\xfa\x8c\x27\x41\x26\xde\xbb\xd5\x3f\xb0\x9f\x7f\xc9\x18\xca\x1d\xe3\x9d\xb0\x04\xe9\xda\x42\xce\xa2\xad\x15\xa1\x64\xc4\x5f\x7f\xc6\x13\x16\x78\xcd\x78\x00\xc6\xe5\x8d\x20\x2e\x60\x06\x13\xaa\x06\x85\xdf\xc5\x28\x61\x12\x71\x0d\xfb\x86\xb4\x3f\x3c\xa4\x8d\xc3\x1a\xd0\xf8\xb4\xcd\x1d\xd9\x61\xba\xf3\xf3\x04\xbe\x32\x51\x96\x54\x33\x04\x48\x12\xb8\xa4\x81\x39\x33\x35\x83\x7c\x6c\x05\xe4\xde\x55\x6e\x49\x7a\x6b\xae\x7e\x20\xe8\x07\x23\x6b\xb9\xb0\x49\x4b\xb2\x28\x28\x66\xf7\x8c\x8d\xf5\x8c\xc7\x2a\x65\x41\xa8\x13\x75\x27\x16\x16\xb6\x27\x14\xa4\x80\x85\xcb\x2a\x33\x89\x41\x92\x60\x92\xa2\x75\xf9\xd3\xc2\x3b\x0f\xc9\xaa\x22\x3e\xfc\x69\x33\xe7\xee\xf5\xb7\x6f\x0e\xc9\xc7\xbb\x36\x98\x6b\x0b\x52\x41\x43\xac\xf7\x45\x86\xf2\xc3\x29\x70\x3c\xdc\xa2\x1b\x7a\x61\x14\x58\x67\x17\x69\x00\xc1\xce\xf8\x08\x0b\x18\x95\xd1\x4d\x0a\x39\x36\x88\xd4\x30\xbd\x0e\x53\xe7\x5c\xfb\x21\x11\x78\x18\xf2\xea\x85\xb1\xa5\x37\x8d\x6c\x20\x35\x55\x1e\xc3\x3a\x60\x04\xdd\x87\xa0\xeb\x54\xac\x05\x8c\x2e\x45\xc4\xe1\xb5\x96\x4c\x60\x6b\xf7\x90\x52\xa0\x25\x7a\xfe\x69\x4b\x86\xf1\xf6\x77\x7b\xb3\x9f\x7f\xc8\x1d\x92\x41\xe6\x55\x98\x91\x64\x9a\x88\x68\x86\x07\xd6\x66\xc0\xf2\xea\x1a\x85\x2f\xd8\xf5\xe6\xd5\xdd\x12\xe4\xa9\xc0\x04\xca\x2f\x58\xe6\x9a\x7a\x97\x1b\x1b\xa6\x78\xa5\xea\x04\x52\x32\x04\x51\x51\x75\x74\x75\x65\x05\xb0\x96\x46\x4e\x48\x0a\x6e\x52\xac\x2f\x80\x0e\x7d\x3d\x6c\xd6\xca\x08\x09\x04\x69\xc0\x17\xd5\x5a\x67\x45\xbf\x36\x68\x76\xc4\x92\x06\x7c\xd3\xbc\x93\xf8\xe8\x6a\xcd\x33\x54\x7c\x58\x72\x7b\x6c\xb9\xfd\x59\xe4\x5e\x79\x50\xb2\x59\x85\x1e\xc1\x8d\xbd\xa4\x6b\x87\xd4\x11\x92\x26\xc8\xf1\x2d\x01\xcb\x96\xfb\x6a\xa9\x6c\xf3\xf5\x0f\x50\x1e\x70\x7e\xb0\x07\x59\x19\xb5\x7f\x38\x8c\x75\x6d\x37\x37\x28\x50\xc1\x97\xf2\xb4\x52\xe1\x29\xb9\x72\x0f\xc4\xbc\xbd\x7e\xd6\xa3\x2b\x59\x52\x24\x05\xd9\x29\x4e\x85\x56\xd4\x27\x7e\xc6\x16\x1c\xe0\xe5\xea\x38\x9a\xcd\xd8\x36\x0b\xf8\xfe\x0f\xf0\x94\xe1\xd9\xfc\xb6\xd0\xf0\x08\x50\x1e\x94\xfa\x90\x60\xab\xad\x16\x72\x9b\xf7\xc6\x7d\x56\x30\x29\x9f\xe2\x38\x41\x24\xc9\x60\x8c\x57\x54\x0e\xe6\x32\xac\xef\xa8\x35\x4a\xf8\xda\xa1\x43\x75\x89\x1b\x73\xd5\x5c\xa6\xe5\x3e\x58\x43\xd6\x36\x28\x2f\xe7\x14\x27\x73\x40\x68\x30\x59\x2d\x96\x90\xc8\x9b\x7d\x17\x6c\x3b\x97\x42\xcf\x34\x7b\xd1\x79\x86\x12\x78\xcc\xcf\xbe\xca\xf6\xd5\xe4\x97\x17\xa8\x38\xad\x10\x0d\x5a\x04\x8a\xd6\x61\x13\x8e\x4c\xe4\x8a\xbb\xf8\xf2\xea\x4a\x80\x84\xd9\xad\x50\x7e\x8c\xd9\x85\x09\xe7\xec\xc3\x65\x4a\xd0\xa5\x58\xef\x2c\x7b\x8d\xf2\xd2\x21\x5a\x2c\x33\x44\x59\x08\x97\xf4\x79\x7a\x2e\xc5\xc3\x92\xdf\xd7\x6a\x5a\xaa\x56\x58\xb1\xaa\x64\x70\x06\x73\xd3\x39\x1d\xea\x75\x3e\x9e\x5f\x35\x2b\x4b\x8d\x23\x91\xae\xeb\x87\x4c\xa3\xbe\x5e\x94\x5b\xa9\x8b\x56\x09\x23\x2d\xdb\xe7\x22\x11\x81\x0d\xc3\xb2\x19\x2a\x6c\x21\xa9\xec\xed\x28\x56\x5e\x51\xaf\xa3\x2e\x16\x5d\xaa\x57\x37\xf0\x04\xd0\xd5\x22\xac\xca\x79\x28\x07\x6f\x11\xf3\x27\xc2\x61\xef\x93\x35\x21\x64\x14\x08\xef\x92\x59\x5f\xb8\xc0\x67\x9a\xa9\x00\x68\x74\x78\x48\xcd\x6a\x5a\xf6\x7e\x6d\xe4\xd4\x39\x74\x34\xee\x99\xc1\xb0\xc5\xc5\x74\x11\xda\x78\x8c\x51\x93\x71\xc6\x3b\x94\x97\x4c\xcd\xda\xb3\x28\x31\x5f\x66\xb3\x0e\x52\x75\xf1\xa6\x62\x59\x5e\xc8\x12\x53\xdd\xf1\xf1\x66\xbf\x3e\x81\x01\x9b\x1f\x89\x25\xee\x54\x63\x71\xb3\xbc\x43\x64\x56\xe9\x72\x3c\xad\xcd\xcb\xee\x6b\xf0\x8d\x84\xf8\xb7\xea\xd6\x58\x95\x7f\x6b\x3d\x5d\xe6\xf1\x07\x3b\x43\x1f\xad\xa2\x83\x19\x75\x80\x69\x70\xc4\x60\x98\xb5\xb0\xd6\x6e\x92\x0d\xce\xa5\xf8\x19\xaf\x88\x65\x71\x9c\x22\xfa\x8a\x83\x54\x50\x94\xcf\x8a\x2d\x8a\xaf\x61\xee\xeb\x2d\x0a\x82\xa3\xe3\x77\x01\x6b\xd2\x19\x8c\xa0\xfe\x9a\x62\x58\x04\x39\xa6\xc1\x92\xe0\x1b\x94\x36\x23\x19\x3c\x23\xfa\x73\x9c\xc2\x6f\xca\x5b\xa4\xff\xe5\xa3\x8e\x8f\xda\xda\x20\x97\x1a\xd2\xb8\xc5\xa5\x53\x59\x76\x41\x18\x85\x4c\x0b\x67\xb6\x5a\x2e\xfb\xad\x75\x0e\x99\x17\xa2\x36\xdd\x96\xf2\xc1\x28\xe6\xc0\xcd\xc0\xc2\xf5\xa0\x94\x2b\x6c\xda\x4c\x26\x80\x38\x0d\xc6\x0c\xf3\x66\x46\x35\x9f\x88\x1d\x9c\x22\xe6\xa7\x72\x8c\x28\x5c\xac\x67\x36\x72\x5a\x75\x1e\xd2\x94\x64\xc1\xb9\x78\xda\x26\xa4\xfd\x97\xd3\x93\x9b\x9f\x5f\x16\xad\x26\xa4\xcc\x04\x81\x71\x98\x99\xfd\x2a\x39\x39\xfa\xb4\xc0\x54\x71\x40\xd6\x4d\x96\x76\xea\x68\x47\x9c\x09\x04\xe2\x64\xeb\x3f\x8d\x23\xae\x80\x4b\x24\x9d\x50\x6e\xe4\xba\x49\xf3\x30\xb1\xda\x60\xa4\xa9\x65\x30\x35\x8b\xd5\x84\xe7\x46\x87\xfa\xe5\x5c\x21\x6f\x67\xa7\xc5\x1c\x13\xfa\x26\x6d\x18\xcd\x43\x5b\x70\xaf\xa5\xfd\x8d\x40\xca\x8b\x1a\x91\x5f\x16\xcd\x51\x4b\xa1\xae\xa3\x57\x79\xcb\x98\xa2\x05\x94\x91\xac\xd2\x56\xae\xaa\x37\x5a\xbd\xe0\x51\x23\x50\xd8\x7f\x70\x95\xfd\xd1\x7d\x5c\xe8\x7a\x8f\x69\x0a\x1d\xf2\x32\x0f\x0b\x8f\x57\x15\xdd\x4d\xb0\x7d\x83\x21\x45\xc6\x8d\x50\xe7\xd2\x20\xf4\x60\x1c\x26\x82\x8f\xb9\xce\xd7\x42\xcb\x86\x75\xb0\xad\x3b\x9b\x81\xb0\xed\xb0\xd5\xc2\x7d\xf4\x6a\x00\xce\xd0\x5e\xbf\xfd\xe5\x0e\xd6\xd4\xc3\x7e\x99\xd2\x0b\xb9\xd9\x2a\xcd\xe0\x05\xbc\xa3\x2c\xa2\x8b\x81\xce\x55\x9f\x70\x3e\x45\x64\x61\x7c\x64\xea\x78\xed\xc2\x7a\xc1\xad\x6d\xf2\x21\x70\x0b\x50\xa9\x65\x1d\x2b\x0f\x97\xdf\x2b\x01\xd9\x2f\x70\x2e\x7e\x55\x4d\x35\x8a\x3f\xb9\x1c\xd1\x4b\xee\x2d\x62\x10\x85\x96\xb7\x8a\x6f\x5f\x56\x3e\x25\xa5\x06\x5f\xa9\x63\xcc\x21\x41\x34\x4e\x70\xc6\xd0\xc6\xb4\xfa\x7c\x51\xf8\x1a\xa0\x2c\xd0\x68\x28\xc0\xf6\xa2\xf0\x67\x58\x44\x41\xf3\xf7\x23\x02\x19\x66\x6c\xb1\x22\xf0\xbf\x43\x66\x81\xab\x16\x66\x0a\x50\xd6\x58\x86\xb6\xdf\xc4\x84\xf7\x95\xdd\xc9\x9e\x73\x86\x98\x19\x5b\xcc\x87\x29\x44\xcd\xc9\xe2\x8c\xe0\x05\xae\xeb\x2b\x38\xcc\xad\x5d\xb0\x8e\x02\x94\xb7\xfc\x67\xb1\x00\x59\x66\xe2\x4e\xb3\x97\x40\x3f\x80\xc7\x26\x58\xa3\xbd\xf9\x95\xc3\xeb\xa8\x92\x4d\xb6\xf4\x71\x36\x72\x4a\xc0\xe0\x18\xe4\xa0\x81\x25\xda\xdb\x0c\xda\xed\x9f\xec\x14\x76\x2c\x11\x40\x09\x39\x6f\x05\x23\x57\x23\x18\x15\xa5\xae\x5b\xc0\xfb\xd8\x90\xf4\x9b\xe7\x02\x96\xfa\x68\x1b\xfc\x81\x21\x99\x50\x71\x3e\xc7\xb7\x28\x9f\xd5\xaf\x3d\x81\x14\xa0\xcc\x1a\x3e\xae\xbf\x8c\x36\x21\x1e\xec\x69\x88\xb6\xc6\xc0\x0b\xac\xc1\x7d\x40\x35\x2e\x30\xc3\x16\xb2\x75\xf9\x46\x23\x66\xdf\x1a\x5b\x64\xfd\x78\x2f\x3a\x10\x95\xa8\xf7\xa2\xcb\xdd\x43\x2d\x0c\x55\x41\x3f\x6d\x23\xb0\x09\xfc\x2f\x27\xe9\xa3\x38\xb6\xaf\x5b\xf8\x1d\x62\x65\x4f\xca\x67\x2a\x65\xb1\x66\x3d\x06\x4f\x1e\x70\x88\xbb\x00\xe4\xa9\x6a\xaa\xd9\xa4\x1f\x3f\x4c\xcd\xbb\xe2\x14\x97\xa7\x41\xcc\xee\x31\x0b\xcc\xe1\x00\x09\x5e\xc4\x39\x0b\x5c\xa3\xb7\x38\x2e\x28\x5c\xc6\x13\x79\x80\x34\xd0\x4a\x19\x4e\x69\x35\x91\x38\x95\xa4\xac\x2f\x9b\x54\x78\x95\xd7\xb9\xf6\x35\x6e\x60\x0f\x79\xdd\xe3\x80\x7f\x4f\xfb\x86\xf7\xfc\x8f\xc9\xfb\x5f\xff\x90\xdb\xaa\xe4\x57\x98\x28\xa5\x42\x45\x56\x09\x5d\x69\x75\x6d\xbb\x76\xa0\x65\xf3\x0d\xbd\x97\x29\xf8\x27\x03\x25\x7a\x9f\xc2\x48\x6a\xb4\x43\x85\xfb\x71\x06\x10\x29\xac\xa9\x4d\x56\x12\x85\x35\x60\x88\x88\xe3\x1c\x52\x76\xa2\xb1\xed\x44\x92\xad\x1e\x44\xd3\x7c\xd3\x1a\x1b\xa4\x9c\xcd\x43\xee\x09\x1b\x5a\xe8\xd3\xde\x21\x3f\xfc\xf8\x23\xf8\xee\xf8\xe4\xbe\x2b\x8c\xc6\x0a\xad\xe4\xb7\x55\xfa\xc5\xdb\xf9\xd6\xa9\x96\xe3\x09\xe4\x80\xd6\xda\x42\xed\x3e\xd2\x71\x4b\xac\x4f\xa4\xeb\x13\xdd\xfe\x52\xfb\xe5\xa8\xea\x24\x6c\xc9\x32\xbf\x52\x4a\x78\x54\x5a\x45\xef\x6d\xa6\xbe\xca\xa3\xb6\x6d\x13\x41\x7b\xad\x2d\xd8\xdc\x22\x0f\xb9\x21\x6d\xc0\xb6\x4f\x7b\x43\x9e\xbd\xff\x53\x0a\xdf\xfc\xe9\x27\xbf\xec\xf3\xc6\xde\x18\xb6\x9f\x38\x10\x59\x70\x64\xe8\x53\x76\xd6\xf2\x48\x36\xae\xcf\x1d\x8b\xbd\x4e\x5b\x8c\xe1\x79\xc7\xed\x9d\xd9\x73\xdf\xed\xa1\x7e\x3d\x33\x7e\xeb\xc4\x23\x03\xb9\xed\xd1\xd2\x7f\x1b\xbe\x5f\xff\xf4\xdf\x81\x35\x51\x8c\xa6\x76\x4b\xe0\x9b\x93\x5e\x6e\xb8\xf6\xce\xea\xd2\x29\x1b\xec\x54\x14\x55\xd9\x60\x8f\xb2\xdc\xca\x06\xbb\xb4\x66\xd6\xae\xd3\xa1\x28\xd1\xb2\x49\x3a\x36\x3d\xf1\x6b\x0e\x91\x15\x76\xd9\xe4\x08\xcf\x3e\x6d\x72\x95\x59\x31\x18\x3f\xc7\x66\x77\xaa\xec\x20\x5f\xbb\x2a\xc6\x54\x5f\xb3\xbd\x24\x0c\xb7\x78\xf2\x78\xb3\x3a\xa6\x4b\xaf\x0e\x63\x2d\xb3\x3f\xc3\x14\x1f\x29\x5d\x9a\x4d\x3b\x33\x52\xdb\xc2\x5b\xba\xb2\xf1\x06\x46\x14\xc8\x25\x5c\x23\x9e\xe0\x14\x37\x0e\xbf\x8e\x65\x1e\x1e\x49\x70\x8a\xb5\x18\x13\x06\x2f\x32\x81\x30\x0f\x98\x6a\x94\x6e\x75\xbb\xc9\xdb\x90\xf2\x1a\xbf\x0e\x3a\x34\xd7\x32\x3f\xa9\x74\x71\xba\x1a\x9a\x5c\xbd\xe7\x0e\x72\xd3\x62\xdb\x74\x65\x4e\x0f\xbb\xf7\x08\xaf\xf8\x11\xc1\xdb\x72\x01\x3a\x5d\x2f\x0e\x2a\xb9\x64\x88\x1e\xfa\x03\x8c\x3d\xe4\xd1\xad\xdd\xf9\xd5\x16\xba\xd3\xaf\x1a\x13\xcf\xdc\x74\x64\x6d\xb6\xd5\xc4\x51\xac\x54\x75\x08\xc3\x32\x5b\x11\x90\x71\x24\x96\x35\xae\x03\x4d\x05\xfd\x21\xaf\x03\x4a\xfd\x90\xa7\x7d\x0b\xa0\xcf\x3f\x7c\xfa\x29\xfb\xec\x89\x41\x55\x39\x49\xfa\x5e\x07\xb8\xf5\x88\x87\xae\xd7\xc5\xa1\x6d\x31\x7d\xa2\xa3\xda\x29\x9d\xc9\x20\xc3\xd1\x5e\xb4\x5f\x2a\xb2\x29\x9d\x7f\x13\x1c\x6c\x8d\xc6\xfb\x04\x2e\xfe\x4f\xb5\x0b\x5e\xeb\x5c\x58\x79\x5d\xb7\x73\x0f\xc4\xf0\xc6\x93\x26\x5a\xf8\x05\x43\x0e\x71\x89\xcc\xda\x01\xc0\x01\x46\xda\xf6\xce\x86\x07\x76\x56\xe1\x89\x74\x0e\x4e\x81\x1e\x79\xc4\x01\xb6\x55\xf1\xd3\xc7\x27\x7d\xf7\x9e\xc3\xb3\x82\xdc\x59\x2a\x82\x8e\x22\x0d\xda\xec\xca\x1b\x2b\xc8\x95\xe0\xe4\x0b\x42\xdf\x49\x9a\x53\x15\x70\xcd\xa5\x0a\x44\xcd\x39\xb8\xf0\xda\x3b\xa4\xb4\x72\xfe\x1e\x46\xbb\x4d\x90\x49\xad\xb1\x03\xe6\x5b\xb3\xd7\x96\xb3\x67\xb9\x0b\x35\x1a\x92\xe7\x29\xef\x2f\x1d\xd6\x93\x0f\x67\x20\xb9\x6e\x11\x10\x0f\xb0\x9e\x5e\x4b\xd9\x4d\xca\xae\x95\xf5\x5d\x19\x02\x67\xa8\xa0\xe4\xbe\xe9\xbb\xec\x33\x73\x8f\xb9\x7f\xac\x5e\xd4\x76\x1b\xea\x39\x64\x3b\x19\x9d\x1c\xee\x47\x92\x5a\xcc\x3c\x2c\x45\xba\xca\x97\x7a\x13\xc4\x21\x17\x37\x45\x0f\x02\x6f\xd0\xa3\x10\xe4\x63\xf5\xa2\xf5\x59\xa4\x1a\x72\x4f\x92\xe8\x82\xfc\x30\xda\xeb\x74\x2e\x35\x75\x5d\xed\x97\x0a\x45\xb5\x51\xc3\x24\x0a\xff\x0b\x4c\x29\x24\xfa\x57\x6c\x06\xcd\x72\x5e\xdc\x23\x95\xaf\x89\xb3\x5a\x29\xa1\x0f\xaa\xe9\x5a\x42\x8a\x9f\xb8\xce\xfb\xe9\x68\x71\x37\x1f\x5f\xfc\xc1\xa9\xf3\x6a\xe1\xd1\x76\x45\xd7\x08\xd6\x63\xc1\x58\x71\x71\xcb\x40\x36\xf5\x44\x5e\x2d\x21\xcd\xfe\xa5\x8a\x80\xc2\xfb\x88\x85\x41\x44\x89\x8b\xbc\xb2\x99\x4d\x2d\xbb\xec\xce\x76\x01\x6e\x3c\x27\xb2\xc3\x5c\x07\x6c\xad\x85\x89\x2c\x32\x2f\x1d\x4c\xbc\xa0\xbd\xc7\x3a\x81\xae\xad\xc7\xf6\x23\x6e\x0e\xb3\xa5\x55\xc3\xf0\xc8\xce\x21\x98\x5d\x3d\x3b\x83\x5a\xf5\x57\xd9\x83\x29\xf5\xfb\xf8\x78\xdd\x54\x1c\xaf\x7b\x75\x33\xd1\x4c\x87\x94\xc1\x79\x02\xe8\x86\x90\x8c\x2c\x9b\xfb\x11\x64\xc9\x53\x97\x1f\x23\x98\x9d\x7f\xff\x7a\x31\x6f\x07\xf2\x1e\x86\xf0\x60\xc6\x50\xf7\x42\x78\x18\xaf\x85\xf0\xd0\xea\xf8\x31\x93\xfe\x22\xf9\x51\x5e\x85\xfd\x53\x00\x75\x98\x03\x7e\xe7\x9a\x83\x42\x05\xe1\x0d\x25\x84\x96\xc8\x2a\xd1\x4d\x45\x6a\x5c\x72\x7b\xf1\x84\x75\x01\x76\x3a\x73\x08\x0d\xb9\x64\x9f\x8d\x19\x25\x28\x7f\x73\x3a\x60\x1e\x1c\x20\x42\x97\xc8\x62\xd4\xd5\xee\xe3\xe8\x10\xca\x0c\x5c\xca\x59\x53\x54\x99\x53\xad\x6d\xdd\x4f\x7b\xb2\x6c\x9c\x0e\x2c\x8c\x76\x33\xb8\xf5\x09\x7f\x5c\x08\x07\xe3\x75\xa9\xd5\xbd\xf1\x20\x7c\x19\x55\xb1\x98\xec\x2b\x16\x13\xf1\xbc\xc9\x18\x5d\xb9\xe5\xa1\x35\xc6\x57\x40\x1b\x68\x90\x12\xea\x7b\x1c\x30\x10\xed\x79\xd9\x82\x30\xa1\x50\xd9\xa4\xcf\x59\x1c\xb4\xad\xd8\x18\xcc\x53\x22\x67\x65\xf9\xdd\xc1\x00\xee\xd1\x84\x56\xb0\x8d\x5a\x82\x1d\xe3\x9c\x02\x94\xb3\x70\xfe\xa1\x64\x50\xf9\xcf\x32\xc8\x8e\x7d\xda\x19\xd9\xd3\xf4\x05\x84\xc3\xdc\x8a\xbd\x25\xa4\x9d\x67\x1c\xc4\x93\x60\xbd\x66\x34\xa1\xb1\xcb\x15\xcd\xbb\xf9\x4b\x13\x8c\xc3\x23\x15\xf9\xcb\xc0\x5f\xc8\x97\xaf\x03\x7e\xf1\xb8\xd0\x17\x03\x81\x2f\x3c\xe0\x8d\x44\xa0\xcd\x68\x33\x60\x10\xb6\x7d\xe2\xc2\x5c\x70\x98\x0e\x1b\x0e\xe9\x36\x5c\x05\x2f\xd1\x20\xb8\xdb\x84\x86\xf1\xe4\x76\x0b\xe2\x8b\x81\x0f\xf3\x05\x59\x7f\x7f\x93\xac\x7f\xb0\x1e\xeb\x1f\x98\xac\xbf\xff\x90\xac\x7f\xb0\x61\xcc\x17\x35\x66\x74\xbf\xf5\x1d\xd5\x5c\x6b\x4c\x16\xbb\x5b\xc3\xba\xd1\x76\xfb\x42\xc3\xb4\xb8\xcf\x6d\x43\x59\x07\x1e\xa6\x97\x3c\x38\xe0\xaf\x7f\xd6\x09\x0e\xd3\x17\x1a\x66\x33\xa3\x70\x02\xc3\xd8\x44\xd4\x41\xd9\x41\x2f\x11\xb5\xdf\x89\x7b\xd0\x7c\x60\x54\x95\x16\x73\x83\x1e\x74\x83\x21\x74\xe3\x20\x30\x03\x46\x85\x7e\xc0\xa0\x0c\x8c\x8b\xa0\x00\x40\x68\x5c\x06\xbb\x81\x11\x7c\xcc\x96\xcc\xe4\x5a\xc7\x1e\x6c\xc2\x74\xf2\x90\xe6\x12\x0a\x8a\xeb\x98\x67\x29\x3d\x75\x93\xc9\x1f\xff\xf8\xfd\x9b\x9b\xb7\xdb\xb7\x8f\x1a\x6c\x5c\x47\x76\x7a\x44\x19\x0f\x4d\x79\xa9\x37\xbd\xdd\xf8\xe3\x57\xd0\xb9\x0e\xf5\xd5\xeb\x42\xf7\x8e\xf4\xed\x92\x9a\x2d\x26\x9e\x3e\x60\x76\xa2\x24\xc3\x46\x0a\xfb\x18\x65\x7d\x7c\x03\x1b\x5b\x5f\x9e\xe0\x55\xee\x57\x7d\xe0\xb8\x7c\x72\x93\xaf\x57\x15\xb4\xf2\x48\x5b\xc1\xf4\x03\x39\xa7\x80\x50\x94\xcf\x84\x9d\x41\xd6\x4c\xf1\x18\x5f\x9b\x05\x65\x23\xa4\xba\x61\x11\xb1\xc5\x96\x1a\x9d\xd7\x15\xd9\x66\x06\xd1\x6e\x64\x20\x04\x16\x90\xdc\xc0\xf4\xf8\xec\x93\xd7\x28\x3e\x8a\xe7\x8d\x10\xdc\x8d\x8e\x85\xc7\xe3\xf6\x1b\x4e\x23\x86\x77\xa3\x23\x7a\xb5\x9c\xc3\x05\x24\x20\xfb\xff\xd8\x7b\xd3\xed\xb6\x91\x6c\x4d\xf4\x7f\x3f\x05\x2e\xce\xea\x73\xab\x56\x12\x14\x47\x0d\xd9\x7d\xbb\x6d\x4b\x76\x5a\x2e\x0f\x4a\x4b\xb6\x2b\x33\xaf\xd6\x59\x10\x10\x22\x61\x81\x08\x24\x00\x52\xa2\x7f\xd5\x3b\x9c\x5f\xfd\x02\xf7\xc1\xea\x49\xee\x42\x4c\x88\x11\x08\x80\x90\x4d\xd7\x71\xae\x95\x96\x44\x02\x31\xec\xd8\xb1\x63\xc7\x1e\xbe\x7d\x16\xe5\x77\xed\x06\x56\xbe\x61\x15\xf0\xf7\xc8\x38\x98\x63\x6d\x3a\x52\x43\x24\xb1\x2e\x2d\x6a\x01\x0b\x78\x55\x25\x19\x5d\xb7\x0b\x22\x36\x84\x10\x6b\x53\xa7\x35\x16\x3e\x63\x98\xa3\x10\xe1\x58\x9d\xd1\x24\xc2\xf1\x76\x47\x97\x0c\x77\xe8\x3f\xaa\x6e\x81\x30\xe0\xf7\x5c\xab\x88\xff\x76\x7a\x35\x5d\xae\x0e\x25\xad\xc2\x5d\x8e\xab\x0b\x2a\x06\xbe\xc7\xe9\x2f\x31\x56\xbf\x8d\xaa\x85\xc6\x67\xca\x9c\x7b\x23\x8e\xef\x28\x40\xbe\x14\x70\xcb\x82\x75\xc4\x00\x5b\xd7\x32\xf6\x42\x63\x29\x68\x5d\x82\x59\xe3\x90\xbc\x81\x0f\xb2\x03\x92\x60\x24\x19\xa2\x25\x44\x2f\xee\x05\x8e\x50\xb0\x8d\x0e\xd7\x59\x16\x55\x0b\x7f\x65\xa6\x76\xca\x59\xc9\x91\xcb\x66\x1c\x1b\xdd\x73\xda\xe2\x02\xa8\x63\x25\x26\xb0\x41\x07\x34\x5e\xb2\x67\x9a\x3b\xb6\x66\x18\x03\x37\xc4\x9a\xa8\x08\x58\x50\x97\x76\x20\xa7\xf4\x9b\x97\x55\x6f\x47\x57\xdd\x85\x06\x59\x67\x58\x41\x9d\x2d\x2a\x5a\x24\xef\x91\x5b\xa5\x07\x00\x1d\x13\x64\x8e\x00\x93\x83\x20\x67\xdc\xcb\x02\xa6\xce\x2b\x44\x51\x11\xb2\x86\xfb\x82\xc7\xaa\x41\xbf\xdc\xfb\x49\xe1\x14\xd0\xc9\xcb\x67\x8a\x65\x94\x3b\x9f\xe1\xcd\xff\xae\x18\xaa\xfc\x1c\xbf\xaa\xc5\xa9\x39\xe6\xf5\x6f\xf2\x68\x23\x54\x8d\x8d\x3d\xef\x9b\xd1\xd0\xcf\x0a\x03\x11\xab\x6f\x6a\xa8\x58\x3e\xa4\x25\xa3\x9f\x15\xd6\x74\x24\xcf\x36\x11\xb2\xb2\x3a\xe8\x0e\x57\x7d\x5c\x95\x5a\x9d\x1a\x83\x20\xdd\xf2\x00\x8a\x34\x8c\x2a\x81\x05\xbd\xfe\x83\x07\x10\x1c\xc0\x14\x24\x15\x76\x86\x8a\xa6\x41\x61\x34\x76\x3b\xa0\xcb\xc3\xe1\x91\x8e\x66\x90\x45\x30\x8c\x02\x0f\xd7\x1f\xdc\xf3\xd3\x79\xf9\xeb\x9f\x5b\xff\xe0\xd5\x79\xbb\x7a\xe7\x16\xc1\x09\xac\x54\xfe\xb3\x36\x3a\xa8\xe6\xfd\xe7\xa8\x32\x51\x3d\x36\x8f\xe6\xb5\x2b\x7a\xfc\x57\x5a\x2c\xfe\xa4\xb2\xc8\x17\x59\xb4\x5a\x81\x90\xd8\xa3\x2d\x2b\xff\x97\xf7\xbb\xfc\x59\x79\x5c\x4b\x53\x52\x82\x09\x6b\xac\xf3\x7d\x85\x67\x4a\xf6\xd0\x0b\x3f\x6b\x95\x88\xa9\x6a\xfa\x36\x36\x63\xb7\xca\x4e\x40\xfd\x49\x8a\x3f\x6d\x4b\x29\x4d\xce\xbd\x31\xd0\x46\xc6\xdb\x9a\x93\xdd\x6b\x3e\x56\x40\x68\xd2\x14\x1c\x50\x77\xb7\xb3\xc4\x47\xd6\xf0\xc2\x2b\x11\x9b\xff\xb2\x72\xed\xb4\xe3\x55\xf9\xc5\x72\x25\x6e\x61\x16\x80\x53\x12\x98\x13\xf2\x34\x54\xcb\xd8\x58\xb2\xae\x16\xb5\xa3\xe5\xae\x52\xd1\xb2\xb0\x25\xcd\xc6\x7e\x56\xeb\xe3\xd3\x74\x86\x71\x08\x9e\x5a\x61\x6c\x19\x9a\x78\x03\x90\xf7\xca\xfc\x96\xc1\x98\x3e\x61\xc6\x74\x72\xa6\x7d\x86\x37\x17\xe4\xa4\x6f\x9c\x2c\x3d\xf4\xe8\x91\x20\x64\xca\x21\x30\xa8\xae\x67\x97\x70\xb4\x3c\xee\xf1\xb5\xef\x07\x57\xe4\x7f\xfe\x7c\xf3\xf0\x2e\xff\x71\x70\xd9\x58\x93\x5b\xdf\x51\x29\x1b\x34\x5f\x4e\xea\x2b\xb8\x29\xc0\x8d\x51\xee\xe1\x68\x28\xe2\x21\xae\xa9\xea\x36\xf8\xc3\x45\x52\x10\xd7\x46\xe5\x4d\x47\xb7\x28\x5b\x36\x07\x05\xa5\x71\x33\xfa\x22\x37\xb7\x17\x65\xa3\xa4\xe2\x6a\xdd\xfc\xac\xcf\x01\xa3\x4e\x20\x27\x13\x7c\x7d\x95\xe0\x34\x6b\x05\xf5\x50\x9d\xaa\x64\xfd\x19\xcc\x9f\x7b\x99\x82\xc0\x1a\x66\xd6\x9e\x74\x5d\xcf\x4c\x3e\x32\xc9\xf6\x1c\x2a\x6f\x6f\xeb\xac\x54\x17\x2e\x08\x7e\x80\x70\x2c\xe1\xb0\x02\xdb\xd3\xe9\x1b\x1c\x2d\xca\xf8\x35\x27\xcd\x0e\xa6\x4b\xb2\xe4\x8f\x73\xae\xe4\x20\xdb\x44\xc1\xde\x5b\x2b\x37\x07\xc5\xc1\x97\x0f\xcf\x7f\xff\x17\x3f\x56\xec\x55\x53\xad\x68\xb3\x79\xf3\xcc\xcf\xdf\xcb\x15\x82\x77\x55\x8c\xad\x5f\xec\x41\xd5\x7d\xad\x81\xfa\xff\xa1\x2c\x3f\xbe\xb2\xdc\x51\x7a\x11\xf9\xf2\x48\xc2\x6b\x9b\xdf\xf8\x45\xb0\xdc\x77\xe9\x75\xbf\x7d\x7d\xf8\xee\xf5\x07\xf0\x43\x7a\xed\x2a\xbd\xbe\xee\xd5\xde\x2d\xb2\xb5\x19\x36\xf5\xc7\x35\xfe\xfb\x96\x4c\x44\x78\x3c\x9a\x68\xfa\x0e\xb2\x79\xaf\x8a\xe4\xa7\xd3\xf0\xa7\xb3\x1f\x82\x69\x1f\xd4\xaa\x1f\xc2\xed\x87\x70\xeb\x4f\xb8\x3d\x46\xbe\x31\x0a\xc3\xd9\x6f\x91\xb6\x79\xfa\x67\x98\xde\x8f\xe5\x68\x59\xb7\x50\x03\x50\x5d\x3e\xfc\x94\x56\x17\x8e\x72\x2f\xcd\x22\x96\x0b\xd2\x00\x73\x47\xe2\xb7\xc5\x98\x86\x28\xfc\x14\x15\x4b\x0e\x92\xc8\x26\xdb\xd6\x14\x0f\x53\xcb\x6e\x75\x28\x82\x4d\x98\x4c\x32\x30\xb8\x8e\x42\xe6\xb1\x99\xe1\x93\x74\x2e\x68\x11\x48\x45\x46\x95\xa2\x39\xcb\x4a\x1d\x7c\x9b\x91\x91\x70\x9d\xa9\x1a\x59\x52\x5f\xb5\xaa\x7e\x98\x35\x1c\xa3\xaf\x36\x65\x1f\x86\x53\x47\x59\x5d\xd5\xa8\x26\x0f\x7f\xfd\x60\xa5\x0e\xc2\x28\x4f\x63\x7f\x7b\x25\x81\xab\xed\xd6\xa8\x0e\x0d\xcd\xb6\x45\x57\x07\x7d\xc9\x02\x1b\x4f\xab\x50\x64\x21\x2a\xaa\xe9\x79\x65\x59\xab\xf7\x3d\x4f\x0c\xa2\xb0\x9f\xb5\x29\x73\xd8\x66\x46\xb5\xc9\xc2\x33\x85\x77\x6d\x73\x85\x2b\x09\x36\x6f\xce\x11\xe6\x52\x88\xec\x53\x84\x29\x51\x5a\xa5\x06\xeb\x53\x82\xf5\x3b\xae\x36\x2e\xc8\x22\x8b\xb5\xdb\x2c\xaf\x6b\xc3\x67\xd0\xe1\x4d\x51\x7a\xf9\xe0\x54\xea\x2d\xc4\x48\xfc\x7f\x56\x45\x67\x56\x30\x29\x96\xb8\xf4\x4c\xeb\xd4\x9b\xf6\x47\x7c\x06\xef\x7b\x3f\xda\xf3\xf5\x4d\xe2\x6f\xf6\xfd\x74\x7f\x73\x08\xdf\x8e\x4e\x66\x5f\x8c\xb9\x30\x85\x7f\x93\x3b\xb8\x96\x64\x39\x1d\xc3\x46\x76\xd7\x2a\x0a\xa7\x23\xa7\x49\x9a\xcb\xb3\x8c\x6a\x43\x33\x70\x6e\x23\x16\xfd\x95\x6b\xc0\xbb\x5f\x82\xc4\xa8\x3c\x8c\x85\xb4\xc8\x81\xf4\x8c\xc3\xfe\x2c\xe5\x37\xb2\x78\x35\x87\x64\xbc\xdb\x80\x6c\x13\x81\x7b\x0b\xe7\x8f\x1e\x8f\xa8\x4f\x3a\x08\xf3\xae\x60\x0a\x75\x93\x6f\x9e\xd9\x19\x7b\x7f\xff\xe6\x46\x10\xe6\xf2\x6e\x33\x23\x40\x77\x79\xbb\x79\xb9\x62\x90\x74\xbe\x4e\xd1\x06\xae\x6c\xe4\x4a\xbd\xb5\x06\x2a\xf4\xb2\xc6\x55\xe7\x9d\x48\xe1\x70\x85\x16\x6d\xf2\x76\x1a\xf4\x39\x21\xa4\xfa\xd1\x56\x5f\x4c\xdb\xd5\xa0\xa7\x46\xa1\x21\x11\xba\x91\x1e\x3a\xe4\xf3\xbd\xe1\x7a\x50\x8a\x76\x3e\x5d\xb9\xed\x6a\x3f\xaf\x1a\xe8\xcc\xfb\xe8\xd2\x83\xee\x3a\xef\x41\x12\x82\x0c\xdb\x52\xf2\x2b\xff\xe6\xeb\xb3\x3f\xae\xeb\xdd\x99\xf5\xc9\xd0\xfb\x61\xfb\x1a\x1d\x47\xac\xe5\x25\xe9\x37\x44\xb5\x29\x95\x83\xa8\x0b\x9a\x22\x3e\x82\x7b\x57\x54\x58\x5d\xe2\xfd\xd6\x54\x66\x5f\x56\x01\xdc\x94\xca\xa0\x4d\xd6\x2e\x4a\xc3\x75\x28\x26\x93\x0d\x9e\x2f\x39\x2a\x9c\x7f\x13\x2f\x44\x55\xd5\xe6\x64\x5d\x92\x44\x73\x97\xe4\xc3\x54\xf8\x6c\x92\xd4\x8f\x32\xa7\x46\xb7\x57\x5e\x96\x63\x5c\x2e\x49\xf1\xb7\x66\x0c\x6c\x56\x30\x9c\x4c\x57\xe9\x14\x81\x39\x85\x3c\xc8\xa2\x3a\xc1\x9c\xd6\x9a\x63\x1d\xd6\x80\x20\x1a\x02\x7a\x76\x9b\x2f\xb2\x30\x14\xe4\xe5\x86\x29\x93\xa2\xe0\xa1\x5f\x08\xb3\xd2\x64\x48\x35\x17\xde\xb6\x99\x67\x8b\x42\xd2\x73\xbe\x64\xeb\x29\x56\x57\x29\xdc\x16\x77\x4d\x9d\xa2\x54\xca\x75\xe2\x50\x7f\x80\x1a\x4b\x2c\x0e\x5f\xb6\x16\xd1\x48\x62\xfd\x0d\x96\xaf\x2c\xc1\x55\xa1\xee\x37\x1d\x44\xac\x49\x7d\x8b\x6a\x10\x3f\xf3\x83\xbb\x45\x06\xd7\x08\xbf\xc0\x2e\x61\x84\xcb\x67\xa2\x63\xd6\xd5\xa6\x16\xab\x50\x73\x31\x77\xb4\x30\x39\x4e\x66\x26\x5f\x20\x92\xe3\x54\x94\xf7\x60\x03\xb2\x82\xee\x71\x25\x1f\x45\xf9\xda\x98\x94\x92\xe1\x27\x0b\x88\x13\x53\xc8\xda\xd0\x4a\xd5\x42\xb9\x6a\xfc\xe8\x15\x34\xa5\xa9\x1c\x72\x6b\xcc\x9e\x6d\x95\xef\xd3\x32\x30\x91\x55\x6f\x67\x41\x8a\x3c\xee\xe8\x8c\xaf\x18\xed\xd2\x8f\x78\x28\x52\xf7\x37\xb8\x76\x42\x98\xfc\xf3\x1f\xff\xa7\xc0\x05\x5c\x52\x90\xad\xa2\x1c\x89\x4d\x46\x1b\xf2\x66\x53\x70\xa2\x43\x88\x6e\x6b\xcf\x48\x6a\xea\x22\x57\x3b\x24\x8c\x6e\x6f\xb5\xca\xc9\x98\x1f\xce\x44\xa2\x11\x13\x9a\x2c\x74\xf3\x36\x2a\xcf\x12\x04\xdf\x4e\x5e\x10\xe6\xa3\x54\x11\x26\x85\x6c\xcf\x50\xf7\x6c\xac\xa2\xa0\x0d\x96\x7e\xb2\x00\xa2\x45\x4d\x32\xba\xa2\x22\xc4\xa7\xe8\x39\xd7\xf8\x9e\x46\x6a\x99\x92\xc1\x44\x13\x9b\x30\x2d\x34\xdd\xe8\x0b\xf0\x8e\x9c\xa5\x9f\x7b\x05\x78\x28\xbc\x00\x24\x05\xc8\x44\xd9\x8d\x4c\x4f\xe5\x00\x64\x90\xfa\x96\x79\x53\x52\x21\x6b\x8a\xa0\x68\x57\x4c\x93\xa1\x5f\x84\x7e\x76\x67\x38\x59\xb0\xd0\x3b\xe1\xb1\x6e\xca\xd5\x18\xb8\x4f\x36\x20\xbb\x81\xb9\x41\xa6\x32\x8e\xa9\xbe\xc1\x0f\x6b\x3c\x63\x75\xba\x61\xf9\x2b\x53\xfc\xf8\xca\xc9\x0c\x42\x06\x23\xe2\xfa\xfa\x6c\x2f\xa5\x76\x32\xc3\xa1\xa9\x4a\xce\x90\x82\xca\x78\xc0\x6d\x95\x47\x32\xe3\xc7\xd2\x1e\x73\x2f\x2f\x32\xe0\xef\xbd\x83\xfe\x7d\xb2\x5e\x1c\x8e\x92\xf7\x42\xe5\xd7\x89\x18\x93\xad\x89\xcf\xf6\x93\x04\x16\x7e\x01\x42\x6a\x50\x50\xa1\xc2\x28\x4f\x0d\x11\x34\xae\xb6\xe2\xf2\x12\xde\x9f\x21\x75\x45\xb1\xbf\x57\x77\x27\x92\x27\xbe\x02\x48\x61\x4d\x60\x51\x0b\x8c\x2d\x39\x6b\xc6\x56\xda\x8e\xf9\xea\x67\xb8\xeb\x98\x46\x07\xd1\xaa\xd5\xee\x47\x5e\x09\xa9\x46\xc6\xb6\xe4\xc0\x7d\xb2\xf4\x93\x30\x06\x24\x2c\x41\x9d\x86\x76\x6b\x62\xc7\xb2\xe5\x0e\x1d\x73\x73\x77\x33\x10\xc0\x2c\x54\xfb\xa5\x3b\x57\x0f\xda\xc4\x5f\xdf\x90\xc2\x89\xb7\x62\x35\xc6\x8e\xbb\x91\xee\x9a\x7e\x77\x65\x0e\x13\x84\xa2\x07\xb2\x7d\xdf\x8d\xa7\xef\x5e\xbf\x7e\x71\xbf\x7e\x5f\x1f\x2e\x83\xc1\xe3\x4a\x95\x31\x65\x57\x37\xe6\x99\xc8\x61\x72\x59\x64\xbc\x5e\xc5\xe5\xf9\xad\x20\xaa\xac\x5f\x2c\xc1\xaa\xfc\x99\x07\x19\x00\xc9\x7b\xe0\x87\x20\xa3\xc8\xd1\x85\x7f\x73\x89\x85\x6b\xc9\xd2\x6f\xd1\x1d\x2f\x47\x75\x1c\xfc\xf0\x5d\x12\x93\x94\x40\x7f\xe3\xe7\x41\x16\xa5\x05\x11\xd5\x91\x57\x7e\xef\xc1\xf2\x01\x5c\xea\x89\xb7\xc1\x4e\x2a\x6d\xf0\x5a\x3d\x47\x5c\xf1\xac\x88\x36\x5b\xaf\xbc\x9a\xad\x22\xc4\x8a\xdd\x32\xa7\xaa\x25\xef\x95\x95\xe2\xe8\x16\x04\xdb\x20\x26\x8e\xb9\xef\x21\x5c\xe1\x7c\x72\x3a\xbb\x7b\x7d\x31\xd5\x99\x09\x2a\x0f\xb3\x66\x62\x9c\xc7\xb9\xf0\xf3\x3b\xc4\x10\xe4\x21\x86\xe4\xc8\x3d\x23\x58\xaa\xc4\xaf\x4a\x46\xc8\x97\x20\x34\x3b\xab\x15\x6d\x07\xf5\x68\xbc\x31\x57\xcf\x25\xb4\x8c\x8f\xd1\x3d\x5a\xb6\x74\x59\x28\xa7\x8c\x63\x99\x0a\x8b\xcd\x6e\x7c\x61\xba\xea\xf7\x21\xa6\x8b\x0e\xfc\xa6\xea\x95\x77\xca\xf1\xc2\x9b\x1f\x57\x75\xc5\xb1\xab\xde\x2b\x2f\x8c\x29\x03\xd6\x10\x40\xa4\xbf\x35\x35\x35\x2a\xe9\xb7\x75\x66\x60\xae\x58\x07\x65\x19\x8d\x49\x82\x8f\xa8\x60\xcf\xbd\x16\xb1\x3c\x49\x6f\x57\x94\x1d\x1a\xaa\x50\x28\x87\xb7\x5c\xde\x90\xda\x1f\xe9\x41\x16\xf8\x69\x54\x74\x29\x60\xa8\xd9\x30\x8f\x29\x69\xf6\x5d\xca\x04\xc5\xe1\xe9\xc5\x97\x50\x54\x23\xc7\xda\xd4\x3e\x36\xb3\x8b\xa5\x8f\x4d\x30\x15\xb8\xd9\x58\x8d\x42\xa8\xbf\x08\x99\x75\xc1\xd6\x80\x84\x0e\x05\x25\x7c\x4d\x07\x48\xf7\x05\x57\xbb\x9c\xed\x5a\x2c\xe4\x2e\x69\x01\x04\x64\xba\x59\xac\xb3\x6a\x9b\xd7\xd8\xd0\xad\x46\x89\x6e\x78\x32\x17\x88\xa3\x56\x93\x09\x35\x1b\xcf\x4b\x31\x99\x35\x42\x72\x22\xd6\xfe\x95\xeb\x00\x6b\xd6\xaa\x25\x1e\xb0\xf1\x90\x41\x63\x52\xaa\x08\x3c\x65\xfe\x0b\x11\xc1\xd7\x71\x95\x48\x96\x71\x85\x61\xc8\x84\xa7\xc9\xae\x62\x73\x70\x28\x6d\xea\x73\x25\x1b\x14\xea\xc1\x1f\x2a\xea\xfb\x68\xe0\xe6\x9b\x45\x75\x59\x08\xa3\x4d\x14\x82\xcc\x49\x33\x80\xb0\x58\x8c\xe6\x20\xfe\xae\x51\x15\xc8\x79\x18\xbb\x03\x77\x44\xff\xda\x0a\x7f\x3d\x4c\x84\xef\xca\xbf\xc6\xa3\xd1\x7f\xaf\x7a\x30\xa6\x7f\xd6\x95\xc4\xd6\x8f\x1e\xe6\x45\x5e\x40\xb9\xe2\xc6\xbe\x8c\x5e\xfa\xd8\x6e\xa3\x30\x41\xae\xdd\x2c\xe2\xf9\x48\x1d\xde\x16\x7b\x08\x23\x87\x32\xa1\x72\x45\xde\xb6\xdb\x48\xa6\x08\x2c\xaa\x1f\xe9\xef\x7d\x34\x4c\xb8\xb2\xc4\xec\x30\x58\x26\xee\x76\x1f\x31\xd5\x88\x84\xe1\x93\xc8\xeb\x29\xd5\x3c\x0c\x17\x84\xa9\x30\x1d\x71\xab\x99\x96\xdb\xa4\xa1\x98\x4d\x56\x2e\x92\x4c\x24\xe2\x8f\xc4\x4b\x02\xb9\x8a\x13\x0a\xc0\xd2\x5f\x8c\x63\x78\x0f\xb2\x00\x37\xa1\xbb\x2c\xec\xa4\x64\xf4\xac\x60\x24\xdf\x89\x6e\x71\xf0\xf1\xee\x2e\xba\x5b\x3e\x15\x6e\x30\x63\xb4\x85\xb1\xe1\x1a\x97\x57\x91\xe2\x25\xb1\xd2\x81\x0d\xd3\xbc\xf3\x0b\x26\xe7\x49\x8e\xcc\xf2\x5c\xcc\x30\x7a\x6a\x2c\xf8\x1f\x90\x83\x1f\xb7\x26\x3f\xc8\x2b\xfa\xeb\x34\xf4\x0b\x70\x16\xad\x40\x22\xd9\xc1\x0c\x81\x61\x54\x9c\x0a\x65\xcd\x62\x10\xde\x6c\xb9\xda\x66\x0c\xc7\xf0\x3c\x64\xf7\x25\xfa\x42\x08\xca\x9b\xf7\x8d\xe6\x0d\xfc\x0d\xb2\x09\x70\xef\xe9\x43\xd0\x18\xb6\xc4\x78\x5e\x1e\x7c\x75\x1d\x8b\x56\x7b\x0a\xaf\x68\x54\xfe\xd1\x30\xf4\x2d\x37\x0d\x50\x12\xb4\xdc\xe3\xfa\xcb\x9b\xe9\xd1\x86\xeb\xce\xdf\x3d\xff\x21\xca\x1d\xc4\x9a\xb9\x93\xf9\xc9\x02\x38\xb7\x19\x5c\x49\x6d\x3e\xbc\xc7\x7e\x07\xf7\x36\xca\xf2\xe2\x1d\xb1\xed\x51\xd1\x53\x40\xd3\xe3\xb1\xaf\x3c\x3d\xe0\x4e\x20\x3f\x09\x9d\xdf\xec\x46\xb0\x6d\x37\x82\x6d\xcd\x08\x86\xed\x6e\x70\x2e\x77\xe6\x6f\xbd\x45\x16\x85\xe5\xf6\xca\x1d\xf6\x1b\xe5\xe1\x22\xf3\x93\x1c\x9b\xe8\x49\xac\x7a\xf9\x41\xb9\x89\xff\x52\x19\x00\xb6\x4f\x1f\xa2\xfc\xdd\xed\x6d\x0e\x50\xac\xb5\x3b\x70\x46\x7f\x75\xb9\xc5\x37\xfa\x45\x32\xe0\x87\x4a\x3d\x5c\xd4\xf5\x71\x79\x60\x68\xbc\xa4\x4f\x33\xe0\xa3\x93\x65\x4e\x05\x03\xca\xb6\x88\x4a\x5d\x32\x3f\xf0\xcb\x6f\x07\x23\xf6\x74\xb0\xce\x50\x34\xe4\xc3\x65\xe0\x23\x44\xd8\x2d\xfd\xe5\xe1\x02\xc3\x45\x6f\xc9\x4f\xec\xfa\x1a\xb8\x4b\x40\xfd\xdc\x48\xb1\xf1\xb3\x6a\x96\xa4\x11\xee\x8e\xbf\x55\x3e\xc1\xcd\xf2\x8f\x28\x1f\x88\xb4\x62\x2f\x0a\x1f\x5f\x33\xd4\x2c\x9b\x60\xb4\x85\xe0\xbc\x5c\x46\x61\x08\x90\xd3\x25\x5b\x83\x6a\x95\x1f\x30\x4b\x96\xff\x58\xac\xed\x68\xc0\xd9\x77\x1e\xa4\xe5\x35\xac\x6d\xeb\x21\x6d\x5b\x0d\xa9\x0b\xbb\xf1\x43\xca\xa8\xe9\x1e\xf5\xbd\x84\x1b\x90\x79\x85\x9f\x2d\x40\xc1\x34\x54\x41\x41\x65\x7f\xcc\x19\x77\x08\xc2\x6e\x2b\xaf\x18\x7e\x94\x30\x90\xf8\xac\xb2\xba\xc6\x72\xa2\x6d\xb6\x0a\xd9\x28\x33\xed\x46\xf9\xf8\x14\xbb\x70\x70\x48\x9d\xfb\x52\xfc\xf3\xaa\x72\x84\xeb\x77\xd2\xc6\xf3\xf9\x17\xaa\x2d\x55\x44\x2b\x90\x83\x2c\x42\x37\x7b\xec\x22\x40\x96\x66\xbc\xad\x08\x08\x7b\xb5\x8b\xb0\x02\x5b\xb1\xd2\x0b\xfc\x06\xcf\xf9\xcd\x9b\x48\x43\x3e\xed\xa0\x97\xa6\x41\x9b\xc6\x89\x6a\xb5\xd1\xe5\xe5\x4e\xfd\xad\x3a\x4c\x75\xaf\x2b\x5b\x3b\xf0\x93\x8d\x9f\x73\xba\x02\xe9\xa0\xfe\x11\xd2\x79\xcd\xb4\x68\xd4\x02\x37\x21\x16\xe7\x9d\x17\x5b\x34\x21\x5c\xce\x87\x73\xe0\xd1\x0a\x3a\xbe\x60\x80\x61\xa7\x3c\x6e\xf2\x12\xbd\xcd\x7d\xce\xbd\xd6\x2c\x85\x64\x98\xd0\x7f\xf7\x8b\x02\xf9\x12\x9e\x08\x4c\xf2\xef\xa5\x4a\x44\x2b\x30\x73\xba\x76\x18\x85\x5e\x84\x75\xb5\x01\xfa\x03\xeb\x5a\x88\x24\x49\x08\xef\xbd\x0c\xe4\xd8\x53\x81\xb4\x72\x8a\x2b\x4a\x3c\xc7\x4c\xd5\x6d\xad\x73\x27\xad\xd4\xed\xff\x66\xab\x6e\x8b\xf5\x55\xf6\x5b\xe5\xbe\x3f\xff\x5b\x76\x32\xb9\xdf\xb6\xf4\x0a\x87\x20\x80\x99\x5f\x80\xf0\x12\x57\xd8\x30\xdf\x19\x8f\x07\x13\xe1\x02\x4a\xf9\x16\xd9\xe6\x06\x18\xbf\x7e\x40\x4b\x67\x91\xe8\x88\x81\x1b\xc4\x34\x6c\x61\x8e\x6e\xee\x3c\x49\x0f\xd8\x6f\xd8\xc0\xc7\x6d\x06\xf6\x3e\x4c\xd8\x2f\xa7\x31\x17\x01\x21\x16\xb1\x54\xb0\xa4\xa5\x10\x25\xf3\xd7\x47\xba\xf6\xe8\xdc\x91\xf7\x8b\xee\x0d\x4d\x1b\xec\x7e\x42\xeb\xce\x4a\x65\xf1\xf8\xbf\xa5\xb6\x25\x2a\x3f\xd2\x04\xd0\xbe\xfc\x2a\x33\x60\xa2\xce\xb8\xc4\x98\x41\x94\x25\xd6\x0e\xdf\x66\x18\x22\x56\x72\x5b\x6a\xa8\x52\x50\xf0\xb1\x13\x36\xd6\xc0\x23\xeb\x8d\x08\x46\x49\xc6\x45\xc1\xa0\xda\x25\xee\xc0\x5d\xad\x8b\x2e\xe0\x5f\x22\x61\x7b\x36\x2c\xd4\xae\xd9\x7e\x0b\xbe\xe9\xef\xbf\x17\xf3\x5b\xb1\xfa\xbc\x75\x9c\x56\x65\xe9\x16\x27\xcd\x19\xba\x91\x3b\x74\x1d\xc7\xcf\x70\xc1\x22\x6c\xe9\xe6\x4b\x18\x19\xef\xec\xc7\x83\x71\xcb\xf0\x2b\x1d\xc3\x71\x27\xe5\x2e\x0c\x23\xad\xea\xd7\xe1\x1f\x2c\xd6\xf7\x9b\x7f\x3e\xfc\x76\x17\x3c\x3d\x7d\xfd\xc2\x18\x94\x2f\x4e\xc7\x43\x39\xa0\x89\xea\x04\xd0\x2f\xb9\xce\xe3\x29\x04\x72\x8e\x0f\xb9\x32\x0e\x4a\x34\x67\x49\x64\x3f\x28\x9c\x2a\x5e\xdb\xa9\x86\x83\x03\x36\x29\xc7\x61\x86\x15\xe2\xb6\x71\x4d\x73\x16\x11\x5f\x32\x6e\x94\x6c\xa2\x3c\xaa\x0a\x21\xea\xc3\x42\x51\xa1\x0b\x09\xeb\x13\xd9\x9c\xb9\x3d\xc1\x6d\x2c\x76\x8a\x90\x23\x9a\xff\xa8\xaa\xd3\x4c\xdf\xc3\x02\x5d\x3e\x00\x6b\x32\xca\xf9\x3a\xe9\x6a\x3a\xb9\x61\xdb\x50\x89\xcc\x62\x17\x91\x0c\xbe\x25\x65\xf1\x7a\xda\x49\x25\x43\xf4\xbf\x93\x52\x7f\x11\x25\x24\xc8\x7c\xbf\xf7\xce\xf3\xe7\xef\x92\x67\x17\xe3\xc0\x20\x7b\x59\xd5\x36\xbe\x16\x16\x27\x84\xcb\xdd\xf2\x87\x06\x8f\x1c\xd9\xce\xd0\x95\x0e\x6c\xdc\x81\x9b\xe0\xd0\xfc\xd8\xc7\x1f\xfa\x0b\xf0\x3a\x4a\xee\x4a\x8a\xf0\x10\x9b\x24\x43\xbe\xfc\x3d\xc7\x6e\x80\xac\xc8\x9f\x22\xbb\x7f\x12\xe2\x5f\x62\x54\xb9\x9f\xd7\x45\x2b\x52\x33\xd2\x83\x4c\xb8\x1b\x83\xbc\x60\xf5\x4a\x71\xe7\xee\xc0\x65\x7b\x68\x50\x0d\xf6\x45\xf9\xd3\xc1\x0f\x34\x57\x3a\x21\x40\x2e\xcc\x7d\xae\x55\xa3\x7a\x18\x1d\x21\xe1\x45\x06\x36\x11\x5c\xe7\x64\x7c\xba\xf8\x7d\x32\x22\x59\x5b\xfc\xd6\x13\x20\x8b\xff\x16\x3c\x14\xd2\xe0\x8f\x76\x1f\x3c\x73\x9a\xfb\x39\xc1\x69\xad\x55\x6b\x7b\x98\x0e\x61\xe2\xd7\x3e\xe3\x15\xcd\x18\x7a\x1e\x3f\xf7\x12\xde\x38\xd2\x87\x86\x96\xaa\x6d\x4c\xb7\x12\xf7\x19\xd9\x53\xfc\x9b\x51\x5e\xb8\x75\xe6\x85\x66\xfd\x46\xab\x3f\x73\x45\x47\x42\x10\xa0\x3a\xa8\x41\x17\xf9\x5d\x2d\xde\x63\x4a\x6c\x81\x31\xf6\x5b\x78\x87\x8b\xf9\xaf\xcf\x3f\xfd\xba\x30\x08\xef\x4a\x4f\x10\x84\x36\x8b\xbe\xfb\x83\xa8\x2e\xd4\x0c\x46\x23\x05\x91\x4a\x23\x24\xdd\x54\xbc\x45\x4e\x70\x8c\xa1\xc4\xca\x55\x68\x4e\x00\x0d\xf6\x33\xbf\xcd\xad\xd0\x93\xb4\xea\xb7\x29\xba\xae\x91\x43\xa5\xb2\x00\x3b\xa8\xe4\x5a\x66\xe9\x9f\x27\x49\xc5\xbc\xfd\xe6\xc1\x83\xf7\xe1\xef\xcb\x6c\x7b\x24\x28\xdf\x82\x5a\x30\x36\x59\x9a\x58\x75\x47\xfe\x3c\x47\x93\x3e\x40\xff\x8a\x36\x25\xc2\x08\xda\x07\x65\xcb\x04\x8d\x27\xa9\xb1\x91\x5d\xab\x6d\xd1\xf1\x88\xbe\x2a\xc4\xc5\xd8\x32\x5d\x5f\xa9\xd6\xb2\x1a\xad\x46\xbe\xd6\x69\xbf\x3b\x5b\x56\xe9\xf4\x1e\x89\x3f\x2b\xaa\xed\x37\x9f\x1e\x5d\xa4\xaf\x0f\xaf\xae\x1a\xa2\xfc\x15\x89\xc6\x31\xaf\x04\xf3\x67\x66\x86\x54\x72\x41\x10\xa8\x36\x2d\x2b\xd4\xc3\x6e\xea\x6e\xa3\x5a\xf9\xa7\xe3\xa0\xfe\xe4\x9d\xb0\xd0\x8f\xc5\x47\xfc\x4e\xde\x6f\x56\xfa\xf4\x66\x32\x49\x16\xcf\x6e\x5a\x1a\xea\xb1\x50\x52\xae\xcd\xe4\xdb\x3b\xb0\xd5\xdc\xae\xa6\x0c\x4c\x8f\x05\x9d\x09\x16\xcf\xc1\x44\xc8\x2b\x42\xf5\x54\x69\xf5\xf9\x96\xa6\xcf\xce\x7c\x51\x2d\xdc\xe3\xb2\xc6\xf7\x60\x8a\x1a\x1d\x9f\xfb\xe1\xfb\x67\x07\x0a\x4e\xa5\x5a\x64\xc4\xd2\xda\x54\x7b\x3c\xec\xb8\x66\xfd\x1b\x3f\x20\xca\xbd\xf7\xf2\x34\x4a\x92\xfd\xd7\x9f\x1f\xc2\xf7\xf1\xc5\x9f\xf0\x58\x13\xe4\xc6\x19\xf5\xa4\x49\x49\x86\xe5\xd4\x5f\xe7\xc4\xaa\xcc\x7e\xbd\x16\xc2\xdb\x64\x33\x1c\x32\xcd\x91\x67\x71\x33\x16\xa6\x34\xde\x9c\x19\xac\x6f\x80\xe7\x27\xa1\x17\xc3\x05\xd4\x04\x03\x6b\x5f\xb0\x0b\xda\xcf\xa3\x10\x38\xe5\x3f\xde\xd8\x1c\x03\x5c\xf3\xd6\xa4\xd3\x5b\xd3\x4e\x6f\xcd\x4c\x6f\x99\x23\xac\xb8\x08\x64\xb8\x80\xc8\x10\x8c\x21\x07\x8d\xc4\x11\x12\x67\x08\xf7\xa3\x77\x13\xd7\x22\x99\xb5\x4b\xbe\x0c\xae\xc4\x89\x0c\xc3\x1e\xf3\x3c\x91\x42\x9e\x2d\xf7\xbb\xc8\xb8\xbd\xee\xf4\xd5\x3a\x2e\x22\x2f\x07\x31\x08\x0a\x2f\xcc\x60\x1a\xc2\xfb\xbd\x37\x76\xbe\x5c\x5f\xae\xde\x3f\x5f\xbd\xae\xd7\x01\x97\x30\x8b\xbe\x94\x9c\x11\x5f\xc0\x3c\xaa\x90\x42\x88\x1b\xfb\x09\xe7\xc7\x26\xb1\x2a\xca\x69\x2f\x15\x67\x37\x7f\xcd\x87\x81\x5b\x39\xaf\xc7\xaa\xeb\x37\xf0\xd3\x62\x9d\x69\x2c\x47\x35\xaf\xda\x74\x2f\x3a\x5b\x6d\xf0\xe1\xc7\x83\x3f\xdc\xab\x2c\x5a\x2c\x00\xce\x85\x25\xa1\xc2\x94\x3d\xbc\x82\x7e\x47\xc5\xe3\xec\x1a\x6b\x3e\xeb\x54\x4b\x44\x17\xa6\x20\x79\x97\x3c\xcd\x32\x78\x7f\x86\xf9\x0b\xa3\xd5\x6b\xe6\xd9\x68\x4c\xe0\x77\xbf\x3c\x22\x62\xe7\xb8\xd6\xc5\xcf\x82\x18\x41\xa4\x9f\x63\x19\xef\xc5\x9c\x13\xc3\x20\x31\x64\x63\x89\x21\x78\x0c\x6f\x1e\xcc\x5e\xaa\x79\x5d\x10\x7f\x4a\x39\xb9\x58\x03\xfc\x23\x25\x68\xd4\xf7\xa3\xbc\x55\xe7\xd7\xb4\x88\x5d\x1d\x9b\x69\x5b\x4a\x2e\x07\xc9\x02\x2f\x85\xf7\x20\xa3\x52\x83\x80\xa5\x62\xc1\xa6\x8f\xbd\x53\xd1\xd1\x44\x66\x3b\xa5\x9e\x3c\x0d\xb3\xb1\x3c\xed\x7a\xfe\x90\x16\x85\x7b\x4b\x87\x2d\x47\x10\x46\x67\x03\x37\x83\x31\x20\x0e\x09\x52\x4f\xbe\x39\xba\xdc\x8a\x95\x5c\x31\x4b\xec\x48\x13\x1b\x21\x0e\x54\x86\x80\x28\x6f\x12\x4a\x8e\x88\x79\x0b\xc0\x94\xe5\xf4\xcd\x50\x26\x3a\xbd\x3f\xb0\x40\x4b\x98\xd4\x6c\xd1\x22\xf3\x37\x20\xcb\xc1\xeb\x28\x2f\x5c\x7a\x4b\xa9\x4e\xc6\x86\x34\x25\xb6\xed\x1a\x72\xc8\xdc\x28\x49\xd7\x85\x66\x90\x44\x4f\x99\x0f\xdc\x60\x09\x82\x3b\xa4\x52\x49\x15\xb8\x27\xdc\xed\x4a\xd9\x12\xd7\x62\x35\x43\xba\xac\x1c\x51\x70\xd5\x44\x0a\x87\xa3\xa3\x00\x0e\xbc\x51\xe7\x8e\x1c\xb3\x68\x58\x94\x43\x8c\x29\x55\xe2\xae\x9d\xe8\xa4\x87\xf2\xa8\x45\x6a\x96\x98\x93\x34\x90\xf8\xd9\x0a\xba\x87\xb2\x7c\x3f\xcc\xad\x30\x00\x87\xe8\xc1\x38\x12\xac\xd2\x62\x6b\xe4\x8a\xb7\xd0\x21\xbc\x6f\x96\x5e\x75\x93\xa4\x64\x30\x58\x52\xc6\xac\xd0\x43\x18\xf2\x8c\x40\x75\xb4\x1b\x3f\x8f\x02\x4e\xe3\x31\x45\x07\xc1\x84\x21\x4a\xeb\xd1\x3c\x92\x20\x5e\x87\x28\xc7\xab\x8d\x4e\xa7\xd5\xbb\x7a\xd5\xec\x2a\x1d\x77\xdf\xd5\xb9\xf9\xd9\xdf\xd3\xfc\xe4\xe5\x4a\xbe\x6c\x0b\xc9\x93\xdc\x74\xc8\x16\x7f\x58\xc5\x28\xc6\x77\x59\x14\xe9\xcf\x07\x07\xf7\xf7\xf7\xc3\xfb\xe9\x10\x66\x8b\x83\xc9\x68\x34\x3a\xc0\x81\xb1\x86\x2f\xd1\xbb\x07\xb4\xa5\x4d\x04\xee\x9f\x41\x24\x2b\x9d\x91\x33\x19\x1d\x0e\xa7\x63\xe7\x70\x34\x1c\x1d\xe9\x6f\xfb\x2c\x06\x5f\x9f\x1e\xa4\xfb\xae\xfa\x36\xf5\x71\x38\x34\xc2\x48\x73\x07\xee\x9b\xa3\xe3\xe1\xec\x64\x30\x19\x0f\x8f\xa7\x1f\x67\x87\xc3\xd1\xd1\xd2\x9b\x0f\x4f\x36\xde\x74\xb2\x3c\x1e\x8e\x0e\x5f\x9f\x4c\x86\x47\x27\x83\xe9\xf1\x70\x7a\xf2\x71\x3c\x1b\x8e\x97\xe5\xb7\xd3\xc9\xcb\x93\xd1\xf0\x70\xfa\x7b\xe3\x95\x4b\xed\x70\x3c\x9e\x0e\x47\x27\x83\xd9\xe1\x70\x3e\x0f\xbc\xe3\xc1\xc8\x1b\x8f\x86\xe3\x63\x6f\x36\x9c\x4d\xc8\xaf\x27\xc3\xc9\xe4\xe3\x74\x3c\x9c\x4d\x83\x91\x37\x1b\x1e\x0f\x26\xc3\xf1\x21\xfa\x74\x50\x3d\x90\xa3\x5f\x07\xe5\x6b\xf8\xd3\x41\xf9\xe9\x66\x3e\x3c\x19\x9f\x8e\x27\xd3\xe1\xe4\x68\x30\x9b\x0c\xc7\xd3\xc1\x78\x32\x1e\x8e\xc7\xb8\xc3\x01\xdf\xfb\xef\xab\x91\x37\x3e\x19\x4e\xe7\x81\x37\x1d\x8e\x27\x83\xb2\xaf\xe9\x64\x30\x1e\x4e\x4f\xf0\x6f\xb3\xcd\xe1\x70\x72\x12\x8c\x06\x93\xe1\xe1\x6c\x30\x1e\x4e\x06\xb3\x01\xfe\x22\x2f\x7f\x78\xe5\x93\xe8\x03\x6f\x56\x0e\x77\x32\x3b\x1d\x8f\x8f\x86\xb3\xf1\x60\x72\x3c\x3c\x1c\x8c\xc7\x87\xc3\xc9\x78\x30\x39\x1a\x4e\x68\xb7\xe5\xef\x9d\x68\x36\x1b\x0f\x47\xc7\x03\xb4\x3e\x1f\x27\x27\xc3\xa3\x79\x30\xf2\xc6\xc3\xc9\xdc\x1b\xce\xa7\xde\x78\x78\x7c\x54\xfd\xe3\x8f\x0f\x87\xe3\xc3\x01\xfe\xb7\x14\xaa\x23\xef\x70\x38\x1e\x4c\xaa\xd5\x3d\x3e\xfc\x38\x99\x0c\x0f\x4f\x96\xb3\xe1\xec\x30\x1e\xce\x8f\x07\x13\x7f\x32\x1d\xce\xa6\x03\xfc\x6f\xf9\xd2\x78\x70\x32\x9c\x1e\x7a\x93\xe1\x6c\x5e\x92\x78\x86\xff\xc1\xdf\x20\x92\x4f\x86\xf3\xc1\xa4\x7c\x83\x3d\x3e\x1b\x7b\x93\xe1\x3c\x98\x0e\x8f\x4f\x06\xa3\xc1\x7c\x38\x29\xd7\xed\x68\x86\x7f\x3b\x1c\x9e\x8c\xf1\x08\x5e\x8e\xe7\xb3\xe1\x49\xf3\x2c\xe6\xc3\xf9\x00\xfd\xa3\xcc\xa1\x13\x05\x8f\x27\xc3\x63\x42\xc1\x65\xc9\x53\xb1\x37\x9c\x95\x9d\xce\x8f\xfd\x31\x62\x71\xfc\x2f\x9a\x8c\x77\x34\x98\x0c\x47\x87\x81\x37\x2b\xb9\x08\xf5\xed\x4d\x86\x27\x53\xf4\xcb\x11\xe2\x93\xa3\x39\x7a\xc4\x3b\x2c\xc9\x77\x38\x3c\x9e\xa0\xdf\x5e\x8e\x8f\x8e\x3e\x4e\x47\xc3\xf9\x61\x30\x2a\x89\x71\xe2\x0d\x8f\x26\xde\x74\x38\x2f\xb9\xfb\xb0\xfc\xc5\x9f\x4e\x86\x47\xe3\x01\xfe\x97\xce\x6c\x76\x3c\x3c\x9a\xc4\xe8\xd9\xf2\x39\xbf\x6c\x61\x32\xc0\xff\x62\xea\x1e\x7b\xe3\xe1\x38\x38\x1a\x4e\xcb\x35\x38\x29\x49\x3f\x9c\x9f\xa0\x5f\x8e\x87\xb3\xf9\xef\x6f\xc6\x47\x47\x83\xe9\xd1\x70\x32\x5b\x22\xce\x0d\xbc\xf1\xf0\xa4\x64\xe8\x72\xfd\x4a\xe2\xa2\x75\x9c\x0c\xa7\xf9\x70\x3e\x2d\x7f\xce\xab\x7f\xfc\x93\xe1\xa4\xdc\x3a\x78\x34\x03\xbc\x0d\x3b\xb2\xe9\x71\x39\x97\x72\xe0\xb3\xa3\x60\xe4\xcd\xcb\x4d\x39\x19\x4e\xbd\xe3\xe1\xe4\x70\x70\x34\x3c\xc2\xbf\x95\x24\x98\x4c\x06\xf8\x5f\x3c\xbd\xc3\xe1\x64\x36\x3c\x3c\xfa\x38\x9e\x0e\xc7\xb3\xb8\xe4\x50\x6f\x78\xcc\x38\x76\x36\x3c\x3c\x8c\xbd\xe1\xfc\xd8\x9b\x94\x6b\x35\x1d\x0f\xf0\xbf\x64\xad\xca\x4d\x58\xce\xaf\x5c\xae\x72\x71\x8e\x86\x13\xaf\x5c\x4b\xf4\xcb\xf1\x70\x3c\xfe\x7d\x35\x9e\x79\xe5\x16\xf6\x27\x87\x83\x09\xdd\x14\xe5\xe8\xbc\xe1\xe1\x24\xf0\x26\xa5\x78\x18\xa1\x15\x1e\xe0\x85\x1e\x94\xf2\x60\x53\x0e\x36\x18\x0d\x4a\x52\x0e\x8f\x26\x83\x92\x70\xc7\xc7\x83\xa9\x7f\x5c\x32\x34\xfa\x07\x93\x6c\x3e\x9c\x4c\x51\x23\x36\x34\x83\xf1\x76\xc1\xc3\x5b\x56\x08\xb3\xb3\xf2\xdb\x08\x21\x43\xbb\xd3\xe3\xe1\x68\xe2\x4c\xa6\xc3\xf1\xd4\xc1\xbf\x4f\xa7\xc3\xd1\xb1\x33\x1d\x0f\x47\x27\xce\xf4\xa8\xfc\x77\x72\x38\x9c\xcc\x9d\xe9\xac\xfa\xbd\x3c\x34\x0e\xcb\xdf\xa7\xc7\xf8\x00\x71\xe6\x93\xe1\xec\xc4\x99\xcd\xab\xdf\xc7\xf3\xe1\x78\x5c\xfe\x3e\x1a\x93\xdf\xb9\xbe\xda\x8e\xbf\x1a\xf0\xe4\x70\x38\x9a\x3a\xa8\xcf\x11\x69\x77\x7c\x34\x9c\x1f\x3a\x93\xf9\x70\x36\x75\x90\x08\x76\x90\x54\x76\xd0\xce\x77\x26\xc7\xe5\x7c\xf0\xef\x63\xf4\x3b\x1e\x47\xc9\x02\xc2\x98\xe4\x71\xe3\xdf\x47\x47\x4e\xd5\xe5\x0e\xc3\x9e\x94\xfd\x4f\x27\x88\x86\xe8\xf7\xd9\xa4\x1c\xcb\x78\x36\x3c\x3e\x72\x66\x47\xd5\xef\x13\xfc\xfb\xd1\xf0\x18\xcd\x69\x32\x77\x46\xc3\xf1\x9c\x0c\x6b\xc4\x7e\xce\xe8\xd0\xf8\xe5\xa8\x96\xa9\xea\xce\xda\xec\xd8\xc6\xf6\xd7\x4e\x0b\xac\x94\x9a\x5e\x55\xbf\xd4\x5f\x00\x2f\xf6\xb7\x70\xbd\xf7\xf9\xe9\x7f\xbb\x8a\xde\x1c\x1e\xbf\x79\x57\x6f\xca\x0b\x68\xb9\x0e\x98\xbc\xf4\x57\x37\xeb\x6c\x81\x00\xe4\x83\x3b\x1c\x59\x57\x4e\x77\x89\x80\xd8\x9a\x6d\x78\xcc\x4a\xf6\xcb\xba\x28\x40\x66\x36\xd5\xd9\x98\xca\x4e\x58\xfa\x4d\xa2\x94\xa0\xd3\xdd\x4b\x8c\x68\xca\xb8\x56\x4e\x65\x99\x34\xcd\x92\xb8\x55\xf5\x93\xd8\x71\xee\x6d\xec\x84\x3b\x39\xb4\x17\x31\xbc\xf1\x63\xb6\x62\xd5\xcd\x0b\xdf\xb8\xfc\x34\xf5\x6e\x32\xe0\x87\x41\xb6\x5e\xdd\xa0\xa2\x3d\x68\xb8\xde\x0a\x24\xeb\x8e\x6e\x4e\x6e\x47\xf4\xbf\xd3\x10\xf2\x2d\xbe\xca\xed\xfb\x76\xfb\xe9\xfe\xf0\x6f\xef\xc3\xbf\x2f\x8d\x70\x10\xb7\x25\x71\x9d\x28\xf7\x2a\xeb\x39\x5a\x6f\xcc\x54\xc6\x72\x6b\xd5\xbb\xd8\x60\xc0\xf0\x8f\x35\x57\xa1\x0b\x90\xa1\x80\x4b\x33\x40\xba\x52\xf6\x0f\xb7\x7c\x03\x43\x56\xf6\xaf\xf0\x17\x08\x48\x8f\x03\x72\x1c\xb8\x4f\xf0\x22\x20\xcc\xe9\x27\x30\x21\xd8\xc7\xc8\x06\x10\x6d\x5c\x21\xd2\xf2\x32\xfa\x02\xde\x71\x36\x42\x8a\x48\x91\x83\xec\x12\x14\x45\x94\x2c\x72\x12\x36\x7a\x89\xf1\xcd\x7a\x72\x0e\x98\x3b\xb0\xb0\xf6\x57\xd1\xfd\x64\x66\xa6\x0c\x30\xbb\x7a\x86\x93\x6b\xd9\x48\x3b\xd1\x55\x30\x14\xb2\x4f\x15\x3b\x0a\x6f\x0a\x36\x59\x51\x3a\xec\x55\x6e\x4f\xf5\xbb\x61\x69\xa9\x54\xef\x16\xd7\x4a\xdd\xf7\x1d\x9b\xdf\x2d\xb3\x4f\xfe\xd1\xdf\x0d\xb1\xa1\xa9\xae\xf4\x6b\xf9\xc8\x8c\x8b\x63\xd2\x3c\x73\xcd\xa3\x0a\xeb\x10\x84\x97\xd3\x4a\x43\x46\xb0\x25\xe5\x96\x9e\xd7\x39\x58\x8d\xbd\x99\x30\x16\x15\x01\x22\x16\x9e\xe0\xfa\xa2\xce\x5b\xbe\x58\x4f\x00\xfd\x18\xe4\x01\x08\x85\x59\xf1\xc0\x87\xeb\x04\x8d\xc5\x58\x00\x42\x0f\x65\xc0\x5c\x03\xc8\x49\xbd\x4a\x63\xe0\xd1\x6c\x05\x0d\xda\x8a\xb4\xc5\x11\x0c\x1a\x0c\x41\x4e\x4a\xe6\xe0\x88\x82\x9a\xfa\x80\x6a\xa1\x9b\xb7\xd0\x41\x2d\x38\xf7\x20\x03\x0e\x88\xa3\x45\x74\x13\x03\xe7\x16\x66\x4e\x55\xc8\xa7\xde\xcb\xc3\xb9\x1d\xe6\xf2\xc0\x9e\x6e\xfc\x28\x66\x89\x48\x62\x66\xb1\x66\x42\x13\xe3\xe8\x1b\xc7\xef\x67\xc0\xf1\x69\x6f\x4e\x94\x38\xa1\x5f\xf8\x18\x15\x9e\x63\x19\x24\x5f\x6a\x12\xf1\x26\x83\x69\xe3\xc4\x90\x0a\xf5\x22\x8a\x09\xde\x7c\x1d\xca\x96\x7e\xcc\x08\x5c\x95\x1b\xd4\x9c\xb2\xd0\x2d\x69\x94\xfb\x6e\x46\xbf\x13\xe3\x0a\x0e\xaf\x09\x85\x5d\xf6\x54\x62\xc0\xd6\x9f\xa1\xf6\x1b\xa6\x04\x93\xbc\xc8\xfc\x28\x29\x76\x9a\x17\x6b\x85\x3d\xa0\x29\xdc\x72\xc4\x0f\x52\x37\xe5\x43\xab\x29\x1f\xd6\x4c\xf9\x10\x75\x92\x54\x55\x66\x85\xbd\xf2\xb0\xf4\xd7\x39\xd9\x2b\x36\xd3\x7a\x0f\x70\x3e\x53\xee\x00\xfa\xaa\x03\x13\x6e\xc0\xda\xa6\x6d\xe6\x60\x78\xd1\x34\x2d\x3b\xce\xd4\xb4\xd5\x9d\x35\x4f\xe8\x3c\x0c\x53\x3f\xb6\x9a\xe7\x71\xcd\xa4\x8e\x51\x1f\xf5\xf3\x0a\x29\xc8\xc6\x4e\x73\x63\x50\x1d\xfc\xd2\x8d\x1b\x26\x38\x1e\xd9\xad\xe4\xa8\x66\x8a\x63\xd2\x4f\xfd\x24\xff\x5c\xc3\xc2\xdf\x69\x82\xbf\x96\x2d\x38\x71\xb4\x8a\x0a\x67\x19\x15\xfc\x2c\x26\xda\x71\x4d\x06\xe3\x66\x71\x97\x07\x50\x38\xee\xec\xc7\x73\x59\xbe\xc9\x8f\x82\x09\xba\xff\x87\xff\x74\xa6\x1d\xdb\x0c\x3f\x5e\x1b\x49\x20\x4b\xef\xb1\x58\x72\x05\x65\xe9\x55\x6a\x01\x3b\x1d\x08\xc6\x0a\x3e\x1c\x50\x94\xfc\x1a\x65\x1c\xd1\xbb\x31\xfb\x9b\xc9\xb3\x9a\x87\x18\x6f\x4a\xbf\xa3\xe5\x44\x30\x35\x30\xab\x8a\x63\x4b\xb9\x25\xa0\x20\x79\x4d\x24\xd1\x89\x3a\xfd\xca\x9f\x5e\x24\x96\xd0\x68\xa9\xd6\xca\x9a\x67\xcf\x7a\xed\x7a\x11\x25\x1e\x57\xc3\xf6\x3b\x80\x57\x3f\xb9\x5f\xc6\xb3\x63\xff\xc8\xa0\xdb\x4a\xd8\xdf\xfa\xb2\xe3\xb4\x1a\x4d\xc2\xea\x0c\x9b\x31\xf1\xb8\x06\x07\xee\x3a\x59\x02\x3f\x2e\x96\xdb\xb3\x2c\xda\x60\x98\x7e\x7d\xf4\x8e\xa2\xa6\x12\x7c\x1f\x87\x2b\x73\x43\xcd\x9a\x24\xec\x40\x2a\x85\x24\xd4\x3d\xaa\x4a\x45\x3a\x21\x48\x41\x12\xe6\xa5\x7c\x63\xa3\x71\x42\x32\x1c\x9d\xa6\x2d\x07\x33\x8e\x31\xbe\x3a\xc8\x0a\xaf\xc8\x22\x3f\x59\xe0\xdc\x46\x96\x03\x26\x94\xb6\x72\xdb\xd6\x27\x34\x51\x2e\x01\x0f\xc5\x53\xed\xda\x3c\x2e\xb9\xee\xfd\xdc\xc9\x40\x1e\x2c\x41\xc9\x82\x26\x18\x6a\x0d\x85\x96\x51\x4e\x38\x5d\x26\x0d\xb1\xfd\xf7\x44\x98\x7b\x3f\xbf\xc8\x00\x58\xa5\x1a\x5d\xe6\x71\xc9\x92\x56\xdd\xda\x12\xe5\x06\xc2\xa2\x37\x8a\xe8\xaa\x36\x09\xfe\x72\x4d\xd9\x76\xde\xd6\x33\xa9\x6c\x3d\x51\x8e\xe0\xb9\xfc\x8c\xd9\x7a\xa4\xca\x9e\xe6\x9a\x02\xae\x5e\x74\xd4\xdb\x43\xe4\xfb\xab\xb0\xa2\xf9\x12\x66\x38\x14\x46\x1a\xb8\x3e\xa2\xad\xf5\xec\x75\x1c\x81\x3e\x9f\x4b\x89\x9b\x28\x42\x47\x63\x4f\x12\x46\x4b\x64\x6d\xd4\x0c\xed\x2d\xf2\x83\x6d\x83\x7f\xfc\x81\x09\x52\xbe\x4d\xeb\x91\xb4\xf1\x9c\x7c\x0b\x9a\xac\x60\x18\xdd\x6e\xdb\xd3\x64\xd6\xaa\xc1\x47\xa6\x42\x02\xef\x33\x5f\x8f\x17\xae\xee\x6c\x21\xab\x01\xa9\x05\x4f\xf9\xf1\x93\x73\x06\x45\x77\xa1\xa0\x36\x2f\x88\xb2\x20\x06\xb4\xa2\x5f\x39\xc5\x28\x59\xe7\xf2\xc7\xd7\xa2\xac\x68\xd1\x0b\x2a\xf8\x1e\x04\xa4\x70\x59\xee\x85\x7e\x82\x23\x8b\xf5\x42\x66\xd0\xa2\xe9\x97\xe4\xf7\x81\xfb\x21\xe1\x3e\xef\x7d\x35\x34\x90\xdc\xe0\x81\x61\x30\xaa\x27\x24\x2e\x15\x44\xcd\x5e\x16\xf2\x87\x89\xc1\xc4\x50\xcf\x98\x24\xa0\x94\xca\x1e\xa9\x5f\xac\x95\x76\xa4\xef\xe6\x4e\x6b\xc5\x1e\x19\xbf\x41\xfa\xe9\xe5\x9f\x95\x54\xac\x21\xb5\x64\x51\x3b\x34\xd1\x16\xd7\x2d\x8d\xf2\x0b\x96\x80\xa9\x9f\x03\x7d\xee\x3d\x20\xf9\x13\x3c\x2a\x05\x77\x30\x0f\x87\xc3\x9a\xc8\xc9\xc6\x75\x19\x70\xc9\xa6\xac\xc2\xb4\x61\x69\x50\x69\x56\x01\x30\x8e\xb6\xfa\x19\xde\xbc\xd5\x95\x6b\xd5\xcc\xa8\xaa\xd8\x3a\x20\x05\xcb\x4d\x8b\xdd\xd0\x88\x4b\xef\x66\xcd\x86\x59\x5d\x1d\xde\x83\x3a\x06\x2a\xfc\xfc\xee\x97\x0c\xae\x53\xd1\xf8\x6b\x5b\xf0\xd1\xa8\xe5\x8f\x25\xd3\x95\x6e\x7a\x1f\x59\x21\x35\x2b\xde\xe3\xa5\x8d\x71\x0e\x1b\x18\xaf\x57\x52\xbd\x15\xf7\x37\x62\x6d\x6f\x90\x26\x6c\xec\xf5\xb5\x31\x15\x69\x73\xcc\x31\xdd\x0a\x94\x97\x44\x5c\x71\x97\x1b\xe2\x93\xbc\xf0\x8b\xfc\x2a\xf3\x83\x3b\x74\x6f\x7e\x12\xe5\xaf\x09\xb3\x97\xf7\x3d\x5a\x06\xcf\x0d\xd2\xb5\x41\x37\xe2\xa1\x45\x0a\xc1\x15\x76\x0b\x8a\x60\x79\x89\x3e\x95\x6b\xce\xf2\xaf\x90\x9a\x77\x4a\xdd\x81\x16\x6b\xfa\xed\xe8\xb2\x02\xab\xf2\x5e\xf0\xad\x49\x23\x0b\x1f\x85\x50\x6e\x00\xe3\x3c\x45\xd5\x3e\xc7\x23\x9e\x38\xff\xfc\xc7\xff\xa7\x6f\xeb\x5a\x4d\x48\x23\xb9\x67\x3c\x80\x06\xa9\x42\xb8\x82\x49\xb1\xc4\x05\x46\x57\x10\x9b\x28\x32\xb8\xf2\x12\x94\x86\xcc\x00\x72\xdd\xaa\xa0\x1c\x5f\x97\x0b\xe5\x7f\xb4\xb6\x85\x68\xac\x15\xfd\xda\x43\x60\x8a\x40\xa8\x71\xcc\xc0\x7e\x9b\x41\x92\xf8\xe3\xc4\x9f\x5d\x7e\xee\x92\xce\xc6\x55\x59\x36\xa4\xb6\x65\x04\x32\x9b\x05\x7f\x9c\xd1\x57\x7a\x73\x6a\xff\x0b\x66\xbc\x91\xbc\xe1\x0a\xfc\xc9\xa5\x1c\x45\xd2\xa1\x9c\x0a\x23\x90\x5c\x57\xf9\x9a\x7f\xf8\x19\x56\xd0\x4f\x44\xeb\xe3\x17\xc0\x45\x85\x88\xb9\x0f\xd8\x7d\xc2\x00\xdd\xc3\x2e\x44\xd7\x2c\xfb\xee\xf0\x2b\x66\xdf\x99\xb3\xe2\xd4\xcb\xc8\x11\x3a\x7a\x96\x60\x93\xc1\xc4\x43\x59\x16\xaa\xb9\x01\xab\xd1\xd7\x4a\x24\x42\xdb\x74\x31\xba\x3a\x41\xf5\x95\xd5\x7c\x30\x96\x32\xa6\x47\xed\x18\xb8\xa4\x12\xe1\x23\x9c\x5e\xa2\x89\x72\xb2\x4d\x30\x09\x60\x12\x20\xf8\xf4\x2a\x6b\x98\x49\xea\x4e\xa1\x4e\x9c\xe4\xeb\x57\xa4\x66\xf0\x61\xeb\x15\xfe\x62\xdf\xe5\xe9\x9b\xe5\xe2\xec\xd3\xf3\x4d\x21\xe5\x93\x98\xe2\x0c\xe4\xc2\xf5\x16\xd6\xb7\x53\x98\xe4\xeb\xd8\x39\x85\x49\x02\x82\xc2\x41\x94\x71\xb4\x65\x37\x2f\xca\xaf\x84\x58\x9a\x8e\xa1\xa2\x8c\xfa\xbd\xae\x69\x06\x16\xe8\x08\xbf\x8f\x8a\x60\xb9\xff\x40\x0f\x4f\x47\xe1\xdf\xdf\x9e\xdf\x1d\x98\x50\x2e\xb7\x39\x46\x8b\x26\x48\x3d\x4b\x78\xff\x1e\x4d\x30\xd7\x38\x10\x94\x78\x36\x5e\xc7\xe4\x6b\x9a\x72\xa1\x66\x82\x5c\x37\x87\x9e\xe5\xc0\xcf\x82\xe5\xf3\x84\x3b\x99\x4d\xb1\x68\x04\xd1\x4a\xd6\x38\x51\x25\x31\x7e\xec\xf2\x0c\x71\x2d\x01\xfc\x44\xf9\x00\xe1\x29\x39\xda\xb3\x7a\x73\x01\x0b\xc8\x1e\xb7\x0a\x14\xd3\xdc\x03\x35\xd9\xbf\x69\x06\x6e\xa3\x07\x9e\xef\x71\x2f\x3f\xf3\x4a\x2e\x3d\x70\x64\x63\xc1\xb8\xde\x5a\xa0\x40\xc2\x65\x64\x02\xa2\x62\xab\x0f\x41\x6b\xb7\xbd\xa4\x8d\xd0\xf3\x26\xa3\x3e\x0b\x0f\x6c\x4a\xed\xfa\x3b\x70\xcd\x6d\xb3\xe7\x37\xf1\xdd\xdd\x9d\x9c\x93\x67\x5b\x58\x5e\xf2\xbc\x51\x6d\x41\x13\x68\x96\x17\x19\x4c\x16\x9a\x7b\x3d\xaf\x61\x58\x38\x1e\x44\x1b\x28\xd5\x96\xf4\x66\x5a\x85\xcf\xda\xd7\xa5\x27\xef\xd8\x95\x56\xa5\xd4\xe0\x30\xa1\xcb\x4b\xd8\x15\x14\xdc\x68\x5a\x87\x51\x97\x42\xac\xcb\x28\x77\xaa\x96\xdb\xb8\x70\x1a\xbb\x45\x90\xec\x51\x82\x28\x53\x55\x29\xd7\x7b\x2b\x95\xa6\x02\x18\xaf\x57\x86\x87\x8d\x8f\x23\xf0\x6d\x62\x17\x28\x7f\x5f\x45\x49\xb4\x5a\xaf\x0c\x8d\x88\x42\xab\x02\x95\x2f\xfc\x85\x63\xb0\xca\x61\xfc\x02\x73\x7d\x6d\xa9\x69\x7d\x23\xd8\x24\x4b\x4a\xda\x6a\xb3\xbd\x15\x73\x48\xf3\xc7\x2a\x31\x9a\x66\x6d\x5a\x36\xd5\x35\xae\xcc\x8b\x97\xf3\xa9\x1f\xe9\xb1\x74\x8c\x6f\x14\x20\x13\x96\x84\x67\xec\xba\xca\x4b\x9a\x6d\xa0\xad\x8b\xa9\xcb\xb9\xd8\xdd\x37\xc8\x2c\xa8\xcd\xb5\xc3\xa5\x99\xeb\xe2\xe8\x1a\xbc\x87\x26\xbc\x00\xe3\x6d\xa3\x96\x14\xbb\x8e\x41\x32\xc0\x36\xf2\xe9\x23\xf1\xc9\x29\x76\x65\xd4\xd1\xc7\xac\xaf\x75\x62\x0f\x7b\x27\xca\x23\x73\x87\xd0\x47\x4b\xfe\xd0\xf4\x6a\x55\x72\xb9\xf1\x0b\xed\xc7\x9a\x0f\x9b\xdc\x6a\xda\xb3\x46\x54\xdb\x88\xf1\x11\x29\x40\xac\x36\x00\xb5\x4d\xb6\xd5\xde\x54\x0d\xeb\x71\x55\x38\xaa\x1e\xec\xbb\x1e\xf7\xfb\x6c\x1d\x05\xbf\x6c\xcf\x65\x3d\x0e\xc6\xaa\xaa\x63\x56\xe1\xc6\x04\xfe\xdd\x24\xa7\xf5\x17\x27\x7a\x5b\x96\x6c\xf3\x58\x27\x1b\xfc\x81\x91\xe4\x9f\x4a\x12\xda\xd0\x95\xfe\x1b\xd9\x1b\x7f\xad\xcd\x49\xd3\xc4\x1d\x2f\xfd\xfc\xb2\x80\x69\x5a\x5e\xb2\xc8\xca\x52\x0b\xbe\xa2\xa0\xda\xaa\xbc\xdc\x5e\x11\x12\x16\xac\x03\xb4\x1c\xc5\x1e\xe6\xbc\x2d\xb9\xd2\x59\xfa\xb9\x93\xe3\xe1\x3a\x7e\x51\x72\x57\x51\x3e\x5e\x40\x2e\x1c\xca\x29\x4a\xad\xaf\xa2\xf4\x50\xbf\x51\x35\x24\xd1\xa4\x30\xdc\xc2\x38\x86\xf7\x1f\xd2\xe7\x55\xc2\xc1\xc0\xbd\xf7\xa3\xe2\x43\x52\x44\xb1\x82\x8b\x6f\x5a\x36\xd9\x9c\xdb\x3f\x69\x83\x92\xa9\x35\x14\x8d\x92\x5b\x68\x24\xe7\x7d\x14\xc7\x94\x8e\x22\x11\xcd\x37\x5f\xdb\x38\x94\x79\x1b\x2a\xd6\x86\xa3\xc8\xf3\x3d\x6c\xd7\xf2\x1f\x7f\xb8\x51\xa9\x34\x6f\x48\x02\xdf\x68\x34\x6a\x0c\xea\x6a\xe6\x17\x15\x7c\x9e\xed\x76\x71\x93\x2b\x7a\x1d\xb7\xf1\x49\xce\x11\x39\x0c\xc8\x94\x6a\x37\xb2\x0a\xa7\xc5\x97\x1a\xe3\x7f\x3f\xe1\xa8\x54\xad\xeb\xf3\x52\x66\xab\x18\x5b\x86\xf8\xe9\xa6\xf9\x9d\x87\xf2\x6c\x26\xa4\xbe\x47\x04\xd7\xf9\x53\xfe\x39\x22\xba\x26\xdc\x55\x54\x27\xa3\x26\x35\x85\x1f\x45\xc2\xa2\xd3\x47\x36\x80\xe8\x0d\x0c\x95\x19\xd9\x4f\x42\x56\xbe\x81\x3f\x75\x55\x67\x9f\x1e\xe3\x28\x03\x08\x1a\x6c\xd7\x43\x99\xee\xf0\x5e\x4f\x66\x54\x74\x14\x77\x90\x7f\x3f\x35\x22\xcf\x3f\x81\x5f\xf3\xd3\xdf\x37\xf5\x2e\x3f\x56\xb5\xe7\x09\xc2\x3d\x63\x3b\x87\xf2\x92\x8d\x67\xab\x64\x3d\x6c\x2b\xa8\x9c\x25\xf7\x51\xb1\xf4\xd8\x65\x1c\x07\x59\xf2\xa5\x9d\x90\xc3\x9c\x2f\x59\x85\x0c\x95\x85\x1f\xc5\xb9\xcb\x1a\x25\x85\xf9\x96\x7e\xfe\x06\x90\x8a\xa6\xad\xb0\x1b\x49\xff\x3b\x1a\x13\x4a\x21\x3f\xad\x37\x28\x70\x61\x2c\x01\x4c\xbc\x5b\xec\x53\xb1\xb0\x1e\x54\xef\x88\x00\xb3\x73\x5a\x01\x9e\x88\x7e\xe2\xdc\xe3\x88\x42\x22\x0c\xae\x07\x2e\x8a\x01\x70\xc8\xae\xd5\x42\x04\x8e\x8d\x2f\xeb\x2e\x7f\xba\x33\xd0\x4f\x02\x10\xd3\x70\xbd\xdb\x08\x27\x5d\x4b\x07\x22\x17\x73\x57\x6f\xff\xb1\xb9\x36\x30\xeb\x8a\x48\x07\x39\x75\xb0\x9a\x52\x61\x11\x7e\xa9\x9b\xdf\xac\xb1\xa9\xde\x2f\x36\xb5\x9c\x36\x31\xab\xc8\xe2\x96\x38\x45\xb9\x28\x9a\x35\x6c\xad\x58\xb8\xa8\x29\xf5\xca\x37\xd0\xb0\x5d\x94\x94\x32\x87\xc2\x58\x57\x7f\xa1\x7a\x3d\xf4\x1b\xdd\x0d\xb3\x80\xba\x0e\xc4\xc6\x03\x32\x25\x3b\x26\x16\x86\x62\xc9\xc8\x28\x83\xc3\x5b\xa7\xed\xd8\xb7\x55\xe3\x06\x2f\x74\x15\x70\xae\xb4\xdf\x69\x67\x34\x99\x0f\x75\x64\x6d\xe4\x64\xd3\x7e\x6d\xc3\xc4\x75\x92\x52\x1e\xd9\x0a\xe4\x39\xad\x64\xd5\xc1\x1c\x50\xe7\xc4\x9f\xa0\xfc\x03\x8c\xe6\xc0\x4e\x3b\xae\xb4\x27\x0d\x2f\x6f\x3a\x50\xd4\xb0\xdc\xcf\x39\xd6\x35\x6f\xe3\x75\x14\xbe\x14\x2b\xa5\xf3\x53\x43\x27\xd6\x80\xf4\xa2\x44\x67\x69\xcd\x71\x13\x86\x28\xf9\x04\xab\x1b\xa5\x66\x25\xd4\xe9\x10\xab\x54\x4b\x51\x57\xbc\xe2\xa5\xc6\x5d\x95\xe3\xf6\x36\x11\xb8\x47\x5c\xde\x46\xcd\xd2\x2b\x40\x8f\xa7\x63\xa1\xf2\xde\xfb\xae\x5f\x3d\x7c\xbe\x78\x35\xb9\x04\x69\xbd\x7e\x25\x54\x52\x7f\xf2\x40\xaa\x03\x3d\xd9\xd2\x5f\x68\xdd\xf7\x92\x4d\xc8\xc9\xc3\xd2\x0c\x99\x03\xd7\xe7\x94\x1f\x8c\x39\x49\x6b\xb1\xeb\xf9\x15\xdf\x4d\x9e\x66\xc0\x17\xb8\x3f\x58\x67\xa8\xe6\x3c\xeb\xd4\xcd\x0b\x90\x3e\x45\x4d\x69\x3a\xd3\xb1\xec\x98\x49\x43\xa5\xcb\x92\xf7\xaf\x58\xe4\x10\x9f\x6b\x93\x27\x7e\x9a\x6e\x6d\xe2\x65\x94\x6b\xbb\x85\xc6\x25\x01\x03\xf3\x5f\x05\x30\x86\x99\x97\xdf\xfb\x45\xb0\x74\x78\x19\x2c\xa2\x72\xa1\x64\x7a\x74\xe5\x2d\xb7\x4c\x01\xc2\xbf\x1b\xcd\xa5\x4a\xef\x88\x91\x24\x33\xac\xd0\xd6\x6f\x86\xb6\xb4\x12\xae\xbc\xca\x0d\x66\x9a\xa8\x77\x9e\xc8\x1f\x9f\x26\x09\x2c\x7c\x05\xb2\xfa\x89\xcf\x7d\x4e\x14\xfa\x81\xfb\x04\xbb\xf1\xab\x77\xd0\x67\xec\x2f\x06\xfe\xc4\xec\xc7\x62\xe3\xf8\x36\x38\x5c\x47\x21\x67\xc6\x46\x2d\x3e\xdf\xd0\xf8\x28\x73\xf4\x1d\xc6\x3b\xa6\x4f\x56\x21\x01\x3a\xd6\x52\x81\x61\xf8\x1c\x38\xa9\x4b\x4d\x75\xe7\x86\xc2\x16\xf4\x56\x6b\xa1\xf6\x17\xdb\xb4\xc1\xd7\xcc\x0f\x87\x36\x5d\xa3\x55\x8b\xba\xc2\xb4\x0f\x8d\xda\xa2\x8b\x28\xb9\x85\x0d\x1d\x2c\x32\xd0\xa8\x91\x34\x9e\xfd\xc6\x3d\x3a\xb9\xe6\x0d\x6f\x79\xe1\xaf\xf8\xfc\x22\x6d\x16\x94\x96\xae\xaa\x3e\x6e\xdc\x98\x55\x97\x4c\xb5\x50\x3d\x24\xda\x4e\x44\x55\xa4\x8b\x7b\xa2\x83\xbe\x50\x37\x9c\x7a\xf5\xa1\x3e\x88\x25\x28\x0f\x11\x77\xe0\xb2\x93\x27\xf4\x0b\xe4\xcf\xe6\x0a\x7e\x01\x7a\xcc\x56\x51\x83\x5a\x6d\xa2\x7f\x0d\x02\xf5\xdb\xaf\xf6\x80\xa2\xa1\xbc\x1b\xf8\xb0\xef\x5a\xc3\x65\xfe\xe7\xdb\xe9\xfb\xb7\x37\xc6\x02\xe4\x01\x4c\x8a\x0c\xaa\xa0\x66\xca\xc9\x83\xa3\xa2\xa4\x9a\x08\x6c\x57\x8d\xd0\xf1\x8e\xc8\xe2\x1a\x36\x0e\x3d\x6a\x2b\xbc\xfc\x2a\x96\x01\x7d\xc6\x45\x33\xa0\xbf\xc5\xf8\x85\xf9\x00\xe3\x30\x2d\x61\x1c\xf2\x0a\x04\xff\x21\x7b\x52\x17\x66\xac\x7b\xb0\x8a\x61\xfe\x0f\x3c\xf8\x2b\xe4\xcc\xa5\xcd\xc0\x04\x0f\x56\x1b\x83\x9c\x83\xe2\x92\x7b\x47\xc0\xea\xcf\xa3\x2f\xa5\xe6\x33\x26\xbe\x80\xd9\xc0\xa5\xc9\x75\xba\x5a\x12\x98\x2e\x5c\xd9\x76\x8c\xd4\xb4\xbe\x15\x08\x8e\xd1\xfe\xc5\x82\x4d\xfc\x78\x82\x18\xf8\x99\x34\x0e\x62\xcc\x70\x4f\xcb\xef\x1c\xb6\x3e\x64\x4c\x5c\x8f\x9a\xd5\xc4\x47\x86\x7e\x35\xb5\x02\x81\xed\xf6\xca\x4a\xdb\x25\x6e\xad\xda\x5c\x3d\xef\xd9\x6c\x03\x32\xcf\x5f\x7c\x27\xe1\x6a\x07\xd3\xcd\xe2\x24\x1b\xbd\x56\xea\xb5\x55\x96\x3e\x05\x54\xd0\x2a\xd1\x1c\x13\x22\x1f\xe2\x9f\x9c\x9a\xb5\xc0\x47\x41\x4d\x84\x80\xfc\xa8\x26\xe7\x4e\x0d\x41\x13\x53\xd3\xa4\x16\x72\x3e\xbc\xa8\xe9\x5d\x3e\xad\x8d\x0e\x36\x7f\x8d\x31\x37\x4b\xdd\xf1\x2a\x43\x41\xe8\x2f\x4a\x36\x94\xd3\xd8\xa4\x16\x29\xb9\x26\xa3\x51\xfa\x80\xdc\x6a\xd9\x3a\x09\xfc\x82\x1a\x87\x0d\xc3\xf5\xc3\x30\x03\xb9\xed\x78\xe5\xb9\x82\xec\xf6\x02\xe5\x9a\x77\x79\x9b\x43\x93\xe9\xf4\xfe\xc6\x90\x43\x28\xed\xdd\x2a\x93\x2a\xba\x6d\xbd\x71\xc5\x1d\xf6\x18\xdb\x37\x5f\xdf\x24\xfe\x66\xdf\xf7\xee\xfb\xec\x27\xb8\xf9\xf8\xe1\x83\xf1\xd4\x2d\xfc\x9b\x1c\x01\x8a\xe2\xe9\x18\x0e\x5f\x0a\xdc\xa7\xaf\xc9\xc0\x5d\x59\x55\x3b\x80\x9a\xd2\x8b\xf5\xbe\x53\xa6\x8e\x8b\x62\x60\x48\xaa\xd6\xb0\xa8\x6c\x2c\x1c\x48\xae\x3b\x7e\xd7\xe4\x9e\x79\xb7\x01\x59\xa9\xa5\xb9\x7a\x39\xf0\x78\x63\x5e\xc1\x24\x2a\x60\xd6\x6d\xd4\x6f\xc8\xcb\xa6\x41\x2b\x47\x9c\xcd\xae\xe9\xb4\x61\x30\x13\xf4\xbb\x5b\x0a\xbf\xc8\x91\x77\xd2\xa3\x3a\xf9\x7e\xef\x98\xf0\x26\xfc\x65\x12\x4c\x2e\xea\xad\x5b\xc8\x58\x44\x0c\x4a\xd4\xa2\xa5\xda\xb8\x90\xbe\xcf\x12\x1a\x44\x8b\x18\x55\x88\x9e\x84\x20\x0f\xb2\x28\xa5\x16\x8a\x87\xcb\xf2\xc6\x80\x9a\x61\xbf\x3d\xbc\x40\x37\x12\xf4\x21\xf9\xf5\x5a\x2a\x7a\xcb\x5f\x35\x2b\xf7\xc5\xf5\xc0\x4d\x41\x16\xe0\xe8\xd9\x52\x5d\xa3\x7f\xba\xd7\x04\x20\x72\x80\xed\x6f\x28\xe1\xd6\xb9\x8a\x56\xc0\xb9\x44\x43\x74\x4e\x89\x29\x92\xe5\x52\x54\xa3\xbc\xd6\x43\x5f\x93\x91\xd3\x8c\x0a\x25\xd3\x90\x7f\x76\x6b\x7a\x96\xb6\x45\xa7\x59\x7d\xc4\x66\xde\x60\x0f\x94\x2c\x16\xeb\x1c\x9c\x61\x46\xd0\x16\x2c\x3b\x66\x86\x2b\xc5\x6a\x48\xd7\x18\x19\xd3\xd8\xd6\xe7\xa8\x3e\x6d\x0a\x8a\xe2\x23\x72\x8e\x07\xc7\xf8\xe5\x99\x9a\x0c\x37\xe3\x8d\x8b\x5d\xc6\x3f\xef\xc5\x04\x69\x61\x84\xb4\x36\x43\x56\x37\x2a\xc1\x16\xe9\x32\xc2\x5d\xab\xa6\xc8\x23\x3b\x53\xa4\xa5\x31\xf2\xc8\xc6\x18\x69\xb4\xf2\x50\x5c\xcd\x46\x9f\x2e\x59\x5c\x52\xe4\x6b\xae\x2e\xee\x5c\x93\xd7\xa8\x95\x1f\x82\xb4\x30\x18\x32\x06\xee\xbf\x63\xbe\xff\x77\xca\xf8\x5a\xc3\x06\xb2\x67\xdc\x44\x28\x34\xa5\x4b\x9e\xa3\x22\xb5\x7b\x3e\x13\x40\x9a\x82\xcc\xa3\x57\xda\xfd\x3e\x0f\x7e\xfd\xfd\xf0\xdd\xc5\xa9\xaf\x24\xeb\x70\xd5\x30\x4b\x3e\xa3\x2e\x65\x61\x72\x5e\x25\x40\xf9\xd2\x6f\xd7\xd7\xd5\xdd\x5a\x78\x5c\xda\x4b\x7c\x21\x00\x55\xc9\xe6\xcd\x17\xee\x2a\xe2\xa2\xf0\xcb\x3f\x98\xe9\x60\xe5\x73\xda\x54\xf9\x87\x6a\x72\x40\xc1\x6c\x89\x1f\x7f\xc4\xdb\x88\xbe\x59\xe5\xbf\xb3\x53\xa0\x4a\xa6\xbe\xe6\xeb\x80\xee\x36\x6b\x61\x22\x30\x79\x01\x83\x75\x6e\xb2\x74\xc4\x20\x28\xc8\x30\x2b\x73\x00\x7a\xed\x6f\x60\xfb\xc1\x90\xa4\x9d\x81\x1c\x14\x57\xe0\xa1\x38\x27\x3d\x89\x6f\x9e\xd6\x14\x2e\xcc\x81\xda\x1d\x32\x59\x24\xeb\x92\x53\x75\x86\x14\xad\x19\x85\x66\xbe\x8a\x1f\x0a\x89\xaf\x28\x8e\x60\x45\x8d\xf5\x95\x00\x15\x89\x45\xfe\xa2\x29\xf2\x15\xa9\x03\xd9\x48\xc5\x2d\x9f\xe6\x04\x0e\x35\x48\x05\x42\xe2\xbf\xc4\x13\x0a\x73\x89\xc1\x7e\xcd\x56\x21\x7e\x7a\x22\x29\x15\xeb\x0f\xa7\xf7\x0a\xd6\x72\x02\x9e\x95\xc6\x7e\xa4\x96\x96\xd6\xa9\xc9\x1d\x56\x01\x05\x57\x7c\xd3\x55\x98\x5b\xad\x02\xd9\xc8\x6d\x57\x81\x9f\x5e\xd7\x55\x48\x63\xfb\x45\xa8\x2d\xcd\xcf\x59\xe0\x11\xfe\x49\x8c\x6e\x5d\xcc\x68\xb7\x28\xda\x86\x45\x0a\x8b\xd4\xf3\x99\x95\x01\x7f\x15\x25\x0b\xef\x36\x8a\xf7\x3e\x33\x61\x33\x0d\x3f\x5c\x3c\xff\xb2\x94\x0f\x2d\x43\xea\x4c\x0c\x11\x38\xc7\xc0\x85\xeb\x02\x09\x48\xa2\x2b\x75\xcf\xa8\x17\xc9\xd5\xef\x4a\x6c\x16\x5e\x5a\x2a\x75\x59\xb2\xf7\x97\xc9\x75\x3c\x4f\xa2\x2f\xd9\x61\x6d\xf5\x4d\x6e\x42\x54\x22\x2d\xb1\xb3\x8c\xd6\x17\x9e\x0d\xdc\xfb\x28\x2c\x96\xfc\x07\x3d\x56\xe8\x24\xf6\xb8\x81\x3b\x1e\x8e\xe5\xfd\x4f\xc5\x68\x08\x6e\xe5\xd8\x51\xba\xdd\x29\x5a\x38\xae\x99\xc7\x4d\x63\x5c\x4a\x3f\x7f\x01\x13\x3f\xf6\xf2\x22\x8b\x52\xe0\xd1\xc2\x17\xf4\xc9\x0f\x49\x84\x73\x94\x72\x90\x5d\xa6\x7e\x00\xde\x25\x1f\x30\xb6\x0e\x3f\xe9\xf1\x48\x21\x8c\x08\xd5\x24\xba\x75\x56\xd4\xfd\x59\x92\x29\x8e\x92\xbb\x9f\x97\x19\xb8\x25\x96\xcb\x9f\xd1\xd7\x25\x7d\x7e\x7a\x58\xc5\xff\xe3\xc6\xcf\xc1\xe1\x6c\x70\xf1\xf2\xed\xe4\xf7\xed\xb3\xd9\xcd\xa7\x87\x75\xf0\x65\x94\xf8\x2f\xdf\x8f\x82\x33\xb8\x79\x3d\x0d\xa7\xe1\x76\x3e\x7d\xb3\x9d\x6f\x82\x55\xb0\x79\xf3\xf9\xe9\xfd\x9b\xd3\x93\x2f\xe1\x2a\x48\xce\x5f\x86\xe9\xef\x2f\xdf\xc3\x8b\xcb\xe0\xe1\xcd\x69\xb0\xf0\x7f\xf9\x98\xfe\x3e\x59\x8e\xc8\xdf\x3f\x9d\x46\x4f\x17\x17\x2f\x5f\xc5\xbf\x4d\x7f\x5d\x84\x93\xf8\x2e\xfc\x65\x71\xf2\xea\xcb\xf3\xfb\x57\xdb\x67\xf0\xf7\x4f\x71\xe2\xbf\xfc\x95\xfe\xbd\xf2\x3f\x3d\xe4\x17\x97\xe1\xd4\xff\x25\x1e\xfd\x7e\x19\x6c\x2e\x16\x70\x71\x7e\xf6\x70\xff\xdb\xdf\xdf\xc3\xf3\x5f\x7e\x3d\x79\x35\x1a\x15\x6f\x2e\xef\x1f\xce\x7f\xb9\xdf\xbe\x3e\x1d\x6d\xcb\xb6\xcf\x4f\xab\xff\xaf\xae\x9e\xe6\x6f\xae\x9e\x2e\x6e\xce\x9e\xdf\xbf\x3e\x1d\x3d\xbc\x79\x0a\x85\xef\xcf\x9f\x8f\xe6\xaf\xcf\x9e\xb3\xf7\x5f\x6d\x9f\x7d\x09\x5f\xbe\xda\xf8\x93\x0f\x27\xaf\x26\xaf\xf2\xdf\x3e\xbd\xcd\xb8\xcf\x8a\x6a\xbc\x6f\x92\xd7\x5f\x66\x7f\xbb\xc0\x73\xfe\x49\xcb\x53\xe3\x93\x93\x93\x03\x44\x68\x46\x75\x9e\x53\xb7\x3a\x3e\x6e\x58\xd2\xa9\xc4\x81\x06\x14\xb8\xf2\xd2\xe3\x67\xbf\x64\x7e\xc8\x32\x1d\x71\x99\x64\x3f\xf7\x16\xe2\xa7\xe3\x52\x0d\x0c\xe0\x6a\x05\x92\x10\xc3\x62\xa1\xcb\x92\x47\xa3\x37\xe5\xe7\xdd\x87\x09\x1a\xd3\xe8\xbf\xb3\x79\x4c\xd8\x44\xf4\x76\xd0\xbc\x80\x0c\xd2\x04\xde\xde\xe6\x08\xef\xbc\x7a\xbf\xfc\xda\x43\xb7\x61\xb7\xbc\xb1\x66\x7f\xf1\xbc\xdb\x75\x1c\xe3\x8f\xfe\xaa\x77\xc9\x35\x34\xce\x0f\x4f\xd7\xbc\x1f\x25\x45\x6d\xfb\xca\xed\xb7\x47\xca\xd2\x30\xd5\x6f\x43\xd9\xc6\xa9\xef\x48\xda\xa6\x95\xd3\xb0\x6d\x1b\x43\x6e\xcb\xe3\x96\x3b\x13\xed\x0e\xdb\xff\x66\x77\xd8\x16\x7e\x7e\xe7\x2d\x32\xb8\x4e\xbf\x07\x4f\xe5\xd3\x37\xd1\xe9\x97\x20\xff\xbd\xc6\x53\x29\xc7\xcb\xb6\xf2\x5a\x62\xdb\x3f\x05\x22\x1d\x56\xc4\xd1\xe8\xda\x08\x17\xa1\x02\xb9\xa4\xf0\xa4\xca\x57\x96\x80\x31\xae\xa0\xb0\x19\x20\x40\x6b\x62\x6c\x1b\x5d\x90\x06\x18\x64\xb1\x5f\x25\xa0\x5a\x32\x56\xf2\xe3\xca\x03\x5f\xce\xfb\x24\xfd\x8e\xc4\x9b\x15\xbe\x78\x78\x37\xe5\x1a\xe7\x5e\xbe\xf4\x43\x78\x1f\x83\x3c\xa7\x39\x86\xce\xcd\x7a\x55\x2a\xf5\x31\xb8\x2d\x68\x6c\xbe\xe6\xc2\x9a\x61\xa4\xc8\x33\x90\xc6\x70\xbb\x92\x42\xf4\xd0\xbd\x05\xc5\xe2\x38\x68\x25\x4a\x52\x27\x3a\x50\x58\xee\xc3\x6b\x2e\x18\x94\x21\xca\xa3\xda\xf2\x04\xb3\xb9\x2e\xc6\x83\x3c\x7f\x45\x72\x24\x6b\x6a\x96\xef\x66\x26\xc0\x78\x14\x0c\x2e\xef\x01\x15\x06\x14\xcb\x7c\x69\x2f\xa1\x22\xc6\xdf\x1b\x8a\xfb\x51\x71\xe8\x63\x92\xd3\x74\x51\x9d\xf3\x41\x24\x25\xab\x9d\xe1\x94\x02\xab\x8b\xaa\x2e\x1c\xf0\x50\x35\x1a\x58\x80\xe4\x35\x05\xff\xed\x68\x53\xe8\x69\xc9\xfc\x87\xbd\x5c\xb2\x0f\xe9\xce\x0b\x26\xd8\x17\xba\xaf\x97\xf6\x7c\xd5\xe7\x82\x1a\x11\xca\x79\x89\x85\x8f\x88\x84\x33\xb4\x5f\x0b\x1e\xe4\x23\x6d\x42\xeb\x29\x4b\x6f\x43\x99\x7f\x6f\x59\x29\x15\xad\xcc\x5c\xaf\xe8\xe9\x23\xc5\x3f\xd6\xa8\x0d\x0d\x01\x2a\x5d\xa0\x96\xf5\x8d\x92\x35\x3a\x36\x0c\x3e\x03\xc8\x8d\x1c\x9e\x5e\x7c\x30\x17\xf6\xaa\x69\xf7\xa4\xa1\xdd\x37\x18\x50\x98\xba\xff\x0a\xb2\x02\xee\x9b\xe8\x99\x6b\x19\xf3\x63\xd9\xd3\xf3\x74\x09\x56\x20\xf3\xe3\xb3\x28\xbf\xb3\xee\xd0\x10\xbd\x42\x13\x7d\x31\x04\x25\xaa\xc0\x84\x42\xcd\x79\xeb\x57\x15\xa7\x26\x42\xff\xae\xf3\xf2\x58\xac\x42\x52\x59\x7d\x16\x6f\x09\xb2\xe2\x8b\xee\x8b\x9b\x6d\x81\xd6\xb3\x8d\xfa\x28\x6a\x79\xbd\x5a\x6b\x50\xd3\x31\xdc\x7b\x5c\xcb\xd3\xec\x97\x4f\x17\x6f\x2f\xcf\x0d\xe8\x87\x09\x24\x78\x94\xfa\x82\x49\x23\x4e\x8d\x2a\xa2\xdb\x88\x54\x8f\x89\x72\x8f\xe1\x61\x37\x85\xe9\xd7\xe1\x77\x19\x1e\xae\x93\xa8\xa6\x2a\xa3\x33\xfe\xa5\x53\xc4\x88\x0e\x82\xdc\x76\x62\xb8\xc8\xb5\xa7\x9e\x18\x63\x4e\x5e\xbd\x5a\x02\xf4\x06\xaa\x9d\x89\xe0\x31\xca\x95\x46\x75\x29\xa3\xc4\x47\x05\x29\xa2\x9b\x18\x0c\x9d\xd3\x25\x08\xee\x9c\x62\x09\x9c\x00\x26\x21\x4a\x42\x76\xe0\x2d\xfa\x20\x81\x21\x40\xbf\x54\x5c\xef\x44\xb9\x03\x93\xa1\xf9\xf4\x6d\x91\x50\x6a\x0f\x6c\xa6\x3d\xd7\x85\x43\x9a\x26\x24\x34\x5b\xd8\x75\x56\x7e\x89\x7b\xb4\x50\xca\xe6\xc3\xf2\xdd\x9d\xbf\xb5\x25\x88\xfe\x3e\x6f\x3e\x04\x5b\x62\xe0\x11\x42\x19\xe0\x3d\xc7\x63\x61\xf8\x87\x92\x86\x5f\xa3\xbb\xaf\x70\x5d\x8d\xf2\xa6\x1d\xc2\xca\x43\x37\xa0\x70\x23\x44\xdc\x4e\x24\x0a\x61\x88\x66\xc9\x5d\xf7\x86\xd4\xd7\x10\x5b\x62\xe3\x65\x9f\x6b\x49\xd7\xcb\x0c\x40\x96\x09\x33\x10\xb2\x59\x5a\xce\x81\x6f\x8b\x9f\x03\xfe\xdc\xce\x98\xc3\x85\xce\xaf\xe3\xd8\xcb\xa4\x02\xc0\xb2\x39\xc4\xbc\x0b\xee\x97\x11\x81\x8f\x69\x72\x33\x2d\x60\x01\x5f\x62\x0e\x6a\x62\xef\x97\x94\xd1\xf4\xc6\x99\xbe\x46\x73\xe5\x47\xb1\xc5\x68\xc8\x63\x8f\x39\x1a\x9c\x1b\x76\x89\x3c\x24\x92\x2f\x5a\x07\x7d\x20\x38\x68\xd0\xa9\x8c\x3d\x2b\x88\xdb\x2e\x0b\x14\x3b\x72\x49\x74\x13\xb7\x94\xc9\x4e\xce\x3d\x52\x33\x55\x03\xf6\x0f\x4a\x4b\xb2\xe9\x7b\x05\xc2\xc8\xf7\x52\x7f\x9d\x23\xc0\x6d\xfc\x57\xec\x53\xdb\x49\xb3\xd6\xde\x2c\xac\x74\x2a\x5d\x3d\x7a\x66\xb9\xdb\xb2\xbb\xf2\x27\xb2\xd0\xdd\xd0\x9c\x67\x83\xf1\x87\x4f\x57\x62\x13\x45\xc6\x1e\xac\xae\x73\x33\xae\xf6\x3a\x79\xf0\x9a\x2f\x49\x51\x3e\xf6\x86\xc8\x80\xea\x92\xc6\x13\x4c\x8d\x15\x6b\x44\x71\x63\xfa\x21\x46\x33\x47\x45\x33\x99\xaa\x28\x79\x24\x3b\x68\x7c\x31\xec\x17\xf0\x1a\x35\xfa\x1d\x98\x09\x17\xc7\xbf\xfd\x74\x1e\x3c\x28\xde\xd1\x36\x55\x2f\xe7\xa2\xd1\xcb\x1d\xb8\xb8\xb6\x24\x41\x29\xe5\x2b\x69\x69\xc0\xb9\x9a\x2b\x15\x6a\x71\xb0\x74\x1d\xd2\x42\x07\x55\x95\xcb\x3a\x7b\x53\x4f\xd5\x2d\xbb\x5e\xad\x9b\x2c\x8d\xad\x0b\x16\xe2\x91\xea\x51\x49\x87\x98\x4e\xba\xd3\x9a\x50\x50\x5f\x92\x06\x63\xcd\x77\x35\xcb\x6a\x2c\xb2\x1a\x23\x29\x12\xa7\x44\x29\x44\x30\xf6\xa6\xd8\x4e\x51\x44\x55\x8b\xc3\xd9\x44\x5d\x9b\x28\xd4\xb6\x36\x61\xb3\x0d\x98\x0c\xbf\xbc\x9e\x2a\xb3\xb4\x69\x4f\x4f\x0d\x86\xfa\x10\xfb\x79\x81\x25\x81\x90\x9b\x2a\xef\xa1\xb6\xef\x2b\xc4\x51\x01\xf3\x80\xfe\x7a\xf0\x16\x3a\xa4\x99\x5a\xe6\x6f\x4b\x4d\x09\x79\xae\x71\x2a\xed\xd0\xb6\xcd\xa6\x2c\x35\x95\xc3\x6d\x40\x7f\x13\x47\x47\x7e\x60\x4b\xd2\x1b\xb8\xd6\x61\xbf\xc9\xa0\x6f\xf6\xe8\x06\x2a\x62\xb9\x26\xf2\x97\x01\x3d\xe0\x41\xe8\x01\x5e\x7e\x36\xc7\xf8\xba\x22\x5e\x65\x94\x9f\x5e\x9e\x9b\xb2\xd7\xed\x6a\x07\xe6\xd1\x90\x98\xd6\xc8\xcf\x4a\xec\x9c\x70\xe4\x1c\x73\x29\x04\x0c\x7f\x2c\xca\x2f\x40\x86\x80\xed\x18\x59\x9f\x3f\x14\xa4\xb2\x36\x87\xb8\x47\x5e\xb8\xbe\x96\xa6\x7f\x06\x82\xd8\xcf\x28\xc2\x41\x4a\xdb\x92\x05\xda\x40\x04\xc8\x55\x3a\x42\xa2\xc1\x7d\xc2\x01\x85\x2a\xb5\xf0\xec\x0a\x1b\x68\xce\x9a\x3d\x9f\xb6\x96\xcf\x6c\x51\xa3\x45\x8e\x64\xa3\xd5\x89\x07\x03\xb0\x00\xc3\x17\x51\x60\xf7\x6d\x8d\xbe\xf6\xd5\xde\x4c\x47\x11\x5f\x66\xed\x0f\x1e\xb9\x74\x3c\xe6\xf9\x97\x37\x6a\x04\xe9\x9a\xaf\xfa\x38\x6d\x28\xdf\x66\x55\x1e\x92\xaf\x37\xc2\x57\x79\x7b\xcc\x6a\xcf\xa7\x70\x1d\x87\xc9\xff\xfb\x7f\x17\x4e\x00\xe3\x18\x04\x85\x43\x6a\xd2\x59\xb8\x2b\x1e\xa9\x46\x78\x6d\xa9\x02\xde\x03\x81\x1c\xa6\xc8\x7d\xd4\x5c\x67\xa7\x0e\x59\x75\x3c\x95\x16\x16\x45\x64\x71\x9b\x5e\xda\x1e\xce\x81\xb8\x5b\x06\xda\x86\x4a\xee\xa2\xac\xa0\x77\x0e\x68\x15\xd5\xea\x30\x48\x33\xb8\xc0\x59\xae\x55\xee\x3f\xfe\xc4\x89\x2a\x1c\x5a\x44\x00\x32\xc5\x89\xa8\x29\xe3\xa9\xb0\x9c\x27\x16\x82\x8e\x83\xe2\x5d\x25\xda\x4d\xb3\xab\xb5\xcd\x68\x07\x6c\x0b\x74\x53\xa5\x29\xb7\x50\x9a\xbf\xf6\xee\x5e\x55\xce\x96\xfd\xd9\xe0\x15\xb7\xff\xd7\xdb\xe9\x3b\x6e\xf0\x99\xba\xb6\x9d\xf7\xf8\xac\x61\x8f\x37\x39\xea\x76\xda\xf5\xd8\x98\xda\xb0\xef\xd9\x0c\x77\xde\xfa\xba\x96\x1e\x67\xf7\x5f\x73\x0a\x2d\x33\x03\x31\xec\x7e\x4d\x81\x51\xc1\xb1\xc8\x15\x90\x13\xd0\xf0\xf4\xa0\xc3\xac\x2e\x1e\x79\x14\xf7\xeb\x25\xb8\x14\x97\x06\xd2\x58\x72\x37\x76\x76\x32\x3e\x8a\x7b\xf1\xfb\x48\xc5\x7f\xf5\x10\xcd\x9f\xfd\xb2\xfe\xb8\x2f\xa9\xf8\xb9\x2e\xaf\xbd\xc6\x92\xc2\x12\xf3\x0d\x91\x6e\x96\xf6\x94\x6f\x96\xc6\xdf\x7a\xbe\xc8\x21\xfa\x15\xa6\xfb\x1a\x39\x5e\x3b\x4d\x95\xd6\x52\xe5\xcc\xf5\xb7\x51\x0c\xf2\xd7\x51\x72\xf7\x94\x75\x2a\x0c\xa1\x93\x15\x6d\x78\x9b\x7b\x19\x84\x3a\xfc\xa1\x5e\xac\x69\x2f\xca\x41\xf7\x0b\x80\x20\xc8\xc7\x0e\x92\xea\x11\xb0\x10\xb0\xe3\x67\xdf\xe5\xd4\xa7\xcd\xbb\xc3\x15\xf8\x4d\x09\xa2\x15\xb2\x34\x83\x25\x08\xee\xf8\xcc\xd0\x28\x7f\xca\x71\x98\x3e\x7b\x54\xa8\xce\xcb\x69\x39\x42\xf6\x67\x20\x25\x63\x8e\x54\x70\x45\x98\x5c\x61\x4a\x0a\xe6\x30\xe4\xe5\x42\xe3\xba\x81\x5c\xcd\x44\x45\xad\xe6\xd5\xca\xb2\x15\x73\x0e\x27\x9f\x7e\x5b\xb1\x9a\x2e\x9d\x8d\x39\x6a\xba\x24\x5b\xe3\x61\xf4\xcc\x69\xa4\xae\xf8\x7e\xb3\xda\x9b\xc5\x66\xf3\xf4\xee\xef\x32\xab\xb5\xa8\x0c\x42\x85\x0c\x75\x2f\x6a\x0f\x4d\xcd\x3a\x32\x8d\xcb\x98\x9b\xd8\x76\x0d\xd1\x40\x7b\x5e\xc4\x14\x7a\x9b\xe8\xcb\xbe\xaf\xe2\xf3\x62\x53\x8c\x16\xef\x8f\x84\x55\x1c\x63\xc5\xa6\x8a\xa0\xa0\xb3\xe1\xd0\xd5\x89\x8f\x34\x2a\x2f\x53\xa7\x24\xa2\x09\x9f\x56\x39\xfa\xcc\xa3\x61\x4e\x68\x5d\xa5\x40\x09\xe4\x03\x89\xe2\xf0\x0a\xa6\x30\x86\x0b\xe1\xaa\xaa\x3e\x4a\xaa\xa1\x3f\x8f\x49\x18\xae\xfc\xac\x90\x93\x0b\x0a\x90\xad\xa2\x04\x7c\x8c\xc0\x7d\x49\xf6\x53\x56\xcd\x41\x89\xc4\x90\x3c\x57\x7c\x79\x34\x1a\xd0\x35\x70\x9f\x44\x05\x58\xa1\x5f\xee\xa3\x62\x79\x99\xfa\x01\x75\x28\xd7\x12\x62\x8c\x46\xc5\xe2\xc9\xc9\x34\x79\xfc\xad\x9c\x0b\x14\xb5\x42\xf3\x9e\x49\xf0\x26\xe4\x0a\x8d\x5d\xdd\x7c\xf7\xe8\x93\x33\x90\x20\xd7\xfe\x13\x9c\xa2\xc5\xe0\x68\x60\x52\xd5\x61\xb9\xa4\x95\x61\x85\x4f\x49\x0a\xbf\xf8\xe1\xb3\x78\x9d\xe1\xcf\xde\xc2\x10\x90\x17\x45\x44\x15\x8a\xc3\x8c\xc7\x75\xae\x90\x84\x3b\x49\xd0\xd8\xae\xb5\x04\xe2\x87\xcb\x3d\xe1\xe7\x39\x0c\x22\xbf\x00\xd5\x90\xc4\xfa\xbf\x4b\x78\xcf\x83\xa8\x90\x8f\x97\x51\x08\x34\x1f\x97\x4f\x97\xf3\x38\x23\xb5\x3b\xea\x90\xa3\xb9\x3b\xa3\x12\x55\xcc\x01\xa5\xa0\xac\x29\xce\xd6\xe1\xdf\xe4\x30\x5e\x17\x40\xda\x32\xcb\x68\xb1\x44\xa1\xe2\x62\x19\x2f\x82\xa7\x8a\xc2\xcd\x2b\x6d\x0f\x77\x31\x97\xf3\x12\x2e\x8b\x6d\x0c\x14\x47\x31\xb2\x1f\xcd\xaa\x9d\xa0\xef\x49\x6b\xb5\x10\x8a\x9e\x95\x3b\xb8\xf0\x8b\x28\x68\x70\xf6\xec\x00\x33\x33\x70\x5f\xe1\x28\xf6\xee\x00\x31\x13\xb9\x68\xe0\x67\x78\x23\x7b\x6f\x0f\x5c\xf3\xe3\x2c\x72\xf8\x6d\xf5\x46\x23\xbe\x8c\x64\xa2\xd3\x54\xd5\x7e\x4b\xfd\x2e\x0a\xde\x8f\x25\xe9\x6c\x88\xf7\x96\x8f\xfc\xb7\xad\x48\xd9\x92\x88\xd4\x79\x94\xd4\x91\xa7\x31\x96\xa0\x9a\x7c\x2f\x5c\x43\x6d\x53\x9d\x19\x47\xf2\xdb\x4e\x44\x5b\x69\x73\x9c\x78\xad\xd1\xa8\xa7\x49\x22\x23\xfb\xae\x33\x3c\xe2\x66\x28\xf8\x7a\x5a\xcc\x47\xb7\xb6\x93\xca\x19\x26\x7d\x6d\x82\x1b\xaf\xab\x8c\x38\x1e\xb3\x6c\x7a\x1c\x31\x42\xad\xa5\x58\xdb\xf0\x40\xb8\x00\xe8\x7a\xab\x9e\xf3\x19\xc8\xa3\x2f\xe0\x39\x7e\xc0\x70\xb4\xf3\x4b\xb2\xa0\x6a\x68\x91\xf9\x49\x7e\x0b\xb3\x15\xc5\xfc\x41\x1f\x94\x8a\xd1\x5f\x38\xe4\x9b\x70\x01\xde\xd1\x64\xd2\x07\x24\xa0\x07\x86\x6f\x51\xf0\x87\xfb\x57\xbd\x38\x9e\x68\x3d\xc9\x7c\x06\x03\xc1\xd1\x16\xe7\x61\xf4\xc4\xf3\x33\x4a\xfd\x62\x59\x49\xed\x72\x4c\x74\x8a\x21\x03\xea\xd2\xdd\x8d\xca\x53\xd0\xae\x58\x4a\xc3\xe6\x96\x91\x42\xc2\x40\x76\xd8\x92\x41\x09\x61\x71\x61\x14\x7a\x51\x92\x03\x04\x75\x75\x1f\x25\x21\xbc\xf7\xf0\x62\xba\x03\xf7\x36\x06\x0f\xde\xca\xcf\x61\x82\xcc\xb6\x94\x11\x0e\x04\x75\x27\x06\x85\x39\x77\xa2\x26\xdb\x42\x67\x4d\x6d\x7b\x51\xc0\xe3\x79\x94\x9b\x82\x30\xc9\xfd\xbe\x34\xcc\xb7\xc9\x9f\xc5\xcb\xbf\x7d\x36\x5a\x43\x85\xe0\xce\x6a\x3f\xf3\xe0\xb3\x4d\xb9\x5a\x6a\x40\x7b\xa9\x55\x2d\x51\x7d\xc7\x1a\x1b\xaa\xb6\x68\x3e\x8d\x88\xd0\x1e\x64\x8a\x4c\x15\xa2\xb3\x14\xb8\x15\xc6\x57\xbc\x22\xca\xa5\x64\x91\x3d\x85\xbe\xd5\xa5\x64\xb4\xe8\x0e\x0d\x1b\x86\x40\xd7\xfe\x5b\xf4\x79\xbb\xe6\x51\x60\xad\x1f\x02\x5d\x56\xd5\x88\x97\x49\x8b\x45\x06\x16\x7e\xc1\xcf\xf1\x3d\xc0\xd1\x11\xa8\x3a\x62\xf3\x91\x59\x29\x5f\xb5\xed\x97\xb3\x68\xdd\xf2\xa0\x26\x2a\xd2\x76\x0a\xca\x99\xa8\x0c\x58\xdf\x9a\x3c\xe0\xda\xb3\x55\x59\x9e\x06\x26\xc7\x85\x9f\xb4\xac\xad\x46\x32\x29\x37\x54\xee\x4a\x3a\xe1\xee\x9f\x15\x13\x35\x17\xec\xd6\xdf\x35\x13\x16\x50\xfd\x15\xef\x94\x53\x3c\xfa\x19\xfe\x31\xc7\x3f\x0e\xf1\x8f\x23\xfc\xe3\x18\xff\x38\xd1\xdc\xdd\xc8\xed\x6d\xaa\xa9\xb3\xd5\x60\x8b\x6e\xbc\x5a\x7f\x6d\x6a\xd0\xc3\x53\x70\xde\xa9\xae\x3d\xf1\xe0\x44\x27\x2d\x3b\x58\x12\x1c\xda\xde\xe5\xa4\xe3\x0e\xa5\xc7\x39\xf4\x30\x39\xf7\xfb\xb8\xfb\x70\x0f\x93\x67\x93\xe7\x6b\x3b\x1b\x99\x87\x32\xe3\xc8\xad\x7f\xae\x2b\x71\x2f\xc9\xf3\xf2\xc6\x0d\x56\x69\xb1\x35\xda\xca\x32\x10\x43\x1f\xc9\x1e\x83\xae\xeb\x8a\x81\xed\x63\x5d\x88\xec\xc4\x7c\xe5\x50\x8b\x15\xd2\x12\xfc\xf9\x59\xe6\x47\x89\x52\x01\x5c\x7b\xd2\xd4\x46\x6f\xc4\x11\x48\xca\x03\xc8\x09\x59\x83\xca\x19\x34\x65\x85\xab\x3d\xb8\x2e\x68\xe1\x75\x4d\x01\x6b\x53\x02\xaf\x1c\x21\xc3\x57\xc9\x64\x33\x7a\x1e\x47\x8b\xe8\x26\x06\x86\xa8\x97\xce\x13\x8b\x12\xc0\x5a\xd6\x4f\x0d\xcd\x2c\x88\x21\xae\x36\xd9\x10\x7e\xa2\x45\xb5\xe5\x4e\x1a\x4d\x54\xa2\x49\xfd\xe1\xa6\x5f\x73\x9d\x6f\xa9\x07\x89\x68\x22\x66\x7d\xa7\xbb\x4a\x32\x6f\x77\x4b\x1f\xb8\x03\x43\x78\xb6\xc5\x25\xd8\xc2\x8e\x61\xbe\xb0\xba\x58\x10\x30\x30\x2c\xd1\xbb\x01\x0b\x3f\xa6\xf5\x93\xae\x07\x6e\x4a\x30\x5c\x75\xbb\x3c\xa1\x45\x65\x04\xf3\xf6\x11\xf7\xcc\x3a\x0d\xfd\x02\xbc\x37\x3c\x79\x6c\xd1\xda\x09\x42\xd5\x80\xeb\x1c\xc0\x35\x07\x11\xee\x8b\xe7\x90\xf9\x4a\x4d\x39\x4d\x83\x29\x27\xb2\x62\x10\x47\xe9\x05\xbd\xa3\x32\xb0\x59\x16\x9a\xe3\xe7\x77\x1c\xb0\xac\xd9\xcc\x98\x11\xa5\x80\xd4\xc7\x42\x0e\xe9\x5a\x9c\xb2\x39\xc3\x29\x13\x3a\x0c\xa3\x15\x0e\x1b\xce\x3f\xa1\x6f\xf9\xb5\x28\xdf\xd1\x2e\x5e\xd9\x9d\x66\xed\x50\x0c\x57\xd9\xfd\x24\x7d\xa0\x03\x40\xe7\x2e\xfd\x5b\x83\x57\x65\x97\xf1\x5b\xb1\x19\x9b\x77\x75\xc2\x94\x7b\xd8\xbb\xf1\x83\xbb\x45\x06\xd7\x49\x28\x97\xba\xcd\xb1\xce\x40\x8b\xdc\xe6\x5e\xce\xfe\x1e\xb8\xdc\xc3\x63\x9a\x9a\x5b\x80\x4c\xb0\x35\x4f\x04\x88\x37\x82\xa0\xd5\x96\xaf\x27\x12\x6d\x26\x12\x6d\x38\x2e\xa4\x69\x96\xf4\x66\x85\x86\xab\x3f\xe5\x8c\x36\x58\xc3\xa9\xaa\x5a\xb9\xc7\xd4\x06\x54\xd1\xb3\x62\x09\xc9\x48\xaf\xb3\x5c\x89\x71\x18\x84\x32\x56\xc6\xa4\xd4\x0f\xc3\x28\x59\xbc\x26\xd9\x3e\xbc\x25\x89\x7c\x25\x98\x90\x0e\x3b\xf0\xaf\x69\x91\x0c\xfc\x5b\xae\x49\x0a\x11\x03\x78\x55\xc5\x56\x1c\x8f\x27\x4b\x89\x18\xf8\x1b\xc0\x43\xe4\x02\x3f\x7b\x49\x5d\x0b\xb5\xa6\x37\xd9\xf8\x46\x0a\xdc\x31\x13\xae\x31\xf4\x95\xe0\xab\xe3\x47\x71\xe1\x75\x8d\x31\xbd\x6a\x9e\x15\xc5\x92\xb4\x1b\xf9\xac\xe6\xcc\xc7\xb6\x86\x40\xcd\x50\x34\x06\x41\xed\x53\x5a\xc3\xe0\x9b\xfa\x83\xc6\x44\x84\xf7\x60\xe5\x47\x44\x9e\xd7\x10\x42\x94\x95\x8c\x63\x38\x99\x41\x27\xff\x20\x73\x97\xbe\x37\x3a\x57\x5e\x50\x6a\x99\xd3\xf4\xfa\xbd\xbd\xac\x5d\x6a\xe4\xac\xce\x78\xc9\x51\x6b\x62\x88\x85\xe6\x4f\x55\x61\x68\xaa\x89\x95\x13\x20\x43\x54\x2d\x54\x4f\x5c\x8d\xf4\xb8\xf1\x33\x5a\x11\x81\x42\x47\x13\x5f\x52\x25\x6d\x75\xc1\xd9\x5a\xb3\x38\x69\xc5\x17\x5d\x75\x6a\x10\x9a\x20\xc8\xa7\xb2\xfb\xa6\xee\x08\x60\x82\xa2\x3c\x97\x3d\x64\x3c\x26\x13\x59\x67\xf1\x5f\xfe\x8d\x47\x99\x27\x27\xb3\x20\x92\x4a\x32\x7a\x1c\xc0\x0d\xa2\x15\x5d\x3e\x65\x20\xe2\xa8\xd8\x31\x2f\xcb\x16\x6a\xec\xd4\xe5\x1f\x18\x1c\xa5\x75\x94\xd2\x69\x3a\x72\x2a\x3f\xdf\x05\x26\x4e\x87\xf6\x0d\x9e\x3b\xcd\x46\xd4\xec\x97\xb2\x75\x9b\x6d\x61\xb7\xc8\xe2\x5c\x40\x58\x49\x7b\x65\x5f\x49\xbd\x3d\x48\x63\x52\x77\xfa\xb6\xdd\x50\x46\x43\x64\xe6\xe3\xb5\x24\x24\x8e\xb7\x20\xf3\xb4\xe8\xb0\x54\xec\x0b\xa1\xe9\xf2\x96\x51\x37\x17\xd2\xfe\xf1\x0d\x52\xac\x51\x53\xf3\x4e\x0a\x92\x90\x7b\x45\x7f\xf1\xfb\xb1\x8a\x0d\xab\x38\xd6\xaf\xa2\xc9\xe7\x6b\xba\x58\xe9\xdc\x4f\x8d\x3e\x55\x4e\x87\x40\x77\x39\x0b\x05\x22\x48\xd7\x3d\x6a\x0f\xd4\x2f\xdb\x52\x75\x60\x83\x30\xeb\x0d\xdc\x23\x5a\xa5\xe1\xb4\xad\xd2\x10\xa4\xeb\xaf\xa5\x31\x08\x5d\xe9\xd4\x85\xad\xf4\xde\x96\x78\x4e\x5b\xa8\x15\x52\x1f\x7b\xa3\x53\x48\x36\x85\xfe\x14\x8a\x59\x2f\x0a\xc5\xac\xb5\x42\x31\xdb\x17\x85\x42\x19\xc8\xe3\x2a\x14\x26\x4a\xf5\xa5\x50\x34\xb6\xbf\x93\x42\x31\x6b\x77\x14\x35\x2c\x72\x3f\x47\xd1\xcc\xea\x28\x6a\x39\x94\xdf\x2a\xd1\xa1\x4a\x93\xde\x15\x0f\x75\x13\x36\x2b\x1e\xea\x3b\xbd\x2b\x1e\x3f\x56\xbb\x66\xb5\x7b\x52\x50\x66\xf6\x0a\x8a\xe1\x68\xd6\x05\x59\x72\x1a\x0c\x72\xf7\x78\x62\x31\xef\x91\x5c\xdd\x7b\xe0\x3e\x2f\x1f\x73\xb0\x8b\xa1\xea\x48\x8b\x5e\xd2\x0c\x3b\x50\x79\x38\x39\xd7\x25\x71\x0b\xb0\x44\x49\xac\x5a\x29\x09\x8c\x42\xd0\x8e\x58\x6f\x5f\xc8\x34\x6c\x11\x8d\x53\x36\x89\xad\xd9\x9a\x38\x20\x1c\x3d\xa4\xcd\x7e\x44\x38\x5a\xb7\xa4\xea\x50\x47\xa7\x66\x39\xeb\x7e\xdd\x99\xf7\x10\x55\x95\xf2\x08\x50\xdb\x9e\x3b\x34\x1f\x6e\x9e\xfd\x74\xb6\x3c\x1f\x19\xf0\x52\xa3\xfc\x3c\x8c\x05\xdc\x1e\xca\xc2\x1c\x0e\x9d\x0c\x01\x2f\x99\x50\x91\x14\x44\x1c\x10\x85\x31\x78\x46\xde\xbb\x6e\xfc\xde\x15\xb2\x84\x89\x1b\x10\x5b\xb0\xa3\xdc\x8b\x56\x25\x51\xfd\xa4\xe0\x52\x88\xa9\xb8\xb1\x28\x78\x57\x0f\xed\x97\x66\x70\x95\x16\x2f\x60\x76\x0a\x93\xdb\xa8\x64\x5b\x8c\x66\x62\x89\x87\x4d\x7c\x4f\x94\x86\x61\x0c\x38\xfc\x78\x53\x00\x82\x2e\xb7\x3e\xca\x2f\xf0\xa1\x21\x8e\x43\x59\x0d\xa5\x54\x67\xf5\x34\x86\xde\x77\x35\xd4\xe6\x9f\x7a\x53\x01\x34\xb9\xb2\x05\x3c\x8e\x16\xc9\x7b\xa6\x3c\x47\x39\x06\x9e\xf4\xd0\xe7\x8a\x47\x01\x8d\x1a\xe5\xbb\x93\x29\x0f\x5c\x86\x76\x80\x3f\x77\xb5\x7e\x1e\x91\x64\xfa\xa1\x99\xa9\x67\xc7\x96\x1c\x17\x55\x10\x04\x26\x5e\x0d\xfc\x24\x00\x71\x1d\xb7\xca\x4f\xb8\x04\xb4\xd0\xd5\x16\x8d\xa3\xd4\xbc\xf7\xa3\x42\x5d\x50\x0b\xa6\x14\x00\x69\xf5\x15\x0e\xaf\x20\xde\xad\xb2\x4e\xa2\x4b\xbd\x3b\x45\xa3\x57\x14\xd0\x8e\x3c\x8e\x69\xd1\xc8\xe5\xd6\xeb\xa4\x5b\x1b\x03\xe9\x10\xdd\x63\xe8\x13\xdd\x4a\x66\x46\x85\xdf\x6b\x97\x54\x7e\x44\x81\x7d\xed\x7b\x55\x69\x97\x5d\x85\x0b\x79\xdd\x5a\xbe\x70\x31\x03\x35\x38\x95\x7f\xae\xc1\xba\x75\x9c\x90\x78\xf0\xf5\x70\xa8\xe6\xd1\xbe\x9f\x9e\x5f\xe0\x87\xfc\xd8\xf7\x63\x73\x91\xf1\xa4\xb6\x5a\x33\xba\x7d\x1c\xf2\x5b\x9b\xbd\xc4\xbf\xaf\x43\x05\xe4\x16\x5b\xca\x9c\x4e\xfd\x05\xf0\x62\x7f\x8b\x9c\xfa\x2e\x5b\xa1\x52\x7f\x2a\xc5\x1f\x52\x9a\x9b\x17\x36\x8f\x7a\x59\xc1\x83\x34\x5e\x2f\xa2\xfd\xaf\xf0\x77\x7a\xf6\x72\x7b\x70\xf0\x90\xd5\x97\x8b\x0f\xb2\xf5\x0a\xd7\xdc\xa8\x76\x32\xfd\x92\x1a\x07\xfd\x0c\xe3\xaf\xbb\x97\x05\xcc\x7c\x3e\x05\x7a\x42\x31\xe6\x30\x02\x43\x05\x9e\xc4\x59\x17\x0e\xf9\x88\x25\x33\x33\x08\x0b\x7e\x93\x01\x3f\xc4\x43\x43\xa7\xed\x92\x4b\x9a\xef\xbe\xfc\x74\xe5\x7a\x65\x83\x03\x0a\x3e\xb1\xd7\xcc\x90\xbe\x7c\x7d\x9c\xad\x5f\x7c\x12\xa2\xfc\x84\xf8\x65\xf7\xf4\xf2\xdc\xb9\x20\xac\xad\xc5\x72\x7c\x74\x44\x90\xb1\x0e\x21\x43\xc6\xc5\xe0\x11\x0d\x09\xe9\x9b\x81\x2c\x3e\x92\xea\x22\xd7\xed\xb1\x2c\xac\x07\x45\x99\xcb\x7a\x50\x8c\xd8\x1d\xc1\x25\x48\x50\x1c\x05\xef\x67\x45\x3b\xb9\x0f\x8c\x4e\x84\x28\x7f\x01\xb3\x9b\x28\x0c\x81\x26\x73\x49\xcc\x18\x36\xca\x6b\x35\x0a\x93\xe3\x0f\x08\xe3\x1b\x5f\x57\x5e\xc2\xfc\xb0\x17\x15\x0a\xd0\xa9\x34\x6c\x0c\x6c\x69\x0a\x85\x71\x8c\x51\xde\x39\xf0\xb3\x60\x79\x05\xb2\x15\x0e\x42\xa6\x75\xb5\xdd\x27\x69\xec\x07\x60\x09\xe3\x10\xa7\x6d\xe8\x2a\x1d\x73\x2f\x73\x72\x8d\x3c\x78\xa8\x6a\xa2\xa8\xa6\xf7\x85\xbf\x88\x12\xc5\x36\x7d\x89\x9a\x72\x28\xab\x0c\x87\xae\x0d\x42\xae\xc1\x3e\xa3\x61\x08\x3e\x7f\x13\x66\x05\x08\x79\x1e\xd3\x62\xf8\xf2\xa5\x81\x18\x02\xe6\x13\x62\xa9\x78\x92\x92\x7a\xa5\xe6\x46\x59\xac\xcf\x02\x5c\x96\x2f\xf1\x4a\xe8\x3a\xcb\x40\x52\x52\x02\x58\x84\xe7\xf3\x83\x3a\xd6\x0f\x0a\x66\x05\x95\x91\xf4\xef\x33\x90\x07\xc4\x08\x39\xe0\x40\x88\xff\x20\xb9\x01\x71\x94\x0b\x36\x36\xa1\x09\xe9\x73\xae\xa9\x52\x4d\xbe\x8f\x8a\xa5\x77\x0b\x61\x61\xda\xbe\x4a\xee\xe2\x31\x8b\x56\xc3\x15\x2a\xac\xf4\x25\x53\x13\xe5\x88\xbc\x9b\x2d\x6b\xa5\x24\x45\x9a\xe1\x6a\x90\x2e\xaa\x40\x85\xbd\x0e\xba\x86\xcf\xcf\x54\x8d\xaa\x63\x4f\x01\x4c\x8a\x0c\xc6\x31\xc8\xf2\x97\x18\xc3\xbb\x24\x1f\xcc\xaa\x5b\xbb\xda\xfd\x29\x7b\xc7\xc1\xef\xf4\x36\x1a\x94\xea\x61\x3d\x8e\xb7\x30\x04\x7d\x8f\x20\xcd\xe0\x26\x62\x8e\x47\x8d\x4c\xe7\xbf\xb7\x46\x70\x35\x0d\x05\xe7\xcc\x70\xe3\xb8\x03\x28\xc2\x0b\xcb\xc1\x61\x64\xe4\x00\x5d\xbe\xf4\x78\xe0\x16\x48\xc6\x31\xfc\x72\x21\x48\xb2\xce\x0f\xc4\x09\x39\x54\xb1\x02\x0b\x80\x2a\x3e\x88\xe0\x0d\xb7\xf7\xfc\x68\xc0\xa0\xd5\x07\xd9\x39\x6c\x0b\xbd\xae\x1c\xc9\xa9\x76\xbc\x03\x6e\x1f\xe9\xe9\x58\xff\xbc\x91\x9f\x8c\xee\xfe\x86\xc9\x73\x12\x9c\xef\xb5\xda\x83\xef\xc1\x9f\xeb\x28\x23\x1e\x05\xad\x93\x85\x5d\xa6\x79\x7f\xea\x88\x8b\x1c\x51\x1b\xa5\x1b\x0a\xc5\x47\xb0\x93\x8a\x7e\x38\x70\x3f\x70\xe8\xfd\xa6\x65\x72\x9c\xbf\x54\x97\xf8\xc6\x6e\xae\x85\x94\x34\xf3\x1b\xcf\x1f\x52\xe6\x8e\x45\xaf\xfc\xd5\x98\x0c\xd1\x34\x47\xae\xa9\x6a\x92\x26\x12\x7e\x33\x22\x7e\x1b\x32\xd6\xd1\xa0\x02\x9f\xa7\x3b\x4f\x4e\x68\xc0\x62\xf6\x5d\x12\xcb\xd0\x05\xee\x35\x8f\x29\xa9\xb8\xa6\xba\x6e\x92\x8e\x4b\xc5\x1f\x1d\xbb\x2c\x92\x61\x81\xa4\xe6\x6b\x97\x06\x3d\xab\x5d\x94\x5d\xe9\xa3\xc8\xab\xea\x34\x32\xb7\x65\xec\x86\x86\x33\x69\xa4\x1c\xfa\x6a\x62\xf8\x4a\xbd\x2a\xc6\x80\x68\x52\x35\xb8\x11\x44\xca\xf3\xd7\x2d\xa6\xa7\x73\x8a\x79\x1b\x7d\x5b\x97\x3a\x29\x52\x8f\xde\x5d\x31\x96\x2b\xd7\x44\x13\x80\xc9\x48\xf3\x96\x97\xac\xcb\x6b\xbf\x09\xb5\x57\x60\x57\x0a\xca\x5e\xf8\x59\x91\x3f\xad\x0c\x9d\xff\xfc\xc7\x7f\x8a\x4f\x80\x24\xe4\xbf\x77\xe0\xad\x64\x2e\x15\x55\x72\x25\x97\xda\x76\xb1\x79\xd5\x63\x8c\x14\x1d\xb0\x11\x54\x8f\x2a\x9d\x8b\x9b\x71\xf9\x54\x04\xd7\xb9\x41\x0f\x61\xe9\xc6\xd8\x4e\xb4\x04\x9b\x0c\x26\x34\xe7\x8a\xa1\x2e\x5a\xe8\x65\x28\xcf\x97\x78\x5f\xea\x47\x44\x9f\xb2\x1e\x0d\xad\x39\x66\x37\x1c\xce\xa8\x21\xaf\x3e\xbe\x6b\x98\xf2\x63\x6a\x88\xaf\xfd\x18\x8b\xa0\x46\x9c\x7f\x85\x1d\xb1\xf3\x9d\x55\x17\xd1\xea\x17\xba\xe8\x1e\xf5\x66\x6d\x3c\x26\x29\x1d\xf8\x2a\x8e\x42\xb7\x08\xd0\x80\x66\x38\x56\xc7\x04\x67\x5d\xaa\x05\x80\x99\x18\x5a\x35\x64\x90\xd3\xff\xae\x96\xc0\x09\xe2\x75\x5e\x80\xcc\x21\x57\xcf\x78\xeb\x2c\xfd\xdc\x49\xa0\x93\x81\x45\x94\xe3\x9a\x8b\x9c\x9d\x6b\x68\x03\xf7\x23\x61\x83\xf3\xc6\x80\xfe\x48\xf3\xc6\x2f\x82\xa5\x16\xf3\xa0\x0f\xd2\xbc\x85\xd4\xe4\xe0\xac\xca\x8e\x50\x69\xcb\x02\x64\xab\xfa\xd4\x4a\x8d\xf1\xa3\x25\x63\x37\x66\x75\xd6\xa8\x0b\x72\xee\x7a\xea\x0e\xdc\xc2\x1d\xb8\xb8\xf2\x95\xe0\x1a\x20\xc5\xe9\x38\x84\x55\xe4\xfc\xb9\xa5\x26\x2e\xb6\x1f\x06\x64\x3e\xde\x0d\x7c\x60\xc5\xcb\x98\x8f\xa8\xdc\xc1\x1e\x77\x0a\x90\x4f\xd0\x01\x46\xe3\x36\x16\xe5\x1b\xa8\xd3\x3c\xfa\x02\x48\xc4\x20\x1f\x32\x02\xfe\x6c\x69\x8d\xc6\x06\xe4\x7e\x6d\xd2\xec\xc2\xb3\xd7\x46\xe9\xd7\xd3\xe2\xa7\x93\xe5\xf9\x07\x21\x52\x63\x22\xfa\x14\x35\xa0\xbe\x95\x73\xa0\x09\x55\xc8\xd5\x83\x4b\x30\x97\x07\xce\x26\xd7\x59\xe0\xc6\x9d\x1c\x18\x2e\x6d\x9a\x72\xa7\x3e\xca\x47\xf0\x6e\xec\xee\xce\x20\x3f\x1f\x83\x83\x0e\x84\x0c\xc4\xfd\xe6\xa6\xdb\x08\x5e\x5c\x9d\x5d\x42\x2b\x17\x07\x17\x3e\xa2\x5e\xee\x07\xae\xc3\xcf\x7b\x8f\x9c\x21\x74\xac\xb5\x0e\x08\xc2\x0e\xd4\x2f\x25\x4c\x53\xce\xf5\xec\x1d\xe5\x7c\xe7\x61\x8b\x1c\xd7\x7e\xf0\x32\x84\xe6\xa3\x7b\x56\x5a\x79\x3f\xda\xf8\x3e\x24\x95\x62\x5c\x0d\x04\x9f\x77\xdc\xd3\xdc\xa4\x51\xd9\x6b\xf1\x8a\xa0\x31\x5f\x59\x27\x6b\x9b\xc6\xea\xc8\x51\x53\xa8\x96\x35\xbc\x89\xca\xbb\xde\x3a\x8e\x3d\x12\xc6\x6b\xe3\xff\xc1\xe1\x15\x9e\xc9\x5f\x64\x92\xe3\xd4\x3d\xfd\x04\xa6\x34\x45\xfa\x09\x3e\x8f\xf1\xe1\xfd\x84\x21\xd4\x94\xac\x46\x0c\xc1\x55\xbc\x10\x7e\x89\xb3\x0f\x0b\x21\xba\x11\x4c\xb8\xaf\xe4\x42\x8d\xfc\xd3\xc5\x0b\x3f\x00\xc5\xaf\x6b\x90\x6d\x2f\xfc\xcc\x47\x7a\xa1\xfb\x67\x4a\xdf\xae\xbf\x8a\xf6\x31\xb3\xab\x6d\x0a\x94\x79\xa1\x0f\x75\xb3\x62\x5f\x74\x98\x13\x7e\xb7\x6e\x46\x26\x36\x6a\xd8\x7d\x8a\xdf\x4a\xde\xc5\x1a\xff\xe4\xbc\x83\xe7\xca\x80\xaf\xbb\xbb\xf7\xaa\x1a\xd6\xe1\x77\xe6\xbb\x72\x77\xf5\x5c\x31\x4b\xd4\x52\xb0\x13\xca\x35\x6a\x6b\x6e\x35\x92\x91\xef\xfc\xac\xe9\x1a\xe4\x8a\x92\xe5\x14\x69\x05\xba\x52\xdd\xba\x29\xd6\xfa\x77\x70\xd0\xf6\x15\xae\x68\xa9\x9d\xfb\x1b\x18\x46\xb7\x11\xb1\xc1\x5b\x79\x71\x6a\x3b\xe4\x2d\x8e\x9a\xde\x9a\xdd\x57\x06\x92\x48\x61\xf5\x56\x2f\x59\xe0\x16\x4b\x6f\x7c\x04\x19\xad\x8a\xd8\xe6\x2d\x1a\x8d\xd1\x6e\x95\x9b\xa1\x63\xa5\x37\x6a\x11\x75\xcd\x34\x75\xdb\xf8\xe0\x90\xba\x42\x1c\xae\xb6\x4e\x62\xd1\xeb\x8e\xf5\x1e\x3e\xaf\x4a\xb6\x5e\xeb\x00\xbc\xb9\x49\xe8\x4c\xb4\x46\x03\xad\x4e\x79\xad\x37\xcf\xba\x5a\xb7\xbc\xce\x36\xab\x39\x4a\x5a\xdb\x66\xe9\x4a\xb6\xb5\xcc\x2a\xf3\x6a\x65\x97\xad\xf4\xa5\x5e\xad\xb2\xb5\x28\x9a\x36\x16\x94\x47\xb5\xca\x9e\x74\x30\xca\xba\x8f\x63\x92\x3d\xe9\x62\x91\x95\xee\x55\x6d\xed\xb1\x5a\x92\x6b\xf5\x97\xeb\x66\x4b\xac\xc2\x7e\x6d\xec\xb0\x3c\x7c\x68\x00\x57\x37\x51\x62\x64\x1d\x93\x55\xb6\xb3\xe1\x51\xd0\x88\xea\x72\xd4\x3b\x99\x1e\xaf\x96\x80\x58\x1e\xa9\x21\x96\x2f\xe5\x64\x5e\x8c\x06\x27\x6f\xe3\x0e\xeb\x9d\x4c\xf5\xf6\xd9\x5d\x48\xf4\x56\xa0\x09\xb1\xcf\x6e\xe1\x9a\x19\xb1\x9d\xdb\x28\x2e\x40\xe6\x30\x0d\xbe\x86\x6e\x9c\xf0\x37\xd8\x5d\x0d\x56\xd7\x5d\xed\xad\xab\x75\x5c\x44\xc4\x1a\xea\x85\x19\x4c\x43\x78\x9f\xf0\xb6\x55\x64\x90\x6d\x30\xb0\x62\x4e\xe1\xf3\xa6\xcb\xbe\xfb\x36\xb7\xaa\x96\xad\x47\xb1\x9c\x7d\x17\x61\xc1\xf1\x9b\xf9\x68\x7c\xf5\x69\xb2\xbb\xcd\xec\x87\x91\x4c\x77\x72\xfc\x30\x92\x29\x0b\x5c\x67\xc7\xb2\x35\x58\xe9\xad\x6e\x22\x2e\xbb\x50\x86\xb5\xc1\x08\xa7\x22\x55\x3b\xa4\xc2\x2d\xda\x82\x51\x75\x3c\x1a\x6c\x59\x35\x15\x2f\xc8\xde\x61\xc5\x78\xea\x6c\x1f\x6d\x22\xbe\x94\x9e\x53\x3f\x32\xd9\xcf\x34\x4f\x17\xc8\xa3\xc7\xdd\xae\xd4\xa0\xcd\xba\xbb\x96\x80\xfd\x6a\x1e\xbe\x18\x12\x43\x70\x15\xdd\xfa\x57\xf8\xc8\x18\xad\xde\xf7\x17\x57\xcb\x2c\x76\x31\x52\x16\x9d\xa2\x57\xfe\xda\xac\x9c\x68\x43\xb4\x2d\x57\xa4\x71\x3d\x84\xe0\x55\xb3\xd2\x51\xbb\x0e\x6a\x50\x52\xcd\x0a\x28\x51\x49\x1a\xda\x1b\x28\xdf\x14\xfc\x54\xdb\x8d\x44\x6d\xb3\x56\xde\x17\x65\xab\x10\xdd\x3a\xb2\xca\x92\x48\x8c\xa4\xda\xcd\xe2\xa9\x17\x5f\x14\xf3\xfe\xda\x26\x01\xa2\x59\x42\x18\xda\xaf\xa7\x9a\x41\x24\xda\xdf\xba\x6d\x0b\x5b\xb4\x14\x37\xad\xcb\x0a\x18\xdf\x26\x54\x2e\x47\x45\x4b\xd5\x97\xbf\xdf\xc0\xa2\x80\x2b\x2e\x03\xbc\x31\x76\x59\x6e\x12\xcd\xd3\x8f\x6f\x6b\xdf\x75\x0c\xf9\x29\xcc\xe0\x8f\x4b\x1e\x0d\xdc\x27\x6c\x9f\xba\x4f\x37\x7e\x14\xfb\x37\x51\x1c\x15\x5b\x55\x03\xd3\x87\xa0\xda\x8a\x57\x53\x7c\x9c\x71\x27\x36\x10\xc1\x62\xf2\xc2\x5b\x2b\x50\xaa\xdc\x0d\x6f\xe9\xaf\x6d\xca\x41\x4b\xe8\x14\xd7\x15\x0e\x13\x9a\xab\xae\x6b\xba\xf2\x61\x56\x47\x8b\xb9\x97\x66\xea\x7d\x47\xa4\xad\x78\xe6\x11\x29\x2b\x1d\x0a\xfd\x93\xb6\x5e\xc4\x74\x33\x10\xe9\x75\x81\x36\x4b\xd8\x49\xf2\x76\x96\xbb\x96\x6a\x45\x47\x79\xcb\xbf\xcb\x63\x77\x58\x88\x5c\x4d\x4d\x89\xda\xb3\x0e\xdf\x72\x56\xfe\x03\x11\xba\x3a\x04\x8e\x86\x1d\x65\x25\xb1\xfb\x96\xd7\x72\x1c\x7a\xb3\x1a\x66\x96\xd1\x4d\xbc\xde\x52\x88\x74\x13\x21\xbd\xca\xe6\xd6\xf2\x43\xa3\x7a\xf6\x29\x19\xf6\x8e\x90\x96\x92\xb8\x1b\x1d\x2d\x25\xf0\x57\x16\xb1\xda\x8f\x54\x8d\xba\xa3\xa2\xdc\x41\xfc\x5a\x08\x5f\xc3\x52\x73\x5a\x2f\x67\x81\xb1\xba\xfb\x48\x32\x55\x63\xb1\x10\x41\x62\x34\x07\x2c\x35\x0d\xa1\xf0\x9c\x9b\x18\x54\x38\x97\x2d\xae\x1b\xc6\xd2\xaf\x75\xd1\x0f\x55\x6c\x03\xb1\xe4\x1f\xe1\x49\x89\xb6\xfc\x53\xa1\x13\x96\x9f\xd3\x2e\x11\x57\x76\x51\x75\x4a\xc5\xdd\x29\xa8\xc1\xe9\x12\xd8\xa0\xe9\xd3\x32\xb8\xc1\xfc\x66\x15\xa9\xd0\xfa\xd5\x86\x3b\x59\xcd\x68\xeb\xe3\x0e\xcc\x2f\xd6\xc5\x1e\x98\xdf\x6a\x8a\x3f\xa8\x79\xb3\x21\x06\xa1\x66\x8a\x35\x71\x08\x35\x8b\x51\x5f\xdd\xb7\x2e\x1e\xc1\x51\x98\xba\xc7\x98\x04\xc7\xe8\xe1\x37\xc5\x25\x4c\x2c\xe2\x12\x9c\xba\x10\x04\xc7\xd6\xa9\x2a\xd0\xd3\xce\xb5\xaa\x5b\x88\xd6\xce\x3e\x4e\x4c\x13\xeb\x6d\xb3\x97\xd4\x69\xef\x06\x94\x3c\x7f\x7e\x06\x1c\x6c\x66\x8a\x92\x85\x53\x49\x5c\xea\x40\xcd\x41\xb6\x89\x02\x30\xb4\x3d\x63\x5d\x8b\x94\x8b\xf6\xc2\xbe\xe1\xf0\x6b\x4c\xf3\x13\xe8\x93\x96\x27\x11\x75\xf7\x37\xa6\x06\xd6\x3a\x4d\xfe\x5c\x03\xbc\xbd\xda\xbb\x4b\xb8\xca\xc5\xb4\x03\x16\xea\xf8\x87\xe8\x7b\xe6\xf1\xb2\x39\x3a\x49\x00\xb8\xd7\x36\x68\x17\xe5\x7f\x1f\x23\x70\xef\x20\x58\x38\xad\x52\xc6\x2f\x84\x5a\x24\x95\xe3\x52\xf2\xba\x90\xdf\xc6\x83\xd1\x5a\x37\x2c\xfa\xf0\xec\x84\x93\x9d\x6a\x57\x73\x51\xae\x7b\xc8\xc2\xd3\xa3\x61\x9d\xae\x1a\x1a\xba\x1d\xab\x9a\x99\x49\x21\xed\xae\x95\xd1\x9a\xa5\x5d\xf5\x31\xf6\xbe\xba\x39\x77\xd7\xc3\xde\xd2\x82\xaa\xdd\x34\xb0\xea\xa8\x9a\xee\x02\x85\xd2\x59\xfb\xea\xa0\x7b\x75\xd5\xbc\x3a\xeb\x5d\x1d\xb5\xae\x8e\x3a\x57\x17\x8d\xab\xab\xbe\xd5\x55\xdb\xea\xa2\x6b\x75\xd2\xb4\xec\xe2\x76\xa7\x7d\x6b\x59\xed\x74\xac\x99\x95\x8e\x85\xba\x9e\x99\x13\xf4\xa7\x16\xfa\x55\x47\xed\xaa\xb3\x6e\x85\x44\x6c\x0b\xad\xaa\x4f\x9d\x0a\xd5\xae\xb5\xd3\xa6\x9a\x74\x29\x3b\x4d\x4a\x2b\xa6\xbb\x6b\x50\xed\xf5\xa7\x3d\xd6\x9e\x70\xdd\xe6\x2e\x7a\x53\x83\xd6\x54\x57\x54\xbe\xb5\xa6\xa4\x69\x4c\xaf\x23\xd5\x87\x93\x77\x71\x23\x68\x58\x4c\x89\xd1\xa3\xf1\x79\x1d\x32\xa3\x57\x7e\xe1\xa5\x20\x0b\x40\x52\xe0\xcc\xe8\x85\xbf\x5e\x00\x0f\xd7\x7c\x1d\x54\xe8\xf8\x42\x84\x5e\xe1\xdf\xd5\x05\xea\x11\xa4\xce\x3f\x53\x2f\x07\x59\xe4\xc7\x38\x17\x87\xa6\xbd\xa6\xf1\x3a\xc3\x9f\x75\x8b\xd8\xeb\x31\x4f\x9a\x00\x48\xee\x7b\x78\xde\x61\x72\x9f\xdc\xfe\x7e\x00\x7f\x40\xb8\xca\x2b\xd7\x2b\x1b\x7c\x1f\xb1\x9a\x97\xe3\xb3\xcf\xeb\x62\x1c\x34\xc4\x6a\x56\xaa\xd6\xd7\x0d\xc8\x94\xa5\xdb\x63\x43\xba\x72\x12\x96\x4c\x99\xeb\x5e\x27\x8b\xcd\xb7\xb8\x1e\xa7\xd1\x1a\x04\x96\x9b\x06\x01\x25\x69\x3b\x8d\xa6\x73\x62\x3f\x92\x99\x25\x0d\x69\x13\xe5\xd1\x4d\x0c\x28\xb3\x9a\x11\x5d\x5d\x05\x8f\xb6\x13\x9e\xeb\xcc\x16\xcf\x75\xde\x05\xcf\x95\x32\xaf\x35\x9e\x6b\xbd\xfa\x98\x6f\xf3\x92\x80\x03\x37\x5f\xc2\x75\x1c\x5e\x2e\xe1\x7d\x29\x13\xf3\xd4\x0f\x2c\xd4\xc9\x9e\xb2\xb4\x75\x8a\x6a\x53\x9e\xb6\xc9\x02\xd1\x2e\x9f\x99\xcd\x55\x49\x6a\x96\xa8\x40\xbe\xfc\x33\xad\xde\xb8\xae\x5d\x49\x63\x62\x33\xd7\x80\x45\x7a\x5a\x3f\xca\x5c\x3b\x34\xe6\x23\x1b\x34\x66\x25\x8d\x9a\xc7\xbd\xd6\x34\x6a\xc0\xd9\xad\x4d\xa1\xe6\x9b\x7c\x84\xf4\xe9\x93\xff\x8a\xe9\xd3\xb6\xf0\xb7\xbe\x39\x2d\x59\x32\x37\x94\x0c\xdd\x60\xf6\xd8\x45\xe8\x74\x1a\x3a\x6a\x6a\xd8\x62\x12\x78\x1a\xe8\xb5\x46\x67\x99\x29\x28\xbb\xe5\x38\x49\x29\x2f\x1c\xaa\x62\x67\xc3\x47\xfb\x81\xc4\x54\x75\xb0\x34\x3d\x0a\x04\xb3\x34\x46\x25\xda\xf6\x31\xc6\xd9\x0e\x9c\x59\xe6\xd7\x2a\x2e\xed\x31\xc6\xd6\x04\xdb\x2c\x8d\x86\x86\x88\xb7\xf3\x81\x28\x96\x48\xa9\xd5\x7f\xc3\x06\xaf\xdc\xce\x7b\xd2\x4b\x76\xba\xf5\x66\x43\xc3\xb0\x44\x88\x46\xc6\x1c\x19\x22\x9a\x3b\x6d\x11\x44\x34\xde\x16\x9d\x21\xa2\x19\x41\x9b\x63\xb1\xbb\xc3\x43\x53\xb5\x6d\xa3\x1d\xeb\xc0\x8d\xc2\x4f\x51\xb1\xe4\x95\x0b\x5b\xb9\xe5\x70\xb6\x29\x01\xfa\x15\xaf\x87\x71\x36\x8d\xf0\x93\xfd\xe8\x8c\x2d\xa9\x5c\x37\x1b\xa2\xa8\x35\xce\xcc\x2a\x83\xa6\xf5\xda\x8f\x07\x7c\xe1\x6f\x3a\x2e\x49\x88\xbb\x97\xdc\xdf\x03\xf7\x43\x22\x0b\xf9\x46\x5a\x5b\x8d\xce\xdd\x1d\xbd\x9b\x9b\x92\x5c\x99\xf9\xf1\x60\xa7\xff\x62\xbd\xde\x35\x19\x56\x9a\x36\x0e\xba\xb4\xab\x64\x06\x69\x1a\xa9\x41\x01\x6f\xa0\x56\x0b\x14\xf0\x1f\x4b\xd1\x61\x29\x6a\xaa\xfe\x36\xa1\x88\x6b\x1a\x27\x5a\xc1\xbb\x24\xde\x9a\xc6\x6f\x8e\xc1\xaa\xc5\x1e\xef\xb2\xbd\xb5\xd4\x6b\x62\x8f\x7e\x50\xc7\x55\xb6\x30\xc8\x63\x5d\x1e\x9e\xf2\xae\xca\x0c\x35\xad\x35\x33\x81\x8c\x5b\xde\x1b\x6d\xeb\xb1\xcc\x7b\x11\xd9\x36\xfd\x56\x4e\x8e\x53\xb8\x4e\x8a\xd6\xdd\xd7\x29\x78\x5f\x0d\xb9\x67\x3c\x69\x80\xee\x69\x63\xf6\xfa\xae\xa0\x7b\xa4\xa7\xff\xf9\x8f\xff\xac\x7d\x5f\x02\xf6\x91\x9e\x85\xb7\xc6\x97\x55\x03\xc9\xfe\x00\xfe\x18\x48\x46\x9d\xa0\x53\x23\x0e\x50\xd7\xe8\x89\x5e\xb0\x81\xda\x8c\x5a\x84\x0c\x6a\x3f\xec\x7f\x09\x18\x21\xde\xc6\x5d\x63\x5f\xef\x15\x1a\x47\xa0\xe4\x5b\xa8\xb8\x62\x6a\xe4\xdf\x2e\xa8\x42\x51\xee\xb0\xcb\x87\x0a\xf6\xce\xb9\xc1\xec\x31\x86\x2c\xf0\xdd\xfb\x21\x11\x81\x12\x7a\x5c\x12\xbd\x85\xd4\x29\x21\x21\xbe\x6b\x59\x5f\x41\x7f\x37\x0b\x59\x2d\x26\xbc\xed\x91\xb7\x1b\x56\x91\x46\xad\x9b\x5e\x77\x43\x86\xaf\x43\x81\xcf\xa3\x64\x11\x03\x0d\x96\x91\x0e\x4e\xfe\x2b\x43\xc6\x0b\x0e\xeb\x7e\x7d\xe0\xcc\x08\xb2\xd7\x4e\x70\x38\xca\x1f\x5e\xfc\xfd\xd9\xf3\xfd\x86\x8c\x17\x61\x39\x38\xb7\xbc\x06\x42\x89\x19\x4e\xb4\xee\x7a\xa3\xdf\xd6\x41\x4e\x8a\x52\xde\x50\xbf\xd5\xee\x70\x3b\x9c\x0d\xe7\xfb\xc4\xda\x21\x44\xd6\x63\xed\x18\x1a\xd9\x05\x4a\xc4\x06\x9f\x45\x13\xfd\xbd\x8b\x7d\xea\xf1\x27\xf5\xf8\xf8\x28\x3d\x0f\xf8\xf9\x43\x01\xb2\xc4\x8f\x1d\x63\x8c\xb7\x7e\xcc\x80\xbc\x77\xae\xb9\xdd\xf6\x6a\x6c\x6d\x33\x5b\x8b\xf9\xf2\xce\xea\x5a\x88\x26\xcd\xf6\x6e\x32\xd7\x5a\x19\x6a\x35\xe7\x72\x5b\x91\xd1\x5e\x52\x18\x93\x36\x3e\x65\x51\xf1\x75\xb2\x36\xee\xcb\x9e\x4c\x88\x93\x1d\x33\x39\x6a\xdb\x34\x85\xc2\xe8\xa1\xcf\x05\x17\x78\x75\x1f\xfd\x24\xf7\xf0\xcd\xaa\xdb\xee\x9e\xd2\x21\xb8\xd7\xbe\x87\x94\x8e\xcb\xc2\x2f\xd6\x1d\xf2\x1e\xf6\x3f\xa5\xe3\x9b\xa5\x66\x28\x6e\xcf\x36\x2c\xa8\xc6\x26\xf1\xd1\xdf\xee\x93\x00\x26\x05\x78\x28\x48\x54\x19\x72\x71\x6a\xe0\xb8\x07\x2e\xd3\x96\xb9\x44\x2a\xde\xfd\xf9\x54\x8a\x29\xd7\xb9\x40\xeb\xf3\x3a\xac\x0b\x2f\xee\x47\x5e\x87\x22\x85\xeb\x0f\xa7\x9d\x32\x3a\x42\x90\xe2\x68\x1d\x07\x26\x4e\xb1\x8c\x72\x72\xd7\x45\xa5\x4f\x4a\x4d\xff\x00\x49\x55\xc7\x0f\x02\x90\xe7\x3d\xa5\x78\x7c\xe3\x53\xee\x3d\xf0\xc3\xaf\x72\xc8\x95\xf4\xeb\xf9\x8c\xab\x6b\xb2\x97\x23\xee\xbd\xd4\xc1\x2e\x27\xdc\xec\xfb\x3e\xe1\x3a\x9f\x54\x5d\x8f\xc6\x1f\x27\x5c\xef\x27\xdc\xec\xdb\x9c\x70\xf3\x9d\x4e\xb8\x79\xeb\x13\x6e\x6e\x3e\xe1\x66\x7b\x78\xc2\xc9\x12\xf8\x5b\x1e\x70\x1e\x4c\xe2\xed\xbf\xd4\xf9\x76\x0a\x93\xbc\xc8\xfc\x28\x29\x2c\x8f\x36\xa3\x31\x49\x3c\xa2\xcc\x76\x24\xec\x3f\xad\x98\xa0\xfa\xd3\x68\x83\x70\x8b\x1a\x70\x27\xa3\x80\x04\x45\x11\x11\xeb\x7a\x0d\xbb\xc8\x42\x8b\x01\x76\x59\x1a\xd2\xb9\x86\x6c\x30\xfa\x48\xa4\x5f\xab\xf0\xbb\xa7\x88\xdf\x9c\x37\x38\x73\xb3\x95\xb7\x5d\x56\x09\x30\xeb\xe2\x96\xae\x6b\x29\x53\x4b\xb2\x0e\x73\x28\x0a\x3f\x58\xae\x40\x52\xf4\x33\x0f\xd6\x5c\xb7\xb9\x68\x3f\x36\x71\x7e\x9b\xac\x9f\xaa\x1a\xe9\xa0\x36\x4b\xd4\xa2\x42\xa9\xe0\x48\xa9\xea\x38\x50\x1f\x87\x92\x05\x4a\x3c\x29\x2d\x5d\x1a\xf8\xe7\xee\x3e\x0d\xb0\xf1\xe3\xf5\xf7\x51\xb1\xf4\xf0\xa7\xe9\x6f\xcf\x83\xf4\xd4\x9c\xde\x59\x7f\xf0\xbb\xda\xfc\x34\x6c\xda\x2b\xa7\xbe\xf1\x63\x2f\x44\xb6\x70\xaf\x24\x82\x1f\x2b\xd9\x49\xb8\x0d\x2e\xbf\x73\x5a\x97\xdf\x29\x1f\x25\xd8\x11\x27\x3a\xdc\x62\x7f\x0b\x91\x3f\x0d\xf7\xe8\x15\x7e\xb6\x00\x45\xf7\x9c\x4f\x6e\x39\x7b\xe5\x8d\xef\x23\xe7\xf3\x38\x5c\x2e\x5e\xdc\xbc\xc9\x6a\x72\x3e\x9f\x73\xfc\xae\x75\x22\x55\x21\x13\xdc\xbd\x29\x81\x45\x74\xbb\x2d\xdf\xa5\xb1\x40\x4a\xea\x4e\xf9\x65\x07\xc7\x94\x8d\x4e\x60\x4e\x29\x34\x3f\x6c\xae\x90\x6a\x72\xda\xb5\x4e\x12\x9c\xda\x26\x09\xce\xd4\x68\xa9\xff\x40\xe1\x52\x57\xf0\x0e\x24\xb9\x26\x43\x90\x67\x63\x4d\x96\x60\xd3\x61\x60\x9d\xdf\xd7\x48\xa0\x79\xe7\xb4\x3c\x72\xd1\x93\x73\xf2\x38\xfe\xa3\x57\x41\x2e\xb9\xaa\xfa\xc4\x4c\xba\x5c\x49\xc8\xa3\xaf\x35\xc7\x9b\xed\x3a\xa9\xab\x2c\x5a\x2c\x10\x22\xf1\xb3\xad\x5a\x43\x95\x7e\xf9\x4c\xc8\x18\x2b\xa4\x8f\xdb\xcc\x4c\x78\xf7\x2b\x4c\xcf\xa6\x34\x6c\x21\x55\x84\xb5\x9b\x48\x63\x29\xd8\x7e\x66\xd0\x53\x32\xa8\xd5\x9c\xac\xf3\x40\xad\x15\x34\x35\x5c\xb3\xbc\x7e\xfb\x51\x02\x64\xe1\xc7\x99\xce\x50\xf6\xa2\xd6\x40\xe6\x6a\x0b\x48\x12\xf3\x18\x1f\x9d\xf0\x95\x6b\xbe\xea\x15\xf0\x4a\x32\x38\xe7\x67\x2d\x15\xfb\xba\x76\xdf\x03\x3c\xe3\x1e\x9b\xbc\xc8\x22\x98\x45\xc5\xb6\xc7\x26\x89\x3d\xad\xc7\x16\x79\x59\xd5\x63\xb3\x58\x6a\xf7\x49\xcc\xf2\x74\x45\x37\xac\x17\x7e\x14\xaf\x33\xf0\x78\x19\x6f\x2d\xb8\x95\x4f\x6e\x9b\x0f\x4a\x25\x27\x87\xd9\xcf\x4e\x0a\x51\x8e\xdb\xff\x40\xcf\x1c\x52\x73\x39\x1f\xd8\x7f\xcc\x69\x05\xa2\x6a\xa4\x49\x18\xe3\x8f\x7e\x1e\xfb\xe1\x1a\x77\x5c\x0a\x01\x0a\x0d\x31\x72\x59\x46\xdd\x89\x26\xa1\x4e\x28\x76\xb8\xf4\x93\x30\x06\xd5\x86\x22\x76\x3b\x79\x04\x6a\x7a\x1d\xd7\xfe\x1d\xd8\xae\xd3\xbe\xdb\xdf\x3d\x7d\x4f\x8d\xb8\xcf\x97\x30\x2b\x74\x41\x19\x0d\xcc\x59\xd3\xad\xab\xcf\xcd\x5a\xfa\x39\x32\x28\xd7\x25\xaf\x90\x0b\x16\x7f\xc3\x62\xb0\x59\x38\xaf\x90\x8f\x39\x9b\x68\x92\x40\x50\x15\xb3\x57\xf0\x06\x4d\x69\xe0\x3e\x51\x13\x0d\x13\x3e\xc5\x90\xb2\xcf\x67\x78\x93\x0f\x3f\xd3\xe1\x59\x25\x1d\x9a\x28\x2a\x8c\xc0\xb0\x16\xba\x1d\xd8\x9c\xda\x63\x47\x1d\x4d\x66\x09\x21\x46\x80\xdc\x00\xf9\x30\x20\xee\x80\x9d\xa7\x8a\x98\xe7\x2d\xed\xa0\xfd\x5c\xaf\x07\xf2\x54\xbb\xf0\x9b\xd5\xa2\x90\x33\xe7\xd1\x13\x5a\xf8\x88\x79\x25\xdf\x0b\x5f\x3e\x23\x6d\x0c\xe2\xd7\xa0\x82\xa8\x4c\xef\xd8\x35\xf5\xb9\xc1\x04\x78\xb5\x61\xd8\x8e\xc8\xbe\x7c\x69\x0f\x76\xf7\x50\x68\xc5\x2e\x33\xbb\xd5\xe4\x30\x4b\x27\xe9\xc0\xd1\xf6\x3d\x70\x91\x25\x00\xdd\xf4\xea\xf2\x17\xdf\x1e\x3c\x75\x3c\xe7\x3c\x71\x2e\x32\xb8\xc8\x40\x9e\x6b\x23\xde\x25\x61\xc8\x4e\x6e\x7a\x70\x9b\x45\xe3\x55\xb6\x06\x8d\x12\xe2\x85\x1f\xe7\x32\x74\x83\xd3\x39\x39\xaf\x4e\x71\xe8\x2b\x93\x0a\x87\xd5\xa6\x7e\x18\x46\xc6\x80\x78\x8e\x71\xe6\xa6\xb4\x2a\x7a\x55\x61\x9f\x35\x65\x4d\x8d\x4c\xac\x4a\x95\x17\x0c\xbe\xe3\xb2\xec\x7c\xe1\xef\x19\xff\xb7\x46\xa7\x60\x29\x5d\xb7\x19\xc8\x97\xbc\x45\xa3\x3e\xe0\x9f\x8a\x8e\xc3\xeb\xea\x6d\x8f\x17\xcf\x6e\x95\xd5\x13\xe5\x5e\x81\xb3\x79\xf4\xdb\xf8\x3d\x7e\xbd\x85\xa2\x69\x9c\xb5\x43\xfa\xc2\x65\x84\xb2\x10\x64\x08\xac\x10\xab\x70\x6e\x18\xe5\xe5\x7a\x86\xd5\xbc\x71\x98\xe6\x19\xfe\xfc\x02\xa7\x54\xd9\x11\x4e\xa7\x2c\xc1\x84\x34\xc1\xda\x8f\xfd\x1c\x9b\x7e\x5a\x6a\x48\x12\x81\xa5\x1c\x2c\x99\xba\xb1\x9f\x31\x30\x9d\x76\xae\x92\xc7\x21\xe4\x5b\xb2\xda\x3b\x10\xf2\x2d\x4d\xff\x22\xd7\xde\x15\x28\xfc\x52\x41\x00\x0f\x7d\xd2\x93\x21\xa4\xee\x4e\x50\xb3\x89\x4e\x9b\x58\x64\x0b\xfa\x5a\xe3\xb1\x53\xde\x7c\x4c\x37\xb7\x44\x54\x6d\xb6\x52\xf3\xf5\xb0\x45\xc6\x92\x2b\x46\x0c\x2d\xfd\xfc\x05\xaa\x76\x9e\x3f\x4d\xd3\x38\x32\x63\x25\x90\x9e\xc6\x75\x07\x3c\x1a\x3f\x67\x78\x75\x8a\xa5\x5f\xe0\x74\xa8\x9f\xb5\x2a\xa1\x65\x32\x94\xc0\x70\xcc\x9e\x8e\x08\x75\xc5\xb6\x84\x49\xed\xac\x4d\x5a\x6f\x64\xa3\x76\xd3\xbf\x5a\x82\x0c\xa0\x80\x82\x44\x20\x84\x65\xcf\xf2\xd1\xbc\xfb\x96\xa0\x2d\x6a\x8d\x65\xe4\x48\x3d\x92\x74\x31\x40\x11\x69\x9f\xdc\x26\x62\xe8\x57\xf5\x25\x67\xe8\x1b\x73\x98\x66\x41\x0c\x73\x70\x19\x85\xe0\xc6\xcf\x90\x82\xa3\xbd\xe4\x72\xb7\x7b\xfe\x79\x4e\xbc\x9b\x6e\xc7\xd7\xea\xa9\x4e\x66\x56\x0a\x18\x76\x11\x6a\x48\x4d\x0b\xa3\xd0\x5b\xa7\xa1\x8f\x10\x6a\x3a\x25\xa6\xa9\x3e\x59\xf0\x27\x4d\x3e\xbb\x4d\x84\xec\xb7\x00\x26\x81\x5f\x54\x08\xc0\x2b\x98\x14\x4b\x0f\x79\xbf\xb0\x8a\xe9\x05\x20\x8e\x9b\xf2\xd5\x18\x25\xbc\x1c\x53\xeb\x00\xbb\x19\x29\xd2\x6b\x3b\xbf\x5e\x5f\xd9\x6c\xe0\x01\x04\x5e\x0c\x7d\x0c\x09\xb7\xdf\x8e\xbd\xc9\xc5\xe7\xf7\xd9\x19\xf8\x50\xe7\xd8\x7b\x00\x81\x09\xc5\x55\xcc\xb1\x4f\xfc\xcd\x4d\xd9\x6d\xee\xa5\x30\x5d\xa7\x8a\xe8\x52\x8e\x10\xfc\x82\x77\x93\xf9\x89\xee\xce\x66\x7a\x9e\x7a\x9c\x62\xb8\x80\x5a\xf9\xe8\x2a\x0e\x69\xd5\x79\xac\x15\x19\xd2\x07\xb5\xa3\x06\x75\x63\x9e\xe2\xa7\x0f\x07\xee\xb2\x28\xd2\xfc\xe7\x83\x03\xc4\x28\x69\x06\xd1\xc2\x46\xf0\x20\x84\x41\x4e\x48\xe7\x32\xe7\xf4\x7f\xdc\xc4\x7e\x72\x47\x3f\xce\x88\x95\x02\xa6\x20\x01\x99\x93\xc0\x0c\xdc\x82\x2c\x23\x36\x7b\x99\x22\xfc\x60\xce\x60\xb0\x2e\xef\x4f\x15\xe0\x81\xc6\x4b\xc0\x96\xb9\x7c\xc9\x2d\x97\xdf\x43\x92\x27\xd4\x24\xb0\x2b\x72\x54\xa6\x93\xaa\x1e\x94\xbb\xe0\x3e\x4a\x42\x78\xef\xd0\xcd\xa0\x63\x08\x11\x54\x55\xe7\xe4\xa7\x92\xcc\x20\xb7\xf0\x0e\x44\xbc\xc0\xc9\x06\xd2\xa5\x97\xa7\x51\x82\xbc\x1c\x16\xa2\x80\xdb\xb7\xfd\x48\x81\x7d\xdf\xfd\x5f\xf2\x17\xf3\xb3\x5f\x92\xe5\x8f\xdd\x6f\x62\xf2\xfa\x64\xbb\xf7\x60\x41\xe3\xbc\x6b\x95\x6c\xc3\x2e\x55\xb5\xeb\xb1\xfc\x8a\x92\x5a\x8a\xbb\xac\x53\x81\x04\x75\x4c\x0d\x81\x5f\x50\x0c\x95\x0e\xf8\xb1\x7d\x43\x04\xf7\x48\x97\xa6\x64\xc4\x66\xd2\xf0\x69\x89\x91\xa9\xf6\xa8\x0d\x89\x3a\x4d\xd5\x7a\xa2\xa6\xc8\x73\xbb\x09\x6a\xa7\xa5\xdf\x08\xff\xd2\x47\xde\xb4\xa7\x23\x8f\x33\x97\xf2\xb0\x27\x1a\x73\x69\x88\x23\x76\x45\x5b\x69\xdd\xa9\x69\x23\x12\x0b\x3f\xbf\xf3\x16\x19\x5c\xa7\x5e\x91\x01\xdd\x15\xda\x44\x09\xa1\x15\x90\xad\xa2\xc4\x8f\x8d\x41\x01\x98\xc3\x5e\xc1\x1b\x76\x39\x0d\x68\xcc\xaa\x2d\xab\x39\x51\xee\x94\x24\x70\xfc\x24\x74\x02\x3f\x49\x60\xe1\x2c\x61\x5e\x38\x7e\xe2\x94\x93\x76\x72\x90\xe7\x11\x4c\x86\xd6\xc2\x59\xbc\x95\x3e\x3e\x25\x39\x5b\xc6\xac\xe2\x46\xa4\x85\x94\xc7\xd1\x21\xff\xca\x95\x9f\xdf\xd5\xe6\xfd\xab\xe5\x0c\x10\x37\x55\xde\xde\x43\xce\x9b\x77\xa8\x24\x1a\x95\xed\xff\x52\x0e\xb6\x09\x46\x42\x12\x7f\xa6\x0a\x03\xf2\xc1\xc9\x5f\x7e\x0b\xda\x17\x0a\x90\x41\x62\xfe\x5d\x0a\x92\xf3\xe4\x2d\xb8\xff\x84\xe9\xcb\x8a\x10\x94\xe3\x2a\x25\xb1\xf8\x09\x7a\xfb\x2d\x09\x07\xc5\xb1\x21\x1c\x56\x55\x70\x07\x8a\xb2\x41\x21\x14\x88\xb6\x23\x7d\xc6\xb5\x54\x9b\xd5\xa1\xb2\xca\x58\x03\xf3\x69\xda\x1b\xea\x47\x2a\x4c\x39\xdd\x33\xfc\xbd\xbd\xfa\x4c\x33\x38\x83\x25\xe2\x9a\x9f\x99\xe9\x6a\x2e\xa8\xb8\xe8\x96\xcd\x63\xb6\x0c\x0c\xc1\xd3\xe5\x0e\x38\xe0\xf8\x3a\xf5\x33\x1c\xf6\x8a\xb6\x06\x37\x58\x2b\xcd\x78\x77\x8d\xf8\xbb\x88\x74\x7d\x75\xf6\xe5\xf5\x74\xb3\xfd\x95\xaa\xc4\xee\x1f\x7f\xf0\x57\x8f\xeb\x6b\xb7\x89\x58\x3d\x59\x11\x3e\xc3\x9b\xbd\x0f\x1c\x0f\xb7\x2f\xce\xd3\x2f\x8b\x57\x3d\xd6\x05\x7a\x85\xa7\xcd\x17\x05\x42\x01\x08\xe6\xaa\x40\x95\xf8\xd4\x5c\x25\x6b\x63\xd6\xb9\x78\xf3\xf9\x0e\xf1\xe6\x75\x15\x86\xc4\x58\xf4\x8e\xb1\xe7\x88\x00\xbd\x30\xd4\xf7\xb1\x07\x9f\xbf\x39\x07\xe1\xdd\xd9\xab\x9a\x6b\x29\x62\x93\x9d\x43\xc2\x55\x2d\xe0\x11\x6b\xcc\x60\xce\xb6\x48\x39\xfe\x66\xb1\xe3\xcd\x05\x66\x10\x27\xee\x5a\x5d\x86\x83\xfa\x74\xa3\xfc\x0d\xaa\x02\xa3\x8d\x22\xa8\xa5\x79\x53\xc8\xb9\xd4\x1b\xf6\x1c\xaf\x13\xe7\x33\xbe\x3f\xfd\xc1\x07\x3b\x55\x24\x13\xc3\x76\xaf\x35\x6e\x0f\x41\x49\xfa\x43\xf1\x62\x9a\x10\xdf\xab\xca\x86\x88\x86\xd9\x3a\x71\xf9\x40\x0b\xba\xe0\x76\x83\xb2\x0b\x4f\x7a\xbf\x4e\x4a\x9d\x5d\x52\x8d\x6c\x63\xab\xe8\x66\xaa\xbc\xa9\x63\xfd\x54\xcb\x5f\xa9\x87\xd6\x29\x57\xa8\x88\x52\xfd\xe2\xcc\x4a\xb9\x18\xf9\x1e\x15\xfa\xbf\xc1\xb5\x13\xc2\xe4\x9f\xff\xf8\x3f\x85\xb3\xf4\x37\xc0\x49\x4b\x9d\x04\x5d\x03\x9c\x02\x3a\x64\xb5\xd8\x95\xb1\x72\x03\xbb\xe4\x23\xc1\xd9\x6b\x8a\xd2\xd5\x52\xa1\xc9\xcf\xd4\x78\xcf\x6f\xcf\x9f\xf6\x25\x8f\x94\x76\x8d\x05\x8f\x76\xb1\xc6\x88\xcc\x7c\xb2\x9f\x91\xf1\x1d\xcb\x24\xe9\xd7\x4b\x9c\xf1\x78\xf4\xb8\xe9\x0c\xec\xf5\x2b\xab\xbc\x06\xfd\x4c\xaf\x5a\xa5\x37\xec\x30\x25\x43\x56\x8d\x26\x95\x86\x36\x71\x69\x99\x53\xa3\x9f\xd8\x65\xcb\xd4\x9a\x1d\xa6\x76\xe6\x17\x7e\x00\x92\x02\x64\xca\xf4\xb8\xaf\x74\x53\x94\xbe\xee\x30\x4d\xbe\x85\xaf\x30\xd5\x8b\x0c\xdc\x46\x0f\xca\x34\xc9\xc7\xba\x29\x72\x5f\x75\x98\x1e\x7d\x7b\xb7\x24\x15\xe9\xa8\x1e\x8f\x25\x40\x70\x45\x4b\xf8\xa1\x2c\xfc\x50\x16\xbe\x2f\x65\xc1\xc0\xf1\xf6\x75\xf7\xc6\x93\xa6\x6b\xa9\xb6\xf0\x1e\xbe\x27\x19\x9a\x9c\x6a\xb1\x8d\xea\xcb\xee\xb1\x06\x1f\xa1\xe6\x9e\x18\xff\xfc\xa3\xe8\xde\x8f\xa2\x7b\x5f\xb9\xe8\x5e\xa5\xd1\x34\x8f\x4f\x9b\xae\xd6\x4b\x91\x38\x96\x07\xdb\x3c\x88\x52\x3d\x7c\x8c\x21\x70\x39\x21\x76\x75\xea\xb4\x69\x8b\x3b\xd6\xa9\xc3\x0e\x8e\x56\x11\x9f\x32\xe8\xd9\xb4\xa6\xf9\xcb\xf5\xaa\x3c\x91\xac\x43\xfb\x77\xaf\x82\x17\x85\xad\x30\xe0\xa4\xb8\x7e\xaa\x8b\xc8\x99\x70\x46\x7d\xf2\xab\x16\x76\x39\x34\x65\x20\x74\x30\x37\xfd\x28\xec\xa2\x79\x59\x3a\x82\x75\x55\x5d\x64\xa1\x5e\x53\x42\x42\x24\xa8\x31\xfc\x82\xfe\x57\x53\x10\x8c\x46\xba\x1f\xe9\x55\x05\xc1\xe0\x49\xbe\xbe\x45\xa1\xd5\xba\x89\x98\xf3\xbe\xca\xff\x96\x48\x43\x72\x6e\xb6\x0e\x9e\x1a\x2a\x24\x21\xd7\x7d\xb2\xb4\xdd\x68\x1f\x15\xbf\xf8\xba\xd5\x6f\x8e\xbf\xcb\xea\x37\xc7\x3f\xaa\xdf\x48\x97\xd7\x93\x6b\xa5\xfa\x8d\xb2\x11\x1e\xb5\xf4\x4d\xd9\x5b\x13\x65\x9c\x0e\x29\x12\x55\x27\x57\x4b\xe0\x04\xf1\x3a\x2f\x40\xe6\x44\x39\x57\xf7\x06\xb5\x61\x5f\xea\x46\x47\x32\x93\x6c\x78\x5c\x9a\x7d\xad\x5a\x38\xe5\x0d\x95\x14\xc2\xd9\xc2\x75\x46\x49\xe7\xe0\x59\x3b\xcc\x2a\xf3\x5f\xb8\x5c\x10\x47\xa2\xef\xa8\x56\xd0\xe3\x55\x0c\x6a\xac\x13\xb4\x02\x61\xe4\xbb\x03\x37\xf0\xc5\x14\x0b\xe2\x89\x36\x66\x6b\xac\xd6\x71\x11\x69\x3e\x4f\x60\xd1\xad\xc8\xd0\x67\x78\x43\x90\xf7\x34\x49\x1b\x21\x08\xda\x97\x1a\xaa\x5c\xd6\x3d\xb9\xbf\x4b\x1d\x7a\xcf\x9d\xdf\xfe\x45\x00\xa6\x1b\x11\x6a\xad\x5d\x4c\x05\xba\x3f\xa2\xe5\xa0\x26\xc4\xca\x20\x8c\x71\x1c\x84\xf8\x09\x5b\xd4\xbd\xc6\x98\x87\x1d\xa2\x1b\xca\x7f\xfa\x5b\xe2\x03\x9f\x07\xf9\xde\xef\xe5\xce\xdf\x4c\x5e\xff\x3e\x3b\x38\xad\x8f\x75\x70\xc4\x15\x64\x01\x96\x03\x97\xc7\xec\xd5\x06\x44\xa8\xc0\x8c\xdc\x45\x92\x67\x09\x4d\xda\x85\x7d\x2c\x85\x74\xf5\xf0\x1b\x51\xd6\x4d\xe6\x7a\xad\x40\xaf\xb5\xed\x37\xde\x4d\xa7\xbb\xc4\x53\xcc\x6c\xe3\x29\xda\x54\x2e\x65\xf1\x14\x1c\x9d\xbe\x15\x1c\x9f\x9d\xa3\x59\x3c\x28\x55\x6c\xef\x5e\x9c\x8d\x15\xa8\x75\x2b\xb7\xa3\x86\xf2\x3b\xba\x1d\xfb\x99\x25\x81\x96\x97\x67\x89\x3f\xd6\x4f\xee\xb4\x82\x9f\xe9\x30\x39\x86\x65\xff\x15\x26\x77\xe5\xe7\x77\x0e\x09\x0b\x96\x1d\xe1\x7c\x70\xb2\xc6\x1d\x5e\x45\xbb\x76\x9b\x26\xd7\x80\x85\xbd\xa8\x3d\xa8\xb1\x6c\x46\x41\xc6\x0c\xa9\xac\x83\x35\x1a\x9e\xec\x50\x31\x17\x8f\x90\x7b\xb0\x76\xb0\x0c\x04\x71\x6b\xef\xb5\x10\x03\x9a\xbf\x07\x7f\x4b\x0f\x1e\x17\xa3\xa9\xd8\xbe\x3e\x86\xad\x37\x81\xc1\x87\x69\x47\x75\x7e\x56\x67\x0e\x69\xe7\x30\x90\x22\xe3\xb5\xfd\x71\x1b\xb6\x8f\x7e\x07\xee\x13\x56\xc6\x91\xa0\x37\x9d\x13\x40\x39\x8c\x38\xe8\xe0\x3f\x0d\xa3\x61\x55\x3e\xfa\x1e\xca\x0a\x86\xd1\xed\x96\x0e\x05\x55\x21\xd9\xd6\x0f\xa5\xaa\x54\xd2\xd3\x72\x60\x37\x52\x6d\x9f\xdc\x21\xd6\x47\x8f\x9f\xe1\x0d\x2b\x2e\xa2\xef\x90\xff\xba\x8f\x1e\x13\x18\x82\x61\x03\x87\x73\x87\x59\x6d\x97\x9a\xa2\x03\xb8\xe6\x47\xfd\x36\xdc\xa3\x42\x29\x3d\x94\x02\xe3\xe3\xef\xba\x95\x02\xc3\xf7\x3c\xf5\x3c\xfd\xda\x75\xc0\x24\x7a\xb7\x70\x27\x75\xf7\xf0\xec\xea\xe3\x69\xf4\xf2\xfc\xf3\x1f\xff\x29\x3e\x21\xf9\x71\x1c\x78\xab\xf5\xd5\x18\xca\x4d\x99\xa7\xd0\x74\xec\xf4\xe7\x8e\x70\xfe\x67\x2d\x77\xf7\xef\x49\x70\xfe\x97\x45\x87\x3b\xf8\x00\x3a\x18\xf1\x9a\x3c\x01\xba\x2b\xd2\x5e\x02\x26\x55\x06\xda\x1a\x51\xb6\x4b\x39\x20\xd1\x22\x6b\xb6\xc2\x1a\xed\xad\xd3\x56\x6b\x63\xca\x95\xab\xb7\x21\x58\xae\x4d\xa7\x95\xe9\xbc\x2e\xcd\xa5\x9a\x76\x5b\x19\x14\x0c\x77\x03\x40\xe2\x20\x13\x46\xa8\xaf\xc3\x64\x73\xed\x69\x6f\x9c\xfe\x0c\x6f\xbc\x7c\x7d\x53\x8a\x6b\x1b\x4b\xb5\xc1\xe2\xdc\x60\x57\x96\x0a\xbb\xb4\x30\x29\xf2\x86\xc0\x1e\xcd\x8b\x04\x2c\x76\xdf\x4d\x8b\xa7\x4b\xf8\x2e\x3d\x7b\x78\xd9\xd9\xb4\x48\xe7\xb9\x37\x66\xc5\x52\xeb\xfc\x61\x50\xac\x33\x28\x52\x1c\xe3\xff\x42\xc6\xc4\x92\x87\x0d\x06\xc5\x57\xf0\xe6\x5f\xc2\x92\xd8\x77\x06\x43\x9b\x79\xda\x67\x30\xf4\x69\x35\x75\x4e\x91\x76\xa9\xb7\x9d\xe2\xef\xcc\xf6\xd3\xea\xfb\xce\x46\x54\xd2\xc4\xd7\xb3\x2f\xf2\x56\xe1\xfe\x6d\x8b\x1a\x9b\xb3\x8d\x5d\x31\xe0\x07\xf5\xc3\xa6\xd8\x7c\x8f\xb7\xb5\x9c\x98\x23\x41\x09\xfb\x77\xb6\x0e\xd2\x24\x93\x28\xf7\x26\xa3\x51\xfa\x80\x90\x75\xb3\x75\x12\xf8\xa4\xae\xe4\xb5\x66\x38\x75\x61\xd9\x64\x40\xcc\xb4\xf8\x08\x86\x43\x04\xfb\xce\xec\x86\x04\x04\xfe\x5b\x98\x0d\xc9\x40\x88\xd5\xb0\x6e\x20\xbd\x1b\x0d\x3f\x0b\x47\x95\xa6\x47\xee\x98\x6b\x63\x51\xd3\x46\x42\x57\x57\x12\x1a\x05\xbd\x5f\x06\x30\x1c\x45\xa2\x98\xbb\xaa\x3d\xbf\x80\x05\x64\xe6\xc5\x1f\x86\xab\x47\x30\x5c\xd1\x13\xe3\x87\xd1\xea\x87\xd1\xea\x5f\x06\xe5\x5b\xea\x8d\xa8\x37\x75\xd1\x86\x2d\xe2\x0d\xdb\x46\x1c\x36\xcd\xec\xbf\x9c\xad\x4c\x8e\x04\x25\x22\xe8\xd1\x23\x4e\x29\x1b\xf8\x1b\x3f\x8a\x4b\x51\x5f\x13\x7d\x6b\xfc\xf0\x7b\x31\xa6\x95\x9d\xe0\x09\x7b\x04\x68\xbb\xad\x4d\x8d\x9a\x18\xfa\xb3\xa7\xa1\x67\x22\xe2\x9c\xda\x6b\x93\xda\xf3\xf1\x7d\x7c\x36\xbb\x1f\x75\x36\xa9\x71\x53\xdd\x1b\xab\x5a\x94\x3f\x0f\xa3\x82\xdc\x9d\x74\x89\xc2\x53\x69\x3c\xe5\x6d\xcd\x4f\x02\x10\x13\x9e\x92\x5c\x94\xe8\x2b\x72\xaf\x5f\xdf\xac\xa2\x42\x9d\xc0\xa0\xc8\xd6\x60\xe0\x82\x30\x2a\xdc\x3a\xe0\x01\xd6\x9a\x15\x7e\x51\xd5\x9f\xc9\xa7\x69\x91\xeb\x21\xc8\x45\x3b\x91\x28\x8a\xd2\x9a\xd2\xfc\x25\x6f\x9c\x31\x0e\xd0\x08\x4c\x73\xfe\x7c\x1c\x2d\x96\xa8\x3c\x4a\x00\x57\xa9\x1f\x14\x4e\xba\x8e\xe3\xaa\xa2\xc8\x78\x3e\x70\x61\x22\x15\x39\xd1\x90\x08\x51\x5c\xc8\xb4\x32\x24\xc6\x3f\x0f\xf1\xba\xd9\xc8\x3e\xab\xd3\xa5\x1c\x3b\xc2\xbd\xb9\x89\x41\xcb\xfa\xc0\x9f\x73\x3c\x36\x3a\x09\x7e\x13\xed\x00\x3a\xc1\x49\x68\xf1\x43\x5b\xf1\x5c\x7e\x52\x12\x14\x66\xbc\x60\x2e\x47\xeb\x6d\x22\x70\x6f\x87\x3a\xae\x91\x82\x76\xa2\xf5\xbf\xd9\x89\xd6\x34\x86\xdb\xd5\xf7\xe1\xae\xb8\xbd\xdb\x6c\xde\x5e\xed\x20\x5b\xab\xb9\x7e\x3b\xe1\xca\x33\x31\x8f\xe4\x26\x8e\x4e\x41\x0a\x16\xbe\x36\x95\xf3\x68\xcd\xa6\xe5\x1f\x5c\xcb\x5e\x5e\x64\x00\x59\x3a\xdb\xb0\x25\x7b\xbd\xcf\x23\x3f\xca\xd3\x52\xeb\xde\x77\xa6\x1c\xa7\xe3\xd5\xbb\x0b\xf0\xa9\x47\x84\xcb\xb3\x6a\xea\x0a\xca\xe5\x67\x78\x33\x64\xa4\x61\x67\x98\x9e\x1d\x44\x2c\x6b\xda\xaa\x93\x80\x7b\x6e\x8f\x28\x80\xcc\xa6\x6d\x31\x33\x6f\x0b\x53\xa6\xf9\x0e\x1b\xc3\x90\xd7\xde\xd8\x9b\x54\x07\xa2\x11\x79\xd3\xbc\x29\x18\x91\xdb\x6c\x05\xf2\x52\x8f\xfb\x80\x2b\x3f\xb3\xef\x5b\xe1\x45\x31\xfe\x6d\xfe\xfb\x64\xde\x59\x3e\xf3\x73\xdd\x1b\xe5\x17\x5b\xbb\x9e\xf3\xcb\x60\x74\x2f\x6b\xbc\xbf\xb6\x0e\x0e\xc5\x23\xc3\xf7\xd8\xc5\xc9\xd1\xe4\xd8\x10\xed\x60\xad\x9d\x1a\x92\x15\x99\x90\xef\xfc\xac\xe6\x06\x5e\xf5\xb6\x13\xb4\xc8\x05\xff\x7d\x03\xe6\x46\x63\x67\x42\x59\xd9\x6e\x1e\x85\x16\xbd\x89\x35\x64\xf5\x51\xd8\x5c\xed\xf4\x5e\xfa\xac\xc7\xac\x69\x72\x18\xb4\xe8\xc8\x5c\x96\x55\xb3\x86\x4a\xe5\x75\xd3\x10\xcc\x9f\xf3\x03\x6b\xed\x5a\x60\xec\x5b\x1f\x7a\xa0\x54\xc1\xa5\xbe\x0c\x7d\x09\xf0\x5a\xe0\x99\xba\x66\xa4\x12\xcb\xf6\xed\x10\xe1\x4a\x2f\x72\x13\x8b\x8a\xc9\x9d\x07\xa9\x56\x40\xee\xdc\x54\x55\xa1\xb8\x4d\x2b\xae\x1e\x23\xd8\xd8\xb8\x5d\x09\x62\xbb\x02\xc4\x93\x8e\x05\x88\x2d\xca\x0f\xeb\x8a\x0f\x0b\x56\x5a\x3c\x79\x89\x38\x6d\x1c\x02\xaa\x1b\xcb\xca\x4f\xd0\xc1\xb4\xdb\xcd\xb0\xfb\x16\x3a\xc2\x71\x67\x36\x20\xd8\x9a\x70\xaf\x96\x51\xee\x44\xb9\xb3\x82\x79\xe1\xc4\xd1\x1d\x88\xb7\x4e\xb8\x06\x4e\x01\x9d\x85\x9f\xdd\xf8\x0b\xe0\x04\x30\xa6\x60\x0a\xbb\x18\x03\xda\x1b\x6d\x05\x73\xab\x5a\xde\xb0\x45\xe6\xbb\xa4\x20\xf6\xa8\x76\x7e\x17\x30\xf0\x9f\xde\xbc\x39\xcd\x9e\x2e\xde\x5a\x2b\x9c\x16\x97\x1d\x2e\xd9\x9d\xde\xba\xbc\x72\x3d\x0f\xd4\x56\x28\x25\x08\x7c\xef\x35\x9f\x15\xff\x07\xd5\x6e\x25\xb5\x4f\x09\x6b\x11\x22\x6a\xd4\x4b\x4e\x87\xe0\x16\x7d\xac\x0e\x8f\x46\xa1\x67\x54\x3e\x3b\x9f\x54\xdf\x6c\xc3\x87\x3d\xa3\x30\x1c\x7c\x27\xf5\x31\xcf\xae\x9e\x3f\xcf\xde\xfd\xfd\x63\xfd\xfd\xbf\x97\x7b\x8a\xb3\xf4\x71\x11\x6c\x0f\x87\xdb\x71\x46\xd2\x63\x73\x35\x3b\xa3\x51\x48\x10\x4c\x1d\xaa\x21\xca\x2b\xd5\xe3\xda\x57\x35\x69\xf6\x7d\xf9\x27\xaf\x4f\xcf\x7f\x5b\x7e\x79\xb0\x35\xff\x10\x06\xe0\xec\x12\x4d\xc6\x9b\x31\x4b\xa6\x46\x04\x31\x4b\xb3\x81\xeb\x78\x8e\x5e\xde\x09\x17\x6d\x9d\xd4\x93\xa3\x59\xca\xb3\x93\x32\x87\xce\x48\xa3\x2d\x50\xc5\x9f\xff\x86\x32\x52\x7a\xcb\x27\x83\x35\x46\xe3\xcd\xab\xda\x50\xa7\x2c\x18\x83\x19\xbf\x04\xd6\xd0\x94\xb4\xe0\xa7\xcc\x09\x43\x29\x95\x0d\x45\x3c\xe1\x3e\x2c\x22\x00\xdf\x6d\x40\xb6\x89\xc0\x7d\xc3\xa5\x44\xd1\x22\x14\x1d\x42\xfd\xb3\x43\x31\x12\x77\x39\xae\x9e\xc5\xd5\xc5\x70\x38\x63\x8c\xea\xdf\x18\x56\x44\x5b\x81\xdb\xbd\x1e\xd4\xd7\x66\x33\xcf\x4d\xd4\x0e\xcd\xeb\x2c\x9b\x0d\x07\x7c\xbd\xb0\x16\xeb\xa6\xd9\x23\x33\x75\xe8\x79\xe0\xc7\x8a\x9f\xd2\x91\x03\x8f\xff\xf8\x63\x7c\x28\x82\x47\xd3\x76\x08\xe0\x34\xad\x8e\x8e\x43\x21\x57\x11\x0a\x42\x5e\xf9\x0f\xe5\x0f\x24\x34\xaa\x78\xd4\x81\xfb\x84\x43\x92\x16\x91\x2d\x0d\x83\x1b\xb8\x65\x8b\xca\x24\x85\x07\xfc\x07\xdd\x03\x01\x5c\xe3\x7c\x59\x57\x04\xcc\xce\x57\x7e\x1c\x57\xfb\xe1\xc8\x40\xd7\x81\x9b\xad\x93\x24\x4a\x16\x67\xcc\x64\xcf\x07\x41\x23\xa8\xbe\x72\x0c\xa0\x01\xd6\x5c\x15\x2b\xb4\x2c\x26\x65\x1d\xd5\x1b\x7b\xc2\xe5\x9b\xa2\x3e\x74\x20\x0d\x8d\xf1\x80\xa7\x25\x01\xe4\x20\x3d\x0b\xa4\xdf\xa6\xad\xd9\xe4\xa0\xac\x88\x6c\xdc\x60\xf5\xae\xcd\xa4\xbc\xf2\x78\x95\x07\x4f\x1f\xb2\xc7\xef\x55\xd4\x94\x52\xdc\x93\x9b\x7b\x95\xaf\xef\x9c\xa1\xa2\xe6\xb9\x95\x0b\xb6\x6a\x3c\xf5\x23\x93\xf5\x43\x79\xb6\x40\x51\x4a\x06\x4b\xc9\xbf\xa1\xb1\xd8\xc6\xe1\xa8\x7a\x34\xaa\x85\x68\x8e\x23\xfc\xca\xb3\x79\x0f\x72\x90\x6d\x40\xe8\x9c\x5e\x7c\xb0\x9e\x12\x3d\xac\x47\x9a\x6d\x92\x91\x06\x51\xf6\xb9\x01\xc3\xf4\x5b\xcd\x11\x67\xb7\xb7\x9e\xe6\xb8\x66\x9a\x34\x61\x1e\xef\x67\x14\x6f\x8a\x8e\xf0\x37\xd1\x33\x57\x87\x30\x4e\x3d\x62\x93\xc6\x36\xdf\xe8\xa5\xa2\xa6\x63\xbd\xb5\xe7\x2f\xad\x67\x81\x7b\xac\x9b\xc8\x1b\xff\xe1\xaf\x35\x18\xb2\xdf\x6a\x5d\xcf\xa2\xfc\xae\xd7\x55\x7d\x9e\x2e\xc1\x0a\x64\x7e\x5c\xb6\xdc\xbc\xb8\xda\x6e\xbb\x1c\xda\xb6\x74\x6a\x4b\x29\x72\x96\x38\xef\xcb\xd3\xba\x45\x38\x69\xdd\xa1\x1d\x25\xfa\x40\xce\x02\xb6\x6b\x87\x32\x9d\x85\x79\xef\xb1\x89\x74\x89\x47\xe5\x5c\xc0\x38\x0a\xb6\xff\xbb\x15\xa1\xe6\x93\x9a\x49\xa6\xa8\x41\xa4\xcb\xfc\x86\x52\x36\xdf\x42\xb7\x71\xce\x8f\x73\xb8\xb7\x3f\xd3\x8d\x11\x5c\x75\x3a\xb1\xe3\xf0\x59\x15\x72\x71\x00\x65\x61\x6e\xfc\x70\x81\xea\x06\xdf\x2f\xa3\xa2\x21\xb0\xba\x09\x56\xcf\x8e\x97\x9a\xad\xa0\x16\xa4\xa9\x8d\x13\xd6\x94\x15\xa9\x46\x7c\xca\x6a\x4b\xeb\xd2\xd4\x18\x07\xd1\x74\x94\x52\x8f\x4c\xe3\xa8\x40\x91\x54\x96\x09\x68\xe5\xed\x09\x72\x61\xf8\x31\x58\xa8\x15\xcb\x5d\xb1\xce\xf2\x78\xce\x87\x6d\xcc\xb9\xfc\xb3\xd0\x2f\x7c\xcb\xea\xca\xca\xc5\x78\x5e\x4e\x6a\x72\x52\x39\x2f\xd0\x84\x69\x0e\x95\x8b\xeb\x87\x3b\xd2\x7f\x2e\xde\x53\x74\x2c\x87\x9c\xef\x83\x28\x8a\xd7\xcc\x23\x86\x2f\xb7\x67\x7e\xb1\x5e\xb9\x4c\x8f\xd4\x5e\x7f\x3b\xf4\x86\xef\x40\x3c\xe6\x72\xd9\x20\xb2\xc8\xd3\x53\xa0\x2e\x04\x9e\xb0\x01\x9f\xb0\x18\x92\x81\x3e\xa1\x65\x5c\x71\x5f\x78\x3e\xd3\x9a\x0c\x1e\xbd\x8c\x98\x94\xef\x28\x87\xb1\x7d\xce\xc4\x9e\x89\x15\x0e\x21\xc2\x1c\x51\x59\xc5\x7b\x12\xe3\x4d\x5d\x88\xaa\xb0\x10\xc7\x7b\x82\xd3\x78\xd2\x7b\x76\x75\x2f\x93\xec\x05\xa6\xb1\xcd\xdc\xec\x60\x1a\xb9\xb9\x9d\x18\xf1\x06\x78\x8c\x01\x09\x7e\x80\xd9\x2f\xa2\x24\x5d\xb3\x7c\x66\x26\xea\x26\xa3\x26\x1c\x02\x03\x46\x69\xdd\x94\x6b\xf0\x09\xa2\xdc\x4b\xfd\x30\x44\x66\x94\x2a\x8a\xd9\x1e\xa4\xa0\xdb\x51\x55\x1b\x74\xec\xb6\xc4\x79\x14\xec\x9b\xe3\xef\x02\xea\x51\x18\xf2\xa4\x8f\xcc\xec\xd9\xd7\xcc\xcc\xe6\xe3\x40\xe6\x5d\x73\xb3\x95\x60\xa6\x76\x88\x8f\xf2\x18\x76\xc1\x7c\xd4\x1c\xc3\xe7\x67\x9a\xfe\xea\xf2\x0d\xad\xc7\xb3\x23\x42\xa3\x66\xac\x24\x56\xea\xab\x0c\xb8\x3d\x8e\xa3\x66\xc0\x34\x4b\xfb\xb1\x46\x6c\x89\xf6\xa8\x19\x99\xa6\x7a\x58\xcf\xe3\x6a\xc6\x84\xd4\x0c\x8b\xbc\xf1\x98\xe3\xb2\x41\x8e\xd4\xf1\x1e\x3a\x34\x3b\x0d\xac\xb1\xd0\x18\x9a\x39\x82\x9c\xd4\xbf\x5f\x27\x18\xac\x1a\x17\x4d\x8d\x7d\xb6\xac\x18\xf8\x1a\x1b\xb7\x4d\x9f\x9e\xf7\x56\xcf\xcc\x11\x8f\x21\xfd\xf5\xb0\x1e\xe9\xf2\x50\x40\xba\xac\x3c\x4c\x5a\xff\x83\x0e\xef\xf2\xb0\x0d\xde\x25\x21\xd2\xa1\x11\xf6\xe0\x7a\xf0\xc7\xbc\xbe\x8e\x51\x2b\xf0\x00\x81\x3c\xbc\x47\x4d\x57\x48\xad\x8d\xda\xd5\x78\xaf\xea\x84\x58\xa0\xbb\x9c\xb4\xc3\x2c\xe0\xed\x1a\x33\x8b\xa2\x6a\x8e\xb6\xb0\x9a\xda\x4e\x7d\x71\x35\x47\x57\x60\xcd\x51\x8c\x2c\xed\x81\x3b\x2d\x36\xf3\x31\x1b\xe3\xa3\xd4\x12\x73\x14\x6b\xef\x64\xde\xa2\x9e\x98\xd3\x4a\xc4\xcf\x1e\xa3\xae\x58\xd3\x0c\x9a\x6a\x8b\xd9\x4e\x61\x27\xa8\x86\x26\xa3\xa8\xa1\x72\xe4\xcc\x14\x88\xd9\xaa\x62\x86\xb3\x83\x75\x4e\xfb\xae\x1d\xb4\x83\xd3\x31\xe8\x53\xa1\xbe\x01\xde\xa1\xe1\xb0\xda\x05\xe2\x01\xf5\x69\x06\x31\x35\xf2\x87\x05\xd4\x83\x22\x34\x1a\xc1\x1e\x9a\xe7\xd9\x1d\x09\x42\x1f\x7e\xfc\x9d\x33\x8b\xce\x2a\xf6\xb5\x19\x46\xc1\x56\xed\x77\xdd\xe8\x87\xb6\x35\xc4\x34\x1f\x10\xad\x81\xc7\xdb\xc3\x0e\x77\x8d\x71\x9d\x7c\xd1\x26\xda\x06\x94\x17\x15\x54\x86\x2c\xff\x88\x8b\x19\xba\x8a\xe8\xaa\x6a\x46\x5f\x96\x6f\x3c\xdf\x80\xa4\xb8\x8a\x56\x00\x2f\x72\x1b\x64\x9a\x1a\x5b\x66\x83\x5d\xd5\x89\x72\x6f\x09\xe3\x98\xbf\xcf\x4b\x4b\x42\x7d\x5d\x74\x68\xd6\xbe\xb7\xce\x1b\x88\xac\x0d\x6f\x08\x07\x1b\x39\x01\x18\xab\x1b\x15\xe5\x74\x0b\xd4\xc0\x3e\xb6\x4e\xb4\xaf\x05\x73\xf0\x1e\x04\x20\x29\x18\xc1\xf1\xb4\xea\x8c\x7b\xbb\x90\x9a\x23\xf4\x71\x4f\x84\x36\xd9\x1a\x8d\x44\xd6\x6c\x9e\x0d\xba\x4f\x5a\x83\xd5\x3e\xe6\x72\xe0\xab\xad\xf3\x1e\xfc\xb9\x8e\x32\x94\xd5\xb2\xfb\x62\xb4\x44\x73\xd0\xd9\x1e\x35\x02\x8a\x12\xad\x39\xbd\xd1\x11\x34\xd2\xa3\x9e\x6a\xc1\x18\x4f\x05\xb9\xa0\xbe\xcd\x19\xd4\xd4\xa8\x52\xbb\xbd\x8f\x46\x2f\x11\x6d\x7b\x6f\xf6\x02\x64\xab\x28\xcf\xdb\x9c\xc5\x75\xca\xb8\xb8\x72\x9d\x81\x03\x1b\x32\xfc\x84\xc7\x6a\x8c\xff\xc7\x1c\x07\x46\xf9\xe9\xe5\xb9\x78\xc4\xf1\x5f\xa7\x20\x43\x6a\x89\x29\x1d\x4c\x9c\x9e\x21\x0c\xfa\xcf\x35\xc0\x80\x8b\x6e\x90\x47\x43\xc2\xf3\x43\x9a\x92\x43\xfd\x33\x9c\xd3\x07\x2b\x97\x74\xc3\xf0\xe3\xa1\x5b\x89\xc4\x64\x6a\xe8\x26\xbf\xc1\x42\x38\x0d\x81\x95\x9d\x67\x45\xac\x2b\xd2\xac\xf0\x4f\x2e\x96\x7b\x54\x37\x8b\x81\xfb\xc4\xd5\x8e\x98\x06\xa0\x46\xa1\x60\xdc\xb0\xbc\x57\x72\xac\x60\xa4\x87\x49\xcd\xd7\xb3\xb2\xa0\xb2\x19\x69\x66\xd7\xa3\x2b\x2b\x7e\x52\x03\x8d\x36\x42\x93\xf8\xad\x1f\x46\x41\xd3\x9a\xba\x19\x34\x76\xe8\xb9\x62\xda\xaf\xd0\x37\x89\x52\x3a\x16\x62\xde\xfc\xf0\x5d\x12\xe3\x20\x93\xf7\xe5\xb1\x81\x7f\x1c\x7c\xca\x50\x28\x4e\xfb\x61\xd5\x0b\xc1\x63\x33\x00\xe9\x91\x21\xf5\xb9\x95\xf6\x41\x10\xe6\x82\xa5\x9f\xa1\x4a\xbb\x24\xd6\x82\x08\x14\x01\x79\x4e\x87\x41\x27\x80\x68\x08\x29\x63\x55\x2d\x61\x0a\xaa\x01\x1e\x40\x70\x00\x53\x90\x78\x04\x31\x8a\x02\xd5\x15\x20\x4d\x41\xe6\x21\x5f\xb3\x3b\x70\x11\x22\x52\xe0\x27\xb8\x96\x30\x83\x46\x22\xd9\x90\x79\xb0\x04\xe1\x3a\x06\xa1\xb7\x04\x59\xf1\x45\xf7\xc5\xcd\xb6\x40\xca\xd3\xa2\x10\x0b\x40\x10\xcc\xba\x1b\xbf\xec\x00\xf8\xc1\xd2\x1d\xb8\x5e\x91\xf9\xc1\x9d\xc7\xc6\xf8\x27\x49\xcb\x44\x79\x7d\xa9\x9f\x15\xf9\x01\x09\x2b\xf2\x70\x44\x10\x46\xf9\x37\x43\xe8\x69\x60\xf7\xda\x95\xa8\xd0\x56\x40\x66\xb5\x8f\xe3\xe8\x16\x04\xdb\x20\x06\x1e\x5d\x32\x74\xd3\xf2\xb0\xca\xaa\xff\xd0\x0f\x02\x98\x85\xb8\x67\x56\x6e\xb7\x75\x12\x5f\x95\x5d\xd3\x63\x36\xd7\x06\xfb\x8c\xf6\x1e\xbf\xe4\xf9\xaf\x27\x8b\xd7\x17\xb3\x5f\x3a\xe3\x97\xb0\x89\xee\x0d\x78\x09\xc8\x32\x98\x99\x6f\x16\x2c\x0a\xcd\x4d\x60\x11\xdd\x46\x24\x38\xd1\x15\xdf\x7f\x0d\x36\x20\xa6\x90\xf9\xfa\xe8\x2e\xe5\x42\x10\x94\xc7\xba\x21\xcb\xc1\xf8\x78\x93\xb1\x49\xb0\x19\xe1\xcc\xa7\x28\xf7\x66\xdc\x6b\xe2\xbc\xc9\x43\xcd\x30\x03\x13\x73\x0b\x21\xc8\x83\x2c\x4a\x99\xdb\xc4\xda\x68\x63\x9c\x25\xc2\xe8\x23\x09\x9c\xe5\xef\xab\x28\x89\x56\x6b\x73\x10\x2e\x9d\x3c\x07\xc1\x57\xad\x1b\xc1\xff\x6b\x5e\x31\x1d\xfc\xdf\x54\xf5\x14\xc1\xe4\x2c\xca\x4b\x4d\xde\x0a\x03\xf0\xdd\x9d\x6f\x02\x06\xb7\xb1\x44\x58\x9c\x5c\x8a\x21\x8b\xf7\x7e\x55\x82\x05\xfd\x7e\x03\x73\xa4\x68\x2e\xfd\x24\x8c\xc1\x73\xcc\xfa\x9a\x3b\x24\xdb\xa5\x04\x65\xb2\x86\x1c\x42\x53\x66\xcc\xc8\x1d\x20\x02\x2b\x54\x40\x78\xe3\xd1\xa1\x75\x81\x61\xa3\xef\xf6\x24\xb8\xbf\x93\xf4\xeb\x2f\xd9\xf1\xe6\x3e\xcd\x9f\x09\x32\x7b\x97\x1c\xea\x51\xab\x1c\xea\xae\x69\xd3\xfd\xa6\x4c\x67\xeb\xbd\xc7\xc5\xfd\x0d\xfc\x99\xe7\xab\x83\x59\x8f\x30\x79\xef\xd1\xac\x15\x84\xbc\x92\x18\xad\x80\xf1\xde\xaf\x13\xc7\x27\x19\x8f\xda\xcc\xe8\x2e\xf8\x75\x9a\xb4\x57\x21\x78\x41\xc5\xbd\xad\xa2\x17\x12\x70\xaf\xad\xd3\xf9\x47\x0b\x14\xdb\x1d\xa1\xf0\x64\xd0\x52\x5b\xbe\xce\xd6\x96\xd8\xa4\x75\x3c\xfd\x9d\x88\x9e\x78\xf3\xcb\xc7\xe7\xab\x6d\x6e\x66\xe9\x7a\x53\x55\x13\x77\xf5\x03\xf7\xa0\x1a\x25\xc4\x93\x29\xf6\xb7\x10\x5f\x60\xda\x8b\xb2\xde\xa4\x18\x4c\x8b\x68\x85\x22\x63\xf7\x7b\xc9\x2f\x2f\x6e\xb2\xf3\xdf\x56\xb0\x4f\x29\x06\x02\xb8\x5a\x81\x24\x64\x18\x8f\xbc\x44\x63\x84\xa9\x97\x68\x22\xee\xe0\x6e\x6c\x57\x7f\xa1\xc0\xf7\xe4\x48\xc5\xbb\x52\x94\x5d\x52\x21\x0e\xc1\x2c\xf9\x69\xde\x50\x09\xc0\xaa\xd0\x9e\xed\x58\xaa\x96\x55\x30\x51\x3e\x02\xde\x1c\x2a\xcf\x7b\x85\xb6\x49\xf0\x14\xa5\xca\x5c\x56\xa9\x47\x74\x91\x0e\x9b\x62\xe4\xb1\x96\x8e\x03\xe5\xf9\x59\x6b\x26\xc1\x3b\x82\x5c\xf1\x59\x2e\xaf\xdf\xcd\x04\x86\x69\x68\x88\x45\xd7\xe3\x7a\x7f\x26\xb4\x73\xcb\x44\x99\x86\xd5\x52\xea\x00\xa2\xdb\x0d\xbc\x89\x62\x80\x5d\x41\xf7\x51\x58\xe3\x46\x50\x9d\x4a\xa6\xf2\x80\x32\x1f\x6c\x73\x6c\xae\xa9\xfc\xcc\x6f\xa9\x49\xd8\x88\xcb\xe6\x6a\xeb\x91\xb5\x4b\x0c\x79\x5b\x19\x9e\xa5\xdc\x10\xa9\x7f\xf2\xe5\x9f\x69\xf5\x46\xc7\xd4\x10\xae\x01\xd3\xd1\x6f\x5a\x52\x71\xd6\xe3\x51\xe7\x69\x23\xbc\x2b\x79\xc6\x04\x04\x4b\x4d\x85\x61\x5f\x74\x98\x2d\x7e\xd7\x2e\x54\x71\xe7\x69\x19\x72\x99\xbe\x71\x06\x53\x6f\xd3\xeb\xbb\x44\x64\x9b\xa9\xb6\x29\x11\xd9\xd3\x74\x2f\x32\x70\x1b\x3d\x28\x53\x25\x1f\xeb\xa6\xc9\x7d\xd5\x61\x8a\xf4\xed\xa6\xe9\xed\x60\x2e\x51\x25\xdf\x6d\x14\x23\xc5\xf0\xd2\x7c\x12\xba\x22\xa6\xdd\x78\x72\xcd\xeb\x8b\xaa\xfe\x48\x7b\xd2\x2c\x86\x06\xd7\x98\x3b\xfe\x74\x63\x69\xe7\xa4\xef\x84\x43\xec\x18\x7d\xd4\xaf\xb0\x79\xb5\x95\x5f\x9b\x69\x63\x20\x74\x9e\xea\xcb\x5b\xd4\xbd\xfe\x6f\x38\x26\xcd\x5c\x62\xdd\xf4\x22\x82\x06\x69\xf9\xce\x1b\xa2\x1f\xb5\x79\xe7\xe9\x62\x31\x74\xba\x74\x86\x5e\xac\xeb\xd1\xce\x9b\xdf\x0a\xab\x97\x63\xf6\x89\xe0\x81\xbf\xc8\x60\x00\xf2\x9c\x80\x32\xd7\x1e\xee\x63\x84\x8c\xcb\x2a\x5e\x32\xa8\x26\xcc\x99\x4f\xf2\xaa\xb8\xa1\xd8\x8d\x59\x57\xb2\xe9\x6f\x7c\xc8\x0c\xb4\x51\xee\x45\xa5\xe0\xc3\xd9\xd6\x5a\xff\xb1\x94\x68\xad\x42\xda\x72\xd2\x0a\x37\x23\x5e\x1a\x2a\xbd\x54\x8b\x6e\x86\x02\x8c\x07\x7f\x4c\x8f\x71\x0e\xb7\x2b\x19\x81\xc7\x3c\x5a\x54\x91\xf9\x49\x8e\x00\x8a\xae\x20\xaf\xee\xca\xb4\x11\x52\xde\xbb\x92\x52\x56\x4f\xb0\xe8\x35\xfb\x42\x9b\xcb\xda\x75\x0e\x4b\xd5\x39\x18\xf6\xbf\x3c\x9d\x78\x15\xa0\xd1\xcb\x5b\xb8\xce\x1c\x92\x15\xea\x60\xa9\xec\xb0\x43\x6e\xd8\x3d\x78\x58\x43\xef\x4e\xd4\xee\x81\xd6\x6f\xa1\x23\xdd\x9b\xad\xbd\x31\x9d\xa8\xfd\x34\x8e\x15\x62\x57\x91\xbf\x7e\x10\x80\xb4\x00\xa1\x03\x33\x27\xc4\xde\x13\x10\x0e\x9d\xb7\x70\xe5\x87\xce\x7d\x14\xc7\x42\x5b\x01\x4c\x8a\x28\x59\xc3\x75\x1e\x6f\x9d\x15\x4c\xa2\x02\x66\x8e\x9f\xa6\x71\x44\x63\x8a\x73\xe8\x80\x87\x14\x04\x85\xb3\x82\x19\x50\x3a\x8e\xc4\xec\xbb\x62\x09\x9c\xdb\x75\xb1\xce\x5a\x57\xa5\x93\xb6\xa1\x69\xd5\xc5\x4f\x9a\xe2\x03\x74\x96\x45\x66\x63\x32\xd5\xac\x4b\xe3\x75\xe6\xc7\x38\x35\x3a\x8f\x92\x45\x0c\x34\x4e\xf7\xc6\xc2\x76\x3c\x80\xad\x07\xd7\x45\x0c\x0a\xd9\x0d\x1f\xfa\xf9\x81\x48\x4f\xe2\x8e\x47\x31\x01\x38\x04\xc1\xca\xda\x49\x0d\x33\xfd\xd9\xbe\x68\x08\xc2\xbe\xdb\xc0\xee\xc1\xcb\xcb\x71\x18\xae\xfb\x46\x3c\x55\xfd\xe3\x8c\x20\x28\x39\x34\x20\x61\xa4\x48\x8d\xb8\x16\xf4\xfa\x92\x7c\xa7\x30\x29\x32\x18\xc7\x08\xe7\x80\x3d\xce\x3b\x31\xab\x08\x34\x2d\xe3\x6a\x58\x23\xf0\xb3\xb0\x0d\x33\xd0\x25\xdc\x9d\x29\x10\xe6\x56\xb6\xf7\x11\x13\x93\xc3\xd1\xc7\xf8\xd5\xab\xdb\x1e\xed\xa1\x97\x6c\xe6\xbc\x1d\x94\xd0\x63\x48\xd1\x61\xfa\x34\x86\x72\xb7\xa3\xb9\xcd\xe5\xa8\x12\x8c\xed\xfc\x2b\x4c\x0a\xea\xe4\x94\x05\x97\x51\x1a\xf4\xc5\x5c\xdf\x07\xc6\xfb\xe6\x66\x7e\xf6\xf0\xfb\xb3\x3a\x8c\x77\xca\x32\x3b\xba\xef\x5c\xb9\xe8\xe5\x0b\x98\xdd\x44\x61\x08\x12\x35\x80\x46\x0c\x73\x35\xf2\x48\x9b\xf2\x40\x3c\x30\x88\x8a\x07\xb2\x90\xa1\x66\x9a\xa1\x40\x9a\x2e\xdf\x7a\x67\x65\x67\xdc\x8f\xf1\xd7\xc3\xfd\x70\x85\xb2\xf2\x1d\x4c\x06\xae\x7d\xd9\x7d\x1a\xdd\xa5\x6b\x93\xc2\x75\xd9\x95\xbf\x7f\xc4\x2a\x3d\xad\xba\x8a\xf2\xd7\xc0\x0f\x89\x31\x4f\xd3\x19\xf7\x6d\xe7\xce\x18\xb6\x10\xd7\xab\x37\x19\x8d\xd2\x07\x27\xca\xbd\x22\x5b\x27\x81\xcf\x42\x23\xc3\x30\x03\xb9\x71\xee\x4f\xb9\xaf\x7b\xa0\x33\xc8\x6e\x2f\x60\x66\xe4\xb2\x94\x7e\xb7\x7b\x57\xa1\x68\x36\xd5\x74\x26\x19\x56\x77\xef\x72\x53\x8f\xe7\xc1\xc3\x7d\x98\xaf\xd9\x0d\x75\xa0\x26\xdd\x12\x32\xf4\xde\x38\x7f\x81\x81\xae\x90\x04\x99\xd6\x98\x0c\x84\x11\x4e\x4d\x75\xa2\x74\xc6\x03\xd5\x65\xd5\x84\xb7\x40\xcf\x8d\xb6\xc0\x07\x4a\x4f\xad\x40\x0f\xd0\x57\x55\xa5\x2d\x19\xf0\xe0\x9f\xff\xf8\x4f\xf1\x09\x09\xca\xc0\x81\xb7\x5c\x13\xca\xc9\x51\x8f\x50\x50\x6b\xa2\xa8\x2c\x77\xfd\x20\x13\x38\xff\xb3\x85\xb1\x70\x77\x18\x01\xe7\x7f\x35\x76\xb7\x43\xca\xbf\xcd\x3d\xdb\xa9\x35\x60\x69\x6e\xdd\x36\xb5\xe0\xd1\x55\xfa\x96\x6a\x28\xcc\xe4\xd2\x18\x88\x8e\x95\x3f\x0f\x6d\x3c\xdb\xca\xee\x82\xc2\xd8\x9f\xfe\xf9\x9d\xc4\xf9\x7c\xfe\x6d\x99\x6c\x46\xaf\x8e\x44\x0d\xd4\xed\x21\x80\xe7\xd1\x63\x0d\x25\x4a\xf7\xb7\x74\xf8\xe7\xbe\xaf\xdc\xd3\xe3\xf9\x8b\x57\x1f\xbe\xcc\xbb\x5f\x4f\x59\xa2\x8b\xfe\x9a\xca\x45\x5f\x90\xbf\x2b\x7d\x51\x77\x7d\xcd\x4d\x6f\x89\x69\x6b\xfa\xfc\xfb\x43\xbe\x6c\xbb\xf9\x9a\x6a\x7d\x29\xdd\xed\x1a\x4a\x7e\xf6\xcd\x52\xdf\xc7\xa5\x74\xba\x7a\x3d\x2b\x4e\x6f\x4e\x1b\x2f\xa5\x5d\x0a\x2d\x0b\x26\x30\xcc\x20\x9a\x30\xd1\x5e\x6a\x2d\x6b\xab\xc9\x68\x74\x14\x3a\x19\x41\xbf\x30\xa7\x2b\x6a\xf3\xdd\xc5\x6b\x87\xe2\x43\xe0\x80\xaf\xd7\xab\x14\x64\x08\x91\xc8\x29\xfc\x85\x53\x95\x3a\xe1\x47\x46\x1b\x6b\x84\x36\x50\x0e\x63\x45\x4d\xdb\xcf\x4a\x1f\x84\xe6\xa4\xb4\x87\x59\xcf\x30\x43\xbf\xd7\xc1\xbc\xb3\xe0\x13\xfb\x32\x1d\x42\xcd\xce\x7a\x6d\x67\xa7\xa1\xb1\x0b\x5f\x8b\xb1\x65\x69\x50\xbe\xf6\xf8\x83\x13\x22\x59\xec\xc7\x27\xdc\x05\x6d\xb4\xc5\xbd\x81\x9e\x26\x6c\x78\xe5\x2f\x72\xd3\xe0\x2c\x37\x46\x23\x1e\x44\x93\x89\xcc\x80\x95\x5b\x0e\xcd\x25\x35\x91\xf2\x22\x8b\x52\x60\x83\x3a\xe8\xee\x1a\x76\x42\xe5\x27\xc9\x33\xa6\x11\x06\x30\x01\xde\x9f\x6b\x3f\xa3\x1c\x42\x26\x89\x4d\x45\xad\x8a\xdd\x7e\xc4\x20\xeb\x66\xd4\xb0\x86\x8b\x7a\xa7\xba\xc8\x8e\x1d\x6e\x82\x76\xc4\x72\xa0\x06\x77\x30\x34\x84\x9a\xd4\xb5\x42\xb1\xe6\x6b\x89\x67\xa0\x90\xde\x1e\x70\xdd\x05\xed\x5d\x77\xd2\x34\xdd\xd1\xc8\x5d\xcb\x58\xfd\xb5\xb5\xb6\xd5\xf7\x0d\x8c\xb4\x4a\xbc\xd0\xfb\xae\x75\x6d\xe1\xcd\xd9\xd9\xea\x55\xfa\x1d\x69\x5d\x4c\xea\xe9\x42\x9f\x5d\xb1\x00\xd2\x14\x47\x77\xfb\xa1\x43\xad\x62\x89\x54\xc5\xc8\xd5\x5a\xec\x63\xb0\xc1\x71\x91\xec\x36\xf1\x04\x26\x38\x03\x54\x29\x45\x87\x9f\xbd\x56\xeb\xeb\x69\xf3\x8d\x34\x41\xee\xb4\x01\x29\x02\xa8\x31\x56\xaa\x1a\x3a\x0f\x76\x95\x32\xd4\x18\x74\xa9\x42\xf3\xfe\x39\xe3\x64\xb1\xdc\xa2\x4e\xdd\x6b\xb1\xf7\x02\x1f\x05\x12\x20\xdb\x07\x63\x7a\x3e\xb0\xa0\xd0\x1a\x55\xda\xef\x53\xd2\x78\x1f\x3b\xb5\x28\xa2\x64\xb1\xf7\x9e\xe0\xed\xf4\xf2\xf3\x2c\xbe\xa8\x89\x0a\x68\xe5\x88\xb5\x8a\x52\x6d\x99\xe0\xd4\xf9\xbe\x8b\x57\xa0\xbf\xb5\x3c\x28\xe0\x1d\xd8\x7f\x38\x84\xcf\x9b\xc3\xf5\x61\xbc\xfa\xa9\x46\xdc\x5e\xe1\x89\xf4\x92\x37\xd9\x78\x17\x7d\x1a\x04\x20\xcf\x1d\x12\xe8\xe1\xb0\xbe\x1b\x14\x63\x33\x12\x81\xe1\x51\xe4\xa1\xba\x87\x5e\xb1\x8c\xb2\xb0\xf6\xf6\x56\xc5\x92\x69\x22\xde\x4e\xe3\x75\x5e\x80\x2c\x77\x8a\xa5\x5f\x38\xeb\x1c\x38\xd2\x04\x5e\x47\x79\x91\x3b\x19\x06\x5d\x73\x30\x4f\x38\x05\x74\x52\x90\xdd\xc2\x6c\xe5\x04\x20\x2b\xfc\x28\x71\x10\x28\xe3\xd0\x79\xb6\x75\xd2\x0c\x6e\xa2\x30\x4a\x16\x8e\x8f\x9f\xaf\x4c\x90\x0a\x20\xe9\x25\x08\x32\x50\x38\xe7\x67\x3c\x85\x06\x0e\xf0\x83\x25\x09\x17\x43\x5d\x83\xbc\x40\x21\x6a\xce\x0d\x70\xfc\x75\xb1\x04\x49\x11\x05\x7e\x01\xc2\x81\x93\xc2\xa2\xfc\xcb\x8f\xe3\x2d\xfa\x0a\x66\xd1\x97\xb2\x6f\x7c\x44\xe1\xb9\x14\xd0\xf1\xc3\x10\xdd\x73\xfd\xd8\x89\x12\x0c\xd3\x12\xc1\xa4\xf5\x78\x31\x71\x60\xa6\x8c\xb8\x58\x02\x07\x15\x0b\x8b\x40\xee\xf8\x49\xe8\x64\xeb\x18\xe4\xce\x2d\xcc\x30\x4e\x2b\x6a\x97\x4e\xa1\x54\xae\x40\x28\xd7\xf3\x37\xfb\x82\x04\xd8\x0b\x14\xaa\x7b\x0b\x0d\x6a\x6f\x0b\xc6\xaa\x7d\xc1\x42\xab\x6e\x84\xb9\xc0\x1b\xcf\xb9\x2c\x60\x46\xb9\xae\x19\xed\x94\x7f\x35\x77\xfc\x0c\x38\x79\x01\x33\x10\x3a\x01\x42\xce\xf7\xf2\x28\x04\x4e\xc4\xd6\x68\x8a\x87\x70\x38\x70\x97\x45\x91\xe6\x3f\x1f\x1c\x84\xe5\xd9\x5f\xca\x9b\xe1\x0a\x7e\x89\xe2\xd8\x1f\xc2\x6c\x71\x00\x12\xef\xc3\xe5\x41\x08\x83\xfc\xe0\x13\xb8\x39\x78\x7a\x71\x7e\xf0\x29\x4a\x42\x78\x7f\x10\xc3\xc0\x8f\xf9\x31\x92\x11\xa0\xcf\x51\xe7\xd2\xe0\x87\xce\xd5\x32\xca\xf1\x62\xa6\x20\xcb\xa3\xbc\xc0\xd1\xac\x78\x91\xfd\x20\x83\x79\xee\xe4\x00\xe3\xcc\x0d\x9d\xdf\xe0\xda\x09\xfc\xc4\x59\xf9\xc9\x1a\xb1\x69\x10\x03\x3f\xe3\x5f\x59\x82\x0c\xc8\xdc\xd0\x78\x75\xa8\x95\x0c\x6d\x90\x3b\x48\x43\x63\x1e\x3a\x63\xc2\xa5\xb6\xf1\x1c\x37\x91\x20\x36\x48\xc4\x36\x87\x5a\x8f\x26\x87\x56\x8f\x48\x7d\x94\x63\xc1\x8e\x44\x26\x76\x4a\x12\xa0\xc7\xda\xce\xdb\x6c\x2b\xd1\xe6\xa0\xcc\xc7\x5c\xd9\xe4\x3b\x90\x9c\xe7\x1f\xfd\x98\x18\xb2\x1b\x82\xb2\x6f\x23\x10\x9b\xe1\xb9\xe8\x36\xa8\x4c\x62\x92\x85\x6c\x86\x94\x34\x77\x80\xfb\x25\x98\x52\x4d\xb2\xaf\x69\x81\x91\x50\xb6\xd8\x9c\x55\x6f\xb3\xc1\x58\x1d\x02\xb6\x03\x70\x7f\xba\x62\x09\xa6\xbf\x93\xff\x3c\xcd\x3f\xf4\x3f\xf4\xe6\x7c\x30\x11\xe9\x8b\x94\xda\x72\x62\x2e\x87\xe8\x42\xf0\xb4\x38\xd7\x85\xac\xbd\x4f\x85\x14\x55\xf6\x7e\x15\xb9\xbf\xa1\x76\x06\xb7\xf0\xb3\x05\x28\x86\xec\xc6\x7d\x4d\x91\x5f\x10\x6e\xc1\x75\x1d\xf0\x79\x13\xa5\xab\xa3\x72\x09\xe2\x54\x5c\xac\xa4\x40\x05\xcc\x1d\xb0\x01\xd9\x96\x9d\x4a\x05\x74\x42\x50\x94\x17\x84\x04\xb0\xf3\xa7\x72\xc0\x37\xb2\x6f\x5d\xe8\x37\x82\x62\x48\xb8\x29\xd5\x6e\x51\xce\xfa\xdc\xbc\x4b\x37\x20\x8b\x6e\xb7\x74\xff\x49\x9b\xf3\x12\x14\xf2\xd6\x6c\x80\xbe\x71\x45\x63\xba\xb4\xd1\x9a\xf6\x99\x7c\xbc\xe5\x6b\x74\xca\xb6\x3d\xb2\x1a\xc3\x16\x5a\x9d\x72\xed\xcf\xb9\xa7\xbc\x62\xf2\x7f\xd5\x1c\x77\xda\x03\xef\xb7\xea\x38\x88\x72\x67\x53\x92\x0e\xe9\x11\x94\xa7\x40\xc8\x94\x89\x5b\x04\x10\x5d\x2a\x2c\x54\xe3\x30\x1f\x1e\x4d\x3c\x6f\x8d\xc9\x6e\xb1\xde\xe7\xc9\xa6\xe3\x8a\x87\x7e\xb2\x00\x8d\xe5\x60\xf7\x6d\xc1\x5f\xf8\x51\x0c\xc2\x52\x04\xf0\x4b\xdf\x76\xe1\xaf\x98\x7a\x88\xe5\x5e\xa9\x18\xe0\xb4\x0d\xac\x98\x82\xd0\x09\x21\xc8\x9d\x04\x16\x24\x75\xc6\x4f\x1c\xf0\x10\xe5\xe5\x2d\x0d\xbf\xb9\x0f\xcb\xff\x1e\x04\x30\x33\xaf\xbd\x2d\x51\x7f\x96\x5c\x13\x7c\xdb\x0d\xb6\x5a\xed\x69\x29\xc8\xcf\x1a\xb6\x92\xf4\xfb\xf3\xb3\x9f\xd9\xc8\x03\x18\xf2\x8a\xa1\x7e\x64\x3e\x79\x91\x1f\x5d\xd3\x91\x2e\xe8\x01\xad\x7b\x14\x4e\x59\x43\x7f\x75\x6b\x6c\xb5\x26\x17\x44\xc0\x28\x5c\x21\xd8\x04\xe7\x7c\x6e\x9e\x30\x48\x82\xce\x3a\x70\x57\x7e\xe2\x2f\x10\x68\xb7\xc6\x62\x68\x58\x3f\x1b\x4c\xfd\xe6\x17\xb1\x5f\x67\xe9\x57\x4a\xb1\x27\x2a\x0a\x9a\x6d\x5a\xee\xc9\x6a\xc4\x54\x4b\xf7\x73\xc7\xc7\x3a\x7f\x7b\x10\x69\x53\x9d\x0b\xae\x84\xef\x11\x17\xdc\x71\x64\xa4\x68\xca\x56\xa4\x5d\x49\xdf\xf6\x64\xed\xee\x8d\x93\x5a\xa8\xc2\xe4\x6a\x41\x8a\x6d\x04\x67\xa7\x1a\x06\x42\x0b\x35\xea\x95\x2c\xdb\x50\xf5\x64\x01\x58\xb1\x01\x56\xda\xf4\x9a\x6e\xe1\xeb\x9a\x41\x69\x7f\xfc\xb8\xde\x96\x5a\x26\xd7\x62\x5d\x82\x5c\x0b\xa2\x56\xdd\xa5\x19\x27\x70\xf4\x12\xa8\x9c\x16\x32\x6a\x34\x89\xb8\x86\x6e\x75\xa3\x1f\x73\xaa\x3e\x4b\xe1\x4c\x5a\x95\x4f\xd7\xdd\x00\x51\x90\x22\xa9\xe0\xae\xb7\xbf\x33\xa3\xfa\x3a\x89\x01\x8a\x05\x5f\x55\x29\x80\x28\xdb\x4e\x07\xce\xdb\xc2\x1e\x4b\xac\xa8\xbb\x9b\x65\x0b\x98\xc2\x18\x2e\xf6\x3e\xf1\x6e\x75\x72\xb7\xfa\xb4\x7a\x61\x9d\x78\x67\x91\x6c\x75\x55\x4d\x9d\x0f\x57\x63\x14\x69\x85\xa3\x47\x0c\x9e\xce\x95\xfc\xb6\xea\x6c\x9b\xf5\x03\x90\x66\xe3\x5c\x6b\xca\xe6\xe1\x5d\x53\x87\x36\xf9\x3c\x1a\xf8\x8d\xb7\x30\x34\x41\x6f\xd4\x2a\xe7\xf7\x7e\x96\x44\x35\x75\xa4\xf6\x4e\x3b\xd7\xc8\xb9\x4b\xb8\x02\xa4\xf6\x66\xee\x7c\x02\x19\x70\x5e\x10\xaa\x74\x3a\x86\x26\xb6\xa7\x9e\x4a\xff\xe6\x22\x7c\xec\xfd\xb9\xa4\x1b\x34\xb5\x47\x37\x11\xb2\xc2\x45\xc8\x60\xe1\x97\x0f\x04\x64\xde\xf7\x20\x33\xc3\xc2\x3b\x0e\x6d\xd7\xb9\xcd\xe0\x8a\x58\xad\xf1\x1e\x71\x36\x51\xbe\xf6\x63\x62\xd8\x20\xf6\xcf\x28\x77\x56\x30\x2f\x9c\x38\xba\x03\xf1\xd6\x09\xd7\xe5\xf3\xe5\x6b\xe6\x09\x91\x7d\x78\x4c\xf0\x1d\x84\x72\xe5\x35\x54\x4a\x6a\x6a\xe5\x39\x4e\xb6\x4e\x12\x6c\xbc\x27\x79\x25\x0e\xbc\xc5\x59\xed\x3b\x9c\x4a\x9a\x35\xdf\xdd\xcc\x5a\xf1\x30\x87\x51\x2c\x59\x71\xf8\xcd\xa6\x03\x43\x3e\x51\x4d\x67\xe3\x91\x91\x39\xae\x05\xe5\x90\xa3\xa4\x01\x29\x59\x43\xde\x77\x77\x7e\xcb\xba\xac\x3d\xdf\x37\x6b\x17\xa1\x25\x74\xb7\xc3\xca\x65\x23\xa1\x31\x1a\xd5\x8b\xe3\x7c\x09\xef\x2f\x60\x1c\x47\xc9\xe2\x2d\x2c\xa2\x40\x29\x03\x66\xe8\xac\xad\x04\xed\x30\xc1\x86\xd7\x1a\xde\xda\x51\x9a\x3a\x18\xdc\xe2\x75\xb4\x01\xce\x87\x34\xf4\x4b\x4d\xc7\xdc\x8b\x59\xfb\xb4\x95\xa7\x0e\xb9\x92\xe9\xe5\x91\x13\x82\x14\x24\x61\xee\xc0\xc4\x29\x20\x74\x56\xeb\x60\xe9\x84\x7e\xe1\x97\xf2\x48\xc0\xb1\x48\x61\x1c\xcb\xa5\xef\xac\x06\x6a\xa7\x45\xf7\x21\x21\x9c\x5e\xa4\xc4\x78\x7c\xad\x65\x5f\xcc\xd9\x16\x90\xe9\x86\x45\xd0\x0a\x83\x5d\xe9\xd7\xf2\xae\x60\x40\x0d\x7c\x2c\xeb\x41\xe3\x25\xf7\x35\xaa\xc5\xa1\x1a\x45\xd0\x0b\x28\x8e\x0e\x59\x0d\x3e\xc3\x9b\xdc\x68\xfa\x10\x46\x42\xc2\x7a\x5d\x3f\x8b\x7c\x8f\x2a\xc3\xc8\x3c\xfc\xf4\xf4\x35\xb1\x45\xac\xfc\xad\x13\x47\xab\x88\x78\x1e\xfd\x9b\x28\x8e\x8a\x6d\xc9\xf0\xac\x43\xbe\x12\x6b\xb5\xc5\x71\xa4\x3a\xe1\x1f\x27\x2d\xf5\x52\x04\x86\x59\xee\x9c\xb8\x88\x52\x07\xc1\x96\x34\xd6\xb5\x2c\xff\xbb\xf0\xb3\x22\xf2\x63\xe7\x63\x04\xee\x9b\xd7\xbc\x19\xf1\xd1\xf6\xf8\x6d\x79\xf3\x57\xde\xc7\xc5\x53\xec\xe4\xaa\x20\x1f\x49\xd5\x15\x25\x06\x5e\x4b\x9d\x37\xa0\xbc\xea\xa9\xa5\xf1\xad\xaf\xe4\x61\xac\xf4\x5c\x80\x6c\xd5\x74\x20\x70\x0d\xd4\xdb\xb8\xc8\x30\x7f\xde\x49\x70\xbb\x61\x13\x21\x1d\x73\x75\xf7\x76\x1d\xd9\xcc\xe6\xf4\x6b\xcc\x46\x57\x05\xdf\xa2\x97\xae\x32\xf0\x9b\x71\x70\x55\xb8\xd6\xc1\x79\x18\xdf\x8e\x97\xe5\xa9\x7b\x72\xc2\x83\x61\xa9\x5a\x31\x8f\x2c\x80\xf1\x39\x0e\x33\x2f\xbf\x47\x6e\x97\x52\x6e\x46\x21\xa0\x17\x0e\x32\x23\x96\x7c\xf7\x9e\xfb\xd8\xe8\x80\xb6\xa6\x9c\xd3\x96\x2b\x1d\x87\x0c\xa0\x6b\x7f\xb6\x9b\x64\xaf\xd6\x22\xa5\xd8\x1c\xe2\x5a\x5c\x16\xe5\xd9\xf4\x2d\x17\x83\x8e\xe0\x91\x56\xa3\x27\x85\xca\xf6\x8b\xaf\xa3\x57\x49\xb7\x2f\x0c\x0d\xf9\x16\x59\xa2\x4d\x2a\x13\x36\xe9\x98\xab\xd1\xa3\x26\x2a\x41\x66\x6e\xa8\x7a\xa6\xd1\x4c\x4f\x2c\x88\x1a\xb2\x6b\xeb\x5f\x57\xff\x91\x24\xb9\x1d\x2c\x0f\x8d\xaa\x4f\x13\x09\x67\xb3\xca\x54\xc0\x7d\x59\x5e\x59\x43\xa0\x89\x89\xaa\x19\x4b\xe8\xe7\xcb\x1b\xe8\x67\xa1\xb7\x42\xaa\x8e\xbd\x08\xe0\x03\x52\x2d\xdf\x94\x6d\x6a\xc2\xd8\x79\x4d\xd7\xc6\xbc\x26\x0c\x66\x2c\x0d\xc6\xf2\x70\xc4\xff\x99\x6b\xbb\x5b\xad\xaf\xf5\x23\xed\x65\x73\xf7\xd5\x11\x14\x06\x31\xe5\xb0\x99\x9a\x9a\x90\xd9\x1a\xf2\xe1\xdd\xab\xd7\xd9\x2c\x49\xc7\x1b\xc6\xc7\x7c\xbe\x89\xae\xa0\x2b\xb6\x83\x0e\x79\xd3\xe3\xb8\x75\xfd\x55\xd9\xd5\x97\x2f\x61\x56\x9c\x87\x36\x0c\x67\xc6\xf7\x68\x35\x67\x75\x1b\x45\x09\xcc\xbc\xc7\x5d\x2b\xe4\xe9\xda\x7d\xa5\x6c\x9d\xc1\xfb\x4d\x0c\x92\xfc\xdb\x2b\x3d\x96\x45\x91\xea\xb3\x83\xbf\x0f\x9a\xe0\x3b\x42\xaf\x24\x31\xe5\x72\xb7\x6c\xf8\x5f\x54\x7a\x9e\x65\x7e\x54\x2a\xfc\xff\xbb\x07\x92\x93\x73\x90\x55\x6c\xa4\xf5\x86\xc7\xc8\x29\x49\x7b\x42\x91\x3c\xa4\x74\x6d\x01\x1e\x8a\x2a\x32\x5c\x5f\x6f\xd3\xd0\xd9\xa0\xa6\xf5\xdf\x90\xf3\xe7\x2d\xac\xf1\x53\x59\xcf\xad\x85\x56\xff\xf5\x56\xed\x79\x1c\x2d\xa2\x9b\x18\x3c\xda\xaa\xcd\xc7\x1c\x6d\x69\x6f\x68\x0f\xc9\x4b\xc7\xac\xc8\xbb\xac\x1e\xd7\xc3\xff\xcf\xde\xbb\x75\xb7\x6d\x6b\x8b\xc2\xe3\x7b\xd5\xfb\xf7\xb4\x5f\x68\x8e\x2c\x95\x58\x86\x68\x39\x49\xd7\xde\x4b\x2e\xed\xa6\x4e\xb2\xd2\xbd\x9b\xcb\x89\x9d\xd5\xb1\xb7\xa2\x13\x53\x24\x24\xa1\xa6\x00\x15\x04\x6d\x2b\x32\xc7\x79\x3d\xcf\xe7\xbf\x9c\x3f\x70\x7e\xca\xf9\x25\x67\xe0\x46\x82\x14\x25\x4b\xbe\xa4\x69\x47\xfb\x90\x5a\x20\x2e\x13\x13\x13\x98\x57\x4c\x7c\xe1\xd5\xbb\xfb\xb6\x96\x01\xdd\x9d\x18\x5f\xe0\x78\x4d\xf4\xe9\x52\x87\xf7\x20\xbf\x0a\x71\xfb\x03\xc7\xc6\x85\x21\x2f\x09\xf0\x30\x51\x86\xb2\x97\xf2\x7a\x12\x47\x1b\xc9\x14\xcd\x42\x6c\x46\x30\xbf\xd9\xba\xb2\x35\x64\x1f\x54\xb7\xf7\xb0\xba\xf7\x23\x7f\xd3\x91\x33\x5d\x6d\x5b\xdc\x10\x94\xcd\x8f\x89\x25\xe7\x9c\x33\x66\xe1\x6c\xb2\x0d\x05\xdc\xc2\x55\xb7\xa2\xb5\x4e\xe1\xa2\x9e\xd9\xde\xac\x8f\xf2\xc8\x9a\x31\x3a\x2e\xd2\x97\xa8\x53\x4f\x97\x94\xe1\xd8\xd5\x1c\x33\xf2\xa2\x87\x3c\x64\x56\x12\x0a\x43\xf2\x5e\x71\xac\x68\xe5\x1d\x62\x91\x0c\xaf\x2b\xae\x68\xb8\xd3\xf0\xca\x85\xee\xfe\xc6\xd0\xde\x4c\x9b\x2b\x87\xdc\x10\x15\x37\x11\xe9\x36\xb4\xbc\x21\xc1\x37\x79\x09\x37\xf5\x0c\x56\x3a\x2a\x77\x0e\xa1\x97\x2c\x9c\x6d\x47\x04\x45\x34\xc6\xbe\x7d\x71\x7e\x2b\x0c\xf7\xd5\xd1\x20\xbb\xbb\x49\xad\xb9\x4f\x54\xde\x66\xc3\xca\x37\xfc\xd7\x27\xc6\x6c\x68\xbf\x1d\x6b\xaf\xe1\xf5\x5f\xd7\xe2\x55\xa2\xee\x7d\x05\xb9\x1b\x04\xbb\x6c\x81\xc8\xbd\x9b\x58\xd1\x16\x70\x6e\x09\x9f\xa1\x99\xdf\x83\xc0\xfe\x70\xcc\x5c\x3e\x60\xf4\x25\x18\xf8\xeb\x57\x9f\xbf\x0a\x56\xbc\xca\x31\xb6\x21\x1c\x7f\xf2\xe1\x3a\x1f\x16\xba\xd5\xad\xb9\xf0\xf1\xbb\x0f\x5f\x94\x05\x57\xc7\xfb\x93\xff\xde\x88\xd1\xed\xf8\x6f\x1d\xbd\x7f\x32\xdf\xb5\x48\xfd\xb7\xcd\x99\xaf\x39\xa7\xbf\x3c\xe7\xdd\x00\xc8\x6d\x80\xbb\x67\xb6\x5b\xa6\x20\xbb\x93\x67\xed\xee\xbc\xfa\x0e\x46\x9a\x5b\x90\x52\x39\xa7\x55\xb6\xcc\x0d\xb7\x40\xe3\xd3\x7e\xc5\x2d\xed\xc1\x2a\x2f\x85\xe5\xcd\xf2\xcb\xbf\xdd\x75\x98\xdf\xd6\x85\x51\x3d\xd2\x97\x3a\x84\x9b\xfa\x34\x36\xf1\x68\x6c\x2a\xcb\xdd\xd2\x58\x7d\x8b\x05\x3e\xc1\xc3\x04\x93\xb1\xed\xbc\xbb\xe3\x4a\x5b\x11\xc3\xaa\xef\x67\x5b\x7b\x24\xbf\x3e\x34\x7d\x20\xf8\xd7\xcc\x5c\x9a\x70\xde\x25\x61\x24\x2f\x43\xde\x1f\xae\x32\x39\xc0\xb3\x1a\xf5\x6d\x7e\x4b\xe2\xc6\x21\x37\xf9\x7c\x7f\xe6\xc1\x2f\x7b\x4a\xfd\x3b\x1d\xde\xdb\xf1\xb4\xca\x67\x0a\xdd\xef\x7f\xcd\x90\x4a\x29\xe1\xfe\x42\x87\xa9\xff\x0b\x1d\xae\x39\x88\xa0\xa8\x64\x67\xe9\xb3\x2e\x75\xfd\x42\x87\xf6\xa3\xe0\xfd\x1b\x3a\x51\x57\xbd\xf5\xab\xe5\x3a\xef\xf8\x03\x9c\x73\xe5\x50\xf7\x71\xd4\x35\x48\x86\x38\xed\x8c\xc2\x78\x45\x26\xd9\xfa\x7f\x37\xca\x0d\xab\x27\xc2\xc3\xf4\xfc\x1f\x8c\x66\xb3\x37\xf7\xe1\x55\xfd\xfa\x0e\xa3\xd3\xf9\x6c\xa5\xf7\x79\xeb\x83\x67\x25\x21\xe8\xdb\xea\xbf\x2b\xcc\xbc\x63\x98\x32\xcc\xe7\x0f\x8f\x9d\x99\x1e\xe9\xcf\x33\x79\xc5\x52\xac\x0f\x67\xb9\xb7\x63\x79\x55\x28\xcb\x8a\xc5\x33\x91\x5d\xf7\x7d\x76\x12\x15\x7c\xf5\x87\x16\x15\xd7\x05\xbd\xdc\xc7\xc6\xd2\x38\xbc\x99\x01\x7d\x7d\xa8\xb9\x21\x04\xe6\x1e\xb1\xb3\x59\x60\xcc\x57\x77\xee\xe8\x8d\xfc\xf7\x8a\xfa\x27\x77\x8b\x51\xfe\x6c\xed\xce\xfd\xbe\x54\x86\xd7\xe9\xd8\xee\xd4\x98\xe2\x9b\x5f\x1e\xbb\xaf\xf9\xfe\x96\x53\x8c\x66\xd9\xb6\xf3\x5b\x1f\xb1\xbb\xc2\xf2\x27\x6d\xac\xa3\x24\x4b\xeb\xb7\xf2\x57\x50\xd7\x5a\xfa\xd8\xd8\x88\xbc\xbc\x53\x6f\xeb\x77\x28\xb2\x86\x6f\xa1\x32\x39\xf7\x64\xee\xd7\x77\xe9\x1f\xd4\x92\xb8\xe9\xa1\xf7\x75\xad\x4a\x1a\x4d\x50\x9c\x25\x28\xde\xde\x08\xe0\xdc\xd3\xe2\x7c\x25\x61\xc9\xbf\x89\xac\x77\x8b\x15\xac\xae\xdf\x6d\x02\x71\x56\x2d\xda\xe6\x5e\xbc\x95\x30\x6c\x14\x72\xb3\xe9\x62\xde\x89\xae\x6e\x0a\xb6\x79\x80\xfd\xbc\xbd\x7b\x6f\x45\x17\x9b\xaf\xc1\x1d\x5d\x7b\x46\x92\xba\x87\x00\x9b\x7b\x0f\xa7\xa9\xd2\xd8\xad\x43\x67\x36\x20\xb6\x07\xf6\xf7\x6e\xeb\xb2\x5b\xa2\xfd\xad\x1c\x76\x1a\x6d\x4d\xee\xba\x7b\x0b\x8e\xf9\x6d\xd8\xe5\x56\x7e\xb9\x5b\xe8\x08\x55\xcc\x3d\xee\x56\x92\xda\xdd\x36\xfc\x65\x03\x54\xad\x32\xa4\xdd\x04\xcf\x56\x70\xac\xf5\xb6\x3d\x30\x67\xfc\xb2\xcc\xf0\xf8\xdd\x87\xdf\x96\x13\x1e\xbf\xfb\xf0\x55\xb1\xc1\xd5\x81\x2e\x7f\xf2\xc0\x8d\x79\xe0\x06\xc1\x2d\xf7\x1b\xca\xd2\xcc\xfe\xb6\x0b\x5b\xf9\x93\xf7\xdd\xb0\x38\x7f\x32\xbe\x65\xb4\x3d\xde\x5f\xc5\xf8\x36\x8f\xee\xb8\x3f\xae\xb7\x04\xcc\xe6\x40\x3c\x18\xcb\xbb\xe1\xea\xf4\xca\xb6\x2b\x3e\xac\x2b\xde\xe2\x5c\x2c\x4d\x5c\x8f\x1f\x5b\xe6\x78\x63\x6e\xf9\xbe\x7a\xef\xf8\x7b\x4a\x4a\xbd\xfb\x04\x25\x28\xe2\xaa\xf4\x0d\x8d\x91\xfd\xfb\x79\xc8\xc3\x17\x8c\xd1\x86\xa7\xdb\x8c\x2d\x67\x50\x7f\xfa\xac\x7a\xc9\xd9\x72\xb1\xda\xf9\xe0\x8a\xe7\x13\x78\x35\x3a\xc4\x58\xd2\xd6\x36\x79\x63\x2e\x80\xdf\x58\x79\x12\x92\x38\x41\xa7\x74\x46\xff\x89\x3f\x5b\x93\x59\xf5\xcc\xda\xda\x55\x69\xb6\xe3\x19\x12\x58\xf1\x55\x56\xd0\x8e\x8d\x8d\x1e\x91\xae\xe4\x7c\xad\xbe\xb7\xb5\xf2\x85\x7a\x99\xfd\x75\x96\x64\x2c\x4c\xf0\x67\xb4\xfc\x00\x1b\xa7\xe3\x71\x82\x3a\x45\x69\x24\x0f\x15\x69\xe9\x91\xff\x62\x72\xde\xe1\xd4\x4e\x2d\xab\x9e\x1d\xea\xcc\xd4\x69\xa9\x46\xd1\x65\x85\xd1\xa8\x33\x9c\x73\x94\x36\x7d\x98\x20\xc6\x3f\x2b\x37\xdc\x34\x64\x73\x2d\x09\xee\x55\x2c\xac\xba\x51\xad\x0f\xd3\x92\xd3\x19\xed\x5c\xe0\xcf\x9b\xe4\xaf\x35\xa9\xd6\x6e\x9d\xb8\x96\x85\x24\x15\xe3\xa7\x7b\x7a\x11\xec\xb4\xb5\x32\x6b\x6d\x27\x0e\x79\xd8\x91\xf4\xdd\x19\xb1\x70\x2c\xa3\x4b\x96\x1b\x3e\x58\x2a\x5b\x6e\x8a\xb7\x99\xcc\x90\xd2\x04\x85\xa4\x29\x0b\xaf\x9c\xcf\x5e\x8a\x18\x96\x14\xc3\xf6\x3a\x33\x86\x2f\xd4\x8b\x00\x77\x9d\xc2\xca\x06\xc6\xa1\x07\x17\x88\x64\x53\xc4\xc2\x61\x22\x9a\xc0\x31\xe2\xbd\x62\x4c\xb0\x60\x88\x67\x8c\x38\xdc\xff\x41\xc1\x7f\x6a\x66\x94\xe7\xe0\xa6\x29\xc7\x62\x0a\xbf\xd7\xf9\x3e\x0f\x39\xda\x66\xb2\x86\x10\x3b\xb7\xa6\xda\x5a\x0f\x5f\x17\xf9\x1a\xe0\xee\x32\xb1\xaf\x6c\x4a\x24\x13\xd0\xff\x6e\x09\xf4\x8d\x04\x7f\x1b\x12\x4d\x39\xc3\x64\xfc\xbb\x9d\xf0\x89\x04\xff\xc6\x09\x67\x1c\x27\xe9\x5e\x18\xc7\x1d\x4e\x3b\xb3\x90\x4f\xec\x09\x57\xa6\x73\x27\xfa\xb3\xbb\x49\x10\x77\x78\x10\xb2\x71\x26\x69\xdf\x57\x2e\x9b\xc3\xfd\x76\x5b\x51\xe9\x4e\x50\x7e\xec\xef\x0f\x8e\xec\x1f\x3d\xd7\x6d\x45\x94\xa4\xbc\x8f\x21\x19\x04\xc8\x4f\x67\x09\xe6\x9e\x7b\xe4\x82\x96\xe8\x97\x05\x67\x8f\x16\x38\x7f\xb4\xe0\xf9\x59\x8b\xb4\xdb\x1e\xdb\x0d\xce\x8e\x1e\x2d\x48\x7e\x06\x5a\x1a\x37\x2c\x5f\x83\x89\x28\x4c\xa2\x4c\xe6\x78\x9f\xd1\x14\xeb\x90\xe0\xa5\x3d\x3c\x0c\x53\x1c\x75\x62\x46\x67\x31\xbd\x24\xab\x9b\x7e\x45\xf4\xa0\xeb\x2b\x3a\x68\xad\x9a\x7d\x12\xa6\x29\x4a\xf7\xc2\x61\xca\x59\x18\xf1\x4e\x42\xc7\xe3\xe6\x5d\xbf\x17\xa3\x61\x36\x2e\x7f\x52\x09\xe8\xde\x14\x5f\x61\x52\x2f\x2d\xf0\x46\x2f\x10\x63\x38\x16\xb0\x76\x22\x3a\x9d\x65\x1c\xc5\x65\xe5\x19\x4d\xe6\x23\x9c\x24\x62\x10\x19\x11\xd9\xd1\x7b\xb0\x86\x46\x88\x21\x81\x0c\x26\x90\xde\xd7\x99\x18\x06\xd8\x14\xeb\xac\xfb\xde\x22\x63\x49\xcf\x75\xe1\x2c\x64\xe1\x34\xed\x79\x5d\xc8\x7c\x03\x32\xf0\x3c\x0f\x04\x87\xde\x22\x07\x00\xc0\x84\x8e\x5f\x22\x1e\x4d\x3c\xb0\xc8\x21\x22\xf1\xdb\xd1\x28\x45\xbc\x27\x15\x19\x2a\xff\x7e\x57\xf4\x41\xac\x3e\xdc\xa2\xae\x6b\xcd\x0f\x2c\x24\x7d\x3b\x28\xe0\x13\x9c\xfa\x45\x1d\x43\xbd\xe8\x68\x41\x19\x1e\x63\xd2\x73\x53\x1e\x32\xee\xea\x31\x7a\x28\xef\x15\x5f\x10\x89\x8b\xf2\x6f\xd1\x53\x49\xf0\xe5\xd3\x9c\xef\x6e\x9c\xd2\x28\x4b\x92\x0f\x2c\x59\x82\x38\x63\x89\x94\xec\x45\x7b\x17\xba\xf6\xec\x84\xe4\x5e\x1b\xa1\x79\x5a\xb4\xc0\xb4\x5a\x5d\x3c\x9a\x7b\x5e\x17\x26\x7e\x98\xa6\x78\x4c\x80\xb7\xc8\xa1\x9c\xba\x1a\x46\xfd\x6d\x8f\xa4\x4a\xea\x83\x01\xb3\xbf\xcf\x1e\x2d\x64\x85\x8c\x25\xf9\xd1\xa3\x05\xca\xcf\x72\x00\x2a\xa2\x74\xb8\x6e\xff\xd7\x77\x40\xca\x43\x9e\xaa\x67\x29\xea\x1b\x01\x29\x8e\xb8\x7e\x07\x98\x6d\xa2\x36\x40\x44\x49\x94\x31\x86\x48\x34\x97\x5a\x68\x65\xec\x5f\x52\x4a\x3a\xca\x19\x5b\xc4\x8f\x35\x12\xfe\x7d\x91\x3d\x5d\x4d\xf6\xc3\x6c\x34\x42\xec\x04\x7f\x46\xbd\x6f\xbb\x5d\x38\x0d\xaf\x5e\xb2\x70\x8a\x5e\x63\x81\x9d\xde\xb7\x70\x54\x50\x7c\x38\x9b\x21\x12\xcb\x3f\x67\x61\x96\x22\xf9\xd7\xc8\xaa\xdc\x85\x4a\x95\x7d\x8f\xd2\x19\x25\x29\x12\x3c\x00\x8f\x3c\xe4\x23\xa1\xd0\x02\x73\x42\x89\x35\xc3\x24\x62\x32\xfc\xbd\x98\x92\x6b\xf5\xe4\x02\x28\x80\xf7\x64\x55\xab\xfc\x50\x6d\x95\x2a\x8c\xed\xb6\xa7\xa9\x48\xc2\xa4\x88\x26\x45\xbc\xda\x23\xec\x02\x00\x5a\x2b\xbf\x69\x52\x53\x33\x44\x20\x87\x33\x9a\x24\x6a\xe3\xf0\x30\x3d\x07\x5e\xb1\x3c\x7f\xf5\x80\x22\x3b\x41\xc3\x82\x26\xb3\x14\xf9\x51\x48\x22\x94\x3c\x4b\x12\x0f\xb4\x38\x9b\x57\x77\x76\xc6\x92\xd6\x1c\xa3\x24\x56\x53\x57\x08\x45\xc0\xe7\x13\x44\xd4\x86\xd0\x4b\x03\xbc\x85\xc4\x94\x5c\x48\xf3\x1d\x05\x87\xb2\xd9\x12\x6a\x01\xc8\xa3\x50\x75\xb5\xe0\x13\x46\x2f\x1d\x82\x2e\x1d\x69\x3b\x10\x33\x90\x23\xaa\x09\xe0\x29\xa2\x19\x07\x5e\xc1\x1b\x7c\x8e\xe4\x6b\x67\x47\xdd\xde\x63\xf4\x44\xf0\x09\x5f\xb0\x38\x0f\x40\x6b\x52\x2b\x67\xbf\x45\xcf\xd0\x5e\x99\x72\x98\xca\x26\xa5\x9b\x6c\xd2\x42\x29\x5f\xb7\x4d\xeb\xac\xa8\xba\x5d\x2d\x36\xb4\x62\x14\xa6\x72\x7b\x1b\x55\x65\xcb\x13\xa3\x71\x0b\x83\x85\xd8\x7e\x09\xa4\x30\x84\x29\xcc\x60\x04\x63\x38\x83\xd3\x96\xa9\xe9\x0c\x4d\x5d\xb0\xc0\xed\xf6\xaa\xdd\xce\x2b\xcc\x1f\xfb\xe5\x0f\x18\x51\x32\xc2\xe3\xcc\x7c\xb1\x7f\xc2\x4b\x86\xb9\x2e\x37\x7f\x42\x75\x54\x60\x1f\x13\xcc\xb5\x58\x7b\x54\xf9\xe5\x47\x61\x92\x78\x04\xf4\xd4\xf9\x91\x83\xbc\x00\x76\xb4\x34\xb1\x60\x91\x1b\x7e\xa5\x61\x3f\x47\xf3\xd4\x23\xc0\x1f\x51\xf6\x22\x8c\x26\x5e\x45\xb0\x4c\xfa\x68\x10\x90\x3e\x1a\x88\x35\x4f\xac\x69\x04\x3b\x3b\xf6\x4f\x98\x54\x26\x22\xbf\x56\x66\xe6\xe9\xf7\x4b\x31\x71\x92\xeb\xeb\xc4\x86\x1f\xb4\xdb\x5e\x52\xcc\x37\xd8\xe9\x02\x98\x04\xd8\x4f\x13\x1c\x21\x0f\xf8\x0c\x5d\x20\x96\xaa\xbf\xe2\x2c\x42\x16\x80\x72\x15\xf4\x6c\xf4\x1a\x82\xeb\x6b\x9c\x03\x98\x00\xc8\x2c\xa9\xb5\x32\x9e\x1c\x4e\x42\x53\x2d\x3f\x4a\x96\xb1\xca\x0c\x56\x61\xe5\xa3\x3e\xaa\xd5\xa9\xe7\x74\x83\xe5\x11\x56\x13\x46\x22\xa6\x27\x44\x10\x00\x93\xfc\x16\xdc\x42\x12\xb1\x25\xb6\x43\x6c\x70\xa0\x9e\x26\x2a\x64\x02\x54\x61\xf2\x1a\x4d\x97\x05\x3b\x91\xc7\x9a\x20\x40\x31\x4f\xb1\xed\x01\x2c\x77\x6d\x4f\x9e\x03\x63\xc4\xc5\xc9\x24\x0e\x82\x7c\x99\x4f\xa9\x33\x73\x12\x48\xf9\x39\x38\x44\xed\x36\x3f\x42\x7b\xbc\xd7\x85\xe3\x00\x09\x81\x45\x9c\x36\x29\x0f\xa7\xb3\x1e\x82\x59\x8a\x62\x25\x78\x69\xeb\x9f\xfc\x91\x03\x38\x0f\xfa\xee\x34\x94\x7c\x79\xc6\x90\x14\x9c\xe4\x13\xd7\x51\xc8\xe4\x63\x6f\x29\x5f\x2a\x33\xd5\xd0\x6c\x82\x04\xfd\x25\x95\x8a\xcb\xa5\x74\xe6\x0e\x0a\xe2\xd1\x64\x12\x1c\x7a\xa8\xcf\x07\x01\x86\x08\x00\xb8\xc8\x01\xbc\x30\x13\x99\xf7\x91\x9f\xe0\x11\x8a\xe6\x91\xb2\x0f\x0e\x3a\xf3\x3e\xaf\x15\x49\x9d\xe6\x32\xf0\x92\xa0\x86\x75\xcb\x4e\xed\xe3\xd8\x05\x90\x8a\x1a\xd8\x0f\x13\x1c\xa6\xd5\xcf\xc5\x9d\x15\xdf\x72\x25\xb9\x00\x86\x5b\xb4\xd0\x1e\x7b\x00\xd3\x35\x80\xb8\xd0\x2d\xa5\x06\x17\xc0\x6c\x8b\xba\xd1\xba\x09\x96\xf0\xc8\xd7\xef\xeb\x6d\x47\x9e\x17\x07\xf2\x14\x76\xd0\x15\x47\x24\x4e\x2d\xc6\xa3\x4a\x3c\x56\x30\x53\x2d\x88\xb2\x2c\xe2\x94\x79\xea\xbc\x92\x8b\xd5\x4a\xb3\x19\x62\x9e\xef\xfb\x85\xc2\x09\x20\x96\x7b\x08\x7a\x3c\xb0\x81\x07\x98\x78\x8a\x8b\x83\xa3\x35\x67\xb3\x3e\x53\x61\x55\x41\xab\x9c\xcc\x3b\xdd\xf2\x34\x16\x3b\xaf\xa7\xc9\x65\x28\xf7\x4a\xe5\x5a\xba\x0b\x67\x50\x6d\xa0\xfa\x47\xbd\x3a\x70\xaa\xbe\xe7\x63\xc4\x9d\x8c\x25\xc5\x76\x3c\xdb\xbb\xd8\xdf\x53\x57\x18\x2c\x96\xb9\xa7\xe5\x64\xb1\xfd\xea\xe4\x94\xef\xc9\xfd\x7f\x96\x17\xa2\x8f\x96\x5d\x78\x20\xa4\x89\xe7\x62\x6b\xbf\x0e\xf9\xc4\x1f\x25\x54\xc8\x15\xfe\xa9\xd9\x84\x7b\xfb\xe8\x6f\x40\xe0\xad\xf2\xf9\x3d\x4a\x69\xc6\x22\xf4\x21\x0d\xc7\xc8\x3f\x9e\x65\x27\xa2\x7b\xff\x94\xf2\x30\x39\xc5\xd1\x79\x0a\xae\xaf\xbb\x4a\x0c\x8b\x66\x99\x3f\xcb\xd2\x89\xc2\xab\xbd\xbd\xb9\xda\xde\xb8\xd8\xdb\x13\x0f\x2b\x49\xc2\xc2\x92\x10\x22\x14\xa8\x24\xa8\x8f\xab\xf0\xa4\x86\x7e\x7f\x72\xa2\xc6\x53\xb1\x76\xeb\x87\x24\xd6\x90\x64\x6f\xbf\xfb\xf8\xa9\xfc\xa7\x3a\xb8\xea\x5d\x8c\xaf\x0c\x11\x5d\x98\x04\xdd\xd6\x88\x32\x4f\x8a\xda\x0e\x1d\x29\x41\x4f\xd2\x70\x89\x4f\xe4\x9f\x8a\x82\x3e\x95\x1f\x06\x2d\x3c\xf2\x76\x38\xd0\xef\xa9\x20\x3d\x17\xdc\x88\x76\xbe\x84\x76\x12\x54\x3e\x6f\x84\x76\x18\x06\x13\x8f\x2c\x23\xb2\x45\xd7\xac\x05\x6e\x40\x0c\xa4\x95\xf6\xe6\x93\x1c\xad\x17\x9a\x9f\x27\x3c\x8c\xce\x7b\xe1\x2e\x2b\x16\x2a\x0d\xea\x90\xd6\x16\x0a\x66\xc1\xc4\x4b\x6f\xc0\x7b\x8b\xae\x5f\x4a\x0d\x71\x6a\x41\x6c\x77\x49\xeb\xfd\x55\xc1\xcf\xaa\xe0\x67\xbb\x82\xa9\xb0\xdd\x20\x84\xc9\x6e\x90\xe5\xb9\xd1\x7c\x8c\x84\x6f\x96\x6b\x15\x8d\x8d\x85\xa4\x0e\x9b\x08\xde\xfa\x22\x29\xa5\x94\x98\x78\x70\xb8\xe0\xab\xfb\x6a\xec\x48\xf0\x54\x71\x1c\x44\xb3\xcc\xb3\x18\x38\x29\x75\x0b\x39\x52\x79\x9e\xaa\xea\x6a\x90\x6d\x5a\x48\x58\xeb\xc6\x8b\xb2\x92\x96\x06\xbd\xc6\x13\xa7\x7e\xbe\x83\xeb\xeb\xfe\x00\x14\xa2\x59\x4a\x19\xf7\x2e\x80\x3f\x0d\x67\x9e\x87\x25\xcb\x0f\xd3\xf3\x9e\x64\x18\x63\xc4\x81\x87\xf5\xd5\x1e\x00\x2d\xfa\xab\x7e\xaf\xb2\xbe\xea\x52\x37\xd7\x2c\x58\x5e\x34\xcb\x7a\x55\x04\x20\x00\xa7\x45\xcb\x4a\x79\x2e\xd4\xaf\x1c\xf8\x33\x46\x39\xe5\xf3\x19\x82\xca\x64\xd2\x4f\x06\xc6\x92\x37\x46\xfc\xed\x25\x31\x8c\xe2\xb9\x7e\x6e\x94\x32\x2f\xae\xb7\x02\xd0\x2a\x02\x70\x16\x8c\xaa\x75\x2a\xbc\xa1\x4f\x07\x70\x51\x67\x2d\x55\xc6\x63\x31\x1a\x68\x89\x91\x46\x44\x9a\xae\xea\xdf\xb0\x97\x7e\x78\xd7\x21\x6a\x03\x44\xb3\xcc\x85\xfd\x74\x4b\xd4\x88\x56\x35\xd4\xd4\xfa\x9d\x1a\x80\xb3\x2d\xbb\x9e\x9a\x35\x5f\xd7\xbb\x96\x41\xfa\xd1\x96\x9d\x6b\xda\xae\xf6\x1d\x03\x69\x88\xf9\x1c\x5c\x5a\xaa\xef\xe7\x0d\x54\x5f\x74\x85\xa2\x4e\x44\xa7\xd3\x90\xc4\x1d\x14\x63\x4e\x59\xe7\x8a\x23\x36\xed\x84\x71\x38\xe3\x75\x1d\xb8\xd6\x8b\xd0\xc6\x1e\xc2\xbf\x64\xb8\xd5\x5e\xff\xe3\x55\xb7\xdb\xf9\x78\xb5\xff\x72\xb0\x37\xb6\xa6\x26\xc1\xaf\x48\x60\x4a\x50\x56\xa2\x88\x80\x1f\x93\x30\x09\x50\x61\xae\x39\x56\x53\x3c\x0e\x93\x64\x18\x46\xe7\x01\xd7\x87\xa6\x2a\x0e\xb4\x00\x10\x87\x3c\xfc\x09\xa7\x1c\x11\xc4\x02\xe4\xab\xe0\x0f\x69\x24\x59\x58\x56\x12\x19\x44\x71\x81\x88\x52\x37\xa4\x96\x83\xa7\xd2\x62\xaf\x47\x29\x2a\x04\x4d\xad\xfc\x21\x26\xb1\xd6\x61\x90\xd4\x24\x91\xe7\xfe\x4b\xff\xe8\xe9\xb7\x13\x17\xe4\xcb\x43\x48\x23\x57\x10\x94\xee\x36\xff\xa7\x17\x2f\x4f\x3f\x3d\x7b\xff\xfe\xed\xcf\xd7\xd7\xd5\x2f\x1f\xde\x35\x97\xbf\xff\xf1\x1f\xaf\x56\x34\x79\xfe\xf6\xe7\x37\xea\x0b\x38\x40\x49\x8a\x9c\xa5\xe1\x8e\xdf\xbe\x39\x7d\xff\xf6\xa7\x4f\x1f\x40\x05\xbb\x06\xf4\x8f\x43\xe7\xe3\xd0\xf5\x19\x9a\xa1\x90\x7b\x36\x5a\xb5\x4b\xa6\xe0\x50\x1a\xd9\xae\xdb\x6a\x1e\xe8\xc5\x9b\xd3\x17\xef\x9b\x06\x49\x88\xe7\xba\x60\xd5\x62\x56\xc6\x04\xcb\x2b\xe9\xc7\x38\x9d\x51\xc1\x57\x57\x8c\xfb\xfc\xc5\x4f\x2f\x4e\x5f\x80\x06\xd0\x0f\xbb\xc6\xfe\xd7\x3c\xeb\xda\xcc\x2a\x3d\x28\xbe\xd3\x85\x9d\x7d\x60\x0d\x5c\x74\x6c\x8b\x6e\x0c\xcd\x92\x30\x42\x82\x6f\xb8\xda\x8c\x58\x1b\x8f\xd7\x46\x32\xd6\x69\xfd\x5b\x79\xaa\xf2\x3c\x46\x29\x67\x74\x6e\x8c\x88\xcd\x58\xc8\xd7\x3a\xae\xec\x83\x21\xa5\xd1\x39\xe2\x5b\x1c\x08\x88\xe8\xa7\xa8\xef\xef\x48\x40\xfe\xab\x17\xcf\xde\x9f\xfe\xf0\xe2\xd9\xe9\xa7\x1f\x05\x81\xfc\xf3\xd9\x4f\xe6\x9c\x68\xfc\xb6\x8f\x9e\xde\x70\x52\x48\x4b\x4c\xf3\x49\x21\x27\x6c\x8e\x03\xf9\x78\x5b\x40\x20\xf6\x29\xa1\x33\x44\x02\x0f\x98\x93\x20\x45\x24\xfe\x39\x7d\x15\x92\x38\x9d\x84\xe7\x96\x61\x98\xc4\xa7\x7c\x2e\x44\x95\xa2\x48\xe8\xf9\xaf\x50\xc8\xf8\x50\xec\x0f\x31\xb5\x35\xe7\x8a\x3a\x52\x72\x39\xa4\x0e\x6e\x0a\x70\x70\x28\x9d\x9d\x24\xf8\xf7\x93\xb7\x6f\xfc\x59\xc8\x52\xe4\x61\xb9\xb8\xa0\x45\xfc\x94\xc7\x34\xe3\xed\xb6\xf9\x4b\x7e\x68\xb7\xcd\xd1\x22\xa5\x92\x61\x98\xa2\xbf\x3d\x7d\x8e\xc4\xea\x28\x8f\x2e\xf0\x2a\xf5\xcd\x98\x51\x42\x53\x64\xcf\x93\xd3\x99\x0d\xfc\x0d\x9b\xb3\xbe\x4b\xfe\xa5\xff\xe4\xdf\x0e\x1e\x1f\xec\x3f\x7d\x7c\xb0\xff\x6d\xf7\x60\xff\x6f\x4f\xa6\xcd\x55\x45\x27\xa7\x13\xe4\x44\x94\x10\xfd\x10\xf3\x24\x4c\x1d\x09\x4e\xec\xbb\xd2\xa2\xc3\x50\x8a\x3f\xa3\xb8\xb6\x0a\x05\xba\xf3\xbc\xf2\x73\x61\x2d\xa8\xac\xe8\x49\xec\x95\xce\xa2\x05\xe7\xf3\x4f\xa2\xc7\xde\x42\xbe\xf5\xdc\xab\x82\x15\xd1\x24\x85\x13\x84\xc7\x13\x5e\xfb\xc2\xe8\x65\x2a\xb6\x50\xbe\x44\x04\x37\x8f\xa9\x1f\xbd\xed\xed\xc3\x30\xe3\x93\x4f\x92\xc2\x7a\x25\xb1\x5d\x5f\xbb\xae\xec\xb9\x46\x34\x9a\x4c\x4c\x81\xd0\xd7\x58\x90\x22\xfe\x23\xe1\x88\x5d\x84\x89\xf2\xba\xdd\x3c\xbc\x74\x61\xc1\x7d\xf4\x54\x0c\x51\x59\xd9\x45\x94\xa0\x90\x15\xfd\x35\x8c\x67\xf3\x26\xe5\x15\xb8\x61\xb0\x94\xc7\x98\xf4\x16\x82\xbc\x7a\x16\x15\xbe\x20\x36\x15\x22\x20\x51\xb9\xc9\x91\x94\xd0\xc6\x30\x8a\x06\x0b\x7c\xb3\x6b\xd9\x84\xcb\x2d\xb5\x44\x82\xd3\xda\x0d\xef\xc7\xdd\xbc\x91\xb3\xce\x4c\x2e\xe5\x0c\x85\xd3\xc2\x51\xbe\xaa\xda\x8c\x26\xc9\xca\x4a\xba\x0f\xe9\x7c\x92\x8e\x54\x92\xae\xf2\x1c\xc0\x25\xa7\x81\x32\x61\x0d\xe1\x08\x4e\xe0\x18\xce\xe1\x05\xbc\x84\x9f\xe1\x2f\xf0\xaa\xf4\x26\xbc\xfd\x3d\x79\x13\xde\x19\x91\xd0\x38\x06\x1d\x4c\x1c\xf4\x40\x76\x36\x54\x8e\x7b\xfe\xa7\x17\xe3\x0f\xe7\xc5\x50\x1b\x2e\xa8\x6e\x23\xcb\xaa\x91\x54\x1c\x19\xbc\xc9\x95\xf1\xa9\x70\x65\x98\x38\x8f\xaa\x37\x43\xc7\x87\x14\x86\x0d\x0e\x60\xc6\x92\xb5\x9e\x0d\xa4\x9c\xbd\x2f\x43\x9c\x64\x0c\x55\x75\xa7\xd7\xc1\xb7\xe8\x29\x3c\x91\xae\x0d\x10\x1c\x8a\x42\x9a\x20\xff\x32\x64\xc4\x3b\xfb\xe9\xed\x3f\x9c\x97\x2f\x4e\x8f\x5f\xf5\x9c\x63\x9a\x25\x31\xf9\x86\x1b\xc6\xeb\x70\xea\xc8\x60\x07\xd0\xaa\x75\x7f\x22\xed\x91\x9f\x02\x6f\x18\x78\x5d\x48\x57\x45\x7c\x28\x03\xbc\xf1\x06\x24\x74\x7c\x22\x0f\x25\xc4\x7c\xf9\x9c\x33\x4e\xcd\xc3\x8b\x00\x4e\x82\x1a\xea\x44\xf5\x77\x14\x13\x29\x65\xba\xf2\xc9\x39\xa1\xef\xe2\xc4\x05\x70\x2c\x2a\x67\x4d\x0e\xe3\x8a\xa9\xc8\x20\x17\xf2\x20\x6d\x0e\x10\x09\xcb\x00\x91\xe6\x00\x98\x6e\x25\x6e\x44\x1a\xa1\x6b\xb1\x20\x3c\x3f\x6b\x15\xd2\x91\x57\x1a\x8a\x95\x1b\x1e\x79\xd8\xf2\xae\x23\x9f\xa3\x2b\xee\x01\x00\x4f\x3c\x0c\x8c\x51\x57\x0d\x90\x84\x98\x9c\xa2\x2b\x7e\x44\x04\x7f\x9c\xf9\xb1\x94\xcf\x80\x38\x19\xb4\xec\xd7\x62\xed\x36\x33\x2a\xc3\xeb\x76\xdb\x63\x01\xf3\xd3\x6c\x98\x72\xe6\x75\xe1\x6b\x69\x3b\xfc\xe6\x23\xf9\x48\x3a\xc5\x7f\xce\xe9\xfb\x0f\x6f\x8e\x9f\x9d\xbe\x78\xde\x73\x8e\x13\x1c\x9d\x3b\x0a\x85\x62\x65\x2f\x30\xba\x74\xf8\x04\x39\x43\xca\x39\x9d\x2a\x5b\x32\x72\x12\x3a\x76\xca\x0e\xbe\xb1\x83\x1c\xd4\x22\x30\xbb\x68\x79\x91\xa4\x16\x3c\x7f\xc0\x05\xb2\xe3\x90\x5e\x7f\x4d\xcb\x53\x62\x45\xe2\x78\x0d\xa2\x14\x19\x0b\x44\x5d\xd4\x9c\x4c\xc9\xe6\x4e\xa6\x26\xd7\xd2\x3b\xed\xc5\x51\x31\x55\x2e\x80\x6f\x75\x81\x09\xaf\xba\xd4\xee\x1e\x53\xb1\x98\x97\x0b\x77\xf6\xcb\xea\xf2\xd2\x00\x0a\xa7\x52\x72\xf9\x5c\x6b\x63\x4f\x45\x9d\xa3\xd6\x17\xb3\xc3\xeb\x9f\xf4\x06\x76\xcb\x12\x85\x24\x1b\xc8\x31\xe5\xf4\x95\xac\xf7\x8b\x1e\xd2\xfe\x72\x2a\xeb\x5f\x69\x7f\x94\x1d\x20\x37\x46\xdc\xa1\x19\x9f\x65\x42\x74\x15\x8b\x86\x02\x35\x9e\x50\xec\x35\x9d\x69\x88\x8f\x8c\x2c\x1b\x6b\x41\x3b\xc4\x49\x0b\x59\x5a\xf7\xde\x77\x7b\x63\xe8\xb6\x13\x7e\xe0\x82\xb2\xf0\x50\x16\x8e\x45\x61\x4b\x85\x9a\x4e\x8b\x85\x0a\x49\x8a\x4f\xe9\x2b\x3e\x4d\x3c\x64\xe2\xc5\xa4\x0d\x77\xc2\xa7\xc9\x49\x38\x42\xc0\xe3\x20\x17\xdc\xc9\x2c\x9a\xaf\x7e\xb4\x2a\x7b\x61\x8c\x4c\x80\x12\x46\xe9\x52\x54\x9c\x99\xae\x2b\x8e\x62\xa9\x24\x89\xd3\x5c\x87\xbd\x16\x33\xd9\x45\x2d\x6e\x1f\x10\x3c\xe0\xe6\x80\x30\xe5\x9d\xd7\xc0\x26\x4b\xb5\x08\xc6\xa0\xc0\x19\x16\xbc\xcd\x73\xb9\x7c\x92\x1e\x81\x1c\x46\xc5\x3c\x71\x7a\x92\xcd\x84\xb4\x8d\xe2\xa3\x0a\x5d\x97\x4b\x1e\xd5\x23\xbf\x10\x00\xbd\x15\x75\xe3\x86\xba\x75\x93\x85\xda\xb3\x50\x21\xad\xf8\xa6\x14\xa2\x82\x40\xad\x80\xd4\x75\xbb\x0d\x1a\x4a\x28\x78\x90\xec\xc6\x53\xca\x8f\x19\xb1\xfa\x5d\x06\x10\xe5\xf0\x32\x38\xf7\x2e\x6c\xb3\xab\x59\x96\xfe\xf0\xae\xd6\xeb\xcf\xf5\xae\x2b\x3b\xaf\x3f\xba\x6b\xff\xb5\xde\xd5\x2e\x71\x61\x7f\x72\xb3\xa1\xb9\xa9\x21\x80\x17\xb6\xa5\xf9\x97\x3a\xf4\xe5\x0e\xee\x8f\xef\x0a\xfa\x55\x53\xe7\xea\x10\xe8\xcf\xef\xda\xf9\x85\xb2\x91\x9f\x06\x9f\x2c\xf3\xd0\xe9\x06\x7a\x27\xa1\x31\xfa\x23\x04\x86\x95\x8a\xdc\xf4\xf7\xa4\xc8\x0d\xff\x54\xa8\xfe\x70\x0a\xd5\xdd\xc2\xc2\xc6\xeb\xc2\xc2\xc4\x6e\xdd\x3c\x20\x6c\xd4\x10\x10\x36\xd9\x3c\x20\x4c\x4a\x06\xe3\xa6\xc0\x2a\x01\x46\x63\x48\x95\xfc\xc0\x74\x9c\x82\x74\xdb\x2f\x07\x51\xd5\xea\x4c\x57\x87\x4d\x59\x11\x4c\x3a\x03\x63\x53\xc0\x54\x53\xad\xa1\xe7\x45\x5f\x20\xdc\x49\x8d\xf6\xe0\x81\x4e\xd3\xa6\x40\xa7\x58\x8b\x94\xf5\x8f\xc6\x13\x3d\xdb\x20\xd0\x49\x52\xea\x91\x98\xc5\x27\x1c\x07\x76\xac\x53\xb1\xc2\xf9\xbd\xc5\x37\x1d\xbf\xfb\x20\xe3\x69\x8e\x29\x49\xb3\x29\x8a\x6f\x15\xce\x34\xba\x31\x9c\x49\xcd\xdf\xff\x90\xa2\xf8\x36\xc1\x4b\xa3\x0d\x82\x97\xb6\x8e\x64\x99\xac\x8c\x64\x91\x5f\x1e\x3e\xfa\xe4\x96\xe1\x16\xd1\x72\xb8\x45\x54\xf1\xcc\x07\xc3\x6a\x9d\x7b\x0e\xb7\x98\xad\xea\xff\xfe\xc2\x2d\x6a\x03\x6c\x1c\x6e\xb1\xd4\xaa\x86\x9a\x5a\xbf\xdb\x84\x5b\x34\x35\xac\xf5\x1e\x29\x71\x6f\x1e\xd8\x71\x03\xf3\x0d\xc4\xbd\x8a\x89\x7d\x9d\x9c\xb7\x81\x75\xbf\x6e\x91\xdf\xf4\x9e\xdc\x3a\x17\xc8\xca\xcb\x3c\x32\x3e\x50\x08\x7c\xad\xbb\x47\x60\x08\xbe\x96\x05\x9e\xe6\x5d\xab\x8c\x3a\x0b\xac\xfd\x45\x3d\x54\x5c\x5f\xeb\xf1\x5c\x9e\xf4\x32\x64\xf1\xe0\xc0\x9c\x00\xda\xa8\xa2\x6f\x84\xc9\xfe\xa9\xb6\xc8\x70\x8f\xd9\x16\x19\x00\xa5\x59\xd0\x36\x3e\x02\x8f\x01\x20\x43\x1a\xa9\xbe\xe7\x23\x3b\x08\x75\x07\x54\x1b\x71\x44\x8d\xd0\x80\x66\xae\xb3\x41\x6d\xab\x11\x70\xe9\x23\x40\x99\x71\x42\xd0\xe2\xc6\xbb\x2f\x35\x48\xeb\x1e\x1d\xd2\x47\x91\x71\xbe\x97\x17\x5e\x70\x79\x2d\x45\xb9\xae\x60\x78\x0f\x5c\xd4\xb8\x64\x56\x70\xd3\x7d\xf4\x44\x32\x53\x83\xee\x2f\xc0\x50\x89\xec\x1d\xb2\xc0\x15\xfb\xc1\x85\x54\xfd\xf6\x92\x20\x05\xab\x54\x06\x31\x09\x5b\x65\x48\x56\xaa\x0c\xc9\x0a\x95\x21\xa9\xab\x0c\x37\x0a\xb7\xd4\x52\x19\xb4\x76\x5f\xb1\x0d\x48\xab\x73\x82\xc9\x39\x8a\x3d\xe0\xcf\x10\x1b\x51\x36\x2d\x2d\x00\x4b\x55\xad\xbb\x56\x79\x0e\xa3\x20\xb4\x4e\x9a\xd8\x20\x63\x16\x88\x83\x7b\x1a\xdc\xe5\x5c\x85\xa3\x60\x91\x43\x5b\x7f\x99\xae\xd0\x5f\x46\x42\x7f\x99\x6a\xfd\x65\x54\xd5\x5f\xec\x9f\x70\x54\xd7\x5f\x46\x2b\xf5\x97\xd1\xf5\xf5\xa8\xae\xbf\x8c\xaa\xfa\xcb\x28\x98\x6d\xa2\xbf\xc8\xf8\x0e\x83\x46\x4f\x28\x9a\x08\x5c\x5f\xa3\x1c\xc0\x11\x80\x43\x4b\x7f\x19\xd5\xb4\x8b\x91\xd6\x5f\x2a\xe5\x47\xa3\xe5\x25\x1e\x16\xfa\xcb\x68\xbd\xfe\x52\x1f\xa1\x99\x4a\x05\x88\x23\x31\x3d\xa5\xbf\xa4\xc1\x08\x86\x8a\x57\x68\x4f\x28\x1c\xc2\x91\xc5\x33\xb2\x4d\x78\x06\xa3\x53\x9c\xa2\xa6\x34\x14\x9a\x6b\xc8\x2f\xa2\xde\xd5\x7c\xc9\x44\x60\x5a\xcb\xaf\x1d\x75\xf1\x73\xe9\x94\xbf\x97\xb8\x3a\x79\x50\x91\xd5\x47\x15\xb6\x8e\xaa\xbc\x6c\x4e\xb6\x40\x81\x61\x8f\xab\x1d\xf5\x7f\x60\x24\x28\xff\x7f\x61\x2b\x5c\x29\x3c\x2c\x05\x48\x15\xd6\x0e\xfc\x65\xdd\xd6\x77\x0a\xcc\xfa\x75\xf6\x43\x86\x93\xb8\xd8\x8a\x75\xd4\x96\xe9\x02\x36\xf0\x63\xe0\xc2\x0f\xf1\xdf\x04\x12\xcd\xd5\x6f\x71\x12\x99\x4f\x12\x8c\x54\xbb\x19\xf2\xdc\x06\x00\x05\x87\xa4\xb0\x0a\xa8\x7a\x3d\x94\xab\x6d\xcd\x02\x62\x6d\x67\xb6\xc1\x32\xd6\x2c\x72\x0f\x9d\xc9\xc2\x5c\xee\x60\x4b\xd9\x2c\x60\x22\x15\xa7\x67\x02\x0e\x8f\x1d\xee\x1f\xb1\xce\x7e\xaf\x0b\x20\x0d\xf6\x0f\xe8\x77\xec\x80\xee\xee\x82\xa4\x4f\x3b\xfb\x03\x2b\xd7\x05\x1d\x68\x5d\x2f\xb4\x1a\xfb\xbe\x9f\x14\xa9\x2b\x42\x7f\x1a\x5e\xfd\x24\x47\x08\x10\x0c\xfd\x4f\x09\x9e\x62\x0b\xa6\xba\xcf\x4e\xb9\x11\xb8\xbe\x1d\xad\x1a\xb6\xd0\x61\xb7\xdd\x56\xd2\xd3\x4c\x87\x3a\x22\x90\xc3\x50\xea\x6e\x76\x5f\x66\x7a\x68\x79\x7a\xd8\x82\x10\x01\x48\x82\xee\x01\xf9\x0e\x1d\x90\xdd\x5d\x80\xfb\xc4\x9e\x14\x19\xb4\x8a\x1c\x14\xe1\x6c\x96\xcc\x15\x4d\x60\x2d\xa8\xa9\x19\x98\x00\x35\xd5\xbb\x80\x45\x81\xb6\x21\x34\x7c\x35\x34\x7c\x09\x1a\x23\xd6\x62\x1b\x1c\x5e\xa0\xb8\x0a\x15\x13\xb0\x60\x92\x22\xc6\x9f\xf1\xdb\x41\x83\x83\xee\x01\xfe\x0e\x1d\x60\x09\x0d\xb6\xa1\xc1\x25\x34\x64\x13\x68\xe4\x2f\x49\xdb\xc7\x94\x70\x44\xf8\x73\x1c\x1f\x4f\x42\x32\x46\x06\xd4\x8c\xa4\x13\x3c\xaa\x40\x5a\xbf\x04\xee\x1e\xcb\x0c\x6a\x8e\xae\xea\x50\xc2\xa9\x13\x3a\xef\xd5\xd6\x91\x60\xbb\x82\x1c\x72\x21\xaa\x2f\x04\x4d\xf4\x38\x54\xcb\xd1\xc3\x79\x20\x2b\x58\xb2\xd5\xc2\x60\xa7\x47\x96\x3e\x6e\xb0\x63\x6b\xe1\x53\x77\x54\xdb\x4c\xaf\x42\xad\xe8\x28\x7d\x61\x83\x70\xab\x07\x54\xee\x20\x55\xca\x82\xb6\xe6\x97\x96\xfc\xf8\x4f\xe3\xf8\x1f\xce\x38\xde\xa0\x8a\xcf\x02\x2f\xac\x5b\x75\xb5\x39\x78\xb5\x76\x6e\x8e\x6f\xad\x73\x43\x5e\x8b\xc0\xc0\x85\xfe\x8d\x2c\xfd\xdb\x0a\x4b\x1f\xd2\x78\xee\x8f\x11\x7f\x8f\xc2\x18\x31\xa5\x5f\x97\x9a\x52\x11\xca\x53\xa4\xde\x68\x71\xad\x3e\x79\x20\x97\x5a\x3c\xad\x69\xf1\x48\x6b\xf1\xd8\x68\xf1\xa5\xf2\xcd\xe4\x18\x2e\xc4\xca\xa6\x9e\x04\x3b\xfb\x30\x0c\x4c\x9a\x26\x27\x95\x87\x61\x61\xbf\x53\xc6\x85\x9d\xe4\x00\xa8\x29\x60\x5f\xb4\xf7\xec\x69\x88\x53\x47\xa1\x95\xc3\x98\x12\x79\xe8\x20\x31\x7a\x12\x60\x18\xee\xca\xe8\x13\xb1\xb1\x3d\x0e\x17\x6a\x27\x2b\xfc\x77\xf6\x77\x82\x40\x1c\xd6\x31\xba\x7a\x3b\xf2\xdc\xdc\x35\x6a\x7b\x1f\x22\xc8\x07\x81\x60\x9e\x3c\x9a\x78\x7b\x9e\xff\xd7\x8f\x39\xf0\xfc\xbf\x82\x47\x7b\xa0\x15\x06\xbc\x55\xb1\x3c\xe0\xc2\xf2\x40\xa4\xe5\x81\x15\x96\x07\x04\x64\x4e\xa9\x46\xcb\x03\xae\x58\x1e\x08\x50\xe1\xb1\xe2\x00\xf4\xbc\xec\x26\x4b\x43\x72\x67\x4b\x43\x61\xb7\xd7\xeb\xf1\x5b\x1a\x1a\xa2\xaf\xd9\xd0\xc0\x71\xe4\x8c\x11\x77\xac\x10\x89\xc2\x9c\xb0\xb3\x73\x89\x49\x4c\x2f\x7d\xb1\x71\xc4\x18\xca\xbf\x2f\x8d\xd2\xf5\x7c\x43\x45\xa3\xc5\x88\x26\x09\xbd\x14\xb8\x59\x6d\xc8\x58\xb2\x5f\x54\x36\xba\x5a\xb3\x22\xc3\x53\xbb\x8d\x8a\xfd\x08\x57\x58\x38\x2a\x46\xef\xe5\xc4\x4b\xfd\xf0\x66\x5b\x6c\xb6\xb6\x0b\x00\xb3\x8a\x55\x36\x88\xab\x0d\xd4\xa2\xf7\xd3\xbb\x1a\xa9\x33\x3b\xe9\xcb\x6c\x03\x89\xa1\xca\xdb\x1f\x42\xc4\xb7\x32\x24\xf1\x40\x53\xc4\x29\xba\xe2\xea\x1a\x06\xbb\xbe\xae\x48\x57\xd8\x1c\x48\x0d\x49\xee\x5c\x57\x1e\x78\xe2\x07\x0e\x9e\x08\x31\xd0\x1f\xce\x39\x52\x82\xb8\x92\x08\x77\x03\x15\x51\xef\x8f\x18\x9d\x1e\x4f\x42\x76\x2c\xce\x36\xd4\xc7\x83\x52\x08\xcc\x73\x0b\x47\x7c\x1d\x8e\x68\x8c\xd2\xce\x88\xb2\x8e\xcc\x18\xf4\xf0\x1a\x90\xe1\x39\x7d\xe4\x8b\xb1\x07\x2d\x9d\xd5\x29\x15\x34\xac\xfe\x2a\xc5\x17\x79\x6d\x46\x6a\x19\x9e\xf2\x24\x67\xa9\x4c\x46\x57\xe8\x07\x82\x47\x86\x11\xf7\x80\x9f\x11\xfc\xab\xa7\xaf\xfc\xa2\xe0\xd0\x75\x77\x91\x3a\x51\x57\xcd\x5c\x5f\x60\xaa\x08\x90\xea\xda\x42\xe7\x17\xf1\xb7\xa4\x1a\x55\x89\x75\x12\xbc\x9c\xab\x51\xa8\xee\x85\x74\x26\xe7\x86\xae\xaf\x3d\x14\xb8\x6e\xe9\x81\x13\xac\x0c\x4b\x52\x50\x77\x21\xd8\x4f\xf2\xb2\x4c\xc6\x47\x9d\x7f\x73\x81\xaf\xba\x2f\x23\xcb\x4a\x35\x5a\x2e\xee\x0f\x73\x8e\x94\x56\x40\xc0\x6d\xc4\x8b\xe5\x5b\x18\x01\x29\x8a\xed\x2b\x42\x95\x15\x52\xb3\x90\x57\x7d\x40\xa1\x6d\x58\x89\x99\x68\x09\x56\x09\x78\x39\x51\x4d\xf3\xd5\x89\x6a\x06\xcc\xd6\xaf\x48\x1a\x85\x33\xd4\x11\x42\x4e\x47\x5e\xcf\x7e\x70\x62\x34\xe7\x67\x19\x0b\xd8\xff\xef\x61\xe7\xf3\xb3\xce\x7f\x75\x3b\x7f\x87\xfe\xa7\xdd\xef\xff\xb2\xd7\x19\xec\x8d\x33\xe8\x7e\xfc\xf8\xa8\xed\xae\x05\x5f\x0a\x40\x55\x7a\xd2\x45\x65\x4d\x75\xf0\xed\x21\x72\x81\x19\x25\x4d\x49\x5b\xef\xc7\xf2\x25\x4e\x22\x12\xb8\x33\x46\xe3\x4c\xe5\xc1\xde\x09\xac\xd4\x6d\xd6\xf8\xed\x76\x51\xdc\x37\x0a\x53\x82\x3b\x53\xcc\xc2\x31\x72\x07\xed\xf6\xce\xbe\xdd\xb4\xa9\x8e\x8f\x88\x38\xae\xe3\xa3\x82\x48\x7a\xfa\x0c\x94\xf3\xbf\xbe\x6e\x4a\x1f\xbb\xce\xc6\xa6\xd3\x63\xc7\x19\x0b\x97\xf3\x69\x4e\xa9\xca\x93\xab\x01\xc1\x64\x94\x20\x21\xfa\xdc\x33\x22\xad\x13\x5b\x05\x9d\x2e\xa5\x1f\xed\x36\xa6\x1f\xed\xda\xe9\x47\xbb\x83\x5e\x17\xe2\x5b\x67\x2e\x25\xa9\x0b\x93\xe5\xd6\x8f\x1b\x5b\x3f\x1e\xb4\xdb\xf6\x2f\xbd\x75\xa9\xd0\x12\x45\x4f\x41\x10\xe0\x23\x8f\xfa\x24\x24\x34\x45\x11\x25\x71\x1a\xa0\xbf\xec\xa3\x27\x90\xfa\x53\x1c\xb1\xa2\xd0\x8e\x53\xf8\xcb\x3e\xfa\xdb\xde\x3e\x7a\x02\x20\xaa\x94\xab\xa0\x86\x9e\x3b\x9d\xaa\x8e\xdb\x6d\xaf\xd6\x8b\xea\x7a\xa9\xd5\x13\x1d\x79\x1d\x06\x58\x42\xb5\x23\x1b\xcb\x7e\xc4\x9f\xd7\xd7\x5e\x18\xb8\x42\x98\xb0\x52\x7d\x18\xaa\x35\xf4\xe0\x21\x28\xaf\x43\x8e\x70\xc2\x11\xfb\x61\xee\xb9\x98\xbc\x56\x54\x21\x19\x80\x28\x51\xe9\x1d\xaa\x9c\x84\x0a\x05\x38\xed\xa3\x81\x4c\x21\xa7\x07\xc8\x02\x52\xc9\xc1\x04\x82\xc3\x05\x1e\x79\xb4\xcf\x7d\xd1\xc7\xc0\x70\x2c\x1c\x14\x45\x2d\xa4\x58\x12\xf3\xb0\xd4\x01\x41\x6e\xce\x91\x1c\xc0\xfe\x40\x2a\x3e\x99\xb9\x11\xad\x3f\x65\xfe\x2f\x14\x13\xcf\x75\xdc\x32\xab\xac\xf4\x51\x8e\x30\x89\x05\xc0\x69\x36\x1a\xe1\x2b\xa9\x15\x24\x20\x2f\x18\x48\x7f\x41\x64\x26\xf8\x39\x0a\x59\xea\x42\x55\x4b\xfd\x74\xa1\x99\xb6\x10\x94\x4c\x42\x7c\x23\x75\x43\xdd\x70\x4a\x09\x9f\x58\x2d\xe5\xef\xcd\x9a\xc6\xe1\xdc\x6a\x18\x87\xf3\xcd\x9a\x4d\x68\x66\x83\x3a\x71\x61\x42\xc9\xf8\xc4\xfc\xa4\xd9\x5a\xc8\xf7\x4b\xc8\x31\xc9\x64\xba\xfc\x02\xf4\x6a\x4f\xea\xfb\x66\x7d\x69\xaa\x2c\xfb\x4a\xab\x7d\xa9\xef\x9b\xc2\x95\x24\x78\xa9\x43\x21\x43\x6f\xd6\xba\xdc\x24\x65\xeb\xff\xf3\xbf\x2b\xcd\xf7\x57\x36\xb7\x76\x6f\xd9\x9a\xdc\xd0\x78\x00\x99\x0c\x7e\x83\x04\xe8\xb0\x72\xd6\x62\x01\x69\xb7\xb9\x5f\x22\xe1\x68\x3f\x08\x02\x74\x64\x17\xf5\xa4\xd1\xa1\x78\x6a\x01\x78\xf6\x47\xd0\x13\x8c\x01\x89\x4e\xec\xf1\x8e\x96\xdb\xa4\xba\xbe\xf9\xab\x4c\xbb\x8a\xf2\x47\x8b\x6a\xf3\xeb\xeb\x3a\x58\xae\xe3\xf6\x5c\x37\x7f\xb4\x60\xf9\xd9\x5a\xf6\xab\xdf\x54\xa0\x69\xcd\x25\x85\xd3\x0e\x9e\xdd\xeb\x45\xf5\x6a\x34\x23\x1e\x79\x3b\xe8\xfa\xba\x34\x75\x2c\xc9\x72\x17\x7f\xf3\x10\x38\x3a\xeb\x8b\x09\x0f\x7a\x8f\x16\x38\x3f\xeb\xc9\xd9\xab\xbf\xd7\xcd\x6a\x8c\x08\x62\x21\x47\x1d\x79\x4b\x5f\xc5\x2a\xdd\xd6\xd7\xa4\x6c\x03\x38\xb0\x8d\x85\x48\x9e\x56\x8d\x8a\xdf\xc9\x7c\x3a\xa4\x49\xaa\x5a\x91\x60\x5d\x1d\xd1\x0d\x6f\xb7\x3d\x12\x98\x53\xd9\xb2\xec\x95\x4e\xe3\x9b\xf4\x4b\x01\xa3\xa5\xdf\xcb\x6b\x66\x58\x9e\xb5\xda\xd6\x8d\x21\x29\x0e\x5b\x9c\x57\x85\x6f\x63\x5f\xe7\xc1\xfe\x01\xff\xae\xce\x34\x0f\xf8\xee\xae\x99\x89\xd0\x23\x77\x2c\xce\xc9\x6d\xbe\xcb\x07\xbd\x45\xde\xe2\x7f\x79\x7c\x84\x35\x5a\x3c\x02\xe0\x4e\xb7\xc9\xa8\x2a\x66\xa6\xf6\x55\x9f\x0f\x04\x4f\xe9\xdd\x30\xc3\xb4\xd1\xb2\x82\x51\xea\xa1\x9b\x94\xef\xd4\x23\x00\xf4\x2c\x98\x56\x00\xb4\xda\x74\x73\x13\xf6\x09\xe4\x2a\xfd\x53\xc1\xcd\x0a\x04\xb3\xdf\x8d\xab\xb2\xba\x35\x13\xc4\x17\xbf\xd0\x61\x8f\xc1\x22\x63\x54\x2f\x91\x7f\xf7\xa8\x9d\x55\x32\xcc\x03\x5c\x08\x1c\x8b\xdc\xc4\xd5\xca\x0c\x4f\x4c\xe5\x8a\x4a\x67\x61\x84\x7c\x9d\x35\x2a\xaa\x7e\x67\x68\x2c\x93\xfc\xb5\xb2\x76\xdb\x4b\xfd\xa2\x7a\x90\x81\x56\x24\x8b\x54\x8d\x20\x92\xbb\x8d\x96\x32\x05\xf1\x16\x39\x4c\x4b\x6f\x5d\xbb\xed\x61\xbf\x04\xcc\x1a\x26\x2c\x5f\xf4\x97\x89\x68\x32\x96\xbc\xa4\xcc\x73\xc5\xb9\x20\xed\xc2\x9d\x71\x91\x10\xcb\x85\x15\xf0\xe4\x35\x30\xd1\xce\x2a\x4e\x8a\x0c\x58\x65\x19\x2d\xca\x16\xbf\x96\x8e\xd9\x1e\xce\x0b\x92\x48\x8e\x56\x0e\xbc\xd5\x98\x95\xfe\xd3\x1c\xf4\x42\xc9\x7d\x2a\xb3\xad\xe5\xf8\xd2\xfb\xd8\x05\xab\x41\xd8\x74\xee\x95\xce\x97\xb0\xd0\x30\xf4\x08\xb3\x94\x6b\xa2\x6c\x9a\x01\xf1\x16\x16\x31\x35\xaf\x99\x58\x66\x41\xe3\x77\xc0\x5f\x13\xdc\xf7\x03\xc7\xca\xc1\xeb\x0b\xb5\x8e\x55\xe1\x59\x67\x16\x4a\xb6\xf4\xa5\x6c\x48\xe8\xa8\x78\xce\xa1\xe7\x82\x5e\xbf\x70\x1c\x77\x65\xd2\x1f\x45\x31\x47\x8b\x30\x8e\x19\x4a\xd3\x1e\x82\x02\x28\x63\xdb\xed\x3d\x6e\xac\xc4\xfb\xdd\x81\xaa\xc7\xfb\xfb\x83\xbc\x87\xd4\x4d\xb2\xf4\x67\xcc\x27\x9e\xdb\x77\x81\x55\xb5\x48\xfc\x53\xdc\xbf\xdb\x07\x5a\xce\xef\xb9\xc0\xf4\x52\x7e\x1c\xe4\xbd\x15\xc0\xac\xc3\xeb\x72\x92\xf7\x86\xf7\x25\x22\x3a\x7b\xc0\x27\x6d\x50\x70\x88\x83\x43\xec\xd3\xf3\x23\xec\x0b\x78\x3c\xd0\xd3\x3e\xaa\xd9\x1c\x78\x48\xf0\xc7\x1b\x9f\x86\xb1\x12\x89\x3d\xa4\x11\xb6\x2c\x58\x94\xd9\xb3\x7a\xee\xbf\xf4\x9f\xbb\xd0\x24\xcd\x12\x3f\x9f\xb9\xd0\xca\x95\x25\x4a\x8e\x5d\x58\xa6\xc8\x12\x05\x3f\xb8\xd0\x64\xc4\x7a\xd6\x73\xff\xbf\xf2\xd7\x87\x9e\xfb\xff\xbb\x50\x26\xb1\xea\xb9\x1f\x99\x0b\x55\x5e\xa9\x9e\xfb\x3f\xdc\x75\x2b\xa9\xbd\x44\x9d\x11\xa3\x45\x92\xa5\x65\xbb\x6b\xf5\xd1\x18\x5d\x6d\x0f\xe9\x87\xe9\x1e\x4a\x8a\x95\xa2\x91\xe0\x4e\xc8\xc1\x24\xe5\x21\x89\x10\x1d\x39\xdc\x7f\x69\x5e\x60\x7b\x61\xe5\xde\x3f\xfb\x4f\x9a\x31\xe7\xd9\xf1\x4f\x8e\xcc\x65\xe3\xc4\x14\xa5\x0e\xa1\xdc\x19\xb3\x90\x70\x67\x86\xd8\x14\xa7\xa9\x90\x1c\x64\x92\x01\x9c\xfb\x67\xa2\x6b\x25\x78\x05\x1e\x09\x8c\xa9\x17\x58\xa6\x0c\xd2\x6e\x93\x9a\xd6\x5c\x58\x84\xb5\x56\x1f\x23\x75\xdd\x53\x6f\xb2\x8f\xe4\x23\x29\xf4\x69\xf7\x03\x39\x27\xf4\x92\xa8\xa0\x85\xb5\xeb\x40\x68\x27\x91\x0e\x94\xdf\x0e\xf9\xc8\x7f\xf3\xf6\xd3\x4f\x2f\x9e\x3d\x7f\xf1\xbe\x9e\x0a\xcf\x7d\x43\x9d\x28\xc9\x52\x8e\x98\xa3\xc0\x74\x5b\x76\x75\xbc\x71\xf0\x95\x71\x05\x92\x46\x17\x20\x09\xb0\xf4\xff\x99\x97\xf5\xb6\x72\x00\x92\xed\x25\x3b\x92\x6f\x18\x62\x47\x28\xc7\xa3\xf9\x97\x72\x48\x18\x91\x36\x38\x5c\x20\x3f\xa2\x84\x33\x9a\x24\x88\x49\xde\x28\xb4\x0e\x6c\x52\x38\x6b\x07\xae\x82\x8a\xaf\x4f\x64\xa4\xa7\x50\x3c\x5f\xb8\x36\x95\x5a\xdd\x07\xf3\x30\x9b\xbc\x98\x29\x56\x16\xae\x1d\x79\x80\x17\xb7\x64\x30\xf0\x31\x89\x92\x2c\x46\xa9\xe7\x3e\xed\x3e\x71\x01\x50\x71\x40\xb8\x85\xd4\xcc\x71\xfa\xb2\x9c\xce\x4e\x77\x3d\x02\xe8\x0c\x91\x46\x9d\xf5\x61\x16\x51\xdb\x9b\xc5\xa8\xb2\xf1\x30\x09\xc9\xb9\x0b\x5d\x99\xee\x2b\xf8\xfb\xbf\x3e\xd1\xf9\xbd\x82\xa7\x7f\xef\xc2\x42\xba\xde\x5f\x6f\xd0\xa7\x9c\x77\xd0\x55\x24\xc3\xa5\x1e\x92\x1a\x2b\x21\x95\xbc\xd8\xd5\xf2\x1c\xdb\xf2\x32\x9e\xfb\x32\xc4\x09\x8a\xc5\xb1\x6b\x20\x97\x79\x3f\x28\x41\x1d\x8e\xa7\x48\x9d\xd7\xbe\x7b\xfb\x8d\x7f\x1b\x95\xce\xde\xf8\x7c\xcd\x63\x52\xb3\x42\x1f\xde\x1b\x27\x78\x3a\x45\xac\x93\xf2\x79\x82\x3a\xab\x5f\x56\x2b\x53\x7d\x3d\x14\x6b\x94\x57\xa7\x47\xde\x0e\x91\xe2\xf1\x52\x6c\x9c\x04\x50\x79\xd1\x1c\x4a\x92\xb9\x73\x49\xd9\x79\xea\x50\xe2\x8c\x11\xe7\x88\x95\xa6\x6c\x16\xc8\x2e\x0a\x8f\x99\xf8\xd1\x14\x88\xc9\xac\xc0\x3e\x65\x2c\xc7\x81\xeb\x5a\xbe\x7e\xaf\x6e\xc2\x59\x8e\xa6\x92\xca\x7a\x71\x0d\xb0\x8f\xad\x90\x4a\x69\xba\xc6\xbb\x6e\xcf\xdd\xf5\x5c\xfd\x46\x5f\x10\xf0\xf9\x4c\xf0\x7b\x72\x44\x7c\x4e\x5f\xe2\x2b\x14\x7b\x8f\xc1\xae\x3b\xbb\x72\x7b\x04\x00\xc8\x95\x65\x5b\xf3\xdd\x03\xa1\x82\xca\xe3\xa3\xcc\x82\x81\x41\x0e\xc9\xba\xdd\x64\x2d\xee\x2f\x74\xd8\x51\x97\x2e\x3b\xca\xa9\xbb\x95\x51\xeb\xde\x44\x9e\xc6\x6b\xc8\xd2\x2e\xe7\xf7\x07\x67\x50\xbe\x0b\xe7\xcb\xa4\x76\x11\x22\x62\x29\xa1\x82\xd6\xb2\x1c\xa4\xfe\xf7\x28\x8c\x26\xbe\x9a\xcd\x89\xfa\x5c\x28\x69\x69\x7e\xd6\xf0\xa0\x15\x2f\x52\x82\x78\x18\x40\x16\x58\x37\x98\x0b\xe3\x19\x0a\x0e\x55\xb6\x46\x3d\x72\x11\xa4\x84\xac\x52\x70\x18\x74\x55\x98\x95\x3b\x43\x24\x16\x3b\x44\xaa\x34\xda\x51\xae\x57\xbc\x51\x71\x2a\xfc\xe4\xc8\xc7\x71\xe1\x50\x5f\x0c\xe7\x6f\x68\x8c\x8c\x15\x4b\x88\xa9\x2f\x08\x67\x18\xa5\x1e\x2f\x5a\xf4\x91\x4c\x7e\x97\xa1\xd8\x1d\x00\x00\xe0\x70\xae\xa6\x2d\xb4\x4f\x55\xde\x13\xd4\x22\x5f\xb0\x16\xbd\xa5\x3d\x93\x09\x35\xcf\x3d\x66\x36\x83\x0c\x5e\xe4\xbe\x8d\xc9\x8a\xaf\xc6\x0a\x4d\x43\x09\x25\xe3\xf4\x94\x7a\xfa\x86\xb1\x8f\x63\x0f\xb4\x92\x3e\x1f\x5c\x5f\x7b\xe2\x7f\x41\x7f\x00\xa0\xf8\x43\x47\x0a\x58\xde\x1d\x1a\x98\x39\x2d\xf2\x12\xd2\x45\x6e\x83\x67\xb2\x2e\x15\xc1\x94\xac\x09\x14\x1c\x54\xa9\x50\x5a\x7d\x35\x8e\x5d\x42\xf9\x89\x79\x0f\xd8\x6d\x59\xc9\x5f\xbf\xe3\xa6\x4a\x8c\xc6\x2c\x8c\xc5\x67\xd3\x1f\xb2\x57\x7b\x07\xf9\x38\x7d\x9b\xc4\x00\x2c\x79\xa3\x4c\x7d\x5e\xa1\xb2\xe2\x3c\xe8\x63\x81\x07\xf1\xbf\xa0\x0b\xa0\xf8\xff\xee\x2e\x44\xb9\x7a\x3c\x84\x04\x7d\x77\x24\x59\x82\x4c\x33\x93\x72\x17\xba\x82\xd6\x13\x24\x4e\xcc\x22\xd4\x84\x05\xdd\x03\xf6\x9d\x91\xbe\x0f\xd8\xee\xae\x75\x9d\xb7\xcf\xe4\x1b\x03\xb8\x8f\x06\x82\xbc\x0a\xd9\x3c\x17\x85\xbe\xea\xfd\xb0\x7b\x7d\x8d\x7d\x31\xc0\x61\x77\x79\xc6\xb2\x22\x53\x21\x84\xe5\x77\x5d\xa0\x3f\x67\x4a\x7a\x2f\x3f\xeb\x02\x73\xf0\xa9\xd4\x5d\xa2\x7e\xee\x25\x7d\x41\xb6\x03\xc8\xcb\x44\xf0\xc6\x3e\x04\x5a\xd4\x57\x2b\xae\xea\x04\x18\x8a\x02\x85\x33\x85\xaa\xca\x6f\x49\x3b\x95\x12\x13\x6e\x82\x63\x19\x8c\x57\x7e\x0b\x88\xd5\x14\x40\x9a\x83\xc2\x4f\x87\x83\xbe\xd9\x13\xb0\x4a\x0c\xb0\x84\x1b\x16\x33\xb6\xd6\x00\x96\x68\x82\x4b\x2b\x65\x50\x30\x68\x2d\x9b\xba\x55\xb8\x50\xf7\x80\x7f\x87\x2b\x26\x6e\x73\xe8\xe3\x3e\x1f\xb4\x50\x9f\x28\xe2\x20\x72\xa2\xa5\x65\x77\xb3\x73\x5a\xec\xcd\xa4\x93\x72\x2a\xfd\xfc\x5f\xcf\x19\xbd\x10\xa7\x65\x79\x9a\x69\xe1\x4f\x42\x7b\xa2\x80\x15\xe7\xe9\x8f\x1c\x4d\xed\xd0\x9a\x23\x2b\xa7\x2e\x07\x3d\x9c\xc3\x14\xf1\x9e\xa7\x5f\xdd\x69\xea\x24\x35\x9d\xc0\x5a\xc2\x53\x0c\x00\xc4\x60\xbd\x39\xcc\xc2\xa3\x34\xbe\x75\xb2\x0c\xc7\x5f\x1e\x89\x1b\x65\xdb\x90\x7e\x93\x42\x30\xc9\x92\x24\x08\x02\x8f\xdb\x9c\x09\x5c\x5f\x17\xf1\xd1\xfc\x48\xfd\xd9\xe3\xc6\xfa\xd6\x71\x41\xbf\x3b\xc8\xd7\x07\x5c\xd9\x08\xb9\x49\xaa\xab\x67\xd8\x59\x25\xe5\xdd\x57\x90\xc7\x66\x68\x32\x7b\xab\x34\x96\xca\x00\x56\x64\x92\xc9\x95\x52\x9a\x7c\x48\x36\xa8\x45\xe5\x37\x5f\xa8\x2c\x5c\x01\x62\xc3\x16\x76\x0f\x79\x08\xf1\x15\x52\x1a\x3e\xc2\x4b\x52\x9a\x20\x49\xd4\x28\xa5\x61\x4b\x4a\x63\x60\x8b\x45\xca\xa6\x9d\x70\x3c\x66\x68\xdc\x10\x85\xf3\x15\xc8\x68\x4a\xf2\x92\x1e\xd4\xa6\xd4\x31\xb6\x58\xa5\xcc\x47\x78\x89\xb7\xa2\x5d\x0e\x60\x77\x0b\x9c\x64\x04\xff\x9a\xa1\xa4\xf9\xe2\xe7\x8a\xb4\x50\xf2\x2a\x37\x09\x93\xa5\xf7\x13\x1e\x9a\x78\x97\x91\x22\x11\xd7\x79\xb4\x90\x54\x31\xce\x70\xfc\x92\x32\x45\xc4\x40\x3d\x7a\xba\x19\x16\x2e\xc3\xa5\x48\xb7\xc6\x97\x4d\x97\xf3\x33\xb3\xf4\x62\xb6\xe2\x62\xce\x52\xac\x9c\x1a\xf6\x32\xc4\xdc\x2e\xd5\x26\x39\x0d\x84\xd0\x34\xb7\x8d\xaf\xab\x26\x45\xbe\xd5\x12\xc8\xb1\xdf\xa3\x88\xb2\xb8\x79\x19\x92\xe5\xab\x1a\x44\x05\x92\x35\xc4\x73\x6d\x16\x0d\xf6\x18\x3d\x91\xf2\x9a\xab\x71\x5b\xea\x6c\xd2\xf1\xae\x96\x54\x9c\x49\x04\xba\x38\x76\x01\x38\x88\xda\xed\x9d\xa5\x07\x35\x0f\xaa\x89\x6b\xa8\xff\x6c\x48\x19\x3f\x2e\xec\x5e\xf2\xd9\x51\x75\xd5\x82\x95\x59\x10\x93\xc4\xeb\x9b\xa4\x7d\x0c\xc9\xa0\x25\x35\x7d\x0f\x41\x02\x17\x0c\x25\x34\x8c\x85\xfa\xaf\x97\xe7\xed\x4c\xca\xf4\xbd\x85\xc4\x94\xfc\x50\x1d\xa6\xc7\x73\x75\x71\x24\x2c\x4d\x50\x09\x18\x98\xa7\x48\x53\xfd\x3a\xa8\x93\xb6\x86\x0c\x85\xe7\xf9\x08\x93\x30\x49\xe6\x0b\xee\xcb\x8e\xf4\xd3\x06\xe6\x19\xd0\x72\x49\x12\xa5\x4c\x4c\xf0\x6c\xe3\x85\x51\x7e\x62\x87\xdc\x75\x61\x1e\x10\xdf\x1a\xab\x2f\x29\xf3\x64\x0a\x36\x63\x11\xf2\xa7\x34\x46\xc9\x9b\x70\x2a\x6d\x00\x62\x0d\x6c\x0c\x78\x18\x22\xb8\x6e\x05\xea\x0b\x40\xca\x05\x48\xcc\x02\x24\x5b\x2d\xc0\xb3\x24\xd9\x18\xef\x0a\xed\x0d\xd1\x91\x9b\x05\x56\x7e\x01\xb4\x0b\x32\x7f\x96\x24\x1e\xba\x2f\x0a\xc7\x25\x82\x89\x41\x30\xd9\x0a\xc1\xf2\xc6\xf4\x17\x23\xed\x7d\xf4\xf4\xa1\x71\x2c\x1d\xcc\xd2\xce\x76\x4f\x38\xbe\x3d\x11\x6b\x65\x2e\x0a\x64\xc8\x73\x56\x80\xfc\xec\xdd\x3b\x7f\x98\xd0\xe8\x1c\x93\xb1\xc0\x3f\x46\xe9\x1a\x3e\xf9\xeb\xac\x93\x22\xa6\xee\xac\x3c\xbc\xcc\x54\x0c\x15\x97\x77\xe9\x83\xca\x87\x40\xe8\x31\xe6\xef\xc2\x47\x6a\x7d\x0e\x0e\x5d\x2d\x89\x17\x2c\x05\x5d\x5f\x2f\x09\x9d\xe8\x08\x15\x96\x9c\xa3\x9a\x3e\x84\x40\xcf\xb5\x0c\x1b\xc1\xe1\x42\x2c\xbd\x16\xc4\x2c\xb5\x0b\x01\xeb\xc6\xc6\x25\xe6\x13\x9a\x71\xcf\x75\xcd\x7a\x15\x91\x62\xfd\x81\xbe\xc0\x52\x82\x89\x5b\xab\xa7\x1b\x1c\x6e\x92\x4b\x10\x7b\xb6\x3e\x63\xee\xda\x35\x2f\x22\x43\x53\x7a\x81\x3a\x4c\xf2\xb8\x87\x76\x5f\xd8\x5a\x40\x7f\xd0\xe2\xbe\x10\x6c\x2b\x07\x79\x61\x0b\x4a\x10\x5f\x9c\x63\x12\xf7\x48\x1e\xf0\x96\x8a\x8d\xf3\x16\xe7\x68\xde\x43\x50\x97\xeb\x87\xaa\xd4\x17\xf9\x22\xc7\x02\xc7\x3d\xae\x32\xd9\xc9\x34\x85\x62\x41\x7b\xbc\x99\x8f\x40\x66\x8d\x9b\xf6\x70\x5d\x62\xf6\x50\x5f\x2a\x34\x83\x40\xf5\xed\x4e\xc2\xf4\x75\x48\xe6\xca\xf2\x28\x40\x38\xea\x0f\x74\xda\x1b\xfd\x82\x6d\x2e\xa7\x9d\x11\xc5\x9e\xa4\xd0\xc0\xd7\x4a\x9a\x45\x3a\xc4\x4e\x8c\x47\xa3\x9a\x71\x38\x7e\xd2\x51\x91\x9e\xcb\xa2\x62\x46\x70\x7d\x85\xee\x2d\x93\x88\xd6\xfc\xac\xfb\x39\x12\x08\xcf\xdd\xf5\xbb\x7f\x71\x81\x0e\xb0\x55\x2a\xc5\xcd\xaf\x97\x15\xaf\x12\x49\xbc\x9b\x27\x89\xa6\x59\xc2\xf1\x2c\xc1\x88\x99\x47\xcb\x04\xfd\x4d\xa7\x88\xc4\x6a\x49\xcc\x6b\x45\xe8\x4a\x3a\xea\x24\x36\xed\xcf\xc4\xb6\x28\xe2\xd2\x9f\x27\xdf\x78\x2f\xd3\xea\x55\x6e\x12\xea\x4a\xf5\xbe\xac\xe0\x7a\xb3\x1c\x2e\x74\xd5\x63\x88\xda\x30\xb0\x02\x8a\x35\x2d\xed\xcb\x42\xfa\xe1\x19\x89\x00\x3b\x7f\x61\x2d\x6d\x9e\xfb\xfa\xd5\x67\xb7\x8e\x1e\x28\x50\x5d\x4d\xfc\x77\xfb\x39\xa9\xec\x79\xaf\x7f\xb8\xe5\xc4\xca\xe6\x37\xce\x4e\x55\x5d\xce\xdb\xe7\xbe\xc6\x3f\xac\x99\xe3\x8a\xd9\xd4\x34\xdd\x1a\xa9\xf8\x0c\xc9\x38\xd1\xe2\xd9\xff\x55\x93\xaa\x12\x49\xae\xbd\x90\x49\x13\xcd\xaa\xdc\x73\x2a\x9d\x62\x98\x22\x43\xb6\xe2\xef\xd3\x30\x3d\x37\x1b\x4b\x1c\x23\x86\x80\xe5\x96\x34\x64\x6b\xd1\xb7\x7e\x3d\xd6\x4c\x2d\x60\x55\xc2\x0e\x12\x39\xf3\x62\x4e\xd6\x8d\x5b\xa7\xd2\xd0\xf0\xa3\x6a\xa1\x8e\x16\x51\x59\x0a\x0a\xa5\x9f\xc1\x2e\xd8\xad\x0c\xa3\x2b\x9e\x09\xb9\xc9\x7f\xb4\x58\x39\x9b\xfc\xac\xd2\x49\xaf\xa8\x28\xa1\x8c\x51\xc2\xc3\x55\xab\x81\xe2\x4e\xb5\xb6\xb1\xa8\xa0\xe7\x78\x34\xaa\xb5\x92\x3d\xfd\xb5\x86\x2b\xd5\x6a\x98\xd2\x24\xe3\xe8\x59\xad\xb5\x21\x7b\x79\xcb\x26\x1c\xa6\x8a\xec\x2a\x63\x14\xf1\x31\x82\xca\x4c\xce\x7c\xb9\x2e\x2a\x54\x5f\x1d\x64\x3f\xcc\x39\x4a\x05\xe3\x94\xd5\x40\x4f\xee\xbb\x95\xb5\x5f\x21\xc6\x3f\xab\xda\xaf\x3e\xbb\x40\x05\xb3\x3b\xe6\x6d\x06\x51\x3b\x3f\x93\x70\xa7\x78\x4c\x50\x5c\x99\xea\xd9\xa3\x85\xcd\x41\xf1\xc8\x43\xa5\xd1\x7f\x57\x79\x4f\xbe\x2b\x0a\x3a\x85\xfd\xdf\xcd\x9b\x26\x97\xeb\x41\x1b\x11\xa4\x81\xd0\xd9\x4c\xab\x08\xd7\x2f\xcb\x4a\x94\xef\x15\x4b\xb4\x3e\xa8\x21\xe5\x21\x47\xd1\x44\x3e\x21\xb2\x1c\x82\x57\x7e\x4d\x97\xeb\xdf\x5d\xda\x5b\xd9\xa0\x88\x0a\x5c\x54\x3d\xf3\x63\xc4\x7b\x0d\x66\x31\xc3\x9b\xf2\x7c\x9d\x00\x54\xcb\x78\x62\xcf\x76\xf9\x62\xac\x7d\x71\xf6\xbe\xd8\xef\xd2\xfd\xe8\xe5\x37\x14\xf7\x3e\xe6\x1f\x17\x7b\x63\xe8\xe6\x1f\xc9\xc2\x05\xc6\x18\xfd\x91\xb8\x15\xe1\xb2\xf0\x5c\x56\x04\x51\x50\x71\xb6\x22\xff\xb9\x7c\x1a\x4f\xe6\xbd\xa8\x05\xa1\xf1\xaa\x3b\xb0\x30\xd1\x8a\x16\x81\x27\x00\x12\x7f\x15\xe9\x26\xcb\xa4\x62\x95\xab\xb2\x1c\x00\x95\xa3\x4a\xde\xc6\x36\x99\x23\x2a\xd1\xa1\xbe\xca\x0c\x51\xa6\xb1\x34\x07\x99\xe8\xbf\x08\x7a\x73\x81\x71\x54\x2e\xf2\xbc\x72\xd1\x98\xaf\xbc\x7f\xbb\x76\xa1\xe7\x09\x1a\x67\x38\x46\x7b\xfa\xb6\x68\x67\x8a\x78\x28\x84\xbb\x2f\x14\xa6\x69\xae\xb8\xbd\x11\x80\xb9\x30\x09\xc9\xb8\xe7\x8e\xa9\xf8\xbf\x0b\x63\x94\x46\xfa\x93\x83\x53\x27\x74\x46\x09\xba\xc2\xc3\x04\x41\x47\xfa\xc0\x67\x0c\xa7\xa8\x23\x3d\x68\x45\xd0\x5c\xaa\xbd\x6f\xcc\x89\x91\x3a\x80\x64\x3c\x4c\x98\xe2\x64\xee\x60\xc2\xd1\x98\x85\x1c\x89\xbf\xa8\x83\xae\xb0\xd4\x65\x65\xd8\xc6\x28\xa1\x97\xa9\xef\xa8\xd1\xa2\x90\x38\x2c\x23\x4e\xe8\xc4\x58\x66\xad\x91\x55\x84\x10\xeb\xd0\x91\x23\xaf\x71\x09\x45\xef\x02\x47\x08\x3a\x43\xa1\xbf\x40\x27\xa2\x84\x87\x98\x20\x26\x34\x14\x27\x24\xb1\x43\x28\xe9\xd4\x4a\xcb\x98\xb2\xd4\x77\x61\x82\xc9\x79\xcf\x9d\x70\x3e\x4b\x7b\x7b\x7b\x97\x97\x97\xbe\x5c\xa0\x19\xa3\x12\xc3\x98\xee\xb9\xc5\xe5\xaf\x53\xc4\x58\x28\x4e\xe0\x66\x2c\x15\x9f\x15\xa6\x38\xa5\x89\x33\xa2\xcc\x19\x66\x38\x89\x31\x19\x43\x47\x46\x04\xc9\xbf\x04\x6c\x11\x9d\x0e\x31\x11\x93\xc7\x64\xc4\x42\xc5\xee\x33\x86\x9c\x34\x1c\xa1\x64\x2e\xeb\xa0\xd1\x08\x47\x18\x11\x9e\xcc\x1b\x81\xe5\x66\xcc\x2a\xa4\xff\x54\x27\x52\x13\x94\xcf\x4a\xc0\x52\x14\x31\xc4\x53\x67\x1a\x92\x70\x8c\xa6\x88\x70\xb1\xaa\x11\x9b\x4b\xbd\xdf\x09\xc5\x2c\x0a\x14\x0b\x68\x66\x0c\x5f\xe0\x04\x8d\x05\x1a\xa3\x08\xa5\x76\xd3\x26\xe8\x2e\x04\x18\x8d\xa8\x94\x79\xb7\x93\x66\x08\xd5\x37\x85\xc4\x18\x0b\x2d\x77\x28\xd4\x4a\xe8\x4c\xf0\x78\x22\xf0\x72\x11\xe2\x44\x26\x14\x91\x40\x89\xad\xe2\xa8\x88\x0c\x27\xbc\x0c\x05\xfe\x04\x2b\xd2\xd1\xaf\xe6\xb5\x2d\x85\x70\x15\x2b\x85\x2a\x44\xe0\x84\x11\xa3\x69\xea\xc4\x73\x12\x4e\x71\x04\xed\x31\x6b\x2b\xd3\xb8\x04\x91\x04\xb7\x8e\x7f\x19\x89\x6b\xe6\xc7\xb2\xe1\xdc\xcc\x4e\x7f\x5a\x41\x23\x6a\x46\x06\x00\x51\x10\xa3\x0b\x94\xd0\x99\x40\xb1\x63\xd9\xd5\x9b\x69\xf7\x42\x75\x9e\xcd\x84\x32\x6e\xc1\xf3\x4e\x3f\xa6\xd1\x84\x6e\xf5\xad\x06\x8f\x4c\xf0\x27\x49\x33\x46\x84\xe3\x28\x4c\x9c\x69\x18\x4d\x30\x41\x0e\x9e\x86\x63\x94\xca\x5a\x5a\x4a\x42\xce\x2c\x09\xb9\xa0\xc2\xd4\x19\x31\x3a\x15\x64\x83\xc9\x38\x11\x2b\x21\xc4\xf4\x02\xf1\xea\xf5\xf8\x26\xc0\x67\x12\x08\x85\xc4\xc1\x9a\xe3\x52\xa7\x04\xae\x72\x44\xe9\xd5\x78\xe0\xa8\x4d\x75\xc0\x1b\xce\xf2\x4e\xa5\xd0\xf4\x3c\xed\xbe\x5e\xa4\x48\x3e\xdd\x29\x58\x9e\x7a\x20\x14\x7b\x67\xba\x40\x1c\x57\x42\x3e\x9b\xa6\x0e\xba\x8a\x10\x8a\x51\x7c\x06\xc4\x70\x37\xf9\xbd\x38\xe6\x09\x5a\xb2\x62\x95\xf7\xff\x95\xfd\xa7\x33\x41\xc9\x0c\xb1\xb4\xde\xe8\xf7\x26\xf1\x28\xeb\xc1\xbd\xb2\x3c\xa5\x33\x48\xd1\x3a\x08\x8b\xdf\x52\x78\x0e\x52\x88\x6c\xd1\xbb\xc9\x1c\xd4\xc7\x90\x0c\x82\xd0\x43\x32\x0d\x66\x99\xe3\xef\xec\xd1\x82\x19\xfb\x03\x06\x42\xee\x26\xf9\x59\x5e\xf4\xa7\xfa\x5f\xd9\x5f\xba\x6d\x7f\x45\x30\xcb\x06\x80\x6a\x55\xd6\xea\x39\xd9\xa4\xe7\x0d\x40\xd6\x86\x80\x1b\x7b\xd6\xc2\xe1\x6b\x4c\xb2\x74\x7d\xae\x0f\xf7\xff\xfe\xcf\xff\xe5\x42\xb7\xa3\x9e\x1c\x7e\xf5\xe2\xfd\xe9\x7f\x7d\xfa\xf0\xe6\xc7\xd3\x93\x00\xf9\x3f\xfc\xe7\xe9\x8b\x13\xfd\xab\x62\x02\xe2\x41\xdf\x95\x78\x70\xa1\xfb\x1f\x62\xae\x6a\xc6\xee\x3f\xe4\xbf\xa7\xf2\xdf\x77\xf8\x07\x77\xd0\xaa\x76\xc2\xad\x48\x21\x31\x11\xf7\x3f\xe4\xbf\x72\x52\xee\x3f\xe4\xbf\xa7\xf2\xdf\x77\xaf\x3e\xcb\xc6\x36\x3c\xb8\x10\xf3\x74\x94\x0a\x09\x2f\xf0\x38\xe4\x94\xa9\x78\x15\x74\x7d\xed\x22\xe2\x42\x26\xc5\xc0\x1f\x09\x4f\xfc\x37\xd2\x7a\xfb\x52\x21\x88\xc0\xc5\x34\xbc\xc2\xd3\x6c\xfa\x92\x85\x12\x21\xcf\xf1\x18\xf3\xb4\xf7\x38\x07\x3a\xef\xe8\x16\x8d\x04\x6d\xd3\x7b\xcc\x8f\xc1\x1b\xbc\x13\x55\x37\x84\x4e\xdb\xd7\xe0\x2a\x7a\x7c\x64\xa7\xbc\x30\x15\x1b\xfc\x1d\x4f\xac\x8a\x4f\x8a\x8a\xcb\x69\x58\x0f\x9f\x5a\x15\x9f\x9a\x8a\x2d\xd6\x6e\x77\x54\x1e\x14\x13\x88\x29\x53\x1d\xe2\x22\xb7\xa1\xfd\x01\x00\x48\x96\xea\x93\x6a\x7d\xa1\x4b\x97\x9f\x76\xf7\x41\x19\x18\x89\xbe\xeb\xb6\x92\x76\xdb\x43\x7f\x0d\x3a\xfb\x40\xe7\xcf\xef\x2a\x3f\x0c\x3a\x0c\x78\xbb\x4d\x8b\x98\xaf\xce\xfe\x01\x40\x7b\x01\x87\x74\x77\xd7\xd8\x9f\xca\xb6\xb0\x8f\x20\xee\xd3\xc1\x20\x2f\x03\xc8\xc2\x87\x49\x68\xd2\xb8\x60\x0d\xeb\xd0\xb8\x60\x06\x72\xea\x21\xa8\x5e\x1a\x91\x26\xd2\xf2\xfe\x71\xfa\x05\xa9\xec\x56\x40\xa3\x27\x10\xcb\xfc\x0a\xeb\xf8\xa9\x0a\x65\xf8\x4a\x04\x07\xde\x24\x34\x70\xef\xec\xe7\x10\x0b\xb9\x53\x09\x0c\x37\xc9\x09\x0d\xe1\x16\xb0\x3f\xa8\x38\x5f\x38\x9b\xab\x5b\x0b\xc1\xfa\x66\x3c\x88\x69\x24\x71\xac\x5c\x82\x27\x48\xa5\xf5\xf1\xbe\x11\xea\x68\x5f\x88\x91\x81\xfb\xcd\x2e\xda\xfd\xc6\x1d\x7c\x03\xfc\x31\xe2\xcf\xb8\x96\x92\x3d\x37\x52\xc9\x6d\x5d\x00\x71\xb0\x30\x39\x88\x2c\x75\x5f\x69\xe6\x1f\xde\xff\x78\x4c\xa7\x33\x4a\x10\xe1\xf2\xa5\x87\x5a\xf6\xd4\x1a\xc2\xf1\x6a\x84\xe3\xd2\x89\x5b\xbf\x10\xf0\x8d\x7c\x67\x57\x5e\x86\x63\x28\x34\x32\xbf\x12\x4b\xc5\x4c\x1c\x1e\x8e\x9d\x4b\xcc\x27\x8e\x98\x92\xa3\xa7\xe4\x7f\xa3\x30\xac\x23\x44\x4f\x51\xca\xd3\xeb\x6b\x86\x7e\xcd\x30\xb3\x11\x1e\xce\x66\x32\x9b\x56\xe5\x6d\xc5\x45\xcd\x39\x29\x44\x21\x95\x9b\xe9\x24\x42\x24\x64\x98\xf6\xdc\x74\x1a\x26\xc9\xb1\x52\x90\x5d\xfd\xf5\x67\xcc\x27\x6f\xcc\x5d\x75\xab\x95\x28\x3f\xa5\xe7\x88\xd4\xca\xde\xcb\x4b\xec\xb2\x30\x9d\xd0\xcb\x13\x4e\xd9\x7c\x48\xe9\xf9\x4f\x42\x9a\xde\xd9\xcf\x41\xeb\xff\x05\x00\x00\xff\xff\x0d\x7b\x6b\xdc\x0f\x26\x14\x00")
+var _distAssetsNomadUiB06790dbfc5c3ebfedc4382c3dbae114Js = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\xfb\x76\xdb\x36\xf6\x28\x8e\xff\xef\xa7\x50\x78\x32\x3e\xc4\x04\x92\x2d\xe7\x32\xad\x66\x58\x37\xb7\x4e\x33\x9f\xa4\xc9\xc4\xe9\xe7\x33\x73\x34\x5e\x35\x44\x42\x12\x12\x8a\x60\x49\xd0\xb6\x22\x73\xad\xf3\x1a\xbf\x17\xf8\x3d\xd8\x79\x92\xef\xc2\x95\x20\x48\xea\x62\x3b\x6d\xd3\xa6\x6b\xb5\xb5\x08\x60\x03\xd8\x00\x36\xf6\xde\xd8\x17\xaf\xc8\x71\x2f\x67\x19\x09\x99\xb7\x17\xe1\x29\x49\xb0\xef\x25\x74\x81\xa2\x7e\x41\x0e\xd0\x84\xc4\x84\x11\x9c\x1f\xa0\x49\xce\x32\x14\x32\x0f\x8e\x3d\x7c\x99\xd2\x8c\xe5\x1e\xf4\xf0\x62\x82\xb3\x7e\x88\x12\x0f\x7a\xdf\x8a\x1f\x07\x39\xce\xce\x49\x88\xab\x0f\x74\xf2\x1e\xf3\x76\xf5\xdf\x07\x21\x5d\xa4\x05\xc3\x91\x77\x0a\xfd\x69\x91\x84\x8c\xd0\xc4\xc7\x90\x41\x02\x13\x98\x81\xd5\x39\xca\x7a\x31\xa4\x10\xc1\x1c\x16\x30\x84\x11\x4c\xe1\x02\x4e\xf6\x74\xdd\xde\x54\xd7\x06\x2b\xb2\xbf\xff\x5a\x40\x1d\xc8\x19\xbc\xc9\x68\x8a\x33\xb6\x14\x35\x56\x38\x29\x16\x38\x43\x93\x18\x8f\xc8\xa0\xfa\x01\x43\x9a\x4c\xc9\xac\xd0\x25\xf6\x4f\x78\x91\x11\xa6\xbe\xeb\x3f\xe1\x39\x8a\x0b\xfe\x81\x24\x84\x11\x14\x93\x8f\x38\x3b\xae\xfd\x1a\x84\x28\x8e\xfd\x04\x8c\xce\x29\x89\x7a\x87\x25\x28\xcd\x60\xe7\x8d\xa9\x05\xab\x72\x2f\xc3\xac\xc8\x92\x9e\x1a\xfb\x07\xbc\xcc\xfd\x04\x0c\xa6\x34\x7b\x8e\xc2\xb9\x6f\xa1\x05\xac\xe2\x31\x3e\x0d\x92\x31\x3e\x2d\x01\x80\xb1\x35\x8d\xe0\xce\x1d\xfb\x27\x8c\x6b\x13\x11\xa5\xb5\x99\xf9\x9e\x98\x87\x47\x92\x5e\x7c\x75\x15\xdb\xe3\x07\xfb\xfb\x7e\x6c\xe6\x1b\xdc\x39\x04\x30\x0e\xc8\x20\x8f\x49\x88\x7d\x30\xc8\xf0\x39\xce\x72\xf9\x57\x54\x84\xd8\x1a\xa0\x58\x05\x35\x1b\xb5\x8a\xe0\xea\x8a\x94\x00\xc6\x00\x66\xfb\xfb\x12\x21\x77\x82\xa0\xd6\x9f\xe8\x4e\x8c\xa6\xfe\xfd\x38\x6e\x62\x35\xd3\x58\x85\xb5\xc2\x40\x7e\x04\x50\xfe\x3f\x68\xf6\xd0\xbd\x31\x62\x3e\xbd\xa4\x88\xf9\xff\xcb\xae\x6a\xde\x4f\x3f\xe1\xfc\x15\x8d\x8a\x18\x7b\x70\x25\xb7\xc0\x9d\xc3\x12\x40\xcc\xeb\xa2\x22\x66\x6a\x08\x7b\x31\x66\xbd\x59\xe0\xc7\x81\x7f\x08\xb3\x41\x42\x19\xf0\x3d\x46\x3f\xe0\x64\x80\xc2\xf8\x79\xc2\x51\x1a\x79\x00\x52\x59\x8e\x7f\x2e\x50\x6c\x6a\xe4\x38\x9e\xbe\x13\x7f\xb1\x65\xca\xcf\xce\x02\x25\x68\x86\x17\x38\x61\x1e\x80\x88\x37\x49\x06\xfa\xc4\x00\xdf\xfb\x29\x41\x0b\x9c\xa7\x48\x9c\x33\x07\xc4\x1b\x1a\x93\x90\xe0\x7c\x30\x3e\xf5\x00\xcc\x1b\x6d\xd7\x56\x2f\x1a\xd5\xf3\x65\xce\xf0\x62\x30\xc5\x88\x15\x99\xae\x16\x06\x61\x8c\xf2\xbc\x87\x2f\x19\x4e\xa2\xbc\xc7\x06\x8f\x05\xa5\x58\xae\x42\x9a\xe4\x2c\x2b\x42\x46\x33\x5f\xee\x74\xb1\x1b\xf6\xf2\x22\xc5\x99\x3f\x18\x0c\x50\x36\x2b\xf8\xbc\x72\x00\xa7\x3e\x9b\x93\x1c\xaa\x2e\x3c\x18\x41\xfe\xbb\xfa\x2e\x46\xea\xc1\xd4\xf9\x3c\x59\xa6\x28\xcf\x1f\x17\x6c\x4e\x33\xf2\x11\xf1\x0d\xe8\xc1\x85\x53\xc9\xcc\xef\x45\xfe\xaa\xc2\x25\x9c\xa8\x6a\x24\xf0\xd4\xf2\x79\xd0\x67\x81\x57\xe1\x13\x90\xc4\xc7\x81\xa8\x75\xbc\x86\xa8\x28\x62\x00\x2d\xe2\x72\xe7\xb0\x4e\x52\xee\x1c\x56\x64\x84\x6f\x99\x11\x1e\xb3\xd3\x80\x94\x33\xcc\x7a\xd5\x02\xfa\xe6\xe0\xf0\x3e\x07\xe6\xfb\xb1\xc7\xa9\x72\x32\xf3\x82\x80\xef\x09\x3a\x75\xcb\xeb\x3f\x47\x62\xdd\x66\x98\x01\xbf\x5e\x00\xc5\xdc\x3c\x30\x32\x13\x16\x03\xc8\x8a\x18\xe7\xdf\xd1\xec\x07\x6b\x1c\x7c\x07\xcb\xa9\x0f\xaa\xf1\x29\x22\x25\xa1\xce\x30\xeb\xdc\x40\x1e\xb8\xba\x1a\x9f\x82\x01\xa3\x8f\xb3\x0c\x2d\x2d\x32\xe1\x73\x72\x10\x7c\x23\xe0\x67\x41\x35\x50\x02\x3d\x31\x8c\x7f\x9c\xbc\xfe\x61\x60\x06\xa2\x00\xc1\x58\x8d\x64\x4a\x92\xe8\x15\x62\xe1\x9c\x24\xb3\x6a\xb4\x19\xc4\x40\xd3\xcf\x78\x7f\x9f\x0d\xd2\x22\x9f\xfb\xd9\x80\xd7\xf6\x7d\x1c\x7c\x83\x05\x44\x4e\x10\x00\x00\x90\x95\x00\x8e\x4f\x81\x98\x7a\x88\x52\x73\xaf\x7d\x47\xb3\xc7\x71\x5c\xf5\x6d\x56\xe3\x46\xf3\xc5\x90\x81\xe0\x1b\xdf\xb7\xd6\x64\xdd\x54\x2d\x92\xcf\x24\x9a\x56\x4f\xad\x31\x8e\x48\x19\xb0\x3d\x1c\x60\x4e\xc8\x43\xc4\x7c\x02\xf8\x25\x80\x81\x9c\x92\x59\xa9\x17\x49\x18\x17\x11\xce\x4d\xdb\x25\xbf\x38\xec\xcd\xd5\x58\xf4\x41\x4e\x17\x58\xf4\x5a\x1f\xab\xdd\xbd\x1e\x23\x51\xe0\x7d\x0c\x80\x44\xa4\xa6\x09\xce\x16\x76\x28\x46\xa9\xfe\x78\x91\xbf\xc9\x70\x8e\x13\xe6\x8e\xca\x90\x16\xab\x87\xb2\x63\xd9\x39\x66\xc5\x3e\x22\x01\x1e\x2c\x50\xfa\x64\xe9\x7b\x3f\x88\xfd\xbd\x47\xa6\x3e\xa9\x40\x30\x00\x74\x1f\x82\x32\x27\x01\x19\x4c\x49\xcc\x70\xa6\x76\x87\xa9\xe9\xfd\xd9\x03\xa0\xb6\x78\x66\xb3\x26\x41\x82\x2f\x7a\x6f\xf1\xec\xf9\x65\xea\x93\x41\x86\xd3\x98\x0f\xe2\xe0\x3f\x7f\x3e\x98\x41\x6f\xc0\x1b\xc2\x2c\x60\x83\x18\x27\x33\x36\xef\x13\xf5\x87\xde\x97\xd9\xdf\xf0\x60\x41\x73\xa6\xa7\xf1\x74\x8e\x38\x0b\x85\xb3\x67\x64\x3a\xc5\x19\x4e\x42\xcc\x77\xee\x82\x17\xfb\x09\x38\x5e\xd9\x95\xcd\x9c\xf9\x1f\x23\x02\x37\x00\x1a\x65\xe5\x08\x97\x00\xae\x81\xc1\xaf\xba\x8d\x60\x7e\x28\x38\x93\x36\x78\xf5\xf8\x5f\x3f\x9d\x3c\xfe\xee\xf9\x4f\x2f\x7e\x78\xf7\xfc\xef\xcf\xdf\x96\x60\xd0\x09\x58\x4f\x37\xb9\xba\xb2\x57\xc0\xd0\x1b\x70\x6c\xfe\x54\x77\x38\x28\x4b\x18\x05\x73\x3f\x1c\xa4\x19\x65\x94\xd3\xb7\xea\x16\x18\x73\x18\x9c\xee\x9e\xc2\x95\x4b\x4f\xeb\xd4\xd6\xa2\xae\xd0\xba\xf4\xc5\x44\x4b\x00\x53\xb7\x07\x75\x9f\xdc\x5a\x07\x0b\xb7\x83\xd6\x9b\x69\x1c\xdf\xb4\x9f\x49\x03\x55\xed\x97\xdb\x98\xde\xb4\x27\xa7\x9f\x06\xbd\xf0\xe0\x18\x9d\x42\x75\x2d\xce\x30\x7b\x7d\x91\xe8\x6b\xf1\x19\xce\xc3\x8c\xa4\xfc\xde\xdf\x00\x03\x40\xab\x42\xa3\xcf\x75\xd4\xd9\x83\xe3\x7c\xc7\xee\xd7\x82\x5b\x3f\x12\x4d\x97\x3c\x38\x2e\x76\xec\xd5\x34\x75\x7a\x08\xc1\x5e\xc5\x37\xce\x38\x15\x5f\x27\x72\xcd\xe4\xaa\x5a\xf2\xd6\x5a\xc1\xec\x06\x02\x97\xe4\xd4\x32\x28\x04\xae\x4a\xc4\xca\xbf\x48\x2d\x7f\x04\xa9\xa5\x08\x7c\xc5\x96\xd1\x0c\xf8\xed\x54\xac\x8b\xe6\x78\xa9\x62\x87\x14\xf7\xf1\x98\x6f\xda\xb7\x18\x45\xaf\xb3\xff\xc9\x08\xe3\xa7\x5d\x48\x44\x64\x6b\x11\x84\x36\x64\x0b\x35\xe4\x2e\xd9\x02\x26\xad\xd2\x85\xe4\x64\x21\x0b\xbc\x10\x25\x7c\x44\x1e\x4c\xe4\x27\x9f\x04\x08\xfc\x56\x55\x06\x9c\xb1\xda\x80\xd3\x8a\x49\x15\x88\x35\x4c\x7f\xa7\x28\xd8\x64\x55\x17\x28\x15\x7c\x50\x05\x00\xdb\x1c\xaa\xe8\x71\x20\x9a\x2f\x05\x77\xc4\x17\x0f\x85\xcc\x07\x8a\x63\xc4\xc1\x37\x5e\xc6\x71\x1a\x04\x01\xbe\xba\xf2\x2e\xc4\x5a\xf3\x1f\x80\x5f\xee\x28\xc8\x7d\x5a\x27\xc3\x6a\x09\xc6\xd9\x4d\xef\x28\x07\xf2\xa6\xfd\x27\xee\xdf\x4d\xc4\x7b\x27\x88\x00\x52\x9b\xa6\x53\x9b\xa6\x17\x9b\x68\x7a\x1c\xd3\x50\x33\x06\x5f\x08\xfb\x17\xc2\xfe\xdb\x27\xec\x27\x45\xca\x77\xe9\xf3\x4b\x1c\xb6\x12\xf3\xa6\x50\xf9\x2d\x46\xe1\x7c\x10\xd6\x64\xc8\x4f\x43\xd6\xc5\xa0\x3e\x3b\xb2\x6e\x61\xd4\xdf\x4e\x40\xc7\x52\x40\xaf\x48\xf5\x5a\x01\xdd\x13\x54\xa6\x8f\xc5\x8a\x75\xd2\x63\x89\xbb\x4f\x46\x8f\xed\x6d\x73\x7d\x1a\x5c\xdf\x7c\xd7\xa7\xbb\x61\x4c\x7e\x1d\x66\x5a\xbe\x5e\x54\x94\x37\xfa\x9c\x5e\x2d\xd2\x2f\xd7\xc4\x1f\xe1\x9a\x58\xdc\x22\xff\xff\x03\x8d\xb0\xe0\xf4\xd4\x55\x71\x5b\x30\x0d\xeb\xb5\x9b\x30\x81\x76\xab\x9e\x6f\x79\x49\xb5\x5d\x4c\x91\xe2\xc1\x0d\xab\x5b\xa8\xb7\x06\xab\x40\xb1\xa4\xa1\x2c\x69\xe3\xf5\x35\xfe\xaa\x8b\x61\xb2\x8d\x2a\x1a\x8e\x25\x3b\x0e\x15\x27\x7e\xda\x09\xbc\x2e\x41\x6c\x0d\xdd\x80\x2d\x61\x11\xa4\x7e\xfe\x89\x98\xfb\xb0\x05\xb6\xc5\xc7\xdf\x50\x21\x58\x07\xdd\xb5\x73\x85\x1e\x6d\xd3\x6d\xb5\x15\x24\x00\x73\xfb\xc6\xda\xdc\xbf\x9e\xea\x16\x4a\xb6\xed\x40\x39\x23\xc8\x41\x75\x13\x4d\xcc\x8b\x8f\xd9\xc4\x4a\x7f\xfd\xcd\xa1\x45\xfb\x4c\xe1\xf8\xf0\xf4\xd8\xfe\x31\x1a\x9f\x42\xd6\x6c\x3b\x6c\x6d\x3b\xb4\xdb\x0e\x79\xdb\x3d\x71\xa2\x7a\x49\x80\xb7\x17\x4b\xf9\xbc\x5a\xa5\x52\xa3\x82\xae\xf8\x25\xe6\x3c\x58\x54\x94\x6f\xb1\x81\x57\x78\x4f\x27\xbf\x1a\xa3\xa0\xcd\x1c\xe0\x14\xce\xab\xa5\x9a\x7d\x4e\x4c\xc3\xf2\x0b\xd3\xf0\x47\x60\x1a\xce\x6f\x51\xb6\x7c\x5b\x24\x09\x49\x66\x37\xe2\x19\xf2\x14\x87\x64\x4a\x42\x23\x3a\x29\xd8\xb9\x06\xde\xe8\xf5\x24\x44\xb1\xec\x95\x5e\xb3\x57\x63\x9a\x71\x73\x14\x3c\x23\x79\xaa\x1e\xd7\xb4\xd5\xc6\xf6\x6c\x4b\x71\x5d\xa1\x3c\xbc\x6e\xc3\xe8\xba\x0d\xd3\x1b\x70\x58\x33\x8b\xc3\x2a\x2c\x9b\x0f\xeb\x3b\x5f\x53\x5c\x99\x79\x58\x25\x2f\x49\xce\x1e\xc7\xb1\x07\xa7\xcd\x32\x8d\x7c\x0f\xce\x15\x67\x26\x56\x67\x59\x3d\x15\xa9\x8b\xf5\x0d\xce\x16\x24\xcf\x09\x4d\xf2\xee\xdb\x73\xeb\x1b\x50\x29\x71\xaf\x7d\xfd\xee\xa0\xd0\xb5\x1f\xbd\x00\x18\x4c\x63\xc4\x74\x23\x43\xd9\x6e\xc8\x0e\x54\x44\x1e\x0f\x6c\xf5\x44\x59\xf5\xe7\x6a\x91\x59\xed\x21\x9e\x69\xbb\x82\x76\xea\xe0\xa8\x4a\xb6\x58\x21\x51\xaf\xe3\xe0\xc0\xb1\x97\x17\x93\x05\x61\x7d\x7e\xdd\x2b\x76\x79\x13\x0d\xe9\xb2\xd5\x69\xb1\xbc\xb0\xa1\xb7\xce\x4a\x51\x9f\x9d\x40\xf2\xcd\xdd\x0d\xd1\x22\x21\xbb\x40\x8d\x54\x33\x05\xb8\x84\x8b\x60\xe9\xa7\x2e\x7f\xcf\xcf\xdb\xcd\xd9\xfb\x49\x0b\x68\x75\x64\x6f\xce\xde\x4f\x5b\x80\x9b\x53\x7f\x0b\x6f\xe3\x2d\xe0\x2b\xc2\xc1\x59\xf6\x9b\xc1\x77\xa0\x77\x5c\x91\x5b\xbd\x80\x6f\x03\x08\xc0\xd4\x96\x0c\x9c\xde\x37\xdf\xa6\xdb\xbc\x89\xef\x06\x72\xfd\x88\x3a\x2e\x6f\x38\x0e\x6f\x86\x8f\x8a\x0b\xd8\xa1\x77\xfb\xb6\x86\xe3\xe8\x66\x23\xa8\x5f\xfd\xb5\x51\xa4\xb6\x8e\xf3\x7c\x83\xdc\x92\xe1\x90\x2e\x16\x38\x89\x7e\xad\xf7\xa5\x2f\xba\xce\x2f\x62\xcb\x6f\x5d\x6c\xa9\x74\x9d\x28\xe1\x6c\x6b\xb4\x4c\xd0\x82\x84\x8f\xd3\x34\x26\xf2\x61\xf6\x84\x7c\x24\xc9\xcc\x58\x2b\x7a\xd0\x9b\xa3\xdc\x62\x2b\x6e\x45\xb3\xa9\x8e\xfe\xe3\x30\xc4\x29\x23\xc9\xec\x75\xf2\x38\x59\xda\x26\x52\x4d\x3d\xe7\x3a\x4b\xa6\x2e\x65\x67\xdd\x6a\xfb\x96\xb4\x9b\x72\xd0\x4d\xfd\xa6\x83\xa6\x56\x2d\xe7\xfa\x79\x3b\x6c\xcb\xda\x19\x57\xaf\x5d\x0d\x4e\x6b\xe3\x9a\xfa\xad\x06\xa8\x55\xb1\xf7\x4c\x42\xe8\x59\x20\x7a\x12\x86\xd7\xa5\x01\xd5\x58\xf9\x04\x3a\x50\x17\xb1\x9f\x4c\x13\xba\x61\x57\x5e\x5f\x31\xba\x71\xbb\xaf\xd3\x93\x6e\x71\x44\x77\x56\x98\x6e\x86\xd9\xd4\x9c\x6e\xd4\x20\x46\x28\x65\x38\xcb\x0f\xfa\xef\x73\x9a\xf4\x51\x4a\xea\x77\xb0\xbc\x55\xfb\x11\x62\x48\xd7\x3d\x30\x35\x9d\xbb\x15\xac\x76\x26\x77\x9d\x0d\x8c\xa3\xc3\xaa\xbe\x47\x66\x98\x8d\x2c\xe1\x4f\x9f\x08\x3d\xcb\xb2\x04\xeb\xa7\xb9\xd6\x3e\xd1\x54\xaa\x30\x7c\x0b\x73\x6c\x90\x74\x49\xd0\xc8\xf6\x56\x05\xad\x36\x05\x24\xf0\x41\xf0\x8d\x27\x26\x74\xb0\x10\xcb\x94\x4b\xbf\x90\x14\xb1\xf9\x77\x34\x7b\xb7\x4c\x7f\x09\xcf\x90\x22\x8b\xbf\xa3\xd9\x77\x24\x89\xde\xe2\x90\x66\x91\x0f\xe4\x34\xc6\x70\x30\x18\xe0\xd3\x4a\xf8\xde\xb3\xc9\x57\xd5\xea\x71\x1c\xf3\x99\x61\x50\x5a\xea\x6e\xb2\x61\x15\x37\x5a\x24\xe9\x9a\x17\x9c\x49\xe5\x63\xb6\x4b\x0b\x46\xe2\xfc\x00\x45\x51\x9f\xd1\x3e\xc7\x56\x93\x4b\xbc\xbd\x75\x4e\xb6\x5e\xe7\x4d\xb6\x23\x39\xa3\xa9\x07\x93\xa0\xc6\xc0\x61\xd6\xbb\xf6\x83\x86\xf7\xe6\xf5\xc9\x3b\x4f\xaf\x8b\x01\x9b\xa8\x15\x94\x7e\x2f\x44\x8f\x5a\x39\xe9\x34\xd6\x3b\x19\x90\x08\x7a\xd6\x92\x00\xcb\xcd\x45\x34\x41\xef\xd1\xa5\x9f\x41\x06\xca\xd2\xf7\x0e\xc4\x34\x00\x64\x3d\x92\xf4\xf0\xe6\x4d\x99\xec\xbe\x29\x93\x32\xc3\x39\x43\x19\x93\x27\x56\x4e\x86\x04\x67\x77\x57\x67\x77\x57\x62\x44\x73\x9a\xb3\xab\x2b\xef\xc0\x2b\xd5\x87\x22\x8b\xdf\x64\x78\x4a\x2e\x7d\x50\x9e\x95\xca\xf4\xc2\xda\x67\x07\x77\x57\x78\x40\xa2\xf2\x40\x41\x3e\x6b\x4e\x90\x40\xef\xcd\x8f\xef\x3c\xb8\xe2\xc4\x72\xc4\xf6\xf7\x57\xef\x50\xfe\x41\x78\x31\x08\xba\x14\xe7\x72\x38\x76\x43\xe5\x6b\xa7\x18\x31\x1c\xbd\xc5\x3f\x17\x38\x67\xfe\xd9\xc1\xf9\x50\x0f\x62\x9a\x1f\xc4\xb9\xee\xff\x98\x6f\xd7\xe0\xee\x0a\x27\x21\x8d\xf0\x8f\x6f\x5f\x3c\xa5\x8b\x94\x26\x9c\x01\x60\xa0\x3c\x03\x03\x36\xc7\x89\x9f\x81\x32\x67\x88\x5d\xbb\x3f\xde\x78\xe7\x1e\x4b\x94\x2f\x93\xd0\x6c\xa3\x5e\xc6\xf7\x27\x99\xfa\x78\x40\x3f\x00\xa3\x65\xe3\x97\x87\x0f\xf6\xd4\xa2\xb0\x00\x5d\x20\xc2\x7a\x78\xc0\xf0\x25\xf3\xc1\x1e\x9b\x67\xf4\x62\xc5\x7b\x1a\xe1\x01\x1f\x46\x91\x43\x46\x4f\x84\x57\xd9\x88\x13\x3c\x56\xda\x74\x22\xd9\x40\x27\x2c\x42\xde\x72\xad\x6d\xf6\xfb\x55\xee\x6c\xed\xf7\x20\xdf\x0a\x4d\xb2\xc2\xc7\x9e\xf7\xa7\x34\xeb\xe3\x2c\xa3\x59\xb3\x42\x86\x17\xf4\x1c\xf7\x33\x71\x7a\x9a\xc5\x09\xed\xc7\x18\x45\x58\xb7\x6f\x75\x35\x96\xb2\xab\x24\x1d\xea\x0d\x6e\xaf\x29\x15\x7e\x0e\x22\xec\xe2\x8b\x08\xfb\xbb\x15\x61\x71\xa5\xc4\xd5\x77\xa2\xfd\xc9\x3b\x1f\x7a\x42\xbe\x9d\x04\x7e\xf7\xe3\x51\x98\x61\x26\x9e\x8b\xea\x72\x60\x76\x4d\xa6\x89\x77\xfa\x4b\x7b\xcf\xc2\xd4\x71\x1a\x56\x52\xa6\xf9\xae\x9c\xbc\x22\x4b\xf8\x9c\x0b\x1a\x90\x6b\x6e\x4a\xfb\xb8\xd6\x6c\x5e\x24\x6a\xf6\x38\x8d\x55\x04\x76\xe5\xfd\xab\xff\x83\xa0\x27\x42\x90\xf7\x46\xb8\x2c\xe7\x28\x89\x62\xfc\x16\xe7\x29\x4d\x72\xac\xd9\x1b\xb5\x27\x1f\x1e\xf2\xad\x81\xf7\xf7\x49\x10\x04\x68\xf0\xc3\xeb\x9f\x5e\x3e\x7f\xfc\xec\xf9\xdb\xe3\x04\x5f\xf4\x90\xc6\xf1\x48\xe0\x72\xe0\x40\xaa\xa1\xb6\x9c\x2a\x5e\xce\x80\x96\x6d\xa6\x15\x8b\x57\x55\x1e\x84\xc2\x7d\xd0\xc7\xc1\x37\xfc\x86\xf0\xf9\xde\x35\x5c\x06\xb6\xad\x42\x1f\x1e\x0e\x3d\xed\x15\x39\x3e\x95\xd7\x43\x0f\x97\x00\x94\xfc\xce\x7d\x9d\x32\xf1\x68\x62\x79\x58\x36\x58\xa1\xa3\x56\x56\xe8\xc8\x66\x85\x8e\xc4\x43\x90\xf0\xc5\xe4\x04\x5e\xb8\x04\xf2\x3f\x82\x55\x09\x60\x85\x76\xe5\x23\x9a\xcf\x69\x11\x47\xea\x55\xe2\x2d\x9e\x09\x96\x07\x98\x0b\xad\x51\x1f\x85\x8c\x9c\x9b\x8a\x7b\x6c\x7f\xdf\xc7\x41\x5d\xa6\x90\xf3\xeb\x0f\xef\x04\x01\x1e\x90\x24\xc2\x97\xaf\xa7\xbe\x77\xec\x81\xe3\xb3\xbb\x2b\x5c\xee\x67\xa2\x71\x70\x77\xc5\xca\xb3\x91\xf8\x74\x6c\x7f\x2a\x05\x14\x50\xd6\x10\xef\xe0\x07\x12\xb9\x44\xdf\xa3\xfc\x15\x4a\x96\xd5\x15\xd1\x58\x2d\x5d\xa3\xbe\x62\xe2\x96\xf7\x49\xf0\x8d\xe1\x0d\xa5\xdf\x3f\x8c\x03\x36\x90\x77\xd9\x80\x24\x82\x0e\x7e\x47\x33\x3f\xe1\x44\xdb\x76\x76\xc6\x83\x14\xe3\x0f\x8f\x05\xc1\xaa\x3b\xb5\x72\x5c\x9d\xdd\x5d\xc5\x82\x32\x94\x03\x12\x9d\x81\x20\x08\xd8\x80\x44\xc0\x71\x32\xf6\x0f\x21\xb5\xf6\x09\x67\x28\x01\x80\x5c\x56\x68\x4a\x21\xd5\x96\x80\x59\x50\x79\x66\x73\xc6\x0f\xd2\xc0\xe5\xf9\x0c\x37\xb7\xbf\xef\x13\x15\x4e\x00\x2d\x30\x27\x95\xc0\x67\x00\x92\xfd\xfd\x4c\x7a\x6b\x13\x00\x20\x36\xbf\x5a\x98\x22\x0c\x00\xa4\xbc\x42\x91\xe4\x73\x32\x65\x3e\x05\x30\x0b\xb2\xc1\x7b\x4a\x12\xdf\x3b\xf0\x00\xbc\x13\xef\xef\x67\xfb\xfb\xde\x81\x77\x27\x08\xb2\x41\x38\x47\xd9\x63\xe6\x1f\xf2\x4b\x26\x0b\xbc\x03\xef\x5e\x06\x60\xa6\x66\xf4\x63\x1a\x21\x86\x8d\x64\xd5\x2e\x42\xa9\xe2\xfa\x79\x2c\x61\x18\x2c\xfc\xa2\xd5\x5b\x95\xdd\x92\x33\x69\xe4\xf6\xa0\xbd\x55\x6f\xab\x03\x07\xbc\x22\x8a\xdb\x3d\x28\xb5\xb6\x04\xb0\xb0\x35\x24\x85\xad\x21\x99\xac\x67\x26\x23\x9c\xc6\x74\xb9\xd8\x42\x7f\x50\x09\x9d\xbf\xa8\xf6\x60\x8a\x48\xcc\x39\x22\x4d\x89\xe4\xd1\xf2\x48\xe4\xf1\x8b\x2f\xe9\x10\xdf\x18\xf4\xac\x99\x01\xe8\x1d\x70\x38\x5e\x8b\x04\xc7\x05\x1c\x2e\x30\x2a\x09\x67\xf5\xcc\x34\x7b\x11\x49\x11\x27\xcd\xe8\x82\x32\x7c\x1b\x83\x50\xa0\x76\x1f\x07\x7c\x1c\xc7\x1c\x75\x25\x28\x2b\x2e\xf3\x16\x64\x65\x4f\x1a\xff\x8d\x09\x4c\x4e\x03\x3c\xc8\xd3\x98\x30\x41\xa3\x61\xc6\x59\x41\xf9\xf3\x40\x28\xda\xb3\x41\x4a\x53\x1f\x08\xde\x86\x72\xb1\xd3\x3a\xfd\x5c\xe0\x2c\x0f\xee\xae\xe2\xd2\x88\x90\xc9\xfe\xbe\x4f\xef\x05\x67\xc7\x77\x57\x49\x79\x06\x20\xdd\x5e\x11\x82\xf9\x4e\xd9\x4a\x11\xf2\xab\xe9\xb4\x9a\xec\x47\x25\x91\x6f\x66\x2b\x34\x8e\xc8\x60\x81\xf9\x85\x9c\xe0\x4b\x26\x58\x9b\x11\x1b\x7b\x97\x7d\x39\x4f\xfe\x51\x52\x9e\xd3\x12\xb6\x68\xa4\x14\xcb\xc3\x59\xc3\x64\x4f\x5f\x5f\x64\x80\x18\xcb\x7c\x9b\x0f\xbc\xba\xaa\xf4\x8e\x31\x5f\x37\x39\xbe\x0d\x84\xf6\xb8\xe2\x68\xef\xae\x32\x6b\x59\x8b\x38\xbe\x13\x04\x7e\xc2\xbb\x92\xcb\xa0\xee\x63\x60\xed\xb8\x64\x7f\x3f\x19\x64\x38\x46\x0c\x47\xfc\xb6\x8f\xf9\x6d\x2f\x7e\x05\x2c\x2b\xf0\xd9\x28\xde\x41\x2f\xf6\x9e\x4e\xfa\xb9\x32\x4d\xd8\x8e\x42\xf5\xcd\xe0\xfb\x24\xca\x7f\xd9\x9d\xd1\xb5\x4e\x35\x8e\xa4\xa5\x92\x27\x8c\x5d\x09\x94\xb6\x25\xde\x2e\x8a\x43\x81\xa0\x62\xb1\x40\xd9\xf2\x0f\x82\x22\x35\xd9\x5d\x91\xc4\x19\xb9\x1d\xa9\xca\x6f\x49\xc1\x2a\x24\x72\xf6\x8e\xda\x37\x91\x8c\xf3\xc2\x68\x86\xf5\x71\xe4\x8c\xaa\xc0\x14\x80\x89\xab\xea\x6c\xc1\xaa\xbc\xc9\xde\xd3\xc9\x40\xdc\x66\xaa\xa5\x77\x20\x3b\xf3\x00\x1c\x67\xa7\x81\xb0\x5c\x4b\x51\xc6\x49\x5d\xbd\x41\xcb\x4d\x96\x38\x37\xd9\x3f\xe8\xe4\xc5\xb3\x51\x06\xff\x41\x27\xff\x2d\x17\x60\x84\x07\x89\x88\x6e\x22\xee\xb3\xad\x15\x5f\x6b\xcc\xc1\x37\xed\xef\xb5\xcb\xd8\x28\x94\x0c\x70\xbb\x95\xc5\x6d\x2d\x70\x76\xe3\x97\x92\x95\x3a\x06\x23\xef\x40\x1f\x88\x52\x28\x01\x04\xa9\xe5\x24\x79\x4e\xd2\xef\x50\x1c\x4f\x50\xf8\xe1\x25\x49\x3e\xe4\xbf\xc0\xc3\xc9\x14\xb3\x70\xfe\x16\x5d\x3c\xe3\x60\x89\x56\x67\xd5\x76\x6b\xd7\x1e\xb4\xf6\x5f\x73\x53\x31\xe8\xfd\xfd\xf9\x3b\x0f\x94\x53\x9a\x85\xf8\x0d\xce\x08\x8d\x48\x68\x94\xb1\x02\x40\xaa\xbe\xda\x82\xeb\x36\xba\xfe\x66\xff\x9c\x55\x53\xc0\x0e\x44\x87\x1d\x43\x12\xfb\x1c\x94\x65\xce\x68\x7a\x6b\xf3\x7c\xf6\xfc\xe5\xf3\x77\xcf\x3d\x50\xaa\x03\xb7\xe5\x64\xb8\x14\x5a\x8d\x9e\x37\xb5\xee\xf0\x3f\xaf\x9b\x80\x75\x50\xbf\x7f\xfa\x72\x84\xe1\x53\x94\xd0\x84\x84\x42\x6a\x51\x5c\x67\x1a\xa3\xa4\x83\x03\xbe\xba\x52\x3f\x7e\x22\xd1\x13\x3c\xa5\x19\x3e\x41\xe7\xd2\x84\x2a\xb1\xe8\x13\xdc\xee\xe1\x85\x59\x4b\x10\xa3\xa4\x6d\xdc\x59\x73\xdc\x23\x3d\x84\x04\x5b\x5b\x8f\x93\x2d\x0f\xc0\x67\x64\x3a\x95\xd3\x50\x02\x3f\x0e\xbe\xf1\xf1\xe0\xc5\xb3\x80\xc1\x44\x88\xbc\x6f\xd0\x32\xa6\x28\x12\xf8\xeb\x8b\x6e\xe1\xea\x3d\x9d\xbc\x89\x51\x92\x8f\x84\x16\x96\x57\xc4\xf8\x83\x1a\xa4\x55\x8f\x01\x00\x40\x99\x15\x89\x1b\x4c\x4b\xa2\xb8\x9a\xe3\xd3\x0c\x57\x42\xaf\x9e\xe3\x2e\xf3\xe0\xcb\x50\x08\xc9\x79\xe7\x85\x68\x59\xfb\x6a\x60\x35\x69\xbc\x42\xff\xae\x43\x13\x7c\x8b\xa0\x1f\x42\xeb\x2d\xc7\x17\x5f\xff\x00\x2a\x3e\xa8\x39\xf4\xd8\x19\xdb\x53\x5a\x24\x6c\x94\xc0\x57\x38\xcf\xd1\x0c\x8f\x32\xf8\x0e\x65\x33\xcc\x46\xab\xbf\x67\xb4\x48\x47\xac\x84\xaf\x30\xaf\x78\x42\x8b\x2c\xc4\x23\x43\xed\xbd\x92\x8f\x5b\x5b\xdd\x8a\xa1\xdf\xc6\xc0\x35\xc0\x6d\xc6\xae\x36\x9e\x8c\x19\x38\x41\x39\x7e\xf4\xe0\xb9\xb8\x7c\xe4\xe3\x10\xf0\x33\x20\x07\xcf\x9c\xab\x32\x5b\x7f\x55\x5a\x51\x29\xaf\xfd\x94\xec\xbe\xf9\xfc\xc2\xdc\xce\xb4\xce\x1f\xb6\x29\xf5\xda\x24\x97\xa6\x16\x96\x6c\xa1\x85\x5d\xc9\xb8\x6c\x65\x09\x76\x61\x48\x12\xce\x25\x7c\x96\x6f\xf5\x39\x66\xcf\x63\x32\x23\x93\x18\xbb\x74\xcb\x14\xa9\xc0\x85\xf0\xce\x21\x28\x73\xcc\x5e\x24\x78\xeb\x16\x43\xd1\xa2\xfe\xd1\x48\xc8\x0d\xae\xb4\xe3\x68\x91\x88\x63\x2c\xc2\xe2\x50\xe1\x0a\x56\xdb\xb9\x72\x79\xce\x1f\x68\x84\x5f\x3c\x1b\x09\x20\xd6\x30\x46\xec\xd8\xd3\xb3\xf0\x46\x1e\x31\x53\xf2\x04\x25\xc8\x10\x49\x6e\x3c\x52\x01\x65\xd7\x31\x3e\xe3\x8d\x4e\x52\x1c\x8e\xd4\xaa\xa3\x3c\x27\xb3\xc4\x5f\x3d\xc3\x28\x8a\x49\x82\x47\x87\xf0\xc5\x2c\xe1\x24\x5d\xa8\x3b\xff\x41\x27\x39\x5f\x74\x61\x7e\xa0\x98\xa2\x67\xd5\xf0\xed\xbe\xf5\xac\x1c\xc0\x25\x67\xf4\x0c\xf4\xfe\x90\xef\xfc\x10\x25\x21\x8e\x15\x9c\x5d\x79\xa8\xed\x90\xe0\xf2\x1c\xed\x48\x10\x8a\xd2\x9d\x64\x83\x34\x2e\x66\x64\x07\xc3\x99\xdf\xb0\x05\xd4\x8a\x2d\x53\x3c\xf2\x44\xfc\x61\xc9\xd0\xff\x5c\xe0\x6c\xf9\x06\x65\x68\x91\xbf\xa3\x8f\x19\xcb\x7e\x09\x4e\x7e\x7b\xd1\x5a\x3a\x00\xfd\x66\x75\x75\x6d\xd8\xdf\x10\xd3\x86\xd8\x2f\xa9\x9c\x8b\xad\x1e\x78\xef\x79\x07\x28\x8c\x3d\x48\xd6\x5b\xfa\x90\xeb\x5a\xfa\x90\xd3\x20\xd9\x01\xf7\x75\x57\x83\x6d\xd5\x40\xbf\xa9\xb5\xd8\x60\x0b\x58\x9f\xe1\xaf\x6c\x0d\x68\xbf\x05\xb7\xa8\x52\x1b\x6f\xc2\xb6\x1e\xf5\xcf\x67\x8a\x7d\xaf\x6b\xbd\xf4\x55\xe3\x80\xab\x8b\x0b\x0d\x24\x10\x50\x8a\x55\x5c\x9e\x09\x4d\xfd\x5c\x3d\x6f\x36\x2a\x02\x1d\x9b\x97\xa8\x40\x20\x56\x5d\x7c\x29\x58\x21\x41\xc2\x6b\x6d\x64\x14\x23\xbb\x21\x0d\x56\x8f\x79\x6f\xa3\x6c\x20\x2d\x7d\x24\xa2\x73\x3f\xe6\xe2\x55\xbe\x20\x79\x3e\x8a\xcb\x8d\x77\x1e\x2d\x77\x51\xd9\xe9\x77\xb7\x75\x26\x4e\x3b\x6a\xef\x28\x63\x7d\x7c\x19\xce\x51\x32\xc3\xdd\xa6\x48\xc6\x97\x66\xef\x76\x5c\x1d\x68\xe0\x67\x8e\xa5\x07\xd9\x64\x36\x09\x33\xe9\xc8\xb3\xd9\x7c\x32\xc3\x1e\xcc\x54\xe0\xad\x24\x88\xb7\x0e\xbc\x95\x74\x5a\x47\x25\x1d\xd6\x51\x89\x6b\x1d\x95\xd4\xec\x78\x92\x35\x76\x3c\x25\x50\x0f\xd4\x10\xd5\x68\x6b\x1e\x90\x26\x6d\x45\x9c\xb6\xd2\x8e\xc3\xcc\xb1\xa2\x30\x9e\xef\x74\x98\xe9\x18\x9d\x06\xb9\xb0\x17\x38\xc1\xf1\xd4\x6f\x11\xd7\xb5\x25\xe5\xa4\x20\x71\xf4\xe3\xdb\x97\x3e\x28\xe5\x2e\x3c\xc8\x71\x3c\x3d\x53\x3a\xa8\x4a\x8b\xd0\xa2\x86\x35\x67\xa0\xae\x58\x50\x7b\x79\x25\xfe\xaf\x75\x0a\xac\xa6\x53\x50\x55\xd8\x20\xa1\xd9\x42\x20\xd1\x7c\xc3\x40\x98\x6e\x0c\x48\x04\x38\x9f\xa6\x77\xf0\xeb\x04\xbf\x23\x0b\x2c\x9e\x8e\x5a\xd5\x0f\xdd\xf3\xa1\x09\x66\x64\x81\x0f\x34\xa8\x33\x87\x2f\x53\xa0\x4f\x84\x39\x0e\x67\xd0\x6a\xda\x13\x11\x19\x5d\xbd\x58\x95\x01\xde\xd3\x4f\x5f\x4d\x34\x90\xf5\x68\x60\x1c\x0d\xa4\x0d\x0d\xa4\x05\x0d\xac\x86\x06\x2d\xe9\xf1\x5b\x62\x25\x6d\x68\x12\x7c\xd1\x4b\x8c\xd9\xbc\x0a\xb8\x96\x59\x4f\xe6\xb9\x39\x31\x45\x60\xbd\xe7\x87\xc1\x4d\x5e\xf4\x61\x1a\xac\x4a\x68\x9b\xf5\x85\x1d\x66\x7d\xe9\x18\x9f\x06\xa1\x32\xeb\x4b\xeb\x66\x7d\xf6\x4f\x98\xba\x66\x7d\x69\xa7\x59\x5f\x7a\x75\x95\xba\x66\x7d\x69\xdd\xac\x2f\x0d\x8a\x6d\xcc\xfa\x6a\xa2\x83\x8f\x60\x0e\x31\xb8\xba\xc2\x25\x80\x29\x80\x91\xf5\xbc\x97\x3a\x46\x77\xa9\x32\xeb\xab\x7d\x3f\x4e\x9b\xe4\x20\x32\x66\x7d\xe9\x7a\xb3\x3e\xb7\x87\x76\x52\xc0\x87\x98\xf2\xe9\x29\xb3\xbe\x20\x85\x19\xd8\xe3\x24\xd4\x0a\xe2\x62\xd9\x42\xd0\xf5\xf7\xcd\x39\x8d\x8b\xc5\xe7\xf1\xca\x78\x7d\x89\x02\x4a\x49\xe9\x27\x12\x8d\x3c\xf9\xe7\x80\x44\x9f\x87\x9c\xd1\xf9\xb8\xb3\x23\x87\xd0\x29\x05\x9a\xf7\x74\x98\xdd\xd2\xcd\x1f\x07\x7e\xb2\xe3\xcd\xbf\x39\xdc\xa6\xb6\x78\xaa\xa2\x6d\x66\xbf\xd9\x68\x9b\x3b\x19\x50\xda\xda\x79\x43\x3f\xf9\x75\x83\xab\xb0\x19\x55\xba\x18\x95\x7a\x03\x94\x62\xdb\xea\xf5\xe3\x37\x53\x95\x8b\x25\x29\x03\xb2\x57\xeb\x59\x56\xde\xbd\xdf\xab\x2b\xdf\x1e\x45\x02\x4c\xf7\x8e\xa2\x52\xf0\x8f\xca\x59\xa8\xfe\x74\x4a\x84\x19\xcd\xfe\xbe\x99\xc1\x9d\x20\xc8\x8e\xad\xd1\x66\xa5\x15\xbb\xa3\xa1\xe6\xd4\x26\xe5\x31\xe8\x10\x48\x7a\xa9\xbf\x51\x20\xd1\x6d\xff\x29\xd0\xd0\xd1\xf2\x9f\x4d\x1c\xb5\x1b\x23\xda\x93\xcd\x60\x5c\x7f\x28\xd6\xa6\x42\x1d\xef\xf9\x99\x58\x2f\xd7\x5c\xe8\x40\x99\x0b\xa5\x3e\xe5\x13\xbd\x9c\x67\xff\x85\x97\xb7\x63\x0a\xeb\x4c\x55\x81\x76\x68\xa5\x60\x30\xf6\xf7\xe5\xff\x2b\xce\x94\x73\x12\x34\x48\x2c\x4e\x02\x55\xe7\x30\xb7\x59\x89\xe2\x66\xac\x44\xe4\xb2\x12\x45\x07\x2b\x11\x71\x56\xa2\x50\xac\x44\x54\x67\x25\xec\x9f\x30\x72\x59\x89\xa8\x93\x95\x88\xae\xae\x22\x97\x95\x88\xea\xac\x44\x14\xe4\xbb\xb3\x12\x9c\x65\xd7\xac\x44\x04\x60\x68\xad\x58\xe4\x5c\xf4\x91\x62\x25\x6a\xdf\x8f\xa3\x26\x91\x09\x0d\x2b\x11\xad\x67\x25\xdc\x1e\xba\xa5\x8a\x88\x4f\x4f\xb2\x12\x59\x10\xc1\x44\xb2\x12\x56\x44\x38\xc7\x1b\xa5\x9a\x61\xfd\x4c\x0b\x63\xe8\x7b\xc1\x59\xcd\x86\x8a\xf1\x5d\x8d\xad\xcb\x2e\xde\xf2\xb2\x6b\xbd\xde\x5c\x97\x9e\x94\xc6\xcb\x29\x89\xe3\x35\x6e\x40\x75\x37\x1f\xed\xc6\x23\xc8\x61\xdf\x78\x04\xed\x28\x4e\xd7\xbd\x7e\xb6\x73\xea\x71\xa2\x52\xc8\x12\x12\xd8\x7b\x1e\x0b\xf3\xff\x56\x53\xd8\x93\xe5\x62\x42\xe3\x5c\xdd\xd3\xc1\xba\x3a\x1c\x0c\x5f\x8a\x24\x48\x8c\x6d\xb6\x19\x5f\xb5\x78\x9b\x2c\x6e\xf9\x18\xad\xf3\x54\x02\x20\x24\x96\x22\x9f\x0f\x84\x02\x46\x78\xc3\x68\x2b\x75\xd2\x12\xc6\xe2\x33\x72\x58\xaa\x76\xf4\x96\x7e\x8c\xd7\x72\x1c\xc1\xa5\x15\xfa\xf2\x8b\xa3\xd4\xef\xd5\x51\xca\x62\x83\xa7\x81\xef\x86\xbc\xa0\x3b\x84\xbc\xd0\x1e\x45\x82\x26\xbe\x24\xb9\x15\xf2\xc2\x38\x21\x49\xa9\x5e\x47\xba\x10\xda\x0f\xb5\xa5\xc9\xd4\xbf\x63\x6f\x19\xfe\x1b\x5f\x5d\xdd\xc1\xe2\x8e\x57\x0f\xc0\x77\x86\x7b\x5a\x97\x53\xa3\x44\xb2\x8e\xda\x91\x77\xee\xe8\x0c\x63\xfb\xfb\xfe\x90\x53\x7a\xf5\xf3\xea\xca\x13\x0e\x2e\x82\xfa\x8f\x0f\x4f\x41\xe9\xf3\x85\x16\xea\x22\xfe\x09\x34\x9c\x58\xd4\xe0\x4c\xec\x55\x7b\x80\x53\x9a\xf9\xfc\x2c\xb0\x60\xf8\x57\xf6\x37\x97\xe1\xf9\x2b\xbb\x77\x4f\x13\x4d\x69\x8d\x5b\x31\x3a\xcc\xe6\x7a\x98\xe0\x7a\xd8\x9f\x8e\x8e\x23\xb5\xda\x9c\x03\xbd\x73\xd8\x76\x92\x18\x58\x29\x12\x30\x66\xa7\x9c\xb5\x1d\x6d\x20\x8b\x79\x2b\x6d\x20\x38\xaf\x5e\x1a\x3b\x9b\xfa\x04\x80\x91\x35\xa6\x8e\x01\x75\xef\xd0\x4d\x24\x9b\x08\xc7\xa1\xca\x77\x08\x97\xfe\xaa\x54\xbc\x9d\xe1\x38\x23\x1c\x63\x86\x7b\x89\x74\x4d\x52\xa5\x81\x62\xfc\xc4\xb7\xe3\x95\xf8\xdf\xc8\xfe\xc6\x39\x74\x68\x2d\xa3\xf4\x5b\xba\xbb\x32\xae\x5e\x03\x79\x97\x92\xe9\xd2\x4f\x40\x79\x56\xf9\x28\x71\x56\x1c\xcb\x1b\x51\xf2\xb2\xb4\xc9\xcb\x3e\x68\xe5\x65\x1f\xd8\xab\xfa\x40\xac\xaa\xdc\x36\x2a\xcc\x8c\x7c\xd2\x55\x2f\xb3\x42\xd5\xa7\xb8\x7b\x48\x01\xcc\x5d\x63\x34\x3e\x8e\x64\xb0\xa0\x11\x16\x41\x5c\xc0\x5f\xfd\x43\xc8\x64\xa0\xc2\xf8\xea\x6a\x55\x42\xaf\x6e\xd7\x3d\xb8\x90\xc6\x2c\xfb\xfb\xbe\xc2\x81\x84\x68\x0e\x23\x6f\xfb\x82\x7f\xff\x8e\x66\x7e\x0e\xf4\x9e\x16\xa1\x30\xd7\x02\x46\x13\x9a\xb1\xa7\x34\x61\x19\x8d\x63\x9c\x0d\xf8\x2c\x50\xab\x93\x46\x2e\x35\xaf\x70\x25\xab\x8c\x0a\x28\xb4\x94\xa8\x74\xa4\xaf\x44\xf2\x1a\x1c\xbb\xf9\x8d\xb1\x5b\x04\x75\xdd\xa9\x85\x34\xa1\x9a\xf7\xaa\xae\x3d\x21\xeb\x8c\x43\x18\x9d\x06\x85\xe5\x45\xb1\x17\xd5\x57\xa8\xda\x25\x52\x46\x8a\x80\x40\x4c\x73\xe1\x72\x00\x2b\xec\xa1\x0d\xcb\x12\x6d\x5e\x96\xc2\x2c\x4b\x1a\x6c\x02\xbc\xfd\xb2\x84\xce\xb2\xa4\x72\x59\xa2\xd2\xb5\xc2\xb9\xe3\xe3\x1e\x49\x72\x86\x92\x10\xd3\x69\x2f\x1b\x3c\xe6\x7d\x3c\xe7\x3c\xe8\xd5\x95\x57\xfd\xf0\x02\xe5\x5e\x0b\x80\xe5\x14\xa9\xe5\x7b\xf9\x26\x92\xcb\xf5\x2d\x9a\xeb\xfb\xb0\x75\x7d\x1f\xda\xeb\xfb\xd0\x5a\xdf\x70\xcd\xfa\x8a\x0c\x8d\xe2\x3f\x92\x43\xf6\x60\x26\x97\x38\x82\xe9\x69\x10\xda\x4b\x9c\xae\x5f\xe2\xb4\x6b\x89\x0b\x98\xd9\x8b\x9c\xaf\x59\xe0\x74\xf3\x02\x9f\xdd\x5d\x45\x5d\x74\x28\x03\xe5\x99\x59\xff\x45\xb0\xae\xcf\xed\xd7\x3e\x72\xd6\x7e\x21\xd7\x3e\x2d\x9b\x5e\x95\x71\x50\x33\x4e\xb7\x89\x0f\xa4\xb5\xeb\x36\x1e\x34\x55\x90\x1c\x7d\x56\x54\xd5\x55\x55\x63\x84\x21\x62\x2c\x1b\xb5\xb5\x92\x1c\x21\xa8\x02\xa1\x6a\x47\x4d\xbb\x77\xdb\x65\x93\xaa\x48\xa8\x44\x44\x6e\x65\x3a\x72\xab\x74\xa8\x01\x41\x10\x64\x63\x62\xf5\x73\x0a\x40\x8b\x23\x27\xea\x70\xe4\xcc\x70\x4c\x51\xf4\xd6\xb2\xcb\xbe\x0d\x95\x86\xd8\x09\xa3\x3b\x43\xe8\xac\x9a\x54\x25\xc8\xf5\x56\x95\x92\x46\x1d\x5a\x06\x04\xa2\x00\x0f\x6a\xd6\xe2\x34\xf3\x99\x10\xbe\xbc\x09\x8e\x69\x32\xcb\xdf\x51\xce\xc0\xa0\xc1\x07\x92\x44\xfb\xfb\x9e\x7a\x3b\xae\xbe\x81\xea\xe1\x45\x9c\x60\xbe\x11\x11\x5f\xcc\xb2\xb7\x28\x72\xd6\x9b\xe0\x1e\xea\x19\x58\x3d\x9a\xf5\x14\x08\x28\x08\x02\x46\x51\x8f\xb0\xde\x05\xca\x7b\xa2\x1d\x49\xa2\xf2\xcc\x0a\xa4\x81\xc7\xf2\xe3\xa9\x2f\x80\x82\x41\x4c\x92\x0f\xca\x09\x8d\x04\xd2\xbf\x39\xd9\xdf\x17\xd9\x4e\x37\x9c\x10\x06\x00\xb4\x42\xd1\xf3\xb3\x5b\xb9\xa1\xbb\xa7\x96\x59\x27\x7c\x3c\x3c\x05\x7b\x75\xf1\xb4\xae\x25\x54\x9c\x04\x91\x7b\xae\xec\xb2\x5d\x37\x47\x85\xee\xef\x53\x75\xb2\xe4\xa1\x21\xe5\xfa\x37\x45\x48\x02\x6b\x3d\x02\x8d\xfb\x63\xcf\x3c\x91\xf1\x8b\xfd\x89\xae\xa1\x9d\xce\xbc\x51\xbd\x82\xf2\x81\x36\xc5\xc2\xb0\x25\xc7\x99\x12\x0a\x38\x92\xd0\x40\xba\x90\x66\x01\x93\xe7\xc4\xfe\x18\x07\xc9\x98\x9c\xfa\x0c\x8a\x94\xcf\x2a\xd1\x73\x0c\x4a\x00\x35\x9d\xdf\x9a\xca\x6b\x32\x2f\x71\xd5\x3a\xb9\x55\x39\xaa\xfb\xc6\xb7\xfa\xfc\x43\x2b\xae\x8f\xe5\x3c\x27\xb9\xf1\xd3\xab\x2b\x36\x36\xc1\x03\x5e\xc8\x6f\x26\x27\xf0\xfe\xbe\xb3\x5b\x72\x6b\xb7\x24\x9c\x63\xe2\x14\x7a\x8b\x20\x01\x25\x2c\x82\x49\x3d\xaa\x99\x25\xa9\x8c\x93\x5b\x72\x1b\x0e\xdd\x4e\x94\xcc\x73\x6b\x1d\xd4\x22\xab\x4d\xdb\xd5\x53\x69\xda\xaa\x8f\xaa\x6b\x89\xa4\xbe\x29\xc3\x39\x8d\xcf\x71\x66\x3e\x70\x1a\xd8\xb7\xfa\xad\xbd\xaf\xc9\x91\x1f\xe0\xe4\x9c\x64\x34\x11\x1e\xb3\xad\xfa\x24\xb0\x32\xca\x83\xf8\x97\x55\x5a\xdc\xd6\x7b\x1e\xbd\x56\xd8\xc7\x58\x09\xba\x0b\xd1\x91\x74\xf1\xf7\xa0\x09\x18\x32\xb0\xbf\x57\xb5\x53\x1a\xbd\xea\x68\xe0\x14\x55\x6d\xde\x9a\x75\xab\xac\x3e\xed\x57\x3a\x0a\x85\xb5\xba\xb9\xe9\x68\xd7\x28\x5a\x77\xd0\x24\xc3\xe8\x43\x4a\x49\xc2\x6a\x0f\x77\xb5\xb5\xbe\x8d\xb7\xd3\xea\xc3\x6a\x41\x27\x24\xc6\x23\xcf\x5f\xa0\xcb\xfe\x05\x89\xd8\x7c\xd4\xfb\xcb\xa3\xaf\xd2\x4b\xe0\x41\xb1\xd0\x8c\x97\x91\xa4\x2a\xfb\x5a\x94\x45\x38\xff\xc0\x68\x5a\x2f\x1c\x1e\x7e\x25\x5b\xce\x0a\xc6\x70\x16\xe3\x3c\xaf\x43\xfe\xfa\xd1\x21\x2f\x2f\x5b\x67\x1f\xea\x88\x0a\xfd\x85\x08\x46\x9a\xe5\x07\xb3\x98\x2c\x16\x1c\xdb\xb5\x63\xa5\xbe\x56\x0d\x0e\xfa\x69\x46\xce\x11\xc3\x07\xf2\x30\x35\x20\x7d\x46\x81\x0b\xcd\xd8\xf3\x83\xbe\x8a\xff\xd8\xc7\xb1\x88\xcc\xda\x47\x31\x6b\xa5\x30\xa6\xcd\xa7\x78\x68\x97\xda\x14\x33\xee\x81\x3c\xa0\xbe\x4d\x0f\xdb\xdf\xa6\xd7\xcc\xe4\x37\x3b\x8b\xbd\x75\xb3\x40\x51\x44\x93\x7e\x48\xd3\x65\x7f\x52\x30\xe6\x3a\xcb\xaa\xbd\x17\x13\xfe\x6f\x3a\xa1\x28\x8b\xec\xd6\x76\xbb\xcf\x72\x3b\x8a\xc0\x93\xfd\x05\x4d\x08\xa3\xee\x91\xec\x88\xae\x56\x2d\x69\xe7\xeb\x4c\x84\x27\x85\x1d\x6f\x0d\x87\x34\x43\x8c\x66\x79\xad\xb1\xeb\x7e\xc3\x2f\x0b\x9c\x1f\xc4\x74\xd6\xfd\xb2\x22\x15\x81\x5d\x0f\x54\xbf\x82\x42\xff\x4b\xe4\xb3\xdf\xbd\x42\x5f\xb2\xdb\x93\x60\xec\xe9\x47\xc4\x0b\x94\x71\xb6\x8f\x24\x53\xea\xf1\xd3\x29\x77\x3b\xcb\x50\x88\xbd\x53\xfd\x00\x20\x94\x95\xf1\x80\xa1\x99\x90\xbd\x7d\x4f\x67\xd7\x49\x6a\xb1\xb5\x45\xb8\xc6\x01\x89\x3c\xe8\xc5\xf8\x1c\xc7\x22\x84\x77\x76\x8e\xb3\xc1\x8a\x44\x50\x06\x88\x2a\x3d\x00\x91\xef\x87\xb7\x6e\x59\xa3\xec\x0c\x2b\xc3\x9a\xe8\xb7\x6a\x58\x63\x1e\x3e\x74\x3e\x55\xb9\xbe\xe6\x39\x44\xa0\xcc\xfd\xaa\x10\x3a\x19\x1f\x9d\x3a\x1f\x73\x0f\x4e\xaa\x4f\x8a\xfe\xfd\x98\x71\xec\x1f\x9c\x0f\x0f\x54\x3c\x5e\x45\x16\xab\x8a\x24\x3f\x61\x19\x46\x0b\xf1\x78\x2c\x2c\x0d\x35\x50\x3a\x9b\x99\xfe\x4b\x9a\xbc\xe4\x9d\x3c\x15\x96\xa6\x3e\x58\x89\x58\x70\x0a\x9a\xd4\xda\xb8\x11\xe1\xe4\xf8\x8f\xd5\x3c\x7e\x22\x91\x37\x52\x33\xe5\x7f\x43\x56\xab\x65\xfd\x3d\x20\xd1\x48\x46\x2c\x17\x95\x95\x88\x67\x36\x15\x24\xc1\x2a\xa6\xb3\x9f\xc4\x9c\x65\x45\xf1\x27\x1c\xe3\xd3\x11\xab\xdb\xaf\x4b\x80\x42\xb7\xa0\xc2\x92\xd9\xfd\xc8\x4f\x00\x92\x32\x22\xd1\x8b\x24\xc7\x19\x7b\x2e\xef\x7d\xcd\xbf\x0f\x1a\x05\xf5\x5d\x27\xd5\xf2\xc2\x21\xe0\xa5\xc0\x96\xaf\xdd\x7b\xf5\x4f\x95\x05\x48\x0e\x53\x7c\x3b\xb6\xfe\x1e\x30\x44\xe2\x91\xe7\xed\x61\x65\x6e\xf0\x9f\x64\x30\x18\x08\x6b\x5e\x92\xcc\x7a\x31\x9d\xf5\xc4\xdc\x7a\x8c\xf6\x94\x19\xb0\xf8\x5d\x0e\x06\x83\xff\x24\xff\x49\xce\xd4\x10\x72\xcc\x7c\xb3\x5e\xe6\x55\x6e\x10\x0a\xff\x03\x9f\xa3\xeb\x3b\xcc\xc2\xf9\x08\x07\xdf\xac\x8d\xb6\x8a\x01\x4c\xc5\x5a\x4a\xbc\xd6\x96\x17\x16\x59\x5c\xfb\xfc\x63\x16\x43\x31\x7e\x21\xd9\xe7\x98\x89\x0d\xc2\xe9\xbf\x3d\x43\xe1\x56\x5f\x1b\xa6\xdc\xc0\x58\x7d\xab\xef\x2b\xdc\x8e\x53\x46\x67\xb3\x18\xcb\x7d\xea\x2b\xf8\x02\x58\x2e\x3e\xbd\x12\x3e\x9c\xea\x87\xf4\x5a\x57\xd3\xe4\xcd\xcc\x71\xaf\x6d\x75\x2e\xf2\x47\xc1\xc2\x0f\x3f\x6d\x94\xb0\x1a\xf8\x1a\x3e\xb7\x8b\x15\xb6\xa6\x3d\x80\x61\x2d\x62\x58\x10\x02\x70\x75\x55\x6c\x56\x00\xd8\xbc\x92\x89\x23\xdc\xcf\xe8\x45\x0b\x9f\x78\x4d\xa6\x49\x32\x49\xf4\x1c\x67\x19\x89\x84\xb9\xa7\xc9\x7b\xd2\x99\x10\xc5\x14\x64\x45\x12\x53\x9a\x56\xac\x2a\x4d\xc2\x22\xcb\x70\x12\x2e\x6d\x16\x6b\x8e\xe3\x94\x0b\x5f\x31\xfa\xb8\xe4\xac\x6c\xf8\xa1\x9b\x01\xb3\xe6\x99\x33\xc4\xf2\x3e\xbf\xd8\x3e\x58\xd3\x6b\x67\xe8\xd6\x58\xc3\x68\x76\x4d\x5e\x4d\x26\xcd\x24\x9c\xc1\x25\x3c\x87\x17\xf0\x23\x7c\x0f\x2f\xe1\x6b\xf8\x06\x7e\x80\xaf\x2a\x9e\xee\xe4\x73\xb2\x28\xf9\xe9\x57\x62\x40\xdf\x7d\x61\x40\x7f\xef\x0c\x28\xbf\x16\x9f\x06\xbe\x78\x78\x8b\x2c\x86\x92\x71\xd6\x64\x21\xbf\x8a\xc3\x2b\xcc\x75\x81\xef\xb9\x94\xca\x23\x79\x9f\x24\x0c\x67\x32\x8a\xa9\x07\xe0\x44\xb6\x42\x8c\x65\x64\x52\x30\xfc\x84\x24\x11\x49\x66\xbc\x71\x84\x18\xea\x33\x9c\xb3\xbe\x1d\xa0\xdf\xfa\x2c\x12\x32\x77\x15\x66\x18\x45\xfd\x5a\x18\xf9\xa9\xe4\x83\x2b\x9e\x57\x38\xb0\xdc\xa9\xc4\x76\xde\x8e\x24\x33\x00\xe0\x9c\x57\xcd\x6c\xf6\xb8\xd6\x4b\xf5\x63\x40\xac\xdc\x5d\xb3\x40\x84\x14\x45\x31\x41\x7c\xfc\x82\x66\x0d\xc2\xb4\x18\xc4\x28\x67\x12\xfb\x1e\x80\xcb\xb6\x5a\x0b\xbc\xa0\xd9\xb2\x5e\xf1\x9c\x57\xcc\x07\x0c\xe5\x1f\x40\xb5\x11\xff\xec\x83\x55\x44\x57\x64\xea\xab\x67\x0a\xc4\x72\xc0\xb2\xe5\x6a\x49\x70\x1c\xf5\xac\x78\xb1\x02\x70\x4a\xe3\xd8\x93\xaf\x37\x38\xf2\xc1\x20\xc5\xd9\x94\x66\x8b\xda\xe5\x2e\x6a\xca\x07\x02\x11\x41\x40\x3e\x21\xe3\xfa\x95\x6d\x55\x39\x04\xa5\xe8\x4c\x0e\x8f\x2c\x30\x2d\x18\xf0\x1f\x1e\x1e\x82\xf2\x62\x4e\x62\x2c\x47\x86\x13\x7e\xc4\xde\xd0\x38\xe6\x38\x2d\x01\x18\x44\x99\xe0\x2a\x52\xff\x22\x58\xf8\x17\xc1\xc4\xf7\x3f\x3a\x82\x44\xb2\x83\x5e\xf6\xa4\x6e\x80\xf4\x5e\xd9\x25\x9d\xd4\x83\x20\x5f\xaa\xcf\x3f\xa9\xcf\xf6\x3a\xca\x83\xa1\x4b\x42\x9a\x30\x7c\xc9\xdc\xcf\x0e\x72\x0c\xfc\xda\xf4\x3c\xf8\xda\xe9\x3e\x4c\x0b\x0f\xbe\x71\x3e\xca\x55\xf6\xe0\x07\xe7\xbb\x88\xdd\x74\xc2\x3b\xf2\xe0\x2b\x2b\x6a\xb3\xe8\xdb\x07\x66\xb1\xc5\xba\xb6\x6f\x3e\x6d\xe8\x14\x36\xf8\xc8\xe9\xb6\x4c\x64\x05\x58\x72\x8c\xd5\xef\x92\x4b\x12\x4f\xf9\x65\xcd\x65\x08\x71\x6b\xf3\xed\xe1\x1f\x42\xbe\xb7\x3f\x2e\x45\x11\xf0\xc7\x8a\x37\x14\x3f\x21\x3e\x05\x9c\x45\x7f\x8b\x43\x4c\xce\xb1\x78\x1b\xb6\x39\xf4\xfa\x77\x9b\x81\x14\x88\x78\x27\xaf\x7a\xc3\x9a\xd7\x3f\xae\x9c\x01\x1e\x8b\x27\xe0\x3c\x9c\x63\x4e\xc5\x5e\x27\x21\xa7\x4a\x68\xca\x70\xf6\x16\x27\x11\xe7\x18\x04\xa2\x9f\x01\x39\xb3\x0a\xdf\x03\x19\x79\x41\x18\xf3\x97\x25\x7c\x1f\xbc\xf3\x3f\xb6\xbd\xf4\x90\x5b\xe2\x2d\x2f\xdd\x0e\x34\xf3\x7a\x5b\x1d\xbc\x76\x3b\x70\xf6\xe9\x78\x7a\xd3\x1e\x1a\x18\x12\xdb\x76\x3c\xdf\xcc\x16\xb7\xb4\x03\xf0\xa3\xcd\x0e\xbf\x71\x47\x2f\x8e\xd1\x78\x76\xd3\x31\x7f\x70\xe1\xea\x93\x38\x5e\xde\x14\xf4\x2b\x17\xb4\x7d\x98\xc7\xe7\x37\x05\x7f\x11\x7c\xe4\x02\xc2\x85\xf9\x77\xcf\xc9\x8b\xf1\xcc\x95\xe0\xab\x53\x21\x42\xb9\x0f\x48\xfe\x06\x65\x1c\xec\xfe\xbe\xcc\x8e\x51\x3d\x6f\xdb\x4e\x2e\x35\xca\x28\xa2\x82\xac\x26\x28\xfc\x30\xcb\x68\xc1\xeb\x88\x60\x49\x77\x86\x82\x2b\xa8\xe2\x10\xe6\x6f\xb0\xb8\xae\x3d\x00\x74\xe6\x0d\x5d\xe8\x81\x3d\x1c\xe7\xb8\x27\x8c\x3e\x55\xa0\x79\x94\x7f\x10\x91\xa1\xec\x38\x71\x16\x38\x41\x81\x13\x26\xa3\x9a\xab\xb1\x0e\xa4\x05\x07\x17\x27\x9d\x93\x6b\x6e\x32\xeb\x85\xec\xe9\x0e\xa2\x13\xdf\x80\x1b\x9e\x0a\xb6\x4e\x0b\xd9\x10\x61\x8a\x84\xd4\x12\x5e\xed\x20\xa7\x48\xe6\xf9\x77\x98\x0e\xff\x17\x97\x48\xce\xbf\x48\x24\x7f\x04\x89\xe4\x22\xf0\x69\x8b\x8a\xbb\x99\x0a\x72\x81\x59\x46\xc2\x4a\xfb\x5d\x63\xc1\x15\x6f\xd1\xe4\xd7\x8b\x35\x95\xdb\xd8\xf6\x66\x42\x79\xd5\xaf\xba\xcd\xf4\xdd\xd3\x96\x41\xde\xd4\xe4\xbd\x0c\x8a\x1c\x47\x22\x5f\xfc\xda\x6a\x66\x30\xab\x0c\x0b\x1d\x69\xf4\x4a\x74\x00\xf5\xcf\xa7\x6f\x7e\x2c\x3d\x00\xa9\xef\x9f\xfb\xfe\xe4\x06\x09\x30\x97\x9d\x3c\xf4\xd2\x66\x96\xdf\x69\x2d\x4d\xbd\x8c\xe4\x2f\x29\x8a\xa4\xc2\x7a\x58\x7d\x56\x4f\x19\xf5\xba\x66\x82\x06\x57\x33\x9b\xaf\x76\xf3\xd7\xeb\xdb\x7c\xee\xf0\xce\x4f\xf9\x54\xcd\x7b\xa4\x68\x1b\x04\xf2\x96\x94\x3d\x1c\x4b\x81\x74\x4a\xbd\x11\xff\x2b\x42\xc9\x0c\x67\x9e\x69\xaf\xaf\xd6\x95\xac\x3d\xc2\xa5\x68\x2c\xcc\xf4\x14\x30\x7c\x75\xa5\xbb\xe7\xbf\x80\xa5\xc8\x1e\x5b\x1d\x9d\x0a\x98\xfc\xbe\x42\x8c\xe1\xe8\x44\x02\xb7\x85\x38\x6d\x91\x55\x01\xb3\xc7\x29\xc4\x51\xd9\xfc\xc9\x92\x71\xd9\xda\x34\x14\xdb\x04\x8c\xda\x66\x67\xb5\xfa\x1e\x67\xec\xa3\xdb\x0a\x7a\xaf\xbe\xff\xe8\x19\x92\x5d\x1b\xe2\x5b\xb5\x7b\x2a\xf4\xed\x3c\x32\xb3\x33\x9d\x8d\xe9\xbd\x22\x4f\xbc\x9d\x47\xdc\x80\xf6\xf4\xcd\x8f\xce\x04\x4a\xe0\x72\x98\x62\x07\x6c\x97\x1c\x73\xd2\xde\x16\xc0\x89\xcd\xa1\x4e\x83\xf3\x7a\x4d\xc9\xa1\xe6\x37\x4f\xad\xee\xc0\x35\x1c\x6a\x71\x53\xd0\xe7\xcd\xa9\x6d\x97\x33\xbc\xd9\xcc\x41\x86\x03\xb9\xb6\xbd\xb7\x4b\x0a\xbe\xa6\xfd\x96\x7d\xe9\x7d\xea\xc1\x71\x7a\xdd\xfe\x0c\x0c\xa7\xcf\x45\x30\xe1\xcc\xf7\xc2\xd6\xce\x5f\xec\xc8\x62\x16\x79\x7f\x82\xda\x2d\x1a\x0c\x57\xd9\x06\x26\x22\xb9\x54\x89\x71\x40\x02\xc2\xae\xcc\x64\x2d\x31\x79\xc5\x3a\xe6\x9f\x9b\xf1\x9e\x74\x3a\x30\x39\xab\xb7\xd4\x14\xda\xc8\x57\xe9\xaa\x59\xbb\x42\xef\x29\x4d\x18\x22\x09\xbf\x41\x7f\x2e\x70\x81\xa3\xc7\xbc\x28\x87\xbc\x72\x8c\x19\x56\x3f\xa7\x88\xc4\xa6\x2c\x93\x7a\x17\xf5\x4b\xe4\x70\xac\x7e\xc6\x34\x67\xea\xcf\x22\xf9\x90\xd0\x8b\x44\xfe\x2a\x3d\x11\xab\x76\x60\xe5\x88\x80\x99\xef\xa3\x2d\x5f\xd3\xdb\xae\xe4\x5c\x3f\xfb\xa2\x25\x2d\x18\x67\x7e\x38\x9b\xb1\x66\x17\x55\x4d\x5a\x10\xa0\xaf\x61\x5d\x45\xc4\x7d\xaf\x7f\xda\x84\x6a\xa1\x1d\x9c\xe1\x04\x67\x88\xe1\x97\x78\x86\x93\xe8\x25\x49\x3e\xd4\xbc\xb6\xf1\xfe\xbe\x27\x31\x2d\x7c\xf4\x8e\x2d\xcf\x82\x7c\xb4\x92\xc0\x46\x22\xa0\x41\xe5\x4a\x31\x66\xa7\x00\x56\x01\x1b\xf0\xc0\x58\x2e\xd7\x72\x6e\x0c\x08\x17\x15\x4b\x49\xfa\x44\x22\x6c\xc4\x90\xbc\x69\xef\x38\xd2\xb1\x99\x75\x95\x0f\xac\x43\x8e\xae\x36\xc8\x0c\x33\xcb\xe1\xce\xb3\xb7\x8b\xc2\x7b\xb5\x61\x3c\xe8\xd9\x5b\xc6\x83\x5e\x6d\xd3\x48\xee\xcd\xda\x36\x1e\xf4\xaa\x8d\xe3\x41\xaf\xb6\x75\x8c\x23\xc8\x78\x15\xa3\x09\x8e\x47\xde\x3f\x25\x02\x95\x60\x86\x07\xf5\xad\xab\x95\xf0\x23\x8d\x68\x18\x9b\xb5\x18\x29\x5d\x62\x63\x8d\xc4\xf7\xf7\x74\x02\x75\x23\x50\x42\xdd\xdd\x89\x1a\x6b\xd5\xa1\xb3\xe9\xad\x2e\x73\x53\x37\x46\x4b\x9c\xe5\xa3\xa3\xdd\x7a\x37\xed\xad\xfe\xb5\xa2\xd3\x74\x5f\x3f\x81\x56\xef\x99\xae\xb9\x53\x9f\xba\x95\xd5\xe5\x53\xb5\x9c\x55\x9f\x0e\x45\xb0\x3a\x0d\x4d\xdd\x9d\x7a\x35\xcd\xac\x6e\x7f\x94\xeb\x5e\xf5\x5a\xdb\x08\x76\xa7\x85\xae\xb9\x53\x9f\xba\x15\x80\x73\x1c\xa7\x23\xef\xb1\xd9\xe7\x3d\x92\xf7\x54\x69\x2f\x27\x49\x88\x7b\x84\xe5\xbd\x84\x46\x98\x97\x44\x24\x0f\x69\x92\xe0\x90\xe1\x68\xe0\x55\xe3\xfd\x4e\x6c\xf2\x6a\xb8\x35\x3a\x69\x8d\x76\xaa\xea\xed\x34\x58\xd5\xc8\x42\xcf\x4b\x9a\xb3\xaa\x33\x8b\xd4\x5a\x5d\xc5\xa2\xce\x4e\x1d\x89\x26\xa0\x3c\x15\x89\xce\x90\xc5\x25\x44\x81\xa0\x79\x1e\x4c\x83\x71\x7c\x0a\x17\xed\x91\x0f\x2c\x16\x03\xd5\x92\xac\xf3\xa6\x00\x4e\x6a\x20\xa7\x6e\xa8\x91\x45\x87\xfe\x61\x3a\xc6\xa7\xc1\x42\xe9\x1f\xa6\x75\xfd\x83\xfd\x13\x4e\x5d\xfd\xc3\xb4\x53\xff\x30\xbd\xba\x9a\xba\xfa\x87\x69\x5d\xff\x30\x0d\xd2\xdd\x43\x8d\x84\x30\x32\xa1\x46\xa6\x00\x4e\x2c\xfd\xc3\xd4\xd1\x0e\x4c\x95\xfe\xa1\xf6\xfd\x78\xda\xd4\x3f\x4c\x8c\xfe\x61\xba\x5e\xff\xe0\xf6\xd0\xce\x74\xf0\x21\x4e\xf9\xf4\xe4\x95\x46\x03\xc4\xb9\x3b\x2a\xa3\x8d\x58\x8a\x36\x8b\xdb\x2b\x76\xe1\xf6\x8a\x49\x82\xce\xb7\x55\x29\x76\x24\x0b\x6e\x5a\x56\xec\xa0\x3c\x54\x5a\x2e\xd8\x50\x1e\x56\xdc\xdf\xf4\x73\x52\x1c\xce\xbf\x28\xf0\xfe\x08\x0a\xbc\x59\xe0\xc7\xf2\xc1\xbd\xa6\xc0\xa3\x92\xe1\xc7\x3f\x17\x28\x06\xbe\x97\xd1\x82\xf1\x79\x09\xa3\x22\xf6\x96\xff\x52\xfc\x6e\x75\x06\x6d\xae\x6d\x30\xcd\xb5\x16\xf0\x46\x40\xfa\x19\xa5\xac\x52\x1a\xd2\x0c\xf8\xde\x34\x7f\x91\x3f\x96\x26\x0c\xd0\x9b\xe6\x6f\x29\x65\xe6\x03\x80\x71\xd3\x42\x76\x17\x35\xdb\x54\xb1\xda\x72\xac\x26\x8f\xaf\xf9\x6e\x77\x9e\x36\xca\x6a\x63\x81\x0b\xb7\x9c\xc4\x38\xe7\x57\x9f\xae\x30\x51\x2a\xb3\x12\x46\xc1\xbc\x6e\xb8\xa6\xfb\xbf\xb5\xb7\xc9\xd4\xed\xc1\x9e\xc9\x98\xde\xd8\x6e\xaf\x09\xbe\x8e\x8c\x31\xba\x69\x17\x93\x46\x17\x2e\x3e\x6f\xae\x09\x6a\x33\x09\x9c\x6d\xbc\x86\xb4\x54\x9c\xf7\x73\x1c\x36\x33\x38\x76\xde\x43\x5b\xde\x2e\x3a\xdd\xe1\xed\x1c\x78\x95\x90\xc8\x3e\xed\x8d\x68\x8d\xd5\x89\x29\xc1\xd5\x55\xb2\xb7\x29\x03\x8b\x85\x8c\x09\xca\x49\xd8\x8f\x32\x9a\x46\xf4\x22\xe9\xeb\x67\xc5\x16\x7f\x9a\x7a\xcd\x2d\x60\x7c\x96\xbe\x35\xce\x5c\x58\x46\xa4\xcd\xf1\x0d\xf0\xa1\x61\xfc\x0e\xf0\x71\x13\x3c\x7c\xa6\xf3\xcf\x30\x8a\xc2\xac\x58\x4c\x5a\x89\x44\xdd\x69\xaa\xf1\xf6\x6d\x31\xae\x0d\x5f\xc9\x0d\x6c\x69\xc5\x86\xa2\x2f\x9c\xdd\x1f\x81\xb3\xcb\x39\x67\x57\xa7\xeb\xd9\x8d\x7d\x85\xaa\xed\x9b\xdb\x1e\x43\xf4\x37\xeb\x31\x24\xb4\x0c\x19\x9e\x91\x9c\x09\x8b\xb6\xea\x4f\x15\x24\xbe\x9a\x90\xa9\xf6\xc4\x7c\xf3\x25\x83\x16\xe1\x75\xcd\xaa\xd2\x46\xc3\x0b\x12\xc7\xcf\x70\xce\x32\xba\x34\xf6\x77\xb5\x6f\x72\x7c\x36\x7c\x11\x73\x15\xf9\xb1\xcd\xe9\xd4\xb0\x7e\x6b\x91\x0f\x9c\x4e\xf4\x10\x04\xd3\x89\xc4\x59\xda\xfc\xa6\xd3\x0e\x81\x53\x05\xeb\x29\xc7\xe9\xa8\x9a\xed\xf5\xbb\xb2\x60\x38\x9d\xc5\x36\xef\x96\x6f\x4f\x8e\xdb\x23\x6a\xb7\x28\x0f\x18\x5e\xa4\x31\x62\xb8\x3f\x45\xfc\xf8\x2c\xdb\x89\x71\x83\x64\x6f\xa0\xce\xb7\xe5\xa1\xa8\x2d\x2f\x84\x01\xea\x3b\x35\xd4\xef\xe4\x48\x81\xbf\x22\xd1\xc8\xfb\xc7\xe2\xd1\x5f\x86\x4f\xfe\xfb\xbe\x07\x27\x31\x0d\x3f\x8c\xfe\xf7\x78\x3c\x1e\x7e\x05\x87\x70\x3c\xbe\x7f\x08\x0f\xe1\xd8\x53\x08\x39\xe5\xff\xc0\xb1\xb7\xaf\xaf\xc3\x53\x38\x45\x71\x8e\xe1\xd8\x13\x36\xc8\xde\xe9\xe9\xff\x86\x32\xf8\x81\xd4\xfd\x6d\xc0\xf0\x60\xce\xb1\x2c\x7c\x8a\x48\xc8\x5e\xd1\x08\x0b\xab\xb6\x2e\x6a\xd5\x65\x90\xfc\xfb\xa5\x56\xe2\xd5\x44\x8e\xd7\x49\xd4\x61\x63\x51\xfe\x4f\x04\x60\xb1\xcf\x44\xe8\xcc\x37\x0a\xc6\x99\xa1\x14\xe9\xcd\x02\x34\x4f\x5c\xad\x69\xda\xc1\x1a\x4c\x38\x6b\x90\x2a\xd6\x60\x52\x67\x0d\xec\x9f\x70\xe2\xb2\x06\x93\x4e\xd6\x60\x72\x75\x35\x71\x59\x83\x49\x9d\x35\x98\x04\xd1\xee\x5a\xd3\x02\x86\x46\x6b\x3a\x01\x70\x61\xb1\x06\x13\xe7\xe2\x9e\x28\xd6\xa0\xf6\xfd\x78\xd2\x5c\xcc\x85\x61\x0d\x26\xeb\x59\x03\xb7\x87\xf6\xfd\xc8\x87\x38\xe1\xd3\xd3\x5a\xd3\x09\xa7\x6f\xfc\x00\xd8\x0a\x46\x8b\xde\xc9\xd8\x6a\x39\x66\x4f\xf5\x09\xd4\x34\x00\xf8\x08\xe6\x3b\xb0\xa7\xf9\x81\x61\x82\xaf\x4f\x17\x9d\xca\x55\x1d\x9a\xc4\xcb\x4f\x96\x6a\x5a\x45\x46\xda\x48\x08\xbf\x4a\x2f\xff\xcf\xf3\x93\xf4\xdf\x35\x42\x78\x08\xbd\x98\x78\xa7\x70\x3c\x3c\xe2\xff\x81\xde\x7f\xfe\x93\xf4\x7a\xfc\xc3\x57\x70\x7c\xff\x6b\x78\x78\x2a\x43\xe4\x8d\xc7\xde\xb7\xd2\xf5\x93\x97\x71\xca\x39\x84\x63\x0f\x65\x33\x49\x37\x79\x79\x45\x36\xc7\x1c\xb2\x00\xc5\x7f\x3c\x18\x42\x5d\x9f\x11\x16\x63\x4f\x54\xe7\x15\x7a\xe2\x1f\xd1\xfb\x21\xf4\xa2\xb8\x31\x0e\xa7\x02\xeb\xa8\xa0\xaa\x34\xba\x69\x87\x74\xbf\xbb\x83\x68\xcb\x0e\xc4\x03\xd1\xd6\x1d\x38\x1f\xc5\xfc\xdb\x70\xd0\x0d\x5e\x35\x91\xbf\x79\x6d\xf9\xd3\xae\x20\xba\xe0\xd7\xd7\xb7\x52\xdc\xaa\x2e\xaf\x98\x24\x1f\xfa\x8c\x7a\xd0\x23\xd3\x5d\xef\x30\x7d\x2a\xba\xee\x32\x29\x4f\xad\x39\x85\x99\x13\x48\x08\xd8\xfc\x4a\x7b\x78\xf4\x8e\x91\x34\x32\xc3\x5f\xe7\x6c\x76\x0a\x9c\x5b\xca\x97\xc6\x66\xfa\x8b\x7c\xf9\x07\x92\x2f\x25\x89\xcd\x37\x93\xd8\xaf\x1f\xdf\xff\xef\x7f\x46\xaf\x8f\x6c\x12\xdb\xa4\xa3\x34\x51\x4e\x5e\xde\xb7\x11\x15\xe4\xf2\x88\x57\xfa\x0b\x1c\x2a\xd2\x7a\x78\x0a\x35\x6f\xaa\xeb\xf2\xb3\xce\x01\x54\x25\xc2\x3f\xe1\x0d\xca\xc4\x5e\x5d\x43\x82\x0d\x71\x11\x9d\x3c\x84\x47\x16\xfd\x9e\x26\xfc\x20\xf1\x41\x68\xf0\x35\x8a\x62\x51\x6e\xf9\x30\xed\x91\xfc\x49\x91\x2f\xeb\x14\x5c\x53\xcf\x96\x7b\xc4\x2a\x16\xf4\xef\x01\x7c\x04\xbd\xff\xe5\xc9\x3f\x3d\x94\x11\xd4\x97\xb4\x0e\x7a\xb1\xb2\xd8\x6d\x27\xc0\xff\xef\xff\xfe\xff\xbb\xc8\xe9\x1a\x0a\xab\x10\xd6\x36\x8d\x93\x22\x0c\x71\x9e\xab\x99\x34\x6b\x64\x38\x17\x88\x6c\xbf\xaa\x3a\xa6\x6a\x5f\x9c\x0f\xac\x05\x17\xcf\x1b\x7c\xb9\x45\xb8\x45\x5e\xc7\x7b\x4f\x27\xc2\x1c\x40\xc6\xb4\xf4\x3a\xbb\x5f\xb7\xae\x8d\xeb\xab\xeb\x02\xdd\xf2\x12\xe5\xff\xc8\x0d\xd5\xfb\x07\x9d\xb4\xb5\x6f\x5e\x9d\x5b\x5e\x9f\xcd\x3b\xae\x3e\x51\xe8\xb1\x8c\x13\xe0\x48\x3c\x91\xb5\x5c\xac\x6b\x87\xd0\x79\xad\xbb\xd7\xe4\xda\xfb\x58\xed\x96\xed\x77\xf5\xb5\x17\xfa\x50\x7e\xdf\x6a\x79\xb7\x58\xdc\xad\x96\x56\x61\xff\xe1\x51\x6d\x04\xd0\x9b\xa3\xfc\xe9\x9c\xc4\x51\x86\x05\x22\xbc\x6a\x03\x78\xd0\xfb\x87\x18\xe4\xd6\x08\xdf\x72\x2b\x54\x1b\xa1\x1a\xc6\xc6\xe5\x5f\xc7\xba\x35\x19\xae\xb6\x85\x5f\xb7\xec\xfc\xeb\xa9\x56\x00\x54\x2f\x0e\x9a\x85\x32\xef\x18\x1e\x0a\xb5\xfb\x37\x89\xfa\x44\x84\x7e\x91\x8c\x15\x34\x7c\xd6\xae\x2c\x16\xdf\x1c\x6b\x54\x05\x45\xe0\x23\xdf\xa7\x8e\xb6\xc0\x04\xb3\x5d\x71\x21\xfa\x3d\x9d\xb8\xa9\x2e\xb3\x99\x12\x9d\xf9\xe6\x2b\xd5\x35\xc2\xd9\x8d\xd2\xba\x38\x94\xb9\xe2\x1d\x6d\x9c\x64\x9b\x3a\xa6\xf2\x6a\x91\x76\x8e\xb6\xb3\x81\xa8\x28\x3c\xe9\x74\x15\xc7\x1a\xde\xdc\x6f\xe3\x6c\x6b\x75\x17\x6d\x03\x00\x20\xad\x2b\xd6\x68\xc3\xfb\x51\x5d\x80\xd7\xee\xca\x06\xe2\x74\x47\x6d\x56\xb5\x58\x27\x6a\xe6\xb0\xd8\x28\x6a\x86\x73\x94\xb1\x7e\x9a\x91\x05\x61\xe4\x1c\xe7\x07\x28\xc3\xe8\x13\x29\xe1\x34\x97\x1b\xdd\xef\xe7\x73\x94\xe2\xa6\xd3\x60\x6a\x4c\x4b\x0f\x8a\x84\xfc\x5c\xe0\x76\xf9\x74\xbb\x00\x74\x9f\x87\x85\xcf\x97\xa8\x75\x7f\x10\x3e\x7d\xb2\x99\x4f\x3f\x79\xfd\xdf\xb3\xe9\x43\xf6\xca\x55\x85\x44\x78\x9a\xb7\x2a\x43\x24\x27\x90\x60\x94\xfd\x3d\x43\x11\x91\xf2\xa1\x60\x62\x2f\x87\x1e\xf4\x0e\xcd\xaf\x23\xfb\xd7\xb2\x56\xb6\xe4\x65\x43\xf1\xeb\x21\xbf\xf9\x8e\xbe\xb6\x54\xd0\x34\xa6\x99\xf4\x02\xd2\xf7\xd6\x43\xce\x26\xd9\x75\xa6\x24\x8e\x5f\x44\xa6\xfc\xa8\x79\xb9\x1d\x8a\x28\x02\xa9\xea\xf0\x50\x99\x37\xeb\xfe\xe9\x74\x9a\x63\x4e\x25\x0e\xff\x54\xcd\xb1\x85\x8f\x6e\x40\xc1\x49\xd4\x80\x31\x3c\xec\x82\xd2\xb8\x91\x35\xd0\x30\x26\xe9\x1b\xc4\xe6\x5e\xeb\xec\x16\x28\xff\xb0\x71\x76\xa9\x6e\x2e\xc6\xc5\x11\xa2\x80\x79\x91\x57\x07\x27\xa8\x6b\x0d\xd8\x9a\x31\xb6\xfd\x1c\x42\x4f\x0a\x23\x8f\xf4\x5a\x09\x98\xbd\x8a\x83\x6b\x59\x33\x29\xc2\xb5\xee\x9e\xfa\xd0\xf9\x5e\xea\x1a\xba\x2c\x5b\x3b\xf4\x43\xce\x38\x87\xac\x05\x15\x7c\x0f\xd6\x36\x9d\xf9\xf1\x10\x7a\x22\x7a\xb1\xd5\xdb\x91\xd9\x6a\xde\x1c\x93\xd9\x9c\x59\x65\xf7\xab\x32\x01\x5c\xe1\xa0\xc8\x62\xff\x7f\x55\x38\x30\x7b\x12\x7a\xc0\x33\x0d\xf8\x4a\xf7\xc5\x84\xdb\x5b\x99\xb5\xae\x5a\x1d\x6d\x58\x11\xf1\x30\x83\x44\xba\x5a\xe8\x7d\xab\x26\xe2\x7d\xab\x86\x6d\x38\xb5\x6d\x78\xaf\xd6\x9b\x78\x1d\x07\xa6\x03\x5b\xd2\x4a\x8d\x25\xf6\x42\x9f\xcf\x43\x9b\xeb\x35\x0a\x05\xd6\x84\x8d\xd5\xb5\xe3\xce\x98\x58\x8d\x12\x5f\x3a\xf3\x95\xf9\xae\xb0\xaf\xcd\xf6\xe4\x7b\x8a\xd9\x95\xad\x1c\xa1\x29\x3d\x6e\xfb\x38\x72\x3e\x9e\x84\x28\xc6\xfb\xfb\x32\x05\x55\x55\x26\x33\x27\xe9\xc4\xe3\x4e\xf5\xb2\xd7\xf1\xbd\x6f\x7f\x17\x20\xee\x0d\xcb\x33\xe1\x0d\xcb\x17\x03\x65\x4b\xe9\x0e\x1b\x16\xd9\x39\x7e\x85\xd9\x9c\x46\x56\xc0\x89\x95\x24\xbf\x23\x4f\x14\xbf\x14\x3f\x3c\x98\x33\x9c\x3e\x9e\x32\xac\xbf\x9f\xe8\xdf\x9e\xb9\xda\xf1\xd8\x1a\x0d\xaf\x23\x1d\x64\x39\x38\xe3\x74\x7b\x29\x46\x38\xc2\x70\x29\xff\x60\xf0\x92\x5f\x40\x23\x02\x97\xe2\xff\x49\x59\xcd\x5e\xc1\x15\x5e\xe0\x1c\x08\xf0\x81\x84\x5b\xa5\x85\x91\x3d\x5a\xf3\x38\x05\xea\x5a\x8b\x44\xfa\x07\x89\x4f\x3c\x4e\x4e\x01\x18\x5c\x8a\xcc\x22\xd8\x67\x63\x72\x0a\x00\x18\x2c\x45\x15\xe6\xcb\x62\xe5\x95\x2a\x46\x2f\x52\x5b\x89\xc1\xf3\x0d\x76\xe3\xc1\x73\x20\xb7\x3e\xf8\x43\x9f\xf9\x87\xfc\x8f\xe1\x86\x69\x94\x30\x0c\x16\x7e\x51\xf3\x43\x55\xdb\xfc\xe6\xc6\x93\x91\x0b\x5a\x9f\x94\x5b\xb0\x99\xac\xc5\x4f\x5c\x27\x15\x4c\xe0\x74\x77\xa9\x60\xde\x47\x49\x42\x99\xb4\x0e\xfe\x44\xe2\x81\xae\xbe\xce\x3d\xb4\x21\x26\x28\x78\xfd\x9c\x2d\x63\xac\x93\x89\x6e\x12\x19\x1a\xae\xa0\x5f\xb8\xef\xdf\x3b\xf7\x5d\x6c\xe6\xbe\xc9\xd3\xec\xe7\x17\x5f\xa7\xb4\xc6\x7d\x0f\x85\xd6\xfb\xc8\x70\x47\x7d\x79\x34\xec\xd3\x20\xb9\xb1\x87\x15\x03\xc6\x6b\x3c\xae\x2a\x9c\xf0\xad\xe9\x75\x70\x62\x42\x9f\x7d\x04\x6b\xaa\x76\x57\xed\x0e\xc7\x5e\x9a\xd1\x10\xe7\x39\x8e\x6c\x95\x78\xa5\x78\x3f\x6a\x51\x7c\x1f\x1a\x2e\x4c\x0e\x59\x84\x3b\xa3\x09\x43\xb1\x35\x7a\xc5\x82\xc9\xc1\xdf\x87\x63\x2f\xb7\x06\xdb\xaa\x32\x1f\x42\xcf\x44\xd9\xe7\xf3\x56\xaf\x9a\x06\x00\x1a\x0e\x97\x2f\xad\x87\xc2\x8a\x4f\x25\x49\x44\x42\xc4\x68\xc6\x99\x55\xa5\xf0\xe3\x2d\x88\x36\x4f\xe7\x8c\x17\xc9\xfb\x48\xff\x3a\x95\x98\x7f\x60\xf7\xf8\x00\x8e\xef\x7f\x25\xb4\xf6\x9e\x8a\x9d\xaa\xd1\xf5\xc0\x42\x57\x8e\x63\x1c\x5a\x6b\x20\x18\x35\x3d\x40\xfb\xab\x8b\xcb\xae\x67\x5e\xd3\xba\xe3\x89\xb5\xfb\x81\xd5\x5e\x08\xc3\x5e\x77\xc9\x38\x0e\x6b\x79\xdf\x1a\x58\x37\xd7\xf9\x01\x73\xca\x5a\x5b\x53\xad\x20\xc4\x28\xe4\xfc\xa8\x0c\x1b\xdb\x47\x59\x86\x96\x5a\x2d\x28\xb4\x85\xd3\x64\x2b\xb5\xe0\xfa\xeb\x60\x1d\x8f\x1a\x06\x7e\xde\xf4\xef\x4e\x6a\x5a\xc2\xd6\xf3\x62\xb8\xc4\x95\xcc\x6d\x52\xdd\xd3\xe2\x37\x8c\xf1\x94\x59\x1f\xf9\xcf\x52\xf0\x20\xe6\xa4\x18\x46\x24\x57\x7c\x08\xbf\x35\x46\x0c\x5a\x23\x1f\x11\x28\x23\x20\x8c\x12\x28\x16\x56\x30\x26\xb1\xcd\x98\x90\xa9\x7f\x87\x5c\x5d\xdd\x21\x2a\x41\x9a\xd6\x38\xf2\x65\xd1\xf7\x04\x19\xe4\x34\x63\x4f\x96\x3e\xb3\x89\xb1\x48\x1b\x57\x65\xa2\xa3\x01\xf6\x45\x86\x53\x88\x82\xc4\x07\xf2\x6f\x05\x61\x55\x8d\x69\x44\xa0\x38\x82\x23\xe1\x0d\x34\x67\x8b\xf8\x04\x4d\x31\xf0\xcf\x58\x86\x92\x9c\x8f\x76\x24\xfe\xe2\xe4\xcb\x3f\x4c\x2f\xe1\xdd\x15\x2d\xd3\x4b\x70\x06\xe4\x0c\x46\x64\x1c\x9f\x42\x73\x08\x47\x67\x77\x57\xfc\x4b\xd9\x43\xac\x77\x77\x85\xca\x33\xa8\x8f\x9b\xc2\x9e\xe9\x59\x7b\x89\xf8\x04\x94\x25\x00\x65\x4b\x09\xd6\x28\xfd\x80\x97\x1c\x93\xe2\xeb\x63\x6b\xec\x4d\x96\xee\xce\x1d\xb2\xbf\xef\xb3\x63\xc1\xda\xa9\xc4\x76\x0c\x04\x41\x50\x7d\x20\x90\x81\x11\x0e\x82\x80\x80\xd2\x3d\xb8\x26\x06\xa7\x58\xe5\x6a\x48\x22\xc0\xa2\x0a\xb1\xde\x56\xe4\x63\x57\xfb\xdb\x4e\x95\xe1\xd8\x08\x48\x9b\x35\xb4\x68\x33\x3c\x00\x91\xad\xab\xcd\xeb\x6d\x1a\x64\x09\x8e\xe3\xad\xf5\xc3\xeb\x21\x39\x1d\x23\x9b\x1d\x0c\xd7\xb1\x83\x05\x0c\x77\x67\x07\x19\xa5\x31\x23\xed\xf9\xb8\x7e\x17\x46\x49\x0f\x9e\x3f\x7c\xfc\xe4\xe2\xf2\x7e\x0b\x2f\x60\xdd\x68\x12\x2f\x0a\x19\xd6\xad\x36\x3c\x95\x2f\x32\xc2\x39\x8e\x24\xb5\x0b\xcd\xb0\x0a\x47\x8a\x21\xb8\xdf\xa5\x9a\xa1\xee\xd3\x9a\xc3\x2b\x1c\x59\xbc\x82\x7e\x3d\x7f\xe0\xde\x68\xea\x0d\xd0\x79\x2b\xfe\x0a\x3e\x92\xf5\x1f\x8a\xcb\x32\x23\x38\xd7\x57\xe4\x43\xf9\x08\x5a\x2c\xc4\x07\xe7\x6e\x7d\x28\xaf\x71\x7c\x69\x5d\x9d\xf5\x7b\xe9\xa1\xf3\x62\xb9\x49\xa5\x25\x4c\x83\x0c\xae\xbe\x95\xec\x07\xb4\x6e\x37\xf5\x20\xcb\x89\x37\xff\xdd\x62\x05\x2b\xae\xb3\xf6\x9b\x4e\x1a\xc8\xf2\x35\x08\xaf\x77\xd1\xa9\xb5\xfd\x95\xec\x8c\x1a\xc3\x39\xff\x22\x86\x7d\x11\xc3\x7e\xef\x62\xd8\xe5\x93\xc3\x90\xfc\x85\xfc\x9e\xc4\xb0\x87\xce\x95\x71\xce\x8f\x4d\x58\x93\xc4\x7a\x95\x08\x45\x42\xce\xc5\x48\x05\x3e\xf4\xac\x82\x9c\xa1\xd9\x0c\x37\x1e\x64\x6e\x51\x7a\x8b\x7f\x87\x92\x9b\x32\x30\x7b\xa8\x7a\xd1\x18\x6e\x31\x2e\xfb\xdc\x65\x39\xe8\x5d\xf6\xd5\xd4\xae\x71\xd7\x9d\x6f\x21\xd4\xc1\x30\x58\x89\x78\x95\x23\x4f\xc6\x0d\xef\x87\x24\x0b\x63\x2c\x9f\x15\x20\x49\xa6\x74\x24\x92\x71\xd5\xbe\x97\x30\x32\xcd\xaa\x20\x93\xaa\xb6\x57\x0a\x49\x31\xbd\xb9\xa4\x28\x5f\x5d\x2c\xa9\x50\x7e\xb8\x96\x5c\xc8\xc8\x02\x4b\xc6\x68\x94\x68\x21\x71\x7b\xc1\x90\x4f\x88\x06\x96\x5c\xb8\x97\xec\xef\xfb\x34\xa0\xd5\x2d\x21\xe5\x63\x14\x1c\xc2\x3c\xb8\x33\xd4\x77\x1d\xed\x14\x1b\xf7\xd0\xfe\xfe\x9d\x7c\x7f\xff\x15\x62\xf3\x01\x9a\xe4\x3e\xed\x23\xf0\xb7\xfb\x87\xc7\x79\x70\xe7\x70\x94\xef\xef\xfb\x1c\x0e\x30\x74\x36\x3f\xee\x0f\x1f\x8e\x0e\x61\x1a\xc4\x7e\x52\x17\x37\x7b\x28\xa0\xf0\xba\x32\xa7\x94\x37\xe1\xdd\x55\xa1\xc4\x4e\xbe\xe1\x46\xe1\x98\x88\x4c\xcd\xa7\xd0\x10\xaf\x51\x64\xbe\xd9\x74\x6b\x94\x8b\x90\xa3\xea\x13\x8e\xbc\x91\xe7\x29\xd1\x95\xcb\xaa\xa2\x45\xd9\xc3\xe7\x38\x61\x52\x66\x4d\xbf\xc8\xac\x7f\x40\x99\x35\x5d\x2f\xb3\xa6\x5b\xc8\xac\xd2\x7a\xf0\x4b\x08\xca\x5f\x3c\x04\x65\x1b\xea\xdb\x02\x50\xbe\xa7\x93\xc1\x2a\x95\xf1\xf3\xb5\xb1\xa7\x8e\x2b\x69\x7e\x47\x18\x45\xfa\x47\xf9\xab\x86\x8b\x5c\x1b\x0b\xb2\x75\xbb\xc9\x48\x90\xcd\x10\x8c\xef\xe9\xa4\x23\xe4\xa2\xb2\x61\xb4\x43\x2c\x3a\x08\xaa\xa2\x28\x5a\x5f\x6c\x24\x35\x03\x25\xea\x14\x05\x26\x66\x9c\x8b\xf3\x66\xb0\xc4\xcd\x61\x07\xdb\x1a\xeb\x10\x82\x55\xeb\x67\x18\x59\x81\xf1\xec\x61\xb6\xc6\x0e\xfc\x12\x7d\xee\x4b\xf4\xb9\xdd\xa2\xcf\x09\x51\xa2\x4f\x0b\x96\x93\x08\x77\x24\x8c\xae\x2a\xdc\x6a\x12\xec\x5f\x21\x6e\x89\xcc\x26\xda\x4f\x68\x84\x9b\x89\x0f\xb7\x49\x78\xb8\x53\x16\x42\x4b\xbf\x73\x81\x98\x90\x3e\x4c\x8d\x05\xb9\x24\x49\x7e\x70\x41\xd8\xdc\xca\x07\x7f\x4e\x72\x32\x21\x31\x61\xcb\x7e\x84\x99\x0e\xc3\xd4\x11\x47\x65\xe7\xdc\x85\xf2\x2e\x75\x72\x82\xec\x35\x63\xe5\x7d\x0e\x66\xbf\xb3\x2f\x1a\xaf\xdf\xbb\xc6\x8b\xb3\x4c\xcb\xc0\x17\x66\x78\xc8\xcd\x15\x58\xc8\xaf\xb5\x5c\x81\x8d\xd3\xdd\x4c\x16\x18\xca\x28\x81\xe2\x38\xbe\xc5\xb1\x64\xe3\xe7\x24\xad\x85\xf3\xce\x75\x66\x0d\x6a\x73\x5b\x1c\xac\xf8\x4d\x73\x22\xb3\x89\x15\xb9\xe0\x6e\xd2\xa0\xf0\xfd\x45\x9d\xa7\xf2\x89\x9b\xca\xdf\x18\x62\xe9\xcc\x45\xcd\x48\x10\xad\x71\x20\xe6\xf5\x24\x75\x2a\xda\x1e\x24\x02\xd1\xd0\x67\x81\x18\x98\x07\x48\xe2\x4b\x1e\x08\x7c\x22\x2e\x58\x0f\x44\x91\x32\x95\x41\xa3\x2b\xad\x5b\x72\x4b\x69\xdd\xea\xec\x1d\x9f\xea\x1e\xde\xdf\xc7\x26\xa9\xd3\x80\xcd\x71\x22\xf3\x30\x4a\xa1\x51\x0c\xcf\xa4\x76\xc2\x70\x78\x78\xc8\xaf\x85\xb2\x22\xad\xdf\xa3\x24\x8a\x45\x10\x1c\x32\xf5\x23\x1a\x0a\x4c\x0f\xe6\x24\x8a\x70\x02\x2c\x18\x56\x62\x37\x91\x88\x6a\xd5\x3a\x94\xee\x4e\x9d\xb8\x39\xed\x90\x61\x33\x9c\x4e\x6d\xfd\x95\xf1\x67\x6d\xd7\x69\x33\x50\x2b\xc7\xb4\xf0\xdb\x69\xdf\xa1\x8a\x28\x7a\x51\x86\x88\xe0\x2e\x83\x20\xc0\xc7\x9e\xe2\xb3\x19\xbe\x64\x3d\x2b\x85\x49\x82\x63\x32\x23\x93\x18\xb7\x57\xbb\x40\x99\x80\x31\xf2\x44\xf0\xb2\xd6\x3a\x4a\x3d\x35\xf2\xbc\xb2\x84\x93\x60\xe6\x2f\xda\xf2\xe1\xdd\x56\xae\xe5\xa9\xdb\x81\xda\x9f\xe3\xf0\xa6\x90\x1d\xb8\x6d\x8b\xb0\x5d\x8a\x8a\xcd\x60\x00\x5c\xd8\x92\x7c\x1a\x2c\x38\x67\x97\x8a\x7f\x2d\x6e\x6e\xb9\x25\x7f\xb3\x53\x1c\xe1\xdf\x63\xfc\xc6\x90\xa6\xcb\xbe\x52\x9d\x6f\xc2\x42\x5b\xb2\xe9\x9b\x28\x29\x60\x5e\xb1\x54\xc5\xe7\xa8\xa6\x08\x8d\x9a\xa2\x7e\xbb\x5a\x38\x55\xda\x08\xd2\x96\x5a\x96\xd5\x52\xbe\x8a\x04\xed\xca\x29\x1b\x40\x9d\xf4\x95\x54\x49\x5f\x8f\xf0\x7d\x37\x93\x2c\x56\x6a\x82\x12\x70\xce\x48\x38\xbb\xf0\xc9\xfa\xad\xca\x8b\xae\xb8\xb8\x9b\xe2\x2b\x15\x3a\x1d\x54\x4c\xd2\x09\x45\x59\xf4\xce\x4a\xdd\x5a\x58\xd9\xa8\xf4\x68\xac\x88\x4c\xea\x3d\x07\x6b\x6f\x73\x2b\x2a\x53\xfe\x9b\x8d\xca\x54\xc2\xa8\x26\xc5\xa7\x2d\xf3\x58\x08\x1d\xc1\xe4\x66\x61\x96\xe6\xae\x7a\x60\xd2\xc1\x82\xcf\x39\x0b\x3e\x51\x2c\xf8\xbc\xce\x82\xdb\x3f\xe1\xdc\x65\xc1\xe7\x9d\x2c\xf8\xfc\xea\x6a\xee\xb2\xe0\xf3\x3a\x0b\x3e\x0f\x16\xbb\xab\x07\xb8\xbc\xa4\xd5\x03\x73\x00\xa7\x16\x0b\x3e\x77\x18\xe4\xb9\x62\xc1\x6b\xdf\x8f\xe7\xcd\xd5\x99\x1a\x16\x7c\xbe\x9e\x05\x77\x7b\x68\xdf\x60\x7c\x88\x73\x3e\x3d\xa5\x63\x0b\xe6\x8e\x8a\xc0\xce\x03\x69\x59\x37\x6d\x22\xa6\x11\xca\x0f\x50\x18\xe2\x54\xc4\x94\xff\xbd\x5a\x2c\x9d\x14\xf7\xf0\xbd\xbf\x4f\xfe\xee\xfa\x0e\xea\x60\xc8\xe6\xe1\x32\x42\x79\xdf\xa0\xa3\xcb\xf6\x68\x81\x48\xd2\xe2\x2a\xaf\x8b\xe7\xf7\xed\xc2\xb7\x38\xa4\x8b\x05\x4e\x22\xf9\x90\x5d\x03\xde\xea\xc8\x77\x64\x35\x7e\xdc\x4b\xf0\x45\x8f\xef\x62\xde\x96\x4e\x85\x57\x50\xef\x3d\x9d\xf4\x38\x4f\xd9\x4b\xe8\x45\x6f\x82\x7b\x11\x4e\x63\xba\xc4\xd1\xa0\xdd\x8d\xaf\xf1\xc1\xbc\xfa\x1e\x8a\xf7\xe6\x39\x0e\x3f\xd4\x5e\x24\xdb\xc2\x8a\xc8\x40\x45\xd5\x83\xeb\x0e\x6f\xa9\xf6\x16\xfb\x95\x6c\x85\xf8\x10\x22\x32\x9d\xe6\x7d\x41\x29\x6e\xdb\x38\xc8\x51\x0d\x65\x38\xa7\x45\x16\xe2\xbc\x2f\xfa\xec\x8a\xab\x78\x5b\xfb\x3f\xde\xbc\xff\xa3\xc7\x47\xcb\x87\x97\x0f\xde\x3b\x66\x23\x9e\xc4\x86\x31\x1e\xb1\x51\xb4\xc1\x35\x92\x4d\x68\xb4\x5c\x73\x08\x58\xb6\x2e\xb0\x8c\xa7\xfc\x2a\x55\xf1\x53\x19\x6f\x7f\x9d\x6d\x81\xc7\xec\xf3\x28\xec\x49\xe0\xd8\xb3\x72\xfd\x19\xb3\xf3\xde\xab\xef\x3f\x5e\x1f\x92\xcc\x41\x68\x01\x23\x4f\xd6\x03\xb3\x1c\x44\x39\xfa\xec\x69\x3d\x23\xd3\x29\xe6\x5c\x27\xde\x66\x3c\x6d\x20\xb4\xe1\x87\xdc\x47\x3a\x43\x68\x4e\x66\x09\x8e\x9e\x89\xaa\xa7\xb7\x04\x59\xe7\x13\xdc\x04\xbc\x9b\x6e\xed\xb6\xe4\x86\x2c\xb6\x92\xc2\xc6\x14\x84\x8d\x90\xb6\x5d\x4a\x0b\x63\xe4\xb3\x01\x53\x99\xdd\xcb\x8e\xfb\xc3\xee\x52\x62\x67\x73\xaf\x06\x8b\xed\x1d\xdf\x60\x2f\xfd\xa9\xf7\xa9\x76\x53\x8a\xb3\x10\x27\xec\x13\x6d\xa7\x4d\xd0\x37\x5d\x59\x1b\x9c\x8a\x75\xcc\x9e\x1d\x5c\x89\x9d\xbb\xa0\xeb\x46\x92\x82\x08\xed\x30\xb6\x11\x00\xaa\x67\x0a\x7e\x4b\x9b\xc8\xd5\x96\xdb\xa4\x18\x1e\x1c\xc2\xea\x4b\x56\x63\x07\x72\xab\x04\x5f\x86\x71\x11\xe1\xa8\xce\x30\x68\x25\x91\xda\xf3\x55\x97\x48\x76\x23\x06\x22\xb2\x12\x47\x38\xd6\xae\xa6\xd6\x76\xed\x68\xa0\x32\x13\xab\x36\xa5\x1d\x18\xaf\xca\xc3\xf7\xcd\xe1\xb1\x47\x12\x7e\xaf\xe4\xd8\x1b\xe1\xbf\x1d\x1e\x7b\x11\xd6\x3f\x3d\xcf\x4a\xac\x4e\xd7\x19\x24\xc4\x90\x6e\x7c\xbb\x91\x8b\x92\x2f\x88\xb0\x1f\xfc\xb4\xd7\xb3\xf5\x72\x13\xd3\x10\xc5\xfd\x9c\xd1\x0c\xcd\x6a\x21\xeb\x85\x1d\x99\x78\xd9\x75\xde\x67\xb6\x0b\xb8\x52\x29\x09\xa2\xcf\xe9\xdd\x25\xfd\xf2\xee\xf2\x7b\x7f\x77\x91\x2c\xe3\x62\x33\xcb\xf8\x5f\x7f\x79\xfb\xe4\xbf\xfe\x72\xf8\x3f\xeb\x44\xa6\xca\x72\x97\xcb\x4d\xe6\xfc\x5a\x86\xb0\x87\xf2\x28\xc7\x28\x11\xd4\xec\xc7\x24\xc2\x59\xce\x28\x95\x81\x24\x0a\xfb\xa7\x63\x97\xeb\x55\x41\x00\xd7\x02\x71\x6c\x8a\x87\x5a\xfe\x92\x16\xb5\x0d\xfb\x64\x1c\x3d\x2e\x18\x5d\x20\x61\x61\x1c\x2f\xed\x18\x8d\x1d\x12\x5b\x45\x96\x5a\xae\xa2\xd6\xa0\x8a\x36\x8a\xba\xb8\xa1\xb5\x42\x62\x57\x97\x2e\x14\x5b\x54\xfc\x81\x13\x39\x2d\x16\xb2\x1e\x4a\xd3\x78\xd9\x63\x73\x9c\xe3\x9e\x96\x47\x7a\xe1\x1c\x25\x33\xfe\xbb\x76\xc3\xb8\x62\xe3\xba\x5e\xde\xd1\x5e\xc2\x0f\x58\x8f\x5f\x33\x0e\x9c\xde\x94\x66\x52\x40\x65\x28\xff\xd0\x9b\x65\xb4\x48\x7b\x68\x86\x48\x02\xf9\x8c\xf8\x69\xed\x45\xcb\x04\x2d\x48\x28\x86\x47\x54\x5a\xc9\x9c\x7c\x24\xc9\xac\x47\x12\x3e\x5c\x21\xdc\x8a\xfd\x4d\x44\x82\xad\x2e\x7e\xb3\x31\xdc\x36\xe4\x0b\x4e\x45\x9a\xe3\x35\x43\x04\xb5\x9b\x7d\x4b\x41\x48\xfe\x36\x4f\x27\x9d\x06\xdb\x47\xb6\xc1\xb6\xda\x66\xd5\xa6\x16\x2f\x62\xb6\x39\x7c\x35\x02\x7b\x0f\xaf\xe1\xb8\x94\xc5\xf9\xda\x08\xcb\x24\x49\x0b\xa6\xa3\xc5\x08\x61\x5e\xdc\xa0\x86\x21\x13\x5b\xe9\x45\xf2\x6e\x8e\xbf\x2b\x58\x91\xe1\x2a\xe4\x0b\x4d\xe4\x86\xa8\x8c\xcd\x85\x01\x7a\x4b\x13\x09\xce\x36\x09\x17\xe8\x10\xbd\x4d\xe8\x65\x97\xa9\x37\xff\xe7\x19\x4d\xfe\xdf\xff\xfd\xff\xb1\x5e\x3e\xa7\x17\x72\x77\x88\x2d\xb1\x7b\x64\xd0\xd3\xa6\x12\x42\xd8\x77\xd7\x82\xfa\x09\x8b\x0a\x46\x67\xb3\x18\xf7\x55\xd8\xbf\xed\x79\x42\x75\xe8\xd6\xb9\xec\x4e\x54\x58\x99\xcc\x8a\x1c\x23\x00\xd6\x4f\xf0\x33\x92\x2f\xf2\x1c\xc5\xd6\x32\xc3\x3b\x43\x00\xf3\x1b\x04\x96\x89\x94\xda\xba\x9d\x12\xc2\x42\xbd\x1d\xeb\x6a\x6d\xab\xa8\x62\xd1\x94\x6d\x94\xd0\xb7\xed\x72\x55\x05\x7f\xb5\x40\x49\xc1\x4b\x9f\x69\xe4\x08\x54\x94\x8d\x3d\xae\x5b\xb7\x0e\x2e\x50\x8c\xa7\x3b\x20\xb8\x5d\x87\x52\xbf\x5d\x04\xa9\x9f\xdb\x6f\x6d\x1d\x78\xb8\x79\x20\x92\xd0\xed\xa9\xf5\x40\xc4\x03\xc1\x23\xe2\xe8\xda\xdd\x35\xac\x9d\xee\x0c\xcb\x12\x40\xa7\xf3\xd6\x5b\x0b\x8e\xe9\xd6\x66\xc6\x9b\xa1\x01\x98\xd7\x1e\x28\xeb\x4d\x9a\xf4\xec\xda\xbd\x37\x41\x39\x5d\xe7\xb6\x56\x6f\xb2\x4e\xa8\x58\xc0\xc9\x56\x42\x05\x56\x51\x2d\x3f\x85\x33\xe0\x3a\x91\x40\xf1\xcf\xb7\x96\x34\x85\x6e\xe6\xd8\xce\xef\xe1\x97\xd9\xbf\x86\x27\x5b\x29\xb9\x25\x5e\xdc\x9b\x65\x33\x07\xb3\x15\xff\x52\x01\xef\xba\xa6\x8f\xda\xee\xb4\x77\x73\x9c\xe1\xde\x05\xff\x8f\x80\x90\x6b\xbf\x14\xce\x1e\x58\x1c\x43\x3e\xda\x8a\x13\x48\x33\xec\x68\x28\x86\x0d\x05\x44\x1b\x84\x16\x1d\x39\x8a\x71\xc6\xd6\xea\xc8\x3b\xd1\xb7\x81\x07\xd9\xcc\x81\xc4\x2a\x5a\x5a\x07\x0b\x32\x6c\x61\x41\x14\xc1\x5a\xc3\x7f\xbc\xfe\x80\x96\x5b\xaa\x5e\x84\x13\xb2\x5e\x51\x47\xfd\x2f\x2e\xdc\x6d\x2f\x58\x01\x63\xdd\xe5\x8a\xd6\x25\xd8\xa9\xcf\x69\xeb\xdb\x4a\x5e\x1e\x79\x2d\x0d\x4d\x11\xb8\x18\x82\x61\x60\x05\xa3\x8d\x36\x9a\x51\xc7\x2d\xd7\x43\x45\xd2\xd2\x5a\x6f\x0b\xf7\xc5\x34\xea\x10\x9e\x17\x5c\x78\x8e\x94\xf0\xbc\xa8\x0b\xcf\xf6\x4f\xb8\x70\x85\xe7\x45\xa7\xf0\xbc\xb8\xba\x5a\xb8\xc2\xf3\xa2\x2e\x3c\x2f\x82\x70\xf7\x17\xd3\x1c\x16\xe6\xc5\x74\x01\x60\x6a\x09\xcf\x0b\x47\xb4\x5d\x28\xe1\xb9\xf6\xfd\x78\xd1\x14\x9e\x53\x23\x3c\x2f\xd6\x0b\xcf\x6e\x0f\xed\x34\x96\x0f\x71\xc1\xa7\xa7\x84\x67\xf9\xc8\x64\x19\xc8\x5a\x57\x0d\x5a\x77\xd5\x50\x88\xb6\xba\x6a\xea\xe2\x50\x1f\x85\x21\xcd\xa2\xed\x53\xad\x5e\xf3\xf6\x69\x57\x5a\x75\xdb\xbd\xd8\x2e\xec\xe2\xc3\x35\xdf\xaf\xa0\xc9\x23\x2e\xaf\xba\x2f\x56\xc7\x5f\xb4\x5f\x9f\x89\xf6\x6b\xb9\x99\x97\xba\xff\x7f\x5e\xb3\x87\xef\x86\xff\xb2\x79\x29\x4b\x1b\xc5\x85\x59\x5b\xf9\xe4\x99\xcc\x02\x42\xe1\x64\x79\x87\x77\x11\x85\xde\x84\x5e\xe2\x48\x67\x63\x76\x34\x66\x61\x4c\x73\x11\x23\xe2\x14\x5a\x7f\x9f\xd6\xfc\xc4\x75\x5d\x29\xfa\xd6\x9d\xee\xc7\x63\xef\x5b\x79\x84\xb5\xdb\x74\x4b\x34\x94\xa1\xe1\x0a\x3c\xa2\x34\x69\x9b\xd2\x41\x1d\x09\xb7\xf6\xd7\xa9\x4c\x3b\xd0\x92\x64\xa3\xf2\x00\x47\x09\x59\xc8\x29\x87\x34\x61\x88\x24\x38\x53\x3a\x8a\x2a\x08\x81\xa9\xf3\x54\x57\x39\x59\xe3\xa2\xdf\x95\xbf\x21\x2f\x16\x22\x0e\x29\xf4\xbe\x55\x8c\x00\xff\x93\x03\x8d\x63\x94\xe6\x32\x72\xca\x07\x92\xbe\xc5\x39\x96\x33\x93\x41\x68\x1c\xb5\xa0\xf6\xa5\x3f\x52\xf8\x17\x7e\xfb\x2c\x2b\x70\x2d\x66\xcb\xae\xf9\xa1\xbe\x32\x30\xe7\x18\x89\x3e\xcc\xb8\x25\x23\xf7\x52\x6b\x78\xc4\xfa\x3f\x6c\xc1\xf3\x29\xf4\x4e\xe4\x76\xdb\x3a\xef\x44\x83\xff\x8c\xf1\x74\x63\x1e\x2e\xc5\xef\x3e\x3a\x15\x9b\xca\x71\x52\x6f\x0f\x06\x60\xf5\x39\xac\x49\x03\x4a\xdf\x58\x17\x0b\x5a\x35\x5d\x2e\x08\x31\x5c\xa1\x3a\x74\x79\x77\x38\xf6\x18\xca\x3f\xfc\x5d\x94\x41\x2f\xa9\xb2\x4e\x6c\xcc\x30\xb1\x0d\x8a\xf4\x55\xb7\x46\x07\x5d\x7f\x37\x15\x6f\x67\xee\x39\xe8\xee\x64\x6d\x86\x15\x7b\xf2\xfa\xf6\xad\x19\x48\xbc\xf9\xb1\x13\x7b\xbd\x46\x76\x8e\x0d\xd6\x02\xdb\x0c\x42\x3d\xdb\xde\xc2\xe3\xf1\xda\xe3\x52\x3b\x58\x1d\xd8\x36\x4f\xc9\xbf\x24\xc2\x5f\xe1\xc5\x35\x10\xde\x6d\x44\x71\x3b\x38\xdf\xfa\x55\x7d\x6b\xb4\x77\x54\xd4\x1f\x9b\x29\xeb\x9a\x39\xed\x8e\xda\x6a\x18\x72\x61\xd3\x67\xe4\xc6\xa5\x8a\x49\xce\x6c\x3e\xd9\xd3\x81\x3b\x6a\x3a\xdd\x16\xde\x3a\x44\x19\xa7\xf2\x45\x12\x0b\xcb\xd6\x5d\xad\xd1\xba\x2e\xe5\x75\xc2\xe9\x79\xe0\x87\xd2\x6d\xa8\xcb\x2c\x5a\xdd\xd4\xc1\x9d\x43\xa5\xd8\x6c\xbf\xde\xa4\x6f\x93\x15\x48\x42\x45\xe6\x30\x21\xb8\xf5\x68\x9e\xc7\x58\x38\xaf\x48\xbb\xff\xef\x65\xb8\x8e\xf4\xf2\xac\xb2\xb4\xa6\x95\xa5\xf5\xf0\x10\xec\xd4\xab\xa7\x7b\x3d\x4c\x2f\xbd\x56\x88\xb9\x71\x72\x62\x38\x67\x24\x99\x1d\x1f\x8e\x1e\x3c\xd4\xdd\x5c\x20\xc2\xbf\xbd\xa3\x6f\xe4\xf5\x19\x70\x44\x81\x41\x94\xd1\xd4\x07\x30\xba\x81\x9e\xbb\x72\x45\xaa\xf7\xe0\xc1\x54\xa9\xb8\xe7\xc6\xba\x5b\xb2\x46\x70\xe1\x14\x74\x31\x16\xc6\xc1\x4a\x57\x34\x0c\x83\x76\x78\xd2\xdc\x54\x15\xa6\xc2\x59\x8d\x00\x77\xcd\xff\x50\x98\x5e\x70\xce\xb0\x52\xe8\x56\x3a\x0a\x75\x0a\x06\x24\x7f\xa3\x63\xad\x5c\x5d\xb5\x42\x2a\x6d\xfb\x92\x9a\x57\x52\x0d\x90\xb9\x0b\xf7\x2c\x1b\x94\xc2\xd8\xa0\x60\x88\x07\x21\x2d\x12\x06\x9b\x4d\xbb\x6d\x50\x74\x8d\x4e\x5b\x94\x12\xa6\xc1\xcc\x8f\xea\x2e\x39\xee\x3a\x7d\x3a\xdd\xf8\xc2\xed\xdc\x6c\x81\x4f\xd7\xe7\xc4\xed\xb3\x73\x77\x7d\x8a\x31\xb8\xc7\x56\x24\x6e\x12\x7e\x51\x51\x8b\x5e\xff\x76\x3c\xa3\x6a\x90\x8d\x7c\xb1\x4b\xba\xa6\x76\x08\x00\x46\xb6\xb2\x3f\xb2\x95\xfd\xe7\xeb\x34\x30\x4b\x78\x7e\x1d\x0d\x8c\xbc\x25\x3e\x69\xca\xf4\x6d\x4c\x86\x36\xea\x57\x3a\x55\x33\x8e\x02\x47\xaa\x6b\x36\x68\x63\x60\x28\x95\x17\x96\x3f\x00\x9c\xc1\x25\x3c\x87\x17\xf0\x23\x7c\x0f\x2f\xe1\x6b\xf8\xa6\xd2\xd0\x7c\xf8\x9c\x34\x34\xaf\xbe\x68\x68\xfe\x18\x1a\x9a\x93\xcd\x1a\x9a\xbf\xe7\x4f\x8a\xf9\xec\xc9\xcb\x0e\x0d\x8d\xf0\x0c\xcf\x99\x98\xc3\xd3\xca\xbd\xaf\xae\xb2\xe9\x7c\x1d\xb3\x5b\x37\xd4\x16\x76\x61\xb7\xc2\x42\x48\x33\x8f\x6a\xf1\x68\x05\x27\xeb\x6d\x1c\xa2\x13\x9d\xb6\xa2\xed\x9e\x79\x57\x73\x74\x17\x6f\x32\xba\x20\x39\xe6\x72\x77\x2c\x03\x0e\x1a\xb3\x29\x9d\x88\xb6\xa1\xc4\xe8\x56\x60\x3c\x68\x13\xb8\x5d\xcc\x0d\xeb\x98\x93\x13\x3c\x52\xf2\x54\x93\x0a\xb7\xaa\xae\x78\xc9\x8b\x86\xfa\xaa\x86\x49\xf7\xd5\xf1\xa8\x5a\x27\x46\xd3\x1e\x3d\xe7\x74\x18\x5f\xf4\x48\x92\x48\x72\x69\xa9\x9a\x76\xd2\x46\xb8\x1d\x61\x14\x29\x30\xa2\xb3\x6d\x3a\xea\xb2\xf1\x92\x59\xbd\xe2\xa2\x2b\x4f\x6e\x43\x10\x14\x69\x46\xd7\x2a\x3f\x64\xfe\xcd\xcd\x2a\x90\x5b\x54\xaa\xac\xb5\x53\x9a\x3f\xa8\x66\xca\x61\xe4\x29\xaa\xcb\xd3\xeb\x06\x66\x1a\xf4\x1b\xe6\x4e\x3f\xe8\xa2\x51\x87\x34\xde\xd4\x3e\xe9\x69\xbd\xa7\x93\x1f\xaa\x91\x6c\x3b\xa5\x1d\x6d\xcb\xc4\xfd\xbd\xd5\x2e\xdc\x90\x84\x56\xda\xb1\x43\xef\x5b\x87\x37\x17\xbc\x41\x3b\x33\xee\x59\x39\xa1\xeb\xe7\x54\x7d\x74\x41\x59\x45\x9d\x20\x5b\x08\xc5\xce\x48\x49\xb8\x14\xcf\xc8\x39\xde\x1d\x31\x75\xcb\x00\x4d\x27\x0c\xc0\x6d\x3c\x08\x36\x8d\x6e\x81\x48\xd2\x39\x30\x61\xb9\xd8\x97\xf6\x63\x6b\x2c\x06\x0f\x2d\xcf\xa9\x35\x96\x79\x4c\xea\x7c\x37\x64\x00\x6e\xb8\xcd\x38\x7a\x30\x2e\x51\xbe\x13\x23\x7a\x1c\xc7\xef\xf4\xd0\xda\xb4\x60\x5d\xbe\x36\xef\x50\xfe\x61\xb3\x36\xcb\x71\x40\xd1\x46\x74\x71\xed\x40\xca\xfe\x7b\x8f\xd5\xd7\x6b\x00\x0c\x71\xbc\x2e\xe5\x75\xfd\x88\x88\xb0\xb4\x47\x0f\x4c\x24\x5e\xdd\xff\xd3\x37\x3f\xb6\x5a\x9f\xa2\x38\x16\x4b\xa8\x10\xe4\x7d\x6b\x82\xf0\x42\xfe\xf7\x33\x69\x85\xaa\x1e\x08\x24\x2c\xfb\x69\xe4\x91\x75\x39\xa1\x38\x7e\x9a\x16\x0a\xf1\x26\x90\xaf\xae\xf9\x97\x8e\x9a\xa6\x87\xd6\x10\xc8\x6b\x6a\x1b\xc8\x5f\x35\xf3\xc9\x33\xbd\xfa\xce\x71\xfd\x8e\x66\x6f\x8d\xee\xf2\x54\x6b\x89\x4d\xe0\xf9\x4d\x29\xc8\x9d\xc5\xb2\xa2\xf7\x72\x32\xdc\xbf\xc8\x50\x9a\xd6\xcf\xea\x26\x35\x74\x57\x16\x67\xa7\xaf\x5f\x6b\xd7\x48\xf5\xe9\x2f\xb0\x71\xa4\x13\xe1\x96\x7b\xc7\xae\xbc\xd5\xf6\xe9\x68\x70\x1b\x3b\x48\x82\x7e\xf5\xe4\xd3\x6e\xa3\x4d\xca\xf5\x9d\xb7\x51\xdb\xeb\x5b\xe7\xa6\xf2\x42\x1a\xe7\x29\x4a\x3c\xe8\x1d\xdd\x16\x95\x74\xb7\xe7\x56\xef\x35\xdb\x81\x6a\x22\xcb\x51\xc2\x6f\x38\x5a\xeb\x19\xa7\x56\x3f\x5e\xcf\x89\xf7\x7e\x68\x07\x7c\x3f\xb4\x76\x2f\x3f\x31\x72\x1f\xbe\xa5\x17\x79\x73\xd3\x8a\x0a\x03\xc1\x54\x76\x3c\xda\xa8\x47\xf3\xa1\xc5\x0a\xf1\x36\xfc\x9c\x55\x79\x2f\xe4\x53\xd3\xb7\xe6\xf5\xe3\x5b\x15\x6c\x8a\xff\x29\xb1\xd6\x64\xed\x75\x30\x73\x01\xcd\x3a\x1c\xc3\x23\xfb\xf4\x89\x2e\xde\xd9\xb3\x78\xa1\x12\x78\xc0\x5a\xc2\x10\x13\x65\x9d\x0f\xc5\x0a\xba\xbe\xd0\xde\xc2\xad\x87\x4f\x77\x79\x7f\xbb\x2e\xed\xbe\xea\x3d\x0f\xcd\x11\x76\x27\xda\xe0\xd7\xe4\xe8\xec\xf6\x9b\x5f\x79\x6e\xc9\xc3\xe2\x1a\xec\xde\x5a\xc3\x47\x9d\x60\xf4\x54\x06\xe3\x8f\x0c\x0d\xae\xe4\xc7\x24\xa1\xec\xb1\x08\x2d\xe0\xad\x09\xab\x3f\x7c\xd0\x62\x23\x89\xaa\x66\x8e\xd8\xa9\x01\x76\xe1\xea\x46\xd6\x9a\x6d\x43\x51\x06\x84\x6d\x63\x79\xa6\x8b\x6e\x63\x8d\xce\x71\x5f\xf0\xb7\xae\x24\xd8\xe4\x6e\x1b\xcd\xb9\xb0\x6d\x81\xd8\x6a\x85\x6b\x27\xfc\xa1\x75\xc2\xeb\x51\x79\x6c\x85\x00\x4d\x97\x4f\xa4\x59\x04\x49\x3e\x28\x93\x97\x4d\xf7\x8f\x77\xba\xb5\x94\xec\xb4\x3c\xd8\x12\x4e\x17\x84\xe6\x2d\x55\xe7\xde\x1f\x36\x6f\xa4\x2d\x37\x10\xff\x23\xa4\x8b\x14\x85\xac\x97\x16\x71\xdc\xcf\xc4\x57\xf3\x18\xa5\x44\x94\x1d\xf6\xd9\xc3\xb5\xc9\x20\xf8\x3f\xda\x5e\xa6\x89\x94\xcd\x0f\xc8\xed\x9b\xb1\x5b\x9d\x72\xbd\xad\xd4\xb0\x3b\x6f\x12\x55\x77\xb5\x7a\xac\xeb\x56\xdf\x34\xe4\x0e\x59\xff\x26\x87\xe0\x96\x04\x7e\x67\xc6\x96\xb6\xaf\xe5\x72\xf1\x5c\x7d\xdc\x0d\xf4\x00\x9b\x91\x56\xc4\x8e\xa0\xbd\x3d\xba\xb6\x66\x3a\xb6\x9d\xe4\xa6\x5c\x5f\xf6\xb8\x63\xb2\x46\xb8\xb0\xa8\xd8\x23\x6b\x05\x8d\xd9\x08\xe7\x50\x64\x00\x93\xff\x16\x6f\x02\xf6\xa2\xe2\xc8\x7c\xcb\x19\x92\x6f\x50\xe6\x22\x53\x93\x7a\x24\xc3\x8f\x18\x2e\x5c\x7f\xab\x01\xb5\xbe\x9f\xbb\x1f\x24\x64\x9b\xc9\xd1\x22\xc6\xa3\xad\x96\xda\xf0\xfa\x2d\x2b\xde\x45\x04\x1e\x6d\xa6\x02\x5d\x1b\x66\x1d\x4d\x51\x04\xb5\x6e\x37\x62\xc2\x3d\x30\x67\xd1\x65\xb6\x35\xd7\xda\x2f\x73\x99\xc1\x9a\xcd\x89\xfd\x98\x17\xd2\x24\x44\xac\xcd\xde\xa4\x16\x2c\x48\xf1\x5e\x22\xf7\x4c\x24\x9e\xf3\x78\x35\xa4\x03\x38\xb7\xe7\x9e\xe1\x50\xc4\x6d\x2b\x83\xd5\xe2\x9f\x3d\xe8\x2d\x0a\xe3\xa3\x58\x0b\x62\xd8\x6a\xe2\x32\x47\x62\x34\x24\x11\xeb\x96\x5f\xd7\xb8\x25\x44\xd9\x5a\x8f\xc6\x9f\x02\x5f\x84\xc3\x2d\x3a\xed\x5a\x5a\xdf\x29\x02\xaf\x8a\x1a\xa6\x8d\x47\x8a\xca\x78\x24\x6c\x31\x1e\xa9\x82\x01\xda\x5e\x1b\x26\xb0\xaa\x2a\xcb\x70\x8e\xd9\x0b\xab\x4b\x1f\x58\x86\x25\x69\xe7\x50\x65\x1e\x93\xa6\x07\x08\x2e\x03\x31\x3e\x61\x1f\xa1\x1e\x4a\x44\x9a\x73\x39\xb9\xd6\x17\x14\x6d\xe4\xd1\x31\xf3\xca\x3d\xbb\x04\x60\x0f\x5f\x5d\xf9\x3b\x60\xe0\xc6\x28\x58\x74\xa0\x00\x83\x55\xcb\x44\xd9\xfa\x89\xb2\xb5\x13\x55\xce\x73\xd2\xb3\x93\xff\x1d\xe0\x01\xa3\x27\x22\x81\x9d\x18\xd3\x4d\xe7\x32\xd9\xd2\x4e\x68\x7d\x14\xe5\x0f\xca\x9a\x27\xa3\x05\xc3\x99\x31\xe6\x31\xdf\x5b\x54\x79\x70\xde\xac\xd3\xa2\xb5\x81\x33\xb7\x5a\x97\xf8\x06\x97\xcd\xd8\xcd\x58\x9a\x0c\xfd\x02\xe1\x9b\xf5\xf0\xf8\x61\x97\x86\x62\x1e\x3c\x77\x86\xde\xfe\xdc\x08\x2f\x9c\x6a\x6a\xcd\x3f\x3a\x9f\xdb\x5f\x1a\xe1\x7b\xa7\x1a\x4d\x1e\xa7\x69\x4c\x38\x55\xb8\x6c\x14\x3d\xab\x02\xbc\xbc\x6e\x14\x3e\x97\xfd\xbe\x51\x86\x58\x33\xcc\x7a\x2d\xc8\xb6\x32\x03\xf0\xdd\x55\x57\x40\x8c\x95\xc5\x56\xfb\x12\x9d\x3a\x30\x1d\x50\x2d\xcd\x04\x78\xd1\xca\xbc\x40\x6c\x67\x92\x05\x59\xc0\x0f\x21\xfa\xc4\xd6\x58\x90\x04\xac\x0a\xfd\x03\x93\x80\xd5\xe2\xfa\x40\x7e\x5c\x45\xaf\xdf\x0c\x8f\xbd\x1e\x4a\x7a\x68\x36\xcb\xf0\x0c\x31\x11\xbe\x67\x8f\x4c\x7d\x72\x75\x95\xe8\x19\xc5\x01\xf9\xdb\xe1\xfe\x7e\xf2\xb7\xc3\xab\x2b\xf2\x0d\xff\xeb\x9b\x43\x95\xab\xcb\xe3\x8b\xba\x24\xc9\x4c\x44\x68\x90\xa9\x8a\x70\xd4\x50\xa4\x5e\x90\x38\xf6\xb4\x39\x46\xbc\xbf\xef\xd3\x7b\xc1\x59\xef\xee\xea\x9d\x4f\x40\xd9\xbb\xbb\xca\xca\x33\x00\xc9\xfe\xbe\x1f\x5f\x5d\xb5\x96\x89\x6f\x7f\xcb\x59\x46\x93\xd9\x37\x77\x57\x72\x72\x68\x92\xd3\xb8\x60\xf8\xb1\x1e\xfc\x33\x32\x9d\x96\x3d\x3a\xed\x3d\x7d\xf3\xe3\xdf\x0e\x54\x6d\x09\x39\x91\x9d\xf2\xc9\x46\x1e\x80\x89\xdb\x57\xb2\xa6\x2f\x85\xba\xee\xee\x64\x05\xbb\xc7\x61\x10\x68\x14\x1f\xf3\x6e\x07\xde\x48\x80\x45\x61\x46\xf3\xdc\x82\xae\x2a\x95\x3d\x2b\x0e\xbd\x01\x34\x38\x83\xfe\x21\xcc\x2d\x2b\x2f\x0a\x4a\x15\xd7\xdb\x13\xdb\xaf\xbe\xcd\xad\x3d\x58\x59\xbf\x6c\xdc\x57\xc6\xdc\xc4\x67\x90\x80\xe0\x1b\x11\x60\x3c\x09\xf0\x58\xc6\xf9\x15\x5a\xba\xd3\xbd\xe4\xea\xca\x4f\x82\x95\xd3\x76\x34\x3e\x85\xbc\xd2\x48\xd6\x2d\x61\xbd\x55\x90\x40\x36\x48\x8b\x7c\xee\x27\x00\x98\xa0\x9c\x42\x09\x1a\x04\x01\x19\x68\xe6\xd6\x58\x2a\x8e\xb3\x63\xa1\x49\x1b\x19\x05\x9a\xdb\xe5\x88\x54\x69\xcd\x5a\xac\x28\x3b\x4e\xc4\x40\x33\x4b\x7c\x53\xc1\xec\x38\x69\x20\xa1\x48\xf2\x39\x99\x32\x9f\x80\x51\xb3\x50\x4c\x81\x00\xc8\x4a\x00\xc7\xa7\xc0\xd8\x73\xba\xaf\x6f\x6b\x89\x90\xca\x78\xf7\xcd\x50\x92\x9b\x96\xd7\x9e\x75\xe6\xa1\xee\x90\xa6\x24\x66\x38\x7b\xb2\xf4\x3d\x4b\xdc\xe0\x88\x05\xaa\x1f\xdd\x4b\xdb\xa3\xc0\x8d\x3b\x32\xcf\x01\xb5\xde\x6c\xb5\x9b\x4b\x44\xb7\x59\x24\x09\x2a\x68\x21\xa0\xee\xa0\xec\x4e\x6b\xaa\x21\x97\x0c\xcb\x9b\x7f\x50\x64\xf1\x77\x34\xf3\x3d\x9a\x32\xb2\x20\x1f\xf1\xc0\xc8\x10\xcd\xbe\xf2\xb8\x98\xc1\xd5\xcf\x05\xce\x96\x6f\x50\x86\x16\xf9\x68\x65\x0c\x11\x46\xcd\xea\xb6\x39\x41\x59\x02\xb8\xa2\x19\x99\x91\x64\xc4\xca\xe0\x82\x24\x11\xbd\x18\xe8\x83\xad\x76\xf9\xd9\xdd\x15\x2b\xef\xae\x70\x79\x56\x6e\xf1\xfa\x22\x8c\xd3\xf8\x49\xdf\xd3\xc7\x06\x1f\xab\x38\x72\x0d\xe6\x25\xb8\xd3\x51\x00\x59\xd0\x51\x02\x46\x06\x58\x93\xcb\xa9\xe0\x35\xcb\x2c\x90\xcd\x42\xd0\x82\xd6\xad\xe6\x0a\x19\x28\x91\xde\x3f\x32\x3c\x38\xa3\x19\x7e\x6a\xb8\x17\xbf\x0d\x74\x8e\xf8\xfd\x6b\xe5\x84\x50\x89\x27\x14\xc7\x51\x71\x9e\x00\x72\xfe\x5e\x95\x0a\xbe\xa2\xca\xde\x00\x00\x18\x84\x88\x85\x73\x29\x03\x90\xa9\x7f\x47\xb0\xd3\x11\x89\x9e\x8a\xc4\x0d\x80\xd7\x61\xf3\x8c\x5e\xf4\xb0\xc8\x9a\x98\x2f\x93\x50\x47\x64\xea\x1c\xae\xc9\x64\x81\x2e\x10\x61\x9b\xa9\xf1\xde\xf6\xc7\x85\x53\x25\xc9\x35\xe6\x7e\x2b\xca\xbb\xf0\x62\xd8\xad\x4f\x84\x19\x7e\x2c\x1b\xb6\x70\xb6\xe1\x72\xbe\xc6\xcb\xa1\xe2\x54\x85\x4b\x43\xd9\x22\x27\x58\x1e\xfe\xc6\x7f\xef\xea\xca\x5f\x23\xb0\x28\xdb\x46\x4b\x5e\x51\x86\x8d\xa5\x6d\x6a\x66\x6c\xfb\xb1\x36\xe9\x2f\x1b\xeb\xe9\x0e\x32\xb0\x1b\xd4\x3d\x32\x4a\x38\x0d\x5e\xf9\x13\xdb\xe2\x59\x0b\x22\xe3\xec\x96\xf2\x60\xcc\xdd\x1e\xda\x44\x9a\x4f\x62\x02\x7f\xc8\x89\xdd\xac\xa5\xfb\x36\x69\xe9\xd3\x8d\x60\xd9\x18\x41\xa7\x20\xf6\x29\x06\xd1\x13\x83\x38\x77\x07\x61\x8b\x5b\xb7\xd0\xad\x5a\xec\x0b\xb7\x9b\x0e\xc9\xed\xf6\x7a\xfc\xe8\xf6\xa8\xa3\xe6\xdc\x5a\x0f\xef\xdd\x1e\x3a\xe4\xc9\xdb\xeb\xd1\xe9\x6f\x1b\x0b\x88\x5d\xe2\x1a\xed\x0c\x1c\xc0\x89\xed\xfc\xd0\xd8\xce\xe2\xcd\xf1\xda\x23\x50\xed\xd7\x77\xa2\xdf\x19\xaf\xdd\x8b\x06\xe0\x74\x73\xe9\x2e\xae\xa5\x05\x18\xdf\x78\x21\x5f\x37\xa1\x5b\x8a\x84\x71\x7a\x53\xf8\x6f\x9a\xf0\x95\x2e\x62\xbc\xb8\xe5\x4d\x58\x33\x78\xbe\xf6\x2a\xd4\xa0\x38\x4b\x31\x01\x95\x6b\xc7\x3b\x37\x96\x2f\x8a\x22\x6f\xe4\x71\x76\xc1\x8e\xdd\xfb\xd3\x3a\xcf\x9b\x13\xf8\xd3\xb5\x3c\x6f\xa4\xf2\xfa\x97\x8f\x7b\xa2\xea\x64\x45\x12\x53\x9a\x5a\xfe\x3a\x42\x67\xe9\x41\x2f\xba\xdf\x17\xa9\xcd\xe5\x9f\x32\x77\xf9\xce\x01\x4e\xe0\x7c\xaf\x1e\x35\x44\xd6\x20\x81\xed\x83\x82\xc1\x1e\x99\xfa\xad\x2b\x7b\xb2\x5c\x4c\x68\x9c\xab\xac\x4b\xed\xd1\x86\x54\x1d\x0e\x86\xed\xef\xfb\x49\x90\x28\x19\xcd\x72\x18\xa9\x22\xf2\x6c\xda\x40\x7c\x8c\x96\x7f\x4b\x09\x00\x80\x44\xb0\x96\x03\x11\x29\x54\xf8\x9e\x28\xa5\x43\x8f\x54\x1e\x37\x4b\x91\xe9\x95\x66\x3e\x1f\x29\x0b\x86\x7f\x65\x7f\x33\x8a\x57\x25\x9e\xfd\x95\xdd\xbb\xa7\xe7\xcf\xb7\xfd\x9d\xc0\xd4\x18\xb3\xd3\x63\xfb\xc7\x68\x55\xee\xb1\x3f\x1d\x1d\xcf\x14\x5a\xb8\xb0\x7d\xe7\xb0\xcd\x57\x87\x81\xd5\x85\x5c\x8a\x31\x3b\xe5\x3b\x70\xb4\x61\x86\x79\xab\x66\x95\xe0\xdc\xc7\x9b\x4e\x57\xee\x13\x00\x46\xd6\x98\x3a\x06\xd4\xad\xba\xdd\x84\x7d\x02\x19\x10\x79\xea\xf4\x69\xac\x10\x7c\xfe\x39\xf9\x5f\x5d\xfc\xb2\x19\xaf\x4c\xbf\x1f\xbf\xf8\x7d\xfd\x31\xfc\xbe\xde\x6f\xf6\xfb\x5a\xfc\xd7\xf7\x14\xfd\xfc\xdd\xb9\x93\xca\x44\x98\x9d\xaa\x7c\x25\x55\xf4\x1d\x71\x0f\xf5\xda\x2e\xa7\x9e\x6d\x7e\x95\x49\x5b\x0f\x93\xdf\xa1\x8a\xb4\x63\x1b\x1e\xd0\xe4\x2d\xce\xc9\x47\x6c\xdb\x69\x35\xa3\x4c\x77\xd7\x12\x2e\x60\x0b\x5a\xe4\x78\x41\xcf\x71\xd5\x7f\x8e\xd9\x4b\x3c\xc3\x49\xf4\x86\xe6\x44\x9b\xf5\x75\x35\x8d\x31\x3a\x77\x02\xf6\x3a\xe6\x86\x0f\xac\xc1\xe4\x73\x7a\x21\x61\x5b\x30\xc5\x73\xb8\x6b\x5e\xec\xfa\x5c\x69\x43\xa5\xfc\x7c\x56\x59\x29\xc9\x6b\x5d\xd9\xe3\xcd\xb5\xe0\xa3\x8d\xb7\x78\xa1\x92\x86\x3a\x30\x28\xc4\xec\x93\xf3\x99\xf2\xa5\xef\xf0\xf9\xaa\x59\xe1\xc8\xee\xa5\x45\x09\x09\x69\xd2\x53\x51\x40\x64\x04\xe3\x4b\xcb\x9b\x4e\xc6\x23\xbc\xac\xc2\x1b\x2f\x1b\x85\xcb\xaa\xf0\x82\x44\x6c\xde\xa8\x20\xbf\x9a\x4a\xee\x14\x55\xad\xb9\x35\xc9\x76\x13\x3a\x13\x4d\xe7\xa1\x1d\xa9\x49\xb6\x36\xf6\x49\xcd\x88\x3a\xeb\x6d\xfa\x98\xb2\x96\x6b\x89\x5a\x52\x47\x85\x2e\x92\xb1\x85\xba\x70\xe2\xd6\x5a\xae\x9f\x50\x47\x2b\x39\xa8\x4d\xd3\x70\x5c\x5a\x42\xcc\x25\xda\x8e\x18\x52\x5e\x4c\x12\x5c\xcd\x53\xd7\x55\xb3\x1c\x7a\x2e\x14\xf1\xb1\x9a\x60\x5b\x85\xa5\x55\xe1\xf2\xa8\x0d\xc2\x91\x05\xa1\xad\xc2\xf2\xc8\xc6\xce\x36\x81\x6c\x8e\xea\x26\xc1\xae\x79\xb0\x36\xdb\x39\x99\xa3\x14\x6f\x63\xae\xa4\x0f\xa4\xd9\x05\x15\x95\x13\x80\xa4\xf3\x9c\x22\x6b\x47\x70\x2c\x2b\x42\x2f\xb4\x89\x9a\x70\x8a\xc0\x97\xac\x8f\x92\x70\xce\x45\x1c\x4f\x90\x06\x79\xa0\x2f\x1b\x6d\xf5\xc6\x79\x64\x36\x8e\x55\xb8\xb4\x4f\x79\x45\xa0\x14\xc6\xf4\x84\xbf\xb6\x27\x8c\x99\xd4\x14\x49\x92\xf4\x56\xc5\x50\xab\x83\x55\x3e\x80\x0d\xff\x87\x2e\x42\x68\xa2\xae\xb7\x42\x5f\x67\xf4\x58\x6d\xec\xd6\xee\xb7\x37\x7c\x1b\x0a\x9b\xa3\xb6\x55\xb1\x96\xa3\xb6\x0e\x0e\xba\x33\x29\xd0\x58\xe8\xb6\xc8\x93\x55\xc1\x26\x4f\xf5\x35\x51\x15\x96\x55\xa1\x4d\xbb\xac\x1a\xf3\x06\x81\xfe\x4c\x96\x6e\x0d\xf2\x0d\xc1\xd8\x01\xf9\xc3\xaa\x50\x34\xb7\xa8\xc8\xa3\x8a\x8a\x58\xc5\x4b\xab\x58\xd3\x10\xbb\xf5\x91\xd5\xba\x59\xac\xe9\xc7\x67\x8a\x72\x1d\xe8\xa9\x3d\x60\x97\x8a\x5a\x77\xbf\xe6\x3e\x2e\x38\x2b\x7e\x57\xbf\xad\x36\xb7\x63\x7f\xe9\x1e\x1e\x95\x84\xce\x5c\xf0\x8f\x6a\xb7\x9a\x0b\xac\x7e\x08\xdc\x1a\xcb\xd6\xb3\xe4\xd6\x72\x0e\x94\x7b\xdf\xdb\x55\x9b\x07\xc7\xe6\x6c\x48\x7e\x32\xa7\x17\xc9\x56\xdb\xd6\x8a\x50\x4d\xe3\xe5\xac\x66\x63\x6c\x31\x37\x0f\xeb\xc3\x78\x97\x11\x94\x48\x2b\xc4\xdc\x0a\x3a\xf0\x90\x43\x21\x09\xcb\xbd\xce\xea\xaa\xbc\xf5\xfe\x72\x07\x65\x9d\x26\xc3\xf2\x25\x33\x9c\xf7\xec\x55\x71\x46\xf6\x92\x24\x38\x37\xf1\xd9\xea\xc3\x53\x47\xed\xd0\x39\x57\x22\x34\x41\x34\xc3\xef\x48\xf8\xe1\xdf\xce\xc1\x3a\x74\x4e\x51\xad\xee\x6d\x1d\x23\xef\x07\x7c\xe1\xfd\x52\x74\x6a\x03\x6e\x3d\x87\x26\x35\x10\x2b\x9f\x9a\x51\xec\x6c\xfc\x2d\x70\xb9\x0b\xb8\x4f\x8a\xee\x2a\xc3\xe3\x2f\x8d\x72\xcd\x2f\xb5\xa2\xbc\xc6\x0b\x89\x9b\xa3\x7e\x88\x24\x91\xb5\x10\xa6\xea\x36\xaf\xf1\x35\x6d\xd6\x10\xab\x66\xe5\xdb\xe2\xaa\x3e\x2d\xc6\x1d\x03\x71\xd5\xd7\xf6\x01\x38\xbb\xd6\xa5\x97\x88\x63\xb9\xc3\xda\x68\xa2\xb3\xf5\xc2\xe8\x06\x9b\x57\x45\xd7\xbc\xb5\x25\xf9\x64\x34\xc7\x59\x8e\x1f\xf0\xc5\x4e\xb1\x50\xeb\x82\xa5\x5e\x0a\x3b\x1c\xe5\xc3\x4e\x74\xea\x5a\x5d\x52\x66\x7b\xdd\x2e\x59\xb3\x29\x6f\xb6\xb7\x6f\x93\x3a\xbb\x3c\x15\x6a\xae\x05\x1d\xc1\x2d\x1a\x52\xe7\x47\x9c\xd1\x36\x99\x73\x56\x30\x86\xb3\xff\xe1\x6c\xc3\x4b\x11\x53\xb7\x4d\xee\x6c\x50\x63\x47\xec\xec\x06\xb2\x86\x06\x37\xf3\x2b\x75\xfa\x56\x28\x27\xec\x87\x75\x35\x58\x9f\x51\x1a\x33\x92\x3a\xb1\xa6\x6b\x2a\x22\xfd\xae\x2e\xfc\x0e\x90\xf6\x5c\x3f\x75\x19\x12\x05\x69\x7d\xf0\x23\x8e\x54\xea\x3a\xed\x6f\x2b\x1a\xd3\x8c\xe1\xe8\x44\xf9\xb5\x6c\xf6\xe4\x71\xfc\x78\xc4\xcc\x1f\x5a\xce\x44\xc3\x86\xff\x50\x83\xa9\x7e\xc0\x99\xf5\x3a\x37\x6d\xb0\xb1\x7e\xaf\xda\xb1\x6c\xd6\x25\xec\xaa\x6f\xee\x7a\x7f\x9b\x7c\x6e\xd6\x74\xa9\xdc\x81\x6a\x4e\x71\x0f\x2c\x37\xa1\x76\x40\x6d\x27\xa5\xe9\x34\xdc\x18\x45\xbb\x6a\x47\x65\x09\x31\x7e\x3a\xb9\x54\x6a\xd8\xbe\x4e\x50\x88\x64\x96\x33\x4e\xcd\xe5\x46\x9a\xd0\xf5\x33\xa9\x39\x55\x2e\x32\xc6\xc1\x46\xba\xcd\x98\x94\x23\xc2\x8d\xa7\xdd\xe9\x66\x9a\xd8\x51\x61\xf1\xcf\xd7\x76\x9a\xe1\x07\xa6\xc3\x6b\x06\x5e\x06\xab\x05\x49\x46\xde\x2b\x92\x78\x70\x81\x23\x82\xf8\x0f\xf1\x7f\xfe\x5b\xfe\xe2\x7f\xa7\x5f\x7f\x3d\xf2\xbe\xfe\x9a\x0b\x1f\x0b\x74\x39\xf2\x5e\xa1\x4b\x0f\x2a\xaf\xae\x91\xb9\xa0\xa1\xe5\x2c\x36\x12\x77\x44\x09\x5f\x07\x26\x92\xe7\x40\xbe\x51\xfa\xde\xbd\xc1\xe1\x9f\x3c\xe9\xb3\xf3\x26\xf0\xc3\x1b\x44\x58\x3d\xd7\x11\x56\xa5\x60\x14\x29\x5b\x7c\xfd\x59\x4b\x41\xa9\xf3\x3d\x17\x12\x8e\x09\xb6\x6a\x7f\x56\x04\xc4\xc4\x57\xd5\x65\xe2\x4a\xfb\x57\xe5\x91\x71\x5e\x73\xa3\xa8\xce\xa0\x71\xc7\xb8\x50\x15\x5c\x12\x09\x1f\x1d\xb5\x16\xbe\x95\x43\x7d\x78\xd8\x5a\xaa\xec\x3e\x1d\x60\xf7\xdc\x8f\x02\x48\x05\x80\x6f\x33\x6d\xd5\x73\x34\xac\xbe\x33\x12\x7e\xe0\x37\x91\x2e\x1b\x3e\xac\xca\x34\xb5\x36\xed\xee\x57\x65\x52\x89\xc8\x4b\x5f\x4f\xa7\x39\xe6\x93\x71\x0b\xff\xad\x46\x5a\xef\x42\x0e\xd4\x6d\x2e\xbf\xd6\x3b\x3c\x38\x6a\x0e\xe5\xdf\xc3\x1d\x80\xb6\x34\x3f\x5a\xd3\xbc\xde\xfb\x26\x90\xe6\x0e\xd7\xd3\xac\xfa\xa8\x2a\xf1\x83\xa3\xb1\x37\x78\xf4\xe7\x96\x6e\xaa\xba\xe9\xd7\x5f\x9b\xaa\x0f\xbe\x5a\x5f\x77\x81\x2e\xab\xba\xeb\xab\xd6\x04\x67\xdd\xa8\x15\xdb\x83\x87\xca\xfc\x31\x7f\xa1\xf2\x23\xb7\x19\x42\xdb\x0e\x9c\x7f\x63\xcd\x14\xd0\xca\x39\x54\x05\xfc\xb5\x1f\xa1\xda\xa0\x69\x52\x7a\x5c\x45\x42\x90\x76\xca\xd5\x20\xec\x74\xcd\x55\xaa\x66\x39\xd2\xd0\x32\x67\x5b\x5d\x8e\x0e\xe1\x72\xa4\x1d\xb4\x2a\x85\xfe\x60\xd9\x97\x20\xcd\x11\x38\x38\x82\x82\x4c\x8c\x8e\x0e\xa1\x32\xe1\x74\x6a\xc0\x84\x53\xd6\xc6\x48\x50\x96\xd1\x8b\x7e\x91\x7a\x23\xf5\x67\xc4\xa9\x47\x29\x8d\xea\x2b\xcd\xb7\x0f\x56\x64\x2a\x6d\x3a\x45\x3f\x8e\x61\xb7\xbc\x49\x84\x51\xf7\x02\x5d\x7a\x40\xdb\x23\x5b\xdf\xd3\xaf\xbf\xf6\x84\x2b\x8c\x5b\x9f\xd3\x60\x00\x93\xe0\xe8\xa1\x71\x92\x18\x70\xc6\x71\x70\x79\x2f\xf9\x06\xab\x3f\xf7\xf7\x7d\xf5\xa7\xa0\xa7\x81\x27\x3c\xed\x39\xc0\xaa\x2e\xab\xea\xb2\xf5\x75\x8f\xfe\x5c\x83\x5c\xaf\x3d\x27\x51\x84\xf9\x90\xc6\xe2\x89\xf7\x54\x59\x03\x8c\x4f\xcb\x6a\xd4\x58\xcf\x9f\xd9\xe6\xf1\x1c\x5d\x63\x7c\xaa\x27\x79\x79\x12\xa2\x18\xfb\x8c\x4f\x8e\x7f\x18\x9f\xdd\x5d\xe1\x52\xae\xc6\xd9\x29\xcc\x02\xd2\x20\x71\x9c\xee\x29\x2c\xac\xc4\x70\x46\x18\xf2\xb1\x8d\x56\x82\x07\x19\x5d\x72\xf0\x97\xa3\x4c\xef\x8a\xfa\xa1\xef\x3f\x84\xb2\x91\xe7\x95\x90\x33\xca\xa3\xd5\xe5\x90\x57\x1e\xb6\xd5\x86\x97\x47\xbc\xec\x68\x64\x91\x85\x7f\xf7\x8f\x4a\x7e\xd1\xb1\xd1\xea\x72\xd4\x36\x38\xb8\x54\x26\xea\xf5\xa3\xd6\x4f\xc0\xc1\xd1\x3a\x3a\xe8\x74\x2d\xf7\x2a\xd1\x5b\x35\x29\xe5\x86\x9b\x20\xd9\x93\x73\xae\x44\xed\xbe\x3b\x1c\xd1\x62\x4e\x66\x73\x9c\x89\xf3\x59\x35\x7a\x85\xd8\x7c\xb0\x40\x97\x7e\xfb\x19\x6f\x4b\xf3\xae\xce\xb8\xca\xcb\x8e\x2e\xc9\xa2\x58\xfc\xab\x0b\xa2\xd5\x29\x14\x49\x46\x67\x98\x01\xdf\xd9\x08\x50\x9e\x84\xab\xab\x1f\x8a\xc5\x04\x67\x83\x57\x2f\x7e\xf8\xe9\xe4\xf1\x77\xcf\x7f\x7a\xf1\xc3\xbb\xe7\x7f\x7f\xfe\x56\x76\x15\xd3\x8b\x8e\xe1\x93\xe4\xba\xc3\x57\xfb\xae\x66\xe1\x2d\x8c\xa9\x5e\x92\x04\xa3\x0c\xf8\x60\x10\xd1\x05\x22\x89\x3f\x56\x46\xd8\x7a\xc2\xa7\x60\x90\x71\xa9\xf2\x2d\x2d\x92\xc8\x94\xea\x55\x39\x75\x87\xdc\xb6\x56\xad\x97\xb8\x3e\x09\xfc\xef\xaa\x39\x70\x57\xf0\x5a\xf0\xac\xf6\x2a\x07\xbf\xd8\x80\x6d\x5b\xe8\x98\x1f\x87\xf6\x5d\x3d\xac\x9d\x02\x7e\x34\xd6\xec\x3c\xc1\x88\xb8\x27\xa7\x94\xc6\x84\x32\xe1\xb2\x45\xab\x2b\x6a\x2e\x0e\xb2\xf6\x1b\xb1\x17\x51\xd6\x3e\x16\x45\x23\x11\x49\x0a\xb6\x9f\xbe\xfe\xd0\xdc\x07\xba\x57\x79\x2b\x69\x05\xb8\x33\x6b\x8b\xd0\xeb\xf3\xec\xac\x9e\x06\x57\x71\x23\xea\x6c\x2a\x32\x4d\x2f\x92\x63\x17\xcd\xff\x53\x21\xc5\x81\x36\xaa\x5f\x3e\x75\x1a\x51\x1a\x9a\x62\x81\x75\x01\xb4\xf6\xf5\x4b\x0e\xb2\xc2\xa7\xe6\x30\x5c\x27\x26\x0b\xa9\xc3\x51\x7f\xb8\x27\xfd\x81\x34\xda\x03\x77\x4c\x56\xf5\xd6\x31\xb6\x2e\x4b\xe3\x9e\xde\x01\x59\x2b\xa1\xd8\x1f\xb9\xe9\x2b\x58\x86\x92\x9c\x0b\x29\xa3\x9e\xf8\x33\x46\x0c\xff\xcb\xbf\xbb\x62\x65\x7a\x09\xce\x00\x94\xcf\x0f\xa3\xb3\x4a\xf6\x3c\x84\xda\x09\x44\xec\xb5\xc1\x72\x58\xae\x2b\x94\xc8\x6e\x61\xce\x0e\x8e\xac\x76\x77\x57\xf8\xcf\x6b\x2a\xee\xd6\xe5\xbd\x2d\xba\x3c\xb3\x96\x54\xa8\xd6\xd7\x9c\x11\xad\xe0\x1d\x75\x9c\x96\x12\x0a\x30\xa3\x5d\x51\xbc\x61\x9b\xb6\xf7\x25\x96\xa5\x2c\x47\xcd\x51\xb9\xed\x6f\x69\x58\x5b\x6d\x2f\x3d\x2c\xeb\x9c\xe0\x4b\xe6\x9e\x91\x4a\x94\xb8\x37\xfc\x0b\x64\xc1\x4a\xea\x7d\x47\xc2\x8e\x01\x76\x92\x22\x5c\x42\x52\xd5\xcd\x99\xb0\x4e\xee\x98\xb4\xac\x9e\x04\xaf\x7d\xbf\xfb\x42\xec\xb7\x5f\xa1\xe0\xa0\xe3\x3b\xcc\x82\xd5\xe5\xc8\xe7\x3c\x22\x19\x5c\x82\x83\x23\xde\x8b\xe4\xc0\x92\xba\x0f\x6f\xeb\xb6\x61\x6a\x21\x08\x54\x3a\xd0\x51\x66\xaf\x1f\x51\xc5\xcc\x2a\x96\x57\x56\x65\x93\xe5\xec\x4e\x83\xc8\x81\x86\x32\x58\xde\x93\x3e\xab\xb6\x76\xcf\x62\xcf\x2b\x39\x1f\xb4\xa6\xa6\x38\x8b\xf1\xb4\xf2\xef\x92\x92\xbf\xf4\xed\x12\x2c\x7f\xa5\xd1\xb3\x60\x56\x5c\x4d\xb5\xce\x4b\x7f\xe9\xaf\x4a\xe8\x96\xc3\x55\x09\x57\x5a\x79\xd2\xc1\xc0\xd8\x9a\x94\x35\xf2\x16\x68\x33\x1d\xc5\x60\xb0\x40\xa9\x08\x98\xe1\x1b\xa6\x98\x9d\x2a\x7b\x59\x3c\x66\xa7\x25\x00\x60\xc0\xe7\xf1\x64\xa9\xcd\x40\x41\xc5\xc3\xab\x17\x60\x1f\xac\x44\x1a\x9d\x04\x5f\x32\x20\xdd\xf1\xac\xf3\x10\xdc\x39\x2c\x01\x28\xb5\x8d\xa0\xf6\x33\x13\x97\x8e\x22\xf0\xc6\x3a\x4e\x79\x99\xc9\x3d\x29\x77\xaa\xe5\x8a\xd6\xa8\xa7\xae\x19\xc7\xc4\xce\xf8\xba\x55\xf5\x03\x5c\x36\x2c\x0e\xab\x6a\x66\x91\x4d\x1a\x23\xb9\x92\x01\x1e\xc4\x68\x89\xb3\x7f\x95\xcd\x07\x09\x2b\x59\x4e\xed\x7b\x80\xcb\xb6\xf7\x0b\xbf\xa3\xb6\xb2\x37\x2e\x61\x14\x7c\xf4\xc3\x5a\x8a\x19\xf5\x82\x7f\x6b\xce\x41\xa9\xdb\xc3\xfc\xd6\xbd\xb8\x16\x6e\x17\x4a\x7d\xf6\x29\x13\xd5\xb4\xf4\xa8\x35\x73\x9f\xae\xdb\xa9\xdb\xad\x56\xfa\xdd\x1e\x2e\xe7\x6e\x17\x0d\xfd\xe1\x2d\xfa\xc2\xd5\x7b\xd2\x86\x1d\xbb\x64\xbf\x69\x05\x00\x60\x68\x3b\xea\x38\xdd\x18\xab\xe1\x6b\xf7\x63\x20\xac\xef\xc8\x35\xc1\xbd\x76\x7f\x2e\xa0\x0d\xdd\x36\x6c\x9c\xaf\xdf\x71\x03\xd4\xc6\xae\xdd\x07\xd4\x9b\xf4\xed\xc2\x5a\xdf\x79\xeb\xfb\xed\xb5\xbb\x6f\x85\xe6\x0c\x20\xb4\xb3\x2a\xbd\x59\xe7\xdb\xf5\x1e\xbe\x01\x25\x00\x7b\x3b\xfa\x76\x89\x78\x66\xb7\xeb\xd9\xb5\x6d\x7e\xa4\x35\xae\x5f\x9d\x2e\x5c\xd2\x61\x44\xf8\x71\x55\x4e\x5b\xe1\xe7\xe4\x75\x13\x7d\xf1\x7e\xf9\x63\x78\xbf\xa4\x9b\xbd\x5f\xbe\xfa\x7e\xf2\x3a\xfc\xe7\xe1\x3f\x5b\xb2\x1e\xb9\x51\x6b\xad\x50\x43\x1e\xf4\xa4\xaf\x5e\x5b\x1a\x1f\x99\x7f\xa2\x35\x75\x0f\x3f\xea\xa7\x26\xbb\x4f\xd3\xd7\x45\xdc\x01\xcf\x64\xe2\xdc\x8d\xae\x1c\xac\x3d\x15\x86\x6d\xb1\xf0\x4b\xe5\xc6\x39\x58\xd7\x43\x6b\x88\xe4\x0d\x61\x81\x77\x49\x96\x53\x05\xc8\xdf\x94\x29\xa7\xca\x7e\xf3\xcb\x65\xbc\xd9\x76\xc5\x8c\x87\xcb\x91\x95\x86\x26\x2f\x26\x0b\xc2\xde\x91\x6d\x1d\x5c\xb6\xef\xac\x05\xfd\x22\xa2\xd6\x06\xd7\x93\xb5\x1d\xb8\x4e\x29\xeb\xb2\x3a\xd7\x8d\x92\xb6\x49\xac\xdc\xd8\x57\xdd\xe9\x7d\x37\xa7\x52\x6e\x8f\xbb\x7c\x83\xc9\x6e\x4a\xaa\x5c\x9f\xef\x96\x79\x8d\x77\x98\xf2\x56\x99\x8c\x6f\x7d\xd6\xd7\x5c\xe2\x5a\x28\x38\xaf\x2b\xd9\xf1\xaf\xbe\x2c\x37\x1d\xe6\x06\xe3\xb9\x96\x88\xbc\x4e\x68\xdd\x9a\x49\x8f\x34\x5b\xe9\x2f\x68\xc2\xe6\x7d\x76\xed\xf0\xb5\x19\xbd\x58\x17\xbd\x76\x11\xf8\xe8\x06\x96\x30\xa1\xb6\xc2\xe0\xab\x9d\x2b\x1b\x94\xd0\x58\x24\x48\xf4\x16\x2a\x24\x65\x75\xdb\x59\x5a\xc9\x04\x5f\xf4\x32\x13\xe7\xd1\x52\x5a\x35\x62\x42\x0e\x6f\x37\xf6\x23\xdb\xa1\xeb\x35\x65\x9f\x20\x2c\xa5\x8c\x6d\x15\xa6\x45\xb0\x92\x6a\x49\x6c\x05\xa9\xac\x28\x88\xfa\x5c\x7d\x80\x16\x2d\x50\x85\xd6\x17\xd8\xb2\xc9\x47\xcc\x01\xa1\xd4\x86\x72\xe5\xaa\xee\x6b\x51\x31\x6b\x23\x50\x25\x9d\x83\x50\xe5\x9b\xc7\xd1\x00\x54\x96\x25\xcc\x83\xc8\x47\xb5\xd0\x1d\x7c\x9f\x8d\xe9\x6d\xe9\x2a\x0a\x17\xbe\xde\xb2\xb7\xd7\x85\xd3\x81\xc5\xf1\xc1\x71\xbc\xb5\x14\xdb\x05\x03\x40\x64\xcb\xae\xc8\x96\x5d\x17\xeb\x64\xd7\x14\x2e\xb6\x8a\x4b\x52\x45\xe0\xfe\xa5\x63\x91\x74\x08\xa4\x52\x82\xa3\x10\x55\xc2\x68\xfe\x45\xbe\xfb\x63\xc8\x77\xc5\x66\xf9\x2e\xfb\x61\xf9\x22\x5f\xbc\xfd\xca\x89\x6e\xa0\x93\x04\x3e\xd2\x86\xcd\xf7\x05\x9b\x65\xdb\x27\x57\xd2\x99\x9d\xf6\xe3\xa8\xcd\xd3\xa0\xca\x9f\x13\x87\x05\x1f\x83\xe5\xb5\xdf\x26\xc3\x39\xdc\x4b\x25\x25\x99\x5c\x55\x9d\x59\xb5\xc6\x2a\x51\x52\x87\xac\xd4\x0a\x79\x6d\xc6\x37\xcf\x24\x63\x10\xa1\x0f\x84\xa3\x88\xcc\xf2\x66\xc7\x3f\xf0\x9e\xbe\xf9\x51\xe4\x75\xf3\x9a\x23\xb0\x12\x9b\xd5\xb2\xbc\x99\xbc\x6e\xf5\x8c\x6f\x0a\x5f\x0f\x84\x93\x5f\x33\x99\xdb\xc3\x7a\xb2\xb5\x87\x95\x31\xb9\x9b\x86\xa0\x42\xae\x93\x34\x6e\x5d\xe5\x8d\x79\x7b\x3f\x21\x0e\x65\x84\xbf\xdb\x45\xe3\xa3\x9d\xd0\xf8\x68\x17\x34\xae\xab\xec\xa2\xd1\xe2\xbc\x9d\xa4\x7c\xc3\x2a\x9b\xca\xbc\x71\x2a\x5a\x82\x15\xe8\x00\x15\xcd\x90\x12\xb5\x28\x11\x2d\xc1\x24\xd6\x46\x91\xa8\x3a\x30\x9e\xe5\x32\x4f\x10\xcd\x22\x91\x44\xe5\xdc\xa4\xd3\xf1\x2e\x3d\xe8\x1d\xea\x1f\xfc\xc6\x1a\x7a\x1d\x5d\xca\xd6\x4f\x79\xe3\xef\x1b\xbd\x77\xe7\x88\x4b\x69\xbc\xac\xbb\xc7\x30\xed\x5d\x7a\xea\xb8\xa0\x0a\x77\x93\x61\x6f\x68\x85\x57\x99\xa3\x78\x2a\x5c\x4b\x5a\xbf\xd5\x6a\x9a\x31\x75\x8f\x6a\x9d\x90\x02\x2d\xc5\xd6\xfd\x9a\x88\xe5\xb6\xb0\xb3\xcb\xd9\xc9\xe4\x54\xea\x39\x95\x70\xae\x35\xe5\x5a\x95\x88\xce\x91\x7e\x64\x22\x0f\x5b\x04\x32\x69\x43\x4c\x9e\x11\xe3\xd2\xa0\x52\x88\x08\xa7\x9b\xed\xe4\x22\xcd\xc9\xac\x93\x86\xc2\xc0\xa7\xbb\x66\x54\x80\x49\x6b\x4e\x05\x69\x6f\x01\x59\x60\x36\x91\xb4\x35\x85\x3e\x09\x10\xf8\xad\xea\xcc\x85\xdd\x1f\x8a\xa7\x8e\xb1\xc3\x5c\xdb\xee\x08\x5b\x50\xf7\x10\xb4\x56\xee\x1f\x95\xce\xf5\x68\x5e\xb9\xd5\x33\x3c\xae\x3d\xbc\xdf\x1b\x96\x25\x44\x41\xee\xd3\x4f\xfb\xac\xec\x74\xe0\x5e\xe1\xbb\x3c\x2d\xad\x05\x04\x20\xb5\x39\x73\x6a\x73\xe6\xe1\x3a\xce\xbc\x80\xe1\x66\xce\x9c\xe4\x2c\x23\x93\x42\x48\xf8\x13\x94\x6d\xcb\x9d\x57\xec\xb6\xf8\xdd\x8f\x70\x48\x33\xc4\x68\x96\xbb\x45\xcd\x08\x80\x9c\x88\x4d\x49\x1c\x37\x9e\x93\x0e\x44\x78\xd5\x04\x89\x12\x09\x37\xa4\xe9\xd2\xfc\xe0\x1b\x25\x23\x11\x5f\x13\x91\x93\xad\x10\xc1\x1b\x45\x20\x41\x91\x08\x41\x1e\xe8\xe8\x7e\x5f\xd8\x40\x11\x73\xc0\xd5\xb4\x17\xe4\x92\x24\xf9\x81\xed\xe1\xa4\xb2\x0a\x39\xaf\x5e\xa9\x09\x59\x77\x20\xcc\xad\xfa\x26\x66\x61\x73\xb6\x15\x6e\x36\x84\x2e\x84\x2a\x6a\xa1\x3c\xf0\x22\x74\x21\x9c\xc1\x25\x3c\x87\x17\xf0\x23\x7c\x0f\x2f\x2b\x31\xe4\xf5\xe7\xf4\x26\xf6\xe6\x57\x8a\x44\xf7\xe1\x8b\xac\xf6\xc7\x90\xd5\x5e\x05\x22\x66\x66\xf0\x0d\xbe\xc7\xc4\xdd\x7a\x12\xf8\x13\x2e\xbf\x2d\xa4\x3b\x87\x78\x69\x01\xbe\xa7\xd3\x74\x35\x48\x1a\x80\x53\xa7\xfa\x13\x92\x44\x24\x99\xf1\x56\x24\xff\x41\x38\xc5\x8c\x48\xde\x4f\xc4\x5f\x1e\x80\xf3\x40\x58\xd4\x6b\x1a\xa3\xac\xc7\xc4\xc4\x00\x9c\xf1\xc2\x54\x8f\x15\xf8\xda\x07\xd7\x32\x82\x58\x2a\xf1\xd2\xb4\xf7\x22\xc4\x90\x07\xe0\x39\x2f\x48\x06\x74\x92\xe3\xec\x5c\x8c\xfa\x27\x5e\x32\xf8\x16\xa3\x70\x3e\x90\xc8\x80\xc2\xe4\x0d\x9a\xc1\x96\x1e\x80\x13\xff\x22\x98\xfa\xfe\xc7\x3a\x4b\xe1\x33\xe3\x9a\x28\xbf\xf8\x91\x19\x16\xd8\x42\xe7\xfa\x46\xeb\x5c\x25\xe6\xe4\xc2\xbd\xd6\x2e\x58\x7c\xc4\x26\xab\xd0\x1b\x93\x1d\xe8\x84\xef\x5d\xc5\xa7\xc9\x16\x6f\x6a\xae\x84\xcf\x10\x2b\x16\x6e\x91\xc6\xb2\x07\xef\x0c\xab\x2e\x6a\xce\xcb\x26\x4b\xd1\x1b\xe3\x2e\x96\x7f\x78\x11\x29\x48\x82\x5f\x10\xb8\xb2\x34\xbe\xc2\xec\x91\xdf\x10\xca\x33\x83\x17\x43\x7e\xc6\x38\x4b\xb0\x40\xa9\x65\x1d\xa8\x0f\xd8\x2b\x78\x68\x6c\x0e\xb1\x34\x33\x14\x47\x4d\x66\x61\x51\xd6\x86\x99\x22\x88\xd6\x22\x8c\x28\x14\x46\x77\xf9\x08\xc1\x58\x18\x7c\xbc\x24\xc9\x87\x51\x0e\xe7\x38\x4e\x47\x45\x19\x10\xed\xd3\x73\x5d\x10\x50\xa4\xd0\x1b\x25\xc6\x70\x34\x3e\x60\x90\x0a\xff\x9a\x11\x56\x14\xe3\x10\x26\x60\xcd\xc4\x0e\x58\x59\x02\x50\x46\x44\x05\x25\xd6\x96\x87\x6a\xf5\x07\x8d\x82\xda\x76\xd8\xab\x99\xf7\xea\x00\xfb\x22\x2d\xc7\x89\xb8\x5e\x69\xe6\x0b\x21\x8b\xe3\xb7\x72\x8a\x95\x57\xaf\x8f\x01\x24\xc1\x19\x3f\x7b\x7d\xbe\x70\xfd\xbb\xd2\xf8\x72\x56\x90\xe8\x3b\x9a\xc9\x05\x02\xe5\x99\xd4\x48\xe7\x98\x59\x61\x61\x57\x62\xff\x8d\x18\x94\x2b\x3e\x22\x82\x16\x38\x1d\x87\x31\x49\xdf\x20\x36\xf7\x00\x6f\xfd\x98\xc9\x23\x8e\x7d\x8f\x44\x1e\x24\x00\xb2\x01\x4d\xfc\x5a\xe0\x06\x69\xf1\x29\x9c\x77\xb2\x22\xa9\x5b\x80\x62\xe6\x57\xc2\xaf\xd8\x93\xd5\xf7\x96\x6d\xac\x67\xf9\x38\x8e\x7d\x6f\xe6\x01\x49\x49\x70\xe4\x1b\x27\xfd\x3b\x43\xeb\xa3\x71\xd8\xe7\x9f\x4b\x50\xa5\x67\xcb\x70\xc2\x19\x5e\x3e\x5d\x5f\xac\xd3\x8f\x69\x84\x18\xe6\xb3\xc9\xed\x55\xaa\x7d\x6e\x6b\x5a\x88\x0a\xea\xd7\xaa\xa5\x42\xed\x97\xca\xc8\x27\xd1\x8c\xa1\x38\x46\x23\x06\x0d\xe9\x4b\x4a\x29\x50\xd0\xcd\x4b\x5f\x33\x85\x45\x01\x33\x91\x90\x71\xf0\x0d\x96\x37\xcf\x37\x87\x00\xec\xa1\xea\xce\x55\xd4\x7b\x25\x48\x62\x8e\x19\xf0\xb1\xc9\x17\xc9\x84\xd9\x13\x27\xea\x79\x80\xf5\x56\xf2\x06\x13\x94\xe5\x62\xa1\x6b\x48\x17\xa7\x1f\x41\xd9\x95\x38\x66\x00\xc0\x30\x40\x2a\xfa\xf1\x5e\x3e\xc0\x97\x84\x89\xcb\x74\x41\xcf\xb1\x2f\x01\x47\x41\x3e\x50\xee\x42\x03\x94\xa6\x9c\x4a\x0a\x68\x66\xbb\xa8\xe8\x21\xf6\x38\x6b\x3b\xa6\xee\x05\xc9\xcf\x61\x0e\x49\x80\xeb\x33\x17\xc3\x09\x82\x80\xe9\x81\xed\xe1\xed\x37\xc9\x21\xe0\x97\x45\xa3\xf6\x61\xd7\x96\xea\xda\xac\x4c\x9f\xe1\x24\x20\x83\x84\x46\x9c\xb1\x98\x61\xf6\xe4\x09\xbd\xf4\xc5\xcd\x3c\xb8\xbc\x97\x48\x13\xe7\x83\xa3\x3d\x31\xc9\x41\x1e\xce\x31\xbf\x8a\x7d\x0f\x4d\x19\xce\xde\x8a\x7d\x23\x7d\x6d\x61\x95\xc2\xc4\x3d\x30\x87\x00\xd8\xa3\x70\x6f\x40\xb8\x12\x16\xe8\x71\xa9\x76\xff\x5e\x1e\xe4\x83\x05\xce\x66\xd8\x8f\x00\xcc\x07\x88\x31\x71\xa4\x51\x9e\x7b\x62\x3d\x15\x92\x49\x80\xab\x4b\xfa\xea\xea\x4c\x60\xbb\x7f\x77\xc5\x06\x62\xbf\xbc\x9e\xfa\x18\x94\x67\x4a\xfe\x1d\x58\x73\x57\xc4\x77\x4c\x60\xb2\xbf\x9f\x98\xd5\x50\xeb\xb2\xbf\x6f\x90\x5a\x15\xdf\xb1\x8b\x2d\xf4\xca\x14\x3c\xf6\x3d\xb7\xbf\x2f\xf5\xb8\x42\x58\x38\x1d\xa8\x6c\xd0\x3e\x18\xbc\xa7\x24\xf1\xbd\x9e\x27\xf2\x28\xca\x39\xf1\x3d\xda\x67\x38\x67\x7d\x39\x76\x19\x57\x42\xed\x59\x33\xb5\x1a\xf2\xe4\x96\xf2\xa0\xa1\xc0\x69\x80\x55\x52\x30\x16\x1c\xe9\xcb\xea\x50\x4c\x47\xa0\x61\x7f\x9f\xf5\xfb\x50\xfd\x08\x82\x20\xec\x0f\xe5\x27\xfa\x67\xac\xdf\xc7\xfa\xec\x9e\x97\x5e\x7a\x25\x5c\x70\x60\xbc\x40\x5e\x25\xf7\x7c\x0b\xd0\xf1\xe1\x68\x08\x44\x3d\x71\x52\x26\x41\x6e\x1f\xb9\x01\x43\xd9\x0c\x33\x7d\xf0\xf8\x14\xc6\xf8\x14\x80\xbd\x49\xe3\x3c\x09\xcd\x18\xa8\x2f\xab\x67\x9a\xcb\xcf\x4a\x27\x97\xea\xdf\x5a\x20\xf7\x86\x87\x87\x7f\x32\xb5\x2e\x3d\xb8\x00\x6a\xab\x4c\xc0\xa0\x12\xe4\x7c\x30\x88\x8a\x4c\x28\x7e\xfc\xa3\xc3\xc3\x2e\xa8\xa2\xbd\x98\xcd\xd4\x99\x8d\xe0\x04\xd5\x54\xd4\x51\x4f\xf0\x45\xef\x71\x96\xa1\xa5\xaf\x4c\xea\xf3\xab\xab\x21\xe0\x07\x3b\xf6\x7d\xce\x16\xa3\x3c\x27\xb3\x04\xf8\x2b\x79\x37\xb3\x12\x62\x00\x00\xd8\x9b\xae\xc7\x40\xeb\xa0\xd4\xdf\x4b\x75\x31\x25\xc7\xde\xc3\xc3\x3f\x79\xa3\x43\x50\xe1\x8d\xa4\xfd\x94\x5f\x71\xf0\xac\xc8\x62\xff\x7f\x69\xff\x0d\x71\x2b\x96\xe0\xcc\xc5\x9c\x86\xf3\x28\xbd\xf4\x46\x0a\x8d\xba\x8e\x71\x08\xaa\xaa\x19\xc7\x20\xff\x10\xf6\xfa\xf7\x81\x37\xf2\x78\x7d\x89\xeb\xa9\xb3\x7a\x1a\x45\x67\x13\x2e\x59\x71\xdc\xf0\x63\x58\x9e\x81\xeb\xae\x09\x3f\x79\x0d\xa6\xc1\xbe\x6e\x40\x45\xfe\xf9\x8c\xbd\xc6\x3e\xe1\xd3\xb4\xb0\x28\xd0\xa7\xce\x51\xfd\xb4\xe6\x82\xb6\xab\xa7\x97\x46\x39\x28\xa5\x02\x40\xda\x68\x7f\x8f\x92\x28\x16\xae\xa4\x82\xec\xd3\x24\xc4\x92\x57\x69\xdc\xba\xa0\x2c\xe1\xfb\xe0\x83\xff\xb1\x96\x86\x43\x30\xc9\xe3\xf9\x4d\x75\x49\x97\x2e\xe0\x3a\x6b\x3c\x9e\xdd\xb4\x03\x07\xfc\x4f\x6a\xe0\xcb\xcd\xba\xa9\x96\x76\x00\x7e\xb4\x35\x52\x0e\x6c\x8b\x37\xf1\xe0\xf8\x7c\xc7\x1e\xec\xd6\x4e\x3f\x17\xc1\x47\x00\xae\xae\x2e\xc4\xbf\x96\x12\xec\x64\xa3\x92\x2b\x43\x24\xe9\xa7\x34\x15\xba\xfa\xeb\x69\xb8\xb4\x8a\xca\xd2\x3b\xad\x55\x4a\x69\xf5\x55\x22\xdd\xa2\x42\x61\x4a\xa4\x0e\x4b\xff\x7d\xbe\x41\x97\xb4\x4e\x25\x15\xd3\x10\xc5\xfd\x9c\xd1\x0c\xcd\xf0\x7a\xad\x93\x54\x8c\x18\xd5\x13\xac\x69\x9d\xf6\x9a\x41\xfd\x3f\x07\x7d\xd3\xfb\x5f\x49\xdf\x74\xf9\x45\xdf\xf4\x7b\xd7\x37\x71\xb6\xe1\x75\xe0\x17\x52\xb1\xc0\xd0\x4c\xf0\x6a\xbe\xe7\x71\x31\x43\x68\x84\x2a\xa5\x8f\x38\x9f\xcf\x38\x61\x79\x9d\x2a\xcb\xee\x55\x09\xa0\x48\xe0\x9e\xd9\x9a\xa3\x66\x06\x33\xa9\xab\x50\xb4\xe0\x9f\x05\x09\x3f\x28\x10\xe3\x43\xb1\x37\x52\xa9\x24\xc2\x3f\x17\x28\x06\xbe\xa7\x93\xfc\x3e\x6b\xb6\x90\xa8\xf7\xa0\x17\x16\x39\xa3\x0b\x4f\xa5\x24\xaf\x6b\x9e\x30\x8a\x62\x92\xe0\xe7\x89\x0e\xff\xa5\xbb\x7e\x91\x3f\x95\xcd\x74\x7b\xdd\x83\x07\xb7\xe8\x14\x40\xa1\x84\x8b\x5b\xd3\x9f\x93\xa9\x2f\xf9\x68\x29\x2e\x2a\x37\xd5\xbd\x5a\x40\x15\x59\x34\x20\xb9\xc0\x22\x49\x66\x02\xff\x64\x8f\x65\xcb\x15\x11\x26\x75\xb4\x6e\x52\xa7\x67\x02\x06\x09\x4a\x68\x8e\x43\x9a\x44\xb9\x0f\x4a\x99\x2a\x31\x33\xf8\x15\xab\x59\xf1\xd7\x29\xca\x72\xac\xf2\x48\x65\x83\x05\xce\x73\x34\xc3\xa0\xd4\x92\xd2\xea\x99\x02\x3b\x22\xf0\xc5\x2c\xa1\x19\x3e\x59\xe6\x0c\x2f\xfe\x41\x27\xb9\x4a\x78\x2b\xee\x8f\xea\x6b\xb9\x57\x7d\x55\x2b\x17\xac\x1c\x34\x8f\x6a\x23\x56\x1f\x61\x1d\xcd\xf5\x3a\x70\x0d\xca\x55\x14\x84\xee\x0a\xd0\x19\xe2\xa8\x6d\xdc\x70\x4a\xb3\x10\x0b\x6c\xcb\xf2\xea\x77\x09\xb9\xb8\xcc\x31\xef\x14\x1c\xcb\x44\xf6\xf6\x82\x55\x85\x9c\x40\x37\xcb\x23\x55\xa4\x59\x2f\x59\x95\x59\xeb\xa4\x0a\xc4\x9a\xf8\x19\x28\xf9\xa6\x2f\x7c\x7f\xee\x3c\x98\xb2\x1d\xcc\x47\xdf\x6b\x55\xa6\x18\x83\xd6\xdb\xbc\x37\xea\x47\x63\xfd\x20\xe4\x67\xfd\xdd\xde\x1a\xfc\x94\xbf\x37\xe1\xa7\x9c\x33\x63\x37\xaa\xe6\x5f\xff\xee\x60\x5b\xca\xf5\x1f\xed\x42\x43\x29\x74\x2e\x7b\x5d\xba\x66\x65\xab\x74\xf6\x06\x54\xe3\xf8\xea\xfc\xf2\x06\x09\xee\x69\xf6\x9c\x81\x98\x5c\xf3\xa5\x5e\x05\xb0\x2a\xf5\x4a\x81\x55\x19\x91\xe8\x2d\x0e\x31\x39\x6f\xaa\xa6\xea\xdf\x45\x58\x50\x97\xbe\x34\xba\xb7\x31\xd6\x44\xd3\xda\xd9\x9f\x56\x77\x29\x17\x8a\x31\xbf\xec\x1b\xa7\x6f\x7f\x5f\x4c\x8e\xdf\xaf\x8d\x32\x2e\xb2\xea\x14\xa9\x6d\x34\xd7\x90\xe5\xb1\xd2\xdc\x7a\xc3\xde\xf7\xb4\xc8\x3c\xc5\xa4\x78\xc3\xb9\x57\x42\x5d\xf6\x40\x94\xe5\xa6\xf0\x81\x5d\xf8\x95\x53\xf8\x95\x5d\x38\x3c\x72\x4a\x87\x47\xb5\xe2\xde\x33\xb4\xac\xca\x22\xab\xc8\xac\xb2\x2c\x53\xa4\xbe\x3c\x55\xe1\x19\x24\xf6\x1b\x31\x05\x6a\x8b\x72\x5c\xbb\x72\xf4\xc6\x91\x5f\xdb\x68\xd2\x46\xea\x3f\x3a\x2c\x53\xce\x4c\x24\xec\x99\xce\xab\x0f\x56\x78\xe0\x7c\xe3\x22\xd3\x2c\xb8\xf4\xe7\x35\x91\xa9\x76\x12\xc6\xe1\x4d\x25\x9b\xa5\xdb\xc1\xda\xc3\x74\xf3\x24\x88\xe7\x8d\x09\x35\xce\xe3\xcd\x33\x21\x76\x74\x61\x6f\x5c\x0f\x8e\xab\x7b\x7e\xb3\x90\xb5\x19\x1e\x80\xf3\x5a\x2a\x49\xa7\x89\xda\x51\x32\x17\xe3\x6e\xbd\xe9\xa6\x4e\x0f\x17\xad\x5b\xc3\x83\xe3\xc9\x4d\xd1\x37\x0d\xe6\x5c\x52\x9c\xda\x52\xe2\xeb\x4d\x52\x22\xe6\x3b\x5b\xca\x67\x39\x89\xf0\x04\x65\x07\x11\x66\x88\xc4\x37\xb1\x58\xee\x32\x4e\xae\x35\x6f\xc9\x9e\x18\xdd\x37\x32\x64\xce\x10\xc3\x42\x77\x9f\xaf\x93\xf6\xa4\x50\x62\x19\x1a\x54\xd2\xde\xde\x67\x9d\xe3\xee\x8b\xc4\xf5\xfb\x95\xb8\x24\x13\xfe\x71\xb3\x35\xf6\xdf\xdf\xb1\x87\x2f\xde\x9e\x1f\xd4\xbc\x6d\x1f\x58\x06\xd4\x32\xf8\xcc\xf3\x73\x14\x3f\x93\x87\xf6\xd4\x71\xb0\x95\x66\xb6\x43\x13\xb4\xda\xfb\x56\x29\xa8\x4f\xf9\xf1\x3e\x47\x71\x5f\x9e\xf6\x3e\x3f\xe8\x28\x96\x1e\x5f\x9e\x1a\xaf\x30\x9a\x1d\xbb\x6e\x64\x43\x9d\x21\xc3\xe4\xba\x91\x74\xc3\x89\xeb\x4d\xf2\x13\x12\xe1\x27\x28\x7b\x9d\x62\x61\xf4\xe8\x51\xf9\x47\x65\x2c\x7e\xdf\xb6\x05\x8f\x69\x8e\x4f\x24\x24\x35\x0b\x2f\x44\x29\x2b\x32\x2e\xe9\xe1\xcb\x10\xa7\x4c\xbf\xca\xf1\x61\xb0\xac\xc0\xd0\x63\xd9\x58\xbc\x3d\x88\x99\x64\xf4\xe2\xb4\x61\xce\xea\x38\xb8\x91\xfc\x25\x45\x91\xf0\x8f\x68\xf5\x6d\xeb\x74\x04\xb6\x2c\x6e\x95\xcd\x95\x31\x46\x55\x1f\x7a\x73\x94\xf7\x45\xd2\x00\x19\xc6\x0b\xb7\x3b\x94\x56\xc0\xe4\xda\x3c\x50\x6b\x63\xfe\xd3\xd5\xf5\x76\x31\xb4\x2d\x7b\x7b\x7b\xd6\x92\xdd\x5f\x3b\x67\x31\x17\x91\x78\xbb\x3f\xc7\x28\x52\xf6\xbd\x9d\x98\x18\x42\x6f\x52\x30\x26\x11\x21\xbd\xb7\xe5\xef\x1e\xc9\xfb\xd2\xc6\x51\x84\xc1\x96\xa5\x0f\xec\xda\x72\xf5\x1f\x3a\xae\x02\xad\xbb\x60\x5d\x9a\x01\xd7\x13\xf8\x91\x00\x88\x92\x50\x44\x40\x6f\x3a\xff\xee\x82\xcb\x0d\x08\x0a\x69\xc2\x10\x49\x36\xe1\xa8\xd9\x50\x09\xe2\x9b\x22\xb4\x1f\x42\x6f\x3e\xb4\xcc\x9d\x09\x8b\x31\xc7\xab\xf0\xad\x5e\xb7\xaf\x7a\xbd\x1f\x28\xeb\x7d\x47\x8b\x24\x6a\x83\xdb\x16\xd0\xdd\x74\x79\x54\xed\xe8\x62\x22\x0d\xf2\xd7\x75\xf4\x6e\x8e\x7b\x19\xfe\xb9\xc0\x39\xc3\x51\xaf\xe2\x23\x7a\x21\x2d\xe2\xa8\x97\x50\xd6\x9b\xe0\xde\x94\x0f\x65\xd0\xfb\x37\x2d\x7a\x0b\xb4\xd4\x5f\x51\xc1\xe6\x34\x23\x1f\x71\xd4\x63\xb4\x77\x4e\xf0\x85\xe0\xe0\x2d\x28\xb0\x47\x98\x68\x31\x47\xe7\xb8\x37\xc1\x38\xe9\xcd\x50\x36\x41\x33\xdc\x0b\x69\x2c\x79\x5d\xd8\xa3\x59\x8f\xcd\x71\xef\xc5\xb3\x1e\xc9\x7b\x24\x39\x47\x31\x89\x06\xdb\x4e\xfc\xe6\xa7\xea\xa4\x08\x43\xb1\xc7\x37\x9e\x2b\x45\x65\xb7\x39\x58\x6d\x6b\xbf\x55\x44\xff\xa1\xcc\xa6\x90\xb1\x17\x51\x7b\x4c\xff\x16\x0f\xe9\x49\xb1\x48\x71\xd6\x8f\xf1\x94\xf5\x18\x9a\xf1\x3d\x96\x66\x44\x78\xd9\xae\x5b\x7b\xa7\x53\x86\x58\x91\xaf\xed\x73\x07\xfc\xff\x21\xe8\x8b\x77\x0a\xd7\xee\x97\x09\xbd\xc4\x51\x5f\xdf\x2c\xfc\xe4\x2f\x50\xab\x2f\xcd\x36\xed\xfb\x13\x1a\x2d\x7b\x24\xe1\xe2\x48\x5f\xf0\x2d\x44\x0a\x3f\xb2\xfa\x43\x61\x3d\x98\xc6\x68\x39\xea\x4d\x63\x7c\xf9\xd7\xcd\xd4\xa9\x2d\xe1\x84\x00\x24\xc3\x97\xf6\x1e\x0d\x86\x47\x0f\x33\xbc\x58\x07\xaa\xd7\x7b\x5e\xd1\x0c\xc9\xbe\xe4\x3b\xd3\xac\xc3\x8e\x29\x88\xff\xf6\x4d\x50\xf3\x11\x27\x1a\xc5\x22\xd9\xbc\xa9\x6b\xe1\x03\x10\xe9\x3e\xab\x1d\x6d\x18\xce\x16\x1b\xda\xf4\x7a\xff\xa0\x93\x2e\x58\xed\xb3\xed\xd5\x58\x86\xbf\x58\xec\xdc\x82\x46\x22\x0f\xea\xb7\x19\x2d\x98\xa0\x13\x6e\x3e\x13\x7e\x42\xd3\x18\x91\xe4\x1f\x74\xf2\x42\x26\x59\xf9\xd6\x33\x67\x37\xa9\x45\xec\x50\x69\x47\xde\xd3\x49\x3e\x10\x91\x4e\xd6\xb2\x83\x2d\xc3\x87\xad\x3d\xae\x99\x93\x20\xae\x9d\x35\xd6\xa2\xe4\x97\x5b\xaf\x77\x19\x99\xfd\x7f\xec\xbd\xfb\x7a\xdb\x36\xbe\x28\xfa\xbf\x9f\x42\xe1\xee\x78\x11\x13\x88\xb6\x93\x66\x2e\x9a\x61\x3d\x69\xd2\xae\x76\x56\x33\xc9\x89\xd3\xb5\xf6\xda\x1a\xed\x86\x22\x21\x09\x31\x49\x70\x08\xc8\xb6\x22\x73\x7f\xe7\x35\xce\xeb\x9d\x27\xd9\x1f\xae\x04\x41\xea\xee\xb4\x75\xe3\xf9\xbe\x4e\x2c\x10\xd7\x1f\x80\xdf\x0d\xbf\xcb\x94\x73\x74\xbd\xaf\x17\xfb\x6d\x9c\x15\x42\x44\xf7\xf5\xf5\x62\x35\x64\x36\x1d\xfc\xdf\xe0\x9d\x78\x53\x62\x52\x62\x76\x30\x7c\x0b\xd5\xcf\x03\x70\xad\xff\xbd\x10\x42\xa6\xcb\x12\x6e\x0f\x5b\x45\x01\xff\x6c\xa1\x14\x25\xb7\xae\x8e\xb5\xb3\xe5\x18\x3f\xe3\x09\x4b\xa3\x58\x18\xdd\xf4\xbe\x8d\x70\x3a\x2f\xd1\xa1\x47\x6d\x16\x51\xd3\xa7\xea\x72\x25\x17\xb4\xdf\xb1\xdb\x9e\x99\xb0\x82\x70\x4d\x22\x9c\xa2\xe4\xdd\xbf\x3f\x4f\x53\x12\x77\x30\xa7\xdb\xb0\x1b\x49\x94\x4f\xd7\x30\xaa\x1b\x39\x0e\xce\xe8\xae\xdd\x90\xd6\x66\xec\x4d\xfb\x3b\xb9\x1d\x67\x6c\xaf\x99\xf6\x4b\xe6\xe3\x72\x93\x73\x75\xc2\x6e\x73\xee\x2f\x7b\x56\x4a\xdd\xf2\xc4\x22\xd0\x8d\x1e\x3d\x35\xd4\x93\x96\x47\x70\x47\x86\xdb\x7d\x4e\xc8\x6a\x69\x25\x41\x34\x46\x79\x82\x72\x46\x5f\x45\xc5\xaa\x53\xa1\x16\xf0\xd4\x5e\x40\x2e\x33\x69\x45\x32\xff\xaa\x01\xdb\x97\x75\x9d\x99\xb0\x27\xd3\x11\x44\xd5\xcf\x9a\xbb\x93\x7e\x13\x96\xb2\xa7\x51\x5f\xe5\x3f\x7b\x6a\xca\x5b\x0d\x55\xee\xf0\xf6\xb8\xca\xe6\xae\xb6\x96\x2b\x22\xad\x0f\x9b\xeb\x67\x38\x67\xdd\xda\x61\xa3\xae\xf3\xfd\x4b\x7b\x6a\x3a\x23\x6f\xdb\x29\xd8\x94\xb4\x06\xb1\xbe\x75\x40\x79\xa5\xae\x0e\x7a\x38\x91\x8b\xeb\x3c\x0c\x3b\xdf\xdb\x4f\x78\x5b\xdf\xa2\x94\xd3\x0f\x8b\x63\xff\xa4\xd7\xb5\x7d\xb1\x56\xab\x52\x7a\x9b\x35\x15\xfb\x6a\x38\x7a\x46\xcb\x21\x57\x5f\x6b\x27\x68\x2f\x8e\x72\xa5\xcb\xb8\xc2\x74\x2e\x74\xc8\x2d\xcd\xc3\x06\xb8\xdc\x09\x49\xd0\x1c\xf4\x0e\xe2\xe4\xbe\x52\xe4\x86\x53\x62\x49\x73\x6f\x11\x2d\x48\x4e\xd1\x4e\x19\x05\xd7\x0b\xaf\xb4\x3f\x99\xa7\x69\x7f\x9c\xa2\x2d\xf5\xaa\x67\xcf\x2c\x1c\xf6\x81\xca\x65\xcb\x08\x0b\x5d\x69\x38\xd7\xce\x71\x3d\x92\x5d\x1d\xcf\xcc\x15\x6e\x64\x22\x47\x59\xe2\x21\x1b\x4b\x15\x0e\x1f\xc1\x31\xee\x24\xb7\x23\x9c\xa5\x48\x20\x38\xa9\xa6\x87\xda\xe5\xbf\x2f\x14\x1c\x7d\x32\x67\x14\x27\xbc\x55\x2a\xd5\xdb\x7d\x5a\xe0\x3c\x47\xa5\x8e\x0b\x60\x92\x17\xa6\x38\xbf\xec\x33\x62\x07\x05\x70\x23\xa5\xad\x4a\x6e\x68\xe6\xd8\x9f\x98\x49\x76\x3c\x1f\xaa\xdb\xd2\xb7\x6e\x8b\xa0\x09\x94\x77\xc9\x37\xa2\x7f\x85\xd1\x35\x67\x2e\xb6\x88\x3c\xb0\xf2\x79\x72\x5d\x18\x82\x0f\xa1\x4f\xa5\x35\x5b\x16\xb1\x78\x86\xe8\x05\x13\xae\xe1\x4b\xd5\xc5\x40\x3e\x45\x88\x00\x56\xeb\xaa\x2d\x79\xb5\x81\x47\x95\x96\xaf\xaa\x94\x45\xdc\xa6\x06\xe3\x39\x5d\x88\xda\xc9\x36\xb5\x05\x36\x13\xd5\x0b\xc7\x14\xa8\xdc\x23\xa7\x62\xf3\xd9\xa5\x95\x2c\xb1\xd6\x59\xb6\x72\x25\xd6\x4f\x23\xad\x74\x89\xfa\xfd\xc0\xa4\x49\x74\x32\x38\x4e\x57\x64\x70\x54\x46\x3c\x26\xe7\x9a\x7c\xd0\xed\x4a\x2e\x57\x7f\xad\x6c\xe6\x40\xbc\x67\x22\xb6\x94\x8f\x56\x83\x25\x8d\x4b\x92\xa6\x2a\x8b\x07\x94\xbf\x64\xc0\x80\x01\xae\xaa\x10\x1d\xb1\x47\x2a\x03\x91\x98\xd9\xf1\x31\xd6\xbf\xe5\x94\x94\xcd\x8c\x0e\xa1\x80\xa1\x9d\xfe\x40\x65\x59\x72\xe9\xb4\x33\xdd\x7a\xa6\xf2\xcf\x20\x26\xb9\xc8\xb2\x56\x1f\x55\x95\xfe\x09\x95\x51\x19\xcf\x16\x3e\x58\xb2\x72\x21\x03\x5e\x18\x5b\x40\x8e\x3a\xc2\x30\xf4\x95\x83\x55\x6b\x50\x70\x7b\x6b\xde\x29\xd1\xb9\xfc\x73\x80\x02\x75\xb7\x78\x3d\x7a\x84\x27\xbe\xb6\x31\xac\x8d\x06\x03\xca\xca\x88\xe1\xc9\xc2\x07\x01\x4e\x94\x9f\x16\x4e\x00\x08\x24\xdb\xf2\xbd\x2e\x2b\x4a\x74\x85\xc9\x9c\xf2\xbe\x00\xf0\x87\x41\x10\xb0\x80\x11\xe9\x19\xa2\xcc\xd8\x5a\xd3\x1a\x69\x7b\x36\x26\xdd\xeb\x48\x8a\x02\x71\x7e\xfd\xf7\xff\xcc\xff\x99\xb7\xd9\x84\x9e\x38\x38\x03\x91\x1f\x87\x69\x33\xc4\xea\xbd\xce\x5b\xd1\x33\xa9\xa5\x9a\x8c\x93\x0e\x10\x72\x64\x55\xb3\xc0\x65\x60\xbb\x02\x4c\xaa\xb3\x28\x67\xd4\x57\x69\x35\xa4\x2b\xd2\x0c\xa7\x49\x89\x72\x00\x6a\x7f\x26\x31\xba\xcb\xd2\x1d\x3a\x7e\xc4\x22\xd1\x2f\x52\x66\x66\xdb\x1d\x20\x5e\xb9\xb2\x55\xd4\x6b\x5a\x0a\xff\x9b\x57\xaf\x5f\x3e\xff\xe1\xa7\x17\x3f\xbc\xbe\xf8\xc6\x03\x55\x05\xb3\xf0\xda\x2f\x9c\xe0\xff\x36\x36\x18\xd2\x43\x6d\x4c\xc6\x1d\x23\x68\x84\x32\x9c\x1f\x6e\xc1\xd2\xea\xdd\xe0\xa4\xc3\x6d\xa6\x66\xed\xde\x15\x5a\x3b\xdc\x3e\x6a\xea\xf6\x7d\x77\x29\x43\xda\xa6\xd4\x62\x4c\x61\x04\xe6\x0c\x7a\x87\xe1\x5e\x56\x8f\xea\x8e\xd9\x90\xfd\x86\xf9\xd6\xe1\x5f\x56\xf7\x02\x60\xd1\xb0\x98\x6a\x56\x6d\xbc\xe1\xec\x3d\x60\xa3\x17\x67\xc0\xc2\xb6\xa0\xfa\xb0\x2e\xd8\xcc\x47\xf8\x61\x63\xb0\x99\x6d\x59\xa4\x43\xcd\xad\x4c\xe5\xba\x0e\xc9\xd3\x45\x97\xf5\x14\x58\xde\x95\x11\x4b\xb9\xd9\x88\xe5\xc3\x7f\xff\x10\xd3\xab\x3f\x3c\x6f\x84\x14\xdc\x5e\x38\xd9\x4f\x28\x59\x25\xb0\x76\x30\xe9\x9b\x85\x8f\xae\xed\x6a\x0f\xa9\x5e\x2d\x4f\xcd\x73\xa5\xda\x6d\x61\x2c\xa0\xa2\x50\xcb\x97\xc9\x53\x4b\xe1\xe4\xa8\x42\xba\x5e\x24\xbd\x66\xa4\x38\x1d\x41\xf1\x89\xab\xad\x78\xb2\x29\x66\x9c\x13\x79\xaf\x36\x3b\xd9\xf8\xc6\xa3\x5f\x64\x75\xb4\xb9\x3f\x34\xa2\xcd\xd9\x33\x91\xab\x77\xfc\x5c\x65\xe1\x33\xe8\x7d\xec\x4b\x9f\xd2\xde\xd9\xe9\x5f\x7a\x38\xa7\x88\x0d\x7a\xa7\x7f\xe9\x15\xca\x85\x7a\xd0\x8b\xc6\x94\xa4\x73\x86\x78\x99\x88\x8b\xd4\x17\xb6\xb5\x74\xd0\xcb\x89\x0c\x00\x27\x41\xf8\xa5\x02\xc2\x53\x38\xf4\xa4\x82\xaa\x44\x71\x94\xc6\x2f\xe6\xe5\x15\xa2\x36\x44\xea\x89\xad\x80\xec\x93\x66\x24\x3f\x27\xaa\x1f\x1f\x40\xba\x0d\x7a\xe2\x18\xf0\xcd\x9f\xe1\x62\x17\xd5\xa0\x3a\x62\x9e\xf0\x72\x1d\xc9\x80\x75\x89\x67\xe2\x34\xea\x07\xb2\x2f\xa1\x47\x59\x49\x2e\xb9\x58\xf5\x3f\xfe\xf8\xcd\x9f\xbe\x7d\xfe\x27\xaf\x51\xae\x52\x8a\x7b\xda\x38\xc0\x9b\xe0\x34\x15\x4e\x73\xb9\xa5\xc7\xd8\xa0\x67\xf7\x62\x5c\xc6\x75\xe0\xbc\xf8\xa6\x9e\x08\xbd\xa9\x83\x05\xc6\x0b\xab\x7c\x51\xcf\x90\x0b\x94\x5f\x3a\xe3\x5f\xcf\x30\x43\x9e\xbb\x84\x71\x1a\x49\xa5\xdf\xa1\xd3\x42\x2b\xa6\x85\xee\x76\x5a\x32\x88\xe9\x0a\x05\xec\x4a\xbd\x00\x3f\x67\x6d\x11\xbf\xa3\x17\x1b\xcf\x74\x07\x5b\x6c\xbf\xed\x72\x7c\xc3\xf1\x7b\x87\xc6\xd2\x8a\x1b\x68\xa1\x83\x55\x9a\x49\xfe\xad\x4b\xed\x59\x6b\x55\xff\xd4\x42\x49\x6d\x2d\x2c\x5c\x33\xcc\xca\x70\xa1\x9d\xea\x93\x8d\xb7\xee\x49\x97\x2a\x75\xf3\x7d\x6b\x6b\x0a\x6b\xda\x2b\x68\x92\x8b\xb7\xb7\x98\xca\xb3\x2d\xef\xf9\x1d\x6c\xe1\x1f\x34\xae\xb9\xfb\x6d\xb3\xba\x5e\xb1\x55\xa2\xe6\x1f\x3a\xcf\x7f\x97\xfa\xeb\xd9\x1e\xf1\xfc\xc5\x4f\x11\xfd\xd2\x7e\x53\x10\x1a\x79\xbe\x35\xf2\x1a\x73\x88\x51\xf5\xaf\xa5\xfe\x22\xb9\x8c\x5d\x87\xb4\xee\x2b\xca\x13\x0f\x7a\x45\x49\xae\x70\x82\x4a\x7a\x22\x3b\xe9\x37\x91\xb4\x0c\x88\x29\xbd\xab\x57\xea\xb5\x3a\x18\x34\xf7\xdc\x78\xd0\x9b\xe4\xfb\x2a\xac\x3a\xd8\x87\x55\xda\x2b\x69\xef\xbd\x86\xe1\x2c\xa1\xf0\x92\x34\x1e\x99\xc0\x66\x55\xd3\x8d\xac\xe8\x0d\x8a\xfb\x0c\x95\x19\xce\xa3\xcd\x06\xfe\x37\xbc\x66\x3f\x4a\x12\x92\xf7\x27\x98\x6d\x17\x54\x70\xe7\x58\x81\xca\xc8\xfd\xe8\x6e\x1c\x59\x89\xf2\x44\xb5\x43\xa4\xe9\x05\x5b\x56\x9b\xc0\x4f\x37\x05\x15\xcb\xad\xa0\x62\xfb\xc6\x96\xe2\x33\x92\x29\x1a\x70\xf0\x2d\x66\xcf\x39\x28\xa5\x1b\xe5\x44\xfd\x0a\x55\xd6\x73\x3d\xc7\x20\x25\x51\x22\xbe\xf8\x08\x38\x9f\x48\x81\x72\x7f\x5d\xac\x22\x53\xd5\x03\x1c\x3c\x13\xcc\xfc\xee\xb8\x0f\x3a\x92\xa8\x9e\x85\xac\xea\x0c\x27\xaf\x5b\x72\x7c\xdc\x59\xec\x23\x50\x55\xe0\xf6\x36\xb5\xce\x1f\xd9\xe6\xfc\x9d\xf0\x65\xf4\x95\xb1\xde\x9e\x51\x09\x28\x2a\xaf\x70\xdc\x11\xc3\x72\x8a\x72\x54\x72\xc9\x47\x9c\xf4\x79\x99\xb6\xab\x88\xe1\xad\xcf\x7b\x05\xb7\x5c\x9f\xd4\xed\xc1\x73\xe3\xb7\xea\xb9\x21\x43\x6b\x89\x18\x6f\xb6\xa3\xbc\xef\xd3\x2d\xbd\x78\xb7\x0f\x7b\x2c\xec\xf9\x4a\x3b\xec\xf1\xfc\x57\x1b\xf6\x58\x60\x26\x11\x4c\x26\xad\x49\x93\x40\x1b\xfa\x42\xfe\x58\xa6\xbe\xf0\x47\xb5\x7e\x2e\x4d\x1a\xe7\xd2\x69\x25\xd7\x0e\x97\x1f\xc8\x58\xba\x66\x7e\x20\x63\x68\x52\xc6\xc8\x22\x2b\xbb\x4c\x44\x2f\xeb\x32\x58\xe7\x9d\x53\x39\x98\xcd\xef\x0a\x54\x15\x9c\x87\xb1\x4f\x6d\x4d\x90\x06\xf4\x30\x0f\x70\xce\xa1\x7b\xa8\x2e\xd0\xe9\x9f\x48\xd5\x2b\xde\x5a\x4f\xd5\x6e\x0d\x20\x6d\xa4\x29\x09\x29\x00\xb7\xb7\x91\x85\x7a\x93\xad\x50\xaf\x4c\x9a\x20\xd5\x11\xdb\x6a\x9c\xb6\xc4\x8c\xf2\x68\xe7\x77\x44\xc6\x95\x5a\xa9\x71\xc7\xf2\x95\x57\x8c\xd3\xa1\xdc\x02\x46\xb9\x3d\x30\x44\x9e\xbd\xbe\x14\x68\xb6\xa5\x46\x35\xf5\xd9\x3a\x68\xce\xa1\x64\x6a\x1b\x42\xd4\x1d\xef\x46\x46\x59\x86\xaf\x8f\xdc\xd0\xc5\xf7\xc3\x1b\xf2\xf2\x17\x8a\x7b\xf3\xea\x81\x96\x7f\x0e\xb4\xfc\x22\xf4\x23\x29\x31\x90\x12\xa8\xe8\x69\x28\x91\x8f\x65\xda\x62\xeb\x2d\xa7\x0f\xdf\xd3\x77\x33\x4c\xdf\x99\xf4\x8f\x00\x52\x19\xaf\xc6\x8a\x39\x23\x09\x49\x60\x37\xf3\x60\x9d\x32\x32\xe0\xe4\x2c\xc8\xa3\x0c\xc1\x5c\x05\x38\x9e\xb7\xfa\xa8\x6b\x5b\xe9\x53\x55\xa0\x64\x19\xe5\xe3\x42\x3a\xdb\x28\x53\x84\x52\x06\xc6\x5d\xd5\xd2\x83\xc2\x39\x07\xf1\xfa\x49\x6b\xb0\xba\x22\x5f\x98\x30\x4f\xa0\x6f\x39\xb6\x4f\xc4\x2b\x30\x0d\x86\x23\x4f\x05\xe6\x29\x55\xe0\x4f\x31\x54\x57\x3b\x2e\x96\xeb\x48\x99\x2a\x20\x4f\x3d\x37\xa9\xc4\x68\x54\x16\xa9\x2e\x54\x34\x9d\xae\x8a\xd4\x06\x9d\x0e\x66\xdd\x9c\xbd\xa9\x2b\xea\x68\x28\x89\x04\x31\xb0\x35\xe4\xaa\xaf\xce\x07\x6b\xb7\xc4\x4e\xf1\xdf\xb4\xd2\xc1\xb1\xcb\x80\x92\x92\x29\x60\xd3\xff\xc2\x6c\xf6\x76\x9e\xe7\x38\x9f\x36\x96\x75\x41\x4a\x86\xf3\xa9\x07\xe0\xf4\x80\xd8\x2e\x3a\x20\xb4\x66\x4f\x16\x4e\xa0\x68\x4c\xe5\x31\xbd\x72\xca\x37\x6d\xaa\x89\x82\xe2\x44\xb0\xb6\x77\xe7\xe3\xca\x1a\xb4\x1d\x1c\xdb\xdd\x87\x3a\xa6\xf5\xa5\x8e\x78\x6d\x01\xc5\xa4\xf0\xa9\x3b\xe0\x30\x45\x89\xea\xfd\xb5\xd3\xb6\x71\x25\x1f\x9d\x35\x6c\x34\xba\x6e\xa6\x15\x28\xdb\x62\x25\x1b\x97\xf2\x08\x4f\x7c\x24\x36\x3c\xc0\xb9\x48\x21\x48\x7d\x3b\xeb\xae\x8e\x22\xde\x63\x21\x52\x56\x13\x1a\xf3\x33\xf5\x9b\xff\x13\x65\x82\x2f\xfd\x89\x77\x14\x2a\x2b\x93\xfa\xf8\xe8\xbb\x7e\x7c\x6c\x2a\xf3\x8f\x3f\x89\x21\x56\xb4\x11\x68\x41\x8e\xf4\xe8\x4c\xe5\x12\xa1\x6f\x90\x88\xda\xfe\xbc\xbe\xd4\x8e\x55\x40\x37\xca\x88\xf2\x85\x30\x7a\xf0\x0a\xd9\xde\x13\x01\x50\x6d\x14\xa2\xc2\xc3\x74\x9d\x17\xd7\x42\x67\x13\x9e\xd0\xf4\x45\x87\xac\x0f\xa4\x6d\x99\x6f\x19\x94\x00\x00\x87\x23\x39\x62\xf7\xe5\x71\x37\xae\x75\x81\x1b\x91\x87\x79\x1f\xc7\xc7\xf2\x5f\x07\x82\xdd\x70\x05\x26\x84\xb8\x38\x7e\x26\x1c\xba\x53\x55\xcc\xcd\x0c\xc5\x84\xf1\x8c\x3e\x23\x4c\x75\x04\x2a\x99\x58\xe7\xb5\x94\x7a\x64\x0f\xa2\xc4\xd0\xa1\xc6\xb1\x95\xf2\xd1\xf7\xf9\x3f\xd0\xf5\x7f\x09\x65\x8c\xe6\x69\x38\x05\xca\xc3\x0e\xa9\xc9\x96\x7f\x90\x2d\xf8\x48\x59\x07\x57\xe0\x2f\x42\x06\x35\xad\x72\x2e\xd9\x2c\xc2\x57\xfe\xb4\x53\xb2\xc1\x77\x24\xd9\x5c\xb9\x23\x68\x24\x34\x8c\x0e\xed\xda\xe9\x78\x1d\xed\x15\x66\x2c\x9b\x84\xa8\xad\x7b\x03\x70\x6a\xcb\x56\xce\x3c\x3a\x2f\xa0\x34\x75\xd9\x69\x06\xdd\xfd\x38\x63\x5f\xbb\xe0\xdd\x8c\xcb\x0f\xb7\x8a\xd9\x62\x48\x69\x20\xb3\xd3\x7a\x3b\xbb\x71\x96\xfb\xb1\xb5\xdc\x16\x21\x3a\x3c\xa6\xd0\x87\xd5\x83\x50\x19\xd5\xe7\xd0\x18\xb6\x2b\xfb\xd7\xe4\xf0\xf0\xc8\x3e\xce\x10\xab\xb8\x8f\xe1\x64\xc7\x5d\x5a\xd1\x91\xb3\x4f\xaf\xdd\x25\x36\x08\xf6\xe1\x61\x80\xdd\xd5\x19\xe4\xba\x93\x75\xcf\xaa\x3e\xd6\xdf\x6f\x07\x33\xef\x3f\xa2\xdb\x91\x33\xec\x74\xa7\xd0\xbd\xc2\x97\x30\x8b\x28\xc9\x45\x32\x5d\x5b\x2b\xb1\x6d\x28\xa5\x55\x69\xa8\x8c\xae\x22\x79\xaa\x1e\xc0\x1e\x12\xc5\x3e\x08\xc5\x0d\xa1\x78\xde\xce\xe2\x77\xb8\x3a\x5b\x3d\x59\xdd\x8f\x34\x7e\x2a\xf0\x90\x7e\xd4\xd3\xcf\x65\x6a\x0d\x21\x67\xd2\x27\x29\xb9\x96\x2a\xef\x3c\xc8\xd1\x0d\xd3\x79\x33\x4c\x0c\x58\x1d\xe0\xbd\x11\x04\x76\x5d\x9a\x19\x11\xb0\x7f\x40\x63\x52\xa0\xde\x57\xbd\xc0\xc6\x01\x7d\xcc\x50\xe6\x01\x2e\xb8\x9c\x69\xf6\x56\x98\xcd\x4b\x27\x63\x7a\x7b\xfb\xa8\x55\x06\x96\x13\x52\xfa\x22\x9f\x42\x8f\x4c\x7a\x08\xb0\x40\xa4\x75\x13\x1d\x7f\x1d\x51\x4c\xc5\xb1\x81\xba\x58\x44\xd4\x10\x45\x47\x56\x44\xd9\xe6\x7b\xa3\xac\x99\x45\x37\xd2\xe6\x5e\x9e\xbb\xca\xd8\xb4\x9b\xc4\x02\xed\xc9\xc8\xf4\x02\xa2\xbe\xca\x3f\x04\xc2\xaf\xfc\xa5\x34\x13\x1b\x9c\x42\x35\x02\x1d\x0c\x39\x6e\x00\x47\x7a\xee\x58\xce\xdd\x88\x06\xf2\x35\x93\xe3\xe4\x17\x4a\x13\x20\x82\xc5\xfb\x18\xc0\x3c\x14\x81\x4d\xbf\x4d\x49\xc4\x7c\x3e\xcb\x72\x8a\xf3\x77\xa4\x00\xb0\xec\xfa\xf2\x35\x61\x8c\x64\x00\x92\x10\x37\x12\x29\xc2\x28\x64\x43\xc1\x93\x67\x38\xff\x3e\x4f\xd0\x0d\xf0\x99\x4a\x65\x21\xa7\x0b\xc0\xe8\x28\x52\x7f\x3f\x0e\xf3\xc7\xe4\x71\x09\x23\x0d\x23\x1a\x14\x73\x3a\xf3\x31\xa8\x98\x16\x38\xf4\x17\x0f\x04\x93\x34\x62\x3e\x68\x67\x89\x41\x8d\x4d\x60\x22\x75\x4e\xa3\x16\xae\x73\xb2\xe4\x21\xfe\x2b\x53\xd9\x5f\xfa\x67\xe7\x6c\x88\x1f\x9f\x8d\x02\x03\xc9\x32\x44\xf5\x5c\xd2\x88\x32\x79\xc5\x8e\x38\x1a\x29\x5b\x47\xa0\x6c\x26\x91\x7c\x15\xb1\x19\xdf\x5f\x7e\xac\xfb\x66\xbd\x22\x59\x46\x9d\xcf\x67\xd5\x69\x90\x40\x8b\x38\xbc\xf4\xd2\x95\x19\x20\x00\x8f\xcf\x64\x66\x0e\x00\xba\xd2\x54\x1a\xe4\x30\xc4\x9f\xd0\x70\xb9\x95\xba\xd2\xbe\xe4\x87\x64\xae\x6c\xf4\xe3\x24\xae\x74\x06\x95\x88\x63\xff\xc1\x54\xfb\x75\xd9\x31\xe7\x1b\xb9\x0b\x52\x8e\x71\x92\xa0\xdc\x44\xa3\x3a\xe4\x25\xa8\xf5\x2c\xd2\x69\x6f\xcc\x09\x85\x78\xb0\xb8\xa3\x07\xa2\xa8\xe3\x81\xc8\xb5\xe9\xb8\x03\xaa\xc5\xc8\x25\x67\x43\x6b\x9a\x45\x7e\xb5\x34\xab\x82\x34\x4c\xad\xa3\x32\x37\xb3\x8f\x43\xeb\x69\x33\x09\x0f\x61\xd6\x61\x16\x2e\x2b\x68\xb3\x7a\xc9\x0a\x56\x2f\xe3\xac\x5e\xa2\x58\xbd\xac\xc9\xea\xd9\x3f\x61\xe6\xb2\x7a\xd9\x4a\x56\x2f\xbb\xbd\xcd\x5c\x56\x2f\x6b\xb2\x7a\x59\x18\x6f\xc3\xea\x71\xb4\x6b\x54\x5c\x3e\x85\x73\x88\xc0\xed\x2d\xaa\x00\xcc\x00\x2c\x2c\x56\x2f\x73\x18\xb1\x4c\xb1\x7a\x8d\xf2\xf3\xac\xbd\x35\x85\x61\xf5\xb2\xf5\xac\x9e\x3b\x42\xf7\xe9\xe2\x53\xcc\xf8\xf2\x24\xab\x47\xc2\x0c\x96\x61\x0a\xc0\xed\x6d\x79\xe4\x44\x40\xb5\x50\x41\xb4\x11\x15\xd0\x93\x71\x89\xa2\x24\x2e\xe7\xd9\x78\x6b\x1f\x04\xf7\xbd\x53\xbc\x58\x1e\x60\xfb\x55\x27\x8b\xad\x65\x8d\xe4\xe7\x7d\xf8\xbb\x1b\xac\x54\x84\x7e\x2a\xdf\x09\x6a\xc4\x94\x47\x57\x1c\x5d\x77\xd8\xa5\xd5\x90\xf7\x00\x54\xcf\x50\x91\x4e\xf1\x67\x25\xeb\xac\xb3\x6b\x4d\x68\xdf\xde\x2e\xf5\x08\xd5\x48\x7c\x20\x8c\xcc\x01\x4c\xfd\x79\x48\xfc\x79\x18\xf9\x7e\x7c\xc0\x23\x44\x62\xa5\xc5\xec\x9c\x82\x08\xf7\x9e\xb4\x9e\x1e\x74\x28\xfa\xc4\x7e\x01\x60\xc2\x08\xb3\xf9\x41\x66\x7e\xaa\x93\x5d\x5a\x7d\xbb\x0a\x61\x5e\x35\xa0\x45\x8a\x99\xef\x9d\x88\x14\x90\x7c\xcb\xfc\x3c\xc0\xf4\x9b\xac\x60\x0b\xd0\x50\x43\x4b\x8e\x49\x68\x58\x39\xdb\x8c\xbf\x3a\x05\xcb\x3c\x7c\xff\xc5\x12\x0d\x71\xff\x6c\x24\x7a\xab\x4e\x44\x76\xa7\x0a\xa5\x14\xf5\xf2\x90\xd5\x29\x32\x05\x0f\x27\x5e\x80\x06\x0c\xf2\xaa\x83\x9c\xef\x79\x25\x94\xd8\x75\x35\xc9\x84\x1d\x1f\xfb\x68\x88\x0c\x47\x36\x0a\x30\xfd\x21\xa2\x4c\xe0\x23\x24\xbc\xf2\x62\x0b\x2f\x8f\x43\xaf\x01\xc0\x49\x38\xa4\x23\x38\x0b\x37\xb1\x01\x76\x1f\x5e\xf3\x14\x4c\x1b\x03\x2c\x5c\x14\x3d\x5b\x81\xa2\x17\x1c\x45\xcf\x14\x8a\x5e\x34\x51\xb4\xfd\x13\x2e\x5c\x14\xbd\x58\x89\xa2\x17\xb7\xb7\x0b\x17\x45\x2f\x9a\x28\x7a\x11\x4e\x76\x47\xd1\x19\x1c\x1b\x14\xbd\x00\x70\x6a\xa1\xe8\x85\x83\x40\x17\x0a\x45\x37\xca\xcf\x17\x6d\x14\x3d\x35\x28\x7a\xb1\x1e\x45\xbb\x23\x74\x23\x0b\x3e\xc5\x05\x5f\x9e\x3c\xe1\xf3\x30\xe6\xe8\x79\x6e\xfe\x13\x78\xda\x8e\x4f\x5d\xa3\x90\x62\x2b\x3c\x4d\xae\xe9\x5d\x26\x72\x3a\x1c\x5b\xd7\xf6\x26\x35\xde\x9e\xdd\x27\xeb\x92\xe9\x83\x42\xeb\x73\x50\x68\x2d\x3a\xc8\xb2\xa6\xc9\x0d\xe2\x29\x82\x29\x5a\xcf\x9d\x9a\x2e\x6f\xaa\xd4\x26\xc3\x35\xc1\x33\x56\x1e\x96\x01\x85\x0c\x13\x47\xca\xc5\x37\x39\x2b\xb1\x30\x1c\xf8\x9e\xbe\xc4\xa5\xb6\xea\xd8\xae\xb2\xc8\xc3\x92\xb4\x53\x1f\xa9\xfa\xb2\xaa\xdb\x3a\x18\x8e\x3c\xe1\x22\x25\xbe\x52\x52\xb2\x97\xd2\xcf\x46\xaa\x8d\x79\x81\x86\xb3\x60\x23\xfc\xa9\xef\x67\xbb\xca\x55\x9d\x52\x15\x96\xfa\x26\x9f\x85\x12\x84\x1e\xc0\xb9\x72\xa8\x07\x9f\x88\xaf\x9b\x69\xf6\xc5\x06\x89\x8e\x7b\xa1\x3f\x2a\x58\x4c\xac\x58\x15\xf5\xe6\x3a\x2f\xe1\xee\xde\x9f\x77\x96\x0e\xea\x52\xf3\xe0\x2d\x0e\x83\x2f\x72\x44\x75\xb6\x01\xad\x61\x64\xd3\x45\xe1\x66\x39\x31\xbd\x9d\x4b\x23\x9a\x81\xcd\x77\xc9\x50\x1b\xe2\x7d\xe6\xa5\xb3\xf3\x2e\x3f\x65\x6f\x35\x97\x75\x2f\xf0\x47\x24\xac\x04\xce\x3d\x7e\x47\xbc\x01\x82\x58\x65\x96\xa9\xc1\x27\x5a\x7d\xbd\xf0\x19\xd0\xf9\x68\x05\xf8\x74\x31\x02\xb0\x0c\xb1\x7e\xfe\xcf\x9b\xaf\xec\xcd\xc3\x76\x5e\xd6\xa8\x6b\x50\x56\x15\xe8\x7e\x3e\xf4\xe0\x90\x6c\xd6\x91\x64\x2b\x1a\x73\xd1\xd3\x7e\x85\x69\x56\xb4\xb8\xd2\x61\xb4\xe3\x20\xf6\x05\x5f\x3b\xc6\xa2\x40\xdb\xbd\x58\xb7\x9b\x39\x3d\x8f\x43\xa7\xef\xc6\xb1\xbe\x8b\xe8\x0b\x4e\xff\xea\x66\x1c\xfe\xc6\xec\xf4\xdb\x7d\x3e\xb7\x7b\x65\xde\xa6\x23\x07\x6e\x45\x98\x71\x4e\xac\xe1\xd5\xbf\xd8\x82\xe3\x32\xa8\xb3\x8f\x72\xd6\x7a\x88\xfb\x99\xa5\xe3\x9a\xc3\x9a\xdf\x47\xc9\x38\xde\x96\x04\x4b\x81\xd0\x13\x10\x0f\x04\x1e\x12\x54\x68\x5b\xff\x8a\x2e\xc2\x33\x5f\x29\x9e\xce\x57\x88\xa7\x2a\x26\x0c\x9b\xbd\x23\xfc\x4c\x2d\x3a\x45\xd1\x12\x89\x80\x58\xfe\xc9\xff\xfe\xe7\xc9\x89\xc8\x36\xc6\x42\x94\xc7\x24\x41\x3f\xbe\xfd\xde\xb8\xee\x69\x37\x08\xe6\x37\xd6\xa4\x31\xa3\x20\xf6\x5a\x80\xf5\x11\x38\x67\x03\x2e\xa3\x6a\xc9\xb4\x82\x49\x68\xbb\x03\x14\xa1\x67\x4d\xcb\x83\x59\xc8\xb1\xe3\x78\xa3\xf0\xd8\x70\x29\xb0\x7b\xe0\xb7\xde\xfe\x38\x73\x85\xc7\xf1\x0a\xce\x97\xcb\x8d\xe1\x58\x71\xbe\xb3\x26\xe7\x6b\xff\x84\x33\x97\xf3\x9d\xad\xe4\x7c\x67\xb7\xb7\x33\x97\xf3\x9d\x35\x39\xdf\x59\x98\xed\x2e\x3c\x72\x31\x45\x0b\x8f\x33\x00\x27\x16\xe7\x3b\x73\xf8\xd2\x99\xe2\x7c\x1b\xe5\xe7\xb3\x36\xe7\x3b\x31\x9c\xef\x6c\x3d\xe7\xeb\x8e\xd0\x7d\x9f\xf8\x14\x67\x7c\x79\xf2\x60\x6a\x0f\x0f\x29\x34\x5a\x66\xfd\x16\x0a\x8b\xb7\x40\x61\x1c\x83\x37\xf1\x96\x40\x42\x6b\x7c\x19\xf6\x12\x25\x4b\x7a\x55\xb4\x5d\x18\x64\x1a\x7f\x7a\x92\x92\x69\xfb\x23\xc3\x19\x22\xf3\x9d\xdd\x4c\xec\x3c\xbf\x70\x2e\x31\xe4\x5a\xbf\x07\xf8\x06\x5e\xc2\x57\xf0\xa2\xc6\x9f\x3f\xdd\x27\x09\xf5\xdd\x2f\xe4\xff\xf0\xe2\x41\x32\xfe\x1c\x24\xe3\x97\xa1\x2f\x04\xce\xb9\xa3\x99\x6e\x44\xe4\x91\xf4\xb1\xcf\xaf\xb1\x92\x37\xe7\x9b\xf4\xd4\x38\x45\x3a\xca\xa3\x71\x20\xb0\x88\x3c\x65\x11\x0b\x5e\x48\x3f\xb4\x77\x8a\xd3\x95\xcf\xc7\x53\xa6\x3f\x0b\x71\x04\x3e\x43\x5f\x9a\x94\xbb\x3a\x35\x30\xef\xfd\x85\x85\xa6\xe6\xf9\x65\x4e\xae\x73\xed\x24\xb0\xba\x22\x65\x25\x8a\xb2\xda\x98\xbf\xd3\x15\x22\xc0\x89\x67\x71\x04\xda\x31\x40\x60\x52\x00\xa7\xad\x96\x71\xc4\x7e\x2c\xd3\xff\xc2\x6c\x46\xe6\xec\x2d\x9a\xaa\x4c\xc2\x22\xd5\x67\xb0\x94\xd6\x80\xb2\x18\xd2\x19\x99\xa7\xc9\xf7\xd2\x9e\x58\x96\x55\x1e\x80\x8b\x56\x9f\x98\xfe\x10\x95\x53\x3e\x2c\x97\x04\x3d\x00\xaf\xd6\x4d\x78\x89\x13\x98\x93\x04\x05\x33\xc6\x8a\xe7\x49\x52\x56\x7c\xbe\x88\xc5\xb3\x57\x44\xc4\x04\x9d\x53\x74\x81\xca\x2b\xb1\x19\xd7\xad\x9e\x24\x8d\x90\x23\x41\x1b\xf6\x2e\x10\x00\xfc\xd8\x5e\xbd\xb0\x1e\x78\x67\x90\x39\xef\xec\x8d\x30\x77\x57\x3f\x7e\x14\xce\x6d\xba\x73\x31\x8b\xba\xb6\x3d\xb1\xd8\xff\x10\x26\xbe\x7f\xe3\x30\x7a\xf9\x0e\x8c\xde\x4f\x9a\x9d\x93\xef\x9e\xda\x95\x40\x17\xcb\x3d\xf1\xe0\x1b\x55\xfe\xae\xfd\xb8\x61\x9d\x5b\xf1\xb2\xf1\x6e\x25\xeb\xf8\x6e\xd5\xcb\xc6\x3b\x4b\xad\xe0\x96\x71\xe0\xba\x65\x35\x0c\x84\x3e\x47\x17\xe7\xe4\x05\xc9\x73\x7d\x03\xed\x2f\x0e\xc8\xcf\xd0\x53\x6b\x80\x26\x80\x9f\xd9\xdf\xd4\x1e\x88\x80\x59\x35\x50\xcc\x51\xbb\x74\xa0\xc5\xe7\xcf\xef\xe6\xf7\xf4\x47\x75\xbf\xe0\x2b\xa7\x8a\x88\x5f\x81\xa2\x4c\x86\x7e\xb8\x70\xc0\xaa\xbf\x0a\xc5\x92\xf6\xdc\x68\x5c\xc9\x96\x46\xc2\x41\x0b\xb7\xb7\x9e\x57\x3f\xb6\x50\x16\x95\x4c\x58\xab\xfa\x1e\xce\xa2\x29\x3a\xf1\xc0\xb9\xfc\xcb\x1b\x34\x3f\x33\x74\xc3\x4e\x3c\xce\xf1\x35\x8a\xa3\xa2\x48\xb1\xdc\xc6\x13\x11\x11\x18\x9c\x6b\x9c\x30\x30\x58\x44\x3a\x98\xb4\x2f\xb5\x3b\xd9\x5a\x0d\xf3\xfe\x8b\x65\xb3\x44\x3a\x72\x9c\xbc\x1f\x78\x5e\xb7\x4c\x20\x58\xfc\x2f\x96\x46\x7f\x52\xbd\xd7\xf2\xc0\xfb\x93\xab\xb3\x13\xb9\xc3\x9c\x7f\x8b\x23\x76\xa2\xea\x35\x30\x54\x75\xce\x99\xf8\x50\x0a\x09\xf5\x84\x7d\xe9\x53\xa0\x83\x8a\xb6\x17\xd1\xd4\xc7\x48\x1c\xd5\x81\x95\x8e\x8f\x7d\xf4\x38\x7c\x7f\x5c\x8a\x5f\xa1\x9a\x81\xaa\x6f\xa3\xb4\xea\x3d\x80\x48\x6e\xac\xc6\x37\x46\x5b\xa5\x40\xab\x7c\x4f\x8c\x5e\xab\x06\xb9\x28\x52\xe7\xef\x5c\x9e\x4b\xbb\xe2\xed\xad\x27\xc2\xa4\x37\x1b\x97\x28\x4a\x22\xe6\x29\xe2\x3a\xe0\xe8\xd7\x33\x27\x4b\x82\xa0\xb1\x4d\x42\xf2\xb2\x60\xd7\x40\x94\x42\x66\x73\x40\xae\xb7\x45\xaf\xa7\xea\xde\x80\xf7\x0d\x50\x9a\x4b\xcc\xe5\xb7\x93\x13\xb5\xbd\x6a\x6f\x6a\x9c\x68\x4d\xae\x75\x68\xd6\x1e\xa3\xe6\x61\x39\xa2\xd7\x58\x04\x61\xd5\x60\x01\xcb\x38\xa2\x48\x82\x70\x20\xe7\xb5\x14\xaf\x96\x08\x92\xc9\x84\x22\x36\x38\x85\x29\xce\x30\x1b\x3c\x43\x5f\x56\x47\xa2\xb2\x80\x6d\x77\xe5\xfa\x32\x72\x42\xd0\x7f\x86\xbe\x6c\xb5\xae\xf7\xb6\xbb\x0b\xde\x86\x94\x78\x8a\xf3\x81\x87\xf2\xc4\xab\x8e\x14\x1a\x6f\x56\xaf\x2a\x01\xa1\x94\x4c\xa7\xa8\xb4\xa0\xb3\xdd\x69\x80\x2a\xa7\xbe\x05\x7d\x99\xc7\xd9\x42\x82\x72\x31\x0d\x9c\xa9\x77\x2e\x32\x21\x5f\x64\xf8\x42\x7f\x99\x92\xe9\xb7\x7c\xdf\x07\x28\xfc\xaa\x8e\xa8\x5b\x72\x29\x7f\xa8\xdc\x7c\x2e\x51\x1e\xd4\xd9\xeb\xde\xca\xfc\x77\x3e\x02\xd0\x3f\x85\xd4\x72\xe3\x01\x23\x10\xb0\x19\xca\x85\xbf\x92\x8f\x8e\x8f\x51\x40\x2e\x6f\x6f\x45\x2f\x39\xba\x61\x22\xf2\xa8\x54\x0a\x23\x00\x11\x00\xc2\xc4\xb0\xfb\x33\x00\x50\xa4\x53\x7a\x87\x6e\xd8\x00\x41\xe9\x4e\x36\x30\x07\x42\x9e\x2d\x38\x2f\xd3\xba\xec\xc7\x32\xad\x40\xd5\xea\x69\xc9\x66\x25\xb9\x6e\x9d\x59\x09\x35\xe6\xbb\x54\xe7\x14\xe8\xcc\xd8\x79\xe2\x8b\xdc\x18\x84\x43\x96\x18\xa2\x8d\x94\x2b\x94\xc4\xf4\xda\x19\x4a\x74\x65\xf8\x09\x7d\x50\x74\x7c\x19\xc7\x53\xca\x26\x13\xa0\x9a\x12\x46\xbe\x43\x51\xd2\xd5\x95\xa2\x5c\x75\x79\x9b\xc2\x10\x46\xde\xc9\x90\xcd\xad\xd6\xe2\xf4\xac\x6d\xed\xae\xaf\xd1\x8b\x4d\xa6\x4f\x41\x15\xd1\x45\x1e\xf7\x12\x72\x9d\xa7\x24\x4a\xbe\xc5\x29\x72\x11\xcf\xae\x87\x92\x95\x0b\xd5\x01\x0e\xa3\xeb\x08\xb3\xde\x4e\x27\x70\x15\xc6\x77\x0f\x26\x02\x23\x61\x47\xfc\x08\xdf\xde\x3e\xc2\x01\xb9\x04\xf2\x48\xe4\xe8\x5a\xc6\x6a\x96\x0c\xa1\x59\x5a\x4f\x0b\xea\xa2\x55\x1d\x25\x89\xf3\x4b\x38\x9f\x36\xcd\x9b\x73\x35\x73\x1c\x8c\x53\x32\xf6\x01\x2c\xb5\xc1\xee\x8f\x6f\x7f\x50\xb7\x4c\x0a\x2e\x3f\xbe\xfd\xc1\xcf\xb9\x3c\x93\x90\x58\xb0\x6f\xea\xab\x36\xb9\xf6\x22\x0f\x1c\xa5\xc1\xac\x44\x93\xb0\x84\x69\x20\x03\x80\x87\xde\x4f\xe3\x34\xca\x2f\x3d\x98\x06\x25\x4a\x43\x2f\x27\xa4\x40\x39\x2a\x7b\x39\x29\xd1\x04\x95\x25\xdf\x9f\x34\xd0\x93\xaf\x5f\x28\xa0\x19\x67\x4c\x92\x45\x10\x15\x05\xca\x93\x17\x33\x9c\x26\x3e\x17\xa7\x02\xe1\xaf\xe7\x03\xd1\x6f\x46\xae\x90\x0f\xa0\x35\xf3\x12\x5d\x91\x4b\x6b\xe6\xa5\x0e\x83\x8d\xd5\x11\x71\x2e\x1a\x06\x55\x55\xc1\xd7\xe1\x0b\xff\xa6\xe9\x95\x72\xa9\x42\x81\xdc\x8d\x3b\xde\x1b\x77\x00\xcd\xe1\xde\xd9\x08\x4e\xff\x8e\x40\x35\x2c\x36\xeb\xeb\xd7\xb4\x07\xf0\xc6\x56\xd3\x5f\xba\xab\x31\xac\xe9\xe1\x5e\x5a\xaf\xdc\xbe\x3b\xb8\xdb\xc3\xdd\xb4\x2e\xda\x2b\xb0\x19\xe4\xe1\xe4\x8e\xb7\xa3\x53\xf4\x1c\xce\x76\xdc\x94\xae\x5e\x9c\xad\xe9\x1c\xd7\x83\xc3\xe9\x5e\x43\x6d\xe8\xdd\x92\x5c\x87\x8b\x5d\x0f\x98\x69\xbb\x61\x0c\x2d\x99\x0e\xaf\xf6\x38\xc2\x5b\xac\xc1\x12\x83\x87\xd7\x7b\x0c\xa1\x1a\xaf\x1f\x45\xb2\x4d\x1e\x1c\x7e\xdc\x71\x04\xd5\x70\x7d\xef\x36\x65\xdf\xc9\x60\x7d\x75\x2f\xeb\x07\xd4\xb4\x7f\xff\xc1\x4c\x0f\x9b\x07\x7a\x27\x32\x30\x1d\x32\xd0\x3b\xc9\x50\xac\x3d\x06\x2e\xc7\xb4\xf7\x80\x1d\xbc\xd7\xba\x81\x6d\xc6\x64\xff\x41\x1b\xbd\x38\x03\x7e\x08\x6f\x00\xb8\xbd\xfd\x20\xfe\xb3\x5e\x25\x5e\x6e\xf1\x2a\x91\x62\x4e\xc2\x3f\x45\xf4\x29\xa3\xbf\x2e\xef\xe3\x23\x69\xba\x53\xd4\xab\xcd\xfa\xb0\x72\xa5\xf6\xaa\x5c\xf5\xf0\xe9\x86\xd2\xda\x18\x52\x74\x1a\xcd\xa7\xa8\x2f\x92\x52\xec\xfb\x40\x9e\xa0\xf1\x7c\xda\x7a\x5e\x12\xd1\xbf\xf3\xc8\x7a\x3a\xb7\x9c\x59\x93\xa7\x7d\x3a\x8b\x0a\xf4\x89\x62\x92\xea\x17\x26\x79\xac\xd6\x5b\x3a\xfe\xec\x4f\x33\x0f\x46\x8b\x9f\xc5\xd3\xcc\x22\xf4\x85\xe1\x20\x6d\x3e\xcd\xa8\x9b\xe6\xd9\xf7\x4e\x59\x0d\x36\xec\x28\xe4\xce\x40\x8f\x17\x69\x0f\x37\x8f\x11\x16\xa5\x5e\x97\xd1\xa0\x8c\x92\xaf\xde\x6a\x1a\x5f\xca\x28\xc1\x73\x7e\x09\xaf\x95\x2f\x9f\x7c\xaa\x59\x5b\x07\x7a\x05\x2a\x63\xc9\xe3\xcf\x85\x09\xe1\x64\x53\xb8\xdd\xc8\x0a\xb7\xbb\x19\xb3\x69\xdb\x3d\xb5\x4a\x09\x79\x5d\x68\x2f\xb9\xf9\x45\xae\xdf\xad\xce\x61\xf8\x82\xcf\x4e\xc4\xb0\xea\xe3\x7c\x42\xbc\xfa\xb3\xca\x73\x70\x5a\x97\xe8\xdc\x06\x56\x91\x5e\xf7\x97\xca\x74\x44\xae\xbe\xe9\x82\xf8\x48\x69\x65\xcd\xec\xa4\x62\x40\x2c\xe1\xc4\xaf\xff\x7e\xec\x54\x53\x3a\x18\x59\x4f\xe9\x00\x58\x94\x6a\xd5\x62\xfa\x7d\x62\xc6\x79\x6f\x9d\x8a\x3e\xff\xd6\xff\x62\x29\x5e\x6c\xa6\x73\x9c\x7c\x4b\x4a\x19\x5e\x06\x28\xbd\x64\x16\xd1\xcb\x55\x8d\xf9\xb7\xb5\x8d\xe5\x96\x3b\xa6\x89\x02\x56\x27\x4f\xa4\x27\x47\x14\x5f\x4e\x4b\x32\xcf\x93\xe7\x65\xac\x95\x23\x4b\xd9\x6c\x80\xa0\x84\xd8\x80\x55\x02\x2a\x47\xad\x34\x56\x11\x6f\x14\x88\x00\x36\x6f\xe5\x50\x08\x04\x22\xa5\x9d\xfe\xd9\x67\x20\x88\x49\x59\x97\x30\x20\xb5\xfd\xcf\xf3\x69\x8a\xfc\xbe\xf0\x65\x7d\xf3\xfd\xc9\x13\x10\xa0\x3c\x91\x85\x75\x99\x4a\xfc\x24\xa0\xba\x76\x82\x50\x6d\xe6\x00\xff\xbc\x53\xad\x0b\x1f\xab\xbf\x7e\x8f\xf9\xac\xf7\x8c\x45\x2d\x15\x5f\x32\x12\xfa\x4b\x9c\xa1\x9c\xca\x50\x52\x55\xbb\x68\xb9\xd9\x57\xdd\x17\x99\x40\x80\x52\x61\x89\xc4\x14\x47\x5a\x57\xa6\x30\x1e\x46\xd4\x5f\x8a\x03\x31\x40\x50\x79\x27\xa3\x93\x27\x55\x77\x44\x6a\x15\x3c\x96\xe4\x31\x92\xe7\xac\x7b\xbe\xc0\xb1\x13\xd5\x68\x46\xd8\x28\x6e\xe2\x6d\x27\x5d\x2d\x01\x9c\x34\xad\x37\x27\x8e\x28\x96\x7e\x9f\x08\x85\x8a\x46\x77\x3b\x8e\xa3\x7a\x58\x3f\x8c\xbc\x89\x87\x0c\xa3\x7a\x58\x3f\x8c\x46\xd3\xdb\xd8\x59\x76\x35\x5c\xdf\x7b\xe3\xc2\x6f\xa7\x1c\x5a\xd3\x7e\xfd\x58\xfa\xda\x4a\xdd\xd0\x4e\xc3\x98\xa6\xce\x08\xe3\x70\xc2\x05\x9a\xf1\x4e\x56\xa2\xd3\x94\x8c\xa3\x54\x24\x21\xda\xde\x35\xc7\xb5\xb9\xda\x9a\x31\xb5\xdc\xa8\x3b\xc3\xb2\xdc\x07\x83\xa6\xf9\x03\xf7\xfa\x39\x70\xaf\xca\x8d\x65\xbd\x99\x50\xf3\xf6\xec\xe3\xc0\xdf\xe9\x68\x42\x0d\x1f\xc8\x77\xdb\x83\x44\x19\x26\x50\xc7\x0e\x24\x52\xe5\x38\x7c\x74\x2a\xdc\x52\x56\xce\xec\x53\x3b\xaa\x54\x24\xff\x2e\xca\xc6\xf3\x72\x8a\xca\x17\xf2\x25\x62\x59\x55\x90\x84\x73\x3f\x6d\xe8\x4f\xd5\x8a\xee\x4c\xbf\x1f\xb9\x23\xdc\xf9\x0b\x82\xf1\x52\xdf\xc1\x70\x55\x41\x9f\xa2\xa8\x8c\x67\x27\x31\xc9\x59\x49\x36\xa7\x2b\x59\x1f\xa4\x42\x7e\x8c\x49\x2e\x63\x01\xc6\x8b\x6d\xb2\x4b\x38\x7a\x87\xdd\xa2\x70\xd7\x08\x7a\x72\x9f\x10\xf4\xec\x01\x41\x7f\x0e\x08\x7a\xaa\x22\x5f\xe3\xa6\x7a\xa1\x71\xf5\xec\x84\x39\xda\xc7\x71\x3d\x46\x57\xed\x54\x3c\x7d\xe3\xfa\xc8\x22\x7a\x09\xea\x4d\xf8\xbd\x8f\xea\x10\xbb\x0b\x8c\xd2\xa4\xb7\xf6\x6d\xdb\x3b\xb9\x3a\x3b\x51\xd8\x60\x32\xff\xf8\x71\xe1\xc1\x65\x86\xd8\x8c\x24\x03\xef\xcd\xeb\x8b\x77\x1e\x1c\x93\x64\x31\xf8\xfb\xc5\xeb\x7f\x04\x94\x95\x38\x9f\xe2\xc9\xc2\x5f\x2a\x73\x89\x17\x32\xbd\xae\x70\x93\xf3\xa0\x58\x68\x11\xc5\x68\xe0\xfd\xde\xab\x40\xc5\xd1\xbf\x9a\x42\xf0\x81\x92\xdc\x07\x30\x0f\x71\xf0\x4a\xa6\xec\x0e\x3e\x90\x31\xbd\xbd\x1d\x8e\x84\x5b\x9b\x2e\xcc\x49\x82\x64\x69\x6a\x95\x0a\x2d\xab\x2c\x26\x56\xb1\x08\xf8\x2b\x8b\x23\xab\xb8\x48\xe7\x53\x9c\xcb\x72\x1a\xe6\xea\xe8\x9e\xc2\xb3\xd3\x3a\x61\xb1\x48\x7d\xfd\xfd\xcb\x01\x83\x17\x31\x29\xd0\x60\x88\x61\x3e\xaa\x42\x9d\x95\x78\xc9\x51\xf6\xc0\xfb\x40\xc6\x1e\xc4\xc9\x20\x17\x61\xc5\xe5\xda\x30\x4c\xa3\x31\x4a\x07\xef\xbf\x58\xe2\xaa\xf7\x55\x4f\x79\x93\x00\xbe\x23\xe5\x96\x63\xb5\x47\xca\xc5\xa3\x1c\x4e\x4c\xf7\x4c\x74\x19\x87\xe9\x01\xd3\xb7\x95\xd3\x62\x15\xab\x66\x9e\x84\xe4\x80\x61\xac\xf8\xce\x7c\x18\xd6\x00\xd6\x07\x32\xfe\xbe\x6b\xe8\xbc\x39\x83\x22\x8c\xd6\xcf\xa0\x35\xaa\xdc\x65\x35\xa2\x0d\xb3\x25\x3f\x58\x83\x4c\xd8\xed\xd2\xc1\x58\x26\x2d\xa1\x83\x09\x94\xc7\x65\x30\x83\xea\x80\x0c\xa6\x55\x88\x83\x77\xe5\x3c\x57\x41\x63\xd5\x00\xc3\xa5\xa8\x29\x12\x91\x2d\x7c\xef\xef\x64\x4c\x3d\x48\x61\x0e\x33\x00\x49\x21\x6a\x0e\x68\x05\x9b\xb5\x5e\x08\x71\x9d\x7a\x70\x0e\x4b\x38\xae\x2b\xce\xdd\x8a\x8d\x60\xb7\x31\x4c\xe1\xa4\xae\x1c\xbb\x95\xdf\x45\xf4\xb2\xa7\x83\x9d\x26\x90\xc0\x59\x5d\x39\x69\x4d\xe1\xe2\xfb\xde\x1b\xb9\x34\x0f\x16\x30\x82\xd3\xba\x72\x51\x09\x9a\x11\xf9\x71\x48\x7d\x3f\xb9\x13\x66\x70\xe2\x84\x51\x2f\x14\xd3\x37\x69\xda\x0a\x67\x86\x17\x34\x4e\xca\x12\xe1\x5c\x08\x7c\xf2\x33\xf8\x2a\x4f\x8c\x09\x2f\x1f\xb6\x76\x53\xe6\xff\x3f\x5c\x89\x62\x47\xe1\xa3\xd3\xea\x12\x2d\x5e\x92\xeb\xdc\xca\xee\x55\xc7\x2f\x97\x86\x33\x02\x65\xf1\x2d\x08\x18\xf9\x81\x5c\xa3\xf2\x45\xc4\xc9\xe3\x91\x87\xf3\x62\xce\xbc\x47\x21\x3b\x3e\x16\x56\xb3\x51\x89\x22\xf5\xf3\x44\x86\x0c\xbf\x44\x8b\xe3\x63\x5f\xe6\x8b\x47\x39\x7b\x29\xf7\x40\x67\x0b\x93\x99\x7f\xf6\xd7\x4a\xc9\xa0\xfa\x48\x05\xbe\x86\xde\x4f\xcd\xb5\x78\x72\x94\x66\x61\x30\xc6\xb9\x8c\x1f\xc3\xb1\x82\xb6\xeb\x89\x92\xe4\x1b\x3e\xc1\x1f\x30\x65\x28\x47\xa5\xef\x5d\xa2\x45\x22\x2c\x3b\x44\x1f\x4e\xcf\xa0\xba\xc6\x69\xfa\x12\x51\x56\x92\x85\x3b\xe9\x8e\x4f\x4e\x5c\x1c\x3d\xaa\xb4\x16\xda\x6d\x60\x62\xc5\x0d\xa7\x42\xa1\xa6\x72\xac\xc9\x1f\xea\xad\x56\xc3\xb6\x42\x39\x9d\x97\xe8\x15\xce\x71\x36\xcf\x7e\x10\x41\x66\xf8\x16\x3b\x41\x68\xbe\x3a\xab\x64\xf3\xd7\x85\x66\xc4\x04\x65\x10\x7b\xc8\x91\x91\xd4\x36\xab\x70\xf8\xac\x8c\x72\x99\x72\xf7\x1d\xf1\x79\x3d\x41\xe9\x3c\x88\x02\x9c\xc0\xa5\x50\xf5\x49\x0b\x84\xc1\xb2\xc6\x93\xd2\x20\x55\xfc\x5d\x55\x40\x91\x83\x6d\xfa\x97\x5a\x42\x6d\xf0\x26\x47\x01\x0d\x94\xbc\xcb\x2c\x03\x1b\x95\xa3\x40\xe0\xee\xdd\x26\xae\xb0\xf2\x56\x53\xa7\x58\x93\xea\x40\x23\x73\x35\x7d\x8b\x70\x99\x9e\xd4\x46\x76\x76\xd5\x88\xce\x6f\x11\x3d\xd1\x5d\x45\x19\x29\x91\x54\xaf\xf2\xbd\x43\xc7\xc7\xbe\x75\x26\x42\x24\x8f\xcd\x6b\x99\xd5\xf3\x75\xf9\x2e\x1a\x4b\x27\x47\x4e\x7a\xe4\x1d\x17\x0a\x6a\x63\x88\xa7\xf8\x3a\x7e\x28\x61\x19\xe6\x81\x62\xe5\xa8\xaf\x24\xa1\x82\x63\x81\xbe\xec\xbd\xcf\x4a\xac\x0c\x42\xd2\xf0\xd1\x76\x75\xfb\xfd\x48\x25\xfb\x38\x2a\x8f\x8f\xd3\xe3\x63\x15\x90\x7e\x4c\xe6\x8e\x0e\x97\xcf\x1b\x9e\x3d\x3b\x05\x15\xc9\x5f\xa4\x84\xca\xdb\x22\x67\xef\x7d\x43\xe3\xa8\x10\xa7\x88\x29\x4c\xc3\xbb\xb1\x03\xaa\xae\x53\x42\x07\xeb\xd6\x12\x8c\xd3\x79\xe9\x83\x0a\x80\x2a\x8e\xd2\x78\x9e\x46\x0c\xbd\x51\x89\xa6\x0d\x8e\x5c\x32\x52\x70\xd2\x8c\x26\x6c\x80\xa1\x54\x57\xe7\x55\x88\x82\x29\x62\x5f\x93\xb9\x60\x71\x25\xd5\x7c\xcb\x77\x46\x9b\xe9\x2f\x45\xec\xcb\xc1\xb2\xd9\x0e\x8a\xce\xaa\xaa\xaa\x60\x11\xce\xfc\xa4\x33\x16\x7f\x7a\x47\x82\x75\xe6\x8e\xa0\xad\x0b\xef\x6a\x80\xb1\x3b\x80\xa6\x4c\x87\x47\x1a\x70\x3a\x56\x19\xd2\xb6\xb7\x52\x69\xb7\x06\x30\xb1\x95\xb9\xce\x00\x1d\x28\x74\xff\xf1\xba\x3a\x5b\x3f\xbc\x8d\x98\xf7\x1f\xb7\xd1\xcb\x86\x01\x6b\x64\x72\xc0\x78\x56\x27\xeb\x87\x73\x31\xd3\x61\x7b\xd9\xe8\x69\xc3\xc0\x16\x42\x39\x60\x50\xbb\x17\x67\xc0\x38\x4c\x00\xb8\xbd\x8d\xc5\x7f\xb5\x46\x67\x51\x6b\x74\x44\xba\xba\xa3\x32\xd4\x21\x79\xff\x8a\xd5\x1f\xe7\xef\xe9\x8c\x5c\xe3\x7c\xca\x25\x08\x55\x56\xf5\xc8\xa4\xf7\xc5\x52\x57\xa9\xde\x0f\xf4\x17\xed\xff\xf3\xc5\x12\x55\x3d\xff\x8b\x65\x59\x7d\xb1\xcc\xcf\xbd\xc7\xde\xc0\xf3\x2a\xf0\xbe\xaa\x85\xf8\xe9\x46\xf5\xd9\x9c\x31\x54\xf6\x33\x94\xcf\x3b\x95\x66\x3b\xf8\x7c\x3f\x3c\x42\x3c\xe8\xb8\xee\xaf\x8e\x2b\x0e\xfd\xb2\x95\x36\x4c\x79\xb1\x19\x8e\xb0\x91\x00\x8c\xcf\xa1\x29\x75\xe2\x1d\xec\xed\xdc\x07\x06\xf7\xe1\x41\xf3\x00\x91\x15\x6a\x4a\x86\xb0\x31\x5a\xa9\xda\xa2\xc2\x0a\x1c\xd2\x9a\xb2\x07\xea\xc4\x4a\xb7\xb7\xc3\x11\x10\xb1\x95\xea\x70\xe2\xda\x8f\x04\xc9\xf6\x6a\x69\x79\xc8\xec\xdf\xea\xbc\x7b\x6a\x7d\x9c\x07\xc3\xe7\xfd\xb3\x81\x5d\x90\x9f\x9f\x0d\xf0\x5f\x73\x5e\x8c\xbf\xe2\x3f\x4e\x39\x3b\xd5\xf5\x5a\x31\x25\x8c\xfc\x9d\x8c\xe9\xb7\xa4\x34\x8b\xe1\x37\x05\x4f\xfc\x47\xe8\xf6\xf6\x91\x9a\x0a\x4e\x3c\xd0\xf4\x19\x61\x2b\xf3\x74\x09\x79\xd5\xf6\xdf\xe4\xcc\xb8\x07\xce\xc5\xbf\x57\x24\x9d\x67\x88\x7a\x42\xff\x45\xbd\xa3\x95\x7c\x37\x5b\x23\x16\x98\x29\x55\x22\x80\x72\xeb\xbd\xc5\xbc\x86\xb0\x4f\xf5\xde\x62\xd8\xc2\xbb\x1a\xc1\x5d\x81\x73\xbc\x38\x95\xdc\x4c\x1e\xd7\x77\xc1\x31\x9e\x45\x22\x53\xb0\xcb\xdb\xce\x4c\x9f\x9c\xd5\xf4\xe9\xf3\xc8\x41\x2b\x1c\x97\xfb\xed\x00\x2d\x5b\xdb\xcd\xee\x67\x36\xd0\x99\xb2\xfc\x7e\x99\x49\x27\x06\xad\xd7\x7b\x23\x46\x97\xf8\x5b\x22\x7c\xfb\x51\xc3\x02\xb5\x0a\x39\xb5\xe9\x65\xba\xd1\xa2\x1d\x02\x92\x0a\xf3\x91\xd2\xa7\x61\xea\xd3\x90\xf8\xfe\xfc\x00\x2b\xed\xb8\x15\x86\xc0\x3e\x1a\x9c\xec\xeb\x1a\x7c\x58\x65\xbc\x18\x1b\xd3\x6e\xe6\x16\x51\x11\xbc\xa1\x59\x56\x1b\x31\xc6\x2d\x23\x46\xe3\xa3\xcc\xc1\x65\x45\x28\xa4\x65\xdc\x08\x4a\x48\xcb\xd8\xca\x97\x78\xe2\x81\x73\x53\x9c\x09\x67\xb8\x93\xff\x1d\xfc\xfe\x9f\x27\x7e\xf0\x7b\xf0\xc5\x09\x18\x9e\x8d\x06\xfa\xbb\xb2\x31\xfb\x9e\x2f\xeb\x15\x62\x51\x97\x86\x72\x8d\xf9\x18\x0b\xf2\x88\xcd\xcb\x28\x15\x76\x66\xda\x96\xcc\x94\xca\xec\x13\x02\x81\x17\xe1\xdc\xc2\x5c\x59\xe8\xe9\x65\x79\x70\x1c\x0e\xa3\x11\x9c\x6c\x8c\x94\x35\x77\x3d\x71\x54\x0c\xb2\x59\xa3\xeb\xa9\x1b\x26\x6b\xb2\x82\x51\x9c\x72\x46\x71\xa2\x18\xc5\x69\x93\x51\xb4\x7f\xc2\xa9\xcb\x28\x4e\x57\x32\x8a\xd3\xdb\xdb\xa9\xcb\x28\x4e\x9b\x8c\xe2\x34\x1c\xef\x1e\x26\xab\x80\x99\x09\x93\x35\x05\x70\x66\x31\x8a\x53\x87\x8d\x9b\x2a\x46\xb1\x51\x7e\x3e\x6d\x33\x8a\x33\xc3\x28\x4e\xd7\x33\x8a\xee\x08\xdd\xa8\x82\x4f\x71\xca\x97\x27\x8f\x37\x0d\xe7\x5c\x3a\xa3\xe6\x3f\x11\x2e\xcb\x8a\x05\xb5\x4b\x86\x74\x7c\xb5\xe8\xc7\x24\x41\x19\x2e\x4b\xe2\x18\x73\x35\xbf\xad\x69\xe5\xa0\x5f\xb0\xdc\x19\xe5\xad\x6c\xa0\xd9\xb2\x86\x08\xf5\xe8\x14\x4e\x11\xeb\x48\x7a\x62\x30\x10\x67\x6d\x36\xac\xfc\x03\x19\xf7\xa5\x6e\xb6\x4f\x45\x6a\xd0\xfe\x38\xea\xb6\x66\x33\x24\xa8\xab\x9b\x04\x53\x89\x53\x31\xc9\x65\x0f\x77\x6b\xe0\x76\xbf\xa8\xd4\xdc\x50\xa9\xf5\xa4\xa6\x1b\xf8\x8a\x90\x31\x9b\xea\xe8\x94\xb2\x82\x0d\xf3\x20\xff\xfd\xc2\xca\xe7\x1a\x8c\x17\x26\x37\x74\xe9\xfb\xd1\x1d\x08\x32\x69\xb4\x20\x73\x26\x11\xa8\xb7\x6e\xa7\xeb\x26\x9b\x16\x26\x08\x9a\xae\x2c\xde\x1c\xd4\x55\xae\x8b\xec\x45\xd9\x01\x19\x79\xd7\xc6\x4e\xfb\x5f\x73\x34\x47\xc9\x00\x41\x21\x20\xe0\x7c\x3a\x60\xb0\x94\x59\x0c\x07\x18\x4a\xeb\x79\x86\x06\x39\x4c\xd0\xb4\x8c\x12\x94\x0c\x4a\x38\x89\x70\x8a\x92\x41\x0a\x53\x42\xd9\x80\xc0\x9c\xb0\x8b\x78\x86\xf8\x86\x26\x83\x08\xaa\x08\x30\x03\x2a\x0d\xbd\x83\x55\xf0\x35\x2f\xb0\xf2\x41\xd7\xfb\x7f\xc4\x54\x3c\xa5\x91\xd0\x0f\x32\xd0\xb0\x20\x03\xef\x5f\xaa\x46\x8a\xa6\x28\x4f\x7e\xc0\xf9\xe5\xa0\x29\x94\x48\x00\xb9\x16\x0c\x43\xdd\x70\x04\xac\xe7\x6a\x3d\xb7\xfa\x2c\xd8\x72\x4c\x05\xf5\xb4\x2e\x14\x60\xf4\xc4\x58\xc7\xc4\xa8\xa9\xb3\xf3\xd4\x4c\xd3\x1d\x26\x07\xd3\x68\x81\x4a\x3a\x78\x52\xcf\x52\x65\x9e\xf4\x8c\x3e\xa7\x3d\xc9\x52\x57\xd9\x79\x8e\xba\xe5\x5e\xf0\x7b\xa1\xce\x90\x9e\x5a\xde\x31\xb5\xd8\xd4\xd9\x79\x6e\xa6\xe9\x5e\x93\x33\x5e\xeb\x72\x6e\xb4\x63\x6e\x3a\xa0\xd1\xee\x53\xd3\x2d\x77\xd9\xd9\x19\x4a\x8b\x81\x77\x41\x32\x64\x45\xcf\xa6\xbd\x09\x29\x05\xf7\xd8\xfb\x40\xc6\xbd\x6b\x54\xa2\x9e\xbe\x8f\x3d\x52\xf6\xf8\x3d\xec\xc5\x2a\xe2\xc8\x15\x66\x8b\xc0\xab\x97\xf8\x52\x55\xd4\x6b\x2c\x3b\xd6\x98\x98\x3a\x3b\x2f\xd2\x34\xfd\x24\xab\xcc\x09\xeb\xd1\x79\x1c\x23\x4a\x27\xf3\x34\xe5\x8b\x4d\x70\x22\x8a\xcb\x79\x6e\x2f\xf3\x5b\x81\x94\xf4\x22\xd3\x8e\x45\x4e\x54\x8d\x9d\x97\xa8\x1a\xee\x75\xc0\x7e\x20\x94\xe9\x49\x91\x8e\x49\xa5\xe2\xfb\xce\x53\x12\xcd\xf6\x9a\xd0\x3f\x08\xeb\x19\x6c\xad\x67\x16\x75\xcc\x2c\x27\xac\x4f\xeb\x8a\x3b\x4f\xd1\xa6\x0a\x7b\x1c\x8e\x7f\x90\x0d\x47\xc3\xcc\xad\x87\x73\x46\x7a\x6c\x86\x28\xea\xe9\x27\x72\xaf\x1a\x55\x15\x8c\xc3\xc8\x12\x36\x12\x69\x99\xec\xc1\x22\x1c\xa6\x23\x98\x6d\x94\x61\xa2\x86\x13\x37\x6f\x0a\xe0\xb8\xd1\xe5\xc4\x95\x5f\xb2\x15\xf2\x0b\x17\x5d\xc2\x4c\xc9\x2f\x93\xa6\xfc\x62\xff\x84\x13\x57\x7e\x99\xac\x94\x5f\x26\xb7\xb7\x13\x57\x7e\x99\x34\xe5\x97\x49\x58\xec\x2e\xbf\xc4\x30\x31\xf2\xcb\x04\xc0\xb1\x25\xbf\x4c\x1c\xe9\x62\xa2\xe4\x97\x46\xf9\xf9\xa4\x2d\xbf\x8c\x8d\xfc\x32\x59\x2f\xbf\xb8\x23\x74\x33\x91\x7c\x8a\x13\xbe\x3c\x9d\xc6\x2b\xe2\xf2\x0b\x91\x72\x8b\xed\x65\xbc\x43\x3a\xbf\x36\x9f\x55\x8a\x0c\x83\x6b\xb8\xf7\x8e\x2c\xc2\x1d\xca\x34\xc3\x7f\x2b\x40\xf3\x39\xe2\xd0\x3e\x35\x48\x04\x05\xea\x3c\x8e\x17\x8b\x6c\x4c\x52\xe5\x41\x9d\x77\x1f\x59\x55\x87\x77\xc3\x8e\x8f\xfd\x3c\xcc\x4d\xe6\x7d\x33\x97\x7a\x83\x37\x9d\x7a\x3e\x47\xeb\x44\x56\x00\x00\x88\x45\x26\xa7\x20\x2a\x8a\x74\x21\x9e\x45\x2a\xd5\x19\xae\xee\x6f\xa8\x00\xc9\xd7\xa7\x1d\x9c\x3d\xc9\x6b\x7d\x3c\x62\xbd\x52\xa4\xa8\xb5\x75\x38\x22\x27\x6b\x49\xae\xad\x0c\x13\x32\xfc\xdf\x4b\x4c\x8b\x34\x5a\xd4\x76\x7f\x17\xf3\x2c\x8b\x44\xe4\x73\xf5\x4c\xd0\x40\x8b\x8f\xec\x24\xb4\xa6\x3f\x8e\x1b\x25\x8b\xec\x64\xd1\x50\x9d\xbd\x49\xa3\x18\xcd\x48\x9a\x08\x87\x3f\x3b\x88\xdd\xaa\x7e\x54\x60\xbb\xc6\xd8\x2a\x82\x9c\x43\x10\x9c\xf8\x72\x9e\x27\x23\xcb\xcd\xe6\x59\x94\xe3\x8f\x28\xf9\xbb\xee\xf2\x0e\x46\x16\xc4\x7d\xd5\xc8\x5d\x80\xb6\x00\x23\x66\x65\x7e\x0a\xb7\xe3\xbb\x99\x51\xff\xa0\x19\xd5\x7b\xf5\x42\xdb\x7c\x5b\x8e\xa0\x4a\xda\x7a\x2e\x8d\x54\x4f\x8d\x78\x65\x0a\x24\xa7\x61\x7e\x2a\xbe\xdb\xfc\xd6\xb2\x82\x29\xe0\x6c\x80\xf9\xa1\xd8\x4d\xfd\xbb\x3a\xda\x0f\x1a\xde\x60\x5c\xa2\xe8\x52\xc6\x27\x54\x82\xd3\x00\x05\xf6\xd4\x3b\x0f\xad\x6d\x97\xa5\xde\xe2\xad\x8e\x8c\x98\xa3\x43\x8c\x9a\x65\xec\xd6\x99\xde\x92\x09\x29\x7d\xa5\xfb\xec\x91\x49\xe7\xd6\x58\x7d\x00\x0d\x0a\x65\x3b\xd7\x58\xbb\x96\x6e\x06\x28\x68\x00\xfc\xf1\x63\x7b\x01\x82\xe3\xe2\x52\xa9\x01\x79\xf3\xbb\x62\x12\x07\x28\xb0\x37\xb1\x59\xc7\xc8\x2a\x03\x14\x34\xf7\xbe\x59\x6f\x35\xb0\x9a\xf5\xb4\x80\x31\x40\x41\x63\xf3\x1f\x3f\xae\x2a\x57\x7f\xa5\x03\x04\x34\xb8\x12\x52\xfa\x9c\xae\xb0\xf0\xec\x2f\xec\xaf\x46\x71\xa1\x20\xfe\x17\xf6\xf8\xb1\xa6\x56\xd2\xf1\xde\xd4\x18\xb2\xd1\xb9\xfd\x63\xb0\xac\x8e\xd8\xef\x9e\x9c\xe7\x8a\x88\xf9\x18\xc0\x47\xa7\x5d\xbc\x10\xa7\x43\x92\x50\x0c\xd9\x08\x54\x00\x0c\x36\xd0\x23\xda\x49\x41\x30\xa2\x3e\xda\xf4\xfe\x46\x7d\x0c\xc0\xc0\x9a\xd3\x8a\x09\xad\x26\x51\x9b\x68\x25\x86\x0c\x08\xcb\x38\x6d\x45\x5a\xf9\xcb\x0a\x22\x00\x74\x28\x4c\x50\x55\x3b\x04\x81\xe1\x2c\x48\x82\x8a\x94\x2c\x54\x2a\xe5\x87\xd0\x3e\xdd\xa1\x7d\x1a\xcf\x52\x2e\xd4\x9c\xb0\xeb\x77\x13\xfb\xc7\x1e\xa0\x19\xfb\x07\xd3\xd7\xc2\xee\xee\xd1\xd9\x1e\x61\x7f\x9a\x73\x3f\xa9\xff\xec\x67\x88\x95\x38\xde\x36\x97\xec\x6f\xf1\x65\xb7\x09\x1b\xda\xa7\x3a\x84\xda\x6e\xaf\xbc\x12\x3e\xe4\x0a\x95\x25\x4e\xf8\xc1\xec\x5b\x19\x37\x32\x92\xed\x01\x46\xe9\xaf\x28\x81\xe9\x64\x71\xac\xef\xd7\xf8\xc1\x38\xea\x73\x30\x8e\x9a\x84\x3e\x91\xe9\x12\xea\x7b\x40\x52\xfd\xdc\x9d\x36\x51\x15\xc3\x19\x4a\x71\x8e\xb4\x1f\xa0\x6d\x51\x25\xcc\xb4\x87\x23\xa0\xbc\xfd\x9a\xb9\x08\xeb\x6b\xa0\xcc\xac\xf8\xbe\x08\x89\x60\x9c\x61\x11\xfb\xb6\x33\x7a\x91\x4a\xec\xb5\xaa\xb5\x07\x20\xf1\x93\x30\xf2\xfd\xe2\xce\x53\xbe\x5b\x53\xb6\x13\xbf\x67\xbf\xda\xc4\xef\x56\xc6\xbf\x7a\xea\x8e\xdc\x67\xef\x83\x4a\xd5\xe7\x75\xec\x44\x7d\x6f\xa4\x50\x90\xe7\x84\x45\xad\x8e\x5b\x59\x04\x1b\x15\xea\x80\xfd\xc2\x3d\xce\x57\x99\x98\xb5\x5f\xc2\xb2\x3a\xc2\x13\x9f\x9f\x7e\x0c\xf2\x80\xce\xc8\xf5\xcb\x88\xf1\x0b\x7c\x84\x52\x8a\x54\xb5\x34\x44\x81\xc4\x83\xcf\x99\x8f\xfb\x67\x40\xea\xd9\xd4\x8c\x03\x6a\x1f\x1e\xa2\xad\xda\xec\xd2\x23\xa2\x7d\x12\xca\x3a\xf4\x71\xaa\x82\xee\xbc\x9e\xf8\x5e\x12\x2d\x3c\x10\x24\x78\x32\xf1\x9b\x95\x88\x5b\x09\xf2\x7f\xa8\x07\xbe\x3a\x3d\x3e\xf6\x1b\x33\xd6\xdc\xd3\xb2\x86\xee\x80\xc1\x0c\xb1\x68\x90\x57\x9c\xb9\xaa\x60\x16\x8e\xfd\xa2\xa1\x8d\xb3\x4f\xd7\x90\x1e\x6c\xa3\xdf\xec\xbd\xb5\x19\xd2\x58\x7f\x13\x37\xb8\xa1\x0f\x00\x8b\x46\xa0\x94\x66\xfd\xae\x43\xb2\x5d\x3c\x9e\xcd\xdd\x38\x23\x27\x61\x01\xc0\xed\x6d\x22\xfe\xb3\x28\xf2\x64\x2b\x8a\x8c\x27\x93\xfe\x04\xa3\x34\xa1\xfd\x28\x4f\xfa\xf2\x7c\xfd\xc6\xf9\x94\xa3\x6d\xa0\xb2\x46\x57\xd8\xce\x17\xbd\x3f\x6c\x3a\x0c\xd1\xd6\x30\x1f\xf7\xc1\x8c\x7c\xf2\x0b\x45\x80\x7c\x08\xd1\xf0\x59\x70\x68\xd3\xda\x7c\xbd\x25\x36\xf2\x6b\xdb\x36\x76\xb4\x0c\x4c\x30\xfd\x26\xc1\x0c\x25\x03\x4c\xfb\x48\xfc\x25\xa2\x1b\x3e\x4f\x12\x59\x16\x25\x89\x2a\x7a\x89\x52\xa4\x2a\x26\xf2\x4f\x6d\x25\xc9\x4c\x26\x2d\x3e\x5e\x20\x32\x75\x41\x4f\xf6\xab\x19\xc5\xee\x3a\x62\x18\xcd\x2c\x76\x57\x79\x69\xc6\x2a\xfd\x79\x98\xfa\x7e\x7c\x80\xc1\xca\xc4\x24\x7a\xe6\xe8\x4c\x6e\x83\x2e\xbb\x42\xe5\x98\x50\x65\x4a\x39\x36\xc2\xaf\x5a\x06\x4c\x94\x91\x7e\xfd\x45\x4e\xde\x78\x8a\xd7\x1f\xf4\x94\xb5\xb7\xb8\x48\xcf\x39\xf3\xe3\x66\xc8\x77\xdd\xf1\x90\x1c\x4a\xdd\x8b\x76\xe7\x6a\x6e\xc3\xe8\x2e\xdc\x07\x9d\xbe\xcd\xf2\x0e\xe7\x4b\xe6\x61\xcc\x29\xf5\x5c\xfc\x77\xb4\x83\xef\x92\x3c\xdc\xb4\x88\x98\xf0\x34\xb4\xe9\x52\xfb\xcd\xca\x2a\x64\x65\x14\x5f\xca\x14\xe6\xab\xbc\x9c\xdc\x30\x3f\x51\x59\x46\x8b\x15\x91\x81\x72\xd2\x17\x8a\x4a\xe8\x31\xcc\xb8\xe4\x2d\x7f\x38\x39\x2c\x33\x44\xa9\xb0\xd4\x2d\x49\xd6\x8f\x92\xa8\x60\xa8\xec\xa3\x2e\x3b\xc0\xad\x13\x57\xd6\x94\xf0\xfa\x3e\x51\xc2\x8f\xbf\x10\x25\xfc\xf0\x40\x09\x3f\x07\x4a\x78\x13\xfa\x49\xf8\xc1\x90\x88\x06\x41\x40\x60\x79\xdd\x8c\x06\xac\x31\xba\x2e\x96\x37\xd2\xe0\xf3\x8f\x3a\xc3\x9e\x30\x6b\xd4\x0b\xd5\xa5\x25\xfa\xd7\x1c\x97\xc2\xc2\xc4\xf9\x22\x30\x41\x5d\x2c\xf3\xbe\x44\x19\x0a\x65\x78\x01\x59\xa0\x9b\x87\xc8\xfc\xa9\xd2\x1e\xf1\xd6\x21\x92\xff\xc2\x3a\xa2\x6f\x88\xe4\xbf\xb2\x48\x4c\x35\x44\xf2\xdf\xea\x2a\x4a\x71\x22\xb4\xf1\x4b\xeb\xab\xe7\x35\x87\x3a\x3e\x7e\x54\x77\xa7\xc3\x06\xc8\xaa\xef\x5f\x61\x4a\x71\x3e\xed\xe9\xba\x3d\x2e\x9d\xf6\x44\x02\x29\xc4\x50\xd9\xf3\x54\x5e\x31\x91\x69\xcc\x0b\xde\xbb\xf1\x55\x15\x44\x87\x38\x10\x08\x16\x25\x87\x93\xb4\x0f\x4d\xb2\xa3\x36\xe7\xee\x46\x88\x01\x7c\x1d\xfa\x22\x46\x35\x51\x81\xa7\x96\x49\x49\x0a\x79\xbc\xc6\x07\xa8\xd4\xaf\x1d\x37\xbe\x89\x73\xce\x74\x74\xbe\x99\x53\xce\x61\xfe\xad\x10\x3c\x3d\x38\x75\xbe\x15\xd1\x22\x25\x51\xe2\xc1\x45\xf7\x87\xef\x22\xfa\x8d\x84\xd0\x95\x73\x7c\x05\xe0\xa8\x07\x85\xb2\xee\x39\xf0\x87\x23\x00\x8e\xb4\x6a\x46\x39\x02\x22\x13\xa2\x28\x47\xd7\xbd\x1b\x5f\x38\xbf\x0d\x10\xd4\xc7\x61\xc0\xa0\x38\x8f\x03\x11\x67\x5c\xfc\xf9\x22\xa2\x08\xf8\xfe\x29\x8c\x82\x9c\xc8\x1f\x08\x00\x6d\x42\x6a\x5e\x2b\x3f\x90\x71\xc0\xd7\x75\xde\x2e\x12\xda\x18\x04\x84\xdf\x32\x10\x49\xd1\xfd\x66\x25\x73\xfc\xf0\x47\x2e\xee\xb3\x08\xa7\x34\x78\x85\x58\xf4\x56\x4d\x4b\x04\xc5\xe2\x68\x12\x6f\xdf\x56\xfa\xc5\x47\xa9\x6c\x7b\x06\xa4\x3f\x49\x0d\xfa\x90\x71\x7c\x1d\x47\xcc\xc7\x52\xb9\x35\x8b\xe8\x1b\x09\xe3\xda\xc6\x61\x42\xca\x31\x4e\x12\x94\x37\x0d\x1c\x56\x0e\xac\x3a\x50\xe9\xe2\xc5\xdf\x7a\x0d\x75\xa7\x06\xa3\x84\x3b\xf5\xa9\xb9\x20\x7d\xf9\x35\x32\xf8\x96\x94\x99\x8e\xbe\x23\xcf\x80\x8e\x00\x73\xaa\x1c\x72\xe2\x92\xa4\xe9\x3b\x22\xb3\x79\xa9\xe8\xe1\x24\x7f\xa9\xfa\x43\x49\x50\xa0\x72\x22\x7a\xa9\xe2\x28\x8f\x91\x49\x97\xb6\x3e\x38\x0c\xa8\x7e\x6f\xf7\xc2\x1b\x95\x0b\x95\x6f\x72\x59\xb9\xf0\xae\xc9\x2d\x0b\xbf\x42\x43\x26\x50\xcc\x28\x64\x12\x4d\x99\xa3\xda\x88\xff\x66\x00\x63\xd6\xae\xd0\xa2\x82\x2d\x3f\x10\xcd\x8a\x63\x94\x92\x7c\x4a\xf9\x3c\x6b\xcb\x78\x10\xe0\x44\x86\x71\x13\x39\x15\x83\x7a\xce\x7f\x27\xe3\xef\x5f\x56\x7f\xfb\x62\x89\x85\xe7\xbd\xf3\x61\xb5\x0f\xa9\x15\x21\x27\xd7\xa9\xbf\x2c\x1f\x26\x91\x11\xd9\xca\xb0\x76\x7b\xeb\xbd\x20\xf3\x54\x9a\x7b\xea\xb5\xf4\x78\xf3\x23\x7b\xdb\x8a\x39\x9d\xa9\x27\x5e\xa6\x13\xd3\x35\xf7\xae\xaa\x9c\x02\xb9\x4f\x12\xd1\x04\x98\xbe\x43\x94\xdd\xde\xaa\x44\x65\xba\xaa\x7f\x0a\x85\x6a\x92\x22\x99\x92\x8c\xea\x66\x0e\x4a\x09\x1f\x9d\x35\x4e\x51\x9c\xa2\x88\x8f\xd9\x3c\x68\xea\x64\xd8\xbd\xc1\x95\x5b\x8d\xc2\xaf\x96\x28\xa8\xc9\x16\x54\x94\x4c\x85\xc5\x69\xaf\x5b\x7d\x17\x1e\x2a\xf6\x1c\xdf\x3a\xb4\x4d\x15\x37\xa8\x5b\xa3\x23\xaf\x45\xe9\x54\x93\xc0\x6b\xf6\x5c\xaf\xfe\x94\xcb\x6f\x93\xf0\x83\x3f\xee\x74\xc8\xcd\xef\xc8\x21\x77\xe6\x8e\x60\x82\xb8\xde\xd5\x08\x53\x77\x04\x9b\xe0\xdc\x01\x61\x6d\x39\x17\x0d\x47\x55\x05\xe0\xc2\x1d\xd6\xd0\xb2\x4f\x31\xa6\xe7\xf1\x31\xaf\x56\x8c\x59\x93\xc9\x4f\x31\xf6\xa3\x33\x3e\xb6\x33\xb2\x25\xa5\x6e\x1f\x77\xa4\xbb\x07\x00\xc7\x8d\xd4\x4a\xce\x79\x11\x38\x7a\xff\x61\x54\xfb\xf5\x83\xd8\x98\x7d\xbb\xa0\xea\xab\x9b\x3b\x23\x35\x22\xaa\xbf\xde\x46\x01\x80\x12\xcc\x5c\x0f\xbc\xd5\x0f\xe6\x4e\xfa\xa0\xd5\x72\x7f\xb7\xa0\xbf\xad\x44\xdf\xaa\x5b\x18\x8b\x9e\x93\x94\xc4\x51\xda\xa7\x8c\x94\xd1\xf4\xae\x13\x0e\x69\xcd\x00\xbc\x86\x1f\xe1\x07\x78\x53\x6b\x08\x5e\xdf\x27\x0d\xc1\x9b\x5f\x48\x43\x70\xf9\xa0\x21\xf8\x1c\x34\x04\xaf\x4c\xb6\xa4\xcd\xde\x96\x0a\xbd\x28\xbb\x83\xd2\xb6\x3b\xf8\x29\x96\xc1\x82\x75\x8e\xa4\x3a\x2b\x91\xc2\x56\xaf\x24\x82\xf8\x3b\x19\xbf\x49\x23\x99\x22\x59\xe6\x4c\x5a\x53\xf3\x1b\x85\xce\x78\xdd\xac\x35\x64\x91\x46\xf9\xeb\x39\x2b\xe6\x4c\x78\x69\x28\x8b\x0c\x27\x5e\xb2\xcd\x86\xf9\x40\xe4\x0a\xb6\xf8\x66\x25\x4b\x88\x77\xfb\x2e\xe6\x94\x58\xcc\x29\x27\x99\x25\x45\x3d\x11\x35\xa5\xc9\xa9\xca\x0f\x32\x22\x68\x33\x51\x3c\x62\xbe\x6c\xa6\x88\x2c\x53\xdb\xde\xc9\xb3\xd6\x89\x8c\x51\xe8\x4e\x32\x8d\x72\x1f\x1c\x59\x9d\xd6\x8b\x87\x68\xab\xc9\xa7\x51\xde\x39\x77\x55\xee\x39\x9d\xd7\x13\xee\xe6\xaf\x01\x08\x92\x92\x14\x3e\x80\x93\xd5\xa0\x2f\x17\x4b\x2f\x47\xd7\x46\x80\x53\x87\xe4\xdc\x59\x5d\x39\xcf\x7d\x30\x70\x0a\x65\xe8\x03\xbf\x16\xcd\xeb\xb0\x3e\x0a\x22\x38\x17\x89\x5b\x98\xf3\xa5\xf6\x31\x92\xe1\x7a\x6e\x6f\x8d\x07\xf8\x91\x7d\x18\x54\x90\x45\x65\xc7\x21\x04\xff\x8d\x70\x6c\xc2\x4e\x1a\x4e\xb8\xd0\x2b\xe7\x2d\xe0\xb9\x3b\x26\xaf\xf0\x2a\xc0\x8a\xcc\x5f\x07\xa8\x5b\x5e\xeb\x78\x16\x8c\x94\xa8\x56\x90\xbc\x76\xb4\x2d\x5a\x2f\xf2\xa6\xd3\x01\x19\x59\x77\xef\x4d\xdb\xeb\x58\x17\x99\x7b\xef\x94\xdb\x87\xde\xf9\x52\x1f\xae\xe6\x87\x1a\x6e\xed\x06\x4d\xc0\x99\x05\xce\xc8\x35\xc7\x26\x0a\x63\x78\xf0\xda\x59\x2a\xaf\x20\x91\x88\xa9\xf2\xd1\xa9\x52\x08\x6c\xf4\xc1\x6d\x28\x76\xd6\x83\x37\xea\xbd\xca\x9c\x12\xe5\x20\xa2\x56\xed\x18\x0b\x69\x60\x54\xd4\xaa\x82\xec\x64\xe8\x35\xb8\x90\x4e\x20\xf5\x82\x24\xc8\x54\xe2\xe7\x17\x53\x15\x41\x17\xe7\x53\x95\xf7\xbe\x51\x8c\x12\xab\x54\xf6\x9a\xa3\xeb\x97\x9c\x0c\x60\x15\x18\x55\xd9\x36\xb1\x68\x8a\x9c\x29\xd6\xc0\x3c\x97\x4b\x1f\x78\x6a\xa7\x2b\x75\x2d\x96\x9b\x8f\xac\x83\x23\x5a\x9f\x5a\x7b\xdf\x75\x39\xa4\x7b\x7a\xa7\x98\x2e\xae\x72\x43\x56\xe7\xb7\xb8\x53\x5a\xaf\xe0\x22\xbc\xf4\xa7\xad\xf0\x8b\x77\x28\x25\x5e\xb9\x03\xdc\xb9\x1c\xda\xee\x5f\x9e\x91\x6d\x6c\x81\x3a\x5b\x02\x38\x6d\x24\x08\x6f\xd6\xaa\xcf\xdd\x4e\xb2\xd1\xaa\x3e\x9c\xc1\xae\x5b\xfb\xe1\xde\xd2\xe1\xc1\xaa\xea\x8f\x5d\x63\x38\x17\x7d\x58\xdc\xf1\xb6\x88\xeb\xb4\x9d\x88\xd7\xd1\xce\x81\xd2\x07\x77\x05\x12\x0f\x1d\x9e\x4a\xfd\xa6\x05\x1a\x85\xca\x0e\x4f\xa2\x3e\x0b\xa7\x00\xdc\xde\xce\x6c\xb1\xf4\xd5\x36\x62\x69\x21\x01\xb7\x9b\x5f\x65\xf7\x1b\xf5\x81\x0f\xc9\x4a\x92\x81\xa4\x16\x06\xa3\x07\x39\xe7\x73\x90\x73\x68\xd8\x4a\x92\xb5\xca\x4e\x66\x7b\x93\x67\x71\xd2\x0c\xc6\xa9\x6d\x9e\xc9\xaf\xd6\xe6\x59\xe8\xaa\xbf\xb1\xa6\xdd\x78\x22\x55\x65\x02\xf4\xd5\x4c\x84\xdd\x97\x84\x19\x75\xd5\x42\x95\xd6\x6d\x77\x7f\x5f\xca\x27\x32\xc5\x30\xff\x83\xb0\xde\xb7\xa4\x8c\x51\xef\x87\x68\x9e\xc7\x33\x0f\x26\x0a\x61\x62\x92\x0f\x9a\xb6\xc4\x06\x6d\x29\x89\xa5\x12\x31\x26\xa3\x66\x78\xc5\x26\xf0\x87\xf9\xdd\xab\x2f\x45\xf6\xd9\xaa\x02\xd0\x19\xb9\x05\x44\x11\x86\x72\x5b\x3a\xba\xa1\x2b\x27\x48\xa4\x33\xb4\xb5\x29\xfb\x0f\x6a\x77\xb2\x7e\x38\xbd\xc1\xfb\x8f\x65\x7a\x58\x17\xfc\x92\x6e\x4b\x45\x4e\x1a\x2f\x7f\xfd\x78\x86\xd3\x64\x03\x65\x59\x69\x95\xbb\x85\x2b\xff\xe6\xa0\xcd\x0f\x44\xe3\xb7\x4c\x34\x74\x28\x32\x1c\x44\x29\x8e\x28\xf0\xbd\xfa\xa5\x15\xc5\x24\x41\x89\x7a\x74\xee\x0c\x3b\x56\x98\x6f\xc4\xa1\x3c\xf9\xc1\x94\xc7\x3c\x19\xd5\x44\x27\xfa\xd5\x12\x1d\xeb\x95\xff\xef\x17\xaf\xff\xe1\xcb\xd8\xef\x48\x68\xe3\x50\x28\xe2\xc8\x48\x2d\x5c\xe3\xcd\x5a\x29\x63\x18\x58\xd6\xce\xb6\x15\x8c\x42\xea\x93\xee\xc7\xb3\xf2\x50\x06\xb7\xbb\x67\x3e\x3f\x0f\x0e\xd3\xcd\x88\x6f\x65\x6b\x00\x89\x8d\xfb\x08\xd8\x35\x4c\x89\xc6\x7d\x8c\x9e\x08\x9c\x57\x8a\xbc\x0f\x7b\x25\xcd\xdd\x02\x35\x9a\x59\x64\xf8\x06\xe7\xf4\x84\x92\x52\x80\x6d\xdf\x07\x9a\xce\x2c\x8f\x0f\xa6\x9b\x0f\xa6\x9b\x0f\xb4\x67\xad\xe9\x66\x24\xd5\xcf\x0d\x27\x06\xc7\xd5\x5d\x3a\x0a\x94\x41\x89\xa2\xe4\x75\x9e\x2e\x80\xef\xcd\x29\x2a\x2f\x10\x63\x38\x9f\x72\x64\x3a\x45\x17\xf8\x23\xaa\x53\x4a\x3a\x71\x31\x59\x44\x2f\x65\x0a\xba\x60\x38\xd2\x4f\x3b\xad\x5a\x1a\xe9\xc8\x3a\x89\x1c\x53\xd3\x44\x83\x91\xd4\x8b\x4e\xfd\x25\xc5\x94\x5d\x08\xb7\x38\x8f\xb3\x96\xbe\x63\x44\xe8\xb7\x62\x55\xa4\x46\x06\x00\x3b\xd8\x15\xea\x68\xf3\xae\x5d\xa1\x0d\x89\xda\xba\xf0\x63\x5b\x9b\xad\x8b\x38\xa2\xd3\x1b\xd6\xf5\x8d\xe3\x7a\x24\x1e\xc7\xdc\xaf\x2a\xfc\xfe\x1b\x29\x08\x8a\x4f\xb5\x41\xa2\xda\x82\x96\x0d\x23\x07\xcf\x3b\xc2\x01\xd4\x36\x63\x94\xde\x84\x2f\x0c\xb2\xbf\xb2\x52\x1f\xd4\x7b\xe6\x68\x77\xcd\x1b\x48\x5d\xc3\x13\x79\x0e\xa4\xd2\x5a\x75\xb6\xaa\x51\xbd\x8f\xa2\x89\xd0\x07\xbf\x89\xa6\x38\x8f\x94\x54\x24\x63\x82\xc8\x97\x9c\x7a\xbd\x26\x07\x1b\xf3\x9b\x60\x38\xeb\xb4\x13\xba\xf3\x44\xc9\x2d\x3b\xa1\xe6\xb6\xdf\xd9\x38\x2d\x6b\xa1\x7a\x63\x0f\xf7\xfb\x70\xba\xb6\xf6\x6f\x2b\x47\xd4\x55\x8d\x37\x18\xc8\xd4\xac\xc4\x16\x9a\xe6\xee\xa6\xce\x08\x2d\xdb\x26\xfb\x8c\x1f\xae\xf8\x6d\x99\x31\xb9\xd7\xe4\x70\xad\x6f\x16\x8e\x01\xb8\xbd\xcd\x6c\x1e\xed\x66\x47\x1e\x0d\xb5\x03\x61\xdf\x67\x07\xd9\x5d\xd2\x86\x5a\x79\x40\x1b\x0a\x9a\x9f\x23\x15\xfc\x4b\x4c\x33\x2c\xc2\x82\xb5\xe2\xb2\x6c\x15\x7b\xc4\xda\xc1\x76\x6c\x40\x2a\x43\xb1\xed\x99\x73\xa2\xcd\x86\xcb\xc8\x99\x1b\xd3\xaf\xaf\xb6\x9d\x6a\x4d\x71\x27\x06\xfc\x7e\x7b\x0e\x3f\x30\xbf\xbf\x6d\xe6\x77\xa6\x98\xdf\x74\x0b\xe6\x97\x34\x0c\x88\x12\x44\x65\x84\x77\xc9\x71\xba\xbe\xb1\xfb\x21\xb5\xb1\xe3\xc0\xe2\xba\xbe\xaa\x27\x67\xd7\xf1\xb5\x15\x92\xbd\x23\x59\xb2\x98\xe9\x27\xc7\x8d\x9c\xfd\x13\xb0\x71\x78\x3f\x31\xf1\xa0\x40\xe8\xf2\x79\x9a\x4a\xf0\x79\x40\xa4\xa4\x52\x19\xaf\x8d\x66\x7f\x7d\x66\xd9\x58\xe7\xc7\xd6\x86\x09\x70\x9b\x90\xc1\x48\xa4\x8f\xe2\x73\xc3\xf4\x9b\x9b\x22\xca\x13\xe1\x1d\xa1\x0d\x7e\xd4\x83\xbf\xb0\x11\xbd\x90\x26\xa2\x81\x40\x87\xb2\xee\xdf\x9b\xd0\x55\xa1\x32\x8f\x2c\xd5\x7d\x18\xa2\xdb\x5b\x4b\xbd\x84\x84\x21\x07\xbf\x85\x32\xda\xa7\x08\xce\x2a\x79\x60\x6b\xc5\x43\x69\x68\x16\x65\x88\x1f\x7d\x20\x42\x08\xaa\x33\x08\x46\xa0\x2a\x50\x49\x31\x55\x69\x58\xf7\x9a\x62\xc8\x94\x0f\x1c\x61\x78\xb2\xd0\x7b\xfc\x62\x16\xe5\x53\x24\xfc\xcf\x15\x28\x3c\xe9\x27\x3d\x69\xfa\x7d\xdd\xb9\x9d\x7d\xe1\x8e\x70\xd7\x06\x14\x99\x3b\x40\xeb\x5e\x1c\xce\x3f\x3b\x23\x58\xfb\x29\x24\x80\x6d\x9f\x2e\x56\x76\x02\x60\x6c\xb3\xb9\x93\x96\xef\xba\xde\x33\x3e\x9a\x16\x9e\x77\x1c\xcf\xde\xf9\xb5\xc3\xd9\x87\x78\xff\xe5\x35\x7a\x71\x06\x34\x6e\xe8\x16\x0b\x35\xdb\x91\x85\x4a\x23\x61\x4c\xb6\x43\x78\xc3\x43\xed\xcc\x77\x56\x4e\x1a\x73\x80\x3a\xaa\x4a\xcd\x17\x15\xf7\x89\x2f\xca\x7e\x21\x65\xe4\x43\xcc\xbb\xcf\x82\x1f\x9b\x84\x7e\x2a\x55\x7b\xb6\xc8\x28\x83\x9d\xe0\x55\xa6\xbf\x96\x41\xaf\xd1\x31\x49\xa4\x50\x87\xaa\x92\x26\xc1\x39\xf3\x84\xf7\x74\x46\x58\xc3\x14\x5b\xb4\xb5\xed\x10\xda\x26\x05\x6f\x64\xab\xde\x4b\x0b\xcd\x38\x86\x05\x79\xd3\x10\x5a\x35\xb0\x03\x8a\x81\x4a\x1a\xde\x46\x77\xb9\x9e\x49\x84\xd3\x1d\x17\xf3\x6d\x84\xd3\xed\x57\xc2\x07\xe8\x5c\x46\x7a\x58\x5e\xbd\xac\xad\x20\xcd\x4c\x28\x97\x0b\x99\x9a\xb9\x9e\xa4\x72\xbf\x15\xe1\x50\x61\xa1\x75\x9e\x12\xc8\x1e\x8c\x15\xc7\xab\x3f\xf0\x39\x1b\xfe\xb9\x61\x62\xc2\x85\x76\x18\x87\xe3\x66\x22\x39\xd3\xd1\xe1\x41\x61\x12\xb7\x6f\x39\x97\xc3\x23\xc2\x98\x64\x6a\xbb\x46\x56\xb3\x88\x65\x91\x46\xb1\xc8\xd4\xdf\xe7\xb3\x9a\x97\xe8\x37\x14\x5f\x6d\x4f\xf5\xd1\xcf\x23\x19\x1d\xaa\x28\x2a\x51\xcc\x77\xcd\x0a\x3d\x7e\xb8\x86\xc8\xe1\x79\x04\x5c\x91\xd0\xfd\x64\x98\xa2\xbe\x8e\xbf\x73\x78\x04\xdb\x9a\xd9\x49\x7e\x21\xfe\xa1\x78\xe0\x1f\x3e\x07\xfe\x21\x33\x31\x73\xd7\xea\x73\xda\x09\x63\x39\x8d\xb5\x53\x03\xc8\x68\xb6\x19\x49\xf0\x64\xf1\x7d\x9e\xa0\x1b\x11\xd1\x76\x6b\x72\xb7\xbd\x81\x8d\x16\xb3\x6b\xfb\x9a\xf8\xd7\x6a\x5f\x03\x93\xce\xe7\x4b\xaf\x09\xa5\x64\xc5\x3b\xe6\xa3\x53\x3b\x12\x6e\x9d\xc7\xc4\x52\x15\x19\xcb\x4c\x1d\xe4\x7e\xa9\x50\xd1\xa0\xc9\x0c\xd9\x48\x10\x04\x6c\x86\x72\x11\xd9\x00\x99\xc8\xb9\x8d\x19\x59\xf7\x46\xde\xa4\x53\xf8\x0c\x00\xce\xc3\x70\xc1\xbb\x9e\xc8\x7a\x15\x94\x7d\x38\xea\xbf\x3d\x88\x02\x9c\x00\xc1\x51\x14\x4d\xaa\x7f\xf7\xfa\x93\x66\xff\x2d\x38\x4a\x16\x63\xa7\xf4\xb9\xed\x3e\x00\x9c\xdb\xf2\xb9\x33\x66\x13\x60\x3b\xa9\x04\xd6\xf5\xe3\x0c\xda\xc5\xe7\x64\x3b\x92\x4b\xca\x22\x46\xfb\x63\x72\xb3\x4d\x8c\xba\x26\x5d\x5c\xc5\xd3\xc0\xf2\x8e\xb8\x9a\x34\xdc\x9d\x89\xd9\x88\x47\xf4\x73\x77\x8d\x47\xca\x5f\x2b\x1e\x11\x46\xd6\xb9\x75\x1e\xa2\x7a\xfa\x34\xb4\xde\xd1\xe7\xe1\x21\x37\x06\x26\x6e\x0e\xb5\xf9\x0a\xda\x9e\x70\xda\x3e\x57\xb4\x3d\x69\xd2\x76\xfb\x27\x4c\x5c\xda\x9e\xac\xa4\xed\xc9\xed\x6d\xe2\xd2\xf6\xa4\x49\xdb\x93\x90\xee\x9e\x43\x8d\xf3\x54\x3a\x87\x5a\x02\x60\x6c\xd1\xf6\xc4\xa1\xbc\x89\xa2\xed\x8d\xf2\xf3\xa4\xbd\x37\xb1\xa1\xed\xc9\x7a\xda\xee\x8e\xd0\x7d\xbc\xf8\x14\x13\xbe\x3c\x95\xce\x22\x4c\x60\x2e\x13\xa8\xd9\xfa\xaf\x1d\x73\x59\xd8\x77\xfb\x6e\x5f\x48\x57\xbd\x88\x36\xdf\x4f\x1f\x18\xdd\x07\x46\xf7\x57\xc8\xe8\x96\xbb\x32\xba\x13\x52\xc6\xe8\x05\x49\xd3\xa8\xa0\x32\x90\xf0\x03\x57\xdb\x52\x43\xe9\x22\x07\x58\x22\x13\x4f\x93\x77\xd9\xf6\xe1\xb2\x21\xb7\xef\xf8\x78\xd9\x95\xe0\x54\xf0\xc2\x6e\x04\x82\xaa\x5a\xfb\xf0\x68\xcf\x7a\x28\x85\x24\xeb\xf1\x51\x64\x71\x05\xa3\x8e\x77\x52\x2c\x03\x35\x07\x4d\x68\x00\x1d\x7a\xe9\x68\xfb\x77\xd4\xed\xde\x4e\x77\x7c\xf9\xdc\xe7\xb5\xf3\x67\xe7\xd6\x1d\xf8\xdf\x15\xeb\xbc\x89\x61\xdf\xfb\x05\x6f\x75\x2f\xeb\x07\x6c\xbc\x50\xee\x2a\x8e\x34\x1e\x26\xef\x5c\x24\x60\x11\xbd\xec\x4f\xb5\xb1\xe3\xdd\x18\x57\xfd\x62\x3e\x0d\x47\xed\x5c\x03\xf7\xe1\xf9\x70\xfa\x0b\x71\x45\x8b\x07\xae\xe8\x73\xe0\x8a\xae\x76\xf0\x65\x68\xa9\xff\x5c\x0f\x85\x79\xd3\xc7\xa0\x61\xed\x1c\xaf\xf7\x3f\x28\xee\xd6\xff\x60\xe6\x98\x85\x69\xf3\xae\x69\x9b\x73\x99\xae\xf1\x30\x98\xae\xf5\x30\x98\x75\x38\x0b\x8c\xd5\x40\xb3\x86\xb3\xc0\x3b\xcb\x68\x7c\xa2\xdd\x05\x08\x23\xa6\x7c\x4b\x9e\xa8\x46\xc8\x16\x4b\x24\x79\x99\xbd\xfd\x0f\x2a\x98\x85\x8b\x66\xe2\xa2\x3b\x27\xed\x4e\xff\x8d\xa5\xef\x44\x64\xd7\x74\xe3\x24\x56\x72\x86\x6c\x98\xed\xd3\x1d\x07\x6a\x1c\xe4\x66\xe2\x28\x17\x74\x0d\xa3\xfa\xf9\xc1\xb6\x53\x6e\xf7\xed\xe3\x34\x8c\x0f\x7f\x7d\x55\x29\xa8\x2c\x4e\xe1\x6a\x57\x4e\x41\x06\x92\x7f\xb0\x22\x7a\xb0\x22\x7a\x60\x03\xee\x21\x1b\xb0\x97\x15\x51\x23\xfc\xdf\x07\x32\x3e\x92\x66\x38\x28\xa0\x4c\x84\x1f\x6c\x86\x42\x53\x9e\x10\xd0\x4b\x50\xc4\x45\xca\x5d\xac\x6f\x2e\x18\x29\x7a\x7f\xe7\x34\x7b\xad\xd9\x0d\x1f\x57\xc7\x25\xd9\x64\x36\xe4\x4e\x1e\xea\xb0\xed\x28\x98\x20\x16\xcf\xde\x46\x56\xe0\x36\x1f\x1c\xc9\x3c\x52\x3d\x16\xf0\xb9\x40\xd4\x1d\xde\xcd\x51\x44\x30\x60\xc7\xb5\x44\x3a\xa0\x25\xd4\xbf\x75\x20\x45\xdd\x9d\x01\x91\x4e\x83\xae\xa1\x84\xb7\x84\x52\x54\xb2\x4d\x60\xc2\x50\xa6\x34\x6f\xc2\xe9\xd3\xd9\x25\x29\xca\x20\x0b\x8b\xda\x2a\xbf\x10\xf3\x74\x8d\x90\xc4\xd4\xe4\x0a\xb6\x36\x44\x32\x9d\x7d\x02\x43\xa4\x7a\x3e\xbf\xb8\x31\x12\x2a\x31\x49\x70\xbc\x73\xb4\xae\x4f\x6f\x70\xe4\x3e\xcd\xd5\xd1\x9b\x84\xfe\x4b\x06\x15\x32\x37\xdd\xc4\xe9\x10\x1f\xdf\xa8\x65\xf9\x20\x90\x47\xdd\x67\xe1\x57\x4b\xe4\x33\x20\xb3\x8d\xa6\x8d\x67\x2f\x12\x7a\x56\x97\x1e\x8c\x42\x2b\xf8\x0d\x0d\x37\x31\x75\x79\xc3\xc6\xcc\xea\x88\x8b\x2e\xf6\xc7\xd8\x7d\x07\xa3\x2b\xa8\x5b\xcc\xa9\x1b\x55\xd4\x2d\x6e\x52\xb7\xb8\xc1\x2b\xb8\xd4\x2d\x5e\x49\xdd\xe2\xdb\xdb\xd8\xa5\x6e\x71\x93\xba\xc5\x61\xb4\xfb\x3b\x18\x67\x83\xf4\x3b\x58\x0c\xe0\xdc\xa2\x6e\xb1\x43\x7b\x62\x45\xdd\x1a\xe5\xe7\x71\x9b\xba\xcd\x0d\x75\x8b\xd7\x53\x37\x77\x84\xee\xc3\xc7\xa7\x18\xf3\xe5\x49\x74\xa1\xde\xc0\x2c\xfe\x6d\x57\x73\xb0\x92\x5c\xdf\xa1\xd1\xd7\x0c\xa5\x05\x2a\xe9\x49\x1a\x7d\x5c\xf4\x63\xa9\x21\xfc\x14\xb6\x5e\xf7\x83\x25\x2d\x7e\x21\x96\x34\x7b\x60\x49\x3f\x07\x96\x74\xec\x66\x72\x67\xa5\x07\x3a\x6d\xd5\xcc\x45\xf7\x30\xed\xe3\x9c\xa1\x92\x93\x84\x2b\x54\x57\xdf\x1c\x40\x9d\xb7\x07\xbe\x1f\x1d\xc0\x04\x25\x8e\xce\x89\x2a\xde\x26\x69\xba\x22\xce\xdd\x62\x65\xc7\xe1\xb2\x42\x16\x2f\x55\xd4\xf1\xa1\x65\xf8\x59\x0f\xe7\x09\x2a\x50\x9e\x08\x7b\xf6\x2a\x96\x4f\x57\x60\x29\x38\x78\x8e\x9d\xc4\xc3\x03\xf0\x87\xe6\x25\xeb\xef\x64\x0c\xd1\x48\x6a\x9d\xfe\x4e\xc6\x9a\x01\x5e\x7e\x20\xe3\x01\xaa\x04\x17\xbc\x45\xae\xa0\x00\x0b\x03\x31\x61\xc2\xf5\x5f\x98\xcd\xfe\xa1\x9f\xd3\x38\xa9\xa6\x61\xe6\x47\x9f\x54\x8d\x34\x77\x47\xb8\x6b\x7f\xb8\xb8\x35\x80\x0e\x89\x71\x67\x1e\x77\xcd\xfe\xd5\x76\xec\xa4\x03\xeb\xec\x00\xc0\xa8\x11\xc7\x2a\x8c\x38\xaf\x49\xf4\x7f\x16\xdd\x1c\x6f\x43\x37\xe9\x7c\x9c\x47\x57\x9d\xa4\xd3\x7a\xd1\xd9\x9e\xd9\xfc\x94\x96\x60\x87\x07\x0b\x8d\xa3\xfc\x7e\x98\x81\x09\x6b\xd0\x19\x17\xf8\xde\xf2\xcb\x5f\x2a\x1f\xc8\x77\x51\xe7\x85\x16\xac\xb6\x22\x8c\xbe\x7a\x39\x3e\x97\x7d\x0d\x50\x30\x8b\xa8\xed\xea\x09\x8e\x8f\x1f\xf9\x32\x8c\x0c\x3a\x3e\x96\x9f\x55\xec\x0e\xa0\xe2\xc8\xc4\x51\xce\xff\xf3\xbd\x12\x45\x49\x4f\x3a\x16\x7b\x9d\xb6\x69\x02\xa0\x94\x33\xe7\x0f\x86\x69\x0f\x86\x69\x2e\x72\xe1\xe0\x91\xc6\xb0\xfb\x30\xe6\x9b\x8c\xcf\x0c\x7a\x3a\x4c\xdb\xbc\xdb\xf3\xf2\x51\x3b\x0c\xc6\x7d\x60\xe1\x67\xbf\x10\x0b\x3f\x7d\x60\xe1\x7f\xeb\x2c\xbc\xd4\xaf\x2e\xc2\xa1\x4a\x9c\x5f\x67\xc7\x37\xe9\xf6\x47\x8d\x17\xe8\xbc\xcd\xd4\x1b\x44\xb1\xc5\x7b\xb4\xaa\x1b\x88\x74\xf9\xea\x29\xba\xb3\xc2\x32\x9f\x73\xc4\x00\x39\x3b\xab\xca\x2a\xfd\x3e\xbd\x32\x57\x4e\x3b\xd3\x8d\xee\xce\xea\xc6\x03\x47\x96\x23\xaa\xae\x20\xce\x09\x7b\x47\x8c\xde\xb7\xf1\x55\x24\xd9\x41\x32\x65\xeb\x11\x9e\xf8\x48\x27\xe4\x59\x3d\x08\x68\xab\x82\x53\x74\x85\xd2\x81\x77\x1d\x95\xb9\xa7\xd2\xdf\x7a\x6f\x91\x6a\xd1\xfb\x2e\x4a\x7a\xff\x20\xbd\x6f\x26\x13\x81\x47\x6d\xdd\xb0\xac\xc5\x70\x3e\xed\x31\xd2\x8b\xf2\x1e\xe6\x22\x05\x8e\xa3\xb4\x47\xd2\x04\x95\x3d\xdd\x47\x42\x10\xcd\xff\xff\xff\xf7\xff\x63\xbd\xa2\x24\xfc\xb8\xf7\xa2\x5e\x8e\xae\xf5\x77\xaf\x02\x47\x28\xa5\x68\x3d\xa0\x3c\xb0\x55\x3e\x52\x24\x1b\xd6\x79\x84\x9a\x46\x7f\xb5\x6d\x1f\x5a\x6d\xd4\xb7\xee\x79\x41\x41\x2b\x89\xf2\x29\x17\x4f\x5a\x7a\x74\x09\x93\x96\x12\xbd\x99\xb5\x49\x6e\x6b\xfd\xd0\xd0\x32\x61\xd8\x49\x76\xd4\xe6\x02\xe6\xc4\x37\x2d\x0c\x30\x7d\x5d\xa0\x5c\x3a\xf2\x5a\x55\xc7\x84\x22\x99\x07\x68\xb2\xc2\xde\xc1\x94\xab\x43\x68\x0c\x14\x54\xd8\x41\x0e\x82\x17\x64\x9e\x33\xf7\x45\xa4\xb1\x75\xea\x4e\xb1\x10\x05\xf5\xd3\xf3\xed\xed\x70\xa4\x51\x36\x3a\xff\xe0\x23\xf0\x98\x69\x54\x78\x03\x4f\xc1\x63\x9f\x05\x59\x54\x7c\xbd\xf0\x3d\xde\x48\x99\x1b\x18\x6c\x79\x0d\xad\x1f\xbc\xfe\xe0\x54\xd9\x51\xbe\x90\x91\x0a\xbb\x0c\x18\xf4\x84\xe4\x15\xf6\xc0\xe6\xcb\x52\x31\x32\x9d\xa6\xe8\x25\x9e\x4c\x74\x3c\x7d\x59\x62\x90\x9a\x06\x2e\x10\x96\x10\xd3\x15\x96\x10\xe5\x5d\x85\x2a\x6c\xf6\x6f\xed\xc0\x1e\x76\x09\x76\x6b\xc7\x30\xc1\x19\xc7\x40\x75\xbb\xa0\x85\x2b\xda\xae\x1f\xa3\x86\xf4\xfe\x26\x1d\x56\x1f\x2d\x4b\x0b\x77\x6b\xcc\x91\xfe\x44\x26\x10\x8a\x84\x5d\xd7\x99\xc7\x55\xb6\x6d\x06\xe0\x47\x5d\xb8\x08\x70\x1e\xa7\xf3\x04\x51\x9f\x05\xef\xf8\x4c\xcf\xd1\xe3\xb3\x01\x3a\xb2\x83\x02\xeb\x93\xec\xa3\x40\xe6\xb0\x6d\xdc\x84\x8f\xe2\xb2\xa0\x40\x02\xaa\xf9\x8d\x5f\x8c\x9a\x6d\xba\x69\x0a\x10\xe7\xe8\xf1\x07\x9f\x81\x01\xaa\x76\xe0\xba\x69\x9f\xb2\x12\x45\xd9\xce\xdc\xb7\x64\xa7\xc9\x15\x2a\x4b\x9c\x70\x58\xf6\x2d\x1b\xce\x8c\x64\x7b\xb8\xbe\x77\x6a\xc3\x39\x4b\x7d\xf4\xa0\xec\xfd\x7c\x38\x45\xa5\xec\x25\xae\xbe\x97\xa4\xda\x1d\xc3\xd1\xf7\x32\x9c\xa1\x14\xe7\x48\xf3\x81\x76\x4c\x64\xdf\x07\xe1\x57\xc3\x11\x58\xc3\x01\x2a\x63\x45\xe2\xc7\x61\xe4\xfb\xc9\xee\x9e\x1c\x52\x0e\xdc\xa0\x53\xd2\x83\xd9\x8a\xa5\xe2\xd7\xaa\x58\x82\x24\x7c\x74\x0a\xfd\x34\x34\x5c\x05\xc0\xb9\x5f\xae\x0d\xef\xc0\x81\xa0\xf6\x95\xec\x24\x0e\x96\xc3\x74\x14\x12\x41\xec\xa3\x3c\x27\x2c\x62\x28\xf9\x4f\x05\x2d\x97\x0d\x31\x5b\xa6\xfd\x94\x65\xf2\x99\x77\x98\xf3\x79\xf5\xc5\x32\x7c\x08\xe7\x38\x7c\xdf\xe7\xd7\x28\xfc\x4a\x75\x95\x73\x8c\x81\x27\x3e\x3f\xe4\x18\xe4\x01\x9d\x91\xeb\x97\x11\xe3\xf7\xd4\xe6\x59\xd3\x10\x05\x12\xd9\x3d\x67\x3e\xee\x9f\x29\xeb\x17\x2b\xf7\x4d\x2a\xf9\x0c\x7b\x0a\x20\x10\x16\x02\xaf\x27\xbe\x97\x44\x0b\x7d\x5e\xad\x36\x6c\x73\x9b\x23\x22\x18\x2c\x3f\x82\xfc\x37\xf5\xc0\x57\xa7\xc7\xc7\x7e\x63\x9e\x40\xe5\x59\x58\x2a\x78\x0c\x18\xcc\x10\x8b\x06\x79\x25\x5f\xc9\x8b\x30\xf3\x13\x9b\x38\xd6\xa7\xef\xf0\x00\x6e\x4e\xd7\xad\x3d\xdb\x8e\xa5\xd8\xd0\x07\x80\x89\x4d\xed\xe3\x30\xe1\x04\x39\x16\xff\xed\xa4\xbc\xa6\x24\xef\x5f\x61\x74\x8d\xb6\x4e\xb6\xbd\x95\x7e\x69\x53\x02\x1a\x48\xef\x48\xc1\xad\x13\x9b\xb8\xe2\xb0\xb5\x2e\x95\xd1\xc4\xaa\x61\x3d\x6b\x4d\xd2\x39\x4e\xbe\x43\x78\x3a\x63\x83\x59\x44\xfb\xe2\x77\x7f\x26\x0a\x6a\x8b\x2e\xdb\x90\x9b\x0a\x89\xba\xf4\xa3\x30\xf5\x7d\x7a\xe7\xb1\x62\x44\xf7\x3f\x4b\x18\x4d\x3e\xd4\x05\x2b\x6b\xc1\xc1\x35\xc7\x12\xa6\x5e\x94\xe4\x42\xba\x82\x4f\xa4\x5b\x13\xb5\x0e\x66\x22\xe7\x7b\xc1\x4a\x0f\x16\xe1\x90\x8c\x60\xb6\xd1\xa8\x84\x36\xe2\x27\xaa\xd6\x9c\x5f\xb5\x3f\x4c\x5c\xfd\x75\xb6\x82\x5d\x99\x70\x76\x25\x53\xec\xca\xa4\xc9\xae\xd8\x3f\xe1\xc4\x65\x57\x26\x2b\xd9\x95\xc9\xed\xed\xc4\x65\x57\x26\x4d\x76\x65\x12\x16\xbb\xeb\xaf\x39\xab\xa6\xf5\xd7\x13\x00\xc7\x16\xbb\x32\x71\x98\x89\x89\x62\x57\x1a\xe5\xe7\x93\x36\x51\x1a\x1b\x76\x65\xb2\x9e\x5d\x71\x47\xe8\x3e\x56\x7c\x8a\x13\xbe\x3c\xc9\xae\x44\x21\xe5\x68\x25\x12\xff\x09\x35\xb6\xed\x20\xb4\x43\xe6\x97\x14\x4f\x50\xbc\x88\x39\x13\x3c\x8b\x4a\x76\x80\x9d\xc9\xbe\xe8\x06\xce\x6b\x26\x39\x7e\x60\x92\x3f\x07\x26\x39\x31\xa4\xa1\x61\xa4\x9b\xb6\x50\x3a\x8b\xe8\xe5\x05\xa7\xaf\x9c\xd3\x60\xa8\x13\xed\xd7\x75\x26\x38\xc7\x74\x86\x92\xe7\xac\xd3\xfd\x99\x57\x0c\xcc\x79\xff\x87\xd0\xb0\xc1\xd2\xf7\xe3\x75\x26\xa3\x82\xb9\x13\x46\x18\x2f\x78\x0d\xcb\x25\xd6\x8c\x7b\x7c\x6c\xcc\x5c\xb5\x1a\xc7\x99\xb7\xf2\x97\xf5\x30\xed\x2b\x83\x0e\x81\xe6\xf5\x7c\xd7\xf4\xec\xf4\x56\xaf\xd0\xea\x52\x17\xca\x4e\xcd\x02\x7f\x88\xc6\x28\x95\xbd\x3e\x32\xdd\xe8\x66\x5e\x33\xe5\x79\x1b\x34\x35\x23\x6a\xd4\x02\x1e\xc5\x09\x8a\xa3\xd2\x03\xe7\xe6\xcf\x81\xfd\x1d\x15\x33\xc4\xef\x57\xea\x81\x73\x14\xd0\xf9\x98\xb2\xd2\x3f\x85\x48\x1a\x5b\x70\x36\xb1\xef\x01\x29\xe5\x37\x78\xa8\x1a\xbc\xdb\xe5\xc0\x9a\xaf\x6a\xed\x78\x8e\xc6\x4e\x2c\x3e\x1b\xdc\xd2\xc8\x76\xa7\x91\x9a\xed\xd7\x8f\xd5\xdc\x85\x3d\xfc\x61\x9d\x0e\xb6\xf0\x89\x4d\x76\x44\xf5\xfb\x9a\x13\x76\xa4\x39\xbc\x03\x6f\x96\x4e\x55\xc9\x7d\x78\x79\x1c\xff\x42\x2f\x8f\x0f\x59\x0a\x3e\x0b\x52\x39\x5b\xeb\xcf\xe2\x50\x37\x1d\xbb\xce\xdc\x74\x0f\xd6\xe4\x51\x7f\xd4\x94\x54\xbd\x55\x52\x52\x32\x9b\x8a\x52\x0f\x76\xb3\xc9\x0b\x1f\x49\x12\x22\x03\x32\xa0\x17\x24\x2b\xa2\x12\xf9\x0b\x9f\xc9\x72\xc0\x0f\x12\x6d\xf5\xba\xae\xc3\x8e\xbe\x64\x37\xa9\xef\x4f\xb6\xcf\xac\xb0\x2e\x9f\x82\x9a\x82\xdc\x15\xbb\x50\xaf\xb6\xe9\xe5\x21\xfd\x12\x7f\xd0\x00\x7c\x67\x55\xd4\x19\x19\xd6\x54\xa5\x26\x41\x43\x93\x16\xbf\x99\x45\x14\xb5\x74\x42\xf5\x2c\x6e\x6f\x4d\x01\x85\x2c\x5c\x7a\x45\x89\x84\x6e\xa5\x6f\x68\x2a\xf5\x06\xc3\x11\xac\x3f\x28\x0a\xac\x8b\x09\x65\x2b\x1a\x98\x2f\x8d\x16\xb2\x98\x14\x94\xff\xc8\x22\x9c\xf3\x3f\xaa\x23\x54\xe3\x0a\x64\xf4\x4e\x38\x94\x3b\x7f\x7b\x8b\x8e\x70\x93\x4d\x38\x3e\x66\xc3\xf7\x5f\x2c\x9d\xd2\x8a\xbe\x1f\x05\xc5\x9c\xce\x7c\xc4\x77\xf3\x48\x77\x33\x1c\xc1\x3c\x44\xe1\x57\x36\xbf\xa4\x58\x24\x8d\xb9\x58\x20\x26\x13\xa4\x28\x9f\xb2\xd9\x5f\x91\xfa\xe3\xf8\xd8\xc7\xb2\x47\xf1\x6a\x3a\xf0\xde\x28\x38\x78\x10\xd3\xe7\x82\x05\x18\xb0\x61\x27\xd8\x46\x01\x25\x19\xf2\x73\x50\x01\xd8\xec\xe3\x55\x84\x73\xbb\xbd\x1a\x5a\x55\xbf\xbd\xe5\x1d\x76\xc1\x75\x75\x8f\x6f\x74\x75\x6f\xc5\x27\x52\x34\x06\x34\xbb\x50\xf7\x08\x20\x76\xf8\x23\xe7\x14\x6d\xc7\xb9\xc4\xeb\x7a\x70\x22\xf1\xb7\xf2\x3f\xac\xb9\x04\x87\x7b\x0f\xb5\x73\x41\x74\xde\xa3\xc3\xd5\x7d\x9d\x09\x06\xd4\x59\x9c\x76\xde\x31\x6f\x70\xda\xbe\x61\xde\xe0\x4c\x5c\x90\xc1\x93\x8e\xcb\xe4\x0d\x9e\x76\x5e\x3e\x6f\xf0\xa5\xb9\x62\x83\x67\xd5\x91\x1d\x8d\x42\x23\xc0\xf7\x5f\x2c\xa7\x43\xd4\xbc\x39\xa3\xaa\xff\xc5\x52\x3e\xff\x57\xef\x37\xbe\x86\xa5\x38\xef\x66\xe6\x3a\x43\x1d\xea\x42\x91\xc3\xdc\xce\x0b\xd5\x62\xf1\xca\x79\x9e\x12\x7e\x54\xbd\xe4\x69\x9f\xa2\x54\x59\xab\xc8\x9f\x1c\x5f\xcb\x3f\xa3\x1b\x4c\xd5\x5f\x2a\x5c\x70\xf2\xb4\x3f\x21\x65\x16\x31\xf9\x37\xc3\x19\xaa\x0b\x56\xa7\x99\x52\x33\xeb\x53\xb6\x48\x51\xdf\x64\xad\x5a\xdd\x60\x9e\xe3\x7f\xcd\x51\xba\x58\x6d\xdc\x66\x73\x96\x92\x3f\x6a\xe4\x83\x85\xd7\xf0\x23\xfc\x00\x6f\xe0\x6b\xf8\xa6\xde\x9c\xcb\xfb\xc4\x78\xbe\x7a\x60\x00\x7f\xeb\x0c\xa0\xc4\x55\x17\x9c\x64\xa2\x1e\xce\x29\x8b\xf2\x18\x91\x49\xef\x39\xbf\x6e\xe7\xf2\x8d\xe8\x02\x0c\x5e\x45\x6c\x16\x94\x64\x9e\x27\x3e\x02\xf0\xa7\xd0\x9c\x62\x43\xc1\xcb\x30\x3f\x37\x56\x3f\x81\xb8\xc2\xef\x70\x86\x7c\x30\x70\x4a\x7f\xc0\x39\x8a\x4a\x9f\x2f\x43\x93\xde\x73\xda\x8c\x60\xc2\x7c\x04\x45\xc8\xdd\x21\x1e\x01\x30\x18\x9e\xc2\x33\x63\x3e\x53\x06\x65\x94\x4f\xd1\x5b\x31\x97\xe1\xd9\x29\x64\x23\x10\x24\x84\xa3\x4f\x9f\x6f\x5b\x05\xdf\xa9\xd9\xf1\xb9\x71\xfe\x36\x0f\xeb\xee\xb3\xe8\xa6\xd1\xf7\xed\xed\x99\x09\x17\xf6\xd5\xd9\xf1\xb1\x9f\x87\x17\x7e\x0e\x00\x5c\x31\xe9\xc6\xe0\x0c\x9e\x9d\xd6\x83\x0f\x4f\x61\x3e\x02\x95\x60\xa9\x5f\x84\x7e\xc6\xb9\xd4\xc2\x4a\xea\x25\x9d\x7b\x01\x1c\xbb\x1f\x12\x44\x63\x0f\xc0\xc9\x01\x9c\xe8\xa5\xe2\x17\xaf\x71\xc2\x66\x75\x8e\x58\x5d\xac\x5e\x34\x4c\xe6\xd6\x4b\x63\x2a\x25\xd9\x84\x3a\x6f\xab\xfe\x22\x55\x1e\x2f\x23\x36\xcf\x4c\xd2\xd6\xf6\xc7\xc8\x83\xd7\xce\x37\x46\x48\xca\x70\xf1\x86\x50\xe5\xe6\xfd\xd1\xa9\x80\x52\x24\xcd\x1f\x3e\x38\x1f\x4a\x14\x25\x0b\x0f\xde\xb8\x1d\x72\xb0\x7d\x9f\x78\xf0\xb5\xf3\xc1\xb2\x38\xe3\x9f\xdf\x58\x4c\xf1\x0d\xbf\x0a\x8e\x4d\x94\x70\xa5\x15\x1f\x6e\x6f\xc5\xab\xb8\xd4\x65\x2d\x56\x55\x5d\xa8\xaa\x12\xef\x88\xba\x49\xc4\xa2\xae\xaa\xbc\xfc\xbc\xf9\x93\x37\x76\x8a\x94\x81\x57\xbb\x1e\x08\x26\x69\xc4\x7c\x30\x68\x7e\x1a\xe8\x7c\xb7\xf3\xf2\x0a\x75\x0d\x2b\x3e\xdc\xde\x7a\xa9\x38\x9b\x5e\x75\xf3\xad\x20\x83\x35\xf5\xb7\x17\x2e\xbf\x9d\xb7\x4a\x06\xe8\x3c\x36\x47\x9d\x83\x45\x75\xe2\xfd\x6e\xdc\xfb\x5d\x02\x7b\xbf\xfb\x6e\xf0\xbb\x57\x1e\x18\xcc\x4d\xa5\x89\xaa\x00\x3d\x50\x2d\x54\xed\x2e\xf8\xb5\x46\x54\x25\x5d\x5d\x05\x4f\xfe\x4f\xe9\xc9\xbd\xb3\x4e\x9e\x56\x2f\x36\x24\x1a\xeb\xfb\x11\x9e\xf8\x8f\xb4\xe6\x53\x61\x32\x16\x22\xe9\xc8\x25\xb6\xda\x60\x0d\x59\xa4\x66\x5b\x4f\x89\x2f\x98\xa2\x12\x23\x0a\x7c\xd6\x1a\xff\x3f\xf9\xd6\xef\x3b\xfe\xa2\x3d\xbe\x81\x96\x1e\x4b\x5d\x96\x0b\xce\x93\x38\x30\x74\xee\x91\x3c\xd6\x17\x1c\x15\x99\x8a\xd6\x3a\xe4\x97\xdb\xdb\x9f\x80\x2c\xe4\xe7\x47\x86\x94\x58\x3c\xbf\xc1\xf4\xf5\x64\x42\x91\x0a\x60\x28\xe0\x02\x3b\x41\x20\x07\x79\x2b\x42\x1a\x6a\x17\x19\x51\x7d\x80\xa0\x38\x91\x4c\xfa\xca\x40\x1c\xb6\x10\x36\x83\x3e\x0b\xbf\x62\x43\x34\x02\x40\x59\x71\xac\x87\xb7\x86\x0c\x16\x24\x26\x97\x83\x2f\x1a\x83\x6b\x90\x2f\xe4\x94\x3b\x06\x35\x6b\xb5\x06\xc7\x61\x13\xd8\xb6\xd8\x57\xf8\x58\x0d\xb4\x12\x94\x0b\x05\xca\x77\x2d\x50\xde\xb8\xa0\x14\xf3\x52\x50\xe3\xdf\xdc\x79\x6f\xb5\xfe\xc8\x2c\x8a\xf3\xba\x5f\x13\xc6\x48\xe6\x03\x49\x75\x64\x4b\xb9\xb9\x20\x60\x38\xbe\xa4\xfe\x33\xf9\x87\xb9\xeb\x72\x39\xef\xc4\x37\x77\x7c\x7b\xc2\xe1\x93\xdf\x0b\x22\x1e\x23\x9c\xfa\xe8\xe4\xec\xc9\x29\x78\x7c\x66\x80\x25\x86\xd0\x94\x8c\x6f\xa0\xaf\x6c\xf6\x38\x05\x1d\x62\x98\x8f\x42\x74\xa4\x09\xbd\x9f\xf7\x31\x38\xf1\x59\xff\x8c\x13\xf1\xe1\xe8\x68\x42\x4a\x5f\xd8\xa5\x85\xa7\x7f\x21\x7f\x65\x7f\x21\x8f\x1f\x83\x54\x8a\xa6\xf8\x71\xf9\x7b\x62\x16\x9b\x56\xc0\xc7\x90\xd5\x9b\x3f\x3c\x1b\xf5\xf1\xf0\x74\xf4\xd5\xd9\x39\xa7\xbb\x03\x79\xd0\x17\x5d\xd0\x6c\x6d\x68\x13\x72\x6f\x39\x89\x6b\x02\x6e\x61\x01\x4e\xdc\x65\xaa\xca\x05\xb4\x3a\xe1\xf8\xef\x25\x4e\x38\x3e\x35\xa3\x0f\x61\x10\x04\x68\x14\x5a\x0d\x0f\x19\x5f\xfd\xba\xc0\x1f\x91\xdf\xd7\x8e\x62\x57\x11\x7d\x89\x33\x94\x4b\xeb\x1d\x41\xc3\x1b\x93\xf3\x3c\xeb\x90\x49\x73\x05\xfb\xd1\x45\x51\x54\x85\x87\x7a\x67\xcd\x77\x17\xf5\x35\x10\x66\xe1\x17\x42\xd0\x22\xa5\xef\x05\x37\x52\xb6\xaa\xcd\x81\x8e\x8f\x85\x89\xf8\xd7\x5f\x93\x1b\x1f\x04\x92\x65\xa8\x77\xe3\xbf\xf8\xac\x0e\x1f\x75\xb1\x7e\x54\xb1\xf6\x7a\xad\xf2\xec\xd6\x98\x51\x1c\x60\xce\xc2\x9d\xca\x0b\x28\x27\xd9\xaf\x0f\xbb\x04\x0e\xa8\xa7\xbd\xa9\x07\x31\x60\xbf\xc6\x94\x62\x99\xca\xe0\xdb\xd9\x18\x73\x22\x10\x64\xea\x3c\xc8\x9b\x29\x79\x42\x1f\x40\x79\x4f\xec\x0b\xa5\xbe\xa8\xd5\x2e\x53\x34\x61\x03\x04\xc5\xa0\x03\xd6\x47\x90\x8b\xee\x18\xca\x65\x0c\xf2\x3e\xae\x2a\x92\x7f\x9f\x53\x54\x32\x63\x8d\xaf\x20\x19\x22\x39\x61\x19\x06\xc7\x9e\x95\x21\x3c\x69\xcd\xb2\x0a\x80\xfb\x6b\x77\x62\x46\xae\x50\xd9\x67\x51\x39\x45\xcc\xab\xd1\xa6\xec\xff\x79\x4d\xe4\x82\x31\xce\xa5\xfb\xb5\xc6\xeb\x47\x2c\x20\xb9\xef\x65\x64\x4e\x11\xca\x85\xc9\x77\x33\xce\x47\x6b\x3e\x05\x11\x9e\xe6\xbe\x5c\x03\x18\x9e\x8e\x8e\x72\x95\x73\xec\x15\xef\xe5\x7f\x86\x0c\x62\x9f\x01\x28\xb4\xd0\x34\x9e\x21\x2e\xb9\x00\xdf\x8b\x26\x0c\x95\xd2\x7d\xd3\x83\x39\x14\x06\x8b\x79\xa0\xd9\x56\x2e\xeb\x09\x75\x96\x35\xa1\x8c\x70\x76\xf6\x8e\xe6\xe3\xf4\x9d\xa2\x48\x74\xce\x67\xb1\x5c\x3b\x55\x69\xc4\xc8\xeb\x09\xa0\xd6\x13\x3e\x03\x2a\xd4\x93\xc5\x46\x48\xfb\x9f\x66\x69\x14\x0e\xb9\xcc\x5c\xb5\xb6\x83\x2f\xc8\xdc\x41\x4e\x9b\x6e\x6f\xeb\xbf\x95\x38\xd5\xe0\x48\x96\xf2\x90\x0e\x18\x94\xa4\x1c\x43\x79\x36\x07\x39\x14\xf4\x6b\x50\x2a\x8f\xf6\x14\xb1\xa5\x66\x49\x07\xa9\x24\xf8\xc4\x76\x8e\x4d\x6f\x6f\xfd\x34\x14\xb1\x00\x3c\x48\xc2\xe1\x52\xf2\x04\x7a\xf0\x6a\xa4\x8f\x62\x64\x51\xea\x31\xa6\xf2\xc4\xd5\x32\x57\xc0\xaf\x01\x9c\x87\x2c\xc0\xf9\x95\x3c\xea\x30\x0e\x89\x32\x47\x54\x64\x47\x9b\x23\xa2\x61\x3a\x12\x7c\x56\xde\x5c\x9c\x88\xee\xac\xc6\xa3\x61\xe4\xe7\x70\x0e\xcf\x44\x34\x94\x21\xed\x9f\x8d\x60\xc2\xff\x90\x4e\x53\x85\x46\x36\x45\x18\x1f\x1f\x3f\x4a\xce\xe3\xc1\xbc\x1f\x0f\xf1\xe8\xab\x64\x88\x47\xfd\xf9\x79\x32\x88\xe1\x52\x92\x65\xc9\xe9\xcc\xb3\xc1\x52\xf2\xa6\x0c\x25\xff\x73\xb0\x05\xf3\x58\xf0\x95\x41\xd3\xe6\xbf\x07\x0e\xc3\x57\x0c\xcb\x11\x50\x5d\x17\x15\x14\xaf\xd5\x03\xa2\x96\xd4\x67\xfd\xb3\xaa\x02\x40\xbc\xb5\x44\x31\xf3\x01\x4c\xc2\xd8\x68\x30\x28\x29\x99\x01\x8c\x40\x60\xd1\x98\xfa\x28\x10\xbd\xc9\xff\x17\xeb\x00\x7d\xf3\x91\xb5\x3f\x02\x7e\xcc\x61\x11\xd6\x75\xfc\xc4\xa9\x05\xfa\x08\xc0\x2c\x8c\x83\x09\x4e\xf9\xf5\xf0\x73\x6b\x3c\xe6\xe7\x1d\xd5\xff\x5a\x3c\x3e\x3b\x05\xca\x55\xc9\x3a\xbd\x59\xfb\x94\x37\x46\x83\x5d\x4c\x6e\x28\x11\xa4\x86\x71\xdd\x56\x00\x97\xe3\xca\xbc\xfd\xa9\x1c\x81\xfe\xd9\x69\x55\x95\xd2\xc9\x7b\x16\x95\xcc\x6f\xa2\xce\xe3\x63\xd9\x2a\x23\xf3\x9c\xbd\x7c\xfa\x8d\x2c\xa5\xbe\x42\x37\x39\xba\x61\xca\x16\x7a\xb9\xa2\x9e\x28\x16\xf2\x69\xf8\x48\x11\x0e\x7d\xa5\x95\xfd\x44\xfb\x9e\x8a\x62\x1b\xa7\x70\x6c\x02\xaa\x56\xe7\x4b\xd5\xdd\x4b\x44\x59\x49\x16\x28\x51\x0f\x35\xa6\x04\xe7\x53\x7e\xf1\x76\x42\xee\x9a\xb8\x03\xa9\x86\xaa\x09\x24\x80\xbb\x75\xb4\xe8\xe8\x68\xb1\x5f\x47\x53\xcd\x5a\x39\xbd\x19\x96\x0b\x80\x4a\xd9\xba\x62\x92\xbf\xd0\x61\x3a\xea\xfb\x46\xf2\xe7\xcd\xcf\x0a\xf6\xdd\x1f\x39\x4b\xd7\x26\x96\xcb\x6d\xb8\x14\x7a\x35\xd5\xde\x77\x92\x34\x87\x48\xa5\x06\x97\xfc\x85\xc5\x3a\x98\x2f\x82\x71\xd0\x07\xc5\x3a\x89\x55\x05\x67\xe1\x2b\x7f\x62\xbf\x46\x28\x2d\xcd\x10\x07\x42\x4f\x8e\x92\xbd\x9f\x21\x0c\x99\x33\x0c\xce\x69\x55\x01\x38\x75\x47\xd4\x0a\xa0\x4f\x37\xe4\xc2\x1d\xb2\xd6\x2d\x7d\x8a\x41\x1f\x71\x84\x09\xaf\xdc\x41\x1b\x6a\xab\x4f\xb2\x58\xf1\xf0\x53\x01\x78\xbd\x72\xe8\xe8\xd3\x8c\x3c\x1c\xf1\x61\x3f\xba\xc3\xb6\xf4\x6d\x9f\x74\xd5\x1f\xdc\xe1\x8d\x36\xef\x93\x0e\x7b\xe3\x0e\xab\x74\x85\x9f\xee\x64\xbd\x6e\xc1\x59\xab\x21\x87\xd9\xa1\x8f\x86\x6f\xdc\xbe\x1d\x4d\xe6\x70\x7c\xe8\x08\x4e\xff\x8a\x75\x11\x91\x79\xb6\xf5\x34\xec\xec\x00\xc0\x89\xfd\xa8\xeb\x0c\xb3\x38\x74\x98\xc5\x56\xc3\xd8\x4a\x33\x0f\x0e\x13\x4d\x86\x76\x1c\xac\xd1\xcd\xfa\x11\xb5\x4c\xb6\xff\xca\x4c\x0f\xeb\x07\x72\xe9\xd5\xfe\x03\xb6\x7a\x72\x06\x9e\xd8\x2f\xd6\x2f\x36\x3f\x02\x53\xd6\x8f\xe2\x98\x94\xc9\x3e\xb1\x48\xd6\x7a\x43\x3e\x58\xf6\x3d\x58\xf6\x3d\x3c\xec\x7e\x6a\xcb\xbe\x86\x7f\x54\x7d\x93\x95\x95\x5f\xb7\x53\x68\xdb\xbc\xfd\x12\x2d\x3c\xe8\x51\x32\x2f\x63\x14\x0c\x47\x9e\x8a\xf9\x5b\xe7\xe4\x11\x51\x99\xd1\x8b\x28\x9e\x6d\x70\x38\x4d\xef\xc6\xf2\x4e\x4e\x08\x27\x9e\x6d\x32\xc7\x67\x57\x9b\xd2\x8d\xed\x68\xc9\xf5\x4c\x1f\x9d\x59\x4d\xea\x49\x1b\xdb\x3a\x92\xbf\x13\xee\xf5\x3e\x58\xca\xb7\x3f\x89\x9f\x50\x72\x21\xfa\x77\x25\x89\xba\x0b\xc8\x64\xc9\x25\x5a\xc0\x3c\x7c\x8f\x19\xca\x82\x2f\x96\xac\x7a\x0f\x4b\x53\xb5\x9e\x08\x4c\x55\xa1\x84\xa9\x50\x81\xa4\x46\xfd\x41\x42\x61\x8f\x9f\x7c\xbd\xf0\x73\x28\x36\x63\x8a\x18\xf0\x53\xc8\x80\xd1\x29\xf2\x01\x06\x29\x94\x81\x19\x06\xe4\xfc\xd1\x23\x12\xa8\x1f\x65\x55\x01\xd0\x78\x81\x32\x91\xb3\xf5\x72\xc5\x61\xab\xba\xcc\xb3\x24\x14\x0f\x0f\x13\xed\x74\xec\xc0\x71\x3b\xb3\xf5\xb5\x3d\x38\x96\x66\x6d\xdb\x2f\x6b\xb9\x9f\xc8\xe2\x6b\x37\xfa\x79\x62\xfe\xea\x8f\x49\xb2\x6d\xa2\xc9\xdf\x5c\x86\xfc\x47\x67\xc2\xe7\x51\x47\x14\xf9\xf5\xa5\xc8\x5f\xb9\x6b\x33\x14\x25\x9f\x66\xd7\x0c\x81\x2e\x7f\x5e\xc6\xe0\xce\xe2\x4d\x0a\x82\xd1\x49\x6b\x24\xd4\xf8\xf1\x69\x56\xb2\xdc\x71\x15\xda\x1a\x60\xda\x4f\xa5\xbe\xc2\xe4\x6c\x13\x73\x1e\x88\x90\xb5\x26\x5e\xad\xea\x69\x7d\xbc\xda\x8e\xf1\xf7\x27\x3b\xa5\x36\x3d\x59\xd5\xbd\x88\x2f\xa4\x6b\x8d\xe7\x8c\x91\x5c\x79\xe7\xa8\x68\x2d\x5e\xfd\xd9\x8e\x53\x54\x97\xd5\xcb\x6d\x76\x86\x65\xfa\x65\xce\x1e\x54\x24\x7f\x91\x12\x2a\x48\x13\xc9\x79\x27\x22\xd8\x3f\x3f\xde\xfa\xbf\x5d\xa2\x0c\x8a\x63\x5e\x44\x53\x9c\xeb\xb4\xdb\x77\xc6\xdd\x6f\xe3\x99\xd9\x99\x67\xe6\x21\x4e\xf6\x03\x43\xfc\x89\x42\xa7\x94\x6b\x98\xd2\x16\xc3\x4b\xf1\x47\xe4\x41\xaf\x88\xa6\xdd\x8e\xa1\x0d\x56\xb8\x51\xb7\xcd\x3c\xb7\xea\x76\x45\xe6\xb3\x2b\x89\x9e\xa0\x47\x8b\x52\x60\xae\x8e\x20\x2d\x5d\xb5\x65\xcf\xdb\x32\xd7\x3b\x64\x80\x57\xfc\x5a\x1d\xa1\x25\xf9\xd5\x46\x68\x31\x19\x52\xc4\x96\x3c\x79\x56\x97\x48\x28\x9d\x59\x55\x24\x74\xe1\x13\x15\x30\x98\x33\xe7\xf4\x39\x73\x2c\x83\x78\xb3\xfe\x19\xf8\xbd\x64\xa2\xf1\x47\xf4\xf8\x4c\x54\xe7\xb0\x7d\xde\x32\x2f\xc0\x56\xab\xba\x89\x7c\x1c\x90\x11\x4e\xe4\xbe\xc9\xd7\x3f\x0f\x28\x4f\x9e\x88\xb2\x37\xd1\x14\x39\xbd\x09\x7b\x9d\x95\x4d\x4f\x4c\xf7\xb2\x13\x3e\xe4\x0f\x38\xaf\x6d\x81\x96\x72\x81\x03\x04\xf9\xa7\x01\x83\x7a\x98\x01\x56\xef\xbe\x78\xe2\x9f\x89\x68\x2f\x5a\xcf\x7c\xa4\xdf\x5e\x8d\xb1\xc4\x19\x64\x7d\x04\x60\x19\x9a\xf5\x61\xc8\x1e\x23\xf0\xd8\x18\xcf\x0a\x73\x61\xbf\xec\x73\xf4\x88\xf9\x6e\xf0\x6b\xdb\x78\xd1\xf5\x97\x7c\x02\xff\x10\xc1\xe8\x06\xf9\x63\x26\x5e\xc3\xa4\x07\x13\x6d\x45\xd4\x93\xf0\x0a\x9b\xc0\x47\x4d\x51\x46\x02\x42\x22\x3f\x26\xa6\x23\x04\x99\x6c\x85\x20\x53\x1e\x1e\xda\xc5\x15\x2b\xc4\x49\xd9\xce\x9f\xb8\xbb\xa9\x23\xba\x38\x23\xc8\xc3\xb5\x87\x2f\x8e\x6a\xb8\xbe\x77\x7d\x0e\xf6\x90\xc0\x4c\xd3\xf5\x23\x98\xb3\xb8\x5d\xb4\xbe\x15\x6d\x37\xac\x02\xd3\x2d\xc3\xf4\xb5\x9b\x39\x3d\xef\x16\x3b\xc7\xe1\x9a\xcc\xef\xad\x43\xe9\xdc\x03\x79\x6e\x3f\x89\x49\xe5\x23\xfe\xb5\xe9\x88\x3b\x72\x19\x3e\xf0\x7a\xbf\x65\x5e\x2f\xeb\x70\x6b\x96\x67\xd3\x44\x2b\x6b\x46\xca\x53\xdf\xa2\xd5\x0c\xe2\x4a\x7e\x6d\x39\x1c\x41\x4c\xbf\x9d\xa7\x9c\xf8\xa1\xa4\xf2\x00\x4c\xfd\x79\x48\xb6\xd7\x72\xfe\x26\x19\xb1\x15\x9a\x53\x9b\xb3\x92\xab\x91\x71\x3c\x05\xbb\x80\x38\xab\x90\x91\x04\xa5\x03\x24\x78\x04\x4e\xd4\x8b\x15\x44\xfd\x70\x4f\xd1\x4d\xda\xc9\x5d\x09\xd7\x06\xed\xa4\x51\x1f\x3a\x2a\xc4\xac\x02\xe0\x68\x3b\xd4\x2a\x72\xbe\xf7\xc7\xdb\xea\x0d\xef\x2e\x86\xd2\x83\xa4\xfe\x80\xbd\x7f\x01\x49\xdd\xc2\xde\xb3\x3a\x9c\x5f\x97\xd6\x4f\x7b\xd8\x91\x8e\x98\x80\x98\x2a\x2f\x63\x07\xcb\x77\xaa\x21\x95\xf3\x7c\x1d\x4b\xc9\xcd\x6a\x3e\x48\x10\x8d\x07\x91\xf0\xdb\x6b\x13\x05\x99\x43\x43\x24\x48\xe7\x82\x39\xff\xa7\x5b\x7a\x6f\x26\x4a\xaf\x4d\xa6\x00\x2c\xfd\x38\x4c\xfd\x38\x54\x81\x57\xb3\xed\x63\xaf\x76\x11\x0f\x93\x13\xab\x31\x31\xcf\x12\x8b\x75\x89\x0a\x2b\x2e\xe7\xe1\xb8\x24\x59\xad\x75\x10\x2a\xde\xce\x4a\xb4\x73\xd1\x58\x51\x6d\x52\xd3\xb0\x98\xd4\x06\xcb\xcd\xe5\x3b\x01\x09\x2c\xeb\xb1\x2d\x30\x70\xd2\xd9\xd4\x09\x93\xe9\x84\xe6\xec\x9a\xf1\x1e\xd1\x39\x3b\xbb\x59\x17\xa0\x73\x9f\x40\x9d\x16\xf2\x17\xff\x7f\xff\xde\x8d\x98\x98\xf1\x27\x12\x36\x14\x50\x3e\xdd\xb3\xcc\xa7\x02\xca\xc6\x27\x89\xdd\x81\x42\x22\x7e\x02\xfb\xb4\xc0\x79\xde\x92\x45\xb7\x8b\xd9\xf0\x4b\xe4\x25\x3b\x9c\x2d\x2e\xa2\x39\xe5\xc2\xe2\x7d\x48\x4d\xd6\x91\x05\x4c\x4f\x9f\x86\xb6\x51\xe3\xde\x99\xc0\x3a\xcd\x1a\x1f\x32\x83\xfd\x56\x32\x83\x65\xd1\x62\x8c\xfa\x38\xef\xd7\xf6\xb7\xd6\x3d\x97\x28\xce\xad\xb3\xb6\xfd\xc8\x0d\xa0\xb5\xf3\x4d\x5f\xd9\x40\x2d\xca\x6b\xdc\xb8\x47\xa7\x70\x8a\x58\x87\xc9\xaf\x41\x04\x55\x05\x36\x42\x61\x9e\x32\xac\xd8\xba\x7e\x52\x92\x22\x21\xd7\x9f\xc4\x3a\xd1\x8a\x56\xf3\xc9\x72\x36\x3c\x98\x2b\x3e\x98\x2b\x7e\xe6\x32\xdf\x2c\xec\x4c\x59\x6c\x6e\xf6\x66\xdd\x5c\xf7\xa7\x1d\xd4\x70\x5d\x3c\x86\x36\x13\x24\xc2\x42\xbf\x2b\x4a\x5f\x1d\xbe\xaa\x70\xac\x0e\x6d\x23\x0f\x5d\x56\x63\x2a\x6d\xce\x21\x5d\x8f\x7c\xb0\xac\xe2\xa8\x60\xf3\x12\x19\xc7\x27\x61\xb0\x57\x37\x40\xa0\x4a\x70\xf2\x16\xc5\x08\x5f\xa1\xe7\x8c\x95\x54\xcf\x39\x68\x95\x37\x1d\xb2\x75\x1f\x47\x4a\x16\xe3\xd3\x3a\x3e\x46\xc7\xc7\x0d\x3f\xd6\xd7\x79\xdc\xed\xcb\xaa\x1c\x9b\x0a\xe5\x66\xf2\x52\xf5\x06\xaa\x76\x99\x76\x69\xd3\x23\x2a\x03\x76\xbb\xb9\xaf\x53\x4d\x89\xbb\x89\xd8\xf2\x12\x2d\x06\xac\x32\x21\x06\x94\x2f\xb2\x81\xab\xbe\x44\x47\xd8\xca\x20\x04\xce\x71\x50\x0a\x7f\x5f\x79\xfa\x7c\x06\x06\x38\x88\x92\xc4\xfc\x94\xb3\x36\xe0\xc5\xa0\x22\x05\xca\x5f\xe7\xcf\xcb\x92\x5c\xbf\xe4\x53\x15\xa4\x4e\xc7\x44\xae\x61\x0f\x2d\x20\xdd\xde\x7e\xc9\xaf\x9e\x40\x30\x2f\x48\x82\xea\xfa\x1a\x88\xfe\x9f\x43\xeb\x3b\xaf\x6f\xff\x06\xdb\xf9\x9c\x19\x70\xf5\x59\x89\xa7\x53\x54\x7a\x80\x4b\xa0\xcf\xb5\x9a\xc3\xf7\xa2\x12\x47\x7d\x72\x2d\x6c\xf9\x71\x98\x90\x78\xde\xd1\xcf\xfb\xff\xf1\xc5\x12\x55\xbd\xba\x37\x79\x68\xdf\x83\x23\x2c\xe2\x1b\x4e\x48\x3c\x17\x1e\x8d\x41\xc1\x11\x52\xce\x5e\xca\x6b\xe0\x03\x50\x55\x28\xa5\xa8\x87\xcc\x7e\x71\x60\x09\x28\xb6\xea\x56\xac\x8c\x04\x36\xfb\x01\x53\x66\x80\xf8\xe4\x8f\x8d\x75\x2f\xbb\xcf\x1f\x9e\xf0\x4d\xaf\x47\x89\x85\x29\x13\x03\xcd\xad\xdf\x1e\x4a\x7c\x61\xeb\xd6\x05\xbb\xee\x91\xbc\x78\x72\xc1\x78\xe2\x3f\xfd\xd3\x8a\x99\x07\xd2\x3f\x5e\x74\x8a\xc9\x9c\x2a\xb7\xcd\x0b\x3c\x4e\x71\x3e\x3d\xe2\xd7\x07\xad\x85\xa9\x1e\xc1\x39\x13\xed\x11\x72\x74\xc3\xf6\xeb\xfd\xe9\x13\xbb\x6b\xed\xec\x4a\x51\x9e\xf8\xda\xe8\x0c\xa2\x15\x3b\xde\x36\xfc\x35\x48\xee\x53\x44\x61\xac\xf1\xe4\xe1\x86\xb8\x4e\xdf\x7a\xa5\x3b\x24\x53\xeb\x6a\xef\xa8\xeb\x5b\xc0\x69\xa0\x8f\xfd\x47\x73\x3b\x5a\x3f\xac\x7d\xdb\x0e\x58\xa1\xdd\xcb\xaa\x67\x89\x5d\xac\x9a\x85\x5d\x46\x1a\x2d\xc8\x7c\xdb\x40\xdf\xbf\xa4\xda\xa5\xc1\x52\xd8\x53\xff\x04\x16\xcd\xff\x3e\x67\x0c\x95\xbf\x56\xbb\x66\xb1\x78\x8a\x3f\x22\x25\x3a\x6d\x2b\x31\xe9\x6c\xd1\x6b\xf4\x43\x86\x63\x4f\xef\xa3\xfd\x32\xf9\x14\x7a\xa9\x39\x45\xe5\x05\x62\x0c\xe7\x53\x7a\x2f\xb4\x53\x30\x35\x11\xac\x85\xa2\x52\xbe\x14\xa4\x96\x01\xdd\x05\xfe\x88\x5e\x1b\x3a\x71\x76\x0a\x9f\x3c\x83\xcf\x4e\x47\xc2\x30\x79\xa6\x02\x78\x55\x15\x8c\x1a\x3a\x2e\xea\x82\x62\x1e\x0e\xb1\x49\x14\x1a\x1f\x96\xf2\xbe\x70\x15\x5b\xf1\x0a\x41\xb0\xe0\x82\x60\xac\x04\xc1\xa2\x29\x08\xda\x3f\x61\xe1\x0a\x82\xc5\x4a\x41\xb0\xb8\xbd\x2d\x5c\x41\xb0\x68\x0a\x82\x45\x38\xdf\x5d\xb1\x15\x41\x6a\x14\x5b\x05\x80\x89\x25\x08\x16\x8e\x98\x56\x28\x41\xb0\x51\x7e\x5e\xb4\xf7\x39\x31\x82\x60\xb1\x5e\x10\x74\x47\xe8\x3e\xaa\x7c\x8a\x05\x5f\x9e\x56\x6c\x15\x5a\xb1\x65\x2b\x3b\xea\xcb\x46\x36\xe2\xa6\x34\x8a\x05\x13\xd4\x9f\x44\x38\x9d\x97\x3b\x1a\x12\x9d\xac\x36\x3d\x37\x48\x0a\xa6\x35\x9a\x22\xf7\x11\x4d\x45\xa1\x76\x7d\x20\xa5\x0a\x80\x2f\xb2\x0c\x07\x06\x78\xdf\x4a\xd8\x71\x88\x71\x30\xa2\xe4\xdd\xbf\x3f\x4f\x53\x12\x7b\x7c\x8b\xee\x06\xc1\x11\x2b\xcc\xbd\x18\x5d\x47\xb9\xd7\x1f\x9a\x03\xab\x8f\x96\xba\xbe\x3d\xd7\x1a\x37\xa6\xbf\x56\xdc\x58\x55\x90\x86\xa5\x85\xd5\xe6\x9d\x2b\x89\xc3\x61\x3e\x82\xc9\x61\x38\x2d\x73\x71\x5a\xb2\x02\xa7\x65\x1c\xa7\x25\x0a\xa7\x65\x4d\x9c\x66\xff\x84\x99\x8b\xd3\xb2\x95\x38\x2d\xbb\xbd\xcd\x5c\x9c\x96\x35\x71\x5a\x66\x85\x28\xda\x1a\xa7\x71\xa4\xa0\x71\x5a\x06\x60\x61\xe1\xb4\xcc\xc1\x38\x99\xc2\x69\x8d\xf2\xf3\xac\xbd\x3f\x85\xc1\x69\xd9\x7a\x9c\xe6\x8e\xd0\x7d\xc4\xf8\x14\x33\xbe\x3c\xa5\xdc\x0a\x33\x58\x4a\x9c\x66\x30\x1a\xcc\x2c\x9c\x16\x6d\xc6\x69\xf3\x29\xce\xfb\x11\xbf\x08\xc2\x58\xb4\x9d\x01\xad\xab\x99\x5b\xff\x33\xf6\x28\x5b\xef\xe2\x15\x93\x9c\x95\x24\x4d\x51\x69\xc1\xd8\xb3\xbd\xb4\x72\x92\x20\xfb\xdb\xdd\x78\x81\xc9\x7d\x7d\x6e\x0d\xa9\xa8\xa0\x0e\x93\xec\x7e\xe9\xd0\xdd\xd5\xca\x89\x56\x6d\xa3\xb8\xa8\x47\xf0\x41\x15\xd1\x45\x1e\xf7\x9c\x52\xa3\x92\x72\xa7\x74\x7c\x2c\x6d\x2d\xea\xce\x6b\xd5\x43\x74\x1d\x61\xd6\xeb\x6c\x26\x34\x4f\x56\xff\x47\xed\x18\x55\x7e\xf7\xcc\xb5\xee\x4c\xc6\x9f\xb8\x60\x11\xa3\xef\xc4\x63\x66\x29\xf4\x0d\xae\xac\xb2\xf1\xa1\xab\x20\x85\x88\x53\x98\xa1\x7c\xbe\x6f\x36\xa9\x03\x1e\x6f\x8c\x1d\x71\x7d\x8f\xa2\xfb\x76\x8f\x74\x8c\xbc\xa1\x17\x0d\x72\xc2\xfc\x61\x82\x29\x1f\x28\x19\x01\x4f\x3b\x29\xb6\x3f\xfc\x1b\xce\x8b\x39\x73\xcb\xe5\x6f\x4e\xf9\x42\x6f\x86\x93\x04\xe5\xde\x08\xfc\x1b\xf4\x18\xba\x61\x51\x89\x3a\x06\xf8\xb7\x21\x8b\xc6\x22\xdc\xdd\x68\x45\x67\xea\x73\xe8\xf5\xcf\x78\x67\xa3\xe0\x03\xc1\xb9\xef\xc1\x9e\x07\x74\x92\xd7\x96\xad\xae\x3a\x16\x1e\xf0\x7d\x72\xc0\x4d\x8e\x34\x13\x23\x95\x89\x2a\x6b\x1b\x17\x77\xa2\x0e\xfd\x7d\x5d\xf6\x52\xad\xa1\x59\x9e\x2a\x4f\x4f\xab\xb9\xab\x71\xfc\x45\xd4\xfb\xf9\x2f\xa0\xde\x5f\xab\x68\xff\x79\x15\xeb\x1a\x85\xdc\x81\x5e\xfd\x3d\x70\x8a\xe9\x1d\xeb\xd5\x2b\x11\x08\xb3\x91\x63\xb7\xa5\x73\x2c\x42\x4b\x03\xb8\x39\xe5\x2e\x59\xaf\x77\x1c\x37\xc6\x7b\x48\xbd\xfb\xab\x48\xbd\x9b\x86\x04\x80\xdb\xdb\xf4\x90\xac\xbb\x9c\x4e\x46\xa9\x0e\xf0\xdb\x61\x1f\x42\xf9\xa7\x88\xa1\x95\x8d\x82\x0f\xf4\x7e\xda\x85\xc8\x55\xec\xb6\xe6\x7b\xbc\xd8\x6b\xbe\x30\x69\x04\x23\x2c\x62\x0a\xd7\xfd\x4a\xae\xdd\xae\xb8\xb9\x83\xdf\x0e\x2c\x4e\x34\xe2\x3f\x14\x26\xa6\xa3\x7b\x0f\x9b\x7d\x41\x71\xff\x57\x7e\x32\x46\x13\x52\xa2\x7e\xfd\xcc\xb9\x17\x20\xdc\x6e\xee\x3f\x5c\x72\xd2\xcf\x22\x16\xcf\x10\xed\x67\x88\x52\xe9\x18\xbc\x1f\x6c\x3a\xba\xba\xff\xf0\x39\xf4\xc0\xfc\x76\x4e\x8a\xd0\x77\xce\x48\x9a\xec\x8f\x52\x1b\x7d\xfc\x06\x20\x62\x53\x8b\xa9\x54\x86\xef\x0b\x98\x76\x57\xf7\x1f\x3e\x14\x45\x65\x3c\x3b\x18\xaf\x38\xdd\xdc\x7f\xb8\x1c\xc8\x98\xdc\x73\x7e\xa4\xc4\x59\x54\x2e\xfa\x19\x62\x25\x8e\x4f\x6c\x25\xe2\x76\x6a\x3e\x86\xb2\x22\x8d\x18\xea\x4f\x22\x2e\x8b\x2f\x34\xec\x56\x39\xba\x48\xc0\xc6\x24\x97\x7e\x6c\xf1\xa2\xee\x2a\x41\xe3\xf9\xb4\x6d\xe8\xb0\x4d\x7e\xfa\x68\xa5\xd9\xb7\x76\x9b\x95\x3a\x44\x4b\x8a\x83\xb3\x5a\x9b\x38\xbd\x4f\xe6\xdf\x8b\x07\x33\xec\xdf\xba\x19\xb6\xd4\xa8\x5d\x29\x93\xa9\x12\x45\x0c\xbd\x53\xf7\xec\x5b\x79\xcd\x80\xbf\xc4\xc9\xc0\x7b\x33\x3e\xfd\xef\xc7\xec\xcf\xff\xcb\x83\xe3\x94\xc4\x97\x83\x7f\x1b\x0e\x87\x67\x67\xf0\x74\x04\x87\x4f\xbe\x84\x22\xc7\xb1\x7d\xbf\xbd\x11\x1c\x9e\xfd\x11\x9e\x8d\xe0\xf0\x4b\x38\x7c\xfa\x27\x51\x71\xf8\xf4\x14\x9e\xc2\xa1\x8c\x87\xe3\x8d\x46\x23\xa1\x25\x35\x55\xce\xd6\x55\x39\x7b\xc2\xff\x0f\x7a\xff\xfc\x67\xde\xeb\x89\xde\x4f\xa1\x37\xfb\x52\xfc\x25\xc6\x17\xce\xc0\x3d\x4c\xfb\xcf\x3c\xb7\xba\x6c\xf0\xe5\x19\x1c\x3e\xf9\x13\x1c\x3e\xfd\x23\x7c\x6a\x8d\xa4\xe7\x3b\x82\x5e\x5c\xcc\x3d\x33\xe0\x90\x37\xef\xbd\x78\xf3\xa3\xe9\x62\x04\x87\x23\xf1\x61\x73\x4f\x19\xca\x38\x86\x72\x3a\x7b\x25\x4a\xdb\xfd\xf1\x6f\x62\xd2\xb0\xd5\x95\x5c\x85\xae\xac\xfe\x5f\x96\xc9\x26\x4f\xdb\x60\x39\x35\x30\xd1\x7b\x32\x2d\xa3\x62\xa6\x36\xa5\x0d\x18\xbe\x92\x3f\xc3\x2f\xe5\x64\xe1\x70\xe8\xfd\x4d\xa6\xfc\x91\xff\x0a\xe7\x61\x7b\x67\x44\x06\x1c\xb1\x4a\x51\x4d\x2c\x41\xa4\xd0\x80\x52\xd1\x2c\x2a\x0f\xd5\x18\x02\xf0\x4f\x0c\xb8\xfe\xc0\xbf\x75\xfc\xfd\xc7\xae\x01\x14\xf4\x9a\xff\xe8\x49\x4a\x10\xe8\xff\xe9\x65\x9c\xc2\x27\x70\xe8\x3d\x2f\x91\x98\x57\x6b\x3d\x31\x49\x49\x79\xa1\xb2\x4d\xff\x4d\x3c\x43\xe8\xa5\x3d\x85\xc3\x7a\x3d\x6a\x26\x56\x75\x55\xfa\xa5\x7d\x22\xd5\x02\xf9\x17\xfe\xc1\x2a\xd7\x93\xe2\x97\xc3\x6c\xb1\x82\x78\x73\xba\xcf\xe0\xd0\x7b\x27\x23\xd3\x4b\x48\xca\xcb\x84\x69\x9f\xe6\x51\x51\x2c\xec\x65\x68\xda\x6c\xc3\xb7\x09\x02\x7e\x27\x52\xdc\xb1\xcd\x4e\xa5\x33\x73\x42\xe4\x1b\x86\x69\xa0\x3e\x3d\xe3\xcb\x7f\xf2\x67\x0d\x82\x3e\xbd\xe6\xf2\x5d\x4f\xfe\xd3\xf7\x56\x00\xc8\xdb\x58\x41\x7d\xf9\x93\x3c\xc9\x72\xc8\xa7\xe6\xe0\xff\x01\x0e\xbd\x3c\xca\x90\x3a\xf6\x4f\x2d\x18\xef\x79\x7b\x7b\x6b\xd7\x2e\x49\x4a\x0d\x2c\xd9\xff\x33\xf8\x27\xd5\xff\x1f\xe5\x91\x98\x67\x1e\xf4\x84\xb3\xa6\x75\x24\x9b\xd3\x3b\x18\x33\xec\x37\xd1\x3f\xef\x3f\xd1\x3d\x06\x55\x03\xa9\x9c\x57\x0c\x25\xff\xdd\xda\xa8\x66\x87\x1d\x28\xab\x31\x5a\xbb\x9d\x68\xf3\x07\xf8\x47\x79\x42\x9c\xcf\xe2\xe3\x33\xe7\x43\x27\x0e\x94\x08\xed\xec\xd4\xc2\x00\x22\xa3\xbd\x7e\xef\xfb\x5b\x81\xca\x58\xbe\x01\x9b\x2d\xb2\x2a\x58\x18\x40\x21\x8e\x34\xa2\xec\xb5\xe6\x09\x4d\xe3\x16\x2e\xe8\xc0\xc0\x75\x82\x23\xe7\x56\x1e\x76\xa6\xf5\x65\xa7\xac\x24\xc2\x83\x7b\xd5\x19\x5e\xb5\x88\x95\xc7\xa4\x77\xa2\x49\x51\x47\x4f\x25\xe2\xac\x32\x4a\x9e\x8b\xac\x56\xcd\xf6\xd0\xeb\xbd\x23\x2c\x4a\xef\xf0\x42\x6c\x5c\xe5\x9f\xef\x6c\x95\x7f\x5e\xbf\xca\xa1\xe1\x48\xe0\xd0\x7b\x85\xbf\xf6\xcc\x29\xec\x5a\xf4\x16\x0b\xd8\x66\xd2\x1d\xb3\x5d\x33\x43\x7b\x2e\x2b\xef\x9f\xd7\x46\xac\x2e\x7e\xf0\x8e\x23\xc6\x4a\x7e\x4d\x62\x0f\x6a\x62\x0c\x3d\x9c\xdc\xb8\x45\x1a\xe5\xf0\x4f\x23\x38\x89\x52\x8a\xf8\x92\x70\xd2\xc7\x2a\x7d\x8a\xf8\x21\x4d\x43\x78\xbd\x09\x97\xca\xfe\xa5\xb2\x06\xd0\x3e\xc3\x19\xea\x9b\xde\x50\x14\xcf\x3c\xe8\xf5\x85\x2f\x7c\x3f\x2a\xcb\x88\x0b\x6c\x8a\x7d\xf7\xa0\xc2\x3b\x7d\xfd\xb4\x9d\xf4\x67\xa8\x64\x1f\xbb\x3e\x8c\x17\x4c\xf4\xe8\x48\x9c\x2a\x9c\x49\x5f\x21\xb6\xd1\xbf\xc1\x4c\x70\xc8\xff\x88\x32\x34\xd8\x4d\x64\x0d\x66\x63\xea\x41\x4c\x2f\x78\x39\x7b\x45\x12\x34\x78\x74\x56\x49\xf3\x85\xeb\xd0\x8f\x39\x3b\x1d\x29\x5b\x67\xe0\xeb\xe5\x4a\xbb\x18\xda\x2f\xd1\x14\x53\x56\x2e\x3c\x00\x13\x5e\x93\xda\x41\x62\x6c\xab\x25\x58\xb4\x3e\xab\x4e\x02\x16\xd1\x4b\x2a\x03\xc1\xaa\xbb\x04\x60\x26\x7d\x29\xf9\x27\x50\x8b\x39\xbf\xf7\xc1\x32\x21\xf2\x0d\x5f\xb7\x2e\x48\x9a\x06\x05\x2a\x39\xe8\x7c\x00\x17\x18\xa5\x89\x6c\x8b\x33\x44\xe6\x0c\xf8\x67\xa7\xa7\xa0\xba\x9e\xe1\x14\xf9\x8f\xf2\xc0\xe4\x0b\x47\x94\xe1\x7c\x2a\x64\xfd\xb1\x63\x87\x51\xee\x60\x87\x31\xb5\x12\x31\x68\x7b\x21\xfa\x56\x83\x05\x4e\x94\x53\xa5\xae\x56\x08\x63\x2f\x93\xe6\x5e\x04\xa0\x91\xab\xee\x4a\x44\x2e\xbf\xc8\xdc\xde\xb6\xcd\x54\xab\x62\xfd\x55\x26\xe7\xd6\x76\x4b\x8d\x9a\x9d\x53\x0c\xa6\x88\x69\x33\x27\xd7\xde\x6a\x55\xe6\x78\xd5\xfd\xb9\xd8\x51\x91\xd6\x41\x2c\xee\xbd\xde\x93\x2f\x54\x32\x42\x39\xfb\xf7\x40\xa7\x83\x97\x17\xa4\xbb\x33\x75\x0c\xea\x38\x6a\x9c\x7d\x1a\x20\x51\x2c\x13\x7a\xaa\xe4\xe4\xb2\x57\x2e\x86\x5b\x12\xb1\xe8\xbe\x89\x4a\xcc\x30\x82\xf2\xe8\xa8\x3f\xb2\xf5\x79\x63\x64\xdd\xee\xc5\x9b\x1f\x07\x1a\x87\x6f\x53\x5f\xca\x40\xd2\xe4\x55\x64\xdd\x35\x74\x77\xed\xd8\x9e\x08\x05\x3f\x21\xde\xaa\xc1\x78\x85\x24\xca\xa7\xa8\xf4\x06\xfc\x6f\x75\x77\x65\x22\xff\x9a\x0d\x5d\x3f\xc8\x38\x9d\x23\xba\x7a\x88\x12\x25\xfc\x2b\x29\x13\x9c\x47\xa9\x57\x09\x92\xa0\xed\x63\xd4\x42\x55\x8e\x42\x79\x64\xeb\x3b\x56\x5d\xe3\x34\x55\xe6\x74\xc6\xc6\xc7\x2e\x6b\x5e\x10\xbb\x8f\x38\xca\x63\x94\x3e\x4f\x53\xed\xdb\xa8\x41\x4a\xf1\x34\x8f\xd2\x37\xd1\x9c\x22\x6b\xa0\x0a\x4e\xc2\x85\x3f\x76\x33\x62\x74\x5c\xb3\x61\x7c\xa8\x4f\x9e\x33\x4e\x43\xa7\x37\x0f\x12\x54\xa0\x3c\x41\x39\xfb\x0f\xb4\x78\x21\x54\x67\x9b\x3d\xd8\x56\xf5\x07\xe0\xd8\xf6\x5f\x73\x06\x56\x10\xf1\xe0\x30\xd9\x71\x08\xdd\x72\x7d\xff\x9a\x48\x0d\x8b\x1d\xbb\x57\x0d\x9d\xde\x67\xee\x06\x69\x04\x77\x78\xae\xb9\xf6\xce\x8b\x34\x66\x74\x6b\x17\xc2\x8e\xe6\xce\xec\xc7\xb6\xd3\xe0\x35\xf4\x4f\x21\x0b\x28\x62\x2f\x34\xdd\xd4\xfa\x23\xe0\x5f\xc1\xeb\x5d\xd5\xc2\x4d\x22\xbd\xbf\x66\xd8\xad\x5c\xd7\x21\x79\xba\xe8\x0e\x7f\x78\x57\xda\xb4\x72\xb3\x36\xed\xe9\x1f\x2e\xe7\xcf\x4e\xbe\xfb\xd0\xd0\xa6\xd9\x72\x43\x4c\xd2\x79\x96\xd3\x1e\x45\x31\xc9\x93\x75\x3a\x9c\x96\xc8\x21\x9b\xae\xd0\xf5\x34\x6a\xe2\x3c\xc5\x39\xea\x0b\x14\xdc\xa9\x34\xd0\xfc\x6b\x51\x92\x69\x89\xb8\x68\xd4\x50\x0e\xe8\xe2\x9e\x14\xeb\xcf\x46\xd0\xeb\x61\xda\xa7\x59\x94\xa6\x8a\x29\x7d\x06\x9f\xc8\xca\x5a\x0a\xd0\x7a\xc0\x27\x23\x78\xaa\xf9\xf2\x91\x9c\x91\x97\x45\x9c\xc7\x3c\x5b\xa1\xbf\xa8\x59\xe0\x27\x6d\xd1\xb0\x25\x4e\x76\x2b\xc7\xd6\x6a\xcb\x24\xe0\xf8\x0a\x32\x9c\xe3\x6c\x9e\xad\x86\x61\x2d\x26\xe7\xe4\xba\x8c\x8a\x0e\xd9\xe4\xcc\x2c\x54\x88\x0f\x8c\xb3\xe6\xa2\xda\xa8\x2d\x35\x6f\xc3\x96\xaf\x14\x61\x35\xe3\x4d\xca\x9a\x19\x56\x5f\xc5\xb3\xd9\xee\x8c\x6e\xe3\x12\xae\xe2\x75\xe5\x7b\xc0\x9a\xdb\x5f\x42\x61\x8b\xaa\xae\x08\xf0\x01\xd8\xc9\x10\xbc\x39\xa5\x9c\x24\x87\xa0\x83\x4f\xfe\x50\x64\x96\x30\x67\x38\xa5\x27\xf3\x1c\xb3\xd6\xdb\xff\x86\x87\xa2\xa3\x76\xf8\x9b\xfb\xf0\x48\x34\x7b\x78\x24\xfa\x3c\x1e\x89\xa6\x9b\xc9\xda\x97\xff\xfd\xf8\x3f\xbf\xbd\x79\x9d\x3e\x3c\x12\x7d\x46\x8f\x44\xb6\xe6\xd4\x51\xc7\xd9\x6f\x29\xb6\x7e\x55\x92\xc4\x15\xaf\x45\x1d\x6a\x2e\xa3\x44\x95\xca\xd9\xb5\x8f\x3f\xdf\x39\xb5\xcd\x7c\x23\xab\x1c\x7a\x7f\x13\x2f\x1f\xee\xe3\xd6\x8a\x11\xf5\x33\x49\xd7\xdb\xcf\x9a\x87\x9f\x6d\x35\xd5\xcf\x3e\x63\x45\xf5\x1f\xee\x4c\x85\xfb\x87\x5f\xb1\xa2\xfa\x8f\x77\xb6\xca\x3f\x3e\x28\xaa\x3b\x14\xd5\x87\xab\x9f\xd7\xcb\xa1\x3b\x6b\x9f\xf7\xe0\xba\x39\x8b\xbb\x4e\xb1\xbc\xd8\x59\xb1\xfc\xb3\xe9\x82\x8b\x03\x74\xc1\x93\xf5\xba\xe0\x4c\xe9\x82\x27\x8e\x2e\x78\xbc\xab\x2e\xf8\x20\xf5\x2e\xef\x8b\xef\xcf\x9d\x6b\x77\x3f\x0b\xf5\x6b\x07\x55\x95\x3e\xcc\x1d\x43\x09\x0f\x46\x0b\x84\x35\xec\xa1\xc1\x26\x01\x6f\xe6\xba\x03\x9a\x7a\x81\x5d\x4d\x09\x22\xc3\xa5\xa0\xe0\x83\xf7\x5f\x2c\xfd\x53\x38\x0f\xe4\xad\xbd\xd0\x97\xf6\x3b\x7e\x99\x01\xe7\x89\x5f\x7d\xf7\xd1\x03\x95\x99\xf1\x7b\xa8\x88\xe8\x00\x9d\x28\x9f\x49\x7b\xbf\xaa\x51\xc5\x57\xd1\x09\x92\xad\x16\xa2\x5a\x6e\xb1\x16\x59\x73\xbb\xe5\x7c\xcd\x51\x90\x5c\x0e\xfe\x7a\xb7\xe5\xe8\x9c\x70\xbf\x56\xdd\x76\x16\xce\xfc\xe2\x67\xd1\x6d\x8f\xdd\x91\x8c\x92\x36\x39\xb4\xeb\xf6\x12\x76\x54\xd2\x76\x34\x07\xb0\x68\x64\xc5\xb6\x95\x2d\x8b\x75\x4a\xda\x29\x5c\xec\xaa\xa4\xe5\x54\xe5\x53\x29\x63\xda\xe1\xe9\xef\x42\x41\xf3\x60\xb2\xfb\xa0\x8d\xf9\x6d\x69\x63\xb6\x30\xd9\xfd\xee\x3f\x1e\xff\xaf\xff\xf8\xd3\xf8\xe4\x67\xd6\xc6\x28\x15\xbd\xf8\xe7\xe9\x83\x6e\xe6\x1e\xea\x66\xba\x74\x05\x0f\x9a\x8b\x07\xcd\xc5\x83\xe6\xe2\xae\x35\x17\x7f\xe3\xac\xd4\x05\x93\x0a\x8a\xbf\x19\x3c\x7c\xff\x95\x19\x7c\x5d\xdb\x58\xc9\xd1\xad\x95\x19\xe4\x00\x65\x06\xf9\xb9\x94\x19\x1b\x0c\xdb\x32\xc7\xb0\xcd\xd8\xad\x8c\xdd\x0f\xf5\xb1\xb8\x33\x63\x38\xa5\xb5\xc0\x13\xff\x91\x0d\x33\x37\x0d\xb8\x12\x41\x9b\x16\x66\x13\x9c\x27\x5f\x2f\x64\xec\x49\x4f\x49\x6a\x7a\x8a\x41\x1e\x65\x08\x68\x1e\x13\x1d\x1f\x3b\x36\x67\x9d\x6a\x8e\x15\xb3\xe8\x71\x2c\x72\x27\x13\xe9\xd2\x62\xa0\x6d\xd4\x26\xe8\x97\xd3\x95\x34\x65\x6e\xbd\x2c\x4b\x25\x60\xca\x1a\xc2\x72\xb8\xab\x26\xab\x86\x98\x65\xb7\x08\x7f\x05\xb2\xfd\xe2\x67\x93\xed\x9d\x91\x6a\x03\xb2\xb4\x4e\xc6\x75\x57\xa9\xb8\xc4\xa1\xae\x2a\x20\x0c\xf3\x9a\xc3\xd6\xd7\xfc\x93\x0e\x3c\x73\x07\xbe\x3b\x5d\x46\x7b\xcb\x84\x2e\x63\xfe\xa9\x74\x19\x77\x60\x70\x46\xae\x70\x82\x4a\x7a\x22\x84\x25\x4e\x68\x52\xa9\x93\x9c\xe1\x82\x1e\x62\x72\xd6\xa9\xce\xd8\x10\x4a\xbd\x19\x74\xf0\xae\x84\xc3\x68\x0b\xe1\xf0\xcd\x97\xd1\x97\xcf\xd9\x37\x0d\xe1\xf0\x4f\xf0\xac\xb6\xd4\x3a\xab\x79\xfb\x49\xae\xec\xfd\x23\x9b\x9f\x97\xf0\x7b\xdb\x04\x9f\xa8\x6b\xb1\xf7\xdd\x95\x94\x04\x32\x52\x6f\xa4\xde\x71\xed\xdb\xa6\x79\x1f\x41\xbb\x3d\xe8\xcd\x22\x3a\xdb\x92\x03\x59\xb7\xb1\xeb\x98\x11\x1a\xfa\xa9\x43\xf4\xf3\x83\xe3\xc0\x77\x2e\xbc\x0e\x79\x4c\x7e\xc5\x21\x8f\xe7\x61\x6a\x5d\xca\x78\xc5\x5a\x92\x70\x58\x9a\x78\xee\xc5\x61\xb1\x8f\xc7\x6e\x1c\xba\x62\x85\x7a\x6a\x3c\x44\xa3\xb0\x50\xea\xa9\x71\x53\x3d\x65\xff\x84\x63\x57\x3d\x35\x5e\xa9\x9e\x1a\xdf\xde\x8e\x5d\xf5\xd4\xb8\xa9\x9e\x1a\x87\xc9\xee\x71\xe8\xe6\x30\x36\x71\xe8\xc6\x00\x66\x96\x7a\x6a\xec\x28\x8f\xc6\x4a\x3d\xd5\x28\x3f\x1f\xb7\x37\x2a\x33\xea\xa9\xf1\x7a\xf5\x94\x3b\x42\xf7\x59\xe3\x53\x1c\xf3\xe5\xa9\x58\xde\xe1\x18\xa6\xd2\xb4\xcf\x44\x3e\x86\x63\x0b\xfb\xd2\x75\xd8\x37\x82\x74\x1b\xec\x7b\xb3\xe8\xb3\x68\x7a\x0f\x32\x88\xd4\x89\x5b\xef\x36\x67\x2b\x97\x6c\x48\xde\xa7\xd7\x98\xc5\xb3\x56\xce\xd6\xad\xc3\xdc\xae\xa1\x29\x4e\x2a\xf7\x5a\x97\x3d\xbf\x4f\xba\xec\xf8\x41\x97\xfd\x5b\xd7\x65\xf3\xdb\x96\xa8\xcc\xef\xcd\x5c\xe9\x0b\xca\x50\x16\xc8\xab\x42\x45\x1a\xf8\xfd\xc3\xfe\xce\xb5\x54\x2e\x3a\xf5\x20\x51\x22\xb5\x2e\x2f\xc9\x9c\xf1\x7b\x18\x39\xe5\x94\x91\x12\x79\x90\x5a\x92\x36\x25\x25\x43\xc9\x5b\x39\x2d\x47\xe0\x9e\x22\xd6\x9e\x78\xc0\xc8\xf3\xb2\x8c\x16\x3e\x10\x09\xd0\x7d\x50\x4d\x09\x23\xb2\x03\x13\x16\x58\x4e\x80\x0b\x00\xb9\x8c\xa8\xfb\x8e\xf8\xde\x07\xc2\x39\x96\xa5\x08\x40\xfb\x26\x2a\xa3\x8c\x0e\x96\xb2\xdb\x01\xaa\x54\x52\xe1\xd8\x4f\x1b\xec\xb3\x5a\xe0\x30\x37\x84\xf9\x30\xee\x3e\x72\x47\xd0\xa0\xba\xb3\x11\x68\x6b\x0d\x12\xe8\x77\x36\x80\xdb\xbd\xbd\x81\x1e\x1c\x96\x9b\x25\x94\x35\xed\x39\x5a\xb1\x24\x95\xd4\x96\x54\x92\x0a\x80\xa3\xf5\x74\x40\x2b\xda\xfa\x22\x2c\x70\x3b\x4d\x40\x07\x31\xd8\x26\x7b\xad\xfb\x0a\xba\x4f\x00\x74\x9d\xbd\xb6\xa6\x1d\xc9\x7d\xa2\x1d\xc5\x2f\x94\xb9\x36\x7b\xa0\x59\x9f\x03\xcd\x1a\x73\x89\x51\x84\xa9\xb7\x99\x44\x48\x5a\x74\xac\x56\xb0\x7d\x9f\x78\xd6\x85\x73\x54\xb5\x56\xad\x73\xa5\xcd\x23\x25\x12\xda\xce\xb7\xfc\xee\x26\xcd\xac\x0b\xad\x46\x40\x61\x3b\x00\x53\xdf\xa7\x07\x90\xca\xa4\x49\xfa\xe6\x8a\x22\x16\xad\x14\x17\x7c\x39\x12\xa6\x49\x47\xfa\x8b\xd8\x69\xc7\x70\x86\x74\x7d\x5d\x96\xe2\xfc\xf2\x1d\xb1\xd3\x69\x88\xcc\x59\xad\xe0\xfa\x42\x20\xcd\x7c\xfa\x49\x89\x84\x3b\x40\xc3\x95\x95\x1c\x4e\x46\x29\x00\xb7\xb7\x91\x4d\x1e\xc6\x9b\xc4\x04\x1a\x47\x9a\x32\x50\xe5\xa3\xd7\x24\x0e\xdb\x9a\xcf\x74\x27\x40\x8f\x49\xd1\xe9\x07\x79\xb7\xfa\x28\x95\xbf\x6a\x5b\xee\x6d\x27\xf5\x0a\xbe\x42\xdf\x5c\x89\x65\xdf\x07\xb5\x8a\xf5\x04\xd3\xb6\xf5\x93\xbb\x1c\x4c\x70\xca\x50\xf9\xf5\xc2\xf7\x66\x11\x7d\x21\x1e\x1e\x25\xdb\x28\x9e\x3c\xf8\x1d\xe2\x27\xa8\x98\xd3\x99\xbf\xe4\x3f\x07\x39\xba\xee\xbd\x8c\x18\x5f\xc0\x3c\x67\x03\x14\xd4\xcf\x9c\x81\x28\xaa\x74\xde\x08\xa6\x46\xab\x4d\x30\x9d\x8e\x87\xa7\x23\x4d\xa7\xd8\xf1\x31\x13\x2f\x66\x7f\x45\xc3\xd3\x91\xf8\xeb\xf8\x18\x05\xf3\x9c\xce\xf0\x84\xa9\xa1\x65\x0d\x3d\x30\xaf\xa7\x06\x84\x48\xc6\x5e\x68\x18\x7b\xb6\x1e\xa6\xd4\x8a\x4b\xc4\xe7\xea\xac\xb8\x8e\x67\xc0\x2f\xe3\x00\x05\xa8\x2c\x49\x79\xee\x89\x7f\xbc\x81\x27\x5e\x57\xa0\x98\x05\x92\xb3\x10\xbd\x0d\x64\xde\x10\x52\x2c\x80\x8f\x40\x05\x80\xce\x3a\x2d\x4e\x89\x61\xb6\xad\x93\xa3\xd2\x65\x58\x36\x9a\xf5\x37\xe8\x89\x4e\x83\x39\x4e\x3c\x10\x86\x61\x5d\x13\x35\x3e\x49\x7c\x2d\xb2\x1a\x7f\x23\x93\x3b\xb0\x08\xa7\xd4\x07\x03\xb7\xc7\x10\x55\x1d\xd5\x5a\x93\x0a\xa5\xd6\x1e\xd2\x86\x16\x6e\xee\x1c\xf9\x38\x1c\xe2\xfa\xc5\x60\xef\xd4\x63\xab\xde\x0c\x1e\xb2\x91\xfd\x3a\xb2\x91\x91\x30\xd3\x1a\xb9\x3d\xb3\x91\xa9\x28\xba\x63\x72\xd3\x29\x5b\xb8\x79\x14\x7f\xa6\x44\x4b\x30\x95\xc8\x7e\xb5\x9c\xf1\xb3\xb3\xee\xc5\x03\xeb\xfe\x39\xb0\xee\x59\xe8\x13\xe9\x1c\xd3\xc8\x30\x65\x5f\x13\x6f\x52\xbf\x3d\xf5\xa3\x24\x91\x92\x7e\x24\x9d\xdd\x4b\x14\x25\x75\x83\x77\xa8\xcc\x38\xe3\xef\xfb\x73\x87\xc5\xc1\x7b\xb2\x38\x86\x03\xaf\xfb\x6f\x25\xd3\xfc\xa9\xf1\xd1\x30\x3f\xf1\xaf\x95\xf9\x31\x8b\x4a\xd0\x98\xcc\xf3\x18\x79\xf0\xec\xd9\x69\x33\x7f\x30\x45\xec\xc2\xac\xaa\x99\x30\xab\xb1\x5c\xa4\x33\xe8\x8b\x69\x00\x28\x88\xbe\xee\x57\xb9\xdd\x48\x73\x9a\xba\xb4\x8a\x53\x14\x95\xfe\xca\x3e\xb9\xec\xb6\x55\x3f\x15\x8c\xc3\xc2\x9f\xdb\x92\x42\xa3\xa3\x3b\x48\xa2\xdf\xec\xbd\x01\x15\x21\xf0\x6c\xfb\xae\xbe\xa6\x1b\x00\xe7\x8d\xf7\xf5\x66\x5d\x01\xab\xfd\x87\x92\xcd\x9d\x21\x68\x38\xe7\x02\x10\x05\x35\x9a\x1f\xbb\x8c\xb0\x05\x48\x99\xd5\xcc\x9c\x0e\x54\xe7\x46\x6c\xdc\x3b\x88\x40\x55\xdf\xf1\x6c\x33\x25\x2c\xaf\x50\xd9\x8f\xa6\xeb\x74\x6d\x2b\x3c\x08\x76\x24\x90\x66\xf8\x19\x4a\x0b\x54\xd2\x93\x34\xfa\xb8\xe8\xc7\x29\x8e\x2f\xf7\xa3\x96\x90\x48\xcc\x61\xa5\x59\x7e\xf0\x54\x78\x20\xb7\xbf\x7e\x72\x7b\x15\xfa\x91\x36\xdf\xd4\x9a\x32\xc6\xf1\x03\x95\xa5\x0e\x11\x76\x6f\xa8\x34\xa6\x63\xa8\x94\xc2\x0f\xc7\x2b\x4e\x3b\x2b\x45\x2c\xa6\xcf\x45\xad\x01\xa6\x7d\x53\x3f\x96\x64\xdb\x98\x99\xf6\x4b\x32\x67\x38\x9f\x6a\xbb\x52\x1c\x44\x29\x8e\x78\xf3\x9f\xd4\x33\x8c\x7a\xe3\x50\xe1\x17\xcb\x86\x3a\x6f\x2a\xef\xbb\xaa\xa9\x0c\x6b\x7f\x7c\xfb\x83\xc8\x01\x99\x85\xd4\xcf\xc2\xb9\xef\xbb\xb1\x11\x37\x5a\x93\x74\x72\x02\xda\xe2\xf3\x27\xfd\xe8\xe2\x9a\x82\xea\x72\x65\x0a\x0a\xb1\xd8\x3b\xe8\xb3\x50\x4d\x14\xe0\xdc\x97\xd8\x15\x7c\x1a\xfe\x59\x48\xfa\x1a\xec\x2e\x42\x97\xd3\x83\x2c\x44\xc1\x14\xe5\xa8\x8c\x18\xd2\x5b\xcc\x71\x39\xff\x57\xab\x32\xf9\x6c\xb5\xe5\xe6\xfb\x2f\x96\x48\xbe\xa5\x95\x84\x48\xd8\xaa\x0b\x77\x0a\xfb\x67\xa0\x32\x9f\x6d\xe8\x07\xb4\x48\x31\xf3\xbd\x73\xa1\xc8\xa8\xde\x07\x25\x12\x39\x67\xfc\x93\xdf\x7d\x79\x7a\x32\x85\xde\xdf\x84\x10\xcf\xba\xca\x2b\x81\x97\x7d\xb0\x14\x5c\x21\xc7\xd4\x2f\x78\x01\xf0\x87\x3e\x08\xbf\x5a\xfd\x40\xb7\x66\x29\x52\x21\x31\xea\x8c\xc6\x67\xb6\xf3\x70\x3b\xc6\x56\x20\x39\xd3\xf5\x1d\xd8\xf5\x35\x3a\xd6\x7b\xbc\x47\x0c\x3c\xd3\xd4\x89\x23\x97\x85\x63\xce\x13\x64\xe6\x3f\x4b\xaa\xbd\xda\x92\x96\xd3\xf9\x38\x8f\xae\x3e\x63\x5b\x12\x8a\xf3\x69\x8a\x74\x02\x21\x9d\xa3\xf5\x44\x86\xb6\xff\x34\xb6\x8c\xeb\x5c\x2a\x15\x25\xbf\x33\x43\x46\xb2\xd9\x90\x91\xbe\x9c\xfd\xf8\x75\xfc\xe1\xeb\x95\x5e\x6e\x26\xdd\x6e\xed\xdf\xd6\xf2\x45\x93\xde\x4c\x76\xc0\x70\x93\xff\xcb\xfb\x9b\x04\xae\x64\xfd\x24\xf7\xf9\x4d\x1e\xc9\x74\xc0\xba\xe0\x5b\x25\x30\xfe\x4d\xf3\xac\x22\x7b\x82\x1a\xb8\xe1\x7f\xf5\xa4\x61\x1a\x89\xaf\xd0\xeb\x42\xba\x2e\x8d\xa0\x65\x78\x39\xd4\xd1\x6c\x52\x94\x4f\xd9\x8c\x7f\xd5\xe1\xcc\x4d\x34\x1a\x53\xff\x89\xb6\xc9\xac\xbb\x16\xfc\x3e\x9f\xb5\xec\xda\xb4\xd4\x53\xaa\x13\xd9\x8d\xd6\x65\x16\x68\x45\xbb\x6b\x27\x2b\xea\x17\x25\x9a\xe0\x1b\xc7\xf1\xe6\x4b\xe5\x0e\x33\x58\x19\x9a\xcf\xee\xd5\xcc\xca\xc9\x46\x00\x75\x62\x06\x1d\x7e\xa7\xed\x88\xc6\x97\xdc\x08\xb4\xb3\xc1\xdf\xa6\xde\x56\xf9\x97\x89\x04\x64\x59\x9e\x36\x33\x27\x7a\x53\xfe\x7f\x91\x06\xe5\x66\x3b\xd4\x75\x57\x72\x9d\x15\x6a\xc7\x33\x49\xcd\x37\x08\x8d\xba\x75\x5e\xba\x54\xea\x6a\x6d\xc6\x47\xe2\x12\x2d\x34\x51\xe2\x9f\xa9\x3e\x10\xa0\xb2\x8f\x87\x60\xa5\x11\x5b\x5e\xa2\xc5\x80\x55\x21\x3a\xb2\x3a\xcc\x65\x2d\xe5\xf7\xdf\x28\xf3\x19\xe8\xd2\x51\x37\x0e\x1e\x8c\xc3\x61\x69\xa4\xc8\x64\x63\xea\xe2\xb4\x25\xb2\xea\x9e\x38\x2f\x66\x7f\x7d\xd0\x4e\xff\x2a\xb4\xd3\xeb\x35\xd3\xeb\x6c\x45\x09\x8c\x36\xda\x8a\x76\x78\xb6\x6d\x7c\xff\xcc\x48\x26\xff\x48\x9e\xca\x96\xd2\xa5\x4d\x16\xd8\x7f\x53\x95\x05\x26\x79\x6a\x62\xcd\x3b\x31\x1c\x95\x33\x5c\x32\x2f\xb5\x73\xe9\xca\x18\x02\x77\x12\x3b\x56\xdc\xfc\x2e\xa6\x80\xdf\xfd\x9b\x6f\xc5\x6c\xac\x67\x9a\xda\x77\x0d\x67\x48\x7d\xf5\x7e\xf7\xdd\xe0\x77\xaf\x06\xbf\xbb\xf0\xe4\x7b\xe3\xc2\x6d\x65\x7c\xd9\x54\xc8\x10\xdf\x0b\xce\xfe\xcf\xef\x54\xed\x39\x45\x2a\x33\x79\xfd\x62\xf7\xa8\xbe\xf9\x3a\x19\x90\x7c\xc9\x54\xb7\x56\xa2\xa2\xf6\x83\x26\xaf\x0c\x59\x48\xcc\x78\x62\x59\xcc\x47\xd0\x47\xe1\x57\xc2\xef\x27\xe6\x8c\x32\x17\x5a\x56\x56\xe2\x2b\xa3\x2c\xca\x0a\x00\x94\x96\x33\x50\x2b\xd2\xa2\xc2\x3b\x9c\x21\x15\x21\x5d\x3c\xae\xf6\x26\xa4\xec\xb1\x19\xea\xa5\x11\x65\x3d\x11\x1d\x25\xaa\x23\x90\xe2\xe1\xd9\xa8\x8f\x87\xa7\x23\xe8\x65\x54\x98\x1b\x54\xb0\x77\x8d\xd9\xac\x27\x36\x86\xf6\xca\x28\x9f\xe2\x7c\xda\x9b\x94\x24\xeb\x7d\xb1\xcc\x7d\x36\x3c\x1d\x81\xaa\xc7\x88\xfa\x75\x36\x02\xd5\xfb\xea\x46\x86\x12\x17\xb7\x57\x2e\x3d\x97\x1a\x65\x71\xa8\xf8\x9c\x80\x0f\xe0\xb0\x84\xd1\x68\xbb\xc5\x51\xc9\xe6\x98\x89\x46\x20\xa0\xf3\x31\xe3\x42\xaf\xff\x0c\x7a\x19\xce\xe7\x0c\x49\x63\xc2\x97\x5c\x8a\xe2\x52\x30\x0a\x24\x6f\x70\x3e\x7c\x15\xb1\x59\x90\xe1\xdc\x2f\x21\x05\x30\x1a\x0d\x86\x14\xea\x87\x61\xf3\xa6\x9b\x07\x7c\x71\xe8\x2d\x99\xe7\x89\xcf\xc9\x2f\x1b\x81\x20\x21\x59\x84\x73\x7f\x0e\x60\x5e\x2d\x5a\x8b\xc2\xa1\x8f\x6e\x6f\x87\x23\xf1\x20\xfb\xf5\xc2\x6f\x1f\x85\x73\xed\xa9\x7d\xc1\xa2\xf8\xd2\x1b\x18\xc7\x6d\x41\xd1\x86\x39\x2c\x47\xe1\x90\x53\x7a\x3d\x0b\x69\x1b\xc3\x97\x05\xd4\xf4\x8f\x8f\x7d\x59\xaf\x05\x28\x0c\x84\x52\x56\x41\xf5\x07\x9c\xa3\xa8\x04\x1c\x8b\x5a\xeb\x60\x9c\x2d\x32\xeb\xa8\x21\x71\x0a\x73\x00\xe5\xaf\xe8\xc6\x3f\x83\x25\xe0\xb2\x98\x65\xc7\xbe\x0d\xee\x99\xd3\x7e\x8c\xd2\xf4\xb7\x1b\x85\xfa\x55\xfc\x1f\xff\xba\x49\xbe\xbd\x74\xa2\x50\xaf\x4b\x01\xa5\x23\x3d\x77\x26\x70\x3a\x93\xce\x3c\x7f\x93\xc0\xab\x39\xaa\xad\xb8\xa6\x1a\xe0\xbf\x50\xc4\x61\xca\x50\x51\xa0\xb2\x8f\xf3\x62\xee\x9a\xda\xec\xfd\x24\xba\x52\x7d\x7c\xc8\x5b\x29\x4c\x8e\x1e\x0c\x1d\x1f\xd4\xb7\x3f\x93\xa1\x63\xe7\x6b\x69\xe3\xae\xa8\xb7\xd1\xb4\x53\x29\x1b\xab\x88\x20\x09\xa6\x42\x68\x1e\x60\xda\xd7\x7f\xdb\xc5\xff\x97\xbd\x77\xdd\x6e\xdb\xc8\x1a\x44\xff\xeb\x15\xe6\x0f\x85\x95\xd1\x07\xc4\x45\x4a\x4a\x77\x66\xfa\xb0\x03\x7b\x1c\xd9\x6e\x3b\x5f\x6c\x6b\x2c\x25\x7d\x7a\x78\xb4\x6c\x90\x28\x92\x25\x81\x00\x03\x14\x25\xd1\x12\xd6\x9a\xc7\x38\xe7\xf5\xe6\x49\xce\xaa\xfb\x05\x05\x10\x24\x25\xc7\x6a\xab\xd7\x4a\x5b\x44\x55\xed\x5d\xf7\xda\xf7\x8d\x79\x16\x3c\xed\x13\x4d\xc4\x9f\xa0\x14\x0a\x71\x71\xde\xcb\x52\xf8\xcf\x68\x19\x88\x35\x0f\x40\xe6\x2f\xc2\xc8\xf7\x47\x77\x64\x60\x26\xcc\x0f\x67\x28\xf5\x80\x66\x8e\x48\x43\xd3\x1f\x6a\x1f\x78\x2c\x05\xed\x8b\xd2\x6d\xfe\x78\x70\xa0\x6b\x6b\xa9\xfc\x3a\x8d\x92\xdf\x59\x13\xa5\xaf\x8d\xbf\x56\x7d\xad\xa1\x98\x45\xe9\x28\x87\x64\x7a\x84\xfe\xd4\x18\xcf\x4f\xcc\xb3\x3d\xba\xde\xdb\xf3\x79\x29\xaf\x2e\x07\x63\x4d\x00\x57\xe6\xb1\x50\x16\x7e\x15\x62\x10\x94\x31\x6c\x42\xc9\x44\xb2\x33\x94\x0a\x94\xb2\xfa\x16\x28\x0b\x88\xe9\x9f\xe4\x6a\x42\x63\xdf\xf3\x76\xc3\xd0\x52\x35\xdf\x08\x4b\x3a\x4a\x58\x8c\x93\x2c\xcb\x7d\x49\x71\x88\x69\x50\x54\x87\xe8\xa5\xad\xb1\x0e\x82\x1d\xa5\xcd\xb4\xf6\x06\x5e\xd9\xd3\x12\x26\x05\xec\x98\x20\xc3\x6a\xbd\x32\x87\x05\xc4\xa7\xf0\x1a\xbf\x21\x47\x94\x8c\xea\x87\xff\x1e\x92\x21\x5d\xc0\xe5\x51\x16\xc3\xbd\x3d\x7f\x25\x10\x32\x2b\x84\x03\x97\x13\x23\x5b\xb0\xef\x7e\x50\xf2\x8e\x42\x2a\x3c\x4f\x6d\xfd\xf9\x18\xc0\xaa\x06\x3d\x0e\x67\xfe\xc8\x10\x10\x9b\x73\x30\x28\xb6\x95\x5d\x57\xe0\xf3\xed\xe1\x81\x01\x6a\xad\xd4\xae\x01\x11\x80\x91\x21\xc4\x36\xeb\xc9\x9d\xb8\x39\x2a\x05\xa2\x19\x95\xd8\xb0\x9b\x63\x92\x10\x9a\x11\x99\x3b\x69\x73\x74\x16\x9c\x55\xa3\x93\x1b\x6f\x9b\x01\x2a\x20\x16\xba\x45\x38\x0a\x82\xdb\xdb\x05\xfd\xcf\xc8\xbc\x60\x0a\xd6\x34\x1b\x84\x72\x1d\xdb\x6d\x9c\xc3\x68\x86\xd2\x49\x77\x8c\x92\xd6\x89\x2b\x14\xf1\xe8\x8a\x78\x28\xf1\xcc\xd0\x35\x4a\x8b\xfd\x2b\x94\xc6\xd9\x55\x37\x87\x05\xfa\x4c\x0e\xc3\x1d\x91\x96\xff\x2e\x86\x05\x5f\x9c\x22\xbe\x7c\xa4\x88\xbf\x05\x8a\xf8\x4a\x52\xc4\x4a\xa7\x37\xcf\xa1\x83\x08\x66\xd4\x2f\xea\xb2\x83\x2a\x68\xd8\xa4\x17\x61\x9c\xa3\xe1\x02\xeb\x54\x72\x1c\xe1\xa8\x8b\x61\x81\xbb\x49\x36\xe9\x8e\x12\x24\x2c\x1d\x52\x57\xd8\x2b\x1a\x1b\x43\x73\x3a\x4d\xb2\xc9\x04\xe6\xbd\x49\x86\xb3\xd7\x30\x8a\xbd\x40\x8b\x81\x45\xa5\x00\xc2\xd1\xf0\x3d\x7d\x9b\x59\xe6\x85\x0f\x30\x8d\x85\xda\x9a\xdb\x57\x8d\xf2\x2c\x49\x4e\xb3\xd3\x6c\x4e\x85\xb3\xa3\x4d\x3a\x70\x1a\xa1\x44\xef\x00\xbd\x2a\x6b\x01\x51\x10\xbc\x75\x96\xfa\x1e\xa6\x16\x52\xdc\x02\x92\x77\xfa\x84\x76\xeb\x64\x99\x8e\xa6\x79\x96\xa2\xcf\x22\x23\x9c\xd6\x09\x0e\x81\x86\x8f\x39\x11\x77\xaf\x88\x3b\x24\xc0\x8f\xc7\x6b\xc1\x27\x1d\xcf\xfc\x79\x18\xf9\xf3\xb0\xf0\xfd\x99\xc9\x61\xf8\xd8\x94\x57\xc5\xbe\x94\xad\x8a\x68\xce\x8d\x8e\x56\x4b\xc1\x35\x54\x16\x9e\xba\x41\x89\xe2\x19\xcd\x7b\xe4\xc9\xf7\xc4\x53\x45\x54\x40\xc2\xbf\x1a\x6d\xd8\x78\x85\xd5\xa8\xf8\x3a\xce\x92\x24\xbb\x32\x6b\xe6\xf0\x8f\x05\x2c\xf0\xab\x3c\x9a\x41\x56\x22\x4c\x4b\xa6\x64\x1b\x39\xc2\x92\xa1\xa4\x6a\x86\xc2\x3a\xa7\x22\x92\xc5\x28\xfe\x00\x47\x10\x5d\xc2\xe7\x18\xe7\x85\x0c\x1b\x55\xf9\xae\x2f\x0f\x75\xc5\xa8\x6e\xd4\x11\x57\xd7\xa9\x4d\xca\x37\xd6\x29\xd9\x4b\xa5\xf6\x83\xa0\xa1\x11\x15\x38\xe1\x9d\xc5\x84\x62\x8f\x0a\xc8\xc6\xd2\x57\x34\xb7\x9c\x89\x43\xde\x03\x52\x41\x6d\xd8\x9d\x61\x0e\xa3\x8b\x1d\xda\x94\x0e\xd8\xd5\xf4\x40\xc4\xb4\x8a\x50\xe2\x6e\xaa\x96\xac\xa9\xbd\xb6\x88\xc2\xf1\x8f\xfc\x54\x20\xfb\xe6\xfe\xce\xe6\x7e\x50\x96\xec\xa0\xbe\x8e\xd2\x38\xa1\x11\xed\x0d\xf9\x3b\x4c\x28\xf9\xc8\x98\x0c\x7d\x85\xf7\xf6\xd8\x4d\x24\x3e\x3e\x4f\xd1\x8c\xee\x75\x5a\xea\xfb\x7e\x10\x3e\xbd\xa9\xf6\x15\xf2\x7b\xe1\x35\x44\x93\x29\xee\x42\x79\x4d\xcc\xbb\xb0\x37\x4a\x10\x4c\x31\x2b\xfa\xe9\x07\x31\x2a\x1d\x6b\x48\xae\x52\xe7\xf7\xc3\xf2\x02\x2e\x5f\x64\x57\xa9\x18\x08\x63\xbd\x7c\xd8\x9b\x41\x1c\xfd\x27\x5c\xde\xde\xc2\xde\x08\xe7\xc9\x7f\xc2\x65\xb0\xb7\xf7\xdf\x7e\xd4\xf9\x17\xc2\x8c\xcc\x73\xc8\x5c\x69\xe8\xb1\xf3\x95\xab\x13\x1f\xe7\x44\x57\x73\x06\x3b\xb8\x97\xc3\x59\x76\x09\x9f\x27\xc9\x07\x42\xd3\x15\xb2\x05\x0a\xe3\x6c\x44\x4f\x26\x97\x97\x7e\x60\xcc\xef\x0e\xe2\x9c\xce\xbb\x2c\xe6\xdc\x18\x9f\xdd\x00\xe0\x5e\x14\xc7\xac\x1e\x0a\x4a\xb2\xe9\xdf\xd0\x48\x8d\x2f\x13\xc1\xb9\xca\x5d\x6f\x16\x38\x22\xa6\x8d\x51\x92\x3c\xbf\x8c\x50\x42\x1e\x65\x36\x99\xbe\x6e\xf3\xfa\xd1\x58\x70\x4f\xbf\xad\xf9\xb7\xde\x10\xa5\xcc\xc8\x5a\xcc\x35\xef\x28\xe9\x25\x75\x19\xfa\x15\x15\x18\xa6\x30\xf7\x3d\xd6\x90\x43\x31\x41\x1b\x48\xcd\xd5\xe1\xf5\xcd\x8f\x06\x5a\x39\x87\x55\x94\x17\x70\x49\x4d\x30\x38\x4e\x13\x88\x11\x64\xce\x9e\x3e\x47\x91\x63\x02\xc5\x60\xd9\x02\xaf\x33\x5e\xd9\x69\x67\xd3\x95\xfd\x26\xfb\xec\x03\xa1\xc0\xa1\x3a\x8d\xf4\x22\xcb\x14\x17\x5c\xb7\xc4\x41\xe9\x5c\x77\xf7\x69\x86\xbd\x02\x2f\x13\xd8\x9b\xd2\x5a\x62\x87\xa3\x34\x85\xb9\x3c\x98\xd9\x78\x4c\x58\xac\x6c\xde\xfd\xcb\xc1\x13\x6f\x7e\xed\x95\xda\x8b\x2e\x1e\x5b\x31\x55\xf2\x14\x87\x07\x65\x21\xdf\x3e\xfe\x18\x1e\x67\xcc\xcc\x4d\x34\x62\x77\x81\x90\xb7\x54\x41\x38\x3e\x8b\x31\x36\xbe\xb2\x62\xb6\x5a\xd2\x27\x75\xdd\xdc\x28\x4c\xa1\x75\xa7\x82\x61\x78\xe9\xcf\x74\xf6\x91\xbd\x81\x83\xc5\xb6\xe2\x88\xb1\x0d\x98\x3d\xa3\x77\x61\xfe\x67\x01\x16\x2f\xf1\xf6\xe6\x7f\xf3\x70\x46\xf8\xe3\xb9\xfc\x4f\x0f\xc1\xb7\x8a\xfb\x25\x74\x5e\x77\x92\x67\x8b\x79\xab\x90\x16\x2b\x93\x2b\xae\xb2\xc4\x6f\xe7\x87\xd6\x6c\x95\xdf\xa8\xdd\xb7\x8c\x1c\x18\x7b\x0c\x26\x60\x09\x2e\xc1\x95\x62\x93\x3f\x3f\x24\x36\xf9\xfc\x4f\x62\x93\xaf\x1f\xd9\xe4\x6f\x81\x4d\x7e\x1f\xfa\x85\xd3\xee\xdf\xb6\xdf\x27\xdc\xaf\x7d\x61\x54\xad\xfe\x47\xac\x55\x33\xeb\xac\xc0\x08\xe3\x7e\x4d\x61\x44\x0a\xff\x41\xca\x98\x9f\xba\x32\xef\x17\xe6\xff\xaa\xc2\x79\x36\xec\xe5\x8b\x34\x45\xe9\xe4\x05\x9c\x27\xd9\x92\x8b\x63\x67\x8c\x8d\xd5\xfc\x01\xaa\xb5\x80\x97\x92\x41\xcd\xa3\x11\x35\x78\xae\xb4\x60\xc8\x81\x86\xad\x18\x45\x09\x4a\x27\xbd\x19\x22\x4c\xed\x78\x9d\x16\xd1\xb5\x17\x80\xc2\x9f\x86\x0b\x7f\x1a\x8e\x7c\x7f\xb2\x45\xe4\x8f\xcf\x9c\x9b\x1b\x45\xa9\x07\x96\x9c\xc5\x3b\xd7\xe2\x51\x53\xdc\x82\xab\x3c\x77\x2b\xbd\x24\x10\xd6\xe7\x4b\x0e\x46\x7c\x76\x4c\xd7\x95\x16\x5c\x4b\xce\x9c\x2b\xb0\x96\xb9\x3c\xb2\x2a\xfd\x8b\x1b\x30\x71\x15\xe2\x29\xbc\xc6\x16\x84\x51\x94\x92\xff\xd2\x0c\x13\x72\x30\x4a\x60\xe7\x3c\x1b\xb2\xb1\x80\x1b\x09\x8b\xf1\x5a\xf2\x67\x19\x3c\xf3\xfe\x95\x2d\x3a\x51\x0e\xd3\xff\xc0\x9d\x88\x90\x40\x30\xee\xe0\xac\xc3\x40\x90\x1e\x75\xe8\x76\x2b\x38\x8f\x57\x19\x1f\x03\xc0\x30\x57\x5b\x75\xe2\x45\x8e\xd2\x49\x27\xea\xc4\x6a\x46\xc4\x55\x9d\xa5\x47\xdc\x2d\x81\xfb\x27\x30\x1d\x4b\x64\x38\x28\x08\x19\x35\xf9\x09\xe0\x59\xc0\xfd\x31\xde\xb2\xfc\xd5\x36\x2d\x59\xd9\x41\xfc\xda\xdd\xf5\x77\xe1\xed\x2d\x99\x0c\xc2\x60\xcd\x50\x1a\x70\x8b\x4f\xba\x8c\x3f\xb1\x6f\x02\x74\x74\xbd\x05\xe8\xe8\xda\x00\xfd\x94\x7d\x2b\xe9\x8f\xdf\xe6\x2b\x81\xfe\xdd\x86\x76\x7b\xab\xf5\x53\xc0\xaf\xd5\x43\x8a\x83\xcf\xd9\xa7\x28\xe1\x3c\x1d\xfd\x1e\x04\xac\x1b\x84\xc0\x5f\xb7\x23\x28\xd5\x3b\xf2\x54\xcc\x61\xad\x76\x72\x55\x47\xd8\x27\xc8\x3d\x52\x2c\xa5\xda\xb1\x4b\xa9\xb6\x0c\xaf\xfd\x89\xe1\x86\x49\x8e\xf1\x00\xdd\x51\x7c\x9c\xcb\x0a\x78\x76\xc0\xb7\x27\x34\xaf\x6c\xc8\x8e\x3b\x62\x30\xdf\x16\x8b\x85\x43\xbb\x28\x3c\x30\x98\xad\x56\x2b\xd5\xb6\x0e\xc0\x44\x57\x2b\x59\x78\xe4\x49\xf4\xc0\x60\xb8\x26\x16\xd5\x76\x25\x0e\x76\x24\x3d\x30\x18\xaf\x8f\x83\xb7\x6d\xc6\xc1\xcf\xe7\x5a\x4e\xc1\x4e\x00\x2d\xd0\xbc\xa0\xfc\xf6\x56\x88\x28\x08\x0b\xd5\x34\x9c\x10\x86\x66\x2a\xff\x53\x64\xfb\xb1\xad\xf4\x33\x8f\xbb\xa5\xfb\x7b\xdf\x8a\xfb\x49\x32\x77\x84\xdb\x0a\x93\xd3\xc2\xa6\xac\xca\xf7\xe4\xc5\xe5\xbc\x6a\xb0\x4c\xdf\x7e\x58\xec\x53\xdc\x76\x21\x4f\x80\xb1\xa9\xf7\x31\x88\x40\xc1\xc8\x75\x27\x17\xa4\x26\xf3\xea\x21\xf1\x40\x9f\xff\x24\x1e\xe8\xfc\x91\x07\xfa\x77\xe7\x81\x18\x21\x7e\x7d\x13\x0d\x69\xd4\xd7\x9b\xb2\xe4\x5c\xd1\x82\xa5\xbd\x31\xf8\x9f\x61\x76\x0d\xe3\x6e\x21\xdc\x66\x3c\x79\x85\x70\xc6\x47\x31\x29\x8b\x02\xe6\x27\x10\x63\xc2\xfb\xf4\x92\x6c\xf2\x36\x8b\xa1\x27\x15\x6c\xce\xc0\x83\xbd\x1b\x14\x03\x96\x5c\x18\xe3\xf9\xf3\x38\xce\x4b\x96\x02\xe9\x84\xf9\xad\x72\x46\xc8\x68\xcd\xd2\xab\x30\xed\x13\xe7\x7b\x32\x2e\x30\x0b\xa8\xb6\xef\xb7\x3c\xf1\xa8\xa6\x89\x45\xa6\x35\x43\x1b\x0a\xda\x89\x0b\x29\x9f\x93\x29\x38\xca\x52\x9c\xd3\xac\x13\xcf\x52\x78\xd5\xb1\xbe\xd1\x40\x66\xd7\x80\x07\x29\x93\x7d\xe3\x2a\x11\xfa\xf7\x29\xbb\xc0\x18\xa1\xcd\xd4\x0e\xfc\x13\x40\x56\x33\x69\xf3\x1e\x3e\x4d\xa4\x96\x2e\x27\x7c\x05\x23\x98\x71\x76\x01\xd3\x5e\xb4\xc0\xd3\x2c\x47\x9f\x61\xfc\x81\xa9\x25\xfc\x14\xdc\xb0\xdc\x24\x7d\xc8\x93\x94\x94\x54\x7f\xaa\xb9\x10\xe0\xe0\x2c\xe8\xe1\x29\x4c\x69\x80\x32\x18\x00\x1f\x53\xa5\x49\x9e\x5d\x75\x60\x8f\x2f\x36\x40\xcf\x94\x18\x3d\xcd\x8e\xb2\x34\x15\x4b\xbb\x7b\x10\x08\x75\x50\x1a\xfb\xde\x38\x42\x49\x46\x06\x97\xc9\xc5\xc0\x65\x40\x55\x8f\x0b\xdf\x1f\xb7\x0c\x29\xe3\x62\xe7\xae\x04\xe7\x46\xc6\xaa\x5c\xc4\xc5\x67\x7d\x1f\x79\x60\x62\xf1\x69\x7a\xf4\x43\x76\x24\x3e\x6b\x8c\xa0\xfd\x4d\x6d\x25\xaa\x52\x13\x9f\xad\x81\x6b\x25\xc6\xea\x79\xe0\x10\xfe\x45\x95\x19\x8b\xed\x81\x1f\xf5\xb2\x8a\xc6\xf3\xb3\xa1\x81\x7c\x5b\xd5\x95\x5e\x19\x6a\xd4\xa5\x35\x09\x42\x51\x7a\xa9\xf1\xa0\x6c\x6f\xdb\x0c\x00\xe5\x40\xb5\x23\x65\x1c\x27\xb2\x68\xe1\xa7\xfd\xcb\xc3\x7d\x36\xb0\xfd\x31\x7d\x83\x8b\x7d\x9e\xf4\xd9\x6e\x8c\x62\x2f\x28\x3f\xed\xe8\x14\x87\xb6\xe3\xfb\x9f\xf6\xf7\xbf\xbb\x81\xe5\x77\x37\xb8\xfc\x24\xba\xc4\x4e\x99\x64\x6a\x6f\xc8\x32\xf4\x25\xad\x02\x68\x98\x3c\xa9\xf6\x2c\xcb\x02\x52\xb3\x79\x19\x45\x87\x7c\xdd\x0d\x43\x28\x58\x12\x43\xf4\xad\xa9\x7c\xd8\x34\x41\x19\x38\x8f\x4d\xb7\x11\x37\xa7\x76\xaa\xf9\xc9\x22\xcd\x34\x33\x4c\x6d\xc5\x58\xe4\xeb\xd7\x30\x8a\xeb\x01\x52\x91\xbb\xde\x23\x73\xc9\x0f\x19\x8c\xd3\x08\x25\xf5\x30\xa8\x74\xbd\x11\x86\x7d\xea\x0c\x58\xfa\x6e\x3e\x20\xac\xd5\x34\x3c\xf7\xc7\x26\xfd\x4f\x8f\xd4\x00\xdf\x11\x73\x35\xb1\x11\x98\x87\xf3\xce\xf0\x2c\x6d\x3c\x6c\xb9\xb7\xd7\x43\x58\x60\xc5\xf3\x40\x98\xc3\x55\xc4\xbb\xab\x61\x00\xc6\x3a\xe5\x5e\x85\x2e\xde\x9c\x36\xa1\x08\x6a\xda\x5a\x38\x2e\xed\xa9\x11\x57\x03\x61\x0e\xef\x74\x72\xf8\xd1\x5c\x8b\xc3\x71\x02\x68\x9e\x25\xfd\xfc\x6e\x8e\xcb\x80\xd2\x8c\x50\xda\x1e\x6d\x8c\x4c\x59\x2f\xad\x44\x74\xca\x14\x68\x5b\x20\x62\x56\x4a\x8d\x88\x2a\x6f\xf3\xc6\x08\x1d\xaf\xbc\x81\x78\x18\x8e\x09\x6f\x3a\xd4\x95\x6c\xed\xd8\xcc\x8a\x7a\x4d\xe6\xd6\xbe\x4b\x35\x5b\xa3\x35\xea\xdd\x45\xb8\x5a\xc1\x63\x82\x2b\xf0\x19\x9c\x83\x6b\xf0\x1e\x1c\x2b\x7e\xf3\xe2\x21\xf1\x9b\x6f\xff\x24\x7e\xf3\xe4\x91\xdf\xfc\x77\xe7\x37\x09\x77\xf9\x51\x72\x97\x96\xce\x6d\xe4\xe0\x39\xd5\xfd\x51\xd5\xb6\xc5\xac\x7e\x0b\x6d\x5b\x4e\x0d\x5b\x39\x03\xd9\x22\x95\xeb\xac\x12\x52\x8b\x66\x8a\xbd\x51\xe4\x31\x40\xc5\x07\x26\x02\x2e\x85\x02\xad\x5a\x9f\x2a\x7d\x78\x82\x48\x9e\x19\x74\x70\x26\xb4\x67\x89\xa1\xd2\x3b\xa1\x75\x46\xf3\x85\x16\x1b\xdb\x0b\xc0\xb4\xae\x26\xcb\xd9\x69\x56\x9e\x34\x25\xa0\x45\x63\x9f\x5b\xee\x45\xb8\x08\x70\xbe\xac\x58\xc7\xb2\x6e\xce\xb3\x24\xf1\x82\x5e\x82\xd2\x0b\x18\xfb\xba\x89\xae\x4e\xc8\x46\xb8\x78\x49\xc3\x5c\x53\x4a\x75\x14\xe1\xd1\xd4\x0c\x86\x69\x54\x39\x08\x4a\x47\x8e\xdb\x1f\x55\x8e\x5b\x66\x98\x43\xc3\xd5\x1c\x67\x49\xc2\x73\xdc\xf6\xe2\x9c\x52\xfe\x0b\x7f\x19\x8e\xfc\x65\x18\xfb\xfe\xe5\x16\xbc\xe6\x85\x99\x34\x80\xab\xf4\xe4\x67\x4e\x2f\x7f\xb6\x3e\xd7\x64\xf7\x3c\xe7\xd5\xde\x3a\x38\xce\xb7\x7a\x53\x35\x4d\x12\xe4\x68\xbe\xf0\xc0\xb5\x85\x87\x27\x61\x05\xef\xad\xef\x63\x88\x47\x53\xba\xe6\x1e\x38\xd6\x38\x40\x63\xb6\xb4\x40\x08\x76\xb2\x60\x96\x0f\x88\xb4\x67\xf9\x6c\x4d\x55\x65\x4f\x6e\x63\x2f\x08\x74\x56\xaf\x5d\x9e\x56\x05\x47\xe3\xc5\x03\xae\xe6\x14\x7b\x55\xc3\xcb\x36\x5f\x35\x1b\x91\x3a\x20\x5e\xe0\x4a\x9e\xab\xf0\x30\x3d\x6a\xb0\xa1\xde\xb1\xb5\xcd\xef\x4e\xc3\xf0\x98\xd4\x44\xad\x8b\x6d\x05\xab\x95\x68\xc9\x65\xcb\x12\x5c\x85\x27\xfe\xe5\x7d\xe6\x87\xf8\x6c\x23\x10\x3c\xe0\x5d\x21\x38\xaf\x8e\xc0\x9d\xfb\x76\x6b\x55\x98\x85\xc7\xd8\xed\x1e\x18\xa8\xbb\x76\x35\x91\xdb\x00\x28\x00\x97\x3a\x85\xeb\x1a\x5c\x3b\xcd\x9b\xa3\x5d\x33\x6c\x79\x3a\xda\xe9\xdc\x6a\xda\x5a\x38\xae\xed\xe5\xa1\x37\xcd\x60\xbc\xed\x62\xbc\xb7\xe1\x8a\xcb\x6a\x30\xdd\x16\xf4\xb1\x0d\x5a\xbf\xef\x06\x93\xed\x85\x09\x97\x84\x67\x59\xca\xff\x34\xde\xe5\x63\x2b\xde\x65\xad\xd8\x7d\xed\xe3\xf2\x6e\x93\xec\x4a\x66\xbc\xd4\x1d\x02\x1f\x0e\x7b\x31\x7d\x24\xf3\xbf\x05\x32\x7f\xd2\x90\x7c\x2a\xed\xc1\x3f\x16\x51\x12\xf8\x56\x88\xda\x0f\xe4\xd7\x3b\x46\x35\xab\x27\x57\x4f\x22\x45\xa9\x84\xde\x58\x46\xba\xdf\x1e\x52\x37\xcf\x32\x2c\xdc\xde\xd2\x5e\x96\x07\xbe\x37\x2e\xde\xc8\x48\xa2\xde\xb8\xf8\x90\x65\xf8\x8d\x8a\x0f\x9a\xb4\x0f\xe4\xe0\xa2\x43\xc7\x56\x5c\xdc\x98\x53\x7c\xe2\xbb\x8e\x7c\x5e\x29\x33\xfa\x02\x66\x76\x39\x4a\x60\xf1\x2b\x4a\x2f\x44\x05\xee\x1b\x45\x1d\xda\xa7\x96\xa7\xb3\x88\xc2\x7a\x57\xe6\x37\x73\x1b\x83\x3e\x92\xed\xd3\x53\xcd\xaa\xe0\xcd\xc9\xd8\x3e\xac\xfd\xb0\x82\xc2\x9e\xcf\xed\xdd\xfe\xa5\x4f\xb7\xf6\x14\x4d\x56\x3e\x45\x54\xc4\x79\x3f\x11\x64\xe5\xc5\x9c\x7f\x59\xb9\xcf\xdd\x5c\x33\x89\x1d\xb9\x96\xc5\xc9\x0c\xfc\x94\x47\x96\x32\xa4\x09\x6c\x1a\xab\x85\x46\x78\xee\x17\xee\x18\x30\xae\xb8\xdd\x02\xd0\x0a\x67\x59\xd9\xa5\xcd\x6f\x8d\xbc\xea\x89\xc9\xe2\xab\x92\xa7\x29\x97\xaa\x47\xb1\x4f\x09\xbf\xa9\xbe\xbe\x90\xa3\x20\xec\x7a\x96\x9e\xd2\x79\xa0\xfa\xfe\xe0\xf6\x36\xd5\xff\x5b\x27\x16\x95\x0c\x86\xb3\x22\xe0\xa1\xb5\xf5\xee\x2e\x0e\x21\xaa\x89\x43\x88\x99\x6d\x6d\x35\xe0\x1f\x29\xd8\x41\x63\x6a\x17\x29\x42\xd3\xfd\xf4\x97\x03\xc1\x92\x42\x3d\xb8\x77\xb1\x18\x16\x38\xf7\x0f\xc0\xe1\x8f\x41\x0f\xe7\x68\xe6\x07\x65\xaf\xd7\xd3\x8a\x04\x84\xee\xe1\x01\x10\x7f\xcb\xaa\x9f\xf4\x48\x6e\x68\xf5\x54\xce\xb3\xee\x25\xfa\x7c\x47\xc9\xf3\xea\xc8\x51\xe5\x83\xe2\x0e\x2e\x49\xbe\x4e\xa3\x39\xac\x5a\x66\xcd\xd9\x2a\x21\x58\xec\x53\x17\xaf\x6e\x81\x73\x82\xbb\x51\x4e\x0e\x16\xec\x92\xa9\x95\x93\xef\x54\x1d\x2e\x1e\x02\x09\xfb\xfe\x91\x84\xfd\x16\x48\xd8\xe3\xd0\xa7\x32\xe9\x85\xb2\xac\x11\x66\xb5\x04\x66\x41\x65\xd0\x9b\x5f\xe9\xd7\x56\xc2\x6f\x41\xec\x89\xef\xdc\x53\x51\x51\x79\xd7\x52\x54\x39\xcf\x92\x6c\xb2\x54\xae\xef\xa2\x84\xbd\x4b\xef\xa8\xea\x76\xec\x2c\xd3\x33\x99\x4e\x9d\x35\x5e\xc6\x13\xa8\x59\xdb\xc8\xde\xc4\x13\xf8\x9e\xba\x6e\x2a\x13\x15\x51\x76\x89\xe0\xd5\x9c\x9a\x4a\x25\x8b\x59\x5a\x28\x97\x0a\x51\x61\x8a\x26\xd3\x04\x4d\xa6\x58\x47\x7f\x55\x19\x96\x36\xb5\x52\x10\x6b\x95\x9e\x90\xcb\x47\xca\x5f\xb9\xb9\xff\x09\x0d\x66\xcd\xb0\x6b\xe2\x46\x31\x4f\x34\x12\xe8\x08\xa6\x18\xe6\x85\xb8\xf4\xc3\xc3\xdb\xdb\xc3\x30\x64\x6f\x83\xd5\x7f\xfe\x1c\xec\x8a\x20\x95\xc2\xbe\xde\x05\x4e\x64\x81\x84\xd4\xda\x46\x80\x0f\x44\x9a\x08\x6e\x97\x75\x89\xe8\x98\x03\x1f\x06\xfb\xf4\xd3\x0c\x46\xf4\xd7\xd3\xde\x8f\x32\xe7\x26\x03\xf9\xc6\x1e\x0d\x3f\x88\x75\x9d\xbd\xbd\xf5\x59\xf8\x5b\x73\x1a\xb8\xa9\xbf\xf9\x51\x0f\x91\xad\x77\xf7\xa7\xf0\x87\x03\x31\x97\x2f\x60\x5a\xd8\xae\x2d\x95\x06\x4f\x7f\x3c\x28\x49\x97\x5f\x65\xf9\x3b\x6e\xc2\xc3\x6d\x7e\x48\xad\x3e\x04\x6a\x3c\x7d\xa8\xcd\x17\x60\x92\xa3\x3e\xec\xe5\xb0\xc8\x16\xf9\x08\x0a\x55\x06\x18\xcd\x17\xc6\xe7\xd1\x7c\x01\x34\xce\xad\x3f\x38\x03\xa8\x38\xe1\x41\xee\xfb\xbb\x87\xa5\xe8\x80\xda\x52\x66\x58\x58\xd8\x1b\xc2\x24\x4b\x27\x05\x4f\x53\xef\x05\x3d\x14\xfb\x62\x61\x34\x5d\x4e\x1f\x52\xc3\xc3\x3e\x06\xe7\xd9\xf0\x4d\xdc\x47\x80\x3a\xbe\xfc\x27\x5c\xf6\x7f\x39\x79\xff\xae\xc7\x5e\x3a\x34\x5e\xfa\x03\x44\xc3\xa4\x71\xbb\x6b\x42\x38\x9e\x05\x6a\x48\x1c\x22\x8c\x3f\xb8\xc7\xe6\x28\x27\x83\x64\x75\x8e\x59\x4c\xda\x26\x30\xfb\x58\x83\xd7\x58\x7f\x34\x5f\xec\x63\x0a\xdc\x9a\xb2\xe1\x02\x25\xf1\x29\xdf\xc7\x4e\x0a\x89\xae\xb2\x30\x71\xa4\x5f\xb4\x45\x00\x28\x1c\x9c\x81\x94\xfc\x5f\x4e\x5e\x3c\xa8\x5e\x37\x18\x3e\xbd\xa1\x84\x95\x5a\x42\x41\x55\xd1\x1b\x15\xb1\x84\xb0\xd0\xca\xf4\x6a\x6e\xa2\x9d\x94\xd5\xc2\x01\xc8\x07\xb0\x87\xe2\xb3\x10\x97\x81\x68\x42\x1f\x59\x6c\xa2\x14\xc0\x8c\xc5\x4e\xa9\xe5\x09\x5d\x6d\x80\xc2\x7c\x80\xcf\x28\xcd\x87\x78\x87\x76\x44\x34\x64\xbd\x07\xc6\x2e\x42\xc1\x0e\xd2\xc7\xcd\x7a\x95\x06\x32\xdf\x43\xda\x13\x5b\x64\x27\x19\x64\x67\xb7\xb7\x3e\xf9\x27\x1c\x9c\x05\x80\xfc\x21\xea\xab\xbe\x17\x61\x2a\xdf\x59\xba\x4d\xc3\xa7\x3e\x1c\x60\xed\x68\x10\x20\xd6\x17\x0a\xcf\xfa\x26\x27\x08\x06\x01\xb8\xa1\xfc\xe4\x8d\x76\x1f\xf5\x75\xea\xa3\xd0\x93\xd4\xa6\xd1\x0c\xf2\x9d\x5e\xf4\x0b\x46\x7a\xa8\xb4\xbd\x4c\xaf\xa2\x1d\xb8\x37\x69\x0c\xaf\xfb\x09\x10\x69\x25\xc8\x69\xa0\x8e\x68\xcc\xb5\x9f\x86\x61\xee\x53\x85\x9e\x2b\xf0\xb1\x3f\x38\xfc\x11\xfc\x55\x0b\x7a\x4c\x2f\x3d\x16\x32\x39\xf0\x53\x1e\xaa\x59\xc8\x91\x83\x20\x28\x77\x8c\x2b\x36\x5c\x00\x24\x43\x2f\xab\xad\x98\xa5\x2f\x22\x1c\x51\x95\x5a\xcd\x67\x7f\xc0\xb2\xf1\x7a\x2c\x49\x31\x8c\xbb\x74\xc0\x1e\x21\x0f\x09\xf1\xdf\x47\xe5\x59\x50\x8e\xa2\x39\x5e\xe4\x50\x84\x6a\x80\x66\xd0\x81\x50\x7a\x2e\x61\x98\xcf\x50\x0a\x7f\x37\x6f\x5c\x3f\x28\x8b\x69\x76\x45\xf6\xac\xc8\x8f\x6b\x66\xed\x7d\xc7\x22\x17\x1e\x80\xb4\x57\x58\x49\x7b\x49\x11\x35\x11\x95\xd9\x3a\x64\x7c\x17\x55\x21\xb4\x7f\x87\x21\x7c\x46\x26\xbf\x0f\xed\xaa\xed\xd1\x88\xa8\x27\x7c\xc6\x48\x0d\x57\xde\x04\xf5\xdd\x86\xc7\x46\x7d\xca\x9e\x61\xf3\xaa\xa5\x9a\x8b\x9f\xb3\x05\xe5\x7d\x8f\xa8\x79\xe9\x07\x1a\x79\x91\xad\xaa\xe3\xf5\x17\x73\xac\xbf\xf9\xe1\x4d\x02\xc7\xb8\xcf\xed\xb1\x59\x7c\x86\xff\xfb\x09\xd9\x07\x63\xfc\x04\xf5\xae\x50\x8c\xa7\xfb\x3f\x00\x9c\xcd\xcd\x3a\xff\x7a\x82\xc8\xc6\x29\xcb\x29\x8a\xa1\xe8\x1f\x5f\x10\x17\x6a\x2a\x88\x89\x8a\x22\x1b\xa1\x08\x6b\x04\x51\xc1\x43\xbb\x68\xe3\xd6\x5a\x85\x61\x53\x29\x3d\x1a\x5a\x11\x25\xa2\xc8\x3d\x69\x52\x0e\xda\x69\xb2\x9d\xf7\x44\x15\xeb\x08\x0e\x6a\x01\x9c\xed\xd0\x7c\xd7\xc6\x75\xa8\x36\x43\x75\x97\x95\x2c\x52\xb9\xbe\x59\x04\x58\x11\x84\x90\xc2\xe5\x6a\xec\x92\xc6\xf0\xbc\xd3\x6d\x6d\x4f\x92\xbe\x1d\xcc\x67\x61\x93\xd9\xa0\xf9\xc0\xef\x61\x36\xa0\xbc\xeb\x55\x20\x9e\x8d\x3b\x89\xf6\xf6\x50\xdb\x4e\x1e\xd0\x4e\x8a\x7b\xf0\xa7\xc3\x83\xdb\x5b\xf9\xa3\xf7\xdf\x7f\xfc\xde\x4d\x9a\xf1\x4c\xdf\x5c\xe1\xf4\x5c\xed\x46\x2b\xd7\x37\xdf\xa0\xa5\x7e\xf8\xd5\x82\xb8\xae\x06\xbb\xd4\x7d\x14\x44\x1b\xeb\xb3\x36\x49\xdb\x5f\x44\xf5\x37\xf3\x8d\x8b\x44\x36\x03\xbf\x30\xf3\xf7\x7f\x92\xdb\xe4\xa7\xff\xeb\xe0\xe0\xd9\x61\xff\x87\x92\x86\xa7\x14\xd3\x74\x63\x4f\x93\x20\x7a\x0f\xa4\x57\xb0\x63\x72\x4b\xe7\x57\xe6\x1b\x9b\xc2\x6b\x1c\xf0\xd0\x55\xe2\xd4\x53\xdb\xa5\x04\xa5\x90\x3c\x9a\xa3\x45\x7e\x09\xfd\x82\xfd\xfb\x73\x54\x10\xc6\x07\x87\xab\x26\x12\xa0\xf0\xc2\x8c\x75\xf3\xc7\x02\xe6\x4b\x36\x6b\x59\xee\x7f\x1a\x50\x69\xa1\x6a\xd0\x45\x71\xe8\x7d\x77\x83\x7b\x28\x2e\xbd\xb3\x4f\x41\xdd\xb5\x1d\x80\x34\x7c\x9e\xe7\xd1\xb2\x37\xce\xb3\x59\x03\x8a\xe7\x49\xe2\x7b\x9c\x2a\xed\xf4\x86\x51\xde\x43\x45\x57\x66\xa2\x0a\x14\xfd\xa1\x11\x6a\x34\xbb\x7c\x81\x7d\xcf\xd1\xbb\x33\x2f\xa0\xc4\x4e\x01\xb1\x7e\xaa\x62\x80\xf4\x86\x3d\x21\x2d\xeb\x72\x4a\xcf\x1a\x36\xa1\x7c\x69\x6f\xea\xc6\x4f\x07\xcf\x19\x81\x01\x04\x88\xd0\x42\x1a\x27\x27\xfe\xba\xf0\x61\xed\x0c\x91\xff\xed\xa4\x6e\x62\xf4\xad\x0f\x07\x07\x67\x00\x81\xc3\x83\x03\xd0\xfb\x91\xcc\x26\xf9\x74\xa8\x7d\xda\x81\x8c\x90\x3b\xf1\x31\x48\xc9\x07\x8d\x56\xcc\xc9\xbb\x91\x84\x83\x03\xd0\xfb\x1b\x38\x3c\x03\x59\x38\xa0\x7f\xd8\xe8\x72\x06\xe2\xd4\xef\xf5\x7a\x1f\x7d\x04\xe0\xe0\x87\x33\x90\x10\x8a\xf1\xe0\x2c\x00\xe6\xe7\x8c\x7c\x3e\x3c\x63\x4e\x3b\x95\x6b\x20\x67\x43\xc6\xe1\x53\xe8\xe3\x40\xc6\xe6\x92\x1c\x7f\x78\x73\x6d\x3d\xcb\x60\x69\xbd\xc1\x65\x19\x04\x65\x09\xe6\xe1\x7b\x3f\x36\x8c\x21\xb8\x70\x63\x90\xdf\x91\x96\x69\x66\x63\x90\x62\x92\x01\xea\x31\x63\xbe\xcd\xdd\xbd\x35\xf7\x30\x21\xff\x22\x58\xa9\x6a\xc8\x42\xab\x84\x30\xf7\x81\xd7\xa0\xe9\x07\x67\x65\x49\x23\x34\x59\x5d\xd0\xa5\x3d\xf7\x3a\xf8\xa9\x1b\xb3\x2e\xcc\xb9\x57\xfc\x13\x37\x7e\x2e\xa9\xba\x0f\xd4\x64\xca\x03\xb0\xac\xec\x35\x4d\x08\x76\x2f\xcb\x7e\xdd\x3f\x00\xcb\xfe\x01\x5d\xef\x4b\x1b\x7b\x45\xcc\x76\x2f\x93\xfe\x43\x49\x03\x1e\x58\xb8\x9d\x12\xbc\x7b\x5d\xf4\xcf\xd5\x13\xa7\xcb\x07\xef\x65\xfa\xe9\xbc\x9f\xd7\x20\xe6\xa2\xc7\xed\x3d\x91\x2c\xf0\x86\x50\x66\x2d\xff\x8d\x06\x30\x01\x88\x75\xd3\x30\x0b\xa5\xc9\x00\x6f\x8e\xd3\x82\xd3\x8c\xd4\x62\x9a\x37\xc7\x6a\x03\x5a\x8d\xf6\x54\x6a\x2a\xb7\x40\x29\x80\x34\xa3\xd3\x98\xd0\xcd\xd1\xe9\x40\x9a\xd1\xb9\xf8\xd8\xcd\xf1\x3a\xa1\x35\x77\xa0\x8e\x16\xdf\xbc\x13\xb5\x10\x9b\x3b\xa2\xd1\xf0\x9b\xe3\xd6\x81\xac\x38\x42\x55\x72\x7f\x8b\x73\xe4\x00\x66\xa1\x8f\x03\xc3\x9d\x48\x7b\x31\x60\xef\xfa\x09\x94\xe2\x91\x65\x1f\xf6\x96\x4f\x44\x08\xce\xfd\x1f\xca\x8a\x63\x0f\x48\x85\xec\x21\x0f\x9d\x49\x1e\x69\x72\x90\xe2\x8f\x1c\xb3\xc4\x21\xf3\xec\xca\xc7\xbd\xeb\x2e\xec\x5d\x83\x1f\x82\x27\xda\xb7\x65\x17\xf6\x96\xe0\x87\x20\x28\x69\x7b\xa1\x01\x65\x8e\x3c\xf9\x4f\xe8\x59\xda\x47\xfb\x79\x50\x71\xf1\x51\x09\xe9\x04\xdc\x3c\xe4\xd0\x76\x8c\x61\xa5\xdf\x23\x3e\xa0\xfc\x7b\xa4\x8d\xe4\xa3\x65\xaa\x82\x18\x01\x8b\xc2\xa7\x02\x43\xa0\x61\x3d\xf5\x83\x9b\x71\x96\xfb\x34\xad\x4e\x28\x35\x70\x9c\xad\x03\x38\xa4\xbe\xfe\x84\xdf\xf1\x61\x00\x50\x78\xf0\x77\xf4\x13\xfc\x3b\x7a\xf2\x24\xc0\x03\x74\xa6\x1a\x0c\x90\x4c\x11\x87\x25\x93\x30\x20\xdd\x87\xbd\x25\xa1\xad\x95\x16\xf1\xb8\xad\xc2\x7f\x5f\x11\x7a\x5f\x9f\x1d\x85\x08\x78\x1a\xeb\x42\x32\x87\x6a\x48\x8d\x81\x8b\x22\x2c\x51\x37\xec\x8d\xb2\x74\x14\x61\x1f\x1b\x52\x75\x26\xa3\xfd\x79\x69\xfa\x9d\x17\x27\x02\xab\x47\x58\x91\x01\x8f\x17\x16\x4d\x26\x39\x9c\x44\x58\xef\x8c\xd4\x78\x58\x9d\x72\xf5\xbb\x2a\x7e\x27\x6c\xe2\x93\x90\xe9\x49\x20\x67\x62\xc9\x6f\xae\x64\xa1\x02\xf6\xd1\x7c\xd1\x3f\x10\x2a\x9e\x83\xd2\xee\x0a\x79\x85\xea\x3a\xd1\x6a\x66\x36\xec\xc5\x26\xa6\x25\xfb\x29\x63\x14\xee\xd0\xbe\x84\x5b\x37\x8b\xd4\x38\x45\x2b\x03\x66\x75\x8d\x8d\x1e\x92\xcd\x47\xfc\x68\xf3\xf1\x2d\xd8\x7c\xcc\xab\xf9\xad\xd7\xb1\xe9\x18\x69\x66\x7a\x1e\xc8\xb8\x0d\x83\xfc\x8a\x66\x30\x2d\xc8\x6d\x44\xc5\x8f\x1e\x88\xac\x0a\xf3\x28\x8e\xe9\x89\x2b\xac\x82\x2a\xc3\xbd\xd0\x2c\x20\xa6\x22\x28\x77\xe5\xfe\xd1\xb4\x75\xcf\x9c\x5f\x7d\x53\x8a\xcc\xaf\x9d\xa0\x7f\xc8\xec\x12\xa8\x91\xe1\x6b\x17\x78\x49\x5f\x90\x6a\xbc\xdf\xbf\xc2\xb1\x5d\x8d\x97\x3c\xf9\xe1\x80\x79\xa2\x71\xd9\x60\x03\xc8\xee\xa1\x51\xf3\x5f\x8c\xdf\x76\x56\x7d\xf2\x03\x37\x9f\x58\x36\x56\xa2\x55\x66\x51\x71\xd1\x80\xf5\x09\xfd\x9b\xc3\xe1\x71\x3a\x71\xe4\x1e\xba\x02\xf5\xe4\x87\xef\xf5\x51\x4a\x44\x6f\x62\xd9\xe4\x93\x21\xac\xec\x92\xd2\x2e\x4d\xf9\x9b\xf7\x26\x0b\x14\xbf\xca\x72\xa6\x7e\x08\x78\x1c\x15\x1a\x1b\xce\x5e\x4a\xed\x19\x63\x44\x0b\x7b\x87\x9a\x5f\x65\xba\x9e\xeb\xbd\xb7\x54\x1f\x2c\x1f\x27\x4a\xe9\x45\xc3\xc2\x17\xdb\x82\x1b\x1d\x74\xe9\xa3\xc5\x7f\x04\x5d\x59\x0d\x5b\xd5\xb0\x5e\x2d\x08\xca\xa8\x58\xa6\xa3\x4e\x0e\x93\x2c\xa2\x2f\xa7\x14\xb5\xcb\xde\xa2\xe2\x38\xca\xc9\xd1\xdf\xdb\xf3\xa3\xab\x08\x61\x7b\x38\xac\xb1\xf0\x46\x25\xa7\x2c\xd4\x45\xf2\x2f\x22\x1c\xf1\x78\x96\xe6\x51\x0b\x82\x32\xa7\x91\xda\xa5\xaa\xd6\xaa\x10\x42\x5d\x31\xd0\xd5\x57\xd5\xf8\x41\xb6\xf8\xda\xc8\x79\x02\xba\x0f\xb2\x07\xba\x34\xbc\x25\xd2\x1d\xbc\xcb\x0d\x80\x2c\xe8\x32\x82\xa7\x35\xa0\xf5\xbb\x19\x94\x0e\x29\x0f\xa3\x34\x13\x88\x6f\x58\x56\xbd\x3e\x2a\x43\x9e\xb6\xa3\xaa\xc5\x03\x6e\x7d\xd1\xab\x6c\xb4\x28\xea\x94\x49\xb4\x90\x1a\x5d\x94\x6a\x5b\xfe\x9c\x2c\x72\x63\x7b\xe8\x2d\x48\x61\x1d\x34\xd6\xb0\x1c\x25\x30\xca\x5f\x8b\xd1\x98\x3a\x1d\x5b\x15\xac\x25\xcf\xd0\x31\x72\x53\xa8\x3a\xad\xd4\x0a\x6d\x95\xb6\xa5\x85\x4a\x8f\xa9\xf0\xcd\x62\x91\xbc\x50\x9f\xef\xba\x61\xb7\xd2\xc9\xc1\xa0\x1c\x65\x29\x8e\x50\xca\x6d\xc1\x4f\x85\xb9\x52\xab\x2b\xa2\xc8\x66\x90\x6b\x41\x0c\x3b\x27\x61\x7c\xc6\x2c\x82\x4c\xc0\x7b\x7b\x35\xa6\x56\x8e\x46\xbf\x64\xc3\x37\x71\x20\x95\x65\x74\x2f\x6a\xe7\xc1\xbe\xed\xe8\x93\x8c\xc2\x03\x90\x86\x07\x96\x76\xe4\x6c\x87\xb0\x74\xdc\x20\xa7\x93\x8d\x3b\xc2\x1e\xe1\x46\xb3\x8e\x8a\x2c\xeb\xaa\x42\x37\x88\x5a\x94\x61\x06\x46\x61\x46\xba\x39\x38\x38\xa3\xb8\xe2\x30\xfa\x1e\x76\x0f\xc1\x3c\x2c\xc8\xbf\x3b\xa3\xbd\x3d\x3f\x7e\x12\xf6\x7e\x04\x73\xf2\xff\x01\x58\x90\x0f\xdd\x2e\x98\x77\xbb\x01\xe0\x1a\x18\xdd\x96\x2c\x03\x2c\xbf\x45\xff\xf0\xe0\xe0\x7b\x04\x78\xaa\x71\xfa\x2b\x02\x94\x47\xef\xcb\xdc\x9b\x31\x38\x08\xc0\x75\x1f\x7d\x0f\x9f\xf8\xa3\x67\x07\xfd\xde\x8f\xc1\x13\x7f\xf1\xac\xf7\x63\xff\x20\x00\xd2\x37\xa1\x9f\xe9\x5e\x4b\xec\xbe\x38\xa1\x79\xa8\x09\x71\xb6\xa2\x07\xa9\xd1\x83\xc2\xee\xc1\x9c\xf5\x20\xdd\xa2\x07\xe8\x49\x18\x81\xf4\x49\x58\x94\x9c\x73\x27\xcc\x8a\x34\xf4\x4b\xc0\x68\xbe\xf8\x00\x67\x11\x22\x57\x5f\xff\x86\x8d\xb6\xf7\xa3\xdd\x11\xd8\x45\xdf\x43\x70\x10\x94\xbc\xa1\xd1\x24\xad\x69\x92\xf2\x26\xa3\xf9\xe2\x57\x42\xa7\x90\xba\x95\x7b\x93\x8a\x44\x0c\x8a\xc5\x7c\xea\x39\xc2\x75\x00\x94\x65\x59\x82\x2c\x8c\xfd\xc4\x10\x5b\x51\x92\xef\x5e\xc4\xd2\x64\x4a\x07\x67\x62\x4e\xb9\x3a\x28\xaa\x74\xc0\xa6\x2e\xef\x45\x3c\x7f\x40\x70\x17\x36\x6e\x49\xb8\xde\x0b\xce\x1f\x4b\x6a\xe8\x66\xe1\xfc\xc2\x4a\x28\x0b\xbb\x22\x63\xd6\x12\xfb\xd5\xc1\xa0\x47\x59\x93\xf6\xd9\x15\x59\x96\x99\xcd\x11\xd1\xf6\xcd\x48\x74\x22\x65\x73\x54\x06\x94\x66\x84\x6e\x9d\xd2\x86\x78\x5d\xc0\x9a\xd1\x9b\xd4\xc6\xe6\x98\x2d\x38\xcd\x48\x4d\xc2\x64\x73\xa4\x16\x9c\x66\xa4\x8a\xc2\xd9\x1c\xa1\x06\xa3\x0d\xb2\xbb\x58\xd2\x0a\x24\x0b\x71\xa2\xfb\x50\xce\x57\xca\xc1\x72\xc4\xa3\xe5\xb5\x72\xe5\xc7\x70\x36\x4f\x22\x0c\xbb\xe3\x88\xf0\xfb\x4b\x97\x14\xac\xad\xf8\xcc\x15\x9a\xcc\xf2\xc8\x6a\x9f\xd9\x47\xc9\xcf\x66\x0f\x49\x7e\x36\x7c\x94\x9f\xfd\xbb\xcb\xcf\x18\x31\x3e\xe6\xbe\xb5\x34\x45\xe1\x29\x3f\x45\xaf\xd8\x21\x0a\xfc\x1b\x14\xf7\xbd\x62\xf4\x7e\x1f\x3e\x3f\x7f\xef\x81\x61\x92\x8d\x2e\xfa\xff\x31\x18\x0c\x0e\xff\x06\x0e\xc1\x60\xf0\xc3\xdf\xc0\xe0\x2f\xff\x1d\x1c\x9e\xb1\xb4\x27\x83\x01\xa7\xab\xbc\x71\x5a\x78\x67\x60\x30\xf8\xcb\x01\x38\x00\xfc\xeb\xd9\x19\x10\xbf\x69\x31\xff\x1f\x18\x78\x7b\xbc\x6b\xde\x19\x18\x47\x49\x01\xc1\xc0\xa3\x21\xa8\x3c\xe0\x4d\xa3\x62\xea\x9d\x9d\xfd\x07\x98\xd1\x31\x51\x02\xb7\xe9\xc2\xe8\x4d\x87\x85\x07\x68\x78\x56\x34\xa2\x51\x2d\xfb\xbb\x87\xd4\x28\x86\xda\xf3\x95\x22\xda\x41\x51\x1b\x7e\x8b\x12\x8f\x1f\x69\x66\x71\x3f\xd8\xc1\xf9\x92\x7d\xc9\x61\x41\x26\x4f\x8b\xc3\xc5\x54\x06\x99\x10\x6f\x64\xe9\xc9\x62\x34\x82\x45\xe1\x6b\xf5\xed\x70\x5b\x30\xcf\xb3\x3c\xbc\xa1\xd6\xef\x7d\x58\x8a\x96\xcc\x1a\x5e\xd5\x08\x4a\x1a\xae\xd9\x12\x6d\xe6\x6b\x88\x36\x67\xc2\x11\x8c\x45\xb4\x1a\x71\x09\xe5\x4c\x66\x69\x25\xbd\x53\xe1\x0c\xc4\x77\x3e\x8b\xa7\x34\x9a\xd3\xdc\x70\xdb\xfa\x79\x51\x2c\x2d\xae\x54\xab\xad\x62\x53\xf1\xea\x6f\xe2\xc4\x76\x4c\x32\xab\x93\x0a\xc2\x23\x8c\x4f\x1c\xbb\x6a\xe0\x8e\x46\xcb\x85\x61\xe8\x0b\xa3\x6b\xad\x79\x12\x15\x38\xb8\xbd\x95\xa7\x08\x3e\x63\x7f\xf6\x29\x0b\xcf\xc0\x8d\x17\x09\x87\xcf\xa6\x57\x86\xdd\xda\x55\x13\x4d\x2b\x8c\x35\x89\xdc\x4d\x9c\xf5\xf9\xa2\x9c\x32\x7c\x25\xad\x23\xd6\xc8\xc1\x96\xf3\xa2\x67\xcf\xa6\xbc\xa6\x1a\x8e\xa3\x2e\x2f\x14\xb5\xc9\xc9\x10\xae\x3d\x37\x6c\x92\xfb\x10\xb0\xd9\xe9\x63\x20\x07\xd3\x47\x80\x8f\xa3\x9f\x02\xb6\x7a\xfd\xbc\xa4\x13\x23\x94\xb0\x6b\xb7\x2e\xc5\x2e\x37\x76\xb8\xb2\xfb\x66\x9b\x95\x52\xd4\x72\x36\x7c\x1e\xb9\x4b\x28\xed\xf4\x84\xba\x5a\xb6\x57\x7d\xad\xf4\xb4\xcd\x65\x09\x46\xe1\xd0\x5f\x18\x66\x5a\x6c\x8b\x0e\x92\xfb\x64\x07\x6c\xa4\xe2\x00\xdc\x2b\xd6\xb9\x8d\xd5\x38\x5e\xdb\x47\xa7\xb0\xa0\xcb\x45\x5a\x8b\x88\xab\x01\x11\x80\x85\x4e\xbd\x99\x11\x30\x80\x7f\x00\x70\xaf\x80\xf8\x48\x5c\xc0\xe2\xe9\x08\xfc\x31\x98\x04\x2b\xa9\xbb\xab\xac\x5b\x60\x38\xef\x0e\x17\x18\x53\xa2\xb3\x15\x95\x67\x6b\x34\xed\x24\x8d\x2d\xe3\xcc\xf2\x54\x27\x1b\x06\x94\xad\x4d\xdd\xa8\x48\xbd\xe5\x43\x22\xf5\x2e\xff\xa4\x00\xb2\x57\x8f\x24\xe6\xbf\x3b\x89\x49\x68\xad\xcf\x9c\xd6\x8a\xac\xe0\x2e\xd6\x0d\xc0\x93\x38\x46\xee\x28\x2f\x69\x82\x52\x78\x0a\xaf\x71\x7f\x1a\x15\x5d\xf6\xb3\x8b\x69\xaa\x2d\x6f\x1c\x91\x6a\x3f\x47\xa3\x8b\x49\x9e\x2d\xd2\x98\x56\x61\x1f\xbb\x43\xf9\x55\xa5\x3d\x11\x21\xa8\x0a\x1c\x61\xe8\x01\x0f\xc5\x09\x54\xb9\x1d\xed\xd2\x79\x9e\xcd\xe6\x32\xb3\x63\xe2\x22\x18\xc7\x59\xee\xff\xfd\xef\x54\xeb\xd2\x81\xa1\x88\x9d\x9a\xf4\xae\x22\x84\x5f\x65\x39\x4d\xff\x1c\xf8\x32\x29\xf4\x30\x8b\x97\x34\x5f\xc5\xe8\xc2\xe3\x2e\x77\xd2\xd9\x85\xeb\x02\x7c\xd8\x63\xea\x9b\x80\x3b\x86\x53\xed\x1a\x4a\x27\x47\x64\xdb\xe6\x2c\xc3\x3a\x2f\x62\x49\x3f\x68\x8e\xe6\x37\x74\x24\x94\x74\x2c\xfc\x59\xb8\xf0\xfd\xe1\x16\xca\xf1\x4b\x11\x90\x26\x4e\x20\xcb\x6a\xe6\x79\xea\x2b\x0b\x96\xe9\xf8\xce\x7a\x58\x5b\x40\xbb\xfe\x16\x16\x45\x34\x81\x66\x05\xd7\x18\x99\x67\xda\xa5\x54\xc8\x6b\x81\x71\x54\xbb\x04\x4d\xd2\x0f\x4c\x3e\xa3\x7f\x57\x9b\xc6\xfc\x6e\xad\xfb\x52\xc6\xdd\xa1\xd3\x27\x03\x31\xa8\xef\xc7\x90\x39\x94\x18\xfd\x9a\x5a\xd5\xd8\x7c\xbc\x67\xe1\x4b\xdf\x2f\x70\x81\x62\x28\xc3\x32\x94\x59\xca\x5b\xfb\xc1\x0d\xf9\x41\x2b\x93\xbf\xe5\xba\xf9\x76\x3c\x5e\xad\x8b\x4c\x1f\xe8\x40\x60\x84\x2c\x65\x3b\xf5\x55\x96\xeb\x1d\x75\x82\x95\x7b\x9a\x7a\xb3\xe9\xee\x4e\xf5\x98\x0c\x22\x6e\x24\x07\x93\xa9\x5c\x38\xb0\xc8\x92\x4b\x6e\xa1\xa0\x8d\x57\xa4\xb6\x51\xf0\xab\x3b\x96\xd2\x85\xe3\xf0\xca\x1f\x9a\x99\xe4\xd8\x8a\xdc\x45\x52\xeb\x0a\x68\xe7\xa2\x6e\x9f\x7a\x70\x62\x63\x72\xef\x8b\xed\x43\xae\x5a\x68\xd4\x6c\x82\x01\x6a\x4d\xfa\xd5\x80\x08\xc0\x50\x27\xfd\x2c\x54\xce\x7d\xb6\x39\x5a\x37\xb8\xe6\x2e\xf0\xfd\xb7\x39\x52\x01\xc0\x42\x33\x0b\x87\x41\x70\x7b\x3b\xa3\xff\x69\xf4\xee\xe7\x1a\x7a\x56\xa4\x9a\x2a\xf6\x35\x2d\xe8\xbe\x9e\xe9\xc8\x49\xd7\x8a\x66\xae\xd0\x4f\x35\xf9\xf7\xa8\xcf\x5c\x77\xce\x12\x8d\x38\x88\x53\x46\x41\xe5\x20\xd9\xb9\x9b\x57\x3b\x0b\xfd\xbc\xe5\xdb\x41\x59\x76\xd6\x8b\x1d\xd7\x3b\xc2\xb8\x77\x80\x43\x11\x41\x99\x85\x72\x00\x3e\x0a\x93\xe0\x6b\xa5\x8e\x4d\x83\x1d\xdb\xa2\x28\x8b\x21\x13\x2d\x9c\x67\x43\x3b\x2e\x07\x2d\x6c\x0c\x66\x22\x62\x76\x67\x39\xb9\x56\xe1\xc5\x07\xc2\x80\xc4\xac\x22\x80\x81\x00\xfc\xae\x26\x73\xf1\x79\x36\x34\xc2\x67\xa8\xd4\xd0\x14\xc9\xed\xad\x27\xa4\x69\x14\xd2\x30\x87\x51\x3c\xca\x17\xb3\x61\x21\xe5\x0c\x46\x34\x95\xf3\x6c\xc8\x82\xa9\x48\x84\xd4\x68\x44\x09\x16\x06\x37\xd4\xae\xac\xef\xfd\x92\x0d\x0b\x0f\x44\xf9\xa4\xe8\x0f\x48\x6f\x8b\x1e\x4a\x63\x78\xed\xb1\x77\xe4\x8f\xf9\xcf\x0b\x94\xc4\x30\x0f\xfc\x1b\x0b\x5a\x70\x56\x02\x1e\xe9\x81\x0e\x92\xa2\x24\x9f\x10\x4e\x60\xdf\x23\xec\x70\x87\xa7\x82\x66\xa8\x2c\x7b\x06\x03\x27\x19\xbf\x96\x95\x1b\xe0\x1e\x8a\xff\x89\xf0\x54\x22\xac\x44\x7d\x51\x98\x74\x3d\x87\xc0\x54\x4c\xb3\x1c\xbf\x89\x05\x0e\x77\xfc\x51\x0f\xc0\xb3\xf2\xac\x2c\x41\x14\xe6\xda\x45\x52\xc8\x4d\xbd\x08\xb5\xc8\x9c\xa3\x70\x9b\xcb\x1d\xcc\xc3\x9b\x12\xe8\x1c\xd0\xa8\x86\x03\x9a\x13\x0e\x68\xc4\x39\xa0\xb9\xc9\x01\xe9\x3f\xc1\xdc\xe6\x80\xe6\xb5\x1c\xd0\xfc\xf6\x76\x6e\x73\x40\x73\x93\x03\x9a\x87\x8b\x36\x1c\x90\xee\xa4\x80\xfd\x08\x14\x00\x06\xb7\xb7\xb0\x0c\xc0\x3c\x00\xb1\xc6\x01\xcd\x2d\xfe\x64\xce\x39\x20\xe3\xfb\xb3\x79\xf5\xc4\xc6\x92\x03\x9a\x37\x73\x40\x36\x06\xf7\xa5\x43\xba\x38\x27\xc3\xe3\x1c\x50\x38\x07\x79\xb0\x43\xee\x37\x2d\x96\xb3\xf6\x2c\x64\x1b\x3e\x0b\xfb\x22\x8e\xad\xf1\x3c\xac\x07\xe0\xcb\xba\x17\xb4\xb0\x60\x6f\xd3\xe7\xb6\xcf\x21\x97\xf3\xd4\x05\x41\x05\xb9\x12\xb5\x24\x0f\x31\x0c\x6a\x16\xca\x98\xa6\x2a\x09\xc9\x3c\xc2\x53\x2f\x00\x6d\x9f\x5d\xd7\x53\x9b\x70\x66\x84\x52\x0b\x32\xa3\xd9\x4d\x91\xe5\x32\x51\x78\xdf\x23\xbf\xbc\x12\xd0\xaf\x84\x3e\x62\x84\x70\xdf\x8b\x61\x31\xf2\xca\x33\x05\x45\x6f\xe6\x01\xef\x1d\x0b\x3a\xa4\x97\xaa\xe6\x8c\xc5\x4a\xa4\x61\x34\x9e\x8a\xfc\x1a\x49\x6d\xfe\xc7\x44\xb2\x75\x39\x0d\x05\xb0\x7c\x99\xe2\x1c\xc1\xc2\x2e\x47\xc5\x2b\x44\xa6\xd5\xfc\x4a\x98\x19\x11\xfc\x84\x19\x35\xe3\x29\x79\x06\x7e\x85\x94\xf5\x3f\x49\xa2\x62\x6a\xbf\xcd\xa4\x8e\x78\x84\x61\xaf\xc0\x51\x8e\x0b\xd2\xc6\xf7\xf6\xbd\xe0\x19\xec\x7f\xa2\x59\x12\x3f\xb9\xae\x79\x17\x78\x7a\xeb\xa7\xe4\xba\x5f\x45\x7c\xe6\xa6\xf5\x8d\x03\x54\x00\x62\x03\xe5\xe3\x1b\xf0\x55\xbc\x01\xf7\x73\xff\x73\xb2\x69\x6d\xe6\xc0\x2d\x06\xd7\x25\xd8\xb2\x88\x95\x64\x97\x30\xcf\x51\x4c\x56\xad\x5b\xc9\x6a\xb0\x6e\x56\xb6\x19\xba\x46\x69\xb1\x4f\x0e\x3e\x01\xb8\x32\x61\x5b\x7d\x4c\xda\xab\x08\x8f\xa6\xd5\x1a\x33\x26\x16\xea\x8e\xf3\x6c\xd6\x8d\xe2\x68\x8e\x61\xde\x65\xda\xa1\x15\x81\x6b\xc9\xd2\xb0\xc7\xa1\x21\xc1\x1b\xb8\x00\x6f\xc1\x09\xf8\xb8\xa3\xb9\x1a\x3e\x20\x39\xfd\xd1\x9f\x24\xa7\x7f\xf1\x28\xa7\xff\x16\xe4\xf4\xcf\x43\x7f\xce\x6c\x22\x44\xfe\x32\xc6\xc9\x52\xa1\x61\xa1\x32\x76\x8b\xd2\x04\x15\xf8\x24\xcb\x69\xe4\x20\x96\x52\x2d\xd1\xa8\x19\xbf\x46\x29\x1a\xf0\x7c\x6a\x46\x66\x70\x86\xc8\x11\x19\x93\x5e\x8e\xbd\xff\x01\xa3\xd1\xb4\xc7\xc3\xb2\xb3\x24\x6b\x8e\xe6\x92\xe5\xeb\xf1\xfb\x52\x34\xe4\xc1\x12\x69\xbe\xb5\x51\x8f\x5e\x3d\x8c\xe3\x36\x32\x9a\x7b\x01\x58\x32\x0d\x40\x36\xa4\xf9\xa2\xd5\x0c\xa4\xf0\x5a\x33\x6b\x33\x2c\xaa\xbd\x00\x5c\x32\xb5\x85\xcb\x90\xc4\x4c\xdb\x26\xa6\x53\xe5\x47\xe6\x5f\x20\xf6\x3d\x03\x28\xf3\x30\x4f\x20\x86\x9e\x33\x5d\x1b\x57\x98\x0b\xa6\xf6\x28\x5b\x24\x71\xe7\x5d\x86\x3b\x27\x38\x9b\x77\x74\x1e\x37\xe6\x24\x08\xe1\xf4\xfd\x03\x10\xab\xd0\xc8\x10\x78\xb3\x28\x8d\x26\x50\x13\x73\x74\x12\x34\x86\xa3\xe5\x88\xc9\x64\xa9\x1e\xe1\x6a\xbd\xd1\xe5\x90\x12\x55\xfe\x7a\xdd\xfe\xc0\x5a\xdd\x6d\xcf\x3f\x9b\x74\xb4\xaf\x72\xad\xb1\x2f\x7e\x21\x41\x06\x2d\x48\xeb\x53\x33\xf1\x9c\xc8\x28\x77\x6a\xa6\xa9\x13\x79\xe2\x8e\xee\x84\x10\x3f\x72\x13\xe2\x7c\x43\x1f\x35\x10\xe2\xa2\x5b\xe4\x90\x9e\x66\xe4\x98\xaa\x5c\x75\xa7\x5a\x3b\x18\x9f\xb0\xe3\x2d\xb2\xd5\x49\xa8\xf3\x1c\xc2\xd9\x9c\xfa\xb9\xb3\x7b\xe6\xd4\x34\x28\xba\xb0\xa0\xd1\x73\xf5\x8e\x2a\x5b\xde\x56\xe7\x66\xae\x2f\xed\x89\x55\xce\x37\x8d\x5e\xe5\xa3\x66\x79\x44\x2f\x01\x79\x8d\x68\xa9\xec\x9a\xaf\x0d\x2f\xb8\xbd\x1d\x9c\xa9\x98\xa9\xfc\xfe\xe0\xde\x8a\xec\x86\xa8\x87\x5a\xbd\x4d\x6c\x78\x6c\x15\xca\x2c\x7d\x81\x8a\x19\x2a\x0a\xdf\xb1\xd5\x19\x77\xc2\x2f\x94\x7f\x8a\x19\x72\x4b\x0c\xcd\x5b\x86\x45\x8b\xa4\x61\x50\x53\xcc\x7c\x41\xe5\x0c\x4b\x5d\x0c\xe4\x31\x02\x55\x89\xae\x0f\x62\x29\x89\x8b\x0b\x46\x83\x73\xab\x9c\x28\x2d\x10\x81\x7f\x9a\xd1\x9c\x3b\x7e\x53\xba\x1d\x0f\xe0\xa0\x24\x7f\xb0\xe4\x7d\x9c\xfa\xa0\x11\xd6\xf5\xbc\x7d\x7e\x10\x3e\xd5\xf4\x3a\x02\xad\x07\x08\x5e\x80\xce\x82\xb2\x04\xe7\xe1\x0b\xff\xb3\x2b\xd7\xdd\x5d\x65\xb3\xb9\xb6\x11\x88\x6c\x7d\x77\x85\xe0\xbd\x8d\x40\x3f\x5a\xdb\xab\x73\x8e\x2b\xfd\x37\x4e\xe7\xf6\x29\xc3\x2f\x6c\x04\xc2\xea\x6a\xb8\x2d\x64\x0b\x2e\x67\x68\x06\xe3\xd5\x2a\x19\x47\xbb\x00\x7c\xd6\x15\x32\xf6\xa4\x88\xb3\x48\x73\xd9\xad\x05\x5e\x1d\x63\x13\xc3\x5b\x7b\x5e\xb4\x8b\x6c\xfb\x8c\x76\x16\x6c\xfb\x26\xf0\xc0\x60\xb9\xe6\x38\x2a\x20\xac\xf1\x9c\x38\x0e\x82\x71\xfb\x0e\x2e\xb7\x1d\xd4\x47\x1b\x85\xe3\x02\x1f\x5c\xdd\xf1\xd4\xa9\x6b\x65\x0d\xd3\x36\x37\x84\xe6\x3d\x26\x2f\xbc\xcd\x31\x29\x10\x16\xaa\xcf\xba\x52\xf1\xf9\xa6\xd2\x03\x76\x37\x37\x0b\x0f\xbe\x7c\x12\x1f\xf2\xd2\xd4\xa9\xc9\x94\x0e\x4a\xd9\xd9\x6a\xba\x1f\xa1\x8b\x61\x6f\x54\x54\x5c\xb0\x97\x58\x44\x39\x6f\xd2\xcb\xf4\xb4\xbc\xb3\xaa\xa5\x41\xd6\xcb\xb2\xb3\xb2\x4d\x24\x96\x56\xd3\xbf\xbd\x04\x9f\x43\x79\x78\x62\x7c\xd1\xf1\x47\x59\xfe\xb7\x2b\xcb\x17\x39\x6d\x2b\x42\xf9\x47\x51\xfe\xa3\x28\xff\xdb\x12\xe5\xd3\xeb\xb0\xa5\x3c\xbf\x51\x26\xdf\x28\x7a\xdf\x4c\x3e\xfe\x18\xca\xeb\x51\xfe\xfc\x60\xe4\xcf\x73\x9e\x81\x58\x7f\x47\xa9\xd1\x28\x45\x23\x53\x11\x7f\x19\x49\x24\xa3\x4a\x2d\x19\x64\xbe\xb6\x0c\x32\xba\x83\xd8\x64\xbc\xaf\x76\x88\x31\x3e\x3e\xd6\xd1\x85\x34\x33\x5e\x29\x8c\x2a\x69\x34\x88\xc8\xe9\x7f\xb5\x7d\xb2\x5c\x0b\xb2\xd1\xc9\xed\x73\x0a\x47\x6d\x3c\xc8\xb5\x1b\x7b\x3e\x4f\x50\x83\x21\x66\x45\xaf\xea\x22\x5f\x6d\x17\x23\xa7\xb2\xd5\xd6\xcb\xd2\x9f\x0e\x63\xce\x2c\x86\x45\x77\x9c\x89\x4b\xbb\x52\x21\xcd\xba\x09\x8c\x62\x58\x5b\x21\xc3\xb8\x0b\xaf\x47\xd3\x28\x9d\xc0\x76\x9a\xd1\xc6\x94\x9e\xea\x45\x38\x7f\x48\x2f\xc2\xf5\x9f\xa4\x09\x7d\x4c\x24\xfa\x4d\xbc\x44\x22\x91\xa8\xae\xcf\xe4\x97\x24\x77\x13\x72\x96\xcc\xdd\x25\x47\x34\x90\xec\xe0\x4c\x68\x50\x1b\x6b\x54\xf4\xa8\x95\x1a\xe3\x5a\xfc\xd3\xda\x92\x49\x45\xb1\x29\x4a\x96\xd6\x03\x85\xd6\x78\xa0\xce\x75\xc7\x9e\x89\xca\x22\x7a\x6e\x25\x4a\xbd\xb2\xbe\x73\xd1\xbf\x9d\x31\xd4\xe2\x73\x73\x38\x21\xcf\xae\xc7\xfe\x25\x3c\x6e\x96\xc2\x53\x34\x83\xa7\xa4\x79\xdf\xcb\x30\xa6\x0c\xee\xb5\x7c\x0f\x27\x9a\x69\x99\xf8\xaa\xb7\x61\xde\x46\xd7\xe6\xb3\xaa\x98\x4e\xfa\xe1\x04\xdb\x1e\xde\xf4\x73\x0f\x67\x27\x34\xad\xa4\xaf\xd5\xa5\x8b\xa2\x34\x48\x2c\x75\x28\xa7\x0f\x74\x4f\x7e\xe6\x82\xfe\xd7\x83\xbf\xb8\x20\xb3\x95\x45\xe9\x28\x59\x10\x68\xde\x5f\x0f\xfe\xe2\xa9\x26\x7f\x6d\xd7\xe4\xaf\xb2\xc9\x8f\x07\x07\x6d\x9a\xfc\x78\x70\x20\x9b\xbc\xcb\x7e\xa5\x4f\x8e\xab\x5d\x07\xa5\x05\x8e\xd2\x11\xcc\xc6\x1d\xa9\x2e\xe5\xed\xde\x9f\x9e\xbe\xe4\x2f\xd1\xaa\xa6\x32\x23\x6f\x89\xa7\x79\x76\x25\x1c\xe9\x95\xce\x8d\x6d\x21\x1a\xc3\xef\xd2\x0b\x9e\x39\xdc\x92\xf2\xec\x4a\x03\x5e\x06\x41\x5f\x79\x1e\x61\x58\x60\x94\x4e\x6e\x6f\x2b\xed\xc8\x26\xce\x12\xd8\xbb\x8a\xf2\xd4\xf7\x7e\x7b\xf7\xe1\xe5\xd1\xfb\xdf\x5f\x7e\x78\xfe\xf3\xaf\x2f\x3b\x2f\x3f\x7c\x78\xff\xa1\xef\x01\x7d\xa9\xa8\x1f\xd2\x65\xf8\xde\x5f\x56\x9c\x45\x26\x1e\x18\xe0\x3b\xd2\x25\x5d\xd9\x18\x64\xda\x9d\xbb\xc2\xf0\xd9\xc6\x20\xf4\x6d\x77\x85\xc0\x02\x2f\x0e\x0f\x73\xd6\x5a\x25\x42\x71\x37\x0d\xc0\xd2\x0c\xe0\x5f\xad\x76\xc4\xb2\x43\x0e\xe2\x4d\x70\xb0\xc6\xcd\x58\xe8\x39\x65\xfa\xbc\xb5\x10\xb0\x76\xab\x61\xff\x95\xa9\xf2\xd6\x86\xfd\xd7\x95\xb0\xc9\x91\xa6\xca\xbc\x35\x61\xd3\xab\x60\x05\x6c\x71\x45\xb4\xd3\xea\xd5\x35\x5e\x85\x45\xbb\x50\xda\xe9\xf7\x1a\xda\x37\xe3\x52\xb7\x10\xd3\xf1\xad\x85\x48\x6b\x6c\x61\x59\xea\xec\xc9\x71\x19\x04\x3b\x8d\xec\x09\x33\xf9\x59\x29\x48\xff\xa2\x0a\x82\x1a\xcf\x2e\xa7\x5f\x17\x0a\x77\x0f\x81\x8f\x43\x0f\x15\xaf\xb2\x7c\x88\xe2\x18\xa6\x5e\x80\x52\x1e\xae\x25\xb8\x1f\x7a\x7c\x3d\x15\x0e\x9f\x63\xfe\xef\x57\x35\xd5\x34\x7a\x34\xed\xd6\x26\x6a\xb3\x23\x3e\x20\x4d\x71\xc6\x80\xb1\x07\x95\xfb\x34\x29\xed\x19\x9f\x88\x9e\x98\x88\x4a\x0b\x14\x7b\xc1\xba\x0a\x32\x73\x76\x1b\xa4\xa0\x55\x43\xe3\xd5\x0a\xa3\x36\x0c\xb7\x62\xce\x5d\xd2\xd3\x24\x8b\xa3\x62\xda\xa3\xf9\x0e\x0a\x38\x62\x72\x80\x56\xe6\xcc\xa2\x08\x46\xf9\x68\x6a\x17\xae\x94\xc5\x56\xea\xfe\x31\xef\x16\x30\x67\x2f\xe8\x9d\x5a\x32\x83\x53\x70\x04\x5e\x80\xe7\xe0\x1d\x78\x09\x3e\x80\x57\xe0\x0d\xf8\x15\xfc\xac\xb8\xfa\xd7\x0f\x89\xab\xff\xe3\x4f\xe2\xea\x7f\x7f\xe4\xea\xbf\x05\xae\xfe\x1f\xdc\xbe\x59\x37\x1d\xe6\x2c\x79\xbd\x31\x32\xb5\x36\x18\x9c\x79\xd2\x1e\x52\x7d\xc8\xd2\x64\x79\xac\x3e\x0a\xe6\xdd\x80\x75\x89\x0a\x34\x4c\xf4\xf4\x5c\xac\x2d\x0b\x95\x89\xb2\x54\xfa\xac\xea\x1f\x7f\xc9\x86\xfa\x4f\x69\x69\x4c\x59\x7f\x2c\x0d\xb0\x45\xce\x74\x33\xf9\xd7\xd4\xac\x64\x58\x69\x4f\x1c\x65\xf4\x8a\xa3\xa5\xd4\xfc\x39\xee\xc5\x50\xde\x55\xf1\xff\x94\x3c\x79\xe0\x7b\x7f\xcc\x55\x6f\xb9\xd9\x73\x63\x6d\x32\x0c\x6e\x40\xdc\x58\x4f\x8e\xef\x73\x8b\xb5\x60\x26\xdd\x57\x51\xc1\xa7\x9e\xf6\xfc\xbc\xa6\x21\xbc\xa4\x6f\x1e\x6b\x83\x11\x55\x79\x5f\xd7\xd4\x8d\x73\x44\x8e\x90\x69\x33\xfe\xbe\xa6\xf2\x34\x2b\xf0\xef\x59\xb2\x98\xd9\x46\xe6\xc7\x35\x51\x05\xa1\xae\xa5\xe0\xb9\x3d\xa4\xf5\xf7\xcb\x04\x4d\xc8\x36\x11\x29\x9f\x65\xc1\x9b\x14\xca\x22\xae\xc6\xc0\x81\x9e\x92\x78\xa4\x49\x1c\x82\xdb\x5b\xae\xc8\x48\x33\xdc\x29\x20\xee\xb0\xc6\x28\x41\x78\xe9\xed\x68\xea\x00\xf5\x99\xd3\xc0\x90\x6a\x2b\x7a\x71\x4e\x4d\xd3\x2f\xea\x23\x23\x8a\x58\x88\x14\xce\x38\x89\x26\xcf\x8b\x17\x79\x84\x52\x69\x34\x50\x51\xc3\x30\x83\x54\x5a\x49\x58\xbd\x17\x9c\x40\xb9\xa2\x5f\x4f\x70\x36\x9f\xc3\xf8\x5d\x86\xd1\x58\x0a\xeb\x77\x0f\x9c\x6a\x9b\x0a\xc6\x83\x40\x26\x22\x37\x67\x03\x5a\xb3\x81\xb3\x79\x27\x26\xed\xf4\x89\x20\x5f\x29\x30\x3e\x0d\xd8\x98\x86\xb7\x8d\xd3\x50\x19\xe8\x38\xcb\x47\x90\x8d\xf3\xe6\xcd\x24\xcd\x72\x78\x42\x99\xfa\x5f\xb2\x61\xa1\x2f\x6b\xcc\x06\x9d\x47\x18\x4e\x96\x3d\x64\xd5\x2c\xb5\x71\xb7\x1a\x19\x45\x5b\x1d\x5a\x5c\x3b\xac\x93\x1a\x27\x07\xa4\xe6\x35\x00\x1f\xdb\xde\x8a\x75\x77\x96\x7e\x53\x9c\xae\x0d\x4c\x6f\xfd\xbb\xef\x1f\x59\x96\xfc\xa8\xd6\x92\x1f\x2c\xd6\xb2\xe9\xff\xc3\x2d\x7a\x64\x24\x24\x3e\x8e\x26\xb0\xef\xcd\xa3\x09\xa4\x16\x36\xf4\xa2\x3c\x85\xf9\xac\xef\xb1\xbf\x85\xdd\x4d\x5b\x6b\x1c\x70\x63\x3d\x19\x7d\xfd\x51\x21\xe5\xda\x0d\xdb\xd7\xe2\x3a\xd0\x92\x5f\xb2\x21\x0b\x9e\x40\x7f\xb1\x3b\xb3\x4f\x2d\x67\x16\x05\x15\x84\x8a\xc1\xb8\x8e\xa5\x1c\xe8\x5c\x7f\x70\x3c\xbd\x80\x2d\xa0\xf1\x49\x7a\xa3\x68\x5f\xb5\xb9\xf1\x80\x06\x99\x4c\xd3\x09\x21\x6f\xc1\xdf\xd4\x47\xcb\xe8\x68\x96\xc5\x68\xbc\xa4\x49\xf7\x3d\xb3\x92\x61\x7b\x74\xa0\xca\xec\x37\x96\x0e\xe6\xb5\xc3\xb7\xe1\x05\x17\x26\x5b\x65\x6c\x9d\xc0\x73\xab\x94\xd9\x56\x1b\x29\x38\xdf\xd9\x55\x1c\x2f\xf4\xcb\xba\x3a\x74\xee\x3e\xd4\x95\x8a\x69\x7c\xc5\x2b\x88\xc1\x55\xef\x61\x46\xf0\xfc\xa1\xb9\x4d\xe8\xd7\x93\x59\x1a\xd7\x96\xc8\xab\xd5\xba\x53\x0f\x1d\x55\x7e\xa3\xe1\xdf\x5b\x54\x74\x5f\xd3\x87\xfa\x70\xf9\x3b\xc6\xde\x1b\xf0\xc6\x9e\x0e\x31\x1a\x0f\xfc\x6a\x15\xa9\xab\xd3\x03\x3f\x6b\x8e\x1f\xec\x98\xd1\x04\xc2\x2a\xd3\xb3\x64\x6d\xb9\x1f\xcc\x19\xad\x5a\x25\xb4\x2c\xa6\xda\xda\x49\xec\x05\xd6\x8e\x9f\x7e\x45\x6b\x17\x13\x0b\x0f\x5b\x25\xb4\x64\x24\x95\xea\x3e\xe9\x43\xa0\x6f\x8c\x3e\x06\xd6\x4e\xb0\xa2\xab\xb0\xfe\x39\x28\x45\x86\xd6\xf7\xd3\xf0\xe9\xae\x0f\x79\x26\xa9\xbd\xbd\x5d\xa8\x04\xf9\xa9\x32\x94\xe5\xf7\x65\x40\x18\x85\x5d\x1f\xab\xea\xb8\x52\x7d\x9e\x44\x28\xa5\xa9\x5d\x58\xfd\x5d\x1f\xa9\xea\x48\xaf\xae\x7b\xa5\xd1\x1c\xfa\xcc\x3c\x4f\x4d\x9b\x4b\x74\x51\x93\xc4\xca\xa4\xd9\xd8\x02\xd3\x73\x48\xe3\xe3\xd9\x90\x34\x57\x1c\x46\xc5\x79\xca\xf3\x86\x51\x72\x8a\xe7\xd1\x60\xbd\x60\x54\x5c\x3d\x30\x4e\xe6\x79\x15\x3f\x1e\x05\xe3\xb5\x22\xee\x9c\xc3\xd3\x89\x3f\x0b\x08\x0f\xef\x5a\x39\x7d\x7e\x70\xb3\xab\x41\x50\x6f\x2d\x4f\x0f\x64\xde\xd9\xfc\xa3\x49\x27\x55\x08\x24\x50\x4f\x17\x39\x51\x31\x87\x20\x47\xe6\xa2\xd6\x4e\x41\x94\x50\x2c\x20\x56\xe7\xe8\x15\xdb\xa2\x06\x91\x56\xb9\xb3\x61\x50\xc6\x72\x04\x4b\xb3\x72\xe3\x45\xc4\xb0\xa9\x2b\xb0\x35\x51\x94\x2f\xd2\x95\x24\x11\x8d\xd4\xcc\xba\xa8\x65\x65\xa2\x3b\x5d\x5d\x36\x37\x17\x70\xd9\xf7\xe6\xe2\x69\xe2\x61\x90\x78\xe8\x38\xf2\x12\xd3\xf2\x9c\xc5\xbd\x96\xe5\x3c\x0e\xb6\x2c\x97\xce\x9c\xa2\xc2\x91\xf8\x20\x6a\x8c\x23\x44\xc3\x1a\xf2\xf2\x57\xec\xa7\x28\x4d\xb2\x42\x4a\xfa\xbc\x5f\xc9\x0f\x51\xb2\x48\x2f\xd2\xec\x4a\xc6\x32\xf2\x7e\xe3\xbf\xcb\x33\x7d\x7c\xbf\x54\x83\x54\x55\xaf\x2d\x80\x43\x9a\x53\xb7\x37\xce\xb3\x99\x9f\xc2\xab\xce\x09\xe4\xd9\xb1\xea\x4e\xb5\xef\xe3\xf0\x29\x0d\xbe\xcd\xaf\x8f\xdb\x5b\xed\x6e\xc2\x3d\x79\x2d\x05\x41\xd0\x9b\x45\x73\x72\x50\xcc\xbb\x87\x12\x85\xd1\x08\xcb\xd0\x58\x54\x83\x2d\x42\x4b\xbf\x4f\x47\x75\xe1\xa5\xe9\x8a\x72\xa2\x85\xf2\x97\x92\xbb\x0c\x7c\x4b\x13\x0b\xcc\x01\xff\x92\x0d\xc9\x3d\x16\x04\x00\xb3\xf4\x79\x81\xcc\x0d\xec\xd3\x49\x85\x22\x30\x54\x29\xee\x3b\x3e\x8d\x7a\x3c\x2e\x31\x99\xed\xa7\x8c\x8f\xdf\xb8\xaa\xb7\x1d\xbe\x46\x9b\x34\x4f\x02\x04\x35\xab\xce\xa7\x02\xb6\x99\x8a\x02\xe2\x57\xd1\x08\x62\xc5\xbe\x6b\x9e\x85\xa4\x47\xb0\xd2\x0b\x1c\x10\xde\xc3\x74\xc3\x92\x6f\x7a\x3b\x35\xdb\x51\x5d\xeb\x00\x1c\xe9\xca\x97\xdf\xcd\x9a\xd5\xf7\xb4\x9d\xe6\x6d\x15\x90\x66\xac\x2e\x91\x4c\x2b\xa5\xdc\x4a\x28\x16\xde\x17\xa1\x85\xd9\xf0\x46\x1c\x6f\xab\xdd\x7d\x5e\x03\x9e\xd3\xd3\x83\xe9\xb6\x08\xde\xd9\x08\x1c\x24\xf9\xf6\xde\x77\x2f\x2b\x58\x1c\x54\xfd\x60\xb9\x2d\x9a\x0f\xb5\x68\xe8\xfd\xb4\xbd\xc3\xdd\xab\x5a\x04\x82\xb7\xd8\xde\xdd\xce\xc2\xa0\x73\xa6\x60\xf0\x79\xcd\x1d\x3c\x37\xe4\xa2\x4d\x27\x46\x27\x01\x3d\x30\x38\x5f\xf7\x42\xd0\x9b\xb7\xc1\xc4\x09\x44\x0f\x0c\xae\x37\x42\x25\xda\xb7\xc1\xa5\x11\x92\x1e\x18\xbc\xdf\x08\x9f\x0e\xc3\xc2\xf9\xa6\xba\x2b\x4c\x16\x6c\x70\xbc\xed\xa6\xf8\xb5\x82\x42\x71\x71\x83\x8b\x6d\xa1\xff\x6c\x43\xd7\x19\xc1\xc1\xdb\x3b\xde\xd1\x75\xb4\xb9\x07\x06\x27\x6b\x2e\x4d\x2d\xa8\xe6\x5d\x61\xd2\xdf\x6b\xb9\x97\x36\xc1\x59\xb1\x15\xab\xf4\xfa\xe6\x98\x5d\xc0\x9a\xd1\x6b\x94\xff\xe6\x68\x75\x20\x2b\x47\xab\x8b\x4c\xb6\x18\xa7\x06\xa6\x19\xa5\x22\xb2\x3d\x30\xf8\xb8\x26\x22\xad\x71\x2b\x2c\xfa\xbb\x75\xba\x19\x2e\x5d\xb8\x6a\x60\x3c\xd2\xcd\x57\xfe\xb1\xae\xf2\x7f\x96\xa5\x08\x67\x75\xf9\xda\xea\x4d\x2c\xa4\x1a\x16\x3d\x34\xe7\x4f\x26\x94\x4e\x37\x72\xee\x40\x4e\xc9\xb3\x97\xc0\x4b\x98\x78\x67\xaa\x9c\x7d\x00\x1e\x4a\xc7\x99\x17\xe8\xd6\x19\x69\xeb\x05\xda\xc0\x2c\xa3\x95\x67\x44\xbd\x31\xc6\x7a\x86\x17\x5a\xca\xbe\x75\x0c\x30\xd6\x31\xaa\x68\x74\x82\x68\x67\x54\x01\x5e\x83\x3f\x76\xaa\x36\x03\x0f\xc1\xb0\xe2\x1f\x7f\x92\x61\xc5\x6f\x8f\x86\x15\xdf\x82\x61\xc5\x2f\xdc\x5d\x22\xe5\xa6\xc5\x81\x88\x66\x56\x08\x77\x09\x6c\x85\x94\x4b\xb9\x25\xee\xdc\x55\x18\x4d\x78\xd3\x19\x2b\xcd\x61\x14\xbf\x4f\x93\x65\xe0\x7b\x8b\x02\xe6\x27\x10\x63\x94\x4e\x8a\x9e\xd4\x38\x71\xc3\x8b\x45\x93\x8d\xc1\x11\xb9\xab\x85\x09\x45\x63\x4d\xe6\xd6\xce\xed\x28\x1a\x6b\xbe\x88\x70\x34\x82\x29\xa3\x81\x26\x2b\xab\xff\x0e\xf3\x42\x8b\x33\xd7\x5c\x97\x52\xfc\xc2\xca\x22\xd7\x75\xa7\xa9\x70\x05\xd1\xb8\x40\x31\xba\xab\x56\xb5\x8d\x7e\x7f\x6e\xd5\x44\xf5\xfd\xbc\x5d\x7d\xd1\xff\xeb\x35\xfa\x6f\xb1\xb5\xb0\xa6\xcf\x8e\x6e\xb9\x30\xbf\x77\x1b\xcb\xbc\xe3\x5b\xef\xb8\xc1\x4c\xe6\xa2\xd1\x4c\xe6\xad\x59\xca\xb7\xfa\x91\x7c\x20\x7b\x86\x39\x2c\x38\xb1\x94\xd7\xa9\xad\xbc\x36\x25\x75\x03\x0f\x49\xd5\x16\x0b\x03\x98\x15\x08\x43\xa9\x8a\x8d\xf5\x89\xb8\xe4\xe3\x3f\x0b\xc0\x7a\xc1\xec\x7e\xe7\xe4\x85\x7e\xa0\x64\xd0\x35\x59\x5a\x19\x9a\x07\x4e\xad\x2a\xec\x24\x83\x23\xeb\x33\x3f\xc3\x52\x2d\xfb\x8f\x2f\xac\x68\xe7\x07\xbe\xef\xd1\xb9\x57\x2a\x73\xd8\xe7\x39\x70\xe8\x17\xb5\xa9\xfa\x5e\xcc\xdb\xf1\x2d\xd5\x97\x73\xcb\xbe\xd2\x5d\xd5\xf7\x2e\xd9\xee\x2a\xcf\xd4\x90\x6c\x85\xf8\xef\x15\x85\xf8\x73\x6b\x12\x1a\xb5\xe2\xff\x68\xd0\x8a\xcb\x59\x9c\x8b\x03\xe3\xe9\x1f\xc5\xa1\x31\x3e\x1a\x07\xc7\x28\x51\x87\xc7\xfc\xcc\x86\x48\xbf\xfe\x6e\xab\xb2\x39\xde\x77\xd6\x72\xdb\xe7\xf6\x65\x5d\xb9\xde\x9b\x0f\x75\x95\x64\xc7\x5e\xd5\xd6\xe0\x7d\x7c\x63\x55\xd0\x85\xa0\xbf\xba\xcb\xb8\x04\xf3\x67\x1b\x34\x3d\xfb\xec\x72\x00\xaf\xad\x42\xfd\x40\x83\x3f\x56\x2a\xa8\xf5\x03\xac\x1d\x57\x43\x25\x43\x27\xb2\x85\x1e\x81\xdd\x96\x42\x77\x90\xc5\x90\x5f\xf5\xba\xee\xa0\x77\x85\xf0\x34\x5b\x60\xdf\xf3\x36\xd4\x23\xf0\x65\xa5\xaf\x92\xa9\x43\xc8\xea\x75\x08\xb4\xd1\x3a\xfa\x03\x6d\xf8\x74\x9f\xd8\x6a\x36\x49\xc2\xe8\xba\xb4\x37\xfa\x47\xa9\x70\x83\x51\xbc\x54\xea\x36\xfa\x4b\x94\xc5\xba\x3e\xec\x05\x55\x86\x01\x01\x5f\x58\xd3\x69\xd0\xe5\x27\xd9\x5e\x6a\x51\x05\x0c\xf1\x41\xd6\x40\xc5\x28\x4b\x53\x38\xc2\x9a\xca\xee\x85\xfe\xd1\x54\xbf\xa9\x4d\xbf\xee\x82\x6b\xbb\xe7\x0e\xb4\x45\xfa\xe1\x5b\x6f\xa9\x55\xcb\x0d\xd7\x9b\x1f\xe9\x75\xc7\x2f\xee\xe0\x3b\x18\xbc\xbc\x54\xd6\x1b\x39\x6f\xb6\xe9\xb0\xe9\x3d\x65\xeb\x5e\x8d\x21\x4e\x75\xf9\xae\xe4\x31\xa8\x68\x24\x7c\x4a\x03\x80\x8e\x22\xec\xe3\x1e\xce\xe8\x8c\xf9\x41\x10\x80\xc1\x59\xe0\xd6\xd6\x42\x5d\xcb\x48\x66\x6d\xc3\xb9\xe2\xd7\x6b\xf3\x54\xd9\x8a\x55\xd6\x6a\x5d\xdd\xaa\x41\x97\x55\xad\x6a\xd8\x33\x0e\x4d\x13\x1a\xa8\xdb\xd4\x68\x8f\x38\x02\xf6\xba\xf5\x53\x60\xf5\x4f\xe4\x4c\x06\x49\xa8\x19\xc6\xe8\x77\x43\x00\x32\xa3\x28\x56\x66\x91\x51\x88\xd5\x65\xab\x37\x51\x5f\x55\x6d\xc3\xbc\x87\xad\xb9\xa6\x36\xaf\xb3\xe8\xe1\xde\x38\xc6\x55\x4f\x2d\x7a\x22\x55\x3d\xaa\x54\xe7\x66\x80\xa2\xae\xdb\x9c\x87\xd7\x35\x2f\x15\x5a\x3f\x55\xf5\xd3\x4a\x7d\xed\x10\xd2\xca\xb9\x6e\x5a\xa4\xdb\xc2\x8c\x11\xa1\x66\x61\xf8\x34\x57\x30\x20\x35\x02\x08\x58\x5b\x7f\x37\xb9\xbd\xdd\x15\xfe\x46\xc5\x4b\x39\x7d\xd4\x06\x29\xa3\x00\x79\x99\xb2\x45\x15\xff\x6b\xa9\x7e\x5e\xd8\xea\xe7\x49\x86\x33\xb2\xb9\x9a\xcc\x5d\x6c\xe7\x28\x18\x94\x25\xf8\x18\xfe\xe6\x9f\xe8\xf2\x53\x93\x58\xbe\xb3\xc0\xb2\xa7\x36\x1e\x07\xd9\xbd\x7d\x06\xc4\x23\x1b\x4b\xaa\x5c\x69\xb7\x8c\xd3\x69\x43\x16\xc4\xff\xf6\x41\x71\x9f\xdb\xa0\x15\x51\xbd\x7d\x40\x5c\x0b\xb4\x69\x98\xa0\x58\xd6\xd5\x42\xf6\x5a\x30\x01\x38\xd1\xe5\xeb\xef\xec\xd1\xd8\x64\xf5\xf6\xa1\x78\x5f\xd6\xa2\xe0\x94\xf9\xf6\xa6\x01\x1f\x6a\x51\xe8\xf4\xc5\xf6\x16\x02\xaf\x6a\xf1\xc8\xa7\x7c\x7b\x03\x81\x37\xf5\x48\xf8\x1b\xb8\xbd\x75\x80\x85\x41\x67\x00\x98\x6d\xc0\x5a\xfb\xcb\x68\x6e\x6d\x30\x37\x26\xb1\xf2\x1b\x6f\x69\x03\x4e\x2b\x94\xc6\x4e\xb8\xda\x0c\x9d\x21\xa5\x6a\x81\x53\xed\x8a\x16\xc6\x0a\x4d\x00\xda\x61\x13\xdb\xa3\x85\xc1\x42\x43\xfb\x66\x5c\xa6\xcc\xaa\x95\xc5\x42\x43\x7b\x0b\xd7\xaf\xf6\xd6\x37\x2c\x88\xde\x6f\xaf\xdb\x77\x83\x17\x16\x44\x5b\x9b\x26\xbc\xae\x1c\x5d\x9d\x85\xdf\xde\x38\xe1\x0f\x1b\xbe\x21\x05\xd8\xde\x3a\xc1\x82\x2e\xc8\x14\x7a\x50\xdb\xea\xac\xdd\x10\xac\x85\x3e\xd1\xd5\xba\xbf\xac\xd6\x1a\x16\x68\x7f\x9e\x2c\x26\x28\x7d\x8c\x4c\x70\xaf\x91\x09\xd4\x3c\x37\x68\x68\x57\xa5\xfe\x6a\xe9\x59\x7f\x67\xaa\x57\x47\x9e\xaf\x06\xd5\x2b\x5b\x27\x19\x6e\xf5\x31\xfe\xdc\x63\xfc\xb9\x47\x85\x6a\xab\xf8\x73\x05\xd3\x9b\x29\x85\xaa\x76\x2b\x07\x60\xc1\xd4\xad\x42\x05\xc5\x0b\x6a\x55\x50\x5c\x3b\xdb\x42\x91\x1a\x9b\x80\xa9\x42\x56\xe8\x69\x53\xb7\xb2\x6c\xe6\x28\x53\xca\xb2\xa1\xa5\xfd\xca\x1d\xda\xaf\x44\xd7\x7e\x51\xff\x00\xea\xdd\xa5\x5d\x96\xaf\x61\x94\xe0\xe9\x92\x4c\x68\x96\x4b\x6b\x92\x18\x3a\x0b\xe6\x79\x76\x89\x62\xf2\x3c\x05\x9a\xb8\xaa\x8d\x56\xec\xdc\xa9\x15\x1b\x5b\xe1\xeb\x2a\xb3\xed\x81\xa9\x55\xc5\x20\x15\x26\xcd\x71\xee\xee\x49\x07\xa6\x45\xc6\xb3\x35\x54\xe7\x15\x0d\xd5\xd2\xea\xa2\xa5\xa1\x42\xb1\x67\x96\xd9\xa1\xe2\xcf\x1d\xfa\x17\x3b\x1a\xa0\x49\xff\xd9\x31\x01\x19\xf1\x76\x2c\xe8\x8e\xcf\x6d\x94\x2c\x4c\xc8\x3e\x5e\x7c\xfe\xbc\x3c\x69\xa8\x93\xe1\x8c\xc1\x65\x34\x0a\x55\xb7\x3a\xd3\x17\xb9\x04\x43\x05\xea\xf1\xf5\xe6\xff\x7a\x00\xf6\xf8\x1e\x0d\x00\xa6\xb9\x8d\xc6\xe1\x7b\x7f\xd8\x20\x28\xba\xab\x90\x6b\x53\x1b\x8f\x63\x27\x0e\x8a\x6d\xb1\x4c\x6c\x2c\x26\xdd\xbb\xd8\x16\xfe\xb2\x32\x0a\x25\xd3\xd9\x5a\xca\x65\x81\x36\x65\x3a\x68\x0d\x06\xb8\x16\x4c\x00\x86\x66\x60\x31\xa3\xa6\xbd\x19\xb7\xc1\x5a\x81\x65\xa1\xbe\xb4\x27\xd2\x60\xe0\xb6\x16\xeb\x5d\xd5\x80\x17\x0c\xdc\xd6\xc2\xbd\xcf\x36\x02\xeb\x0e\xd8\x5e\xc2\x67\xc1\x57\x37\x01\x5d\x96\xb6\x4c\x56\x1d\x0c\x6b\x39\x86\x76\xf0\xb7\xf6\xe4\xbf\xb8\x59\xbe\x22\x6e\x8b\xba\xf9\xb2\x5b\x73\x75\x70\x32\xa5\xb7\xe1\x37\x63\x1f\x96\x3c\x49\x07\x05\xb1\x23\xd4\xbc\xc2\x7f\x52\x2c\xb1\x88\x4d\xa6\x6e\x59\xef\xac\x04\xbc\x1a\x74\x14\xab\x4b\xf8\xac\x3c\xdb\x9c\xdf\x62\xff\xea\x19\x1d\xee\x2c\x17\xb3\x83\x21\x5b\x87\xf9\x6a\x93\x47\xb9\xad\xe1\xeb\x23\xf7\xf5\xc8\x7d\x3d\x72\x5f\x5b\x70\x5f\x2d\x18\xa6\x45\xc8\xcd\xf7\x6a\x4d\x39\x4f\x97\x73\x28\x78\xb0\xc6\x8a\x8c\x97\x51\x4c\x58\x25\x5e\xce\x8d\x76\x9d\xf5\x06\x67\x40\x58\x52\x96\x8a\x43\xd3\xda\x8c\xb2\xd9\x10\xa5\x86\x4b\x25\xb3\xba\x5c\x05\x4c\x53\x82\xd0\xbe\x6b\xbf\x65\x17\x67\x6c\x82\x9a\x23\x91\x0d\xcd\x4a\x06\xd7\x38\x5e\x95\x9c\xd7\xe6\x0b\x17\x34\x3e\xc0\x29\xa2\x56\x55\x53\xc6\xf6\x79\x67\xc1\x16\x7c\xdd\x74\x13\xbe\x6c\x4d\x2b\x44\x36\x61\x7d\xd9\x61\xfa\x91\xcc\x6a\xdf\x23\x54\xc3\x9a\x6c\x9a\xcd\x49\x5a\x6c\x9a\x36\x45\xcd\xec\x9a\x1c\xf1\x9c\x2f\xb0\xa7\x7f\xe3\x8b\x4c\xbf\x9e\xdb\x96\x77\xac\xc1\xd2\xe6\xde\xac\x0d\x52\xc7\xfc\x51\xd2\xd4\xcd\xfa\x19\x9e\xbf\x3a\xfb\xc7\x15\x26\x04\xb1\x6d\x30\xa6\xbf\xcf\x32\xb2\x82\xfc\x24\xcc\xb5\x52\x2a\x55\xe7\xe5\x54\x40\x6e\x9a\x67\xb1\x3e\xdb\xb0\x71\xbe\x50\xad\x5e\xab\xe5\xe3\xe1\x1a\x92\x02\x6a\x41\x17\xe4\xf2\x32\xc0\x8e\xa3\xe7\x0c\x24\xa2\x1f\x41\x69\xdf\x23\x4d\x7e\xb4\xcc\xc0\xf4\x6c\x2a\x0b\xa0\xf6\x41\x69\xe8\x56\xd3\xac\x67\xf8\x7e\xc4\x3c\x00\x0d\xb9\xee\x10\xa3\xd4\x1c\x7d\x16\x4f\xdb\xa1\x16\xe1\x61\x6f\x4f\x9f\x75\x52\x30\x38\x38\x7b\x86\x42\xf7\xa8\xfa\x56\x53\xba\x14\xbc\xd1\xde\x9e\x6f\x34\xa3\x83\x0c\x00\x69\xa1\x82\xd7\xb0\x65\x20\x9f\x28\x1a\x2d\x9a\x8c\x98\xf2\xa0\x6f\xb5\x60\x6b\xd3\xd4\x84\x9c\x81\x3e\x2a\x73\x58\x40\x72\xda\x50\x2a\x42\xb4\x90\x77\x64\x97\x4f\x87\x3a\x8c\x7a\x34\x16\xeb\x8c\xb6\xb4\x49\x89\x5c\x36\x29\x7a\x20\x16\x2e\x97\xc8\x5a\xcb\x25\xea\xe3\xb3\x70\x99\xc4\x34\x7c\xef\x8f\xbf\x80\xf1\xca\xc4\xc6\xa3\x71\xf3\x5b\x8b\x22\x96\x36\x70\xeb\x1a\xda\x5e\x18\x71\x59\x8b\x41\xdc\x64\x77\x21\x93\x18\x3b\x14\xc0\x7c\x04\xe9\x1a\xd2\x81\x5a\x30\x01\x18\x9b\x32\x09\x57\x4d\x39\xa0\x6d\x51\x4a\x22\xa0\x09\xa9\xe3\x3a\x69\x17\xb6\x7f\x25\x94\x66\xbc\xee\x00\x1c\x2d\xc2\x8c\xac\x84\x62\xe1\xbd\xb2\x77\x8e\x21\x7d\xd9\x5a\x74\xf1\xb9\xb2\x31\x1d\xf1\x31\xb6\x36\x17\xb2\x70\x6c\xe1\x9f\xde\x04\xc7\x9a\xb9\xf1\xb6\x82\x92\xb6\xd9\x16\xdb\xe6\x9f\x05\x89\x62\x84\xb3\x47\x1e\xef\x5b\xe0\xf1\x22\x57\xce\xde\x2a\x51\xc6\x42\xfb\x1a\x74\x75\x5e\xd3\x8c\xd1\x68\x8e\x06\x99\xef\x27\xb5\x59\x00\x55\xd0\x39\x45\xb8\xae\xa6\x15\x45\xd0\x39\x1d\x8f\x33\x1a\xde\x3b\x23\x43\x51\xa7\x42\x52\xae\x02\x74\x17\xf1\xe2\xac\xf0\x4f\xf6\x60\xc9\x2d\xb3\xfa\x7a\x49\x9a\x61\x90\x93\xa6\xdd\x30\x99\xab\xbe\x30\x0c\xca\x37\xc2\x26\x4c\xa8\x9a\xf0\x54\xae\xcf\xf6\x32\xe6\x26\x38\x16\xd2\x44\xbf\x3e\xa3\x56\xd7\xe7\xa5\x8c\x41\xf3\xf5\x08\x98\xff\x1d\xcd\x79\xf8\x3c\xdf\x8b\x39\x8f\x9d\x86\xf2\xcb\xd9\xf7\x7c\x89\xc0\x0b\xea\x01\x7e\xfb\x90\x24\xd1\x27\x7f\x92\x24\xfa\xe3\x23\x95\xf2\x2d\x50\x29\xa7\x32\x0f\xa5\x61\x07\x74\x29\xc3\x81\x59\xe6\x3a\xbc\xa0\xd6\x0e\x68\xde\xda\x0e\x68\x56\xa1\x72\xcc\xc8\xe1\x9c\x88\x10\x5f\xf4\xe4\x95\x0e\xda\xe8\xd2\xc8\x94\x30\x8f\x72\xea\x64\xc3\x93\xde\xf5\x6e\x34\x30\x4c\x8a\x53\x8a\x40\x0d\xda\xd0\x58\x24\x46\x15\x09\x6d\xda\x60\x92\x34\x69\x34\x49\xb2\x52\x5e\xfa\x89\x43\xf4\x9c\x55\x1c\xf2\xb9\xf7\x1c\xbf\x2f\xef\xc2\x36\x29\x5a\xcb\x36\xe9\xad\x95\x54\x53\x48\x58\xdf\x3a\x65\xdb\x57\x56\x69\x65\x67\xa8\xf4\x9b\x6f\x5d\x36\x4b\xe7\xbc\xf0\xe4\x8b\xfb\xed\xbb\x03\xe0\x9f\xa9\xae\xd8\x62\xf2\xb7\x15\x31\xf9\xb5\xd5\x79\x97\x35\xd3\x49\x83\x78\x5c\x94\x69\x06\x18\x2f\x53\xb2\xf0\x31\x73\xc3\x7f\xeb\x10\x6a\xbf\xb7\x66\xd3\x34\x96\x38\xb6\x4a\x19\x4d\x29\x43\x03\x5e\xac\xb4\x76\xd2\x22\x9d\x37\xd8\x3b\x69\xb5\xec\x58\x5f\x85\xed\x84\x5a\x39\xc1\x96\xa3\x26\x2d\x12\xde\x9a\xf4\x47\xa9\xfc\x49\x3b\xb0\xb7\x48\x8b\x29\x1a\x63\x56\xdb\xfb\x5e\x0a\xc3\x9f\x27\x49\xc7\xff\x3e\xf0\xe8\x9d\xc6\xbd\x51\x2f\xe0\xd2\x0b\x34\xbf\x42\x82\x5f\x5b\xe9\x80\x26\xee\xcc\x37\x8b\x7b\xeb\x7d\xef\x31\xd7\x5c\x3d\x0c\x7c\x53\xf4\x6e\x7e\x14\x9e\x55\x3f\x29\x17\xe3\xfe\xe0\x6c\x1b\x77\x43\xee\xf6\x2b\xc4\xba\xc5\x5a\xe6\x66\xa2\x33\x3c\xd4\x04\x80\x22\x3d\xdb\x3f\x11\x9e\x6a\xb1\xdb\x84\xa4\xf7\x32\xfc\x78\xcf\xb9\x44\xaf\x6c\x0c\xf7\x64\xdf\xf6\xd9\xc6\xe3\xb8\xb5\xb6\x17\xc7\x9e\xdb\x58\x4c\xfb\xb6\xad\xed\xa6\xae\x6d\xf8\x9a\x44\x7c\x6b\x9b\x29\x7b\xa9\x37\xb6\x34\xab\x05\x63\xa5\xb4\xb4\x10\x6e\x69\xdf\xd6\x0c\xab\x19\x75\xe5\x46\xdb\x20\x93\x6a\x15\x46\x33\x4e\x8b\xea\x58\x3f\xbd\x6a\x85\x6c\x31\xb3\x92\xda\x5b\xe5\x6e\x83\x38\x1f\xd7\x80\xbf\xb3\x20\xce\x17\x95\xab\xc7\x7c\xd7\xb6\xf7\xcf\xb4\xe0\xab\xcb\x75\x2d\xe9\x4a\x1d\x8c\xa6\xf4\xad\xa7\x6b\x71\xfc\xe2\xb2\xde\xda\x88\xcc\x62\xb5\x29\xa5\x0a\x8b\x7d\x4a\x7f\x75\xe7\x8c\x00\x73\xb2\xdc\x9c\x0f\x64\x7c\xb7\x62\xa7\x17\x7f\x12\x87\x3a\x7a\xe4\x50\xbf\x05\x0e\x35\x0e\xfd\xa4\xc6\x5a\x89\x70\x99\xcf\x2b\x89\xfb\xcc\x60\x57\x59\x4d\x5b\xb2\x24\x70\x55\xe3\xa8\x56\xaa\x5e\x23\x5b\x04\xa9\x53\xba\xc8\x08\x62\x80\x43\x49\x39\xa5\xec\x8b\x8f\xc2\x22\xf8\x4a\x65\x50\x60\xe1\xe6\xcc\xd8\x45\x54\xcb\x44\x2d\x0c\x7e\x50\x27\xa3\xf9\xdc\xf1\x44\x38\x97\x22\x70\x4d\x6b\xd3\x5f\xc1\x57\xb0\x96\xb6\xc5\xaf\x7c\x12\x34\x93\x5e\x29\x95\xa6\xc4\xff\x1f\xf3\x9f\x17\x28\x89\x61\x1e\xf8\x95\x41\x40\x2b\xcb\x11\x4f\xb6\x78\x7b\x2b\x7b\x5d\x06\x9a\xdd\x30\x63\x5d\xaa\x98\x34\x92\x9a\xdb\x29\xdf\x15\xea\x33\x4d\xe7\xf2\xc1\xdc\xf7\x4e\x1e\xc4\x3e\x1b\x42\x0f\x63\x6c\x70\xa7\x46\xe7\x9f\xd6\xc9\x70\x82\xaf\x1c\x9f\x95\xf0\xef\x44\xd1\x03\x8a\x70\xe4\x47\x4e\x56\xe4\xae\xcc\x4d\x6c\xf8\xae\x19\xf7\xc0\x20\x59\x4d\x13\xb4\x80\x13\x80\x48\x27\x0f\x9c\xb8\xed\xf5\xf0\xc0\x20\xdb\x08\x79\x05\x50\x33\xf6\x2d\x54\xf5\x4d\x70\x2c\xa4\x91\x4e\x11\xc5\x2b\x29\x22\x48\xee\x31\xd6\xfd\x06\x1d\x48\x34\x9f\x27\x32\xf4\x7e\xbb\xf8\xd2\x93\x04\xcd\x66\x30\xdf\xc7\x79\x34\xba\xa0\x72\x9a\x5a\xb5\x88\x22\xad\x58\x46\x70\x1a\xee\x71\x34\x8d\x58\x17\xd8\xb7\x45\x61\xab\x3d\x66\xd1\x68\x8a\x52\x68\x0c\x61\x4b\xd5\xc6\x8e\x6d\xaf\xfe\x30\x54\x1a\xef\xff\x24\x82\xf1\xf8\x91\x60\xfc\x16\x08\xc6\x8b\xd0\x1f\x59\x74\x1b\x5a\x23\x6c\xfe\xb5\x4a\x26\x99\x43\x0f\xc4\x96\x41\xb4\x29\x98\x9a\xdb\xe6\xd2\xf2\x2a\xf0\xc0\x8c\x97\xbd\x77\xc7\xe1\x4f\xe1\x35\x3e\xcd\x2e\x20\xb9\xa1\xb8\xc0\xf9\xe5\x65\x94\x78\xba\x34\x47\x04\x5d\x6b\x48\xdb\xca\x8c\xbc\x85\x80\xe5\x14\xe6\x33\xaf\x6a\xf0\xcd\x00\x0f\xad\x0e\x31\x13\x34\xda\x19\x81\xc7\x12\x7c\x72\xd8\x3c\x17\x09\x8c\x7f\x5e\xd6\x62\x52\x9d\x1e\x5b\x73\xa2\x0d\xd4\xb6\x87\x9f\xe7\xf0\x12\x65\x8b\x82\x16\x17\x0e\xeb\x73\xde\x2d\xdb\x79\xd8\xe8\xd0\xa5\x6d\x64\xaf\x0f\xe1\xca\x6e\x49\x47\xf4\xd9\xc6\xa3\x86\x24\xf4\x12\xe5\xc7\x02\xc5\x70\x18\xe5\x6f\x8a\xf7\x73\xa8\x5c\xd4\x76\x77\x75\xe3\x5d\x32\xb1\x65\x54\x2c\xd3\x51\x27\xc9\xa2\xf8\xa5\xbc\xda\x99\x64\x96\x1a\x3f\x83\x1b\x75\xe3\xf7\xd3\x32\xc4\xe2\xca\x41\x21\xb3\x06\x4e\xf7\xf6\xd2\x1e\x8a\x9f\x91\xff\xeb\xdb\xd0\x79\x04\x44\xb2\x19\x69\xf4\xbb\x0f\x70\x94\xe5\xb1\xef\x29\x98\x1e\x40\xe0\x26\x87\x04\x3f\xb9\x05\xa3\x38\x9a\x63\x98\xbf\xe7\x39\x47\x49\x49\x84\x21\x29\x2a\xcb\x80\xf7\x75\x1a\xa5\x71\x02\x55\x6f\xa9\xe0\x98\x0b\x93\xc9\x6d\x5c\xe0\x28\x1d\xc1\x6c\xdc\x79\x9b\x2d\x0a\x48\x53\x1f\xdd\xde\x1a\x05\xff\x09\x97\xc3\x2c\xca\x59\x5a\xa4\xbd\x3d\xdf\x7b\x49\xc3\x28\x51\x3b\xe9\x51\x16\xc3\xdb\x5b\xef\x84\xae\x80\xfc\x12\x04\xc2\xca\x59\x9e\x91\x5e\x01\xd3\xd8\xf7\x7e\x7d\xff\xfc\xc5\xc7\x97\xbf\x3f\xff\xf5\xb7\xe7\xa7\x6f\xde\xbf\xf3\x8c\x09\x83\x65\x50\xa6\x34\x2d\x0b\xe9\xee\xd1\x34\x4a\x27\x34\xce\x5e\x02\x31\xb9\xe0\xe1\xdf\x8d\xc0\x93\xba\x4c\x9f\x31\x58\x9a\x60\xdf\xc6\x7b\xf4\xfa\xf9\xbb\x7f\xbc\xa4\x98\x4d\x9c\xb8\x0c\xca\x20\x28\x99\xc9\x92\x9a\x25\x25\xa6\x87\x34\x23\x25\x5f\x61\xbd\x25\x22\xcb\x6b\x2f\x61\x88\x7a\x28\x2e\x73\x38\xcb\x2e\xe1\x91\xfa\xec\x04\xca\xc9\x62\xbd\x35\xa5\x4b\x29\x79\x3e\xcd\x16\x49\xfc\x02\x51\xd2\xe2\x1d\xbc\xc6\x82\xf3\xe4\x1b\x6a\xd7\x67\xfb\x29\xf4\x0d\x05\xcc\x0c\xe2\x28\xd0\xae\x7f\xb8\xb7\x07\x7b\xf2\x50\x06\x55\xd0\xc7\x39\xbc\x54\xfb\x1d\xf3\x2c\xb6\xda\x41\x15\x3a\x54\x4d\x0b\xa4\x06\x54\x38\x13\x5c\x92\x9e\x69\xfa\x1b\xe9\xe6\x30\x4c\xb2\xd1\x85\x16\xe3\xf6\x67\xfe\x5b\x94\xaf\xca\x8b\xb9\x6d\xde\x4b\x96\x3b\x5e\x2b\x3f\x12\x1f\x4c\x0f\x8e\x53\x75\xe3\xb4\x1c\xd9\x79\x36\xec\xe6\x70\x82\x0a\xac\xf9\x8e\xfc\x92\x0d\x3b\x1f\xc4\x47\xbd\x66\x0c\x9d\x75\x5f\xa8\xcf\x6a\x46\x72\x94\xc5\x68\xd4\x3d\xcf\x86\xda\xb4\xb0\x8f\x9d\x5f\x58\xf6\x6e\xe9\x95\xd2\x65\x39\x4a\x75\xdf\x94\x0e\xcb\x7e\x65\xd4\x62\x5b\xdd\xac\xc6\xd2\xa5\xca\x7a\x94\x15\xeb\x16\x98\x50\xc2\x6a\xb8\x9c\xaa\xef\x9c\x90\xef\xa2\xaa\x38\x8d\x6a\x56\x4f\xe4\x17\x19\x5f\x39\x4b\x12\x94\x4e\x6c\xcc\x1f\xd8\x67\x1b\x79\x0c\xe7\x49\xb6\x24\x2f\x74\xf7\x2a\xc2\xa3\xa9\x36\x4d\x2f\x64\x51\xe7\x9f\xbc\xc8\x5c\xfa\xee\x38\x4b\x92\xec\xaa\xbb\x98\x5b\x9b\xa0\xf3\x8a\x16\x74\x7e\x53\x3d\x9f\x45\xd7\x5d\x15\x7b\xb9\x8b\xd1\x0c\x66\x0b\x95\x18\xf5\x6d\x74\xdd\x51\x51\x98\x3b\xa7\xbc\x58\x6f\x3d\x4f\xa2\xb4\x1b\x61\x0c\x67\x73\xc2\x0e\x68\x0d\x8f\x93\x28\xed\x3c\x17\x25\xe6\xb4\x92\x9e\x2e\x72\xe8\x9a\xd9\x57\xbc\x48\x34\xf8\x63\x01\x17\x30\xee\xd2\x76\x0a\xc1\xff\xa4\x5f\x3b\x3a\x77\x27\x37\x8c\xcc\xa6\xa5\xb6\x8b\xfa\xa4\x6f\xc2\x62\x14\x25\xfa\x61\x23\x3b\xf0\x84\x50\x7e\xf4\xc4\xb5\xd4\xfa\xb2\xa7\x6a\x0e\xe1\xc5\xf3\x24\x31\x92\x91\xde\x87\xfe\x77\x85\xff\x56\xdd\xe1\x14\x51\x58\xc5\xa1\x67\x3f\xd5\x91\xe8\x58\x15\xde\x65\x1d\x51\x87\x4d\xc3\x34\x2a\x58\x6e\xb2\xe2\x39\xe1\x35\x61\x6c\x49\x49\x38\x6d\x65\x47\x5b\xa6\xf4\xc6\x00\x9f\xed\xed\x19\x64\xca\x6e\x18\x92\x47\x94\x91\xfb\x30\x08\xc0\xee\x21\xbb\x97\xf9\x3b\xc0\x51\x69\x53\x3d\x38\xdb\x19\x67\xb9\xcf\x53\x15\x77\xb2\xb1\x81\x56\xd4\x43\xa1\x81\x26\xa4\x68\xbc\xef\xe9\x1f\xac\x23\x3b\xb2\x43\xbb\x88\xbc\x0b\xf3\x45\x31\xf5\x6f\x06\xf8\xac\xcf\x0b\xca\xa0\x14\x0b\x42\x7b\x94\x66\x6f\xc9\x29\x3b\x65\xcf\x0f\x21\x70\x60\xe8\x79\x3b\x22\x67\xf2\x0d\x23\xd9\xfa\x9e\xc8\x26\x61\x10\xae\x1a\x61\x86\xa9\x87\x22\x73\x51\xd1\xc8\xb9\xbe\x27\x6f\xda\x0e\x21\xee\x74\x8b\x0f\xa6\x55\xea\x50\x32\xad\xdc\x41\x63\xa6\xe5\xaf\xac\x44\x40\x26\x86\xb9\x9d\x1d\xfc\x1d\xfd\xa4\xbf\xa7\xbc\x22\x7f\xbf\xfe\x8e\x9e\x3c\x11\x33\x95\x86\x8e\x7a\x03\x74\x06\x06\xf9\x59\x68\xf2\x86\x20\x09\xf1\x20\x3f\x03\x59\x98\x0e\xf2\x33\xd2\x8f\x43\x3e\x9f\x6e\x34\x01\x9b\xbf\x4f\xdf\xdd\x24\x65\xbf\xf3\xdd\x4d\x56\xf6\x3e\x91\x56\xe4\x2d\x46\x7b\x7b\x68\xb7\xa9\x71\xf7\x90\xee\x0b\x19\xa5\xfb\x13\xe8\x28\x38\x9f\x82\x00\x10\x76\x0b\x59\x75\xcc\x1a\xa8\xb1\x77\xdd\xc3\x40\x1e\x38\x17\x8e\xde\x27\x6d\x03\x64\xa9\x22\xc0\x18\x5d\xc0\xa9\xfe\x90\x94\x51\x92\x44\x96\x18\x14\x43\x38\xe8\xf5\x7a\x8e\xef\x8c\xba\x95\xc4\xc8\x99\xf5\x9b\x82\xe5\xe4\x88\x71\xc9\x58\xf4\xc8\x3c\x9b\xfb\xc1\xce\x1a\x78\x1d\x88\x72\x38\xce\x61\x31\xe5\x3e\x7a\x62\xce\x64\x8d\xbd\x3d\xfd\x33\xdb\xe5\xcf\x68\x96\x16\x26\x05\x83\x79\x40\xf7\x63\xd0\x4b\xb2\xec\x62\x31\xf7\xbd\x3c\x5b\x60\xd8\xd7\xa4\x3d\x3d\x24\xa5\xa2\x1c\x55\x9f\x6d\xe1\x8f\xd4\x4f\x90\xf5\xcc\x17\x49\xd7\x29\x06\x4a\xfc\x01\x73\xaa\xe9\x2f\xa7\x55\x1d\x75\x16\x74\x1a\x93\x38\x30\x0c\xe0\x59\x88\x4b\x9c\x4d\x26\x09\xf4\xeb\xab\xf5\x18\x69\xf8\x3e\x4d\x96\x2f\x50\x31\x4f\xa2\x25\xbb\x08\x09\xc1\x57\x84\xbb\x2b\xab\x94\x26\xcc\x1b\x6b\xde\xb5\xf1\x59\x0b\x77\x56\x96\x20\x0e\x8f\xfd\x91\x21\xc8\x64\x4c\xf9\x20\xbb\x23\x61\xef\xdc\x46\x60\xd9\x9d\xdc\x15\x9e\x59\x75\x20\x4a\x50\x30\xa0\xcb\xb9\x31\x0a\x29\x00\x12\x2f\x10\x75\x07\x5d\x14\xf0\x2d\x93\x38\x06\xfe\x42\x9a\x01\xd2\x20\xf2\x47\x14\x8d\x7f\xc3\xe5\x98\x45\xff\xc6\xe4\x5d\x19\x0f\x6a\x7e\x2b\x01\xe7\xab\xfa\x37\xcd\x6c\x11\x6b\xdc\x5c\x07\xb4\xe2\x85\x18\xa4\x56\x55\x4b\x30\x59\x44\x79\x5c\xf4\x6f\x0c\xa6\x9d\x41\x30\x19\x79\xc2\x04\x97\x01\x18\xda\x0b\x62\x48\x4a\x06\x79\x8f\xca\x81\xe1\xe6\xa6\x3a\x95\x55\xe9\xd0\xad\x50\x06\xc0\x42\x6c\x76\x6f\x2d\x31\x7b\x13\x9c\x00\x8c\x74\x31\xbb\x85\xd4\x5c\xdc\xcd\x91\x5a\x70\x9a\x91\x3a\xa5\x0e\x9b\xe3\x76\x83\x6b\xee\x82\x2d\x49\xd8\x1c\x7b\x05\x52\x33\xe2\xe6\x03\xb1\x79\x37\x56\xc0\x6d\xee\x54\xab\xb3\xb5\x79\xdf\xda\x81\xb7\xba\x38\xb6\x0f\xa6\x66\xdb\x76\x1f\xa7\xb2\xfe\x35\x2d\x69\x3c\x3c\x7b\x03\x29\x61\xe6\xbd\x5e\x12\x93\xca\x34\x58\xa2\xd2\xfb\xc0\x4e\xde\xdc\x00\x2c\x5d\x6f\xd5\xe2\x9e\x50\xca\x01\x5f\xda\x58\x0d\x19\xef\xbd\xa2\xbe\xb2\x51\x1b\x12\xe4\xfb\x40\xed\x7d\xef\x95\xd4\x1a\xd5\x1e\x33\xf3\xd8\xbf\xcf\xc1\x9e\x57\x56\x57\x93\x7d\x7f\xc9\x77\x4f\xf0\x12\x9b\xdf\x2f\x12\x42\xf3\x2d\xc7\x18\x93\x6d\xd0\xd0\xf6\xab\x90\x10\x36\x65\x1b\x24\xb4\xfd\xaa\xfb\x9a\xf2\x0d\xdb\xdc\xc8\x0c\x40\x33\x1a\x83\x89\xd8\x1c\x99\x09\xa6\x19\x25\x63\x43\x36\xc7\xc5\xdb\x37\x23\xd1\x39\x91\x2d\xe8\x2c\x1d\x8a\x85\x70\xa4\x1b\x33\x5c\xac\x36\x66\xb8\x86\xa3\x76\x3e\x9c\x6d\x72\x63\x37\x44\x05\x64\x96\x9e\xb0\x18\x45\x73\xd8\xc5\x51\x71\xd1\xe5\xb9\x03\x6b\x6c\x41\x49\xc7\xba\xa3\x6c\x36\x8b\xd2\xb8\x0b\x63\x84\xb3\xbc\x7b\x8d\x61\x3e\xeb\x72\xed\xd2\x8a\xa6\x45\x36\xba\x80\x78\x55\x93\x39\x9b\x69\x04\x8b\xfd\x24\x1b\x45\x49\x97\x70\x77\xd1\x64\x85\xc3\x27\xd3\x79\xd4\x06\x1c\x64\x0e\x9f\x3b\x55\xa5\xff\x43\xb0\x8c\xb8\xf8\x93\x2c\x23\xde\x3e\x5a\x46\xfc\xbb\x5b\x46\x30\xf1\xd9\x49\xe8\xfd\x97\xc1\x5f\xfe\xf6\xf7\x1f\xfe\x7e\xf8\xd7\x1f\xfe\x7e\xf8\xe3\xc1\xdf\x0f\xff\xdb\x5f\x66\x1e\xb5\x9b\xf8\x18\xfa\x34\xd4\xa0\x4a\xf3\xcb\xaf\xad\x97\xd7\x70\x74\xc4\x2e\x03\x0f\x78\xfb\x43\x94\xee\x0f\x23\xf6\x8a\xd4\x18\xd7\x46\x15\xbb\x5a\x26\x4f\xe7\x42\x61\xee\x55\x9a\x33\xe7\xad\xc0\x17\x5a\xbe\xe7\x69\xfc\x61\x91\xa6\xe4\x2f\xdd\xdc\xcd\x23\x37\xd6\x3f\xf2\x6c\x31\x17\x0e\xa6\x79\x6f\x91\xa2\x3f\x5c\x0d\x4f\x45\xd5\x42\x85\x10\x2c\xb2\x9c\x8c\x85\x34\x59\xc0\xe3\x86\x16\x1a\xa6\x93\x2c\xc7\x2c\x21\x9f\x15\x62\xb0\x32\x40\xe5\x48\xaa\x4d\x83\x3e\x01\x37\x83\x33\xc0\x26\x01\x15\xcf\x47\x18\x5d\xc2\xd2\x03\x5a\x8d\x93\x69\x96\x63\x1a\x8e\x9e\x60\x7f\xc7\x2e\x66\xd9\x11\xfe\x5b\x37\x84\xd4\x7e\x30\xa5\xb6\x98\x64\xea\xe6\x0a\x50\xc1\x47\x56\x52\x1f\xd6\xcd\x2d\x61\x8e\xa5\x2b\x21\xb9\xcd\x35\xf3\x8c\x63\xcb\x51\x74\x69\x7d\xc7\x8c\x41\x12\x86\x19\x17\x6e\x03\x18\x6d\x48\x67\xaa\xed\x48\x6c\xb4\x2b\xab\x35\xeb\x05\x93\x91\xec\x1e\xaa\x06\x4d\x5b\x40\x1a\x7a\x88\xca\x2d\xf6\xc0\xb9\x85\xb7\xb2\x25\x80\xf0\x82\xd4\x67\x28\xc7\x30\xd6\xa1\x5c\x5b\x88\x8d\x38\xc0\xef\x35\x67\xcc\xa6\xad\xef\xb4\xbc\xd5\xb7\x96\x48\xf6\x08\xc3\xa7\x52\x53\x4e\xc3\xe1\xe9\xc7\xed\xf6\xd6\xcb\x19\xe8\x6a\x19\xcb\x79\xf8\xdb\x9c\x90\xff\x28\x8d\x12\x65\x97\xcb\x3f\x84\x29\xbc\xea\x40\xff\x66\x9c\xa5\xf8\x55\x34\x43\xc9\xb2\xef\xcd\xb2\x34\xe3\xcc\x11\xf9\xfc\x4f\x88\x26\x53\xdc\xf7\xfe\x7a\x70\xe0\x11\x6e\x0a\xa5\x71\x76\xd5\x23\x74\x80\x80\x1a\x1a\x20\x81\xf1\x8b\x59\x12\xfb\x27\x81\xeb\x73\x92\xfa\xde\x09\x0d\x97\xd6\x89\x3a\x64\x21\x3a\x38\xeb\x14\x38\xca\x71\x67\x99\x2d\xf2\x4e\x01\x8b\x82\x9c\x02\x6e\x52\x4e\x6a\x88\xb4\xbf\x68\xec\x33\xe1\xb4\x36\x5f\x5c\xd3\xb1\x7b\x48\xef\x3b\x28\x35\x8d\xa1\x55\x91\x9f\xc8\x67\x76\x7b\x6a\x80\xf3\xf3\xd2\xf7\x0a\x71\x64\xdd\x0d\x83\xbe\xb3\x25\x5d\x27\x28\x8e\xac\x0a\x1a\x28\xae\x05\xa6\x21\x55\xb9\x55\x2d\x77\x56\x71\x3b\x04\x41\x00\xe0\x33\x0d\x8e\x84\x4c\x9a\x09\x0d\x85\xaa\x2d\xe8\x0c\x42\xb5\x46\xc5\xc5\xb1\xa4\xba\xb8\x19\xcd\x4d\xa5\xff\x7d\x0c\x44\xf3\x3e\x02\xc6\x55\xd4\x4f\xcb\x10\xee\x08\x07\x55\x0d\xd6\xba\x50\xc4\x7a\x8b\x25\xdb\xdb\xf3\xd7\xdb\x17\x5e\x00\xf0\xed\xad\xab\x11\x29\x7d\xbb\x48\x30\x9a\x27\x50\xda\x2c\x15\x42\x47\xca\xf6\x51\x94\xc3\x0e\x3f\x15\xbd\xce\xe9\x14\x76\x54\xf7\x3b\x43\x98\x64\x57\x9d\xab\xa8\xe8\xb0\x50\x7d\x30\xee\x0c\x97\x9d\x3c\x4a\xe3\x6c\xd6\x89\xf3\xe8\xaa\xe7\x35\xf4\xaa\xb6\xe8\x68\x51\xe0\x6c\x86\x3e\x43\xb6\x77\xf9\x45\x07\x3a\x78\x0a\xd3\xce\x14\xe1\xce\xff\xf9\xdf\xff\x2f\xdb\x91\xff\xe7\x7f\xff\x7f\x64\xa3\xe7\x8b\xb4\x11\x93\xf3\x20\x7d\xfa\xae\x43\x1f\x6d\x36\xa0\x0e\x39\x86\x9d\x2e\xea\x74\x71\x87\x12\xfe\x9d\xef\x6e\xcc\xb0\xb7\x28\x28\x3b\xdf\xdd\x98\x6b\xd1\xd3\x1f\x18\xb6\x98\x65\xe7\x93\x1b\x9f\xf7\x5f\x06\x07\xb3\x9a\xbe\x60\x1e\xf5\x93\x8c\x93\xd7\xe0\xbf\x5e\x52\x9e\xe2\x39\xe3\x0c\xb8\x5d\x98\xab\xa8\x17\xc3\x02\xe7\xd9\xd2\x6f\x68\x4e\xaf\x28\x19\x4d\xc1\x77\xdc\x35\xd9\x1c\xa6\xcf\xd3\xf8\x88\x99\x6d\x9c\xd0\x87\xa4\x37\x24\xe7\x86\x5d\xd2\x46\x3f\x83\xd2\x55\x5d\x5d\x8c\x62\x92\x9e\xf9\x58\xba\x8b\x1b\x6f\xd3\x81\x50\x9c\xd1\x68\x9e\xe2\x39\x83\xe2\x2b\xad\x1a\x6a\x7f\x17\x84\xf1\x3c\x15\x60\x39\x3a\x13\x17\x69\x4d\x46\x19\x35\x8d\x92\x41\xe3\x0b\x41\x5e\xe0\x5e\x01\x47\x39\xc4\x01\xbf\x8e\x2a\x5b\xe8\x13\x37\x83\xc1\x59\x87\x0c\xb9\x13\x75\x18\x88\xce\x10\x8e\xa2\x45\x01\x3b\x7c\xc3\x18\xf7\x49\xd9\x41\x45\x27\xcd\x70\x27\xa2\x77\x56\xef\x53\x50\x96\x60\x12\xbe\xf5\xa7\xa6\xc3\x01\x27\x19\xee\xcc\x73\x7b\x59\x41\x71\xd7\x3e\xe8\x97\x36\x06\x4e\xc6\xdc\xa1\x93\xbb\x85\x40\x6e\x8e\xed\xa3\x8c\x5a\x90\x9b\x09\xea\xc1\x68\xb5\xcc\xa3\x3d\xb8\x00\x4c\x75\x19\xc8\x67\x7b\x94\x8d\x04\xda\xf6\xce\xf0\xe7\x36\xbe\x16\x34\xde\xf6\x5e\xf2\xd7\xd5\x1d\x6f\x93\x80\x77\x90\x5c\xc4\x46\x12\xdd\x6d\x6c\x4e\x7b\xbf\x8b\xeb\x86\x79\x86\xaf\xb5\x43\x54\x5b\x6b\x3b\xd8\xd3\x64\x13\x21\x6b\x09\xe2\x56\x80\xb2\x50\x4f\x75\x69\xdc\xc7\x95\xd2\xb8\xf3\x6c\xf8\x75\xc5\xaf\x5b\x2b\x38\x1c\xe9\xfd\xfa\x51\xe1\x56\x25\x75\xac\x11\x35\x2a\x97\xa8\x24\x8b\xa3\x62\xda\x43\x29\x86\x79\xc1\xc2\x1a\x37\xc4\x8a\x6b\x1d\x23\xee\xde\xa2\xc0\x81\xb7\xe0\x04\x7c\x04\xa7\xe0\x08\xbc\x00\xcf\x95\x98\xf0\xdd\x43\x12\x13\xbe\xfc\x93\xc4\x84\x1f\x1e\xc5\x84\xff\xee\x62\x42\xc2\x18\xbf\xe2\x31\xe1\x50\xeb\x74\x8e\x8b\x16\xd9\x49\xe6\x2b\x2b\x4a\xe9\xe0\x6c\x65\x55\x23\x73\xf7\x70\x65\xf5\xe3\x1c\x8e\xd1\xb5\x90\xd4\xe5\xba\xa4\xce\x99\x5a\x5e\x04\x55\xf9\x25\x1b\xf2\xb8\x73\xd3\xfa\x86\x1c\xb8\xa3\xd1\xa4\xd2\xa8\x4d\x88\xbb\x65\xa5\x15\xab\x47\x6e\x78\x33\xbe\x1d\xa1\x59\xed\xba\x56\x27\x1a\x32\xad\x08\x0b\xdd\x9a\x29\xb0\xc7\x47\xe8\x57\xba\x29\xec\x8c\x2c\x04\x95\x47\xe8\x3e\xa3\xd4\x88\x96\x77\xee\x28\x53\xd1\xf2\xae\xad\x68\x79\xa9\x1d\x2d\x4f\xb2\x3d\x9a\x6c\xba\x4d\x40\xbb\x77\x96\x9c\x52\x44\x50\x7b\xe7\xf4\xe5\x13\x11\xd4\x5e\xba\xa2\xd5\xed\x1e\xaa\x82\x2f\x17\xa9\x4e\x4f\xe3\x42\x7e\x9f\x70\xe3\x6a\x6e\x91\x41\xbf\xa9\x45\xeb\x7b\x31\x6f\xc7\x96\x8c\x9a\xfe\x93\xa5\x6b\x8e\x7a\xf7\xb2\x26\xea\xdd\xbb\x8a\x67\xdf\x85\x35\x43\x56\xd4\x3b\x33\x76\xc6\xcb\xba\xf0\x77\x07\xaa\xac\x2e\xfc\xdd\x4b\x47\xf6\x18\xf5\x4d\x6e\x5c\xe3\xab\xb1\x79\x8d\x12\x79\x40\x3d\x6d\x4b\x98\xa7\xe2\xad\xb5\x33\x2a\x87\xe4\xa4\xae\x82\x8e\xf6\x63\x5d\x25\xd1\x83\x53\xab\x82\x1e\x8c\xe9\xc8\x5d\xc6\x23\x29\xbd\xb0\x41\xd3\xa3\x45\x8f\x1e\x78\x5e\xd9\xb8\x27\xd3\xec\x0a\xa5\x13\xe5\x1a\xf3\x02\xe2\x08\x25\x85\x27\x1d\x0b\x6a\x33\x9e\x82\x8d\x03\x01\xba\xd2\xe7\x0c\x23\x4c\x7a\x2f\x9c\xbb\xe8\x2f\xe9\x97\x22\x4c\xc0\xc8\x85\xad\x5c\x53\x8c\xaf\xb6\xd3\x53\xc5\xe1\x49\xf9\x1c\x09\x02\x57\x78\x1c\xf1\xdf\xb2\x9c\xdf\x01\xa2\x98\xfd\xd4\x4a\xcd\xae\xb2\xf2\x0e\xef\xb1\x31\x4e\xa7\x7f\xdb\x4a\x47\x35\x21\x82\x97\x8e\x4e\xfc\xb7\xf2\x70\x8a\x62\xcd\xa7\x29\xb2\x1d\xd0\xd4\x3e\xd3\x6c\xe1\x53\x78\xd5\x39\x11\xd2\x22\xfd\xe6\xe7\x72\xe4\x58\x36\x2a\xbc\xc0\xf6\x45\x91\xf6\xfe\x38\x08\xc0\xe0\x2c\x08\x00\x0e\x69\xfa\x9f\xde\x38\xcf\x66\x3e\x0c\x54\xb0\xc2\x1d\x69\x58\x9c\xac\x11\x42\x51\x3f\x1a\x76\x1c\x43\x33\x00\x2a\x16\x12\xb3\xca\xa1\x0a\x02\x1a\x7a\x11\x53\x25\x9e\x5f\x71\x21\x12\xde\x43\x65\x10\x18\xa9\x9c\xd8\x81\xd3\x66\x6a\xbf\x37\xe8\xf6\x3e\x9e\xed\x03\x2e\x7a\x73\x4c\x16\x17\xba\xcb\x59\x22\xe4\x5f\xf8\xf4\x06\x8d\x7d\xd8\xc3\xb0\xc0\x3e\x0a\x14\x3c\xd4\x9b\x91\xad\xe1\xef\xfb\xbd\x27\xcf\x02\x06\x3b\x18\x1c\x9e\xed\x60\x6a\x57\x3f\x80\x67\xcf\xc8\xff\x3d\x39\xec\x1f\x0a\xf7\x09\x5c\x06\xe0\xa6\x0c\x00\x32\xfc\x49\xb0\x3e\x26\x76\x5f\xf7\x09\x37\xb1\x48\x71\x1f\x33\x4a\x39\xd0\xf5\x3c\x64\xd5\x16\x29\x7e\x7a\x18\x04\x20\xa5\xdd\xa0\x9d\xe7\x37\xfd\x86\x2b\x25\xee\xa7\xe6\x55\x4a\xad\x55\x62\xad\xf8\x0a\x21\x19\x01\x46\x74\xa5\xe2\xee\xc5\x0a\xf8\x92\x7d\xfa\xee\x46\x7c\x29\x3b\x3e\xf9\x41\xc7\x55\x06\x9f\xec\xb5\x7c\x40\x01\x46\xd7\x99\xf3\x55\x01\x46\xc9\xd6\x74\x29\x00\xb9\xb4\x5c\xd1\x84\xcf\xac\xdf\xea\xd8\xea\xfb\x66\x17\xf6\x50\xf1\x0e\x5e\x05\xf6\x57\x1a\x7c\x88\x11\x94\x34\x03\x04\x25\x2c\x03\x1a\x9f\x54\xcf\x01\xc6\xbb\xb3\x22\xf9\x17\x27\x50\x30\x70\x1c\xe5\x3e\x02\xd6\xd6\xa1\xde\xf0\x53\x24\xb3\x80\x55\x4e\xa6\xe8\x69\x2e\xce\xa1\x48\xc1\x45\x46\x23\x96\x22\x67\x43\x88\x99\xeb\x09\xe3\x36\x02\xa5\xea\x43\x63\x5f\xa5\xee\xda\xc5\x95\x76\x9c\x96\xb2\x9a\x20\xd5\x44\xc0\x37\xee\x52\xa9\x75\x43\x0a\x20\x0c\x74\x20\x6c\xa7\x26\x61\xae\xc2\x3b\xc9\xe3\xb9\xeb\xa7\x0a\x7e\xaa\x80\x25\x3d\xaa\xdc\x2c\xfe\x89\xf0\x94\x81\x2b\x83\xb6\x19\xc0\x2a\x61\x62\x4b\xf0\x3e\xfc\xe0\x5f\xdf\xab\xcc\xfc\xd8\xc6\x70\x4f\x71\x5b\x2f\x6c\x3c\x77\x99\xd1\xdb\x9e\x24\x23\xf6\x68\xbe\x46\xec\xd1\x5a\x30\x01\xb8\xd6\x05\x93\x16\x42\x47\xc4\xd3\x8d\xb1\x3a\x22\x9e\x1a\xa8\xdf\x56\xb6\x84\x95\xef\x6c\x6b\x79\xfc\x49\x2d\x06\x41\x4b\xdf\x41\x8c\xda\x5a\x1c\x3a\xcd\xb1\xbd\x00\xfe\xb4\x16\x8f\x78\x31\xb7\x17\xc2\x5b\x18\xcc\xdc\x6d\x1b\xef\x03\x33\x77\x5b\xd3\xee\x33\xa8\xda\x3b\x40\x29\xa5\x38\x2d\x90\x1a\xab\xd5\x42\xe5\xb0\x02\x46\x2b\x9c\x72\xe5\xa6\x9b\xe1\x93\xe2\x90\x16\xb8\x8c\x48\xc2\x93\xcd\xf0\x19\x91\x84\x9b\x70\x6a\x0f\xa7\x07\x06\xcb\x35\xb1\xe9\xad\x57\x5c\x57\xba\xdc\x07\x0c\x2e\xd7\xbd\xa1\x4c\xb1\x91\x81\xe9\xc8\x3e\x6f\x46\xb4\xe2\xab\x6d\x8f\xda\x8b\x1a\xf0\x22\x5a\xf1\xe7\x6d\x11\x3c\xaf\xdc\x17\x1a\x9b\x3e\x38\xdf\x5a\xe9\xa8\x2b\xb4\x5e\xb5\x53\x09\xd1\x28\x21\x6b\x2a\xb5\xa4\xc0\x1f\x7d\x59\x45\xc3\x5d\x29\xd3\xd2\x95\x01\x5b\x9d\x29\xa0\xdc\xe2\xbd\xf3\x6c\x58\x2b\x3a\x13\x4d\xf4\x3a\x95\x40\xa7\xe7\xd9\xd0\x19\xe5\x54\x53\xef\xa5\xad\xd7\x72\xdf\x54\x01\x57\xd7\xf5\xeb\xd6\xeb\xf1\xc2\x2b\x84\xa7\x5d\x39\x95\x5d\xea\x51\xc1\x6c\x2b\xbf\x90\x0a\x70\xa7\x9a\xe7\xe8\x21\x28\xfe\x4e\xff\x24\xc5\xdf\xd1\xa3\xe2\xef\x5b\x50\xfc\xbd\xe0\x8a\x3f\x6c\x5a\xbb\xab\x2c\x50\x8d\x86\xfe\x54\x79\x35\x6f\x34\x85\x37\x15\x52\x55\x05\x14\x8f\xb1\xa3\x73\x25\x9a\xe9\xff\xcc\xec\x9b\x3b\x83\xee\xd0\xac\x64\xa8\xa1\xc6\x8e\x32\xa5\x86\x9a\xb6\x57\x50\x4e\x56\x56\xe5\x23\xe1\xda\xbc\x66\xfd\xa8\x36\xc4\xcb\x76\xf3\x5c\x9d\x32\xae\x9d\x5b\xab\xa9\x8e\xf8\xb3\xa5\x83\x43\xb6\x0e\x4e\xca\x01\xc1\xa6\xda\xb8\xd3\x2f\xae\x3e\x73\xa9\xcb\xd8\x7c\xc9\x08\x50\x4c\xcd\x26\x26\xa2\xaf\xb9\x9a\x90\xf7\xfd\xd4\xa9\x73\x52\x5f\xe5\x7e\x35\xbe\xaa\x79\x35\x0a\x6c\xfd\xda\x69\x45\xbf\xf6\xc3\x8f\xea\x6b\xa3\x6e\xed\xb4\x41\xb7\xf6\x51\xd1\x24\xca\x99\xe1\xa3\x43\xe1\x74\xed\x2e\xe3\xc4\xf0\x7b\xab\xd4\x91\x1c\xfa\xd8\xae\x62\x1f\xec\x8b\xba\x0a\x62\xde\xde\xd6\x55\xd0\xa6\xf0\x64\x65\xe6\x2a\x69\x8d\xef\xa5\x2e\xe7\x19\x26\xc7\x8c\x6a\xdd\x2a\xa8\x78\xce\xe1\xd6\x73\x7b\x6b\x89\x40\x4d\xcf\x0c\x4b\x12\xca\xf7\x9a\x26\x0b\xe5\x3b\x4d\x93\x85\xaa\x7d\x86\x1c\x82\x4f\x97\x63\x47\x1a\x3e\xdd\xad\x11\x7b\xa6\x96\x23\xc7\xde\x9e\xbf\x5b\x23\xe9\x4c\xb9\x08\x32\x8b\xa1\xb0\xe7\xf6\x02\xd2\x62\x57\x97\x73\x22\xbd\x81\x31\x85\x01\x95\x44\xde\x49\x04\x77\x4d\xae\xaf\x60\xdd\x8f\x46\x6d\xdb\xd0\x90\x49\x56\xa8\x00\x70\xbf\x92\x1f\xa2\x64\x91\x5e\xa4\xd9\x95\x0a\xa7\xf7\x1b\xff\x6d\x6a\xec\xd8\xfa\xeb\x4a\x0b\x4d\xbb\x66\x68\xee\xaa\x17\xb5\x50\x49\x59\x2b\xe6\xd2\xc8\xad\x93\xd4\x4c\x9c\x3b\x87\x9e\x47\x73\x09\x80\x96\x9e\x87\xb5\xe2\x7a\x1e\xb8\xa6\x26\x4e\x59\xc4\x6e\x33\x11\xe6\x89\xbe\x83\x99\xd0\x2e\x98\xf5\x26\x43\x36\x5c\x67\x3e\x36\x96\xe0\x9f\x87\x47\xfe\x67\x5d\xa0\xc0\xd8\xf9\xad\x45\xde\x16\x54\x53\xe4\x9d\xae\x21\x01\xac\x05\x13\x80\xcf\x86\x64\xc7\xac\x69\x72\xb1\xeb\xe2\x31\xbd\x2f\x9b\xf0\xb8\x68\x44\x2a\x7f\x5e\x0b\x9f\x9b\xd2\x34\xf0\x5e\xdb\x0b\x65\x48\xae\xee\xc0\x12\xdc\x0d\x5e\x48\xae\xb6\x96\x42\x1f\xdb\x08\x1c\xef\xfd\xf6\xe9\xc2\x2e\x2a\x58\x2a\xba\x81\xad\x33\x86\xbd\xad\xc5\x21\x6e\xbf\xed\x73\x86\x9d\xd4\xe2\xd0\xee\x95\xc1\xf2\x8e\x4f\xe9\x16\x09\x39\x9a\xe0\x34\x9f\x20\xf3\x31\x6b\x27\xef\x6d\x02\xd0\x0a\x9b\xe1\x46\x71\xb5\x19\x42\xc3\x13\xdc\xc0\xf9\x59\x17\xa3\xbe\x68\x2f\x7a\x1b\xc9\x39\x68\x97\x82\x6d\x5d\xe9\xda\xea\x38\x1e\xdb\xa6\x5e\x5f\x5b\xfc\xa6\x85\xe8\x38\xcf\x86\x5d\x36\x03\x5d\x99\x2d\xa0\x49\x58\x57\x71\x3d\x58\x21\xbd\x03\x23\x10\x33\xe1\xd2\x1a\x06\xfc\xe0\xdd\x8e\x6d\x15\xff\x30\x24\x79\x1f\xfe\x24\x49\xde\xab\x47\x49\xde\xb7\x20\xc9\x7b\x13\xfa\x54\x12\x37\x6a\x6f\x6f\xdf\x58\xb5\x6a\x6f\xdf\x58\x9d\x5d\xf6\x47\x49\x54\xc8\xf0\x18\x49\x45\xa6\x28\xe5\x6d\x22\xd8\x48\x94\x24\xef\xb2\x18\x92\x8b\x85\x90\xb9\x5c\xcc\x96\x54\x04\x7e\xac\x12\x17\xad\x25\x6e\x51\xdf\xa5\xa3\x4c\x89\xfa\xae\x2a\x59\xe4\x59\x60\x59\x69\xc5\x6e\xca\x2f\xb5\x5e\x1d\x69\x3c\x77\x6f\xb8\x24\x25\xca\xbe\x5d\x6b\x95\xaa\x26\x86\x54\xa1\x16\xc8\x06\x86\xf9\xe6\x2c\x5f\x57\xc7\xe4\x6c\x9e\xf2\xd9\x7b\x5f\x5f\x5f\x07\xac\x1a\x1c\x5b\x22\x42\xdc\x2a\xa9\x3d\x17\xc9\x9c\x67\x43\x3e\x2c\x3d\x2d\xfd\x9a\x12\xc4\x97\x66\x6a\x1e\x21\x5e\xfa\xb0\xb5\x60\xb1\xbd\x65\xbd\x36\x35\x42\x86\x48\x67\x65\x5d\xf1\xe4\x99\xd6\x6d\x43\xb8\xf8\xa1\xd6\xa0\xfd\x83\x25\x76\x14\xeb\xa3\x15\xd9\x22\xc6\x0f\x4e\x11\xe3\x07\xb7\x88\x51\x2d\x91\x59\xc5\xce\x5d\xff\xb2\x4e\xdc\xf7\xd6\x76\x0f\x70\xed\xbf\x93\xba\x4a\xc6\xa0\x3e\x5a\xb5\x28\xdb\x7b\x5a\xfd\xa8\x9f\x24\x65\x42\xff\xd2\x21\xed\x7c\xe1\x2e\xe3\x0c\x94\x6d\x42\xcf\xb8\x1f\x49\xf4\xbe\xd3\x64\x90\xe2\x3e\xb0\xa4\x88\x76\xda\x03\x7a\x31\xf0\x88\xf9\xd5\xda\x02\x88\x6e\x8b\x49\x0b\xdc\xb7\xc3\x00\xf6\x50\x7c\x16\x34\xa6\xef\xcf\x62\x52\x89\x9f\xd7\x9e\x6e\xc4\xaf\x5f\x9b\x6d\x04\x97\xda\xbe\xc7\xb6\x38\x93\xed\x7c\x97\xf8\x32\x35\xc6\xd3\x20\xb8\x6c\x1a\x67\xca\xc6\xd9\x28\xcb\x8c\x35\xe3\xf0\x26\x11\x26\xe9\x10\xed\x2e\x15\x5f\x4a\xf9\xcc\x8d\x48\x55\x20\xfa\xe1\x14\xbc\xe2\xf0\x29\xd6\xa4\xa6\x28\xf6\x82\x30\x24\xff\x4a\xfb\xe1\x1b\x52\xd0\x87\x40\x1e\x9b\xfe\xca\x05\x04\x1a\xa6\x3e\x06\xa3\x1c\x46\x18\x9e\xa2\x19\xec\xff\xea\xe3\x00\x30\x19\x3f\xfd\xfd\xb3\x8f\x83\xb2\x34\x25\x69\xbf\x08\x44\xb6\xa0\x94\x65\x04\xb1\x52\x81\x68\xc9\x2c\xf0\x49\x25\x1f\xcb\xbb\x0c\x77\xaa\x39\x59\xa8\xf1\xa9\x2e\x52\x3d\x11\x1f\xee\x4e\xe6\x1a\xc3\x49\x1e\xc5\x50\xf7\x75\xe0\x1f\xbe\x8c\x54\xd6\xe9\x47\x51\x27\x8f\x64\x7b\xba\xe2\x4c\x51\x27\x80\x4c\x37\x77\x8e\x18\x59\x12\xc8\xbc\x5e\x02\x59\x71\x8e\x58\x57\x24\xab\x9d\xe4\x75\xe7\x40\x9e\xa9\xbb\x98\x02\xe3\xc6\x5f\x6f\x0e\xb4\xa6\x6b\x4d\x42\x86\x33\xd6\xb4\x49\x7d\xc1\xf9\xfc\x9e\xc8\x01\x03\xdb\x0a\x70\x47\x55\x01\xee\x45\xf8\xca\x3f\x36\x83\x29\xb3\x0c\x06\xf1\x1d\x59\x46\xbf\xad\x20\xb8\x7b\x73\xdb\x93\x5a\x1c\x77\x6b\x6e\xfb\xb1\x16\x8f\xb1\x55\xb6\x97\x76\x9e\xda\x88\x98\x58\x7d\x6b\xf9\xe6\x91\x03\xae\x49\xa2\x6c\x2f\xdf\x7c\x61\xe3\x30\x24\xcd\x5b\x8b\x36\x9f\xd7\x80\x17\x92\xe6\xad\x85\x9a\xef\x2a\x8b\x6c\xd2\x5a\x83\xcb\x6d\x31\x58\xf0\x15\x03\xd7\x46\x94\xe8\x6e\x1a\x80\x63\x5d\x82\x68\x61\xe0\xcc\xde\xe0\xf3\x9a\xe0\xd3\x16\xb0\x4d\xd5\x0c\x5a\x43\x35\x53\x0b\xa6\x19\xa1\xc9\x65\x53\xab\xd5\xb5\x30\xd9\x5c\x7a\x13\x2e\x9b\xb2\xd9\x66\x84\x15\x58\xad\x50\x1b\x17\xd8\xf5\x66\x28\x0d\xe1\x48\x0b\x9c\xe6\x65\xf6\x7e\x33\xa4\x26\xf3\xdf\x84\x55\x3d\x7a\x74\x7a\xdb\xaa\x0c\xea\x60\x58\xc8\x8e\x03\x25\x81\xfd\x95\x47\x14\xec\x60\x2a\xce\xd2\x32\x94\xa1\x4e\x36\xee\xc0\xc0\xdf\xc5\xb7\xb7\xa8\xa7\x08\xdf\x9f\x30\xa1\xf5\x71\xa8\x7f\x93\x0e\x7a\x58\x89\x2d\x7f\x6e\x09\x59\x91\xd0\x4f\x25\x64\xf5\x4d\x83\xac\xa4\x66\x6f\xda\x2b\x00\x68\x2d\xc4\x95\x2f\x2b\x74\x00\x6b\xc8\xdc\x57\x59\xee\x36\x0a\xd0\xb9\x14\x57\x49\xd1\xd5\x72\xc4\x0f\x49\x20\x3e\x7f\x14\x4c\x7f\x0b\x82\xe9\x59\xe8\x27\xcc\x50\xd1\x0c\xa8\xcc\x04\xbe\x99\xab\x48\x3b\x75\x01\x88\x56\x09\x21\x51\xad\x44\x91\xa6\xca\x25\x13\xbf\xe3\x92\x2d\xc6\xba\xa4\xa9\xe0\xe2\x20\xf1\x51\x3f\xf8\x0b\xab\x8c\xa6\x79\xcb\x3d\x30\xe2\xdf\x51\xb8\x7b\x08\x7c\x1c\x7a\xa8\x78\x19\x23\x16\x44\x1a\xa5\x3c\x25\x6f\x70\x3f\x1a\x9e\x12\xc6\x08\x8b\xe4\x6a\xe7\xd9\x90\x71\x58\x1f\x53\x78\xf5\x42\xeb\xf9\x2f\x27\xef\xdf\xf5\x0a\x9c\xa3\x74\x82\xc6\x4b\xc6\xdd\xa9\x91\x01\x9a\x8a\xed\x87\x40\x8f\x5e\xa9\x86\x00\x76\x0f\x82\x32\x4b\x59\x76\x5c\x5f\x63\x7c\x8c\x3a\x87\xa4\xce\xc9\x62\x38\x53\xbd\x61\xd3\x63\xb0\x59\xbe\x47\xdd\x94\xe9\x4c\xcb\x1e\xa3\xf8\x9f\x08\x4f\x95\x3f\x75\x59\x82\x22\x9c\xfb\x51\x95\x4a\x4f\xb6\xa5\x0f\x17\x36\x5c\xe3\x5e\xcf\xb6\x05\x3f\xb2\xc1\x8b\x1d\x32\xc8\xef\x88\xe7\x8b\x74\x05\xf6\x6c\x9d\xf7\x4b\xc4\x03\x69\xa1\xc4\xde\xfe\x01\x73\xbc\x57\xec\x14\x52\xad\xef\xce\xdd\x5c\x28\x51\xe8\xe7\x8e\x5b\xc3\x23\x57\xd7\xf6\x57\x05\x48\x9d\x97\x05\x3b\xcc\x00\x87\x6c\x4b\xb2\xe4\xa1\xc0\x47\x61\x16\x7c\xad\x0f\x2d\x39\x4e\x89\xb6\x2b\x17\xbc\xef\xa3\x70\x90\x9f\x81\x38\xdc\x66\x47\x82\x59\x78\x53\x02\xfd\x91\x8e\x6b\x1e\xe9\x19\x79\xa4\x63\xfe\x48\xcf\xcc\x47\x5a\xff\x09\x66\xf6\x23\x3d\xab\x7d\xa4\x67\xb7\xb7\x33\xfb\x91\x9e\x99\x8f\xf4\x2c\x1c\xb5\x79\xa4\xa9\x48\x47\x90\x88\x3e\xa1\xa6\x60\x70\x7b\x0b\xcb\x00\xcc\x02\x30\xd7\x1e\xe9\x99\xf5\x84\xce\xf8\x23\x6d\x7c\x7f\x36\xab\xae\xc8\x5c\x3e\xd2\xb3\xe6\x47\xda\xc6\xe0\xde\x54\xa4\x8b\x33\x32\x3c\xf6\x48\x67\xe1\x0c\x24\xc1\x0e\xd9\xbd\xdc\xa0\x02\xcc\xc1\x4c\xbb\x2b\xa2\x35\xee\x0a\x54\xcc\x59\x44\x9c\x07\x1d\x11\x93\x0c\x45\x4b\xc1\xba\x85\xcb\xdc\x26\x46\x34\xb6\x9b\x5c\x3b\x0a\x9e\x2f\x9b\x24\x8d\x87\x0f\x89\x8e\x1f\xff\x49\x86\x2d\xd3\x47\xfe\xe1\x5b\xe0\x1f\x26\x9c\x7f\xa8\xba\xa8\x65\x8e\xcf\x3d\xfd\xe8\x13\xe6\xc1\xa8\x62\x16\x16\x0d\x8e\x63\x8b\x55\xde\x51\x32\x64\xa1\xa6\xb4\x68\x63\xd1\x30\x76\x9b\x2e\xac\x69\x49\x30\x6e\xe3\x33\x34\x6e\xf0\x19\x1a\xea\xcc\x8f\x60\x64\xc4\x47\xe3\xfa\x8c\xad\x42\x5d\xf8\x3c\xb7\xca\x98\x60\xf7\xa5\xde\x7c\xc6\x15\xe9\x25\x18\x85\x53\x7f\x71\x0f\xc4\x7d\x6c\xc3\x35\x6f\xff\xad\xa9\xfb\xb9\x0d\xdf\x10\xbf\x47\xdb\x27\x8a\xb6\xc0\x3b\x26\x71\x50\x6c\xcd\x01\xe9\x0c\xc4\xa4\xfd\x4b\x5a\x1f\x5f\xba\xde\xfe\xb5\x41\xa0\xb5\xc6\xa3\xba\xfa\xe5\x54\xef\xe5\xe2\x21\xbd\x97\xa3\x3f\xe9\xbd\x8c\x1f\xdf\xcb\x6f\xe1\xbd\x9c\xf3\xf7\x12\x39\xde\xcb\x15\xec\xf1\x7a\x2f\xd9\xc2\x8a\xb5\x1b\xf1\xc7\x60\xb4\x8e\x71\xde\x7a\xcf\xde\xa8\xc6\xea\x6d\xe1\x12\xe5\x8d\xdc\x6f\x24\x0b\xcb\x66\x94\x5a\xf6\x6e\x65\x09\xa2\x30\xf6\x33\x67\x1c\xb5\xf4\x8e\x24\x3a\x85\x8d\xe1\x8e\x5e\xc3\x4c\xbf\xe8\xe7\xed\x2f\x7a\x9a\x23\x74\xc2\xfd\x58\x1e\x7c\x36\x81\x7b\x8d\x3a\x02\x46\xec\xfe\x7c\x4c\x3c\xf0\x98\x78\xe0\xf1\xb1\xda\x36\xf1\x40\xdc\x3a\xf1\xc0\xbc\x26\x4c\x7e\x25\x24\xc9\xac\x52\x71\x83\x90\x24\xdc\xeb\xa1\x1a\xfd\xfe\x79\x35\x13\x68\x4d\x10\xfc\x69\x63\x10\xfc\x49\x7b\x77\x8d\x65\x4b\xff\x0b\x67\x7e\x00\x36\x49\xc5\x28\x4a\x20\xcb\xf5\x06\x2f\xa9\xb1\x1b\x4b\x2c\x80\xd1\x0c\x7a\xda\x7d\xa7\xcc\x03\x29\x9c\x09\xc4\x01\x7f\x29\x6b\xe0\x78\x2a\xbc\xee\x33\x28\x43\x02\x53\xb0\xda\x11\xe8\x0f\xe8\x41\xbc\xaa\x26\x55\xa0\x93\x75\x42\xa0\xbe\xd4\xfb\x35\x8d\x8a\xa3\x6c\x41\x5d\xd7\x1d\x7d\x63\xca\xa8\x4a\x53\x95\x61\x51\x36\x0f\xb8\xad\xb0\xec\xe4\xd3\xc3\xbd\x3d\xf8\xb4\x0e\x02\xab\xbc\xff\x03\xe9\xec\xe7\xfa\xb4\x0c\x2c\xf1\x2a\x7d\x55\x00\xb7\x90\x55\xa1\xd7\x4b\xe1\x1f\xb2\x7a\xaf\xba\xb6\xdd\x26\xc9\x11\x34\xaf\x9a\x75\xd2\x24\x98\xb1\x5b\xed\x64\x09\xa3\x28\xad\xe6\x48\xf8\xba\x62\xb9\x6c\x95\xcc\xa0\x2e\xaf\x80\x1e\xe3\x65\xeb\xc4\x07\xae\xc0\xff\x76\xee\x01\xd3\xe0\xae\x92\x78\xa0\xea\x97\x5d\x9b\x76\x40\x0c\xc8\x4e\x3b\x50\xf1\x88\xb6\x73\x0f\x54\x4e\x82\x23\x01\xc1\x34\x5b\x24\xf1\xc9\x34\xbb\x52\xd5\x4e\xd1\x0c\x26\x28\x85\xd2\x9f\xa2\x7d\xd0\x96\x3f\x3b\x48\x4b\xcb\x78\x2c\xa8\xde\xad\x01\x55\xe2\xb1\xd4\xb9\x30\x20\x77\x38\x16\x6e\xa4\x8d\xb3\x2c\xc1\x68\x7e\x0a\xaf\xb1\x35\x07\xa3\x28\x25\xff\xa5\x19\xf6\x3d\x7a\xf1\x76\x98\xf6\x71\x91\x24\x40\xdd\x40\x7d\x6c\x84\x03\x57\xe1\xd1\xf5\x38\xd4\x65\xf0\xcc\xfb\x57\xb6\xe8\x44\x39\x4c\xff\x83\xcd\xfb\x15\xcb\x04\xc9\x00\xd3\xcc\x8f\x13\xe6\x3d\x6d\x03\xac\xdc\x70\x0c\x14\xeb\x59\xb5\x7d\x27\x5e\xe4\x28\x9d\x74\xa2\x8e\x52\x3f\x7b\x82\xb6\xbc\x93\x98\x32\x14\xa5\x74\xf7\x26\x40\xaa\x59\x93\x69\x1d\xff\x31\x00\xcd\x3d\x04\xa0\x59\x27\xe8\xbd\x16\x80\xc6\xb6\xf6\xcf\xee\x32\x00\xcd\x86\xf6\xfa\x22\x89\x34\xdb\x48\xae\xa0\x9d\xa4\xc6\x90\x50\xa7\xa3\x7c\x31\x1b\xca\x1b\xe6\x3c\x1b\xf6\x21\x20\x67\x4b\x5c\x25\x2a\x82\x92\xf0\x17\xc2\x08\x27\xb0\xef\x91\x8d\xda\xe1\x21\x22\x58\x97\x31\x88\xf2\x49\xd1\x1f\x48\xb3\x98\x9e\xce\x7e\x43\x80\xcf\x4a\x57\x30\xf7\x7b\x0a\xb5\x5e\x09\xe9\x4e\x1f\xfe\x2f\x12\xc9\x7d\xeb\xd8\xe3\x7f\x76\x24\xf7\x68\xdd\x30\x33\xb5\xad\xdb\x85\x60\x36\xc3\xb3\xcc\x36\x8c\xc4\xfc\xbc\x1e\x6f\x25\x5c\xbc\xa1\xed\xd8\xda\x0f\xa3\x12\x2b\xde\x72\x36\xd8\xda\x21\xa3\x1a\x28\xde\x11\xd6\x66\x6b\x97\x8c\xfa\x30\xf1\xd2\xac\x7d\x6b\xbf\x8c\x4a\x68\xec\x6a\x58\x9b\xad\x5d\x33\x2a\xf1\xb1\x1d\x74\xe0\xf6\xee\x19\xd5\x20\xd9\x8d\xa4\xe4\xf6\x61\xbf\x2d\x74\x1a\x81\xd5\xce\x67\xa3\xb6\x75\xf3\x21\xad\x84\xeb\xc9\x5b\xdb\xde\x37\xc1\x69\x46\x6a\xd2\x42\x9b\x23\xb5\xe0\xb4\x8a\x76\xaf\x5c\x78\x5a\xf8\x8c\x34\x01\xb0\xb0\x6d\x18\xf6\x7c\xff\x12\xe6\x45\xad\xd1\xcf\x7d\x19\xeb\x73\xe1\xf6\x46\xfa\xca\x47\xe9\xe6\xbf\xab\x74\x93\x11\xe0\xa3\xf0\x26\x8e\xd2\x09\xcc\xfb\x1e\x2a\xba\xec\x4f\x0f\x5c\x45\x79\x4a\x3f\x90\x3f\x28\xff\x40\x85\xa1\xb1\xdb\x52\x5e\x58\xba\x18\xd2\x24\x98\xe7\x59\xde\x4b\xe0\x25\x2d\xbf\x0b\x1b\x79\xa1\xe3\x70\x9a\xbf\x22\x3a\x33\xd4\xc8\x9d\x62\xbe\x7f\x03\x77\x61\x62\x9b\x73\xab\xd5\x8c\x5b\xdc\x26\x61\x51\x6b\x71\x4b\x46\xa0\x6b\x4d\x92\x5a\xad\x49\x52\xa3\x35\x49\x6c\xad\xc9\xca\x9d\x98\x69\x5a\x13\xc2\x2a\xd0\xe9\xf9\x95\xac\x8b\x70\xb7\xe6\x07\x61\x34\x50\x62\x0d\x63\xf5\xce\x6e\x6f\xc9\x5e\x40\xe9\x38\xf3\xca\x2c\x7d\x81\x8a\x19\xa2\x0d\x15\x1b\xc5\xe6\x9c\xf2\xfd\x41\x39\x8d\xd2\x38\x81\x2f\xc9\x27\xc9\x3e\xeb\xb5\xb8\x25\xfd\xe2\x7e\x2c\xe9\x4d\xa8\xd6\x68\x99\xb9\xcd\xaa\x87\xa0\x11\x42\x00\x22\xfd\x25\xb0\xf0\x69\x63\x5f\xeb\xa5\xab\x05\x62\xa1\x33\xec\xec\xe3\x76\x0f\x4f\xbe\x68\xe1\x1c\xb6\xca\xb1\x8b\x1d\xc4\x14\xe4\x77\x64\x24\x9f\x84\x7e\x6a\x5e\x0a\xb5\x99\x31\xda\x9b\xbe\x0b\xb7\x06\x65\xfd\x9e\x7f\xb5\xd6\xef\xd2\x2b\x45\x49\x01\x56\x38\xa6\x7c\xfa\xee\x06\x96\xff\xe3\xbb\x1b\x7c\x7b\x2b\xf3\x79\x94\x9f\xc8\x61\xca\xc2\x54\xdb\x3f\x91\x9a\x88\x22\x1c\x20\xc9\x25\x2f\xb6\xb3\xa8\x8f\x6d\x8b\xfa\x45\xcd\xdb\x1f\x93\xb7\x7f\xc1\xdf\xfe\xd8\x7c\xfb\xf5\x9f\x20\xb6\xdf\xfe\xb8\xf6\xed\x8f\x6f\x6f\x63\xfb\xed\x8f\xcd\xb7\x3f\x0e\x8b\xf5\x2d\xea\x09\xdd\x23\x2c\xea\xe3\x00\x8c\xb4\xb7\x3f\xb6\x5e\xe6\x98\xbf\xfd\xc6\xf7\x67\x71\x75\x95\x47\xf2\xed\x8f\x9b\xdf\x7e\x1b\x83\x7b\xa3\x92\x2e\xc6\x64\x78\xec\xed\xcf\xc3\x18\xa4\xcc\xa2\x5e\x33\xcf\xd6\x6e\x85\x64\xe5\xad\x40\x68\xdb\x19\x93\x6f\xac\x1b\x36\x72\x92\xa0\xd9\x0c\xe6\xfb\x38\x8f\x46\x17\x06\xf9\x59\x31\xc0\x50\x36\x14\xf4\x77\x77\x94\xa5\x4c\x05\x32\x5a\xae\xb6\xab\x68\x8a\xde\xd8\x22\x1a\xa5\xb2\xb9\xb8\x0f\x53\x09\xf0\x0e\xbc\x04\x1f\x76\xaa\x11\x0c\x1f\x82\xc1\xc4\x9b\x3f\xc9\x60\xe2\xd7\x47\x96\xe2\xdf\x9d\xa5\x20\xef\xfa\xcf\xa1\x3f\x65\x66\xeb\xec\xd9\x09\x7c\x4f\x5c\x37\xfb\xc5\x62\x36\x8b\xf2\xa5\x30\x2d\x28\x1a\x53\x90\xb0\x34\x81\xcb\x95\x15\xa5\x0d\xc2\xe5\xca\xaa\x46\x54\x84\xab\x95\xd5\x65\x5a\x3d\xaa\x67\xcf\xa8\x08\x3c\x50\x4b\xfe\xbd\xad\xee\x17\xc2\xcb\x13\x3a\x4c\x04\x8b\x1e\x35\x4e\x7e\xcf\xcc\xdc\x29\x29\x78\x09\x3f\xc0\x51\x36\x9b\xc1\x34\x66\x5a\x1e\x36\x23\x81\xc8\x01\x5d\x05\xc1\x2e\xbb\xe7\xd8\x87\x4f\x0e\x83\x1d\xfc\xac\xa2\x8c\xe2\x20\x7c\x1c\xf4\x39\xa5\x9d\xc6\xbe\x97\xc3\x68\x34\x85\xf1\xcb\x34\xa6\x79\x7c\x7b\x71\x9e\xcd\xfd\x00\x9c\xb7\x24\xb9\x5c\x64\xd6\x2b\xa1\x66\x65\x08\x8f\xb4\x77\x42\xe4\xed\x78\x65\x39\x20\xbf\xb7\xbe\x0b\x23\x45\xa1\xb3\x7f\x53\xe3\x6b\x50\x13\x11\xd1\x95\xf4\x8c\xcd\x18\x4f\x9a\xb2\x9c\xc3\xbe\x47\x68\xa0\xf5\x22\x28\xf2\xd4\xbf\x22\x4d\x74\x79\xa6\xf5\x58\x76\x45\xa9\xe7\x5f\xa9\xb4\x2a\x46\xa6\xfe\x57\x15\xb5\xfd\x49\xa5\xc4\x95\x9b\x5f\x95\xda\x49\xf9\x55\x89\x96\xcb\xed\xc8\x9e\x54\x33\x5d\xea\x8b\xba\x62\xd1\xa9\xe7\x75\x15\xf4\xbe\xbd\xab\xab\x24\xba\xf8\xd2\x5a\x42\x33\x49\xe8\x56\x09\xf0\xcf\x2a\x50\xa5\xcc\xfa\xfe\x12\xdb\xab\xa1\xce\xf3\x6c\x04\x09\x59\xf1\x81\x0f\x91\x1d\x2b\xb6\xeb\x99\x1e\x20\x7c\xcd\x83\x83\xf8\x37\x71\x84\xa3\x93\x6c\x91\x73\x2d\x37\x67\xb2\x53\x3d\x41\x78\x55\xf5\xab\x8a\x99\x39\x82\x38\xed\xce\xca\xb2\xb4\x5d\x06\xf2\x87\x96\x7b\x5c\x6b\x15\x7a\xdf\x7b\x2a\xe9\x78\x53\x74\x3c\x43\x55\x2c\x27\x48\x74\xee\x3c\x1b\xf6\xcc\xdc\xd8\x32\x83\x3e\xa1\xfe\x59\xc6\xfa\x74\x14\x61\x1f\x07\x01\x18\x9c\x05\xe4\xfe\xd5\x14\xd1\x70\x73\xa5\xb2\x7e\xc2\xd9\x03\x63\xaa\x94\x23\xa5\x52\xc6\x0d\x41\xf4\xc8\x2c\xe0\x35\x63\xe8\xb1\x93\xa9\x4d\xd2\x7e\x6f\xd0\xed\x7d\x3c\xdb\x17\x8f\x8b\x73\x9e\x98\xf1\x85\x9a\x20\x42\xb7\x88\xd4\xe6\x18\x16\xd8\x47\x81\x82\x88\x7a\xb3\x08\x8f\xa6\xfe\xbe\xdf\x7b\xf2\x2c\x60\xd0\x83\xc1\xe1\xd9\x0e\x26\xb4\x19\xf9\xbf\x67\xe4\xff\x9e\x1c\xf6\x0f\x4b\x19\xd7\x26\x00\x37\x65\x00\x50\xa8\xd3\x78\x58\x1f\x15\xbb\x76\xfb\x84\x0c\x5e\xa4\xb8\x8f\x19\x89\x67\x24\x85\xe7\xa9\xf8\x9f\x1e\x06\x01\x48\x69\x37\xe6\x7a\x5e\xff\xb5\x17\x89\xcd\xd5\x8a\x05\x4a\xad\x05\x62\x8d\xd8\xe2\x20\x69\x48\x28\xfa\x50\x39\x6d\xac\x80\xaf\x16\xe1\xdd\xf9\x97\xb2\xe3\x93\x1f\x74\x40\x65\xf0\x49\x2e\x63\xe5\xed\xff\x22\xb9\xed\x8d\x7b\xad\xa7\x5b\x80\x1a\xa9\xee\xad\xd4\xf1\x34\x36\xca\x0e\x1a\xfb\x49\x0f\x15\x2f\x60\x81\xf3\x6c\x89\xd2\x89\x91\xaf\xde\xfb\xde\xdb\x0d\x43\xfb\x8c\xef\xed\x25\xca\xea\x87\x19\x01\xb1\x2d\xe8\xa8\x6b\x80\x73\x9b\x38\x25\x1b\x66\xda\x4f\x5a\x66\xda\x4f\xb6\xc9\xb4\x9f\x85\xc9\x1a\x99\xf6\x33\x67\xa6\x7d\x6a\x83\x56\x4f\x39\xca\x17\x43\x52\xd9\x62\x45\xbd\x90\x4f\x28\x97\x2a\x71\xf3\x43\x6a\xbb\x44\x66\xf8\x99\xbe\xfc\x8a\x98\x63\x8f\x8e\xe0\x1b\x5d\x84\x66\x83\x45\x54\xa5\x0f\x00\xf6\x8a\x64\x31\x01\x37\x1a\x85\xd7\x37\xf3\xd7\xc2\x9e\xfe\xb3\x2c\x9b\x2d\x65\xc8\x3d\x63\x9f\x5a\x2c\x9e\xe8\x65\x3a\x7a\x4e\xa7\x4a\x4e\x4e\xe9\xf8\x76\xd3\xe2\x9a\x40\x63\x7f\x77\x15\xd1\x7e\x7b\xbb\x5b\x4b\xf6\xeb\xcf\x62\x13\xdd\xbf\x92\x83\x90\xe4\xff\x41\xb0\x03\xeb\x89\x7f\xc8\x89\xff\x86\x35\xf1\x58\xf4\xde\x12\x5c\x87\xbf\xfa\xe7\x86\x62\xb5\x4a\xd0\x6f\x6f\x80\xf0\xde\xc6\x72\xe7\x21\x67\x8e\x2b\xe3\x10\x2e\x50\x77\x85\xe1\xa2\x82\x41\xe3\x06\x06\x69\x8f\x0a\xc1\xe0\xe6\x26\x42\x9a\xdd\x38\x3f\xc4\x5e\x49\xe3\xa7\x5a\x68\x05\xa3\x71\x7f\x28\x4f\xaa\x28\x25\xcd\x7d\x6f\x48\x3f\x56\x91\x1a\xb1\x0f\xef\x0d\xf1\x69\x15\xb1\x4c\xc1\x7f\x6f\x48\x8f\xaa\x48\x35\xa6\xee\x5e\xf0\x7e\x4f\x11\xbf\xa8\xee\x62\x83\x61\xbc\x8b\x00\xad\x75\x18\xe4\x26\xba\x83\x18\xad\x75\x38\x8c\x3d\xb3\xb5\x29\xd0\xcb\x5a\x3c\x72\x8b\x6c\x6f\xfd\x63\xe3\x90\x2c\xe7\xf6\xf9\xfe\x2d\xc8\x8e\xc7\x62\xad\x90\x9b\x2b\x81\x05\xe0\x5c\xd7\x4f\x56\x26\xcf\x7e\xca\x37\xc7\xee\x80\xb5\x02\xb9\xfd\xf6\x6f\x81\xbb\x02\xca\x42\x7d\xae\xeb\x65\x7f\xa6\x92\xd0\xd7\xdc\x75\x6c\x21\xad\x25\x94\xac\x40\xf1\x62\xc2\x6d\xcc\x5d\x4b\xbd\x37\x64\x74\xfe\x6c\x55\xd0\x8f\xd1\x5a\x5e\x36\xaf\x9c\xee\x1d\xc3\x8a\xe8\x47\x3d\x7a\x63\x4b\xea\x03\xaf\xa3\x11\x7e\x4b\x78\xc2\x97\x29\xd9\x94\x31\xcb\xc7\x21\x8a\xc7\x8b\xcf\x9f\x39\x6b\xa1\xca\x0f\x54\x39\x27\x94\x5e\xa9\x6a\x14\x16\x2c\x58\x70\x3f\xca\x15\xa9\xb2\x8a\xbf\x46\xb2\x98\x78\x67\x65\x19\x18\x16\xa4\x56\xfd\x35\xe3\xf7\xce\x1a\x61\x05\x60\xa6\x2f\xfa\x30\xfc\xd5\x6c\x60\xd9\x8a\x6e\x6d\x3c\x3c\xb6\x11\x18\x04\xc8\xd6\x41\xd4\x67\x41\x6b\x55\xa1\x94\xdd\xaf\x1b\x7b\xeb\x32\xca\x3b\x54\xe9\x73\x77\x76\x03\xa8\x46\xbf\xe0\x05\x60\x03\x93\x02\xa6\x0b\x5c\x61\x58\x20\x50\xe8\x34\xf2\x03\x30\x32\x00\x51\x38\x30\xb9\x2d\xc5\x76\x7b\xe5\x19\xf0\xb3\xd0\x90\xbd\x07\x28\xf5\x93\x46\xa3\x29\x32\x59\x7c\x8d\xa2\xb5\x14\x82\xc9\x20\x3b\x0b\x23\x4d\xdc\xb9\x5c\xc7\x99\x81\x1c\xf5\x3e\x2c\x75\x39\xd6\x52\x38\x31\x08\x81\x66\x0e\xe7\x49\x34\x82\xbe\xb7\xef\x01\xaf\xb3\xdf\xf1\x02\xe1\xc4\xe0\x60\x4b\xa9\xff\x42\xc5\x6c\xc2\xb5\xcc\x45\x38\x40\x8f\xb6\x13\xdf\x90\xed\xc4\x4e\xe3\x85\x58\xc0\x9c\x4c\xcf\x57\x15\x83\x70\x9d\xa0\xc2\x5a\x2c\xe0\x57\x59\x3e\x44\x71\x0c\xd3\x2f\x10\x0d\x78\xad\x30\x89\x7c\x8e\x1b\x62\x3b\x6d\x16\x1f\xb1\x29\xe8\xa1\x16\x06\xd6\x0c\x7a\xc8\x8c\x42\x94\xb1\xc7\xe4\x21\x19\x7b\x2c\xff\x24\x63\x8f\xcb\x47\x63\x8f\x6f\xc1\xd8\xe3\x8a\x47\x3a\x46\x8a\x18\x13\xf7\x23\x41\x66\x44\x2f\xe4\x05\x9a\xa4\xd9\xb8\x81\xdc\xc1\x12\x45\x3a\x92\xc8\x55\x18\x4d\xb8\x6b\x86\x15\x27\x51\x7e\x5f\x34\xc4\x4f\x1c\xb5\x8e\x9f\xd8\x8a\x95\x9a\x48\x66\xc9\x1a\xa5\x8a\x4f\x28\xaa\xe8\xc3\x96\x01\x0a\x45\x21\xcf\xdb\x32\xb3\x3e\xf3\x21\x49\xde\x6c\x79\x7f\x21\xac\x96\x35\xe1\x0a\x96\x95\x70\x05\x7f\x53\x1f\xad\xe8\x03\xa8\xf8\x15\x46\x31\x35\xb3\x59\x36\x84\x1e\x98\x38\x42\x0f\x8c\xad\x91\x73\xef\x38\x3e\xfe\xa9\x0c\xd6\x18\x87\x97\xfe\xc8\x64\x8d\x2a\x33\x3f\xc8\xb7\x0f\xad\x68\x61\x31\x16\x6f\x7b\x6b\xf5\x99\x0d\x5f\xe4\xed\xd9\x3a\x28\xe4\xd0\x86\x2c\xb6\xd0\xf6\x01\x21\xc7\x36\x68\xc3\x03\x73\xeb\x48\x90\xd3\xca\xca\x1a\x5b\x60\xb0\xd8\x3a\x1a\xbe\x2e\xab\xb9\x6a\x4d\x8d\xb0\x7f\xbf\x2a\xc2\x8f\xc5\xb2\x20\xdd\x72\x32\x53\x1b\x11\x5d\xec\xdf\x8d\xe2\x6a\x36\x79\x0d\x48\xd2\x20\x79\x24\x0d\xbe\x05\xd2\x20\x0b\xfd\xb4\x92\xce\x99\xbd\xdb\x38\x9a\x50\xfa\xc0\xf7\xf3\x75\xc5\x35\x35\x2c\x8d\x47\x41\x52\xb6\x86\x69\x5b\x4f\xa3\xe1\x17\x60\x6a\xe8\xf1\xa3\x97\xd3\x69\x34\xa9\x18\x62\x69\xf1\x61\xd8\x88\x6f\x6f\xdd\x1b\x1d\x72\xdb\x11\x1c\x3e\xf5\x6f\x58\xc0\x06\x4e\xf4\x13\x3c\xd4\x14\x46\x18\x9b\xf0\x50\x29\x05\xc4\xa7\xd1\xd0\x74\xae\x52\x03\xa7\x0e\x56\x41\xf5\x06\x3d\xa5\x93\x34\x68\x21\xfb\xce\x6b\x1a\x07\x20\xd7\xe5\x9f\x89\x55\x91\xf6\x6a\x2d\x21\xbb\xab\xbd\x85\x24\xd7\x6f\xeb\x6c\xdd\x6b\x6c\x96\xa5\x08\x67\xeb\xdf\xda\xf2\xba\x42\x5f\x96\x83\xba\xab\xd7\x22\xdd\xc8\xc4\x17\x39\xc9\x4a\x8f\xf9\x01\x9e\xa9\x72\xf6\x01\x78\xd4\x25\x30\xd0\xdf\x99\xb4\xc5\x02\xb1\xf8\x20\xfb\x38\xbb\x80\x35\x9e\xd0\xdb\x05\xf3\x8c\xe6\xf3\x04\x09\x17\xf7\x36\x4e\xd0\x20\x61\x57\x8c\xc1\xf9\xab\x17\x6b\xf6\x90\x38\xfe\xe1\x9f\xc4\xf1\x8f\x1f\x9f\xf5\x6f\xe1\x59\x9f\x86\x7e\xa6\xe2\x61\x12\xae\x9a\x1e\xe3\x5e\x01\x47\x39\xc4\x82\x53\x57\x21\x25\x45\x69\x32\x3e\x25\x7f\x51\x66\xdd\x7c\xf3\xd3\x35\xee\xa7\x19\xbf\x7f\x28\x54\x95\xf7\x4c\x7c\xe6\x89\x8c\x47\xf6\x67\xd6\xb7\x4a\xa2\x00\x0a\xe5\x4d\xf1\x7b\x94\x20\xae\xb7\xb4\x4a\xde\xa4\x97\xaa\xcc\xc0\xfd\x01\x8e\xb2\x3c\x96\xec\x7b\x49\xc3\x31\x9c\x10\xf4\xd2\x2d\x9a\x26\xdf\x5f\xa4\x49\x16\xc5\xcf\x93\xc4\x0f\xca\x51\x02\xa3\x9c\xce\x02\x9f\x7d\x66\xe2\xc9\xec\xb6\xf8\x34\x61\xad\xe8\x86\xf5\x5b\x29\x73\xc4\x5b\xaf\xd7\xd1\xc7\xd0\xdf\x3d\x04\x66\xcf\xfb\xbb\x87\xa2\x9d\xde\x43\xa0\xe1\xa4\xdf\xfd\xa0\xbc\x84\x39\x1a\x2f\x69\xf7\x34\xbb\x53\xda\x01\xae\x77\x01\x58\x46\xdc\x7c\x7f\x95\xc2\x9c\x85\xdd\x0c\x7a\x49\x96\x5d\x2c\xe6\xbe\x17\xc5\xd1\x9c\x26\xe8\x67\x0b\xbd\xa3\x48\x13\x63\x8b\x00\x18\x00\x4c\xad\x1e\x4f\x60\x32\xf6\x83\x1e\x9e\xc2\xd4\xd7\xac\x73\xab\x3d\x9d\x28\x20\x63\x88\x47\xd3\x13\xb1\x9d\x9e\xa7\xf1\x71\x96\xa0\x11\xd5\xa3\xf7\xe6\x30\x1f\x67\xf9\xcc\x0f\x7a\x23\x6a\xa5\xdc\x66\xc6\x0e\x5c\x33\x56\x06\x95\x38\x61\xe6\x10\xc4\x99\xdc\x64\x45\xc8\x6d\x4d\xed\xf0\x16\xe1\xd8\x2f\xcc\x38\x2e\x74\x57\xdf\x59\x5c\xab\x91\x8d\x40\x24\xfa\xbe\x2b\x04\x71\x05\x01\x9f\x9f\xbb\xc8\x69\xe1\x9a\x1c\x71\xec\xee\x40\x86\x61\x42\x77\x9d\x4d\x0f\x0c\x92\xd6\x84\xec\x6a\x68\x01\x28\x74\xb2\xd6\xea\x80\x76\xfc\x36\xc7\xab\x03\xb1\xd0\x15\x3a\x15\x3d\x5d\x49\xa4\xe1\x6c\x9e\x25\xd9\x64\xa5\xba\xbf\x36\x80\x7a\x8b\x44\x1b\x2e\x5f\x62\xcb\xff\x77\x91\x22\x5c\xd4\xbb\xf0\x32\x42\xc3\xa1\xad\x71\xb9\xf0\x2a\x7a\xee\xed\x43\xa2\xe7\x4e\x1e\xe9\xaa\x7f\x77\xba\x8a\x49\x0d\x3e\x86\xc2\x39\xe9\x89\x8f\x6f\x6f\x0f\x02\x70\x4a\xdd\x9c\xde\xa4\x38\xe9\xbd\x5b\x90\xc3\xf3\x2a\xcb\x67\x11\xf6\xaf\x50\x1a\x67\x57\xbd\x34\xba\x44\x93\x08\x67\x79\x2f\xc9\x46\x51\x02\x6f\x6f\x3d\x72\x79\xdc\xcc\xa2\x6b\x34\x5b\xcc\x5e\xe5\xec\x0e\x79\x81\x26\x08\x17\xfd\x1f\xca\x80\x12\x70\x47\xa1\x1f\x99\x31\x7c\x8c\x68\xe6\xc5\x34\xbb\x3a\xcd\xe6\xd9\xef\xe8\xf3\x71\x96\x24\x28\x9d\xbc\xcb\x30\x39\xaf\x5c\xcb\xe2\x10\xe7\x50\x91\x35\x0f\x8a\x1d\xeb\x1e\xb6\x8b\x9a\x06\x7a\x50\x4f\xd6\x0c\x15\x27\xdc\x1c\x9f\xa9\x66\x56\x23\xca\x61\x41\x4d\xe4\xc8\xbd\x1a\xaf\x59\x7f\x5e\xa9\x8f\x33\x1c\x25\x6f\xe1\x2c\xa3\x86\x7d\xb3\x15\xe5\x43\x77\xf9\xd1\xf1\x6f\x2a\xdc\xba\xbb\x70\x5a\x29\x14\x6e\x08\x7a\xfc\x3f\xde\x65\x3e\x4d\x30\xfe\xa0\xf5\x7d\xb2\x35\x84\x65\xe3\xe8\x00\xfb\xf5\x01\x52\xf9\x49\x2c\xc7\x7c\x59\x3f\x2c\xab\x09\x1b\xe9\x55\xa5\x3e\x93\x4f\xa9\x4e\xaa\x68\xa4\xef\xa2\x19\x79\x0f\x1a\x06\x72\x73\x9e\x0d\x81\x51\xbf\x14\x6e\xd9\x0e\x1c\xef\xb2\x18\x8a\x08\xe7\xe6\x54\xa1\x21\xd9\xd1\x55\xf8\x29\x6b\x71\xbd\x85\x77\xf4\xdb\xc6\x88\xe5\x6f\x55\x88\xea\x2b\xf3\x5c\x49\x5f\x68\x51\x45\xf8\x80\xbc\x63\x9a\xa0\x0b\x2d\x6c\xb5\xe6\x85\xa4\xe4\xfd\xcd\x01\x74\xd9\x19\xe0\xee\x72\xfa\xe9\xd4\x03\xe7\x32\x41\xa6\x63\xfa\x9d\xfe\xa8\xd5\x20\xd4\x04\xb6\x71\x84\x79\xd4\x68\xb9\xad\x14\x9c\xc3\x83\x1f\xfe\xfa\x7d\x5d\xff\xe4\x21\xed\xcd\xf8\xbe\x13\x0f\xc6\x47\x70\x10\x7c\x4f\xda\x2a\xc8\x47\xc7\xbf\xb9\x7d\x6b\xdd\x10\x47\xf3\x85\xc3\x0f\x94\x5f\xb5\x01\x38\xa8\xf4\x99\x5d\xb6\x18\xc6\x0a\xcb\x29\x79\x61\xc9\x0d\x4c\xc3\x01\x30\x58\x3f\x2f\x31\x2c\x18\x2b\xd4\xd3\x5a\x07\x83\x83\xb3\x0a\xc8\xdf\x08\x39\x23\xc1\xb5\x01\x72\x78\x66\x0c\xb8\x65\x9f\x5e\xc3\x1c\x7f\xd6\xc1\x1d\x1d\xff\xc6\x62\x72\x7b\x6f\x5f\x7f\xf6\xac\xbe\x1d\x1d\xff\x56\xdb\xb1\x95\x90\xf4\x0e\x9a\x97\x86\x6b\xcd\x9d\x47\x9c\x2f\x55\xf5\xb2\x6a\xb3\x0b\xb4\x5b\xc7\xda\x0d\x6b\xe2\x32\xf6\xc7\x47\xb1\x1f\x72\x63\x48\xc7\x30\x27\xc7\xc7\x42\xe4\x18\xfb\xde\x9e\xbd\x94\xcf\xea\xaa\xee\xdb\x35\xfb\x07\x06\xe6\xa3\xe3\xdf\x5a\xa0\x3d\x3a\xfe\x4d\xc7\x79\x74\xfc\x9b\x03\xe1\xd1\xf1\x6f\xfb\x46\x1d\x8e\xaa\x7a\x2d\xfa\x81\xed\x01\xa7\x0a\xb9\x93\xe3\xe0\x6c\xc7\xd0\x76\x34\x5f\xef\xc2\x05\xb9\x52\x6b\x08\x93\x2c\x9d\x14\x3c\xd0\x95\x17\xf4\x50\x2c\x7d\xae\x1b\xd6\x51\x0b\x7e\x8f\x4c\x4c\x61\x18\xc2\xbd\x3d\xe4\x06\x1c\x86\xa1\x88\xa9\x4d\xae\x89\xdf\x30\x4a\xd0\xe7\x08\x3b\x52\x77\xa8\x97\x04\x0c\x30\x40\x67\x61\xf5\xb4\xd2\x6d\x0d\xf9\x26\xa5\xdb\x32\x00\x69\x08\x5d\x31\xcb\x5d\x1b\x19\xe4\xee\xba\x95\x8d\x28\x83\x75\x3b\xee\xa6\x3e\xee\xe1\xec\x15\xba\x86\xb1\xff\x43\x00\xec\xab\xa6\x8f\xf4\x4f\xfd\x6a\x87\x81\x63\x43\xb2\x6a\x29\x2b\x77\xee\xff\x7e\xba\x2f\xa0\x00\xb9\x95\x20\x39\x41\xc0\xde\x6f\xfd\x1c\x54\x37\x72\x3f\xdf\xa7\xb5\x4b\xba\x10\x8b\x14\xfd\xb1\x80\xcf\xad\x8d\x41\x5f\x3f\xfb\x44\x57\x9f\x6f\x3d\x26\x3c\x8a\xbd\xa0\x47\xa0\xf9\x41\x19\x15\xcb\x74\xd4\x29\x20\x36\x23\xf9\xc3\xbd\x3d\x3f\xba\x8a\x10\xee\xc0\x5e\x0e\x93\x2c\x8a\xfd\x00\x88\x0f\x34\x91\x00\xff\xa8\x44\x3b\x55\xc2\x85\x05\xf8\x87\x98\x74\xd1\xa5\x82\xa3\xe4\x07\xa9\xc3\xc2\xf8\x71\x6a\xfa\x45\x84\x23\x19\x12\x91\x6d\x35\x1c\x42\x2a\x07\xa3\xe9\x68\xa8\x2b\x96\x7c\xfc\xbb\xdc\xf0\x69\x07\xef\xed\xf9\x86\x6b\x28\x9d\x98\x10\x13\xd6\x0c\xc3\x6b\x1c\xd0\x30\xec\x27\x8d\x61\xd8\xef\xce\xe1\xf2\xa4\x12\x25\xd9\xa6\x66\xb6\x97\xcc\x5c\xd8\x58\x2c\x82\x68\x90\xdc\xbd\xa7\x5c\x87\xe2\x2e\x03\x60\xa1\xd6\xdd\xbe\xa9\x65\xcb\x5a\x21\x84\x0d\xa7\x71\x33\x7e\xb0\x3d\x91\x8e\x3b\x8e\x59\xba\xac\x19\x21\xd9\x01\xa6\x19\xb3\x41\xfb\x0f\x46\x6b\x47\x9e\xd6\xf9\xa2\x95\x78\x28\xb7\x30\x58\x37\xd6\xbd\xc6\x3f\xb5\x1c\x89\xbc\x1e\x37\x88\x78\xef\x04\xd3\x1a\x33\xbd\x76\x37\x88\x7b\x5f\x01\xd1\x6e\x36\xf5\x81\x0e\x37\x9c\xd6\xb5\x46\x29\x68\x45\x16\x08\x7f\x23\x7c\xad\xc7\x67\xf1\xa0\xd4\x27\x7d\x7d\x8c\x15\x4e\xb6\x35\x5e\xb6\x5b\x27\xdb\x20\x5d\xbd\x6b\x9d\x0f\x2c\xf3\x97\x5d\x0b\xad\x1b\x4e\x3b\xdc\xea\x65\x66\x0e\xb4\x1b\x21\xd6\x80\xac\xb8\xeb\x2a\xaf\x38\x73\xa9\x5d\xef\xa6\xab\x02\x69\xc6\x6a\x91\x7b\x1b\x44\xd9\xb7\x21\x34\xe3\x6b\xa0\x6a\x36\x08\x46\xdf\x04\x6d\xc5\x6c\xeb\x24\xd0\x5a\xa6\x39\x0d\x60\x56\xa2\x64\x24\xd0\x16\xc8\xb8\x08\xa7\x09\x8d\x9b\xba\xda\x1c\x6b\x0d\xbc\xa6\xc0\xff\x47\x4e\x3d\x0a\x79\xf6\xbb\x5c\x19\xea\xd2\x9f\x74\x49\x85\xfd\x18\x0e\x17\x95\x1c\xe2\x1b\x58\x8b\xd6\x36\x10\x11\x82\x0d\x35\xc6\xee\x01\x98\x40\xec\x20\x80\xa4\xa8\xab\x2c\xdd\x4e\xa1\x53\x98\xcc\x61\x5e\xec\x77\x61\x02\x67\xec\xaa\xd0\x46\xc6\x06\xc6\x8b\xba\xac\x6e\xb5\xc9\xc3\x1b\x6d\x94\x24\x5d\x34\xaa\x4f\xd8\x30\x9b\x67\x29\x4c\x31\xaf\xaf\x2b\xb0\x8a\xcb\x89\x43\x73\xa5\x19\x96\x69\xdd\xd1\xd5\x38\x2a\x10\xfe\x26\x9a\x85\x28\x49\xde\x90\xee\x86\x69\x55\xcd\x40\xfd\x9b\x98\x47\x04\xeb\x6e\xe0\xa7\xfa\x6e\xce\x9b\x67\x22\x8d\x5d\x4b\x8e\xf3\x05\x9e\x76\x45\x25\xbd\xf2\x57\xb9\xd8\xf5\x30\xe9\xf8\x5a\xc2\x8b\xd2\x78\xe5\xc6\x99\xcf\xa1\x7b\xc6\xe8\xa6\x29\x08\x8a\xea\xb4\xb1\x46\x0f\x6d\xe6\xf8\x50\xdb\x4e\x1e\xad\xbe\x72\xfe\x8a\x02\x4d\x52\xd7\xfc\xb1\x12\xfb\x8e\xe1\xf5\x1f\xda\xd4\xf1\x51\xb6\x9d\x3a\x5a\x7d\xd5\xd4\x0d\x91\xbd\xf1\xea\xaf\x2b\x5e\xe2\x7c\x8c\xac\xdb\x0a\x06\x37\x09\xc4\x4c\x18\x06\xa5\x84\xae\x47\xb0\xf9\x68\xa3\xcb\x8a\x34\xbd\xfb\x8b\x6a\x14\x25\xc9\x9a\xe7\x8e\x36\x79\x60\x5b\x87\x0d\xb3\x25\x40\x52\x79\xd5\xb6\x19\x45\x33\x98\x54\x82\xc2\xf3\xb9\x4b\x50\xb7\xc0\x39\x4a\x27\x8e\xb9\xe3\xcd\x1e\xdc\xfc\x89\xe1\xb6\x9e\x43\xd6\x60\xf5\x3c\x3a\xaf\xad\x51\x94\x1a\x55\xbe\xca\xe9\x5a\x35\xb0\x11\x4c\xba\xb5\xc7\x4b\x46\xf7\x77\xb5\x78\x90\xc3\x4d\x33\x27\x99\x6b\x2d\x25\xa9\xf5\x10\x87\x37\x47\x38\xda\xe8\xc0\xcb\x86\x5f\xe5\xa8\x9b\x8e\xbc\x1a\x72\xeb\x43\x2f\x9a\xac\x9c\xcf\xe9\x22\xbd\x58\xf7\xdd\xa1\x6d\x1e\xda\x2c\xb2\x81\xb6\x9d\x40\x52\x7b\xe5\xdc\x25\x84\xb2\x19\x2f\xd7\xdd\x89\xa2\xd9\x43\x9b\x41\x39\xdc\xb6\x93\xc8\x1b\xac\x9c\x47\x66\xd0\xb1\xee\x2e\xe4\xad\xbe\xca\x59\x5c\x39\xde\x05\x76\x5f\x60\xcd\xe3\x25\xad\xbe\xca\xf1\x36\xec\x1a\x31\xd8\xb6\x9b\x86\xd5\x5f\x39\x87\x45\xd1\x1d\xf1\xd4\x68\xeb\xb0\x0c\xec\x4c\xb6\xe4\x19\x14\xc7\x40\x4d\xb2\xe2\xa8\x98\xc2\x9c\xc5\xee\x95\x61\x9b\xf6\xff\x9f\xfd\xfd\x09\xf0\xba\x5e\xb0\x11\x33\x31\x2a\x0a\x9a\x9f\xed\xee\x19\x0a\xd9\xdb\x35\xaf\x27\xd5\xee\x81\xed\x34\x6d\xc0\x6d\xa1\x8a\x16\xab\x76\x5b\x0c\x47\x6b\x9e\x56\xd2\xe2\xa1\xcd\x1f\x19\x64\x6b\x78\xa3\x95\x73\x86\xe2\x2e\x4a\x0b\x98\x3b\x2f\xf6\x1c\xa6\x31\xcc\xab\xd3\xa6\x1a\x7d\x95\xb3\xb7\x72\xc4\x8b\x79\x1c\xb9\xaf\xf6\x86\x11\xf3\x46\x0f\x70\xc4\x79\x36\x5f\xf7\x60\x90\x26\x5f\xeb\x48\xab\x31\xd4\x44\xb7\xd7\x57\x1f\x3c\x5c\xed\x01\x1b\xd6\x3c\xbb\x82\x79\x97\x85\x11\xee\xa2\xa2\x3b\xe1\x69\xb0\x2b\xe3\xd7\x2b\xb6\x82\xf1\x55\xce\x48\x3d\x4c\x3a\x94\x63\x32\x92\x13\x3a\x90\x37\x05\xcf\x08\xde\x12\x47\x4d\xfb\xcd\x56\x81\xfd\x05\x9d\x22\xfa\x35\x16\x42\x82\x79\xf0\x6b\x71\x22\x27\x64\xe3\xe5\x10\x20\x56\xae\x48\x5a\x2c\x72\xd8\x2d\xa2\x31\xec\x4a\x0a\xb3\x4a\x7f\xe6\x19\x8a\x61\x4e\x5d\xc1\xbe\xa6\xe9\x7d\x49\x7b\x7f\x12\x8d\xe1\x91\xe8\xfb\x6b\x3a\xb0\xd5\xc3\xc6\x39\xf3\x2b\x5c\xe7\x9e\x17\xad\xbe\xa2\x19\x68\xb5\xc1\xc4\x60\xdb\xee\x26\x56\x7f\xe5\x1c\xfe\xd1\x1d\xba\xbd\x12\x6d\x0f\xc4\x0a\xeb\xd2\x8a\x55\xa1\x8e\x76\x8a\x5d\xd9\xdd\xf5\xd1\xde\x5e\xba\xb7\x47\x5d\xdc\x08\x03\x31\x81\x34\x33\x10\x0a\xc2\x30\x54\x1f\x72\xb0\x99\x0a\x04\xfe\xf1\xf3\xb2\x91\x63\x41\x9b\x70\x2c\xf0\x8f\xf6\xaa\x5a\xf8\xc7\x22\xfa\xaa\x8e\x57\xab\xcd\x45\x3b\xdd\x7a\x6b\x91\xda\xab\x36\x16\xb3\x32\xad\x6c\xae\x95\xc7\x53\xb5\xfb\x2a\xe7\xb0\xc5\x98\x37\x1a\xf0\x83\x1c\x6d\x1a\x6f\xb2\xbe\xac\xd5\x03\x1c\x6f\x12\x61\x0c\xdd\xca\xa8\x86\xf1\xf2\x56\x5f\xe5\x78\xeb\x61\xca\xc1\xb6\x84\xc9\xeb\xaf\x9c\x43\x6a\x1c\xdb\x1d\x2e\xb1\xfd\x6e\xb7\x30\x01\x6a\xf4\x61\xbf\x8b\xc0\x80\x34\xb6\x5e\x28\x27\x88\x3f\x15\x76\xbc\x6e\xf2\xac\xa5\x67\x21\x04\x37\x34\xbf\x58\x3f\x2f\x43\xac\x4b\xe3\xd8\x18\xb9\x53\x4b\x0a\x72\xca\xbf\xad\x8a\xe8\x64\x4d\x50\x95\x57\x9f\x65\x8c\xcd\xdb\xf2\x39\x36\x24\x87\x72\xa4\x81\x8f\x02\xe1\xf7\xe6\xbd\x7d\xfb\xf6\x6d\xe7\x05\xe8\xfc\xeb\x5f\xff\xfa\x97\xb7\xd1\x2b\xcc\x20\x9d\x36\xc8\x0e\x91\x3d\xc7\x6b\xbc\xc6\x62\x8a\x16\xb9\x30\xc2\xdc\x64\x1b\xd9\x50\xbe\x8a\x0d\x45\xf7\x76\x3f\x07\x49\x96\x4e\x5e\x65\xf9\xac\x9f\x58\x7b\x4b\xcb\xa5\x98\x83\x64\x93\x9d\x35\x85\x39\xfe\xfc\xef\x7d\xf4\xb8\x93\x65\x0a\xf2\xdb\x5b\xe6\x56\xb9\xc1\x3c\x9d\x67\xc3\x2e\x6a\x69\xf7\xd3\x18\xed\x4e\x13\xd9\xa3\xb1\x8f\xb9\xbb\x5f\xe7\x97\x93\xf7\xef\x7a\xf3\x28\x2f\xa0\x8f\x83\xde\x79\x86\x52\xdf\xfb\x1f\xdb\x1c\xb7\x5f\xb2\xe1\x9b\x38\x44\xad\xa7\x16\xad\x3d\x25\xb3\x2c\xc5\xd3\x2e\x2e\xee\xeb\x62\x02\x69\x28\x1d\xc0\x79\x46\xc7\xa7\x87\x5a\xc8\x0a\x59\x38\x38\x3c\x7b\xa6\xff\xe8\xdf\x94\xdc\x79\x32\x0f\xd3\x5e\x31\xcd\x72\xfc\xcc\xa3\xb7\x98\xd7\x67\xff\xbe\xe8\xbc\x7e\xdd\x9f\xcd\xfa\x45\xd1\xf9\x5f\xff\xcb\x5b\x71\x03\xe6\x5b\xac\xc2\x5b\x32\x47\xf7\x7c\xf3\xcd\x99\x5f\x00\x0d\x24\x7d\x37\xdb\xb3\x83\xb7\x9e\x79\x14\xa6\x3e\x1c\x1c\x9c\x05\x20\x0f\x99\xb2\x8c\x89\x19\x59\x92\x19\x90\x85\x98\xb9\xc9\x0a\x4b\xb7\x8c\x06\xfc\xd8\x0d\xb3\x67\xa9\x9f\x05\x7d\xf6\x23\x7f\x86\x9e\xa4\x7e\x1e\xf4\x11\x48\xc2\xec\x19\xda\xcf\xfa\x07\xe0\xe0\xa7\x64\x6f\x2f\xf9\xa9\x77\x70\xf8\xcc\xfb\xa9\x73\xf8\x5f\xbd\xfe\xdb\x08\x4f\x7b\x79\xb6\x48\x63\xff\xf0\xe0\xe0\xfb\x24\x78\xe2\xfd\x57\xaf\x34\x37\x15\x47\x83\x8a\x77\xd1\x3b\x1f\x06\xcf\x0e\xfa\x4f\x36\x8a\x06\xc9\xe6\xfc\x58\x4e\x79\xdd\x09\xb3\xf4\x61\x68\xed\x55\x95\xce\x66\xdf\x02\x75\x24\x63\x1b\x6c\x47\x26\xa9\x39\xfb\x06\x9e\x35\x39\x67\x77\xf2\xbe\x3d\xcc\x6b\x1c\x74\xfe\xe3\x5f\xff\xfa\x52\x77\xf9\x3d\x5f\xe3\x97\x59\xb2\x98\xc1\x2e\x0d\x41\xbc\xfd\x3d\xce\xf7\xd1\x0d\x8b\xbf\xd0\x47\xa1\xe7\x01\x54\x1c\xc3\x9c\xfa\x19\xf5\x53\xc0\xd0\xbd\xbc\xc6\x30\x2d\x50\x96\xea\x9b\xec\xd3\x77\x37\xa8\xfc\xee\x26\x7d\x96\xf7\x3d\xaf\xfc\xb4\xf9\x8c\xfd\x4e\x71\xd0\xb0\x01\xb5\x84\x48\xfd\x35\xb9\x62\xdf\xe6\xd9\xac\xbb\x99\xc8\xd7\x68\xfa\xd0\x18\xf1\x3c\x9b\xbd\x5c\x53\xf6\xab\xb5\x59\xc5\x90\x53\xc5\xd7\xfa\x52\x1c\xd9\xec\xab\x9c\xcd\xe6\x11\x3b\x75\xa5\x6e\x61\xee\xe4\x2b\xd5\x92\xd6\xc3\x9c\xb4\x07\x37\x69\x31\x55\x4e\x83\x81\xba\xb9\xfa\x4a\x0d\x05\x9a\x26\xab\xbd\x49\xce\x64\xb5\xe9\xd7\x34\x2a\xba\x29\xbc\x5e\xd7\x5e\x50\x36\x7b\x60\xb3\x37\x8d\x8a\x77\x74\xb4\x2d\x61\xf2\xfa\x6d\x66\x71\x9e\xc3\x4b\x94\x2d\xd6\xbd\xe7\x8d\xa6\x0f\x6f\x36\x8f\xe5\xa8\xdb\xcf\xa8\x68\xb3\x72\x56\xf1\x2c\xa1\x0a\xe2\x35\x8d\xee\x54\xbb\x87\x36\x9f\x78\x96\x9c\xd0\xf1\xb6\x9d\x4c\xde\x60\xe5\x4c\x2e\x66\x51\xba\xbe\xf5\xa2\x6c\xf6\xd0\xe6\x51\x0e\xb7\xed\x3c\xf2\x06\xab\x0c\x97\x50\xba\xae\xe9\x22\x69\xf1\xc0\x66\x8f\x0e\xb2\x25\x3c\x94\xae\x34\x5d\xe4\xf9\x9d\xd7\xbd\x17\x65\xb3\x87\x37\x7b\x7c\xb8\xed\xa7\x90\x36\x58\x3d\x8f\x09\x4a\x61\xb7\xb8\x9c\xb4\x15\x19\xb0\x39\x56\xed\x9c\xa0\x2c\x6f\x75\xde\xca\x1d\x6f\x99\xc9\xdd\x92\xed\xb3\x38\x83\x44\xc9\x17\xf6\xf6\x04\x6b\xf5\xcc\x60\xb3\x1c\xf2\x86\xdc\xb2\x21\x67\xe3\x38\xb9\x9c\x04\x2a\x53\x1f\xc8\x01\x26\x13\xd9\xcf\x25\xb7\xfb\x9a\x46\x75\x18\x46\x79\xd1\x9b\x45\x17\xf0\xe7\x6c\x91\xc6\xaf\x9d\x42\x8d\x55\xb0\x21\xa0\x0f\xd8\xf4\xf6\xf6\x86\xdd\x14\x34\x63\x48\x98\xac\xcc\x4e\xa3\x66\x1e\xc3\xbc\x80\x6b\xfb\x67\xa8\x76\x5f\xe5\x71\x58\x31\xe6\xcb\xec\x62\x5d\x07\x0d\xde\xe8\xab\x1c\x6d\xd3\xe1\x67\x43\x6d\x7d\xf4\x49\xf5\x95\xf3\x57\x74\xa3\x71\x8d\x8d\x06\x93\x80\x55\xab\x7e\x95\xf3\xb6\x72\x94\x79\x1e\x39\x99\x7a\x37\xf3\x26\x5b\x7c\x95\x83\x6d\xd8\x24\xc5\x73\x36\xd0\xb6\xbb\x84\xd5\x6f\x31\x81\x43\x38\x66\xc9\x1d\x5a\xec\x13\x5e\xf7\xab\x9c\xbb\xd5\xe3\xc4\x57\xd0\x6d\xd5\xe2\x1a\x28\xab\xfc\x20\x47\x3a\x4a\xd0\x7c\x98\x45\x79\xdc\x2d\x16\xf3\x39\xcb\x5b\x5b\x43\xc3\xcb\xaa\xab\xda\x7f\x95\x13\xd1\x74\x5c\x8e\xc4\x20\x4e\xd4\x1c\xb4\x3e\x3b\xd5\xc6\x2d\xa6\x1d\xce\xe6\x78\xbd\x9b\x88\xb5\xf8\x2a\xa7\x76\xe5\x60\x99\x21\xe5\x3a\x83\x7d\x88\xf6\xa2\xa8\x78\xb9\x96\xc5\x28\xaf\xdf\x62\x02\x85\xd5\xf1\x5d\x9a\x5d\x70\xd3\x63\x16\xd8\x9d\xbf\x00\x3e\x0e\xf6\xf6\x98\xd2\x39\xc4\x7b\x7b\x1e\xc7\x1b\xfe\xff\xec\xbd\x6b\x5b\xdb\x48\xd3\x30\xf8\x9d\x5f\x41\xb4\x59\x2e\xe9\xbd\x1b\x27\xf3\xbc\xcf\xbb\x1f\xfc\xac\x26\x37\x01\x92\x21\x13\x0e\x13\x48\x32\x33\xde\x5c\x8c\x2c\xb5\x6d\x81\x2c\x29\x52\x0b\x30\xe0\xff\xbe\x57\x1f\xd4\x67\xf9\x80\xcc\xdc\x30\xf1\x7c\x98\xe0\x3e\x54\x75\xb7\xba\xab\xaa\xab\xaa\xab\x7c\x34\xc9\x61\x36\xd8\x44\x0f\x31\x82\xc4\x25\xed\xf4\x38\x5e\x18\x71\xb9\x5d\x06\x63\xb8\x9d\x15\xcb\xc8\x30\x6a\x97\x27\xb9\xcf\x16\x9d\xf5\x32\x2c\x59\xeb\xf3\x6c\xe7\xbd\xf8\x6c\x9f\xe1\x1c\x2f\xb2\x78\x59\x77\x5a\xd2\xe5\xf9\xcd\xf4\x12\x4e\x96\x55\xda\x90\x2e\x4f\x72\xa6\xcd\x30\xe9\x34\x17\x04\x88\x1b\xcf\x5b\xb7\x24\xb8\x9d\x60\xc1\x2b\xbc\x5c\x1d\x4b\x20\x01\xb7\xfe\xa7\xe7\x04\x0e\x70\xfa\x15\x42\x59\xea\x7c\xe3\x9a\x23\x37\xee\xa0\xa0\x18\x42\xd4\x41\xc1\xf0\x28\x18\xc3\x0e\xca\x3e\x66\xd7\xb0\xd8\x0d\x4a\xe8\x7a\xde\xfd\x3d\x7a\x60\x74\x2e\x3c\x95\x5d\x3c\x93\xc7\xe1\x0e\x49\x16\xda\x53\xbf\x12\x75\xb4\xd2\xec\x99\x6d\x2a\x32\xb3\x05\xe1\x25\xd9\x5c\x1d\x6a\x82\xbf\x66\x18\x94\xcb\x2a\xf0\x45\xbf\x67\xb7\x7e\x7c\xc2\x0b\xaf\x22\xeb\x31\x77\x2d\x97\xb0\xa5\x27\x4f\x54\xdf\x36\x63\xe1\x16\x07\x37\x9f\x03\x24\xcb\xd8\xd2\x93\xe7\x67\x4b\x4f\x96\xb0\xa5\x27\xf3\x6d\xe9\xe3\xe0\x01\x5e\x29\xac\xd3\x93\x5c\xb9\x79\xb3\x5d\x7e\xaa\xcf\x71\x9e\x30\x8a\x03\x7b\x0c\x8a\x32\xcf\xd2\x32\xbe\x82\x5a\xdb\x27\x39\xc7\x66\x98\x6c\x82\x0b\x42\x24\xad\xe7\xae\x19\x91\xf6\xb7\x83\xc8\xaa\xad\xd2\xee\x02\x52\xe3\x27\xb9\x72\x8b\xcc\x34\x0c\x12\x98\x46\xc1\x22\xf7\x5b\xbd\xc7\xb3\x9d\x73\x14\x0f\x06\x8b\xcf\x97\xb4\x7e\xbe\x73\xb5\x3e\xdc\x9a\x39\xdf\x86\x47\x5a\x4f\x66\xce\xcd\x5e\x0e\x6c\x06\xd4\x3d\x76\xf1\x19\xb3\xf6\x4f\x75\xbe\x73\xbf\x31\xf1\xb8\x4d\xb3\xeb\x25\x66\x5c\xf7\x78\xd6\x73\x5e\x6e\xbe\xcf\x77\xae\x65\xd5\x47\x45\x43\x68\x44\xfb\x7c\x79\x8f\x67\x3b\x67\x94\x59\x9e\xe5\xce\x9a\x72\xdd\xe1\x39\xcf\x78\xa9\x33\xcc\xda\x3f\xe3\xf9\x2e\x33\xd7\xe7\x3b\xcf\x2a\x8d\x6f\x16\x98\x29\x69\xf6\x5c\x27\xb9\xf0\x97\x7c\x86\x33\x7c\x80\x93\xf9\x73\x74\x30\x4f\x97\xf1\x2e\x4f\x17\x70\x2d\x4f\xb3\xa5\xa3\x02\x92\x2e\xcf\x6d\xdd\xc8\x34\x17\x5d\xb7\x2c\x9b\x1b\xf1\x2d\xcd\xd0\xf6\x32\x31\x90\x68\xfb\x67\x68\xd7\x4e\x33\x44\x0c\xd5\xbf\x30\xb7\xcf\x85\xd7\x50\xee\xb6\xc0\x6a\x2e\xb5\x94\xcf\x70\x11\x97\x59\xb9\xf9\xcb\xb5\x88\x04\xf2\x3c\xe5\x0e\xea\x75\xb0\x6d\xbf\x19\xce\xa0\x4a\xa2\xdf\x93\x9c\x73\x33\x4c\x3a\xf0\x9d\xc5\x81\xd6\x1d\xe6\xae\x64\x8e\x7b\xda\x7d\x6f\x66\x2d\x64\xdd\xed\xb9\xad\x23\x9f\xee\xa2\xeb\xc8\x3a\xcc\x5d\x47\xab\xda\xcd\x4e\x9b\xb2\x27\xaa\x70\x9b\xb1\x6c\x8b\xd3\xf4\x6c\x2e\x1d\xcf\x83\x21\xdc\x46\x31\x4a\xac\x57\x42\x51\x6b\xeb\xd0\x7e\xdd\xac\x26\xe4\x58\x98\x90\x25\xc3\x71\x3c\x7b\x1a\xb0\x18\x64\x85\x55\x73\x61\xcb\x41\x53\x37\x7f\x92\x5f\x7e\xf6\x44\x0d\x2f\x82\xb9\xe4\x81\x74\x79\x92\x33\x6d\x86\x49\xa7\xb9\x20\x40\xdc\x78\xfe\xba\xe5\x70\x9b\xa6\x00\x5d\x7a\xf9\x44\xcf\x27\xb9\x8a\x73\xe7\xfd\x80\x09\x3f\xcd\x99\xce\xda\x2f\xf9\xe2\x96\x5b\xdc\x78\xee\xba\x25\x55\x11\x98\x89\x90\xe6\xbf\xad\x1a\x24\x30\x44\x26\x53\x69\xca\x9b\x97\x4a\x79\xf3\x7e\xf2\x7d\x3f\x7d\x83\xba\xe4\xb9\x11\x1f\x80\xe7\x3e\x2c\xeb\x27\x07\x40\x05\xfa\xe6\x28\x20\x86\xc3\xce\x12\x51\x40\x1e\xf8\xc6\xf9\xb9\xbe\x6f\xce\x97\x7d\xdc\x9c\x2f\xf8\xb2\xf9\x7b\xbe\x1d\xc1\x12\x16\xf1\x52\x7b\x4e\x0b\x01\xf4\x3d\xdf\x16\x20\x1e\x96\x83\x45\x8c\xe1\xa1\xdb\xee\x7b\xbe\x27\x80\xac\x3e\xef\x8a\x32\xc7\xff\xd4\x32\xad\x60\x91\x4e\x1f\x71\x89\x2a\x58\x2d\x4b\xf3\x69\x9f\x67\x76\x1a\xd9\x44\x17\x84\x48\x5a\xcf\x3b\x87\x45\x90\xea\x01\xe9\xe6\xae\x1d\xed\xf3\xcc\xd6\x8e\x4d\x74\x41\x88\xa4\xf5\xdc\xb5\x83\x51\x15\x2e\xbd\x78\xb4\xd3\x93\x5c\xbd\x39\xb3\x25\xda\x8b\xa5\xdd\xbb\x44\xbf\xa7\x3a\xe7\x66\x3f\x80\x02\xe6\x70\x69\x35\x0f\xeb\xf4\x24\x67\x3b\xe3\x7c\xb0\xa9\x2e\x7a\x40\x48\xf3\xf9\x7b\xe6\x0a\x16\x0d\x3e\xbb\xb3\x16\x90\xf6\x7a\x92\x2b\x38\x73\xbe\xe5\xa8\x1a\x0c\xec\x9a\x85\x19\xf3\xad\x7b\x3d\xc9\xf9\x36\xc3\xe4\x93\x5d\x10\x26\x6b\x3f\x77\x0d\xe3\x74\x58\x25\x41\x53\xaa\x39\x7e\xe1\x78\x95\xc4\x7d\x6b\xa7\x27\xa4\xa5\x29\x93\x78\x69\x06\x41\xfb\x3c\xc9\xbd\x30\x7b\xae\x59\xf1\x00\xee\x50\xf7\x7a\x7e\xf3\x45\xc1\xd2\x21\x1d\x48\x97\xe7\x38\xd3\xb2\x41\x05\x67\x2a\x1a\x49\xdb\x67\x38\xc5\x18\x25\x70\xf9\xf0\x50\xbc\xdb\x93\x9c\x71\x33\x4c\x31\xdd\x05\x81\xd6\x1d\xe6\xae\x63\x36\x1c\x26\x0f\xd4\x3b\xaa\x7d\x9f\xe4\x8a\x2e\x30\xf7\x07\x4d\xfa\x69\xce\x76\xc6\xfe\x61\x53\x5d\x74\xf7\x90\xe6\x73\xd7\xaf\x88\xed\xf6\x8c\x19\xe7\x0f\x77\x79\x6e\x6b\x47\xa6\xb9\xe8\xca\x15\xf1\x78\xfe\xba\x55\x69\xd8\xe0\xe2\x38\x73\xed\x58\xb7\x67\xb7\x7e\xf5\x74\x17\x5e\x43\xda\x61\xde\x3a\x56\x69\x04\x8b\x32\x6c\x78\xac\x3e\x63\x25\xa5\x8e\xcf\x6c\x2d\xe5\x29\x2f\x08\x56\x74\x99\xbf\x9e\xcb\xf3\x00\xda\xe7\x49\xae\xe2\xbc\xb9\xfe\x83\x7d\x33\xab\x3c\x7f\xd0\xe3\x5b\xd1\xef\x49\xce\x79\xc6\xb9\x10\x13\x5e\xf4\x58\xd4\x3d\xe6\xae\x25\xb2\x06\xd0\xd4\x37\x0a\x7a\x76\x0f\xbe\xc9\xc4\x16\x5d\x2d\x34\xf7\xc1\x37\x99\xc6\xb2\x66\x36\xd6\xe9\x99\xad\x5c\x3d\xd5\x05\x41\xd2\xe6\xf3\xd6\xcf\xea\x7e\x37\xe3\xac\x3e\x51\x47\xbc\x66\x98\xd7\x0b\x43\xbb\x9e\xbb\x56\x71\x92\x6c\x47\xb0\x44\x45\x66\xd5\x5f\x34\xe4\x5a\x57\xba\x3d\xc9\xd5\x9b\x33\x6b\x34\xca\xaa\x65\xb5\xdb\x75\xaf\x27\x39\xdf\x19\xbb\xa5\x9e\xec\xa2\x7b\x86\xb6\x9f\xb7\x86\x37\xdb\x71\xb8\x78\x32\xbb\x87\x84\xa3\xb5\x84\xa1\x95\x2c\xb6\x05\x5d\xfb\x3a\xff\x0a\xec\xbd\xfe\x06\x12\xbf\x87\x3a\x61\x12\x94\x25\x70\xe8\xe8\xfe\xc2\xff\x6c\xc7\xe5\xf6\xcb\xbb\x62\xfa\xd7\x37\x92\xe7\x29\x08\x91\x5b\x67\x30\xdb\x74\xbc\x05\x82\xca\xde\x11\x98\xdd\x64\xfa\x20\x0b\xf0\xcd\x41\x98\xa5\x7e\x61\xd7\xad\x26\xaa\xed\xb7\x90\x6d\xbf\xc9\xec\x0f\xb0\x8c\xeb\xe3\xcd\xf3\xf3\x7d\xbc\x59\xc2\xf9\xf1\xa6\xd9\xfb\x31\x4e\x63\x44\xcd\xef\x45\xf9\x2a\xc8\xf3\x6d\x98\x5e\xc9\xeb\xa6\xac\x8a\xb4\xbf\x90\x5b\x6f\x2e\xa8\x64\x00\xba\xbf\x17\xbf\x5e\x7f\xdb\x80\x9d\x38\xc5\x13\x70\x9d\x30\x4b\x51\x91\x25\x09\xd9\xef\x61\x96\x0e\x62\xbc\xa5\x4b\x58\x5c\xc5\x21\xec\xb2\x02\x12\x75\x8d\x77\xe0\x99\xcf\x9b\xdb\x3f\x28\xac\x1b\x9f\xb2\x8f\x9a\x34\xfa\x77\x69\x30\x86\x5d\x07\x2f\x48\x8d\x5b\x74\xeb\xa2\xe9\x5c\x45\xbf\xb1\xae\x28\xbb\x54\xc3\x72\x3e\xce\xca\x32\x34\x7c\xa1\xe8\xef\xa6\x75\x6d\x68\xfd\x37\xac\x2a\xc3\xdc\x62\x51\xf1\xb4\x83\x38\x85\xc5\x76\x04\xfb\xd5\x70\x3b\x88\x82\xbc\x21\x8c\x5e\x01\xcb\x2c\xb9\x82\xc5\xab\xfa\x8f\xf2\x15\x21\x59\x71\xd8\x08\xe5\xd1\x6c\x45\x6c\x0d\x1a\x47\x2f\xe6\xe8\x7a\x77\x6e\xf3\x06\xf0\x3a\x05\x1c\xc6\x25\x82\x85\xdb\x04\xac\x3b\x0e\xe2\xd4\x91\x12\x69\x4d\x97\x5c\x62\x21\x1b\x8e\xe3\x42\xcb\x4f\xa8\x6d\xdf\xd5\x2c\x0f\xaa\x97\xc7\xc4\xac\xac\x8b\x32\x11\xb4\xe8\x44\xa2\x00\x05\xf4\x7f\xd6\xbd\xf2\x6f\xd1\xea\x15\x59\xc7\x57\x25\x44\xd5\x13\x7d\x2e\xb6\xcc\x9c\x6d\x47\x82\x96\x4b\x3f\xe8\x64\xb7\xf9\x56\x7a\xcc\x04\x7a\xca\x47\xa6\x23\x91\x08\x01\xcf\xc5\x36\xd5\xa2\xa5\x99\xee\x18\x96\x09\x8b\xd0\x33\xdb\xfd\x02\x06\x97\x79\x16\xa7\x7a\x72\x3c\x23\x48\x8d\x02\x47\x94\x3f\x05\x8b\xb1\x3a\x45\x32\x85\xed\x20\xcf\x93\x38\x24\x31\x34\xb6\x87\x49\xd6\xb7\xbe\x93\x91\x05\x46\xca\xc3\x5e\xc1\xf4\x2a\x2e\xb2\xd4\xf6\x4c\x56\x73\xf7\xf3\xee\xf0\x38\x67\x32\xa0\x78\xe0\xbe\xf8\xe9\x85\x2f\xa5\xce\xa3\x03\xd8\x11\x83\x7b\x4f\xc6\x46\x61\xa5\xb8\x03\xd1\x2b\xe2\x09\x46\xce\x8b\x3a\x34\xeb\x75\x9c\x46\xd9\xb5\x97\xfa\xf4\x8f\x0d\x98\x94\x70\xb3\xa1\x2d\x9d\xac\x97\xfa\xf4\x0f\xd2\xf6\x4e\x6d\xcb\x43\xbe\x96\x30\x19\xb0\xec\xbc\x1b\xa9\x8f\x7f\x4d\x89\x37\x21\x48\xe6\x0f\x79\xa3\xf0\x1d\x7a\x1d\x16\xf0\x92\x37\x49\x57\x38\x08\x9f\x92\x5a\x2a\x4d\xc7\x83\x89\x2b\x40\x8e\xc9\x2e\x38\x29\xe0\x20\xbe\xf1\x40\xda\x2b\xbe\xdd\xdf\xbb\x29\x49\xd0\x00\x60\xa7\x80\x59\x0e\x53\xf7\x0e\x5f\x11\xf7\xe8\x0d\x51\x3e\xe9\x68\x14\x97\x9d\xf3\xb2\xca\x61\xd1\xc1\x5f\x79\xe2\xe2\x12\xc0\x17\x1e\x6f\x90\x04\x22\xb8\x89\x01\x4e\xa7\x9e\x37\x6d\xc9\xab\x1b\x7d\x2e\xeb\x33\xda\xbc\xe3\xa4\x23\x9b\x4e\xe7\xfa\x64\x2a\xfb\x78\x50\x04\x43\x1a\x46\xa2\x76\xfe\xd4\x68\xb1\xb8\xea\xf0\x06\xa2\xd7\xbc\xb0\x90\x50\x62\x8d\xa2\x7f\x77\x9b\xf7\x97\x59\x62\xbb\xe5\x6b\x8c\xfd\xc8\x96\xcf\x3a\x51\x99\xd6\xe9\x34\x6e\xce\xc2\x8d\xb3\x08\x26\x7c\x22\x56\xb2\x46\x18\x9c\xd1\x6e\x46\xe5\x2b\xcb\x5b\xf2\x47\xa0\xf6\x35\xbe\xb3\x22\x48\x4b\xfa\x44\x89\x04\x31\x6e\xe2\x03\x3a\x9b\x5f\x60\x75\x28\x0b\x63\xb2\x43\x60\x37\x31\x04\xe9\xec\x3e\x4f\x92\xdb\xcf\x4a\xab\x51\xcf\x65\x89\xd4\x1a\x75\x97\x66\x39\xa2\x44\x41\x1a\xc2\xed\x05\x04\x8a\xbf\x43\x0e\x9c\xb7\x35\xec\x12\xe0\x38\x08\x47\x71\x0a\xcb\x57\x10\xa3\x23\xb4\x4b\x3b\x30\x37\x25\x5a\x8d\x9d\xb3\x81\xcb\x13\xdd\x45\x58\xc0\x00\xc1\x43\x3a\x18\xcf\xbd\x8b\xa3\xae\x23\x8d\xe8\xbc\x8a\x1d\x80\xa5\x2e\x78\x83\xba\x77\xa2\x82\xa4\xd0\x9e\x02\xcc\x7c\xba\x4e\x1e\x14\x41\x92\xc0\xc4\x01\x64\xc4\x65\xf7\x0e\x91\xaf\x7c\xc7\xd6\xa4\xeb\x54\xe9\x65\x9a\x5d\xa7\x0e\xc8\xd2\xee\xdd\xd1\xfe\xef\x67\xdd\x3b\xea\x2f\x51\x76\x7b\x4e\x01\xbf\x57\xb0\x44\x47\xf0\x06\x9d\x10\x61\x9a\x0c\xac\x84\x69\xe4\xb9\xce\xe1\xf1\xde\xce\xc7\xf3\xdd\x8f\xc7\xa7\xfb\x8e\xf7\x6d\x0a\x4e\x3e\xed\x7f\xb1\x74\x3e\x29\xe0\xd5\xfc\xce\xbb\xbf\xec\x1c\xbd\xdf\x3f\x3f\xd9\x79\xbf\x7f\x7a\x7e\x7a\xf0\xe7\xbe\x0c\x29\x1c\x05\xe9\x10\x62\x20\xa7\x64\xbf\xce\x02\x74\x78\xbc\xb7\xff\xf1\xfc\xf3\xc9\xde\xce\xd9\xfe\x5e\xd7\xf9\xbf\xea\xf9\x4d\xf9\x0a\xb0\x92\x2e\x59\x50\x3e\xfd\x20\xb9\x0e\x26\x65\xb7\x77\x47\xc3\xfe\x76\x1d\xba\x77\xc2\x2c\x8d\xba\xce\x28\x28\xf7\xf0\xcf\x29\xe0\xd5\x34\x39\xc1\xf4\xdb\x14\xe0\x86\xdd\xbb\x29\x20\x25\xdd\xbb\xe9\x74\x0a\xca\x38\x82\xfd\xa0\xb0\x2d\xb3\x31\x0a\x03\x31\xe6\xf3\x35\x62\x06\xe8\xa0\x3c\xc6\x85\x12\xfa\x30\xc9\x4a\x48\xd0\xe3\xe6\x12\xa2\x7e\x55\x4e\x1c\x00\x6f\x62\x44\x3e\xc1\x38\xbb\x82\xbb\xc4\xa5\x0a\xed\xf3\x2d\xf2\x5b\x05\x8b\xc9\x49\x50\x04\x63\x48\xaf\xac\xf5\xa0\x70\x67\x0c\xeb\x2a\xbb\x84\xdd\xbb\xb2\x08\xbb\x4e\x92\x05\x91\xe8\x89\xb7\xc9\x5e\x96\xc2\xae\x53\x56\x61\x08\xcb\x12\x17\xec\x17\x45\x86\xa9\x31\xfe\xc7\xc1\xb3\xa7\x55\xdd\x3b\x98\xa2\x62\xd2\x25\x5f\x0b\x4b\x3b\xc3\xd4\x73\xe5\x8d\x4a\xce\x8c\xff\x33\xea\xe0\x15\x9c\x7a\x64\x07\x7e\x3c\xde\xd9\x3b\xdf\xff\xb2\xf3\xf1\xf3\xce\xd9\xc1\xf1\x51\x97\x4f\x98\xce\x4b\xec\x89\x2a\x8f\x02\x04\x9b\xe7\x84\x3f\x03\x19\x51\xc3\x30\x48\x95\x6d\x04\x9f\xf6\xcf\x3e\xfd\xc1\xf0\x61\x20\xb8\x4c\xda\x64\xf5\xd2\xd7\x3b\x16\x8f\x55\xfa\x78\xac\x92\x6f\x9b\xa3\x4c\x5a\x7d\xfc\xbd\xa6\x80\x34\xe9\xde\xcd\x9c\x2d\xdd\x03\x4b\xcc\xb6\x61\x38\xf2\x5e\x1a\x05\xa5\x3e\x16\xfc\x1f\xb8\x63\x4a\x9c\xb2\x7b\x17\x94\x93\x34\xdc\x54\x3f\x79\x89\x89\x26\xb0\xd5\x10\x6a\x0a\x86\x55\x50\x44\x65\xf7\x4e\xd9\xaa\x5d\xd7\xf3\x7f\x7e\xf1\x13\x60\x07\x87\xfe\x7c\x0d\xf4\x05\x11\xe9\xaa\xa5\x6d\x11\x8b\x84\xd4\x2f\xe2\x29\x50\x87\x3d\xaf\xc7\x66\x3c\x05\x69\x86\xde\xe2\x8d\xcc\xe4\x11\xff\xe7\x17\x71\x87\xec\xf0\xce\x38\x40\xe1\x08\x96\xee\x1d\x3f\xa0\xe4\xf4\xd4\x1f\xdb\x9b\xf2\x25\xbf\x9b\xbd\xe2\x64\x4d\x16\x3a\x5d\x64\x91\xa6\xde\xdc\xeb\xda\x38\xbe\x89\xd3\xf2\x15\x89\x71\xbe\x9d\x55\x08\x8f\xb0\xc1\xe0\x26\x1a\xd0\x5e\x4f\x53\xf4\x98\x35\xcb\x12\x06\x45\x38\xc2\xb0\xac\x86\x0e\x1a\xec\x81\x4d\x4e\x2b\x35\x5a\x85\xd9\x38\xaf\x48\xfe\x1a\x67\x50\x95\xb0\x73\x61\xb5\x70\x80\x62\x55\xdc\x59\x4a\xb3\xc7\x58\xb4\x7b\x47\xe7\x73\x06\x8b\x71\xd7\x71\x40\x12\x97\xe8\x2c\x3b\x25\x65\xf4\x25\x6a\x3d\x46\x39\x03\x5f\xbd\x68\xbd\x6f\x78\xa5\x28\x04\x3c\xa8\x92\x30\x70\x00\x6f\x82\x10\x1d\xe2\xfd\x7a\x2a\x55\xb9\xaf\x41\xda\x29\x60\x10\x95\x1e\xbe\xa2\xf0\x0a\xc7\x03\x05\x1c\xc2\x9b\x05\xdb\x0e\xaa\xdb\xdb\xc9\x82\x6d\xc5\x40\xf6\x53\xfc\xc5\x22\xfc\xf9\x25\x00\xbc\xf4\x27\xc0\x82\xe7\xbf\x13\x95\x87\xf4\xc0\xe1\x4a\x32\x3e\x09\x44\x01\x4b\x88\xa5\x8a\x38\xad\x89\x09\x4d\xc3\x42\x6e\xb2\xd4\x0b\x98\x08\x1d\x5b\x5b\xa4\xa4\x84\xc8\x75\xa4\x62\x07\xfc\xe4\x4d\x01\xfe\xe2\xfa\x12\x3b\xfa\xec\x3a\xbd\x6f\x0e\x4f\x22\x69\x0e\xce\x01\x8e\xfc\xc5\x48\x6b\xf3\x33\x6d\xa6\xf0\x7a\x93\xe7\x3f\x24\xb7\xeb\x8e\xdc\x0d\xdc\x95\xa3\xac\x4a\xa2\xd3\xac\x40\x78\x7a\x68\x54\xc0\x72\x94\x25\x51\xb7\xf3\xdf\x20\xc9\xe8\x15\xb8\xfb\x1a\x44\x31\x15\x91\xbb\x3f\xbd\x7e\x0d\x88\x32\x1b\x5f\xe7\x5e\xbc\x06\x84\x36\xed\x24\xc9\x19\x2e\x2b\x69\xc9\xcd\x49\x80\x10\x2c\xd2\x8f\x30\x1d\xa2\x51\xf7\x7f\xff\x17\x18\xc7\x29\x19\xf6\xee\x28\x28\x58\x29\x5f\xf7\x7a\xb1\xc9\xd8\x1a\xa7\x0b\x2e\xe1\x84\xb5\xd1\x17\xea\xfe\xbe\xf7\x0d\x9f\xec\x77\x9c\x37\x93\xa5\x1d\x42\xe4\x91\xdf\xf4\x50\xe3\x59\xd3\x4e\x30\x32\xd6\xde\xd8\x2d\x98\x70\xd9\xb6\x32\xfd\x28\xf8\xfb\x91\x7f\xf4\xed\xa4\x16\x3e\xf4\x33\x3a\xf2\xa6\xab\x7f\x1a\x20\xc5\xe9\x55\x3f\x7c\x6d\x4c\x61\xfb\xaf\x6e\x44\x5c\x28\x5d\x8f\xe8\xb1\xe0\xfd\xfd\x0b\xd8\x49\xc8\x87\xf0\x6a\x22\xa8\x6f\x8d\x0d\x0a\x08\xf9\x3d\xa2\xfc\x22\xf5\xc6\x3a\x6d\x6d\xa1\x4e\x5e\x95\x23\xb7\xd3\xe9\x28\xc4\x2b\xf5\xee\xe2\x81\x6b\x20\xe9\x0c\xe2\x04\xb3\x17\x17\xf9\x3f\xa7\x9d\x32\x1b\x43\xd7\x4d\xe5\x0f\x86\x7b\xfa\xbe\x0f\x3d\xcf\xf3\xa6\x18\x92\xb1\x63\xb5\x81\x48\xeb\xe2\x79\x40\xdf\x20\x6c\x98\x34\x5d\x69\xec\xb3\xea\x12\xb2\x85\x71\xa1\xb7\x31\x7b\xdf\x6d\x6d\xb9\xb1\x1f\x77\xc6\x41\xee\xba\xd0\xff\xf9\xae\x5e\x14\xd8\x89\x11\x1c\x6f\x88\x47\x3d\xf8\xa0\x0f\x2c\x9f\x97\xb3\x6f\x0f\xe0\x7b\x9b\x07\xc4\x82\xc5\xde\x54\x5e\x7c\xf9\xab\x2f\xba\xae\x77\xa8\x98\x70\xab\x37\x3e\xeb\x9f\xe0\x70\xff\x26\x27\x57\x65\x6e\xcc\x96\x96\x1d\x8a\x65\x47\xfe\xcf\x45\x07\xc1\x12\xb9\xea\x71\x21\xff\x4d\x43\x3c\x68\xb7\xf0\xee\xa6\x9c\xde\xcf\xf8\x1c\xfa\x0e\x25\xd3\xac\xd2\xf8\xbb\x8b\xcf\xde\x74\xbe\x19\xbb\xe6\xb0\x59\x41\x6e\x7a\xdb\x83\x20\x44\x59\x31\x59\x84\xcf\xd6\xda\xdf\x06\x7e\x4b\x4c\x1b\x8f\xc0\x5b\x25\x70\x45\x7d\xe8\x12\x1f\xf2\x9d\xf2\x17\x5b\xa5\xac\x40\x9d\x7f\xc3\x20\x1c\x75\x5e\xde\xc1\xe9\x5f\x9e\xf4\x51\x0c\x7e\x9c\x15\xa8\x1e\x04\x65\xa7\xb8\x64\x0f\x96\x21\x4c\xa3\x38\x1d\x62\xea\x2a\xa0\x52\xee\x37\x9f\x47\x9f\xd7\x8b\xfa\x8e\xae\xe9\xd7\xa0\x48\xe3\x74\x78\x52\xc4\x29\xa2\x0c\x90\x90\x46\x92\x10\x4f\x87\xd9\xe9\x74\x12\xe0\xcc\x86\x20\x28\x18\x9e\x2a\x25\x4d\xca\xb0\x59\x41\x3d\x33\x95\x5a\x61\x72\xc4\xb4\xc0\xb3\x90\x6c\x6d\xbd\x10\x2a\x67\xbc\x69\xe3\x74\x48\x0f\x35\xf4\x9d\xcf\x65\x9c\x0e\x37\x4f\xd5\xfe\x9b\xcc\x73\x65\x33\x67\x78\x37\x31\x07\xd9\x1c\xc3\x20\x2d\x37\xd1\x08\x6e\xe2\x41\x6f\x5e\xc7\x49\xb2\x99\xa5\xc9\x64\x13\xa3\xdf\xbc\x1e\xc1\x94\x54\x8e\xc9\xe6\x29\x37\xe9\x1d\x1e\x6c\xa6\x19\xab\x0c\xd2\xc9\x66\x36\xc0\x6d\xe2\xa2\x06\x1d\xc3\xba\x61\xc7\xd9\x28\xb6\xb6\x5c\xf8\x2f\xdf\xd9\x3c\x1b\x41\x3e\xa6\x4d\xb2\x59\x37\xe3\x72\x33\x82\x79\x01\xc3\x00\xc1\x68\x33\x4e\x37\x07\xc1\x55\x56\x60\x78\xda\xe0\x3b\x0e\x23\x65\x84\xac\xcc\x5b\xff\x17\xaf\xbd\xa9\x42\xf5\xa5\xef\x21\x5c\x5c\x30\x90\xb7\x54\xc1\xde\x91\xbf\x87\xd8\x90\x75\x8d\xf8\x74\x6f\x60\x87\x3d\x42\x75\xbd\x2e\x24\x47\x79\xba\xc8\xf9\x6d\xd0\x6e\x37\x9d\xf2\xc7\xd5\x48\xd5\xba\x6f\xb7\xf7\x0d\x2f\xd5\xa2\x77\x1a\x6a\x9f\xd9\x2e\x60\x19\xdf\x2e\x29\xf3\x17\x55\x9a\x90\x28\x96\x2a\x11\xd2\x7b\xc1\x2b\x98\x5a\xd2\x70\x3e\xbe\xe0\x4f\xa7\xf6\x09\xcf\x0c\xd2\x94\xd8\xf4\x6a\x48\x94\xc3\x5f\xa5\x4a\x4c\x0f\x8a\x4e\x96\x7a\xae\x13\xc5\xd1\x41\x5a\xc2\x02\xed\x27\x90\x5a\x15\xe4\x63\x4c\xa3\x63\x60\xd9\xaa\x4a\xe0\x71\x1a\x42\xcf\x75\x88\xba\xfb\x13\x71\x19\x74\xc8\x6e\xa6\x5b\x3a\x88\x22\x0a\xfc\x63\x5c\x22\x98\xc2\x82\x88\x67\x46\x69\x6d\x1d\xa2\x27\xc0\x32\x62\x0a\xb3\x63\xa9\xe9\xf4\xe3\x34\x22\x1b\xdd\xf3\x00\xad\xc7\x58\xf7\xf1\x72\x73\xf0\x0e\xf9\xb0\x90\x41\xb1\x21\xf0\xea\xbb\x72\xc3\x8a\x48\x36\x2d\xeb\x9a\x30\xcc\x14\xc6\xf2\xc8\x97\xe1\x9b\x98\xd6\x6d\x73\x4f\x97\xed\xab\xb8\x8c\xfb\x71\x12\xa3\xc9\x76\x04\x11\x6c\x7a\x84\x36\x6f\x1b\xff\x47\x77\x6d\x6c\xec\x5a\x31\x2b\x63\xcf\xee\x65\x21\x31\x18\x7e\xe1\x4d\xa4\xef\x14\xa7\xb1\xf6\x65\x90\xce\x4a\xee\xef\x5d\x69\xb3\x19\x88\xd8\x77\x32\xca\x95\x8d\x16\xb1\x31\x58\xb6\x9a\xe8\x48\xd9\x44\xfd\xdd\x0d\x80\x1e\x39\x0b\x74\xc7\xb4\x9f\x13\x1f\x91\x75\x0b\x2e\x3e\xa8\xe5\xb7\xe2\x20\x2b\xfa\x71\x14\xc1\x74\x9b\x9a\x1c\xe6\x92\xce\xc7\xf7\x3c\x90\xb4\x1e\xa8\xca\x77\xb9\x13\x99\x0b\x19\xa1\x89\xcb\x77\xf5\xa8\xb7\xb6\xa4\xed\x20\x95\x3b\x80\xc2\xc6\xd8\xcc\xba\x17\xaf\xeb\x0b\x08\xb5\x68\x63\xe9\x49\x58\xb2\xa7\x54\x75\xa0\x22\xb6\x82\xf9\x69\x16\x94\xc5\x75\x72\xe4\x43\x50\xdb\x27\x51\x1b\x6f\x8f\xf0\xe7\x24\xf2\xd8\x7c\x46\xa6\x45\x4e\x4a\x33\x14\x0f\x26\x14\xce\x63\xda\x4e\xcd\xaf\x45\x26\x20\xa9\xea\x9a\x16\xa6\x43\x2f\x2c\x2c\x98\x15\x63\xf8\xf4\x64\xaa\x6b\x66\xb7\xab\xca\x6b\x96\x06\x63\x58\xe6\x41\x08\xb7\xc9\x17\x43\x4d\x4b\xa6\x38\x22\xd6\xf9\x0a\xa9\x52\x7a\xb1\x5d\x4e\x7d\x98\x57\xb3\x76\x85\x9f\x9a\x3b\x7d\x52\x22\x38\xee\x32\x5f\x66\x8c\xc5\x73\x3d\x70\x91\xf5\x4b\xb1\x0b\xa9\x81\xa1\xae\x75\x70\xa5\xe3\x09\x7d\xf2\x30\x43\xd9\x87\xac\x5f\xf2\x53\x42\xf6\xab\x0a\xa2\x73\x91\xf5\x8f\xea\x35\xc3\x17\xde\x21\xd9\xd3\x91\x53\x1f\x07\x54\x04\x69\x19\x63\x88\x67\xd9\xa7\xac\x42\xb0\xc6\xa3\xa9\x98\xed\x9e\x14\xf2\xa7\x29\x70\xef\x35\x7b\x53\x58\x01\xfe\x56\x57\x84\xc8\xfe\xb3\x58\x5c\x04\x17\x9e\xd9\x7f\x8e\xd1\x5d\x13\xdd\x4e\x51\xb6\x30\x08\xd4\xdb\x70\xd9\x0d\xff\x77\xdf\x1a\xb8\x16\x19\xdc\xd5\xb3\x5e\xd4\x4c\x10\x06\x69\x08\x93\x9d\x24\xf9\xca\x3a\xd6\xc2\x7d\x0d\xa8\x33\xc8\x8a\xfd\x00\xd3\x6f\xe8\xff\x7c\x07\x3b\xbc\x03\xd5\x1f\x81\x12\x05\x05\x92\x3a\xb3\x73\x21\x31\x53\x95\x43\xa8\xed\x15\x46\x31\x8b\x43\xdb\x8e\x20\xdf\x5b\x23\xc2\x9f\xdf\x50\x45\xbf\x39\xa1\xae\x05\x31\x6d\xcb\x07\x09\xb4\xdf\x94\x50\x12\x0e\xe7\x78\xb2\x15\x0f\xdf\x2c\xce\x38\xd1\xc4\xb4\x97\x4d\x0e\x76\xf0\x95\x3f\x45\x1d\xcc\xa3\xb6\xb6\x94\x9f\x14\x77\xf9\x35\x46\x23\x8a\x98\xec\x1d\x4c\x98\xbd\xfb\xfb\xa6\x51\x83\x17\xaf\x35\x22\xdc\xb0\xe7\xf1\x20\xcb\x57\xc1\xd0\xc8\x4d\x32\x9b\xf1\x69\x7e\xc6\x74\xae\x86\x78\x41\xf3\x85\x6d\x8f\xb2\xd2\xe2\x99\x45\xb7\x35\xd9\x94\x20\x03\x01\x28\x41\x05\x42\x10\x81\x1c\x8c\x41\x1f\x0c\xc0\x08\x0c\xc1\x04\x5c\x81\x6b\x70\x0b\x2e\xc0\x0d\x38\x06\x27\x1b\xdc\x41\xee\x52\xf0\xd9\x78\x6b\xab\xe9\x6c\x20\xc5\x4e\x18\x77\xc4\x0f\x40\x5d\x49\xab\xba\x46\xfe\x09\xae\x8b\x18\xb1\xf2\xfa\x4f\x40\x0f\x56\x2c\x79\x1d\x15\x6f\x94\x5f\x9d\x30\x48\x12\x37\xf5\xba\xf4\xb4\x4d\xbd\x29\x1f\xec\xa1\x31\x61\xff\x6e\x5a\x6b\x67\xd8\xd8\x2f\xe1\xa4\x74\x53\x4f\x1c\x18\xd9\x1b\x29\xe9\xc1\x6f\x7e\xda\x83\xe4\xd0\x25\xd2\x34\xfc\x17\x2f\xe4\x9f\x20\x51\x26\x42\x6a\x95\x99\xb9\xf4\x2d\xa6\x13\xa7\x9b\xc9\xfd\x7d\x22\x8f\xdf\xdb\xda\x72\x13\x3e\x5f\xff\xc5\x6b\x8f\x78\x98\x92\x68\x4d\xae\x27\xd4\x45\x1d\x1a\xe0\x4f\x1a\x20\xf9\x0a\xb5\x59\x8a\x49\x8e\xf7\xf7\xf1\xd4\x03\x89\x07\x8a\xad\x2d\xba\x20\x2f\x7c\x5f\xc1\x47\xd0\x91\xd1\xa8\xe5\x6f\x12\x73\x55\x8b\x7a\x55\x81\x52\xe9\xd7\x52\x3b\xfd\xd7\x37\x31\x34\x6f\x8c\x04\x4f\x2f\xad\x12\xfc\xef\x43\x9c\x27\x35\xda\x9a\x40\xb4\x79\xea\xbb\xe4\x9d\x57\xda\x09\x10\x2a\x3c\xb7\x76\xbd\xf5\x40\x66\x2f\x0e\xec\xc5\xa5\xbd\xb8\x92\x8b\xef\x18\xfe\x2f\x64\x4c\xae\xe7\xff\xec\xde\x4d\xbd\xa9\x07\x42\x7b\xe7\xc8\x5e\x9c\xdb\x8b\xc7\xbe\x6e\x48\x0b\xa2\xa8\x20\xfe\x35\x0e\xa6\x0f\x8e\x07\xfa\x46\x93\x22\x0f\x77\xa2\x08\x4b\x67\x54\x3e\xed\x24\x30\x88\x60\xd1\xa9\xcb\x3d\x30\x30\xfa\xa0\x60\x58\x76\xfa\x55\x9c\x44\x8e\x07\x46\x3e\x71\x43\xde\x84\x37\x08\xa6\x51\xb9\xc9\x05\x5f\xaa\x85\x2f\xaa\x10\x65\x98\x72\x5b\x48\x3c\xb8\xa4\x0e\xc6\x0c\xb5\x03\x86\x84\x26\x8b\x72\x4c\x48\x1d\x30\xd1\x4a\xf9\xac\xae\xb4\x8a\x12\x16\x83\x13\x3c\x51\x70\xad\xd5\x14\x79\x48\x2b\x6e\xb5\x0a\x3c\x15\x07\x5c\xe8\x80\x50\x80\xaa\xd2\x01\x37\x5a\x39\xa6\x9a\x21\x16\x48\x0b\x07\x1c\xeb\x28\xe0\x90\x08\xbe\x27\xb4\x7c\x3a\x84\x68\x93\x2d\x62\x6d\x06\xbc\x63\x23\xef\x42\xc0\x06\xd4\x45\x53\xa2\x23\x16\xef\x1c\x0b\x71\x5f\x22\xd6\x52\x0c\x26\x2e\x3f\x92\x8f\xa2\xb1\x55\xc2\xaf\x1a\xbe\x9a\xef\x53\xdd\x33\x2b\x20\x60\x30\x29\xa0\xd2\x00\x71\xaf\xaf\x71\xe2\xe3\xe4\xfb\xbe\xcb\xb4\xd5\x78\x45\xbc\xfb\x7b\x7e\x38\xe1\x1b\xfa\x67\x17\xd2\x4f\xee\xdd\xdf\x3b\xce\x74\x0a\x86\xfe\xa1\x3b\xea\xe4\x45\x86\x32\x34\xc9\xa1\xf8\x88\xbd\xfa\x02\xf3\x0d\xdc\x29\xf4\xfa\xc5\x6b\xa0\xfa\x7f\x70\x8a\xfd\xe2\xb5\xe4\x5f\x59\x50\xe7\x43\x0f\x4c\x74\x0c\x74\x3b\xf4\x92\xb6\x80\xaf\x74\xc0\x7c\x47\xf5\xb2\xb6\xb0\xaf\x8d\x65\xe1\x9b\xb2\x17\xb4\x05\x7e\xab\x03\xe7\xfb\xba\x57\xb6\x85\x7d\xa1\xc3\xa6\x47\xa3\x57\xb5\x05\x7c\x63\xac\x08\x3b\x5d\xbd\xb0\x2d\xe8\x63\x1d\xb4\x7c\x40\x7b\x51\x5b\xf0\x27\xc6\x72\xb3\x33\xde\xcb\xdb\x82\x36\xbf\x23\xa5\xc2\xbd\xf1\xb7\xda\x8f\x6a\x08\xd1\xf1\x75\x5a\xf3\xb5\x3d\x58\x86\x45\x9c\x63\x5a\x6a\xed\xe9\x01\xa9\xd8\x80\x5f\x53\x10\x07\xf4\xfa\x4b\x22\xe0\x5d\x67\x63\x60\xc4\xc5\x01\xbd\xc1\x92\x08\xea\x9e\x1a\xfc\x91\x2c\x06\x9f\xce\x14\x83\x93\xda\x35\xe6\x41\xb2\xb0\xc5\x07\xcc\x26\x24\xcf\x78\xc2\x80\x19\x71\xdc\xaf\x10\xf5\x1f\xc9\xa2\xa0\x1c\x91\xab\x40\x51\xd6\xda\x10\x5d\xc4\x16\xa6\xca\x57\xe5\x28\x2b\xd0\x76\x55\xc5\x0d\x4a\x0e\x40\xe4\x6c\x4a\xb3\x17\x10\xb6\xc1\x25\x38\x04\xa7\xe0\x1c\x9c\x81\x5d\xb0\x07\x76\xc0\x11\xd8\x07\x9f\xc0\x3b\x70\x00\x3e\x82\xb7\xe0\x17\xf0\x1d\x7c\x01\xef\xc1\x67\xf0\x01\xbc\x04\x5f\xc1\x6f\xe0\x0f\xf0\x3b\xf8\x15\xfc\x09\x20\x04\x08\x82\x18\x82\x14\x82\x02\x82\x04\x82\x0c\x82\x00\x82\x12\x82\x0a\x82\x10\x82\x08\x82\x1c\x82\x31\x04\x7d\x08\x06\x10\x8c\x20\x18\x42\x30\x81\xe0\x0a\x82\x6b\x28\x64\xfc\x5b\xf8\x9c\x84\xfc\x0b\xb8\x96\xf2\xff\xe9\x52\x3e\x35\xc6\xdf\x40\xff\x2e\x67\x9e\x1b\x3f\x81\xa2\x4a\x53\xfc\xd7\x7f\x01\x7c\xec\x13\x88\x60\xf7\x7f\x83\xda\x9d\xfe\xbf\xc1\x20\x88\x13\x18\x75\xff\x0f\x48\xb2\x12\x75\xff\x9f\x29\xb9\x29\x1c\x43\xdf\x25\x52\x7e\x20\x64\x34\xa2\x58\xa5\x42\x7e\xd1\xe9\xc3\x24\x4b\x87\xe5\x59\x46\x55\xb7\x0e\x93\xeb\xd5\x8a\x34\x8b\x60\x2d\xda\x17\x76\xd1\xde\x2c\x1e\xdb\x8b\x89\x38\x9f\x74\x6a\x4a\xe4\x11\x4b\x66\x56\x15\x21\x2c\x6b\xc1\xbd\xb1\x76\xa4\x80\x4c\x2b\xa2\xa3\xf5\xc0\xd0\x5e\x3c\x51\x8a\x49\x26\x62\x2c\x47\x59\xdb\x5e\xdb\xda\xde\xda\x67\x70\x61\x2f\xbe\x31\xee\x1c\x0e\xe6\xf6\x7a\x61\x98\xc4\x30\x45\xa7\x54\x9e\xc0\xfc\x9a\xdc\x8b\x48\xb6\x48\xbd\x16\x38\xec\x93\x3b\x1e\xb8\x54\x90\xf6\xb3\x2c\x81\x01\xe6\x3f\x87\xf3\x10\x9c\x52\x04\x69\x96\x12\x8b\x3a\xe7\x3b\x67\x41\x79\xf9\xbe\xc8\xaa\xdc\xf1\xc0\xb9\xf9\xc9\x65\x06\x75\x17\xa7\xe4\xb0\x76\x49\x46\xd2\x1d\x51\x33\xf5\xc0\xd9\xa2\x5d\xeb\x74\x26\x6a\xf7\x5d\xda\x7d\x14\x94\x87\x41\x3a\x99\xd5\x19\x8e\x73\x04\xa3\xb7\x13\xb5\xff\xde\x12\xe8\x29\x04\xd1\xbf\xc4\x00\x76\x1a\xd6\xf5\xc8\x04\x2c\x1c\xef\x1d\x0f\xec\xcf\x5b\xf7\x4f\x46\x83\x8b\xac\xff\xa5\x96\x38\xf0\x8f\x8e\x90\x22\xde\x19\x8d\xe3\xf2\x38\x89\x68\x3b\xf1\xa5\x40\xc3\xf7\x3b\xb0\x5c\x77\x59\xed\x11\xb9\x7f\x10\x74\xbc\x8c\xb8\x7f\x7a\xe0\xa3\x71\xd6\x70\x8b\xed\x21\x45\xa5\xde\xfb\x99\x08\xf8\xb6\x19\x51\x27\x2a\x62\x3c\x21\xea\xbf\x85\x29\x46\xa7\x4a\x47\x30\x48\xd0\x68\xb2\x47\xaa\x88\x85\x87\xa2\xfe\xc5\x80\x43\xee\x49\x1e\xf8\xae\x8e\x69\xa7\x28\x82\x49\x3d\x30\x6a\x08\xf6\xc0\x17\x7b\x9b\x02\xd6\xde\x23\xdb\xc4\x02\xe3\x78\xe0\xbd\xa9\x3a\xe0\x8d\x88\x8a\xbf\x64\x5e\x90\x0e\xd0\xb7\xb6\x07\x3e\xcf\xfe\xc2\xc0\x19\x64\x49\x92\x5d\x7f\xce\xc5\x0b\x08\xa2\x99\xa5\x81\x42\x54\x70\xbc\xc2\x03\x1f\x34\xdd\x43\xb1\x84\xee\xe1\x16\xd6\x2a\x00\x1a\x0c\xe4\x25\xbb\xcf\xf3\x72\x22\x98\x1d\x44\x0e\xf8\xaa\xd7\x60\xda\x0e\x7e\xd3\x4b\x09\x61\x07\x7f\x18\xc5\xc2\x16\xf7\xbb\xad\xce\x01\xbf\xea\xc5\xda\x86\xfb\x53\xaf\x17\x64\x9c\x48\x6d\x6a\x25\xdb\xd5\x30\xfa\x24\x5a\x21\xa3\x95\x7c\x7e\x62\xa3\x76\x9c\x45\xf1\x60\x72\x90\x46\xf0\xc6\xc1\xf2\xa0\xb5\xfa\x2c\xc6\x83\x2b\x8c\x5a\x6a\xa0\x60\x9d\x93\x86\x6a\xda\x39\x33\x6b\x95\x6d\x11\x18\xf5\x11\x2c\xe3\x02\x46\x75\x83\xd2\x68\x10\x97\x9f\x18\x9d\xc7\x62\xab\x51\x79\x18\x0f\x8b\x80\xda\x90\x43\x4b\xf5\x49\x50\x60\x09\xc5\xc1\xc2\xae\x56\x69\xa1\xb9\x58\x1e\xd6\xbf\xa8\xba\xf3\xb1\xb8\x6c\xc2\x31\x89\x27\x96\xa9\x9b\xda\x29\x64\x1a\x4b\xde\x5a\xc3\xeb\xa0\x3c\xa9\xdb\x3a\x58\x2c\xd7\xea\xcd\xa3\xe5\x60\xc9\xdd\xbe\x6d\x14\x62\x88\xa5\x7b\xfd\x50\x90\x47\x7e\x0e\x16\xfa\xcd\x4d\xa9\x50\x03\x07\x5c\x43\x49\x15\x96\x27\x41\x9c\x7e\xc8\xfa\x07\x91\xd0\x62\x7d\x38\x3d\x3e\xea\xe4\x01\x16\x5d\x89\xea\x89\x33\x08\x26\x3e\x75\xe2\xc8\xf5\xbc\xde\xeb\x6f\x04\x02\x55\x1b\x90\x7d\x25\x40\xdc\xc0\x1e\x35\xa6\x48\xfb\xe6\xdb\xfd\xfd\x4f\xaf\x5f\x33\xcd\xd9\x29\x1b\x94\x40\xdb\x73\x72\xee\x09\x5b\xcb\x04\xdf\x6a\x97\xf3\xda\x4a\x24\x81\xf3\x24\xec\xbb\x98\xdc\x70\x48\x5c\x9e\x74\xe2\x72\x9b\x03\xad\x45\x4b\x52\x58\xc4\xe3\xa0\x98\x38\x42\xca\xc4\xa5\xf5\x0f\xa7\x96\x33\x71\x21\xf5\xe6\xa0\x02\x27\xfe\x9d\xc4\xc3\x11\x72\xb8\x4c\x8a\x8b\xf8\x33\x54\xeb\x9c\x71\x8b\x28\x28\x2e\x1d\x36\xf3\xe3\x24\xd2\x14\x86\xe2\xd0\xbf\x60\xea\xc1\x21\xf3\x1f\x10\xec\x93\x74\xe6\x04\x48\x03\x40\x80\x52\x9b\x9b\x65\xbf\x74\x6b\x24\xbc\x84\x00\x93\x0b\xf4\x07\x11\x1c\xbf\xe0\xa7\xc2\x4f\x9e\x98\xd4\x06\x71\x1a\xbd\x9d\x30\x9e\xc6\x1c\x18\x64\xf2\x48\x07\xac\x71\xc7\xd2\x8a\xc7\x60\xaf\x8e\x07\x90\x54\xdf\xc8\x67\x95\x21\xa1\x37\xee\x6b\x90\xa9\x5a\xda\x6e\x8f\x6e\xd1\xab\x2c\xa9\xc6\x70\x1f\x73\xa3\x52\x7d\xd3\x86\x91\x50\xb3\x60\xd5\xa7\x52\xae\x2b\xca\x92\xa0\x44\x64\x5f\x1f\x0f\x5c\xa7\xe7\x78\x74\x4e\xa3\xa0\xfc\xa4\x9d\x29\x9b\x02\xb8\x89\x0b\x7b\x3f\xbf\x66\x86\x46\x95\x26\xd5\xb0\x4f\x51\x96\xe7\x84\x4b\xd0\xee\x78\x48\x35\xf8\x17\xd2\xa2\x34\xf0\xde\xad\x2d\xa9\xd1\x0c\xee\xed\x6d\x6d\x39\x74\x97\x3b\xb5\x4e\x5a\xde\xb7\xd3\x12\x65\xfa\x2e\x2b\x51\x56\xc0\x0e\x8b\x92\xf4\x2e\x2b\x14\x31\xd4\xeb\x90\x1e\x94\xb0\x14\x90\x58\x59\x25\x93\xec\x22\x00\xea\x5e\x84\x6e\x41\x6f\x9a\x94\x4b\x02\x48\x4a\xde\x17\x93\x85\x25\x7b\x93\x2e\x75\xff\x29\x78\xe9\x5f\x40\xf7\x83\xa2\x78\x65\xc1\xda\x56\xa5\x47\xff\x6a\x60\xe0\xa2\x4d\x7b\xb5\xf1\x6f\x06\x70\x22\x1d\xb5\x57\x1b\xff\x61\x00\xa6\x02\x56\x7b\xad\xf1\xef\x26\x64\x21\xa3\xb5\xd7\x1a\xff\x6a\x05\xbf\x0a\xa5\xf1\x9f\xe6\x56\x51\x25\xc5\xde\xb8\x2d\x0a\x08\x0d\x1c\x92\xb4\xd9\xeb\xb7\x85\x8f\x4c\xf8\x36\x81\xb5\x37\x68\x8b\x28\x36\x11\xc9\x32\x6f\x6f\xd4\x16\x41\x6a\x22\x50\xc4\xe6\xde\xb0\x2d\x86\xa2\x09\x03\x15\x9e\x7b\x93\xb6\x08\x12\x13\x81\x22\xbc\xf7\xae\xda\x62\xc8\x9a\x30\xb0\x29\x5c\xb7\x45\x10\x58\x10\x28\x57\x88\xde\x6d\x5b\x14\xa5\x89\x42\xbb\x85\xf4\x2e\x5a\x1b\xdf\x34\x04\x42\x5a\x76\x40\xef\x66\xbe\x41\xa5\xa9\xb3\x07\x3e\xc8\x36\x15\x83\x0f\x08\x91\xda\x01\xbd\xe3\x25\xf1\xc8\xbd\x35\x44\x95\xb9\x66\xd2\xc5\xac\x77\xd2\x76\xbd\x42\x1b\x7c\xe9\x6e\xd7\xbb\x5c\xf5\x17\x91\x6e\x12\x0e\xe8\x1d\x2e\xb9\x54\x72\x6f\x6d\xa9\x22\xdb\x54\xf8\x3d\xb4\x77\xda\x76\x22\xb9\x09\xdf\x76\x95\xed\x9d\xb7\x45\x34\x36\x11\xe9\xb7\xe1\xde\x59\x5b\x24\x7d\xeb\x6c\x2c\x17\xea\xde\x6e\x5b\x54\x83\x19\xa8\xd4\x3b\x79\x6f\xaf\x2d\xae\x91\x89\x4b\xbd\xd6\xf7\x76\xda\xa2\x18\x9a\x28\x6c\x9a\x81\xde\xd1\xaa\x4f\x8e\x74\x73\x76\x40\x6f\xff\x41\x44\x86\xf6\x9e\x43\xcd\x98\x9a\xb7\xf7\x69\xe9\xc3\x79\x9c\xcc\x25\x95\x48\x68\x45\x7a\xef\x96\x44\x80\x24\xf5\xf2\x4c\x24\xaa\x82\xba\x77\xb0\x24\x1e\xa5\xbb\x86\x6a\xd2\x28\x78\xa9\x2a\x9f\xde\xc7\x55\x7f\x7f\xfd\x6e\xee\x80\xde\xdb\x25\x27\x66\x80\x98\xb3\x8e\xda\x3d\xdc\x01\xbd\x5f\x96\xc4\xa8\x43\xd0\x10\x5e\x99\xab\x59\x6b\xc6\x7a\xdf\x5b\xbb\x10\x59\x65\x70\x4d\xb9\xd6\xfb\xb2\xea\xef\x64\xd1\x37\x38\xa0\xf7\x7e\xc9\x85\xb3\x41\x99\xf3\xb5\xec\xca\x08\x07\xf4\x3e\x2f\x8f\xdb\x06\x48\x43\xff\x41\x76\x2c\x39\x86\xb3\x3c\x4b\xc2\x2c\x2d\xab\x64\x3b\xcc\xd2\x94\x78\x8c\x2c\x16\xef\x52\x84\x0a\x5d\xd4\x6b\xc4\xf2\x86\x8b\xbc\xc0\x02\x05\x48\x36\x56\xe3\xe6\x9a\xf9\x6e\x4a\x8d\x30\x92\x8d\xaa\x8c\x23\x18\x06\xc5\x76\xed\x22\xe3\x81\x42\xb3\xa8\xa0\x06\x8b\x0a\xf1\x20\xa4\x8e\x13\x1b\x36\xeb\x0a\xd5\xbb\x01\xe4\xd7\x38\x4e\x6b\x2f\x9c\x94\xd6\xb8\xb1\x9f\x78\x4f\xd5\x3d\x64\x0a\x02\xbf\x90\x76\x56\x69\x4e\xa3\xf2\x7b\xe9\x37\x10\xfa\x6d\xce\x20\xc8\xfd\xbb\x29\x90\x9d\x4c\xc2\x06\x27\x93\xbc\x07\xbf\xf9\x21\x73\x32\xc9\x55\x27\x13\xf9\x27\xc8\x75\x27\x93\xbc\xd1\xc9\x24\xbf\xbf\xcf\x75\x27\x93\x5c\x75\x32\xc9\xfd\x6a\x11\x27\x13\xf2\x44\xb4\xd6\x80\xb9\x01\x28\x01\xf4\xee\xef\x21\x16\x3e\x3d\x10\x49\x4e\x26\xb9\xe6\x02\x92\x33\x27\x13\xa5\xfc\x4d\x6e\x7e\x9c\x88\x3b\x99\xe4\xb3\x9d\x4c\x74\x0c\xf6\xfd\x85\x87\x98\xe3\xe9\x31\x27\x13\x3f\x07\x85\x47\x5e\xda\x48\x0f\x1a\x24\x2a\x91\xcd\x22\x12\x11\xcc\x93\x6c\x32\x6e\x7a\x8a\xd1\xe4\x5d\xd6\xf8\xf2\xa8\x8d\xf3\xd9\x42\x6e\x66\x33\x9b\x55\xe3\xed\x60\x38\x2c\xe0\x30\x68\x7e\xd6\xf4\x08\x2e\x69\xc2\x7f\xec\xfd\x73\x72\x1f\xfb\xbc\xf6\x1e\xfb\xa7\x7b\x8f\x61\xe6\xf9\x81\x39\x7e\x65\x0b\x3a\x7e\x49\xbe\x32\x82\x3a\x10\x17\x19\x8b\x43\x98\xd6\x21\xc1\x62\x24\xda\x13\x44\x65\xaa\x3b\x8b\x71\x47\xab\xdc\xf0\xaa\xa8\x5d\xab\xc5\x95\xe3\xb4\x1a\x8f\x83\x22\x86\x25\x0b\x7b\x94\x17\xd9\x38\x43\x44\x0d\x31\xcb\xa9\xcc\x2c\x1e\xd0\xf0\x2d\xb5\x73\x55\x69\xba\x55\x8d\x66\xf8\x9b\x10\x47\x98\x6d\xb1\x18\xdb\x25\x19\xd7\x44\x78\x9c\xd9\xdc\x96\xca\xda\xf3\x4c\x99\x24\xb3\x55\x1e\x55\xec\x59\xb1\x64\xbf\x2c\x6b\xbb\x13\x9b\x2d\x5f\xaa\x2b\x3a\xfa\x20\x89\x83\x52\x80\xe8\x94\x55\x7f\x1c\x23\xa2\x8c\x64\x7e\x6b\xb2\x6f\x9f\xb9\x88\x0e\xd1\xae\x85\x30\xda\x0d\x52\x5a\xc0\x3c\xdb\xe6\x76\x63\x2a\x43\xa9\xdf\xc5\x32\xfd\xce\x32\x14\x24\xb5\x63\xdc\x82\x63\x24\x2a\x8a\xb2\x76\x9c\x9b\xdb\x89\x5d\xb1\x78\xaf\x93\x85\x7a\xf1\xab\x19\xef\x77\xd9\xb4\x2b\x3d\x70\xd8\xc2\x5f\xe7\xbd\xee\x96\x73\xca\x3c\x10\xde\xcb\x5e\x39\xe7\x66\xe1\xbb\xac\xf8\x48\xce\x94\x03\xce\xb4\x5a\x6d\x27\xed\x6a\xd5\xf5\x1e\xdf\xb3\x96\xd7\xb7\x10\x72\xc1\xdc\xd1\x9a\x48\xda\xce\x23\xad\xca\xb6\x8c\xfb\x5a\x1b\xf9\x08\x80\x4f\xf6\x51\x9f\x8a\xbd\x0b\xde\x69\x4d\xb4\x4d\x0a\x0e\xb4\x7a\x7d\x37\x82\x8f\xf6\x06\x74\xdb\x81\xb7\x56\xf0\xec\x8b\x83\x5f\xb4\x5a\x75\x43\x80\xef\x5a\xb5\xbe\x63\xc0\x17\xf9\xc5\x14\xfc\x5e\xc5\x05\x2c\x4f\x08\x99\x92\x6d\xe8\x9c\xd0\xd4\x66\x64\xfa\x15\x58\x64\x4f\x0b\xbd\x43\x19\xa1\x40\x24\xd6\xd6\x18\x92\xb7\xcc\xb0\x36\x99\x6b\x48\x88\x39\x9b\x55\x0a\x02\xc9\xec\xf0\xe2\xd9\x14\x7b\x30\x65\xf5\x9c\x28\x1d\xef\xfe\xbe\xf7\xcd\x13\x0e\x0b\x6c\x53\x91\xd6\xca\x46\x9b\xe1\x50\x22\xfb\x8e\xd4\xf3\xad\x43\x61\x0f\xaa\x44\xf5\x29\xc9\x83\xaa\x64\xce\x23\xcc\x59\xc4\x74\x27\xa1\x8f\x8c\xeb\x42\xfe\xab\x76\x21\x29\x4d\xe7\x11\x36\xff\xb9\x36\x79\x49\xec\xf5\x6a\xae\xc2\xcc\xf2\x78\x18\xcb\xf5\x27\x3d\x68\xe7\x29\x38\xf5\x3f\xbb\x87\x8f\x64\xae\x3e\xd7\x61\xaf\xc8\x5a\x7d\x66\x81\x2b\x11\x9e\xf6\x46\xeb\x5d\x1d\x81\x46\xbb\xda\xdb\xad\x35\xf8\xe6\x21\x21\x16\xec\x79\x0a\x99\x39\x30\x3c\x70\x28\xeb\x62\xf6\x8c\x4f\x5d\x9b\xd4\x5a\x5b\xb2\x77\xec\xa0\x15\xaa\xdd\xde\x9e\x7d\xa4\x63\x91\xcd\x5c\xad\x8d\xd8\xfb\x3a\x74\x1b\xef\x68\x6f\xca\xfe\xa4\xa3\x51\xd8\x4f\x7b\x43\xb6\x7d\xe7\x52\x0b\xf6\x52\xfb\x49\x38\x79\x2b\xbb\xe8\x5d\xc3\xd9\x90\x39\x64\x7b\x5b\xf6\x81\x8e\x45\x67\xb2\xed\xad\xd9\x1f\x75\x14\x06\x9f\x6e\x6f\xce\x7e\xdb\x80\x83\xb1\xfa\xf6\xb6\xec\x5f\xec\xeb\x54\x73\xfb\xde\x4d\x5b\x04\xdf\x75\x04\x9a\x3c\xd1\x3b\x6e\x8b\xe1\x8b\x8e\xc1\x90\x59\xda\x9b\xb0\xad\xd4\xa9\xb6\x92\x5d\x2e\x79\x30\x54\x2b\x99\x72\x38\x0e\x65\x75\xf7\x87\x99\x8a\xac\x22\x88\xd3\xed\x12\x15\x01\x82\xc3\x99\xc1\x7e\x1f\xfe\x54\xb2\x29\x8b\x16\x55\xf8\xb0\x14\x69\x66\x60\x11\xa1\x1e\x1a\x3c\x27\xf5\xd0\x68\xad\x1e\xfa\x11\xd4\x43\x43\xdf\x2d\xe8\xa5\x57\xd7\xd0\x24\x4a\x31\x7b\x0a\x97\x29\x85\xe2\x99\x54\x40\x75\x14\xe4\xae\x1d\xc1\x20\x4a\xe2\x14\x3a\xe0\x35\x0b\x2d\x22\x54\x2f\x4a\x5d\xd5\x22\xfc\xc6\x80\x5f\xf6\x6a\x80\x21\xbb\xab\x0d\xf8\xdb\x81\x22\x84\x7b\xbc\x3a\xd2\xaa\xe3\x61\x9a\x15\xf0\x94\x04\x7e\xf8\x90\xf5\x4b\x07\xe4\x7a\x8b\xf2\x1d\x06\x11\x39\x60\xac\xd5\x90\x34\x2e\x02\x74\x1f\xd4\xe2\x7f\xe8\x8f\xdc\x4a\x65\x50\x75\xa3\x5e\xd1\x96\xea\x46\x3a\x70\x6d\x86\xed\x83\x4b\xe4\x3a\x06\x73\x91\xda\x47\x99\x18\x1b\x48\xf8\x3a\xb7\x8f\x32\xd1\xd7\x81\x6b\x9f\xaa\xfd\x2d\xac\x92\x79\xd2\x70\x16\x4f\x12\xef\x04\xb7\x4b\x54\xf5\x9b\x73\xe6\x36\xc4\xb2\x5a\xf0\xa1\xbd\x64\x6f\x5d\x34\xaa\xd5\x2c\xab\x86\x60\x57\x6f\x9f\x13\xbb\xfa\x65\xcd\xae\x7e\x04\x76\xf5\x9d\xbb\x02\x68\xd6\x8c\x82\x29\xc9\x6d\x4c\x0c\xd9\xc3\x63\x99\xc5\x81\xbd\xb8\xb4\x17\x57\xf6\xe2\xd0\x5e\x1c\xd9\x8b\x73\x7b\xf1\x58\x29\x66\xcc\xb7\x6f\x6f\x3b\xb0\x17\x8f\xec\xc5\x43\xfb\x42\x4d\x6c\x08\xaf\xec\x6d\xaf\x6d\x6d\x6f\x17\xf4\xbe\xb0\x31\xf3\xb7\xba\x7e\xbc\x0e\x6a\xf5\x96\x3f\x28\x8c\xb3\x22\x46\x13\x11\xd6\xaa\xae\xc1\x54\x5e\x04\xb4\xe2\xa5\x45\x3c\x1c\xc2\x02\x46\x6f\x27\x3c\xaa\x15\xaf\x94\x5e\x4c\x5c\x6a\x55\x17\xd4\x6d\xf9\x50\xef\x91\x45\x50\x56\xdb\xbf\xe5\xc2\x47\xad\x07\xc4\xb5\xe7\x5a\x6d\xad\x0f\x3a\xb3\x96\x2b\xca\x9c\x5d\xad\xc9\x75\x10\xa3\xcf\x29\x8a\x13\xa1\xc0\x7f\xab\xbd\xe5\x24\x39\xec\xb8\xee\xfe\xad\xf4\x86\x93\xd6\x1c\x69\x35\xfd\x24\x0b\x2f\x61\x44\x2b\xf7\xb5\x4a\xc5\xfb\xff\x93\xb5\x52\x55\xd6\xbf\xb5\x3d\x98\x3d\xb0\x56\xd2\x8e\x1f\xb9\x8c\x74\xe1\xff\xe2\xde\xda\x55\xa4\x69\xfb\x78\x4d\x1a\x6c\xb1\x71\xda\xcb\x5f\xc7\x3a\x70\xba\xf7\xda\x8b\x5d\x27\x06\x60\x79\xfb\xb6\x97\xb8\x2e\x75\xf8\xf2\x9b\xa1\xd6\x22\xd7\xa1\x0e\x9d\x1d\xa2\xf6\xa2\xd6\xa9\x31\x6e\x76\x0e\xdb\xeb\xbc\xcf\x75\xd0\xea\x51\x6e\xaf\xf3\x3e\x33\x76\x79\xad\x1d\x6e\xad\xec\xde\xb5\x83\x56\xb5\xc3\xad\x1f\x6c\xed\xe9\x58\x24\x9a\xb4\x0a\x0d\xb7\x71\x50\x65\xb2\xb6\x0a\xe5\xb6\xbe\x77\x38\x65\x5c\x85\x6e\x5b\x03\xae\x10\xd7\x55\x28\xb5\x35\xf8\x2b\x7e\x9d\xf5\xce\x0e\x7f\x55\x6f\xb3\x0e\x74\xf0\x2b\x7e\x99\xf5\xd1\x0e\x7f\x55\xef\xb2\x6e\xe5\x1b\xde\xf7\xc5\x6e\x78\x8f\xa3\x71\x5c\xde\x3f\x6e\x15\x31\x8f\x1f\x12\x86\x4d\xdc\x1a\x7f\x7d\x4e\xb7\xc6\x3f\xd7\xb7\xc6\x1f\xe1\xd6\x08\x21\x0b\x94\x5c\xe8\xd7\xc6\x4c\x2f\x65\x22\x06\xbb\x0b\x9a\x5a\xd1\x52\x29\x56\xef\x82\x66\x71\x68\x2f\x8e\xec\xc5\x2c\x36\xb2\xee\x84\x46\x6c\x50\xc4\xf1\x6c\x10\xc4\x49\x55\x40\x3d\x28\x93\xeb\xf9\x3f\xf7\xbe\x4d\x79\x14\x65\xab\x57\x9c\x59\x3c\xb0\x17\x8f\x68\xb1\xf0\x69\x33\xf4\x58\x34\x4d\x76\xf7\xc5\x4f\x53\x7e\x9d\xec\x67\x59\xe2\xb9\x2c\x5a\xc2\xd9\x7b\x6a\x6a\xe2\xe1\x1c\xea\xdb\xa5\xe1\x80\xc7\xf8\x66\x7d\xd5\x8c\x2d\x61\xe8\xae\xcd\x0a\x16\x86\xee\xd6\xfe\x85\x2e\x6c\x7a\xeb\x1b\x7b\xdb\x63\x5b\xdb\x13\x5b\xe1\xa5\x7d\xb1\x0e\xed\xc5\xa7\xda\x65\x38\x5e\xe2\x32\xfc\xab\x7e\x19\xae\xef\x95\x4a\xc5\x11\x13\x85\xcf\xb4\x4a\x71\xe1\xd9\xd5\x6a\xe8\x6d\x65\x4f\x2f\x95\xaf\x1a\x3b\x3a\x26\xf6\x9d\x8e\xac\xe5\x8a\xc0\xb9\xaf\x35\x51\x77\x82\xb8\x54\xfe\x6a\xbd\xc6\xbe\xd3\x6a\x85\xb0\x76\xa0\xd5\x28\x92\xd6\x47\xad\xb2\x80\x49\x80\x68\x65\x29\x3c\xbf\x7e\x15\x5a\xfb\x93\xfa\x28\xbd\xa3\x27\x49\xf2\x00\xfb\x95\x6b\xfd\xdf\xb2\x4d\xc9\xbd\xbf\x7e\x95\xbd\xf4\xbe\xe8\x43\x25\x91\x1d\xde\x6b\xa5\x8a\xc0\xf6\xd9\x5a\x49\xc5\x95\x0f\x5a\x9d\x22\x2a\xbd\xb4\x56\xd2\x8e\x5f\xb5\x3a\x49\x3c\xff\x4d\x1f\xa2\xb8\xee\xfd\xa1\x7f\x06\xe9\xb1\xf6\xef\x92\x2f\xdb\x28\x28\x3f\x64\x7d\x11\x54\x85\x06\x4c\x11\xad\xeb\x46\x78\x1b\xea\xad\xa4\x50\x48\xf4\xa4\x92\x58\x48\xa4\x07\xa5\xae\x9a\x7f\x55\x43\xfb\x29\x38\xf7\xff\x74\x4f\xed\x9a\x82\xd6\x77\xee\x33\x2b\xec\xfa\x54\xb5\xbf\x73\xef\xea\xf0\x25\x4d\x44\xeb\x2b\xf7\x9e\x0e\x9c\x69\x22\x5a\xdf\xb8\x77\x0c\xc0\x8a\x26\xa2\xf5\xb5\xfb\xc8\x58\xf5\x95\xc5\xd3\xde\xb7\x83\x56\x6f\xc5\xad\xef\xde\x9f\x74\x2c\x3a\x9d\x6b\x7f\xf1\x7e\x67\xee\x1c\xe5\x6a\xdc\xfa\xee\x7d\xa0\x23\x90\xae\xc6\xad\xef\xdd\x1f\x75\xe0\xea\xd5\xb8\xf5\xd5\xfb\xad\x0e\x5f\xa5\xf9\xed\xef\xde\xbf\xe8\x08\xec\x6c\xa3\xfd\x25\xfc\xbb\x8e\x48\xe2\x3c\xed\xef\xe0\x5f\x74\xe8\xd4\x59\xb4\xf5\xdd\xfb\xbd\xb1\x79\x68\x64\xa3\xd6\xb7\xee\xcf\x3a\x60\x55\xe7\xd1\xda\x77\xec\x83\x1d\x3e\x53\x1a\xb4\xf6\x1c\x7b\xa9\x83\x57\x75\x1e\xad\x1d\xc7\xbe\xda\xe1\xb3\xe1\xb7\xf6\x1a\xfb\x4d\x07\x2f\x6b\xfb\x5a\xfb\x8b\xfd\x61\x6c\x1a\x49\x01\xdd\x3a\xdc\xc9\xef\x06\xc1\x94\x23\xd0\x1c\xb6\xd6\x42\xcb\xea\x20\x38\xf3\xcd\x35\x7d\x29\x54\x86\x81\x99\x1c\x73\xb1\x27\xd7\x0f\xd7\x0f\xad\x7d\xd2\xd6\xea\x9a\x7f\x8a\xba\xa6\xf6\x49\x13\xaa\x90\xe3\xeb\x14\x16\x9e\xab\x3b\xa5\x09\xff\xb3\xcc\x7e\xbf\x5f\x44\x89\x63\xfa\xa1\x2d\x63\xba\x1e\xe8\x2f\xa3\x4c\x47\x34\x98\xe2\x8d\x10\x99\x2e\x68\xe3\xe0\xc6\xf4\x3a\x1b\xc7\xa9\xe9\x70\x96\x67\x49\x1c\x4e\x66\x7a\x9a\xc9\x41\x5e\x56\xef\x6a\xc6\xe7\xf0\x08\x4e\x66\x64\x19\x1e\xc1\xaf\x8c\xac\xe4\x23\xb8\x94\xd5\x1f\xe3\xef\xf4\x25\x1b\x65\x25\xda\xa6\x81\x5d\x9e\x2a\x5f\x11\x3c\x65\xfc\x9c\x78\x4a\x7f\xcd\x53\x7e\x04\x9e\x32\x58\x94\xa7\xa8\x3e\x62\x66\x71\xd0\xc0\x81\xca\x16\x4c\x64\xac\xe8\x12\x2b\x46\xfc\xc7\x4a\xa4\xfd\x50\x2b\xcd\x03\x34\x12\x2c\x65\xcc\x35\xa0\x41\x74\x9c\x26\x13\xce\x57\xa6\x53\x50\xf9\x7d\xb7\xb4\x5c\xd9\x5a\x73\x89\xd0\x00\xbc\xa2\x24\x77\x91\x0e\x98\x4e\xb6\x3d\x8f\xc8\x75\xc0\x62\xbd\xda\x33\x8a\x52\xa6\xe6\x83\x59\xd4\xfc\x22\xeb\x6f\x47\x71\x99\x07\x28\x1c\xcd\x73\x0b\xd6\x08\x30\xa5\x51\x52\x28\x93\x35\x01\x5e\x13\xe0\x67\x42\x80\x63\xd9\x6f\xd4\x03\xa9\xfa\xb3\x50\x7f\x26\xea\xcf\x4c\xfd\x19\xac\x80\xda\xc6\x54\x37\x53\x6a\x24\xf4\x22\xeb\xef\xca\xba\x1b\x9d\x1c\xc3\xab\x20\x51\x1a\xe8\x94\x19\x37\x38\xd8\x33\x69\x73\x7d\xe2\x61\xf4\x21\xeb\xe3\x06\x82\x44\x97\x7e\xdf\x0d\x14\x5d\x20\xd3\x1b\xc5\xad\x45\x4c\x1d\xb2\x3e\xbd\xf6\x4e\x97\xa1\x8e\xc2\x58\xa1\x55\x5c\x48\x2c\x38\xf0\x1a\xae\xe2\x3e\xa2\x81\x36\xbe\x53\x7b\xbe\x13\x2c\xc5\x1a\xf2\x24\xb0\x3a\x14\xad\x44\x7e\xb7\x3c\x17\x11\x8c\x23\x7c\x4e\x8c\x23\x5a\x33\x8e\x1f\x81\x71\xe4\xec\xc9\x87\xc6\x29\xe2\x16\x7e\x32\x8c\xb7\x58\xb3\xcd\x61\x56\xf3\x70\xde\x12\x72\x5a\x3f\x18\x38\x20\x60\x1c\x20\x6c\x70\x8a\x28\xb5\x7a\x16\xa3\x99\xc6\x2e\xa8\x38\x77\x08\xfc\xc8\xcd\x54\x0a\x85\xa1\xb7\xa7\xdc\xa5\x0e\xd8\xb0\x66\xb6\x26\xdc\x95\x8e\x42\x99\x63\x7b\xea\x9d\xc9\x94\x35\x9f\x47\x59\xcb\x30\x48\xe0\xdf\x45\x5a\x05\x59\x2d\x9f\x13\x59\xad\xd6\x64\xf5\x47\x20\xab\x21\x27\xab\xa6\xcf\x5d\x03\x81\x95\xa2\xe1\xd1\x83\x84\x47\xf5\x70\x5a\x59\xca\x6e\x55\x19\x23\x85\xa5\x11\x69\x0c\x63\x2a\x39\x2d\x9d\x4e\x41\xe6\x57\x6e\x62\x9a\xb6\x5b\x53\xc3\x40\x87\x6b\x8c\xa1\x3d\x39\x4c\x64\x72\x15\x4e\x3d\x6f\x63\x26\xb9\x62\x81\x06\xff\xa3\xce\xe5\x8b\x44\x55\x5d\x91\x87\xb9\xa0\x98\x07\xcf\x89\x62\x7e\x5c\x53\xcc\x1f\x81\x62\xbe\x65\x4e\xe4\x36\x2f\xe5\xcc\xee\xba\x2d\x53\x4c\x1e\x34\x34\xd0\x7d\xce\xad\xc1\x29\xbf\x57\xb0\x92\xe2\x60\x96\x0b\x75\x22\xc9\xe1\xe2\x74\xc8\xbb\x55\x0b\x75\x63\xe1\xfa\x78\xaf\x70\xa1\x5e\x75\x2a\x48\xde\x2d\x5a\xa8\x1b\x95\x31\x79\xa7\x7c\xa1\x4e\x2c\x7d\x24\xef\x35\x5e\xa8\x57\x92\x95\x88\x77\x61\xaf\xa7\xc3\x2c\x49\x60\x88\xbb\x28\x2b\x6c\xac\x9d\xbe\x2a\xc6\x7c\xb5\x99\x28\xd8\xcc\x01\xb3\x47\xda\x65\x35\xae\xaf\x1b\xe5\xc7\xb8\x44\xc2\xdf\xde\x9a\xcc\xdc\x2c\x9e\xd8\x8b\xaf\xf4\xc9\xb1\x94\x9e\xbb\xa3\x38\x89\x0a\x98\x8a\xe9\x48\x25\x11\x0c\x22\xfe\x93\x3f\xeb\xa6\x43\x0c\x59\x39\x1b\xa4\xfe\xba\x7b\x19\x87\xf6\x03\x99\xcf\xd7\x2f\xbb\x0f\x66\x44\x14\xbd\xd1\xda\xa8\x1f\xea\x58\xab\xd5\xbf\xdb\x89\x56\xaf\x7d\xc6\x4b\xad\x5a\xff\xaa\x87\x5a\xbd\xfa\x91\x4f\xb5\x5a\xf5\x33\x73\x57\xfd\xba\x5a\xde\x12\x67\x5a\x9d\xb4\x09\xb8\xaf\x3e\x5f\x95\x0c\x05\x49\xdd\x71\x4f\xab\x34\x3e\xed\x8e\x7d\xc6\xa2\xc1\x91\xd6\x40\xf9\xf0\xdc\x75\x9f\xaf\x88\xfc\xe9\xb9\xe3\xbe\x32\x34\xd1\xf9\x9d\xf4\xae\xfb\xa3\xf1\x0e\x78\x15\x37\xbc\x1b\x1d\xae\x35\x90\x60\x6b\x15\xdd\xb1\x8e\x46\xdd\x75\xed\xcd\x43\x27\x3a\x02\x7d\xe3\xb6\xf7\x27\xb8\xd4\x51\x68\x7b\xbf\xbd\x03\xf7\xa1\x8e\x41\x3f\x3e\xed\x1d\xb9\x4f\x75\x14\xea\x09\x6c\xef\xc3\x7d\xae\x23\xd0\x0e\x71\x7b\x17\xee\x33\x1d\x83\x4c\x07\xda\x3b\x70\xef\xea\xe0\x65\x52\xd2\xde\x85\x7b\xcf\x38\x70\x32\x35\x6a\xef\xc2\xbd\xa3\xc3\x37\x08\x5a\x7b\x2f\xee\xa3\x86\x93\x20\xe1\x68\xed\xc0\xbd\xaf\xe3\x50\xc9\x6a\x7b\x1f\xee\x4f\xc6\x61\x53\x28\x73\x7b\x67\xee\x77\xd6\x2f\x2d\x4d\x61\xb5\x6f\xa9\xdf\xce\x53\xcf\x89\xe8\xaa\x6b\x93\xf8\xfa\x42\xf9\x8f\xbf\x50\x0a\x93\xb8\x79\xa1\x54\x4c\x1e\x92\x9b\x51\x61\x8b\xbd\x94\xd8\xe3\x34\x3d\x82\xcd\x9c\xc8\x74\xba\xc5\xbc\x24\x3b\xc0\xb4\x94\x4b\x19\x2a\x0c\x23\x79\x1d\x62\xde\x34\x92\x0f\x06\xc2\x32\x4e\x36\x11\x3a\xcb\xe6\x46\x64\x97\xa9\x07\xdb\x7b\xb8\x5b\xa3\x7d\x9d\xca\xa6\xab\xb7\xae\xd7\x4b\xf1\x08\x56\x75\x79\x35\x1f\xc1\xa0\x5e\x7f\x90\x47\x31\xa8\x13\x73\xd5\xdf\x6b\x45\x6f\x95\xd0\xea\x61\x4a\xd4\xa2\xbc\xca\xf5\x9c\x58\x8d\x49\xa8\x28\x61\x7f\xb4\x80\x1c\xe0\x57\xf0\x27\x80\x10\x20\x08\x62\x08\x52\x08\x0a\x08\x12\x08\x32\x08\x02\x08\x4a\x08\x2a\x08\x42\x08\x22\x08\x72\x08\xc6\x10\xf4\x21\x18\x40\x30\x82\x60\x08\xc1\x04\x82\x2b\x08\xae\x21\xb8\x85\xe0\x02\x82\x1b\x08\x8e\x21\x38\x81\xe0\x12\x82\x43\x08\x4e\x21\x38\x87\xe0\x0c\x82\x5d\x08\xf6\x20\xd8\x81\xe0\x08\x82\x7d\x08\x3e\x41\xf0\x0e\x82\x03\x08\x3e\x42\xf0\x16\x82\x5f\x20\xf8\x0e\xc1\x17\x08\xde\x43\xf0\x19\x82\x0f\x10\xbc\x84\xe0\x2b\x04\xbf\x41\xf0\x07\x04\xbf\x43\xf0\x2b\x04\x7f\x42\x00\x11\x40\x08\xc4\x08\xa4\x08\x14\x08\x24\x08\x64\x08\x04\x08\x94\x08\x54\x08\x84\x08\x44\x08\xe4\x08\x8c\x11\xe8\x23\x30\x40\x60\x84\xc0\x10\x09\xae\x3e\x41\xcf\x89\xad\x5f\xa1\x35\x5f\xff\xa7\xf3\x75\xc2\x4a\x37\xaf\x91\xdf\x73\xea\xcc\x94\xc0\xe9\x53\x47\x4f\xa7\x24\x81\x74\xe9\x1f\xb4\xec\x1b\x11\x04\x6e\x91\xef\x06\x54\x83\x6c\x8d\x3d\x69\x16\x57\xf6\xe2\xd0\x5e\x1c\x29\xc5\x6a\x0e\xae\xd4\x94\x31\xc6\x76\x28\x7d\x7b\xf1\xc0\x0e\x7c\x64\x2f\x1e\x2a\xc5\x4c\x7e\x99\x50\x6d\xae\x9c\xdd\x93\x88\x23\x55\x01\xa3\x6d\x89\xc4\x32\x3d\xa7\x65\xc8\xd7\x0d\xe5\xb7\x0d\xe5\x17\x72\x39\x0b\x0f\x22\x7e\x1e\x1b\x69\xa0\xc8\x93\x42\x12\x17\xe6\xc4\xac\x83\x45\x9c\x45\x71\xe8\x00\x27\x0f\x8a\x60\x0c\x11\x2c\xe2\x5b\xc2\x5d\x84\x2b\x99\x35\xb9\x14\x79\xb6\xcf\x82\x88\xa4\xb3\x12\xab\xd5\x17\x3f\x87\xe8\x47\x48\x6b\xe1\xbc\xa2\xb5\xcd\x83\x82\xa5\x5e\x3b\x37\x10\x52\x07\x6d\xd6\xa4\xce\x37\xe6\x78\xe0\xcc\x3e\x34\xd0\x3c\x37\x0f\xec\x2e\xdd\x87\x23\xbe\xab\x9b\x00\xa5\xc1\xd4\xf1\xc0\x9e\xfa\x25\x76\xd4\x9d\x61\xda\x55\x1a\x7d\x7c\x8e\xac\x8b\x2a\x99\x61\xf6\xd5\x98\x34\x5c\xab\xc8\xc3\xd6\x80\xd7\xf8\x0a\x4e\x1a\x65\x85\xbd\x85\x2d\x57\x1d\x0f\x7a\xf3\x4e\xcd\xdb\xc6\x30\x5b\xd2\x3d\x39\x1e\x38\xb0\xb7\xd5\x8c\x40\x1f\xed\xad\x0c\xab\xcf\x5b\x7b\x3b\xdd\xcc\xf3\x8b\xbd\x99\x61\xd7\xf9\x6e\x6f\xa7\x19\x72\xbe\xd8\x5b\x29\x36\x98\xf7\xf6\x36\xba\xb1\xe4\x73\xc3\xca\x49\x7a\x28\x0f\x7c\xb0\x37\xd2\x95\x49\x1e\x78\x39\x73\x35\xa4\x86\x5f\xed\x0d\x35\x33\xc9\x6f\x33\x06\x27\x35\xfb\xc3\x4e\xff\x7e\xb7\x9c\xde\x6d\x91\x87\x0b\xfc\xaa\xd7\xab\x19\x05\xff\xd4\xab\xe5\x1c\x8d\x1e\x80\x50\xaf\x17\xc1\x9b\x70\x3d\x82\xe6\xa9\x10\x6f\xb1\x3d\x10\x5b\xea\x85\xdf\x94\x07\x52\x03\x7e\x01\xc3\x6c\x3c\x86\x69\xc4\x02\x44\xf1\xe3\x55\x40\x93\x3e\x88\x03\x44\x53\x1c\x46\x3c\x25\x7a\x02\xe9\xaa\x8e\x83\xfc\xad\x3e\x6b\x6b\x0e\xf5\xcc\x04\xaf\xf6\x91\x7e\x7d\xd6\xba\x77\x7a\xdf\x1c\x0f\x04\x26\x04\x69\xb1\xd8\x08\x45\x4c\x06\x0f\x94\x6c\x8c\x41\x8a\xdb\xd2\x5c\x97\x2c\x20\xc4\xbe\x14\x08\xd0\x19\x05\x75\x27\xa9\xd8\x03\xd5\x6c\x7c\x77\x14\xa1\x14\xf5\x00\xc4\xe5\x09\xdd\xcc\x98\x30\x86\xed\xba\x47\x50\x23\x77\x94\x56\x8b\xec\xd9\xb9\xe5\xd3\xcb\xe9\x81\x05\x83\x51\xd2\x83\x4d\x3d\x30\x36\x47\x66\x24\x02\x05\x46\x51\x47\x64\x9b\xf2\x40\xdf\x04\xc1\x13\x2f\x0e\xa0\x5d\xee\x18\x99\x7d\xf2\x60\x92\x64\x01\xfe\x56\xc3\x86\x4e\x93\x86\xf2\x2b\xd8\x22\x17\xc5\x04\xf1\xd7\x57\x43\xb2\x05\xae\x21\xd3\x6a\xf0\x1a\xca\x78\x6f\x8d\xf2\x5a\xae\xc0\x17\x2d\xad\x8a\x7e\xa1\x1b\xb3\x0b\x0f\x24\x74\x6c\xd4\x05\x49\xb2\x83\x8e\x53\x2c\x74\x9e\x18\x95\x75\xac\x9d\xcb\x86\x1a\x25\x54\xce\xa1\xd1\x48\x09\x68\x71\x6a\x54\x2b\xe1\x3a\xce\x4d\x14\x92\xf6\xe2\xcc\xec\x0c\x51\xe0\xe0\x1b\xa5\x3e\x57\x2e\x4a\xec\x99\x75\xaa\x6c\xb1\x63\x34\x90\x84\x2f\x7c\x47\x6d\x00\xbd\x07\x51\x10\x27\xa5\x83\xef\xb0\xb3\x30\xf0\x76\x9f\x6c\xed\xc8\x1e\x7f\x67\xae\x19\x57\xa5\x1f\x98\xc3\x0b\x50\x10\xc2\x14\x61\x7a\x86\x2f\xcd\xfa\xe7\xe7\xc4\xd2\xc1\xf7\x69\x63\x39\x99\x67\xd8\x2f\x46\x55\x5c\x9e\x60\x71\x20\x48\x1c\x7c\x03\x6f\x82\xba\x9b\x55\x78\xc8\x5f\x9a\x5b\x48\xd6\xd5\xf7\x46\x2b\xd5\x38\xfa\xd9\xb6\xa3\x14\xdb\xe6\x07\xa3\x85\x66\x9a\x7c\x69\xae\x9d\x66\x59\xfc\xca\x5a\x6c\xf0\x16\xaa\x61\xf0\x37\x03\x82\x6c\x75\xfb\xc3\xa8\xd5\xac\x7e\xbf\x9b\x2b\x21\x9b\xbd\x7e\xb5\x6c\x20\xcd\x6a\xf5\x67\xd3\x1c\x45\x13\x88\x8c\x5d\xa0\xd8\x8c\x90\x51\xaf\x59\x64\x62\xa3\x01\xb7\x99\xa4\x4d\x55\xa5\x03\x0a\xa3\x4e\x61\x96\x89\x65\x58\x42\xac\x00\x99\x51\x2d\x4b\x15\x20\x30\xaa\xa5\xf0\x2e\xa5\x51\x49\x64\x89\x53\x84\x6f\x7e\xa0\x32\x6a\x55\x79\x42\xda\x83\xe1\xac\x29\xe8\x1c\xde\x01\x91\xd1\xdc\x1e\xc7\x29\x37\xc7\x57\xe5\x44\x6b\xb8\x27\x2f\xc1\xd8\x68\x66\xb2\xb8\xbe\xd1\xa6\xe6\x47\x60\x60\x54\x9d\xa7\xf0\x7a\x0f\x0e\x88\x96\x02\x7f\xbd\xd1\x9c\x16\x1f\x4e\x8f\x8f\x1c\x30\x44\x52\x8c\xbe\x38\xfa\x1a\xa3\xd1\x51\xbd\xd6\x5c\x47\xfe\xd7\xcb\x3b\xc4\xa3\xf5\x1d\x44\xd3\x7f\xb3\xdf\x72\x9c\x3d\x21\xf3\x91\x60\x7b\x6f\xde\x38\x8c\xdd\x39\xd3\xbf\xea\xd8\x7e\xf5\xae\xd3\x94\xef\x35\xe1\xbc\xbf\xa7\x3f\x65\x22\xb9\xb5\x45\x43\x00\x0a\xd2\xcb\x81\x25\x31\x4c\xd1\x29\x61\x34\x22\x2f\x2e\x53\x88\xd4\x69\x71\x31\xcb\xbb\xbf\x17\xda\x11\xb9\x9c\x00\x42\x45\x3c\x1e\xc3\x08\xcf\x59\x1b\x15\xcd\x7f\xab\xdd\x6b\xdf\x90\x2a\x3c\xd9\x4e\x01\xc9\xf3\x10\xf7\x55\xe7\x5f\x6f\xfe\xbf\x57\xaf\x80\xe3\x78\x5d\x5e\x4b\x60\xe3\x31\x27\xc1\xe4\x6c\x92\xeb\xb0\xeb\x19\xbf\x11\xfc\xa8\x6b\xce\xfd\x8d\xc6\x91\xba\xda\xd0\xe1\x38\xc7\x7b\x86\xc1\xa7\x7a\x22\x28\xe6\xb7\xd1\x34\x1b\x8e\xd3\x13\xf8\xb7\x09\x63\x61\x28\x94\xc6\xea\x25\x5d\x1b\x93\xd2\xed\x81\xb3\xba\x46\x9d\x38\x0d\x93\x2a\x82\xa5\x0b\xd9\x0a\xe3\xf1\x77\xb9\x2c\x49\x57\x93\x1e\x44\x6d\x25\xa5\x1b\x00\x91\xf4\x5d\x87\x5f\x01\xb8\x3a\x91\x98\x74\xfd\x9f\x5d\xd8\xc9\xab\x72\x84\x45\x2d\xe4\x01\xe8\x79\xa0\xf7\xcd\xeb\x54\x69\xfc\x9d\xc5\x92\xd4\x2f\x05\x1a\x2a\x89\x3a\xd4\xb8\xcc\x6b\xc4\xd2\x48\x6d\xb2\xbd\x86\x58\x96\xca\x9b\xf3\x38\x4b\x17\x0b\x96\xab\x99\x12\x14\x05\xac\xb2\x49\x24\xb8\x6c\xaf\xbc\x80\xf7\xf7\x1c\x1c\x93\xf5\x1d\xef\x4d\x5a\x25\x49\x17\x76\xca\xac\x40\x78\xd6\xb2\x60\xe6\xd1\xd6\x49\x50\x22\xaa\xea\x74\x64\xdc\xc6\x65\x66\xd6\x10\xe2\x81\x6b\xc7\xef\xd5\x1a\xe0\x2a\x49\x98\x3a\x14\xf9\xb0\x33\x88\x13\x04\x0b\x3c\x20\x2b\x21\xf6\xf8\xfe\x7f\x83\x16\x1d\x7a\xad\x62\x27\xc9\xb7\x29\xab\x15\xf4\x58\x1f\xbb\x4e\xaf\xf1\x04\xf8\xe0\xf9\x4d\xa4\x1e\x3c\x9c\x0e\x20\x0a\x47\x9f\x02\x89\x04\x2f\x62\x84\x74\xbc\x8e\xa5\x23\xa5\xd9\x24\x5d\xdb\x09\x3b\x6b\x8b\x02\x53\xfa\x50\x38\x25\xca\xf2\x05\xbb\x93\xa6\xb4\x57\x9e\x04\x8b\xce\x80\x34\xa5\xbd\x8a\x6a\xd1\x4e\xb8\x25\xed\x53\xe5\x51\xb0\x40\x12\x6e\xda\x8d\x35\x66\x63\x0c\x88\x65\x41\xfd\x70\x2a\x1f\x24\xfa\x72\xb4\x81\x8a\x09\x6b\x15\xfb\x98\x35\x76\x68\x57\xe8\x6d\x50\x6c\xf8\xb3\xda\x18\x68\xec\x11\x06\xda\x89\xcb\x23\x78\xcd\xf2\xaf\x97\x10\x1d\x44\x6f\x27\x27\x94\x59\xbb\xb8\x89\x9f\xd4\xd7\xbf\x4e\x01\xcb\x2c\xb9\xc2\xa0\xa7\x21\x66\x4a\x6e\xec\xdd\x21\x7f\xf6\xfa\x91\xb1\x58\x06\xef\x75\xd0\x08\xa6\x84\x0c\xdc\xcd\x1e\x27\x64\xe3\xd4\xc6\x06\xbd\xa9\xe7\x4d\xeb\x75\x9d\x12\x51\xaa\x7e\x7b\x26\x1d\x3b\xdf\x8f\xb7\xb6\xdc\xd8\xff\xeb\x30\x48\xab\x20\x49\x26\x9b\xa4\x65\xb4\x89\xb2\xcd\x97\x77\x68\xba\x39\x28\xb2\xf1\x26\x1a\xc1\xcd\xa3\x6c\x1c\x44\x9b\x9f\x0f\xfe\xaa\xf1\x35\x6d\x24\x82\x89\x08\x26\x14\xdd\xb4\x66\xf1\xd4\x03\x67\x91\x4f\xcd\x7b\xd4\x60\xbc\xa9\x31\xbd\x3b\x41\x30\xb8\x60\x73\x7f\xcf\x85\x13\x10\xb3\x0a\xe9\x33\xf3\x2b\x74\x2c\xd6\xcc\x75\xce\xe3\xe8\x2d\x1c\x64\x05\x3c\x0d\xae\x48\x30\x3e\xb2\x4b\xe8\x7d\x3f\x1e\x4c\xdc\x5e\x0c\xd0\x37\xcf\x63\x04\x2a\x95\x3f\x68\x0e\xe1\xe5\x27\x18\x66\x45\x24\x0b\x4a\x00\x79\x1b\xa9\xd8\x31\x4a\x55\x8a\xbf\x09\x99\x8b\xeb\x49\x1f\x36\x8e\x4c\xb4\xb2\x64\x06\x04\xfb\xe6\xc0\x88\x3c\xe2\x78\xd2\x9c\xbf\x79\x33\x92\xee\xb3\x4b\x08\x4d\xae\xcf\x28\x30\x90\x33\xf1\xf3\x8c\xfb\xf8\xa2\x21\xe5\xdb\x6f\x4e\xa2\x4f\xb8\x37\x0c\xb3\x08\x46\xf5\x77\xe1\xdf\xf7\x3a\x4e\xa3\xec\xba\x13\xa0\xac\xef\x32\x59\x81\xb4\xb8\xbf\x77\x1c\x6f\x3a\x05\xd7\xd0\xbf\x42\xee\x15\x54\x43\xac\x50\xa5\x48\x7b\x0f\xda\x5b\x0b\x74\x16\x72\xa6\xb5\xeb\xec\x85\x05\x36\xdf\x59\xed\xfd\x66\x6f\x2c\xe0\x59\xd0\xe6\xd6\x0e\xb3\xc7\xb6\xa1\x8b\x68\xd3\xad\xfd\x65\x4f\x2c\xf0\x25\x45\x53\x7b\x77\xd9\x4b\x0b\x82\xd5\x25\xd3\x3f\x6c\x84\xbe\xe2\x7c\xfa\xa7\x16\x44\x6a\x14\xd8\xd6\xae\xb3\xe7\x16\x14\x6a\x9c\xdc\xd6\x9e\xb3\x67\xb6\xe5\x92\x5d\x8f\x5a\xfb\xcd\xee\xda\x26\x41\x14\x80\xed\x5d\x66\xf7\x6c\x67\x81\x2b\x11\xdb\x7b\xcc\xee\xd8\xe0\xab\x8a\xc8\xf6\x4e\xb3\x47\x16\x24\xb2\x32\xb3\x7d\x30\xe4\xfd\x19\xcb\xc4\x15\x9d\xed\x83\x22\x7f\x9a\xb7\x5a\x02\x57\xeb\x00\xc9\x06\x22\x4d\x3d\x42\xa3\x24\xcf\xcb\x4c\x3f\x1b\x84\x07\xe4\x7a\x0b\x4e\x49\x6b\x42\xe3\x26\x2f\x87\x4f\xee\xbe\x10\x2e\x49\xa9\xb2\x58\xe6\xfd\xd9\x20\x74\x9c\xef\xec\xdf\x8f\x68\xbb\xda\x07\x56\x3e\xb0\xd1\x4b\xb1\x7a\xa7\x2b\xdf\x11\x92\xf6\xc8\x01\xbd\xf3\x65\x57\x4b\xee\x3e\xf7\xeb\x48\xda\x24\x07\xf4\xce\x96\xc5\x25\x77\x9f\x8b\x4b\x56\x2d\x39\xa0\xb7\xbb\xf4\xc4\xe4\xfe\x3a\xb6\x8f\x36\x62\x24\x9b\x2e\x7a\x7b\xad\x63\xfa\xdb\x84\x23\xc9\xfc\xd1\xdb\x69\x1d\xd4\xdf\xca\xd4\xea\xc7\xf5\x47\xad\x43\xf9\x5b\xc0\x4b\x66\x98\xde\x7e\xeb\x68\xfe\xb3\x56\x88\x99\x72\x7a\x9f\x5a\xc7\xf6\x9f\x85\x45\x7e\x6c\xf7\xae\x75\xb0\x7f\x0b\x26\xed\xbd\xdd\x41\xeb\x80\xff\x76\xb9\x4f\x7d\x72\xf7\xb1\x75\xdc\x7f\xdb\x8d\x47\x7b\x75\xf7\xb6\x75\xf0\x7f\x1b\xa5\xd4\x1f\xde\xfd\xd2\x3a\x07\x80\x05\x8b\xf6\xf6\xee\x7b\xeb\x4c\x00\x16\x1c\xca\xe3\xb8\x2f\xad\xb3\x01\x58\x30\xe8\x0f\xfc\xde\xb7\x45\xf2\xab\xed\xa4\x28\xaf\xe4\x3e\xb7\x45\xf1\xa7\x55\x44\xd3\x1f\xca\x7d\x68\x8b\x06\xa2\xc6\xfd\x2b\xa1\x79\xd9\x16\x0d\xb2\xa0\xd1\x9e\xcb\x7d\x6d\x8b\x23\xb6\xe0\xd0\x1f\xb4\xfd\xd6\x16\x49\x6a\x41\x22\x9e\xad\xfd\xd1\x16\x7c\xd1\x0c\x1e\xef\xaa\xdf\x5b\xc7\x9f\xb1\xc0\x57\x4c\xc1\xbd\x5f\x5b\x47\xe4\xb2\x7e\x6a\xc9\x96\xda\xfb\xb3\xf5\x43\x10\x0b\x0a\xc5\x24\xdd\x83\xb0\x75\x6c\x34\x0b\x0e\x39\x6d\x09\x6a\x8d\xa1\xb2\x60\x90\x8d\xe3\xbd\xb8\x35\x8a\xd0\x76\xba\x9b\x2c\xec\xbd\xb4\x35\x3e\xf3\xc3\xd7\xf6\xf8\x5e\x01\x97\x96\x81\xb9\xb3\x9f\x2a\x91\x46\xb3\xf7\xb0\xe9\x0b\xd0\x4b\x56\x3f\x31\xc3\x96\x08\x7a\xd9\xd2\x33\xb4\xf8\x35\xce\xbf\xf4\x99\xbe\x85\xa0\x17\x2c\x8d\xba\xc1\x49\x51\x45\x9f\x5b\x56\xba\x21\x1d\x56\xb9\xfa\x25\xd6\x0d\xa2\x0e\xe8\x55\x4b\xcf\xd3\x00\x32\x77\x89\x1b\x1d\x3b\x7b\xe1\x03\xb1\x9b\xb0\xf4\x41\x8c\x6d\xa4\xc0\xe6\x87\xd2\x8b\x5a\xaf\x73\xdf\x82\xcb\x74\x66\xe9\xe5\xab\xff\xa0\x86\x8d\xd6\x01\xbd\xf1\xd2\x6b\x6a\x42\x99\xfb\x49\x25\xd3\x89\x03\x7a\xfd\xa5\x51\xca\xfd\x75\x64\x03\xcb\x72\x72\xbf\x9f\xde\xe0\x11\x48\xaa\x62\x9b\x71\x40\x6f\xb4\x3c\x65\x55\x41\xe8\x53\x1a\x59\xa6\xa4\xfb\x2b\xf5\x86\xad\x67\x36\x9c\x8b\x86\xda\x42\x7b\x93\xf6\x8b\x08\xe5\xa7\xa3\xb7\x68\xd6\xdb\xd1\x24\x1e\xc0\x70\x12\xb6\x8c\x13\x2a\x25\x5f\x59\x65\xa2\x95\x0d\x33\xfa\xf1\x73\x78\xf9\x98\xaf\x1f\x3e\xfe\xd3\x1f\x3e\x26\x10\x6d\x8e\xe7\x24\x59\x41\xf6\x24\x2b\x96\x30\x07\x7a\xac\x82\x65\xe2\x8d\x45\x92\x27\xb3\x08\x56\x50\x97\x8e\xb2\xec\x52\x84\x2a\xa8\x4b\xcb\x38\x82\x61\x50\xf0\x38\x05\x24\x66\x40\xae\x3e\x63\xa7\xf0\x56\x11\x12\x59\x03\x4c\x87\xd4\xfe\xe1\x7d\xa8\x03\xe6\xb3\x5a\xf1\xdb\xfb\xf1\x2c\xfa\x29\x5f\x92\x1e\x16\xb6\x74\x1d\xb3\x7e\x4d\x08\x9f\x37\x21\x14\x31\xeb\xeb\x04\x43\x1e\x71\x07\xe2\xa1\x95\x75\x3a\xd8\x98\x83\xea\xe1\x64\x30\x54\x9e\x1e\xe9\xa1\xe8\x47\x41\x39\x32\x03\xd0\x47\xb2\x47\xc4\x8c\x00\xf4\xcc\xeb\x66\xf5\x01\xe8\xe9\xb0\x1e\x21\xec\xbc\x32\xb3\xbf\x33\xec\x7c\x0a\xd1\x75\x56\x5c\x3e\x45\x61\x52\x8e\x3a\x22\xe8\xe9\xf0\x39\xd1\xd3\xc9\x9a\x9e\xfe\x08\xf4\xf4\x8a\x09\x96\xa6\x00\xb9\x90\x5c\xa9\x26\xef\x33\x8b\x4b\x7b\xfc\xac\x3a\xc8\x06\x0d\x3a\x80\xe5\xab\x87\x53\xe3\x21\xa7\xb0\x34\x26\x48\x1d\xf7\xaa\x2e\x0f\xe3\xa8\x10\xc9\x60\xeb\xd2\x38\x17\xb9\x60\x87\xe2\xa1\x25\xe4\x99\x60\x45\x69\x3f\xc6\x94\x65\xa0\x15\x33\x82\x33\xe2\xa4\x3c\xf2\x27\x6e\xa8\x12\x46\x3a\xa0\xf6\x34\x37\xd7\x41\xd3\x39\xb5\x27\xb6\x63\x1d\x30\x5e\x96\xf6\x22\x6d\x5f\x07\x4b\x57\xb6\xbd\x9f\xea\xc0\x00\x4c\x3f\x4e\x7b\x2f\xd5\x91\x0e\x99\x7d\xdf\xf6\x0e\xaa\xa1\xcc\xd0\xae\x66\x32\xb4\x2c\x82\xdb\x54\x37\xff\xf0\x54\xb4\xab\x08\xb8\xd5\x26\x13\x81\x60\x77\x17\xcf\x89\xdd\xdd\xac\xd9\xdd\x8f\xc0\xee\x8e\x59\xa6\x81\xc2\xd4\xa3\x64\x0b\x87\x4a\x0a\x9a\xa2\xff\x88\x56\x1d\xd1\x77\xd1\x50\x53\xb5\x8a\x46\x0b\xbb\xf3\xe2\xa7\xa9\x1e\x7d\x6a\x56\xcb\xc8\x8e\x2a\xb7\x05\x87\x1a\x1b\xf3\x60\x46\x33\x12\x92\xea\xe1\x21\x2d\x2f\x94\xa4\xbb\x35\xe3\xac\x4b\xe5\xc0\x7e\x23\xad\x8e\xae\xe3\x50\x2b\x8d\x20\x82\x21\x51\x69\x4c\xb4\x9a\x7a\xbc\xe0\xca\x5a\xa1\xb8\xa1\x5f\x6b\x4d\xe8\xfb\x28\xea\x7a\x7d\x2b\x3d\xfe\x15\xe3\x3b\x1d\x65\x85\xf1\xda\x8d\x3c\x2a\x69\xf8\xd0\x8c\x5e\x90\x55\x1d\x42\xe4\xb9\x10\xfc\x45\xe9\x79\x87\xbd\x14\x26\x6f\x62\xff\x62\x2f\x1e\xc9\x18\xd5\x67\x27\xf4\x9d\x0f\x9b\xd6\x9b\xda\x22\xe3\x74\x99\xbb\x90\x33\x9d\x82\x81\x7f\xe3\xf6\x95\x2b\x23\x65\xae\xad\x85\x81\x91\x0e\x58\xfe\x52\xed\x85\x82\x46\xe0\x64\x99\xa9\x74\x30\xcf\xd8\x32\x13\x82\x07\xfa\xb2\xad\x65\x68\xac\xd3\x8a\x1e\xb4\x4c\x74\xc0\x62\x7f\xb6\x97\x16\xae\x74\xe0\x7c\x8b\xb7\x7f\xce\x72\x6d\x87\xad\x3e\xd6\x68\xfd\xa8\xe5\x56\xc7\x22\x1f\xb4\xf6\x4f\x5a\xac\x53\xa8\x0d\x90\xe3\x25\xb7\x90\xdc\x5b\xdb\x3e\x7d\x59\x6c\x3b\x9e\x2b\xb6\xc1\x2b\x6a\x75\x5d\x44\x2f\xbb\x8c\x38\xf7\x77\x89\x6f\x1b\xe6\xc5\xff\x39\x88\x6d\x57\x6b\xb1\xed\x47\x10\xdb\xae\xe7\x88\x6d\xa6\xc0\xb3\x48\xd0\x4f\x5d\x02\x63\x62\x51\xa8\x86\xa1\x8b\xe8\x4b\x1a\x16\x52\x8d\xc4\xfc\x7c\xb8\xb2\x62\xa2\x88\x46\xb5\x52\x62\xc2\x83\x35\x95\x65\x30\x84\x42\x33\x31\x11\x31\x9e\xea\x08\xa7\x7d\xad\x2a\xaa\x1f\xfa\x0c\xb4\x0a\x44\x08\xee\x48\x6f\xce\xae\x97\x43\xae\xb7\xc8\xfd\x2b\x37\x7a\x0c\x79\x62\xac\x03\xe6\xd3\x5b\x85\x86\x41\x83\x2d\xad\xd0\x2a\xd4\x0c\x1a\x74\xbe\xc8\xab\x50\x34\x68\xb0\xe9\x77\x6a\x2f\x39\x0c\x8d\x41\xd7\x9a\x84\xd6\x82\x43\x24\xf3\xc2\xeb\x79\xbc\x70\x06\x17\x7c\xac\x24\x8b\x2c\x3e\xf8\x8c\x5c\x8b\x58\x42\xdc\xae\xaa\x38\x32\x9b\xc5\xf9\x76\x1e\xe0\xc1\x36\x46\x14\x07\x01\x65\x2e\xff\xc9\x88\xe2\x92\x7f\x0a\x7c\x4e\x1c\x3a\x87\x6b\x16\xfd\x23\xb0\xe8\x31\xf4\xdd\x47\x08\xa9\x2d\x1c\x57\x72\x7b\xf3\x07\x84\xd4\xce\xa4\xec\x86\xc4\x74\xbc\x50\x44\x6d\x11\xe9\xb2\x21\xd0\xe5\xac\x00\xda\x0b\xe9\x95\x6e\x17\x6e\x79\x61\xb4\x2c\x60\x99\x55\x45\x48\x6a\x6f\x66\xd6\x1e\x1b\xb5\x51\x11\xc4\xe9\x76\x89\x8a\x00\xc1\xe1\x44\x44\xe2\xae\x23\x9a\x96\xe1\x08\x46\x55\x12\xa7\xc3\xfd\x24\x1e\xc6\xfd\x38\x21\xf1\x0f\x1c\x48\x7e\x91\xf0\xb5\x97\x75\x96\x44\xa1\x4a\x42\x28\xdf\x89\xa2\xa2\x8e\xc2\xdd\x54\x79\x3a\xab\xf2\x7c\x56\xcc\x5e\x29\x70\x2a\x61\x3b\x53\x16\x6d\x1b\x35\x84\xae\x65\x81\x67\x43\xf5\x5d\xee\xee\x02\x5d\xe4\x80\xaa\x7b\x0b\xb4\xbf\x8b\xcb\xc3\x78\x58\x04\x28\x4e\x87\x80\x77\x9e\x3a\x2c\xea\xf6\x83\x7a\x03\x1a\x8d\x00\x5f\xa3\x31\xa0\x23\x7b\xf8\x6e\xd9\x84\xc0\x02\x71\x37\x34\xa2\x17\x56\x16\x87\xdb\x6c\x33\xca\x4a\xb4\x7d\x95\x25\x15\x79\x92\xfb\xce\x18\x36\x7b\x42\x50\x87\x1b\xae\x35\x20\x3c\xde\xb6\xdc\x94\x55\xee\x29\x5d\x84\xaa\xf1\xa3\xd1\x43\xf7\xde\x67\x5d\x68\x00\x97\x3a\x06\xb7\xd4\x3e\x2e\xf7\xf0\x16\x26\x21\x5a\x9c\xb8\xdc\xaf\xf7\x25\x10\xb1\x6e\x7f\x79\x48\xa7\xef\x2d\x42\xd7\x46\x50\xd1\x69\x7e\xa9\xdd\xe2\xa0\x11\xa4\xd4\x01\xef\xf5\x4a\xfc\x85\x98\x4e\xe3\xb3\x5e\x27\x8f\xfb\x83\x5e\xd9\x70\x54\x5f\x1a\xed\xd8\xcb\xf6\xaf\xf6\x0a\x45\x25\xf4\x9b\xd1\x06\x0b\x53\x07\x91\x03\xfe\xd0\x6b\x94\x88\x19\xbf\xeb\xb5\xfc\x35\xd7\xaf\x7a\x0d\x3f\xf2\xe0\x4f\xbd\x0a\x25\xe5\x7e\x8a\x99\x72\xe4\x10\x19\x49\xad\x95\xa5\x40\x64\xd4\xd2\xd8\x17\xb1\x51\x2e\xc8\x21\x96\xb6\xcc\x4a\x58\x5c\x61\x74\x85\x51\x47\x28\xe5\x69\x4d\x28\xb1\x90\x66\x7c\x1c\xb1\x8f\x32\x73\xb4\x32\xf5\x0a\x2c\xd0\xd9\x83\x97\xd2\xa8\x22\xa7\xb5\x74\xb0\x28\xa8\x2f\x5d\x56\xa2\x2f\xe4\x9c\x96\x0e\x08\xa1\xac\xc8\x8e\xa2\x02\x4a\xba\x65\xf7\x35\x08\x04\xe7\xa3\x8a\x66\xb6\xee\x5e\x87\x35\x26\x1d\x73\xaa\xf6\x5e\xa0\x17\x6e\x49\x23\x66\xd6\x6f\xb2\x5d\x2d\x5c\x96\xd2\x81\x34\x55\x9e\xd7\xd2\xc5\x98\x11\x60\x50\x04\xb7\x53\xe8\xb6\x78\xa5\xcb\xe2\xec\xc9\x2f\x83\x97\x00\x2a\x51\x76\x02\x66\x5c\x13\xde\x65\x00\xb1\xe8\x83\x1c\xd6\xd6\x16\xfe\xc1\x69\x38\x8f\x42\x58\x22\x5a\x46\x74\xa1\xba\x5d\x61\xde\xf8\xc0\x8b\x9f\x3c\xa5\x82\xc3\x77\x3c\x2d\xac\x1f\x51\xb5\x4a\x42\x6b\xef\xf5\x37\x12\x93\x8f\x87\xe0\xeb\x48\xbc\x84\x06\xa5\x52\x28\xb4\x36\xe1\x9a\xd4\x0b\xe4\x82\xdc\x2f\x12\x2f\x52\xa7\xff\x52\xbc\xc2\x5a\xb7\xfd\xe2\x27\x2b\x24\x12\x1f\x44\x83\x66\xf0\x06\x16\x82\x92\x32\x07\xbe\xc3\xb2\x32\x46\x50\x0f\x8a\x1a\x65\xd7\x29\x0f\x7d\x4a\x29\xdd\x1b\x5a\xd8\x65\xb1\xeb\x6a\xd2\xfa\x86\x1e\x75\x62\x7b\x61\x55\xf5\xc1\x7e\x23\xf5\xee\x3a\x71\xca\xa5\x20\x1b\xee\x83\xd0\x88\x6e\x28\x90\xdc\xdf\xbf\xd0\x61\x3b\x41\x02\x0b\xb4\x1d\xc6\x45\x98\xc0\xed\x41\x9c\x24\x4e\xd7\x3e\xec\x30\x48\x43\x98\x68\x2d\xb9\xfc\x8f\x07\xae\xf7\x20\x6c\x1f\xb7\xd0\x3a\x85\x23\x18\x5e\x2a\x65\xd3\x12\xa2\x7a\x48\xc6\xe8\xf9\x58\xcd\x48\x7e\x5e\xd7\x15\x31\xda\x16\x90\x1a\x1b\x82\xda\x11\x69\xce\xeb\xc8\x83\x20\x54\x8d\x46\xb5\xe3\x0b\xde\x3c\xb2\x05\x46\x21\x7d\xb7\x05\xc6\x21\x21\xa5\x23\xe9\x5a\x26\x3f\x25\x5b\x06\xdf\x58\x67\xc7\xec\x63\x60\x69\x6b\x42\xc4\x21\x0b\x61\xb9\xb7\x14\x00\xa9\x4b\x0d\x85\x6e\x0a\x5a\xb6\x20\x14\xb9\x4b\xad\x12\xfc\xe2\xe7\xd0\xfd\xfe\x18\xb6\xb3\xf7\x06\x64\x59\x0e\x6a\xaf\x04\xfb\x6c\x8e\x5c\x88\x52\xed\x15\x61\x1f\x0c\xf0\xb2\x34\xd6\xde\x76\xf6\xd2\x80\xdf\xb0\x7f\xdb\xdb\xd1\xbe\x9a\xa8\x56\x16\x18\xee\xb7\x06\xd8\x2b\x0e\x0b\xf7\x87\x89\xa6\x96\x4c\xdb\x07\x84\xfb\xdd\x00\xbe\xe2\x70\x70\xbf\x1a\x08\x44\xb4\x83\xd6\x91\xe0\xfe\x34\x80\x0b\x11\xbb\x7d\x2c\x38\x08\x0d\xf0\xb2\x98\xde\x3e\x18\x1c\x32\x11\x28\xce\x08\xad\x03\xc1\xc5\x26\x02\x16\x28\xaf\x75\x04\xb8\xd4\x04\x2d\xdd\x37\xda\x87\x7e\x2b\xac\xf0\xd9\x95\xa5\x7d\xb4\xb7\xc4\x04\xaf\xdd\x7a\x7a\xc7\xad\x7d\xfc\x4d\x1c\xf2\xc5\xa9\x77\xd2\xda\x61\x56\xdf\x3c\xf4\x76\xb3\x58\x24\x37\x6b\x4f\x0f\x7c\x57\xde\xef\x6b\x08\x72\xea\xc2\x72\xb8\x24\xf4\x9c\xfa\xad\xcc\x04\x2d\x87\xbb\x3a\x5d\x12\xbe\xe8\xab\x21\x09\x2c\x07\x4c\x09\x56\x72\xbe\xea\x4f\x60\xb9\xf6\x2d\x16\xbe\x6d\x2e\x94\x39\xeb\x67\xde\x0c\x17\x8b\xe4\x36\x0f\xc8\x1c\xb4\xb6\x9b\x24\x0d\xe9\xb6\x14\x62\x2b\x98\x39\xa8\xb5\x9b\x26\x0d\xf3\xb6\x14\x56\x1d\x82\x86\xb0\xb4\xd1\x88\x3a\x58\x47\xeb\x98\x6f\x95\x09\xbd\x56\x7f\xb4\x8f\xf7\x16\x9a\xc0\x15\x0d\x4a\xfb\x58\x6f\xc6\xca\xa8\xd7\x5f\x1a\xe4\x6d\xa9\xaf\xa1\x43\x98\xf3\xf9\x2d\x01\x54\x0e\x96\xc4\x68\x09\x9f\xb2\x0c\x4a\x72\x6f\xa7\x31\xe0\xda\xa0\xa5\x60\xe6\xa0\xd6\x2e\xdc\x34\x28\xdc\xd2\x34\x45\x86\xb0\x1c\x42\x7c\xc3\xa7\x31\xe2\xda\x20\x25\x50\x34\xc4\xdf\x95\x87\xc1\x70\x96\xd9\x3d\xaf\xe3\xc6\x6c\x0f\x68\x44\x94\xd5\x3c\x8a\x5b\xe4\xb9\xf0\x3c\x83\xb8\xb0\x5b\x5f\x3e\x27\xb3\xf5\xe1\xda\x6a\xfd\x23\x58\xad\x4f\xf9\x73\x62\xdd\x9c\x5b\xd8\x5f\xae\x25\xf6\xe2\xcc\x5e\xac\xbc\x8a\xd3\x5e\xc3\x31\xbb\xb8\xf8\x19\xaa\x3f\x23\xf5\x67\xae\xfe\x1c\xab\x3f\x75\x77\xfd\x65\x7c\xd2\x2e\x15\x43\x55\xed\x46\x76\xc9\x93\xc5\x05\x09\x2c\x43\x18\x89\x90\x54\x23\xad\x49\x9a\x45\xb0\x64\x31\x98\xf0\x25\x64\x68\xad\xbf\x19\x05\x55\xa9\x78\xf1\x2b\xf5\x3b\x57\x41\x9c\x04\x44\xfe\xbf\xd2\x87\x80\xa7\xf6\x8e\x68\x8d\x71\xf7\x6b\x63\x84\x78\x86\x41\x9c\x22\xd1\xe6\xd6\x06\x42\x1a\xc2\x85\x56\x1f\xc5\x63\x98\xe2\xcb\xb7\xd4\xe6\x46\x6b\xf3\xbd\xca\x50\x20\xd5\x1f\x6b\xf5\x65\x98\x91\xe5\x39\xe1\xae\x75\x03\xff\xd0\xea\x82\xde\xfa\x75\xf7\x48\x07\x6c\xf9\x4a\xed\x9f\x1d\x0e\x8d\xe1\x6b\x1f\xba\xbd\x8f\xe0\xc4\x8e\x42\x2c\x72\x7b\x57\xc1\x2b\x2b\x0a\x69\xbb\xb5\xf7\x17\xbc\x36\x3e\x87\xba\x63\xdb\xeb\x4d\x6f\xcd\x0f\x6e\x6e\xfa\xf6\xea\xd3\x0b\xeb\x44\xe4\xcf\xd1\x5a\x85\x7a\xa3\xa3\xb0\x1d\xbd\xf6\x9a\xd4\x63\x1d\x8d\x7e\x7a\xdb\x6b\x50\x4f\x74\x14\x35\x01\x68\xaf\x40\x55\x1e\x1f\x9c\xce\x96\xfc\xaa\x61\x9c\x2e\xe2\x72\xb9\xa2\x97\x04\x73\xa2\x1d\x34\x79\x44\x0a\x31\xf0\xfc\x39\x89\x81\x67\x6b\x31\xf0\x47\x10\x03\x77\x59\x14\x84\x39\xe1\x63\x98\x9c\x67\xb6\x0a\xec\xc5\xa5\x1a\xb2\xab\xf6\xad\x2a\x51\x56\x04\x43\xb8\x1d\x66\x29\x2a\xb2\x24\x81\x85\xfe\x94\xd3\xf5\xfc\x9f\x7b\xdf\xa6\xdc\x75\xb2\x09\x02\x75\xb7\x6e\xe8\x1b\x2a\x83\x12\x0e\x89\x91\x52\xce\x65\xd5\xdc\x5e\x3c\x36\x1c\xa7\xc4\xb0\xcb\x5f\x6a\x03\xbe\x5c\xb8\x7f\x93\xd7\xce\x60\x7d\x3b\xcc\x81\xbd\x78\x64\xa0\x22\xac\x5a\x20\x61\xc2\x01\x07\x3f\x6c\x21\xf5\x9e\xeb\x79\xc2\x6b\xa9\xf4\x9c\xe7\x07\xce\xb3\x24\x1b\x92\x00\xbe\x57\x5a\x5d\x5e\x64\x57\x71\x84\xbf\xdb\xb5\x56\xc3\x6d\x38\xb7\x5a\x85\xb4\x40\x42\xfc\x3c\x97\x25\x60\x21\x71\x9a\x7d\x3e\xc1\xef\x55\x5c\xc8\x52\xa7\x05\x2e\x5f\xa8\x93\xe6\x36\x7c\xf5\xc0\xa5\x6d\x0c\x1c\xc4\xa1\xad\x56\x74\x3e\x95\xfc\x8c\xcc\x11\xe0\x73\x98\x15\x96\xcc\x8e\x66\xd3\x57\x7a\x79\x8d\x83\x80\x96\xc7\xd4\x08\x54\x6e\xf4\x4a\x94\x70\x40\x53\x30\xf1\xcf\xdc\xa1\xa2\x77\xe7\xf9\xc7\x5a\x0b\xc9\x57\x3a\x6c\x79\xdf\xb4\x17\x90\xaf\x8d\xa1\xf3\xad\xd7\x5e\x34\xbe\xd5\x81\x0b\x0b\x64\x6b\x99\xf8\x42\x87\xad\x1c\x80\xf6\x12\xf1\x8d\x0e\x9f\x9d\xa1\xf6\x42\xf0\x71\xf3\xc8\xc5\x31\x6c\x2f\x08\x9f\xcc\x58\x20\x7e\x0c\xdb\x0b\xc2\x97\x33\xd0\x88\xf3\xdc\x5e\x1a\x9e\x3b\x19\x71\x7e\x17\x7b\xa8\xbb\x38\x38\x0f\x0c\x65\xbd\xe9\xa1\x75\x67\x88\x25\x6d\x9f\x8e\xce\x8a\x40\x5a\xcc\xd6\xce\x07\x33\x26\xa0\x2c\xe3\x68\xc9\x65\x6c\x00\xa4\x2d\xe0\x50\xbe\x7d\xec\xce\xbc\x7d\x64\x49\x1c\x4e\xe6\x29\x9b\xb5\x5b\x04\x15\xa4\xa5\xc7\x55\xeb\x00\xbc\xeb\x1b\xc2\x53\xbf\x21\x8c\x7d\x37\xb6\x2b\x8a\x17\xd2\x1f\xdb\xa3\xaa\x99\x61\x28\x97\x09\xb3\x12\x59\xc3\x50\x46\xb6\x80\x93\x7a\xa8\xde\xa2\x4a\x30\xaf\xd4\x63\xf5\x92\x62\x1a\x1a\x3c\x94\x42\x54\xe6\xd6\x10\x95\x71\xfb\x10\x95\xf9\xac\x48\x92\xad\x95\xa4\x95\x0e\x9f\xcd\xba\xbd\xcc\x17\x5a\x21\xb3\x98\xea\xab\x8d\x80\x39\x33\x20\x30\xf3\x3a\xf9\x1b\x2d\x7d\x1b\x26\xdd\x7b\x0e\x44\x7a\xbc\x26\xd2\x3f\x02\x91\xee\x2f\x68\xcd\x6b\x88\x71\x39\xdf\x9a\xf7\x70\x75\x43\x2e\x3d\xd7\x39\xc8\x05\x45\xae\xcb\x93\xa0\x8f\x0f\x6b\xa5\x15\xa3\x8c\x93\x62\x5e\x46\x37\x50\x1d\xe7\x92\xc4\x53\x1f\xeb\x61\xcf\x29\x92\x55\xd0\x50\x0d\x34\x1b\xe7\x2a\x68\xa8\x06\x19\x4f\xb5\x3d\xf1\x8c\x74\xb0\x6c\xb5\x56\x1c\xa7\xbd\x3f\x8b\x2c\xab\x79\xa0\xb6\x45\x3a\xcc\x39\x84\x5a\xd5\xdb\x3f\xd4\xf9\x42\x90\xe8\xeb\xe7\x44\xa2\x6f\xd7\x24\xfa\x47\x20\xd1\x17\x9c\x44\x8b\x47\xdd\xea\x79\x11\xd4\xba\xb1\x45\x93\xc6\x9b\x91\xf3\x3e\x4c\xb2\x74\x58\x9e\x65\x9e\xeb\x5c\x64\xfd\x96\x41\x8b\x59\x54\xa0\xca\xde\x36\xb4\xa6\xd9\xb0\x47\x66\x7c\xb8\xa8\x7f\xcd\xdf\xa6\xca\xeb\x50\x8a\x08\x42\x75\x03\x78\x13\x26\x55\x04\xa3\x4f\x7a\xc3\xb1\xd6\x10\xaf\x0b\x8f\x25\x24\x15\x1e\x44\xc2\x05\x44\x2a\x96\x92\x7d\x8f\xb4\x5a\x39\x85\xfd\x50\xab\xe3\x39\x6e\x69\x66\xe8\x89\x56\x1d\x97\x27\x45\x16\xc2\xb2\x84\x11\xd7\xb1\x13\xbd\x2f\xef\x27\xbd\x92\x14\x51\x15\xf9\xa8\x3a\x52\x2e\xe3\x3a\xf8\xe2\x26\x7c\x03\x3b\x83\x38\x8d\xf8\xa3\x40\xfa\xbc\x4b\x19\x0a\x27\x40\x28\x1b\x0e\x13\xa8\xae\x16\x26\x26\xa4\x4b\xc3\x62\x76\xe2\x94\x94\x97\x2e\xf4\xde\xcc\x6a\xe8\xcf\x84\x52\xc0\x71\x76\x05\xe9\xa9\x72\xa1\xd7\x9d\xd9\x38\xaf\xca\x11\x6f\xca\x46\xbd\x93\x24\x5a\xb3\x77\x59\xf1\x89\x3d\x35\xa0\x8a\x16\xd4\x6a\x7c\x18\x1d\x5e\xc5\xfa\xf9\x82\x03\x16\x1f\x66\x49\xdf\xe0\x69\x1b\x56\x7a\xfb\x29\x03\xa5\x1f\xbd\x4c\xaa\x21\x57\xed\xff\xf5\xf2\xce\xf6\xc1\xd9\x2b\xcf\x57\x2c\x9c\xa6\xf2\x51\xa7\x7f\x91\x68\x56\xb7\x6a\x14\x24\xe3\xc8\xb4\x17\x8a\xc6\x3a\x8e\xc6\x53\xd7\x5e\x4c\xea\xeb\xb8\xc8\xc1\x6d\x2f\x27\x0d\x2c\x70\x0f\x56\xe2\x6f\x33\xb2\x40\x96\xc8\x47\x7b\xcb\xc2\x50\x47\x20\x53\xa0\x55\x84\xf7\xd4\xc0\x6b\x44\x6c\x15\x31\x3e\x35\x0c\x0a\x1d\x6c\x6f\x59\xd0\xc7\x6f\xa1\x71\x0e\xe8\xc5\x9d\x80\x88\x26\xf3\x55\xc8\xf3\xa1\x79\x20\x92\x15\xc8\xd6\x01\xcc\x24\x57\x6d\xc7\x33\x1b\xb8\x36\x3c\x25\x9c\xd9\xc5\xe2\x92\xfc\xdf\x21\xc1\xaf\xe3\x70\xae\xa5\xf7\xa7\x2b\xbd\x5f\x73\xe9\xdd\x94\xb1\x0b\xb3\xa2\xe9\x22\x2c\x02\x37\xe9\xdc\x79\xaa\xeb\x64\x98\xf4\xbd\xba\xac\x23\xb2\xbf\xf5\xc3\x05\xf2\x89\x2c\x46\x47\x5a\x8c\x4d\x5b\x1e\xe8\x89\x19\xed\x53\x66\x5b\x7a\xc0\x4f\xcc\x73\x28\xbb\xd1\xe3\x7d\x0a\xb9\x49\x0f\xf8\xc9\x34\x1d\x7a\xc4\xcf\x12\x05\x98\x5e\x0d\x1b\xc4\x6b\x3d\x64\xf9\x8c\x29\x08\x71\xcb\x11\x70\x1a\x41\xf0\xc6\xa4\x5b\xe9\x78\x4d\x52\x39\x11\xc8\xa9\x27\x49\x55\x14\x30\xa5\x97\x26\x49\xf2\x77\x76\x4f\x3e\xf3\x68\x16\xf5\xfc\xdf\xf0\x57\xaf\xb8\xb6\xcb\x7f\x1d\xc2\x71\x56\x4c\x1c\x23\x14\x3b\x19\xd4\x5f\x18\x5f\xe7\xe5\x1d\x89\xc1\x3e\x05\x91\x7f\xa5\x26\xfd\xa0\xc2\x55\x6b\x01\x31\xd7\xe1\x36\xec\x88\xf6\xe2\xe1\x58\xc7\xa4\xc8\x42\xad\xa5\xc4\xbe\x0e\x5e\xec\xcb\xf6\x82\xe2\xc0\x5c\x25\x2e\x0c\xb4\x16\x12\x47\x3a\xf0\x5a\x0f\xd8\x5a\x3e\x1c\x1a\x4b\x4e\x0f\xd8\x8a\x33\xc5\xcc\x0c\xb3\x5a\x40\x16\x17\xc2\x1a\x78\xfc\xb1\xe3\x8b\x2f\x18\x68\xf5\xa1\x59\x64\xd6\x0a\xcc\xb5\x08\xf4\x74\x45\xa0\x0b\x16\x8a\xdc\x92\x89\xf7\x01\xce\xc1\xb1\x4d\xcb\x68\xb6\x0d\x69\x90\x46\x11\xb6\x34\x2f\xe0\x55\x9c\x55\xa5\x78\x15\x7e\x10\xd5\xae\xbd\xb6\x76\x47\x59\x04\x4f\x59\x70\x14\xcc\x9f\xda\xab\x22\x45\xb8\x00\x53\xb9\x68\x1d\x9d\xa1\x6d\x94\xc7\x66\x53\x3b\xaa\x01\xcc\xaf\xb9\x5f\x43\x12\x4c\x4c\x4d\xa3\x89\xb2\x9e\xae\xa1\x75\xb4\xad\x09\xd7\x3e\x4e\x89\x76\x27\xb7\x07\x46\x58\x0d\x4b\xd5\xc0\xdb\x17\x6b\x15\xec\xb5\x01\x51\xbd\xde\xab\x60\xb2\x1a\x0a\xb4\x22\x1d\xcc\x50\x07\xcc\xbe\x7a\x7b\x1e\x3b\x99\xbf\xfc\x7c\x4f\xb4\xd7\xc4\x5c\xcd\xfa\x06\x02\x4f\x6b\x27\xcf\x7c\x09\x8d\x86\x08\x45\xf3\xa4\xd3\xa6\x62\x59\x60\xc3\xd4\x2f\x3c\x07\x49\xe0\x7a\x2d\x09\xfc\x08\x92\xc0\xad\x9e\x3a\x75\x15\x8f\xc4\x45\xf1\xec\xd4\xa9\x46\x4c\xe7\x3a\x19\xf2\xac\xc7\x40\x66\x37\xea\x41\xd6\xd0\xa7\x4d\xa2\x93\xab\xfa\xe9\x49\x5e\x09\xcd\xc7\x15\x8f\xcb\x4b\xee\xe8\x5c\x6e\x50\xcb\x0f\x83\x1b\x21\x2c\x5c\xf1\x07\xda\xe5\xa5\x10\x11\xea\xd2\x38\xcb\xa5\xf7\xe8\x75\x29\x5b\x0b\xa1\xf4\xe0\x35\x8c\xdc\x4d\xa4\xe4\x27\xd7\xaa\x3a\x99\x8c\x77\x15\xf7\xf2\x6b\x3d\xf7\x09\x9d\xf2\x2a\x04\x08\x2b\x68\xb2\x6a\xab\x90\x1a\x34\xe8\x74\xe1\x57\x21\x2b\x68\x80\xe9\xb7\x5b\x85\xac\xa0\x01\x16\x9f\x7f\x15\xe2\x82\x06\xbc\x4e\x0b\xbb\xda\x9c\x2a\xb7\xb3\x58\x76\x19\x06\xf6\x7b\xbe\xfe\xce\xf7\x29\xe6\x15\x9b\x95\x1f\x45\xb0\xf7\xbd\xe7\xc4\xde\x77\xd6\xec\xfd\x47\x60\xef\x47\x8b\xe6\x1c\x53\x19\xb9\x59\x5c\x36\x24\x06\x99\x95\x16\x45\x7b\x70\x5b\xe1\x93\x2b\x3e\x91\x12\x63\xfd\x85\xcf\x9e\x50\x56\x29\x22\x64\xa4\xa9\x3f\xbf\x7c\xec\x36\xc2\x13\x90\x7e\x26\x7f\x2a\x3d\x30\xf0\xe6\x3c\xb2\xe6\xbc\x67\xa5\x60\x11\x29\xd8\xcc\x47\xbf\x34\x10\xa7\x65\x74\xf2\xd9\x22\xc3\xc3\x2d\xbd\x4e\x02\xd3\x21\x1a\xfd\xfc\x1a\x8f\x6f\x68\x40\xa3\x57\x52\xf2\xcf\x51\x90\x66\x98\x6e\xf2\x3c\x64\x26\x8e\xbf\x5e\xde\xfd\x8b\x1a\x26\xe2\x31\x9c\xd6\x5e\x26\x75\xdf\xe9\x39\x2b\x61\x10\xa6\x7f\x61\x9c\x93\x16\x62\xd2\x9e\x6e\x2c\x39\xc5\xc4\x5e\x3c\x38\xde\xe3\x2f\x78\xc9\x27\xbb\xd6\x8a\xb5\x2f\x7a\xab\x55\xc3\xa2\xc8\x0a\xf1\xda\x98\x17\x5f\x05\xc9\x81\x14\xe0\xa6\x2e\x1f\x05\x35\xa0\x63\xad\x26\x4e\xc3\x02\x06\xc4\x3d\xe1\x44\xab\xa2\xeb\x7b\x69\x29\x65\xcb\x7d\xa8\x55\xf1\xd5\x3f\x35\x2a\xf0\x77\x3f\x37\x07\x75\x48\x2a\xce\xb4\x0a\x92\xcb\x6b\x97\x4b\x72\x57\xfe\x8e\x3b\xb1\xba\x6d\xb0\x25\x5d\xc5\x5b\x5c\x0d\x05\xfb\x2a\xab\x78\x88\xab\x41\xd6\x3e\xec\x2a\x9e\xe3\x6a\x18\xd8\xde\x58\xc5\x43\x5c\x1d\x32\xdb\x5e\xab\x78\x89\xab\x81\x16\x3b\x74\x15\xef\x6f\x35\xe0\xd2\x26\x5f\xc5\xb3\x5b\x7d\x3b\xae\x28\xff\xed\xa1\x0d\x30\x3b\x6a\xed\x03\xcf\x9c\xea\xd0\x45\xce\xc6\xd6\xcf\x66\xcf\x4d\xd8\x24\xe2\x72\xfb\xd7\xb2\x96\x6d\x42\x69\x46\xfb\x28\xdd\xbb\x3a\x6c\x42\x76\xda\x07\xe8\x9e\xc8\xe2\xff\xd1\x4c\xf1\x1f\x16\x57\x71\xb8\xa2\x88\x8e\x8f\xa3\xaf\x13\x82\xfc\xe0\x39\x09\xf2\xa3\xb5\x20\xff\x23\x08\xf2\x43\x5d\x4f\xd7\xf0\xfc\x8b\x17\x67\xaa\x9f\xd0\x2c\x27\xa3\x54\xce\xa3\x87\xc5\xbd\x2a\xd9\x0e\xb3\x34\xc5\x17\x72\x2c\xe1\x3f\x5c\x32\x1c\x28\xaf\x7b\xeb\x37\x60\x03\x49\x91\xf5\x91\x3e\xc5\x8a\xb4\x2a\x14\x0c\xa5\x87\x01\x75\x69\x96\x7e\x26\x69\xd8\x85\xd2\x6d\x20\x82\xc3\x90\xe1\xd6\x2a\xb7\xe9\x14\x84\xfe\xc8\xad\x2c\x4f\x7e\x5b\xab\xc5\x22\x1d\xb0\x34\x8f\xf6\xf2\x59\xae\x43\xa7\x4b\xd1\x5e\x3c\x1b\xeb\x80\xc5\x6a\xb6\x97\xcc\xfa\x3a\x70\xfe\x41\xda\xcb\x66\x95\xcc\x65\x86\x33\xb9\x4c\x1c\xc1\x30\x28\xb6\xf3\x22\xbb\x99\x6c\x57\x79\x89\x0a\x18\x8c\x57\xe3\x57\x32\xcf\x0f\x56\xb0\x8f\xf2\x39\xb1\x8f\x6a\xcd\x3e\x7e\x04\xf6\x11\x32\x9f\x57\xd3\x2b\xa3\x31\x64\xdc\xc3\xbd\x2b\x4a\x11\xbd\x01\xc5\x29\x31\x47\x53\x77\xbb\x8c\x51\xed\xba\x41\x92\x85\x41\xf2\x36\x4e\xa3\x13\x62\xc1\x09\x38\xed\xce\xfc\xca\x4d\xb4\xa8\x0a\x2a\xa8\xf6\xfe\x8d\x81\x8e\x43\x1b\x4d\x7b\x46\x91\xc8\x84\x2b\x5c\x98\x70\x3d\x84\x5e\x3d\x50\x20\x96\x68\xd8\xc6\x6a\x36\x5a\xc6\x37\x9a\x11\xee\xcf\x4e\x9c\xf1\x0e\x5c\x6c\xab\xe1\xa1\x32\x62\xb5\x61\xdb\x76\x34\x07\x21\x40\xbe\x53\x03\x2f\x1d\x90\xd2\x42\x37\xf6\x13\xef\xa9\x12\xe3\x29\x08\xfc\x42\xda\x89\xa5\x32\x83\xca\xc7\x7b\x3d\xf4\xdb\xec\x45\x90\xfb\x77\x53\x20\x93\xf3\xb0\x81\x9c\xe7\x98\x9c\x87\x8c\x9c\xe7\x2a\x39\x97\x7f\x82\x5c\x27\xe7\x79\x23\x39\xcf\xef\xef\x73\x9d\x9c\xe7\x2a\x39\xcf\xfd\x6a\x11\x72\x4e\xde\x03\xd6\x6a\x5e\x17\x5f\xe0\xa0\x77\x7f\x0f\x89\xf3\x08\x88\x24\x72\x9e\x6b\xc4\x36\x67\xe4\x5c\x29\x7f\x93\x9b\xdf\x25\xe2\xe4\x3c\x9f\x4d\xce\x75\x0c\xf6\xad\x85\x87\x98\xe3\xe9\x31\x72\xee\xe7\xa0\xf0\x36\xf0\x4e\x96\x6e\x9f\x12\x95\xc8\x16\xa1\x12\xd6\xcb\xf4\xb3\xa7\x13\x3a\x89\x78\x14\xca\xc0\x08\xec\x33\xa5\x0a\x6c\xf4\x6b\x8a\xb0\xa6\x08\x8c\x22\x58\x82\xf0\x3e\x5d\x0d\x5b\x93\x31\x7d\xc3\x4c\x58\xf2\x1c\xae\x4e\xa7\xeb\xab\xd3\x8f\x70\x75\x3a\x67\x9a\x37\x8b\xaf\xbc\x25\x54\x07\x4d\x48\xdb\xea\xa9\x1f\x2f\xae\xac\x61\x39\xf4\x70\x1d\xbc\x79\x64\x7b\x73\x98\x37\xc0\x18\x37\x94\xf7\x55\xb5\xe1\xa0\x85\xf2\xef\x90\x07\xa7\xa6\xd1\xfd\x6b\x0f\xb7\x43\x29\x1a\xb3\xf0\x6e\x3b\x94\x5d\xf2\x0f\xf6\x84\xc7\xfb\xa1\x11\xae\xfa\x4a\xab\xe1\x01\x7f\xaf\xb5\x0a\x9e\x9a\xfb\xd6\x5a\xa1\x64\x72\xbd\xd0\x9a\x54\x44\x37\x46\xdf\xa0\xdd\x68\x75\x05\x8d\xa0\x5b\xee\x72\xb2\x7b\xc2\xe6\x78\xdc\xd0\xf2\x4c\x8a\xa7\x7c\xa2\xb5\x11\xc4\xfb\x20\x1d\x64\xdc\x0c\x3d\x0d\xca\x49\x1a\x6e\x0e\x21\x12\x5e\xdd\xd6\x7c\xc8\x83\x38\x25\x41\x1b\x8a\xc8\x55\xdc\xfc\x11\xcf\xc8\x7e\xb0\x87\xc5\x89\x91\x7f\xea\x0e\xd4\x00\xd2\x2c\xed\xc2\x0a\x92\xac\x68\xa0\xe9\xb7\x5d\x45\x6a\x15\x0d\x30\xdf\x1e\xab\xc8\xa9\xa2\xaf\x87\x88\x4a\xbd\x82\x6c\x2a\x1a\x70\x11\x95\x7a\x05\x79\x54\x34\xd8\x7c\x9f\xaf\x22\x79\x8a\x15\xb6\x9a\xf4\x78\x05\xf9\x53\x34\x2c\xf2\x69\x5b\x45\xde\x14\x0d\x7c\xf3\x81\x5d\x45\x06\x95\x06\x64\xf2\x99\x6f\x6f\xd4\xbe\xd4\xd1\xe8\x64\xa3\xbd\x6d\x7b\x20\xeb\xab\xce\x17\x91\x3b\xd9\x31\x5f\x4b\x9c\x6b\x89\x73\x2d\x71\xae\x25\xce\xb5\xc4\xf9\x3c\x24\x4e\xbc\x0e\x6b\x59\x73\x2d\x6b\xae\x65\xcd\xb5\xac\xb9\x90\xac\x29\x08\xc6\xdf\x2b\x65\x62\x6a\x5f\x15\x30\xda\x96\x03\x77\xac\x30\x4b\xa0\x24\x7e\x0e\x92\xc0\x12\xec\xcc\x78\x1c\xb4\xb1\xf6\x9c\xf8\x71\x84\x31\x22\x71\xdc\x55\x29\xde\x1b\x08\xa6\xdd\x70\xea\xf3\xb8\x14\x44\x52\x8b\xd8\xf3\x1a\x2d\xb7\x9e\xf2\x76\xa3\x08\xae\x2d\x61\xd7\xd3\xd6\xa6\x2c\x0c\x57\x32\x64\x95\x4f\xd6\x90\x45\xc2\xa2\xf2\xa3\x2c\x85\xc4\x22\x42\x43\x11\x5c\x6f\xc4\x03\xf7\x05\xf4\xe8\x66\xa3\x8b\xbe\x89\x7c\xf9\x08\x41\xaf\x53\x66\x05\x92\xf6\xa9\x8b\xf7\xa3\xff\xb3\x8b\x7a\xf1\x37\x1f\xf6\xe2\x6f\x00\x79\x1e\xb8\x9b\xf2\x08\xba\xa1\x8b\xc0\x5d\x76\x05\x0b\x3c\x74\xfa\x81\xa7\x55\x7a\x99\x66\x22\x1a\x23\x3e\x84\x31\xf5\x20\xec\x88\x01\x7a\x3c\xe8\x16\x12\x41\xb7\xa4\x7a\x00\x69\xb8\xfa\x4a\x0d\xd1\x4e\x3e\x47\x7b\x21\x44\x83\x2a\xd0\x52\x29\x64\x5e\x54\xc9\xa6\xce\x1e\x08\xe4\xe0\x91\x4a\x18\xf8\x68\x16\x0d\x46\x41\x79\xf9\x9f\x08\xcf\xb4\x8e\xb5\xb0\x66\x25\xff\x24\x56\x22\xc7\x5a\x68\xba\xd7\x9b\x5e\x78\x99\x3d\xc7\x68\x60\x2f\x5e\x20\x18\x13\x6f\x1b\xda\x11\xb6\x89\xef\x7e\x25\xc5\x6a\x84\x66\xbc\x04\x4c\x79\xcc\x68\x09\x65\x3c\x4c\x83\xc4\x0c\x95\x00\x6f\x62\xb4\x4b\x2e\x76\x7a\xb8\x04\x35\xa2\xd2\x95\xf9\x56\x4f\x8f\x97\xc0\x5f\xff\xcc\x88\x98\xc0\xc6\xfc\x08\x31\x13\xe8\xb4\x1f\x21\x62\x42\xbd\x72\x8f\x10\x2e\x41\x2c\xfe\x23\x84\x4c\x58\x5d\x78\x25\x0b\xe0\xfa\x0d\xd9\xea\x63\x26\x88\x37\x64\x7f\x63\xd4\x04\xc2\x7d\x87\x45\x56\xe5\xdb\x11\xcc\x93\x6c\x82\x8f\xda\xac\x5c\x2c\xec\x26\xf4\xaa\x96\x3f\xd7\x01\x15\xd6\x01\x15\xd6\x3c\xfc\x3f\x11\x50\x41\xd5\xc0\x5b\x22\x27\xcc\x8c\xa8\x80\x3a\x43\x84\x79\x38\x2c\xe3\x02\x46\xbb\x41\x1a\x14\x44\xb7\xf3\x9a\x07\x41\xa2\xfd\x1a\x83\x1e\x51\x9d\x7a\x12\x07\xa5\xe7\x3a\x79\x12\x84\x0c\xca\x44\x28\x78\x4b\x16\x74\xc0\xd1\x23\x22\xa8\x69\xd3\xe7\xc5\x44\x50\x13\xa2\x9b\xc5\x23\x7b\xf1\xd0\x16\x84\x61\x15\x51\x08\x04\xa1\x34\x23\x10\xd0\x27\x60\x7a\x00\x82\xa0\x42\xd9\x27\xbc\xf5\x2d\xd1\x07\xf2\x22\x1b\x67\x84\x90\xea\x01\x08\x6a\xd5\xdb\x09\x69\x41\x94\x95\x7a\x2c\x82\x86\x75\x37\x43\x13\x48\x0d\x15\x85\xbd\x98\x93\xb6\x0f\xf4\x50\x05\xac\xc1\x59\x86\xb0\x48\xa0\x47\x2b\xa0\xe0\xc9\x08\x4a\x33\x64\x01\xd3\xe8\xd6\xd5\x7a\xec\x82\x2a\xd5\x1a\xe8\x31\x0c\xd8\x42\x9c\x14\xd9\xb0\x80\x65\xf9\x76\x32\x33\xa2\x81\xfc\x79\x1e\x21\x9a\x41\xba\xa2\xb8\xce\x46\x30\x03\x79\x93\x3c\x42\x24\x03\xb1\xcf\x1e\x21\x98\x81\x65\xab\x3e\x42\x5c\x83\xc6\xdd\xfe\x08\x61\x0e\xf4\x03\xf3\x08\xb1\x0e\x8c\x33\xf7\x08\x61\x0f\xd4\x63\xfb\x08\x91\x0f\xd4\x93\xff\x08\xe1\x0f\x34\xda\xf0\x08\x71\x10\x0c\xfa\xf3\x08\xf1\x10\x2c\x24\xec\xef\x8c\x8e\x20\x89\xf9\x25\x8b\xf3\xf2\x4f\x90\xec\x85\x24\x7f\xfc\x9c\x24\xf9\x93\xb5\x24\xff\x23\x48\xf2\x97\x2d\x25\xf9\x86\xd0\x68\x7a\x8c\x53\xab\xe2\xcd\x2c\x8e\xec\xc5\xb9\x3a\x42\xfe\x96\x52\x8a\xa6\xc8\x3d\x6b\x0a\x18\x44\x58\xda\x27\xc5\x92\x70\xdf\x6f\x21\x54\x1f\x8b\x14\x31\x2c\x02\x55\xad\x8e\x3b\x56\x44\xea\x91\x56\xca\x18\x9b\x50\xc6\x1d\x2b\xa2\xa8\xf0\xb5\x39\xe6\x59\xdb\xd3\x14\xaf\x32\x17\xd9\x8f\x75\x8f\x9a\x6b\xad\x82\xf3\x05\x21\xb4\x1f\xf3\xd8\x60\x78\xf4\x42\x64\x3f\xe6\xa9\x1a\xbf\xc4\x65\xdc\x4f\x84\x83\xcd\x74\x0a\x06\xfe\x89\xdb\xd7\xf2\xa7\xac\x2c\xda\xd6\x48\x07\xbe\x2a\xf9\x74\xa8\x03\xe6\x2b\xde\x5e\x38\x9d\xe8\xb0\xeb\x8f\xd6\x5e\x34\xbd\xd2\x41\xf3\xef\xde\x5e\x20\xbd\xd6\x61\x0b\x57\x95\xf6\xd9\xe8\x74\xd8\xd2\xee\x6b\x2f\x7b\x5e\xe8\xd0\xeb\x0d\xdc\x5e\xe4\xbc\xd1\x41\x4b\x67\xa0\xbd\xbc\xd9\x97\x45\x9c\xcb\x45\x45\x9c\x7f\xa4\xfa\x72\xc3\xf4\xd2\x7d\x0e\xc2\xce\xf9\x5a\xd8\xf9\x11\x84\x9d\xb3\x67\x23\xec\x2c\xa7\x85\x44\x9d\x30\x4b\x12\x18\x22\xcf\x75\xbe\x57\xb0\x12\x77\x5d\xa7\x44\x41\x81\xe2\x74\xc8\x0b\x18\xab\xe1\xbf\x31\x91\x49\x20\x82\xbc\x60\x10\xc4\x89\x04\x20\xc9\x4a\xc4\x7f\x30\xd7\x11\xf6\x9b\x29\x3b\x51\xa7\xac\xc6\x1e\xf3\x84\x2d\x3f\xc6\x25\x22\xfa\xce\x87\x8b\x5b\xa7\x72\x46\xbe\x5a\x74\x3a\x55\x24\xad\x89\x56\xaa\xce\xfa\x4a\xab\xd5\x17\xe1\x5a\xab\xd7\xd6\xe4\x56\xab\xd6\x97\xe8\x42\xab\x57\x57\xec\x46\xab\x95\x17\xf0\x58\xab\x53\xd7\x93\x2b\x3c\x4f\x65\x9f\x6c\xba\xa2\x5c\xd7\x59\xd7\xa1\x0c\x05\x49\xdd\xf1\x90\xcb\x71\x43\xff\xdc\x1d\x3d\x42\x92\xe1\x89\x0e\x77\x55\x22\xdc\x95\x0e\x58\xfd\x94\xab\xf0\x0b\xd6\x10\xe8\xbb\x61\x15\xee\xc1\x1a\x0a\x6d\x43\xad\xc2\x49\x58\xc3\xa0\xef\xc9\x55\x78\x08\x6b\x28\xd4\x6d\xbd\x0a\x1f\x61\x0d\x81\x7c\x32\x56\xe1\x15\xac\x81\xd7\x0e\xd7\x2a\x1c\x82\x35\x0c\xf2\xf9\x6c\xaf\x55\x3c\xd4\xc1\x2b\x47\xbc\xbd\x4e\x71\x24\x8b\xa9\x67\x8b\x89\xa9\xff\xd9\x2c\x05\x33\xb3\x13\x56\xe3\xed\x60\x38\x2c\xe0\x90\x3e\xbe\xb0\x4a\xb0\x20\xa1\xe2\xdc\x03\x0c\xf0\x60\x0f\xec\x80\x23\xb0\x0f\x3e\x81\x77\xe0\x40\xc8\xb5\x1f\x69\xb0\x0d\x0c\x35\xd6\xbc\x33\x37\xe2\x81\x6b\x75\x4d\x3c\x9d\x8c\xfb\x59\x52\xb2\xf8\x31\xfe\xac\x36\x18\x0c\xda\xda\x72\x53\x3f\x65\x19\xf6\x25\x39\x0e\xe9\xf1\xd3\x1b\x3d\x20\xf1\x18\x25\xb1\x73\xea\x79\x1e\x88\x49\x4e\xff\x4e\x90\xe7\xc9\x84\x88\x84\x53\x06\x2c\x16\x82\xf0\x5b\x2c\xcc\x0e\xb2\xc2\xc5\x23\x45\xfe\x4f\xff\x83\xfe\x5f\xce\x98\x99\x2e\xe5\x7f\xd0\xbf\xfe\x55\xcf\x9f\x06\xad\xe7\x2d\x7a\xe8\xdb\x1b\xf9\x47\xf7\x6e\xba\x81\xfe\xef\xff\x7a\xf3\x91\x2d\x8b\x1b\x7b\xe0\xc5\x6b\x9b\x08\x8d\xbc\xbb\xef\xf4\xb3\xf5\xd0\x37\x6f\xea\x79\xdd\x39\x33\x2c\xdf\xd8\x44\xc2\x18\x96\x2e\x9c\xe7\x1e\x5a\xba\xb1\xe7\x75\xa5\x31\x35\x0c\xa8\x59\x34\x9d\xb7\xfa\x31\x40\x1e\x9e\x44\xbd\xc0\x50\x2c\xf0\x2f\xcf\xe9\x5a\xf4\xbd\x8e\x7b\x54\x3f\x81\xda\x8c\xd3\x4d\x68\x5d\x79\x36\x6a\x86\x4d\x23\x4c\x3a\xd9\x92\x08\xd5\xd4\xeb\xc2\x1e\xfa\xe6\xc7\x40\x5a\xa4\x2f\xeb\xeb\xd8\x3f\xfd\x3a\x46\xfd\xdb\xdf\xfb\xd0\xff\x19\xde\xdf\xf7\xbe\x91\xfb\xd9\x67\xdf\xcd\x1a\xee\x67\x81\xfd\x7e\x36\xeb\x22\x66\x2a\x8c\x31\x5f\x13\x29\x38\x0d\x75\x32\x0b\x28\xc6\x73\x6f\xea\x0d\xae\xb2\xa4\x1a\xc3\x6d\x32\xeb\x98\x30\x1d\x43\x35\xed\xb9\x8e\xb0\x60\xd1\x21\x8e\xd5\x24\x19\x7d\xe3\x69\xc4\x45\xd6\x27\xe9\x2f\x3a\xc4\x79\x9e\x86\x52\xe7\x57\x2b\x39\xfd\x45\x50\x5e\x96\x9d\x7f\xc3\x20\x1c\x75\xa2\x22\xbe\x12\x7e\x25\x06\xb8\x40\x72\x6f\xb9\xa3\x3d\x78\x0e\x05\x10\x97\xef\xaa\x64\x10\x27\x09\x8c\xa6\x0e\x13\xe4\x99\x27\x4a\x22\xe5\x1b\xa5\xa9\xbe\x81\x92\x9b\x1b\xdf\x03\xe6\x34\x63\x49\xbb\xb1\x60\x3f\xa7\xe5\x5e\x4c\xbe\xc6\xf5\xcc\x89\xde\xa9\x70\x81\xfa\xf3\x30\xb8\x99\x3a\x58\xfe\xb6\xee\x82\x0b\xeb\xda\x24\x01\x82\x25\x7a\x17\xc4\x49\x55\xc0\x7d\xbc\x47\xc9\x42\x75\xa8\xb8\x7b\xf6\x9e\x0a\x5c\x9d\xde\x37\xb1\x36\x37\x06\x20\xa6\xbd\xeb\xdc\xc9\xb7\x15\xa0\xde\x2c\xf0\xc8\x8e\xad\x43\x10\xf9\x2c\x08\x98\x18\xaa\xe8\x4e\xac\x9d\x88\xb5\xe3\x14\x05\x08\x76\xd4\x7c\x18\x6a\xe7\xcb\x16\x17\xef\x5f\xe4\x8b\x77\xed\x3e\xf3\x8b\x72\xf1\x3e\xd5\x4a\x59\xde\x8c\x73\xad\x98\x7d\xeb\x33\xad\x98\x1d\xb1\x92\xfb\xc6\xf0\x1a\x7a\xb6\x4a\x07\xec\xe9\x5d\xd8\x41\x02\x3b\x5a\x05\x4d\x39\x70\xa4\x95\xca\xbb\x15\xec\x37\x54\xb2\x3d\x0a\x3e\x35\xd4\x93\x9d\x09\xde\x35\xd4\xee\xe7\x23\x88\xf9\x47\x42\x9b\x1d\x48\xd9\xf8\xc7\xb0\x18\x62\xf0\x28\x10\xef\x86\xdf\xba\x6f\xdd\xbb\x29\x7d\x1b\x8c\xbf\xe3\x10\x22\x9a\x18\x87\x9c\x77\xcf\xa3\x35\x24\xff\x0d\x81\x41\x8f\x76\xa9\x3d\x3c\xa6\x67\x62\x1c\xe4\x6f\x27\xae\x53\x9f\xfe\x4e\x95\xc6\xdf\x5d\xda\x4d\x3a\xf2\xa2\xeb\x7b\xfa\x6c\x87\xa0\xd4\xe8\x82\x83\xc5\x1e\x22\x60\x62\x88\x7c\x47\x1d\x89\x84\xfe\x29\x4f\xe6\x6f\x1c\x3a\x6d\x70\x04\x3e\xfd\xe4\x1e\x1e\xa3\xeb\x62\xb2\x4e\x8b\x8d\xbe\x8e\x77\x7f\x6f\xad\x73\x3c\x4f\x7a\xd9\x84\x25\x58\xff\x67\xf8\x2f\xe4\x81\xd7\x74\x14\xc4\xfe\x82\x77\x2a\x3b\xbb\xa5\xfe\x88\x8a\x4f\x73\xb1\x23\xee\xf0\x57\x52\x70\x6b\x8b\x3e\xea\xc6\x4b\x91\xda\x56\x80\x1e\xf3\xe3\xe2\x54\x39\xe1\xb6\x65\xa8\x29\x83\xa2\xc6\xf0\xfe\x65\x36\xd0\xd4\x10\xec\x85\x18\xad\x6c\xfe\x82\x26\xe9\xa0\x1f\x72\xc6\xd8\x05\xe1\x68\x06\xdb\x4c\x5c\x66\x82\x27\xdd\xd4\xe8\x83\xf5\x36\xa7\x55\xbc\x2d\xc0\x8d\xa6\x53\x70\xe8\x7f\x71\x2f\x4d\xfd\x54\x6b\x35\xd2\xa9\x0e\x97\xe9\xa7\x5a\xab\x8f\xce\x75\xc0\x75\xa6\xa0\xd6\x5a\xa3\x33\x1d\x32\x23\x9a\xed\xb5\x45\xbb\x3a\x64\x41\x77\xdb\xeb\x89\xf6\x74\xe0\x9c\x74\xb7\x57\x11\xed\x18\x03\xaf\xa9\x7f\x7b\xfd\xd0\x91\x0e\x9b\xe5\xac\x69\xad\x16\x32\xc0\xd6\x3c\x80\x2a\x85\xe6\x5d\x16\x9b\x3a\x7b\xe0\x52\x7e\xac\xa8\x61\x61\x5c\x82\xea\x85\x96\x42\x51\xf7\x9c\x0d\x3f\x50\x5c\x17\x47\x4b\xe2\x50\xf8\x8c\x8a\x67\x5f\xff\x0c\x0a\xc7\x6e\xef\x6f\xf6\xa9\x09\x7e\xcd\xf4\x7b\x93\xb6\x28\xde\x35\xa1\xa0\x02\x41\xef\x6a\xc5\x3b\xca\x64\xa1\xa0\x77\xbd\xe4\x17\xb1\xb0\x61\xf5\xbb\x1c\x34\x4d\x4a\x13\x77\x7a\xb7\x2b\x9e\x9d\xc1\xd6\x1d\xd0\xbb\x58\x72\x76\x26\x8c\xd9\xbb\xdb\xce\xce\x1d\xd0\xbb\x59\x12\x71\x03\xa0\xd9\xd8\x85\xe9\xff\x78\x49\x74\x75\xcf\x39\xf0\x39\x33\x77\x40\xef\x64\x59\x14\xa2\xb3\x86\xe5\x52\xd6\x1f\x7f\x9e\x7a\xde\xc6\x4c\xfd\x71\xfd\x98\x70\x6e\x9c\x8a\xa7\xe2\xee\xd0\x4a\x59\xbc\x61\x3e\x81\x7a\x0e\x1a\xbe\xa3\xb5\xa6\xed\x9f\xae\x69\x4b\x20\xda\xdc\x67\x8a\xb5\xa4\x41\xb1\x56\xd8\x15\x6b\x66\x71\xa5\x14\xb3\xf7\x4a\xa1\xad\x30\x52\x0a\xc5\xc3\xae\x9c\x3e\xb9\x4e\xb3\x14\x7a\xae\x33\x88\xd3\xb8\x1c\xc1\x68\x87\x7b\x70\xc6\x9d\x20\x8d\x3c\xd7\x89\xcb\x9d\x10\xc5\x57\xd0\x91\xa5\x89\x4e\x5c\x7e\x62\xae\x72\x36\x4d\x1a\xa6\x3b\x9d\xcb\x38\x8d\xac\xfa\x33\x7a\x23\x90\xa1\xf1\xab\x0e\xbb\x5e\xf7\xbe\xd5\x1a\xb5\x98\xbf\x1a\x23\x30\xb9\xba\xcd\x92\x94\x56\xaa\x57\x80\xa7\x59\x04\x59\x05\x83\x3c\x51\x3f\x81\x47\x2e\xc0\x59\x55\x84\x84\x5f\x5d\xa9\xb5\xb2\xce\x92\xfb\xb8\x9a\xba\xb2\x92\x51\xea\xdb\x05\x23\xab\xd8\xd4\x3e\x3b\xb2\xbb\x41\xa0\x86\x65\xdb\x51\xb4\x3f\x37\x5a\x29\xa3\xf1\xc7\x66\x71\x81\xc8\x47\xe5\x2e\x0d\x75\x95\xf4\xc1\xb9\x4b\xc3\x8e\xe2\x47\x21\x34\x4f\x3b\xdc\x61\xb5\xde\x0a\xa7\x46\x4d\xbd\x1d\xb8\x06\xaa\xae\xaa\x3f\xc9\x99\x56\x2e\x96\x9c\xeb\xa0\x76\x34\x87\xd9\x3d\x49\xa3\x13\x97\xbb\x34\x87\xd7\x49\x91\xdd\x88\x7b\xb9\xab\xea\x3d\xd8\xa6\xbb\xbf\x77\x1c\x8f\x5e\xec\xcb\xaf\x31\x1a\xb9\x75\x02\x30\x9a\xcb\xa1\xcb\x2e\xf9\xb8\x87\x55\x77\xd1\xbc\x35\x97\xd1\x55\xd0\x99\x63\x16\x5e\x95\xb6\x01\x37\xec\x51\x3c\xfc\xde\x37\xeb\x65\x5f\xcc\xb3\x3e\x08\x75\x3c\x9b\x00\xc1\x5d\xbc\xef\x38\x9e\xbb\x1c\xa6\x51\x9c\x0e\xbb\x4e\x5c\x6e\xb3\xbf\x1d\xc0\xfc\x21\x68\x61\x11\x53\xe9\xa7\xde\x0a\xa4\xb4\xf6\x67\x70\x00\xdd\x05\xa4\x90\x26\xb6\x9d\xf6\x10\x8d\x3d\x13\x20\xf8\xed\xfe\x1e\x57\x44\x41\x71\xe9\x4c\x0b\x48\x96\x5a\xd3\xc2\x48\xd3\xab\x1b\x48\x0b\x34\x05\x17\xfe\x91\x7b\x6b\xbf\xac\xac\x42\x11\x71\xa3\x83\x5f\x95\x22\xe2\x58\x07\x5c\x0b\x58\xad\x15\x11\x27\x16\xc8\xf5\xf9\x6d\xaf\x8c\xb8\xd4\xa1\xcb\x24\xa0\xbd\x3a\xe2\xd0\x00\xcf\xa8\x48\x7b\x6d\xc4\xa9\x0e\x5a\x10\xa2\xf6\xea\x88\x73\x13\x38\xa7\x65\xed\x75\x12\x06\x6c\x99\x8a\x2d\xa6\x97\x98\x05\xc0\x03\xb7\xf2\xcd\x40\xc3\x46\xcc\x6c\x0b\x29\x26\xcc\x6e\x1a\xe4\x33\x7d\x95\x6a\xb2\xde\xfe\xf9\x9b\x15\x30\xa5\x9a\x54\x0f\xb1\xd4\xe0\x95\xee\xda\x24\x76\xf5\x49\x48\x3c\xa8\xbd\x36\x62\x4f\x87\xce\xdd\xe6\x5b\xeb\x21\x6c\x04\x87\x90\xfb\xc5\x14\x10\x4d\x9d\xb5\xe5\xb9\x95\xef\x95\xfb\xf3\xfc\x92\xfe\xde\x40\xdb\xfa\x9d\xf5\x91\xc3\x7c\xfc\x63\xfd\x8a\x76\x1e\xc5\xaf\x68\x6f\x11\xbf\xa2\xfd\xbf\xd7\xaf\x68\xef\x3f\xe3\x57\x74\xf4\x9c\xb4\x0e\xfb\xff\x21\xbf\xa2\x4f\x6b\x6d\xc7\x8f\xa0\xed\x78\xc7\x9e\x79\x58\x22\xcc\xad\x3e\x3e\x3c\x57\x7f\x68\x3a\x01\x7a\x79\x93\x8d\x41\xb5\x67\x4f\x64\x64\x1b\x4f\xe2\x01\x0c\x27\x61\x02\x85\x43\x91\x04\x4d\xd4\x02\xf1\x77\x87\x65\x09\x34\x42\xca\xeb\x2f\x43\xac\xf1\x69\xcc\xe2\x91\xbd\x78\x68\x2f\x9e\xa8\x53\xd0\x1c\xa4\xc6\xd4\x42\xda\x10\x95\xe7\xaa\x85\x83\xca\x91\xe4\x5e\xf2\x9e\xfa\x27\xd7\x6f\x39\x8e\x14\x45\xc5\xad\x56\x5a\x8b\x8d\x17\x5a\x39\xb9\xb7\x73\xb5\xc6\x91\xe2\x5a\x72\xac\x95\x4a\xdf\xe1\x44\xab\xd2\x6d\x4c\x97\x33\xeb\x89\x05\xe7\xb0\xa1\x09\x31\x83\x9d\x36\x54\x52\x13\xcc\x79\x43\xad\x66\xa9\x39\xd3\x9a\xd1\xaf\x73\x88\x3f\x8e\x50\x7e\x34\xba\xad\xec\xb8\x3b\xdc\x6d\xc5\xb6\x9f\x0d\xbf\x15\xbe\x3c\x47\xc1\x18\xba\x22\xa6\x2c\x2f\x67\x1a\x8f\xbb\x51\x96\x5d\x76\x21\x60\x1b\xb8\x8b\xa6\xbe\xda\x0e\x8b\x3b\x4e\xce\xee\xee\x8e\xef\xfb\x75\x50\xdc\x4d\xf4\x86\x97\x6f\xd7\xfb\xbf\x2b\x8a\x60\x3d\x7f\x87\x82\xc8\x4a\x64\x87\x51\x57\xc8\x40\x78\x99\x15\x4a\x96\xcb\x40\x44\x21\xe3\xc4\xce\x38\x88\x53\x67\x3a\x05\xd7\xfe\x27\xf7\x4a\xbf\xd4\xb0\x9d\xda\xfe\x11\xce\xad\x0e\x7d\x55\x8f\x70\x2e\x74\xc0\xfc\x9a\xd5\x5a\x6d\x71\xa3\x83\xa6\x47\xae\xbd\xd6\xe2\x58\x07\xcc\xec\xf9\xad\x15\x16\x06\x58\xc9\x9e\x1f\xce\xbf\xf5\x34\x75\xf6\xc0\x95\x7c\xeb\x39\xd1\x87\x2f\x91\x97\xf6\xaa\x8b\x26\xd8\x2c\x6d\x78\xbe\xe4\x34\xd4\xfe\xda\x4c\x2e\xf5\x99\x18\x16\xf7\xd6\xea\x8c\xc3\xd9\x28\xa8\x49\xbc\xf5\x03\x9c\xd3\x26\x2c\xd4\x35\xa1\xf5\x03\x9c\xf3\x26\xf8\xcc\xb2\xde\x5a\xa5\x71\xd6\x84\x40\xb7\xe1\xb7\xf6\xb2\xd8\xd5\x31\xa9\xcc\xa5\xbd\x56\xe3\x4a\x56\x0a\xbc\x9b\xa9\x14\xc8\x2e\x61\xba\xe0\x33\x7a\x53\x5d\x30\x2b\xc9\xf3\xac\x0b\xfd\x86\x19\xb6\xfa\x39\xdc\xbc\x6e\xd7\x37\xa0\x1f\xe1\x06\x74\xc1\xf3\x8a\xeb\x77\x97\xc2\x5e\xac\x46\xde\x16\xd6\xda\xcc\x16\x4c\x3b\xb0\xc3\x60\x81\xb7\x47\x41\x79\x18\xa4\xf8\x3a\x90\x67\x49\x1c\x4e\xf4\xe8\xdb\x22\x8f\x16\xb3\xb0\xc6\x91\x25\xe4\xf6\x32\xb7\x82\x6b\xee\x5d\x1e\x16\x10\x89\x98\xdb\xd7\xca\x95\x60\xac\x95\x0e\x93\xac\x2f\xc7\xdc\xae\xcb\xc3\x02\xf2\xc4\x38\x03\xad\x8e\x86\xb1\x1e\x69\xa5\x64\x9e\x24\x38\xde\xd0\x56\x33\xc1\x4c\xb3\x14\x6f\xd6\xeb\xca\x20\x0c\x61\x59\x66\x22\xb1\x16\x09\xc9\x7d\xab\xc5\xb7\x66\x73\xea\xa5\xed\x63\x72\x6b\xa0\x99\xf0\xd8\x3a\xd8\x77\x5f\x07\x5c\xaf\x6c\x7b\x81\x77\xa0\x83\x96\x3f\x4e\x7b\xb1\x77\xa4\x83\x67\x61\xca\x5b\x0b\xbd\x43\x1d\xb0\xd8\x22\xed\x05\xdf\x89\x15\x78\xbd\xcb\xda\xcb\xbf\x57\x3a\x7c\xb1\x51\x57\x1c\xf5\xfb\x62\x16\x5f\x37\x5f\x5b\x3d\x94\xc7\x3f\x7a\xee\xcd\x85\x4d\x00\x42\x6a\xb8\x78\x4e\x52\xc3\xcd\x5a\x6a\xf8\x11\xa4\x86\xe3\x39\xe1\x71\x4c\x96\x3f\x5b\x12\xb0\xea\x4d\x2d\x42\x46\xd8\x50\xce\xe2\x77\xc3\xef\x55\x90\x78\x2e\x23\xce\x4e\x58\xc6\x52\x7e\x4d\xc9\x4b\x8b\x6a\xa8\x2e\xb2\x3e\x71\xf5\x28\xf3\x80\xbc\xe5\x1c\xb7\x70\x8c\xba\x30\xd5\x8d\xb5\xb4\x70\xa1\xc8\x16\x03\xad\x94\x9a\x77\x85\xa4\x70\xa1\xc8\x0f\x43\xad\xb4\x80\x41\x74\x9c\x26\x13\x21\x22\xd4\x35\x39\x2c\x88\x47\xb1\x08\x69\x73\xc1\x3d\x9f\x76\x4f\x0f\x84\xf6\x53\x1e\x0e\x9d\x79\xad\x02\x9d\x4e\x41\xdf\xbf\x71\xc7\x8f\xa6\x94\x1a\xe8\xd0\x57\xa5\x94\x1a\xe9\x80\xeb\x55\x5d\x05\x7f\xd6\x57\x84\x32\xfe\x15\xf0\x66\x0d\xb0\xf8\xb6\xab\x60\xcc\x1a\x70\xb1\x3d\xda\x33\xe6\x6b\x1d\x38\xdb\x61\xed\x75\x51\xb7\xb6\x0d\xc2\x36\x69\x7b\x3f\x9a\xb1\x2c\x50\x1c\x2f\x20\x50\x30\xeb\xc4\x83\xfc\xd2\xff\x23\xb2\xc5\x12\x7e\xe9\xeb\x58\xc3\x6b\xf9\xe2\xe9\xca\x17\x97\x73\xbc\xd0\x1b\xc2\x3b\x98\xee\xd6\x82\xdb\xb3\xb7\x87\x2c\x58\x00\xf3\xf0\xa6\x85\x42\xe0\xa8\x05\x08\x5a\xbe\x07\xc3\x24\x28\x98\x97\xad\x2c\x52\x84\xaa\xe3\xb7\xd9\x9a\xf1\x1f\x26\x98\x68\x2e\xe2\xcd\x12\x48\x6e\x9f\xdb\xd8\x5e\xdc\x6f\x48\x88\xa2\x67\x04\x2f\x1e\x10\xbf\x98\xfa\x4f\xe9\x51\x8a\xd9\x72\x19\x41\x8a\x19\x03\xd0\x63\x14\xd7\x5c\x58\x0f\x51\x2c\x51\x75\x3d\x48\x71\x04\x4b\x14\xa7\xcc\xc5\x56\x0f\x53\x9c\x17\x59\x1e\xd0\x20\x4e\x87\x24\xdb\x96\x1e\xaf\x58\xb0\xd0\x1b\xc9\x66\x69\x7c\x1e\xcb\x83\x79\xcb\x46\xb1\x78\x37\xd3\x2a\x9a\xaf\xfb\x44\xcd\xf8\xcb\x1c\xce\x56\x12\xa7\x78\x60\xaa\xcb\x57\x21\xca\x58\x01\x4b\xcb\x42\xa5\x9a\x79\xd6\x9e\x39\x30\x3c\x30\x90\x2d\x3e\x13\x7d\x3a\xb5\xac\xb0\x02\x11\x47\x83\xcc\x65\xbe\x15\x08\x38\x1a\x68\x59\x0c\x59\x81\x90\xa3\x41\x57\xf6\x7c\x7b\x31\xe7\x42\x87\x6f\x1c\x9b\xf6\x56\xb6\x1b\x1d\x87\x24\xbc\xae\x36\xe1\xf5\xcc\x20\xc9\xfc\x6c\x2c\x95\xe1\xfa\xa1\x86\x9c\xc5\xe2\xbf\x81\x8f\xe0\x2d\xf8\x05\x7c\x07\x5f\xc0\x7b\xf0\x19\x7c\x00\x2f\xc1\x57\xf0\x1b\xf8\x03\xfc\x0e\x7e\x05\x7f\x02\x08\x85\xe4\x85\xe0\x73\x12\xbd\x62\xb8\x96\xbd\x7e\x04\xd9\x2b\x85\x0f\x34\x09\xf5\x61\x92\xa5\xc3\xf2\x2c\x63\x2f\xe8\x6a\xa9\x26\x33\xab\x73\x9a\xe1\x9f\xab\x85\x84\x25\x48\x7a\x62\x63\xb1\x13\x29\xb5\x95\x21\xf2\xe1\xcf\x0e\xe5\x84\x6d\x24\xdc\x11\xa6\x4d\x5a\xa1\xae\x49\x52\x23\x2d\x9b\xc5\xb9\x81\x2a\xac\x8a\x02\xa6\xe8\x2b\xc6\x58\x90\xe8\xc8\xb4\xe0\x13\x0c\x22\x1a\x33\x61\x6c\x5f\xac\xbe\x6a\xe1\x1a\xd8\x5b\x8d\xec\xc5\xc3\x06\xfd\xd7\xc4\xde\xfc\xca\x5e\x7c\xdd\x00\xe5\xd6\x3e\xf9\x0b\x7b\xb1\x19\xea\x2a\x4f\x82\x38\x3d\x88\xac\xc1\xac\xc2\x2c\x45\x45\x96\x24\xb0\x28\x7f\xa9\x13\x01\xc8\x85\xfb\x37\x39\x0c\x11\xc9\xbc\x7d\x62\xc7\x77\x69\x2f\x3e\x34\x5f\x6f\x66\x11\x94\x90\x90\x9f\x12\xf8\x53\x3b\x9c\x73\x7b\xf1\x99\xbd\x78\xb7\x85\x11\x12\x41\x91\xdb\x83\xac\x17\x8f\x64\xc5\x6b\xa8\xcc\xb9\x63\x2b\x66\x72\xc8\x91\x5e\xc7\x8e\x14\x8f\x64\xc5\x2b\xf4\x43\x21\x82\x59\xf1\x26\xda\x09\x11\x01\xad\x78\x0b\x7d\xbb\x1f\x34\x34\xa8\xb7\x3f\xf8\xa8\x37\xc0\x2b\x55\xa4\x41\x82\xe7\xfb\x56\xaf\x44\x59\x9e\x25\xd9\x90\x98\xbd\x7e\xd1\x2b\xa9\x51\x89\x8a\x2e\xdf\x8d\x4a\x84\x82\x70\x84\x57\x96\x36\xf8\xa2\x37\x28\xc3\x11\x8c\xaa\x24\x20\x19\x1c\xde\x1b\xab\x56\x64\x57\x71\x04\x0b\x07\x7c\xd6\xab\x30\xa3\x20\x22\xd9\x07\x63\xae\x7c\xdb\x7e\xa2\x79\xb0\x22\x07\xbc\x6c\x6e\x24\xf6\xe2\xd7\x19\x8d\xf8\x0e\x05\xbf\x19\x9f\x5d\xd9\xd0\x7f\x58\xab\x45\xf7\xdf\xcd\xaf\x4b\x45\xe3\xfd\x9b\x51\x50\x95\xa4\xcd\xaf\xc6\x40\x88\xb5\xf4\x20\x8d\xe0\x8d\x03\xfe\xd4\x6b\xc7\x59\x14\x0f\x26\xac\x16\x42\xe9\x6e\x65\x8b\x25\xd6\xeb\x74\x3a\xe4\xba\x64\x90\x63\x94\x11\xff\x5f\xd7\x03\x75\x13\x9d\x36\xf3\x16\xdf\x34\xf0\xbb\x59\x95\xea\xef\x37\xd5\x4d\xf9\x2f\xb9\x8c\xed\x43\xfa\x30\x37\xfa\x1a\xa3\xd1\x51\x7d\x76\x38\x90\xbf\x5e\xde\x91\x2e\xec\x18\x4e\xff\xcd\x7e\x73\x46\xa5\xb0\xb1\x4e\x1c\xb9\xde\xf4\x2f\x02\xd1\xfc\xb6\x98\xdb\x66\x85\xe5\x72\x69\x36\x7d\xa5\x97\xd7\x9f\x8e\x80\x96\xbf\x75\x23\x50\xb9\xd1\x2b\x51\xc2\x01\x4d\xc1\x9e\x1f\x43\x77\x57\x0b\x7c\x42\x89\x4d\x7b\xff\x80\x1d\x03\xf8\xaa\x1c\x04\x8e\xac\x90\xeb\xab\x57\x6b\x03\xc4\xbe\x65\x55\x28\xd5\x6c\x7f\x71\xff\x64\xc0\x36\x09\x6f\xfb\x3b\xfc\x3b\x03\x8b\x41\xbb\xdb\x9b\x26\x74\x14\x6a\x84\xa7\x6a\xbe\x8e\xa0\xb1\xb7\x07\x76\xd5\x48\x42\x3a\x2a\x9d\xcf\xb4\xbf\xcc\x7f\x6c\xc2\xc1\x59\x55\xfb\x2b\x7d\xf3\x82\xed\x32\x13\xc2\x02\x6e\xb4\x33\x21\x68\x0b\xf7\xd6\x98\x94\xcc\x5e\xdb\xdf\xef\x7f\x31\xe0\xcb\x1c\xba\xfd\x15\xff\xbb\x01\x5f\x66\xf2\xed\xfd\x67\xbf\x98\xf0\x35\x39\xa1\xbd\x0b\xed\x7b\x03\x87\x22\x6a\xb4\xf7\x9c\xfd\x6c\x52\x2b\x2e\xad\xb4\x77\x9b\xfd\x60\x40\xe7\x02\x4f\xfb\xe7\xc0\x2f\xcd\x43\x67\x91\x99\x7a\xd7\x6d\xf1\x7c\x9d\x81\x47\x48\x4c\xed\x03\x91\xfd\x36\x0b\x8f\x10\xbd\x7a\x17\xab\xa6\x24\x9a\xec\xb2\x58\xdc\xb1\x99\x10\x34\x4a\x32\x7f\xfd\x84\x14\xb2\x58\x18\xb2\xc5\xc1\x69\x43\xf9\xc3\x64\xfe\x8a\xe0\xdb\x3b\x69\xbb\xba\xbf\xdb\x31\x48\x1f\xf0\x72\xd5\x1f\xd0\x2e\xcf\x39\xa0\x77\xb8\xe4\x4a\x36\x00\xd2\xd6\xf0\x57\x8b\x7c\x60\x48\xff\xbd\xd3\xb6\xb3\xfc\xd3\x3c\x0f\xf2\x05\xa2\x77\xde\x16\x01\x84\x06\x06\xe5\x12\xd2\x3b\x6b\xfd\x2e\x41\xd6\x32\xa7\xb0\x49\xcd\x1c\x0f\x62\x58\x94\xaf\xa2\x38\xda\x8e\xd3\x92\x66\x33\x37\xb5\xcd\x05\x4c\x23\x58\x6c\x8b\xf6\xd6\x9e\x9a\xe2\xb9\xf9\x7d\x77\xa3\xc2\xae\xb1\x03\x9b\x88\xa3\xa8\x8a\x5f\xbc\x06\x43\x88\xba\x1c\xa7\xb8\x44\xd4\x13\x9f\x4e\xbd\x05\x26\x5e\xe5\x51\x53\x80\xbe\x39\x13\x67\x3d\x9f\xe3\xc4\xb3\x74\x3b\x4c\xe2\xf0\x72\x3b\xab\x50\x19\x47\xda\xf4\xa9\x51\x41\x69\xc0\xfb\x3e\xd7\xe9\x16\xb0\x8c\x6f\xad\xf3\xe4\x95\xfc\x43\x5b\x7b\x3e\xc7\x79\x97\x68\xa2\xe7\x0f\xa7\x73\x26\x15\xb6\xf9\xd2\x1e\xcf\x71\xae\xd7\x71\x92\x6c\x47\xb0\x44\x45\x66\xcf\x26\x3a\xe3\x34\x2b\x7d\x9f\xe7\xe4\xd3\x28\xbb\x9e\xb1\xc9\x57\x78\x7c\x0d\xbb\x0a\x8d\x55\x42\x14\xd5\x35\x1a\xcf\xd5\xb0\x24\x10\xf5\xe2\x6f\x3e\x62\x09\x4f\x52\x1f\xf9\x3f\xc7\xa4\xaa\xb6\xb1\xd1\x29\x74\x82\x28\xda\xbf\x82\x29\xfa\x18\x97\x08\xa6\xb0\x20\xc1\x01\xc9\xa4\x52\x0f\xb8\x9e\xff\xf3\x1d\x6b\x58\xc0\x71\x76\x05\x1b\xdb\x4e\xa7\x9e\xcc\x03\x63\xeb\x02\x16\x59\x85\xc8\x85\xc3\xb2\x5b\xb2\x0a\xc5\xe9\x90\x37\x11\x9d\x28\x63\x7e\x05\xd3\xab\xb8\xc8\x52\xe2\xd7\x66\x31\xba\x72\xcb\x62\xfa\xf7\x06\xf9\x58\x41\x4a\x1a\xa2\xfb\x2f\xb8\xf6\x1f\x2d\xa1\xfd\x4f\x79\xb2\xc7\x3a\x92\x1c\xb7\x1d\x74\xea\xb2\x33\x22\xcb\xd5\x2d\x8b\x2c\x43\x9f\x3f\x7d\x94\x1b\xb2\x22\x6f\x3a\x15\x63\x2b\x40\x41\x33\x2a\x48\xc7\x84\xea\x58\xf1\xf7\x71\x1d\x78\x03\x43\x07\xdc\xe5\x01\x1a\x75\x9d\x57\xf8\xd7\xab\xee\x45\xd6\x3f\x27\xba\xbb\x29\x68\xea\x26\x67\x78\xab\x3b\x77\x71\xe1\x39\x29\x5c\xa4\xbb\xde\x91\x76\x21\xe1\x69\xea\xa4\x16\xac\xf5\x45\xd6\x2f\x9d\x46\x58\x45\x85\xe5\x5d\xad\xbd\x04\xfc\xa1\xb3\x61\xe3\x51\x20\x2b\xa9\x7b\xe4\x0a\x76\x4b\x2e\x1d\xbd\x7d\x9e\x64\x13\xf2\x8d\xf5\x9a\xb8\xcc\x03\x14\x8e\xb4\x62\xc8\x93\x4d\xe8\x1d\x54\x85\x99\x5c\x13\x26\x31\x45\x60\x59\xba\x2c\x47\xf1\x98\x9c\xec\xa6\xb9\xf3\x60\xd2\x6c\xe2\xff\xab\x4c\xaa\x21\xfd\x0e\x56\x2c\x8d\x80\x68\x03\x79\x01\xb3\x08\x9e\xc7\xd1\x8c\x75\x1f\x67\x69\x8c\xb2\xc2\x3a\x72\xf2\xf0\xb8\x98\x81\x8f\x36\x90\xf0\x05\x43\x98\xa2\x87\x23\x64\xba\xac\x89\xbe\xba\x65\xdc\x3c\x06\x9e\xba\x60\x76\x03\x69\x90\xb4\x40\xda\xec\x0a\x32\xaa\x78\x9e\x01\xaf\xd6\x4c\x73\x78\xb4\x60\xde\x06\x57\x36\x0f\x9d\xbb\x8e\x5a\x51\xe7\xce\x87\x23\xaf\x3b\x2f\x9c\xbd\xf8\x83\x72\x1b\x53\x28\xd1\x73\x50\xea\xe7\x6b\x50\xca\xb5\xaf\xfe\x17\xfe\x53\x6f\xa3\xd1\x8e\x39\x33\x4f\xb2\xa1\x7e\x5e\x1e\x3e\x0e\xfb\xca\x95\x10\x61\x8e\x37\x63\xd9\xc8\x13\x73\xba\xf2\x8d\xa7\x5d\xe9\xac\x37\x4c\x33\xb4\x3d\xc8\xaa\x34\x12\xc3\xfa\x5f\x82\x56\xda\xd9\x73\xf9\x4a\xfa\xa4\xaf\x94\x20\xa5\x73\xb8\xb6\x28\xae\x53\x9a\xcd\x70\x69\x6f\xce\xb0\x79\x4d\xe8\x9b\xd4\x62\x1c\xdf\xc4\x29\x96\xb9\xd0\x68\x9b\x54\x52\x1f\x09\x0d\x42\x9a\xa1\x78\x30\x61\xb1\x5b\x1b\x1c\xda\x41\x46\x7d\x8d\x24\xaf\x2c\xe1\x40\x35\x7e\x4e\xfe\x53\xfd\xb5\xfb\xd4\x8f\xe0\x3e\x35\xf0\x5d\x16\x28\x9d\x6c\xfc\x4f\x30\xcc\x8a\xc8\xea\xd8\x94\x4a\xb9\xd8\xaf\x99\x84\x50\xa9\x7e\x25\x2e\x97\x2c\x3b\xb4\xc4\x15\x69\xf2\xbc\x05\x84\xcd\x31\x0f\xb3\x9d\x15\xd0\x01\x21\x33\xec\xd7\xc5\xec\xdc\x46\xb6\x62\x72\x62\xd9\xfb\xf8\x29\x89\x77\xf4\x95\x15\xd3\xeb\x0a\xda\xda\x82\x9d\x12\x22\xb7\x6e\xce\x7c\xa4\xc9\xaf\x4e\x0e\x8b\x41\x56\x8c\x5d\xe4\x79\x53\xe2\x75\x29\xee\x6c\x64\x9c\x1d\x5a\xa8\x8c\xb6\x83\x46\x30\x25\x09\xc1\x58\xc0\x6b\xe4\x43\xd9\x18\x8f\x85\x3d\x6a\x86\xdf\x90\x8d\xe1\x64\x6e\xc4\x5b\x9b\xae\x35\x93\x0a\x51\x0d\x0f\xdf\x88\xb4\x86\x3b\x49\xa2\xd8\xf6\x3d\xb9\x2d\x24\xa4\xb6\x13\xe2\x79\xb8\xee\x6b\x90\x89\xc4\x84\x64\x31\xbc\xe9\x14\x84\x7e\xdf\xad\xd4\x98\xa5\x64\x81\x7b\x98\x18\xe0\x5d\xd4\xfa\xf1\xb3\x8e\x80\x7d\xaa\xf6\x16\xe4\xdc\x0a\x99\x1a\x42\x5b\x5b\x8e\x2b\xf9\x42\x39\x58\x9e\x63\xbd\xe2\x1c\x5b\xe6\x5c\x0b\xf7\x7d\x8c\xab\x3b\x3d\x8f\xf1\xdc\xbb\x1e\xa6\xe8\x84\xea\x6d\xd8\x0e\x62\xec\x3b\xcd\xa3\x06\x2e\xf2\x1d\x04\xc7\x79\x12\x20\x16\x37\x29\x4e\x5d\x1a\xee\xdd\x7b\x9c\x6b\xb0\x7c\x71\x9c\x71\xf1\x9f\xb5\xd6\x8b\x08\x17\x45\x79\x95\x2f\xcf\xf7\x57\xf7\xd9\x6c\x57\x74\x4a\x79\x20\x51\xb8\x50\x11\x0b\xf9\xce\x2b\x67\xea\x43\xa6\x79\x29\xfc\x08\x86\x59\x04\x3f\x7f\x3a\xd8\xcd\xc6\x79\x96\xc2\x14\xb9\x08\x73\x0a\x42\x46\x48\xff\x77\x59\xa1\x08\xd2\x1d\x99\xbc\x6f\xc4\x03\x37\xa9\xa3\xc8\x89\x4b\x3b\xe6\x61\xbd\x84\x44\xa7\x77\x0b\xcc\xc1\x49\xb0\x7c\x7c\x77\x72\xbc\x6f\x32\xf5\x4b\x20\xc2\x1f\x09\x72\x32\xd7\x39\x28\xf7\x62\x2c\x69\xd4\xa0\x46\x41\x39\x72\xe9\xe0\x0b\x20\x50\x77\x13\x10\xc5\x05\xc4\x3b\x72\xb2\x9f\xa2\x22\x86\x65\x37\xe9\x24\xa5\x5b\x48\xf4\x2c\xd5\xe9\x19\x88\xcb\x77\x31\xde\x1e\x3f\x4d\xbd\xae\x15\x68\xdd\xe0\x35\xc0\x83\xef\xa2\xa9\x42\x20\x0d\x80\xd3\x12\xa2\x2a\xdf\xe5\xa6\x3f\x75\xb1\x65\xd0\xb1\x39\xde\xb4\xc6\x56\x50\x64\xc9\xd4\xd7\xe3\xff\xfe\xfc\x93\x24\x4e\x88\x68\xbf\x3f\xc9\xa1\x7f\x7f\x22\xa1\x7f\x29\xaf\xd1\x87\xa3\x1e\x4d\xc2\xc5\xa4\xe8\xbd\x0f\x1d\xa6\xaa\x8c\x79\xc0\x99\x8a\x99\x69\x6b\xde\xb1\xfa\x5b\x89\x9c\xf1\x29\x31\xc2\x78\xe0\xa2\x3a\x2b\x45\xec\x13\xa6\x49\x45\x81\xbc\x80\x70\x9c\x13\x6d\x20\xea\xd4\x3f\xa2\xb7\x13\xe1\xa0\xe4\x6d\x34\x54\xd0\xfd\x1f\x83\x98\xc7\x2c\x5e\xe0\xe3\x4d\x0b\x58\x42\xa4\x0f\x8f\x88\x26\x84\xad\x1d\xc1\x1b\xd4\x09\x83\x34\x84\x09\xe6\xf9\x5e\x5b\xb2\xd7\x14\x56\xdc\xbc\x3e\x35\x5c\xb3\x66\xd0\x3c\xcc\x40\x0a\x90\x6c\xac\x46\x0c\xcd\x7c\xb7\x58\xd0\x47\x99\x73\x2e\x90\x5a\x79\x17\x65\x44\x00\xf9\xb5\x94\x93\xd2\x02\x37\xf6\x13\xef\xa9\x5e\xbb\x14\x2a\x8f\x45\xbd\x2e\x12\x14\x3e\x5e\x86\x92\xbf\x88\x19\x29\xe7\xec\x21\x66\xe9\x59\x51\x80\x60\xe9\x18\x79\x50\x68\xaf\x42\xa4\x6d\x49\xe1\xb5\x08\x26\xe1\xfe\x75\x16\x94\x97\x9b\x2f\xef\xd0\x74\x33\xcd\xd0\x26\xb9\xec\x6f\x0e\xb2\x42\x72\x76\xdd\x7c\x79\xc7\x70\xc4\x91\xe3\x4d\xff\xc2\x52\x15\xe6\x48\xbe\xf3\xdf\xaf\xff\x9b\xc9\xd9\xc2\xb3\x82\xce\x20\xcf\x93\xb8\x1e\x36\x3d\x8c\x74\xaf\x01\xc8\x0f\x54\x31\x9d\x82\xc0\x2f\x24\xe1\xaf\xe4\xdf\xb4\xf2\x7b\x88\xcb\xae\xa1\xdf\x46\x0c\x04\xb9\x7f\x37\x05\xf2\x8d\x36\x6c\xb8\xd1\xe6\xf8\x46\x1b\xb2\x1b\x6d\xae\xde\x68\xe5\x9f\x20\xd7\x6f\xb4\x79\xe3\x8d\x36\xbf\xbf\xcf\xf5\x1b\x6d\xae\xde\x68\x73\xbf\x5a\xe4\x46\xab\x24\xab\x75\x03\x50\x02\xe8\xdd\xdf\x43\x2c\x43\x7b\x20\x92\x58\x50\xae\xdd\x37\x73\x76\xa3\x55\xca\xdf\xe4\xe6\x86\x8d\xf8\x8d\x36\x9f\x7d\xa3\xd5\x31\xd8\xcf\x1c\x1e\x62\x8e\xa7\xc7\x6e\xb4\x7e\x0e\x0a\x6f\x43\xd7\x9e\x08\x72\x91\x3d\x90\x02\xb6\x92\xd2\x19\x80\xe7\x28\xaa\xd7\x43\x7f\x86\xf2\x3a\x1f\xfa\x5a\x68\xb7\x92\xfa\x0e\x4d\x29\x43\x28\x77\x72\x7f\xff\x22\x91\xea\x54\xf2\x9f\xf9\x72\x1d\x08\xfc\xbf\x5e\xde\x25\xe4\x15\xff\xf4\xe5\x5d\xa1\xa4\xf4\x7a\xe5\x78\x6f\x1c\xa7\x8b\xc7\xf9\xf2\xae\x98\xfe\xb5\x61\xbf\x12\x64\xf4\x4a\x10\xf0\x2b\x81\x96\x76\xab\xdd\xed\x00\x4f\x8c\x24\xe9\xb4\x5d\x0e\x32\x7c\x39\x08\x96\xbe\x1c\xc8\x30\x57\x7b\x37\x10\x90\x9f\xf2\xd5\x60\xc9\x51\xb6\xbe\x19\x90\xd3\x4b\xec\x1b\x4f\xec\x76\x50\xab\xf6\x6a\x49\xa7\x51\xb7\xa7\xe4\xa4\xb3\x6f\x72\x4d\x05\xb7\x30\xc1\x93\x04\x9f\xc5\x24\xf3\x2a\x4d\xb2\x2c\x9f\x27\xaa\xd3\x17\xe3\x41\x14\xe0\xeb\x0c\x93\xdb\x39\x6d\x5c\x20\xd5\x8f\xc5\x74\x21\x0c\x17\xf9\x73\x32\x5c\x8c\xd7\x86\x8b\x1f\xc1\x70\xd1\xf7\xdd\x60\xc1\x08\x78\xb3\x05\xa8\x5c\x3c\x6e\x1c\xc4\x43\x07\x94\xcc\xbc\x50\x97\x97\x93\x12\xc1\xb1\x03\x2a\xbd\x5c\x35\x52\xe4\xfc\x6d\x28\x89\xda\x5d\x1b\x29\x62\xff\xae\x80\xc3\x38\x4b\xbb\x77\x05\x1c\x14\xb0\x1c\x1d\x62\x72\x83\x27\x36\x25\x82\xd9\xf7\x0a\x16\x93\x93\xa0\x08\xc6\xe5\xdf\x20\x97\x35\x2b\x20\xe4\x3b\x18\xf9\x52\xd3\xa0\x9c\xa4\xe1\x66\x1f\x0e\xb2\x02\x1e\x4a\x02\xcd\x26\xc2\x72\x07\xec\x48\x23\x3f\x4e\x93\x89\x87\xfc\x93\x22\x1b\xc7\x25\xec\x14\xb0\xcc\x92\x2b\xe8\xbe\x78\xed\x6d\xc0\xa4\x84\xa4\x57\xbc\x11\xfb\xb0\x83\x32\xb9\x5f\x27\x43\xe8\x0d\x12\x99\x38\xc9\xda\x79\x1d\x78\x13\x8e\x82\x74\x08\x8f\x53\x12\x11\xf7\x0c\x17\xbb\xb6\xbe\x5e\xd7\x86\x12\x15\x93\xbb\xe0\x3a\x88\xd1\x66\x3c\xa5\xac\x3d\x63\x66\xef\x85\x6f\xa1\x99\x37\xe5\x7e\x6d\xea\xf0\x3a\x03\x88\xc2\xd1\x29\x4c\x06\x64\x58\x3b\x69\x74\x52\x87\xc0\xf5\xb8\x1d\xa9\x16\x29\x3c\x50\x48\xfd\xe9\x4e\xa2\x00\x3e\xc6\x21\x4c\x4b\x68\xed\x13\x98\x7d\xc2\x11\x0c\x2f\xdf\x55\xb7\xb7\x93\x53\x18\x14\xe1\xe8\x04\x7f\xc8\x34\xb4\xf6\xdf\x40\x3e\x9d\x7d\xa2\x0a\x6e\x06\x50\xba\x31\xb9\x17\x82\x5c\xc5\x3a\x7e\x22\x2d\x1c\x0f\x14\x20\x05\xc1\x37\x6f\x8a\x05\x4e\xa3\x71\x39\xca\xaa\x24\x3a\x1d\x65\xd7\x9f\x6a\x88\x3c\x29\x09\x57\x61\x18\x9f\x8f\x62\x07\xa9\x39\x59\x05\x39\x6b\xe7\x58\x97\x32\x20\x59\x2b\xeb\x51\xde\xdf\xa7\x8c\xce\xbb\xf1\xd6\x56\xfc\xc2\xf7\x8b\xfb\xfb\x17\xf1\xd6\x56\xf1\xc2\xf7\x53\x6f\x6b\x4b\xb2\xab\x61\xae\x4a\x5e\x22\xba\x6c\xf6\x65\x13\x58\x10\xdf\xdf\xa7\x1e\x40\xb5\x8e\x86\x39\x3f\xd6\xc7\x3a\x9e\xfa\x10\xdc\xa1\xac\x7b\x27\x4d\xae\x7b\x97\x21\xd4\x4d\xa7\xd3\xa9\x8f\xd8\x90\x78\x7b\x30\x0a\x4a\x79\x63\xe3\x66\x56\xb5\xa5\x84\x24\x35\x3a\x15\x18\x72\xea\xfb\x8b\xae\xde\xd6\x16\xcd\x4e\x0d\x6f\x90\x47\xa5\x96\x3b\x76\xe6\x59\x0b\x76\xe8\x3d\x0f\x2c\x22\x6a\x16\x0c\x1e\xbe\x52\x16\x1a\xc0\x4c\x1a\xa7\x03\x1c\xc7\x9b\x7a\xe0\xff\xbc\x7e\xed\x4d\xa3\x38\x3a\x2b\x82\xb4\x8c\x65\x4f\x14\x32\x74\x4a\xbb\x3a\x71\x79\x06\x4b\x84\x3f\x24\x73\x09\x2d\x43\x8c\xfd\x2c\x73\x5f\x83\xd7\xde\xf4\x3a\x4e\x12\x13\xc0\xc2\x67\x9a\x4e\x90\xfc\xc0\x94\x0c\x6e\xc6\x69\x89\x82\x34\x84\xd9\x60\xb3\xe8\xec\xf4\xb3\x02\xed\xe3\xca\xfb\xfb\xa5\x35\x56\x53\x50\xfa\x63\x37\xd0\x9e\x12\x11\x76\x22\xe9\xa9\x5a\x1a\x2b\x75\x0c\x35\x63\x5a\x19\x86\xd0\xc0\xc0\xcc\xc4\xab\x42\x10\xe9\x08\xea\x14\x17\xab\x42\xa0\x81\x57\x36\x9c\x03\x7a\x19\x39\xd9\x59\x3a\xff\x2d\xd3\x0c\x30\x1e\x08\xe4\x27\x4c\x1a\x4a\x75\x8f\x3e\x1c\xa7\x06\x67\x36\x52\xb6\x11\x1f\x8a\x8b\x76\xd7\x50\x04\xb2\x6d\xbc\x3f\xeb\x4a\xc3\x1d\x30\x1f\x62\x68\xd0\xb5\x37\xb2\x2b\xd6\x20\x2b\xfa\x71\x14\xc1\x74\x9b\x65\x84\x6e\x50\xf2\xf0\x76\x0b\x84\x19\x15\x97\x9a\xea\x39\x5d\x6a\xc2\xf5\xa5\xe6\x47\xb8\xd4\x44\xbe\x9b\x69\x2e\x55\xb1\xee\x52\x55\x2c\xe5\x52\x55\xa9\xb7\x95\x80\x5d\x4b\x2a\xed\x72\xc3\x2e\x3d\x53\x59\xda\x57\x83\x78\xc8\x22\x46\x42\x62\x11\x38\x86\xaf\x54\xaa\xe9\xf4\xc8\x23\xd0\xae\xd5\x9b\x89\xe8\x50\x00\xf1\x8c\xb6\xb7\x20\x55\x58\x76\x10\xda\xb9\xc4\xe2\xda\x14\xf8\xa1\x9b\x3d\x26\xcf\x2a\x0d\x04\xab\x66\xbb\x99\x4c\x69\xa3\x05\x28\xed\xab\xda\xa3\xfd\x21\x04\x77\x69\x3d\xf9\xda\xd0\xbb\x7a\x43\xef\x02\xde\x85\x33\x74\xd2\xc1\x00\xc1\x82\xdf\xc8\x0d\x55\x65\x5c\x9e\x04\x05\x1e\x81\xe3\xbd\xc1\x17\x63\x7c\xd1\x71\x25\x95\xbc\xa1\xd1\xc4\xf7\x35\xaf\x6b\xd3\x75\x96\x8e\xb7\x36\xc2\xae\x8d\xb0\x8b\x1a\x61\x55\xfa\x34\xc3\x43\x68\x51\xff\x93\xd5\x7b\xf5\x2f\x13\x88\x7e\xc3\x74\x86\x7f\x0e\xb2\xe2\x60\x2d\x2b\xfe\x08\xb2\xe2\x88\x05\x9d\xd7\x3d\xf7\x6b\xd1\x4a\xa9\x4b\x28\x39\x1f\xc5\xb9\xa7\xbf\xd8\x6b\x70\xee\x67\x9e\xd6\x3b\x4a\x5b\xdd\xdf\xdf\x10\x4e\x97\xf3\xf7\xef\xdb\x55\xe9\x7d\xbb\xbf\xbf\x52\xac\xc4\x10\xcb\x6d\x2d\x88\x8f\xf8\xb8\x7e\x11\x60\x53\xb0\xd5\x9c\x93\x6a\x73\x06\x49\x30\xdc\x29\xf7\x8a\x20\x4e\xe3\x74\xe8\x00\xb4\xb5\x85\x3a\x31\x2f\x58\x48\x2f\x66\xea\xd7\xbd\x3b\xc3\x2a\x0b\x93\x78\x18\xf7\xe3\x24\x46\x13\xa2\x6f\x22\x1c\x10\x94\x28\xcb\x09\x2e\xa9\x2c\xd2\x7e\xab\x43\xec\xbe\xf8\x09\x94\xa3\xec\x9a\xfc\x3e\xc2\x72\x1c\xd3\x4f\x29\x15\x9f\x49\x4c\x8b\xc6\xea\x53\x94\xe5\x39\x8c\xb4\xfa\x69\xd3\x1b\x0a\x57\x7e\x44\x71\x48\x13\x85\xd8\xdf\x51\x00\xb9\xa5\xf2\xb5\x44\x7b\x39\x94\xa2\xd4\x95\x3e\x59\x18\xd8\x9f\x2c\xac\x4e\x17\x35\xb0\x3f\x59\x68\x1d\x5a\x2f\xb7\x42\x5e\x71\x64\xbd\xb1\x15\xc9\x63\xbc\x8b\x18\x2d\xc2\xf1\x17\x75\x06\x7e\xd4\xf7\x7a\x9a\x70\xb1\x28\xab\x5f\xdb\xb9\xd7\x6c\xfe\xe9\xb2\xf9\x3e\x63\xf3\x29\x27\x99\x1a\x8f\x8f\x2d\xef\xf2\xca\x79\xef\xf2\x96\x53\x22\x69\x26\x6f\xdd\x12\xce\xce\xa7\x6e\x09\x17\x27\x33\xb2\xbf\xcb\xf3\xee\x16\x78\x92\x47\xb8\x41\xe5\x8f\xdd\xd2\xc6\x0d\x92\x15\x9a\x3e\xca\x47\xe1\x06\x91\x15\x32\x25\xd4\xad\xb9\x40\xb9\xb8\x92\xbe\x8c\x9f\xe6\x8b\x8d\x02\x52\x97\xb4\xda\x9c\x87\xb8\xd1\xe3\x2c\x23\x41\x0e\xea\x0c\x37\xce\xe2\x4e\x56\x78\xb2\x3c\x62\x41\x2b\x25\xd9\x23\x98\x23\x78\x46\xd5\x15\x69\xd4\x02\xdf\x4d\xe6\x89\xe5\x69\xe3\x71\x6f\xa1\x64\xcb\x9e\x8b\x92\x4d\x52\x2f\x13\x1b\xbd\x14\xad\x02\x1f\xc9\x2e\x09\xa5\x21\x2b\x9a\x0b\x8b\xa2\xb9\xf4\x13\xe9\x14\x57\x7c\x3d\x42\x59\x09\x16\xb5\x53\x82\x8d\x75\x25\x58\xd4\xc0\xba\xc7\x98\x75\x47\x8c\x75\x8f\x55\xd6\x2d\xff\x04\x63\x9d\x75\x8f\x1b\x59\xf7\xf8\xfe\x7e\xac\xb3\xee\xb1\xca\xba\xc7\x7e\xb8\xbc\x12\x0c\x4b\x59\xb5\x12\x6c\xec\x81\x5c\x62\xdd\x63\x8d\xb1\x8e\x19\xeb\x56\xca\xdf\x8c\xcd\x8f\x9d\x73\xd6\x3d\x9e\xcd\xba\x75\x0c\xf6\xfd\x8a\x87\x38\xc6\xd3\xa3\xac\x3b\xf3\xc7\x20\xa1\x4a\x30\x59\x1b\x24\x4e\x5f\xb0\x20\xf1\x59\x8b\xc5\x6b\xb1\x78\x2d\x16\xff\x1d\x62\xf1\x6f\x98\xae\x5b\x32\xf5\x3c\x7b\xd1\x98\xb0\xb2\xaf\x14\x8a\x45\x3a\x56\x18\xd8\x5a\x52\x5e\x42\x52\xde\x58\x84\x7e\xf3\x7c\x0b\x7f\xa3\xa1\x15\x64\x82\xf2\x06\xcf\x89\xf2\x96\x6b\xca\xfb\x23\x50\xde\x6a\x71\x0b\xbe\x8d\x60\x06\x2a\xc1\x4c\x18\x65\x0c\x34\x87\x94\x8c\x2b\xee\x0b\x3a\x4f\x61\xea\xbe\x93\x42\xcb\x75\x99\xc9\x9a\xe7\xf2\x9a\x8a\xa7\xd4\xb3\xa3\xee\xd4\x47\xfb\x2f\x7c\xde\x5f\xde\xc1\x8e\x04\x75\xfa\xd7\x4c\xfb\xfb\x14\x24\x7e\xe9\x16\x8f\xa9\x9d\xce\x0c\x04\xab\xf6\x3a\x29\x64\x82\x58\x2d\x2a\xd0\xd2\x7f\x5f\xa9\x29\x56\xd6\xd2\xed\x5a\xba\x5d\xd3\xd8\x47\x94\x6e\xb9\x6d\xf7\x9f\x22\xde\x5a\x23\xb2\x95\x0e\xa0\x2f\x34\xbb\x56\x8b\xe2\x74\x56\xf8\x14\xcd\xc4\xca\x72\x26\x9d\x04\x43\xd8\xfd\x09\x7c\xcf\xcf\x88\x94\xec\x80\xef\x39\x4d\x49\xd1\x75\x9c\xe9\x5a\x5a\x5e\x95\x5e\x59\x63\x0e\x6b\xa5\xc7\x9a\x2d\xac\xd9\xc2\x9a\x2d\xfc\x6d\x6c\x61\x4d\xc7\x57\x43\xc7\x79\xd0\xf0\xe5\xd5\x1d\xb3\x92\xd4\x0b\x9a\x9a\x3d\x27\x9a\x1a\xac\x69\xea\x8f\x40\x53\x4b\xdf\x4d\xe7\x99\x4f\x17\xa2\x89\x99\xa6\xc1\x28\x18\xf5\xcb\xac\x0a\x8f\xe9\x14\x14\x7e\xe0\xa6\x8f\x7a\xc7\x4f\x0c\x0c\x2b\x56\x53\xa4\x32\x7d\x29\x17\xa4\x2f\x0b\xf9\x85\xab\x91\x4b\xfe\x46\xc1\x71\x9e\x4d\x7f\x41\xe7\x80\xc6\x20\x2b\x58\xd6\xa4\xf4\x84\x5b\x16\x41\x1f\x0c\xc0\x48\x90\xc9\xe1\x73\x22\x93\x93\x35\x99\xfc\x11\xc8\xe4\x95\xef\x56\x3e\x79\x83\xa7\xd8\xdb\x58\x1a\x11\x2c\x20\x89\x4a\xe6\xa3\x26\xe5\xf0\x8c\xa8\x33\xba\x26\x97\x7e\xa9\xe5\x0d\xfa\x93\x27\xfd\x2c\x1d\x0f\xe4\x1a\x4d\x4e\x75\x9a\xcc\xe3\x9c\x83\x72\xbe\x73\x8b\xd5\xb5\x65\xa8\x12\xe6\xb1\x88\xd8\xf2\x3d\xe7\x63\x79\x12\x61\x5b\xf8\x50\xd5\x65\xeb\xb3\x11\x2b\xb5\xd2\x2a\x82\x81\xad\x01\x21\x73\x23\xc6\x85\x74\x65\xb9\x1e\x95\x8d\x91\xec\xae\xe9\x42\xc3\x13\xc8\x08\x0b\x24\xe0\x9f\xbc\x0b\x3b\xd2\x1a\xca\xae\x35\x81\x11\xb1\x8d\x77\x6a\x78\x29\x2a\xb6\x91\xe9\x95\xce\xcd\xa4\x02\x88\x61\x2b\x15\x0b\x22\xf9\x14\x82\x99\xe6\x55\xb6\xc2\x36\x2b\x6b\xf3\x1c\x31\x4b\x1f\xfb\x13\x37\x7f\x4c\x86\xdb\xd7\x11\xa8\x3b\xa2\x57\xb5\x45\x30\xb0\x22\x90\x37\x55\xfb\x1c\xe7\x23\x2b\x8e\x15\x25\x37\xcf\x65\x91\xe4\x6a\x51\x91\xa4\xde\xcd\x2b\x7d\xab\xb6\x40\x64\xca\x47\x7b\xd0\x86\x05\x0d\x4a\x00\x25\x17\x26\xd0\xdf\x30\x5f\x89\x3d\x07\x21\x63\xb4\x16\x32\x7e\x04\x21\x63\xe8\xbb\xe4\x35\x5a\xa6\xe9\xb7\xb8\x94\x51\x35\x25\xa2\x09\xe7\x5d\xe1\x82\xa5\xf4\x5b\x03\x55\x34\xa8\x5f\xa0\x0d\xb4\x2b\x5e\xae\x95\xb3\x13\x3b\xb6\x15\x13\xf2\xd6\x5f\xa9\xde\xcb\x66\x1b\x97\xd2\xb8\x75\x3f\x9c\x1e\x1f\x75\xf2\x00\x6f\x3a\x28\xe2\x73\x7b\x9d\x8b\x2c\x4e\x5d\xe7\xdf\x8a\xb1\x5c\xa4\xb0\x91\x20\x74\xca\x3c\x89\x11\x69\x0a\x62\x1f\x75\xf2\x2c\x77\x3d\x90\xfa\x88\x81\x70\x3c\x90\xf9\x04\x4b\x89\x8a\x38\x1d\xc6\x83\xff\x9f\xbd\x77\xff\x6e\xdb\xc6\x1a\x45\x7f\xcf\x5f\xc1\xf2\xcb\xf8\x88\xa7\x24\x42\x80\x6f\xcd\xa8\xb9\x69\xd2\x7e\xce\x1c\xbb\xcd\x6a\x32\x9e\xbb\xae\x8f\xd7\x98\xa6\x60\x8b\x0d\x45\xea\x23\x29\x39\xb6\xa3\xff\xfd\xae\xbd\xc1\xb7\x28\x4b\x8a\x9d\xda\x69\x3d\xd3\xd0\x22\x00\xe2\x8d\xfd\xde\x1b\x57\x83\xe3\x42\xa1\x1e\x2f\x4f\xd5\xf0\xf3\xe7\xea\x86\xd4\x93\x2a\xa8\x66\xda\x4b\x63\x74\x91\x7f\xa9\xa7\x2f\x21\x73\xa2\xde\x08\x57\x76\xb1\x7f\x76\xa1\x1a\x9a\xae\xef\xa2\x3a\x65\x43\x54\x89\xf1\x68\x32\x08\xbe\x26\x1e\x9f\xad\x34\x70\xdf\xbc\xff\xb4\xdb\x42\x29\xb1\xbc\xb3\x77\xd8\x59\x6f\xcd\x02\x7d\xdf\x99\xfe\x08\x9a\xe8\xfb\xe2\x36\xf4\xdd\xb8\xa3\xee\xcb\x3d\xcd\xd7\xcb\x2d\xef\xc9\x3a\x3f\x5a\x11\x2f\x6d\x13\xef\x42\xe0\xef\x5d\x0d\xf2\xd3\xc7\x6a\x90\xaf\xfa\xa3\x9b\x99\x7f\xc1\xdf\x87\xd7\x3d\x0c\x95\x1a\xf3\x4f\xb9\x88\x6a\xb7\x9a\x97\xe5\x7e\x3e\xcf\x7a\x32\xf2\x34\xbc\xb8\xe0\x29\x1f\xff\x78\xd5\x93\x7b\x2b\x07\xa7\x66\x18\x43\xf1\x03\x4f\xa7\x7d\x15\x03\xad\xdf\xc7\xf5\x25\xab\x5c\x5f\x74\x2b\xd7\x07\x8b\x58\x6c\x10\x7f\x27\xae\x2f\x3a\x4e\x4e\x46\x7e\xe7\x52\x88\x6a\x92\x72\xb5\x9a\xcb\xb0\x39\x94\xb8\x9c\xac\xb4\x35\x39\x91\x18\x51\xd2\x9a\x13\x7f\xd9\x88\xc8\x7d\x3b\xfc\x54\x57\x79\xbf\xfa\xe8\xc9\xea\x4d\xcd\x10\xf9\x6a\x41\xe3\xc0\x88\x66\x3c\xfd\x0f\xf4\x73\x18\xe2\xfa\xfe\x27\x2f\xfa\x7e\x1e\x46\x39\x4f\x87\x22\x62\x60\x75\xe5\xc4\xcb\xd3\xb7\x6f\xa4\x20\x89\x73\x3f\x8c\x33\x49\x06\xf4\x21\x4b\x49\x2a\xfd\x33\x39\xeb\xcf\xf8\x25\x19\xf3\xfe\x9c\x0f\xf5\xd8\xbb\xd9\xa7\xc2\x8d\x3a\x1f\x95\x77\xc2\x8e\x46\xa3\xe4\xa5\x5c\xd4\x15\x66\x78\xc3\x05\x9f\xce\xf2\x2b\x79\xd8\x48\x15\x29\x6a\x38\x3a\x5d\x57\x77\xb4\x94\x4f\x55\x7f\x74\xfa\x1e\x17\xa0\x95\x95\x2e\xe5\x53\x21\x68\x7e\x16\x9e\x0f\xca\xe8\xec\x52\xf2\xf9\x73\xfa\xf9\x73\xf4\x72\x90\x8d\x4e\x07\xcf\x6f\xf8\x52\x39\x55\x93\xbd\x3d\x78\x7d\x7e\x93\x2d\x25\x3f\x1e\xe3\xa5\x1b\xa7\x8a\x1a\xad\x24\x87\x90\x9c\xae\x24\xfb\x90\x9c\x29\x43\x0e\x2d\x15\x0d\xd4\xc1\xae\x6f\x8e\x93\x93\x61\xae\x1e\xa7\x27\x43\x5f\x3d\x8e\x4e\x86\x61\x45\x41\x67\xa3\xe3\x04\x98\x86\x93\x8a\x34\x1d\x00\x28\xac\x16\x28\x1e\xf1\xe3\xf0\xa4\x8a\x07\xbf\xb7\x27\xcb\xdf\x8d\x46\xf9\xcb\x7c\x94\x03\xb8\x08\xfc\x7c\x70\x5a\xf4\x21\x5e\x9e\x2a\xc3\x70\x6f\x6f\x90\x8f\x30\x68\xa6\xa2\x02\x95\x90\x95\x77\x7a\x08\x28\x3f\x10\x5a\xbb\x64\xd4\x14\x4e\xfb\x15\x44\xcb\x9a\x2e\x35\xf3\xbb\xb9\xd4\x8c\xbb\x2e\x35\xf3\x35\x1c\xc2\x18\x38\x84\x79\xc1\x21\x8c\xdb\x1c\x42\xf3\x55\x1d\x77\x39\x84\xf1\x5a\x0e\x61\xfc\xf9\xf3\xb8\xcb\x21\x8c\xdb\x1c\xc2\x78\x94\xed\xee\x52\x93\xa8\x7e\xe5\x52\x33\x56\xd4\xa0\xc1\x21\x8c\x3b\xf4\xfb\xb8\xe0\x10\x5a\xe9\x2f\xc7\xab\xe0\x3a\xa8\x38\x84\xf1\xed\x1c\x42\xb7\x85\x7e\xd8\x07\x5d\x1c\xc3\xf0\x04\x87\x90\x8e\xc6\x6a\x2c\x5c\x6a\x9a\xd6\x16\x35\xca\x8c\x6e\x45\xf5\x78\x17\xf8\x7d\x1b\x61\x6f\xa3\x46\xd8\x4e\x49\xb0\xc2\xb4\x6f\x7f\x3b\xac\x90\xfe\x3f\x5b\xe5\x74\xbf\x05\xb6\xfc\xe2\x89\x2d\xff\x2b\xb0\xe5\x57\xc5\x1d\xb1\x5d\xb6\x1c\x6f\x38\x55\xdb\x1c\xfb\x2d\x81\x66\xe6\xbd\x4a\x80\xfe\x40\x33\x1b\xf9\xf9\xdd\x02\xcd\x4c\xfa\xf9\xf9\x49\x3b\x66\xfb\xac\x93\xdc\x61\xe7\x27\x6b\xe3\xcf\x9c\xf5\x95\x40\x48\x71\x7e\x8b\x19\x7b\x79\xff\xff\x7a\x1b\x76\xb5\x71\x6d\x5d\xde\x8d\x9f\x5d\xd1\x5d\x6a\x3a\xe2\xa4\xac\x4c\x8d\x56\x18\xf2\xb4\xc3\x87\xab\xc9\x68\x0d\xaf\x8d\x37\xd1\x46\x1b\x42\xc5\xb5\x2f\xbe\xb8\xf5\xf6\x14\xd5\x1f\x21\x84\x7d\x35\xcf\x93\xb7\x53\x80\xdd\x6f\xae\x62\x7f\x1a\x06\x03\xf9\x53\xce\xd3\xa9\xdc\x6a\x0a\x88\xd8\x30\xf6\x23\xa5\x92\x14\x94\xc1\xdd\xc5\xbd\x33\x18\x80\x7c\x5d\xa4\xec\xe3\x50\x8d\x4f\x46\xf9\x9a\x7b\x52\xb8\x1a\x16\x22\xff\x7f\xcd\xca\x66\x06\xf1\x56\x41\x6e\xd6\xdf\x14\x7c\xc7\x08\x37\xe3\xd1\xc5\xd7\x96\x31\x74\x1a\xb8\xf7\x68\xcb\xdd\x06\xee\xed\xd6\xdf\xb3\xde\x9a\xdb\x21\x74\xee\x2c\xc7\x38\xef\x6d\xe4\x6b\xc8\x31\xae\x36\x11\x37\x78\x65\x8e\x76\x91\x26\xf3\xd9\x17\x5f\xda\xf8\x48\x45\x19\x7f\x1a\x21\x46\x9b\x1d\x87\x55\xfa\x4f\x7d\x51\x63\x01\xd2\x6b\x40\xf9\x7e\x92\xa4\xf9\xdb\xb1\x10\x4e\xce\x10\x62\x63\x18\x79\x24\x65\x95\xe6\x95\x5c\x50\xd3\x2f\x58\x11\xfe\xfc\x6f\xd8\x04\xe2\xbd\xe7\x53\x52\x6f\x14\x00\x9e\xd0\x09\x7c\x11\x6e\x4b\xeb\xef\x11\x58\xed\x58\xd8\x69\xad\xd1\x11\xbc\x5b\xa0\x2f\x06\x7e\xd1\xf9\x0c\x10\xb0\x9c\xf1\xfc\x83\x9f\x7d\xac\xcd\xee\x65\x75\x6d\x33\xa2\xda\x6e\x8b\xcb\xed\x62\xaa\x3d\x31\x8a\x4f\x8c\xe2\x96\x8c\xe2\x37\x18\xe1\xe6\xf7\xe4\x6c\x97\xd0\x36\x50\xfc\x2e\x81\x55\xfb\x6e\x04\x7b\x32\xa0\x7b\x32\xa0\x7b\x62\xa2\x1f\xc6\x80\x4e\xf0\xd0\x5f\x62\x3d\xf7\x4f\x00\x1c\xdb\x98\xce\xad\xf0\xce\x7f\x5d\xd3\x39\x31\x67\x5f\xc1\x6e\xae\x7b\xf3\x01\x80\xe9\x1e\xa3\x39\x64\xb0\x6f\xfe\x2c\x66\x72\x30\x9b\xb5\x8d\x5c\xcf\xa8\xfc\xd9\x03\x1b\xc6\x89\xf5\x7e\xb2\x8a\xdb\xc1\x2a\x0e\x09\x0c\xdc\xa7\xf7\x71\x9d\xcf\x76\xb1\x4f\x1a\x41\xf1\x04\xcd\xf7\x6c\xf5\xe2\x9b\x6f\x01\x95\x8f\x9f\x50\xf9\x5f\x01\x95\xcf\x56\x22\x2e\xee\x14\x01\x25\x28\x2f\x1c\xf5\xe3\x2a\xce\x49\x95\xd8\xb9\xa7\x27\x68\x4b\xa8\xb3\x4e\x32\x1e\xbb\xb4\x72\xc0\xdc\x4a\xcc\x1c\x8e\xff\x1d\xe6\x35\xec\x6a\x59\x81\xe1\xed\x9e\x6a\x38\xaa\xa4\xc5\xe2\xfa\xc6\xba\x8e\x68\x39\xe2\x6a\x32\x8a\x48\xe4\x67\xf9\x5b\x60\x43\x7e\x3d\x47\xfb\xb0\xbf\x6b\xf4\xbb\xd1\x28\x79\x39\xc8\x47\x51\xb1\x97\x74\x35\x01\x92\xa0\x7c\x4d\xbe\xa7\x8a\x32\xcc\x47\x51\x71\x25\xa4\xbf\x22\xa8\xce\xd5\xb0\xb6\x12\xbb\x4d\x44\xed\xb7\x6c\xc1\x1a\x97\x8d\x97\x56\x6c\xc7\x7d\x82\x6b\xb5\x48\x6c\x18\x0e\xf5\x5a\x37\x74\x91\x34\x6c\xf0\x0d\x28\xf7\xa4\xd5\xeb\xc0\x8f\xe1\xdf\x40\xf6\x83\x80\xcf\x72\x29\xe5\x41\x32\x9d\xf2\x78\x5c\xdc\x1e\xb8\xb7\x97\x93\xd9\x3c\x9b\x94\x56\x79\xed\xfc\xf7\xf3\xe9\xd4\x4f\xf1\x3e\xd1\xaa\xcb\x13\x3f\x7b\x8d\x16\x0b\xc2\xc0\x40\x2e\xef\xb2\xac\x5a\x4a\xb9\x3f\x96\x0a\xa3\x86\xba\xfe\xde\x5e\x63\xe8\x60\xa5\x16\xd6\xa3\x74\x3d\xef\xde\x67\xad\x6c\x08\x87\x99\x8c\xc6\x83\xa8\x75\xdf\xa1\x7f\x9f\xa2\x65\xbf\x5b\xfd\xfd\x5f\xeb\xd4\x69\xe0\xbe\x85\xe3\xf3\x6e\x03\xe5\x59\xbd\x3f\xef\xbe\x26\x4e\x9f\x6d\x83\xd3\x9f\xe2\xf6\x3c\x05\x68\x78\xa2\x0c\xfe\xc8\x00\x0d\xb7\xa8\xc3\xfb\x63\x35\xbc\xea\xdc\xcd\xf2\x87\x87\x6d\x68\x29\xd9\x36\x47\x70\x28\x43\x2d\x97\x56\x66\x88\x72\x30\x11\x35\x06\x00\x79\x08\xca\x38\x9e\xad\xdc\x53\x76\x8b\x56\x79\x0b\x03\xf9\xdd\x14\xae\x0f\x17\x23\xa2\xad\xb4\xfc\xb3\x84\x8b\xa8\x30\xca\x9d\x2e\x7f\xbd\xab\x99\xd5\x5a\x04\xb5\xcb\x2d\x5f\x4f\xc2\xe3\x27\xbc\xf2\xd8\xf1\xca\x62\xcd\x5d\x5f\x42\x7a\xdc\xbc\xea\xab\x75\x3f\x48\xb6\xed\x1d\x60\x85\x64\x7a\x8d\x69\xd6\x2f\xc9\xb8\xf6\xd2\xde\xd1\x4e\x6b\xfd\xcd\x03\xb7\xc9\x95\x91\x99\x18\x77\xa4\xb0\x05\xbc\x9e\xf5\x09\x67\x6b\x19\x74\x5b\xa8\x2b\x7a\xde\x2b\xf0\x6d\x01\xe6\xcd\x12\xdf\xf6\xcd\xb8\x4d\xee\x2b\x4e\xf2\x55\x06\xac\x5f\xd1\x27\x50\xe1\xd2\xcf\xae\xe2\x40\xea\xbb\xa5\xa0\x0f\x73\xde\x87\xb7\x98\xda\x58\xef\xe1\x26\x6c\xa9\x36\xee\xed\xad\xa7\xb1\x16\x0b\x2f\x85\xf9\xd2\x55\xdb\x7a\xe6\x7e\x19\xc0\x59\xb7\xfa\xfb\x66\x00\xa7\xdd\x06\xee\x2d\xa2\xd3\x59\x6f\xcd\xc5\x56\xbc\x3b\x92\x3e\xef\xad\xfe\x9e\x6d\xa3\x26\xbd\x8d\x7c\x0d\xdb\xa8\xad\x84\xd1\x2f\xb0\x40\x79\xa5\xfe\xa3\xd2\xee\x6f\x4f\x00\x87\xe7\x03\xae\x54\x77\x0e\x9e\x73\x00\xca\xfe\xe5\x9b\x6a\x64\xd5\x1d\xbd\xf9\xe8\x07\xd4\x20\x0d\xb9\x5a\x8f\x7b\x98\x2f\x15\x65\x4d\x08\xcc\xf0\x7c\x90\x37\x5d\x38\x7f\x4f\xce\x9e\xe5\x04\x4a\x9c\xf9\xc1\xc7\x57\x79\x9e\x86\x67\x30\x9f\x03\x45\xcd\x09\xd6\xf0\x76\x3c\xa8\x94\x3b\x61\xf6\xd3\x38\xcc\xf1\xce\xc3\xef\xa8\xb2\xdc\xcd\x14\x41\x2c\xce\x2c\x4a\xae\xa6\x6b\xe9\xc0\x3f\xde\x06\x61\x3b\xe1\xc2\x1a\x73\xfc\x27\x1f\xf9\x27\x52\xf0\xf1\x92\x82\x17\x85\x31\x7e\x3f\x59\xd7\x3c\x8a\xb7\xd2\x7f\x30\xcf\x4d\xe2\x6f\xc5\xa9\xfe\x4d\xf3\x50\x17\x61\x46\xea\x6f\xba\x74\xdf\x8a\x60\x62\x37\xfb\xfc\x0d\xfe\xf6\xab\x1d\xea\xf5\xbc\xaf\xfa\xb7\x85\x07\xfe\x97\xc8\x2d\xc2\x96\xc8\xbc\xd4\x31\xb4\xa7\xbc\x48\xac\xa7\xf7\x64\x3b\xd1\x46\xcb\xe6\xbc\x35\xd4\x9a\x0c\x6b\x24\xaf\xb5\x43\xaf\xe7\xa0\x11\xce\xa6\x48\x5b\xb5\x40\x5f\xe3\xe5\x9e\x7c\x2d\x2f\xf7\xd5\xd1\xdd\xc7\x4d\xa8\x7d\x8d\xd4\xf3\xf0\xa7\x71\x78\xaf\xf1\x6d\x98\xcd\x0a\x62\x75\x6b\x11\xfe\x5a\x54\xf8\x07\x58\x89\xe7\x77\xb6\x12\x47\xde\xe2\x5b\xb0\x11\x6f\x73\x89\x1b\x81\x4b\xed\xc4\x23\xc0\x06\xbc\xca\xca\xb3\x15\xee\xb2\x5c\x71\x09\x75\x93\xe8\xc4\xdc\xb4\xb7\x59\x6e\xe4\x38\x77\x07\x77\x9f\x3f\xdf\x5e\x63\x8f\x55\x36\xae\x52\x36\x3a\x0e\x9f\x6c\xb2\x9f\x6c\xb2\x57\xc1\x56\x53\xef\xfe\xa4\x7c\x7c\x52\x3e\x3e\x71\x06\x7f\xa4\xf2\xb1\x6d\xf5\xd2\xaf\x7c\xfc\xa9\x55\xe6\x01\x94\x8f\xcd\x0e\x7c\x5d\xe5\x63\x6b\x3a\x76\x56\x3e\xb6\xfa\x59\x13\xda\x8d\xe4\xc7\xa1\x7c\x6c\xf5\xf3\xcf\xa7\x7c\xbc\x83\x1f\xcc\x57\x43\x2e\xbb\xab\x1e\xd5\x0b\xf5\x4a\x5d\xa8\x97\xea\xb5\xfa\xbb\xfa\x49\xfd\xb5\xc6\x32\xef\xbe\x25\x2c\xf3\xf1\x09\xcb\xfc\x15\xb0\xcc\xe1\xd6\xaa\xc8\xb6\x8b\x4b\xb6\x4e\x49\x39\x5f\x53\x9b\x96\xa1\x21\xe4\x55\xe9\x1e\xb3\x8d\x1e\x73\xbc\xbe\x60\x1b\xff\xcd\xd6\x17\x8c\xfc\x9c\x67\x79\x2d\xa4\x90\x15\x75\xda\x1f\x76\xb2\x56\xbd\x34\x7d\x71\xde\x17\xdd\xee\x53\xcc\xf4\x40\x65\x91\x74\xd0\x6d\xb4\xa5\x35\x52\xd4\xb3\xfb\x8d\x87\xf1\xae\xa9\x67\x2d\x75\x9f\xef\xda\x08\x7a\xd2\x49\x2e\xc6\x7c\xd1\x97\x5c\x4d\xc1\x55\x5f\x6e\xa1\xfa\x5a\xf4\xe5\x55\xb3\x75\xb9\xa6\xde\x7a\xf2\xae\xfb\x4a\xb4\xe6\xf2\xf7\xbe\x12\xab\x53\xfb\xa9\xaf\x18\x62\xb1\x5f\x0b\xc2\xe2\x01\x14\xb4\xc5\x6e\x6f\xe4\x16\x53\x53\x17\x12\x94\x4b\x75\x2c\x76\x54\xea\x36\x0e\xc0\x70\x13\xc9\xa2\x76\x0f\xc1\xb0\x6a\x7c\x86\x98\xb6\x29\xc3\x2b\x85\x0f\xbd\xb3\xdd\xaa\x34\xcc\xaa\x8a\x26\x7e\xf6\x7a\x12\x46\xe3\x94\xc7\xed\x0a\x8a\xad\xd4\xe7\x57\x94\xf7\x8b\x4b\x96\x95\xc2\xfa\x0b\x8d\xa5\x6f\xd1\x73\xf7\x3a\xd4\x97\xfb\x61\x6f\xef\x58\x9e\xf1\x34\x4c\xc6\x61\x20\xab\x32\xba\xea\xf3\x9c\xa7\xe1\x35\x1f\xcb\x27\x24\x8c\x83\x68\x3e\xe6\x40\x38\xe7\x7c\x3a\x83\x29\xfd\x70\x35\xe3\x4a\xcf\x7d\x75\x59\x92\x96\xef\x57\x43\x39\x9b\x9f\x4d\xc3\xfc\x43\x38\xe5\xb2\x0a\x39\x6f\x78\x16\xf0\x78\x1c\xc6\x17\x02\x2e\x6f\xe7\x34\x7f\x3e\xfa\x38\x38\xfb\x7a\x0a\xfa\x49\xb7\xfa\xfb\x56\xd0\x5f\x74\x1b\xb8\x37\x05\xfd\x55\x6f\xcd\x15\x0c\xbb\x3b\x29\xbb\xe8\x6d\xa0\xb4\x00\xb8\xb3\x3c\xfa\xb2\xb7\xfa\x0a\x92\xde\x5d\x26\x7d\xbd\x6e\x82\x1a\x26\x06\x77\xf6\x77\xfb\xbd\xb7\x91\x36\xc7\x72\x67\xbf\xb7\x4f\xbd\x8d\xac\xa2\x84\xe3\xd9\x5d\x5b\xfa\xb5\xb7\x25\xc1\x1b\x4d\xef\xac\x81\x68\xf2\x46\x87\x5b\xf1\x46\x8d\x40\x21\x77\x12\xb6\x15\x19\x65\xc8\xbc\x7e\x07\xbf\x7b\x0b\x13\xd0\x89\xcc\xb7\x51\x81\xbf\x36\x18\x40\x93\xa9\xaa\x19\xaa\x4f\xdf\x12\x43\xf5\xeb\x13\x43\xf5\x57\x60\xa8\xde\xb5\x03\x03\x74\x18\xaa\x60\x4d\x56\x83\x3b\x1a\xaf\x2d\x12\xf8\x11\x2f\x99\x9d\x68\x0b\xf6\x69\xba\xbe\x60\x0f\x57\x74\xd6\x2b\x43\xfc\x67\x72\xb6\x86\x13\x7a\x8f\xdd\x59\xcf\x16\xad\x40\x65\x45\x3d\xdf\x24\x82\x4c\x76\x62\x7b\x3e\xf5\x73\x38\x9f\x3a\x21\x02\x6a\x26\xe7\x53\x2f\xab\x72\xd5\x9b\x2b\x46\xb7\xe8\xcb\x6b\x0d\xf6\xb2\xaf\xc4\x2a\x46\xba\xee\x2b\x86\xa0\xf3\xf7\x6e\x0c\x02\x0c\x0f\x5d\x85\xa2\xaa\x02\x06\xde\x66\x88\xf6\x5d\x58\x58\xa2\x15\xf0\x64\x10\x16\xce\xa1\xd9\x3b\x3f\x85\x93\x20\x2b\x2f\x43\x22\x9c\x2c\x07\xca\x10\x99\xe5\x94\x67\x49\xb4\xe0\xca\x40\x69\x0a\x4c\x2b\xe1\x6b\x51\x43\x15\xe3\x29\x93\x15\xf4\x3a\xfc\xf1\xaa\x20\xd4\xd5\x5c\x34\xcd\x6b\x81\x6d\xcc\x2f\xeb\xd0\x09\x83\xd3\x0f\x7e\xf6\x51\x42\x9c\x85\xb1\x8f\xa5\xf3\x24\x95\x7e\x4f\xce\xa4\xe7\x37\x61\x8b\xe0\xc7\x38\xcd\xe7\xc9\x3c\x1e\x9f\x2a\xcf\xf2\x49\x9a\x5c\x4a\x9c\x04\xc9\x98\x8f\x64\x53\x37\x65\x95\x17\xe1\x86\xb1\xdb\x7e\x14\x29\x83\xe3\x90\x4c\xfc\xec\xd0\x8f\xaf\xba\x7e\x27\xe5\x18\xd5\xa2\x09\x3c\x34\xef\x31\x04\xcd\xaa\xed\x86\x72\x5b\x88\x86\x3e\x36\xb0\x69\x99\x17\x8e\x0a\x06\x45\xac\xc2\x2a\x7b\xf8\x7b\x72\x36\x6c\x45\x57\xa8\x58\x91\x70\x1b\xfe\x30\x5c\xe1\x0f\x71\x2c\xcd\x2f\xe0\x7d\xa5\x7c\x63\xc0\xbb\xb0\x94\x61\x0f\x97\x18\xde\x95\x4b\x0c\xd1\xb8\x78\xa9\x4e\x46\xbf\x0e\xce\xfb\xb8\x8b\xec\xde\xb8\x8b\x4e\x03\xf5\xe1\xbf\x3b\xfd\x7c\xd5\x5b\x79\x4d\xa0\xdf\x99\x76\x5e\xf4\x37\x20\x40\xd0\xdd\xa9\xe6\xcb\xde\xea\xdb\xf4\xff\x9d\x09\xe6\xeb\xde\x46\x7a\x48\xf3\x3b\x53\xcf\xbf\xf7\xb6\x24\x48\xf3\xb3\x3b\x9b\x63\x37\x49\xf3\x77\x5b\x91\xe6\x8b\xda\x36\xe9\x5b\xd4\x82\x03\x91\x5d\x93\xd4\x67\xdf\x12\x49\x7d\xfe\x44\x52\xff\x15\x48\xea\xc9\x9a\x7b\xd2\x1b\x3a\x8a\x7e\x25\x79\xc3\x2a\x36\xeb\xbf\x4a\x7d\xd5\x14\x76\x7e\xbf\x6a\xf2\xb3\x36\x8d\x5a\x2a\xc1\xcf\xda\x52\xf8\x71\x5f\x72\x6d\xf3\x38\xeb\xcb\xc6\x43\x3f\xbd\xbb\xea\xbc\x9e\xa4\xdd\x2d\x5b\xb7\x8c\xa6\xbc\x8b\x15\x6b\x30\x3a\x1f\xcc\xbf\xa6\x6a\x7d\xdc\x6d\xe0\xde\x04\x91\xb3\xde\x9a\x1b\xa6\xab\xf7\x60\x1c\xdb\xd7\x82\x40\x7d\x77\x96\x43\xce\x9b\xa8\x6f\xb2\x11\xf5\xa5\xf3\x6d\x9c\x77\x76\xb0\x58\x55\x23\x35\x79\xb6\x7a\x5f\xfb\xb7\x80\x88\xb2\x27\x44\xf4\x57\x40\x44\xf3\xed\x8d\xa1\xfb\x70\x81\xdf\x54\xd3\x96\xf7\xc9\xfb\xbd\xf7\xc9\xd7\xc9\xc5\x45\x72\x49\x8f\xdf\x2a\xef\x73\x5c\x9d\xc7\x6b\xac\x8a\xd7\x5e\x38\x70\x8b\xb9\x71\xc3\xd4\x78\xbb\xdb\xa5\x1a\x28\xa4\x51\x32\x48\xb9\x9f\xf3\x66\xcc\xa7\xb5\xbe\x6f\xa8\x68\xc5\x36\xc9\x98\x47\xbc\xfa\x4a\xdc\xb0\x9f\xb5\xef\xbf\x17\x2a\xb0\xf0\xde\xae\xd7\xcf\xfa\xaf\xd7\xbf\xaf\x06\x92\x95\x06\xca\x5b\x02\xef\xab\x85\xd6\x05\xfe\xf3\xdb\x40\x78\x9c\xe4\x1a\x8a\x5c\x76\x81\xe1\x6b\x22\xfe\xdd\x9f\x47\x66\xbc\x85\x47\x66\xcc\x2f\xeb\xf8\x6c\x03\xf9\x9d\x7f\xc1\x6b\x01\x12\x0a\x62\x1a\xa2\xa3\xbc\x27\xec\xb9\x3f\x9b\x45\x61\x50\x04\xef\x12\x54\x4a\xa1\xa7\xe0\xad\xc0\xcd\xf1\x6d\xf3\x97\xcc\xf2\x70\x1a\x5e\xf7\xdf\x31\xbc\x01\x05\x76\xb8\xc0\xc6\x77\xf3\x38\x4a\x92\x59\xa9\x97\xd9\xcc\xc1\xd5\xe8\x72\xfe\x2d\xa1\xcb\xe0\x09\x5d\xfe\x15\xd0\xe5\x18\xf8\xb6\x2f\x47\x97\xf3\x26\xba\x2c\x23\x28\xce\xdb\xe8\x32\xdb\x2e\x9c\xc3\xfa\xc8\x7d\x6b\xf1\x5e\xdb\x66\xa8\x04\x3e\xfe\xa5\x1f\xe6\xbd\x48\xb0\x5d\x77\x43\x9f\x93\x17\x1f\x45\x2d\x77\x43\x4e\xa6\xfe\xec\xc7\xab\x12\x1b\xaa\xc7\xe1\x49\x6f\xb9\xe3\x0d\x08\x57\x25\x84\xe4\x44\xdc\xc2\x28\x2e\xde\x51\x94\xe2\x15\x6a\x6f\x28\x00\xa0\xc1\xe2\x6a\x9e\x52\x48\xae\x28\x55\x80\xc6\x9b\xac\x8c\x53\x38\xe4\x24\x4b\xd2\x1c\xbe\x6e\x58\xae\x34\x36\x7c\x33\x76\x71\xb8\x5c\xa6\xdc\x0f\x26\x7c\xfc\x53\x3c\x2e\x67\x5e\xf4\x16\x60\x99\xbf\x61\x6e\x50\xa2\x1f\xf3\x4f\xb9\x52\x68\x1f\x7a\xd6\xa3\x82\xb4\x45\xd8\xc6\x22\x0a\xf5\x40\x11\xa1\x88\xfd\x51\x30\x48\xbe\x1e\x51\x90\x75\xab\xbf\x6f\xa2\xa0\x53\x7d\x3d\x9b\xb2\x7a\x1c\x13\x1f\x21\xca\x49\xe9\x35\x75\xc1\xf3\x5f\x2f\xe3\xf2\x40\xbe\xe1\x59\x90\x86\x33\x38\x41\xeb\xea\x50\xd4\x46\x8e\xa2\x26\x4d\xfa\x60\xbc\x0d\x7e\x7b\x9c\x77\x30\x88\xc3\x09\x93\xb3\xf0\x73\xde\x95\x7b\x74\xf0\x7d\xbd\x81\x8a\x83\xc1\xc7\x55\x50\x4e\x8c\xe2\x40\x22\x1e\x5f\xe4\x93\x66\xc8\x05\x81\x99\x5f\xe5\x03\xbd\x1d\xc1\xb4\x7f\x6b\x92\x72\x47\xab\x39\xc9\xa2\xf9\x85\x7a\xd3\x20\xb4\x87\x37\xbf\x27\x67\xbf\x34\xac\xde\x9a\xaf\x8d\x9b\xbc\x96\xcb\x1d\x82\x35\x54\xcb\x53\xb5\xbc\x05\x19\xb2\x53\x18\xe7\xaf\x4b\xd4\x35\xa1\x6b\xa1\xf2\x6c\xcf\x92\x0a\xf3\x38\x8c\x6b\x0d\x68\xda\x95\x69\x35\x96\xb5\x82\x5d\x08\x22\x0b\x20\x07\x15\x8c\x46\xa3\x18\x18\x8a\x66\xdd\xa3\xd1\x28\x57\x50\x75\x99\x96\xe1\x3b\xd2\x67\x2d\xea\xf2\x27\x98\x91\xc1\xe9\xbf\x62\x38\xb6\x52\x9e\x48\x50\xab\x54\xcc\x34\x6a\x31\x9f\xdf\xc4\x4b\x29\x8c\xa5\x0a\x12\x16\x97\xbb\x96\xc4\xa7\xa9\x9b\x2a\xca\x1b\xdb\x3a\xc5\x01\x6f\x2f\xf1\xad\x14\x26\x50\x8b\x42\xb2\x73\x0f\x81\xbb\x6f\xbb\x9a\x63\xf3\x1d\x1f\x4f\x84\xe8\x13\x21\xfa\xe7\x22\x44\x57\x2d\xee\x77\x13\xeb\xcf\xfb\xe3\x7b\xcf\x3b\x52\x9b\x7e\xf2\xb4\x89\x50\x84\x82\x1d\x8b\x93\x88\xfb\x63\x9e\xae\xca\x5c\xba\xb7\x51\x34\xe2\x79\xf5\x46\x83\x56\xfd\x0b\xe8\x65\x6f\x09\xcc\x92\x95\xe6\xe5\x14\x51\x4f\x3c\xe8\x15\xaa\xea\xfe\x03\x36\x77\x1b\x28\x65\x21\xf7\xd5\xc2\xf6\xb4\x4e\x01\x69\x8b\xbf\xbb\xa1\xd2\x26\x60\xc5\x65\x13\xf8\x54\x9b\xf8\xf1\x38\x0a\xe3\x8b\x3f\x04\xb1\xae\x2a\xa9\xc2\xc6\x6e\xde\x16\xe1\xe4\xc9\x2c\x89\x92\x8b\x7e\x5a\xe2\xcb\x82\x7f\xee\x8e\x6a\x9e\x44\x1f\x4f\x18\xe7\x2f\x82\x71\x76\x8b\xa5\xb9\x23\xc6\xe9\xa0\x90\x68\xc3\x85\x46\x15\x7e\x28\x74\xea\x5d\xb3\xb1\xd6\x8d\x0a\x75\xae\xac\xde\xa4\x3c\x4b\xe6\x69\xc0\x33\x00\xc3\x78\x83\x25\x1e\xf5\x6c\xf8\x1d\xad\x05\x05\x43\xf9\x7f\xcb\xcb\x56\x20\xca\x56\x85\x88\xb6\xda\x55\x2d\x5b\x28\x6a\xf5\xca\x82\x5b\x3d\x79\x3e\x7f\x1e\x14\x4a\x84\x91\x18\xe9\xf1\x49\x6b\x48\xc7\x27\x45\x57\x8e\x4f\xb6\xf6\xbf\xf9\x6b\x60\xc4\xea\xc6\x91\x34\x7b\xa1\x95\x9c\x69\x0f\x3e\xd0\xc6\x7e\xee\x37\x4a\xbf\xf8\x3d\x4b\x56\xf8\x84\x2f\xc0\x74\x6b\x3f\xa8\xfa\x72\xd3\x1e\xf2\x05\xcf\x87\x55\x9b\xf5\x0e\x28\x87\x09\x4c\xb5\xa2\x3c\xbb\x7d\x9c\xd0\x77\xcd\x9f\x85\x5b\x0f\x14\x0b\x3f\xd6\xc1\x6e\x58\xd4\x94\x67\xdb\xad\x28\x16\xfc\x36\x07\x29\x88\xdc\xd6\x20\xfb\xcb\x35\x34\x41\xed\x79\xf0\xc7\xfe\x2c\x7f\x28\x8d\xd7\x2e\x57\xf7\x85\xa3\x1b\xe8\x70\xc0\xe3\x9c\xa7\x43\x79\x1c\xc8\xaa\x3f\x1e\xa7\x3c\xcb\x86\xf2\xab\xf1\x38\x95\xd5\x8c\xa7\xe7\xef\x92\x34\x1f\xca\xf0\x94\xc5\xa5\x7d\x7e\x9e\xa7\x7f\xc0\x75\x7d\xcb\x38\x49\xa7\x38\xdb\x95\xfd\xf4\x77\xf9\x3a\x55\xde\xf1\x4d\x86\x1e\x9e\x43\x54\xdd\x2d\x4f\x6a\x5b\xf0\x29\xcf\x32\xff\x82\x8f\xe4\xdf\xf8\xff\xcc\x79\x96\xf3\xb1\xf4\x0a\x96\x58\xba\xf4\xb3\x5a\xf7\x27\x85\xb1\x94\xf1\x5c\x4a\xce\x25\x7f\xe1\x87\x11\x4a\x6f\xb0\x5c\x56\xdb\x90\x4b\x39\x79\xfb\x66\x94\x93\x5f\xfc\x29\x57\x73\xf2\xa6\x9a\xbb\x51\x4e\x3e\xf8\x17\xd9\xde\x9e\xf8\x4b\xc6\x81\x9a\x93\xdf\xf8\x45\x98\xc4\xdd\xac\x14\x53\x21\x7b\x16\xc0\x9c\x76\xf3\x61\xcf\x15\x58\xa5\x3d\xfe\x7a\x3a\x7e\xe3\xd9\x2c\x89\x33\x5e\x6e\xa7\xf3\x24\x1d\xa0\x19\xcc\xa8\x5a\xdb\x42\x2a\xa9\xa6\x38\x4d\xaf\xd2\xd4\xbf\x1a\xc4\x3f\x18\x2f\x63\xcd\x18\x22\x41\x66\xfc\x3d\xfa\x47\xfc\xf7\xe8\xfb\xef\x95\xf4\x38\xd2\x8c\x93\xfa\xd3\xe3\xa8\xba\xc1\xa8\xd3\x8d\x76\xbb\xe4\x10\xb7\x7c\xf6\xf9\xf3\xf1\x89\x4a\x08\x49\x1b\x3d\x7c\x1f\xc6\x17\x51\xa7\x3c\x10\x77\x65\x4f\xd3\xd5\x9e\x46\x8d\x9e\xa6\x3f\x98\x2f\x53\xcd\x84\x9e\x26\x23\xf3\xef\xc9\x3f\xd2\xbf\x27\xdf\x7f\xaf\x44\xc7\x89\x66\x36\x7b\x9a\xac\xeb\x69\x5f\xfb\x95\x03\xc2\x2f\xe8\x80\x10\x2b\x6a\x0c\xdd\x8e\xb6\x50\xdb\xb6\x8e\x7d\x83\x7e\xd9\x86\xd5\xa9\xd4\xb4\x1b\x81\x48\x0f\xdb\x22\x0e\x70\xaa\x46\x35\xc3\x92\x94\xab\x5e\x6e\x49\xd8\xb9\xfc\x2b\x5d\x98\xc9\xef\x89\xa2\xf5\x47\x83\xb4\xa3\xcc\x8b\xef\x1c\x08\xb0\x24\x71\xea\x58\x80\xd1\x63\x8d\x05\xa8\x26\x05\xa5\x2d\x40\xa7\x7a\xd3\xbe\xfd\x5c\xfe\x50\xbe\xca\x6a\x41\x00\x63\x12\x7a\x62\x64\x72\xe3\xfb\x8c\xcf\xfc\xd4\xcf\xf9\x2f\x7e\x9c\xa0\x74\xf7\x35\x5a\xc7\x08\xff\x70\xf9\x30\x19\x87\xe7\x57\xf8\x72\xa2\x74\xc1\xa7\x80\x9b\x02\x1e\x95\x55\x7f\xfe\x7c\xb3\x7c\xd6\x4c\x18\x75\xb8\xc8\x2c\x49\xf3\x41\xad\xfd\xab\xbc\x57\x80\x87\x84\x8f\xd5\x74\x74\x83\x43\xe0\xbd\x7c\x68\xd8\xe0\x43\xf9\xe8\x87\x14\xd8\xcf\xf0\x98\x9f\x28\x8a\x9a\x92\xdf\x4a\x8a\x7d\x94\x93\xc2\x9f\x80\x8f\xab\x44\x00\x88\xab\xa9\xd8\xd5\xec\x98\x9f\xa8\x29\x9c\xd4\x9c\xfc\x33\x39\x2b\x6c\x24\x91\x09\xfb\x6e\xd4\x4c\x7a\xd9\x7c\x19\xa2\x4c\xfd\x82\x03\x1b\xa0\xca\xff\x4c\xce\x48\x91\x21\x43\x3d\xef\x22\x3f\x8c\xff\x99\x9c\xbd\x1d\x8b\x1a\xde\xbe\x51\x05\x9c\x17\x62\xff\xc6\xef\xcf\x9f\x57\x2a\x6a\x5c\xa0\xd7\xd0\xc9\xa8\x45\x45\xab\x77\xdb\xad\x36\x70\xa2\x20\xc2\xc8\x82\x09\x87\x23\xf5\xd3\x02\x36\xfb\x68\xd0\x4c\xfb\x90\xfa\xc1\x47\x9e\xc2\xac\x2b\x44\x14\x50\x73\xf2\x36\x3b\x0c\x2f\x52\x3f\x0f\xe3\x0b\x28\xfe\x86\x67\x61\xca\xc7\x1f\x2a\x4d\x93\x28\x2e\xca\x00\xce\x7a\x97\xf2\x45\x98\xcc\xb3\xda\x81\x03\x31\xda\x6a\xf2\xcb\xbe\x44\x64\x06\xa0\xdf\xfc\x53\xde\xa9\xa1\x9d\xf4\xb2\x9b\x50\x7e\xf9\x73\x12\x45\xc9\xe5\xbf\x66\xb5\x6f\x37\x7e\x2d\x92\xe7\x98\xfc\xf6\xcd\xcb\x6e\x42\xf9\xf5\xbb\x94\xf3\xe9\x2c\xe7\xe3\x66\xe3\xd9\xa8\x37\x43\x20\xa6\x46\xd6\x8f\x57\xab\x83\x5e\xcd\xf9\xfc\xb9\x68\xeb\xdf\x7e\x56\x15\x18\x7d\xf7\xdd\xda\x8a\x6a\x15\xd3\xf6\xbb\xf8\xfd\xc4\x4f\xf9\xb8\x52\x0e\xf6\x14\x59\x53\x5b\x71\xb8\x10\x02\x65\x83\xf5\x27\xa4\x96\xae\xe0\xe1\x1f\xfd\x30\xe0\xe4\xf5\x6c\x0e\xff\xb0\xed\xec\xfb\x51\x0e\x2f\xd0\xbf\x56\xfa\xe7\xcf\xba\xca\x01\xb5\x27\xe9\x55\xf1\xe7\xf0\x47\x28\x2c\x7e\x43\xf9\x4e\xa6\xf8\xe2\x4d\x98\x7d\xc4\x87\x28\x0d\xbf\xa0\x6c\x23\x19\xcb\x29\x8a\x7a\xf3\x7a\x36\x1f\xde\x54\x0d\x0e\xf5\xa5\x2a\xaa\x1a\xde\x94\x55\x42\x1a\x7c\x34\xbc\x11\x9f\x0e\xf5\xe5\x12\x25\x40\xfd\x23\x06\x32\x2a\x1b\xa5\xe2\xaf\xda\x5b\xe4\x17\x9e\x5f\x26\xe9\x47\x28\x55\xfe\x54\xea\x92\x61\x12\x57\x10\x58\x1c\xff\x97\xe5\xbc\x55\x10\x0f\x6d\xde\xab\x52\x59\xb9\x76\xe1\xde\x5e\xd8\x54\x1c\xc2\x89\x16\x4a\x42\xb1\x91\x96\xca\x00\x2b\x54\xf3\xfa\x63\x45\x6c\xe7\x5e\x22\x6f\xa9\x42\x1f\x6b\x46\x7e\x5e\xe3\xb9\x60\xd4\x60\xe6\xc7\x77\x8b\xa6\x3a\xed\x46\x53\x1d\xaf\x91\x18\x4e\x01\x64\x8f\x0b\x89\xe1\xb4\x2d\x31\x6c\xbe\xaa\xd3\xae\xc4\x70\xba\x56\x62\x38\xfd\xfc\x79\xda\x95\x18\x4e\xdb\x12\xc3\xe9\x28\xd8\x3d\x9a\x6a\xa6\xce\xab\x68\xaa\x53\x45\x9d\x35\x24\x86\xd3\x8e\x3c\x6f\x5a\x48\x0c\x5b\xe9\x2f\xa7\xab\x48\x7c\x56\x49\x0c\xa7\xb7\x4b\x0c\xbb\x2d\xf4\xd3\x21\xd0\xc5\x29\x0c\xaf\x90\x18\x8e\xa6\x6a\x2a\xa2\xa9\x36\x1d\xaa\x6a\x1a\xca\xdf\x4c\x8f\x36\xd9\xd0\x26\x41\x2a\x18\xd2\x20\x99\x5d\xad\xb7\x19\xf4\x81\xdc\xde\x20\x97\x29\x6b\x0a\xe3\xf3\x88\x03\x91\xb6\x2a\x88\x4f\xf9\x34\x59\x70\x2d\x45\x6b\xdb\xba\xf6\x59\x12\x5d\x9d\x87\x51\xd4\x24\x8f\x11\x0b\x6e\x8a\xe1\xd0\x95\xce\x7f\x3b\xc4\xae\xa0\x71\x83\x8a\xca\x4d\xbf\xc0\x64\x6d\x96\x86\x53\x3f\xbd\xfa\x3f\x1c\x56\xe6\xed\x1b\xb9\xce\xc1\xe5\xfa\x65\x1e\x45\xbf\x2e\x78\x9a\x86\x18\x42\x46\x6c\xa4\xb2\x84\x58\xe0\x5b\x8b\x4c\xfd\xd9\x87\xe4\x95\x58\xf8\x76\x4e\x87\xb8\xc4\xcc\xe5\x47\x7e\xf5\x73\x92\x56\xf7\x86\xd4\x97\x09\x0f\x74\x35\x23\x81\x3f\x0b\x73\xdc\x2d\xca\xa0\x48\x98\x72\xf1\xca\x95\xf2\xe3\xa6\x63\x55\x93\x16\x0d\x47\xa7\xcf\x6f\x36\x55\x83\x3a\xc6\x2c\x8c\x2f\xe6\x91\x9f\x96\x15\x2b\xcb\xb7\x6f\x4e\x0b\x10\x2c\x17\xce\xdc\x32\x80\xdd\x97\x58\x7c\x16\xcd\xd3\xa2\xb6\x50\x19\x86\xcb\xd9\x3c\x9b\xbc\xf3\xaf\xd0\x6e\xad\xd5\x3e\x8a\x3f\x86\xc7\x27\x6a\x11\x9f\x69\x3c\x3c\x3e\x59\x3e\x6b\xc2\xc5\xbc\x01\x17\xd3\x0a\x1d\x44\x0d\x7b\x12\x80\xf8\x3f\xa7\xc9\xb4\x68\xe0\xff\xf0\xab\x41\x0a\x7c\x2b\x27\xf5\x49\xfa\x39\x49\x07\x91\xa2\xfa\x23\x5e\xdb\xa0\x44\xca\xdf\xd1\xf7\x6c\xea\x7f\xe4\xb8\x1c\xca\x20\x3f\x4e\x4f\xda\x14\xb3\x68\x4f\x74\x33\xaf\x7b\x19\x2f\x47\x49\x03\x73\xf8\x2a\x07\x30\x12\x12\x28\x57\x5c\xf7\xab\xa8\x31\xa0\xa6\xf2\x13\x91\x4a\x08\x89\xd1\xf4\x0d\x7d\xac\x30\x29\x5c\x61\x14\xea\x90\x56\xe2\xd2\xe0\xd5\x5d\x57\x98\x3e\xae\x66\xb4\xfb\x9e\x23\x93\x30\x80\x3f\xa3\xe3\x13\x6c\x14\xbf\xeb\xd9\xa4\x45\x8d\x3d\x39\xeb\xab\xbc\x59\xd6\x55\xd6\x9b\xba\xa8\xa9\x4e\x68\x57\x00\xdc\x28\xb0\x96\x9c\x08\xb5\x3a\xac\xde\xcb\x41\x38\x6a\xbe\xab\xf1\x88\x13\xff\x3c\xe7\x29\xbc\x29\x43\xc8\x86\x34\xa5\x26\xf5\x8e\xc3\x13\xc1\x3b\x1d\xc7\x27\x2d\x9e\x29\x5d\xc7\x33\xe5\xa3\xb4\xe4\x99\xc2\x2e\xcf\x84\x11\x04\xfc\x2c\x0b\x2f\x62\x65\x10\xaa\xb9\xa2\x86\xc5\x22\x09\x75\x47\xf3\x5c\x16\xe3\x6b\xa5\xf5\x6c\x19\x29\x1c\xc1\x24\x3d\xcb\x8f\x4f\x9f\xdf\xf0\x25\x16\x3b\x3d\x19\x85\x7f\xa3\xdc\x56\x71\xfa\x0e\xfd\x7c\x42\xce\xa3\x24\x49\x07\xe1\x0b\xca\x6d\x68\x4f\xd9\x20\x79\xfa\x59\x68\x7a\x9a\x82\x95\xfa\x30\x75\x3e\xed\x96\x6d\x01\xbb\xf6\x1d\xd9\xf3\x28\x7a\x9f\x27\x29\xd6\x57\x1f\x2a\x55\xec\x67\x98\x8c\x66\x09\x54\x7e\x8a\xdb\x05\xba\x42\xa4\x1f\x8c\x06\xca\xaf\xc5\x44\xc6\xc9\xcb\xe6\xcb\x70\xa0\x8c\x7e\xf8\x4e\xaf\xae\x1e\x1f\xe8\x6a\x4e\x00\x4f\x2a\xb0\x7a\x0d\x6b\xd8\x9a\xcf\xe3\xaa\x1c\x8e\x65\x45\x51\x9e\x71\x32\xe3\xfc\xe3\x2b\x64\xef\x37\x94\x2d\xb3\xa3\xc6\x91\xce\xab\xf5\x89\x47\x7e\x4d\x37\xae\x7c\x3d\x1a\x8d\x5a\x5c\x66\xd1\x7a\xfc\xd2\x27\x02\xd9\x8a\x3d\x37\x88\x31\x1e\x47\x1d\xf9\x44\xac\x97\x52\xa8\xf0\x7a\x40\x53\x13\x7c\x77\xe0\x2a\x02\xde\xb1\x9f\x4d\x78\x05\x67\x9b\xa2\xb1\x60\x23\x29\x32\x6e\x7a\xea\xaf\x8a\xc6\xba\xc4\x47\x93\x3c\xf8\x32\xe1\x58\x45\x27\xa4\xdf\x26\x9d\x10\x6d\x94\x86\xf5\xd1\x09\x69\x47\x96\x54\xf8\xe0\xfe\x32\x87\x59\x1d\xca\xb5\xc4\x43\x5e\xd6\x85\x9b\x58\xff\xf8\xa6\x86\x75\x0d\xd9\x53\x26\xab\x15\xd0\x6b\x24\xd7\x77\xd0\x2f\x3b\x42\xa5\x7a\xbe\xc3\xbd\xbd\x41\xd8\x94\xa1\x84\x85\x88\x23\x6c\xc8\x50\xc2\x8e\x0c\x25\x17\xbb\x3b\xbc\x55\x86\x52\x54\x24\x2a\xfc\x39\x49\x45\x4c\x88\x1e\xa1\x4a\x4f\x8b\x27\xbd\xf0\x2c\x54\x96\xfc\x53\x9e\xfa\x41\xde\xa4\x4b\xb2\x8e\x90\xac\x56\x33\x17\xda\x1c\x40\xd9\xbc\x06\x4e\x4a\x1d\x84\xa6\x34\xa6\x2f\x8c\x4c\x8b\xca\xdf\x0a\x52\xa3\x86\xf0\x61\x05\xe1\x6f\x9a\xea\xe4\x9b\x28\x8c\x3f\x66\xc3\x9b\x14\x3a\xc3\xc7\xc3\xd3\x17\xcf\x6f\xe2\x65\xe3\x2c\x35\x2f\x6a\x7f\xf1\xfc\x26\x5d\x9e\x2e\x81\x4b\xc4\x71\xad\x1d\x48\xeb\xe4\xf6\x5f\xc9\xd0\x3a\xb9\xa9\x1f\xc6\x5a\x96\x03\x46\xe9\xda\xf0\xec\x7a\x34\xbf\xae\xf1\x76\x2f\xad\x22\xeb\xba\x4e\x35\xfc\xef\x83\xae\x0f\xf1\xbf\xff\x0f\xe9\x41\xf2\x73\x92\x06\xfc\x0d\xf7\xc7\x51\x18\x73\x14\x20\xb4\x52\x0a\x3e\xac\x9f\x15\xdf\x64\x4e\xdd\x9c\x90\x3a\xa2\xea\x93\x5a\xe0\x49\x2d\xb0\xab\x5a\xa0\x05\x9d\xe5\x9f\xfd\x30\xe2\xe3\x0f\xff\x8d\xd2\xa9\x4c\x3e\xb9\x17\xf1\xff\x23\x10\x71\x3f\xab\x55\x10\xbf\x09\x68\xf7\xd3\xc2\x8f\x32\x35\xed\x92\x8e\x4d\xc8\x29\x09\xb1\x7e\xbc\xb7\x17\x17\x54\x5e\x41\x01\xff\x07\xad\x24\x79\xb3\xa6\x26\x1c\x7c\xe3\xe7\xfe\x00\x68\x45\x35\x5d\x6e\x53\xb4\x98\x24\xe4\xa0\xd2\x26\x3c\x1d\xf5\x25\x22\x1d\xdf\x97\x41\xd2\x46\x23\x05\x7f\xc9\x2b\x5e\x60\x70\x13\x8e\x87\x9c\xc0\xc4\x5c\xcd\xf8\xb0\x11\x88\x5c\xcb\xf2\xf9\x99\x8c\xd7\x7a\xaa\x79\xc5\xb5\x8d\xea\x9f\x9f\x3f\x1f\x9f\x54\xf1\xdc\x78\x57\xbc\x7b\x4c\x08\xe1\x82\x5b\xa8\x67\xb1\x81\xc4\x6a\xcf\x87\x6e\x93\x8a\x9a\x2b\x38\x0e\x54\x41\x94\xad\x29\xcf\x1a\x9d\x08\x9f\xa4\x92\x4f\x52\xc9\xdd\xa4\x92\xe7\xa9\x7f\xb1\xca\x08\x3c\x2e\x52\x62\x27\xfc\xfe\x7b\x72\xa6\xcd\x22\x3f\xfe\x42\xc3\xa0\x12\xdf\x3f\x6a\x63\xa0\x55\xcc\x83\xe6\x3e\x0d\xe4\xf4\x87\xdb\xfc\x54\x1a\xb2\x42\xf9\x56\x28\xfc\x06\x2d\xfc\xf4\x2a\x8e\x93\xbc\x88\x48\xd8\x56\x04\x66\x80\xad\x8e\x4f\x94\xd2\x5f\x16\xa5\xa9\x5d\x64\xd3\x31\xd6\xdc\xc5\x18\xa4\x8e\xac\xfa\x88\xf7\xf9\x8e\x9b\x60\x37\xe6\x10\x06\x0f\x9c\xe1\x23\xda\x29\x7d\x64\xce\x76\x24\x4a\x83\xb2\x39\x51\x2a\xda\x06\xbe\xbe\x07\x0e\xa1\x19\xa8\xf7\x56\xf1\xc8\xee\x1c\xc1\xd7\x00\x22\x61\x2f\xcb\x15\x2a\x37\x6b\xf8\xfc\xed\x58\xf2\xf6\x0c\xd7\xcc\x7d\xa5\x46\x8f\x47\x21\x29\x82\x63\xa2\x80\x35\x24\xab\x82\x88\xed\x8c\x54\xf2\xda\x48\x65\x45\xe0\x2a\xad\x13\xf1\xf3\xd1\x0f\xa1\x90\x98\x0a\xf8\x71\x7a\x82\x62\x54\x45\x48\x64\x2b\xf9\x6f\x4b\x7a\x51\xdf\x5d\x51\xd6\x9e\x56\xfc\x46\x29\x13\xee\x69\xa0\xfc\xec\xf4\x04\x25\xc3\xeb\x64\x15\x3b\xc3\xa3\x42\x1c\xd4\xbb\xc7\xee\x26\x72\xfb\xba\xdb\x6c\x47\xc3\xd5\xb8\x10\x77\x55\xb2\xae\x87\x31\x4d\xfd\x39\x8c\xc7\xfb\x42\x01\xd5\x90\x8a\x57\x1e\x47\x62\xc3\x24\xa3\x98\x54\x21\xeb\x70\x9b\xe2\xda\xa2\xdc\x37\xaf\xc5\x42\x4b\x95\xab\x37\x6f\xc2\xf3\xf3\x61\x4c\xe0\x4f\x06\x3c\x0f\xfe\x38\x0e\x4f\xd4\xb7\x6f\x86\xb0\x6f\xc8\xdb\x37\x4b\x0d\xfe\x16\x15\x2e\x4f\x55\x3c\x44\xc3\xee\xe9\x43\x36\x83\xaf\x3b\x7a\xef\xab\xe8\x0c\xc3\x86\x22\x80\x93\x3a\x1d\x75\x02\x8d\x72\xc8\x73\x0e\x9b\x25\xfe\x46\xb9\x0d\x1c\xcb\x1a\x23\xcc\x75\x53\x93\x14\x93\xb3\xf3\xd6\xbe\xfb\x96\x56\x65\x74\x1a\xd1\xd6\xab\xa1\xff\x4c\x42\xe5\x75\x67\x6b\x1b\xa1\x72\xeb\x02\x9b\xa1\xfc\xae\xf9\xfa\xcf\xe4\xac\x29\x5a\x5e\x11\x4a\xd4\x3b\xa4\x47\x0e\x51\xe1\xe9\x6a\x63\x56\x26\xd5\xf8\x56\xda\xe2\x21\xfa\x5e\x8f\xbb\xdb\x88\xfb\xed\x9b\x2e\xea\x7e\xe7\xa7\x3c\xce\xd1\x94\xac\xfc\xd9\x53\x4b\x99\x75\x4b\x5d\xc3\x46\x05\x85\x65\x58\x81\x9f\x4a\xd2\x20\x27\xef\x8a\x8b\x7f\xa4\x30\xce\x72\x3f\x0e\x78\x72\x5e\x60\x18\x94\x38\x96\xd9\x6f\x78\xee\x87\x11\x9a\xab\x15\x29\x8d\x6f\x91\xc1\xc4\xb6\x5a\x13\xbd\xae\xca\x66\xb1\x46\xbd\x9d\xaf\x7b\x2a\x2c\xda\xf9\x67\x72\x56\x0c\xa3\x54\x28\xa2\x9c\xa0\xa9\x29\x6f\x5d\x2d\xa0\xde\xb4\x5e\x87\xc7\xcd\x2a\x6a\x47\xa8\x0e\x81\xb4\x46\x3e\x1d\xd6\x82\xf6\xb0\x39\xf1\x7b\x7b\xd5\xc4\x7f\x37\x6a\x67\xbd\x6c\xbd\x95\xdc\xef\x4d\x25\x8f\x1f\xa6\xcb\x11\x57\xa3\x2f\x12\xdc\x1f\xfb\x27\x6b\xbe\x4b\x15\x72\x36\x0f\xa3\xf1\xbf\x7e\x3b\x18\xa4\x48\xe4\xa8\xa1\x2a\x9f\x87\xf1\x58\x44\x96\x93\x15\x92\xcd\xa2\x30\x1f\xc8\x2f\xe5\x86\xa8\xbf\x86\xe9\xb7\x88\xe9\xdb\xe7\xef\x56\x9d\x40\x32\x38\x7d\x7e\xe3\x2f\x9b\x9a\x80\xd3\x66\x78\xbe\x78\xa9\x2c\x97\x6a\x19\x8b\x75\xed\xe7\x65\x81\xf6\xb7\xea\x18\x30\x8c\xf0\x9a\x5b\xaa\xb5\xde\x61\x7d\x3d\x8d\x32\x3d\xdd\x58\x09\x04\xbf\xb9\x9a\x9e\x5a\x9a\x37\x94\xad\xab\xa0\x51\xa6\xa7\x86\x3a\x96\xfd\xda\x0a\xb0\x48\xcf\xa7\xed\x90\x43\x15\xdd\xd9\x57\xcf\x8b\xe7\x37\xd1\xf2\x45\xfb\x03\xe8\xcd\xef\xc9\xd9\x30\x2c\x21\x59\xc3\x97\x31\x5c\x03\x68\x30\x7e\x8b\xb2\x5c\xb6\x05\xfa\xb5\x72\xbd\x76\xe3\xaf\x01\x58\x2d\x23\x0d\x5f\x22\x49\xf9\xf2\xf9\x4d\xb8\x3c\x1d\xf2\x9d\x74\x3f\xf5\x49\xf8\xd3\xf0\xb0\x85\x8b\x07\x10\x84\x0d\x63\xaa\xaf\x4f\x15\xee\xc4\x0f\xc6\xc2\x0e\x75\x67\x81\x52\x98\x69\x61\x8f\x8f\xfb\x63\x12\x24\xdd\x04\xe1\x38\x1d\xca\xaf\xdf\xbe\xf9\x4d\x56\xc3\xd9\x50\x7e\xfb\x4e\x56\xa7\x67\x61\x9e\x0d\xe5\xc3\x1f\xc3\x3c\x7b\x58\x47\xb2\x5a\x0d\xf1\xf6\xdd\xb3\xda\xb3\x7a\x61\x0f\x62\x05\xb1\xeb\xdb\x77\xa3\xd3\xe3\xe7\x37\xf1\xf2\xe4\xb4\xc1\xf3\xa1\x31\x3e\x4f\x17\x7c\x8c\x86\xc6\x95\x60\xa9\x90\xec\xe3\xad\x2b\x9c\x1c\xf8\x67\x3c\x52\x61\x3d\x87\x9c\x1c\x41\x9f\xd5\x3c\x19\x72\xf2\x21\x51\xc3\xec\xcd\x55\xec\x4f\xc3\x60\xf8\x1d\x45\x63\x9b\x08\x4d\xf6\x45\xda\xdd\xeb\xd4\x9b\xb4\x78\x5e\x59\x45\x07\x49\x1c\xf8\xf9\x20\x52\xaa\xc8\x6c\xe2\xe6\x94\xfb\x94\x83\xc5\xc9\x98\x6b\x7c\xf1\xc8\x05\xbe\x3b\x6e\xe2\x3c\x44\x51\x57\x38\xe5\x59\xee\x4f\x67\x7f\xf0\x9e\xdd\x0d\x96\xa0\x0f\xfc\xad\x7a\xe7\x2f\x61\xf7\x8b\xd8\xda\xb5\x96\x39\xfa\xd6\x58\xa2\x88\x03\xf7\xbd\x12\x78\x79\xa3\xd4\x61\xa3\x96\x59\x8c\xa0\xa9\x65\x4e\x1f\xad\x96\x39\xea\xf0\x76\x61\xf6\x26\xf5\xc3\x38\x8c\x2f\x86\x32\xfe\x92\xd5\x49\x9e\xcf\x5e\x8d\x01\x68\xef\x7f\xf8\xf0\x4e\xf8\xfe\xd6\x11\x15\xe4\x5f\x92\x31\xaf\x9c\x29\x30\x07\xe1\xe0\x50\x2e\x21\x62\x9d\xd9\x68\xaf\xad\xd5\x7e\x93\x86\x22\x24\x99\xbc\x9f\x64\xf9\x51\x12\xcd\xa7\x3c\x03\x06\x71\x83\x35\x4e\x83\xc6\x0f\x97\x23\x5e\x86\x9c\xbc\xd5\x86\xe6\xf9\x4d\x3f\x3d\x1f\x36\xe8\xf9\x50\xed\x31\xd7\x51\xf3\x36\x79\xdf\xa6\xb9\x97\xf0\x3f\xd5\x1f\x35\xe3\x30\x67\xf5\x5e\x98\x37\x55\xa1\xc1\xdd\x54\xa1\xb3\xae\x2a\x34\x58\xa3\x0a\x9d\x1d\xf3\x93\x51\x50\xa8\x42\x67\x6d\x55\x68\xf3\x55\x9d\x75\x55\xa1\xb3\xb5\xaa\xd0\xd9\xe7\xcf\xb3\xae\x2a\x74\xd6\x56\x85\xce\x46\xf3\xdd\x55\xa1\xbe\x9a\x55\xaa\xd0\x99\xa2\x8e\x1b\xaa\xd0\x59\x47\x51\x39\x2b\x54\xa1\xad\xf4\x97\xb3\xd5\x8d\x3e\xae\x54\xa1\xb3\xdb\x55\xa1\xdd\x16\xfa\xcf\x2a\x74\x71\x06\xc3\x13\xaa\xd0\x74\x34\x53\x63\xa1\x0a\x6d\xdc\x79\xd3\x50\x85\x26\x1b\x61\xf3\x2c\x9a\x5f\x84\xbb\xea\x0d\xbf\x06\x5e\x2c\x38\x89\xc2\x62\xa0\xb9\xb7\x78\x5b\x86\x1e\x36\x8c\x54\xf9\x71\x58\x39\x59\xc7\x02\x2e\xc7\x28\x09\x5f\x4b\x2a\xf6\xdb\x9d\xb4\xc4\x39\xa7\x41\x16\xbe\x78\x7e\x03\xbf\x97\xa7\x0d\xab\x10\xbc\x15\xb7\x70\x2b\xcd\x49\x1d\x4f\x45\xf8\xa9\xd6\x92\x23\x28\x36\x0a\x07\xb1\x8a\x80\x09\x95\x7a\xad\xe2\xa3\x70\x90\x36\xf2\x36\xe9\x6e\x36\xd3\x37\xb3\x24\x0a\x83\x6f\xcf\x2e\xae\x15\xaf\xe0\xee\x1a\x2c\x18\xf9\x9f\x92\x5d\x99\x24\x59\xfe\x76\x36\x44\xc4\xf4\xf6\xdd\x63\x61\x4e\x44\x6f\x2a\x16\xbf\x87\x4f\x11\x25\x6a\x5e\xe5\x3e\x49\xfa\x35\x61\x97\xef\x78\x04\x2a\x4a\x32\x14\xef\xb0\x34\xe1\xa8\x0d\x8b\x9e\x85\xe7\x83\xde\x90\xc5\xef\xaf\xa6\x67\x49\x54\xdc\xf1\x1b\x8f\x6e\x2b\x03\xd5\xe4\x7b\x7b\x83\x78\x14\x57\x56\xfa\x55\x4f\xea\xf3\xd1\x5b\x45\x23\x32\x32\xf4\xb1\x81\x43\x91\x69\x0b\x51\x48\x4a\x60\x98\x57\x18\xb2\xac\x0c\x0e\x12\xd6\xc2\x1b\xc4\xcc\x65\xb0\x8b\x7c\x44\xff\x9e\xff\xa3\xeb\xab\xf0\xf7\xfc\xfb\xef\xcb\x91\x08\x13\xb7\xda\x47\x21\x6f\x3a\x2c\xe4\x27\xc3\x9b\xe5\xb3\xfc\x6f\xec\x65\x38\xa8\xac\xfe\xd5\xef\xf4\x3e\x7a\x00\x46\x86\x1b\x12\x40\xb5\xb2\x54\x94\xe1\x86\x11\x66\xbd\x9b\x3a\xe4\x40\x80\x6d\xfa\x74\x10\x2b\xca\xb0\xd1\xa7\x35\x1d\x5a\x7f\x6a\x36\xcd\x7e\x8c\x86\xcc\x4a\x35\xc1\x7c\xf9\xe7\xd1\xcd\xf4\x40\x6e\xa4\x94\xbb\xb1\x5d\x4a\xe9\x43\xd7\x9b\x4c\xee\x86\xa3\x57\xa3\xa6\x73\xd9\x6a\x76\x02\x04\xa5\x3f\x3a\x3e\xa9\x01\x4a\x8f\xd7\x50\x3e\x3a\x7d\x7e\xb3\xaa\x49\x14\x7a\x7c\xde\x34\xe6\x5c\xbe\x78\x7e\xc3\x09\x2a\xe6\x97\xa7\xcf\x92\xe3\xfc\xe4\xf3\xe7\x01\xfc\x19\xdd\xf8\xa5\xb3\xa0\x08\x5f\xfd\x76\x3c\x2c\x6b\x68\x85\x69\xe6\x4d\xa5\x4f\x2b\x1e\x46\x59\x6f\x47\x10\x5b\x84\x5c\x83\x46\x48\x27\x47\xf8\xb2\x71\x45\xf5\xcb\x5f\x00\xe0\x84\xf9\x65\xdb\x67\x3e\xe9\x31\x14\x40\x0d\xe8\xd4\xff\x04\xf0\x92\xaf\x54\x5d\xd8\x0e\x35\xb4\x5a\x95\x98\xe5\x46\x98\x71\xae\x83\x95\x68\xec\xb9\xa6\x3a\xa0\x4c\x4a\xaa\xeb\xf7\x24\x8c\x07\xb2\x26\x2b\x6a\x63\xea\xe2\x41\x8c\x2a\x61\x52\xa7\x29\xea\xcd\x52\xbd\xa9\x03\xeb\x0f\x63\x7e\x29\xbd\xf1\x73\x3e\x68\xe8\x70\x73\x54\xdc\x2a\x4b\x45\x6d\x19\xa6\xe2\x52\x0c\xc5\x8c\x14\xdd\x46\x95\x6a\x38\xee\xd1\x1c\xd7\x4d\x12\x5c\x40\xb5\x9b\xd4\xdc\x08\xab\xcb\x54\x9a\xbd\xf6\x0c\xbd\x10\x6c\xf5\xcd\x5b\x31\x5f\x6f\xdf\xa0\x15\xec\x72\x09\x2b\x58\x79\x3c\xfa\xd5\xc7\x4d\xfc\x16\xa9\x5c\x18\xaf\xc2\x07\x55\xf2\xbf\x66\xe3\xea\xc6\xa0\xd5\x18\x44\xc5\xca\x89\x89\x08\xc7\xc3\xb8\x39\xe9\x37\x61\xf6\x2e\x4d\x02\x9e\x65\x7c\x0c\x27\x79\xb9\xdc\xcd\x91\xa2\x3b\xa2\x27\x85\xf5\x1f\xa5\xb0\x06\x08\x52\x1b\xa7\xed\xa0\x9f\xde\x49\x47\xb9\x56\x43\xd9\xd4\x4f\x96\x0c\xe9\x71\xba\x4e\xaf\x28\x22\x65\xd6\xb2\x08\x71\x14\xd7\xd8\x4f\x9d\x28\x5f\x4d\xe9\x88\x20\x61\x45\xa9\x95\xae\x68\xc4\x1e\x46\x33\x95\x56\xb1\x6f\xfe\x6c\xb2\xe5\x63\x59\xec\x3e\x64\x34\xda\xfb\xf3\x41\x4d\x6c\xbb\xa1\x81\xc6\x45\x68\x20\x4c\x12\xc6\x14\xf5\x5b\x23\x28\x0f\x7e\x87\xfc\x76\xf9\x85\x60\xbe\x5f\x36\x5f\x6e\x8b\x7a\xb2\x0b\x1b\x9a\xd6\x82\xc8\x3f\xcf\x7e\x78\x57\x8c\xa2\x8c\x4e\x53\xec\x8d\x9e\x88\x0f\x0f\xb7\x41\x5e\xcf\xe6\x6b\xa2\x06\xa9\x65\x54\xa0\xdb\x02\x05\xa9\x22\x1c\x50\x7f\x74\x20\x0c\x2a\x25\x86\xde\x34\x79\x41\x9a\xf8\xf3\xe7\x41\x9d\x3b\x3a\x3e\xd9\x81\xcf\xdd\xbc\x9b\xd0\x06\xe0\x7e\xe0\x4b\x9b\xb9\xfd\xf6\x10\xf1\x66\x49\x4a\xef\xee\x5d\x87\x66\x0b\x04\x5b\x15\xe8\x8d\x4d\x72\x2c\x1f\xf2\xdc\x07\x3c\xbc\x93\x74\xa2\xd2\x6b\x3d\xad\xd8\x97\xaf\x58\x49\x3a\x05\x49\x1c\xf3\x20\x1f\xca\xaf\xc5\x0f\x20\x9e\xc2\x5b\x42\xce\x1c\xcb\x1f\xfc\x8b\x6c\xf7\x35\xc3\x5e\xcd\x53\x3e\xd6\x6a\x8a\xfb\x31\xc3\xf0\x7e\x38\xb8\x8a\xc0\x6e\x7e\xf3\x2f\x87\xf9\x72\x47\xc0\x03\x04\xeb\x13\xdc\xb9\xbf\x5d\x5c\xc4\xf9\x1d\xca\x6f\xc2\x6c\x16\xf9\x57\x87\xe2\xbd\xb9\x99\xd7\x81\xa8\xdd\xf6\x31\x2e\xdc\x45\x9a\xcc\x67\x5a\x6d\xc2\x76\x5f\x02\xd2\x87\xd0\x11\xbc\x8b\xfc\x80\x8f\x5f\xfb\xb1\x9f\x36\x22\x1b\xa2\x3d\x69\x9d\x13\x72\x11\x50\x51\x5c\xac\x2b\x75\xf3\xb6\xa2\xeb\x6e\x0f\xa5\xde\x98\xd7\x3f\x9b\x4f\x95\x2c\xe2\x75\x3e\x24\x51\xb7\x3b\x6c\xba\x10\x01\x69\xd7\xc6\x94\xfb\x12\x8b\x92\xa6\x84\xfc\x5b\x04\x55\xe9\x17\xc9\x2a\xe2\x5b\x91\xe9\x7b\x41\xcb\xa0\xa3\x7f\xdc\x6b\x3a\xd1\x30\x96\x58\x13\x7f\x45\x44\xfd\x6c\x4b\x74\x39\xf9\x69\x36\xe1\x30\x57\x11\xd2\xdd\x8d\x38\x47\x61\x3b\x0b\x85\xa5\x61\x65\xde\xd6\xfe\xac\x53\x96\xbc\x0f\xaf\xf9\xe1\x8f\x1b\x9d\x95\xd2\xed\x36\x59\x71\xb5\xcf\xe3\x3d\xe9\x3b\x07\x1c\x09\xe3\x30\x9b\xf0\xf1\x2b\x61\xa8\x5f\xbf\xde\x5b\xa8\x11\x98\xb7\x6f\x68\xc6\xaa\x70\x64\x75\xc0\xe7\x46\xf0\xd4\x86\x55\x65\xc1\x41\x86\x4d\x86\xb1\x9d\x77\xe8\x7f\xaa\xb3\xfd\x4f\xad\x12\xaf\xdf\xfd\x6b\x14\x92\xd7\xef\xfe\xd5\x48\x2b\xf6\x6f\xc5\x61\xf6\x6f\xf0\xbc\x77\x83\xdf\xcb\x4a\x25\x1f\xf9\x6d\x51\x39\x9f\x20\xe8\xae\x10\xb4\x15\x1b\xf3\x55\x10\xf0\x2c\x4b\x52\x34\xf2\x88\x3b\xe4\x60\xc6\x83\x94\xe7\x43\xf9\x3d\xfe\x7d\xfb\x46\x5e\xae\x07\x9e\xef\xd0\xbc\xe3\xed\x9b\x6c\x54\xfc\x06\x82\xa6\x4c\x46\xb1\x6e\x1b\x78\x96\x65\x36\xbb\x6c\x6e\x86\x82\x0b\x84\xed\x77\xf4\x08\xde\x22\xbe\xea\x93\x9e\x40\xec\x0b\xa8\x23\x8d\xfd\xe8\xed\x78\x28\xff\x54\xfe\x7e\xd3\xd4\x17\xc0\x4c\x8e\xc7\x7c\xdc\x92\x9c\xc3\x02\xc1\xf8\x78\x83\x40\x96\xf1\xb6\xe4\x66\xc8\xf1\xde\xb8\x3b\x77\x71\x74\x6b\x59\x4a\x6d\xf0\x78\x43\x3b\xb3\xa6\x75\x55\x99\x52\xd9\x58\x09\x20\x5c\xf4\x58\x18\x5a\xc5\xa3\x9c\xfc\xbb\x1a\x57\x79\x21\xc0\x6f\xed\x61\x8d\x30\x90\xfa\xbf\x3b\xc3\x17\xa9\x8d\x84\x66\x7c\x6e\xd4\xf7\xf5\x1a\x2c\xd6\x1a\xed\xb7\x6f\x9e\xa5\xb0\xf5\xc2\xbd\xbd\x95\x26\x2b\x85\x2e\x96\x88\xa1\x44\xb7\xfd\xa6\xa6\xb7\xe2\x4a\x1a\xf9\xb5\xe9\xfe\x6d\xe1\x85\x9a\x46\xa0\x3f\x55\x2b\x1f\x24\xe9\x38\x13\xfb\xa1\xd6\xe0\x60\x94\xd5\xb5\x31\x6d\x5b\xf5\xf5\x6d\xa1\x32\xa0\x4e\x36\xe0\xca\x4b\x0c\xfd\xda\x0c\x7b\xcb\x95\xa1\xe8\xe6\x9a\xfa\x97\x6b\xfa\xc8\xcb\xfb\x00\x4b\xdf\xf3\x3a\x6e\x4f\xda\x0a\x1e\xa4\xde\xd2\xb3\x1e\x4b\x80\x68\x14\xb7\x23\x1b\xfd\x88\x90\x10\xbd\xe7\xb8\xa2\x26\x0d\x1f\xf8\x54\x3d\xed\x09\x84\xf4\xfc\x86\x2f\x51\x37\x7b\x8a\x16\x3d\xdf\x25\xc5\x85\xc9\x55\xdc\xcd\xfa\xbe\x97\xa4\xbc\x44\xfb\x59\x52\x77\xa5\x15\x80\x5d\xa8\x6b\xe3\x5a\x1f\x9c\x2c\x47\xed\x68\x47\x3f\xf5\x0c\x6c\x10\xaa\x91\xca\x95\x67\x69\x27\x0c\x6e\xac\xa8\xc9\xde\x5e\x37\x95\x10\x92\x28\xaa\x8f\x26\x0c\xe1\x78\x18\x93\x70\x2c\xc2\x34\xc5\x04\xfe\x2c\xeb\x00\x00\x65\x60\x27\x7f\xf9\x77\x9c\x85\xec\xf6\x59\x38\x55\x33\xdc\xa4\xe9\xf2\xf6\xde\xb6\x4c\x3e\xe0\x60\xa2\x81\x71\xda\xb4\xeb\x88\xab\x7d\xdb\x35\x08\x89\x95\xc6\x06\x4f\x61\x53\x60\xf8\xe6\x6d\x14\x6e\xc8\x7d\xbc\xd0\x78\x9c\xcd\x53\xae\xa5\xfc\x22\xcc\xf0\xa2\xf3\x55\xa4\x94\x26\xe1\x98\xa7\x18\xf5\xbb\xfe\x70\xf5\xbb\x6f\xea\xe2\xaf\x62\xf4\x30\x4c\x3f\xea\x23\xd6\xb2\xdc\x4f\x2f\xfc\x9c\xaf\x14\x26\xbf\x67\xdf\xe2\x50\xfd\xb3\x30\x0a\xf3\xb0\x2b\x7b\x2d\x28\x53\x3f\xee\x2b\xf9\x2d\x0e\x13\x88\x82\x4c\x4b\xbb\x58\x7c\x87\xd8\x8c\xff\xcf\x45\x14\x4e\xa7\x3c\x7d\x01\x90\xf7\x23\x10\x56\xf5\x0d\xb6\xf3\x38\x4a\x92\x99\xac\xca\xc1\x1c\x58\x0a\xcd\x4f\xd3\xe4\x72\x65\xa2\x56\xee\x9e\xad\x7d\x69\xb2\xc1\xd3\x65\xae\x7f\x81\xcb\x5c\xe7\x2b\x97\xb9\x6e\x16\x23\x6e\xf4\x3e\x12\x7b\xbb\xe9\x7d\xe4\x3f\x56\xef\xa3\xe5\x05\xcf\xa5\xf3\x38\x1b\x94\xee\x3c\x25\x9e\x78\x05\x63\x18\x72\x75\xcc\xdb\x29\xb9\x9a\xf2\xc0\x8f\x82\xd7\x70\xae\xb2\x61\x28\x10\x7d\x69\x70\xb7\xf3\xd7\xd8\x3e\x20\xe6\xaa\x03\x62\xf2\x86\xbc\x63\x1f\x97\xb7\x1b\x5a\x5b\x6a\xd9\x6a\x10\x0e\x22\xde\x31\x5b\x9a\xaa\x28\x03\x58\x1d\xc1\x1e\x88\xc5\x19\x00\x15\x23\x02\xe6\x63\x9d\xa3\x63\x42\x48\xe3\x5d\xc5\x13\xbc\xec\x8c\xe4\x4b\x2a\x6e\xfc\xae\xac\x9e\xf3\xd1\x0f\xf9\x77\xa3\x11\x17\x96\xb4\x30\x19\x29\x0f\xf2\x6c\x65\x36\x5a\xa3\x97\x78\x33\xb6\x39\x27\xb3\xc2\xc4\xe3\xa7\x85\x1f\x29\x5d\x03\xca\x9b\x66\xee\x30\x57\xc3\x71\xd3\x51\xeb\x78\x9c\x04\xb8\x81\xc5\x7d\xbd\xef\xb9\xb8\x44\x64\x70\x7a\x0c\x8b\xa2\xf1\x85\x1f\x8d\xe4\xe7\x37\xe1\x52\x3e\x39\x55\xd4\xed\x0a\xe7\x58\xf8\xa4\x1e\x50\xd3\xc4\xa9\xde\x67\x41\xde\x33\xae\xaa\xef\x11\xcf\x8f\x73\x35\x3c\x19\x71\x41\xd5\xdd\x64\x9f\x86\xb1\x9a\x5d\x0d\x53\x35\xa0\x9f\x86\x89\x1a\xd0\xab\xa1\xaf\x06\xec\xd3\x30\x53\x03\x76\x35\x9c\xab\xfc\xd3\x30\x50\xf9\xd5\x70\xbc\x1c\xb5\xb1\x61\x15\x97\x13\x4e\xa4\x7a\x9c\x8a\x8b\x4c\xea\xd8\x89\xea\xd9\xc9\x08\x03\xae\x5f\xf0\xfc\xc7\xe4\xd3\x87\xe4\xc7\xe4\xd3\x2b\x40\x18\xca\x20\x24\xc9\xf9\x79\xc6\xf3\x03\x7e\x9e\xab\xe5\xcb\x87\x64\x56\xfd\xfe\x77\x38\xce\x27\xd5\xdb\x3e\x0f\x2f\x26\xb9\x1a\x37\xbf\x8a\x1b\x5f\xc5\xad\xaf\xe2\xd6\x57\x95\xd5\x6a\xf6\x69\x98\xc2\x48\x13\x1c\xa9\x8f\x23\xcd\x70\xa4\x73\x1c\x69\x00\x23\x1d\xc3\x48\x67\xaa\xcf\x87\x53\xd5\xcf\x86\x67\xcb\xe5\x00\x60\x78\x59\xc7\x78\x78\x7a\x28\x3d\xbf\x89\x97\xd2\xf3\x9b\x74\x29\xbd\x96\x9e\xdf\x24\xf0\xdb\x5f\xaa\xd2\xf3\x9b\x0c\x7e\xce\xf1\x67\x00\x3f\xc7\x40\x04\x57\xf3\x5b\xcf\xa3\xb0\xee\xae\x0f\xec\x40\x59\xb7\xa1\xd1\xf1\x2e\x6b\x5f\x72\x5c\x82\xc1\xe3\x98\x20\x86\xe6\xe3\x2f\xbe\xe5\x78\x85\xd2\x38\x3e\x59\x2e\x15\xb5\xd3\x60\xeb\x84\xca\xea\x71\x48\xc4\x91\x3c\xd9\x68\xcb\x7e\x4b\x35\x8a\xda\xc8\x5c\x69\xb2\x03\x16\xbe\xbc\xd1\x6e\x45\xb7\x37\xdb\x5c\x94\xbb\x0c\xb4\x51\x4b\xa7\xc1\xd6\x85\xd2\xf3\xdb\x69\xb9\xb3\x94\xfb\xe3\x20\x9d\x4f\xcf\xbe\x02\x09\xd7\x4b\xb2\x15\x24\x99\x9a\xd4\x04\x9b\xff\x44\xb0\xfd\x15\x08\xb6\x6c\x34\x88\xee\x9d\x60\x2b\xf7\x6e\x4d\xb0\x25\x8f\x96\x60\x2b\xc1\xc4\x8f\xd5\xa1\xdb\x89\x16\x11\x43\xad\x89\x1c\xf1\xbe\x42\xe4\xb4\x6b\x2f\x3d\x31\x1a\x5f\xf4\x50\x30\xcf\x9a\x0d\xe4\xcb\xa5\x9a\x8c\xfc\x41\xd4\x04\x38\x15\x8c\xf8\x6a\x18\xa1\xd3\xe0\xea\x70\x76\x82\x96\x9b\xea\x02\x38\xd1\x80\x99\x9d\xc6\xfb\x66\xf3\xcb\x9b\xef\xad\xad\xd3\x81\xa8\x09\xb4\xb3\xdb\x81\x76\xd0\x8d\x96\xfc\x67\x93\x30\x04\xc9\x98\x6b\xd3\x10\x6f\x79\x6f\x0d\x34\x5c\x5c\x69\x90\x29\xf2\xfa\x3f\xf8\x26\xc7\x2b\xe2\x1c\xac\x55\x55\xbd\x08\x92\xe9\x6c\x9e\xf3\xf1\x4e\x17\x5f\x88\x6a\x5f\xf0\x78\x11\xa6\x49\x8c\x51\xc3\x6f\x47\xc9\x35\x6d\x5d\x23\xe7\x59\xad\xe7\x0a\x1f\x2b\x60\xad\x3a\x3b\x7d\xa2\x24\xfe\x0a\x94\xc4\x19\x50\x12\xa8\x20\xe0\xff\x33\xf7\x23\x65\x20\x37\xf7\x38\x9c\xd3\x05\x8f\x92\x19\xbe\x55\x1a\x95\xfe\xa2\xb3\x34\x19\xcf\x83\xc2\x95\xd3\xbf\xad\x64\xce\x33\xa8\x2d\xdb\x32\xe2\x4d\x1f\xd9\x32\x2b\x14\xa1\x61\xf6\x86\x2f\x64\x75\x8e\x28\xbe\x99\xfc\x2e\x4d\xc6\xb2\x1a\xac\xa4\x7f\x80\xb6\xd5\xb1\x48\x5f\xce\xe3\x8f\x71\x52\xa3\x9d\xd6\xd5\x63\x71\xa1\x39\x2a\x7b\xa5\x72\x65\xb9\x54\xe7\xa3\xe9\x20\x6b\xa2\xa4\xa2\x07\xc7\xd1\x17\x63\x71\x71\x07\xaf\x1a\xac\xd6\x2c\x06\x71\x9c\xdc\xb5\xea\xf1\x6a\xd5\x62\x1e\x8e\xfd\xbb\x56\x9d\x35\xb1\xed\xd9\xed\xc0\x79\xca\xc7\xa1\xdf\x87\x6f\x53\xe1\x01\x19\x2e\x78\xb7\xf0\x57\xb0\x0a\x12\xfe\xfc\x15\x4a\x79\xb6\x85\xb5\x4c\xd1\xa3\x64\xf5\xba\x08\xd1\x7f\x91\xb3\x5a\x72\x37\x04\xf2\x10\xf1\x26\x36\x31\x05\xc5\xd7\x3f\x27\xe9\xd4\xcf\x81\x37\xa8\x63\x3c\x88\x41\xee\xed\x75\x53\x48\x32\xcf\x67\xf3\xe2\x93\xf2\xaa\xf2\x2d\xcd\x37\xe2\xdd\xcd\x37\xe2\xad\x2c\xa3\xc5\xba\xcc\xfc\x0b\xae\xe5\x61\x1e\x71\x2d\x0a\xb3\xde\xa5\xac\x8b\xac\xff\xec\x1b\xa4\x8b\xea\x21\xec\x3e\xe8\x6f\x71\xbc\x29\xcf\xc2\x6b\xae\x25\x67\x68\x4d\x97\xae\x01\x3a\xcd\x22\x5a\xf1\xed\xfa\x3a\xbe\xc1\x69\xc8\x92\xe0\x23\xcf\x37\x09\xa4\x6e\x83\x52\xf5\x3d\xdc\xdb\xde\xf7\x76\x3f\x84\x49\xb2\x7a\xef\xda\xdd\x45\x1c\xdf\xd0\xbd\x6b\xcb\x0b\x9e\x7f\xf0\xb3\x8f\x18\x1d\xf8\x3d\x2e\xa3\xd8\x74\xe1\xf9\xa0\x49\x6a\xa1\x8b\x77\x09\x80\x1b\x0b\xd7\x80\xcb\xc7\x25\x57\x1b\x85\xc0\xd9\xf9\x17\x5c\x3e\xd9\xdb\xfb\x8e\x36\x3f\xed\x2b\x43\x78\x0c\x9d\x1f\x2b\x25\x9d\xcc\x2f\x0b\xca\x7f\x50\x7a\xb2\x14\x7e\x2c\x7c\x3c\xfc\x8e\xaa\x19\x8f\xc7\x40\x41\x89\xcb\x8d\x3b\x05\x5e\x8a\xcb\x93\xe3\x22\x7d\x50\xc7\x5f\x98\x45\x7e\xc0\x07\x72\x96\x8f\xc3\x58\x56\xe1\x6f\x32\xcf\x65\x65\xa9\x0c\x07\xbd\x35\x8d\xbe\xd3\xd5\xde\xca\x4e\x6f\xca\x8f\x87\x37\x32\xa4\xc8\x43\xf9\xf9\xcd\x59\x9e\xf8\x03\x79\x1e\x67\xf3\x19\x1c\x00\x3e\x06\x54\x74\x88\x43\xfc\xbf\xf1\xff\x4d\x65\x65\x29\x2f\x97\xa7\x4b\x45\x59\x2e\x95\x67\x95\x96\x44\x9e\xe4\xf9\x2c\x1b\xca\xa3\xd1\xe8\x32\x8c\xc7\xc9\x25\x29\x6d\xb6\x04\x19\x15\x24\xd1\x4b\xf9\x32\xcb\x86\xf2\x50\xbe\xcc\x86\xb2\x8a\x17\x6e\xc4\x85\x18\x83\xa7\x0a\xf6\x5d\x21\x51\x92\x7c\x9c\xcf\x06\x72\xe1\x58\x3f\x6c\x9e\x22\xa0\xe6\x4f\x9f\xdf\xa4\x64\x92\x64\xf9\xe7\xcf\xdd\x76\x20\x75\xf9\x02\xf2\xe7\x69\xf4\x2e\xe5\xe7\xe1\xa7\x81\xb2\x3c\x55\x93\xc2\x61\x1f\xf7\x32\x8a\x51\x16\xfc\x37\x7e\x11\x26\xf1\xb3\xc6\x42\xfd\x9b\x9f\x15\xbb\xe6\xf4\xf9\x4d\xb8\x7c\x21\x82\x40\x07\x51\xd8\xbe\xae\x13\x23\xa4\xd4\xaf\x24\x1c\x2f\x5f\xf0\x4f\x3c\x78\x99\xfb\xd9\xc7\x11\x64\xc6\xfe\x94\x2f\xf7\xf2\xfc\x6a\x94\xa7\x73\xbe\x77\x99\xe1\x4d\x75\xd9\xc4\xff\xc8\x31\xe5\xf4\xfb\x41\xf2\xf2\x74\x2f\xc5\x1e\x8c\x9e\xdf\x24\xcb\xd3\xa1\x2c\x2b\xdf\x9f\xee\x05\xc9\x74\xea\xc7\x63\xa8\x25\x0e\x92\x31\xff\xd7\x6f\x6f\x5f\x27\xd3\x59\x12\xf3\x38\x1f\x9c\x1e\x57\x4a\xb2\xe5\xa9\x22\x62\x16\xa6\xed\x98\x85\xe5\x69\x7d\x8a\x59\xf8\xa7\x8b\x59\x18\x8d\x66\xe5\xf5\x6d\x3b\xc6\x2c\x2c\xf0\x5a\xee\xe7\x99\x26\xc4\xa7\x68\x40\x73\x11\x66\xf9\xa6\x4b\x8b\x56\xf0\x5e\x94\xce\xff\x33\xf5\x67\x4d\x0c\x38\xcf\xc3\x28\x7b\x81\x78\x87\x17\x31\x83\x5b\x6d\xad\x2f\x5b\x1f\xa2\xce\x17\x4f\xe6\x36\x4f\x32\x97\xb6\xb9\x0d\x3e\x83\x55\xa3\x9b\xcd\x21\x7f\xd3\x0d\x04\x4e\xe1\xcd\x91\x3e\x52\x9b\x9b\xb4\x11\xf1\x77\x8e\xc6\xb5\x31\x39\xf8\xed\x5f\x87\xfe\x6c\x40\xf5\xd2\x50\x42\x1c\xe5\xdf\xf8\x79\x4d\xf0\xce\x91\x1a\x12\xe7\x09\xf6\x79\x78\x3e\xf8\x8e\xb7\x6d\x75\xf3\x11\xdf\xdb\xe3\xa4\x31\x71\xcd\x5b\xfa\x01\xcf\xe6\xcb\x21\xe0\x33\xbc\x5a\x23\x1c\xcb\x80\x4a\xe3\x91\x8c\x61\xa9\x47\xa3\x51\xfe\xb2\x12\xf4\x0c\xa3\x4a\xe4\x93\x34\x0b\x88\x9f\x43\xb9\x3e\xe9\xb2\xea\x8f\xe6\x58\x63\x88\x06\xc4\x7e\xd1\xa7\xd2\x30\x58\xb4\x96\x2b\x7b\x7b\xdf\x95\x3f\x49\x98\xbd\xe1\x59\x9e\x26\x57\x7c\xdc\x9b\x1c\xc6\x17\xca\xc0\x57\x13\xe5\xf3\x67\x9f\x64\x3c\x1f\x24\x2a\x57\x54\xbf\x32\xeb\x8d\x49\x80\x17\xea\x0e\x6e\xce\x79\x1e\x4c\x86\x7c\xf4\x03\xd2\x03\xb8\xf4\xc4\x9f\xe7\x93\x04\xef\x51\xf9\x8d\xff\xcf\x9c\x67\x68\x08\x7d\x9c\x9c\x0c\xf9\xb2\x32\xcb\x9d\x63\xb5\xa1\x9a\x29\x6a\xaf\xc9\x42\xe9\x12\x14\x56\x48\xf7\x8e\x22\xa2\x3e\xcb\x02\x5c\x61\x59\x3d\xce\x49\x29\x90\xff\x22\x03\x05\x51\xcd\x6d\x6a\xfb\x60\x13\x26\x49\xd2\x5e\x9e\x18\x08\xc8\x22\xf7\x5b\x64\xfc\x0a\xda\x69\x37\x43\x84\x75\x8a\x92\x35\x28\x6f\x96\x26\xd3\x30\x03\x0e\xb9\xab\x2f\xe9\x2f\xe7\x0b\x67\xd1\xba\x58\x41\x15\x77\x1d\x85\x3a\xd5\xfc\x9e\x25\xb1\x76\x19\xe6\x13\xad\x9a\xad\xca\x47\x2d\x0e\xe6\x69\xca\xe3\xe0\x6a\x1d\x9a\x15\xaa\x18\x01\x43\x1b\xb6\x4e\xea\xb9\x3a\x51\x2f\xd4\x2b\x75\xa1\x5e\xaa\xd7\xea\xef\xea\x27\xf5\x57\xf5\x9d\xfa\xb1\x46\xc6\x87\xdf\x92\xb6\xe6\xfd\x13\xe5\xf0\x57\xa0\x1c\xfe\x33\x1a\xcc\x47\x78\xaf\x6c\x79\x38\x0b\x2b\x87\x92\x03\x94\x15\x35\x58\x29\x20\x58\xb3\x8c\x1c\x9f\xc8\x8a\x3a\xbe\x3d\x7b\x76\x7b\xf5\x15\xc0\x12\xef\x24\x2d\x93\xb3\x49\x32\x8f\xc6\xef\x27\xc9\xa5\xc8\xc9\x64\x45\x9d\x6e\xea\xea\xd9\x4a\x81\x2a\xa6\x5b\xd1\x9d\x73\x28\x91\x11\x60\x46\x95\x7a\x3f\xfc\xef\xd2\x80\x52\xe2\xa3\x9b\x83\x30\xe0\x71\xc6\x87\x37\x3f\x73\x3f\x9f\xa7\x1c\x23\x70\x2e\x9f\xe5\xe9\x55\xb9\x63\xae\x42\x1e\x8d\xa5\x7e\x24\xe9\x5f\x96\x78\xf2\xf4\xc5\xf3\x9b\x84\x54\x1d\x58\xbe\x80\x35\xf2\xf3\x24\x7d\x11\x89\x16\x4e\x15\x92\x4f\x78\x3c\x18\xe8\xaa\x5f\x2e\x8e\x32\xe0\x8a\xb2\x0c\xfc\x3c\x98\x34\x42\xf6\xa2\x1f\x8e\x3a\x59\xdb\xf7\xba\x6f\x83\xdb\xfa\x56\x74\x4c\x7e\xb1\xa0\x2f\x32\xee\xa7\xc1\xe4\xc5\xf9\xfc\xfa\xfa\x0a\x03\x89\xe4\x93\x64\x3c\x94\xdf\xfd\xfa\xfe\x83\xac\x9e\x25\xe3\xab\x6e\x84\xcc\x9b\x0f\xfc\x53\x3e\x94\xcf\xc5\xa4\x68\x63\x9e\x73\x6c\x5f\x43\xab\x55\x59\x7d\x9d\xc4\x39\x96\xa8\xa7\x5c\x46\xa4\x42\x92\x8f\xc5\x80\x2a\x65\xd8\x77\x14\x07\x74\x21\x44\x1c\x7e\x14\xfa\x99\x32\x90\x91\xfc\x28\x66\x9f\x44\x7e\x96\xbf\x9f\xa3\xb3\xeb\xf9\xbc\x38\x75\xb2\xa2\x5e\xb5\x3f\x09\x26\x3c\xf8\xf8\x33\x8c\xe1\x3d\x8e\xe7\x5d\xca\x33\x1e\x07\xe2\xf3\xea\xa3\xc5\xca\xb6\x28\x56\x80\x94\xad\x95\x4b\x2d\x36\xc9\xe5\x96\x72\xc2\x3e\xd2\xf9\xb0\x50\x0c\x16\x34\xcf\x75\xa1\x2f\x2c\x93\x0b\xea\xe0\xf7\x4e\x72\x73\xe8\xb2\xfa\xa9\x93\xbb\x6e\x94\xb2\xfa\x6b\xa7\x64\x54\x56\xf1\xae\xdb\x40\xfd\xf5\x4f\x42\x08\x27\xab\x1f\x0b\x9d\x25\x50\xc9\x11\xf7\xc7\x3c\x6d\x1c\x83\x7a\x07\x55\x17\xbc\x56\x52\xc1\x92\x5e\x2c\xd0\xf0\x90\xf7\x6c\xb2\x95\xdd\x0f\x3c\xec\x3c\x7b\x21\x1a\xaa\xb6\x3e\x5a\x5a\x03\x3e\x1e\x28\x4a\x23\x6d\x70\x93\xce\x02\xbc\x9b\x03\xe3\x4f\x37\x32\x0a\x07\xb8\x3c\x3c\xbf\x2a\xa1\xde\xeb\x89\x1f\x5f\xf0\x81\x2c\xaa\x26\xc5\x97\xb2\xa2\x72\x45\x51\x0a\x63\x7c\xff\x82\xc7\xf9\x7d\x0c\xef\x96\xf3\x8d\x6d\xbc\xc8\x78\x74\xde\x7f\xb2\x6f\x96\xcd\x91\x20\x56\xcd\x81\xc8\x17\x91\xb0\xf9\xde\x9e\xf8\x31\x1a\xe4\x23\x5e\xe0\x40\xa5\x81\x8a\xf2\xbd\xbd\xbc\xbc\x00\xb5\xb4\xf7\x2e\x5e\x87\xb9\x5a\xfc\x7a\x97\xf2\x94\x47\xdc\xcf\xf8\x30\x2c\xd3\x0e\x79\xee\x0b\x57\xc2\x65\x55\x71\x59\xd1\x33\x4e\x8a\x1b\xf2\x46\xb9\x1a\xee\xed\x0d\xea\x77\xbc\x78\xb5\x78\x59\x6a\x18\xcb\x52\x51\xe3\xf5\x45\xbe\x7f\x7e\x13\x2f\x4f\x1b\x81\xab\xab\xc9\x6f\x81\xf8\x3f\x64\x11\xa6\x48\xce\x65\xdb\xac\xc3\xe0\x46\xe0\x9c\x21\x27\xef\x51\x2d\x23\xba\xb9\xac\xf7\x4e\x81\xcf\x6e\xed\x78\x74\xe7\x8e\x17\xad\xf4\x77\xf9\xf8\xa4\xde\xc9\x0d\x94\xd7\xed\x52\x51\x87\x9a\x37\x65\xcc\xd1\xfb\x3c\x49\xfd\x0b\x4e\x90\x0a\x7e\xd5\x23\xde\xe5\xb5\x97\x6e\xae\xbc\xcc\x05\x9b\x95\x75\xdb\x12\x6c\x72\xb1\x59\x6b\xeb\x45\xfe\xbd\x2c\x3f\xdb\xaa\xb9\x51\xbe\xe4\x51\xc6\xa5\xbe\xc2\x29\x9f\x26\x0b\xfe\x36\xe7\xd3\x82\xf9\x78\xd5\xc2\xec\x38\xf2\x15\x92\x60\xd0\x76\x40\x46\x46\xbc\x24\x3e\x84\x73\xad\xac\xfc\x40\x1b\xdf\xbe\x15\xc3\xac\x26\xaf\xf9\xf5\x4a\xed\xc5\x1d\xa1\xcd\x39\x80\x53\x58\xb5\xd4\x4b\xb8\x88\x9e\xd6\x28\xb0\x6e\x64\xfd\x0e\x69\x84\xcb\x3d\x0f\xe3\xf1\xab\x28\x6a\x5d\xd5\xd9\x84\x94\x80\xc2\xfc\x20\x1f\xd4\x9b\xb3\xee\xf6\x2f\xcd\x46\x5b\xdb\xa2\x41\x04\xe5\x22\xc0\xce\xa0\xe1\x52\x2b\x66\x6a\x6f\x8f\x93\x2c\x99\x72\x6c\xa8\x19\xef\xb7\x21\xe0\x28\x5c\x4f\x0a\x12\xa0\x77\xfa\xd7\x21\x56\x59\xf9\xfc\x19\xc8\x28\xf5\x7a\xf4\x7e\x70\xd9\x27\x1c\xc8\xef\x49\x38\xf0\x7b\xb7\x81\x92\x21\xbf\xaf\x06\x3a\xd5\x0b\xac\x23\xab\xc7\xf3\xcd\xf2\x86\xbe\x0f\x15\xf5\xb2\x29\x6a\xe8\xd4\x8e\xe0\x0c\x45\x27\xdb\x4b\x35\x7a\x2a\xb8\xbd\x91\xd6\x4e\xbe\x4b\x63\xed\x8a\x6e\x6f\xb4\x38\xa8\x77\x69\x2e\xad\x38\x83\x5b\xa7\xb0\xc5\x6f\x1c\x07\xbb\x4e\x60\x9b\xc5\xb8\xad\xa5\x55\x9e\x45\x3d\xde\x75\x4c\x7d\x7c\xcf\xe6\x36\x5b\x80\x4d\x56\x8f\x67\x5f\xd4\x6a\xbb\x96\xdb\xdb\x6d\x50\xf9\xea\xf1\x74\xc7\xe6\x1a\x1f\x6f\x3b\xa3\xbf\x34\xdb\x3b\xfb\xe2\x49\xfd\x65\x6d\xcb\x9f\xba\x70\xa3\x4d\x93\x1f\x9f\xdf\x15\x6e\xfc\xda\x6d\x60\x3d\x59\x7f\x3c\xb9\x6b\x63\xef\xba\x8d\x55\x9c\xc1\xf1\xc5\x5d\xeb\xfe\xb8\x32\x53\x3d\xcc\xc5\xf1\xd5\x3d\xc3\xd9\x12\xeb\xc8\xea\xf1\x62\xc7\xe5\xaf\x3e\xed\x2c\xf9\x65\x53\xac\xfb\x9f\xdb\xe5\x9f\xc0\xdb\x6a\x53\xee\x67\xf3\xb4\xdf\xfa\xa7\x55\x60\xdd\x77\xdf\xa0\xe0\xb7\x27\x9e\xd7\x97\xcb\x7d\x7b\x4c\x7f\x7a\xef\x88\x58\x95\xc6\x76\x2e\x85\x58\x91\xe9\xe2\x69\xbd\x93\xcc\xb6\x96\xd4\xfe\xfe\x2d\x49\x6a\x3f\x3d\x49\x6a\xff\x0a\x92\xda\x5f\x0b\x49\x6d\x72\x9b\xec\x12\xfd\xd5\x36\x59\x0c\x89\x03\xad\xa0\x40\x53\x5c\xd5\x25\x64\x86\x82\xfb\x78\xcf\xa3\xf3\x41\x3b\x50\x94\x88\x2a\x37\xca\x8b\x1f\x6a\x5e\x88\xf3\xaa\x60\x6a\x83\x90\xf0\x34\x4d\xd2\xec\x65\xf9\xa3\xbc\xf0\x67\xcc\x73\x3f\x8c\x64\x65\x78\x7c\xa2\x60\xf5\x82\xbd\x78\xf5\xfa\x40\x2a\xcc\xa7\xa4\x71\x98\x09\x94\x31\x42\x77\xb7\x82\xeb\xca\x80\x99\xf0\x83\xa8\xc2\x27\xdf\x51\x05\xa3\xfb\xa0\xe0\x30\x10\x52\xc0\x94\xfb\xe3\x4a\x70\x08\x1d\xff\x80\x12\xcf\x35\xa2\xc3\xf1\xda\xe9\x83\x99\x08\xcf\x07\x45\xc3\x45\x35\xca\xaa\xb0\xb7\xca\x13\xbc\xce\xac\x88\x88\x57\x5d\x48\x72\xdc\x2c\x5b\xf1\x73\x22\x68\x55\x51\x1c\x00\x99\x1f\x27\xf1\xd5\x34\x99\x67\xb2\x72\xd2\x95\x8c\xa2\xbf\x5d\x21\x35\xef\x48\x46\xab\x01\x96\x91\xf8\xd6\x0d\x74\xba\x76\xa0\x8d\xfe\x75\xe6\x6c\xc6\xd3\xf3\x24\x9d\x0e\x14\xb5\x60\x7a\xcb\x99\xdf\xdb\x1b\xac\xfd\xaa\xea\x48\xf5\x35\xe2\x92\xb3\x5d\xcd\x2c\x7b\x6d\x10\x7e\x6f\x4b\x4c\xcf\x0b\x81\x66\x95\x5c\xe8\x23\x27\x45\x7a\x38\xfa\x4e\x17\x81\x86\xeb\x4d\xf3\xd5\x03\x0c\x57\xbd\x69\xcf\x8b\xac\x5e\x74\x7b\x5b\x67\x5d\x75\xb2\xfa\xa7\x54\x56\x17\xeb\xaa\xa8\x8b\x5c\xde\x5a\xd5\xab\x78\x5c\x17\xbd\x6e\xc8\x7a\xc5\x31\xae\x69\x81\xb5\xc2\x1b\xac\x46\xc4\x92\x44\x71\x50\xf1\x21\x57\x6e\xe0\x24\x8e\x46\xfc\xe5\x56\xa2\x9c\x46\x35\xb2\x32\xdc\xa6\xb5\x11\x5f\xfa\xd9\x55\x1c\x48\xfc\x53\x80\xc2\xdd\x5f\x63\xfe\x21\x9c\x72\x2c\xd2\x74\x9d\xdd\x05\xe0\xa9\xe1\xc8\xbf\xf4\xc3\x5c\xca\xc9\x9a\x6a\x9f\x35\xc1\x5d\x58\xfc\x58\xf6\x8a\xef\x00\x6f\x72\xe8\x41\xf7\x8a\xc3\x1f\x68\x03\x27\xd5\x17\x1a\xd2\xe6\xed\x86\x14\x6f\x37\x2c\x2d\x43\x45\x40\xc2\xba\xe5\xca\xe8\x72\x6f\x6f\x10\x1e\xcb\xff\xaf\xf6\x0b\x52\x3a\x62\xfb\x9c\x8c\x62\x45\x45\x35\x50\xad\x30\x52\x31\xca\x46\x79\x11\x52\xae\xde\x4c\x50\xb2\x90\x0d\x43\x35\x48\xf9\x98\xc7\x80\xb3\xb2\xa1\x5c\x08\xf9\xe4\xa5\xa2\x2c\x7b\xcc\x3a\x0a\x5b\xe0\x5a\x96\x53\x18\x84\xf6\xf2\x86\x1d\xef\xe5\x66\xf9\x36\xc3\xfc\x2c\xdf\xdb\xd3\x28\xc0\x76\x12\xc6\x63\xfe\xe9\xd7\xf3\x52\x46\x37\x92\x81\x2a\xe0\x6b\xa2\x8a\x54\xc2\xcf\xd6\x0d\x4b\x6a\x3c\x6a\x08\x2b\xe5\x97\xb2\xf2\x52\xde\x93\x87\xf2\x4b\xb9\x98\x35\xbc\x78\xe9\xf9\x4d\xbc\x44\x79\xf5\x72\xc0\xd5\x52\xbc\x9b\x37\x2e\x55\x14\x30\xae\x77\x5d\xd5\x1c\x4a\x65\x78\x3e\xfa\x00\x65\xe0\xc7\x01\x8f\x5e\x45\xd1\xe0\x06\x8b\xa1\x39\xb5\xc0\xdb\xb7\x41\xc8\xdd\x3e\x6b\x1c\xdd\x5b\xbe\x5c\x2e\xd5\xf3\xd1\xa7\xc1\xd9\xd7\x14\x76\x4d\x56\x1a\x28\xed\x40\xee\xab\x85\x6e\xfd\x02\x4e\xec\x26\x15\xea\xab\x41\x51\xcf\x9a\xbc\xde\x45\x77\x20\x5d\x90\x7d\x3c\xbf\xeb\x48\xae\x56\xe6\xaa\x51\x7b\x70\xd7\xda\x17\xb7\x0f\xa0\x06\xf5\xc7\x5f\xee\xfe\x5f\x34\x75\xb9\x76\x20\x8d\x56\x66\x77\x6d\xe5\xfa\xf6\x01\xb5\xd0\xd7\xf1\xf4\xae\xad\x9d\x35\x79\xfd\x5f\x6f\x67\x79\xe7\x19\x7a\xef\xe4\x79\x18\x5f\x6c\xed\xea\x22\xd8\xd0\x59\x75\x99\xec\x0b\xc4\x70\x5a\x26\x50\x5c\x9f\x73\x1e\xde\x83\x5b\xb3\xa7\xea\xbc\xe6\x40\x83\x6f\x89\x03\x1d\x3f\x71\xa0\x7f\x05\x0e\x74\x36\x1a\xc4\xc2\x90\xa2\x22\x3d\xc4\xee\x7f\xe7\x5f\xf0\xf7\xe1\x35\x97\x55\x66\x29\xc2\x6f\x65\xa5\xcc\x41\x72\x71\x98\x8c\x79\xc3\x1d\x47\x8d\x7a\x0b\x7e\x48\x66\xc9\x51\x78\xfd\x2e\x89\xa2\x30\xbe\xf8\x25\xc9\xf1\x98\xc1\x72\x6d\x1b\x51\xb0\x8f\x99\x08\xca\x50\xea\x55\x57\xfd\x82\x76\x2e\x73\xa2\xb2\x83\x59\x27\x23\x9b\x24\x97\xfd\x9d\x2a\x7c\xc4\xd1\xe2\x75\xdc\xb6\x25\xad\xdb\x39\x8e\xef\x6c\xed\xda\xad\xbc\xea\xea\x71\x7a\xd7\xba\xe7\xdd\xba\xd7\x8f\xf6\xee\xfe\xe8\x2d\x2b\xda\xd9\xed\x20\xf8\x12\xd8\xe2\x1e\x9f\xda\xad\x25\x8d\xad\x3b\x07\x3a\x50\x7b\x53\xa4\x8d\x27\x07\x8a\xbf\x18\x68\x9b\x03\x13\x16\x14\x91\x2b\x42\x94\x2b\xfd\x1a\x47\x57\xca\x40\xfe\x0f\x6e\x41\x45\xcd\x06\x2b\xce\x15\x95\xad\xca\x0d\x30\xd5\x58\x70\xd0\x8a\xf6\x20\x6e\x4e\x98\x03\xf0\x5a\x7e\xa9\x83\xa9\x38\x01\xdf\x40\xc8\x53\x15\xe6\x70\x79\xc1\xf3\xb7\xc0\xe5\xfd\x2c\x62\x79\x96\xfe\x01\xc7\xfc\xe4\xf3\x67\xba\xcc\x9a\xb9\xc0\xec\x41\xc6\xe8\xfb\x7c\xb9\x54\x9a\x30\xe8\x3f\xc5\xb1\xff\x62\x4b\xfe\x72\xd1\x5a\x36\xfc\x2b\x5e\x09\x45\x2b\xf7\x0b\xd6\xd6\x38\x07\x2c\xda\x74\x64\x0b\x00\xdd\x47\x94\x86\x3a\xe1\x46\xf6\x23\x9e\xe6\x5a\x10\xa6\x41\xc4\xb5\xf3\x30\x8a\xe4\xe1\xff\xfa\x47\xb6\xb8\x90\x16\x21\xbf\xfc\x31\xf9\x34\x92\x75\x49\x97\x98\x29\x31\x53\x96\x20\x7f\x24\xc7\x49\xcc\x65\xe9\xd3\x34\x8a\x33\xe1\xa8\x3a\x7c\xf1\xe2\xf2\xf2\x92\x5c\x1a\x24\x49\x2f\x5e\x30\x5d\xd7\x61\x0c\xf2\x0f\xff\x98\xf9\xf9\x04\x3f\xd2\xd2\x79\xc4\x47\x32\x5f\xf0\x38\x19\x8f\x65\x29\x88\xc2\x59\x37\x6d\x3c\x92\x0f\x29\x93\xd8\x6b\x9b\x98\xae\xc4\x24\x26\x15\x3f\x28\xcb\x4c\xf8\x45\xf5\xea\x3f\xad\x48\xd0\xa8\xfe\x9e\x3a\xc4\x62\x58\x4c\x62\xd7\x53\x2a\x51\x6b\xa2\xb1\x85\xc6\x26\x6c\xc1\xae\xa7\xba\x66\x4e\x34\x76\xe4\x4c\xd8\xc2\xbe\x2e\x47\x20\xf4\x44\xf9\xeb\x24\x4a\x52\xf9\xc5\x0f\xff\x80\xee\xfe\xf0\xbf\xd4\xf6\x64\x24\xf3\x3c\x0a\x63\xfe\xb0\xf3\x81\xc3\x61\x0b\x26\x86\x04\xc3\x71\x61\x24\x38\xa4\xeb\x29\xf1\x3c\xcd\x82\xf9\x72\x56\xe7\xcb\x81\x99\xf2\x88\xe7\x49\x54\x7f\x5d\xcc\x11\xfe\x57\xfd\xa6\xac\x9e\x3b\x0a\x05\xd9\x35\x2e\x80\x1e\xc0\xf4\x32\x49\xd7\x5c\xcd\x20\x96\xab\xb9\x9a\x9b\x89\x1f\x12\xfe\x93\xe0\x45\x82\x17\xf1\x03\xd2\xb6\x9c\xdb\x3c\x0d\xfd\xf8\x22\x7a\xe0\x59\xf5\x88\x65\x50\x89\xd1\x80\x12\xcb\x84\x86\x89\xa5\x1b\x1a\x25\xb6\xed\x49\x94\x38\x06\xd5\x0c\xa2\xeb\xec\x80\x1a\xf0\x22\x99\xc4\xf3\x02\x8d\x38\x8e\x46\x89\x61\x68\x8c\xd8\x1e\x15\x3f\x0d\x62\xda\x4c\xd2\x0f\x18\x71\x0c\x17\x66\xd6\xf3\xdc\xd7\x94\x78\xb6\x2d\x51\x8f\x18\x86\xc4\x88\xc7\x5c\x89\x41\x1d\xa6\x0d\x3f\x26\xd4\x22\xba\x6d\x5c\x1f\x52\x43\xa2\xee\xea\x4e\x5d\x68\xe6\x84\x2d\xcc\xcd\xd3\x99\xa6\xc9\xa5\x36\x4e\x2e\xe3\x87\xde\xa0\xc6\x82\x9a\x84\x3a\x11\x6c\x06\x0f\x77\xc4\x81\x2d\x51\x2b\xb2\x25\x5b\xb2\x35\x5b\xa3\xc4\xa4\xf8\x38\x80\x21\x3b\x84\x3a\x47\xc6\x44\x63\x5b\x8e\x30\xe2\xe7\xf9\x83\x8e\x90\x51\x89\xd2\x7d\x9b\xb8\x46\x84\x67\x00\x46\x79\xe0\x49\x76\xa4\xe1\x00\x25\x5b\xaa\x07\x08\xa5\x24\x6a\xec\x33\xba\xd8\x7a\x80\x69\x78\x31\x79\xd8\x11\x42\x97\x27\xf5\x1a\xe2\xf1\xf6\x0e\xa8\x25\x51\x37\x82\x05\x2c\x17\x51\x12\x8b\x08\x2b\x08\x53\x62\x2c\xb6\x1d\xe2\x7c\xf6\xb0\x7b\xd4\x90\x18\x3d\x2a\x57\xd0\x43\xe8\x75\x40\x5d\xc9\x8b\xc4\xe0\x8a\x25\x2c\x86\x47\x25\x28\x79\xc4\xe8\x64\xe3\xf0\xce\x92\x28\xbf\xef\x81\x95\x1d\x86\x33\x64\x4e\xac\x85\x1b\x39\x1a\x65\x13\xcd\x3a\xda\xa2\x3b\x49\xd9\x9d\xcb\x70\x9c\x4f\x46\x32\x75\x6d\x59\x9a\x60\x64\xeb\xe2\xa5\xd5\x4f\xea\xda\x12\xa6\xee\xd6\x3b\x5d\x27\x9e\x6b\x48\xb6\x41\x6c\x2f\x32\x88\xa1\x1b\x92\x4b\x6c\xdd\x92\x98\x4e\x1c\xc3\xd6\x1c\xe2\xd9\x01\xf5\x88\xa9\x39\xc4\x34\x1d\xc9\xa4\x44\x67\xa6\x44\x09\x63\xb6\x64\xe9\x84\x52\x06\xd0\xd1\x34\x1d\x9f\xe9\x44\x77\xa8\x54\xfc\xc1\x3e\x49\x4c\x32\x88\xeb\x45\x0e\xa1\xb6\x2b\x51\x97\xd8\x0e\x0d\x0c\xe2\x59\x80\xef\x89\x41\x99\x46\x09\xf5\x60\x49\x89\xeb\x6a\x94\x12\x0b\x5a\xb6\x88\x6b\x46\x9a\xeb\x11\x9b\x19\x92\x61\x12\x53\x37\xb0\x72\x4f\x54\xee\x15\x95\x6b\x06\x71\x5d\x80\xf1\xba\x4d\x23\x0d\x72\x6c\x2a\x39\xc4\xd1\xa9\x0f\x08\x4d\x94\x81\x66\x0c\x5b\x33\x89\xad\xb3\x03\xe2\xda\x8e\x64\x5a\xc4\x36\xed\xba\x88\x84\x79\xa2\xa0\x75\xe0\x50\xe2\x58\x86\xe4\x41\xd1\x46\x19\x91\x2b\x8a\x1e\x78\x8c\x50\x53\x32\x75\x62\x5b\xcc\x67\xc4\x74\x5d\x49\x3c\xa1\xac\x0e\x43\xa2\x0e\x71\x59\xa0\x19\x84\x9a\xf0\x91\xee\xc0\xd8\xa8\x03\xbd\xd3\x98\x41\x3c\xe8\xb6\x4e\x2c\xcf\x67\xc4\x02\x84\x25\xbe\x94\x28\x81\xde\xb8\x8e\x1b\x50\x46\x5c\x4f\x63\xc4\xd3\x6d\x98\x1c\x4b\xb7\x35\x9b\x58\x9e\x0b\x93\xe3\x51\x13\xaa\x33\xa8\x1b\x59\x44\xa7\xa6\x44\x0d\xa2\xdb\xd0\x11\x0f\x2a\x83\x67\xd9\x11\xdd\x24\x8e\x27\xfa\x61\xd6\xfd\xb0\xdd\xba\x23\xee\x16\x1d\x61\xae\x06\xdd\x61\xd0\x13\x93\x19\xd0\x13\x9b\xe1\x32\x59\x50\x1f\xb3\xae\x9b\x60\xe2\x2c\xf9\xa4\xa1\x7d\xdb\x23\xa0\x40\x3d\xc9\xd8\xb7\x7c\x20\x8a\xc4\x8c\x30\x89\x2d\xa8\x59\x27\x00\xa5\x35\x69\x27\x68\xec\xa8\xf5\x05\x10\x6a\x9a\x27\x51\x33\xd2\x2c\xcd\x6a\xe0\x07\xa0\x5d\x11\xce\x3a\x80\x2a\x1d\x04\xb3\x9e\xe4\x46\x9a\x27\x79\x1b\x61\x29\x4c\xd2\xa3\xa0\x49\x3d\xc9\x5a\x50\x73\xdf\x3a\xb2\x26\xd4\x04\xba\x85\xed\x5b\x01\x6c\x61\x9c\x2d\xe2\x15\x53\x16\xe0\x9e\x20\x1e\x92\xa6\x30\x65\x01\x16\x91\x98\x06\x69\x30\x67\x01\x6e\x7c\x0d\xbe\xc0\x49\xdb\x08\xdf\x3e\x15\xe3\xde\x3c\xae\x12\x02\xc2\x8c\x94\x00\xb0\x3b\x3b\x3d\xb3\xd7\x98\x8e\x4e\x37\x7a\xa7\x48\x00\x6b\xc2\x74\x9b\x38\x96\xe9\x33\xe2\xc0\x89\x70\xca\xc3\xc4\x88\x49\x81\x3a\xa4\x08\x2f\x2d\xa2\x5b\xec\x15\xc0\x0a\x89\x56\x65\x24\x40\x37\x36\xb3\x16\x1e\xf1\x74\xd6\xad\x01\xb6\x8e\x67\xc3\x01\x35\xdd\xc8\x25\x0c\x00\x03\x63\xf6\x4a\x31\xa0\x5f\x5d\x49\xc7\x22\x1a\x16\x79\xb5\x52\xc4\x90\xa8\x4d\x2c\xe6\x1c\x61\x7b\x7e\xa7\x1f\x1a\x74\x51\xa3\xc4\x72\x8c\x83\x7a\x44\xd7\x53\x0d\x8a\x00\xec\x36\x4c\xd7\x87\x73\x2b\xe1\xa3\x80\x70\x44\xf7\x6c\x6c\x16\xc8\x40\xe2\x59\xf6\x01\x80\x76\x1d\xc0\x96\x41\x0c\xd3\x90\x6c\xa2\x5b\xd0\x73\xaa\x03\x65\xe8\x59\xf6\xf5\x21\x40\x0c\x07\x20\xd1\xc2\x23\x8c\x06\xba\x04\x84\x31\x61\x36\x00\x7d\x97\x00\xc8\x07\x04\x11\xb9\x44\x77\x24\x93\x50\xc3\x38\xa2\x94\x98\x8e\x79\x50\x7d\x78\x3d\xa5\x3a\xf6\xc4\x24\xa6\x65\x61\x49\x0d\x4b\x76\x3a\xa8\x4b\xc4\x76\x11\xb4\x1a\x0b\x0d\x1a\x8b\x34\x17\x06\x6c\x12\x6a\x39\x0b\x00\xcf\xd7\xbd\xbb\xbc\xb1\xe3\xd2\xc4\x1f\x07\x7e\x76\xef\x58\x7e\x27\x02\x54\xa2\xcc\xf7\x88\xe7\x58\x92\x78\x8a\xc9\x37\x08\x73\x00\xc3\x1a\x9e\x1b\xe1\xf2\xc0\x66\x71\x99\xef\x10\xcf\x05\xac\x01\xcf\x62\x16\x98\x2d\x51\x46\x74\xcb\x3b\xb0\x10\x21\x50\x8f\xd8\xee\x2b\x8f\x78\xae\x84\x8f\x12\xef\x52\xe0\x9f\x6d\xe2\x30\xbb\xa8\x57\xbb\xad\x62\xaa\xd5\x15\x47\x94\x30\x20\x7d\x89\x65\x74\x2b\xd6\x05\xab\xb9\x32\x02\x5d\x6b\x8c\xe0\xfa\x10\x6a\x42\x78\xe0\x58\x1e\x71\x90\xce\x36\x90\x26\xf3\x6c\xd8\xd2\xa6\xe1\xe1\x28\x91\x54\x73\x7d\x03\xd8\x55\x7c\x14\x43\xa4\xb8\xd7\x8c\x03\x97\x50\xcb\x83\x9d\x6e\xd3\x57\x16\xe2\x2a\xf1\x2c\x8e\x9a\x18\xa2\x4e\x74\xa3\xac\x54\x5b\x5b\x2b\xd5\xca\x5a\x71\x74\xac\x18\x5d\xb7\x56\x20\xa3\x60\x7c\x90\x62\x49\xe2\x59\xe2\xd2\xaa\xef\xd7\x87\x00\xfa\x99\x00\x89\x3a\x60\x46\x21\xe1\x60\xe2\x5d\x40\x45\x4c\xd4\x98\x20\x07\x74\x91\x20\x20\xa3\x56\x94\x02\xf0\x8a\x89\xd2\x66\x60\x39\xbf\x78\xd0\x4d\xab\x4b\xc0\xdc\x12\x97\xf6\x4e\x8c\xcb\x70\x76\x0e\x28\x9c\x71\x58\x66\x0b\x09\xf3\x48\x63\x00\x3b\xe0\xf1\x9a\x32\xe2\xd9\x00\x34\x71\x8f\x99\x9e\x64\x49\x94\x49\x56\xa0\xc1\x6f\x80\x57\x36\xd1\x05\x5f\x42\xa8\x73\xe0\x42\x2d\x86\x24\xaa\x8b\x28\xb1\x61\x66\x6d\xe3\xb5\x43\x5c\x57\xb2\x89\x05\xa0\x83\xd9\xf0\x60\x40\xdf\x53\xc9\xdd\x37\x17\x6c\xc2\x88\x0e\x9c\xbd\x6e\x01\x33\x4f\x74\x8f\xd8\x36\xfc\x91\xe8\x82\x8a\xfc\x05\x42\x28\xc3\x04\xb2\xc8\x76\x30\xab\xf8\xd0\xa5\x01\x10\x4b\x00\x43\x3d\x60\xf3\x1d\x09\x40\x3c\x90\x0f\x19\x00\x18\x8d\x12\x46\x31\x41\x33\xf6\x99\x0e\x5c\xbe\x86\xad\x11\xdd\xd2\x88\x61\x10\xdd\xd3\x88\x6d\xc3\x1f\xba\xd0\xe8\x84\x89\x12\x0b\x8d\x06\xba\x46\x0c\x53\x23\xba\xa9\x11\xdb\xd1\xb0\xc4\x3e\xd3\x8f\xdc\xeb\xa9\x66\xc3\xac\x9a\x50\xd4\xac\x44\x06\xd5\xeb\x86\x1d\x11\xf8\x11\x8f\xc7\x7e\xfa\xa0\xb4\x83\x2d\x59\x13\x7a\xc4\x26\x1a\x5d\x18\xd7\x87\x8e\x78\xdb\x77\xe0\xc5\x94\xa8\x07\x93\x6d\x11\x0b\x70\x8b\x44\x81\x64\x00\x8e\x9b\xe8\x0c\x0e\xa3\x05\xa4\xf9\x91\xb3\x6f\x2e\x28\xbb\x3e\xa4\xae\x64\x2c\x8c\x89\x66\x1c\x19\xfb\xde\xc2\xd8\xb7\x8f\x8c\x7d\xeb\xb5\x29\x19\x92\x21\xc1\xd3\x2a\x28\x10\x04\x6c\x25\xfd\x81\xe7\x8c\xd6\xc4\x87\x46\xc5\xf9\x9a\x68\x74\xed\xec\xed\x3e\x46\x18\x48\xb5\x9e\x40\x0a\x1a\x92\xde\xfb\xbe\xef\xb6\x5f\x2d\x78\xa5\x4c\x33\xb6\xfa\xfa\xc1\x6a\x3b\x72\x5b\x85\x37\xbd\x62\x4d\x9b\x88\x5b\x61\xb7\xf4\xe8\xe4\xd0\x95\x5c\xd5\x69\xcb\x55\x9b\x72\x68\xa7\x21\x87\x36\x2a\x39\xb4\x05\x2c\x16\x8a\x51\x00\xb2\x51\x07\x92\xa9\x01\x50\x0a\x41\x15\x30\x76\x05\xd4\x43\x66\x0a\xb2\x1d\x91\x85\x0f\x51\x5e\xe4\x60\x29\x07\x3e\x11\x9f\x62\x2d\x90\x5d\xd4\xb0\xe3\xe4\x7e\x2d\x1e\x42\xec\x7d\xc2\x6c\x5b\x72\x89\x55\x50\x82\x8e\x6d\x4b\x1e\x71\x0c\x13\xd2\xf0\x9f\x78\x2b\xb2\x28\xc3\xb4\xe2\xb3\x22\x0b\x01\x00\xce\x16\x33\xcc\x88\x61\x96\x78\x52\x48\xd1\xf0\x79\x20\xb2\xb1\xa0\x55\x57\x5b\xb5\x7f\x7d\xf7\x35\x04\x88\x04\x34\x09\x62\x28\x14\x6e\xa2\xac\x3b\x13\x02\xb2\x52\xfe\xed\x49\x85\x5c\x5c\xc8\x3f\x5d\x6d\xb3\x28\xbc\x58\x8f\x59\xe4\x87\x0f\x2c\xbd\xf5\x60\x5e\x50\xa6\x67\x15\x08\x56\xec\x39\x48\x95\x2c\xc9\x12\x3f\xaa\x1d\x6a\x49\xa2\xa4\x48\xf5\xea\x3d\x2d\x92\xa9\xf8\x4f\xfc\xae\x76\xa9\x28\xbe\xed\xa4\x64\xff\x33\xf7\xd3\x47\x00\x01\x2c\xc9\x68\xb0\xac\x92\x60\x63\x2b\xae\xb6\x60\x61\xa5\x26\xe7\x5b\xf0\xb1\x25\x5b\x2b\xf8\x60\x4d\xd0\x9b\x30\x21\xe6\x01\xad\x8e\x7c\xe3\x08\xbb\x35\xfd\xd3\x38\xf4\x05\x10\x28\xb3\x6b\x10\x21\x4a\x96\x30\xa4\x5e\x80\x02\xcc\xec\x38\xcd\x8f\x50\x9e\x00\x33\x7f\x1f\xd2\x84\x7d\xeb\x7a\xea\x21\x34\xb0\x1e\x01\x34\xda\x48\x9b\xc1\xaa\x74\x84\xb7\x0d\xd1\x05\xfc\x6e\x8b\x6e\xa1\xf6\x9d\x81\x73\x21\xe2\x66\xb0\x57\x74\xc9\x91\xc4\xa6\x81\xfd\x53\x08\x1b\xa8\x54\x6c\x44\xe0\x56\xaa\x4c\x6a\x56\x1b\x51\x24\x9a\xf8\x1f\xab\x37\xea\x75\x7b\x8b\xa5\x3c\x7f\x78\xd5\x14\xc0\xf4\x08\x60\x98\xa5\x59\xfb\xdb\x1c\x0c\xe8\xf5\x03\xab\x2a\x1c\x89\x9a\x91\xa5\x61\xaf\xb7\xe9\x33\xca\x4c\x1f\x1b\xd1\xf4\xe5\xca\x7b\x0d\x8e\xcf\xbd\x0a\x4d\x5b\x33\xf4\x28\xa0\xdd\x5d\x27\xe9\x8b\xa9\x92\xa9\x59\x4d\x29\x20\x8e\xc8\x94\x4c\xc9\xd1\x9c\x4a\x3f\xcb\x0e\x28\x12\x97\xd4\x01\x36\xdc\xf2\xe0\xb1\x05\x2d\x83\x13\xfc\xf0\xa4\x0c\x0a\x7d\xa8\x73\x60\xa2\x0a\x96\x45\x38\x22\x01\xef\x90\x2a\x61\x54\x72\xa2\x86\x2e\xba\x28\xbf\xcd\xf8\x16\x69\x12\x3f\x3c\x38\xa3\xb6\x00\xb7\xb0\xfd\x99\x58\x27\xc9\x11\xfc\x02\x50\x64\x00\xec\x56\x34\xee\x5b\x8f\xee\xc1\xb5\xec\xd4\x22\x8e\x6e\xc1\x9a\xb8\xae\x15\x69\x26\xf0\xfd\x26\x0c\xac\xfa\x55\x8f\x6a\x55\xf1\xbe\xf5\x38\x1f\x5e\xd9\xee\x12\xe6\x59\xa8\x72\xb4\x22\x18\x9b\x84\x63\xab\x7e\xd5\x9a\x68\x69\x45\xf5\xbe\xf5\x28\x1f\x1a\x89\x61\x87\x85\x2e\x40\x9c\x42\xdc\xba\xd4\x46\x49\x29\x8c\xb2\x52\xbc\x1f\x14\x65\x37\x0f\x2d\x4a\x1e\x85\x76\x50\x40\x6f\xab\x00\xde\x56\x09\xbb\xad\x0e\xe8\xb6\x1a\x90\xbb\xc2\x6e\x26\x61\x48\x12\x0a\x38\x7b\xe4\x4c\x28\xb1\x16\x16\x61\xb0\x0f\x24\x46\x1c\x8d\xb8\x12\x45\xa5\xc4\x36\x73\xf1\x28\x90\x99\x30\x1b\x7b\x24\x16\x68\x53\x62\x69\xd4\xd8\xa7\x74\x61\x47\x16\x61\x96\x64\x10\x00\x2b\x28\x8a\x35\x60\x51\x34\x46\x6c\xe7\x68\x23\xcc\xc7\xf9\xdd\x59\xd3\xe8\xd6\xd4\xba\xdb\x21\xd6\x5d\xc9\x6d\xd2\xe1\xa6\xa4\xbf\xa6\xa4\xd0\x49\xe0\x5f\x33\x83\xbf\xa6\xf8\xbf\x86\xbf\x35\xfc\xab\xc1\x5f\xf3\x7a\xaa\x4b\x34\xa0\xc4\xb6\x25\x5d\x32\x50\x19\x27\x19\x92\xf1\xde\x82\x14\x07\xd0\xb8\x04\x84\x3b\xb0\x24\x58\x95\x61\x6a\x86\x64\x68\xc6\xf5\x14\xa5\xa6\x0b\x46\x18\x8b\x08\xe0\x3b\x83\x58\xc4\x22\x86\x49\x0c\x97\x38\x4c\xc3\x7f\x86\x2b\xe4\xcd\xe2\xdf\x11\x23\xba\x90\x87\xb6\x77\xdc\x7c\xac\x9d\xfb\xe1\xfd\x9f\x3e\x01\xfc\x91\x99\x70\xed\x03\x6a\x13\x13\xb9\x8b\x08\x46\x00\xff\x3f\xa0\x16\xda\x10\x60\x12\xfc\x5f\x32\x0e\x1c\x28\x2b\x31\x3d\x62\xc4\xf3\x3c\xcd\xd0\x18\xac\x32\x13\x1a\x4d\x13\x65\xef\x50\x4b\xad\x02\x85\xb9\x38\x74\x89\x6e\x03\x90\xf5\x90\x75\xb4\x60\x7e\x6d\x97\xc1\x4e\x32\xe0\x63\x0b\xa6\xd0\x35\x1c\x8d\x11\x1d\x6a\x27\x8e\x0e\x07\x1c\xc0\x15\x9a\x39\xa0\x55\x86\x4b\x81\x9d\xb4\xcd\x08\xb8\x3d\xa2\xdb\x4e\xc0\x88\x89\xaa\x52\xc9\x20\xae\x8b\x6d\xa2\x81\x91\x64\x11\xdd\xb0\x35\x62\x9a\xf8\xb1\xc7\xb0\x5a\x43\x32\x89\xe1\x50\xcd\x22\xae\x63\x8b\xdf\x0b\x8d\x05\x16\xd1\xd1\x0c\xd1\x24\xae\xed\x6a\x16\xd4\x88\x26\x13\xd4\x62\x84\x99\xf0\x29\x43\xdb\x43\xe6\x00\x2a\xb4\x19\xec\x7a\x66\x3b\x9a\x49\x3c\x0f\x06\xeb\xb8\x9e\x26\xac\x11\x1d\xcb\x21\x96\x6d\xc2\x66\x77\x98\xc4\x08\xb5\x71\x98\xcc\x83\xa5\x86\xa1\xd9\xa8\x7d\x30\x2d\xcd\x20\xa6\xc9\x88\x61\x33\x8d\xb8\x86\x0d\x83\xd5\x88\xc5\x50\xf7\xe2\x99\x1a\x61\x0c\xfa\xed\x32\x43\xa3\x44\x77\x3d\xe2\xe1\xac\x7a\x3a\x95\x18\xd1\x29\xcc\x38\x85\x63\x4b\x3c\xd7\xd1\x08\xd5\x29\x31\x3c\x4b\x43\x3b\x1b\x8a\xf6\x25\xb0\xb3\x19\x65\xc4\x64\x2e\x5a\x40\x42\x2a\x20\x6c\x18\xb5\xa9\xc3\x1e\xb6\x17\x0c\x4e\x39\xa5\x8e\xa4\x6b\x16\xb1\x61\x2b\x7a\xb6\x66\x13\xd3\x44\xdb\x11\xc7\xd4\x88\x6d\x31\xe8\x3e\x25\xd4\x70\xa0\xc7\x96\x03\x07\xc6\x65\x9a\x45\x28\x75\x35\x62\x99\x30\x3c\x07\x96\x82\xc2\x9c\x78\x90\x6f\x78\x54\x03\xc6\xdb\xf1\x4d\xe2\x02\x01\xe1\x7a\x95\xca\xd4\x86\x99\x72\x36\x43\x80\x64\xcc\x1f\x94\x98\x25\x26\xea\x30\x81\x9a\x45\x52\x9d\xa0\x39\xd2\x81\xdb\x31\x3b\x84\x8d\x7e\x3d\xb5\x08\x93\xf4\xb2\x4c\xf9\xef\x80\xda\x92\x1d\x21\x3d\x28\x21\x0d\x81\x65\x37\x8e\x3b\xce\x92\x88\x7f\x0d\x39\x84\x28\x32\xfc\x14\x85\xf1\xc7\xbe\x82\xd4\xf3\xbc\x17\x98\x2b\xff\xf0\x8f\x31\x3f\xcf\x8a\x69\x0b\xc7\x23\xf9\x4c\xcc\x8a\x2e\xe9\x13\x87\x2d\x98\xb7\xaf\x5f\x57\x9a\x19\x81\x95\x89\x6d\xe3\xd2\x1b\x46\x65\x87\x83\x7a\x9f\x23\xca\xea\x04\x94\xd7\x19\xed\x42\x28\xb1\x33\xba\x1f\x6a\x6c\xe2\x11\xc3\x30\x01\x80\x1a\x86\x29\x99\xfb\x06\xb4\xe0\x53\x89\x96\x2a\x4c\x89\x2e\x2c\xc8\xab\xd3\x50\x65\xe5\x12\xdb\xb6\x9b\x69\x1a\x3d\xb2\xb1\xfa\xc6\xb7\x1a\xbd\x3e\xb4\x88\x61\x49\x36\xd4\x1a\xc1\x96\x05\xc2\xcf\x70\x6d\xe2\x99\xc4\xb3\x0c\x8d\xd8\xa6\x41\x6c\x03\x77\xbf\x87\xe7\x06\x8e\x17\x1c\x4c\x0f\x8d\x31\x5c\x20\x87\x0d\xf1\x30\xf0\xc9\x88\x67\x62\xb6\x89\x28\x94\xea\x0b\x9c\x8e\x7d\xf7\x88\xea\x13\xf3\xfa\x10\xc7\x28\xe1\x44\xf9\xf0\xc0\x19\xd3\xa5\x52\xf2\x63\x18\x46\x23\xb5\x54\xd3\x1a\x86\x71\x3d\x65\x92\xfe\xb5\xbf\x90\x71\x99\x39\x2c\xaa\xb8\xd2\x5c\xfa\x34\x92\x01\x08\xfc\x4d\x96\xae\x46\xb2\x66\x13\xef\x6f\x15\xa2\xa5\xba\x45\xec\xbf\x35\xf6\x24\x73\xf0\x5d\x7c\xf9\xaf\x38\xcc\xb3\x91\x2c\x5c\xbc\x7e\x4c\xe6\xf1\x38\x8c\x2f\x7e\x4c\x3e\x89\x26\x7c\xf9\x87\x7f\x9c\xf3\xc3\x24\x9d\x4d\x92\x28\xb9\xb8\x92\x52\x7f\x1c\xce\xb3\x91\x4c\x65\x29\x8c\x47\xf2\xfb\x64\x9e\x06\xfc\x55\x34\x9b\xf8\xb2\x94\xf2\x6c\x1e\xe5\x23\x39\x9b\xf8\xe3\xe4\xf2\xfd\x0c\x1d\x7d\xe6\x39\x4f\x29\x76\x94\xff\x7a\x7e\x9e\xf1\x5c\x1a\x5f\x8d\x64\x4b\x7c\xde\x53\xb2\x53\x8b\xf8\xa6\x59\xcb\x7f\xfb\xf3\x2c\x0b\xfd\xf8\xc7\x68\x9e\x4a\x59\x3e\x7e\xc3\x17\x21\xc6\xba\x1a\xc9\xa4\x55\x6d\xeb\xd3\x4e\xb5\xf0\x71\xb3\x52\x3c\xd8\x87\x7e\x9e\x86\x9f\x24\xf4\x04\xc9\xc4\x71\xdd\xf8\x7f\x42\x99\xa4\x37\x5b\x6d\xd7\xfc\x42\x4c\xf2\x0f\xff\x48\x79\x90\xe3\x8c\x06\x32\xac\x95\x8e\xeb\xa4\x57\x6b\xe4\xb0\x86\xd9\x95\x27\x4b\xe9\xa7\x91\xcc\xb0\x02\x71\xb4\x2f\xa4\x3c\xf5\xe3\xec\x3c\x49\xa7\x23\x19\x7f\x46\x7e\xce\x07\x9a\x27\x69\x8e\xd2\x06\xb0\x3d\x70\xf3\x87\x7f\xcc\x33\x5e\x14\xfa\x2f\x5d\xd7\xcb\xb5\x1f\xc9\xf3\x34\x1a\xfc\x97\xaf\xc8\x12\x42\x92\xe1\x24\xe5\xe7\x23\xf9\xbf\xce\xa0\xe5\xc6\x27\x3f\xff\xfc\x73\x5f\x89\xa9\x9f\x7d\xc4\x31\x8d\xcb\x1e\xfc\xd7\xf9\xf9\x79\xd1\x5a\xab\x78\x80\x43\x81\xf2\xc5\x4c\x64\x79\x9a\x7c\xe4\x23\xf9\xbf\x7e\xfc\xf1\xb5\xf9\x86\xe2\x9c\xc0\xea\x5d\x89\x3f\xe5\xac\xd0\xc6\xac\xb8\x8d\x59\xb9\x90\xa0\xae\xa2\xfb\x63\x45\x5e\x3b\x41\x68\xcb\x00\xf9\x55\x5f\xcf\x37\xf5\x95\x37\xfa\xda\x33\x6d\xe5\xdc\xc6\x49\x7c\xcd\xd3\x44\xee\xf9\xb8\xd5\xbb\xf3\x6a\x79\xfe\xcb\x70\x8c\x57\x26\x6b\x12\x72\x00\xa1\xa9\xbd\xa0\x76\x17\x42\x77\x33\x5e\x5c\x74\xfe\x95\x84\x66\x32\xbb\xd2\xc4\xd5\xfc\x0f\x6c\x32\x4e\x80\x34\x7c\x4d\x0d\xc0\xc4\xc4\x45\x69\xb7\x01\x10\x9e\x4a\x34\x00\xa8\x25\xcc\xfb\x88\x6b\x02\x98\x02\xc4\x62\xae\x2a\x2d\xec\x9d\x95\x16\x13\xa0\x88\xdc\xeb\x43\x4f\xa2\xc6\xbe\xbd\x60\x13\x03\xbd\x7e\x34\x43\xb2\x27\xd6\x42\x63\x90\x76\x7d\x68\x4b\xde\x82\x4d\xec\x23\x6f\xdf\xbe\x9e\x5a\x9a\x1d\x10\xcb\x42\x38\x4b\x4c\x34\x9d\xc8\x34\xfc\x01\x48\x4a\xa3\xf0\x1b\x50\x8e\x84\x7f\x25\x44\x3e\xa6\xc4\xe8\x91\x35\x61\x0b\x4a\x74\xdd\x99\x50\x1d\x5f\x2c\xe2\x79\x68\x12\xa3\x1b\x47\xd4\xd9\xa7\xee\xc2\xdc\x37\xaf\xa7\xc8\x99\x69\xc6\x42\x33\xf6\x99\x81\x96\x02\x0e\xd1\xe9\x42\x33\x90\xc1\x37\x23\x34\x98\xda\xec\xb0\x82\x4b\x9b\x89\xf8\x53\x0f\xbb\xb6\x66\xb1\xb6\x66\xb5\xb6\x86\x58\x5b\xb6\x6e\x6d\x7b\xcc\x5b\x6d\xa2\x33\xeb\x8b\xd7\x97\x32\xc9\xd8\x75\xd5\x4a\xe9\xb8\xa9\x99\x1d\xe9\xb8\x45\xa8\x13\xd9\xc4\xf2\xd0\xe0\xfb\x80\xba\x12\xd5\xa3\x6d\x9c\xb2\xc6\x7e\xee\x9f\xf9\xd9\x83\xd2\xba\x94\x12\xcb\x01\xda\xdc\x64\xc2\xec\xdc\x12\x0c\x81\x43\x4d\x62\x9b\x4c\xfc\x82\x01\x33\xe0\x94\x89\x83\xbc\x99\x85\x9c\x80\xc9\x3c\xa9\xce\xf6\x90\xdf\x87\x42\x90\x66\x21\x0d\x55\xfc\xc4\xec\xf7\xd4\x24\x0e\x96\x32\x0d\x09\x5b\xc5\x9f\xc0\x5c\x3b\x84\x9a\xec\xb5\x4d\x5c\xc8\xd1\x45\x7f\x24\x8f\x30\xd7\x96\x0c\xc9\x81\x16\x8e\x4c\xe2\x5a\xce\x6b\x43\x32\x30\x55\x14\x65\x52\xd1\x79\x16\x88\xaa\x75\xc9\x45\xc6\x8b\x62\x21\xb7\x60\xc2\x5c\xcb\x59\xe0\x13\xb7\x8b\xe5\x30\xcd\x10\x9f\x43\x9a\xd6\x28\x05\x5d\xc1\x0e\x97\x5d\xb1\x8b\x2e\x50\x0b\x1e\x38\x45\x47\xd8\xbf\x40\xd7\x60\xa2\x88\x6e\x39\x1a\x31\x08\x05\x06\x0f\xf8\x39\xdd\x64\x1a\xb0\xaf\xb0\xe5\x28\xfc\x71\xa8\x46\x98\xc3\x5e\x9b\x84\xc1\x94\x51\xe4\x6d\x05\xff\x4c\xab\xee\x53\x16\x18\xc4\x73\x6d\x49\x47\x03\x5b\xa0\x34\xa9\x29\xb9\xf0\x21\x30\x7a\xa6\x41\x74\x87\x8a\x6a\x99\x5b\xd6\x0b\xb9\x44\x77\x20\x9f\x41\x07\x44\x37\xa0\x17\x38\x58\xb7\x18\x2c\xdd\x34\x58\xb3\x18\x2c\x63\x92\x81\x1e\x24\xd4\x84\xc1\x7a\xd0\xee\x42\x2b\xe6\x4d\x23\xcc\x2c\x87\xe9\xda\xc4\xd0\x60\x96\x88\x87\xbb\x80\x31\x60\xf2\x18\xee\x0b\x6a\x1a\xd8\x6f\x5a\xfc\xde\x30\x2c\x18\x0a\xc3\xae\x9b\x0e\x23\x06\x54\x2a\x56\xea\x35\xd3\xf1\xfb\xa2\x3f\xd4\x26\xd8\x41\xb1\x6b\xd8\x46\x73\xa6\x31\x8f\xfc\xab\xaf\x22\x29\x61\x12\x75\x89\x63\xbd\xb2\x89\x03\xec\x43\x6d\x28\x8e\x96\xcd\x94\xed\x33\xea\x7b\x92\x27\xb8\x11\xcd\xd3\xbc\x05\x23\xcc\xf2\xbb\xc5\x75\xb4\x4e\xba\xdd\xe6\x4d\x98\x71\x96\xae\x2d\x9e\x8b\xc6\x99\xae\x4b\x2c\x66\xfa\x36\xb1\x1d\xa0\x45\xe0\x59\xd8\x8f\x1b\x0c\xd8\x4c\x5d\xb7\x22\xd8\x16\xae\x46\x5c\x9b\x05\x84\xba\xc4\x34\x18\x31\x98\x45\x5c\xf8\x69\xa3\xf4\xca\x40\xc3\x72\x28\xc5\x88\xad\xd3\x48\xa3\xc4\xa3\xb0\x96\xd4\x71\xa0\xaf\x8e\x23\x89\x67\x51\xb7\xcd\x4c\x0d\x96\x25\xa2\xc4\x41\xb8\x07\x55\x1b\x3a\xf0\x50\xb0\x97\x4d\xe2\x08\xb5\x0f\xec\x45\xac\xda\x45\x09\x85\x89\x35\x9b\x68\x0b\xea\x50\xac\xd8\x90\xc4\xb3\xa8\x18\xf6\x24\xd4\x1e\x61\xd3\xa2\x1b\x01\x31\x75\x83\x30\xd3\x21\x8e\x6b\x11\x8b\xd9\xa2\x5e\xe2\x1a\x08\x83\x05\x27\xed\x18\x11\x8e\x50\xc2\xc1\xc2\x7c\xe0\x74\xd4\xfe\x3c\x3a\x0a\x5a\x98\x1d\xc1\x7c\x89\x99\x0b\x88\x69\x1b\x04\xd0\x29\x7a\xc0\x38\x62\x2a\x60\x52\x90\xcf\x74\x2d\xe1\x32\xc4\x60\xa2\x0d\x18\xa6\x6d\xd1\x23\x97\x30\x6b\xa2\x51\x62\x2d\x4c\xe2\xba\x76\x04\x7c\x1e\x6c\x6e\xe2\xa2\x44\x88\x6d\xd6\x0a\x8c\x79\x7c\xa5\xf9\xd1\xfd\xab\x3d\x0a\xd6\xdb\x33\x1d\xc9\x81\xd9\x70\x4d\xe2\x3a\x16\x0a\xd4\x00\xb4\x5a\x13\x8d\x11\x66\xba\x51\x65\x95\x3f\x21\x1e\x6c\x23\x62\xe9\x8c\x98\x9e\x0d\x3b\xc2\x45\x4f\x3c\xca\x22\xcd\x22\xba\x65\x68\xd6\xf5\x94\x12\x9d\x4a\x1e\xd1\x61\x5f\x10\xd7\xc5\x7f\x42\xa8\x04\xb3\x6a\x56\xed\x40\x9a\x46\x3c\xcf\x03\xfa\x88\x18\x8e\x83\x4f\x1b\x96\x9c\xa1\xcc\xd7\xda\xb7\x17\xd8\xac\x79\x9b\x22\x73\x77\xd3\x66\x26\x14\xb0\xb0\x37\x0c\x34\x1e\x73\x34\x94\xf6\x6b\x54\x7f\x2f\x0c\xcd\x1a\x96\x66\xab\xa6\x66\x85\xad\xd9\xf5\xa1\x4d\x3c\x0b\xc5\x89\xc6\x2b\x97\x50\x66\x49\xe2\x59\x88\x12\x5c\x62\x38\x12\x75\x88\x6e\x9a\x07\x75\xc9\xeb\x43\x78\x4a\x98\xb0\xf2\x95\x5e\x94\x17\x1f\xc3\x36\x72\x98\x5d\x3c\x89\xae\xdb\x62\x53\x8a\x29\x85\x77\x0d\x13\x18\xa1\x86\x27\x9e\x13\x8d\xe8\x94\x36\x66\x70\x02\xef\x07\x55\x93\x1b\xed\x58\xc4\x66\x2b\x83\x4b\x3f\xa8\x01\xfa\x1f\xbe\x4a\x62\xbe\xf1\xd1\xd9\xd3\x6b\xce\x86\x87\xeb\xea\xdc\x69\x5d\x0f\xf0\x00\xba\x12\x15\x27\x10\x9a\xc2\xa3\x61\xa0\xda\xc3\xb0\xeb\xd5\x35\xf7\xed\x85\x56\x1c\x07\x1d\x55\xac\x26\xc3\xc7\xf5\xd4\x25\x06\x43\xfd\x81\x17\x11\x97\x51\xe2\x02\xd9\xeb\x69\xc4\x65\x13\x84\x42\x1b\xd1\x5d\x11\x94\xf7\x11\x68\xe6\xee\x60\x7c\x02\x48\xb4\x47\xef\x24\xfc\x15\x60\x75\x20\xc9\x42\x59\x9c\x66\x12\xef\x80\xda\xc4\xc3\x15\xa1\xaf\x1c\xe2\xe9\x4c\x12\xcf\x62\x63\x30\x89\xe9\xd7\x53\x9b\x60\x2c\x01\x7a\xe0\x10\xd4\xd0\x78\xfd\x45\xcd\x40\x34\xdb\x50\x6c\x09\xdd\x10\x50\xb1\x40\xc5\x58\x16\x4a\x02\x25\x93\x6c\x34\x79\x19\x27\x41\xf6\x55\x20\xbd\x2b\x51\x3a\x61\x0b\x8f\x00\xdb\x03\x74\xb8\x56\x90\xde\xd0\x37\x98\x17\xc0\x53\x66\xa0\x21\x89\x0e\x93\x66\x61\x01\xad\x28\xb0\xd0\x28\xd0\xcf\x4c\x10\x78\xf8\x64\x12\x6a\x3e\xf7\xa9\xb1\x60\xfb\xd6\x82\xda\x13\xf4\xd4\xba\x3e\x74\x24\xea\x4e\x3c\xe0\x77\x1d\xe1\xe6\x60\xdc\xf2\x66\x1e\x01\x6f\xcc\xf6\x9d\xeb\x29\xc5\xf3\x7e\x44\x27\xf6\xc2\x46\xa4\x79\x84\x34\x33\x1c\x47\x27\x42\x76\xca\x20\x16\x2c\xe3\xfe\x66\xcb\x8f\x71\x72\x9b\xd7\xd7\x36\x53\x27\xac\x8e\xa4\xe0\xd3\x48\xa6\x4c\x96\x82\x2b\xf1\x37\xc5\x3f\xcd\x86\x2e\xe3\x28\xf1\x1f\xf6\xf4\x78\x92\x37\xd1\x4c\xf4\xa5\xb0\xf7\xad\xc8\x91\x1c\xc9\xd1\x9c\xeb\x43\x4b\xa2\xee\x02\x38\xdb\x85\xb0\xa8\x04\xe6\x77\xc2\x16\x9a\xb9\x6f\x2c\xcc\xeb\x29\xb5\x85\x7f\x00\x46\xae\xd8\x28\x03\xe0\xe3\xf0\xeb\xf8\xcb\x3b\x84\x01\x91\x6a\xa3\x27\x1c\xd2\xa1\x06\x33\xfd\x52\xe7\x04\xcf\x5a\xde\x6c\x1a\x68\x07\x64\xa3\x6c\x9d\x51\xc0\x81\xc0\x33\xe9\x14\xcb\x0b\xb2\xc2\x6a\x94\xb6\x25\x1d\x9d\xc4\x90\x86\x31\x98\x73\x50\xb7\x76\x7f\x34\x05\x4c\x33\x71\x2d\x73\xa1\x19\xa5\xc7\xa4\x65\x6a\xf0\x84\xd3\xaf\x23\xab\xaa\x23\xff\x04\x29\x98\x0b\xab\xc1\x88\x6e\xb8\xe2\x93\x7d\x9b\xe8\xc0\x79\xe9\x86\x3b\xc1\xe7\x02\x89\x26\x17\x8e\x81\xce\xf0\x65\xb3\x17\x06\x8f\x17\x3c\x4a\x66\x5c\xcb\xb8\x1f\xf1\xf1\xd7\xb1\xb7\x10\x2a\x70\xb3\xed\x62\x1d\x79\xc0\xd8\x21\x88\xa4\x4d\xf5\x09\xd1\x81\xed\x3f\x60\x4c\xb2\xdb\x1e\xd6\x28\x99\x72\x25\x13\x10\x99\xe1\xa2\x66\xc3\x80\x62\x14\x00\xc0\x86\x95\x29\xe9\x03\x17\x30\xb4\x67\x6a\x36\x2c\x33\x80\x05\x54\xd6\x52\x56\x2b\x7a\x80\x0a\xd7\x0d\xd8\x01\x06\x2a\x1b\x31\xf7\x00\x3e\xed\x3a\x84\xdb\x6d\x87\xf0\xeb\x43\xd1\x95\x08\x7b\xa7\x01\xf6\x3f\x60\x92\xbb\x70\x36\xdb\x02\xaf\xac\xc2\x63\xb0\xf4\x30\x25\xb3\x39\x46\x2a\xac\xe1\xbb\xca\x35\xb3\xa3\x58\xb3\xdb\x4a\x35\xc1\xf2\xb3\x85\x4d\x8c\xc8\x20\xb6\x0b\xf4\x87\xee\x1d\x98\x92\x47\x10\x92\xb3\x23\x1b\xa5\xc4\x84\x45\x9a\x83\xfb\xc1\x24\x66\x63\x3f\xe0\x6a\xe0\x7e\x30\x25\x87\xa0\xb3\xaa\xc4\x60\x69\x6c\x17\x18\x31\x46\x0f\x98\x2e\x36\x80\xa8\x50\x72\x09\x2e\x31\x63\xae\x06\xe4\x0d\x30\x85\xcc\x42\x23\x1b\xcb\x5c\xad\x35\x12\xd9\x1a\x66\x1f\x00\xb5\x35\xd9\xc2\x32\xa9\x5a\xad\x79\x5c\xac\xd7\xa3\x58\x30\x06\xbc\x92\x04\x64\x7e\x63\x91\xd0\xb7\xda\xc3\x40\x47\x00\x63\x4c\xc3\xd5\x4c\x42\x59\x3d\x15\x12\x71\x1d\xe1\x48\x6e\x1a\xae\x84\x79\x9d\x8f\x25\xfc\x18\x4e\x9a\xbb\xa0\xa8\x8c\xdf\xb0\x07\xdc\x08\xb9\x36\x5d\x17\xa6\xab\xb4\x6f\xfd\x21\x15\xa5\xd2\x7a\xd4\x58\x2d\xa9\x6f\xb5\x2a\x98\x10\x35\x17\x8b\xe9\x12\xd3\x11\x24\x00\xc5\x6b\x2d\x34\x68\xa2\xbb\x31\xe0\xec\x4d\x75\xcd\x85\xac\x4d\xdb\xcb\x23\xd0\x73\x87\x58\x16\x9a\x55\x38\x76\x6b\x8e\x3c\x13\x60\x92\x0e\x53\x40\x76\x80\xaa\xd5\x0e\xf9\x6a\x70\xd5\x20\x54\xb7\x81\xfa\x35\x9d\x06\xb8\xa4\x44\xf7\xd0\x39\xdb\x06\x30\xeb\x18\x00\x66\xdd\xbe\x29\xc5\x5c\x98\x7c\xd7\xe8\x7e\xae\xe1\xe7\x9a\x0b\x55\x63\x88\x81\xc6\xf7\x5a\x31\x23\x8d\xd6\xaf\x11\xc0\xea\x2b\xd0\xd9\x01\xf2\x4c\xdf\x0a\x3c\x33\xfd\x8b\xc1\x33\xd3\xb7\x01\xcf\x4e\x17\x3c\x53\x7d\x1b\xf8\xcc\x3f\xdd\x3f\x15\xb3\x23\xad\xe0\x1d\x59\x13\x98\x1a\x20\xd8\xb6\x88\x55\xd2\xd1\x4a\x2c\x60\x5a\xdd\x89\xc6\x8e\xa8\x87\x5e\x32\x1a\x45\x55\x13\x1a\x66\x7a\xc4\x45\x79\x9f\xd1\x8c\x89\x24\x5c\xb8\x8e\xa8\x3e\x61\x47\xc6\x44\xdb\x6c\x35\xcd\x3f\xcd\xfc\x78\xac\x45\x0f\xad\xeb\xb1\x24\x6a\x44\x8c\xc0\x06\x34\x30\x20\x8d\xc4\x88\x2b\x54\x07\xf8\x38\x70\x89\x23\x51\x1b\x1e\x54\xa2\xde\x42\xb3\x61\x42\xa8\xa9\x09\x21\x9c\x26\x3e\xc5\xb0\x3a\x28\x6f\x33\x59\x61\x29\x6f\x11\x43\x72\x88\x21\x51\x43\xb2\x16\xf6\x64\x0b\x34\x21\x66\x64\x9a\xa4\x0f\x6c\xb2\x69\x4a\xe6\xad\x33\x42\x1d\x82\x41\x87\x24\x00\x99\xfa\x91\x39\xd1\xec\xeb\xa9\x66\x4a\xd4\xbe\x7d\x4a\x6c\x62\x08\x39\xb9\x29\x51\x73\xab\x29\x39\x0f\x23\xae\xe1\x0d\x40\x5f\x47\x34\xe9\x61\x47\x88\xe5\xd0\x0e\xc3\x6a\x32\xaf\x60\x59\x4d\xe6\x6d\x66\x5a\x59\xc1\xb4\x16\x4f\x34\xef\x63\xfb\xde\x82\x12\x6b\xdf\x20\xd6\x82\x3a\x13\x6a\x1e\x51\x73\x9f\x7a\x18\xc7\xc2\x25\xd6\xc4\x3b\xa2\x0e\x8a\x1f\xad\x82\x61\x3d\x42\x01\x4c\xf5\x6e\x1e\x51\xda\x7c\x37\x8e\xdc\xe2\x15\xfb\xed\x1b\x92\x51\x1a\xad\x49\xc6\xc2\xaa\xdf\x35\x43\x32\x26\x5a\x2b\x41\x33\x8e\xcc\xe6\x07\x9a\x31\x01\x4e\x0d\xb8\x02\x89\x1d\x50\x1b\xad\x11\x4d\x13\x8d\x8f\x91\x95\x80\x5d\x6b\x62\x36\x85\x0c\x03\x2d\x99\x29\xf0\x15\x9e\x69\x94\xa5\xa8\x8e\x76\xdb\x12\xe0\x40\x8c\xc3\xe5\x41\x0d\x80\x67\xcb\x72\x22\x07\xad\xa0\xf5\xb2\x3e\x51\x6c\xb3\x0d\x33\xae\xfd\xc3\x9b\x73\xc3\x61\x30\x25\x73\x41\xd9\xbe\x7d\x64\x4e\xdc\xeb\xa9\x2d\x51\xfb\xc8\x41\x1f\xa4\x7d\x3b\xd0\x44\x30\x19\x8d\x49\x68\x61\x5a\x2b\xf5\x99\x85\xc6\xa5\x02\xc0\xb2\xa0\x88\x39\xc3\x34\x4c\x45\x95\xbd\x89\x3e\xf4\x1a\x9b\xb8\x85\xd0\x62\xdd\xdb\xa1\x2b\xb9\x13\xf3\xc8\xde\xca\x4f\x1e\xe7\xed\x51\xd0\x97\xba\xe4\x2c\xa8\x71\xab\x30\xc8\xb8\xfd\x5c\x95\x27\xca\x2c\xce\x95\x25\x84\x41\x56\x64\x49\x42\xd2\x00\xe9\x13\x40\xed\x0e\x3d\xc2\xd3\x63\x4f\x28\x3b\x42\x7d\xec\x76\x13\xf5\xb5\xcc\x0d\xfe\x00\xf0\x42\xf5\x03\x34\x24\xfe\x62\x08\x63\xdd\x02\x61\xf0\xbc\x33\xdf\x42\xc8\x60\x95\x26\x7a\x1a\x45\xf7\xcf\x22\xa9\xa0\x0c\x29\x46\x2a\xb5\x89\x6d\xb3\x08\xc8\x44\x4b\xe8\xb6\xd0\x0e\x17\xcd\x27\x0c\xf7\x80\x02\xdd\x68\x4a\x40\xbf\x0b\xcb\x67\xca\xa2\xca\x7b\xe7\xa0\xfc\x7c\xd3\x92\x09\x1b\xae\x07\x05\x07\x3a\xf0\x7c\x18\x4f\x45\x33\xe1\x64\x1a\x12\x10\x46\xd4\x3d\xb2\xf7\x8d\xeb\xa9\x21\x39\x13\xca\x4a\x2b\x9c\x4d\xa3\x89\xfc\x07\x0d\xc0\x83\xd6\x2d\xf6\x01\x1c\xaf\x7d\xdc\x40\x6c\xa1\x39\x13\x8b\xd8\x11\x31\x25\x36\x71\x8e\xec\x09\x10\xfa\x9b\xcf\x51\x12\x8d\x79\xfa\x08\x40\xb5\x2e\x99\xb5\x8d\x15\x25\x9e\x47\x3c\x4d\xf8\x8c\xa0\x3c\xa6\x6b\x8a\x63\x77\x4d\x71\xdc\x15\x53\x1c\x37\xda\x26\xea\x5c\x39\x03\x5f\x33\x6c\x06\xd3\x25\xbb\xec\xcf\xbd\x0e\x12\xb5\x1a\x6c\xdf\x3c\x72\x51\xb0\xb2\x9e\xf1\x2a\x06\x7b\xe1\xe7\xfc\xf2\xeb\x98\x2e\x30\x80\x1b\x9e\x44\x3d\xa2\xbb\xaf\x99\x0e\x24\xb7\x49\x0c\x11\x28\x99\x09\x9b\x0f\x46\x74\x13\xbd\xff\x4d\x74\xd5\xd0\x81\x8b\xd7\x6d\xc9\x20\xb6\xe5\x6a\x0e\xb1\x0c\x57\x72\x80\x73\x9d\x30\x42\x29\x0d\x84\x4e\x0f\x63\xec\x51\xa2\x3b\x18\x98\x19\x95\x5f\xae\x0e\xec\xa2\x6d\x31\xe2\x79\x22\x66\x33\x9a\x83\x00\xc9\xaa\x33\x00\xb0\x36\x2b\x7e\x52\x62\x3a\x18\x7d\x8b\xd8\xcc\x24\xb6\x27\x32\xd1\xc9\x01\x73\x75\x61\x6d\x8d\x6e\x07\x3a\x06\xb5\x43\xaf\x07\xc3\x34\x01\x4a\x62\xac\x10\x42\x19\x71\x25\x93\x30\xdb\x22\x9e\x61\x4b\x16\xc6\xb1\xd3\xa1\xa8\x06\x64\x82\x6d\x69\xc4\xd6\x19\xb1\xad\x7d\x8b\x38\xa6\xed\x8b\xb7\x52\xfd\x83\x99\x1a\xb1\xad\x80\xe8\xd8\x59\x6a\x43\x5d\x0c\xbd\x6f\x5d\x62\x99\x14\x66\xc3\x71\xf6\x0d\x62\x9b\xcc\x37\x4d\x42\x6d\x4f\x2a\xfe\x14\xdc\xb7\x65\x53\x40\xa2\xcc\x0e\x34\x98\x07\x8c\x29\xe6\xa1\xe5\x1a\xd1\x31\x84\x9a\x81\xbf\x26\x40\xd9\xd9\xb8\x67\x28\xee\x1a\xa2\xeb\xa6\x86\x4e\x1d\x50\x06\xe7\x64\x43\x1c\xa4\x42\xe5\xef\x02\x7d\x68\x10\xc3\x35\xf7\x31\x3c\x9f\x43\x27\x1e\x24\x1e\xc0\xd3\x93\x5c\xe2\x60\xd0\x34\x8a\xd1\xf7\x5c\xc0\x08\x0c\xf1\x02\x33\x35\x7c\x8a\x14\xcc\xa4\xe2\x29\xc1\x5a\xa1\x28\x5b\xdf\x0c\x93\x2e\xc2\xf3\xfc\xe1\x21\x92\x45\x5c\xab\x90\x76\x04\x84\x79\xc4\x72\xd1\xe2\x0c\x4e\x24\x25\x3a\x1a\x9d\x58\x96\xb1\xdf\x11\x74\x2f\xd8\xc4\x3b\xf2\x26\x6c\x21\x94\x58\x6d\xa1\x36\x6a\x85\x29\x9a\x93\x30\x53\x12\xcf\x4a\x42\x83\x1a\x0b\xcb\x32\x5e\x53\x97\x38\x9e\x64\xa1\xb1\x1b\xf5\x30\x5a\x2e\x46\x63\x31\x30\xae\x56\x20\xb8\x3a\x1d\x85\x1a\x18\xa3\xc2\xd3\x6c\x8c\x16\xe8\xbe\xa6\x3a\xa4\x19\x84\x19\xae\xe4\x22\xef\x27\xd9\x12\xaa\xde\x80\x84\x71\x3d\x4a\x18\x45\xd3\x29\xcb\xc5\xc1\x19\x28\xca\xc1\x00\x26\x28\xe3\x09\x08\x33\x34\xb4\x62\x31\x3c\x1b\x43\xb0\x59\x3a\x9a\xc3\xa0\x9b\x91\x65\x3b\x84\xa1\x90\xd5\x42\xd2\x40\xf7\x4c\xcd\x20\x8c\xda\x70\x62\x2c\x57\x23\xd4\xb5\x88\xe1\x68\xc4\x60\x0e\x71\x6c\xa8\xc9\xc0\x00\x78\xb6\x11\x69\x68\x4a\x66\x04\x58\x8b\x06\x07\x40\xc2\x6a\x0a\xd9\x15\x56\x03\xac\xa7\xe5\x5c\x1f\x3a\x18\x4a\x97\xe8\xae\x17\x10\xaa\xbb\xd0\x07\xc2\x70\xdb\xeb\x3a\x85\x37\x09\x7b\x44\x6c\xac\x9d\xd9\xf0\x6e\x9b\x2e\xec\x77\xcf\x92\x1a\x3d\x12\xad\x6a\xc4\xd0\xa9\x6f\x13\x5d\x07\x66\x06\x9e\xc5\xb1\x32\xd1\xff\x82\xda\xc6\x6b\x8f\x38\xb8\x69\xa9\x6b\xe0\xe6\x86\xf3\x0e\x90\xa0\xec\xc9\x7a\xa5\x6c\x7d\x6a\xa8\x44\xcd\x7d\x63\x21\xd8\x07\xd3\x81\x55\x2b\x19\x08\x7b\xa1\xb9\xd7\x53\x26\xb9\x0b\xcd\x9d\xb8\x75\x11\x4d\x94\x41\x9d\x9b\xb6\xe5\xb1\x78\x0c\xbc\xc1\x17\x9e\x0c\x73\x42\x17\xf6\x86\x40\xbb\x0b\xcd\x9e\xd0\x85\x66\x7e\x0b\xe7\x06\xe3\x78\xeb\xb0\xba\xf6\x44\xb3\x17\xb6\xb8\xbd\xc1\x11\x26\xd4\x18\x21\x0d\xd1\xfd\x82\x61\x1a\xa0\x6a\x73\x61\xef\x5b\x50\xdc\xbe\x9e\x5a\xc4\xb0\x6c\x21\x6f\x7d\x3a\x76\xbb\x1e\xbb\xfa\x48\xe4\xda\x59\xea\xc7\xc1\xe4\xa1\x63\x37\x30\xd7\x96\x3c\x62\x7b\x9e\x0f\x9b\xd1\x96\xc4\xb3\x14\x62\x5b\xa6\x21\x9e\x81\x5e\xfa\x63\x3a\x22\x41\x6a\x64\x12\xd7\x40\x66\x0d\x7f\x3b\xba\x23\x35\x4a\x48\xb0\x11\x81\xe4\x80\x69\x6a\x7c\x23\x7e\x5f\x1f\xba\x04\x70\xb6\x47\x3c\xd7\x5c\xd3\x03\xd6\xec\x81\x55\xf5\x00\x4f\x6b\x91\xc9\xa0\x6f\x6b\x7a\xc0\x44\x0f\x80\x0b\x2e\xd3\x5b\x3d\x98\xea\x1a\x9a\xec\x5a\x01\x71\x4d\xef\xcb\x2a\x81\x9e\xe3\xbe\x82\x67\xdd\xf3\x2d\x3a\x2e\x62\x06\xa3\xca\x87\x02\x4c\x11\xe1\xc8\xf1\x59\x40\x11\xb4\x55\x86\x27\x7b\xb5\x92\x2b\x51\x61\x9b\x69\x99\x0b\x62\xb8\x48\x66\x31\xe0\x69\x3d\x8d\x30\x74\xcf\x63\xb6\x46\x5c\x80\x6e\x8e\x63\x6a\xc4\xa2\x26\xb1\xd0\xec\x9c\xea\x36\x71\x5c\xf4\xd1\x75\x4c\x82\xc4\x8e\x6e\x3b\xf0\x35\x7a\xd3\x62\xa0\x65\xd1\x28\xb1\xdc\x23\x87\x38\xae\x81\xad\x1b\x92\x78\x8a\xd6\x5d\x02\x30\x05\xcd\xde\x59\xf1\x14\x19\x18\xdb\xca\xa1\x3e\x13\x56\xe8\xf8\x2c\xe1\x9e\x30\x88\x66\x94\x2d\x5c\x62\x1a\xe6\x6b\x0c\xfe\x8c\x5e\xa5\xb6\x23\xd9\x12\x75\x88\x89\x61\x43\x20\xb7\xbf\x4d\xa8\x12\xeb\xee\x64\x61\x7f\xc5\x84\xc1\x9c\xdb\x2e\x03\x42\x17\xcd\x51\x5d\x5b\xbc\x53\xe2\x98\x1e\xa1\xd4\x86\xa3\xee\x10\x1b\x9d\x75\x99\x4d\x1c\xcb\x03\x82\xd7\x24\x06\xa3\x1a\x5a\xd5\x02\x20\x60\xa8\x56\x64\xba\x57\xfe\x84\x7d\xac\xdb\x26\xc6\xb5\x76\x34\x62\x39\x6e\xe1\xa6\x4d\x89\x8d\xfb\x42\x47\x11\x8b\xce\xbc\x62\x8f\x30\x62\x61\x10\x5f\x5b\x77\x30\xc4\xbf\x31\xd1\xd0\x3f\x83\x38\xae\x89\x90\x13\x2a\xa5\x54\x74\xb1\xf8\xcd\x08\x63\x9b\xe5\x48\x00\x41\x82\x64\x3a\x0d\x1f\x38\x3e\x0a\x4a\x6f\x3d\x5c\x6b\x24\xec\xdd\x4a\xc7\x8a\xb6\x7a\x18\x72\xff\x55\x27\x4f\xa2\x4c\xf2\x88\x81\xfb\xbd\x9d\x81\x1f\x89\x67\xdf\x47\xd8\xd4\xf5\xd4\x24\x9e\x6d\xa0\x8f\xb6\xf9\x9a\xda\x40\xee\x4b\x80\xc9\x6d\xe4\xdc\x8a\x70\x75\x4e\x86\x2a\x3e\x01\xec\x6d\x0d\x3f\x01\xd4\x6a\x39\xfb\xc6\x02\x77\xca\xc4\x24\xba\xe1\xbc\x86\x5d\x60\x4b\xd4\x22\xb6\x09\x80\x10\x63\x06\xb2\xc2\x0d\x01\x7f\x65\x58\x8f\x86\xf5\x48\xa2\x69\x51\x0f\xde\xa6\x82\x35\x69\x58\xd5\x56\x6b\x36\x9b\xc3\xe4\x8a\x7b\x9a\x1f\x38\x1a\x8a\xe1\x01\xd5\xa0\xa3\x18\xd0\x13\xe1\x9d\x4d\x53\x23\xb6\x2d\x7e\xc0\x03\xf0\x9e\xe3\x96\x49\x52\x95\x4e\x1c\x61\x08\x68\x9a\x18\xdd\xa1\xcc\x13\x8e\x30\x5a\x99\x56\x7f\x74\x3d\x15\x3f\x75\x62\xd9\x28\x95\xf4\x58\x4f\x29\x0d\xab\x5d\xdb\x0d\x7a\x7b\x3f\x44\x90\x9a\xb2\x3d\xe2\xd9\x5a\x11\xb9\xdb\x40\xc4\xad\xdb\x2e\x1a\xc9\x17\xff\x7c\x46\x0c\x0f\x36\x9c\xe1\x55\xfe\xcf\x84\xe1\x75\x48\xe6\xc2\x21\x2e\x82\x5b\xc3\xc3\x02\x05\x7c\x11\x33\x86\xa0\xa7\x9d\x41\x09\x5a\xac\xda\xe6\x11\x4c\x15\x56\x8d\x40\xce\x70\xed\x46\x09\x06\xa0\xe3\x7a\xea\x10\x11\x1b\x71\xf3\xb4\xef\x30\xde\x5b\x27\x9e\x69\x06\x90\x41\x47\x18\x51\x1a\x40\x98\x87\x11\x20\x10\x1d\x39\x48\xaa\x51\xbc\x16\xc3\x2c\x23\x6f\x38\x3a\x30\xc8\x96\x81\x8e\x13\x18\x22\x02\xb2\xb0\xd8\x04\x66\xe9\x48\xd8\x30\x48\x8d\x7f\x47\x0e\x71\x27\x94\xb0\x80\x18\xcc\x04\x56\x9a\x58\x8e\x4d\xa8\x81\x47\x99\x18\x0e\x23\x0c\x83\x46\x10\x03\x89\x44\x4c\x71\x19\xda\x1d\x19\x36\x4e\x28\xca\x2f\x3c\x56\x4f\x98\x58\x0b\x69\xed\x64\x6f\x75\xdc\x52\x3e\x4b\xb2\x30\x4f\xd2\xab\x87\xd6\x4a\x50\xef\xc8\x6c\xc6\x76\xde\xb7\x5f\x03\x9f\x65\x62\x5c\x68\x73\x41\xad\x76\x54\xe8\x85\x11\x21\x83\x25\xb1\x85\x66\x4c\x9c\x66\x8c\xe8\xeb\x43\x4f\xb2\xf6\x9d\x05\x9b\xb0\x23\xeb\xfa\xd0\x91\xdc\x09\x5b\xb0\x7d\xe7\xc8\x05\x5a\xdd\x10\x2f\x48\xb9\x53\x2a\x59\xfb\xf6\xc2\x00\xd6\x04\x63\x71\x03\x45\x6f\x5c\x1f\xda\x92\x39\xa1\x6c\x41\xe9\xbe\x7d\xb4\x71\x1e\x2f\xe6\xe1\xfd\x47\x9d\xd8\xde\x72\x77\xbd\xb2\x46\xcc\x27\xb1\x88\x25\x22\x9a\x4e\x9c\x48\x23\x9e\x63\xc1\xbf\x03\x4a\xa5\x4a\x35\x83\xb6\xbb\xae\x44\x81\x89\x2d\x23\x48\xeb\x9a\xd1\x79\xb3\xab\x37\x6a\x68\x56\x40\xa8\x23\x1c\x42\x18\xf1\x8a\x10\x2e\xcc\x22\x86\x01\xff\x39\xa6\x43\xd0\x02\x08\xd5\x6d\xbe\x41\x28\x33\x25\xf1\xac\x40\x09\xe4\xbc\x82\x34\x43\x12\xcf\x82\x48\xa1\x12\xa5\x81\x46\x28\xd0\x0f\x3a\x10\x01\x4c\x23\x1e\x2a\xe8\x84\x7b\x03\x46\x7c\x87\x7f\x8e\x69\x6b\x04\x2d\x89\x20\xd5\x81\x61\x12\x6a\x3b\xc4\x83\x4f\x4d\x74\x4b\x2a\x32\x0c\xf1\x89\x41\x2c\xd7\xc0\x84\xa2\x2e\xd4\xf6\xa1\xdf\x10\xd2\x82\xc8\x84\xa1\xf5\x12\x74\x5d\x98\xfd\x53\xbc\xa1\xc8\x84\x7f\xa8\x3a\x41\xf8\xe1\x88\x0c\x51\x08\x6b\xf2\x88\xc9\x2c\x54\xb1\x53\xa2\x5b\x5a\x23\x1b\xb8\x57\x1d\x03\x87\x21\xe9\x86\xfe\x01\x4e\x11\x04\x56\x0f\xb0\xa3\xa5\xdb\x86\x2e\x42\xc6\x78\x00\x4a\xa0\x62\xac\xe5\x35\x35\x21\x09\x58\x2d\x53\x44\x33\x45\xad\xb0\x88\x21\x6b\x05\xc8\xb0\x01\xef\x05\x20\x40\xc7\x5a\xac\xa2\xdf\x5a\xd1\xbe\x45\x3c\x34\xc0\x31\x44\x9c\x36\xe1\x7b\x07\xd4\xb8\x23\xe9\x18\x9a\xde\x5e\xb0\x7d\xf7\xc8\x9e\x18\xd7\x53\x5b\x83\xed\x04\xb3\x68\x61\xd7\xc4\x64\x16\x8b\x2b\xe6\x10\x27\x13\x66\x1b\xef\x1d\xc1\x65\x44\x88\x05\x85\x99\xb0\x46\x10\x89\x62\x2b\x58\x30\x5c\xbb\xda\x1f\xd4\x86\x8a\x3d\x17\xc3\xfd\x10\xaf\x8a\xf3\x24\xb6\x42\x73\x93\x20\x8b\x8f\x7b\x07\x00\x28\xad\x39\x1e\xb1\xa8\x41\xbd\x11\x80\x57\x76\x4c\xb7\xda\x22\x9b\x0e\xec\x84\xfb\x51\x3e\xf9\x1a\x27\xd6\x13\xd1\x69\x23\xe4\x3a\xd0\x6b\x44\xb3\x0b\xbd\x94\x85\xc1\x19\x51\xb1\x06\xa5\x2c\x20\xe1\xe9\x3e\x5b\xb0\x89\x15\x31\x62\x69\xe6\x16\x06\xa6\x13\x1e\xcd\xfe\x44\x51\x43\xe1\x10\x34\x2f\x52\x64\x44\x77\x34\x87\x38\x16\x80\x29\xe2\x31\xf4\xe2\xc7\x10\x53\x9e\x44\xd1\x8f\x16\xad\x1d\x8a\x7b\x42\x49\x19\xaf\xd9\x44\x57\x28\x74\x42\x04\x72\x1a\x6f\xfd\xc0\xf0\xbe\x76\x20\xc4\x27\xe8\x61\x4d\x5c\xbb\x0c\x46\x28\xb5\x75\x2d\x59\xe5\x1d\xbe\xef\x06\xc0\x50\x32\x64\x08\x3d\xcd\x94\x4c\xcd\xcc\x8a\x9b\x22\x4c\xc9\x44\x99\x91\x0b\x15\x02\xd1\xec\x6a\x42\x3e\xbf\x79\xbf\xb5\xd6\xed\x31\xc8\xf9\x28\x05\x58\xdf\xb8\x3d\x80\x6a\xd4\xbe\x27\x27\x1c\x5a\x3a\xe1\x78\x65\xf0\x37\xaf\x19\xfc\xad\x1b\xe8\x14\xc5\x0b\x66\x20\x66\x5d\xd7\xcc\x6a\xe6\x27\xac\x1d\x8e\x3b\x2b\x63\x79\x07\x80\xe7\x0d\xbc\x02\x49\x33\x24\x0b\xcb\x31\x8c\x1a\x87\x07\xcc\xd0\xd0\xee\x83\x30\x00\x15\x50\x15\x06\x62\xdb\x04\x11\xc2\x0c\x48\xa0\xaf\x18\x3b\x4e\x97\xf4\x85\x39\x31\x8f\xf4\x7d\xfd\x7a\x6a\x49\x6c\x61\xec\xb3\x05\x9d\x98\x47\xe8\x9d\xc1\x30\xc1\xc4\x04\x73\xbf\x1d\x95\x39\x8c\xcf\x93\x47\x75\xe8\x03\x8b\x58\x22\x52\x98\x0e\x24\x28\xa0\x44\xf8\x9d\x69\xe5\x8b\x86\xef\xef\x85\xa5\xa6\x59\x84\xe5\xb7\x31\xb3\x3a\xfa\xe8\xf7\x4f\x75\xa2\x53\x21\xd6\x42\x6a\xc6\xaa\x2e\xb5\x32\x4d\x43\x23\x9e\x0b\x50\x1e\x65\x13\x0c\xc8\x6e\x20\xca\x99\x07\xe9\x18\xa0\xcd\x98\x88\xf8\x00\x01\xfa\xe0\x12\x9d\x01\x7d\xef\x5a\x84\xba\x16\x7e\x0b\x45\x7c\x00\x0f\x88\xb3\x0b\x91\x99\xa8\x1b\xb2\x27\x18\x9a\xe0\x08\xf8\xe3\x80\xe8\x40\x84\xbb\x36\x0a\x82\x1d\x6a\x16\x65\x50\xfa\x47\x98\x6b\x11\xbb\x4a\x81\x76\x45\xb3\xe8\xf9\x8b\x77\x55\x01\xe1\x61\xb9\x50\xa9\xa8\xbd\xec\xb2\xe8\xae\x5d\x8e\xc6\xde\x07\x80\x66\x1c\x51\xb6\x80\x71\x5f\xc3\x39\x74\x88\x03\x9d\x34\x4c\xf4\x52\x31\xad\x52\xb9\x68\x8a\xfb\x64\x4c\xe1\x3b\xef\x98\x06\xa4\x48\x84\x61\x5c\x00\xcb\xc5\xb9\xc0\x72\x19\x66\x52\x20\x59\x24\x62\x06\x84\x59\x0e\x94\x22\x26\xb4\x8b\xc1\x29\x28\xf3\x88\x03\x54\x94\x29\x51\x98\x0f\x03\x4d\x44\x8d\xd2\x0c\x0d\x3e\x63\x2e\x50\x22\xc8\x55\x41\x57\xa9\xe5\x60\x24\x0b\xb6\x39\x8c\x70\x73\x77\x3e\x0a\xd0\x76\x4f\x1b\x54\x17\xd4\x5e\x50\x7c\xa3\x6b\x6e\x11\x97\xc0\x66\x6e\xf1\xdb\x25\x94\x8a\xe8\x7f\x50\xc2\x20\xb6\xe5\x48\x55\x4e\xf5\x2c\xbe\x17\x6f\xc0\x15\x96\x39\x45\x2d\x18\x75\x14\xb5\xde\xe8\x25\xc4\x3c\xad\xca\x65\x1e\xec\x13\xab\x3c\x2d\x90\xe2\xfe\xa5\x0f\x8b\xfb\x6d\x1f\x96\x8f\xfc\x2b\x19\x68\x48\xd4\x5d\x18\xa8\x4b\xb3\xbd\x03\xea\x48\xe5\xb5\x55\xe2\x29\x22\xcf\x18\x44\xb7\x98\x66\x1c\x60\x69\xbc\xd6\xcc\x3e\x70\x25\xd4\xe8\xeb\x86\x64\x49\xa6\xe4\x46\x80\xce\x31\x6c\xa9\x66\x12\x86\x61\xaa\x5d\xc3\x3b\xa0\x84\x1a\x4c\xf2\x08\x75\xdd\x88\x12\x47\x67\x9a\x4d\x0c\xcb\x94\xf0\xa9\x61\x8a\x64\x12\x1b\x6f\x4c\xb5\x8a\x77\x91\x07\x4f\xc4\xd4\xfa\x46\xc3\xd2\xc8\xbf\xe2\xe9\xbd\xfb\xbf\xee\x06\x39\x88\x8b\x77\x27\x13\xdb\x00\x46\x99\xea\x28\xa8\x46\x76\xc8\x23\x3a\x2c\x35\x86\x0e\x45\x3d\x01\xfc\x9d\x68\x84\x46\x78\xcd\x17\xd1\x75\xc7\xa7\xc4\x41\xea\xa5\x54\x70\x10\x83\x42\x8e\x65\x42\x19\x9b\x6a\x18\xf5\x80\xda\x06\xda\xf7\x42\xad\xba\xab\x61\xb5\x06\x71\x0d\x71\x89\xb9\xa3\xd9\xc4\xc6\x88\xa8\x9e\x2e\x82\xb9\xa3\x0c\xcb\x60\xae\x4f\x4c\x06\x27\xa4\xd4\x7a\x10\xea\x9a\x84\x9a\x1e\x31\x18\xfe\x2b\x93\x75\xd3\x24\xcc\xb2\xe1\xc8\xf8\xc4\x70\x89\x51\xde\x75\x07\x6c\x21\xa1\xd4\x09\x8a\x78\x02\xae\xf8\x0b\xcc\x29\x35\x88\xce\xec\xff\x9f\xbd\x7f\xeb\x8d\x2b\xc9\xd5\x84\xe1\xbf\x12\xa8\xb9\x99\xb9\x08\x7e\x41\x06\xe3\x04\xec\xde\x80\x5b\x5d\xfd\xe9\x42\xc6\x7b\xd1\x18\xdd\xbe\xc8\xca\x52\x57\x1a\x9d\xb2\x6b\x24\x3b\x7b\xb7\x7e\xfd\x0b\x3e\x8c\xb5\x32\x75\xb2\x54\xb5\xcb\x63\xef\x0d\xc3\xce\xa5\x95\xb9\x0e\x71\x22\x19\x64\x04\xf9\x70\x6f\x8d\xb0\xcf\xd6\x7f\x15\xd8\xa3\x94\x72\xa7\x54\x2b\xa5\x52\x37\xa4\xbd\x1f\x73\xdf\x06\x4a\xcd\x4c\x5b\xbc\x12\xfb\x3f\x29\x95\x19\x32\xd4\x70\xce\x62\xd7\x47\x18\x54\x1d\xea\x25\x21\xc1\x46\xb5\xd3\x62\x05\xfb\x13\xe2\x0f\x65\xf4\xa2\xf5\x6d\x59\x36\x43\x28\xb3\x3b\x25\x52\x12\xeb\xb7\xd4\xb7\x94\xec\xc4\x77\x87\x4d\x38\x7a\xf7\xe7\xfd\x40\x77\xab\x75\xa5\x35\xa0\x4c\xdc\x04\x3c\xc6\xc3\x31\x5d\x93\x58\x1b\xea\xb0\xcf\x52\x82\xd9\xc9\xc4\x5c\xac\x11\x1d\x28\x0a\x84\xb0\x52\x74\x81\x3d\x83\x6a\xcd\x0b\x40\x5e\x90\x6c\x55\xb2\x2b\xba\xc1\x32\x5d\x6e\xb2\xf6\x88\xc9\x1f\x2e\x36\x64\xd9\x3e\xeb\xb0\x70\x9e\x3b\xb6\xea\xf9\x35\x97\xdf\xf1\x33\xf6\xa5\xf0\x6e\xe6\xb8\x96\xb2\x3c\x85\x94\x72\x5e\xb7\xb8\xd4\x6d\x3e\x09\xba\xd0\x02\xb0\xda\x85\x2e\xec\x76\x4e\x78\x25\xe3\xc9\xb6\xbe\x0d\x8f\xe1\x2b\x30\x0f\xb4\x61\x2f\xa6\x1b\x3f\x9b\x48\xcc\xc4\xcd\xe6\x17\x87\x79\xb5\xe3\x42\xc8\xc2\xc4\xf2\xbc\x1f\xc3\xef\x63\x35\x64\xd3\xe9\xc0\x63\x49\x03\x33\xd2\xc6\xcc\x38\xa1\x25\x44\x88\x4a\xc6\xae\xdb\x0e\xce\x51\xe0\xc8\xea\x44\x10\x69\xe9\x27\xb1\xfe\x10\x33\xf2\x00\xa0\x54\xed\x65\xa5\x4e\x5e\x53\xa3\x82\xb2\x91\x36\x7a\xc0\xc1\xdf\x6b\x3c\xa6\xe0\xb1\x01\x1e\xc3\xbe\x52\x36\x0e\xcb\xf6\xb9\xcf\x61\xdd\x97\x31\xee\xf3\x57\x33\xfe\xda\x3a\x4d\x28\x83\x46\xda\x98\x1c\x56\x1f\x30\x58\x5b\x18\xcc\xb8\x64\xb2\x47\x99\x9f\xe6\x9f\x7b\xec\x36\x26\xbb\x35\x4a\xe2\xcc\xa1\xc3\x4b\x01\xb7\xad\x7c\x5a\xb6\xce\x5f\xf5\x84\xbd\xea\xca\x5e\xd5\xb9\x2b\x3b\x77\x89\x93\x71\xdd\x50\x49\xd5\x3e\x2b\xf5\x67\x74\xfc\x9e\x52\xce\x08\xa5\xc6\x5e\xb1\x6f\xe7\xfa\x0d\x20\x97\xfa\x90\xed\xf4\x31\xdb\xc9\xca\x76\xfd\x11\xdb\xb5\x0d\xa9\xe9\x09\xac\xcf\xb2\xdd\x73\x5c\xb7\xb0\x83\x9c\x32\x5d\x05\x00\xf2\x03\xa6\xa3\x8c\x44\xd9\xfc\x98\xe7\x7c\xd1\xea\x59\x9e\x93\xcf\xf2\xdc\xd3\x4c\xc7\x33\x45\xf0\x3d\xa6\x6b\x4f\x31\x5d\x7b\xc8\x74\xfd\x84\xe9\xc6\x91\xe9\xe0\x5d\xa3\x55\x8e\xb3\x47\x23\xfe\xcc\x3e\xe7\xef\x61\xba\x84\xbd\xc3\xa4\x65\xbb\x34\x08\x6d\xcc\x93\x61\x52\x41\x8d\xcb\x1b\x32\x99\xb2\x42\x98\x78\xa2\x4c\x93\x34\xbe\x91\x32\xb9\x43\x7c\x67\x2c\x4d\xc8\x24\xc8\x45\x9c\x38\xaa\x33\xb1\xfd\x50\x35\x76\xea\x25\x23\xc3\x78\x1c\x94\x73\x0f\x85\x58\x79\x63\x4a\xd5\xaa\x58\x2d\xec\x56\x1a\x65\xfb\x7f\x8f\xdd\x5a\x3e\x65\xb7\x02\xe2\x30\x15\xd6\xd8\x4d\x74\xb2\xd9\x14\xf7\x93\xd9\xc6\xc2\x25\x75\x99\xcd\xd4\xd9\xcb\xf8\xc8\xd8\xab\x4e\xee\x5a\xd8\x4b\x9d\xbd\xea\xa6\x68\x31\x05\x91\xc3\x7a\xe2\xbd\x30\x90\x68\x4a\xa9\x48\x9f\x35\x31\x4e\x96\xf9\x37\xb3\x4f\x5e\xda\xc5\x3e\xaf\x9e\xbe\xea\xe4\xa3\x85\x91\x0a\x71\x7e\xc4\x47\xb2\xb0\xd1\xd8\xc0\x4f\x47\xeb\x03\x36\x12\x79\x34\x7b\x8d\x85\x8f\xe4\xf9\xe9\xab\xd8\x18\x14\xfb\xac\x9c\x64\xea\x6c\x85\x6a\xbd\xaa\xd7\x47\x4e\xaa\x94\x6b\xb3\xcf\x3d\x4e\xea\xfc\x14\x27\xe9\xca\x49\x65\xe5\xa4\x3c\x39\x49\xe6\x93\x26\x72\x4b\x03\x38\xf8\x3d\x3e\xc2\x8e\xc6\xe4\xa3\xbe\xf0\x91\xac\x6c\x54\xf7\x71\x60\x97\x43\xa9\x7c\xc6\xed\x75\xd1\x2b\xaf\x36\x3f\x7f\xe5\xe0\x04\x00\x0a\xa4\xa6\xfb\x4c\x35\x21\x12\xb6\xd5\x48\xa3\x20\xf9\xb5\x09\x80\x0e\x0c\xfc\x6a\x5f\x87\x46\xca\x9e\x8e\xbb\x12\x57\x47\xbc\x00\x46\x3d\x60\xe3\x79\x64\xbb\xec\x0f\x05\x3c\x04\x24\x22\x25\xbe\x58\xcb\x79\x8d\x27\x70\x10\x4f\xfe\xd0\x90\xd9\xc1\x13\x3b\xb8\x1d\xbc\x8b\xba\x4d\x58\x96\xb0\x2a\x48\xed\x4b\xd6\x30\x3d\x98\x65\x00\xe3\x79\x9b\xc2\x09\x3c\xd3\x6a\x50\x1f\x74\xeb\xcf\xa5\xc0\xa6\xfc\xfb\xc3\x91\x75\x17\x1d\xdc\x1a\x96\x39\x66\x58\xb7\xcc\x17\xf8\xa6\x9d\x6e\x53\xc4\xa3\xfe\x54\xc4\x53\x91\xf5\x80\x34\xf5\x7a\xa6\xf8\x55\xa2\x84\x79\x66\x15\xd5\xb3\x05\x0e\xea\x08\x0a\x15\xe4\xf0\xf2\x6a\xdf\xfe\x6a\x73\xf3\xfe\x0b\x81\xaa\x69\x1a\xa1\x98\xcc\xda\x77\x1a\x5c\x90\x5d\x1d\x00\x72\x24\xc8\x44\x5c\xa9\x76\xb6\xbf\x70\xf6\x06\x32\xa6\x9a\xfe\x22\x5c\x69\x78\xe6\xe0\x79\x69\x1f\x33\xfc\xbd\x99\x72\xe7\x43\xa6\x56\xdb\xd6\x58\xde\xb5\x1a\x92\x36\xc0\x30\x66\x58\x3b\xa6\xa4\xb1\x9a\x66\xa5\xea\x9b\x63\x99\x7a\xe9\x91\x72\x6b\x48\xd7\x4d\xbd\x14\x2a\x49\x00\x3a\x4e\xd5\x5d\x05\x5b\xa6\x5c\x8d\xfa\xb4\x0a\x95\xd6\x63\xa6\x51\x33\xce\x98\x7c\x1d\xb5\xc3\xb9\x27\xe3\x8a\xc0\xa5\x27\x62\xe7\xdb\x66\x00\x87\x77\x8b\x8e\x69\x9a\xcd\x7a\xef\x46\xbf\x8c\x34\x04\x91\x8a\x59\xf6\x25\xc1\x24\x47\x05\xfa\x86\xaa\xd9\x57\xbc\xa8\x62\xc4\xd8\xc3\xe9\x05\x80\x91\xa2\x7b\x9f\xcc\x87\x96\x0b\x4f\xdf\x47\xd8\xe7\xe9\x54\x04\x8e\xcc\x88\x77\xf5\x6d\x77\x81\x6f\x53\xae\x1b\xd3\x4d\xe1\x16\x29\x8b\x23\x8c\x89\xbc\xc0\x34\x58\x66\x36\xfb\xa3\xce\x6d\xb3\x5c\x1e\xd4\x39\xef\x6c\x26\xdf\xc2\x6a\xd1\xa9\x29\x75\x97\xc8\x4d\xdd\xb0\x28\x36\x39\x10\x9b\x2c\x6d\x8d\x78\xf8\x25\x2e\x15\xf0\x93\xd0\x2a\xa4\x91\x8e\x46\xc6\x94\x54\xa5\x53\xc9\x99\x86\x1d\x2f\x0a\x80\xef\x24\x59\xf5\xb5\x62\xb1\xc0\x04\xb2\x20\x31\x82\xf5\x59\x2b\xd8\xbd\xcc\xd3\x25\x34\x29\x7e\x61\xca\x0d\x67\xfb\x48\x0a\x27\xff\xde\xb6\x3e\x21\x9a\x15\x1d\x49\x6a\xa5\x91\x7b\xa4\xce\x42\x6c\x12\x57\x2a\xbc\xf1\xa9\x80\xc6\x5a\xa4\x9e\xac\x53\x3c\x91\xb6\x1c\x65\x78\x8b\xa4\xf0\x79\x63\xec\x6f\x2c\x53\x1b\x07\xb3\x1f\x23\xd3\x68\x75\x0b\x09\xcc\xc4\x2d\x53\x11\x78\x64\x28\xd3\xc0\xb6\x64\xad\x48\x2b\xdf\xcd\xa8\xed\xa9\x9f\x09\xfc\x42\x99\x49\x7c\x01\xcd\x33\x31\xe2\x24\x2b\x56\x63\xa4\xc1\x0b\xd5\xc8\xda\xa8\x3a\x3a\x55\x83\x2d\xe2\x64\x0b\x31\x92\x32\x9d\xb9\x58\x6f\xd8\x49\x37\xda\x38\x00\xd7\xe7\xee\xda\x3d\x5e\x33\x35\x2d\x7b\x00\xc2\x99\xc8\x53\xcf\xa3\xa5\x24\xd2\xf6\x7d\xa6\x9c\xef\xbd\xbb\xcc\xb4\x3b\xf1\x23\xdc\x84\x4d\xd8\x32\x8d\xdc\x2e\xb0\x7a\x54\xf6\x34\x5a\xa3\xc2\x48\xaa\x36\x86\x06\x35\x45\x12\x31\x6f\x0e\x09\x29\x65\x03\xbd\x39\xf8\x71\x92\x0c\x2a\x75\xd1\x10\x94\x91\x29\x37\x98\xfd\x0e\xeb\x7a\x10\x32\xb5\x3a\xb3\x7d\x8e\xf4\x67\x73\xb7\x19\xc6\xa6\x60\xb4\x61\xba\x21\x89\x28\xe5\xd2\x49\xed\x5c\xd5\xf4\x3e\xaa\x90\xe6\x6c\x56\x32\x15\x16\x1a\xdc\x28\x33\x82\x53\xaa\xd5\x13\x41\x85\xc6\x9a\x2c\xb7\x42\xd5\x58\xdf\x7f\xca\xd1\x7e\x33\xb9\x12\x41\x91\xdd\x48\x2a\x67\xec\x60\x1b\xd7\xdb\xcb\xa4\x00\x4c\xd6\x94\xdf\x6a\x46\x5c\x77\xaf\x62\x35\x45\xa5\x32\xd5\x93\xea\x0e\x68\xe9\x7b\x74\x7b\x34\x56\xb8\x7b\x8b\x74\xee\x4f\x42\x72\x91\x4c\x48\x52\x6e\xa1\xee\x5f\x0f\xcc\x05\x7c\xf2\xaf\xea\x63\xe2\x41\x36\xc9\xd8\x1b\x98\x31\x40\xe4\x94\xa1\x1b\xd3\x54\x01\xd8\x54\xf3\xea\x9d\x27\x85\x06\x22\x73\x4c\xec\x24\xac\xcf\xc0\x16\xce\xfe\x64\xa4\xe1\xee\x14\x34\xda\x96\xaa\x36\x93\xbb\xe4\x12\x2a\x19\x37\xcd\x1d\x77\xec\x19\x9a\x90\x43\xec\xa5\x0d\x9c\x4d\x0b\x42\x6e\x0e\x08\x50\x75\xa5\xcb\x36\x62\x4c\xc4\xd1\xff\xc0\xe2\x5e\x05\xf0\x7a\xcf\x5e\x03\x13\x8e\x19\xd0\x8f\xa6\x61\x0d\x6b\xc6\x82\x88\xc5\x67\x99\xb2\xfb\xe4\x75\x6b\x8b\x9d\x30\x23\x68\xbc\x92\x38\x4b\xf6\x6e\x75\x02\x8e\x4c\x16\x6b\x1d\xca\xd8\x5b\x7b\x4a\x7c\xa6\x27\xb0\xc3\x19\xd1\x15\xde\x13\x00\x92\xc1\x0a\x87\x77\x9e\xf5\x03\x8d\x66\x5d\xb1\xc9\xc4\xc9\x08\x94\x8f\x51\x52\xa3\x45\x74\x84\x97\x9f\xa7\x93\x42\xcd\x10\x03\xe8\x06\x99\xc0\xbe\xd6\x0b\x64\x7d\x5c\x01\xdd\x6a\x44\x3b\x72\x5f\xca\xcf\xdd\xbb\x01\x52\x6d\xa0\x3b\xe1\x2f\x65\x9d\xb0\x48\x3b\xde\x5a\x0f\x52\x05\xcf\x3b\x00\x4d\x5b\xde\xa1\x3e\x12\x70\x5f\x07\x18\x4e\x86\x5f\x49\xf3\x1d\xdc\xeb\x38\x00\x19\x66\x96\xec\x3e\x62\xae\x16\x06\x5a\x2e\xc0\x72\x97\xc6\x48\x6e\x88\x25\x10\xe3\x1e\x59\x59\xc8\x1e\x18\xc4\xb5\x52\xef\xf8\xac\x2b\x18\xdd\x34\x35\x1b\x5c\xa3\xb5\x14\xe1\xf3\x4a\x9c\x30\x41\xdb\x58\x02\xbc\x0c\xae\x22\x49\xd6\xe5\xec\x9c\xe0\xcb\x40\x7d\x1c\x53\xe0\x60\xba\xf5\xf4\x49\xb0\x30\x8e\x76\x06\x07\x23\xb8\x48\xaa\x7d\x4f\x82\xba\x94\x37\x4b\xb8\x46\x5a\xcd\xe4\x8e\x79\x08\xba\x75\x4e\x8c\xba\x14\x62\xd4\x83\xc4\x41\x82\x61\x1d\x0a\x3c\xdd\xef\xd7\x29\xa1\x4e\xd4\x0a\xc2\x26\xa4\x37\x6b\x02\x15\x53\x3e\xec\x67\xb5\x01\x70\x84\x21\xd6\x2d\xd2\x07\xf1\x18\xd0\x29\x64\xd8\xf5\x8e\xbf\xe8\x82\xb0\x76\xc1\xd2\x03\x48\xcd\x0b\x6a\xb7\xa9\x4e\xcc\x84\x94\x54\xbd\x13\xb4\xd4\xa5\x37\x50\xe5\x0c\xbb\x92\xa7\x1a\x92\x8d\x9b\x7a\x6a\x77\xd7\xdd\xac\xc1\xd8\x68\xa8\x82\x23\x1c\x2b\x89\xf5\x0d\x3b\xba\x01\x8e\xd3\x9c\xad\x80\x84\x2b\x9f\xeb\x87\x0a\x8a\xe9\xfd\x85\x8e\xc8\x98\x45\xad\x2e\x56\x15\xab\xc9\xde\x28\xc7\xf4\xa5\x2d\x31\xc3\x96\xe9\xa6\xb3\x47\xe2\x61\x84\x63\x7a\x5e\xee\x9b\x07\xd4\x13\xdc\x83\xda\xc9\xa7\xd8\x67\xf9\x1d\xee\x4a\x46\x3f\x27\x7d\xb7\x74\x9d\x95\x2e\xa6\x07\x7a\x5f\x2d\x5d\x45\xad\x6c\x4e\x09\xc7\x2d\xf5\x27\xe9\x26\x42\x50\x19\xd9\x58\x8d\xad\xe6\x5b\x12\x21\xc9\x95\xb4\x17\xca\x45\xa9\xc1\xde\xd0\xcf\x0d\xdd\x00\xe1\xf4\x97\x46\x4e\x3c\xdf\x94\xcd\x5b\xc8\x57\x86\x4b\x2f\x6b\xea\x1f\x36\x3f\xbf\x7b\xff\xc7\xc5\x63\x87\xed\x7e\x73\x7b\xfb\xa7\x1f\x6e\x3f\xde\x7c\xda\x7e\xfc\x74\x73\x15\xdf\x6d\x3f\xbc\x8f\xb3\x18\xa4\xef\x58\x32\x82\xdc\xab\xd1\xfc\x35\xce\x6d\xff\xbc\x4c\x3f\x9f\x7d\x5d\xfc\xf5\xe6\xc3\x2f\x37\x57\xb7\xb7\xab\x1d\x58\xf6\x35\xe4\x43\xdf\xc7\x1a\x72\xac\x31\x5f\xf6\x7d\x8d\xf9\x98\x71\xe3\xf3\xaf\xfb\x69\x73\x7b\xf5\x9a\x57\x9d\xe6\xe5\x40\xc6\xc1\xed\xfe\xc3\xed\x97\x02\xaf\xfa\x4d\x96\x70\x37\x1d\x6c\x17\x91\x3b\x2d\xb9\xcd\x8b\x99\xac\xd8\xbf\xdb\xe8\x12\x3d\x96\x50\x0e\xe2\x18\x1e\xf7\x53\x37\xa4\x87\x61\xd4\xf2\x08\x20\xc9\xee\x79\x10\x48\x1d\x85\x46\x48\xe7\x9d\x86\x17\xcb\xd4\x60\x54\x0d\xb3\xaf\x6c\xae\xc2\x5f\xfc\x9a\x82\x9f\x66\xac\xcb\xd9\xe7\x15\xc8\x1e\xa7\x5d\xfc\x4d\xec\x80\x37\xf4\x32\x3f\x4a\x81\x9f\x1e\xa6\xc0\xaf\x0f\x53\xe0\x1f\xfb\x6f\xf1\xba\xd9\x9d\x8c\xd5\x3a\x3a\xb1\xdc\xfa\x50\x05\x0c\xd5\xdd\x75\xec\xc4\x51\x0e\xb2\xab\x24\xc7\x4e\x8e\x4b\x27\xaf\x1f\xef\xe4\xb8\x74\xf2\x32\x00\x77\xd7\xc3\x7e\x51\x2b\xfe\xbc\x1e\x38\xed\xf8\x37\x75\xfb\x57\x27\xea\x5d\xe4\xcb\xfa\x98\xa2\xff\x86\xd0\x43\x0d\x0d\x1e\x96\xbf\x87\xa0\x2f\x3f\x4b\xcf\x28\xf3\x8b\x90\xf3\x02\x0c\xfd\x75\x7d\xc2\x39\x08\x53\xeb\x17\x66\xea\x85\x12\x72\xa8\x24\xb2\x37\xa3\x14\xab\xd8\x67\xc0\x5e\xee\x54\x03\x60\xff\x4a\x50\x64\x4f\x7b\xa2\x53\x09\x6b\x4e\x34\x57\x4e\xaa\xd9\x4c\x72\xc1\x83\x5a\x0f\xa6\xc5\xce\x72\xee\xde\x76\x1a\xe1\x77\xf4\xe9\xf9\xa0\x5a\x81\x54\x68\x4a\xd6\xe3\x31\x7b\x86\x3c\x7c\xef\x29\x45\x25\x84\xc6\x8d\x1c\x95\x60\x92\xea\x85\x55\xc4\xac\xc4\xcb\x97\x83\x87\x3d\xa7\xec\xaf\x57\xef\xbf\x09\xe1\x23\xe2\x1e\xb0\xaf\x90\xf0\xbb\x38\xfe\x18\x11\x6f\xd6\x29\xff\x2e\xd9\xbe\x63\x1a\x77\xd7\xd1\x54\x57\x81\x1b\x3c\xa7\x5d\x64\x79\x05\xde\xc6\xb1\xdb\xbf\xba\xf0\x79\xdd\x8c\x6a\x4d\xfd\x1d\x94\xfd\x87\xcd\xc2\x80\x33\xa9\xe8\xe1\xd7\x76\xf0\x2f\x1f\xe2\x66\xff\xce\x53\xd8\x6e\x71\xf9\x8b\xac\xd9\x66\xb8\x34\x54\x4a\x4d\xb0\xbe\x9a\x99\x14\x06\x68\xd3\x02\xd0\x4d\x93\x0d\xd9\x37\x3d\xb1\x72\x86\x4d\x29\xc4\x47\x4b\x5b\xe2\xa7\x45\x1a\x49\x41\x4c\x93\x54\x2a\x58\x3c\x51\xc9\x54\x1a\x62\x7c\x52\x53\x4f\x84\xd3\x29\x8b\x99\xc3\x8d\x58\x48\x52\x26\x36\x6d\x5b\xf0\x37\x08\x35\x78\x8f\x08\xe5\xe2\xde\x0d\x33\x64\x73\xbd\xda\x36\x34\x2a\x8d\x7a\xdc\x99\xb7\x97\x61\x2f\x73\x34\x4a\xc5\x41\x39\x8a\x15\x10\x97\x0a\x20\x8b\xf2\x12\x69\x2e\x3a\x48\x7b\x8b\xb3\xee\x1c\x29\x29\x52\x14\x44\x52\xc4\x46\xc1\x3d\x7f\x36\x9a\xb1\x27\x64\xe6\x83\x52\x1a\x56\x83\xc1\xd6\x14\x04\xd7\x63\x43\x2a\x64\x14\x45\x09\xa6\x33\xe7\x61\x26\x2a\x6f\x96\x4d\x8a\x5c\x4e\xe2\xbb\x60\x92\xa9\x6e\x89\xad\x45\x3a\xfc\xaf\x19\x91\x8c\xcc\x4a\x08\x6d\xb3\xf9\xb2\xf8\x5f\x98\x4d\x48\x43\xd4\xda\xb0\x57\x82\x30\xf3\x12\xe7\x64\xcd\x1a\x48\xb6\xa2\x66\x5f\x77\x33\xe7\x8b\x22\x7d\x8d\xd5\xa2\x60\x3b\x45\xad\x3e\x12\x05\x7e\xe0\x09\x59\x15\x06\x36\x74\xfd\x8c\x52\x99\x13\x6a\xc3\x52\x66\x1f\x08\x46\xe6\x8c\xd5\x4b\x04\xc3\x2a\xba\x03\xb9\x7a\x7d\x48\xb0\x19\x8d\x05\x5b\x33\x77\x80\x4d\x03\x7f\xbb\x82\x75\x0d\xc1\x5a\x7e\x41\x28\x08\x96\xc0\xd9\x07\x02\x2b\xe7\x9b\xfb\xf6\x9d\x2f\x26\xcd\xf1\xc3\x4a\xae\xd9\x8e\x8c\x65\x7c\xbb\xc0\x48\x6f\xdc\x5a\xb9\x45\xb9\x88\xdb\x5d\x7f\xac\xf7\x28\x21\x2c\xaf\x6a\x8e\x46\x43\x58\x6c\x82\x6f\x5f\x4e\x4e\x8b\xa8\x01\xe0\x11\x80\x17\x90\xe7\xba\x8a\x76\xac\x80\x78\x0b\x06\x25\xad\x11\x9b\xac\x8a\xd0\xba\x5a\x8e\xad\xc7\x2a\xb2\x2f\x34\x1b\xb9\xad\x7d\xd9\x80\x5a\xd0\x28\xe5\x98\x61\x81\x5a\x3f\x5b\xdf\x5b\xd7\x3f\x26\x05\x8c\x1b\x82\x4e\xf5\xcc\x66\xef\x26\x25\xe0\x6f\x75\x9f\x73\x63\xb4\x5b\x93\x45\x32\x40\x19\xc1\x28\xc3\x5e\xa3\x58\xc6\x3f\xa1\xa7\xe0\x63\x6f\x43\x6f\x23\x4f\xbd\xc1\x29\x72\x16\x8d\xd0\x45\xab\x55\x9b\x74\x2b\x7e\x12\x31\xe8\xa7\xb9\x10\xcf\x94\xef\x6d\xa8\x1f\x7f\x9d\x31\x1d\x48\x71\xc4\x54\x3b\xef\x94\xb8\xb6\x03\x75\xb6\x49\x7f\xf0\x7d\x4f\xed\xfb\x22\xeb\xfa\xc3\xfb\x0f\xdb\xdd\xcd\x87\xeb\xaf\x6c\x0e\x24\xac\x23\x73\xa3\x51\xcb\x97\xa6\x6e\x24\xf9\xf9\x1d\xd4\xad\xbf\x95\xba\xf9\x1b\x22\xef\x12\xfc\xf8\x0d\x91\xf7\x35\x44\x5a\x5c\x44\xda\x57\x9a\xd5\xe4\x38\xab\xdd\x7e\x9f\xce\x1e\x4e\x67\xa7\x03\xfe\xc7\x4d\x66\xc8\x7a\x5f\xa8\xb2\xcb\x27\x13\x55\x10\x5a\xf5\x10\xa9\xbf\x9c\x73\xcc\x45\xd8\xa7\x8f\xbb\xf4\x25\x55\xae\x41\x3d\xc1\x4c\xa8\x80\x2d\x1e\xdd\xb1\x71\x6d\x6a\xdc\x33\x75\x20\x8a\x56\xd9\xd9\x0f\xed\x0e\x8e\x4b\xa3\x87\x7c\x5e\x49\x58\x2f\x94\xf2\xa8\xfe\x30\xee\x28\x17\xcb\x0d\x77\x6f\x4f\xae\x6d\x3a\x76\xf0\xfa\xba\x8f\x97\xe0\xaa\x3f\x9a\x15\x9c\x90\x8c\xc3\x8e\xfe\xbb\x00\xfd\xd6\x58\xa1\x5c\x0c\x64\xb2\x74\x24\xcc\x56\x63\x26\xcd\xfd\xee\x9a\x0b\xa2\x44\xd3\x05\x17\x4a\x19\x59\xa2\x18\xfb\x82\x65\x29\xec\x89\x57\xda\xb0\x25\xd1\x2d\x15\xf8\xf7\x72\x25\xa0\xd2\xe7\x82\x5a\x99\xb9\xd7\xea\x2e\xda\xb9\x59\x21\x02\xcf\x9e\x61\xcd\x31\x8b\x74\x7f\x2c\x3e\x3e\x38\x0d\x5e\xa9\x75\x12\xfb\xf1\xcf\x45\x45\x9f\x19\xc7\x2f\x38\x0f\x7d\x1f\xcc\x3f\x7e\x30\x3f\xcf\x99\xff\xbc\xfd\x42\x7c\xf9\xdb\x56\x18\x6d\xde\x0e\x70\x40\xc8\x5b\xca\x99\x29\x75\xaa\xad\xcc\x3c\x13\x49\xe0\x35\x91\xdd\x6d\xa1\xea\x70\xb1\x3c\xb4\x45\x9b\xbc\xa4\xdb\x0c\xdb\x8b\xf5\x1f\xb6\x30\x9a\x29\x05\x26\xd3\x13\x22\xb8\x29\x57\x78\x41\x75\xd2\x9e\xe7\x1e\x9a\x29\x2d\x22\x65\x0a\x5b\xfb\x05\x38\x0c\x00\x9b\xa4\x8c\x85\x9d\x31\x22\xd5\x52\x4d\x25\x50\xec\xec\x61\x37\x62\x46\xc3\x14\xe8\x02\x70\xb4\xb0\x0b\x35\xd7\xbd\xa7\xe5\x97\xd1\xb7\x56\x18\x47\x2f\xa4\x8c\x8a\x4d\x9a\x48\x0d\x9b\xad\x55\x37\xbe\xa7\x78\xdc\x9e\xe3\xd1\x6d\x52\x41\x72\xd3\x26\xee\x95\xac\x55\x81\x4d\x43\x65\xcc\x66\xd8\x84\x09\x7f\x3a\xa8\xfc\xfe\x57\x61\x66\x53\x1f\x05\xe9\x5c\x3d\x15\xab\x94\x6e\x45\x1b\xb5\x61\xdb\x2c\x75\x40\x41\xa4\x0e\xa3\x9a\x18\xa6\x60\xcb\x7e\x22\x9c\x0f\xd8\x36\xb4\xc9\xe8\x44\xa9\x26\x77\x86\x76\x40\xa2\x76\x74\x4c\xb5\xaa\x72\x05\xa4\xb1\xf6\x79\x9c\xd7\xa4\xd9\x35\x81\x3b\xa6\x1f\x96\x1d\x2e\x5c\x48\x25\x54\x1a\x7d\x39\xce\x6b\x9a\x1d\xa9\x32\x63\x13\xcd\x8f\xcb\x25\x9b\x75\x13\x76\xcc\x65\xf8\xc6\x9a\xe9\x27\xd9\xa6\x33\x25\x66\xb9\xe7\xde\x0d\xfc\xa1\x31\x43\x79\x1a\xb4\x0d\x3b\x2e\xef\x6a\x6d\x82\x47\x69\xab\xf3\xb8\x34\xa9\x0d\x23\x18\xec\xbf\xa9\xa2\xe7\x6a\x35\x62\x13\xd3\x25\x84\x7d\xaf\xb1\xb4\x0a\x4f\x33\xa6\x84\x90\x8a\x3d\x2e\x8e\xee\xf0\x1b\x9c\x2a\x95\x42\xc2\x83\x6a\xed\x70\x77\x34\x62\x86\x27\x8d\xf5\x0b\xb2\x9f\x62\x03\xdc\xa9\xc7\xb8\x19\x9e\x4d\x8a\x74\x72\x4e\x89\x46\x74\x78\x49\x8f\x34\x6a\xf3\x13\xa9\x05\x2d\x77\x9f\xc5\x1a\xa9\xd9\xd8\x27\xd3\xf0\xaa\x23\xa2\xa6\x55\xdb\x01\x81\x49\x86\x33\x49\x85\x02\xd2\x01\x40\x32\xe0\x19\x8a\x7e\x9e\x9e\x92\x03\x5e\xba\x7d\x43\xb9\x55\xfb\xac\x7d\x01\x77\x4a\xa8\x4b\x03\xdf\x8d\x6e\xb0\xbc\x59\x4c\x0f\x2b\x07\xca\xd9\x7d\x9c\x2a\x34\x3d\x6b\x61\x52\x90\x22\x1c\xd2\x2b\xc1\xb1\x1f\x4c\xe8\xd9\x81\x4d\xf8\x0e\x82\x4e\x57\xa8\x55\xb1\x06\xdd\xbd\x6d\xd4\xa4\x07\x4e\x34\x6c\x10\x13\x30\x12\x4e\xdc\x63\x00\x0a\x57\x3c\x09\xa5\x5e\x5a\xef\xc1\xd0\x68\xe2\x64\x6f\xca\x4d\xe3\x38\x73\xe1\x81\xab\x9a\xb1\x5c\x8b\x90\xaa\x13\x47\xa5\x65\x9d\x8e\x65\xd9\xfb\xb0\x41\x5f\x47\xa2\x90\x6c\xb5\xdc\x64\x82\x53\xcf\xd2\xf8\x9e\x0b\x86\x5a\x47\x85\x63\xd3\xea\x47\x5c\x4c\x73\x43\x4f\xe6\x45\xe1\x37\xc5\x74\x9e\x48\x96\x83\x11\x81\xfb\xd2\xf9\x4f\xd6\x7c\x84\xa7\x58\x0f\x67\xfb\xac\x0e\xb6\xee\xda\x1c\x98\x06\x3e\xf3\x67\xc9\x9e\xae\x79\x3b\xcf\x86\x10\x84\x5b\x9d\x19\xac\x45\xca\xad\x93\x4c\xea\x95\x1a\x46\xd3\xee\x2e\xce\xff\xb5\x39\xa2\x62\x83\x1f\xc3\xdc\xc6\x75\x07\xf6\x62\x6c\xcd\x8e\xb7\x78\x30\x49\xb7\xe9\x34\x06\x20\xfe\xc7\xea\x2b\xdd\x2a\xc2\x1b\x6a\x28\x24\x40\xb4\x95\xa3\x63\x76\x83\xab\x6c\xc9\x5b\x00\x7a\xb9\x6a\xc9\xae\x9d\x5a\xef\x67\x18\x6d\xa4\x49\x8d\x7d\x1c\xe1\xb6\x27\x47\xb3\x85\xd3\x85\x6f\xf4\x66\xb4\x65\x14\x25\x05\xc4\x57\x43\x66\x36\xca\x0c\x4b\xc6\x3d\x37\xf1\x8b\x71\x2a\xac\x27\x78\xe6\x41\xf8\x5a\x47\x59\x6f\x0c\xeb\x5e\x08\xae\x8c\xee\x6d\xdd\x5b\x39\x1c\x4b\xcd\x98\x90\xb5\xc2\x5d\x40\xf2\x40\xeb\xa7\x6f\x36\x8c\x8b\x31\xc5\xe1\xc8\x73\x22\x76\x77\x37\x9b\x5c\x9a\xc7\x7a\x00\x3b\xc3\xde\xbb\xb5\xde\x8d\x78\x1a\xe3\x6c\xcf\xfb\xc9\xe8\xee\x46\xde\xa6\x03\x32\xcf\x2f\x5c\xf2\x26\x53\x01\x92\x87\x1d\x17\x37\x0e\x2b\x41\x5b\xc5\xa2\x90\x0d\x8f\x0c\x44\xa5\x14\x78\x92\x95\x75\x4f\xbd\x76\x4c\x71\x5b\x77\xeb\x31\x86\x87\x4e\xde\x23\xd5\x01\xc3\x19\x13\x99\x55\xc0\xc4\xb2\xd1\x60\x36\x55\x1d\x67\x2d\xc1\xd6\xb4\x59\x13\x53\x87\xcd\x6f\xb0\xa6\xc1\x6e\x3c\x5c\xc4\x61\xab\x1d\xd0\xc4\x1d\x06\x6d\xd9\x14\xeb\xef\xe0\xc7\x34\xf3\x3a\x89\x35\xb4\xe4\x03\x3a\xc1\xe8\x52\x40\xae\xcd\x7b\xc6\x7a\xb9\x34\xd0\xbd\x55\x3e\x62\x56\x16\x13\x26\x26\xc0\x54\xd4\x8b\xc2\x24\x61\x03\x00\x7a\x90\x61\x57\xee\xae\xd5\x26\x49\x13\xdd\x30\xdf\x7d\x32\x19\xee\x88\x2d\x98\x92\xac\x79\x1e\x31\xa0\xe8\x57\xb8\x72\xc2\x66\x92\x02\x57\x41\x33\x5b\x0a\xb2\x54\x11\xd2\xf9\xad\x10\x1e\x3e\x59\xcd\xd5\x08\x13\x4d\x25\x3b\xef\x30\x7a\xac\xec\xa8\x6a\xdf\xda\x08\x82\xd7\x10\xb8\xe0\x11\x63\x88\x8c\x31\xae\x76\xf2\xb0\xd6\xe7\x8c\xf2\xd8\xa8\x23\x2c\x88\x66\x29\xab\xa3\x9b\x6d\x7d\x06\x72\x6b\x15\xf3\x67\x77\xa7\x79\x29\x7d\x03\x27\x85\x25\xd6\x95\x83\x55\x09\xed\xda\x51\xc9\x8f\x8a\xaf\xe5\xb4\x78\x5e\x68\x6c\x16\x9e\x00\x7d\xa6\x19\xb9\xb0\xa1\x2a\x6a\x6e\x5b\xef\x1a\x2b\x1b\x31\xae\x56\x76\x96\xa5\xec\x2c\xf0\x6e\x5c\xca\xb6\xf1\x41\xd9\x95\xeb\x16\xd3\xaf\x51\x7c\x2d\xae\x17\xa0\x73\xca\xc6\x04\xa4\x7d\xd6\x8e\x64\x4a\x03\x6e\x7b\x66\xca\xd7\x0d\x0d\x1d\xf6\x59\xaf\x9b\xe4\xab\x48\xad\x5c\x86\x89\x0b\xc6\x6c\x61\xb6\x2d\xbb\x6c\xc2\xac\xc5\x79\x90\x94\xb6\xb1\x91\xb7\xcf\xca\x0e\x65\x09\xc0\x2a\x0d\x64\x00\x47\x56\xe1\xe9\xc5\x3f\xfb\xab\xad\x74\x50\x27\x21\x60\xca\xc4\x18\xc3\x1d\xc7\x26\x42\xc5\x4c\x6a\xe7\x0e\xb9\x3d\xe5\x33\xee\x35\x21\xe1\xf5\xb0\xfe\xc4\x4b\xcb\x14\xdd\x26\x20\x40\x69\xb3\xff\x51\x95\xa3\xe1\x23\x45\xfe\x9a\x7f\xfc\x7d\xe1\x30\xdd\x84\x20\x10\xf1\x32\x6f\x6d\xb6\x41\x87\xf8\xfa\x47\x9c\xa9\xe8\x4b\xf1\x4e\x6a\xdd\x55\x44\x38\xd8\x51\xb7\x89\xad\x34\x77\xa9\x81\x8c\x37\x1e\xc2\x2c\x00\x21\xd7\x78\xc2\xff\x40\x04\x0c\xe8\x5d\x0d\x6e\x95\xd5\x79\xd6\xcc\x06\xe3\x3e\x01\xb7\x0c\x78\x1b\xf6\xe2\xde\x61\xd9\x84\x6f\x86\xa3\xd3\x10\x18\xfd\x5c\x06\xf2\xb0\x5b\xa7\xc8\xe8\x77\xd7\xb1\x62\x90\x00\x67\xb4\x15\x6a\x70\x7c\x36\x2d\xb3\x47\xea\x05\xc9\xe3\x6a\x85\x53\xb7\xba\xcb\x27\x3a\xcf\xc4\x5e\xad\x1d\x91\x45\xd1\x74\xd3\x0d\xd4\x9f\x12\xe6\x1f\x1f\xf3\x86\x65\x1e\x80\x9b\x6d\x91\x4a\x37\x87\x14\x9b\x0f\xc6\xe8\x35\x0e\x2b\x21\x0a\x55\x5e\xe5\x9c\x5d\x82\x5f\x12\x26\xbe\xea\x6e\x64\x05\x0b\x2c\xa6\xde\x55\xe3\xc6\x90\xa9\x95\x1a\x06\x75\xed\x7e\x7e\x1c\xc4\xbf\x8e\xf4\xa4\xa1\xf3\xad\x2c\xa0\x76\xea\xe2\xbe\xe8\xb9\x1c\xdd\xb9\xeb\x30\xca\x55\xa7\x69\x28\xfc\xc0\x47\x82\x5e\x60\x9a\x8c\x5d\xe6\xa6\x26\xd6\x0b\x26\xa9\xfb\xe1\xb3\x3c\xad\x13\x1e\xe5\x24\xe4\x95\xa7\x34\x1d\x6a\x5a\x7e\x71\x09\xa9\x53\x42\x0a\x57\x13\xf6\x7e\x02\x5d\x99\x10\x65\x88\x55\xb7\x24\xbc\x37\x45\x11\xb2\xb1\x76\x4a\x79\x8b\xc1\xe0\x64\x73\x34\xd2\xd8\x53\xcb\x82\xf5\x3a\xf1\x78\x5e\x2a\x46\x54\x3d\x53\xb3\x19\xb9\x67\xcf\x64\x4c\x0d\xd6\x54\xab\x34\xc0\x07\x32\x36\xd4\x4a\xb3\xcf\x1a\xd6\x64\x23\x5e\x2b\xd5\xa1\xf6\x39\x6a\x5e\x58\x6f\xdd\x62\x9e\x99\x62\x00\xa6\x99\xf5\x4c\xb5\x97\xe5\x6a\xca\xee\x80\x79\x07\x4f\x44\xed\x73\x8e\xec\x76\x5f\x06\x8e\x7e\xaa\x40\x31\xdb\x98\x41\xe0\xc6\xc1\x71\xbf\xc4\x81\x0a\x53\x87\xed\x35\x04\x13\x49\xd1\x81\xa2\x5b\xf3\x24\x89\x24\x92\x3d\x3a\x42\xb9\x21\xde\xce\x0c\x11\x81\x65\xa9\x90\x4a\xad\xfb\xe8\x65\xe8\xb7\xd0\xcd\x90\xa4\xce\xfd\xf5\xba\x19\x7f\x70\xdc\x53\x4c\x00\x08\x45\x24\xb5\x51\x10\xa4\x71\xc5\x74\x60\x85\x6b\x87\x14\x4f\x00\xf2\xcb\x94\x4c\x21\xad\x94\x1a\x65\xb3\xe8\xdc\x08\x4e\xca\x3e\x85\x74\x54\x0a\x78\x62\xae\xd2\x98\x44\x27\x66\x32\x7d\x26\x6f\xac\xf1\xf6\x59\x7d\xb2\xcd\x90\xcc\xa6\xa9\xce\xa8\x0f\x9f\x6d\x49\x44\xa0\xbd\xd8\xc9\x86\x6a\x3b\x75\x4e\x85\x10\x46\xd2\xbe\x31\x0f\xeb\xe2\x62\x83\xa2\xc4\x08\xa6\x00\xf5\x22\xda\x4d\x90\x7a\xdc\xa3\x8e\xc4\xf5\x2e\xc8\x38\xca\xf0\xd1\x63\x63\xf3\x71\x5a\x8a\xcd\x87\xa4\x43\xb7\x73\xee\x15\x33\x16\x4d\xcc\x53\xcb\x4c\xb9\xcb\x9e\x86\x16\x0c\x2e\xa9\xb5\xb6\x52\x37\xb5\xb1\xc3\x17\xd5\x2c\x35\xd3\xb6\x1b\x50\x22\x72\x6a\x54\xd9\x97\x8d\x07\x34\x6e\xb2\xfa\x57\x32\xc3\x80\x1b\xfc\x29\x61\x7a\x89\x19\x05\xd2\x49\x15\x46\x7c\xb5\xa7\x4c\x29\x83\x31\xb9\xf2\x4d\x43\xb4\xfb\x00\xce\x81\x1f\x16\x07\xe4\x82\x29\xd9\xac\x98\x9a\x2b\x80\xb9\xa0\xfc\x0b\x42\x6c\x1b\xa9\x71\x43\xcb\xd6\x54\x4a\x45\x61\x3b\x59\xb5\x4c\x19\xcb\x64\x26\x81\x7d\xe3\x63\x70\x09\xe6\x54\x58\x55\x6d\xce\xa5\x46\xed\x62\x2d\xeb\x7b\xa3\x3a\x53\xb2\x6c\x44\x99\xf2\x5a\x3d\x6b\x50\xaa\x98\x7d\x6b\xf5\x58\xb7\x25\x3c\x0e\x06\x44\xb3\x16\x69\x0d\x32\xc9\x6e\xba\x1b\x0f\xa0\x7f\x87\x02\x8d\xdb\x8f\xa7\xd2\x43\x6d\x44\x8b\x09\x70\x0f\xdb\x00\xa8\x27\x8d\x52\xec\xc4\xbd\x4b\x66\x78\x26\x57\xa4\xdc\xcc\x26\xf9\xb1\xd2\xde\xa2\x8f\xb2\x8e\x6c\xbc\x33\xfc\xcc\x6e\x71\x85\x76\x30\x81\xd9\x1a\x55\xec\xfd\x40\x5f\x49\xd5\xb9\x66\xa8\xcf\x56\xd3\xa3\xbd\x98\x50\x71\x75\x49\xcb\x40\x58\x64\x4b\x05\x32\x46\x8c\x6f\x72\x21\x85\x2a\x6f\xc2\x10\x0a\xab\x55\x03\x5c\x5c\x60\x24\xda\x7b\xbb\x55\x39\xb3\xd5\xc1\xe3\x5a\xfc\x60\x05\x01\x74\x1c\xb5\x81\x15\x6e\xbf\xe7\xec\xeb\x04\xe2\x50\x26\x8d\x6d\xfe\xdd\x98\xe9\x57\x82\x1f\x17\x7b\xc8\x86\x03\x7a\x59\x07\x6e\x4a\x2f\xe5\xd8\xbd\x66\x66\x50\x1e\x47\x60\x4d\x46\x1c\xaf\xb5\x00\x56\x35\x0a\x41\x24\x62\xf3\xbf\xc2\xc5\x24\x33\xbc\xe9\xd9\x77\x73\xa2\x87\x06\xd9\xf4\x2a\xaa\x1b\xeb\x5f\xfb\x1c\xfd\xb6\x5d\x8d\x41\xea\x74\x3f\xcc\x2b\x10\x34\x60\x95\x0c\xe3\x74\x50\xf5\xcd\x11\x67\x96\xee\xaa\x23\x20\x50\xcd\xd8\x6a\x26\xc3\xb1\x81\x83\x00\x10\xca\xb5\x52\x6e\x85\x4a\xc1\xea\x24\xd0\xa5\x99\x1a\x1f\x4c\x57\xce\x3b\xb3\x77\x60\xc6\x00\x76\xb9\x34\x9b\x0e\x30\x40\x10\xef\x2a\x13\x89\x45\xea\x86\xc9\x97\x86\x56\x5c\x07\xb8\xc6\x2b\x56\x66\xd8\x23\xab\x56\xe6\x17\x80\xc9\xe8\xd4\x6c\x6b\x73\xe5\x2c\xd7\xe1\x27\x35\x59\xf7\xc8\x10\xb3\x56\x60\xac\xac\xb3\x43\x65\x84\xfa\x8c\xa0\xd4\xc6\x72\x5c\xae\xc1\x6c\x01\x31\xeb\x0c\x96\xc2\x4a\x44\xa4\x61\x64\xd8\x60\xb1\x58\xf3\x23\x36\xa2\xb4\x88\x9f\x20\x7c\xce\x4e\x52\x87\x8c\xd7\x4a\x2d\x57\xc8\xd5\xa6\x94\x47\x76\xf4\x97\x61\xda\x6d\xbf\xbb\xb6\xd9\xae\x53\x35\x73\xd1\xa4\x78\x71\xa9\xdd\xac\xbb\x28\xb5\x9d\xd1\xd9\xd6\x1b\x8b\x88\x37\x57\xfb\xb1\x10\xb3\x28\xb8\x1d\x19\x55\x89\x4d\xc0\x63\x81\xb1\x35\x24\xd7\xd2\x25\x12\x92\x92\x23\xfe\x58\x0f\x49\x83\x62\x8d\x5d\xb2\xec\x02\x02\x21\xfc\x19\x2f\x82\x71\xec\x53\xf1\x5a\x34\xd6\xe0\x20\x0f\x64\x4c\x71\xbe\x16\x2d\x53\xb5\x76\x32\x6c\xbc\x67\xaa\x29\xc7\x42\xb9\x21\x63\x7a\xf6\xc2\xe7\x40\xb9\xf2\xdc\x74\x8f\xb5\x69\x4a\xdc\xcd\x76\x68\xf6\x59\x6f\x61\x50\xb8\x53\xf2\x70\xa3\x0c\x0a\x0b\x20\x1a\xb9\xe9\xce\x06\xc6\x6c\x02\xd2\x75\x41\x11\x56\x18\xe2\xdc\xb1\xcf\x86\x57\x4c\x6b\x82\xb3\xe9\xf8\xa6\xef\xb3\x43\xc1\x20\xd0\xbd\x70\xc4\xf9\x76\xe2\x34\x4c\x85\x5f\xa1\x59\xc4\xa5\x17\x17\x0b\xa2\x1c\xb9\x6d\xf6\xbc\x29\xfc\x19\xc1\xe7\x19\x19\x0f\x97\x7a\xa0\xdf\xb6\x8b\xa5\xe0\x4d\x99\xf5\x30\x15\x14\xf5\x48\x48\x85\x5c\x53\xbe\x18\xa4\xd5\x34\xd1\xe2\xe6\xcf\x52\x8d\xbe\xd4\xc2\xe4\x22\x6a\xe1\xd3\xec\x22\x9d\xb1\xdb\x3d\x66\x35\x2a\x1e\xe6\xe4\xd2\xbb\xfa\xf4\xe9\xa4\xe6\x3d\xde\xb1\x36\x01\x00\x07\x1b\xe9\x3d\x03\x7a\x1d\x03\xb4\xf5\x79\xc2\xd4\x80\x06\x62\xb0\xae\x02\xb4\xfd\xa8\xc3\x91\xe1\x01\xde\x14\x8d\xa3\xa3\x09\x29\xa8\x53\x42\x05\xc0\x31\x1e\x82\xe9\x92\x0e\x6b\x08\xbc\x1a\x5d\x99\xf3\xc4\xe6\x1c\xdc\xb1\x7f\x69\x6c\x88\xec\xf3\xd0\x68\xb2\x76\xa0\x0a\x83\x9e\x2b\x4c\x16\xc4\x0b\x99\x48\xcc\xa4\xd6\xf8\x0e\x0d\x2c\x83\x09\x30\x1a\xd3\x60\xc6\x08\xd4\xde\x11\x47\x6a\xd3\xb0\x31\xd9\x30\xdd\x3f\xb5\xbb\x6b\x2b\x10\xcb\x54\xbd\x6c\xa3\x31\x27\x36\xac\x87\x11\x24\xc2\x27\x4a\xaf\xb1\x23\x10\xc8\xcf\x33\x75\xb3\x76\x63\xc3\xfa\xbf\x89\x1b\xb3\x25\x06\xc7\x8c\x00\x43\x0f\x5d\x84\x26\x62\xa6\xa5\x4d\x23\x10\x36\x39\x55\xc7\x38\x87\x8f\x9a\x19\x17\x03\x41\x80\xb0\x25\x46\x9f\xe7\x46\xa2\x1d\x46\x50\x1a\x05\x93\x0a\xd2\x5f\x62\x9f\xc6\x43\x5c\x31\x01\x9b\xd6\x23\xa6\x9e\x0c\x2a\xf2\x72\x12\x0a\xb7\x44\xee\x3e\xdd\x5c\x7d\xc9\xcd\x50\x86\xb1\x0f\x38\xff\xbd\x52\xb5\xbe\x00\xb6\x02\xd8\x36\x0a\x65\xec\x6f\x77\xdd\x68\x12\x64\xf9\x5e\xfe\xa6\x19\xa8\x36\x6f\x28\x60\x65\x44\x9d\x1a\xb5\xc7\x4a\x1d\x9d\xaf\x6d\xd8\x39\x00\x48\x3c\xa6\x1e\xe8\x95\x80\x8e\xef\xc6\x20\x46\x16\x36\xe5\xed\x95\xd2\xb0\xb3\xe1\x80\x06\x45\xcd\x1a\xec\xcd\xa3\x02\x8f\xa7\x41\xa9\x8c\x86\x08\xd4\x25\x1d\xb3\xaf\xe5\x24\xac\xfd\x39\xf2\xec\x28\x88\x1f\x8c\x4a\x59\x2f\x1a\x92\xaf\xe4\xbd\xd0\xe0\x6c\x86\xa9\x96\x37\xa3\x33\xe5\x9a\xc3\xf2\x77\x2e\x69\x79\xa6\x0a\x9b\x46\xd9\x0c\xa3\x72\x6f\x25\x83\x3d\x28\xba\x6a\xf0\xec\x0c\x66\x74\x22\x40\x6b\x66\x88\x1f\x26\xed\x90\xfb\x53\x01\x7b\xe2\x3f\x3a\x1c\x24\xf8\x38\x1d\x23\x4e\xfe\x47\x4a\x7d\xfc\xa5\x3e\x33\xde\x3f\x5f\x1d\xe2\x87\x5f\xbf\xd4\x66\xdb\x92\x3a\xce\xa6\xb4\x03\x02\x66\xfb\x3e\x2a\x30\x2c\x49\xbb\x0d\x5d\xe9\x00\x1c\x4f\x7c\x29\x48\x92\xdd\x04\x28\x2b\x08\x98\xa7\xde\xa8\x97\xcb\x4a\xb5\x94\x8b\xf9\x1a\x63\xc8\xec\xcb\xbb\x72\xc1\xc9\xe4\x4f\xc8\x07\x21\xcd\x79\x1f\x0b\xc1\x15\x42\xdb\x45\x0e\x50\x86\x0e\x6a\xbc\xb3\x47\x01\x58\x69\xce\x87\x58\x49\xfa\xde\x04\x92\xbb\x90\x1e\x5d\x05\x3e\xdd\xec\xff\xe7\xff\xf8\x75\xf3\xee\xfd\xc7\xf4\xff\xee\xdf\xbd\xbf\xda\xdc\xfc\x2f\xeb\xb4\x9f\xaf\xfe\x7e\xfb\xef\xff\xe6\x3f\xfc\xff\x6f\x36\x3f\xbf\xbb\x7a\xff\x31\xbc\xfb\xf9\x4f\x3f\xdc\xbb\xf5\x87\xf0\x1f\xfc\xa7\x1f\x98\xa9\xfc\x10\xfe\x65\x67\x83\x46\xed\x3f\x84\xff\x90\xf5\x57\xf9\xd3\x0f\x66\x3b\xc9\x0f\xe1\x97\xf9\x9a\xff\xfd\xfe\xdd\xc7\xdb\x3f\xfd\xf0\xe9\xf6\xea\xe6\x6f\xbf\x6e\xb6\x57\xff\xcf\xfb\xff\x7d\x7b\xf5\xc3\xbf\xff\xdb\xed\xc7\x0f\xbf\x06\x3b\xf8\xb0\x60\x0c\x5b\xff\x0b\x36\xbe\x71\xed\xc3\xdf\xff\x7e\x7b\xf5\xf1\x4f\x3f\x10\xd7\x1f\xee\xdf\xc8\xb9\xa7\xbf\xbc\x79\x7c\x63\xc9\x0f\x6e\xcc\x67\x83\x7f\x2c\x8f\x6f\xec\xf2\xe0\xc6\x52\xc6\xd9\x8f\x67\x8f\x6e\xe4\x87\xb7\xfd\xf8\x26\xfd\xf8\x57\x50\xd9\xfd\xbe\xfa\xf7\x7f\xfb\xff\x79\x17\x7e\x86\xfa\xbe\xf0\xd6\xfd\x7f\x19\x12\x7c\x85\x80\xfe\x46\x16\x8b\x94\x8a\x06\xce\x26\x5f\xcf\x32\xf0\x1d\x4d\x43\xe8\x88\x90\xef\x66\x70\x2c\x27\x6d\x42\x0f\x04\x9e\xd8\x4b\x58\x79\x1c\x10\xd2\x33\x20\x17\x5b\x6c\x99\xb8\xf4\x58\xb1\xfb\x93\x49\xd8\x64\x32\x0b\xbf\xa1\x52\xca\x11\x03\xd2\x8a\x4c\xcc\x41\xb7\x13\xf7\xcc\x71\x1e\x00\xc6\xcd\x65\xc0\xc3\x15\xce\x57\x17\x8d\x52\x0f\x83\x38\x23\x2b\x78\x51\x13\xe6\x5a\xef\xae\xd9\x31\x26\x4d\x5d\x82\xe9\x23\x05\x50\x2e\xa6\x6e\x36\xca\xc3\x14\xdc\x66\xd6\xbc\x47\xcb\xd7\x86\x09\x67\xd7\xa8\xf1\xc5\x4c\xf9\x6f\x3c\x6c\x4a\x09\x70\x4a\x10\x8d\xa9\xc0\xf5\x55\xe0\x84\xe4\x8c\xdf\xa5\xc7\x46\xb9\xe1\x3c\x67\x3b\xaf\x63\x02\x4a\xc1\x8d\xa9\xb0\xcd\x40\xee\xed\xea\xa7\x58\x99\x9c\xb3\x56\x1a\xd8\xa3\x2a\x05\x13\x3e\x3c\xb8\x86\xf5\xd6\x3c\xef\x0e\x18\xf4\x32\x28\x8c\x13\xce\x4f\xef\x3e\xfe\xf4\x69\xfb\x8f\xab\x8f\xdf\x80\x4b\x85\x10\x03\x6e\x5e\x74\x43\x35\xd3\x3a\x1f\x9a\x9a\x44\x22\x7b\xee\x36\x08\x46\x11\x0f\xae\x1b\xbf\xb5\x6c\x63\x59\x4b\x45\x70\xeb\xd8\x20\xba\xbb\xe6\x63\xa2\x4a\x11\x2a\xf9\xbc\x50\xc9\xba\x31\x6d\xce\x3e\xcb\x45\xf8\x9a\xb5\xa4\x17\x62\x03\x88\xb5\xd9\x0d\xb0\x2c\xaa\xf4\xd5\x86\x55\xac\x1b\x8c\xbb\xeb\xe6\x59\xc2\xcc\xc2\x95\x1d\x12\xcc\xec\x6d\x0c\x62\xa1\xd6\xeb\x79\x27\xd8\x25\x09\x5b\x0d\xad\x9f\x2e\xd4\xd7\xae\x7f\xfd\xeb\x3d\x10\x1a\x49\xd4\x33\x36\x36\x4b\x3d\x67\xa5\x91\xf7\x11\xde\x43\x78\xf4\x7c\x50\x4f\xd5\x68\xad\x0b\x7e\xca\xd9\xaa\x5e\x91\xa6\x6d\x5a\x30\xa5\x98\xd6\xb8\x33\x9d\xa1\xde\x6f\xb4\x19\xb1\x70\x09\xcd\x70\xec\x69\xd1\xb4\xac\xd1\xfe\xd0\x39\x0d\x0e\x8a\x3e\xab\x55\x1a\x65\x99\xd4\x12\x49\x56\x9f\xd6\x90\xb3\xe9\x95\xd3\xda\x71\xea\xea\x3f\x3c\x9c\xe3\x8a\x9c\xbd\x3c\xd1\x1c\x7b\xf8\x55\x13\xcd\x91\xf8\xbf\x11\xc9\xf9\xdf\x9c\x03\x3e\x2b\x89\xfe\x5e\xbe\xa8\xa2\x49\x52\xb2\x23\xb2\x6e\x1d\x96\xad\xc0\xd6\xef\xbe\x5e\xc1\x0b\x36\x45\xa9\x7d\x53\x2a\xb5\xdc\xc2\xfc\xe3\xc6\x76\x01\xd8\x84\xba\x23\x77\x05\x86\x10\x65\xb6\x19\x29\x22\x98\x9c\x09\xe6\x66\x66\xc4\x90\x07\xa5\xe1\x79\x7d\x91\x52\xb7\x01\xf0\x2a\xd9\x8f\x7d\xc9\xcb\xcb\x82\x1f\xe1\x2a\x86\x35\x31\x01\xfa\x0b\x6c\xbc\xac\x11\x3e\xe4\x66\x07\x98\x19\x91\x81\xb9\xec\xdb\x2c\x95\xc9\x54\x12\xf7\x19\xe2\xd1\xa2\xbb\x6a\x30\x09\xee\x35\x8b\x81\x59\x63\x46\xf6\x38\x12\xec\xb9\x8d\x06\xa8\x14\x8e\x48\xf5\x66\x46\x40\x61\x40\xd1\x20\x99\x0a\x7c\x6e\x7b\x5e\xb6\x31\xd9\x97\xfe\xb1\xda\x8c\x20\x76\x2d\x3e\x13\x4b\x97\x89\x7c\x64\x12\xc8\xac\xe4\xae\x65\x6e\x74\xe6\xb9\x40\x55\x28\x77\x2c\xa3\x14\x40\xbc\x54\x19\xd4\x3c\x3d\x1a\x36\xbf\x1b\x9a\xd7\x1d\xa1\x49\xa1\xf3\x78\x06\x3a\xcc\x5d\xbe\x96\x0a\x60\x62\x5f\xf3\xe4\xd4\xb1\x16\x8c\xed\x25\x78\x65\x03\x11\x24\xa9\x99\x3c\xc8\xec\x81\x64\x6d\xbd\xc7\x4c\x12\x2b\x35\x40\x34\x55\x41\xb2\x0f\x37\x07\x03\x03\x35\xac\x50\x85\x4d\x58\x93\xcd\xb7\x1d\xe0\x17\x10\x5e\x00\x3f\x29\xa6\x60\xd8\x10\xf4\x6e\xdd\x88\x05\xda\xe4\x28\x26\xad\x92\x60\x93\x93\x07\xe5\xd2\xdf\x0c\x1a\xcd\x74\x87\xd1\x56\x2c\x05\xa3\x82\x1e\x56\x28\xb1\x20\x27\x50\x5c\x9b\x41\xa3\x98\xb6\x37\x56\x37\x4a\x38\x86\x04\xc7\x55\x81\x3b\x77\x4a\x99\x1a\x5c\x15\x06\x3b\xa8\x80\x34\x75\x17\x28\x1e\x13\xb1\x4e\x61\x76\x4a\x8b\x66\xf2\x6d\xb4\x00\xd7\x69\xfe\x59\x3d\xf2\x6a\x04\xc0\xd6\xd6\x98\xb4\x21\x86\x81\x46\x05\xd4\x21\xa2\x90\x07\x39\xce\x66\xc4\x62\x6f\xc2\xae\x9c\x12\x3a\x92\x0b\xf6\xe1\xb1\xfe\xe8\x5b\xa8\xc9\x9d\x5b\xb0\x3a\x45\x49\xb0\xef\xd4\x7d\x69\xa8\x5a\xef\xb4\x12\x69\x8c\x0a\x67\x0b\x40\x06\x21\x60\xcb\x88\x4d\x6a\x86\xdf\xb8\xd1\x60\x53\x1f\x1e\x62\xb0\x83\x47\x4e\x64\x4f\xad\x89\x45\x16\x62\xf8\x8c\xa4\xc5\x21\x92\x49\xb3\x6f\xe9\xe7\xda\x7d\x23\x4e\xb0\x74\x3e\xe0\xa3\x51\x29\xf7\x0c\xec\x8d\x56\x99\x8a\x67\x8b\xae\xa6\x45\x63\xcb\x0f\x3b\xd5\xee\x24\x9e\x90\xb5\xb2\xb9\x2b\x94\x30\x32\x60\x64\x0f\xba\x28\xc5\xb3\xbd\x21\x0f\x28\x56\xcb\x6c\xdc\xd3\xc0\xaa\xae\xbd\x64\xa3\x36\x80\xc1\x8f\x73\xad\x0d\x7c\x6e\xcc\x5f\x00\x60\x35\xf1\xab\x4c\x86\x30\xac\x70\x48\x68\x4d\xd9\x15\xc0\x36\xb2\xbb\x02\xf6\xec\x28\x4a\x6d\xd3\xd5\x44\x67\x98\x7f\x56\xdf\x35\xeb\xb7\x3a\x02\xab\xd0\xd0\xe5\x8f\xcb\xdb\x4c\xca\xae\x4c\x3a\x26\x91\xf5\x24\xf6\xae\x14\x3e\xf4\xc8\x28\x93\x31\xb6\x9c\x99\x0a\x8a\x55\xe0\x18\x31\xf6\xec\xa1\x40\x66\xf6\x15\xb3\x84\x68\x03\x5f\x4f\x84\xfb\x41\x91\x4c\x1c\x2a\x55\xb8\xaa\x02\xa4\x31\x17\xaa\x59\x67\xb6\x9f\x8e\x34\xdc\x52\x87\x69\x1d\xf0\x3d\x14\x6c\xee\x97\x02\x88\x4b\x20\x64\x24\x78\xf8\xda\xf3\xb5\x23\x4a\x06\xf5\xad\x65\xaa\xba\xc6\x39\xb1\x82\xd2\x4a\xcf\x6f\x60\xf5\x06\x3f\x4e\x56\x90\x20\x0e\x87\xe7\x40\xf5\xa7\x50\x7a\xe0\x1c\x09\x7e\x5c\xb6\xf0\x9a\x56\x63\x65\x3d\xd9\x38\xff\x51\x53\x92\x3f\x3f\x35\x9b\x7c\x71\xc3\xf1\xfb\x94\xf2\x7d\x4a\xf9\x3e\xa5\x7c\x9f\x52\xbe\x4f\x29\xff\xad\xa6\x94\xcf\x5a\x29\xbf\x6c\x7f\xfd\x92\xfb\x20\x4a\x95\x43\xa3\x91\x74\x47\x35\x95\x3d\x53\xf3\x28\x55\x48\xce\x12\xb1\x04\x60\xa4\xaa\xc1\x8f\xb3\x19\x66\xe8\x21\x8a\xb2\xd3\xd0\xe3\x78\x53\x05\x12\x71\xae\xfb\x4c\x5a\xe0\x45\x70\x6b\x26\x26\x1c\xee\x7c\xe8\xa4\xe5\x8d\x02\x0e\xce\x8f\xfe\x60\xa1\x3e\x1a\xe0\xd4\xe0\xd0\x7e\x12\x2b\xfc\xe3\x1b\xcd\xb9\xdc\x47\xd2\x1d\x00\xca\x1f\x24\x99\x37\xee\x09\xbd\xf8\x43\x7b\x72\x6a\x23\x29\xab\x9c\x00\xfc\x5b\x7c\xe5\x4a\x9f\x28\x96\xa9\x74\x01\x95\x8e\x03\x69\x86\xd7\x71\xf7\xd4\xf4\xf3\x8e\x64\xf7\x73\x39\x37\x11\xb9\x87\xcb\x9d\xe6\x7a\x10\x2a\xbd\xef\xfd\xdb\x0e\x37\x6c\x4c\x3c\x4b\xf0\xa3\x93\x46\xc6\xe6\x39\x27\x3a\x41\xf1\xff\x1f\x2a\xbd\xfc\x55\xef\x35\xa7\x51\xb1\x09\x66\x90\xd6\xe6\x2f\x3b\x44\xeb\x3e\x3d\x6f\x54\xe0\x09\xad\x98\x42\x56\xd3\x79\x40\x54\xea\x3e\x5a\x77\x7b\x21\x33\x0d\x06\x36\x7b\x4d\x36\xa4\xba\x29\x68\x9b\x1f\x97\x0a\x65\x38\x33\xb0\x9c\x2c\x12\x65\x7d\xd3\x4b\x7e\xa2\x42\x9d\xa4\xf2\xe3\x66\xc5\xf9\x96\x44\xa9\xee\x05\xe1\x36\x76\x94\x07\x7d\xc7\x9e\x37\xb9\xf8\x1c\x56\x4e\xee\xcc\xf6\xce\x64\x4a\xc5\x12\x96\xe1\x4c\x83\xdd\xa4\x13\x07\xc5\x3f\xff\xf9\x2c\x95\x27\xf9\xe1\x1b\x59\x3c\x61\xa5\x56\x24\x74\x53\xa9\x76\x48\x7a\xa0\x58\x26\xd5\x93\xc0\xe4\x42\x23\x2b\xa9\x22\x34\xc2\x11\xc6\xf3\x82\x10\x0e\xc1\x48\x09\x7b\xc9\x59\xc9\xf5\x87\xa2\x34\x06\x62\x62\xb1\xe7\x9a\x86\xa7\x24\xc1\x86\x6e\x52\xeb\xe4\x06\x6a\x68\xba\x52\xbb\x78\xb4\x07\xc2\x88\xb9\x96\x79\x5c\xe4\x4d\x87\x46\x62\x42\xdc\x86\xa6\xce\xe3\x32\x8f\x0b\x96\x75\xc5\xc1\x55\x01\xe8\x2e\x5b\xd3\x9a\x58\x8c\xf6\x14\xee\xb0\x7d\x98\xea\x20\x46\x9a\x9a\x0f\x94\xf2\x7e\x02\x8e\xa7\xe2\xbf\x6d\x99\x04\xf1\x7a\x88\x11\x18\xb5\xcd\x53\xab\xc8\xe6\x71\x9d\xd6\x8b\xa5\x1f\x8c\xa3\xc0\x97\x1c\xfc\xb8\x54\xbb\x14\x63\xe1\x3c\xee\xde\xaa\xc9\xe4\x00\x87\x50\xa4\xad\x80\x5e\x00\x7e\xd3\x80\xc3\x42\xdc\xea\x08\xbb\xdd\x2a\x25\x65\xef\xf8\xf3\xa2\xb3\x8e\x42\x3a\xdc\x11\x1a\x09\xef\x3b\x12\x7a\x66\x80\x2f\xeb\x30\x66\x19\x88\x44\x1c\xfd\xd8\xaf\x39\x56\xca\xc8\xc8\xd3\xba\x1f\x56\x01\x53\x21\x5f\x90\x65\x26\xfb\xb4\xe3\x30\xfc\xba\x69\x48\xd8\xdf\x66\xda\xfe\x84\xcd\x77\x85\xaa\x5a\xfd\x55\xc3\x0f\xab\x4e\x8e\x55\x2b\x4d\x95\x86\x9a\x30\x3d\xae\x7e\x21\x9c\x49\x51\xa9\x32\x8f\x73\xce\xcd\x79\xee\x26\xcc\x52\xd3\x6b\x27\x93\x77\x1f\x77\x9f\x7e\xfa\x06\x56\xde\x97\x34\x96\x6d\xc9\x7d\x58\x86\x07\xea\x4b\xc9\x5b\x13\xb9\xc5\xc8\xb5\xd7\x12\x3a\xe5\xa6\xa1\x52\xcf\x23\xd8\x3c\x4e\x05\xce\x2f\xb5\x67\xf7\x39\xc5\x89\x3a\xce\xa7\x20\x18\x8e\xe1\x01\xe3\x19\x33\xcc\xf2\x48\x36\xad\xb7\x2e\x54\xe1\x02\x5e\x07\x82\x73\x4e\x4f\x31\x55\xf1\x8c\x9a\x42\xde\xfb\x93\x13\x1a\xc9\x63\x17\x91\xab\x1b\x0b\x9f\xcb\x49\x98\xb9\x74\x9a\xdb\x4e\x9e\x86\xb6\x9e\x9e\x1b\xef\xb8\x45\x06\xbf\x6c\xa3\x4f\x04\xe4\x0f\x36\xc5\x1e\x3e\x26\xb5\x66\xca\x5e\x9e\xe9\x2e\xd0\x73\x9b\xe7\xdb\x77\x63\x47\x11\xd3\xc1\xf0\x78\xd4\x19\xdf\x91\xaa\xa3\xe3\xb2\x98\x7e\x2b\x70\xf6\x36\x1b\xd0\x5a\x6a\x4d\x07\xe6\x23\x76\xdf\x55\x81\x6f\x9d\x20\x4a\xec\xf2\x9c\x47\xa8\xc3\xa3\x09\x78\xf6\x00\x76\x48\x85\xdf\x0c\x77\x0e\xb8\xe7\x1a\x10\xaa\xa3\x46\xf7\x32\x77\xce\x9a\xcd\x39\x0c\x6f\x93\x54\xa6\x11\x37\xa0\xb1\x65\x88\xb0\xa6\xee\x83\x74\x72\x4a\xc5\x13\x7f\xc3\xb2\xb4\x79\x41\x81\x06\x00\x47\x12\x36\xb3\x90\x1a\xc3\xaa\x94\x09\x12\x3b\xcf\xd1\x1a\xf0\xb6\x43\xf3\x66\xb3\x4a\x7b\x42\xde\xd6\x6a\x6c\x93\x0a\x4c\x1a\x84\x48\xd5\x66\xec\x23\xf6\xd7\x04\xde\xe8\xd3\x83\x0f\x94\xe0\x3e\x19\x75\x39\xed\xd3\xe9\xab\x01\x47\xa1\x0c\xa3\xa3\x46\x3a\x4c\x17\x18\x0e\xa2\x57\x1a\xa8\x2e\x1b\x8b\xce\xb3\x61\x6a\xd1\x99\x4c\x7a\x3d\x81\xef\x0f\x27\xf3\x16\x57\x2e\xfc\x38\x2c\x7c\xb2\xde\xb7\x32\x75\x7d\xe7\xbf\xef\xfc\xf7\xdf\x92\xff\x5e\x9a\xff\xf6\x9b\x2f\x35\xff\x39\x7a\x22\x8d\x82\x7c\xe1\x43\x2e\xe6\x5e\xeb\xc0\x26\xab\xc0\x8d\xa0\x52\x45\xd8\x41\x17\xb8\xe7\x2f\xd3\x39\xc2\x9b\x4b\x79\xe2\x77\xfb\x79\x3e\x0c\x97\xab\x7e\xde\x29\xcb\x45\x85\x4b\x24\x16\xdc\xde\xdc\x7f\x2a\x14\x6a\xaa\xe1\xc9\x42\xec\x76\x7f\x99\xbf\x0b\x04\x6c\xaa\x66\xed\x1b\xf8\xf0\xb6\xbc\x6e\xf3\x4a\x43\x9f\x5f\x58\xe7\xf2\x7e\x20\x94\xa4\x52\x6f\x65\x03\xa7\xff\x76\xcc\x71\x67\xa6\x79\xcf\xf9\x44\x73\x3f\xab\x7f\x91\xfa\x28\xf7\x49\xa2\x31\xca\x1e\xfe\x80\x91\xb1\x62\x88\xb6\xe8\xc5\x72\xf1\xc4\x4d\xec\x47\xd1\x2c\xe3\xe9\x57\x5c\xd8\x53\xd6\xab\xa2\xe7\xd9\x14\xe1\xa7\x5e\xf0\x44\x1d\x32\x71\x1d\x78\xce\xfd\x65\xbd\xe5\xfa\xf9\x96\x87\x93\xa7\x4e\xdf\xfe\x26\x3f\x7e\x7b\xf3\xdb\x76\x85\xb8\x14\x0c\x11\xa0\x48\xeb\x13\x43\x61\xbc\x5f\xea\x33\x43\x74\x71\x7c\xd7\xeb\x7a\xe4\x5e\xa7\xa2\xf8\xfa\xca\x3e\x01\x89\xce\x3e\xb9\xdf\x25\x00\x88\x58\x2c\xce\xd3\x2e\xc1\x4b\xf7\x1d\xf1\x78\xec\x91\x8a\x80\xdf\xf8\x5c\xe7\x1c\x39\x41\xda\xb9\x89\xd9\xbe\x5f\xf9\xa1\x36\xeb\x1f\xe4\x5b\x59\x34\xdf\xc9\x0f\x75\xbb\x38\xa2\x64\xf8\x6b\xe6\x95\x86\x8f\xfc\xf0\x64\x0f\x3d\xc5\xf3\x5f\x7a\x71\x1e\x09\x2f\x26\xe7\x3b\x79\x61\x86\x53\xb0\x5b\x06\xe3\xcb\x43\x56\xe5\x4e\xf2\x22\xab\x96\x23\xdf\xa7\x76\x51\xe1\x8e\xf3\x1c\xe3\xe7\x3f\x90\xef\x99\x46\xaf\x0b\xef\xbf\x92\xf5\x3f\x2f\x7c\x3f\x7c\xf8\x65\xff\x25\x9d\x7a\x85\x91\x36\x8d\xe1\x92\x5b\x91\x0d\x0b\x86\x31\x26\x64\x64\xa1\xef\xb5\xee\x62\xa7\x5a\x0f\x99\x4a\xae\x3b\xa5\x51\x37\xf0\xbf\xc3\xc1\xa9\x9d\xe1\x0c\x2b\xd4\xc6\x01\xa9\x16\x76\x42\xa3\x8c\x2d\x53\xcb\x66\x39\xe2\x12\xec\xbf\xb1\x9c\x56\x6a\x45\x3f\xbb\xc4\xc3\x42\xdc\xd9\x98\xa7\x22\x7a\xd4\x43\x8a\x6c\x16\x2d\x91\x3a\xe7\x50\x11\xad\x8c\xf4\x2e\x36\x52\xc3\x9d\xbf\x87\x6e\xa3\x99\xbd\x04\x05\x04\x69\x0e\x5a\x8b\x19\x19\xd8\xec\x4c\x00\xd6\x83\xe5\x13\x71\x0b\x13\xc1\xdf\xc5\x57\xbf\xc6\xb9\x4d\xa6\xed\x60\xe6\x6a\xd9\x0c\x78\xc4\xf9\xd1\x87\xaf\x63\x9b\xc7\x26\xf1\x97\x96\x83\x10\x43\x9b\xe7\x7a\x10\x6c\xd1\x65\x75\x2c\x66\x2a\x5c\x2e\x9b\xb1\xef\x2e\x66\x4a\x28\xc8\x04\x26\x2f\xb8\x0d\x28\x48\x4d\x48\x21\x87\x46\xae\xe5\xc1\x22\xcf\x93\x5d\x05\x1c\x84\x8d\x12\xa2\x56\xc6\x58\xd7\x93\x1d\x5f\x24\x37\x13\x02\x15\x29\x72\x64\x63\xc2\x48\x83\x1f\x9d\xea\x2b\x7c\x47\xac\x7b\xd0\x62\x3f\xf8\xa5\xb5\xd5\x95\x51\xa5\x80\x2a\x6d\xa9\x61\x17\x80\xb1\x48\x0c\xa8\xa0\x36\x00\xd3\x52\xd4\xcf\x9f\x5a\x91\x7c\x8a\xbe\xbf\x15\x0d\xbf\x00\xda\xa5\x51\xce\x0f\x7a\x11\x63\x26\x88\x3a\x6b\x75\x8b\x4e\x2a\x4e\x43\xd8\xd5\x98\x24\x84\xe0\x61\x84\x14\x1d\xc7\xdb\x97\x59\x0a\x17\x48\x7c\xeb\x32\x20\x34\xb4\x8c\x2e\xc3\x72\xf0\x40\x97\x95\x79\xce\x24\x90\x2c\xe2\x00\x08\x99\x91\x44\x4d\xa2\x09\x13\xa4\x1b\x92\x07\xdc\x87\x04\xe0\x00\x59\x6b\x63\x17\x8d\x3d\x2f\x07\x75\x6d\x3b\x63\xda\x37\x9c\x08\x0b\x8f\xcb\x12\xc9\x09\xc3\x83\x5f\x25\x62\x1b\x0b\xc1\x6e\xf6\x8a\x0c\x97\xf5\x22\xfb\x75\x69\xcb\x2c\x0a\x00\xef\x29\x90\x05\x91\x11\x42\x18\x2b\xfc\x1e\x85\xce\xf5\x11\xa3\xb0\x93\x4c\x04\xa3\x84\xfb\xd4\xcd\x4e\x50\x5a\x1e\x90\x19\x87\xf5\x99\x1a\x1e\x92\xa7\x49\x61\x56\x35\xc2\xeb\xfd\xe2\x64\xa0\x5e\x27\x47\xff\xf1\xe9\xa7\xab\x9b\xf7\x57\x1f\xaf\xbe\x05\x54\xaa\x06\x0f\x58\x61\x87\x7d\xc8\xa9\x22\xa4\xb6\x95\x61\x84\x84\xf1\xef\x76\xb6\x6f\x54\x3c\x1f\xa1\x22\x46\xd5\x26\x8f\xb1\x84\x14\xb2\x43\x3f\xd9\x6d\x4a\xb5\x8c\x68\xbc\x3f\x36\x8c\x4d\x25\x3a\x66\x0d\xce\xd8\xa9\xca\xc3\xf3\xf3\x55\x8d\x8d\x34\xe3\x3e\xf6\x44\x34\xeb\x9c\xd7\xab\x1b\x74\xfb\x58\xa7\xac\xce\x6f\x78\x89\xb1\xe7\xb6\x6e\xdd\x38\xaa\xce\x36\x22\x51\x4d\x24\xf5\x8c\x26\x54\x87\x10\x57\xbd\x50\x2a\x0d\xcb\x84\xc8\x3d\xae\xc8\x7b\xeb\x4d\x6b\x28\x23\x78\x19\xa8\x4c\xb0\xca\x20\x49\xae\xb8\x39\x0c\x45\x06\x5b\xc6\x79\x74\x6f\x18\x84\xda\xb8\xbb\x36\x11\x57\x14\x29\xe7\x8d\x95\x90\xbe\x05\x81\x40\xa4\xa9\x93\x8c\x82\xbf\x6a\x8a\x98\x36\xb5\xcf\xa2\x88\x29\x90\x48\x10\x4e\x85\x28\xc9\xd4\xb0\x05\x87\x38\x23\xdf\x32\x5c\x0f\xd2\x97\x33\x95\xe3\x05\x3c\x84\x4b\x69\xbd\x94\xda\x86\xb8\x76\xfb\x2c\x1d\xe8\x81\x30\x48\xe8\x96\xcb\x72\x4c\xa7\x11\xcf\x00\x2c\x32\x99\xb1\xd6\x2d\xd5\xbc\xc2\x29\xc9\xcc\xbc\xed\xef\xc1\xb7\xea\x95\x72\xbc\x22\xeb\x72\x44\x53\x8d\x11\x17\x2f\x86\x1c\x91\x8b\x90\x84\x79\x37\x33\xbe\x4a\x31\xc9\x70\x8c\x75\x47\x32\x51\x6c\x25\x2a\x25\x41\xc6\xca\xe4\x58\x33\x9e\x1b\x74\x26\xa7\xb6\x06\x21\xa9\xdc\x09\xf8\x09\x23\x43\xf6\x1e\x79\xc5\x97\x6a\xb2\x22\xaf\x1d\xb6\x85\x3b\xfc\x0b\x06\xf0\x5d\x6a\xdb\x14\xd2\x92\x83\x1f\x57\xb5\x00\x49\x6d\x3a\xd7\xbd\x0d\x15\xd7\xe1\xde\xe4\x6d\x41\x02\x99\x6b\xd3\x9e\x43\x33\xcf\x95\x7e\x4f\x37\xbc\x5e\xda\x3b\x7c\x88\xde\x8b\x54\xf6\x28\x1e\xcf\x39\x93\x6a\x23\xf1\x6d\xe2\x31\x28\x2b\x55\x41\x2a\xd3\x4a\x49\x91\x93\x7f\x43\xad\x57\xfb\x2c\x6c\x81\x14\xab\x05\x39\x57\x75\xe6\x5d\xed\xbe\x22\xed\x17\x3c\xad\x71\x03\x68\x17\x2b\x9b\x78\x06\x48\x81\xdf\xae\x7e\x3b\x7a\x36\x83\x9e\xc2\xac\x74\xf6\x04\xaf\x6d\xf6\x5d\x3e\xc9\x32\xde\x8e\xbf\x97\x3a\x71\xd4\x2a\x89\xbf\x2b\x97\x7b\xf1\x8b\x00\xf8\x61\x10\x78\x6e\xc5\x3e\xcb\xcf\xdc\x50\xa6\xb6\x8e\x85\xa8\x85\xc4\x05\x20\x27\xfd\xf6\x29\x92\xde\x2f\x49\x49\xcb\xc6\x91\x3a\x8e\x11\xc4\xf0\x15\xc0\x36\x3b\x1d\x91\x58\x10\x5d\xb9\x5f\x72\xa3\x62\x7b\x1e\xd9\x74\xa4\x1d\xe2\x32\x1c\x58\x66\xaf\x36\x13\x65\xac\x6f\xe4\x63\xf8\x2c\x70\xc8\xaa\x1a\x49\x90\x9c\x80\x5d\xf9\x2b\xb6\x4b\xae\x54\x97\x6c\xb2\x1e\xb0\xcc\x81\xbd\x0a\x4f\xce\x0a\xd4\x17\xe4\x8b\x2c\x9b\x8a\x1d\xeb\x93\x00\x7a\x9b\x74\x4c\xdd\x59\x0e\x0b\xb5\x89\xa8\x0d\x57\xb8\xa7\x70\x21\x63\x20\x30\x1d\x90\x74\x7b\x60\x96\xda\x18\x73\xd9\xe7\x48\xec\x65\xad\xc0\xcc\x30\x7d\xcf\xb3\x16\x3b\xb4\xc8\x92\x2d\x83\x8e\x69\xec\x19\xd1\x5e\x5b\x8f\xb1\xf6\xa0\xd4\x4e\x8e\xec\x2b\x54\x11\x66\x8f\xa8\x89\x01\x70\xa3\x3c\xd1\xbd\x00\x67\xc1\xdb\x59\x2a\x70\x7c\x11\x21\x16\xb1\x38\xe4\x28\x0b\xa9\x01\x32\x78\x15\x2e\x42\xa9\xdd\xc6\x85\x02\x97\x50\x84\x7e\x3f\x53\x36\x68\xc1\x94\xce\xfe\x88\x70\xc0\xc2\x6a\xfc\x0f\xd1\x02\x70\xa5\x51\xd0\x2d\x73\x78\xea\x84\x22\x98\x9b\x6e\x28\xa8\x4c\xa9\x82\x59\x2a\xad\x00\x44\x2e\x04\xdb\x7e\x46\xb4\xd6\xbc\xf5\x38\xf0\x84\xa8\x5b\xc4\x4f\xcf\xbc\x52\x35\xef\xe7\xdd\xa5\x6e\x80\xe4\xdb\xfa\x49\xf0\xaf\x5f\x38\xcc\x59\xce\xb4\x70\x63\x09\xe9\xe2\x72\x1b\x81\x9d\x55\x36\xf7\x3b\xdd\xc3\x4b\x65\x86\xf2\xb5\x45\x30\xf3\xf2\xcd\xa5\xc9\xf1\xd0\xee\x1d\x58\xf7\x4e\xd6\x46\x06\xa6\x48\xc0\x03\xfa\xd8\x81\x35\x95\x38\xb3\xa3\x96\xda\xe6\x71\x95\x67\x0a\x4c\x19\x35\x52\xe2\xd1\x16\xd9\xed\x73\x8a\xd7\x20\xdf\xcb\xad\xed\x35\xc8\x0f\x6a\x10\xa7\x60\xf5\x27\xea\x06\x30\x1d\x32\x8e\x70\x88\x40\xd4\xab\xba\x5b\xc4\x2e\x84\x8f\x35\x5b\x6b\xf1\xb9\x6b\x72\xc1\x3a\x37\x20\x83\xa3\x03\x3d\xe4\x99\x33\xbb\xae\x14\xa2\xc0\x49\x3e\x4e\x3a\x4b\xbd\x7b\x99\xcc\x5d\xca\x0c\x22\x36\x5a\x1d\x1b\x04\xa1\x72\x3b\xc9\x26\x0f\x70\x91\xed\x32\x29\xf8\xac\xb5\x94\x27\xde\x01\xe1\x84\x30\xa7\xec\x59\x67\xd3\x79\x32\x45\x3d\xa4\x1f\xc2\xc3\x05\x18\x0e\x9a\xfa\x8c\xb0\x46\x24\xb0\xd8\x24\x5e\xe5\x98\x64\x3c\x38\x25\x14\xa4\x6e\x5f\x66\x2c\x9f\xac\xcb\x32\x57\x9b\x74\x6b\xcd\x3e\xf7\xa9\xcb\xa4\xf8\x49\x63\x40\xbc\x3e\x1c\xfb\x99\xae\x3a\x15\xe8\x43\xe1\x34\xd3\xa4\xc0\x1d\x49\x8c\xae\x75\x4d\x24\x3f\x03\x80\x66\x23\x4d\x0b\x29\xdb\x19\x00\x25\x9d\x0a\xe0\x43\x4b\x45\xae\x63\x96\xb6\x41\xd6\xd5\x2c\x6b\x7d\x40\xdd\x5c\xd4\xc9\xb6\x2f\xa4\xc2\x2b\x55\x2c\x84\xa2\x0b\xb1\x2c\x3d\xcc\x65\xef\x2c\x6a\x4c\x54\xe0\x78\x58\x4e\xd3\xea\xb9\x2b\x5c\xe3\x4a\x82\x24\xba\x47\x70\x16\x84\x89\xb7\x6e\x06\x02\x4c\xf4\xa5\x6b\x80\x63\x90\x8b\x51\xb1\x7a\x28\xfa\xc1\x49\xed\xa8\x20\x81\xb3\xdb\x84\xb7\x60\xc4\x90\xeb\x92\xcb\x0e\xd0\xa4\x08\x7f\xf6\xa9\x22\x7b\x2e\xef\x0d\x95\x96\xe1\x9f\xb5\xd0\x31\x62\xd5\xb1\xb7\x2d\x7e\x48\x27\x80\x21\xac\xfc\x20\x11\x7d\x59\xf3\xd7\x2f\x82\x07\x08\x06\xf9\xa8\x64\xcd\x0b\xa7\x4c\xc7\xab\x00\x78\xc0\x75\x6b\x62\xee\xd9\x89\xf3\x8c\x07\x70\x5b\x66\x25\x1c\x92\xd5\x74\xe9\x6c\x64\x47\xab\x5b\x0e\x80\xaf\xb8\x94\x2d\x00\xdb\x1c\xb3\x0e\xa4\x9c\x4d\xb6\x65\x9f\xf4\x87\xef\xa6\x00\x60\xc3\x3e\xa6\xe7\x78\x2e\xf5\x8d\xe9\x49\x48\xd5\xb8\x92\x63\x33\x21\xb9\x3d\xaa\x08\xdd\x1f\x92\xa9\x82\xb8\xc6\x21\xf3\xd3\xf3\x14\x30\x03\x89\xd5\xcb\x4c\x29\xdf\x98\x52\x1d\x7b\x80\x36\x98\x3d\x89\x7c\x7d\x6c\xb6\x04\xa2\x4e\x4a\x35\x43\x75\xe3\x80\xe8\x27\xa4\x27\xd0\x1b\xb6\xae\xce\x86\x55\x9d\x3d\xd5\x66\x4f\x98\xe7\x84\x49\x90\x7d\x78\x0f\x10\x88\xd1\x8d\xf6\x04\x5b\xef\x52\x8f\xab\x0b\xd8\x30\xa9\xdd\x2a\xc5\x2e\x56\xe7\xfb\x3d\x4f\x71\x74\xc0\x37\x01\x86\xd1\x1a\xf5\x04\x78\x7c\xae\x9e\x7a\x36\xc2\x06\x8c\x66\x5c\x4f\xbd\xa3\x0c\xde\xc0\x57\x24\xf8\x71\x9d\xa5\x91\x7f\x70\xf8\x84\xb1\xa1\x2e\xcd\x3e\xc7\xcb\x8e\x44\xa1\xdc\xed\xb3\x12\x0d\x86\xbe\x51\xe7\xee\x19\x72\x97\x48\x6d\xd7\x9a\x2e\x95\xba\x6c\x9d\x5a\xe7\x8f\xea\x94\xeb\x92\xa8\x88\x7d\x56\xb2\x00\xa2\xe5\xd6\x88\x07\x28\x25\xb9\x92\xb0\x8f\x75\xd5\xc3\xa2\xe3\x78\x7f\x39\x3e\x86\x73\x2e\xe0\xac\x9a\x09\xe3\x6c\x9f\x93\xb9\xcc\xf8\xe0\xb0\x68\x56\x8e\x46\xe3\x20\x14\x70\xdb\x4d\xc5\x6c\x23\x24\x95\x37\xa3\xd7\x49\xa6\x37\x68\xa8\x26\x46\x87\xa9\xd5\x7d\x3f\x95\xf7\xe2\xbd\xee\x92\x77\xce\x70\x55\x4c\x23\xaa\x6b\x1a\x65\x87\x9d\x66\x68\xe3\xa0\x1f\xae\x03\xc4\x93\x01\x9c\xd0\xa8\x64\x93\x37\x15\x38\x8c\x33\xfd\xf4\xfa\x4a\x28\xc7\xf6\xb7\xab\x0f\xc1\x63\x4a\x43\xcf\x6e\x57\x95\xcf\x65\xb7\x8c\x3a\xb3\x01\x1b\xb1\x65\xc0\xc2\x1c\xf5\x00\xc7\xc9\xec\x54\xd8\x8c\xcd\x63\xbe\x5f\xbc\xcc\xc8\xb6\x38\xba\x09\xf0\x76\x26\x7b\x00\x34\x73\x03\x04\x7f\x3e\xe1\xb2\x45\x40\xf8\xdc\xca\xd3\x92\x92\xf5\xc2\x7e\x25\xce\x0d\x9c\x21\x3d\xcd\xfb\x71\x68\x39\x3f\x10\x02\x53\x06\xa8\x13\xf6\xe8\xc0\x2c\x80\x1e\x59\xb3\xce\x90\xcf\xb8\x88\x81\xa9\x3e\x82\xea\xd3\x22\xd0\xa7\x33\xef\x93\x82\x61\xc9\x04\x80\x5c\xad\x3c\xa1\xa2\x8e\xd9\x5a\x6b\x86\xdb\xb9\x0e\xfb\xdc\x9b\xc0\xcd\x90\xbc\x0f\x28\xeb\x3f\x97\xfd\xf4\x95\x72\x1b\x7d\xa2\xde\x79\x36\x7a\x80\xa8\x2a\xdb\x00\x30\x36\x20\xd7\x47\x4d\x88\x1c\x8c\x5a\x31\x23\x80\x8a\x29\xd7\x02\x79\x52\xb1\xde\xc0\x5d\xa8\xc1\x6d\xbe\xab\x6e\x0a\x15\xa8\x46\x47\x79\x31\x80\x3b\xdb\x75\xef\xfd\x54\x66\xdc\xf0\x33\x56\x51\x7e\x68\x15\x6d\xe0\xfd\x2c\x8b\x8b\x16\x66\x4b\xef\x79\x88\xdd\x06\x8c\x40\xeb\xfd\x06\xe8\xd4\xb9\x04\xb0\x52\xe3\x18\x73\x6a\xf6\xaf\xcd\x41\x29\xb5\x63\x7e\x15\x78\xc3\x9a\x22\x9a\xad\xbc\x7a\x2a\x06\xbd\x2e\xae\xc2\x6c\x90\xea\x9a\x57\x17\xef\x55\xed\x71\xd5\xe6\xbe\xf5\xc7\x7a\x77\x8d\x10\xe7\x1c\x8d\x79\xf6\x64\x33\xa4\x51\xb9\xc9\xc0\x6a\x5f\x3c\xd7\x47\x2e\xbb\x48\x15\x7e\x90\x88\xed\x43\xab\xec\x06\x42\xd6\xd9\x7a\x77\xad\xc8\xb9\xc0\x84\xb4\xe6\x46\x7e\x6d\xc0\xe8\x1c\x66\x83\xa2\x5b\x55\xe0\x95\xc9\x45\x1d\xe9\xe6\x74\xbb\x82\xe7\xb2\x80\xa9\xcb\xb9\x38\x2a\xd6\x1c\x92\xee\x13\xd8\x1e\x88\xd5\x91\xa9\x64\x97\x5b\x60\x76\xab\x4d\x57\xb5\x1f\x03\x53\xce\x1e\x15\x0f\x63\xa4\x37\x44\xa3\xaa\x62\x17\x7e\xbc\x01\x24\x66\xf0\xe3\xba\x0c\x54\x46\x68\x64\x82\x87\x3d\x35\xf1\xd0\xed\x51\x40\xc8\x44\x0a\x6f\xb0\xdf\xee\xd9\x22\x26\x33\x47\xb6\xca\xdd\xbd\x65\x98\xf5\xa1\x51\x2b\xfb\x09\x09\xab\xb2\x9e\x38\x8e\xa7\x90\x14\x34\xb9\xd8\x67\x69\xb2\x4d\x77\xb5\xde\x6f\xb1\x4f\xea\x49\xb1\x97\xd4\x7d\x47\x5c\x37\x9e\x13\x76\xc9\x0c\xeb\xf2\xcf\x44\xb3\x19\xf5\x36\x84\xec\x28\xfe\xa4\xe3\xa2\x93\xb4\x30\xa8\xe9\xd8\x58\xbf\xc0\x5d\x3a\xaf\x3a\xb9\x71\xbb\x50\x2b\x63\x2f\x9e\xe3\x18\x0a\x83\x74\x92\x95\x5e\xac\x7c\x33\x04\xef\xb5\x77\xda\xcf\x45\xf8\xee\x6d\xa3\x3e\x02\x03\x16\x6b\xef\x61\x0d\x04\xb4\xec\x4e\x79\xf5\x61\xb3\xc1\x31\x3a\x42\xce\xdb\xc4\xa7\xab\x31\x22\xc6\xdd\x1d\x20\xbf\xa9\x6d\x1c\xc7\xd5\x8f\x8b\x81\xb2\x20\x12\x5c\x03\x1f\x0e\x6e\x1b\xba\x35\xc9\x8e\x50\xe3\xea\x50\x90\x00\xc8\x74\x58\xb0\x3a\x91\x8a\x61\xec\x1b\x71\x76\xcf\x3d\x08\x84\x1d\xbb\x00\xaf\x14\x2b\x1a\x16\x49\xde\x4f\x70\x33\x90\xe7\x86\xca\x18\xf6\x59\xf5\x3d\x4c\x1a\x1e\x6b\x63\xda\x2e\x4c\xf8\x9c\x7d\x22\x04\x8d\xa6\x01\xc8\x5d\x46\xee\xf8\x04\xf8\x3d\xc0\xde\xd1\xc8\xb0\x06\x40\xec\x76\x76\x77\x9d\x09\xfe\xad\xa9\xda\x70\x68\x45\x4b\x4f\x4c\xb1\x5c\x00\x03\x8d\x1e\x01\x02\x04\x0b\x48\x6d\xd8\x67\xe9\x4c\xe8\x7a\x90\xb7\x3a\xec\x73\xef\xf7\xa4\x18\x85\x92\x09\xb9\x8e\x01\x48\xb8\x2e\x60\x9b\x09\x68\x5d\x7d\xb2\xcd\x23\xf5\x2f\x3f\x3e\xc6\x61\x39\x59\x5b\xfe\x46\xf6\x31\xbe\x2f\x30\x7f\x5f\x60\xfe\xbe\xc0\xfc\x7d\x81\xf9\xfb\x02\xf3\xf7\x05\xe6\xef\x0b\xcc\xdf\x17\x98\xbf\x2f\x30\x7f\x5f\x60\xfe\xbe\xc0\xfc\x7d\x81\xf9\x37\x2c\x30\x6f\xcc\xf8\x42\xb4\x6a\x5e\x85\x69\x19\x00\xb2\x7a\x72\x65\xf9\x79\xd6\xa8\x6c\x9f\x87\xac\xf1\x7d\x59\xf9\xfb\xb2\xf2\xf7\x65\xe5\xef\xcb\xca\xdf\x97\x95\xbf\x2f\x2b\xff\xd1\xcb\xca\x48\x89\xc6\x1e\x38\x7f\xb2\xae\xfc\xbb\x97\x93\x2f\x3a\x0d\xad\xa1\xd3\x70\xdf\xdb\xe7\x97\x93\x8f\x85\xdd\xbd\x1d\x34\xb4\x04\x23\x13\x3d\x2e\x2c\xf7\x2f\xbf\xb0\x2c\xdf\x17\x96\xff\x8b\x2d\x2c\x7f\xd6\x73\xf9\xfa\xdd\xf6\xe6\xc3\xed\x87\xbf\x7f\x29\xec\x57\xc4\x61\x85\xbc\xb3\x29\x9a\x0f\x38\x9e\xe7\xcb\xd3\xd0\xa4\x5c\xb2\x94\x87\xe1\x06\x2a\x23\xe4\x73\x99\x4f\xec\x22\xfe\x9c\x3e\xd6\xf9\xcf\x67\xe9\x41\xb8\x57\xf0\x07\xbd\xac\x4b\xe1\xf3\x7c\xf0\x07\x4f\xb0\xce\xcb\x9b\xfa\xd7\xf4\x54\x69\xfe\xe7\x5c\xec\xc1\x59\xde\xa3\xa7\xff\xfa\xd7\x3f\xbf\x49\xfd\x33\x7d\xf8\x85\x23\x9a\x9e\xea\xc8\xeb\x81\xea\xa7\x27\x3a\xeb\x73\x3d\x72\xf2\xd8\xf3\x0d\xfe\x2c\xe5\x7c\xf8\xc7\xc7\xcd\x97\x24\x1a\xd3\x9a\xc3\xa0\x22\x7d\xe3\xe7\x7e\x74\x00\x98\x84\x6c\x6a\x2d\xdc\xbf\xe2\xcc\x8c\x2b\x77\x6f\x19\xd9\xde\x43\x23\x53\x83\x86\x1b\x40\x66\x2c\x40\xa9\xc0\xf6\x03\x72\x82\x04\xa6\x32\x53\x4b\x95\x4e\x6c\x62\xb1\x65\xe4\x65\x92\x96\x77\xc6\xa8\x5b\x44\x0d\x7a\xd2\x17\xe2\x24\x9e\xdb\xad\x97\x03\x8d\x82\xf4\x47\x9e\x39\x10\xd8\x2c\x71\xe6\xe4\xe7\x1d\x18\xfd\x9e\x98\x05\xf4\x99\x8c\x83\x95\x9d\x31\x39\xcb\x04\xa9\xf2\x15\x34\x9b\xd1\x3b\x6f\x18\x8b\x61\xbc\x2e\x89\x25\x40\xb7\x01\x35\xcc\xf1\xfc\x45\x8f\xc9\x12\xbb\x59\xb7\x7b\x20\x9a\xb1\x29\x0d\xf7\x97\xcf\x91\xb6\xcc\xf1\xc7\x29\x89\x1f\xfc\xf7\x8c\x69\x5e\x68\xa4\x71\xd9\xcc\x08\x83\x21\x61\xba\x8b\x78\x3a\x20\x01\x92\x56\x96\x1d\xd6\xd8\xef\xae\x0b\x55\x80\x9a\x41\x47\x2d\xca\xa8\x56\xd2\x81\xa8\x09\x46\x46\xb7\x8c\x64\x6d\xec\x36\x38\xde\x85\xa4\x4e\xa5\x9a\x01\x85\x13\xbc\xac\x9e\x0c\x87\x98\x5d\xee\x36\x56\x01\x72\x86\x78\x7c\xb3\xd9\x15\x5b\x7c\xb5\x79\x8f\x00\xc7\xa2\xa5\x20\x01\xb3\x9f\x79\x4a\xe8\x56\x88\x71\x94\x03\x53\x6a\x48\x67\x95\x91\xc4\x55\x0b\x22\xe1\x5a\x6d\xfe\xd7\x17\x65\x11\x33\x5e\xb1\x72\x68\xaa\x0b\xf2\xe7\x34\x29\x8f\x08\x0c\x6b\xae\x35\x16\xca\x2c\x77\x6f\x91\x21\x6c\x12\x12\x12\x31\xcc\x1c\x9c\x05\x7f\x05\xb9\x65\x80\xab\x25\x18\x56\x31\x9d\xc6\x71\xc1\x2a\x54\x7e\x64\xa8\xf1\xd4\xbe\x5b\xb7\x05\x61\x2e\x1f\x33\xf2\xc2\x8a\xd8\x90\x4a\x9f\xe9\x3b\x5c\xd4\x43\x3f\xe0\x9d\xd3\x8b\xe9\x15\x4b\x96\x1f\x69\x03\xd6\x9b\x60\x2b\xba\x0d\xeb\x9e\x31\x90\x6f\x3a\x7b\xf6\x6d\xe4\xd4\xf4\x15\xb4\x96\xdb\xde\xde\x65\x3a\x1f\xd4\x13\xe4\x23\x64\xa4\xd9\x69\xc4\x8a\xb4\x31\x33\x21\x5c\x42\xd4\x1a\x68\xb7\xb2\x19\x7d\x80\x11\x5a\xf5\x15\x58\x05\xc8\x1c\x83\xe5\x3d\x2c\xbe\x03\x97\x0f\x59\xc3\x61\x4f\x9c\x2e\x55\xb2\xf5\x0f\x62\xe0\x15\x2a\x93\x1d\x86\xa9\x1e\xd5\x48\x62\x35\x00\xd4\x4c\xc2\x5e\x0f\x4c\xad\x30\xf8\x09\xea\x48\x02\xda\x8b\x77\x71\xb6\x2a\x25\x5f\xa6\x2e\x9e\xf6\x06\x59\x88\xfc\x44\x24\x1b\x11\xf3\xf0\x3c\xaa\xd9\x67\x6f\xe1\xe1\x57\x79\x18\xdd\xf1\xdd\x75\xc4\x62\xa1\xd9\xfe\xb9\x6d\x90\x6a\x70\xe6\x1b\x64\xc8\x94\xec\xf9\x8d\x8f\x3f\x2f\xd1\x74\x49\xee\xae\xd9\xb3\x88\xa4\x07\xcf\x25\x7f\x0e\x78\x8b\xa7\x0f\xa6\xe5\xc1\x93\x2c\x1b\xed\x2f\x67\xfc\xb4\x14\xfd\xd2\xd3\xc6\x77\x51\xfa\x5d\x94\x7e\x17\xa5\xdf\x45\xe9\x7f\x0f\x51\xfa\x79\xad\xf4\x66\xb3\xfd\x62\x11\xed\xbf\x09\xc6\x3f\x20\x5b\x66\xdd\x54\xca\x12\x70\x48\x53\xda\x66\xa9\x76\xe4\xba\x6b\x94\xb5\xbf\x79\x78\x87\x2c\xcf\x86\x87\x57\xb8\x50\x6d\x1a\x2a\x50\x3a\xea\xe3\x07\xe7\x73\x77\xd7\xdc\xb0\x17\xb4\x41\x26\x2b\x1c\x9c\xf0\xec\xb4\xd8\x0f\xbd\x9f\x23\x07\xef\x93\x77\xa8\x1d\x7b\x7b\xf3\xe0\x5a\xe8\xa4\xc0\x20\x94\xb1\x43\x00\xfa\xc3\x87\x71\xaa\xfe\xfa\xd3\xd8\x6c\xfe\xb3\xc8\x73\x23\xf5\x8d\xf8\x34\x7d\x1f\xae\xd7\x70\xd7\xed\x7e\xb3\xfd\xc7\x37\xc0\x5c\x8a\xbd\x20\x46\xe6\xe5\x8d\x98\x90\x0a\x7e\x9c\x1d\x6b\xb3\x7f\xc4\xf1\x80\x3f\xe7\x78\xe0\xf1\x9d\xb8\x18\xd6\xc3\xe3\xb7\xe0\x60\x53\xb6\x58\x57\x73\xe5\xcf\xbd\xe3\x60\xb7\xe1\x06\xa0\xda\xae\xde\x3a\xf7\x0b\x79\x7c\x0d\x6f\x38\xc4\xf5\xe9\xc7\xaf\xc7\xe1\x84\xa3\x12\xff\x58\xde\xfc\xae\x6c\xef\x0d\x5e\x10\xd6\x1d\xfd\xb9\x8e\xc3\x71\x67\x87\xcb\xcf\x75\x5b\x7c\xba\xdb\xe2\x49\xb7\xa1\xc7\x42\x21\x49\xe3\x71\xb7\x1c\x5f\xb2\xfb\x5c\xd3\x5f\x1c\x9d\xdd\x67\x7a\xfd\x41\xbf\xe5\x7a\x56\x4e\x56\x7f\x7e\x23\xb0\x68\x35\xdd\x89\x4d\x13\x79\xa6\xe7\x1e\x8e\xe3\x33\xcd\xfd\x5c\x9f\x1d\x9e\xee\x89\x27\x69\xf1\x99\x0e\xf3\xf1\x3b\xac\x83\xf8\xd9\xbe\x79\x4c\x91\x4f\xd1\x9b\xfc\xf8\xe7\xda\xfe\xf2\xfb\xfa\x4d\x1c\xf9\x0d\xdd\xf7\xb9\x86\xed\x3e\xd3\xf2\x17\xab\xfa\x32\x05\x39\x31\x86\x97\x78\x8c\x77\x71\xed\xbd\xcf\x8e\xc3\x33\x14\xf9\x90\x51\xcf\xfe\x2c\xf2\xe3\x33\x62\xf4\x1b\x99\xf9\x2a\x09\x86\x27\x1b\x8f\x32\xd2\xaf\xf1\xea\x4c\x24\x84\xad\xbd\xf0\xe4\x95\xf8\xe4\x95\x30\xaf\xec\xec\x37\x39\xd8\x19\xfc\xe1\xee\xae\x91\x66\x20\xa4\xc7\xc5\x84\xcf\xbe\xcc\x3e\xc6\x17\xf5\xcd\xe3\xcb\x83\x72\x0d\x22\x4f\xd7\x1c\x6a\x32\x83\x21\x2b\xef\xbc\x0e\x56\x52\x27\xc5\xba\xf9\x33\x4d\x7a\xa6\x18\x0e\x4f\x14\xb3\xd6\x0f\x8d\xdd\x79\x79\x5e\x12\xac\xba\xfa\xfc\x23\x4f\xf7\x69\x40\x7f\x3d\xd3\x5a\x41\x45\x9e\xef\x3f\xe3\xa1\x2a\x77\xd7\x68\xa0\xfd\xf8\xfc\xad\x4f\xbd\xdd\x5f\xff\xc4\x43\xc7\x8a\xf9\x98\xa2\x2c\x6f\x25\x72\x47\x3c\x35\xa6\x2f\x93\xce\xe1\xb9\x66\x1a\x35\xea\x67\x7b\x7b\xb6\x13\x65\x3c\x33\x9a\x2f\x77\x73\xfa\x6c\xdd\x7c\x40\xed\x74\x0e\x67\x7c\x7a\x38\x5f\xc1\x08\xcf\x8d\xa6\xf3\x9d\x3e\xdf\x77\x69\x92\xc2\x42\x53\xaf\xd2\xd1\x0e\xd7\xff\xdc\x7c\xd1\x44\xbd\x8a\xec\x1a\x9d\x6a\x85\x33\xa6\x19\xac\xa5\xd6\xe8\xde\xd4\x5d\x04\xab\x01\x48\x88\xd0\x23\x99\xc9\x59\x4b\xa4\x36\x0a\x0d\x69\x48\x62\x1d\x98\x14\x49\x70\x35\xc3\x2b\x27\xb7\x2d\x12\x30\xf4\xb2\xec\xd5\xcb\xe8\x66\x00\x02\x47\x53\x46\xa7\xee\x8b\x24\x5c\x91\x16\xa5\xfa\xb5\x88\x6b\x7b\x64\x66\x8c\x4a\x70\xf2\xec\xf6\x59\xac\x7e\xa4\x80\x96\xe4\x4e\x1d\x30\xf8\x73\x25\x2e\xf8\x93\x8b\x1c\xac\xf3\x8b\x59\xc9\x8d\x2b\x65\x14\x9c\xb1\x8a\xc5\x99\xfd\xfc\x96\xdd\x11\xa1\xe0\x22\x4f\xdc\xd0\x7c\x88\x99\x7a\x62\xb3\x91\x5b\xce\x54\x18\x89\xa4\xe1\x46\x0e\x2f\x5e\xa6\x3a\xda\xac\x31\x02\x03\xec\x04\x57\x0f\xf3\xc1\xa5\xcc\x71\x52\xa6\xf8\x39\x35\x64\xf7\x66\x34\x6b\x2d\xb9\x3d\x53\xf2\x5a\x70\xea\x4b\xc9\x75\x96\x2c\x6b\xd1\xf2\x64\xd9\xfd\x71\x7b\x81\x53\xf9\x7c\xd9\x6a\x66\xcc\x19\xe4\x04\xb3\x06\x49\xd4\x4a\x09\x3d\xf0\xc0\x5a\x48\xdf\xda\xd0\x5b\xcb\xa3\x20\x48\x00\xe9\x4c\xef\x9d\x93\xc2\x53\xad\xe6\x15\x5b\x36\x01\x31\x2c\xa3\x90\xe4\x19\xb9\xc5\xdf\x00\xbc\x58\xbf\x3a\xcf\x48\xc7\x58\x9e\xce\x8e\xa3\x8a\xeb\xa9\xac\x0f\xa7\xee\x28\xb0\xa3\x90\x0e\x63\x24\xcf\x46\xdf\x1c\x60\xb2\x14\x40\x62\x21\x52\x64\x8c\x6a\x54\x73\xb2\xa7\x58\x47\x2d\xf5\x71\x00\xce\x64\xa8\x2f\xbc\x48\xfb\x9d\xab\xbe\x73\xd5\x7f\x47\xae\x7a\x6e\xae\xba\xbe\xfa\xf9\xdd\x26\xfe\xba\xf9\x74\xbb\xf2\xd3\xcb\xfc\x12\xfe\xf9\xee\xe7\x8f\xbb\x3f\xfd\xd0\x7f\x08\xbb\xab\x77\xbf\xec\x3e\xe2\xf4\x1e\x1f\xf6\xd0\xef\x65\x53\x09\x7c\xa8\x3b\xb9\xe4\x73\xbe\xbb\xd6\x90\xe6\x97\x72\xf7\x44\x5d\xf6\x9b\x7f\x7d\xf1\xaa\xec\x6b\xcc\xb1\xc6\x7c\x5a\xfe\xf5\xd5\xfb\x4f\x5f\x75\x35\x25\x70\xdf\x71\x3d\x44\x39\xd7\x83\x98\xaa\x53\xee\x7f\x6d\x07\xd9\x71\xbd\xac\xe7\xfa\xd2\xb0\x5e\x5f\xdd\xee\xbe\x36\x88\xba\x7b\x10\x0e\xac\x87\x23\x6c\x05\x49\x8d\xe0\x9a\xfa\x26\x87\xc5\x6d\xb2\x1a\xa3\xa5\x64\xba\xfd\xe8\x65\x1e\x17\x35\x9b\x65\x8b\xbc\x40\x85\xd4\x53\x5e\x28\x02\x16\x91\xf7\x5b\xca\xc9\x5b\xda\x9a\xac\x15\x29\x85\xca\x3c\x4e\x3d\x56\x82\x6c\x21\xe0\x1c\x6f\x51\x1b\xb1\x67\xaf\x6e\x42\x45\xdb\xe6\xf8\x1e\xa5\x9a\xba\x5d\x19\xe5\x8d\xbd\x02\x58\xc3\xab\x9b\xa2\x78\x8d\x02\x15\xf7\x83\x42\xd2\x33\xce\x91\x18\xbe\x44\xb5\x1c\xdf\x04\xf4\xcd\x6e\x76\x6e\x11\x64\x15\x43\x03\x1b\x9f\x54\x49\xee\xae\xe1\x21\x89\x2c\xe7\x6f\x1a\x8d\xa6\xc1\x8f\xc7\x7b\x4c\xa1\x47\xb2\x93\xa3\x8b\x54\xeb\xcd\x53\x72\xed\x05\x7b\x40\x05\xa6\x6f\x26\x1e\x40\x6c\xec\x6b\x1d\x52\x20\x55\x64\xd9\xee\x77\x6f\xb9\x52\x29\xf6\xfa\xea\x11\x9c\xc0\xa4\x64\x6c\x1d\x68\xd2\x80\xfc\x60\x1b\x71\x5c\x5b\x1c\x67\x1d\x10\x13\x4a\x45\x79\x8b\x44\x4f\x59\xba\xcb\xaa\x5a\x65\x91\x49\x89\x21\x93\x10\x58\x91\x6a\xcc\x36\x29\x4d\xa4\x78\x25\xed\x8f\xdf\x6a\xd5\x6f\xdd\x2a\x77\xf7\xb6\x53\xef\x19\x18\xe6\x7b\xa5\x8c\x76\x20\xf2\xb1\x14\x8d\x42\x03\x6b\x15\xa7\x1d\xc0\x91\xea\x00\x6a\x7e\x79\xd3\x29\x99\xd9\xb1\x64\x46\xb1\x0e\xd3\x4d\x43\x2f\xb7\xb5\xaf\x53\x04\xee\x30\x35\x44\x0f\x8c\xde\xe7\x71\xce\xa2\xec\xc9\xfb\x44\xef\xae\x33\xbc\xe5\x94\x7a\x47\x9a\x67\x1b\x19\x40\x54\x5b\xd9\x78\x76\xac\x9e\xe2\x5c\x88\x91\xc8\x59\xcd\xec\xa9\xcd\x43\x64\x90\xd5\x27\x17\xec\xb1\xd5\xbb\x6b\x00\x1b\x5b\x4d\xd5\xef\x2d\x7e\xef\x26\x53\xc2\xc6\xdc\x3a\xa2\x75\x50\xe9\x6a\x14\xd0\x51\xf3\x15\xed\x59\x17\x06\xe0\xa6\x08\xfd\x14\xe4\x32\x6b\xa9\xcd\x46\x49\xb7\xe9\x4d\xa9\xf4\x8a\x2d\xdc\x91\x4c\x21\xb1\xe1\x1e\xa1\x6c\x24\xc8\xdc\xfa\x53\xac\x72\xcb\xfa\xda\x74\xf7\xb6\x87\xfa\xd9\x1b\xae\x19\x09\xee\x96\x5b\x90\x89\x68\xbd\xc5\xfe\xe9\xdd\x75\x1c\x41\x3e\xfb\x92\x97\x27\x9f\xdb\xdb\xcd\x2f\x57\xd1\xee\xfa\xba\xdb\x0e\x29\xc8\xb9\xda\x0c\xef\xc4\x3c\x06\x0d\xfc\x09\x72\x61\xac\xba\xd7\xa8\x3b\xd6\x2d\xae\x07\x89\x34\x82\x44\xb9\x54\x1f\x9d\x48\x23\x8a\xfd\xbb\x7b\x5b\xc3\xd8\xb1\x1c\xe4\xbc\x5e\x8e\xbb\xeb\x1e\xca\xb9\x09\xf0\x5d\x37\x01\xae\xb1\x9e\xd7\xcb\x8a\xeb\xaf\xee\x9a\x0f\x9f\x3e\xee\xdf\xbd\xff\xca\x9b\x32\x7f\x54\xef\x68\x50\x9b\xd1\x58\xce\xf5\x52\xef\xae\x4d\xcb\x3a\xaf\x36\xa9\xc9\x65\xbd\xbb\x4e\x21\x2f\xdf\x86\xf5\x24\xa3\xdf\xd0\x81\xaf\x98\xef\xac\xb7\x9e\xec\x24\xfb\xff\x7f\x63\xca\xeb\x21\x9d\xcb\x19\x02\x60\x29\x31\x0d\x08\x84\x0b\x2b\xfd\x99\xfe\x91\x27\xfa\xa7\x39\xf5\xe8\x65\x73\xea\xd1\x7b\xd4\xa3\x97\xfa\x4a\xea\x79\xf7\xfe\xd3\x6d\xdc\xbe\xbb\xd9\xee\xbf\x01\xee\x5a\x52\xaa\x2c\x19\x55\x70\xc2\x72\x6b\xd3\x43\xe0\xb4\xfe\x8f\xf3\x87\xc8\xe9\x6f\x48\x61\xb1\x64\xb0\xb8\x2e\x81\xf9\xbc\x59\x5f\x70\xfa\xad\xcd\xff\x16\x38\xa8\x05\xe6\x03\x2a\x1f\xe5\xbc\xdd\x5d\x97\x38\xfe\x73\x1d\x92\x02\xf7\xad\x5d\x06\xcc\x72\xcc\x54\x46\xec\xb1\xdf\xfa\x49\xe8\xf6\x09\xf6\xc5\xb4\xdf\xe8\x27\xf6\xdb\x2b\xbb\xee\xd7\xfd\xe6\xdd\xfb\xaf\x4b\x33\x3d\x70\x76\xe1\xf9\x1b\x28\xfe\xf6\xff\x7c\xda\xdc\x7c\x0b\x14\x3f\x42\x3e\x2f\x8b\xc4\x94\x60\x2c\x1e\xe4\xc0\xba\x85\xfd\x69\x02\xc0\xfe\x3d\x21\x14\xca\x43\xa1\x70\x1d\x25\x70\x7a\x3d\xf1\x5f\x7f\xf8\xf9\xd3\xfe\x69\x49\xf8\x9f\xcd\x88\x59\x42\xdf\x47\xa4\xe2\xeb\xfd\x62\x98\xc9\x1b\xb8\xee\x0b\xf5\x86\x60\x66\xc9\x17\x76\xcb\xb3\x15\xfc\xcd\xbd\x08\x8d\xa9\x5d\xf0\x08\x82\xc0\x22\x20\xed\xab\xe6\x8b\x82\x2f\x22\xc1\xef\xb8\xbb\x46\x56\x9e\x7a\xc1\x2d\x20\x14\x35\x99\x19\xa0\x7c\xd1\x70\xca\x23\x98\x1e\x5f\x5e\x61\x0c\x7f\xb8\xb9\x8a\xbb\x0f\x37\xef\xee\x3e\xbc\xff\xb8\xf9\xba\x24\x54\x03\xa7\x87\x04\x74\xbb\x10\xce\x4a\x2f\x27\x74\xc2\x12\x7e\xdb\x03\xb1\xfe\xb6\x07\x5e\xd5\x7b\x87\xab\x9b\x8f\xef\xb6\x5f\xb9\xef\x58\x42\x7f\xc0\x58\xb7\x6b\x3b\xd6\xb6\x86\xa5\xad\x26\x4e\xe5\x37\x75\x5d\x0a\xf5\x0f\xec\xb9\xf7\x57\x1f\xff\xf9\xe1\xe6\x1f\x5f\xb5\xc7\x52\xd0\x83\xee\x4c\xc1\x88\x66\x0b\x85\xba\x63\x2a\x6f\x98\x90\x35\x7d\x31\xb0\x6a\xe8\x54\x0e\xf1\xd1\xef\x4a\x25\xc8\xee\xd1\xef\x98\x81\x0e\x0f\x7f\x1d\xf6\x2d\x9d\x33\x1f\xf8\x3c\x6f\xdc\x51\xcd\x2d\x1e\xd9\xe5\x03\x9f\xeb\xa3\x72\x73\xe0\xf2\xc4\x8b\x50\xaa\xec\xca\xe6\x41\x6d\x90\x22\xed\x89\x6a\xa2\x60\x3d\xef\x87\xc8\xbb\x7e\x80\x3f\xeb\x83\x67\xe3\xfc\x76\x78\xe2\x9d\xf6\xf9\x4c\x59\x8f\x5f\x64\x9f\x73\x46\x69\xf7\x9a\x19\x65\x17\xed\xd7\xbb\xb7\x25\x48\x3a\x44\xdd\xe9\x41\xcf\xcb\xdd\xb5\xcd\xf7\x36\x06\xf6\x53\x7c\x71\x89\xe7\x87\xf7\x1f\x7e\xbe\x8a\xef\xde\xbf\xfb\xf8\x94\x9e\xf7\xfa\x85\x33\x23\xaf\x65\xe5\xcc\xce\x9f\x20\xbf\x7f\xff\xb7\x5f\xee\x51\xe0\x13\x84\xf5\xef\xff\xe6\x95\x08\xdb\xff\xf8\xd3\x0f\x9c\x7e\x08\xdb\x7f\xf9\xdf\x1b\xff\xf3\x44\x53\xc2\xc7\x9b\xcd\xfb\xdb\xbf\x7f\xb8\xb9\xfe\xd3\x0f\x38\xdd\x6f\x3e\x5e\xfd\x4f\x09\xf2\xbf\xee\x4d\x16\x88\xf7\xf9\xeb\x89\x52\x70\x50\x53\x0b\x4c\x11\x36\x2b\x96\xf5\x3e\x09\x4d\xcf\xc7\xe9\x4f\x70\xb7\xbe\x6a\xbb\xdf\xdc\xde\xfe\xe9\x87\x9f\xf6\xef\xde\xff\xe3\xdd\xfb\x5f\x7e\x78\xea\xdd\xcd\x5e\x7d\xd9\xe6\x9b\xfb\xe7\x5f\x1c\x3e\xfc\xba\xd9\xbe\xfb\xf8\xaf\x3f\xfd\x40\x25\xb9\x5b\xdd\x2f\xa7\x83\x73\xbd\xf9\x39\x62\xdf\xe2\xfd\x6f\x18\x93\x7b\x9d\x5f\x06\xd5\x50\x3b\xf1\xbd\xfd\x89\xec\x7e\x02\xfd\x20\x42\xed\x22\x17\xca\x41\x65\x1f\x0b\x95\x98\x49\xa3\xcd\xc4\xf9\xc0\x4c\xba\x8f\x9d\x46\x28\x54\x2f\x73\xa2\xb6\xcf\x66\xb1\x91\x46\x92\x90\x09\xf9\x71\xc2\x20\xe4\x75\xbd\x94\x44\x7a\x77\x9f\xb4\x3e\xbe\xfb\xfb\xbb\xed\xe6\xe3\xbb\x0f\xef\xe3\xcf\xef\x6e\x37\x3f\xed\xaf\x7e\xfe\xda\x26\x28\x77\xe2\x71\x51\x48\x7c\x31\x26\x20\x3c\xb3\xee\x85\x7a\x10\xea\x07\x77\xa6\x2d\x76\x29\x92\xe7\xfb\xb5\xbf\x99\x54\x0e\x65\xef\xea\xd7\x8e\x33\xb5\xbc\x17\xb3\x5b\x19\x0b\xfb\xb2\x8f\x48\xca\x98\xef\xae\xa3\xdd\x9c\xd9\xe6\x8d\x39\x71\x74\x88\xf1\x5d\x9c\x5a\x1b\xe3\x07\x9f\x30\x6a\x6c\x94\xe5\x92\x13\x99\xc2\x96\x09\x1b\x14\x55\x91\xbe\x3c\x2a\x95\x58\xed\x72\xc6\x55\x02\x28\x4e\x5b\x64\x82\x7d\x6e\xed\x30\x7f\x83\xc0\xa1\x0a\x50\xac\x42\xc8\x8e\x38\xec\x7d\xa4\x02\x47\x6a\xf6\xdf\xe0\x88\x9c\x69\x22\xb5\x00\x25\xc0\xd1\x09\x1c\x07\x00\xcb\xab\xe2\x79\x1b\xb5\x92\x44\xaa\x7d\x62\x5c\x1d\x6f\xa5\xc4\x17\xc6\x43\x4a\xfc\xb2\x25\x70\x8f\x08\xbe\xbe\x46\x2d\x41\x98\xca\x83\x59\x7d\x17\x75\x73\x5c\x94\x9a\x23\x53\x0f\x71\x0e\x4a\xfb\x4f\x0f\xca\x59\xa3\x9a\x83\x52\xaf\xa1\x86\x46\x2a\xc1\xf4\x32\x9b\x21\x56\x92\xaa\x87\xc8\xfb\x57\x29\x48\xf7\x7a\xf4\x5b\x30\x4b\x9f\xed\xd4\xfb\x66\xca\x13\x9d\x9a\xff\xb3\x9d\xaa\xaf\xed\x54\xd8\x3f\x36\x69\xd7\xb3\x1e\x3a\x25\xb1\x79\x9c\xed\x09\x09\xf5\xd6\x03\x38\x20\x0b\xca\xe1\xc5\x54\xcf\xb3\xcf\xbf\x88\x71\x34\xb0\xc9\x00\xe8\x2b\xa6\x81\x9c\xdc\x88\x61\xd0\xc0\xd4\x0b\x9b\xc0\xd1\x03\x57\xf4\x6c\x2a\x71\x5e\xe6\x0e\x70\x3b\xf6\x5b\x61\xea\x88\x1b\x8e\xf6\xa6\xe8\x77\x50\x17\x2c\xb7\xa9\xdf\x7b\x91\x83\xa4\xb9\xba\x96\xca\xbc\x88\x24\xa5\x1d\x5b\xa6\xf6\xa2\x02\xe3\x12\x8a\xed\x79\x39\x70\xdd\xb1\x5e\xea\xdd\xdb\x46\xa3\x48\x00\x4e\xdf\x32\x6f\x62\x19\x7c\x8c\x8e\xfc\x50\xeb\x4f\xf1\x99\x9f\xe2\xfd\xdf\xc2\xfa\xdb\xdd\x5b\x2e\x34\x54\x03\x97\x83\xec\x22\x0c\xf7\x6a\x83\x17\xd5\xbe\x63\x1d\x4b\x11\xb0\x30\x06\x82\x0e\x7e\x6f\xe1\x6f\x8e\x4f\xce\xd6\xf0\xdd\xb5\xdd\x3d\x4b\x6a\x97\x6d\xd7\x4c\x9a\xdb\x4f\xcf\xb4\xf3\xd1\x3b\xc6\xe6\xb5\xcd\x7c\x89\xc7\x7f\xfd\x92\x8b\xb6\x4e\x68\x94\xb4\xdc\x27\xb6\xf6\x80\xd8\x90\x85\x9e\x58\xc7\xb3\x04\x37\x6f\x87\x59\xdd\xed\xee\x5d\x64\x7d\x86\xec\xca\x42\x76\x5e\xf0\x8b\xa4\xe7\xb7\x2d\xe4\x67\x2f\xbe\x47\x80\xa3\x4d\x02\xdc\x4e\x54\x12\x46\xa0\x18\xdc\x21\xec\x64\x8c\x7e\x32\x1a\xe2\x1b\x4c\xcf\x93\x5c\x1f\xf7\x49\xee\x2d\x17\x5f\x6c\x8b\xc5\x7e\x28\xc0\xd9\x48\x29\x87\xf4\x5b\xca\xbb\x4f\x21\x56\x65\xbe\x7b\x8b\x24\xf5\x29\xe9\x05\x57\x94\x3b\xce\x39\x5d\xe2\x17\x50\xdc\xf0\x62\x5e\xa4\xb7\xd1\xfe\x38\x7a\xfb\x75\x73\xf3\xf1\xfd\xd5\xcd\x97\x20\x34\x47\x86\xec\xa4\xbc\x17\xe4\x76\x16\xca\x79\x9c\x77\xca\xca\x17\xc5\x44\x71\x2b\xe7\x72\xa8\x34\xc6\x4e\xa9\x34\xd9\x0b\xa9\xc2\x61\xae\xeb\x96\x86\xe9\x5a\x0d\xf8\x23\xcd\xcf\x64\xc2\x9b\x11\x82\x0a\x2b\x72\x47\x62\x3b\x6f\x3d\xd9\x53\xe5\x4c\x85\xdb\x96\x4a\x6f\x54\x14\x09\xab\x1b\x50\x38\xc4\x83\x0b\x79\x08\x35\x2d\x91\x9a\x32\x35\x51\xb8\x5a\xf4\xe3\xd9\xde\x1e\x27\xcd\x5b\xca\x83\x24\x67\x1a\x1d\xe8\x11\x00\x8c\xed\x2d\x92\x48\x27\x55\x64\x9f\xa6\xa2\xd1\x64\x16\x00\x52\x99\xf2\x28\xfb\xa8\x80\xb2\xc8\x54\xeb\x30\x75\xd2\x4a\xd2\x06\x27\x20\x31\xc5\x4a\xb1\xe3\x69\x6f\x04\xf3\xe8\x60\x52\x75\x79\x2d\x70\xbd\x10\xca\x4a\xad\x99\x32\x8e\xb0\x3c\x96\xbe\x11\x92\x82\x38\xb5\x75\xd7\x31\x23\x55\x65\x6b\x9f\x5f\x2b\x03\xbb\x57\x92\x11\xea\x04\xaa\x68\x70\xfa\x19\x7a\xce\x42\x47\x1a\x4a\x36\xe9\x16\x92\x9a\x2f\x06\x71\x41\x86\x3e\x2d\x0b\x1e\x54\x5a\xd1\x84\xda\x06\xe1\x96\x81\xd7\x80\x4b\xe0\xfe\xd4\xc0\xd4\x74\x6c\x01\x1f\xec\xde\x2c\x92\x99\x8a\x75\x59\x2b\x00\x5b\xd9\x9f\x60\xad\xfa\xfb\x72\x10\x52\xa4\xed\x96\xde\x36\xe4\x28\x99\x56\x21\x54\xa5\xe5\xb6\x8f\xd4\xb9\x52\xd3\x16\x94\xda\xb0\xa3\x70\x3d\x17\xb9\x34\xca\xd9\x45\x60\xf9\x5c\x9c\x34\xef\x65\x52\xff\xf8\x55\x7d\x1a\xcc\x4a\xca\xd8\xa2\xd7\x7a\x26\x66\x0c\x54\x60\xd8\x04\xc9\xa1\x02\x63\x50\x72\xf0\xe5\xdb\x5a\x4c\xdf\x51\xee\x31\x83\x0e\x5a\x04\x42\x0f\x9c\x21\x32\x62\x78\x99\xb2\xe6\x79\x3e\x1d\xa2\x7a\xa6\x26\x62\x74\x82\x60\xd9\xd6\xec\xbc\x82\xcc\x72\xae\x41\x29\x37\x35\x92\xcc\xd5\xf3\xbf\x27\x23\xb5\x81\x72\xac\x1a\x17\xc3\x73\x3f\x4b\x97\x37\x42\xd8\xe7\xee\x7d\x5d\xf9\xc8\x39\x87\x71\xaf\x6e\x6d\xd6\xad\xc6\x7c\xa6\xf6\x3d\x58\x4d\x9a\xd5\x2b\xe0\x5e\x38\x4d\x55\xea\x88\x64\x50\x3e\x22\x4c\xf5\x7c\x50\xca\x7a\x96\x71\x8d\x2b\x95\x6e\x8f\x58\x2d\x46\xb1\x13\x7f\xb8\x16\x8f\xf0\xed\x21\x23\x55\x74\xb3\x4b\xde\x09\xc1\x0b\x66\x2f\xcc\x2b\x81\x69\x27\x1b\xbf\x8d\x6c\x46\xac\x76\x24\x08\x46\x4c\x6f\xaf\x7a\x88\x40\x10\xda\x64\x62\xe0\xb8\xf3\xe8\xeb\x1a\x0c\x00\x62\x5a\xd7\x7d\x23\xa4\xa5\xce\x23\x6f\xec\x21\x54\xb6\x1e\x71\x7e\xb5\xcf\xc0\xe8\xdf\x57\x39\xe1\x48\xad\x18\x8b\x4b\x71\x0c\x4f\xab\x5b\x93\xba\xa7\x9c\x05\xfe\x63\xfd\xee\x3a\x52\x8d\x0b\x89\xa4\xce\xa1\x05\x64\x65\x4f\x45\xb1\x60\x7d\x1b\x31\xb7\xda\x93\x46\x17\x58\x76\x14\xed\xf0\x09\xe3\x5a\xed\x49\x3f\xc3\x8a\x22\x63\x87\xc8\xbf\xde\xbd\xad\x4e\x3a\x66\xa2\xe2\x11\xbf\x82\xd2\xe6\xa9\xdc\x7b\x7d\x8d\x72\xa6\x78\x49\x0b\x93\x70\x83\x86\x71\xfa\xde\xf6\x8a\xfc\xf0\xbf\xee\x37\xff\xfa\xfa\x06\xa0\x04\x96\xb3\xb9\x59\xb6\xee\x98\x05\xb9\xe5\x14\x8e\xdb\x66\x27\x1b\x66\x81\xd3\xdf\x24\x1c\x77\xcd\xee\xae\xe1\x1c\x99\x43\xba\x18\x81\xdb\x65\xdb\x77\x7c\x7d\x51\xee\x78\xfb\xbf\x09\x73\xcd\xf7\xdc\xcf\x2a\x69\x7b\xbc\x73\xd8\xac\x0b\x86\xdd\xc1\xe9\x6c\xb6\x1b\xff\xd7\x73\x96\xe3\x2e\xa2\xbf\xea\xee\xad\xf5\x85\xf7\x44\x2c\x17\x23\xb4\x03\x27\xd3\xd2\xcd\xd8\xb3\x7e\x95\x90\xa9\xf4\x80\x7f\xb7\xd8\x48\xc4\xe6\x22\x4e\xe2\xfc\x17\xfc\xcb\x2b\x36\x17\xd1\x93\x5f\x66\x6f\x11\x1a\x0b\xaa\xbf\xef\xd4\xfa\x88\xe5\xa2\x87\xe7\xe7\xd7\x63\x8d\xfe\xdb\xed\x93\xef\xb0\x8a\x1c\xe5\x10\xd5\x77\x0d\xf5\xb2\xed\x04\x0b\xcb\xaf\xe1\xf5\x6f\x6b\xe3\x9c\x73\x68\xd6\x16\x6b\x8a\xec\xac\x61\xe2\x2b\xe6\x58\xa6\xb8\x34\xb5\x9b\x63\xf9\x46\xf7\xd2\xd1\x99\xdf\xc0\x56\xfa\x08\x9c\xcd\x3e\xaa\xa0\x8a\x7a\x0e\xc3\xa8\x5e\x96\x9d\x1c\xea\xae\xbe\x96\x2a\xbe\xad\xbd\xf5\xe3\xb2\xdf\xdc\x59\xbf\xbf\x0e\xf8\xfa\x9d\xf5\xff\x0c\xbb\xfc\x7a\xf3\xe1\xf0\xee\xe7\x3f\xde\xfc\xfa\xbf\x2b\x34\x08\xca\x79\x6b\x7d\x2f\x34\x1c\x4b\x52\xfa\xc6\xd5\x05\x3f\xce\x7e\xc6\x55\x1a\x43\x0e\xa6\xf6\x20\xe8\xcc\x7d\xf0\x05\x9e\xfb\xfa\xc4\x33\x79\x9a\x5e\x89\x0f\x66\x23\xd6\x3d\x7e\x80\x32\x5c\xef\xae\x91\xc6\xbc\x40\x4b\xab\x97\x95\x6a\x6e\xf0\x83\x85\xfb\xe6\xb2\xc9\x87\xa9\xaa\xb4\xbd\x50\xf2\xcc\x22\x23\x63\x5d\x81\x44\x4d\x0d\x2d\xc3\x4a\xed\x78\xa6\x9f\xe0\xab\x27\x8e\x99\x32\x8f\xbd\x9f\x33\x25\xbd\xbb\x46\x7d\x81\x6a\x62\xea\x64\xd1\x7c\x5a\x9d\x83\xff\xb2\x56\x19\x35\x44\x05\xa3\x57\x70\x50\xe2\x6e\x4f\xa0\x1e\xad\x9d\x3c\x80\x7c\x24\xad\xdd\x5d\x9b\xbd\x85\xfb\x87\xb5\xa7\x8b\x55\x6e\xc0\xe8\x3f\x7a\xd4\x76\x80\xd7\x70\x81\x23\x6e\xef\x34\x9a\x2f\x8c\xa5\x54\x42\x21\xce\xf7\x8b\xe8\xad\x6d\x23\x0d\x31\x63\xd5\x7a\xa2\xd3\x58\x4b\x4c\x59\x2f\xb9\x50\x3f\x2d\xf7\xa0\xa4\xa9\x6d\x1e\xf6\xa3\x00\xca\xb6\x50\x69\xba\x87\xff\x30\x62\x27\x1a\xdc\x54\x87\x02\xdc\x80\xad\x29\x68\x7a\x6f\x15\x63\xd9\x83\x1f\xe7\x36\xac\x5f\x64\x2d\x97\x5c\x69\xbc\x42\x6c\x7c\xfa\x69\xff\x6e\x1b\x7f\xbe\xfa\xfb\xe6\xd3\xfe\xe3\x7f\xf1\xa9\x35\xb2\x29\x52\x23\x6f\x63\xa6\x51\xcc\xf4\x8f\x66\xc4\xf7\x12\x5b\xb4\xdf\x61\x85\x0b\x2d\x91\x2a\x88\x95\x69\xe3\x02\xab\x53\x7c\x7f\x3d\xfd\xc0\x64\x44\x5c\x4d\x12\x51\xf1\x84\x2c\x66\x2d\x63\x2b\x2a\xc3\xb5\x12\x27\xbb\xc8\x87\x08\x1c\xa3\x52\x00\x30\x8e\x3b\xce\xbb\x49\x29\xd9\x12\x1c\xdc\x91\x98\xc6\x48\xde\xa4\xd6\x03\x91\x77\x88\xa4\xbc\x15\x02\x9a\x0e\x8f\x80\x51\xae\xa1\x84\x86\xb9\xce\x23\xa5\xb1\x47\x06\x43\x9e\x43\xa1\xfc\x32\x5e\xe5\x1c\xd5\xfd\x87\xed\x3f\xbe\xf6\xa6\x60\x0e\xf9\x10\xa9\x6c\x84\x4c\x88\x2c\x7b\xef\x25\xa4\xcb\x6c\x96\x32\x96\x32\x03\x3a\x2e\xf0\x01\x50\x4a\xa5\xa0\xbb\xec\xdf\xae\x3c\xea\x42\x7d\xd8\xd7\x66\xce\xf5\x90\x76\x31\x93\x5a\x49\x76\x7d\x28\x35\x40\x1f\x19\xcb\xdb\xdf\x5b\xa6\x46\x0d\x36\xbb\x7d\x2e\x33\x22\x62\xa5\x87\xbe\xa5\xa4\x94\x33\xa5\x4e\xb5\x52\xea\xe1\xd9\x5e\xff\x52\x24\x70\x29\xa4\xd5\xe4\x47\x89\x84\x1d\x60\x7b\x4b\x8d\xd9\x8e\xbf\x91\x1f\xac\x12\x59\x3d\x09\x0c\xf2\x07\x95\xe8\x61\xfa\xf9\xee\x2d\x63\x37\xf5\x0f\x64\x8e\x17\x88\xf0\xff\x7c\xba\xfa\xf4\x87\x6f\xe3\xfc\x36\xd7\x34\x5e\x82\x73\x0a\x82\x73\xc2\xe9\xd7\xb7\xc2\xa1\x9f\x0f\xf7\x65\xee\x77\x6f\x25\xe8\xa1\xee\x4b\xcc\xb1\xc4\x97\xbd\xd0\x6e\x36\x3f\xbf\xfb\x10\x7f\xfa\xf4\xf1\xe3\x87\xf7\x71\xbb\xbb\xfa\xea\x7c\xc6\x12\xda\x36\x8a\xd1\xb8\x71\x97\x4d\xbd\xb1\x84\x72\x6b\x27\xa1\xf8\xbf\xe8\x5f\xa2\x9f\x98\x01\x19\x0b\x42\x98\xfe\x20\xdd\x5c\x16\xdd\xbc\x2f\xba\x79\x3f\xd5\xcd\xfb\xa2\x9b\xf7\x57\xea\xe6\xf7\x3a\xf9\xd3\xfb\x6f\xa4\x9b\xff\x93\x73\xd4\x97\xea\xad\x9b\xcd\xfb\x9f\x3f\x5c\x7f\x91\xdd\xac\x6e\xa2\xfb\x4c\x12\xb2\x1a\x60\x95\x22\xc3\xad\x2b\x14\x2a\x07\xce\x5b\x13\x65\x4b\x68\x63\xb1\x2a\xdb\xdf\x5d\xe4\xbc\x8d\x02\xfd\xd2\x77\x9a\xe7\xc5\x43\xe4\x7c\xe6\xaf\xc0\x6b\x90\xbd\x49\x76\x9c\x97\xad\xa8\x7c\xa6\xd4\x38\x28\x76\x8c\x1b\xdb\xdf\xb5\x20\x6a\x9d\x91\xc0\x67\x71\xe5\x62\x2a\x3b\xce\x5b\x6a\x63\xba\x7a\xe1\x89\xd5\xe7\x8b\x21\x97\x5b\x67\x5f\x97\x3f\xd9\xf4\xbe\xb3\xb1\x5c\x4d\x92\x67\xa2\x67\x34\xbe\x70\x83\x8d\xcc\x67\xef\x78\x69\xd4\xae\x7e\x7e\x77\x73\xb5\xfd\xf8\x25\xc6\x4d\x4c\xde\xf7\x9c\xcf\x64\x22\x92\x67\xee\xa1\x52\x63\x09\x83\x4c\x37\xcd\xa4\xb5\x86\x4e\x3d\x5f\xea\x85\x60\xc1\xa9\xb5\x7d\xec\x40\x8c\x6f\x54\x5b\x35\x15\xbc\xeb\x38\xeb\x54\x3a\x12\x75\x64\xc5\xa0\xc0\xab\x98\x92\x4d\x07\x5e\xc6\xcb\xbc\x7c\xf5\xf7\x9b\xab\xdb\x5d\xdc\xec\xaf\x6e\xbe\xae\x9a\x99\x3d\x40\x50\x6c\x92\x1b\x1c\x94\x24\x08\x21\x0e\xbc\x2a\xb6\xed\x77\xf5\x10\xeb\xde\x85\xa5\x1d\xde\x54\xec\xa5\xf8\xd1\x2d\x84\x12\x58\x36\xc5\x2c\x86\x72\x34\x1b\xe0\xc4\x52\x2e\x95\xa4\x9e\x15\x9b\xf6\x0b\x71\x09\x39\x00\x72\x3e\x63\x79\xb3\x07\x33\xe8\xa3\x98\x2d\xeb\x53\x90\xc2\xe8\xdf\x43\x20\x3f\x53\x18\x8f\x27\x4a\x8b\xc6\x14\xb5\x1c\x84\xd2\xd8\x66\x64\xb6\xe9\x23\xd4\x88\x18\xb7\x1a\x1b\x35\x85\x39\x28\x66\x4c\x73\x54\x42\x18\x73\x85\x4b\x08\xfc\x1c\x4c\x5b\x4e\x61\xec\xe4\x12\x8b\x37\x2f\xfa\x65\xac\x23\xf8\x4d\x98\x0a\xcd\x08\xb8\x52\x46\x50\x66\x81\x0d\x54\xfa\x49\x8c\xe1\x2a\x61\x61\xd6\x41\xb6\xe2\x0c\x72\xb6\x85\xee\xe6\x5e\xdf\x66\x42\x02\xa3\x4a\xd8\xc9\x40\xf8\x65\xcb\xb1\x3a\xb4\xd1\x9b\x87\x23\x6c\x12\xa3\x6f\x61\xb4\x86\x14\x6b\x14\xaa\x23\xd6\x58\x6f\xfd\x24\xd4\x58\xb7\x4c\xc0\x98\xcc\xc4\x4a\x75\x18\x79\x99\x19\xd7\xfa\x05\x20\xb1\x76\xed\x12\xb6\x5d\xb6\x29\x3a\xbf\xb8\xae\x7d\x73\x75\xfd\xee\x3f\xbe\x88\x4c\x6f\xa1\xec\x35\xe4\xa8\x21\x07\x80\x64\x9e\x73\xd9\x46\x40\xe3\xc7\x65\xeb\x25\x57\xc4\xc8\x0e\xa4\x18\xa8\x7c\x66\x22\x44\x21\x37\xca\x80\x34\xe0\x52\x03\x17\xff\xbf\x13\x78\xae\xb5\xc0\xf9\x89\x17\x33\x95\x5a\x40\x90\x15\x2e\x32\x65\x64\xd3\x3d\x33\x42\x86\x4b\x3f\x1b\xd4\x2b\x5c\x88\x35\x99\x44\x92\x2c\x01\xbb\x5d\xdc\xce\xcd\x1e\x6a\xa6\xb5\x59\xdf\x36\xa4\x41\x10\x1a\x0d\xba\x77\xcf\x00\xe6\xc3\xb2\x87\x49\xa9\x61\x73\x2e\xe5\xae\x18\xc7\x16\x46\xa8\x61\xe0\x0d\xf5\xb2\x9d\xd7\xad\xa9\xfc\x19\xa3\x33\x80\xee\x6a\x95\x2a\xc4\xa3\xc0\xad\x90\xcf\x58\x00\x61\xd8\x71\x81\xe1\x80\xd0\xac\x79\x6d\x6d\xdd\xcb\x43\xf6\xee\xa7\x9f\x3e\xbc\xff\xba\x61\x39\x54\x8b\x60\x98\x00\x7b\x9b\x2b\xbc\x0e\xb1\x6f\xa7\xdc\xa8\xb3\x44\xea\x8d\xb4\x7a\xe6\xbd\xaa\x00\x43\x48\xc8\xa4\x6a\x4a\x3f\x90\x85\x5b\xa4\xca\x40\xd2\x35\xd1\xd2\xfd\x04\x2b\x0b\xb7\x9e\x77\xa4\xe4\xf5\xa7\xb6\x61\x80\x46\xf0\x84\x8e\x70\x80\xd5\xf9\xb2\xb6\x35\x43\x06\xf9\x4b\xd4\xac\x92\x8a\x94\x91\x66\x48\x65\xab\x86\x44\xe2\x8c\xf4\x70\x63\xa6\xeb\x42\xa2\xc2\xe6\x09\x24\x36\x4c\x3d\xc1\x63\x26\xe9\xea\xb6\x2d\x20\x21\x29\xf6\xe6\x9a\x91\x65\xaa\x9a\x94\xb3\xda\x0a\x1e\x2c\x62\xef\xb0\x66\x97\xf9\x7a\xcd\x33\x49\x45\x1f\xa6\x0f\x54\x7b\x31\xf6\x78\xfb\x0a\x09\xcb\xd4\x2a\xb2\xee\xe1\xb5\x95\xb8\x96\xe8\xe1\xba\x40\x7a\xe0\xce\x24\xda\x22\x49\x83\xad\x04\xbf\x83\x04\xf7\x1a\x6e\x66\x1c\xa2\x1b\x7a\x45\x02\x9d\xda\x4e\x5e\xda\xfc\x9d\x5a\x8b\x63\xff\xd6\x4a\xb5\x98\x29\x39\x2a\xd2\xb9\x01\xbd\x99\x73\x8e\x54\xd8\xa8\x31\x7b\xa7\x1a\x63\xa0\xfd\xa8\x66\xaa\xa7\xed\x0f\x4b\xfb\x01\x87\x89\x96\x66\xea\xbd\x59\xb3\x3b\x1c\x61\xd1\xf0\x0a\x30\xdb\xac\x85\x14\xae\xb6\x2c\xd4\x9f\x1b\xac\xe0\x83\x45\xdc\x98\xaa\x03\x6a\x50\xef\x6a\x83\x0c\x3c\x64\xc7\x4e\x56\xcf\x24\x58\xc4\x29\x02\x6b\x4d\x82\x37\xfa\x7a\xdc\x31\x05\xcc\xf1\x8d\x5a\x2b\x69\xc9\x36\xf6\xc8\x16\xea\xd5\x10\xe2\x5c\x6c\xd8\x89\x47\xa7\xb2\x56\xdc\xc7\x5c\x82\x1f\x97\xfd\xe3\xb5\xcd\x67\x8d\x86\x51\x44\x25\xe6\xd0\xb1\xb5\x6d\x7f\xda\xa1\xec\x31\x83\xb2\x5c\x70\x0d\x22\xee\x0b\x49\x3a\x1a\xa5\x81\xd9\x91\x86\xc9\x0c\x16\x41\x01\x58\x43\x4b\xe5\xb4\x80\x49\x54\x93\xf6\xad\xef\x8c\x42\x7b\xb3\xaa\x81\x1c\x0b\xf6\xe2\xd2\x0c\xdf\x67\x40\x23\xa4\x70\x04\x14\xa8\x2f\xc7\x53\xdf\x7c\xfa\x9c\x6c\x78\x85\xfb\xf9\x74\x92\xbf\xfd\x78\xf3\x69\xfb\xf1\xd3\xcd\x55\x7c\xb7\xfd\xf0\x3e\xde\x7c\x7a\xff\xdb\x43\x00\x64\x86\x00\x08\x42\x00\xfa\x0f\xe1\xf6\xe3\xcd\x87\x7f\x5c\x3d\x8c\x01\xf0\x5f\xe3\x8c\x45\x50\x6b\xcc\xf3\x6f\x29\xaf\x7b\x8b\x7c\xa6\x21\xf1\xd7\x9b\x0f\xbf\xdc\x5c\xdd\xde\x7e\xbe\x24\x7d\xb6\xa7\x8f\x3e\xfe\xb7\x57\x9b\x9b\xed\xe2\x91\x32\x8b\xe6\x13\x18\x12\x7e\x88\x43\xc2\x3d\xd8\x6f\xbf\x6d\x2e\x15\xf2\x3d\x3d\x6a\x63\x1f\x01\xfc\x2d\xed\x4d\x25\x6d\x1c\xfc\x38\x69\xcc\xd4\xba\xb2\x7e\xdc\x62\xb0\x33\xce\xdb\x99\x8f\xd2\x7d\xc3\x0b\xd4\x06\x93\x02\xa5\xed\x49\x1a\x49\x3f\xd8\xbb\x4b\x50\x1a\xe3\x82\x1b\xe9\x08\x0c\x04\x84\x31\xcc\x84\x37\xc2\x3b\x83\xe6\xc7\x1c\x24\x74\xec\x1b\xdb\xab\xff\xe6\x90\x07\x28\xc5\xf4\xfb\xb0\xdc\x04\xae\xc1\x3e\xb4\x9f\x33\x9f\x06\x17\xdc\x5e\xdd\x1c\xbe\xee\x8e\x89\x59\x86\x7a\x26\xd4\x4a\x30\x8b\x0a\x19\x02\xdd\xde\x94\x33\x6b\x20\x9c\xb5\x5a\x09\xd0\xed\xc2\xd8\x71\xa5\xd1\xca\x99\x18\x07\x87\x61\xb6\xa9\xdf\x03\x00\xf5\x43\x44\xf2\xbf\x56\xf0\x99\xf6\x9f\x78\xf0\x4f\xa6\x72\x77\xcd\x00\xe5\x29\x1b\xf6\xd5\x73\x29\xc7\x38\x20\x9a\x3f\xf0\xe2\x1a\xe6\x0b\xf5\xe5\x0e\x55\xe4\xb4\x8d\x48\x5e\x08\x0f\x6a\x7f\x39\x3c\xa8\x01\x41\xd2\x0a\xd2\x1b\x9e\x5a\xaa\xa7\xd5\xe4\x32\x71\xed\xbc\xa2\x9c\xbf\x68\x4d\xeb\xa3\x9a\xaa\x57\xee\x02\x36\x5c\x79\xa6\xc2\x6d\xeb\xc9\x19\xdd\xb4\x2e\x8b\x65\xbd\xc7\x9e\xcc\xb1\xb2\x0f\x6b\xbb\x8b\xdc\x00\x5f\x9e\xa4\xfc\xf6\x1a\xbf\x20\x43\x6f\xaf\x3e\x7e\x7c\xf7\xfe\x97\xdb\xaf\xbb\xc3\x49\x8a\x9c\x41\xa3\x2f\xb0\x2b\x88\xfe\xa8\x8a\x3f\xc3\xb3\x5d\x22\xe1\x56\x04\xee\x8a\xff\xba\x17\x77\x0c\xab\x48\x0f\x81\x68\x12\xd1\x35\x8c\xa4\x9a\x6d\x10\xb3\xab\x0b\xc8\x89\x60\x7a\xcc\x88\x64\xef\x40\x5a\x05\xb3\x1d\x8c\xf9\x11\x46\x13\x09\xae\x8e\x3d\x9a\xcd\xc2\x66\x82\x58\x09\x91\x72\x37\x3d\xbb\xbc\x41\x7e\x04\x5d\x3d\xcc\x58\x03\xe2\x06\x22\xcd\x4c\xbc\x15\x39\x24\x74\x90\x0a\x9e\x0a\xf6\x94\x29\x3f\x36\x20\x50\x6b\xa8\x0c\xbc\x18\xef\xb5\x92\xa3\x95\x8c\x34\x61\xc3\x9e\xc4\x9a\x31\x7b\xbd\xc2\x52\xef\x8c\x6a\x27\x93\x52\xc4\x62\x8d\xb2\x46\xc3\xa1\x0b\x99\xf9\x29\xfb\xe5\xea\x39\x3b\xe1\x24\x86\x15\xf8\x8c\x15\xf8\x36\x0b\x3b\x3e\xc2\x83\xd8\x93\x45\x7b\xea\x38\xbc\xd2\x8b\xb3\x6f\x22\x94\x07\xe5\x59\x91\x59\x4b\x2a\x42\xc0\xfc\xea\x66\xe1\x2d\x6d\x58\x1b\x69\x85\x89\xfa\x2b\xbd\x07\x76\xba\x75\x32\x24\x45\x92\x6c\x7b\x8d\x75\xcc\xd2\x9b\x5b\x1f\x01\x68\x3c\x0d\x32\x7a\xed\xf1\x39\x24\x1e\xda\x83\x5e\x09\xcb\x70\xcd\xd1\x9c\x83\x09\x22\xb0\xf7\xae\x83\xbd\x50\x83\xaf\x46\xd5\x6d\x74\xd7\xc2\x14\xa1\x3b\x0f\x8d\x1a\xf5\x76\x9e\x05\x7c\x02\xbe\x05\xfb\x36\xcf\xec\xd7\x17\x59\xe6\xc3\xcd\x1f\xbe\xc6\xf4\x1b\xa1\x02\xaa\xc9\xb0\xcb\xb2\xe3\x72\x60\x13\x65\xb1\x04\x3d\xcf\x97\x63\xc7\x69\xfe\xc0\x29\xe8\xae\x5d\x72\x3e\xcf\xfe\x8b\xe2\x0e\x6e\x3b\xf5\xef\xdd\xfd\xf1\x48\x93\x5e\x76\x93\x4e\x54\x6b\x3d\x18\x95\x56\xec\x8b\x5b\x6f\x73\xcf\x08\x1c\x53\x78\xce\x71\x85\x70\xdb\x47\x40\xfe\x78\x9a\x4b\xc8\x2a\x41\x5e\x91\x31\x8c\x8e\xf8\x15\x18\x6c\xb7\x1f\x3e\xdd\x6c\xe1\x59\xf1\xb5\x9d\x6d\xb0\xc0\x39\x88\xb1\x33\x5e\x1a\x56\x52\x1b\xc7\xe3\xb9\x60\x0d\xd4\x04\x7c\x10\xbb\xcd\xa8\xac\x09\xd6\x1f\x92\xdd\xba\x5f\x2e\xc3\x15\x12\x4f\x07\x26\xbd\xe8\x26\xce\x1a\x83\x5d\x35\xcf\x67\xe7\x72\xaa\xca\xf0\x12\xfc\x78\x01\xe9\xe7\x95\x58\xee\xb0\xe1\xc1\xab\x12\x25\xe9\xe7\x4a\x9a\x2f\x33\x69\xde\x71\xda\x2b\x49\x37\xed\x45\x7a\x39\x98\xf2\x5f\x1a\x02\x03\x50\x8c\xdd\x29\xe3\x2c\x9b\x1d\x1a\x24\x58\xc1\x15\xfe\xad\xd9\x7e\xbf\x14\xab\xb3\xaf\xfc\x36\x5c\x60\xf2\x83\xc0\x6f\x3d\xef\x18\xaf\xdd\x9a\x51\x87\x79\xca\xaa\xba\xdc\x28\xf0\xbd\x95\x71\xd9\x40\x01\x2f\x8f\xf2\xc7\xcd\xcd\x37\xe0\x3d\x03\x7f\x40\x69\x17\xdc\x89\x7b\x10\xde\x7b\x8c\x5c\xa3\x94\x2f\x00\x7e\x28\xba\x8f\x0d\x13\x48\xe5\x0b\x16\xa0\x1d\xf3\x08\x9d\x6a\x0e\xf3\x7a\x21\xad\xa6\x37\xe5\x8b\x42\x5d\x82\xf8\xea\x95\xbd\xf6\x75\xbd\xf0\x2d\x78\x96\x3d\x6c\xab\xfc\xe6\xb6\x86\x7b\x5d\x98\xef\x75\xa1\xcb\xdc\x42\xba\x8f\x99\x1a\xf2\x91\x36\xa4\x89\x90\x1e\xb3\x4d\x52\xf0\xce\x56\xf2\x0c\x9e\x56\x74\x05\xa4\x58\x83\x1a\xad\xb8\x62\x17\xed\x5e\xf7\xe4\xc6\x6a\x32\xee\xb4\xd7\xbe\xdc\xcf\x9f\x7e\x8a\xfb\xab\xbf\x7f\xe5\xa5\x54\x63\x90\x60\x33\xe0\x45\xa3\x9e\x03\xe7\x73\xee\x97\xba\x93\x03\xf3\xb9\xfd\xb2\x87\x37\x5d\xa6\xd2\x2f\x18\x48\x49\xb1\xfa\x52\x27\x18\x0c\x87\x57\xb5\xf4\xc6\x4c\xae\xaf\xdb\x54\x45\xf5\xad\xc6\x38\x5c\x70\x25\x6e\x81\x0b\x40\x9b\xe4\x60\x53\x11\x71\xdb\xbb\x7b\xa1\xb7\x58\x43\xdf\x7b\x6b\x5f\x5c\x21\xbf\xfd\xf4\xeb\xaf\x5f\x79\x9a\x3d\x3a\x60\xb7\x36\x8f\xbe\xef\xb8\x2d\xa6\x10\xa5\x54\xe1\x7d\xac\x27\xee\xd8\x21\x99\x59\x25\x39\xaa\x23\x95\x3e\xf0\xcb\xce\x8b\x63\xb6\x91\x42\x04\xac\xcc\x86\x24\x75\xfb\x2c\x4b\x3d\x33\xe8\x27\x74\x24\xc4\xed\x27\x69\x71\x0b\xa5\x36\xfc\x48\x92\xf0\x59\x56\x9c\xa4\x75\xe2\xd1\x0e\x99\xc4\x77\xf6\x52\x33\xae\x22\x56\xc0\x89\x9b\x06\x56\x3b\xa9\xc3\xd6\x16\x06\x20\xa0\xcd\xf7\xcd\x8f\x1b\xf7\x51\x58\xaa\xc0\x6d\x10\xef\xf0\xae\x47\xd5\x43\x42\xab\xde\x17\x76\xcf\x39\x6f\x32\x74\x01\x3f\xce\xb8\xb5\x58\x4d\x99\x08\xf7\xaf\x2c\x36\x7a\xad\xf5\xee\xed\x20\x65\x41\x3e\x90\x7b\x85\x47\xc8\xa6\x24\xed\x8d\xb5\xbc\x06\x3f\xce\xfd\x3f\xc2\x5c\x2d\x62\x8f\xa4\xea\xba\xdd\xd2\x69\xd5\x14\xdb\x07\xad\x10\x4a\x3d\xaf\xed\xb8\x77\xad\x23\xdb\x95\x6c\x7d\x29\xaf\x76\x44\x4d\x4d\xfb\xa9\x62\xbd\xb4\xd6\xfa\xf0\xa1\x68\x3d\x73\xa9\x84\x34\xc6\xa7\x75\x4e\x1d\x8b\xbc\x77\x6f\x15\xb3\x30\xc3\xb9\xd0\x2a\xd9\xec\xb3\x06\x41\x8d\x8a\x91\x7a\x5c\x23\x9e\x7d\x8e\xea\x78\x6d\x5a\x58\x6b\x53\x1f\x0f\x92\x3d\x40\xdc\xfa\xe1\x89\x41\xe2\x85\x1c\x96\xde\x3b\xf6\x21\x83\x7a\xaa\x1f\xef\xae\x39\x91\x6a\x0d\x85\x52\xd1\xc7\x03\x3d\xac\x57\x1f\xbd\xc2\x08\x3c\x35\xa0\x70\xb6\x76\xff\x19\xc4\xaa\x59\xe1\x6d\x17\xad\x5e\x0f\x7b\x09\xd9\xc2\xdf\x14\x4a\x2a\xc1\x8f\x69\x85\xdd\x0f\x5c\xc9\xc7\xf5\x1e\x5d\x1f\x1b\x09\x67\xa6\x54\x6d\xca\xc9\x48\xe4\xdf\xbb\xf5\xf8\x8b\xb2\xf2\x9f\x9b\x5f\xbf\x19\x80\x23\x5f\x22\xba\xc8\x81\xcb\x3e\x03\xd1\xe1\x10\xf3\x39\x2b\xf6\x63\x68\x8c\x43\xcc\xd8\xc6\x1c\x26\x34\xc7\x88\x7a\xc8\xe7\x9c\x0e\xb2\x6b\x94\xf8\x00\x4d\xfc\x65\x6f\x35\xb4\xf8\xdb\x00\x25\xaa\x26\xf5\x12\x5f\x72\xda\x45\x39\xd8\xe9\x2e\x02\x32\x4b\x78\xaf\x68\xe2\xce\x5a\x3c\x42\xbe\x28\x01\x61\x95\xf9\x92\x75\x27\x97\x7e\x7e\x31\xc2\x8b\xa6\xc4\xed\xbf\xde\x6f\xdf\xbd\xff\xe5\x6b\x7b\xb1\xf0\x56\x9c\xd0\x95\x24\xd2\x60\xec\x7f\x63\x8f\xf8\x42\x52\x10\x3e\xc4\xba\x8b\xbe\x31\xfd\xdc\x2e\xb8\xc9\xd3\xf1\x68\x63\xba\x98\x61\xaf\xe7\x4a\x52\xb7\xd4\x4d\x73\x98\xae\xab\x00\x12\x68\x1a\xea\xdd\x5b\x0d\xf9\x50\x77\xf5\x02\x3e\x79\x95\x5a\x7d\xfa\xed\xe5\xd1\x1e\xbb\xbd\x3c\xe8\x0e\xbb\xde\xd8\xcb\xc1\xd6\xb7\xbd\x3d\xfa\xa6\x77\xf4\xdc\xe8\x66\x41\x93\xd0\x40\x75\x14\x1b\xfc\x17\xfa\xf2\xd8\x7c\xdc\xfc\xe1\xe3\x32\xc3\x74\x3b\x66\xde\x24\x1b\xa6\xac\x1e\x5b\x58\x4f\x56\xc2\xea\x90\x70\xff\xca\xb2\x1a\x56\x3f\xe3\xc4\xfb\xdb\xf5\x03\x2a\x52\xcd\xcc\x93\x86\x4d\x9b\x81\x4d\x9b\xb1\xa6\xd9\x2f\x40\x8e\x28\x79\x4f\x43\x72\xac\x6e\x58\x61\x2f\xa9\x75\xd3\xaf\x19\x56\x25\x53\x61\xac\xf2\x71\xd9\xe3\x9e\x68\xb7\x3f\x7e\x1f\x22\x83\xed\x9d\x7b\x93\x90\x50\xba\xd3\x13\xc5\xfa\xa2\x5f\xee\xa6\xe6\x9b\x64\xc6\xf1\x89\xda\xe1\xa6\x90\xf6\x11\xef\xf1\x23\x12\xb8\xb4\x16\x71\x3c\x2d\xe6\xf4\x5d\xa7\x0f\x1c\x1b\x16\x8e\x55\x7f\x91\x2c\x3e\xfc\xe3\xea\xfd\x1f\xbe\xdc\xe8\x98\x5e\x54\x42\xde\x34\xb8\x56\xf9\x31\xcd\x18\xf4\x04\xfc\x0d\x20\x4e\x87\x36\xe1\x7b\x07\xe9\xe0\x30\xa8\x15\xd9\x47\x4a\x63\x44\xe2\x2a\x6f\x1a\x15\x7b\x78\xe9\x75\xbc\xf3\xee\xba\x91\x76\xe0\x49\x77\xbc\x1f\x4b\xe1\x6b\x5a\xcd\x86\x3c\xa7\xcd\x1d\xda\xc3\xb2\xfc\x8a\x5f\x71\xad\xdc\x79\xdd\x8c\x05\x4b\x28\xeb\x7e\x45\x0a\xcc\xe1\xf8\xd3\xdc\x92\x44\x0e\x9f\x7c\xe2\xe3\xeb\x61\xcf\xfe\x4d\xd6\x9a\x25\xf8\x1b\x06\x3e\x01\xe2\x9a\xc9\x2c\xc3\x7d\xcc\xae\xf4\xb2\x0b\xe6\xc7\x9b\xcd\x1f\x8f\x9f\x0e\x1e\xe1\xa0\x07\x39\xcf\x97\xba\xab\x7b\x8e\xbc\xd3\x3d\x07\x06\x50\x86\x06\x2e\x88\x3c\x81\x07\x91\x07\xaa\x04\x89\x12\xe4\xbc\xad\x58\x73\x33\x78\x65\xde\xb7\xe3\xe7\xb7\x04\xd7\x22\x47\xe0\xb6\x93\xcb\x76\x3e\x10\xda\x57\x83\xcd\x3e\xfe\x82\x17\x37\x14\x3f\x7e\xfa\xe3\xc1\x52\x7e\xa3\x3b\x55\x3b\xc8\x0e\x7e\xb5\xc8\xa3\x5f\x00\xa2\x7a\x59\xce\xb3\xa9\x6b\x81\x27\xb8\xf2\x84\x54\x83\xeb\x53\xdd\xc9\xdd\xdb\x16\x86\x75\x33\x42\xc6\x64\x27\x97\xe3\xbc\x01\x6e\x18\xba\xc5\x84\x62\xbd\xbb\x8e\x35\x2a\x7c\x94\xf4\xb2\xec\xa2\x5e\xe6\xd7\x39\x2b\x7d\x7a\xff\xf7\x0f\xfb\x9f\xe3\xfe\xea\xf6\xf6\xeb\x82\xca\x92\x72\xe0\x4e\x65\x5c\x74\xb3\xae\x05\xee\x49\x5c\x61\x69\x17\xb3\x3e\x25\xed\x99\x14\x82\x15\x4b\x39\xac\x40\x36\x1f\xc1\x0e\x77\xd7\x83\xb8\x47\xce\xc4\xfd\xc2\xef\x57\x7b\x41\xb3\x33\xbc\x50\x3d\x50\xa0\xa0\x1c\x09\x58\x6b\x2b\x03\x6f\x78\x6d\x27\x5d\x7f\xb8\xf9\xea\x10\x47\x85\x7a\x9e\x0d\x1c\xf7\xfb\x23\x7b\x03\x1b\x42\xfa\xac\xc5\x23\xcc\xfb\x21\x4a\x84\xb2\x7a\xd7\x7a\xb0\x8e\x62\x2d\xd3\x17\xc5\xf8\xd8\x17\xf3\xdd\x5c\xdc\x87\xeb\x15\x7a\xf8\xa7\x5f\xf7\x1f\x36\x3f\x7f\x65\xff\xf5\xb4\x53\x84\xff\xc5\xba\xd3\x7d\x6c\xf6\x2f\x34\x6b\x77\x37\xf6\x00\xa7\x14\xc4\xc8\x09\x62\x2e\xcf\xf3\x41\xb1\x47\x98\x3c\x04\x33\xca\xe1\xe5\x55\xa8\x4f\xb7\x57\x37\x71\xf3\xf3\x57\xf6\xab\xb6\x81\x59\x35\x52\xec\x6c\x04\x8d\x7a\x8b\xb3\xa8\xfe\x2f\xf8\x97\xb9\x07\xe2\x0e\xc2\x77\xd7\x71\x98\xac\x3c\x87\xe5\x71\x90\x5d\x3e\x64\x6b\x7c\xde\x65\xd8\x28\x77\xd7\x23\xe8\xd6\x34\xac\x16\x52\x44\xc6\x19\x8d\xdd\x24\xbc\xc7\x02\x6c\xa1\x7d\x21\xe9\x76\x8e\x1a\xfb\x2b\x40\x1d\xd1\x61\x1f\x6e\x7e\xd9\xbc\x7f\x77\x07\x9c\xb0\xaf\xcd\x3c\xed\x32\x9f\xcb\x81\xfb\x4e\xd2\x65\x3b\x67\x40\xdc\xf3\x70\x5c\x72\xf1\xb4\x24\xfa\xf0\xdb\xe5\x38\xfd\x52\xfc\x8b\xc9\x96\x19\xb7\xb2\x5c\x7b\xf0\xed\xf4\xb1\xbe\x3c\x66\x52\x7e\x91\xee\x8b\x77\xeb\xf1\xf4\x72\xec\xba\x47\xac\x4b\xec\x70\x7c\xc5\x15\xa3\x62\x3d\xf9\xfa\xaa\x5e\xff\x06\x02\x75\xe5\x77\x13\x2a\x00\x6c\xff\x70\x42\xfc\x56\x42\x7e\x6d\xe2\xff\x1d\x11\xbe\x0f\xa3\x84\x81\x91\x5c\x1c\xff\xc3\x01\x3e\x42\x8e\x39\xe4\xdb\xe8\x39\x97\xa2\x7d\xf3\x13\xbf\x10\xfc\x1e\x53\x78\xe3\x08\xdd\xba\x31\x98\xa5\xce\xa1\xda\xf1\x16\x09\x60\x02\x52\xa9\x1c\xf8\xbc\x1e\xe2\xcb\xb9\x01\x4f\xfb\xf5\x5b\xd8\x06\xe1\x81\xbe\x3d\x2f\x97\x65\xc7\x7a\xf7\xb6\x84\xfc\x47\xc0\x96\x3b\x9e\x6d\x68\xdf\x40\x67\x7f\xbc\xda\x5c\x7f\xe5\x85\x1f\xc2\x0c\xc4\x94\x1d\xb4\x45\xdd\x57\xd0\xcf\x84\xca\xdf\xb8\x51\xef\xa1\xb9\xc3\x61\xbb\x1f\xce\x68\xa6\x0e\x5c\x03\x79\x71\xff\x16\x77\x36\xcc\xbe\xc9\x1c\xf3\xdf\x38\xd9\x85\x12\x46\x28\x67\xcd\x7e\x2f\x01\x49\xd0\x35\xd4\xd0\x6f\x97\x6e\x75\xb3\x6d\x8e\x2f\x7c\xb1\x0b\x15\x1a\x12\x11\x23\x43\xad\x5c\xf2\xd8\x31\x52\x6e\x8a\x0f\x67\xcf\x31\xcf\x1c\x36\x05\x00\xb3\x76\x82\xba\xe4\x2d\xd0\xc0\x42\x8a\xcd\x7d\x16\x5a\xc8\x84\x17\xb4\xf5\x79\xea\x10\x37\xe2\x15\x05\xe2\x95\xb6\x33\x18\x7e\xa6\x73\x86\x61\x95\x66\xe8\x5c\x2f\x6f\x91\x1f\xde\xdd\xbe\xfb\xe9\xdd\xfe\xdd\xc7\x7f\xc5\xdd\xbb\x9f\xbf\xba\x4a\xd9\xb6\x1e\x0d\x17\x3c\x1a\x6e\x5a\xb9\xf0\x3a\x81\xef\xb7\xd4\x48\x19\xae\xb5\x79\x2f\xe4\x4e\xee\x46\x00\x9e\xd2\xae\x5a\x77\x23\x58\x3b\x64\xd2\x1c\xd5\x7d\xa6\x9a\x9d\xe5\x81\xc5\xa6\x12\x99\xfd\x0f\x79\xac\x05\x32\x00\xc5\x4c\xa3\x53\xdb\x0b\xb1\x23\xfe\x58\x77\x22\x6d\x94\xe7\xc4\xce\x70\x29\x97\xd0\x10\x72\x48\x62\x77\x36\xeb\xfd\xa6\x6f\x78\x7a\x3b\x9f\xb8\x3b\x63\x21\x0c\x8e\xef\xc1\x0a\xc6\x1a\x5a\x31\x1b\xbc\xb9\xc1\x5c\xdc\x6b\x30\x47\xca\x73\xab\xb2\xeb\x1e\x4e\x2d\x72\xc1\xc3\x1e\x13\x6c\x88\x4a\xb2\xf3\xec\xa1\x28\x5e\xf0\xdd\xdb\x46\x00\x22\xeb\xfb\x89\x24\x56\xe0\xa0\x83\xac\xd9\x94\x3a\x7c\xa6\x53\xa7\xea\xfe\x5f\x13\x11\xcb\xc9\x34\x90\x88\x67\xaf\x8a\xf0\xdb\x81\x2b\xf4\xbd\xd7\xd4\x66\x94\x65\xba\x38\x79\x56\x24\xff\xe3\xf1\x89\x6b\x00\x22\xb2\x65\x0d\x42\xfc\x58\x9e\x37\xde\x5d\x2b\x65\x8e\xd4\xfa\x3e\x23\x82\x06\x98\xbb\x12\x89\xeb\x76\x66\xb1\x5a\x84\x53\xcc\x7b\xb8\x40\xbf\x22\xe1\xeb\x09\x75\xde\xee\x3e\xfc\xf3\x6b\x53\xa7\x52\x39\x6b\x0e\x8f\x6e\x03\xd3\xa8\xf2\xe7\x86\xfa\x76\x90\x00\x8f\x8e\x83\x13\xdd\xf6\x19\x62\xf4\x5d\xae\x93\x50\xd0\xb5\xab\x6f\x97\x98\x50\xfb\xac\x2c\xb1\xc6\x84\x06\x84\x82\x22\x83\xa2\x49\xb0\x13\xc1\x7f\x22\x9d\x42\x5e\x67\x89\x93\x31\x78\xa9\xef\xff\x79\xf5\xd3\xee\xc3\x87\xaf\x8b\x9d\x2f\x24\xad\x87\x41\xd9\x53\xab\x0b\x3b\xda\xc2\xba\xb4\x98\x6c\x5e\x2c\xf0\xab\x2b\x36\x63\xc2\x8b\x17\x31\x59\xcc\x85\x1a\xbc\x01\x6a\xa1\x51\x2a\xe0\xdd\x8c\xb3\xe1\xf4\x0f\xcc\xb5\x96\x85\x1a\x93\xa6\x46\xb5\xeb\x5c\xc6\x2d\x1a\x89\x0b\x52\x97\xc1\x05\x2e\x17\x0d\x99\x46\x29\xff\x1f\x7b\xff\xba\x1c\x37\x6e\xf5\x8d\xe2\xdf\x9f\xab\xe0\xc3\xfc\xff\x4f\x92\x1d\x52\x52\xb7\x0e\x96\x67\xd7\xfb\x3e\x96\x25\x7b\xc6\x1e\x5b\xd6\x58\xf2\x4c\x26\x8a\x2a\x85\x26\xd1\xdd\xb0\xd8\x44\x0f\x88\xd6\x61\xb2\x53\x95\x7b\x78\x3f\xec\x7a\x6f\x60\xdf\xc8\xbe\x93\x5c\xc9\x2e\xe2\x40\x02\x20\x40\x82\xec\x96\x2c\x27\x99\xaa\xb1\xdd\xdd\x04\x08\x2c\x2c\x2c\x2c\xac\xc3\x6f\x25\x63\xc6\xcd\xcf\x76\x47\xe5\x3a\xef\x8f\xb7\x76\x76\x0f\xcb\x0b\x3c\xdb\x60\xcf\x47\x02\xfa\x6f\xbc\xb5\x73\xf8\x6c\x6b\x7f\x87\xe7\xdb\xb1\x00\x90\x67\xc1\xfe\xd6\xf3\x83\x3d\xc0\x2b\xe0\xf1\x3f\xf9\xf8\x77\xb7\xf6\xcb\x9d\x96\x89\xa4\x8b\xdd\xc3\xdd\x64\x8b\xf9\xba\x98\xb1\xf6\xf9\xde\x16\xaf\x3b\x77\x10\x6f\x8d\x99\x1b\x75\x6f\x77\x2f\x16\x89\x15\xcf\xc7\xfb\xcc\xad\xcb\x4a\x5c\x3e\x3f\x2c\xc5\xd7\xb3\x7d\xc0\x30\x04\x03\xfe\xa7\xd0\xcd\x44\x62\xc2\xde\x98\x55\x46\xdb\x97\x7f\xca\x5f\xf7\x77\x9e\x6d\x1d\xee\x30\xe7\x39\xab\x78\x37\xde\x63\xf5\xda\x76\x0f\x9e\x05\x07\x5b\xfb\xcf\xc7\x25\xd5\x19\x22\xa1\x62\xe1\xdf\x3a\x64\x09\x24\x63\x16\x00\x3d\xda\xe1\xc5\xc9\xb6\x0e\x99\xd3\x7a\xeb\x39\x2f\x04\xba\xf3\x8c\xa1\x7c\x33\xda\xec\xc5\xfc\x07\x96\x3d\x22\x62\x59\x59\x98\x1e\x07\x4c\x15\x7d\xcd\x4b\x61\xbd\xc3\x8f\x31\x56\x1a\x74\x6f\xbc\x17\x1c\x6e\x3d\x1b\x1f\x96\x82\x90\x85\x42\xf3\x40\xe8\x03\x26\x18\x03\x86\xd6\xca\xfc\xdc\x07\x5b\x07\xbb\x25\x79\xc7\x2c\x00\xbb\x86\x03\xd9\x65\x8e\x86\x11\xb3\x8b\x3f\x7f\xc6\xa2\x0a\x0f\xc1\x78\xeb\x70\xff\x79\xc0\xff\x14\xbe\xbf\x43\x5e\x74\xff\x40\xe8\xaf\xac\x4a\xde\x2e\x0b\xa5\x7a\x3e\x0a\xf8\x5f\x25\x67\xb1\x79\x1d\x96\x32\x7b\x6f\xf4\x8c\x9d\xbb\x23\xa6\x6c\xb0\x3e\xf7\xca\xb3\xe0\x70\x4f\x8a\xff\xad\x7d\x86\xb4\xb7\x3f\x9a\x1f\x6c\x8d\xf7\x18\x50\xea\x3e\xcb\x52\x79\x9e\x6c\xed\xef\x8c\xb6\x0e\xc6\xbb\x5b\xfb\xac\xbe\xea\xde\xb3\xe7\x35\xbf\x95\x6c\xbc\xcb\xea\xdd\x8e\xb6\x9e\xb1\xb0\xdd\xf1\x1e\xd3\x0d\x18\xa7\xc6\x15\x1f\x97\x14\x3b\x64\xd7\x98\xf1\x6e\x5c\xb1\x39\xdb\x21\x8c\x05\xc7\xd2\xe3\x29\x77\xc8\x2e\xe7\xe4\x98\x73\x32\x13\x16\x8c\xe3\x58\xcb\xd1\x1e\xd7\x46\x0e\x18\x5c\x7b\xa9\x8e\xec\x1d\x1e\x3f\x67\x49\x63\xbb\xac\x66\xef\x88\x57\xeb\xde\x3d\x14\x61\xcf\xbb\x5b\xfb\x87\xfb\x60\x6f\x6b\xf7\x19\xc3\x4e\xac\xde\xc5\x14\xaf\x67\x7b\x7b\xcc\xa2\xf3\x6c\x6b\xcc\xc0\x02\x9f\x8f\xf6\x03\xfe\xa7\xb0\x3a\xb3\xf0\xd7\x67\xcf\x98\xe9\x75\x6f\x77\xbf\xe4\xe8\x31\xab\x07\xf8\x3c\xde\xda\x1d\xb3\x5c\x48\x56\xc6\x77\x87\xcd\xe8\x90\xe5\xdc\x95\x7f\x56\xce\xdd\x72\xf9\xf6\xf7\x19\x56\xfd\xb3\x5d\xf1\xa7\xcc\x07\x79\xce\xf3\x57\x76\xf6\x38\x47\x07\x25\x47\x77\x49\xba\xbf\xfd\xed\xf7\xbf\x8f\x52\x38\x45\x39\xfc\x9d\x28\x2f\xb0\x42\xdb\x14\x2e\x96\x19\xa0\xb0\xd8\x06\x59\x86\x39\xb4\x78\x11\x46\x97\x21\xbc\x5b\x62\x42\x8b\x30\x0a\x5f\xc0\xc5\x04\x92\xea\xc9\x78\x0a\x12\x8a\xc9\x7d\x78\x15\xfd\x6e\xba\xca\x93\xb2\xc5\xef\x60\x44\x7f\xff\xd7\x0f\x93\xcf\x30\xa1\x5b\xfc\x1d\x67\x04\x2f\x21\xa1\xf7\xbf\x83\x51\xf8\x97\xbf\xc0\xe2\x3d\x2b\x2b\x14\x46\x7f\xbd\x01\xd9\x0a\x7e\xf3\x9f\x3b\x7f\xfb\x7d\x04\xb7\x44\xbe\xe6\xff\xb8\xc1\x28\x0d\x76\xfe\xe3\x06\x90\x00\xfd\x8f\xdf\xed\x44\x74\x2b\x21\x10\x50\x78\x21\x5e\xfa\x9a\xbf\xf3\xf7\xbf\xfb\x2b\x4a\xbf\x09\xc9\x2e\xfa\x29\x1b\x4d\x51\x18\x4d\x32\x9c\x5c\x7f\xf3\xdb\xcb\xcb\xcb\xc3\xe8\x72\xf7\x79\xb4\x73\x15\xe5\xab\x2c\xe3\x7f\x5c\x5e\x86\x32\x1f\xf4\x2a\xba\xbc\xbc\xbc\x1c\x45\xe1\x9f\xff\x9c\x07\x41\xf9\x71\xef\x20\xba\x1c\x97\x8d\x9e\x45\x63\xa5\x91\xda\x9e\x7f\x16\xad\xc2\xab\xab\xe8\xf2\xaa\xfc\x4f\xff\x26\x9a\x82\xac\x80\xd1\x25\x07\x6e\xce\xc0\x3d\x5e\xd1\x30\x0a\x13\xbc\x58\xe2\x1c\xe6\xe5\xbf\xd9\x3d\x0d\xd2\xf0\xea\x4a\x56\x57\x3a\x05\x0b\xf8\x4d\xc7\x22\x6c\xcd\x27\x45\x18\xa1\xe2\x9c\x12\x94\xd0\xf7\x38\x85\xdf\xfc\xe7\xe8\x6f\xbf\xff\x8f\x9a\x68\xc8\x7f\x45\x95\x7f\x3f\xf5\xc5\x5d\xed\xbf\xfa\x96\xfe\xf2\xec\x40\x5d\xdc\xbd\x71\xb5\x58\xa3\x72\x29\xd5\x7f\xef\xee\x44\x3b\xd1\x65\x38\x21\x10\xa4\x09\x59\x2d\x26\x45\x58\x2e\x12\x5b\xbc\x2b\x75\x4d\x39\x03\xf0\xd5\xe7\xdc\x32\xae\x7e\x09\x5f\xb0\xa6\xa1\xe8\x70\x54\xf5\xa0\x2d\xf6\xa8\xfe\x56\x61\x9f\xbd\x36\xf6\xb9\x8a\x2e\x43\xd9\xb5\xe4\x14\x08\x92\x79\xc9\x16\x94\x80\xe4\x3a\x06\x84\x80\xfb\x30\x52\x26\xb0\x11\xf6\x51\xfe\xed\xc7\x49\xff\xd1\x9b\x93\xb6\xa7\x4f\x5e\x52\xbc\x41\xf9\xdb\xd1\xe9\x73\xa2\x32\xd3\x48\xac\xdc\x7e\x29\x2d\x2a\xfe\x29\xb5\xb6\x9f\x10\x9d\xbf\x83\x20\x45\xf9\xec\x3c\x03\xc5\xbc\x5c\xf4\x30\x88\x83\xe0\xa8\x9a\x73\x10\x46\xb2\x85\xba\xa5\xc2\x62\x8e\x09\x7d\x93\xf2\x16\x53\x94\xc1\xe2\xbe\xa0\x70\x11\x56\x8c\x58\xf1\x91\x64\xbe\x91\xc2\x7c\x4a\x57\xca\x90\xd4\x6f\x2d\x0c\x69\xe3\xe2\x05\x4e\x61\x56\xae\x44\x39\x9d\xf2\xef\x82\x82\x92\x87\x5e\xa0\xe2\x35\x2a\x89\x1a\xbe\xe0\x98\x0e\x98\xdc\xbf\xca\x29\x41\x90\xad\x5b\x81\x09\x95\xcb\x20\x3f\x9f\xc0\x22\x81\x79\x49\x0b\xe7\x98\x22\x95\x78\xea\x67\xf6\x56\xe5\xb3\x78\xbb\xf2\x4d\x63\x14\x6a\x6b\x75\x34\xc6\xf7\xea\xa8\x94\x6d\x6e\xca\x61\x8a\x28\x9b\x6d\x3d\xdc\xb8\x58\x4d\x72\x70\x13\x46\xe1\xb4\xd8\x9e\x10\x7c\x5b\x40\x32\x7c\x4b\x6d\x4f\x1f\x4c\x3e\x6f\xa3\x3c\x85\x77\x4f\x7d\x63\x65\xd7\x3b\x6f\x3f\x4f\x9f\x61\xf7\xc6\x0a\xad\x9b\x46\x32\x68\x0e\x16\x50\x95\xd3\x03\xb6\x07\xef\xca\xbe\x33\x46\x3b\x51\x58\xc0\x44\x36\x19\xed\x45\xc6\x17\x63\xed\xf1\xbd\x51\x35\x40\x48\x08\x26\x8c\xeb\xc4\x71\xc1\x0f\x8c\xd1\x0e\x9b\x14\xef\x48\xad\xc3\x12\xa0\x22\x4e\x41\x3e\x2b\xb9\x49\xeb\x37\x08\xac\x6d\x13\x9c\xad\x16\x79\x61\x7d\xd8\xf9\xb8\xe3\xe9\xea\xf9\x70\xbe\x5b\x4f\x93\xf1\x7e\x39\xac\x3d\x67\x33\xd1\xd0\x98\xb4\x68\x1a\x2a\x3a\x8e\xd1\x60\xd7\x3d\x84\x71\xdf\x77\xa5\xb0\x48\x08\x5a\x4a\xf1\xe6\xfd\xc6\xb6\xaf\x9b\x94\x2b\xe9\x90\xc0\x9c\x42\x02\xd3\xf2\xdf\x0b\x94\xa3\xc5\x6a\xd1\x49\x50\x0e\xec\x54\x13\x95\x7f\x36\x16\x7b\x3f\x0a\x71\x9e\x64\x28\xb9\x0e\x2b\x6d\x60\x57\x72\x68\x2d\xb7\x70\x7e\x82\x8a\x05\x2a\x0a\x9d\xe1\xf7\xa2\x3d\xed\x3d\x76\xe2\x7d\xb8\x06\xf7\x83\xc9\x62\xf9\xd2\xf8\x4a\xa8\xb5\xca\x0e\x52\x98\x6a\x64\x32\xd5\x2d\xa2\xf3\x78\x0e\x41\x4a\x30\x5e\xf0\x4f\xd3\x0c\xde\x59\x86\xaf\x2e\x87\x39\xb1\x5a\x30\xe8\x03\x75\x0b\x09\xdb\x96\x1a\xf1\x15\xd8\x89\x2e\xc7\xcf\x4b\xfd\x6f\xb5\x58\x42\xc2\x52\x16\x02\x0a\x66\x16\x91\x53\x1e\x4a\xab\xe2\x38\x03\x7c\x21\xae\x5a\x76\x60\xa3\x6d\x92\x21\x98\xd3\x73\xd6\x83\x63\x44\xad\x64\x76\x93\xc4\x10\x3f\xf2\x85\xa8\xf8\xb8\xca\x73\x7e\xcc\x29\xa2\xc8\xca\xe9\xf4\x16\xc7\x05\x85\xcb\xb8\x83\x99\x6a\xe1\xba\xa7\x08\xd7\xcf\xb8\x54\x38\x5b\x65\x6c\x14\x96\x0f\x29\x27\xb1\x4b\xf4\x7a\xf0\x28\x1f\xc0\xbe\x26\xdd\xd1\x2c\xff\xc8\x12\x30\x4a\x45\x25\xcd\xe0\x05\xbc\x63\xff\x4e\x40\x9e\xc0\xac\xfa\x84\xf3\x29\x22\x0b\xe3\x23\x1b\xf2\x7b\x5e\xbe\x9b\xcd\xe3\x16\x20\x8a\xf2\xd9\xb1\xf2\x33\x57\x7b\x44\x15\xba\x28\x7c\x81\x73\xf1\x6b\x39\x20\x4a\x56\x30\x0a\xcf\x29\x5e\x72\xc6\x0c\xa3\xf0\x98\xbd\x37\x28\xbf\x0b\xa3\xf0\x67\x58\x44\x81\xf6\xfb\x11\x81\xc1\x3d\x5e\x05\xc5\x8a\xc0\xff\x0e\x2e\xe6\xa8\x08\x6e\x51\x96\x05\x04\x16\xc9\x1c\x96\x87\x6c\x40\xe7\x30\xa8\x49\x1a\xe0\x3c\x00\x41\x8a\xa6\x53\x58\xde\xcc\x03\xce\x4e\x5b\xa1\xa2\x30\xe1\xe5\x91\xaa\x4f\xea\xeb\x2f\x64\xcb\x81\xb2\x32\x1d\x2d\xc4\x53\x04\x16\x14\x10\xea\x7c\xb0\x5a\x3f\xf1\x86\x67\xee\x37\xd4\xb2\xab\x65\xd1\x9f\xe8\xea\x7e\xe4\x64\x30\x17\x58\x7c\x2d\xd7\xd8\x7c\xaa\x65\x99\xd9\x73\xc6\x1a\xa3\x3c\x5e\x66\x20\x81\xca\xb2\x76\x91\xff\x0b\xad\x6c\xb3\xad\x73\x71\x6d\xe7\x83\x65\x7f\xdb\xbf\x10\x42\x9a\x0b\x29\x30\x2b\x4f\xcf\x39\xce\x32\x7c\x5b\xfe\xab\x58\x80\x2c\x2b\xff\x01\x32\x9c\xc3\x20\xc7\x31\x85\x77\x34\xae\x8a\x7a\xba\x0e\x95\xa6\xa8\x4c\x4d\x89\x5c\x73\xe2\xa1\x7a\xc3\xcf\xd0\x72\x82\x01\x49\x19\x8f\x59\x84\x1c\xef\xa8\xc1\xdd\xae\xb9\xd5\x02\x78\x82\xef\x60\x1a\x0b\xf5\xb2\x9a\x5b\xc7\xa9\xd8\x6c\x19\x4f\x70\x7a\x1f\xa0\x3c\x43\x39\x8c\x99\x0a\x8f\xb8\x39\xae\x45\xb1\xac\x09\x9c\x81\x09\xb4\xbd\x53\x3f\x71\x83\x13\x48\x01\xca\x8a\xb6\xb3\xcb\xd2\xf9\x12\x20\x12\x7c\xc6\x93\x38\x43\xf9\x75\xbb\xee\xaa\x2c\x39\xb4\xae\x22\xff\xef\x2d\x9e\xf4\x39\x30\x9e\x2b\x0b\x49\xf0\x8a\x32\x69\x20\x8e\xa1\xe8\xb2\x3c\x9f\x8a\x2d\x76\x92\x55\xb6\xa1\x1d\xc7\x31\x56\x31\x8c\xe4\x77\xa7\x99\xb0\x5d\x25\xe0\x7d\xd9\x55\x94\xb2\x8d\x69\x2e\xec\x4d\x6e\x56\x9f\x77\x63\xf4\x3e\x66\x47\xce\x06\x49\xce\xcf\xb0\x62\x8b\xff\x6d\xb9\xe1\xe1\x14\xf2\xfd\x34\x90\xc0\xac\x03\xd5\xb2\xb2\x0e\x91\xbd\x25\x96\x63\x6f\xf6\xdf\xcc\xa5\x9a\x5c\x4b\x3c\xeb\xba\x7c\x84\x3c\x73\x3f\xf8\x44\x51\x26\xe2\xf5\xfc\xf4\x47\x87\xf0\x68\xbf\xda\x0e\xd1\x2d\xdb\xaf\xab\xfd\x2f\xac\x2a\x83\x8d\x1c\x77\xfc\x92\xcd\x20\x25\x28\xb1\xdd\xf6\xa3\x30\x59\xae\x42\x97\x0e\xd2\x7d\x4f\x7d\xcc\x91\x2e\xe0\x82\x59\x69\xfa\x0e\xd6\x71\x47\xeb\x58\x2a\xb8\x58\xd2\xfb\x78\x21\x94\xa5\x8e\x05\xd3\x2c\x06\x5a\x4b\xc6\xb8\x2c\xac\xcc\x4d\x19\xe5\x3c\x41\x45\xfe\xe7\xdf\xd2\x80\x70\x8e\xea\x6f\x32\xb0\x0c\xc0\xc2\xc9\xea\xcb\x3f\xe4\xd9\xbd\x7c\x9f\xa2\x7f\x15\xc1\x8a\xed\x22\x68\x3c\x4e\xc4\x26\x2b\xb6\x86\x93\xbe\xaf\xe6\x23\xb8\x46\xb5\xcc\x52\x50\x5c\x97\xf7\x47\x58\xd8\x54\x8f\x42\xfc\xe2\x52\x3f\x36\x2c\x97\xac\xd4\xbd\x00\xc5\x75\xe1\x27\x7e\x94\x6b\x77\x53\x81\x09\xa3\xcb\xfd\xb1\x66\xb4\x85\xa9\x98\x79\x14\x66\x30\x9f\x71\x5b\x71\x88\x8a\x78\xba\xca\xb2\x78\x92\x41\x28\x34\xaf\x16\xe1\xe5\xec\xa7\xb9\x2b\x04\xf5\x77\x15\xea\x73\x16\xf0\x30\x75\x97\x57\x0f\x6e\x21\x50\x14\x72\xf5\xd5\x43\xec\xd4\x6c\xae\x05\x25\x68\xc9\x26\xea\x77\x20\x1e\xb2\xfe\x46\xd1\x65\xc8\x57\xcc\xcb\xb3\xd9\xdc\xe7\x25\x91\x24\x23\xa0\x22\xce\x01\x21\xea\x69\x64\xdb\x9e\xe6\xfb\xcb\xf9\xc4\x93\x4a\x8e\x31\x82\x2e\x09\x5e\x32\x35\x40\x28\x40\x3e\x43\x0a\x82\x53\xb0\x30\xb7\xa7\xeb\x0c\xef\x3d\x10\xb6\x85\xbc\x47\xc2\x56\xb3\xf7\x50\x14\x82\xda\x65\x53\x10\xbc\x03\x05\x0d\x5e\xdd\xe8\xba\x56\x8b\xc0\xe9\x39\x4b\x78\xc3\x94\xae\x0c\x14\x54\xd8\xfa\x29\xea\xb1\x00\x17\x68\xc0\x02\x78\xcc\xfa\xc7\xf2\x2c\x85\x45\xbf\x29\x7b\xf4\x7b\x7c\xf6\x69\xe3\x7d\xbe\x67\xa7\xb2\x6f\xb7\x6d\xe4\xd1\xd7\x8d\x1f\x5b\x03\xb6\xa9\x90\x57\x7b\xc6\x69\x21\x6c\x19\xcc\xbc\x2c\xa4\xd1\x58\x55\x2f\x2c\x16\xe7\xb0\x6c\x77\x2c\x0c\xd2\xda\xf3\x91\xc5\x73\xa7\xf6\xd6\x61\xdb\x11\x74\x18\x5b\x09\x21\x7d\xe3\x8d\xd8\x88\xa7\xa4\xb2\x9c\x62\xed\x80\xeb\x5c\xf5\x75\x34\x94\x23\x45\x29\x61\x16\xa3\x1c\xd3\x60\x0e\x6e\x60\x50\xae\x4f\x11\xac\x72\x8a\xb2\x80\xce\xe1\x7d\x00\x08\x0c\x50\x1e\x80\x4a\xa1\x61\x62\xec\x51\x54\x15\xe3\x80\x95\xbe\x46\xdb\xc9\xda\x5b\x07\x19\xae\x85\x04\xc1\x59\x39\x10\xaf\x0b\x73\xbb\x1d\x45\x57\x2f\x9c\x57\x68\xb7\xb6\xa0\x46\x07\x30\xe2\xf8\xdf\x66\xb9\x54\xd8\xdd\xd0\xe1\xed\x92\x64\xd6\xe3\x74\x5d\xf1\xf8\x1d\x2e\x68\x70\x94\xa6\x04\x16\x9b\x97\xe7\xef\xc1\x72\x09\x53\xb6\xc4\x9b\x15\xc0\xbb\xeb\x08\x60\x36\x70\xbb\xff\xb6\xf1\x98\x8b\x95\xb4\x07\xd9\x90\xf6\x14\xe1\x2b\x8c\x73\xf6\x33\xb6\x95\xb0\x7d\x5f\xbd\xc3\xce\x83\xd1\x7e\x74\x20\x34\x74\x11\xab\x1c\x36\xc6\x34\xc7\x05\x7d\xb3\x64\xea\xe9\x37\xcd\x5f\x59\x8c\x40\xe5\x27\xdb\x2b\x8f\x16\x32\x83\x34\x8c\xc2\xbf\x4c\x32\x20\x8c\x52\x7b\x51\x48\x84\xad\x06\x2f\x61\x0e\x49\x90\x63\x02\xa7\x90\x10\x87\x3b\xbc\x9b\x52\xd5\xa8\x78\xcb\x6f\xec\x4f\x55\xa3\x6b\xa5\x45\x2b\x45\x37\x43\xee\xc6\xc8\x28\x1e\xb4\xcc\xed\xec\xbf\xe7\x3e\x77\x77\x07\xd9\xbf\x0c\xb3\xbe\x7a\xcf\x82\xe4\x06\x25\xce\x3b\xd6\xa3\x9e\x04\xe7\x62\x2c\x4f\xec\x30\xa8\x48\xd4\xf7\x3c\xd8\xdf\xf0\x65\x6e\xfc\x70\xa7\x83\x7c\xc5\xa8\xf5\x15\x7d\xe4\xb8\xf7\xce\xba\x00\xb3\x21\x07\x4f\x7b\xa7\x1f\xf2\xe0\xd3\x32\xb5\xdd\xf9\xd6\xed\xf9\x18\xe7\x39\x4c\xe8\x7f\x6f\xbc\xe3\x4f\xcb\x82\x12\x08\x16\xde\xc4\xf0\x3b\x29\xf7\x9f\xde\x49\x79\xd0\x19\xf3\xe1\x41\xd5\xb5\xdf\x5c\xea\x78\xef\x36\x77\x4e\xcb\x1d\x94\xe1\x7c\xc6\x5c\x9b\x7e\x83\x12\x11\x74\xa3\xfd\xf2\xb6\x1f\x89\x30\x16\x75\x98\x14\xcc\x0a\x4b\xe4\xdc\xe3\xd1\x09\xe7\x7c\x27\x3d\xd2\x2a\x09\x5b\xa2\x3a\x82\x84\x6f\x39\xa6\xba\xfc\xcc\x8e\xaa\x53\x1c\x6e\x76\x30\xec\x72\xa4\x44\x9d\x3f\x53\xc3\xce\xa5\x2f\xdd\x36\xa6\x28\x2c\x50\x0a\x13\x40\xc4\xe1\x55\x32\x16\xc1\x77\xf7\x61\x14\xae\xe4\x86\xee\x08\x50\x77\x2f\xc3\xb3\xa8\xdc\xa6\x05\x45\x39\xbb\x5d\x9e\xaa\x7b\xe5\x1b\xfd\xb1\xf2\x06\x9a\xbd\x44\x79\x5a\xca\xe8\xd0\xbc\x9a\x3f\x6b\xb8\xf4\xbd\x08\xd6\x2e\x7a\x0e\xdc\x5a\xca\xfe\x86\xb5\x94\x4a\x5b\x04\xc5\xc7\x2a\xe8\x86\x59\xdd\x8a\xc7\xd0\x57\x3a\xfc\x7a\xcc\xb3\x27\x23\x81\xf8\xa8\xd6\x56\x61\xba\x95\x96\xc3\xc1\x11\xb3\x9b\x5b\x8f\x5b\x50\x9c\x11\x08\x17\x4b\x2a\x2d\xdd\x7e\x0b\x51\x12\xf4\x16\x90\x5c\x44\x9b\x6f\xd2\x9a\x20\x87\x13\xbc\xbc\xdf\xf4\x22\x84\x86\x05\x45\xbc\x8a\x34\xdd\x12\x3e\xf3\x77\x05\x8d\xf8\xf5\xd0\x2b\x78\xc4\xe8\x52\x0f\x3c\xf0\xbb\x65\x1a\xe1\x97\x7a\xc8\x65\x4d\x09\xdf\xb0\x4b\xa3\x7f\x6b\x4f\xed\x41\x98\x1e\x52\xca\xef\xc7\x35\xe8\xd1\x1d\x86\xd1\x3d\xcb\x76\x05\xa8\x63\x02\xaa\x40\xe8\x88\xdf\x50\x53\xcd\xb4\xec\x30\x0b\x37\xfb\xba\x17\xda\x67\xd6\x12\xc9\x51\x37\x6e\x73\x46\x0c\x59\xbd\xae\xa8\xa5\xf5\x96\x51\x8f\x62\xda\xf4\x12\x29\x51\x4d\x16\x72\xf2\x98\xdc\xcd\x2c\x4d\x7b\x30\xd3\x03\xaf\xce\x92\x20\x4c\x10\x6d\xb3\xa8\x0f\x5f\xa1\x33\xd1\xf9\xb0\x65\x92\xef\x1b\xb6\x95\x39\x55\xeb\xe9\x3d\x9a\xc8\xea\x8c\x1d\x5b\x8f\xa6\x8d\x58\xb2\x1e\x14\x5d\x2b\xb6\x4c\x93\x93\xfe\xf1\x65\xdd\x2b\xd5\x1d\x6b\x56\xf7\xb1\xe9\x3d\xf0\x20\x4b\xf4\x11\xb2\x3a\x69\xa9\xc5\x83\xea\xb9\x50\x3d\x58\x5f\xde\x59\x9f\xab\x1e\x13\x85\xba\x55\x08\x4e\x28\xa3\xb7\xda\x6f\xaf\x5f\xc7\x11\x5e\x91\xd8\xea\x50\x7e\x30\x2a\x8f\x77\x3c\xa8\x5c\x45\x9e\xb1\xdd\xc1\xa3\xdc\xcb\x8d\xf5\x1e\xbd\x0c\xdd\xbc\x3b\x9c\xee\x2d\x17\x43\x8f\x50\x36\x8b\x6e\xeb\xe7\x19\xae\x2f\xf0\x6b\xf9\x86\x8d\x80\xb6\x60\x86\xf3\xfe\x76\xc2\x81\xbe\xe2\x80\x27\x16\x28\x79\x04\x73\x50\x04\x13\x08\xf3\xa0\xa0\x98\x79\xcb\x40\x9e\x36\x1a\xcd\x00\x99\x80\x19\x0c\x12\x9c\x65\x30\xa1\x30\xdd\x5a\x6f\x45\xae\x14\x43\xc0\xa0\x8b\xa0\xc4\x52\x18\x59\xa2\xdb\x24\x97\xa6\x47\x2a\xc6\x44\x88\x8a\xd7\xab\x6c\x8a\xb2\x4c\xdc\x15\xfd\x5a\x55\x5e\x89\xea\xf5\x5f\xc8\x4d\x5d\x5d\x2c\x95\xf1\x3d\xc2\x35\xdf\x1e\xd6\xd6\x08\x5a\x6b\xa5\xe2\xd5\x95\x1a\x0f\x52\x94\xb7\x4f\x54\xe0\x0c\xd0\xde\xf1\x69\x87\x5f\x2c\x3e\xcd\xc3\xdb\xfc\xe6\x64\xb0\xff\xc3\xed\x9c\x28\xae\x83\x6f\x09\x5e\x2d\x37\xde\xf5\x31\x4b\xb7\x36\xb7\xfa\xfa\xfd\xbe\xc7\x29\x9a\xa2\x07\xe8\x98\xdf\xc4\x37\xde\xed\x8f\x90\x14\x6a\x6e\xe8\xa6\xfa\x3d\xc5\xe9\xe6\xa3\x25\xbe\x96\x00\xb5\xc3\xf5\x03\xd4\xc6\x63\x67\x10\x7c\x82\x73\xaa\x24\x55\x3d\xd7\xa2\xe0\x45\xee\x68\x5b\x5c\xd9\x73\xb7\xe5\xf8\x70\x13\x96\xe3\xd1\x6e\xf9\x39\xa4\xa5\x96\x84\x6f\xc3\xc8\xfa\x2f\x69\x9e\x57\xbe\xec\x81\x2a\x81\xa6\xe5\x0f\x89\xa0\x08\xbc\x83\xc9\x36\x5e\xc2\x5c\xe6\xe4\x36\xb3\x74\xa3\x90\xa5\xc1\x2f\x21\x61\xd9\x6e\x51\x98\xe0\xe5\x7d\xfd\x63\x79\x79\x8b\x29\x0e\xa3\xb0\xfc\x19\xd0\xb8\xbc\x29\xa3\x94\xdf\x27\x17\x80\x94\x0a\x06\x25\x28\xd1\x90\x7d\xc2\x0c\x4d\x61\x72\x9f\x64\x30\x4e\xe6\x3c\xb3\x31\x43\x05\x8d\x29\x98\xb0\x81\x53\x50\x5c\xc7\x7c\xb6\x9f\x31\x62\x03\xb5\x62\xd1\xd4\x89\xac\x31\x0b\x38\x8d\x29\x5a\x40\xa6\x44\x55\xc3\x91\x0f\xa4\xf1\x1c\x12\xfa\xab\xed\x87\xc9\x3d\x8f\xd5\x06\x79\xaa\x13\x8d\x91\x76\x30\xf4\x06\xc3\xc7\x78\x30\xf4\x0d\x1e\x79\xf9\xb4\xc1\x37\xde\x1c\xfd\x72\x7c\xf3\x6a\xf6\x9d\x1b\xff\xaa\x81\x68\xa4\x43\x24\x69\x3e\x00\x5f\x24\x2c\x0d\x65\xe5\xe1\xd0\x8a\xd8\x0a\x3c\xe8\xf2\x7e\x05\xb8\x45\xb3\xc5\xf9\xf9\xe8\xfc\xcd\x77\x6b\xe2\x16\x31\x6d\xa5\x36\x9f\x54\x39\x28\xb5\xad\x6f\x08\x5a\x11\xdb\x22\xca\x10\xea\x6e\x9f\x0c\x4c\x91\x3a\xa4\xa7\x8f\x52\xc4\xc4\xf2\x66\xf1\x89\x04\x9f\x3f\xec\x3e\xfa\x2a\x90\x8a\xb6\x3f\x4f\x66\xdf\x9f\xdd\xbd\x6d\x41\x2a\x32\xb6\xc9\x20\x8c\x22\x73\x53\xfc\x1b\x9d\xc8\x6e\x9c\xf9\x37\x3a\xd1\xbf\xd1\x89\x06\xab\xf1\x1e\xe8\x44\x03\xf0\x88\x74\x0e\x70\x05\xa2\x85\xae\x64\x6a\x11\x00\x78\xc6\xa2\x7c\x5a\x12\x12\xf7\x34\x2c\x0a\x61\xae\x51\x71\x8b\x1a\xb7\x24\x3b\xf8\x86\xc3\x05\xcf\x02\xa5\xf6\x3d\x06\x78\x15\xe9\x2f\x35\x17\x95\x02\x23\x8d\xd7\x8a\xa4\x04\x87\x01\x29\xc9\x2c\xbd\xde\xac\xe0\x5e\x44\xe7\xc2\x3c\x24\x82\xd2\x41\x13\x41\xa9\x3c\x01\x98\x65\xc8\x80\x53\x8a\x5c\x87\x03\x3f\xf8\xc5\x5f\xb2\xa5\x15\x69\xc9\xf2\xa4\xe5\x19\x3b\x36\xa3\xd6\xc3\x1a\x90\x4d\xcf\x9e\x2a\xa8\xcf\x05\x27\x0d\xc7\xf4\x31\xb1\x7c\xc4\x8f\x3e\x50\x3e\x25\x81\x5a\x40\x7c\x44\x4f\x6d\x60\x3c\xd6\x47\x84\xe4\x3d\x6c\xe2\xef\x5c\x88\x15\x79\x10\xe4\x9d\xaf\x08\x9d\x86\xa9\x5f\xc3\x71\x69\xda\x95\x15\x4f\xa7\xde\x79\xb9\x20\x30\x0d\x8e\x3c\x21\x52\x6a\x0d\xf2\xb9\x3d\x9d\xbf\xec\xed\x88\x3a\x5d\x9d\x8d\x83\xce\x2a\xc3\x4a\x22\x17\x73\xd1\x91\x5d\x88\x79\x3a\x3a\xfb\x51\x23\x08\x5e\x8b\x37\xeb\x04\xe9\x52\xb4\x5a\x89\xa2\x4d\xc6\xe5\x00\xf6\x50\x00\x1e\x96\x11\x4e\x08\xba\x81\xc4\x9b\x09\xec\x62\x3a\x65\x9d\x78\x1d\x73\x0f\x39\x97\x77\xd2\x1a\xe8\xad\xa0\x3a\x7d\xd1\xad\xd3\xad\xac\x8e\xa7\x4e\x34\xa4\x41\xea\x5f\x6f\xe9\xd6\x5f\xa8\xfd\x1b\xa5\xa7\x13\xfb\x66\xc7\x86\x62\xf2\x14\x41\x7a\x06\x0d\xf4\x9f\x16\xa3\x87\x9d\xaa\x5f\x18\x9d\x47\xa4\xbb\x73\x5c\x9e\x47\x46\xe2\x71\x6c\x2b\x21\xb2\x6e\x18\x60\xc5\x7b\xbc\xca\x9f\x46\xd2\xbb\x09\xa0\xd1\x76\x52\x6c\x32\xd3\x71\xd4\x9a\xe9\xd8\x46\xb4\xbe\xc9\x8f\x9b\x42\xb2\x79\xd4\x64\xf8\x93\x3a\xd9\x66\xe3\x7d\x9f\x41\xb2\x40\x45\xa1\x85\x8d\x6c\xaa\x6f\x1e\xa1\x19\x9c\xb3\x15\xdd\xac\x27\x79\x2d\xa8\x93\x87\xc9\x1f\x54\x61\x4e\x38\x8f\x3e\x52\xaa\x7d\x98\xb0\x20\x54\xef\x00\x61\x75\xa0\x4a\x1e\xd7\xd3\x48\x64\x17\x89\x76\xea\x18\x09\x04\x69\x29\xd0\xd9\x49\xf9\xb1\xdc\xbc\xfc\xaf\xed\x9f\x08\x12\xbe\x95\xcd\x0d\x4b\x11\xd8\x63\xdd\x7e\x75\xfe\xc6\x96\x51\xa3\x76\x68\x01\x5c\xb3\x85\x15\x17\x68\x8b\xf3\x47\x21\xfe\x56\xf0\x42\x77\xd5\x0c\x3f\xc5\x56\x57\xc5\x58\xa1\xe2\x0c\x12\x89\x0d\xcc\x9b\xbf\xba\xa3\x30\x2f\x94\x2c\x2b\x75\xe0\x52\x9c\x9a\x60\x3b\xb2\xf1\x09\x4c\x32\x40\xa4\xb5\x63\x29\xfb\x6e\x37\xec\x58\xde\xcc\x36\x6c\xf8\xa2\x89\xf8\x93\x83\x05\x2c\x96\x80\x0f\xbe\x27\xe6\xa9\xc1\x1b\x32\xc2\xf7\x6b\xa3\x4b\xeb\xae\xb4\x17\x74\x6a\x67\xb4\x26\x7f\x56\xd3\x71\xab\x2a\x5e\x3b\xa3\x5d\x2c\x7b\x23\x2f\x39\x3b\xf3\xb8\x59\x3f\xc4\xe5\xca\x71\xa5\x4a\xca\xe3\x49\x4b\x8d\x1c\x76\x97\xf2\xd0\x77\xda\xb5\x1d\x2d\x76\x52\x6e\xff\x7d\x8b\x0e\x04\x65\x76\xa9\xa4\x59\x3f\x50\xbf\x70\x5d\x54\x20\xe3\xe4\x97\x01\x93\xbb\x6d\x57\x00\x13\xed\xad\x4b\xe7\xef\x83\xfe\x70\x71\xbf\x1c\xd6\xb9\xbd\xbb\x93\xda\xe1\xe6\x77\x3b\x70\xe9\x2a\xe1\xba\x98\x40\x5e\x7a\x8a\xe7\xe1\xaa\x8b\x4f\x69\x15\xd3\xf0\x62\x90\xd5\xc9\xdc\xe8\x64\x2d\x28\x89\x5a\x72\x69\xaf\xbe\x5f\x3a\x15\xa5\x21\xef\x54\x0e\x70\xf5\x35\xd5\x6d\xd7\x25\x59\xed\xa3\xab\x9b\x79\x0a\x68\x39\x2e\xd8\x9d\xba\x71\x8a\x03\xd1\x7d\xb7\xc6\xe5\x94\xe6\xed\xfc\xee\x60\x59\x1b\x92\x8f\x03\xc7\xc7\xe7\x82\xeb\x0c\x6c\xf4\x8a\x34\xd1\x63\x16\x19\x4c\x41\x4c\xc1\x2c\x8c\xc2\x55\x9e\xc1\xa2\xf0\x0d\x64\xac\x63\x18\x45\x0c\x20\xbb\x53\x1b\x71\x8a\x95\xad\x50\x89\x47\xac\x83\x1c\x13\x9c\x27\x2c\x04\x48\xf4\xc0\x4f\xf3\x98\x39\x61\x4b\x3d\xf4\x06\x92\x02\xae\x1b\x0f\xf3\xf0\x91\x83\xdb\x19\x9e\x3d\xf9\xe0\xb2\x82\x1e\xbc\x2f\xd2\x83\x8b\xc1\x11\x31\x51\x18\xb0\x79\x3e\x6e\x64\x4c\x75\xd4\xdf\xa2\xd4\x72\x94\x84\xd6\x48\x33\x3f\x3f\x6c\xbb\xe7\x54\x46\x02\xd8\xc6\x6b\xca\x09\x9f\x6d\xc7\x3e\x65\x78\xb6\x2e\x3b\x97\x6b\xb0\x01\x6e\x5e\x2e\x33\xf4\x75\x94\x06\x4d\xde\xc1\xd1\x1c\xe7\x79\x4b\x54\xa4\x8a\x3c\xcd\x63\x1a\x59\x56\xe7\x2a\x4b\xcf\xe7\xf8\xf6\x23\x9c\xc9\xfc\x17\x25\xe4\xf5\xb2\xd1\xa2\x94\x89\x37\x90\x3f\x2d\x83\x29\x6b\x6e\x0f\x4f\x4b\x2a\x86\x3c\xb5\x0e\x2e\xcb\xbb\x0a\x66\xba\x02\x7f\xec\xca\xb6\x21\x76\x5b\x0a\xcb\xb6\x47\x78\x35\x94\x60\xf6\x44\x9c\xe0\x9c\x02\x94\x5b\x03\xbb\x1c\x4d\xec\x66\x67\xe3\xfd\xa8\x38\xc5\xef\x20\x48\x6d\x28\x16\x72\x87\x36\x43\x6f\x4a\x55\xb8\xbc\x69\x6a\x2a\xc1\x29\x0e\x8e\xb3\x55\x41\x21\x09\x64\x8f\x6d\xbe\xa7\xda\xe0\x5c\xac\x26\x22\xd6\xcb\x71\x8e\x5f\xcc\x61\x90\x88\xae\xe7\xa0\x08\x72\x1c\x64\xec\x0d\x16\xcb\xb2\x00\x44\xdc\x8b\x0e\x22\x86\x85\x58\x88\xc2\xed\x6c\x2b\x2c\x09\x66\xbc\x8b\xf0\xf6\x6c\x85\x52\x58\x6c\xe3\x15\x05\x33\xb8\x35\xa7\x8b\x36\x2c\x8e\x8f\x10\xa4\x01\x98\xe0\x15\x0d\x3e\xb0\x06\xe5\x95\x06\xdf\x40\x72\xbf\xd5\x36\x49\xab\xbf\x40\x23\xfe\x87\x8b\x8b\x57\x77\xc9\x1c\xe4\x36\x85\xa9\x27\xfd\x2f\xf0\x35\xcc\x03\xd9\x5d\xf0\x8a\x73\xd6\x86\x96\xe0\x35\x40\x19\x4c\x03\x8a\x03\x28\x5f\x40\xe7\x30\xc0\x39\x64\xc9\x02\x01\x2d\x5f\xbe\xd5\x9f\x00\xfb\x3b\x3b\x6b\x4f\xfc\x1c\x92\x1b\x48\xd6\x9f\xf0\x51\x50\xf0\x9e\xd8\xfe\x09\x96\x84\xdd\x01\x8d\x4c\xaa\x14\x50\x10\x4c\x09\x5e\x04\x13\xc8\x00\x7c\xcb\x9b\x2d\xc5\x8c\x1a\xb2\xce\x97\xdf\xd4\xf7\x76\xf6\x36\xb0\xe7\x68\xf0\x1a\xaf\xf2\x74\x9d\x79\xff\x34\x07\x34\xb8\xc7\xab\x3f\xff\x96\xc0\x20\xc3\xf8\xba\x9c\xd7\x14\x13\x6d\xde\x49\x29\x54\x99\x77\x69\x02\x83\x69\xf9\xca\xad\xe0\x0d\x0d\x20\xa2\x73\x48\x82\x14\x43\xee\x7a\x82\x77\xa8\xa0\x01\x26\x2c\xfc\x06\x10\xc8\xb0\x90\xc1\x8a\xce\x31\x41\xbf\x1a\xa4\xa4\x38\x28\x20\x0c\x50\x0f\x8a\xed\x6e\x84\x62\x47\xd5\x78\x2c\x3a\xb6\xf2\x46\xc6\xd4\x21\xd3\x48\x08\xb4\xc4\x64\x78\xd2\xf7\x67\xbc\x22\x4e\x37\xe6\x5e\xc3\x86\xc9\xd0\xed\x21\xa5\x28\x9f\x15\x5b\x6c\x08\x85\xcb\xe0\x70\x74\xfc\x8e\xef\xbc\x76\x98\x82\x72\x75\xd8\x42\x2c\x09\xbe\x41\x29\xdf\xba\x04\xfe\xb2\x42\x04\xa6\xc1\xb2\x76\x4c\x6c\x05\xc7\xe5\x39\x93\x30\x76\x30\xc7\x0c\xd2\x05\xca\x51\x41\xd9\xf9\x17\xa0\x69\x40\xe7\xa8\x08\x50\x11\x80\x9c\xef\x98\x96\x65\xec\x4f\xb4\x33\x31\x54\x60\xf3\xc4\x3c\x1e\xe9\x6e\x11\x9d\x73\x52\x15\x88\x42\x95\x56\x25\xfb\xde\x20\x78\xcb\xc8\xe0\x98\x7a\x9b\x97\xd8\x97\x61\xd7\x16\x6b\xe7\x78\x01\xe9\xbc\xdc\xd3\xb7\xa5\xac\xba\x25\x38\x9f\xd9\x8f\x2d\x6d\xd4\x96\x3f\xb5\xd4\x6f\xd5\x68\xc6\x22\xfd\xca\x8b\x24\xcc\x6f\x10\xc1\xf9\x02\xe6\x1c\xae\x2f\x85\x37\x30\xc3\x4b\xfe\xb9\x91\xc0\xad\x52\x63\x49\x60\x68\x28\x30\x05\x05\xc9\x35\x4b\x55\x53\xe6\xd3\xf4\xc2\x68\xaa\xd4\x39\x95\x71\x38\xbb\x76\x66\xec\x88\xaf\x73\x6a\x53\xe5\xdd\xd5\x1d\xfc\x56\x31\xe4\xe5\xe5\xd8\x08\xd1\xbe\x9d\xa3\xaa\x50\x85\xc2\xa6\x9f\xf1\xc4\xc9\x9b\xdf\x62\x65\x8d\x29\x0e\xde\xca\x67\x1d\xa6\xdf\xfe\x6f\x17\x88\x2b\xee\x01\x94\xaf\x3d\x56\x1e\x1a\x60\xae\xd0\x79\x3f\xd4\x53\xcf\x9e\xb5\xa5\x9e\xd9\x76\x91\xfd\xa6\xc5\x4c\x1a\x95\x31\xa1\xb8\x99\xc5\x4b\x40\x29\x24\x1c\x3a\xa0\x32\x37\xc0\x5f\xd6\x48\x5b\xab\x2f\x4c\xeb\xdf\xbe\x24\xdd\x9f\xf8\xcd\xeb\xe5\x4f\xaf\x96\x47\xdf\xdf\x1f\xfb\x66\x1c\x4a\x43\x7a\xfd\x23\x0f\x00\x8d\x42\x40\x66\x3c\xf0\xfd\xb8\x9a\xb9\x72\x13\xab\x90\x7f\x78\x6a\x51\xe5\xb0\x6a\xc9\x2b\xdb\xf5\x32\xee\x1a\xdc\xb6\xdf\x8b\xdb\xae\xdc\xa9\x8f\x73\x50\xcc\xd9\xac\x78\xe2\x2c\xe3\xc5\x0c\xdc\xe3\x15\x1d\xce\x60\x92\x06\x9b\x62\xae\xed\x0a\x46\xe9\x49\xf3\xd8\xf1\xe7\xe3\x97\x3b\xdf\x1f\xce\xbf\xf2\xac\x56\x9d\xe8\x9b\x5e\xc4\xaf\x23\xe7\x6e\xff\xc7\xd3\x1f\x3f\x3d\x3b\x39\x68\xb1\x30\x8a\x08\x15\xc5\x01\x6f\xb1\xcb\x55\xc5\xa5\xcc\xf8\x6a\x05\xa7\x4b\xc5\xd1\xb5\x88\x87\xb1\x5e\x01\x96\xeb\x1d\x0f\x9d\xa5\x97\xa1\x19\x9a\xa0\x0c\xd1\xfb\x57\x1e\x09\x7b\x6d\xd1\x9b\x8e\x87\x1d\xd7\xf2\xc6\xd3\x3d\x72\x01\x03\x47\xe0\xa1\x57\xc2\xde\xab\x7a\xc6\xfc\xda\xdd\x3f\xd4\xd0\x2b\x3b\xaf\x49\x58\x57\xaf\xc3\x73\xd0\x9c\x44\xef\x97\xad\x27\x69\x39\x38\x57\x6f\x4f\xc9\xd5\xb3\xa8\xd8\x56\x5a\x08\xcf\x74\xd8\x33\x91\xcf\x48\xe3\xf3\xa5\x94\x43\xc3\xb3\x14\x95\xa0\x78\x79\x42\x00\xca\xff\x45\xb6\x03\xab\x16\xcf\x26\xfc\x90\xbb\xa1\x41\xd5\x7f\xd9\xbd\x60\xa1\xc4\x13\xdd\x09\xe9\xbf\xd0\x2e\x78\xf0\x0d\x90\xfe\x9b\xf9\x9b\x54\x78\xa2\x8c\x5f\xcc\xf1\x2d\x63\x88\x73\x8e\x6a\x78\xaa\x30\x61\x4f\x40\x03\x94\x4f\x71\x9f\x7d\xf1\xc5\xe1\x0c\xf8\x46\x10\x13\xdf\xd4\x56\xb8\x98\xc3\x80\x2d\xbd\x15\x30\x92\x59\x74\x73\x9c\x42\xe5\x57\xc8\xfc\x12\x28\xe7\x9a\x43\x36\xa8\xca\x60\x07\xed\x36\x0f\x68\x50\x2d\xf6\x90\x63\xa1\x9d\xe7\x24\x9b\xb2\xdb\xdf\x13\x87\x3e\xb0\xed\x24\x5e\x86\xe5\x5f\x6f\x23\xf1\x79\x6f\x74\x23\xe5\xf0\x56\x6c\xa6\x62\x09\x93\x9a\x48\xd5\xe6\x61\x46\x3f\x13\x65\xf5\x9f\x79\xcb\x58\x99\xeb\x6b\xdf\x31\xff\x7a\x7b\xe5\x18\x2f\x96\x19\xa4\xfd\x22\x75\x5b\x36\x8b\x5a\xda\x96\x55\xb4\x65\xbb\x83\x6d\x9d\x7f\x1f\x3c\xcd\x5d\xf4\x15\xef\x1f\x7b\xf0\x11\xc5\x38\x9b\x00\xaf\xa0\x23\xf1\x68\x8c\x28\x5c\x94\x04\xa5\x78\x19\x33\xe0\x90\xee\x15\x12\x7d\x8d\x74\x8e\x6f\xdf\x51\x46\x41\x1a\x56\x01\x81\xd7\x9e\x89\x33\x34\x9b\x53\x4b\x38\x23\xb3\xf0\x16\x88\xc2\xba\xa6\xcc\x55\x2b\xc3\x54\x26\xcc\x03\x8b\xb1\xd2\xe8\xed\x4d\xa2\x2e\xf9\xa6\x16\xa9\x93\xd2\x6d\xf4\x74\x61\x26\x15\xab\xc9\x9c\xc3\x07\xb6\x91\xb8\xce\x02\x5a\xcf\x52\xeb\x7d\xed\x72\x88\x21\x39\x99\x1a\x52\x44\xa6\x2b\xa0\x72\xff\xf3\xd8\xbd\xd6\x8d\xdf\x04\xb4\x41\xc5\x11\x6f\xc6\x30\x08\x4f\x34\xe0\x99\x0b\x3c\x9b\x65\xd6\xb4\x58\x54\xbc\x12\x12\x4d\x8d\x28\x1c\x69\xa5\x42\xa9\x62\x1a\x75\xc1\xc7\xd4\xfd\x31\xa1\x61\x41\x8e\x09\x6f\x09\xa2\x32\x9e\x28\x34\x8a\xc7\xc9\x07\x9f\xbb\x5f\xac\x0e\x6f\xa7\x6b\x26\x86\x4d\xdd\x2b\x5b\x4c\x36\x37\x68\xdd\x9e\x50\xaa\x6f\x71\x8c\x33\x8a\x96\x62\x41\x43\x40\x10\x88\xa5\xd3\x90\x25\x95\xcb\xd3\x43\x50\xa1\x08\x12\x90\x07\x04\x26\x10\xdd\x40\x05\x3f\xbf\xad\xe2\x55\x73\x13\x87\xa5\x98\x8f\x13\x44\x92\x0c\x32\x27\x8f\x48\xaa\xbf\x0c\x6b\x88\x2e\x54\xc4\x53\x90\xb2\x2c\x9f\x75\xad\x0c\xb6\x79\x83\x59\x0d\x40\x51\xc1\xf3\x04\x39\x66\x45\x23\x63\x4a\x40\x5e\xb0\xe8\xfa\x0e\xc9\x64\xae\xa8\xa3\x8a\x49\x68\xcf\x86\x4a\x32\xb4\x9c\x60\x40\xd2\x0b\x05\xc7\xb9\xd9\x5f\x1f\xf0\xa8\x0d\x08\xb3\x92\x1c\xa4\x14\xde\xea\xc1\xa1\x9c\x23\x06\x4d\x42\x17\x92\x86\xb6\xad\x1c\xf0\x6c\x5a\xf2\xe8\x43\x41\x5a\x69\x30\x56\x61\x6d\x26\x6e\xe0\x57\x69\x3f\xa9\xe8\x55\xec\x1f\xb7\x80\xc7\x18\x96\x17\x7e\x1e\x75\xc5\x34\xb0\xff\x0e\x9b\xb6\x61\x17\x1e\xd5\x73\x9b\xf9\x74\x6d\x34\xaa\xcd\xae\x67\x63\x89\x76\x9b\xce\x3c\x8b\xc0\x96\xf3\x7e\x81\xf3\x2a\x56\xaa\x01\xfc\xd1\x29\x5d\x6d\xba\x1e\xb7\xb5\x31\xa5\xee\xbe\xf5\xb9\x02\x52\xd5\x1e\x6d\xa7\xa9\x95\x82\xf6\x2f\xbe\x2a\x3c\x2f\xe1\xda\xfd\xf2\x88\x5e\x7a\x75\x02\x0f\x81\x5c\xab\x8f\x42\x73\x2c\x45\x30\x2f\xa6\x65\x47\x41\xf4\x53\x1a\x9d\x0d\xd7\xb6\x4c\x3f\x00\xdd\x8e\xd2\x94\xc0\xc2\x97\x70\xcd\x8a\xac\x94\x2e\xcb\x2e\xbe\x38\xf8\xd5\x09\xa0\x80\xdf\x08\x87\x4e\x25\xad\x7a\xe8\x9c\x8c\xe3\xe4\x29\x39\x47\xe2\x64\x3e\x2a\x7c\x1b\x7b\x69\x8f\x3b\x7f\xeb\xc8\xbb\xd8\xf4\x4b\x81\xb4\xb5\xf0\xa8\x63\x3d\x56\xf9\x1c\x82\x8c\xce\xef\x45\x07\x0e\xe4\x1f\x8d\x30\xaa\xb2\x08\x32\x48\x4a\x95\x0c\x81\x5c\x5e\x09\x74\x3d\x91\xc9\x0b\xb5\x96\xad\x5b\x63\xec\x35\x38\x4b\x27\x78\xea\xd1\x67\x0a\x29\xab\x0e\xe5\xd7\xa5\x71\xcd\x2b\x0f\x34\x09\x65\xd7\xaf\x67\x57\x2e\x73\x35\xc5\x96\x60\xf0\xa3\x2c\x0b\x1a\x4f\x35\xd8\xaa\x1f\x6e\x9c\x83\x1d\x52\xee\x1b\x20\x80\xc2\xd9\x7d\x1f\xf0\xa7\x7e\x06\x41\x6f\x10\xa8\x8e\x96\xc4\x59\x6e\xba\x76\x31\xf1\xb9\x0c\x30\xa3\xf9\xbf\xaa\xd1\xb4\xa9\x43\xb8\xb4\x12\xb9\x0e\x16\x98\x62\x7d\x2d\x58\x60\xe5\x29\x3e\xa9\x60\xce\x1c\x59\xdf\xfd\xa4\xe8\x10\x51\x53\x11\x78\x45\x6c\x30\x50\x16\x12\x7b\x31\x1b\xab\x7e\x86\x49\x62\x96\xc9\x76\x0f\xb5\x6d\x70\x41\x10\xc7\xd6\x1f\x1c\x92\xda\xe7\x7d\x8d\x4b\xf9\xbe\x7e\x29\xaf\xec\x09\x36\x5b\x98\x39\xd9\x54\x5d\xc8\x4a\x3a\xb4\x4f\xc9\x90\x46\xc3\x5f\xe3\x78\x83\x9d\x36\xaa\xa4\xe9\xa0\xa2\x79\xde\x39\x68\xd8\xc9\x92\x43\x18\x52\x10\x47\x49\x77\xf5\xdd\x48\x51\x58\x7d\x88\xc2\x8f\x70\xa1\xdc\x8c\x9d\x83\xeb\xcd\xdc\x8d\x97\xb6\x42\x36\x74\xf2\xf7\x29\x0e\xe4\xd2\xfa\xec\x3f\x5b\xb2\xd8\xf0\x6d\xe8\x3b\x48\xeb\x16\xec\xb5\x01\x07\x6d\xbf\x67\x1e\xfb\x62\x5a\x4e\xf1\xa4\xf7\x1e\x34\x76\xe0\xe1\xa0\x37\x5d\x5e\x86\xcc\x2e\x7b\x03\xd8\xf5\x00\xa5\xf0\x68\x3a\x45\x1c\xa3\x7f\x67\x67\x27\xa2\x64\x05\xd7\x28\x49\xaa\xa7\x23\xf9\x42\x74\x3c\xd6\x36\x65\xbc\xc5\x0f\xe7\x0d\xed\x2c\x4f\x7e\xdd\x94\xde\xfa\x33\xc3\xa4\x6c\x67\xdb\x53\x3c\x08\x26\xe5\xb1\xd6\x40\xa8\x46\x2c\xb7\x9f\x65\x4e\x75\xad\x84\x95\x9c\x1e\x92\x16\xcd\x72\x4c\x20\x7f\x91\xcc\xd0\x0a\x4f\x31\x37\xe9\x39\x04\x6c\xfb\xb5\xac\xc9\x1d\x1e\x9a\x93\xc2\x21\xb6\x15\x6b\xa8\x6f\xcb\x55\x96\x71\xab\x5c\x27\xe9\x2d\x96\x52\xbd\x14\x00\x63\x2a\x5e\xac\xe9\x51\x4c\xa8\xac\x12\x40\x25\x0a\x95\xaa\xe2\xe5\xdb\x5f\x4a\x7c\x1a\xfb\x1b\xf8\xa0\xcc\x87\x5e\x56\x5e\xd8\x50\xd9\x0f\xa5\x92\x3b\x87\x04\xd1\x38\xc1\x19\x2b\x10\x53\x85\xed\xb1\xbb\xc0\x62\x89\x09\x05\xcc\x1c\xa9\xef\xa2\x28\x54\x44\x40\xc3\xca\xab\xff\xe6\x34\xf3\x32\xa1\xda\x30\xf1\x72\x51\xeb\x6b\xe3\x55\x9e\x76\x1a\x79\x5b\x18\xd3\xad\xf3\xf4\xb6\x59\x0d\x2c\x7f\xbb\x09\xc0\xeb\x20\xc7\xb7\x04\x2c\x7d\x02\x04\x2c\x7d\x70\x20\xa3\x78\xc6\xeb\x6f\x74\x4b\x29\xb3\x65\xf9\x5a\x01\x8a\xe4\x77\x45\xd1\x82\x3e\xda\x2c\xae\xf5\x7f\xd6\x78\x8f\x0e\x51\xa3\xbd\xb3\x4e\x1d\x66\x79\x40\x9d\x2f\xb4\xdb\x1d\x12\x31\x0c\x67\xe9\xe6\x61\x87\x7d\x7f\xf0\xc4\x07\x58\xc6\x07\x5b\xbb\xf7\x68\x56\xde\x31\x0d\x9c\xee\xc7\x5f\xbc\x85\x1c\xc7\xbf\x57\xaf\xc7\xea\x55\x57\xa9\x2f\xbc\x7a\x02\x7b\xfd\x8b\xaf\x5d\xfb\x0f\xbd\x31\xfe\x07\xc5\xc0\xf9\xd5\xa8\x76\x68\xde\x19\x28\x28\xdf\x92\xf0\x02\x2d\x9c\xb7\x58\x75\xf1\x3a\xef\xeb\x42\x29\x1f\xdb\x62\x30\x9a\xef\x5b\xff\xf2\x54\xa0\x3c\x81\x01\xc8\x95\xf8\x88\xe0\x16\x14\x41\xb1\x4a\x12\x58\x14\xd3\x55\x96\xdd\x07\x7c\xbf\x9b\xc1\xad\x56\x42\xb9\xaf\x01\x7e\x64\x38\xc5\x6a\xa4\x46\xef\x37\x5f\x45\x16\x13\xfd\xe3\x06\xc0\x3d\x7c\xbd\x91\xef\x70\x41\xdb\x8a\x8e\xb8\xed\x04\xc1\x62\x95\x95\x8f\xe7\x30\x58\x82\x54\x96\x77\x6b\x86\xd3\x1c\x65\x99\xca\x10\x20\x4f\x03\x0e\x7d\x16\x2c\x09\x2e\xf9\x02\x16\x01\x98\xcd\x08\x9c\x95\x8b\xd3\xa6\x93\x6d\x32\x96\xa6\x7b\x81\x3c\xe8\xeb\x54\x22\x7b\xaa\x90\x7d\x85\x54\x7d\x3b\x1a\xab\x61\x35\x39\x4e\xd7\x2a\x95\xd2\xc6\xe0\x8f\x33\xba\x8e\xfa\x28\x03\xb7\x9a\xeb\x8b\xc7\x00\x9f\x56\xdb\x35\x89\xa5\x9c\x9b\x4d\x82\xeb\xe1\xc2\x21\xc1\x0c\x73\xa4\x11\x43\x0c\xd2\x19\x54\xb0\x56\xba\x63\x88\xc3\x02\xd2\x33\x02\xe1\x82\xe1\x1f\xbf\x46\x19\x85\x24\x1c\x14\x25\x6c\xd7\x09\x80\xa7\x32\xd0\x7e\x30\x2e\xab\x11\x7a\x38\x4e\xfb\x13\x4b\x5e\x9a\x87\x92\x8b\x9d\x85\x7d\x63\xaa\x75\x7a\x39\x66\xd8\xd6\x52\x73\x96\xd6\xed\xc3\xee\x3e\x5d\xfe\x09\xcf\x9b\xb7\xdf\x15\xbb\x36\xee\x30\x9f\xdc\x6a\xd2\x56\xbe\x46\x13\x14\xaa\x91\x47\x1e\x1c\x2f\x70\x35\x91\x17\x05\xcc\x60\x52\x1b\x65\xce\xd9\x47\x26\xe3\x4f\xeb\xba\x03\x92\x08\xa2\x5d\xfd\x8b\x12\xfd\x5a\x75\xa4\xff\x6a\x89\xb4\xaf\x63\x5b\x5f\x83\x04\xd2\x1f\x56\x90\xdc\x9f\x01\x02\x16\x4c\x52\xfd\xb2\x54\x3a\x68\x37\x70\x6c\x64\x9a\x6f\xf1\xa4\x31\xc1\xb7\x7a\xf5\xce\xaa\xb1\xfc\x7e\xc0\xa4\x58\xd3\x47\x98\x8e\x88\x81\x37\x67\x54\xcb\xc3\x2a\x48\xbe\x39\x3d\xe5\xa7\x01\x33\x94\xad\xbd\x27\xa9\x86\x01\x16\x10\x90\x64\x7e\x01\x19\xfc\xf4\x0b\x9c\x1f\x73\xec\xcc\x28\x7c\xc1\xea\x78\xce\x71\x96\x96\xc2\x21\x7c\x81\xf2\xe5\x8a\xf2\x90\x16\x1b\xe6\xbf\x96\xbe\x51\xf7\x79\xd5\x88\xb2\xb6\xcc\x8c\xc0\x52\x20\x81\x99\x5a\xce\x45\xa4\xe1\x9e\xb3\xae\x54\xa5\x77\x6b\x6b\x8b\x5b\x09\x13\xbc\x58\x82\x44\x98\x0c\x97\x20\xe5\x5a\x91\x6d\xf2\xfd\x35\xa3\x3a\x90\xad\xa9\x1e\xa9\x34\xd5\xec\xda\x05\x66\x45\x2b\xed\x67\x05\x1b\xa5\x5a\x69\xc1\x8c\x7a\x33\x0e\x8b\xf6\xce\x5c\x41\xb8\xe3\x3d\x6b\x85\x86\x02\xfd\xca\x97\x54\xc0\xd7\xba\x5f\x72\xa5\x96\xfb\x9f\xc1\xf3\xb2\xa1\xf2\x5d\xb2\x22\x04\xe6\xe5\x5a\xc1\x9e\x05\xac\x9e\x47\xe3\x7d\xfb\xd8\x30\xa1\x12\x4b\x47\x7e\x56\xea\xff\x6b\xbc\x26\xca\x27\x65\xa8\xa0\xda\x3e\x52\xbb\x30\xbe\x57\xba\x2a\x17\x81\xd7\xb8\xc6\x98\x7a\x94\x9c\x50\x87\xcf\x6b\x96\x0c\xaa\xbf\x55\x1f\xe8\x46\x75\x88\x1c\x10\x2d\x4e\xa4\xcd\x7a\x50\x8f\xa1\x9c\x54\x3c\xa9\x8b\x32\x94\xd4\x5c\x12\xcc\x8c\x39\x4a\xba\x88\x6f\x89\x9a\x37\x27\x6e\xa7\xe0\x7a\xe3\x89\xc2\x17\x55\xda\x51\xc8\xd1\x8e\xde\x70\xf0\xa5\xf0\x98\x7d\x0a\xf8\x47\xff\xb1\xf2\x66\xe9\xa3\x0c\x78\x81\x53\x34\xbd\x97\x03\x7e\xcf\x3e\xf5\x1e\x30\x6b\x86\x1e\x6e\xc4\x57\x55\xa4\x6d\xdf\x91\x59\xed\x3a\x1b\x1d\xd7\x67\x3c\xd9\xaa\xb2\x9a\xfc\x06\xf5\x16\x4f\x1e\x78\x44\x3f\x42\x52\x54\xb9\xab\x5e\x63\x12\x2d\x06\x8d\xcb\xa3\xd0\x9c\xac\x5c\x38\xc0\xa7\xea\xd3\xf9\xf1\xd9\xa7\x07\xea\xf9\x3d\xbb\xd7\xf6\xb3\x74\xb6\x51\x4c\x5f\xc7\x41\x05\xf2\xb4\xc3\xe6\xc0\x59\xc4\x20\xc1\x39\x15\xae\x53\x9c\x1f\xb3\x4b\x92\x38\x5b\x76\xb5\x9b\x3b\xbf\xdd\xdb\xae\x4f\x33\x4c\xf1\x91\xd2\xa7\xd9\xd6\xcb\x3d\x68\xad\x59\xa2\xfc\x68\xaf\x58\x65\xb9\xa2\xb0\x62\x20\xe2\x4c\xeb\x34\x01\xe7\xe0\xa6\x3e\x83\x96\x8a\xca\xd5\xc7\x13\x50\xb7\x8b\xf3\xd5\x62\x02\x49\x5b\xce\x58\xa0\xdd\x12\x47\x5c\x62\x11\x5a\x88\x32\xd6\x8e\x16\xff\xf8\xfb\xff\xea\xec\x07\xe6\x69\x47\x2f\x46\x8c\xaf\xd9\x49\xa7\x9e\xd5\x46\x90\xee\xd3\x7a\xc4\x6f\xaf\x37\x9a\x34\xaa\x4d\x79\x0a\x15\xcb\xa7\x10\x5e\x39\xe1\x63\xad\xb3\xf0\x95\x8b\xe5\x30\x72\x96\x95\xd6\x35\x0c\xf9\x94\xe7\x10\xfe\xe7\x60\xa1\xb8\xca\x6c\x4c\x18\x73\xbd\xae\x5d\x1d\x72\xd2\xde\x69\xea\xbb\x32\x4b\xbc\xd9\xcd\xf0\x0d\x2e\x6f\xab\x35\x1c\xea\xd0\xcd\x63\x35\x88\xec\x06\x15\x68\x92\xb9\x5c\xb7\x12\x8c\xb3\x25\xb4\x64\xbd\xba\xc5\xcc\x49\x60\xb7\xc2\x75\xf0\xae\x78\xfd\xd8\xf1\xee\x8e\xc2\xc5\x02\x08\x04\xa7\xb0\x06\xaf\x67\x08\x07\x20\xbf\xd7\xee\x6f\x5d\xce\x24\x5b\xf4\xa1\x76\xa3\x7c\x50\xca\xbd\x07\x34\x99\xc3\x47\xa4\x9a\xe9\xd2\x29\xdf\xcf\x40\x20\x28\x24\x0b\xe7\x0e\x2a\x28\xc1\xce\x74\x73\xed\x61\x3b\x0d\xfb\x4b\xb6\xf6\x75\xb2\x6d\x84\xf6\x2b\xec\xa3\xec\x83\xa7\xb1\x9a\xf7\x78\x45\x02\x71\x75\x0e\xa6\xcc\xdc\x1a\x54\xb6\x9f\x8e\xfd\xa0\xfe\xa0\x18\x32\x9d\x61\x9b\xf6\x65\xaa\x9f\x69\x74\x6f\xff\xe2\x31\x1c\x09\x22\xcf\xf1\xb1\xab\x58\x3a\xec\x10\x9a\x95\xa1\x66\xdf\x57\xb2\x6c\xe5\xe0\x7a\x95\x7b\x1b\xad\x57\x39\x6e\x61\xbf\xb5\xeb\x55\xb6\x75\x7e\xbe\x9a\x70\x27\xe7\xa0\x37\xd8\xfb\x7c\x6f\x29\x22\xd8\x76\x8e\x77\x14\xac\xdc\x7b\x6a\x05\x2b\xab\xe0\xf2\xfd\x2f\x57\xb1\x52\x7d\x75\x21\xd7\xf0\x81\xca\x56\xee\x3b\xcb\x56\x5a\x1e\x10\x99\x71\x7d\xd2\x69\x2a\x67\x57\x01\x13\x9c\xa7\x80\xdc\xb7\xe5\x6f\x5b\xbb\x73\x0f\xa3\xa5\xad\xe3\xec\xb3\x27\xb0\xb8\x5f\xf5\xcf\x59\x92\x73\xdf\x55\x92\xb3\x59\xab\xb3\xeb\xf0\x09\x6d\x36\xf0\xef\x70\x41\xb9\x91\xc4\x65\x03\xef\x7d\x62\x0d\x3f\xb3\x44\x78\x89\x18\x4f\x9b\x87\x61\x53\x07\xd7\xf0\xa3\x4b\x25\x5c\xef\xf3\x4b\x95\xab\x07\x43\x4d\xdf\x9e\xd6\xa4\x53\xd0\x30\x80\xf9\x08\xa2\xf6\x4e\xcf\x19\x79\x36\xde\xed\x59\x5d\xb0\xa8\xa7\xe2\xd6\x0a\x27\xc3\x89\x3c\xc8\xec\xe5\x75\x7c\x79\x1f\x1c\xaa\xec\x7a\x66\x29\xe2\x39\xd0\x22\xe2\xff\xe6\x66\x3d\xa2\x16\x99\xdc\x18\xe6\x12\x3c\x4c\x98\x66\x7f\xfa\x09\xc7\xa0\x3a\x38\x02\x41\xfa\x21\xcf\xd8\x12\x87\x1f\xcb\x0d\xc5\xff\xda\xfe\x89\xc8\xa2\x42\xeb\x5d\xca\xd4\x1f\xae\xa2\xcb\x67\xee\xa2\xf7\x07\x5f\x5f\xd1\x7b\x9e\x29\xaf\x7b\x2e\x86\x5d\x17\xba\x2e\x08\x87\x56\x29\x7b\x0d\xef\x9b\x32\x56\xa6\xef\x33\x83\xb1\x9f\xb7\xa3\xde\xf2\x87\xa6\x5c\x2d\x5f\xc8\x43\x6e\xde\xc9\xd8\x03\xfe\xf1\xe2\x7e\x29\xb0\xd5\x5e\xdd\x2d\x41\x9e\xb2\xfa\xcf\x0c\x5e\x80\x83\xc4\x84\x91\xa8\xfc\x13\xf3\x2f\xc2\xaa\x7f\xc4\x2b\xb2\x4a\xb8\x81\x1e\x5e\xdb\xa6\x2f\x5c\x84\xfc\x59\x40\x6f\x9a\x3c\xcb\x37\x80\x48\xb7\x72\x0c\x24\x6a\x84\x33\x7a\x66\x92\xd4\x98\x95\x6d\x15\xf6\x75\x05\xd2\x47\xe0\x29\xe3\x1c\x2c\xef\xba\x8f\x18\xdb\x3c\xcc\x9b\x97\xa2\x09\xd9\x89\xb7\x66\xb2\xad\xfa\x9c\xb6\xc0\x98\xc4\xc5\x2d\xb3\x5a\x34\x78\x88\xa3\x4a\x54\xa8\x26\xf5\x82\xb9\x23\xf3\x4d\x69\xd8\xe8\x8d\xcb\xc2\xef\xc4\xbf\xa3\xf0\x53\xae\x7c\xef\x27\xc3\x3d\xd2\xc9\x7b\x2d\x87\x37\x47\x3d\x30\x60\x82\x58\xeb\xbe\x87\x58\x4f\x1e\xb0\x2d\x8d\xca\x66\x2c\xf7\x92\xa5\x61\x3e\xe0\xa1\x5a\x93\x06\x15\xf1\x72\x95\x65\x30\xf5\xc8\xa8\x1c\xb6\x1a\x43\xd7\x23\x08\xde\x81\x82\x5a\xc1\xb3\x3d\xd7\xc5\xf6\xe6\xb6\x04\xf5\xe7\x4a\x21\x38\x69\x48\x50\x56\x69\xc5\x46\x72\xa1\x5b\x13\x5a\xa4\xa8\xb1\xec\x66\x56\xba\xbb\x67\x35\x89\xe2\x8a\x27\x4e\xb4\xe5\x4c\xf8\xf1\xe7\x23\xa4\xca\xf8\x98\x8c\x0e\xd7\x32\x19\xd5\x66\x62\xbb\x9b\xc8\x42\x76\x9b\x10\x3c\x81\x45\x42\xd0\xb2\x8a\x7d\xf3\x9d\xe0\xa0\x9b\xaf\x4f\xc3\xb6\xfb\xaf\x8d\x89\xc6\xcf\x9b\x4c\x54\x1d\xa0\x6d\x38\x22\x47\x94\x12\x34\x59\xd1\x2e\x13\xbd\xfd\x38\x04\x55\x6b\x86\x0a\x47\x56\x09\x5d\x11\xf7\xe9\xb8\xa9\xfb\xb8\xc9\x45\xcf\xa3\x5d\xb5\xc2\x5e\x35\xaa\x33\x80\x48\xd1\xb8\x9f\x5b\xc7\x7f\x3e\xc7\x84\x17\x78\xad\xbf\x8b\x29\x10\xc8\xb8\xce\x28\x82\x36\xaf\xcc\x90\xe9\xfb\x89\x5b\x3f\x17\xa9\xd9\x78\x63\x6e\x1d\xfe\xdf\x29\x96\x17\x02\x27\x0f\x59\x29\xd4\xeb\x67\x3b\x75\x4d\x25\xa3\xa7\xf8\x61\xdf\x1f\xf6\xb6\x8d\x3d\xe2\x4d\xab\x41\xd1\x61\xd7\xac\x5e\x5e\x99\x3e\x5b\x48\x4b\xcd\x70\xcb\x00\xbf\xbd\xf4\x84\xe8\xfe\x1e\x52\xe0\xba\x78\x5b\x53\x2c\x17\x90\x82\x56\xd1\xb7\x29\x91\xb7\xfe\x3a\x59\x87\xea\x2b\xed\x3c\xa4\xdc\x70\xe9\x36\x50\xaa\x6d\x44\x9a\x9d\x62\xb6\xe8\x2e\x19\xd6\x75\xee\x0f\x74\x53\x5f\xcc\x51\x21\xd0\x7a\x83\xf2\x5f\xac\xd8\x78\xb9\x26\xbc\x3a\x7b\x8e\x83\x72\xb5\x82\x7a\x71\x86\x17\x9c\x68\x97\xa0\x16\x2e\x1f\xed\x5e\xb1\xa8\xa4\x30\x0a\x69\x18\x85\x04\xdf\x3a\xfe\x05\x42\x47\x09\x6b\x06\x2f\x22\xac\x21\xc5\x6a\x92\x83\x1b\x59\xd7\x1a\xc8\xcc\x8d\x05\x2b\x2f\x7c\x17\xa3\x84\x7d\xa4\x1c\xa1\x9e\x41\x9a\xe4\xb8\xfc\x69\x09\x09\xc3\x0c\x67\x75\x4c\x18\x1e\xc3\xf2\x3e\x9e\x48\xa8\x13\x7a\x8b\xe3\x82\xc2\x65\xfd\x0d\xc3\x16\x89\x97\x78\x89\x19\xd8\x63\xb8\xcc\x56\x04\x64\x3c\xea\x7e\x95\x67\x90\x25\x4d\x94\x3d\x02\x1a\xa7\x02\x09\xaf\xfe\x86\x55\xa1\x5d\xe0\x45\x39\xe2\x29\xc1\x8b\x38\x67\x33\x14\xb5\x91\xc5\x0f\x14\x8b\xaf\x05\x04\x46\xcc\xb3\x0e\xb7\x45\x12\x22\x4b\x5d\x8d\x79\x54\x41\x9c\x12\xbc\x4c\xf1\x6d\xf9\x0a\x1e\xf5\x11\x4f\xf0\x1d\x2b\xe0\x5d\xd0\x58\x89\xfa\x13\xdf\xf0\xad\xa7\xa6\xb9\xc5\x9c\xc6\xac\xcc\x37\x7b\x04\x24\x09\x26\x29\x6f\x93\x80\x25\xa2\x72\x76\x96\x1d\xdc\xb3\xc4\x2f\x2f\xc9\xbb\xf1\x42\xbf\x0b\x9c\x23\x5a\xf2\xc2\xd3\x2e\xf5\xbb\x9d\x9d\x5e\xdc\x4c\x3e\x7c\xfa\xa7\x2d\xf5\x5b\x9d\x2f\xb7\x28\x6d\xf8\x56\x42\x3d\x8e\x8e\x25\x01\x12\x08\xd2\x00\xcc\x34\x28\x71\xcd\xd5\xc7\x47\xab\xba\xc2\x32\x78\xc3\xad\xa5\x35\xa8\x39\xce\xdf\x95\x5f\x8a\x74\x26\x65\x1e\xfc\xd9\x06\xa5\x94\xdc\xab\x83\x66\x71\x9a\x67\x96\x0e\x1a\x65\x1e\xac\x80\xef\xb6\xa1\xab\xf6\xe5\x65\xe5\x4f\x62\xf6\x5c\x36\xef\x6f\x88\x62\x14\xb6\xc9\x4e\x53\xa0\xf6\x15\x84\x09\x28\xf7\x31\x7b\x57\x5c\xed\x13\x53\x3c\x4e\x31\x99\xa0\x34\x85\x79\x7d\x14\xf6\xde\xda\xa2\xf3\xcd\x6d\xee\xaf\xa2\x7c\x77\xf1\xcb\xe9\xf7\x3f\x4c\x0e\xb7\x3b\xf7\x74\x11\xda\x76\xe3\xf0\xc2\xd9\x0c\xba\x8c\x2f\x5a\xd3\x43\xae\x6f\xf2\xdc\x55\xae\xbf\xcd\xaf\xee\xae\x5e\xe4\x7e\xd8\x56\x55\xc7\x18\x76\x79\x84\x75\xa7\x44\x0b\xfd\xb3\x77\xee\xa2\x92\xa4\xb8\xe7\x9b\xa4\xb8\x3f\x24\x49\x51\xf0\xe8\xd6\xd6\x96\x6b\xef\x0e\x4c\x42\xee\x2c\x01\xb1\xc0\x13\x94\x41\xb7\x98\x75\xaa\xba\x5c\x81\x89\x5d\x6b\xaa\x93\xfe\x60\x70\x6e\xac\x48\x1b\x35\x52\x63\x6b\x64\x77\x33\x1f\xb6\xfe\xc5\xbd\x1e\xce\x74\x58\xd1\xb8\x2b\x07\x63\x13\xf3\x3a\xa7\x80\x36\xb3\xb4\xf9\xb7\xb6\x79\xd5\xbf\x0c\x98\x97\x68\xfc\x18\xf3\xaa\xb1\xff\x1b\x93\x3b\x51\x41\xfd\x9b\x33\x34\x7e\x1e\x30\x4d\xb5\x87\xc7\x98\xab\x4c\x09\x33\x27\xaa\xa6\x8a\x99\xb3\x54\x7f\x1b\x30\xc5\xaa\xf9\xa3\xcc\x8f\x45\x00\x35\xa7\xc7\xbf\xb6\xce\xae\xfe\x69\xc8\xe4\x44\xeb\xee\x6c\xf4\x41\x10\x43\x96\x00\xb1\x53\x76\x7c\x58\xec\x01\xcd\x3a\x65\xbe\x29\xd1\x75\x97\x1b\x4c\x86\xb6\x2b\x80\x5f\x47\x26\x74\xb8\x7e\x1e\xb4\x54\x6d\x06\x65\x41\x87\xfe\x69\x9e\xc8\x19\xde\xf6\xe6\xa4\x4f\x0e\xa2\xed\x25\x89\xc4\x3f\xa8\xdf\x56\xc4\xe3\x9d\x9d\xe5\x1d\xab\xc4\x44\x56\x79\x02\xe4\x6d\xba\x2d\x1c\xe4\x54\xfe\xb6\xc6\x58\xaa\x21\x34\xcb\x30\x5a\xdf\x59\x1f\x3e\xad\x2f\xb5\x85\x85\xdb\x26\xa8\xe8\x0b\xa2\xe4\x4d\x8b\x29\xbd\xc7\x6c\x52\xfd\x04\xb1\x4c\xc4\x38\x63\x36\x41\xc2\x9b\xf6\xbc\x60\x55\xde\xfb\x12\x4f\xd0\xe6\x37\x41\x15\x82\xd9\x33\xf4\xf0\x37\x3c\x8b\xcb\xdd\xd0\x2f\xae\x70\x70\x3a\x6d\x2d\xae\x9e\x5b\x30\xaf\xda\x52\x67\x2d\xc7\x06\xcb\x99\x3d\xe5\x19\xb5\x7d\xb3\x65\x5b\x72\x65\x5b\x32\x65\x9b\x5a\x74\x77\x9e\x6c\x3d\xe5\x91\x6a\xe6\xae\x6e\x16\x36\xbc\x13\x8f\x1b\x42\xfb\x01\x3f\x2c\x2d\xb7\x31\xbd\x9e\x49\xb9\xec\x47\x77\x4a\xee\x3f\xfe\xfe\xbf\xf4\x27\xba\x92\x6d\x2d\xa9\xb6\x75\x07\xe6\xc1\xea\x85\x0d\xd5\x25\x49\x36\x96\x5e\x5b\x85\x42\x8c\x98\x34\x9d\xc3\x1b\x82\x73\x89\xfe\x27\x17\xd0\x47\xcc\x6c\x24\xd3\xd6\x3e\x1a\x19\x0d\xe3\x37\x9c\xb5\x72\x6c\xfb\x99\xf7\xaf\x7c\xb2\x6b\x7b\xb9\x58\x0c\x9b\x20\xfb\xc5\x6d\x29\x70\xa6\x11\x0e\xf3\xcf\x9c\xe2\xa0\x36\xcd\x3c\x8c\xef\x05\x06\x49\xb6\x2a\x28\xac\x52\x02\xb3\x7b\x56\xeb\x3b\xc7\xd2\x27\xc3\x66\xd9\xea\x73\xb1\x67\x5f\x6a\xa4\xe2\x79\x86\x96\x1d\xf7\x00\x24\x13\x69\x96\x0f\x44\xb2\x53\x5c\x95\xac\xed\x9d\x4f\xd9\x4e\x37\xaf\xec\xe2\xa7\x42\x95\x06\x19\x1c\x49\xc2\x95\x09\xd1\x4c\x11\x76\x26\x02\xef\xba\x76\x7c\x77\xc2\xa9\x9d\xbe\x4e\x4b\xb5\xe6\xd7\x73\x98\xad\x99\x85\xba\x69\x7c\x36\x5c\x59\xdc\x46\xad\x98\xac\xed\xee\xaf\x0e\x8f\x97\xb0\x8e\xb3\x0a\x95\xdc\xe5\xc5\x86\x52\x5e\x0e\x45\x67\xaa\x9f\x10\xfe\xd2\xc7\x04\xbe\x61\xb7\x56\x86\x79\x85\xf1\x27\x6e\xfb\x3e\x7a\xb7\x7a\xf7\xf2\x8f\x17\x3f\x69\xb6\xef\x36\xf7\xd0\x1c\xf0\xf2\x29\x31\x57\xe9\x95\x10\x04\xae\x89\xed\xd8\x0c\xd6\x4e\x07\x88\xa0\x52\x5c\x2c\x51\x9e\xb3\x0b\x82\xf7\x7a\x89\xa6\x1b\x58\xb1\xf2\x3e\x96\xb3\x3e\x0d\x17\xcb\xd3\x5e\x3a\x72\x7f\xb0\x73\xf8\x71\xe7\xa3\xb1\x74\xbe\x71\x2f\x4d\xe3\xb2\x4f\xd4\x4b\xd8\x58\xe8\x52\x69\xa2\x60\xc6\xae\xc8\x51\xf8\x82\x12\x34\x9b\x41\x52\x21\x0f\x36\x8c\x5e\xbc\x6c\x31\x17\x0e\xaf\x72\xa5\x8e\x71\xad\xb4\x87\x29\xba\xd1\x40\x03\x03\x86\xeb\xc9\x54\xbc\x48\xf3\xeb\x69\x46\x9f\xca\x55\x28\xb8\xcb\x74\xbf\x6a\xd6\xb0\x77\x86\x5b\xb0\xc3\xa8\x22\xa8\x35\x52\x84\xff\x04\x92\x78\x89\x6f\x21\x91\x72\x6c\x49\xa0\x04\x2b\x17\x44\x63\x2f\xf9\x46\x95\xba\x55\x08\xa6\xb4\x0a\x59\x23\x2e\x2d\x7a\x5a\x35\x88\x91\x0a\xf3\x3a\x56\xdc\x02\x15\x04\x6f\x60\x12\xae\x8e\xcd\x3e\x10\x48\xf2\x32\x5e\x59\x81\x43\xcc\x70\xb9\x6e\x8c\xec\xe7\x94\x40\xb0\x90\x96\xa7\x73\xca\xc0\xd6\xce\xcb\x3b\x47\x78\x15\x85\x41\x86\x67\x41\xa1\x3c\xc2\xc7\xa1\xc1\xcf\xee\x45\x97\xbb\x87\x36\xca\xf3\xd8\x0d\xfe\x02\xd5\x91\x63\xf7\x4f\x55\xe4\x62\x9e\x20\x9f\xc1\x2e\x60\x8a\x40\xbc\x04\xab\x82\x45\x59\xf0\x4f\x19\x10\xe5\x2e\x9b\x55\xa0\x1a\xc0\xdc\x8d\xe3\xdf\xfe\x45\x77\x90\x56\x0a\xc8\x75\x67\xb0\x56\x68\xf7\x8f\xcb\xd9\xbd\xd0\xa6\xa7\xf8\xb4\xf9\x03\x0a\xef\xeb\x74\x68\xde\x60\x2d\x86\xd9\xc6\x61\x2f\xf6\x4f\x7d\xcc\x2b\xcc\xad\x1e\xde\x5a\x40\x09\x3b\xfe\xab\x23\xb7\x62\x8b\x78\x8a\x3c\x83\x4b\x1c\xd2\x77\xb3\x72\xdd\x88\x94\x79\xda\x82\x7d\xf2\xf9\xfa\x4f\xef\x27\xaf\xde\x99\x67\xb2\x48\x65\x74\x59\x62\x6d\x16\x77\x0d\x4a\xcd\xb3\x1c\x70\x43\xd4\x49\xb8\x7d\xe5\xd8\x17\x03\x91\x28\xd7\x6a\x5e\x84\x05\x7d\x5f\x22\xef\xa7\x70\x09\xf3\xb4\x08\x70\x5e\x97\xc6\x0d\x52\x99\x92\xd7\x29\x04\x46\x5e\xb5\xdd\x5c\xb5\x88\x1d\x57\x0b\xb1\x4f\x5c\x34\x2b\x6f\xfe\x0a\x76\xdc\x23\x11\xea\x16\x14\x01\x81\x45\x32\x87\x25\x57\xb5\xe0\xba\xeb\xb4\x99\xa3\x42\xb0\xae\x5f\x11\x82\x61\x24\xb9\x05\x85\x40\x23\x37\x03\x58\x1f\x96\x20\xcb\xfa\xa5\x7e\xe4\x98\x08\xdb\xe1\x06\x68\x61\x8a\x4e\x7b\x62\x71\xa8\x86\x6d\x5c\x8a\xc3\x59\xad\x82\xc5\x06\xf3\x82\xe0\x15\xe5\x85\x08\xb8\x49\x55\x23\x70\xb1\x05\x0c\xa8\x42\x63\x01\xba\x5c\x57\xba\x19\x4f\x5b\x39\x35\xb8\x4c\x19\xb4\x69\x9e\xb2\x9c\x15\x8a\xd5\x62\x57\x39\x87\x24\x36\x63\x79\xf2\x7e\xae\x81\xbb\x2b\x96\x68\xa1\x95\x2d\xc8\xa5\x49\x1c\xbe\x68\x9f\xf1\xa4\xd8\xfa\x8c\x27\x5b\x14\x14\xd7\xa2\x16\x92\x8e\xf4\x68\x41\xb5\xd6\x66\x5e\x0e\x2e\xe2\xae\xa6\x6a\x8c\xb6\xe7\xca\x17\x7c\x5b\xf6\x7f\xaa\xa7\xc3\xf8\x68\x87\xbe\x3d\x9a\x7a\x9e\xa1\xe6\x75\x30\xa2\x9b\xf3\xf4\xea\x24\xd6\xc1\x88\x53\xc7\x8e\x68\x63\x53\x11\x5a\xde\x36\x24\x2f\xce\x39\x30\x0e\xdf\xdb\x9d\x1c\xa7\xcf\xf3\x59\xaf\xee\xfc\x95\xa1\xc8\x76\xdc\xe2\x1c\xc6\xd6\xf0\x70\x95\x1a\xad\xb9\xb9\xcd\xe5\x60\x57\xd9\xca\x0d\xe8\x48\xd1\x6d\x61\x2e\xb3\x83\xf5\x76\xf0\x8d\x16\x0a\xd0\x77\x13\xab\x4e\x72\xde\xa5\x63\x71\x84\x4b\x4a\x26\x9c\x79\x6c\xad\x2e\x29\xc1\x84\x84\x0c\xe7\x92\x31\xa5\xee\x77\xfb\x3a\xff\x5d\x2a\x01\x1f\xbf\x55\x98\xba\x36\xf5\x90\xad\xae\xac\xd8\x73\x45\xc6\xb9\x56\xaf\x12\x34\xa1\x19\x1d\xe7\x21\xb1\x7b\xaf\xb9\x83\x36\x1a\x66\xb3\xc7\x25\xea\xdf\x4c\xf5\x58\x4c\xa5\xbb\x1e\x7c\x18\x8a\x4f\xcb\x93\x97\x74\xd9\xe1\xcd\x4e\xa1\x85\xcf\x5b\xce\xef\xe2\xac\x8e\x88\x69\x7d\xee\x23\x94\xf6\xd7\xab\xc6\x60\xca\xff\xb6\xb6\xb6\x5a\x7c\x5f\x5e\xac\x21\x95\x92\xb0\xe9\x3f\xef\xd6\x3e\xd6\xe2\x15\xde\x9d\x1d\xf1\xc2\x9d\xc5\xd8\xcc\xdc\x17\x8a\xb0\xd5\x91\xb3\xed\x37\x94\x5a\xe8\xb8\x07\xd4\x23\xa3\xa8\xc1\x29\x72\xa8\x36\xdc\x90\xf5\xc5\x90\xc5\x63\xa2\xfb\x32\x77\x3c\xb6\xc9\x40\xce\x57\x66\xa0\xd8\xb5\x9c\xc4\xbd\xb1\x20\xaa\x35\xea\x6c\x7b\xab\x8e\x15\x59\x5b\xcc\xf9\xcd\x4b\xcd\x48\x2d\xa6\x26\x8a\xa8\x45\x26\x5c\x7b\x41\x01\x2d\x2e\x08\x48\xae\xa5\x05\xeb\x9d\xf4\x84\x84\x2f\x20\x21\x98\x70\xc1\xba\x5c\x39\x6e\x37\xb5\x91\xb6\xec\x49\xfd\x62\x0a\x69\x32\x3f\x67\xdf\x9a\x15\xa0\xd5\x26\xaf\xf8\x4b\xec\x99\x2f\x9d\x6a\xde\x97\x23\x89\x28\x3d\xf7\x65\xa8\xa2\x79\x65\x74\x9b\x5e\x86\xf2\xeb\x98\x62\x99\x5f\x06\x08\x01\xf7\x75\x32\xdc\x67\x3c\x89\x51\x5a\x7f\x5e\xe0\x9c\xce\x5d\x29\x72\xf2\x9e\x20\x92\x5d\x78\xb2\x9e\x62\x9c\x2b\x47\xda\xd7\x68\xa8\x99\xf6\x1e\xca\x6a\xc8\x06\xf6\xc4\xcd\x86\x07\xc7\x7f\xbc\xf9\x7e\xf4\x3e\x53\xcd\x86\x2e\x1b\x8e\xce\x27\x7a\x54\x82\x22\xf3\xd4\x00\x05\xb1\x36\xe6\xf5\xb9\x66\x66\xdb\x49\xfb\x8f\xbf\xff\x3f\x4e\x37\xbe\xe0\x7c\x2f\x03\x92\x84\x0d\x1d\x68\x49\x3a\xc6\xab\x2c\x65\x10\xe7\x09\xce\x32\x98\xd0\x40\x6c\xa3\x4e\x43\xd2\xee\x43\xd8\x1c\x5b\x52\x76\x04\x56\x57\x32\x07\x84\x06\xc6\x94\x2c\x13\xb5\x5e\xb6\xa5\x60\x60\x1b\x92\xc2\xf4\x9c\xaf\x5c\x14\x06\xdb\x81\x56\x4f\x9f\xff\xfc\x11\x16\x90\xdc\x08\x93\x98\x93\x22\x3b\x51\xb8\x24\x78\x56\x05\x8e\xd6\x37\x5d\xf9\x75\xbd\x48\xa1\x26\x7a\x74\x04\xaa\xfd\x68\xac\x0f\x93\x6f\xad\x70\x09\x49\xc2\x72\x08\xc5\x73\x7b\x51\xb8\x00\x77\x61\x14\xba\x20\xc3\xf4\xe3\xbf\xd9\x4b\xab\x1a\xe2\xf0\xf4\xa8\xd1\x10\x86\x6a\xa0\x0b\x47\x90\xa7\x95\xfc\x12\x82\x72\xb0\xd8\x2a\x87\xfe\x60\x72\x4b\xe4\x11\x3e\x6d\xc9\x75\xf6\x7c\xf9\xeb\x2e\x9a\x7c\xe7\xf4\x64\x53\x30\x29\x44\x41\x47\x19\x7a\x69\xb1\xc0\xc8\x18\x3a\x2b\xba\x43\x98\xa1\xea\xc7\xa6\x03\xdb\xd0\xef\xcb\x23\x3c\xa1\xe8\x06\x1e\x57\xbb\xdc\x6e\xa1\xdd\x92\x09\x8e\xd6\x33\xbb\x14\x0d\xbc\x1f\x57\xa4\xf2\x87\x1b\x48\x6e\x10\xbc\xd5\xd4\x76\x2b\x72\x87\x75\xfc\x97\x97\xa3\x83\xf2\xbd\x8a\x06\x39\x45\x19\x2c\xde\xa1\xfc\xfa\xa8\x7a\xb1\x36\x8c\x9e\x26\xe8\xad\x69\x11\x13\x8c\xed\x57\x5f\xe7\x9d\xf7\x75\x39\x08\xe7\x9c\xba\xcc\x6f\x7a\x84\x48\xa5\x7d\xa0\xe9\x1a\x7b\x8c\x31\xce\x66\x77\xd9\x72\x19\x4f\x08\x04\x69\x42\x56\x8b\xb2\xdf\xa7\xbd\xc7\xe0\x2f\xc7\x2f\x5f\xdd\xfc\x70\xa6\xee\x31\x4b\xc4\x8e\xe3\x56\xca\xee\xe9\xe3\x48\xd3\x0b\x0c\x1d\x61\x64\x64\x58\xcb\xfe\x2e\xf7\xf6\xf8\x03\xe3\x92\x79\xc8\x8c\x81\x5f\x96\x24\x13\xcc\xa8\x5f\xbd\xf7\x0e\xb4\xeb\x74\xa8\x50\x78\x3b\x6c\xa4\x7c\xef\x46\x97\x21\xbd\x5f\x72\x2e\xaf\xc7\x6d\x1b\x86\x7c\xa7\x68\x68\x4f\x00\xdf\xe5\xdc\x3a\x56\x6d\xc6\x57\x82\x85\x43\x6d\xb1\x45\x77\x51\x98\x28\x0e\x73\xfd\x09\x08\x92\x79\x18\x85\x31\x2d\x35\xff\x58\xaa\xcd\x19\xe4\x00\x15\x82\x8f\xd8\xbf\xf3\x84\x1d\x5e\xd8\x2f\xfe\xc9\xc9\x82\x9b\x65\xef\x1a\x28\x42\x46\x10\x3d\x71\x0e\xdf\x2f\x7e\xfa\xfe\xe0\xd7\xf4\x7b\x4d\xff\x1d\x5b\x51\x18\x14\x14\xa2\xab\x26\xbf\x36\x2d\xe5\x23\x8b\x6a\x5b\xdd\x1f\x5b\xf3\xab\xcd\xeb\x65\xb1\x9a\xcc\xa1\xd0\x97\xb9\x96\x93\xe0\xac\x58\xb2\x04\x7f\x57\x39\x87\xb0\x51\x97\x9a\x85\x19\xf1\xc1\x74\xd8\x74\x1a\x8d\x78\xef\x5b\xca\xb5\x4f\xd9\x08\x6c\x9b\x0e\x51\x9d\xd4\x3b\xf1\x9e\x96\xb1\xc3\x5e\x1b\x29\xd8\x43\x3c\x21\x4e\x39\xb1\x94\xf9\x58\x0c\x69\xf5\xaf\xe1\x56\x58\x0d\xb0\xbe\x83\x8c\xc5\x45\x77\xe4\x09\xe9\xe0\xbf\x64\x5f\xc3\x42\x34\x06\xbd\x6f\x04\x78\x09\xca\xe8\xe3\x18\xb9\xd4\x0c\x6b\x64\xf0\x28\x52\xe5\x61\xc8\x76\x6a\x18\x85\x1c\x5f\x59\x8a\x3e\x29\xec\xca\xbf\x63\x94\xcb\xc0\x20\x54\xc4\x98\xed\x7f\x1d\x7a\xa6\x92\x28\x52\xf8\xf5\x94\x7b\x8d\x9e\x1e\x4a\xf4\x89\xc0\xe3\xa7\x2d\xf8\x0e\xc1\xdd\xfe\x9b\xd7\xcf\x7e\xd1\xd4\xe7\x91\xc8\xa0\x0a\xab\x28\x41\xf6\x31\xa8\xab\x0a\xb0\xe0\x34\x74\xc7\xff\x21\xe3\x05\x45\xe0\x1a\xcc\x05\xf3\x3e\x6b\xe2\xd2\x56\x1c\xd7\x12\x22\xea\xb3\xcb\xe6\x0d\xf7\x2a\x9d\x23\xa2\xf5\xc8\x7d\xe6\x6d\x5c\xaf\xa5\xe0\xfd\xc8\x58\xd3\xeb\xa6\xe7\x32\x3b\x3b\x72\x1b\x42\xeb\xad\xc1\x90\x69\x7c\xcf\x0e\x0a\xbd\xfb\xaf\xb2\xab\x42\x93\x93\x1c\xa3\xad\xde\x61\x96\xed\x33\x78\xd7\x30\x56\xd8\xe8\x9e\x99\x80\x02\x25\x55\x24\x7f\xcc\x0c\xe4\xb9\x61\x32\xe3\x21\xb3\xfa\x93\xbd\x7a\x5b\x7f\x8b\x39\x1b\x48\xe5\x31\xfa\x2b\xcc\x57\x0b\x48\x4a\x02\x7d\xf3\x9f\x3b\xd1\x0c\xd2\x6f\xaa\x77\xfe\xfe\xaf\x04\xd2\x15\xc9\x03\x2a\x49\xf4\xb7\xbf\xfd\x7e\x30\x8d\x44\xa4\xf4\x86\x68\x24\x7b\xfb\xa7\xa2\xd1\x66\x68\xf3\xb5\xd3\xa4\x91\xf5\xf2\xb4\x8f\xa3\xc5\x77\x7f\xfc\xe1\xdb\x93\xcf\xa6\x35\x67\x48\xf8\xaa\xf0\x8a\x7f\x99\xc0\x55\x81\xe3\x36\x07\xc5\x93\x8b\x56\x6d\x0f\xd3\x1a\x16\x82\xe8\x0a\x75\x10\x6b\x80\xdc\xb5\x28\x8c\x27\x95\x18\x06\xab\x01\xc8\x71\x33\x72\xa2\x16\x58\x54\x5a\xe5\x6d\x55\xc4\x47\x53\xd5\x36\x9e\x78\xb8\xe8\x36\x63\xfe\x15\xac\x83\x30\xb8\x2b\x77\x1d\x49\xcc\xe2\x84\x00\x24\xfd\x2f\x1c\x8e\x92\xfb\x03\x73\x4c\x83\xea\x63\x6b\x0f\xaf\x32\x34\x43\x02\x83\x35\x84\xf2\x03\xef\x01\xd6\xbf\xb9\x82\xe8\xcc\x80\xb5\xda\xb5\xad\xa1\x53\x58\xca\x47\x98\x43\x69\xe2\x59\xf4\x35\xf8\xf5\xe3\x07\xeb\x20\xe6\x94\x2e\x8f\xd2\x94\xf8\x2d\xb4\xd1\x58\xc3\xb0\xe8\xdf\xfc\x46\x0b\x35\xe8\x6a\xdb\x5c\xcb\xb9\xab\x62\x9a\xd7\x63\xbe\x8c\x6d\x17\xad\x40\x2b\xf7\xaa\x07\xd8\x54\x82\xd5\x15\x2d\x13\xda\xa8\x41\xb8\x63\xb1\xab\x44\xb7\x12\x08\xe2\xb4\xfd\xda\xfd\xd0\xfd\xb4\x5e\xe3\xf0\xdc\xa8\xd2\x6b\x80\x35\x3e\xed\x63\x39\xff\xfc\xf6\xfb\x6f\xef\x10\x78\xca\x4e\x16\xfd\x0c\x32\x9d\x2b\x12\xe4\xf4\x11\x1c\x2b\xc3\xc7\x5c\x27\x8f\x0e\x18\xf5\x7b\xd1\x78\xa3\x9e\x93\x41\xfb\xe5\x01\x1c\x26\x1a\x28\xf3\xd3\xde\x2b\x3f\x5d\xbc\xbf\xfb\x11\x8f\xbe\x37\x43\x29\x2c\xa6\xe4\x42\xc2\x34\x85\xc5\x2a\x49\x60\x0d\x65\x68\x86\x80\x99\x28\x8e\xe5\x56\x9b\x60\x92\x42\x92\x69\xce\x73\x66\xa0\x01\x14\x25\xee\x6d\xd6\xaa\xe1\x06\x20\xbb\x05\xf7\x35\xa7\xf5\x08\x92\x58\x22\x98\xfe\xa7\x87\x6a\x3b\xe6\x30\x56\xcb\xfb\xd8\x98\x73\xbb\xd5\x45\x7c\x75\x18\x8d\x3a\x4d\x24\x56\xb8\x0c\x2b\xd5\x65\xfc\xd4\x17\xa5\x79\x0f\x2a\xb3\x38\xac\xa0\x24\x1e\x72\x14\x84\xb7\xd0\xba\x71\x8d\x78\x20\x6a\x57\xb4\x6b\x5a\xf2\x2b\x28\xb5\x24\x43\xcb\x09\x06\x24\xbd\x80\x77\x0c\xba\x59\xf2\x40\x15\xcc\x16\x85\x2f\xb8\xc2\xce\xbc\x66\x6d\x84\xd7\xa4\xa4\xd2\xab\xc3\x17\x80\xf2\x14\x25\x80\xc2\x73\xc9\x75\x0d\x20\xd8\x0e\x2c\x68\xc9\x36\x15\x14\xac\xce\x3d\xe5\x16\xb8\xef\xc0\xd7\x73\xed\x04\x20\xb3\xec\x1d\x4b\x63\x5d\x87\x66\xe6\x95\x11\x81\x12\xfe\x57\x3d\x0e\x4d\x2b\x62\xa1\x78\x95\x6a\x74\x8f\x60\x96\x96\xda\x5c\x9a\xe2\x3c\xd6\xd1\xef\x6b\x6c\x7c\x0d\x30\xba\xe7\xa9\x50\x77\xb9\xd1\x33\x21\x45\x05\x37\x4a\x22\x01\x6b\xfb\xc4\x0f\x86\xed\x1d\x08\x3e\xad\x7e\x99\x37\xe0\x32\x6e\x9a\x7b\x59\xea\x17\x29\x9c\xda\xec\x05\xf2\xe7\x92\xf3\xcf\x80\x03\x03\x58\x3e\x44\x04\x3c\xa8\xa8\x5e\x05\x8a\x6b\x29\x5c\xee\xc2\x28\xdc\x91\x1f\xee\xd5\x0f\x1c\x59\x38\x0a\x47\x3b\x3b\xff\x7f\xf9\xdd\x1c\x32\x28\x00\xfd\x4b\x52\xf6\x31\x5e\xde\x55\x9f\xef\x95\xcf\x16\xdc\x29\x7f\x73\xfa\xac\x1e\xf3\x04\xa8\x56\x93\xd6\xcb\x60\x29\xf3\xf7\x38\x44\xd7\xae\x21\x97\x46\x87\xd1\xae\x16\x92\x5d\x05\x2d\x00\x56\xaf\x84\x1f\x7a\x27\x80\xae\x16\xa1\xb2\xef\xff\xc2\x7e\x56\x93\x06\xd4\xe7\xae\x5a\x01\xb1\xd4\xa3\x44\x49\xef\x9a\x83\x52\x22\x8b\xa3\x80\x81\x73\xf2\x3e\xe3\xb4\xec\xb4\x5e\x40\xed\xc2\x87\x0a\x25\x2a\x47\x1c\xd0\x51\x88\xf2\x3a\x3a\x87\xbf\x65\x5f\xc1\x4b\x60\x6f\x38\xa7\xf7\x99\x34\x62\xd8\xd9\x08\x9b\x6a\x79\xa8\x87\x6c\xec\x3b\xd2\x24\x25\x69\x1c\xc1\x1b\x0a\xb4\x92\xa1\x2f\xd7\x96\x83\xfd\x71\x43\xfe\x32\xb0\x53\x76\xe2\x39\x88\x1e\x55\x3f\x57\xc2\x57\x8b\x52\xb2\x6d\x06\xa7\xed\x82\xf7\x25\x69\x6d\x19\x0a\xf7\x59\xaa\x58\x5a\xe5\xdb\x18\x7e\x93\x57\x29\xd3\x96\xdc\x3e\xa3\x81\xbe\xe6\xa3\x48\x98\xfb\x4e\x95\x72\x0f\xcd\x2f\x95\x93\x2a\xe4\xbd\xc6\x86\xab\xbb\xbb\x7c\x67\x7d\x17\x57\x69\xef\xa2\x60\x0b\xbe\x55\xad\xe8\xdc\x54\xee\xb4\xb1\xd6\xb9\xa4\xa6\xbd\x23\x9b\x76\x31\x52\x9d\xf6\xaa\xf1\xa0\xf5\x72\x53\x9f\x82\xa9\xe0\x19\x71\x21\x74\x9e\x8a\x73\x50\xc4\x4c\x30\x2b\x67\xa2\x28\xcb\x62\x8f\xc6\x61\xc7\xe8\x20\x1f\xb4\x79\x72\x6d\xf6\x58\xd4\xeb\xd3\x3c\xed\x33\x71\xfc\x07\x78\x93\x7c\x82\xd4\x1d\x59\x56\xea\x8f\xa8\x38\x41\x45\x85\xf6\x53\x61\x62\xd7\x19\x01\x3a\x72\x90\xaa\xf5\xd5\x2d\x4b\x66\x50\xc4\x69\x55\x3e\xc4\xb0\xa7\xf2\xa2\x9f\x01\xfb\x2e\x8c\x42\xfe\xf7\x95\x21\x89\xd5\x4e\xc3\x53\x4c\x03\x90\x65\xf8\x16\xa6\x01\xc5\xdc\x02\x2b\xe1\xdb\xc2\x2b\x2d\xee\x2d\x54\xc3\x9c\x95\x1e\x53\xf1\x36\x2d\xb4\xbe\x7c\x58\x64\xa2\x05\xed\x23\x50\x22\xdd\xb5\x7a\x01\xa1\x4f\xca\x98\x14\xcd\x4c\xd1\xe3\xb2\x2a\xc4\x79\xb1\x9a\x2c\x10\x0d\x9b\xb9\x7b\x57\xd6\xe4\xf9\xdd\x26\x5a\xcf\x92\xc0\x1b\x98\xd3\x13\xf9\x52\x77\xe1\x85\x8a\x00\x8a\x90\xe3\xfa\x26\x2f\x76\x8d\x0b\x68\xa9\x69\x53\xe9\xca\x4c\xde\x94\xa3\xaf\xaf\x06\xee\xa3\x6e\xbe\x57\xab\x15\x0c\x0c\x20\x56\x43\xaa\x44\x1b\xb6\xe8\xc1\x07\x81\x3e\xe5\x50\x62\xd4\x1b\xe2\x94\xc9\x8b\x36\x25\x4c\x08\x55\xd9\x80\x1f\x3a\xa8\x88\x59\xb5\x55\xe5\xba\xdd\x56\x8f\xed\x40\xdb\x12\x47\x52\x05\x78\x81\xf3\x0b\x5e\xd5\x4a\x25\xa8\xc0\x29\x94\x28\x59\x57\x96\x34\x4c\xfb\x3d\xa7\xd9\xb2\xa6\xf5\x65\x2d\xd7\x43\x0a\xc8\x0c\xd2\xad\x64\x0e\x93\xeb\x3a\x01\xa0\x0b\x6b\xf8\x44\xf4\xae\x4d\xb0\xad\x76\xab\xf5\xfa\xcc\x20\x00\xab\x84\x7a\xf3\x9a\x7c\x31\x87\x01\x58\xe0\x55\x4e\x03\x3c\x0d\x28\x5a\xc0\x00\x88\x6d\xb9\x58\x15\x34\x28\x85\x65\x06\x29\x64\xaa\x17\xca\xb7\x1c\x84\x37\xef\x6b\x87\x6c\x03\xe7\x53\x1c\x27\x88\x24\x19\x8c\xf1\x8a\xca\x31\x78\xc1\x84\x38\x4f\x50\x17\x8b\x39\xc1\xf0\x6d\xab\xdb\x86\xc1\xca\xf8\x53\xd8\x67\x63\x37\xb3\xaa\xcc\xf6\xdc\x0e\xd1\xe6\x80\x64\x6b\x22\xb0\x55\x43\x15\x25\xd0\x7e\x58\xa1\xe4\xba\xda\x52\x66\x29\x02\x98\x9e\x34\x9f\xeb\xc1\xb4\xed\xbd\x18\x32\xc3\x83\x4d\x6b\x8d\x68\xdc\xa6\x11\x85\x57\x0e\x4c\xea\x8e\xe5\x13\xa3\x7c\x53\x1c\xaf\x0a\x8a\x2d\x50\xa4\xc3\x57\xb0\x5d\xe4\x68\x52\x4e\x85\x32\x6d\x51\xea\x42\x94\x2f\x57\x54\xd7\xdb\xf9\x77\xc6\x29\xb6\x04\xa4\x80\x32\x57\x90\x1d\x5f\x69\xc9\x13\x24\xac\xd3\x72\xd4\x62\x3d\x51\x38\x9a\xef\xee\xc8\x33\x67\xac\x29\xe0\x3c\x7b\x56\x1e\xd5\x8c\x48\x72\x69\x75\x55\x5c\xb1\x02\x99\x4f\x5d\x55\x87\x19\x9f\xc0\x90\xb3\xcc\xc2\x6a\xda\x2c\xeb\x71\x38\x93\xdd\xed\xbd\x34\x47\xdb\x26\x64\x2b\xad\xd9\x76\xfa\xed\x45\xa1\x84\x37\xb0\x5d\x90\xd5\xa0\x53\x6d\x81\x9a\x85\x83\xe5\x82\x8b\x22\x4e\x8c\x6d\xe6\x30\x5b\x06\xca\x52\x36\x83\x52\x75\x7a\xb4\x45\x1e\x18\xfc\xdd\x96\x4c\x6d\x53\xf8\x9f\xf6\x89\x3b\xc5\x24\x81\x27\x95\x1e\xe3\xc7\x06\x5a\xa3\x4d\x9e\xb3\xaf\xcb\x8e\xb9\x16\xfb\x90\x47\xed\x9b\x05\x83\x49\xa4\x30\xbb\x0f\x08\x5c\xe0\x1b\x18\x28\x5e\xe1\x60\x4a\xf0\x82\x61\x17\x0b\x07\xd7\x57\x70\xd2\x7e\x25\xdc\xc6\xd4\x99\xf3\xfb\x82\xc2\xc5\x5b\x3c\x29\xfa\xe8\x77\x8d\x96\x1b\xd5\xef\x98\x9a\xc5\xbb\x0f\xca\xfe\x1f\x92\xfb\xce\x29\x5e\xea\xfc\x86\x49\x50\xf0\x77\x33\x88\x8d\xaf\x95\xdf\xc4\xed\x3d\x96\xb7\xa0\x36\xce\xab\x81\x53\x6d\x6d\x03\x35\x7e\x4b\x9e\x87\x09\x2b\xe7\xb1\xf6\x45\x4c\x1c\x3e\xca\x00\x9a\xa4\xd6\x25\x90\x9b\x46\x9d\x13\x71\x8e\xde\xb8\x7a\x0e\x1d\xf3\x31\xc8\x13\xb1\x83\xfb\x59\xac\x2d\x78\xbb\x3c\x2e\x7b\x11\x46\x21\x5e\x52\x0d\x14\x95\xcf\x68\x01\xf3\x55\x55\x9f\x53\x66\x70\x55\x1e\x96\x5f\x56\x90\x25\x49\xd4\xce\x97\xaa\x68\xb1\x51\xcc\xd8\x00\x59\xf5\xc4\x2c\x77\x98\x8a\x36\x6a\x84\x82\xa5\x1c\x11\xe9\x93\x28\x85\x13\x40\xd4\xaf\x98\x09\xe8\xa9\x9b\xa6\x2e\x76\xce\xc7\x3f\x3c\xff\xf4\x69\x58\xd2\xa3\x60\x93\x11\xdf\xd4\x07\x95\xde\x4c\x60\xf9\xa6\x34\xae\xa9\x61\x9a\xfb\x8d\xd4\xc8\x71\x5d\xe6\x4a\xf8\x34\x5c\x26\xef\x03\x1e\x8c\xc6\xba\x0e\x23\xad\xed\x15\xcb\xc6\xd8\xab\xc0\x95\x77\xaf\x9a\x85\x32\xcb\x8d\x33\x65\x9b\x86\xc0\x19\x2a\x28\x24\x47\x89\x8c\x27\xd1\xcc\xc9\x15\xc6\x18\xeb\x6a\xbf\xb5\xab\x14\x7a\x76\xe6\xc6\x75\xea\x22\x84\xe5\xe2\xdb\x48\x3b\xd1\x84\xbe\x2c\x12\xe5\x86\xcb\xf2\xab\x40\x3f\x62\x64\xe4\x54\x38\x10\xd1\x3c\x4c\x30\xed\xee\x44\xfb\x2d\xe8\xd4\x6b\x0e\xa4\xa1\x14\x5b\x67\x1b\xda\x6b\xe2\x89\x28\xcb\x9a\xa2\x45\x0d\x20\x68\xba\x98\x7b\x89\xbe\x2b\x2e\x76\x31\x4f\x44\xe1\x2c\x28\xe3\x9d\x5e\x55\xbc\xfe\xe6\x24\x8c\x94\x7c\x95\xba\xb0\x54\x25\x21\x09\xbe\x41\x29\x24\xc5\x36\xef\x2c\x66\xfb\xa5\x14\xe6\x73\xb4\x2c\xa4\xcc\x64\x96\xf7\x14\xa5\x31\xca\x0b\x48\x58\x01\x63\x06\x2e\x8b\xb2\x2c\x4e\x61\x41\x09\xbe\x2f\x65\x6f\x5e\x05\xd4\xc6\x09\xcc\xb2\x9e\xc2\xd1\x43\x84\x6d\x56\x64\xde\xc1\x24\xa6\x90\x2c\x50\xce\xf6\xef\x93\x16\x8e\x3f\xcc\x4e\xd2\x1f\x7f\xc6\x07\xee\x80\x40\x39\x11\xe5\x56\xaa\x46\x98\xf5\x5c\x0b\x95\x36\x7e\x54\xff\x0f\x7f\xaa\x6f\xe3\x25\xcc\xbf\x92\xe8\xb2\xe3\xdd\xef\xdf\xfd\x3a\x23\xef\xb5\xe8\xb2\xbd\x5a\x04\xb3\xcc\x81\x72\x52\x81\x8a\xb5\x50\x6e\xfe\x1c\x2c\x60\xb1\x04\x89\x76\x8d\xa8\xe1\xe0\xc4\x4f\x52\xcd\x57\xfc\xd7\x5a\xd1\x00\xe5\x28\x13\xd1\x39\x6c\x6d\xea\x48\x1d\xa1\x3a\x07\x16\x4f\xc7\xe8\x4a\x09\x6f\xaa\xcf\xac\xca\xb5\xa3\x3e\x97\xaa\x6e\x9b\xf2\x31\x2d\x72\x5e\x79\xf0\x67\xbc\x0a\x52\x9c\xff\xe3\xef\xff\x9b\x06\x73\x70\x03\x83\xba\xca\x7a\x40\x31\x1b\x1d\xbf\x1c\x59\xab\x0c\x28\xca\x63\x58\x72\x41\xe8\x12\xdb\xfa\x85\x61\x8f\x87\xee\xe4\x05\x6e\x8b\xa8\xd2\x45\xf3\x2b\x36\x12\x4f\x81\xaa\x6b\x92\x09\xc8\x73\x4c\x45\x07\x55\x88\x26\x07\x03\x60\x3f\x49\xc1\x58\xe9\x90\x83\x70\x65\xcc\xbd\xb0\x71\xf1\xb6\xcd\x30\x98\x45\x46\xde\x93\x47\xbd\xf8\xb0\xbf\xfb\xeb\x8c\x1e\x5e\xb7\xd4\x48\x21\x69\x79\x3f\xc9\xd3\xb8\x61\x5c\x55\x5d\x6b\x66\x0b\x9b\xa5\xce\xf2\x30\x23\x96\xd9\x71\x15\xdb\x01\x8a\xeb\xb6\xfc\x14\x15\xbc\x4b\x09\x1b\x36\x54\x87\x2a\xf6\x48\x09\xf9\x19\x57\x41\x40\x55\xc0\x4f\xf5\xd5\x8e\xa6\x76\xb6\x5c\x4a\xf9\x3d\x5a\x76\x94\x30\x2c\xa6\xaa\xdf\xe4\x5e\xfb\x48\xc2\x28\x3c\xb0\xd3\xa4\x67\x2e\x93\x5a\xe7\x6b\x8e\x57\x59\xfa\x61\x09\xf3\x37\xf9\x29\xbc\xfd\x09\xe5\x29\xbe\x0d\x9b\xa1\x39\xf6\x4c\x1d\xd3\xd0\x50\xf6\x13\xa0\x3c\x00\x41\x0e\x6f\x83\x5b\xd1\x59\x87\x90\x10\xa2\x18\x35\x70\xe4\x8b\x39\xbe\x8d\x71\x1e\xcf\x99\x87\xde\x17\x81\xb5\x1e\xb5\xf5\x0d\x26\x1e\x77\x1d\x0c\x68\x4d\x89\x18\x20\x19\xb4\xcd\xfb\x40\xb2\x81\xbb\x64\x97\x80\x34\x12\x80\x9f\x9e\x7c\x98\x5c\x67\x3f\x5c\x9f\xbd\x5a\x98\xa9\xf3\xd6\xc3\x92\x5f\xe1\xe5\x39\xa9\xfb\x4d\xe6\x40\xa6\xce\xa8\x89\x2f\x7a\x04\x80\x60\x93\xce\x5a\x39\xe2\x45\x1f\xdc\x67\x99\xce\x42\x63\x03\x50\x03\x15\xbc\xe9\x55\x54\xd5\xa3\x14\xe5\xd5\x8c\xf2\x94\x0e\x64\x74\x4d\x40\xb9\xd0\x5d\xdb\xbd\x63\xf5\x10\x4c\x20\x54\xb5\xce\x25\x97\x8e\x5a\x85\x4b\x5b\xe8\xda\x9e\xe5\x7a\xba\x53\x95\x28\xbd\x00\xc5\x75\xe1\x0e\x60\xeb\x23\x4f\x1a\x17\xc3\xf1\x5e\x74\x10\x85\xbf\x09\x15\x0c\x85\xe2\x3a\x46\x94\x3b\x57\xea\xcb\x73\x68\xd8\xb3\x46\x86\x4a\xa2\xbe\xcf\x4a\x5d\x06\xc5\x7d\x65\xf9\xe9\xaa\x42\x37\x71\x5f\xb6\x75\x93\x68\xd3\x0e\x2d\xce\x99\x17\x55\xc0\xe1\x0b\x07\x25\x24\x5e\x88\xc3\xdb\xc5\x0a\x38\x7e\xc4\x2b\x0a\xdf\x14\x17\x73\x54\x5c\x68\xa3\x14\x4d\x0e\x15\xfb\x41\x0e\xf4\x92\xf5\x7c\x00\x65\x33\xa3\xbc\x82\x81\x29\xe9\x5a\x28\xcf\xea\xf4\xb6\xdb\xbe\xe1\x16\xbf\x6c\xae\xa7\x2d\x31\x96\xcb\xfa\x52\xb4\x29\xa5\x27\xb6\x38\x3d\xad\x6e\x4e\x73\x4d\x99\xb7\x14\xe5\x6f\x52\xfb\xea\x46\x1a\x89\x14\x92\xf5\x74\x73\xff\x4b\xae\x79\x4b\xf0\xfc\xc8\x70\x3e\x76\xb8\x2a\xb9\x26\x66\x42\x3c\x1a\x7a\xb8\x2b\x84\x90\xff\x64\xd1\x8c\x05\x48\x24\x33\x74\xd4\x28\x76\xbc\xd9\xd0\xa3\x5b\x3d\x5b\x37\x7a\x7c\x4f\x33\x78\x17\x2f\x40\x81\x73\x06\x41\xfc\xa4\x0f\xed\xcf\xf7\x2b\x74\x83\xb7\x3f\x1b\x87\xb6\x61\xa5\x55\x67\x64\x5c\x60\x59\xb8\x76\x79\x59\x96\x49\xd6\xea\xb3\x71\x82\xb3\xd5\x22\x2f\xea\x10\xdc\xab\xe6\x21\xcd\x2e\x74\x4b\xba\x22\xf0\x55\x06\x17\x12\x71\x54\x33\xaa\xaa\xcf\x12\x38\xcd\x38\x37\xeb\xcf\x8c\x6d\xcf\x98\x20\x57\xc6\x2d\xd7\xda\x5d\xbf\xb8\xef\xdd\x8e\x68\xef\xa6\xef\x54\xa5\x8f\x3c\xfe\xec\x17\x87\xc3\x68\x9f\xbf\x64\xcf\x22\x52\xd4\xe2\xeb\xfa\x14\x2c\x57\x6f\x63\xbf\xee\x39\xae\x0c\xe5\xfe\x7d\x51\xae\xe8\xb9\x58\xd0\x28\x7c\x21\x96\x90\x81\x6d\x53\xb8\x60\x46\xc7\x72\xd4\xee\xc8\x61\xcd\x12\x59\x7e\x58\xb1\x18\x52\x66\x91\x2c\x25\x51\x4c\x60\xc1\x0b\xde\xd9\xa5\x40\x95\x81\x33\x04\x99\x47\x25\xef\x66\x77\x75\xb3\x2c\xef\xd3\xde\xda\xef\xcf\xa7\x7f\xfc\xe9\xd7\x0f\x6f\x9c\xf7\xf5\xb6\x4a\xe4\x4a\x84\x68\xcf\xda\xcf\x34\x38\x5a\xd1\x39\x26\xe8\x57\x01\x7b\x65\xb9\xd4\x8f\x1d\x3d\x5a\x10\xa3\x0c\x65\x98\xe2\x6b\xc8\xec\xd8\x30\x21\x90\x9a\x0a\xe7\xcf\x78\x45\x94\x43\x7c\xd4\x48\x3e\xbe\xe2\x05\x4b\x29\xca\x67\xc5\x16\xeb\xcb\x55\x19\x3f\x3c\x3a\x7e\x17\xf0\xb7\xe9\xa7\x63\x90\x62\x58\x04\x39\xa6\x81\x30\xce\x07\x74\x0e\x2d\xb1\x45\x95\xd9\xcd\x19\xcd\x16\x26\xbc\x2a\x48\x23\x82\x48\x6d\xea\xa3\x8e\x11\xf8\xcb\x0a\x11\x98\xda\x9c\x22\x81\x62\x00\xdc\x0a\x8e\x71\x4e\x41\x42\x79\x19\x71\x90\x2e\x50\x8e\x0a\x4a\x00\xc5\x24\x40\xd3\x80\xce\x51\x11\xa0\x22\x00\x79\xc0\x92\xf9\x5c\x75\x3d\xce\xc4\xc4\x41\xfe\xe0\xc4\x2e\x85\x51\x5f\x02\x3f\x08\x79\x0b\x44\x61\x17\x7d\x03\x8a\x83\x1b\x04\x6f\x19\x21\xb7\xfc\x2b\x74\xf4\xd8\x0e\xe5\x0b\xdf\x4c\xcb\xf5\xe3\xd6\x5d\x90\x07\x15\xed\x82\x04\xe7\x53\x34\x5b\x11\x98\xb2\xc8\x0f\x3a\x87\xc1\xf1\xbb\x37\x51\x00\x56\x74\x0e\x73\xca\xf2\x3d\x19\x45\xbf\x71\x05\x5a\x48\x9f\x02\x53\xbd\x00\xca\x61\x3b\xee\xdc\x92\xc0\xb0\xd1\xb6\x6e\xa1\x9a\x93\x96\x04\x2f\x96\xda\xe5\xf4\xff\xa7\x92\x23\x60\xc2\x37\x58\xa1\x20\x56\x47\x3b\x28\xfe\xa0\x13\x06\x63\x58\x36\x7f\xe3\x00\xd8\xec\xf1\x52\x6c\x7f\x45\x08\xc8\xf9\xfc\xf6\xdd\x4f\x3f\xbc\xdc\x36\x73\x37\x2d\x80\x16\x92\x57\xd4\x54\x37\xc5\xc0\xa2\x4e\xfa\x8a\x05\xb0\x1a\xd0\x0e\x4e\xf4\x40\x55\xe0\xe8\x45\x42\x4a\xf5\xfe\x9c\x0a\xf6\xb9\x6c\x2d\x01\xa2\x3c\xda\x79\x43\x14\x06\x1d\x65\xf0\x6a\x6b\xcb\x97\x51\xf3\x06\xe7\x28\x21\x69\x4c\xd1\xa3\x12\x95\xa6\x98\xee\xda\xc2\x75\x1b\xc4\xf5\x52\x54\x6d\xeb\x34\xe2\xb5\x29\x40\x61\x83\xde\x68\x71\xb5\xfb\xac\x50\x14\xbe\x58\x8a\x8c\x5d\xff\x95\xaa\x46\xc5\x9b\x7a\xdc\xed\x6b\x63\x9c\x66\x19\x30\x06\x6e\xaf\x0b\x66\x75\x49\x39\xf5\xe7\x9a\xe6\xa6\x5e\x3c\x2d\xb6\x4b\xc9\xe3\xd0\x7b\x7b\x0a\x23\x4d\x5c\x6c\x5e\x12\xe1\xdb\xe2\xe9\x67\xcb\xfd\x09\x5d\xff\xe9\xd7\x57\x67\x0d\x74\x3c\xb5\x4c\x7f\x1d\xa2\x2f\xbe\x65\x08\xad\x19\x2e\x20\x69\x24\x14\xbf\x46\x59\x05\xf2\xcf\x4a\x8d\x73\x1f\x50\x23\xab\xb5\x61\xa0\x95\x0d\xf5\xdd\xd4\x6b\x13\xb0\x1a\xdf\xa2\xc0\x11\x87\x86\x30\x52\xf7\x3c\x77\xc5\x4e\xbd\x2b\xf4\x82\x1e\xe5\xbc\xa6\x45\x0c\xef\x96\x19\x26\xa2\xe0\x79\xff\xba\x7e\x9b\xdf\xc6\x3b\xda\x36\xb6\xc4\xdc\x38\x6c\x53\xad\x77\xec\x7a\x9e\x81\x56\x51\xbe\x4d\x9b\x71\x15\xa1\x77\x40\xf3\x3e\x21\x1a\x75\xe6\xd7\x20\x02\xd9\xbe\x79\x95\x53\x82\x44\x35\x09\x87\x41\x77\x57\x0d\x8f\xc2\x2b\x92\x70\xae\xc4\x84\xca\x9d\x2c\x3f\x9f\xc0\x22\x11\x08\x67\x36\x7e\xe5\x1e\x85\x13\xdb\xab\x95\x27\xaa\x4e\x8d\xef\x95\xce\x4b\xc6\xd5\x57\xa4\xd4\x8b\x03\xb9\x47\x27\x19\xd4\x60\x97\x3b\x19\x5b\x9d\x2f\x3f\x0e\xf8\x0a\x7b\x45\x31\xba\xba\x28\xc7\x1c\x4f\xee\xab\x5e\x38\x60\x3b\x5e\x6a\xa4\x09\x45\xd6\x18\x2a\x62\x7a\x8b\x39\x44\xb3\xf3\x4a\x54\x65\xb4\x5b\x23\xc4\x87\x8e\xe0\x9c\x1b\x5e\xaa\xba\x6c\x95\xf7\xca\x55\x7a\x24\x60\x2d\x36\x3e\x8e\xf7\x38\x65\x25\x85\x7d\x87\x52\x2a\x1f\xc1\x7b\x9c\xa2\x29\x12\x41\x30\x8e\xe1\xb4\xff\xa6\x0e\x94\xdf\xae\x06\xae\xba\x01\xcd\x0f\x58\xa8\x40\xdb\xce\x87\x39\x15\xd5\xe4\x1d\x42\xda\x53\x14\x8c\xa3\xcb\x50\x00\x8d\x3a\xed\xf9\x2d\x89\x78\xe2\x27\x4b\x7c\xb6\xcb\x4a\xe1\x12\x8b\x8e\xcb\xa9\xa3\x6d\xbb\xad\xa9\xd1\xb0\xb7\xd5\x29\x10\x65\x72\xda\x31\x1d\x7a\x5f\xb5\xeb\xff\x2a\x41\x16\xa0\x22\x10\xbe\x9c\xec\x3e\x60\xbd\x6c\xd9\xde\xe5\xcc\x20\xf4\x83\x79\x68\x04\xb6\x5a\x7f\x37\x95\xcf\x52\x75\xe0\x48\xc0\xa6\xe6\x29\xf4\x0b\xf3\x9a\x19\x66\xa8\xa0\x12\x9a\xbf\xfc\xb5\x3a\x2b\x62\xc1\xb1\xfd\xd5\x52\xa6\x3b\x6e\x5a\x25\x35\xc7\xf5\xc4\x55\xd3\x8b\xd7\xcb\x93\x93\xdb\xed\x97\x0d\xe0\xe6\xa6\x41\x45\xb2\x7c\x47\xf9\xe6\x9d\x47\xd1\x30\x2e\xf0\x2b\xb1\xec\xee\x63\xd4\xd0\x2e\xc4\x7a\x84\x6f\x8a\x13\x64\x49\xa4\x14\x37\x2f\x15\xe4\x6b\xca\x12\x5e\x95\xac\x22\x6b\xb0\x8e\x47\x3f\x48\xcb\x4d\xb2\x87\xfc\x58\x75\xbd\xda\x2e\x95\xcb\xb2\x08\xba\x91\x50\x4e\xea\xd4\x16\x50\xe6\x3a\x67\x5c\xf6\x3d\x0d\x8e\xd7\x3c\xef\xc4\xab\x4b\x82\xee\xbb\x89\x2a\xa8\xa1\x06\x5c\x9a\x8f\x8a\x83\x5a\x71\x02\x59\x6f\xa9\xde\xa3\x52\xb1\xa2\x9b\x89\x51\xf2\xad\xf2\x20\xd7\x72\x8a\xc6\xda\x5a\x1d\x74\x34\xbb\xbc\x0c\x59\x5a\xe0\x8d\xb0\x1d\xee\xec\xec\xd8\xa1\x78\x9d\x56\xbd\xfa\x66\xad\xc3\xdc\xae\xf2\x8c\xa3\xe9\x89\x82\xaa\x93\x7b\x0a\x95\x8f\x66\x65\xd5\xfe\xc2\xce\x90\x4a\x9b\x16\x7a\x5c\x68\x3f\x6d\x49\xf7\xfa\x87\xf7\x3f\xfc\xfa\xa7\x5f\xe7\x8e\x52\xa9\x39\x3e\xc6\x79\x5e\x15\xd9\x70\xa3\x4a\xe6\x98\xa2\x29\xe2\xa2\xaa\x54\xe7\xab\x62\xbe\x2e\xe4\x12\x45\x43\x60\x7c\x5a\x36\xda\x53\x1b\x1c\xb3\x58\xe0\x80\x15\xf5\x0d\x18\x29\x1d\xd6\x64\xa1\x16\x88\x66\x17\x73\xc8\x9e\x2e\x84\x11\x1d\x15\x0e\xcb\x1f\xbb\x99\x88\xe0\x10\x43\xcc\x96\x53\x04\x04\x06\x28\x07\x0c\x5e\x11\x4d\x32\xb8\x15\x1c\xcf\x61\x72\xcd\xf3\x7f\x71\x9e\x22\x36\x53\x3c\x55\x12\x82\xd9\x3f\xeb\xae\x4a\x55\x03\xe7\x5b\xdd\x16\x6f\xb3\x36\x75\xaf\xab\x2c\xfb\xc2\x05\x6d\xa9\x99\xf0\xcb\xeb\x96\x2e\xb5\xf8\xb3\xca\x99\xa0\x88\xb0\x92\x86\x17\xf7\x4b\xf8\xa6\xf8\x94\x5f\xe7\xac\x76\x84\xc3\x51\x63\x66\x3a\xd6\xd1\xf3\xb7\x73\x44\xa1\x76\xb9\xeb\xce\x7a\x0c\x53\x7c\x9b\x67\x18\xa4\xdc\x2a\xd3\x99\xe9\xf8\x23\x82\xb7\xc1\x47\x70\x1b\xbc\x6e\xb2\x88\x41\x5a\x25\x0d\x4b\x95\xc0\xa8\x78\x07\xc8\x4c\x3b\x4b\x99\x0c\x80\x60\x01\x04\x72\xbc\x3b\x39\x6b\xd3\xb3\x9f\x61\x8a\xbf\xe3\xeb\xdc\x35\xf3\xef\x24\x3b\xf8\xa6\xa0\x6e\x60\x68\x17\x00\x65\x1e\x43\x13\x8f\x75\xac\x85\x9d\xd8\x8f\x41\x65\x1e\x56\xca\x5f\xab\x4e\xc7\x2c\xb0\xa0\x88\x8c\x0c\xf3\x12\x35\xd5\x70\xa5\x71\xe3\x0c\xac\x0a\xc8\xd2\xb7\x01\xa1\x2c\x86\xa6\x50\x7e\x6f\x21\x52\xd3\xbe\x2d\x4e\xdc\xfd\x2b\xcf\x57\x33\xb4\x82\x78\x29\x06\x20\x3e\x65\x40\x02\xb7\x6a\xa9\xde\xa2\x4a\xbf\x55\xa3\x6a\xc7\xb8\xe8\xf2\xd0\xd9\x40\x21\x2d\x16\x1f\x3b\x26\xa1\x14\x35\xc7\x55\x19\x48\x06\x20\xad\xad\x8c\x00\x5f\x21\xd7\xba\xd5\xc8\x6d\xd9\x1d\xf2\x0e\x9b\xf1\x57\x4d\x36\xac\x16\x81\xc5\x43\xf2\xe2\xf5\xca\x6a\xd4\x6f\x12\x0f\x2a\xd2\x84\x35\xb0\x48\x97\x2a\x10\x3a\x77\x14\xeb\xf3\x9e\x0b\x5a\xf0\x7b\xb9\x7b\x2a\x87\xaa\x61\x90\x88\xd2\xfc\x1c\xb4\x98\x29\x9e\x6a\x34\x17\xfd\x44\xb2\x86\x01\x5a\x31\x69\xe9\x5f\x4b\xc5\xd5\x3d\x0d\x97\x9d\x57\xbb\xc3\x97\x6b\x3b\xc7\x59\x66\x4d\x45\x18\x6a\x59\xf8\x94\x17\xab\xe5\x92\x99\x32\xd9\xf9\x10\x5c\xb0\x12\xa9\x6e\x99\xd9\x66\x60\x08\x2c\xf6\x8f\x52\xdb\x38\x65\xbe\xef\x4f\x6f\x82\x04\xaf\xb2\x94\xc5\x96\x10\x98\xa7\x50\x68\x1f\xe5\x6a\x45\xc1\x64\xc5\xc2\x36\x82\x04\xe4\x41\x41\x51\x96\xc9\x50\x03\xae\xad\x04\x5c\x15\xcd\xee\x9b\xea\xc2\x7a\xe6\x8f\x6e\x01\x9a\xa9\x57\x86\xc7\x3a\x99\x9d\x06\x15\x8b\xb6\xa4\x02\x41\xdb\x0a\xc6\x39\xe2\xd8\x64\x1c\x5a\x75\x8b\xa8\xc2\x58\x79\x34\x6a\x1d\xcc\xfa\x4b\x28\xa5\x01\xca\x67\xb1\x30\xb5\xb0\x2d\xc5\x3f\xf4\xbe\x57\x94\xad\x36\x7d\x99\xe0\x37\xa4\xa7\x7d\x99\x38\x7e\xfb\xcb\xf9\xde\xeb\x5f\x76\x1c\x97\x09\xdd\x6c\x71\xa9\x63\x39\xd9\x4a\x58\xb9\x42\x93\xea\xa0\x74\xff\xf2\xe4\xe5\xcb\xb7\xa6\x45\xd8\xc8\xc4\x1f\xe8\xc8\xb1\x01\x17\x78\x04\x20\x58\x34\x75\x7f\x2f\xd9\x03\xd0\x43\x96\x34\x1f\x44\x94\xc7\x21\x82\x7e\x1e\x3e\x1a\xc3\xf4\xe3\x95\xa7\xcc\x16\xbd\x26\xdd\x56\xe3\xfe\x51\x16\xba\x55\xa8\x9b\xd9\x03\x52\xcc\xf7\x16\xd1\x65\x47\x1b\x15\xd1\x33\xb0\x9a\xc1\x98\x81\xa1\x3f\x75\x31\x3d\x3e\x80\x6f\x3f\xe4\xcf\x3f\xb9\xa0\xfb\xeb\xf2\x1d\x68\x31\x93\x9a\x81\x4c\x9f\xad\xd2\xfc\xa0\x70\xf8\x89\x16\xe2\xde\x14\x32\x3a\x04\x9c\x0e\x56\x5b\x45\x77\x1d\x80\x52\x8b\x03\xe4\x5b\x02\x52\x5e\x2f\x48\xc0\xfb\x8f\x54\x48\xff\xbb\x71\x18\x85\x23\xf9\xe9\x5e\xfb\xed\x7e\x5c\x7d\x6a\x16\x75\x2b\x07\xa6\x97\x72\xdb\x8f\x46\xfa\x33\x53\x94\x65\x6f\x52\xa3\xd4\x5b\x53\x15\x2d\x28\x5e\xd6\x0a\x55\x41\xe5\x8c\xf7\xa2\x10\x4f\xa7\x05\x4b\x68\x17\xa5\x05\xac\x68\xe5\xf6\x7e\x60\x9e\x36\x7a\xa9\x4a\x14\xf8\x94\x20\x50\x22\x68\xd5\x7a\x0a\x8d\x59\x2e\x40\x71\xed\x31\x4b\xe9\x91\x90\xd0\x71\x02\x8f\x78\x3f\x0a\x53\xa3\xe8\x1f\xe3\xcc\x23\x92\x84\x2d\x18\xed\x5d\xc6\xb0\xfa\xbd\x33\x7d\xfd\xc2\x04\xe4\x37\xa0\x08\x14\x84\xcc\xe6\x4a\xda\xd9\x49\x9f\xc1\x04\x24\xd7\x33\x82\x57\x79\xea\x9a\x47\xfd\x84\xcf\x64\x1a\x25\x29\x00\x81\xa0\xe2\xd2\x35\x4b\x52\xec\x0b\x8a\x0b\x1a\xac\x48\xf6\xbb\xdf\x84\x51\x83\x4f\xa3\xf0\xf7\x61\x05\x10\x5a\xae\x7a\xcc\x5d\xda\xd6\x56\xd5\xba\xd7\xad\xec\xd9\xfb\x5e\x57\x7e\x5e\x85\x03\x96\x12\xd4\xb9\xdd\xd5\x3b\x9b\x0b\x01\x40\x05\xa5\x6d\x8d\xb1\x6e\x40\xf1\x0b\xa3\x89\x9a\x7b\xa8\xc0\xf2\x5f\x86\x14\x53\x06\xdf\xc3\x71\x92\x17\x42\xa2\xd4\x19\x09\xe5\xaf\xca\x41\xae\x3e\xe6\xa8\xd8\xe9\x76\x64\x70\xc7\xc4\x12\x92\x04\xe6\x94\x5d\x15\x7b\x9d\x4b\xca\x19\xb2\xd9\xb3\x29\xc3\x13\x90\xb1\x1b\xf2\xd3\x0f\x0b\x3c\xfb\xf5\xed\x94\x7c\x9e\x99\xd5\xf9\x42\x59\x89\x4f\xf8\xfd\x6e\x26\x65\x77\x3a\x1c\xa0\x72\x0c\xe5\xe0\x06\xcd\x80\x35\x68\xac\xc1\xbe\xbc\xb3\x78\x42\x40\xde\x52\xc5\xbd\xb6\xa4\xcf\x56\x94\x42\x12\xd3\x0a\xc6\xb2\x81\xb0\xc0\x20\xf1\x5c\x57\xea\x9d\x66\x0e\x18\xce\xbf\x03\x8b\xc9\x8a\x30\xd0\x7f\x86\x21\xd5\xf4\xc7\xb5\x85\xe8\x56\x7f\xf8\x1c\x0d\x8d\xa2\xb8\x62\xfe\x88\x42\x06\x3a\x9f\xe1\x19\x0e\x79\x9e\xb7\x3e\xab\xef\xf0\x42\xea\x7d\x4a\x8e\xc8\x67\x09\xd8\xe9\x17\x8e\xb8\xdb\x31\x64\xbf\xe0\x69\x25\x95\x9d\x01\x64\x86\x51\x38\x5d\xfd\xfa\xeb\xfd\x39\x04\x24\x99\xeb\x40\xe2\xd2\xb1\xa1\x58\xd2\x42\x54\xbc\xc7\x13\xdd\x8c\x61\x58\x9d\x75\x0b\x60\x73\xb4\x66\xe6\xac\xcd\x68\x6a\x61\x32\xd8\x60\x31\x63\x3e\x3c\x0b\x24\x8c\xc2\xa3\xb3\x33\x1e\x65\x7e\x7b\x5e\xee\x8e\x09\xc6\xd7\xef\x50\x7e\xed\xb0\x90\xef\xf2\x17\x1d\x44\xe1\x76\x21\x1f\xdf\xae\x36\x05\x03\x3f\x0d\xa3\xf0\x2f\x93\x0c\xe4\x55\xc1\x24\xc2\x56\x35\xc7\x78\x09\x73\x48\x82\x1c\x13\x38\x85\x84\x54\x45\xdc\x74\xd6\x70\x18\x98\xaa\xc1\x79\x9a\x94\x6d\x4b\x07\x66\xbc\x78\x45\x35\xf7\x4f\x6f\x58\x15\xbe\xbc\x58\x95\x23\x7c\x09\x0a\xf8\xe9\xcd\xa7\x8f\xef\xda\xe6\xbe\x1f\x1d\xac\xd5\xf1\x23\x90\x8a\xbf\x77\xe3\x74\xfa\x91\x97\x5d\xdf\x38\x99\x6c\xfd\x3e\x02\x95\xd8\x6b\xfb\xf8\x27\x2c\x7b\x60\x4e\xe9\xb2\xf8\x66\x7b\x9b\x1d\x8b\x4b\x82\xd9\xd1\x85\xf0\x76\x8a\x93\xe2\xe1\x37\xc5\x09\x4e\x56\xa5\x02\xa1\x02\x62\x0e\x90\xc5\x4d\x51\xeb\x99\x8e\x57\x0d\xe4\xe8\xf8\x5d\x70\xc1\x1e\xed\x27\x5e\xdb\x74\xbd\xfa\xe4\x2d\x60\x82\xf3\x54\x9e\xbd\x3e\x27\xac\x3c\x61\xf8\x01\xea\x38\x6a\x9b\xfe\x8a\x14\x26\x98\x54\x67\x79\x58\xc3\xb2\xd5\x25\x61\x3c\x2e\x14\x9a\xfe\x50\x47\xd1\xb1\x13\x8f\xfb\x7f\x75\x0d\x42\x79\xa4\x45\x99\x08\x4c\x38\x17\x47\x2a\xb8\xd5\x0e\xe2\xa5\x75\x3b\xcc\x21\x95\x35\x7b\x2e\x35\x07\x09\xc4\x5b\xdb\x48\xb8\x56\xc8\xce\x73\x11\x5b\x53\x19\xc3\x99\xb3\xb0\xbc\xae\x73\xd5\xb0\x60\xe7\xe6\x76\x82\x73\x4a\x70\x26\x50\x53\x71\x1e\x17\xb7\x88\x26\x73\xe6\xf7\x1a\x62\x68\xd1\x14\xcf\x87\x50\x69\xcd\x71\x3f\x6d\xd5\x76\x0f\xe7\xaf\xde\xdc\xed\xfc\xaa\xa9\xb6\x7a\xa1\xd1\x1d\x7b\xa1\x92\x42\xd3\x6b\xaa\x2f\x38\xec\xe8\x1b\x5e\x10\x42\xa9\x5b\xc2\xfe\xfd\x1a\x27\xab\x0a\x98\x14\x33\x17\xf1\x8b\x94\xe0\x65\x8a\x6f\xf3\xe3\xaa\x86\x29\xc8\x92\x55\x39\xd2\x33\x5c\x20\x19\x92\xc8\x3b\x7f\xcf\xbd\x4b\xb5\xa7\x51\xa9\x4c\xa5\x7e\x57\x61\xe2\x9e\xbd\x09\xab\x82\x29\x94\xac\xa0\xbd\x5e\x2d\x1f\xf8\x55\xa3\x80\xd2\x58\xf1\x34\xc1\xbc\x58\x11\xf8\x1e\xe5\x68\xb1\x5a\xbc\x13\x15\xd3\x5b\x9e\xe7\xa0\xd1\xb2\x42\x4a\xcb\x83\xa5\x54\xff\xc0\x71\x5a\x3f\x90\x0b\x30\x69\x7f\x98\xd3\xed\xd5\x0d\xbf\x33\x0a\xcb\xae\xc6\x79\xb1\x24\xa8\x62\x97\x68\x50\xf4\xca\x6c\xb5\x5d\x61\x10\x18\xdf\x0b\xf2\x5a\x0c\xcf\xcc\x61\x8d\x09\x3c\xe7\xf0\xd8\x5e\xa8\x38\x61\x75\xc3\x76\x14\xc2\x73\x05\x93\x87\x58\x52\xb2\xc6\xfa\xd6\xb0\xb9\x1b\x95\x54\x07\x89\x05\x7d\xf3\x3e\xa0\x78\xf8\x4a\x20\x1f\xce\x7e\x59\xfe\xf0\xfd\xed\xc7\x5d\x29\x1e\xc2\xcb\x4b\x1d\x64\x36\x1c\x4c\xe3\x87\xc8\x79\x76\xb1\xee\x93\xa6\xf1\xeb\xf1\xb3\x37\x7b\x47\x77\x3f\xe9\x22\x58\x35\x22\x55\x12\xaa\x11\x42\x23\xaa\xb1\x19\xd0\x6f\x46\xdc\x5c\xb5\x47\x2a\xe0\xb7\x46\xd4\xa4\x12\x93\xa7\x14\x10\x52\x94\x87\xb7\xab\xc5\x32\xa0\xb8\xfb\x82\x60\x49\x20\xd6\x60\xe1\xea\xb1\xd4\xd5\x56\xdb\x06\xaa\xe3\x51\xb9\x46\xcd\x32\x9f\x93\x15\x35\x35\xa6\x8b\xfb\x25\x0c\xfe\xfc\xdb\xed\x3f\xff\x36\xa0\x38\xa8\xc9\x28\xa7\xb5\xdd\x36\x21\xcd\x90\xd6\x0c\x01\x66\xda\x0b\xc7\x86\x65\xc0\xeb\xc3\xc5\x8d\x60\xd4\xcd\x6e\x05\x6e\x11\xe2\x0a\xd8\xd3\xde\x00\x2f\x7f\xda\x49\xfe\x70\x94\xbf\xb5\xe1\xca\xd4\xd6\xf6\x25\x98\x41\x01\xff\xc4\x14\x64\x38\x35\xcb\x63\x29\xd0\x8a\xa5\x42\x2e\x38\xa8\xed\x26\x50\xf7\xce\xc9\x35\xa8\x43\xc5\xaa\xcc\xad\x99\x57\x66\x3d\xda\x0c\x2c\x0b\x98\xb2\xb5\x18\xf8\x86\xcd\x9b\xfc\x46\xeb\x9a\xfc\x6c\xc9\xaa\x76\x0b\x9a\x23\x4d\xa9\x31\xa3\xf2\x56\xd0\x81\x13\xe2\x6f\xb6\xf3\x0b\xe5\xa9\xd7\x0e\x14\x28\x55\xb0\x47\x2a\xda\x39\xad\x62\x95\xa9\x82\x83\xe3\x9d\xcf\xf1\xed\x47\x76\x43\x71\x64\xc3\x6a\xb7\xcf\x9a\x29\x70\x9e\x75\x66\xbd\x8d\xb5\x61\x39\xb0\x90\xeb\xff\xf8\x30\x6c\x29\x64\x1a\xef\x59\x26\x70\x2a\x71\xca\x39\x74\xc6\x7f\x05\xa7\x0a\x70\xb9\x63\x78\x6d\x85\xed\x54\x3c\x51\x3e\xf4\x26\x9e\x68\x63\x90\x35\x64\x84\x2b\x75\xce\xe2\xed\xc9\x57\xd5\x55\xfe\x16\xa5\x6d\x09\x81\x81\x35\xe9\xd2\xc5\x44\x9d\x53\xdd\x54\x72\x9e\x61\x3f\x1a\xb2\xf6\x3f\x61\x72\x9d\x61\x90\x7a\x6d\xbb\x5e\x6b\xe3\xb1\x2e\x35\x49\xf7\x6d\x51\x1f\x66\xb0\x07\x33\xd1\xf7\x09\xde\xe0\xff\x19\x05\xaf\xec\xe6\x23\x07\x99\x1b\x81\xb8\x21\x48\x12\xb8\xa4\x01\x81\x09\x5e\x2c\x60\x9e\x02\xfd\xb2\x66\x94\xef\xf3\x62\xce\x9e\x64\x28\x6f\x35\x0b\x9e\x41\xdd\x97\x14\x01\xab\x9f\x5b\x36\x6e\x0c\xa1\x3d\x61\xd9\x97\xf7\x3a\x23\x3e\x6b\x86\x2c\xb7\xdd\x02\xe5\xd6\xf4\x9a\xf2\xbf\x37\x39\x85\x33\x6e\x2f\x2b\xbe\x06\xee\x4c\x0a\x34\x60\x45\xce\x29\x26\x60\x06\x87\xf1\xe7\x30\xc2\xbb\xcc\xfa\xd9\xaa\xa0\x90\x7c\x15\xa4\x16\x75\xbc\xfb\x93\xfb\x98\xb7\x5c\x87\xdc\x0f\x31\xa1\x02\x92\x1b\x48\x86\x4c\xe8\x9c\xb7\x7c\x6a\x13\xa2\x78\x89\x33\x3c\xbb\x1f\x30\xa3\x0b\xd1\xf4\x09\x6c\x89\x13\x38\x59\xcd\x66\x28\x9f\x7d\x0d\x9b\xa2\xae\x83\x34\x84\x8f\xea\x72\x50\x6b\xf1\x52\xb7\xfe\xec\xd2\x88\xa5\xf3\xae\xe4\xe6\x16\x38\xc5\x29\xc6\x54\x75\x62\x89\x1b\x8d\xf2\xb5\x93\xd6\xf5\xa5\xa1\x2e\x19\xe9\x20\xfd\x4d\xf3\x00\xf4\x19\xf1\x20\x1a\xad\x97\xab\xc4\xed\x2f\xfa\x35\xd7\x96\x1d\xe9\xf2\xe0\xb4\x74\x6d\x5e\x74\xe3\x09\x48\xae\x53\x82\x97\xde\xf7\xd1\xcd\xdd\x21\x7d\xb3\x25\xdc\xee\x24\xcd\x89\xd4\x74\x0b\xd5\xde\xa6\x04\xe4\x43\xdd\x44\xb5\xf9\x64\xa3\x66\x19\x73\x2e\x4f\xdb\x32\x73\xfd\xfd\xc5\xdd\x9b\xdd\xc5\xc8\x1d\x96\xbb\xd3\x58\x1e\xfe\x7d\x78\x83\xe0\xed\x4b\xcc\xa2\x0d\x83\x9d\x60\xb4\xc3\xfe\x97\x3f\xde\x2d\x32\x26\xd9\xe6\x94\x2e\xbf\xd9\xde\xbe\xbd\xbd\xdd\xba\xdd\xdd\xc2\x64\xb6\x3d\xde\xd9\xd9\xd9\x2e\xbb\x77\xfe\xc8\xda\x6e\xdb\xb7\x84\x1e\xf9\xe8\x17\xeb\x28\xbf\xaa\x43\x1d\x1d\xb5\x72\xbc\xde\xb0\x37\x7e\xf0\x57\x1c\xee\x0d\x7f\x85\x55\x5e\x0d\x2b\x19\xa7\x2f\xfb\x46\x37\x89\x92\xe8\xf4\xc4\x37\xc8\x1f\x9e\x5f\x1f\xd2\xbb\x97\x3f\x1a\x1b\xa4\x19\xd7\xc2\xc3\x76\xd7\x0d\xf3\xa8\x09\x13\xcb\xfc\x4a\xfb\x2e\x50\xa2\xe4\x59\x6a\x65\x73\x1c\xfb\x51\xc8\xb2\x2d\x1b\x21\x80\x2c\xc3\x82\xaa\x66\xf9\xf2\x7d\x66\x7d\x08\x2d\x31\xd9\xf6\x9c\x38\x31\x32\x0c\xd2\xd6\x03\x83\x43\xb9\xbf\x29\x67\xf3\x1e\x52\xd0\x71\x5e\xd8\x0e\xb8\x70\x8a\x66\x09\x58\x56\xb1\x10\x26\xa5\xd4\xdf\x2c\xb4\x1a\xb5\xb4\xd1\x42\x39\xed\x36\xdf\x82\x12\xcc\xb3\x6d\x8d\xf0\x61\x83\x1a\x4e\x4b\x84\x0a\xaf\x2a\xe1\x21\x6d\x29\x0d\xce\x7c\x7f\xb5\x06\xde\xef\x74\xfd\xa6\x82\x9b\x64\x3f\x2e\xef\x82\xff\xf7\xff\x36\x34\x20\x2d\x67\xa2\x7c\xc4\xd4\xe9\x24\x58\x1b\x7b\x6f\x24\x5b\x5b\x50\x63\x8a\x36\xb4\x18\x16\xd8\x3d\x50\x55\xd2\xdc\x30\x98\xa8\x9a\x01\xd7\x13\x58\xee\xa4\x06\xc8\xd2\x4f\x92\xd5\xeb\xbe\x51\x29\xf6\x19\x4f\x62\x7e\xbb\x8d\x45\x91\x54\xc2\x2a\x0c\x3d\x69\x81\x76\xf6\xfe\xe7\xbd\x8f\xaf\xde\xdc\x99\x35\xb7\x38\xcc\x14\x0f\x08\xb3\x4e\xcc\x52\x8b\x9f\xd7\xc6\xd8\x69\x29\xc1\x34\x52\x6a\x4e\x94\xb4\x09\x73\x9e\x97\xde\x5a\x4f\x49\xee\xbc\x0e\x78\x2b\x25\x82\x4d\x8d\xc9\xbe\xb2\x65\xa3\xb9\xd3\xcf\x1c\x69\x67\x5e\xa9\x66\xb6\xb9\x45\xae\x6a\xc4\x83\xe1\x9f\x50\x11\x8f\x77\x76\x96\x77\xe5\x02\x50\xb2\xca\x13\xc0\xc1\xd7\x1c\x22\xcb\x3e\xa8\x26\x7e\x71\xd7\xbb\x9d\x7e\x11\xde\xaf\xe0\x31\xb4\x70\xe1\x67\x38\xeb\x02\x8a\x3c\x2f\xf5\xdb\x7d\xa3\x3a\x29\x4b\x8d\xb1\x38\x97\x2d\xaf\xae\xc4\x91\xfd\x7a\xa8\x8b\xb3\x7d\xbf\xbe\xbc\xae\x80\xea\x94\x63\x7f\xe4\x7e\x4f\xf2\x2e\x70\x8a\xa6\xf7\x5f\x84\xbc\xda\xab\xd7\x24\xaf\xb5\xaf\xc7\x20\xaf\xdc\x39\x38\x87\xb1\x89\xd0\xa0\x1f\xf0\xa3\x2b\xd3\x9b\x8b\x49\x5c\xdc\x02\x9a\xcc\x95\xcc\xaf\xcf\x78\x72\xce\x44\xa1\x25\xfb\xcb\x62\x42\xa9\x8f\xdf\xd5\x02\xe4\xe8\x57\x98\xbe\x95\x1d\xf4\xdb\x85\x3c\xbd\xab\x92\x4c\x71\xb1\x5a\x94\x62\x2e\x70\x4f\xcd\x3c\xdf\x99\xef\xef\x04\x15\xcb\x0c\xdc\xd7\xd5\x11\xcf\x79\x3f\x0e\xe6\xaa\xad\x15\x28\x2f\x5f\x11\xdb\x73\x2b\x4d\xd3\xd7\x81\x15\x70\xf0\xb8\x72\xf8\x32\x00\x93\x53\x40\x48\x5d\xfa\x4c\x17\xbc\xf5\xa3\x57\x57\x2c\x9c\xcf\x13\xbb\xd8\x51\x5f\x5e\x9b\x48\xd3\x8c\xd4\x7c\xbf\xa0\xca\x99\x1a\x22\xd3\x50\xee\xda\xf8\xb0\xd6\x68\x6c\xb5\xd9\x99\x4a\xc3\x0a\xad\xd7\x16\x0c\x8e\xb6\xc9\x75\x9b\x05\xce\xe9\xbc\x81\x31\x17\xe7\x6c\x2b\xa9\x4c\xc0\x0f\xe5\x09\xe8\x1b\x95\x62\x3d\xd8\x37\xae\x13\xa5\x70\x99\xe1\x7b\x36\xfe\x14\x52\x80\xb2\x27\x5f\x9c\xe2\xbb\x6f\xf7\xf7\x76\xde\xa6\x89\xa6\x14\x1d\x46\x63\xad\x2a\xb8\x64\x6d\x9e\x79\x58\x4e\xa4\x2a\x25\x58\x68\xeb\xc3\x41\xad\xf7\x85\x22\x55\x53\x63\x5b\x21\x4c\xd5\xc9\x8e\x02\x24\x2c\x7f\x0d\x2b\xed\x89\x31\x9a\xa5\xa7\xba\x1c\xdd\xe0\x2e\x94\xc1\xa8\x43\xef\xee\xcd\x12\xbb\xf9\x42\x79\xd4\x5a\xe5\x4b\x02\xa3\xcc\x41\x31\x17\x79\x91\x12\x49\xa8\x2f\xff\x36\xb9\xeb\x01\x19\xf8\xa9\x33\xee\xeb\xfd\x57\xf7\x8b\x0f\x70\xbf\xa5\xc2\xb6\x89\xe6\x57\xe1\xef\x04\x42\xb6\xb3\x51\xa2\x8a\x71\x9d\x57\x68\x5d\x68\x6a\x2b\xae\xab\xbc\x96\xe3\xcc\x38\x64\x27\xab\xc5\x12\x12\x1e\xe2\x45\xc1\x4c\x39\x67\xf5\x6e\x5d\x27\x6e\xdb\xe3\x5d\xc5\xbc\xb5\x26\xa2\x0e\x56\x71\x46\xf0\x02\x9b\x80\x93\x16\x5d\x4b\x1d\xf8\x04\xa4\x1c\x42\xea\x16\x90\x1c\xe5\x33\x3b\x9a\xd4\x47\xf1\x86\x40\x79\x85\xdf\x3d\xd9\x0b\x48\xd1\x3a\xca\x25\x40\x2c\x5b\xc6\xed\x37\x69\x2a\x91\x90\x68\x89\x45\x3f\x4a\x3f\x89\x4f\x5c\xd7\x1c\x14\x31\x5c\x2c\xe7\xa0\x40\x1a\x0b\xfd\x26\x74\x2f\x96\x74\xc4\x44\x61\xbe\x2a\x77\x95\x15\x32\xd7\x6a\x02\xf9\xbf\xda\xbc\x45\xbe\x6a\xaf\x9a\x1e\xe0\x18\x57\xb1\x9a\x2c\x10\xf5\xd3\x83\x4d\x4d\x78\x3c\xb0\xfb\x0d\xf9\xed\xaa\xaf\xb4\x62\xda\x63\x1b\x0a\x97\x02\x63\x18\xe8\x5c\x66\xaf\x94\xad\x80\x73\xa9\x57\x08\xe9\x58\xe2\x8b\xed\xbc\xdf\x4b\x7d\xc0\x18\xae\x5d\x8b\x72\x6c\x60\x67\x75\xeb\x9e\xb8\xf3\xa1\xd5\x65\xdb\x3c\xf4\x8c\x35\xf4\xb3\x0d\xd4\x45\x03\xe4\x49\x7f\xe5\x11\xcd\x58\xb7\x52\x54\x8b\x7e\x0d\x81\x5e\x00\xbd\x2b\xef\x79\xd4\x95\x99\x67\xd4\xea\x4d\x1b\x40\xf1\x76\x60\x64\xa9\xb4\x4a\x43\x9e\x88\x62\x35\xb5\x90\x4a\x41\x5c\x47\x0f\x78\xc0\xf3\xdf\xa9\x25\x3d\x6d\xb5\xe0\xed\xee\xc1\xf3\x6f\xff\x98\x9b\xc5\xd6\x1c\x1b\xc4\x75\xea\xf7\x2c\x6f\xa3\x94\xde\x6f\xbd\xda\xb6\x6d\x53\x13\x6d\xd3\x13\xdd\xbe\x2e\x3b\xa3\x15\x95\xb1\xec\x07\xf3\xb3\xe7\x46\x1e\x0f\xa9\xf9\x52\x5d\xe5\xe7\x9a\x49\x22\xaf\x2e\xc0\x76\x8c\x9e\x46\x43\x41\x81\x37\x27\xd6\xd3\xc0\xf5\xf8\x05\x28\xae\x03\x51\x2c\xbc\x47\xb3\x63\xc6\x56\x76\x90\x5f\x57\x9b\xba\xca\x4a\x8f\x46\xd2\x1a\xd2\xa3\x49\x9b\x52\xe2\x6a\x73\x2a\x4b\x7a\x7a\xbf\x04\x67\xab\x45\xbf\x26\xc7\x67\x9f\xfa\xd1\x0b\x2e\xb0\xf0\x39\x35\xcf\x76\x7b\x08\x8f\xce\x8a\xbd\x0b\xd1\x84\x1e\xc5\xc5\x58\xed\xf4\xbb\xea\xd8\xdb\x55\xca\xc6\xf0\x72\xfa\x2e\x63\xcc\x55\x74\xb9\x6b\x29\x82\x67\xa9\x27\xd3\x75\xce\x37\xef\x92\xcd\xf2\x24\x5a\xf9\x11\xc5\x28\xc2\x9e\x5a\xe3\x14\x71\x88\xfa\x47\x3a\x5c\x2a\x7b\xc0\xd3\x3e\x58\x7e\x3a\x3a\x7e\x37\x3b\x39\xbf\x75\x1e\x2c\xa2\xf6\x77\x60\x99\x5a\xe7\x29\x23\x82\xa2\x72\x7c\x4b\xc0\xd2\x7d\xcf\x31\x31\xa0\xb8\x1d\xa4\xed\x9a\x63\x44\x48\xf1\x66\x06\x38\xb4\xf3\x42\xc0\xf2\xe5\xd2\x63\x90\x03\xb3\x1a\x99\xf6\x58\x0a\x0b\x44\xb4\xe7\x54\x5c\xc6\xda\xcd\x1c\xfa\xbe\xb7\xd9\xa1\x3c\xf2\xae\x54\x6b\x66\xab\x65\xbe\x03\x08\x2b\xac\x3b\x6f\x93\x5e\x2d\x40\x58\x5e\x04\xe3\xfd\x06\xdb\x41\xcb\x75\xd0\x46\xbe\x21\x37\x9f\x8d\xb0\x4a\x1b\xc0\x58\x0f\xea\x32\x33\x72\xc7\xa1\x38\x88\xb6\x4c\xd3\xea\x41\xa3\x07\x99\xdd\x09\x5f\xb1\x8d\x4e\x4f\x70\xc1\x85\x00\x48\xfb\x82\x2c\xd0\x21\x2d\x9c\xf7\xfb\x39\x04\x19\x9d\xdf\x57\x2b\xa4\xef\x59\x29\x06\x36\xb6\x81\xbf\xe3\xaf\xdb\xe8\x22\x98\x53\xf8\x0a\x57\x61\x95\xb7\xaf\x43\x0a\x72\x59\xdd\x60\x23\xcb\xf0\x49\xbe\x6f\xa3\x0b\xd1\x9c\xc5\xb0\xa5\xf0\xb9\x8a\xf1\xb3\xb7\xe3\xd0\xad\x97\x43\x2b\xbd\xd3\xdb\x7a\xeb\x0a\xa3\xb0\x34\x3f\x81\x45\x42\xd0\x92\x5a\x62\xb6\xbb\x66\x69\x35\x65\xe8\xc6\x0b\x06\xc3\x3e\x5b\xcf\x0b\x61\xd1\xe2\x1e\x52\x67\xd4\x3c\x3f\x4f\x5b\x59\xfc\xf9\x97\xb3\xfb\xed\x1d\x62\xa2\x2a\x3e\xac\x15\xa2\xbe\xf6\x3e\x25\x2b\x44\x65\xce\xe3\x1e\x66\xa1\xcf\x85\xea\x62\x3e\xae\x31\x42\xde\x8e\x41\xcf\xab\xee\x29\x84\xa9\xe2\xcb\xf8\xef\x5e\x8d\x8f\x56\x14\x07\x1f\xe1\x0d\x24\xb4\x5f\x43\x3f\x3d\xd5\x7c\x9b\x90\x9a\x3d\x9a\x88\xe3\x34\x18\xd0\xb4\x3a\x02\x86\x34\x3e\x23\x78\x46\x60\x51\x04\x27\x6a\x41\x91\x47\xb4\x0d\x38\x0a\x4d\x36\x1e\x31\xc3\x27\x6a\x23\x81\x16\x62\xd6\x96\x32\xde\x16\xff\xa4\x76\xd7\xe1\x9a\x33\x3a\xae\x92\x5c\xd4\x2e\x96\xac\x29\x87\x6c\x0b\x4f\x71\x18\x85\x3f\x8b\x1b\x9c\x3b\x70\x44\xfe\x77\xba\x7d\x64\x2b\xac\xea\x3c\x73\xdb\x08\x65\x19\x1a\x58\x51\xcc\x77\x02\x1b\xdc\xcf\xac\xc8\xe0\x29\x0e\xfb\x91\xcf\x74\x37\x69\x93\x6f\xdc\x5b\x77\x34\x2f\x93\x76\x1f\x53\x1b\xfa\x5d\xc5\xbc\xd9\xc2\x72\x65\xe9\x7e\x79\xdb\x0d\xc0\xfb\xcd\x3e\xda\x93\x77\x67\x7e\xca\x58\x2b\xa3\x37\x98\x56\xab\x2a\x6a\x5a\x3d\xe4\xda\xee\x5a\xd6\x56\xec\x0d\x29\x36\x5e\xde\xeb\x2e\xc4\xe1\x58\x05\x8a\xa0\xd9\x88\x49\x6f\x98\x55\x8f\xe9\x66\x2c\x10\xbc\xf6\x2e\xad\xa5\xa2\x29\xe7\xec\x03\xea\x66\x45\x2c\xea\x7b\x3d\x71\xbd\xac\x00\xe0\x18\x2c\x0e\x97\x5a\xc9\x1c\xc3\x22\x65\xb1\x4e\xb1\xda\x98\x80\xc2\xf4\xa4\x9e\x71\x33\x94\x5b\x51\xe2\xb7\x50\x1a\x2a\x25\x54\x84\x33\x14\x08\x84\xe1\x93\xba\x28\x8f\x1e\x6d\x21\xd3\x6c\x45\x9d\xce\x05\x64\x51\x2a\x39\xa6\x2d\x91\x8e\x23\x4f\x3f\x7b\x6b\x85\xe0\x5d\x45\x61\x1b\xe2\xb4\xb7\x1f\x27\xa2\x94\x65\x50\xce\xc4\xbf\x54\xb7\x2d\x1c\xc4\x4e\x18\xcc\xd8\xa6\x55\x49\xdd\x6b\xf5\x6f\x8f\x2c\xfe\xed\x76\x80\x53\xe9\x39\xae\xdd\xc2\x04\x26\x98\xa8\xbe\x61\x08\x18\x52\x64\x4c\x09\x48\xae\x63\x59\x38\x45\xf5\x18\xa7\xbc\xfc\xb4\x11\x6f\xb5\xce\x36\x97\xfb\x6f\xf3\x5b\x1c\x4d\xa7\xf1\x14\xc1\x2c\x2d\x62\x90\xa7\x82\xe4\x4f\xfe\xfe\xf5\x7c\x6f\xf7\x97\x97\x3f\x7e\x3a\x70\xde\xbf\xd8\xbc\xe4\xc5\xc7\x96\x54\xc0\x76\x58\xb7\x64\xe0\xa4\x69\xca\x02\xc1\x74\x97\x96\x62\x7c\xb5\x29\xa1\x39\x08\x96\x6d\xa2\xe3\x51\xea\x4f\x55\x90\x24\xcd\x9a\x71\x25\x33\xf3\x82\x7b\xc6\x60\x3c\x41\xb7\x2c\xa3\x49\x60\xe6\xc2\x1c\x50\x9b\x2b\xb6\x2a\x40\xae\x39\xd4\x98\x3a\x83\xf5\x86\x1b\xea\x39\x65\xfb\xca\x4a\xb8\xfb\x8a\x42\x90\xf2\x08\x30\x3b\xe0\x4d\x10\xfc\xc1\x59\xfc\xd1\xf7\x0d\x29\xcc\x20\x6d\x7d\x47\xbc\xf6\x3b\x60\x8a\xda\x5f\xf1\x87\xed\xd8\x50\x76\x4c\xa0\x7c\x9b\x1e\xdf\xa6\x12\x55\xa7\xca\xa9\x9a\x38\xf3\x8d\x3b\x04\x7d\xe3\xcb\xe3\xcb\x9a\x81\xf6\x7d\xc2\xc1\x78\x35\xe6\x09\x8d\x19\xc1\x5b\xc5\x94\x16\x3a\xce\x9f\x87\xe0\x86\x07\x9b\xd2\x87\x2c\x7d\xb0\x29\xb5\x32\xdf\x63\xcd\x28\xf8\x1f\xff\x33\x18\xbe\x90\x03\x06\xbc\x06\x07\x69\x5b\xd0\xbe\xfb\x5a\xf5\x89\xe6\x05\xc2\xeb\x10\x92\x87\x72\xfb\x29\x64\x3d\x83\x06\x9d\x34\xe3\x3e\x27\xcd\xda\x07\x85\xf7\xdb\x3c\x24\x51\xb3\xaf\x76\x49\xd4\xef\x90\xb0\xf5\xde\x2e\x16\xfa\x1d\x10\xb6\xfe\x5b\xf7\xa8\x7a\x38\x74\x1f\x0c\x2e\x77\x4a\x65\x5f\xd3\x0e\x84\xe0\xaf\x6e\x17\x6b\x93\x91\x5a\xb4\x88\x66\x02\x95\x50\xaa\xa2\xf0\x45\xc5\xd9\x35\x01\x5e\x4b\x8d\xab\x1a\xd6\x87\x9a\xfd\x7d\x72\xa6\xca\xaf\xfe\xe6\xd4\xed\xc7\xaa\x6e\x3f\x15\xb9\x1b\xd5\x45\xa3\x5d\xc7\x4f\x70\x9e\xb0\x22\xcd\x19\xbe\x85\x24\x01\x45\x75\xa3\x67\xde\x96\x36\x7d\x7a\x80\xf2\x6f\xef\xe9\x41\x6e\x00\x4f\x5d\xdd\x27\xbf\x2e\x2e\x7e\xfc\x19\x59\xdd\x2d\xb5\xa8\x53\xb0\x80\xf8\xa4\xe4\x66\xd2\x04\x6c\xa7\x14\xd4\x5c\xaf\x5a\x3f\x0d\xf1\x64\x32\xbd\xa7\x2c\x1c\x35\x64\x61\x8f\x77\xb6\x89\xc4\xdd\x2b\x5d\xe2\xb7\x76\xd9\x26\x19\xdd\x72\xb1\xe7\x2b\xda\xc4\xa3\x5b\x38\xf6\x7c\x49\x8b\x8c\xac\x25\x64\x97\x7c\x74\x79\xd3\x1c\xfa\xc4\x04\x67\x9a\x11\xf4\x2d\x9e\x7c\xa3\xeb\x31\xca\x80\xdf\x9c\xb4\x6a\x33\x56\xb5\x60\x14\xd9\xf2\x98\x6f\x20\x99\xe0\x42\x63\xea\xb5\x88\xe5\x40\x27\xef\x29\xea\x43\x6b\xbe\x81\x53\xcc\x2b\xa3\xd3\xa5\xbd\xf2\x43\x9b\xd0\xef\xb4\x2b\x35\x55\xab\x67\x0a\x91\x9e\x59\x88\xa4\xe6\x24\xf4\x57\xb2\x84\xe4\x51\x74\xec\x61\x22\xa7\xed\xce\x3c\x58\xf3\x72\x4b\x9b\xa1\x57\x74\x1b\xc7\xf5\xbd\x03\xf6\x93\x30\xfd\x2f\x64\xfd\x84\x4b\xef\xdb\xd1\x66\x34\x2f\x6f\xe9\x52\xbb\xfe\xbf\xb1\x5c\x96\x74\x00\x0c\x9b\x7c\x51\x6c\xc9\x9f\x18\x68\x51\x03\xe8\xfb\x77\xc6\x86\x39\x54\x28\x53\x37\xb1\xec\x89\x4e\x9b\x51\xa5\xcc\x70\xb8\xa4\x38\xc1\xab\x9c\x2a\xfc\xf9\x5c\x7a\x81\x6c\xdc\xc7\x74\x40\xd3\x2b\xac\x6b\xae\xbb\x8e\xd8\xa1\x72\x0f\xd6\x9d\xb2\x5f\x7f\xdf\x2a\x2d\x0c\x89\xbb\x26\xbb\x34\x04\x76\x0b\x0c\xd2\x5a\x9a\xb5\x97\xc8\x1d\x35\x34\xeb\x51\x7f\xcd\x7a\xa8\xa0\x65\xe4\x02\xc5\x75\xb7\x1d\xb5\x43\xc0\xee\xad\x2b\x60\xf7\x7a\x09\xd8\x8d\x08\xd9\xb6\x57\xf6\x15\xb2\xcd\xbe\xd6\xb1\x83\xfa\xbe\x61\x1d\x3b\xa8\xef\x3b\x1e\xd7\x0e\x5a\x32\xa3\x21\x48\xf7\x2c\x82\x54\x17\x9e\xe5\x13\x47\xdc\x51\x68\xaf\x94\xd0\x14\xa2\xb6\xcd\xd0\xec\xc6\xbd\x25\x5a\x3c\xeb\x0d\x0b\x8f\x14\xa3\xfb\x2e\x31\xba\xef\x74\xa0\xf3\x9e\x8d\xc2\xae\xd2\x28\x71\xa0\x6c\xb5\x91\x63\x0e\x51\x98\x89\xaa\x62\x26\x8f\x4b\xf0\x35\xab\xe8\x30\x56\x73\x3f\x3a\xe8\x92\xd6\xeb\x69\xc5\xdd\x8c\xe7\xe2\xbf\x9e\xd2\x76\xaf\x21\x6d\xf7\x5a\xa5\xad\x27\x96\x3d\x7b\x6c\xaf\x0b\x78\xee\xca\x70\x60\xf2\x78\xe4\x28\x64\xe7\x6e\x18\x09\xd4\x42\x46\x07\x1e\xa6\xc7\x70\xe8\xe4\x62\x86\x51\x88\xf2\x14\xde\x99\xc9\xb0\x56\xdb\x07\x33\x7b\xb0\x68\x86\x56\x5f\xa2\xc3\x9c\x12\x97\x5f\xc7\xa8\x7c\x65\x52\x14\x71\x22\x8a\xe8\x55\x45\x8a\x52\x98\x0c\xb4\x9b\x3c\x80\x91\xa4\x58\x02\x5a\x4e\xe2\x69\x1b\x4a\xde\x16\xcf\xfe\x78\x57\xdc\x1f\x6a\xf1\x0f\xf5\x75\x14\x12\x82\x49\xd1\x9a\x5f\xae\x85\x3f\xd7\xf1\xe4\xce\xdb\x87\x16\x3d\xce\x40\x35\xcb\x56\x7b\x6a\x83\x13\x41\xbc\xe0\x55\xf9\x7a\xb7\x2e\xdc\xac\xf9\x69\x88\xd3\xb1\xe3\xa6\x5b\x4d\xab\x4b\xb9\x68\xc4\x1b\xd4\xd2\x71\x74\xd5\xb6\x8f\xdc\x9a\xbc\xaf\x8a\xc4\x41\xc3\x05\x12\xc5\x9e\x92\x3e\xfe\x1b\xf9\x0d\xce\x79\x08\x06\x0b\x82\xa2\x2b\x92\x07\x6c\x03\x36\x48\x5f\x11\x7e\x64\x10\xde\x4a\x73\x90\x07\x28\x2f\x28\xc8\x13\x18\xe0\x69\xf0\xe7\xdf\xea\x26\x5f\x1d\x3c\xef\xb7\x0e\x5b\x44\xf7\x12\x2c\x20\x05\xaf\xfb\xfb\xca\xd5\xc4\xba\x76\x47\x74\x23\x97\x0e\x15\xf1\x81\xa3\x89\xa5\x11\xb7\xf4\xba\x1e\x57\xf8\xa2\x52\xb9\x6b\x65\x8f\xeb\x93\xa1\x16\xec\x08\x39\x2b\x5f\x71\x84\x10\x0a\xef\x68\xb5\x53\x38\x35\xf7\xd9\x72\x4b\x68\x0e\xd1\x4a\x52\xdb\xa1\x6b\x2a\x43\xa9\x5e\x24\x56\x56\xea\x35\xa1\x1e\x51\x2a\xa2\xe5\xd2\x7a\x4b\xff\x1f\x1d\x27\x6d\x4b\x84\xa7\x95\xd6\xbc\x12\x6c\xe7\x78\x19\x9e\xda\x52\x14\xb1\xdb\x2f\x35\x7e\xe7\xbc\x6b\xc2\xb2\x16\x4e\xc2\x2a\xc2\x47\x36\xac\x1f\x13\x59\x26\x92\xd4\x38\xe7\x6f\x6f\x22\xd3\x5e\x35\x14\x06\xbd\x79\xa5\xa6\xd4\x89\x2b\x02\xe4\x78\xab\x7a\x48\xbc\xa4\x22\xb6\x8d\xfc\x9c\x64\x7b\x51\x28\x13\x8d\xcd\x0c\x78\x17\xdd\xc6\x3a\x4d\xe6\x30\x5b\xf6\xe5\x35\xd7\xca\x04\xdd\xec\xf2\x51\xfd\xa6\xfa\x96\x97\x7e\x65\x61\xaa\xb5\x4e\x6d\xe9\xfe\x3d\xa4\x20\x38\x03\x04\x2c\x1c\xef\xd6\x11\x86\x24\xaa\x50\x85\xce\xd2\x5e\xfd\xc0\x64\xb0\x04\xa7\x66\x62\xd1\xae\x2e\xc2\xec\x5c\xdd\xc1\xf4\xdd\x3b\x62\xbd\xa0\x53\xdb\x09\xb1\xeb\x30\x6a\x36\x42\x88\xb4\x0c\x0e\xa3\xe0\xc1\x12\xdc\x67\x18\xa4\xdf\x81\xe2\x95\x7b\xd3\x74\xe4\x19\x7b\x25\x9e\x04\xc1\x19\x7f\x95\xca\x4f\xca\x08\x3e\xf6\x90\x42\x6e\xe3\x14\xc3\x94\x04\x85\x78\x55\x27\x7c\xe3\x80\xdc\x96\xc0\xd4\xe4\x19\xc8\xae\x5e\x78\x50\xce\xb4\x86\x0e\x93\xb8\xbb\x4c\x1c\x70\x53\x18\xab\x19\xcd\xab\xfa\x72\x9d\xbf\x5b\xea\x28\xe4\xb2\x80\x04\xd7\x95\xbd\xe4\xe5\x62\xc1\xc1\x6d\xe9\x1c\xb2\x92\xd5\x45\x42\x20\xcc\x3f\xb2\x22\x8d\xef\xc4\x50\x29\x98\x9c\xf3\xfa\x5b\x19\xca\xe1\x29\xc3\x9a\x12\x15\xca\xc0\x0d\xe0\xc9\x65\x02\x98\x0e\x59\x67\x16\x94\x97\x9f\xf2\x90\x1a\x0b\x44\xca\x7e\x66\xa0\x9e\xcb\xe3\x7b\xbe\xc3\xc5\x92\xde\xc7\xb2\xc8\x70\xc7\x09\xaf\xa9\x9f\x5a\x4b\xc6\xcc\x26\x88\xa8\xa4\xc1\x09\x2a\x78\xed\xef\xd6\xed\xad\xa6\x35\xea\x7d\x9b\xf3\x91\xfd\xa2\x22\x48\x45\xd7\xc1\x14\x93\x80\xce\x51\x11\x7c\xc6\x93\x2d\x7f\x71\xe1\x22\xf7\x95\xfd\xbe\xd7\x90\x1d\x76\x2d\xbd\xc6\xba\x1a\x19\x50\x59\x2a\x4c\xbc\xad\x50\x8a\xc2\xd3\x61\x75\x0d\xaa\xcf\xcd\x91\x01\xa5\x65\x2a\xa0\x2d\xea\xbe\x7b\x4c\xb7\x73\x24\x42\xa2\xbb\x46\x94\x94\x8a\x6d\xe6\x31\x9e\x63\xf9\x60\xef\xc4\x4a\x71\xfe\x46\xe1\x8b\xcf\x78\xc2\x4a\x93\x52\x60\xde\x8e\xed\x17\xdc\x4a\xc7\x5f\xb0\x82\xf2\xe8\xe6\x3e\x2e\xcf\xb0\x05\x12\x1d\x32\xc8\xc8\x21\x37\x5c\x4e\xda\x8d\xdf\x72\xa5\x38\x78\xda\x77\xdc\xef\x9e\xfd\x01\xbf\xfe\xfe\xc3\xb5\xe3\x8e\xbb\x04\xa4\x80\xd5\x81\xf8\x98\xf7\xdc\xb3\xf2\xcd\x5d\x97\xdc\xf1\x55\x23\x33\x5a\x1b\x71\x27\x83\x36\xec\x61\xb2\x97\x0c\xe4\x5f\x66\xda\x19\xc8\x87\xcc\x5a\x19\xef\xe0\x49\x93\xd5\x97\x99\xf3\xc7\xd5\x90\x29\x2b\xa3\xed\x37\x63\xab\x83\x40\x8d\x10\x2c\x28\x3b\x2b\x85\x3d\x93\x0d\xab\x32\x64\x2a\x4d\xd4\x1b\x7b\x31\xc7\xb7\xaf\xd8\xc3\xef\xe5\x51\x7b\x65\xed\xbb\x02\x4f\xba\x8a\xc2\x1c\xde\xba\x4d\xa5\x9d\x84\x47\xf9\x14\x5b\x0f\xf4\xcd\x98\x04\x7a\xe9\x0a\xee\x75\x05\xc1\x5b\x3c\xf1\x52\x0c\xaa\x7d\x5f\x50\x18\x60\x12\x80\x15\x9d\x63\x12\x7c\x77\xfc\xae\xfc\xf4\xf6\xfc\xc3\x29\xab\xdc\xce\xac\x3a\xc6\xbd\x82\xe2\xe0\x1e\xaf\x48\x90\xf0\x6a\x97\x5b\xc1\x51\x50\x6e\x88\xe0\x16\x65\x59\x30\x81\x41\x79\x53\x83\x05\x85\x69\x30\x81\x53\x4c\x60\x40\xe7\xb0\x54\x24\x02\x54\x18\x3d\xf1\xee\x29\x4c\x7b\xe9\x18\xad\x76\x95\x04\xe6\x14\x12\x98\x8a\xd2\xa8\x68\xb1\x5a\x74\xd2\xd6\x7d\x98\x57\xab\xee\x3a\xcb\x2d\xac\x68\x62\x6d\x3a\x8f\xf5\x0f\xd7\xa0\x15\x99\xa2\x3f\xa4\x44\x4b\x96\x92\x6f\x7a\xff\xf0\x7b\xd6\x5b\x3c\x09\x4e\x2a\xfd\xbc\x79\x3f\xe2\xea\x0e\x4f\x67\x71\xc4\x3f\xb7\xac\x44\x07\x2a\xaa\x75\x81\xf6\xae\x2c\x75\xf2\xa4\x32\xe5\xb1\x40\x56\xbd\xcb\xee\xef\x70\xcb\xd2\x35\x6f\x7d\x5d\x77\xbe\x92\xea\x8e\xfb\x5e\xa9\x01\x79\x5c\xfc\x0e\x14\x79\xc9\xb5\xc4\xbf\xe4\xf0\xf6\x44\xef\x53\xa9\xb7\xb0\x84\x89\x1a\x11\xa0\xd5\x93\x3a\xe6\x75\x64\x54\x27\xe2\xc3\x5d\x0a\xf5\xa9\xfb\x5d\x08\xbb\x94\x68\x87\x1d\x11\xe6\x8c\xf7\x40\x51\xe0\x04\x01\x59\x68\xa7\xfb\xbe\xa2\x62\x6b\x1b\x97\x16\xd3\x20\x92\xb1\x9a\x89\xa8\xf8\xb8\xca\x73\x94\xcf\xa4\x45\xa4\xbc\x9a\xf1\x8f\x57\x2e\x36\x3f\x54\xaf\xe9\x65\x37\x1a\x6f\xef\xb3\xab\x0f\xbf\x31\x46\xb6\x35\xb7\xbd\xd9\x74\xcc\xb6\xf0\x46\xc3\x69\xea\xda\x4d\x67\x6c\x68\x0f\xa5\x3b\xf0\x89\xeb\x9a\x83\xa2\x2d\x94\x2f\x57\x75\x85\x7f\xa6\x83\xbf\xdc\x07\x56\xe2\xb6\x9c\xfb\x17\xe5\xe5\x1e\x15\xec\x68\x46\x5c\xa0\x12\xbe\xfc\xd5\xbd\xdf\x38\xab\xd9\xe9\x3e\x07\x37\x30\xc0\xb9\x7e\xfe\x7f\xd5\x67\xb7\xca\x18\xff\x62\x27\x77\x0b\xdf\x78\x9e\x5d\x29\x20\xd7\x1d\xa7\xd6\x48\x85\xe2\x11\x11\xab\x2f\xaa\x98\x07\x5d\x0a\x7d\x58\x51\xe6\x08\xe1\x91\xad\x57\xc2\x4e\xb1\xbe\x18\x77\x98\xa4\xeb\xd1\x36\x24\x71\x35\x92\x29\x40\x19\x4c\x2f\xbe\xad\x11\xcb\xc2\xba\xb4\x40\x68\x94\x38\x5b\xdf\x68\x7d\x9e\xcc\x61\xba\xca\x20\x09\x52\x72\x1f\x93\xd5\xc0\xb5\x31\xd6\x24\x6c\xde\xb6\x5b\x26\x68\xc0\x0e\xa8\x5e\xd3\xd1\xd8\xb5\x62\x8d\x6e\xba\xdd\xd9\x1a\x97\xec\xaa\xa1\x29\x6a\x5f\x92\x47\x46\xf6\xc0\x93\x91\x16\x46\x65\xbc\xe1\x28\xcb\x02\x0a\x8a\xeb\x22\x28\x56\x49\x02\x8b\xa2\xd4\xb5\xee\x03\x01\x23\x0b\xd3\x2d\x8f\xc4\x7f\xa7\xd5\xdf\x72\x2d\xd5\x28\xb2\x24\x10\x2e\x96\x75\x2d\xf1\xd7\xab\x6c\x8a\xb2\x4c\x78\x1a\xba\x5b\x98\x51\x49\x6d\x67\x96\xee\x69\x51\x18\xd4\xeb\xdc\xf2\xd4\xef\x83\xe0\xac\x1e\x60\xf0\x3b\x34\x2d\x4f\x81\x20\x99\x63\x5c\xc0\xf2\x4e\x48\x56\x79\x75\x76\x44\xe5\xc1\x52\xc0\x40\x41\xec\x95\xd7\x43\xa5\xbf\x82\xe2\xe5\x12\xa6\xbf\x6f\x93\x93\xeb\x9a\xe7\x05\x7f\xa9\x58\x0b\x0e\x40\xb0\xd6\xf5\x30\x30\xca\xd9\xf9\x52\xe0\x0c\x50\xe9\x39\xea\xa8\x0e\x1f\xae\x07\x13\xa6\x9e\x78\xbd\x71\xcb\x2d\x8d\x05\xad\x9c\xd8\xe5\xee\x26\x9d\xf8\xe5\xee\xa6\xed\x18\xe6\xee\x76\x1d\x38\xe6\xee\x86\xad\x58\xe6\xee\x66\xed\x78\xe6\xee\x76\x2d\x98\xe6\x2d\x2f\x6b\xc3\x35\x6f\xa1\xa5\x13\xdb\xbc\x85\x8e\x6e\x7c\xf3\x40\x4d\x0d\x76\x68\x5b\x6b\x60\x99\x05\xfa\x66\x54\xe3\x10\x37\x02\x76\x5e\x0d\xbf\x89\x8e\x54\xfd\x64\x22\x24\x05\x9b\xd3\xcb\x1e\xe7\x86\x58\x45\x58\xad\x7b\x47\x14\x1d\xb5\xdc\x12\xdb\xde\x78\xe5\x56\x8b\x3f\xb6\xe9\x2b\x5d\xb6\x9d\x3e\x56\x1c\x02\x0b\x48\x87\x9b\x70\xda\x57\xf9\x8a\x9f\x03\x09\x5c\xc0\x9c\xbe\x06\x28\x5b\x11\x68\x05\xc7\xaa\xb3\x67\x79\x29\x64\x5e\x4c\x25\xae\x3c\x67\x75\xb9\x64\xd3\x79\x56\x7b\xd0\xa2\x70\x09\x09\x8b\xad\x63\x37\x4f\x25\x1a\xd5\xe9\x99\xab\xc6\x16\x4f\xab\xc1\x6d\x16\x7d\x9f\x5b\x52\x36\xee\xa2\x5b\xf2\x3b\xd6\x93\x76\xd0\xed\xec\xff\x4a\xb6\xcf\x4e\x8f\xbc\x4a\x0e\xa6\x80\xc1\x66\x4d\x99\xbe\xb6\x42\xaa\x51\x6d\xa4\x48\x47\xcd\x35\x21\xdb\x16\x90\x56\x4e\x98\x6a\xbf\x55\xdf\xf1\x9d\xdc\x6c\xf5\xb2\x94\xbc\x51\xf8\x4a\xf0\xd1\x05\x2f\x04\xcf\x0e\xba\xe2\x25\xbe\x2b\xff\x29\x2a\x88\x0a\x9c\x73\x85\x87\xcb\x41\xbe\x2b\xd7\x85\x9e\xa8\x28\x5a\x17\x6a\xb5\xc4\x8f\xb0\xbc\x83\x1f\xa9\x25\x75\xc2\xf7\x1c\x1c\xec\x04\x14\x1f\x61\x82\x17\x0b\x98\xa7\xd5\x6f\x6f\xf1\xe4\x98\x15\xae\xe4\x47\x6d\xfd\xf2\xe3\x39\xca\x52\x02\xd9\x5e\xac\xca\x1c\x96\x0c\xb0\xbd\x04\x84\x16\xdb\xec\x08\x51\x8a\x1a\x7e\xe6\x6e\x8b\xcb\x66\x6d\x44\xa5\x91\x70\x66\xd7\xad\xd8\x17\xd5\xed\x3d\xc4\xf9\x09\x2a\x16\x48\x57\xe9\xb4\x67\x14\xd5\x3b\xc9\x20\x20\xaf\xf4\x1f\x5d\x2f\x16\x05\xf7\xf5\xe1\x96\x3b\x38\x4f\x33\xa8\x2d\xa3\x52\x59\x5b\xfb\xd5\xd9\x75\x51\x2e\x5d\x3c\x29\xd7\xae\x27\x35\x0a\x49\xec\x9e\xed\x1a\xf2\xa3\xe8\xdd\x05\xdb\xde\x54\x2b\xc8\xf8\x10\xb4\x71\x94\xd3\xf4\x1a\x22\x61\x9c\xec\xaa\xa1\xe9\xd5\x05\x47\xc5\xeb\xd9\x28\x05\x45\x4c\xcc\x7d\xd2\xb3\x8f\x66\x3d\xd8\xa1\x6b\x9d\xc8\x6d\xd8\xd2\x50\x29\x1e\x2a\xc3\x44\x1e\xb6\x54\x68\x39\x3e\xbf\xc3\xe5\x3f\xfa\x1d\x2e\xdb\x93\xaf\x21\xcf\xe1\xe7\x57\x47\x37\xc9\x77\xf8\xa5\x7a\xc4\x1c\x36\x50\xab\x8d\x55\x72\x6b\xd8\xba\x6a\xbe\x42\x61\xc4\x4f\x09\x5f\xfd\xdc\xd2\xbe\x0a\x4b\xc8\xdb\xca\xd4\x35\x9a\x5d\x88\x70\xef\x9e\xcd\xaa\xc3\xab\x7f\xcb\xba\x5a\x76\xbf\x86\xcd\xa3\xb1\xff\x64\x9b\x95\x00\xb9\x6d\x81\x50\xc9\x3c\x25\xf7\x95\x9f\x4f\x60\x91\xc0\x3c\x15\xf6\x18\x9e\xf6\xcb\x13\xab\x9c\x2e\x2a\xe3\x65\xcd\x63\xb9\xf7\x78\xd9\x29\xde\xd6\xaa\x79\xfd\x53\xae\x4d\x8a\x6c\xf8\x8c\x27\x67\xfc\xb8\xed\x9e\xac\x14\x1e\x95\xf6\x37\x4c\x58\xf0\x7d\xfd\x20\xfa\x68\x29\x27\xc1\x02\x52\x48\xd0\xaf\x30\x8d\x99\xbc\x7c\xea\x02\x24\x7f\xfd\xdd\xb7\x7b\x67\xbf\x8c\xff\xc9\x05\x48\x39\x89\x2a\x37\x48\xa6\x62\x53\x82\x16\x0b\x98\xca\x6c\x57\xbf\xed\x63\x97\x30\x97\x97\x21\x8f\x4f\x89\x73\xb0\x80\xc5\x12\x24\xd0\x6a\xbc\x10\xf7\x57\xbd\x8e\xaf\xc3\xe2\x68\x79\xda\x2c\xe1\x6b\x98\x45\xce\x00\x81\x39\xf5\x09\xcf\xd7\x4c\x28\x0a\x8d\x08\x5e\x31\xc8\xd6\x17\x12\x86\xfa\xc5\x2f\x2b\xc8\xed\x3c\xe5\xc6\x2b\xb6\xd8\xbe\x95\x04\x5c\xb2\xf7\xa9\x3e\xde\x71\xdd\x97\x4e\x08\xbd\x45\xa4\xfc\x1a\x29\x59\x31\x3e\xd6\x4f\x31\x27\x73\x10\x91\x91\xc2\xe5\x67\x8d\x72\x18\x89\x6d\x8f\x5b\x78\xc1\x71\x63\x59\xfb\xec\x61\x8e\x0b\x4c\x12\x78\x8c\xb3\x0c\x2c\x0b\x6e\xae\x94\x13\x9e\x83\x42\x7d\xab\x3f\xeb\xfe\x2b\x9c\x54\xde\x3e\xce\x50\x47\x03\x59\x88\x23\xad\x19\x4a\xd4\xef\xec\x6b\x85\x64\x1c\xe0\x26\xe1\xb9\x45\x03\x3c\xe1\xde\x8e\x0d\x4b\x5b\xbf\xcc\x03\x7b\x58\x41\x77\xee\x81\xd1\x49\x10\x9c\x62\x9e\x40\x75\x44\x29\x41\x93\x15\x85\x66\x68\x5f\xb7\x75\xda\x37\x3f\xa1\xf1\xee\x0b\xe1\x64\x0a\x50\x11\x24\x38\x9f\xa2\xd9\x8a\xc0\x34\xb8\x45\x74\x1e\xe4\x38\x28\xd9\x22\x00\xd5\xb8\xb6\x7c\x07\xd6\xb6\x4a\xce\x8c\x86\x01\x91\x5f\xd6\xb9\x0d\xe7\x36\x91\xbe\xb1\xb6\x0f\xcd\xe1\xcf\x0f\xad\x59\x53\x6f\xcf\x3f\x9c\xda\x40\x24\x42\x2b\xb8\xf9\xe7\x82\xcf\xda\xde\x89\x0b\x50\xc0\xd6\x77\xc9\xb9\x4b\x02\x6b\xd6\x4d\x32\x14\xdf\xa2\x3c\xc5\xb7\xe5\xf8\x61\x06\x0a\xaa\xd7\xcf\xb3\xf1\xbe\x91\x8c\xd7\xe4\xb0\xfa\xb4\x32\x53\x9f\x5c\xec\xec\xc1\x50\x0d\xce\xf1\xf1\x3f\x3c\x92\x5e\xce\x22\xee\xae\x63\x8a\xeb\x1b\x3e\xb3\x6e\x97\x2b\x17\xdf\x20\x78\xcb\x92\xf2\x06\xe9\xee\x16\x05\xfb\x11\x34\xf9\xa7\xae\xc3\xff\xf1\x62\xe7\xdd\xc5\x87\x3f\xfc\xf0\x4f\xae\xc3\x77\x3b\x07\x9b\xfa\x32\x98\x95\x5b\x79\x8e\xb3\x4c\x75\x6b\x1b\x32\x4f\x59\xea\x76\x6f\x9e\xa7\x5a\xf8\x05\x8c\x10\xb5\x89\xdc\x5f\x2b\x8b\xc2\x17\xc9\x8a\x94\xca\xf3\x99\x38\xe6\x35\x25\x4d\x62\xe5\xf8\xe9\x6a\x5f\xc0\x24\xd0\x18\xff\xa6\x2c\x04\xda\xe6\x7f\x30\xf9\x52\x39\x2e\x9e\xb6\x70\x79\xfb\xf2\xe8\xe2\x39\x3a\xe9\x29\x5c\x1a\x31\xb7\xe5\x51\xa9\xea\x2c\x6c\x7b\xb6\x96\x05\x3c\x8c\xc6\x96\x6e\xcc\x9c\x44\xb7\x91\xb9\xa4\x75\xb1\x9a\xe4\xe0\x26\x8c\x84\xc5\x79\x38\x3f\x88\xc5\x7a\x48\x66\xa8\xcd\xeb\x4f\x9b\x21\x4e\xfe\xf4\xf6\xf8\xd7\x3f\x4c\xfe\xe4\x57\xf2\xd1\xae\x6d\xbe\xc5\x93\xe0\x1d\x58\xe5\xc9\x9c\xe9\xfa\x86\x5e\xc8\x97\x54\x3f\x82\xaf\xcc\x14\x2e\x01\x77\x27\xd0\x5d\x24\xff\x35\xad\x0e\x75\x87\xca\x4f\xc2\xd2\xa0\x2b\x4f\x9c\xab\xc7\x22\x33\xc2\x96\x1b\xec\x4a\x19\xb9\x52\x6c\x27\xaa\xa5\x64\xab\xce\x13\xee\x34\x6c\x54\x40\x35\x6f\x95\x68\x69\x87\xd0\xb4\xe7\x9c\xb7\x04\x45\x54\xb9\xd8\x5d\x73\x09\x28\xc6\x19\x45\xcb\x60\xb1\xca\x28\xaa\x6e\x6e\x66\xa2\xc8\xcf\x78\x15\xa4\x38\xff\xc7\xdf\xff\x37\xe5\x61\xdc\x4b\x48\x16\xa8\x28\x10\xce\x03\x8a\x03\x75\x59\x0a\xd9\x41\x1d\x12\x12\x8a\xaf\xac\x41\x16\xdd\x24\xb1\x2a\xc2\x7a\x64\xcd\xae\x29\x7b\xda\x42\x77\xf9\x8d\xc5\x88\x8f\xc1\x84\xc2\xb4\x3a\x55\x95\x08\x4a\x5e\x50\x58\xc9\xb3\x71\xc1\x17\xda\x7b\x6a\xe4\x0b\x70\xae\xdb\xb5\x86\x14\x16\x3c\x81\xe5\xc5\x52\x39\x9f\x1d\x7d\x56\xd7\x8b\x19\x64\x69\x2f\xaa\x73\x5a\x3d\x24\x3b\x4d\x6c\xf6\x5b\x97\x32\xa6\xee\x43\xd9\xac\x8c\x9a\xa1\x82\xaa\x03\xd2\xba\x30\xbe\x57\xaf\x16\x57\x51\x58\xde\xc3\xe3\x29\xc6\xd4\x63\x07\x85\xeb\x86\x45\xea\x1d\x94\xa3\x89\x27\xba\x51\x6e\x49\x30\x0b\x55\x94\xb6\x46\x1f\x6b\x65\x79\xd4\x74\x58\x23\x4d\x96\xb9\x2f\x28\x5c\xf0\x1a\x6a\xab\x2c\x3d\x9f\xe3\xdb\x53\x29\xbb\xac\x70\x8b\xbd\x87\xce\xba\xda\xea\x31\x09\x3e\x0d\xd6\xac\x71\x63\x75\x89\xa8\xdc\x00\xf1\xeb\x39\x4e\xb3\xa8\x5b\xe7\x18\xcf\x65\x02\x68\x70\x64\xda\xc0\x7d\x83\x11\xdb\x07\x24\xcd\xad\x5e\x83\x61\x0f\x3f\xc4\x30\xa8\xc4\x7d\xed\x1e\xc4\xc5\xfd\xb2\x8b\xf5\x06\x0d\x61\x49\x10\x26\x48\x6c\xde\xee\x61\x9c\x89\xc7\x7b\x0d\xa5\x19\x72\x6a\xf4\xaa\x14\x80\xd6\xda\xb5\x24\x2d\x99\xe1\xce\xbb\x2d\xdd\x8b\xab\x98\x9f\x55\xaf\xcd\xbd\xe0\x08\x75\x2d\x09\x7a\x0d\xb9\x67\x85\x39\x5b\xb6\x50\xbf\xe8\x6f\x1d\x82\x93\xab\x38\xed\x31\xaf\xdc\x21\xe9\x8a\x7a\x75\xc6\xbc\xb6\x47\xbc\xaa\x9a\x1f\xaf\x2d\xc4\xc5\x75\x8f\x32\x28\x38\x3f\xae\xaa\x25\x35\xb0\xe9\x8d\x40\xcd\x33\x30\x43\x39\x30\xd2\x05\x9d\x33\xe2\xab\x5e\x5e\x01\xae\x6a\x87\x5b\xdd\x81\xaf\x3d\xbc\x6e\x13\xe7\x75\x22\x69\x9b\x51\xbc\xf2\x2b\x14\xb4\x54\xee\x8f\xa8\xcb\xe0\xf7\x8f\xbf\xff\xaf\xd6\xf6\x30\x4f\x5b\x5a\xe3\xa9\xb3\x71\xbb\x16\xe3\x6f\xb2\x56\x99\x98\xb9\xdb\x08\xbc\xd1\x98\xb8\x3a\xee\x55\x32\x95\x4f\x21\xec\x2d\x2d\xc5\xb0\x45\x91\xce\xc3\xb2\xb3\x64\x0e\x6f\x08\xce\xe3\x0c\x4e\xa9\x0a\x6b\x33\x28\xd0\xbc\x1c\x78\x2e\xb0\x1b\xda\x07\x2e\x9f\x5a\x6f\xd0\x32\x95\x7c\xe8\xa8\x15\x10\x50\x93\x01\xb9\x32\xe5\x4e\xd0\x70\x9b\xec\x2d\xd6\xac\x51\xc7\xdd\xa2\xb1\x13\xba\x3d\x43\x72\xf8\x83\x7d\x42\xa7\xd8\xbc\x1e\x76\x4d\x6c\x90\xfb\xe7\x14\x07\x04\x2e\x00\x62\x69\xaa\x19\xba\x29\xff\xfa\x8c\x27\x41\x26\xde\xbb\xd5\x3f\xb0\x9f\x7f\xc9\x18\xca\x1d\xe3\x9d\xb0\x04\xe9\xda\x42\xce\xa2\xad\x15\xa1\x64\xc4\x5f\x7f\xc6\x13\x16\x78\xcd\x78\x00\xc6\xe5\x8d\x20\x2e\x60\x06\x13\xaa\x06\x85\xdf\xc5\x28\x61\x12\x71\x0d\xfb\x86\xb4\x3f\x3c\xa4\x8d\xc3\x1a\xd0\xf8\xb4\xcd\x1d\xd9\x61\xba\xf3\xf3\x04\xbe\x32\x51\x96\x54\x33\x04\x48\x12\xb8\xa4\x81\x39\x33\x35\x83\x7c\x6c\x05\xe4\xde\x55\x6e\x49\x7a\x6b\xae\x7e\x20\xe8\x07\x23\x6b\xb9\xb0\x49\x4b\xb2\x28\x28\x66\xf7\x8c\x8d\xf5\x8c\xc7\x2a\x65\x41\xa8\x13\x75\x27\x16\x16\xb6\x27\x14\xa4\x80\x85\xcb\x2a\x33\x89\x41\x92\x60\x92\xa2\x75\xf9\xd3\xc2\x3b\x0f\xc9\xaa\x22\x3e\xfc\x69\x33\xe7\xee\xf5\xb7\x6f\x0e\xc9\xc7\xbb\x36\x98\x6b\x0b\x52\x41\x43\xac\xf7\x45\x86\xf2\xc3\x29\x70\x3c\xdc\xa2\x1b\x7a\x61\x14\x58\x67\x17\x69\x00\xc1\xce\xf8\x08\x0b\x18\x95\xd1\x4d\x0a\x39\x36\x88\xd4\x30\xbd\x0e\x53\xe7\x5c\xfb\x21\x11\x78\x18\xf2\xea\x85\xb1\xa5\x37\x8d\x6c\x20\x35\x55\x1e\xc3\x3a\x60\x04\xdd\x87\xa0\xeb\x54\xac\x05\x8c\x2e\x45\xc4\xe1\xb5\x96\x4c\x60\x6b\xf7\x90\x52\xa0\x25\x7a\xfe\x69\x4b\x86\xf1\xf6\x77\x7b\xb3\x9f\x7f\xc8\x1d\x92\x41\xe6\x55\x98\x91\x64\x9a\x88\x68\x86\x07\xd6\x66\xc0\xf2\xea\x1a\x85\x2f\xd8\xf5\xe6\xd5\xdd\x12\xe4\xa9\xc0\x04\xca\x2f\x58\xe6\x9a\x7a\x97\x1b\x1b\xa6\x78\xa5\xea\x04\x52\x32\x04\x51\x51\x75\x74\x75\x65\x05\xb0\x96\x46\x4e\x48\x0a\x6e\x52\xac\x2f\x80\x0e\x7d\x3d\x6c\xd6\xca\x08\x09\x04\x69\xc0\x17\xd5\x5a\x67\x45\xbf\x36\x68\x76\xc4\x92\x06\x7c\xd3\xbc\x93\xf8\xe8\x6a\xcd\x33\x54\x7c\x58\x72\x7b\x6c\xb9\xfd\x59\xe4\x5e\x79\x50\xb2\x59\x85\x1e\xc1\x8d\xbd\xa4\x6b\x87\xd4\x11\x92\x26\xc8\xf1\x2d\x01\xcb\x96\xfb\x6a\xa9\x6c\xf3\xf5\x0f\x50\x1e\x70\x7e\xb0\x07\x59\x19\xb5\x7f\x38\x8c\x75\x6d\x37\x37\x28\x50\xc1\x97\xf2\xb4\x52\xe1\x29\xb9\x72\x0f\xc4\xbc\xbd\x7e\xd6\xa3\x2b\x59\x52\x24\x05\xd9\x29\x4e\x85\x56\xd4\x27\x7e\xc6\x16\x1c\xe0\xe5\xea\x38\x9a\xcd\xd8\x36\x0b\xf8\xfe\x0f\xf0\x94\xe1\xd9\xfc\xb6\xd0\xf0\x08\x50\x1e\x94\xfa\x90\x60\xab\xad\x16\x72\x9b\xf7\xc6\x7d\x56\x30\x29\x9f\xe2\x38\x41\x24\xc9\x60\x8c\x57\x54\x0e\xe6\x32\xac\xef\xa8\x35\x4a\xf8\xda\xa1\x43\x75\x89\x1b\x73\xd5\x5c\xa6\xe5\x3e\x58\x43\xd6\x36\x28\x2f\xe7\x14\x27\x73\x40\x68\x30\x59\x2d\x96\x90\xc8\x9b\x7d\x17\x6c\x3b\x97\x42\xcf\x34\x7b\xd1\x79\x86\x12\x78\xcc\xcf\xbe\xca\xf6\xd5\xe4\x97\x17\xa8\x38\xad\x10\x0d\x5a\x04\x8a\xd6\x61\x13\x8e\x4c\xe4\x8a\xbb\xf8\xf2\xea\x4a\x80\x84\xd9\xad\x50\x7e\x8c\xd9\x85\x09\xe7\xec\xc3\x65\x4a\xd0\xa5\x58\xef\x2c\x7b\x8d\xf2\xd2\x21\x5a\x2c\x33\x44\x59\x08\x97\xf4\x79\x7a\x2e\xc5\xc3\x92\xdf\xd7\x6a\x5a\xaa\x56\x58\xb1\xaa\x64\x70\x06\x73\xd3\x39\x1d\xea\x75\x3e\x9e\x5f\x35\x2b\x4b\x8d\x23\x91\xae\xeb\x87\x4c\xa3\xbe\x5e\x94\x5b\xa9\x8b\x56\x09\x23\x2d\xdb\xe7\x22\x11\x81\x0d\xc3\xb2\x19\x2a\x6c\x21\xa9\xec\xed\x28\x56\x5e\x51\xaf\xa3\x2e\x16\x5d\xaa\x57\x37\xf0\x04\xd0\xd5\x22\xac\xca\x79\x28\x07\x6f\x11\xf3\x27\xc2\x61\xef\x93\x35\x21\x64\x14\x08\xef\x92\x59\x5f\xb8\xc0\x67\x9a\xa9\x00\x68\x74\x78\x48\xcd\x6a\x5a\xf6\x7e\x6d\xe4\xd4\x39\x74\x34\xee\x99\xc1\xb0\xc5\xc5\x74\x11\xda\x78\x8c\x51\x93\x71\xc6\x3b\x94\x97\x4c\xcd\xda\xb3\x28\x31\x5f\x66\xb3\x0e\x52\x75\xf1\xa6\x62\x59\x5e\xc8\x12\x53\xdd\xf1\xf1\x66\xbf\x3e\x81\x01\x9b\x1f\x89\x25\xee\x54\x63\x71\xb3\xbc\x43\x64\x56\xe9\x72\x3c\xad\xcd\xcb\xee\x6b\xf0\x8d\x84\xf8\xb7\xea\xd6\x58\x95\x7f\x6b\x3d\x5d\xe6\xf1\x07\x3b\x43\x1f\xad\xa2\x83\x19\x75\x80\x69\x70\xc4\x60\x98\xb5\xb0\xd6\x6e\x92\x0d\xce\xa5\xf8\x19\xaf\x88\x65\x71\x9c\x22\xfa\x8a\x83\x54\x50\x94\xcf\x8a\x2d\x8a\xaf\x61\xee\xeb\x2d\x0a\x82\xa3\xe3\x77\x01\x6b\xd2\x19\x8c\xa0\xfe\x9a\x62\x58\x04\x39\xa6\xc1\x92\xe0\x1b\x94\x36\x23\x19\x3c\x23\xfa\x73\x9c\xc2\x6f\xca\x5b\xa4\xff\xe5\xa3\x8e\x8f\xda\xda\x20\x97\x1a\xd2\xb8\xc5\xa5\x53\x59\x76\x41\x18\x85\x4c\x0b\x67\xb6\x5a\x2e\xfb\xad\x75\x0e\x99\x17\xa2\x36\xdd\x96\xf2\xc1\x28\xe6\xc0\xcd\xc0\xc2\xf5\xa0\x94\x2b\x6c\xda\x4c\x26\x80\x38\x0d\xc6\x0c\xf3\x66\x46\x35\x9f\x88\x1d\x9c\x22\xe6\xa7\x72\x8c\x28\x5c\xac\x67\x36\x72\x5a\x75\x1e\xd2\x94\x64\xc1\xb9\x78\xda\x26\xa4\xfd\x97\xd3\x93\x9b\x9f\x5f\x16\xad\x26\xa4\xcc\x04\x81\x71\x98\x99\xfd\x2a\x39\x39\xfa\xb4\xc0\x54\x71\x40\xd6\x4d\x96\x76\xea\x68\x47\x9c\x09\x04\xe2\x64\xeb\x3f\x8d\x23\xae\x80\x4b\x24\x9d\x50\x6e\xe4\xba\x49\xf3\x30\xb1\xda\x60\xa4\xa9\x65\x30\x35\x8b\xd5\x84\xe7\x46\x87\xfa\xe5\x5c\x21\x6f\x67\xa7\xc5\x1c\x13\xfa\x26\x6d\x18\xcd\x43\x5b\x70\xaf\xa5\xfd\x8d\x40\xca\x8b\x1a\x91\x5f\x16\xcd\x51\x4b\xa1\xae\xa3\x57\x79\xcb\x98\xa2\x05\x94\x91\xac\xd2\x56\xae\xaa\x37\x5a\xbd\xe0\x51\x23\x50\xd8\x7f\x70\x95\xfd\xd1\x7d\x5c\xe8\x7a\x8f\x69\x0a\x1d\xf2\x32\x0f\x0b\x8f\x57\x15\xdd\x4d\xb0\x7d\x83\x21\x45\xc6\x8d\x50\xe7\xd2\x20\xf4\x60\x1c\x26\x82\x8f\xb9\xce\xd7\x42\xcb\x86\x75\xb0\xad\x3b\x9b\x81\xb0\xed\xb0\xd5\xc2\x7d\xf4\x6a\x00\xce\xd0\x5e\xbf\xfd\xe5\x0e\xd6\xd4\xc3\x7e\x99\xd2\x0b\xb9\xd9\x2a\xcd\xe0\x05\xbc\xa3\x2c\xa2\x8b\x81\xce\x55\x9f\x70\x3e\x45\x64\x61\x7c\x64\xea\x78\xed\xc2\x7a\xc1\xad\x6d\xf2\x21\x70\x0b\x50\xa9\x65\x1d\x2b\x0f\x97\xdf\x2b\x01\xd9\x2f\x70\x2e\x7e\x55\x4d\x35\x8a\x3f\xb9\x1c\xd1\x4b\xee\x2d\x62\x10\x85\x96\xb7\x8a\x6f\x5f\x56\x3e\x25\xa5\x06\x5f\xa9\x63\xcc\x21\x41\x34\x4e\x70\xc6\xd0\xc6\xb4\xfa\x7c\x51\xf8\x1a\xa0\x2c\xd0\x68\x28\xc0\xf6\xa2\xf0\x67\x58\x44\x41\xf3\xf7\x23\x02\x19\x66\x6c\xb1\x22\xf0\xbf\x43\x66\x81\xab\x16\x66\x0a\x50\xd6\x58\x86\xb6\xdf\xc4\x84\xf7\x95\xdd\xc9\x9e\x73\x86\x98\x19\x5b\xcc\x87\x29\x44\xcd\xc9\xe2\x8c\xe0\x05\xae\xeb\x2b\x38\xcc\xad\x5d\xb0\x8e\x02\x94\xb7\xfc\x67\xb1\x00\x59\x66\xe2\x4e\xb3\x97\x40\x3f\x80\xc7\x26\x58\xa3\xbd\xf9\x95\xc3\xeb\xa8\x92\x4d\xb6\xf4\x71\x36\x72\x4a\xc0\xe0\x18\xe4\xa0\x81\x25\xda\xdb\x0c\xda\xed\x9f\xec\x14\x76\x2c\x11\x40\x09\x39\x6f\x05\x23\x57\x23\x18\x15\xa5\xae\x5b\xc0\xfb\xd8\x90\xf4\x9b\xe7\x02\x96\xfa\x68\x1b\xfc\x81\x21\x99\x50\x71\x3e\xc7\xb7\x28\x9f\xd5\xaf\x3d\x81\x14\xa0\xcc\x1a\x3e\xae\xbf\x8c\x36\x21\x1e\xec\x69\x88\xb6\xc6\xc0\x0b\xac\xc1\x7d\x40\x35\x2e\x30\xc3\x16\xb2\x75\xf9\x46\x23\x66\xdf\x1a\x5b\x64\xfd\x78\x2f\x3a\x10\x95\xa8\xf7\xa2\xcb\xdd\x43\x2d\x0c\x55\x41\x3f\x6d\x23\xb0\x09\xfc\x2f\x27\xe9\xa3\x38\xb6\xaf\x5b\xf8\x1d\x62\x65\x4f\xca\x67\x2a\x65\xb1\x66\x3d\x06\x4f\x1e\x70\x88\xbb\x00\xe4\xa9\x6a\xaa\xd9\xa4\x1f\x3f\x4c\xcd\xbb\xe2\x14\x97\xa7\x41\xcc\xee\x31\x0b\xcc\xe1\x00\x09\x5e\xc4\x39\x0b\x5c\xa3\xb7\x38\x2e\x28\x5c\xc6\x13\x79\x80\x34\xd0\x4a\x19\x4e\x69\x35\x91\x38\x95\xa4\xac\x2f\x9b\x54\x78\x95\xd7\xb9\xf6\x35\x6e\x60\x0f\x79\xdd\xe3\x80\x7f\x4f\xfb\x86\xf7\xfc\x8f\xc9\xfb\x5f\xff\x90\xdb\xaa\xe4\x57\x98\x28\xa5\x42\x45\x56\x09\x5d\x69\x75\x6d\xbb\x76\xa0\x65\xf3\x0d\xbd\x97\x29\xf8\x27\x03\x25\x7a\x9f\xc2\x48\x6a\xb4\x43\x85\xfb\x71\x06\x10\x29\xac\xa9\x4d\x56\x12\x85\x35\x60\x88\x88\xe3\x1c\x52\x76\xa2\xb1\xed\x44\x92\xad\x1e\x44\xd3\x7c\xd3\x1a\x1b\xa4\x9c\xcd\x43\xee\x09\x1b\x5a\xe8\xd3\xde\x21\x3f\xfc\xf8\x23\xf8\xee\xf8\xe4\xbe\x2b\x8c\xc6\x0a\xad\xe4\xb7\x55\xfa\xc5\xdb\xf9\xd6\xa9\x96\xe3\x09\xe4\x80\xd6\xda\x42\xed\x3e\xd2\x71\x4b\xac\x4f\xa4\xeb\x13\xdd\xfe\x52\xfb\xe5\xa8\xea\x24\x6c\xc9\x32\xbf\x52\x4a\x78\x54\x5a\x45\xef\x6d\xa6\xbe\xca\xa3\xb6\x6d\x13\x41\x7b\xad\x2d\xd8\xdc\x22\x0f\xb9\x21\x6d\xc0\xb6\x4f\x7b\x43\x9e\xbd\xff\x53\x0a\xdf\xfc\xe9\x27\xbf\xec\xf3\xc6\xde\x18\xb6\x9f\x38\x10\x59\x70\x64\xe8\x53\x76\xd6\xf2\x48\x36\xae\xcf\x1d\x8b\xbd\x4e\x5b\x8c\xe1\x79\xc7\xed\x9d\xd9\x73\xdf\xed\xa1\x7e\x3d\x33\x7e\xeb\xc4\x23\x03\xb9\xed\xd1\xd2\x7f\x1b\xbe\x5f\xff\xf4\xdf\x81\x35\x51\x8c\xa6\x76\x4b\xe0\x9b\x93\x5e\x6e\xb8\xf6\xce\xea\xd2\x29\x1b\xec\x54\x14\x55\xd9\x60\x8f\xb2\xdc\xca\x06\xbb\xb4\x66\xd6\xae\xd3\xa1\x28\xd1\xb2\x49\x3a\x36\x3d\xf1\x6b\x0e\x91\x15\x76\xd9\xe4\x08\xcf\x3e\x6d\x72\x95\x59\x31\x18\x3f\xc7\x66\x77\xaa\xec\x20\x5f\xbb\x2a\xc6\x54\x5f\xb3\xbd\x24\x0c\xb7\x78\xf2\x78\xb3\x3a\xa6\x4b\xaf\x0e\x63\x2d\xb3\x3f\xc3\x14\x1f\x29\x5d\x9a\x4d\x3b\x33\x52\xdb\xc2\x5b\xba\xb2\xf1\x06\x46\x14\xc8\x25\x5c\x23\x9e\xe0\x14\x37\x0e\xbf\x8e\x65\x1e\x1e\x49\x70\x8a\xb5\x18\x13\x06\x2f\x32\x81\x30\x0f\x98\x6a\x94\x6e\x75\xbb\xc9\xdb\x90\xf2\x1a\xbf\x0e\x3a\x34\xd7\x32\x3f\xa9\x74\x71\xba\x1a\x9a\x5c\xbd\xe7\x0e\x72\xd3\x62\xdb\x74\x65\x4e\x0f\xbb\xf7\x08\xaf\xf8\x11\xc1\xdb\x72\x01\x3a\x5d\x2f\x0e\x2a\xb9\x64\x88\x1e\xfa\x03\x8c\x3d\xe4\xd1\xad\xdd\xf9\xd5\x16\xba\xd3\xaf\x1a\x13\xcf\xdc\x74\x64\x6d\xb6\xd5\xc4\x51\xac\x54\x75\x08\xc3\x32\x5b\x11\x90\x71\x24\x96\x35\xae\x03\x4d\x05\xfd\x21\xaf\x03\x4a\xfd\x90\xa7\x7d\x0b\xa0\xcf\x3f\x7c\xfa\x29\xfb\xec\x89\x41\x55\x39\x49\xfa\x5e\x07\xb8\xf5\x88\x87\xae\xd7\xc5\xa1\x6d\x31\x7d\xa2\xa3\xda\x29\x9d\xc9\x20\xc3\xd1\x5e\xb4\x5f\x2a\xb2\x29\x9d\x7f\x13\x1c\x6c\x8d\xc6\xfb\x04\x2e\xfe\x4f\xb5\x0b\x5e\xeb\x5c\x58\x79\x5d\xb7\x73\x0f\xc4\xf0\xc6\x93\x26\x5a\xf8\x05\x43\x0e\x71\x89\xcc\xda\x01\xc0\x01\x46\xda\xf6\xce\x86\x07\x76\x56\xe1\x89\x74\x0e\x4e\x81\x1e\x79\xc4\x01\xb6\x55\xf1\xd3\xc7\x27\x7d\xf7\x9e\xc3\xb3\x82\xdc\x59\x2a\x82\x8e\x22\x0d\xda\xec\xca\x1b\x2b\xc8\x95\xe0\xe4\x0b\x42\xdf\x49\x9a\x53\x15\x70\xcd\xa5\x0a\x44\xcd\x39\xb8\xf0\xda\x3b\xa4\xb4\x72\xfe\x1e\x46\xbb\x4d\x90\x49\xad\xb1\x03\xe6\x5b\xb3\xd7\x96\xb3\x67\xb9\x0b\x35\x1a\x92\xe7\x29\xef\x2f\x1d\xd6\x93\x0f\x67\x20\xb9\x6e\x11\x10\x0f\xb0\x9e\x5e\x4b\xd9\x4d\xca\xae\x95\xf5\x5d\x19\x02\x67\xa8\xa0\xe4\xbe\xe9\xbb\xec\x33\x73\x8f\xb9\x7f\xac\x5e\xd4\x76\x1b\xea\x39\x64\x3b\x19\x9d\x1c\xee\x47\x92\x5a\xcc\x3c\x2c\x45\xba\xca\x97\x7a\x13\xc4\x21\x17\x37\x45\x0f\x02\x6f\xd0\xa3\x10\xe4\x63\xf5\xa2\xf5\x59\xa4\x1a\x72\x4f\x92\xe8\x82\xfc\x30\xda\xeb\x74\x2e\x35\x75\x5d\xed\x97\x0a\x45\xb5\x51\xc3\x24\x0a\xff\x0b\x4c\x29\x24\xfa\x57\x6c\x06\xcd\x72\x5e\xdc\x23\x95\xaf\x89\xb3\x5a\x29\xa1\x0f\xaa\xe9\x5a\x42\x8a\x9f\xb8\xce\xfb\xe9\x68\x71\x37\x1f\x5f\xfc\xc1\xa9\xf3\x6a\xe1\xd1\x76\x45\xd7\x08\xd6\x63\xc1\x58\x71\x71\xcb\x40\x36\xf5\x44\x5e\x2d\x21\xcd\xfe\xa5\x8a\x80\xc2\xfb\x88\x85\x41\x44\x89\x8b\xbc\xb2\x99\x4d\x2d\xbb\xec\xce\x76\x01\x6e\x3c\x27\xb2\xc3\x5c\x07\x6c\xad\x85\x89\x2c\x32\x2f\x1d\x4c\xbc\xa0\xbd\xc7\x3a\x81\xae\xad\xc7\xf6\x23\x6e\x0e\xb3\xa5\x55\xc3\xf0\xc8\xce\x21\x98\x5d\x3d\x3b\x83\x5a\xf5\x57\xd9\x83\x29\xf5\xfb\xf8\x78\xdd\x54\x1c\xaf\x7b\x75\x33\xd1\x4c\x87\x94\xc1\x79\x02\xe8\x86\x90\x8c\x2c\x9b\xfb\x11\x64\xc9\x53\x97\x1f\x23\x98\x9d\x7f\xff\x7a\x31\x6f\x07\xf2\x1e\x86\xf0\x60\xc6\x50\xf7\x42\x78\x18\xaf\x85\xf0\xd0\xea\xf8\x31\x93\xfe\x22\xf9\x51\x5e\x85\xfd\x53\x00\x75\x98\x03\x7e\xe7\x9a\x83\x42\x05\xe1\x0d\x25\x84\x96\xc8\x2a\xd1\x4d\x45\x6a\x5c\x72\x7b\xf1\x84\x75\x01\x76\x3a\x73\x08\x0d\xb9\x64\x9f\x8d\x19\x25\x28\x7f\x73\x3a\x60\x1e\x1c\x20\x42\x97\xc8\x62\xd4\xd5\xee\xe3\xe8\x10\xca\x0c\x5c\xca\x59\x53\x54\x99\x53\xad\x6d\xdd\x4f\x7b\xb2\x6c\x9c\x0e\x2c\x8c\x76\x33\xb8\xf5\x09\x7f\x5c\x08\x07\xe3\x75\xa9\xd5\xbd\xf1\x20\x7c\x19\x55\xb1\x98\xec\x2b\x16\x13\xf1\xbc\xc9\x18\x5d\xb9\xe5\xa1\x35\xc6\x57\x40\x1b\x68\x90\x12\xea\x7b\x1c\x30\x10\xed\x79\xd9\x82\x30\xa1\x50\xd9\xa4\xcf\x59\x1c\xb4\xad\xd8\x18\xcc\x53\x22\x67\x65\xf9\xdd\xc1\x00\xee\xd1\x84\x56\xb0\x8d\x5a\x82\x1d\xe3\x9c\x02\x94\xb3\x70\xfe\xa1\x64\x50\xf9\xcf\x32\xc8\x8e\x7d\xda\x19\xd9\xd3\xf4\x05\x84\xc3\xdc\x8a\xbd\x25\xa4\x9d\x67\x1c\xc4\x93\x60\xbd\x66\x34\xa1\xb1\xcb\x15\xcd\xbb\xf9\x4b\x13\x8c\xc3\x23\x15\xf9\xcb\xc0\x5f\xc8\x97\xaf\x03\x7e\xf1\xb8\xd0\x17\x03\x81\x2f\x3c\xe0\x8d\x44\xa0\xcd\x68\x33\x60\x10\xb6\x7d\xe2\xc2\x5c\x70\x98\x0e\x1b\x0e\xe9\x36\x5c\x05\x2f\xd1\x20\xb8\xdb\x84\x86\xf1\xe4\x76\x0b\xe2\x8b\x81\x0f\xf3\x05\x59\x7f\x7f\x93\xac\x7f\xb0\x1e\xeb\x1f\x98\xac\xbf\xff\x90\xac\x7f\xb0\x61\xcc\x17\x35\x66\x74\xbf\xf5\x1d\xd5\x5c\x6b\x4c\x16\xbb\x5b\xc3\xba\xd1\x76\xfb\x42\xc3\xb4\xb8\xcf\x6d\x43\x59\x07\x1e\xa6\x97\x3c\x38\xe0\xaf\x7f\xd6\x09\x0e\xd3\x17\x1a\x66\x33\xa3\x70\x02\xc3\xd8\x44\xd4\x41\xd9\x41\x2f\x11\xb5\xdf\x89\x7b\xd0\x7c\x60\x54\x95\x16\x73\x83\x1e\x74\x83\x21\x74\xe3\x20\x30\x03\x46\x85\x7e\xc0\xa0\x0c\x8c\x8b\xa0\x00\x40\x68\x5c\x06\xbb\x81\x11\x7c\xcc\x96\xcc\xe4\x5a\xc7\x1e\x6c\xc2\x74\xf2\x90\xe6\x12\x0a\x8a\xeb\x98\x67\x29\x3d\x75\x93\xc9\x1f\xff\xf8\xfd\x9b\x9b\xb7\xdb\xb7\x8f\x1a\x6c\x5c\x47\x76\x7a\x44\x19\x0f\x4d\x79\xa9\x37\xbd\xdd\xf8\xe3\x57\xd0\xb9\x0e\xf5\xd5\xeb\x42\xf7\x8e\xf4\xed\x92\x9a\x2d\x26\x9e\x3e\x60\x76\xa2\x24\xc3\x46\x0a\xfb\x18\x65\x7d\x7c\x03\x1b\x5b\x5f\x9e\xe0\x55\xee\x57\x7d\xe0\xb8\x7c\x72\x93\xaf\x57\x15\xb4\xf2\x48\x5b\xc1\xf4\x03\x39\xa7\x80\x50\x94\xcf\x84\x9d\x41\xd6\x4c\xf1\x18\x5f\x9b\x05\x65\x23\xa4\xba\x61\x11\xb1\xc5\x96\x1a\x9d\xd7\x15\xd9\x66\x06\xd1\x6e\x64\x20\x04\x16\x90\xdc\xc0\xf4\xf8\xec\x93\xd7\x28\x3e\x8a\xe7\x8d\x10\xdc\x8d\x8e\x85\xc7\xe3\xf6\x1b\x4e\x23\x86\x77\xa3\x23\x7a\xb5\x9c\xc3\x05\x24\x20\xfb\xff\xd8\x7b\xd3\xe5\xb6\x91\x6c\x5d\xf4\xff\x7e\x0a\x5c\xec\x38\xfb\x76\x47\x11\x14\x47\x0d\x75\xce\x3d\xdb\xb6\x64\x97\xe5\xb6\x65\x95\x25\xdb\x55\xe5\xab\xd8\x01\x02\x29\x12\x16\x88\x64\x01\x20\x25\xfa\x57\xbf\xc3\xfe\x75\x5e\xe0\x3e\x58\x3f\xc9\x0d\xe4\x84\x1c\x81\x04\x08\xd9\x74\xb7\x2b\xa2\x2c\x89\x04\x72\x58\xb9\x72\xe5\xca\x35\x7c\xeb\x2c\xca\xee\x9a\x0d\xac\x78\xc3\x2a\xe0\xef\x91\x71\x30\x87\xda\x74\xa4\x9a\x48\x62\x5d\x5a\xd4\x1c\xe6\xf0\xba\x4c\x32\xba\x69\x16\x44\x6c\x08\x21\xd6\xa6\x4e\x6b\x2c\x7c\xc6\x30\x47\x21\xc2\xb1\x3c\xa3\x49\x84\xe3\xed\x8e\x2e\x19\xee\xd0\x7f\x54\xdd\x02\x61\xc0\xef\xb9\x56\x11\xff\xed\xf4\x7a\xbc\x58\x1e\x4a\x5a\x85\xbb\x18\x96\x17\x54\x0c\x7c\x8f\xd3\x5f\x62\xac\x7e\x1b\x55\x0b\x8d\xcf\x94\x39\xf7\x06\x1c\xdf\x51\x80\x7c\x29\xe0\x96\x05\xeb\x88\x01\xb6\xae\x65\xec\x85\xc6\x52\xd0\xb8\x04\xb3\xc6\x21\x39\x83\x0f\xb2\x03\x92\x60\x24\x19\xa2\x25\x44\x2f\xee\x25\x8e\x50\xb0\x8d\x0e\xd7\x59\x16\x55\x0b\x7f\x69\xa6\x76\x8a\x59\xc9\x91\xcb\x66\x1c\x1b\xdd\x73\xda\xe2\x02\xa8\x63\x25\x26\xb0\x46\x07\x34\x5e\xb2\x27\x9a\x3b\xb6\x66\x18\x3d\x37\xc4\x9a\xa8\x08\x58\x50\x95\x76\x20\xa7\xf4\x9b\x97\x55\x6f\x47\x57\xdd\x85\x06\x59\x67\x58\x41\x9d\x2d\x2a\x9a\x27\xef\x90\x5b\xa5\x03\x00\x1d\x13\x64\x8e\x00\x93\x83\x20\x67\xdc\xab\x1c\xae\x9c\x57\x88\xa2\x22\x64\x0d\xf7\x05\x8f\x55\x83\x7e\xb9\xf7\x93\xdc\xc9\xa1\x93\x15\xcf\xe4\x8b\x28\x73\x3e\xc3\xd9\x7f\x96\x0c\x55\x7c\x8e\x5f\xd5\xe2\xd4\x1c\xf3\xfa\x37\x79\xb4\x16\xaa\xc6\xc6\x9e\xf7\xcd\x68\xe8\xa7\xb9\x81\x88\xe5\x37\x15\x54\x2c\x1e\xd2\x92\xd1\x4f\x73\x6b\x3a\x92\x67\xeb\x08\x59\x5a\x1d\x74\x87\xab\x3e\xae\x4a\xad\x4e\x8d\x41\x90\x6e\x79\x00\x45\x1a\x46\x95\xc0\x9c\x5e\xff\xc1\x03\x08\x0e\xe0\x0a\x24\x25\x76\x86\x8a\xa6\x41\x61\x34\x76\x3b\xa0\x8b\xc3\xe1\x91\x8e\x66\x90\x46\x30\x8c\x02\x0f\xd7\x1f\xdc\xf3\xd3\x79\xf1\xeb\x9f\x5b\xff\xe0\xd5\x79\xb3\x7a\xe7\x16\xc1\x09\xac\x54\xfe\xb3\x26\x3a\xa8\xe6\xfd\xe7\xa8\x32\x51\x35\x36\x8f\xe6\xb5\x6b\x7a\xfc\x97\x5a\x2c\xfe\xa4\xb4\xc8\xe7\x69\xb4\x5c\x82\x90\xd8\xa3\x2d\x2b\xff\x17\xf7\xbb\xec\x59\x71\x5c\x4b\x53\x52\x82\x09\x2b\xac\xf3\x5d\x85\x67\x4a\xf6\xd0\x4b\x3f\x6d\x94\x88\xa9\x6a\xfa\x36\x36\x63\xb7\xcc\x4e\x40\xfd\x49\x8a\x3f\x6d\x4b\x29\x4d\xce\xbd\xd1\xd3\x46\xc6\xdb\x9a\x93\xdd\x1b\x3e\x56\x40\x68\xd2\x14\x1c\x50\x75\xb7\xb3\xc4\x47\xd6\xf0\xc2\x2b\x11\x9b\xff\xaa\x74\xed\x34\xe3\x55\xf9\xc5\x62\x25\x6e\x61\x1a\x80\x53\x12\x98\x13\xf2\x34\x54\xcb\xd8\x58\xb2\xae\x16\xb5\xa3\xe1\xae\x52\xd1\xb2\xb0\x25\xcd\xc6\x7e\x56\xe9\xe3\xd3\x74\x86\x71\x08\x9e\x5a\x61\x6c\x19\x9a\x78\x03\x90\xf7\xca\xfc\x96\xc1\x98\x3e\x62\xc6\x74\x72\xa6\x7d\x86\xb3\x4b\x72\xd2\xd7\x4e\x96\x1e\x7a\xf4\x48\x10\x32\xe5\x10\x18\x54\xdb\xb3\x4b\x38\x5a\x1e\xf7\xf8\xda\xf7\x83\x2b\xf2\x3f\x7f\x9e\x3d\xbc\xcd\x7e\x1c\x5c\x36\xd6\xe4\xc6\x77\x54\xca\x06\xf5\x97\x93\xea\x0a\x6e\x0a\x70\x63\x94\x79\x38\x1a\x8a\x78\x88\x2b\xaa\xba\xf5\x3e\xb9\x48\x0a\xe2\xda\xa8\xbc\xe9\xe8\x16\x65\xcb\x66\x20\xa7\x34\xae\x47\x5f\xe4\xe6\xf6\xa2\x68\x94\x54\x5c\xad\x9a\x9f\xf5\x39\x60\xd4\x09\xe4\x64\x82\xaf\xaf\x12\x9c\xa6\x8d\xa0\x1e\xca\x53\x95\xac\x3f\x83\xf9\x73\xaf\x56\x20\xb0\x86\x99\xb5\x27\x5d\xdb\x33\x93\x8f\x4c\xb2\x3d\x87\x8a\xdb\xdb\x3a\x2d\xd4\x85\x4b\x82\x1f\x20\x1c\x4b\x38\xac\xc0\xf6\x74\xfa\x06\x47\x8b\x32\x7e\xcd\x49\xb3\x83\xe9\x92\x2c\xf9\xe3\x9c\x2b\x19\x48\x37\x51\xb0\xf7\xd6\xca\xcd\x41\x7e\xf0\xe5\xfd\xf3\x3f\xfe\xc9\x8f\x15\x7b\xd5\x54\x2b\xda\x6c\xde\x3c\xf3\xb3\x77\x72\x85\xe0\x5d\x15\x63\xeb\x17\x3b\x50\x75\x5f\x6b\xa0\xfe\x7f\x28\xcb\x8f\xaf\x2c\xb7\x94\x5e\x44\xbe\x3c\x92\xf0\xda\x66\x33\x3f\x0f\x16\xfb\x2e\xbd\xee\xb7\xaf\x0f\xdf\xbe\x7e\x0f\x7e\x48\xaf\x5d\xa5\xd7\xd7\xbd\xda\xbb\x79\xba\x36\xc3\xa6\xfe\xb8\xc6\x7f\xdf\x92\x89\x08\x8f\x47\x13\x4d\xdf\x41\x36\xef\x75\x9e\xfc\x74\x1a\xfe\x74\xf6\x43\x30\xed\x83\x5a\xf5\x43\xb8\xfd\x10\x6e\xdd\x09\xb7\xc7\xc8\x37\x46\x61\x38\xfb\x2d\xd2\x36\x4f\xff\x0c\x57\xf7\x43\x39\x5a\xd6\xcd\xd5\x00\x54\x97\x0f\x3f\xa5\xd5\x85\xa3\xcc\x5b\xa5\x11\xcb\x05\xa9\x81\xb9\x23\xf1\xdb\x62\x4c\x43\x14\x7e\x8c\xf2\x05\x07\x49\x64\x93\x6d\x6b\x8a\x87\xa9\x64\xb7\x2a\x14\xc1\x3a\x4c\x26\x19\x18\x5c\x47\x21\xf3\xd8\xcc\xf0\x49\x3a\x17\xb4\x08\xa4\x22\xa3\x4a\xd1\x9c\x65\xa5\x0e\xbe\xcd\xc8\x48\xb8\xce\x58\x8d\x2c\xa9\xae\x5a\x55\x3d\xcc\x0a\x8e\xd1\x57\x9b\xb2\x0f\xc3\xa9\xa2\xac\xae\x6a\x54\x9d\x87\xbf\x7a\xb0\x52\x07\x61\x94\xad\x62\x7f\x7b\x2d\x81\xab\xed\xd6\xa8\x0e\x0d\xcd\xb6\x45\x57\x07\x7d\xc9\x02\x1b\x4f\xcb\x50\x64\x21\x2a\xaa\xee\x79\x65\x59\xcb\xf7\x3d\x4f\x0c\xa2\xb0\x9f\xb5\x29\x73\xd8\x66\x46\x95\xc9\xc2\x13\x85\x77\x6d\x73\x85\x4b\x09\x36\xad\xcf\x11\xe6\x52\x88\xec\x53\x84\x29\x51\x1a\xa5\x06\xeb\x53\x82\xf5\x3b\xae\x32\x2e\xc8\x22\x8b\xb5\xdd\x2c\x6f\x2a\xc3\x67\xd0\xe1\x4d\x51\x7a\xf9\xe0\x54\xea\x2d\xc4\x48\xfc\x7f\x96\x45\x67\x96\x30\xc9\x17\xb8\xf4\x4c\xe3\xd4\x9b\xe6\x47\x7c\x0a\xef\x3b\x3f\xda\xb3\xf5\x2c\xf1\x37\xfb\x7e\xba\xbf\x39\x84\x17\x83\x93\xc9\x17\x63\x2e\x4c\xee\xcf\x32\x07\xd7\x92\x2c\xa6\x63\xd8\xc8\xee\x5a\x45\xe1\x74\xe4\x34\x49\x73\x79\x96\x41\x65\x68\x06\xce\x6d\xc4\xa2\xbf\x74\x0d\x78\xf7\x0b\x90\x18\x95\x87\xa1\x90\x16\xd9\x93\x9e\x71\xd8\x9f\x85\xfc\x46\x16\xaf\xfa\x90\x8c\xb7\x1b\x90\x6e\x22\x70\x6f\xe1\xfc\xd1\xe3\x11\x75\x49\x07\x61\xde\x25\x4c\xa1\x6e\xf2\xf5\x33\x3b\x63\xef\xef\xdf\xdc\x08\xc2\x5c\xd6\x6e\x66\x04\xe8\x2e\x6b\x36\x2f\x57\x0c\x92\xce\xd6\x2b\xb4\x81\x4b\x1b\xb9\x52\x6f\xad\x86\x0a\x9d\xac\x71\xd9\x79\x2b\x52\x38\x5c\xa1\x45\x9b\xbc\x9d\x1a\x7d\x4e\x08\xa9\x7e\xb4\xd5\x17\xd3\x76\x35\xe8\xa9\x51\x68\x48\x84\xae\xa5\x87\x0e\xf9\x7c\x6f\xb8\x1e\x14\xa2\x9d\x4f\x57\x6e\xba\xda\xcf\xcb\x06\x5a\xf3\x3e\xba\xf4\xa0\xbb\xce\x3b\x90\x84\x20\xc5\xb6\x94\xec\xda\x9f\x7d\x7d\xf6\xc7\x75\xbd\x5b\xb3\x3e\x19\x7a\x37\x6c\x5f\xa1\xe3\x88\xb5\xbc\x24\xfd\x86\xa8\x36\x85\x72\x10\xb5\x41\x53\xc4\x47\x70\xe7\x8a\x0a\xab\x4b\xbc\xdf\x9a\xca\xe4\xcb\x32\x80\x9b\x42\x19\xb4\xc9\xda\x45\x69\xb8\x0e\xc5\x64\xb2\xc1\xf3\x25\x47\x85\xf3\xef\xe2\x85\xa8\xac\xda\x9c\xac\x0b\x92\x68\xee\x92\x7c\x98\x0a\x9f\x4d\xb2\xf2\xa3\xd4\xa9\xd0\xed\x95\x97\xe5\x18\x97\x2b\x52\xfc\xad\x1e\x03\x9b\x15\x0c\x27\xd3\x55\x3a\x45\x60\x4e\x21\x0f\xb2\xa8\x4e\x30\xa3\xb5\xe6\x58\x87\x15\x20\x88\x86\x80\x9e\xdd\xe6\x8b\x2c\x0c\x39\x79\xb9\x66\xca\xa4\x28\x78\xe8\xe7\xc2\xac\x34\x19\x52\xf5\x85\xb7\x6d\xe6\xd9\xa0\x90\xf4\x94\x2f\xd9\x7a\x8a\xd5\x55\x0a\xb7\xc5\x5d\x53\xc7\x28\x95\x72\x9d\x38\xd4\x1f\xa0\xc6\x12\x8b\xc3\x97\xad\x45\x34\x92\x58\x7f\x83\xe5\x2b\x4b\x70\x55\xa8\xbb\x4d\x07\x11\x6b\x52\xdf\xa2\x1a\xc4\xcf\xfc\xe0\x6e\x9e\xc2\x35\xc2\x2f\xb0\x4b\x18\xe1\xf2\x99\xe8\x98\x75\xb5\xa9\xc5\x2a\xd4\x5c\xcc\x1d\x2d\x4c\x8e\x93\x99\xc9\x17\x88\xe4\x38\x15\xe5\x1d\xd8\x80\x34\xa7\x7b\x5c\xc9\x47\x51\xbe\x36\x26\xa5\xa4\xf8\xc9\x1c\xe2\xc4\x14\xb2\x36\xb4\x52\xb5\x50\xae\x1a\x3f\x7a\x0d\x4d\x69\x2a\x87\xdc\x1a\xb3\x67\x1b\xe5\xfb\x34\x0c\x4c\x64\xd5\xdb\x59\x90\x22\x8f\x3b\x3a\xe1\x2b\x46\xbb\xf4\x23\x1e\x8a\xd4\xfd\x1d\xae\x9d\x10\x26\xff\xf8\xfb\xff\xc9\x71\x01\x97\x15\x48\x97\x51\x86\xc4\x26\xa3\x0d\x79\xb3\x2e\x38\xd1\x21\x44\xb7\xb5\x67\x24\x15\x75\x91\xcb\x1d\x12\x46\xb7\xb7\x5a\xe5\x64\xc8\x0f\x67\x24\xd1\x88\x09\x4d\x16\xba\x79\x1b\x15\x67\x09\x82\x6f\x27\x2f\x08\xf3\x51\xaa\x08\x93\x42\xb6\x67\xa8\x7b\x36\x56\x51\xd0\x06\x0b\x3f\x99\x03\xd1\xa2\x26\x19\x5d\x51\x11\xe2\x53\xf4\x9c\x6b\x7c\x4f\x23\xb5\x4c\xc9\x60\xa2\x89\x4d\x98\x16\x9a\x6e\xf4\x05\x78\x47\xce\xc2\xcf\xbc\x1c\x3c\xe4\x5e\x00\x92\x1c\xa4\xa2\xec\x46\xa6\xa7\x62\x00\x32\x48\x7d\xc3\xbc\x29\xa9\x90\x35\x45\x50\xb4\x2b\xa6\xc9\xd0\x2f\x42\x3f\xbd\x33\x9c\x2c\x58\xe8\x9d\xf0\x58\x37\xc5\x6a\xf4\xdc\x27\x1b\x90\xce\x60\x66\x90\xa9\x8c\x63\xca\x6f\xf0\xc3\x1a\xcf\x58\x95\x6e\x58\xfc\xca\x14\x3f\xbe\x72\x32\x83\x90\xc1\x88\xb8\xbe\x3e\xdb\x4b\xa9\x9d\xcc\x70\x68\xca\x92\x33\xa4\xa0\x32\x1e\x70\x53\xe5\x91\xcc\xf8\xb1\xb4\xc7\xcc\xcb\xf2\x14\xf8\x7b\xef\xa0\x7f\x97\xac\xe7\x87\x83\xe4\x9d\x50\xf9\x75\x24\xc6\x64\x6b\xe2\xb3\xfd\x24\x81\xb9\x9f\x83\x90\x1a\x14\x54\xa8\x30\xca\x53\x7d\x04\x8d\xab\xad\xb8\xbc\x80\xf7\x67\x48\x5d\x51\xec\xef\xe5\xdd\x89\xe4\x89\x2f\x01\x52\x58\x13\x98\x57\x02\x63\x4b\xce\x9a\xa1\x95\xb6\x63\xbe\xfa\x19\xee\x3a\xa6\xd1\x41\xb4\x6a\x95\xfb\x91\x57\x42\xca\x91\xb1\x2d\xd9\x73\x9f\x2c\xfc\x24\x8c\x01\x09\x4b\x50\xa7\xa1\xdd\x9a\xd8\xb1\x6c\xb9\x43\x87\xdc\xdc\xdd\x14\x04\x30\x0d\xd5\x7e\xe9\xce\xd5\x83\x36\xf1\xd7\x37\xa4\x70\xe2\xad\x58\x8e\xb1\xe5\x6e\xa4\xbb\xa6\xdb\x5d\x99\xc1\x04\xa1\xe8\x81\x74\xdf\x77\xe3\xe9\xdb\xd7\xaf\x5f\xdc\xaf\xdf\x55\x87\xcb\x60\xf0\xb8\x42\x65\x5c\xb1\xab\x1b\xf3\x4c\x64\x30\xb9\xca\x53\x5e\xaf\xe2\xf2\xfc\x96\x10\x55\xd6\xcf\x17\x60\x59\xfc\xcc\x82\x14\x80\xe4\x1d\xf0\x43\x90\x52\xe4\xe8\xdc\x9f\x5d\x61\xe1\x5a\xb0\xf4\x05\xba\xe3\x65\xa8\x8e\x83\x1f\xbe\x4d\x62\x92\x12\xe8\x6f\xfc\x2c\x48\xa3\x55\x4e\x44\x75\xe4\x15\xdf\x7b\xb0\x78\x00\x97\x7a\xe2\x6d\xb0\xa3\x52\x1b\xbc\x51\xcf\x11\x57\x3c\x2b\xa2\xcd\xd6\x2b\xae\x66\xcb\x08\xb1\x62\xbb\xcc\xa9\x72\xc9\x3b\x65\xa5\x38\xba\x05\xc1\x36\x88\x89\x63\xee\x7b\x08\x57\x38\x1f\x9d\x4e\xee\x5e\x5f\x8e\x75\x66\x82\xd2\xc3\xac\x99\x18\xe7\x71\xce\xfd\xec\x0e\x31\x04\x79\x88\x21\x39\x72\xcf\x08\x96\x2a\xf1\xab\x82\x11\xb2\x05\x08\xcd\xce\x6a\x45\xdb\x41\x3d\x1a\x6f\xcc\xe5\x73\x09\x2d\xe3\x63\x74\x8f\x16\x2d\x5d\xe5\xca\x29\xe3\x58\xa6\xc2\x62\xb3\x1b\x5f\x98\xae\xfc\xbd\x8f\xe9\xa2\x03\xbf\x29\x7b\xe5\x9d\x72\xbc\xf0\xe6\xc7\x55\x5e\x71\xec\xaa\xf7\xca\x0b\x63\xca\x80\x35\x04\x10\xe9\x6f\x4d\x75\x8d\x4a\xfa\x6d\x95\x19\x98\x2b\xd6\x41\x59\x46\x63\x92\xe0\x23\x2a\xd8\x73\xaf\x45\x2c\x4f\xd2\xdb\x35\x65\x87\x9a\x2a\x14\xca\xe1\x2d\x97\x37\xa4\xf6\x47\x7a\x90\x05\xfe\x2a\xca\xdb\x14\x30\xd4\x6c\x98\xc7\x94\x34\xfb\x2e\x65\x82\xfc\xf0\xf4\xf2\x4b\x28\xaa\x91\x43\x6d\x6a\x1f\x9b\xd9\xe5\xc2\xc7\x26\x98\x12\xdc\x6c\xa8\x46\x21\x54\x5f\x84\xcc\xba\x60\x63\x40\x42\x87\x82\x12\xbe\xa6\x03\xa4\xfb\x82\xab\x5d\xce\x76\x2d\x16\x72\x57\xb4\x00\x02\x32\xdd\xcc\xd7\x69\xb9\xcd\x2b\x6c\xe8\x56\xa3\x44\x37\x3c\x99\x0b\xc4\x51\xab\xc9\x84\x9a\x8d\xe7\xad\x30\x99\x35\x42\x72\x24\xd6\xfe\x95\xeb\x00\x6b\xd6\xaa\x21\x1e\xb0\xf1\x90\x41\x63\x52\xaa\x08\x3c\x65\xfe\x0b\x11\xc1\xd7\x71\x95\x48\x96\x61\x89\x61\xc8\x84\xa7\xc9\xae\x62\x73\x70\x28\x6d\xea\x73\x25\x6b\x14\xea\xde\x27\x15\xf5\x7d\xd0\x73\xb3\xcd\xbc\xbc\x2c\x84\xd1\x26\x0a\x41\xea\xac\x52\x80\xb0\x58\x8c\xe6\x20\xfe\xae\x51\x16\xc8\x79\x18\xba\x3d\x77\x40\xff\xda\x0a\x7f\x3d\x8c\x84\xef\x8a\xbf\x86\x83\xc1\xff\x28\x7b\x30\xa6\x7f\x56\x95\xc4\xd6\x8f\x1e\x66\x79\x96\x43\xb9\xe2\xc6\xbe\x8c\x5e\xfa\xd8\x6e\xa3\x30\x41\xae\xdd\x2c\xe2\xf9\x48\x1d\xde\x16\x7b\x08\x23\x87\x32\xa1\x72\x4d\xde\xb6\xdb\x48\xa6\x08\x2c\xaa\x1f\xe9\xef\x7d\x34\x4c\xb8\xb4\xc4\xec\x30\x58\x26\xee\x76\x1f\x31\xd5\x88\x84\xe1\x93\xc8\xeb\x31\xd5\x3c\x0c\x17\x84\xb1\x30\x1d\x71\xab\x99\x96\xdb\xa4\xa1\x98\x4d\x56\x2e\x92\x4c\x24\xe2\x8f\xc4\x4b\x02\xb9\x8a\x13\x0a\xc0\xd2\x5f\x8c\x63\x78\x0f\xd2\x00\x37\xa1\xbb\x2c\xec\xa4\x64\x74\xac\x60\x24\xdf\x89\x6e\x71\xf0\xe1\xee\x2e\xba\x5b\x3c\x15\x6e\x30\x43\xb4\x85\xb1\xe1\x1a\x97\x57\x91\xe2\x25\xb1\xd2\x81\x0d\xd3\xbc\xf3\x0b\x26\xe7\x49\x86\xcc\xf2\x5c\xcc\x30\x7a\x6a\x28\xf8\x1f\x90\x83\x1f\xb7\x26\x3f\xc8\x2b\xfa\xeb\x55\xe8\xe7\xe0\x2c\x5a\x82\x44\xb2\x83\x19\x02\xc3\xa8\x38\x15\xca\x9a\xc5\x20\x9c\x6d\xb9\xda\x66\x0c\xc7\xf0\x3c\x64\xf7\x25\xfa\x42\x08\x8a\x9b\xf7\x4c\xf3\x06\xfe\x06\xd9\x04\xb8\xf7\xf4\x21\x68\x0c\x5b\x62\x38\x2d\x0e\xbe\xaa\x8e\x45\xab\x3d\x85\x57\x34\x2a\xff\x68\x18\xfa\x96\xeb\x06\x28\x09\x5a\xee\x71\xfd\xe5\xcd\xf4\x68\xcd\x75\xe7\x37\xcf\x7f\x88\x32\x07\xb1\x66\xe6\xa4\x7e\x32\x07\xce\x6d\x0a\x97\x52\x9b\x0f\xef\xb0\xdf\xc1\xbd\x8d\xd2\x2c\x7f\x4b\x6c\x7b\x54\xf4\xe4\xd0\xf4\x78\xec\x2b\x4f\xf7\xb8\x13\xc8\x4f\x42\xe7\x77\xbb\x11\x6c\x9b\x8d\x60\x5b\x31\x82\x7e\xb3\x1b\x9c\xcb\x9d\xf9\x5b\x6f\x9e\x46\x61\xb1\xbd\x32\x87\xfd\x46\x79\x38\x4f\xfd\x24\xc3\x26\x7a\x12\xab\x5e\x7c\x50\x6c\xe2\xbf\x94\x06\x80\xed\xd3\x87\x28\x7b\x7b\x7b\x9b\x01\x14\x6b\xed\xf6\x9c\xc1\x5f\x5d\x6e\xf1\x8d\x7e\x91\x14\xf8\xa1\x52\x0f\x17\x75\x7d\x5c\x1c\x18\x1a\x2f\xe9\xd3\x14\xf8\xe8\x64\x99\x52\xc1\x80\xb2\x2d\xa2\x42\x97\xcc\x0e\xfc\xe2\xdb\xde\x80\x3d\x1d\xac\x53\x14\x0d\xf9\x70\x15\xf8\x08\x11\x76\x4b\x7f\x79\xb8\xc4\x70\xd1\x5b\xf2\x13\xbb\xbe\x7a\xee\x02\x50\x3f\x37\x52\x6c\xfc\xb4\x9c\x25\x69\x84\xbb\xe3\x6f\x95\x4f\x70\xb3\xfc\x23\xca\x07\x22\xad\xd8\x8b\xc2\xc7\x37\x0c\x35\xcb\x26\x18\x6d\x2e\x38\x2f\x17\x51\x18\x02\xe4\x74\x49\xd7\xa0\x5c\xe5\x07\xcc\x92\xc5\x3f\x16\x6b\x3b\xe8\x71\xf6\x9d\x07\x69\x79\x0d\x6b\xdb\x78\x48\xdb\x46\x43\x6a\xc3\x6e\xfc\x90\x52\x6a\xba\x47\x7d\x2f\xe0\x06\xa4\x5e\xee\xa7\x73\x90\x33\x0d\x55\x50\x50\xd9\x1f\x53\xc6\x1d\x82\xb0\xdb\xca\x2b\x86\x1f\x25\x0c\x24\x3e\xab\xac\xae\xb1\x9c\x68\x93\xad\x42\x36\xca\x44\xbb\x51\x3e\x3c\xc5\x2e\x1c\x1c\x52\xe7\xbe\x14\xff\xbc\x2e\x1d\xe1\xfa\x9d\xb4\xf1\x7c\xfe\x85\x72\x4b\xe5\xd1\x12\x64\x20\x8d\xd0\xcd\x1e\xbb\x08\x90\xa5\x19\x6f\x2b\x02\xc2\x5e\xee\x22\xac\xc0\x96\xac\xf4\x02\xbf\xc1\x73\x7e\xfd\x26\xd2\x90\x4f\x3b\xe8\x85\x69\xd0\xa6\x71\xa2\x5a\x6d\x74\x79\xb9\x53\x7f\xab\x0e\x53\xdd\xeb\xca\xd6\x0e\xfc\x64\xe3\x67\x9c\xae\x40\x3a\xa8\x7e\x84\x74\x5e\x31\x2d\x1a\xb5\xc0\x4d\x88\xc5\x79\x67\xf9\x16\x4d\x08\x97\xf3\xe1\x1c\x78\xb4\x82\x8e\x2f\x18\x60\xd8\x29\x8f\x9b\xbc\x42\x6f\x73\x9f\x73\xaf\xd5\x4b\x21\x19\x26\xf4\x3f\xfc\x3c\x47\xbe\x84\x27\x02\x93\xfc\x47\xa1\x12\xd1\x0a\xcc\x9c\xae\x1d\x46\xa1\x17\x61\x5d\xad\x87\xfe\xc0\xba\x16\x22\x49\x12\xc2\x7b\x2f\x05\x19\xf6\x54\x20\xad\x9c\xe2\x8a\x12\xcf\x31\x53\x75\x1b\xeb\xdc\x49\x23\x75\xfb\xdf\x6c\xd5\x6d\xb1\xbe\xca\x7e\xab\xdc\xf7\xe7\x7f\x4b\x4f\x46\xf7\xdb\x86\x5e\xe1\x10\x04\x30\xf5\x73\x10\x5e\xe1\x0a\x1b\xe6\x3b\xe3\x71\x6f\x24\x5c\x40\x29\xdf\x22\xdb\x5c\x0f\xe3\xd7\xf7\x68\xe9\x2c\x12\x1d\xd1\x73\x83\x98\x86\x2d\x4c\xd1\xcd\x9d\x27\xe9\x01\xfb\x0d\x1b\xf8\xb8\xcd\xc0\xde\x87\x09\xfb\xe5\x34\xe6\x22\x20\xc4\x22\x96\x0a\x96\xb4\x14\xa2\x64\xfe\xfa\x48\xd7\x1e\x9d\x3b\xf2\x7e\xd1\xbd\xa1\x69\x83\xdd\x4f\x68\xdd\x59\xa9\x2c\x1e\xff\xb7\xd4\xb6\x44\xe5\x47\x9a\x00\xda\x97\x5f\x65\x06\x4c\xd4\x19\x97\x18\x33\x88\xb2\xc4\xda\xe1\xdb\x0c\x43\xc4\x4a\x6e\x4a\x0d\x55\x0a\x0a\x3e\x76\xc2\xc6\x1a\x78\x64\xbd\x11\xc1\x28\xc9\xb8\x28\x18\x54\xbb\xc4\xed\xb9\xcb\x75\xde\x06\xfc\x4b\x24\x6c\xc7\x86\x85\xca\x35\xdb\x6f\xc1\x37\xfe\xe3\x8f\x7c\x7a\x2b\x56\x9f\xb7\x8e\xd3\x2a\x2d\xdd\xe2\xa4\x39\x43\x37\x72\x87\xae\xe3\xf8\x19\x2e\x58\x84\x2d\xdd\x7c\x09\x23\xe3\x9d\xfd\xb8\x37\x6c\x18\x7e\xa5\x63\x38\xee\xa4\xdc\x85\x61\xa4\x55\xfd\x3a\xfc\x83\xc5\xfa\x7e\xf3\xcf\xfb\xdf\xef\x82\xa7\xa7\xaf\x5f\x18\x83\xf2\xc5\xe9\x78\x28\x07\x34\x51\x9d\x00\xfa\x25\xd7\x79\x3c\x85\x40\xce\xe1\x21\x57\xc6\x41\x89\xe6\x2c\x88\xec\x07\xb9\x53\xc6\x6b\x3b\xe5\x70\x70\xc0\x26\xe5\x38\xcc\xb0\x42\xdc\x36\xae\x69\xce\x22\xe2\x0b\xc6\x8d\x92\x4d\x94\x45\x65\x21\x44\x7d\x58\x28\x2a\x74\x21\x61\x7d\x22\x9b\x33\xb7\x27\xb8\x8d\xc5\x4e\x11\x72\x44\xf3\x1f\x95\x75\x9a\xe9\x7b\x58\xa0\xcb\x07\x60\x45\x46\x39\x5f\x27\x5d\x4d\x27\x37\x6c\x1b\x2a\x91\x59\xec\x22\x92\xc1\xb7\xa4\x2c\x5e\x47\x3b\xa9\x60\x88\xee\x77\xd2\xca\x9f\x47\x09\x09\x32\xdf\xef\xbd\xf3\xfc\xf9\xdb\xe4\xd9\xe5\x30\x30\xc8\x5e\x56\xb5\x8d\xaf\x85\xc5\x09\xe1\x62\xb7\x7c\xd2\xe0\x91\x23\xdb\x19\xba\xd2\x81\x8d\xdb\x73\x13\x1c\x9a\x1f\xfb\xf8\x43\x7f\x0e\x5e\x47\xc9\x5d\x41\x11\x1e\x62\x93\x64\xc8\x17\xbf\x67\xd8\x0d\x90\xe6\xd9\x53\x64\xf7\x4f\x42\xfc\x4b\x8c\x2a\xf7\xf3\xba\x68\x49\x6a\x46\x7a\x90\x0a\x77\x63\x90\xe5\xac\x5e\x29\xee\xdc\xed\xb9\x6c\x0f\xf5\xca\xc1\xbe\x28\x7e\x3a\xf8\x81\xfa\x4a\x27\x04\xc8\x85\xb9\xcf\xb5\x6a\x54\x07\xa3\x23\x24\xbc\x4c\xc1\x26\x82\xeb\x8c\x8c\x4f\x17\xbf\x4f\x46\x24\x6b\x8b\xdf\x7a\x02\x64\xf1\x2f\xc0\x43\x2e\x0d\xfe\x68\xf7\xc1\x33\xa7\xb9\x9f\x11\x9c\xd6\x4a\xb5\xb6\x83\xe9\x10\x26\x7e\xed\x33\x5e\xd1\x8c\xa1\xe3\xf1\x73\x2f\xe1\x8d\x23\x7d\x68\x68\xa9\xdc\xc6\x74\x2b\x71\x9f\x91\x3d\xc5\xbf\x19\x65\xb9\x5b\x65\x5e\xa8\xd7\x6f\xb4\xfa\x33\x57\x74\x24\x04\x01\xaa\x83\x1a\xb4\x91\xdf\xe5\xe2\x3d\xa6\xc4\x16\x18\x63\xbf\x85\x77\x38\x9f\xfe\xfa\xfc\xe3\xaf\x73\x83\xf0\x2e\xf5\x04\x41\x68\xb3\xe8\xbb\x4f\x44\x75\xa1\x66\x30\x1a\x29\x88\x54\x1a\x21\xe9\xa6\xe4\x2d\x72\x82\x63\x0c\x25\x56\xae\x42\x73\x02\x68\xb0\x9f\xf9\x6d\x6e\x85\x9e\xa4\x55\xbf\x4d\xd1\x75\xb5\x1c\x2a\x95\x05\xd8\x41\x25\xd7\x32\x4b\xf7\x3c\x49\x2a\xe6\xed\x37\x0f\x1e\xbc\x0b\xff\x58\xa4\xdb\x23\x41\xf9\x16\xd4\x82\xa1\xc9\xd2\xc4\xaa\x3b\xf2\xe7\x39\x9a\xf4\x01\xfa\x57\xb4\x29\x11\x46\xd0\x3e\x28\x5b\x26\x68\x3c\x49\x85\x8d\xec\x46\x6d\x8b\x8e\x47\xf4\x55\x21\x2e\xc6\x96\xe9\xea\x4a\xb5\x96\xd5\x68\x35\xf2\xb5\x4a\xfb\xdd\xd9\xb2\x4a\xa7\xf7\x48\xfc\x59\x52\x6d\xbf\xf9\xf4\xe8\x72\xf5\xfa\xf0\xfa\xba\x26\xca\x5f\x91\x68\x1c\xf3\x4a\x30\x7f\x66\x66\x58\x49\x2e\x08\x02\xd5\xa6\x65\x85\x6a\xd8\x4d\xdd\x6d\x54\x2b\xff\x74\x1c\xd4\x9d\xbc\x13\x16\xfa\xb1\xf8\x88\xdf\xc9\xfb\xcd\x4a\x1f\xdf\x8c\x46\xc9\xfc\xd9\xac\xa1\xa1\x1e\x0b\x25\xe5\xda\x4c\xbe\xbd\x03\x5b\xcd\xed\x6a\xcc\xc0\xf4\x58\xd0\x99\x60\xf1\xec\x8d\x84\xbc\x22\x54\x4f\x95\x56\x9f\x6f\x68\xfa\x6c\xcd\x17\xe5\xc2\x3d\x2e\x6b\x7c\x0f\xa6\xa8\xc1\xf1\xb9\x1f\xbe\x7b\x76\xa0\xe0\x54\xaa\x45\x46\x2c\xad\x4d\x95\xc7\xc3\x8e\x6b\xd6\xbd\xf1\x03\xa2\xdc\x7b\x2f\x5b\x45\x49\xb2\xff\xfa\xf3\x43\xf8\x2e\xbe\xfc\x13\x1e\x6b\x82\xdc\x38\xa3\x9e\x34\x29\xc9\xb0\xbc\xf2\xd7\x19\xb1\x2a\xb3\x5f\x6f\x84\xf0\x36\xd9\x0c\x87\x4c\x73\xe4\x59\xdc\x8c\x85\x29\x8d\x37\x67\x06\xeb\x19\xf0\xfc\x24\xf4\x62\x38\x87\x9a\x60\x60\xed\x0b\x76\x41\xfb\x59\x14\x02\xa7\xf8\xc7\x1b\x9a\x63\x80\x2b\xde\x1a\xb5\x7a\x6b\xdc\xea\xad\x89\xe9\x2d\x73\x84\x15\x17\x81\x0c\xe7\x10\x19\x82\x31\xe4\xa0\x91\x38\x42\xe2\x0c\xe1\x7e\xf4\x6e\xe2\x5a\x24\xb3\xb6\xc9\x97\xc1\x95\x38\x91\x61\xd8\x63\x9e\x27\x52\xc8\xb3\xe1\x7e\x17\x19\xb7\xd3\x9d\xbe\x5c\xc7\x79\xe4\x65\x20\x06\x41\xee\x85\x29\x5c\x85\xf0\x7e\xef\x8d\x9d\x2f\xd7\x57\xcb\x77\xcf\x97\xaf\xab\x75\xc0\x05\x4c\xa3\x2f\x05\x67\xc4\x97\x30\x8b\x4a\xa4\x10\xe2\xc6\x7e\xc2\xf9\xb1\x49\xac\x8a\x72\xda\x4b\xc5\xd9\xcd\x5f\xf3\x61\xe0\x56\xce\xeb\xa1\xea\xfa\x0d\xfc\x55\xbe\x4e\x35\x96\xa3\x8a\x57\x6d\xba\x17\x9d\xad\x36\xf8\xf0\xc3\xde\x27\xf7\x3a\x8d\xe6\x73\x80\x73\x61\x49\xa8\x30\x65\x0f\x2f\xa7\xdf\x51\xf1\x38\xb9\xc1\x9a\xcf\x7a\xa5\x25\xa2\x0b\x57\x20\x79\x9b\x3c\x4d\x53\x78\x7f\x86\xf9\x0b\xa3\xd5\x6b\xe6\x59\x6b\x4c\xe0\x77\xbf\x3c\x22\x62\xe7\xb8\xd1\xc5\xcf\x82\x18\x41\xa4\x9f\x63\x19\xef\xc5\x9c\x13\xc3\x20\x31\x64\x63\x89\x21\x78\x0c\x6f\x1e\xcc\x5e\xaa\x79\x5d\x10\x7f\x4a\x39\xb9\x58\x03\xfc\x23\x25\x68\x54\xf7\xa3\xbc\x55\xe5\xd7\xb4\x88\x5d\x1d\x9a\x69\x5b\x48\x2e\x07\xc9\x02\x6f\x05\xef\x41\x4a\xa5\x06\x01\x4b\xc5\x82\x4d\x1f\x7b\xa7\xa2\xa3\x89\xcc\x76\x4a\x3d\x79\x1a\x66\x63\x79\xda\xd5\xfc\x21\x2d\x0a\xf7\x96\x0e\x5b\x8e\x20\x8c\x4e\x7a\x6e\x0a\x63\x40\x1c\x12\xa4\x9e\x7c\x7d\x74\xb9\x15\x2b\xb9\x62\x96\xd8\x91\x26\x36\x42\x1c\xa8\x0c\x01\x51\xdc\x24\x94\x1c\x11\xf3\x16\x80\x2b\x96\xd3\x37\x41\x99\xe8\xf4\xfe\xc0\x02\x2d\x61\x52\xb1\x45\xf3\xd4\xdf\x80\x34\x03\xaf\xa3\x2c\x77\xe9\x2d\xa5\x3c\x19\x6b\xd2\x94\xd8\xb6\xab\xc9\x21\x73\xa3\x64\xb5\xce\x35\x83\x24\x7a\xca\xb4\xe7\x06\x0b\x10\xdc\x21\x95\x4a\xaa\xc0\x3d\xe2\x6e\x57\xca\x96\xb8\x11\xab\x19\xd2\x65\xe5\x88\x82\xab\x26\x52\x38\x1c\x1d\x05\x70\xe0\x8d\x3a\x77\xe4\x98\x45\xc3\xa2\x1c\x62\x4c\xa9\x12\x77\xed\x48\x27\x3d\x94\x47\x2d\x52\xb3\xc4\x9c\xa4\x9e\xc4\xcf\x56\xd0\x3d\x94\xe5\xbb\x61\x6e\x85\x01\x38\x44\x0f\xc6\x91\x60\xb9\xca\xb7\x46\xae\xb8\x80\x0e\xe1\x7d\xb3\xf4\xaa\x9a\x24\x25\x83\xc1\x92\x32\x64\x85\x1e\xc2\x90\x67\x04\xaa\xa3\xcd\xfc\x2c\x0a\x38\x8d\xc7\x14\x1d\x04\x13\x86\x28\xad\x47\xf3\x48\x82\x78\x1d\xa2\x1c\xaf\x26\x3a\x9d\x56\xef\xea\x54\xb3\x2b\x75\xdc\x7d\x57\xe7\xa6\x67\xbf\xad\xb2\x93\x97\x4b\xf9\xb2\x2d\x24\x4f\x72\xd3\x21\x5b\xfc\x61\x19\xa3\x18\xdf\x45\x9e\xaf\x7e\x3e\x38\xb8\xbf\xbf\xef\xdf\x8f\xfb\x30\x9d\x1f\x8c\x06\x83\xc1\x01\x0e\x8c\x35\x7c\x89\xde\x3d\xa0\x2d\x6d\x22\x70\xff\x0c\x22\x59\xe9\x0c\x9c\xd1\xe0\xb0\x3f\x1e\x3a\x87\x83\xfe\xe0\x48\x7f\xdb\x67\x31\xf8\xfa\xf4\x20\xdd\x77\xe5\xb7\x2b\x1f\x87\x43\x23\x8c\x34\xb7\xe7\xbe\x39\x3a\xee\x4f\x4e\x7a\xa3\x61\xff\x78\xfc\x61\x72\xd8\x1f\x1c\x2d\xbc\x69\xff\x64\xe3\x8d\x47\x8b\xe3\xfe\xe0\xf0\xf5\xc9\xa8\x7f\x74\xd2\x1b\x1f\xf7\xc7\x27\x1f\x86\x93\xfe\x70\x51\x7c\x3b\x1e\xbd\x3c\x19\xf4\x0f\xc7\x7f\xd4\x5e\xb9\xd4\x0e\x87\xc3\x71\x7f\x70\xd2\x9b\x1c\xf6\xa7\xd3\xc0\x3b\xee\x0d\xbc\xe1\xa0\x3f\x3c\xf6\x26\xfd\xc9\x88\xfc\x7a\xd2\x1f\x8d\x3e\x8c\x87\xfd\xc9\x38\x18\x78\x93\xfe\x71\x6f\xd4\x1f\x1e\xa2\x4f\x7b\xe5\x03\x19\xfa\xb5\x57\xbc\x86\x3f\xed\x15\x9f\x6e\xa6\xfd\x93\xe1\xe9\x70\x34\xee\x8f\x8e\x7a\x93\x51\x7f\x38\xee\x0d\x47\xc3\xfe\x70\x88\x3b\xec\xf1\xbd\xff\xb1\x1c\x78\xc3\x93\xfe\x78\x1a\x78\xe3\xfe\x70\xd4\x2b\xfa\x1a\x8f\x7a\xc3\xfe\xf8\x04\xff\x36\xd9\x1c\xf6\x47\x27\xc1\xa0\x37\xea\x1f\x4e\x7a\xc3\xfe\xa8\x37\xe9\xe1\x2f\xb2\xe2\x87\x57\x3c\x89\x3e\xf0\x26\xc5\x70\x47\x93\xd3\xe1\xf0\xa8\x3f\x19\xf6\x46\xc7\xfd\xc3\xde\x70\x78\xd8\x1f\x0d\x7b\xa3\xa3\xfe\x88\x76\x5b\xfc\xde\x8a\x66\x93\x61\x7f\x70\xdc\x43\xeb\xf3\x61\x74\xd2\x3f\x9a\x06\x03\x6f\xd8\x1f\x4d\xbd\xfe\x74\xec\x0d\xfb\xc7\x47\xe5\x3f\xfe\xf0\xb0\x3f\x3c\xec\xe1\x7f\x0b\xa1\x3a\xf0\x0e\xfb\xc3\xde\xa8\x5c\xdd\xe3\xc3\x0f\xa3\x51\xff\xf0\x64\x31\xe9\x4f\x0e\xe3\xfe\xf4\xb8\x37\xf2\x47\xe3\xfe\x64\xdc\xc3\xff\x16\x2f\x0d\x7b\x27\xfd\xf1\xa1\x37\xea\x4f\xa6\x05\x89\x27\xf8\x1f\xfc\x0d\x22\xf9\xa8\x3f\xed\x8d\x8a\x37\xd8\xe3\x93\xa1\x37\xea\x4f\x83\x71\xff\xf8\xa4\x37\xe8\x4d\xfb\xa3\x62\xdd\x8e\x26\xf8\xb7\xc3\xfe\xc9\x10\x8f\xe0\xe5\x70\x3a\xe9\x9f\xd4\xcf\x62\xda\x9f\xf6\xd0\x3f\xca\x1c\x5a\x51\xf0\x78\xd4\x3f\x26\x14\x5c\x14\x3c\x15\x7b\xfd\x49\xd1\xe9\xf4\xd8\x1f\x22\x16\xc7\xff\xa2\xc9\x78\x47\xbd\x51\x7f\x70\x18\x78\x93\x82\x8b\x50\xdf\xde\xa8\x7f\x32\x46\xbf\x1c\x21\x3e\x39\x9a\xa2\x47\xbc\xc3\x82\x7c\x87\xfd\xe3\x11\xfa\xed\xe5\xf0\xe8\xe8\xc3\x78\xd0\x9f\x1e\x06\x83\x82\x18\x27\x5e\xff\x68\xe4\x8d\xfb\xd3\x82\xbb\x0f\x8b\x5f\xfc\xf1\xa8\x7f\x34\xec\xe1\x7f\xe9\xcc\x26\xc7\xfd\xa3\x51\x8c\x9e\x2d\x9e\xf3\x8b\x16\x46\x3d\xfc\x2f\xa6\xee\xb1\x37\xec\x0f\x83\xa3\xfe\xb8\x58\x83\x93\x82\xf4\xfd\xe9\x09\xfa\xe5\xb8\x3f\x99\xfe\xf1\x66\x78\x74\xd4\x1b\x1f\xf5\x47\x93\x05\xe2\xdc\xc0\x1b\xf6\x4f\x0a\x86\x2e\xd6\xaf\x20\x2e\x5a\xc7\x51\x7f\x9c\xf5\xa7\xe3\xe2\xe7\xb4\xfc\xc7\x3f\xe9\x8f\x8a\xad\x83\x47\xd3\xc3\xdb\xb0\x25\x9b\x1e\x17\x73\x29\x06\x3e\x39\x0a\x06\xde\xb4\xd8\x94\xa3\xfe\xd8\x3b\xee\x8f\x0e\x7b\x47\xfd\x23\xfc\x5b\x41\x82\xd1\xa8\x87\xff\xc5\xd3\x3b\xec\x8f\x26\xfd\xc3\xa3\x0f\xc3\x71\x7f\x38\x89\x0b\x0e\xf5\xfa\xc7\x8c\x63\x27\xfd\xc3\xc3\xd8\xeb\x4f\x8f\xbd\x51\xb1\x56\xe3\x61\x0f\xff\x4b\xd6\xaa\xd8\x84\xc5\xfc\x8a\xe5\x2a\x16\xe7\xa8\x3f\xf2\x8a\xb5\x44\xbf\x1c\xf7\x87\xc3\x3f\x96\xc3\x89\x57\x6c\x61\x7f\x74\xd8\x1b\xd1\x4d\x51\x8c\xce\xeb\x1f\x8e\x02\x6f\x54\x88\x87\x01\x5a\xe1\x1e\x5e\xe8\x5e\x21\x0f\x36\xc5\x60\x83\x41\xaf\x20\x65\xff\x68\xd4\x2b\x08\x77\x7c\xdc\x1b\xfb\xc7\x05\x43\xa3\x7f\x30\xc9\xa6\xfd\xd1\x18\x35\x62\x43\x33\x18\x6f\xe7\x3c\xbc\x65\x89\x30\x3b\x29\xbe\x8d\x10\x32\xb4\x3b\x3e\xee\x0f\x46\xce\x68\xdc\x1f\x8e\x1d\xfc\xfb\x78\xdc\x1f\x1c\x3b\xe3\x61\x7f\x70\xe2\x8c\x8f\x8a\x7f\x47\x87\xfd\xd1\xd4\x19\x4f\xca\xdf\x8b\x43\xe3\xb0\xf8\x7d\x7c\x8c\x0f\x10\x67\x3a\xea\x4f\x4e\x9c\xc9\xb4\xfc\x7d\x38\xed\x0f\x87\xc5\xef\x83\x21\xf9\x9d\xeb\xab\xe9\xf8\xcb\x01\x8f\x0e\xfb\x83\xb1\x83\xfa\x1c\x90\x76\x87\x47\xfd\xe9\xa1\x33\x9a\xf6\x27\x63\x07\x89\x60\x07\x49\x65\x07\xed\x7c\x67\x74\x5c\xcc\x07\xff\x3e\x44\xbf\xe3\x71\x14\x2c\x20\x8c\x49\x1e\x37\xfe\x7d\x70\xe4\x94\x5d\xee\x30\xec\x51\xd1\xff\x78\x84\x68\x88\x7e\x9f\x8c\x8a\xb1\x0c\x27\xfd\xe3\x23\x67\x72\x54\xfe\x3e\xc2\xbf\x1f\xf5\x8f\xd1\x9c\x46\x53\x67\xd0\x1f\x4e\xc9\xb0\x06\xec\xe7\x84\x0e\x8d\x5f\x8e\x72\x99\xca\xee\xac\xcd\x8e\x4d\x6c\x7f\xcd\xb4\xc0\x52\xa9\xe9\x54\xf5\x5b\xf9\x73\xe0\xc5\xfe\x16\xae\xf7\x3e\x3f\xfd\x6f\xd7\xd1\x9b\xc3\xe3\x37\x6f\xab\x4d\x79\x01\x2d\xd7\x01\x93\x97\xfe\x72\xb6\x4e\xe7\x08\x40\x3e\xb8\xc3\x91\x75\xc5\x74\x17\x08\x88\xad\xde\x86\xc7\xac\x64\xbf\xac\xf3\x1c\xa4\x66\x53\x9d\x8d\xa9\xec\x84\xa5\xdf\x24\x4a\x09\x3a\xdd\xbd\xc4\x88\xa6\x8c\x6b\xe5\x94\x96\x49\xd3\x2c\x89\x5b\x55\x3f\x89\x1d\xe7\xde\xc4\x4e\xb8\x93\x43\x7b\x1e\xc3\x99\x1f\xb3\x15\x2b\x6f\x5e\xf8\xc6\xe5\xaf\x56\xde\x2c\x05\x7e\x18\xa4\xeb\xe5\x0c\x15\xed\x41\xc3\xf5\x96\x20\x59\xb7\x74\x73\x72\x3b\xa2\xfb\x9d\x86\x90\x6f\xf1\x55\x6e\xdf\xb7\xdb\x4f\xf7\x87\x7f\x7b\x17\xfe\xb6\x30\xc2\x41\xdc\x16\xc4\x75\xa2\xcc\x2b\xad\xe7\x68\xbd\x31\x53\x19\xcb\xad\x95\xef\x62\x83\x01\xc3\x3f\xd6\x5c\x85\x2e\x41\x8a\x02\x2e\xcd\x00\xe9\x4a\xd9\x3f\xdc\xf2\x0c\x86\xac\xec\x5f\xee\xcf\x11\x90\x1e\x07\xe4\xd8\x73\x9f\xe0\x45\x40\x98\xd3\x4f\x60\x42\xb0\x8f\x91\x0d\x20\xda\xb8\x42\xa4\xe5\x55\xf4\x05\xbc\xe5\x6c\x84\x14\x91\x22\x03\xe9\x15\xc8\xf3\x28\x99\x67\x24\x6c\xf4\x0a\xe3\x9b\x75\xe4\x1c\x30\x77\x60\x61\xed\x2f\xa3\xfb\xc9\xcc\x4c\x19\x60\x76\xf5\x0c\x47\x37\xb2\x91\x76\xa4\xab\x60\x28\x64\x9f\x2a\x76\x14\xde\x14\x6c\xb2\xa2\xb4\xd8\xab\xdc\x9e\xea\x76\xc3\xd2\x52\xa9\xde\x2d\xae\x95\xba\xef\x3b\x36\xbb\x5b\xa4\x1f\xfd\xa3\xdf\x0c\xb1\xa1\x2b\x5d\xe9\xd7\xe2\x91\x09\x17\xc7\xa4\x79\xe6\x86\x47\x15\xd6\x21\x08\x2f\xc6\xa5\x86\x8c\x60\x4b\x8a\x2d\x3d\xad\x72\xb0\x1a\x7b\x33\x61\x2c\x2a\x02\x44\x2c\x3c\xc1\xf5\x45\x9d\xb7\x7c\xb1\x9e\x00\xfa\x31\xc8\x02\x10\x0a\xb3\xe2\x81\x0f\xd7\x09\x1a\x8b\xb1\x00\x84\x1e\xca\x80\xb9\x06\x90\x93\x7a\xb9\x8a\x81\x47\xb3\x15\x34\x68\x2b\xd2\x16\x47\x30\x68\x30\x04\x19\x29\x99\x83\x23\x0a\x2a\xea\x03\xaa\x85\x6e\x2e\xa0\x83\x5a\x70\xee\x41\x0a\x1c\x10\x47\xf3\x68\x16\x03\xe7\x16\xa6\x4e\x59\xc8\xa7\xda\xcb\xc3\xb9\x1d\xa6\xf2\xc0\x9e\x6e\xfc\x28\x66\x89\x48\x62\x66\xb1\x66\x42\x23\xe3\xe8\x6b\xc7\xef\xa7\xc0\xf1\x69\x6f\x4e\x94\x38\xa1\x9f\xfb\x18\x15\x9e\x63\x19\x24\x5f\x2a\x12\xf1\x46\xbd\x71\xed\xc4\x90\x0a\xf5\x22\x8a\x09\xde\x7c\x15\xca\x96\x7e\xcc\x08\x5c\x95\x1b\xd4\x94\xb2\xd0\x2d\x69\x94\xfb\x6e\x42\xbf\x13\xe3\x0a\x0e\x6f\x08\x85\x5d\xf6\x54\x62\xc0\xd6\x9f\xa0\xf6\x6b\xa6\x04\x93\x2c\x4f\xfd\x28\xc9\x77\x9a\x17\x6b\x85\x3d\xa0\x29\xdc\x72\xc4\x0f\x52\x37\xe5\x43\xab\x29\x1f\x56\x4c\xf9\x10\x75\x92\x94\x55\x66\x85\xbd\xf2\xb0\xf0\xd7\x19\xd9\x2b\x36\xd3\x7a\x07\x70\x3e\x53\xe6\x00\xfa\xaa\x03\x13\x6e\xc0\xda\xa6\x6d\xe6\x60\x78\xd1\x34\x2d\x3b\xce\xd4\xb4\xd5\x9e\x35\x4f\xe8\x3c\x0c\x53\x3f\xb6\x9a\xe7\x71\xc5\xa4\x8e\x51\x1f\xd5\xf3\x0a\x29\xc8\xc6\x4e\x73\x63\x50\x1d\xfc\xd2\x0d\x6b\x26\x38\x1c\xd8\xad\xe4\xa0\x62\x8a\x43\xd2\x4f\xf5\x24\xff\x5c\xc3\xdc\xdf\x69\x82\xbf\x16\x2d\x38\x71\xb4\x8c\x72\x67\x11\xe5\xfc\x2c\x46\xda\x71\x8d\x7a\xc3\x7a\x71\x97\x05\x50\x38\xee\xec\xc7\x73\x55\xbc\xc9\x8f\x82\x09\xba\xff\x87\xff\x74\xa2\x1d\xdb\x04\x3f\x5e\x19\x49\x20\x4b\xef\xa1\x58\x72\x05\x65\xe9\x95\x6a\x01\x3b\x1d\x08\xc6\x0a\x3e\x1c\x50\x94\xfc\x1a\x65\x1c\xd1\xbb\x31\xfb\x9b\xc9\xb3\x8a\x87\x18\x6f\x4a\xbf\xa3\xe5\x44\x30\x35\x30\x2d\x8b\x63\x4b\xb9\x25\x20\x27\x79\x4d\x24\xd1\x89\x3a\xfd\x8a\x9f\x5e\x24\x96\xd0\x68\xa8\xd6\xca\x9a\x67\xc7\x7a\xed\x7a\x1e\x25\x1e\x57\xc3\xf6\x3b\x80\x57\x3f\xb9\x5f\xc4\x93\x63\xff\xc8\xa0\xdb\x4a\xd8\xdf\xfa\xb2\xe3\xb4\x1a\x4d\xc2\xea\x0c\x9b\x31\xf1\xb8\x06\x7b\xee\x3a\x59\x00\x3f\xce\x17\xdb\xb3\x34\xda\x60\x98\x7e\x7d\xf4\x8e\xa2\xa6\x12\x7c\x1f\x87\x2b\x73\x43\xcd\x9a\x24\xec\x40\x2a\x85\x24\xd4\x3d\x2a\x4b\x45\x3a\x21\x58\x81\x24\xcc\x0a\xf9\xc6\x46\xe3\x84\x64\x38\x3a\x4d\x5b\x0e\x66\x1c\x62\x7c\x75\x90\xe6\x5e\x9e\x46\x7e\x32\xc7\xb9\x8d\x2c\x07\x4c\x28\x6d\xe5\x36\xad\x4f\x68\xa2\x5c\x02\x1e\xf2\xa7\xda\xb5\x79\x5c\x72\xdd\xfb\x99\x93\x82\x2c\x58\x80\x82\x05\x4d\x30\xd4\x1a\x0a\x2d\xa2\x8c\x70\xba\x4c\x1a\x62\xfb\xef\x88\x30\xf7\x7e\x76\x99\x02\xb0\x5c\x69\x74\x99\xc7\x25\xcb\xaa\xec\xd6\x96\x28\x33\x08\xf3\xce\x28\xa2\xab\xda\x24\xf8\xcb\x35\x65\xdb\x79\x5b\xcf\xa8\xb4\xf5\x44\x19\x82\xe7\xf2\x53\x66\xeb\x91\x2a\x7b\x9a\x6b\x0a\xb8\x7a\xd1\x51\x6d\x0f\x91\xef\xaf\xc2\x8a\x66\x0b\x98\xe2\x50\x18\x69\xe0\xfa\x88\xb6\xc6\xb3\xd7\x71\x04\xfa\x7c\x2a\x25\x6e\xa2\x08\x1d\x8d\x3d\x49\x18\x2d\x91\xb5\x51\x3d\xb4\xb7\xc8\x0f\xb6\x0d\x7e\xfa\x84\x09\x52\xbc\x4d\xeb\x91\x34\xf1\x9c\x7c\x0b\x9a\x2c\x61\x18\xdd\x6e\x9b\xd3\x64\xd2\xa8\xc1\x47\xa6\x42\x02\xef\x53\x5f\x8f\x17\xae\xee\x6c\x21\xab\x01\xa9\x05\x4f\xf9\xf1\x93\x73\x06\x45\x77\xa1\xa0\x36\x2f\x88\xd2\x20\x06\xb4\xa2\x5f\x31\xc5\x28\x59\x67\xf2\xc7\x37\xa2\xac\x68\xd0\x0b\x2a\xf8\x1e\x04\xa4\x70\x59\xe6\x85\x7e\x82\x23\x8b\xf5\x42\xa6\xd7\xa0\xe9\x97\xe4\xf7\x9e\xfb\x3e\xe1\x3e\xef\x7c\x35\x34\x90\xdc\xe0\x81\x61\x30\xaa\x27\x24\x2e\x15\x44\xcd\x5e\x16\xf2\x87\x89\xc1\xc4\x50\xcf\x98\x24\xa0\x14\xca\x1e\xa9\x5f\xac\x95\x76\xa4\xef\xfa\x4e\x2b\xc5\x1e\x19\xbf\x41\xfa\xe9\xe5\x9f\x95\x54\xac\x20\xb5\x64\x51\x3b\x34\xd1\x16\xd7\x2d\x8d\xb2\x4b\x96\x80\xa9\x9f\x03\x7d\xee\x1d\x20\xf9\x13\x3c\x2a\x05\x77\x30\xf7\xfb\xfd\x8a\xc8\xc9\xda\x75\xe9\x71\xc9\xa6\xac\xc2\xb4\x61\x69\x50\x69\x56\x01\x30\x8e\xb6\xfa\x19\xce\x2e\x74\xe5\x5a\x35\x33\x2a\x2b\xb6\xf6\x48\xc1\x72\xd3\x62\xd7\x34\xe2\xd2\xbb\x59\xbd\x61\x56\x57\x87\xf7\xa0\x8a\x81\x72\x3f\xbb\xfb\x25\x85\xeb\x95\x68\xfc\xb5\x2d\xf8\x68\xd4\xf2\x87\x92\xe9\x4a\x37\xbd\x0f\xac\x90\x9a\x15\xef\xf1\xd2\xc6\x38\x87\x0d\x8c\xd7\x4b\xa9\xde\x8a\xfb\x3b\xb1\xb6\xd7\x48\x13\x36\xf6\xea\xda\x98\x8a\xb4\x39\xe6\x98\x6e\x09\x8a\x4b\x22\xae\xb8\xcb\x0d\xf1\x49\x96\xfb\x79\x76\x9d\xfa\xc1\x1d\xba\x37\x3f\x89\xb2\xd7\x84\xd9\x8b\xfb\x1e\x2d\x83\xe7\x06\xab\xb5\x41\x37\xe2\xa1\x45\x72\xc1\x15\x76\x0b\xf2\x60\x71\x85\x3e\x95\x6b\xce\xf2\xaf\x90\x9a\x77\x4a\xdd\x81\x06\x6b\xfa\xed\xe8\xb2\x04\xcb\xe2\x5e\xf0\xad\x49\x23\x0b\x1f\x85\x50\x6e\x00\xe3\x6c\x85\xaa\x7d\x0e\x07\x3c\x71\xfe\xf1\xf7\xff\x4f\xdf\xd6\x8d\x9a\x90\x46\x72\xcf\x78\x00\x0d\x52\x85\x70\x09\x93\x7c\x81\x0b\x8c\x2e\x21\x36\x51\xa4\x70\xe9\x25\x28\x0d\x99\x01\xe4\xba\x65\x41\x39\xbe\x2e\x17\xca\xff\x68\x6c\x0b\xd1\x58\x2b\xba\xb5\x87\xc0\x15\x02\xa1\xc6\x31\x03\xfb\x6d\x06\x49\xe2\x0f\x23\x7f\x72\xf5\xb9\x4d\x3a\x1b\x57\x65\xd9\x90\xda\x96\x12\xc8\x6c\x16\xfc\x71\x46\x5f\xe9\xcc\xa9\xfd\x4f\x98\xf1\x46\xf2\x86\x4b\xf0\x27\x97\x72\x14\x49\x87\x72\x4a\x8c\x40\x72\x5d\xe5\x6b\xfe\xe1\x67\x58\x41\x3f\x11\xad\x8f\x5f\x00\x17\x15\x22\xe6\x3e\x60\xf7\x09\x03\x74\x0f\xbb\x10\xdd\xb0\xec\xbb\xc3\xaf\x98\x7d\x67\xce\x8a\x53\x2f\x23\x47\xe8\xe8\x59\x80\x4d\x0a\x13\x0f\x65\x59\xa8\xe6\x06\xac\x46\xdf\x28\x91\x08\x4d\xd3\xc5\xe8\xea\x04\xe5\x57\x56\xf3\xc1\x58\xca\x98\x1e\x95\x63\xe0\x92\x4a\x84\x8f\x70\x7a\x89\x26\xca\xc9\x36\xc1\x24\x80\x49\x80\xe0\xd3\xcb\xac\x61\x26\xa9\x5b\x85\x3a\x71\x92\xaf\x5b\x91\x9a\xc2\x87\xad\x97\xfb\xf3\x7d\x97\xa7\x6f\x16\xf3\xb3\x8f\xcf\x37\xb9\x94\x4f\x62\x8a\x33\x90\x0b\xd7\x5b\x58\xdf\x4e\x61\x92\xad\x63\xe7\x14\x26\x09\x08\x72\x07\x51\xc6\xd1\x96\xdd\xbc\x2c\xbe\x12\x62\x69\x5a\x86\x8a\x32\xea\x77\xba\xa6\x29\x98\xa3\x23\xfc\x3e\xca\x83\xc5\xfe\x03\x3d\x3c\x1d\x84\xbf\x5d\x9c\xdf\x1d\x98\x50\x2e\xb7\x19\x46\x8b\x26\x48\x3d\x0b\x78\xff\x0e\x4d\x30\xd3\x38\x10\x94\x78\x36\x5e\xc7\xe4\x6b\x9a\x72\xa1\x66\x82\x5c\x37\x87\x9e\x65\xc0\x4f\x83\xc5\xf3\x84\x3b\x99\x4d\xb1\x68\x04\xd1\x4a\xd6\x38\x51\x25\x31\x7e\xec\xf2\x0c\x71\x2d\x01\xfc\x44\xf1\x00\xe1\x29\x39\xda\xb3\x7c\x73\x0e\x73\xc8\x1e\xb7\x0a\x14\xd3\xdc\x03\x35\xd9\xbf\xab\x14\xdc\x46\x0f\x3c\xdf\xe3\x5e\x7e\xe6\x95\x5c\x7a\xe0\xc8\xc6\x82\x61\xb5\xb5\x40\x81\x84\x4b\xc9\x04\x44\xc5\x56\x1f\x82\xd6\x6c\x7b\x49\x1b\xa1\xe3\x4d\x46\x7d\x16\x1e\xd8\x14\xda\xf5\x77\xe0\x9a\xdb\xa6\xcf\x67\xf1\xdd\xdd\x9d\x9c\x93\x67\x5b\x58\x5e\xf2\xbc\x51\x6d\x41\x13\x68\x96\xe5\x29\x4c\xe6\x9a\x7b\x3d\xaf\x61\x58\x38\x1e\x44\x1b\x28\xd5\x96\xf4\x66\x5a\x85\xcf\x9a\xd7\xa5\x27\xef\xd8\x95\x56\xa5\xd4\xe0\x30\xa1\x8b\x4b\xd8\x35\x14\xdc\x68\x5a\x87\x51\x9b\x42\xac\x8b\x28\x73\xca\x96\x9b\xb8\x70\x6a\xbb\x45\x90\xec\x51\x82\x28\x53\x56\x29\xd7\x7b\x2b\x95\xa6\x02\x18\xaf\x97\x86\x87\x8d\x8f\x23\xf0\x6d\x62\x17\x28\x7e\x5f\x46\x49\xb4\x5c\x2f\x0d\x8d\x88\x42\xab\x04\x95\xcf\xfd\xb9\x63\xb0\xca\x61\xfc\x02\x73\x7d\x6d\xa9\x69\x7d\x23\xd8\x24\x4b\x4a\xda\x6a\xb3\xbd\x15\x73\x48\xfd\xc7\x2a\x31\xea\x66\x6d\x5a\x36\xd5\x35\xae\xcc\x8b\x97\xf3\x2b\x3f\xd2\x63\xe9\x18\xdf\xc8\x41\x2a\x2c\x09\xcf\xd8\x55\x95\x97\x34\xdb\x40\x5b\x17\x53\x97\x73\xb1\xbb\x6f\x90\x59\x50\xeb\x6b\x87\x4b\x33\xd7\xc5\xd1\xd5\x78\x0f\x4d\x78\x01\xc6\xdb\x46\x25\x29\x76\x1d\x83\x64\x80\xad\xe5\xd3\x47\xe2\x93\x53\xec\xca\xa8\xa2\x8f\x59\x5f\x6b\xc5\x1e\xf6\x4e\x94\x47\xe6\x0e\xa1\x8f\x86\xfc\xa1\xe9\xd5\xaa\xe4\x72\xed\x17\xda\x8f\x35\x1f\xd6\xb9\xd5\xb4\x67\x8d\xa8\xb6\x11\xe3\x23\x52\x80\x58\x6d\x00\x6a\x9b\x6c\xaa\xbd\xa9\x1a\xd6\xe3\xaa\x70\x54\x3d\xd8\x77\x3d\xee\x8f\xc9\x3a\x0a\x7e\xd9\x9e\xcb\x7a\x1c\x8c\x55\x55\xc7\xac\xc2\x0d\x09\xfc\xbb\x49\x4e\xeb\x2f\x4e\xf4\xb6\x2c\xd9\xe6\xb1\x4e\xd6\xfb\x84\x91\xe4\x9f\x4a\x12\xda\xd0\x95\xfe\x1b\xd9\x1b\x7f\xa3\xcd\x49\xd3\xc4\x1d\x2f\xfc\xec\x2a\x87\xab\x55\x71\xc9\x22\x2b\x4b\x2d\xf8\x8a\x82\x6a\xab\xf2\x72\x7b\x45\x48\x58\xb0\x0e\xd0\x72\x14\x7b\x98\x73\x51\x70\xa5\xb3\xf0\x33\x27\xc3\xc3\x75\xfc\xbc\xe0\xae\xbc\x78\x3c\x87\x5c\x38\x94\x93\x17\x5a\x5f\x49\xe9\xbe\x7e\xa3\x6a\x48\xa2\x49\x61\xb8\x85\x71\x0c\xef\xdf\xaf\x9e\x97\x09\x07\x3d\xf7\xde\x8f\xf2\xf7\x49\x1e\xc5\x0a\x2e\xbe\x69\xd9\x64\x73\x6e\xf7\xa4\x0d\x0a\xa6\xd6\x50\x34\x4a\x6e\xa1\x91\x9c\xf7\x51\x1c\x53\x3a\x8a\x44\x34\xdf\x7c\x6d\xe3\x50\xa6\x4d\xa8\x58\x19\x8e\x22\xcf\xf7\xb0\x59\xcb\x9f\x3e\xb9\x51\xa1\x34\x6f\x48\x02\xdf\x60\x30\xa8\x0d\xea\xaa\xe7\x17\x15\x7c\x9e\xed\x76\x71\x93\x2b\x7a\x1d\xb7\xf1\x49\xce\x11\x39\x0c\xc8\x94\x2a\x37\xb2\x0a\xa7\xc5\x97\x1a\xe3\x7f\x3f\xe1\xa8\x54\xae\xeb\xf3\x42\x66\xab\x18\x5b\x86\xf8\xe9\xba\xf9\x9d\x87\xf2\x6c\x46\xa4\xbe\x47\x04\xd7\xd9\x53\xfe\x39\x22\xba\x46\xdc\x55\x54\x27\xa3\x46\x15\x85\x1f\x45\xc2\xa2\xd3\x47\x36\x80\xe8\x0d\x0c\xa5\x19\xd9\x4f\x42\x56\xbe\x81\x3f\x75\x55\x67\x9f\x1e\xe3\x28\x05\x08\x1a\x6c\xd7\x43\x99\xee\xf0\x4e\x4f\x66\x54\x74\x14\x77\x90\x7d\x3f\x35\x22\xcf\x3f\x82\x5f\xb3\xd3\x3f\x36\xd5\x2e\x3f\x56\xb5\xe7\x09\xc2\x3d\x63\x3b\x87\xf2\x92\x8d\x67\xab\x60\x3d\x6c\x2b\x28\x9d\x25\xf7\x51\xbe\xf0\xd8\x65\x1c\x07\x59\xf2\xa5\x9d\x90\xc3\x9c\x2f\x59\x85\x0c\x95\xb9\x1f\xc5\x99\xcb\x1a\x25\x85\xf9\x16\x7e\xf6\x06\x90\x8a\xa6\x8d\xb0\x1b\x49\xff\x3b\x1a\x13\x0a\x21\x3f\xae\x36\x28\x70\x61\x2c\x01\x4c\xbc\x5b\xec\x53\xb1\xb0\x1e\x94\xef\x88\x00\xb3\x53\x5a\x01\x9e\x88\x7e\xe2\xdc\xe3\x88\x42\x22\x0c\x6e\x7a\x2e\x8a\x01\x70\xc8\xae\xd5\x42\x04\x0e\x8d\x2f\xeb\x2e\x7f\xba\x33\xd0\x4f\x02\x10\xd3\x70\xbd\xdb\x08\x27\x5d\x4b\x07\x22\x17\x73\x57\x6d\xff\xb1\xb9\x36\x30\xeb\x8a\x48\x07\x39\x75\xb0\x9c\x52\x6e\x11\x7e\xa9\x9b\xdf\xa4\xb6\xa9\xce\x2f\x36\x95\x9c\x36\x32\xab\xc8\xe2\x96\x38\x45\xb9\x28\x9a\x35\x6c\xac\x58\xb8\xa8\x29\xf5\xca\xd7\xd3\xb0\x5d\x94\x14\x32\x87\xc2\x58\x97\x7f\xa1\x7a\x3d\xf4\x1b\xdd\x0d\x33\x87\xba\x0e\xc4\xc6\x03\x32\x25\x3b\x26\x16\x86\x62\xc9\xc8\x28\x83\xc3\x5b\xaf\x9a\xb1\x6f\xa3\xc6\x0d\x5e\xe8\x32\xe0\x5c\x69\xbf\xd5\xce\xa8\x33\x1f\xea\xc8\x5a\xcb\xc9\xa6\xfd\xda\x84\x89\xab\x24\xa5\x3c\xb2\x25\xc8\x32\x5a\xc9\xaa\x85\x39\xa0\xca\x89\x3f\x42\xf9\x07\x18\xcd\x81\x9d\x76\x5c\x69\x4f\x1a\x5e\x5e\x77\xa0\xa8\x61\xb9\x9f\x33\xac\x6b\xde\xc6\xeb\x28\x7c\x29\x56\x4a\xe7\xa7\x86\x4e\xac\x1e\xe9\x45\x89\xce\xd2\x9a\xe3\x46\x0c\x51\xf2\x09\x56\x37\x0a\xcd\x4a\xa8\xd3\x21\x56\xa9\x96\xa2\xae\x78\xc5\x4b\x8d\xbb\x2a\xc6\xed\x6d\x22\x70\x8f\xb8\xbc\x89\x9a\xa5\x57\x80\x1e\x4f\xc7\x42\xe5\xbd\xf7\x5d\xbf\x7a\xf8\x7c\xf9\x6a\x74\x05\x56\xd5\xfa\x95\x50\x49\xfd\xc9\x03\xa9\x0e\xf4\x64\x4b\x7f\xa1\x75\xdf\x0b\x36\x21\x27\x0f\x4b\x33\x64\x0e\x5c\x9f\x53\x7e\x30\xe6\x24\xad\xc5\xae\xe7\x57\x7c\x37\x79\x9a\x02\x5f\xe0\xfe\x60\x9d\xa2\x9a\xf3\xac\x53\x37\xcb\xc1\xea\x29\x6a\x4a\xd3\x99\x8e\x65\x87\x4c\x1a\x2a\x5d\x16\xbc\x7f\xcd\x22\x87\xf8\x5c\x9b\x2c\xf1\x57\xab\xad\x4d\xbc\x8c\x72\x6d\xb7\xd0\xb8\x24\x60\x60\xfe\xab\x00\xc6\x30\xf5\xb2\x7b\x3f\x0f\x16\x0e\x2f\x83\x45\x54\x2e\x94\x4c\x8f\xae\xbc\xc5\x96\xc9\x41\xf8\x9b\xd1\x5c\xaa\xf4\x8e\x18\x49\x32\xc3\x0a\x6d\xfd\x6e\x68\x4b\x2b\xe1\x8a\xab\x5c\x6f\xa2\x89\x7a\xe7\x89\xfc\xe1\x69\x92\xc0\xdc\x57\x20\xab\x9f\xf8\xdc\xe7\x44\xa1\xef\xb9\x4f\xb0\x1b\xbf\x7c\x07\x7d\xc6\xfe\x62\xe0\x4f\xcc\x7e\x2c\x36\x8e\x6f\x83\xfd\x75\x14\x72\x66\x6c\xd4\xe2\xf3\x0d\x8d\x8f\x32\x47\xdf\x61\xbc\x63\xfa\x64\x19\x12\xa0\x63\x2d\x15\x18\x86\xcf\x81\x93\xba\xd4\x54\x77\xae\x29\x6c\x41\x6f\xb5\x16\x6a\x7f\xbe\x5d\xd5\xf8\x9a\xf9\xe1\xd0\xa6\x2b\xb4\x6a\x51\x57\x18\x77\xa1\x51\x5b\x74\x11\x25\xb7\xb0\xa6\x83\x79\x0a\x6a\x35\x92\xda\xb3\xdf\xb8\x47\x47\x37\xbc\xe1\x2d\xcb\xfd\x25\x9f\x5f\xa4\xcd\x82\xd2\xd2\x55\xd5\xc7\x8d\x1b\xb3\xec\x92\xa9\x16\xaa\x87\x44\xdb\x89\xa8\x8a\xb4\x71\x4f\xb4\xd0\x17\xaa\x86\x53\xad\x3e\x54\x07\xb1\x04\xc5\x21\xe2\xf6\x5c\x76\xf2\x84\x7e\x8e\xfc\xd9\x5c\xc1\x2f\x40\x8f\xd9\x32\x6a\x50\xab\x4d\x74\xaf\x41\xa0\x7e\xbb\xd5\x1e\x50\x34\x94\x37\x83\x0f\xfb\xae\x35\x5c\x65\x7f\x5e\x8c\xdf\x5d\xcc\x8c\x05\xc8\x03\x98\xe4\x29\x54\x41\xcd\x94\x93\x07\x47\x45\x49\x35\x11\xd8\xae\x1a\xa0\xe3\x1d\x91\xc5\x35\x6c\x1c\x7a\xd4\x96\x78\xf9\x65\x2c\x03\xfa\x8c\x8b\x66\x40\x7f\x8b\xf1\x0b\xd3\x1e\xc6\x61\x5a\xc0\x38\xe4\x15\x08\xfe\x43\xf6\xa4\x2e\xcc\x58\xf7\x60\x19\xc3\xfc\x5f\x78\xf0\xd7\xc8\x99\x4b\x9b\x81\x09\x1e\xac\x36\x06\x39\x03\xf9\x15\xf7\x8e\x80\xd5\x9f\x45\x5f\x0a\xcd\x67\x48\x7c\x01\x93\x9e\x4b\x93\xeb\x74\xb5\x24\x30\x5d\xb8\xb2\xed\x18\xa9\x69\x7d\x2b\x10\x1c\xa3\xfd\x8b\x05\x9b\xf8\xf1\x04\x31\xf0\x53\x69\x1c\xc4\x98\xe1\x9e\x16\xdf\x39\x6c\x7d\xc8\x98\xb8\x1e\x35\xab\x89\x8f\x0c\xfd\x6a\x6a\x05\x02\xdb\xed\xa5\x95\xb6\x4d\xdc\x5a\xb9\xb9\x3a\xde\xb3\xe9\x06\xa4\x9e\x3f\xff\x4e\xc2\xd5\x0e\xc6\x9b\xf9\x49\x3a\x78\xad\xd4\x6b\x2b\x2d\x7d\x0a\xa8\xa0\x55\xa2\x39\x26\x44\xd6\xc7\x3f\x39\x35\x6b\x8e\x8f\x82\x8a\x08\x01\xf9\x51\x4d\xce\x9d\x1a\x82\x26\xa6\xa6\x49\x2d\x64\x7c\x78\x51\xdd\xbb\x7c\x5a\x1b\x1d\x6c\xf6\x1a\x63\x6e\x16\xba\xe3\x75\x8a\x82\xd0\x5f\x14\x6c\x28\xa7\xb1\x49\x2d\x52\x72\x8d\x06\x83\xd5\x03\x72\xab\xa5\xeb\x24\xf0\x73\x6a\x1c\x36\x0c\xd7\x0f\xc3\x14\x64\xb6\xe3\x95\xe7\x0a\xd2\xdb\x4b\x94\x6b\xde\xe6\x6d\x0e\x4d\xa6\xd5\xfb\x1b\x43\x0e\xa1\xb4\x77\xcb\x4c\xaa\xe8\xb6\xf1\xc6\x15\x77\xd8\x63\x6c\xdf\x6c\x3d\x4b\xfc\xcd\xbe\xef\xdd\x77\xe9\x4f\x70\xf3\xe1\xfd\x7b\xe3\xa9\x9b\xfb\xb3\x0c\x01\x8a\xe2\xe9\x18\x0e\x5f\x0a\xdc\xa7\xaf\xc9\xc0\x5d\x59\x55\x3b\x80\x9a\xd2\x8b\xf5\xbe\x53\xa6\x8e\x8b\x62\xa0\x4f\xaa\xd6\xb0\xa8\x6c\x2c\x1c\x48\xae\x3b\x7e\xd7\xe4\x9e\x79\xbb\x01\x69\xa1\xa5\xb9\x7a\x39\xf0\x78\x63\x5e\xc2\x24\xca\x61\xda\x6e\xd4\x6f\xc8\xcb\xa6\x41\x2b\x47\x9c\xcd\xae\x69\xb5\x61\x30\x13\x74\xbb\x5b\x72\x3f\xcf\x90\x77\xd2\xa3\x3a\xf9\x7e\xef\x98\x70\x16\xfe\x32\x0a\x46\x97\xd5\xd6\x2d\x64\x2c\x22\x06\x25\x6a\xd1\x52\x6d\x5c\x48\xdf\x67\x09\x0d\xa2\x45\x8c\x2a\x44\x4f\x42\x90\x05\x69\xb4\xa2\x16\x8a\x87\xab\xe2\xc6\x80\x9a\x61\xbf\x3d\xbc\x40\x37\x12\xf4\x21\xf9\xf5\x46\x2a\x7a\xcb\x5f\x35\x4b\xf7\xc5\x4d\xcf\x5d\x81\x34\xc0\xd1\xb3\x85\xba\x46\xff\x74\x6f\x08\x40\x64\x0f\xdb\xdf\x50\xc2\xad\x73\x1d\x2d\x81\x73\x85\x86\xe8\x9c\x12\x53\x24\xcb\xa5\x28\x47\x79\xa3\x87\xbe\x26\x23\xa7\x19\x15\x4a\xa6\x21\xff\xec\xd6\xf4\x2c\x6d\x8b\x4e\xb3\xfc\x88\xcd\xbc\xc6\x1e\x28\x59\x2c\xd6\x19\x38\xc3\x8c\xa0\x2d\x58\x76\xcc\x0c\x57\x8a\xd5\x90\xae\x31\x32\xa6\xb1\xad\xcf\x51\x7d\x5c\x17\x14\xc5\x47\xe4\x1c\xf7\x8e\xf1\xcb\x13\x35\x19\x6e\xc2\x1b\x17\xdb\x8c\x7f\xda\x89\x09\xd2\xc2\x08\x69\x6d\x86\x2c\x6f\x54\x82\x2d\xd2\x65\x84\xbb\x51\x4d\x91\x47\x76\xa6\x48\x4b\x63\xe4\x91\x8d\x31\xd2\x68\xe5\xa1\xb8\x9a\xb5\x3e\x5d\xb2\xb8\xa4\xc8\xd7\x54\x5d\xdc\xa9\x26\xaf\x51\x2b\x3f\x04\x69\x61\x30\x64\xf4\xdc\xff\xc0\x7c\xff\x1f\x94\xf1\xb5\x86\x0d\x64\xcf\x98\x45\x28\x34\xa5\x4d\x9e\xa3\x22\xb5\x3b\x3e\x13\xc0\x6a\x05\x52\x8f\x5e\x69\xf7\xfb\x3c\xf8\xf5\x8f\xc3\xb7\x97\xa7\xbe\x92\xac\xc3\x55\xc3\x2c\xf8\x8c\xba\x94\x85\xc9\x79\xa5\x00\xe5\x4b\xbf\xdd\xdc\x94\x77\x6b\xe1\x71\x69\x2f\xf1\x85\x00\x54\x25\x9b\x37\x5f\xb8\xcb\x88\x8b\xc2\x2f\xfe\x60\xa6\x83\xa5\xcf\x69\x53\xc5\x1f\xaa\xc9\x01\x05\xb3\x25\x7e\xfc\x01\x6f\x23\xfa\x66\x99\xff\xce\x4e\x81\x32\x99\xfa\x86\xaf\x03\xba\xdb\xac\x85\x89\xc0\xe4\x05\x0c\xd6\x99\xc9\xd2\x11\x83\x20\x27\xc3\x2c\xcd\x01\xe8\xb5\xbf\x81\xed\x7b\x43\x92\x76\x0a\x32\x90\x5f\x83\x87\xfc\x9c\xf4\x24\xbe\x79\x5a\x51\xb8\x30\x03\x6a\x77\xc8\x64\x91\xac\x0b\x4e\xd5\x19\x52\xb4\x66\x14\x9a\xf9\x2a\x7e\x28\x24\xbe\xa2\x38\x82\x25\x35\xd6\x97\x02\x54\x24\x16\xf9\x8b\xa6\xc8\x97\xa4\x0e\x64\x23\x15\xb7\x7c\x9a\x13\x38\xd4\x20\x15\x08\x89\xff\x12\x4f\x28\xcc\x25\x06\xfb\xd5\x5b\x85\xf8\xe9\x89\xa4\x54\xac\x3f\x9c\xde\x2b\x58\xcb\x09\x78\xd6\x2a\xf6\x23\xb5\xb4\xb4\x4e\x4d\x6e\xb1\x0a\x28\xb8\xe2\x9b\xae\xc2\xd4\x6a\x15\xc8\x46\x6e\xba\x0a\xfc\xf4\xda\xae\xc2\x2a\xb6\x5f\x84\xca\xd2\xfc\x9c\x05\x1e\xe1\x9f\xc4\xe8\xd6\xc5\x8c\x76\xf3\xbc\x69\x58\xa4\xb0\x48\x1d\x9f\x59\x29\xf0\x97\x51\x32\xf7\x6e\xa3\x78\xef\x33\x13\x36\xe3\xf0\xfd\xe5\xf3\x2f\x0b\xf9\xd0\x32\xa4\xce\xc4\x10\x81\x73\xf4\x5c\xb8\xce\x91\x80\x24\xba\x52\xfb\x8c\x7a\x91\x5c\xdd\xae\xc4\x66\xee\xad\x0a\xa5\x2e\x4d\xf6\xfe\x32\xb9\x8e\xa7\x49\xf4\x25\x3d\xac\xac\xbe\xc9\x4d\x88\x4a\xa4\x05\x76\x96\xd1\xfa\xc2\x93\x9e\x7b\x1f\x85\xf9\x82\xff\xa0\xc3\x0a\x9d\xc4\x1e\xd7\x73\x87\xfd\xa1\xbc\xff\xa9\x18\x0d\xc1\xad\x1c\x3b\x4a\xb7\x3b\x45\x0b\xc7\x35\xf3\xb8\x69\x0c\x0b\xe9\xe7\xcf\x61\xe2\xc7\x5e\x96\xa7\xd1\x0a\x78\xb4\xf0\x05\x7d\xf2\x7d\x12\xe1\x1c\xa5\x0c\xa4\x57\x2b\x3f\x00\x6f\x93\xf7\x18\x5b\x87\x9f\xf4\x70\xa0\x10\x46\x84\x6a\x12\xdd\x3a\x4b\xea\xfe\x2c\xc8\x14\x47\xc9\xdd\xcf\x8b\x14\xdc\x12\xcb\xe5\xcf\xe8\xeb\x82\x3e\x3f\x3d\x2c\xe3\xff\x39\xf3\x33\x70\x38\xe9\x5d\xbe\xbc\x18\xfd\xb1\x7d\x36\x99\x7d\x7c\x58\x07\x5f\x06\x89\xff\xf2\xdd\x20\x38\x83\x9b\xd7\xe3\x70\x1c\x6e\xa7\xe3\x37\xdb\xe9\x26\x58\x06\x9b\x37\x9f\x9f\xde\xbf\x39\x3d\xf9\x12\x2e\x83\xe4\xfc\x65\xb8\xfa\xe3\xe5\x3b\x78\x79\x15\x3c\xbc\x39\x0d\xe6\xfe\x2f\x1f\x56\x7f\x8c\x16\x03\xf2\xf7\x4f\xa7\xd1\xd3\xf9\xe5\xcb\x57\xf1\xef\xe3\x5f\xe7\xe1\x28\xbe\x0b\x7f\x99\x9f\xbc\xfa\xf2\xfc\xfe\xd5\xf6\x19\xfc\xe3\x63\x9c\xf8\x2f\x7f\xa5\x7f\x2f\xfd\x8f\x0f\xd9\xe5\x55\x38\xf6\x7f\x89\x07\x7f\x5c\x05\x9b\xcb\x39\x9c\x9f\x9f\x3d\xdc\xff\xfe\xdb\x3b\x78\xfe\xcb\xaf\x27\xaf\x06\x83\xfc\xcd\xd5\xfd\xc3\xf9\x2f\xf7\xdb\xd7\xa7\x83\x6d\xd1\xf6\xf9\x69\xf9\xff\xf5\xf5\xd3\xec\xcd\xf5\xd3\xf9\xec\xec\xf9\xfd\xeb\xd3\xc1\xc3\x9b\xa7\x50\xf8\xfe\xfc\xf9\x60\xfa\xfa\xec\x39\x7b\xff\xd5\xf6\xd9\x97\xf0\xe5\xab\x8d\x3f\x7a\x7f\xf2\x6a\xf4\x2a\xfb\xfd\xe3\x45\xca\x7d\x96\x97\xe3\x7d\x93\xbc\xfe\x32\xf9\xdb\x25\x9e\xf3\x4f\x5a\x9e\x1a\x9e\x9c\x9c\x1c\x20\x42\x33\xaa\xf3\x9c\xba\xd5\xf1\x71\xcd\x92\x8e\x25\x0e\x34\xa0\xc0\x15\x97\x1e\x3f\xfd\x25\xf5\x43\x96\xe9\x88\xcb\x24\xfb\x99\x37\x17\x3f\x1d\x16\x6a\x60\x00\x97\x4b\x90\x84\x18\x16\x0b\x5d\x96\x3c\x1a\xbd\x29\x3f\xef\x3e\x8c\xd0\x98\x06\xff\x83\xcd\x63\xc4\x26\xa2\xb7\x83\x66\x39\x64\x90\x26\xf0\xf6\x36\x43\x78\xe7\xe5\xfb\xc5\xd7\x1e\xba\x0d\xbb\xc5\x8d\x35\xfd\x8b\xe7\xdd\xae\xe3\x18\x7f\xf4\x57\xbd\x4b\xae\xa6\x71\x7e\x78\xba\xe6\xfd\x28\xc9\x2b\xdb\x57\x6e\xbf\x1d\x52\x96\x86\xa9\x7e\x1b\xca\xd6\x4e\x7d\x47\xd2\xd6\xad\x9c\x86\x6d\x9b\x18\x72\x1b\x1e\xb7\xdc\x99\x68\x77\xd8\xfe\x9b\xdd\x61\x9b\xfb\xd9\x9d\x37\x4f\xe1\x7a\xf5\x3d\x78\x2a\x9f\xbe\x89\x4e\xbf\x04\xd9\x1f\x15\x9e\x4a\x39\x5e\xb6\x91\xd7\x12\xdb\xfe\x29\x10\x69\xbf\x24\x8e\x46\xd7\x46\xb8\x08\x25\xc8\x25\x85\x27\x55\xbe\xb2\x04\x8c\x71\x05\x85\xcd\x00\x01\x5a\x11\x63\x5b\xeb\x82\x34\xc0\x20\x8b\xfd\x2a\x01\xd5\x92\xb1\x92\x1f\x57\x16\xf8\x72\xde\x27\xe9\x77\x20\xde\xac\xf0\xc5\xc3\x9b\x15\x6b\x9c\x79\xd9\xc2\x0f\xe1\x7d\x0c\xb2\x8c\xe6\x18\x3a\xb3\xf5\xb2\x50\xea\x63\x70\x9b\xd3\xd8\x7c\xcd\x85\x35\xc5\x48\x91\x67\x60\x15\xc3\xed\x52\x0a\xd1\x43\xf7\x16\x14\x8b\xe3\xa0\x95\x28\x48\x9d\xe8\x40\x61\xb9\x0f\x6f\xb8\x60\x50\x86\x28\x8f\x6a\xcb\x13\xcc\xe6\xaa\x18\x0f\xf2\xfc\x35\xc9\x91\xac\xa8\x59\xbe\x9b\x99\x00\xe3\x51\x30\xb8\xbc\x07\x54\x18\x50\x2c\xf3\xa5\xbd\x84\x8a\x18\x7f\x6f\x28\xee\x47\xc9\xa1\x8f\x49\x4e\xd3\x45\x75\xca\x07\x91\x14\xac\x76\x86\x53\x0a\xac\x2e\xaa\xba\x70\xc0\x43\xd5\x68\x60\x01\x92\x57\x17\xfc\xb7\xa3\x4d\xa1\xa3\x25\xf3\x1f\xf6\x72\xc9\xde\xaf\x76\x5e\x30\xc1\xbe\xd0\x7e\xbd\xb4\xe7\xab\x3e\x17\xd4\x88\x50\xce\x4b\x2c\x7c\x44\x24\x9c\xa1\xfd\x46\xf0\x20\x1f\x69\x13\x5a\x4f\x59\x7a\x1b\xca\xfc\xbb\x60\xa5\x54\xb4\x32\x73\xbd\xa4\xa7\x8f\x14\xff\x58\xa1\x36\xd4\x04\xa8\xb4\x81\x5a\xd6\x37\x4a\xd6\xe8\xd8\x30\xf8\x14\x20\x37\x72\x78\x7a\xf9\xde\x5c\xd8\xab\xa2\xdd\x93\x9a\x76\xdf\x60\x40\x61\xea\xfe\xcb\xc9\x0a\xb8\x6f\xa2\x67\xae\x65\xcc\x8f\x65\x4f\xcf\x57\x0b\xb0\x04\xa9\x1f\x9f\x45\xd9\x9d\x75\x87\x86\xe8\x15\x9a\xe8\x8b\x21\x28\x51\x05\x26\x14\x6a\xce\x5b\xbf\xca\x38\x35\x11\xfa\x77\x9d\x15\xc7\x62\x19\x92\xca\xea\xb3\x78\x0b\x90\xe6\x5f\x74\x5f\xcc\xb6\x39\x5a\xcf\x26\xea\xa3\xa8\xe5\x75\x6a\xad\x41\x4d\xc7\x70\xef\x71\x2d\x4f\xd3\x5f\x3e\x5e\x5e\x5c\x9d\x1b\xd0\x0f\x13\x48\xf0\x28\xf5\x05\x93\x06\x9c\x1a\x95\x47\xb7\x11\xa9\x1e\x13\x65\x1e\xc3\xc3\xae\x0b\xd3\xaf\xc2\xef\x32\x3c\x5c\x25\x51\x4d\x55\x46\x27\xfc\x4b\xa7\x88\x11\x1d\x04\xb9\xed\xc4\x70\x9e\x69\x4f\x3d\x31\xc6\x9c\xbc\x7a\xbd\x00\xe8\x0d\x54\x3b\x13\xc1\x63\x14\x2b\x8d\xea\x52\x46\x89\x8f\x0a\x52\x44\xb3\x18\xf4\x9d\xd3\x05\x08\xee\x9c\x7c\x01\x9c\x00\x26\x21\x4a\x42\x76\xe0\x2d\xfa\x20\x81\x21\x40\xbf\x94\x5c\xef\x44\x99\x03\x93\xbe\xf9\xf4\x6d\x90\x50\x6a\x0f\x6c\xa6\x3d\xd7\x85\x43\x9a\x26\x24\xd4\x5b\xd8\x75\x56\x7e\x89\x7b\xb4\x50\xca\xe6\xc3\xf2\xed\x9d\xbf\xb5\x25\x88\xfe\x3e\x6f\x3e\x04\x1b\x62\xe0\x11\x42\x19\xe0\x3d\x87\x43\x61\xf8\x87\x92\x86\x5f\xa1\xbb\x2f\x71\x5d\x8d\xe2\xa6\x1d\xc2\xd2\x43\xd7\xa3\x70\x23\x44\xdc\x8e\x24\x0a\x61\x88\x66\xc9\x5d\xf7\x86\xd4\xd7\x10\x5b\x62\xe3\x65\x9f\x6b\x49\xd7\xc9\x0c\x40\x9a\x0a\x33\x10\xb2\x59\x1a\xce\x81\x6f\x8b\x9f\x03\xfe\xdc\xce\x98\xc3\x85\xce\xaf\xe3\xd8\x4b\xa5\x02\xc0\xb2\x39\xc4\xbc\x0b\xee\x17\x11\x81\x8f\xa9\x73\x33\xcd\x61\x0e\x5f\x62\x0e\xaa\x63\xef\x97\x94\xd1\xf4\xc6\x99\xae\x46\x73\xed\x47\xb1\xc5\x68\xc8\x63\x8f\x39\x1a\x9c\x1b\x76\x85\x3c\x24\x92\x2f\x5a\x07\x7d\x20\x38\x68\xd0\xa9\x8c\x3d\x2b\x88\xdb\xae\x72\x14\x3b\x72\x45\x74\x13\xb7\x90\xc9\x4e\xc6\x3d\x52\x31\x55\x03\xf6\x0f\x4a\x4b\xb2\xe9\x7b\x09\xc2\xc8\xf7\x56\xfe\x3a\x43\x80\xdb\xf8\xaf\xd8\xa7\xb6\x93\x7a\xad\xbd\x5e\x58\xe9\x54\xba\x6a\xf4\xcc\x62\xb7\xa5\x77\xc5\x4f\x64\xa1\x9b\xd1\x9c\x67\x83\xf1\x87\x4f\x57\x62\x13\x45\xc6\x1e\xac\xae\x73\x33\x2e\xf7\x3a\x79\xf0\x86\x2f\x49\x51\x3c\xf6\x86\xc8\x80\xf2\x92\xc6\x13\x4c\x8d\x15\xab\x45\x71\x63\xfa\x21\x46\x33\x47\x45\x33\x99\xaa\x28\x79\x24\x5b\x68\x7c\x31\xec\x16\xf0\x1a\x35\xfa\x1d\x98\x09\xe7\xc7\xbf\xff\x74\x1e\x3c\x28\xde\xd1\x26\x55\x2f\xa7\xa2\xd1\xcb\xed\xb9\xb8\xb6\x24\x41\x29\xe5\x2b\x69\x69\xc0\xb9\xea\x2b\x15\x6a\x71\xb0\x74\x1d\xd2\x42\x07\x65\x95\xcb\x2a\x7b\x53\x47\xd5\x2d\xdb\x5e\xad\xeb\x2c\x8d\x8d\x0b\x16\xe2\x91\xea\x51\x49\xfb\x98\x4e\xba\xd3\x9a\x50\x50\x5f\x92\x06\x63\xcd\xb7\x35\xcb\x6a\x2c\xb2\x1a\x23\x29\x12\xa7\x44\x29\x44\x30\xf6\xa6\xd8\x4e\x51\x44\x95\x8b\xc3\xd9\x44\x5d\x9b\x28\xd4\xa6\x36\x61\xb3\x0d\x98\x0c\xbf\xb8\x9e\x2a\xb3\xb4\x69\x4f\x4f\x0d\x86\xfa\x10\xfb\x59\x8e\x25\x81\x90\x9b\x2a\xef\xa1\xa6\xef\x2b\xc4\x51\x01\xf3\x80\xfe\x7a\x70\x01\x1d\xd2\x4c\x25\xf3\x37\xa5\xa6\x84\x3c\x57\x3b\x95\x66\x68\xdb\x66\x53\x96\x9a\xca\xe1\xd6\xa0\xbf\x89\xa3\x23\x3f\xb0\x25\xe9\x0d\x5c\xeb\xb0\xdf\x64\xd0\x37\x7b\x74\x03\x15\xb1\x5c\x13\xf9\xcb\x80\x1e\xf0\x20\xf4\x00\x2f\x3f\x9b\x63\x7c\x5d\x11\xaf\x32\xca\x4e\xaf\xce\x4d\xd9\xeb\x76\xb5\x03\xb3\xa8\x4f\x4c\x6b\xe4\x67\x29\x76\x4e\x38\x72\x0e\xb9\x14\x02\x86\x3f\x16\x65\x97\x20\x45\xc0\x76\x8c\xac\xcf\x1f\x72\x52\x59\x9b\x43\xdc\x23\x2f\xdc\xdc\x48\xd3\x3f\x03\x41\xec\xa7\x14\xe1\x60\x45\xdb\x92\x05\x5a\x4f\x04\xc8\x55\x3a\x42\xa2\xc1\x7d\xc2\x01\x85\x2a\xb5\xf0\xec\x0a\x1b\x68\xce\x9a\x3d\x9f\xb6\x96\xcf\x6c\x51\xa3\x45\x8e\x64\xa3\xd5\x89\x07\x03\xb0\x00\xc3\x17\x51\x60\xf7\x6d\x8d\xbe\xf6\xd5\xde\x4c\x47\x11\x5f\x66\xed\x13\x8f\x5c\x3a\x1c\xf2\xfc\xcb\x1b\x35\x82\xd5\x9a\xaf\xfa\x38\xae\x29\xdf\x66\x55\x1e\x92\xaf\x37\xc2\x57\x79\x7b\xcc\x6a\xcf\xa7\x70\x1d\x87\xc9\xff\xfb\x7f\xe7\x4e\x00\xe3\x18\x04\xb9\x43\x6a\xd2\x59\xb8\x2b\x1e\xa9\x46\x78\x65\xa9\x02\xde\x03\x81\x1c\xa6\xc8\x7d\x54\x5f\x67\xa7\x0a\x59\x75\x38\x96\x16\x16\x45\x64\x71\x9b\x5e\xda\x1e\xce\x81\xb8\x5b\x7a\xda\x86\x0a\xee\xa2\xac\xa0\x77\x0e\x68\x15\xd5\xf2\x30\x58\xa5\x70\x8e\xb3\x5c\xcb\xdc\x7f\xfc\x89\x13\x95\x38\xb4\x88\x00\x64\x8a\x23\x51\x53\xc6\x53\x61\x39\x4f\x2c\x04\x1d\x07\xc5\xbb\x4a\xb4\x9b\x66\x57\x6b\x9b\xd1\x0e\xd8\x16\xe8\xa6\x4c\x53\x6e\xa0\x34\x7f\xed\xdd\xbd\x2c\x9d\x2d\xfb\xb3\xc1\x4b\x6e\xff\xd7\xdb\xe9\x3b\x6e\xf0\x89\xba\xb6\xad\xf7\xf8\xa4\x66\x8f\xd7\x39\xea\x76\xda\xf5\xd8\x98\x5a\xb3\xef\xd9\x0c\x77\xde\xfa\xba\x96\x1e\x67\xf7\xdf\x70\x0a\x2d\x33\x03\x31\xec\x7e\x4d\x81\x51\xc1\xb1\xc8\x15\x90\x13\xd0\xf0\xf4\xa0\xc3\xac\x2e\x1e\x79\x14\xf7\xeb\x25\xb8\x14\x97\x06\xd2\x58\x72\x37\xb6\x76\x32\x3e\x8a\x7b\xf1\xfb\x48\xc5\x7f\xf5\x10\x4d\x9f\xfd\xb2\xfe\xb0\x2f\xa9\xf8\x99\x2e\xaf\xbd\xc2\x92\xc2\x12\xf3\x0d\x91\x6e\x96\xf6\x94\x6f\x96\xc6\xdf\x78\xbe\xc8\x21\xfa\x15\xa6\xfb\x1a\x39\x5e\x5b\x4d\x95\xd6\x52\xe5\xcc\xf5\xb7\x51\x0c\xb2\xd7\x51\x72\xf7\x94\x75\x2a\x0c\xa1\x95\x15\xad\x7f\x9b\x79\x29\x84\x3a\xfc\xa1\x4e\xac\x69\x2f\x8a\x41\x77\x0b\x80\x20\xc8\xc7\x16\x92\xea\x11\xb0\x10\xb0\xe3\x67\xdf\xe5\xd4\xc7\xcd\xdb\xc3\x25\xf8\x5d\x09\xa2\x15\xb2\x34\x83\x05\x08\xee\xf8\xcc\xd0\x28\x7b\xca\x71\x98\x3e\x7b\x54\xa8\xce\xcb\x69\x39\x42\xf6\x67\x20\x25\x63\x0e\x54\x70\x45\x98\x5c\x63\x4a\x0a\xe6\x30\xe4\xe5\x42\xe3\x9a\x41\xae\x66\xa2\xa2\x56\xf3\x6a\x65\xd1\x8a\x39\x87\x93\x4f\xbf\x2d\x59\x4d\x97\xce\xc6\x1c\x35\x6d\x92\xad\xf1\x30\x3a\xe6\x34\x52\x57\x7c\xbf\x59\xed\xcd\x7c\xb3\x79\x7a\xf7\x9b\xcc\x6a\x0d\x2a\x83\x50\x21\x43\xdd\x8b\xda\x43\x53\xb3\x8e\x4c\xe3\x32\xe6\x26\x36\x5d\x43\x34\xd0\x8e\x17\x71\x05\xbd\x4d\xf4\x65\xdf\x57\xf1\x79\xbe\xc9\x07\xf3\x77\x47\xc2\x2a\x0e\xb1\x62\x53\x46\x50\xd0\xd9\x70\xe8\xea\xc4\x47\x1a\x15\x97\xa9\x53\x12\xd1\x84\x4f\xab\x0c\x7d\xe6\xd1\x30\x27\xb4\xae\x52\xa0\x04\xf2\x81\x44\x71\x78\x0d\x57\x30\x86\x73\xe1\xaa\xaa\x3e\x4a\xaa\xa1\x3f\x8f\x49\x18\xae\xfc\xac\x90\x93\x0b\x72\x90\x2e\xa3\x04\x7c\x88\xc0\x7d\x41\xf6\x53\x56\xcd\x41\x89\xc4\x90\x3c\x57\x7c\x79\x34\x1a\xd0\xd5\x73\x9f\x44\x39\x58\xa2\x5f\xee\xa3\x7c\x71\xb5\xf2\x03\xea\x50\xae\x24\xc4\x10\x8d\x8a\xc5\x93\x93\x69\xf2\xf8\x5b\x19\x17\x28\x6a\x85\xe6\x3d\x91\xe0\x4d\xc8\x15\x1a\xbb\xba\xf9\xee\xd1\x27\x67\x20\x41\xae\xfd\x27\x38\x45\x8b\xc1\xd1\xc0\xa4\xac\xc3\x72\x45\x2b\xc3\x0a\x9f\x92\x14\x7e\xf1\xc3\x67\xf1\x3a\xc5\x9f\x5d\xc0\x10\x90\x17\x45\x44\x15\x8a\xc3\x8c\xc7\x75\xae\x90\x84\x3b\x49\xd0\xd8\x6e\xb4\x04\xe2\x87\xcb\x3d\xe1\x67\x19\x0c\x22\x3f\x07\xe5\x90\xc4\xfa\xbf\x0b\x78\xcf\x83\xa8\x90\x8f\x17\x51\x08\x34\x1f\x17\x4f\x17\xf3\x38\x23\xb5\x3b\xaa\x90\xa3\xb9\x3b\xa3\x12\x55\xcc\x01\xa5\xa0\xac\x29\xce\xd6\xe1\xcf\x32\x18\xaf\x73\x20\x6d\x99\x45\x34\x5f\xa0\x50\x71\xb1\x8c\x17\xc1\x53\x45\xe1\xe6\xa5\xb6\x87\xbb\x98\xca\x79\x09\x57\xf9\x36\x06\x8a\xa3\x18\xd9\x8f\x26\xe5\x4e\xd0\xf7\xa4\xb5\x5a\x08\x45\xcf\x8a\x1d\x9c\xfb\x79\x14\xd4\x38\x7b\x76\x80\x99\xe9\xb9\xaf\x70\x14\x7b\x7b\x80\x98\x91\x5c\x34\xf0\x33\x9c\xc9\xde\xdb\x03\xd7\xfc\x38\x8b\x1c\xbe\x28\xdf\xa8\xc5\x97\x91\x4c\x74\x9a\xaa\xda\x17\xd4\xef\xa2\xe0\xfd\x58\x92\xce\x86\x78\x17\x7c\xe4\xbf\x6d\x45\xca\x86\x44\xa4\xce\xa3\xa4\x8a\x3c\xb5\xb1\x04\xe5\xe4\x3b\xe1\x1a\x6a\x9b\x6a\xcd\x38\x92\xdf\x76\x24\xda\x4a\xeb\xe3\xc4\x2b\x8d\x46\x1d\x4d\x12\x19\xd9\x77\x9d\xe1\x11\x37\x43\xc1\xd7\xd3\x60\x3e\xba\xb5\x1d\x95\xce\x30\xe9\x6b\x13\xdc\x78\x55\x65\xc4\xe1\x90\x65\xd3\xe3\x88\x11\x6a\x2d\xc5\xda\x86\x07\xc2\x39\x40\xd7\x5b\xf5\x9c\x4f\x41\x16\x7d\x01\xcf\xf1\x03\x86\xa3\x9d\x5f\x92\x39\x55\x43\xf3\xd4\x4f\xb2\x5b\x98\x2e\x29\xe6\x0f\xfa\xa0\x50\x8c\xfe\xc2\x21\xdf\x84\x73\xf0\x96\x26\x93\x3e\x20\x01\xdd\x33\x7c\x8b\x82\x3f\xdc\xbf\xea\xc5\xf1\x48\xeb\x49\xe6\x33\x18\x08\x8e\xb6\x38\x0f\xa3\x27\x9e\x9f\xd1\xca\xcf\x17\xa5\xd4\x2e\xc6\x44\xa7\x18\x32\xa0\x2e\xdd\xdd\xa8\x38\x05\xed\x8a\xa5\xd4\x6c\x6e\x19\x29\x24\x0c\x64\x87\x2d\x19\x94\x10\x16\x17\x46\xa1\x17\x25\x19\x40\x50\x57\xf7\x51\x12\xc2\x7b\x0f\x2f\xa6\xdb\x73\x6f\x63\xf0\xe0\x2d\xfd\x0c\x26\xc8\x6c\x4b\x19\xe1\x40\x50\x77\x62\x90\x9b\x73\x27\x2a\xb2\x2d\x74\xd6\xd4\xa6\x17\x05\x3c\x9e\x47\xb9\x29\x08\x93\xdc\xef\x4b\xc3\x74\x9b\xfc\x99\xbf\xfc\xdb\x67\xa3\x35\x54\x08\xee\x2c\xf7\x33\x0f\x3e\x5b\x97\xab\xa5\x06\xb4\x17\x5a\xd5\x02\xd5\x77\xac\xb0\xa1\x6a\x8b\xe6\xd3\x88\x08\xed\x41\xa6\xc8\x54\x21\x3a\x4b\x81\x5b\x61\x7c\xc5\x2b\xa2\x5c\x4a\x16\xd9\x53\xe8\x5b\x5d\x4a\x46\x83\xee\xd0\xb0\x61\x08\x74\xed\x5f\xa0\xcf\x9b\x35\x8f\x02\x6b\xfd\x10\xe8\xb2\xaa\x06\xbc\x4c\x9a\xcf\x53\x30\xf7\x73\x7e\x8e\xef\x00\x8e\x8e\x40\xd5\x11\xeb\x8f\xcc\x52\xf9\xaa\x6c\xbf\x98\x45\xe3\x96\x7b\x15\x51\x91\xb6\x53\x50\xce\x44\x65\xc0\xfa\xd6\xe4\x01\x57\x9e\xad\xca\xf2\xd4\x30\x39\x2e\xfc\xa4\x65\x6d\x35\x92\x49\xb9\xa1\x72\x57\xd2\x11\x77\xff\x2c\x99\xa8\xbe\x60\xb7\xfe\xae\x99\xb0\x80\xea\xaf\x78\xa7\x1c\xe3\xd1\x4f\xf0\x8f\x29\xfe\x71\x88\x7f\x1c\xe1\x1f\xc7\xf8\xc7\x89\xe6\xee\x46\x6e\x6f\x63\x4d\x9d\xad\x1a\x5b\x74\xed\xd5\xfa\x6b\x53\x83\x1e\x9e\x82\xf3\x4e\x75\xed\x89\x07\x27\x3a\x69\xd9\xc1\x92\xe0\xd0\xf6\x36\x27\x1d\x77\x28\x3d\xce\xa1\x87\xc9\xb9\xdf\xc7\xdd\xfb\x7b\x98\x3c\x1b\x3d\x5f\xdb\xd9\xc8\x3c\x94\x19\x47\x6e\xfd\x53\x5d\x89\x7b\x49\x9e\x17\x37\x6e\xb0\x5c\xe5\x5b\xa3\xad\x2c\x05\x31\xf4\x91\xec\x31\xe8\xba\xae\x18\xd8\x3e\xd4\x85\xc8\x8e\xcc\x57\x0e\xb5\x58\x21\x2d\xc1\x9f\x9d\xa5\x7e\x94\x28\x15\xc0\xb5\x27\x4d\x65\xf4\x46\x1c\x81\xa4\x38\x80\x9c\x90\x35\xa8\x9c\x41\x63\x56\xb8\xda\x83\xeb\x9c\x16\x5e\xd7\x14\xb0\x36\x25\xf0\xca\x11\x32\x7c\x95\x4c\x36\xa3\xe7\x71\x34\x8f\x66\x31\x30\x44\xbd\xb4\x9e\x58\x94\x00\xd6\xb2\x7e\x6a\x68\x66\x41\x0c\x71\xb5\xc9\x9a\xf0\x13\x2d\xaa\x2d\x77\xd2\x68\xa2\x12\x4d\xea\x0f\x37\xfd\x8a\xeb\x7c\x43\x3d\x48\x44\x13\x31\xeb\x3b\xed\x55\x92\x69\xb3\x5b\x7a\xcf\xed\x19\xc2\xb3\x2d\x2e\xc1\x16\x76\x0c\xf3\x85\xd5\xc5\x82\x80\x81\x61\x89\xde\x0d\x98\xfb\x31\xad\x9f\x74\xd3\x73\x57\x04\xc3\x55\xb7\xcb\x13\x5a\x54\x46\x30\x6f\x1f\x71\xcf\xac\x57\xa1\x9f\x83\x77\x86\x27\x8f\x2d\x5a\x3b\x41\xa8\x1a\x70\x9d\x01\xb8\xe6\x20\xc2\x7d\xf1\x1c\x32\x5f\xa9\x29\xa7\x69\x30\xe5\x44\x56\x0c\xe2\x68\x75\x49\xef\xa8\x0c\x6c\x96\x85\xe6\xf8\xd9\x1d\x07\x2c\x6b\x36\x33\xa6\x44\x29\x20\xf5\xb1\x90\x43\xba\x12\xa7\x6c\xca\x70\xca\x84\x0e\xc3\x68\x89\xc3\x86\xb3\x8f\xe8\x5b\x7e\x2d\x8a\x77\xb4\x8b\x57\x74\xa7\x59\x3b\x14\xc3\x55\x74\x3f\x5a\x3d\xd0\x01\xa0\x73\x97\xfe\xad\xc1\xab\xb2\xcb\xf8\x2d\xd9\x8c\xcd\xbb\x3c\x61\x8a\x3d\xec\xcd\xfc\xe0\x6e\x9e\xc2\x75\x12\xca\xa5\x6e\x33\xac\x33\xd0\x22\xb7\x99\x97\xb1\xbf\x7b\x2e\xf7\xf0\x90\xa6\xe6\xe6\x20\x15\x6c\xcd\x23\x01\xe2\x8d\x20\x68\x35\xe5\xeb\x91\x44\x9b\x91\x44\x1b\x8e\x0b\x69\x9a\x25\xbd\x59\xa1\xe1\xea\x4f\x39\xa3\x0d\xd6\x70\xaa\xaa\x56\xee\x21\xb5\x01\x95\xf4\x2c\x59\x42\x32\xd2\xeb\x2c\x57\x62\x1c\x06\xa1\x8c\x95\x31\x69\xe5\x87\x61\x94\xcc\x5f\x93\x6c\x1f\xde\x92\x44\xbe\x12\x4c\x48\x87\x2d\xf8\xd7\xb4\x48\x06\xfe\x2d\xd6\x64\x05\x11\x03\x78\x65\xc5\x56\x1c\x8f\x27\x4b\x89\x18\xf8\x1b\xc0\x43\xe4\x02\x3f\x7d\x49\x5d\x0b\x95\xa6\x37\xd9\xf8\x46\x0a\xdc\x31\x13\xae\x31\xf4\x95\xe0\xab\xe3\x47\x71\xe1\x75\x8d\x31\xbd\x6c\x9e\x15\xc5\x92\xb4\x1b\xf9\xac\xe6\xcc\xc7\xb6\x86\x40\xcd\x50\x34\x06\x41\xed\x53\x5a\xc3\xe0\x9b\xea\x83\xc6\x44\x84\x77\x60\xe9\x47\x44\x9e\x57\x10\x42\x94\x95\x8c\x63\x38\x99\x41\x27\xff\x20\x73\x97\xbe\x37\x3a\x57\x5e\x50\x6a\x99\xd3\xf4\xfa\xbd\xbd\xac\x5d\x68\xe4\xac\xce\x78\xc9\x51\x6b\x64\x88\x85\xe6\x4f\x55\x61\x68\xaa\x89\x95\x13\x20\x7d\x54\x2d\x54\x4f\x5c\x8d\xf4\x98\xf9\x29\xad\x88\x40\xa1\xa3\x89\x2f\xa9\x94\xb6\xba\xe0\x6c\xad\x59\x9c\xb4\xe2\x8b\xae\x3a\x35\x08\x4d\x10\xe4\x63\xd9\x7d\x53\x75\x04\x30\x41\x51\x9c\xcb\x1e\x32\x1e\x93\x89\xac\xd3\xf8\x2f\xff\xce\xa3\xcc\x93\x93\x59\x10\x49\x05\x19\x3d\x0e\xe0\x06\xd1\x8a\x2e\x9f\x32\x10\x71\x54\xec\x98\x97\x65\x0b\x35\x76\xea\xf2\x0f\x0c\x8e\xd2\x2a\x4a\xe9\x34\x1d\x39\x95\x9f\xef\x02\x13\xa7\x45\xfb\x06\xcf\x9d\x66\x23\x6a\xf6\x4b\xd1\xba\xcd\xb6\xb0\x5b\x64\x71\x2e\x20\x2c\xa5\xbd\xb2\xaf\xa4\xde\x1e\xa4\x31\xa9\x3b\x7d\xdb\x6c\x28\x83\x3e\x32\xf3\xf1\x5a\x12\x12\xc7\x5b\x90\x7a\x5a\x74\x58\x2a\xf6\x85\xd0\x74\x79\xcb\xa8\x9b\x0b\x69\xff\xf8\x06\x29\xd6\xa8\xa9\x78\x67\x05\x92\x90\x7b\x45\x7f\xf1\xfb\xb1\x8a\x35\xab\x38\xd4\xaf\xa2\xc9\xe7\x6b\xba\x58\xe9\xdc\x4f\xb5\x3e\x55\x4e\x87\x40\x77\x39\x0b\x05\x22\x58\xad\x3b\xd4\x1e\xa8\x5f\xb6\xa1\xea\xc0\x06\x61\xd6\x1b\xb8\x47\xb4\x4a\xc3\x69\x53\xa5\x21\x58\xad\xbf\x96\xc6\x20\x74\xa5\x53\x17\xb6\xd2\x7b\x5b\xe2\x39\x6d\xa0\x56\x48\x7d\xec\x8d\x4e\x21\xd9\x14\xba\x53\x28\x26\x9d\x28\x14\x93\xc6\x0a\xc5\x64\x5f\x14\x0a\x65\x20\x8f\xab\x50\x98\x28\xd5\x95\x42\x51\xdb\xfe\x4e\x0a\xc5\xa4\xd9\x51\x54\xb3\xc8\xdd\x1c\x45\x13\xab\xa3\xa8\xe1\x50\x7e\x2f\x45\x87\x2a\x4d\x3a\x57\x3c\xd4\x4d\x58\xaf\x78\xa8\xef\x74\xae\x78\xfc\x58\xed\x8a\xd5\xee\x48\x41\x99\xd8\x2b\x28\x86\xa3\x59\x17\x64\xc9\x69\x30\xc8\xdd\xe3\x89\xc5\xbc\x07\x72\x75\xef\x9e\xfb\xbc\x78\xcc\xc1\x2e\x86\xb2\x23\x2d\x7a\x49\x3d\xec\x40\xe9\xe1\xe4\x5c\x97\xc4\x2d\xc0\x12\x25\xb1\x6a\xa5\x24\x30\x0a\x41\x3b\x62\xbd\x7d\x21\xd3\xb0\x41\x34\x4e\xd1\x24\xb6\x66\x6b\xe2\x80\x70\xf4\x90\x36\xfb\x11\xe1\x68\xdd\x92\xaa\x43\x2d\x9d\x9a\xc5\xac\xbb\x75\x67\xde\x43\x54\x55\xca\x23\x40\x6d\x7b\xee\xd0\x7c\x98\x3d\xfb\xe9\x6c\x71\x3e\x30\xe0\xa5\x46\xd9\x79\x18\x0b\xb8\x3d\x94\x85\x39\x1c\x3a\x19\x02\x5e\x32\xa1\x22\x29\x88\x38\x20\x0a\x63\xf0\x8c\xbc\x77\x53\xfb\xbd\x2b\x64\x09\x13\x37\x20\xb6\x60\x47\x99\x17\x2d\x0b\xa2\xfa\x49\xce\xa5\x10\x53\x71\x63\x51\xf0\xae\x1a\xda\x6f\x95\xc2\xe5\x2a\x7f\x01\xd3\x53\x98\xdc\x46\x05\xdb\x62\x34\x13\x4b\x3c\x6c\xe2\x7b\xa2\x34\x0c\x63\xc0\xe1\xc7\x9b\x02\x10\x74\xb9\xf5\x51\x76\x89\x0f\x0d\x71\x1c\xca\x6a\x28\xa5\x3a\xcb\xa7\x31\xf4\xbe\xab\xa1\x36\xff\xd4\x9b\x12\xa0\xc9\x95\x2d\xe0\x71\x34\x4f\xde\x31\xe5\x39\xca\x30\xf0\xa4\x87\x3e\x57\x3c\x0a\x68\xd4\x28\xdf\x9d\x4c\xb9\xe7\x32\xb4\x03\xfc\xb9\xab\xf5\xf3\x88\x24\xd3\x0f\xcd\x4c\x3d\x3b\xb6\xe4\xb8\xa8\x84\x20\x30\xf1\x6a\xe0\x27\x01\x88\xab\xb8\x55\x7e\xc2\x25\xa0\x85\xae\xb6\x68\x1c\xa5\xe6\xbd\x1f\xe5\xea\x82\x5a\x30\xa5\x00\x48\xab\xaf\x70\x78\x0d\xf1\x6e\x95\x75\x12\x5d\xea\xdd\x29\x1a\xbd\xa2\x80\xb6\xe4\x71\x4c\x8b\x5a\x2e\xb7\x5e\x27\xdd\xda\x18\x48\x87\xe8\x1e\x43\x9f\xe8\x56\x32\x33\x2a\xfc\x5e\xb9\xa4\xf2\x23\x0a\xec\x6b\xd7\xab\x4a\xbb\x6c\x2b\x5c\xc8\xeb\xd6\xf2\x85\x8b\x19\xa8\xc0\xa9\xfc\x73\x0d\xd6\x8d\xe3\x84\xc4\x83\xaf\x83\x43\x35\x8b\xf6\xfd\xf4\xfc\x02\xdf\x67\xc7\xbe\x1f\x9b\x8b\x8c\x27\x95\xd5\x9a\xd1\xed\xe3\x90\xdf\xda\xec\x25\xfe\x7d\x1d\x2a\x20\xb7\xd8\x52\xe6\xf4\xca\x9f\x03\x2f\xf6\xb7\xc8\xa9\xef\xb2\x15\x2a\xf4\xa7\x42\xfc\x21\xa5\xb9\x7e\x61\xb3\xa8\x93\x15\x3c\x58\xc5\xeb\x79\xb4\xff\x15\xfe\x4e\xcf\x5e\x6e\x0f\x0e\x1e\xd2\xea\x72\xf1\x41\xba\x5e\xe2\x9a\x1b\xe5\x4e\xa6\x5f\x52\xe3\xa0\x9f\x62\xfc\x75\xf7\x2a\x87\xa9\xcf\xa7\x40\x8f\x28\xc6\x1c\x46\x60\x28\xc1\x93\x38\xeb\xc2\x21\x1f\xb1\x64\x66\x06\x61\xc1\x67\x29\xf0\x43\x3c\x34\x74\xda\x2e\xb8\xa4\xf9\xf6\xcb\x4f\x57\xae\x53\x36\x38\xa0\xe0\x13\x7b\xcd\x0c\xab\x97\xaf\x8f\xd3\xf5\x8b\x8f\x42\x94\x9f\x10\xbf\xec\x9e\x5e\x9d\x3b\x97\x84\xb5\xb5\x58\x8e\x8f\x8e\x08\x32\xd4\x21\x64\xc8\xb8\x18\x3c\xa2\x21\x21\x7d\x3d\x90\xc5\x07\x52\x5d\xe4\xa6\x39\x96\x85\xf5\xa0\x28\x73\x59\x0f\x8a\x11\xbb\x25\xb8\x04\x09\x8a\xa3\xe0\xfd\xac\x68\x27\xf7\x81\xd1\x89\x10\x65\x2f\x60\x3a\x8b\xc2\x10\x68\x32\x97\xc4\x8c\x61\xa3\xbc\x56\xa3\x30\x39\xfe\x80\x30\x9e\xf9\xba\xf2\x12\xe6\x87\xbd\x28\x57\x80\x4e\xa5\x61\x63\x60\x4b\x53\x28\x8c\x63\x8c\xf2\xce\x80\x9f\x06\x8b\x6b\x90\x2e\x71\x10\x32\xad\xab\xed\x3e\x59\xc5\x7e\x00\x16\x30\x0e\x71\xda\x86\xae\xd2\x31\xf7\x32\x27\xd7\xc8\x83\x87\xaa\x26\x8a\x6a\x7a\x5f\xfa\xf3\x28\x51\x6c\xd3\x57\xa8\x29\x87\xb2\x4a\xbf\xef\xda\x20\xe4\x1a\xec\x33\x1a\x86\xe0\xf3\x37\x61\x9a\x83\x90\xe7\x31\x2d\x86\x2f\x5f\x1a\x88\x21\x60\x3e\x21\x96\x8a\x27\x2b\x52\xaf\xd4\xdc\x28\x8b\xf5\x99\x83\xab\xe2\x25\x5e\x09\x5d\xa7\x29\x48\x0a\x4a\x00\x8b\xf0\x7c\x7e\x50\xc7\xfa\x41\xc1\x34\xa7\x32\x92\xfe\x7d\x06\xb2\x80\x18\x21\x7b\x1c\x08\xf1\x27\x92\x1b\x10\x47\x99\x60\x63\x13\x9a\x90\x3e\xe7\x9a\x2a\xd4\xe4\xfb\x28\x5f\x78\xb7\x10\xe6\xa6\xed\xab\xe4\x2e\x1e\xb3\x68\x35\x5c\xa1\xc2\x4a\x5f\x32\x35\x51\x8c\xc8\x9b\x6d\x59\x2b\x05\x29\x56\x29\xae\x06\xe9\xa2\x0a\x54\xd8\xeb\xa0\x6b\xf8\xfc\x4c\xd5\xa8\x5a\xf6\x14\xc0\x24\x4f\x61\x1c\x83\x34\x7b\x89\x31\xbc\x0b\xf2\xc1\xb4\xbc\xb5\xab\xdd\x9f\xb2\x77\x1c\xfc\x4e\x67\xa3\x41\xa9\x1e\xd6\xe3\xb8\x80\x21\xe8\x7a\x04\xab\x14\x6e\x22\xe6\x78\xd4\xc8\x74\xfe\x7b\x6b\x04\x57\xd3\x50\x70\xce\x0c\x37\x8e\x3b\x80\x22\xbc\xb0\x1c\xec\x47\x46\x0e\xd0\xe5\x4b\x0f\x7b\x6e\x8e\x64\x1c\xc3\x2f\x17\x82\x24\xab\xfc\x40\x9c\x90\x43\x15\x2b\xb0\x00\x28\xe3\x83\x08\xde\x70\x73\xcf\x8f\x06\x0c\x5a\x7d\x90\x9d\xc3\xb6\xd0\xeb\xca\x91\xbc\xd2\x8e\xb7\xc7\xed\x23\x3d\x1d\xab\x9f\x37\xf2\x93\xd1\xdd\x5f\x33\x79\x4e\x82\xf3\xbd\x96\x7b\xf0\x1d\xf8\x73\x1d\xa5\xc4\xa3\xa0\x75\xb2\xb0\xcb\x34\xef\x4f\x1d\x70\x91\x23\x6a\xa3\x74\x43\xa1\xf8\x08\x76\x52\xd1\x0f\x7b\xee\x7b\x0e\xbd\xdf\xb4\x4c\x8e\xf3\x97\xf2\x12\x5f\xdb\xcd\x8d\x90\x92\x66\x7e\xe3\xf9\xc3\x8a\xb9\x63\xd1\x2b\x7f\x35\x26\x43\xd4\xcd\x91\x6b\xaa\x9c\xa4\x89\x84\xdf\x8c\x88\xdf\x86\x8c\x55\x34\x28\xc1\xe7\xe9\xce\x93\x13\x1a\xb0\x98\x7d\x9b\xc4\x32\x74\x81\x7b\xc3\x63\x4a\x2a\xae\xa9\xb6\x9b\xa4\xe5\x52\xf1\x47\xc7\x2e\x8b\x64\x58\x20\xa9\xf9\xca\xa5\x41\xcf\x6a\x17\x65\x57\xfa\x28\xf2\xaa\x3c\x8d\xcc\x6d\x19\xbb\xa1\xe1\x4c\x1a\x29\x87\xbe\x1a\x19\xbe\x52\xaf\x8a\x31\x20\x9a\x54\x05\x6e\x04\x91\xf2\xfc\x75\x8b\xe9\xe9\x9c\x62\xde\x44\xdf\xd6\xa5\x4e\x8a\xd4\xa3\x77\x57\x8c\xe5\xca\x35\x51\x07\x60\x32\xd0\xbc\xe5\x25\xeb\xe2\xda\x6f\x42\xed\x15\xd8\x95\x82\xb2\xe7\x7e\x9a\x67\x4f\x4b\x43\xe7\x3f\xfe\xfe\xdf\xe2\x13\x20\x09\xf9\xef\x1d\x78\x2b\x99\x4b\x45\x95\x5c\xc9\xa5\xb6\x5d\x6c\x5e\xf5\x18\x22\x45\x07\x6c\x04\xd5\xa3\x4c\xe7\xe2\x66\x5c\x3c\x15\xc1\x75\x66\xd0\x43\x58\xba\x31\xb6\x13\x2d\xc0\x26\x85\x09\xcd\xb9\x62\xa8\x8b\x16\x7a\x19\xca\xf3\x25\xde\x97\xea\x11\xd1\xa7\xac\x47\x43\x6b\x8e\xd9\x0d\x87\x33\x6a\xc8\xab\x8f\xef\x1a\xa6\xfc\x98\x0a\xe2\x6b\x3f\xc6\x22\xa8\x16\xe7\x5f\x61\x47\xec\x7c\x67\xd5\x45\xb4\xfa\x85\x2e\xba\x47\xbd\x59\x1b\x8f\x49\x4a\x07\xbe\x8a\xa3\xd0\x2d\x02\x34\xa0\x19\x8e\xe5\x31\xc1\x59\x97\x2a\x01\x60\x46\x86\x56\x0d\x19\xe4\xf4\xbf\xeb\x05\x70\x82\x78\x9d\xe5\x20\x75\xc8\xd5\x33\xde\x3a\x0b\x3f\x73\x12\xe8\xa4\x60\x1e\x65\xb8\xe6\x22\x67\xe7\xea\xdb\xc0\xfd\x48\xd8\xe0\xbc\x31\xa0\x3b\xd2\xbc\xf1\xf3\x60\xa1\xc5\x3c\xe8\x82\x34\x17\x90\x9a\x1c\x9c\x65\xd1\x11\x2a\x6d\x99\x83\x74\x59\x9d\x5a\xa9\x31\x7e\x34\x64\xec\xda\xac\xce\x0a\x75\x41\xce\x5d\x5f\xb9\x3d\x37\x77\x7b\x2e\xae\x7c\x25\xb8\x06\x48\x71\x3a\x0e\x61\x15\x39\x7f\x6e\xa9\x89\x8b\xed\x87\x1e\x99\x8f\x37\x83\x0f\xac\x78\x19\xf3\x11\x15\x3b\xd8\xe3\x4e\x01\xf2\x09\x3a\xc0\x68\xdc\xc6\xbc\x78\x03\x75\x9a\x45\x5f\x00\x89\x18\xe4\x43\x46\xc0\x9f\x0d\xad\xd1\xd8\x80\xdc\xad\x4d\x9a\x5d\x78\xf6\xda\x28\xfd\x7a\x9c\xff\x74\xb2\x38\x7f\x2f\x44\x6a\x8c\x44\x9f\xa2\x06\xd4\xb7\x74\x0e\xd4\xa1\x0a\xb9\x7a\x70\x09\xe6\xf2\xc0\xd9\xe4\x3a\x0b\xdc\xb0\x95\x03\xc3\xa5\x4d\x53\xee\xd4\x47\xf9\x08\xde\x8d\xdd\xdd\x19\xe4\xe7\x63\x70\xd0\x81\x90\x81\xb8\xdf\xdc\x74\x1b\xc1\xcb\xeb\xb3\x2b\x68\xe5\xe2\xe0\xc2\x47\xd4\xcb\x7d\xcf\x75\xf8\x79\xef\x91\x33\x84\x8e\xb5\xd2\x01\x41\xd8\x81\xfa\xa5\x84\x69\xca\xb9\x9e\x9d\xa3\x9c\xef\x3c\x6c\x91\xe3\x9a\x0f\x5e\x86\xd0\x7c\x74\xcf\x4a\x23\xef\x47\x13\xdf\x87\xa4\x52\x0c\xcb\x81\xe0\xf3\x8e\x7b\x9a\x9b\x34\x2a\x7b\x2d\x5e\x11\x34\xe6\x2b\xeb\x64\x6d\xd3\x58\x1d\x39\x6a\x0a\xd5\xb2\x86\xb3\xa8\xb8\xeb\xad\xe3\xd8\x23\x61\xbc\x36\xfe\x1f\x1c\x5e\xe1\x99\xfc\x45\x26\x39\x4e\xdd\xd3\x4f\xe0\x8a\xa6\x48\x3f\xc1\xe7\x31\x3e\xbc\x9f\x30\x84\x9a\x82\xd5\x88\x21\xb8\x8c\x17\xc2\x2f\x71\xf6\x61\x21\x44\x37\x82\x09\xf7\x95\x5c\xa8\x91\x7f\x3a\x7f\xe1\x07\x20\xff\x75\x0d\xd2\xed\xa5\x9f\xfa\x48\x2f\x74\xff\x5c\xd1\xb7\xab\xaf\xa2\x5d\xcc\xec\x7a\xbb\x02\xca\xbc\xd0\x87\xba\x59\xb1\x2f\x5a\xcc\x09\xbf\x5b\x35\x23\x13\x1b\xd5\xec\x3e\xc5\x6f\x25\xef\x62\x8d\x7f\x72\xda\xc2\x73\x65\xc0\xd7\xdd\xdd\x7b\x55\x0e\xeb\xf0\x3b\xf3\x5d\xb9\xbb\x7a\xae\x98\x25\x6a\x21\xd8\x09\xe5\x1a\xb5\x15\xb7\x1a\xc9\xc8\x77\x7e\x56\x77\x0d\x72\x45\xc9\x72\x8a\xb4\x02\x5d\xa9\x6e\xdd\x14\x2b\xfd\x3b\x38\x68\xfb\x1a\x57\xb4\xd4\xce\xfd\x0d\x0c\xa3\xdb\x88\xd8\xe0\xad\xbc\x38\x95\x1d\xf2\x16\x47\x4d\x6f\xf5\xee\x2b\x03\x49\xa4\xb0\x7a\xab\x97\x2c\x70\x8b\xa5\x37\x3e\x80\x94\x56\x45\x6c\xf2\x16\x8d\xc6\x68\xb6\xca\xf5\xd0\xb1\xd2\x1b\x95\x88\xba\x66\x9a\xba\x4d\x7c\x70\x48\x5d\x21\x0e\x57\x5b\x27\xb1\xe8\x75\xc7\x7a\x0f\x9f\x57\x25\x5b\xaf\x75\x00\xde\xdc\x24\x74\x26\x5a\xa3\x81\x56\xa7\xbc\x56\x9b\x67\x5d\xad\x5b\x5e\x67\x9b\xd5\x1c\x25\x8d\x6d\xb3\x74\x25\x9b\x5a\x66\x95\x79\x35\xb2\xcb\x96\xfa\x52\xa7\x56\xd9\x4a\x14\x4d\x1b\x0b\xca\xa3\x5a\x65\x4f\x5a\x18\x65\xdd\xc7\x31\xc9\x9e\xb4\xb1\xc8\x4a\xf7\xaa\xa6\xf6\x58\x2d\xc9\xb5\xfa\xcb\x4d\xbd\x25\x56\x61\xbf\x26\x76\x58\x1e\x3e\x34\x80\xcb\x59\x94\x18\x59\xc7\x64\x95\x6d\x6d\x78\x14\x34\xa2\xaa\x1c\xf5\x56\xa6\xc7\xeb\x05\x20\x96\x47\x6a\x88\xe5\x4b\x39\x99\x17\xa3\xc6\xc9\x5b\xbb\xc3\x3a\x27\x53\xb5\x7d\x76\x17\x12\x5d\x08\x34\x21\xf6\xd9\x2d\x5c\x33\x23\xb6\x73\x1b\xc5\x39\x48\x1d\xa6\xc1\x57\xd0\x8d\x13\xfe\x06\xbb\xab\xc1\xea\xba\xab\xbd\x75\xb9\x8e\xf3\x88\x58\x43\xbd\x30\x85\xab\x10\xde\x27\xbc\x6d\x15\x19\x64\x6b\x0c\xac\x98\x53\xf8\xbc\xe9\xa2\xef\xae\xcd\xad\xaa\x65\xeb\x51\x2c\x67\xdf\x45\x58\x70\xfc\x66\x3a\x18\x5e\x7f\x1c\xed\x6e\x33\xfb\x61\x24\xd3\x9d\x1c\x3f\x8c\x64\xca\x02\x57\xd9\xb1\x6c\x0d\x56\x7a\xab\x9b\x88\xcb\x2e\x94\x61\xad\x31\xc2\xa9\x48\xd5\x0e\xa9\x70\x8b\xb6\x60\x54\x1e\x8f\x06\x5b\x56\x45\xc5\x0b\xb2\x77\x58\x31\x9e\x2a\xdb\x47\x93\x88\x2f\xa5\xe7\x95\x1f\x99\xec\x67\x9a\xa7\x73\xe4\xd1\xe3\x6e\x57\x6a\xd0\x66\xd5\x5d\x4b\xc0\x7e\x35\x0f\x5f\x0c\x89\x21\xb8\x8a\x6e\xf5\x2b\x7c\x64\x8c\x56\xef\xfb\x8b\xab\x65\x16\xbb\x18\x29\x8b\x4e\xd1\x2b\x7f\xad\x57\x4e\xb4\x21\xda\x96\x2b\x52\xbb\x1e\x42\xf0\xaa\x59\xe9\xa8\x5c\x07\x35\x28\xa9\x62\x05\x94\xa8\x24\x0d\xed\x0d\x94\xaf\x0b\x7e\xaa\xec\x46\xa2\xb6\x59\x2b\xef\x8a\xb2\x65\x88\x6e\x15\x59\x65\x49\x24\x46\x52\xed\x66\xf1\xd4\x8b\x2f\x8a\x79\x7f\x63\x93\x00\x51\x2f\x21\x0c\xed\x57\x53\xcd\x20\x12\xed\x6f\xdd\xb6\x85\x2d\x1a\x8a\x9b\xc6\x65\x05\x8c\x6f\x13\x2a\x17\xa3\xa2\xa5\xea\x8b\xdf\x67\x30\xcf\xe1\x92\xcb\x00\xaf\x8d\x5d\x96\x9b\x44\xf3\xf4\xe3\xdb\xca\x77\x1d\x43\x7e\x0a\x33\xf8\xe3\x92\x47\x3d\xf7\x09\xdb\xa7\xee\xd3\x8d\x1f\xc5\xfe\x2c\x8a\xa3\x7c\xab\x6a\x60\xfa\x10\x54\x5b\xf1\x6a\x8a\x8f\x33\xee\xc4\x1a\x22\x58\x4c\x5e\x78\x6b\x09\x0a\x95\xbb\xe6\x2d\xfd\xb5\x4d\x39\x68\x09\x9d\xe2\xaa\xc2\x61\x42\x73\xe5\x75\x4d\x57\x3e\xcc\xea\x68\x31\xf7\x52\x4f\xbd\xef\x88\xb4\x25\xcf\x3c\x22\x65\xa5\x43\xa1\x7b\xd2\x56\x8b\x98\x76\x06\x22\xbd\x2e\xd0\x64\x09\x5b\x49\xde\xd6\x72\xd7\x52\xad\x68\x29\x6f\xf9\x77\x79\xec\x0e\x0b\x91\xab\xa9\x29\x51\x79\xd6\xe1\x5b\xce\xd2\x7f\x20\x42\x57\x87\xc0\x51\xb3\xa3\xac\x24\x76\xd7\xf2\x5a\x8e\x43\xaf\x57\xc3\xcc\x32\xba\x8e\xd7\x1b\x0a\x91\x76\x22\xa4\x53\xd9\xdc\x58\x7e\x68\x54\xcf\x2e\x25\xc3\xde\x11\xd2\x52\x12\xb7\xa3\xa3\xa5\x04\xfe\xca\x22\x56\xfb\x91\xaa\x51\xb7\x54\x94\x5b\x88\x5f\x0b\xe1\x6b\x58\x6a\x4e\xeb\xe5\x2c\x30\x56\x77\x1f\x49\xa6\x6a\x2c\x16\x22\x48\x8c\xe6\x80\xa5\xa6\x21\x14\x9e\x33\x8b\x41\x89\x73\xd9\xe0\xba\x61\x2c\xfd\x5a\x15\xfd\x50\xc6\x36\x10\x4b\xfe\x11\x9e\x94\x68\xcb\x3f\x15\x3a\x61\xf9\x39\xcd\x12\x71\x65\x17\x55\xab\x54\xdc\x9d\x82\x1a\x9c\x36\x81\x0d\x9a\x3e\x2d\x83\x1b\xcc\x6f\x96\x91\x0a\x8d\x5f\xad\xb9\x93\x55\x8c\xb6\x3a\xee\xc0\xfc\x62\x55\xec\x81\xf9\xad\xba\xf8\x83\x8a\x37\x6b\x62\x10\x2a\xa6\x58\x11\x87\x50\xb1\x18\xd5\xd5\x7d\xab\xe2\x11\x1c\x85\xa9\x3b\x8c\x49\x70\x8c\x1e\x7e\x53\x5c\xc2\xc8\x22\x2e\xc1\xa9\x0a\x41\x70\x6c\x9d\xaa\x02\x3d\xed\x5c\xab\xba\x85\x68\xec\xec\xe3\xc4\x34\xb1\xde\xd6\x7b\x49\x9d\xe6\x6e\x40\xc9\xf3\xe7\xa7\xc0\xc1\x66\xa6\x28\x99\x3b\xa5\xc4\xa5\x0e\xd4\x0c\xa4\x9b\x28\x00\x7d\xdb\x33\xd6\xb5\x48\xb9\x68\x2e\xec\x6b\x0e\xbf\xda\x34\x3f\x81\x3e\xab\xe2\x24\xa2\xee\xfe\xda\xd4\xc0\x4a\xa7\xc9\x9f\x6b\x80\xb7\x57\x73\x77\x09\x57\xb9\x98\x76\xc0\x42\x1d\x3f\x89\xbe\x67\x1e\x2f\x9b\xa3\x93\x04\x80\x7b\x63\x83\x76\x51\xfc\xf7\x21\x02\xf7\x0e\x82\x85\xd3\x2a\x65\xfc\x42\xa8\x45\x52\x39\x2e\x25\xaf\x0b\xf9\x6d\x3c\x18\xad\x75\xc3\xa2\x0f\xcf\x4e\x38\xd9\xa9\x76\x15\x17\xe5\xaa\x87\x2c\x3c\x3d\x1a\xd6\x69\xab\xa1\xa1\xdb\xb1\xaa\x99\x99\x14\xd2\xf6\x5a\x19\xad\x59\xda\x56\x1f\x63\xef\xab\x9b\x73\x77\x3d\xec\x82\x16\x54\x6d\xa7\x81\x95\x47\xd5\x78\x17\x28\x94\xd6\xda\x57\x0b\xdd\xab\xad\xe6\xd5\x5a\xef\x6a\xa9\x75\xb5\xd4\xb9\xda\x68\x5c\x6d\xf5\xad\xb6\xda\x56\x1b\x5d\xab\x95\xa6\x65\x17\xb7\x3b\xee\x5a\xcb\x6a\xa6\x63\x4d\xac\x74\x2c\xd4\xf5\xc4\x9c\xa0\x3f\xb6\xd0\xaf\x5a\x6a\x57\xad\x75\x2b\x24\x62\x1b\x68\x55\x5d\xea\x54\xa8\x76\xad\x9d\x36\x55\xa7\x4b\xd9\x69\x52\x5a\x31\xdd\x5e\x83\x6a\xae\x3f\xed\xb1\xf6\x84\xeb\x36\xb7\xd1\x9b\x6a\xb4\xa6\xaa\xa2\xf2\x8d\x35\x25\x4d\x63\x7a\x1d\xa9\x3a\x9c\xbc\x8d\x1b\x41\xc3\x62\x4a\x8c\x1e\x8d\xcf\x6b\x91\x19\xbd\xf4\x73\x6f\x05\xd2\x00\x24\x39\xce\x8c\x9e\xfb\xeb\x39\xf0\x70\xcd\xd7\x5e\x89\x8e\x2f\x44\xe8\xe5\xfe\x5d\x55\xa0\x1e\x41\xea\xfc\x73\xe5\x65\x20\x8d\xfc\x18\xe7\xe2\xd0\xb4\xd7\x55\xbc\x4e\xf1\x67\xed\x22\xf6\x3a\xcc\x93\x26\x00\x92\xfb\x1e\x9e\x77\x98\xdc\x27\xb7\x7f\x1c\xc0\x1f\x10\xae\xf2\xca\x75\xca\x06\xdf\x47\xac\xe6\xd5\xf0\xec\xf3\x3a\x1f\x06\x35\xb1\x9a\xa5\xaa\xf5\x75\x03\x32\x65\xe9\xf6\xd8\x90\xae\x9c\x84\x25\x53\xe6\xba\xd7\xc9\x62\xf3\x2d\xae\xc3\x69\x34\x06\x81\xe5\xa6\x41\x40\x49\x9a\x4e\xa3\xee\x9c\xd8\x8f\x64\x66\x49\x43\xda\x44\x59\x34\x8b\x01\x65\x56\x33\xa2\xab\xab\xe0\xd1\xb6\xc2\x73\x9d\xd8\xe2\xb9\x4e\xdb\xe0\xb9\x52\xe6\xb5\xc6\x73\xad\x56\x1f\xb3\x6d\x56\x10\xb0\xe7\x66\x0b\xb8\x8e\xc3\xab\x05\xbc\x2f\x64\x62\xb6\xf2\x03\x0b\x75\xb2\xa3\x2c\x6d\x9d\xa2\x5a\x97\xa7\x6d\xb2\x40\x34\xcb\x67\x66\x73\x55\x92\x9a\x25\x2a\x90\x2f\xff\x5c\x95\x6f\xdc\x54\xae\xa4\x31\xb1\x99\x6b\xc0\x22\x3d\xad\x1b\x65\xae\x19\x1a\xf3\x91\x0d\x1a\xb3\x92\x46\xcd\xe3\x5e\x6b\x1a\x35\xe0\xec\x56\xa6\x50\xf3\x4d\x3e\x42\xfa\xf4\xc9\xbf\x62\xfa\xb4\x2d\xfc\xad\x6f\x4e\x4b\x96\xcc\x0d\x05\x43\xd7\x98\x3d\x76\x11\x3a\xad\x86\x8e\x9a\xea\x37\x98\x04\x9e\x06\x7a\xad\xd6\x59\x66\x0a\xca\x6e\x38\x4e\x52\xca\x0b\x87\xaa\xd8\xd9\xf0\xd1\x7e\x20\x31\x55\x2d\x2c\x4d\x8f\x02\xc1\x2c\x8d\x51\x89\xb6\x7d\x8c\x71\x36\x03\x67\x96\xf9\xb5\x8c\x4b\x7b\x8c\xb1\xd5\xc1\x36\x4b\xa3\xa1\x21\xe2\xcd\x7c\x20\x8a\x25\x52\x6a\xf5\xdf\xb1\xc1\x2b\xb3\xf3\x9e\x74\x92\x9d\x6e\xbd\xd9\xd0\x30\x2c\x11\xa2\x91\x31\x47\x86\x88\xe6\x4e\x5b\x04\x11\x8d\xb7\x45\x6b\x88\x68\x46\xd0\xfa\x58\xec\xf6\xf0\xd0\x54\x6d\xdb\x68\xc7\xda\x73\xa3\xf0\x63\x94\x2f\x78\xe5\xc2\x56\x6e\x39\x9c\x6d\x4a\x80\x7e\xc5\xeb\x61\x9c\x4d\x2d\xfc\x64\x37\x3a\x63\x43\x2a\x57\xcd\x86\x28\x6a\xb5\x33\xb3\xca\xa0\x69\xbc\xf6\xc3\x1e\x5f\xf8\x9b\x8e\x4b\x12\xe2\xee\x15\xf7\x77\xcf\x7d\x9f\xc8\x42\xbe\x96\xd6\x56\xa3\x73\x77\x47\xef\xe6\xa6\x24\x57\x66\x7e\x3c\xd8\xe9\xbf\x58\xaf\x77\x45\x86\x95\xa6\x8d\x83\x36\xed\x2a\x99\x41\x9a\x46\x2a\x50\xc0\x6b\xa8\xd5\x00\x05\xfc\xc7\x52\xb4\x58\x8a\x8a\xaa\xbf\x75\x28\xe2\x9a\xc6\x89\x56\xf0\x36\x89\xb7\xa6\xf1\x9b\x63\xb0\x2a\xb1\xc7\xdb\x6c\x6f\x2d\xf5\xea\xd8\xa3\x1b\xd4\x71\x95\x2d\x0c\xf2\x58\x97\x87\xa7\xbc\xab\x32\x43\x45\x6b\xf5\x4c\x20\xe3\x96\x77\x46\xdb\x6a\x2c\xf3\x4e\x44\xb6\x4d\xbf\xa5\x93\xe3\x14\xae\x93\xbc\x71\xf7\x55\x0a\xde\x57\x43\xee\x19\x8e\x6a\xa0\x7b\x9a\x98\xbd\xbe\x2b\xe8\x1e\xe9\xe9\x7f\xfc\xfd\xbf\x2b\xdf\x97\x80\x7d\xa4\x67\xe1\xad\xf1\x65\xd5\x40\xb2\x3f\x80\x3f\x06\x92\x51\x27\xe8\xd8\x88\x03\xd4\x36\x7a\xa2\x13\x6c\xa0\x26\xa3\x16\x21\x83\x9a\x0f\xfb\x9f\x02\x46\x88\xb7\x71\x57\xd8\xd7\x3b\x85\xc6\x11\x28\x79\x01\x15\x57\x4c\x85\xfc\xdb\x05\x55\x28\xca\x1c\x76\xf9\x50\xc1\xde\x39\x37\x98\x3d\xc6\x90\x05\xbe\x7b\x37\x24\x22\x50\x42\x8f\x4b\xa2\x0b\x48\x9d\x12\x12\xe2\xbb\x96\xf5\x15\xf4\x77\xb3\x90\xd5\x62\xc2\xdb\x1e\x79\xbb\x61\x15\x69\xd4\xba\xf1\x4d\x3b\x64\xf8\x2a\x14\xf8\x2c\x4a\xe6\x31\xd0\x60\x19\xe9\xe0\xe4\xbf\x32\x64\xbc\xe0\xb0\xee\xd6\x07\xce\x8c\x20\x7b\xed\x04\x87\x83\xec\xe1\xc5\x6f\xcf\x9e\xef\x37\x64\xbc\x08\xcb\xc1\xb9\xe5\x35\x10\x4a\xcc\x70\xa2\x75\xd7\x1b\xfd\xb6\x0e\x72\x52\x14\xf2\x86\xfa\xad\x76\x87\xdb\xe1\x6c\x38\xdf\x27\xd6\x0e\x21\xb2\x1e\x6b\xc7\xd0\xc8\x2e\x50\x22\x36\xf8\x2c\x9a\xe8\xef\x5d\xec\x53\x8f\x3f\xa9\xc7\xc7\x47\xe9\x78\xc0\xcf\x1f\x72\x90\x26\x7e\xec\x18\x63\xbc\xf5\x63\x06\xe4\xbd\x73\xcd\xed\xb6\x53\x63\x6b\x93\xd9\x5a\xcc\x97\x77\x56\x57\x42\x34\x69\xb6\x77\x9d\xb9\xd6\xca\x50\xab\x39\x97\x9b\x8a\x8c\xe6\x92\xc2\x98\xb4\xf1\x31\x8d\xf2\xaf\x93\xb5\x71\x5f\xf4\x64\x42\x9c\x6c\x99\xc9\x51\xd9\xa6\x29\x14\x46\x0f\x7d\x2e\xb8\xc0\xcb\xfb\xe8\x47\xb9\x87\x6f\x56\xdd\x76\xf7\x94\x0e\xc1\xbd\xf6\x3d\xa4\x74\x5c\xe5\x7e\xbe\x6e\x91\xf7\xb0\xff\x29\x1d\xdf\x2c\x35\x43\x71\x7b\x36\x61\x41\x35\x36\x89\x8f\xfe\x76\x9f\x04\x30\xc9\xc1\x43\x4e\xa2\xca\x90\x8b\x53\x03\xc7\xdd\x73\x99\xb6\xcc\x25\x52\xf1\xee\xcf\xa7\x52\x4c\xb9\xce\x05\x5a\x9d\xd7\x61\x5d\x78\x71\x3f\xf2\x3a\x14\x29\x5c\x7d\x38\xed\x94\xd1\x11\x82\x15\x8e\xd6\x71\x60\xe2\xe4\x8b\x28\x23\x77\x5d\x54\xfa\xa4\xd0\xf4\x0f\x90\x54\x75\xfc\x20\x00\x59\xd6\x51\x8a\xc7\x37\x3e\xe5\xde\x01\x3f\xfc\x2a\x87\x5c\x41\xbf\x8e\xcf\xb8\xaa\x26\x3b\x39\xe2\xde\x49\x1d\xec\x72\xc2\x4d\xbe\xef\x13\xae\xf5\x49\xd5\xf6\x68\xfc\x71\xc2\x75\x7e\xc2\x4d\xbe\xcd\x09\x37\xdd\xe9\x84\x9b\x36\x3e\xe1\xa6\xe6\x13\x6e\xb2\x87\x27\x9c\x2c\x81\xbf\xe5\x01\xe7\xc1\x24\xde\xfe\x53\x9d\x6f\xa7\x30\xc9\xf2\xd4\x8f\x92\xdc\xf2\x68\x33\x1a\x93\xc4\x23\xca\x6c\x47\xc2\xfe\xd3\x92\x09\xca\x3f\x8d\x36\x08\x37\xaf\x00\x77\x32\x0a\x48\x90\xe7\x11\xb1\xae\x57\xb0\x8b\x2c\xb4\x18\x60\x97\xa5\x21\x9d\x6b\xc8\x06\xa3\x8f\x44\xfa\x35\x0a\xbf\x7b\x8a\xf8\xcd\x79\x83\x33\x37\x1b\x79\xdb\x65\x95\x00\xb3\x2e\x6e\xe9\xa6\x92\x32\x95\x24\x6b\x31\x87\x3c\xf7\x83\xc5\x12\x24\x79\x37\xf3\x60\xcd\xb5\x9b\x8b\xf6\x63\x13\xe7\x37\xc9\xfa\x29\xab\x91\xf6\x2a\xb3\x44\x2d\x2a\x94\x0a\x8e\x94\xb2\x8e\x03\xf5\x71\x28\x59\xa0\xc4\x93\xd2\xd0\xa5\x81\x7f\xee\xee\xd3\x00\x1b\x3f\x5e\x7f\x1f\x15\x4b\x57\x97\x7f\xbb\xf8\x1c\x46\x41\x87\xe9\x9d\xcf\x85\xd9\xf3\x29\x9e\x1c\x5d\x2a\x52\x3d\x4b\x6e\x12\x93\xae\xaa\x35\x10\x57\x0b\x92\x89\x6d\x8c\xa4\x6b\x2f\x44\x46\x79\xaf\x58\x0d\x3f\x56\xd2\xa4\x70\x1b\x5c\xa2\xe9\x61\x55\xa2\xa9\x7c\xa6\x61\x8f\xa0\x55\xea\x29\x62\xe6\xd8\xdf\x42\xe4\xf4\xc3\xa3\xf1\x72\x3f\x9d\x83\xbc\x7d\x62\x2a\x4f\xdb\x2e\x19\xf8\xfb\x48\x4c\xfd\xf5\x73\x78\xfe\x61\xf6\xb9\xaa\xf0\x2e\xcf\x96\x5a\x4f\x57\x19\xd7\xc1\x5d\xee\x12\x98\x47\xb7\xdb\xe2\x5d\x1a\xb0\xa4\xe4\x17\x15\x5f\xb6\xf0\x9e\xd9\x28\x2e\xe6\xbc\x47\xf3\xc3\xe6\x32\xae\x26\xcf\x62\xe3\x4c\xc6\xb1\x6d\x26\xe3\x44\x0d\xe9\xfa\x2f\x14\xd3\x75\x0d\xef\x40\x92\x69\xd2\x18\x79\x36\xd6\xa4\x32\xd6\x9d\x58\xd6\x49\x88\xd5\x4a\x56\xcb\x7c\xc3\xe9\xb7\xce\x37\xd4\xd0\x3b\xdb\x25\xd5\xb0\x9b\xc9\x91\xeb\xb9\x3c\x33\x6e\x43\xd2\x0b\x3c\x37\xec\xf2\x93\x26\x73\xa3\xaf\x7d\x8d\x69\x5d\xa7\xd1\x7c\x8e\x90\xa4\x9f\x6d\xd5\xda\xb7\xf4\xcb\x67\x42\xa6\x5f\x2e\x7d\xdc\x64\x6e\xc2\xbb\x5f\x65\x82\x36\x45\x7d\x73\xa9\x96\xaf\xdd\x54\x6a\x8b\xf8\xee\xaa\x96\xaa\x41\xaa\x01\x4c\x72\x3f\x4a\x80\xbc\x91\xdd\xd2\x60\x88\x72\x36\xb5\x66\x41\x57\x5b\x36\x93\x18\x05\xf9\x98\x8c\xaf\x5c\xe9\x56\x7f\xed\x28\x77\x96\x73\x7e\xd6\xf0\x3a\x53\xd5\xee\x3b\x80\x67\xdc\x61\x93\x97\x69\x04\xd3\x28\xdf\x76\xd8\x24\xb1\x22\x76\xd8\x22\xbf\xd3\x3b\x6c\x16\x4b\xbd\x2e\x89\x59\x1c\xd7\xe8\x5e\xf9\xc2\x8f\xe2\x75\x0a\x1e\x2f\xcf\xaf\x01\xb7\xf2\x29\x7d\xd3\x5e\xa1\x35\x65\x30\xfd\xd9\x59\x41\x94\xd9\xf7\x3f\xd1\x33\x87\xd4\x49\xc0\xa7\x33\x1c\x73\x6a\x86\xa8\x6b\x69\xd2\xe4\x78\x5d\x82\x47\xbc\xb8\xc1\x1d\x17\x42\x80\x02\x62\x0c\x5c\x96\x47\x78\xa2\x49\x23\x14\x4a\x3c\x2e\xfc\x24\x8c\x41\xb9\xa1\x88\xb5\x52\x1e\x81\x9a\x54\xc8\xb5\x7f\x07\xb6\xeb\x55\xd7\xed\xef\x9e\xb4\xa8\xe6\x19\x64\x0b\x98\xe6\xba\x50\x94\x1a\xe6\xac\xe8\xd6\xd5\x67\xa4\x2d\xfc\x0c\x99\xd1\xab\x52\x76\x48\xda\x00\x8f\x7b\xc2\xc0\xc2\x70\x36\x25\x7f\x21\x1d\x69\x52\x5f\x50\xed\xb6\x57\x70\x86\xa6\xd4\x73\x9f\xa8\xe9\x95\x09\x9f\x58\x49\xd9\xe7\x33\x9c\x65\xfd\xcf\x74\x78\x56\xa9\x96\x26\x8a\x0a\x23\x30\xac\x85\x6e\x07\xd6\x27\x34\xd9\x51\x47\x93\x4f\x43\x88\x11\x20\xe7\x47\xd6\x0f\x88\x13\x64\xe7\xa9\x22\xe6\xb9\xa0\x1d\x34\x9f\xeb\x4d\x4f\x9e\x6a\x1b\x7e\xb3\x5a\x14\x72\xe6\x3c\x7a\x1a\x0f\x9f\x27\xa0\x64\xb9\xe1\xdb\x6c\xa4\x8d\xbc\xfc\x1a\x54\x10\x55\xd1\x1d\xbb\xa6\x9e\x46\x98\x00\xaf\x32\xf8\xdc\x11\xd9\x97\xb7\xd5\x30\xdd\x5d\xa1\x15\xbb\x0c\xec\x56\x89\xc4\x2c\x9d\xa4\x03\x47\xdb\x77\xcf\x45\xa6\x05\x74\x75\xac\xca\xda\xbc\x38\x78\xea\x78\xce\x79\xe2\x5c\xa6\x70\x9e\x82\x2c\xd3\xc6\xf9\x4b\xc2\x90\x9d\xdc\xf4\xe0\x36\x8b\xc6\xeb\x74\x0d\x6a\x25\xc4\x0b\x3f\xce\x64\xc0\x0a\xa7\x75\x4a\x62\x95\xe2\xd0\x55\xfe\x18\x0e\x26\x5e\xf9\x61\x18\x19\xd3\x00\x38\xc6\x99\x9a\x92\xc9\xe8\x6d\x85\x7d\x56\x97\x2b\x36\xa8\xba\xd7\x17\xca\x0b\x36\x01\xb8\x0c\x93\x40\xf8\x7b\xc2\xff\xad\xd1\x29\x58\x22\xdb\x6d\x0a\xb2\x05\x6f\x22\xa9\x4e\x73\xa0\xa2\xe3\xf0\xa6\x7c\xdb\xe3\xc5\xb3\x5b\xe6\x32\x45\x99\x97\xe3\x1c\x26\xfd\x36\x7e\x87\x5f\x6f\xa0\x68\x1a\x67\xed\x90\xbe\x70\xf1\xa4\x34\x04\x29\x82\x68\xc4\x2a\x9c\x1b\x46\x59\xb1\x9e\x61\x39\x6f\x1c\x9c\x7a\x86\x3f\xbf\xc4\x89\x64\x76\x84\xd3\x29\x4b\x30\x21\x4d\xb0\xf6\x63\x3f\xc3\xb6\xa4\x86\x1a\x92\x44\x60\x29\xf3\x4c\xa6\x6e\xec\xa7\x0c\x42\xa8\x99\x83\xe8\x71\x08\x79\x41\x56\x7b\x07\x42\x5e\xd0\xa4\x37\x72\xed\x5d\x82\xdc\x2f\x14\x04\xf0\xd0\x25\x3d\x19\x2e\xec\xee\x04\xb5\x31\x07\xe8\x64\xa2\x6a\xd1\xb3\xad\x25\xa6\xbc\xf9\x98\xce\x7d\x89\xa8\xda\x1c\xad\xfa\xeb\x61\x83\x3c\x2d\x57\x8c\x93\x5a\xf8\xd9\x0b\x54\xe3\x3d\x7b\xba\x5a\xc5\x91\x19\x21\x82\xf4\x34\xac\x3a\xe0\xd1\xf8\x39\x4b\xae\x93\x2f\xfc\x1c\x27\x81\xfd\xac\x55\x09\x2d\x53\xc0\x04\x86\x63\x06\x7a\x44\xa8\x6b\xb6\x25\x4c\x6a\x67\x65\xaa\x7e\x2d\x1b\x35\x9b\xfe\xf5\x02\xa4\x00\x85\x51\x24\x02\x21\x2c\x7b\x96\x8f\xe6\xdd\xb7\x04\x6d\x51\x6b\x2c\x23\x47\xea\x91\xa4\x8b\x01\x8a\xc3\xfb\xe4\x36\x11\x03\xde\xca\x2f\x39\xc3\xdf\x90\x43\x72\x0b\x62\x98\x81\xab\x28\x04\x33\x3f\x45\x0a\x8e\xf6\x92\xcb\xdd\xee\xf9\xe7\x39\xf1\x6e\xba\x1d\x1b\xfc\x85\x24\x17\x8f\x5d\x84\x6a\x12\xf2\xc2\x28\xf4\xd6\xab\xd0\x47\xb8\x3c\xad\xd2\xf1\x54\x4f\x34\xf8\x93\xa6\xdc\xdd\x26\x42\xce\x5f\x00\x93\xc0\xcf\x4b\xdc\xe3\x25\x4c\xf2\x85\x87\xdc\x69\x58\xc5\xf4\x02\x10\xc7\x75\x59\x7a\x8c\x12\x5e\x86\xa9\x75\x80\x7d\x9a\xd4\xc9\xd8\xcc\x51\xd8\x55\x0e\x1f\x78\x00\x81\x17\x43\x1f\x03\xe1\xed\xb7\xa7\x70\x74\xf9\xf9\x5d\x7a\x06\xde\x57\x79\x0a\x1f\x40\x60\xc2\xae\x15\x91\x05\x12\x7f\x33\x2b\xba\xcd\xbc\x15\x5c\xad\x57\x8a\xe8\x52\x8e\x10\xfc\x82\x37\x4b\xfd\x44\x77\x67\x33\x3d\x4f\x5d\x58\x31\x9c\x43\xad\x7c\x74\x15\x98\x58\xd5\x53\xad\x15\x19\xd2\x07\x95\xa3\x06\x55\x63\x1e\xe3\xa7\x0f\x7b\xee\x22\xcf\x57\xd9\xcf\x07\x07\x88\x51\x56\x29\x44\x0b\x1b\xc1\x83\x10\x06\x19\x21\x9d\xcb\xbc\xdd\xff\x35\x8b\xfd\xe4\x8e\x7e\x9c\x12\x2b\x05\x5c\x81\x04\xa4\x4e\x02\x53\x70\x0b\xd2\x94\xd8\xec\x65\x8a\xf0\x83\x39\x83\xc1\xba\xb8\x3f\x95\x30\x0f\x1a\x2f\x01\x5b\x66\x14\x8d\x50\x2c\xbf\x87\x24\x4f\xa8\x49\xdb\x57\xe4\xa8\x4c\x27\x55\x3d\x28\x76\xc1\x7d\x94\x84\xf0\xde\xa1\x9b\x41\xc7\x10\x9a\xa8\x06\x83\x24\x33\xc8\x2d\xbc\x03\x11\x2f\x70\xb2\x81\x74\xe9\x65\xab\x28\x41\x5e\x0e\x0b\x51\xc0\xed\xdb\x6e\xa4\xc0\xbe\xef\xfe\x2f\xd9\x8b\xe9\xd9\x2f\xc9\xe2\xc7\xee\x37\x31\x79\x75\x8a\xe1\x3b\x30\xa7\xd1\xed\x95\x4a\xb6\x61\x97\xaa\xda\xf5\x50\x7e\x45\x49\xa8\xc5\x5d\x56\xa9\x40\x82\x3a\xa6\x06\xfe\xcf\x29\x72\x4c\x0b\xd4\xdc\xae\x81\x91\x3b\xa4\x4b\x5d\x0a\x66\x3d\x69\xf8\x64\xcc\xc8\x54\x71\xd5\x86\x44\xad\xa6\x6a\x3d\x51\x53\xbc\xbd\xdd\x04\xb5\xd3\xd2\x6f\x84\x7f\xea\x23\x6f\xdc\xd1\x91\xc7\x99\x4b\x79\xb0\x17\x8d\xb9\x34\xc4\x71\xca\xa2\xad\xb4\xea\xd4\xb4\x11\x89\xb9\x9f\xdd\x79\xf3\x14\xae\x57\x5e\x9e\x02\xdd\x15\xda\x44\x09\xa1\x15\x90\x2e\xa3\xc4\x8f\x8d\x41\x01\x98\xc3\x5e\xc1\x19\xbb\x9c\x06\x34\x52\xd7\x96\xd5\x9c\x28\x73\x0a\x12\x38\x7e\x12\x3a\x81\x9f\x24\x30\x77\x16\x30\xcb\x1d\x3f\x71\x8a\x49\x3b\x19\xc8\xb2\x08\x26\x7d\x6b\xe1\x2c\xde\x4a\x1f\x9f\x92\x9c\x2d\x63\x52\x72\x23\xd2\x42\x8a\xe3\xe8\x90\x7f\xe5\xda\xcf\xee\x2a\xd1\x0e\xd4\x22\x0e\x88\x9b\x46\x7c\xb4\xe5\x27\xe1\x77\x21\xbd\xaa\x68\xff\x97\x62\xb0\x75\xe0\x19\x92\xf8\x33\xd5\x55\x90\x0f\x4e\xfe\xf2\x9b\xd3\xbe\x50\x78\x0c\x12\xf3\x6f\x57\x20\x39\x4f\x2e\xc0\xfd\x47\x4c\x5f\x56\x7a\xa1\x18\x57\x21\x89\xc5\x4f\xd0\xdb\x17\x24\xf6\x14\xc7\x86\x70\x08\x5d\xc1\x1d\xc8\x8b\x06\x85\x30\x1a\xda\x8e\xf4\x19\xd7\x52\x4d\xb4\x8f\xcc\x2a\x43\x0d\xb8\xa9\x69\x6f\xa8\x1f\xa9\xe0\xec\x74\xcf\xf0\xf7\xf6\xf2\x33\xcd\xe0\x0c\x96\x88\x1b\x7e\x66\xa6\xab\xb9\xa0\xe2\xa2\x5b\x36\x8f\x54\xd3\x33\x84\x8c\x17\x3b\xe0\x80\xe3\xeb\x95\x9f\xe2\x38\x5a\xb4\x35\xb8\xc1\x5a\x69\xc6\xbb\x6b\xc4\xdf\x45\xe8\xec\xab\xb3\x2f\xaf\xc7\x9b\xed\xaf\x54\x25\x76\x3f\x7d\xe2\xaf\x1e\x37\x37\x6e\x1d\xb1\x3a\xb2\x22\x7c\x86\xb3\xbd\x0f\x97\x0f\xb7\x2f\xce\x57\x5f\xe6\xaf\x3a\x0c\x97\x7f\x85\xa7\xcd\xc7\xc9\xa3\x00\x84\xc7\x08\x90\xe7\x82\xdb\xa7\x5f\x25\xb8\xbd\x65\x30\x3b\x22\x40\x27\x0c\xf5\x7d\xec\xc1\xe7\x6f\xce\x41\x78\x77\xf6\xaa\xe2\x5a\x8a\xd8\x64\xe7\x18\x73\x55\x0b\x78\xc4\xca\x3a\x98\xb3\x2d\x12\xad\xbf\x59\x30\x7a\x7d\x59\x1d\xc4\x89\xbb\xd6\xd4\xe1\x00\x4e\xdd\x28\x7b\x83\x6a\xdf\x68\xa3\x08\x2a\x69\x5e\x17\xc3\x2e\xf5\x86\x3d\xc7\xeb\xc4\xf9\x8c\xef\x4f\x9f\xf8\x60\xa7\x92\x64\x62\x24\xf9\x8d\xc6\xed\x21\x28\x49\x9f\x14\x2f\xa6\x09\xe7\xbe\xac\xe7\x88\x68\x98\xae\x13\x97\x0f\xb4\xa0\x0b\x6e\x37\x28\xbb\xf0\xa4\x77\xeb\xa4\xd0\xd9\x25\xd5\xc8\x36\xb6\x8a\x6e\xa6\xd2\x9b\x3a\xd4\x4f\xb5\xf8\x95\x7a\x68\x9d\x62\x85\xf2\x68\xa5\x5f\x9c\x49\x21\x17\x23\xdf\xa3\x42\xff\x77\xb8\x76\x42\x98\xfc\xe3\xef\xff\x27\x77\x16\xfe\x06\x38\xab\x42\x27\x41\xd7\x00\x27\x87\x0e\x59\x2d\x76\x65\x2c\xdd\xc0\x2e\xf9\x48\x70\xf6\x9a\xa2\x74\xb5\x54\xa8\xf3\x33\xd5\xde\xf3\x9b\xf3\xa7\x7d\xa1\x27\xa5\x5d\x63\xda\xc5\x2e\xd6\x18\x91\x99\x4f\xf6\x33\x59\xa3\x65\x71\x28\xfd\x7a\x89\x33\x1e\x0e\x1e\x37\x15\x80\xbd\x7e\x6d\x95\x13\xa0\x9f\xe9\xb5\x65\x6a\xc0\xce\x53\x32\x64\xa5\x68\x52\x51\x68\x13\x57\x96\x39\x29\xfa\x89\x5d\x59\xa5\xa6\x74\x32\xb5\x33\x3f\xf7\x03\x90\xe4\x20\x55\xa6\xc7\x7d\xa5\x9b\xa2\xf4\x75\x8b\x69\xf2\x2d\x7c\x85\xa9\x5e\xa6\xe0\x36\x7a\x50\xa6\x49\x3e\xd6\x4d\x91\xfb\xaa\xc5\xf4\xe8\xdb\x55\x53\xab\xbf\x65\x4b\x47\xf5\x70\x28\xc1\xa0\x2b\x5a\xc2\x0f\x65\xe1\x87\xb2\xf0\x7d\x29\x0b\x06\x8e\xb7\xaf\x36\x38\x1c\xd5\x5d\x4b\xb5\xe5\x06\xf1\x3d\xc9\xd0\xe4\x58\x8b\xe8\x54\x5d\x6c\x90\x35\xf8\x08\x95\x06\xc5\xf8\xe7\x1f\xa5\x06\x7f\x94\x1a\xfc\xca\xa5\x06\x4b\x8d\xa6\x7e\x7c\xda\x74\xb5\x4e\x4a\xe3\xb1\x1c\xd2\xfa\x41\x14\xea\xe1\x63\x0c\x81\xcb\x09\xb1\xab\xce\xa7\x4d\x5b\xdc\xb1\x3a\x1f\x76\x70\x34\x8a\xf8\x94\xa1\xde\xc6\x15\xcd\x5f\xad\x97\xc5\x89\x64\x1d\xda\xbf\x7b\xed\xbf\x28\x6c\x84\x7c\x27\xc5\xf5\x53\x5d\x44\xce\x84\x33\xea\x93\x5f\xb5\x9c\xcd\xa1\x29\x03\xa1\x85\xb9\xe9\x47\x39\x1b\xcd\xcb\xd2\x11\xac\xab\x65\x23\x0b\xf5\x8a\xc2\x19\x22\x41\x8d\xe1\x17\xf4\xbf\x8a\x32\x68\x34\xd2\xfd\x48\xaf\x2a\x08\x06\x4f\xf2\xf5\x2d\x0a\xad\xd6\x4d\xc4\x9c\xf7\x55\xfc\xb7\x40\x1a\x92\x33\xdb\x3a\x78\x6a\xa8\x7c\x86\x5c\xed\xca\xd2\x76\xa3\x7d\x54\xfc\xe2\xeb\xd6\xfc\x39\xfe\x2e\x6b\xfe\x1c\xff\xa8\xf9\x23\x5d\x5e\x4f\x6e\x94\x9a\x3f\xca\x46\x78\xd4\x82\x3f\x45\x6f\x75\x94\x71\x5a\xa4\x48\x94\x9d\x5c\x2f\x80\x13\xc4\xeb\x2c\x07\xa9\x13\x65\x5c\xb5\x1f\xd4\x86\x7d\x81\x1f\x1d\xc9\x4c\xb2\xe1\x71\x69\xf6\xb5\x2a\x00\x15\x37\x54\x52\xfe\x67\x0b\xd7\x29\x25\x9d\x83\x67\xed\x30\xab\xcc\xbf\x70\x91\x24\x8e\x44\xdf\x51\x85\xa4\xc7\xab\x93\x54\x5b\x1d\x69\x09\xc2\xc8\x77\x7b\x6e\xe0\x8b\x29\x16\xc4\x13\x6d\xcc\xd6\x58\xae\xe3\x3c\xd2\x7c\x9e\xc0\xbc\x5d\x69\xa5\xcf\x70\x46\xf0\x06\x35\x49\x1b\x21\x08\x9a\x17\x58\x2a\x5d\xd6\x1d\xb9\xbf\x0b\x1d\x7a\xcf\x9d\xdf\xfe\x65\x00\xc6\x9b\x37\x69\xfb\x98\x0a\x74\x7f\x44\xcb\x41\x4d\x88\xa5\x41\x18\xe3\x38\x08\xf1\x13\x5c\x14\xc4\xb8\x2a\x0a\xa2\x36\xe6\x61\x87\xe8\x86\xe2\x9f\xee\x96\xf8\xc0\xe7\xa1\xcd\xf7\x7b\xb9\xb3\x37\xa3\xd7\x7f\x4c\x0e\x4e\xab\x63\x1d\x1c\x71\x05\x59\x80\x65\xcf\xe5\x91\x8a\xb5\x01\x11\x62\x24\xbc\x74\x91\xe4\x59\x42\x93\x76\x61\x1f\x4b\x21\x5d\x3d\xfc\x5a\x6c\x79\x93\xb9\x5e\x2b\xd0\x2b\x6d\xfb\xb5\x77\xd3\xf1\x2e\xf1\x14\x13\xdb\x78\x8a\x26\xf5\x5a\x59\x3c\x05\x47\xa7\xef\x0f\xdf\xef\xb0\x6b\x67\x63\x09\xe5\xdd\xc8\xed\xa8\xa1\xfc\x8e\x6e\xc7\x6e\x66\x49\x00\xf5\xe5\x59\xe2\x8f\xf5\x93\x3b\x2d\xe1\x67\x5a\x4c\x8e\x21\xf8\x7f\x85\xc9\x5d\xfb\xd9\x9d\x43\xc2\x82\x65\x47\x38\x1f\x9c\xac\x71\x87\x97\xd1\xae\xed\xa6\xc9\x35\x60\x61\x2f\x6a\x8e\x99\x27\x9b\x51\x90\x31\x43\x2a\x66\x61\x8d\x86\x27\x3b\x54\xcc\x25\x33\xe4\x1e\xac\x1d\x2c\x3d\x41\xdc\xda\x7b\x2d\xc4\x80\xe6\xef\xc1\xdf\xd2\x81\xc7\xc5\x68\x2a\xb6\xaf\x0a\x62\xeb\x4d\x60\xf0\x61\xda\x51\x9d\x9f\x55\x99\x43\x9a\x39\x0c\xa4\xc8\x78\x6d\x7f\xdc\x86\xed\xa2\xdf\x9e\xfb\x84\x15\xaf\x24\xe8\x4d\xe7\x04\x50\x0e\x23\x0e\x3a\xf8\x4f\xc3\x68\x58\x6d\x93\xae\x87\xb2\x84\x61\x74\xbb\xa5\x43\x41\xb5\x57\xb6\xd5\x43\x29\xeb\xb3\x74\xb4\x1c\xd8\x8d\x54\xd9\x27\x77\x88\x75\xd1\xe3\x67\x38\x63\x25\x55\xf4\x1d\xf2\x5f\x77\xd1\x63\x02\x43\xd0\xaf\xe1\x70\xee\x30\xab\xec\x52\x53\x6a\x01\x57\x3a\xa9\xde\x86\x7b\x54\x1e\xa6\x83\x02\x68\x7c\xfc\x5d\xbb\x02\x68\xf8\x9e\xa7\x9e\xa7\x5f\xbb\xfa\x99\x44\xef\x06\xee\xa4\xf6\x1e\x9e\x5d\x7d\x3c\xb5\x5e\x9e\x7f\xfc\xfd\xbf\xc5\x27\x24\x3f\x8e\x03\x6f\xb5\xbe\x1a\x43\x91\x2d\xf3\x14\xea\x8e\x9d\xee\xdc\x11\xce\xff\xaa\xe4\xee\xee\x3d\x09\xce\xff\xb6\xe8\x70\x07\x1f\x40\x0b\x23\x5e\x9d\x27\x40\x77\x45\xda\x4b\xc0\xa4\xd2\x40\x5b\x21\xca\x76\x29\x82\x24\x5a\x64\xcd\x56\x58\xa3\xbd\x75\xdc\x68\x6d\x4c\xb9\x72\xd5\x36\x04\xcb\xb5\x69\xb5\x32\xad\xd7\xa5\xbe\x40\xd5\x6e\x2b\x83\x82\xe1\x66\x00\x24\x0e\x32\x61\x84\xfa\xea\x53\x36\xd7\x9e\xe6\xc6\xe9\xcf\x70\xe6\x65\xeb\x59\x21\xae\x6d\x2c\xd5\x06\x8b\x73\x8d\x5d\x59\x2a\x67\xd3\xc0\xa4\xc8\x1b\x02\x3b\x34\x2f\x12\xb0\xd8\x7d\x37\x2d\x9e\x2e\xe0\xdb\xd5\xd9\xc3\xcb\xd6\xa6\x45\x3a\xcf\xbd\x31\x2b\x16\x5a\xe7\x0f\x83\x62\x95\x41\x91\xe2\x18\xff\x0b\x19\x13\x0b\x1e\x36\x18\x14\x5f\xc1\xd9\x3f\x85\x25\xb1\xeb\x0c\x86\x26\xf3\xb4\xcf\x60\xe8\xd2\x6a\xea\x9c\x22\xed\x52\x6f\x3b\xc5\xdf\x99\xed\xa7\xe5\xf7\xad\x8d\xa8\xa4\x89\xaf\x67\x5f\xe4\xad\xc2\xdd\xdb\x16\x35\x36\x67\x1b\xbb\x62\xc0\x0f\xea\x87\x4d\xb1\xfe\x1e\x6f\x6b\x39\x31\x47\x82\x12\xf6\x6f\x6d\x1d\xa4\x49\x26\x51\xe6\x8d\x06\x83\xd5\x03\x42\xd6\x4d\xd7\x49\xe0\x93\x6a\x9a\x37\x9a\xe1\x54\x85\x65\x93\x01\x31\xd3\xe2\x23\x18\x0e\x11\xec\x3b\xb3\x1b\x12\x10\xf8\x6f\x61\x36\x24\x03\x21\x56\xc3\xaa\x81\x74\x6e\x34\xfc\x2c\x1c\x55\x9a\x1e\xb9\x63\xae\x89\x45\x4d\x1b\x09\x5d\x5e\x49\x68\x14\xf4\x7e\x19\xc0\x70\x14\x89\x62\xee\x2a\xf7\xfc\x1c\xe6\x90\x99\x17\x7f\x18\xae\x1e\xc1\x70\x45\x4f\x8c\x1f\x46\xab\x1f\x46\xab\x7f\x1a\x94\x6f\xa9\x37\xa2\xde\x54\x45\x1b\x36\x88\x37\x6c\x1a\x71\x58\x37\xb3\x7f\x39\x5b\x99\x1c\x09\x4a\x44\xd0\xa3\x47\x9c\x52\x36\xf0\x37\x7e\x14\x17\xa2\xbe\x22\xfa\xd6\xf8\xe1\xf7\x62\x4c\x2b\x3a\xc1\x13\xf6\x08\xd0\x76\x53\x9b\x1a\x35\x31\x74\x67\x4f\x43\xcf\x44\xc4\x39\xb5\xd7\x26\xb5\xe7\xc3\xfb\xf8\x6c\x72\x3f\x68\x6d\x52\xe3\xa6\xba\x37\x56\xb5\x28\x7b\x1e\x46\x39\xb9\x3b\xe9\x12\x85\xc7\xd2\x78\x8a\xdb\x9a\x9f\x04\x20\x26\x3c\x25\xb9\x28\xd1\x57\xe4\x5e\xbf\x9e\x2d\xa3\x5c\x9d\x40\x2f\x4f\xd7\xa0\xe7\x82\x30\xca\xdd\x2a\xe0\x01\xd6\x9a\x15\x7e\x51\xd9\x9f\xc9\xa7\x69\x91\xeb\x21\xc8\x45\x3b\x91\x28\x8a\x52\x7c\x81\xd4\x8a\x9b\x82\x37\xce\x18\x07\x68\x04\xa6\x39\x7f\x3e\x8e\xe6\x0b\x54\x1e\x25\x80\xcb\x95\x1f\xe4\xce\x6a\x1d\xc7\x65\x45\x91\xe1\xb4\xe7\xc2\x44\x2a\x72\xa2\x21\x11\xa2\xb8\x90\x69\x65\x48\x8c\x7f\x1e\xe2\x75\xb3\x91\x7d\x56\xa7\x4b\x31\x76\x84\x7b\x33\x8b\x41\xa5\x0d\xf1\x58\xa9\xd3\xfa\x39\xc3\x63\xa3\x93\xe0\x37\xd1\x0e\xa0\x13\x9c\x84\x16\x3f\xb4\x15\xcf\xc5\x27\x05\x41\x61\xca\x0b\xe6\x62\xb4\xde\x26\x02\xf7\x76\xa8\xe3\x1a\x29\x68\x27\x5a\xff\xcd\x4e\xb4\xae\x62\xb8\x5d\x7e\x1f\xee\x8a\xdb\xbb\xcd\xe6\xe2\x7a\x07\xd9\x5a\xce\xf5\xdb\x09\x57\x9e\x89\x79\x24\x37\x71\x74\x0a\x52\xb0\xf0\xb5\xa9\x9c\x47\x63\x36\x2d\xfe\xe0\x5a\xf6\xb2\x3c\x05\xc8\xd2\xd9\x84\x2d\xd9\xeb\x5d\x1e\xf9\x51\xb6\x2a\xb4\xee\x7d\x67\xca\xe1\x6a\xb8\x7c\x7b\x09\x3e\x76\x88\x70\x79\x56\x4e\x5d\x41\xb9\xfc\x0c\x67\x7d\x46\x1a\x76\x86\xe9\xd9\x41\xc4\xb2\xa6\xad\x3a\x09\xb8\xe7\xf6\x88\x02\xc8\x6c\xda\x16\x13\xf3\xb6\x30\x65\x9a\xef\xb0\x31\x0c\x79\xed\xb5\xbd\x49\x75\x20\x6a\x91\x37\xcd\x9b\x82\x11\xb9\xc9\x56\x20\x2f\x75\xb8\x0f\xb8\xf2\x33\xfb\xbe\x15\x5e\xe4\xc3\xdf\xa7\x7f\x8c\xa6\xad\xe5\x33\x3f\xd7\xbd\x51\x7e\xb1\xb5\xeb\x39\xbf\x0c\x46\xf7\xb2\xc6\xfb\x6b\xeb\xe0\x50\x3c\x32\x7c\x8f\x6d\x9c\x1c\x75\x8e\x0d\xd1\x0e\xd6\xd8\xa9\x21\x59\x91\x09\xf9\xce\xcf\x2a\x6e\xe0\x65\x6f\x3b\x41\x8b\x5c\xf2\xdf\xd7\x60\x6e\xd4\x76\x26\x94\x95\x6d\xe7\x51\x68\xd0\x9b\x58\x43\x56\x1f\x85\xcd\xd5\x4e\xef\xa4\xcf\x6a\xcc\x9a\x3a\x87\x41\x83\x8e\xcc\x65\x59\x35\x6b\xa8\x54\x5e\x37\x0d\xc1\xfc\x39\x3f\xb0\xc6\xae\x05\xc6\xbe\xd5\xa1\x07\x4a\x15\x5c\xea\xcb\xd0\x97\x00\xaf\x04\x9e\xa9\x6a\x46\x2a\xb1\x6c\xdf\x0e\x11\xae\xf4\x22\x37\xb2\xa8\x98\xdc\x7a\x90\x6a\x05\xe4\xd6\x4d\x95\x15\x8a\x9b\xb4\xe2\xea\x31\x82\x8d\x8d\xdb\x95\x20\xb6\x2b\x40\x3c\x6a\x59\x80\xd8\xa2\xfc\xb0\xae\xf8\xb0\x60\xa5\xc5\x93\x97\x88\xd3\xc4\x21\xa0\xba\xb1\xac\xfc\x04\x2d\x4c\xbb\xed\x0c\xbb\x17\xd0\x11\x8e\x3b\xb3\x01\xc1\xd6\x84\x7b\xbd\x88\x32\x27\xca\x9c\x25\xcc\x72\x27\x8e\xee\x40\xbc\x75\xc2\x35\x70\x72\xe8\xcc\xfd\x74\xe6\xcf\x81\x13\xc0\x98\x82\x29\xec\x62\x0c\x68\x6e\xb4\x15\xcc\xad\x6a\x79\xc3\x06\x99\xef\x92\x82\xd8\xa1\xda\xf9\x5d\xc0\xc0\x7f\x7c\xf3\xe6\x34\x7d\x3a\xbf\xb0\x56\x38\x2d\x2e\x3b\x5c\xb2\x3b\xbd\x75\x79\xc5\x7a\x1e\xa8\xad\x50\x4a\x10\xf8\xde\x1b\x3e\x2b\xfe\x13\xd5\x6e\x25\xb5\x4f\x09\x6b\x11\x22\x6a\xd4\x4b\x4e\x8b\xe0\x16\x7d\xac\x0e\x8f\x46\xa1\x67\x54\x3e\x3b\x9f\x54\xdf\x6c\xc2\x87\x1d\xa3\x30\x1c\x7c\x27\xf5\x31\xcf\xae\x9f\x3f\x4f\xdf\xfe\xf6\xa1\xfa\xfe\xdf\xc9\x3d\xc5\x59\xf8\xb8\x08\xb6\x87\xc3\xed\x38\x23\xe9\xb1\xb9\x9a\x9d\xd1\x28\x24\x08\xa6\x16\xd5\x10\xe5\x95\xea\x70\xed\xcb\x9a\x34\xfb\xbe\xfc\xa3\xd7\xa7\xe7\xbf\x2f\xbe\x3c\xd8\x9a\x7f\x08\x03\x70\x76\x89\x3a\xe3\xcd\x90\x25\x53\x23\x82\x98\xa5\x59\xcf\x75\x3c\x47\x2f\xef\x84\x8b\xb6\x4e\xea\xc9\xd1\x2c\xc5\xd9\x49\x99\x43\x67\xa4\xd1\x16\xa8\xe2\xcf\x7f\x43\x19\x29\xbd\xe5\x93\xc1\x1a\xa3\xf1\x66\x65\x6d\xa8\x53\x16\x8c\xc1\x8c\x5f\x02\x6b\x68\x4a\x5a\xf0\x53\xe6\x84\xa1\x94\xca\x86\x22\x9e\x70\x1f\x16\x11\x80\x6f\x37\x20\xdd\x44\xe0\xbe\xe6\x52\xa2\x68\x11\x8a\x0e\xa1\xfe\xd9\xa2\x18\x89\xbb\x18\x96\xcf\xe2\xea\x62\x38\x9c\x31\x46\xf5\x6f\x0c\x2b\xa2\xad\xc0\xed\xde\xf4\xaa\x6b\xb3\x99\xe7\x26\x6a\x87\xe6\x75\x96\xcd\x86\x3d\xbe\x5e\x58\x83\x75\xd3\xec\x91\x89\x3a\xf4\x2c\xf0\x63\xc5\x4f\xe9\xc8\x81\xc7\x9f\x3e\x0d\x0f\x45\xf0\x68\xda\x0e\x01\x9c\xa6\xd5\xd1\x71\x28\xe4\x32\x42\x41\xc8\x4b\xff\xa1\xf8\x81\x84\x46\x19\x8f\xda\x73\x9f\x70\x48\xd2\x22\xb2\xa5\x61\x70\x3d\xb7\x68\x51\x99\xa4\xf0\x80\xff\xa0\x7b\x20\x80\x6b\x9c\x2f\xeb\x8a\x80\xd9\xd9\xd2\x8f\xe3\x72\x3f\x1c\x19\xe8\xda\x73\xd3\x75\x92\x44\xc9\xfc\x8c\x99\xec\xf9\x20\x68\x04\xd5\x57\x8c\x01\xd4\xc0\x9a\xab\x62\x85\x96\xc5\xa4\xac\xa3\x7a\x63\x4f\xb8\x7c\x53\xd4\x87\x0e\xa4\xa1\x36\x1e\xf0\xb4\x20\x80\x1c\xa4\x67\x81\xf4\x5b\xb7\x35\xeb\x1c\x94\x25\x91\x8d\x1b\xac\xda\xb5\x99\x14\x57\x1e\xaf\xf4\xe0\xe9\x43\xf6\xf8\xbd\x8a\x9a\x52\x8a\x7b\x72\x73\x2f\xf3\xf5\x9d\x33\x54\xd4\x3c\xb3\x72\xc1\x96\x8d\xaf\xfc\xc8\x64\xfd\x50\x9e\xcd\x51\x94\x92\xc1\x52\xf2\xef\x68\x2c\xb6\x71\x38\xaa\x1e\x8d\x6a\x21\x9a\xe3\x08\xbf\xf2\x6c\xde\x81\x0c\xa4\x1b\x10\x3a\xa7\x97\xef\xad\xa7\x44\x0f\xeb\x81\x66\x9b\xa4\xa4\x41\x94\x7d\x6e\xc0\x30\xfd\x56\x73\xc4\xd9\xed\x8d\xa7\x39\xac\x98\x26\x4d\x98\xc7\xfb\x19\xc5\x9b\xa2\x23\xfc\x4d\xf4\xcc\xd5\x21\x8c\x53\x8f\xd8\xa8\xb6\xcd\x37\x7a\xa9\xa8\xe9\x58\x6f\xed\xf9\x4b\xe3\x59\xe0\x1e\xab\x26\xf2\xc6\x7f\xf8\x6b\x05\x86\xec\xb7\x5a\xd7\xb3\x28\xbb\xeb\x74\x55\x9f\xaf\x16\x60\x09\x52\x3f\x2e\x5a\xae\x5f\x5c\x6d\xb7\x6d\x0e\x6d\x5b\x3a\x35\xa5\x14\x39\x4b\x9c\x77\xc5\x69\xdd\x20\x9c\xb4\xea\xd0\x8e\x12\x7d\x20\x67\x0e\x9b\xb5\x43\x99\xce\xc2\xbc\xf7\xd8\x44\xba\xc2\xa3\x72\x2e\x61\x1c\x05\xdb\xff\x6c\x44\xa8\xe9\xa8\x62\x92\x2b\xd4\x20\xd2\x65\x7e\x47\x29\x9b\x17\xd0\xad\x9d\xf3\xe3\x1c\xee\xcd\xcf\x74\x63\x04\x57\x95\x4e\xec\x38\x7c\x56\x85\x5c\x1c\x40\x59\x98\x99\x1f\xce\x51\xdd\xe0\xfb\x45\x94\xd7\x04\x56\xd7\xc1\xea\xd9\xf1\x52\xbd\x15\xd4\x82\x34\x95\x71\xc2\x9a\xb2\x22\xe5\x88\x4f\x59\x6d\x69\x5d\x9a\x1a\xe3\x20\x9a\x8e\x52\xe8\x91\xab\x38\xca\x51\x24\x95\x65\x02\x5a\x71\x7b\x82\x5c\x18\x7e\x0c\xe6\x6a\xc5\x72\x57\xac\xb3\x3c\x9c\xf2\x61\x1b\x53\x2e\xff\x2c\xf4\x73\xdf\xb2\xba\xb2\x72\x31\x9e\x16\x93\x1a\x9d\x94\xce\x0b\x34\x61\x9a\x43\xe5\xe2\xfa\xe1\x8e\xf4\x9f\x8b\xf7\x14\x1d\xcb\x21\xe7\xfb\x20\x8a\xe2\x0d\xf3\x88\xe1\xcb\xed\x99\x9f\xaf\x97\x2e\xd3\x23\xb5\xd7\xdf\x16\xbd\xe1\x3b\x10\x8f\xb9\x5c\x34\x88\x2c\xf2\xf4\x14\xa8\x0a\x81\x27\x6c\xc0\x27\x2c\x86\x64\xa0\x4f\x68\x19\x57\xdc\x17\x9e\xcf\xb8\x22\x83\x47\x2f\x23\x46\xc5\x3b\xca\x61\x6c\x9f\x33\xb1\x67\x62\x85\x43\x88\x30\x47\x54\x96\xf1\x9e\xc4\x78\x53\x15\xa2\x2a\x2c\xc4\xf1\x9e\xe0\x34\x9e\x74\x9e\x5d\xdd\xc9\x24\x3b\x81\x69\x6c\x32\x37\x3b\x98\x46\x6e\x6e\x27\x46\xbc\x01\x1e\x63\x40\x82\x1f\x60\xf6\x8b\x28\x59\xad\x59\x3e\x33\x13\x75\xa3\x41\x1d\x0e\x81\x01\xa3\xb4\x6a\xca\x15\xf8\x04\x51\xe6\xad\xfc\x30\x44\x66\x94\x32\x8a\xd9\x1e\xa4\xa0\xdd\x51\x55\x19\x74\xec\x36\xc4\x79\x14\xec\x9b\xc3\xef\x02\xea\x51\x18\xf2\xa8\x8b\xcc\xec\xc9\xd7\xcc\xcc\xe6\xe3\x40\xa6\x6d\x73\xb3\x95\x60\xa6\x66\x88\x8f\xf2\x18\x76\xc1\x7c\xd4\x1c\xc3\xe7\x67\x9a\xfe\xaa\xf2\x0d\xad\xc7\xb3\x23\x42\xa3\x66\xac\x24\x56\xea\xab\x0c\xb8\x39\x8e\xa3\x66\xc0\x34\x4b\xfb\xb1\x46\x6c\x89\xf6\xa8\x19\x99\xa6\x7a\x58\xc7\xe3\xaa\xc7\x84\xd4\x0c\x8b\xbc\xf1\x98\xe3\xb2\x41\x8e\xd4\xf1\x1e\x3a\x34\x5b\x0d\xac\xb6\xd0\x18\x9a\x39\x82\x9c\xd4\xbf\x5f\x25\x18\xac\x1a\x17\x4d\x8d\x5d\xb6\xac\x18\xf8\x6a\x1b\xb7\x4d\x9f\x9e\x76\x56\xcf\xcc\x11\x8f\x21\xfd\xf5\xb0\x1a\xe9\xf2\x50\x40\xba\x2c\x3d\x4c\x5a\xff\x83\x0e\xef\xf2\xb0\x09\xde\x25\x21\xd2\xa1\x11\xf6\xe0\xa6\xf7\x69\x5a\x5d\xc7\xa8\x11\x78\x80\x40\x1e\xde\xa3\xa6\x2b\xa4\xd6\x44\xed\xaa\xbd\x57\xb5\x42\x2c\xd0\x5d\x4e\x9a\x61\x16\xf0\x76\x8d\x89\x45\x51\x35\x47\x5b\x58\x4d\x6d\xa7\xba\xb8\x9a\xa3\x2b\xb0\xe6\x28\x46\x96\xe6\xc0\x9d\x16\x9b\xf9\x98\x8d\xf1\x51\x6a\x89\x39\x8a\xb5\x77\x34\x6d\x50\x4f\xcc\x69\x24\xe2\x27\x8f\x51\x57\xac\x6e\x06\x75\xb5\xc5\x6c\xa7\xb0\x13\x54\x43\x9d\x51\xd4\x50\x39\x72\x62\x0a\xc4\x6c\x54\x31\xc3\xd9\xc1\x3a\xa7\x7d\xd7\x0e\xda\xc1\x69\x19\xf4\xa9\x50\xdf\x00\xef\x50\x73\x58\xed\x02\xf1\x80\xfa\x34\x83\x98\x1a\xf9\xc3\x02\xea\x41\x11\x1a\xb5\x60\x0f\xf5\xf3\x6c\x8f\x04\xa1\x0f\x3f\xfe\xce\x99\x45\x67\x15\xfb\xda\x0c\xa3\x60\xab\x76\xbb\x6e\xf4\x43\xdb\x1a\x62\x9a\x0f\x88\xd6\xc0\xe3\xed\x61\x87\xbb\xc6\xb8\x4e\xbe\x68\x12\x6d\x03\x8a\x8b\x0a\x2a\x43\x96\x7d\xc0\xc5\x0c\x5d\x45\x74\x95\x35\xa3\xaf\x8a\x37\x9e\x6f\x40\x92\x5f\x47\x4b\x80\x17\xb9\x09\x32\x4d\x85\x2d\xb3\xc6\xae\xea\x44\x99\xb7\x80\x71\xcc\xdf\xe7\xa5\x25\xa1\xbe\x2e\x3a\x34\x6b\xdf\x5b\xeb\x0d\x44\xd6\x86\x37\x84\x83\x8d\x9c\x00\x8c\xd5\x8d\x92\x72\xba\x05\xaa\x61\x1f\x5b\x27\xda\xd7\x82\x39\x78\x07\x02\x90\xe4\x8c\xe0\x78\x5a\x55\xc6\xbd\x5d\x48\xcd\x11\xfa\xb8\x23\x42\x9b\x6c\x8d\x46\x22\x6b\x36\xcf\x06\xdd\x27\xad\xc1\x6a\x1f\x73\x39\xf0\xd5\xd6\x79\x07\xfe\x5c\x47\x29\xca\x6a\xd9\x7d\x31\x1a\xa2\x39\xe8\x6c\x8f\x1a\x01\x45\x89\x56\x9f\xde\xe8\x08\x1a\xe9\x51\x47\xb5\x60\x8c\xa7\x82\x5c\x50\xdf\xe6\x0c\xaa\x6b\x54\xa9\xdd\xde\x45\xa3\x57\x88\xb6\x9d\x37\x7b\x09\xd2\x65\x94\x65\x4d\xce\xe2\x2a\x65\x5c\x5c\xb9\xd6\xc0\x81\x35\x19\x7e\xc2\x63\x15\xc6\xff\x63\x8e\x03\xa3\xec\xf4\xea\x5c\x3c\xe2\xf8\xaf\x57\x20\x45\x6a\x89\x29\x1d\x4c\x9c\x9e\x21\x0c\xfa\xcf\x35\xc0\x80\x8b\x6e\x90\x45\x7d\xc2\xf3\x7d\x9a\x92\x43\xfd\x33\x9c\xd3\x07\x2b\x97\x74\xc3\xf0\xe3\xa1\x5b\x89\xc4\x64\x6a\xe8\x26\xbf\xc1\x42\x38\x0d\x81\x95\xad\x67\x45\xac\x2b\xd2\xac\xf0\x4f\x2e\x96\x7b\x50\x35\x8b\x9e\xfb\xc4\xd5\x8e\x98\x06\xa0\x46\xa1\x60\xdc\xb0\xbc\x57\x72\xac\x60\xa4\x87\x49\xcd\xd7\xb3\xb2\xa0\xb2\x19\x69\x66\xd7\xa3\x2b\x2b\x7e\x52\x03\xb5\x36\x42\x93\xf8\xad\x1e\x46\x4e\xd3\x9a\xda\x19\x34\x76\xe8\xb9\x64\xda\xaf\xd0\x37\x89\x52\x3a\x16\x62\xde\xfc\xf0\x6d\x12\xe3\x20\x93\x77\xc5\xb1\x81\x7f\x1c\x7c\x4c\x51\x28\x4e\xf3\x61\x55\x0b\xc1\x63\x33\x00\xe9\x91\x21\xf5\xb9\x91\xf6\x41\x10\xe6\x82\x85\x9f\xa2\x4a\xbb\x24\xd6\x82\x08\x14\x01\x79\x4e\x87\x41\x27\x80\x68\x08\x29\x63\x65\x2d\x61\x0a\xaa\x01\x1e\x40\x70\x00\x57\x20\xf1\x08\x62\x14\x05\xaa\xcb\xc1\x6a\x05\x52\x0f\xf9\x9a\xdd\x9e\x8b\x10\x91\x02\x3f\xc1\xb5\x84\x19\x34\x12\xc9\x86\xcc\x82\x05\x08\xd7\x31\x08\xbd\x05\x48\xf3\x2f\xba\x2f\x66\xdb\x1c\x29\x4f\xf3\x5c\x2c\x00\x41\x30\xeb\x66\x7e\xd1\x01\xf0\x83\x85\xdb\x73\xbd\x3c\xf5\x83\x3b\x8f\x8d\xf1\x4f\x92\x96\x89\xf2\xfa\x56\x7e\x9a\x67\x07\x24\xac\xc8\xc3\x11\x41\x18\xe5\xdf\x0c\xa1\xa7\x81\xdd\x6b\x56\xa2\x42\x5b\x01\x99\xd5\x3e\x8e\xa3\x5b\x10\x6c\x83\x18\x78\x74\xc9\xd0\x4d\xcb\xc3\x2a\xab\xfe\x43\x3f\x08\x60\x1a\xe2\x9e\x59\xb9\xdd\xc6\x49\x7c\x65\x76\x4d\x87\xd9\x5c\x1b\xec\x33\xda\x7b\xfc\x92\xe7\xbf\x9e\xcc\x5f\x5f\x4e\x7e\x69\x8d\x5f\xc2\x26\xba\x37\xe0\x25\x20\x4d\x61\x6a\xbe\x59\xb0\x28\x34\x37\x81\x79\x74\x1b\x91\xe0\x44\x57\x7c\xff\x35\xd8\x80\x98\x42\xe6\xeb\xa3\xbb\x94\x0b\x41\x50\x1c\xeb\x86\x2c\x07\xe3\xe3\x75\xc6\x26\xc1\x66\x84\x33\x9f\xa2\xcc\x9b\x70\xaf\x89\xf3\x26\x0f\xd5\xc3\x0c\x8c\xcc\x2d\x84\x20\x0b\xd2\x68\xc5\xdc\x26\xd6\x46\x1b\xe3\x2c\x11\x46\x1f\x49\xe0\x2c\x7e\x5f\x46\x49\xb4\x5c\x9b\x83\x70\xe9\xe4\x39\x08\xbe\x72\xdd\x08\xfe\x5f\xfd\x8a\xe9\xe0\xff\xc6\xaa\xa7\x08\x26\x67\x51\x56\x68\xf2\x56\x18\x80\x6f\xef\x7c\x13\x30\xb8\x8d\x25\xc2\xe2\xe4\x52\x0c\x59\xbc\xf7\xab\x14\x2c\xe8\xf7\x19\xcc\x90\xa2\xb9\xf0\x93\x30\x06\xcf\x31\xeb\x6b\xee\x90\x6c\x97\x12\x94\xc9\x0a\x72\x08\x4d\x99\x31\x23\x77\x80\x08\x2c\x51\x01\xe1\xcc\xa3\x43\x6b\x03\xc3\x46\xdf\xed\x48\x70\x7f\x27\xe9\xd7\x5f\xd2\xe3\xcd\xfd\x2a\x7b\x26\xc8\xec\x5d\x72\xa8\x07\x8d\x72\xa8\xdb\xa6\x4d\x77\x9b\x32\x9d\xae\xf7\x1e\x17\xf7\x77\xf0\x67\x96\x2d\x0f\x26\x1d\xc2\xe4\xbd\x43\xb3\x56\x10\xf2\x0a\x62\x34\x02\xc6\x7b\xb7\x4e\x1c\x9f\x64\x3c\x6a\x33\xa3\xdb\xe0\xd7\x69\xd2\x5e\x85\xe0\x05\x15\xf7\xb6\x8c\x5e\x48\xc0\xbd\xb6\x4e\xe7\xa7\x06\x28\xb6\x3b\x42\xe1\xc9\xa0\xa5\xb6\x7c\x9d\xae\x2d\xb1\x49\xab\x78\xfa\x3b\x11\x3d\xf1\xe6\x97\x0f\xcf\x97\xdb\xcc\xcc\xd2\xd5\xa6\xaa\x3a\xee\xea\x06\xee\x41\x35\x4a\x88\x27\x53\xec\x6f\x21\xbe\xc0\x34\x17\x65\x9d\x49\x31\xb8\xca\xa3\x25\x8a\x8c\xdd\xef\x25\xbf\xba\x9c\xa5\xe7\xbf\x2f\x61\x97\x52\x0c\x04\x70\xb9\x04\x49\xc8\x30\x1e\x79\x89\xc6\x08\x53\x2d\xd1\x44\xdc\xc1\xdd\xd8\xae\xfa\x42\x81\xef\xc9\x91\x8a\x77\xa5\x28\xbb\xa4\x42\x1c\x82\x59\xf2\x57\x59\x4d\x25\x00\xab\x42\x7b\xb6\x63\x29\x5b\x56\xc1\x44\xf9\x08\x78\x73\xa8\x3c\xef\x15\xda\x26\xc1\x53\x94\x2a\x73\x55\xa6\x1e\xd1\x45\x3a\xac\x8b\x91\xc7\x5a\x3a\x0e\x94\xe7\x67\xad\x99\x04\xef\x08\x72\xc5\x67\xb9\xbc\x7e\x37\x15\x18\xa6\xa6\x21\x16\x5d\x8f\xeb\xfd\x99\xd0\xce\x2d\x13\x65\x6a\x56\x4b\xa9\x03\x88\x6e\x37\x70\x16\xc5\x00\xbb\x82\xee\xa3\xb0\xc2\x8d\xa0\x3a\x95\x4c\xe5\x01\x65\x3e\xd8\x66\xd8\x5c\x53\xfa\x99\x2f\xa8\x49\xd8\x88\xcb\xe6\x6a\xeb\x91\x35\x4b\x0c\xb9\x28\x0d\xcf\x52\x6e\x88\xd4\x3f\xf9\xf2\xcf\x55\xf9\x46\xcb\xd4\x10\xae\x01\xd3\xd1\x6f\x5a\x52\x71\xd6\xc3\x41\xeb\x69\x23\xbc\x2b\x79\xc6\x04\x04\x4b\x4d\x85\x61\x5f\xb4\x98\x2d\x7e\xd7\x2e\x54\x71\xe7\x69\x19\x72\x99\xbe\x71\x06\x53\x67\xd3\xeb\xba\x44\x64\x93\xa9\x36\x29\x11\xd9\xd1\x74\x2f\x53\x70\x1b\x3d\x28\x53\x25\x1f\xeb\xa6\xc9\x7d\xd5\x62\x8a\xf4\xed\xba\xe9\xed\x60\x2e\x51\x25\xdf\x6d\x14\x23\xc5\xf0\xca\x7c\x12\xba\x22\xa6\xdd\x70\x74\xc3\xeb\x8b\xaa\xfe\x48\x7b\xd2\x2c\x86\x06\xd7\x98\x3b\xfe\x74\x63\x69\xe6\xa4\x6f\x85\x43\xec\x18\x7d\xd4\xaf\xb0\x79\xb5\x91\x5f\x9b\x69\x63\x20\x74\x9e\xea\xcb\x5b\x54\xbd\xfe\xef\x38\x26\xcd\x5c\x62\xdd\xf4\x22\x82\x06\x69\xf8\xce\x1b\xa2\x1f\x35\x79\xe7\xe9\x7c\xde\x77\xda\x74\x86\x5e\xac\xea\xd1\xce\x9b\xdf\x08\xab\x97\x63\xf6\x91\xe0\x81\xbf\x4c\x61\x00\xb2\x8c\x80\x32\x57\x1e\xee\x43\x84\x8c\xcb\x2a\x5e\x32\xa8\x26\xcc\x99\x4f\xb2\xb2\xb8\xa1\xd8\x8d\x59\x57\xb2\xe9\x6f\x78\xc8\x0c\xb4\x51\xe6\x45\x85\xe0\xc3\xd9\xd6\x5a\xff\xb1\x94\x68\xad\x42\xda\x72\xd2\x0a\x37\x23\x5e\x1a\x4a\xbd\x54\x8b\x6e\x86\x02\x8c\x7b\x9f\xc6\xc7\x38\x87\xdb\x95\x8c\xc0\x43\x1e\x2d\x2a\x4f\xfd\x24\x43\x00\x45\xd7\x90\x57\x77\x65\xda\x08\x29\xef\x6d\x49\x29\xab\x27\x58\xf4\x9a\x7d\xa1\xf5\x65\xed\x5a\x87\xa5\xea\x1c\x0c\xfb\x5f\x9e\x4e\xbc\x0a\xd0\xe8\xe5\x2d\x5c\xa7\x0e\xc9\x0a\x75\xb0\x54\x76\xd8\x21\xd7\x6f\x1f\x3c\xac\xa1\x77\x2b\x6a\x77\x40\xeb\x0b\xe8\x48\xf7\x66\x6b\x6f\x4c\x2b\x6a\x3f\x8d\x63\x85\xd8\x65\xe4\xaf\x1f\x04\x60\x95\x83\xd0\x81\xa9\x13\x62\xef\x09\x08\xfb\xce\x05\x5c\xfa\xa1\x73\x1f\xc5\xb1\xd0\x56\x00\x93\x3c\x4a\xd6\x70\x9d\xc5\x5b\x67\x09\x93\x28\x87\xa9\xe3\xaf\x56\x71\x44\x63\x8a\x33\xe8\x80\x87\x15\x08\x72\x67\x09\x53\xa0\x74\x1c\x89\xd9\x77\xf9\x02\x38\xb7\xeb\x7c\x9d\x36\xae\x4a\x27\x6d\x43\xd3\xaa\x8b\x9f\xd4\xc5\x07\xe8\x2c\x8b\xcc\xc6\x64\xaa\x59\xb7\x8a\xd7\xa9\x1f\xe3\xd4\xe8\x2c\x4a\xe6\x31\xd0\x38\xdd\x6b\x0b\xdb\xf1\x00\xb6\x1e\x5c\xe7\x31\xc8\x65\x37\x7c\xe8\x67\x07\x22\x3d\x89\x3b\x1e\xc5\x04\xe0\x10\x04\x2b\x6b\x27\x35\xcc\x74\x67\xfb\xa2\x21\x08\xfb\x6e\x03\xbb\x07\x2f\xaf\x86\x61\xb8\xee\x1a\xf1\x54\xf5\x8f\x33\x82\xa0\xe4\xd0\x80\x84\x91\x22\x35\xe2\x46\xd0\xeb\x0b\xf2\x9d\xc2\x24\x4f\x61\x1c\x23\x9c\x03\xf6\x38\xef\xc4\x2c\x23\xd0\xb4\x8c\xab\x61\x8d\xc0\x4f\xc3\x26\xcc\x40\x97\x70\x77\xa6\x40\x98\x5b\xe9\xde\x47\x4c\x8c\x0e\x07\x1f\xe2\x57\xaf\x6e\x3b\xb4\x87\x5e\xb1\x99\xf3\x76\x50\x42\x8f\x3e\x45\x87\xe9\xd2\x18\xca\xdd\x8e\xa6\x36\x97\xa3\x52\x30\x36\xf3\xaf\x30\x29\xa8\x93\x53\x16\x5c\x46\x69\xd0\x15\x73\x7d\x1f\x18\xef\x9b\xd9\xf4\xec\xe1\x8f\x67\x55\x18\xef\x94\x65\x76\x74\xdf\xb9\x72\xd1\xcb\x17\x30\x9d\x45\x61\x08\x12\x35\x80\x46\x0c\x73\x35\xf2\x48\x93\xf2\x40\x3c\x30\x88\x8a\x07\x32\x97\xa1\x66\xea\xa1\x40\xea\x2e\xdf\x7a\x67\x65\x6b\xdc\x8f\xe1\xd7\xc3\xfd\x70\x85\xb2\xf2\x2d\x4c\x06\xae\x7d\xd9\x7d\x1a\xdd\xa5\x6b\x93\xc2\x75\xd9\x95\xbf\x7f\xc4\x2a\x3d\x8d\xba\x8a\xb2\xd7\xc0\x0f\x89\x31\x4f\xd3\x19\xf7\x6d\xeb\xce\x18\xb6\x10\xd7\xab\x37\x1a\x0c\x56\x0f\x4e\x94\x79\x79\xba\x4e\x02\x9f\x85\x46\x86\x61\x0a\x32\xe3\xdc\x9f\x72\x5f\x77\x40\x67\x90\xde\x5e\xc2\xd4\xc8\x65\x2b\xfa\xdd\xee\x5d\x85\xa2\xd9\x54\xd3\x99\x64\x58\xdd\xbd\xcb\x4d\x35\x9e\x07\x0f\xf7\x61\xbe\x66\xd7\xd4\x81\x1a\xb5\x4b\xc8\xd0\x7b\xe3\xfc\x39\x06\xba\x42\x12\x64\x5c\x61\x32\x10\x46\x38\x36\xd5\x89\xd2\x19\x0f\x54\x97\x55\x1d\xde\x02\x3d\x37\x9a\x02\x1f\x28\x3d\x35\x02\x3d\x40\x5f\x95\x95\xb6\x64\xc0\x83\x7f\xfc\xfd\xbf\xc5\x27\x24\x28\x03\x07\xde\x72\x4d\x28\x27\x47\x35\x42\x41\xa5\x89\xa2\xb4\xdc\x75\x83\x4c\xe0\xfc\xaf\x06\xc6\xc2\xdd\x61\x04\x9c\xff\x5d\xdb\xdd\x0e\x29\xff\x36\xf7\x6c\xa7\xd2\x80\xa5\xb9\x75\xdb\xd4\x82\x47\x57\xe9\x5b\xaa\xa1\x30\x93\x4b\x6d\x20\x3a\x56\xfe\x3c\xb4\xf1\x6c\x2b\xbb\x0b\x0a\x63\x77\xfa\xe7\x77\x12\xe7\xf3\xf9\xf7\x45\xb2\x19\xbc\x3a\x12\x35\x50\xb7\x83\x00\x9e\x47\x8f\x35\x94\x28\xdd\xdd\xd2\xe1\x9f\xfb\xbe\x72\x4f\x8f\xa7\x2f\x5e\xbd\xff\x32\x6d\x7f\x3d\x65\x89\x2e\xfa\x6b\x2a\x17\x7d\x41\xfe\x2e\xf5\x45\xdd\xf5\x35\x33\xbd\x25\xa6\xad\xe9\xf3\xef\x0f\xf9\xb2\xed\xe6\x6b\xaa\xf5\xa5\x74\xb7\x6b\x28\xf9\xd9\x35\x4b\x7d\x1f\x97\xd2\xf1\xf2\xf5\x24\x3f\x9d\x9d\xd6\x5e\x4a\xdb\x14\x5a\x16\x4c\x60\x98\x41\x34\x61\xa2\x9d\xd4\x5a\xd6\x56\x93\xd1\xe8\x28\x74\x32\x82\x7e\x61\x4e\x57\xd4\xe6\xbb\x8b\xd7\x0e\xc5\x87\xc0\x01\x5f\xaf\x97\x2b\x90\x22\x44\x22\x27\xf7\xe7\x4e\x59\xea\x84\x1f\x19\x6d\xac\x16\xda\x40\x39\x8c\x15\x35\x6d\x3f\x2b\x7d\x10\x9a\x93\xd2\x1e\x66\x3d\xc3\x0c\xfd\x5e\x05\xf3\xce\x82\x4f\xec\xcb\x74\x08\x35\x3b\xab\xb5\x9d\x9d\x86\xc6\x2e\x7c\x0d\xc6\x96\xae\x82\xe2\xb5\xc7\x1f\x9c\x10\xc9\x62\x3f\x3e\xe1\x2e\x68\xa3\x2d\xee\x0d\xf4\x34\x61\xc3\x6b\x7f\x9e\x99\x06\x67\xb9\x31\x6a\xf1\x20\xea\x4c\x64\x06\xac\xdc\x62\x68\x2e\xa9\x89\x94\xe5\x69\xb4\x02\x36\xa8\x83\xee\xae\x61\x27\x54\x7e\x92\x3c\x63\x1a\x61\x00\x13\xe0\xfd\xb9\xf6\x53\xca\x21\x64\x92\xd8\x54\xd4\xa8\xd8\xed\x07\x0c\xb2\x6e\x46\x0d\xab\xb9\xa8\xb7\xaa\x8b\xec\xd8\xe1\x26\x68\x47\x2c\x07\x6a\x70\x07\x43\x4d\xa8\x49\x55\x2b\x14\x6b\xbe\x92\x78\x06\x0a\xe9\xed\x01\x37\x6d\xd0\xde\x75\x27\x4d\xdd\x1d\x8d\xdc\xb5\x8c\xd5\x5f\x1b\x6b\x5b\x5d\xdf\xc0\x48\xab\xc4\x0b\xbd\xef\x5a\xd7\x16\xce\xce\xce\x96\xaf\x56\xdf\x91\xd6\xc5\xa4\x9e\x2e\xf4\xd9\x15\x0b\x20\x8d\x71\x74\xb7\x1f\x3a\xd4\x2a\x96\x48\x55\x8c\x5c\xad\xc5\x3e\x06\x1b\x1c\x17\xc9\x6e\x13\x4f\x60\x82\x33\x40\x95\x52\x74\xf8\xd9\x1b\xb5\xbe\x9e\x36\xdf\x48\x13\xe4\x4e\x1b\x90\x22\x80\x6a\x63\xa5\xca\xa1\xf3\x60\x57\x2b\x86\x1a\x83\x2e\x55\x68\xde\x3f\xa7\x9c\x2c\x96\x5b\xd4\xa9\x7b\x0d\xf6\x5e\xe0\xa3\x40\x02\x64\xfb\x60\x4c\xcf\x07\x16\xe4\x5a\xa3\x4a\xf3\x7d\x4a\x1a\xef\x62\xa7\xe6\x79\x94\xcc\xf7\xde\x13\xbc\x1d\x5f\x7d\x9e\xc4\x97\x15\x51\x01\x8d\x1c\xb1\x56\x51\xaa\x0d\x13\x9c\x5a\xdf\x77\xf1\x0a\x74\xb7\x96\x07\x39\xbc\x03\xfb\x0f\x87\xf0\x79\x73\xb8\x3e\x8c\x97\x3f\x55\x88\xdb\x6b\x3c\x91\x4e\xf2\x26\x6b\xef\xa2\x4f\x83\x00\x64\x99\x43\x02\x3d\x1c\xd6\x77\x8d\x62\x6c\x46\x22\x30\x3c\x8a\x3c\x54\xf7\xd0\xcb\x17\x51\x1a\x56\xde\xde\xca\x58\x32\x4d\xc4\xdb\x69\xbc\xce\x72\x90\x66\x4e\xbe\xf0\x73\x67\x9d\x01\x47\x9a\xc0\xeb\x28\xcb\x33\x27\xc5\xa0\x6b\x0e\xe6\x09\x27\x87\xce\x0a\xa4\xb7\x30\x5d\x3a\x01\x48\x73\x3f\x4a\x1c\x04\xca\xd8\x77\x9e\x6d\x9d\x55\x0a\x37\x51\x18\x25\x73\xc7\xc7\xcf\x97\x26\x48\x05\x90\xf4\x0a\x04\x29\xc8\x9d\xf3\x33\x9e\x42\x3d\x07\xf8\xc1\x82\x84\x8b\xa1\xae\x41\x96\xa3\x10\x35\x67\x06\x1c\x7f\x9d\x2f\x40\x92\x47\x81\x9f\x83\xb0\xe7\xac\x60\x5e\xfc\xe5\xc7\xf1\x16\x7d\x05\xd3\xe8\x4b\xd1\x37\x3e\xa2\xf0\x5c\x72\xe8\xf8\x61\x88\xee\xb9\x7e\xec\x44\x09\x86\x69\x89\x60\xd2\x78\xbc\x98\x38\x30\x55\x46\x9c\x2f\x80\x83\x8a\x85\x45\x20\x73\xfc\x24\x74\xd2\x75\x0c\x32\xe7\x16\xa6\x18\xa7\x15\xb5\x4b\xa7\x50\x28\x57\x20\x94\xeb\xf9\x9b\x7d\x41\x02\xec\x05\x0a\xd5\xbd\x85\x06\xb5\xb7\x01\x63\x55\xbe\x60\xa1\x55\xd7\xc2\x5c\xe0\x8d\xe7\x5c\xe5\x30\xa5\x5c\x57\x8f\x76\xca\xbf\x9a\x39\x7e\x0a\x9c\x2c\x87\x29\x08\x9d\x00\x21\xe7\x7b\x59\x14\x02\x27\x62\x6b\x34\xc6\x43\x38\xec\xb9\x8b\x3c\x5f\x65\x3f\x1f\x1c\x84\xc5\xd9\x5f\xc8\x9b\xfe\x12\x7e\x89\xe2\xd8\xef\xc3\x74\x7e\x00\x12\xef\xfd\xd5\x41\x08\x83\xec\xe0\x23\x98\x1d\x3c\xbd\x3c\x3f\xf8\x18\x25\x21\xbc\x3f\x88\x61\xe0\xc7\xfc\x18\xc9\x08\xd0\xe7\xa8\x73\x69\xf0\x7d\xe7\x7a\x11\x65\x78\x31\x57\x20\xcd\xa2\x2c\xc7\xd1\xac\x78\x91\xfd\x20\x85\x59\xe6\x64\x00\xe3\xcc\xf5\x9d\xdf\xe1\xda\x09\xfc\xc4\x59\xfa\xc9\x1a\xb1\x69\x10\x03\x3f\xe5\x5f\x59\x80\x14\xc8\xdc\x50\x7b\x75\xa8\x94\x0c\x4d\x90\x3b\x48\x43\x43\x1e\x3a\x63\xc4\xa5\xb6\xf1\x1c\x37\x92\x20\x36\x48\xc4\x36\x87\x5a\x8f\x26\x87\x56\x8f\x48\x7d\x94\x63\xc1\x8e\x44\x26\x76\x0a\x12\xa0\xc7\x9a\xce\xdb\x6c\x2b\xd1\xe6\xa0\x4c\x87\x5c\xd9\xe4\x3b\x90\x9c\x67\x1f\xfc\x98\x18\xb2\x6b\x82\xb2\x6f\x23\x10\x9b\xe1\xb9\xe8\x36\x28\x4d\x62\x92\x85\x6c\x82\x94\x34\xb7\x87\xfb\x25\x98\x52\x75\xb2\xaf\x6e\x81\x91\x50\xb6\xd8\x9c\x65\x6f\x93\xde\x50\x1d\x02\xb6\x03\x70\x7f\xba\x62\x09\xa6\xdf\xc8\x7f\x9e\xe6\x1f\xfa\x1f\x7a\x73\xda\x1b\x89\xf4\x45\x4a\x6d\x31\x31\x97\x43\x74\x21\x78\x5a\x9c\xeb\x42\xd6\xde\xc7\x42\x8a\x2a\x7b\xbf\x8c\xdc\xdf\x50\x3b\x83\x9b\xfb\xe9\x1c\xe4\x7d\x76\xe3\xbe\xa1\xc8\x2f\x08\xb7\xe0\xa6\x0a\xf8\xbc\x8e\xd2\xe5\x51\xb9\x00\xf1\x4a\x5c\xac\x24\x47\x05\xcc\x1d\xb0\x01\xe9\x96\x9d\x4a\x39\x74\x42\x90\x17\x17\x84\x04\xb0\xf3\xa7\x74\xc0\xd7\xb2\x6f\x55\xe8\x37\x82\x62\x48\xb8\x29\x55\x6e\x51\xce\xfa\x5c\xbf\x4b\x37\x20\x8d\x6e\xb7\x74\xff\x49\x9b\xf3\x0a\xe4\xf2\xd6\xac\x81\xbe\x71\x45\x63\xba\xb4\xd1\xea\xf6\x99\x7c\xbc\x65\x6b\x74\xca\x36\x3d\xb2\x6a\xc3\x16\x1a\x9d\x72\xcd\xcf\xb9\xa7\xbc\x62\xf2\x7f\x55\x1c\x77\xda\x03\xef\xf7\xf2\x38\x88\x32\x67\x53\x90\x0e\xe9\x11\x94\xa7\x40\xc8\x94\x89\x5b\x04\x10\x5d\x28\x2c\x54\xe3\x30\x1f\x1e\x75\x3c\x6f\x8d\xc9\x6e\xb1\xde\xe7\xc9\xa6\xe5\x8a\x87\x7e\x32\x07\xb5\xe5\x60\xf7\x6d\xc1\x5f\xf8\x51\x0c\xc2\x42\x04\xf0\x4b\xdf\x74\xe1\xaf\x99\x7a\x88\xe5\x5e\xa1\x18\xe0\xb4\x0d\xac\x98\x82\xd0\x09\x21\xc8\x9c\x04\xe6\x24\x75\xc6\x4f\x1c\xf0\x10\x65\xc5\x2d\x0d\xbf\xb9\x0f\xcb\xff\x0e\x04\x30\x35\xaf\xbd\x2d\x51\x7f\x96\x5c\x13\x7c\xdb\x35\xb6\x5a\xed\x69\x29\xc8\xcf\x0a\xb6\x92\xf4\xfb\xf3\xb3\x9f\xd9\xc8\x03\x18\xf2\x8a\xa1\x7e\x64\x3e\x79\x91\x1f\x5d\xdd\x91\x2e\xe8\x01\x8d\x7b\x14\x4e\x59\x43\x7f\x55\x6b\x6c\xb5\x26\x97\x44\xc0\x28\x5c\x21\xd8\x04\xa7\x7c\x6e\x9e\x30\x48\x82\xce\xda\x73\x97\x7e\xe2\xcf\x11\x68\xb7\xc6\x62\x68\x58\x3f\x1b\x4c\xfd\xfa\x17\xb1\x5f\x67\xe1\x97\x4a\xb1\x27\x2a\x0a\x9a\x6d\x5a\xec\xc9\x72\xc4\x54\x4b\xf7\x33\xc7\xc7\x3a\x7f\x73\x10\x69\x53\x9d\x0b\xae\x84\xef\x11\x17\xdc\x71\x64\xa4\xe8\x8a\xad\x48\xb3\x92\xbe\xcd\xc9\xda\xde\x1b\x27\xb5\x50\x86\xc9\x55\x82\x14\xdb\x08\xce\x56\x35\x0c\x84\x16\x2a\xd4\x2b\x59\xb6\xa1\xea\xc9\x02\xb0\x62\x0d\xac\xb4\xe9\x35\xdd\xc2\x57\x35\x83\xd2\xfe\xf8\x71\x5d\x14\x5a\x26\xd7\x62\x55\x82\x5c\x03\xa2\x96\xdd\xad\x52\x4e\xe0\xe8\x25\x50\x31\x2d\x64\xd4\xa8\x13\x71\x35\xdd\xea\x46\x3f\xe4\x54\x7d\x96\xc2\x99\x34\x2a\x9f\xae\xbb\x01\xa2\x20\x45\x52\xc1\x5d\x6f\x7f\x67\x46\xf5\x75\x12\x03\x14\x0b\xbe\x2c\x53\x00\x51\xb6\x9d\x0e\x9c\xb7\x81\x3d\x96\x58\x51\x77\x37\xcb\xe6\x70\x05\x63\x38\xdf\xfb\xc4\xbb\xe5\xc9\xdd\xf2\xe3\xf2\x85\x75\xe2\x9d\x45\xb2\xd5\x75\x39\x75\x3e\x5c\x8d\x51\xa4\x11\x8e\x1e\x31\x78\x3a\xd7\xf2\xdb\xaa\xb3\x6d\xd2\x0d\x40\x9a\x8d\x73\xad\x2e\x9b\x87\x77\x4d\x1d\xda\xe4\xf3\x68\xe0\x37\x2e\x60\x68\x82\xde\xa8\x54\xce\xef\xfd\x34\x89\x2a\xea\x48\xed\x9d\x76\xae\x91\x73\x57\x70\x09\x48\xed\xcd\xcc\xf9\x08\x52\xe0\xbc\x20\x54\x69\x75\x0c\x8d\x6c\x4f\x3d\x95\xfe\xf5\x45\xf8\xd8\xfb\x53\x49\x37\xa8\x6b\x8f\x6e\x22\x64\x85\x8b\x90\xc1\xc2\x2f\x1e\x08\xc8\xbc\xef\x41\x6a\x86\x85\x77\x1c\xda\xae\x73\x9b\xc2\x25\xb1\x5a\xe3\x3d\xe2\x6c\xa2\x6c\xed\xc7\xc4\xb0\x41\xec\x9f\x51\xe6\x2c\x61\x96\x3b\x71\x74\x07\xe2\xad\x13\xae\x8b\xe7\x8b\xd7\xcc\x13\x22\xfb\xf0\x98\xe0\x3b\x08\xe5\xca\x2b\xa8\x94\x54\xd4\xca\x73\x9c\x74\x9d\x24\xd8\x78\x4f\xf2\x4a\x1c\x78\x8b\xb3\xda\x77\x38\x95\x34\x6b\xbe\xbb\x99\xb5\xe4\x61\x0e\xa3\x58\xb2\xe2\xf0\x9b\x4d\x07\x86\x7c\xa2\x9a\xce\x86\x03\x23\x73\xdc\x08\xca\x21\x47\x49\x03\x52\xb2\x86\xbc\x6f\xef\xfc\x86\x75\x59\x3b\xbe\x6f\x56\x2e\x42\x43\xe8\x6e\x87\x95\xcb\x46\x42\x63\x30\xa8\x16\xc7\xd9\x02\xde\x5f\xc2\x38\x8e\x92\xf9\x05\xcc\xa3\x40\x29\x03\x66\xe8\xac\xa9\x04\x6d\x31\xc1\x9a\xd7\x6a\xde\xda\x51\x9a\x3a\x18\xdc\xe2\x75\xb4\x01\xce\xfb\x55\xe8\x17\x9a\x8e\xb9\x17\xb3\xf6\x69\x2b\x4f\x1d\x72\x25\xd3\xcb\x23\x27\x04\x2b\x90\x84\x99\x03\x13\x27\x87\xd0\x59\xae\x83\x85\x13\xfa\xb9\x5f\xc8\x23\x01\xc7\x62\x05\xe3\x58\x2e\x7d\x67\x35\x50\x3b\x2d\xba\x0b\x09\xe1\x74\x22\x25\x86\xc3\x1b\x2d\xfb\x62\xce\xb6\x80\x4c\x37\x2c\x82\x56\x18\xec\x4a\xbf\x86\x77\x05\x03\x6a\xe0\x63\x59\x0f\x6a\x2f\xb9\xaf\x51\x2d\x0e\xd5\x28\x82\x5e\x40\x71\x74\xc8\x6a\xf0\x19\xce\x32\xa3\xe9\x43\x18\x09\x09\xeb\x75\xfd\x34\xf2\x3d\xaa\x0c\x23\xf3\xf0\xd3\xd3\xd7\xc4\x16\xb1\xf4\xb7\x4e\x1c\x2d\x23\xe2\x79\xf4\x67\x51\x1c\xe5\xdb\x82\xe1\x59\x87\x7c\x25\xd6\x72\x8b\xe3\x48\x75\xc2\x3f\xce\xaa\xd0\x4b\x11\x18\x66\xb1\x73\xe2\x3c\x5a\x39\x08\xb6\xa4\xb6\xae\x65\xf1\xdf\xa5\x9f\xe6\x91\x1f\x3b\x1f\x22\x70\x5f\xbf\xe6\xf5\x88\x8f\xb6\xc7\x6f\xc3\x9b\xbf\xf2\x3e\x2e\x9e\x62\x27\x57\x05\xf9\x48\xaa\xae\x28\x31\xf0\x5a\xea\xbc\x01\xc5\x55\x4f\x2d\x8d\x6f\x7d\x25\x0f\x63\xa5\xe7\x1c\xa4\xcb\xba\x03\x81\x6b\xa0\xda\xc6\x45\x86\xf9\xf3\x4e\x82\xdb\x0d\xeb\x08\xe9\x98\xab\xbb\x37\xeb\xc8\x66\x36\xa7\x5f\x63\x36\xba\x2a\xf8\x16\xbd\xb4\x95\x81\xdf\x8c\x83\xcb\xc2\xb5\x0e\xce\xc3\xf8\x76\xbc\x2c\x4f\xdd\x93\x13\x1e\x0c\x4b\xd5\x88\x79\x64\x01\x8c\xcf\x71\x98\x7a\xd9\x3d\x72\xbb\x14\x72\x33\x0a\x01\xbd\x70\x90\x19\xb1\xe4\xbb\x77\xdc\xc7\x46\x07\xb4\x35\xe5\x9c\xa6\x5c\xe9\x38\x64\x00\x6d\xfb\xb3\xdd\x24\x7b\xb5\x16\x2b\x8a\xcd\x21\xae\xc5\x55\x5e\x9c\x4d\xdf\x72\x31\xe8\x08\x1e\x69\x35\x3a\x52\xa8\x6c\xbf\xf8\x3a\x7a\x95\x74\xfb\xc2\xd0\x90\x17\xc8\x12\x6d\x52\x99\xb0\x49\xc7\x5c\x8d\x1e\x35\x51\x0a\x32\x73\x43\xe5\x33\xb5\x66\x7a\x62\x41\xd4\x90\x5d\x5b\xff\xba\xfc\x8f\x24\xc9\xed\x60\x79\xa8\x55\x7d\xea\x48\x38\x99\x94\xa6\x02\xee\xcb\xe2\xca\x1a\x02\x4d\x4c\x54\xc5\x58\x42\x3f\x5b\xcc\xa0\x9f\x86\xde\x12\xa9\x3a\xf6\x22\x80\x0f\x48\xb5\x7c\x53\xb6\xa9\x09\x63\xe7\x35\x5d\x1b\xf3\x9a\x30\x98\xa1\x34\x18\xcb\xc3\x11\xff\x67\xae\xed\x6e\xb5\xbe\xd6\x8f\x34\x97\xcd\xed\x57\x47\x50\x18\xc4\x94\xc3\x7a\x6a\x6a\x42\x66\x2b\xc8\x87\x77\xaf\x5e\x67\xb3\x24\x1d\x6f\x18\x1f\xf2\xf9\x26\xba\x82\xae\xd8\x0e\xda\xe7\x4d\x8f\xc3\xc6\xf5\x57\x65\x57\x5f\xb6\x80\x69\x7e\x1e\xda\x30\x9c\x19\xdf\xa3\xd1\x9c\xd5\x6d\x14\x25\x30\xf5\x1e\x77\xad\x90\xa7\x6b\xf7\x95\xb2\x75\x06\xef\x37\x31\x48\xf2\x6f\xa7\xf4\x58\xe4\xf9\x4a\x9f\x1d\xfc\x7d\xd0\x04\xdf\x11\x3a\x25\x89\x29\x97\xbb\x61\xc3\xff\xa4\xd2\xf3\x2c\xf5\xa3\x42\xe1\xff\xcf\x0e\x48\x4e\xce\x41\x56\xb1\x91\xd6\x1b\x1e\x22\xa7\x24\xed\x09\x45\xf2\x90\xd2\xb5\x39\x78\xc8\xcb\xc8\x70\x7d\xbd\x4d\x43\x67\xbd\x8a\xd6\x7f\x47\xce\x9f\x0b\x58\xe1\xa7\xb2\x9e\x5b\x03\xad\xfe\xeb\xad\xda\xf3\x38\x9a\x47\xb3\x18\x3c\xda\xaa\x4d\x87\x1c\x6d\x69\x6f\x68\x0f\xc9\x4b\xc7\xac\xc8\xbb\xac\xde\xff\xcf\xde\xbb\x75\xb7\x6d\x6b\x8b\xc2\xe3\x7b\xd5\xfb\xf7\xb4\x5f\x68\x8e\x2c\x95\x58\x86\x68\x39\x49\xd7\xde\x4b\x2e\xed\xa6\x4e\xb2\xd2\xbd\x9b\xcb\x89\x9d\xd5\xb1\xb7\xa2\x13\x53\x24\x24\xa1\xa6\x00\x15\x04\x6d\x2b\x32\xc7\x79\x3d\xcf\xe7\xbf\x9c\x3f\x70\x7e\xca\xf9\x25\x67\xe0\x46\x82\x14\x25\x4b\xbe\xa4\x69\x47\xfb\x90\x5a\x20\x2e\x13\x13\x13\x98\x57\x4c\x58\x23\x7c\xe1\xd5\xbb\xfb\xb6\x96\x01\xdd\x9d\x18\x5f\xe0\x78\x4d\xf4\xe9\x52\x87\xf7\x20\xbf\x0a\x71\xfb\x03\xc7\xc6\x85\x21\x2f\x09\xf0\x30\x51\x86\xb2\x97\xf2\x7a\x12\x47\x1b\xc9\x14\xcd\x42\x6c\x46\x30\xbf\xd9\xba\xb2\x35\x64\x1f\x54\xb7\xf7\xb0\xba\xf7\x23\x7f\xd3\x91\x33\x5d\x6d\x5b\xdc\x10\x94\xcd\x8f\x89\x25\xe7\x9c\x33\x66\xe1\x6c\xb2\x0d\x05\xdc\xc2\x55\xb7\xa2\xb5\x4e\xe1\xa2\x9e\xd9\xde\xac\x8f\xf2\xc8\x9a\x31\x3a\x2e\xd2\x97\xa8\x53\x4f\x97\x94\xe1\xd8\xd5\x1c\x33\xf2\xa2\x87\x3c\x64\x56\x12\x0a\x43\xf2\x5e\x71\xac\x68\xe5\x1d\x62\x91\x0c\xaf\x2b\xae\x68\xb8\xd3\xf0\xca\x85\xee\xfe\xc6\xd0\xde\x4c\x9b\x2b\x87\xdc\x10\x15\x37\x11\xe9\x36\xb4\xbc\x21\xc1\x37\x79\x09\x37\xf5\x0c\x56\x3a\x2a\x77\x0e\xa1\x97\x2c\x9c\x6d\x47\x04\x45\x34\xc6\xbe\x7d\x71\x7e\x2b\x0c\xf7\xd5\xd1\x20\xbb\xbb\x49\xad\xb9\x4f\x54\xde\x66\xc3\xca\x37\xfc\xd7\x27\xc6\x6c\x68\xbf\x1d\x6b\xaf\xe1\xf5\x5f\xd7\xe2\x55\xa2\xee\x7d\x05\xb9\x1b\x04\xbb\x6c\x81\xc8\xbd\x9b\x58\xd1\x16\x70\x6e\x09\x9f\xa1\x99\xdf\x83\xc0\xfe\x70\xcc\x5c\x3e\x60\xf4\x25\x18\xf8\xeb\x57\x9f\xbf\x0a\x56\xbc\xca\x31\xb6\x21\x1c\x7f\xf2\xe1\x3a\x1f\x16\xba\xd5\xad\xb9\xf0\xf1\xbb\x0f\x5f\x94\x05\x57\xc7\xfb\x93\xff\xde\x88\xd1\xed\xf8\x6f\x1d\xbd\x7f\x32\xdf\xb5\x48\xfd\xb7\xcd\x99\xaf\x39\xa7\xbf\x3c\xe7\xdd\x00\xc8\x6d\x80\xbb\x67\xb6\x5b\xa6\x20\xbb\x93\x67\xed\xee\xbc\xfa\x0e\x46\x9a\x5b\x90\x52\x39\xa7\x55\xb6\xcc\x0d\xb7\x40\xe3\xd3\x7e\xc5\x2d\xed\xc1\x2a\x2f\x85\xe5\xcd\xf2\xcb\xbf\xdd\x75\x98\xdf\xd6\x85\x51\x3d\xd2\x97\x3a\x84\x9b\xfa\x34\x36\xf1\x68\x6c\x2a\xcb\xdd\xd2\x58\x7d\x8b\x05\x3e\xc1\xc3\x04\x93\xb1\xed\xbc\xbb\xe3\x4a\x5b\x11\xc3\xaa\xef\x67\x5b\x7b\x24\xbf\x3e\x34\x7d\x20\xf8\xd7\xcc\x5c\x9a\x70\xde\x25\x61\x24\x2f\x43\xde\x1f\xae\x32\x39\xc0\xb3\x1a\xf5\x6d\x7e\x4b\xe2\xc6\x21\x37\xf9\x7c\x7f\xe6\xc1\x2f\x7b\x4a\xfd\x3b\x1d\xde\xdb\xf1\xb4\xca\x67\x0a\xdd\xef\x7f\xcd\x90\x4a\x29\xe1\xfe\x42\x87\xa9\xff\x0b\x1d\xae\x39\x88\xa0\xa8\x64\x67\xe9\xb3\x2e\x75\xfd\x42\x87\xf6\xa3\xe0\xfd\x1b\x3a\x51\x57\xbd\xf5\xab\xe5\x3a\xef\xf8\x03\x9c\x73\xe5\x50\xf7\x71\xd4\x35\x48\x86\x38\xed\x8c\xc2\x78\x45\x26\xd9\xfa\x7f\x37\xca\x0d\xab\x27\xc2\xc3\xf4\xfc\x1f\x8c\x66\xb3\x37\xf7\xe1\x55\xfd\xfa\x0e\xa3\xd3\xf9\x6c\xa5\xf7\x79\xeb\x83\x67\x25\x21\xe8\xdb\xea\xbf\x2b\xcc\xbc\x63\x98\x32\xcc\xe7\x0f\x8f\x9d\x99\x1e\xe9\xcf\x33\x79\xc5\x52\xac\x0f\x67\xb9\xb7\x63\x79\x55\x28\xcb\x8a\xc5\x33\x91\x5d\xf7\x7d\x76\x12\x15\x7c\xf5\x87\x16\x15\xd7\x05\xbd\xdc\xc7\xc6\xd2\x38\xbc\x99\x01\x7d\x7d\xa8\xb9\x21\x04\xe6\x1e\xb1\xb3\x59\x60\xcc\x57\x77\xee\xe8\x8d\xfc\xf7\x8a\xfa\x27\x77\x8b\x51\xfe\x6c\xed\xce\xfd\xbe\x54\x86\xd7\xe9\xd8\xee\xd4\x98\xe2\x9b\x5f\x1e\xbb\xaf\xf9\xfe\x96\x53\x8c\x66\xd9\xb6\xf3\x5b\x1f\xb1\xbb\xc2\xf2\x27\x6d\xac\xa3\x24\x4b\xeb\xb7\xf2\x57\x50\xd7\x5a\xfa\xd8\xd8\x88\xbc\xbc\x53\x6f\xeb\x77\x28\xb2\x86\x6f\xa1\x32\x39\xf7\x64\xee\xd7\x77\xe9\x1f\xd4\x92\xb8\xe9\xa1\xf7\x75\xad\x4a\x1a\x4d\x50\x9c\x25\x28\xde\xde\x08\xe0\xdc\xd3\xe2\x7c\x25\x61\xc9\xbf\x89\xac\x77\x8b\x15\xac\xae\xdf\x6d\x02\x71\x56\x2d\xda\xe6\x5e\xbc\x95\x30\x6c\x14\x72\xb3\xe9\x62\xde\x89\xae\x6e\x0a\xb6\x79\x80\xfd\xbc\xbd\x7b\x6f\x45\x17\x9b\xaf\xc1\x1d\x5d\x7b\x46\x92\xba\x87\x00\x9b\x7b\x0f\xa7\xa9\xd2\xd8\xad\x43\x67\x36\x20\xb6\x07\xf6\xf7\x6e\xeb\xb2\x5b\xa2\xfd\xad\x1c\x76\x1a\x6d\x4d\xee\xba\x7b\x0b\x8e\xf9\x6d\xd8\xe5\x56\x7e\xb9\x5b\xe8\x08\x55\xcc\x3d\xee\x56\x92\xda\xdd\x36\xfc\x65\x03\x54\xad\x32\xa4\xdd\x04\xcf\x56\x70\xac\xf5\xb6\x3d\x30\x67\xfc\xb2\xcc\xf0\xf8\xdd\x87\xdf\x96\x13\x1e\xbf\xfb\xf0\x55\xb1\xc1\xd5\x81\x2e\x7f\xf2\xc0\x8d\x79\xe0\x06\xc1\x2d\xf7\x1b\xca\xd2\xcc\xfe\xb6\x0b\x5b\xf9\x93\xf7\xdd\xb0\x38\x7f\x32\xbe\x65\xb4\x3d\xde\x5f\xc5\xf8\x36\x8f\xee\xb8\x3f\xae\xb7\x04\xcc\xe6\x40\x3c\x18\xcb\xbb\xe1\xea\xf4\xca\xb6\x2b\x3e\xac\x2b\xde\xe2\x5c\x2c\x4d\x5c\x8f\x1f\x5b\xe6\x78\x63\x6e\xf9\xbe\x7a\xef\xf8\x7b\x4a\x4a\xbd\xfb\x04\x25\x28\xe2\xaa\xf4\x0d\x8d\x91\xfd\xfb\x79\xc8\xc3\x17\x8c\xd1\x86\xa7\xdb\x8c\x2d\x67\x50\x7f\xfa\xac\x7a\xc9\xd9\x72\xb1\xda\xf9\xe0\x8a\xe7\x13\x78\x35\x3a\xc4\x58\xd2\xd6\x36\x79\x63\x2e\x80\xdf\x58\x79\x12\x92\x38\x41\xa7\x74\x46\xff\x89\x3f\x5b\x93\x59\xf5\xcc\xda\xda\x55\x69\xb6\xe3\x19\x12\x58\xf1\x55\x56\xd0\x8e\x8d\x8d\x1e\x91\xae\xe4\x7c\xad\xbe\xb7\xb5\xf2\x85\x7a\x99\xfd\x75\x96\x64\x2c\x4c\xf0\x67\xb4\xfc\x00\x1b\xa7\xe3\x71\x82\x3a\x45\x69\x24\x0f\x15\x69\xe9\x91\xff\x62\x72\xde\xe1\xd4\x4e\x2d\xab\x9e\x1d\xea\xcc\xd4\x69\xa9\x46\xd1\x65\x85\xd1\xa8\x33\x9c\x73\x94\x36\x7d\x98\x20\xc6\x3f\x2b\x37\xdc\x34\x64\x73\x2d\x09\xee\x55\x2c\xac\xba\x51\xad\x0f\xd3\x92\xd3\x19\xed\x5c\xe0\xcf\x9b\xe4\xaf\x35\xa9\xd6\x6e\x9d\xb8\x96\x85\x24\x15\xe3\xa7\x7b\x7a\x11\xec\xb4\xb5\x32\x6b\x6d\x27\x0e\x79\xd8\x91\xf4\xdd\x19\xb1\x70\x2c\xa3\x4b\x96\x1b\x3e\x58\x2a\x5b\x6e\x8a\xb7\x99\xcc\x90\xd2\x04\x85\xa4\x29\x0b\xaf\x9c\xcf\x5e\x8a\x18\x96\x14\xc3\xf6\x3a\x33\x86\x2f\xd4\x8b\x00\x77\x9d\xc2\xca\x06\xc6\xa1\x07\x17\x88\x64\x53\xc4\xc2\x61\x22\x9a\xc0\x31\xe2\xbd\x62\x4c\xb0\x60\x88\x67\x8c\x38\xdc\xff\x41\xc1\x7f\x6a\x66\x94\xe7\xe0\xa6\x29\xc7\x62\x0a\xbf\xd7\xf9\x3e\x0f\x39\xda\x66\xb2\x86\x10\x3b\xb7\xa6\xda\x5a\x0f\x5f\x17\xf9\x1a\xe0\xee\x32\xb1\xaf\x6c\x4a\x24\x13\xd0\xff\x6e\x09\xf4\x8d\x04\x7f\x1b\x12\x4d\x39\xc3\x64\xfc\xbb\x9d\xf0\x89\x04\xff\xc6\x09\x67\x1c\x27\xe9\x5e\x18\xc7\x1d\x4e\x3b\xb3\x90\x4f\xec\x09\x57\xa6\x73\x27\xfa\xb3\xbb\x49\x10\x77\x78\x10\xb2\x71\x26\x69\xdf\x57\x2e\x9b\xc3\xfd\x76\x5b\x51\xe9\x4e\x50\x7e\xec\xef\x0f\x8e\xec\x1f\x3d\xd7\x6d\x45\x94\xa4\xbc\x8f\x21\x19\x04\xc8\x4f\x67\x09\xe6\x9e\x7b\xe4\x82\x96\xe8\x97\x05\x67\x8f\x16\x38\x7f\xb4\xe0\xf9\x59\x8b\xb4\xdb\x1e\xdb\x0d\xce\x8e\x1e\x2d\x48\x7e\x06\x5a\x1a\x37\x2c\x5f\x83\x89\x28\x4c\xa2\x4c\xe6\x78\x9f\xd1\x14\xeb\x90\xe0\xa5\x3d\x3c\x0c\x53\x1c\x75\x62\x46\x67\x31\xbd\x24\xab\x9b\x7e\x45\xf4\xa0\xeb\x2b\x3a\x68\xad\x9a\x7d\x12\xa6\x29\x4a\xf7\xc2\x61\xca\x59\x18\xf1\x4e\x42\xc7\xe3\xe6\x5d\xbf\x17\xa3\x61\x36\x2e\x7f\x52\x09\xe8\xde\x14\x5f\x61\x52\x2f\x2d\xf0\x46\x2f\x10\x63\x38\x16\xb0\x76\x22\x3a\x9d\x65\x1c\xc5\x65\xe5\x19\x4d\xe6\x23\x9c\x24\x62\x10\x19\x11\xd9\xd1\x7b\xb0\x86\x46\x88\x21\x81\x0c\x26\x90\xde\xd7\x99\x18\x06\xd8\x14\xeb\xac\xfb\xde\x22\x63\x49\xcf\x75\xe1\x2c\x64\xe1\x34\xed\x79\x5d\xc8\x7c\x03\x32\xf0\x3c\x0f\x04\x87\xde\x22\x07\x00\xc0\x84\x8e\x5f\x22\x1e\x4d\x3c\xb0\xc8\x21\x22\xf1\xdb\xd1\x28\x45\xbc\x27\x15\x19\x2a\xff\x7e\x57\xf4\x41\xac\x3e\xdc\xa2\xae\x6b\xcd\x0f\x2c\x24\x7d\x3b\x28\xe0\x13\x9c\xfa\x45\x1d\x43\xbd\xe8\x68\x41\x19\x1e\x63\xd2\x73\x53\x1e\x32\xee\xea\x31\x7a\x28\xef\x15\x5f\x10\x89\x8b\xf2\x6f\xd1\x53\x49\xf0\xe5\xd3\x9c\xef\x6e\x9c\xd2\x28\x4b\x92\x0f\x2c\x59\x82\x38\x63\x89\x94\xec\x45\x7b\x17\xba\xf6\xec\x84\xe4\x5e\x1b\xa1\x79\x5a\xb4\xc0\xb4\x5a\x5d\x3c\x9a\x7b\x5e\x17\x26\x7e\x98\xa6\x78\x4c\x80\xb7\xc8\xa1\x9c\xba\x1a\x46\xfd\x6d\x8f\xa4\x4a\xea\x83\x01\xb3\xbf\xcf\x1e\x2d\x64\x85\x8c\x25\xf9\xd1\xa3\x05\xca\xcf\x72\x00\x2a\xa2\x74\xb8\x6e\xff\xd7\x77\x40\xca\x43\x9e\xaa\x67\x29\xea\x1b\x01\x29\x8e\xb8\x7e\x07\x98\x6d\xa2\x36\x40\x44\x49\x94\x31\x86\x48\x34\x97\x5a\x68\x65\xec\x5f\x52\x4a\x3a\xca\x19\x5b\xc4\x8f\x35\x12\xfe\x7d\x91\x3d\x5d\x4d\xf6\xc3\x6c\x34\x42\xec\x04\x7f\x46\xbd\x6f\xbb\x5d\x38\x0d\xaf\x5e\xb2\x70\x8a\x5e\x63\x81\x9d\xde\xb7\x70\x54\x50\x7c\x38\x9b\x21\x12\xcb\x3f\x67\x61\x96\x22\xf9\xd7\xc8\xaa\xdc\x85\x4a\x95\x7d\x8f\xd2\x19\x25\x29\x12\x3c\x00\x8f\x3c\xe4\x23\xa1\xd0\x02\x73\x42\x89\x35\xc3\x24\x62\x32\xfc\xbd\x98\x92\x6b\xf5\xe4\x02\x28\x80\xf7\x64\x55\xab\xfc\x50\x6d\x95\x2a\x8c\xed\xb6\xa7\xa9\x48\xc2\xa4\x88\x26\x45\xbc\xda\x23\xec\x02\x00\x5a\x2b\xbf\x69\x52\x53\x33\x44\x20\x87\x33\x9a\x24\x6a\xe3\xf0\x30\x3d\x07\x5e\xb1\x3c\x7f\xf5\x80\x22\x3b\x41\xc3\x82\x26\xb3\x14\xf9\x51\x48\x22\x94\x3c\x4b\x12\x0f\xb4\x38\x9b\x57\x77\x76\xc6\x92\xd6\x1c\xa3\x24\x56\x53\x57\x08\x45\xc0\xe7\x13\x44\xd4\x86\xd0\x4b\x03\xbc\x85\xc4\x94\x5c\x48\xf3\x1d\x05\x87\xb2\xd9\x12\x6a\x01\xc8\xa3\x50\x75\xb5\xe0\x13\x46\x2f\x1d\x82\x2e\x1d\x69\x3b\x10\x33\x90\x23\xaa\x09\xe0\x29\xa2\x19\x07\x5e\xc1\x1b\x7c\x8e\xe4\x6b\x67\x47\xdd\xde\x63\xf4\x44\xf0\x09\x5f\xb0\x38\x0f\x40\x6b\x52\x2b\x67\xbf\x45\xcf\xd0\x5e\x99\x72\x98\xca\x26\xa5\x9b\x6c\xd2\x42\x29\x5f\xb7\x4d\xeb\xac\xa8\xba\x5d\x2d\x36\xb4\x62\x14\xa6\x72\x7b\x1b\x55\x65\xcb\x13\xa3\x71\x0b\x83\x85\xd8\x7e\x09\xa4\x30\x84\x29\xcc\x60\x04\x63\x38\x83\xd3\x96\xa9\xe9\x0c\x4d\x5d\xb0\xc0\xed\xf6\xaa\xdd\xce\x2b\xcc\x1f\xfb\xe5\x0f\x18\x51\x32\xc2\xe3\xcc\x7c\xb1\x7f\xc2\x4b\x86\xb9\x2e\x37\x7f\x42\x75\x54\x60\x1f\x13\xcc\xb5\x58\x7b\x54\xf9\xe5\x47\x61\x92\x78\x04\xf4\xd4\xf9\x91\x83\xbc\x00\x76\xb4\x34\xb1\x60\x91\x1b\x7e\xa5\x61\x3f\x47\xf3\xd4\x23\xc0\x1f\x51\xf6\x22\x8c\x26\x5e\x45\xb0\x4c\xfa\x68\x10\x90\x3e\x1a\x88\x35\x4f\xac\x69\x04\x3b\x3b\xf6\x4f\x98\x54\x26\x22\xbf\x56\x66\xe6\xe9\xf7\x4b\x31\x71\x92\xeb\xeb\xc4\x86\x1f\xb4\xdb\x5e\x52\xcc\x37\xd8\xe9\x02\x98\x04\xd8\x4f\x13\x1c\x21\x0f\xf8\x0c\x5d\x20\x96\xaa\xbf\xe2\x2c\x42\x16\x80\x72\x15\xf4\x6c\xf4\x1a\x82\xeb\x6b\x9c\x03\x98\x00\xc8\x2c\xa9\xb5\x32\x9e\x1c\x4e\x42\x53\x2d\x3f\x4a\x96\xb1\xca\x0c\x56\x61\xe5\xa3\x3e\xaa\xd5\xa9\xe7\x74\x83\xe5\x11\x56\x13\x46\x22\xa6\x27\x44\x10\x00\x93\xfc\x16\xdc\x42\x12\xb1\x25\xb6\x43\x6c\x70\xa0\x9e\x26\x2a\x64\x02\x54\x61\xf2\x1a\x4d\x97\x05\x3b\x91\xc7\x9a\x20\x40\x31\x4f\xb1\xed\x01\x2c\x77\x6d\x4f\x9e\x03\x63\xc4\xc5\xc9\x24\x0e\x82\x7c\x99\x4f\xa9\x33\x73\x12\x48\xf9\x39\x38\x44\xed\x36\x3f\x42\x7b\xbc\xd7\x85\xe3\x00\x09\x81\x45\x9c\x36\x29\x0f\xa7\xb3\x1e\x82\x59\x8a\x62\x25\x78\x69\xeb\x9f\xfc\x91\x03\x38\x0f\xfa\xee\x34\x94\x7c\x79\xc6\x90\x14\x9c\xe4\x13\xd7\x51\xc8\xe4\x63\x6f\x29\x5f\x2a\x33\xd5\xd0\x6c\x82\x04\xfd\x25\x95\x8a\xcb\xa5\x74\xe6\x0e\x0a\xe2\xd1\x64\x12\x1c\x7a\xa8\xcf\x07\x01\x86\x08\x00\xb8\xc8\x01\xbc\x30\x13\x99\xf7\x91\x9f\xe0\x11\x8a\xe6\x91\xb2\x0f\x0e\x3a\xf3\x3e\xaf\x15\x49\x9d\xe6\x32\xf0\x92\xa0\x86\x75\xcb\x4e\xed\xe3\xd8\x05\x90\x8a\x1a\xd8\x0f\x13\x1c\xa6\xd5\xcf\xc5\x9d\x15\xdf\x72\x25\xb9\x00\x86\x5b\xb4\xd0\x1e\x7b\x00\xd3\x35\x80\xb8\xd0\x2d\xa5\x06\x17\xc0\x6c\x8b\xba\xd1\xba\x09\x96\xf0\xc8\xd7\xef\xeb\x6d\x47\x9e\x17\x07\xf2\x14\x76\xd0\x15\x47\x24\x4e\x2d\xc6\xa3\x4a\x3c\x56\x30\x53\x2d\x88\xb2\x2c\xe2\x94\x79\xea\xbc\x92\x8b\xd5\x4a\xb3\x19\x62\x9e\xef\xfb\x85\xc2\x09\x20\x96\x7b\x08\x7a\x3c\xb0\x81\x07\x98\x78\x8a\x8b\x83\xa3\x35\x67\xb3\x3e\x53\x61\x55\x41\xab\x9c\xcc\x3b\xdd\xf2\x34\x16\x3b\xaf\xa7\xc9\x65\x28\xf7\x4a\xe5\x5a\xba\x0b\x67\x50\x6d\xa0\xfa\x47\xbd\x3a\x70\xaa\xbe\xe7\x63\xc4\x9d\x8c\x25\xc5\x76\x3c\xdb\xbb\xd8\xdf\x53\x57\x18\x2c\x96\xb9\xa7\xe5\x64\xb1\xfd\xea\xe4\x94\xef\xc9\xfd\x7f\x96\x17\xa2\x8f\x96\x5d\x78\x20\xa4\x89\xe7\x62\x6b\xbf\x0e\xf9\xc4\x1f\x25\x54\xc8\x15\xfe\xa9\xd9\x84\x7b\xfb\xe8\x6f\x40\xe0\xad\xf2\xf9\x3d\x4a\x69\xc6\x22\xf4\x21\x0d\xc7\xc8\x3f\x9e\x65\x27\xa2\x7b\xff\x94\xf2\x30\x39\xc5\xd1\x79\x0a\xae\xaf\xbb\x4a\x0c\x8b\x66\x99\x3f\xcb\xd2\x89\xc2\xab\xbd\xbd\xb9\xda\xde\xb8\xd8\xdb\x13\x0f\x2b\x49\xc2\xc2\x92\x10\x22\x14\xa8\x24\xa8\x8f\xab\xf0\xa4\x86\x96\x25\xd7\xd7\xeb\xaa\xbc\x3f\x39\x29\xa0\x52\x11\x79\xeb\x01\x23\x16\x60\x64\x6f\xbf\xfb\xf8\xa9\xfc\xa7\x0a\xa2\x1a\x40\x40\xa9\xcc\x15\x5d\x98\x04\xdd\xd6\x88\x32\x4f\x0a\xe4\x0e\x1d\x29\x71\x50\x52\x7a\x89\x75\xe4\x9f\x8a\x82\x3e\x95\x1f\x06\x2d\x3c\xf2\x76\x38\xd0\xaf\xae\x20\x3d\x63\xdc\xb8\x38\x7c\x69\x71\x48\x50\xf9\xbc\xd1\xe2\xc0\x30\x98\x78\x64\x19\xdd\x2d\xba\x66\xc5\x70\x03\x62\x20\xad\xb4\x37\x9f\xe4\x68\xbd\xd0\xfc\x3c\xe1\x61\x74\xde\x0b\x77\x59\xb1\x9c\x69\x50\x87\xb4\x61\x39\xd7\x55\x51\xcb\x09\xb3\x60\xe2\xa5\x37\xac\x4e\x8b\xae\x5f\x70\x3d\xaf\xd4\x9a\x97\xdd\x25\xad\xf7\x57\x9d\x64\x56\x9d\x64\xb6\x2b\x18\x14\xdb\x0d\x42\x98\xec\x06\x59\x9e\x1b\x2d\xca\x68\x0b\x66\x51\x57\x51\xe2\x58\x48\xfd\xb0\x69\xf3\x58\x5f\x24\x3d\x95\xd2\x17\x0f\x0e\x17\x7c\x75\x5f\x8d\x1d\x09\xfe\x2c\x8e\x96\x68\x96\x79\x96\x30\x40\x4a\x3d\x45\x8e\x54\x9e\xcd\xaa\xba\x1a\x64\x9b\x16\x12\xd6\xba\x21\xa4\xac\xa4\x25\x4b\xaf\xf1\xf4\xaa\xf3\x0a\x70\x7d\xdd\x1f\x80\x42\xcc\x4b\x29\xe3\xde\x05\xf0\xa7\xe1\xcc\xf3\xb0\x14\x1f\xc2\xf4\xbc\x27\x99\xcf\x18\x71\xe0\x61\x7d\x4d\x08\x40\x8b\x4a\xab\xdf\xab\x6c\xb4\xba\xd4\xcd\x35\x0b\xf6\x19\xcd\xb2\x5e\x15\x01\x08\xc0\x69\xd1\xb2\x52\x9e\x0b\x55\x2e\x07\xfe\x8c\x51\x4e\xf9\x7c\x86\xa0\x32\xbf\xf4\x93\x81\xb1\x0a\x8e\x11\x7f\x7b\x49\x0c\xd3\x79\xae\x9f\x2e\xa5\xcc\x8b\xeb\xad\x00\xb4\x8a\x00\x9c\x05\xa3\x6a\x9d\x0a\x9f\xe9\xd3\x01\x5c\xd4\xd9\x54\x95\x89\x59\x4c\x0b\x5a\x22\xa9\x11\xb7\xa6\xab\xfa\x37\xac\xaa\x1f\xde\x75\x88\xda\x00\xd1\x2c\x73\x61\x3f\xdd\x12\x35\xa2\x55\x0d\x35\xb5\x7e\xa7\x06\xe0\x6c\xcb\xae\xa7\x66\xcd\xd7\xf5\xae\xe5\x99\x7e\xb4\x65\xe7\x9a\xb6\xab\x7d\xc7\x40\x1a\x75\x3e\x07\x97\x96\x1a\xfd\x79\x03\x35\x1a\x5d\xa1\xa8\x13\xd1\xe9\x34\x24\x71\x07\xc5\x98\x53\xd6\xb9\xe2\x88\x4d\x3b\x61\x1c\xce\x78\x5d\x9f\xae\xf5\x22\x34\xbb\x87\xf0\x55\x19\x9e\xb6\xd7\xff\x78\xd5\xed\x76\x3e\x5e\xed\xbf\x1c\xec\x8d\xad\xa9\x49\xf0\x2b\xd2\x9c\x12\xba\x95\x58\x23\xe0\xc7\x24\x4c\x02\x54\x98\x7e\x8e\xd5\x14\x8f\xc3\x24\x19\x86\xd1\x79\xc0\xf5\xa1\xa9\x8a\x03\x2d\x4c\xc4\x21\x0f\x7f\xc2\x29\x47\x04\xb1\x00\xf9\x2a\x90\x44\x1a\x5c\x16\x96\xc5\x45\x06\x64\x5c\x20\xa2\x54\x17\xa9\x31\xe1\xa9\xb4\xfe\xeb\x51\x8a\x0a\x41\x53\x2b\x7f\x88\x49\xac\xf5\x21\x24\xb5\x52\xe4\xb9\xff\xd2\x3f\x7a\xfa\xed\xc4\x05\xf9\xf2\x10\xd2\x60\x16\x04\xa5\xeb\xce\xff\xe9\xc5\xcb\xd3\x4f\xcf\xde\xbf\x7f\xfb\xf3\xf5\x75\xf5\xcb\x87\x77\xcd\xe5\xef\x7f\xfc\xc7\xab\x15\x4d\x9e\xbf\xfd\xf9\x8d\xfa\x02\x0e\x50\x92\x22\x67\x69\xb8\xe3\xb7\x6f\x4e\xdf\xbf\xfd\xe9\xd3\x07\x50\xc1\xae\x01\xfd\xe3\xd0\xf9\x38\x74\x7d\x86\x66\x28\xe4\x9e\x8d\x56\xed\xde\x29\x38\x94\x46\xb6\xeb\xb6\x9a\x07\x7a\xf1\xe6\xf4\xc5\xfb\xa6\x41\x12\xe2\xb9\x2e\x58\xb5\x98\x95\x31\xc1\xf2\x4a\xfa\x31\x4e\x67\x54\xf0\xd5\x15\xe3\x3e\x7f\xf1\xd3\x8b\xd3\x17\xa0\x01\xf4\xc3\xae\xb1\x25\x36\xcf\xba\x36\xb3\x4a\x0f\x8a\xef\x74\x61\x67\x1f\x58\x03\x17\x1d\xdb\x02\x1e\x43\xb3\x24\x8c\x90\xe0\x1b\xae\x36\x49\xd6\xc6\xe3\xb5\x91\x8c\xa5\x5b\xff\x56\x5e\xaf\x3c\x8f\x51\xca\x19\x9d\x1b\x83\x64\x33\x16\xf2\xb5\x4e\x30\xfb\x60\x48\x69\x74\x8e\xf8\x16\x07\x02\x22\xfa\x59\xeb\xfb\x3b\x12\x90\xff\xea\xc5\xb3\xf7\xa7\x3f\xbc\x78\x76\xfa\xe9\x47\x41\x20\xff\x7c\xf6\x93\x39\x27\x1a\xbf\xed\xa3\xa7\x37\x9c\x14\xd2\xaa\xd3\x7c\x52\xc8\x09\x9b\xe3\x40\x3e\x04\x17\x10\x88\x7d\x4a\xe8\x0c\x91\xc0\x03\xe6\x24\x48\x11\x89\x7f\x4e\x5f\x85\x24\x4e\x27\xe1\xb9\x65\x64\x26\xf1\x29\x9f\x0b\x51\xa5\x28\xe2\x21\xe3\xaf\x50\xc8\xf8\x50\xec\x0f\x31\xb5\x35\xe7\x8a\x3a\x52\x72\x39\xa4\x0e\x94\x0a\x70\x70\x28\x1d\xa7\x24\xf8\xf7\x93\xb7\x6f\xfc\x59\xc8\x52\xe4\x61\xb9\xb8\xa0\x45\xfc\x94\xc7\x34\xe3\xed\xb6\xf9\x4b\x7e\x68\xb7\xcd\xd1\x22\xa5\x92\x61\x98\xa2\xbf\x3d\x7d\x8e\xc4\xea\x28\xef\x30\xf0\x2a\xf5\xcd\x98\x51\x42\x53\x64\xcf\x93\xd3\x99\x0d\xfc\x0d\x9b\xb3\xbe\x4b\xfe\xa5\xff\xe4\xdf\x0e\x1e\x1f\xec\x3f\x7d\x7c\xb0\xff\x6d\xf7\x60\xff\x6f\x4f\xa6\xcd\x55\x45\x27\xa7\x13\xe4\x44\x94\x10\xfd\xa8\xf3\x24\x4c\x1d\x09\x4e\xec\xbb\xd2\x3a\xc4\x50\x8a\x3f\xa3\xb8\xb6\x0a\x05\xba\xf3\xbc\xf2\x73\x61\x2d\xa8\xac\xe8\x49\xec\x95\x8e\xa7\x05\xe7\xf3\x4f\xa2\xc7\xde\x42\xbe\x1b\xdd\xab\x82\x15\xd1\x24\x85\x13\x84\xc7\x13\x5e\xfb\xc2\xe8\x65\x2a\xb6\x50\xbe\x44\x04\x37\x8f\xa9\x1f\xd0\xed\xed\xc3\x30\xe3\x93\x4f\x92\xc2\x7a\x25\xb1\x5d\x5f\xbb\xae\xec\xb9\x46\x34\x9a\x4c\x4c\x81\xd0\xea\x58\x90\x22\xfe\x23\xe1\x88\x5d\x84\x89\xf2\xe0\xdd\x3c\xbc\x74\x87\xc1\x7d\xf4\x54\x0c\x51\x59\xd9\x45\x94\xa0\x90\x15\xfd\x35\x8c\x67\xf3\x26\xe5\x61\xb8\x61\xb0\x94\xc7\x98\xf4\x16\x82\xbc\x7a\x16\x15\xbe\x20\x36\x15\x22\x20\x51\xb9\xc9\x91\x94\xd0\xc6\x90\x8c\x06\x6b\x7e\xb3\x9b\xda\x84\xde\x2d\xb5\x44\x82\xd3\xda\x0d\xef\xc7\x75\xbd\x91\xe3\xcf\x4c\x2e\xe5\x0c\x85\xd3\xc2\xe9\xbe\xaa\xda\x8c\x26\xc9\xca\x4a\xba\x0f\xe9\xc8\x92\x4e\x59\x92\xae\xf2\x42\xc0\x25\x07\x84\x32\x87\x0d\xe1\x08\x4e\xe0\x18\xce\xe1\x05\xbc\x84\x9f\xe1\x2f\xf0\xaa\xf4\x4c\xbc\xfd\x3d\x79\x26\xde\x19\x91\xd0\x38\x19\x1d\x4c\x1c\xf4\x40\x36\x3b\x54\x8e\x7b\xfe\xa7\x47\xe4\x0f\xe7\x11\x51\x1b\x2e\xa8\x6e\x23\xcb\xaa\x91\x54\x9c\x22\xbc\xc9\x2d\xf2\xa9\x70\x8b\x98\x98\x91\xaa\x67\x44\xc7\x9a\x14\x86\x0d\x0e\x60\xc6\x92\xb5\x5e\x12\xa4\x1c\xc7\x2f\x43\x9c\x64\x0c\x55\x75\xa7\xd7\xc1\xb7\xe8\x29\x3c\x91\x6e\x12\x10\x1c\x8a\x42\x9a\x20\xff\x32\x64\xc4\x3b\xfb\xe9\xed\x3f\x9c\x97\x2f\x4e\x8f\x5f\xf5\x9c\x63\x9a\x25\x31\xf9\x86\x1b\xc6\xeb\x70\xea\xc8\xc0\x09\xd0\xaa\x75\x7f\x22\xad\x96\x9f\x02\x6f\x18\x78\x5d\x48\x57\x45\x8f\x28\x63\xbe\xf1\x2c\x24\x74\x7c\x22\x0f\x25\xc4\x7c\xf9\x34\x34\x4e\xcd\x23\x8e\x00\x4e\x82\x1a\xea\x44\xf5\x77\x14\x13\x29\x65\xba\xf2\xf9\x3a\xa1\xef\xe2\xc4\x05\x70\x2c\x2a\x67\x4d\xce\xe7\x8a\xa9\xc8\x20\x17\xf2\x20\x6d\x0e\x36\x09\xcb\x60\x93\xe6\x60\x9a\x6e\x25\x06\x45\x1a\xb4\x6b\x71\x25\x3c\x3f\x6b\x15\xd2\x91\x57\x1a\x9d\x95\x4b\x1f\x79\xd8\xf2\xd4\x23\x9f\xa3\x2b\xee\x01\x00\x4f\x3c\x0c\x8c\xe9\x57\x0d\x90\x84\x98\x9c\xa2\x2b\x7e\x44\x04\x7f\x9c\xf9\xb1\x94\xcf\x80\x38\x19\xb4\xec\xd7\x62\xed\x36\x33\x2a\xc3\xeb\x76\xdb\x63\x01\xf3\xd3\x6c\x98\x72\xe6\x75\xe1\x6b\x69\x3b\xfc\xe6\x23\xf9\x48\x3a\xc5\x7f\xce\xe9\xfb\x0f\x6f\x8e\x9f\x9d\xbe\x78\xde\x73\x8e\x13\x1c\x9d\x3b\x0a\x85\x62\x65\x2f\x30\xba\x74\xf8\x04\x39\x43\xca\x39\x9d\x2a\x8b\x33\x72\x12\x3a\x76\xca\x0e\xbe\xb1\x03\x26\xd4\x22\x30\xbb\x68\x79\x91\xa4\x16\x3c\x7f\xc0\x05\xb2\x63\x9a\x5e\x7f\x4d\xcb\x53\x62\x45\xe2\x78\x0d\xa2\x14\x19\x0b\x44\x5d\xd4\x1c\x56\xc9\xe6\x0e\xab\x26\x37\xd5\x3b\xed\x11\x52\xf1\x59\x2e\x80\x6f\x75\x81\x09\xd5\xba\xd4\xae\x23\x53\xb1\x98\x97\x0b\x77\xf6\xcb\xea\xf2\x02\x02\x0a\xa7\x52\x72\xf9\x5c\x6b\x63\x4f\x45\x9d\xa3\xd6\x17\xb3\xc3\xeb\x9f\xf4\x06\x76\xcb\x12\x85\x24\x1b\xc8\x31\xe5\xf4\x95\xac\xf7\x8b\x1e\xd2\xfe\x72\x2a\xeb\x5f\x69\xdf\x96\x1d\x6c\x37\x46\xdc\xa1\x19\x9f\x65\x42\x74\x15\x8b\x86\x02\x35\x9e\x50\xec\x35\x9d\x69\x88\x8f\x8c\x2c\x1b\x6b\x41\x3b\xc4\x49\x0b\x59\x5a\xf7\xde\x77\x7b\x63\xe8\xb6\x13\x7e\xe0\x82\xb2\xf0\x50\x16\x8e\x45\x61\x4b\x85\xad\x4e\x8b\x85\x0a\x49\x8a\x4f\xe9\x2b\x3e\x4d\x3c\x64\x62\xcf\xa4\x0d\x77\xc2\xa7\xc9\x49\x38\x42\xc0\xe3\x20\x17\xdc\xc9\x2c\x9a\xaf\x7e\xb4\x2a\x7b\x61\x8c\x4c\xb0\x13\x46\xe9\x52\x84\x9d\x99\xae\x2b\x8e\x62\xa9\x24\x89\xd3\x5c\x87\xd0\x16\x33\xd9\x45\x2d\x6e\x1f\x10\x3c\xe0\xe6\x80\x30\xe5\x9d\xd7\xc0\x26\x4b\xb5\x08\xc6\xa0\xc0\x19\x16\xbc\xcd\x73\xb9\x7c\xde\x1e\x81\x1c\x46\xc5\x3c\x71\x7a\x92\xcd\x84\xb4\x8d\xe2\xa3\x0a\x5d\x97\x4b\x1e\xd5\xa3\xc8\x10\x00\xbd\x15\x75\xe3\x86\xba\x75\x93\x85\xda\xb3\x50\x21\xad\xf8\xa6\x14\xa2\x82\x40\xad\xe0\xd6\x75\xbb\x0d\x1a\x4a\x28\x78\x90\xec\xc6\x53\xca\x8f\x19\xb1\xfa\x5d\x06\x23\xe5\xf0\x32\x38\xf7\x2e\x6c\xb3\xab\x59\x96\xfe\xf0\xae\xd6\xeb\xcf\xf5\xae\x2b\x3b\xaf\x3f\xba\x6b\xff\xb5\xde\xd5\x2e\x71\x61\x7f\x72\xb3\xa1\xb9\xa9\x21\x80\x17\xb6\xa5\xf9\x97\x3a\xf4\xe5\x0e\xee\x8f\xef\x0a\xfa\x55\x53\xe7\xea\x10\xe8\xcf\xef\xda\xf9\x85\xb2\x91\x9f\x06\x9f\x2c\xf3\xd0\xe9\x06\x7a\x27\xa1\x31\xfa\x23\x04\x99\x95\x8a\xdc\xf4\xf7\xa4\xc8\x0d\xff\x54\xa8\xfe\x70\x0a\xd5\xdd\x42\xcc\xc6\xeb\x42\xcc\xc4\x6e\xdd\x3c\xb8\x6c\xd4\x10\x5c\x36\xd9\x3c\xb8\x4c\x4a\x06\xe3\xa6\x20\x2d\x01\x46\x63\x78\x96\xfc\xc0\x74\xa8\x82\x74\xdb\x2f\x07\x64\xd5\xea\x4c\x57\x87\x60\x59\xd1\x50\x3a\x9b\x63\x53\xf0\x55\x53\xad\xa1\xe7\x45\x5f\x20\x74\x4a\x8d\xf6\xe0\x41\x53\xd3\xa6\xa0\xa9\x58\x8b\x94\xf5\x8f\xc6\x13\x3d\xdb\x20\x68\x4a\x52\xea\x91\x98\xc5\x27\x1c\x07\x76\xdc\x54\xb1\xc2\xf9\xbd\xc5\x4a\x1d\xbf\xfb\x20\xa3\x6e\x8e\x29\x49\xb3\x29\x8a\x6f\x15\x1a\x35\xba\x31\x34\x4a\xcd\xdf\xff\x90\xa2\xf8\x36\x21\x4e\xa3\x0d\x42\x9c\xb6\x8e\x64\x99\xac\x8c\x64\x91\x5f\x1e\x3e\xfa\xe4\x96\xe1\x16\xd1\x72\xb8\x45\x54\xf1\xcc\x07\xc3\x6a\x9d\x7b\x0e\xb7\x98\xad\xea\xff\xfe\xc2\x2d\x6a\x03\x6c\x1c\x6e\xb1\xd4\xaa\x86\x9a\x5a\xbf\xdb\x84\x5b\x34\x35\xac\xf5\x1e\x29\x71\x6f\x1e\xd8\x71\x03\xf3\x0d\xc4\xbd\x8a\x89\x7d\x9d\x9c\xb7\x81\x75\xbf\x6e\x91\xdf\xf4\xce\xdd\x3a\x17\xc8\xca\x8b\x41\x32\x8a\x50\x08\x7c\xad\xbb\x47\x60\x08\xbe\x96\x05\x9e\xe6\x5d\xab\x8c\x3a\x0b\xac\xfd\x45\x3d\x54\x5c\x85\xeb\xf1\x5c\x9e\xf4\x32\xb0\xf1\xe0\xc0\x9c\x00\xda\xa8\xa2\x6f\x97\xc9\xfe\xa9\xb6\xc8\x70\x8f\xd9\x16\x19\x00\xa5\x59\xd0\x36\x3e\x02\x8f\x01\x20\x03\x1f\xa9\xbe\x33\x24\x3b\x08\x75\x07\x54\x1b\x71\x44\x8d\xd0\x80\x66\xae\xc6\x41\x6d\xab\x11\x70\xe9\x23\x40\x99\x71\x42\xd0\xe2\xc6\xbb\x2f\x35\x48\xeb\x4e\x1e\xd2\x47\x91\x71\xbe\x97\x97\x67\x70\x79\xc5\x45\xb9\xae\x60\x78\x0f\x5c\xd4\xb8\x64\x56\x70\xd3\x7d\xf4\x44\x32\x53\x83\xee\x2f\xc0\x50\x89\xec\x1d\xb2\xc0\x15\xfb\xc1\x85\x54\xfd\xf6\x92\x20\x05\xab\x54\x06\x31\x09\x5b\x65\x48\x56\xaa\x0c\xc9\x0a\x95\x21\xa9\xab\x0c\x37\x0a\xb7\xd4\x52\x19\xb4\x76\x5f\xb1\x0d\x48\xab\x73\x82\xc9\x39\x8a\x3d\xe0\xcf\x10\x1b\x51\x36\x2d\x2d\x00\x4b\x55\xad\x7b\x5b\x79\x0e\xa3\x20\xb4\x4e\x9a\xd8\x20\x63\x16\x88\x83\x7b\x1a\xdc\xe5\x5c\x85\xa3\x60\x91\x43\x5b\x7f\x99\xae\xd0\x5f\x46\x42\x7f\x99\x6a\xfd\x65\x54\xd5\x5f\xec\x9f\x70\x54\xd7\x5f\x46\x2b\xf5\x97\xd1\xf5\xf5\xa8\xae\xbf\x8c\xaa\xfa\xcb\x28\x98\x6d\xa2\xbf\xc8\xf8\x0e\x83\x46\x4f\x28\x9a\x08\x5c\x5f\xa3\x1c\xc0\x11\x80\x43\x4b\x7f\x19\xd5\xb4\x8b\x91\xd6\x5f\x2a\xe5\x47\xa3\xe5\x25\x1e\x16\xfa\xcb\x68\xbd\xfe\x52\x1f\xa1\x99\x4a\x05\x88\x23\x31\x3d\xa5\xbf\xa4\xc1\x08\x86\x8a\x57\x68\x4f\x28\x1c\xc2\x91\xc5\x33\xb2\x4d\x78\x06\xa3\x53\x9c\xa2\xa6\x94\x16\x9a\x6b\xc8\x2f\xa2\xde\xd5\x7c\xc9\x44\x60\x5a\xcb\xaf\x1d\x75\x89\x74\xe9\x94\xbf\x97\xb8\x3a\x79\x50\x91\xd5\x47\x15\xb6\x8e\xaa\xbc\x6c\x4e\xb6\x40\x81\x61\x8f\xab\x1d\xf5\x7f\x60\x24\x28\xff\x7f\x61\x2b\x5c\x29\x3c\x2c\x05\x48\x15\xd6\x0e\xfc\x65\xdd\xd6\x77\x0a\xcc\xfa\x75\xf6\x43\x86\x93\xb8\xd8\x8a\x75\xd4\x96\xa9\x07\x36\xf0\x63\xe0\xc2\x0f\xf1\xdf\x04\x12\xcd\x35\x72\x71\x12\x99\x4f\x12\x8c\x54\xbb\x19\xf2\xdc\x06\x00\x05\x87\xa4\xb0\x0a\xa8\x7a\x3d\x94\xab\x6d\xcd\x02\x62\x6d\x67\xb6\xc1\x32\xd6\x2c\x72\x0f\x9d\x15\xc3\x5c\x01\x61\x4b\x99\x31\x60\x22\x15\xa7\x67\x02\x0e\x8f\x1d\xee\x1f\xb1\xce\x7e\xaf\x0b\x20\x0d\xf6\x0f\xe8\x77\xec\x80\xee\xee\x82\xa4\x4f\x3b\xfb\x03\x2b\x6f\x06\x1d\x68\x5d\x2f\xb4\x1a\xfb\xbe\x9f\x14\x69\x30\x42\x7f\x1a\x5e\xfd\x24\x47\x08\x10\x0c\xfd\x4f\x09\x9e\x62\x0b\xa6\xba\xcf\x4e\xb9\x11\xb8\xbe\x69\xad\x1a\xb6\xd0\x61\xb7\xdd\x56\xd2\xd3\x4c\x87\x3a\x22\x90\xc3\x50\xea\x6e\x76\x5f\x66\x7a\x68\x79\x7a\xd8\x82\x10\x01\x48\x82\xee\x01\xf9\x0e\x1d\x90\xdd\x5d\x80\xfb\xc4\x9e\x14\x19\xb4\x8a\x7c\x16\xe1\x6c\x96\xcc\x15\x4d\x60\x2d\xa8\xa9\x19\x98\x00\x35\xd5\xbb\x80\x45\x81\xb6\x21\x34\x7c\x35\x34\x7c\x09\x1a\x23\xd6\x62\x1b\x1c\x5e\xa0\xb8\x0a\x15\x13\xb0\x60\x92\x22\xc6\x9f\xf1\xdb\x41\x83\x83\xee\x01\xfe\x0e\x1d\x60\x09\x0d\xb6\xa1\xc1\x25\x34\x64\x13\x68\xe4\x2f\x49\xdb\xc7\x94\x70\x44\xf8\x73\x1c\x1f\x4f\x42\x32\x46\x06\xd4\x8c\xa4\x13\x3c\xaa\x40\x5a\xbf\x50\xee\x1e\xcb\x6c\x6c\x8e\xae\xea\x50\xc2\xa9\x13\x3a\xef\xd5\xd6\x91\x60\xbb\x82\x1c\x72\x21\xaa\x2f\x04\x4d\xf4\x38\x54\xcb\xd1\xc3\x79\x20\x2b\x58\xb2\xd5\xc2\x60\xa7\x47\x96\x3e\x6e\xb0\x63\x6b\xe1\x53\x77\x54\xdb\x4c\xaf\x42\xad\xe8\x28\x7d\x61\x83\x70\xab\x07\x54\xee\x20\x55\xca\x82\xb6\xe6\x97\x96\xfc\xf8\x4f\xe3\xf8\x1f\xce\x38\xde\xa0\x8a\xcf\x02\x2f\xac\x5b\x75\xb5\x39\x78\xb5\x76\x6e\x8e\x6f\xad\x73\x43\x5e\x8b\xc0\xc0\x85\xfe\x8d\x2c\xfd\xdb\x0a\x4b\x1f\xd2\x78\xee\x8f\x11\x7f\x8f\xc2\x18\x31\xa5\x5f\x97\x9a\x52\x11\xca\x53\xa4\xf1\x68\x71\xad\x3e\x79\x20\x97\x5a\x3c\xad\x69\xf1\x48\x6b\xf1\xd8\x68\xf1\xa5\xf2\xcd\xe4\x18\x2e\xc4\xca\xa6\x9e\x04\x3b\xfb\x30\x0c\x4c\xca\x27\x27\x95\x87\x61\x61\xbf\x53\xc6\x85\x9d\xe4\x00\xa8\x29\x60\x5f\xb4\xf7\xec\x69\x88\x53\x47\xa1\x95\xc3\x98\x12\x79\xe8\x20\x31\x7a\x12\x60\x18\xee\xca\xe8\x13\xb1\xb1\x3d\x0e\x17\x6a\x27\x2b\xfc\x77\xf6\x77\x82\x40\x1c\xd6\x31\xba\x7a\x3b\xf2\xdc\xdc\x35\x6a\x7b\x1f\x22\xc8\x07\x81\x60\x9e\x3c\x9a\x78\x7b\x9e\xff\xd7\x8f\x39\xf0\xfc\xbf\x82\x47\x7b\xa0\x15\x06\xbc\x55\xb1\x3c\xe0\xc2\xf2\x40\xa4\xe5\x81\x15\x96\x07\x04\x64\x7e\xaa\x46\xcb\x03\xae\x58\x1e\x08\x50\xe1\xb1\xe2\x00\xf4\xbc\xec\x26\x4b\x43\x72\x67\x4b\x43\x61\xb7\xd7\xeb\xf1\x5b\x1a\x1a\xa2\xaf\xd9\xd0\xc0\x71\xe4\x8c\x11\x77\xac\x10\x89\xc2\x9c\xb0\xb3\x73\x89\x49\x4c\x2f\x7d\xb1\x71\xc4\x18\xca\xbf\x2f\x8d\xd2\xf5\xdc\x45\x45\xa3\xc5\x88\x26\x09\xbd\x14\xb8\x59\x6d\xc8\x58\xb2\x5f\x54\x36\xba\x5a\xb3\x22\x5b\x54\xbb\x8d\x8a\xfd\x08\x57\x58\x38\x2a\x46\xef\xe5\x24\x4e\xfd\xf0\x66\x5b\x6c\xb6\xb6\x0b\x00\xb3\x8a\x55\x36\x88\xab\x0d\xd4\xa2\xf7\xd3\xbb\x1a\xa9\x33\x3b\x81\xcc\x6c\x03\x89\xa1\xca\xdb\x1f\x42\xc4\xb7\xb2\x2d\xf1\x40\x53\xc4\x29\xba\xe2\xea\x1a\x06\xbb\xbe\xae\x48\x57\xd8\x1c\x48\x0d\x09\xf3\x5c\x57\x1e\x78\xe2\x07\x0e\x9e\x08\x31\xd0\x1f\xce\x39\x52\x82\xb8\x92\x08\x77\x03\x15\x51\xef\x8f\x18\x9d\x1e\x4f\x42\x76\x2c\xce\x36\xd4\xc7\x83\x52\x08\xcc\x73\x0b\x47\x7c\x1d\x8e\x68\x8c\xd2\xce\x88\xb2\x8e\xcc\x3e\xf4\xf0\x1a\x90\xe1\x39\x7d\xe4\x8b\xb1\x07\x2d\x9d\x21\x2a\x15\x34\xac\xfe\x2a\xc5\x17\x79\x6d\x46\x6a\x19\x9e\xf2\x24\x67\xa9\x4c\x6c\x57\xe8\x07\x82\x47\x86\x11\xf7\x80\x9f\x11\xfc\xab\xa7\xaf\xfc\xa2\xe0\xd0\x75\x77\x91\x3a\x51\x57\xcd\x5c\x5f\x60\xaa\x08\x90\xea\xda\x42\xe7\x17\xf1\xb7\xa4\x1a\x55\x89\x75\x12\xbc\x9c\xf7\x51\xa8\xee\x85\x74\x26\xe7\x86\xae\xaf\x3d\x14\xb8\x6e\xe9\x81\x13\xac\x0c\x4b\x52\x50\x77\x21\xd8\x4f\xf2\xb2\x4c\xc6\x47\x9d\x7f\x73\x81\xaf\xba\x2f\x23\xcb\x4a\x35\x5a\x2e\xee\x0f\x73\x8e\x94\x56\x40\xc0\x6d\xc4\x8b\xe5\x5b\x18\x01\x29\x8a\xed\x2b\x42\x95\x15\x52\xb3\x90\x57\x7d\x40\xa1\x6d\x58\x49\x9e\x68\x09\x56\x09\x78\x39\x51\x4d\xf3\xd5\x89\x6a\x06\xcc\xd6\xaf\x48\x1a\x85\x33\xd4\x11\x42\x4e\x47\x5e\xcf\x7e\x70\x62\x34\xe7\x67\x19\x0b\xd8\xff\xef\x61\xe7\xf3\xb3\xce\x7f\x75\x3b\x7f\x87\xfe\xa7\xdd\xef\xff\xb2\xd7\x19\xec\x8d\x33\xe8\x7e\xfc\xf8\xa8\xed\xae\x05\x5f\x0a\x40\x55\x7a\xd2\x45\x65\x4d\x75\xf0\xed\x21\x72\x81\x19\x25\x4d\x09\x60\xef\xc7\xf2\x25\x4e\x22\x12\xb8\x33\x46\xe3\x4c\xe5\xd4\xde\x09\xac\x34\x70\xd6\xf8\xed\x76\x51\xdc\x37\x0a\x53\x82\x3b\x53\xcc\xc2\x31\x72\x07\xed\xf6\xce\xbe\xdd\xb4\xa9\x8e\x8f\x88\x38\xae\xe3\xa3\x82\x48\x7a\xfa\x0c\x94\xf3\xbf\xbe\x6e\x4a\x45\xbb\xce\xc6\xa6\x53\x6d\xc7\x19\x0b\x97\x73\x73\x4e\xa9\xca\xb9\xab\x01\xc1\x64\x94\x20\x21\xfa\xdc\x33\x22\xad\x13\x5b\x05\x9d\x2e\xa5\x32\xed\x36\xa6\x32\xed\xda\xa9\x4c\xbb\x83\x5e\x17\xe2\x5b\x67\x41\x25\xa9\x0b\x93\xe5\xd6\x8f\x1b\x5b\x3f\x1e\xb4\xdb\xf6\x2f\xbd\x75\xa9\xd0\x12\x45\x4f\x41\x10\xe0\x23\x8f\xfa\x24\x24\x34\x45\x11\x25\x71\x1a\xa0\xbf\xec\xa3\x27\x90\xfa\x53\x1c\xb1\xa2\xd0\x8e\x53\xf8\xcb\x3e\xfa\xdb\xde\x3e\x7a\x02\x20\xaa\x94\xab\xa0\x86\x9e\x3b\x9d\xaa\x8e\xdb\x6d\xaf\xd6\x8b\xea\x7a\xa9\xd5\x13\x1d\x79\x1d\x06\x58\x42\xb5\x23\x1b\xcb\x7e\xc4\x9f\xd7\xd7\x5e\x18\xb8\x42\x98\xb0\x12\x82\x18\xaa\x35\xf4\xe0\x21\x28\xaf\x43\x8e\x70\xc2\x11\xfb\x61\xee\xb9\x98\xbc\x56\x54\x21\x19\x80\x28\x51\xe9\x1d\xaa\x9c\x84\x0a\x05\x38\xed\xa3\x81\x4c\x47\xa7\x07\xc8\x02\x52\xc9\xe7\x04\x82\xc3\x05\x1e\x79\xb4\xcf\x7d\xd1\xc7\xc0\x70\x2c\x1c\x14\x45\x2d\xa4\x58\x12\xf3\xb0\xd4\x01\x41\x6e\xce\x91\x1c\xc0\xfe\x40\x2a\x3e\x99\xb9\x11\xad\x3f\x65\xfe\x2f\x14\x13\xcf\x75\xdc\x32\x43\xad\xf4\x51\x8e\x30\x89\x05\xc0\x69\x36\x1a\xe1\x2b\xa9\x15\x24\x20\x2f\x18\x48\x7f\x41\x64\x56\xf9\x39\x0a\x59\xea\x42\x55\x4b\xfd\x74\xa1\x99\xb6\x10\x94\x4c\x72\x7d\x23\x75\x43\xdd\x70\x4a\x09\x9f\x58\x2d\xe5\xef\xcd\x9a\xc6\xe1\xdc\x6a\x18\x87\xf3\xcd\x9a\x4d\x68\x66\x83\x3a\x71\x61\x42\xc9\xf8\xc4\xfc\xa4\xd9\x5a\xc8\xf7\x4b\xc8\x31\xc9\x64\xea\xfd\x02\xf4\x6a\x4f\xea\xfb\x66\x7d\x69\xaa\x2c\xfb\x4a\xab\x7d\xa9\xef\x9b\xc2\x95\x24\x78\xa9\x43\x21\x43\x6f\xd6\xba\xdc\x24\x65\xeb\xff\xf3\xbf\x2b\xcd\xf7\x57\x36\xb7\x76\x6f\xd9\x9a\xdc\xd0\x78\x00\x99\x0c\x7e\x83\x04\xe8\xb0\x72\xd6\x62\x01\x69\xb7\xb9\x5f\x22\xe1\x68\x3f\x08\x02\x74\x64\x17\xf5\xa4\xd1\xa1\x78\xb6\x01\x78\xf6\x47\xd0\x13\x8c\x01\x89\x4e\xec\xf1\x8e\x96\xdb\xa4\xba\xbe\xf9\xab\x4c\xe1\x8a\xf2\x47\x8b\x6a\xf3\xeb\xeb\x3a\x58\xae\xe3\xf6\x5c\x37\x7f\xb4\x60\xf9\xd9\x5a\xf6\xab\xdf\x67\xa0\x69\xcd\x25\x85\xd3\x0e\x9e\xdd\xeb\x45\xf5\x6a\x34\x23\x1e\x79\x3b\xe8\xfa\xba\x34\x75\x2c\xc9\x72\x17\x7f\xf3\x10\x38\x3a\xeb\x8b\x09\x0f\x7a\x8f\x16\x38\x3f\xeb\xc9\xd9\xab\xbf\xd7\xcd\x6a\x8c\x08\x62\x21\x47\x1d\x79\x4b\x5f\xc5\x2a\xdd\xd6\xd7\xa4\x6c\x03\x38\xb0\x8d\x85\x48\x9e\x56\x8d\x8a\xdf\xc9\x7c\x3a\xa4\x49\xaa\x5a\x91\x60\x5d\x1d\xd1\x0d\x6f\xb7\x3d\x12\x98\x53\xd9\xb2\xec\x95\x4e\xe3\x9b\xf4\x4b\x01\xa3\xa5\xdf\xcb\x6b\x66\x58\x9e\xb5\xda\xd6\x8d\x21\x29\x0e\x5b\x9c\x57\x85\x6f\x63\x5f\xe7\xc1\xfe\x01\xff\xae\xce\x34\x0f\xf8\xee\xae\x99\x89\xd0\x23\x77\x2c\xce\xc9\x6d\xbe\xcb\x07\xbd\x45\xde\xe2\x7f\x79\x7c\x84\x35\x5a\x3c\x02\xe0\x4e\xb7\xc9\xa8\x2a\x66\xa6\xf6\x55\x9f\x0f\x04\x4f\xe9\xdd\x30\xc3\xb4\xd1\xb2\x82\x51\xea\xa1\x9b\x94\xef\xd4\x23\x00\xf4\x2c\x98\x56\x00\xb4\xda\x74\x73\x13\xf6\x09\xe4\x2a\xfd\x53\xc1\xcd\x0a\x04\xb3\xdf\x8d\xab\xb2\xba\x35\x13\xc4\x17\xbf\xd0\x61\x8f\xc1\x22\x63\x54\x2f\x91\x7f\xf7\xa8\x9d\xa1\x32\xcc\x03\x5c\x08\x1c\x8b\xdc\xc4\xd5\xca\x0c\x4f\x4c\xe5\x8a\x4a\x67\x61\x84\x7c\x9d\x35\x2a\xaa\x7e\x67\x68\x2c\x13\x06\xb6\xb2\x76\xdb\x4b\xfd\xa2\x7a\x90\x81\x56\x24\x8b\x54\x8d\x20\x92\xbb\x8d\x96\x32\x05\xf1\x16\x39\x4c\x4b\x6f\x5d\xbb\xed\x61\xbf\x04\xcc\x1a\x26\x84\xae\x7c\x0c\xfc\xc7\xd8\x95\x89\x68\x32\x96\xbc\xa4\xcc\x73\xc5\xb9\x20\xed\xc2\x9d\x71\x91\x10\xcb\x85\x15\xf0\xe4\x35\x30\xd1\xce\x2a\x4e\x8a\x0c\x58\x65\x19\x2d\xca\x16\xbf\x96\x8e\xd9\x1e\xce\x0b\x92\x48\x8e\x56\x0e\xbc\xd5\x98\x95\xfe\xd3\x1c\xf4\x42\xc9\x7d\x2a\xb3\xad\xe5\xf8\xd2\xfb\xd8\x05\xab\x41\xd8\x74\xee\x95\xce\x97\xb0\xd0\x30\xf4\x08\xb3\x94\x6b\xa2\x6c\x9a\x01\xf1\x16\x16\x31\x35\xaf\x99\x58\x66\x41\xe3\x77\xc0\x5f\x13\xdc\xf7\x03\xc7\xca\xc1\xeb\x0b\xb5\x8e\x55\xe1\x59\x67\x16\x4a\xb6\xf4\xa5\x6c\x48\xe8\xa8\x78\x1a\xa2\xe7\x82\x5e\xbf\x70\x1c\x77\x65\xd2\x1f\x45\x31\x47\x8b\x30\x8e\x19\x4a\xd3\x1e\x82\x02\x28\x63\xdb\xed\x3d\x6e\xac\xc4\xfb\xdd\x81\xaa\xc7\xfb\xfb\x83\xbc\x87\xd4\x4d\xb2\xf4\x67\xcc\x27\x9e\xdb\x77\x81\x55\xb5\x48\xfc\x53\xdc\xbf\xdb\x07\x5a\xce\xef\xb9\xc0\xf4\x52\x7e\x1c\xe4\xbd\x15\xc0\xac\xc3\xeb\x72\xc2\xf8\x86\xb7\x2a\x22\x3a\x7b\xc0\xe7\x71\x50\x70\x88\x83\x43\xec\xd3\xf3\x23\xec\x0b\x78\x3c\xd0\xd3\x3e\xaa\xd9\x1c\x78\x48\xf0\xc7\x1b\x9f\x99\xb1\x12\x89\x3d\xa4\x11\xb6\x2c\x58\x94\xd9\xb3\x7a\xee\xbf\xf4\x9f\xbb\xd0\x24\xcd\x12\x3f\x9f\xb9\xd0\xca\x95\x25\x4a\x8e\x5d\x58\xa6\xc8\x12\x05\x3f\xb8\xd0\x64\xc4\x7a\xd6\x73\xff\xbf\xf2\xd7\x87\x9e\xfb\xff\xbb\x50\x26\xb1\xea\xb9\x1f\x99\x0b\x55\x5e\xa9\x9e\xfb\x3f\xdc\x75\x2b\xa9\xbd\x44\x9d\x11\xa3\x45\x92\xa5\x65\xbb\x6b\xf5\x01\x1a\x5d\x6d\x0f\xe9\x47\xee\x1e\x4a\x8a\x95\xa2\x91\xe0\x4e\xc8\xc1\x24\xe5\x21\x89\x10\x1d\x39\xdc\x7f\x69\x5e\x73\x7b\x61\xe5\xf1\x3f\xfb\x4f\x9a\x31\xe7\xd9\xf1\x4f\x8e\xcc\x65\xe3\xc4\x14\xa5\x0e\xa1\xdc\x19\xb3\x90\x70\x67\x86\xd8\x14\xa7\xa9\x90\x1c\x64\x92\x01\x9c\xfb\x67\xa2\x6b\x25\x78\x05\x1e\x09\x8c\xa9\x17\x58\xa6\x0c\xd2\x6e\x93\x9a\xd6\x5c\x58\x84\xb5\x56\x1f\x23\x75\xdd\x53\x6f\xb2\x8f\xe4\x23\x29\xf4\x69\xf7\x03\x39\x27\xf4\x92\xa8\xa0\x85\xb5\xeb\x40\x68\x27\x91\x0e\x94\xdf\x0e\xf9\xc8\x7f\xf3\xf6\xd3\x4f\x2f\x9e\x3d\x7f\xf1\xbe\x9e\x0a\xcf\x7d\x43\x9d\x28\xc9\x52\x8e\x98\xa3\xc0\x74\x5b\x76\x75\xbc\x71\xf0\x95\x71\x05\x92\x46\x17\x20\x09\xb0\xf4\xff\x99\x57\xfa\xb6\x72\x00\x92\xed\x25\x3b\x92\x6f\x18\x62\x47\x28\xc7\xa3\xf9\x97\x72\x48\x18\x91\x36\x38\x5c\x20\x3f\xa2\x84\x33\x9a\x24\x88\x49\xde\x28\xb4\x0e\x6c\xd2\x41\x6b\x07\xae\x82\x8a\xaf\x4f\x64\xa4\xa7\x50\x3c\x85\xb8\x36\x95\x5a\xdd\x07\xf3\x30\x9b\xbc\x98\x29\x56\x16\xae\x1d\x79\x80\x17\xb7\x64\x30\xf0\x31\x89\x92\x2c\x46\xa9\xe7\x3e\xed\x3e\x71\x01\x50\x71\x40\xb8\x85\xd4\xcc\x71\xfa\xb2\x9c\xce\x4e\x77\x3d\x02\xe8\x0c\x91\x46\x9d\xf5\x61\x16\x51\xdb\x9b\xc5\xa8\xb2\xf1\x30\x09\xc9\xb9\x0b\x5d\x99\xee\x2b\xf8\xfb\xbf\x3e\xd1\xf9\xbd\x82\xa7\x7f\xef\xc2\x42\xba\xde\x5f\x6f\xd0\xa7\x9c\x77\xd0\x55\x24\xc3\xa5\x1e\x92\x1a\x2b\x21\x95\xbc\xd8\xd5\xf2\x1c\xdb\xf2\x32\x9e\xfb\x32\xc4\x09\x8a\xc5\xb1\x6b\x20\x97\x79\x3f\x28\x41\x1d\x8e\xa7\x48\x9d\xd7\xbe\x7b\xfb\x8d\x7f\x1b\x95\xce\xde\xf8\x7c\xcd\xc3\x54\xb3\x42\x1f\xde\x1b\x27\x78\x3a\x45\xac\x93\xf2\x79\x82\x3a\xab\x5f\x69\x2b\x53\x7d\x3d\x14\x6b\x94\x57\xa7\x47\xde\x0e\x91\xe2\xf1\x52\x6c\x9c\x04\x50\x79\xd1\x1c\x4a\x92\xb9\x73\x49\xd9\x79\xea\x50\xe2\x8c\x11\xe7\x88\x95\xa6\x6c\x16\xc8\x2e\x0a\x8f\x99\xf8\xd1\x14\x88\xc9\xac\xc0\x3e\x65\x2c\xc7\x81\xeb\x5a\xbe\x7e\xaf\x6e\xc2\x59\x8e\xa6\x92\xca\x7a\x71\x0d\xb0\x8f\xad\x90\x4a\x69\xba\xc6\xbb\x6e\xcf\xdd\xf5\x5c\xfd\xde\x5f\x10\xf0\xf9\x4c\xf0\x7b\x72\x44\x7c\x4e\x5f\xe2\x2b\x14\x7b\x8f\xc1\xae\x3b\xbb\x72\x7b\x04\x00\xc8\x95\x65\x5b\xf3\xdd\x03\xa1\x82\xca\xe3\xa3\xcc\x82\x81\x41\x0e\xc9\xba\xdd\x64\x2d\xee\x2f\x74\xd8\x51\x97\x2e\x3b\xca\xa9\xbb\x95\x51\xeb\xde\x44\x9e\xc6\x6b\xc8\xd2\x2e\xe7\xf7\x07\x67\x50\xbe\x31\xe7\xcb\xa4\x76\x11\x22\x62\x29\xa1\x82\xd6\xb2\x1c\xa4\xfe\xf7\x28\x8c\x26\xbe\x9a\xcd\x89\xfa\x5c\x28\x69\x69\x7e\xd6\xf0\x38\x16\x2f\x52\x82\x78\x18\x40\x16\x58\x37\x98\x0b\xe3\x19\x0a\x0e\x55\xb6\x46\x3d\x72\x11\xa4\x84\xac\x52\x70\x18\x74\x55\x98\x95\x3b\x43\x24\x16\x3b\x44\xaa\x34\xda\x51\xae\x57\xbc\x51\x71\x2a\xfc\xe4\xc8\xc7\x71\xe1\x50\x5f\x0c\xe7\x6f\x68\x8c\x8c\x15\x4b\x88\xa9\x2f\x08\x67\x18\xa5\x1e\x2f\x5a\xf4\x91\x4c\x7e\x97\xa1\xd8\x1d\x00\x00\xe0\x70\xae\xa6\x2d\xb4\x4f\x55\xde\x13\xd4\x22\x5f\xc3\x16\xbd\xa5\x3d\x93\x09\x35\xcf\x3d\x66\x36\x83\x0c\x5e\xe4\xbe\x8d\xc9\x8a\xaf\xc6\x0a\x4d\x43\x09\x25\xe3\xf4\x94\x7a\xfa\x86\xb1\x8f\x63\x0f\xb4\x92\x3e\x1f\x5c\x5f\x7b\xe2\x7f\x41\x7f\x00\xa0\xf8\x43\x47\x0a\x58\xde\x1d\x1a\x98\x39\x2d\xf2\x12\xd2\x45\x6e\x83\x67\xb2\x2e\x15\xc1\x94\xac\x09\x14\x1c\x54\xa9\x50\x5a\x7d\x35\x8e\x5d\x42\xf9\x89\x79\x5b\xd8\x6d\x59\xc9\x5f\xbf\xe3\xa6\x4a\x8c\xc6\x2c\x8c\xc5\x67\xd3\x1f\xb2\x57\x7b\x07\xf9\x38\x7d\x9b\xc4\x00\x2c\x79\xa3\x4c\x7d\x5e\xa1\xb2\xe2\x3c\xe8\x63\x81\x07\xf1\xbf\xa0\x0b\xa0\xf8\xff\xee\x2e\x44\xb9\x7a\x88\x84\x04\x7d\x77\x24\x59\x82\x4c\x33\x93\x72\x17\xba\x82\xd6\x13\x24\x4e\xcc\x22\xd4\x84\x05\xdd\x03\xf6\x9d\x91\xbe\x0f\xd8\xee\xae\x75\x9d\xb7\xcf\xe4\x4b\x04\xb8\x8f\x06\x82\xbc\x0a\xd9\x3c\x17\x85\xbe\xea\xfd\xb0\x7b\x7d\x8d\x7d\x31\xc0\x61\x77\x79\xc6\xb2\x22\x53\x21\x84\xe5\x77\x5d\xa0\x3f\x67\x4a\x7a\x2f\x3f\xeb\x02\x73\xf0\xa9\xd4\x5d\xa2\x7e\xee\x25\x7d\x41\xb6\x03\xc8\xcb\x44\xf0\xc6\x3e\x04\x5a\xd4\x57\x2b\xae\xea\x04\x18\x8a\x02\x85\x33\x85\xaa\xca\x6f\x49\x3b\x95\x12\x13\x6e\x82\x63\x19\x8c\x57\x7e\x0b\x88\xd5\x14\x40\x9a\x83\xc2\x4f\x87\x83\xbe\xd9\x13\xb0\x4a\x0c\xb0\x84\x1b\x16\x33\xb6\xd6\x00\x96\x68\x82\x4b\x2b\x65\x50\x30\x68\x2d\x9b\xba\x55\xb8\x50\xf7\x80\x7f\x87\x2b\x26\x6e\x73\xe8\xe3\x3e\x1f\xb4\x50\x9f\x28\xe2\x20\x72\xa2\xa5\x65\x77\xb3\x73\x5a\xec\xcd\xa4\x93\x72\x2a\xfd\xfc\x5f\xcf\x19\xbd\x10\xa7\x65\x79\x9a\x69\xe1\x4f\x42\x7b\xa2\x80\x15\xe7\xe9\x8f\x1c\x4d\xed\xd0\x9a\x23\x2b\xa7\x2e\x07\x3d\x9c\xc3\x14\xf1\x9e\xa7\x5f\xf0\x69\xea\x24\x35\x9d\xc0\x5a\xc2\x53\x0c\x00\xc4\x60\xbd\x39\xcc\xc2\xa3\x34\xbe\x75\xb2\x0c\xc7\x5f\x1e\x89\x1b\x65\xdb\x90\x7e\x93\x42\x30\xc9\x92\x24\x08\x02\x8f\xdb\x9c\x09\x5c\x5f\x17\xf1\xd1\xfc\x48\xfd\xd9\xe3\xc6\xfa\xd6\x71\x41\xbf\x3b\xc8\xd7\x07\x5c\xd9\x08\xb9\x49\xaa\xab\x67\xd8\x59\x25\xe5\xdd\x57\x90\xc7\x66\x68\x32\x7b\xab\x34\x96\xca\x00\x56\x64\x92\xc9\x95\x52\x9a\x7c\x94\x36\xa8\x45\xe5\x37\x5f\xa8\x2c\x5c\x01\x62\xc3\x16\x76\x0f\x79\x08\xf1\x15\x52\x1a\x3e\xc2\x4b\x52\x9a\x20\x49\xd4\x28\xa5\x61\x4b\x4a\x63\x60\x8b\x45\xca\xa6\x9d\x70\x3c\x66\x68\xdc\x10\x85\xf3\x15\xc8\x68\x4a\xf2\x92\x1e\xd4\xa6\xd4\x31\xb6\x58\xa5\xcc\x47\x78\x89\xb7\xa2\x5d\x0e\x60\x77\x0b\x9c\x64\x04\xff\x9a\xa1\xa4\xf9\xe2\xe7\x8a\xb4\x50\xf2\x2a\x37\x09\x93\xa5\xf7\x13\x1e\x9a\x78\x97\x91\x22\x11\xd7\x79\xb4\x90\x54\x31\xce\x70\xfc\x92\x32\x45\xc4\x40\x3d\xa0\xba\x19\x16\x2e\xc3\xa5\x48\xb7\xc6\x57\x52\x97\xf3\x33\xb3\xf4\x62\xb6\xe2\x62\xce\x52\xac\x9c\x1a\xf6\x32\xc4\xdc\x2e\xd5\x26\x39\x0d\x84\xd0\x34\xb7\x8d\xaf\xab\x26\x45\xbe\xd5\x12\xc8\xb1\xdf\xa3\x88\xb2\xb8\x79\x19\x92\xe5\xab\x1a\x44\x05\x92\x35\xc4\x73\x6d\x16\x0d\xf6\x18\x3d\x91\xf2\x9a\xab\x71\x5b\xea\x6c\xd2\xf1\xae\x96\x54\x9c\x49\x04\xba\x38\x76\x01\x38\x88\xda\xed\x9d\xa5\xc7\x39\x0f\xaa\x89\x6b\xa8\xff\x6c\x48\x19\x3f\x2e\xec\x5e\xf2\x09\x53\x75\xd5\x82\x95\x59\x10\x93\xc4\xeb\x9b\xa4\x7d\x0c\xc9\xa0\x25\x35\x7d\x0f\x41\x02\x17\x0c\x25\x34\x8c\x85\xfa\xaf\x97\xe7\xed\x4c\xca\xf4\xbd\x85\xc4\x94\xfc\x50\x1d\xa6\xc7\x73\x75\x71\x24\x2c\x4d\x50\x09\x18\x98\x67\x4d\x53\xfd\xd2\xa8\x93\xb6\x86\x0c\x85\xe7\xf9\x08\x93\x30\x49\xe6\x0b\xee\xcb\x8e\xf4\xd3\x06\xe6\x49\xd1\x72\x49\x12\xa5\x4c\x4c\xf0\x6c\xe3\x85\x51\x7e\x62\x87\xdc\x75\x61\x1e\x10\xdf\x1a\xab\x2f\x29\xf3\x64\x0a\x36\x63\x11\xf2\xa7\x34\x46\xc9\x9b\x70\x2a\x6d\x00\x62\x0d\x6c\x0c\x78\x18\x22\xb8\x6e\x05\xea\x0b\x40\xca\x05\x48\xcc\x02\x24\x5b\x2d\xc0\xb3\x24\xd9\x18\xef\x0a\xed\x0d\xd1\x91\x9b\x05\x56\x7e\x01\xb4\x0b\x32\x7f\x96\x24\x1e\xba\x2f\x0a\xc7\x25\x82\x89\x41\x30\xd9\x0a\xc1\xf2\xc6\xf4\x17\x23\xed\x7d\xf4\xf4\xa1\x71\x2c\x1d\xcc\xd2\xce\x76\x4f\x38\xbe\x3d\x11\x6b\x65\x2e\x0a\x64\xc8\x73\x56\x80\xfc\xec\xdd\x3b\x7f\x98\xd0\xe8\x1c\x93\xb1\xc0\x3f\x46\xe9\x1a\x3e\xf9\xeb\xac\x93\x22\xa6\xee\xac\x3c\xbc\xcc\x54\x0c\x15\x97\x77\xe9\x83\xca\x87\x40\xe8\x31\xe6\xef\xc2\x47\x6a\x7d\x0e\x0e\x5d\x2d\x89\x17\x2c\x05\x5d\x5f\x2f\x09\x9d\xe8\x08\x15\x96\x9c\xa3\x9a\x3e\x84\x40\xcf\xb5\x0c\x1b\xc1\xe1\x42\x2c\xbd\x16\xc4\x2c\xb5\x0b\x01\xeb\xc6\xc6\x25\xe6\x13\x9a\x71\xcf\x75\xcd\x7a\x15\x91\x62\xfd\x81\xbe\xc0\x52\x82\x89\x5b\xab\xa7\x1b\x1c\x6e\x92\x4b\x10\x7b\xb6\x3e\x63\xee\xda\x35\x2f\x22\x43\x53\x7a\x81\x3a\x4c\xf2\xb8\x87\x76\x5f\xd8\x5a\x40\x7f\xd0\xe2\xbe\x10\x6c\x2b\x07\x79\x61\x0b\x4a\x10\x5f\x9c\x63\x12\xf7\x48\x1e\xf0\x96\x8a\x8d\xf3\x16\xe7\x68\xde\x43\x50\x97\xeb\x87\xaa\xd4\x17\xf9\x22\xc7\x02\xc7\x3d\xae\x32\xd9\xc9\x34\x85\x62\x41\x7b\xbc\x99\x8f\x40\x66\x8d\x9b\xf6\x70\x5d\x62\xf6\x50\x5f\x2a\x34\x83\x40\xf5\xed\x4e\xc2\xf4\x75\x48\xe6\xca\xf2\x28\x40\x38\xea\x0f\x74\xda\x1b\xfd\x1a\x6e\x2e\xa7\x9d\x11\xc5\x9e\xa4\xd0\xc0\xd7\x4a\x9a\x45\x3a\xc4\x4e\x8c\x47\xa3\x9a\x71\x38\x7e\xd2\x51\x91\x9e\xcb\xa2\x62\x46\x70\x7d\x85\xee\x2d\x93\x88\xd6\xfc\xac\xfb\x39\x12\x08\xcf\xdd\xf5\xbb\x7f\x71\x81\x0e\xb0\x55\x2a\xc5\xcd\xaf\x97\x15\xaf\x12\x49\xbc\x9b\x27\x89\xa6\x59\xc2\xf1\x2c\xc1\x88\x99\x47\xcb\x04\xfd\x4d\xa7\x88\xc4\x6a\x49\xcc\x6b\x45\xe8\x4a\x3a\xea\x24\x36\xed\xcf\xc4\xb6\x28\xe2\xd2\x9f\x27\xdf\x8b\x2f\xd3\xea\x55\x6e\x12\xea\x4a\xf5\xbe\xac\xe0\x7a\xb3\x1c\x2e\x74\xd5\x63\x88\xda\x30\xb0\x02\x8a\x35\x2d\xed\xcb\x42\xfa\xe1\x19\x89\x00\x3b\x7f\x61\x2d\x6d\x9e\xfb\xfa\xd5\x67\xb7\x8e\x1e\x28\x50\x5d\x4d\xfc\x77\xfb\x39\xa9\xec\x79\xaf\x7f\xb8\xe5\xc4\xca\xe6\x37\xce\x4e\x55\x5d\xce\xdb\xe7\xbe\xc6\x3f\xac\x99\xe3\x8a\xd9\xd4\x34\xdd\x1a\xa9\xf8\x0c\xc9\x38\x51\xe9\x49\x58\x37\xa9\x2a\x91\xe4\xda\x0b\x99\x34\xd1\xac\xca\x3d\xa7\xd2\x29\x86\x29\x32\x64\x2b\xfe\x3e\x0d\xd3\x73\xb3\xb1\xc4\x31\x62\x08\x58\x6e\x49\x43\xb6\x16\x7d\xeb\x37\x66\xcd\xd4\x02\x56\x25\xec\x20\x91\x33\x2f\xe6\x64\xdd\xb8\x75\x2a\x0d\x0d\x3f\xaa\x16\xea\x68\x11\x95\xa5\xa0\x50\xfa\x19\xec\x82\xdd\xca\x30\xba\xe2\x99\x90\x9b\xfc\x47\x8b\x95\xb3\xc9\xcf\x2a\x9d\xf4\x8a\x8a\x12\xca\x18\x25\x3c\x5c\xb5\x1a\x28\xee\x54\x6b\x1b\x8b\x0a\x7a\x8e\x47\xa3\x5a\x2b\xd9\xd3\x5f\x6b\xb8\x52\xad\x86\x29\x4d\x32\x8e\x9e\xd5\x5a\x1b\xb2\x97\xb7\x6c\xc2\x61\xaa\xc8\xae\x32\x46\x11\x1f\x23\xa8\xcc\xe4\xcc\x97\xeb\xa2\x42\xf5\xd5\x41\xf6\xc3\x9c\xa3\x54\x30\x4e\x59\x0d\xf4\xe4\xbe\x5b\x59\xfb\x15\x62\xfc\xb3\xaa\xfd\xea\xb3\x0b\x54\x30\xbb\x63\xde\x66\x10\xb5\xf3\x33\x09\x77\x8a\xc7\x04\xc5\x95\xa9\x9e\x3d\x5a\xd8\x1c\x14\x8f\x3c\x54\x1a\xfd\x77\x95\xf7\xe4\xbb\xa2\xa0\x53\xd8\xff\xdd\xbc\x69\x72\xb9\x1e\xb4\x11\x41\x1a\x08\x9d\xcd\xb4\x8a\x70\xfd\xb2\xac\x44\xf9\x5e\xb1\x44\xeb\x83\x1a\x52\x1e\x72\x14\x4d\xe4\x13\x22\xcb\x21\x78\xe5\xd7\x74\xb9\xfe\xdd\xa5\xbd\x95\x0d\x8a\xa8\xc0\x45\xd5\x33\x3f\x46\xbc\xd7\x60\x16\x33\xbc\x29\xcf\xd7\x09\x40\xb5\x8c\x27\xf6\x6c\x97\x2f\xc6\xda\x17\x67\xef\x8b\xfd\x2e\xdd\x8f\x5e\x7e\x43\x71\xef\x63\xfe\x71\xb1\x37\x86\x6e\xfe\x91\x2c\x5c\x60\x8c\xd1\x1f\x89\x5b\x11\x2e\x0b\xcf\x65\x45\x10\x05\x15\x67\x2b\xf2\x9f\xcb\xa7\xf1\x64\xde\x8b\x5a\x10\x1a\xaf\xba\x03\x0b\x13\xad\x68\x11\x78\x02\x20\xf1\x57\x91\x6e\xb2\x4c\x2a\x56\xb9\x2a\xcb\x01\x50\x39\xaa\xe4\x6d\x6c\x93\x39\xa2\x12\x1d\xea\xab\xcc\x10\x65\x1a\x4b\x73\x90\x89\xfe\x8b\xa0\x37\x17\x18\x47\xe5\x22\xcf\x2b\x17\x8d\xf9\xca\xfb\xb7\x6b\x17\x7a\x9e\xa0\x71\x86\x63\xb4\xa7\x6f\x8b\x76\xa6\x88\x87\x42\xb8\xfb\x42\x61\x9a\xe6\x8a\xdb\x1b\x01\x98\x0b\x93\x90\x8c\x7b\xee\x98\x8a\xff\xbb\x30\x46\x69\xa4\x3f\x39\x38\x75\x42\x67\x94\xa0\x2b\x3c\x4c\x10\x74\xa4\x0f\x7c\xc6\x70\x8a\x3a\xd2\x83\x56\x04\xcd\xa5\xda\xfb\xc6\x9c\x18\xa9\x03\x48\xc6\xc3\x84\x29\x4e\xe6\x0e\x26\x1c\x8d\x59\xc8\x91\xf8\x8b\x3a\xe8\x0a\x4b\x5d\x56\x86\x6d\x8c\x12\x7a\x99\xfa\x8e\x1a\x2d\x0a\x89\xc3\x32\xe2\x84\x4e\x8c\x65\xd6\x1a\x59\x45\x08\xb1\x0e\x1d\x39\xf2\x1a\x97\x50\xf4\x2e\x70\x84\xa0\x33\x14\xfa\x0b\x74\x22\x4a\x78\x88\x09\x62\x42\x43\x71\x42\x12\x3b\x84\x92\x4e\xad\xb4\x8c\x29\x4b\x7d\x17\x26\x98\x9c\xf7\xdc\x09\xe7\xb3\xb4\xb7\xb7\x77\x79\x79\xe9\xcb\x05\x9a\x31\x2a\x31\x8c\xe9\x9e\x5b\x5c\xfe\x3a\x45\x8c\x85\xe2\x04\x6e\xc6\x52\xf1\x59\x61\x8a\x53\x9a\x38\x23\xca\x9c\x61\x86\x93\x18\x93\x31\x74\x64\x44\x90\xfc\x4b\xc0\x16\xd1\xe9\x10\x13\x31\x79\x4c\x46\x2c\x54\xec\x3e\x63\xc8\x49\xc3\x11\x4a\xe6\xb2\x0e\x1a\x8d\x70\x84\x11\xe1\xc9\xbc\x11\x58\x6e\xc6\xac\x42\xfa\x4f\x75\x22\x35\x41\xf9\xac\x04\x2c\x45\x11\x43\x3c\x75\xa6\x21\x09\xc7\x68\x8a\x08\x17\xab\x1a\xb1\xb9\xd4\xfb\x9d\x50\xcc\xa2\x40\xb1\x80\x66\xc6\xf0\x05\x4e\xd0\x58\xa0\x31\x8a\x50\x6a\x37\x6d\x82\xee\x42\x80\xd1\x88\x4a\x99\x77\x3b\x69\x86\x50\x7d\x53\x48\x8c\xb1\xd0\x72\x87\x42\xad\x84\xce\x04\x8f\x27\x02\x2f\x17\x21\x4e\x64\x42\x11\x09\x94\xd8\x2a\x8e\x8a\xc8\x70\xc2\xcb\x50\xe0\x4f\xb0\x22\x1d\xfd\x6a\x5e\xdb\x52\x08\x57\xb1\x52\xa8\x42\x04\x4e\x18\x31\x9a\xa6\x4e\x3c\x27\xe1\x14\x47\xd0\x1e\xb3\xb6\x32\x8d\x4b\x10\x49\x70\xeb\xf8\x97\x91\xb8\x66\x7e\x2c\x1b\xce\xcd\xec\xf4\xa7\x15\x34\xa2\x66\x64\x00\x10\x05\x31\xba\x40\x09\x9d\x09\x14\x3b\x96\x5d\xbd\x99\x76\x2f\x54\xe7\xd9\x4c\x28\xe3\x16\x3c\xef\xf4\x63\x1a\x4d\xe8\x56\xdf\x6a\xf0\xc8\x04\x7f\x92\x34\x63\x44\x38\x8e\xc2\xc4\x99\x86\xd1\x04\x13\xe4\xe0\x69\x38\x46\xa9\xac\xa5\xa5\x24\xe4\xcc\x92\x90\x0b\x2a\x4c\x9d\x11\xa3\x53\x41\x36\x98\x8c\x13\xb1\x12\x42\x4c\x2f\x10\xaf\x5e\x8f\x6f\x02\x7c\x26\x81\x50\x48\x1c\xac\x39\x2e\x75\x4a\xe0\x2a\x47\x94\x5e\x8d\x07\x8e\xda\x54\x07\xbc\xe1\x2c\xef\x54\x0a\x4d\xcf\xd3\xee\xeb\x45\x8a\xe4\xd3\x9d\x82\xe5\xa9\x07\x42\xb1\x77\xa6\x0b\xc4\x71\x25\xe4\xb3\x69\xea\xa0\xab\x08\xa1\x18\xc5\x67\x40\x0c\x77\x93\xdf\x8b\x63\x9e\xa0\x25\x2b\x56\x79\xff\x5f\xd9\x7f\x3a\x13\x94\xcc\x10\x4b\xeb\x8d\x7e\x6f\x12\x8f\xb2\x1e\xdc\x2b\xcb\x53\x3a\x83\x14\xad\x83\xb0\xf8\x2d\x85\xe7\x20\x85\xc8\x16\xbd\x9b\xcc\x41\x7d\x0c\xc9\x20\x08\x3d\x24\xd3\x60\x96\x39\xfe\xce\x1e\x2d\x98\xb1\x3f\x60\x20\xe4\x6e\x92\x9f\xe5\x45\x7f\xaa\xff\x95\xfd\xa5\xdb\xf6\x57\x04\xb3\x6c\x00\xa8\x56\x65\xad\x9e\x93\x4d\x7a\xde\x00\x64\x6d\x08\xb8\xb1\x67\x2d\x1c\xbe\xc6\x24\x4b\xd7\xe7\xfa\x70\xff\xef\xff\xfc\x5f\x2e\x74\x3b\xea\xc9\xe1\x57\x2f\xde\x9f\xfe\xd7\xa7\x0f\x6f\x7e\x3c\x3d\x09\x90\xff\xc3\x7f\x9e\xbe\x38\xd1\xbf\x2a\x26\x20\x1e\xf4\x5d\x89\x07\x17\xba\xff\x21\xe6\xaa\x66\xec\xfe\x43\xfe\x7b\x2a\xff\x7d\x87\x7f\x70\x07\xad\x6a\x27\xdc\x8a\x14\x12\x13\x71\xff\x43\xfe\x2b\x27\xe5\xfe\x43\xfe\x7b\x2a\xff\x7d\xf7\xea\xb3\x6c\x6c\xc3\x83\x0b\x31\x4f\x47\xa9\x90\xf0\x02\x8f\x43\x4e\x99\x8a\x57\x41\xd7\xd7\x2e\x22\x2e\x64\x52\x0c\xfc\x91\xf0\xc4\x7f\x23\xad\xb7\x2f\x15\x82\x08\x5c\x4c\xc3\x2b\x3c\xcd\xa6\x2f\x59\x28\x11\xf2\x1c\x8f\x31\x4f\x7b\x8f\x73\xa0\xf3\x8e\x6e\xd1\x48\xd0\x36\xbd\xc7\xfc\x18\xbc\xc1\x3b\x51\x75\x43\xe8\xb4\x7d\x0d\xae\xa2\xc7\x47\x76\xca\x0b\x53\xb1\xc1\xdf\xf1\xc4\xaa\xf8\xa4\xa8\xb8\x9c\x86\xf5\xf0\xa9\x55\xf1\xa9\xa9\xd8\x62\xed\x76\x47\xe5\x41\x31\x81\x98\x32\xd5\x21\x2e\x72\x1b\xda\x1f\x00\x80\x64\xa9\x3e\xa9\xd6\x17\xba\x74\xf9\x69\x77\x1f\x94\x81\x91\xe8\xbb\x6e\x2b\x69\xb7\x3d\xf4\xd7\xa0\xb3\x0f\x74\xfe\xfc\xae\xf2\xc3\xa0\xc3\x80\xb7\xdb\xb4\x88\xf9\xea\xec\x1f\x00\xb4\x17\x70\x48\x77\x77\x8d\xfd\xa9\x6c\x0b\xfb\x08\xe2\x3e\x1d\x0c\xf2\x32\x80\x2c\x7c\x98\x84\x26\x8d\x0b\xd6\xb0\x0e\x8d\x0b\x66\x20\xa7\x1e\x82\xea\xa5\x11\x69\x22\x2d\xef\x1f\xa7\x5f\x90\xca\x6e\x05\x34\x7a\x02\xb1\xcc\xaf\xb0\x8e\x9f\xaa\x50\x86\xaf\x44\x70\xe0\x4d\x42\x03\xf7\xce\x7e\x0e\xb1\x90\x3b\x95\xc0\x70\x93\x9c\xd0\x10\x6e\x01\xfb\x83\x8a\xf3\x85\xb3\xb9\xba\xb5\x10\xac\x6f\xc6\x83\x98\x46\x12\xc7\xca\x25\x78\x82\x54\x5a\x1f\xef\x1b\xa1\x8e\xf6\x85\x18\x19\xb8\xdf\xec\xa2\xdd\x6f\xdc\xc1\x37\xc0\x1f\x23\xfe\x8c\x6b\x29\xd9\x73\x23\x95\xdc\xd6\x05\x10\x07\x0b\x93\x83\xc8\x52\xf7\x95\x66\xfe\xe1\xfd\x8f\xc7\x74\x3a\xa3\x04\x11\x2e\x5f\x7a\xa8\x65\x4f\xad\x21\x1c\xaf\x46\x38\x2e\x9d\xb8\xf5\x0b\x01\xdf\xc8\x77\x76\xe5\x65\x38\x86\x42\x23\xf3\x2b\xb1\x54\xcc\xc4\xe1\xe1\xd8\xb9\xc4\x7c\xe2\x88\x29\x39\x7a\x4a\xfe\x37\x0a\xc3\x3a\x42\xf4\x14\xa5\x3c\xbd\xbe\x66\xe8\xd7\x0c\x33\x1b\xe1\xe1\x6c\x26\xb3\x69\x55\xde\x56\x5c\xd4\x9c\x93\x42\x14\x52\xb9\x99\x4e\x22\x44\x42\x86\x69\xcf\x4d\xa7\x61\x92\x1c\x2b\x05\xd9\xd5\x5f\x7f\xc6\x7c\xf2\xc6\xdc\x55\xb7\x5a\x89\xf2\x53\x7a\x8e\x48\xad\xec\xbd\xbc\xc4\x2e\x0b\xd3\x09\xbd\x3c\xe1\x94\xcd\x87\x94\x9e\xff\x24\xa4\xe9\x9d\xfd\x1c\xb4\xfe\x5f\x00\x00\x00\xff\xff\x4a\xed\x9e\x68\x51\x27\x14\x00")
-func distAssetsNomadUiD5e967105da9cad5ea23f87d55ec3360JsBytes() ([]byte, error) {
+func distAssetsNomadUiB06790dbfc5c3ebfedc4382c3dbae114JsBytes() ([]byte, error) {
return bindataRead(
- _distAssetsNomadUiD5e967105da9cad5ea23f87d55ec3360Js,
- "dist/assets/nomad-ui-d5e967105da9cad5ea23f87d55ec3360.js",
+ _distAssetsNomadUiB06790dbfc5c3ebfedc4382c3dbae114Js,
+ "dist/assets/nomad-ui-b06790dbfc5c3ebfedc4382c3dbae114.js",
)
}
-func distAssetsNomadUiD5e967105da9cad5ea23f87d55ec3360Js() (*asset, error) {
- bytes, err := distAssetsNomadUiD5e967105da9cad5ea23f87d55ec3360JsBytes()
+func distAssetsNomadUiB06790dbfc5c3ebfedc4382c3dbae114Js() (*asset, error) {
+ bytes, err := distAssetsNomadUiB06790dbfc5c3ebfedc4382c3dbae114JsBytes()
if err != nil {
return nil, err
}
- info := bindataFileInfo{name: "dist/assets/nomad-ui-d5e967105da9cad5ea23f87d55ec3360.js", size: 1320463, mode: os.FileMode(420), modTime: time.Unix(1480000000, 0)}
+ info := bindataFileInfo{name: "dist/assets/nomad-ui-b06790dbfc5c3ebfedc4382c3dbae114.js", size: 1320785, mode: os.FileMode(420), modTime: time.Unix(1480000000, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
@@ -576,7 +576,7 @@ func distImagesIconsSearchSvg() (*asset, error) {
return a, nil
}
-var _distIndexHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x95\x5d\x73\xa2\x48\x17\xc7\xef\xf3\x29\x78\xa8\xf2\xee\x41\x04\x44\xb4\x4a\x53\xc5\x28\x49\x65\xcb\x28\x83\x64\x66\x72\x65\xf5\xcb\x41\x7a\x6d\x68\xb6\xbb\x31\xf1\xdb\x6f\x11\x94\x61\x93\xcc\xd4\xee\x95\x76\xf7\xff\xfc\xce\x4b\xf7\x39\xcc\xff\xb7\xda\x2e\xd3\xe7\x38\x32\x72\x5d\xf0\xdb\x9b\x79\xfb\x63\x18\xf3\x1c\x10\x6d\xfe\x18\xc6\xbc\x00\x8d\x0c\x92\x23\xa9\x40\x2f\xcc\x5a\x67\xd6\xd4\xec\x1f\xe5\x5a\x57\x16\xfc\x55\xb3\xd3\xc2\xfc\x61\x3d\x85\xd6\x52\x14\x15\xd2\x0c\x73\x30\x0d\x22\x4a\x0d\xa5\x5e\x98\x0f\xd1\x02\xe8\x01\xae\x96\x9a\x69\x0e\xb7\x1b\x51\x20\x3a\xb7\xdb\x45\x0f\x59\xa2\x02\x16\x26\x05\x45\x24\xab\x34\x13\x65\x0f\x64\x7e\x14\x9e\x18\xbc\x54\x42\xea\x9e\xea\x85\x51\x9d\x2f\x28\x9c\x18\x01\xeb\x6d\xf1\x7f\x83\x95\x4c\x33\xc4\x2d\x45\x10\x87\x85\x63\xde\xde\xbc\x91\x6e\xfa\xa8\xb2\x89\xc8\xaa\x99\x4d\x44\x99\xb1\x83\x0d\xe5\x89\x49\x51\x16\x50\xf6\xe9\x83\xe0\xcb\xc0\x75\x0b\x41\x6b\x0e\xb1\x84\x8c\xbd\x0e\x5c\x77\xe0\x85\x03\xd7\xbd\x02\x9a\x0d\x77\x39\x70\xdd\x1e\xa1\x13\x55\x52\xd0\x9a\x34\x89\x75\x32\x29\x84\x7e\x4a\xd6\x9d\x64\xe0\xde\x35\x90\xbb\x4e\xc0\x05\x41\x8d\x45\x7a\xae\xa0\x53\xa1\x5a\x8b\x4e\x11\x15\x18\x64\xb4\xf9\x76\x39\x7d\x8b\xf1\x2e\x0a\xd3\xa7\x24\xda\xfd\xdc\x0b\x56\x17\xf5\x8f\x34\xda\xac\xf6\x71\xb2\x4d\xb7\xcd\x13\xd8\xf5\xcd\x56\x48\x5f\x9c\x64\x88\x2b\xe8\x8c\xf6\x61\x1c\xaf\x1f\x96\x61\xfa\xb0\xdd\xec\xd3\xe8\x31\x5e\x87\x69\xb4\xff\x9e\x84\x71\x1c\x25\x7d\x83\x56\xbd\x8a\xee\xc2\xa7\x75\xba\x0f\x77\xcf\x9b\xe5\x7e\xfb\x65\x17\x25\xdf\xa2\xe4\xe2\x49\xcb\xfa\xaa\xfb\xe3\xeb\x53\x94\x3c\xef\x1f\x36\x69\x74\x9f\xbc\xc1\x3f\xb2\x3a\x6f\xdb\xcd\xfa\x79\x7f\xbf\x7e\x78\x7c\x8c\x92\xfd\x72\xfb\x18\x6f\x37\xd1\x26\xed\x43\xaf\xd1\x86\x71\xdc\x4f\x0a\x73\x41\x8e\xac\x3c\x7c\xad\x41\x32\x50\xef\xa3\x28\x98\x44\x07\xd8\x11\x28\x91\x64\xa2\x2b\xb1\x2a\x10\xe7\x4b\x5e\x2b\x0d\xb2\x2b\x75\xab\xfd\xce\x74\xbe\x41\x05\xa8\x0a\x91\x5f\xf1\x1a\x4d\x2a\x8e\x50\xfe\xe6\x3c\x81\x03\x13\x1f\x05\x2a\x17\x2f\x3b\x2d\xe4\x19\x0b\x71\x5c\xb3\xf2\xf8\xd9\x8d\x40\x73\xe9\x16\xe1\xcc\x6a\x79\xfd\x84\x6b\xc5\xca\x43\x2c\xc5\xeb\xf9\x3d\xba\x56\xb0\x82\x0c\xd5\x5c\xc7\x48\x29\x9d\x4b\x51\x1f\x72\xf5\x49\x09\xe1\xb5\x69\xac\xb0\xaa\x38\x6b\x9f\xdf\x3d\x17\x18\xf1\x7f\x46\x62\x1a\xf6\xa5\x97\xe6\x9c\x95\x47\x43\x02\x5f\x98\x4a\x9f\x39\xa8\x1c\x40\x9b\x46\x2e\x21\x5b\x98\x76\xcd\x6c\xa4\x14\x68\x65\x9f\xa0\xa4\x42\x5a\xae\x13\x4c\xfd\x49\x90\x65\x01\x99\x4d\x83\xd1\xc4\x77\x5d\xdf\x19\x67\x78\x14\x64\x01\xf5\x30\x0c\x89\x52\xd7\x7e\xff\x97\xe4\x6b\xff\x59\x3e\x38\xd9\x64\xe6\x03\xa5\x5e\x36\x1b\x8d\x71\x80\x90\xe7\xb9\x78\x14\x4c\x5d\xcf\xf3\x1d\xfc\x39\x9b\x91\x66\xd8\xe8\x73\x05\x0b\x93\x15\xe8\x00\x76\x55\x1e\xfa\x6e\xec\x0c\x9d\x1a\xd1\x90\x11\xf1\x33\xef\x66\x64\xda\xd7\x99\x39\xc7\x82\x9e\x5b\xf2\xa5\x2a\xed\x1c\x33\x94\x24\x9f\x55\xc1\x99\x8d\xb1\x03\x23\x3a\x99\x52\xc7\x81\x2c\x40\x63\x9c\x79\xde\x18\xb0\x37\xc2\x28\x18\xd3\xe1\x9f\xca\xbc\x9d\xdb\x2d\xe4\xf6\xe6\x57\x34\x92\xd7\xe5\x71\x38\x9b\x78\x43\xea\xe2\xcc\x09\x7c\x6f\x86\x00\x82\xe9\xd8\x71\x67\x78\xfa\x9f\x20\xce\xd8\x1b\x3a\x14\x67\x0e\x42\x18\xcf\x46\xbe\x37\x9d\x06\x94\x66\xc1\x3b\xc8\xef\x72\xeb\xee\x81\xfa\x30\x9b\x04\xce\xc8\xa7\x68\x46\x10\xf5\x01\xb9\x5e\x36\x0d\xa8\xef\x03\xf1\xbc\xc9\xe8\x1d\xb3\x85\x52\x76\x32\x18\x5d\x98\xed\xeb\xc6\x48\x31\x62\x51\x29\x2a\x2a\x5e\x4a\xeb\x45\xc8\x22\x17\x1c\x1a\x33\xca\x4e\x6f\x25\xb7\xdb\x9a\xcf\xed\xf6\x0b\xf6\x77\x00\x00\x00\xff\xff\x01\x4e\x3f\xe0\xd9\x06\x00\x00")
+var _distIndexHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x95\x5d\x73\xa2\x48\x17\xc7\xef\xf3\x29\x78\xa8\xf2\xee\x41\xa4\x41\xd1\x2a\x4d\x15\xa3\x24\x95\x2d\xa3\x0c\x92\x99\xc9\x95\xd5\x2f\x07\xe9\x15\x68\xb6\xbb\x31\xf1\xdb\x6f\x11\x94\x61\x93\xcc\xd4\xee\x95\x76\xf7\xff\xfc\xce\x4b\xf7\x39\xcc\xff\xb7\xda\x2e\x93\xe7\x28\x34\x32\x5d\xe4\xb7\x37\xf3\xf6\xc7\x30\xe6\x19\x60\xd6\xfc\x31\x8c\x79\x01\x1a\x1b\x34\xc3\x52\x81\x5e\x98\xb5\x4e\xad\xa9\xd9\x3f\xca\xb4\xae\x2c\xf8\xab\xe6\xa7\x85\xf9\xc3\x7a\x0a\xac\xa5\x28\x2a\xac\x39\xc9\xc1\x34\xa8\x28\x35\x94\x7a\x61\x3e\x84\x0b\x60\x07\xb8\x5a\x6a\xae\x73\xb8\xdd\x88\x02\xb3\xb9\xdd\x2e\x7a\xc8\x12\x17\xb0\x30\x19\x28\x2a\x79\xa5\xb9\x28\x7b\x20\xf3\xa3\xf0\xc4\xe1\xa5\x12\x52\xf7\x54\x2f\x9c\xe9\x6c\xc1\xe0\xc4\x29\x58\x6f\x8b\xff\x1b\xbc\xe4\x9a\xe3\xdc\x52\x14\xe7\xb0\x70\xcc\xdb\x9b\x37\xd2\x4d\x1f\x55\x36\x11\x59\x35\xb7\xa9\x28\x53\x7e\xb0\xa1\x3c\x71\x29\xca\x02\xca\x3e\x7d\xe0\x7f\x19\x20\x54\x08\x56\xe7\x10\x49\x48\xf9\xeb\x00\xa1\x81\x1b\x0c\x10\xba\x02\x9a\x0d\xb4\x1c\x20\xd4\x23\x74\xa2\x4a\x0a\x56\xd3\x26\xb1\x4e\x26\x85\xd0\x4f\xf1\xba\x93\x0c\xd0\x5d\x03\xb9\xeb\x04\xb9\xa0\xb8\xb1\x48\xce\x15\x74\x2a\x5c\x6b\xd1\x29\xc2\x82\x80\x0c\x37\xdf\x2e\xa7\x6f\x31\xde\x85\x41\xf2\x14\x87\xbb\x9f\x7b\xfe\xea\xa2\xfe\x91\x84\x9b\xd5\x3e\x8a\xb7\xc9\xb6\x79\x02\xbb\xbe\xd9\x0a\xeb\x8b\x93\x14\xe7\x0a\x3a\xa3\x7d\x10\x45\xeb\x87\x65\x90\x3c\x6c\x37\xfb\x24\x7c\x8c\xd6\x41\x12\xee\xbf\xc7\x41\x14\x85\x71\xdf\xa0\x55\xaf\xc2\xbb\xe0\x69\x9d\xec\x83\xdd\xf3\x66\xb9\xdf\x7e\xd9\x85\xf1\xb7\x30\xbe\x78\xd2\xb2\xbe\xea\xfe\xf8\xfa\x14\xc6\xcf\xfb\x87\x4d\x12\xde\xc7\x6f\xf0\x8f\xac\xce\xdb\x76\xb3\x7e\xde\xdf\xaf\x1f\x1e\x1f\xc3\x78\xbf\xdc\x3e\x46\xdb\x4d\xb8\x49\xfa\xd0\x6b\xb4\x41\x14\xf5\x93\x22\xb9\xa0\x47\x5e\x1e\xbe\xd6\x20\x39\xa8\xf7\x51\x14\x5c\xe2\x03\xec\x28\x94\x58\x72\xd1\x95\x58\x15\x38\xcf\x97\x79\xad\x34\xc8\xae\xd4\xad\xf6\x3b\xd7\xd9\x06\x17\xa0\x2a\x4c\x7f\xc5\x6b\x34\x89\x38\x42\xf9\x9b\xf3\x18\x0e\x5c\x7c\x14\xa8\x4c\xbc\xec\xb4\x90\x67\x22\xc4\x71\xcd\xcb\xe3\x67\x37\x02\xcd\xa5\x5b\x34\xe7\x56\xcb\xeb\x27\x5c\x2b\x5e\x1e\x22\x29\x5e\xcf\xef\xd1\xb5\x82\x15\xa4\xb8\xce\x75\x84\x95\xd2\x99\x14\xf5\x21\x53\x9f\x94\x10\x5e\x9b\xc6\x0a\xaa\x2a\xe7\xed\xf3\xbb\xcf\x05\xc1\xf9\x3f\x23\x31\x0d\xfb\xd2\x4b\xf3\x9c\x97\x47\x43\x42\xbe\x30\x95\x3e\xe7\xa0\x32\x00\x6d\x1a\x99\x84\x74\x61\xda\x35\xb7\xb1\x52\xa0\x95\x7d\x82\x92\x09\x69\x21\xc7\x9f\x8e\x27\x7e\x9a\xfa\x74\x36\xf5\x47\x93\x31\x42\x63\xc7\x4b\xc9\xc8\x4f\x7d\xe6\x12\x18\x52\xa5\xae\xfd\xfe\x2f\xc9\xd7\xfe\xb3\xc6\xe0\xa4\x93\xd9\x18\x18\x73\xd3\xd9\xc8\x23\x3e\xc6\xae\x8b\xc8\xc8\x9f\x22\xd7\x1d\x3b\xe4\x73\x36\xa7\xcd\xb0\xd1\xe7\x0a\x16\x26\x2f\xf0\x01\xec\xaa\x3c\xf4\xdd\xd8\x29\x3e\x35\xa2\x21\xa7\xe2\x67\xde\xcd\xc8\xb4\xaf\x33\x73\x4e\x04\x3b\xb7\xe4\x4b\x55\xda\x39\x66\x28\x49\x3f\xab\x82\x33\xf3\x88\x03\x23\x36\x99\x32\xc7\x81\xd4\xc7\x1e\x49\x5d\xd7\x03\xe2\x8e\x08\xf6\x3d\x36\xfc\x53\x99\xb7\x73\xbb\x85\xdc\xde\xfc\x8a\x46\xb3\xba\x3c\x0e\x67\x13\x77\xc8\x10\x49\x1d\x7f\xec\xce\x30\x80\x3f\xf5\x1c\x34\x23\xd3\xff\x04\x71\x3c\x77\x38\x1e\x23\x94\x32\x34\x9a\x51\x98\xf9\x23\xcf\x73\x10\xa4\xef\x20\xbf\xcb\xad\xbb\x07\x32\x9a\xf8\xb3\x11\x23\x29\x1d\x53\x17\x48\x0a\x8c\x7a\xee\x14\x51\x97\x11\x0c\x8e\xe3\xbd\x63\xb6\x50\xc6\x4f\x06\x67\x0b\xb3\x7d\xdd\x04\x2b\x4e\x2d\x26\x45\xc5\xc4\x4b\x69\xbd\x08\x59\x64\x22\x87\xc6\x8c\xf1\xd3\x5b\xc9\xed\xb6\xe6\x73\xbb\xfd\x82\xfd\x1d\x00\x00\xff\xff\x60\xe2\x6b\x9d\xd9\x06\x00\x00")
func distIndexHtmlBytes() ([]byte, error) {
return bindataRead(
@@ -668,15 +668,15 @@ func AssetNames() []string {
// _bindata is a table, holding each asset generator, mapped to its name.
var _bindata = map[string]func() (*asset, error){
- "dist/assets/chunk.143.1dbf1aabb9053887ddf7.js": distAssetsChunk1431dbf1aabb9053887ddf7Js,
- "dist/assets/chunk.178.9068d2f119b2a5a281b5.js": distAssetsChunk1789068d2f119b2a5a281b5Js,
+ "dist/assets/chunk.143.5522fd209ce9704412ef.js": distAssetsChunk1435522fd209ce9704412efJs,
+ "dist/assets/chunk.178.e64db8b78adc0145d64f.js": distAssetsChunk178E64db8b78adc0145d64fJs,
"dist/assets/chunk.331.2bf16a8aab827bcd7550.js": distAssetsChunk3312bf16a8aab827bcd7550Js,
"dist/assets/chunk.401.018c1d72186cc4f1a80c.js": distAssetsChunk401018c1d72186cc4f1a80cJs,
"dist/assets/chunk.401.018c1d72186cc4f1a80c.js.LICENSE.txt": distAssetsChunk401018c1d72186cc4f1a80cJsLicenseTxt,
"dist/assets/chunk.963.d2bf17539aee784129b8.js": distAssetsChunk963D2bf17539aee784129b8Js,
"dist/assets/chunk.963.d2bf17539aee784129b8.js.LICENSE.txt": distAssetsChunk963D2bf17539aee784129b8JsLicenseTxt,
"dist/assets/nomad-ui-5e1f695edd3f904b7aa332b07823351b.css": distAssetsNomadUi5e1f695edd3f904b7aa332b07823351bCss,
- "dist/assets/nomad-ui-d5e967105da9cad5ea23f87d55ec3360.js": distAssetsNomadUiD5e967105da9cad5ea23f87d55ec3360Js,
+ "dist/assets/nomad-ui-b06790dbfc5c3ebfedc4382c3dbae114.js": distAssetsNomadUiB06790dbfc5c3ebfedc4382c3dbae114Js,
"dist/assets/vendor-194b1e0d68d11ef7a4bf334eb30ba74d.js": distAssetsVendor194b1e0d68d11ef7a4bf334eb30ba74dJs,
"dist/assets/vendor-2178567ff7c98706522514fb07f7d3be.css": distAssetsVendor2178567ff7c98706522514fb07f7d3beCss,
"dist/crossdomain.xml": distCrossdomainXml,
@@ -738,15 +738,15 @@ type bintree struct {
var _bintree = &bintree{nil, map[string]*bintree{
"dist": &bintree{nil, map[string]*bintree{
"assets": &bintree{nil, map[string]*bintree{
- "chunk.143.1dbf1aabb9053887ddf7.js": &bintree{distAssetsChunk1431dbf1aabb9053887ddf7Js, map[string]*bintree{}},
- "chunk.178.9068d2f119b2a5a281b5.js": &bintree{distAssetsChunk1789068d2f119b2a5a281b5Js, map[string]*bintree{}},
+ "chunk.143.5522fd209ce9704412ef.js": &bintree{distAssetsChunk1435522fd209ce9704412efJs, map[string]*bintree{}},
+ "chunk.178.e64db8b78adc0145d64f.js": &bintree{distAssetsChunk178E64db8b78adc0145d64fJs, map[string]*bintree{}},
"chunk.331.2bf16a8aab827bcd7550.js": &bintree{distAssetsChunk3312bf16a8aab827bcd7550Js, map[string]*bintree{}},
"chunk.401.018c1d72186cc4f1a80c.js": &bintree{distAssetsChunk401018c1d72186cc4f1a80cJs, map[string]*bintree{}},
"chunk.401.018c1d72186cc4f1a80c.js.LICENSE.txt": &bintree{distAssetsChunk401018c1d72186cc4f1a80cJsLicenseTxt, map[string]*bintree{}},
"chunk.963.d2bf17539aee784129b8.js": &bintree{distAssetsChunk963D2bf17539aee784129b8Js, map[string]*bintree{}},
"chunk.963.d2bf17539aee784129b8.js.LICENSE.txt": &bintree{distAssetsChunk963D2bf17539aee784129b8JsLicenseTxt, map[string]*bintree{}},
"nomad-ui-5e1f695edd3f904b7aa332b07823351b.css": &bintree{distAssetsNomadUi5e1f695edd3f904b7aa332b07823351bCss, map[string]*bintree{}},
- "nomad-ui-d5e967105da9cad5ea23f87d55ec3360.js": &bintree{distAssetsNomadUiD5e967105da9cad5ea23f87d55ec3360Js, map[string]*bintree{}},
+ "nomad-ui-b06790dbfc5c3ebfedc4382c3dbae114.js": &bintree{distAssetsNomadUiB06790dbfc5c3ebfedc4382c3dbae114Js, map[string]*bintree{}},
"vendor-194b1e0d68d11ef7a4bf334eb30ba74d.js": &bintree{distAssetsVendor194b1e0d68d11ef7a4bf334eb30ba74dJs, map[string]*bintree{}},
"vendor-2178567ff7c98706522514fb07f7d3be.css": &bintree{distAssetsVendor2178567ff7c98706522514fb07f7d3beCss, map[string]*bintree{}},
}},
diff --git a/command/agent/command.go b/command/agent/command.go
index 33cd0ad0908..b2bcbeaa7cd 100644
--- a/command/agent/command.go
+++ b/command/agent/command.go
@@ -1008,7 +1008,7 @@ func (c *Command) handleReload() {
}
}
- if s := c.agent.Client(); s != nil {
+ if client := c.agent.Client(); client != nil {
c.agent.logger.Debug("starting reload of client config")
clientConfig, err := convertClientConfig(newConf)
if err != nil {
@@ -1022,7 +1022,7 @@ func (c *Command) handleReload() {
return
}
- if err := c.agent.Client().Reload(clientConfig); err != nil {
+ if err := client.Reload(clientConfig); err != nil {
c.agent.logger.Error("reloading client config failed", "error", err)
return
}
diff --git a/command/agent/command_test.go b/command/agent/command_test.go
index 7d221966c0f..9ce1a0a5fa2 100644
--- a/command/agent/command_test.go
+++ b/command/agent/command_test.go
@@ -8,7 +8,7 @@ import (
"testing"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/mitchellh/cli"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
@@ -394,7 +394,7 @@ func TestIsValidConfig(t *testing.T) {
Client: &ClientConfig{
Enabled: true,
Artifact: &config.ArtifactConfig{
- HTTPReadTimeout: helper.StringToPtr("-10m"),
+ HTTPReadTimeout: pointer.Of("-10m"),
},
},
},
diff --git a/command/agent/config.go b/command/agent/config.go
index cea48d1b24d..20da9d727fd 100644
--- a/command/agent/config.go
+++ b/command/agent/config.go
@@ -22,18 +22,20 @@ import (
client "github.com/hashicorp/nomad/client/config"
"github.com/hashicorp/nomad/client/fingerprint"
"github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/nomad"
"github.com/hashicorp/nomad/nomad/structs"
"github.com/hashicorp/nomad/nomad/structs/config"
"github.com/hashicorp/nomad/version"
+ "golang.org/x/exp/slices"
)
// Config is the configuration for the Nomad agent.
//
// time.Duration values have two parts:
-// - a string field tagged with an hcl:"foo" and json:"-"
-// - a time.Duration field in the same struct and a call to duration
-// in config_parse.go ParseConfigFile
+// - a string field tagged with an hcl:"foo" and json:"-"
+// - a time.Duration field in the same struct and a call to duration
+// in config_parse.go ParseConfigFile
//
// All config structs should have an ExtraKeysHCL field to check for
// unexpected keys
@@ -332,6 +334,28 @@ type ClientConfig struct {
ExtraKeysHCL []string `hcl:",unusedKeys" json:"-"`
}
+func (c *ClientConfig) Copy() *ClientConfig {
+ if c == nil {
+ return c
+ }
+
+ nc := *c
+ nc.Servers = slices.Clone(c.Servers)
+ nc.Options = helper.CopyMap(c.Options)
+ nc.Meta = helper.CopyMap(c.Meta)
+ nc.ChrootEnv = helper.CopyMap(c.ChrootEnv)
+ nc.Reserved = c.Reserved.Copy()
+ nc.NoHostUUID = pointer.Copy(c.NoHostUUID)
+ nc.TemplateConfig = c.TemplateConfig.Copy()
+ nc.ServerJoin = c.ServerJoin.Copy()
+ nc.HostVolumes = helper.CopySlice(c.HostVolumes)
+ nc.HostNetworks = helper.CopySlice(c.HostNetworks)
+ nc.NomadServiceDiscovery = pointer.Copy(c.NomadServiceDiscovery)
+ nc.Artifact = c.Artifact.Copy()
+ nc.ExtraKeysHCL = slices.Clone(c.ExtraKeysHCL)
+ return &nc
+}
+
// ACLConfig is configuration specific to the ACL system
type ACLConfig struct {
// Enabled controls if we are enforce and manage ACLs
@@ -372,6 +396,16 @@ type ACLConfig struct {
ExtraKeysHCL []string `hcl:",unusedKeys" json:"-"`
}
+func (a *ACLConfig) Copy() *ACLConfig {
+ if a == nil {
+ return nil
+ }
+
+ na := *a
+ na.ExtraKeysHCL = slices.Clone(a.ExtraKeysHCL)
+ return &na
+}
+
// ServerConfig is configuration specific to the server mode
type ServerConfig struct {
// Enabled controls if we are a server
@@ -571,6 +605,29 @@ type ServerConfig struct {
RaftBoltConfig *RaftBoltConfig `hcl:"raft_boltdb"`
}
+func (s *ServerConfig) Copy() *ServerConfig {
+ if s == nil {
+ return nil
+ }
+
+ ns := *s
+ ns.RaftMultiplier = pointer.Copy(s.RaftMultiplier)
+ ns.NumSchedulers = pointer.Copy(s.NumSchedulers)
+ ns.EnabledSchedulers = slices.Clone(s.EnabledSchedulers)
+ ns.StartJoin = slices.Clone(s.StartJoin)
+ ns.RetryJoin = slices.Clone(s.RetryJoin)
+ ns.ServerJoin = s.ServerJoin.Copy()
+ ns.DefaultSchedulerConfig = s.DefaultSchedulerConfig.Copy()
+ ns.PlanRejectionTracker = s.PlanRejectionTracker.Copy()
+ ns.EnableEventBroker = pointer.Copy(s.EnableEventBroker)
+ ns.EventBufferSize = pointer.Copy(s.EventBufferSize)
+ ns.licenseAdditionalPublicKeys = slices.Clone(s.licenseAdditionalPublicKeys)
+ ns.ExtraKeysHCL = slices.Clone(s.ExtraKeysHCL)
+ ns.Search = s.Search.Copy()
+ ns.RaftBoltConfig = s.RaftBoltConfig.Copy()
+ return &ns
+}
+
// RaftBoltConfig is used in servers to configure parameters of the boltdb
// used for raft consensus.
type RaftBoltConfig struct {
@@ -582,6 +639,15 @@ type RaftBoltConfig struct {
NoFreelistSync bool `hcl:"no_freelist_sync"`
}
+func (r *RaftBoltConfig) Copy() *RaftBoltConfig {
+ if r == nil {
+ return nil
+ }
+
+ nr := *r
+ return &nr
+}
+
// PlanRejectionTracker is used in servers to configure the plan rejection
// tracker.
type PlanRejectionTracker struct {
@@ -601,6 +667,17 @@ type PlanRejectionTracker struct {
ExtraKeysHCL []string `hcl:",unusedKeys" json:"-"`
}
+func (p *PlanRejectionTracker) Copy() *PlanRejectionTracker {
+ if p == nil {
+ return nil
+ }
+
+ np := *p
+ np.Enabled = pointer.Copy(p.Enabled)
+ np.ExtraKeysHCL = slices.Clone(p.ExtraKeysHCL)
+ return &np
+}
+
func (p *PlanRejectionTracker) Merge(b *PlanRejectionTracker) *PlanRejectionTracker {
if p == nil {
return b
@@ -665,6 +742,15 @@ type Search struct {
MinTermLength int `hcl:"min_term_length"`
}
+func (s *Search) Copy() *Search {
+ if s == nil {
+ return nil
+ }
+
+ ns := *s
+ return &ns
+}
+
// ServerJoin is used in both clients and servers to bootstrap connections to
// servers
type ServerJoin struct {
@@ -692,6 +778,18 @@ type ServerJoin struct {
ExtraKeysHCL []string `hcl:",unusedKeys" json:"-"`
}
+func (s *ServerJoin) Copy() *ServerJoin {
+ if s == nil {
+ return nil
+ }
+
+ ns := *s
+ ns.StartJoin = slices.Clone(s.StartJoin)
+ ns.RetryJoin = slices.Clone(s.RetryJoin)
+ ns.ExtraKeysHCL = slices.Clone(s.ExtraKeysHCL)
+ return &ns
+}
+
func (s *ServerJoin) Merge(b *ServerJoin) *ServerJoin {
if s == nil {
return b
@@ -826,6 +924,19 @@ type Telemetry struct {
ExtraKeysHCL []string `hcl:",unusedKeys" json:"-"`
}
+func (t *Telemetry) Copy() *Telemetry {
+ if t == nil {
+ return nil
+ }
+
+ nt := *t
+ nt.DataDogTags = slices.Clone(t.DataDogTags)
+ nt.PrefixFilter = slices.Clone(t.PrefixFilter)
+ nt.FilterDefault = pointer.Copy(t.FilterDefault)
+ nt.ExtraKeysHCL = slices.Clone(t.ExtraKeysHCL)
+ return &nt
+}
+
// PrefixFilters parses the PrefixFilter field and returns a list of allowed and blocked filters
func (a *Telemetry) PrefixFilters() (allowed, blocked []string, err error) {
for _, rule := range a.PrefixFilter {
@@ -854,6 +965,16 @@ type Ports struct {
ExtraKeysHCL []string `hcl:",unusedKeys" json:"-"`
}
+func (p *Ports) Copy() *Ports {
+ if p == nil {
+ return nil
+ }
+
+ np := *p
+ np.ExtraKeysHCL = slices.Clone(p.ExtraKeysHCL)
+ return &np
+}
+
// Addresses encapsulates all of the addresses we bind to for various
// network services. Everything is optional and defaults to BindAddr.
type Addresses struct {
@@ -864,6 +985,16 @@ type Addresses struct {
ExtraKeysHCL []string `hcl:",unusedKeys" json:"-"`
}
+func (a *Addresses) Copy() *Addresses {
+ if a == nil {
+ return nil
+ }
+
+ na := *a
+ na.ExtraKeysHCL = slices.Clone(a.ExtraKeysHCL)
+ return &na
+}
+
// AdvertiseAddrs is used to control the addresses we advertise out for
// different network services. All are optional and default to BindAddr and
// their default Port.
@@ -873,6 +1004,16 @@ type NormalizedAddrs struct {
Serf string
}
+func (n *NormalizedAddrs) Copy() *NormalizedAddrs {
+ if n == nil {
+ return nil
+ }
+
+ nn := *n
+ nn.HTTP = slices.Clone(n.HTTP)
+ return &nn
+}
+
// AdvertiseAddrs is used to control the addresses we advertise out for
// different network services. All are optional and default to BindAddr and
// their default Port.
@@ -884,6 +1025,16 @@ type AdvertiseAddrs struct {
ExtraKeysHCL []string `hcl:",unusedKeys" json:"-"`
}
+func (a *AdvertiseAddrs) Copy() *AdvertiseAddrs {
+ if a == nil {
+ return nil
+ }
+
+ na := *a
+ na.ExtraKeysHCL = slices.Clone(a.ExtraKeysHCL)
+ return &na
+}
+
type Resources struct {
CPU int `hcl:"cpu"`
MemoryMB int `hcl:"memory"`
@@ -894,6 +1045,16 @@ type Resources struct {
ExtraKeysHCL []string `hcl:",unusedKeys" json:"-"`
}
+func (r *Resources) Copy() *Resources {
+ if r == nil {
+ return nil
+ }
+
+ nr := *r
+ nr.ExtraKeysHCL = slices.Clone(r.ExtraKeysHCL)
+ return &nr
+}
+
// devModeConfig holds the config for the -dev and -dev-connect flags
type devModeConfig struct {
// mode flags are set at the command line via -dev and -dev-connect
@@ -990,7 +1151,7 @@ func DevConfig(mode *devModeConfig) *Config {
conf.Server.BootstrapExpect = 1
conf.EnableDebug = true
conf.DisableAnonymousSignature = true
- conf.Consul.AutoAdvertise = helper.BoolToPtr(true)
+ conf.Consul.AutoAdvertise = pointer.Of(true)
conf.Client.NetworkInterface = mode.iface
conf.Client.Options = map[string]string{
"driver.raw_exec.enable": "true",
@@ -1006,7 +1167,7 @@ func DevConfig(mode *devModeConfig) *Config {
}
conf.Client.Options[fingerprint.TightenNetworkTimeoutsConfig] = "true"
conf.Client.BindWildcardDefaultHostNetwork = true
- conf.Client.NomadServiceDiscovery = helper.BoolToPtr(true)
+ conf.Client.NomadServiceDiscovery = pointer.Of(true)
conf.Telemetry.PrometheusMetrics = true
conf.Telemetry.PublishAllocationMetrics = true
conf.Telemetry.PublishNodeMetrics = true
@@ -1044,7 +1205,7 @@ func DefaultConfig() *Config {
GCDiskUsageThreshold: 80,
GCInodeUsageThreshold: 70,
GCMaxAllocs: 50,
- NoHostUUID: helper.BoolToPtr(true),
+ NoHostUUID: pointer.Of(true),
DisableRemoteExec: false,
ServerJoin: &ServerJoin{
RetryJoin: []string{},
@@ -1058,17 +1219,17 @@ func DefaultConfig() *Config {
BindWildcardDefaultHostNetwork: true,
CNIPath: "/opt/cni/bin",
CNIConfigDir: "/opt/cni/config",
- NomadServiceDiscovery: helper.BoolToPtr(true),
+ NomadServiceDiscovery: pointer.Of(true),
Artifact: config.DefaultArtifactConfig(),
},
Server: &ServerConfig{
Enabled: false,
- EnableEventBroker: helper.BoolToPtr(true),
- EventBufferSize: helper.IntToPtr(100),
+ EnableEventBroker: pointer.Of(true),
+ EventBufferSize: pointer.Of(100),
RaftProtocol: 3,
StartJoin: []string{},
PlanRejectionTracker: &PlanRejectionTracker{
- Enabled: helper.BoolToPtr(false),
+ Enabled: pointer.Of(false),
NodeThreshold: 100,
NodeWindow: 5 * time.Minute,
},
@@ -1099,7 +1260,7 @@ func DefaultConfig() *Config {
Version: version.GetVersion(),
Autopilot: config.DefaultAutopilotConfig(),
Audit: &config.AuditConfig{},
- DisableUpdateCheck: helper.BoolToPtr(false),
+ DisableUpdateCheck: pointer.Of(false),
Limits: config.DefaultLimits(),
}
}
@@ -1185,7 +1346,7 @@ func (c *Config) Merge(b *Config) *Config {
result.SyslogFacility = b.SyslogFacility
}
if b.DisableUpdateCheck != nil {
- result.DisableUpdateCheck = helper.BoolToPtr(*b.DisableUpdateCheck)
+ result.DisableUpdateCheck = pointer.Of(*b.DisableUpdateCheck)
}
if b.DisableAnonymousSignature {
result.DisableAnonymousSignature = true
@@ -1326,6 +1487,42 @@ func (c *Config) Merge(b *Config) *Config {
return &result
}
+// Copy returns a deep copy safe for mutation.
+func (c *Config) Copy() *Config {
+ if c == nil {
+ return nil
+ }
+ nc := *c
+
+ nc.Ports = c.Ports.Copy()
+ nc.Addresses = c.Addresses.Copy()
+ nc.normalizedAddrs = c.normalizedAddrs.Copy()
+ nc.AdvertiseAddrs = c.AdvertiseAddrs.Copy()
+ nc.Client = c.Client.Copy()
+ nc.Server = c.Server.Copy()
+ nc.ACL = c.ACL.Copy()
+ nc.Telemetry = c.Telemetry.Copy()
+ nc.DisableUpdateCheck = pointer.Copy(c.DisableUpdateCheck)
+ nc.Consul = c.Consul.Copy()
+ nc.Vault = c.Vault.Copy()
+ nc.UI = c.UI.Copy()
+
+ nc.NomadConfig = c.NomadConfig.Copy()
+ nc.ClientConfig = c.ClientConfig.Copy()
+
+ nc.Version = c.Version.Copy()
+ nc.Files = slices.Clone(c.Files)
+ nc.TLSConfig = c.TLSConfig.Copy()
+ nc.HTTPAPIResponseHeaders = helper.CopyMap(c.HTTPAPIResponseHeaders)
+ nc.Sentinel = c.Sentinel.Copy()
+ nc.Autopilot = c.Autopilot.Copy()
+ nc.Plugins = helper.CopySlice(c.Plugins)
+ nc.Limits = c.Limits.Copy()
+ nc.Audit = c.Audit.Copy()
+ nc.ExtraKeysHCL = slices.Clone(c.ExtraKeysHCL)
+ return &nc
+}
+
// normalizeAddrs normalizes Addresses and AdvertiseAddrs to always be
// initialized and have reasonable defaults.
func (c *Config) normalizeAddrs() error {
@@ -1602,7 +1799,7 @@ func (s *ServerConfig) Merge(b *ServerConfig) *ServerConfig {
result.RaftMultiplier = &c
}
if b.NumSchedulers != nil {
- result.NumSchedulers = helper.IntToPtr(*b.NumSchedulers)
+ result.NumSchedulers = pointer.Of(*b.NumSchedulers)
}
if b.NodeGCThreshold != "" {
result.NodeGCThreshold = b.NodeGCThreshold
diff --git a/command/agent/config_parse.go b/command/agent/config_parse.go
index 97858463d15..5004aee0e07 100644
--- a/command/agent/config_parse.go
+++ b/command/agent/config_parse.go
@@ -41,6 +41,7 @@ func ParseConfigFile(path string) (*Config, error) {
WaitBounds: &client.WaitConfig{},
ConsulRetry: &client.RetryConfig{},
VaultRetry: &client.RetryConfig{},
+ NomadRetry: &client.RetryConfig{},
},
},
Server: &ServerConfig{
@@ -127,6 +128,16 @@ func ParseConfigFile(path string) (*Config, error) {
c.Client.TemplateConfig.VaultRetry.MaxBackoff = d
},
},
+ {"client.template.nomad_retry.backoff", nil, &c.Client.TemplateConfig.NomadRetry.BackoffHCL,
+ func(d *time.Duration) {
+ c.Client.TemplateConfig.NomadRetry.Backoff = d
+ },
+ },
+ {"client.template.nomad_retry.max_backoff", nil, &c.Client.TemplateConfig.NomadRetry.MaxBackoffHCL,
+ func(d *time.Duration) {
+ c.Client.TemplateConfig.NomadRetry.MaxBackoff = d
+ },
+ },
}
// Add enterprise audit sinks for time.Duration parsing
@@ -266,6 +277,10 @@ func finalizeClientTemplateConfig(config *Config) {
config.Client.TemplateConfig.VaultRetry = nil
}
+ if config.Client.TemplateConfig.NomadRetry.IsEmpty() {
+ config.Client.TemplateConfig.NomadRetry = nil
+ }
+
if config.Client.TemplateConfig.IsEmpty() {
config.Client.TemplateConfig = nil
}
diff --git a/command/agent/config_parse_test.go b/command/agent/config_parse_test.go
index c32f6239dc0..4ba63eb61f7 100644
--- a/command/agent/config_parse_test.go
+++ b/command/agent/config_parse_test.go
@@ -8,7 +8,7 @@ import (
"time"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/nomad/structs"
"github.com/hashicorp/nomad/nomad/structs/config"
"github.com/stretchr/testify/require"
@@ -82,7 +82,7 @@ var basicConfig = &Config{
GCDiskUsageThreshold: 82,
GCInodeUsageThreshold: 91,
GCMaxAllocs: 50,
- NoHostUUID: helper.BoolToPtr(false),
+ NoHostUUID: pointer.Of(false),
DisableRemoteExec: true,
HostVolumes: []*structs.ClientHostVolumeConfig{
{Name: "tmp", Path: "/tmp"},
@@ -97,8 +97,8 @@ var basicConfig = &Config{
BootstrapExpect: 5,
DataDir: "/tmp/data",
RaftProtocol: 3,
- RaftMultiplier: helper.IntToPtr(4),
- NumSchedulers: helper.IntToPtr(2),
+ RaftMultiplier: pointer.Of(4),
+ NumSchedulers: pointer.Of(2),
EnabledSchedulers: []string{"test"},
NodeGCThreshold: "12h",
EvalGCThreshold: "12h",
@@ -125,10 +125,10 @@ var basicConfig = &Config{
RedundancyZone: "foo",
UpgradeVersion: "0.8.0",
EncryptKey: "abc",
- EnableEventBroker: helper.BoolToPtr(false),
- EventBufferSize: helper.IntToPtr(200),
+ EnableEventBroker: pointer.Of(false),
+ EventBufferSize: pointer.Of(200),
PlanRejectionTracker: &PlanRejectionTracker{
- Enabled: helper.BoolToPtr(true),
+ Enabled: pointer.Of(true),
NodeThreshold: 100,
NodeWindow: 41 * time.Minute,
NodeWindowHCL: "41m",
@@ -162,7 +162,7 @@ var basicConfig = &Config{
ReplicationToken: "foobar",
},
Audit: &config.AuditConfig{
- Enabled: helper.BoolToPtr(true),
+ Enabled: pointer.Of(true),
Sinks: []*config.AuditSink{
{
DeliveryGuarantee: "enforced",
@@ -201,7 +201,7 @@ var basicConfig = &Config{
LeaveOnTerm: true,
EnableSyslog: true,
SyslogFacility: "LOCAL1",
- DisableUpdateCheck: helper.BoolToPtr(true),
+ DisableUpdateCheck: pointer.Of(true),
DisableAnonymousSignature: true,
Consul: &config.ConsulConfig{
ServerServiceName: "nomad",
@@ -644,7 +644,7 @@ var sample0 = &Config{
Enabled: true,
},
Audit: &config.AuditConfig{
- Enabled: helper.BoolToPtr(true),
+ Enabled: pointer.Of(true),
Sinks: []*config.AuditSink{
{
DeliveryGuarantee: "enforced",
@@ -682,11 +682,11 @@ var sample0 = &Config{
SyslogFacility: "LOCAL0",
Consul: &config.ConsulConfig{
Token: "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
- ServerAutoJoin: helper.BoolToPtr(false),
- ClientAutoJoin: helper.BoolToPtr(false),
+ ServerAutoJoin: pointer.Of(false),
+ ClientAutoJoin: pointer.Of(false),
},
Vault: &config.VaultConfig{
- Enabled: helper.BoolToPtr(true),
+ Enabled: pointer.Of(true),
Role: "nomad-cluster",
Addr: "http://host.example.com:8200",
},
@@ -699,7 +699,7 @@ var sample0 = &Config{
KeyFile: "/opt/data/nomad/certs/server-key.pem",
},
Autopilot: &config.AutopilotConfig{
- CleanupDeadServers: helper.BoolToPtr(true),
+ CleanupDeadServers: pointer.Of(true),
},
}
@@ -739,7 +739,7 @@ var sample1 = &Config{
Enabled: true,
},
Audit: &config.AuditConfig{
- Enabled: helper.BoolToPtr(true),
+ Enabled: pointer.Of(true),
Sinks: []*config.AuditSink{
{
Name: "file",
@@ -776,13 +776,13 @@ var sample1 = &Config{
EnableSyslog: true,
SyslogFacility: "LOCAL0",
Consul: &config.ConsulConfig{
- EnableSSL: helper.BoolToPtr(true),
+ EnableSSL: pointer.Of(true),
Token: "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
- ServerAutoJoin: helper.BoolToPtr(false),
- ClientAutoJoin: helper.BoolToPtr(false),
+ ServerAutoJoin: pointer.Of(false),
+ ClientAutoJoin: pointer.Of(false),
},
Vault: &config.VaultConfig{
- Enabled: helper.BoolToPtr(true),
+ Enabled: pointer.Of(true),
Role: "nomad-cluster",
Addr: "http://host.example.com:8200",
},
@@ -795,7 +795,7 @@ var sample1 = &Config{
KeyFile: "/opt/data/nomad/certs/server-key.pem",
},
Autopilot: &config.AutopilotConfig{
- CleanupDeadServers: helper.BoolToPtr(true),
+ CleanupDeadServers: pointer.Of(true),
},
}
diff --git a/command/agent/config_test.go b/command/agent/config_test.go
index c2851abc8b1..42ec370a087 100644
--- a/command/agent/config_test.go
+++ b/command/agent/config_test.go
@@ -16,8 +16,8 @@ import (
"github.com/hashicorp/nomad/ci"
client "github.com/hashicorp/nomad/client/config"
"github.com/hashicorp/nomad/client/testutil"
- "github.com/hashicorp/nomad/helper"
"github.com/hashicorp/nomad/helper/freeport"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/nomad/structs"
"github.com/hashicorp/nomad/nomad/structs/config"
"github.com/stretchr/testify/require"
@@ -62,7 +62,7 @@ func TestConfig_Merge(t *testing.T) {
LeaveOnTerm: false,
EnableSyslog: false,
SyslogFacility: "local0.info",
- DisableUpdateCheck: helper.BoolToPtr(false),
+ DisableUpdateCheck: pointer.Of(false),
DisableAnonymousSignature: false,
BindAddr: "127.0.0.1",
Telemetry: &Telemetry{
@@ -88,7 +88,7 @@ func TestConfig_Merge(t *testing.T) {
PrefixFilter: []string{"filter1", "filter2"},
},
Audit: &config.AuditConfig{
- Enabled: helper.BoolToPtr(true),
+ Enabled: pointer.Of(true),
Sinks: []*config.AuditSink{
{
DeliveryGuarantee: "enforced",
@@ -129,7 +129,7 @@ func TestConfig_Merge(t *testing.T) {
DiskMB: 10,
ReservedPorts: "1,10-30,55",
},
- NomadServiceDiscovery: helper.BoolToPtr(false),
+ NomadServiceDiscovery: pointer.Of(false),
},
Server: &ServerConfig{
Enabled: false,
@@ -138,18 +138,18 @@ func TestConfig_Merge(t *testing.T) {
DataDir: "/tmp/data1",
ProtocolVersion: 1,
RaftProtocol: 1,
- RaftMultiplier: helper.IntToPtr(5),
- NumSchedulers: helper.IntToPtr(1),
+ RaftMultiplier: pointer.Of(5),
+ NumSchedulers: pointer.Of(1),
NodeGCThreshold: "1h",
HeartbeatGrace: 30 * time.Second,
MinHeartbeatTTL: 30 * time.Second,
MaxHeartbeatsPerSecond: 30.0,
RedundancyZone: "foo",
UpgradeVersion: "foo",
- EnableEventBroker: helper.BoolToPtr(false),
- EventBufferSize: helper.IntToPtr(0),
+ EnableEventBroker: pointer.Of(false),
+ EventBufferSize: pointer.Of(0),
PlanRejectionTracker: &PlanRejectionTracker{
- Enabled: helper.BoolToPtr(true),
+ Enabled: pointer.Of(true),
NodeThreshold: 100,
NodeWindow: 11 * time.Minute,
},
@@ -243,11 +243,11 @@ func TestConfig_Merge(t *testing.T) {
LeaveOnTerm: true,
EnableSyslog: true,
SyslogFacility: "local0.debug",
- DisableUpdateCheck: helper.BoolToPtr(true),
+ DisableUpdateCheck: pointer.Of(true),
DisableAnonymousSignature: true,
BindAddr: "127.0.0.2",
Audit: &config.AuditConfig{
- Enabled: helper.BoolToPtr(true),
+ Enabled: pointer.Of(true),
Sinks: []*config.AuditSink{
{
DeliveryGuarantee: "enforced",
@@ -286,7 +286,7 @@ func TestConfig_Merge(t *testing.T) {
CirconusBrokerSelectTag: "dc:dc2",
PrefixFilter: []string{"prefix1", "prefix2"},
DisableDispatchedJobSummaryMetrics: true,
- FilterDefault: helper.BoolToPtr(false),
+ FilterDefault: pointer.Of(false),
},
Client: &ClientConfig{
Enabled: true,
@@ -325,7 +325,7 @@ func TestConfig_Merge(t *testing.T) {
GCParallelDestroys: 6,
GCDiskUsageThreshold: 71,
GCInodeUsageThreshold: 86,
- NomadServiceDiscovery: helper.BoolToPtr(false),
+ NomadServiceDiscovery: pointer.Of(false),
},
Server: &ServerConfig{
Enabled: true,
@@ -334,8 +334,8 @@ func TestConfig_Merge(t *testing.T) {
DataDir: "/tmp/data2",
ProtocolVersion: 2,
RaftProtocol: 2,
- RaftMultiplier: helper.IntToPtr(6),
- NumSchedulers: helper.IntToPtr(2),
+ RaftMultiplier: pointer.Of(6),
+ NumSchedulers: pointer.Of(2),
EnabledSchedulers: []string{structs.JobTypeBatch},
NodeGCThreshold: "12h",
HeartbeatGrace: 2 * time.Minute,
@@ -348,10 +348,10 @@ func TestConfig_Merge(t *testing.T) {
NonVotingServer: true,
RedundancyZone: "bar",
UpgradeVersion: "bar",
- EnableEventBroker: helper.BoolToPtr(true),
- EventBufferSize: helper.IntToPtr(100),
+ EnableEventBroker: pointer.Of(true),
+ EventBufferSize: pointer.Of(100),
PlanRejectionTracker: &PlanRejectionTracker{
- Enabled: helper.BoolToPtr(true),
+ Enabled: pointer.Of(true),
NodeThreshold: 100,
NodeWindow: 11 * time.Minute,
},
@@ -1130,7 +1130,7 @@ func TestConfig_templateNetworkInterface(t *testing.T) {
{
name: "insignificant whitespace",
clientConfig: &ClientConfig{
- Enabled: true,
+ Enabled: true,
NetworkInterface: ` {{GetAllInterfaces | attr "name" }}`,
},
expectedInterface: iface.Name,
@@ -1368,8 +1368,8 @@ func TestEventBroker_Parse(t *testing.T) {
require := require.New(t)
{
a := &ServerConfig{
- EnableEventBroker: helper.BoolToPtr(false),
- EventBufferSize: helper.IntToPtr(0),
+ EnableEventBroker: pointer.Of(false),
+ EventBufferSize: pointer.Of(0),
}
b := DefaultConfig().Server
b.EnableEventBroker = nil
@@ -1382,8 +1382,8 @@ func TestEventBroker_Parse(t *testing.T) {
{
a := &ServerConfig{
- EnableEventBroker: helper.BoolToPtr(true),
- EventBufferSize: helper.IntToPtr(5000),
+ EnableEventBroker: pointer.Of(true),
+ EventBufferSize: pointer.Of(5000),
}
b := DefaultConfig().Server
b.EnableEventBroker = nil
@@ -1396,12 +1396,12 @@ func TestEventBroker_Parse(t *testing.T) {
{
a := &ServerConfig{
- EnableEventBroker: helper.BoolToPtr(false),
- EventBufferSize: helper.IntToPtr(0),
+ EnableEventBroker: pointer.Of(false),
+ EventBufferSize: pointer.Of(0),
}
b := DefaultConfig().Server
- b.EnableEventBroker = helper.BoolToPtr(true)
- b.EventBufferSize = helper.IntToPtr(20000)
+ b.EnableEventBroker = pointer.Of(true)
+ b.EventBufferSize = pointer.Of(20000)
result := a.Merge(b)
require.Equal(true, *result.EnableEventBroker)
@@ -1436,6 +1436,7 @@ func TestConfig_LoadConsulTemplateConfig(t *testing.T) {
require.NotNil(t, templateConfig.WaitBounds)
require.NotNil(t, templateConfig.ConsulRetry)
require.NotNil(t, templateConfig.VaultRetry)
+ require.NotNil(t, templateConfig.NomadRetry)
// Direct properties
require.Equal(t, 300*time.Second, *templateConfig.MaxStale)
@@ -1456,6 +1457,11 @@ func TestConfig_LoadConsulTemplateConfig(t *testing.T) {
require.Equal(t, 10, *templateConfig.VaultRetry.Attempts)
require.Equal(t, 15*time.Second, *templateConfig.VaultRetry.Backoff)
require.Equal(t, 20*time.Second, *templateConfig.VaultRetry.MaxBackoff)
+ // Nomad Retry
+ require.NotNil(t, templateConfig.NomadRetry)
+ require.Equal(t, 15, *templateConfig.NomadRetry.Attempts)
+ require.Equal(t, 20*time.Second, *templateConfig.NomadRetry.Backoff)
+ require.Equal(t, 25*time.Second, *templateConfig.NomadRetry.MaxBackoff)
}
func TestConfig_LoadConsulTemplate_FunctionDenylist(t *testing.T) {
diff --git a/command/agent/consul/check_watcher_test.go b/command/agent/consul/check_watcher_test.go
index 9323d32bb09..f27fffe9d16 100644
--- a/command/agent/consul/check_watcher_test.go
+++ b/command/agent/consul/check_watcher_test.go
@@ -57,7 +57,6 @@ func newFakeCheckRestarter(w *checkWatcher, allocID, taskName, checkName string,
// watching and is normally fulfilled by a TaskRunner.
//
// Restarts are recorded in the []restarts field and re-Watch the check.
-//func (c *fakeCheckRestarter) Restart(source, reason string, failure bool) {
func (c *fakeCheckRestarter) Restart(ctx context.Context, event *structs.TaskEvent, failure bool) error {
c.mu.Lock()
defer c.mu.Unlock()
diff --git a/command/agent/consul/connect.go b/command/agent/consul/connect.go
index c92ff922f5b..5edbfab1263 100644
--- a/command/agent/consul/connect.go
+++ b/command/agent/consul/connect.go
@@ -209,15 +209,11 @@ func connectUpstreams(in []structs.ConsulUpstream) []api.Upstream {
// connectMeshGateway creates an api.MeshGatewayConfig from the nomad upstream
// block. A non-existent config or unsupported gateway mode will default to the
// Consul default mode.
-func connectMeshGateway(in *structs.ConsulMeshGateway) api.MeshGatewayConfig {
+func connectMeshGateway(in structs.ConsulMeshGateway) api.MeshGatewayConfig {
gw := api.MeshGatewayConfig{
Mode: api.MeshGatewayModeDefault,
}
- if in == nil {
- return gw
- }
-
switch in.Mode {
case "local":
gw.Mode = api.MeshGatewayModeLocal
diff --git a/command/agent/consul/connect_test.go b/command/agent/consul/connect_test.go
index 5e4ac6c3e6b..356587c6d65 100644
--- a/command/agent/consul/connect_test.go
+++ b/command/agent/consul/connect_test.go
@@ -6,7 +6,7 @@ import (
"github.com/hashicorp/consul/api"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/structs"
"github.com/stretchr/testify/require"
@@ -501,7 +501,7 @@ func TestConnect_newConnectGateway(t *testing.T) {
result := newConnectGateway(&structs.ConsulConnect{
Gateway: &structs.ConsulGateway{
Proxy: &structs.ConsulGatewayProxy{
- ConnectTimeout: helper.TimeToPtr(1 * time.Second),
+ ConnectTimeout: pointer.Of(1 * time.Second),
EnvoyGatewayBindTaggedAddresses: false,
EnvoyGatewayBindAddresses: nil,
EnvoyGatewayNoDefaultBind: false,
@@ -531,7 +531,7 @@ func TestConnect_newConnectGateway(t *testing.T) {
result := newConnectGateway(&structs.ConsulConnect{
Gateway: &structs.ConsulGateway{
Proxy: &structs.ConsulGatewayProxy{
- ConnectTimeout: helper.TimeToPtr(1 * time.Second),
+ ConnectTimeout: pointer.Of(1 * time.Second),
EnvoyGatewayBindTaggedAddresses: true,
EnvoyGatewayBindAddresses: map[string]*structs.ConsulGatewayBindAddress{
"service1": {
@@ -568,28 +568,28 @@ func TestConnect_newConnectGateway(t *testing.T) {
func Test_connectMeshGateway(t *testing.T) {
ci.Parallel(t)
- t.Run("nil", func(t *testing.T) {
- result := connectMeshGateway(nil)
+ t.Run("empty", func(t *testing.T) {
+ result := connectMeshGateway(structs.ConsulMeshGateway{})
require.Equal(t, api.MeshGatewayConfig{Mode: api.MeshGatewayModeDefault}, result)
})
t.Run("local", func(t *testing.T) {
- result := connectMeshGateway(&structs.ConsulMeshGateway{Mode: "local"})
+ result := connectMeshGateway(structs.ConsulMeshGateway{Mode: "local"})
require.Equal(t, api.MeshGatewayConfig{Mode: api.MeshGatewayModeLocal}, result)
})
t.Run("remote", func(t *testing.T) {
- result := connectMeshGateway(&structs.ConsulMeshGateway{Mode: "remote"})
+ result := connectMeshGateway(structs.ConsulMeshGateway{Mode: "remote"})
require.Equal(t, api.MeshGatewayConfig{Mode: api.MeshGatewayModeRemote}, result)
})
t.Run("none", func(t *testing.T) {
- result := connectMeshGateway(&structs.ConsulMeshGateway{Mode: "none"})
+ result := connectMeshGateway(structs.ConsulMeshGateway{Mode: "none"})
require.Equal(t, api.MeshGatewayConfig{Mode: api.MeshGatewayModeNone}, result)
})
t.Run("nonsense", func(t *testing.T) {
- result := connectMeshGateway(nil)
+ result := connectMeshGateway(structs.ConsulMeshGateway{})
require.Equal(t, api.MeshGatewayConfig{Mode: api.MeshGatewayModeDefault}, result)
})
}
diff --git a/command/agent/consul/int_test.go b/command/agent/consul/int_test.go
index ec97fb3363d..3e1d31aeb07 100644
--- a/command/agent/consul/int_test.go
+++ b/command/agent/consul/int_test.go
@@ -144,26 +144,26 @@ func TestConsul_Integration(t *testing.T) {
close(consulRan)
}()
- // Create a closed channel to mock TaskHookCoordinator.startConditionForTask.
+ // Create a closed channel to mock TaskCoordinator.startConditionForTask.
// Closed channel indicates this task is not blocked on prestart hooks.
closedCh := make(chan struct{})
close(closedCh)
// Build the config
config := &taskrunner.Config{
- Alloc: alloc,
- ClientConfig: conf,
- Consul: serviceClient,
- Task: task,
- TaskDir: taskDir,
- Logger: logger,
- Vault: vclient,
- StateDB: state.NoopDB{},
- StateUpdater: logUpdate,
- DeviceManager: devicemanager.NoopMockManager(),
- DriverManager: drivermanager.TestDriverManager(t),
- StartConditionMetCtx: closedCh,
- ServiceRegWrapper: wrapper.NewHandlerWrapper(logger, serviceClient, regMock.NewServiceRegistrationHandler(logger)),
+ Alloc: alloc,
+ ClientConfig: conf,
+ Consul: serviceClient,
+ Task: task,
+ TaskDir: taskDir,
+ Logger: logger,
+ Vault: vclient,
+ StateDB: state.NoopDB{},
+ StateUpdater: logUpdate,
+ DeviceManager: devicemanager.NoopMockManager(),
+ DriverManager: drivermanager.TestDriverManager(t),
+ StartConditionMetCh: closedCh,
+ ServiceRegWrapper: wrapper.NewHandlerWrapper(logger, serviceClient, regMock.NewServiceRegistrationHandler(logger)),
}
tr, err := taskrunner.NewTaskRunner(config)
diff --git a/command/agent/consul/namespaces_client.go b/command/agent/consul/namespaces_client.go
index 974b2e705a3..c2d8b082b32 100644
--- a/command/agent/consul/namespaces_client.go
+++ b/command/agent/consul/namespaces_client.go
@@ -67,8 +67,7 @@ func (ns *NamespacesClient) allowable(now time.Time) bool {
// List returns a list of Consul Namespaces.
//
-// TODO(shoenig): return empty string instead of "default" when namespaces are not
-// enabled. (Coming in followup PR).
+// TODO(shoenig): return empty string instead of "default" when namespaces are not enabled. (Coming in followup PR).
func (ns *NamespacesClient) List() ([]string, error) {
if !ns.allowable(time.Now()) {
// TODO(shoenig): lets return the empty string instead, that way we do not
diff --git a/command/agent/consul/self.go b/command/agent/consul/self.go
index d0edee2758c..36afd142476 100644
--- a/command/agent/consul/self.go
+++ b/command/agent/consul/self.go
@@ -37,9 +37,10 @@ func Namespaces(info Self) bool {
// feature returns whether the indicated feature is enabled by Consul and the
// associated License.
// possible values as of v1.9.5+ent:
-// Automated Backups, Automated Upgrades, Enhanced Read Scalability,
-// Network Segments, Redundancy Zone, Advanced Network Federation,
-// Namespaces, SSO, Audit Logging
+//
+// Automated Backups, Automated Upgrades, Enhanced Read Scalability,
+// Network Segments, Redundancy Zone, Advanced Network Federation,
+// Namespaces, SSO, Audit Logging
func feature(name string, info Self) bool {
lic, licOK := info["Stats"]["license"].(map[string]interface{})
if !licOK {
diff --git a/command/agent/consul/service_client.go b/command/agent/consul/service_client.go
index 679ab2b4daa..77b71f9abaf 100644
--- a/command/agent/consul/service_client.go
+++ b/command/agent/consul/service_client.go
@@ -143,15 +143,15 @@ type ACLsAPI interface {
// of a service definition are different from the existing service definition as
// known by Consul.
//
-// reason - The syncReason that triggered this synchronization with the consul
-// agent API.
-// wanted - Nomad's view of what the service definition is intended to be.
-// Not nil.
-// existing - Consul's view (agent, not catalog) of the actual service definition.
-// Not nil.
-// sidecar - Consul's view (agent, not catalog) of the service definition of the sidecar
-// associated with existing that may or may not exist.
-// May be nil.
+// reason - The syncReason that triggered this synchronization with the consul
+// agent API.
+// wanted - Nomad's view of what the service definition is intended to be.
+// Not nil.
+// existing - Consul's view (agent, not catalog) of the actual service definition.
+// Not nil.
+// sidecar - Consul's view (agent, not catalog) of the service definition of the sidecar
+// associated with existing that may or may not exist.
+// May be nil.
func agentServiceUpdateRequired(reason syncReason, wanted *api.AgentServiceRegistration, existing *api.AgentService, sidecar *api.AgentService) bool {
switch reason {
case syncPeriodic:
@@ -1499,14 +1499,13 @@ func (c *ServiceClient) removeRegistration(allocID, taskName string) {
// {nomadServicePrefix}-{ROLE}-b32(sha1({Service.Name}-{Service.Tags...})
// Example Server ID: _nomad-server-fbbk265qn4tmt25nd4ep42tjvmyj3hr4
// Example Client ID: _nomad-client-ggnjpgl7yn7rgmvxzilmpvrzzvrszc7l
-//
func makeAgentServiceID(role string, service *structs.Service) string {
return fmt.Sprintf("%s-%s-%s", nomadServicePrefix, role, service.Hash(role, "", false))
}
// MakeCheckID creates a unique ID for a check.
//
-// Example Check ID: _nomad-check-434ae42f9a57c5705344974ac38de2aee0ee089d
+// Example Check ID: _nomad-check-434ae42f9a57c5705344974ac38de2aee0ee089d
func MakeCheckID(serviceID string, check *structs.ServiceCheck) string {
return fmt.Sprintf("%s%s", nomadCheckPrefix, check.Hash(serviceID))
}
@@ -1597,7 +1596,6 @@ func isNomadService(id string) bool {
//
// {nomadServicePrefix}-executor-{ALLOC_ID}-{Service.Name}-{Service.Tags...}
// Example Service ID: _nomad-executor-1234-echo-http-tag1-tag2-tag3
-//
func isOldNomadService(id string) bool {
const prefix = nomadServicePrefix + "-executor"
return strings.HasPrefix(id, prefix)
@@ -1615,7 +1613,6 @@ const (
// It is important not to reference the parent service, which may or may not still
// be tracked by Nomad internally.
//
-//
// For example if you have a Connect enabled service with the ID:
//
// _nomad-task-5229c7f8-376b-3ccc-edd9-981e238f7033-cache-redis-cache-db
@@ -1623,7 +1620,6 @@ const (
// Consul will create a service for the sidecar proxy with the ID:
//
// _nomad-task-5229c7f8-376b-3ccc-edd9-981e238f7033-cache-redis-cache-db-sidecar-proxy
-//
func maybeConnectSidecar(id string) bool {
return strings.HasSuffix(id, sidecarSuffix)
}
diff --git a/command/agent/fs_endpoint.go b/command/agent/fs_endpoint.go
index d45a7ce85ad..22be2254173 100644
--- a/command/agent/fs_endpoint.go
+++ b/command/agent/fs_endpoint.go
@@ -197,11 +197,11 @@ func (s *HTTPServer) FileCatRequest(resp http.ResponseWriter, req *http.Request)
// Stream streams the content of a file blocking on EOF.
// The parameters are:
-// * path: path to file to stream.
-// * follow: A boolean of whether to follow the file, defaults to true.
-// * offset: The offset to start streaming data at, defaults to zero.
-// * origin: Either "start" or "end" and defines from where the offset is
-// applied. Defaults to "start".
+// - path: path to file to stream.
+// - follow: A boolean of whether to follow the file, defaults to true.
+// - offset: The offset to start streaming data at, defaults to zero.
+// - origin: Either "start" or "end" and defines from where the offset is
+// applied. Defaults to "start".
func (s *HTTPServer) Stream(resp http.ResponseWriter, req *http.Request) (interface{}, error) {
var allocID, path string
var err error
@@ -255,12 +255,12 @@ func (s *HTTPServer) Stream(resp http.ResponseWriter, req *http.Request) (interf
}
// Logs streams the content of a log blocking on EOF. The parameters are:
-// * task: task name to stream logs for.
-// * type: stdout/stderr to stream.
-// * follow: A boolean of whether to follow the logs.
-// * offset: The offset to start streaming data at, defaults to zero.
-// * origin: Either "start" or "end" and defines from where the offset is
-// applied. Defaults to "start".
+// - task: task name to stream logs for.
+// - type: stdout/stderr to stream.
+// - follow: A boolean of whether to follow the logs.
+// - offset: The offset to start streaming data at, defaults to zero.
+// - origin: Either "start" or "end" and defines from where the offset is
+// applied. Defaults to "start".
func (s *HTTPServer) Logs(resp http.ResponseWriter, req *http.Request) (interface{}, error) {
var allocID, task, logType string
var plain, follow bool
diff --git a/command/agent/http_test.go b/command/agent/http_test.go
index 3801e1f75fe..5baa2a2480a 100644
--- a/command/agent/http_test.go
+++ b/command/agent/http_test.go
@@ -23,7 +23,7 @@ import (
"github.com/hashicorp/nomad/acl"
"github.com/hashicorp/nomad/api"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/testlog"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
@@ -593,11 +593,11 @@ func TestParseBool(t *testing.T) {
},
{
Input: "true",
- Expected: helper.BoolToPtr(true),
+ Expected: pointer.Of(true),
},
{
Input: "false",
- Expected: helper.BoolToPtr(false),
+ Expected: pointer.Of(false),
},
{
Input: "1234",
@@ -640,11 +640,11 @@ func Test_parseInt(t *testing.T) {
},
{
Input: "13",
- Expected: helper.IntToPtr(13),
+ Expected: pointer.Of(13),
},
{
Input: "99",
- Expected: helper.IntToPtr(99),
+ Expected: pointer.Of(99),
},
{
Input: "ten",
@@ -935,7 +935,7 @@ func TestHTTP_VerifyHTTPSClient_AfterConfigReload(t *testing.T) {
assert.Nil(err)
resp, err := client.Do(req)
- if assert.Nil(err) {
+ if assert.NoError(err) {
resp.Body.Close()
assert.Equal(resp.StatusCode, 200)
}
@@ -979,13 +979,13 @@ func TestHTTPServer_Limits_Error(t *testing.T) {
{
tls: true,
timeout: "5s",
- limit: helper.IntToPtr(-1),
+ limit: pointer.Of(-1),
expectedErr: "http_max_conns_per_client must be >= 0",
},
{
tls: false,
timeout: "5s",
- limit: helper.IntToPtr(-1),
+ limit: pointer.Of(-1),
expectedErr: "http_max_conns_per_client must be >= 0",
},
}
@@ -1082,28 +1082,28 @@ func TestHTTPServer_Limits_OK(t *testing.T) {
{
tls: false,
timeout: "0",
- limit: helper.IntToPtr(2),
+ limit: pointer.Of(2),
assertTimeout: false,
assertLimit: true,
},
{
tls: true,
timeout: "0",
- limit: helper.IntToPtr(2),
+ limit: pointer.Of(2),
assertTimeout: false,
assertLimit: true,
},
{
tls: false,
timeout: "5s",
- limit: helper.IntToPtr(2),
+ limit: pointer.Of(2),
assertTimeout: false,
assertLimit: true,
},
{
tls: true,
timeout: "5s",
- limit: helper.IntToPtr(2),
+ limit: pointer.Of(2),
assertTimeout: true,
assertLimit: true,
},
diff --git a/command/agent/job_endpoint.go b/command/agent/job_endpoint.go
index f7a74c4f8d0..2fbd8f5d5c8 100644
--- a/command/agent/job_endpoint.go
+++ b/command/agent/job_endpoint.go
@@ -1216,13 +1216,16 @@ func ApiTaskToStructsTask(job *structs.Job, group *structs.TaskGroup,
EmbeddedTmpl: *template.EmbeddedTmpl,
ChangeMode: *template.ChangeMode,
ChangeSignal: *template.ChangeSignal,
+ ChangeScript: apiChangeScriptToStructsChangeScript(template.ChangeScript),
Splay: *template.Splay,
Perms: *template.Perms,
+ Uid: template.Uid,
+ Gid: template.Gid,
LeftDelim: *template.LeftDelim,
RightDelim: *template.RightDelim,
Envvars: *template.Envvars,
VaultGrace: *template.VaultGrace,
- Wait: ApiWaitConfigToStructsWaitConfig(template.Wait),
+ Wait: apiWaitConfigToStructsWaitConfig(template.Wait),
})
}
}
@@ -1241,16 +1244,29 @@ func ApiTaskToStructsTask(job *structs.Job, group *structs.TaskGroup,
}
}
-// ApiWaitConfigToStructsWaitConfig is a copy and type conversion between the API
+// apiWaitConfigToStructsWaitConfig is a copy and type conversion between the API
// representation of a WaitConfig from a struct representation of a WaitConfig.
-func ApiWaitConfigToStructsWaitConfig(waitConfig *api.WaitConfig) *structs.WaitConfig {
+func apiWaitConfigToStructsWaitConfig(waitConfig *api.WaitConfig) *structs.WaitConfig {
if waitConfig == nil {
return nil
}
return &structs.WaitConfig{
- Min: &*waitConfig.Min,
- Max: &*waitConfig.Max,
+ Min: waitConfig.Min,
+ Max: waitConfig.Max,
+ }
+}
+
+func apiChangeScriptToStructsChangeScript(changeScript *api.ChangeScript) *structs.ChangeScript {
+ if changeScript == nil {
+ return nil
+ }
+
+ return &structs.ChangeScript{
+ Command: *changeScript.Command,
+ Args: changeScript.Args,
+ Timeout: *changeScript.Timeout,
+ FailOnError: *changeScript.FailOnError,
}
}
@@ -1263,6 +1279,7 @@ func ApiCSIPluginConfigToStructsCSIPluginConfig(apiConfig *api.TaskCSIPluginConf
sc.ID = apiConfig.ID
sc.Type = structs.CSIPluginType(apiConfig.Type)
sc.MountDir = apiConfig.MountDir
+ sc.StagePublishBaseDir = apiConfig.StagePublishBaseDir
sc.HealthTimeout = apiConfig.HealthTimeout
return sc
}
@@ -1644,13 +1661,12 @@ func apiUpstreamsToStructs(in []*api.ConsulUpstream) []structs.ConsulUpstream {
return upstreams
}
-func apiMeshGatewayToStructs(in *api.ConsulMeshGateway) *structs.ConsulMeshGateway {
- if in == nil {
- return nil
- }
- return &structs.ConsulMeshGateway{
- Mode: in.Mode,
+func apiMeshGatewayToStructs(in *api.ConsulMeshGateway) structs.ConsulMeshGateway {
+ var gw structs.ConsulMeshGateway
+ if in != nil {
+ gw.Mode = in.Mode
}
+ return gw
}
func apiConsulExposeConfigToStructs(in *api.ConsulExposeConfig) *structs.ConsulExposeConfig {
diff --git a/command/agent/job_endpoint_test.go b/command/agent/job_endpoint_test.go
index d5d35c39cac..a0d70423e45 100644
--- a/command/agent/job_endpoint_test.go
+++ b/command/agent/job_endpoint_test.go
@@ -13,7 +13,7 @@ import (
"github.com/hashicorp/nomad/acl"
api "github.com/hashicorp/nomad/api"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
"github.com/stretchr/testify/assert"
@@ -79,7 +79,6 @@ func TestHTTP_PrefixJobsList(t *testing.T) {
"aabbbbbb-e8f7-fd38-c855-ab94ceb89706",
"aabbcccc-e8f7-fd38-c855-ab94ceb89706",
}
- ci.Parallel(t)
httpTest(t, nil, func(s *TestAgent) {
for i := 0; i < 3; i++ {
// Create the job
@@ -641,8 +640,8 @@ func TestHTTP_jobUpdate_systemScaling(t *testing.T) {
httpTest(t, nil, func(s *TestAgent) {
// Create the job
job := MockJob()
- job.Type = helper.StringToPtr("system")
- job.TaskGroups[0].Scaling = &api.ScalingPolicy{Enabled: helper.BoolToPtr(true)}
+ job.Type = pointer.Of("system")
+ job.TaskGroups[0].Scaling = &api.ScalingPolicy{Enabled: pointer.Of(true)}
args := api.JobRegisterRequest{
Job: job,
WriteRequest: api.WriteRequest{
@@ -1150,7 +1149,7 @@ func TestHTTP_Job_ScaleTaskGroup(t *testing.T) {
newCount := job.TaskGroups[0].Count + 1
scaleReq := &api.ScalingRequest{
- Count: helper.Int64ToPtr(int64(newCount)),
+ Count: pointer.Of(int64(newCount)),
Message: "testing",
Target: map[string]string{
"Job": job.ID,
@@ -2043,7 +2042,7 @@ func TestJobs_ParsingWriteRequest(t *testing.T) {
srv.agent = &Agent{config: &Config{Region: agentRegion}}
job := &api.Job{
- Region: helper.StringToPtr(tc.jobRegion),
+ Region: pointer.Of(tc.jobRegion),
Multiregion: tc.multiregion,
}
@@ -2167,7 +2166,7 @@ func TestJobs_RegionForJob(t *testing.T) {
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
job := &api.Job{
- Region: helper.StringToPtr(tc.jobRegion),
+ Region: pointer.Of(tc.jobRegion),
Multiregion: tc.multiregion,
}
requestRegion, jobRegion := regionForJob(
@@ -2361,15 +2360,15 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) {
ci.Parallel(t)
apiJob := &api.Job{
- Stop: helper.BoolToPtr(true),
- Region: helper.StringToPtr("global"),
- Namespace: helper.StringToPtr("foo"),
- ID: helper.StringToPtr("foo"),
- ParentID: helper.StringToPtr("lol"),
- Name: helper.StringToPtr("name"),
- Type: helper.StringToPtr("service"),
- Priority: helper.IntToPtr(50),
- AllAtOnce: helper.BoolToPtr(true),
+ Stop: pointer.Of(true),
+ Region: pointer.Of("global"),
+ Namespace: pointer.Of("foo"),
+ ID: pointer.Of("foo"),
+ ParentID: pointer.Of("lol"),
+ Name: pointer.Of("name"),
+ Type: pointer.Of("service"),
+ Priority: pointer.Of(50),
+ AllAtOnce: pointer.Of(true),
Datacenters: []string{"dc1", "dc2"},
Constraints: []*api.Constraint{
{
@@ -2383,23 +2382,23 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) {
LTarget: "a",
RTarget: "b",
Operand: "c",
- Weight: helper.Int8ToPtr(50),
+ Weight: pointer.Of(int8(50)),
},
},
Update: &api.UpdateStrategy{
- Stagger: helper.TimeToPtr(1 * time.Second),
- MaxParallel: helper.IntToPtr(5),
- HealthCheck: helper.StringToPtr(structs.UpdateStrategyHealthCheck_Manual),
- MinHealthyTime: helper.TimeToPtr(1 * time.Minute),
- HealthyDeadline: helper.TimeToPtr(3 * time.Minute),
- ProgressDeadline: helper.TimeToPtr(3 * time.Minute),
- AutoRevert: helper.BoolToPtr(false),
- Canary: helper.IntToPtr(1),
+ Stagger: pointer.Of(1 * time.Second),
+ MaxParallel: pointer.Of(5),
+ HealthCheck: pointer.Of(structs.UpdateStrategyHealthCheck_Manual),
+ MinHealthyTime: pointer.Of(1 * time.Minute),
+ HealthyDeadline: pointer.Of(3 * time.Minute),
+ ProgressDeadline: pointer.Of(3 * time.Minute),
+ AutoRevert: pointer.Of(false),
+ Canary: pointer.Of(1),
},
Spreads: []*api.Spread{
{
Attribute: "${meta.rack}",
- Weight: helper.Int8ToPtr(100),
+ Weight: pointer.Of(int8(100)),
SpreadTarget: []*api.SpreadTarget{
{
Value: "r1",
@@ -2409,11 +2408,11 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) {
},
},
Periodic: &api.PeriodicConfig{
- Enabled: helper.BoolToPtr(true),
- Spec: helper.StringToPtr("spec"),
- SpecType: helper.StringToPtr("cron"),
- ProhibitOverlap: helper.BoolToPtr(true),
- TimeZone: helper.StringToPtr("test zone"),
+ Enabled: pointer.Of(true),
+ Spec: pointer.Of("spec"),
+ SpecType: pointer.Of("cron"),
+ ProhibitOverlap: pointer.Of(true),
+ TimeZone: pointer.Of("test zone"),
},
ParameterizedJob: &api.ParameterizedJobConfig{
Payload: "payload",
@@ -2426,13 +2425,13 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) {
},
Multiregion: &api.Multiregion{
Strategy: &api.MultiregionStrategy{
- MaxParallel: helper.IntToPtr(2),
- OnFailure: helper.StringToPtr("fail_all"),
+ MaxParallel: pointer.Of(2),
+ OnFailure: pointer.Of("fail_all"),
},
Regions: []*api.MultiregionRegion{
{
Name: "west",
- Count: helper.IntToPtr(1),
+ Count: pointer.Of(1),
Datacenters: []string{"dc1", "dc2"},
Meta: map[string]string{"region_code": "W"},
},
@@ -2440,8 +2439,8 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) {
},
TaskGroups: []*api.TaskGroup{
{
- Name: helper.StringToPtr("group1"),
- Count: helper.IntToPtr(5),
+ Name: pointer.Of("group1"),
+ Count: pointer.Of(5),
Constraints: []*api.Constraint{
{
LTarget: "x",
@@ -2454,33 +2453,33 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) {
LTarget: "x",
RTarget: "y",
Operand: "z",
- Weight: helper.Int8ToPtr(100),
+ Weight: pointer.Of(int8(100)),
},
},
RestartPolicy: &api.RestartPolicy{
- Interval: helper.TimeToPtr(1 * time.Second),
- Attempts: helper.IntToPtr(5),
- Delay: helper.TimeToPtr(10 * time.Second),
- Mode: helper.StringToPtr("delay"),
+ Interval: pointer.Of(1 * time.Second),
+ Attempts: pointer.Of(5),
+ Delay: pointer.Of(10 * time.Second),
+ Mode: pointer.Of("delay"),
},
ReschedulePolicy: &api.ReschedulePolicy{
- Interval: helper.TimeToPtr(12 * time.Hour),
- Attempts: helper.IntToPtr(5),
- DelayFunction: helper.StringToPtr("constant"),
- Delay: helper.TimeToPtr(30 * time.Second),
- Unlimited: helper.BoolToPtr(true),
- MaxDelay: helper.TimeToPtr(20 * time.Minute),
+ Interval: pointer.Of(12 * time.Hour),
+ Attempts: pointer.Of(5),
+ DelayFunction: pointer.Of("constant"),
+ Delay: pointer.Of(30 * time.Second),
+ Unlimited: pointer.Of(true),
+ MaxDelay: pointer.Of(20 * time.Minute),
},
Migrate: &api.MigrateStrategy{
- MaxParallel: helper.IntToPtr(12),
- HealthCheck: helper.StringToPtr("task_events"),
- MinHealthyTime: helper.TimeToPtr(12 * time.Hour),
- HealthyDeadline: helper.TimeToPtr(12 * time.Hour),
+ MaxParallel: pointer.Of(12),
+ HealthCheck: pointer.Of("task_events"),
+ MinHealthyTime: pointer.Of(12 * time.Hour),
+ HealthyDeadline: pointer.Of(12 * time.Hour),
},
Spreads: []*api.Spread{
{
Attribute: "${node.datacenter}",
- Weight: helper.Int8ToPtr(100),
+ Weight: pointer.Of(int8(100)),
SpreadTarget: []*api.SpreadTarget{
{
Value: "dc1",
@@ -2490,16 +2489,16 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) {
},
},
EphemeralDisk: &api.EphemeralDisk{
- SizeMB: helper.IntToPtr(100),
- Sticky: helper.BoolToPtr(true),
- Migrate: helper.BoolToPtr(true),
+ SizeMB: pointer.Of(100),
+ Sticky: pointer.Of(true),
+ Migrate: pointer.Of(true),
},
Update: &api.UpdateStrategy{
- HealthCheck: helper.StringToPtr(structs.UpdateStrategyHealthCheck_Checks),
- MinHealthyTime: helper.TimeToPtr(2 * time.Minute),
- HealthyDeadline: helper.TimeToPtr(5 * time.Minute),
- ProgressDeadline: helper.TimeToPtr(5 * time.Minute),
- AutoRevert: helper.BoolToPtr(true),
+ HealthCheck: pointer.Of(structs.UpdateStrategyHealthCheck_Checks),
+ MinHealthyTime: pointer.Of(2 * time.Minute),
+ HealthyDeadline: pointer.Of(5 * time.Minute),
+ ProgressDeadline: pointer.Of(5 * time.Minute),
+ AutoRevert: pointer.Of(true),
},
Meta: map[string]string{
"key": "value",
@@ -2523,7 +2522,7 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) {
},
CheckRestart: &api.CheckRestart{
Limit: 4,
- Grace: helper.TimeToPtr(11 * time.Second),
+ Grace: pointer.Of(11 * time.Second),
},
Checks: []api.ServiceCheck{
{
@@ -2561,7 +2560,7 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) {
},
},
},
- MaxClientDisconnect: helper.TimeToPtr(30 * time.Second),
+ MaxClientDisconnect: pointer.Of(30 * time.Second),
Tasks: []*api.Task{
{
Name: "task1",
@@ -2586,22 +2585,22 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) {
LTarget: "a",
RTarget: "b",
Operand: "c",
- Weight: helper.Int8ToPtr(50),
+ Weight: pointer.Of(int8(50)),
},
},
VolumeMounts: []*api.VolumeMount{
{
- Volume: helper.StringToPtr("vol"),
- Destination: helper.StringToPtr("dest"),
- ReadOnly: helper.BoolToPtr(false),
- PropagationMode: helper.StringToPtr("a"),
+ Volume: pointer.Of("vol"),
+ Destination: pointer.Of("dest"),
+ ReadOnly: pointer.Of(false),
+ PropagationMode: pointer.Of("a"),
},
},
RestartPolicy: &api.RestartPolicy{
- Interval: helper.TimeToPtr(2 * time.Second),
- Attempts: helper.IntToPtr(10),
- Delay: helper.TimeToPtr(20 * time.Second),
- Mode: helper.StringToPtr("delay"),
+ Interval: pointer.Of(2 * time.Second),
+ Attempts: pointer.Of(10),
+ Delay: pointer.Of(20 * time.Second),
+ Mode: pointer.Of("delay"),
},
Services: []*api.Service{
{
@@ -2616,7 +2615,7 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) {
},
CheckRestart: &api.CheckRestart{
Limit: 4,
- Grace: helper.TimeToPtr(11 * time.Second),
+ Grace: pointer.Of(11 * time.Second),
},
Checks: []api.ServiceCheck{
{
@@ -2651,12 +2650,12 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) {
},
},
Resources: &api.Resources{
- CPU: helper.IntToPtr(100),
- MemoryMB: helper.IntToPtr(10),
+ CPU: pointer.Of(100),
+ MemoryMB: pointer.Of(10),
Networks: []*api.NetworkResource{
{
IP: "10.10.11.1",
- MBits: helper.IntToPtr(10),
+ MBits: pointer.Of(10),
Hostname: "foobar",
ReservedPorts: []api.Port{
{
@@ -2675,7 +2674,7 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) {
Devices: []*api.RequestedDevice{
{
Name: "nvidia/gpu",
- Count: helper.Uint64ToPtr(4),
+ Count: pointer.Of(uint64(4)),
Constraints: []*api.Constraint{
{
LTarget: "x",
@@ -2688,7 +2687,7 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) {
LTarget: "a",
RTarget: "b",
Operand: "c",
- Weight: helper.Int8ToPtr(50),
+ Weight: pointer.Of(int8(50)),
},
},
},
@@ -2701,44 +2700,52 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) {
Meta: map[string]string{
"lol": "code",
},
- KillTimeout: helper.TimeToPtr(10 * time.Second),
+ KillTimeout: pointer.Of(10 * time.Second),
KillSignal: "SIGQUIT",
LogConfig: &api.LogConfig{
- MaxFiles: helper.IntToPtr(10),
- MaxFileSizeMB: helper.IntToPtr(100),
+ MaxFiles: pointer.Of(10),
+ MaxFileSizeMB: pointer.Of(100),
},
Artifacts: []*api.TaskArtifact{
{
- GetterSource: helper.StringToPtr("source"),
+ GetterSource: pointer.Of("source"),
GetterOptions: map[string]string{
"a": "b",
},
- GetterMode: helper.StringToPtr("dir"),
- RelativeDest: helper.StringToPtr("dest"),
+ GetterMode: pointer.Of("dir"),
+ RelativeDest: pointer.Of("dest"),
},
},
Vault: &api.Vault{
- Namespace: helper.StringToPtr("ns1"),
+ Namespace: pointer.Of("ns1"),
Policies: []string{"a", "b", "c"},
- Env: helper.BoolToPtr(true),
- ChangeMode: helper.StringToPtr("c"),
- ChangeSignal: helper.StringToPtr("sighup"),
+ Env: pointer.Of(true),
+ ChangeMode: pointer.Of("c"),
+ ChangeSignal: pointer.Of("sighup"),
},
Templates: []*api.Template{
{
- SourcePath: helper.StringToPtr("source"),
- DestPath: helper.StringToPtr("dest"),
- EmbeddedTmpl: helper.StringToPtr("embedded"),
- ChangeMode: helper.StringToPtr("change"),
- ChangeSignal: helper.StringToPtr("signal"),
- Splay: helper.TimeToPtr(1 * time.Minute),
- Perms: helper.StringToPtr("666"),
- LeftDelim: helper.StringToPtr("abc"),
- RightDelim: helper.StringToPtr("def"),
- Envvars: helper.BoolToPtr(true),
+ SourcePath: pointer.Of("source"),
+ DestPath: pointer.Of("dest"),
+ EmbeddedTmpl: pointer.Of("embedded"),
+ ChangeMode: pointer.Of("change"),
+ ChangeSignal: pointer.Of("signal"),
+ ChangeScript: &api.ChangeScript{
+ Command: pointer.Of("/bin/foo"),
+ Args: []string{"-h"},
+ Timeout: pointer.Of(5 * time.Second),
+ FailOnError: pointer.Of(false),
+ },
+ Splay: pointer.Of(1 * time.Minute),
+ Perms: pointer.Of("666"),
+ Uid: pointer.Of(1000),
+ Gid: pointer.Of(1000),
+ LeftDelim: pointer.Of("abc"),
+ RightDelim: pointer.Of("def"),
+ Envvars: pointer.Of(true),
Wait: &api.WaitConfig{
- Min: helper.TimeToPtr(5 * time.Second),
- Max: helper.TimeToPtr(10 * time.Second),
+ Min: pointer.Of(5 * time.Second),
+ Max: pointer.Of(10 * time.Second),
},
},
},
@@ -2749,15 +2756,15 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) {
},
},
},
- ConsulToken: helper.StringToPtr("abc123"),
- VaultToken: helper.StringToPtr("def456"),
- VaultNamespace: helper.StringToPtr("ghi789"),
- Status: helper.StringToPtr("status"),
- StatusDescription: helper.StringToPtr("status_desc"),
- Version: helper.Uint64ToPtr(10),
- CreateIndex: helper.Uint64ToPtr(1),
- ModifyIndex: helper.Uint64ToPtr(3),
- JobModifyIndex: helper.Uint64ToPtr(5),
+ ConsulToken: pointer.Of("abc123"),
+ VaultToken: pointer.Of("def456"),
+ VaultNamespace: pointer.Of("ghi789"),
+ Status: pointer.Of("status"),
+ StatusDescription: pointer.Of("status_desc"),
+ Version: pointer.Of(uint64(10)),
+ CreateIndex: pointer.Of(uint64(1)),
+ ModifyIndex: pointer.Of(uint64(3)),
+ JobModifyIndex: pointer.Of(uint64(5)),
}
expected := &structs.Job{
@@ -2960,7 +2967,7 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) {
},
},
},
- MaxClientDisconnect: helper.TimeToPtr(30 * time.Second),
+ MaxClientDisconnect: pointer.Of(30 * time.Second),
Tasks: []*structs.Task{
{
Name: "task1",
@@ -3136,14 +3143,22 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) {
EmbeddedTmpl: "embedded",
ChangeMode: "change",
ChangeSignal: "SIGNAL",
- Splay: 1 * time.Minute,
- Perms: "666",
- LeftDelim: "abc",
- RightDelim: "def",
- Envvars: true,
+ ChangeScript: &structs.ChangeScript{
+ Command: "/bin/foo",
+ Args: []string{"-h"},
+ Timeout: 5 * time.Second,
+ FailOnError: false,
+ },
+ Splay: 1 * time.Minute,
+ Perms: "666",
+ Uid: pointer.Of(1000),
+ Gid: pointer.Of(1000),
+ LeftDelim: "abc",
+ RightDelim: "def",
+ Envvars: true,
Wait: &structs.WaitConfig{
- Min: helper.TimeToPtr(5 * time.Second),
- Max: helper.TimeToPtr(10 * time.Second),
+ Min: pointer.Of(5 * time.Second),
+ Max: pointer.Of(10 * time.Second),
},
},
},
@@ -3164,15 +3179,15 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) {
require.Equal(t, expected, structsJob)
systemAPIJob := &api.Job{
- Stop: helper.BoolToPtr(true),
- Region: helper.StringToPtr("global"),
- Namespace: helper.StringToPtr("foo"),
- ID: helper.StringToPtr("foo"),
- ParentID: helper.StringToPtr("lol"),
- Name: helper.StringToPtr("name"),
- Type: helper.StringToPtr("system"),
- Priority: helper.IntToPtr(50),
- AllAtOnce: helper.BoolToPtr(true),
+ Stop: pointer.Of(true),
+ Region: pointer.Of("global"),
+ Namespace: pointer.Of("foo"),
+ ID: pointer.Of("foo"),
+ ParentID: pointer.Of("lol"),
+ Name: pointer.Of("name"),
+ Type: pointer.Of("system"),
+ Priority: pointer.Of(50),
+ AllAtOnce: pointer.Of(true),
Datacenters: []string{"dc1", "dc2"},
Constraints: []*api.Constraint{
{
@@ -3183,8 +3198,8 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) {
},
TaskGroups: []*api.TaskGroup{
{
- Name: helper.StringToPtr("group1"),
- Count: helper.IntToPtr(5),
+ Name: pointer.Of("group1"),
+ Count: pointer.Of(5),
Constraints: []*api.Constraint{
{
LTarget: "x",
@@ -3193,15 +3208,15 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) {
},
},
RestartPolicy: &api.RestartPolicy{
- Interval: helper.TimeToPtr(1 * time.Second),
- Attempts: helper.IntToPtr(5),
- Delay: helper.TimeToPtr(10 * time.Second),
- Mode: helper.StringToPtr("delay"),
+ Interval: pointer.Of(1 * time.Second),
+ Attempts: pointer.Of(5),
+ Delay: pointer.Of(10 * time.Second),
+ Mode: pointer.Of("delay"),
},
EphemeralDisk: &api.EphemeralDisk{
- SizeMB: helper.IntToPtr(100),
- Sticky: helper.BoolToPtr(true),
- Migrate: helper.BoolToPtr(true),
+ SizeMB: pointer.Of(100),
+ Sticky: pointer.Of(true),
+ Migrate: pointer.Of(true),
},
Meta: map[string]string{
"key": "value",
@@ -3229,12 +3244,12 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) {
},
},
Resources: &api.Resources{
- CPU: helper.IntToPtr(100),
- MemoryMB: helper.IntToPtr(10),
+ CPU: pointer.Of(100),
+ MemoryMB: pointer.Of(10),
Networks: []*api.NetworkResource{
{
IP: "10.10.11.1",
- MBits: helper.IntToPtr(10),
+ MBits: pointer.Of(10),
ReservedPorts: []api.Port{
{
Label: "http",
@@ -3253,19 +3268,19 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) {
Meta: map[string]string{
"lol": "code",
},
- KillTimeout: helper.TimeToPtr(10 * time.Second),
+ KillTimeout: pointer.Of(10 * time.Second),
KillSignal: "SIGQUIT",
LogConfig: &api.LogConfig{
- MaxFiles: helper.IntToPtr(10),
- MaxFileSizeMB: helper.IntToPtr(100),
+ MaxFiles: pointer.Of(10),
+ MaxFileSizeMB: pointer.Of(100),
},
Artifacts: []*api.TaskArtifact{
{
- GetterSource: helper.StringToPtr("source"),
+ GetterSource: pointer.Of("source"),
GetterOptions: map[string]string{"a": "b"},
GetterHeaders: map[string]string{"User-Agent": "nomad"},
- GetterMode: helper.StringToPtr("dir"),
- RelativeDest: helper.StringToPtr("dest"),
+ GetterMode: pointer.Of("dir"),
+ RelativeDest: pointer.Of("dest"),
},
},
DispatchPayload: &api.DispatchPayloadConfig{
@@ -3275,12 +3290,12 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) {
},
},
},
- Status: helper.StringToPtr("status"),
- StatusDescription: helper.StringToPtr("status_desc"),
- Version: helper.Uint64ToPtr(10),
- CreateIndex: helper.Uint64ToPtr(1),
- ModifyIndex: helper.Uint64ToPtr(3),
- JobModifyIndex: helper.Uint64ToPtr(5),
+ Status: pointer.Of("status"),
+ StatusDescription: pointer.Of("status_desc"),
+ Version: pointer.Of(uint64(10)),
+ CreateIndex: pointer.Of(uint64(1)),
+ ModifyIndex: pointer.Of(uint64(3)),
+ JobModifyIndex: pointer.Of(uint64(5)),
}
expectedSystemJob := &structs.Job{
@@ -3411,26 +3426,26 @@ func TestJobs_ApiJobToStructsJobUpdate(t *testing.T) {
apiJob := &api.Job{
Update: &api.UpdateStrategy{
- Stagger: helper.TimeToPtr(1 * time.Second),
- MaxParallel: helper.IntToPtr(5),
- HealthCheck: helper.StringToPtr(structs.UpdateStrategyHealthCheck_Manual),
- MinHealthyTime: helper.TimeToPtr(1 * time.Minute),
- HealthyDeadline: helper.TimeToPtr(3 * time.Minute),
- ProgressDeadline: helper.TimeToPtr(3 * time.Minute),
- AutoRevert: helper.BoolToPtr(false),
+ Stagger: pointer.Of(1 * time.Second),
+ MaxParallel: pointer.Of(5),
+ HealthCheck: pointer.Of(structs.UpdateStrategyHealthCheck_Manual),
+ MinHealthyTime: pointer.Of(1 * time.Minute),
+ HealthyDeadline: pointer.Of(3 * time.Minute),
+ ProgressDeadline: pointer.Of(3 * time.Minute),
+ AutoRevert: pointer.Of(false),
AutoPromote: nil,
- Canary: helper.IntToPtr(1),
+ Canary: pointer.Of(1),
},
TaskGroups: []*api.TaskGroup{
{
Update: &api.UpdateStrategy{
- Canary: helper.IntToPtr(2),
- AutoRevert: helper.BoolToPtr(true),
+ Canary: pointer.Of(2),
+ AutoRevert: pointer.Of(true),
},
}, {
Update: &api.UpdateStrategy{
- Canary: helper.IntToPtr(3),
- AutoPromote: helper.BoolToPtr(true),
+ Canary: pointer.Of(3),
+ AutoPromote: pointer.Of(true),
},
},
},
@@ -3482,6 +3497,7 @@ func TestJobs_ApiJobToStructsJobUpdate(t *testing.T) {
}
// TestJobs_Matching_Resources asserts:
+//
// api.{Default,Min}Resources == structs.{Default,Min}Resources
//
// While this is an odd place to test that, this is where both are imported,
@@ -3505,16 +3521,16 @@ func TestHTTP_JobValidate_SystemMigrate(t *testing.T) {
httpTest(t, nil, func(s *TestAgent) {
// Create the job
job := &api.Job{
- Region: helper.StringToPtr("global"),
+ Region: pointer.Of("global"),
Datacenters: []string{"dc1"},
- ID: helper.StringToPtr("systemmigrate"),
- Name: helper.StringToPtr("systemmigrate"),
+ ID: pointer.Of("systemmigrate"),
+ Name: pointer.Of("systemmigrate"),
TaskGroups: []*api.TaskGroup{
- {Name: helper.StringToPtr("web")},
+ {Name: pointer.Of("web")},
},
// System job...
- Type: helper.StringToPtr("system"),
+ Type: pointer.Of("system"),
// ...with an empty migrate stanza
Migrate: &api.MigrateStrategy{},
@@ -3544,7 +3560,7 @@ func TestHTTP_JobValidate_SystemMigrate(t *testing.T) {
func TestConversion_dereferenceInt(t *testing.T) {
ci.Parallel(t)
require.Equal(t, 0, dereferenceInt(nil))
- require.Equal(t, 42, dereferenceInt(helper.IntToPtr(42)))
+ require.Equal(t, 42, dereferenceInt(pointer.Of(42)))
}
func TestConversion_apiLogConfigToStructs(t *testing.T) {
@@ -3554,8 +3570,8 @@ func TestConversion_apiLogConfigToStructs(t *testing.T) {
MaxFiles: 2,
MaxFileSizeMB: 8,
}, apiLogConfigToStructs(&api.LogConfig{
- MaxFiles: helper.IntToPtr(2),
- MaxFileSizeMB: helper.IntToPtr(8),
+ MaxFiles: pointer.Of(2),
+ MaxFileSizeMB: pointer.Of(8),
}))
}
@@ -3575,8 +3591,8 @@ func TestConversion_apiResourcesToStructs(t *testing.T) {
{
"plain",
&api.Resources{
- CPU: helper.IntToPtr(100),
- MemoryMB: helper.IntToPtr(200),
+ CPU: pointer.Of(100),
+ MemoryMB: pointer.Of(200),
},
&structs.Resources{
CPU: 100,
@@ -3586,9 +3602,9 @@ func TestConversion_apiResourcesToStructs(t *testing.T) {
{
"with memory max",
&api.Resources{
- CPU: helper.IntToPtr(100),
- MemoryMB: helper.IntToPtr(200),
- MemoryMaxMB: helper.IntToPtr(300),
+ CPU: pointer.Of(100),
+ MemoryMB: pointer.Of(200),
+ MemoryMaxMB: pointer.Of(300),
},
&structs.Resources{
CPU: 100,
@@ -3639,14 +3655,14 @@ func TestConversion_apiConnectSidecarTaskToStructs(t *testing.T) {
Config: config,
Env: env,
Resources: &api.Resources{
- CPU: helper.IntToPtr(1),
- MemoryMB: helper.IntToPtr(128),
+ CPU: pointer.Of(1),
+ MemoryMB: pointer.Of(128),
},
Meta: meta,
KillTimeout: &timeout,
LogConfig: &api.LogConfig{
- MaxFiles: helper.IntToPtr(2),
- MaxFileSizeMB: helper.IntToPtr(8),
+ MaxFiles: pointer.Of(2),
+ MaxFileSizeMB: pointer.Of(8),
},
ShutdownDelay: &delay,
KillSignal: "SIGTERM",
@@ -3690,7 +3706,7 @@ func TestConversion_apiUpstreamsToStructs(t *testing.T) {
LocalBindPort: 8000,
Datacenter: "dc2",
LocalBindAddress: "127.0.0.2",
- MeshGateway: &structs.ConsulMeshGateway{Mode: "local"},
+ MeshGateway: structs.ConsulMeshGateway{Mode: "local"},
}}, apiUpstreamsToStructs([]*api.ConsulUpstream{{
DestinationName: "upstream",
DestinationNamespace: "ns2",
@@ -3703,8 +3719,8 @@ func TestConversion_apiUpstreamsToStructs(t *testing.T) {
func TestConversion_apiConsulMeshGatewayToStructs(t *testing.T) {
ci.Parallel(t)
- require.Nil(t, apiMeshGatewayToStructs(nil))
- require.Equal(t, &structs.ConsulMeshGateway{Mode: "remote"},
+ require.Equal(t, structs.ConsulMeshGateway{}, apiMeshGatewayToStructs(nil))
+ require.Equal(t, structs.ConsulMeshGateway{Mode: "remote"},
apiMeshGatewayToStructs(&api.ConsulMeshGateway{Mode: "remote"}))
}
@@ -3715,7 +3731,7 @@ func TestConversion_apiConnectSidecarServiceProxyToStructs(t *testing.T) {
require.Equal(t, &structs.ConsulProxy{
LocalServiceAddress: "192.168.30.1",
LocalServicePort: 9000,
- Config: nil,
+ Config: map[string]any{},
Upstreams: []structs.ConsulUpstream{{
DestinationName: "upstream",
}},
@@ -3778,7 +3794,7 @@ func TestConversion_ApiConsulConnectToStructs(t *testing.T) {
require.Equal(t, &structs.ConsulConnect{
Gateway: &structs.ConsulGateway{
Proxy: &structs.ConsulGatewayProxy{
- ConnectTimeout: helper.TimeToPtr(3 * time.Second),
+ ConnectTimeout: pointer.Of(3 * time.Second),
EnvoyGatewayBindTaggedAddresses: true,
EnvoyGatewayBindAddresses: map[string]*structs.ConsulGatewayBindAddress{
"service": {
@@ -3795,7 +3811,7 @@ func TestConversion_ApiConsulConnectToStructs(t *testing.T) {
}, ApiConsulConnectToStructs(&api.ConsulConnect{
Gateway: &api.ConsulGateway{
Proxy: &api.ConsulGatewayProxy{
- ConnectTimeout: helper.TimeToPtr(3 * time.Second),
+ ConnectTimeout: pointer.Of(3 * time.Second),
EnvoyGatewayBindTaggedAddresses: true,
EnvoyGatewayBindAddresses: map[string]*api.ConsulGatewayBindAddress{
"service": {
diff --git a/command/agent/search_endpoint_test.go b/command/agent/search_endpoint_test.go
index f538552437e..e9029de7f38 100644
--- a/command/agent/search_endpoint_test.go
+++ b/command/agent/search_endpoint_test.go
@@ -634,8 +634,11 @@ func TestHTTP_PrefixSearch_SecureVariables(t *testing.T) {
state := s.Agent.server.State()
sv.Path = testPath
- err := state.UpsertSecureVariables(structs.MsgTypeTestSetup, 8000, []*structs.SecureVariableEncrypted{sv})
- require.NoError(t, err)
+ setResp := state.SVESet(8000, &structs.SVApplyStateRequest{
+ Op: structs.SVOpSet,
+ Var: sv,
+ })
+ require.NoError(t, setResp.Error)
data := structs.SearchRequest{Prefix: testPathPrefix, Context: structs.SecureVariables}
req, err := http.NewRequest("POST", "/v1/search", encodeReq(data))
@@ -664,8 +667,11 @@ func TestHTTP_FuzzySearch_SecureVariables(t *testing.T) {
state := s.Agent.server.State()
sv := mock.SecureVariableEncrypted()
sv.Path = testPath
- err := state.UpsertSecureVariables(structs.MsgTypeTestSetup, 8000, []*structs.SecureVariableEncrypted{sv})
- require.NoError(t, err)
+ setResp := state.SVESet(8000, &structs.SVApplyStateRequest{
+ Op: structs.SVOpSet,
+ Var: sv,
+ })
+ require.NoError(t, setResp.Error)
data := structs.FuzzySearchRequest{Text: testPathText, Context: structs.SecureVariables}
req, err := http.NewRequest("POST", "/v1/search/", encodeReq(data))
@@ -701,9 +707,17 @@ func TestHTTP_PrefixSearch_SecureVariables_ACL(t *testing.T) {
sv2 := sv1.Copy()
sv2.Namespace = ns.Name
- _ = state.UpsertNamespaces(7000, []*structs.Namespace{ns})
- _ = state.UpsertSecureVariables(structs.MsgTypeTestSetup, 8000, []*structs.SecureVariableEncrypted{sv1})
- _ = state.UpsertSecureVariables(structs.MsgTypeTestSetup, 8001, []*structs.SecureVariableEncrypted{&sv2})
+ require.NoError(t, state.UpsertNamespaces(7000, []*structs.Namespace{ns}))
+ setResp := state.SVESet(8000, &structs.SVApplyStateRequest{
+ Op: structs.SVOpSet,
+ Var: sv1,
+ })
+ require.NoError(t, setResp.Error)
+ setResp = state.SVESet(8001, &structs.SVApplyStateRequest{
+ Op: structs.SVOpSet,
+ Var: &sv2,
+ })
+ require.NoError(t, setResp.Error)
rootToken := s.RootToken
@@ -807,9 +821,17 @@ func TestHTTP_FuzzySearch_SecureVariables_ACL(t *testing.T) {
sv2 := sv1.Copy()
sv2.Namespace = ns.Name
- _ = state.UpsertNamespaces(7000, []*structs.Namespace{mock.Namespace()})
- _ = state.UpsertSecureVariables(structs.MsgTypeTestSetup, 8000, []*structs.SecureVariableEncrypted{sv1})
- _ = state.UpsertSecureVariables(structs.MsgTypeTestSetup, 8001, []*structs.SecureVariableEncrypted{&sv2})
+ require.NoError(t, state.UpsertNamespaces(7000, []*structs.Namespace{ns}))
+ setResp := state.SVESet(8000, &structs.SVApplyStateRequest{
+ Op: structs.SVOpSet,
+ Var: sv1,
+ })
+ require.NoError(t, setResp.Error)
+ setResp = state.SVESet(8001, &structs.SVApplyStateRequest{
+ Op: structs.SVOpSet,
+ Var: &sv2,
+ })
+ require.NoError(t, setResp.Error)
rootToken := s.RootToken
defNSToken := mock.CreatePolicyAndToken(t, state, 8002, "default", mock.NamespacePolicy("default", "read", nil))
diff --git a/command/agent/secure_variable_endpoint.go b/command/agent/secure_variable_endpoint.go
index 1c1f06fa980..5bfd0ea3d6a 100644
--- a/command/agent/secure_variable_endpoint.go
+++ b/command/agent/secure_variable_endpoint.go
@@ -83,18 +83,22 @@ func (s *HTTPServer) secureVariableUpsert(resp http.ResponseWriter, req *http.Re
SecureVariable.Path = path
- // This function always makes an upsert request with length of 1, which is
- // an important proviso for when we check for conflicts and return them
- args := structs.SecureVariablesUpsertRequest{
- Data: []*structs.SecureVariableDecrypted{&SecureVariable},
+ args := structs.SecureVariablesApplyRequest{
+ Op: structs.SVOpSet,
+ Var: &SecureVariable,
}
+
s.parseWriteRequest(req, &args.WriteRequest)
- if err := parseCAS(req, &args); err != nil {
+
+ if isCas, checkIndex, err := parseCAS(req); err != nil {
return nil, err
+ } else if isCas {
+ args.Op = structs.SVOpCAS
+ args.Var.ModifyIndex = checkIndex
}
- var out structs.SecureVariablesUpsertResponse
- if err := s.agent.RPC(structs.SecureVariablesUpsertRPCMethod, &args, &out); err != nil {
+ var out structs.SecureVariablesApplyResponse
+ if err := s.agent.RPC(structs.SecureVariablesApplyRPCMethod, &args, &out); err != nil {
// This handles the cases where there is an error in the CAS checking
// function that renders it unable to return the conflicting variable
@@ -109,13 +113,10 @@ func (s *HTTPServer) secureVariableUpsert(resp http.ResponseWriter, req *http.Re
return nil, err
}
- // As noted earlier, the upsert request generated by this endpoint always
- // has length of 1, so we expect a non-Nil Conflicts slice to have len(1).
- // We then extract the conflict value at index 0
- if len(out.Conflicts) == 1 {
- setIndex(resp, out.Conflicts[0].ModifyIndex)
+ if out.Conflict != nil {
+ setIndex(resp, out.Conflict.ModifyIndex)
resp.WriteHeader(http.StatusConflict)
- return out.Conflicts[0], nil
+ return out.Conflict, nil
}
// Finally, we know that this is a success response, send it to the caller
@@ -126,16 +127,26 @@ func (s *HTTPServer) secureVariableUpsert(resp http.ResponseWriter, req *http.Re
func (s *HTTPServer) secureVariableDelete(resp http.ResponseWriter, req *http.Request,
path string) (interface{}, error) {
- args := structs.SecureVariablesDeleteRequest{
- Path: path,
+ args := structs.SecureVariablesApplyRequest{
+ Op: structs.SVOpDelete,
+ Var: &structs.SecureVariableDecrypted{
+ SecureVariableMetadata: structs.SecureVariableMetadata{
+ Path: path,
+ },
+ },
}
+
s.parseWriteRequest(req, &args.WriteRequest)
- if err := parseCAS(req, &args); err != nil {
+
+ if isCas, checkIndex, err := parseCAS(req); err != nil {
return nil, err
+ } else if isCas {
+ args.Op = structs.SVOpDeleteCAS
+ args.Var.ModifyIndex = checkIndex
}
- var out structs.SecureVariablesDeleteResponse
- if err := s.agent.RPC(structs.SecureVariablesDeleteRPCMethod, &args, &out); err != nil {
+ var out structs.SecureVariablesApplyResponse
+ if err := s.agent.RPC(structs.SecureVariablesApplyRPCMethod, &args, &out); err != nil {
// This handles the cases where there is an error in the CAS checking
// function that renders it unable to return the conflicting variable
@@ -162,15 +173,15 @@ func (s *HTTPServer) secureVariableDelete(resp http.ResponseWriter, req *http.Re
return nil, nil
}
-func parseCAS(req *http.Request, rpc CheckIndexSetter) error {
+func parseCAS(req *http.Request) (bool, uint64, error) {
if cq := req.URL.Query().Get("cas"); cq != "" {
ci, err := strconv.ParseUint(cq, 10, 64)
if err != nil {
- return CodedError(http.StatusBadRequest, fmt.Sprintf("can not parse cas: %v", err))
+ return true, 0, CodedError(http.StatusBadRequest, fmt.Sprintf("can not parse cas: %v", err))
}
- rpc.SetCheckIndex(ci)
+ return true, ci, nil
}
- return nil
+ return false, 0, nil
}
type CheckIndexSetter interface {
diff --git a/command/agent/secure_variable_endpoint_test.go b/command/agent/secure_variable_endpoint_test.go
index 419fb136d76..407bd7bcfac 100644
--- a/command/agent/secure_variable_endpoint_test.go
+++ b/command/agent/secure_variable_endpoint_test.go
@@ -307,7 +307,7 @@ func TestHTTP_SecureVariables(t *testing.T) {
// Make the HTTP request
{
buf := encodeReq(&svU)
- req, err := http.NewRequest("PUT", "/v1/var/"+svU.Path+"?cas=0", buf)
+ req, err := http.NewRequest("PUT", "/v1/var/"+svU.Path+"?cas=1", buf)
require.NoError(t, err)
respW := httptest.NewRecorder()
@@ -389,7 +389,7 @@ func TestHTTP_SecureVariables(t *testing.T) {
// Make the HTTP request
{
- req, err := http.NewRequest("DELETE", "/v1/var/"+sv.Path+"?cas=0", nil)
+ req, err := http.NewRequest("DELETE", "/v1/var/"+sv.Path+"?cas=1", nil)
require.NoError(t, err)
respW := httptest.NewRecorder()
@@ -480,12 +480,15 @@ func rpcReadSV(s *TestAgent, ns, p string) (*structs.SecureVariableDecrypted, er
// rpcWriteSV lets this test write a secure variable using the RPC endpoint
func rpcWriteSV(s *TestAgent, sv *structs.SecureVariableDecrypted) error {
- args := structs.SecureVariablesUpsertRequest{
- Data: []*structs.SecureVariableDecrypted{sv},
+
+ args := structs.SecureVariablesApplyRequest{
+ Op: structs.SVOpSet,
+ Var: sv,
WriteRequest: structs.WriteRequest{Namespace: sv.Namespace, Region: "global"},
}
- var resp structs.SecureVariablesUpsertResponse
- err := s.Agent.RPC(structs.SecureVariablesUpsertRPCMethod, &args, &resp)
+
+ var resp structs.SecureVariablesApplyResponse
+ err := s.Agent.RPC(structs.SecureVariablesApplyRPCMethod, &args, &resp)
if err != nil {
return err
}
@@ -515,17 +518,20 @@ func rpcResetSV(s *TestAgent) {
err := s.Agent.RPC(structs.SecureVariablesListRPCMethod, &lArgs, &lResp)
require.NoError(s.T, err)
- var dArgs structs.SecureVariablesDeleteRequest
- var dResp structs.SecureVariablesDeleteResponse
+ dArgs := structs.SecureVariablesApplyRequest{
+ Op: structs.SVOpDelete,
+ Var: &structs.SecureVariableDecrypted{},
+ WriteRequest: structs.WriteRequest{
+ Region: "global",
+ },
+ }
+
+ var dResp structs.SecureVariablesApplyResponse
+
for _, v := range lResp.Data {
- dArgs = structs.SecureVariablesDeleteRequest{
- Path: v.Path,
- WriteRequest: structs.WriteRequest{
- Namespace: v.Namespace,
- Region: "global",
- },
- }
- err := s.Agent.RPC(structs.SecureVariablesDeleteRPCMethod, &dArgs, &dResp)
+ dArgs.Var.Path = v.Path
+ dArgs.Var.Namespace = v.Namespace
+ err := s.Agent.RPC(structs.SecureVariablesApplyRPCMethod, &dArgs, &dResp)
require.NoError(s.T, err)
}
diff --git a/command/agent/test-resources/client_with_template.hcl b/command/agent/test-resources/client_with_template.hcl
index f094cda437e..ff310f22f8b 100644
--- a/command/agent/test-resources/client_with_template.hcl
+++ b/command/agent/test-resources/client_with_template.hcl
@@ -26,6 +26,12 @@ client {
backoff = "15s"
max_backoff = "20s"
}
+
+ nomad_retry {
+ attempts = 15
+ backoff = "20s"
+ max_backoff = "25s"
+ }
}
}
diff --git a/command/agent/testingutils_test.go b/command/agent/testingutils_test.go
index e553028cf0a..152effae365 100644
--- a/command/agent/testingutils_test.go
+++ b/command/agent/testingutils_test.go
@@ -4,18 +4,18 @@ import (
"time"
"github.com/hashicorp/nomad/api"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/uuid"
)
func MockJob() *api.Job {
job := &api.Job{
- Region: helper.StringToPtr("global"),
- ID: helper.StringToPtr(uuid.Generate()),
- Name: helper.StringToPtr("my-job"),
- Type: helper.StringToPtr("service"),
- Priority: helper.IntToPtr(50),
- AllAtOnce: helper.BoolToPtr(false),
+ Region: pointer.Of("global"),
+ ID: pointer.Of(uuid.Generate()),
+ Name: pointer.Of("my-job"),
+ Type: pointer.Of("service"),
+ Priority: pointer.Of(50),
+ AllAtOnce: pointer.Of(false),
Datacenters: []string{"dc1"},
Constraints: []*api.Constraint{
{
@@ -26,16 +26,16 @@ func MockJob() *api.Job {
},
TaskGroups: []*api.TaskGroup{
{
- Name: helper.StringToPtr("web"),
- Count: helper.IntToPtr(10),
+ Name: pointer.Of("web"),
+ Count: pointer.Of(10),
EphemeralDisk: &api.EphemeralDisk{
- SizeMB: helper.IntToPtr(150),
+ SizeMB: pointer.Of(150),
},
RestartPolicy: &api.RestartPolicy{
- Attempts: helper.IntToPtr(3),
- Interval: helper.TimeToPtr(10 * time.Minute),
- Delay: helper.TimeToPtr(1 * time.Minute),
- Mode: helper.StringToPtr("delay"),
+ Attempts: pointer.Of(3),
+ Interval: pointer.Of(10 * time.Minute),
+ Delay: pointer.Of(1 * time.Minute),
+ Mode: pointer.Of("delay"),
},
Networks: []*api.NetworkResource{
{
@@ -76,8 +76,8 @@ func MockJob() *api.Job {
},
LogConfig: api.DefaultLogConfig(),
Resources: &api.Resources{
- CPU: helper.IntToPtr(500),
- MemoryMB: helper.IntToPtr(256),
+ CPU: pointer.Of(500),
+ MemoryMB: pointer.Of(256),
},
Meta: map[string]string{
"foo": "bar",
@@ -101,6 +101,6 @@ func MockJob() *api.Job {
func MockRegionalJob() *api.Job {
j := MockJob()
- j.Region = helper.StringToPtr("north-america")
+ j.Region = pointer.Of("north-america")
return j
}
diff --git a/command/agent_info_test.go b/command/agent_info_test.go
index 8b0869963ee..8902438a83a 100644
--- a/command/agent_info_test.go
+++ b/command/agent_info_test.go
@@ -1,11 +1,11 @@
package command
import (
- "strings"
"testing"
"github.com/hashicorp/nomad/ci"
"github.com/mitchellh/cli"
+ "github.com/shoenig/test/must"
)
func TestAgentInfoCommand_Implements(t *testing.T) {
@@ -16,49 +16,43 @@ func TestAgentInfoCommand_Implements(t *testing.T) {
func TestAgentInfoCommand_Run(t *testing.T) {
ci.Parallel(t)
srv, _, url := testServer(t, false, nil)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
ui := cli.NewMockUi()
cmd := &AgentInfoCommand{Meta: Meta{Ui: ui}}
code := cmd.Run([]string{"-address=" + url})
- if code != 0 {
- t.Fatalf("expected exit 0, got: %d", code)
- }
+ must.Zero(t, code)
}
func TestAgentInfoCommand_Run_JSON(t *testing.T) {
ci.Parallel(t)
srv, _, url := testServer(t, false, nil)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
ui := cli.NewMockUi()
cmd := &AgentInfoCommand{Meta: Meta{Ui: ui}}
code := cmd.Run([]string{"-address=" + url, "-json"})
- if code != 0 {
- t.Fatalf("expected exit 0, got: %d", code)
- }
- if out := ui.OutputWriter.String(); !strings.Contains(out, "\"config\": {") {
- t.Fatalf("expected config stanza in output json")
- }
+ must.Zero(t, code)
+
+ out := ui.OutputWriter.String()
+ must.StrContains(t, out, `"config"`)
}
func TestAgentInfoCommand_Run_Gotemplate(t *testing.T) {
ci.Parallel(t)
srv, _, url := testServer(t, false, nil)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
ui := cli.NewMockUi()
cmd := &AgentInfoCommand{Meta: Meta{Ui: ui}}
code := cmd.Run([]string{"-address=" + url, "-t", "{{.Stats.raft}}"})
- if code != 0 {
- t.Fatalf("expected exit 0, got: %d", code)
- }
- if out := ui.OutputWriter.String(); !strings.Contains(out, "last_log_index") {
- t.Fatalf("expected raft stats in gotemplate output")
- }
+ must.Zero(t, code)
+
+ out := ui.OutputWriter.String()
+ must.StrContains(t, out, "last_log_index")
}
func TestAgentInfoCommand_Fails(t *testing.T) {
@@ -67,19 +61,18 @@ func TestAgentInfoCommand_Fails(t *testing.T) {
cmd := &AgentInfoCommand{Meta: Meta{Ui: ui}}
// Fails on misuse
- if code := cmd.Run([]string{"some", "bad", "args"}); code != 1 {
- t.Fatalf("expected exit code 1, got: %d", code)
- }
- if out := ui.ErrorWriter.String(); !strings.Contains(out, commandErrorText(cmd)) {
- t.Fatalf("expected help output, got: %s", out)
- }
+ code := cmd.Run([]string{"some", "bad", "args"})
+ must.One(t, code)
+
+ out := ui.ErrorWriter.String()
+ must.StrContains(t, out, commandErrorText(cmd))
+
ui.ErrorWriter.Reset()
// Fails on connection failure
- if code := cmd.Run([]string{"-address=nope"}); code != 1 {
- t.Fatalf("expected exit code 1, got: %d", code)
- }
- if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error querying agent info") {
- t.Fatalf("expected failed query error, got: %s", out)
- }
+ code = cmd.Run([]string{"-address=nope"})
+ must.One(t, code)
+
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "Error querying agent info")
}
diff --git a/command/agent_monitor_test.go b/command/agent_monitor_test.go
index cf8b186a0c1..bc9903dd6e3 100644
--- a/command/agent_monitor_test.go
+++ b/command/agent_monitor_test.go
@@ -1,11 +1,11 @@
package command
import (
- "strings"
"testing"
"github.com/hashicorp/nomad/ci"
"github.com/mitchellh/cli"
+ "github.com/shoenig/test/must"
)
func TestMonitorCommand_Implements(t *testing.T) {
@@ -16,31 +16,27 @@ func TestMonitorCommand_Implements(t *testing.T) {
func TestMonitorCommand_Fails(t *testing.T) {
ci.Parallel(t)
srv, _, url := testServer(t, false, nil)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
ui := cli.NewMockUi()
cmd := &MonitorCommand{Meta: Meta{Ui: ui}}
// Fails on misuse
- if code := cmd.Run([]string{"some", "bad", "args"}); code != 1 {
- t.Fatalf("exepected exit code 1, got: %d", code)
- }
- if out := ui.ErrorWriter.String(); !strings.Contains(out, commandErrorText(cmd)) {
- t.Fatalf("expected help output, got: %s", out)
- }
+ code := cmd.Run([]string{"some", "bad", "args"})
+ must.One(t, code)
+
+ out := ui.ErrorWriter.String()
+ must.StrContains(t, out, commandErrorText(cmd))
ui.ErrorWriter.Reset()
- if code := cmd.Run([]string{"-address=nope"}); code != 1 {
- t.Fatalf("exepected exit code 1, got: %d", code)
- }
+ code = cmd.Run([]string{"-address=nope"})
+ must.One(t, code)
// Fails on nonexistent node
- if code := cmd.Run([]string{"-address=" + url, "-node-id=12345678-abcd-efab-cdef-123456789abc"}); code != 1 {
- t.Fatalf("expected exit 1, got: %d", code)
- }
- if out := ui.ErrorWriter.String(); !strings.Contains(out, "No node(s) with prefix") {
- t.Fatalf("expected not found error, got: %s", out)
- }
- ui.ErrorWriter.Reset()
+ code = cmd.Run([]string{"-address=" + url, "-node-id=12345678-abcd-efab-cdef-123456789abc"})
+ must.One(t, code)
+
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "No node(s) with prefix")
}
diff --git a/command/alloc_checks.go b/command/alloc_checks.go
new file mode 100644
index 00000000000..ce020605628
--- /dev/null
+++ b/command/alloc_checks.go
@@ -0,0 +1,162 @@
+package command
+
+import (
+ "fmt"
+ "strings"
+ "time"
+
+ "github.com/hashicorp/nomad/api"
+ "github.com/hashicorp/nomad/api/contexts"
+ "github.com/posener/complete"
+)
+
+type AllocChecksCommand struct {
+ Meta
+}
+
+func (c *AllocChecksCommand) Help() string {
+ helpText := `
+Usage: nomad alloc checks [options]
+Alias: nomad checks
+
+ Outputs the latest health check status information for services in the allocation
+ using the Nomad service discovery provider.
+
+General Options:
+
+` + generalOptionsUsage(usageOptsDefault) + `
+
+Checks Specific Options:
+
+ -verbose
+ Show full information.
+`
+ return strings.TrimSpace(helpText)
+}
+
+func (c *AllocChecksCommand) Synopsis() string {
+ return "Outputs service health check status information."
+}
+
+func (c *AllocChecksCommand) AutocompleteFlags() complete.Flags {
+ return mergeAutocompleteFlags(c.Meta.AutocompleteFlags(FlagSetClient),
+ complete.Flags{
+ "-verbose": complete.PredictNothing,
+ })
+}
+
+func (c *AllocChecksCommand) AutocompleteArgs() complete.Predictor {
+ return complete.PredictFunc(func(a complete.Args) []string {
+ client, err := c.Meta.Client()
+ if err != nil {
+ return nil
+ }
+ resp, _, err := client.Search().PrefixSearch(a.Last, contexts.Allocs, nil)
+ if err != nil {
+ return nil
+ }
+ return resp.Matches[contexts.Allocs]
+ })
+}
+
+func (c *AllocChecksCommand) Name() string {
+ return "alloc checks"
+}
+
+func (c *AllocChecksCommand) Run(args []string) int {
+ var verbose bool
+
+ flags := c.Meta.FlagSet(c.Name(), FlagSetClient)
+ flags.Usage = func() { c.Ui.Output(c.Help()) }
+ flags.BoolVar(&verbose, "verbose", false, "")
+
+ if err := flags.Parse(args); err != nil {
+ return 1
+ }
+ args = flags.Args()
+
+ if numArgs := len(args); numArgs < 1 {
+ c.Ui.Error("An allocation ID is required")
+ c.Ui.Error(commandErrorText(c))
+ return 1
+ } else if numArgs > 1 {
+ c.Ui.Error("This command takes one argument (allocation ID)")
+ c.Ui.Error(commandErrorText(c))
+ return 1
+ }
+
+ client, err := c.Meta.Client()
+ if err != nil {
+ c.Ui.Error(fmt.Sprintf("Error initializing client: %v", err))
+ return 1
+ }
+
+ allocID := args[0]
+ // Truncate the id unless full length is requested
+ length := shortId
+ if verbose {
+ length = fullId
+ }
+
+ // Query the allocation info
+ if len(allocID) == 1 {
+ c.Ui.Error("Alloc ID must contain at least two characters.")
+ return 1
+ }
+
+ allocID = sanitizeUUIDPrefix(allocID)
+ allocations, _, err := client.Allocations().PrefixList(allocID)
+ if err != nil {
+ c.Ui.Error(fmt.Sprintf("Error querying allocation: %v", err))
+ return 1
+ }
+ if len(allocations) == 0 {
+ c.Ui.Error(fmt.Sprintf("No allocation(s) with prefix or id %q found", allocID))
+ return 1
+ }
+ if len(allocations) > 1 {
+ out := formatAllocListStubs(allocations, verbose, length)
+ c.Ui.Error(fmt.Sprintf("Prefix matched multiple allocations\n\n%s", out))
+ return 1
+ }
+
+ // prefix lookup matched single allocation (happy path), lookup the checks
+ q := &api.QueryOptions{Namespace: allocations[0].Namespace}
+ checks, err := client.Allocations().Checks(allocations[0].ID, q)
+ if err != nil {
+ c.Ui.Error(fmt.Sprintf("Error querying allocation checks: %s", err))
+ return 1
+ }
+
+ c.Ui.Output(fmt.Sprintf("Status of %d Nomad Service Checks", len(checks)))
+ c.Ui.Output("")
+
+ pair := func(key, value string) string { return fmt.Sprintf("%s|=|%s", key, value) }
+ taskFmt := func(s string) string {
+ if s == "" {
+ return "(group)"
+ }
+ return s
+ }
+ for _, check := range checks {
+ list := []string{
+ pair("ID", check.ID),
+ pair("Name", check.Check),
+ pair("Group", check.Group),
+ pair("Task", taskFmt(check.Task)),
+ pair("Service", check.Service),
+ pair("Status", check.Status),
+ }
+ if check.StatusCode > 0 {
+ list = append(list, pair("StatusCode", fmt.Sprintf("%d", check.StatusCode)))
+ }
+ list = append(list,
+ pair("Mode", check.Mode),
+ pair("Timestamp", formatTaskTimes(time.Unix(check.Timestamp, 0))),
+ pair("Output", check.Output),
+ )
+ c.Ui.Output(formatList(list))
+ c.Ui.Output("")
+ }
+ return 0
+}
diff --git a/command/alloc_checks_test.go b/command/alloc_checks_test.go
new file mode 100644
index 00000000000..8dffec91086
--- /dev/null
+++ b/command/alloc_checks_test.go
@@ -0,0 +1,122 @@
+package command
+
+import (
+ "testing"
+
+ "github.com/hashicorp/nomad/ci"
+ "github.com/hashicorp/nomad/nomad/mock"
+ "github.com/hashicorp/nomad/nomad/structs"
+ "github.com/mitchellh/cli"
+ "github.com/posener/complete"
+ "github.com/shoenig/test/must"
+)
+
+func TestAllocChecksCommand_Implements(t *testing.T) {
+ ci.Parallel(t)
+ var _ cli.Command = (*AllocChecksCommand)(nil)
+}
+
+func TestAllocChecksCommand_Fails(t *testing.T) {
+ ci.Parallel(t)
+ srv, _, url := testServer(t, false, nil)
+ t.Cleanup(func() {
+ _ = srv.Shutdown()
+ })
+
+ ui := cli.NewMockUi()
+ cmd := &AllocChecksCommand{Meta: Meta{Ui: ui}}
+
+ // fails on misuse t.Run("fails on misuse", func(t *testing.T) {
+ code := cmd.Run([]string{"some", "bad", "args"})
+ must.One(t, code)
+ out := ui.ErrorWriter.String()
+ must.StrContains(t, out, commandErrorText(cmd))
+
+ ui.ErrorWriter.Reset()
+
+ // fails on connection failure
+ code = cmd.Run([]string{"-address=nope", "foobar"})
+ must.One(t, code)
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "Error querying allocation")
+
+ ui.ErrorWriter.Reset()
+
+ // fails on missing allocation
+ code = cmd.Run([]string{"-address=" + url, "26470238-5CF2-438F-8772-DC67CFB0705C"})
+ must.One(t, code)
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "No allocation(s) with prefix or id")
+
+ ui.ErrorWriter.Reset()
+
+ // fails on prefix with too few characters
+ code = cmd.Run([]string{"-address=" + url, "2"})
+ must.One(t, code)
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "must contain at least two characters.")
+
+ ui.ErrorWriter.Reset()
+}
+
+func TestAllocChecksCommand_AutocompleteArgs(t *testing.T) {
+ ci.Parallel(t)
+
+ srv, _, url := testServer(t, true, nil)
+ defer stopTestAgent(srv)
+
+ ui := cli.NewMockUi()
+ cmd := &AllocChecksCommand{Meta: Meta{Ui: ui, flagAddress: url}}
+
+ // Create a fake alloc
+ state := srv.Agent.Server().State()
+ a := mock.Alloc()
+ must.NoError(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 1000, []*structs.Allocation{a}))
+
+ prefix := a.ID[:5]
+ args := complete.Args{Last: prefix}
+ predictor := cmd.AutocompleteArgs()
+
+ res := predictor.Predict(args)
+ must.Len(t, 1, res)
+ must.Eq(t, a.ID, res[0])
+}
+
+func TestAllocChecksCommand_Run(t *testing.T) {
+ ci.Parallel(t)
+ srv, client, url := testServer(t, true, nil)
+ defer stopTestAgent(srv)
+
+ // wait for nodes
+ waitForNodes(t, client)
+
+ jobID := "job1_checks"
+ job1 := testNomadServiceJob(jobID)
+
+ resp, _, err := client.Jobs().Register(job1, nil)
+ must.NoError(t, err)
+
+ // wait for registration success
+ ui := cli.NewMockUi()
+ code := waitForSuccess(ui, client, fullId, t, resp.EvalID)
+ must.Zero(t, code)
+
+ // Get an alloc id
+ allocID := getAllocFromJob(t, client, jobID)
+
+ // do not wait for alloc running - it will stay pending because the
+ // health-check will never pass
+
+ // Run command
+ cmd := &AllocChecksCommand{Meta: Meta{Ui: ui, flagAddress: url}}
+ code = cmd.Run([]string{"-address=" + url, allocID})
+ must.Zero(t, code)
+
+ // check output
+ out := ui.OutputWriter.String()
+ must.StrContains(t, out, `Name = check1`)
+ must.StrContains(t, out, `Group = job1_checks.group1[0]`)
+ must.StrContains(t, out, `Task = (group)`)
+ must.StrContains(t, out, `Service = service1`)
+ must.StrContains(t, out, `Mode = healthiness`)
+}
diff --git a/command/alloc_exec_test.go b/command/alloc_exec_test.go
index e5586e4dff6..5de9d5ea328 100644
--- a/command/alloc_exec_test.go
+++ b/command/alloc_exec_test.go
@@ -13,8 +13,7 @@ import (
"github.com/hashicorp/nomad/testutil"
"github.com/mitchellh/cli"
"github.com/posener/complete"
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
+ "github.com/shoenig/test/must"
)
// static check
@@ -23,7 +22,7 @@ var _ cli.Command = &AllocExecCommand{}
func TestAllocExecCommand_Fails(t *testing.T) {
ci.Parallel(t)
srv, client, url := testServer(t, true, nil)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
cases := []struct {
name string
@@ -83,32 +82,18 @@ func TestAllocExecCommand_Fails(t *testing.T) {
cmd := &AllocExecCommand{Meta: Meta{Ui: ui}}
code := cmd.Run(c.args)
- require.Equal(t, 1, code)
+ must.One(t, code)
- require.Contains(t, ui.ErrorWriter.String(), c.expectedError)
+ out := ui.ErrorWriter.String()
+ must.StrContains(t, out, c.expectedError)
ui.ErrorWriter.Reset()
ui.OutputWriter.Reset()
-
})
}
// Wait for a node to be ready
- testutil.WaitForResult(func() (bool, error) {
- nodes, _, err := client.Nodes().List(nil)
- if err != nil {
- return false, err
- }
- for _, node := range nodes {
- if _, ok := node.Drivers["mock_driver"]; ok &&
- node.Status == structs.NodeStatusReady {
- return true, nil
- }
- }
- return false, fmt.Errorf("no ready nodes")
- }, func(err error) {
- require.NoError(t, err)
- })
+ waitForNodes(t, client)
t.Run("non existent task", func(t *testing.T) {
ui := cli.NewMockUi()
@@ -116,10 +101,12 @@ func TestAllocExecCommand_Fails(t *testing.T) {
jobID := "job1_sfx"
job1 := testJob(jobID)
+
resp, _, err := client.Jobs().Register(job1, nil)
- require.NoError(t, err)
+ must.NoError(t, err)
+
code := waitForSuccess(ui, client, fullId, t, resp.EvalID)
- require.Zero(t, code, "status code not zero")
+ must.Zero(t, code)
// get an alloc id
allocId1 := ""
@@ -128,16 +115,24 @@ func TestAllocExecCommand_Fails(t *testing.T) {
allocId1 = allocs[0].ID
}
}
- require.NotEmpty(t, allocId1, "unable to find allocation")
+ must.NotEq(t, "", allocId1)
// by alloc
- require.Equal(t, 1, cmd.Run([]string{"-address=" + url, "-task=nonexistenttask1", allocId1, "/bin/bash"}))
- require.Contains(t, ui.ErrorWriter.String(), "Could not find task named: nonexistenttask1")
+ code = cmd.Run([]string{"-address=" + url, "-task=nonexistenttask1", allocId1, "/bin/bash"})
+ must.One(t, code)
+
+ out := ui.ErrorWriter.String()
+ must.StrContains(t, out, "Could not find task named: nonexistenttask1")
+
ui.ErrorWriter.Reset()
// by jobID
- require.Equal(t, 1, cmd.Run([]string{"-address=" + url, "-task=nonexistenttask2", "-job", jobID, "/bin/bash"}))
- require.Contains(t, ui.ErrorWriter.String(), "Could not find task named: nonexistenttask2")
+ code = cmd.Run([]string{"-address=" + url, "-task=nonexistenttask2", "-job", jobID, "/bin/bash"})
+ must.One(t, code)
+
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "Could not find task named: nonexistenttask2")
+
ui.ErrorWriter.Reset()
})
@@ -145,10 +140,9 @@ func TestAllocExecCommand_Fails(t *testing.T) {
func TestAllocExecCommand_AutocompleteArgs(t *testing.T) {
ci.Parallel(t)
- assert := assert.New(t)
srv, _, url := testServer(t, true, nil)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
ui := cli.NewMockUi()
cmd := &AllocExecCommand{Meta: Meta{Ui: ui, flagAddress: url}}
@@ -156,39 +150,24 @@ func TestAllocExecCommand_AutocompleteArgs(t *testing.T) {
// Create a fake alloc
state := srv.Agent.Server().State()
a := mock.Alloc()
- assert.Nil(state.UpsertAllocs(structs.MsgTypeTestSetup, 1000, []*structs.Allocation{a}))
+ must.NoError(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 1000, []*structs.Allocation{a}))
prefix := a.ID[:5]
args := complete.Args{Last: prefix}
predictor := cmd.AutocompleteArgs()
res := predictor.Predict(args)
- assert.Equal(1, len(res))
- assert.Equal(a.ID, res[0])
+ must.Len(t, 1, res)
+ must.Eq(t, a.ID, res[0])
}
func TestAllocExecCommand_Run(t *testing.T) {
ci.Parallel(t)
srv, client, url := testServer(t, true, nil)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
// Wait for a node to be ready
- testutil.WaitForResult(func() (bool, error) {
- nodes, _, err := client.Nodes().List(nil)
- if err != nil {
- return false, err
- }
-
- for _, node := range nodes {
- if _, ok := node.Drivers["mock_driver"]; ok &&
- node.Status == structs.NodeStatusReady {
- return true, nil
- }
- }
- return false, fmt.Errorf("no ready nodes")
- }, func(err error) {
- require.NoError(t, err)
- })
+ waitForNodes(t, client)
jobID := uuid.Generate()
job := testJob(jobID)
@@ -202,11 +181,11 @@ func TestAllocExecCommand_Run(t *testing.T) {
},
}
resp, _, err := client.Jobs().Register(job, nil)
- require.NoError(t, err)
+ must.NoError(t, err)
evalUi := cli.NewMockUi()
code := waitForSuccess(evalUi, client, fullId, t, resp.EvalID)
- require.Equal(t, 0, code, "failed to get status - output: %v", evalUi.ErrorWriter.String())
+ must.Zero(t, code)
allocId := ""
@@ -227,10 +206,7 @@ func TestAllocExecCommand_Run(t *testing.T) {
allocId = alloc.ID
return true, nil
- }, func(err error) {
- require.NoError(t, err)
-
- })
+ }, func(err error) { must.NoError(t, err) })
cases := []struct {
name string
@@ -271,9 +247,9 @@ func TestAllocExecCommand_Run(t *testing.T) {
}
code = cmd.Run([]string{"-address=" + url, allocId, c.command})
- assert.Equal(t, c.exitCode, code)
- assert.Equal(t, c.stdout, strings.TrimSpace(stdout.String()))
- assert.Equal(t, c.stderr, strings.TrimSpace(stderr.String()))
+ must.Eq(t, c.exitCode, code)
+ must.Eq(t, c.stdout, strings.TrimSpace(stdout.String()))
+ must.Eq(t, c.stderr, strings.TrimSpace(stderr.String()))
})
t.Run("by job: "+c.name, func(t *testing.T) {
ui := cli.NewMockUi()
@@ -287,9 +263,9 @@ func TestAllocExecCommand_Run(t *testing.T) {
}
code = cmd.Run([]string{"-address=" + url, "-job", jobID, c.command})
- assert.Equal(t, c.exitCode, code)
- assert.Equal(t, c.stdout, strings.TrimSpace(stdout.String()))
- assert.Equal(t, c.stderr, strings.TrimSpace(stderr.String()))
+ must.Eq(t, c.exitCode, code)
+ must.Eq(t, c.stdout, strings.TrimSpace(stdout.String()))
+ must.Eq(t, c.stderr, strings.TrimSpace(stderr.String()))
})
}
}
diff --git a/command/alloc_fs_test.go b/command/alloc_fs_test.go
index 967c3dd11e1..84fd1b9175c 100644
--- a/command/alloc_fs_test.go
+++ b/command/alloc_fs_test.go
@@ -1,7 +1,6 @@
package command
import (
- "strings"
"testing"
"github.com/hashicorp/nomad/ci"
@@ -9,7 +8,7 @@ import (
"github.com/hashicorp/nomad/nomad/structs"
"github.com/mitchellh/cli"
"github.com/posener/complete"
- "github.com/stretchr/testify/assert"
+ "github.com/shoenig/test/must"
)
func TestFSCommand_Implements(t *testing.T) {
@@ -20,80 +19,78 @@ func TestFSCommand_Implements(t *testing.T) {
func TestFSCommand_Fails(t *testing.T) {
ci.Parallel(t)
srv, _, url := testServer(t, false, nil)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
ui := cli.NewMockUi()
cmd := &AllocFSCommand{Meta: Meta{Ui: ui}}
// Fails on lack of job ID
- if code := cmd.Run([]string{"-job"}); code != 1 {
- t.Fatalf("expected exit code 1, got: %d", code)
- }
- if out := ui.ErrorWriter.String(); !strings.Contains(out, "job ID is required") {
- t.Fatalf("expected help output, got: %s", out)
- }
+ code := cmd.Run([]string{"-job"})
+ must.One(t, code)
+
+ out := ui.ErrorWriter.String()
+ must.StrContains(t, out, "job ID is required")
+
ui.ErrorWriter.Reset()
// Fails on lack of allocation ID
- if code := cmd.Run([]string{}); code != 1 {
- t.Fatalf("expected exit code 1, got: %d", code)
- }
- if out := ui.ErrorWriter.String(); !strings.Contains(out, "allocation ID is required") {
- t.Fatalf("expected help output, got: %s", out)
- }
+ code = cmd.Run([]string{})
+ must.One(t, code)
+
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "allocation ID is required")
+
ui.ErrorWriter.Reset()
// Fails on misuse
- if code := cmd.Run([]string{"some", "bad", "args"}); code != 1 {
- t.Fatalf("expected exit code 1, got: %d", code)
- }
- if out := ui.ErrorWriter.String(); !strings.Contains(out, commandErrorText(cmd)) {
- t.Fatalf("expected help output, got: %s", out)
- }
+ code = cmd.Run([]string{"some", "bad", "args"})
+ must.One(t, code)
+
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, commandErrorText(cmd))
+
ui.ErrorWriter.Reset()
// Fails on connection failure
- if code := cmd.Run([]string{"-address=nope", "foobar"}); code != 1 {
- t.Fatalf("expected exit code 1, got: %d", code)
- }
- if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error querying allocation") {
- t.Fatalf("expected failed query error, got: %s", out)
- }
+ code = cmd.Run([]string{"-address=nope", "foobar"})
+ must.One(t, code)
+
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "Error querying allocation")
+
ui.ErrorWriter.Reset()
// Fails on missing alloc
- if code := cmd.Run([]string{"-address=" + url, "26470238-5CF2-438F-8772-DC67CFB0705C"}); code != 1 {
- t.Fatalf("expected exit 1, got: %d", code)
- }
- if out := ui.ErrorWriter.String(); !strings.Contains(out, "No allocation(s) with prefix or id") {
- t.Fatalf("expected not found error, got: %s", out)
- }
+ code = cmd.Run([]string{"-address=" + url, "26470238-5CF2-438F-8772-DC67CFB0705C"})
+ must.One(t, code)
+
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "No allocation(s) with prefix or id")
+
ui.ErrorWriter.Reset()
// Fail on identifier with too few characters
- if code := cmd.Run([]string{"-address=" + url, "2"}); code != 1 {
- t.Fatalf("expected exit 1, got: %d", code)
- }
- if out := ui.ErrorWriter.String(); !strings.Contains(out, "must contain at least two characters.") {
- t.Fatalf("expected too few characters error, got: %s", out)
- }
+ code = cmd.Run([]string{"-address=" + url, "2"})
+ must.One(t, code)
+
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "must contain at least two characters.")
+
ui.ErrorWriter.Reset()
// Identifiers with uneven length should produce a query result
- if code := cmd.Run([]string{"-address=" + url, "123"}); code != 1 {
- t.Fatalf("expected exit 1, got: %d", code)
- }
- if out := ui.ErrorWriter.String(); !strings.Contains(out, "No allocation(s) with prefix or id") {
- t.Fatalf("expected not found error, got: %s", out)
- }
+ code = cmd.Run([]string{"-address=" + url, "123"})
+ must.One(t, code)
+
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "No allocation(s) with prefix or id")
}
func TestFSCommand_AutocompleteArgs(t *testing.T) {
ci.Parallel(t)
- assert := assert.New(t)
srv, _, url := testServer(t, true, nil)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
ui := cli.NewMockUi()
cmd := &AllocFSCommand{Meta: Meta{Ui: ui, flagAddress: url}}
@@ -101,13 +98,13 @@ func TestFSCommand_AutocompleteArgs(t *testing.T) {
// Create a fake alloc
state := srv.Agent.Server().State()
a := mock.Alloc()
- assert.Nil(state.UpsertAllocs(structs.MsgTypeTestSetup, 1000, []*structs.Allocation{a}))
+ must.NoError(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 1000, []*structs.Allocation{a}))
prefix := a.ID[:5]
args := complete.Args{Last: prefix}
predictor := cmd.AutocompleteArgs()
res := predictor.Predict(args)
- assert.Equal(1, len(res))
- assert.Equal(a.ID, res[0])
+ must.Len(t, 1, res)
+ must.Eq(t, a.ID, res[0])
}
diff --git a/command/alloc_logs_test.go b/command/alloc_logs_test.go
index 5698433fd6f..f1d18d224f1 100644
--- a/command/alloc_logs_test.go
+++ b/command/alloc_logs_test.go
@@ -1,7 +1,6 @@
package command
import (
- "strings"
"testing"
"github.com/hashicorp/nomad/ci"
@@ -9,7 +8,7 @@ import (
"github.com/hashicorp/nomad/nomad/structs"
"github.com/mitchellh/cli"
"github.com/posener/complete"
- "github.com/stretchr/testify/assert"
+ "github.com/shoenig/test/must"
)
func TestLogsCommand_Implements(t *testing.T) {
@@ -20,62 +19,60 @@ func TestLogsCommand_Implements(t *testing.T) {
func TestLogsCommand_Fails(t *testing.T) {
ci.Parallel(t)
srv, _, url := testServer(t, false, nil)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
ui := cli.NewMockUi()
cmd := &AllocLogsCommand{Meta: Meta{Ui: ui}}
// Fails on misuse
- if code := cmd.Run([]string{"some", "bad", "args"}); code != 1 {
- t.Fatalf("expected exit code 1, got: %d", code)
- }
- if out := ui.ErrorWriter.String(); !strings.Contains(out, commandErrorText(cmd)) {
- t.Fatalf("expected help output, got: %s", out)
- }
+ code := cmd.Run([]string{"some", "bad", "args"})
+ must.One(t, code)
+
+ out := ui.ErrorWriter.String()
+ must.StrContains(t, out, commandErrorText(cmd))
+
ui.ErrorWriter.Reset()
// Fails on connection failure
- if code := cmd.Run([]string{"-address=nope", "foobar"}); code != 1 {
- t.Fatalf("expected exit code 1, got: %d", code)
- }
- if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error querying allocation") {
- t.Fatalf("expected failed query error, got: %s", out)
- }
+ code = cmd.Run([]string{"-address=nope", "foobar"})
+ must.One(t, code)
+
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "Error querying allocation")
+
ui.ErrorWriter.Reset()
// Fails on missing alloc
- if code := cmd.Run([]string{"-address=" + url, "26470238-5CF2-438F-8772-DC67CFB0705C"}); code != 1 {
- t.Fatalf("expected exit 1, got: %d", code)
- }
- if out := ui.ErrorWriter.String(); !strings.Contains(out, "No allocation(s) with prefix or id") {
- t.Fatalf("expected not found error, got: %s", out)
- }
+ code = cmd.Run([]string{"-address=" + url, "26470238-5CF2-438F-8772-DC67CFB0705C"})
+ must.One(t, code)
+
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "No allocation(s) with prefix or id")
+
ui.ErrorWriter.Reset()
// Fail on identifier with too few characters
- if code := cmd.Run([]string{"-address=" + url, "2"}); code != 1 {
- t.Fatalf("expected exit 1, got: %d", code)
- }
- if out := ui.ErrorWriter.String(); !strings.Contains(out, "must contain at least two characters.") {
- t.Fatalf("expected too few characters error, got: %s", out)
- }
+ code = cmd.Run([]string{"-address=" + url, "2"})
+ must.One(t, code)
+
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "must contain at least two characters.")
+
ui.ErrorWriter.Reset()
// Identifiers with uneven length should produce a query result
- if code := cmd.Run([]string{"-address=" + url, "123"}); code != 1 {
- t.Fatalf("expected exit 1, got: %d", code)
- }
- if out := ui.ErrorWriter.String(); !strings.Contains(out, "No allocation(s) with prefix or id") {
- t.Fatalf("expected not found error, got: %s", out)
- }
+ code = cmd.Run([]string{"-address=" + url, "123"})
+ must.One(t, code)
+
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "No allocation(s) with prefix or id")
}
func TestLogsCommand_AutocompleteArgs(t *testing.T) {
ci.Parallel(t)
- assert := assert.New(t)
srv, _, url := testServer(t, true, nil)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
ui := cli.NewMockUi()
cmd := &AllocLogsCommand{Meta: Meta{Ui: ui, flagAddress: url}}
@@ -83,13 +80,13 @@ func TestLogsCommand_AutocompleteArgs(t *testing.T) {
// Create a fake alloc
state := srv.Agent.Server().State()
a := mock.Alloc()
- assert.Nil(state.UpsertAllocs(structs.MsgTypeTestSetup, 1000, []*structs.Allocation{a}))
+ must.NoError(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 1000, []*structs.Allocation{a}))
prefix := a.ID[:5]
args := complete.Args{Last: prefix}
predictor := cmd.AutocompleteArgs()
res := predictor.Predict(args)
- assert.Equal(1, len(res))
- assert.Equal(a.ID, res[0])
+ must.Len(t, 1, res)
+ must.Eq(t, a.ID, res[0])
}
diff --git a/command/alloc_restart.go b/command/alloc_restart.go
index 9c5dcb3be9c..cc6d9165497 100644
--- a/command/alloc_restart.go
+++ b/command/alloc_restart.go
@@ -18,8 +18,11 @@ func (c *AllocRestartCommand) Help() string {
Usage: nomad alloc restart [options]
Restart an existing allocation. This command is used to restart a specific alloc
- and its tasks. If no task is provided then all of the allocation's tasks will
- be restarted.
+ and its tasks. If no task is provided then all of the allocation's tasks that
+ are currently running will be restarted.
+
+ Use the option '-all-tasks' to restart tasks that have already run, such as
+ non-sidecar prestart and poststart tasks.
When ACLs are enabled, this command requires a token with the
'alloc-lifecycle', 'read-job', and 'list-jobs' capabilities for the
@@ -31,9 +34,15 @@ General Options:
Restart Specific Options:
+ -all-tasks
+ If set, all tasks in the allocation will be restarted, even the ones that
+ already ran. This option cannot be used with '-task' or the ''
+ argument.
+
-task
- Specify the individual task to restart. If task name is given with both an
+ Specify the individual task to restart. If task name is given with both an
argument and the '-task' option, preference is given to the '-task' option.
+ This option cannot be used with '-all-tasks'.
-verbose
Show full information.
@@ -44,11 +53,12 @@ Restart Specific Options:
func (c *AllocRestartCommand) Name() string { return "alloc restart" }
func (c *AllocRestartCommand) Run(args []string) int {
- var verbose bool
+ var allTasks, verbose bool
var task string
flags := c.Meta.FlagSet(c.Name(), FlagSetClient)
flags.Usage = func() { c.Ui.Output(c.Help()) }
+ flags.BoolVar(&allTasks, "all-tasks", false, "")
flags.BoolVar(&verbose, "verbose", false, "")
flags.StringVar(&task, "task", "", "")
@@ -66,6 +76,17 @@ func (c *AllocRestartCommand) Run(args []string) int {
allocID := args[0]
+ // If -task isn't provided fallback to reading the task name
+ // from args.
+ if task == "" && len(args) >= 2 {
+ task = args[1]
+ }
+
+ if allTasks && task != "" {
+ c.Ui.Error("The -all-tasks option is not allowed when restarting a specific task.")
+ return 1
+ }
+
// Truncate the id unless full length is requested
length := shortId
if verbose {
@@ -113,12 +134,6 @@ func (c *AllocRestartCommand) Run(args []string) int {
return 1
}
- // If -task isn't provided fallback to reading the task name
- // from args.
- if task == "" && len(args) >= 2 {
- task = args[1]
- }
-
if task != "" {
err := validateTaskExistsInAllocation(task, alloc)
if err != nil {
@@ -127,9 +142,17 @@ func (c *AllocRestartCommand) Run(args []string) int {
}
}
- err = client.Allocations().Restart(alloc, task, nil)
+ if allTasks {
+ err = client.Allocations().RestartAllTasks(alloc, nil)
+ } else {
+ err = client.Allocations().Restart(alloc, task, nil)
+ }
if err != nil {
- c.Ui.Error(fmt.Sprintf("Failed to restart allocation:\n\n%s", err.Error()))
+ target := "allocation"
+ if task != "" {
+ target = "task"
+ }
+ c.Ui.Error(fmt.Sprintf("Failed to restart %s:\n\n%s", target, err.Error()))
return 1
}
diff --git a/command/alloc_restart_test.go b/command/alloc_restart_test.go
index fb1e88762b0..b7698559778 100644
--- a/command/alloc_restart_test.go
+++ b/command/alloc_restart_test.go
@@ -1,18 +1,14 @@
package command
import (
- "fmt"
"testing"
- "github.com/hashicorp/nomad/api"
"github.com/hashicorp/nomad/ci"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
- "github.com/hashicorp/nomad/testutil"
"github.com/mitchellh/cli"
"github.com/posener/complete"
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
+ "github.com/shoenig/test/must"
)
func TestAllocRestartCommand_Implements(t *testing.T) {
@@ -23,61 +19,67 @@ func TestAllocRestartCommand_Fails(t *testing.T) {
ci.Parallel(t)
srv, client, url := testServer(t, true, nil)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
- require := require.New(t)
ui := cli.NewMockUi()
cmd := &AllocRestartCommand{Meta: Meta{Ui: ui}}
// Fails on misuse
- require.Equal(cmd.Run([]string{"some", "garbage", "args"}), 1, "Expected failure")
- require.Contains(ui.ErrorWriter.String(), commandErrorText(cmd), "Expected help output")
+ code := cmd.Run([]string{"some", "garbage", "args"})
+ must.One(t, code)
+
+ out := ui.ErrorWriter.String()
+ must.StrContains(t, out, commandErrorText(cmd))
+
ui.ErrorWriter.Reset()
// Fails on connection failure
- require.Equal(cmd.Run([]string{"-address=nope", "foobar"}), 1, "expected failure")
- require.Contains(ui.ErrorWriter.String(), "Error querying allocation")
+ code = cmd.Run([]string{"-address=nope", "foobar"})
+ must.One(t, code)
+
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "Error querying allocation")
+
ui.ErrorWriter.Reset()
// Fails on missing alloc
- require.Equal(cmd.Run([]string{"-address=" + url, "26470238-5CF2-438F-8772-DC67CFB0705C"}), 1)
- require.Contains(ui.ErrorWriter.String(), "No allocation(s) with prefix or id")
+ code = cmd.Run([]string{"-address=" + url, "26470238-5CF2-438F-8772-DC67CFB0705C"})
+ must.One(t, code)
+
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "No allocation(s) with prefix or id")
+
ui.ErrorWriter.Reset()
// Fail on identifier with too few characters
- require.Equal(cmd.Run([]string{"-address=" + url, "2"}), 1)
- require.Contains(ui.ErrorWriter.String(), "must contain at least two characters")
+ code = cmd.Run([]string{"-address=" + url, "2"})
+ must.One(t, code)
+
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "must contain at least two characters")
+
ui.ErrorWriter.Reset()
// Identifiers with uneven length should produce a query result
- require.Equal(cmd.Run([]string{"-address=" + url, "123"}), 1)
- require.Contains(ui.ErrorWriter.String(), "No allocation(s) with prefix or id")
+ code = cmd.Run([]string{"-address=" + url, "123"})
+ must.One(t, code)
+
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "No allocation(s) with prefix or id")
+
ui.ErrorWriter.Reset()
// Wait for a node to be ready
- testutil.WaitForResult(func() (bool, error) {
- nodes, _, err := client.Nodes().List(nil)
- if err != nil {
- return false, err
- }
- for _, node := range nodes {
- if _, ok := node.Drivers["mock_driver"]; ok &&
- node.Status == structs.NodeStatusReady {
- return true, nil
- }
- }
- return false, fmt.Errorf("no ready nodes")
- }, func(err error) {
- t.Fatalf("err: %v", err)
- })
+ waitForNodes(t, client)
jobID := "job1_sfx"
job1 := testJob(jobID)
resp, _, err := client.Jobs().Register(job1, nil)
- require.NoError(err)
- if code := waitForSuccess(ui, client, fullId, t, resp.EvalID); code != 0 {
- t.Fatalf("status code non zero saw %d", code)
- }
+ must.NoError(t, err)
+
+ code = waitForSuccess(ui, client, fullId, t, resp.EvalID)
+ must.Zero(t, code)
+
// get an alloc id
allocId1 := ""
if allocs, _, err := client.Jobs().Allocations(jobID, false, nil); err == nil {
@@ -85,11 +87,15 @@ func TestAllocRestartCommand_Fails(t *testing.T) {
allocId1 = allocs[0].ID
}
}
- require.NotEmpty(allocId1, "unable to find allocation")
+ must.NotEq(t, "", allocId1)
// Fails on not found task
- require.Equal(cmd.Run([]string{"-address=" + url, allocId1, "fooooobarrr"}), 1)
- require.Contains(ui.ErrorWriter.String(), "Could not find task named")
+ code = cmd.Run([]string{"-address=" + url, allocId1, "fooooobarrr"})
+ must.One(t, code)
+
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "Could not find task named")
+
ui.ErrorWriter.Reset()
}
@@ -97,26 +103,10 @@ func TestAllocRestartCommand_Run(t *testing.T) {
ci.Parallel(t)
srv, client, url := testServer(t, true, nil)
- defer srv.Shutdown()
-
- require := require.New(t)
+ defer stopTestAgent(srv)
// Wait for a node to be ready
- testutil.WaitForResult(func() (bool, error) {
- nodes, _, err := client.Nodes().List(nil)
- if err != nil {
- return false, err
- }
- for _, node := range nodes {
- if _, ok := node.Drivers["mock_driver"]; ok &&
- node.Status == structs.NodeStatusReady {
- return true, nil
- }
- }
- return false, fmt.Errorf("no ready nodes")
- }, func(err error) {
- t.Fatalf("err: %v", err)
- })
+ waitForNodes(t, client)
ui := cli.NewMockUi()
cmd := &AllocRestartCommand{Meta: Meta{Ui: ui}}
@@ -124,34 +114,25 @@ func TestAllocRestartCommand_Run(t *testing.T) {
jobID := "job1_sfx"
job1 := testJob(jobID)
resp, _, err := client.Jobs().Register(job1, nil)
- require.NoError(err)
- if code := waitForSuccess(ui, client, fullId, t, resp.EvalID); code != 0 {
- t.Fatalf("status code non zero saw %d", code)
- }
+ must.NoError(t, err)
+
+ code := waitForSuccess(ui, client, fullId, t, resp.EvalID)
+ must.Zero(t, code)
+
// get an alloc id
- allocId1 := ""
+ allocID := ""
if allocs, _, err := client.Jobs().Allocations(jobID, false, nil); err == nil {
if len(allocs) > 0 {
- allocId1 = allocs[0].ID
+ allocID = allocs[0].ID
}
}
- require.NotEmpty(allocId1, "unable to find allocation")
+ must.NotEq(t, "", allocID)
// Wait for alloc to be running
- testutil.WaitForResult(func() (bool, error) {
- alloc, _, err := client.Allocations().Info(allocId1, nil)
- if err != nil {
- return false, err
- }
- if alloc.ClientStatus == api.AllocClientStatusRunning {
- return true, nil
- }
- return false, fmt.Errorf("alloc is not running, is: %s", alloc.ClientStatus)
- }, func(err error) {
- t.Fatalf("err: %v", err)
- })
+ waitForAllocRunning(t, client, allocID)
- require.Equal(cmd.Run([]string{"-address=" + url, allocId1}), 0, "expected successful exit code")
+ code = cmd.Run([]string{"-address=" + url, allocID})
+ must.Zero(t, code)
ui.OutputWriter.Reset()
}
@@ -159,10 +140,8 @@ func TestAllocRestartCommand_Run(t *testing.T) {
func TestAllocRestartCommand_AutocompleteArgs(t *testing.T) {
ci.Parallel(t)
- assert := assert.New(t)
-
srv, _, url := testServer(t, true, nil)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
ui := cli.NewMockUi()
cmd := &AllocRestartCommand{Meta: Meta{Ui: ui, flagAddress: url}}
@@ -170,13 +149,13 @@ func TestAllocRestartCommand_AutocompleteArgs(t *testing.T) {
// Create a fake alloc
state := srv.Agent.Server().State()
a := mock.Alloc()
- assert.Nil(state.UpsertAllocs(structs.MsgTypeTestSetup, 1000, []*structs.Allocation{a}))
+ must.NoError(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 1000, []*structs.Allocation{a}))
prefix := a.ID[:5]
args := complete.Args{Last: prefix}
predictor := cmd.AutocompleteArgs()
res := predictor.Predict(args)
- assert.Equal(1, len(res))
- assert.Equal(a.ID, res[0])
+ must.Len(t, 1, res)
+ must.Eq(t, a.ID, res[0])
}
diff --git a/command/alloc_signal_test.go b/command/alloc_signal_test.go
index 46e18d14663..b69d0abaae4 100644
--- a/command/alloc_signal_test.go
+++ b/command/alloc_signal_test.go
@@ -1,18 +1,14 @@
package command
import (
- "fmt"
"testing"
- "github.com/hashicorp/nomad/api"
"github.com/hashicorp/nomad/ci"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
- "github.com/hashicorp/nomad/testutil"
"github.com/mitchellh/cli"
"github.com/posener/complete"
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
+ "github.com/shoenig/test/must"
)
func TestAllocSignalCommand_Implements(t *testing.T) {
@@ -23,47 +19,62 @@ func TestAllocSignalCommand_Implements(t *testing.T) {
func TestAllocSignalCommand_Fails(t *testing.T) {
ci.Parallel(t)
srv, _, url := testServer(t, false, nil)
- defer srv.Shutdown()
-
- require := require.New(t)
+ defer stopTestAgent(srv)
ui := cli.NewMockUi()
cmd := &AllocSignalCommand{Meta: Meta{Ui: ui}}
// Fails on lack of alloc ID
- require.Equal(1, cmd.Run([]string{}))
- require.Contains(ui.ErrorWriter.String(), "This command takes up to two arguments")
+ code := cmd.Run([]string{})
+ must.One(t, code)
+
+ out := ui.ErrorWriter.String()
+ must.StrContains(t, out, "This command takes up to two arguments")
+
ui.ErrorWriter.Reset()
// Fails on misuse
- require.Equal(1, cmd.Run([]string{"some", "bad", "args"}))
- require.Contains(ui.ErrorWriter.String(), "This command takes up to two arguments")
+ code = cmd.Run([]string{"some", "bad", "args"})
+ must.One(t, code)
+
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "This command takes up to two arguments")
+
ui.ErrorWriter.Reset()
// Fails on connection failure
- require.Equal(1, cmd.Run([]string{"-address=nope", "foobar"}))
- require.Contains(ui.ErrorWriter.String(), "Error querying allocation")
+ code = cmd.Run([]string{"-address=nope", "foobar"})
+ must.One(t, code)
+
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "Error querying allocation")
+
ui.ErrorWriter.Reset()
// Fails on missing alloc
- code := cmd.Run([]string{"-address=" + url, "26470238-5CF2-438F-8772-DC67CFB0705C"})
- require.Equal(1, code)
- require.Contains(ui.ErrorWriter.String(), "No allocation(s) with prefix or id")
+ code = cmd.Run([]string{"-address=" + url, "26470238-5CF2-438F-8772-DC67CFB0705C"})
+ must.One(t, code)
+
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "No allocation(s) with prefix or id")
+
ui.ErrorWriter.Reset()
// Fail on identifier with too few characters
- require.Equal(1, cmd.Run([]string{"-address=" + url, "2"}))
- require.Contains(ui.ErrorWriter.String(), "must contain at least two characters.")
+ code = cmd.Run([]string{"-address=" + url, "2"})
+ must.One(t, code)
+
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "must contain at least two characters.")
+
ui.ErrorWriter.Reset()
}
func TestAllocSignalCommand_AutocompleteArgs(t *testing.T) {
ci.Parallel(t)
- assert := assert.New(t)
-
srv, _, url := testServer(t, true, nil)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
ui := cli.NewMockUi()
cmd := &AllocSignalCommand{Meta: Meta{Ui: ui, flagAddress: url}}
@@ -71,7 +82,7 @@ func TestAllocSignalCommand_AutocompleteArgs(t *testing.T) {
// Create a fake alloc
state := srv.Agent.Server().State()
a := mock.Alloc()
- assert.Nil(state.UpsertAllocs(structs.MsgTypeTestSetup, 1000, []*structs.Allocation{a}))
+ must.NoError(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 1000, []*structs.Allocation{a}))
prefix := a.ID[:5]
args := complete.Args{All: []string{"signal", prefix}, Last: prefix}
@@ -79,34 +90,18 @@ func TestAllocSignalCommand_AutocompleteArgs(t *testing.T) {
// Match Allocs
res := predictor.Predict(args)
- assert.Equal(1, len(res))
- assert.Equal(a.ID, res[0])
+ must.Len(t, 1, res)
+ must.Eq(t, a.ID, res[0])
}
func TestAllocSignalCommand_Run(t *testing.T) {
ci.Parallel(t)
srv, client, url := testServer(t, true, nil)
- defer srv.Shutdown()
-
- require := require.New(t)
+ defer stopTestAgent(srv)
// Wait for a node to be ready
- testutil.WaitForResult(func() (bool, error) {
- nodes, _, err := client.Nodes().List(nil)
- if err != nil {
- return false, err
- }
- for _, node := range nodes {
- if _, ok := node.Drivers["mock_driver"]; ok &&
- node.Status == structs.NodeStatusReady {
- return true, nil
- }
- }
- return false, fmt.Errorf("no ready nodes")
- }, func(err error) {
- t.Fatalf("err: %v", err)
- })
+ waitForNodes(t, client)
ui := cli.NewMockUi()
cmd := &AllocSignalCommand{Meta: Meta{Ui: ui}}
@@ -114,34 +109,17 @@ func TestAllocSignalCommand_Run(t *testing.T) {
jobID := "job1_sfx"
job1 := testJob(jobID)
resp, _, err := client.Jobs().Register(job1, nil)
- require.NoError(err)
- if code := waitForSuccess(ui, client, fullId, t, resp.EvalID); code != 0 {
- t.Fatalf("status code non zero saw %d", code)
- }
- // get an alloc id
- allocId1 := ""
- if allocs, _, err := client.Jobs().Allocations(jobID, false, nil); err == nil {
- if len(allocs) > 0 {
- allocId1 = allocs[0].ID
- }
- }
- require.NotEmpty(allocId1, "unable to find allocation")
+ must.NoError(t, err)
+
+ code := waitForSuccess(ui, client, fullId, t, resp.EvalID)
+ must.Zero(t, code)
+
+ // Get an alloc id
+ allocID := getAllocFromJob(t, client, jobID)
// Wait for alloc to be running
- testutil.WaitForResult(func() (bool, error) {
- alloc, _, err := client.Allocations().Info(allocId1, nil)
- if err != nil {
- return false, err
- }
- if alloc.ClientStatus == api.AllocClientStatusRunning {
- return true, nil
- }
- return false, fmt.Errorf("alloc is not running, is: %s", alloc.ClientStatus)
- }, func(err error) {
- t.Fatalf("err: %v", err)
- })
-
- require.Equal(cmd.Run([]string{"-address=" + url, allocId1}), 0, "expected successful exit code")
-
- ui.OutputWriter.Reset()
+ waitForAllocRunning(t, client, allocID)
+
+ code = cmd.Run([]string{"-address=" + url, allocID})
+ must.Zero(t, code)
}
diff --git a/command/alloc_status.go b/command/alloc_status.go
index e8d26b6ce51..66f3589867d 100644
--- a/command/alloc_status.go
+++ b/command/alloc_status.go
@@ -8,14 +8,12 @@ import (
"strings"
"time"
- humanize "github.com/dustin/go-humanize"
+ "github.com/dustin/go-humanize"
"github.com/posener/complete"
"github.com/hashicorp/nomad/api"
"github.com/hashicorp/nomad/api/contexts"
- "github.com/hashicorp/nomad/client/allocrunner/taskrunner/restarts"
"github.com/hashicorp/nomad/helper"
- "github.com/hashicorp/nomad/nomad/structs"
)
type AllocStatusCommand struct {
@@ -201,10 +199,17 @@ func (c *AllocStatusCommand) Run(args []string) int {
}
c.Ui.Output(output)
+ // add allocation network addresses
if alloc.AllocatedResources != nil && len(alloc.AllocatedResources.Shared.Networks) > 0 && alloc.AllocatedResources.Shared.Networks[0].HasPorts() {
c.Ui.Output("")
c.Ui.Output(formatAllocNetworkInfo(alloc))
}
+
+ // add allocation nomad service discovery checks
+ if checkOutput := formatAllocNomadServiceChecks(alloc.ID, client); checkOutput != "" {
+ c.Ui.Output("")
+ c.Ui.Output(checkOutput)
+ }
}
if short {
@@ -357,7 +362,28 @@ func formatAllocNetworkInfo(alloc *api.Allocation) string {
mode = fmt.Sprintf(" (mode = %q)", nw.Mode)
}
- return fmt.Sprintf("Allocation Addresses%s\n%s", mode, formatList(addrs))
+ return fmt.Sprintf("Allocation Addresses%s:\n%s", mode, formatList(addrs))
+}
+
+func formatAllocNomadServiceChecks(allocID string, client *api.Client) string {
+ statuses, err := client.Allocations().Checks(allocID, nil)
+ if err != nil {
+ return ""
+ } else if len(statuses) == 0 {
+ return ""
+ }
+ results := []string{"Service|Task|Name|Mode|Status"}
+ for _, status := range statuses {
+ task := "(group)"
+ if status.Task != "" {
+ task = status.Task
+ }
+ // check | group | mode | status
+ s := fmt.Sprintf("%s|%s|%s|%s|%s", status.Service, task, status.Check, status.Mode, status.Status)
+ results = append(results, s)
+ }
+ sort.Strings(results[1:])
+ return fmt.Sprintf("Nomad Service Checks:\n%s", formatList(results))
}
// futureEvalTimePretty returns when the eval is eligible to reschedule
@@ -498,7 +524,7 @@ func buildDisplayMessage(event *api.TaskEvent) string {
desc = strings.Join(parts, ", ")
case api.TaskRestarting:
in := fmt.Sprintf("Task restarting in %v", time.Duration(event.StartDelay))
- if event.RestartReason != "" && event.RestartReason != restarts.ReasonWithinPolicy {
+ if event.RestartReason != "" && event.RestartReason != api.AllocRestartReasonWithinPolicy {
desc = fmt.Sprintf("%s - %s", event.RestartReason, in)
} else {
desc = in
@@ -555,7 +581,7 @@ func (c *AllocStatusCommand) outputTaskResources(alloc *api.Allocation, task str
return
}
- c.Ui.Output("Task Resources")
+ c.Ui.Output("Task Resources:")
var addr []string
for _, nw := range resource.Networks {
ports := append(nw.DynamicPorts, nw.ReservedPorts...) //nolint:gocritic
@@ -821,14 +847,14 @@ FOUND:
for _, volMount := range task.VolumeMounts {
volReq := tg.Volumes[*volMount.Volume]
switch volReq.Type {
- case structs.VolumeTypeHost:
+ case api.CSIVolumeTypeHost:
hostVolumesOutput = append(hostVolumesOutput,
fmt.Sprintf("%s|%v", volReq.Name, *volMount.ReadOnly))
- case structs.VolumeTypeCSI:
+ case api.CSIVolumeTypeCSI:
if verbose {
source := volReq.Source
if volReq.PerAlloc {
- source = source + structs.AllocSuffix(alloc.Name)
+ source = source + api.AllocSuffix(alloc.Name)
}
// there's an extra API call per volume here so we toggle it
diff --git a/command/alloc_status_test.go b/command/alloc_status_test.go
index 8f80003c439..4bec8a19839 100644
--- a/command/alloc_status_test.go
+++ b/command/alloc_status_test.go
@@ -3,7 +3,6 @@ package command
import (
"fmt"
"regexp"
- "strings"
"testing"
"time"
@@ -12,11 +11,9 @@ import (
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
- "github.com/hashicorp/nomad/testutil"
"github.com/mitchellh/cli"
"github.com/posener/complete"
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
+ "github.com/shoenig/test/must"
)
func TestAllocStatusCommand_Implements(t *testing.T) {
@@ -27,85 +24,71 @@ func TestAllocStatusCommand_Implements(t *testing.T) {
func TestAllocStatusCommand_Fails(t *testing.T) {
ci.Parallel(t)
srv, _, url := testServer(t, false, nil)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
ui := cli.NewMockUi()
cmd := &AllocStatusCommand{Meta: Meta{Ui: ui}}
// Fails on misuse
- if code := cmd.Run([]string{"some", "bad", "args"}); code != 1 {
- t.Fatalf("expected exit code 1, got: %d", code)
- }
- if out := ui.ErrorWriter.String(); !strings.Contains(out, commandErrorText(cmd)) {
- t.Fatalf("expected help output, got: %s", out)
- }
+ code := cmd.Run([]string{"some", "bad", "args"})
+ must.One(t, code)
+
+ out := ui.ErrorWriter.String()
+ must.StrContains(t, out, commandErrorText(cmd))
+
ui.ErrorWriter.Reset()
// Fails on connection failure
- if code := cmd.Run([]string{"-address=nope", "foobar"}); code != 1 {
- t.Fatalf("expected exit code 1, got: %d", code)
- }
- if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error querying allocation") {
- t.Fatalf("expected failed query error, got: %s", out)
- }
+ code = cmd.Run([]string{"-address=nope", "foobar"})
+ must.One(t, code)
+
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "Error querying allocation")
+
ui.ErrorWriter.Reset()
// Fails on missing alloc
- if code := cmd.Run([]string{"-address=" + url, "26470238-5CF2-438F-8772-DC67CFB0705C"}); code != 1 {
- t.Fatalf("expected exit 1, got: %d", code)
- }
- if out := ui.ErrorWriter.String(); !strings.Contains(out, "No allocation(s) with prefix or id") {
- t.Fatalf("expected not found error, got: %s", out)
- }
+ code = cmd.Run([]string{"-address=" + url, "26470238-5CF2-438F-8772-DC67CFB0705C"})
+ must.One(t, code)
+
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "No allocation(s) with prefix or id")
+
ui.ErrorWriter.Reset()
// Fail on identifier with too few characters
- if code := cmd.Run([]string{"-address=" + url, "2"}); code != 1 {
- t.Fatalf("expected exit 1, got: %d", code)
- }
- if out := ui.ErrorWriter.String(); !strings.Contains(out, "must contain at least two characters.") {
- t.Fatalf("expected too few characters error, got: %s", out)
- }
+ code = cmd.Run([]string{"-address=" + url, "2"})
+ must.One(t, code)
+
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "must contain at least two characters.")
+
ui.ErrorWriter.Reset()
// Identifiers with uneven length should produce a query result
- if code := cmd.Run([]string{"-address=" + url, "123"}); code != 1 {
- t.Fatalf("expected exit 1, got: %d", code)
- }
- if out := ui.ErrorWriter.String(); !strings.Contains(out, "No allocation(s) with prefix or id") {
- t.Fatalf("expected not found error, got: %s", out)
- }
+ code = cmd.Run([]string{"-address=" + url, "123"})
+ must.One(t, code)
+
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "No allocation(s) with prefix or id")
+
ui.ErrorWriter.Reset()
// Failed on both -json and -t options are specified
- if code := cmd.Run([]string{"-address=" + url, "-json", "-t", "{{.ID}}"}); code != 1 {
- t.Fatalf("expected exit 1, got: %d", code)
- }
- if out := ui.ErrorWriter.String(); !strings.Contains(out, "Both json and template formatting are not allowed") {
- t.Fatalf("expected getting formatter error, got: %s", out)
- }
+ code = cmd.Run([]string{"-address=" + url, "-json", "-t", "{{.ID}}"})
+ must.One(t, code)
+
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "Both json and template formatting are not allowed")
}
func TestAllocStatusCommand_LifecycleInfo(t *testing.T) {
ci.Parallel(t)
+
srv, client, url := testServer(t, true, nil)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
- // Wait for a node to be ready
- testutil.WaitForResult(func() (bool, error) {
- nodes, _, err := client.Nodes().List(nil)
- if err != nil {
- return false, err
- }
- for _, node := range nodes {
- if node.Status == structs.NodeStatusReady {
- return true, nil
- }
- }
- return false, fmt.Errorf("no ready nodes")
- }, func(err error) {
- require.NoError(t, err)
- })
+ waitForNodes(t, client)
ui := cli.NewMockUi()
cmd := &AllocStatusCommand{Meta: Meta{Ui: ui}}
@@ -137,39 +120,23 @@ func TestAllocStatusCommand_LifecycleInfo(t *testing.T) {
"prestart_sidecar": {State: "running"},
}
- require.Nil(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 1000, []*structs.Allocation{a}))
+ must.NoError(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 1000, []*structs.Allocation{a}))
- if code := cmd.Run([]string{"-address=" + url, a.ID}); code != 0 {
- t.Fatalf("expected exit 0, got: %d", code)
- }
- out := ui.OutputWriter.String()
+ code := cmd.Run([]string{"-address=" + url, a.ID})
+ must.Zero(t, code)
- require.Contains(t, out, `Task "init_task" (prestart) is "running"`)
- require.Contains(t, out, `Task "prestart_sidecar" (prestart sidecar) is "running"`)
- require.Contains(t, out, `Task "web" is "pending"`)
+ out := ui.OutputWriter.String()
+ must.StrContains(t, out, `Task "init_task" (prestart) is "running"`)
+ must.StrContains(t, out, `Task "prestart_sidecar" (prestart sidecar) is "running"`)
+ must.StrContains(t, out, `Task "web" is "pending"`)
}
func TestAllocStatusCommand_Run(t *testing.T) {
ci.Parallel(t)
srv, client, url := testServer(t, true, nil)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
- // Wait for a node to be ready
- testutil.WaitForResult(func() (bool, error) {
- nodes, _, err := client.Nodes().List(nil)
- if err != nil {
- return false, err
- }
- for _, node := range nodes {
- if _, ok := node.Drivers["mock_driver"]; ok &&
- node.Status == structs.NodeStatusReady {
- return true, nil
- }
- }
- return false, fmt.Errorf("no ready nodes")
- }, func(err error) {
- t.Fatalf("err: %v", err)
- })
+ waitForNodes(t, client)
ui := cli.NewMockUi()
cmd := &AllocStatusCommand{Meta: Meta{Ui: ui}}
@@ -177,100 +144,71 @@ func TestAllocStatusCommand_Run(t *testing.T) {
jobID := "job1_sfx"
job1 := testJob(jobID)
resp, _, err := client.Jobs().Register(job1, nil)
- if err != nil {
- t.Fatalf("err: %s", err)
- }
- if code := waitForSuccess(ui, client, fullId, t, resp.EvalID); code != 0 {
- t.Fatalf("status code non zero saw %d", code)
- }
+ must.NoError(t, err)
+
+ code := waitForSuccess(ui, client, fullId, t, resp.EvalID)
+ must.Zero(t, code)
+
// get an alloc id
- allocId1 := ""
+ allocID := ""
nodeName := ""
if allocs, _, err := client.Jobs().Allocations(jobID, false, nil); err == nil {
if len(allocs) > 0 {
- allocId1 = allocs[0].ID
+ allocID = allocs[0].ID
nodeName = allocs[0].NodeName
}
}
- if allocId1 == "" {
- t.Fatal("unable to find an allocation")
- }
+ must.NotEq(t, "", allocID)
- if code := cmd.Run([]string{"-address=" + url, allocId1}); code != 0 {
- t.Fatalf("expected exit 0, got: %d", code)
- }
- out := ui.OutputWriter.String()
- if !strings.Contains(out, "Created") {
- t.Fatalf("expected to have 'Created' but saw: %s", out)
- }
+ code = cmd.Run([]string{"-address=" + url, allocID})
+ must.Zero(t, code)
- if !strings.Contains(out, "Modified") {
- t.Fatalf("expected to have 'Modified' but saw: %s", out)
- }
+ out := ui.OutputWriter.String()
+ must.StrContains(t, out, "Created")
+ must.StrContains(t, out, "Modified")
nodeNameRegexpStr := fmt.Sprintf(`\nNode Name\s+= %s\n`, regexp.QuoteMeta(nodeName))
- require.Regexp(t, regexp.MustCompile(nodeNameRegexpStr), out)
+ must.RegexMatch(t, regexp.MustCompile(nodeNameRegexpStr), out)
ui.OutputWriter.Reset()
- if code := cmd.Run([]string{"-address=" + url, "-verbose", allocId1}); code != 0 {
- t.Fatalf("expected exit 0, got: %d", code)
- }
+ code = cmd.Run([]string{"-address=" + url, "-verbose", allocID})
+ must.Zero(t, code)
+
out = ui.OutputWriter.String()
- if !strings.Contains(out, allocId1) {
- t.Fatal("expected to find alloc id in output")
- }
- if !strings.Contains(out, "Created") {
- t.Fatalf("expected to have 'Created' but saw: %s", out)
- }
+ must.StrContains(t, out, allocID)
+ must.StrContains(t, out, "Created")
+
ui.OutputWriter.Reset()
// Try the query with an even prefix that includes the hyphen
- if code := cmd.Run([]string{"-address=" + url, allocId1[:13]}); code != 0 {
- t.Fatalf("expected exit 0, got: %d", code)
- }
+ code = cmd.Run([]string{"-address=" + url, allocID[:13]})
+ must.Zero(t, code)
+
out = ui.OutputWriter.String()
- if !strings.Contains(out, "Created") {
- t.Fatalf("expected to have 'Created' but saw: %s", out)
- }
+ must.StrContains(t, out, "Created")
ui.OutputWriter.Reset()
- if code := cmd.Run([]string{"-address=" + url, "-verbose", allocId1}); code != 0 {
- t.Fatalf("expected exit 0, got: %d", code)
- }
+ code = cmd.Run([]string{"-address=" + url, "-verbose", allocID})
+ must.Zero(t, code)
+
out = ui.OutputWriter.String()
- if !strings.Contains(out, allocId1) {
- t.Fatal("expected to find alloc id in output")
- }
- ui.OutputWriter.Reset()
+ must.StrContains(t, out, allocID)
+ // make sure nsd checks status output is elided if none exist
+ must.StrNotContains(t, out, `Nomad Service Checks:`)
}
func TestAllocStatusCommand_RescheduleInfo(t *testing.T) {
ci.Parallel(t)
srv, client, url := testServer(t, true, nil)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
- // Wait for a node to be ready
- testutil.WaitForResult(func() (bool, error) {
- nodes, _, err := client.Nodes().List(nil)
- if err != nil {
- return false, err
- }
- for _, node := range nodes {
- if node.Status == structs.NodeStatusReady {
- return true, nil
- }
- }
- return false, fmt.Errorf("no ready nodes")
- }, func(err error) {
- t.Fatalf("err: %v", err)
- })
+ waitForNodes(t, client)
ui := cli.NewMockUi()
cmd := &AllocStatusCommand{Meta: Meta{Ui: ui}}
// Test reschedule attempt info
- require := require.New(t)
state := srv.Agent.Server().State()
a := mock.Alloc()
a.Metrics = &structs.AllocMetric{}
@@ -285,41 +223,27 @@ func TestAllocStatusCommand_RescheduleInfo(t *testing.T) {
},
},
}
- require.Nil(state.UpsertAllocs(structs.MsgTypeTestSetup, 1000, []*structs.Allocation{a}))
+ must.NoError(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 1000, []*structs.Allocation{a}))
if code := cmd.Run([]string{"-address=" + url, a.ID}); code != 0 {
t.Fatalf("expected exit 0, got: %d", code)
}
out := ui.OutputWriter.String()
- require.Contains(out, "Replacement Alloc ID")
- require.Regexp(regexp.MustCompile(".*Reschedule Attempts\\s*=\\s*1/2"), out)
+ must.StrContains(t, out, "Replacement Alloc ID")
+ must.RegexMatch(t, regexp.MustCompile(".*Reschedule Attempts\\s*=\\s*1/2"), out)
}
func TestAllocStatusCommand_ScoreMetrics(t *testing.T) {
ci.Parallel(t)
srv, client, url := testServer(t, true, nil)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
- // Wait for a node to be ready
- testutil.WaitForResult(func() (bool, error) {
- nodes, _, err := client.Nodes().List(nil)
- if err != nil {
- return false, err
- }
- for _, node := range nodes {
- if node.Status == structs.NodeStatusReady {
- return true, nil
- }
- }
- return false, fmt.Errorf("no ready nodes")
- }, func(err error) {
- t.Fatalf("err: %v", err)
- })
+ waitForNodes(t, client)
ui := cli.NewMockUi()
cmd := &AllocStatusCommand{Meta: Meta{Ui: ui}}
+
// Test node metrics
- require := require.New(t)
state := srv.Agent.Server().State()
a := mock.Alloc()
mockNode1 := mock.Node()
@@ -342,27 +266,26 @@ func TestAllocStatusCommand_ScoreMetrics(t *testing.T) {
},
},
}
- require.Nil(state.UpsertAllocs(structs.MsgTypeTestSetup, 1000, []*structs.Allocation{a}))
+ must.NoError(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 1000, []*structs.Allocation{a}))
+
+ code := cmd.Run([]string{"-address=" + url, "-verbose", a.ID})
+ must.Zero(t, code)
- if code := cmd.Run([]string{"-address=" + url, "-verbose", a.ID}); code != 0 {
- t.Fatalf("expected exit 0, got: %d", code)
- }
out := ui.OutputWriter.String()
- require.Contains(out, "Placement Metrics")
- require.Contains(out, mockNode1.ID)
- require.Contains(out, mockNode2.ID)
+ must.StrContains(t, out, "Placement Metrics")
+ must.StrContains(t, out, mockNode1.ID)
+ must.StrContains(t, out, mockNode2.ID)
// assert we sort headers alphabetically
- require.Contains(out, "binpack node-affinity")
- require.Contains(out, "final score")
+ must.StrContains(t, out, "binpack node-affinity")
+ must.StrContains(t, out, "final score")
}
func TestAllocStatusCommand_AutocompleteArgs(t *testing.T) {
ci.Parallel(t)
- assert := assert.New(t)
srv, _, url := testServer(t, true, nil)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
ui := cli.NewMockUi()
cmd := &AllocStatusCommand{Meta: Meta{Ui: ui, flagAddress: url}}
@@ -370,15 +293,15 @@ func TestAllocStatusCommand_AutocompleteArgs(t *testing.T) {
// Create a fake alloc
state := srv.Agent.Server().State()
a := mock.Alloc()
- assert.Nil(state.UpsertAllocs(structs.MsgTypeTestSetup, 1000, []*structs.Allocation{a}))
+ must.NoError(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 1000, []*structs.Allocation{a}))
prefix := a.ID[:5]
args := complete.Args{Last: prefix}
predictor := cmd.AutocompleteArgs()
res := predictor.Predict(args)
- assert.Equal(1, len(res))
- assert.Equal(a.ID, res[0])
+ must.Len(t, 1, res)
+ must.Eq(t, a.ID, res[0])
}
func TestAllocStatusCommand_HostVolumes(t *testing.T) {
@@ -397,7 +320,8 @@ func TestAllocStatusCommand_HostVolumes(t *testing.T) {
},
}
})
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
+
state := srv.Agent.Server().State()
// Upsert the job and alloc
@@ -431,24 +355,25 @@ func TestAllocStatusCommand_HostVolumes(t *testing.T) {
},
}
summary := mock.JobSummary(alloc.JobID)
- require.NoError(t, state.UpsertJobSummary(1004, summary))
- require.NoError(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 1005, []*structs.Allocation{alloc}))
+ must.NoError(t, state.UpsertJobSummary(1004, summary))
+ must.NoError(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 1005, []*structs.Allocation{alloc}))
ui := cli.NewMockUi()
cmd := &AllocStatusCommand{Meta: Meta{Ui: ui}}
- if code := cmd.Run([]string{"-address=" + url, "-verbose", alloc.ID}); code != 0 {
- t.Fatalf("expected exit 0, got: %d", code)
- }
+ code := cmd.Run([]string{"-address=" + url, "-verbose", alloc.ID})
+ must.Zero(t, code)
+
out := ui.OutputWriter.String()
- require.Contains(t, out, "Host Volumes")
- require.Contains(t, out, fmt.Sprintf("%s true", vol0))
- require.NotContains(t, out, "CSI Volumes")
+ must.StrContains(t, out, "Host Volumes")
+ must.StrContains(t, out, fmt.Sprintf("%s true", vol0))
+ must.StrNotContains(t, out, "CSI Volumes")
}
func TestAllocStatusCommand_CSIVolumes(t *testing.T) {
ci.Parallel(t)
srv, _, url := testServer(t, true, nil)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
+
state := srv.Agent.Server().State()
// Upsert the node, plugin, and volume
@@ -462,7 +387,7 @@ func TestAllocStatusCommand_CSIVolumes(t *testing.T) {
},
}
err := state.UpsertNode(structs.MsgTypeTestSetup, 1001, node)
- require.NoError(t, err)
+ must.NoError(t, err)
vols := []*structs.CSIVolume{{
ID: vol0,
@@ -475,7 +400,7 @@ func TestAllocStatusCommand_CSIVolumes(t *testing.T) {
}},
}}
err = state.UpsertCSIVolume(1002, vols)
- require.NoError(t, err)
+ must.NoError(t, err)
// Upsert the job and alloc
alloc := mock.Alloc()
@@ -506,8 +431,8 @@ func TestAllocStatusCommand_CSIVolumes(t *testing.T) {
},
}
summary := mock.JobSummary(alloc.JobID)
- require.NoError(t, state.UpsertJobSummary(1004, summary))
- require.NoError(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 1005, []*structs.Allocation{alloc}))
+ must.NoError(t, state.UpsertJobSummary(1004, summary))
+ must.NoError(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 1005, []*structs.Allocation{alloc}))
ui := cli.NewMockUi()
cmd := &AllocStatusCommand{Meta: Meta{Ui: ui}}
@@ -515,7 +440,44 @@ func TestAllocStatusCommand_CSIVolumes(t *testing.T) {
t.Fatalf("expected exit 0, got: %d", code)
}
out := ui.OutputWriter.String()
- require.Contains(t, out, "CSI Volumes")
- require.Contains(t, out, fmt.Sprintf("%s minnie", vol0))
- require.NotContains(t, out, "Host Volumes")
+ must.StrContains(t, out, "CSI Volumes")
+ must.StrContains(t, out, fmt.Sprintf("%s minnie", vol0))
+ must.StrNotContains(t, out, "Host Volumes")
+}
+
+func TestAllocStatusCommand_NSD_Checks(t *testing.T) {
+ ci.Parallel(t)
+ srv, client, url := testServer(t, true, nil)
+ defer stopTestAgent(srv)
+
+ // wait for nodes
+ waitForNodes(t, client)
+
+ jobID := "job1_checks"
+ job1 := testNomadServiceJob(jobID)
+
+ resp, _, err := client.Jobs().Register(job1, nil)
+ must.NoError(t, err)
+
+ // wait for registration success
+ ui := cli.NewMockUi()
+ code := waitForSuccess(ui, client, fullId, t, resp.EvalID)
+ must.Zero(t, code)
+
+ // Get an alloc id
+ allocID := getAllocFromJob(t, client, jobID)
+
+ // do not wait for alloc running - it will stay pending because the
+ // health-check will never pass
+
+ // Run command
+ cmd := &AllocStatusCommand{Meta: Meta{Ui: ui, flagAddress: url}}
+ code = cmd.Run([]string{"-address=" + url, allocID})
+ must.Zero(t, code)
+
+ // check output
+ out := ui.OutputWriter.String()
+ must.StrContains(t, out, `Nomad Service Checks:`)
+ must.RegexMatch(t, regexp.MustCompile(`Service\s+Task\s+Name\s+Mode\s+Status`), out)
+ must.RegexMatch(t, regexp.MustCompile(`service1\s+\(group\)\s+check1\s+healthiness\s+(pending|failure)`), out)
}
diff --git a/command/alloc_stop_test.go b/command/alloc_stop_test.go
index 54b0f7c1e15..cb20fce3dd1 100644
--- a/command/alloc_stop_test.go
+++ b/command/alloc_stop_test.go
@@ -1,15 +1,11 @@
package command
import (
- "fmt"
"testing"
- "github.com/hashicorp/nomad/api"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/nomad/structs"
- "github.com/hashicorp/nomad/testutil"
"github.com/mitchellh/cli"
- "github.com/stretchr/testify/require"
+ "github.com/shoenig/test/must"
)
func TestAllocStopCommand_Implements(t *testing.T) {
@@ -19,62 +15,61 @@ func TestAllocStopCommand_Implements(t *testing.T) {
func TestAllocStop_Fails(t *testing.T) {
srv, _, url := testServer(t, false, nil)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
- require := require.New(t)
ui := cli.NewMockUi()
cmd := &AllocStopCommand{Meta: Meta{Ui: ui}}
// Fails on misuse
- require.Equal(cmd.Run([]string{"some", "garbage", "args"}), 1, "Expected failure")
- require.Contains(ui.ErrorWriter.String(), commandErrorText(cmd), "Expected help output")
+ code := cmd.Run([]string{"some", "garbage", "args"})
+ must.One(t, code)
+
+ out := ui.ErrorWriter.String()
+ must.StrContains(t, out, commandErrorText(cmd))
+
ui.ErrorWriter.Reset()
// Fails on connection failure
- require.Equal(cmd.Run([]string{"-address=nope", "foobar"}), 1, "expected failure")
- require.Contains(ui.ErrorWriter.String(), "Error querying allocation")
+ code = cmd.Run([]string{"-address=nope", "foobar"})
+ must.One(t, code)
+
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "Error querying allocation")
+
ui.ErrorWriter.Reset()
// Fails on missing alloc
- require.Equal(cmd.Run([]string{"-address=" + url, "26470238-5CF2-438F-8772-DC67CFB0705C"}), 1)
- require.Contains(ui.ErrorWriter.String(), "No allocation(s) with prefix or id")
+ code = cmd.Run([]string{"-address=" + url, "26470238-5CF2-438F-8772-DC67CFB0705C"})
+ must.One(t, code)
+
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "No allocation(s) with prefix or id")
ui.ErrorWriter.Reset()
// Fail on identifier with too few characters
- require.Equal(cmd.Run([]string{"-address=" + url, "2"}), 1)
- require.Contains(ui.ErrorWriter.String(), "must contain at least two characters")
+ code = cmd.Run([]string{"-address=" + url, "2"})
+ must.One(t, code)
+
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "must contain at least two characters")
ui.ErrorWriter.Reset()
// Identifiers with uneven length should produce a query result
- require.Equal(cmd.Run([]string{"-address=" + url, "123"}), 1)
- require.Contains(ui.ErrorWriter.String(), "No allocation(s) with prefix or id")
- ui.ErrorWriter.Reset()
+ code = cmd.Run([]string{"-address=" + url, "123"})
+ must.One(t, code)
+
+ out = ui.ErrorWriter.String()
+ must.StrContains(t, out, "No allocation(s) with prefix or id")
}
func TestAllocStop_Run(t *testing.T) {
ci.Parallel(t)
srv, client, url := testServer(t, true, nil)
- defer srv.Shutdown()
-
- require := require.New(t)
+ defer stopTestAgent(srv)
// Wait for a node to be ready
- testutil.WaitForResult(func() (bool, error) {
- nodes, _, err := client.Nodes().List(nil)
- if err != nil {
- return false, err
- }
- for _, node := range nodes {
- if _, ok := node.Drivers["mock_driver"]; ok &&
- node.Status == structs.NodeStatusReady {
- return true, nil
- }
- }
- return false, fmt.Errorf("no ready nodes")
- }, func(err error) {
- t.Fatalf("err: %v", err)
- })
+ waitForNodes(t, client)
ui := cli.NewMockUi()
cmd := &AllocStopCommand{Meta: Meta{Ui: ui}}
@@ -82,34 +77,23 @@ func TestAllocStop_Run(t *testing.T) {
jobID := "job1_sfx"
job1 := testJob(jobID)
resp, _, err := client.Jobs().Register(job1, nil)
- require.NoError(err)
- if code := waitForSuccess(ui, client, fullId, t, resp.EvalID); code != 0 {
- t.Fatalf("status code non zero saw %d", code)
- }
+ must.NoError(t, err)
+
+ code := waitForSuccess(ui, client, fullId, t, resp.EvalID)
+ must.Zero(t, code)
+
// get an alloc id
- allocId1 := ""
+ allocID := ""
if allocs, _, err := client.Jobs().Allocations(jobID, false, nil); err == nil {
if len(allocs) > 0 {
- allocId1 = allocs[0].ID
+ allocID = allocs[0].ID
}
}
- require.NotEmpty(allocId1, "unable to find allocation")
+ must.NotEq(t, "", allocID)
// Wait for alloc to be running
- testutil.WaitForResult(func() (bool, error) {
- alloc, _, err := client.Allocations().Info(allocId1, nil)
- if err != nil {
- return false, err
- }
- if alloc.ClientStatus == api.AllocClientStatusRunning {
- return true, nil
- }
- return false, fmt.Errorf("alloc is not running, is: %s", alloc.ClientStatus)
- }, func(err error) {
- t.Fatalf("err: %v", err)
- })
-
- require.Equal(cmd.Run([]string{"-address=" + url, allocId1}), 0, "expected successful exit code")
+ waitForAllocRunning(t, client, allocID)
- ui.OutputWriter.Reset()
+ code = cmd.Run([]string{"-address=" + url, allocID})
+ must.Zero(t, code)
}
diff --git a/command/check_test.go b/command/check_test.go
index ea6af4f8db2..21945859848 100644
--- a/command/check_test.go
+++ b/command/check_test.go
@@ -6,25 +6,22 @@ import (
"github.com/hashicorp/nomad/ci"
"github.com/mitchellh/cli"
+ "github.com/shoenig/test/must"
)
func TestAgentCheckCommand_ServerHealth(t *testing.T) {
ci.Parallel(t)
srv, _, url := testServer(t, false, nil)
- defer srv.Shutdown()
+ defer stopTestAgent(srv)
ui := cli.NewMockUi()
cmd := &AgentCheckCommand{Meta: Meta{Ui: ui}}
address := fmt.Sprintf("-address=%s", url)
code := cmd.Run([]string{address})
- if code != HealthPass {
- t.Fatalf("expected exit: %v, actual: %d", HealthPass, code)
- }
+ must.Eq(t, HealthPass, code)
minPeers := fmt.Sprintf("-min-peers=%v", 3)
code = cmd.Run([]string{address, minPeers})
- if code != HealthCritical {
- t.Fatalf("expected exitcode: %v, actual: %v", HealthCritical, code)
- }
+ must.Eq(t, HealthCritical, code)
}
diff --git a/command/commands.go b/command/commands.go
index d8daa74259f..9e4fb6792d3 100644
--- a/command/commands.go
+++ b/command/commands.go
@@ -207,6 +207,11 @@ func Commands(metaPtr *Meta, agentUi cli.Ui) map[string]cli.CommandFactory {
Meta: meta,
}, nil
},
+ "alloc checks": func() (cli.Command, error) {
+ return &AllocChecksCommand{
+ Meta: meta,
+ }, nil
+ },
"alloc status": func() (cli.Command, error) {
return &AllocStatusCommand{
Meta: meta,
@@ -941,6 +946,11 @@ func Commands(metaPtr *Meta, agentUi cli.Ui) map[string]cli.CommandFactory {
Meta: meta,
}, nil
},
+ "var init": func() (cli.Command, error) {
+ return &VarInitCommand{
+ Meta: meta,
+ }, nil
+ },
"version": func() (cli.Command, error) {
return &VersionCommand{
Version: version.GetVersion(),
diff --git a/command/config_validate_test.go b/command/config_validate_test.go
index 111b15806ea..78ec2197fb9 100644
--- a/command/config_validate_test.go
+++ b/command/config_validate_test.go
@@ -1,12 +1,13 @@
package command
import (
- "io/ioutil"
+ "os"
"path/filepath"
"testing"
"github.com/hashicorp/nomad/ci"
"github.com/mitchellh/cli"
+ "github.com/shoenig/test/must"
)
func TestConfigValidateCommand_FailWithEmptyDir(t *testing.T) {
@@ -18,9 +19,7 @@ func TestConfigValidateCommand_FailWithEmptyDir(t *testing.T) {
args := []string{fh}
code := cmd.Run(args)
- if code != 1 {
- t.Fatalf("expected exit 1, actual: %d", code)
- }
+ must.One(t, code)
}
func TestConfigValidateCommand_SucceedWithMinimalConfigFile(t *testing.T) {
@@ -28,22 +27,18 @@ func TestConfigValidateCommand_SucceedWithMinimalConfigFile(t *testing.T) {
fh := t.TempDir()
fp := filepath.Join(fh, "config.hcl")
- err := ioutil.WriteFile(fp, []byte(`data_dir="/"
+ err := os.WriteFile(fp, []byte(`data_dir="/"
client {
enabled = true
}`), 0644)
- if err != nil {
- t.Fatalf("err: %s", err)
- }
+ must.NoError(t, err)
ui := cli.NewMockUi()
cmd := &ConfigValidateCommand{Meta: Meta{Ui: ui}}
args := []string{fh}
code := cmd.Run(args)
- if code != 0 {
- t.Fatalf("expected exit 0, actual: %d", code)
- }
+ must.Zero(t, code)
}
func TestConfigValidateCommand_FailOnParseBadConfigFile(t *testing.T) {
@@ -51,19 +46,15 @@ func TestConfigValidateCommand_FailOnParseBadConfigFile(t *testing.T) {
fh := t.TempDir()
fp := filepath.Join(fh, "config.hcl")
- err := ioutil.WriteFile(fp, []byte(`a: b`), 0644)
- if err != nil {
- t.Fatalf("err: %s", err)
- }
+ err := os.WriteFile(fp, []byte(`a: b`), 0644)
+ must.NoError(t, err)
ui := cli.NewMockUi()
cmd := &ConfigValidateCommand{Meta: Meta{Ui: ui}}
args := []string{fh}
code := cmd.Run(args)
- if code != 1 {
- t.Fatalf("expected exit 1, actual: %d", code)
- }
+ must.One(t, code)
}
func TestConfigValidateCommand_FailOnValidateParsableConfigFile(t *testing.T) {
@@ -71,20 +62,16 @@ func TestConfigValidateCommand_FailOnValidateParsableConfigFile(t *testing.T) {
fh := t.TempDir()
fp := filepath.Join(fh, "config.hcl")
- err := ioutil.WriteFile(fp, []byte(`data_dir="../"
+ err := os.WriteFile(fp, []byte(`data_dir="../"
client {
- enabled = true
+ enabled = true
}`), 0644)
- if err != nil {
- t.Fatalf("err: %s", err)
- }
+ must.NoError(t, err)
ui := cli.NewMockUi()
cmd := &ConfigValidateCommand{Meta: Meta{Ui: ui}}
args := []string{fh}
code := cmd.Run(args)
- if code != 1 {
- t.Fatalf("expected exit 1, actual: %d", code)
- }
+ must.One(t, code)
}
diff --git a/command/data_format.go b/command/data_format.go
index d6d2cb3e065..cb9a0761a34 100644
--- a/command/data_format.go
+++ b/command/data_format.go
@@ -16,7 +16,7 @@ var (
}
)
-//DataFormatter is a transformer of the data.
+// DataFormatter is a transformer of the data.
type DataFormatter interface {
// TransformData should return transformed string data.
TransformData(interface{}) (string, error)
diff --git a/command/deployment_status.go b/command/deployment_status.go
index 3cbed7b6e43..590e6ecf700 100644
--- a/command/deployment_status.go
+++ b/command/deployment_status.go
@@ -13,7 +13,6 @@ import (
"github.com/gosuri/uilive"
"github.com/hashicorp/nomad/api"
"github.com/hashicorp/nomad/api/contexts"
- "github.com/hashicorp/nomad/nomad/structs"
"github.com/mitchellh/go-glint"
"github.com/mitchellh/go-glint/components"
"github.com/moby/term"
@@ -300,7 +299,7 @@ UPDATE:
).Row().MarginLeft(2)
switch status {
- case structs.DeploymentStatusFailed:
+ case api.DeploymentStatusFailed:
if hasAutoRevert(deploy) {
// Separate rollback monitoring from failed deployment
d.Set(
@@ -340,12 +339,12 @@ UPDATE:
).Row().MarginLeft(2)
break UPDATE
}
- case structs.DeploymentStatusSuccessful:
+ case api.DeploymentStatusSuccessful:
endSpinner = glint.Layout(
glint.Text(fmt.Sprintf("✓ Deployment %q %s", limit(deployID, length), status)),
).Row().MarginLeft(2)
break UPDATE
- case structs.DeploymentStatusCancelled, structs.DeploymentStatusBlocked:
+ case api.DeploymentStatusCancelled, api.DeploymentStatusBlocked:
endSpinner = glint.Layout(
glint.Text(fmt.Sprintf("! Deployment %q %s", limit(deployID, length), status)),
).Row().MarginLeft(2)
@@ -415,7 +414,7 @@ func (c *DeploymentStatusCommand) defaultMonitor(client *api.Client, deployID st
}
switch status {
- case structs.DeploymentStatusFailed:
+ case api.DeploymentStatusFailed:
if hasAutoRevert(deploy) {
// Wait for rollback to launch
time.Sleep(1 * time.Second)
@@ -443,7 +442,7 @@ func (c *DeploymentStatusCommand) defaultMonitor(client *api.Client, deployID st
}
return
- case structs.DeploymentStatusSuccessful, structs.DeploymentStatusCancelled, structs.DeploymentStatusBlocked:
+ case api.DeploymentStatusSuccessful, api.DeploymentStatusCancelled, api.DeploymentStatusBlocked:
return
default:
q.WaitIndex = meta.LastIndex
diff --git a/command/helper_devices_test.go b/command/helper_devices_test.go
index 062a4c1b1fb..17577d09468 100644
--- a/command/helper_devices_test.go
+++ b/command/helper_devices_test.go
@@ -5,7 +5,7 @@ import (
"github.com/hashicorp/nomad/api"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
@@ -31,12 +31,12 @@ func TestBuildDeviceStatsSummaryMap(t *testing.T) {
InstanceStats: map[string]*api.DeviceStats{
"id1": {
Summary: &api.StatValue{
- StringVal: helper.StringToPtr("stat1"),
+ StringVal: pointer.Of("stat1"),
},
},
"id2": {
Summary: &api.StatValue{
- IntNumeratorVal: helper.Int64ToPtr(2),
+ IntNumeratorVal: pointer.Of(int64(2)),
},
},
},
@@ -47,12 +47,12 @@ func TestBuildDeviceStatsSummaryMap(t *testing.T) {
InstanceStats: map[string]*api.DeviceStats{
"id1": {
Summary: &api.StatValue{
- StringVal: helper.StringToPtr("stat3"),
+ StringVal: pointer.Of("stat3"),
},
},
"id2": {
Summary: &api.StatValue{
- IntNumeratorVal: helper.Int64ToPtr(4),
+ IntNumeratorVal: pointer.Of(int64(4)),
},
},
},
@@ -61,16 +61,16 @@ func TestBuildDeviceStatsSummaryMap(t *testing.T) {
expected := map[string]*api.StatValue{
"vendor1/type1/name1[id1]": {
- StringVal: helper.StringToPtr("stat1"),
+ StringVal: pointer.Of("stat1"),
},
"vendor1/type1/name1[id2]": {
- IntNumeratorVal: helper.Int64ToPtr(2),
+ IntNumeratorVal: pointer.Of(int64(2)),
},
"vendor2/type2[id1]": {
- StringVal: helper.StringToPtr("stat3"),
+ StringVal: pointer.Of("stat3"),
},
"vendor2/type2[id2]": {
- IntNumeratorVal: helper.Int64ToPtr(4),
+ IntNumeratorVal: pointer.Of(int64(4)),
},
}
@@ -82,7 +82,7 @@ func TestFormatDeviceStats(t *testing.T) {
statValue := func(v string) *api.StatValue {
return &api.StatValue{
- StringVal: helper.StringToPtr(v),
+ StringVal: pointer.Of(v),
}
}
@@ -145,12 +145,12 @@ func TestNodeStatusCommand_GetDeviceResourcesForNode(t *testing.T) {
InstanceStats: map[string]*api.DeviceStats{
"id1": {
Summary: &api.StatValue{
- StringVal: helper.StringToPtr("stat1"),
+ StringVal: pointer.Of("stat1"),
},
},
"id2": {
Summary: &api.StatValue{
- IntNumeratorVal: helper.Int64ToPtr(2),
+ IntNumeratorVal: pointer.Of(int64(2)),
},
},
},
@@ -161,12 +161,12 @@ func TestNodeStatusCommand_GetDeviceResourcesForNode(t *testing.T) {
InstanceStats: map[string]*api.DeviceStats{
"id1": {
Summary: &api.StatValue{
- StringVal: helper.StringToPtr("stat3"),
+ StringVal: pointer.Of("stat3"),
},
},
"id2": {
Summary: &api.StatValue{
- IntNumeratorVal: helper.Int64ToPtr(4),
+ IntNumeratorVal: pointer.Of(int64(4)),
},
},
},
@@ -219,12 +219,12 @@ func TestNodeStatusCommand_GetDeviceResources(t *testing.T) {
InstanceStats: map[string]*api.DeviceStats{
"id1": {
Summary: &api.StatValue{
- StringVal: helper.StringToPtr("stat1"),
+ StringVal: pointer.Of("stat1"),
},
},
"id2": {
Summary: &api.StatValue{
- IntNumeratorVal: helper.Int64ToPtr(2),
+ IntNumeratorVal: pointer.Of(int64(2)),
},
},
},
@@ -235,12 +235,12 @@ func TestNodeStatusCommand_GetDeviceResources(t *testing.T) {
InstanceStats: map[string]*api.DeviceStats{
"id1": {
Summary: &api.StatValue{
- StringVal: helper.StringToPtr("stat3"),
+ StringVal: pointer.Of("stat3"),
},
},
"id2": {
Summary: &api.StatValue{
- IntNumeratorVal: helper.Int64ToPtr(4),
+ IntNumeratorVal: pointer.Of(int64(4)),
},
},
},
@@ -267,11 +267,11 @@ func TestGetDeviceAttributes(t *testing.T) {
Attributes: map[string]*api.Attribute{
"utilization": {
- FloatVal: helper.Float64ToPtr(0.78),
+ FloatVal: pointer.Of(float64(0.78)),
Unit: "%",
},
"filesystem": {
- StringVal: helper.StringToPtr("ext4"),
+ StringVal: pointer.Of("ext4"),
},
},
}
diff --git a/command/helpers_test.go b/command/helpers_test.go
index 1c19f2dd108..187afee2287 100644
--- a/command/helpers_test.go
+++ b/command/helpers_test.go
@@ -14,8 +14,8 @@ import (
"github.com/hashicorp/nomad/api"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
"github.com/hashicorp/nomad/helper/flatmap"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/kr/pretty"
"github.com/mitchellh/cli"
"github.com/stretchr/testify/require"
@@ -229,18 +229,18 @@ const (
var (
expectedApiJob = &api.Job{
- ID: helper.StringToPtr("job1"),
- Name: helper.StringToPtr("job1"),
- Type: helper.StringToPtr("service"),
+ ID: pointer.Of("job1"),
+ Name: pointer.Of("job1"),
+ Type: pointer.Of("service"),
Datacenters: []string{"dc1"},
TaskGroups: []*api.TaskGroup{
{
- Name: helper.StringToPtr("group1"),
- Count: helper.IntToPtr(1),
+ Name: pointer.Of("group1"),
+ Count: pointer.Of(1),
RestartPolicy: &api.RestartPolicy{
- Attempts: helper.IntToPtr(10),
- Interval: helper.TimeToPtr(15 * time.Second),
- Mode: helper.StringToPtr("delay"),
+ Attempts: pointer.Of(10),
+ Interval: pointer.Of(15 * time.Second),
+ Mode: pointer.Of("delay"),
},
Tasks: []*api.Task{
@@ -347,7 +347,7 @@ job "example" {
}
`
- setEnv(t, "NOMAD_VAR_var4", "from-envvar")
+ t.Setenv("NOMAD_VAR_var4", "from-envvar")
cliArgs := []string{`var2=from-cli`}
fileVars := `var3 = "from-varfile"`
diff --git a/command/job_periodic_force_test.go b/command/job_periodic_force_test.go
index b7ffc19e0ea..bbae868b26e 100644
--- a/command/job_periodic_force_test.go
+++ b/command/job_periodic_force_test.go
@@ -6,7 +6,7 @@ import (
"github.com/hashicorp/nomad/api"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
"github.com/hashicorp/nomad/testutil"
@@ -136,10 +136,10 @@ func TestJobPeriodicForceCommand_SuccessfulPeriodicForceDetach(t *testing.T) {
// Register a job
j := testJob("job1_is_periodic")
j.Periodic = &api.PeriodicConfig{
- SpecType: helper.StringToPtr(api.PeriodicSpecCron),
- Spec: helper.StringToPtr("*/15 * * * * *"),
- ProhibitOverlap: helper.BoolToPtr(true),
- TimeZone: helper.StringToPtr("Europe/Minsk"),
+ SpecType: pointer.Of(api.PeriodicSpecCron),
+ Spec: pointer.Of("*/15 * * * * *"),
+ ProhibitOverlap: pointer.Of(true),
+ TimeZone: pointer.Of("Europe/Minsk"),
}
ui := cli.NewMockUi()
@@ -178,10 +178,10 @@ func TestJobPeriodicForceCommand_SuccessfulPeriodicForce(t *testing.T) {
// Register a job
j := testJob("job2_is_periodic")
j.Periodic = &api.PeriodicConfig{
- SpecType: helper.StringToPtr(api.PeriodicSpecCron),
- Spec: helper.StringToPtr("*/15 * * * * *"),
- ProhibitOverlap: helper.BoolToPtr(true),
- TimeZone: helper.StringToPtr("Europe/Minsk"),
+ SpecType: pointer.Of(api.PeriodicSpecCron),
+ Spec: pointer.Of("*/15 * * * * *"),
+ ProhibitOverlap: pointer.Of(true),
+ TimeZone: pointer.Of("Europe/Minsk"),
}
ui := cli.NewMockUi()
diff --git a/command/job_plan.go b/command/job_plan.go
index 540f5363249..c13f78b38bf 100644
--- a/command/job_plan.go
+++ b/command/job_plan.go
@@ -2,11 +2,13 @@ package command
import (
"fmt"
+ "os"
"sort"
"strings"
"time"
"github.com/hashicorp/nomad/api"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/scheduler"
"github.com/posener/complete"
)
@@ -62,6 +64,10 @@ Alias: nomad plan
* 1: Allocations created or destroyed.
* 255: Error determining plan results.
+ The plan command will set the vault_token of the job based on the following
+ precedence, going from highest to lowest: the -vault-token flag, the
+ $VAULT_TOKEN environment variable and finally the value in the job file.
+
When ACLs are enabled, this command requires a token with the 'submit-job'
capability for the job's namespace.
@@ -91,6 +97,22 @@ Plan Options:
-policy-override
Sets the flag to force override any soft mandatory Sentinel policies.
+ -vault-token
+ Used to validate if the user submitting the job has permission to run the job
+ according to its Vault policies. A Vault token must be supplied if the vault
+ stanza allow_unauthenticated is disabled in the Nomad server configuration.
+ If the -vault-token flag is set, the passed Vault token is added to the jobspec
+ before sending to the Nomad servers. This allows passing the Vault token
+ without storing it in the job file. This overrides the token found in the
+ $VAULT_TOKEN environment variable and the vault_token field in the job file.
+ This token is cleared from the job after validating and cannot be used within
+ the job executing environment. Use the vault stanza when templating in a job
+ with a Vault token.
+
+ -vault-namespace
+ If set, the passed Vault namespace is stored in the job before sending to the
+ Nomad servers.
+
-var 'key=value'
Variable for template, can be used multiple times.
@@ -116,6 +138,8 @@ func (c *JobPlanCommand) AutocompleteFlags() complete.Flags {
"-json": complete.PredictNothing,
"-hcl1": complete.PredictNothing,
"-hcl2-strict": complete.PredictNothing,
+ "-vault-token": complete.PredictAnything,
+ "-vault-namespace": complete.PredictAnything,
"-var": complete.PredictAnything,
"-var-file": complete.PredictFiles("*.var"),
})
@@ -132,6 +156,7 @@ func (c *JobPlanCommand) AutocompleteArgs() complete.Predictor {
func (c *JobPlanCommand) Name() string { return "job plan" }
func (c *JobPlanCommand) Run(args []string) int {
var diff, policyOverride, verbose bool
+ var vaultToken, vaultNamespace string
flagSet := c.Meta.FlagSet(c.Name(), FlagSetClient)
flagSet.Usage = func() { c.Ui.Output(c.Help()) }
@@ -141,6 +166,8 @@ func (c *JobPlanCommand) Run(args []string) int {
flagSet.BoolVar(&c.JobGetter.JSON, "json", false, "")
flagSet.BoolVar(&c.JobGetter.HCL1, "hcl1", false, "")
flagSet.BoolVar(&c.JobGetter.Strict, "hcl2-strict", true, "")
+ flagSet.StringVar(&vaultToken, "vault-token", "", "")
+ flagSet.StringVar(&vaultNamespace, "vault-namespace", "", "")
flagSet.Var(&c.JobGetter.Vars, "var", "")
flagSet.Var(&c.JobGetter.VarFiles, "var-file", "")
@@ -186,6 +213,22 @@ func (c *JobPlanCommand) Run(args []string) int {
client.SetNamespace(*n)
}
+ // Parse the Vault token.
+ if vaultToken == "" {
+ // Check the environment variable
+ vaultToken = os.Getenv("VAULT_TOKEN")
+ }
+
+ // Set the vault token.
+ if vaultToken != "" {
+ job.VaultToken = pointer.Of(vaultToken)
+ }
+
+ // Set the vault namespace.
+ if vaultNamespace != "" {
+ job.VaultNamespace = pointer.Of(vaultNamespace)
+ }
+
// Setup the options
opts := &api.PlanOptions{}
if diff {
diff --git a/command/job_plan_test.go b/command/job_plan_test.go
index 4ef7a861d93..74f20f8797f 100644
--- a/command/job_plan_test.go
+++ b/command/job_plan_test.go
@@ -11,6 +11,7 @@ import (
"github.com/hashicorp/nomad/ci"
"github.com/hashicorp/nomad/testutil"
"github.com/mitchellh/cli"
+ "github.com/shoenig/test/must"
"github.com/stretchr/testify/require"
)
@@ -156,6 +157,60 @@ job "job1" {
ui.ErrorWriter.Reset()
}
+func TestPlanCommand_From_Files(t *testing.T) {
+ ci.Parallel(t)
+
+ // Create a Vault server
+ v := testutil.NewTestVault(t)
+ defer v.Stop()
+
+ // Create a Nomad server
+ s := testutil.NewTestServer(t, func(c *testutil.TestServerConfig) {
+ c.Vault.Address = v.HTTPAddr
+ c.Vault.Enabled = true
+ c.Vault.AllowUnauthenticated = false
+ c.Vault.Token = v.RootToken
+ })
+ defer s.Stop()
+
+ t.Run("fail to place", func(t *testing.T) {
+ ui := cli.NewMockUi()
+ cmd := &JobPlanCommand{Meta: Meta{Ui: ui}}
+ args := []string{"-address", "http://" + s.HTTPAddr, "testdata/example-basic.nomad"}
+ code := cmd.Run(args)
+ require.Equal(t, 1, code) // no client running, fail to place
+ must.StrContains(t, ui.OutputWriter.String(), "WARNING: Failed to place all allocations.")
+ })
+
+ t.Run("vault no token", func(t *testing.T) {
+ ui := cli.NewMockUi()
+ cmd := &JobPlanCommand{Meta: Meta{Ui: ui}}
+ args := []string{"-address", "http://" + s.HTTPAddr, "testdata/example-vault.nomad"}
+ code := cmd.Run(args)
+ must.Eq(t, 255, code)
+ must.StrContains(t, ui.ErrorWriter.String(), "* Vault used in the job but missing Vault token")
+ })
+
+ t.Run("vault bad token via flag", func(t *testing.T) {
+ ui := cli.NewMockUi()
+ cmd := &JobPlanCommand{Meta: Meta{Ui: ui}}
+ args := []string{"-address", "http://" + s.HTTPAddr, "-vault-token=abc123", "testdata/example-vault.nomad"}
+ code := cmd.Run(args)
+ must.Eq(t, 255, code)
+ must.StrContains(t, ui.ErrorWriter.String(), "* bad token")
+ })
+
+ t.Run("vault bad token via env", func(t *testing.T) {
+ t.Setenv("VAULT_TOKEN", "abc123")
+ ui := cli.NewMockUi()
+ cmd := &JobPlanCommand{Meta: Meta{Ui: ui}}
+ args := []string{"-address", "http://" + s.HTTPAddr, "testdata/example-vault.nomad"}
+ code := cmd.Run(args)
+ must.Eq(t, 255, code)
+ must.StrContains(t, ui.ErrorWriter.String(), "* bad token")
+ })
+}
+
func TestPlanCommand_From_URL(t *testing.T) {
ci.Parallel(t)
ui := cli.NewMockUi()
diff --git a/command/job_run.go b/command/job_run.go
index 805680f84b8..42547902959 100644
--- a/command/job_run.go
+++ b/command/job_run.go
@@ -10,7 +10,7 @@ import (
"time"
"github.com/hashicorp/nomad/api"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/posener/complete"
)
@@ -264,11 +264,11 @@ func (c *JobRunCommand) Run(args []string) int {
}
if consulToken != "" {
- job.ConsulToken = helper.StringToPtr(consulToken)
+ job.ConsulToken = pointer.Of(consulToken)
}
if consulNamespace != "" {
- job.ConsulNamespace = helper.StringToPtr(consulNamespace)
+ job.ConsulNamespace = pointer.Of(consulNamespace)
}
// Parse the Vault token
@@ -278,11 +278,11 @@ func (c *JobRunCommand) Run(args []string) int {
}
if vaultToken != "" {
- job.VaultToken = helper.StringToPtr(vaultToken)
+ job.VaultToken = pointer.Of(vaultToken)
}
if vaultNamespace != "" {
- job.VaultNamespace = helper.StringToPtr(vaultNamespace)
+ job.VaultNamespace = pointer.Of(vaultNamespace)
}
if output {
diff --git a/command/job_scale_test.go b/command/job_scale_test.go
index d3726c55c4a..a7fd2a4612b 100644
--- a/command/job_scale_test.go
+++ b/command/job_scale_test.go
@@ -7,7 +7,7 @@ import (
"github.com/hashicorp/nomad/api"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/testutil"
"github.com/mitchellh/cli"
)
@@ -83,17 +83,17 @@ func TestJobScaleCommand_MultiGroup(t *testing.T) {
SetConfig("run_for", "5s").
SetConfig("exit_code", 0).
Require(&api.Resources{
- MemoryMB: helper.IntToPtr(256),
- CPU: helper.IntToPtr(100),
+ MemoryMB: pointer.Of(256),
+ CPU: pointer.Of(100),
}).
SetLogConfig(&api.LogConfig{
- MaxFiles: helper.IntToPtr(1),
- MaxFileSizeMB: helper.IntToPtr(2),
+ MaxFiles: pointer.Of(1),
+ MaxFileSizeMB: pointer.Of(2),
})
group2 := api.NewTaskGroup("group2", 1).
AddTask(task).
RequireDisk(&api.EphemeralDisk{
- SizeMB: helper.IntToPtr(20),
+ SizeMB: pointer.Of(20),
})
job.AddTaskGroup(group2)
diff --git a/command/job_scaling_events_test.go b/command/job_scaling_events_test.go
index 5300212804d..eb062d277dc 100644
--- a/command/job_scaling_events_test.go
+++ b/command/job_scaling_events_test.go
@@ -6,7 +6,7 @@ import (
"testing"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/testutil"
"github.com/mitchellh/cli"
)
@@ -62,7 +62,7 @@ func TestJobScalingEventsCommand_Run(t *testing.T) {
// Perform a scaling action to generate an event.
_, _, err = client.Jobs().Scale(
"scale_events_test_job",
- "group1", helper.IntToPtr(2),
+ "group1", pointer.Of(2),
"searchable custom test message", false, nil, nil)
if err != nil {
t.Fatalf("err: %s", err)
diff --git a/command/job_status.go b/command/job_status.go
index aed0ddf7407..f129fc92288 100644
--- a/command/job_status.go
+++ b/command/job_status.go
@@ -8,7 +8,6 @@ import (
"github.com/hashicorp/nomad/api"
"github.com/hashicorp/nomad/api/contexts"
- "github.com/hashicorp/nomad/nomad/structs"
"github.com/posener/complete"
)
@@ -247,7 +246,7 @@ func (c *JobStatusCommand) outputPeriodicInfo(client *api.Client, job *api.Job)
}
// Generate the prefix that matches launched jobs from the periodic job.
- prefix := fmt.Sprintf("%s%s", *job.ID, structs.PeriodicLaunchSuffix)
+ prefix := fmt.Sprintf("%s%s", *job.ID, api.JobPeriodicLaunchSuffix)
children, _, err := client.Jobs().PrefixList(prefix)
if err != nil {
return fmt.Errorf("Error querying job: %s", err)
@@ -294,7 +293,7 @@ func (c *JobStatusCommand) outputParameterizedInfo(client *api.Client, job *api.
}
// Generate the prefix that matches launched jobs from the parameterized job.
- prefix := fmt.Sprintf("%s%s", *job.ID, structs.DispatchLaunchSuffix)
+ prefix := fmt.Sprintf("%s%s", *job.ID, api.JobDispatchLaunchSuffix)
children, _, err := client.Jobs().PrefixList(prefix)
if err != nil {
return fmt.Errorf("Error querying job: %s", err)
diff --git a/command/job_validate.go b/command/job_validate.go
index ba60e8cc526..258d1ee32fe 100644
--- a/command/job_validate.go
+++ b/command/job_validate.go
@@ -8,8 +8,7 @@ import (
"github.com/hashicorp/go-multierror"
"github.com/hashicorp/nomad/api"
"github.com/hashicorp/nomad/command/agent"
- "github.com/hashicorp/nomad/helper"
- "github.com/hashicorp/nomad/nomad/structs"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/posener/complete"
)
@@ -162,11 +161,11 @@ func (c *JobValidateCommand) Run(args []string) int {
}
if vaultToken != "" {
- job.VaultToken = helper.StringToPtr(vaultToken)
+ job.VaultToken = pointer.Of(vaultToken)
}
if vaultNamespace != "" {
- job.VaultNamespace = helper.StringToPtr(vaultNamespace)
+ job.VaultNamespace = pointer.Of(vaultNamespace)
}
// Check that the job is valid
@@ -222,6 +221,30 @@ func (c *JobValidateCommand) validateLocal(aj *api.Job) (*api.JobValidateRespons
}
}
- out.Warnings = structs.MergeMultierrorWarnings(job.Warnings())
+ out.Warnings = mergeMultierrorWarnings(job.Warnings())
return &out, nil
}
+
+func mergeMultierrorWarnings(errs ...error) string {
+ if len(errs) == 0 {
+ return ""
+ }
+
+ var mErr multierror.Error
+ _ = multierror.Append(&mErr, errs...)
+
+ mErr.ErrorFormat = warningsFormatter
+
+ return mErr.Error()
+}
+
+func warningsFormatter(es []error) string {
+ sb := strings.Builder{}
+ sb.WriteString(fmt.Sprintf("%d warning(s):\n", len(es)))
+
+ for i := range es {
+ sb.WriteString(fmt.Sprintf("\n* %s", es[i]))
+ }
+
+ return sb.String()
+}
diff --git a/command/meta_test.go b/command/meta_test.go
index 27724faaac5..1bb4d076ba4 100644
--- a/command/meta_test.go
+++ b/command/meta_test.go
@@ -92,7 +92,7 @@ func TestMeta_Colorize(t *testing.T) {
{
Name: "disable colors via env var",
SetupFn: func(t *testing.T, m *Meta) {
- setEnv(t, EnvNomadCLINoColor, "1")
+ t.Setenv(EnvNomadCLINoColor, "1")
m.SetupUi([]string{})
},
ExpectColor: false,
@@ -107,7 +107,7 @@ func TestMeta_Colorize(t *testing.T) {
{
Name: "force colors via env var",
SetupFn: func(t *testing.T, m *Meta) {
- setEnv(t, EnvNomadCLIForceColor, "1")
+ t.Setenv(EnvNomadCLIForceColor, "1")
m.SetupUi([]string{})
},
ExpectColor: true,
@@ -122,7 +122,7 @@ func TestMeta_Colorize(t *testing.T) {
{
Name: "no color take predecence over force color via env var",
SetupFn: func(t *testing.T, m *Meta) {
- setEnv(t, EnvNomadCLINoColor, "1")
+ t.Setenv(EnvNomadCLINoColor, "1")
m.SetupUi([]string{"-force-color"})
},
ExpectColor: false,
@@ -141,8 +141,8 @@ func TestMeta_Colorize(t *testing.T) {
os.Stdout = tty
// Make sure color related environment variables are clean.
- setEnv(t, EnvNomadCLIForceColor, "")
- setEnv(t, EnvNomadCLINoColor, "")
+ t.Setenv(EnvNomadCLIForceColor, "")
+ t.Setenv(EnvNomadCLINoColor, "")
// Run test case.
m := &Meta{}
diff --git a/command/monitor.go b/command/monitor.go
index 2214523fde8..88645fc13c3 100644
--- a/command/monitor.go
+++ b/command/monitor.go
@@ -8,7 +8,6 @@ import (
"time"
"github.com/hashicorp/nomad/api"
- "github.com/hashicorp/nomad/nomad/structs"
"github.com/mitchellh/cli"
)
@@ -35,7 +34,7 @@ type evalState struct {
// newEvalState creates and initializes a new monitorState
func newEvalState() *evalState {
return &evalState{
- status: structs.EvalStatusPending,
+ status: api.EvalStatusPending,
allocs: make(map[string]*allocState),
}
}
@@ -136,7 +135,7 @@ func (m *monitor) update(update *evalState) {
formatTime(time.Now()), limit(alloc.id, m.length),
limit(alloc.node, m.length), alloc.group))
- case alloc.desired == structs.AllocDesiredStatusRun:
+ case alloc.desired == api.AllocDesiredStatusRun:
// New allocation with desired status running
m.ui.Output(fmt.Sprintf(
"%s: Allocation %q created: node %q, group %q",
@@ -161,7 +160,7 @@ func (m *monitor) update(update *evalState) {
// Check if the status changed. We skip any transitions to pending status.
if existing.status != "" &&
- update.status != structs.AllocClientStatusPending &&
+ update.status != api.AllocClientStatusPending &&
existing.status != update.status {
m.ui.Output(fmt.Sprintf("%s: Evaluation status changed: %q -> %q",
formatTime(time.Now()), existing.status, update.status))
@@ -232,7 +231,7 @@ func (m *monitor) monitor(evalID string) int {
m.update(state)
switch eval.Status {
- case structs.EvalStatusComplete, structs.EvalStatusFailed, structs.EvalStatusCancelled:
+ case api.EvalStatusComplete, api.EvalStatusFailed, api.EvalStatusCancelled:
if len(eval.FailedTGAllocs) == 0 {
m.ui.Info(fmt.Sprintf("%s: Evaluation %q finished with status %q",
formatTime(time.Now()), limit(eval.ID, m.length), eval.Status))
@@ -301,7 +300,7 @@ func (m *monitor) monitor(evalID string) int {
meta.Ui = m.ui
cmd := &DeploymentStatusCommand{Meta: *meta}
status, err := cmd.monitor(m.client, dID, 0, verbose)
- if err != nil || status != structs.DeploymentStatusSuccessful {
+ if err != nil || status != api.DeploymentStatusSuccessful {
return 1
}
}
diff --git a/command/node_drain_test.go b/command/node_drain_test.go
index 02b3f11e02b..26eae57d774 100644
--- a/command/node_drain_test.go
+++ b/command/node_drain_test.go
@@ -10,7 +10,7 @@ import (
"github.com/hashicorp/nomad/api"
"github.com/hashicorp/nomad/ci"
"github.com/hashicorp/nomad/command/agent"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/testutil"
"github.com/mitchellh/cli"
"github.com/posener/complete"
@@ -49,12 +49,12 @@ func TestNodeDrainCommand_Detach(t *testing.T) {
// Register a job to create an alloc to drain that will block draining
job := &api.Job{
- ID: helper.StringToPtr("mock_service"),
- Name: helper.StringToPtr("mock_service"),
+ ID: pointer.Of("mock_service"),
+ Name: pointer.Of("mock_service"),
Datacenters: []string{"dc1"},
TaskGroups: []*api.TaskGroup{
{
- Name: helper.StringToPtr("mock_group"),
+ Name: pointer.Of("mock_group"),
Tasks: []*api.Task{
{
Name: "mock_task",
@@ -126,19 +126,19 @@ func TestNodeDrainCommand_Monitor(t *testing.T) {
// Register a service job to create allocs to drain
serviceCount := 3
job := &api.Job{
- ID: helper.StringToPtr("mock_service"),
- Name: helper.StringToPtr("mock_service"),
+ ID: pointer.Of("mock_service"),
+ Name: pointer.Of("mock_service"),
Datacenters: []string{"dc1"},
- Type: helper.StringToPtr("service"),
+ Type: pointer.Of("service"),
TaskGroups: []*api.TaskGroup{
{
- Name: helper.StringToPtr("mock_group"),
+ Name: pointer.Of("mock_group"),
Count: &serviceCount,
Migrate: &api.MigrateStrategy{
- MaxParallel: helper.IntToPtr(1),
- HealthCheck: helper.StringToPtr("task_states"),
- MinHealthyTime: helper.TimeToPtr(10 * time.Millisecond),
- HealthyDeadline: helper.TimeToPtr(5 * time.Minute),
+ MaxParallel: pointer.Of(1),
+ HealthCheck: pointer.Of("task_states"),
+ MinHealthyTime: pointer.Of(10 * time.Millisecond),
+ HealthyDeadline: pointer.Of(5 * time.Minute),
},
Tasks: []*api.Task{
{
@@ -148,8 +148,8 @@ func TestNodeDrainCommand_Monitor(t *testing.T) {
"run_for": "10m",
},
Resources: &api.Resources{
- CPU: helper.IntToPtr(50),
- MemoryMB: helper.IntToPtr(50),
+ CPU: pointer.Of(50),
+ MemoryMB: pointer.Of(50),
},
},
},
@@ -162,14 +162,14 @@ func TestNodeDrainCommand_Monitor(t *testing.T) {
// Register a system job to ensure it is ignored during draining
sysjob := &api.Job{
- ID: helper.StringToPtr("mock_system"),
- Name: helper.StringToPtr("mock_system"),
+ ID: pointer.Of("mock_system"),
+ Name: pointer.Of("mock_system"),
Datacenters: []string{"dc1"},
- Type: helper.StringToPtr("system"),
+ Type: pointer.Of("system"),
TaskGroups: []*api.TaskGroup{
{
- Name: helper.StringToPtr("mock_sysgroup"),
- Count: helper.IntToPtr(1),
+ Name: pointer.Of("mock_sysgroup"),
+ Count: pointer.Of(1),
Tasks: []*api.Task{
{
Name: "mock_systask",
@@ -178,8 +178,8 @@ func TestNodeDrainCommand_Monitor(t *testing.T) {
"run_for": "10m",
},
Resources: &api.Resources{
- CPU: helper.IntToPtr(50),
- MemoryMB: helper.IntToPtr(50),
+ CPU: pointer.Of(50),
+ MemoryMB: pointer.Of(50),
},
},
},
diff --git a/command/node_status.go b/command/node_status.go
index cd44f0154de..f212235cad7 100644
--- a/command/node_status.go
+++ b/command/node_status.go
@@ -12,8 +12,7 @@ import (
humanize "github.com/dustin/go-humanize"
"github.com/hashicorp/nomad/api"
"github.com/hashicorp/nomad/api/contexts"
- "github.com/hashicorp/nomad/helper"
- "github.com/hashicorp/nomad/nomad/structs"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/posener/complete"
)
@@ -409,7 +408,7 @@ func nodeCSIVolumeNames(n *api.Node, allocs []*api.Allocation) []string {
}
for _, v := range tg.Volumes {
- if v.Type == structs.VolumeTypeCSI {
+ if v.Type == api.CSIVolumeTypeCSI {
names = append(names, v.Name)
}
}
@@ -669,7 +668,7 @@ func (c *NodeStatusCommand) outputNodeCSIVolumeInfo(client *api.Client, node *ap
}
for _, v := range tg.Volumes {
- if v.Type == structs.VolumeTypeCSI {
+ if v.Type == api.CSIVolumeTypeCSI {
names = append(names, v.Name)
requests[v.Source] = v
}
@@ -943,9 +942,9 @@ func computeNodeTotalResources(node *api.Node) api.Resources {
if res == nil {
res = &api.Resources{}
}
- total.CPU = helper.IntToPtr(*r.CPU - *res.CPU)
- total.MemoryMB = helper.IntToPtr(*r.MemoryMB - *res.MemoryMB)
- total.DiskMB = helper.IntToPtr(*r.DiskMB - *res.DiskMB)
+ total.CPU = pointer.Of(*r.CPU - *res.CPU)
+ total.MemoryMB = pointer.Of(*r.MemoryMB - *res.MemoryMB)
+ total.DiskMB = pointer.Of(*r.DiskMB - *res.DiskMB)
return total
}
@@ -965,7 +964,11 @@ func getActualResources(client *api.Client, runningAllocs []*api.Allocation, nod
}
cpu += stats.ResourceUsage.CpuStats.TotalTicks
- mem += stats.ResourceUsage.MemoryStats.RSS
+ if stats.ResourceUsage.MemoryStats.Usage > 0 {
+ mem += stats.ResourceUsage.MemoryStats.Usage
+ } else {
+ mem += stats.ResourceUsage.MemoryStats.RSS
+ }
}
resources := make([]string, 2)
diff --git a/command/operator_debug.go b/command/operator_debug.go
index 74d7c7c05eb..d9b391e26ad 100644
--- a/command/operator_debug.go
+++ b/command/operator_debug.go
@@ -27,7 +27,6 @@ import (
"github.com/hashicorp/nomad/api"
"github.com/hashicorp/nomad/api/contexts"
"github.com/hashicorp/nomad/helper"
- "github.com/hashicorp/nomad/nomad/structs"
"github.com/hashicorp/nomad/version"
"github.com/posener/complete"
)
@@ -913,7 +912,7 @@ func (c *OperatorDebugCommand) collectAgentHost(path, id string, client *api.Cli
if err != nil {
c.Ui.Error(fmt.Sprintf("%s/%s: Failed to retrieve agent host data, err: %v", path, id, err))
- if strings.Contains(err.Error(), structs.ErrPermissionDenied.Error()) {
+ if strings.Contains(err.Error(), api.PermissionDeniedErrorContent) {
// Drop a hint to help the operator resolve the error
c.Ui.Warn("Agent host retrieval requires agent:read ACL or enable_debug=true. See https://www.nomadproject.io/api-docs/agent#host for more information.")
}
@@ -1004,7 +1003,7 @@ func (c *OperatorDebugCommand) collectPprof(path, id string, client *api.Client,
bs, err := client.Agent().CPUProfile(opts, c.queryOpts())
if err != nil {
c.Ui.Error(fmt.Sprintf("%s: Failed to retrieve pprof %s, err: %v", filename, path, err))
- if structs.IsErrPermissionDenied(err) {
+ if strings.Contains(err.Error(), api.PermissionDeniedErrorContent) {
// All Profiles require the same permissions, so we only need to see
// one permission failure before we bail.
// But lets first drop a hint to help the operator resolve the error
diff --git a/command/operator_debug_test.go b/command/operator_debug_test.go
index 04471ed7c80..d986ac26a29 100644
--- a/command/operator_debug_test.go
+++ b/command/operator_debug_test.go
@@ -19,6 +19,7 @@ import (
clienttest "github.com/hashicorp/nomad/client/testutil"
"github.com/hashicorp/nomad/command/agent"
"github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/nomad/state"
"github.com/hashicorp/nomad/testutil"
"github.com/mitchellh/cli"
@@ -884,7 +885,7 @@ func testServerWithoutLeader(t *testing.T, runClient bool, cb func(*agent.Config
a := agent.NewTestAgent(t, t.Name(), func(config *agent.Config) {
config.Client.Enabled = runClient
config.Server.Enabled = true
- config.Server.NumSchedulers = helper.IntToPtr(0)
+ config.Server.NumSchedulers = pointer.Of(0)
config.Server.BootstrapExpect = 3
if cb != nil {
diff --git a/command/quota_apply.go b/command/quota_apply.go
index 90bedbdfd3d..a60a0187680 100644
--- a/command/quota_apply.go
+++ b/command/quota_apply.go
@@ -198,6 +198,7 @@ func parseQuotaLimits(result *[]*api.QuotaLimit, list *ast.ObjectList) error {
valid := []string{
"region",
"region_limit",
+ "secure_variables_limit",
}
if err := helper.CheckHCLKeys(o.Val, valid); err != nil {
return err
diff --git a/command/quota_delete_test.go b/command/quota_delete_test.go
index f8afb707974..92f1e6ca970 100644
--- a/command/quota_delete_test.go
+++ b/command/quota_delete_test.go
@@ -9,7 +9,7 @@ import (
"github.com/hashicorp/nomad/api"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/mitchellh/cli"
"github.com/posener/complete"
"github.com/stretchr/testify/assert"
@@ -99,7 +99,7 @@ func testQuotaSpec() *api.QuotaSpec {
{
Region: "global",
RegionLimit: &api.Resources{
- CPU: helper.IntToPtr(100),
+ CPU: pointer.Of(100),
},
},
},
diff --git a/command/quota_init.go b/command/quota_init.go
index 01b420d2629..62254ce8e9d 100644
--- a/command/quota_init.go
+++ b/command/quota_init.go
@@ -121,6 +121,7 @@ limit {
memory = 1000
memory_max = 1000
}
+ secure_variables_limit = 1000
}
`)
@@ -135,7 +136,8 @@ var defaultJsonQuotaSpec = strings.TrimSpace(`
"CPU": 2500,
"MemoryMB": 1000,
"MemoryMaxMB": 1000
- }
+ },
+ "SecureVariablesLimit": 1000
}
]
}
diff --git a/command/quota_status.go b/command/quota_status.go
index 4e9434e4ce6..b87b839fec8 100644
--- a/command/quota_status.go
+++ b/command/quota_status.go
@@ -158,7 +158,7 @@ func formatQuotaLimits(spec *api.QuotaSpec, usages map[string]*api.QuotaUsage) s
sort.Sort(api.QuotaLimitSort(spec.Limits))
limits := make([]string, len(spec.Limits)+1)
- limits[0] = "Region|CPU Usage|Memory Usage|Memory Max Usage|Network Usage"
+ limits[0] = "Region|CPU Usage|Memory Usage|Memory Max Usage|Network Usage|Secure Variables Usage"
i := 0
for _, specLimit := range spec.Limits {
i++
@@ -185,7 +185,9 @@ func formatQuotaLimits(spec *api.QuotaSpec, usages map[string]*api.QuotaUsage) s
memory := fmt.Sprintf("- / %s", formatQuotaLimitInt(specLimit.RegionLimit.MemoryMB))
memoryMax := fmt.Sprintf("- / %s", formatQuotaLimitInt(specLimit.RegionLimit.MemoryMaxMB))
net := fmt.Sprintf("- / %s", formatQuotaLimitInt(&specBits))
- limits[i] = fmt.Sprintf("%s|%s|%s|%s|%s", specLimit.Region, cpu, memory, memoryMax, net)
+
+ vars := fmt.Sprintf("- / %s", formatQuotaLimitInt(specLimit.SecureVariablesLimit))
+ limits[i] = fmt.Sprintf("%s|%s|%s|%s|%s|%s", specLimit.Region, cpu, memory, memoryMax, net, vars)
continue
}
@@ -204,7 +206,9 @@ func formatQuotaLimits(spec *api.QuotaSpec, usages map[string]*api.QuotaUsage) s
if len(used.RegionLimit.Networks) == 1 {
net = fmt.Sprintf("%d / %s", *used.RegionLimit.Networks[0].MBits, formatQuotaLimitInt(&specBits))
}
- limits[i] = fmt.Sprintf("%s|%s|%s|%s|%s", specLimit.Region, cpu, memory, memoryMax, net)
+
+ vars := fmt.Sprintf("%d / %s", orZero(used.SecureVariablesLimit), formatQuotaLimitInt(specLimit.SecureVariablesLimit))
+ limits[i] = fmt.Sprintf("%s|%s|%s|%s|%s|%s", specLimit.Region, cpu, memory, memoryMax, net, vars)
}
return formatList(limits)
diff --git a/command/scaling_policy_info_test.go b/command/scaling_policy_info_test.go
index 962460bb704..8271477f26d 100644
--- a/command/scaling_policy_info_test.go
+++ b/command/scaling_policy_info_test.go
@@ -7,7 +7,7 @@ import (
"github.com/hashicorp/nomad/api"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/testutil"
"github.com/mitchellh/cli"
)
@@ -64,9 +64,9 @@ func TestScalingPolicyInfoCommand_Run(t *testing.T) {
// Generate an example scaling policy.
job.TaskGroups[0].Scaling = &api.ScalingPolicy{
- Enabled: helper.BoolToPtr(true),
- Min: helper.Int64ToPtr(1),
- Max: helper.Int64ToPtr(1),
+ Enabled: pointer.Of(true),
+ Min: pointer.Of(int64(1)),
+ Max: pointer.Of(int64(1)),
}
// Register the job.
diff --git a/command/scaling_policy_list_test.go b/command/scaling_policy_list_test.go
index 20439379d0f..36ffa400cfe 100644
--- a/command/scaling_policy_list_test.go
+++ b/command/scaling_policy_list_test.go
@@ -5,7 +5,7 @@ import (
"github.com/hashicorp/nomad/api"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/mitchellh/cli"
"github.com/stretchr/testify/require"
)
@@ -31,9 +31,9 @@ func TestScalingPolicyListCommand_Run(t *testing.T) {
// Generate an example scaling policy.
scalingPolicy := api.ScalingPolicy{
Type: api.ScalingPolicyTypeHorizontal,
- Enabled: helper.BoolToPtr(true),
- Min: helper.Int64ToPtr(1),
- Max: helper.Int64ToPtr(1),
+ Enabled: pointer.Of(true),
+ Min: pointer.Of(int64(1)),
+ Max: pointer.Of(int64(1)),
}
// Iterate the jobs, add the scaling policy and register.
diff --git a/command/testing_test.go b/command/testing_test.go
new file mode 100644
index 00000000000..c71e6107741
--- /dev/null
+++ b/command/testing_test.go
@@ -0,0 +1,189 @@
+package command
+
+import (
+ "fmt"
+ "os"
+ "testing"
+ "time"
+
+ "github.com/hashicorp/nomad/api"
+ "github.com/hashicorp/nomad/command/agent"
+ "github.com/hashicorp/nomad/helper/pointer"
+ "github.com/hashicorp/nomad/nomad/structs"
+ "github.com/hashicorp/nomad/testutil"
+ "github.com/shoenig/test/must"
+)
+
+func testServer(t *testing.T, runClient bool, cb func(*agent.Config)) (*agent.TestAgent, *api.Client, string) {
+ // Make a new test server
+ a := agent.NewTestAgent(t, t.Name(), func(config *agent.Config) {
+ config.Client.Enabled = runClient
+
+ if cb != nil {
+ cb(config)
+ }
+ })
+ t.Cleanup(func() { _ = a.Shutdown() })
+
+ c := a.Client()
+ return a, c, a.HTTPAddr()
+}
+
+// testClient starts a new test client, blocks until it joins, and performs
+// cleanup after the test is complete.
+func testClient(t *testing.T, name string, cb func(*agent.Config)) (*agent.TestAgent, *api.Client, string) {
+ t.Logf("Starting client agent %s", name)
+ a := agent.NewTestAgent(t, name, func(config *agent.Config) {
+ if cb != nil {
+ cb(config)
+ }
+ })
+ t.Cleanup(func() { _ = a.Shutdown() })
+
+ c := a.Client()
+ t.Logf("Waiting for client %s to join server(s) %s", name, a.GetConfig().Client.Servers)
+ testutil.WaitForClient(t, a.Agent.RPC, a.Agent.Client().NodeID(), a.Agent.Client().Region())
+
+ return a, c, a.HTTPAddr()
+}
+
+func testJob(jobID string) *api.Job {
+ task := api.NewTask("task1", "mock_driver").
+ SetConfig("kill_after", "1s").
+ SetConfig("run_for", "5s").
+ SetConfig("exit_code", 0).
+ Require(&api.Resources{
+ MemoryMB: pointer.Of(256),
+ CPU: pointer.Of(100),
+ }).
+ SetLogConfig(&api.LogConfig{
+ MaxFiles: pointer.Of(1),
+ MaxFileSizeMB: pointer.Of(2),
+ })
+
+ group := api.NewTaskGroup("group1", 1).
+ AddTask(task).
+ RequireDisk(&api.EphemeralDisk{
+ SizeMB: pointer.Of(20),
+ })
+
+ job := api.NewBatchJob(jobID, jobID, "global", 1).
+ AddDatacenter("dc1").
+ AddTaskGroup(group)
+
+ return job
+}
+
+func testNomadServiceJob(jobID string) *api.Job {
+ j := testJob(jobID)
+ j.TaskGroups[0].Services = []*api.Service{{
+ Name: "service1",
+ PortLabel: "1000",
+ AddressMode: "",
+ Address: "127.0.0.1",
+ Checks: []api.ServiceCheck{{
+ Name: "check1",
+ Type: "http",
+ Path: "/",
+ Interval: 1 * time.Second,
+ Timeout: 1 * time.Second,
+ }},
+ Provider: "nomad",
+ }}
+ return j
+}
+
+func testMultiRegionJob(jobID, region, datacenter string) *api.Job {
+ task := api.NewTask("task1", "mock_driver").
+ SetConfig("kill_after", "10s").
+ SetConfig("run_for", "15s").
+ SetConfig("exit_code", 0).
+ Require(&api.Resources{
+ MemoryMB: pointer.Of(256),
+ CPU: pointer.Of(100),
+ }).
+ SetLogConfig(&api.LogConfig{
+ MaxFiles: pointer.Of(1),
+ MaxFileSizeMB: pointer.Of(2),
+ })
+
+ group := api.NewTaskGroup("group1", 1).
+ AddTask(task).
+ RequireDisk(&api.EphemeralDisk{
+ SizeMB: pointer.Of(20),
+ })
+
+ job := api.NewServiceJob(jobID, jobID, region, 1).AddDatacenter(datacenter).AddTaskGroup(group)
+ job.Region = nil
+ job.Multiregion = &api.Multiregion{
+ Regions: []*api.MultiregionRegion{
+ {
+ Name: "east",
+ Datacenters: []string{"east-1"},
+ },
+ {
+ Name: "west",
+ Datacenters: []string{"west-1"},
+ },
+ },
+ }
+
+ return job
+}
+
+func waitForNodes(t *testing.T, client *api.Client) {
+ testutil.WaitForResult(func() (bool, error) {
+ nodes, _, err := client.Nodes().List(nil)
+ if err != nil {
+ return false, err
+ }
+ for _, node := range nodes {
+ if _, ok := node.Drivers["mock_driver"]; ok &&
+ node.Status == structs.NodeStatusReady {
+ return true, nil
+ }
+ }
+ return false, fmt.Errorf("no ready nodes")
+ }, func(err error) {
+ must.NoError(t, err)
+ })
+}
+
+func waitForAllocRunning(t *testing.T, client *api.Client, allocID string) {
+ testutil.WaitForResult(func() (bool, error) {
+ alloc, _, err := client.Allocations().Info(allocID, nil)
+ if err != nil {
+ return false, err
+ }
+ if alloc.ClientStatus == api.AllocClientStatusRunning {
+ return true, nil
+ }
+ return false, fmt.Errorf("alloc status: %s", alloc.ClientStatus)
+ }, func(err error) {
+ t.Fatalf("timed out waiting for alloc to be running: %v", err)
+ })
+}
+
+func getAllocFromJob(t *testing.T, client *api.Client, jobID string) string {
+ var allocID string
+ if allocations, _, err := client.Jobs().Allocations(jobID, false, nil); err == nil {
+ if len(allocations) > 0 {
+ allocID = allocations[0].ID
+ }
+ }
+ must.NotEq(t, "", allocID, must.Sprint("expected to find an evaluation after running job", jobID))
+ return allocID
+}
+
+func stopTestAgent(a *agent.TestAgent) {
+ _ = a.Shutdown()
+}
+
+func getTempFile(t *testing.T, name string) (string, func()) {
+ f, err := os.CreateTemp("", name)
+ must.NoError(t, err)
+ must.NoError(t, f.Close())
+ return f.Name(), func() {
+ _ = os.Remove(f.Name())
+ }
+}
diff --git a/command/ui_test.go b/command/ui_test.go
index 8b0d049aed8..621131703c5 100644
--- a/command/ui_test.go
+++ b/command/ui_test.go
@@ -43,38 +43,38 @@ func TestCommand_Ui(t *testing.T) {
{
Name: "set namespace via env var",
SetupFn: func(t *testing.T) {
- setEnv(t, "NOMAD_NAMESPACE", "dev")
+ t.Setenv("NOMAD_NAMESPACE", "dev")
},
ExpectedURL: "http://127.0.0.1:4646?namespace=dev",
},
{
Name: "set region via env var",
SetupFn: func(t *testing.T) {
- setEnv(t, "NOMAD_REGION", "earth")
+ t.Setenv("NOMAD_REGION", "earth")
},
ExpectedURL: "http://127.0.0.1:4646?region=earth",
},
{
Name: "set region and namespace via env var",
SetupFn: func(t *testing.T) {
- setEnv(t, "NOMAD_REGION", "earth")
- setEnv(t, "NOMAD_NAMESPACE", "dev")
+ t.Setenv("NOMAD_REGION", "earth")
+ t.Setenv("NOMAD_NAMESPACE", "dev")
},
ExpectedURL: "http://127.0.0.1:4646?namespace=dev®ion=earth",
},
{
Name: "set region and namespace via env var",
SetupFn: func(t *testing.T) {
- setEnv(t, "NOMAD_REGION", "earth")
- setEnv(t, "NOMAD_NAMESPACE", "dev")
+ t.Setenv("NOMAD_REGION", "earth")
+ t.Setenv("NOMAD_NAMESPACE", "dev")
},
ExpectedURL: "http://127.0.0.1:4646?namespace=dev®ion=earth",
},
{
Name: "flags have higher precedence",
SetupFn: func(t *testing.T) {
- setEnv(t, "NOMAD_REGION", "earth")
- setEnv(t, "NOMAD_NAMESPACE", "dev")
+ t.Setenv("NOMAD_REGION", "earth")
+ t.Setenv("NOMAD_NAMESPACE", "dev")
},
Args: []string{
"-region=mars",
@@ -87,8 +87,8 @@ func TestCommand_Ui(t *testing.T) {
for _, tc := range cases {
t.Run(tc.Name, func(t *testing.T) {
// Make sure environment variables are clean.
- setEnv(t, "NOMAD_NAMESPACE", "")
- setEnv(t, "NOMAD_REGION", "")
+ t.Setenv("NOMAD_NAMESPACE", "")
+ t.Setenv("NOMAD_REGION", "")
// Setup fake CLI UI and test case
ui := cli.NewMockUi()
diff --git a/command/util_test.go b/command/util_test.go
deleted file mode 100644
index 474b0ded2ba..00000000000
--- a/command/util_test.go
+++ /dev/null
@@ -1,123 +0,0 @@
-package command
-
-import (
- "os"
- "testing"
-
- "github.com/hashicorp/nomad/api"
- "github.com/hashicorp/nomad/command/agent"
- "github.com/hashicorp/nomad/helper"
- "github.com/hashicorp/nomad/testutil"
-)
-
-func testServer(t *testing.T, runClient bool, cb func(*agent.Config)) (*agent.TestAgent, *api.Client, string) {
- // Make a new test server
- a := agent.NewTestAgent(t, t.Name(), func(config *agent.Config) {
- config.Client.Enabled = runClient
-
- if cb != nil {
- cb(config)
- }
- })
- t.Cleanup(func() { a.Shutdown() })
-
- c := a.Client()
- return a, c, a.HTTPAddr()
-}
-
-// testClient starts a new test client, blocks until it joins, and performs
-// cleanup after the test is complete.
-func testClient(t *testing.T, name string, cb func(*agent.Config)) (*agent.TestAgent, *api.Client, string) {
- t.Logf("Starting client agent %s", name)
- a := agent.NewTestAgent(t, name, func(config *agent.Config) {
- if cb != nil {
- cb(config)
- }
- })
- t.Cleanup(func() { a.Shutdown() })
-
- c := a.Client()
- t.Logf("Waiting for client %s to join server(s) %s", name, a.GetConfig().Client.Servers)
- testutil.WaitForClient(t, a.Agent.RPC, a.Agent.Client().NodeID(), a.Agent.Client().Region())
-
- return a, c, a.HTTPAddr()
-}
-
-func testJob(jobID string) *api.Job {
- task := api.NewTask("task1", "mock_driver").
- SetConfig("kill_after", "1s").
- SetConfig("run_for", "5s").
- SetConfig("exit_code", 0).
- Require(&api.Resources{
- MemoryMB: helper.IntToPtr(256),
- CPU: helper.IntToPtr(100),
- }).
- SetLogConfig(&api.LogConfig{
- MaxFiles: helper.IntToPtr(1),
- MaxFileSizeMB: helper.IntToPtr(2),
- })
-
- group := api.NewTaskGroup("group1", 1).
- AddTask(task).
- RequireDisk(&api.EphemeralDisk{
- SizeMB: helper.IntToPtr(20),
- })
-
- job := api.NewBatchJob(jobID, jobID, "global", 1).
- AddDatacenter("dc1").
- AddTaskGroup(group)
-
- return job
-}
-
-func testMultiRegionJob(jobID, region, datacenter string) *api.Job {
- task := api.NewTask("task1", "mock_driver").
- SetConfig("kill_after", "10s").
- SetConfig("run_for", "15s").
- SetConfig("exit_code", 0).
- Require(&api.Resources{
- MemoryMB: helper.IntToPtr(256),
- CPU: helper.IntToPtr(100),
- }).
- SetLogConfig(&api.LogConfig{
- MaxFiles: helper.IntToPtr(1),
- MaxFileSizeMB: helper.IntToPtr(2),
- })
-
- group := api.NewTaskGroup("group1", 1).
- AddTask(task).
- RequireDisk(&api.EphemeralDisk{
- SizeMB: helper.IntToPtr(20),
- })
-
- job := api.NewServiceJob(jobID, jobID, region, 1).AddDatacenter(datacenter).AddTaskGroup(group)
- job.Region = nil
- job.Multiregion = &api.Multiregion{
- Regions: []*api.MultiregionRegion{
- {
- Name: "east",
- Datacenters: []string{"east-1"},
- },
- {
- Name: "west",
- Datacenters: []string{"west-1"},
- },
- },
- }
-
- return job
-}
-
-// setEnv wraps os.Setenv(key, value) and restores the environment variable to initial value in test cleanup
-func setEnv(t *testing.T, key, value string) {
- initial, ok := os.LookupEnv(key)
- os.Setenv(key, value)
-
- t.Cleanup(func() {
- if ok {
- os.Setenv(key, initial)
- } else {
- os.Unsetenv(key)
- }
- })
-}
diff --git a/command/var_init.go b/command/var_init.go
new file mode 100644
index 00000000000..965777e0a68
--- /dev/null
+++ b/command/var_init.go
@@ -0,0 +1,193 @@
+package command
+
+import (
+ "fmt"
+ "io/ioutil"
+ "os"
+ "regexp"
+ "strings"
+
+ "github.com/muesli/reflow/wordwrap"
+ "github.com/posener/complete"
+)
+
+const (
+ // DefaultHclVarInitName is the default name we use when initializing the
+ // example var file in HCL format
+ DefaultHclVarInitName = "spec.nsv.hcl"
+
+ // DefaultHclVarInitName is the default name we use when initializing the
+ // example var file in JSON format
+ DefaultJsonVarInitName = "spec.nsv.json"
+)
+
+// VarInitCommand generates a new secure variable specification
+type VarInitCommand struct {
+ Meta
+}
+
+func (c *VarInitCommand) Help() string {
+ helpText := `
+Usage: nomad var init
+
+ Creates an example secure variable specification file that can be used as a
+ starting point to customize further. If no filename is given, the default of
+ "spec.nsv.hcl" or "spec.nsv.json" will be used.
+
+Init Options:
+
+ -json
+ Create an example JSON secure variable specification.
+
+ -q
+ Suppress non-error output
+`
+ return strings.TrimSpace(helpText)
+}
+
+func (c *VarInitCommand) Synopsis() string {
+ return "Create an example secure variable specification file"
+}
+
+func (c *VarInitCommand) AutocompleteFlags() complete.Flags {
+ return complete.Flags{
+ "-json": complete.PredictNothing,
+ }
+}
+
+func (c *VarInitCommand) AutocompleteArgs() complete.Predictor {
+ return complete.PredictNothing
+}
+
+func (c *VarInitCommand) Name() string { return "var init" }
+
+func (c *VarInitCommand) Run(args []string) int {
+ var jsonOutput bool
+ var quiet bool
+
+ flags := c.Meta.FlagSet(c.Name(), FlagSetClient)
+ flags.Usage = func() { c.Ui.Output(c.Help()) }
+ flags.BoolVar(&jsonOutput, "json", false, "")
+ flags.BoolVar(&quiet, "q", false, "")
+
+ if err := flags.Parse(args); err != nil {
+ return 1
+ }
+
+ // Check that we get no arguments
+ args = flags.Args()
+ if l := len(args); l > 1 {
+ c.Ui.Error("This command takes no arguments or one: ")
+ c.Ui.Error(commandErrorText(c))
+ return 1
+ }
+
+ fileName := DefaultHclVarInitName
+ fileContent := defaultHclVarSpec
+ if jsonOutput {
+ fileName = DefaultJsonVarInitName
+ fileContent = defaultJsonVarSpec
+ }
+ if len(args) == 1 {
+ fileName = args[0]
+ }
+
+ // Check if the file already exists
+ _, err := os.Stat(fileName)
+ if err != nil && !os.IsNotExist(err) {
+ c.Ui.Error(fmt.Sprintf("Failed to stat %q: %v", fileName, err))
+ return 1
+ }
+ if !os.IsNotExist(err) {
+ c.Ui.Error(fmt.Sprintf("File %q already exists", fileName))
+ return 1
+ }
+
+ // Write out the example
+ err = ioutil.WriteFile(fileName, []byte(fileContent), 0660)
+ if err != nil {
+ c.Ui.Error(fmt.Sprintf("Failed to write %q: %v", fileName, err))
+ return 1
+ }
+
+ // Success
+ if !quiet {
+ c.Ui.Warn(WrapAndPrepend(TidyRawString(msgWarnKeys), 70, ""))
+ c.Ui.Output(fmt.Sprintf("Example secure variable specification written to %s", fileName))
+ }
+ return 0
+}
+
+const (
+ msgWarnKeys = `
+ REMINDER: While keys in the items map can contain dots, using them in
+ templates is easier when they do not. As a best practice, avoid dotted
+ keys when possible.`
+)
+
+var defaultHclVarSpec = strings.TrimSpace(`
+# A secure variable path can be specified in the specification file
+# and will be used when writing the variable without specifying a
+# path in the command or when writing JSON directly to the `+"`/var/`"+`
+# HTTP API endpoint
+# path = "path/to/variable"
+
+# The Namespace to write the variable can be included in the specification
+# and is the highest precedence way to set the namespace value.
+# namespace = "default"
+
+# The items map is the only strictly required part of a secure variable
+# specification, since path and namespace can be set via other means. It
+# contains the sensitive material to encrypt and store as a Nomad secure
+# variable. The entire items map is encrypted and decrypted as a single unit.
+
+`+warnInHCLFile()+`
+items {
+ key1 = "value 1"
+ key2 = "value 2"
+}
+`) + "\n"
+
+var defaultJsonVarSpec = strings.TrimSpace(`
+{
+ "Items": {
+ "key1": "value 1",
+ "key2": "value 2"
+ }
+}
+`) + "\n"
+
+func warnInHCLFile() string {
+ return WrapAndPrepend(TidyRawString(msgWarnKeys), 70, "# ")
+}
+
+// WrapString is a convienience func to abstract away the word wrapping
+// implementation
+func WrapString(input string, lineLen int) string {
+ return wordwrap.String(input, lineLen)
+}
+
+// WrapAndPrepend will word wrap the input string to lineLen characters and
+// prepend the provided prefix to every line. The total length of each returned
+// line will be at most len(input[line])+len(prefix)
+func WrapAndPrepend(input string, lineLen int, prefix string) string {
+ ss := strings.Split(wordwrap.String(input, lineLen), "\n")
+ prefixStringList(ss, prefix)
+ return strings.Join(ss, "\n")
+}
+
+// TidyRawString will convert a wrapped and indented raw string into a single
+// long string suitable for rewrapping with another tool. It trims leading and
+// trailing whitespace and then consume groups of tabs, newlines, and spaces
+// replacing them with a single space
+func TidyRawString(raw string) string {
+ re := regexp.MustCompile("[\t\n ]+")
+ return re.ReplaceAllString(strings.TrimSpace(raw), " ")
+}
+
+func prefixStringList(ss []string, prefix string) []string {
+ for i, s := range ss {
+ ss[i] = prefix + s
+ }
+ return ss
+}
diff --git a/command/volume_status_csi.go b/command/volume_status_csi.go
index aa3981e17c3..29f87f8af03 100644
--- a/command/volume_status_csi.go
+++ b/command/volume_status_csi.go
@@ -8,7 +8,6 @@ import (
"strings"
"github.com/hashicorp/nomad/api"
- "github.com/hashicorp/nomad/nomad/structs"
)
func (c *VolumeStatusCommand) csiBanner() {
@@ -273,10 +272,10 @@ func (c *VolumeStatusCommand) formatTopology(vol *api.CSIVolume) string {
}
func csiVolMountOption(volume, request *api.CSIMountOptions) string {
- var req, opts *structs.CSIMountOptions
+ var req, opts *api.CSIMountOptions
if request != nil {
- req = &structs.CSIMountOptions{
+ req = &api.CSIMountOptions{
FSType: request.FSType,
MountFlags: request.MountFlags,
}
@@ -285,7 +284,7 @@ func csiVolMountOption(volume, request *api.CSIMountOptions) string {
if volume == nil {
opts = req
} else {
- opts = &structs.CSIMountOptions{
+ opts = &api.CSIMountOptions{
FSType: volume.FSType,
MountFlags: volume.MountFlags,
}
diff --git a/contributing/README.md b/contributing/README.md
index 56e7873bbb5..fdc7e10c2f8 100644
--- a/contributing/README.md
+++ b/contributing/README.md
@@ -30,7 +30,7 @@ A development environment is supplied via Vagrant to make getting started easier
Developing without Vagrant
---
-1. Install [Go 1.18.3+](https://golang.org/) *(Note: `gcc-go` is not supported)*
+1. Install [Go 1.19+](https://golang.org/) *(Note: `gcc-go` is not supported)*
1. Clone this repo
```sh
$ git clone https://github.com/hashicorp/nomad.git
diff --git a/drivers/docker/config.go b/drivers/docker/config.go
index 6194d60f1e4..40d98966ad4 100644
--- a/drivers/docker/config.go
+++ b/drivers/docker/config.go
@@ -112,21 +112,19 @@ func PluginLoader(opts map[string]string) (map[string]interface{}, error) {
}
var (
- // PluginID is the rawexec plugin metadata registered in the plugin
- // catalog.
+ // PluginID is the docker plugin metadata registered in the plugin catalog.
PluginID = loader.PluginID{
Name: pluginName,
PluginType: base.PluginTypeDriver,
}
- // PluginConfig is the rawexec factory function registered in the
- // plugin catalog.
+ // PluginConfig is the docker config factory function registered in the plugin catalog.
PluginConfig = &loader.InternalPluginConfig{
Config: map[string]interface{}{},
Factory: func(ctx context.Context, l hclog.Logger) interface{} { return NewDockerDriver(ctx, l) },
}
- // pluginInfo is the response returned for the PluginInfo RPC
+ // pluginInfo is the response returned for the PluginInfo RPC.
pluginInfo = &base.PluginInfoResponse{
Type: base.PluginTypeDriver,
PluginApiVersions: []string{drivers.ApiVersion010},
@@ -321,6 +319,11 @@ var (
})),
})
+ // healthchecksBodySpec is the hcl specification for the `healthchecks` block
+ healthchecksBodySpec = hclspec.NewObject(map[string]*hclspec.Spec{
+ "disable": hclspec.NewAttr("disable", "bool", false),
+ })
+
// taskConfigSpec is the hcl specification for the driver config section of
// a task within a job. It is returned in the TaskConfigSchema RPC
taskConfigSpec = hclspec.NewObject(map[string]*hclspec.Spec{
@@ -354,6 +357,7 @@ var (
"entrypoint": hclspec.NewAttr("entrypoint", "list(string)", false),
"extra_hosts": hclspec.NewAttr("extra_hosts", "list(string)", false),
"force_pull": hclspec.NewAttr("force_pull", "bool", false),
+ "healthchecks": hclspec.NewBlock("healthchecks", false, healthchecksBodySpec),
"hostname": hclspec.NewAttr("hostname", "string", false),
"init": hclspec.NewAttr("init", "bool", false),
"interactive": hclspec.NewAttr("interactive", "bool", false),
@@ -435,6 +439,7 @@ type TaskConfig struct {
Entrypoint []string `codec:"entrypoint"`
ExtraHosts []string `codec:"extra_hosts"`
ForcePull bool `codec:"force_pull"`
+ Healthchecks DockerHealthchecks `codec:"healthchecks"`
Hostname string `codec:"hostname"`
Init bool `codec:"init"`
Interactive bool `codec:"interactive"`
@@ -514,6 +519,14 @@ type DockerLogging struct {
Config hclutils.MapStrStr `codec:"config"`
}
+type DockerHealthchecks struct {
+ Disable bool `codec:"disable"`
+}
+
+func (dh *DockerHealthchecks) Disabled() bool {
+ return dh == nil || dh.Disable
+}
+
type DockerMount struct {
Type string `codec:"type"`
Target string `codec:"target"`
diff --git a/drivers/docker/config_test.go b/drivers/docker/config_test.go
index f0aebef0c61..254973e20b3 100644
--- a/drivers/docker/config_test.go
+++ b/drivers/docker/config_test.go
@@ -223,6 +223,9 @@ config {
entrypoint = ["/bin/bash", "-c"]
extra_hosts = ["127.0.0.1 localhost.example.com"]
force_pull = true
+ healthchecks {
+ disable = true
+ }
hostname = "self.example.com"
interactive = true
ipc_mode = "host"
@@ -376,6 +379,7 @@ config {
Entrypoint: []string{"/bin/bash", "-c"},
ExtraHosts: []string{"127.0.0.1 localhost.example.com"},
ForcePull: true,
+ Healthchecks: DockerHealthchecks{Disable: true},
Hostname: "self.example.com",
Interactive: true,
IPCMode: "host",
diff --git a/drivers/docker/driver.go b/drivers/docker/driver.go
index ec2455515df..0aa9938457e 100644
--- a/drivers/docker/driver.go
+++ b/drivers/docker/driver.go
@@ -1236,6 +1236,13 @@ func (d *Driver) createContainerConfig(task *drivers.TaskConfig, driverConfig *T
logger.Debug("setting container mac address", "mac_address", config.MacAddress)
}
+ if driverConfig.Healthchecks.Disabled() {
+ // Override any image-supplied health-check with disable sentinel.
+ // https://github.com/docker/engine-api/blob/master/types/container/config.go#L16
+ config.Healthcheck = &docker.HealthConfig{Test: []string{"NONE"}}
+ logger.Debug("setting container healthchecks to be disabled")
+ }
+
return docker.CreateContainerOptions{
Name: containerName,
Config: config,
diff --git a/drivers/docker/driver_linux_test.go b/drivers/docker/driver_linux_test.go
index e6c51a1fce6..a00291e81f2 100644
--- a/drivers/docker/driver_linux_test.go
+++ b/drivers/docker/driver_linux_test.go
@@ -12,8 +12,8 @@ import (
"github.com/hashicorp/nomad/ci"
"github.com/hashicorp/nomad/client/testutil"
- "github.com/hashicorp/nomad/helper"
"github.com/hashicorp/nomad/helper/freeport"
+ "github.com/hashicorp/nomad/helper/pointer"
tu "github.com/hashicorp/nomad/testutil"
"github.com/stretchr/testify/require"
)
@@ -69,7 +69,7 @@ func TestDockerDriver_PluginConfig_PidsLimit(t *testing.T) {
cfg.PidsLimit = 3
opts, err := driver.createContainerConfig(task, cfg, "org/repo:0.1")
require.NoError(t, err)
- require.Equal(t, helper.Int64ToPtr(3), opts.HostConfig.PidsLimit)
+ require.Equal(t, pointer.Of(int64(3)), opts.HostConfig.PidsLimit)
}
func TestDockerDriver_PidsLimit(t *testing.T) {
diff --git a/drivers/docker/driver_test.go b/drivers/docker/driver_test.go
index 1e43f7718d2..8a76b01ebc8 100644
--- a/drivers/docker/driver_test.go
+++ b/drivers/docker/driver_test.go
@@ -31,6 +31,7 @@ import (
"github.com/hashicorp/nomad/plugins/drivers"
dtestutil "github.com/hashicorp/nomad/plugins/drivers/testutils"
tu "github.com/hashicorp/nomad/testutil"
+ "github.com/shoenig/test/must"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
@@ -845,6 +846,26 @@ func TestDockerDriver_LoggingConfiguration(t *testing.T) {
require.Equal(t, loggerConfig, container.HostConfig.LogConfig.Config)
}
+func TestDockerDriver_HealthchecksDisable(t *testing.T) {
+ ci.Parallel(t)
+ testutil.DockerCompatible(t)
+
+ task, cfg, ports := dockerTask(t)
+ cfg.Healthchecks.Disable = true
+ defer freeport.Return(ports)
+ must.NoError(t, task.EncodeConcreteDriverConfig(cfg))
+
+ client, d, handle, cleanup := dockerSetup(t, task, nil)
+ defer cleanup()
+ must.NoError(t, d.WaitUntilStarted(task.ID, 5*time.Second))
+
+ container, err := client.InspectContainer(handle.containerID)
+ must.NoError(t, err)
+
+ must.NotNil(t, container.Config.Healthcheck)
+ must.Eq(t, []string{"NONE"}, container.Config.Healthcheck.Test)
+}
+
func TestDockerDriver_ForcePull(t *testing.T) {
ci.Parallel(t)
testutil.DockerCompatible(t)
diff --git a/drivers/docker/driver_windows.go b/drivers/docker/driver_windows.go
index f3a4e22ec16..1030a3b6120 100644
--- a/drivers/docker/driver_windows.go
+++ b/drivers/docker/driver_windows.go
@@ -4,7 +4,7 @@ package docker
import docker "github.com/fsouza/go-dockerclient"
-//Currently Windows containers don't support host ip in port binding.
+// Currently Windows containers don't support host ip in port binding.
func getPortBinding(ip string, port string) docker.PortBinding {
return docker.PortBinding{HostIP: "", HostPort: port}
}
diff --git a/drivers/docker/fingerprint.go b/drivers/docker/fingerprint.go
index f37a169788e..d6b260d38c4 100644
--- a/drivers/docker/fingerprint.go
+++ b/drivers/docker/fingerprint.go
@@ -7,7 +7,7 @@ import (
"strings"
"time"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/plugins/drivers"
pstructs "github.com/hashicorp/nomad/plugins/shared/structs"
)
@@ -40,14 +40,14 @@ func (d *Driver) setDetected(detected bool) {
// setFingerprintSuccess marks the driver as having fingerprinted successfully
func (d *Driver) setFingerprintSuccess() {
d.fingerprintLock.Lock()
- d.fingerprintSuccess = helper.BoolToPtr(true)
+ d.fingerprintSuccess = pointer.Of(true)
d.fingerprintLock.Unlock()
}
// setFingerprintFailure marks the driver as having failed fingerprinting
func (d *Driver) setFingerprintFailure() {
d.fingerprintLock.Lock()
- d.fingerprintSuccess = helper.BoolToPtr(false)
+ d.fingerprintSuccess = pointer.Of(false)
d.fingerprintLock.Unlock()
}
diff --git a/drivers/exec/driver.go b/drivers/exec/driver.go
index eff9627eacd..01e44959238 100644
--- a/drivers/exec/driver.go
+++ b/drivers/exec/driver.go
@@ -16,8 +16,8 @@ import (
"github.com/hashicorp/nomad/drivers/shared/eventer"
"github.com/hashicorp/nomad/drivers/shared/executor"
"github.com/hashicorp/nomad/drivers/shared/resolvconf"
- "github.com/hashicorp/nomad/helper"
"github.com/hashicorp/nomad/helper/pluginutils/loader"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/plugins/base"
"github.com/hashicorp/nomad/plugins/drivers"
"github.com/hashicorp/nomad/plugins/drivers/utils"
@@ -247,14 +247,14 @@ func NewExecDriver(ctx context.Context, logger hclog.Logger) drivers.DriverPlugi
// setFingerprintSuccess marks the driver as having fingerprinted successfully
func (d *Driver) setFingerprintSuccess() {
d.fingerprintLock.Lock()
- d.fingerprintSuccess = helper.BoolToPtr(true)
+ d.fingerprintSuccess = pointer.Of(true)
d.fingerprintLock.Unlock()
}
// setFingerprintFailure marks the driver as having failed fingerprinting
func (d *Driver) setFingerprintFailure() {
d.fingerprintLock.Lock()
- d.fingerprintSuccess = helper.BoolToPtr(false)
+ d.fingerprintSuccess = pointer.Of(false)
d.fingerprintLock.Unlock()
}
diff --git a/drivers/java/utils_test.go b/drivers/java/utils_test.go
index f07acd4df4b..bdd0b1b976a 100644
--- a/drivers/java/utils_test.go
+++ b/drivers/java/utils_test.go
@@ -78,6 +78,15 @@ func TestDriver_parseJavaVersionOutput(t *testing.T) {
`OpenJDK Runtime Environment 18.9 (build 11.0.11+9-LTS)`,
`OpenJDK 64-Bit Server VM 18.9 (build 11.0.11+9-LTS, mixed mode, sharing)`,
},
+ {
+ "Corretto 17 on Ubuntu 22.04",
+ `openjdk version "17.0.4.1" 2022-08-12 LTS
+ OpenJDK Runtime Environment Corretto-17.0.4.9.1 (build 17.0.4.1+9-LTS)
+ OpenJDK 64-Bit Server VM Corretto-17.0.4.9.1 (build 17.0.4.1+9-LTS, mixed mode, sharing)`,
+ `17.0.4.1`,
+ `OpenJDK Runtime Environment Corretto-17.0.4.9.1 (build 17.0.4.1+9-LTS)`,
+ `OpenJDK 64-Bit Server VM Corretto-17.0.4.9.1 (build 17.0.4.1+9-LTS, mixed mode, sharing)`,
+ },
}
for _, c := range cases {
diff --git a/drivers/qemu/driver.go b/drivers/qemu/driver.go
index 23c127ee545..19336e58a49 100644
--- a/drivers/qemu/driver.go
+++ b/drivers/qemu/driver.go
@@ -5,6 +5,7 @@ import (
"errors"
"fmt"
"net"
+ "os"
"os/exec"
"path/filepath"
"regexp"
@@ -12,7 +13,6 @@ import (
"strings"
"time"
- "github.com/coreos/go-semver/semver"
hclog "github.com/hashicorp/go-hclog"
"github.com/hashicorp/nomad/client/taskenv"
"github.com/hashicorp/nomad/drivers/shared/eventer"
@@ -38,14 +38,13 @@ const (
// Represents an ACPI shutdown request to the VM (emulates pressing a physical power button)
// Reference: https://en.wikibooks.org/wiki/QEMU/Monitor
+ // Use a short file name since socket paths have a maximum length.
qemuGracefulShutdownMsg = "system_powerdown\n"
- qemuMonitorSocketName = "qemu-monitor.sock"
+ qemuMonitorSocketName = "qm.sock"
// Socket file enabling communication with the Qemu Guest Agent (if enabled and running)
- qemuGuestAgentSocketName = "qemu-guest-agent.sock"
-
- // Maximum socket path length prior to qemu 2.10.1
- qemuLegacyMaxMonitorPathLen = 108
+ // Use a short file name since socket paths have a maximum length.
+ qemuGuestAgentSocketName = "qa.sock"
// taskHandleVersion is the version of task handle which this driver sets
// and understands how to decode driver state
@@ -69,14 +68,6 @@ var (
versionRegex = regexp.MustCompile(`version (\d[\.\d+]+)`)
- // Prior to qemu 2.10.1, monitor socket paths are truncated to 108 bytes.
- // We should consider this if driver.qemu.version is < 2.10.1 and the
- // generated monitor path is too long.
- //
- // Relevant fix is here:
- // https://github.com/qemu/qemu/commit/ad9579aaa16d5b385922d49edac2c96c79bcfb6
- qemuVersionLongSocketPathFix = semver.New("2.10.1")
-
// pluginInfo is the response returned for the PluginInfo RPC
pluginInfo = &base.PluginInfoResponse{
Type: base.PluginTypeDriver,
@@ -304,9 +295,27 @@ func (d *Driver) RecoverTask(handle *drivers.TaskHandle) error {
return fmt.Errorf("failed to reattach to executor: %v", err)
}
+ // Try to restore monitor socket path.
+ taskDir := filepath.Join(handle.Config.AllocDir, handle.Config.Name)
+ possiblePaths := []string{
+ filepath.Join(taskDir, qemuMonitorSocketName),
+ // Support restoring tasks that used the old socket name.
+ filepath.Join(taskDir, "qemu-monitor.sock"),
+ }
+
+ var monitorPath string
+ for _, path := range possiblePaths {
+ if _, err := os.Stat(path); err == nil {
+ monitorPath = path
+ d.logger.Debug("found existing monitor socket", "monitor", monitorPath)
+ break
+ }
+ }
+
h := &taskHandle{
exec: execImpl,
pid: taskState.Pid,
+ monitorPath: monitorPath,
pluginClient: pluginClient,
taskConfig: taskState.TaskConfig,
procState: drivers.TaskStateRunning,
@@ -457,6 +466,8 @@ func (d *Driver) StartTask(cfg *drivers.TaskConfig) (*drivers.TaskHandle, *drive
}
}
+ taskDir := filepath.Join(cfg.AllocDir, cfg.Name)
+
var monitorPath string
if driverConfig.GracefulShutdown {
if runtime.GOOS == "windows" {
@@ -464,14 +475,8 @@ func (d *Driver) StartTask(cfg *drivers.TaskConfig) (*drivers.TaskHandle, *drive
}
// This socket will be used to manage the virtual machine (for example,
// to perform graceful shutdowns)
- taskDir := filepath.Join(cfg.AllocDir, cfg.Name)
- fingerPrint := d.buildFingerprint()
- if fingerPrint.Attributes == nil {
- return nil, nil, fmt.Errorf("unable to get qemu driver version from fingerprinted attributes")
- }
- monitorPath, err = d.getMonitorPath(taskDir, fingerPrint)
- if err != nil {
- d.logger.Debug("could not get qemu monitor path", "error", err)
+ monitorPath = filepath.Join(taskDir, qemuMonitorSocketName)
+ if err := validateSocketPath(monitorPath); err != nil {
return nil, nil, err
}
d.logger.Debug("got monitor path", "monitorPath", monitorPath)
@@ -483,8 +488,12 @@ func (d *Driver) StartTask(cfg *drivers.TaskConfig) (*drivers.TaskHandle, *drive
return nil, nil, errors.New("QEMU Guest Agent socket is unsupported on the Windows platform")
}
// This socket will be used to communicate with the Guest Agent (if it's running)
- taskDir := filepath.Join(cfg.AllocDir, cfg.Name)
- args = append(args, "-chardev", fmt.Sprintf("socket,path=%s/%s,server,nowait,id=qga0", taskDir, qemuGuestAgentSocketName))
+ agentSocketPath := filepath.Join(taskDir, qemuGuestAgentSocketName)
+ if err := validateSocketPath(agentSocketPath); err != nil {
+ return nil, nil, err
+ }
+
+ args = append(args, "-chardev", fmt.Sprintf("socket,path=%s,server,nowait,id=qga0", agentSocketPath))
args = append(args, "-device", "virtio-serial")
args = append(args, "-device", "virtserialport,chardev=qga0,name=org.qemu.guest_agent.0")
}
@@ -636,6 +645,8 @@ func (d *Driver) StopTask(taskID string, timeout time.Duration, signal string) e
if err := sendQemuShutdown(d.logger, handle.monitorPath, handle.pid); err != nil {
d.logger.Debug("error sending graceful shutdown ", "pid", handle.pid, "error", err)
}
+ } else {
+ d.logger.Debug("monitor socket is empty, forcing shutdown")
}
// TODO(preetha) we are calling shutdown on the executor here
@@ -737,27 +748,16 @@ func (d *Driver) handleWait(ctx context.Context, handle *taskHandle, ch chan *dr
}
}
-// getMonitorPath is used to determine whether a qemu monitor socket can be
-// safely created and accessed in the task directory by the version of qemu
-// present on the host. If it is safe to use, the socket's full path is
-// returned along with a nil error. Otherwise, an empty string is returned
-// along with a descriptive error.
-func (d *Driver) getMonitorPath(dir string, fingerPrint *drivers.Fingerprint) (string, error) {
- var longPathSupport bool
- currentQemuVer := fingerPrint.Attributes[driverVersionAttr]
- currentQemuSemver := semver.New(currentQemuVer.GoString())
- if currentQemuSemver.LessThan(*qemuVersionLongSocketPathFix) {
- longPathSupport = false
- d.logger.Debug("long socket paths are not available in this version of QEMU", "version", currentQemuVer)
- } else {
- longPathSupport = true
- d.logger.Debug("long socket paths available in this version of QEMU", "version", currentQemuVer)
- }
- fullSocketPath := fmt.Sprintf("%s/%s", dir, qemuMonitorSocketName)
- if len(fullSocketPath) > qemuLegacyMaxMonitorPathLen && !longPathSupport {
- return "", fmt.Errorf("monitor path is too long for this version of qemu")
+// validateSocketPath provides best effort validation of socket paths since
+// some rules may be platform-dependant.
+func validateSocketPath(path string) error {
+ if maxSocketPathLen > 0 && len(path) > maxSocketPathLen {
+ return fmt.Errorf(
+ "socket path %s is longer than the maximum length allowed (%d), try to reduce the task name or Nomad's data_dir if possible.",
+ path, maxSocketPathLen)
}
- return fullSocketPath, nil
+
+ return nil
}
// sendQemuShutdown attempts to issue an ACPI power-off command via the qemu
diff --git a/drivers/qemu/driver_bsd.go b/drivers/qemu/driver_bsd.go
new file mode 100644
index 00000000000..21c31459890
--- /dev/null
+++ b/drivers/qemu/driver_bsd.go
@@ -0,0 +1,12 @@
+//go:build darwin || freebsd || netbsd || openbsd
+// +build darwin freebsd netbsd openbsd
+
+package qemu
+
+const (
+ // https://man.openbsd.org/unix.4#ADDRESSING
+ // https://www.freebsd.org/cgi/man.cgi?query=unix
+ // https://github.com/apple/darwin-xnu/blob/main/bsd/man/man4/unix.4#L72
+ // https://man.netbsd.org/unix.4#ADDRESSING
+ maxSocketPathLen = 104
+)
diff --git a/drivers/qemu/driver_fallback.go b/drivers/qemu/driver_fallback.go
new file mode 100644
index 00000000000..cbc89500a7e
--- /dev/null
+++ b/drivers/qemu/driver_fallback.go
@@ -0,0 +1,9 @@
+//go:build !linux && !darwin && !freebsd && !netbsd && !openbsd
+// +build !linux,!darwin,!freebsd,!netbsd,!openbsd
+
+package qemu
+
+const (
+ // Don't enforce any path limit.
+ maxSocketPathLen = 0
+)
diff --git a/drivers/qemu/driver_linux.go b/drivers/qemu/driver_linux.go
new file mode 100644
index 00000000000..76059aad809
--- /dev/null
+++ b/drivers/qemu/driver_linux.go
@@ -0,0 +1,9 @@
+//go:build linux
+// +build linux
+
+package qemu
+
+const (
+ // https://man7.org/linux/man-pages/man7/unix.7.html
+ maxSocketPathLen = 108
+)
diff --git a/drivers/qemu/driver_test.go b/drivers/qemu/driver_test.go
index 7bb27d1a788..b9999029005 100644
--- a/drivers/qemu/driver_test.go
+++ b/drivers/qemu/driver_test.go
@@ -5,7 +5,6 @@ import (
"io"
"os"
"path/filepath"
- "strings"
"testing"
"time"
@@ -17,7 +16,6 @@ import (
"github.com/hashicorp/nomad/nomad/structs"
"github.com/hashicorp/nomad/plugins/drivers"
dtestutil "github.com/hashicorp/nomad/plugins/drivers/testutils"
- pstructs "github.com/hashicorp/nomad/plugins/shared/structs"
"github.com/hashicorp/nomad/testutil"
"github.com/stretchr/testify/require"
)
@@ -88,119 +86,6 @@ func TestQemuDriver_Start_Wait_Stop(t *testing.T) {
}
-// Verifies monitor socket path for old qemu
-func TestQemuDriver_GetMonitorPathOldQemu(t *testing.T) {
- ci.Parallel(t)
- ctestutil.QemuCompatible(t)
-
- require := require.New(t)
- ctx, cancel := context.WithCancel(context.Background())
- defer cancel()
-
- d := NewQemuDriver(ctx, testlog.HCLogger(t))
- harness := dtestutil.NewDriverHarness(t, d)
-
- task := &drivers.TaskConfig{
- ID: uuid.Generate(),
- Name: "linux",
- Resources: &drivers.Resources{
- NomadResources: &structs.AllocatedTaskResources{
- Memory: structs.AllocatedMemoryResources{
- MemoryMB: 512,
- },
- Cpu: structs.AllocatedCpuResources{
- CpuShares: 100,
- },
- Networks: []*structs.NetworkResource{
- {
- ReservedPorts: []structs.Port{{Label: "main", Value: 22000}, {Label: "web", Value: 80}},
- },
- },
- },
- },
- }
-
- cleanup := harness.MkAllocDir(task, true)
- defer cleanup()
-
- fingerPrint := &drivers.Fingerprint{
- Attributes: map[string]*pstructs.Attribute{
- driverVersionAttr: pstructs.NewStringAttribute("2.0.0"),
- },
- }
- shortPath := strings.Repeat("x", 10)
- qemuDriver := d.(*Driver)
- _, err := qemuDriver.getMonitorPath(shortPath, fingerPrint)
- require.Nil(err)
-
- longPath := strings.Repeat("x", qemuLegacyMaxMonitorPathLen+100)
- _, err = qemuDriver.getMonitorPath(longPath, fingerPrint)
- require.NotNil(err)
-
- // Max length includes the '/' separator and socket name
- maxLengthCount := qemuLegacyMaxMonitorPathLen - len(qemuMonitorSocketName) - 1
- maxLengthLegacyPath := strings.Repeat("x", maxLengthCount)
- _, err = qemuDriver.getMonitorPath(maxLengthLegacyPath, fingerPrint)
- require.Nil(err)
-}
-
-// Verifies monitor socket path for new qemu version
-func TestQemuDriver_GetMonitorPathNewQemu(t *testing.T) {
- ci.Parallel(t)
- ctestutil.QemuCompatible(t)
-
- require := require.New(t)
- ctx, cancel := context.WithCancel(context.Background())
- defer cancel()
-
- d := NewQemuDriver(ctx, testlog.HCLogger(t))
- harness := dtestutil.NewDriverHarness(t, d)
-
- task := &drivers.TaskConfig{
- ID: uuid.Generate(),
- Name: "linux",
- Resources: &drivers.Resources{
- NomadResources: &structs.AllocatedTaskResources{
- Memory: structs.AllocatedMemoryResources{
- MemoryMB: 512,
- },
- Cpu: structs.AllocatedCpuResources{
- CpuShares: 100,
- },
- Networks: []*structs.NetworkResource{
- {
- ReservedPorts: []structs.Port{{Label: "main", Value: 22000}, {Label: "web", Value: 80}},
- },
- },
- },
- },
- }
-
- cleanup := harness.MkAllocDir(task, true)
- defer cleanup()
-
- fingerPrint := &drivers.Fingerprint{
- Attributes: map[string]*pstructs.Attribute{
- driverVersionAttr: pstructs.NewStringAttribute("2.99.99"),
- },
- }
- shortPath := strings.Repeat("x", 10)
- qemuDriver := d.(*Driver)
- _, err := qemuDriver.getMonitorPath(shortPath, fingerPrint)
- require.Nil(err)
-
- // Should not return an error in this qemu version
- longPath := strings.Repeat("x", qemuLegacyMaxMonitorPathLen+100)
- _, err = qemuDriver.getMonitorPath(longPath, fingerPrint)
- require.Nil(err)
-
- // Max length includes the '/' separator and socket name
- maxLengthCount := qemuLegacyMaxMonitorPathLen - len(qemuMonitorSocketName) - 1
- maxLengthLegacyPath := strings.Repeat("x", maxLengthCount)
- _, err = qemuDriver.getMonitorPath(maxLengthLegacyPath, fingerPrint)
- require.Nil(err)
-}
-
// copyFile moves an existing file to the destination
func copyFile(src, dst string, t *testing.T) {
in, err := os.Open(src)
@@ -282,7 +167,8 @@ func TestQemuDriver_User(t *testing.T) {
}
-// Verifies getting resource usage stats
+// Verifies getting resource usage stats
+//
// TODO(preetha) this test needs random sleeps to pass
func TestQemuDriver_Stats(t *testing.T) {
ci.Parallel(t)
@@ -464,7 +350,7 @@ func TestIsAllowedImagePath(t *testing.T) {
func TestArgsAllowList(t *testing.T) {
ci.Parallel(t)
-
+
pluginConfigAllowList := []string{"-drive", "-net", "-snapshot"}
validArgs := [][]string{
diff --git a/drivers/shared/capabilities/defaults.go b/drivers/shared/capabilities/defaults.go
index 827f41019d4..6452bbf3c76 100644
--- a/drivers/shared/capabilities/defaults.go
+++ b/drivers/shared/capabilities/defaults.go
@@ -136,8 +136,9 @@ func LegacySupported() *Set {
//
// cap_add takes precedence over cap_drop, enabling the common pattern of dropping
// all capabilities, then adding back the desired smaller set. e.g.
-// cap_drop = ["all"]
-// cap_add = ["chown", "kill"]
+//
+// cap_drop = ["all"]
+// cap_add = ["chown", "kill"]
//
// Note that the resulting capability names are upper-cased and prefixed with
// "CAP_", which is the expected input for the exec/java driver implementation.
diff --git a/drivers/shared/executor/executor_linux.go b/drivers/shared/executor/executor_linux.go
index ca35bdee58d..fc91fc36728 100644
--- a/drivers/shared/executor/executor_linux.go
+++ b/drivers/shared/executor/executor_linux.go
@@ -98,7 +98,6 @@ func (l *LibcontainerExecutor) Launch(command *ExecCommand) (*ProcessState, erro
// create a new factory which will store the container state in the allocDir
factory, err := libcontainer.New(
path.Join(command.TaskDir, "../alloc/container"),
- libcontainer.Cgroupfs,
// note that os.Args[0] refers to the executor shim typically
// and first args arguments is ignored now due
// until https://github.com/opencontainers/runc/pull/1888 is merged
diff --git a/drivers/shared/executor/executor_linux_test.go b/drivers/shared/executor/executor_linux_test.go
index f9d3fb59cd1..d6b2d137fa5 100644
--- a/drivers/shared/executor/executor_linux_test.go
+++ b/drivers/shared/executor/executor_linux_test.go
@@ -401,11 +401,9 @@ func TestExecutor_CgroupPathsAreDestroyed(t *testing.T) {
require.NoError(err)
for subsystem, cgroup := range subsystems {
- if !strings.Contains(cgroup, "nomad/") {
- // this should only be rdma at this point
+ if subsystem == "" || !strings.Contains(cgroup, "nomad/") {
continue
}
-
p, err := cgutil.GetCgroupPathHelperV1(subsystem, cgroup)
require.NoError(err)
require.Falsef(cgroups.PathExists(p), "cgroup for %s %s still exists", subsystem, cgroup)
diff --git a/drivers/shared/executor/executor_universal_linux.go b/drivers/shared/executor/executor_universal_linux.go
index ac79b518b7e..f8441164500 100644
--- a/drivers/shared/executor/executor_universal_linux.go
+++ b/drivers/shared/executor/executor_universal_linux.go
@@ -122,7 +122,7 @@ func (e *UniversalExecutor) configureResourceContainer(pid int) error {
"error", err)
return nil
}
- path := cfg.Cgroups.Paths["freezer"]
+ path := cfg.Cgroups.Path
e.logger.Trace("cgroup created, now need to apply", "path", path)
e.containment = resources.Contain(e.logger, cfg.Cgroups)
return e.containment.Apply(pid)
diff --git a/e2e/consultemplate/consultemplate.go b/e2e/consultemplate/consultemplate.go
index 2f3ef51402d..e92f1ca24ac 100644
--- a/e2e/consultemplate/consultemplate.go
+++ b/e2e/consultemplate/consultemplate.go
@@ -89,7 +89,7 @@ func (tc *ConsulTemplateTest) AfterEach(f *framework.F) {
// - missing keys block allocations from starting
// - key updates trigger re-render
// - service updates trigger re-render
-// - 'noop' vs ''restart' configuration
+// - 'noop' vs ”restart' configuration
func (tc *ConsulTemplateTest) TestTemplateUpdateTriggers(f *framework.F) {
wc := &e2eutil.WaitConfig{}
diff --git a/e2e/e2eutil/allocs.go b/e2e/e2eutil/allocs.go
index 68d5bfc5d66..e418bef7cd2 100644
--- a/e2e/e2eutil/allocs.go
+++ b/e2e/e2eutil/allocs.go
@@ -240,6 +240,13 @@ func AllocLogs(allocID string, logStream LogStream) (string, error) {
return Command(cmd[0], cmd[1:]...)
}
+// AllocChecks returns the CLI output from 'nomad alloc checks' on the given
+// alloc ID.
+func AllocChecks(allocID string) (string, error) {
+ cmd := []string{"nomad", "alloc", "checks", allocID}
+ return Command(cmd[0], cmd[1:]...)
+}
+
func AllocTaskLogs(allocID, task string, logStream LogStream) (string, error) {
cmd := []string{"nomad", "alloc", "logs"}
if logStream == LogsStdErr {
diff --git a/e2e/e2eutil/utils.go b/e2e/e2eutil/utils.go
index 75c61606066..b98beb9eb8c 100644
--- a/e2e/e2eutil/utils.go
+++ b/e2e/e2eutil/utils.go
@@ -7,7 +7,7 @@ import (
"time"
api "github.com/hashicorp/nomad/api"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/jobspec2"
"github.com/hashicorp/nomad/nomad/structs"
"github.com/hashicorp/nomad/testutil"
@@ -58,7 +58,7 @@ func stringToPtrOrNil(s string) *string {
if s == "" {
return nil
}
- return helper.StringToPtr(s)
+ return pointer.Of(s)
}
func Parse2(t *testing.T, jobFile string) (*api.Job, error) {
@@ -74,7 +74,7 @@ func RegisterAllocs(t *testing.T, nomadClient *api.Client, jobFile, jobID, cToke
require.NoError(t, err)
// Set custom job ID (distinguish among tests)
- job.ID = helper.StringToPtr(jobID)
+ job.ID = pointer.Of(jobID)
// Set a Consul "operator" token for the job, if provided.
job.ConsulToken = stringToPtrOrNil(cToken)
diff --git a/e2e/framework/doc.go b/e2e/framework/doc.go
index d682ffc3baa..176aff0a0af 100644
--- a/e2e/framework/doc.go
+++ b/e2e/framework/doc.go
@@ -5,7 +5,7 @@ include conditions under which the suite will run and a list of TestCase
implementations to run. TestCases can be implemented with methods that run
before/after each and all tests.
-Writing Tests
+# Writing Tests
Tests follow a similar patterns as go tests. They are functions that must start
with 'Test' and instead of a *testing.T argument, a *framework.F is passed and
@@ -78,7 +78,7 @@ As demonstrated in the previous example, TC also exposes functions that return
configured api clients including Nomad, Consul and Vault. If Consul or Vault
are not provisioned their respective getter functions will return nil.
-Testify Integration
+# Testify Integration
Test cases expose a T() function to fetch the current *testing.T context.
While this means the author is able to most other testing libraries,
@@ -93,7 +93,7 @@ yields a testify Require if that flavor is desired.
// Or tc.Require().NoError(err)
}
-Parallelism
+# Parallelism
The test framework honors go test's parallel feature under certain conditions.
A TestSuite can be created with the Parallel field set to true to enable
@@ -119,6 +119,5 @@ each test case. The framework.F struct exposes an ID() function that will return
string that is unique with in a test. Therefore, multiple tests with in the case
can reliably create unique IDs between tests and setup/teardown. The string
returned is 8 alpha numeric characters.
-
*/
package framework
diff --git a/e2e/scaling/scaling.go b/e2e/scaling/scaling.go
index cb046ae9c8f..cb231bed65c 100644
--- a/e2e/scaling/scaling.go
+++ b/e2e/scaling/scaling.go
@@ -6,7 +6,7 @@ import (
"github.com/hashicorp/nomad/api"
"github.com/hashicorp/nomad/e2e/e2eutil"
"github.com/hashicorp/nomad/e2e/framework"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/uuid"
)
@@ -74,7 +74,7 @@ func (tc *ScalingE2ETest) TestScalingBasic(f *framework.F) {
// Simple scaling action.
testMeta := map[string]interface{}{"scaling-e2e-test": "value"}
scaleResp, _, err := tc.Nomad().Jobs().Scale(
- jobID, "horizontally_scalable", helper.IntToPtr(3),
+ jobID, "horizontally_scalable", pointer.Of(3),
"Nomad e2e testing", false, testMeta, nil)
f.NoError(err)
f.NotEmpty(scaleResp.EvalID)
@@ -87,11 +87,11 @@ func (tc *ScalingE2ETest) TestScalingBasic(f *framework.F) {
// Attempt break break the policy min/max parameters.
_, _, err = tc.Nomad().Jobs().Scale(
- jobID, "horizontally_scalable", helper.IntToPtr(4),
+ jobID, "horizontally_scalable", pointer.Of(4),
"Nomad e2e testing", false, nil, nil)
f.Error(err)
_, _, err = tc.Nomad().Jobs().Scale(
- jobID, "horizontally_scalable", helper.IntToPtr(1),
+ jobID, "horizontally_scalable", pointer.Of(1),
"Nomad e2e testing", false, nil, nil)
f.Error(err)
@@ -143,22 +143,22 @@ func (tc *ScalingE2ETest) TestScalingNamespaces(f *framework.F) {
// We shouldn't be able to trigger scaling across the namespace boundary.
_, _, err = tc.Nomad().Jobs().Scale(
- defaultJobID, "horizontally_scalable", helper.IntToPtr(3),
+ defaultJobID, "horizontally_scalable", pointer.Of(3),
"Nomad e2e testing", false, nil, &aWriteOpts)
f.Error(err)
_, _, err = tc.Nomad().Jobs().Scale(
- aJobID, "horizontally_scalable", helper.IntToPtr(3),
+ aJobID, "horizontally_scalable", pointer.Of(3),
"Nomad e2e testing", false, nil, &defaultWriteOpts)
f.Error(err)
// We should be able to trigger scaling when using the correct namespace,
// duh.
_, _, err = tc.Nomad().Jobs().Scale(
- defaultJobID, "horizontally_scalable", helper.IntToPtr(3),
+ defaultJobID, "horizontally_scalable", pointer.Of(3),
"Nomad e2e testing", false, nil, &defaultWriteOpts)
f.NoError(err)
_, _, err = tc.Nomad().Jobs().Scale(
- aJobID, "horizontally_scalable", helper.IntToPtr(3),
+ aJobID, "horizontally_scalable", pointer.Of(3),
"Nomad e2e testing", false, nil, &aWriteOpts)
f.NoError(err)
}
diff --git a/e2e/servicediscovery/input/checks_happy.nomad b/e2e/servicediscovery/input/checks_happy.nomad
new file mode 100644
index 00000000000..de902e4cbde
--- /dev/null
+++ b/e2e/servicediscovery/input/checks_happy.nomad
@@ -0,0 +1,37 @@
+job "checks_happy" {
+ datacenters = ["dc1"]
+ type = "service"
+
+ constraint {
+ attribute = "${attr.kernel.name}"
+ value = "linux"
+ }
+
+ group "group" {
+ network {
+ mode = "host"
+ port "http" {}
+ }
+
+ service {
+ provider = "nomad"
+ name = "http-server"
+ port = "http"
+ check {
+ name = "http-server-check"
+ type = "http"
+ path = "/"
+ interval = "2s"
+ timeout = "1s"
+ }
+ }
+
+ task "python-http" {
+ driver = "raw_exec"
+ config {
+ command = "python3"
+ args = ["-m", "http.server", "${NOMAD_PORT_http}"]
+ }
+ }
+ }
+}
diff --git a/e2e/servicediscovery/input/checks_sad.nomad b/e2e/servicediscovery/input/checks_sad.nomad
new file mode 100644
index 00000000000..81a2a5a430f
--- /dev/null
+++ b/e2e/servicediscovery/input/checks_sad.nomad
@@ -0,0 +1,38 @@
+job "checks_sad" {
+ datacenters = ["dc1"]
+ type = "service"
+
+ constraint {
+ attribute = "${attr.kernel.name}"
+ value = "linux"
+ }
+
+ group "group" {
+ network {
+ mode = "host"
+ port "http" {}
+ }
+
+ service {
+ provider = "nomad"
+ name = "http-server"
+ port = "http"
+ check {
+ name = "http-server-check"
+ type = "http"
+ path = "/"
+ method = "POST" # not allowed by http.server
+ interval = "2s"
+ timeout = "1s"
+ }
+ }
+
+ task "python-http" {
+ driver = "raw_exec"
+ config {
+ command = "python3"
+ args = ["-m", "http.server", "${NOMAD_PORT_http}"]
+ }
+ }
+ }
+}
diff --git a/e2e/servicediscovery/nomad_checks_test.go b/e2e/servicediscovery/nomad_checks_test.go
new file mode 100644
index 00000000000..8ac214d5b54
--- /dev/null
+++ b/e2e/servicediscovery/nomad_checks_test.go
@@ -0,0 +1,83 @@
+package servicediscovery
+
+import (
+ "context"
+ "regexp"
+ "testing"
+
+ "github.com/hashicorp/nomad/e2e/e2eutil"
+ "github.com/hashicorp/nomad/helper/uuid"
+ "github.com/shoenig/test/must"
+)
+
+func testChecksHappy(t *testing.T) {
+ nomadClient := e2eutil.NomadClient(t)
+
+ // Generate our unique job ID which will be used for this test.
+ jobID := "nsd-check-happy-" + uuid.Short()
+ jobIDs := []string{jobID}
+
+ // Defer a cleanup function to remove the job. This will trigger if the
+ // test fails, unless the cancel function is called.
+ ctx, cancel := context.WithCancel(context.Background())
+ defer cancel()
+ defer e2eutil.CleanupJobsAndGCWithContext(t, ctx, &jobIDs)
+
+ // Register the happy checks job.
+ allocStubs := e2eutil.RegisterAndWaitForAllocs(t, nomadClient, jobChecksHappy, jobID, "")
+ must.Len(t, 1, allocStubs)
+
+ // wait for the alloc to be running
+ e2eutil.WaitForAllocRunning(t, nomadClient, allocStubs[0].ID)
+
+ // get the output of 'nomad alloc checks'
+ output, err := e2eutil.AllocChecks(allocStubs[0].ID)
+ must.NoError(t, err)
+
+ // assert the output contains success
+ statusRe := regexp.MustCompile(`Status\s+=\s+success`)
+ must.RegexMatch(t, statusRe, output)
+
+ // assert the output contains 200 status code
+ statusCodeRe := regexp.MustCompile(`StatusCode\s+=\s+200`)
+ must.RegexMatch(t, statusCodeRe, output)
+
+ // assert output contains nomad's success string
+ must.StrContains(t, output, `nomad: http ok`)
+}
+
+func testChecksSad(t *testing.T) {
+ nomadClient := e2eutil.NomadClient(t)
+
+ // Generate our unique job ID which will be used for this test.
+ jobID := "nsd-check-sad-" + uuid.Short()
+ jobIDs := []string{jobID}
+
+ // Defer a cleanup function to remove the job. This will trigger if the
+ // test fails, unless the cancel function is called.
+ ctx, cancel := context.WithCancel(context.Background())
+ defer cancel()
+ defer e2eutil.CleanupJobsAndGCWithContext(t, ctx, &jobIDs)
+
+ // Register the sad checks job.
+ allocStubs := e2eutil.RegisterAndWaitForAllocs(t, nomadClient, jobChecksSad, jobID, "")
+ must.Len(t, 1, allocStubs)
+
+ // wait for the alloc to be running
+ e2eutil.WaitForAllocRunning(t, nomadClient, allocStubs[0].ID)
+
+ // get the output of 'nomad alloc checks'
+ output, err := e2eutil.AllocChecks(allocStubs[0].ID)
+ must.NoError(t, err)
+
+ // assert the output contains failure
+ statusRe := regexp.MustCompile(`Status\s+=\s+failure`)
+ must.RegexMatch(t, statusRe, output)
+
+ // assert the output contains 501 status code
+ statusCodeRe := regexp.MustCompile(`StatusCode\s+=\s+501`)
+ must.RegexMatch(t, statusCodeRe, output)
+
+ // assert output contains error output from python http.server
+ must.StrContains(t, output, `Error code explanation: HTTPStatus.NOT_IMPLEMENTED - Server does not support this operation.
`)
+}
diff --git a/e2e/servicediscovery/service_discovery_test.go b/e2e/servicediscovery/service_discovery_test.go
index 7665027300f..00596895ae1 100644
--- a/e2e/servicediscovery/service_discovery_test.go
+++ b/e2e/servicediscovery/service_discovery_test.go
@@ -20,6 +20,8 @@ const (
jobMultiProvider = "./input/multi_provider.nomad"
jobSimpleLBReplicas = "./input/simple_lb_replicas.nomad"
jobSimpleLBClients = "./input/simple_lb_clients.nomad"
+ jobChecksHappy = "./input/checks_happy.nomad"
+ jobChecksSad = "./input/checks_sad.nomad"
)
const (
@@ -41,6 +43,8 @@ func TestServiceDiscovery(t *testing.T) {
t.Run("TestServiceDiscovery_MultiProvider", testMultiProvider)
t.Run("TestServiceDiscovery_UpdateProvider", testUpdateProvider)
t.Run("TestServiceDiscovery_SimpleLoadBalancing", testSimpleLoadBalancing)
+ t.Run("TestServiceDiscovery_ChecksHappy", testChecksHappy)
+ t.Run("TestServiceDiscovery_ChecksSad", testChecksSad)
}
// testMultiProvider tests service discovery where multi providers are used
diff --git a/e2e/servicediscovery/simple_lb_test.go b/e2e/servicediscovery/simple_lb_test.go
index 2e42956e1b5..d438b06a03d 100644
--- a/e2e/servicediscovery/simple_lb_test.go
+++ b/e2e/servicediscovery/simple_lb_test.go
@@ -15,8 +15,8 @@ import (
func testSimpleLoadBalancing(t *testing.T) {
nomadClient := e2eutil.NomadClient(t)
- // Generate our job ID which will be used for the entire test.
- jobID := "nsd-simple-lb-replicas" + uuid.Short()
+ // Generate our unique job ID which will be used for this test.
+ jobID := "nsd-simple-lb-replicas-" + uuid.Short()
jobIDs := []string{jobID}
// Defer a cleanup function to remove the job. This will trigger if the
diff --git a/e2e/vaultcompat/consts_test.go b/e2e/vaultcompat/consts_test.go
index cd09b8d2e47..12e2558c606 100644
--- a/e2e/vaultcompat/consts_test.go
+++ b/e2e/vaultcompat/consts_test.go
@@ -2,7 +2,7 @@ package vaultcompat
import (
"github.com/hashicorp/nomad/api"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
)
const (
@@ -45,12 +45,12 @@ var (
// job is a test job that is used to request a Vault token and cat the token
// out before exiting.
job = &api.Job{
- ID: helper.StringToPtr("test"),
- Type: helper.StringToPtr("batch"),
+ ID: pointer.Of("test"),
+ Type: pointer.Of("batch"),
Datacenters: []string{"dc1"},
TaskGroups: []*api.TaskGroup{
{
- Name: helper.StringToPtr("test"),
+ Name: pointer.Of("test"),
Tasks: []*api.Task{
{
Name: "test",
@@ -65,8 +65,8 @@ var (
},
},
RestartPolicy: &api.RestartPolicy{
- Attempts: helper.IntToPtr(0),
- Mode: helper.StringToPtr("fail"),
+ Attempts: pointer.Of(0),
+ Mode: pointer.Of("fail"),
},
},
},
diff --git a/e2e/vaultcompat/vault_test.go b/e2e/vaultcompat/vault_test.go
index 27446ebbd7b..0fcb25ffdee 100644
--- a/e2e/vaultcompat/vault_test.go
+++ b/e2e/vaultcompat/vault_test.go
@@ -18,7 +18,7 @@ import (
"github.com/hashicorp/go-version"
"github.com/hashicorp/nomad/command/agent"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/nomad/structs/config"
"github.com/hashicorp/nomad/testutil"
vapi "github.com/hashicorp/vault/api"
@@ -331,10 +331,10 @@ func testVaultCompatibility(t *testing.T, vault string, version string) {
if c.Vault == nil {
c.Vault = &config.VaultConfig{}
}
- c.Vault.Enabled = helper.BoolToPtr(true)
+ c.Vault.Enabled = pointer.Of(true)
c.Vault.Token = token
c.Vault.Role = "nomad-cluster"
- c.Vault.AllowUnauthenticated = helper.BoolToPtr(true)
+ c.Vault.AllowUnauthenticated = pointer.Of(true)
c.Vault.Addr = v.HTTPAddr
})
defer nomad.Shutdown()
diff --git a/go.mod b/go.mod
index 49e8c02185e..e564def9b04 100644
--- a/go.mod
+++ b/go.mod
@@ -1,11 +1,11 @@
module github.com/hashicorp/nomad
-go 1.18
+go 1.19
// Pinned dependencies are noted in github.com/hashicorp/nomad/issues/11826
replace (
github.com/Microsoft/go-winio => github.com/endocrimes/go-winio v0.4.13-0.20190628114223-fb47a8b41948
- github.com/hashicorp/go-discover => github.com/hashicorp/go-discover v0.0.0-20210818145131-c573d69da192
+ github.com/hashicorp/go-discover => github.com/hashicorp/go-discover v0.0.0-20220621183603-a413e131e836
github.com/hashicorp/hcl => github.com/hashicorp/hcl v1.0.1-0.20201016140508-a07e7d50bbee
)
@@ -14,37 +14,36 @@ replace github.com/hashicorp/nomad/api => ./api
require (
github.com/LK4D4/joincontext v0.0.0-20171026170139-1724345da6d5
- github.com/Microsoft/go-winio v0.4.17
+ github.com/Microsoft/go-winio v0.5.2
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e
- github.com/armon/go-metrics v0.3.10
+ github.com/armon/go-metrics v0.4.0
github.com/aws/aws-sdk-go v1.42.27
github.com/container-storage-interface/spec v1.4.0
- github.com/containerd/go-cni v1.1.1
- github.com/containernetworking/cni v1.0.1
- github.com/containernetworking/plugins v1.0.1
+ github.com/containerd/go-cni v1.1.6
+ github.com/containernetworking/cni v1.1.2
+ github.com/containernetworking/plugins v1.1.1
github.com/coreos/go-iptables v0.6.0
- github.com/coreos/go-semver v0.3.0
github.com/creack/pty v1.1.18
github.com/docker/cli v20.10.3-0.20220113150236-6e2838e18645+incompatible
github.com/docker/distribution v2.8.1+incompatible
- github.com/docker/docker v20.10.12+incompatible
+ github.com/docker/docker v20.10.17+incompatible
github.com/docker/go-units v0.4.0
github.com/docker/libnetwork v0.8.0-dev.2.0.20210525090646-64b7a4574d14
github.com/dustin/go-humanize v1.0.0
github.com/elazarl/go-bindata-assetfs v1.0.1-0.20200509193318-234c15e7648f
github.com/fatih/color v1.13.0 // indirect
- github.com/fsouza/go-dockerclient v1.6.5
+ github.com/fsouza/go-dockerclient v1.8.2
github.com/golang/protobuf v1.5.2
github.com/golang/snappy v0.0.4
github.com/google/go-cmp v0.5.8
github.com/gorilla/handlers v1.5.1
github.com/gorilla/websocket v1.5.0
github.com/gosuri/uilive v0.0.4
- github.com/grpc-ecosystem/go-grpc-middleware v1.2.1-0.20200228141219-3ce3d519df39
+ github.com/grpc-ecosystem/go-grpc-middleware v1.3.0
github.com/hashicorp/consul v1.7.8
- github.com/hashicorp/consul-template v0.29.1
- github.com/hashicorp/consul/api v1.13.0
- github.com/hashicorp/consul/sdk v0.9.0
+ github.com/hashicorp/consul-template v0.29.2-0.20220803104536-583050a85eea
+ github.com/hashicorp/consul/api v1.13.1
+ github.com/hashicorp/consul/sdk v0.10.0
github.com/hashicorp/cronexpr v1.1.1
github.com/hashicorp/go-bexpr v0.1.11
github.com/hashicorp/go-checkpoint v0.0.0-20171009173528-1545e56e46de
@@ -76,7 +75,7 @@ require (
github.com/hashicorp/logutils v1.0.0
github.com/hashicorp/memberlist v0.3.1
github.com/hashicorp/net-rpc-msgpackrpc v0.0.0-20151116020338-a14192a58a69
- github.com/hashicorp/nomad/api v0.0.0-20220407202126-2eba643965c4
+ github.com/hashicorp/nomad/api v0.0.0-20220707195938-75f4c2237b28
github.com/hashicorp/raft v1.3.9
github.com/hashicorp/raft-boltdb/v2 v2.2.0
github.com/hashicorp/serf v0.9.7
@@ -88,7 +87,7 @@ require (
github.com/kr/text v0.2.0
github.com/mattn/go-colorable v0.1.12
github.com/miekg/dns v1.1.41
- github.com/mitchellh/cli v1.1.2
+ github.com/mitchellh/cli v1.1.4
github.com/mitchellh/colorstring v0.0.0-20150917214807-8631ce90f286
github.com/mitchellh/copystructure v1.2.0
github.com/mitchellh/go-glint v0.0.0-20210722152315-6515ceb4a127
@@ -97,10 +96,10 @@ require (
github.com/mitchellh/hashstructure v1.1.0
github.com/mitchellh/mapstructure v1.5.0
github.com/mitchellh/reflectwalk v1.0.2
- github.com/moby/sys/mount v0.3.0
- github.com/moby/sys/mountinfo v0.6.0
+ github.com/moby/sys/mount v0.3.3
+ github.com/moby/sys/mountinfo v0.6.2
github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6
- github.com/opencontainers/runc v1.0.3
+ github.com/opencontainers/runc v1.1.3
github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417
github.com/posener/complete v1.2.3
github.com/prometheus/client_golang v1.12.0
@@ -116,18 +115,18 @@ require (
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635
github.com/zclconf/go-cty v1.8.0
github.com/zclconf/go-cty-yaml v1.0.2
- go.etcd.io/bbolt v1.3.5
+ go.etcd.io/bbolt v1.3.6
go.uber.org/goleak v1.1.12
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d
golang.org/x/exp v0.0.0-20220609121020-a51bd0440498
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
- golang.org/x/sys v0.0.0-20220517195934-5e4e11fc645e
+ golang.org/x/sys v0.0.0-20220803195053-6e608f9ce704
golang.org/x/time v0.0.0-20220224211638-0e9765cccd65
- google.golang.org/grpc v1.45.0
- google.golang.org/protobuf v1.27.1
+ google.golang.org/grpc v1.48.0
+ google.golang.org/protobuf v1.28.1
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7
gopkg.in/tomb.v2 v2.0.0-20140626144623-14b3d72120e8
- oss.indeed.com/go/libtime v1.5.0
+ oss.indeed.com/go/libtime v1.6.0
)
require (
@@ -149,8 +148,10 @@ require (
github.com/DataDog/datadog-go v3.2.0+incompatible // indirect
github.com/Masterminds/goutils v1.1.1 // indirect
github.com/Masterminds/semver v1.5.0 // indirect
+ github.com/Masterminds/semver/v3 v3.1.1 // indirect
github.com/Masterminds/sprig v2.22.0+incompatible // indirect
- github.com/Microsoft/hcsshim v0.8.23 // indirect
+ github.com/Masterminds/sprig/v3 v3.2.0 // indirect
+ github.com/Microsoft/hcsshim v0.9.3 // indirect
github.com/VividCortex/ewma v1.1.1 // indirect
github.com/agext/levenshtein v1.2.1 // indirect
github.com/apparentlymart/go-cidr v1.0.1 // indirect
@@ -159,7 +160,6 @@ require (
github.com/beorn7/perks v1.0.1 // indirect
github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect
github.com/bgentry/speakeasy v0.1.0 // indirect
- github.com/bits-and-blooms/bitset v1.2.0 // indirect
github.com/bmatcuk/doublestar v1.1.5 // indirect
github.com/boltdb/bolt v1.3.1 // indirect
github.com/brianvoe/gofakeit/v6 v6.16.0
@@ -168,14 +168,14 @@ require (
github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/checkpoint-restore/go-criu/v5 v5.3.0 // indirect
github.com/cheggaaa/pb/v3 v3.0.5 // indirect
- github.com/cilium/ebpf v0.8.1 // indirect
+ github.com/cilium/ebpf v0.9.1 // indirect
github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible // indirect
github.com/circonus-labs/circonusllhist v0.1.3 // indirect
github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4 // indirect
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1 // indirect
- github.com/containerd/cgroups v1.0.2 // indirect
+ github.com/containerd/cgroups v1.0.3 // indirect
github.com/containerd/console v1.0.3 // indirect
- github.com/containerd/containerd v1.5.9 // indirect
+ github.com/containerd/containerd v1.6.6 // indirect
github.com/coreos/go-systemd/v22 v22.3.2 // indirect
github.com/cyphar/filepath-securejoin v0.2.3 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
@@ -186,7 +186,7 @@ require (
github.com/docker/go-connections v0.4.0 // indirect
github.com/docker/go-metrics v0.0.1 // indirect
github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 // indirect
- github.com/envoyproxy/go-control-plane v0.10.0 // indirect
+ github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1 // indirect
github.com/envoyproxy/protoc-gen-validate v0.6.2 // indirect
github.com/felixge/httpsnoop v1.0.1 // indirect
github.com/go-ole/go-ole v1.2.6 // indirect
@@ -214,7 +214,7 @@ require (
github.com/hashicorp/vault/api/auth/kubernetes v0.1.0 // indirect
github.com/hashicorp/vic v1.5.1-0.20190403131502-bbfe86ec9443 // indirect
github.com/huandu/xstrings v1.3.2 // indirect
- github.com/imdario/mergo v0.3.12 // indirect
+ github.com/imdario/mergo v0.3.13 // indirect
github.com/ishidawataru/sctp v0.0.0-20191218070446-00ab2ac2db07 // indirect
github.com/jefferai/isbadcipher v0.0.0-20190226160619-51d2077c035f // indirect
github.com/jmespath/go-jmespath v0.4.0 // indirect
@@ -223,19 +223,19 @@ require (
github.com/linode/linodego v0.7.1 // indirect
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
github.com/mattn/go-isatty v0.0.14 // indirect
- github.com/mattn/go-runewidth v0.0.7 // indirect
+ github.com/mattn/go-runewidth v0.0.12 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/mitchellh/go-wordwrap v1.0.1 // indirect
github.com/mitchellh/pointerstructure v1.2.1 // indirect
github.com/morikuni/aec v1.0.0 // indirect
github.com/mrunalp/fileutils v0.5.0 // indirect
+ github.com/muesli/reflow v0.3.0
github.com/nicolai86/scaleway-sdk v1.10.2-0.20180628010248-798f60e20bb2 // indirect
- github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect
github.com/oklog/run v1.1.0 // indirect
github.com/opencontainers/go-digest v1.0.0 // indirect
- github.com/opencontainers/image-spec v1.0.2 // indirect
- github.com/opencontainers/selinux v1.10.0 // indirect
+ github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 // indirect
+ github.com/opencontainers/selinux v1.10.1 // indirect
github.com/packethost/packngo v0.1.1-0.20180711074735-b9cb5096f54c // indirect
github.com/pierrec/lz4 v2.6.1+incompatible // indirect
github.com/pkg/errors v0.9.1 // indirect
@@ -245,9 +245,11 @@ require (
github.com/prometheus/procfs v0.7.3 // indirect
github.com/renier/xmlrpc v0.0.0-20170708154548-ce4a1a486c03 // indirect
github.com/rogpeppe/go-internal v1.6.1 // indirect
- github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921 // indirect
- github.com/sirupsen/logrus v1.8.1 // indirect
+ github.com/seccomp/libseccomp-golang v0.10.0 // indirect
+ github.com/shopspring/decimal v1.2.0 // indirect
+ github.com/sirupsen/logrus v1.9.0 // indirect
github.com/softlayer/softlayer-go v0.0.0-20180806151055-260589d94c7d // indirect
+ github.com/spf13/cast v1.3.1 // indirect
github.com/stretchr/objx v0.4.0 // indirect
github.com/tencentcloud/tencentcloud-sdk-go v1.0.162 // indirect
github.com/tj/go-spin v1.1.0 // indirect
@@ -255,26 +257,27 @@ require (
github.com/tklauser/numcpus v0.3.0 // indirect
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926 // indirect
github.com/ulikunitz/xz v0.5.10 // indirect
- github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5 // indirect
- github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f // indirect
+ github.com/vishvananda/netlink v1.2.1-beta.2 // indirect
+ github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74 // indirect
github.com/vmihailenco/msgpack/v4 v4.3.12 // indirect
github.com/vmihailenco/tagparser v0.1.1 // indirect
github.com/vmware/govmomi v0.18.0 // indirect
github.com/yusufpapurcu/wmi v1.2.2 // indirect
go.opencensus.io v0.23.0 // indirect
go.uber.org/atomic v1.9.0 // indirect
- golang.org/x/net v0.0.0-20220225172249-27dd8689420f // indirect
+ golang.org/x/net v0.0.0-20220802222814-0bcc04d9c69b // indirect
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect
- golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
+ golang.org/x/term v0.0.0-20220526004731-065cf7ba2467 // indirect
golang.org/x/text v0.3.7 // indirect
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
google.golang.org/api v0.60.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106 // indirect
- gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect
gopkg.in/fsnotify.v1 v1.4.7 // indirect
gopkg.in/resty.v1 v1.12.0 // indirect
gopkg.in/square/go-jose.v2 v2.6.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
+
+require github.com/rivo/uniseg v0.2.0 // indirect
diff --git a/go.sum b/go.sum
index 99906ce56a4..63988acbeec 100644
--- a/go.sum
+++ b/go.sum
@@ -61,6 +61,7 @@ github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSW
github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=
github.com/Azure/go-autorest/autorest v0.11.0/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw=
github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw=
+github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA=
github.com/Azure/go-autorest/autorest v0.11.20 h1:s8H1PbCZSqg/DH7JMlOz6YMig6htWLNPsjDdlLqCx3M=
github.com/Azure/go-autorest/autorest v0.11.20/go.mod h1:o3tqFY+QR40VOlk+pV4d77mORO64jOXSgEnPQgLK6JY=
github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0=
@@ -108,8 +109,12 @@ github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJ
github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww=
github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
+github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc=
+github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60=
github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o=
+github.com/Masterminds/sprig/v3 v3.2.0 h1:P1ekkbuU73Ui/wS0nK1HOM37hh4xdfZo485UPf8rc+Y=
+github.com/Masterminds/sprig/v3 v3.2.0/go.mod h1:tWhwTbUTndesPNeF0C900vKoq283u6zp4APT9vaF3SI=
github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg=
github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg=
github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ=
@@ -117,9 +122,9 @@ github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg3
github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg=
github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00=
github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600=
-github.com/Microsoft/hcsshim v0.8.20/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4=
-github.com/Microsoft/hcsshim v0.8.23 h1:47MSwtKGXet80aIn+7h4YI6fwPmwIghAnsx2aOUrG2M=
-github.com/Microsoft/hcsshim v0.8.23/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg=
+github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4=
+github.com/Microsoft/hcsshim v0.9.3 h1:k371PzBuRrz2b+ebGuI2nVgVhgsVX60jMfSw80NECxo=
+github.com/Microsoft/hcsshim v0.9.3/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc=
github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU=
github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY=
github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
@@ -143,7 +148,6 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0=
-github.com/alexflint/go-filemutex v1.1.0/go.mod h1:7P4iRhttt/nUvUOrYIhcpMzv2G6CY9UnI16Z+UJqRyk=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
github.com/apparentlymart/go-cidr v1.0.1 h1:NmIwLZ/KdsjIUlhf+/Np40atNXm/+lZ5txfTJ/SpF+U=
github.com/apparentlymart/go-cidr v1.0.1/go.mod h1:EBcsNrHc3zQeuaeCeCtQruQm+n9/YjEn/vI25Lg7Gwc=
@@ -160,8 +164,8 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmV
github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg=
github.com/armon/go-metrics v0.3.4/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc=
github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc=
-github.com/armon/go-metrics v0.3.10 h1:FR+drcQStOe+32sYyJYyZ7FIdgoGGBnwLl+flodp8Uo=
-github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc=
+github.com/armon/go-metrics v0.4.0 h1:yCQqn7dwca4ITXb+CbubHmedzaQYHhNhrEXLYUeEe8Q=
+github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI=
github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
@@ -181,7 +185,6 @@ github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ
github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY=
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA=
-github.com/bits-and-blooms/bitset v1.2.0 h1:Kn4yilvwNtMACtf1eYDlG8H77R07mZSPbMjLyS07ChA=
github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=
github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
@@ -194,7 +197,6 @@ github.com/brianvoe/gofakeit/v6 v6.16.0 h1:EelCqtfArd8ppJ0z+TpOxXH8sVWNPBadPNdCD
github.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=
github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk=
github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s=
-github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8=
github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50=
github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE=
@@ -224,8 +226,9 @@ github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLI
github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs=
github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs=
github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs=
-github.com/cilium/ebpf v0.8.1 h1:bLSSEbBLqGPXxls55pGr5qWZaTqcmfDJHhou7t254ao=
-github.com/cilium/ebpf v0.8.1/go.mod h1:f5zLIM0FSNuAkSyLAN7X+Hy6yznlF1mNiWUMfxMtrgk=
+github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA=
+github.com/cilium/ebpf v0.9.1 h1:64sn2K3UKw8NbP/blsixRpF3nXuyhz/VjRlRzvlBRu4=
+github.com/cilium/ebpf v0.9.1/go.mod h1:+OhNOIXx/Fnu1IE8bJz2dzOA+VSfyTfdNUVdlQnxUFY=
github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible h1:C29Ae4G5GtYyYMm1aztcyj/J5ckgJm2zwdDajFbx1NY=
github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
github.com/circonus-labs/circonusllhist v0.1.3 h1:TJH+oke8D16535+jHExHj4nQvzlZrj7ug5D7I/orNUA=
@@ -260,8 +263,8 @@ github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4S
github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo=
github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE=
github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU=
-github.com/containerd/cgroups v1.0.2 h1:mZBclaSgNDfPWtfhj2xJY28LZ9nYIgzB0pwSURPl6JM=
-github.com/containerd/cgroups v1.0.2/go.mod h1:qpbpJ1jmlqsR9f2IyaLPsdkCdnt0rbDVqIDlhuu5tRY=
+github.com/containerd/cgroups v1.0.3 h1:ADZftAkglvCiD44c77s5YmMqaP2pzVCFZvBmAlBdAP4=
+github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8=
github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw=
github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw=
github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE=
@@ -277,23 +280,22 @@ github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMX
github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
-github.com/containerd/containerd v1.4.9/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ=
github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU=
github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI=
github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s=
github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g=
-github.com/containerd/containerd v1.5.9 h1:rs6Xg1gtIxaeyG+Smsb/0xaSDu1VgFhOCKBXxMxbsF4=
-github.com/containerd/containerd v1.5.9/go.mod h1:fvQqCfadDGga5HZyn3j4+dx56qj2I9YwBrlSdalvJYQ=
+github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c=
+github.com/containerd/containerd v1.6.6 h1:xJNPhbrmz8xAMDNoVjHy9YHtWwEQNS+CDkcIRh7t8Y0=
+github.com/containerd/containerd v1.6.6/go.mod h1:ZoP1geJldzCVY3Tonoz7b1IXk8rIX0Nltt5QE4OMNk0=
github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
-github.com/containerd/continuity v0.0.0-20200228182428-0f16d7a0959c/go.mod h1:Dq467ZllaHgAtVp4p1xUQWBrFXR9s/wyoTpG8zOJGkY=
github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo=
github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y=
github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ=
-github.com/containerd/continuity v0.1.0 h1:UFRRY5JemiAhPZrr/uE0n8fMTLcZsUvySPr1+D7pgr8=
github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM=
+github.com/containerd/continuity v0.2.2 h1:QSqfxcn8c+12slxwu00AtzXrsami0MJb/MQs9lOLHLA=
github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI=
github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI=
github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0=
@@ -302,8 +304,8 @@ github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1S
github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4=
github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU=
github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk=
-github.com/containerd/go-cni v1.1.1 h1:UV64yhzDgs27mBIVUrlzG8Z2bc1K0/zokOW5vDNkI4c=
-github.com/containerd/go-cni v1.1.1/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA=
+github.com/containerd/go-cni v1.1.6 h1:el5WPymG5nRRLQF1EfB97FWob4Tdc8INg8RZMaXWZlo=
+github.com/containerd/go-cni v1.1.6/go.mod h1:BWtoWl5ghVymxu6MBjg79W9NZrCRyHIdUtk4cauMe34=
github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0=
github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0=
github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g=
@@ -316,6 +318,7 @@ github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJ
github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c=
github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY=
github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY=
+github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM=
github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o=
github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o=
github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8=
@@ -334,12 +337,12 @@ github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNR
github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=
github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=
github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=
-github.com/containernetworking/cni v1.0.1 h1:9OIL/sZmMYDBe+G8svzILAlulUpaDTUjeAbtH/JNLBo=
-github.com/containernetworking/cni v1.0.1/go.mod h1:AKuhXbN5EzmD4yTNtfSsX3tPcmtrBI6QcRV0NiNt15Y=
+github.com/containernetworking/cni v1.1.2 h1:wtRGZVv7olUHMOqouPpn3cXJWpJgM6+EUl31EQbXALQ=
+github.com/containernetworking/cni v1.1.2/go.mod h1:sDpYKmGVENF3s6uvMvGgldDWeG8dMxakj/u+i9ht9vw=
github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM=
github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8=
-github.com/containernetworking/plugins v1.0.1 h1:wwCfYbTCj5FC0EJgyzyjTXmqysOiJE9r712Z+2KVZAk=
-github.com/containernetworking/plugins v1.0.1/go.mod h1:QHCfGpaTwYTbbH+nZXKVTxNBDZcxSOplJT5ico8/FLE=
+github.com/containernetworking/plugins v1.1.1 h1:+AGfFigZ5TiQH00vhR8qPeSatj53eNGz0C1d3wVYlHE=
+github.com/containernetworking/plugins v1.1.1/go.mod h1:Sr5TH/eBsGLXK/h71HeLfX19sZPp3ry5uHSkI4LPxV8=
github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc=
github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4=
github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY=
@@ -352,7 +355,6 @@ github.com/coreos/go-iptables v0.6.0 h1:is9qnZMPYjLd8LYqmm/qlE+wwEgJIkTYdhV3rfZo
github.com/coreos/go-iptables v0.6.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q=
github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
-github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
@@ -394,6 +396,7 @@ github.com/dimchansky/utfbom v1.1.0 h1:FcM3g+nofKgUteL8dm/UpdRXNC9KmADgTpLKsu0TR
github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8=
github.com/dnaeon/go-vcr v1.0.1 h1:r8L/HqC0Hje5AXMu1ooW8oyQyOFv4GxqpL0nRP7SLLY=
github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E=
+github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
github.com/docker/cli v20.10.3-0.20220113150236-6e2838e18645+incompatible h1:cPkz7NutD1DZvwN6B+8ZF9d4Pp/rXxAhiyT1NhQFyyY=
github.com/docker/cli v20.10.3-0.20220113150236-6e2838e18645+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY=
@@ -401,9 +404,10 @@ github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible
github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68=
github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
-github.com/docker/docker v1.4.2-0.20191101170500-ac7306503d23/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
-github.com/docker/docker v20.10.12+incompatible h1:CEeNmFM0QZIsJCZKMkZx0ZcahTiewkrgiwfYD+dfl1U=
-github.com/docker/docker v20.10.12+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
+github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
+github.com/docker/docker v20.10.17+incompatible h1:JYCuMrWaVNophQTOrMMoSwudOVEfcegoZZrleKc1xwE=
+github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
+github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y=
github.com/docker/docker-credential-helpers v0.6.4 h1:axCks+yV+2MR3/kZhAmy07yC56WZ2Pwu/fKWtKuZB0o=
github.com/docker/docker-credential-helpers v0.6.4/go.mod h1:ofX3UI0Gz1TteYBjtgs07O36Pyasyp66D2uKT7H8W1c=
github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
@@ -443,8 +447,8 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
-github.com/envoyproxy/go-control-plane v0.10.0 h1:WVt4HEPbdRbRD/PKKPbPnIVavO6gk/h673jWyIJ016k=
-github.com/envoyproxy/go-control-plane v0.10.0/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ=
+github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1 h1:xvqufLtNVwAhN8NMyWklVgxnWohi+wtMGQMhtxexlm0=
+github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/envoyproxy/protoc-gen-validate v0.6.2 h1:JiO+kJTpmYGjEodY7O1Zk8oZcNz1+f30UtwtXoFUPzE=
github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws=
@@ -464,12 +468,11 @@ github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq
github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
github.com/frankban/quicktest v1.13.0/go.mod h1:qLE0fzW0VuyUAJgPU19zByoIr0HtCHN/r/VLSOOIySU=
github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss=
-github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
-github.com/fsouza/go-dockerclient v1.6.5 h1:vuFDnPcds3LvTWGYb9h0Rty14FLgkjHZdwLDROCdgsw=
-github.com/fsouza/go-dockerclient v1.6.5/go.mod h1:GOdftxWLWIbIWKbIMDroKFJzPdg6Iw7r+jX1DDZdVsA=
+github.com/fsouza/go-dockerclient v1.8.2 h1:8A2/xvHxpe5ivfQ2XDJ5EpLBTaxmsFZUJpfX1zSORRY=
+github.com/fsouza/go-dockerclient v1.8.2/go.mod h1:oenNB8JjNKY4o8I/sug4Qah9si/7OxH4MjL+u7oBxP8=
github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA=
github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
@@ -514,6 +517,7 @@ github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblf
github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4=
github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
+github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU=
@@ -590,6 +594,7 @@ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0=
github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135 h1:zLTLjkaOFEFIOxY5BWLFLwh+cL8vOBW4XJ2aqLE/Tf0=
github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
@@ -611,6 +616,7 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe
github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
@@ -639,7 +645,7 @@ github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu
github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4=
github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q=
github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
-github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
+github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
@@ -652,23 +658,22 @@ github.com/gosuri/uilive v0.0.4/go.mod h1:V/epo5LjjlDE5RJUcqx8dbw+zc93y5Ya3yg8tf
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
-github.com/grpc-ecosystem/go-grpc-middleware v1.2.1-0.20200228141219-3ce3d519df39 h1:MqvH60+R2JhSdvVgGxmExOndrkRQtGW7w4+gcrymN64=
-github.com/grpc-ecosystem/go-grpc-middleware v1.2.1-0.20200228141219-3ce3d519df39/go.mod h1:mJzapYve32yjrKlk9GbyCZHuPgZsrbyIbyKhSzOpg6s=
+github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw=
+github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y=
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
github.com/hashicorp/consul v1.7.8 h1:hp308KxAf3zWoGuwp2e+0UUhrm6qHjeBQk3jCZ+bjcY=
github.com/hashicorp/consul v1.7.8/go.mod h1:urbfGaVZDmnXC6geg0LYPh/SRUk1E8nfmDHpz+Q0nLw=
-github.com/hashicorp/consul-template v0.29.1 h1:icm/H7klHYlxpUoWqSmTIWaSLEfGqUJJBsZA/2JhTLU=
-github.com/hashicorp/consul-template v0.29.1/go.mod h1:QIohwBuXlKXtsmGGQdWrISlUy4E6LFg5tLZyrw4MyoU=
+github.com/hashicorp/consul-template v0.29.2-0.20220803104536-583050a85eea h1:d9frD3+sqQOG/4hOXLEfcXnNz+au0owaRUmM2WuzCBk=
+github.com/hashicorp/consul-template v0.29.2-0.20220803104536-583050a85eea/go.mod h1:i2oqMe0jIyHAKuimz7Q3sJU3vnwVx3QzDdDmrRrz5RI=
github.com/hashicorp/consul/api v1.4.0/go.mod h1:xc8u05kyMa3Wjr9eEAsIAo3dg8+LywT5E/Cl7cNS5nU=
-github.com/hashicorp/consul/api v1.13.0 h1:2hnLQ0GjQvw7f3O61jMO8gbasZviZTrt9R8WzgiirHc=
-github.com/hashicorp/consul/api v1.13.0/go.mod h1:ZlVrynguJKcYr54zGaDbaL3fOvKC9m72FhPvA8T35KQ=
+github.com/hashicorp/consul/api v1.13.1 h1:r5cPdVFUy+pFF7nt+0ArLD9hm+E39OewJkvNdjKXcL4=
+github.com/hashicorp/consul/api v1.13.1/go.mod h1:+1VcOos0TVdQFqXxphG4zmGcwQB4KVGkp1maPqnkDpE=
github.com/hashicorp/consul/sdk v0.4.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM=
-github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms=
-github.com/hashicorp/consul/sdk v0.9.0 h1:NGSHAU7X3yDCjo8WBUbNOtD3BSqv8u0vu3+zNxgmxQI=
-github.com/hashicorp/consul/sdk v0.9.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms=
+github.com/hashicorp/consul/sdk v0.10.0 h1:rGLEh2AWK4K0KCMvqWAz2EYxQqgciIfMagWZ0nVe5MI=
+github.com/hashicorp/consul/sdk v0.10.0/go.mod h1:yPkX5Q6CsxTFMjQQDJwzeNmUUF5NUGGbrDsv9wTb8cw=
github.com/hashicorp/cronexpr v1.1.1 h1:NJZDd87hGXjoZBdvyCF9mX4DCq5Wy7+A/w+A7q0wn6c=
github.com/hashicorp/cronexpr v1.1.1/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4=
github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
@@ -689,8 +694,8 @@ github.com/hashicorp/go-connlimit v0.3.0 h1:oAojHGjFxUTTTA8c5XXnDqWJ2HLuWbDiBPTp
github.com/hashicorp/go-connlimit v0.3.0/go.mod h1:OUj9FGL1tPIhl/2RCfzYHrIiWj+VVPGNyVPnUX8AqS0=
github.com/hashicorp/go-cty-funcs v0.0.0-20200930094925-2721b1e36840 h1:kgvybwEeu0SXktbB2y3uLHX9lklLo+nzUwh59A3jzQc=
github.com/hashicorp/go-cty-funcs v0.0.0-20200930094925-2721b1e36840/go.mod h1:Abjk0jbRkDaNCzsRhOv2iDCofYpX1eVsjozoiK63qLA=
-github.com/hashicorp/go-discover v0.0.0-20210818145131-c573d69da192 h1:eje2KOX8Sf7aYPiAsLnpWdAIrGRMcpFjN/Go/Exb7Zo=
-github.com/hashicorp/go-discover v0.0.0-20210818145131-c573d69da192/go.mod h1:3/4dzY4lR1Hzt9bBqMhBzG7lngZ0GKx/nL6G/ad62wE=
+github.com/hashicorp/go-discover v0.0.0-20220621183603-a413e131e836 h1:4wEh+GhB7WtM3ZBlqx7DJ32m4fVt4rK1XeEEez3aook=
+github.com/hashicorp/go-discover v0.0.0-20220621183603-a413e131e836/go.mod h1:1xfdKvc3pe5WKxfUUHHOGaKMk7NLGhHY1jkyhKo6098=
github.com/hashicorp/go-envparse v0.0.0-20180119215841-310ca1881b22 h1:HTmDIaSN95gbdMyrsbNiXSdW4fbGctGQwEqv0H7OhDQ=
github.com/hashicorp/go-envparse v0.0.0-20180119215841-310ca1881b22/go.mod h1:/NlxCzN2D4C4L2uDE6ux/h6jM+n98VFQM14nnCIfHJU=
github.com/hashicorp/go-gatedio v0.5.0 h1:Jm1X5yP4yCqqWj5L1TgW7iZwCVPGtVc+mro5r/XX7Tg=
@@ -828,6 +833,7 @@ github.com/hexdigest/gowrap v1.1.7/go.mod h1:Z+nBFUDLa01iaNM+/jzoOA1JJ7sm51rnYFa
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/hpcloud/tail v1.0.1-0.20170814160653-37f427138745 h1:8as8OQ+RF1QrsHvWWsKBtBKINhD9QaD1iozA1wrO4aA=
github.com/hpcloud/tail v1.0.1-0.20170814160653-37f427138745/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw=
github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
@@ -838,13 +844,13 @@ github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJ
github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
-github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
+github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk=
+github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/ishidawataru/sctp v0.0.0-20191218070446-00ab2ac2db07 h1:rw3IAne6CDuVFlZbPOkA7bhxlqawFh7RJJ+CejfMaxE=
github.com/ishidawataru/sctp v0.0.0-20191218070446-00ab2ac2db07/go.mod h1:co9pwDoBCm1kGxawmb4sPq0cSIOOWNPT4KnHotMP1Zg=
github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA=
-github.com/j-keck/arping v1.0.2/go.mod h1:aJbELhR92bSk7tp79AWM/ftfc90EfEi2bQJrbBFOsPw=
github.com/jarcoal/httpmock v0.0.0-20180424175123-9c70cfe4a1da h1:FjHUJJ7oBW4G/9j1KzlHaXL09LyMVM9rupS39lncbXk=
github.com/jarcoal/httpmock v0.0.0-20180424175123-9c70cfe4a1da/go.mod h1:ks+b9deReOc7jgqp+e7LuFiCBH6Rm5hL32cLcEAArb4=
github.com/jefferai/isbadcipher v0.0.0-20190226160619-51d2077c035f h1:E87tDTVS5W65euzixn7clSzK66puSt1H4I5SC0EmHH4=
@@ -859,6 +865,7 @@ github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9Y
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
+github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8=
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
github.com/joyent/triton-go v0.0.0-20180628001255-830d2b111e62/go.mod h1:U+RSyWxWd04xTqnuOQxnai7XGS2PrPY2cfGoDKtMHjA=
github.com/joyent/triton-go v0.0.0-20190112182421-51ffac552869 h1:BvV6PYcRz0yGnWXNZrd5wginNT1GfFfPvvWpPbjfFL8=
@@ -904,6 +911,7 @@ github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348 h1:MtvEpTB6LX3v
github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k=
github.com/linode/linodego v0.7.1 h1:4WZmMpSA2NRwlPZcc0+4Gyn7rr99Evk9bnr0B3gXRKE=
github.com/linode/linodego v0.7.1/go.mod h1:ga11n3ivecUrPCHN0rANxKmfWBJVkOXfLMZinAbj2sY=
+github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo=
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4=
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w=
@@ -930,13 +938,15 @@ github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
-github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54=
github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
+github.com/mattn/go-runewidth v0.0.12 h1:Y41i/hVW3Pgwr8gV+J23B9YEY0zxjptBuCWEaxmAOow=
+github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
-github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
+github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
+github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY=
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=
github.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=
@@ -945,8 +955,9 @@ github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WT
github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4=
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=
-github.com/mitchellh/cli v1.1.2 h1:PvH+lL2B7IQ101xQL63Of8yFS2y+aDlsFcsqNc+u/Kw=
github.com/mitchellh/cli v1.1.2/go.mod h1:6iaV0fGdElS6dPBx0EApTxHrcWvmJphyh2n8YBLPPZ4=
+github.com/mitchellh/cli v1.1.4 h1:qj8czE26AU4PbiaPXK5uVmMSM+V5BYsFBiM9HhGRLUA=
+github.com/mitchellh/cli v1.1.4/go.mod h1:vTLESy5mRhKOs9KDp0/RATawxP1UqBmdrpVRMnpcvKQ=
github.com/mitchellh/colorstring v0.0.0-20150917214807-8631ce90f286 h1:KHyL+3mQOF9sPfs26lsefckcFNDcIZtiACQiECzIUkw=
github.com/mitchellh/colorstring v0.0.0-20150917214807-8631ce90f286/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw=
github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw=
@@ -988,13 +999,13 @@ github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx
github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=
github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc=
-github.com/moby/sys/mount v0.3.0 h1:bXZYMmq7DBQPwHRxH/MG+u9+XF90ZOwoXpHTOznMGp0=
-github.com/moby/sys/mount v0.3.0/go.mod h1:U2Z3ur2rXPFrFmy4q6WMwWrBOAQGYtYTRVM8BIvzbwk=
+github.com/moby/sys/mount v0.3.3 h1:fX1SVkXFJ47XWDoeFW4Sq7PdQJnV2QIDZAqjNqgEjUs=
+github.com/moby/sys/mount v0.3.3/go.mod h1:PBaEorSNTLG5t/+4EgukEQVlAvVEc6ZjTySwKdqp5K0=
github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A=
github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A=
github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU=
-github.com/moby/sys/mountinfo v0.6.0 h1:gUDhXQx58YNrpHlK4nSL+7y2pxFZkUcXqzFDKWdC0Oo=
-github.com/moby/sys/mountinfo v0.6.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU=
+github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78=
+github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI=
github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ=
github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo=
github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc=
@@ -1008,6 +1019,8 @@ github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
github.com/mrunalp/fileutils v0.5.0 h1:NKzVxiH7eSk+OQ4M+ZYW1K6h27RUV3MI6NUTsHhU6Z4=
github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ=
+github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s=
+github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8=
github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
@@ -1029,21 +1042,26 @@ github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:v
github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
-github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0=
github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc=
github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
+github.com/onsi/ginkgo/v2 v2.1.3 h1:e/3Cwtogj0HA+25nMP1jCMDIf8RtRYbGwGGuBIFztkc=
+github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
+github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
+github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
-github.com/onsi/gomega v1.15.0 h1:WjP/FQ/sk43MRmnEcT+MlDw2TFvkrXlprrPST/IudjU=
-github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0=
+github.com/onsi/gomega v1.17.0 h1:9Luw4uT5HTjHTN8+aNcSThgH1vdXnmdJ8xIfZ4wyTRE=
+github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
@@ -1052,16 +1070,16 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
-github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM=
-github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
+github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 h1:rc3tiVYb5z54aKaDfakKn0dDjIyPpTtszkjuMzyt7ec=
+github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0=
github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0=
-github.com/opencontainers/runc v1.0.3 h1:1hbqejyQWCJBvtKAfdO0b1FmaEf2z/bxnjqbARass5k=
-github.com/opencontainers/runc v1.0.3/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0=
+github.com/opencontainers/runc v1.1.3 h1:vIXrkId+0/J2Ymu2m7VjGvbSlAId9XNRPhn2p4b+d8w=
+github.com/opencontainers/runc v1.1.3/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg=
github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
@@ -1073,8 +1091,9 @@ github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mo
github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE=
github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo=
github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8=
-github.com/opencontainers/selinux v1.10.0 h1:rAiKF8hTcgLI3w0DHm6i0ylVVcOrlgR1kK99DRLDhyU=
github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI=
+github.com/opencontainers/selinux v1.10.1 h1:09LIPVRP3uuZGQvgR+SgMSNBd1Eb3vlRbGqQpoHsF8w=
+github.com/opencontainers/selinux v1.10.1/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI=
github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
github.com/packethost/packngo v0.1.1-0.20180711074735-b9cb5096f54c h1:vwpFWvAO8DeIZfFeqASzZfsxuWPno9ncAebBEP0N3uE=
@@ -1149,6 +1168,9 @@ github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40T
github.com/rboyer/safeio v0.2.1/go.mod h1:Cq/cEPK+YXFn622lsQ0K4KsPZSPtaptHHEldsy7Fmig=
github.com/renier/xmlrpc v0.0.0-20170708154548-ce4a1a486c03 h1:Wdi9nwnhFNAlseAOekn6B5G/+GMtks9UKbvRU/CMM/o=
github.com/renier/xmlrpc v0.0.0-20170708154548-ce4a1a486c03/go.mod h1:gRAiPF5C5Nd0eyyRdqIu9qTiFSoZzpTq727b5B8fkkU=
+github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
+github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
+github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
@@ -1164,14 +1186,14 @@ github.com/ryanuber/columnize v2.1.1-0.20170703205827-abc90934186a+incompatible/
github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk=
github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc=
github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4=
-github.com/safchain/ethtool v0.0.0-20210803160452-9aa261dae9b1/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4=
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
-github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw=
+github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo=
-github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921 h1:58EBmR2dMNL2n/FnbQewK3D14nXr0V9CObDSvMJLq+Y=
-github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg=
+github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg=
+github.com/seccomp/libseccomp-golang v0.10.0 h1:aA4bp+/Zzi0BnWZ2F1wgNBs5gTpm+na2rWM6M9YjLpY=
+github.com/seccomp/libseccomp-golang v0.10.0/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg=
github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
github.com/shirou/gopsutil v0.0.0-20181107111621-48177ef5f880/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
@@ -1180,6 +1202,8 @@ github.com/shirou/gopsutil/v3 v3.21.12/go.mod h1:BToYZVTlSVlfazpDDYFnsVZLaoRG+g8
github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=
github.com/shoenig/test v0.3.1 h1:dhGZztS6nQuvJ0o0RtUiQHaEO4hhArh/WmWwik3Ols0=
github.com/shoenig/test v0.3.1/go.mod h1:xYtyGBC5Q3kzCNyJg/SjgNpfAa2kvmgA0i5+lQso8x0=
+github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ=
+github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
@@ -1188,8 +1212,9 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
-github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
+github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
+github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/skratchdot/open-golang v0.0.0-20160302144031-75fb7ed4208c h1:fyKiXKO1/I/B6Y2U8T7WdQGWzwehOuGIrljPtt7YTTI=
github.com/skratchdot/open-golang v0.0.0-20160302144031-75fb7ed4208c/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
@@ -1203,6 +1228,8 @@ github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTd
github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=
github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
+github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng=
+github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
@@ -1259,13 +1286,13 @@ github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX
github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk=
github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE=
github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho=
-github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5 h1:+UB2BJA852UkGH42H+Oee69djmxS3ANzl2b/JtT1YiA=
-github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho=
+github.com/vishvananda/netlink v1.2.1-beta.2 h1:Llsql0lnQEbHj0I1OuKyp8otXp0r3q0mPkuhwHfStVs=
+github.com/vishvananda/netlink v1.2.1-beta.2/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho=
github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI=
github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU=
github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
-github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f h1:p4VB7kIXpOQvVn1ZaTIVp+3vuYAXFe3OJEvjbUYJLaA=
-github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
+github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74 h1:gga7acRE695APm9hlsSMoOoE65U4/TcqNj90mc69Rlg=
+github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=
github.com/vmihailenco/msgpack/v4 v4.3.12 h1:07s4sz9IReOgdikxLTKNbBdqDMLsjPKXwvCazn8G65U=
github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4=
@@ -1300,8 +1327,9 @@ github.com/zclconf/go-cty-yaml v1.0.2 h1:dNyg4QLTrv2IfJpm7Wtxi55ed5gLGOlPrZ6kMd5
github.com/zclconf/go-cty-yaml v1.0.2/go.mod h1:IP3Ylp0wQpYm50IHK8OZWKMu6sPJIUgKa8XhiVHura0=
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
-go.etcd.io/bbolt v1.3.5 h1:XAzx9gjCb0Rxj7EoqcClPD1d5ZBxZJk0jbuoPHenBt0=
go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
+go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU=
+go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4=
go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg=
go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
@@ -1336,6 +1364,7 @@ golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191106202628-ed6320f186d4/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200422194213-44a606286825/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
@@ -1443,10 +1472,11 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT
golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc=
-golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220802222814-0bcc04d9c69b h1:3ogNYyK4oIQdIKzTu68hQrr4iuVxF3AxKl9Aj/eDrw0=
+golang.org/x/net v0.0.0-20220802222814-0bcc04d9c69b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -1503,6 +1533,7 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1537,7 +1568,6 @@ golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1550,6 +1580,7 @@ golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1578,7 +1609,6 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -1588,12 +1618,18 @@ golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220517195934-5e4e11fc645e h1:w36l2Uw3dRan1K3TyXriXvY+6T56GNmlKGcqiQUJDfM=
+golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220517195934-5e4e11fc645e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220803195053-6e608f9ce704 h1:Y7NOhdqIOU8kYI7BxsgL38d0ot0raxvcW+EMQU2QrT4=
+golang.org/x/sys v0.0.0-20220803195053-6e608f9ce704/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY=
-golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.0.0-20220526004731-065cf7ba2467 h1:CBpWXWQpIRjzmkkA+M7q9Fqnwd2mZr3AFqexg8YTfoM=
+golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1633,6 +1669,7 @@ golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgw
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI=
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
@@ -1656,14 +1693,17 @@ golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjs
golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
+golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
@@ -1749,11 +1789,13 @@ google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfG
google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
@@ -1823,8 +1865,9 @@ google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnD
google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k=
-google.golang.org/grpc v1.45.0 h1:NEpgUqV3Z+ZjkqMsxMg11IaDrXY4RY6CQukSGK0uI1M=
google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=
+google.golang.org/grpc v1.48.0 h1:rQOsyJ/8+ufEDJd/Gdsz7HG220Mh9HAhFHRGnIjda0w=
+google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
@@ -1838,8 +1881,9 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
+google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw=
@@ -1879,6 +1923,7 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
@@ -1911,6 +1956,7 @@ k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y=
k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k=
k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0=
k8s.io/client-go v8.0.0+incompatible/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s=
+k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0=
k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk=
k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI=
k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM=
@@ -1920,18 +1966,22 @@ k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI=
k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc=
k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
+k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
+k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
+k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E=
+k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o=
k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM=
k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk=
k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
-oss.indeed.com/go/libtime v1.5.0 h1:wulKS+oHhb3P2wFi1fcA+g8CXiC8+ygFECUQea5ZqLU=
-oss.indeed.com/go/libtime v1.5.0/go.mod h1:B2sdEcuzB0zhTKkAuHy4JInKRc7Al3tME4qWam6R7mA=
+oss.indeed.com/go/libtime v1.6.0 h1:XQyczJihse/wQGo59OfPF3f4f+Sywv4R8vdGB3S9BfU=
+oss.indeed.com/go/libtime v1.6.0/go.mod h1:B2sdEcuzB0zhTKkAuHy4JInKRc7Al3tME4qWam6R7mA=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
@@ -1939,6 +1989,7 @@ sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyz
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
+sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
diff --git a/helper/escapingio/reader.go b/helper/escapingio/reader.go
index edb10514196..e1cdb75539b 100644
--- a/helper/escapingio/reader.go
+++ b/helper/escapingio/reader.go
@@ -16,10 +16,10 @@ type Handler func(c byte) bool
// For illustrative purposes, we use `~` in documentation as a shorthand for escaping character.
//
// If following a new line, reader sees:
-// * `~~`, only one is emitted
-// * `~.` (or any character), the handler is invoked with the character.
+// - `~~`, only one is emitted
+// - `~.` (or any character), the handler is invoked with the character.
// If handler returns true, `~.` will be skipped; otherwise, it's propagated.
-// * `~` and it's the last character in stream, it's propagated
+// - `~` and it's the last character in stream, it's propagated
//
// Appearances of `~` when not preceded by a new line are propagated unmodified.
func NewReader(r io.Reader, c byte, h Handler) io.Reader {
diff --git a/helper/funcs.go b/helper/funcs.go
index 24aa0159e33..dc5563d2ee8 100644
--- a/helper/funcs.go
+++ b/helper/funcs.go
@@ -3,6 +3,7 @@ package helper
import (
"crypto/sha512"
"fmt"
+ "net/http"
"path/filepath"
"reflect"
"regexp"
@@ -32,6 +33,10 @@ var invalidFilenameNonASCII = regexp.MustCompile(`[[:^ascii:]/\\<>:"|?*]`)
// invalidFilenameStrict = invalidFilename plus additional punctuation
var invalidFilenameStrict = regexp.MustCompile(`[/\\<>:"|?*$()+=[\];#@~,&']`)
+type Copyable[T any] interface {
+ Copy() T
+}
+
// IsUUID returns true if the given string is a valid UUID.
func IsUUID(str string) bool {
const uuidLen = 36
@@ -69,69 +74,6 @@ func HashUUID(input string) (output string, hashed bool) {
return output, true
}
-// BoolToPtr returns the pointer to a boolean.
-//
-// Deprecated; use pointer.Of instead.
-func BoolToPtr(b bool) *bool {
- return &b
-}
-
-// IntToPtr returns the pointer to an int.
-//
-// Deprecated; use pointer.Of instead.
-func IntToPtr(i int) *int {
- return &i
-}
-
-// Int8ToPtr returns the pointer to an int8.
-//
-// Deprecated; use pointer.Of instead.
-func Int8ToPtr(i int8) *int8 {
- return &i
-}
-
-// Int32ToPtr returns the pointer to an int32.
-//
-// Deprecated; use pointer.Of instead.
-func Int32ToPtr(i int32) *int32 {
- return &i
-}
-
-// Int64ToPtr returns the pointer to an int64.
-//
-// Deprecated; use pointer.Of instead.
-func Int64ToPtr(i int64) *int64 {
- return &i
-}
-
-// Uint64ToPtr returns the pointer to an uint64.
-//
-// Deprecated; use pointer.Of instead.
-func Uint64ToPtr(u uint64) *uint64 {
- return &u
-}
-
-// UintToPtr returns the pointer to an uint.
-//
-// Deprecated; use pointer.Of instead.
-func UintToPtr(u uint) *uint {
- return &u
-}
-
-// StringToPtr returns the pointer to a string.
-//
-// Deprecated; use pointer.Of instead.
-func StringToPtr(str string) *string {
- return &str
-}
-
-// TimeToPtr returns the pointer to a time.Duration.
-//
-// Deprecated; use pointer.Of instead.
-func TimeToPtr(t time.Duration) *time.Duration {
- return &t
-}
-
// CompareTimePtrs return true if a is the same as b.
func CompareTimePtrs(a, b *time.Duration) bool {
if a == nil || b == nil {
@@ -140,13 +82,6 @@ func CompareTimePtrs(a, b *time.Duration) bool {
return *a == *b
}
-// Float64ToPtr returns the pointer to an float64.
-//
-// Deprecated; use pointer.Of instead.
-func Float64ToPtr(f float64) *float64 {
- return &f
-}
-
// Min returns the minimum of a and b.
func Min[T constraints.Ordered](a, b T) T {
if a < b {
@@ -163,36 +98,6 @@ func Max[T constraints.Ordered](a, b T) T {
return b
}
-// IntMin returns the minimum of a and b.
-//
-// Deprecated; use Min instead.
-func IntMin(a, b int) int {
- if a < b {
- return a
- }
- return b
-}
-
-// IntMax returns the maximum of a and b.
-//
-// Deprecated; use Max instead.
-func IntMax(a, b int) int {
- if a > b {
- return a
- }
- return b
-}
-
-// Uint64Max returns the maximum of a and b.
-//
-// Deprecated; use Max instead.
-func Uint64Max(a, b uint64) uint64 {
- if a > b {
- return a
- }
- return b
-}
-
// MapStringStringSliceValueSet returns the set of values in a map[string][]string
func MapStringStringSliceValueSet(m map[string][]string) []string {
set := make(map[string]struct{})
@@ -361,9 +266,9 @@ func CompareMapStringString(a, b map[string]string) bool {
// CopyMap creates a copy of m. Struct values are not deep copies.
//
-// If m is nil or contains no elements, the return value is nil.
+// If m is nil the return value is nil.
func CopyMap[M ~map[K]V, K comparable, V any](m M) M {
- if len(m) == 0 {
+ if m == nil {
return nil
}
@@ -374,16 +279,44 @@ func CopyMap[M ~map[K]V, K comparable, V any](m M) M {
return result
}
+// DeepCopyMap creates a copy of m by calling Copy() on each value.
+//
+// If m is nil the return value is nil.
+func DeepCopyMap[M ~map[K]V, K comparable, V Copyable[V]](m M) M {
+ if m == nil {
+ return nil
+ }
+
+ result := make(M, len(m))
+ for k, v := range m {
+ result[k] = v.Copy()
+ }
+ return result
+}
+
+// CopySlice creates a deep copy of s. For slices with elements that do not
+// implement Copy(), use slices.Clone.
+func CopySlice[S ~[]E, E Copyable[E]](s S) S {
+ if s == nil {
+ return nil
+ }
+
+ result := make(S, len(s))
+ for i, v := range s {
+ result[i] = v.Copy()
+ }
+ return result
+}
+
// CopyMapStringString creates a copy of m.
//
// Deprecated; use CopyMap instead.
func CopyMapStringString(m map[string]string) map[string]string {
- l := len(m)
- if l == 0 {
+ if m == nil {
return nil
}
- c := make(map[string]string, l)
+ c := make(map[string]string, len(m))
for k, v := range m {
c[k] = v
}
@@ -394,12 +327,11 @@ func CopyMapStringString(m map[string]string) map[string]string {
//
// Deprecated; use CopyMap instead.
func CopyMapStringStruct(m map[string]struct{}) map[string]struct{} {
- l := len(m)
- if l == 0 {
+ if m == nil {
return nil
}
- c := make(map[string]struct{}, l)
+ c := make(map[string]struct{}, len(m))
for k := range m {
c[k] = struct{}{}
}
@@ -410,12 +342,11 @@ func CopyMapStringStruct(m map[string]struct{}) map[string]struct{} {
//
// Deprecated; use CopyMap instead.
func CopyMapStringInterface(m map[string]interface{}) map[string]interface{} {
- l := len(m)
- if l == 0 {
+ if m == nil {
return nil
}
- c := make(map[string]interface{}, l)
+ c := make(map[string]interface{}, len(m))
for k, v := range m {
c[k] = v
}
@@ -729,3 +660,45 @@ func ConvertSlice[A, B any](original []A, conversion func(a A) B) []B {
}
return result
}
+
+// IsMethodHTTP returns whether s is a known HTTP method, ignoring case.
+func IsMethodHTTP(s string) bool {
+ switch strings.ToUpper(s) {
+ case http.MethodGet:
+ case http.MethodHead:
+ case http.MethodPost:
+ case http.MethodPut:
+ case http.MethodPatch:
+ case http.MethodDelete:
+ case http.MethodConnect:
+ case http.MethodOptions:
+ case http.MethodTrace:
+ default:
+ return false
+ }
+ return true
+}
+
+// EqualsFunc represents a type implementing the Equals method.
+type EqualsFunc[A any] interface {
+ Equals(A) bool
+}
+
+// ElementsEquals returns true if slices a and b contain the same elements (in
+// no particular order) using the Equals function defined on their type for
+// comparison.
+func ElementsEquals[T EqualsFunc[T]](a, b []T) bool {
+ if len(a) != len(b) {
+ return false
+ }
+OUTER:
+ for _, item := range a {
+ for _, other := range b {
+ if item.Equals(other) {
+ continue OUTER
+ }
+ }
+ return false
+ }
+ return true
+}
diff --git a/helper/funcs_test.go b/helper/funcs_test.go
index be77678d661..cd71cb5c3a1 100644
--- a/helper/funcs_test.go
+++ b/helper/funcs_test.go
@@ -8,6 +8,7 @@ import (
"testing"
"time"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/shoenig/test/must"
"github.com/stretchr/testify/require"
)
@@ -68,7 +69,7 @@ func Test_CopyMap(t *testing.T) {
t.Run("empty", func(t *testing.T) {
m := make(map[string]int, 10)
result := CopyMap(m)
- must.Nil(t, result)
+ must.MapEq(t, map[string]int{}, result)
})
t.Run("elements", func(t *testing.T) {
@@ -136,15 +137,15 @@ func TestCompareTimePtrs(t *testing.T) {
a := (*time.Duration)(nil)
b := (*time.Duration)(nil)
require.True(t, CompareTimePtrs(a, b))
- c := TimeToPtr(3 * time.Second)
+ c := pointer.Of(3 * time.Second)
require.False(t, CompareTimePtrs(a, c))
require.False(t, CompareTimePtrs(c, a))
})
t.Run("not nil", func(t *testing.T) {
- a := TimeToPtr(1 * time.Second)
- b := TimeToPtr(1 * time.Second)
- c := TimeToPtr(2 * time.Second)
+ a := pointer.Of(1 * time.Second)
+ b := pointer.Of(1 * time.Second)
+ c := pointer.Of(2 * time.Second)
require.True(t, CompareTimePtrs(a, b))
require.False(t, CompareTimePtrs(a, c))
})
@@ -568,5 +569,73 @@ func Test_ConvertSlice(t *testing.T) {
expectedOutput := []*wrapper{{id: 10}, {id: 13}, {id: 1987}, {id: 2020}}
actualOutput := ConvertSlice(input, cFn)
require.ElementsMatch(t, expectedOutput, actualOutput)
+
+ })
+}
+
+func Test_IsMethodHTTP(t *testing.T) {
+ t.Run("is method", func(t *testing.T) {
+ cases := []string{
+ "GET", "Get", "get",
+ "HEAD", "Head", "head",
+ "POST", "Post", "post",
+ "PUT", "Put", "put",
+ "PATCH", "Patch", "patch",
+ "DELETE", "Delete", "delete",
+ "CONNECT", "Connect", "connect",
+ "OPTIONS", "Options", "options",
+ "TRACE", "Trace", "trace",
+ }
+ for _, tc := range cases {
+ result := IsMethodHTTP(tc)
+ must.True(t, result)
+ }
+ })
+
+ t.Run("is not method", func(t *testing.T) {
+ not := []string{"GETTER", "!GET", ""}
+ for _, tc := range not {
+ result := IsMethodHTTP(tc)
+ must.False(t, result)
+ }
+ })
+}
+
+type employee struct {
+ id int
+ name string
+}
+
+func (e *employee) Equals(o *employee) bool {
+ return e.id == o.id // name can be different
+}
+
+func Test_ElementsEquals(t *testing.T) {
+ t.Run("empty", func(t *testing.T) {
+ a := []*employee(nil)
+ var b []*employee
+ must.True(t, ElementsEquals(a, b))
+ must.True(t, ElementsEquals(b, a))
+ })
+
+ t.Run("different sizes", func(t *testing.T) {
+ a := []*employee{{1, "mitchell"}, {2, "armon"}, {3, "jack"}}
+ b := []*employee{{1, "mitchell"}, {2, "armon"}}
+ must.False(t, ElementsEquals(a, b))
+ must.False(t, ElementsEquals(b, a))
+ })
+
+ t.Run("equal", func(t *testing.T) {
+ a := []*employee{{1, "mitchell"}, {2, "armon"}, {3, "jack"}}
+ b := []*employee{{1, "M.H."}, {2, "A.D."}, {3, "J.P."}}
+ must.True(t, ElementsEquals(a, b))
+ must.True(t, ElementsEquals(b, a))
+ })
+
+ t.Run("different", func(t *testing.T) {
+ a := []*employee{{1, "mitchell"}, {2, "armon"}, {3, "jack"}}
+ b := []*employee{{0, "mitchell."}, {2, "armon"}, {3, "jack"}}
+ must.False(t, ElementsEquals(a, b))
+ must.False(t, ElementsEquals(b, a))
})
}
diff --git a/helper/pluginutils/hclutils/testing.go b/helper/pluginutils/hclutils/testing.go
index 469cec7d5b8..49211f010f1 100644
--- a/helper/pluginutils/hclutils/testing.go
+++ b/helper/pluginutils/hclutils/testing.go
@@ -40,12 +40,8 @@ func (b *HCLParser) WithVars(vars map[string]cty.Value) *HCLParser {
// out parameter should be a golang reference to a driver specific TaskConfig reference.
// The function terminates and reports errors if any is found during conversion.
//
-// Sample invocation would be
-//
-// ```
-// var tc *TaskConfig
-// hclutils.NewConfigParser(spec).ParseJson(t, configString, &tc)
-// ```
+// var tc *TaskConfig
+// hclutils.NewConfigParser(spec).ParseJson(t, configString, &tc)
func (b *HCLParser) ParseJson(t *testing.T, configStr string, out interface{}) {
config := JsonConfigToInterface(t, configStr)
b.parse(t, config, out)
@@ -55,7 +51,7 @@ func (b *HCLParser) ParseJson(t *testing.T, configStr string, out interface{}) {
// out parameter should be a golang reference to a driver specific TaskConfig reference.
// The function terminates and reports errors if any is found during conversion.
//
-// Sample invocation would be
+// # Sample invocation would be
//
// ```
// var tc *TaskConfig
diff --git a/helper/pluginutils/loader/testing.go b/helper/pluginutils/loader/testing.go
index f811804ecc7..75d2432fe6d 100644
--- a/helper/pluginutils/loader/testing.go
+++ b/helper/pluginutils/loader/testing.go
@@ -6,7 +6,7 @@ import (
log "github.com/hashicorp/go-hclog"
plugin "github.com/hashicorp/go-plugin"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/plugins/base"
)
@@ -51,7 +51,7 @@ func (m *MockInstance) ApiVersion() string { return
// passed inst as the plugin
func MockBasicExternalPlugin(inst interface{}, apiVersion string) *MockInstance {
var killedLock sync.Mutex
- killed := helper.BoolToPtr(false)
+ killed := pointer.Of(false)
return &MockInstance{
InternalPlugin: false,
KillF: func() {
diff --git a/helper/pointer/pointer.go b/helper/pointer/pointer.go
index 766b4ba60a9..8fa960caf71 100644
--- a/helper/pointer/pointer.go
+++ b/helper/pointer/pointer.go
@@ -5,3 +5,12 @@ package pointer
func Of[A any](a A) *A {
return &a
}
+
+// Copy returns a new pointer to a.
+func Copy[A any](a *A) *A {
+ if a == nil {
+ return nil
+ }
+ na := *a
+ return &na
+}
diff --git a/helper/pool/pool.go b/helper/pool/pool.go
index e554c93d490..8f111b92d71 100644
--- a/helper/pool/pool.go
+++ b/helper/pool/pool.go
@@ -47,7 +47,7 @@ type Conn struct {
addr net.Addr
session *yamux.Session
- lastUsed time.Time
+ lastUsed atomic.Pointer[time.Time]
pool *ConnPool
@@ -58,7 +58,8 @@ type Conn struct {
// markForUse does all the bookkeeping required to ready a connection for use,
// and ensure that active connections don't get reaped.
func (c *Conn) markForUse() {
- c.lastUsed = time.Now()
+ now := time.Now()
+ c.lastUsed.Store(&now)
atomic.AddInt32(&c.refCount, 1)
}
@@ -402,9 +403,12 @@ func (p *ConnPool) getNewConn(region string, addr net.Addr) (*Conn, error) {
addr: addr,
session: session,
clients: list.New(),
- lastUsed: time.Now(),
+ lastUsed: atomic.Pointer[time.Time]{},
pool: p,
}
+
+ now := time.Now()
+ c.lastUsed.Store(&now)
return c, nil
}
@@ -526,7 +530,7 @@ func (p *ConnPool) reap() {
now := time.Now()
for host, conn := range p.pool {
// Skip recently used connections
- if now.Sub(conn.lastUsed) < p.maxTime {
+ if now.Sub(*conn.lastUsed.Load()) < p.maxTime {
continue
}
diff --git a/helper/raftutil/msgtypes.go b/helper/raftutil/msgtypes.go
index d0249625f19..a1156db6e46 100644
--- a/helper/raftutil/msgtypes.go
+++ b/helper/raftutil/msgtypes.go
@@ -54,8 +54,7 @@ var msgTypeNames = map[structs.MessageType]string{
structs.ServiceRegistrationUpsertRequestType: "ServiceRegistrationUpsertRequestType",
structs.ServiceRegistrationDeleteByIDRequestType: "ServiceRegistrationDeleteByIDRequestType",
structs.ServiceRegistrationDeleteByNodeIDRequestType: "ServiceRegistrationDeleteByNodeIDRequestType",
- structs.SecureVariableUpsertRequestType: "SecureVariableUpsertRequestType",
- structs.SecureVariableDeleteRequestType: "SecureVariableDeleteRequestType",
+ structs.SVApplyStateRequestType: "SVApplyStateRequestType",
structs.RootKeyMetaUpsertRequestType: "RootKeyMetaUpsertRequestType",
structs.RootKeyMetaDeleteRequestType: "RootKeyMetaDeleteRequestType",
structs.ACLRolesUpsertRequestType: "ACLRolesUpsertRequestType",
diff --git a/internal/testing/apitests/tasks_test.go b/internal/testing/apitests/tasks_test.go
index b4cbe8cf96e..847fb4cd544 100644
--- a/internal/testing/apitests/tasks_test.go
+++ b/internal/testing/apitests/tasks_test.go
@@ -6,6 +6,7 @@ import (
"github.com/hashicorp/nomad/api"
"github.com/hashicorp/nomad/ci"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/nomad/structs"
"github.com/stretchr/testify/assert"
)
@@ -27,130 +28,130 @@ func TestTaskGroup_Canonicalize_ReschedulePolicy(t *testing.T) {
jobReschedulePolicy: nil,
taskReschedulePolicy: nil,
expected: &api.ReschedulePolicy{
- Attempts: intToPtr(structs.DefaultBatchJobReschedulePolicy.Attempts),
- Interval: timeToPtr(structs.DefaultBatchJobReschedulePolicy.Interval),
- Delay: timeToPtr(structs.DefaultBatchJobReschedulePolicy.Delay),
- DelayFunction: stringToPtr(structs.DefaultBatchJobReschedulePolicy.DelayFunction),
- MaxDelay: timeToPtr(structs.DefaultBatchJobReschedulePolicy.MaxDelay),
- Unlimited: boolToPtr(structs.DefaultBatchJobReschedulePolicy.Unlimited),
+ Attempts: pointer.Of(structs.DefaultBatchJobReschedulePolicy.Attempts),
+ Interval: pointer.Of(structs.DefaultBatchJobReschedulePolicy.Interval),
+ Delay: pointer.Of(structs.DefaultBatchJobReschedulePolicy.Delay),
+ DelayFunction: pointer.Of(structs.DefaultBatchJobReschedulePolicy.DelayFunction),
+ MaxDelay: pointer.Of(structs.DefaultBatchJobReschedulePolicy.MaxDelay),
+ Unlimited: pointer.Of(structs.DefaultBatchJobReschedulePolicy.Unlimited),
},
},
{
desc: "Empty job reschedule policy",
jobReschedulePolicy: &api.ReschedulePolicy{
- Attempts: intToPtr(0),
- Interval: timeToPtr(0),
- Delay: timeToPtr(0),
- MaxDelay: timeToPtr(0),
- DelayFunction: stringToPtr(""),
- Unlimited: boolToPtr(false),
+ Attempts: pointer.Of(0),
+ Interval: pointer.Of(time.Duration(0)),
+ Delay: pointer.Of(time.Duration(0)),
+ MaxDelay: pointer.Of(time.Duration(0)),
+ DelayFunction: pointer.Of(""),
+ Unlimited: pointer.Of(false),
},
taskReschedulePolicy: nil,
expected: &api.ReschedulePolicy{
- Attempts: intToPtr(0),
- Interval: timeToPtr(0),
- Delay: timeToPtr(0),
- MaxDelay: timeToPtr(0),
- DelayFunction: stringToPtr(""),
- Unlimited: boolToPtr(false),
+ Attempts: pointer.Of(0),
+ Interval: pointer.Of(time.Duration(0)),
+ Delay: pointer.Of(time.Duration(0)),
+ MaxDelay: pointer.Of(time.Duration(0)),
+ DelayFunction: pointer.Of(""),
+ Unlimited: pointer.Of(false),
},
},
{
desc: "Inherit from job",
jobReschedulePolicy: &api.ReschedulePolicy{
- Attempts: intToPtr(1),
- Interval: timeToPtr(20 * time.Second),
- Delay: timeToPtr(20 * time.Second),
- MaxDelay: timeToPtr(10 * time.Minute),
- DelayFunction: stringToPtr("constant"),
- Unlimited: boolToPtr(false),
+ Attempts: pointer.Of(1),
+ Interval: pointer.Of(20 * time.Second),
+ Delay: pointer.Of(20 * time.Second),
+ MaxDelay: pointer.Of(10 * time.Minute),
+ DelayFunction: pointer.Of("constant"),
+ Unlimited: pointer.Of(false),
},
taskReschedulePolicy: nil,
expected: &api.ReschedulePolicy{
- Attempts: intToPtr(1),
- Interval: timeToPtr(20 * time.Second),
- Delay: timeToPtr(20 * time.Second),
- MaxDelay: timeToPtr(10 * time.Minute),
- DelayFunction: stringToPtr("constant"),
- Unlimited: boolToPtr(false),
+ Attempts: pointer.Of(1),
+ Interval: pointer.Of(20 * time.Second),
+ Delay: pointer.Of(20 * time.Second),
+ MaxDelay: pointer.Of(10 * time.Minute),
+ DelayFunction: pointer.Of("constant"),
+ Unlimited: pointer.Of(false),
},
},
{
desc: "Set in task",
jobReschedulePolicy: nil,
taskReschedulePolicy: &api.ReschedulePolicy{
- Attempts: intToPtr(5),
- Interval: timeToPtr(2 * time.Minute),
- Delay: timeToPtr(20 * time.Second),
- MaxDelay: timeToPtr(10 * time.Minute),
- DelayFunction: stringToPtr("constant"),
- Unlimited: boolToPtr(false),
+ Attempts: pointer.Of(5),
+ Interval: pointer.Of(2 * time.Minute),
+ Delay: pointer.Of(20 * time.Second),
+ MaxDelay: pointer.Of(10 * time.Minute),
+ DelayFunction: pointer.Of("constant"),
+ Unlimited: pointer.Of(false),
},
expected: &api.ReschedulePolicy{
- Attempts: intToPtr(5),
- Interval: timeToPtr(2 * time.Minute),
- Delay: timeToPtr(20 * time.Second),
- MaxDelay: timeToPtr(10 * time.Minute),
- DelayFunction: stringToPtr("constant"),
- Unlimited: boolToPtr(false),
+ Attempts: pointer.Of(5),
+ Interval: pointer.Of(2 * time.Minute),
+ Delay: pointer.Of(20 * time.Second),
+ MaxDelay: pointer.Of(10 * time.Minute),
+ DelayFunction: pointer.Of("constant"),
+ Unlimited: pointer.Of(false),
},
},
{
desc: "Merge from job",
jobReschedulePolicy: &api.ReschedulePolicy{
- Attempts: intToPtr(1),
- Delay: timeToPtr(20 * time.Second),
- MaxDelay: timeToPtr(10 * time.Minute),
+ Attempts: pointer.Of(1),
+ Delay: pointer.Of(20 * time.Second),
+ MaxDelay: pointer.Of(10 * time.Minute),
},
taskReschedulePolicy: &api.ReschedulePolicy{
- Interval: timeToPtr(5 * time.Minute),
- DelayFunction: stringToPtr("constant"),
- Unlimited: boolToPtr(false),
+ Interval: pointer.Of(5 * time.Minute),
+ DelayFunction: pointer.Of("constant"),
+ Unlimited: pointer.Of(false),
},
expected: &api.ReschedulePolicy{
- Attempts: intToPtr(1),
- Interval: timeToPtr(5 * time.Minute),
- Delay: timeToPtr(20 * time.Second),
- MaxDelay: timeToPtr(10 * time.Minute),
- DelayFunction: stringToPtr("constant"),
- Unlimited: boolToPtr(false),
+ Attempts: pointer.Of(1),
+ Interval: pointer.Of(5 * time.Minute),
+ Delay: pointer.Of(20 * time.Second),
+ MaxDelay: pointer.Of(10 * time.Minute),
+ DelayFunction: pointer.Of("constant"),
+ Unlimited: pointer.Of(false),
},
},
{
desc: "Override from group",
jobReschedulePolicy: &api.ReschedulePolicy{
- Attempts: intToPtr(1),
- MaxDelay: timeToPtr(10 * time.Second),
+ Attempts: pointer.Of(1),
+ MaxDelay: pointer.Of(10 * time.Second),
},
taskReschedulePolicy: &api.ReschedulePolicy{
- Attempts: intToPtr(5),
- Delay: timeToPtr(20 * time.Second),
- MaxDelay: timeToPtr(20 * time.Minute),
- DelayFunction: stringToPtr("constant"),
- Unlimited: boolToPtr(false),
+ Attempts: pointer.Of(5),
+ Delay: pointer.Of(20 * time.Second),
+ MaxDelay: pointer.Of(20 * time.Minute),
+ DelayFunction: pointer.Of("constant"),
+ Unlimited: pointer.Of(false),
},
expected: &api.ReschedulePolicy{
- Attempts: intToPtr(5),
- Interval: timeToPtr(structs.DefaultBatchJobReschedulePolicy.Interval),
- Delay: timeToPtr(20 * time.Second),
- MaxDelay: timeToPtr(20 * time.Minute),
- DelayFunction: stringToPtr("constant"),
- Unlimited: boolToPtr(false),
+ Attempts: pointer.Of(5),
+ Interval: pointer.Of(structs.DefaultBatchJobReschedulePolicy.Interval),
+ Delay: pointer.Of(20 * time.Second),
+ MaxDelay: pointer.Of(20 * time.Minute),
+ DelayFunction: pointer.Of("constant"),
+ Unlimited: pointer.Of(false),
},
},
{
desc: "Attempts from job, default interval",
jobReschedulePolicy: &api.ReschedulePolicy{
- Attempts: intToPtr(1),
+ Attempts: pointer.Of(1),
},
taskReschedulePolicy: nil,
expected: &api.ReschedulePolicy{
- Attempts: intToPtr(1),
- Interval: timeToPtr(structs.DefaultBatchJobReschedulePolicy.Interval),
- Delay: timeToPtr(structs.DefaultBatchJobReschedulePolicy.Delay),
- DelayFunction: stringToPtr(structs.DefaultBatchJobReschedulePolicy.DelayFunction),
- MaxDelay: timeToPtr(structs.DefaultBatchJobReschedulePolicy.MaxDelay),
- Unlimited: boolToPtr(structs.DefaultBatchJobReschedulePolicy.Unlimited),
+ Attempts: pointer.Of(1),
+ Interval: pointer.Of(structs.DefaultBatchJobReschedulePolicy.Interval),
+ Delay: pointer.Of(structs.DefaultBatchJobReschedulePolicy.Delay),
+ DelayFunction: pointer.Of(structs.DefaultBatchJobReschedulePolicy.DelayFunction),
+ MaxDelay: pointer.Of(structs.DefaultBatchJobReschedulePolicy.MaxDelay),
+ Unlimited: pointer.Of(structs.DefaultBatchJobReschedulePolicy.Unlimited),
},
},
}
@@ -158,13 +159,13 @@ func TestTaskGroup_Canonicalize_ReschedulePolicy(t *testing.T) {
for _, tc := range testCases {
t.Run(tc.desc, func(t *testing.T) {
job := &api.Job{
- ID: stringToPtr("test"),
+ ID: pointer.Of("test"),
Reschedule: tc.jobReschedulePolicy,
- Type: stringToPtr(api.JobTypeBatch),
+ Type: pointer.Of(api.JobTypeBatch),
}
job.Canonicalize()
tg := &api.TaskGroup{
- Name: stringToPtr("foo"),
+ Name: pointer.Of("foo"),
ReschedulePolicy: tc.taskReschedulePolicy,
}
tg.Canonicalize(job)
diff --git a/internal/testing/apitests/util_test.go b/internal/testing/apitests/util_test.go
index d751c04eb2c..d6046a2e6dd 100644
--- a/internal/testing/apitests/util_test.go
+++ b/internal/testing/apitests/util_test.go
@@ -2,31 +2,11 @@ package apitests
import (
"testing"
- "time"
"github.com/hashicorp/nomad/api"
+ "github.com/hashicorp/nomad/helper/pointer"
)
-// boolToPtr returns the pointer to a boolean
-func boolToPtr(b bool) *bool {
- return &b
-}
-
-// intToPtr returns the pointer to an int
-func intToPtr(i int) *int {
- return &i
-}
-
-// timeToPtr returns the pointer to a time stamp
-func timeToPtr(t time.Duration) *time.Duration {
- return &t
-}
-
-// stringToPtr returns the pointer to a string
-func stringToPtr(str string) *string {
- return &str
-}
-
func assertQueryMeta(t *testing.T, qm *api.QueryMeta) {
t.Helper()
if qm.LastIndex == 0 {
@@ -48,18 +28,18 @@ func testJob() *api.Job {
task := api.NewTask("task1", "exec").
SetConfig("command", "/bin/sleep").
Require(&api.Resources{
- CPU: intToPtr(100),
- MemoryMB: intToPtr(256),
+ CPU: pointer.Of(100),
+ MemoryMB: pointer.Of(256),
}).
SetLogConfig(&api.LogConfig{
- MaxFiles: intToPtr(1),
- MaxFileSizeMB: intToPtr(2),
+ MaxFiles: pointer.Of(1),
+ MaxFileSizeMB: pointer.Of(2),
})
group := api.NewTaskGroup("group1", 1).
AddTask(task).
RequireDisk(&api.EphemeralDisk{
- SizeMB: intToPtr(25),
+ SizeMB: pointer.Of(25),
})
job := api.NewBatchJob("job1", "redis", "global", 1).
diff --git a/jobspec/helper_test.go b/jobspec/helper_test.go
index f7854c80195..4f52f4de565 100644
--- a/jobspec/helper_test.go
+++ b/jobspec/helper_test.go
@@ -7,18 +7,3 @@ package jobspec
func intToPtr(i int) *int {
return &i
}
-
-// int8ToPtr returns the pointer to an int8
-func int8ToPtr(i int8) *int8 {
- return &i
-}
-
-// int64ToPtr returns the pointer to an int
-func int64ToPtr(i int64) *int64 {
- return &i
-}
-
-// Uint64ToPtr returns the pointer to an uint64
-func uint64ToPtr(u uint64) *uint64 {
- return &u
-}
diff --git a/jobspec/parse_task.go b/jobspec/parse_task.go
index 4bc77c310f2..a43ffded643 100644
--- a/jobspec/parse_task.go
+++ b/jobspec/parse_task.go
@@ -433,14 +433,25 @@ func parseArtifactOption(result map[string]string, list *ast.ObjectList) error {
func parseTemplates(result *[]*api.Template, list *ast.ObjectList) error {
for _, o := range list.Elem().Items {
+ // we'll need a list of all ast objects for later
+ var listVal *ast.ObjectList
+ if ot, ok := o.Val.(*ast.ObjectType); ok {
+ listVal = ot.List
+ } else {
+ return fmt.Errorf("should be an object")
+ }
+
// Check for invalid keys
valid := []string{
"change_mode",
"change_signal",
+ "change_script",
"data",
"destination",
"left_delimiter",
"perms",
+ "uid",
+ "gid",
"right_delimiter",
"source",
"splay",
@@ -455,6 +466,7 @@ func parseTemplates(result *[]*api.Template, list *ast.ObjectList) error {
if err := hcl.DecodeObject(&m, o.Val); err != nil {
return err
}
+ delete(m, "change_script") // change_script is its own object
templ := &api.Template{
ChangeMode: stringToPtr("restart"),
@@ -474,6 +486,40 @@ func parseTemplates(result *[]*api.Template, list *ast.ObjectList) error {
return err
}
+ // If we have change_script, parse it
+ if o := listVal.Filter("change_script"); len(o.Items) > 0 {
+ if len(o.Items) != 1 {
+ return fmt.Errorf(
+ "change_script -> expected single stanza, got %d", len(o.Items),
+ )
+ }
+ var m map[string]interface{}
+ changeScriptBlock := o.Items[0]
+
+ // check for invalid fields
+ valid := []string{"command", "args", "timeout", "fail_on_error"}
+ if err := checkHCLKeys(changeScriptBlock.Val, valid); err != nil {
+ return multierror.Prefix(err, "change_script ->")
+ }
+
+ if err := hcl.DecodeObject(&m, changeScriptBlock.Val); err != nil {
+ return err
+ }
+
+ templ.ChangeScript = &api.ChangeScript{}
+ dec, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{
+ DecodeHook: mapstructure.StringToTimeDurationHookFunc(),
+ WeaklyTypedInput: true,
+ Result: templ.ChangeScript,
+ })
+ if err != nil {
+ return err
+ }
+ if err := dec.Decode(m); err != nil {
+ return err
+ }
+ }
+
*result = append(*result, templ)
}
diff --git a/jobspec/parse_test.go b/jobspec/parse_test.go
index 45d624aa22f..82819e9a080 100644
--- a/jobspec/parse_test.go
+++ b/jobspec/parse_test.go
@@ -22,8 +22,23 @@ const (
// templateChangeModeRestart marks that the task should be restarted if the
templateChangeModeRestart = "restart"
+
+ // templateChangeModeScript marks that ac script should be executed on
+ // template re-render
+ templateChangeModeScript = "script"
)
+// Helper functions below are only used by this test suite
+func int8ToPtr(i int8) *int8 {
+ return &i
+}
+func uint64ToPtr(u uint64) *uint64 {
+ return &u
+}
+func int64ToPtr(i int64) *int64 {
+ return &i
+}
+
func TestParse(t *testing.T) {
ci.Parallel(t)
@@ -369,9 +384,17 @@ func TestParse(t *testing.T) {
{
SourcePath: stringToPtr("bar"),
DestPath: stringToPtr("bar"),
- ChangeMode: stringToPtr(templateChangeModeRestart),
+ ChangeMode: stringToPtr(templateChangeModeScript),
+ ChangeScript: &api.ChangeScript{
+ Args: []string{"-debug", "-verbose"},
+ Command: stringToPtr("/bin/foo"),
+ Timeout: timeToPtr(5 * time.Second),
+ FailOnError: boolToPtr(false),
+ },
Splay: timeToPtr(5 * time.Second),
Perms: stringToPtr("777"),
+ Uid: intToPtr(1001),
+ Gid: intToPtr(20),
LeftDelim: stringToPtr("--"),
RightDelim: stringToPtr("__"),
},
diff --git a/jobspec/test-fixtures/basic.hcl b/jobspec/test-fixtures/basic.hcl
index 20a8171e4d0..a749bf91dda 100644
--- a/jobspec/test-fixtures/basic.hcl
+++ b/jobspec/test-fixtures/basic.hcl
@@ -315,9 +315,18 @@ job "binstore-storagelocker" {
}
template {
- source = "bar"
- destination = "bar"
+ source = "bar"
+ destination = "bar"
+ change_mode = "script"
+ change_script {
+ command = "/bin/foo"
+ args = ["-debug", "-verbose"]
+ timeout = "5s"
+ fail_on_error = false
+ }
perms = "777"
+ uid = 1001
+ gid = 20
left_delimiter = "--"
right_delimiter = "__"
}
diff --git a/jobspec2/functions.go b/jobspec2/functions.go
index 6cb0949a39a..9e489902d22 100644
--- a/jobspec2/functions.go
+++ b/jobspec2/functions.go
@@ -22,7 +22,6 @@ import (
// basedir is used with file functions and allows a user to reference a file
// using local path. Usually basedir is the directory in which the config file
// is located
-//
func Functions(basedir string, allowFS bool) map[string]function.Function {
funcs := map[string]function.Function{
"abs": stdlib.AbsoluteFunc,
diff --git a/jobspec2/hcl_conversions.go b/jobspec2/hcl_conversions.go
index bb96e354747..2afd71ed2b7 100644
--- a/jobspec2/hcl_conversions.go
+++ b/jobspec2/hcl_conversions.go
@@ -10,6 +10,7 @@ import (
"github.com/hashicorp/hcl/v2/gohcl"
"github.com/hashicorp/hcl/v2/hcldec"
"github.com/hashicorp/nomad/api"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/zclconf/go-cty/cty"
"github.com/zclconf/go-cty/cty/gocty"
)
@@ -116,7 +117,7 @@ func decodeAffinity(body hcl.Body, ctx *hcl.EvalContext, val interface{}) hcl.Di
weight := v.GetAttr("weight")
if !weight.IsNull() {
w, _ := weight.AsBigFloat().Int64()
- a.Weight = int8ToPtr(int8(w))
+ a.Weight = pointer.Of(int8(w))
}
// If "version" is provided, set the operand
@@ -341,9 +342,10 @@ func decodeTask(body hcl.Body, ctx *hcl.EvalContext, val interface{}) hcl.Diagno
//
// ```hcl
// # block assignment
-// env {
-// ENV = "production"
-// }
+//
+// env {
+// ENV = "production"
+// }
//
// # as attribute
// env = { ENV: "production" }
@@ -357,7 +359,6 @@ func decodeTask(body hcl.Body, ctx *hcl.EvalContext, val interface{}) hcl.Diagno
// found map, the remaining body and diagnostics. If the named field is found
// with block syntax, it returns a nil map, and caller falls back to reading
// with block syntax.
-//
func decodeAsAttribute(body hcl.Body, ctx *hcl.EvalContext, name string) (map[string]string, hcl.Body, hcl.Diagnostics) {
b, remain, diags := body.PartialContent(&hcl.BodySchema{
Attributes: []hcl.AttributeSchema{
diff --git a/jobspec2/hclutil/blockattrs.go b/jobspec2/hclutil/blockattrs.go
index dee3bb0c77e..6a70ae1958a 100644
--- a/jobspec2/hclutil/blockattrs.go
+++ b/jobspec2/hclutil/blockattrs.go
@@ -14,17 +14,21 @@ import (
// More concretely, it changes the following:
//
// ```
-// config {
-// meta { ... }
-// }
+//
+// config {
+// meta { ... }
+// }
+//
// ```
//
// to
//
// ```
-// config {
-// meta = { ... } # <- attribute now
-// }
+//
+// config {
+// meta = { ... } # <- attribute now
+// }
+//
// ```
func BlocksAsAttrs(body hcl.Body) hcl.Body {
if hclb, ok := body.(*hcls.Body); ok {
diff --git a/jobspec2/parse_job.go b/jobspec2/parse_job.go
index 9b533874f50..a4ee5034366 100644
--- a/jobspec2/parse_job.go
+++ b/jobspec2/parse_job.go
@@ -4,6 +4,7 @@ import (
"time"
"github.com/hashicorp/nomad/api"
+ "github.com/hashicorp/nomad/helper/pointer"
)
func normalizeJob(jc *jobConfig) {
@@ -59,10 +60,10 @@ func normalizeVault(v *api.Vault) {
}
if v.Env == nil {
- v.Env = boolToPtr(true)
+ v.Env = pointer.Of(true)
}
if v.ChangeMode == nil {
- v.ChangeMode = stringToPtr("restart")
+ v.ChangeMode = pointer.Of("restart")
}
}
@@ -102,29 +103,32 @@ func normalizeTemplates(templates []*api.Template) {
for _, t := range templates {
if t.ChangeMode == nil {
- t.ChangeMode = stringToPtr("restart")
+ t.ChangeMode = pointer.Of("restart")
}
if t.Perms == nil {
- t.Perms = stringToPtr("0644")
+ t.Perms = pointer.Of("0644")
}
if t.Splay == nil {
- t.Splay = durationToPtr(5 * time.Second)
+ t.Splay = pointer.Of(5 * time.Second)
}
+ normalizeChangeScript(t.ChangeScript)
}
}
-func int8ToPtr(v int8) *int8 {
- return &v
-}
+func normalizeChangeScript(ch *api.ChangeScript) {
+ if ch == nil {
+ return
+ }
-func boolToPtr(v bool) *bool {
- return &v
-}
+ if ch.Args == nil {
+ ch.Args = []string{}
+ }
-func stringToPtr(v string) *string {
- return &v
-}
+ if ch.Timeout == nil {
+ ch.Timeout = pointer.Of(5 * time.Second)
+ }
-func durationToPtr(v time.Duration) *time.Duration {
- return &v
+ if ch.FailOnError == nil {
+ ch.FailOnError = pointer.Of(false)
+ }
}
diff --git a/jobspec2/parse_test.go b/jobspec2/parse_test.go
index b3e7e9963ab..806412cad48 100644
--- a/jobspec2/parse_test.go
+++ b/jobspec2/parse_test.go
@@ -9,6 +9,7 @@ import (
"github.com/hashicorp/nomad/api"
"github.com/hashicorp/nomad/ci"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/jobspec"
"github.com/stretchr/testify/require"
)
@@ -644,13 +645,13 @@ job "job-webserver" {
{
"prod",
&api.Job{
- ID: stringToPtr("job-webserver"),
- Name: stringToPtr("job-webserver"),
+ ID: pointer.Of("job-webserver"),
+ Name: pointer.Of("job-webserver"),
Datacenters: []string{"prod-dc1", "prod-dc2"},
TaskGroups: []*api.TaskGroup{
{
- Name: stringToPtr("group-webserver"),
- Count: intToPtr(20),
+ Name: pointer.Of("group-webserver"),
+ Count: pointer.Of(20),
Tasks: []*api.Task{
{
@@ -670,13 +671,13 @@ job "job-webserver" {
{
"staging",
&api.Job{
- ID: stringToPtr("job-webserver"),
- Name: stringToPtr("job-webserver"),
+ ID: pointer.Of("job-webserver"),
+ Name: pointer.Of("job-webserver"),
Datacenters: []string{"dc1"},
TaskGroups: []*api.TaskGroup{
{
- Name: stringToPtr("group-webserver"),
- Count: intToPtr(3),
+ Name: pointer.Of("group-webserver"),
+ Count: pointer.Of(3),
Tasks: []*api.Task{
{
@@ -696,13 +697,13 @@ job "job-webserver" {
{
"unknown",
&api.Job{
- ID: stringToPtr("job-webserver"),
- Name: stringToPtr("job-webserver"),
+ ID: pointer.Of("job-webserver"),
+ Name: pointer.Of("job-webserver"),
Datacenters: []string{},
TaskGroups: []*api.TaskGroup{
{
- Name: stringToPtr("group-webserver"),
- Count: intToPtr(0),
+ Name: pointer.Of("group-webserver"),
+ Count: pointer.Of(0),
Tasks: []*api.Task{
{
@@ -1005,11 +1006,11 @@ func TestParseServiceCheck(t *testing.T) {
require.NoError(t, err)
expectedJob := &api.Job{
- ID: stringToPtr("group_service_check_script"),
- Name: stringToPtr("group_service_check_script"),
+ ID: pointer.Of("group_service_check_script"),
+ Name: pointer.Of("group_service_check_script"),
TaskGroups: []*api.TaskGroup{
{
- Name: stringToPtr("group"),
+ Name: pointer.Of("group"),
Services: []*api.Service{
{
Name: "foo-service",
@@ -1033,7 +1034,7 @@ func TestParseServiceCheck(t *testing.T) {
func TestWaitConfig(t *testing.T) {
ci.Parallel(t)
-
+
hclBytes, err := os.ReadFile("test-fixtures/template-wait-config.hcl")
require.NoError(t, err)
diff --git a/jobspec2/types.variables.go b/jobspec2/types.variables.go
index 688018a19da..8e32ded2083 100644
--- a/jobspec2/types.variables.go
+++ b/jobspec2/types.variables.go
@@ -78,7 +78,6 @@ func (v *Variable) GoString() string {
// validateValue ensures that all of the configured custom validations for a
// variable value are passing.
-//
func (v *Variable) validateValue(val VariableAssignment) (diags hcl.Diagnostics) {
if len(v.Validations) == 0 {
return nil
diff --git a/lib/circbufwriter/writer_test.go b/lib/circbufwriter/writer_test.go
index d48a03ddf15..cad88c7cece 100644
--- a/lib/circbufwriter/writer_test.go
+++ b/lib/circbufwriter/writer_test.go
@@ -70,7 +70,7 @@ func TestWriter_BlockingWrite(t *testing.T) {
func TestWriter_CloseClose(t *testing.T) {
ci.Parallel(t)
-
+
require := require.New(t)
w := New(ioutil.Discard, 64)
require.NoError(w.Close())
diff --git a/lib/delayheap/delay_heap_test.go b/lib/delayheap/delay_heap_test.go
index 28d524591e8..08ce83350fb 100644
--- a/lib/delayheap/delay_heap_test.go
+++ b/lib/delayheap/delay_heap_test.go
@@ -76,7 +76,7 @@ func TestDelayHeap_PushPop(t *testing.T) {
func TestDelayHeap_Update(t *testing.T) {
ci.Parallel(t)
-
+
delayHeap := NewDelayHeap()
now := time.Now()
require := require.New(t)
diff --git a/nomad/acl.go b/nomad/acl.go
index dcdc0799164..7c14bfa1cfb 100644
--- a/nomad/acl.go
+++ b/nomad/acl.go
@@ -225,27 +225,33 @@ func (s *Server) resolvePoliciesForClaims(claims *structs.IdentityClaims) ([]*st
return nil, fmt.Errorf("allocation does not exist")
}
- // Find any implicit policies associated with this task
- policies := []*structs.ACLPolicy{}
- implicitPolicyNames := []string{
- fmt.Sprintf("_:%s/%s/%s/%s", alloc.Namespace, alloc.Job.ID, alloc.TaskGroup, claims.TaskName),
- fmt.Sprintf("_:%s/%s/%s", alloc.Namespace, alloc.Job.ID, alloc.TaskGroup),
- fmt.Sprintf("_:%s/%s", alloc.Namespace, alloc.Job.ID),
- fmt.Sprintf("_:%s", alloc.Namespace),
+ // Find any policies attached to the job
+ iter, err := snap.ACLPolicyByJob(nil, alloc.Namespace, alloc.Job.ID)
+ if err != nil {
+ return nil, err
}
-
- for _, policyName := range implicitPolicyNames {
- policy, err := snap.ACLPolicyByName(nil, policyName)
- if err != nil {
- return nil, err
+ policies := []*structs.ACLPolicy{}
+ for {
+ raw := iter.Next()
+ if raw == nil {
+ break
}
- if policy == nil {
- // Ignore policies that don't exist, since they don't
- // grant any more privilege
+ policy := raw.(*structs.ACLPolicy)
+ if policy.JobACL == nil {
continue
}
- policies = append(policies, policy)
+ switch {
+ case policy.JobACL.Group == "":
+ policies = append(policies, policy)
+ case policy.JobACL.Group != alloc.TaskGroup:
+ continue // don't bother checking task
+ case policy.JobACL.Task == "":
+ policies = append(policies, policy)
+ case policy.JobACL.Task == claims.TaskName:
+ policies = append(policies, policy)
+ }
}
+
return policies, nil
}
diff --git a/nomad/acl_test.go b/nomad/acl_test.go
index 4be4e1f4b7d..3286ed2653a 100644
--- a/nomad/acl_test.go
+++ b/nomad/acl_test.go
@@ -11,6 +11,7 @@ import (
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
"github.com/hashicorp/nomad/testutil"
+ "github.com/shoenig/test/must"
"github.com/stretchr/testify/require"
)
@@ -379,3 +380,116 @@ func TestResolveSecretToken(t *testing.T) {
})
}
}
+
+func TestResolveClaims(t *testing.T) {
+ ci.Parallel(t)
+
+ srv, _, cleanup := TestACLServer(t, nil)
+ defer cleanup()
+
+ store := srv.fsm.State()
+ index := uint64(100)
+
+ alloc := mock.Alloc()
+
+ claims := &structs.IdentityClaims{
+ Namespace: alloc.Namespace,
+ JobID: alloc.Job.ID,
+ AllocationID: alloc.ID,
+ TaskName: alloc.Job.TaskGroups[0].Tasks[0].Name,
+ }
+
+ // unrelated policy
+ policy0 := mock.ACLPolicy()
+
+ // policy for job
+ policy1 := mock.ACLPolicy()
+ policy1.JobACL = &structs.JobACL{
+ Namespace: claims.Namespace,
+ JobID: claims.JobID,
+ }
+
+ // policy for job and group
+ policy2 := mock.ACLPolicy()
+ policy2.JobACL = &structs.JobACL{
+ Namespace: claims.Namespace,
+ JobID: claims.JobID,
+ Group: alloc.Job.TaskGroups[0].Name,
+ }
+
+ // policy for job and group and task
+ policy3 := mock.ACLPolicy()
+ policy3.JobACL = &structs.JobACL{
+ Namespace: claims.Namespace,
+ JobID: claims.JobID,
+ Group: alloc.Job.TaskGroups[0].Name,
+ Task: claims.TaskName,
+ }
+
+ // policy for job and group but different task
+ policy4 := mock.ACLPolicy()
+ policy4.JobACL = &structs.JobACL{
+ Namespace: claims.Namespace,
+ JobID: claims.JobID,
+ Group: alloc.Job.TaskGroups[0].Name,
+ Task: "another",
+ }
+
+ // policy for job but different group
+ policy5 := mock.ACLPolicy()
+ policy5.JobACL = &structs.JobACL{
+ Namespace: claims.Namespace,
+ JobID: claims.JobID,
+ Group: "another",
+ }
+
+ // policy for same namespace but different job
+ policy6 := mock.ACLPolicy()
+ policy6.JobACL = &structs.JobACL{
+ Namespace: claims.Namespace,
+ JobID: "another",
+ }
+
+ // policy for same job in different namespace
+ policy7 := mock.ACLPolicy()
+ policy7.JobACL = &structs.JobACL{
+ Namespace: "another",
+ JobID: claims.JobID,
+ }
+
+ index++
+ err := store.UpsertACLPolicies(structs.MsgTypeTestSetup, index, []*structs.ACLPolicy{
+ policy0, policy1, policy2, policy3, policy4, policy5, policy6, policy7})
+ must.NoError(t, err)
+
+ aclObj, err := srv.ResolveClaims(claims)
+ must.Nil(t, aclObj)
+ must.EqError(t, err, "allocation does not exist")
+
+ // upsert the allocation
+ index++
+ err = store.UpsertAllocs(structs.MsgTypeTestSetup, index, []*structs.Allocation{alloc})
+ must.NoError(t, err)
+
+ aclObj, err = srv.ResolveClaims(claims)
+ must.NoError(t, err)
+ must.NotNil(t, aclObj)
+
+ // Check that the ACL object looks reasonable
+ must.False(t, aclObj.IsManagement())
+ must.True(t, aclObj.AllowNamespaceOperation("default", acl.NamespaceCapabilityListJobs))
+ must.False(t, aclObj.AllowNamespaceOperation("other", acl.NamespaceCapabilityListJobs))
+
+ // Resolve the same claim again, should get cache value
+ aclObj2, err := srv.ResolveClaims(claims)
+ must.NoError(t, err)
+ must.NotNil(t, aclObj)
+ must.Eq(t, aclObj, aclObj2, must.Sprintf("expected cached value"))
+
+ policies, err := srv.resolvePoliciesForClaims(claims)
+ must.NoError(t, err)
+ must.Len(t, 3, policies)
+ must.Contains(t, policies, policy1)
+ must.Contains(t, policies, policy2)
+ must.Contains(t, policies, policy3)
+}
diff --git a/nomad/alloc_endpoint.go b/nomad/alloc_endpoint.go
index 30957db0946..79745bb29b1 100644
--- a/nomad/alloc_endpoint.go
+++ b/nomad/alloc_endpoint.go
@@ -11,7 +11,7 @@ import (
multierror "github.com/hashicorp/go-multierror"
"github.com/hashicorp/nomad/acl"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/state"
"github.com/hashicorp/nomad/nomad/state/paginator"
@@ -311,8 +311,8 @@ func (a *Alloc) Stop(args *structs.AllocStopRequest, reply *structs.AllocStopRes
Evals: []*structs.Evaluation{eval},
Allocs: map[string]*structs.DesiredTransition{
args.AllocID: {
- Migrate: helper.BoolToPtr(true),
- NoShutdownDelay: helper.BoolToPtr(args.NoShutdownDelay),
+ Migrate: pointer.Of(true),
+ NoShutdownDelay: pointer.Of(args.NoShutdownDelay),
},
},
}
diff --git a/nomad/alloc_endpoint_test.go b/nomad/alloc_endpoint_test.go
index 63a43774d12..3ed12965b36 100644
--- a/nomad/alloc_endpoint_test.go
+++ b/nomad/alloc_endpoint_test.go
@@ -8,7 +8,7 @@ import (
msgpackrpc "github.com/hashicorp/net-rpc-msgpackrpc"
"github.com/hashicorp/nomad/acl"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
@@ -1047,7 +1047,7 @@ func TestAllocEndpoint_UpdateDesiredTransition(t *testing.T) {
require.Nil(state.UpsertAllocs(structs.MsgTypeTestSetup, 1000, []*structs.Allocation{alloc, alloc2}))
t1 := &structs.DesiredTransition{
- Migrate: helper.BoolToPtr(true),
+ Migrate: pointer.Of(true),
}
// Update the allocs desired status
diff --git a/nomad/blocked_evals.go b/nomad/blocked_evals.go
index 2026e6826e3..0943ac0b910 100644
--- a/nomad/blocked_evals.go
+++ b/nomad/blocked_evals.go
@@ -290,7 +290,7 @@ func latestEvalIndex(eval *structs.Evaluation) uint64 {
return 0
}
- return helper.Uint64Max(eval.CreateIndex, eval.SnapshotIndex)
+ return helper.Max(eval.CreateIndex, eval.SnapshotIndex)
}
// missedUnblock returns whether an evaluation missed an unblock while it was in
@@ -413,11 +413,18 @@ func (b *BlockedEvals) Unblock(computedClass string, index uint64) {
// block calls in case the evaluation was in the scheduler when a trigger
// occurred.
b.unblockIndexes[computedClass] = index
+
+ // Capture chan in lock as Flush overwrites it
+ ch := b.capacityChangeCh
+ done := b.stopCh
b.l.Unlock()
- b.capacityChangeCh <- &capacityUpdate{
+ select {
+ case <-done:
+ case ch <- &capacityUpdate{
computedClass: computedClass,
index: index,
+ }:
}
}
@@ -441,11 +448,16 @@ func (b *BlockedEvals) UnblockQuota(quota string, index uint64) {
// block calls in case the evaluation was in the scheduler when a trigger
// occurred.
b.unblockIndexes[quota] = index
+ ch := b.capacityChangeCh
+ done := b.stopCh
b.l.Unlock()
- b.capacityChangeCh <- &capacityUpdate{
+ select {
+ case <-done:
+ case ch <- &capacityUpdate{
quotaChange: quota,
index: index,
+ }:
}
}
@@ -472,12 +484,16 @@ func (b *BlockedEvals) UnblockClassAndQuota(class, quota string, index uint64) {
// Capture chan inside the lock to prevent a race with it getting reset
// in Flush.
ch := b.capacityChangeCh
+ done := b.stopCh
b.l.Unlock()
- ch <- &capacityUpdate{
+ select {
+ case <-done:
+ case ch <- &capacityUpdate{
computedClass: class,
quotaChange: quota,
index: index,
+ }:
}
}
diff --git a/nomad/client_agent_endpoint.go b/nomad/client_agent_endpoint.go
index 4d61b625b54..8a2f29e013c 100644
--- a/nomad/client_agent_endpoint.go
+++ b/nomad/client_agent_endpoint.go
@@ -16,7 +16,7 @@ import (
"github.com/hashicorp/nomad/command/agent/host"
"github.com/hashicorp/nomad/command/agent/monitor"
"github.com/hashicorp/nomad/command/agent/pprof"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/nomad/structs"
"github.com/hashicorp/go-msgpack/codec"
@@ -121,7 +121,7 @@ func (a *Agent) monitor(conn io.ReadWriteCloser) {
encoder := codec.NewEncoder(conn, structs.MsgpackHandle)
if err := decoder.Decode(&args); err != nil {
- handleStreamResultError(err, helper.Int64ToPtr(500), encoder)
+ handleStreamResultError(err, pointer.Of(int64(500)), encoder)
return
}
@@ -130,7 +130,7 @@ func (a *Agent) monitor(conn io.ReadWriteCloser) {
handleStreamResultError(err, nil, encoder)
return
} else if aclObj != nil && !aclObj.AllowAgentRead() {
- handleStreamResultError(structs.ErrPermissionDenied, helper.Int64ToPtr(403), encoder)
+ handleStreamResultError(structs.ErrPermissionDenied, pointer.Of(int64(403)), encoder)
return
}
@@ -140,7 +140,7 @@ func (a *Agent) monitor(conn io.ReadWriteCloser) {
}
if logLevel == log.NoLevel {
- handleStreamResultError(errors.New("Unknown log level"), helper.Int64ToPtr(400), encoder)
+ handleStreamResultError(errors.New("Unknown log level"), pointer.Of(int64(400)), encoder)
return
}
@@ -153,7 +153,7 @@ func (a *Agent) monitor(conn io.ReadWriteCloser) {
region := args.RequestRegion()
if region == "" {
- handleStreamResultError(fmt.Errorf("missing target RPC"), helper.Int64ToPtr(400), encoder)
+ handleStreamResultError(fmt.Errorf("missing target RPC"), pointer.Of(int64(400)), encoder)
return
}
if region != a.srv.config.Region {
@@ -165,7 +165,7 @@ func (a *Agent) monitor(conn io.ReadWriteCloser) {
if args.ServerID != "" {
serverToFwd, err := a.forwardFor(args.ServerID, region)
if err != nil {
- handleStreamResultError(err, helper.Int64ToPtr(400), encoder)
+ handleStreamResultError(err, pointer.Of(int64(400)), encoder)
return
}
if serverToFwd != nil {
@@ -268,7 +268,7 @@ OUTER:
}
if streamErr != nil {
- handleStreamResultError(streamErr, helper.Int64ToPtr(500), encoder)
+ handleStreamResultError(streamErr, pointer.Of(int64(500)), encoder)
return
}
}
@@ -317,7 +317,7 @@ func (a *Agent) forwardMonitorClient(conn io.ReadWriteCloser, args cstructs.Moni
state, srv, err := a.findClientConn(args.NodeID)
if err != nil {
- handleStreamResultError(err, helper.Int64ToPtr(500), encoder)
+ handleStreamResultError(err, pointer.Of(int64(500)), encoder)
return
}
@@ -357,7 +357,7 @@ func (a *Agent) forwardMonitorServer(conn io.ReadWriteCloser, server *serverPart
serverConn, err := a.srv.streamingRpc(server, "Agent.Monitor")
if err != nil {
- handleStreamResultError(err, helper.Int64ToPtr(500), encoder)
+ handleStreamResultError(err, pointer.Of(int64(500)), encoder)
return
}
defer serverConn.Close()
@@ -365,7 +365,7 @@ func (a *Agent) forwardMonitorServer(conn io.ReadWriteCloser, server *serverPart
// Send the Request
outEncoder := codec.NewEncoder(serverConn, structs.MsgpackHandle)
if err := outEncoder.Encode(args); err != nil {
- handleStreamResultError(err, helper.Int64ToPtr(500), encoder)
+ handleStreamResultError(err, pointer.Of(int64(500)), encoder)
return
}
diff --git a/nomad/client_alloc_endpoint.go b/nomad/client_alloc_endpoint.go
index ee57e137342..6443049097f 100644
--- a/nomad/client_alloc_endpoint.go
+++ b/nomad/client_alloc_endpoint.go
@@ -12,7 +12,7 @@ import (
"github.com/hashicorp/go-msgpack/codec"
"github.com/hashicorp/nomad/acl"
cstructs "github.com/hashicorp/nomad/client/structs"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/nomad/structs"
)
@@ -282,7 +282,7 @@ func (a *ClientAllocations) exec(conn io.ReadWriteCloser) {
encoder := codec.NewEncoder(conn, structs.MsgpackHandle)
if err := decoder.Decode(&args); err != nil {
- handleStreamResultError(err, helper.Int64ToPtr(500), encoder)
+ handleStreamResultError(err, pointer.Of(int64(500)), encoder)
return
}
@@ -295,7 +295,7 @@ func (a *ClientAllocations) exec(conn io.ReadWriteCloser) {
// Verify the arguments.
if args.AllocID == "" {
- handleStreamResultError(errors.New("missing AllocID"), helper.Int64ToPtr(400), encoder)
+ handleStreamResultError(errors.New("missing AllocID"), pointer.Of(int64(400)), encoder)
return
}
@@ -308,7 +308,7 @@ func (a *ClientAllocations) exec(conn io.ReadWriteCloser) {
alloc, err := getAlloc(snap, args.AllocID)
if structs.IsErrUnknownAllocation(err) {
- handleStreamResultError(err, helper.Int64ToPtr(404), encoder)
+ handleStreamResultError(err, pointer.Of(int64(404)), encoder)
return
}
if err != nil {
@@ -331,18 +331,18 @@ func (a *ClientAllocations) exec(conn io.ReadWriteCloser) {
// Make sure Node is valid and new enough to support RPC
node, err := snap.NodeByID(nil, nodeID)
if err != nil {
- handleStreamResultError(err, helper.Int64ToPtr(500), encoder)
+ handleStreamResultError(err, pointer.Of(int64(500)), encoder)
return
}
if node == nil {
err := fmt.Errorf("Unknown node %q", nodeID)
- handleStreamResultError(err, helper.Int64ToPtr(400), encoder)
+ handleStreamResultError(err, pointer.Of(int64(400)), encoder)
return
}
if err := nodeSupportsRpc(node); err != nil {
- handleStreamResultError(err, helper.Int64ToPtr(400), encoder)
+ handleStreamResultError(err, pointer.Of(int64(400)), encoder)
return
}
@@ -356,7 +356,7 @@ func (a *ClientAllocations) exec(conn io.ReadWriteCloser) {
if err != nil {
var code *int64
if structs.IsErrNoNodeConn(err) {
- code = helper.Int64ToPtr(404)
+ code = pointer.Of(int64(404))
}
handleStreamResultError(err, code, encoder)
return
diff --git a/nomad/client_csi_endpoint_test.go b/nomad/client_csi_endpoint_test.go
index 9291b2fcfc9..34dc7d6a535 100644
--- a/nomad/client_csi_endpoint_test.go
+++ b/nomad/client_csi_endpoint_test.go
@@ -541,8 +541,9 @@ func setupLocal(t *testing.T) (rpc.ClientCodec, func()) {
require.NoError(t, err, "could not setup test client")
}
- node1 := c1.Node()
- node1.Attributes["nomad.version"] = "0.11.0" // client RPCs not supported on early versions
+ node1 := c1.UpdateConfig(func(c *config.Config) {
+ c.Node.Attributes["nomad.version"] = "0.11.0" // client RPCs not supported on early versions
+ }).Node
req := &structs.NodeRegisterRequest{
Node: node1,
@@ -568,7 +569,9 @@ func setupLocal(t *testing.T) (rpc.ClientCodec, func()) {
}
// update w/ plugin
- node1.CSIControllerPlugins = plugins
+ node1 = c1.UpdateConfig(func(c *config.Config) {
+ c.Node.CSIControllerPlugins = plugins
+ }).Node
s1.fsm.state.UpsertNode(structs.MsgTypeTestSetup, 1000, node1)
cleanup := func() {
diff --git a/nomad/client_fs_endpoint.go b/nomad/client_fs_endpoint.go
index 6612bfdcedd..9e73fd60e9a 100644
--- a/nomad/client_fs_endpoint.go
+++ b/nomad/client_fs_endpoint.go
@@ -11,10 +11,10 @@ import (
metrics "github.com/armon/go-metrics"
log "github.com/hashicorp/go-hclog"
cstructs "github.com/hashicorp/nomad/client/structs"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/go-msgpack/codec"
"github.com/hashicorp/nomad/acl"
- "github.com/hashicorp/nomad/helper"
"github.com/hashicorp/nomad/nomad/structs"
)
@@ -62,7 +62,7 @@ func forwardRegionStreamingRpc(fsrv *Server, conn io.ReadWriteCloser,
}
if allocResp.Alloc == nil {
- handleStreamResultError(structs.NewErrUnknownAllocation(allocID), helper.Int64ToPtr(404), encoder)
+ handleStreamResultError(structs.NewErrUnknownAllocation(allocID), pointer.Of(int64(404)), encoder)
return
}
@@ -71,7 +71,7 @@ func forwardRegionStreamingRpc(fsrv *Server, conn io.ReadWriteCloser,
if err != nil {
var code *int64
if structs.IsErrNoNodeConn(err) {
- code = helper.Int64ToPtr(404)
+ code = pointer.Of(int64(404))
}
handleStreamResultError(err, code, encoder)
return
@@ -213,7 +213,7 @@ func (f *FileSystem) stream(conn io.ReadWriteCloser) {
encoder := codec.NewEncoder(conn, structs.MsgpackHandle)
if err := decoder.Decode(&args); err != nil {
- handleStreamResultError(err, helper.Int64ToPtr(500), encoder)
+ handleStreamResultError(err, pointer.Of(int64(500)), encoder)
return
}
@@ -226,7 +226,7 @@ func (f *FileSystem) stream(conn io.ReadWriteCloser) {
// Verify the arguments.
if args.AllocID == "" {
- handleStreamResultError(errors.New("missing AllocID"), helper.Int64ToPtr(400), encoder)
+ handleStreamResultError(errors.New("missing AllocID"), pointer.Of(int64(400)), encoder)
return
}
@@ -239,7 +239,7 @@ func (f *FileSystem) stream(conn io.ReadWriteCloser) {
alloc, err := getAlloc(snap, args.AllocID)
if structs.IsErrUnknownAllocation(err) {
- handleStreamResultError(structs.NewErrUnknownAllocation(args.AllocID), helper.Int64ToPtr(404), encoder)
+ handleStreamResultError(structs.NewErrUnknownAllocation(args.AllocID), pointer.Of(int64(404)), encoder)
return
}
if err != nil {
@@ -261,18 +261,18 @@ func (f *FileSystem) stream(conn io.ReadWriteCloser) {
// Make sure Node is valid and new enough to support RPC
node, err := snap.NodeByID(nil, nodeID)
if err != nil {
- handleStreamResultError(err, helper.Int64ToPtr(500), encoder)
+ handleStreamResultError(err, pointer.Of(int64(500)), encoder)
return
}
if node == nil {
err := fmt.Errorf("Unknown node %q", nodeID)
- handleStreamResultError(err, helper.Int64ToPtr(400), encoder)
+ handleStreamResultError(err, pointer.Of(int64(400)), encoder)
return
}
if err := nodeSupportsRpc(node); err != nil {
- handleStreamResultError(err, helper.Int64ToPtr(400), encoder)
+ handleStreamResultError(err, pointer.Of(int64(400)), encoder)
return
}
@@ -286,7 +286,7 @@ func (f *FileSystem) stream(conn io.ReadWriteCloser) {
if err != nil {
var code *int64
if structs.IsErrNoNodeConn(err) {
- code = helper.Int64ToPtr(404)
+ code = pointer.Of(int64(404))
}
handleStreamResultError(err, code, encoder)
return
@@ -331,7 +331,7 @@ func (f *FileSystem) logs(conn io.ReadWriteCloser) {
encoder := codec.NewEncoder(conn, structs.MsgpackHandle)
if err := decoder.Decode(&args); err != nil {
- handleStreamResultError(err, helper.Int64ToPtr(500), encoder)
+ handleStreamResultError(err, pointer.Of(int64(500)), encoder)
return
}
@@ -344,7 +344,7 @@ func (f *FileSystem) logs(conn io.ReadWriteCloser) {
// Verify the arguments.
if args.AllocID == "" {
- handleStreamResultError(structs.ErrMissingAllocID, helper.Int64ToPtr(400), encoder)
+ handleStreamResultError(structs.ErrMissingAllocID, pointer.Of(int64(400)), encoder)
return
}
@@ -357,7 +357,7 @@ func (f *FileSystem) logs(conn io.ReadWriteCloser) {
alloc, err := getAlloc(snap, args.AllocID)
if structs.IsErrUnknownAllocation(err) {
- handleStreamResultError(structs.NewErrUnknownAllocation(args.AllocID), helper.Int64ToPtr(404), encoder)
+ handleStreamResultError(structs.NewErrUnknownAllocation(args.AllocID), pointer.Of(int64(404)), encoder)
return
}
if err != nil {
@@ -382,18 +382,18 @@ func (f *FileSystem) logs(conn io.ReadWriteCloser) {
// Make sure Node is valid and new enough to support RPC
node, err := snap.NodeByID(nil, nodeID)
if err != nil {
- handleStreamResultError(err, helper.Int64ToPtr(500), encoder)
+ handleStreamResultError(err, pointer.Of(int64(500)), encoder)
return
}
if node == nil {
err := fmt.Errorf("Unknown node %q", nodeID)
- handleStreamResultError(err, helper.Int64ToPtr(400), encoder)
+ handleStreamResultError(err, pointer.Of(int64(400)), encoder)
return
}
if err := nodeSupportsRpc(node); err != nil {
- handleStreamResultError(err, helper.Int64ToPtr(400), encoder)
+ handleStreamResultError(err, pointer.Of(int64(400)), encoder)
return
}
@@ -407,7 +407,7 @@ func (f *FileSystem) logs(conn io.ReadWriteCloser) {
if err != nil {
var code *int64
if structs.IsErrNoNodeConn(err) {
- code = helper.Int64ToPtr(404)
+ code = pointer.Of(int64(404))
}
handleStreamResultError(err, code, encoder)
return
diff --git a/nomad/config.go b/nomad/config.go
index 9e5872b31e0..8533b2ddc10 100644
--- a/nomad/config.go
+++ b/nomad/config.go
@@ -8,9 +8,11 @@ import (
"time"
log "github.com/hashicorp/go-hclog"
+ "golang.org/x/exp/slices"
"github.com/hashicorp/memberlist"
"github.com/hashicorp/nomad/helper/pluginutils/loader"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/deploymentwatcher"
"github.com/hashicorp/nomad/nomad/structs"
@@ -32,11 +34,6 @@ func DefaultRPCAddr() *net.TCPAddr {
// Config is used to parameterize the server
type Config struct {
- // Bootstrapped indicates if Server has bootstrapped or not.
- // Its value must be 0 (not bootstrapped) or 1 (bootstrapped).
- // All operations on Bootstrapped must be handled via `atomic.*Int32()` calls
- Bootstrapped int32
-
// BootstrapExpect mode is used to automatically bring up a
// collection of Nomad servers. This can be used to automatically
// bring up a collection of nodes.
@@ -394,6 +391,36 @@ type Config struct {
DeploymentQueryRateLimit float64
}
+func (c *Config) Copy() *Config {
+ if c == nil {
+ return nil
+ }
+
+ nc := *c
+
+ // Can't deep copy interfaces
+ // LogOutput io.Writer
+ // Logger log.InterceptLogger
+ // PluginLoader loader.PluginCatalog
+ // PluginSingletonLoader loader.PluginCatalog
+
+ nc.RPCAddr = pointer.Copy(c.RPCAddr)
+ nc.ClientRPCAdvertise = pointer.Copy(c.ClientRPCAdvertise)
+ nc.ServerRPCAdvertise = pointer.Copy(c.ServerRPCAdvertise)
+ nc.RaftConfig = pointer.Copy(c.RaftConfig)
+ nc.SerfConfig = pointer.Copy(c.SerfConfig)
+ nc.EnabledSchedulers = slices.Clone(c.EnabledSchedulers)
+ nc.ConsulConfig = c.ConsulConfig.Copy()
+ nc.VaultConfig = c.VaultConfig.Copy()
+ nc.TLSConfig = c.TLSConfig.Copy()
+ nc.SentinelConfig = c.SentinelConfig.Copy()
+ nc.AutopilotConfig = c.AutopilotConfig.Copy()
+ nc.LicenseConfig = c.LicenseConfig.Copy()
+ nc.SearchConfig = c.SearchConfig.Copy()
+
+ return &nc
+}
+
// DefaultConfig returns the default configuration. Only used as the basis for
// merging agent or test parameters.
func DefaultConfig() *Config {
diff --git a/nomad/consul_policy_test.go b/nomad/consul_policy_test.go
index c0e6483995d..fd9884ae7c1 100644
--- a/nomad/consul_policy_test.go
+++ b/nomad/consul_policy_test.go
@@ -461,7 +461,7 @@ func TestConsulPolicy_namespaceCheck(t *testing.T) {
func TestConsulPolicy_allowKeystoreRead(t *testing.T) {
ci.Parallel(t)
-
+
t.Run("empty", func(t *testing.T) {
require.False(t, new(ConsulPolicy).allowsKeystoreRead(true, "default"))
})
diff --git a/nomad/core_sched.go b/nomad/core_sched.go
index 84e0f1a2d07..2deb0121863 100644
--- a/nomad/core_sched.go
+++ b/nomad/core_sched.go
@@ -1,6 +1,7 @@
package nomad
import (
+ "context"
"encoding/json"
"fmt"
"math"
@@ -10,9 +11,11 @@ import (
log "github.com/hashicorp/go-hclog"
memdb "github.com/hashicorp/go-memdb"
version "github.com/hashicorp/go-version"
+ "github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/state"
"github.com/hashicorp/nomad/nomad/structs"
"github.com/hashicorp/nomad/scheduler"
+ "golang.org/x/time/rate"
)
// CoreScheduler is a special "scheduler" that is registered
@@ -1018,7 +1021,7 @@ func (c *CoreScheduler) secureVariablesRekey(eval *structs.Evaluation) error {
if err != nil {
return err
}
- err = c.batchRotateVariables(varIter, eval)
+ err = c.rotateVariables(varIter, eval)
if err != nil {
return err
}
@@ -1051,32 +1054,63 @@ func (c *CoreScheduler) secureVariablesRekey(eval *structs.Evaluation) error {
return nil
}
-// rootKeyFullRotatePerKey runs over an iterator of secure variables
-// and decrypts them, and then sends them back as batches to be
-// re-encrypted with the currently active key.
-func (c *CoreScheduler) batchRotateVariables(iter memdb.ResultIterator, eval *structs.Evaluation) error {
+// rotateVariables runs over an iterator of secure variables and decrypts them,
+// and then sends them back to be re-encrypted with the currently active key,
+// checking for conflicts
+func (c *CoreScheduler) rotateVariables(iter memdb.ResultIterator, eval *structs.Evaluation) error {
- upsertFn := func(variables []*structs.SecureVariableDecrypted) error {
- if len(variables) == 0 {
- return nil
- }
- args := &structs.SecureVariablesUpsertRequest{
- Data: variables,
- WriteRequest: structs.WriteRequest{
- Region: c.srv.config.Region,
- AuthToken: eval.LeaderACL,
- },
- }
- reply := &structs.SecureVariablesUpsertResponse{}
- return c.srv.RPC("SecureVariables.Upsert", args, reply)
+ args := &structs.SecureVariablesApplyRequest{
+ Op: structs.SVOpCAS,
+ WriteRequest: structs.WriteRequest{
+ Region: c.srv.config.Region,
+ AuthToken: eval.LeaderACL,
+ },
}
- variables := []*structs.SecureVariableDecrypted{}
+ // We may have to work on a very large number of variables. There's no
+ // BatchApply RPC because it makes for an awkward API around conflict
+ // detection, and even if we did, we'd be blocking this scheduler goroutine
+ // for a very long time using the same snapshot. This would increase the
+ // risk that any given batch hits a conflict because of a concurrent change
+ // and make it more likely that we fail the eval. For large sets, this would
+ // likely mean the eval would run out of retries.
+ //
+ // Instead, we'll rate limit RPC requests and have a timeout. If we still
+ // haven't finished the set by the timeout, emit a new eval.
+ ctx, cancel := context.WithTimeout(context.Background(), 1*time.Minute)
+ defer cancel()
+ limiter := rate.NewLimiter(rate.Limit(100), 100)
+
for {
raw := iter.Next()
if raw == nil {
break
}
+
+ select {
+ case <-ctx.Done():
+ newEval := &structs.Evaluation{
+ ID: uuid.Generate(),
+ Namespace: "-",
+ Priority: structs.CoreJobPriority,
+ Type: structs.JobTypeCore,
+ TriggeredBy: structs.EvalTriggerScheduled,
+ JobID: eval.JobID,
+ Status: structs.EvalStatusPending,
+ LeaderACL: eval.LeaderACL,
+ }
+ return c.srv.RPC("Eval.Create", &structs.EvalUpdateRequest{
+ Evals: []*structs.Evaluation{newEval},
+ EvalToken: uuid.Generate(),
+ WriteRequest: structs.WriteRequest{
+ Region: c.srv.config.Region,
+ AuthToken: eval.LeaderACL,
+ },
+ }, &structs.GenericResponse{})
+
+ default:
+ }
+
ev := raw.(*structs.SecureVariableEncrypted)
cleartext, err := c.srv.encrypter.Decrypt(ev.Data, ev.KeyID)
if err != nil {
@@ -1090,18 +1124,26 @@ func (c *CoreScheduler) batchRotateVariables(iter memdb.ResultIterator, eval *st
if err != nil {
return err
}
- variables = append(variables, dv)
- if len(variables) == 20 {
- err := upsertFn(variables)
- if err != nil {
- return err
- }
- variables = []*structs.SecureVariableDecrypted{}
+ args.Var = dv
+ reply := &structs.SecureVariablesApplyResponse{}
+
+ if err := limiter.Wait(ctx); err != nil {
+ return err
+ }
+
+ err = c.srv.RPC("SecureVariables.Apply", args, reply)
+ if err != nil {
+ return err
+ }
+ if reply.IsConflict() {
+ // we've already rotated the key by the time we took this
+ // evaluation's snapshot, so any conflict is going to be on a write
+ // made with the new key, so there's nothing for us to do here
+ continue
}
}
- // ensure we submit any partial batch
- return upsertFn(variables)
+ return nil
}
// getThreshold returns the index threshold for determining whether an
diff --git a/nomad/core_sched_test.go b/nomad/core_sched_test.go
index ae44240a688..74c9495d211 100644
--- a/nomad/core_sched_test.go
+++ b/nomad/core_sched_test.go
@@ -2483,8 +2483,12 @@ func TestCoreScheduler_RootKeyGC(t *testing.T) {
variable := mock.SecureVariableEncrypted()
variable.KeyID = key2.KeyID
- require.NoError(t, store.UpsertSecureVariables(
- structs.MsgTypeTestSetup, 601, []*structs.SecureVariableEncrypted{variable}))
+
+ setResp := store.SVESet(601, &structs.SVApplyStateRequest{
+ Op: structs.SVOpSet,
+ Var: variable,
+ })
+ require.NoError(t, setResp.Error)
// insert an allocation
alloc := mock.Alloc()
@@ -2549,18 +2553,15 @@ func TestCoreScheduler_SecureVariablesRekey(t *testing.T) {
require.NotNil(t, key0, "expected keyring to be bootstapped")
require.NoError(t, err)
- req := &structs.SecureVariablesUpsertRequest{
- Data: []*structs.SecureVariableDecrypted{
- mock.SecureVariable(),
- mock.SecureVariable(),
- mock.SecureVariable(),
- },
- WriteRequest: structs.WriteRequest{
- Region: srv.config.Region,
- },
+ for i := 0; i < 3; i++ {
+ req := &structs.SecureVariablesApplyRequest{
+ Op: structs.SVOpSet,
+ Var: mock.SecureVariable(),
+ WriteRequest: structs.WriteRequest{Region: srv.config.Region},
+ }
+ resp := &structs.SecureVariablesApplyResponse{}
+ require.NoError(t, srv.RPC("SecureVariables.Apply", req, resp))
}
- resp := &structs.SecureVariablesUpsertResponse{}
- require.NoError(t, srv.RPC("SecureVariables.Upsert", req, resp))
rotateReq := &structs.KeyringRotateRootKeyRequest{
WriteRequest: structs.WriteRequest{
@@ -2570,17 +2571,15 @@ func TestCoreScheduler_SecureVariablesRekey(t *testing.T) {
var rotateResp structs.KeyringRotateRootKeyResponse
require.NoError(t, srv.RPC("Keyring.Rotate", rotateReq, &rotateResp))
- req2 := &structs.SecureVariablesUpsertRequest{
- Data: []*structs.SecureVariableDecrypted{
- mock.SecureVariable(),
- mock.SecureVariable(),
- mock.SecureVariable(),
- },
- WriteRequest: structs.WriteRequest{
- Region: srv.config.Region,
- },
+ for i := 0; i < 3; i++ {
+ req := &structs.SecureVariablesApplyRequest{
+ Op: structs.SVOpSet,
+ Var: mock.SecureVariable(),
+ WriteRequest: structs.WriteRequest{Region: srv.config.Region},
+ }
+ resp := &structs.SecureVariablesApplyResponse{}
+ require.NoError(t, srv.RPC("SecureVariables.Apply", req, resp))
}
- require.NoError(t, srv.RPC("SecureVariables.Upsert", req2, resp))
rotateReq.Full = true
require.NoError(t, srv.RPC("Keyring.Rotate", rotateReq, &rotateResp))
diff --git a/nomad/csi_endpoint_test.go b/nomad/csi_endpoint_test.go
index 9646590729f..65e661d35e2 100644
--- a/nomad/csi_endpoint_test.go
+++ b/nomad/csi_endpoint_test.go
@@ -993,8 +993,10 @@ func TestCSIVolumeEndpoint_Create(t *testing.T) {
)
defer cleanup()
- node := client.Node()
- node.Attributes["nomad.version"] = "0.11.0" // client RPCs not supported on early versions
+ node := client.UpdateConfig(func(c *cconfig.Config) {
+ // client RPCs not supported on early versions
+ c.Node.Attributes["nomad.version"] = "0.11.0"
+ }).Node
req0 := &structs.NodeRegisterRequest{
Node: node,
@@ -1017,24 +1019,26 @@ func TestCSIVolumeEndpoint_Create(t *testing.T) {
codec := rpcClient(t, srv)
index := uint64(1000)
- node.CSIControllerPlugins = map[string]*structs.CSIInfo{
- "minnie": {
- PluginID: "minnie",
- Healthy: true,
- ControllerInfo: &structs.CSIControllerInfo{
- SupportsAttachDetach: true,
- SupportsCreateDelete: true,
+ node = client.UpdateConfig(func(c *cconfig.Config) {
+ c.Node.CSIControllerPlugins = map[string]*structs.CSIInfo{
+ "minnie": {
+ PluginID: "minnie",
+ Healthy: true,
+ ControllerInfo: &structs.CSIControllerInfo{
+ SupportsAttachDetach: true,
+ SupportsCreateDelete: true,
+ },
+ RequiresControllerPlugin: true,
},
- RequiresControllerPlugin: true,
- },
- }
- node.CSINodePlugins = map[string]*structs.CSIInfo{
- "minnie": {
- PluginID: "minnie",
- Healthy: true,
- NodeInfo: &structs.CSINodeInfo{},
- },
- }
+ }
+ c.Node.CSINodePlugins = map[string]*structs.CSIInfo{
+ "minnie": {
+ PluginID: "minnie",
+ Healthy: true,
+ NodeInfo: &structs.CSINodeInfo{},
+ },
+ }
+ }).Node
index++
require.NoError(t, state.UpsertNode(structs.MsgTypeTestSetup, index, node))
@@ -1129,8 +1133,10 @@ func TestCSIVolumeEndpoint_Delete(t *testing.T) {
)
defer cleanup()
- node := client.Node()
- node.Attributes["nomad.version"] = "0.11.0" // client RPCs not supported on early versions
+ node := client.UpdateConfig(func(c *cconfig.Config) {
+ // client RPCs not supported on early versions
+ c.Node.Attributes["nomad.version"] = "0.11.0"
+ }).Node
req0 := &structs.NodeRegisterRequest{
Node: node,
@@ -1153,23 +1159,25 @@ func TestCSIVolumeEndpoint_Delete(t *testing.T) {
codec := rpcClient(t, srv)
index := uint64(1000)
- node.CSIControllerPlugins = map[string]*structs.CSIInfo{
- "minnie": {
- PluginID: "minnie",
- Healthy: true,
- ControllerInfo: &structs.CSIControllerInfo{
- SupportsAttachDetach: true,
+ node = client.UpdateConfig(func(c *cconfig.Config) {
+ c.Node.CSIControllerPlugins = map[string]*structs.CSIInfo{
+ "minnie": {
+ PluginID: "minnie",
+ Healthy: true,
+ ControllerInfo: &structs.CSIControllerInfo{
+ SupportsAttachDetach: true,
+ },
+ RequiresControllerPlugin: true,
},
- RequiresControllerPlugin: true,
- },
- }
- node.CSINodePlugins = map[string]*structs.CSIInfo{
- "minnie": {
- PluginID: "minnie",
- Healthy: true,
- NodeInfo: &structs.CSINodeInfo{},
- },
- }
+ }
+ c.Node.CSINodePlugins = map[string]*structs.CSIInfo{
+ "minnie": {
+ PluginID: "minnie",
+ Healthy: true,
+ NodeInfo: &structs.CSINodeInfo{},
+ },
+ }
+ }).Node
index++
require.NoError(t, state.UpsertNode(structs.MsgTypeTestSetup, index, node))
@@ -1266,8 +1274,10 @@ func TestCSIVolumeEndpoint_ListExternal(t *testing.T) {
)
defer cleanup()
- node := client.Node()
- node.Attributes["nomad.version"] = "0.11.0" // client RPCs not supported on early versions
+ node := client.UpdateConfig(func(c *cconfig.Config) {
+ // client RPCs not supported on early versions
+ c.Node.Attributes["nomad.version"] = "0.11.0"
+ }).Node
req0 := &structs.NodeRegisterRequest{
Node: node,
@@ -1288,24 +1298,26 @@ func TestCSIVolumeEndpoint_ListExternal(t *testing.T) {
codec := rpcClient(t, srv)
index := uint64(1000)
- node.CSIControllerPlugins = map[string]*structs.CSIInfo{
- "minnie": {
- PluginID: "minnie",
- Healthy: true,
- ControllerInfo: &structs.CSIControllerInfo{
- SupportsAttachDetach: true,
- SupportsListVolumes: true,
+ node = client.UpdateConfig(func(c *cconfig.Config) {
+ c.Node.CSIControllerPlugins = map[string]*structs.CSIInfo{
+ "minnie": {
+ PluginID: "minnie",
+ Healthy: true,
+ ControllerInfo: &structs.CSIControllerInfo{
+ SupportsAttachDetach: true,
+ SupportsListVolumes: true,
+ },
+ RequiresControllerPlugin: true,
},
- RequiresControllerPlugin: true,
- },
- }
- node.CSINodePlugins = map[string]*structs.CSIInfo{
- "minnie": {
- PluginID: "minnie",
- Healthy: true,
- NodeInfo: &structs.CSINodeInfo{},
- },
- }
+ }
+ c.Node.CSINodePlugins = map[string]*structs.CSIInfo{
+ "minnie": {
+ PluginID: "minnie",
+ Healthy: true,
+ NodeInfo: &structs.CSINodeInfo{},
+ },
+ }
+ }).Node
index++
require.NoError(t, state.UpsertNode(structs.MsgTypeTestSetup, index, node))
@@ -1359,10 +1371,8 @@ func TestCSIVolumeEndpoint_CreateSnapshot(t *testing.T) {
)
defer cleanup()
- node := client.Node()
-
req0 := &structs.NodeRegisterRequest{
- Node: node,
+ Node: client.Node(),
WriteRequest: structs.WriteRequest{Region: "global"},
}
var resp0 structs.NodeUpdateResponse
@@ -1382,16 +1392,18 @@ func TestCSIVolumeEndpoint_CreateSnapshot(t *testing.T) {
codec := rpcClient(t, srv)
index := uint64(1000)
- node.CSIControllerPlugins = map[string]*structs.CSIInfo{
- "minnie": {
- PluginID: "minnie",
- Healthy: true,
- ControllerInfo: &structs.CSIControllerInfo{
- SupportsCreateDeleteSnapshot: true,
+ node := client.UpdateConfig(func(c *cconfig.Config) {
+ c.Node.CSIControllerPlugins = map[string]*structs.CSIInfo{
+ "minnie": {
+ PluginID: "minnie",
+ Healthy: true,
+ ControllerInfo: &structs.CSIControllerInfo{
+ SupportsCreateDeleteSnapshot: true,
+ },
+ RequiresControllerPlugin: true,
},
- RequiresControllerPlugin: true,
- },
- }
+ }
+ }).Node
index++
require.NoError(t, state.UpsertNode(structs.MsgTypeTestSetup, index, node))
@@ -1452,10 +1464,8 @@ func TestCSIVolumeEndpoint_DeleteSnapshot(t *testing.T) {
)
defer cleanup()
- node := client.Node()
-
req0 := &structs.NodeRegisterRequest{
- Node: node,
+ Node: client.Node(),
WriteRequest: structs.WriteRequest{Region: "global"},
}
var resp0 structs.NodeUpdateResponse
@@ -1475,16 +1485,18 @@ func TestCSIVolumeEndpoint_DeleteSnapshot(t *testing.T) {
codec := rpcClient(t, srv)
index := uint64(1000)
- node.CSIControllerPlugins = map[string]*structs.CSIInfo{
- "minnie": {
- PluginID: "minnie",
- Healthy: true,
- ControllerInfo: &structs.CSIControllerInfo{
- SupportsCreateDeleteSnapshot: true,
+ node := client.UpdateConfig(func(c *cconfig.Config) {
+ c.Node.CSIControllerPlugins = map[string]*structs.CSIInfo{
+ "minnie": {
+ PluginID: "minnie",
+ Healthy: true,
+ ControllerInfo: &structs.CSIControllerInfo{
+ SupportsCreateDeleteSnapshot: true,
+ },
+ RequiresControllerPlugin: true,
},
- RequiresControllerPlugin: true,
- },
- }
+ }
+ }).Node
index++
require.NoError(t, state.UpsertNode(structs.MsgTypeTestSetup, index, node))
@@ -1551,9 +1563,8 @@ func TestCSIVolumeEndpoint_ListSnapshots(t *testing.T) {
)
defer cleanup()
- node := client.Node()
req0 := &structs.NodeRegisterRequest{
- Node: node,
+ Node: client.Node(),
WriteRequest: structs.WriteRequest{Region: "global"},
}
var resp0 structs.NodeUpdateResponse
@@ -1571,16 +1582,18 @@ func TestCSIVolumeEndpoint_ListSnapshots(t *testing.T) {
codec := rpcClient(t, srv)
index := uint64(1000)
- node.CSIControllerPlugins = map[string]*structs.CSIInfo{
- "minnie": {
- PluginID: "minnie",
- Healthy: true,
- ControllerInfo: &structs.CSIControllerInfo{
- SupportsListSnapshots: true,
+ node := client.UpdateConfig(func(c *cconfig.Config) {
+ c.Node.CSIControllerPlugins = map[string]*structs.CSIInfo{
+ "minnie": {
+ PluginID: "minnie",
+ Healthy: true,
+ ControllerInfo: &structs.CSIControllerInfo{
+ SupportsListSnapshots: true,
+ },
+ RequiresControllerPlugin: true,
},
- RequiresControllerPlugin: true,
- },
- }
+ }
+ }).Node
index++
require.NoError(t, state.UpsertNode(structs.MsgTypeTestSetup, index, node))
diff --git a/nomad/deployment_endpoint_test.go b/nomad/deployment_endpoint_test.go
index e58c62da3f0..17d4b99806e 100644
--- a/nomad/deployment_endpoint_test.go
+++ b/nomad/deployment_endpoint_test.go
@@ -8,7 +8,7 @@ import (
msgpackrpc "github.com/hashicorp/net-rpc-msgpackrpc"
"github.com/hashicorp/nomad/acl"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
@@ -492,7 +492,7 @@ func TestDeploymentEndpoint_Promote(t *testing.T) {
d.TaskGroups[a.TaskGroup].PlacedCanaries = []string{a.ID}
a.DeploymentID = d.ID
a.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
}
state := s1.fsm.State()
@@ -557,7 +557,7 @@ func TestDeploymentEndpoint_Promote_ACL(t *testing.T) {
d.TaskGroups[a.TaskGroup].PlacedCanaries = []string{a.ID}
a.DeploymentID = d.ID
a.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
}
state := s1.fsm.State()
diff --git a/nomad/deploymentwatcher/deployment_watcher.go b/nomad/deploymentwatcher/deployment_watcher.go
index bb7bc1f5258..36a8f4d7c0f 100644
--- a/nomad/deploymentwatcher/deployment_watcher.go
+++ b/nomad/deploymentwatcher/deployment_watcher.go
@@ -8,7 +8,7 @@ import (
log "github.com/hashicorp/go-hclog"
memdb "github.com/hashicorp/go-memdb"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/state"
"github.com/hashicorp/nomad/nomad/structs"
@@ -26,7 +26,7 @@ var (
// allocations part of a deployment to be rescheduled. We create a one off
// variable to avoid creating a new object for every request.
allowRescheduleTransition = &structs.DesiredTransition{
- Reschedule: helper.BoolToPtr(true),
+ Reschedule: pointer.Of(true),
}
)
@@ -233,7 +233,7 @@ func (w *deploymentWatcher) SetAllocHealth(
resp.DeploymentModifyIndex = index
resp.Index = index
if j != nil {
- resp.RevertedJobVersion = helper.Uint64ToPtr(j.Version)
+ resp.RevertedJobVersion = pointer.Of(j.Version)
}
return nil
}
@@ -293,18 +293,22 @@ func (w *deploymentWatcher) autoPromoteDeployment(allocs []*structs.AllocListStu
continue
}
- if !dstate.AutoPromote || dstate.DesiredCanaries != len(dstate.PlacedCanaries) {
+ if !dstate.AutoPromote || len(dstate.PlacedCanaries) < dstate.DesiredCanaries {
return nil
}
+ healthyCanaries := 0
// Find the health status of each canary
for _, c := range dstate.PlacedCanaries {
for _, a := range allocs {
- if c == a.ID && !a.DeploymentStatus.IsHealthy() {
- return nil
+ if c == a.ID && a.DeploymentStatus.IsHealthy() {
+ healthyCanaries += 1
}
}
}
+ if healthyCanaries != dstate.DesiredCanaries {
+ return nil
+ }
}
// Send the request
@@ -390,7 +394,7 @@ func (w *deploymentWatcher) FailDeployment(
resp.DeploymentModifyIndex = i
resp.Index = i
if rollbackJob != nil {
- resp.RevertedJobVersion = helper.Uint64ToPtr(rollbackJob.Version)
+ resp.RevertedJobVersion = pointer.Of(rollbackJob.Version)
}
return nil
}
@@ -836,10 +840,12 @@ func (w *deploymentWatcher) getEval() *structs.Evaluation {
// on the previous version that are then "watched" on a leader that's on
// the new version. This would result in an eval with its priority set to
// zero which would be bad. This therefore protects against that.
+ w.l.Lock()
priority := w.d.EvalPriority
if priority == 0 {
priority = w.j.Priority
}
+ w.l.Unlock()
return &structs.Evaluation{
ID: uuid.Generate(),
diff --git a/nomad/deploymentwatcher/deployments_watcher.go b/nomad/deploymentwatcher/deployments_watcher.go
index 56617430fde..46db7a73c34 100644
--- a/nomad/deploymentwatcher/deployments_watcher.go
+++ b/nomad/deploymentwatcher/deployments_watcher.go
@@ -193,7 +193,12 @@ func (w *Watcher) watchDeployments(ctx context.Context) {
// getDeploys retrieves all deployments blocking at the given index.
func (w *Watcher) getDeploys(ctx context.Context, minIndex uint64) ([]*structs.Deployment, uint64, error) {
- resp, index, err := w.state.BlockingQuery(w.getDeploysImpl, minIndex, ctx)
+ // state can be updated concurrently
+ w.l.Lock()
+ stateStore := w.state
+ w.l.Unlock()
+
+ resp, index, err := stateStore.BlockingQuery(w.getDeploysImpl, minIndex, ctx)
if err != nil {
return nil, 0, err
}
diff --git a/nomad/deploymentwatcher/deployments_watcher_test.go b/nomad/deploymentwatcher/deployments_watcher_test.go
index 467ffcca20b..73277ac27c8 100644
--- a/nomad/deploymentwatcher/deployments_watcher_test.go
+++ b/nomad/deploymentwatcher/deployments_watcher_test.go
@@ -7,7 +7,7 @@ import (
memdb "github.com/hashicorp/go-memdb"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/testlog"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/mock"
@@ -326,7 +326,7 @@ func TestWatcher_SetAllocHealth_Unhealthy_Rollback(t *testing.T) {
Status: structs.DeploymentStatusFailed,
StatusDescription: structs.DeploymentStatusDescriptionFailedAllocations,
},
- JobVersion: helper.Uint64ToPtr(0),
+ JobVersion: pointer.Of(uint64(0)),
}
matcher := matchDeploymentAllocHealthRequest(matchConfig)
m.On("UpdateDeploymentAllocHealth", mocker.MatchedBy(matcher)).Return(nil)
@@ -436,7 +436,7 @@ func TestWatcher_PromoteDeployment_HealthyCanaries(t *testing.T) {
d.TaskGroups[a.TaskGroup].DesiredCanaries = 1
d.TaskGroups[a.TaskGroup].PlacedCanaries = []string{a.ID}
a.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
}
a.DeploymentID = d.ID
require.Nil(m.state.UpsertJob(structs.MsgTypeTestSetup, m.nextIndex(), j), "UpsertJob")
@@ -696,6 +696,142 @@ func TestWatcher_AutoPromoteDeployment(t *testing.T) {
require.False(t, b1.DeploymentStatus.Canary)
}
+func TestWatcher_AutoPromoteDeployment_UnhealthyCanaries(t *testing.T) {
+ ci.Parallel(t)
+ w, m := defaultTestDeploymentWatcher(t)
+ now := time.Now()
+
+ // Create 1 UpdateStrategy, 1 job (2 TaskGroups), 2 canaries, and 1 deployment
+ canaryUpd := structs.DefaultUpdateStrategy.Copy()
+ canaryUpd.AutoPromote = true
+ canaryUpd.MaxParallel = 2
+ canaryUpd.Canary = 2
+ canaryUpd.ProgressDeadline = 5 * time.Second
+
+ j := mock.MultiTaskGroupJob()
+ j.TaskGroups[0].Update = canaryUpd
+
+ d := mock.Deployment()
+ d.JobID = j.ID
+ // This is created in scheduler.computeGroup at runtime, where properties from the
+ // UpdateStrategy are copied in
+ d.TaskGroups = map[string]*structs.DeploymentState{
+ "web": {
+ AutoPromote: canaryUpd.AutoPromote,
+ AutoRevert: canaryUpd.AutoRevert,
+ ProgressDeadline: canaryUpd.ProgressDeadline,
+ DesiredTotal: 2,
+ },
+ }
+
+ canaryAlloc := func() *structs.Allocation {
+ a := mock.Alloc()
+ a.DeploymentID = d.ID
+ a.CreateTime = now.UnixNano()
+ a.ModifyTime = now.UnixNano()
+ a.DeploymentStatus = &structs.AllocDeploymentStatus{
+ Canary: true,
+ }
+ return a
+ }
+
+ // Web taskgroup
+ ca1 := canaryAlloc()
+ ca2 := canaryAlloc()
+ ca3 := canaryAlloc()
+
+ d.TaskGroups[ca1.TaskGroup].PlacedCanaries = []string{ca1.ID, ca2.ID, ca3.ID}
+ d.TaskGroups[ca1.TaskGroup].DesiredCanaries = 2
+ require.NoError(t, m.state.UpsertJob(structs.MsgTypeTestSetup, m.nextIndex(), j), "UpsertJob")
+ require.NoError(t, m.state.UpsertDeployment(m.nextIndex(), d), "UpsertDeployment")
+ require.NoError(t, m.state.UpsertAllocs(structs.MsgTypeTestSetup, m.nextIndex(), []*structs.Allocation{ca1, ca2, ca3}), "UpsertAllocs")
+
+ // =============================================================
+ // Support method calls
+
+ // clear UpdateDeploymentStatus default expectation
+ m.Mock.ExpectedCalls = nil
+
+ matchConfig0 := &matchDeploymentStatusUpdateConfig{
+ DeploymentID: d.ID,
+ Status: structs.DeploymentStatusFailed,
+ StatusDescription: structs.DeploymentStatusDescriptionProgressDeadline,
+ Eval: true,
+ }
+ matcher0 := matchDeploymentStatusUpdateRequest(matchConfig0)
+ m.On("UpdateDeploymentStatus", mocker.MatchedBy(matcher0)).Return(nil)
+
+ matchConfig1 := &matchDeploymentAllocHealthRequestConfig{
+ DeploymentID: d.ID,
+ Healthy: []string{ca1.ID, ca2.ID},
+ Eval: true,
+ }
+ matcher1 := matchDeploymentAllocHealthRequest(matchConfig1)
+ m.On("UpdateDeploymentAllocHealth", mocker.MatchedBy(matcher1)).Return(nil)
+
+ matchConfig2 := &matchDeploymentPromoteRequestConfig{
+ Promotion: &structs.DeploymentPromoteRequest{
+ DeploymentID: d.ID,
+ All: true,
+ },
+ Eval: true,
+ }
+ matcher2 := matchDeploymentPromoteRequest(matchConfig2)
+ m.On("UpdateDeploymentPromotion", mocker.MatchedBy(matcher2)).Return(nil)
+ // =============================================================
+
+ // Start the deployment
+ w.SetEnabled(true, m.state)
+ testutil.WaitForResult(func() (bool, error) {
+ w.l.RLock()
+ defer w.l.RUnlock()
+ return 1 == len(w.watchers), nil
+ },
+ func(err error) {
+ w.l.RLock()
+ defer w.l.RUnlock()
+ require.Equal(t, 1, len(w.watchers), "Should have 1 deployment")
+ },
+ )
+
+ // Mark only 2 canaries as healthy
+ req := &structs.DeploymentAllocHealthRequest{
+ DeploymentID: d.ID,
+ HealthyAllocationIDs: []string{ca1.ID, ca2.ID},
+ }
+ var resp structs.DeploymentUpdateResponse
+ // Calls w.raft.UpdateDeploymentAllocHealth, which is implemented by StateStore in
+ // state.UpdateDeploymentAllocHealth via a raft shim?
+ err := w.SetAllocHealth(req, &resp)
+ require.NoError(t, err)
+
+ ws := memdb.NewWatchSet()
+
+ testutil.WaitForResult(
+ func() (bool, error) {
+ ds, _ := m.state.DeploymentsByJobID(ws, j.Namespace, j.ID, true)
+ d = ds[0]
+ return 2 == d.TaskGroups["web"].HealthyAllocs, nil
+ },
+ func(err error) { require.NoError(t, err) },
+ )
+
+ // Verify that a promotion request was submitted.
+ require.Equal(t, 1, len(w.watchers), "Deployment should still be active")
+ m.AssertCalled(t, "UpdateDeploymentPromotion", mocker.MatchedBy(matcher2))
+
+ require.Equal(t, "running", d.Status)
+ require.True(t, d.TaskGroups["web"].Promoted)
+
+ a1, _ := m.state.AllocByID(ws, ca1.ID)
+ require.False(t, a1.DeploymentStatus.Canary)
+ require.Equal(t, "pending", a1.ClientStatus)
+ require.Equal(t, "run", a1.DesiredStatus)
+
+ b1, _ := m.state.AllocByID(ws, ca2.ID)
+ require.False(t, b1.DeploymentStatus.Canary)
+}
+
// Test pausing a deployment that is running
func TestWatcher_PauseDeployment_Pause_Running(t *testing.T) {
ci.Parallel(t)
@@ -941,7 +1077,7 @@ func TestDeploymentWatcher_Watch_NoProgressDeadline(t *testing.T) {
DeploymentID: d.ID,
Status: structs.DeploymentStatusFailed,
StatusDescription: structs.DeploymentStatusDescriptionRollback(structs.DeploymentStatusDescriptionFailedAllocations, 0),
- JobVersion: helper.Uint64ToPtr(0),
+ JobVersion: pointer.Of(uint64(0)),
Eval: true,
}
m2 := matchDeploymentStatusUpdateRequest(c)
@@ -1014,7 +1150,7 @@ func TestDeploymentWatcher_Watch_NoProgressDeadline(t *testing.T) {
DeploymentID: d.ID,
Status: structs.DeploymentStatusFailed,
StatusDescription: structs.DeploymentStatusDescriptionRollback(structs.DeploymentStatusDescriptionFailedAllocations, 0),
- JobVersion: helper.Uint64ToPtr(2),
+ JobVersion: pointer.Of(uint64(2)),
Eval: true,
}
m3 := matchDeploymentStatusUpdateRequest(c2)
@@ -1063,7 +1199,7 @@ func TestDeploymentWatcher_Watch_ProgressDeadline(t *testing.T) {
// Update the alloc to be unhealthy and require that nothing happens.
a2 := a.Copy()
a2.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(false),
+ Healthy: pointer.Of(false),
Timestamp: now,
}
require.Nil(m.state.UpdateAllocsFromClient(structs.MsgTypeTestSetup, 100, []*structs.Allocation{a2}))
@@ -1167,7 +1303,7 @@ func TestDeploymentWatcher_ProgressCutoff(t *testing.T) {
// Update the first allocation to be healthy
a3 := a.Copy()
- a3.DeploymentStatus = &structs.AllocDeploymentStatus{Healthy: helper.BoolToPtr(true)}
+ a3.DeploymentStatus = &structs.AllocDeploymentStatus{Healthy: pointer.Of(true)}
require.Nil(m.state.UpsertAllocs(structs.MsgTypeTestSetup, m.nextIndex(), []*structs.Allocation{a3}), "UpsertAllocs")
// Get the updated deployment
@@ -1186,7 +1322,7 @@ func TestDeploymentWatcher_ProgressCutoff(t *testing.T) {
// Update the second allocation to be healthy
a4 := a2.Copy()
- a4.DeploymentStatus = &structs.AllocDeploymentStatus{Healthy: helper.BoolToPtr(true)}
+ a4.DeploymentStatus = &structs.AllocDeploymentStatus{Healthy: pointer.Of(true)}
require.Nil(m.state.UpsertAllocs(structs.MsgTypeTestSetup, m.nextIndex(), []*structs.Allocation{a4}), "UpsertAllocs")
// Get the updated deployment
@@ -1247,7 +1383,7 @@ func TestDeploymentWatcher_Watch_ProgressDeadline_Canaries(t *testing.T) {
// Update the alloc to be unhealthy and require that nothing happens.
a2 := a.Copy()
a2.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
Timestamp: now,
}
require.Nil(m.state.UpdateAllocsFromClient(structs.MsgTypeTestSetup, m.nextIndex(), []*structs.Allocation{a2}))
@@ -1320,7 +1456,7 @@ func TestDeploymentWatcher_PromotedCanary_UpdatedAllocs(t *testing.T) {
a.ModifyTime = now.UnixNano()
a.DeploymentID = d.ID
a.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
Timestamp: now,
}
require.Nil(m.state.UpsertJob(structs.MsgTypeTestSetup, m.nextIndex(), j), "UpsertJob")
@@ -1341,7 +1477,7 @@ func TestDeploymentWatcher_PromotedCanary_UpdatedAllocs(t *testing.T) {
a2.CreateTime = now.UnixNano()
a2.ModifyTime = now.UnixNano()
a2.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
Timestamp: now,
}
d.TaskGroups["web"].RequireProgressBy = time.Now().Add(2 * time.Second)
@@ -1469,7 +1605,7 @@ func TestDeploymentWatcher_ProgressDeadline_LatePromote(t *testing.T) {
canary2.ModifyTime = now.UnixNano()
canary2.DeploymentStatus = &structs.AllocDeploymentStatus{
Canary: true,
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
Timestamp: now,
}
@@ -1488,7 +1624,7 @@ func TestDeploymentWatcher_ProgressDeadline_LatePromote(t *testing.T) {
canary1.ModifyTime = now.UnixNano()
canary1.DeploymentStatus = &structs.AllocDeploymentStatus{
Canary: true,
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
Timestamp: now,
}
@@ -1544,7 +1680,7 @@ func TestDeploymentWatcher_ProgressDeadline_LatePromote(t *testing.T) {
alloc1a.ModifyTime = now.UnixNano()
alloc1a.DeploymentStatus = &structs.AllocDeploymentStatus{
Canary: false,
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
Timestamp: now,
}
@@ -1553,7 +1689,7 @@ func TestDeploymentWatcher_ProgressDeadline_LatePromote(t *testing.T) {
alloc1b.ModifyTime = now.UnixNano()
alloc1b.DeploymentStatus = &structs.AllocDeploymentStatus{
Canary: false,
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
Timestamp: now,
}
@@ -1626,7 +1762,7 @@ func TestDeploymentWatcher_Watch_StartWithoutProgressDeadline(t *testing.T) {
// Update the alloc to be unhealthy
a2 := a.Copy()
a2.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(false),
+ Healthy: pointer.Of(false),
Timestamp: time.Now(),
}
require.Nil(m.state.UpdateAllocsFromClient(structs.MsgTypeTestSetup, m.nextIndex(), []*structs.Allocation{a2}))
diff --git a/nomad/drainer/drainer.go b/nomad/drainer/drainer.go
index 2e4e8528ffc..f610a0bce36 100644
--- a/nomad/drainer/drainer.go
+++ b/nomad/drainer/drainer.go
@@ -7,7 +7,7 @@ import (
log "github.com/hashicorp/go-hclog"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/state"
"github.com/hashicorp/nomad/nomad/structs"
@@ -396,7 +396,7 @@ func (n *NodeDrainer) drainAllocs(future *structs.BatchFuture, allocs []*structs
transitions := make(map[string]*structs.DesiredTransition, len(allocs))
for _, alloc := range allocs {
transitions[alloc.ID] = &structs.DesiredTransition{
- Migrate: helper.BoolToPtr(true),
+ Migrate: pointer.Of(true),
}
jobs[alloc.JobNamespacedID()] = alloc
}
diff --git a/nomad/drainer/draining_node_test.go b/nomad/drainer/draining_node_test.go
index b93efcb7792..59f258f239a 100644
--- a/nomad/drainer/draining_node_test.go
+++ b/nomad/drainer/draining_node_test.go
@@ -46,7 +46,7 @@ func assertDrainingNode(t *testing.T, dn *drainingNode, isDone bool, remaining,
func TestDrainingNode_Table(t *testing.T) {
ci.Parallel(t)
-
+
cases := []struct {
name string
isDone bool
diff --git a/nomad/drainer/watch_jobs.go b/nomad/drainer/watch_jobs.go
index b3dbc842e93..36d301cc3b5 100644
--- a/nomad/drainer/watch_jobs.go
+++ b/nomad/drainer/watch_jobs.go
@@ -411,7 +411,7 @@ func handleTaskGroup(snap *state.StateSnapshot, batch bool, tg *structs.TaskGrou
// Determine how many we can drain
thresholdCount := tg.Count - tg.Migrate.MaxParallel
numToDrain := healthy - thresholdCount
- numToDrain = helper.IntMin(len(drainable), numToDrain)
+ numToDrain = helper.Min(len(drainable), numToDrain)
if numToDrain <= 0 {
return nil
}
diff --git a/nomad/drainer/watch_jobs_test.go b/nomad/drainer/watch_jobs_test.go
index 192fb112424..9f6f637dd8a 100644
--- a/nomad/drainer/watch_jobs_test.go
+++ b/nomad/drainer/watch_jobs_test.go
@@ -6,7 +6,7 @@ import (
"time"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/testlog"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/mock"
@@ -138,7 +138,7 @@ func TestDrainingJobWatcher_DrainJobs(t *testing.T) {
for i := 0; i < count; i++ {
a := newAlloc(drainingNode, job)
a.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
}
allocs = append(allocs, a)
}
@@ -160,7 +160,7 @@ func TestDrainingJobWatcher_DrainJobs(t *testing.T) {
// the old ones
drainedAllocs := make([]*structs.Allocation, len(drains.Allocs))
for i, a := range drains.Allocs {
- a.DesiredTransition.Migrate = helper.BoolToPtr(true)
+ a.DesiredTransition.Migrate = pointer.Of(true)
// create a copy so we can reuse this slice
drainedAllocs[i] = a.Copy()
@@ -203,7 +203,7 @@ func TestDrainingJobWatcher_DrainJobs(t *testing.T) {
for _, a := range replacements {
a.ClientStatus = structs.AllocClientStatusRunning
a.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
}
}
require.Nil(state.UpsertAllocs(structs.MsgTypeTestSetup, index, replacements))
@@ -217,7 +217,7 @@ func TestDrainingJobWatcher_DrainJobs(t *testing.T) {
// Fake migrations once more to finish the drain
drainedAllocs = make([]*structs.Allocation, len(drains.Allocs))
for i, a := range drains.Allocs {
- a.DesiredTransition.Migrate = helper.BoolToPtr(true)
+ a.DesiredTransition.Migrate = pointer.Of(true)
// create a copy so we can reuse this slice
drainedAllocs[i] = a.Copy()
@@ -246,7 +246,7 @@ func TestDrainingJobWatcher_DrainJobs(t *testing.T) {
for _, a := range replacements {
a.ClientStatus = structs.AllocClientStatusRunning
a.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
}
}
require.Nil(state.UpsertAllocs(structs.MsgTypeTestSetup, index, replacements))
@@ -260,7 +260,7 @@ func TestDrainingJobWatcher_DrainJobs(t *testing.T) {
// Fake migrations once more to finish the drain
drainedAllocs = make([]*structs.Allocation, len(drains.Allocs))
for i, a := range drains.Allocs {
- a.DesiredTransition.Migrate = helper.BoolToPtr(true)
+ a.DesiredTransition.Migrate = pointer.Of(true)
// create a copy so we can reuse this slice
drainedAllocs[i] = a.Copy()
@@ -289,7 +289,7 @@ func TestDrainingJobWatcher_DrainJobs(t *testing.T) {
for _, a := range replacements {
a.ClientStatus = structs.AllocClientStatusRunning
a.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
}
}
require.Nil(state.UpsertAllocs(structs.MsgTypeTestSetup, index, replacements))
@@ -382,7 +382,7 @@ func TestHandeTaskGroup_Table(t *testing.T) {
ExpectedDone: false,
AddAlloc: func(i int, a *structs.Allocation, drainingID, runningID string) {
if i == 0 {
- a.DesiredTransition.Migrate = helper.BoolToPtr(true)
+ a.DesiredTransition.Migrate = pointer.Of(true)
return
}
a.NodeID = runningID
@@ -549,7 +549,7 @@ func TestHandeTaskGroup_Table(t *testing.T) {
func testHandleTaskGroup(t *testing.T, tc handleTaskGroupTestCase) {
ci.Parallel(t)
-
+
require := require.New(t)
assert := assert.New(t)
@@ -583,7 +583,7 @@ func testHandleTaskGroup(t *testing.T, tc handleTaskGroupTestCase) {
// Default to being healthy on the draining node
a.NodeID = drainingNode.ID
a.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
}
if tc.AddAlloc != nil {
tc.AddAlloc(i, a, drainingNode.ID, runningNode.ID)
@@ -630,7 +630,7 @@ func TestHandleTaskGroup_Migrations(t *testing.T) {
a.TaskGroup = job.TaskGroups[0].Name
a.NodeID = n.ID
a.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(false),
+ Healthy: pointer.Of(false),
}
if i%2 == 0 {
@@ -699,7 +699,7 @@ func TestHandleTaskGroup_GarbageCollectedNode(t *testing.T) {
a.TaskGroup = job.TaskGroups[0].Name
a.NodeID = n.ID
a.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(false),
+ Healthy: pointer.Of(false),
}
if i%2 == 0 {
diff --git a/nomad/drainer_int_test.go b/nomad/drainer_int_test.go
index 5c23ac89105..33abf4812e8 100644
--- a/nomad/drainer_int_test.go
+++ b/nomad/drainer_int_test.go
@@ -12,7 +12,7 @@ import (
msgpackrpc "github.com/hashicorp/net-rpc-msgpackrpc"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/drainer"
"github.com/hashicorp/nomad/nomad/mock"
@@ -52,7 +52,7 @@ func allocPromoter(errCh chan<- error, ctx context.Context,
}
newAlloc := alloc.Copy()
newAlloc.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
Timestamp: now,
}
updates = append(updates, newAlloc)
diff --git a/nomad/eval_broker.go b/nomad/eval_broker.go
index b0b0b87d547..e13394b1725 100644
--- a/nomad/eval_broker.go
+++ b/nomad/eval_broker.go
@@ -200,9 +200,9 @@ func (b *EvalBroker) Enqueue(eval *structs.Evaluation) {
// enqueued. The evaluation is handled in one of the following ways:
// * Evaluation not outstanding: Process as a normal Enqueue
// * Evaluation outstanding: Do not allow the evaluation to be dequeued til:
-// * Ack received: Unblock the evaluation allowing it to be dequeued
-// * Nack received: Drop the evaluation as it was created as a result of a
-// scheduler run that was Nack'd
+// - Ack received: Unblock the evaluation allowing it to be dequeued
+// - Nack received: Drop the evaluation as it was created as a result of a
+// scheduler run that was Nack'd
func (b *EvalBroker) EnqueueAll(evals map[*structs.Evaluation]string) {
// The lock needs to be held until all evaluations are enqueued. This is so
// that when Dequeue operations are unblocked they will pick the highest
diff --git a/nomad/event_endpoint.go b/nomad/event_endpoint.go
index 522d130e186..2628b11a109 100644
--- a/nomad/event_endpoint.go
+++ b/nomad/event_endpoint.go
@@ -7,7 +7,7 @@ import (
"time"
"github.com/hashicorp/go-msgpack/codec"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/nomad/stream"
"github.com/hashicorp/nomad/nomad/structs"
)
@@ -28,7 +28,7 @@ func (e *Event) stream(conn io.ReadWriteCloser) {
encoder := codec.NewEncoder(conn, structs.MsgpackHandle)
if err := decoder.Decode(&args); err != nil {
- handleJsonResultError(err, helper.Int64ToPtr(500), encoder)
+ handleJsonResultError(err, pointer.Of(int64(500)), encoder)
return
}
@@ -36,7 +36,7 @@ func (e *Event) stream(conn io.ReadWriteCloser) {
if args.Region != e.srv.config.Region {
err := e.forwardStreamingRPC(args.Region, "Event.Stream", args, conn)
if err != nil {
- handleJsonResultError(err, helper.Int64ToPtr(500), encoder)
+ handleJsonResultError(err, pointer.Of(int64(500)), encoder)
}
return
}
@@ -52,7 +52,7 @@ func (e *Event) stream(conn io.ReadWriteCloser) {
// Get the servers broker and subscribe
publisher, err := e.srv.State().EventBroker()
if err != nil {
- handleJsonResultError(err, helper.Int64ToPtr(500), encoder)
+ handleJsonResultError(err, pointer.Of(int64(500)), encoder)
return
}
@@ -66,7 +66,7 @@ func (e *Event) stream(conn io.ReadWriteCloser) {
subscription, subErr = publisher.Subscribe(subReq)
}
if subErr != nil {
- handleJsonResultError(subErr, helper.Int64ToPtr(500), encoder)
+ handleJsonResultError(subErr, pointer.Of(int64(500)), encoder)
return
}
defer subscription.Unsubscribe()
@@ -141,7 +141,7 @@ OUTER:
}
if streamErr != nil {
- handleJsonResultError(streamErr, helper.Int64ToPtr(500), encoder)
+ handleJsonResultError(streamErr, pointer.Of(int64(500)), encoder)
return
}
diff --git a/nomad/fsm.go b/nomad/fsm.go
index 0b923223151..02a2ba39f6a 100644
--- a/nomad/fsm.go
+++ b/nomad/fsm.go
@@ -12,7 +12,7 @@ import (
"github.com/hashicorp/go-hclog"
"github.com/hashicorp/go-memdb"
"github.com/hashicorp/go-msgpack/codec"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/state"
"github.com/hashicorp/nomad/nomad/structs"
@@ -318,10 +318,8 @@ func (n *nomadFSM) Apply(log *raft.Log) interface{} {
return n.applyDeleteServiceRegistrationByID(msgType, buf[1:], log.Index)
case structs.ServiceRegistrationDeleteByNodeIDRequestType:
return n.applyDeleteServiceRegistrationByNodeID(msgType, buf[1:], log.Index)
- case structs.SecureVariableUpsertRequestType:
- return n.applySecureVariableUpsert(msgType, buf[1:], log.Index)
- case structs.SecureVariableDeleteRequestType:
- return n.applySecureVariableDelete(msgType, buf[1:], log.Index)
+ case structs.SVApplyStateRequestType:
+ return n.applySecureVariableOperation(msgType, buf[1:], log.Index)
case structs.RootKeyMetaUpsertRequestType:
return n.applyRootKeyMetaUpsert(msgType, buf[1:], log.Index)
case structs.RootKeyMetaDeleteRequestType:
@@ -707,7 +705,7 @@ func (n *nomadFSM) handleJobDeregister(index uint64, jobID, namespace string, pu
if err != nil {
return err
}
- transition := &structs.DesiredTransition{NoShutdownDelay: helper.BoolToPtr(true)}
+ transition := &structs.DesiredTransition{NoShutdownDelay: pointer.Of(true)}
for _, alloc := range allocs {
err := n.state.UpdateAllocDesiredTransitionTxn(tx, index, alloc.ID, transition)
if err != nil {
@@ -2085,34 +2083,27 @@ func (f *FSMFilter) Include(item interface{}) bool {
return true
}
-func (n *nomadFSM) applySecureVariableUpsert(msgType structs.MessageType, buf []byte, index uint64) interface{} {
- defer metrics.MeasureSince([]string{"nomad", "fsm", "apply_secure_variable_upsert"}, time.Now())
- var req structs.SecureVariablesEncryptedUpsertRequest
+func (n *nomadFSM) applySecureVariableOperation(msgType structs.MessageType, buf []byte, index uint64) interface{} {
+ var req structs.SVApplyStateRequest
if err := structs.Decode(buf, &req); err != nil {
panic(fmt.Errorf("failed to decode request: %v", err))
}
-
- if err := n.state.UpsertSecureVariables(msgType, index, req.Data); err != nil {
- n.logger.Error("UpsertSecureVariables failed", "error", err)
+ defer metrics.MeasureSinceWithLabels([]string{"nomad", "fsm", "apply_sv_operation"}, time.Now(),
+ []metrics.Label{{Name: "op", Value: string(req.Op)}})
+ switch req.Op {
+ case structs.SVOpSet:
+ return n.state.SVESet(index, &req)
+ case structs.SVOpDelete:
+ return n.state.SVEDelete(index, &req)
+ case structs.SVOpDeleteCAS:
+ return n.state.SVEDeleteCAS(index, &req)
+ case structs.SVOpCAS:
+ return n.state.SVESetCAS(index, &req)
+ default:
+ err := fmt.Errorf("Invalid SVE operation '%s'", req.Op)
+ n.logger.Warn("Invalid SVE operation", "operation", req.Op)
return err
}
-
- return nil
-}
-
-func (n *nomadFSM) applySecureVariableDelete(msgType structs.MessageType, buf []byte, index uint64) interface{} {
- defer metrics.MeasureSince([]string{"nomad", "fsm", "apply_secure_variable_delete"}, time.Now())
- var req structs.SecureVariablesDeleteRequest
- if err := structs.Decode(buf, &req); err != nil {
- panic(fmt.Errorf("failed to decode request: %v", err))
- }
-
- if err := n.state.DeleteSecureVariables(msgType, index, req.Namespace, []string{req.Path}); err != nil {
- n.logger.Error("DeleteSecureVariables failed", "error", err)
- return err
- }
-
- return nil
}
func (n *nomadFSM) applyRootKeyMetaUpsert(msgType structs.MessageType, buf []byte, index uint64) interface{} {
diff --git a/nomad/fsm_test.go b/nomad/fsm_test.go
index ff858c2d570..c552d1ed56a 100644
--- a/nomad/fsm_test.go
+++ b/nomad/fsm_test.go
@@ -12,7 +12,7 @@ import (
"github.com/google/go-cmp/cmp"
memdb "github.com/hashicorp/go-memdb"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/testlog"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/mock"
@@ -1581,7 +1581,7 @@ func TestFSM_UpdateAllocDesiredTransition(t *testing.T) {
state.UpsertAllocs(structs.MsgTypeTestSetup, 10, []*structs.Allocation{alloc, alloc2})
t1 := &structs.DesiredTransition{
- Migrate: helper.BoolToPtr(true),
+ Migrate: pointer.Of(true),
}
eval := &structs.Evaluation{
@@ -2082,7 +2082,7 @@ func TestFSM_DeploymentPromotion(t *testing.T) {
c1.DeploymentID = d.ID
d.TaskGroups[c1.TaskGroup].PlacedCanaries = append(d.TaskGroups[c1.TaskGroup].PlacedCanaries, c1.ID)
c1.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
}
c2 := mock.Alloc()
c2.JobID = j.ID
@@ -2090,7 +2090,7 @@ func TestFSM_DeploymentPromotion(t *testing.T) {
d.TaskGroups[c2.TaskGroup].PlacedCanaries = append(d.TaskGroups[c2.TaskGroup].PlacedCanaries, c2.ID)
c2.TaskGroup = tg2.Name
c2.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
}
if err := state.UpsertAllocs(structs.MsgTypeTestSetup, 3, []*structs.Allocation{c1, c2}); err != nil {
@@ -3415,7 +3415,14 @@ func TestFSM_SnapshotRestore_SecureVariables(t *testing.T) {
// Generate and upsert some secure variables.
msvs := mock.SecureVariablesEncrypted(3, 3)
svs := msvs.List()
- require.NoError(t, testState.UpsertSecureVariables(structs.MsgTypeTestSetup, 10, svs))
+
+ for _, sv := range svs {
+ setResp := testState.SVESet(10, &structs.SVApplyStateRequest{
+ Op: structs.SVOpSet,
+ Var: sv,
+ })
+ require.NoError(t, setResp.Error)
+ }
// Update the mock secure variables data with the actual create information
iter, err := testState.SecureVariables(memdb.NewWatchSet())
diff --git a/nomad/heartbeat_test.go b/nomad/heartbeat_test.go
index 17a5ce08e1f..58879cf9a14 100644
--- a/nomad/heartbeat_test.go
+++ b/nomad/heartbeat_test.go
@@ -8,7 +8,7 @@ import (
memdb "github.com/hashicorp/go-memdb"
msgpackrpc "github.com/hashicorp/net-rpc-msgpackrpc"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
"github.com/hashicorp/nomad/testutil"
@@ -301,18 +301,18 @@ func TestHeartbeat_InvalidateHeartbeat_DisconnectedClient(t *testing.T) {
{
name: "has-pending-reconnects",
now: time.Now().UTC(),
- maxClientDisconnect: helper.TimeToPtr(5 * time.Second),
+ maxClientDisconnect: pointer.Of(5 * time.Second),
expectedNodeStatus: structs.NodeStatusDisconnected,
},
{
name: "has-expired-reconnects",
- maxClientDisconnect: helper.TimeToPtr(5 * time.Second),
+ maxClientDisconnect: pointer.Of(5 * time.Second),
now: time.Now().UTC().Add(-10 * time.Second),
expectedNodeStatus: structs.NodeStatusDown,
},
{
name: "has-expired-reconnects-equal-timestamp",
- maxClientDisconnect: helper.TimeToPtr(5 * time.Second),
+ maxClientDisconnect: pointer.Of(5 * time.Second),
now: time.Now().UTC().Add(-5 * time.Second),
expectedNodeStatus: structs.NodeStatusDown,
},
diff --git a/nomad/job_endpoint.go b/nomad/job_endpoint.go
index 5c1e62a624f..b94d7205420 100644
--- a/nomad/job_endpoint.go
+++ b/nomad/job_endpoint.go
@@ -16,6 +16,7 @@ import (
"github.com/hashicorp/go-multierror"
"github.com/hashicorp/nomad/acl"
"github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/state"
"github.com/hashicorp/nomad/nomad/state/paginator"
@@ -41,7 +42,7 @@ var (
// allocations to be force rescheduled. We create a one off
// variable to avoid creating a new object for every request.
allowForceRescheduleTransition = &structs.DesiredTransition{
- ForceReschedule: helper.BoolToPtr(true),
+ ForceReschedule: pointer.Of(true),
}
)
@@ -103,12 +104,12 @@ func (j *Job) Register(args *structs.JobRegisterRequest, reply *structs.JobRegis
// Attach the Nomad token's accessor ID so that deploymentwatcher
// can reference the token later
- tokenID, err := j.srv.ResolveSecretToken(args.AuthToken)
+ nomadACLToken, err := j.srv.ResolveSecretToken(args.AuthToken)
if err != nil {
return err
}
- if tokenID != nil {
- args.Job.NomadTokenID = tokenID.AccessorID
+ if nomadACLToken != nil {
+ args.Job.NomadTokenID = nomadACLToken.AccessorID
}
// Set the warning message
@@ -272,7 +273,11 @@ func (j *Job) Register(args *structs.JobRegisterRequest, reply *structs.JobRegis
// Enforce Sentinel policies. Pass a copy of the job to prevent
// sentinel from altering it.
- policyWarnings, err := j.enforceSubmitJob(args.PolicyOverride, args.Job.Copy())
+ ns, err := snap.NamespaceByName(nil, args.RequestNamespace())
+ if err != nil {
+ return err
+ }
+ policyWarnings, err := j.enforceSubmitJob(args.PolicyOverride, args.Job.Copy(), nomadACLToken, ns)
if err != nil {
return err
}
@@ -464,10 +469,8 @@ func getSignalConstraint(signals []string) *structs.Constraint {
}
}
-// Summary retrieves the summary of a job
-func (j *Job) Summary(args *structs.JobSummaryRequest,
- reply *structs.JobSummaryResponse) error {
-
+// Summary retrieves the summary of a job.
+func (j *Job) Summary(args *structs.JobSummaryRequest, reply *structs.JobSummaryResponse) error {
if done, err := j.srv.forward("Job.Summary", args, args, reply); done {
return err
}
@@ -511,8 +514,14 @@ func (j *Job) Summary(args *structs.JobSummaryRequest,
return j.srv.blockingRPC(&opts)
}
-// Validate validates a job
+// Validate validates a job.
+//
+// Must forward to the leader, because only the leader will have a live Vault
+// client with which to validate vault tokens.
func (j *Job) Validate(args *structs.JobValidateRequest, reply *structs.JobValidateResponse) error {
+ if done, err := j.srv.forward("Job.Validate", args, args, reply); done {
+ return err
+ }
defer metrics.MeasureSince([]string{"nomad", "job", "validate"}, time.Now())
// defensive check; http layer and RPC requester should ensure namespaces are set consistently
@@ -1014,6 +1023,10 @@ func (j *Job) Scale(args *structs.JobScaleRequest, reply *structs.JobRegisterRes
return structs.NewErrRPCCoded(404, fmt.Sprintf("job %q not found", args.JobID))
}
+ // Since job is going to be mutated we must copy it since state store methods
+ // return a shared pointer.
+ job = job.Copy()
+
// Find target group in job TaskGroups
groupName := args.Target[structs.ScalingTargetGroup]
var group *structs.TaskGroup
@@ -1385,7 +1398,7 @@ func (j *Job) List(args *structs.JobListRequest, reply *structs.JobListResponse)
if err != nil {
return err
}
- reply.Index = helper.Uint64Max(jindex, sindex)
+ reply.Index = helper.Max(jindex, sindex)
// Set the query response
j.srv.setQueryMeta(&reply.QueryMeta)
@@ -1618,8 +1631,22 @@ func (j *Job) Plan(args *structs.JobPlanRequest, reply *structs.JobPlanResponse)
}
}
+ // Acquire a snapshot of the state
+ snap, err := j.srv.fsm.State().Snapshot()
+ if err != nil {
+ return err
+ }
+
// Enforce Sentinel policies
- policyWarnings, err := j.enforceSubmitJob(args.PolicyOverride, args.Job)
+ nomadACLToken, err := snap.ACLTokenBySecretID(nil, args.AuthToken)
+ if err != nil && !strings.Contains(err.Error(), "missing secret id") {
+ return err
+ }
+ ns, err := snap.NamespaceByName(nil, args.RequestNamespace())
+ if err != nil {
+ return err
+ }
+ policyWarnings, err := j.enforceSubmitJob(args.PolicyOverride, args.Job, nomadACLToken, ns)
if err != nil {
return err
}
@@ -1628,12 +1655,6 @@ func (j *Job) Plan(args *structs.JobPlanRequest, reply *structs.JobPlanResponse)
reply.Warnings = structs.MergeMultierrorWarnings(warnings...)
}
- // Acquire a snapshot of the state
- snap, err := j.srv.fsm.State().Snapshot()
- if err != nil {
- return err
- }
-
// Interpolate the job for this region
err = j.interpolateMultiregionFields(args)
if err != nil {
diff --git a/nomad/job_endpoint_hook_connect.go b/nomad/job_endpoint_hook_connect.go
index 0cba5c89573..2af2d7199f1 100644
--- a/nomad/job_endpoint_hook_connect.go
+++ b/nomad/job_endpoint_hook_connect.go
@@ -9,6 +9,7 @@ import (
"github.com/hashicorp/nomad/client/taskenv"
"github.com/hashicorp/nomad/helper"
"github.com/hashicorp/nomad/helper/envoy"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/structs"
)
@@ -391,7 +392,7 @@ func gatewayProxy(gateway *structs.ConsulGateway, mode string) *structs.ConsulGa
// set default connect timeout if not set
if proxy.ConnectTimeout == nil {
- proxy.ConnectTimeout = helper.TimeToPtr(defaultConnectTimeout)
+ proxy.ConnectTimeout = pointer.Of(defaultConnectTimeout)
}
if mode == "bridge" {
diff --git a/nomad/job_endpoint_hook_connect_test.go b/nomad/job_endpoint_hook_connect_test.go
index b665205ca2e..4e5bd7fc9db 100644
--- a/nomad/job_endpoint_hook_connect_test.go
+++ b/nomad/job_endpoint_hook_connect_test.go
@@ -6,7 +6,7 @@ import (
"time"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/testlog"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
@@ -705,7 +705,7 @@ func TestJobEndpointConnect_gatewayProxyIsDefault(t *testing.T) {
t.Run("unrelated fields set", func(t *testing.T) {
result := gatewayProxyIsDefault(&structs.ConsulGatewayProxy{
- ConnectTimeout: helper.TimeToPtr(2 * time.Second),
+ ConnectTimeout: pointer.Of(2 * time.Second),
Config: map[string]interface{}{"foo": 1},
})
require.True(t, result)
@@ -826,7 +826,7 @@ func TestJobEndpointConnect_gatewayProxy(t *testing.T) {
},
}, "bridge")
require.Equal(t, &structs.ConsulGatewayProxy{
- ConnectTimeout: helper.TimeToPtr(defaultConnectTimeout),
+ ConnectTimeout: pointer.Of(defaultConnectTimeout),
EnvoyGatewayNoDefaultBind: true,
EnvoyGatewayBindTaggedAddresses: false,
EnvoyGatewayBindAddresses: map[string]*structs.ConsulGatewayBindAddress{
@@ -840,7 +840,7 @@ func TestJobEndpointConnect_gatewayProxy(t *testing.T) {
t.Run("ingress set defaults", func(t *testing.T) {
result := gatewayProxy(&structs.ConsulGateway{
Proxy: &structs.ConsulGatewayProxy{
- ConnectTimeout: helper.TimeToPtr(2 * time.Second),
+ ConnectTimeout: pointer.Of(2 * time.Second),
Config: map[string]interface{}{"foo": 1},
},
Ingress: &structs.ConsulIngressConfigEntry{
@@ -854,7 +854,7 @@ func TestJobEndpointConnect_gatewayProxy(t *testing.T) {
},
}, "bridge")
require.Equal(t, &structs.ConsulGatewayProxy{
- ConnectTimeout: helper.TimeToPtr(2 * time.Second),
+ ConnectTimeout: pointer.Of(2 * time.Second),
Config: map[string]interface{}{"foo": 1},
EnvoyGatewayNoDefaultBind: true,
EnvoyGatewayBindTaggedAddresses: false,
@@ -894,7 +894,7 @@ func TestJobEndpointConnect_gatewayProxy(t *testing.T) {
t.Run("terminating set defaults", func(t *testing.T) {
result := gatewayProxy(&structs.ConsulGateway{
Proxy: &structs.ConsulGatewayProxy{
- ConnectTimeout: helper.TimeToPtr(2 * time.Second),
+ ConnectTimeout: pointer.Of(2 * time.Second),
EnvoyDNSDiscoveryType: "STRICT_DNS",
},
Terminating: &structs.ConsulTerminatingConfigEntry{
@@ -908,7 +908,7 @@ func TestJobEndpointConnect_gatewayProxy(t *testing.T) {
},
}, "bridge")
require.Equal(t, &structs.ConsulGatewayProxy{
- ConnectTimeout: helper.TimeToPtr(2 * time.Second),
+ ConnectTimeout: pointer.Of(2 * time.Second),
EnvoyGatewayNoDefaultBind: true,
EnvoyGatewayBindTaggedAddresses: false,
EnvoyDNSDiscoveryType: "STRICT_DNS",
@@ -945,14 +945,14 @@ func TestJobEndpointConnect_gatewayProxy(t *testing.T) {
t.Run("mesh set defaults in bridge", func(t *testing.T) {
result := gatewayProxy(&structs.ConsulGateway{
Proxy: &structs.ConsulGatewayProxy{
- ConnectTimeout: helper.TimeToPtr(2 * time.Second),
+ ConnectTimeout: pointer.Of(2 * time.Second),
},
Mesh: &structs.ConsulMeshConfigEntry{
// nothing
},
}, "bridge")
require.Equal(t, &structs.ConsulGatewayProxy{
- ConnectTimeout: helper.TimeToPtr(2 * time.Second),
+ ConnectTimeout: pointer.Of(2 * time.Second),
EnvoyGatewayNoDefaultBind: true,
EnvoyGatewayBindTaggedAddresses: false,
EnvoyGatewayBindAddresses: map[string]*structs.ConsulGatewayBindAddress{
@@ -971,14 +971,14 @@ func TestJobEndpointConnect_gatewayProxy(t *testing.T) {
t.Run("mesh set defaults in host", func(t *testing.T) {
result := gatewayProxy(&structs.ConsulGateway{
Proxy: &structs.ConsulGatewayProxy{
- ConnectTimeout: helper.TimeToPtr(2 * time.Second),
+ ConnectTimeout: pointer.Of(2 * time.Second),
},
Mesh: &structs.ConsulMeshConfigEntry{
// nothing
},
}, "host")
require.Equal(t, &structs.ConsulGatewayProxy{
- ConnectTimeout: helper.TimeToPtr(2 * time.Second),
+ ConnectTimeout: pointer.Of(2 * time.Second),
}, result)
})
diff --git a/nomad/job_endpoint_hook_expose_check.go b/nomad/job_endpoint_hook_expose_check.go
index 7ce70aa473b..f5590bbbbe6 100644
--- a/nomad/job_endpoint_hook_expose_check.go
+++ b/nomad/job_endpoint_hook_expose_check.go
@@ -51,9 +51,9 @@ func (jobExposeCheckHook) Mutate(job *structs.Job) (_ *structs.Job, warnings []e
}
// Validate will ensure:
-// - The job contains valid network configuration for each task group in which
-// an expose path is configured. The network must be of type bridge mode.
-// - The check Expose field is configured only for connect-enabled group-services.
+// - The job contains valid network configuration for each task group in which
+// an expose path is configured. The network must be of type bridge mode.
+// - The check Expose field is configured only for connect-enabled group-services.
func (jobExposeCheckHook) Validate(job *structs.Job) (warnings []error, err error) {
for _, tg := range job.TaskGroups {
// Make sure any group that contains a group-service that enables expose
diff --git a/nomad/job_endpoint_hook_expose_check_test.go b/nomad/job_endpoint_hook_expose_check_test.go
index 8e71883ba32..08c78685506 100644
--- a/nomad/job_endpoint_hook_expose_check_test.go
+++ b/nomad/job_endpoint_hook_expose_check_test.go
@@ -317,7 +317,7 @@ func TestJobExposeCheckHook_exposePathForCheck(t *testing.T) {
Name: "group1",
Services: []*structs.Service{s},
Networks: structs.Networks{{
- Mode: "bridge",
+ Mode: "bridge",
DynamicPorts: []structs.Port{
// service declares "sPort", but does not exist
},
diff --git a/nomad/job_endpoint_oss.go b/nomad/job_endpoint_oss.go
index 7f2b56c788d..d80281a3bca 100644
--- a/nomad/job_endpoint_oss.go
+++ b/nomad/job_endpoint_oss.go
@@ -8,7 +8,7 @@ import (
)
// enforceSubmitJob is used to check any Sentinel policies for the submit-job scope
-func (j *Job) enforceSubmitJob(override bool, job *structs.Job) (error, error) {
+func (j *Job) enforceSubmitJob(override bool, job *structs.Job, nomadACLToken *structs.ACLToken, ns *structs.Namespace) (error, error) {
return nil, nil
}
diff --git a/nomad/job_endpoint_oss_test.go b/nomad/job_endpoint_oss_test.go
index 304422d8155..446abe5d191 100644
--- a/nomad/job_endpoint_oss_test.go
+++ b/nomad/job_endpoint_oss_test.go
@@ -10,7 +10,7 @@ import (
msgpackrpc "github.com/hashicorp/net-rpc-msgpackrpc"
"github.com/hashicorp/nomad/ci"
"github.com/hashicorp/nomad/command/agent/consul"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
@@ -26,7 +26,7 @@ func TestJobEndpoint_Register_Connect_AllowUnauthenticatedFalse_oss(t *testing.T
s1, cleanupS1 := TestServer(t, func(c *Config) {
c.NumSchedulers = 0 // Prevent automatic dequeue
- c.ConsulConfig.AllowUnauthenticated = helper.BoolToPtr(false)
+ c.ConsulConfig.AllowUnauthenticated = pointer.Of(false)
})
defer cleanupS1()
codec := rpcClient(t, s1)
diff --git a/nomad/job_endpoint_test.go b/nomad/job_endpoint_test.go
index 76113aef094..684c17a3bb6 100644
--- a/nomad/job_endpoint_test.go
+++ b/nomad/job_endpoint_test.go
@@ -12,7 +12,7 @@ import (
msgpackrpc "github.com/hashicorp/net-rpc-msgpackrpc"
"github.com/hashicorp/nomad/acl"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
@@ -361,7 +361,7 @@ func TestJobEndpoint_Register_ConnectIngressGateway_full(t *testing.T) {
job.TaskGroups[0].Services[0].Connect = &structs.ConsulConnect{
Gateway: &structs.ConsulGateway{
Proxy: &structs.ConsulGatewayProxy{
- ConnectTimeout: helper.TimeToPtr(1 * time.Second),
+ ConnectTimeout: pointer.Of(1 * time.Second),
EnvoyGatewayBindTaggedAddresses: true,
EnvoyGatewayBindAddresses: map[string]*structs.ConsulGatewayBindAddress{
"service1": {
@@ -2393,7 +2393,7 @@ func TestJobEndpoint_Revert(t *testing.T) {
revertReq := &structs.JobRevertRequest{
JobID: job.ID,
JobVersion: 0,
- EnforcePriorVersion: helper.Uint64ToPtr(10),
+ EnforcePriorVersion: pointer.Of(uint64(10)),
WriteRequest: structs.WriteRequest{
Region: "global",
Namespace: job.Namespace,
@@ -2426,7 +2426,7 @@ func TestJobEndpoint_Revert(t *testing.T) {
revertReq = &structs.JobRevertRequest{
JobID: job.ID,
JobVersion: 0,
- EnforcePriorVersion: helper.Uint64ToPtr(1),
+ EnforcePriorVersion: pointer.Of(uint64(1)),
WriteRequest: structs.WriteRequest{
Region: "global",
Namespace: job.Namespace,
@@ -2594,7 +2594,7 @@ func TestJobEndpoint_Revert_Vault_NoToken(t *testing.T) {
revertReq = &structs.JobRevertRequest{
JobID: job.ID,
JobVersion: 0,
- EnforcePriorVersion: helper.Uint64ToPtr(1),
+ EnforcePriorVersion: pointer.Of(uint64(1)),
WriteRequest: structs.WriteRequest{
Region: "global",
Namespace: job.Namespace,
@@ -4959,7 +4959,6 @@ func TestJobEndpoint_ListJobs(t *testing.T) {
// TestJobEndpoint_ListJobs_AllNamespaces_OSS asserts that server
// returns all jobs across namespace.
-//
func TestJobEndpoint_ListJobs_AllNamespaces_OSS(t *testing.T) {
ci.Parallel(t)
@@ -7104,7 +7103,7 @@ func TestJobEndpoint_Scale(t *testing.T) {
Target: map[string]string{
structs.ScalingTargetGroup: groupName,
},
- Count: helper.Int64ToPtr(int64(originalCount + 1)),
+ Count: pointer.Of(int64(originalCount + 1)),
Message: "because of the load",
Meta: map[string]interface{}{
"metrics": map[string]string{
@@ -7189,7 +7188,7 @@ func TestJobEndpoint_Scale_DeploymentBlocking(t *testing.T) {
},
Meta: scalingMetadata,
Message: scalingMessage,
- Count: helper.Int64ToPtr(newCount),
+ Count: pointer.Of(newCount),
WriteRequest: structs.WriteRequest{
Region: "global",
Namespace: job.Namespace,
@@ -7481,7 +7480,7 @@ func TestJobEndpoint_Scale_Invalid(t *testing.T) {
Target: map[string]string{
structs.ScalingTargetGroup: job.TaskGroups[0].Name,
},
- Count: helper.Int64ToPtr(int64(count) + 1),
+ Count: pointer.Of(int64(count) + 1),
Message: "this should fail",
Meta: map[string]interface{}{
"metrics": map[string]string{
@@ -7505,7 +7504,7 @@ func TestJobEndpoint_Scale_Invalid(t *testing.T) {
err = state.UpsertJob(structs.MsgTypeTestSetup, 1000, job)
require.Nil(err)
- scale.Count = helper.Int64ToPtr(10)
+ scale.Count = pointer.Of(int64(10))
scale.Message = "error message"
scale.Error = true
err = msgpackrpc.CallWithCodec(codec, "Job.Scale", scale, &resp)
@@ -7538,7 +7537,7 @@ func TestJobEndpoint_Scale_OutOfBounds(t *testing.T) {
Target: map[string]string{
structs.ScalingTargetGroup: job.TaskGroups[0].Name,
},
- Count: helper.Int64ToPtr(pol.Max + 1),
+ Count: pointer.Of(pol.Max + 1),
Message: "out of bounds",
PolicyOverride: false,
WriteRequest: structs.WriteRequest{
@@ -7550,7 +7549,7 @@ func TestJobEndpoint_Scale_OutOfBounds(t *testing.T) {
require.Error(err)
require.Contains(err.Error(), "group count was greater than scaling policy maximum: 11 > 10")
- scale.Count = helper.Int64ToPtr(2)
+ scale.Count = pointer.Of(int64(2))
err = msgpackrpc.CallWithCodec(codec, "Job.Scale", scale, &resp)
require.Error(err)
require.Contains(err.Error(), "group count was less than scaling policy minimum: 2 < 3")
@@ -7644,7 +7643,7 @@ func TestJobEndpoint_Scale_Priority(t *testing.T) {
Target: map[string]string{
structs.ScalingTargetGroup: groupName,
},
- Count: helper.Int64ToPtr(int64(originalCount + 1)),
+ Count: pointer.Of(int64(originalCount + 1)),
Message: "scotty, we need more power",
PolicyOverride: false,
WriteRequest: structs.WriteRequest{
@@ -7690,7 +7689,7 @@ func TestJobEndpoint_InvalidCount(t *testing.T) {
Target: map[string]string{
structs.ScalingTargetGroup: job.TaskGroups[0].Name,
},
- Count: helper.Int64ToPtr(int64(-1)),
+ Count: pointer.Of(int64(-1)),
WriteRequest: structs.WriteRequest{
Region: "global",
Namespace: job.Namespace,
@@ -7744,7 +7743,7 @@ func TestJobEndpoint_GetScaleStatus(t *testing.T) {
a1.ClientStatus = structs.AllocClientStatusRunning
// healthy
a1.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
}
a2 := mock.Alloc()
a2.Job = jobV2
@@ -7753,7 +7752,7 @@ func TestJobEndpoint_GetScaleStatus(t *testing.T) {
a2.ClientStatus = structs.AllocClientStatusPending
// unhealthy
a2.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(false),
+ Healthy: pointer.Of(false),
}
a3 := mock.Alloc()
a3.Job = jobV2
@@ -7762,7 +7761,7 @@ func TestJobEndpoint_GetScaleStatus(t *testing.T) {
a3.ClientStatus = structs.AllocClientStatusRunning
// canary
a3.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
Canary: true,
}
// no health
@@ -7776,7 +7775,7 @@ func TestJobEndpoint_GetScaleStatus(t *testing.T) {
event := &structs.ScalingEvent{
Time: time.Now().Unix(),
- Count: helper.Int64ToPtr(5),
+ Count: pointer.Of(int64(5)),
Message: "message",
Error: false,
Meta: map[string]interface{}{
diff --git a/nomad/job_endpoint_validators_test.go b/nomad/job_endpoint_validators_test.go
index de8acaa904b..4d115905615 100644
--- a/nomad/job_endpoint_validators_test.go
+++ b/nomad/job_endpoint_validators_test.go
@@ -105,6 +105,7 @@ func TestJobNamespaceConstraintCheckHook_validate(t *testing.T) {
job.TaskGroups[0].Tasks[0].Driver = "docker"
job.TaskGroups[0].Tasks[1].Driver = "qemu"
job.TaskGroups[0].Tasks[2].Driver = "docker"
+ job.TaskGroups[0].Tasks[3].Driver = "qemu"
_, err := hook.Validate(job)
require.Nil(t, err)
diff --git a/nomad/mock/mock.go b/nomad/mock/mock.go
index b4afc5de26c..f364a7e562a 100644
--- a/nomad/mock/mock.go
+++ b/nomad/mock/mock.go
@@ -8,8 +8,8 @@ import (
"time"
fake "github.com/brianvoe/gofakeit/v6"
- "github.com/hashicorp/nomad/helper"
"github.com/hashicorp/nomad/helper/envoy"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/structs"
psstructs "github.com/hashicorp/nomad/plugins/shared/structs"
@@ -592,6 +592,22 @@ func LifecycleJob() *structs.Job {
MemoryMB: 256,
},
},
+ {
+ Name: "poststart",
+ Driver: "mock_driver",
+ Config: map[string]interface{}{
+ "run_for": "1s",
+ },
+ Lifecycle: &structs.TaskLifecycleConfig{
+ Hook: structs.TaskLifecycleHookPoststart,
+ Sidecar: false,
+ },
+ LogConfig: structs.DefaultLogConfig(),
+ Resources: &structs.Resources{
+ CPU: 1000,
+ MemoryMB: 256,
+ },
+ },
},
},
},
@@ -634,6 +650,10 @@ func LifecycleAlloc() *structs.Allocation {
CPU: 1000,
MemoryMB: 256,
},
+ "poststart": {
+ CPU: 1000,
+ MemoryMB: 256,
+ },
},
AllocatedResources: &structs.AllocatedResources{
@@ -662,6 +682,14 @@ func LifecycleAlloc() *structs.Allocation {
MemoryMB: 256,
},
},
+ "poststart": {
+ Cpu: structs.AllocatedCpuResources{
+ CpuShares: 1000,
+ },
+ Memory: structs.AllocatedMemoryResources{
+ MemoryMB: 256,
+ },
+ },
},
},
Job: LifecycleJob(),
@@ -672,6 +700,50 @@ func LifecycleAlloc() *structs.Allocation {
return alloc
}
+type LifecycleTaskDef struct {
+ Name string
+ RunFor string
+ ExitCode int
+ Hook string
+ IsSidecar bool
+}
+
+// LifecycleAllocFromTasks generates an Allocation with mock tasks that have
+// the provided lifecycles.
+func LifecycleAllocFromTasks(tasks []LifecycleTaskDef) *structs.Allocation {
+ alloc := LifecycleAlloc()
+ alloc.Job.TaskGroups[0].Tasks = []*structs.Task{}
+ for _, task := range tasks {
+ var lc *structs.TaskLifecycleConfig
+ if task.Hook != "" {
+ // TODO: task coordinator doesn't treat nil and empty structs the same
+ lc = &structs.TaskLifecycleConfig{
+ Hook: task.Hook,
+ Sidecar: task.IsSidecar,
+ }
+ }
+
+ alloc.Job.TaskGroups[0].Tasks = append(alloc.Job.TaskGroups[0].Tasks,
+ &structs.Task{
+ Name: task.Name,
+ Driver: "mock_driver",
+ Config: map[string]interface{}{
+ "run_for": task.RunFor,
+ "exit_code": task.ExitCode},
+ Lifecycle: lc,
+ LogConfig: structs.DefaultLogConfig(),
+ Resources: &structs.Resources{CPU: 100, MemoryMB: 256},
+ },
+ )
+ alloc.TaskResources[task.Name] = &structs.Resources{CPU: 100, MemoryMB: 256}
+ alloc.AllocatedResources.Tasks[task.Name] = &structs.AllocatedTaskResources{
+ Cpu: structs.AllocatedCpuResources{CpuShares: 100},
+ Memory: structs.AllocatedMemoryResources{MemoryMB: 256},
+ }
+ }
+ return alloc
+}
+
func LifecycleJobWithPoststopDeploy() *structs.Job {
job := &structs.Job{
Region: "global",
@@ -1198,7 +1270,7 @@ func ConnectIngressGatewayJob(mode string, inject bool) *structs.Job {
Connect: &structs.ConsulConnect{
Gateway: &structs.ConsulGateway{
Proxy: &structs.ConsulGatewayProxy{
- ConnectTimeout: helper.TimeToPtr(3 * time.Second),
+ ConnectTimeout: pointer.Of(3 * time.Second),
EnvoyGatewayBindAddresses: make(map[string]*structs.ConsulGatewayBindAddress),
},
Ingress: &structs.ConsulIngressConfigEntry{
@@ -1249,7 +1321,7 @@ func ConnectTerminatingGatewayJob(mode string, inject bool) *structs.Job {
Connect: &structs.ConsulConnect{
Gateway: &structs.ConsulGateway{
Proxy: &structs.ConsulGatewayProxy{
- ConnectTimeout: helper.TimeToPtr(3 * time.Second),
+ ConnectTimeout: pointer.Of(3 * time.Second),
EnvoyGatewayBindAddresses: make(map[string]*structs.ConsulGatewayBindAddress),
},
Terminating: &structs.ConsulTerminatingConfigEntry{
@@ -1300,7 +1372,7 @@ func ConnectMeshGatewayJob(mode string, inject bool) *structs.Job {
Connect: &structs.ConsulConnect{
Gateway: &structs.ConsulGateway{
Proxy: &structs.ConsulGatewayProxy{
- ConnectTimeout: helper.TimeToPtr(3 * time.Second),
+ ConnectTimeout: pointer.Of(3 * time.Second),
EnvoyGatewayBindAddresses: make(map[string]*structs.ConsulGatewayBindAddress),
},
Mesh: &structs.ConsulMeshConfigEntry{
diff --git a/nomad/node_endpoint_test.go b/nomad/node_endpoint_test.go
index d4f24153a69..899f51470cb 100644
--- a/nomad/node_endpoint_test.go
+++ b/nomad/node_endpoint_test.go
@@ -15,6 +15,7 @@ import (
"github.com/hashicorp/nomad/ci"
"github.com/hashicorp/nomad/command/agent/consul"
"github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/state"
@@ -3637,7 +3638,7 @@ func TestClientEndpoint_DeriveSIToken(t *testing.T) {
testutil.WaitForLeader(t, s1.RPC)
// Set allow unauthenticated (no operator token required)
- s1.config.ConsulConfig.AllowUnauthenticated = helper.BoolToPtr(true)
+ s1.config.ConsulConfig.AllowUnauthenticated = pointer.Of(true)
// Create the node
node := mock.Node()
@@ -3689,7 +3690,7 @@ func TestClientEndpoint_DeriveSIToken_ConsulError(t *testing.T) {
testutil.WaitForLeader(t, s1.RPC)
// Set allow unauthenticated (no operator token required)
- s1.config.ConsulConfig.AllowUnauthenticated = helper.BoolToPtr(true)
+ s1.config.ConsulConfig.AllowUnauthenticated = pointer.Of(true)
// Create the node
node := mock.Node()
diff --git a/nomad/plan_apply.go b/nomad/plan_apply.go
index eebc713d3cf..68d890f8cf7 100644
--- a/nomad/plan_apply.go
+++ b/nomad/plan_apply.go
@@ -92,7 +92,6 @@ func newPlanner(s *Server) (*planner, error) {
// in anticipation of this case we cannot respond to the plan until
// the Raft log is updated. This means our schedulers will stall,
// but there are many of those and only a single plan verifier.
-//
func (p *planner) planApply() {
// planIndexCh is used to track an outstanding application and receive
// its committed index while snap holds an optimistic state which
diff --git a/nomad/scaling_endpoint.go b/nomad/scaling_endpoint.go
index dd8c5fe1199..a93ddd5a146 100644
--- a/nomad/scaling_endpoint.go
+++ b/nomad/scaling_endpoint.go
@@ -130,7 +130,7 @@ func (p *Scaling) GetPolicy(args *structs.ScalingPolicySpecificRequest,
if err != nil {
return err
}
- reply.Index = helper.Uint64Max(1, index)
+ reply.Index = helper.Max(1, index)
}
return nil
}}
@@ -194,7 +194,7 @@ func (p *Scaling) listAllNamespaces(args *structs.ScalingPolicyListRequest, repl
if err != nil {
return err
}
- reply.Index = helper.Uint64Max(1, index)
+ reply.Index = helper.Max(1, index)
// Set the query response
p.srv.setQueryMeta(&reply.QueryMeta)
diff --git a/nomad/search_endpoint.go b/nomad/search_endpoint.go
index 67cd9b0c76f..86b4b861e18 100644
--- a/nomad/search_endpoint.go
+++ b/nomad/search_endpoint.go
@@ -186,8 +186,9 @@ func (s *Search) getFuzzyMatches(iter memdb.ResultIterator, text string) (map[st
}
// fuzzyIndex returns the index of text in name, ignoring case.
-// text is assumed to be lower case.
-// -1 is returned if name does not contain text.
+//
+// text is assumed to be lower case.
+// -1 is returned if name does not contain text.
func fuzzyIndex(name, text string) int {
lower := strings.ToLower(name)
return strings.Index(lower, text)
@@ -238,12 +239,12 @@ func (s *Search) fuzzyMatchSingle(raw interface{}, text string) (structs.Context
// of matchable Context. Results are categorized by Context and paired with their
// score, but are unsorted.
//
-// job.name
-// job|group.name
-// job|group|service.name
-// job|group|task.name
-// job|group|task|service.name
-// job|group|task|driver.{image,command,class}
+// job.name
+// job|group.name
+// job|group|service.name
+// job|group|task.name
+// job|group|task|service.name
+// job|group|task|driver.{image,command,class}
func (*Search) fuzzyMatchesJob(j *structs.Job, text string) map[structs.Context][]fuzzyMatch {
sm := make(map[structs.Context][]fuzzyMatch)
ns := j.Namespace
@@ -654,17 +655,20 @@ func sufficientSearchPerms(aclObj *acl.ACL, namespace string, context structs.Co
// results are limited to policies of the provided ACL token.
//
// These types are limited to prefix UUID searching:
-// Evals, Deployments, ScalingPolicies, Volumes
+//
+// Evals, Deployments, ScalingPolicies, Volumes
//
// These types are available for fuzzy searching:
-// Nodes, Namespaces, Jobs, Allocs, Plugins
+//
+// Nodes, Namespaces, Jobs, Allocs, Plugins
//
// Jobs are a special case that expand into multiple types, and whose return
// values include Scope which is a descending list of IDs of parent objects,
// starting with the Namespace. The subtypes of jobs are fuzzy searchable.
//
// The Jobs type expands into these sub types:
-// Jobs, Groups, Services, Tasks, Images, Commands, Classes
+//
+// Jobs, Groups, Services, Tasks, Images, Commands, Classes
//
// The results are in descending order starting with strongest match, per Context type.
func (s *Search) FuzzySearch(args *structs.FuzzySearchRequest, reply *structs.FuzzySearchResponse) error {
diff --git a/nomad/secure_variables_endpoint.go b/nomad/secure_variables_endpoint.go
index 9db43bf15a7..c1b15446bce 100644
--- a/nomad/secure_variables_endpoint.go
+++ b/nomad/secure_variables_endpoint.go
@@ -2,7 +2,6 @@ package nomad
import (
"encoding/json"
- "errors"
"fmt"
"net/http"
"strings"
@@ -11,7 +10,7 @@ import (
metrics "github.com/armon/go-metrics"
"github.com/hashicorp/go-hclog"
memdb "github.com/hashicorp/go-memdb"
- multierror "github.com/hashicorp/go-multierror"
+
"github.com/hashicorp/nomad/acl"
"github.com/hashicorp/nomad/helper"
"github.com/hashicorp/nomad/nomad/state"
@@ -28,157 +27,180 @@ type SecureVariables struct {
encrypter *Encrypter
}
-// Upsert creates or updates secure variables held within Nomad. Due to ACL
-// checking, every element in Data will be checked for namespace and targeted
-// to the namespace in the SecureVariable. Therefore, the caller must ensure
-// that the provided struct's Namespace is the desired destination. Unset
-// Namespace values will default to `args.RequestNamespace`
-func (sv *SecureVariables) Upsert(
- args *structs.SecureVariablesUpsertRequest,
- reply *structs.SecureVariablesUpsertResponse) error {
-
- if done, err := sv.srv.forward(structs.SecureVariablesUpsertRPCMethod, args, args, reply); done {
+// Apply is used to apply a SV update request to the data store.
+func (sv *SecureVariables) Apply(args *structs.SecureVariablesApplyRequest, reply *structs.SecureVariablesApplyResponse) error {
+ if done, err := sv.srv.forward(structs.SecureVariablesApplyRPCMethod, args, args, reply); done {
return err
}
- defer metrics.MeasureSince([]string{"nomad", "secure_variables", "upsert"}, time.Now())
+ defer metrics.MeasureSince([]string{
+ "nomad", "secure_variables", "apply", string(args.Op)}, time.Now())
- // Use a multierror, so we can capture all validation errors and pass this
- // back so they can be addressed by the caller in a single pass.
- var mErr multierror.Error
- uArgs := structs.SecureVariablesEncryptedUpsertRequest{
- Data: make([]*structs.SecureVariableEncrypted, len(args.Data)),
- WriteRequest: args.WriteRequest,
+ // Check if the Namespace is explicitly set on the secure variable. If
+ // not, use the RequestNamespace
+ if args.Var == nil {
+ return fmt.Errorf("variable must not be nil")
+ }
+ targetNS := args.Var.Namespace
+ if targetNS == "" {
+ targetNS = args.RequestNamespace()
+ args.Var.Namespace = targetNS
}
- // Iterate the secure variables and validate them. Any error results in the
- // call failing.
- for i, v := range args.Data {
+ canRead, err := svePreApply(sv, args, args.Var)
+ if err != nil {
+ return err
+ }
- // Check if the Namespace is explicitly set on the secure variable. If
- // not, use the RequestNamespace
- targetNS := v.Namespace
- if targetNS == "" {
- targetNS = args.RequestNamespace()
- v.Namespace = targetNS
- }
+ var ev *structs.SecureVariableEncrypted
- // Perform the ACL token resolution.
- if aclObj, err := sv.srv.ResolveToken(args.AuthToken); err != nil {
- return err
- } else if aclObj != nil {
- for _, variable := range args.Data {
- if !aclObj.AllowSecureVariableOperation(targetNS,
- variable.Path, acl.PolicyWrite) {
- return structs.ErrPermissionDenied
- }
- }
- }
-
- v.Canonicalize()
- if err := v.Validate(); err != nil {
- mErr.Errors = append(mErr.Errors, err)
- continue
- }
- if args.CheckIndex != nil {
- var conflict *structs.SecureVariableDecrypted
- if err := sv.validateCASUpdate(*args.CheckIndex, v, &conflict); err != nil {
- if reply.Conflicts == nil {
- reply.Conflicts = make([]*structs.SecureVariableDecrypted, len(args.Data))
- }
- reply.Conflicts[i] = conflict
- continue
- }
- }
- ev, err := sv.encrypt(v)
+ switch args.Op {
+ case structs.SVOpSet, structs.SVOpCAS:
+ ev, err = sv.encrypt(args.Var)
if err != nil {
- mErr.Errors = append(mErr.Errors, err)
- continue
+ return fmt.Errorf("secure variable error: encrypt: %w", err)
+ }
+ now := time.Now().UnixNano()
+ ev.CreateTime = now // existing will override if it exists
+ ev.ModifyTime = now
+ case structs.SVOpDelete, structs.SVOpDeleteCAS:
+ ev = &structs.SecureVariableEncrypted{
+ SecureVariableMetadata: structs.SecureVariableMetadata{
+ Namespace: args.Var.Namespace,
+ Path: args.Var.Path,
+ ModifyIndex: args.Var.ModifyIndex,
+ },
}
- uArgs.Data[i] = ev
- }
- if len(reply.Conflicts) != 0 {
- // This is a reply with CAS conflicts so it needs to return here
- // "successfully". The caller needs to check to see if Conflicts
- // is non-Nil.
- return nil
- }
- if err := mErr.ErrorOrNil(); err != nil {
- return &mErr
}
- // TODO: This should be done on each Data in uArgs.
- if err := sv.enforceQuota(uArgs); err != nil {
- return err
+ // Make a SVEArgs
+ sveArgs := structs.SVApplyStateRequest{
+ Op: args.Op,
+ Var: ev,
+ WriteRequest: args.WriteRequest,
}
- // Update via Raft.
- out, index, err := sv.srv.raftApply(structs.SecureVariableUpsertRequestType, uArgs)
+ // Apply the update.
+ out, index, err := sv.srv.raftApply(structs.SVApplyStateRequestType, sveArgs)
if err != nil {
- return err
+ return fmt.Errorf("raft apply failed: %w", err)
}
-
- // Check if the FSM response, which is an interface, contains an error.
- if err, ok := out.(error); ok && err != nil {
+ r, err := sv.makeSecureVariablesApplyResponse(args, out.(*structs.SVApplyStateResponse), canRead)
+ if err != nil {
return err
}
-
- // Update the index. There is no need to floor this as we are writing to
- // state and therefore will get a non-zero index response.
+ *reply = *r
reply.Index = index
return nil
}
-// Delete removes a single secure variable, as specified by its namespace and
-// path from Nomad.
-func (sv *SecureVariables) Delete(
- args *structs.SecureVariablesDeleteRequest,
- reply *structs.SecureVariablesDeleteResponse) error {
+func svePreApply(sv *SecureVariables, args *structs.SecureVariablesApplyRequest, vd *structs.SecureVariableDecrypted) (canRead bool, err error) {
- if done, err := sv.srv.forward(structs.SecureVariablesDeleteRPCMethod, args, args, reply); done {
- return err
- }
- defer metrics.MeasureSince([]string{"nomad", "secure_variables", "delete"}, time.Now())
+ canRead = false
+ var aclObj *acl.ACL
// Perform the ACL token resolution.
- if aclObj, err := sv.srv.ResolveToken(args.AuthToken); err != nil {
- return err
+ if aclObj, err = sv.srv.ResolveToken(args.AuthToken); err != nil {
+ return
} else if aclObj != nil {
- if !aclObj.AllowSecureVariableOperation(args.RequestNamespace(), args.Path, acl.PolicyWrite) {
- return structs.ErrPermissionDenied
+ hasPerm := func(perm string) bool {
+ return aclObj.AllowSecureVariableOperation(args.Var.Namespace,
+ args.Var.Path, perm)
}
+ canRead = hasPerm(acl.SecureVariablesCapabilityRead)
+
+ switch args.Op {
+ case structs.SVOpSet, structs.SVOpCAS:
+ if !hasPerm(acl.SecureVariablesCapabilityWrite) {
+ err = structs.ErrPermissionDenied
+ return
+ }
+ case structs.SVOpDelete, structs.SVOpDeleteCAS:
+ if !hasPerm(acl.SecureVariablesCapabilityDestroy) {
+ err = structs.ErrPermissionDenied
+ return
+ }
+ default:
+ err = fmt.Errorf("svPreApply: unexpected SVOp received: %q", args.Op)
+ return
+ }
+ } else {
+ // ACLs are not enabled.
+ canRead = true
}
- if args.CheckIndex != nil {
- if err := sv.validateCASDelete(*args.CheckIndex, args.Namespace, args.Path, &reply.Conflict); err != nil {
+ switch args.Op {
+ case structs.SVOpSet, structs.SVOpCAS:
+ args.Var.Canonicalize()
+ if err = args.Var.Validate(); err != nil {
+ return
+ }
- // If the validateCASDelete func sends back the conflict sentinel
- // error value then it will have put the conflict into the reply,
- // and we need to "succeed".
- if err.Error() == "conflict" {
- reply.Index = reply.Conflict.ModifyIndex
- return nil
- }
+ case structs.SVOpDelete, structs.SVOpDeleteCAS:
+ if args.Var == nil || args.Var.Path == "" {
+ err = fmt.Errorf("delete requires a Path")
+ return
+ }
+ }
+
+ return
+}
- // There are a few cases where validateCASDelete can error that
- // aren't conflicts.
- return err
+// MakeSecureVariablesApplyResponse merges the output of this SVApplyStateResponse with the
+// SecureVariableDataItems
+func (sv *SecureVariables) makeSecureVariablesApplyResponse(
+ req *structs.SecureVariablesApplyRequest, eResp *structs.SVApplyStateResponse,
+ canRead bool) (*structs.SecureVariablesApplyResponse, error) {
+
+ out := structs.SecureVariablesApplyResponse{
+ Op: eResp.Op,
+ Input: req.Var,
+ Result: eResp.Result,
+ Error: eResp.Error,
+ WriteMeta: eResp.WriteMeta,
+ }
+
+ if eResp.IsOk() {
+ if eResp.WrittenSVMeta != nil {
+ // The writer is allowed to read their own write
+ out.Output = &structs.SecureVariableDecrypted{
+ SecureVariableMetadata: *eResp.WrittenSVMeta,
+ Items: req.Var.Items.Copy(),
+ }
}
+ return &out, nil
}
- // Update via Raft.
- out, index, err := sv.srv.raftApply(structs.SecureVariableDeleteRequestType, args)
- if err != nil {
- return err
+
+ // At this point, the response is necessarily a conflict.
+ // Prime output from the encrypted responses metadata
+ out.Conflict = &structs.SecureVariableDecrypted{
+ SecureVariableMetadata: eResp.Conflict.SecureVariableMetadata,
+ Items: nil,
}
- // Check if the FSM response, which is an interface, contains an error.
- if err, ok := out.(error); ok && err != nil {
- return err
+ // If the caller can't read the conflicting value, return the
+ // metadata, but no items and flag it as redacted
+ if !canRead {
+ out.Result = structs.SVOpResultRedacted
+ return &out, nil
}
- // Update the index. There is no need to floor this as we are writing to
- // state and therefore will get a non-zero index response.
- reply.Index = index
- return nil
+ if eResp.Conflict == nil || eResp.Conflict.KeyID == "" {
+ // zero-value conflicts can be returned for delete-if-set
+ dv := &structs.SecureVariableDecrypted{}
+ dv.Namespace = eResp.Conflict.Namespace
+ dv.Path = eResp.Conflict.Path
+ out.Conflict = dv
+ } else {
+ // At this point, the caller has read access to the conflicting
+ // value so we can return it in the output; decrypt it.
+ dv, err := sv.decrypt(eResp.Conflict)
+ if err != nil {
+ return nil, err
+ }
+ out.Conflict = dv
+ }
+
+ return &out, nil
}
// Read is used to get a specific secure variable
@@ -188,8 +210,7 @@ func (sv *SecureVariables) Read(args *structs.SecureVariablesReadRequest, reply
}
defer metrics.MeasureSince([]string{"nomad", "secure_variables", "read"}, time.Now())
- // FIXME: Temporary ACL Test policy. Update once implementation complete
- err := sv.handleMixedAuthEndpoint(args.QueryOptions,
+ _, err := sv.handleMixedAuthEndpoint(args.QueryOptions,
acl.PolicyRead, args.Path)
if err != nil {
return err
@@ -240,8 +261,7 @@ func (sv *SecureVariables) List(
return sv.listAllSecureVariables(args, reply)
}
- // FIXME: Temporary ACL Test policy. Update once implementation complete
- err := sv.handleMixedAuthEndpoint(args.QueryOptions,
+ aclObj, err := sv.handleMixedAuthEndpoint(args.QueryOptions,
acl.PolicyList, args.Prefix)
if err != nil {
return err
@@ -271,13 +291,23 @@ func (sv *SecureVariables) List(
},
)
+ filters := []paginator.Filter{
+ paginator.GenericFilter{
+ Allow: func(raw interface{}) (bool, error) {
+ sv := raw.(*structs.SecureVariableEncrypted)
+ return strings.HasPrefix(sv.Path, args.Prefix) &&
+ (aclObj == nil || aclObj.AllowSecureVariableOperation(sv.Namespace, sv.Path, acl.PolicyList)), nil
+ },
+ },
+ }
+
// Set up our output after we have checked the error.
var svs []*structs.SecureVariableMetadata
// Build the paginator. This includes the function that is
// responsible for appending a variable to the secure variables
// stubs slice.
- paginatorImpl, err := paginator.NewPaginator(iter, tokenizer, nil, args.QueryOptions,
+ paginatorImpl, err := paginator.NewPaginator(iter, tokenizer, filters, args.QueryOptions,
func(raw interface{}) error {
sv := raw.(*structs.SecureVariableEncrypted)
svStub := sv.SecureVariableMetadata
@@ -336,7 +366,7 @@ func (s *SecureVariables) listAllSecureVariables(
// Identify which namespaces the caller has access to. If they do
// not have access to any, send them an empty response. Otherwise,
// handle any error in a traditional manner.
- allowedNSes, err := allowedNSes(aclObj, stateStore, allowFunc)
+ _, err := allowedNSes(aclObj, stateStore, allowFunc)
switch err {
case structs.ErrPermissionDenied:
reply.Data = make([]*structs.SecureVariableMetadata, 0)
@@ -364,24 +394,19 @@ func (s *SecureVariables) listAllSecureVariables(
},
)
- // Wrap the SecureVariables iterator with a FilterIterator to
- // eliminate invalid values before sending them to the paginator.
- fltrIter := memdb.NewFilterIterator(iter, func(raw interface{}) bool {
-
- // Values are filtered when the func returns true.
- sv := raw.(*structs.SecureVariableEncrypted)
- if allowedNSes != nil && !allowedNSes[sv.Namespace] {
- return true
- }
- if !strings.HasPrefix(sv.Path, args.Prefix) {
- return true
- }
- return false
- })
+ filters := []paginator.Filter{
+ paginator.GenericFilter{
+ Allow: func(raw interface{}) (bool, error) {
+ sv := raw.(*structs.SecureVariableEncrypted)
+ return strings.HasPrefix(sv.Path, args.Prefix) &&
+ (aclObj == nil || aclObj.AllowSecureVariableOperation(sv.Namespace, sv.Path, acl.PolicyList)), nil
+ },
+ },
+ }
// Build the paginator. This includes the function that is
// responsible for appending a variable to the stubs array.
- paginatorImpl, err := paginator.NewPaginator(fltrIter, tokenizer, nil, args.QueryOptions,
+ paginatorImpl, err := paginator.NewPaginator(iter, tokenizer, filters, args.QueryOptions,
func(raw interface{}) error {
sv := raw.(*structs.SecureVariableEncrypted)
svStub := sv.SecureVariableMetadata
@@ -445,7 +470,7 @@ func (sv *SecureVariables) decrypt(v *structs.SecureVariableEncrypted) (*structs
// handleMixedAuthEndpoint is a helper to handle auth on RPC endpoints that can
// either be called by external clients or by workload identity
-func (sv *SecureVariables) handleMixedAuthEndpoint(args structs.QueryOptions, cap, pathOrPrefix string) error {
+func (sv *SecureVariables) handleMixedAuthEndpoint(args structs.QueryOptions, cap, pathOrPrefix string) (*acl.ACL, error) {
// Perform the initial token resolution.
aclObj, err := sv.srv.ResolveToken(args.AuthToken)
@@ -454,15 +479,15 @@ func (sv *SecureVariables) handleMixedAuthEndpoint(args structs.QueryOptions, ca
// are not enabled, otherwise trigger the allowed namespace function.
if aclObj != nil {
if !aclObj.AllowSecureVariableOperation(args.RequestNamespace(), pathOrPrefix, cap) {
- return structs.ErrPermissionDenied
+ return nil, structs.ErrPermissionDenied
}
}
- return nil
+ return aclObj, nil
}
if helper.IsUUID(args.AuthToken) {
// early return for ErrNotFound or other errors if it's formed
// like an ACLToken.SecretID
- return err
+ return nil, err
}
// Attempt to verify the token as a JWT with a workload
@@ -472,27 +497,27 @@ func (sv *SecureVariables) handleMixedAuthEndpoint(args structs.QueryOptions, ca
metrics.IncrCounter([]string{
"nomad", "secure_variables", "invalid_allocation_identity"}, 1)
sv.logger.Trace("allocation identity was not valid", "error", err)
- return structs.ErrPermissionDenied
+ return nil, structs.ErrPermissionDenied
}
// The workload identity gets access to paths that match its
// identity, without having to go thru the ACL system
err = sv.authValidatePrefix(claims, args.RequestNamespace(), pathOrPrefix)
if err == nil {
- return nil
+ return aclObj, nil
}
// If the workload identity doesn't match the implicit permissions
// given to paths, check for its attached ACL policies
aclObj, err = sv.srv.ResolveClaims(claims)
if err != nil {
- return err // this only returns an error when the state store has gone wrong
+ return nil, err // this only returns an error when the state store has gone wrong
}
if aclObj != nil && aclObj.AllowSecureVariableOperation(
args.RequestNamespace(), pathOrPrefix, cap) {
- return nil
+ return aclObj, nil
}
- return structs.ErrPermissionDenied
+ return nil, structs.ErrPermissionDenied
}
// authValidatePrefix asserts that the requested path is valid for
@@ -527,53 +552,3 @@ func (sv *SecureVariables) authValidatePrefix(claims *structs.IdentityClaims, ns
}
return nil
}
-
-func (s *SecureVariables) validateCASUpdate(cidx uint64, sv *structs.SecureVariableDecrypted, conflict **structs.SecureVariableDecrypted) error {
- return s.validateCAS(cidx, sv.Namespace, sv.Path, conflict)
-}
-
-func (s *SecureVariables) validateCASDelete(cidx uint64, namespace, path string, conflict **structs.SecureVariableDecrypted) error {
- return s.validateCAS(cidx, namespace, path, conflict)
-}
-
-func (s *SecureVariables) validateCAS(cidx uint64, namespace, path string, conflictOut **structs.SecureVariableDecrypted) error {
- casConflict := errors.New("conflict")
- // lookup any existing key and validate the update
- snap, err := s.srv.fsm.State().Snapshot()
- if err != nil {
- return err
- }
- ws := memdb.NewWatchSet()
- exist, err := snap.GetSecureVariable(ws, namespace, path)
- if err != nil {
- return fmt.Errorf("cas error: %w", err)
- }
- if exist == nil && cidx != 0 {
- // return a zero value with the namespace and path applied
- zeroVal := &structs.SecureVariableDecrypted{
- SecureVariableMetadata: structs.SecureVariableMetadata{
- Namespace: namespace,
- Path: path,
- CreateIndex: 0,
- CreateTime: 0,
- ModifyIndex: 0,
- ModifyTime: 0,
- },
- Items: nil,
- }
- *conflictOut = zeroVal
- return casConflict
- }
- if exist != nil && exist.ModifyIndex != cidx {
- dec, err := s.decrypt(exist)
- if err != nil {
- // we can't return the conflict and we will have to bail out
- decErrStr := fmt.Sprintf(". Additional error decrypting conflict: %s", err)
- return fmt.Errorf("cas error: requested index %v; found index %v%s", cidx, exist.ModifyIndex, decErrStr)
- }
- *conflictOut = dec
- return casConflict
- }
-
- return nil
-}
diff --git a/nomad/secure_variables_endpoint_oss.go b/nomad/secure_variables_endpoint_oss.go
deleted file mode 100644
index 46c88aeda61..00000000000
--- a/nomad/secure_variables_endpoint_oss.go
+++ /dev/null
@@ -1,10 +0,0 @@
-//go:build !ent
-// +build !ent
-
-package nomad
-
-import "github.com/hashicorp/nomad/nomad/structs"
-
-func (sv *SecureVariables) enforceQuota(uArgs structs.SecureVariablesEncryptedUpsertRequest) error {
- return nil
-}
diff --git a/nomad/secure_variables_endpoint_test.go b/nomad/secure_variables_endpoint_test.go
index 1ab34a4b083..a9779ee2cbe 100644
--- a/nomad/secure_variables_endpoint_test.go
+++ b/nomad/secure_variables_endpoint_test.go
@@ -1,17 +1,22 @@
package nomad
import (
+ "encoding/json"
"fmt"
"math/rand"
"strings"
"testing"
+ "time"
+
+ msgpackrpc "github.com/hashicorp/net-rpc-msgpackrpc"
+ "github.com/shoenig/test"
+ "github.com/shoenig/test/must"
"github.com/hashicorp/nomad/acl"
"github.com/hashicorp/nomad/ci"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
"github.com/hashicorp/nomad/testutil"
- "github.com/stretchr/testify/require"
)
func TestSecureVariablesEndpoint_auth(t *testing.T) {
@@ -46,25 +51,25 @@ func TestSecureVariablesEndpoint_auth(t *testing.T) {
alloc3.Job.ParentID = jobID
store := srv.fsm.State()
- require.NoError(t, store.UpsertNamespaces(1000, []*structs.Namespace{{Name: ns}}))
- require.NoError(t, store.UpsertAllocs(
+ must.NoError(t, store.UpsertNamespaces(1000, []*structs.Namespace{{Name: ns}}))
+ must.NoError(t, store.UpsertAllocs(
structs.MsgTypeTestSetup, 1001, []*structs.Allocation{alloc1, alloc2, alloc3}))
claims1 := alloc1.ToTaskIdentityClaims(nil, "web")
idToken, err := srv.encrypter.SignClaims(claims1)
- require.NoError(t, err)
+ must.NoError(t, err)
claims2 := alloc2.ToTaskIdentityClaims(nil, "web")
noPermissionsToken, err := srv.encrypter.SignClaims(claims2)
- require.NoError(t, err)
+ must.NoError(t, err)
claims3 := alloc3.ToTaskIdentityClaims(alloc3.Job, "web")
idDispatchToken, err := srv.encrypter.SignClaims(claims3)
- require.NoError(t, err)
+ must.NoError(t, err)
// corrupt the signature of the token
idTokenParts := strings.Split(idToken, ".")
- require.Len(t, idTokenParts, 3)
+ must.Len(t, 3, idTokenParts)
sig := []string(strings.Split(idTokenParts[2], ""))
rand.Shuffle(len(sig), func(i, j int) {
sig[i], sig[j] = sig[j], sig[i]
@@ -73,38 +78,42 @@ func TestSecureVariablesEndpoint_auth(t *testing.T) {
invalidIDToken := strings.Join(idTokenParts, ".")
policy := mock.ACLPolicy()
- policy.Name = fmt.Sprintf("_:%s/%s/%s", ns, jobID, alloc1.TaskGroup)
policy.Rules = `namespace "nondefault-namespace" {
secure_variables {
- path "nomad/jobs/*" { capabilities = ["read"] }
+ path "nomad/jobs/*" { capabilities = ["list"] }
path "other/path" { capabilities = ["read"] }
}}`
+ policy.JobACL = &structs.JobACL{
+ Namespace: ns,
+ JobID: jobID,
+ Group: alloc1.TaskGroup,
+ }
policy.SetHash()
err = store.UpsertACLPolicies(structs.MsgTypeTestSetup, 1100, []*structs.ACLPolicy{policy})
- require.NoError(t, err)
+ must.NoError(t, err)
aclToken := mock.ACLToken()
aclToken.Policies = []string{policy.Name}
err = store.UpsertACLTokens(structs.MsgTypeTestSetup, 1150, []*structs.ACLToken{aclToken})
- require.NoError(t, err)
+ must.NoError(t, err)
t.Run("terminal alloc should be denied", func(t *testing.T) {
- err = srv.staticEndpoints.SecureVariables.handleMixedAuthEndpoint(
+ _, err = srv.staticEndpoints.SecureVariables.handleMixedAuthEndpoint(
structs.QueryOptions{AuthToken: idToken, Namespace: ns}, "n/a",
fmt.Sprintf("nomad/jobs/%s/web/web", jobID))
- require.EqualError(t, err, structs.ErrPermissionDenied.Error())
+ must.EqError(t, err, structs.ErrPermissionDenied.Error())
})
// make alloc non-terminal
alloc1.ClientStatus = structs.AllocClientStatusRunning
- require.NoError(t, store.UpsertAllocs(
+ must.NoError(t, store.UpsertAllocs(
structs.MsgTypeTestSetup, 1200, []*structs.Allocation{alloc1}))
t.Run("wrong namespace should be denied", func(t *testing.T) {
- err = srv.staticEndpoints.SecureVariables.handleMixedAuthEndpoint(
+ _, err = srv.staticEndpoints.SecureVariables.handleMixedAuthEndpoint(
structs.QueryOptions{AuthToken: idToken, Namespace: structs.DefaultNamespace}, "n/a",
fmt.Sprintf("nomad/jobs/%s/web/web", jobID))
- require.EqualError(t, err, structs.ErrPermissionDenied.Error())
+ must.EqError(t, err, structs.ErrPermissionDenied.Error())
})
testCases := []struct {
@@ -150,26 +159,33 @@ func TestSecureVariablesEndpoint_auth(t *testing.T) {
expectedErr: nil,
},
{
- name: "valid claim for implied policy",
+ name: "valid claim for job-attached policy",
token: idToken,
cap: acl.PolicyRead,
path: "other/path",
expectedErr: nil,
},
{
- name: "valid claim for implied policy path denied",
+ name: "valid claim for job-attached policy path denied",
token: idToken,
cap: acl.PolicyRead,
path: "other/not-allowed",
expectedErr: structs.ErrPermissionDenied,
},
{
- name: "valid claim for implied policy capability denied",
+ name: "valid claim for job-attached policy capability denied",
token: idToken,
cap: acl.PolicyWrite,
path: "other/path",
expectedErr: structs.ErrPermissionDenied,
},
+ {
+ name: "valid claim for job-attached policy capability with cross-job access",
+ token: idToken,
+ cap: acl.PolicyList,
+ path: "nomad/jobs/some-other",
+ expectedErr: nil,
+ },
{
name: "valid claim with no permissions denied by path",
token: noPermissionsToken,
@@ -244,14 +260,449 @@ func TestSecureVariablesEndpoint_auth(t *testing.T) {
for _, tc := range testCases {
tc := tc
t.Run(tc.name, func(t *testing.T) {
- err := srv.staticEndpoints.SecureVariables.handleMixedAuthEndpoint(
+ _, err := srv.staticEndpoints.SecureVariables.handleMixedAuthEndpoint(
structs.QueryOptions{AuthToken: tc.token, Namespace: ns}, tc.cap, tc.path)
if tc.expectedErr == nil {
- require.NoError(t, err)
+ must.NoError(t, err)
} else {
- require.EqualError(t, err, tc.expectedErr.Error())
+ must.EqError(t, err, tc.expectedErr.Error())
}
})
}
}
+
+func TestSecureVariablesEndpoint_Apply_ACL(t *testing.T) {
+ ci.Parallel(t)
+ srv, rootToken, shutdown := TestACLServer(t, func(c *Config) {
+ c.NumSchedulers = 0 // Prevent automatic dequeue
+ })
+ defer shutdown()
+ testutil.WaitForLeader(t, srv.RPC)
+ codec := rpcClient(t, srv)
+ state := srv.fsm.State()
+
+ pol := mock.NamespacePolicyWithSecureVariables(
+ structs.DefaultNamespace, "", []string{"list-jobs"},
+ map[string][]string{
+ "dropbox/*": {"write"},
+ })
+ writeToken := mock.CreatePolicyAndToken(t, state, 1003, "test-invalid", pol)
+
+ sv1 := mock.SecureVariable()
+ sv1.ModifyIndex = 0
+ var svHold *structs.SecureVariableDecrypted
+
+ opMap := map[string]structs.SVOp{
+ "set": structs.SVOpSet,
+ "cas": structs.SVOpCAS,
+ "delete": structs.SVOpDelete,
+ "delete-cas": structs.SVOpDeleteCAS,
+ }
+
+ for name, op := range opMap {
+ t.Run(name+"/no token", func(t *testing.T) {
+ sv1 := sv1
+ applyReq := structs.SecureVariablesApplyRequest{
+ Op: op,
+ Var: sv1,
+ WriteRequest: structs.WriteRequest{Region: "global"},
+ }
+ applyResp := new(structs.SecureVariablesApplyResponse)
+ err := msgpackrpc.CallWithCodec(codec, structs.SecureVariablesApplyRPCMethod, &applyReq, applyResp)
+ must.EqError(t, err, structs.ErrPermissionDenied.Error())
+ })
+ }
+
+ t.Run("cas/management token/new", func(t *testing.T) {
+ applyReq := structs.SecureVariablesApplyRequest{
+ Op: structs.SVOpCAS,
+ Var: sv1,
+ WriteRequest: structs.WriteRequest{
+ Region: "global",
+ AuthToken: rootToken.SecretID,
+ },
+ }
+ applyResp := new(structs.SecureVariablesApplyResponse)
+ err := msgpackrpc.CallWithCodec(codec, structs.SecureVariablesApplyRPCMethod, &applyReq, applyResp)
+
+ must.NoError(t, err)
+ must.Eq(t, structs.SVOpResultOk, applyResp.Result)
+ must.Equals(t, sv1.Items, applyResp.Output.Items)
+
+ svHold = applyResp.Output
+ })
+
+ t.Run("cas with current", func(t *testing.T) {
+ must.NotNil(t, svHold)
+ sv := svHold
+ sv.Items["new"] = "newVal"
+
+ applyReq := structs.SecureVariablesApplyRequest{
+ Op: structs.SVOpCAS,
+ Var: sv,
+ WriteRequest: structs.WriteRequest{
+ Region: "global",
+ AuthToken: rootToken.SecretID,
+ },
+ }
+ applyResp := new(structs.SecureVariablesApplyResponse)
+ applyReq.AuthToken = rootToken.SecretID
+
+ err := msgpackrpc.CallWithCodec(codec, structs.SecureVariablesApplyRPCMethod, &applyReq, &applyResp)
+
+ must.NoError(t, err)
+ must.Eq(t, structs.SVOpResultOk, applyResp.Result)
+ must.Equals(t, sv.Items, applyResp.Output.Items)
+
+ svHold = applyResp.Output
+ })
+
+ t.Run("cas with stale", func(t *testing.T) {
+ must.NotNil(t, sv1) // TODO: query these directly
+ must.NotNil(t, svHold)
+
+ sv1 := sv1
+ svHold := svHold
+
+ applyReq := structs.SecureVariablesApplyRequest{
+ Op: structs.SVOpCAS,
+ Var: sv1,
+ WriteRequest: structs.WriteRequest{
+ Region: "global",
+ AuthToken: rootToken.SecretID,
+ },
+ }
+ applyResp := new(structs.SecureVariablesApplyResponse)
+ applyReq.AuthToken = rootToken.SecretID
+
+ err := msgpackrpc.CallWithCodec(codec, structs.SecureVariablesApplyRPCMethod, &applyReq, &applyResp)
+
+ must.NoError(t, err)
+ must.Eq(t, structs.SVOpResultConflict, applyResp.Result)
+ must.Equals(t, svHold.SecureVariableMetadata, applyResp.Conflict.SecureVariableMetadata)
+ must.Equals(t, svHold.Items, applyResp.Conflict.Items)
+ })
+
+ sv3 := mock.SecureVariable()
+ sv3.Path = "dropbox/a"
+ sv3.ModifyIndex = 0
+
+ t.Run("cas/write-only/read own new", func(t *testing.T) {
+ sv3 := sv3
+ applyReq := structs.SecureVariablesApplyRequest{
+ Op: structs.SVOpCAS,
+ Var: sv3,
+ WriteRequest: structs.WriteRequest{
+ Region: "global",
+ AuthToken: writeToken.SecretID,
+ },
+ }
+ applyResp := new(structs.SecureVariablesApplyResponse)
+
+ err := msgpackrpc.CallWithCodec(codec, structs.SecureVariablesApplyRPCMethod, &applyReq, &applyResp)
+
+ must.NoError(t, err)
+ must.Eq(t, structs.SVOpResultOk, applyResp.Result)
+ must.Equals(t, sv3.Items, applyResp.Output.Items)
+ svHold = applyResp.Output
+ })
+
+ t.Run("cas/write only/conflict redacted", func(t *testing.T) {
+ must.NotNil(t, sv3)
+ must.NotNil(t, svHold)
+ sv3 := sv3
+ svHold := svHold
+
+ applyReq := structs.SecureVariablesApplyRequest{
+ Op: structs.SVOpCAS,
+ Var: sv3,
+ WriteRequest: structs.WriteRequest{
+ Region: "global",
+ AuthToken: writeToken.SecretID,
+ },
+ }
+ applyResp := new(structs.SecureVariablesApplyResponse)
+ err := msgpackrpc.CallWithCodec(codec, structs.SecureVariablesApplyRPCMethod, &applyReq, &applyResp)
+
+ must.NoError(t, err)
+ must.Eq(t, structs.SVOpResultRedacted, applyResp.Result)
+ must.Eq(t, svHold.SecureVariableMetadata, applyResp.Conflict.SecureVariableMetadata)
+ must.Nil(t, applyResp.Conflict.Items)
+ })
+
+ t.Run("cas/write only/read own upsert", func(t *testing.T) {
+ must.NotNil(t, svHold)
+ sv := svHold
+ sv.Items["upsert"] = "read"
+
+ applyReq := structs.SecureVariablesApplyRequest{
+ Op: structs.SVOpCAS,
+ Var: sv,
+ WriteRequest: structs.WriteRequest{
+ Region: "global",
+ AuthToken: writeToken.SecretID,
+ },
+ }
+ applyResp := new(structs.SecureVariablesApplyResponse)
+ err := msgpackrpc.CallWithCodec(codec, structs.SecureVariablesApplyRPCMethod, &applyReq, &applyResp)
+
+ must.NoError(t, err)
+ must.Eq(t, structs.SVOpResultOk, applyResp.Result)
+ must.Equals(t, sv.Items, applyResp.Output.Items)
+ })
+}
+
+func TestSecureVariablesEndpoint_ComplexACLPolicies(t *testing.T) {
+
+ ci.Parallel(t)
+ srv, _, shutdown := TestACLServer(t, func(c *Config) {
+ c.NumSchedulers = 0 // Prevent automatic dequeue
+ })
+ defer shutdown()
+ testutil.WaitForLeader(t, srv.RPC)
+ codec := rpcClient(t, srv)
+
+ idx := uint64(1000)
+
+ policyRules := `
+namespace "dev" {
+ secure_variables {
+ path "*" { capabilities = ["list", "read"] }
+ path "system/*" { capabilities = ["deny"] }
+ path "config/system/*" { capabilities = ["deny"] }
+ }
+}
+
+namespace "prod" {
+ secure_variables {
+ path "*" {
+ capabilities = ["list"]
+ }
+ }
+}
+
+namespace "*" {}
+`
+
+ store := srv.fsm.State()
+
+ must.NoError(t, store.UpsertNamespaces(1000, []*structs.Namespace{
+ {Name: "dev"}, {Name: "prod"}, {Name: "other"}}))
+
+ idx++
+ token := mock.CreatePolicyAndToken(t, store, idx, "developer", policyRules)
+
+ writeVar := func(ns, path string) {
+ idx++
+ sv := mock.SecureVariableEncrypted()
+ sv.Namespace = ns
+ sv.Path = path
+ resp := store.SVESet(idx, &structs.SVApplyStateRequest{
+ Op: structs.SVOpSet,
+ Var: sv,
+ })
+ must.NoError(t, resp.Error)
+ }
+
+ writeVar("dev", "system/never-list")
+ writeVar("dev", "config/system/never-list")
+ writeVar("dev", "config/can-read")
+ writeVar("dev", "project/can-read")
+
+ writeVar("prod", "system/can-list")
+ writeVar("prod", "config/system/can-list")
+ writeVar("prod", "config/can-list")
+ writeVar("prod", "project/can-list")
+
+ writeVar("other", "system/never-list")
+ writeVar("other", "config/system/never-list")
+ writeVar("other", "config/never-list")
+ writeVar("other", "project/never-list")
+
+ testListPrefix := func(ns, prefix string, expectedCount int, expectErr error) {
+ t.Run(fmt.Sprintf("ns=%s-prefix=%s", ns, prefix), func(t *testing.T) {
+ req := &structs.SecureVariablesListRequest{
+ QueryOptions: structs.QueryOptions{
+ Namespace: ns,
+ Prefix: prefix,
+ AuthToken: token.SecretID,
+ Region: "global",
+ },
+ }
+ var resp structs.SecureVariablesListResponse
+
+ if expectErr != nil {
+ must.EqError(t,
+ msgpackrpc.CallWithCodec(codec, "SecureVariables.List", req, &resp),
+ expectErr.Error())
+ return
+ }
+ must.NoError(t, msgpackrpc.CallWithCodec(codec, "SecureVariables.List", req, &resp))
+
+ found := "found:\n"
+ for _, sv := range resp.Data {
+ found += fmt.Sprintf(" ns=%s path=%s\n", sv.Namespace, sv.Path)
+ }
+ must.Len(t, expectedCount, resp.Data, test.Sprintf("%s", found))
+ })
+ }
+
+ testListPrefix("dev", "system", 0, nil)
+ testListPrefix("dev", "config/system", 0, nil)
+ testListPrefix("dev", "config", 1, nil)
+ testListPrefix("dev", "project", 1, nil)
+ testListPrefix("dev", "", 2, nil)
+
+ testListPrefix("prod", "system", 1, nil)
+ testListPrefix("prod", "config/system", 1, nil)
+ testListPrefix("prod", "config", 2, nil)
+ testListPrefix("prod", "project", 1, nil)
+ testListPrefix("prod", "", 4, nil)
+
+ testListPrefix("other", "system", 0, structs.ErrPermissionDenied)
+ testListPrefix("other", "config/system", 0, structs.ErrPermissionDenied)
+ testListPrefix("other", "config", 0, structs.ErrPermissionDenied)
+ testListPrefix("other", "project", 0, structs.ErrPermissionDenied)
+ testListPrefix("other", "", 0, structs.ErrPermissionDenied)
+
+ testListPrefix("*", "system", 1, nil)
+ testListPrefix("*", "config/system", 1, nil)
+ testListPrefix("*", "config", 3, nil)
+ testListPrefix("*", "project", 2, nil)
+ testListPrefix("*", "", 6, nil)
+
+}
+
+func TestSecureVariablesEndpoint_GetSecureVariable_Blocking(t *testing.T) {
+ ci.Parallel(t)
+
+ s1, cleanupS1 := TestServer(t, nil)
+ defer cleanupS1()
+ state := s1.fsm.State()
+ codec := rpcClient(t, s1)
+ testutil.WaitForLeader(t, s1.RPC)
+
+ // First create an unrelated variable.
+ delay := 100 * time.Millisecond
+ time.AfterFunc(delay, func() {
+ writeVar(t, s1, 100, "default", "aaa")
+ })
+
+ // Upsert the variable we are watching later
+ delay = 200 * time.Millisecond
+ time.AfterFunc(delay, func() {
+ writeVar(t, s1, 200, "default", "bbb")
+ })
+
+ // Lookup the variable
+ req := &structs.SecureVariablesReadRequest{
+ Path: "bbb",
+ QueryOptions: structs.QueryOptions{
+ Region: "global",
+ MinQueryIndex: 150,
+ MaxQueryTime: 500 * time.Millisecond,
+ },
+ }
+ var resp structs.SecureVariablesReadResponse
+ start := time.Now()
+ if err := msgpackrpc.CallWithCodec(codec, "SecureVariables.Read", req, &resp); err != nil {
+ t.Fatalf("err: %v", err)
+ }
+ elapsed := time.Since(start)
+
+ if elapsed < delay {
+ t.Fatalf("should block (returned in %s) %#v", elapsed, resp)
+ }
+ if elapsed > req.MaxQueryTime {
+ t.Fatalf("blocking query timed out %#v", resp)
+ }
+ if resp.Index != 200 {
+ t.Fatalf("Bad index: %d %d", resp.Index, 200)
+ }
+ if resp.Data == nil || resp.Data.Path != "bbb" {
+ t.Fatalf("bad: %#v", resp.Data)
+ }
+
+ // Variable update triggers watches
+ delay = 100 * time.Millisecond
+
+ time.AfterFunc(delay, func() {
+ writeVar(t, s1, 300, "default", "bbb")
+ })
+
+ req.QueryOptions.MinQueryIndex = 250
+ var resp2 structs.SecureVariablesReadResponse
+ start = time.Now()
+ if err := msgpackrpc.CallWithCodec(codec, "SecureVariables.Read", req, &resp2); err != nil {
+ t.Fatalf("err: %v", err)
+ }
+ elapsed = time.Since(start)
+
+ if elapsed < delay {
+ t.Fatalf("should block (returned in %s) %#v", elapsed, resp2)
+ }
+ if elapsed > req.MaxQueryTime {
+ t.Fatal("blocking query timed out")
+ }
+ if resp2.Index != 300 {
+ t.Fatalf("Bad index: %d %d", resp2.Index, 300)
+ }
+ if resp2.Data == nil || resp2.Data.Path != "bbb" {
+ t.Fatalf("bad: %#v", resp2.Data)
+ }
+
+ // Variable delete triggers watches
+ delay = 100 * time.Millisecond
+ time.AfterFunc(delay, func() {
+ sv := mock.SecureVariableEncrypted()
+ sv.Path = "bbb"
+ if resp := state.SVEDelete(400, &structs.SVApplyStateRequest{Op: structs.SVOpDelete, Var: sv}); !resp.IsOk() {
+ t.Fatalf("err: %v", resp.Error)
+ }
+ })
+
+ req.QueryOptions.MinQueryIndex = 350
+ var resp3 structs.SecureVariablesReadResponse
+ start = time.Now()
+ if err := msgpackrpc.CallWithCodec(codec, "SecureVariables.Read", req, &resp3); err != nil {
+ t.Fatalf("err: %v", err)
+ }
+ elapsed = time.Since(start)
+
+ if elapsed < delay {
+ t.Fatalf("should block (returned in %s) %#v", elapsed, resp)
+ }
+ if elapsed > req.MaxQueryTime {
+ t.Fatal("blocking query timed out")
+ }
+ if resp3.Index != 400 {
+ t.Fatalf("Bad index: %d %d", resp3.Index, 400)
+ }
+ if resp3.Data != nil {
+ t.Fatalf("bad: %#v", resp3.Data)
+ }
+}
+
+func writeVar(t *testing.T, s *Server, idx uint64, ns, path string) {
+ store := s.fsm.State()
+ sv := mock.SecureVariable()
+ sv.Namespace = ns
+ sv.Path = path
+ bPlain, err := json.Marshal(sv.Items)
+ must.NoError(t, err)
+ bEnc, kID, err := s.encrypter.Encrypt(bPlain)
+ must.NoError(t, err)
+ sve := &structs.SecureVariableEncrypted{
+ SecureVariableMetadata: sv.SecureVariableMetadata,
+ SecureVariableData: structs.SecureVariableData{
+ Data: bEnc,
+ KeyID: kID,
+ },
+ }
+ resp := store.SVESet(idx, &structs.SVApplyStateRequest{
+ Op: structs.SVOpSet,
+ Var: sve,
+ })
+ must.NoError(t, resp.Error)
+}
diff --git a/nomad/serf.go b/nomad/serf.go
index 6e5a0a2d16e..9a6d31a87c4 100644
--- a/nomad/serf.go
+++ b/nomad/serf.go
@@ -2,7 +2,6 @@ package nomad
import (
"strings"
- "sync/atomic"
"time"
log "github.com/hashicorp/go-hclog"
@@ -83,7 +82,7 @@ func (s *Server) nodeJoin(me serf.MemberEvent) {
s.peerLock.Unlock()
// If we still expecting to bootstrap, may need to handle this
- if s.config.BootstrapExpect != 0 && atomic.LoadInt32(&s.config.Bootstrapped) == 0 {
+ if s.config.BootstrapExpect != 0 && !s.bootstrapped.Load() {
s.maybeBootstrap()
}
}
@@ -117,7 +116,7 @@ func (s *Server) maybeBootstrap() {
// Bootstrap can only be done if there are no committed logs,
// remove our expectations of bootstrapping
if index != 0 {
- atomic.StoreInt32(&s.config.Bootstrapped, 1)
+ s.bootstrapped.Store(true)
return
}
@@ -188,7 +187,7 @@ func (s *Server) maybeBootstrap() {
if len(peers) > 0 {
s.logger.Info("disabling bootstrap mode because existing Raft peers being reported by peer",
"peer_name", server.Name, "peer_address", server.Addr)
- atomic.StoreInt32(&s.config.Bootstrapped, 1)
+ s.bootstrapped.Store(true)
return
}
}
@@ -230,7 +229,7 @@ func (s *Server) maybeBootstrap() {
}
// Bootstrapping complete, or failed for some reason, don't enter this again
- atomic.StoreInt32(&s.config.Bootstrapped, 1)
+ s.bootstrapped.Store(true)
}
// nodeFailed is used to handle fail events on the serf cluster
diff --git a/nomad/serf_test.go b/nomad/serf_test.go
index 273c2ebac58..f5d2f0dcb1a 100644
--- a/nomad/serf_test.go
+++ b/nomad/serf_test.go
@@ -4,7 +4,6 @@ import (
"fmt"
"path"
"strings"
- "sync/atomic"
"testing"
"time"
@@ -413,7 +412,7 @@ func TestNomad_NonBootstraping_ShouldntBootstap(t *testing.T) {
s1.maybeBootstrap()
time.Sleep(100 * time.Millisecond)
- bootstrapped := atomic.LoadInt32(&s1.config.Bootstrapped)
+ bootstrapped := s1.bootstrapped.Load()
require.Zero(t, bootstrapped, "expecting non-bootstrapped servers")
p, _ := s1.numPeers()
diff --git a/nomad/server.go b/nomad/server.go
index ec4ca4c8ea6..948f4362ff6 100644
--- a/nomad/server.go
+++ b/nomad/server.go
@@ -175,13 +175,16 @@ type Server struct {
// and automatic clustering within regions.
serf *serf.Serf
+ // bootstrapped indicates if Server has bootstrapped or not.
+ bootstrapped *atomic.Bool
+
// reconcileCh is used to pass events from the serf handler
// into the leader manager. Mostly used to handle when servers
// join/leave from the region.
reconcileCh chan serf.Member
// used to track when the server is ready to serve consistent reads, updated atomically
- readyForConsistentReads int32
+ readyForConsistentReads *atomic.Bool
// eventCh is used to receive events from the serf cluster
eventCh chan serf.Event
@@ -341,24 +344,26 @@ func NewServer(config *Config, consulCatalog consul.CatalogAPI, consulConfigEntr
// Create the server
s := &Server{
- config: config,
- consulCatalog: consulCatalog,
- connPool: pool.NewPool(logger, serverRPCCache, serverMaxStreams, tlsWrap),
- logger: logger,
- tlsWrap: tlsWrap,
- rpcServer: rpc.NewServer(),
- streamingRpcs: structs.NewStreamingRpcRegistry(),
- nodeConns: make(map[string][]*nodeConnState),
- peers: make(map[string][]*serverParts),
- localPeers: make(map[raft.ServerAddress]*serverParts),
- reassertLeaderCh: make(chan chan error),
- reconcileCh: make(chan serf.Member, 32),
- eventCh: make(chan serf.Event, 256),
- evalBroker: evalBroker,
- blockedEvals: NewBlockedEvals(evalBroker, logger),
- rpcTLS: incomingTLS,
- aclCache: aclCache,
- workersEventCh: make(chan interface{}, 1),
+ config: config,
+ consulCatalog: consulCatalog,
+ connPool: pool.NewPool(logger, serverRPCCache, serverMaxStreams, tlsWrap),
+ logger: logger,
+ tlsWrap: tlsWrap,
+ rpcServer: rpc.NewServer(),
+ streamingRpcs: structs.NewStreamingRpcRegistry(),
+ nodeConns: make(map[string][]*nodeConnState),
+ peers: make(map[string][]*serverParts),
+ localPeers: make(map[raft.ServerAddress]*serverParts),
+ bootstrapped: &atomic.Bool{},
+ reassertLeaderCh: make(chan chan error),
+ reconcileCh: make(chan serf.Member, 32),
+ readyForConsistentReads: &atomic.Bool{},
+ eventCh: make(chan serf.Event, 256),
+ evalBroker: evalBroker,
+ blockedEvals: NewBlockedEvals(evalBroker, logger),
+ rpcTLS: incomingTLS,
+ aclCache: aclCache,
+ workersEventCh: make(chan interface{}, 1),
}
s.shutdownCtx, s.shutdownCancel = context.WithCancel(context.Background())
@@ -1894,17 +1899,17 @@ func (s *Server) getLeaderAcl() string {
// Atomically sets a readiness state flag when leadership is obtained, to indicate that server is past its barrier write
func (s *Server) setConsistentReadReady() {
- atomic.StoreInt32(&s.readyForConsistentReads, 1)
+ s.readyForConsistentReads.Store(true)
}
// Atomically reset readiness state flag on leadership revoke
func (s *Server) resetConsistentReadReady() {
- atomic.StoreInt32(&s.readyForConsistentReads, 0)
+ s.readyForConsistentReads.Store(false)
}
// Returns true if this server is ready to serve consistent reads
func (s *Server) isReadyForConsistentReads() bool {
- return atomic.LoadInt32(&s.readyForConsistentReads) == 1
+ return s.readyForConsistentReads.Load()
}
// Regions returns the known regions in the cluster.
@@ -2006,7 +2011,7 @@ func (s *Server) setReplyQueryMeta(stateStore *state.StateStore, table string, r
if err != nil {
return err
}
- reply.Index = helper.Uint64Max(1, index)
+ reply.Index = helper.Max(1, index)
// Set the query response.
s.setQueryMeta(reply)
diff --git a/nomad/server_setup.go b/nomad/server_setup.go
new file mode 100644
index 00000000000..e56a9b7458c
--- /dev/null
+++ b/nomad/server_setup.go
@@ -0,0 +1,31 @@
+package nomad
+
+import (
+ "github.com/hashicorp/go-hclog"
+ "golang.org/x/exp/slices"
+)
+
+// LicenseConfig allows for tunable licensing config
+// primarily used for enterprise testing
+type LicenseConfig struct {
+ // LicenseEnvBytes is the license bytes to use for the server's license
+ LicenseEnvBytes string
+
+ // LicensePath is the path to use for the server's license
+ LicensePath string
+
+ // AdditionalPubKeys is a set of public keys to
+ AdditionalPubKeys []string
+
+ Logger hclog.InterceptLogger
+}
+
+func (c *LicenseConfig) Copy() *LicenseConfig {
+ if c == nil {
+ return nil
+ }
+
+ nc := *c
+ nc.AdditionalPubKeys = slices.Clone(c.AdditionalPubKeys)
+ return &nc
+}
diff --git a/nomad/server_setup_oss.go b/nomad/server_setup_oss.go
index 2e08a9ea508..7abf7a41ed6 100644
--- a/nomad/server_setup_oss.go
+++ b/nomad/server_setup_oss.go
@@ -7,12 +7,6 @@ import (
"github.com/hashicorp/consul/agent/consul/autopilot"
)
-// LicenseConfig allows for tunable licensing config
-// primarily used for enterprise testing
-type LicenseConfig struct {
- AdditionalPubKeys []string
-}
-
type EnterpriseState struct{}
func (es *EnterpriseState) Features() uint64 {
diff --git a/nomad/server_test.go b/nomad/server_test.go
index 6e73e5c11c0..16f99c2c3e8 100644
--- a/nomad/server_test.go
+++ b/nomad/server_test.go
@@ -214,6 +214,7 @@ func TestServer_Reload_Vault(t *testing.T) {
config := DefaultConfig()
config.VaultConfig.Enabled = &tr
config.VaultConfig.Token = uuid.Generate()
+ config.VaultConfig.Namespace = "nondefault"
if err := s1.Reload(config); err != nil {
t.Fatalf("Reload failed: %v", err)
@@ -222,6 +223,10 @@ func TestServer_Reload_Vault(t *testing.T) {
if !s1.vault.Running() {
t.Fatalf("Vault client should be running")
}
+
+ if s1.vault.GetConfig().Namespace != "nondefault" {
+ t.Fatalf("Vault client did not get new namespace")
+ }
}
func connectionReset(msg string) bool {
diff --git a/nomad/state/events_test.go b/nomad/state/events_test.go
index 1af2cc6cc83..44a9c326ef1 100644
--- a/nomad/state/events_test.go
+++ b/nomad/state/events_test.go
@@ -6,7 +6,7 @@ import (
memdb "github.com/hashicorp/go-memdb"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
@@ -177,7 +177,7 @@ func TestEventsFromChanges_DeploymentPromotion(t *testing.T) {
c1.DeploymentID = d.ID
d.TaskGroups[c1.TaskGroup].PlacedCanaries = append(d.TaskGroups[c1.TaskGroup].PlacedCanaries, c1.ID)
c1.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
}
c2 := mock.Alloc()
c2.JobID = j.ID
@@ -185,7 +185,7 @@ func TestEventsFromChanges_DeploymentPromotion(t *testing.T) {
d.TaskGroups[c2.TaskGroup].PlacedCanaries = append(d.TaskGroups[c2.TaskGroup].PlacedCanaries, c2.ID)
c2.TaskGroup = tg2.Name
c2.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
}
require.NoError(t, s.upsertAllocsImpl(10, []*structs.Allocation{c1, c2}, setupTx))
@@ -254,7 +254,7 @@ func TestEventsFromChanges_DeploymentAllocHealthRequestType(t *testing.T) {
c1.DeploymentID = d.ID
d.TaskGroups[c1.TaskGroup].PlacedCanaries = append(d.TaskGroups[c1.TaskGroup].PlacedCanaries, c1.ID)
c1.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
}
c2 := mock.Alloc()
c2.JobID = j.ID
@@ -262,7 +262,7 @@ func TestEventsFromChanges_DeploymentAllocHealthRequestType(t *testing.T) {
d.TaskGroups[c2.TaskGroup].PlacedCanaries = append(d.TaskGroups[c2.TaskGroup].PlacedCanaries, c2.ID)
c2.TaskGroup = tg2.Name
c2.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
}
require.NoError(t, s.upsertAllocsImpl(10, []*structs.Allocation{c1, c2}, setupTx))
@@ -602,7 +602,7 @@ func TestEventsFromChanges_AllocUpdateDesiredTransitionRequestType(t *testing.T)
req := &structs.AllocUpdateDesiredTransitionRequest{
Allocs: map[string]*structs.DesiredTransition{
- alloc.ID: {Migrate: helper.BoolToPtr(true)},
+ alloc.ID: {Migrate: pointer.Of(true)},
},
Evals: evals,
}
diff --git a/nomad/state/paginator/tokenizer.go b/nomad/state/paginator/tokenizer.go
index 343d7e17f67..fa5e58d5bae 100644
--- a/nomad/state/paginator/tokenizer.go
+++ b/nomad/state/paginator/tokenizer.go
@@ -33,27 +33,28 @@ type CreateIndexGetter interface {
// StructsTokenizerOptions is the configuration provided to a StructsTokenizer.
//
// These are some of the common use cases:
-// - Structs that can be uniquely identified with only its own ID:
//
-// StructsTokenizerOptions {
-// WithID: true,
-// }
+// Structs that can be uniquely identified with only its own ID:
//
-// - Structs that are only unique within their namespace:
+// StructsTokenizerOptions {
+// WithID: true,
+// }
//
-// StructsTokenizerOptions {
-// WithID: true,
-// WithNamespace: true,
-// }
+// Structs that are only unique within their namespace:
//
-// - Structs that can be sorted by their create index should also set
-// `WithCreateIndex` to `true` along with the other options:
+// StructsTokenizerOptions {
+// WithID: true,
+// WithNamespace: true,
+// }
//
-// StructsTokenizerOptions {
-// WithID: true,
-// WithNamespace: true,
-// WithCreateIndex: true,
-// }
+// Structs that can be sorted by their create index should also set
+// `WithCreateIndex` to `true` along with the other options:
+//
+// StructsTokenizerOptions {
+// WithID: true,
+// WithNamespace: true,
+// WithCreateIndex: true,
+// }
type StructsTokenizerOptions struct {
WithCreateIndex bool
WithNamespace bool
diff --git a/nomad/state/schema.go b/nomad/state/schema.go
index df16d1011aa..b8439d11b27 100644
--- a/nomad/state/schema.go
+++ b/nomad/state/schema.go
@@ -780,10 +780,80 @@ func aclPolicyTableSchema() *memdb.TableSchema {
Field: "Name",
},
},
+ "job": {
+ Name: "job",
+ AllowMissing: true,
+ Unique: false,
+ Indexer: &ACLPolicyJobACLFieldIndex{},
+ },
},
}
}
+// ACLPolicyJobACLFieldIndex is used to extract the policy's JobACL field and
+// build an index on it.
+type ACLPolicyJobACLFieldIndex struct{}
+
+// FromObject is used to extract an index value from an
+// object or to indicate that the index value is missing.
+func (a *ACLPolicyJobACLFieldIndex) FromObject(obj interface{}) (bool, []byte, error) {
+ policy, ok := obj.(*structs.ACLPolicy)
+ if !ok {
+ return false, nil, fmt.Errorf("object %#v is not an ACLPolicy", obj)
+ }
+
+ if policy.JobACL == nil {
+ return false, nil, nil
+ }
+
+ ns := policy.JobACL.Namespace
+ if ns == "" {
+ return false, nil, nil
+ }
+ jobID := policy.JobACL.JobID
+ if jobID == "" {
+ return false, nil, fmt.Errorf(
+ "object %#v is not a valid ACLPolicy: JobACL.JobID without Namespace", obj)
+ }
+
+ val := ns + "\x00" + jobID + "\x00"
+ return true, []byte(val), nil
+}
+
+// FromArgs is used to build an exact index lookup based on arguments
+func (a *ACLPolicyJobACLFieldIndex) FromArgs(args ...interface{}) ([]byte, error) {
+ if len(args) != 2 {
+ return nil, fmt.Errorf("must provide two arguments")
+ }
+ arg0, ok := args[0].(string)
+ if !ok {
+ return nil, fmt.Errorf("argument must be a string: %#v", args[0])
+ }
+ arg1, ok := args[1].(string)
+ if !ok {
+ return nil, fmt.Errorf("argument must be a string: %#v", args[0])
+ }
+
+ // Add the null character as a terminator
+ arg0 += "\x00" + arg1 + "\x00"
+ return []byte(arg0), nil
+}
+
+// PrefixFromArgs returns a prefix that should be used for scanning based on the arguments
+func (a *ACLPolicyJobACLFieldIndex) PrefixFromArgs(args ...interface{}) ([]byte, error) {
+ val, err := a.FromArgs(args...)
+ if err != nil {
+ return nil, err
+ }
+
+ // Strip the null terminator, the rest is a prefix
+ n := len(val)
+ if n > 0 {
+ return val[:n-1], nil
+ }
+ return val, nil
+}
+
// aclTokenTableSchema returns the MemDB schema for the tokens table.
// This table is used to store the bearer tokens which are used to authenticate
func aclTokenTableSchema() *memdb.TableSchema {
diff --git a/nomad/state/state_store.go b/nomad/state/state_store.go
index 5a3d6028cfc..23f28cf1224 100644
--- a/nomad/state/state_store.go
+++ b/nomad/state/state_store.go
@@ -12,7 +12,7 @@ import (
"github.com/hashicorp/go-hclog"
"github.com/hashicorp/go-memdb"
"github.com/hashicorp/go-multierror"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/nomad/stream"
"github.com/hashicorp/nomad/nomad/structs"
)
@@ -3488,7 +3488,7 @@ func (s *StateStore) nestedUpdateAllocFromClient(txn *txn, index uint64, alloc *
// We got new health information from the client
if newHasHealthy && (!oldHasHealthy || *copyAlloc.DeploymentStatus.Healthy != *alloc.DeploymentStatus.Healthy) {
// Updated deployment health and timestamp
- copyAlloc.DeploymentStatus.Healthy = helper.BoolToPtr(*alloc.DeploymentStatus.Healthy)
+ copyAlloc.DeploymentStatus.Healthy = pointer.Of(*alloc.DeploymentStatus.Healthy)
copyAlloc.DeploymentStatus.Timestamp = alloc.DeploymentStatus.Timestamp
copyAlloc.DeploymentStatus.ModifyIndex = index
}
@@ -4564,7 +4564,7 @@ func (s *StateStore) UpdateDeploymentAllocHealth(msgType structs.MessageType, in
if copy.DeploymentStatus == nil {
copy.DeploymentStatus = &structs.AllocDeploymentStatus{}
}
- copy.DeploymentStatus.Healthy = helper.BoolToPtr(healthy)
+ copy.DeploymentStatus.Healthy = pointer.Of(healthy)
copy.DeploymentStatus.Timestamp = ts
copy.DeploymentStatus.ModifyIndex = index
copy.ModifyIndex = index
@@ -5570,6 +5570,20 @@ func (s *StateStore) ACLPolicyByNamePrefix(ws memdb.WatchSet, prefix string) (me
return iter, nil
}
+// ACLPolicyByJob is used to lookup policies that have been attached to a
+// specific job
+func (s *StateStore) ACLPolicyByJob(ws memdb.WatchSet, ns, jobID string) (memdb.ResultIterator, error) {
+ txn := s.db.ReadTxn()
+
+ iter, err := txn.Get("acl_policy", "job_prefix", ns, jobID)
+ if err != nil {
+ return nil, fmt.Errorf("acl policy lookup failed: %v", err)
+ }
+ ws.Add(iter.WatchCh())
+
+ return iter, nil
+}
+
// ACLPolicies returns an iterator over all the acl policies
func (s *StateStore) ACLPolicies(ws memdb.WatchSet) (memdb.ResultIterator, error) {
txn := s.db.ReadTxn()
diff --git a/nomad/state/state_store_secure_variables.go b/nomad/state/state_store_secure_variables.go
index 281c6a6f301..9fbc7e64a41 100644
--- a/nomad/state/state_store_secure_variables.go
+++ b/nomad/state/state_store_secure_variables.go
@@ -2,7 +2,7 @@ package state
import (
"fmt"
- "time"
+ "math"
"github.com/hashicorp/go-memdb"
@@ -99,10 +99,11 @@ func (s *StateStore) GetSecureVariable(
txn := s.db.ReadTxn()
// Try to fetch the secure variable.
- raw, err := txn.First(TableSecureVariables, indexID, namespace, path)
+ watchCh, raw, err := txn.FirstWatch(TableSecureVariables, indexID, namespace, path)
if err != nil { // error during fetch
return nil, fmt.Errorf("secure variable lookup failed: %v", err)
}
+ ws.Add(watchCh)
if raw == nil { // not found
return nil, nil
}
@@ -111,178 +112,361 @@ func (s *StateStore) GetSecureVariable(
return sv, nil
}
-func (s *StateStore) UpsertSecureVariables(msgType structs.MessageType, index uint64, svs []*structs.SecureVariableEncrypted) error {
- txn := s.db.WriteTxn(index)
- defer txn.Abort()
+// SVESet is used to store a secure variable object.
+func (s *StateStore) SVESet(idx uint64, sv *structs.SVApplyStateRequest) *structs.SVApplyStateResponse {
+ tx := s.db.WriteTxn(idx)
+ defer tx.Abort()
- var updated bool = false
- for _, sv := range svs {
- if err := s.upsertSecureVariableImpl(index, txn, sv, &updated); err != nil {
- return err
- }
+ // Perform the actual set.
+ resp := s.svSetTxn(tx, idx, sv)
+ if resp.IsError() {
+ return resp
}
- if !updated {
- return nil
+ if err := tx.Commit(); err != nil {
+ return sv.ErrorResponse(idx, err)
}
+ return resp
+}
- if err := txn.Insert(tableIndex, &IndexEntry{TableSecureVariables, index}); err != nil {
- return fmt.Errorf("index update failed: %v", err)
+// SVESetCAS is used to do a check-and-set operation on a secure
+// variable. The ModifyIndex in the provided entry is used to determine if
+// we should write the entry to the state store or not.
+func (s *StateStore) SVESetCAS(idx uint64, sv *structs.SVApplyStateRequest) *structs.SVApplyStateResponse {
+ tx := s.db.WriteTxn(idx)
+ defer tx.Abort()
+
+ resp := s.svSetCASTxn(tx, idx, sv)
+ if resp.IsError() || resp.IsConflict() {
+ return resp
}
- return txn.Commit()
+ if err := tx.Commit(); err != nil {
+ return sv.ErrorResponse(idx, err)
+ }
+ return resp
}
-// upsertSecureVariableImpl is used to upsert a secure variable
-func (s *StateStore) upsertSecureVariableImpl(index uint64, txn *txn, sv *structs.SecureVariableEncrypted, updated *bool) error {
- // Check if the secure variable already exists
- existing, err := txn.First(TableSecureVariables, indexID, sv.Namespace, sv.Path)
+// svSetCASTxn is the inner method used to do a CAS inside an existing
+// transaction.
+func (s *StateStore) svSetCASTxn(tx WriteTxn, idx uint64, req *structs.SVApplyStateRequest) *structs.SVApplyStateResponse {
+ sv := req.Var
+ raw, err := tx.First(TableSecureVariables, indexID, sv.Namespace, sv.Path)
if err != nil {
- return fmt.Errorf("secure variable lookup failed: %v", err)
+ return req.ErrorResponse(idx, fmt.Errorf("failed sve lookup: %s", err))
}
+ svEx, ok := raw.(*structs.SecureVariableEncrypted)
- existingQuota, err := txn.First(TableSecureVariablesQuotas, indexID, sv.Namespace)
+ // ModifyIndex of 0 means that we are doing a set-if-not-exists.
+ if sv.ModifyIndex == 0 && raw != nil {
+ return req.ConflictResponse(idx, svEx)
+ }
+
+ // If the ModifyIndex is set but the variable doesn't exist, return a
+ // plausible zero value as the conflict
+ if sv.ModifyIndex != 0 && raw == nil {
+ zeroVal := &structs.SecureVariableEncrypted{
+ SecureVariableMetadata: structs.SecureVariableMetadata{
+ Namespace: sv.Namespace,
+ Path: sv.Path,
+ },
+ }
+ return req.ConflictResponse(idx, zeroVal)
+ }
+
+ // If the existing index does not match the provided CAS index arg, then we
+ // shouldn't update anything and can safely return early here.
+ if ok && sv.ModifyIndex != svEx.ModifyIndex {
+ return req.ConflictResponse(idx, svEx)
+ }
+
+ // If we made it this far, we should perform the set.
+ return s.svSetTxn(tx, idx, req)
+}
+
+// svSetTxn is used to insert or update a secure variable in the state
+// store. It is the inner method used and handles only the actual storage.
+func (s *StateStore) svSetTxn(tx WriteTxn, idx uint64, req *structs.SVApplyStateRequest) *structs.SVApplyStateResponse {
+ sv := req.Var
+ existingRaw, err := tx.First(TableSecureVariables, indexID, sv.Namespace, sv.Path)
+ if err != nil {
+ return req.ErrorResponse(idx, fmt.Errorf("failed sve lookup: %s", err))
+ }
+ existing, _ := existingRaw.(*structs.SecureVariableEncrypted)
+
+ existingQuota, err := tx.First(TableSecureVariablesQuotas, indexID, sv.Namespace)
if err != nil {
- return fmt.Errorf("secure variable quota lookup failed: %v", err)
+ return req.ErrorResponse(idx, fmt.Errorf("secure variable quota lookup failed: %v", err))
}
- var quotaChange int
+ var quotaChange int64
- // Setup the indexes correctly
- nowNano := time.Now().UnixNano()
+ // Set the CreateIndex and CreateTime
if existing != nil {
- exist := existing.(*structs.SecureVariableEncrypted)
- if !shouldWrite(sv, exist) {
- *updated = false
- return nil
+ sv.CreateIndex = existing.CreateIndex
+ sv.CreateTime = existing.CreateTime
+
+ if existing.Equals(*sv) {
+ // Skip further writing in the state store if the entry is not actually
+ // changed. Nevertheless, the input's ModifyIndex should be reset
+ // since the TXN API returns a copy in the response.
+ sv.ModifyIndex = existing.ModifyIndex
+ sv.ModifyTime = existing.ModifyTime
+ return req.SuccessResponse(idx, nil)
}
- sv.CreateIndex = exist.CreateIndex
- sv.CreateTime = exist.CreateTime
- sv.ModifyIndex = index
- sv.ModifyTime = nowNano
- quotaChange = len(sv.Data) - len(exist.Data)
+ sv.ModifyIndex = idx
+ quotaChange = int64(len(sv.Data) - len(existing.Data))
} else {
- sv.CreateIndex = index
- sv.CreateTime = nowNano
- sv.ModifyIndex = index
- sv.ModifyTime = nowNano
- quotaChange = len(sv.Data)
+ sv.CreateIndex = idx
+ sv.ModifyIndex = idx
+ quotaChange = int64(len(sv.Data))
}
- // Insert the secure variable
- if err := txn.Insert(TableSecureVariables, sv); err != nil {
- return fmt.Errorf("secure variable insert failed: %v", err)
+ if err := tx.Insert(TableSecureVariables, sv); err != nil {
+ return req.ErrorResponse(idx, fmt.Errorf("failed inserting secure variable: %s", err))
}
- if quotaChange != 0 {
- // Track quota usage
- var quotaUsed *structs.SecureVariablesQuota
- if existingQuota != nil {
- quotaUsed = existingQuota.(*structs.SecureVariablesQuota)
- quotaUsed = quotaUsed.Copy()
- } else {
- quotaUsed = &structs.SecureVariablesQuota{
- Namespace: sv.Namespace,
- CreateIndex: index,
- }
- }
- quotaUsed.ModifyIndex = index
- if quotaChange > 0 {
- quotaUsed.Size += uint64(quotaChange)
- } else {
- quotaUsed.Size -= uint64(helper.MinInt(int(quotaUsed.Size), -quotaChange))
+ // Track quota usage
+ var quotaUsed *structs.SecureVariablesQuota
+ if existingQuota != nil {
+ quotaUsed = existingQuota.(*structs.SecureVariablesQuota)
+ quotaUsed = quotaUsed.Copy()
+ } else {
+ quotaUsed = &structs.SecureVariablesQuota{
+ Namespace: sv.Namespace,
+ CreateIndex: idx,
}
- if err := txn.Insert(TableSecureVariablesQuotas, quotaUsed); err != nil {
- return fmt.Errorf("secure variable quota insert failed: %v", err)
+ }
+
+ if quotaChange > math.MaxInt64-quotaUsed.Size {
+ // this limit is actually shared across all namespaces in the region's
+ // quota (if there is one), but we need this check here to prevent
+ // overflow as well
+ return req.ErrorResponse(idx, fmt.Errorf("secure variables can store a maximum of %d bytes of encrypted data per namespace", math.MaxInt))
+ }
+
+ if quotaChange > 0 {
+ quotaUsed.Size += quotaChange
+ } else if quotaChange < 0 {
+ quotaUsed.Size -= helper.Min(quotaUsed.Size, -quotaChange)
+ }
+
+ err = s.enforceSecureVariablesQuota(idx, tx, sv.Namespace, quotaChange)
+ if err != nil {
+ return req.ErrorResponse(idx, err)
+ }
+
+ // we check enforcement above even if there's no change because another
+ // namespace may have used up quota to make this no longer valid, but we
+ // only update the table if this namespace has changed
+ if quotaChange != 0 {
+ quotaUsed.ModifyIndex = idx
+ if err := tx.Insert(TableSecureVariablesQuotas, quotaUsed); err != nil {
+ return req.ErrorResponse(idx, fmt.Errorf("secure variable quota insert failed: %v", err))
}
}
- *updated = true
- return nil
+ if err := tx.Insert(tableIndex,
+ &IndexEntry{TableSecureVariables, idx}); err != nil {
+ return req.ErrorResponse(idx, fmt.Errorf("failed updating secure variable index: %s", err))
+ }
+
+ return req.SuccessResponse(idx, &sv.SecureVariableMetadata)
+}
+
+// SVEGet is used to retrieve a key/value pair from the state store.
+func (s *StateStore) SVEGet(ws memdb.WatchSet, namespace, path string) (uint64, *structs.SecureVariableEncrypted, error) {
+ tx := s.db.ReadTxn()
+ defer tx.Abort()
+
+ return svGetTxn(tx, ws, namespace, path)
}
-// shouldWrite can be used to determine if a write needs to happen.
-func shouldWrite(sv, existing *structs.SecureVariableEncrypted) bool {
- // FIXME: Move this to the RPC layer eventually.
- if existing == nil {
- return true
+// svGetTxn is the inner method that gets a secure variable inside an existing
+// transaction.
+func svGetTxn(tx ReadTxn,
+ ws memdb.WatchSet, namespace, path string) (uint64, *structs.SecureVariableEncrypted, error) {
+
+ // Get the table index.
+ idx := svMaxIndex(tx)
+
+ watchCh, entry, err := tx.FirstWatch(TableSecureVariables, indexID, namespace, path)
+ if err != nil {
+ return 0, nil, fmt.Errorf("failed secure variable lookup: %s", err)
}
- if sv.Equals(*existing) {
- return false
+ ws.Add(watchCh)
+ if entry != nil {
+ return idx, entry.(*structs.SecureVariableEncrypted), nil
}
- return true
+ return idx, nil, nil
}
-func (s *StateStore) DeleteSecureVariables(msgType structs.MessageType, index uint64, namespace string, paths []string) error {
- txn := s.db.WriteTxn(index)
- defer txn.Abort()
+// SVEDelete is used to delete a single secure variable in the
+// the state store.
+func (s *StateStore) SVEDelete(idx uint64, req *structs.SVApplyStateRequest) *structs.SVApplyStateResponse {
+ tx := s.db.WriteTxn(idx)
+ defer tx.Abort()
- err := s.DeleteSecureVariablesTxn(index, namespace, paths, txn)
- if err == nil {
- return txn.Commit()
+ // Perform the actual delete
+ resp := s.svDeleteTxn(tx, idx, req)
+ if !resp.IsOk() {
+ return resp
}
- return err
-}
-func (s *StateStore) DeleteSecureVariablesTxn(index uint64, namespace string, paths []string, txn Txn) error {
- for _, path := range paths {
- err := s.DeleteSecureVariableTxn(index, namespace, path, txn)
- if err != nil {
- return err
- }
+ err := tx.Commit()
+ if err != nil {
+ return req.ErrorResponse(idx, err)
}
- return nil
+
+ return resp
}
-// DeleteSecureVariable is used to delete a single secure variable
-func (s *StateStore) DeleteSecureVariable(index uint64, namespace, path string) error {
- txn := s.db.WriteTxn(index)
- defer txn.Abort()
+// SVEDeleteCAS is used to conditionally delete a secure
+// variable if and only if it has a given modify index. If the CAS
+// index (cidx) specified is not equal to the last observed index for
+// the given variable, then the call is a noop, otherwise a normal
+// delete is invoked.
+func (s *StateStore) SVEDeleteCAS(idx uint64, req *structs.SVApplyStateRequest) *structs.SVApplyStateResponse {
+ tx := s.db.WriteTxn(idx)
+ defer tx.Abort()
+
+ resp := s.svDeleteCASTxn(tx, idx, req)
+ if !resp.IsOk() {
+ return resp
+ }
- err := s.DeleteSecureVariableTxn(index, namespace, path, txn)
- if err == nil {
- return txn.Commit()
+ err := tx.Commit()
+ if err != nil {
+ return req.ErrorResponse(idx, err)
}
- return err
+
+ return resp
}
-// DeleteSecureVariableTxn is used to delete the secure variable, like DeleteSecureVariable
-// but in a transaction. Useful for when making multiple modifications atomically
-func (s *StateStore) DeleteSecureVariableTxn(index uint64, namespace, path string, txn Txn) error {
- // Lookup the variable
- existing, err := txn.First(TableSecureVariables, indexID, namespace, path)
+// svDeleteCASTxn is an inner method used to check the existing value
+// of a secure variable within an existing transaction as part of a
+// conditional delete.
+func (s *StateStore) svDeleteCASTxn(tx WriteTxn, idx uint64, req *structs.SVApplyStateRequest) *structs.SVApplyStateResponse {
+ sv := req.Var
+ raw, err := tx.First(TableSecureVariables, indexID, sv.Namespace, sv.Path)
if err != nil {
- return fmt.Errorf("secure variable lookup failed: %v", err)
+ return req.ErrorResponse(idx, fmt.Errorf("failed secure variable lookup: %s", err))
}
- if existing == nil {
- return fmt.Errorf("secure variable not found")
+
+ svEx, ok := raw.(*structs.SecureVariableEncrypted)
+
+ // ModifyIndex of 0 means that we are doing a delete-if-not-exists.
+ if sv.ModifyIndex == 0 && raw != nil {
+ return req.ConflictResponse(idx, svEx)
}
- existingQuota, err := txn.First(TableSecureVariablesQuotas, indexID, namespace)
- if err != nil {
- return fmt.Errorf("secure variable quota lookup failed: %v", err)
+
+ // If the ModifyIndex is set but the variable doesn't exist, return a
+ // plausible zero value as the conflict
+ if sv.ModifyIndex != 0 && raw == nil {
+ zeroVal := &structs.SecureVariableEncrypted{
+ SecureVariableMetadata: structs.SecureVariableMetadata{
+ Namespace: sv.Namespace,
+ Path: sv.Path,
+ },
+ }
+ return req.ConflictResponse(idx, zeroVal)
}
- // Delete the variable
- if err := txn.Delete(TableSecureVariables, existing); err != nil {
- return fmt.Errorf("secure variable delete failed: %v", err)
+ // If the existing index does not match the provided CAS index arg, then we
+ // shouldn't update anything and can safely return early here.
+ if !ok || sv.ModifyIndex != svEx.ModifyIndex {
+ return req.ConflictResponse(idx, svEx)
+ }
+
+ // Call the actual deletion if the above passed.
+ return s.svDeleteTxn(tx, idx, req)
+}
+
+// svDeleteTxn is the inner method used to perform the actual deletion
+// of a secure variable within an existing transaction.
+func (s *StateStore) svDeleteTxn(tx WriteTxn, idx uint64, req *structs.SVApplyStateRequest) *structs.SVApplyStateResponse {
+
+ // Look up the entry in the state store.
+ existingRaw, err := tx.First(TableSecureVariables, indexID, req.Var.Namespace, req.Var.Path)
+ if err != nil {
+ return req.ErrorResponse(idx, fmt.Errorf("failed secure variable lookup: %s", err))
}
- if err := txn.Insert("index", &IndexEntry{TableSecureVariables, index}); err != nil {
- return fmt.Errorf("index update failed: %v", err)
+ if existingRaw == nil {
+ return req.SuccessResponse(idx, nil)
}
+ existingQuota, err := tx.First(TableSecureVariablesQuotas, indexID, req.Var.Namespace)
+ if err != nil {
+ return req.ErrorResponse(idx, fmt.Errorf("secure variable quota lookup failed: %v", err))
+ }
+
+ sv := existingRaw.(*structs.SecureVariableEncrypted)
+
// Track quota usage
if existingQuota != nil {
quotaUsed := existingQuota.(*structs.SecureVariablesQuota)
quotaUsed = quotaUsed.Copy()
- sv := existing.(*structs.SecureVariableEncrypted)
- quotaUsed.Size -= uint64(len(sv.Data))
- quotaUsed.ModifyIndex = index
- if err := txn.Insert(TableSecureVariablesQuotas, quotaUsed); err != nil {
- return fmt.Errorf("secure variable quota insert failed: %v", err)
+ quotaUsed.Size -= helper.Min(quotaUsed.Size, int64(len(sv.Data)))
+ quotaUsed.ModifyIndex = idx
+ if err := tx.Insert(TableSecureVariablesQuotas, quotaUsed); err != nil {
+ return req.ErrorResponse(idx, fmt.Errorf("secure variable quota insert failed: %v", err))
}
}
- return nil
+ // Delete the secure variable and update the index table.
+ if err := tx.Delete(TableSecureVariables, sv); err != nil {
+ return req.ErrorResponse(idx, fmt.Errorf("failed deleting secure variable entry: %s", err))
+ }
+
+ if err := tx.Insert(tableIndex, &IndexEntry{TableSecureVariables, idx}); err != nil {
+ return req.ErrorResponse(idx, fmt.Errorf("failed updating secure variable index: %s", err))
+ }
+
+ return req.SuccessResponse(idx, nil)
+}
+
+// This extra indirection is to facilitate the tombstone case if it matters.
+func svMaxIndex(tx ReadTxn) uint64 {
+ return maxIndexTxn(tx, TableSecureVariables)
+}
+
+// WriteTxn is implemented by memdb.Txn to perform write operations.
+type WriteTxn interface {
+ ReadTxn
+ Defer(func())
+ Delete(table string, obj interface{}) error
+ DeleteAll(table, index string, args ...interface{}) (int, error)
+ DeletePrefix(table string, index string, prefix string) (bool, error)
+ Insert(table string, obj interface{}) error
+}
+
+// maxIndex is a helper used to retrieve the highest known index
+// amongst a set of tables in the db.
+func (s *StateStore) maxIndex(tables ...string) uint64 {
+ tx := s.db.ReadTxn()
+ defer tx.Abort()
+ return maxIndexTxn(tx, tables...)
+}
+
+// maxIndexTxn is a helper used to retrieve the highest known index
+// amongst a set of tables in the db.
+func maxIndexTxn(tx ReadTxn, tables ...string) uint64 {
+ return maxIndexWatchTxn(tx, nil, tables...)
+}
+
+func maxIndexWatchTxn(tx ReadTxn, ws memdb.WatchSet, tables ...string) uint64 {
+ var lindex uint64
+ for _, table := range tables {
+ ch, ti, err := tx.FirstWatch(tableIndex, "id", table)
+ if err != nil {
+ panic(fmt.Sprintf("unknown index: %s err: %s", table, err))
+ }
+ if idx, ok := ti.(*IndexEntry); ok && idx.Value > lindex {
+ lindex = idx.Value
+ }
+ ws.Add(ch)
+ }
+ return lindex
}
// SecureVariablesQuotas queries all the quotas and is used only for
diff --git a/nomad/state/state_store_secure_variables_oss.go b/nomad/state/state_store_secure_variables_oss.go
new file mode 100644
index 00000000000..f730fec6b09
--- /dev/null
+++ b/nomad/state/state_store_secure_variables_oss.go
@@ -0,0 +1,8 @@
+//go:build !ent
+// +build !ent
+
+package state
+
+func (s *StateStore) enforceSecureVariablesQuota(_ uint64, _ WriteTxn, _ string, _ int64) error {
+ return nil
+}
diff --git a/nomad/state/state_store_secure_variables_test.go b/nomad/state/state_store_secure_variables_test.go
index bd4c5388286..4b0f00cc77b 100644
--- a/nomad/state/state_store_secure_variables_test.go
+++ b/nomad/state/state_store_secure_variables_test.go
@@ -2,18 +2,17 @@ package state
import (
"encoding/json"
- "fmt"
"sort"
"strings"
"testing"
- "time"
memdb "github.com/hashicorp/go-memdb"
+ "github.com/stretchr/testify/require"
+
"github.com/hashicorp/nomad/ci"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
- "github.com/stretchr/testify/require"
)
func TestStateStore_GetSecureVariable(t *testing.T) {
@@ -30,85 +29,100 @@ func TestStateStore_UpsertSecureVariables(t *testing.T) {
testState := testStateStore(t)
ws := memdb.NewWatchSet()
- svs, svm := mockSecureVariables(2)
- t.Log(printSecureVariables(svs))
+ svs := []*structs.SecureVariableEncrypted{
+ mock.SecureVariableEncrypted(),
+ mock.SecureVariableEncrypted(),
+ }
+ svs[0].Path = "aaaaa"
+ svs[1].Path = "bbbbb"
+
insertIndex := uint64(20)
- var expectedQuotaSize uint64
+ var expectedQuotaSize int
for _, v := range svs {
- expectedQuotaSize += uint64(len(v.Data))
+ expectedQuotaSize += len(v.Data)
}
// Ensure new secure variables are inserted as expected with their
// correct indexes, along with an update to the index table.
t.Run("1 create new variables", func(t *testing.T) {
-
// Perform the initial upsert of secure variables.
- err := testState.UpsertSecureVariables(structs.MsgTypeTestSetup, insertIndex, svs)
- require.NoError(t, err)
+ for _, sv := range svs {
+ insertIndex++
+ resp := testState.SVESet(insertIndex, &structs.SVApplyStateRequest{
+ Op: structs.SVOpSet,
+ Var: sv,
+ })
+ require.NoError(t, resp.Error)
+ }
// Check that the index for the table was modified as expected.
initialIndex, err := testState.Index(TableSecureVariables)
require.NoError(t, err)
require.Equal(t, insertIndex, initialIndex)
- // List all the secure variables in the table, so we can perform a
- // number of tests on the return array.
-
+ // List all the secure variables in the table
iter, err := testState.SecureVariables(ws)
require.NoError(t, err)
- // Count how many table entries we have, to ensure it is the expected
- // number.
- var count int
-
+ got := []*structs.SecureVariableEncrypted{}
for raw := iter.Next(); raw != nil; raw = iter.Next() {
- count++
-
- // Ensure the create and modify indexes are populated correctly.
sv := raw.(*structs.SecureVariableEncrypted)
- require.Equal(t, insertIndex, sv.CreateIndex, "incorrect create index", sv.Path)
- require.Equal(t, insertIndex, sv.ModifyIndex, "incorrect modify index", sv.Path)
- // update the mock element so the test element has the correct create/modify
- // indexes and times now that we have validated them
- nv := sv.Copy()
- svm[sv.Path] = &nv
+ var svCopy structs.SecureVariableEncrypted
+ svCopy = sv.Copy()
+ got = append(got, &svCopy)
}
- require.Equal(t, len(svs), count, "incorrect number of secure variables found")
+ require.Len(t, got, 2, "incorrect number of secure variables found")
+
+ // Ensure the create and modify indexes are populated correctly.
+ require.Equal(t, uint64(21), got[0].CreateIndex, "%s: incorrect create index", got[0].Path)
+ require.Equal(t, uint64(21), got[0].ModifyIndex, "%s: incorrect modify index", got[0].Path)
+ require.Equal(t, uint64(22), got[1].CreateIndex, "%s: incorrect create index", got[1].Path)
+ require.Equal(t, uint64(22), got[1].ModifyIndex, "%s: incorrect modify index", got[1].Path)
quotaUsed, err := testState.SecureVariablesQuotaByNamespace(ws, structs.DefaultNamespace)
require.NoError(t, err)
- require.Equal(t, expectedQuotaSize, quotaUsed.Size)
+ require.Equal(t, int64(expectedQuotaSize), quotaUsed.Size)
+
+ // update the mocks so the test element has the correct create/modify
+ // indexes and times now that we have validated them
+ svs = got
})
- svs = svm.List()
- t.Log(printSecureVariables(svs))
t.Run("1a fetch variable", func(t *testing.T) {
sve, err := testState.GetSecureVariable(ws, svs[0].Namespace, svs[0].Path)
require.NoError(t, err)
require.NotNil(t, sve)
})
- // Upsert the exact same secure variables without any
- // modification. In this case, the index table should not be
- // updated, indicating no write actually happened due to equality
- // checking.
+ // Upsert the exact same secure variables without any modification. In this
+ // case, the index table should not be updated, indicating no write actually
+ // happened due to equality checking.
t.Run("2 upsert same", func(t *testing.T) {
reInsertIndex := uint64(30)
- require.NoError(t, testState.UpsertSecureVariables(structs.MsgTypeTestSetup, reInsertIndex, svs))
+
+ for _, sv := range svs {
+ svReq := &structs.SVApplyStateRequest{
+ Op: structs.SVOpSet,
+ Var: sv,
+ }
+ reInsertIndex++
+ resp := testState.SVESet(reInsertIndex, svReq)
+ require.NoError(t, resp.Error)
+ }
+
reInsertActualIndex, err := testState.Index(TableSecureVariables)
require.NoError(t, err)
require.Equal(t, insertIndex, reInsertActualIndex, "index should not have changed")
quotaUsed, err := testState.SecureVariablesQuotaByNamespace(ws, structs.DefaultNamespace)
require.NoError(t, err)
- require.Equal(t, expectedQuotaSize, quotaUsed.Size)
+ require.Equal(t, int64(expectedQuotaSize), quotaUsed.Size)
})
- // Modify a single one of the previously inserted secure variables
- // and performs an upsert. This ensures the index table is
- // modified correctly and that each secure variable is updated, or
- // not, as expected.
+ // Modify a single one of the previously inserted secure variables and
+ // performs an upsert. This ensures the index table is modified correctly
+ // and that each secure variable is updated, or not, as expected.
t.Run("3 modify one", func(t *testing.T) {
sv1Update := svs[0].Copy()
sv1Update.KeyID = "sv1-update"
@@ -118,10 +132,13 @@ func TestStateStore_UpsertSecureVariables(t *testing.T) {
buf[len(buf)-1] = 'x'
sv1Update.Data = buf
- svs1Update := []*structs.SecureVariableEncrypted{&sv1Update}
-
update1Index := uint64(40)
- require.NoError(t, testState.UpsertSecureVariables(structs.MsgTypeTestSetup, update1Index, svs1Update))
+
+ resp := testState.SVESet(update1Index, &structs.SVApplyStateRequest{
+ Op: structs.SVOpSet,
+ Var: &sv1Update,
+ })
+ require.NoError(t, resp.Error)
// Check that the index for the table was modified as expected.
updateActualIndex, err := testState.Index(TableSecureVariables)
@@ -132,38 +149,28 @@ func TestStateStore_UpsertSecureVariables(t *testing.T) {
iter, err := testState.SecureVariables(ws)
require.NoError(t, err)
- // Iterate all the stored variables and assert they are as expected.
+ got := []*structs.SecureVariableEncrypted{}
+
+ // Iterate all the stored variables and assert indexes have been updated as expected
for raw := iter.Next(); raw != nil; raw = iter.Next() {
sv := raw.(*structs.SecureVariableEncrypted)
- t.Logf("S " + printSecureVariable(sv))
-
- var expectedModifyIndex uint64
-
- switch sv.Path {
- case sv1Update.Path:
- expectedModifyIndex = update1Index
- case svs[1].Path:
- expectedModifyIndex = insertIndex
- default:
- t.Errorf("unknown secure variable found: %s", sv.Path)
- continue
- }
- require.Equal(t, insertIndex, sv.CreateIndex, "incorrect create index", sv.Path)
- require.Equal(t, expectedModifyIndex, sv.ModifyIndex, "incorrect modify index", sv.Path)
- // update the mock element so the test element has the correct create/modify
- // indexes and times now that we have validated them
- nv := sv.Copy()
- svm[sv.Path] = &nv
+ var svCopy structs.SecureVariableEncrypted
+ svCopy = sv.Copy()
+ got = append(got, &svCopy)
}
+ require.Len(t, got, 2)
+ require.Equal(t, update1Index, got[0].ModifyIndex)
+ require.Equal(t, insertIndex, got[1].ModifyIndex)
+
+ // update the mocks so the test element has the correct create/modify
+ // indexes and times now that we have validated them
+ svs = got
quotaUsed, err := testState.SecureVariablesQuotaByNamespace(ws, structs.DefaultNamespace)
require.NoError(t, err)
- require.Equal(t, expectedQuotaSize+1, quotaUsed.Size)
+ require.Equal(t, int64(expectedQuotaSize+1), quotaUsed.Size)
})
- svs = svm.List()
- t.Log(printSecureVariables(svs))
-
// Modify the second variable but send an upsert request that
// includes this and the already modified variable.
t.Run("4 upsert other", func(t *testing.T) {
@@ -171,11 +178,12 @@ func TestStateStore_UpsertSecureVariables(t *testing.T) {
sv2 := svs[1].Copy()
sv2.KeyID = "sv2-update"
sv2.ModifyIndex = update2Index
- svs2Update := []*structs.SecureVariableEncrypted{svs[0], &sv2}
- t.Logf("* " + printSecureVariable(svs[0]))
- t.Logf("* " + printSecureVariable(&sv2))
- require.NoError(t, testState.UpsertSecureVariables(structs.MsgTypeTestSetup, update2Index, svs2Update))
+ resp := testState.SVESet(update2Index, &structs.SVApplyStateRequest{
+ Op: structs.SVOpSet,
+ Var: &sv2,
+ })
+ require.NoError(t, resp.Error)
// Check that the index for the table was modified as expected.
update2ActualIndex, err := testState.Index(TableSecureVariables)
@@ -186,40 +194,23 @@ func TestStateStore_UpsertSecureVariables(t *testing.T) {
iter, err := testState.SecureVariables(ws)
require.NoError(t, err)
- // Iterate all the stored variables and assert they are as expected.
+ got := []structs.SecureVariableEncrypted{}
+
+ // Iterate all the stored variables and assert indexes have been updated as expected
for raw := iter.Next(); raw != nil; raw = iter.Next() {
sv := raw.(*structs.SecureVariableEncrypted)
- t.Logf("S " + printSecureVariable(sv))
-
- var (
- expectedModifyIndex uint64
- expectedSV *structs.SecureVariableEncrypted
- )
-
- switch sv.Path {
- case sv2.Path:
- expectedModifyIndex = update2Index
- expectedSV = &sv2
- case svs[0].Path:
- expectedModifyIndex = svs[0].ModifyIndex
- expectedSV = svs[0]
- default:
- t.Errorf("unknown secure variable found: %s", sv.Path)
- continue
- }
- require.Equal(t, insertIndex, sv.CreateIndex, "%s: incorrect create index", sv.Path)
- require.Equal(t, expectedModifyIndex, sv.ModifyIndex, "%s: incorrect modify index", sv.Path)
-
- // update the mock element so the test element has the correct create/modify
- // indexes and times now that we have validated them
- expectedSV.ModifyTime = sv.ModifyTime
-
- require.True(t, expectedSV.Equals(*sv), "Secure Variables are not equal:\n expected:%s\n received:%s\n", printSecureVariable(expectedSV), printSecureVariable(sv))
+ got = append(got, sv.Copy())
}
+ require.Len(t, got, 2)
+ require.Equal(t, svs[0].ModifyIndex, got[0].ModifyIndex)
+ require.Equal(t, update2Index, got[1].ModifyIndex)
+
+ require.True(t, svs[0].Equals(got[0]))
+ require.True(t, sv2.Equals(got[1]))
quotaUsed, err := testState.SecureVariablesQuotaByNamespace(ws, structs.DefaultNamespace)
require.NoError(t, err)
- require.Equal(t, expectedQuotaSize+1, quotaUsed.Size)
+ require.Equal(t, int64(expectedQuotaSize+1), quotaUsed.Size)
})
}
@@ -229,13 +220,22 @@ func TestStateStore_DeleteSecureVariable(t *testing.T) {
testState := testStateStore(t)
// Generate some test secure variables that we will use and modify throughout.
- svs, _ := mockSecureVariables(2)
+ svs := []*structs.SecureVariableEncrypted{
+ mock.SecureVariableEncrypted(),
+ mock.SecureVariableEncrypted(),
+ }
+ svs[0].Path = "aaaaa"
+ svs[1].Path = "bbbbb"
+
initialIndex := uint64(10)
t.Run("1 delete a secure variable that does not exist", func(t *testing.T) {
- err := testState.DeleteSecureVariables(
- structs.MsgTypeTestSetup, initialIndex, svs[0].Namespace, []string{svs[0].Path})
- require.EqualError(t, err, "secure variable not found")
+
+ resp := testState.SVEDelete(initialIndex, &structs.SVApplyStateRequest{
+ Op: structs.SVOpDelete,
+ Var: svs[0],
+ })
+ require.NoError(t, resp.Error, "deleting non-existing secure var is not an error")
actualInitialIndex, err := testState.Index(TableSecureVariables)
require.NoError(t, err)
@@ -250,13 +250,28 @@ func TestStateStore_DeleteSecureVariable(t *testing.T) {
// remaining is left as expected.
t.Run("2 upsert variable and delete", func(t *testing.T) {
- require.NoError(t, testState.UpsertSecureVariables(
- structs.MsgTypeTestSetup, initialIndex, svs))
+ ns := mock.Namespace()
+ ns.Name = svs[0].Namespace
+ require.NoError(t, testState.UpsertNamespaces(initialIndex, []*structs.Namespace{ns}))
+
+ for _, sv := range svs {
+ svReq := &structs.SVApplyStateRequest{
+ Op: structs.SVOpSet,
+ Var: sv,
+ }
+ initialIndex++
+ resp := testState.SVESet(initialIndex, svReq)
+ require.NoError(t, resp.Error)
+ }
// Perform the delete.
delete1Index := uint64(20)
- require.NoError(t, testState.DeleteSecureVariables(
- structs.MsgTypeTestSetup, delete1Index, svs[0].Namespace, []string{svs[0].Path}))
+
+ resp := testState.SVEDelete(delete1Index, &structs.SVApplyStateRequest{
+ Op: structs.SVOpDelete,
+ Var: svs[0],
+ })
+ require.NoError(t, resp.Error)
// Check that the index for the table was modified as expected.
actualDelete1Index, err := testState.Index(TableSecureVariables)
@@ -270,25 +285,29 @@ func TestStateStore_DeleteSecureVariable(t *testing.T) {
require.NoError(t, err)
var delete1Count int
- var expectedQuotaSize uint64
+ var expectedQuotaSize int
// Iterate all the stored variables and assert we have the expected
// number.
for raw := iter.Next(); raw != nil; raw = iter.Next() {
delete1Count++
v := raw.(*structs.SecureVariableEncrypted)
- expectedQuotaSize += uint64(len(v.Data))
+ expectedQuotaSize += len(v.Data)
}
require.Equal(t, 1, delete1Count, "unexpected number of variables in table")
quotaUsed, err := testState.SecureVariablesQuotaByNamespace(ws, structs.DefaultNamespace)
require.NoError(t, err)
- require.Equal(t, expectedQuotaSize, quotaUsed.Size)
+ require.Equal(t, int64(expectedQuotaSize), quotaUsed.Size)
})
t.Run("3 delete remaining variable", func(t *testing.T) {
delete2Index := uint64(30)
- require.NoError(t, testState.DeleteSecureVariable(
- delete2Index, svs[1].Namespace, svs[1].Path))
+
+ resp := testState.SVEDelete(delete2Index, &structs.SVApplyStateRequest{
+ Op: structs.SVOpDelete,
+ Var: svs[1],
+ })
+ require.NoError(t, resp.Error)
// Check that the index for the table was modified as expected.
actualDelete2Index, err := testState.Index(TableSecureVariables)
@@ -310,7 +329,7 @@ func TestStateStore_DeleteSecureVariable(t *testing.T) {
quotaUsed, err := testState.SecureVariablesQuotaByNamespace(ws, structs.DefaultNamespace)
require.NoError(t, err)
- require.Equal(t, uint64(0), quotaUsed.Size)
+ require.Equal(t, int64(0), quotaUsed.Size)
})
}
@@ -318,11 +337,29 @@ func TestStateStore_GetSecureVariables(t *testing.T) {
ci.Parallel(t)
testState := testStateStore(t)
- // Generate some test secure variables and upsert them.
- svs, _ := mockSecureVariables(2)
- svs[0].Namespace = "~*magical*~"
+ ns := mock.Namespace()
+ ns.Name = "~*magical*~"
initialIndex := uint64(10)
- require.NoError(t, testState.UpsertSecureVariables(structs.MsgTypeTestSetup, initialIndex, svs))
+ require.NoError(t, testState.UpsertNamespaces(initialIndex, []*structs.Namespace{ns}))
+
+ // Generate some test secure variables in different namespaces and upsert them.
+ svs := []*structs.SecureVariableEncrypted{
+ mock.SecureVariableEncrypted(),
+ mock.SecureVariableEncrypted(),
+ }
+ svs[0].Path = "aaaaa"
+ svs[0].Namespace = "~*magical*~"
+ svs[1].Path = "bbbbb"
+
+ for _, sv := range svs {
+ svReq := &structs.SVApplyStateRequest{
+ Op: structs.SVOpSet,
+ Var: sv,
+ }
+ initialIndex++
+ resp := testState.SVESet(initialIndex, svReq)
+ require.NoError(t, resp.Error)
+ }
// Look up secure variables using the namespace of the first mock variable.
ws := memdb.NewWatchSet()
@@ -332,13 +369,13 @@ func TestStateStore_GetSecureVariables(t *testing.T) {
var count1 int
for raw := iter.Next(); raw != nil; raw = iter.Next() {
- count1++
sv := raw.(*structs.SecureVariableEncrypted)
- t.Logf("- sv: n=%q p=%q ci=%v mi=%v ed.ki=%q", sv.Namespace, sv.Path, sv.CreateIndex, sv.ModifyIndex, sv.KeyID)
- require.Equal(t, initialIndex, sv.CreateIndex, "incorrect create index", sv.Path)
- require.Equal(t, initialIndex, sv.ModifyIndex, "incorrect modify index", sv.Path)
require.Equal(t, svs[0].Namespace, sv.Namespace)
+ require.Equal(t, uint64(11), sv.CreateIndex, "%s incorrect create index", sv.Path)
+ require.Equal(t, uint64(11), sv.ModifyIndex, "%s incorrect modify index", sv.Path)
+ count1++
}
+
require.Equal(t, 1, count1)
// Look up variables using the namespace of the second mock variable.
@@ -350,9 +387,8 @@ func TestStateStore_GetSecureVariables(t *testing.T) {
for raw := iter.Next(); raw != nil; raw = iter.Next() {
count2++
sv := raw.(*structs.SecureVariableEncrypted)
- t.Logf("- sv: n=%q p=%q ci=%v mi=%v ed.ki=%q", sv.Namespace, sv.Path, sv.CreateIndex, sv.ModifyIndex, sv.KeyID)
- require.Equal(t, initialIndex, sv.CreateIndex, "incorrect create index", sv.Path)
- require.Equal(t, initialIndex, sv.ModifyIndex, "incorrect modify index", sv.Path)
+ require.Equal(t, initialIndex, sv.CreateIndex, "%s incorrect create index", sv.Path)
+ require.Equal(t, initialIndex, sv.ModifyIndex, "%s incorrect modify index", sv.Path)
require.Equal(t, svs[1].Namespace, sv.Namespace)
}
require.Equal(t, 1, count2)
@@ -375,7 +411,12 @@ func TestStateStore_ListSecureVariablesByNamespaceAndPrefix(t *testing.T) {
testState := testStateStore(t)
// Generate some test secure variables and upsert them.
- svs, _ := mockSecureVariables(6)
+ svs := []*structs.SecureVariableEncrypted{}
+ for i := 0; i < 6; i++ {
+ sv := mock.SecureVariableEncrypted()
+ svs = append(svs, sv)
+ }
+
svs[0].Path = "a/b"
svs[1].Path = "a/b/c"
svs[2].Path = "unrelated/b/c"
@@ -386,8 +427,20 @@ func TestStateStore_ListSecureVariablesByNamespaceAndPrefix(t *testing.T) {
svs[5].Namespace = "other"
svs[5].Path = "a/z/z"
+ ns := mock.Namespace()
+ ns.Name = "other"
initialIndex := uint64(10)
- require.NoError(t, testState.UpsertSecureVariables(structs.MsgTypeTestSetup, initialIndex, svs))
+ require.NoError(t, testState.UpsertNamespaces(initialIndex, []*structs.Namespace{ns}))
+
+ for _, sv := range svs {
+ svReq := &structs.SVApplyStateRequest{
+ Op: structs.SVOpSet,
+ Var: sv,
+ }
+ initialIndex++
+ resp := testState.SVESet(initialIndex, svReq)
+ require.NoError(t, resp.Error)
+ }
t.Run("ByNamespace", func(t *testing.T) {
testCases := []struct {
@@ -422,9 +475,6 @@ func TestStateStore_ListSecureVariablesByNamespaceAndPrefix(t *testing.T) {
for raw := iter.Next(); raw != nil; raw = iter.Next() {
count++
sv := raw.(*structs.SecureVariableEncrypted)
- t.Logf("- sv: n=%q p=%q ci=%v mi=%v ed.ki=%q", sv.Namespace, sv.Path, sv.CreateIndex, sv.ModifyIndex, sv.KeyID)
- require.Equal(t, initialIndex, sv.CreateIndex, "incorrect create index", sv.Path)
- require.Equal(t, initialIndex, sv.ModifyIndex, "incorrect modify index", sv.Path)
require.Equal(t, tC.namespace, sv.Namespace)
}
})
@@ -480,9 +530,6 @@ func TestStateStore_ListSecureVariablesByNamespaceAndPrefix(t *testing.T) {
for raw := iter.Next(); raw != nil; raw = iter.Next() {
count++
sv := raw.(*structs.SecureVariableEncrypted)
- t.Logf("- sv: n=%q p=%q ci=%v mi=%v ed.ki=%q", sv.Namespace, sv.Path, sv.CreateIndex, sv.ModifyIndex, sv.KeyID)
- require.Equal(t, initialIndex, sv.CreateIndex, "incorrect create index", sv.Path)
- require.Equal(t, initialIndex, sv.ModifyIndex, "incorrect modify index", sv.Path)
require.Equal(t, tC.namespace, sv.Namespace)
require.True(t, strings.HasPrefix(sv.Path, tC.prefix))
}
@@ -524,9 +571,6 @@ func TestStateStore_ListSecureVariablesByNamespaceAndPrefix(t *testing.T) {
for raw := iter.Next(); raw != nil; raw = iter.Next() {
count++
sv := raw.(*structs.SecureVariableEncrypted)
- t.Logf("- sv: n=%q p=%q ci=%v mi=%v ed.ki=%q", sv.Namespace, sv.Path, sv.CreateIndex, sv.ModifyIndex, sv.KeyID)
- require.Equal(t, initialIndex, sv.CreateIndex, "incorrect create index", sv.Path)
- require.Equal(t, initialIndex, sv.ModifyIndex, "incorrect modify index", sv.Path)
require.True(t, strings.HasPrefix(sv.Path, tC.prefix))
}
require.Equal(t, tC.expectedCount, count)
@@ -539,7 +583,13 @@ func TestStateStore_ListSecureVariablesByKeyID(t *testing.T) {
testState := testStateStore(t)
// Generate some test secure variables and upsert them.
- svs, _ := mockSecureVariables(7)
+ svs := []*structs.SecureVariableEncrypted{}
+ for i := 0; i < 7; i++ {
+ sv := mock.SecureVariableEncrypted()
+ sv.Path = uuid.Generate()
+ svs = append(svs, sv)
+ }
+
keyID := uuid.Generate()
expectedForKey := []string{}
@@ -552,8 +602,16 @@ func TestStateStore_ListSecureVariablesByKeyID(t *testing.T) {
expectedOrphaned := []string{svs[5].Path, svs[6].Path}
initialIndex := uint64(10)
- require.NoError(t, testState.UpsertSecureVariables(
- structs.MsgTypeTestSetup, initialIndex, svs))
+
+ for _, sv := range svs {
+ svReq := &structs.SVApplyStateRequest{
+ Op: structs.SVOpSet,
+ Var: sv,
+ }
+ initialIndex++
+ resp := testState.SVESet(initialIndex, svReq)
+ require.NoError(t, resp.Error)
+ }
ws := memdb.NewWatchSet()
iter, err := testState.GetSecureVariablesByKeyID(ws, keyID)
@@ -570,43 +628,6 @@ func TestStateStore_ListSecureVariablesByKeyID(t *testing.T) {
require.Equal(t, 5, count)
}
-// mockSecureVariables returns a random number of secure variables between min
-// and max inclusive.
-func mockSecureVariables(count int) (
- []*structs.SecureVariableEncrypted, secureVariableMocks) {
- var svm secureVariableMocks = make(map[string]*structs.SecureVariableEncrypted, count)
- for i := 0; i < count; i++ {
- nv := mock.SecureVariableEncrypted()
- // There is an extremely rare chance of path collision because the mock
- // secure variables generate their paths randomly. This check will add
- // an extra component on conflict to (ideally) disambiguate them.
- if _, found := svm[nv.Path]; found {
- nv.Path = nv.Path + "/" + fmt.Sprint(time.Now().UnixNano())
- }
- svm[nv.Path] = nv
- }
- return svm.List(), svm
-}
-
-type secureVariableMocks map[string]*structs.SecureVariableEncrypted
-
-func (svm secureVariableMocks) List() []*structs.SecureVariableEncrypted {
- out := make([]*structs.SecureVariableEncrypted, len(svm))
- i := 0
- for _, v := range svm {
- out[i] = v
- i++
- }
- // objects will always come out of state store in namespace, path order.
- sort.SliceStable(out, func(i, j int) bool {
- if out[i].Namespace != out[j].Namespace {
- return out[i].Namespace < out[j].Namespace
- }
- return out[i].Path < out[j].Path
- })
- return out
-}
-
func printSecureVariable(tsv *structs.SecureVariableEncrypted) string {
b, _ := json.Marshal(tsv)
return string(b)
diff --git a/nomad/state/state_store_test.go b/nomad/state/state_store_test.go
index 8d0427fd000..739c7d2dbbe 100644
--- a/nomad/state/state_store_test.go
+++ b/nomad/state/state_store_test.go
@@ -11,7 +11,7 @@ import (
"github.com/hashicorp/go-memdb"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
@@ -1054,7 +1054,12 @@ func TestStateStore_DeleteNamespaces_SecureVariables(t *testing.T) {
sv := mock.SecureVariableEncrypted()
sv.Namespace = ns.Name
- require.NoError(t, state.UpsertSecureVariables(structs.MsgTypeTestSetup, 1001, []*structs.SecureVariableEncrypted{sv}))
+
+ resp := state.SVESet(1001, &structs.SVApplyStateRequest{
+ Op: structs.SVOpSet,
+ Var: sv,
+ })
+ require.NoError(t, resp.Error)
// Create a watchset so we can test that delete fires the watch
ws := memdb.NewWatchSet()
@@ -5163,7 +5168,7 @@ func TestStateStore_UpdateAllocsFromClient_Deployment(t *testing.T) {
JobID: alloc.JobID,
TaskGroup: alloc.TaskGroup,
DeploymentStatus: &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
Timestamp: healthy,
},
}
@@ -5208,7 +5213,7 @@ func TestStateStore_UpdateAllocsFromClient_DeploymentStateMerges(t *testing.T) {
JobID: alloc.JobID,
TaskGroup: alloc.TaskGroup,
DeploymentStatus: &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
Canary: false,
},
}
@@ -5679,10 +5684,10 @@ func TestStateStore_UpdateAllocDesiredTransition(t *testing.T) {
require.Nil(state.UpsertAllocs(structs.MsgTypeTestSetup, 1000, []*structs.Allocation{alloc}))
t1 := &structs.DesiredTransition{
- Migrate: helper.BoolToPtr(true),
+ Migrate: pointer.Of(true),
}
t2 := &structs.DesiredTransition{
- Migrate: helper.BoolToPtr(false),
+ Migrate: pointer.Of(false),
}
eval := &structs.Evaluation{
ID: uuid.Generate(),
@@ -7409,7 +7414,7 @@ func TestStateStore_UpsertDeploymentPromotion_Unhealthy(t *testing.T) {
c3.JobID = j.ID
c3.DeploymentID = d.ID
c3.DesiredStatus = structs.AllocDesiredStatusStop
- c3.DeploymentStatus = &structs.AllocDeploymentStatus{Healthy: helper.BoolToPtr(true)}
+ c3.DeploymentStatus = &structs.AllocDeploymentStatus{Healthy: pointer.Of(true)}
d.TaskGroups[c3.TaskGroup].PlacedCanaries = append(d.TaskGroups[c3.TaskGroup].PlacedCanaries, c3.ID)
require.Nil(state.UpsertAllocs(structs.MsgTypeTestSetup, 3, []*structs.Allocation{c1, c2, c3}))
@@ -7495,7 +7500,7 @@ func TestStateStore_UpsertDeploymentPromotion_All(t *testing.T) {
c1.DeploymentID = d.ID
d.TaskGroups[c1.TaskGroup].PlacedCanaries = append(d.TaskGroups[c1.TaskGroup].PlacedCanaries, c1.ID)
c1.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
}
c2 := mock.Alloc()
c2.JobID = j.ID
@@ -7503,7 +7508,7 @@ func TestStateStore_UpsertDeploymentPromotion_All(t *testing.T) {
d.TaskGroups[c2.TaskGroup].PlacedCanaries = append(d.TaskGroups[c2.TaskGroup].PlacedCanaries, c2.ID)
c2.TaskGroup = tg2.Name
c2.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
}
if err := state.UpsertAllocs(structs.MsgTypeTestSetup, 3, []*structs.Allocation{c1, c2}); err != nil {
@@ -7590,7 +7595,7 @@ func TestStateStore_UpsertDeploymentPromotion_Subset(t *testing.T) {
c1.DeploymentID = d.ID
d.TaskGroups[c1.TaskGroup].PlacedCanaries = append(d.TaskGroups[c1.TaskGroup].PlacedCanaries, c1.ID)
c1.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
Canary: true,
}
@@ -7601,7 +7606,7 @@ func TestStateStore_UpsertDeploymentPromotion_Subset(t *testing.T) {
d.TaskGroups[c2.TaskGroup].PlacedCanaries = append(d.TaskGroups[c2.TaskGroup].PlacedCanaries, c2.ID)
c2.TaskGroup = tg2.Name
c2.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
Canary: true,
}
@@ -7610,7 +7615,7 @@ func TestStateStore_UpsertDeploymentPromotion_Subset(t *testing.T) {
c3.DeploymentID = d.ID
d.TaskGroups[c3.TaskGroup].PlacedCanaries = append(d.TaskGroups[c3.TaskGroup].PlacedCanaries, c3.ID)
c3.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(false),
+ Healthy: pointer.Of(false),
Canary: true,
}
@@ -7747,7 +7752,7 @@ func TestStateStore_UpsertDeploymentAlloc_Canaries(t *testing.T) {
a.JobID = job.ID
a.DeploymentID = d1.ID
a.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(false),
+ Healthy: pointer.Of(false),
Canary: true,
}
require.NoError(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 4, []*structs.Allocation{a}))
@@ -7765,7 +7770,7 @@ func TestStateStore_UpsertDeploymentAlloc_Canaries(t *testing.T) {
b.JobID = job.ID
b.DeploymentID = d1.ID
b.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(false),
+ Healthy: pointer.Of(false),
Canary: false,
}
require.NoError(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 4, []*structs.Allocation{b}))
@@ -7786,7 +7791,7 @@ func TestStateStore_UpsertDeploymentAlloc_Canaries(t *testing.T) {
c.JobID = job.ID
c.DeploymentID = d2.ID
c.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(false),
+ Healthy: pointer.Of(false),
Canary: true,
}
require.NoError(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 6, []*structs.Allocation{c}))
@@ -7817,7 +7822,7 @@ func TestStateStore_UpsertDeploymentAlloc_NoCanaries(t *testing.T) {
a.JobID = job.ID
a.DeploymentID = d1.ID
a.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
Canary: false,
}
require.NoError(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 4, []*structs.Allocation{a}))
diff --git a/nomad/stream/event_broker.go b/nomad/stream/event_broker.go
index e619968e0ab..da5f8f0abae 100644
--- a/nomad/stream/event_broker.go
+++ b/nomad/stream/event_broker.go
@@ -43,7 +43,7 @@ type EventBroker struct {
aclDelegate ACLDelegate
aclCache *lru.TwoQueueCache
- aclCh chan *structs.Event
+ aclCh chan structs.Event
logger hclog.Logger
}
@@ -72,7 +72,7 @@ func NewEventBroker(ctx context.Context, aclDelegate ACLDelegate, cfg EventBroke
logger: cfg.Logger.Named("event_broker"),
eventBuf: buffer,
publishCh: make(chan *structs.Events, 64),
- aclCh: make(chan *structs.Event, 10),
+ aclCh: make(chan structs.Event, 10),
aclDelegate: aclDelegate,
aclCache: aclCache,
subscriptions: &subscriptions{
@@ -101,7 +101,7 @@ func (e *EventBroker) Publish(events *structs.Events) {
// updated ACL Token or Policy
for _, event := range events.Events {
if event.Topic == structs.TopicACLToken || event.Topic == structs.TopicACLPolicy {
- e.aclCh <- &event
+ e.aclCh <- event
}
}
diff --git a/nomad/stream/subscription_test.go b/nomad/stream/subscription_test.go
index d7bb9be368d..6f31a320451 100644
--- a/nomad/stream/subscription_test.go
+++ b/nomad/stream/subscription_test.go
@@ -190,7 +190,7 @@ func TestFilter_NamespaceAll(t *testing.T) {
func TestFilter_FilterKeys(t *testing.T) {
ci.Parallel(t)
-
+
events := make([]structs.Event, 0, 5)
events = append(events, structs.Event{Topic: "Test", Key: "One", FilterKeys: []string{"extra-key"}}, structs.Event{Topic: "Test", Key: "Two"}, structs.Event{Topic: "Test", Key: "Two"})
diff --git a/nomad/structs/config/artifact.go b/nomad/structs/config/artifact.go
index 732b4ce8732..1b942805c0c 100644
--- a/nomad/structs/config/artifact.go
+++ b/nomad/structs/config/artifact.go
@@ -6,7 +6,7 @@ import (
"time"
"github.com/dustin/go-humanize"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
)
// ArtifactConfig is the configuration specific to the Artifact stanza
@@ -43,22 +43,22 @@ func (a *ArtifactConfig) Copy() *ArtifactConfig {
newCopy := &ArtifactConfig{}
if a.HTTPReadTimeout != nil {
- newCopy.HTTPReadTimeout = helper.StringToPtr(*a.HTTPReadTimeout)
+ newCopy.HTTPReadTimeout = pointer.Of(*a.HTTPReadTimeout)
}
if a.HTTPMaxSize != nil {
- newCopy.HTTPMaxSize = helper.StringToPtr(*a.HTTPMaxSize)
+ newCopy.HTTPMaxSize = pointer.Of(*a.HTTPMaxSize)
}
if a.GCSTimeout != nil {
- newCopy.GCSTimeout = helper.StringToPtr(*a.GCSTimeout)
+ newCopy.GCSTimeout = pointer.Of(*a.GCSTimeout)
}
if a.GitTimeout != nil {
- newCopy.GitTimeout = helper.StringToPtr(*a.GitTimeout)
+ newCopy.GitTimeout = pointer.Of(*a.GitTimeout)
}
if a.HgTimeout != nil {
- newCopy.HgTimeout = helper.StringToPtr(*a.HgTimeout)
+ newCopy.HgTimeout = pointer.Of(*a.HgTimeout)
}
if a.S3Timeout != nil {
- newCopy.S3Timeout = helper.StringToPtr(*a.S3Timeout)
+ newCopy.S3Timeout = pointer.Of(*a.S3Timeout)
}
return newCopy
@@ -74,22 +74,22 @@ func (a *ArtifactConfig) Merge(o *ArtifactConfig) *ArtifactConfig {
newCopy := a.Copy()
if o.HTTPReadTimeout != nil {
- newCopy.HTTPReadTimeout = helper.StringToPtr(*o.HTTPReadTimeout)
+ newCopy.HTTPReadTimeout = pointer.Of(*o.HTTPReadTimeout)
}
if o.HTTPMaxSize != nil {
- newCopy.HTTPMaxSize = helper.StringToPtr(*o.HTTPMaxSize)
+ newCopy.HTTPMaxSize = pointer.Of(*o.HTTPMaxSize)
}
if o.GCSTimeout != nil {
- newCopy.GCSTimeout = helper.StringToPtr(*o.GCSTimeout)
+ newCopy.GCSTimeout = pointer.Of(*o.GCSTimeout)
}
if o.GitTimeout != nil {
- newCopy.GitTimeout = helper.StringToPtr(*o.GitTimeout)
+ newCopy.GitTimeout = pointer.Of(*o.GitTimeout)
}
if o.HgTimeout != nil {
- newCopy.HgTimeout = helper.StringToPtr(*o.HgTimeout)
+ newCopy.HgTimeout = pointer.Of(*o.HgTimeout)
}
if o.S3Timeout != nil {
- newCopy.S3Timeout = helper.StringToPtr(*o.S3Timeout)
+ newCopy.S3Timeout = pointer.Of(*o.S3Timeout)
}
return newCopy
@@ -161,26 +161,26 @@ func DefaultArtifactConfig() *ArtifactConfig {
return &ArtifactConfig{
// Read timeout for HTTP operations. Must be long enough to
// accommodate large/slow downloads.
- HTTPReadTimeout: helper.StringToPtr("30m"),
+ HTTPReadTimeout: pointer.Of("30m"),
// Maximum download size. Must be large enough to accommodate
// large downloads.
- HTTPMaxSize: helper.StringToPtr("100GB"),
+ HTTPMaxSize: pointer.Of("100GB"),
// Timeout for GCS operations. Must be long enough to
// accommodate large/slow downloads.
- GCSTimeout: helper.StringToPtr("30m"),
+ GCSTimeout: pointer.Of("30m"),
// Timeout for Git operations. Must be long enough to
// accommodate large/slow clones.
- GitTimeout: helper.StringToPtr("30m"),
+ GitTimeout: pointer.Of("30m"),
// Timeout for Hg operations. Must be long enough to
// accommodate large/slow clones.
- HgTimeout: helper.StringToPtr("30m"),
+ HgTimeout: pointer.Of("30m"),
// Timeout for S3 operations. Must be long enough to
// accommodate large/slow downloads.
- S3Timeout: helper.StringToPtr("30m"),
+ S3Timeout: pointer.Of("30m"),
}
}
diff --git a/nomad/structs/config/artifact_test.go b/nomad/structs/config/artifact_test.go
index e8c78d1f6cd..f1ba29a0b7f 100644
--- a/nomad/structs/config/artifact_test.go
+++ b/nomad/structs/config/artifact_test.go
@@ -4,7 +4,7 @@ import (
"testing"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/stretchr/testify/require"
)
@@ -15,10 +15,10 @@ func TestArtifactConfig_Copy(t *testing.T) {
b := a.Copy()
require.Equal(t, a, b)
- b.HTTPReadTimeout = helper.StringToPtr("5m")
- b.HTTPMaxSize = helper.StringToPtr("2MB")
- b.GitTimeout = helper.StringToPtr("3m")
- b.HgTimeout = helper.StringToPtr("2m")
+ b.HTTPReadTimeout = pointer.Of("5m")
+ b.HTTPMaxSize = pointer.Of("2MB")
+ b.GitTimeout = pointer.Of("3m")
+ b.HgTimeout = pointer.Of("2m")
require.NotEqual(t, a, b)
}
@@ -34,68 +34,68 @@ func TestArtifactConfig_Merge(t *testing.T) {
{
name: "merge all fields",
source: &ArtifactConfig{
- HTTPReadTimeout: helper.StringToPtr("30m"),
- HTTPMaxSize: helper.StringToPtr("100GB"),
- GCSTimeout: helper.StringToPtr("30m"),
- GitTimeout: helper.StringToPtr("30m"),
- HgTimeout: helper.StringToPtr("30m"),
- S3Timeout: helper.StringToPtr("30m"),
+ HTTPReadTimeout: pointer.Of("30m"),
+ HTTPMaxSize: pointer.Of("100GB"),
+ GCSTimeout: pointer.Of("30m"),
+ GitTimeout: pointer.Of("30m"),
+ HgTimeout: pointer.Of("30m"),
+ S3Timeout: pointer.Of("30m"),
},
other: &ArtifactConfig{
- HTTPReadTimeout: helper.StringToPtr("5m"),
- HTTPMaxSize: helper.StringToPtr("2GB"),
- GCSTimeout: helper.StringToPtr("1m"),
- GitTimeout: helper.StringToPtr("2m"),
- HgTimeout: helper.StringToPtr("3m"),
- S3Timeout: helper.StringToPtr("4m"),
+ HTTPReadTimeout: pointer.Of("5m"),
+ HTTPMaxSize: pointer.Of("2GB"),
+ GCSTimeout: pointer.Of("1m"),
+ GitTimeout: pointer.Of("2m"),
+ HgTimeout: pointer.Of("3m"),
+ S3Timeout: pointer.Of("4m"),
},
expected: &ArtifactConfig{
- HTTPReadTimeout: helper.StringToPtr("5m"),
- HTTPMaxSize: helper.StringToPtr("2GB"),
- GCSTimeout: helper.StringToPtr("1m"),
- GitTimeout: helper.StringToPtr("2m"),
- HgTimeout: helper.StringToPtr("3m"),
- S3Timeout: helper.StringToPtr("4m"),
+ HTTPReadTimeout: pointer.Of("5m"),
+ HTTPMaxSize: pointer.Of("2GB"),
+ GCSTimeout: pointer.Of("1m"),
+ GitTimeout: pointer.Of("2m"),
+ HgTimeout: pointer.Of("3m"),
+ S3Timeout: pointer.Of("4m"),
},
},
{
name: "null source",
source: nil,
other: &ArtifactConfig{
- HTTPReadTimeout: helper.StringToPtr("5m"),
- HTTPMaxSize: helper.StringToPtr("2GB"),
- GCSTimeout: helper.StringToPtr("1m"),
- GitTimeout: helper.StringToPtr("2m"),
- HgTimeout: helper.StringToPtr("3m"),
- S3Timeout: helper.StringToPtr("4m"),
+ HTTPReadTimeout: pointer.Of("5m"),
+ HTTPMaxSize: pointer.Of("2GB"),
+ GCSTimeout: pointer.Of("1m"),
+ GitTimeout: pointer.Of("2m"),
+ HgTimeout: pointer.Of("3m"),
+ S3Timeout: pointer.Of("4m"),
},
expected: &ArtifactConfig{
- HTTPReadTimeout: helper.StringToPtr("5m"),
- HTTPMaxSize: helper.StringToPtr("2GB"),
- GCSTimeout: helper.StringToPtr("1m"),
- GitTimeout: helper.StringToPtr("2m"),
- HgTimeout: helper.StringToPtr("3m"),
- S3Timeout: helper.StringToPtr("4m"),
+ HTTPReadTimeout: pointer.Of("5m"),
+ HTTPMaxSize: pointer.Of("2GB"),
+ GCSTimeout: pointer.Of("1m"),
+ GitTimeout: pointer.Of("2m"),
+ HgTimeout: pointer.Of("3m"),
+ S3Timeout: pointer.Of("4m"),
},
},
{
name: "null other",
source: &ArtifactConfig{
- HTTPReadTimeout: helper.StringToPtr("30m"),
- HTTPMaxSize: helper.StringToPtr("100GB"),
- GCSTimeout: helper.StringToPtr("30m"),
- GitTimeout: helper.StringToPtr("30m"),
- HgTimeout: helper.StringToPtr("30m"),
- S3Timeout: helper.StringToPtr("30m"),
+ HTTPReadTimeout: pointer.Of("30m"),
+ HTTPMaxSize: pointer.Of("100GB"),
+ GCSTimeout: pointer.Of("30m"),
+ GitTimeout: pointer.Of("30m"),
+ HgTimeout: pointer.Of("30m"),
+ S3Timeout: pointer.Of("30m"),
},
other: nil,
expected: &ArtifactConfig{
- HTTPReadTimeout: helper.StringToPtr("30m"),
- HTTPMaxSize: helper.StringToPtr("100GB"),
- GCSTimeout: helper.StringToPtr("30m"),
- GitTimeout: helper.StringToPtr("30m"),
- HgTimeout: helper.StringToPtr("30m"),
- S3Timeout: helper.StringToPtr("30m"),
+ HTTPReadTimeout: pointer.Of("30m"),
+ HTTPMaxSize: pointer.Of("100GB"),
+ GCSTimeout: pointer.Of("30m"),
+ GitTimeout: pointer.Of("30m"),
+ HgTimeout: pointer.Of("30m"),
+ S3Timeout: pointer.Of("30m"),
},
},
}
@@ -131,28 +131,28 @@ func TestArtifactConfig_Validate(t *testing.T) {
{
name: "http read timeout is invalid",
config: func(a *ArtifactConfig) {
- a.HTTPReadTimeout = helper.StringToPtr("invalid")
+ a.HTTPReadTimeout = pointer.Of("invalid")
},
expectedError: "http_read_timeout not a valid duration",
},
{
name: "http read timeout is empty",
config: func(a *ArtifactConfig) {
- a.HTTPReadTimeout = helper.StringToPtr("")
+ a.HTTPReadTimeout = pointer.Of("")
},
expectedError: "http_read_timeout not a valid duration",
},
{
name: "http read timeout is zero",
config: func(a *ArtifactConfig) {
- a.HTTPReadTimeout = helper.StringToPtr("0")
+ a.HTTPReadTimeout = pointer.Of("0")
},
expectedError: "",
},
{
name: "http read timeout is negative",
config: func(a *ArtifactConfig) {
- a.HTTPReadTimeout = helper.StringToPtr("-10m")
+ a.HTTPReadTimeout = pointer.Of("-10m")
},
expectedError: "http_read_timeout must be > 0",
},
@@ -166,28 +166,28 @@ func TestArtifactConfig_Validate(t *testing.T) {
{
name: "http max size is invalid",
config: func(a *ArtifactConfig) {
- a.HTTPMaxSize = helper.StringToPtr("invalid")
+ a.HTTPMaxSize = pointer.Of("invalid")
},
expectedError: "http_max_size not a valid size",
},
{
name: "http max size is empty",
config: func(a *ArtifactConfig) {
- a.HTTPMaxSize = helper.StringToPtr("")
+ a.HTTPMaxSize = pointer.Of("")
},
expectedError: "http_max_size not a valid size",
},
{
name: "http max size is zero",
config: func(a *ArtifactConfig) {
- a.HTTPMaxSize = helper.StringToPtr("0")
+ a.HTTPMaxSize = pointer.Of("0")
},
expectedError: "",
},
{
name: "http max size is negative",
config: func(a *ArtifactConfig) {
- a.HTTPMaxSize = helper.StringToPtr("-l0MB")
+ a.HTTPMaxSize = pointer.Of("-l0MB")
},
expectedError: "http_max_size not a valid size",
},
@@ -201,28 +201,28 @@ func TestArtifactConfig_Validate(t *testing.T) {
{
name: "gcs timeout is invalid",
config: func(a *ArtifactConfig) {
- a.GCSTimeout = helper.StringToPtr("invalid")
+ a.GCSTimeout = pointer.Of("invalid")
},
expectedError: "gcs_timeout not a valid duration",
},
{
name: "gcs timeout is empty",
config: func(a *ArtifactConfig) {
- a.GCSTimeout = helper.StringToPtr("")
+ a.GCSTimeout = pointer.Of("")
},
expectedError: "gcs_timeout not a valid duration",
},
{
name: "gcs timeout is zero",
config: func(a *ArtifactConfig) {
- a.GCSTimeout = helper.StringToPtr("0")
+ a.GCSTimeout = pointer.Of("0")
},
expectedError: "",
},
{
name: "gcs timeout is negative",
config: func(a *ArtifactConfig) {
- a.GCSTimeout = helper.StringToPtr("-l0m")
+ a.GCSTimeout = pointer.Of("-l0m")
},
expectedError: "gcs_timeout not a valid duration",
},
@@ -236,28 +236,28 @@ func TestArtifactConfig_Validate(t *testing.T) {
{
name: "git timeout is invalid",
config: func(a *ArtifactConfig) {
- a.GitTimeout = helper.StringToPtr("invalid")
+ a.GitTimeout = pointer.Of("invalid")
},
expectedError: "git_timeout not a valid duration",
},
{
name: "git timeout is empty",
config: func(a *ArtifactConfig) {
- a.GitTimeout = helper.StringToPtr("")
+ a.GitTimeout = pointer.Of("")
},
expectedError: "git_timeout not a valid duration",
},
{
name: "git timeout is zero",
config: func(a *ArtifactConfig) {
- a.GitTimeout = helper.StringToPtr("0")
+ a.GitTimeout = pointer.Of("0")
},
expectedError: "",
},
{
name: "git timeout is negative",
config: func(a *ArtifactConfig) {
- a.GitTimeout = helper.StringToPtr("-l0m")
+ a.GitTimeout = pointer.Of("-l0m")
},
expectedError: "git_timeout not a valid duration",
},
@@ -271,28 +271,28 @@ func TestArtifactConfig_Validate(t *testing.T) {
{
name: "hg timeout is invalid",
config: func(a *ArtifactConfig) {
- a.HgTimeout = helper.StringToPtr("invalid")
+ a.HgTimeout = pointer.Of("invalid")
},
expectedError: "hg_timeout not a valid duration",
},
{
name: "hg timeout is empty",
config: func(a *ArtifactConfig) {
- a.HgTimeout = helper.StringToPtr("")
+ a.HgTimeout = pointer.Of("")
},
expectedError: "hg_timeout not a valid duration",
},
{
name: "hg timeout is zero",
config: func(a *ArtifactConfig) {
- a.HgTimeout = helper.StringToPtr("0")
+ a.HgTimeout = pointer.Of("0")
},
expectedError: "",
},
{
name: "hg timeout is negative",
config: func(a *ArtifactConfig) {
- a.HgTimeout = helper.StringToPtr("-l0m")
+ a.HgTimeout = pointer.Of("-l0m")
},
expectedError: "hg_timeout not a valid duration",
},
@@ -306,28 +306,28 @@ func TestArtifactConfig_Validate(t *testing.T) {
{
name: "s3 timeout is invalid",
config: func(a *ArtifactConfig) {
- a.S3Timeout = helper.StringToPtr("invalid")
+ a.S3Timeout = pointer.Of("invalid")
},
expectedError: "s3_timeout not a valid duration",
},
{
name: "s3 timeout is empty",
config: func(a *ArtifactConfig) {
- a.S3Timeout = helper.StringToPtr("")
+ a.S3Timeout = pointer.Of("")
},
expectedError: "s3_timeout not a valid duration",
},
{
name: "s3 timeout is zero",
config: func(a *ArtifactConfig) {
- a.S3Timeout = helper.StringToPtr("0")
+ a.S3Timeout = pointer.Of("0")
},
expectedError: "",
},
{
name: "s3 timeout is negative",
config: func(a *ArtifactConfig) {
- a.S3Timeout = helper.StringToPtr("-l0m")
+ a.S3Timeout = pointer.Of("-l0m")
},
expectedError: "s3_timeout not a valid duration",
},
diff --git a/nomad/structs/config/audit.go b/nomad/structs/config/audit.go
index cc7e7bf5d07..91a43016469 100644
--- a/nomad/structs/config/audit.go
+++ b/nomad/structs/config/audit.go
@@ -4,6 +4,7 @@ import (
"time"
"github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
)
// AuditConfig is the configuration specific to Audit Logging
@@ -83,7 +84,7 @@ func (a *AuditConfig) Copy() *AuditConfig {
// Copy bool pointers
if a.Enabled != nil {
- nc.Enabled = helper.BoolToPtr(*a.Enabled)
+ nc.Enabled = pointer.Of(*a.Enabled)
}
// Copy Sinks and Filters
@@ -98,7 +99,7 @@ func (a *AuditConfig) Merge(b *AuditConfig) *AuditConfig {
result := a.Copy()
if b.Enabled != nil {
- result.Enabled = helper.BoolToPtr(*b.Enabled)
+ result.Enabled = pointer.Of(*b.Enabled)
}
// Merge Sinks
diff --git a/nomad/structs/config/audit_test.go b/nomad/structs/config/audit_test.go
index 7cd9d930a2b..0388edb8773 100644
--- a/nomad/structs/config/audit_test.go
+++ b/nomad/structs/config/audit_test.go
@@ -5,7 +5,7 @@ import (
"time"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/stretchr/testify/require"
)
@@ -13,7 +13,7 @@ func TestAuditConfig_Merge(t *testing.T) {
ci.Parallel(t)
c1 := &AuditConfig{
- Enabled: helper.BoolToPtr(true),
+ Enabled: pointer.Of(true),
Sinks: []*AuditSink{
{
DeliveryGuarantee: "enforced",
@@ -71,7 +71,7 @@ func TestAuditConfig_Merge(t *testing.T) {
}
e := &AuditConfig{
- Enabled: helper.BoolToPtr(true),
+ Enabled: pointer.Of(true),
Sinks: []*AuditSink{
{
DeliveryGuarantee: "best-effort",
diff --git a/nomad/structs/config/autopilot.go b/nomad/structs/config/autopilot.go
index d71b0c39803..2efd0f20aba 100644
--- a/nomad/structs/config/autopilot.go
+++ b/nomad/structs/config/autopilot.go
@@ -3,7 +3,7 @@ package config
import (
"time"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
)
type AutopilotConfig struct {
@@ -60,7 +60,7 @@ func (a *AutopilotConfig) Merge(b *AutopilotConfig) *AutopilotConfig {
result := a.Copy()
if b.CleanupDeadServers != nil {
- result.CleanupDeadServers = helper.BoolToPtr(*b.CleanupDeadServers)
+ result.CleanupDeadServers = pointer.Of(*b.CleanupDeadServers)
}
if b.ServerStabilizationTime != 0 {
result.ServerStabilizationTime = b.ServerStabilizationTime
@@ -84,7 +84,7 @@ func (a *AutopilotConfig) Merge(b *AutopilotConfig) *AutopilotConfig {
result.EnableRedundancyZones = b.EnableRedundancyZones
}
if b.DisableUpgradeMigration != nil {
- result.DisableUpgradeMigration = helper.BoolToPtr(*b.DisableUpgradeMigration)
+ result.DisableUpgradeMigration = pointer.Of(*b.DisableUpgradeMigration)
}
if b.EnableCustomUpgrades != nil {
result.EnableCustomUpgrades = b.EnableCustomUpgrades
@@ -104,16 +104,16 @@ func (a *AutopilotConfig) Copy() *AutopilotConfig {
// Copy the bools
if a.CleanupDeadServers != nil {
- nc.CleanupDeadServers = helper.BoolToPtr(*a.CleanupDeadServers)
+ nc.CleanupDeadServers = pointer.Of(*a.CleanupDeadServers)
}
if a.EnableRedundancyZones != nil {
- nc.EnableRedundancyZones = helper.BoolToPtr(*a.EnableRedundancyZones)
+ nc.EnableRedundancyZones = pointer.Of(*a.EnableRedundancyZones)
}
if a.DisableUpgradeMigration != nil {
- nc.DisableUpgradeMigration = helper.BoolToPtr(*a.DisableUpgradeMigration)
+ nc.DisableUpgradeMigration = pointer.Of(*a.DisableUpgradeMigration)
}
if a.EnableCustomUpgrades != nil {
- nc.EnableCustomUpgrades = helper.BoolToPtr(*a.EnableCustomUpgrades)
+ nc.EnableCustomUpgrades = pointer.Of(*a.EnableCustomUpgrades)
}
return nc
diff --git a/nomad/structs/config/consul.go b/nomad/structs/config/consul.go
index f836b822b8d..bddd7947fed 100644
--- a/nomad/structs/config/consul.go
+++ b/nomad/structs/config/consul.go
@@ -8,7 +8,7 @@ import (
consul "github.com/hashicorp/consul/api"
"github.com/hashicorp/go-secure-stdlib/listenerutil"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
)
// ConsulConfig contains the configuration information necessary to
@@ -16,11 +16,11 @@ import (
//
// - Register services and their checks with Consul
//
-// - Bootstrap this Nomad Client with the list of Nomad Servers registered
-// with Consul
+// - Bootstrap this Nomad Client with the list of Nomad Servers registered
+// with Consul
//
-// - Establish how this Nomad Client will resolve Envoy Connect Sidecar
-// images.
+// - Establish how this Nomad Client will resolve Envoy Connect Sidecar
+// images.
//
// Both the Agent and the executor need to be able to import ConsulConfig.
type ConsulConfig struct {
@@ -141,17 +141,17 @@ func DefaultConsulConfig() *ConsulConfig {
ServerRPCCheckName: "Nomad Server RPC Check",
ClientServiceName: "nomad-client",
ClientHTTPCheckName: "Nomad Client HTTP Check",
- AutoAdvertise: helper.BoolToPtr(true),
- ChecksUseAdvertise: helper.BoolToPtr(false),
- ServerAutoJoin: helper.BoolToPtr(true),
- ClientAutoJoin: helper.BoolToPtr(true),
- AllowUnauthenticated: helper.BoolToPtr(true),
+ AutoAdvertise: pointer.Of(true),
+ ChecksUseAdvertise: pointer.Of(false),
+ ServerAutoJoin: pointer.Of(true),
+ ClientAutoJoin: pointer.Of(true),
+ AllowUnauthenticated: pointer.Of(true),
Timeout: 5 * time.Second,
// From Consul api package defaults
Addr: def.Address,
- EnableSSL: helper.BoolToPtr(def.Scheme == "https"),
- VerifySSL: helper.BoolToPtr(!def.TLSConfig.InsecureSkipVerify),
+ EnableSSL: pointer.Of(def.Scheme == "https"),
+ VerifySSL: pointer.Of(!def.TLSConfig.InsecureSkipVerify),
CAFile: def.TLSConfig.CAFile,
Namespace: def.Namespace,
}
@@ -190,7 +190,7 @@ func (c *ConsulConfig) Merge(b *ConsulConfig) *ConsulConfig {
}
result.Tags = append(result.Tags, b.Tags...)
if b.AutoAdvertise != nil {
- result.AutoAdvertise = helper.BoolToPtr(*b.AutoAdvertise)
+ result.AutoAdvertise = pointer.Of(*b.AutoAdvertise)
}
if b.Addr != "" {
result.Addr = b.Addr
@@ -211,13 +211,13 @@ func (c *ConsulConfig) Merge(b *ConsulConfig) *ConsulConfig {
result.Auth = b.Auth
}
if b.EnableSSL != nil {
- result.EnableSSL = helper.BoolToPtr(*b.EnableSSL)
+ result.EnableSSL = pointer.Of(*b.EnableSSL)
}
if b.VerifySSL != nil {
- result.VerifySSL = helper.BoolToPtr(*b.VerifySSL)
+ result.VerifySSL = pointer.Of(*b.VerifySSL)
}
if b.ShareSSL != nil {
- result.ShareSSL = helper.BoolToPtr(*b.ShareSSL)
+ result.ShareSSL = pointer.Of(*b.ShareSSL)
}
if b.CAFile != "" {
result.CAFile = b.CAFile
@@ -229,16 +229,16 @@ func (c *ConsulConfig) Merge(b *ConsulConfig) *ConsulConfig {
result.KeyFile = b.KeyFile
}
if b.ServerAutoJoin != nil {
- result.ServerAutoJoin = helper.BoolToPtr(*b.ServerAutoJoin)
+ result.ServerAutoJoin = pointer.Of(*b.ServerAutoJoin)
}
if b.ClientAutoJoin != nil {
- result.ClientAutoJoin = helper.BoolToPtr(*b.ClientAutoJoin)
+ result.ClientAutoJoin = pointer.Of(*b.ClientAutoJoin)
}
if b.ChecksUseAdvertise != nil {
- result.ChecksUseAdvertise = helper.BoolToPtr(*b.ChecksUseAdvertise)
+ result.ChecksUseAdvertise = pointer.Of(*b.ChecksUseAdvertise)
}
if b.AllowUnauthenticated != nil {
- result.AllowUnauthenticated = helper.BoolToPtr(*b.AllowUnauthenticated)
+ result.AllowUnauthenticated = pointer.Of(*b.AllowUnauthenticated)
}
if b.Namespace != "" {
result.Namespace = b.Namespace
@@ -319,28 +319,28 @@ func (c *ConsulConfig) Copy() *ConsulConfig {
// Copy the bools
if nc.AutoAdvertise != nil {
- nc.AutoAdvertise = helper.BoolToPtr(*nc.AutoAdvertise)
+ nc.AutoAdvertise = pointer.Of(*nc.AutoAdvertise)
}
if nc.ChecksUseAdvertise != nil {
- nc.ChecksUseAdvertise = helper.BoolToPtr(*nc.ChecksUseAdvertise)
+ nc.ChecksUseAdvertise = pointer.Of(*nc.ChecksUseAdvertise)
}
if nc.EnableSSL != nil {
- nc.EnableSSL = helper.BoolToPtr(*nc.EnableSSL)
+ nc.EnableSSL = pointer.Of(*nc.EnableSSL)
}
if nc.VerifySSL != nil {
- nc.VerifySSL = helper.BoolToPtr(*nc.VerifySSL)
+ nc.VerifySSL = pointer.Of(*nc.VerifySSL)
}
if nc.ShareSSL != nil {
- nc.ShareSSL = helper.BoolToPtr(*nc.ShareSSL)
+ nc.ShareSSL = pointer.Of(*nc.ShareSSL)
}
if nc.ServerAutoJoin != nil {
- nc.ServerAutoJoin = helper.BoolToPtr(*nc.ServerAutoJoin)
+ nc.ServerAutoJoin = pointer.Of(*nc.ServerAutoJoin)
}
if nc.ClientAutoJoin != nil {
- nc.ClientAutoJoin = helper.BoolToPtr(*nc.ClientAutoJoin)
+ nc.ClientAutoJoin = pointer.Of(*nc.ClientAutoJoin)
}
if nc.AllowUnauthenticated != nil {
- nc.AllowUnauthenticated = helper.BoolToPtr(*nc.AllowUnauthenticated)
+ nc.AllowUnauthenticated = pointer.Of(*nc.AllowUnauthenticated)
}
return nc
diff --git a/nomad/structs/config/limits.go b/nomad/structs/config/limits.go
index 5c17bc99ee5..77fda5190f0 100644
--- a/nomad/structs/config/limits.go
+++ b/nomad/structs/config/limits.go
@@ -1,6 +1,6 @@
package config
-import "github.com/hashicorp/nomad/helper"
+import "github.com/hashicorp/nomad/helper/pointer"
const (
// LimitsNonStreamingConnsPerClient is the number of connections per
@@ -47,9 +47,9 @@ type Limits struct {
func DefaultLimits() Limits {
return Limits{
HTTPSHandshakeTimeout: "5s",
- HTTPMaxConnsPerClient: helper.IntToPtr(100),
+ HTTPMaxConnsPerClient: pointer.Of(100),
RPCHandshakeTimeout: "5s",
- RPCMaxConnsPerClient: helper.IntToPtr(100),
+ RPCMaxConnsPerClient: pointer.Of(100),
}
}
@@ -62,13 +62,13 @@ func (l *Limits) Merge(o Limits) Limits {
m.HTTPSHandshakeTimeout = o.HTTPSHandshakeTimeout
}
if o.HTTPMaxConnsPerClient != nil {
- m.HTTPMaxConnsPerClient = helper.IntToPtr(*o.HTTPMaxConnsPerClient)
+ m.HTTPMaxConnsPerClient = pointer.Of(*o.HTTPMaxConnsPerClient)
}
if o.RPCHandshakeTimeout != "" {
m.RPCHandshakeTimeout = o.RPCHandshakeTimeout
}
if o.RPCMaxConnsPerClient != nil {
- m.RPCMaxConnsPerClient = helper.IntToPtr(*o.RPCMaxConnsPerClient)
+ m.RPCMaxConnsPerClient = pointer.Of(*o.RPCMaxConnsPerClient)
}
return m
@@ -78,10 +78,10 @@ func (l *Limits) Merge(o Limits) Limits {
func (l *Limits) Copy() Limits {
c := *l
if l.HTTPMaxConnsPerClient != nil {
- c.HTTPMaxConnsPerClient = helper.IntToPtr(*l.HTTPMaxConnsPerClient)
+ c.HTTPMaxConnsPerClient = pointer.Of(*l.HTTPMaxConnsPerClient)
}
if l.RPCMaxConnsPerClient != nil {
- c.RPCMaxConnsPerClient = helper.IntToPtr(*l.RPCMaxConnsPerClient)
+ c.RPCMaxConnsPerClient = pointer.Of(*l.RPCMaxConnsPerClient)
}
return c
}
diff --git a/nomad/structs/config/limits_test.go b/nomad/structs/config/limits_test.go
index 7a4082f3db7..95f68037f6d 100644
--- a/nomad/structs/config/limits_test.go
+++ b/nomad/structs/config/limits_test.go
@@ -5,7 +5,7 @@ import (
"time"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/stretchr/testify/require"
)
@@ -32,9 +32,9 @@ func TestLimits_Copy(t *testing.T) {
// Assert changes to copy are not propagated to the original
c.HTTPSHandshakeTimeout = "1s"
- c.HTTPMaxConnsPerClient = helper.IntToPtr(50)
+ c.HTTPMaxConnsPerClient = pointer.Of(50)
c.RPCHandshakeTimeout = "1s"
- c.RPCMaxConnsPerClient = helper.IntToPtr(50)
+ c.RPCMaxConnsPerClient = pointer.Of(50)
require.NotEqual(t, c.HTTPSHandshakeTimeout, o.HTTPSHandshakeTimeout)
@@ -74,7 +74,7 @@ func TestLimits_Merge(t *testing.T) {
// Use short struct initialization style so it fails to compile if
// fields are added
- expected := Limits{"10s", helper.IntToPtr(100), "5s", helper.IntToPtr(100)}
+ expected := Limits{"10s", pointer.Of(100), "5s", pointer.Of(100)}
require.Equal(t, expected, m2)
// Mergin in 0 values should not change anything
diff --git a/nomad/structs/config/sentinel.go b/nomad/structs/config/sentinel.go
index c5ea34afbe0..6dc17c85a38 100644
--- a/nomad/structs/config/sentinel.go
+++ b/nomad/structs/config/sentinel.go
@@ -1,11 +1,26 @@
package config
+import (
+ "github.com/hashicorp/nomad/helper"
+ "golang.org/x/exp/slices"
+)
+
// SentinelConfig is configuration specific to Sentinel
type SentinelConfig struct {
// Imports are the configured imports
Imports []*SentinelImport `hcl:"import,expand"`
}
+func (s *SentinelConfig) Copy() *SentinelConfig {
+ if s == nil {
+ return nil
+ }
+
+ ns := *s
+ ns.Imports = helper.CopySlice(s.Imports)
+ return &ns
+}
+
// SentinelImport is used per configured import
type SentinelImport struct {
Name string `hcl:",key"`
@@ -13,6 +28,16 @@ type SentinelImport struct {
Args []string `hcl:"args"`
}
+func (s *SentinelImport) Copy() *SentinelImport {
+ if s == nil {
+ return nil
+ }
+
+ ns := *s
+ ns.Args = slices.Clone(s.Args)
+ return &ns
+}
+
// Merge is used to merge two Sentinel configs together. The settings from the input always take precedence.
func (a *SentinelConfig) Merge(b *SentinelConfig) *SentinelConfig {
result := *a
diff --git a/nomad/structs/config/tls.go b/nomad/structs/config/tls.go
index afb4d8e43c1..6130747d109 100644
--- a/nomad/structs/config/tls.go
+++ b/nomad/structs/config/tls.go
@@ -125,16 +125,6 @@ func (k *KeyLoader) GetClientCertificate(*tls.CertificateRequestInfo) (*tls.Cert
return k.certificate, nil
}
-func (k *KeyLoader) Copy() *KeyLoader {
- if k == nil {
- return nil
- }
-
- new := KeyLoader{}
- new.certificate = k.certificate
- return &new
-}
-
// GetKeyLoader returns the keyloader for a TLSConfig object. If the keyloader
// has not been initialized, it will first do so.
func (t *TLSConfig) GetKeyLoader() *KeyLoader {
@@ -162,8 +152,12 @@ func (t *TLSConfig) Copy() *TLSConfig {
new.CAFile = t.CAFile
new.CertFile = t.CertFile
+ // Shallow copy the key loader as its GetOutgoingCertificate method is what
+ // is used by the HTTP server to retrieve the certificate. If we create a new
+ // KeyLoader struct, the HTTP server will still be calling the old
+ // GetOutgoingCertificate method.
t.keyloaderLock.Lock()
- new.KeyLoader = t.KeyLoader.Copy()
+ new.KeyLoader = t.KeyLoader
t.keyloaderLock.Unlock()
new.KeyFile = t.KeyFile
diff --git a/nomad/structs/config/tls_test.go b/nomad/structs/config/tls_test.go
index 59bcfed18d7..0e89898ef49 100644
--- a/nomad/structs/config/tls_test.go
+++ b/nomad/structs/config/tls_test.go
@@ -204,7 +204,7 @@ func TestTLS_Copy(t *testing.T) {
// object
func TestTLS_GetKeyloader(t *testing.T) {
ci.Parallel(t)
-
+
require := require.New(t)
a := &TLSConfig{}
require.NotNil(a.GetKeyLoader())
diff --git a/nomad/structs/config/vault.go b/nomad/structs/config/vault.go
index 83a239a19ce..4deb4c2f743 100644
--- a/nomad/structs/config/vault.go
+++ b/nomad/structs/config/vault.go
@@ -3,7 +3,7 @@ package config
import (
"time"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
vault "github.com/hashicorp/vault/api"
)
@@ -87,7 +87,7 @@ func DefaultVaultConfig() *VaultConfig {
return &VaultConfig{
Addr: "https://vault.service.consul:8200",
ConnectionRetryIntv: DefaultVaultConnectRetryIntv,
- AllowUnauthenticated: helper.BoolToPtr(true),
+ AllowUnauthenticated: pointer.Of(true),
}
}
@@ -106,14 +106,20 @@ func (c *VaultConfig) AllowsUnauthenticated() bool {
func (c *VaultConfig) Merge(b *VaultConfig) *VaultConfig {
result := *c
+ if b.Enabled != nil {
+ result.Enabled = b.Enabled
+ }
if b.Token != "" {
result.Token = b.Token
}
+ if b.Role != "" {
+ result.Role = b.Role
+ }
if b.Namespace != "" {
result.Namespace = b.Namespace
}
- if b.Role != "" {
- result.Role = b.Role
+ if b.AllowUnauthenticated != nil {
+ result.AllowUnauthenticated = b.AllowUnauthenticated
}
if b.TaskTokenTTL != "" {
result.TaskTokenTTL = b.TaskTokenTTL
@@ -136,17 +142,11 @@ func (c *VaultConfig) Merge(b *VaultConfig) *VaultConfig {
if b.TLSKeyFile != "" {
result.TLSKeyFile = b.TLSKeyFile
}
- if b.TLSServerName != "" {
- result.TLSServerName = b.TLSServerName
- }
- if b.AllowUnauthenticated != nil {
- result.AllowUnauthenticated = b.AllowUnauthenticated
- }
if b.TLSSkipVerify != nil {
result.TLSSkipVerify = b.TLSSkipVerify
}
- if b.Enabled != nil {
- result.Enabled = b.Enabled
+ if b.TLSServerName != "" {
+ result.TLSServerName = b.TLSServerName
}
return &result
@@ -188,9 +188,9 @@ func (c *VaultConfig) Copy() *VaultConfig {
return nc
}
-// IsEqual compares two Vault configurations and returns a boolean indicating
+// Equals compares two Vault configurations and returns a boolean indicating
// if they are equal.
-func (c *VaultConfig) IsEqual(b *VaultConfig) bool {
+func (c *VaultConfig) Equals(b *VaultConfig) bool {
if c == nil && b != nil {
return false
}
@@ -198,12 +198,32 @@ func (c *VaultConfig) IsEqual(b *VaultConfig) bool {
return false
}
+ if c.Enabled == nil || b.Enabled == nil {
+ if c.Enabled != b.Enabled {
+ return false
+ }
+ } else if *c.Enabled != *b.Enabled {
+ return false
+ }
+
if c.Token != b.Token {
return false
}
if c.Role != b.Role {
return false
}
+ if c.Namespace != b.Namespace {
+ return false
+ }
+
+ if c.AllowUnauthenticated == nil || b.AllowUnauthenticated == nil {
+ if c.AllowUnauthenticated != b.AllowUnauthenticated {
+ return false
+ }
+ } else if *c.AllowUnauthenticated != *b.AllowUnauthenticated {
+ return false
+ }
+
if c.TaskTokenTTL != b.TaskTokenTTL {
return false
}
@@ -225,17 +245,18 @@ func (c *VaultConfig) IsEqual(b *VaultConfig) bool {
if c.TLSKeyFile != b.TLSKeyFile {
return false
}
- if c.TLSServerName != b.TLSServerName {
- return false
- }
- if c.AllowUnauthenticated != b.AllowUnauthenticated {
- return false
- }
- if c.TLSSkipVerify != b.TLSSkipVerify {
+
+ if c.TLSSkipVerify == nil || b.TLSSkipVerify == nil {
+ if c.TLSSkipVerify != b.TLSSkipVerify {
+ return false
+ }
+ } else if *c.TLSSkipVerify != *b.TLSSkipVerify {
return false
}
- if c.Enabled != b.Enabled {
+
+ if c.TLSServerName != b.TLSServerName {
return false
}
+
return true
}
diff --git a/nomad/structs/config/vault_test.go b/nomad/structs/config/vault_test.go
index f6fa2c6bd4f..6f5e2909c98 100644
--- a/nomad/structs/config/vault_test.go
+++ b/nomad/structs/config/vault_test.go
@@ -3,35 +3,36 @@ package config
import (
"reflect"
"testing"
+ "time"
"github.com/hashicorp/nomad/ci"
- "github.com/stretchr/testify/require"
+ "github.com/hashicorp/nomad/helper/pointer"
+ "github.com/shoenig/test/must"
)
func TestVaultConfig_Merge(t *testing.T) {
ci.Parallel(t)
- trueValue, falseValue := true, false
c1 := &VaultConfig{
- Enabled: &falseValue,
+ Enabled: pointer.Of(false),
Token: "1",
Role: "1",
- AllowUnauthenticated: &trueValue,
+ AllowUnauthenticated: pointer.Of(true),
TaskTokenTTL: "1",
Addr: "1",
TLSCaFile: "1",
TLSCaPath: "1",
TLSCertFile: "1",
TLSKeyFile: "1",
- TLSSkipVerify: &trueValue,
+ TLSSkipVerify: pointer.Of(true),
TLSServerName: "1",
}
c2 := &VaultConfig{
- Enabled: &trueValue,
+ Enabled: pointer.Of(true),
Token: "2",
Role: "2",
- AllowUnauthenticated: &falseValue,
+ AllowUnauthenticated: pointer.Of(false),
TaskTokenTTL: "2",
Addr: "2",
TLSCaFile: "2",
@@ -43,17 +44,17 @@ func TestVaultConfig_Merge(t *testing.T) {
}
e := &VaultConfig{
- Enabled: &trueValue,
+ Enabled: pointer.Of(true),
Token: "2",
Role: "2",
- AllowUnauthenticated: &falseValue,
+ AllowUnauthenticated: pointer.Of(false),
TaskTokenTTL: "2",
Addr: "2",
TLSCaFile: "2",
TLSCaPath: "2",
TLSCertFile: "2",
TLSKeyFile: "2",
- TLSSkipVerify: &trueValue,
+ TLSSkipVerify: pointer.Of(true),
TLSServerName: "2",
}
@@ -63,72 +64,78 @@ func TestVaultConfig_Merge(t *testing.T) {
}
}
-func TestVaultConfig_IsEqual(t *testing.T) {
+func TestVaultConfig_Equals(t *testing.T) {
ci.Parallel(t)
- require := require.New(t)
-
- trueValue, falseValue := true, false
c1 := &VaultConfig{
- Enabled: &falseValue,
+ Enabled: pointer.Of(false),
Token: "1",
Role: "1",
- AllowUnauthenticated: &trueValue,
+ Namespace: "1",
+ AllowUnauthenticated: pointer.Of(true),
TaskTokenTTL: "1",
Addr: "1",
+ ConnectionRetryIntv: time.Second,
TLSCaFile: "1",
TLSCaPath: "1",
TLSCertFile: "1",
TLSKeyFile: "1",
- TLSSkipVerify: &trueValue,
+ TLSSkipVerify: pointer.Of(true),
TLSServerName: "1",
}
c2 := &VaultConfig{
- Enabled: &falseValue,
+ Enabled: pointer.Of(false),
Token: "1",
Role: "1",
- AllowUnauthenticated: &trueValue,
+ Namespace: "1",
+ AllowUnauthenticated: pointer.Of(true),
TaskTokenTTL: "1",
Addr: "1",
+ ConnectionRetryIntv: time.Second,
TLSCaFile: "1",
TLSCaPath: "1",
TLSCertFile: "1",
TLSKeyFile: "1",
- TLSSkipVerify: &trueValue,
+ TLSSkipVerify: pointer.Of(true),
TLSServerName: "1",
}
- require.True(c1.IsEqual(c2))
+ must.Equals(t, c1, c2)
c3 := &VaultConfig{
- Enabled: &trueValue,
+ Enabled: pointer.Of(true),
Token: "1",
Role: "1",
- AllowUnauthenticated: &trueValue,
+ Namespace: "1",
+ AllowUnauthenticated: pointer.Of(true),
TaskTokenTTL: "1",
Addr: "1",
+ ConnectionRetryIntv: time.Second,
TLSCaFile: "1",
TLSCaPath: "1",
TLSCertFile: "1",
TLSKeyFile: "1",
- TLSSkipVerify: &trueValue,
+ TLSSkipVerify: pointer.Of(true),
TLSServerName: "1",
}
c4 := &VaultConfig{
- Enabled: &falseValue,
+ Enabled: pointer.Of(false),
Token: "1",
Role: "1",
- AllowUnauthenticated: &trueValue,
+ Namespace: "1",
+ AllowUnauthenticated: pointer.Of(true),
TaskTokenTTL: "1",
Addr: "1",
+ ConnectionRetryIntv: time.Second,
TLSCaFile: "1",
TLSCaPath: "1",
TLSCertFile: "1",
TLSKeyFile: "1",
- TLSSkipVerify: &trueValue,
+ TLSSkipVerify: pointer.Of(true),
TLSServerName: "1",
}
- require.False(c3.IsEqual(c4))
+
+ must.NotEquals(t, c3, c4)
}
diff --git a/nomad/structs/csi.go b/nomad/structs/csi.go
index eea20b597d6..75601706b31 100644
--- a/nomad/structs/csi.go
+++ b/nomad/structs/csi.go
@@ -62,12 +62,17 @@ type TaskCSIPluginConfig struct {
// Type instructs Nomad on how to handle processing a plugin
Type CSIPluginType
- // MountDir is the destination that nomad should mount in its CSI
- // directory for the plugin. It will then expect a file called CSISocketName
- // to be created by the plugin, and will provide references into
- // "MountDir/CSIIntermediaryDirname/{VolumeName}/{AllocID} for mounts.
+ // MountDir is the directory (within its container) in which the plugin creates a
+ // socket (called CSISocketName) for communication with Nomad. Default is /csi.
MountDir string
+ // StagePublishBaseDir is the base directory (within its container) in which the plugin
+ // mounts volumes being staged and bind mount volumes being published.
+ // e.g. staging_target_path = {StagePublishBaseDir}/staging/{volume-id}/{usage-mode}
+ // e.g. target_path = {StagePublishBaseDir}/per-alloc/{alloc-id}/{volume-id}/{usage-mode}
+ // Default is /local/csi.
+ StagePublishBaseDir string
+
// HealthTimeout is the time after which the CSI plugin tasks will be killed
// if the CSI Plugin is not healthy.
HealthTimeout time.Duration `mapstructure:"health_timeout" hcl:"health_timeout,optional"`
diff --git a/nomad/structs/devices_test.go b/nomad/structs/devices_test.go
index 8d43a45ad35..821e237380d 100644
--- a/nomad/structs/devices_test.go
+++ b/nomad/structs/devices_test.go
@@ -211,7 +211,7 @@ func TestDeviceAccounter_AddReserved(t *testing.T) {
// Test that collision detection works
func TestDeviceAccounter_AddReserved_Collision(t *testing.T) {
ci.Parallel(t)
-
+
require := require.New(t)
n := devNode()
d := NewDeviceAccounter(n)
diff --git a/nomad/structs/diff.go b/nomad/structs/diff.go
index 8c16123e1c8..77f511f71b5 100644
--- a/nomad/structs/diff.go
+++ b/nomad/structs/diff.go
@@ -1649,6 +1649,39 @@ func waitConfigDiff(old, new *WaitConfig, contextual bool) *ObjectDiff {
return diff
}
+// changeScriptDiff returns the diff of two ChangeScript objects. If contextual
+// diff is enabled, all fields will be returned, even if no diff occurred.
+func changeScriptDiff(old, new *ChangeScript, contextual bool) *ObjectDiff {
+ diff := &ObjectDiff{Type: DiffTypeNone, Name: "ChangeScript"}
+ var oldPrimitiveFlat, newPrimitiveFlat map[string]string
+
+ if reflect.DeepEqual(old, new) {
+ return nil
+ } else if old == nil {
+ old = &ChangeScript{}
+ diff.Type = DiffTypeAdded
+ newPrimitiveFlat = flatmap.Flatten(new, nil, true)
+ } else if new == nil {
+ new = &ChangeScript{}
+ diff.Type = DiffTypeDeleted
+ oldPrimitiveFlat = flatmap.Flatten(old, nil, true)
+ } else {
+ diff.Type = DiffTypeEdited
+ oldPrimitiveFlat = flatmap.Flatten(old, nil, true)
+ newPrimitiveFlat = flatmap.Flatten(new, nil, true)
+ }
+
+ // Diff the primitive fields.
+ diff.Fields = fieldDiffs(oldPrimitiveFlat, newPrimitiveFlat, contextual)
+
+ // Args diffs
+ if setDiff := stringSetDiff(old.Args, new.Args, "Args", contextual); setDiff != nil {
+ diff.Objects = append(diff.Objects, setDiff)
+ }
+
+ return diff
+}
+
// templateDiff returns the diff of two Consul Template objects. If contextual diff is
// enabled, all fields will be returned, even if no diff occurred.
func templateDiff(old, new *Template, contextual bool) *ObjectDiff {
@@ -1671,6 +1704,24 @@ func templateDiff(old, new *Template, contextual bool) *ObjectDiff {
newPrimitiveFlat = flatmap.Flatten(new, nil, true)
}
+ // Add the pointer primitive fields.
+ if old != nil {
+ if old.Uid != nil {
+ oldPrimitiveFlat["Uid"] = fmt.Sprintf("%v", *old.Uid)
+ }
+ if old.Gid != nil {
+ oldPrimitiveFlat["Gid"] = fmt.Sprintf("%v", *old.Gid)
+ }
+ }
+ if new != nil {
+ if new.Uid != nil {
+ newPrimitiveFlat["Uid"] = fmt.Sprintf("%v", *new.Uid)
+ }
+ if new.Gid != nil {
+ newPrimitiveFlat["Gid"] = fmt.Sprintf("%v", *new.Gid)
+ }
+ }
+
// Diff the primitive fields.
diff.Fields = fieldDiffs(oldPrimitiveFlat, newPrimitiveFlat, contextual)
@@ -1679,6 +1730,13 @@ func templateDiff(old, new *Template, contextual bool) *ObjectDiff {
diff.Objects = append(diff.Objects, waitDiffs)
}
+ // ChangeScript diffs
+ if changeScriptDiffs := changeScriptDiff(
+ old.ChangeScript, new.ChangeScript, contextual,
+ ); changeScriptDiffs != nil {
+ diff.Objects = append(diff.Objects, changeScriptDiffs)
+ }
+
return diff
}
diff --git a/nomad/structs/diff_test.go b/nomad/structs/diff_test.go
index 1a5751a8c7e..6eca9ab99cc 100644
--- a/nomad/structs/diff_test.go
+++ b/nomad/structs/diff_test.go
@@ -6,7 +6,7 @@ import (
"time"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/stretchr/testify/require"
)
@@ -2696,7 +2696,7 @@ func TestTaskGroupDiff(t *testing.T) {
},
Gateway: &ConsulGateway{
Proxy: &ConsulGatewayProxy{
- ConnectTimeout: helper.TimeToPtr(1 * time.Second),
+ ConnectTimeout: pointer.Of(1 * time.Second),
EnvoyGatewayBindTaggedAddresses: false,
EnvoyGatewayBindAddresses: map[string]*ConsulGatewayBindAddress{
"service1": {
@@ -2778,7 +2778,7 @@ func TestTaskGroupDiff(t *testing.T) {
LocalBindPort: 8000,
Datacenter: "dc2",
LocalBindAddress: "127.0.0.2",
- MeshGateway: &ConsulMeshGateway{
+ MeshGateway: ConsulMeshGateway{
Mode: "remote",
},
},
@@ -2790,7 +2790,7 @@ func TestTaskGroupDiff(t *testing.T) {
},
Gateway: &ConsulGateway{
Proxy: &ConsulGatewayProxy{
- ConnectTimeout: helper.TimeToPtr(2 * time.Second),
+ ConnectTimeout: pointer.Of(2 * time.Second),
EnvoyGatewayBindTaggedAddresses: true,
EnvoyGatewayBindAddresses: map[string]*ConsulGatewayBindAddress{
"service1": {
@@ -3736,10 +3736,10 @@ func TestTaskGroupDiff(t *testing.T) {
{
TestCase: "TaskGroup shutdown_delay edited",
Old: &TaskGroup{
- ShutdownDelay: helper.TimeToPtr(30 * time.Second),
+ ShutdownDelay: pointer.Of(30 * time.Second),
},
New: &TaskGroup{
- ShutdownDelay: helper.TimeToPtr(5 * time.Second),
+ ShutdownDelay: pointer.Of(5 * time.Second),
},
Expected: &TaskGroupDiff{
Type: DiffTypeEdited,
@@ -3756,7 +3756,7 @@ func TestTaskGroupDiff(t *testing.T) {
{
TestCase: "TaskGroup shutdown_delay removed",
Old: &TaskGroup{
- ShutdownDelay: helper.TimeToPtr(30 * time.Second),
+ ShutdownDelay: pointer.Of(30 * time.Second),
},
New: &TaskGroup{},
Expected: &TaskGroupDiff{
@@ -3775,7 +3775,7 @@ func TestTaskGroupDiff(t *testing.T) {
TestCase: "TaskGroup shutdown_delay added",
Old: &TaskGroup{},
New: &TaskGroup{
- ShutdownDelay: helper.TimeToPtr(30 * time.Second),
+ ShutdownDelay: pointer.Of(30 * time.Second),
},
Expected: &TaskGroupDiff{
Type: DiffTypeEdited,
@@ -3943,7 +3943,7 @@ func TestTaskGroupDiff(t *testing.T) {
},
New: &TaskGroup{
Name: "foo",
- MaxClientDisconnect: helper.TimeToPtr(20 * time.Second),
+ MaxClientDisconnect: pointer.Of(20 * time.Second),
},
Expected: &TaskGroupDiff{
Type: DiffTypeEdited,
@@ -3962,11 +3962,11 @@ func TestTaskGroupDiff(t *testing.T) {
TestCase: "MaxClientDisconnect updated",
Old: &TaskGroup{
Name: "foo",
- MaxClientDisconnect: helper.TimeToPtr(10 * time.Second),
+ MaxClientDisconnect: pointer.Of(10 * time.Second),
},
New: &TaskGroup{
Name: "foo",
- MaxClientDisconnect: helper.TimeToPtr(20 * time.Second),
+ MaxClientDisconnect: pointer.Of(20 * time.Second),
},
Expected: &TaskGroupDiff{
Type: DiffTypeEdited,
@@ -3985,7 +3985,7 @@ func TestTaskGroupDiff(t *testing.T) {
TestCase: "MaxClientDisconnect deleted",
Old: &TaskGroup{
Name: "foo",
- MaxClientDisconnect: helper.TimeToPtr(10 * time.Second),
+ MaxClientDisconnect: pointer.Of(10 * time.Second),
},
New: &TaskGroup{
Name: "foo",
@@ -7042,11 +7042,19 @@ func TestTaskDiff(t *testing.T) {
EmbeddedTmpl: "baz",
ChangeMode: "bam",
ChangeSignal: "SIGHUP",
- Splay: 1,
- Perms: "0644",
+ ChangeScript: &ChangeScript{
+ Command: "/bin/foo",
+ Args: []string{"-debug"},
+ Timeout: 5,
+ FailOnError: false,
+ },
+ Splay: 1,
+ Perms: "0644",
+ Uid: pointer.Of(1001),
+ Gid: pointer.Of(21),
Wait: &WaitConfig{
- Min: helper.TimeToPtr(5 * time.Second),
- Max: helper.TimeToPtr(5 * time.Second),
+ Min: pointer.Of(5 * time.Second),
+ Max: pointer.Of(5 * time.Second),
},
},
{
@@ -7055,9 +7063,17 @@ func TestTaskDiff(t *testing.T) {
EmbeddedTmpl: "baz2",
ChangeMode: "bam2",
ChangeSignal: "SIGHUP2",
- Splay: 2,
- Perms: "0666",
- Envvars: true,
+ ChangeScript: &ChangeScript{
+ Command: "/bin/foo2",
+ Args: []string{"-debugs"},
+ Timeout: 6,
+ FailOnError: false,
+ },
+ Splay: 2,
+ Perms: "0666",
+ Uid: pointer.Of(1000),
+ Gid: pointer.Of(20),
+ Envvars: true,
},
},
},
@@ -7069,11 +7085,19 @@ func TestTaskDiff(t *testing.T) {
EmbeddedTmpl: "baz new",
ChangeMode: "bam",
ChangeSignal: "SIGHUP",
- Splay: 1,
- Perms: "0644",
+ ChangeScript: &ChangeScript{
+ Command: "/bin/foo",
+ Args: []string{"-debug"},
+ Timeout: 5,
+ FailOnError: false,
+ },
+ Splay: 1,
+ Perms: "0644",
+ Uid: pointer.Of(1001),
+ Gid: pointer.Of(21),
Wait: &WaitConfig{
- Min: helper.TimeToPtr(5 * time.Second),
- Max: helper.TimeToPtr(10 * time.Second),
+ Min: pointer.Of(5 * time.Second),
+ Max: pointer.Of(10 * time.Second),
},
},
{
@@ -7082,11 +7106,19 @@ func TestTaskDiff(t *testing.T) {
EmbeddedTmpl: "baz3",
ChangeMode: "bam3",
ChangeSignal: "SIGHUP3",
- Splay: 3,
- Perms: "0776",
+ ChangeScript: &ChangeScript{
+ Command: "/bin/foo3",
+ Args: []string{"-debugss"},
+ Timeout: 7,
+ FailOnError: false,
+ },
+ Splay: 3,
+ Perms: "0776",
+ Uid: pointer.Of(1002),
+ Gid: pointer.Of(22),
Wait: &WaitConfig{
- Min: helper.TimeToPtr(5 * time.Second),
- Max: helper.TimeToPtr(10 * time.Second),
+ Min: pointer.Of(5 * time.Second),
+ Max: pointer.Of(10 * time.Second),
},
},
},
@@ -7154,6 +7186,12 @@ func TestTaskDiff(t *testing.T) {
Old: "",
New: "false",
},
+ {
+ Type: DiffTypeAdded,
+ Name: "Gid",
+ Old: "",
+ New: "22",
+ },
{
Type: DiffTypeAdded,
Name: "Perms",
@@ -7172,6 +7210,12 @@ func TestTaskDiff(t *testing.T) {
Old: "",
New: "3",
},
+ {
+ Type: DiffTypeAdded,
+ Name: "Uid",
+ Old: "",
+ New: "1002",
+ },
{
Type: DiffTypeAdded,
Name: "VaultGrace",
@@ -7198,6 +7242,44 @@ func TestTaskDiff(t *testing.T) {
},
},
},
+ {
+ Type: DiffTypeAdded,
+ Name: "ChangeScript",
+ Fields: []*FieldDiff{
+ {
+ Type: DiffTypeAdded,
+ Name: "Command",
+ Old: "",
+ New: "/bin/foo3",
+ },
+ {
+ Type: DiffTypeAdded,
+ Name: "FailOnError",
+ Old: "",
+ New: "false",
+ },
+ {
+ Type: DiffTypeAdded,
+ Name: "Timeout",
+ Old: "",
+ New: "7",
+ },
+ },
+ Objects: []*ObjectDiff{
+ {
+ Type: DiffTypeAdded,
+ Name: "Args",
+ Fields: []*FieldDiff{
+ {
+ Type: DiffTypeAdded,
+ Name: "Args",
+ Old: "",
+ New: "-debugss",
+ },
+ },
+ },
+ },
+ },
},
},
{
@@ -7234,6 +7316,12 @@ func TestTaskDiff(t *testing.T) {
Old: "true",
New: "",
},
+ {
+ Type: DiffTypeDeleted,
+ Name: "Gid",
+ Old: "20",
+ New: "",
+ },
{
Type: DiffTypeDeleted,
Name: "Perms",
@@ -7252,6 +7340,12 @@ func TestTaskDiff(t *testing.T) {
Old: "2",
New: "",
},
+ {
+ Type: DiffTypeDeleted,
+ Name: "Uid",
+ Old: "1000",
+ New: "",
+ },
{
Type: DiffTypeDeleted,
Name: "VaultGrace",
@@ -7259,6 +7353,46 @@ func TestTaskDiff(t *testing.T) {
New: "",
},
},
+ Objects: []*ObjectDiff{
+ {
+ Type: DiffTypeDeleted,
+ Name: "ChangeScript",
+ Fields: []*FieldDiff{
+ {
+ Type: DiffTypeDeleted,
+ Name: "Command",
+ Old: "/bin/foo2",
+ New: "",
+ },
+ {
+ Type: DiffTypeDeleted,
+ Name: "FailOnError",
+ Old: "false",
+ New: "",
+ },
+ {
+ Type: DiffTypeDeleted,
+ Name: "Timeout",
+ Old: "6",
+ New: "",
+ },
+ },
+ Objects: []*ObjectDiff{
+ {
+ Type: DiffTypeDeleted,
+ Name: "Args",
+ Fields: []*FieldDiff{
+ {
+ Type: DiffTypeDeleted,
+ Name: "Args",
+ Old: "-debugs",
+ New: "",
+ },
+ },
+ },
+ },
+ },
+ },
},
},
},
diff --git a/nomad/structs/node.go b/nomad/structs/node.go
index 8bbdc7a4139..1dd7ed87cf8 100644
--- a/nomad/structs/node.go
+++ b/nomad/structs/node.go
@@ -12,29 +12,29 @@ import (
// "zone", "rack", etc.
//
// According to CSI, there are a few requirements for the keys within this map:
-// - Valid keys have two segments: an OPTIONAL prefix and name, separated
-// by a slash (/), for example: "com.company.example/zone".
-// - The key name segment is REQUIRED. The prefix is OPTIONAL.
-// - The key name MUST be 63 characters or less, begin and end with an
-// alphanumeric character ([a-z0-9A-Z]), and contain only dashes (-),
-// underscores (_), dots (.), or alphanumerics in between, for example
-// "zone".
-// - The key prefix MUST be 63 characters or less, begin and end with a
-// lower-case alphanumeric character ([a-z0-9]), contain only
-// dashes (-), dots (.), or lower-case alphanumerics in between, and
-// follow domain name notation format
-// (https://tools.ietf.org/html/rfc1035#section-2.3.1).
-// - The key prefix SHOULD include the plugin's host company name and/or
-// the plugin name, to minimize the possibility of collisions with keys
-// from other plugins.
-// - If a key prefix is specified, it MUST be identical across all
-// topology keys returned by the SP (across all RPCs).
-// - Keys MUST be case-insensitive. Meaning the keys "Zone" and "zone"
-// MUST not both exist.
-// - Each value (topological segment) MUST contain 1 or more strings.
-// - Each string MUST be 63 characters or less and begin and end with an
-// alphanumeric character with '-', '_', '.', or alphanumerics in
-// between.
+// - Valid keys have two segments: an OPTIONAL prefix and name, separated
+// by a slash (/), for example: "com.company.example/zone".
+// - The key name segment is REQUIRED. The prefix is OPTIONAL.
+// - The key name MUST be 63 characters or less, begin and end with an
+// alphanumeric character ([a-z0-9A-Z]), and contain only dashes (-),
+// underscores (_), dots (.), or alphanumerics in between, for example
+// "zone".
+// - The key prefix MUST be 63 characters or less, begin and end with a
+// lower-case alphanumeric character ([a-z0-9]), contain only
+// dashes (-), dots (.), or lower-case alphanumerics in between, and
+// follow domain name notation format
+// (https://tools.ietf.org/html/rfc1035#section-2.3.1).
+// - The key prefix SHOULD include the plugin's host company name and/or
+// the plugin name, to minimize the possibility of collisions with keys
+// from other plugins.
+// - If a key prefix is specified, it MUST be identical across all
+// topology keys returned by the SP (across all RPCs).
+// - Keys MUST be case-insensitive. Meaning the keys "Zone" and "zone"
+// MUST not both exist.
+// - Each value (topological segment) MUST contain 1 or more strings.
+// - Each string MUST be 63 characters or less and begin and end with an
+// alphanumeric character with '-', '_', '.', or alphanumerics in
+// between.
//
// However, Nomad applies lighter restrictions to these, as they are already
// only referenced by plugin within the scheduler and as such collisions and
diff --git a/nomad/structs/node_class_test.go b/nomad/structs/node_class_test.go
index 77faca36ba8..3975f0038aa 100644
--- a/nomad/structs/node_class_test.go
+++ b/nomad/structs/node_class_test.go
@@ -217,7 +217,7 @@ func TestNode_ComputedClass_Meta(t *testing.T) {
func TestNode_EscapedConstraints(t *testing.T) {
ci.Parallel(t)
-
+
// Non-escaped constraints
ne1 := &Constraint{
LTarget: "${attr.kernel.name}",
diff --git a/nomad/structs/operator.go b/nomad/structs/operator.go
index 28452a312f5..a6cfced9c71 100644
--- a/nomad/structs/operator.go
+++ b/nomad/structs/operator.go
@@ -125,6 +125,15 @@ type AutopilotConfig struct {
ModifyIndex uint64
}
+func (a *AutopilotConfig) Copy() *AutopilotConfig {
+ if a == nil {
+ return nil
+ }
+
+ na := *a
+ return &na
+}
+
// SchedulerAlgorithm is an enum string that encapsulates the valid options for a
// SchedulerConfiguration stanza's SchedulerAlgorithm. These modes will allow the
// scheduler to be user-selectable.
@@ -167,6 +176,15 @@ type SchedulerConfiguration struct {
ModifyIndex uint64
}
+func (s *SchedulerConfiguration) Copy() *SchedulerConfiguration {
+ if s == nil {
+ return s
+ }
+
+ ns := *s
+ return &ns
+}
+
func (s *SchedulerConfiguration) EffectiveSchedulerAlgorithm() SchedulerAlgorithm {
if s == nil || s.SchedulerAlgorithm == "" {
return SchedulerAlgorithmBinpack
diff --git a/nomad/structs/search.go b/nomad/structs/search.go
index 1ba8b78db3b..52cdb43e540 100644
--- a/nomad/structs/search.go
+++ b/nomad/structs/search.go
@@ -59,6 +59,15 @@ type SearchConfig struct {
MinTermLength int `hcl:"min_term_length"`
}
+func (s *SearchConfig) Copy() *SearchConfig {
+ if s == nil {
+ return nil
+ }
+
+ ns := *s
+ return &ns
+}
+
// SearchResponse is used to return matches and information about whether
// the match list is truncated specific to each type of Context.
type SearchResponse struct {
@@ -94,7 +103,8 @@ type SearchRequest struct {
// ID.
//
// e.g. A Task-level service would have scope like,
-// ["", "", "", ""]
+//
+// ["", "", "", ""]
type FuzzyMatch struct {
ID string // ID is UUID or Name of object
Scope []string `json:",omitempty"` // IDs of parent objects
diff --git a/nomad/structs/secure_variables.go b/nomad/structs/secure_variables.go
index d5af53ce66a..dead3c1b055 100644
--- a/nomad/structs/secure_variables.go
+++ b/nomad/structs/secure_variables.go
@@ -17,19 +17,13 @@ import (
)
const (
- // SecureVariablesUpsertRPCMethod is the RPC method for upserting
- // secure variables into Nomad state.
+ // SecureVariablesApplyRPCMethod is the RPC method for upserting or
+ // deleting a secure variable by its namespace and path, with optional
+ // conflict detection.
//
- // Args: SecureVariablesUpsertRequest
- // Reply: SecureVariablesUpsertResponse
- SecureVariablesUpsertRPCMethod = "SecureVariables.Upsert"
-
- // SecureVariablesDeleteRPCMethod is the RPC method for deleting
- // a secure variable by its namespace and path.
- //
- // Args: SecureVariablesDeleteRequest
- // Reply: SecureVariablesDeleteResponse
- SecureVariablesDeleteRPCMethod = "SecureVariables.Delete"
+ // Args: SecureVariablesApplyRequest
+ // Reply: SecureVariablesApplyResponse
+ SecureVariablesApplyRPCMethod = "SecureVariables.Apply"
// SecureVariablesListRPCMethod is the RPC method for listing secure
// variables within Nomad.
@@ -214,13 +208,14 @@ func (sv SecureVariableMetadata) GetCreateIndex() uint64 {
return sv.CreateIndex
}
-// SecureVariablesQuota is used to track the total size of secure
-// variables entries per namespace. The total length of
-// SecureVariable.EncryptedData will be added to the SecureVariablesQuota
-// table in the same transaction as a write, update, or delete.
+// SecureVariablesQuota is used to track the total size of secure variables
+// entries per namespace. The total length of SecureVariable.EncryptedData in
+// bytes will be added to the SecureVariablesQuota table in the same transaction
+// as a write, update, or delete. This tracking effectively caps the maximum
+// size of secure variables in a given namespace to MaxInt64 bytes.
type SecureVariablesQuota struct {
Namespace string
- Size uint64
+ Size int64
CreateIndex uint64
ModifyIndex uint64
}
@@ -234,26 +229,127 @@ func (svq *SecureVariablesQuota) Copy() *SecureVariablesQuota {
return nq
}
-type SecureVariablesUpsertRequest struct {
- Data []*SecureVariableDecrypted
- CheckIndex *uint64
+// ---------------------------------------
+// RPC and FSM request/response objects
+
+// SVOp constants give possible operations available in a transaction.
+type SVOp string
+
+const (
+ SVOpSet SVOp = "set"
+ SVOpDelete SVOp = "delete"
+ SVOpDeleteCAS SVOp = "delete-cas"
+ SVOpCAS SVOp = "cas"
+)
+
+// SVOpResult constants give possible operations results from a transaction.
+type SVOpResult string
+
+const (
+ SVOpResultOk SVOpResult = "ok"
+ SVOpResultConflict SVOpResult = "conflict"
+ SVOpResultRedacted SVOpResult = "conflict-redacted"
+ SVOpResultError SVOpResult = "error"
+)
+
+// SecureVariablesApplyRequest is used by users to operate on the secure variable store
+type SecureVariablesApplyRequest struct {
+ Op SVOp // Operation to be performed during apply
+ Var *SecureVariableDecrypted // Variable-shaped request data
WriteRequest
}
-func (svur *SecureVariablesUpsertRequest) SetCheckIndex(ci uint64) {
- svur.CheckIndex = &ci
+// SecureVariablesApplyResponse is sent back to the user to inform them of success or failure
+type SecureVariablesApplyResponse struct {
+ Op SVOp // Operation performed
+ Input *SecureVariableDecrypted // Input supplied
+ Result SVOpResult // Return status from operation
+ Error error // Error if any
+ Conflict *SecureVariableDecrypted // Conflicting value if applicable
+ Output *SecureVariableDecrypted // Operation Result if successful; nil for successful deletes
+ WriteMeta
+}
+
+func (r *SecureVariablesApplyResponse) IsOk() bool {
+ return r.Result == SVOpResultOk
}
-type SecureVariablesEncryptedUpsertRequest struct {
- Data []*SecureVariableEncrypted
+func (r *SecureVariablesApplyResponse) IsConflict() bool {
+ return r.Result == SVOpResultConflict || r.Result == SVOpResultRedacted
+}
+
+func (r *SecureVariablesApplyResponse) IsError() bool {
+ return r.Result == SVOpResultError
+}
+
+func (r *SecureVariablesApplyResponse) IsRedacted() bool {
+ return r.Result == SVOpResultRedacted
+}
+
+// SVApplyStateRequest is used by the FSM to modify the secure variable store
+type SVApplyStateRequest struct {
+ Op SVOp // Which operation are we performing
+ Var *SecureVariableEncrypted // Which directory entry
WriteRequest
}
-type SecureVariablesUpsertResponse struct {
- Conflicts []*SecureVariableDecrypted
+// SVApplyStateResponse is used by the FSM to inform the RPC layer of success or failure
+type SVApplyStateResponse struct {
+ Op SVOp // Which operation were we performing
+ Result SVOpResult // What happened (ok, conflict, error)
+ Error error // error if any
+ Conflict *SecureVariableEncrypted // conflicting secure variable if applies
+ WrittenSVMeta *SecureVariableMetadata // for making the SecureVariablesApplyResponse
WriteMeta
}
+func (r *SVApplyStateRequest) ErrorResponse(raftIndex uint64, err error) *SVApplyStateResponse {
+ return &SVApplyStateResponse{
+ Op: r.Op,
+ Result: SVOpResultError,
+ Error: err,
+ WriteMeta: WriteMeta{Index: raftIndex},
+ }
+}
+
+func (r *SVApplyStateRequest) SuccessResponse(raftIndex uint64, meta *SecureVariableMetadata) *SVApplyStateResponse {
+ return &SVApplyStateResponse{
+ Op: r.Op,
+ Result: SVOpResultOk,
+ WrittenSVMeta: meta,
+ WriteMeta: WriteMeta{Index: raftIndex},
+ }
+}
+
+func (r *SVApplyStateRequest) ConflictResponse(raftIndex uint64, cv *SecureVariableEncrypted) *SVApplyStateResponse {
+ var cvCopy SecureVariableEncrypted
+ if cv != nil {
+ // make a copy so that we aren't sending
+ // the live state store version
+ cvCopy = cv.Copy()
+ }
+ return &SVApplyStateResponse{
+ Op: r.Op,
+ Result: SVOpResultConflict,
+ Conflict: &cvCopy,
+ WriteMeta: WriteMeta{Index: raftIndex},
+ }
+}
+
+func (r *SVApplyStateResponse) IsOk() bool {
+ return r.Result == SVOpResultOk
+}
+
+func (r *SVApplyStateResponse) IsConflict() bool {
+ return r.Result == SVOpResultConflict
+}
+
+func (r *SVApplyStateResponse) IsError() bool {
+ // FIXME: This is brittle and requires immense faith that
+ // the response is properly managed.
+ return r.Result == SVOpResultError
+}
+
type SecureVariablesListRequest struct {
QueryOptions
}
@@ -273,20 +369,8 @@ type SecureVariablesReadResponse struct {
QueryMeta
}
-type SecureVariablesDeleteRequest struct {
- Path string
- CheckIndex *uint64
- WriteRequest
-}
-
-func (svdr *SecureVariablesDeleteRequest) SetCheckIndex(ci uint64) {
- svdr.CheckIndex = &ci
-}
-
-type SecureVariablesDeleteResponse struct {
- Conflict *SecureVariableDecrypted
- WriteMeta
-}
+// ---------------------------------------
+// Keyring state and RPC objects
// RootKey is used to encrypt and decrypt secure variables. It is
// never stored in raft.
diff --git a/nomad/structs/services.go b/nomad/structs/services.go
index 757c3185dd3..38ddd5970a3 100644
--- a/nomad/structs/services.go
+++ b/nomad/structs/services.go
@@ -19,6 +19,7 @@ import (
"github.com/hashicorp/go-multierror"
"github.com/hashicorp/nomad/helper"
"github.com/hashicorp/nomad/helper/args"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/mitchellh/copystructure"
"golang.org/x/exp/slices"
)
@@ -193,13 +194,14 @@ func (sc *ServiceCheck) Equals(o *ServiceCheck) bool {
return true
}
-func (sc *ServiceCheck) Canonicalize(serviceName string) {
+func (sc *ServiceCheck) Canonicalize(serviceName, taskName string) {
// Ensure empty maps/slices are treated as null to avoid scheduling
// issues when using DeepEquals.
if len(sc.Args) == 0 {
sc.Args = nil
}
+ // Ensure empty slices are nil
if len(sc.Header) == 0 {
sc.Header = nil
} else {
@@ -210,10 +212,17 @@ func (sc *ServiceCheck) Canonicalize(serviceName string) {
}
}
+ // Ensure a default name for the check
if sc.Name == "" {
sc.Name = fmt.Sprintf("service: %q check", serviceName)
}
+ // Set task name if not already set
+ if sc.TaskName == "" && taskName != "group" {
+ sc.TaskName = taskName
+ }
+
+ // Ensure OnUpdate defaults to require_healthy (i.e. healthiness check)
if sc.OnUpdate == "" {
sc.OnUpdate = OnUpdateRequireHealthy
}
@@ -344,17 +353,8 @@ func (sc *ServiceCheck) validateNomad() error {
}
if sc.Type == "http" {
- if sc.Method != "" && sc.Method != "GET" {
- // unset turns into GET
- return fmt.Errorf("http checks may only use GET method in Nomad services")
- }
-
- if len(sc.Header) > 0 {
- return fmt.Errorf("http checks may not set headers in Nomad services")
- }
-
- if len(sc.Body) > 0 {
- return fmt.Errorf("http checks may not set Body in Nomad services")
+ if sc.Method != "" && !helper.IsMethodHTTP(sc.Method) {
+ return fmt.Errorf("method type %q not supported in Nomad http check", sc.Method)
}
}
@@ -534,9 +534,10 @@ type Service struct {
Name string
// Name of the Task associated with this service.
- //
- // Currently only used to identify the implementing task of a Consul
- // Connect Native enabled service.
+ // Group services do not have a task name, unless they are a connect native
+ // service specifying the task implementing the service.
+ // Task-level services automatically have the task name plumbed through
+ // down to checks for convenience.
TaskName string
// PortLabel is either the numeric port number or the `host:port`.
@@ -632,6 +633,11 @@ func (s *Service) Canonicalize(job, taskGroup, task, jobNamespace string) {
s.TaggedAddresses = nil
}
+ // Set the task name if not already set
+ if s.TaskName == "" && task != "group" {
+ s.TaskName = task
+ }
+
s.Name = args.ReplaceEnv(s.Name, map[string]string{
"JOB": job,
"TASKGROUP": taskGroup,
@@ -640,7 +646,7 @@ func (s *Service) Canonicalize(job, taskGroup, task, jobNamespace string) {
})
for _, check := range s.Checks {
- check.Canonicalize(s.Name)
+ check.Canonicalize(s.Name, s.TaskName)
}
// Set the provider to its default value. The value of consul ensures this
@@ -900,20 +906,7 @@ func (s *Service) Equals(o *Service) bool {
return false
}
- if len(s.Checks) != len(o.Checks) {
- return false
- }
-
-OUTER:
- for i := range s.Checks {
- for ii := range o.Checks {
- if s.Checks[i].Equals(o.Checks[ii]) {
- // Found match; continue with next check
- continue OUTER
- }
- }
-
- // No match
+ if !helper.ElementsEquals(s.Checks, o.Checks) {
return false
}
@@ -1255,11 +1248,11 @@ func (t *SidecarTask) Copy() *SidecarTask {
}
if t.KillTimeout != nil {
- nt.KillTimeout = helper.TimeToPtr(*t.KillTimeout)
+ nt.KillTimeout = pointer.Of(*t.KillTimeout)
}
if t.ShutdownDelay != nil {
- nt.ShutdownDelay = helper.TimeToPtr(*t.ShutdownDelay)
+ nt.ShutdownDelay = pointer.Of(*t.ShutdownDelay)
}
return nt
@@ -1452,21 +1445,13 @@ type ConsulMeshGateway struct {
Mode string
}
-func (c *ConsulMeshGateway) Copy() *ConsulMeshGateway {
- if c == nil {
- return nil
- }
-
- return &ConsulMeshGateway{
+func (c *ConsulMeshGateway) Copy() ConsulMeshGateway {
+ return ConsulMeshGateway{
Mode: c.Mode,
}
}
-func (c *ConsulMeshGateway) Equals(o *ConsulMeshGateway) bool {
- if c == nil || o == nil {
- return c == o
- }
-
+func (c *ConsulMeshGateway) Equals(o ConsulMeshGateway) bool {
return c.Mode == o.Mode
}
@@ -1504,7 +1489,7 @@ type ConsulUpstream struct {
// MeshGateway is the optional configuration of the mesh gateway for this
// upstream to use.
- MeshGateway *ConsulMeshGateway
+ MeshGateway ConsulMeshGateway
}
func upstreamsEquals(a, b []ConsulUpstream) bool {
@@ -1785,7 +1770,7 @@ func (p *ConsulGatewayProxy) Copy() *ConsulGatewayProxy {
}
return &ConsulGatewayProxy{
- ConnectTimeout: helper.TimeToPtr(*p.ConnectTimeout),
+ ConnectTimeout: pointer.Of(*p.ConnectTimeout),
EnvoyGatewayBindTaggedAddresses: p.EnvoyGatewayBindTaggedAddresses,
EnvoyGatewayBindAddresses: p.copyBindAddresses(),
EnvoyGatewayNoDefaultBind: p.EnvoyGatewayNoDefaultBind,
diff --git a/nomad/structs/services_test.go b/nomad/structs/services_test.go
index b44c9baefb8..93954769435 100644
--- a/nomad/structs/services_test.go
+++ b/nomad/structs/services_test.go
@@ -7,9 +7,8 @@ import (
"github.com/hashicorp/go-multierror"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/shoenig/test/must"
- "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
@@ -57,6 +56,41 @@ func TestServiceCheck_Hash(t *testing.T) {
})
}
+func TestServiceCheck_Canonicalize(t *testing.T) {
+ ci.Parallel(t)
+
+ t.Run("defaults", func(t *testing.T) {
+ sc := &ServiceCheck{
+ Args: []string{},
+ Header: make(map[string][]string),
+ Method: "",
+ OnUpdate: "",
+ }
+ sc.Canonicalize("MyService", "task1")
+ must.Nil(t, sc.Args)
+ must.Nil(t, sc.Header)
+ must.Eq(t, `service: "MyService" check`, sc.Name)
+ must.Eq(t, "", sc.Method)
+ must.Eq(t, OnUpdateRequireHealthy, sc.OnUpdate)
+ })
+
+ t.Run("check name set", func(t *testing.T) {
+ sc := &ServiceCheck{
+ Name: "Some Check",
+ }
+ sc.Canonicalize("MyService", "task1")
+ must.Eq(t, "Some Check", sc.Name)
+ })
+
+ t.Run("on_update is set", func(t *testing.T) {
+ sc := &ServiceCheck{
+ OnUpdate: OnUpdateIgnore,
+ }
+ sc.Canonicalize("MyService", "task1")
+ must.Eq(t, OnUpdateIgnore, sc.OnUpdate)
+ })
+}
+
func TestServiceCheck_validate_PassingTypes(t *testing.T) {
ci.Parallel(t)
@@ -268,7 +302,17 @@ func TestServiceCheck_validateNomad(t *testing.T) {
Path: "/health",
Method: "HEAD",
},
- exp: `http checks may only use GET method in Nomad services`,
+ },
+ {
+ name: "http unknown method type",
+ sc: &ServiceCheck{
+ Type: ServiceCheckHTTP,
+ Interval: 3 * time.Second,
+ Timeout: 1 * time.Second,
+ Path: "/health",
+ Method: "Invalid",
+ },
+ exp: `method type "Invalid" not supported in Nomad http check`,
},
{
name: "http with headers",
@@ -278,9 +322,11 @@ func TestServiceCheck_validateNomad(t *testing.T) {
Timeout: 1 * time.Second,
Path: "/health",
Method: "GET",
- Header: map[string][]string{"foo": {"bar"}},
+ Header: map[string][]string{
+ "foo": {"bar"},
+ "baz": nil,
+ },
},
- exp: `http checks may not set headers in Nomad services`,
},
{
name: "http with body",
@@ -289,10 +335,9 @@ func TestServiceCheck_validateNomad(t *testing.T) {
Interval: 3 * time.Second,
Timeout: 1 * time.Second,
Path: "/health",
- Method: "GET",
- Body: "blah",
+ Method: "POST",
+ Body: "this is a request payload!",
},
- exp: `http checks may not set Body in Nomad services`,
},
}
@@ -486,7 +531,7 @@ func TestConsulConnect_GatewayProxy_CopyEquals(t *testing.T) {
ci.Parallel(t)
c := &ConsulGatewayProxy{
- ConnectTimeout: helper.TimeToPtr(1 * time.Second),
+ ConnectTimeout: pointer.Of(1 * time.Second),
EnvoyGatewayBindTaggedAddresses: false,
EnvoyGatewayBindAddresses: make(map[string]*ConsulGatewayBindAddress),
}
@@ -520,11 +565,11 @@ func TestSidecarTask_MergeIntoTask(t *testing.T) {
Meta: map[string]string{
"abc": "123",
},
- KillTimeout: helper.TimeToPtr(15 * time.Second),
+ KillTimeout: pointer.Of(15 * time.Second),
LogConfig: &LogConfig{
MaxFiles: 3,
},
- ShutdownDelay: helper.TimeToPtr(5 * time.Second),
+ ShutdownDelay: pointer.Of(5 * time.Second),
KillSignal: "SIGABRT",
}
@@ -566,12 +611,12 @@ func TestSidecarTask_Equals(t *testing.T) {
Env: map[string]string{"color": "blue"},
Resources: &Resources{MemoryMB: 300},
Meta: map[string]string{"index": "1"},
- KillTimeout: helper.TimeToPtr(2 * time.Second),
+ KillTimeout: pointer.Of(2 * time.Second),
LogConfig: &LogConfig{
MaxFiles: 2,
MaxFileSizeMB: 300,
},
- ShutdownDelay: helper.TimeToPtr(10 * time.Second),
+ ShutdownDelay: pointer.Of(10 * time.Second),
KillSignal: "SIGTERM",
}
@@ -618,7 +663,7 @@ func TestSidecarTask_Equals(t *testing.T) {
})
t.Run("mod kill timeout", func(t *testing.T) {
- try(t, func(s *st) { s.KillTimeout = helper.TimeToPtr(3 * time.Second) })
+ try(t, func(s *st) { s.KillTimeout = pointer.Of(3 * time.Second) })
})
t.Run("mod log config", func(t *testing.T) {
@@ -626,7 +671,7 @@ func TestSidecarTask_Equals(t *testing.T) {
})
t.Run("mod shutdown delay", func(t *testing.T) {
- try(t, func(s *st) { s.ShutdownDelay = helper.TimeToPtr(20 * time.Second) })
+ try(t, func(s *st) { s.ShutdownDelay = pointer.Of(20 * time.Second) })
})
t.Run("mod kill signal", func(t *testing.T) {
@@ -667,8 +712,8 @@ func TestConsulUpstream_upstreamEquals(t *testing.T) {
})
t.Run("different mesh_gateway", func(t *testing.T) {
- a := []ConsulUpstream{{DestinationName: "foo", MeshGateway: &ConsulMeshGateway{Mode: "local"}}}
- b := []ConsulUpstream{{DestinationName: "foo", MeshGateway: &ConsulMeshGateway{Mode: "remote"}}}
+ a := []ConsulUpstream{{DestinationName: "foo", MeshGateway: ConsulMeshGateway{Mode: "local"}}}
+ b := []ConsulUpstream{{DestinationName: "foo", MeshGateway: ConsulMeshGateway{Mode: "remote"}}}
require.False(t, upstreamsEquals(a, b))
})
@@ -779,7 +824,7 @@ func TestConsulSidecarService_Copy(t *testing.T) {
var (
consulIngressGateway1 = &ConsulGateway{
Proxy: &ConsulGatewayProxy{
- ConnectTimeout: helper.TimeToPtr(1 * time.Second),
+ ConnectTimeout: pointer.Of(1 * time.Second),
EnvoyGatewayBindTaggedAddresses: true,
EnvoyGatewayBindAddresses: map[string]*ConsulGatewayBindAddress{
"listener1": {Address: "10.0.0.1", Port: 2001},
@@ -816,7 +861,7 @@ var (
consulTerminatingGateway1 = &ConsulGateway{
Proxy: &ConsulGatewayProxy{
- ConnectTimeout: helper.TimeToPtr(1 * time.Second),
+ ConnectTimeout: pointer.Of(1 * time.Second),
EnvoyDNSDiscoveryType: "STRICT_DNS",
EnvoyGatewayBindAddresses: nil,
},
@@ -835,7 +880,7 @@ var (
consulMeshGateway1 = &ConsulGateway{
Proxy: &ConsulGatewayProxy{
- ConnectTimeout: helper.TimeToPtr(1 * time.Second),
+ ConnectTimeout: pointer.Of(1 * time.Second),
},
Mesh: &ConsulMeshConfigEntry{
// nothing
@@ -940,7 +985,7 @@ func TestConsulGateway_Equals_ingress(t *testing.T) {
// proxy stanza equality checks
t.Run("mod gateway timeout", func(t *testing.T) {
- try(t, func(g *cg) { g.Proxy.ConnectTimeout = helper.TimeToPtr(9 * time.Second) })
+ try(t, func(g *cg) { g.Proxy.ConnectTimeout = pointer.Of(9 * time.Second) })
})
t.Run("mod gateway envoy_gateway_bind_tagged_addresses", func(t *testing.T) {
@@ -1222,7 +1267,7 @@ func TestConsulGatewayProxy_Validate(t *testing.T) {
t.Run("invalid bind address", func(t *testing.T) {
err := (&ConsulGatewayProxy{
- ConnectTimeout: helper.TimeToPtr(1 * time.Second),
+ ConnectTimeout: pointer.Of(1 * time.Second),
EnvoyGatewayBindAddresses: map[string]*ConsulGatewayBindAddress{
"service1": {
Address: "10.0.0.1",
@@ -1234,7 +1279,7 @@ func TestConsulGatewayProxy_Validate(t *testing.T) {
t.Run("invalid dns discovery type", func(t *testing.T) {
err := (&ConsulGatewayProxy{
- ConnectTimeout: helper.TimeToPtr(1 * time.Second),
+ ConnectTimeout: pointer.Of(1 * time.Second),
EnvoyDNSDiscoveryType: "RANDOM_DNS",
}).Validate()
require.EqualError(t, err, "Consul Gateway Proxy Envoy DNS Discovery type must be STRICT_DNS or LOGICAL_DNS")
@@ -1242,14 +1287,14 @@ func TestConsulGatewayProxy_Validate(t *testing.T) {
t.Run("ok with nothing set", func(t *testing.T) {
err := (&ConsulGatewayProxy{
- ConnectTimeout: helper.TimeToPtr(1 * time.Second),
+ ConnectTimeout: pointer.Of(1 * time.Second),
}).Validate()
require.NoError(t, err)
})
t.Run("ok with everything set", func(t *testing.T) {
err := (&ConsulGatewayProxy{
- ConnectTimeout: helper.TimeToPtr(1 * time.Second),
+ ConnectTimeout: pointer.Of(1 * time.Second),
EnvoyGatewayBindAddresses: map[string]*ConsulGatewayBindAddress{
"service1": {
Address: "10.0.0.1",
@@ -1592,11 +1637,11 @@ func TestConsulMeshGateway_Copy(t *testing.T) {
func TestConsulMeshGateway_Equals(t *testing.T) {
ci.Parallel(t)
- c := &ConsulMeshGateway{Mode: "local"}
- require.False(t, c.Equals(nil))
+ c := ConsulMeshGateway{Mode: "local"}
+ require.False(t, c.Equals(ConsulMeshGateway{}))
require.True(t, c.Equals(c))
- o := &ConsulMeshGateway{Mode: "remote"}
+ o := ConsulMeshGateway{Mode: "remote"}
require.False(t, c.Equals(o))
}
@@ -1629,24 +1674,24 @@ func TestService_Validate(t *testing.T) {
name string
}{
{
+ name: "base service",
input: &Service{
Name: "testservice",
},
expErr: false,
- name: "base service",
},
{
+ name: "Native Connect without task name",
input: &Service{
Name: "testservice",
Connect: &ConsulConnect{
Native: true,
},
},
- expErr: true,
- expErrStr: "Connect Native and requires setting the task",
- name: "Native Connect without task name",
+ expErr: false, // gets set automatically
},
{
+ name: "Native Connect with task name",
input: &Service{
Name: "testservice",
TaskName: "testtask",
@@ -1655,9 +1700,9 @@ func TestService_Validate(t *testing.T) {
},
},
expErr: false,
- name: "Native Connect with task name",
},
{
+ name: "Native Connect with Sidecar",
input: &Service{
Name: "testservice",
TaskName: "testtask",
@@ -1668,9 +1713,9 @@ func TestService_Validate(t *testing.T) {
},
expErr: true,
expErrStr: "Consul Connect must be exclusively native",
- name: "Native Connect with Sidecar",
},
{
+ name: "provider nomad with checks",
input: &Service{
Name: "testservice",
Provider: "nomad",
@@ -1692,9 +1737,9 @@ func TestService_Validate(t *testing.T) {
},
},
expErr: false,
- name: "provider nomad with checks",
},
{
+ name: "provider nomad with invalid check type",
input: &Service{
Name: "testservice",
Provider: "nomad",
@@ -1706,9 +1751,9 @@ func TestService_Validate(t *testing.T) {
},
},
expErr: true,
- name: "provider nomad with invalid check type",
},
{
+ name: "provider nomad with connect",
input: &Service{
Name: "testservice",
Provider: "nomad",
@@ -1718,15 +1763,14 @@ func TestService_Validate(t *testing.T) {
},
expErr: true,
expErrStr: "Service with provider nomad cannot include Connect blocks",
- name: "provider nomad with connect",
},
{
+ name: "provider nomad valid",
input: &Service{
Name: "testservice",
Provider: "nomad",
},
expErr: false,
- name: "provider nomad valid",
},
}
@@ -1735,10 +1779,10 @@ func TestService_Validate(t *testing.T) {
tc.input.Canonicalize("testjob", "testgroup", "testtask", "testnamespace")
err := tc.input.Validate()
if tc.expErr {
- assert.Error(t, err)
- assert.Contains(t, err.Error(), tc.expErrStr)
+ require.Error(t, err)
+ require.Contains(t, err.Error(), tc.expErrStr)
} else {
- assert.NoError(t, err)
+ require.NoError(t, err)
}
})
}
diff --git a/nomad/structs/structs.go b/nomad/structs/structs.go
index 24f91ab7bb4..1d88f7c4333 100644
--- a/nomad/structs/structs.go
+++ b/nomad/structs/structs.go
@@ -37,6 +37,7 @@ import (
"github.com/hashicorp/nomad/helper/args"
"github.com/hashicorp/nomad/helper/constraints/semver"
"github.com/hashicorp/nomad/helper/escapingfs"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/lib/cpuset"
"github.com/hashicorp/nomad/lib/kheap"
@@ -109,12 +110,11 @@ const (
ServiceRegistrationUpsertRequestType MessageType = 47
ServiceRegistrationDeleteByIDRequestType MessageType = 48
ServiceRegistrationDeleteByNodeIDRequestType MessageType = 49
- SecureVariableUpsertRequestType MessageType = 50
- SecureVariableDeleteRequestType MessageType = 51
- RootKeyMetaUpsertRequestType MessageType = 52
- RootKeyMetaDeleteRequestType MessageType = 53
- ACLRolesUpsertRequestType MessageType = 54
- ACLRolesDeleteByIDRequestType MessageType = 55
+ SVApplyStateRequestType MessageType = 50
+ RootKeyMetaUpsertRequestType MessageType = 51
+ RootKeyMetaDeleteRequestType MessageType = 52
+ ACLRolesUpsertRequestType MessageType = 53
+ ACLRolesDeleteByIDRequestType MessageType = 54
// Namespace types were moved from enterprise and therefore start at 64
NamespaceUpsertRequestType MessageType = 64
@@ -1030,6 +1030,7 @@ type AllocsGetRequest struct {
type AllocRestartRequest struct {
AllocID string
TaskName string
+ AllTasks bool
QueryOptions
}
@@ -2061,9 +2062,8 @@ func (n *Node) Copy() *Node {
if n == nil {
return nil
}
- nn := new(Node)
- *nn = *n
- nn.Attributes = helper.CopyMapStringString(nn.Attributes)
+ nn := *n
+ nn.Attributes = helper.CopyMap(nn.Attributes)
nn.NodeResources = nn.NodeResources.Copy()
nn.ReservedResources = nn.ReservedResources.Copy()
nn.Resources = nn.Resources.Copy()
@@ -2071,87 +2071,14 @@ func (n *Node) Copy() *Node {
nn.Links = helper.CopyMapStringString(nn.Links)
nn.Meta = helper.CopyMapStringString(nn.Meta)
nn.DrainStrategy = nn.DrainStrategy.Copy()
- nn.Events = copyNodeEvents(n.Events)
- nn.Drivers = copyNodeDrivers(n.Drivers)
- nn.CSIControllerPlugins = copyNodeCSI(nn.CSIControllerPlugins)
- nn.CSINodePlugins = copyNodeCSI(nn.CSINodePlugins)
- nn.HostVolumes = copyNodeHostVolumes(n.HostVolumes)
- nn.HostNetworks = copyNodeHostNetworks(n.HostNetworks)
+ nn.Events = helper.CopySlice(n.Events)
+ nn.Drivers = helper.DeepCopyMap(n.Drivers)
+ nn.CSIControllerPlugins = helper.DeepCopyMap(nn.CSIControllerPlugins)
+ nn.CSINodePlugins = helper.DeepCopyMap(nn.CSINodePlugins)
+ nn.HostVolumes = helper.DeepCopyMap(n.HostVolumes)
+ nn.HostNetworks = helper.DeepCopyMap(n.HostNetworks)
nn.LastDrain = nn.LastDrain.Copy()
- return nn
-}
-
-// copyNodeEvents is a helper to copy a list of NodeEvent's
-func copyNodeEvents(events []*NodeEvent) []*NodeEvent {
- l := len(events)
- if l == 0 {
- return nil
- }
-
- c := make([]*NodeEvent, l)
- for i, event := range events {
- c[i] = event.Copy()
- }
- return c
-}
-
-// copyNodeCSI is a helper to copy a map of CSIInfo
-func copyNodeCSI(plugins map[string]*CSIInfo) map[string]*CSIInfo {
- l := len(plugins)
- if l == 0 {
- return nil
- }
-
- c := make(map[string]*CSIInfo, l)
- for plugin, info := range plugins {
- c[plugin] = info.Copy()
- }
-
- return c
-}
-
-// copyNodeDrivers is a helper to copy a map of DriverInfo
-func copyNodeDrivers(drivers map[string]*DriverInfo) map[string]*DriverInfo {
- l := len(drivers)
- if l == 0 {
- return nil
- }
-
- c := make(map[string]*DriverInfo, l)
- for driver, info := range drivers {
- c[driver] = info.Copy()
- }
- return c
-}
-
-// copyNodeHostVolumes is a helper to copy a map of string to Volume
-func copyNodeHostVolumes(volumes map[string]*ClientHostVolumeConfig) map[string]*ClientHostVolumeConfig {
- l := len(volumes)
- if l == 0 {
- return nil
- }
-
- c := make(map[string]*ClientHostVolumeConfig, l)
- for volume, v := range volumes {
- c[volume] = v.Copy()
- }
-
- return c
-}
-
-// copyNodeHostVolumes is a helper to copy a map of string to HostNetwork
-func copyNodeHostNetworks(networks map[string]*ClientHostNetworkConfig) map[string]*ClientHostNetworkConfig {
- l := len(networks)
- if l == 0 {
- return nil
- }
-
- c := make(map[string]*ClientHostNetworkConfig, l)
- for network, v := range networks {
- c[network] = v.Copy()
- }
-
- return c
+ return &nn
}
// TerminalStatus returns if the current status is terminal and
@@ -6677,10 +6604,19 @@ func (tg *TaskGroup) validateServices() error {
for _, service := range task.Services {
- // Ensure no task-level checks specify a task
+ // Ensure no task-level service can only specify the task it belongs to.
+ if service.TaskName != "" && service.TaskName != task.Name {
+ mErr.Errors = append(mErr.Errors,
+ fmt.Errorf("Service %s is invalid: may only specify task the service belongs to, got %q", service.Name, service.TaskName),
+ )
+ }
+
+ // Ensure no task-level checks can only specify the task they belong to.
for _, check := range service.Checks {
- if check.TaskName != "" {
- mErr.Errors = append(mErr.Errors, fmt.Errorf("Check %s is invalid: only task group service checks can be assigned tasks", check.Name))
+ if check.TaskName != "" && check.TaskName != task.Name {
+ mErr.Errors = append(mErr.Errors,
+ fmt.Errorf("Check %s is invalid: may only specify task the check belongs to, got %q", check.Name, check.TaskName),
+ )
}
}
@@ -7107,6 +7043,25 @@ func (t *Task) UsesConnectSidecar() bool {
return t.Kind.IsConnectProxy() || t.Kind.IsAnyConnectGateway()
}
+func (t *Task) IsPrestart() bool {
+ return t != nil && t.Lifecycle != nil &&
+ t.Lifecycle.Hook == TaskLifecycleHookPrestart
+}
+
+func (t *Task) IsMain() bool {
+ return t != nil && (t.Lifecycle == nil || t.Lifecycle.Hook == "")
+}
+
+func (t *Task) IsPoststart() bool {
+ return t != nil && t.Lifecycle != nil &&
+ t.Lifecycle.Hook == TaskLifecycleHookPoststart
+}
+
+func (t *Task) IsPoststop() bool {
+ return t != nil && t.Lifecycle != nil &&
+ t.Lifecycle.Hook == TaskLifecycleHookPoststop
+}
+
func (t *Task) Copy() *Task {
if t == nil {
return nil
@@ -7679,14 +7634,32 @@ const (
// TemplateChangeModeRestart marks that the task should be restarted if the
// template is re-rendered
TemplateChangeModeRestart = "restart"
+
+ // TemplateChangeModeScript marks that the task should trigger a script if
+ // the template is re-rendered
+ TemplateChangeModeScript = "script"
)
var (
// TemplateChangeModeInvalidError is the error for when an invalid change
// mode is given
- TemplateChangeModeInvalidError = errors.New("Invalid change mode. Must be one of the following: noop, signal, restart")
+ TemplateChangeModeInvalidError = errors.New("Invalid change mode. Must be one of the following: noop, signal, script, restart")
)
+// ChangeScript holds the configuration for the script that is executed if
+// change mode is set to script
+type ChangeScript struct {
+ // Command is the full path to the script
+ Command string
+ // Args is a slice of arguments passed to the script
+ Args []string
+ // Timeout is the amount of seconds we wait for the script to finish
+ Timeout time.Duration
+ // FailOnError indicates whether a task should fail in case script execution
+ // fails or log script failure and don't interrupt the task
+ FailOnError bool
+}
+
// Template represents a template configuration to be rendered for a given task
type Template struct {
// SourcePath is the path to the template to be rendered
@@ -7706,6 +7679,10 @@ type Template struct {
// requires it.
ChangeSignal string
+ // ChangeScript is the configuration of the script. It's required if
+ // ChangeMode is set to script.
+ ChangeScript *ChangeScript
+
// Splay is used to avoid coordinated restarts of processes by applying a
// random wait between 0 and the given splay value before signalling the
// application of a change
@@ -7713,6 +7690,9 @@ type Template struct {
// Perms is the permission the file should be written out with.
Perms string
+ // User and group that should own the file.
+ Uid *int
+ Gid *int
// LeftDelim and RightDelim are optional configurations to control what
// delimiter is utilized when parsing the template.
@@ -7801,6 +7781,10 @@ func (t *Template) Validate() error {
if t.Envvars {
_ = multierror.Append(&mErr, fmt.Errorf("cannot use signals with env var templates"))
}
+ case TemplateChangeModeScript:
+ if t.ChangeScript.Command == "" {
+ _ = multierror.Append(&mErr, fmt.Errorf("must specify script path value when change mode is script"))
+ }
default:
_ = multierror.Append(&mErr, TemplateChangeModeInvalidError)
}
@@ -7923,7 +7907,7 @@ type AllocState struct {
// they are assigned to is down, their state is migrated to the replacement
// allocation.
//
-// Minimal set of fields from plugins/drivers/task_handle.go:TaskHandle
+// Minimal set of fields from plugins/drivers/task_handle.go:TaskHandle
type TaskHandle struct {
// Version of driver state. Used by the driver to gracefully handle
// plugin upgrades.
@@ -8062,7 +8046,7 @@ const (
// restarted because it has exceeded its restart policy.
TaskNotRestarting = "Not Restarting"
- // TaskRestartSignal indicates that the task has been signalled to be
+ // TaskRestartSignal indicates that the task has been signaled to be
// restarted
TaskRestartSignal = "Restart Signaled"
@@ -8106,6 +8090,10 @@ const (
// TaskHookFailed indicates that one of the hooks for a task failed.
TaskHookFailed = "Task hook failed"
+ // TaskHookMessage indicates that one of the hooks for a task emitted a
+ // message.
+ TaskHookMessage = "Task hook message"
+
// TaskRestoreFailed indicates Nomad was unable to reattach to a
// restored task.
TaskRestoreFailed = "Failed Restoring Task"
@@ -8339,6 +8327,9 @@ func (e *TaskEvent) PopulateEventDisplayMessage() {
}
func (e *TaskEvent) GoString() string {
+ if e == nil {
+ return ""
+ }
return fmt.Sprintf("%v - %v", e.Time, e.Type)
}
@@ -10814,7 +10805,7 @@ func (a *AllocDeploymentStatus) Copy() *AllocDeploymentStatus {
*c = *a
if a.Healthy != nil {
- c.Healthy = helper.BoolToPtr(*a.Healthy)
+ c.Healthy = pointer.Of(*a.Healthy)
}
return c
@@ -11792,11 +11783,21 @@ type ACLPolicy struct {
Description string // Human readable
Rules string // HCL or JSON format
RulesJSON *acl.Policy // Generated from Rules on read
+ JobACL *JobACL
Hash []byte
+
CreateIndex uint64
ModifyIndex uint64
}
+// JobACL represents an ACL policy's attachment to a job, group, or task.
+type JobACL struct {
+ Namespace string // namespace of the job
+ JobID string // ID of the job
+ Group string // ID of the group
+ Task string // ID of the task
+}
+
// SetHash is used to compute and set the hash of the ACL policy
func (a *ACLPolicy) SetHash() []byte {
// Initialize a 256bit Blake2 hash (32 bytes)
@@ -11810,6 +11811,13 @@ func (a *ACLPolicy) SetHash() []byte {
_, _ = hash.Write([]byte(a.Description))
_, _ = hash.Write([]byte(a.Rules))
+ if a.JobACL != nil {
+ _, _ = hash.Write([]byte(a.JobACL.Namespace))
+ _, _ = hash.Write([]byte(a.JobACL.JobID))
+ _, _ = hash.Write([]byte(a.JobACL.Group))
+ _, _ = hash.Write([]byte(a.JobACL.Task))
+ }
+
// Finalize the hash
hashVal := hash.Sum(nil)
@@ -11842,6 +11850,21 @@ func (a *ACLPolicy) Validate() error {
err := fmt.Errorf("description longer than %d", maxPolicyDescriptionLength)
mErr.Errors = append(mErr.Errors, err)
}
+ if a.JobACL != nil {
+ if a.JobACL.JobID != "" && a.JobACL.Namespace == "" {
+ err := fmt.Errorf("namespace must be set to set job ID")
+ mErr.Errors = append(mErr.Errors, err)
+ }
+ if a.JobACL.Group != "" && a.JobACL.JobID == "" {
+ err := fmt.Errorf("job ID must be set to set group")
+ mErr.Errors = append(mErr.Errors, err)
+ }
+ if a.JobACL.Task != "" && a.JobACL.Group == "" {
+ err := fmt.Errorf("group must be set to set task")
+ mErr.Errors = append(mErr.Errors, err)
+ }
+ }
+
return mErr.ErrorOrNil()
}
diff --git a/nomad/structs/structs_periodic_test.go b/nomad/structs/structs_periodic_test.go
index f828bced45b..48bf536efa2 100644
--- a/nomad/structs/structs_periodic_test.go
+++ b/nomad/structs/structs_periodic_test.go
@@ -225,7 +225,7 @@ func TestPeriodicConfig_DSTChange_Transitions(t *testing.T) {
func TestPeriodConfig_DSTSprintForward_Property(t *testing.T) {
ci.Parallel(t)
-
+
locName := "America/Los_Angeles"
loc, err := time.LoadLocation(locName)
require.NoError(t, err)
diff --git a/nomad/structs/structs_test.go b/nomad/structs/structs_test.go
index d05dcd73e88..e14ba8be356 100644
--- a/nomad/structs/structs_test.go
+++ b/nomad/structs/structs_test.go
@@ -11,9 +11,8 @@ import (
"github.com/hashicorp/consul/api"
"github.com/hashicorp/go-multierror"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/uuid"
-
"github.com/kr/pretty"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
@@ -2580,6 +2579,64 @@ func TestTask_Validate_Template(t *testing.T) {
}
}
+func TestTemplate_Copy(t *testing.T) {
+ ci.Parallel(t)
+
+ t1 := &Template{
+ SourcePath: "/local/file.txt",
+ DestPath: "/local/dest.txt",
+ EmbeddedTmpl: "tpl",
+ ChangeMode: TemplateChangeModeSignal,
+ ChangeSignal: "SIGHUP",
+ Splay: 10 * time.Second,
+ Perms: "777",
+ Uid: pointer.Of(1000),
+ Gid: pointer.Of(2000),
+ LeftDelim: "[[",
+ RightDelim: "]]",
+ Envvars: true,
+ VaultGrace: time.Minute,
+ Wait: &WaitConfig{
+ Min: pointer.Of(time.Second),
+ Max: pointer.Of(time.Minute),
+ },
+ }
+ t2 := t1.Copy()
+
+ t1.SourcePath = "/local/file2.txt"
+ t1.DestPath = "/local/dest2.txt"
+ t1.EmbeddedTmpl = "tpl2"
+ t1.ChangeMode = TemplateChangeModeRestart
+ t1.ChangeSignal = ""
+ t1.Splay = 5 * time.Second
+ t1.Perms = "700"
+ t1.Uid = pointer.Of(5000)
+ t1.Gid = pointer.Of(6000)
+ t1.LeftDelim = "(("
+ t1.RightDelim = "))"
+ t1.Envvars = false
+ t1.VaultGrace = 2 * time.Minute
+ t1.Wait.Min = pointer.Of(2 * time.Second)
+ t1.Wait.Max = pointer.Of(2 * time.Minute)
+
+ require.NotEqual(t, t1.SourcePath, t2.SourcePath)
+ require.NotEqual(t, t1.DestPath, t2.DestPath)
+ require.NotEqual(t, t1.EmbeddedTmpl, t2.EmbeddedTmpl)
+ require.NotEqual(t, t1.ChangeMode, t2.ChangeMode)
+ require.NotEqual(t, t1.ChangeSignal, t2.ChangeSignal)
+ require.NotEqual(t, t1.Splay, t2.Splay)
+ require.NotEqual(t, t1.Perms, t2.Perms)
+ require.NotEqual(t, t1.Uid, t2.Uid)
+ require.NotEqual(t, t1.Gid, t2.Gid)
+ require.NotEqual(t, t1.LeftDelim, t2.LeftDelim)
+ require.NotEqual(t, t1.RightDelim, t2.RightDelim)
+ require.NotEqual(t, t1.Envvars, t2.Envvars)
+ require.NotEqual(t, t1.VaultGrace, t2.VaultGrace)
+ require.NotEqual(t, t1.Wait.Min, t2.Wait.Min)
+ require.NotEqual(t, t1.Wait.Max, t2.Wait.Max)
+
+}
+
func TestTemplate_Validate(t *testing.T) {
ci.Parallel(t)
@@ -2670,8 +2727,8 @@ func TestTemplate_Validate(t *testing.T) {
DestPath: "local/foo",
ChangeMode: "noop",
Wait: &WaitConfig{
- Min: helper.TimeToPtr(10 * time.Second),
- Max: helper.TimeToPtr(5 * time.Second),
+ Min: pointer.Of(10 * time.Second),
+ Max: pointer.Of(5 * time.Second),
},
},
Fail: true,
@@ -2685,8 +2742,8 @@ func TestTemplate_Validate(t *testing.T) {
DestPath: "local/foo",
ChangeMode: "noop",
Wait: &WaitConfig{
- Min: helper.TimeToPtr(5 * time.Second),
- Max: helper.TimeToPtr(5 * time.Second),
+ Min: pointer.Of(5 * time.Second),
+ Max: pointer.Of(5 * time.Second),
},
},
Fail: false,
@@ -2697,8 +2754,8 @@ func TestTemplate_Validate(t *testing.T) {
DestPath: "local/foo",
ChangeMode: "noop",
Wait: &WaitConfig{
- Min: helper.TimeToPtr(5 * time.Second),
- Max: helper.TimeToPtr(10 * time.Second),
+ Min: pointer.Of(5 * time.Second),
+ Max: pointer.Of(10 * time.Second),
},
},
Fail: false,
@@ -2735,12 +2792,12 @@ func TestTaskWaitConfig_Equals(t *testing.T) {
{
name: "all-fields",
config: &WaitConfig{
- Min: helper.TimeToPtr(5 * time.Second),
- Max: helper.TimeToPtr(10 * time.Second),
+ Min: pointer.Of(5 * time.Second),
+ Max: pointer.Of(10 * time.Second),
},
expected: &WaitConfig{
- Min: helper.TimeToPtr(5 * time.Second),
- Max: helper.TimeToPtr(10 * time.Second),
+ Min: pointer.Of(5 * time.Second),
+ Max: pointer.Of(10 * time.Second),
},
},
{
@@ -2751,19 +2808,19 @@ func TestTaskWaitConfig_Equals(t *testing.T) {
{
name: "min-only",
config: &WaitConfig{
- Min: helper.TimeToPtr(5 * time.Second),
+ Min: pointer.Of(5 * time.Second),
},
expected: &WaitConfig{
- Min: helper.TimeToPtr(5 * time.Second),
+ Min: pointer.Of(5 * time.Second),
},
},
{
name: "max-only",
config: &WaitConfig{
- Max: helper.TimeToPtr(10 * time.Second),
+ Max: pointer.Of(10 * time.Second),
},
expected: &WaitConfig{
- Max: helper.TimeToPtr(10 * time.Second),
+ Max: pointer.Of(10 * time.Second),
},
},
}
@@ -3431,6 +3488,7 @@ func TestService_Canonicalize(t *testing.T) {
Name: "redis-db",
Provider: "consul",
Namespace: "default",
+ TaskName: "redis",
},
name: "interpolate task in name",
},
@@ -3446,6 +3504,7 @@ func TestService_Canonicalize(t *testing.T) {
Name: "db",
Provider: "consul",
Namespace: "default",
+ TaskName: "redis",
},
name: "no interpolation in name",
},
@@ -3461,6 +3520,7 @@ func TestService_Canonicalize(t *testing.T) {
Name: "example-cache-redis-db",
Provider: "consul",
Namespace: "default",
+ TaskName: "redis",
},
name: "interpolate job, taskgroup and task in name",
},
@@ -3476,6 +3536,7 @@ func TestService_Canonicalize(t *testing.T) {
Name: "example-cache-redis-db",
Provider: "consul",
Namespace: "default",
+ TaskName: "redis",
},
name: "interpolate base in name",
},
@@ -3492,6 +3553,7 @@ func TestService_Canonicalize(t *testing.T) {
Name: "db",
Provider: "nomad",
Namespace: "platform",
+ TaskName: "redis",
},
name: "nomad provider",
},
@@ -4321,7 +4383,6 @@ func TestTaskArtifact_Validate_Checksum(t *testing.T) {
err := tc.Input.Validate()
if (err != nil) != tc.Err {
t.Fatalf("case %d: %v", i, err)
- continue
}
}
}
@@ -5226,11 +5287,11 @@ func TestAllocation_DisconnectTimeout(t *testing.T) {
},
{
desc: "has max_client_disconnect",
- maxDisconnect: helper.TimeToPtr(30 * time.Second),
+ maxDisconnect: pointer.Of(30 * time.Second),
},
{
desc: "zero max_client_disconnect",
- maxDisconnect: helper.TimeToPtr(0 * time.Second),
+ maxDisconnect: pointer.Of(0 * time.Second),
},
}
for _, tc := range testCases {
@@ -6622,7 +6683,6 @@ func TestNodeReservedNetworkResources_ParseReserved(t *testing.T) {
out, err := r.ParseReservedHostPorts()
if (err != nil) != tc.Err {
t.Fatalf("test case %d: %v", i, err)
- continue
}
require.Equal(out, tc.Parsed)
diff --git a/nomad/vault.go b/nomad/vault.go
index 93afd7d919e..0410b53597e 100644
--- a/nomad/vault.go
+++ b/nomad/vault.go
@@ -111,6 +111,10 @@ type VaultClient interface {
// SetConfig updates the config used by the Vault client
SetConfig(config *config.VaultConfig) error
+ // GetConfig returns a copy of the config used by the Vault client, for
+ // testing
+ GetConfig() *config.VaultConfig
+
// CreateToken takes an allocation and task and returns an appropriate Vault
// Secret
CreateToken(ctx context.Context, a *structs.Allocation, task string) (*vapi.Secret, error)
@@ -350,6 +354,13 @@ func (v *vaultClient) flush() {
v.tomb = &tomb.Tomb{}
}
+// GetConfig returns a copy of this vault client's configuration, for testing.
+func (v *vaultClient) GetConfig() *config.VaultConfig {
+ v.setConfigLock.Lock()
+ defer v.setConfigLock.Unlock()
+ return v.config.Copy()
+}
+
// SetConfig is used to update the Vault config being used. A temporary outage
// may occur after calling as it re-establishes a connection to Vault
func (v *vaultClient) SetConfig(config *config.VaultConfig) error {
@@ -363,7 +374,7 @@ func (v *vaultClient) SetConfig(config *config.VaultConfig) error {
defer v.l.Unlock()
// If reloading the same config, no-op
- if v.config.IsEqual(config) {
+ if v.config.Equals(config) {
return nil
}
@@ -605,9 +616,10 @@ func (v *vaultClient) renewalLoop() {
//
// It should increase the amount of backoff each time, with the following rules:
//
-// * If token expired already despite earlier renewal attempts,
-// back off for 1 minute + jitter
-// * If we have an existing authentication that is going to expire,
+// - If token expired already despite earlier renewal attempts,
+// back off for 1 minute + jitter
+// - If we have an existing authentication that is going to expire,
+//
// never back off more than half of the amount of time remaining
// until expiration (with 5s floor)
// * Never back off more than 30 seconds multiplied by a random
@@ -1241,13 +1253,13 @@ func (v *vaultClient) parallelRevoke(ctx context.Context, accessors []*structs.V
// and purge at any given time.
//
// Limiting the revocation batch size is beneficial for few reasons:
-// * A single revocation failure of any entry in batch result into retrying the whole batch;
-// the larger the batch is the higher likelihood of such failure
-// * Smaller batch sizes result into more co-operativeness: provides hooks for
-// reconsidering token TTL and leadership steps down.
-// * Batches limit the size of the Raft message purging tokens. Due to bugs
-// pre-0.11.3, expired tokens were not properly purged, so users upgrading from
-// older versions may have huge numbers (millions) of expired tokens to purge.
+// - A single revocation failure of any entry in batch result into retrying the whole batch;
+// the larger the batch is the higher likelihood of such failure
+// - Smaller batch sizes result into more co-operativeness: provides hooks for
+// reconsidering token TTL and leadership steps down.
+// - Batches limit the size of the Raft message purging tokens. Due to bugs
+// pre-0.11.3, expired tokens were not properly purged, so users upgrading from
+// older versions may have huge numbers (millions) of expired tokens to purge.
const maxVaultRevokeBatchSize = 1000
// revokeDaemon should be called in a goroutine and is used to periodically
diff --git a/nomad/vault_test.go b/nomad/vault_test.go
index 7e5834b546b..e7f262a2af3 100644
--- a/nomad/vault_test.go
+++ b/nomad/vault_test.go
@@ -18,7 +18,7 @@ import (
"golang.org/x/time/rate"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/testlog"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/mock"
@@ -1302,7 +1302,7 @@ func TestVaultClient_CreateToken_Role_Unrecoverable(t *testing.T) {
func TestVaultClient_CreateToken_Prestart(t *testing.T) {
ci.Parallel(t)
vconfig := &config.VaultConfig{
- Enabled: helper.BoolToPtr(true),
+ Enabled: pointer.Of(true),
Token: uuid.Generate(),
Addr: "http://127.0.0.1:0",
}
@@ -1334,7 +1334,7 @@ func TestVaultClient_CreateToken_Prestart(t *testing.T) {
func TestVaultClient_MarkForRevocation(t *testing.T) {
vconfig := &config.VaultConfig{
- Enabled: helper.BoolToPtr(true),
+ Enabled: pointer.Of(true),
Token: uuid.Generate(),
Addr: "http://127.0.0.1:0",
}
@@ -1362,7 +1362,7 @@ func TestVaultClient_MarkForRevocation(t *testing.T) {
func TestVaultClient_RevokeTokens_PreEstablishs(t *testing.T) {
ci.Parallel(t)
vconfig := &config.VaultConfig{
- Enabled: helper.BoolToPtr(true),
+ Enabled: pointer.Of(true),
Token: uuid.Generate(),
Addr: "http://127.0.0.1:0",
}
@@ -1408,7 +1408,7 @@ func TestVaultClient_RevokeTokens_PreEstablishs(t *testing.T) {
func TestVaultClient_RevokeTokens_Failures_TTL(t *testing.T) {
ci.Parallel(t)
vconfig := &config.VaultConfig{
- Enabled: helper.BoolToPtr(true),
+ Enabled: pointer.Of(true),
Token: uuid.Generate(),
Addr: "http://127.0.0.1:0",
}
@@ -1673,7 +1673,7 @@ func TestVaultClient_RevokeDaemon_Bounded(t *testing.T) {
// Disable client until we can change settings for testing
conf := v.Config.Copy()
- conf.Enabled = helper.BoolToPtr(false)
+ conf.Enabled = pointer.Of(false)
const (
batchSize = 100
@@ -1702,7 +1702,7 @@ func TestVaultClient_RevokeDaemon_Bounded(t *testing.T) {
client.maxRevokeBatchSize = batchSize
client.revocationIntv = 3 * time.Millisecond
conf = v.Config.Copy()
- conf.Enabled = helper.BoolToPtr(true)
+ conf.Enabled = pointer.Of(true)
require.NoError(t, client.SetConfig(conf))
client.SetActive(true)
diff --git a/nomad/vault_testing.go b/nomad/vault_testing.go
index 857cd52150f..b81c0f197d1 100644
--- a/nomad/vault_testing.go
+++ b/nomad/vault_testing.go
@@ -142,6 +142,7 @@ func (v *TestVaultClient) MarkForRevocation(accessors []*structs.VaultAccessor)
func (v *TestVaultClient) Stop() {}
func (v *TestVaultClient) SetActive(enabled bool) {}
+func (v *TestVaultClient) GetConfig() *config.VaultConfig { return nil }
func (v *TestVaultClient) SetConfig(config *config.VaultConfig) error { return nil }
func (v *TestVaultClient) Running() bool { return true }
func (v *TestVaultClient) Stats() map[string]string { return map[string]string{} }
diff --git a/plugins/csi/client.go b/plugins/csi/client.go
index 1a4dcf0572b..934a1269000 100644
--- a/plugins/csi/client.go
+++ b/plugins/csi/client.go
@@ -35,29 +35,29 @@ type NodeGetInfoResponse struct {
// "zone", "rack", etc.
//
// According to CSI, there are a few requirements for the keys within this map:
-// - Valid keys have two segments: an OPTIONAL prefix and name, separated
-// by a slash (/), for example: "com.company.example/zone".
-// - The key name segment is REQUIRED. The prefix is OPTIONAL.
-// - The key name MUST be 63 characters or less, begin and end with an
-// alphanumeric character ([a-z0-9A-Z]), and contain only dashes (-),
-// underscores (_), dots (.), or alphanumerics in between, for example
-// "zone".
-// - The key prefix MUST be 63 characters or less, begin and end with a
-// lower-case alphanumeric character ([a-z0-9]), contain only
-// dashes (-), dots (.), or lower-case alphanumerics in between, and
-// follow domain name notation format
-// (https://tools.ietf.org/html/rfc1035#section-2.3.1).
-// - The key prefix SHOULD include the plugin's host company name and/or
-// the plugin name, to minimize the possibility of collisions with keys
-// from other plugins.
-// - If a key prefix is specified, it MUST be identical across all
-// topology keys returned by the SP (across all RPCs).
-// - Keys MUST be case-insensitive. Meaning the keys "Zone" and "zone"
-// MUST not both exist.
-// - Each value (topological segment) MUST contain 1 or more strings.
-// - Each string MUST be 63 characters or less and begin and end with an
-// alphanumeric character with '-', '_', '.', or alphanumerics in
-// between.
+// - Valid keys have two segments: an OPTIONAL prefix and name, separated
+// by a slash (/), for example: "com.company.example/zone".
+// - The key name segment is REQUIRED. The prefix is OPTIONAL.
+// - The key name MUST be 63 characters or less, begin and end with an
+// alphanumeric character ([a-z0-9A-Z]), and contain only dashes (-),
+// underscores (_), dots (.), or alphanumerics in between, for example
+// "zone".
+// - The key prefix MUST be 63 characters or less, begin and end with a
+// lower-case alphanumeric character ([a-z0-9]), contain only
+// dashes (-), dots (.), or lower-case alphanumerics in between, and
+// follow domain name notation format
+// (https://tools.ietf.org/html/rfc1035#section-2.3.1).
+// - The key prefix SHOULD include the plugin's host company name and/or
+// the plugin name, to minimize the possibility of collisions with keys
+// from other plugins.
+// - If a key prefix is specified, it MUST be identical across all
+// topology keys returned by the SP (across all RPCs).
+// - Keys MUST be case-insensitive. Meaning the keys "Zone" and "zone"
+// MUST not both exist.
+// - Each value (topological segment) MUST contain 1 or more strings.
+// - Each string MUST be 63 characters or less and begin and end with an
+// alphanumeric character with '-', '_', '.', or alphanumerics in
+// between.
type Topology struct {
Segments map[string]string
}
diff --git a/plugins/csi/fake/client.go b/plugins/csi/fake/client.go
index cff2bd49f3f..99f13e1ed9a 100644
--- a/plugins/csi/fake/client.go
+++ b/plugins/csi/fake/client.go
@@ -130,7 +130,7 @@ func (c *Client) PluginProbe(ctx context.Context) (bool, error) {
// PluginGetInfo is used to return semantic data about the plugin.
// Response:
-// - string: name, the name of the plugin in domain notation format.
+// - string: name, the name of the plugin in domain notation format.
func (c *Client) PluginGetInfo(ctx context.Context) (string, string, error) {
c.Mu.Lock()
defer c.Mu.Unlock()
diff --git a/plugins/device/cmd/example/device.go b/plugins/device/cmd/example/device.go
index 475f115b014..d6dc1fbbf7f 100644
--- a/plugins/device/cmd/example/device.go
+++ b/plugins/device/cmd/example/device.go
@@ -10,7 +10,7 @@ import (
"time"
log "github.com/hashicorp/go-hclog"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/plugins/base"
"github.com/hashicorp/nomad/plugins/device"
"github.com/hashicorp/nomad/plugins/shared/hclspec"
@@ -343,23 +343,23 @@ func (d *FsDevice) collectStats() (*device.DeviceGroupStats, error) {
s := &device.DeviceStats{
Summary: &structs.StatValue{
- IntNumeratorVal: helper.Int64ToPtr(f.Size()),
+ IntNumeratorVal: pointer.Of(f.Size()),
Unit: "bytes",
Desc: "Filesize in bytes",
},
Stats: &structs.StatObject{
Attributes: map[string]*structs.StatValue{
"size": {
- IntNumeratorVal: helper.Int64ToPtr(f.Size()),
+ IntNumeratorVal: pointer.Of(f.Size()),
Unit: "bytes",
Desc: "Filesize in bytes",
},
"modify_time": {
- StringVal: helper.StringToPtr(f.ModTime().String()),
+ StringVal: pointer.Of(f.ModTime().String()),
Desc: "Last modified",
},
"mode": {
- StringVal: helper.StringToPtr(f.Mode().String()),
+ StringVal: pointer.Of(f.Mode().String()),
Desc: "File mode",
},
},
diff --git a/plugins/device/plugin_test.go b/plugins/device/plugin_test.go
index 52629489fb5..4961faf878f 100644
--- a/plugins/device/plugin_test.go
+++ b/plugins/device/plugin_test.go
@@ -9,7 +9,7 @@ import (
pb "github.com/golang/protobuf/proto"
plugin "github.com/hashicorp/go-plugin"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/nomad/structs"
"github.com/hashicorp/nomad/plugins/base"
"github.com/hashicorp/nomad/plugins/shared/hclspec"
@@ -195,7 +195,7 @@ func TestDevicePlugin_Fingerprint(t *testing.T) {
Name: "foo",
Attributes: map[string]*psstructs.Attribute{
"memory": {
- Int: helper.Int64ToPtr(4),
+ Int: pointer.Of(int64(4)),
Unit: "GiB",
},
},
@@ -476,8 +476,8 @@ func TestDevicePlugin_Stats(t *testing.T) {
InstanceStats: map[string]*DeviceStats{
"1": {
Summary: &psstructs.StatValue{
- IntNumeratorVal: helper.Int64ToPtr(10),
- IntDenominatorVal: helper.Int64ToPtr(20),
+ IntNumeratorVal: pointer.Of(int64(10)),
+ IntDenominatorVal: pointer.Of(int64(20)),
Unit: "MB",
Desc: "Unit test",
},
@@ -493,8 +493,8 @@ func TestDevicePlugin_Stats(t *testing.T) {
InstanceStats: map[string]*DeviceStats{
"1": {
Summary: &psstructs.StatValue{
- FloatNumeratorVal: helper.Float64ToPtr(10.0),
- FloatDenominatorVal: helper.Float64ToPtr(20.0),
+ FloatNumeratorVal: pointer.Of(float64(10.0)),
+ FloatDenominatorVal: pointer.Of(float64(20.0)),
Unit: "MB",
Desc: "Unit test",
},
@@ -508,7 +508,7 @@ func TestDevicePlugin_Stats(t *testing.T) {
InstanceStats: map[string]*DeviceStats{
"1": {
Summary: &psstructs.StatValue{
- StringVal: helper.StringToPtr("foo"),
+ StringVal: pointer.Of("foo"),
Unit: "MB",
Desc: "Unit test",
},
@@ -522,7 +522,7 @@ func TestDevicePlugin_Stats(t *testing.T) {
InstanceStats: map[string]*DeviceStats{
"1": {
Summary: &psstructs.StatValue{
- BoolVal: helper.BoolToPtr(true),
+ BoolVal: pointer.Of(true),
Unit: "MB",
Desc: "Unit test",
},
diff --git a/plugins/drivers/proto/driver.pb.go b/plugins/drivers/proto/driver.pb.go
index 66407ef55f2..fa72cb62f61 100644
--- a/plugins/drivers/proto/driver.pb.go
+++ b/plugins/drivers/proto/driver.pb.go
@@ -458,10 +458,10 @@ type FingerprintResponse struct {
Attributes map[string]*proto1.Attribute `protobuf:"bytes,1,rep,name=attributes,proto3" json:"attributes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
// Health is used to determine the state of the health the driver is in.
// Health can be one of the following states:
- // * UNDETECTED: driver dependencies are not met and the driver can not start
- // * UNHEALTHY: driver dependencies are met but the driver is unable to
- // perform operations due to some other problem
- // * HEALTHY: driver is able to perform all operations
+ // - UNDETECTED: driver dependencies are not met and the driver can not start
+ // - UNHEALTHY: driver dependencies are met but the driver is unable to
+ // perform operations due to some other problem
+ // - HEALTHY: driver is able to perform all operations
Health FingerprintResponse_HealthState `protobuf:"varint,2,opt,name=health,proto3,enum=hashicorp.nomad.plugins.drivers.proto.FingerprintResponse_HealthState" json:"health,omitempty"`
// HealthDescription is a human readable message describing the current
// state of driver health
@@ -641,9 +641,9 @@ type StartTaskResponse struct {
// Result is set depending on the type of error that occurred while starting
// a task:
//
- // * SUCCESS: No error occurred, handle is set
- // * RETRY: An error occurred, but is recoverable and the RPC should be retried
- // * FATAL: A fatal error occurred and is not likely to succeed if retried
+ // - SUCCESS: No error occurred, handle is set
+ // - RETRY: An error occurred, but is recoverable and the RPC should be retried
+ // - FATAL: A fatal error occurred and is not likely to succeed if retried
//
// If Result is not successful, the DriverErrorMsg will be set.
Result StartTaskResponse_Result `protobuf:"varint,1,opt,name=result,proto3,enum=hashicorp.nomad.plugins.drivers.proto.StartTaskResponse_Result" json:"result,omitempty"`
@@ -2842,9 +2842,9 @@ type Device struct {
HostPath string `protobuf:"bytes,2,opt,name=host_path,json=hostPath,proto3" json:"host_path,omitempty"`
// CgroupPermissions defines the Cgroup permissions of the device.
// One or more of the following options can be set:
- // * r - allows the task to read from the specified device.
- // * w - allows the task to write to the specified device.
- // * m - allows the task to create device files that do not yet exist.
+ // - r - allows the task to read from the specified device.
+ // - w - allows the task to write to the specified device.
+ // - m - allows the task to create device files that do not yet exist.
//
// Example: "rw"
CgroupPermissions string `protobuf:"bytes,3,opt,name=cgroup_permissions,json=cgroupPermissions,proto3" json:"cgroup_permissions,omitempty"`
diff --git a/plugins/shared/hclspec/hcl_spec.pb.go b/plugins/shared/hclspec/hcl_spec.pb.go
index 0bf62c49a9d..af1b37ffb38 100644
--- a/plugins/shared/hclspec/hcl_spec.pb.go
+++ b/plugins/shared/hclspec/hcl_spec.pb.go
@@ -74,6 +74,7 @@ const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
// Spec defines the available specification types.
type Spec struct {
// Types that are valid to be assigned to Block:
+ //
// *Spec_Object
// *Spec_Array
// *Spec_Attr
@@ -273,18 +274,18 @@ func (*Spec) XXX_OneofWrappers() []interface{} {
}
// Attr spec type reads the value of an attribute in the current body
-//and returns that value as its result. It also creates validation constraints
-//for the given attribute name and its value.
+// and returns that value as its result. It also creates validation constraints
+// for the given attribute name and its value.
//
-//```hcl
-//Attr {
+// ```hcl
+// Attr {
// name = "document_root"
// type = string
// required = true
-//}
-//```
+// }
+// ```
//
-//`Attr` spec blocks accept the following arguments:
+// `Attr` spec blocks accept the following arguments:
//
// `name` (required) - The attribute name to expect within the HCL input file.
// This may be omitted when a default name selector is created by a parent
@@ -299,7 +300,7 @@ func (*Spec) XXX_OneofWrappers() []interface{} {
// `required` (optional) - If set to `true`, `hcldec` will produce an error
// if a value is not provided for the source attribute.
//
-//`Attr` is a leaf spec type, so no nested spec blocks are permitted.
+// `Attr` is a leaf spec type, so no nested spec blocks are permitted.
type Attr struct {
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"`
@@ -356,11 +357,11 @@ func (m *Attr) GetRequired() bool {
}
// Block spec type applies one nested spec block to the contents of a
-//block within the current body and returns the result of that spec. It also
-//creates validation constraints for the given block type name.
+// block within the current body and returns the result of that spec. It also
+// creates validation constraints for the given block type name.
//
-//```hcl
-//Block {
+// ```hcl
+// Block {
// name = "logging"
//
// Object {
@@ -371,10 +372,10 @@ func (m *Attr) GetRequired() bool {
// type = string
// }
// }
-//}
-//```
+// }
+// ```
//
-//`Block` spec blocks accept the following arguments:
+// `Block` spec blocks accept the following arguments:
//
// `name` (required) - The block type name to expect within the HCL
// input file. This may be omitted when a default name selector is created
@@ -384,12 +385,11 @@ func (m *Attr) GetRequired() bool {
// `required` (optional) - If set to `true`, `hcldec` will produce an error
// if a block of the specified type is not present in the current body.
//
-//`Block` creates a validation constraint that there must be zero or one blocks
-//of the given type name, or exactly one if `required` is set.
-//
-//`Block` expects a single nested spec block, which is applied to the body of
-//the block of the given type when it is present.
+// `Block` creates a validation constraint that there must be zero or one blocks
+// of the given type name, or exactly one if `required` is set.
//
+// `Block` expects a single nested spec block, which is applied to the body of
+// the block of the given type when it is present.
type Block struct {
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
Required bool `protobuf:"varint,2,opt,name=required,proto3" json:"required,omitempty"`
@@ -445,7 +445,6 @@ func (m *Block) GetNested() *Spec {
return nil
}
-//
// The BlockAttrs spec type is similar to an Attr spec block of a map type,
// but it produces a map from the attributes of a block rather than from an
// attribute's expression.
@@ -533,11 +532,11 @@ func (m *BlockAttrs) GetRequired() bool {
}
// BlockList spec type is similar to `Block`, but it accepts zero or
-//more blocks of a specified type rather than requiring zero or one. The
-//result is a JSON array with one entry per block of the given type.
+// more blocks of a specified type rather than requiring zero or one. The
+// result is a JSON array with one entry per block of the given type.
//
-//```hcl
-//BlockList {
+// ```hcl
+// BlockList {
// name = "log_file"
//
// Object {
@@ -549,10 +548,10 @@ func (m *BlockAttrs) GetRequired() bool {
// required = true
// }
// }
-//}
-//```
+// }
+// ```
//
-//`BlockList` spec blocks accept the following arguments:
+// `BlockList` spec blocks accept the following arguments:
//
// `name` (required) - The block type name to expect within the HCL
// input file. This may be omitted when a default name selector is created
@@ -566,12 +565,11 @@ func (m *BlockAttrs) GetRequired() bool {
// produce an error if more than the given number of blocks are present. This
// attribute must be greater than or equal to `min_items` if both are set.
//
-//`Block` creates a validation constraint on the number of blocks of the given
-//type that must be present.
-//
-//`Block` expects a single nested spec block, which is applied to the body of
-//each matching block to produce the resulting list items.
+// `Block` creates a validation constraint on the number of blocks of the given
+// type that must be present.
//
+// `Block` expects a single nested spec block, which is applied to the body of
+// each matching block to produce the resulting list items.
type BlockList struct {
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
MinItems uint64 `protobuf:"varint,2,opt,name=min_items,json=minItems,proto3" json:"min_items,omitempty"`
@@ -636,10 +634,10 @@ func (m *BlockList) GetNested() *Spec {
}
// BlockSet spec type behaves the same as BlockList except that
-//the result is in no specific order and any duplicate items are removed.
+// the result is in no specific order and any duplicate items are removed.
//
-//```hcl
-//BlockSet {
+// ```hcl
+// BlockSet {
// name = "log_file"
//
// Object {
@@ -651,11 +649,10 @@ func (m *BlockList) GetNested() *Spec {
// required = true
// }
// }
-//}
-//```
-//
-//The contents of `BlockSet` are the same as for `BlockList`.
+// }
+// ```
//
+// The contents of `BlockSet` are the same as for `BlockList`.
type BlockSet struct {
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
MinItems uint64 `protobuf:"varint,2,opt,name=min_items,json=minItems,proto3" json:"min_items,omitempty"`
@@ -720,12 +717,12 @@ func (m *BlockSet) GetNested() *Spec {
}
// BlockMap spec type is similar to `Block`, but it accepts zero or
-//more blocks of a specified type rather than requiring zero or one. The
-//result is a JSON object, or possibly multiple nested JSON objects, whose
-//properties are derived from the labels set on each matching block.
+// more blocks of a specified type rather than requiring zero or one. The
+// result is a JSON object, or possibly multiple nested JSON objects, whose
+// properties are derived from the labels set on each matching block.
//
-//```hcl
-//BlockMap {
+// ```hcl
+// BlockMap {
// name = "log_file"
// labels = ["filename"]
//
@@ -735,10 +732,10 @@ func (m *BlockSet) GetNested() *Spec {
// required = true
// }
// }
-//}
-//```
+// }
+// ```
//
-//`BlockMap` spec blocks accept the following arguments:
+// `BlockMap` spec blocks accept the following arguments:
//
// `name` (required) - The block type name to expect within the HCL
// input file. This may be omitted when a default name selector is created
@@ -751,12 +748,11 @@ func (m *BlockSet) GetNested() *Spec {
// Block header labels are the quoted strings that appear after the block type
// name but before the opening `{`.
//
-//`Block` creates a validation constraint on the number of labels that blocks
-//of the given type must have.
-//
-//`Block` expects a single nested spec block, which is applied to the body of
-//each matching block to produce the resulting map items.
+// `Block` creates a validation constraint on the number of labels that blocks
+// of the given type must have.
//
+// `Block` expects a single nested spec block, which is applied to the body of
+// each matching block to produce the resulting map items.
type BlockMap struct {
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
Labels []string `protobuf:"bytes,2,rep,name=labels,proto3" json:"labels,omitempty"`
@@ -813,23 +809,23 @@ func (m *BlockMap) GetNested() *Spec {
}
// Literal spec type returns a given literal value, and creates no
-//validation constraints. It is most commonly used with the `Default` spec
-//type to create a fallback value, but can also be used e.g. to fill out
-//required properties in an `Object` spec that do not correspond to any
-//construct in the input configuration.
+// validation constraints. It is most commonly used with the `Default` spec
+// type to create a fallback value, but can also be used e.g. to fill out
+// required properties in an `Object` spec that do not correspond to any
+// construct in the input configuration.
//
-//```hcl
-//Literal {
+// ```hcl
+// Literal {
// value = "hello world"
-//}
-//```
+// }
+// ```
//
-//`Literal` spec blocks accept the following argument:
+// `Literal` spec blocks accept the following argument:
//
// `value` (required) - The value to return. This attribute may be an expression
// that uses [functions](#spec-definition-functions).
//
-//`Literal` is a leaf spec type, so no nested spec blocks are permitted.
+// `Literal` is a leaf spec type, so no nested spec blocks are permitted.
type Literal struct {
Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
@@ -870,12 +866,12 @@ func (m *Literal) GetValue() string {
}
// Default spec type evaluates a sequence of nested specs in turn and
-//returns the result of the first one that produces a non-null value.
-//It creates no validation constraints of its own, but passes on the validation
-//constraints from its first nested block.
+// returns the result of the first one that produces a non-null value.
+// It creates no validation constraints of its own, but passes on the validation
+// constraints from its first nested block.
//
-//```hcl
-//Default {
+// ```hcl
+// Default {
// Attr {
// name = "private"
// type = bool
@@ -883,17 +879,16 @@ func (m *Literal) GetValue() string {
// Literal {
// value = false
// }
-//}
-//```
-//
-//A `Default` spec block must have at least one nested spec block, and should
-//generally have at least two since otherwise the `Default` wrapper is a no-op.
+// }
+// ```
//
-//The second and any subsequent spec blocks are _fallback_ specs. These exhibit
-//their usual behavior but are not able to impose validation constraints on the
-//current body since they are not evaluated unless all prior specs produce
-//`null` as their result.
+// A `Default` spec block must have at least one nested spec block, and should
+// generally have at least two since otherwise the `Default` wrapper is a no-op.
//
+// The second and any subsequent spec blocks are _fallback_ specs. These exhibit
+// their usual behavior but are not able to impose validation constraints on the
+// current body since they are not evaluated unless all prior specs produce
+// `null` as their result.
type Default struct {
Primary *Spec `protobuf:"bytes,1,opt,name=primary,proto3" json:"primary,omitempty"`
Default *Spec `protobuf:"bytes,2,opt,name=default,proto3" json:"default,omitempty"`
@@ -942,11 +937,11 @@ func (m *Default) GetDefault() *Spec {
}
// Object spec type is the most commonly used at the root of a spec file.
-//Its result is a JSON object whose properties are set based on any nested
-//spec blocks:
+// Its result is a JSON object whose properties are set based on any nested
+// spec blocks:
//
-//```hcl
-//Object {
+// ```hcl
+// Object {
// Attr "name" {
// type = "string"
// }
@@ -958,18 +953,18 @@ func (m *Default) GetDefault() *Spec {
// # ...
// }
// }
-//}
-//```
+// }
+// ```
//
-//Nested spec blocks inside `Object` must always have an extra block label
-//`"name"`, `"address"` and `"street"` in the above example) that specifies
-//the name of the property that should be created in the JSON object result.
-//This label also acts as a default name selector for the nested spec, allowing
-//the `Attr` blocks in the above example to omit the usually-required `name`
-//argument in cases where the HCL input name and JSON output name are the same.
+// Nested spec blocks inside `Object` must always have an extra block label
+// `"name"`, `"address"` and `"street"` in the above example) that specifies
+// the name of the property that should be created in the JSON object result.
+// This label also acts as a default name selector for the nested spec, allowing
+// the `Attr` blocks in the above example to omit the usually-required `name`
+// argument in cases where the HCL input name and JSON output name are the same.
//
-//An `Object` spec block creates no validation constraints, but it passes on
-//any validation constraints created by the nested specs.
+// An `Object` spec block creates no validation constraints, but it passes on
+// any validation constraints created by the nested specs.
type Object struct {
Attributes map[string]*Spec `protobuf:"bytes,1,rep,name=attributes,proto3" json:"attributes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
@@ -1010,10 +1005,10 @@ func (m *Object) GetAttributes() map[string]*Spec {
}
// Array spec type produces a JSON array whose elements are set based on
-//any nested spec blocks:
+// any nested spec blocks:
//
-//```hcl
-//Array {
+// ```hcl
+// Array {
// Attr {
// name = "first_element"
// type = "string"
@@ -1022,11 +1017,11 @@ func (m *Object) GetAttributes() map[string]*Spec {
// name = "second_element"
// type = "string"
// }
-//}
-//```
+// }
+// ```
//
-//An `Array` spec block creates no validation constraints, but it passes on
-//any validation constraints created by the nested specs.
+// An `Array` spec block creates no validation constraints, but it passes on
+// any validation constraints created by the nested specs.
type Array struct {
Values []*Spec `protobuf:"bytes,1,rep,name=values,proto3" json:"values,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
diff --git a/plugins/shared/structs/attribute.go b/plugins/shared/structs/attribute.go
index 9f09257aba6..06fb6a5bdd3 100644
--- a/plugins/shared/structs/attribute.go
+++ b/plugins/shared/structs/attribute.go
@@ -7,7 +7,7 @@ import (
"strings"
"unicode"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
)
const (
@@ -58,7 +58,7 @@ func (u *Unit) Comparable(o *Unit) bool {
func ParseAttribute(input string) *Attribute {
ll := len(input)
if ll == 0 {
- return &Attribute{String: helper.StringToPtr(input)}
+ return &Attribute{String: pointer.Of(input)}
}
// Check if the string is a number ending with potential units
@@ -82,22 +82,22 @@ func ParseAttribute(input string) *Attribute {
// Try to parse as an int
i, err := strconv.ParseInt(numeric, 10, 64)
if err == nil {
- return &Attribute{Int: helper.Int64ToPtr(i), Unit: unit}
+ return &Attribute{Int: pointer.Of(i), Unit: unit}
}
// Try to parse as a float
f, err := strconv.ParseFloat(numeric, 64)
if err == nil {
- return &Attribute{Float: helper.Float64ToPtr(f), Unit: unit}
+ return &Attribute{Float: pointer.Of(f), Unit: unit}
}
// Try to parse as a bool
b, err := strconv.ParseBool(input)
if err == nil {
- return &Attribute{Bool: helper.BoolToPtr(b)}
+ return &Attribute{Bool: pointer.Of(b)}
}
- return &Attribute{String: helper.StringToPtr(input)}
+ return &Attribute{String: pointer.Of(input)}
}
// Attribute is used to describe the value of an attribute, optionally
@@ -122,14 +122,14 @@ type Attribute struct {
// NewStringAttribute returns a new string attribute.
func NewStringAttribute(s string) *Attribute {
return &Attribute{
- String: helper.StringToPtr(s),
+ String: pointer.Of(s),
}
}
// NewBoolAttribute returns a new boolean attribute.
func NewBoolAttribute(b bool) *Attribute {
return &Attribute{
- Bool: helper.BoolToPtr(b),
+ Bool: pointer.Of(b),
}
}
@@ -137,7 +137,7 @@ func NewBoolAttribute(b bool) *Attribute {
// to be valid.
func NewIntAttribute(i int64, unit string) *Attribute {
return &Attribute{
- Int: helper.Int64ToPtr(i),
+ Int: pointer.Of(i),
Unit: unit,
}
}
@@ -146,7 +146,7 @@ func NewIntAttribute(i int64, unit string) *Attribute {
// be valid.
func NewFloatAttribute(f float64, unit string) *Attribute {
return &Attribute{
- Float: helper.Float64ToPtr(f),
+ Float: pointer.Of(f),
Unit: unit,
}
}
@@ -202,16 +202,16 @@ func (a *Attribute) Copy() *Attribute {
}
if a.Float != nil {
- ca.Float = helper.Float64ToPtr(*a.Float)
+ ca.Float = pointer.Of(*a.Float)
}
if a.Int != nil {
- ca.Int = helper.Int64ToPtr(*a.Int)
+ ca.Int = pointer.Of(*a.Int)
}
if a.Bool != nil {
- ca.Bool = helper.BoolToPtr(*a.Bool)
+ ca.Bool = pointer.Of(*a.Bool)
}
if a.String != nil {
- ca.String = helper.StringToPtr(*a.String)
+ ca.String = pointer.Of(*a.String)
}
return ca
diff --git a/plugins/shared/structs/attribute_test.go b/plugins/shared/structs/attribute_test.go
index b30506764bb..70e1cf47317 100644
--- a/plugins/shared/structs/attribute_test.go
+++ b/plugins/shared/structs/attribute_test.go
@@ -4,7 +4,7 @@ import (
"fmt"
"testing"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/stretchr/testify/require"
)
@@ -15,56 +15,56 @@ func TestAttribute_Validate(t *testing.T) {
}{
{
Input: &Attribute{
- Bool: helper.BoolToPtr(true),
+ Bool: pointer.Of(true),
},
},
{
Input: &Attribute{
- String: helper.StringToPtr("foo"),
+ String: pointer.Of("foo"),
},
},
{
Input: &Attribute{
- Int: helper.Int64ToPtr(123),
+ Int: pointer.Of(int64(123)),
},
},
{
Input: &Attribute{
- Float: helper.Float64ToPtr(123.2),
+ Float: pointer.Of(float64(123.2)),
},
},
{
Input: &Attribute{
- Bool: helper.BoolToPtr(true),
+ Bool: pointer.Of(true),
Unit: "MB",
},
Fail: true,
},
{
Input: &Attribute{
- String: helper.StringToPtr("foo"),
+ String: pointer.Of("foo"),
Unit: "MB",
},
Fail: true,
},
{
Input: &Attribute{
- Int: helper.Int64ToPtr(123),
+ Int: pointer.Of(int64(123)),
Unit: "lolNO",
},
Fail: true,
},
{
Input: &Attribute{
- Float: helper.Float64ToPtr(123.2),
+ Float: pointer.Of(float64(123.2)),
Unit: "lolNO",
},
Fail: true,
},
{
Input: &Attribute{
- Int: helper.Int64ToPtr(123),
- Float: helper.Float64ToPtr(123.2),
+ Int: pointer.Of(int64(123)),
+ Float: pointer.Of(float64(123.2)),
Unit: "mW",
},
Fail: true,
@@ -91,46 +91,46 @@ func TestAttribute_Compare_Bool(t *testing.T) {
cases := []*compareTestCase{
{
A: &Attribute{
- Bool: helper.BoolToPtr(true),
+ Bool: pointer.Of(true),
},
B: &Attribute{
- Bool: helper.BoolToPtr(true),
+ Bool: pointer.Of(true),
},
Expected: 0,
},
{
A: &Attribute{
- Bool: helper.BoolToPtr(true),
+ Bool: pointer.Of(true),
},
B: &Attribute{
- Bool: helper.BoolToPtr(false),
+ Bool: pointer.Of(false),
},
Expected: 1,
},
{
A: &Attribute{
- Bool: helper.BoolToPtr(true),
+ Bool: pointer.Of(true),
},
B: &Attribute{
- String: helper.StringToPtr("foo"),
+ String: pointer.Of("foo"),
},
NotComparable: true,
},
{
A: &Attribute{
- Bool: helper.BoolToPtr(true),
+ Bool: pointer.Of(true),
},
B: &Attribute{
- Int: helper.Int64ToPtr(123),
+ Int: pointer.Of(int64(123)),
},
NotComparable: true,
},
{
A: &Attribute{
- Bool: helper.BoolToPtr(true),
+ Bool: pointer.Of(true),
},
B: &Attribute{
- Float: helper.Float64ToPtr(123.2),
+ Float: pointer.Of(float64(123.2)),
},
NotComparable: true,
},
@@ -142,55 +142,55 @@ func TestAttribute_Compare_String(t *testing.T) {
cases := []*compareTestCase{
{
A: &Attribute{
- String: helper.StringToPtr("a"),
+ String: pointer.Of("a"),
},
B: &Attribute{
- String: helper.StringToPtr("b"),
+ String: pointer.Of("b"),
},
Expected: -1,
},
{
A: &Attribute{
- String: helper.StringToPtr("hello"),
+ String: pointer.Of("hello"),
},
B: &Attribute{
- String: helper.StringToPtr("hello"),
+ String: pointer.Of("hello"),
},
Expected: 0,
},
{
A: &Attribute{
- String: helper.StringToPtr("b"),
+ String: pointer.Of("b"),
},
B: &Attribute{
- String: helper.StringToPtr("a"),
+ String: pointer.Of("a"),
},
Expected: 1,
},
{
A: &Attribute{
- String: helper.StringToPtr("hello"),
+ String: pointer.Of("hello"),
},
B: &Attribute{
- Bool: helper.BoolToPtr(true),
+ Bool: pointer.Of(true),
},
NotComparable: true,
},
{
A: &Attribute{
- String: helper.StringToPtr("hello"),
+ String: pointer.Of("hello"),
},
B: &Attribute{
- Int: helper.Int64ToPtr(123),
+ Int: pointer.Of(int64(123)),
},
NotComparable: true,
},
{
A: &Attribute{
- String: helper.StringToPtr("hello"),
+ String: pointer.Of("hello"),
},
B: &Attribute{
- Float: helper.Float64ToPtr(123.2),
+ Float: pointer.Of(float64(123.2)),
},
NotComparable: true,
},
@@ -202,46 +202,46 @@ func TestAttribute_Compare_Float(t *testing.T) {
cases := []*compareTestCase{
{
A: &Attribute{
- Float: helper.Float64ToPtr(101.5),
+ Float: pointer.Of(float64(101.5)),
},
B: &Attribute{
- Float: helper.Float64ToPtr(100001.5),
+ Float: pointer.Of(float64(100001.5)),
},
Expected: -1,
},
{
A: &Attribute{
- Float: helper.Float64ToPtr(100001.5),
+ Float: pointer.Of(float64(100001.5)),
},
B: &Attribute{
- Float: helper.Float64ToPtr(100001.5),
+ Float: pointer.Of(float64(100001.5)),
},
Expected: 0,
},
{
A: &Attribute{
- Float: helper.Float64ToPtr(999999999.5),
+ Float: pointer.Of(float64(999999999.5)),
},
B: &Attribute{
- Float: helper.Float64ToPtr(101.5),
+ Float: pointer.Of(float64(101.5)),
},
Expected: 1,
},
{
A: &Attribute{
- Float: helper.Float64ToPtr(101.5),
+ Float: pointer.Of(float64(101.5)),
},
B: &Attribute{
- Bool: helper.BoolToPtr(true),
+ Bool: pointer.Of(true),
},
NotComparable: true,
},
{
A: &Attribute{
- Float: helper.Float64ToPtr(101.5),
+ Float: pointer.Of(float64(101.5)),
},
B: &Attribute{
- String: helper.StringToPtr("hello"),
+ String: pointer.Of("hello"),
},
NotComparable: true,
},
@@ -253,46 +253,46 @@ func TestAttribute_Compare_Int(t *testing.T) {
cases := []*compareTestCase{
{
A: &Attribute{
- Int: helper.Int64ToPtr(3),
+ Int: pointer.Of(int64(3)),
},
B: &Attribute{
- Int: helper.Int64ToPtr(10),
+ Int: pointer.Of(int64(10)),
},
Expected: -1,
},
{
A: &Attribute{
- Int: helper.Int64ToPtr(10),
+ Int: pointer.Of(int64(10)),
},
B: &Attribute{
- Int: helper.Int64ToPtr(10),
+ Int: pointer.Of(int64(10)),
},
Expected: 0,
},
{
A: &Attribute{
- Int: helper.Int64ToPtr(100),
+ Int: pointer.Of(int64(100)),
},
B: &Attribute{
- Int: helper.Int64ToPtr(10),
+ Int: pointer.Of(int64(10)),
},
Expected: 1,
},
{
A: &Attribute{
- Int: helper.Int64ToPtr(10),
+ Int: pointer.Of(int64(10)),
},
B: &Attribute{
- Bool: helper.BoolToPtr(true),
+ Bool: pointer.Of(true),
},
NotComparable: true,
},
{
A: &Attribute{
- Int: helper.Int64ToPtr(10),
+ Int: pointer.Of(int64(10)),
},
B: &Attribute{
- String: helper.StringToPtr("hello"),
+ String: pointer.Of("hello"),
},
NotComparable: true,
},
@@ -304,77 +304,77 @@ func TestAttribute_Compare_Int_With_Units(t *testing.T) {
cases := []*compareTestCase{
{
A: &Attribute{
- Int: helper.Int64ToPtr(3),
+ Int: pointer.Of(int64(3)),
Unit: "MB",
},
B: &Attribute{
- Int: helper.Int64ToPtr(10),
+ Int: pointer.Of(int64(10)),
Unit: "MB",
},
Expected: -1,
},
{
A: &Attribute{
- Int: helper.Int64ToPtr(10),
+ Int: pointer.Of(int64(10)),
Unit: "MB",
},
B: &Attribute{
- Int: helper.Int64ToPtr(10),
+ Int: pointer.Of(int64(10)),
Unit: "MB",
},
Expected: 0,
},
{
A: &Attribute{
- Int: helper.Int64ToPtr(100),
+ Int: pointer.Of(int64(100)),
Unit: "MB",
},
B: &Attribute{
- Int: helper.Int64ToPtr(10),
+ Int: pointer.Of(int64(10)),
Unit: "MB",
},
Expected: 1,
},
{
A: &Attribute{
- Int: helper.Int64ToPtr(3),
+ Int: pointer.Of(int64(3)),
Unit: "GB",
},
B: &Attribute{
- Int: helper.Int64ToPtr(3),
+ Int: pointer.Of(int64(3)),
Unit: "MB",
},
Expected: 1,
},
{
A: &Attribute{
- Int: helper.Int64ToPtr(1),
+ Int: pointer.Of(int64(1)),
Unit: "GiB",
},
B: &Attribute{
- Int: helper.Int64ToPtr(1024),
+ Int: pointer.Of(int64(1024)),
Unit: "MiB",
},
Expected: 0,
},
{
A: &Attribute{
- Int: helper.Int64ToPtr(1),
+ Int: pointer.Of(int64(1)),
Unit: "GiB",
},
B: &Attribute{
- Int: helper.Int64ToPtr(1025),
+ Int: pointer.Of(int64(1025)),
Unit: "MiB",
},
Expected: -1,
},
{
A: &Attribute{
- Int: helper.Int64ToPtr(1000),
+ Int: pointer.Of(int64(1000)),
Unit: "mW",
},
B: &Attribute{
- Int: helper.Int64ToPtr(1),
+ Int: pointer.Of(int64(1)),
Unit: "W",
},
Expected: 0,
@@ -387,88 +387,88 @@ func TestAttribute_Compare_Float_With_Units(t *testing.T) {
cases := []*compareTestCase{
{
A: &Attribute{
- Float: helper.Float64ToPtr(3.0),
+ Float: pointer.Of(float64(3.0)),
Unit: "MB",
},
B: &Attribute{
- Float: helper.Float64ToPtr(10.0),
+ Float: pointer.Of(float64(10.0)),
Unit: "MB",
},
Expected: -1,
},
{
A: &Attribute{
- Float: helper.Float64ToPtr(10.0),
+ Float: pointer.Of(float64(10.0)),
Unit: "MB",
},
B: &Attribute{
- Float: helper.Float64ToPtr(10.0),
+ Float: pointer.Of(float64(10.0)),
Unit: "MB",
},
Expected: 0,
},
{
A: &Attribute{
- Float: helper.Float64ToPtr(100.0),
+ Float: pointer.Of(float64(100.0)),
Unit: "MB",
},
B: &Attribute{
- Float: helper.Float64ToPtr(10.0),
+ Float: pointer.Of(float64(10.0)),
Unit: "MB",
},
Expected: 1,
},
{
A: &Attribute{
- Float: helper.Float64ToPtr(3.0),
+ Float: pointer.Of(float64(3.0)),
Unit: "GB",
},
B: &Attribute{
- Float: helper.Float64ToPtr(3.0),
+ Float: pointer.Of(float64(3.0)),
Unit: "MB",
},
Expected: 1,
},
{
A: &Attribute{
- Float: helper.Float64ToPtr(1.0),
+ Float: pointer.Of(float64(1.0)),
Unit: "GiB",
},
B: &Attribute{
- Float: helper.Float64ToPtr(1024.0),
+ Float: pointer.Of(float64(1024.0)),
Unit: "MiB",
},
Expected: 0,
},
{
A: &Attribute{
- Float: helper.Float64ToPtr(1.0),
+ Float: pointer.Of(float64(1.0)),
Unit: "GiB",
},
B: &Attribute{
- Float: helper.Float64ToPtr(1025.0),
+ Float: pointer.Of(float64(1025.0)),
Unit: "MiB",
},
Expected: -1,
},
{
A: &Attribute{
- Float: helper.Float64ToPtr(1000.0),
+ Float: pointer.Of(float64(1000.0)),
Unit: "mW",
},
B: &Attribute{
- Float: helper.Float64ToPtr(1.0),
+ Float: pointer.Of(float64(1.0)),
Unit: "W",
},
Expected: 0,
},
{
A: &Attribute{
- Float: helper.Float64ToPtr(1.5),
+ Float: pointer.Of(float64(1.5)),
Unit: "GiB",
},
B: &Attribute{
- Float: helper.Float64ToPtr(1400.0),
+ Float: pointer.Of(float64(1400.0)),
Unit: "MiB",
},
Expected: 1,
@@ -481,46 +481,46 @@ func TestAttribute_Compare_IntToFloat(t *testing.T) {
cases := []*compareTestCase{
{
A: &Attribute{
- Int: helper.Int64ToPtr(3),
+ Int: pointer.Of(int64(3)),
},
B: &Attribute{
- Float: helper.Float64ToPtr(10.0),
+ Float: pointer.Of(float64(10.0)),
},
Expected: -1,
},
{
A: &Attribute{
- Int: helper.Int64ToPtr(10),
+ Int: pointer.Of(int64(10)),
},
B: &Attribute{
- Float: helper.Float64ToPtr(10.0),
+ Float: pointer.Of(float64(10.0)),
},
Expected: 0,
},
{
A: &Attribute{
- Int: helper.Int64ToPtr(10),
+ Int: pointer.Of(int64(10)),
},
B: &Attribute{
- Float: helper.Float64ToPtr(10.1),
+ Float: pointer.Of(float64(10.1)),
},
Expected: -1,
},
{
A: &Attribute{
- Int: helper.Int64ToPtr(100),
+ Int: pointer.Of(int64(100)),
},
B: &Attribute{
- Float: helper.Float64ToPtr(10.0),
+ Float: pointer.Of(float64(10.0)),
},
Expected: 1,
},
{
A: &Attribute{
- Int: helper.Int64ToPtr(100),
+ Int: pointer.Of(int64(100)),
},
B: &Attribute{
- Float: helper.Float64ToPtr(100.00001),
+ Float: pointer.Of(float64(100.00001)),
},
Expected: -1,
},
@@ -549,108 +549,108 @@ func TestAttribute_ParseAndValidate(t *testing.T) {
{
Input: "true",
Expected: &Attribute{
- Bool: helper.BoolToPtr(true),
+ Bool: pointer.Of(true),
},
},
{
Input: "false",
Expected: &Attribute{
- Bool: helper.BoolToPtr(false),
+ Bool: pointer.Of(false),
},
},
{
Input: "1",
Expected: &Attribute{
- Int: helper.Int64ToPtr(1),
+ Int: pointer.Of(int64(1)),
},
},
{
Input: "100",
Expected: &Attribute{
- Int: helper.Int64ToPtr(100),
+ Int: pointer.Of(int64(100)),
},
},
{
Input: "-100",
Expected: &Attribute{
- Int: helper.Int64ToPtr(-100),
+ Int: pointer.Of(int64(-100)),
},
},
{
Input: "-1.0",
Expected: &Attribute{
- Float: helper.Float64ToPtr(-1.0),
+ Float: pointer.Of(float64(-1.0)),
},
},
{
Input: "-100.25",
Expected: &Attribute{
- Float: helper.Float64ToPtr(-100.25),
+ Float: pointer.Of(float64(-100.25)),
},
},
{
Input: "1.01",
Expected: &Attribute{
- Float: helper.Float64ToPtr(1.01),
+ Float: pointer.Of(float64(1.01)),
},
},
{
Input: "100.25",
Expected: &Attribute{
- Float: helper.Float64ToPtr(100.25),
+ Float: pointer.Of(float64(100.25)),
},
},
{
Input: "foobar",
Expected: &Attribute{
- String: helper.StringToPtr("foobar"),
+ String: pointer.Of("foobar"),
},
},
{
Input: "foo123bar",
Expected: &Attribute{
- String: helper.StringToPtr("foo123bar"),
+ String: pointer.Of("foo123bar"),
},
},
{
Input: "100MB",
Expected: &Attribute{
- Int: helper.Int64ToPtr(100),
+ Int: pointer.Of(int64(100)),
Unit: "MB",
},
},
{
Input: "-100MHz",
Expected: &Attribute{
- Int: helper.Int64ToPtr(-100),
+ Int: pointer.Of(int64(-100)),
Unit: "MHz",
},
},
{
Input: "-1.0MB/s",
Expected: &Attribute{
- Float: helper.Float64ToPtr(-1.0),
+ Float: pointer.Of(float64(-1.0)),
Unit: "MB/s",
},
},
{
Input: "-100.25GiB/s",
Expected: &Attribute{
- Float: helper.Float64ToPtr(-100.25),
+ Float: pointer.Of(float64(-100.25)),
Unit: "GiB/s",
},
},
{
Input: "1.01TB",
Expected: &Attribute{
- Float: helper.Float64ToPtr(1.01),
+ Float: pointer.Of(float64(1.01)),
Unit: "TB",
},
},
{
Input: "100.25mW",
Expected: &Attribute{
- Float: helper.Float64ToPtr(100.25),
+ Float: pointer.Of(float64(100.25)),
Unit: "mW",
},
},
diff --git a/plugins/shared/structs/proto/attribute.pb.go b/plugins/shared/structs/proto/attribute.pb.go
index ab9038aecac..cdc95735cd9 100644
--- a/plugins/shared/structs/proto/attribute.pb.go
+++ b/plugins/shared/structs/proto/attribute.pb.go
@@ -24,6 +24,7 @@ const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
// specifying units
type Attribute struct {
// Types that are valid to be assigned to Value:
+ //
// *Attribute_FloatVal
// *Attribute_IntVal
// *Attribute_StringVal
diff --git a/plugins/shared/structs/util.go b/plugins/shared/structs/util.go
index 2a4b9b0e775..0e3500a43a3 100644
--- a/plugins/shared/structs/util.go
+++ b/plugins/shared/structs/util.go
@@ -2,7 +2,7 @@ package structs
import (
"github.com/golang/protobuf/ptypes/wrappers"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/plugins/shared/structs/proto"
)
@@ -13,13 +13,13 @@ func ConvertProtoAttribute(in *proto.Attribute) *Attribute {
switch in.Value.(type) {
case *proto.Attribute_BoolVal:
- out.Bool = helper.BoolToPtr(in.GetBoolVal())
+ out.Bool = pointer.Of(in.GetBoolVal())
case *proto.Attribute_FloatVal:
- out.Float = helper.Float64ToPtr(in.GetFloatVal())
+ out.Float = pointer.Of(in.GetFloatVal())
case *proto.Attribute_IntVal:
- out.Int = helper.Int64ToPtr(in.GetIntVal())
+ out.Int = pointer.Of(in.GetIntVal())
case *proto.Attribute_StringVal:
- out.String = helper.StringToPtr(in.GetStringVal())
+ out.String = pointer.Of(in.GetStringVal())
default:
}
diff --git a/scheduler/annotate.go b/scheduler/annotate.go
index fb5aef27c04..4ca41fad9eb 100644
--- a/scheduler/annotate.go
+++ b/scheduler/annotate.go
@@ -30,11 +30,12 @@ const (
//
// Currently the things that are annotated are:
// * Task group changes will be annotated with:
-// * Count up and count down changes
-// * Update counts (creates, destroys, migrates, etc)
+// - Count up and count down changes
+// - Update counts (creates, destroys, migrates, etc)
+//
// * Task changes will be annotated with:
-// * forces create/destroy update
-// * forces in-place update
+// - forces create/destroy update
+// - forces in-place update
func Annotate(diff *structs.JobDiff, annotations *structs.PlanAnnotations) error {
tgDiffs := diff.TaskGroups
if len(tgDiffs) == 0 {
diff --git a/scheduler/benchmarks/benchmarks_test.go b/scheduler/benchmarks/benchmarks_test.go
index f46042819b0..c694141f00f 100644
--- a/scheduler/benchmarks/benchmarks_test.go
+++ b/scheduler/benchmarks/benchmarks_test.go
@@ -16,9 +16,9 @@ import (
// benchmark for the Nomad scheduler. The starting state for your
// implementation will depend on the following environment variables:
//
-// - NOMAD_BENCHMARK_DATADIR: path to data directory
-// - NOMAD_BENCHMARK_SNAPSHOT: path to raft snapshot
-// - neither: empty starting state
+// - NOMAD_BENCHMARK_DATADIR: path to data directory
+// - NOMAD_BENCHMARK_SNAPSHOT: path to raft snapshot
+// - neither: empty starting state
//
// You can run a profile for this benchmark with the usual -cpuprofile
// -memprofile flags.
diff --git a/scheduler/context_test.go b/scheduler/context_test.go
index 0bd0c543223..d5a503b51b1 100644
--- a/scheduler/context_test.go
+++ b/scheduler/context_test.go
@@ -157,7 +157,6 @@ func TestEvalContext_ProposedAlloc(t *testing.T) {
// Preempted allocs are removed from the allocs propsed for a node.
//
// See https://github.com/hashicorp/nomad/issues/6787
-//
func TestEvalContext_ProposedAlloc_EvictPreempt(t *testing.T) {
ci.Parallel(t)
state, ctx := testContext(t)
diff --git a/scheduler/feasible_test.go b/scheduler/feasible_test.go
index 16a0ada00a7..2a5d804a210 100644
--- a/scheduler/feasible_test.go
+++ b/scheduler/feasible_test.go
@@ -34,8 +34,7 @@ func TestStaticIterator_Reset(t *testing.T) {
out := collectFeasible(static)
if len(out) != len(nodes) {
- t.Fatalf("out: %#v", out)
- t.Fatalf("missing nodes %d %#v", i, static)
+ t.Fatalf("out: %#v missing nodes %d %#v", out, i, static)
}
ids := make(map[string]struct{})
diff --git a/scheduler/generic_sched_test.go b/scheduler/generic_sched_test.go
index 7b47768a4ee..1711ca0c1fb 100644
--- a/scheduler/generic_sched_test.go
+++ b/scheduler/generic_sched_test.go
@@ -10,6 +10,7 @@ import (
memdb "github.com/hashicorp/go-memdb"
"github.com/hashicorp/nomad/ci"
"github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
@@ -64,10 +65,11 @@ func TestServiceSched_JobRegister(t *testing.T) {
// Ensure the eval has no spawned blocked eval
if len(h.CreateEvals) != 0 {
- t.Fatalf("bad: %#v", h.CreateEvals)
+ t.Errorf("bad: %#v", h.CreateEvals)
if h.Evals[0].BlockedEval != "" {
t.Fatalf("bad: %#v", h.Evals[0])
}
+ t.FailNow()
}
// Ensure the plan allocated
@@ -1517,10 +1519,11 @@ func TestServiceSched_EvaluateBlockedEval_Finished(t *testing.T) {
// Ensure the eval has no spawned blocked eval
if len(h.Evals) != 1 {
- t.Fatalf("bad: %#v", h.Evals)
+ t.Errorf("bad: %#v", h.Evals)
if h.Evals[0].BlockedEval != "" {
t.Fatalf("bad: %#v", h.Evals[0])
}
+ t.FailNow()
}
// Ensure the plan allocated
@@ -2336,7 +2339,7 @@ func TestServiceSched_JobModify_InPlace(t *testing.T) {
alloc.JobID = job.ID
alloc.Name = fmt.Sprintf("my-job.web[%d]", i)
alloc.DeploymentID = d.ID
- alloc.DeploymentStatus = &structs.AllocDeploymentStatus{Healthy: helper.BoolToPtr(true)}
+ alloc.DeploymentStatus = &structs.AllocDeploymentStatus{Healthy: pointer.Of(true)}
alloc.AllocatedResources.Tasks[taskName].Devices = []*structs.AllocatedDeviceResource{&adr}
alloc.AllocatedResources.Shared = asr
allocs = append(allocs, alloc)
@@ -2983,7 +2986,7 @@ func TestServiceSched_NodeDown(t *testing.T) {
alloc.ClientStatus = tc.client
// Mark for migration if necessary
- alloc.DesiredTransition.Migrate = helper.BoolToPtr(tc.migrate)
+ alloc.DesiredTransition.Migrate = pointer.Of(tc.migrate)
allocs := []*structs.Allocation{alloc}
require.NoError(t, h.State.UpsertAllocs(structs.MsgTypeTestSetup, h.NextIndex(), allocs))
@@ -3276,7 +3279,7 @@ func TestServiceSched_NodeDrain(t *testing.T) {
alloc.JobID = job.ID
alloc.NodeID = node.ID
alloc.Name = fmt.Sprintf("my-job.web[%d]", i)
- alloc.DesiredTransition.Migrate = helper.BoolToPtr(true)
+ alloc.DesiredTransition.Migrate = pointer.Of(true)
allocs = append(allocs, alloc)
}
require.NoError(t, h.State.UpsertAllocs(structs.MsgTypeTestSetup, h.NextIndex(), allocs))
@@ -3363,7 +3366,7 @@ func TestServiceSched_NodeDrain_Down(t *testing.T) {
for i := 0; i < 6; i++ {
newAlloc := allocs[i].Copy()
newAlloc.ClientStatus = structs.AllocDesiredStatusStop
- newAlloc.DesiredTransition.Migrate = helper.BoolToPtr(true)
+ newAlloc.DesiredTransition.Migrate = pointer.Of(true)
stop = append(stop, newAlloc)
}
require.NoError(t, h.State.UpsertAllocs(structs.MsgTypeTestSetup, h.NextIndex(), stop))
@@ -3468,7 +3471,7 @@ func TestServiceSched_NodeDrain_Queued_Allocations(t *testing.T) {
alloc.JobID = job.ID
alloc.NodeID = node.ID
alloc.Name = fmt.Sprintf("my-job.web[%d]", i)
- alloc.DesiredTransition.Migrate = helper.BoolToPtr(true)
+ alloc.DesiredTransition.Migrate = pointer.Of(true)
allocs = append(allocs, alloc)
}
require.NoError(t, h.State.UpsertAllocs(structs.MsgTypeTestSetup, h.NextIndex(), allocs))
@@ -3527,7 +3530,7 @@ func TestServiceSched_NodeDrain_TaskHandle(t *testing.T) {
alloc.JobID = job.ID
alloc.NodeID = node.ID
alloc.Name = fmt.Sprintf("my-job.web[%d]", i)
- alloc.DesiredTransition.Migrate = helper.BoolToPtr(true)
+ alloc.DesiredTransition.Migrate = pointer.Of(true)
alloc.TaskStates = map[string]*structs.TaskState{
"web": {
TaskHandle: &structs.TaskHandle{
@@ -4176,7 +4179,7 @@ func TestDeployment_FailedAllocs_Reschedule(t *testing.T) {
allocs[1].TaskStates = map[string]*structs.TaskState{"web": {State: "start",
StartedAt: time.Now().Add(-12 * time.Hour),
FinishedAt: time.Now().Add(-10 * time.Hour)}}
- allocs[1].DesiredTransition.Reschedule = helper.BoolToPtr(true)
+ allocs[1].DesiredTransition.Reschedule = pointer.Of(true)
require.Nil(h.State.UpsertAllocs(structs.MsgTypeTestSetup, h.NextIndex(), allocs))
@@ -5198,7 +5201,7 @@ func TestServiceSched_NodeDrain_Sticky(t *testing.T) {
alloc.NodeID = node.ID
alloc.Job.TaskGroups[0].Count = 1
alloc.Job.TaskGroups[0].EphemeralDisk.Sticky = true
- alloc.DesiredTransition.Migrate = helper.BoolToPtr(true)
+ alloc.DesiredTransition.Migrate = pointer.Of(true)
require.NoError(t, h.State.UpsertJob(structs.MsgTypeTestSetup, h.NextIndex(), alloc.Job))
require.NoError(t, h.State.UpsertAllocs(structs.MsgTypeTestSetup, h.NextIndex(), []*structs.Allocation{alloc}))
@@ -5834,7 +5837,7 @@ func TestServiceSched_Migrate_NonCanary(t *testing.T) {
alloc.Name = "my-job.web[0]"
alloc.DesiredStatus = structs.AllocDesiredStatusRun
alloc.ClientStatus = structs.AllocClientStatusRunning
- alloc.DesiredTransition.Migrate = helper.BoolToPtr(true)
+ alloc.DesiredTransition.Migrate = pointer.Of(true)
require.NoError(t, h.State.UpsertAllocs(structs.MsgTypeTestSetup, h.NextIndex(), []*structs.Allocation{alloc}))
// Create a mock evaluation
@@ -6520,7 +6523,7 @@ func TestPropagateTaskState(t *testing.T) {
prevAlloc: &structs.Allocation{
ClientStatus: structs.AllocClientStatusRunning,
DesiredTransition: structs.DesiredTransition{
- Migrate: helper.BoolToPtr(true),
+ Migrate: pointer.Of(true),
},
TaskStates: map[string]*structs.TaskState{
taskName: {
@@ -6548,7 +6551,7 @@ func TestPropagateTaskState(t *testing.T) {
prevAlloc: &structs.Allocation{
ClientStatus: structs.AllocClientStatusRunning,
DesiredTransition: structs.DesiredTransition{
- Migrate: helper.BoolToPtr(true),
+ Migrate: pointer.Of(true),
},
TaskStates: map[string]*structs.TaskState{
taskName: {},
diff --git a/scheduler/propertyset.go b/scheduler/propertyset.go
index f6d48fe2860..e2325744e61 100644
--- a/scheduler/propertyset.go
+++ b/scheduler/propertyset.go
@@ -248,7 +248,7 @@ func (p *propertySet) UsedCount(option *structs.Node, tg string) (string, string
// existing and proposed allocations. It also takes into account any stopped
// allocations
func (p *propertySet) GetCombinedUseMap() map[string]uint64 {
- combinedUse := make(map[string]uint64, helper.IntMax(len(p.existingValues), len(p.proposedValues)))
+ combinedUse := make(map[string]uint64, helper.Max(len(p.existingValues), len(p.proposedValues)))
for _, usedValues := range []map[string]uint64{p.existingValues, p.proposedValues} {
for propertyValue, usedCount := range usedValues {
combinedUse[propertyValue] += usedCount
diff --git a/scheduler/reconcile.go b/scheduler/reconcile.go
index cfdc0996db1..7e645674c81 100644
--- a/scheduler/reconcile.go
+++ b/scheduler/reconcile.go
@@ -766,7 +766,7 @@ func (a *allocReconciler) computeReplacements(deploymentPlaceReady bool, desired
a.markStop(failed, "", allocRescheduled)
desiredChanges.Stop += uint64(len(failed))
- min := helper.IntMin(len(place), underProvisionedBy)
+ min := helper.Min(len(place), underProvisionedBy)
underProvisionedBy -= min
return underProvisionedBy
}
@@ -778,7 +778,7 @@ func (a *allocReconciler) computeReplacements(deploymentPlaceReady bool, desired
// If allocs have been lost, determine the number of replacements that are needed
// and add placements to the result for the lost allocs.
if len(lost) != 0 {
- allowed := helper.IntMin(len(lost), len(place))
+ allowed := helper.Min(len(lost), len(place))
desiredChanges.Place += uint64(allowed)
a.result.place = append(a.result.place, place[:allowed]...)
}
@@ -819,7 +819,7 @@ func (a *allocReconciler) computeDestructiveUpdates(destructive allocSet, underP
desiredChanges *structs.DesiredUpdates, tg *structs.TaskGroup) {
// Do all destructive updates
- min := helper.IntMin(len(destructive), underProvisionedBy)
+ min := helper.Min(len(destructive), underProvisionedBy)
desiredChanges.DestructiveUpdate += uint64(min)
desiredChanges.Ignore += uint64(len(destructive) - min)
for _, alloc := range destructive.nameOrder()[:min] {
@@ -903,7 +903,7 @@ func (a *allocReconciler) isDeploymentComplete(groupName string, destructive, in
// Final check to see if the deployment is complete is to ensure everything is healthy
if dstate, ok := a.deployment.TaskGroups[groupName]; ok {
- if dstate.HealthyAllocs < helper.IntMax(dstate.DesiredTotal, dstate.DesiredCanaries) || // Make sure we have enough healthy allocs
+ if dstate.HealthyAllocs < helper.Max(dstate.DesiredTotal, dstate.DesiredCanaries) || // Make sure we have enough healthy allocs
(dstate.DesiredCanaries > 0 && !dstate.Promoted) { // Make sure we are promoted if we have canaries
complete = false
}
diff --git a/scheduler/reconcile_test.go b/scheduler/reconcile_test.go
index 3cb29cb901a..cb986ded62b 100644
--- a/scheduler/reconcile_test.go
+++ b/scheduler/reconcile_test.go
@@ -9,7 +9,7 @@ import (
"time"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/testlog"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/mock"
@@ -334,7 +334,7 @@ func buildDisconnectedNodes(allocs []*structs.Allocation, count int) map[string]
func buildResumableAllocations(count int, clientStatus, desiredStatus string, nodeScore float64) (*structs.Job, []*structs.Allocation) {
job := mock.Job()
- job.TaskGroups[0].MaxClientDisconnect = helper.TimeToPtr(5 * time.Minute)
+ job.TaskGroups[0].MaxClientDisconnect = pointer.Of(5 * time.Minute)
job.TaskGroups[0].Count = count
return job, buildAllocations(job, count, clientStatus, desiredStatus, nodeScore)
@@ -1059,7 +1059,7 @@ func TestReconciler_DrainNode(t *testing.T) {
for i := 0; i < 2; i++ {
n := mock.DrainNode()
n.ID = allocs[i].NodeID
- allocs[i].DesiredTransition.Migrate = helper.BoolToPtr(true)
+ allocs[i].DesiredTransition.Migrate = pointer.Of(true)
tainted[n.ID] = n
}
@@ -1114,7 +1114,7 @@ func TestReconciler_DrainNode_ScaleUp(t *testing.T) {
for i := 0; i < 2; i++ {
n := mock.DrainNode()
n.ID = allocs[i].NodeID
- allocs[i].DesiredTransition.Migrate = helper.BoolToPtr(true)
+ allocs[i].DesiredTransition.Migrate = pointer.Of(true)
tainted[n.ID] = n
}
@@ -1170,7 +1170,7 @@ func TestReconciler_DrainNode_ScaleDown(t *testing.T) {
for i := 0; i < 3; i++ {
n := mock.DrainNode()
n.ID = allocs[i].NodeID
- allocs[i].DesiredTransition.Migrate = helper.BoolToPtr(true)
+ allocs[i].DesiredTransition.Migrate = pointer.Of(true)
tainted[n.ID] = n
}
@@ -2269,7 +2269,7 @@ func TestReconciler_RescheduleNow_Service_WithCanaries(t *testing.T) {
alloc.DeploymentID = d.ID
alloc.DeploymentStatus = &structs.AllocDeploymentStatus{
Canary: true,
- Healthy: helper.BoolToPtr(false),
+ Healthy: pointer.Of(false),
}
s.PlacedCanaries = append(s.PlacedCanaries, alloc.ID)
allocs = append(allocs, alloc)
@@ -2360,7 +2360,7 @@ func TestReconciler_RescheduleNow_Service_Canaries(t *testing.T) {
alloc.DeploymentID = d.ID
alloc.DeploymentStatus = &structs.AllocDeploymentStatus{
Canary: true,
- Healthy: helper.BoolToPtr(false),
+ Healthy: pointer.Of(false),
}
s.PlacedCanaries = append(s.PlacedCanaries, alloc.ID)
allocs = append(allocs, alloc)
@@ -2368,7 +2368,7 @@ func TestReconciler_RescheduleNow_Service_Canaries(t *testing.T) {
// Mark the canaries as failed
allocs[5].ClientStatus = structs.AllocClientStatusFailed
- allocs[5].DesiredTransition.Reschedule = helper.BoolToPtr(true)
+ allocs[5].DesiredTransition.Reschedule = pointer.Of(true)
// Mark one of them as already rescheduled once
allocs[5].RescheduleTracker = &structs.RescheduleTracker{Events: []*structs.RescheduleEvent{
@@ -2382,7 +2382,7 @@ func TestReconciler_RescheduleNow_Service_Canaries(t *testing.T) {
StartedAt: now.Add(-1 * time.Hour),
FinishedAt: now.Add(-10 * time.Second)}}
allocs[6].ClientStatus = structs.AllocClientStatusFailed
- allocs[6].DesiredTransition.Reschedule = helper.BoolToPtr(true)
+ allocs[6].DesiredTransition.Reschedule = pointer.Of(true)
// Create 4 unhealthy canary allocations that have already been replaced
for i := 0; i < 4; i++ {
@@ -2395,7 +2395,7 @@ func TestReconciler_RescheduleNow_Service_Canaries(t *testing.T) {
alloc.DeploymentID = d.ID
alloc.DeploymentStatus = &structs.AllocDeploymentStatus{
Canary: true,
- Healthy: helper.BoolToPtr(false),
+ Healthy: pointer.Of(false),
}
s.PlacedCanaries = append(s.PlacedCanaries, alloc.ID)
allocs = append(allocs, alloc)
@@ -2490,7 +2490,7 @@ func TestReconciler_RescheduleNow_Service_Canaries_Limit(t *testing.T) {
alloc.DeploymentID = d.ID
alloc.DeploymentStatus = &structs.AllocDeploymentStatus{
Canary: true,
- Healthy: helper.BoolToPtr(false),
+ Healthy: pointer.Of(false),
}
s.PlacedCanaries = append(s.PlacedCanaries, alloc.ID)
allocs = append(allocs, alloc)
@@ -2498,7 +2498,7 @@ func TestReconciler_RescheduleNow_Service_Canaries_Limit(t *testing.T) {
// Mark the canaries as failed
allocs[5].ClientStatus = structs.AllocClientStatusFailed
- allocs[5].DesiredTransition.Reschedule = helper.BoolToPtr(true)
+ allocs[5].DesiredTransition.Reschedule = pointer.Of(true)
// Mark one of them as already rescheduled once
allocs[5].RescheduleTracker = &structs.RescheduleTracker{Events: []*structs.RescheduleEvent{
@@ -2512,7 +2512,7 @@ func TestReconciler_RescheduleNow_Service_Canaries_Limit(t *testing.T) {
StartedAt: now.Add(-1 * time.Hour),
FinishedAt: now.Add(-10 * time.Second)}}
allocs[6].ClientStatus = structs.AllocClientStatusFailed
- allocs[6].DesiredTransition.Reschedule = helper.BoolToPtr(true)
+ allocs[6].DesiredTransition.Reschedule = pointer.Of(true)
// Create 4 unhealthy canary allocations that have already been replaced
for i := 0; i < 4; i++ {
@@ -2525,7 +2525,7 @@ func TestReconciler_RescheduleNow_Service_Canaries_Limit(t *testing.T) {
alloc.DeploymentID = d.ID
alloc.DeploymentStatus = &structs.AllocDeploymentStatus{
Canary: true,
- Healthy: helper.BoolToPtr(false),
+ Healthy: pointer.Of(false),
}
s.PlacedCanaries = append(s.PlacedCanaries, alloc.ID)
allocs = append(allocs, alloc)
@@ -3255,7 +3255,7 @@ func TestReconciler_DrainNode_Canary(t *testing.T) {
tainted := make(map[string]*structs.Node, 1)
n := mock.DrainNode()
n.ID = allocs[11].NodeID
- allocs[11].DesiredTransition.Migrate = helper.BoolToPtr(true)
+ allocs[11].DesiredTransition.Migrate = pointer.Of(true)
tainted[n.ID] = n
mockUpdateFn := allocUpdateFnMock(handled, allocUpdateFnDestructive)
@@ -3816,7 +3816,7 @@ func TestReconciler_PromoteCanaries_Unblock(t *testing.T) {
s.PlacedCanaries = append(s.PlacedCanaries, canary.ID)
canary.DeploymentID = d.ID
canary.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
}
allocs = append(allocs, canary)
handled[canary.ID] = allocUpdateFnIgnore
@@ -3893,7 +3893,7 @@ func TestReconciler_PromoteCanaries_CanariesEqualCount(t *testing.T) {
s.PlacedCanaries = append(s.PlacedCanaries, canary.ID)
canary.DeploymentID = d.ID
canary.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
}
allocs = append(allocs, canary)
handled[canary.ID] = allocUpdateFnIgnore
@@ -3994,7 +3994,7 @@ func TestReconciler_DeploymentLimit_HealthAccounting(t *testing.T) {
new.DeploymentID = d.ID
if i < c.healthy {
new.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
}
}
allocs = append(allocs, new)
@@ -4065,7 +4065,7 @@ func TestReconciler_TaintedNode_RollingUpgrade(t *testing.T) {
new.TaskGroup = job.TaskGroups[0].Name
new.DeploymentID = d.ID
new.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
}
allocs = append(allocs, new)
handled[new.ID] = allocUpdateFnIgnore
@@ -4080,7 +4080,7 @@ func TestReconciler_TaintedNode_RollingUpgrade(t *testing.T) {
n.Status = structs.NodeStatusDown
} else {
n.DrainStrategy = mock.DrainNode().DrainStrategy
- allocs[2+i].DesiredTransition.Migrate = helper.BoolToPtr(true)
+ allocs[2+i].DesiredTransition.Migrate = pointer.Of(true)
}
tainted[n.ID] = n
}
@@ -4153,7 +4153,7 @@ func TestReconciler_FailedDeployment_TaintedNodes(t *testing.T) {
new.TaskGroup = job.TaskGroups[0].Name
new.DeploymentID = d.ID
new.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
}
allocs = append(allocs, new)
handled[new.ID] = allocUpdateFnIgnore
@@ -4168,7 +4168,7 @@ func TestReconciler_FailedDeployment_TaintedNodes(t *testing.T) {
n.Status = structs.NodeStatusDown
} else {
n.DrainStrategy = mock.DrainNode().DrainStrategy
- allocs[6+i].DesiredTransition.Migrate = helper.BoolToPtr(true)
+ allocs[6+i].DesiredTransition.Migrate = pointer.Of(true)
}
tainted[n.ID] = n
}
@@ -4228,7 +4228,7 @@ func TestReconciler_CompleteDeployment(t *testing.T) {
alloc.TaskGroup = job.TaskGroups[0].Name
alloc.DeploymentID = d.ID
alloc.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
}
allocs = append(allocs, alloc)
}
@@ -4281,11 +4281,11 @@ func TestReconciler_MarkDeploymentComplete_FailedAllocations(t *testing.T) {
alloc.DeploymentStatus = &structs.AllocDeploymentStatus{}
if i < 10 {
alloc.ClientStatus = structs.AllocClientStatusRunning
- alloc.DeploymentStatus.Healthy = helper.BoolToPtr(true)
+ alloc.DeploymentStatus.Healthy = pointer.Of(true)
} else {
alloc.DesiredStatus = structs.AllocDesiredStatusStop
alloc.ClientStatus = structs.AllocClientStatusFailed
- alloc.DeploymentStatus.Healthy = helper.BoolToPtr(false)
+ alloc.DeploymentStatus.Healthy = pointer.Of(false)
}
allocs = append(allocs, alloc)
@@ -4367,7 +4367,7 @@ func TestReconciler_FailedDeployment_CancelCanaries(t *testing.T) {
new.TaskGroup = job.TaskGroups[group].Name
new.DeploymentID = d.ID
new.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
}
allocs = append(allocs, new)
handled[new.ID] = allocUpdateFnIgnore
@@ -4452,7 +4452,7 @@ func TestReconciler_FailedDeployment_NewJob(t *testing.T) {
new.TaskGroup = job.TaskGroups[0].Name
new.DeploymentID = d.ID
new.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
}
allocs = append(allocs, new)
}
@@ -4512,7 +4512,7 @@ func TestReconciler_MarkDeploymentComplete(t *testing.T) {
alloc.TaskGroup = job.TaskGroups[0].Name
alloc.DeploymentID = d.ID
alloc.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
}
allocs = append(allocs, alloc)
}
@@ -4801,7 +4801,7 @@ func TestReconciler_DeploymentWithFailedAllocs_DontReschedule(t *testing.T) {
// Mark half of them as reschedulable
for i := 0; i < 5; i++ {
- allocs[i].DesiredTransition.Reschedule = helper.BoolToPtr(true)
+ allocs[i].DesiredTransition.Reschedule = pointer.Of(true)
}
reconciler := NewAllocReconciler(testlog.HCLogger(t), allocUpdateFnDestructive, false, job.ID, job,
@@ -4870,7 +4870,7 @@ func TestReconciler_FailedDeployment_AutoRevert_CancelCanaries(t *testing.T) {
new.TaskGroup = job.TaskGroups[0].Name
new.DeploymentID = d.ID
new.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
}
new.ClientStatus = structs.AllocClientStatusRunning
allocs = append(allocs, new)
@@ -4885,7 +4885,7 @@ func TestReconciler_FailedDeployment_AutoRevert_CancelCanaries(t *testing.T) {
new.TaskGroup = job.TaskGroups[0].Name
new.DeploymentID = uuid.Generate()
new.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(false),
+ Healthy: pointer.Of(false),
}
new.DesiredStatus = structs.AllocDesiredStatusStop
new.ClientStatus = structs.AllocClientStatusFailed
@@ -5022,7 +5022,7 @@ func TestReconciler_ForceReschedule_Service(t *testing.T) {
}}
// Mark DesiredTransition ForceReschedule
- allocs[0].DesiredTransition = structs.DesiredTransition{ForceReschedule: helper.BoolToPtr(true)}
+ allocs[0].DesiredTransition = structs.DesiredTransition{ForceReschedule: pointer.Of(true)}
reconciler := NewAllocReconciler(testlog.HCLogger(t), allocUpdateFnIgnore, false, job.ID, job,
nil, allocs, nil, "", 50, true)
@@ -5488,7 +5488,7 @@ func TestReconciler_Disconnected_Client(t *testing.T) {
serverDesiredStatus: structs.AllocDesiredStatusRun,
shouldStopOnDisconnectedNode: true,
nodeStatusDisconnected: true,
- maxDisconnect: helper.TimeToPtr(2 * time.Second),
+ maxDisconnect: pointer.Of(2 * time.Second),
expected: &resultExpectation{
stop: 2,
desiredTGUpdates: map[string]*structs.DesiredUpdates{
@@ -5926,7 +5926,7 @@ func TestReconciler_Client_Disconnect_Canaries(t *testing.T) {
Canary: true,
}
if alloc.ClientStatus == structs.AllocClientStatusRunning {
- alloc.DeploymentStatus.Healthy = helper.BoolToPtr(true)
+ alloc.DeploymentStatus.Healthy = pointer.Of(true)
}
tc.deploymentState.PlacedCanaries = append(tc.deploymentState.PlacedCanaries, alloc.ID)
handled[alloc.ID] = allocUpdateFnIgnore
diff --git a/scheduler/reconcile_util_test.go b/scheduler/reconcile_util_test.go
index ab386739333..21f19814e42 100644
--- a/scheduler/reconcile_util_test.go
+++ b/scheduler/reconcile_util_test.go
@@ -5,7 +5,7 @@ import (
"time"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
"github.com/stretchr/testify/require"
@@ -61,7 +61,7 @@ func TestAllocSet_filterByTainted(t *testing.T) {
}
testJob := mock.Job()
- testJob.TaskGroups[0].MaxClientDisconnect = helper.TimeToPtr(5 * time.Second)
+ testJob.TaskGroups[0].MaxClientDisconnect = pointer.Of(5 * time.Second)
now := time.Now()
testJobNoMaxDisconnect := mock.Job()
@@ -143,7 +143,7 @@ func TestAllocSet_filterByTainted(t *testing.T) {
"migrating1": {
ID: "migrating1",
ClientStatus: structs.AllocClientStatusRunning,
- DesiredTransition: structs.DesiredTransition{Migrate: helper.BoolToPtr(true)},
+ DesiredTransition: structs.DesiredTransition{Migrate: pointer.Of(true)},
Job: testJob,
NodeID: "draining",
},
@@ -151,7 +151,7 @@ func TestAllocSet_filterByTainted(t *testing.T) {
"migrating2": {
ID: "migrating2",
ClientStatus: structs.AllocClientStatusRunning,
- DesiredTransition: structs.DesiredTransition{Migrate: helper.BoolToPtr(true)},
+ DesiredTransition: structs.DesiredTransition{Migrate: pointer.Of(true)},
Job: testJob,
NodeID: "nil",
},
@@ -190,7 +190,7 @@ func TestAllocSet_filterByTainted(t *testing.T) {
"migrating1": {
ID: "migrating1",
ClientStatus: structs.AllocClientStatusRunning,
- DesiredTransition: structs.DesiredTransition{Migrate: helper.BoolToPtr(true)},
+ DesiredTransition: structs.DesiredTransition{Migrate: pointer.Of(true)},
Job: testJob,
NodeID: "draining",
},
@@ -198,7 +198,7 @@ func TestAllocSet_filterByTainted(t *testing.T) {
"migrating2": {
ID: "migrating2",
ClientStatus: structs.AllocClientStatusRunning,
- DesiredTransition: structs.DesiredTransition{Migrate: helper.BoolToPtr(true)},
+ DesiredTransition: structs.DesiredTransition{Migrate: pointer.Of(true)},
Job: testJob,
NodeID: "nil",
},
diff --git a/scheduler/scheduler_sysbatch_test.go b/scheduler/scheduler_sysbatch_test.go
index dcc3d6ea315..fac54369949 100644
--- a/scheduler/scheduler_sysbatch_test.go
+++ b/scheduler/scheduler_sysbatch_test.go
@@ -7,7 +7,7 @@ import (
"github.com/hashicorp/go-memdb"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
@@ -538,7 +538,7 @@ func TestSysBatch_NodeDown(t *testing.T) {
alloc.JobID = job.ID
alloc.NodeID = node.ID
alloc.Name = "my-sysbatch.pinger[0]"
- alloc.DesiredTransition.Migrate = helper.BoolToPtr(true)
+ alloc.DesiredTransition.Migrate = pointer.Of(true)
require.NoError(t, h.State.UpsertAllocs(structs.MsgTypeTestSetup, h.NextIndex(), []*structs.Allocation{alloc}))
// Create a mock evaluation to deal with drain
@@ -652,7 +652,7 @@ func TestSysBatch_NodeDrain(t *testing.T) {
alloc.JobID = job.ID
alloc.NodeID = node.ID
alloc.Name = "my-sysbatch.pinger[0]"
- alloc.DesiredTransition.Migrate = helper.BoolToPtr(true)
+ alloc.DesiredTransition.Migrate = pointer.Of(true)
require.NoError(t, h.State.UpsertAllocs(structs.MsgTypeTestSetup, h.NextIndex(), []*structs.Allocation{alloc}))
// Create a mock evaluation to deal with drain
@@ -1308,7 +1308,7 @@ func TestSysBatch_PlanWithDrainedNode(t *testing.T) {
alloc.JobID = job.ID
alloc.NodeID = node.ID
alloc.Name = "my-sysbatch.pinger[0]"
- alloc.DesiredTransition.Migrate = helper.BoolToPtr(true)
+ alloc.DesiredTransition.Migrate = pointer.Of(true)
alloc.TaskGroup = "pinger"
alloc2 := mock.SysBatchAlloc()
diff --git a/scheduler/scheduler_system_test.go b/scheduler/scheduler_system_test.go
index ce3b5cc5163..bb26d7d695c 100644
--- a/scheduler/scheduler_system_test.go
+++ b/scheduler/scheduler_system_test.go
@@ -9,7 +9,7 @@ import (
memdb "github.com/hashicorp/go-memdb"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
@@ -1016,7 +1016,7 @@ func TestSystemSched_NodeDown(t *testing.T) {
alloc.JobID = job.ID
alloc.NodeID = node.ID
alloc.Name = "my-job.web[0]"
- alloc.DesiredTransition.Migrate = helper.BoolToPtr(true)
+ alloc.DesiredTransition.Migrate = pointer.Of(true)
require.NoError(t, h.State.UpsertAllocs(structs.MsgTypeTestSetup, h.NextIndex(), []*structs.Allocation{alloc}))
// Create a mock evaluation to deal with drain
@@ -1130,7 +1130,7 @@ func TestSystemSched_NodeDrain(t *testing.T) {
alloc.JobID = job.ID
alloc.NodeID = node.ID
alloc.Name = "my-job.web[0]"
- alloc.DesiredTransition.Migrate = helper.BoolToPtr(true)
+ alloc.DesiredTransition.Migrate = pointer.Of(true)
require.NoError(t, h.State.UpsertAllocs(structs.MsgTypeTestSetup, h.NextIndex(), []*structs.Allocation{alloc}))
// Create a mock evaluation to deal with drain
@@ -1731,7 +1731,7 @@ func TestSystemSched_PlanWithDrainedNode(t *testing.T) {
alloc.JobID = job.ID
alloc.NodeID = node.ID
alloc.Name = "my-job.web[0]"
- alloc.DesiredTransition.Migrate = helper.BoolToPtr(true)
+ alloc.DesiredTransition.Migrate = pointer.Of(true)
alloc.TaskGroup = "web"
alloc2 := mock.Alloc()
@@ -2895,7 +2895,7 @@ func TestSystemSched_NodeDisconnected(t *testing.T) {
require.FailNow(t, "invalid jobType")
}
- job.TaskGroups[0].MaxClientDisconnect = helper.TimeToPtr(5 * time.Second)
+ job.TaskGroups[0].MaxClientDisconnect = pointer.Of(5 * time.Second)
if !tc.required {
job.Stop = true
@@ -2914,7 +2914,7 @@ func TestSystemSched_NodeDisconnected(t *testing.T) {
alloc.TaskGroup = job.TaskGroups[0].Name
alloc.ClientStatus = tc.clientStatus
alloc.DesiredStatus = tc.desiredStatus
- alloc.DesiredTransition.Migrate = helper.BoolToPtr(tc.migrate)
+ alloc.DesiredTransition.Migrate = pointer.Of(tc.migrate)
alloc.AllocStates = tc.allocState
alloc.TaskStates = tc.taskState
diff --git a/scheduler/spread_test.go b/scheduler/spread_test.go
index adba6ffa52f..ea581b9a151 100644
--- a/scheduler/spread_test.go
+++ b/scheduler/spread_test.go
@@ -9,7 +9,7 @@ import (
"time"
"github.com/hashicorp/nomad/ci"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs"
@@ -877,7 +877,7 @@ func TestSpreadPanicDowngrade(t *testing.T) {
alloc.JobID = job1.ID
alloc.NodeID = nodes[i].ID
alloc.DeploymentStatus = &structs.AllocDeploymentStatus{
- Healthy: helper.BoolToPtr(true),
+ Healthy: pointer.Of(true),
Timestamp: time.Now(),
Canary: false,
ModifyIndex: h.NextIndex(),
diff --git a/scheduler/util_test.go b/scheduler/util_test.go
index ff7984fb514..4133e9edc18 100644
--- a/scheduler/util_test.go
+++ b/scheduler/util_test.go
@@ -9,7 +9,7 @@ import (
"github.com/hashicorp/nomad/ci"
"github.com/stretchr/testify/require"
- "github.com/hashicorp/nomad/helper"
+ "github.com/hashicorp/nomad/helper/pointer"
"github.com/hashicorp/nomad/helper/testlog"
"github.com/hashicorp/nomad/helper/uuid"
"github.com/hashicorp/nomad/nomad/mock"
@@ -163,7 +163,7 @@ func TestDiffSystemAllocsForNode(t *testing.T) {
Name: "my-job.web[2]",
Job: oldJob,
DesiredTransition: structs.DesiredTransition{
- Migrate: helper.BoolToPtr(true),
+ Migrate: pointer.Of(true),
},
},
// Mark the 4th lost
@@ -340,7 +340,7 @@ func TestDiffSystemAllocs(t *testing.T) {
Name: "my-job.web[0]",
Job: oldJob,
DesiredTransition: structs.DesiredTransition{
- Migrate: helper.BoolToPtr(true),
+ Migrate: pointer.Of(true),
},
},
// Mark as lost on a dead node
@@ -793,8 +793,8 @@ func TestTasksUpdated(t *testing.T) {
j22.TaskGroups[0].Tasks[0].Templates = []*structs.Template{
{
Wait: &structs.WaitConfig{
- Min: helper.TimeToPtr(5 * time.Second),
- Max: helper.TimeToPtr(5 * time.Second),
+ Min: pointer.Of(5 * time.Second),
+ Max: pointer.Of(5 * time.Second),
},
},
}
@@ -802,14 +802,14 @@ func TestTasksUpdated(t *testing.T) {
j23.TaskGroups[0].Tasks[0].Templates = []*structs.Template{
{
Wait: &structs.WaitConfig{
- Min: helper.TimeToPtr(5 * time.Second),
- Max: helper.TimeToPtr(5 * time.Second),
+ Min: pointer.Of(5 * time.Second),
+ Max: pointer.Of(5 * time.Second),
},
},
}
require.False(t, tasksUpdated(j22, j23, name))
// Compare changed Template wait configs
- j23.TaskGroups[0].Tasks[0].Templates[0].Wait.Max = helper.TimeToPtr(10 * time.Second)
+ j23.TaskGroups[0].Tasks[0].Templates[0].Wait.Max = pointer.Of(10 * time.Second)
require.True(t, tasksUpdated(j22, j23, name))
// Add a volume
diff --git a/scripts/release/mac-remote-build b/scripts/release/mac-remote-build
index 5d7689d1a28..3b91ca3aef6 100755
--- a/scripts/release/mac-remote-build
+++ b/scripts/release/mac-remote-build
@@ -56,7 +56,7 @@ REPO_PATH="${TMP_WORKSPACE}/gopath/src/github.com/hashicorp/nomad"
mkdir -p "${TMP_WORKSPACE}/tmp"
install_go() {
- local go_version="1.18.3"
+ local go_version="1.19"
local download=
download="https://storage.googleapis.com/golang/go${go_version}.darwin-amd64.tar.gz"
diff --git a/scripts/vagrant-linux-priv-go.sh b/scripts/vagrant-linux-priv-go.sh
index b953976a3ea..10eb60eebe5 100755
--- a/scripts/vagrant-linux-priv-go.sh
+++ b/scripts/vagrant-linux-priv-go.sh
@@ -3,7 +3,7 @@
set -o errexit
function install_go() {
- local go_version="1.18.3"
+ local go_version="1.19"
local download="https://storage.googleapis.com/golang/go${go_version}.linux-amd64.tar.gz"
if go version 2>&1 | grep -q "${go_version}"; then
diff --git a/tools/go.mod b/tools/go.mod
index dd1d3a7f9a3..31a78edc47b 100644
--- a/tools/go.mod
+++ b/tools/go.mod
@@ -1,6 +1,6 @@
module github.com/hashicorp/nomad/tools
-go 1.17
+go 1.18
require (
github.com/aws/aws-sdk-go v1.37.26
diff --git a/ui/.template-lintrc.js b/ui/.template-lintrc.js
index 28057918d84..d6284a06200 100644
--- a/ui/.template-lintrc.js
+++ b/ui/.template-lintrc.js
@@ -7,6 +7,12 @@ module.exports = {
'no-action': 'off',
'no-invalid-interactive': 'off',
'no-inline-styles': 'off',
- 'no-curly-component-invocation': { allow: ['format-volume-name'] },
+ 'no-curly-component-invocation': {
+ allow: ['format-volume-name', 'keyboard-commands'],
+ },
+ 'no-implicit-this': { allow: ['keyboard-commands'] },
},
+ ignore: [
+ 'app/components/breadcrumbs/*', // using {{(modifier)}} syntax
+ ],
};
diff --git a/ui/app/abilities/job.js b/ui/app/abilities/job.js
index 892837658c7..3dca4dff7a9 100644
--- a/ui/app/abilities/job.js
+++ b/ui/app/abilities/job.js
@@ -31,6 +31,7 @@ export default class Job extends AbstractAbility {
// For each policy record, extract all policies of all namespaces
const allNamespacePolicies = policies
.toArray()
+ .filter((policy) => get(policy, 'rulesJSON.Namespaces'))
.map((policy) => get(policy, 'rulesJSON.Namespaces'))
.flat()
.map((namespace = {}) => {
diff --git a/ui/app/abilities/variable.js b/ui/app/abilities/variable.js
index caa0ae5ecbf..6d392edb9e3 100644
--- a/ui/app/abilities/variable.js
+++ b/ui/app/abilities/variable.js
@@ -1,3 +1,4 @@
+// @ts-check
import { computed, get } from '@ember/object';
import { or } from '@ember/object/computed';
import AbstractAbility from './abstract';
@@ -20,7 +21,7 @@ export default class Variable extends AbstractAbility {
@or(
'bypassAuthorization',
'selfTokenIsManagement',
- 'policiesSupportVariableView'
+ 'policiesSupportVariableList'
)
canList;
@@ -38,19 +39,94 @@ export default class Variable extends AbstractAbility {
)
canDestroy;
- @computed('rulesForNamespace.@each.capabilities')
- get policiesSupportVariableView() {
- return this.rulesForNamespace.some((rules) => {
- return get(rules, 'SecureVariables');
- });
+ @or(
+ 'bypassAuthorization',
+ 'selfTokenIsManagement',
+ 'policiesSupportVariableRead'
+ )
+ canRead;
+
+ @computed('token.selfTokenPolicies')
+ get policiesSupportVariableList() {
+ return this.policyNamespacesIncludeSecureVariablesCapabilities(
+ this.token.selfTokenPolicies,
+ ['list', 'read', 'write', 'destroy']
+ );
}
@computed('path', 'allPaths')
- get policiesSupportVariableWriting() {
+ get policiesSupportVariableRead() {
const matchingPath = this._nearestMatchingPath(this.path);
return this.allPaths
.find((path) => path.name === matchingPath)
- ?.capabilities?.includes('write');
+ ?.capabilities?.includes('read');
+ }
+
+ /**
+ *
+ * Map to your policy's namespaces,
+ * and each of their SecureVariables blocks' paths,
+ * and each of their capabilities.
+ * Then, check to see if any of the permissions you're looking for
+ * are contained within at least one of them.
+ *
+ * @param {Object} policies
+ * @param {string[]} capabilities
+ * @returns {boolean}
+ */
+ policyNamespacesIncludeSecureVariablesCapabilities(
+ policies = [],
+ capabilities = [],
+ path
+ ) {
+ const namespacesWithSecureVariableCapabilities = policies
+ .toArray()
+ .filter((policy) => get(policy, 'rulesJSON.Namespaces'))
+ .map((policy) => get(policy, 'rulesJSON.Namespaces'))
+ .flat()
+ .map((namespace = {}) => {
+ return namespace.SecureVariables?.Paths;
+ })
+ .flat()
+ .compact()
+ .filter((secVarsBlock = {}) => {
+ if (!path || path === WILDCARD_GLOB) {
+ return true;
+ } else {
+ return secVarsBlock.PathSpec === path;
+ }
+ })
+ .map((secVarsBlock = {}) => {
+ return secVarsBlock.Capabilities;
+ })
+ .flat()
+ .compact();
+
+ // Check for requested permissions
+ return namespacesWithSecureVariableCapabilities.some((abilityList) => {
+ return capabilities.includes(abilityList);
+ });
+ }
+
+ @computed('allPaths', 'namespace', 'path', 'token.selfTokenPolicies')
+ get policiesSupportVariableWriting() {
+ if (this.namespace === WILDCARD_GLOB && this.path === WILDCARD_GLOB) {
+ // If you're checking if you can write from root, and you don't specify a namespace,
+ // Then if you can write in ANY path in ANY namespace, you can get to /new.
+ return this.policyNamespacesIncludeSecureVariablesCapabilities(
+ this.token.selfTokenPolicies,
+ ['write'],
+ this._nearestMatchingPath(this.path)
+ );
+ } else {
+ // Checking a specific path in a specific namespace.
+ // TODO: This doesn't cover the case when you're checking for the * namespace at a specific path.
+ // Right now we require you to specify yournamespace to enable the button.
+ const matchingPath = this._nearestMatchingPath(this.path);
+ return this.allPaths
+ .find((path) => path.name === matchingPath)
+ ?.capabilities?.includes('write');
+ }
}
@computed('path', 'allPaths')
@@ -66,9 +142,13 @@ export default class Variable extends AbstractAbility {
return (get(this, 'token.selfTokenPolicies') || [])
.toArray()
.reduce((paths, policy) => {
- const matchingNamespace = this.namespace ?? 'default';
+ const namespaces = get(policy, 'rulesJSON.Namespaces');
+ const matchingNamespace = this._nearestMatchingNamespace(
+ namespaces,
+ this.namespace
+ );
- const variables = (get(policy, 'rulesJSON.Namespaces') || []).find(
+ const variables = (namespaces || []).find(
(namespace) => namespace.Name === matchingNamespace
)?.SecureVariables;
@@ -85,6 +165,12 @@ export default class Variable extends AbstractAbility {
}, []);
}
+ _nearestMatchingNamespace(policyNamespaces, namespace) {
+ if (!namespace || !policyNamespaces) return 'default';
+
+ return this._findMatchingNamespace(policyNamespaces, namespace);
+ }
+
_formatMatchingPathRegEx(path, wildCardPlacement = 'end') {
const replacer = () => '\\/';
if (wildCardPlacement === 'end') {
@@ -110,7 +196,6 @@ export default class Variable extends AbstractAbility {
_nearestMatchingPath(path) {
const pathNames = this.allPaths.map((path) => path.name);
-
if (pathNames.includes(path)) {
return path;
}
diff --git a/ui/app/adapters/allocation.js b/ui/app/adapters/allocation.js
index 20cb6d4f5a5..63477d80c22 100644
--- a/ui/app/adapters/allocation.js
+++ b/ui/app/adapters/allocation.js
@@ -14,6 +14,12 @@ export default class AllocationAdapter extends Watchable {
});
}
+ restartAll(allocation) {
+ const prefix = `${this.host || '/'}${this.urlPrefix()}`;
+ const url = `${prefix}/client/allocation/${allocation.id}/restart`;
+ return this.ajax(url, 'PUT', { data: { AllTasks: true } });
+ }
+
ls(model, path) {
return this.token
.authorizedRequest(
diff --git a/ui/app/adapters/variable.js b/ui/app/adapters/variable.js
index bccceaf45b2..5d57f8c445f 100644
--- a/ui/app/adapters/variable.js
+++ b/ui/app/adapters/variable.js
@@ -1,6 +1,7 @@
import ApplicationAdapter from './application';
import { pluralize } from 'ember-inflector';
import classic from 'ember-classic-decorator';
+import { ConflictError } from '@ember-data/adapter/error';
@classic
export default class VariableAdapter extends ApplicationAdapter {
@@ -8,13 +9,11 @@ export default class VariableAdapter extends ApplicationAdapter {
// PUT instead of POST on create;
// /v1/var instead of /v1/vars on create (urlForFindRecord)
- createRecord(_store, _type, snapshot) {
+ createRecord(_store, type, snapshot) {
let data = this.serialize(snapshot);
- return this.ajax(
- this.urlForFindRecord(snapshot.id, snapshot.modelName),
- 'PUT',
- { data }
- );
+ let baseUrl = this.buildURL(type.modelName, data.ID);
+ const checkAndSetValue = snapshot?.attr('modifyIndex') || 0;
+ return this.ajax(`${baseUrl}?cas=${checkAndSetValue}`, 'PUT', { data });
}
urlForFindAll(modelName) {
@@ -27,21 +26,51 @@ export default class VariableAdapter extends ApplicationAdapter {
return pluralize(baseUrl);
}
- urlForFindRecord(id, modelName, snapshot) {
- const namespace = snapshot?.attr('namespace') || 'default';
-
- let baseUrl = this.buildURL(modelName, id, snapshot);
+ urlForFindRecord(identifier, modelName, snapshot) {
+ const { namespace, id } = _extractIDAndNamespace(identifier, snapshot);
+ let baseUrl = this.buildURL(modelName, id);
return `${baseUrl}?namespace=${namespace}`;
}
- urlForUpdateRecord(id, modelName) {
- return this.buildURL(modelName, id);
+ urlForUpdateRecord(identifier, modelName, snapshot) {
+ const { id } = _extractIDAndNamespace(identifier, snapshot);
+ let baseUrl = this.buildURL(modelName, id);
+ if (snapshot?.adapterOptions?.overwrite) {
+ return `${baseUrl}`;
+ } else {
+ const checkAndSetValue = snapshot?.attr('modifyIndex') || 0;
+ return `${baseUrl}?cas=${checkAndSetValue}`;
+ }
}
- urlForDeleteRecord(id, modelName, snapshot) {
- const namespace = snapshot?.attr('namespace') || 'default';
-
+ urlForDeleteRecord(identifier, modelName, snapshot) {
+ const { namespace, id } = _extractIDAndNamespace(identifier, snapshot);
const baseUrl = this.buildURL(modelName, id);
return `${baseUrl}?namespace=${namespace}`;
}
+
+ handleResponse(status, _, payload) {
+ if (status === 409) {
+ return new ConflictError([
+ { detail: _normalizeConflictErrorObject(payload), status: 409 },
+ ]);
+ }
+ return super.handleResponse(...arguments);
+ }
+}
+
+function _extractIDAndNamespace(identifier, snapshot) {
+ const namespace = snapshot?.attr('namespace') || 'default';
+ const id = snapshot?.attr('path') || identifier;
+ return {
+ namespace,
+ id,
+ };
+}
+
+function _normalizeConflictErrorObject(conflictingVariable) {
+ return {
+ modifyTime: Math.floor(conflictingVariable.ModifyTime / 1000000),
+ items: conflictingVariable.Items,
+ };
}
diff --git a/ui/app/components/allocation-subnav.js b/ui/app/components/allocation-subnav.js
index 594440223ad..09e91502a15 100644
--- a/ui/app/components/allocation-subnav.js
+++ b/ui/app/components/allocation-subnav.js
@@ -8,6 +8,7 @@ import classic from 'ember-classic-decorator';
@tagName('')
export default class AllocationSubnav extends Component {
@service router;
+ @service keyboard;
@equal('router.currentRouteName', 'allocations.allocation.fs')
fsIsActive;
diff --git a/ui/app/components/app-breadcrumbs.js b/ui/app/components/app-breadcrumbs.js
new file mode 100644
index 00000000000..868c81c2438
--- /dev/null
+++ b/ui/app/components/app-breadcrumbs.js
@@ -0,0 +1,7 @@
+import Component from '@glimmer/component';
+
+export default class AppBreadcrumbsComponent extends Component {
+ isOneCrumbUp(iter = 0, totalNum = 0) {
+ return iter === totalNum - 2;
+ }
+}
diff --git a/ui/app/components/breadcrumbs/default.hbs b/ui/app/components/breadcrumbs/default.hbs
index 3117a3b54e2..73e86b6f6e5 100644
--- a/ui/app/components/breadcrumbs/default.hbs
+++ b/ui/app/components/breadcrumbs/default.hbs
@@ -1,9 +1,17 @@
{{! template-lint-disable no-unknown-arguments-for-builtin-components }}
-
+
+ data-test-breadcrumb={{@crumb.args.firstObject}}>
{{#if @crumb.title}}
diff --git a/ui/app/components/breadcrumbs/default.js b/ui/app/components/breadcrumbs/default.js
new file mode 100644
index 00000000000..c8c7464bf5c
--- /dev/null
+++ b/ui/app/components/breadcrumbs/default.js
@@ -0,0 +1,18 @@
+import { action } from '@ember/object';
+import Component from '@glimmer/component';
+import KeyboardShortcutModifier from 'nomad-ui/modifiers/keyboard-shortcut';
+import { inject as service } from '@ember/service';
+
+export default class BreadcrumbsTemplate extends Component {
+ @service router;
+
+ @action
+ traverseUpALevel(args) {
+ const [path, ...rest] = args;
+ this.router.transitionTo(path, ...rest);
+ }
+
+ get maybeKeyboardShortcut() {
+ return this.args.isOneCrumbUp() ? KeyboardShortcutModifier : null;
+ }
+}
diff --git a/ui/app/components/breadcrumbs/job.hbs b/ui/app/components/breadcrumbs/job.hbs
index d3956485f06..cab6d56fa83 100644
--- a/ui/app/components/breadcrumbs/job.hbs
+++ b/ui/app/components/breadcrumbs/job.hbs
@@ -8,7 +8,7 @@
{{/if}}
{{#if trigger.data.isSuccess}}
- {{#if trigger.data.result}}
+ {{#if (and trigger.data.result this.hasParent)}}
{{/if}}
-
+
this.closeSidebar(),
+ },
+ ];
}
diff --git a/ui/app/components/gutter-menu.js b/ui/app/components/gutter-menu.js
index e73f58da351..c84a4d0e466 100644
--- a/ui/app/components/gutter-menu.js
+++ b/ui/app/components/gutter-menu.js
@@ -7,6 +7,7 @@ import classic from 'ember-classic-decorator';
export default class GutterMenu extends Component {
@service system;
@service router;
+ @service keyboard;
@computed('system.namespaces.@each.name')
get sortedNamespaces() {
@@ -37,6 +38,11 @@ export default class GutterMenu extends Component {
onHamburgerClick() {}
+ // Seemingly redundant, but serves to ensure the action is passed to the keyboard service correctly
+ transitionTo(destination) {
+ return this.router.transitionTo(destination);
+ }
+
gotoJobsForNamespace(namespace) {
if (!namespace || !namespace.get('id')) return;
diff --git a/ui/app/components/job-subnav.js b/ui/app/components/job-subnav.js
index 4d80322d86f..3560dab8395 100644
--- a/ui/app/components/job-subnav.js
+++ b/ui/app/components/job-subnav.js
@@ -3,6 +3,7 @@ import Component from '@glimmer/component';
export default class JobSubnav extends Component {
@service can;
+ @service keyboard;
get shouldRenderClientsTab() {
const { job } = this.args;
diff --git a/ui/app/components/keyboard-shortcuts-modal.hbs b/ui/app/components/keyboard-shortcuts-modal.hbs
new file mode 100644
index 00000000000..47c233d04ba
--- /dev/null
+++ b/ui/app/components/keyboard-shortcuts-modal.hbs
@@ -0,0 +1,70 @@
+{{#if this.keyboard.shortcutsVisible}}
+ {{keyboard-commands (array this.escapeCommand)}}
+
+
+
+ {{#each this.commands as |command|}}
+
+ {{command.label}}
+
+ {{#if command.recording}}
+ Recording; ESC to cancel.
+ {{else}}
+ {{#if command.custom}}
+ reset to default
+ {{/if}}
+ {{/if}}
+
+
+ {{#each command.pattern as |key|}}
+ {{clean-keycommand key}}
+ {{/each}}
+
+
+
+ {{/each}}
+
+
+ Keyboard shortcuts {{#if this.keyboard.enabled}}enabled{{else}}disabled{{/if}}
+
+
+
+{{/if}}
+
+{{#if (and this.keyboard.enabled this.keyboard.displayHints)}}
+ {{#each this.hints as |hint|}}
+
+ {{/each}}
+{{/if}}
diff --git a/ui/app/components/keyboard-shortcuts-modal.js b/ui/app/components/keyboard-shortcuts-modal.js
new file mode 100644
index 00000000000..117a8a66872
--- /dev/null
+++ b/ui/app/components/keyboard-shortcuts-modal.js
@@ -0,0 +1,70 @@
+import Component from '@glimmer/component';
+import { inject as service } from '@ember/service';
+import { computed } from '@ember/object';
+import { action } from '@ember/object';
+import Tether from 'tether';
+
+export default class KeyboardShortcutsModalComponent extends Component {
+ @service keyboard;
+ @service config;
+
+ escapeCommand = {
+ label: 'Hide Keyboard Shortcuts',
+ pattern: ['Escape'],
+ action: () => {
+ this.keyboard.shortcutsVisible = false;
+ },
+ };
+
+ /**
+ * commands: filter keyCommands to those that have an action and a label,
+ * to distinguish between those that are just visual hints of existing commands
+ */
+ @computed('keyboard.keyCommands.[]')
+ get commands() {
+ return this.keyboard.keyCommands.reduce((memo, c) => {
+ if (c.label && c.action && !memo.find((m) => m.label === c.label)) {
+ memo.push(c);
+ }
+ return memo;
+ }, []);
+ }
+
+ /**
+ * hints: filter keyCommands to those that have an element property,
+ * and then compute a position on screen to place the hint.
+ */
+ @computed('keyboard.{keyCommands.length,displayHints}')
+ get hints() {
+ if (this.keyboard.displayHints) {
+ return this.keyboard.keyCommands.filter((c) => c.element);
+ } else {
+ return [];
+ }
+ }
+
+ @action
+ tetherToElement(element, hint, self) {
+ if (!this.config.isTest) {
+ let binder = new Tether({
+ element: self,
+ target: element,
+ attachment: 'top left',
+ targetAttachment: 'top left',
+ targetModifier: 'visible',
+ });
+ hint.binder = binder;
+ }
+ }
+
+ @action
+ untetherFromElement(hint) {
+ if (!this.config.isTest) {
+ hint.binder.destroy();
+ }
+ }
+
+ @action toggleListener() {
+ this.keyboard.enabled = !this.keyboard.enabled;
+ }
+}
diff --git a/ui/app/components/lifecycle-chart-row.js b/ui/app/components/lifecycle-chart-row.js
index 25203683b32..8da916203ec 100644
--- a/ui/app/components/lifecycle-chart-row.js
+++ b/ui/app/components/lifecycle-chart-row.js
@@ -15,9 +15,9 @@ export default class LifecycleChartRow extends Component {
return undefined;
}
- @computed('taskState.finishedAt')
+ @computed('taskState.state')
get finishedClass() {
- if (this.taskState && this.taskState.finishedAt) {
+ if (this.taskState && this.taskState.state === 'dead') {
return 'is-finished';
}
diff --git a/ui/app/components/plugin-subnav.js b/ui/app/components/plugin-subnav.js
new file mode 100644
index 00000000000..1333547a77e
--- /dev/null
+++ b/ui/app/components/plugin-subnav.js
@@ -0,0 +1,6 @@
+import Component from '@glimmer/component';
+import { inject as service } from '@ember/service';
+
+export default class PluginSubnavComponent extends Component {
+ @service keyboard;
+}
diff --git a/ui/app/components/safe-link-to.js b/ui/app/components/safe-link-to.js
new file mode 100644
index 00000000000..d4dfc4a7451
--- /dev/null
+++ b/ui/app/components/safe-link-to.js
@@ -0,0 +1,9 @@
+import { LinkComponent } from '@ember/legacy-built-in-components';
+import classic from 'ember-classic-decorator';
+
+// Necessary for programmatic routing away pages with
s that contain @query properties.
+// (There's an issue with query param calculations in the new component that uses the router service)
+// https://github.com/emberjs/ember.js/issues/20051
+
+@classic
+export default class SafeLinkToComponent extends LinkComponent {}
diff --git a/ui/app/components/secure-variable-form.hbs b/ui/app/components/secure-variable-form.hbs
index 510e530e332..e50e9fe738e 100644
--- a/ui/app/components/secure-variable-form.hbs
+++ b/ui/app/components/secure-variable-form.hbs
@@ -9,6 +9,27 @@
{{/if}}
+ {{#if this.hasConflict}}
+
+
Heads up! Your Secure Variable has a conflict.
+
This might be because someone else tried saving in the time since you've had it open.
+ {{#if this.conflictingVariable.modifyTime}}
+
+ {{moment-from-now this.conflictingVariable.modifyTime}}
+
+ {{/if}}
+ {{#if this.conflictingVariable.items}}
+
{{stringify-object this.conflictingVariable.items whitespace=2}}
+ {{else}}
+
Your ACL token limits your ability to see further details about the conflicting variable.
+ {{/if}}
+
+ Refresh your browser
+ Overwrite anyway
+
+
+ {{/if}}
+
@@ -16,18 +37,17 @@
{{#if this.duplicatePathWarning}}
There is already a Secure Variable located at
- {{@model.path}}
+ {{this.path}}
.
Please choose a different path, or
@@ -122,7 +142,7 @@
@job={{@model.pathLinkedEntities.job}}
@group={{@model.pathLinkedEntities.group}}
@task={{@model.pathLinkedEntities.task}}
- @namespace={{@model.namespace}}
+ @namespace={{this.variableNamespace}}
/>
{{/if}}
diff --git a/ui/app/components/secure-variable-form.js b/ui/app/components/secure-variable-form.js
index 379302670f4..95081f8a47d 100644
--- a/ui/app/components/secure-variable-form.js
+++ b/ui/app/components/secure-variable-form.js
@@ -11,6 +11,7 @@ import EmberObject, { set } from '@ember/object';
import MutableArray from '@ember/array/mutable';
import { A } from '@ember/array';
import { stringifyObject } from 'nomad-ui/helpers/stringify-object';
+import notifyConflict from 'nomad-ui/utils/notify-conflict';
const EMPTY_KV = {
key: '',
@@ -23,17 +24,26 @@ export default class SecureVariableFormComponent extends Component {
@service router;
@service store;
+ @tracked variableNamespace = null;
+ @tracked namespaceOptions = null;
+ @tracked hasConflict = false;
+
/**
- * @typedef {Object} DuplicatePathWarning
- * @property {string} path
+ * @typedef {Object} conflictingVariable
+ * @property {string} ModifyTime
+ * @property {Object} Items
*/
/**
- * @type {DuplicatePathWarning}
+ * @type {conflictingVariable}
*/
- @tracked duplicatePathWarning = null;
- @tracked variableNamespace = null;
- @tracked namespaceOptions = null;
+ @tracked conflictingVariable = null;
+
+ @tracked path = '';
+ constructor() {
+ super(...arguments);
+ set(this, 'path', this.args.model.path);
+ }
@action
setNamespace(namespace) {
@@ -46,15 +56,14 @@ export default class SecureVariableFormComponent extends Component {
// Set first namespace option
if (options.length) {
- this.variableNamespace = options[0].key;
+ this.variableNamespace = this.args.model.namespace;
}
}
get shouldDisableSave() {
const disallowedPath =
- this.args.model?.path?.startsWith('nomad/') &&
- !this.args.model?.path?.startsWith('nomad/jobs');
- return !!this.JSONError || !this.args.model?.path || disallowedPath;
+ this.path?.startsWith('nomad/') && !this.path?.startsWith('nomad/jobs');
+ return !!this.JSONError || !this.path || disallowedPath;
}
/**
@@ -94,19 +103,28 @@ export default class SecureVariableFormComponent extends Component {
]);
}
- @action
- validatePath(e) {
- const value = trimPath([e.target.value]);
+ /**
+ * @typedef {Object} DuplicatePathWarning
+ * @property {string} path
+ */
+
+ /**
+ * @type {DuplicatePathWarning}
+ */
+ get duplicatePathWarning() {
const existingVariables = this.args.existingVariables || [];
+ const pathValue = trimPath([this.path]);
let existingVariable = existingVariables
.without(this.args.model)
- .find((v) => v.path === value);
+ .find(
+ (v) => v.path === pathValue && v.namespace === this.variableNamespace
+ );
if (existingVariable) {
- this.duplicatePathWarning = {
+ return {
path: existingVariable.path,
};
} else {
- this.duplicatePathWarning = null;
+ return null;
}
}
@@ -139,12 +157,21 @@ export default class SecureVariableFormComponent extends Component {
this.keyValues.removeObject(row);
}
+ @action refresh() {
+ window.location.reload();
+ }
+
+ @action saveWithOverwrite(e) {
+ set(this, 'conflictingVariable', null);
+ this.save(e, true);
+ }
+
@action
- async save(e) {
+ async save(e, overwrite = false) {
if (e.type === 'submit') {
e.preventDefault();
}
- // TODO: temp, hacky way to force translation to tabular keyValues
+
if (this.view === 'json') {
this.translateAndValidateItems('table');
}
@@ -168,25 +195,34 @@ export default class SecureVariableFormComponent extends Component {
}
this.args.model.set('keyValues', this.keyValues);
+ this.args.model.set('path', this.path);
this.args.model.setAndTrimPath();
- await this.args.model.save();
+ await this.args.model.save({ adapterOptions: { overwrite } });
this.flashMessages.add({
title: 'Secure Variable saved',
- message: `${this.args.model.path} successfully saved`,
+ message: `${this.path} successfully saved`,
type: 'success',
destroyOnClick: false,
timeout: 5000,
});
- this.router.transitionTo('variables.variable', this.args.model.path);
+ this.router.transitionTo('variables.variable', this.args.model.id);
} catch (error) {
- this.flashMessages.add({
- title: `Error saving ${this.args.model.path}`,
- message: error,
- type: 'error',
- destroyOnClick: false,
- sticky: true,
- });
+ notifyConflict(this)(error);
+ if (!this.hasConflict) {
+ this.flashMessages.add({
+ title: `Error saving ${this.path}`,
+ message: error,
+ type: 'error',
+ destroyOnClick: false,
+ sticky: true,
+ });
+ } else {
+ if (error.errors[0]?.detail) {
+ set(this, 'conflictingVariable', error.errors[0].detail);
+ }
+ window.scrollTo(0, 0); // because the k/v list may be long, ensure the user is snapped to top to read error
+ }
}
}
diff --git a/ui/app/components/server-agent-row.js b/ui/app/components/server-agent-row.js
index e0cc0ede2a7..8c2b2c2825e 100644
--- a/ui/app/components/server-agent-row.js
+++ b/ui/app/components/server-agent-row.js
@@ -41,9 +41,13 @@ export default class ServerAgentRow extends Component {
return currentURL.replace(/%40/g, '@') === targetURL.replace(/%40/g, '@');
}
- click() {
+ goToAgent() {
const transition = () =>
this.router.transitionTo('servers.server', this.agent);
lazyClick([transition, event]);
}
+
+ click() {
+ this.goToAgent();
+ }
}
diff --git a/ui/app/components/server-subnav.js b/ui/app/components/server-subnav.js
index 3a4002f173f..88e893a9292 100644
--- a/ui/app/components/server-subnav.js
+++ b/ui/app/components/server-subnav.js
@@ -1,5 +1,8 @@
import Component from '@ember/component';
import { tagName } from '@ember-decorators/component';
+import { inject as service } from '@ember/service';
@tagName('')
-export default class ServerSubnav extends Component {}
+export default class ServerSubnav extends Component {
+ @service keyboard;
+}
diff --git a/ui/app/components/storage-subnav.js b/ui/app/components/storage-subnav.js
new file mode 100644
index 00000000000..a43db30e2a3
--- /dev/null
+++ b/ui/app/components/storage-subnav.js
@@ -0,0 +1,6 @@
+import Component from '@glimmer/component';
+import { inject as service } from '@ember/service';
+
+export default class StorageSubnavComponent extends Component {
+ @service keyboard;
+}
diff --git a/ui/app/components/task-subnav.js b/ui/app/components/task-subnav.js
index 702b19caa4f..b77ad6b2ddc 100644
--- a/ui/app/components/task-subnav.js
+++ b/ui/app/components/task-subnav.js
@@ -8,6 +8,7 @@ import classic from 'ember-classic-decorator';
@tagName('')
export default class TaskSubnav extends Component {
@service router;
+ @service keyboard;
@equal('router.currentRouteName', 'allocations.allocation.task.fs')
fsIsActive;
diff --git a/ui/app/components/variable-paths.hbs b/ui/app/components/variable-paths.hbs
index 5341971ea59..2d96754d946 100644
--- a/ui/app/components/variable-paths.hbs
+++ b/ui/app/components/variable-paths.hbs
@@ -13,7 +13,12 @@
{{#each this.folders as |folder|}}
-
+
@@ -25,16 +30,28 @@
{{/each}}
{{#each this.files as |file|}}
-
+
+ {{#if (can "read variable" path=file.absoluteFilePath namespace=file.variable.namespace)}}
{{file.name}}
+ {{else}}
+ {{file.name}}
+ {{/if}}
{{file.variable.namespace}}
diff --git a/ui/app/components/variable-paths.js b/ui/app/components/variable-paths.js
index 60a7414414c..5252dfecee6 100644
--- a/ui/app/components/variable-paths.js
+++ b/ui/app/components/variable-paths.js
@@ -5,6 +5,7 @@ import { inject as service } from '@ember/service';
import compactPath from '../utils/compact-path';
export default class VariablePathsComponent extends Component {
@service router;
+ @service can;
/**
* @returns {Array>}
@@ -25,7 +26,9 @@ export default class VariablePathsComponent extends Component {
}
@action
- async handleFileClick(path) {
- this.router.transitionTo('variables.variable', path);
+ async handleFileClick({ path, variable: { id, namespace } }) {
+ if (this.can.can('read variable', null, { path, namespace })) {
+ this.router.transitionTo('variables.variable', id);
+ }
}
}
diff --git a/ui/app/controllers/allocations/allocation/index.js b/ui/app/controllers/allocations/allocation/index.js
index 701efaf74f7..85bc72e12e6 100644
--- a/ui/app/controllers/allocations/allocation/index.js
+++ b/ui/app/controllers/allocations/allocation/index.js
@@ -11,6 +11,7 @@ import { lazyClick } from 'nomad-ui/helpers/lazy-click';
import { watchRecord } from 'nomad-ui/utils/properties/watch';
import messageForError from 'nomad-ui/utils/message-from-adapter-error';
import classic from 'ember-classic-decorator';
+import { union } from '@ember/object/computed';
@classic
export default class IndexController extends Controller.extend(Sortable) {
@@ -46,11 +47,26 @@ export default class IndexController extends Controller.extend(Sortable) {
return (this.get('model.allocatedResources.ports') || []).sortBy('label');
}
+ @computed('model.states.@each.task')
+ get tasks() {
+ return this.get('model.states').mapBy('task') || [];
+ }
+
+ @computed('tasks.@each.services')
+ get taskServices() {
+ return this.get('tasks')
+ .map((t) => ((t && t.get('services')) || []).toArray())
+ .flat()
+ .compact();
+ }
+
@computed('model.taskGroup.services.@each.name')
- get services() {
+ get groupServices() {
return (this.get('model.taskGroup.services') || []).sortBy('name');
}
+ @union('taskServices', 'groupServices') services;
+
onDismiss() {
this.set('error', null);
}
@@ -93,6 +109,19 @@ export default class IndexController extends Controller.extend(Sortable) {
})
restartAllocation;
+ @task(function* () {
+ try {
+ yield this.model.restartAll();
+ } catch (err) {
+ this.set('error', {
+ title: 'Could Not Restart All Tasks',
+ description: messageForError(err, 'manage allocation lifecycle'),
+ });
+ console.error(err);
+ }
+ })
+ restartAll;
+
@action
gotoTask(allocation, task) {
this.transitionToRoute('allocations.allocation.task', task);
diff --git a/ui/app/controllers/application.js b/ui/app/controllers/application.js
index e4ac82c7ce7..4781831fad6 100644
--- a/ui/app/controllers/application.js
+++ b/ui/app/controllers/application.js
@@ -9,7 +9,8 @@ import codesForError from '../utils/codes-for-error';
import NoLeaderError from '../utils/no-leader-error';
import OTTExchangeError from '../utils/ott-exchange-error';
import classic from 'ember-classic-decorator';
-
+// eslint-disable-next-line no-unused-vars
+import KeyboardService from '../services/keyboard';
@classic
export default class ApplicationController extends Controller {
@service config;
@@ -17,6 +18,17 @@ export default class ApplicationController extends Controller {
@service token;
@service flashMessages;
+ /**
+ * @type {KeyboardService}
+ */
+ @service keyboard;
+
+ // eslint-disable-next-line ember/classic-decorator-hooks
+ constructor() {
+ super(...arguments);
+ this.keyboard.listenForKeypress();
+ }
+
queryParams = [
{
region: 'region',
diff --git a/ui/app/controllers/csi/volumes/index.js b/ui/app/controllers/csi/volumes/index.js
index 7adee636fd8..74ad3d6cc2a 100644
--- a/ui/app/controllers/csi/volumes/index.js
+++ b/ui/app/controllers/csi/volumes/index.js
@@ -22,6 +22,7 @@ export default class IndexController extends Controller.extend(
) {
@service system;
@service userSettings;
+ @service keyboard;
@controller('csi/volumes') volumesController;
@alias('volumesController.isForbidden')
diff --git a/ui/app/controllers/evaluations/index.js b/ui/app/controllers/evaluations/index.js
index cb13f3a4945..9438394dad9 100644
--- a/ui/app/controllers/evaluations/index.js
+++ b/ui/app/controllers/evaluations/index.js
@@ -65,7 +65,9 @@ export default class EvaluationsController extends Controller {
async handleEvaluationClick(evaluation, e) {
if (
e instanceof MouseEvent ||
- (e instanceof KeyboardEvent && (e.code === 'Enter' || e.code === 'Space'))
+ (e instanceof KeyboardEvent &&
+ (e.code === 'Enter' || e.code === 'Space')) ||
+ !e
) {
this.statechart.send('LOAD_EVALUATION', { evaluation });
}
diff --git a/ui/app/controllers/variables/path.js b/ui/app/controllers/variables/path.js
index 5b36c7fa96a..8e312cbdb52 100644
--- a/ui/app/controllers/variables/path.js
+++ b/ui/app/controllers/variables/path.js
@@ -4,16 +4,23 @@ import { action } from '@ember/object';
const ALL_NAMESPACE_WILDCARD = '*';
export default class VariablesPathController extends Controller {
+ get absolutePath() {
+ return this.model?.absolutePath || '';
+ }
get breadcrumbs() {
- let crumbs = [];
- this.model.absolutePath.split('/').reduce((m, n) => {
- crumbs.push({
- label: n,
- args: [`variables.path`, m + n],
- });
- return m + n + '/';
- }, []);
- return crumbs;
+ if (this.absolutePath) {
+ let crumbs = [];
+ this.absolutePath.split('/').reduce((m, n) => {
+ crumbs.push({
+ label: n,
+ args: [`variables.path`, m + n],
+ });
+ return m + n + '/';
+ }, []);
+ return crumbs;
+ } else {
+ return [];
+ }
}
@controller variables;
diff --git a/ui/app/controllers/variables/variable.js b/ui/app/controllers/variables/variable.js
index 3fd68ad8f9f..c9dbd23661e 100644
--- a/ui/app/controllers/variables/variable.js
+++ b/ui/app/controllers/variables/variable.js
@@ -3,12 +3,14 @@ import Controller from '@ember/controller';
export default class VariablesVariableController extends Controller {
get breadcrumbs() {
let crumbs = [];
- this.model.path.split('/').reduce((m, n) => {
+ let id = decodeURI(this.params.id.split('@').slice(0, -1).join('@')); // remove namespace
+ let namespace = this.params.id.split('@').slice(-1)[0];
+ id.split('/').reduce((m, n) => {
crumbs.push({
label: n,
args:
- m + n === this.model.path // If the last crumb, link to the var itself
- ? [`variables.variable`, m + n]
+ m + n === id // If the last crumb, link to the var itself
+ ? [`variables.variable`, `${m + n}@${namespace}`]
: [`variables.path`, m + n],
});
return m + n + '/';
diff --git a/ui/app/controllers/variables/variable/index.js b/ui/app/controllers/variables/variable/index.js
index 0cfbfa86ed1..1cdba275d54 100644
--- a/ui/app/controllers/variables/variable/index.js
+++ b/ui/app/controllers/variables/variable/index.js
@@ -1,7 +1,6 @@
import Controller from '@ember/controller';
import { set, action } from '@ember/object';
import { task } from 'ember-concurrency';
-import messageForError from '../../../utils/message-from-adapter-error';
import { inject as service } from '@ember/service';
import { tracked } from '@glimmer/tracking';
@@ -19,9 +18,6 @@ export default class VariablesVariableIndexController extends Controller {
return this.sortDescending ? sorted : sorted.reverse();
}
- @tracked
- error = null;
-
@tracked isDeleting = false;
@action
@@ -43,20 +39,25 @@ export default class VariablesVariableIndexController extends Controller {
} else {
this.router.transitionTo('variables');
}
- // TODO: alert the user that the variable was successfully deleted
+ this.flashMessages.add({
+ title: 'Secure Variable deleted',
+ message: `${this.model.path} successfully deleted`,
+ type: 'success',
+ destroyOnClick: false,
+ timeout: 5000,
+ });
} catch (err) {
- this.error = {
- title: 'Could Not Delete Variable',
- description: messageForError(err, 'delete secure variables'),
- };
+ this.flashMessages.add({
+ title: `Error deleting ${this.model.path}`,
+ message: err,
+ type: 'error',
+ destroyOnClick: false,
+ sticky: true,
+ });
}
})
deleteVariableFile;
- onDismissError() {
- this.error = null;
- }
-
//#region Code View
/**
* @type {"table" | "json"}
diff --git a/ui/app/helpers/clean-keycommand.js b/ui/app/helpers/clean-keycommand.js
new file mode 100644
index 00000000000..1aeead05c9b
--- /dev/null
+++ b/ui/app/helpers/clean-keycommand.js
@@ -0,0 +1,18 @@
+// @ts-check
+import { helper } from '@ember/component/helper';
+
+const KEY_ALIAS_MAP = {
+ ArrowRight: '→',
+ ArrowLeft: '←',
+ ArrowUp: '↑',
+ ArrowDown: '↓',
+ '+': ' + ',
+};
+
+export default helper(function cleanKeycommand([key] /*, named*/) {
+ let cleaned = key;
+ Object.keys(KEY_ALIAS_MAP).forEach((k) => {
+ cleaned = cleaned.replace(k, KEY_ALIAS_MAP[k]);
+ });
+ return cleaned;
+});
diff --git a/ui/app/helpers/keyboard-commands.js b/ui/app/helpers/keyboard-commands.js
new file mode 100644
index 00000000000..f03fd4b92e7
--- /dev/null
+++ b/ui/app/helpers/keyboard-commands.js
@@ -0,0 +1,26 @@
+import Helper from '@ember/component/helper';
+import { inject as service } from '@ember/service';
+
+/**
+ `{{keyboard-commands}}` helper used to initialize and tear down contextual keynav commands
+ @public
+ @method keyboard-commands
+ */
+export default class keyboardCommands extends Helper {
+ @service keyboard;
+
+ constructor() {
+ super(...arguments);
+ }
+
+ compute([commands]) {
+ if (commands) {
+ this.commands = commands;
+ this.keyboard.addCommands(commands);
+ }
+ }
+ willDestroy() {
+ super.willDestroy();
+ this.keyboard.removeCommands(this.commands);
+ }
+}
diff --git a/ui/app/helpers/lazy-click.js b/ui/app/helpers/lazy-click.js
index 4260cca805d..b1905022fba 100644
--- a/ui/app/helpers/lazy-click.js
+++ b/ui/app/helpers/lazy-click.js
@@ -9,7 +9,7 @@ import Helper from '@ember/component/helper';
* that should be handled instead.
*/
export function lazyClick([onClick, event]) {
- if (!['a', 'button'].includes(event.target.tagName.toLowerCase())) {
+ if (!['a', 'button'].includes(event?.target.tagName.toLowerCase())) {
onClick(event);
}
}
diff --git a/ui/app/helpers/trim-path.js b/ui/app/helpers/trim-path.js
index c9eb495c90f..3b18cdfeb0b 100644
--- a/ui/app/helpers/trim-path.js
+++ b/ui/app/helpers/trim-path.js
@@ -6,11 +6,12 @@ import Helper from '@ember/component/helper';
* @param {Array} params
* @returns {string}
*/
-export function trimPath([path = '']) {
+export function trimPath([path]) {
+ if (!path) return;
if (path.startsWith('/')) {
path = trimPath([path.slice(1)]);
}
- if (path.endsWith('/')) {
+ if (path?.endsWith('/')) {
path = trimPath([path.slice(0, -1)]);
}
return path;
diff --git a/ui/app/models/allocation.js b/ui/app/models/allocation.js
index 777ab40b519..6c66dd46e11 100644
--- a/ui/app/models/allocation.js
+++ b/ui/app/models/allocation.js
@@ -157,6 +157,10 @@ export default class Allocation extends Model {
return this.store.adapterFor('allocation').restart(this, taskName);
}
+ restartAll() {
+ return this.store.adapterFor('allocation').restartAll(this);
+ }
+
ls(path) {
return this.store.adapterFor('allocation').ls(this, path);
}
diff --git a/ui/app/models/task-state.js b/ui/app/models/task-state.js
index 0f80cdc3041..6a16fc85317 100644
--- a/ui/app/models/task-state.js
+++ b/ui/app/models/task-state.js
@@ -1,5 +1,5 @@
import { computed } from '@ember/object';
-import { alias, none, and } from '@ember/object/computed';
+import { alias, and } from '@ember/object/computed';
import Fragment from 'ember-data-model-fragments/fragment';
import { attr } from '@ember-data/model';
import {
@@ -19,7 +19,6 @@ export default class TaskState extends Fragment {
@attr('date') finishedAt;
@attr('boolean') failed;
- @none('finishedAt') isActive;
@and('isActive', 'allocation.isRunning') isRunning;
@computed('task.kind')
@@ -58,6 +57,11 @@ export default class TaskState extends Fragment {
return classMap[this.state] || 'is-dark';
}
+ @computed('state')
+ get isActive() {
+ return this.state === 'running';
+ }
+
restart() {
return this.allocation.restart(this.name);
}
diff --git a/ui/app/models/task.js b/ui/app/models/task.js
index 516f9fc73d7..e84603b7aea 100644
--- a/ui/app/models/task.js
+++ b/ui/app/models/task.js
@@ -48,6 +48,7 @@ export default class Task extends Fragment {
@attr('number') reservedCPU;
@attr('number') reservedDisk;
@attr('number') reservedEphemeralDisk;
+ @fragmentArray('service') services;
@fragmentArray('volume-mount', { defaultValue: () => [] }) volumeMounts;
diff --git a/ui/app/models/variable.js b/ui/app/models/variable.js
index 1e808f90093..9d68a51829f 100644
--- a/ui/app/models/variable.js
+++ b/ui/app/models/variable.js
@@ -67,7 +67,9 @@ export default class VariableModel extends Model {
*/
setAndTrimPath() {
this.set('path', trimPath([this.path]));
- this.set('id', this.get('path'));
+ if (!this.get('id')) {
+ this.set('id', `${this.get('path')}@${this.get('namespace')}`);
+ }
}
/**
diff --git a/ui/app/modifiers/keyboard-shortcut.js b/ui/app/modifiers/keyboard-shortcut.js
new file mode 100644
index 00000000000..0a75255d8e8
--- /dev/null
+++ b/ui/app/modifiers/keyboard-shortcut.js
@@ -0,0 +1,38 @@
+import { inject as service } from '@ember/service';
+import Modifier from 'ember-modifier';
+import { registerDestructor } from '@ember/destroyable';
+
+export default class KeyboardShortcutModifier extends Modifier {
+ @service keyboard;
+ @service router;
+
+ modify(
+ element,
+ _positional,
+ {
+ label,
+ pattern = '',
+ action = () => {},
+ menuLevel = false,
+ enumerated = false,
+ exclusive = false,
+ }
+ ) {
+ let commands = [
+ {
+ label,
+ action,
+ pattern,
+ element,
+ menuLevel,
+ enumerated,
+ exclusive,
+ },
+ ];
+
+ this.keyboard.addCommands(commands);
+ registerDestructor(this, () => {
+ this.keyboard.removeCommands(commands);
+ });
+ }
+}
diff --git a/ui/app/router.js b/ui/app/router.js
index ba7cfc5d552..dbedd67dbea 100644
--- a/ui/app/router.js
+++ b/ui/app/router.js
@@ -84,7 +84,7 @@ Router.map(function () {
this.route(
'variable',
{
- path: '/var/*path',
+ path: '/var/*id',
},
function () {
this.route('edit');
diff --git a/ui/app/routes/variables.js b/ui/app/routes/variables.js
index a1ca65917a7..7024300211a 100644
--- a/ui/app/routes/variables.js
+++ b/ui/app/routes/variables.js
@@ -1,7 +1,7 @@
import Route from '@ember/routing/route';
import { inject as service } from '@ember/service';
import WithForbiddenState from 'nomad-ui/mixins/with-forbidden-state';
-import notifyError from 'nomad-ui/utils/notify-error';
+import notifyForbidden from 'nomad-ui/utils/notify-forbidden';
import PathTree from 'nomad-ui/utils/path-tree';
export default class VariablesRoute extends Route.extend(WithForbiddenState) {
@@ -30,13 +30,13 @@ export default class VariablesRoute extends Route.extend(WithForbiddenState) {
{ namespace },
{ reload: true }
);
-
return {
variables,
pathTree: new PathTree(variables),
};
} catch (e) {
- notifyError(this)(e);
+ notifyForbidden(this)(e);
+ return e;
}
}
}
diff --git a/ui/app/routes/variables/index.js b/ui/app/routes/variables/index.js
index 4eac11a8b77..81ddea51e66 100644
--- a/ui/app/routes/variables/index.js
+++ b/ui/app/routes/variables/index.js
@@ -1,11 +1,19 @@
import Route from '@ember/routing/route';
+import WithForbiddenState from 'nomad-ui/mixins/with-forbidden-state';
+import notifyForbidden from 'nomad-ui/utils/notify-forbidden';
-export default class VariablesIndexRoute extends Route {
+export default class VariablesIndexRoute extends Route.extend(
+ WithForbiddenState
+) {
model() {
- const { variables, pathTree } = this.modelFor('variables');
- return {
- variables,
- root: pathTree.paths.root,
- };
+ if (this.modelFor('variables').errors) {
+ notifyForbidden(this)(this.modelFor('variables'));
+ } else {
+ const { variables, pathTree } = this.modelFor('variables');
+ return {
+ variables,
+ root: pathTree.paths.root,
+ };
+ }
}
}
diff --git a/ui/app/routes/variables/new.js b/ui/app/routes/variables/new.js
index e8415f80262..dd8bac3b386 100644
--- a/ui/app/routes/variables/new.js
+++ b/ui/app/routes/variables/new.js
@@ -1,8 +1,12 @@
import Route from '@ember/routing/route';
export default class VariablesNewRoute extends Route {
- model(params) {
- return this.store.createRecord('variable', { path: params.path });
+ async model(params) {
+ const namespaces = await this.store.peekAll('namespace');
+ return this.store.createRecord('variable', {
+ path: params.path,
+ namespace: namespaces.objectAt(0)?.id,
+ });
}
resetController(controller, isExiting) {
// If the user navigates away from /new, clear the path
diff --git a/ui/app/routes/variables/path.js b/ui/app/routes/variables/path.js
index 97a99386b2f..220bd275419 100644
--- a/ui/app/routes/variables/path.js
+++ b/ui/app/routes/variables/path.js
@@ -1,12 +1,20 @@
import Route from '@ember/routing/route';
-export default class VariablesPathRoute extends Route {
+import WithForbiddenState from 'nomad-ui/mixins/with-forbidden-state';
+import notifyForbidden from 'nomad-ui/utils/notify-forbidden';
+export default class VariablesPathRoute extends Route.extend(
+ WithForbiddenState
+) {
model({ absolutePath }) {
- const treeAtPath =
- this.modelFor('variables').pathTree.findPath(absolutePath);
- if (treeAtPath) {
- return { treeAtPath, absolutePath };
+ if (this.modelFor('variables').errors) {
+ notifyForbidden(this)(this.modelFor('variables'));
} else {
- return { absolutePath };
+ const treeAtPath =
+ this.modelFor('variables').pathTree.findPath(absolutePath);
+ if (treeAtPath) {
+ return { treeAtPath, absolutePath };
+ } else {
+ return { absolutePath };
+ }
}
}
}
diff --git a/ui/app/routes/variables/variable.js b/ui/app/routes/variables/variable.js
index 6150b2dddbb..c49f520d8c6 100644
--- a/ui/app/routes/variables/variable.js
+++ b/ui/app/routes/variables/variable.js
@@ -1,16 +1,21 @@
import Route from '@ember/routing/route';
import withForbiddenState from 'nomad-ui/mixins/with-forbidden-state';
-import WithModelErrorHandling from 'nomad-ui/mixins/with-model-error-handling';
import { inject as service } from '@ember/service';
+import notifyForbidden from 'nomad-ui/utils/notify-forbidden';
export default class VariablesVariableRoute extends Route.extend(
- withForbiddenState,
- WithModelErrorHandling
+ withForbiddenState
) {
@service store;
model(params) {
- return this.store.findRecord('variable', decodeURIComponent(params.path), {
- reload: true,
- });
+ return this.store
+ .findRecord('variable', decodeURIComponent(params.id), {
+ reload: true,
+ })
+ .catch(notifyForbidden(this));
+ }
+ setupController(controller) {
+ super.setupController(controller);
+ controller.set('params', this.paramsFor('variables.variable'));
}
}
diff --git a/ui/app/serializers/job.js b/ui/app/serializers/job.js
index 34a6400c858..a21f8f8ebe0 100644
--- a/ui/app/serializers/job.js
+++ b/ui/app/serializers/job.js
@@ -104,7 +104,8 @@ export default class JobSerializer extends ApplicationSerializer {
variables: {
links: {
related: buildURL(`/${apiNamespace}/vars`, {
- prefix: `jobs/${variableLookup}`,
+ prefix: `nomad/jobs/${variableLookup}`,
+ namespace,
}),
},
},
diff --git a/ui/app/serializers/variable.js b/ui/app/serializers/variable.js
index b021510f8b9..142ac660ea6 100644
--- a/ui/app/serializers/variable.js
+++ b/ui/app/serializers/variable.js
@@ -3,12 +3,16 @@ import ApplicationSerializer from './application';
@classic
export default class VariableSerializer extends ApplicationSerializer {
- primaryKey = 'Path';
separateNanos = ['CreateTime', 'ModifyTime'];
+ normalize(typeHash, hash) {
+ // ID is a composite of both the job ID and the namespace the job is in
+ hash.ID = `${hash.Path}@${hash.Namespace || 'default'}`;
+ return super.normalize(typeHash, hash);
+ }
+
// Transform API's Items object into an array of a KeyValue objects
normalizeFindRecordResponse(store, typeClass, hash, id, ...args) {
- // TODO: prevent items-less saving at API layer
if (!hash.Items) {
hash.Items = { '': '' };
}
@@ -31,6 +35,7 @@ export default class VariableSerializer extends ApplicationSerializer {
// Transform our KeyValues array into an Items object
serialize(snapshot, options) {
const json = super.serialize(snapshot, options);
+ json.ID = json.Path;
json.Items = json.KeyValues.reduce((acc, { key, value }) => {
acc[key] = value;
return acc;
diff --git a/ui/app/services/keyboard.js b/ui/app/services/keyboard.js
new file mode 100644
index 00000000000..78a6cc5aff9
--- /dev/null
+++ b/ui/app/services/keyboard.js
@@ -0,0 +1,470 @@
+// @ts-check
+import Service from '@ember/service';
+import { inject as service } from '@ember/service';
+import { timeout, restartableTask } from 'ember-concurrency';
+import { tracked } from '@glimmer/tracking';
+import { compare } from '@ember/utils';
+import { A } from '@ember/array';
+// eslint-disable-next-line no-unused-vars
+import EmberRouter from '@ember/routing/router';
+import { schedule } from '@ember/runloop';
+import { action, set } from '@ember/object';
+import { guidFor } from '@ember/object/internals';
+import { assert } from '@ember/debug';
+// eslint-disable-next-line no-unused-vars
+import MutableArray from '@ember/array/mutable';
+import localStorageProperty from 'nomad-ui/utils/properties/local-storage';
+
+/**
+ * @typedef {Object} KeyCommand
+ * @property {string} label
+ * @property {string[]} pattern
+ * @property {any} action
+ * @property {boolean} [requireModifier]
+ * @property {boolean} [enumerated]
+ * @property {boolean} [recording]
+ * @property {boolean} [custom]
+ * @property {boolean} [exclusive]
+ */
+
+const DEBOUNCE_MS = 750;
+// This modifies event.key to a symbol; get the digit equivalent to perform commands
+const DIGIT_MAP = {
+ '!': 1,
+ '@': 2,
+ '#': 3,
+ $: 4,
+ '%': 5,
+ '^': 6,
+ '&': 7,
+ '*': 8,
+ '(': 9,
+ ')': 0,
+};
+
+const DISALLOWED_KEYS = [
+ 'Shift',
+ 'Backspace',
+ 'Delete',
+ 'Meta',
+ 'Alt',
+ 'Control',
+ 'Tab',
+ 'CapsLock',
+ 'Clear',
+ 'ScrollLock',
+];
+
+export default class KeyboardService extends Service {
+ /**
+ * @type {EmberRouter}
+ */
+ @service router;
+
+ @service config;
+
+ @tracked shortcutsVisible = false;
+ @tracked buffer = A([]);
+ @tracked displayHints = false;
+
+ @localStorageProperty('keyboardNavEnabled', true) enabled;
+
+ defaultPatterns = {
+ 'Go to Jobs': ['g', 'j'],
+ 'Go to Storage': ['g', 'r'],
+ 'Go to Variables': ['g', 'v'],
+ 'Go to Servers': ['g', 's'],
+ 'Go to Clients': ['g', 'c'],
+ 'Go to Topology': ['g', 't'],
+ 'Go to Evaluations': ['g', 'e'],
+ 'Go to ACL Tokens': ['g', 'a'],
+ 'Next Subnav': ['Shift+ArrowRight'],
+ 'Previous Subnav': ['Shift+ArrowLeft'],
+ 'Previous Main Section': ['Shift+ArrowUp'],
+ 'Next Main Section': ['Shift+ArrowDown'],
+ 'Show Keyboard Shortcuts': ['Shift+?'],
+ };
+
+ /**
+ * @type {MutableArray}
+ */
+ @tracked
+ keyCommands = A(
+ [
+ {
+ label: 'Go to Jobs',
+ action: () => this.router.transitionTo('jobs'),
+ rebindable: true,
+ },
+ {
+ label: 'Go to Storage',
+ action: () => this.router.transitionTo('csi.volumes'),
+ rebindable: true,
+ },
+ {
+ label: 'Go to Variables',
+ action: () => this.router.transitionTo('variables'),
+ },
+ {
+ label: 'Go to Servers',
+ action: () => this.router.transitionTo('servers'),
+ rebindable: true,
+ },
+ {
+ label: 'Go to Clients',
+ action: () => this.router.transitionTo('clients'),
+ rebindable: true,
+ },
+ {
+ label: 'Go to Topology',
+ action: () => this.router.transitionTo('topology'),
+ rebindable: true,
+ },
+ {
+ label: 'Go to Evaluations',
+ action: () => this.router.transitionTo('evaluations'),
+ rebindable: true,
+ },
+ {
+ label: 'Go to ACL Tokens',
+ action: () => this.router.transitionTo('settings.tokens'),
+ rebindable: true,
+ },
+ {
+ label: 'Next Subnav',
+ action: () => {
+ this.traverseLinkList(this.subnavLinks, 1);
+ },
+ requireModifier: true,
+ rebindable: true,
+ },
+ {
+ label: 'Previous Subnav',
+ action: () => {
+ this.traverseLinkList(this.subnavLinks, -1);
+ },
+ requireModifier: true,
+ rebindable: true,
+ },
+ {
+ label: 'Previous Main Section',
+ action: () => {
+ this.traverseLinkList(this.navLinks, -1);
+ },
+ requireModifier: true,
+ rebindable: true,
+ },
+ {
+ label: 'Next Main Section',
+ action: () => {
+ this.traverseLinkList(this.navLinks, 1);
+ },
+ requireModifier: true,
+ rebindable: true,
+ },
+ {
+ label: 'Show Keyboard Shortcuts',
+ action: () => {
+ this.shortcutsVisible = true;
+ },
+ },
+ ].map((command) => {
+ const persistedValue = window.localStorage.getItem(
+ `keyboard.command.${command.label}`
+ );
+ if (persistedValue) {
+ set(command, 'pattern', JSON.parse(persistedValue));
+ set(command, 'custom', true);
+ } else {
+ set(command, 'pattern', this.defaultPatterns[command.label]);
+ }
+ return command;
+ })
+ );
+
+ /**
+ * For Dynamic/iterative keyboard shortcuts, we want to do a couple things to make them more human-friendly:
+ * 1. Make them 1-based, instead of 0-based
+ * 2. Prefix numbers 1-9 with "0" to make it so "Shift+10" doesn't trigger "Shift+1" then "0", etc.
+ * ^--- stops being a good solution with 100+ row lists/tables, but a better UX than waiting for shift key-up otherwise
+ *
+ * @param {number} iter
+ * @returns {string[]}
+ */
+ cleanPattern(iter) {
+ iter = iter + 1; // first item should be Shift+1, not Shift+0
+ assert('Dynamic keyboard shortcuts only work up to 99 digits', iter < 100);
+ return [`Shift+${('0' + iter).slice(-2)}`]; // Shift+01, not Shift+1
+ }
+
+ recomputeEnumeratedCommands() {
+ this.keyCommands.filterBy('enumerated').forEach((command, iter) => {
+ command.pattern = this.cleanPattern(iter);
+ });
+ }
+
+ addCommands(commands) {
+ schedule('afterRender', () => {
+ commands.forEach((command) => {
+ if (command.exclusive) {
+ this.removeCommands(
+ this.keyCommands.filterBy('label', command.label)
+ );
+ }
+ this.keyCommands.pushObject(command);
+ if (command.enumerated) {
+ // Recompute enumerated numbers to handle things like sort
+ this.recomputeEnumeratedCommands();
+ }
+ });
+ });
+ }
+
+ removeCommands(commands = A([])) {
+ this.keyCommands.removeObjects(commands);
+ }
+
+ //#region Nav Traversal
+
+ subnavLinks = [];
+ navLinks = [];
+
+ /**
+ * Map over a passed element's links and determine if they're routable
+ * If so, return them in a transitionTo-able format
+ *
+ * @param {HTMLElement} element did-insertable menu container element
+ * @param {Object} args
+ * @param {('main' | 'subnav')} args.type determine which traversable list the routes belong to
+ */
+ @action
+ registerNav(element, _, args) {
+ const { type } = args;
+ const links = Array.from(element.querySelectorAll('a:not(.loading)'))
+ .map((link) => {
+ if (link.getAttribute('href')) {
+ return {
+ route: this.router.recognize(link.getAttribute('href'))?.name,
+ parent: guidFor(element),
+ };
+ }
+ })
+ .compact();
+
+ if (type === 'main') {
+ this.navLinks = links;
+ } else if (type === 'subnav') {
+ this.subnavLinks = links;
+ }
+ }
+
+ /**
+ * Removes links associated with a specific nav.
+ * guidFor is necessary because willDestroy runs async;
+ * it can happen after the next page's did-insert, so we .reject() instead of resetting to [].
+ *
+ * @param {HTMLElement} element
+ */
+ @action
+ unregisterSubnav(element) {
+ this.subnavLinks = this.subnavLinks.reject(
+ (link) => link.parent === guidFor(element)
+ );
+ }
+
+ /**
+ *
+ * @param {Array} links - array of root.branch.twig strings
+ * @param {number} traverseBy - positive or negative number to move along links
+ */
+ traverseLinkList(links, traverseBy) {
+ // afterRender because LinkTos evaluate their href value at render time
+ schedule('afterRender', () => {
+ if (links.length) {
+ let activeLink = links.find((link) => this.router.isActive(link.route));
+
+ // If no activeLink, means we're nested within a primary section.
+ // Luckily, Ember's RouteInfo.find() gives us access to parents and connected leaves of a route.
+ // So, if we're on /csi/volumes but the nav link is to /csi, we'll .find() it.
+ // Similarly, /job/:job/taskgroupid/index will find /job.
+ if (!activeLink) {
+ activeLink = links.find((link) => {
+ return this.router.currentRoute.find((r) => {
+ return r.name === link.route || `${r.name}.index` === link.route;
+ });
+ });
+ }
+
+ if (activeLink) {
+ const activeLinkPosition = links.indexOf(activeLink);
+ const nextPosition = activeLinkPosition + traverseBy;
+
+ // Modulo (%) logic: if the next position is longer than the array, wrap to 0.
+ // If it's before the beginning, wrap to the end.
+ const nextLink =
+ links[((nextPosition % links.length) + links.length) % links.length]
+ .route;
+
+ this.router.transitionTo(nextLink);
+ }
+ }
+ });
+ }
+
+ //#endregion Nav Traversal
+
+ /**
+ *
+ * @param {("press" | "release")} type
+ * @param {KeyboardEvent} event
+ */
+ recordKeypress(type, event) {
+ const inputElements = ['input', 'textarea', 'code'];
+ const disallowedClassNames = [
+ 'ember-basic-dropdown-trigger',
+ 'dropdown-option',
+ ];
+ const targetElementName = event.target.nodeName.toLowerCase();
+ const inputDisallowed =
+ inputElements.includes(targetElementName) ||
+ disallowedClassNames.any((className) =>
+ event.target.classList.contains(className)
+ );
+
+ // Don't fire keypress events from within an input field
+ if (!inputDisallowed) {
+ // Treat Shift like a special modifier key.
+ // If it's depressed, display shortcuts
+ const { key } = event;
+ const shifted = event.getModifierState('Shift');
+ if (type === 'press') {
+ if (key === 'Shift') {
+ this.displayHints = true;
+ } else {
+ if (!DISALLOWED_KEYS.includes(key)) {
+ this.addKeyToBuffer.perform(key, shifted);
+ }
+ }
+ } else if (type === 'release') {
+ if (key === 'Shift') {
+ this.displayHints = false;
+ }
+ }
+ }
+ }
+
+ rebindCommand = (cmd, ele) => {
+ ele.target.blur(); // keynav ignores on inputs
+ this.clearBuffer();
+ set(cmd, 'recording', true);
+ set(cmd, 'previousPattern', cmd.pattern);
+ set(cmd, 'pattern', null);
+ };
+
+ endRebind = (cmd) => {
+ set(cmd, 'custom', true);
+ set(cmd, 'recording', false);
+ set(cmd, 'previousPattern', null);
+ window.localStorage.setItem(
+ `keyboard.command.${cmd.label}`,
+ JSON.stringify([...this.buffer])
+ );
+ };
+
+ resetCommandToDefault = (cmd) => {
+ window.localStorage.removeItem(`keyboard.command.${cmd.label}`);
+ set(cmd, 'pattern', this.defaultPatterns[cmd.label]);
+ set(cmd, 'custom', false);
+ };
+
+ /**
+ *
+ * @param {string} key
+ * @param {boolean} shifted
+ */
+ @restartableTask *addKeyToBuffer(key, shifted) {
+ // Replace key with its unshifted equivalent if it's a number key
+ if (shifted && key in DIGIT_MAP) {
+ key = DIGIT_MAP[key];
+ }
+ this.buffer.pushObject(shifted ? `Shift+${key}` : key);
+ let recorder = this.keyCommands.find((c) => c.recording);
+ if (recorder) {
+ if (key === 'Escape' || key === '/') {
+ // Escape cancels recording; slash is reserved for global search
+ set(recorder, 'recording', false);
+ set(recorder, 'pattern', recorder.previousPattern);
+ recorder = null;
+ } else if (key === 'Enter') {
+ // Enter finishes recording and removes itself from the buffer
+ this.buffer = this.buffer.slice(0, -1);
+ this.endRebind(recorder);
+ recorder = null;
+ } else {
+ set(recorder, 'pattern', [...this.buffer]);
+ }
+ } else {
+ if (this.matchedCommands.length) {
+ this.matchedCommands.forEach((command) => {
+ if (
+ this.enabled ||
+ command.label === 'Show Keyboard Shortcuts' ||
+ command.label === 'Hide Keyboard Shortcuts'
+ ) {
+ command.action();
+ }
+ });
+ this.clearBuffer();
+ }
+ }
+ yield timeout(DEBOUNCE_MS);
+ if (recorder) {
+ this.endRebind(recorder);
+ }
+ this.clearBuffer();
+ }
+
+ get matchedCommands() {
+ // Shiftless Buffer: handle the case where use is holding shift (to see shortcut hints) and typing a key command
+ const shiftlessBuffer = this.buffer.map((key) =>
+ key.replace('Shift+', '').toLowerCase()
+ );
+
+ // Shift Friendly Buffer: If you hold Shift and type 0 and 1, it'll output as ['Shift+0', 'Shift+1'].
+ // Instead, translate that to ['Shift+01'] for clearer UX
+ const shiftFriendlyBuffer = [
+ `Shift+${this.buffer.map((key) => key.replace('Shift+', '')).join('')}`,
+ ];
+
+ // Ember Compare: returns 0 if there's no diff between arrays.
+ const matches = this.keyCommands.filter((command) => {
+ return (
+ command.action &&
+ (!compare(command.pattern, this.buffer) ||
+ (command.requireModifier
+ ? false
+ : !compare(command.pattern, shiftlessBuffer)) ||
+ (command.requireModifier
+ ? false
+ : !compare(command.pattern, shiftFriendlyBuffer)))
+ );
+ });
+ return matches;
+ }
+
+ clearBuffer() {
+ this.buffer.clear();
+ }
+
+ listenForKeypress() {
+ set(this, '_keyDownHandler', this.recordKeypress.bind(this, 'press'));
+ document.addEventListener('keydown', this._keyDownHandler);
+ set(this, '_keyUpHandler', this.recordKeypress.bind(this, 'release'));
+ document.addEventListener('keyup', this._keyUpHandler);
+ }
+
+ willDestroy() {
+ document.removeEventListener('keydown', this._keyDownHandler);
+ document.removeEventListener('keyup', this._keyUpHandler);
+ }
+}
diff --git a/ui/app/services/system.js b/ui/app/services/system.js
index a9df19860a7..142739b107a 100644
--- a/ui/app/services/system.js
+++ b/ui/app/services/system.js
@@ -1,6 +1,7 @@
import Service, { inject as service } from '@ember/service';
import { computed } from '@ember/object';
import { alias } from '@ember/object/computed';
+import Ember from 'ember';
import PromiseObject from '../utils/classes/promise-object';
import PromiseArray from '../utils/classes/promise-array';
import { namespace } from '../adapters/application';
@@ -16,64 +17,78 @@ export default class SystemService extends Service {
@computed('activeRegion')
get leader() {
const token = this.token;
-
- return PromiseObject.create({
- promise: token
- .authorizedRequest(`/${namespace}/status/leader`)
- .then((res) => res.json())
- .then((rpcAddr) => ({ rpcAddr }))
- .then((leader) => {
- // Dirty self so leader can be used as a dependent key
- this.notifyPropertyChange('leader.rpcAddr');
- return leader;
- }),
- });
+ if (token.secret || Ember.testing) {
+ return PromiseObject.create({
+ promise: token
+ .authorizedRequest(`/${namespace}/status/leader`)
+ .then((res) => res.json())
+ .then((rpcAddr) => ({ rpcAddr }))
+ .then((leader) => {
+ // Dirty self so leader can be used as a dependent key
+ this.notifyPropertyChange('leader.rpcAddr');
+ return leader;
+ }),
+ });
+ }
+ return null;
}
@computed
get agent() {
const token = this.token;
- return PromiseObject.create({
- promise: token
- .authorizedRawRequest(`/${namespace}/agent/self`)
- .then(jsonWithDefault({}))
- .then((agent) => {
- if (agent?.config?.Version) {
- const { Version, VersionPrerelease, VersionMetadata } =
- agent.config.Version;
- agent.version = Version;
- if (VersionPrerelease)
- agent.version = `${agent.version}-${VersionPrerelease}`;
- if (VersionMetadata)
- agent.version = `${agent.version}+${VersionMetadata}`;
- }
- return agent;
- }),
- });
+
+ if (token.secret || Ember.testing) {
+ return PromiseObject.create({
+ promise: token
+ .authorizedRawRequest(`/${namespace}/agent/self`)
+ .then(jsonWithDefault({}))
+ .then((agent) => {
+ if (agent?.config?.Version) {
+ const { Version, VersionPrerelease, VersionMetadata } =
+ agent.config.Version;
+ agent.version = Version;
+ if (VersionPrerelease)
+ agent.version = `${agent.version}-${VersionPrerelease}`;
+ if (VersionMetadata)
+ agent.version = `${agent.version}+${VersionMetadata}`;
+ }
+ return agent;
+ }),
+ });
+ }
+ return null;
}
@computed
get defaultRegion() {
const token = this.token;
- return PromiseObject.create({
- promise: token
- .authorizedRawRequest(`/${namespace}/agent/members`)
- .then(jsonWithDefault({}))
- .then((json) => {
- return { region: json.ServerRegion };
- }),
- });
+
+ if (token.secret || Ember.testing) {
+ return PromiseObject.create({
+ promise: token
+ .authorizedRawRequest(`/${namespace}/agent/members`)
+ .then(jsonWithDefault({}))
+ .then((json) => {
+ return { region: json.ServerRegion };
+ }),
+ });
+ }
+ return null;
}
@computed
get regions() {
const token = this.token;
- return PromiseArray.create({
- promise: token
- .authorizedRawRequest(`/${namespace}/regions`)
- .then(jsonWithDefault([])),
- });
+ if (token.secret || Ember.testing) {
+ return PromiseArray.create({
+ promise: token
+ .authorizedRawRequest(`/${namespace}/regions`)
+ .then(jsonWithDefault([])),
+ });
+ }
+
+ return null;
}
@computed('regions.[]')
diff --git a/ui/app/services/token.js b/ui/app/services/token.js
index de591393c07..48bf79a994c 100644
--- a/ui/app/services/token.js
+++ b/ui/app/services/token.js
@@ -3,6 +3,7 @@ import { computed } from '@ember/object';
import { alias, reads } from '@ember/object/computed';
import { getOwner } from '@ember/application';
import { assign } from '@ember/polyfills';
+import Ember from 'ember';
import { task } from 'ember-concurrency';
import queryString from 'query-string';
import fetch from 'nomad-ui/utils/fetch';
@@ -31,9 +32,11 @@ export default class TokenService extends Service {
@task(function* () {
const TokenAdapter = getOwner(this).lookup('adapter:token');
try {
- var token = yield TokenAdapter.findSelf();
- this.secret = token.secret;
- return token;
+ if (this.secret || Ember.testing) {
+ var token = yield TokenAdapter.findSelf();
+ this.secret = token.secret;
+ return token;
+ }
} catch (e) {
const errors = e.errors ? e.errors.mapBy('detail') : [];
if (errors.find((error) => error === 'ACL support disabled')) {
@@ -87,6 +90,8 @@ export default class TokenService extends Service {
const headers = {};
const token = this.secret;
+ if (!token && !Ember.testing) return null;
+
if (token) {
headers['X-Nomad-Token'] = token;
}
diff --git a/ui/app/styles/components.scss b/ui/app/styles/components.scss
index 8eb2f85e91e..f08a1928677 100644
--- a/ui/app/styles/components.scss
+++ b/ui/app/styles/components.scss
@@ -47,3 +47,4 @@
@import './components/two-step-button';
@import './components/evaluations';
@import './components/secure-variables';
+@import './components/keyboard-shortcuts-modal';
diff --git a/ui/app/styles/components/keyboard-shortcuts-modal.scss b/ui/app/styles/components/keyboard-shortcuts-modal.scss
new file mode 100644
index 00000000000..ca71f768009
--- /dev/null
+++ b/ui/app/styles/components/keyboard-shortcuts-modal.scss
@@ -0,0 +1,127 @@
+.keyboard-shortcuts {
+ position: fixed;
+ background-color: white;
+ padding: 2rem;
+ margin-top: 20vh;
+ width: 40vw;
+ left: 30vw;
+ z-index: 499;
+ box-shadow: 2px 2px 12px 3000px rgb(0, 0, 0, 0.8);
+ animation-name: slideIn;
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ max-height: 60vh;
+ display: grid;
+ grid-template-rows: auto 1fr auto;
+
+ header {
+ margin-bottom: 2rem;
+ h2 {
+ font-size: $size-3;
+ font-weight: $weight-semibold;
+ }
+
+ button.dismiss {
+ float: right;
+ font-size: 0.7rem;
+ margin-bottom: 1rem;
+ }
+ }
+
+ ul.commands-list {
+ overflow: auto;
+ margin: 0 -2rem;
+ padding: 0 2rem;
+ li {
+ list-style-type: none;
+ padding: 0.5rem 0;
+ display: grid;
+ grid-template-columns: auto 1fr;
+ &:not(:last-of-type) {
+ border-bottom: 1px solid #ccc;
+ }
+ strong {
+ padding: 0.25rem 0;
+ }
+ .keys {
+ text-align: right;
+ & > span.recording {
+ color: $red;
+ font-size: 0.75rem;
+ }
+ button {
+ border: none;
+ background: #eee;
+ cursor: pointer;
+
+ &:hover {
+ background: #ddd;
+ }
+
+ &[disabled],
+ &[disabled]:hover {
+ background: #eee;
+ color: black;
+ cursor: not-allowed;
+ }
+ span {
+ margin: 0.25rem;
+ display: inline-block;
+ }
+
+ &.reset-to-default {
+ background: white;
+ color: $red;
+ font-size: 0.75rem;
+ }
+ }
+ }
+ }
+ }
+
+ footer {
+ background: #eee;
+ padding: 1rem 2rem;
+ margin: 1rem -2rem -2rem;
+ display: grid;
+ grid-template-columns: auto 1fr;
+
+ .toggle {
+ text-align: right;
+ }
+ }
+}
+
+// Global keyboard hint style
+
+// .display-hints {
+[data-shortcut] {
+ background: lighten($nomad-green, 25%);
+ border: 1px solid $nomad-green-dark;
+ content: attr(data-shortcut);
+ display: block;
+ position: absolute;
+ top: 0;
+ left: 0;
+ font-size: 0.75rem;
+ padding: 0 0.5rem;
+ text-transform: lowercase;
+ color: black;
+ font-weight: 300;
+ z-index: $z-popover;
+ &.menu-level {
+ z-index: $z-tooltip;
+ }
+}
+// }
+
+@keyframes slideIn {
+ from {
+ opacity: 0;
+ top: 40px;
+ }
+ to {
+ opacity: 1;
+ top: 0px;
+ }
+}
diff --git a/ui/app/styles/components/secure-variables.scss b/ui/app/styles/components/secure-variables.scss
index 12ae387301b..2ba73e210ad 100644
--- a/ui/app/styles/components/secure-variables.scss
+++ b/ui/app/styles/components/secure-variables.scss
@@ -98,14 +98,35 @@
}
}
}
+
+ .notification.conflict {
+ color: $text;
+
+ p {
+ margin-bottom: 1rem;
+ }
+
+ pre {
+ background: black;
+ color: $white;
+ max-height: 500px;
+ overflow: auto;
+ code {
+ height: 100%;
+ }
+ }
+
+ .options {
+ margin: 1rem 0;
+ }
+ }
}
table.path-tree {
tr {
cursor: pointer;
- a {
- color: #0a0a0a;
- text-decoration: none;
+ &.inaccessible {
+ cursor: not-allowed;
}
svg {
margin-bottom: -2px;
diff --git a/ui/app/templates/allocations/allocation/index.hbs b/ui/app/templates/allocations/allocation/index.hbs
index 6519c3629aa..8ccb11d87d1 100644
--- a/ui/app/templates/allocations/allocation/index.hbs
+++ b/ui/app/templates/allocations/allocation/index.hbs
@@ -61,7 +61,7 @@
@idleText="Restart Alloc"
@cancelText="Cancel Restart"
@confirmText="Yes, Restart Alloc"
- @confirmationMessage="Are you sure? This will restart the allocation in-place."
+ @confirmationMessage="Are you sure? This will restart the tasks that are currently running in-place."
@awaitingConfirmation={{this.restartAllocation.isRunning}}
@disabled={{or
this.stopAllocation.isRunning
@@ -69,6 +69,20 @@
}}
@onConfirm={{perform this.restartAllocation}}
/>
+
{{/if}}
@@ -184,6 +198,10 @@
+
+
{{#if this.error}}
diff --git a/ui/app/templates/clients/client/index.hbs b/ui/app/templates/clients/client/index.hbs
index c347b6d2e2d..20a8f3506b5 100644
--- a/ui/app/templates/clients/client/index.hbs
+++ b/ui/app/templates/clients/client/index.hbs
@@ -546,6 +546,10 @@
diff --git a/ui/app/templates/components/allocation-subnav.hbs b/ui/app/templates/components/allocation-subnav.hbs
index 335d1964174..374e4f5c9b1 100644
--- a/ui/app/templates/components/allocation-subnav.hbs
+++ b/ui/app/templates/components/allocation-subnav.hbs
@@ -1,4 +1,4 @@
-
+
Overview
Files
diff --git a/ui/app/templates/components/app-breadcrumbs.hbs b/ui/app/templates/components/app-breadcrumbs.hbs
index 7c1e105a92c..a56bf2316ee 100644
--- a/ui/app/templates/components/app-breadcrumbs.hbs
+++ b/ui/app/templates/components/app-breadcrumbs.hbs
@@ -1,7 +1,7 @@
- {{#each breadcrumbs as |crumb|}}
+ {{#each breadcrumbs as |crumb iter|}}
{{#let crumb.args.crumb as |c|}}
- {{component (concat "breadcrumbs/" (or c.type "default")) crumb=c}}
+ {{component (concat "breadcrumbs/" (or c.type "default")) crumb=c isOneCrumbUp=(action this.isOneCrumbUp iter breadcrumbs.length)}}
{{/let}}
{{/each}}
\ No newline at end of file
diff --git a/ui/app/templates/components/client-subnav.hbs b/ui/app/templates/components/client-subnav.hbs
index 98978a90e59..c8a769eafb1 100644
--- a/ui/app/templates/components/client-subnav.hbs
+++ b/ui/app/templates/components/client-subnav.hbs
@@ -1,4 +1,4 @@
-
+
Overview
Monitor
diff --git a/ui/app/templates/components/global-header.hbs b/ui/app/templates/components/global-header.hbs
index eb23131f3bf..384d2c67e71 100644
--- a/ui/app/templates/components/global-header.hbs
+++ b/ui/app/templates/components/global-header.hbs
@@ -60,7 +60,7 @@
>
Documentation
-
+
ACL Tokens
diff --git a/ui/app/templates/components/gutter-menu.hbs b/ui/app/templates/components/gutter-menu.hbs
index 69fc6f2a8e2..561dea7dc0e 100644
--- a/ui/app/templates/components/gutter-menu.hbs
+++ b/ui/app/templates/components/gutter-menu.hbs
@@ -1,6 +1,7 @@
diff --git a/website/content/plugins/devices/nvidia.mdx b/website/content/plugins/devices/nvidia.mdx
index b1106a4ac63..729983f0fb8 100644
--- a/website/content/plugins/devices/nvidia.mdx
+++ b/website/content/plugins/devices/nvidia.mdx
@@ -194,7 +194,7 @@ Power usage = 37 / 149 W
Temperature = 34 C
```
-Run the following example job to see that that the GPU was mounted in the
+Run the following example job to see that the GPU was mounted in the
container:
```hcl
@@ -291,4 +291,4 @@ Wed Jan 23 18:25:32 2019
[nvidia_hook]: https://github.com/lxc/lxc/blob/master/hooks/nvidia
[nvidia_plugin_download]: https://releases.hashicorp.com/nomad-device-nvidia/
[nvidia_container_toolkit]: https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html
-[source]: https://github.com/hashicorp/nomad-device-nvidia
\ No newline at end of file
+[source]: https://github.com/hashicorp/nomad-device-nvidia
diff --git a/website/content/plugins/drivers/podman.mdx b/website/content/plugins/drivers/podman.mdx
index 9befd5f4f2c..fc050d1e96f 100644
--- a/website/content/plugins/drivers/podman.mdx
+++ b/website/content/plugins/drivers/podman.mdx
@@ -408,7 +408,7 @@ the networking namespace of one container for other tasks in the same group.
A typical example is a network server and a metric exporter or log shipping
sidecar. The metric exporter needs access to a private monitoring port which
-should not be exposed the the network and thus is usually bound to `localhost`.
+should not be exposed to the network and thus is usually bound to `localhost`.
The [`nomad-driver-podman` repository][homepage] includes three different
examples jobs for such a setup. All of them will start a
diff --git a/website/content/tools/autoscaling/agent/apm.mdx b/website/content/tools/autoscaling/agent/apm.mdx
index 91f3d0cfd7d..b8253ce59e6 100644
--- a/website/content/tools/autoscaling/agent/apm.mdx
+++ b/website/content/tools/autoscaling/agent/apm.mdx
@@ -27,7 +27,7 @@ apm "example-apm-plugin" {
- `args` `(array: [])` - Specifies a set of arguments to pass to the
plugin binary when it is executed.
-- `driver` `(string: "")` - The plugin's executable name relative to to the
+- `driver` `(string: "")` - The plugin's executable name relative to the
[`plugin_dir`][plugin_dir]. If the plugin has a suffix, such as .exe, this
should be omitted.
diff --git a/website/content/tools/autoscaling/agent/dynamic_application_sizing.mdx b/website/content/tools/autoscaling/agent/dynamic_application_sizing.mdx
index f0f0f29e6d3..d1edeee86b1 100644
--- a/website/content/tools/autoscaling/agent/dynamic_application_sizing.mdx
+++ b/website/content/tools/autoscaling/agent/dynamic_application_sizing.mdx
@@ -15,6 +15,8 @@ description: >-
present in the open source version of Nomad Autoscaler.
+~> Note that currently Prometheus is the only APM availible for Dynamic Application Sizing
+
The `dynamic_application_sizing` blocks configures the Nomad Autoscaler agent
options for Dynamic Application Sizing. Learn more about the Dynamic
Application Sizing functionality in the
diff --git a/website/content/tools/autoscaling/agent/strategy.mdx b/website/content/tools/autoscaling/agent/strategy.mdx
index 54b8072e077..594c432c2e6 100644
--- a/website/content/tools/autoscaling/agent/strategy.mdx
+++ b/website/content/tools/autoscaling/agent/strategy.mdx
@@ -27,7 +27,7 @@ strategy "example-strategy-plugin" {
- `args` `(array: [])` - Specifies a set of arguments to pass to the
plugin binary when it is executed.
-- `driver` `(string: "")` - The plugin's executable name relative to to the
+- `driver` `(string: "")` - The plugin's executable name relative to the
[`plugin_dir`][plugin_dir]. If the plugin has a suffix, such as .exe, this should be omitted.
- `config` `(map: nil)` - Specifies configuration values for
diff --git a/website/content/tools/autoscaling/agent/target.mdx b/website/content/tools/autoscaling/agent/target.mdx
index ba9cd487f0a..da1f843d045 100644
--- a/website/content/tools/autoscaling/agent/target.mdx
+++ b/website/content/tools/autoscaling/agent/target.mdx
@@ -27,7 +27,7 @@ target "example-target-plugin" {
- `args` `(array: [])` - Specifies a set of arguments to pass to the
plugin binary when it is executed.
-- `driver` `(string: "")` - The plugin's executable name relative to to the
+- `driver` `(string: "")` - The plugin's executable name relative to the
[`plugin_dir`][plugin_dir]. If the plugin has a suffix, such as .exe, this
should be omitted.
diff --git a/website/content/tools/autoscaling/index.mdx b/website/content/tools/autoscaling/index.mdx
index 687acfb5106..e7b052dfbf0 100644
--- a/website/content/tools/autoscaling/index.mdx
+++ b/website/content/tools/autoscaling/index.mdx
@@ -10,7 +10,7 @@ description: |-
This section details the Nomad Autoscaler, a horizontal application and cluster
autoscaler for Nomad. The Nomad Autoscaler is built and released separately to
-Nomad. It runs as a daemon process, often referred to as the [Autocaler Agent][autoscaler_agent].
+Nomad. It runs as a daemon process, often referred to as the [Autoscaler Agent][autoscaler_agent].
An Autoscaler Agent is a separate and distinct process from a Nomad Agent. The
source code can be viewed on [GitHub][autoscaler_github] and releases are available
on the [HashiCorp releases page][autoscaler_releases] or via [Docker Hub][autoscaler_dockerhub].
diff --git a/website/content/tools/autoscaling/plugins/target/app-sizing-nomad.mdx b/website/content/tools/autoscaling/plugins/target/app-sizing-nomad.mdx
index 9fdab12113d..3f6a6acbb63 100644
--- a/website/content/tools/autoscaling/plugins/target/app-sizing-nomad.mdx
+++ b/website/content/tools/autoscaling/plugins/target/app-sizing-nomad.mdx
@@ -11,6 +11,8 @@ description: The "app-sizing-nomad" target plugin scales a task resource.
present in the open source version of Nomad Autoscaler.
+~> Note that currently Prometheus is the only APM availible for Dynamic Application Sizing
+
The `app-sizing-nomad` target plugin reports on the current task resource value
as well as submits recommendations to Nomad via the [recommendations API endpoint][nomad_recommendations_api]
based on the result of the Dynamic Application Sizing strategy calculations.
diff --git a/website/content/tools/index.mdx b/website/content/tools/index.mdx
index 480907e3eaa..febf9b5aeb9 100644
--- a/website/content/tools/index.mdx
+++ b/website/content/tools/index.mdx
@@ -18,6 +18,7 @@ The following external tools are currently available for Nomad and maintained by
- [Damon](https://github.com/hashicorp/damon) - An terminal dashboard for Nomad.
- [Levant](https://github.com/hashicorp/levant) - A templating and deployment tool for HashiCorp Nomad jobs that provides realtime feedback and detailed failure messages upon deployment issues.
- [Nomad Pack](https://github.com/hashicorp/nomad-pack) - An official package manager and templating tool for Nomad, currently a Tech Preview.
+- [Nomad Pack GitHub Action](https://github.com/marketplace/actions/setup-hashicorp-nomad-pack) - A GitHub Action for Nomad Pack.
- [OpenAPI](https://github.com/hashicorp/nomad-openapi) - An OpenAPI/Swagger spec for Nomad, allowing for programmatic generation of SDKs and documentation. Includes a reference implementation in Go built on top of a generated client.
## Community Tools
diff --git a/website/data/docs-nav-data.json b/website/data/docs-nav-data.json
index 591884f5dec..a721fbe7883 100644
--- a/website/data/docs-nav-data.json
+++ b/website/data/docs-nav-data.json
@@ -142,6 +142,14 @@
{
"title": "Security Model",
"path": "concepts/security"
+ },
+ {
+ "title": "Workload Identity",
+ "path": "concepts/workload-identity"
+ },
+ {
+ "title": "Secure Variables",
+ "path": "concepts/secure-variables"
}
]
},
@@ -1350,6 +1358,10 @@
"title": "affinity",
"path": "job-specification/affinity"
},
+ {
+ "title": "change_script",
+ "path": "job-specification/change_script"
+ },
{
"title": "check",
"path": "job-specification/check"
@@ -1926,6 +1938,10 @@
{
"title": "Access Control",
"href": "https://learn.hashicorp.com/collections/nomad/access-control"
+ },
+ {
+ "title": "Key Management",
+ "path": "operations/key-management"
}
]
},