diff --git a/docs/development/hacking_itk_wasm.md b/docs/development/hacking_itk_wasm.md index 9d6a2762c..48c896f67 100644 --- a/docs/development/hacking_itk_wasm.md +++ b/docs/development/hacking_itk_wasm.md @@ -5,10 +5,8 @@ Install [Podman] and [Pixi], and ```sh -npm i -g pnpm -pnpm install -pnpm build -pnpm test +pixi run build +pixi run test ``` and contribute the patch with standard GitHub best practices. @@ -74,14 +72,13 @@ pixi run build-docker-images --with-debug The `--with-debug` flag will also build the `latest-debug` tagged images. -To use these locally built images in the pnpm build, remove (*clean*) the old build artifacts from the repository first. +To use these locally built images in the pixi build, remove (*clean*) the old build artifacts from the repository first. ```sh # Remove old build artifacts -pnpm clean +pixi run clean -pnpm install -pnpm build +pixi run build ``` ## Command line interface (CLI) @@ -137,10 +134,8 @@ hatch run test To develop these packages, at the top level, run: ```sh -npm i -g pnpm -pnpm install -pnpm build -pnpm test +pixi run build +pixi run test ``` This will build and test the packages in order, according to their dependency topology, and the packages will use local workspace dependencies, including the `itk-wasm` CLI. @@ -152,7 +147,8 @@ The `build` and `test` targets are high-level targets that call other targets. T In development, it often useful to [build the wasm in debug mode](../cxx/tutorial/debugging.md). To create a debug build, at the root level, clean the tree, call `build:emscripten:debug` and `build:wasi:debug`, then `build` and `test` as usual: ```sh -pnpm clean +pixi run clean +pixi shell pnpm build:emscripten:debug pnpm build:wasi:debug pnpm build diff --git a/itk_wasm_env.bash b/itk_wasm_env.bash index 7402f200a..8407d427f 100755 --- a/itk_wasm_env.bash +++ b/itk_wasm_env.bash @@ -42,3 +42,6 @@ export ITK_WASM_DOWNSAMPLE_TEST_DATA_URLS=${ITK_WASM_DOWNSAMPLE_TEST_DATA_URLS:- export ITK_WASM_MESH_IO_TEST_DATA_HASH=${ITK_WASM_MESH_IO_TEST_DATA_HASH:-$(cat packages/mesh-io/package.json | jq -e -r '."itk-wasm"."test-data-hash"')} export ITK_WASM_MESH_IO_TEST_DATA_URLS=${ITK_WASM_MESH_IO_TEST_DATA_URLS:-$(cat packages/mesh-io/package.json | jq -e -r '."itk-wasm"."test-data-urls" | join(" ")')} + +export ITK_WASM_TRANSFORM_IO_TEST_DATA_HASH=${ITK_WASM_TRANSFORM_IO_TEST_DATA_HASH:-$(cat packages/mesh-io/package.json | jq -e -r '."itk-wasm"."test-data-hash"')} +export ITK_WASM_TRANSFORM_IO_TEST_DATA_URLS=${ITK_WASM_TRANSFORM_IO_TEST_DATA_URLS:-$(cat packages/mesh-io/package.json | jq -e -r '."itk-wasm"."test-data-urls" | join(" ")')} \ No newline at end of file diff --git a/packages/compare-images/package.json b/packages/compare-images/package.json index 7c091599d..aa52b64fa 100644 --- a/packages/compare-images/package.json +++ b/packages/compare-images/package.json @@ -30,10 +30,10 @@ "test": "pnpm test:data:download && pnpm build:gen:python && pnpm test:python", "test:data:download": "dam download test/data test/data.tar.gz bafybeiafli6egtmkcgany65po64w67hpqnmgwr5utqo6ycbbz7k5l33llu https://github.com/InsightSoftwareConsortium/ITK-Wasm/releases/download/itk-wasm-v1.0.0-b.171/compare-images-test-data.tar.gz", "test:data:pack": "dam pack test/data test/data.tar.gz", - "test:python:wasi": "pnpm test:data:download && pixi run test-wasi", - "test:python:emscripten": "pnpm test:data:download && pixi run test-emscripten", - "test:python:dispatch": "pnpm test:data:download && pixi run test-dispatch", - "test:python": "pixi run test-python" + "test:python:wasi": "pnpm test:data:download && pixi run --manifest-path=./pixi.toml test-wasi", + "test:python:emscripten": "pnpm test:data:download && pixi run --manifest-path=./pixi.toml test-emscripten", + "test:python:dispatch": "pnpm test:data:download && pixi run --manifest-path=./pixi.toml test-dispatch", + "test:python": "pixi run --manifest-path=./pixi.toml test-python" }, "license": "Apache-2.0", "devDependencies": { diff --git a/packages/compare-images/pixi.toml b/packages/compare-images/pixi.toml index 74e8da75c..1cd72253c 100644 --- a/packages/compare-images/pixi.toml +++ b/packages/compare-images/pixi.toml @@ -6,8 +6,6 @@ name = "compare-images" platforms = ["win-64", "linux-64", "linux-aarch64", "osx-arm64"] version = "0.1.0" -[tasks] - [dependencies] python = "3.12.*" pnpm = ">=9.12.1,<10" @@ -20,6 +18,14 @@ m2w64-jq = ">=1.6.0,<2" [target.unix.dependencies] jq = ">=1.7.1,<2" +[tasks.build] +cmd = "pnpm run build" +description = "Build the project" + +[tasks.test] +cmd = "pnpm run test" +description = "Run tests" + [tasks.version-sync-typescript] cmd = '''version=$(cat package.json | jq .version) && jq ".version = $version" typescript/package.json > typescript/package.json.tmp && diff --git a/packages/compare-meshes/package.json b/packages/compare-meshes/package.json index 17ccda8c8..690561ccc 100644 --- a/packages/compare-meshes/package.json +++ b/packages/compare-meshes/package.json @@ -7,9 +7,9 @@ "itk-wasm": { "emscripten-docker-image": "itkwasm/emscripten:latest", "wasi-docker-image": "itkwasm/wasi:latest", - "test-data-hash": "bafybeiafli6egtmkcgany65po64w67hpqnmgwr5utqo6ycbbz7k5l33llu", + "test-data-hash": "bafybeigcqagjt67v4uutyrdefftxu23ihgnmjbgelxnkfy4x3zcfsfg3xm", "test-data-urls": [ - "https://github.com/InsightSoftwareConsortium/ITK-Wasm/releases/download/itk-wasm-v1.0.0-b.171/compare-images-test-data.tar.gz" + "https://bafybeiabirl7i5shb6sajmfkqycpi67i3vshpcto7d3x3up2w5h64yibji.ipfs.w3s.link/ipfs/bafybeiabirl7i5shb6sajmfkqycpi67i3vshpcto7d3x3up2w5h64yibji/data.tar.gz" ], "package-description": "Compare meshes and polydata for regression testing.", "typescript-package-name": "@itk-wasm/compare-meshes", @@ -29,11 +29,11 @@ "build:gen:typescript": "itk-wasm pnpm-script build:gen:typescript", "build:gen:python": "pnpm build:wasi && pnpm bindgen:python", "test": "pnpm test:data:download && pnpm build:gen:python && pnpm test:python", - "test:data:download": "dam download test/data test/data.tar.gz bafkreidioh62iouwzrrpavx7g72fdjxze7gp4cqpf36t4pdafcpcmx4zye https://github.com/InsightSoftwareConsortium/ITK-Wasm/releases/download/itk-wasm-v1.0.0-b.171/itkwasm-compare-meshes-test-data.tar.gz", + "test:data:download": "dam download test/data test/data.tar.gz bafkreidioh62iouwzrrpavx7g72fdjxze7gp4cqpf36t4pdafcpcmx4zye https://bafybeiabirl7i5shb6sajmfkqycpi67i3vshpcto7d3x3up2w5h64yibji.ipfs.w3s.link/ipfs/bafybeiabirl7i5shb6sajmfkqycpi67i3vshpcto7d3x3up2w5h64yibji/data.tar.gz", "test:data:pack": "dam pack test/data test/data.tar.gz", - "test:python:wasi": "pnpm test:data:download && pixi run test-wasi", - "test:python:emscripten": "pnpm test:data:download && pixi run test-emscripten", - "test:python:dispatch": "pnpm test:data:download && pixi run test-dispatch", + "test:python:wasi": "pnpm test:data:download && pixi run --manifest-path=./pixi.toml test-wasi", + "test:python:emscripten": "pnpm test:data:download && pixi run --manifest-path=./pixi.toml test-emscripten", + "test:python:dispatch": "pnpm test:data:download && pixi run --manifest-path=./pixi.toml test-dispatch", "test:python": "itk-wasm pnpm-script test:python", "test:wasi": "itk-wasm pnpm-script test:wasi" }, diff --git a/packages/compare-meshes/pixi.toml b/packages/compare-meshes/pixi.toml index 1163212d0..353194104 100644 --- a/packages/compare-meshes/pixi.toml +++ b/packages/compare-meshes/pixi.toml @@ -6,8 +6,6 @@ name = "compare-meshes" platforms = ["win-64", "linux-64", "linux-aarch64", "osx-arm64"] version = "0.1.0" -[tasks] - [dependencies] python = "3.12.*" pnpm = ">=9.12.1,<10" @@ -20,6 +18,14 @@ m2w64-jq = ">=1.6.0,<2" [target.unix.dependencies] jq = ">=1.7.1,<2" +[tasks.build] +cmd = "pnpm run build" +description = "Build the project" + +[tasks.test] +cmd = "pnpm run test" +description = "Run tests" + [tasks.version-sync-typescript] cmd = '''version=$(cat package.json | jq .version) && jq ".version = $version" typescript/package.json > typescript/package.json.tmp && diff --git a/packages/compress-stringify/package.json b/packages/compress-stringify/package.json index d0f81e8e2..76af565ea 100644 --- a/packages/compress-stringify/package.json +++ b/packages/compress-stringify/package.json @@ -32,10 +32,10 @@ "test": "pnpm test:data:download && pnpm build:gen:python && pnpm test:python", "test:data:download": "dam download test/data test/data.tar.gz bafkreiha6oye3fd5cxfadnua5r2jlkaco2xuyeek454d2ihiffsx7rauqe https://placeholder", "test:data:pack": "dam pack test/data test/data.tar.gz", - "test:python:wasi": "pnpm test:data:download && pixi run test-wasi", - "test:python:emscripten": "pnpm test:data:download && pixi run test-emscripten", - "test:python:dispatch": "pnpm test:data:download && pixi run test-dispatch", - "test:python": "pixi run test-python", + "test:python:wasi": "pnpm test:data:download && pixi run --manifest-path=./pixi.toml test-wasi", + "test:python:emscripten": "pnpm test:data:download && pixi run --manifest-path=./pixi.toml test-emscripten", + "test:python:dispatch": "pnpm test:data:download && pixi run --manifest-path=./pixi.toml test-dispatch", + "test:python": "pixi run --manifest-path=./pixi.toml test-python", "test:wasi": "itk-wasm pnpm-script test:wasi" }, "license": "Apache-2.0", diff --git a/packages/compress-stringify/pixi.toml b/packages/compress-stringify/pixi.toml index 94f86724f..a6382c1f7 100644 --- a/packages/compress-stringify/pixi.toml +++ b/packages/compress-stringify/pixi.toml @@ -6,8 +6,6 @@ name = "compress-stringify" platforms = ["win-64", "linux-64", "linux-aarch64", "osx-arm64"] version = "0.1.0" -[tasks] - [dependencies] python = "3.12.*" pnpm = ">=9.12.1,<10" @@ -20,6 +18,14 @@ m2w64-jq = ">=1.6.0,<2" [target.unix.dependencies] jq = ">=1.7.1,<2" +[tasks.build] +cmd = "pnpm run build" +description = "Build the project" + +[tasks.test] +cmd = "pnpm run test" +description = "Run tests" + [tasks.version-sync-typescript] cmd = '''version=$(cat package.json | jq .version) && jq ".version = $version" typescript/package.json > typescript/package.json.tmp && diff --git a/packages/compress-stringify/python/itkwasm-compress-stringify-emscripten/itkwasm_compress_stringify_emscripten/js_package.py b/packages/compress-stringify/python/itkwasm-compress-stringify-emscripten/itkwasm_compress_stringify_emscripten/js_package.py index 2c6957e5a..cfb77a5c5 100644 --- a/packages/compress-stringify/python/itkwasm-compress-stringify-emscripten/itkwasm_compress_stringify_emscripten/js_package.py +++ b/packages/compress-stringify/python/itkwasm-compress-stringify-emscripten/itkwasm_compress_stringify_emscripten/js_package.py @@ -3,6 +3,6 @@ from itkwasm.pyodide import JsPackageConfig, JsPackage from ._version import __version__ -default_js_module = """data:text/javascript;base64,dmFyIFV0PU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgTnQ9KEEsZSk9Pntmb3IodmFyIHQgaW4gZSlVdChBLHQse2dldDplW3RdLGVudW1lcmFibGU6ITB9KX07dmFyIFR0PSIzLjMuMCIsTkE9VHQ7dmFyIEd0PXtJbnQ4OiJpbnQ4IixVSW50ODoidWludDgiLEludDE2OiJpbnQxNiIsVUludDE2OiJ1aW50MTYiLEludDMyOiJpbnQzMiIsVUludDMyOiJ1aW50MzIiLEludDY0OiJpbnQ2NCIsVUludDY0OiJ1aW50NjQiLFNpemVWYWx1ZVR5cGU6InVpbnQ2NCIsSWRlbnRpZmllclR5cGU6InVpbnQ2NCIsSW5kZXhWYWx1ZVR5cGU6ImludDY0IixPZmZzZXRWYWx1ZVR5cGU6ImludDY0In0seT1HdDt2YXIgUHQ9e0Zsb2F0MzI6ImZsb2F0MzIiLEZsb2F0NjQ6ImZsb2F0NjQiLFNwYWNlUHJlY2lzaW9uVHlwZToiZmxvYXQ2NCJ9LGs9UHQ7ZnVuY3Rpb24gTHQoQSxlKXtsZXQgdD1udWxsO3N3aXRjaChBKXtjYXNlIHkuVUludDg6e3Q9bmV3IFVpbnQ4QXJyYXkoZSk7YnJlYWt9Y2FzZSB5LkludDg6e3Q9bmV3IEludDhBcnJheShlKTticmVha31jYXNlIHkuVUludDE2Ont0PW5ldyBVaW50MTZBcnJheShlKTticmVha31jYXNlIHkuSW50MTY6e3Q9bmV3IEludDE2QXJyYXkoZSk7YnJlYWt9Y2FzZSB5LlVJbnQzMjp7dD1uZXcgVWludDMyQXJyYXkoZSk7YnJlYWt9Y2FzZSB5LkludDMyOnt0PW5ldyBJbnQzMkFycmF5KGUpO2JyZWFrfWNhc2UgeS5VSW50NjQ6e3R5cGVvZiBnbG9iYWxUaGlzLkJpZ1VpbnQ2NEFycmF5PT0iZnVuY3Rpb24iP3Q9bmV3IEJpZ1VpbnQ2NEFycmF5KGUpOnQ9bmV3IFVpbnQ4QXJyYXkoZSk7YnJlYWt9Y2FzZSB5LkludDY0Ont0eXBlb2YgZ2xvYmFsVGhpcy5CaWdJbnQ2NEFycmF5PT0iZnVuY3Rpb24iP3Q9bmV3IEJpZ0ludDY0QXJyYXkoZSk6dD1uZXcgVWludDhBcnJheShlKTticmVha31jYXNlIGsuRmxvYXQzMjp7dD1uZXcgRmxvYXQzMkFycmF5KGUpO2JyZWFrfWNhc2Ugay5GbG9hdDY0Ont0PW5ldyBGbG9hdDY0QXJyYXkoZSk7YnJlYWt9Y2FzZSJudWxsIjp7dD1udWxsO2JyZWFrfWNhc2UgbnVsbDp7dD1udWxsO2JyZWFrfWRlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJUeXBlIGlzIG5vdCBzdXBwb3J0ZWQgYXMgYSBUeXBlZEFycmF5Iil9cmV0dXJuIHR9dmFyIHc9THQ7dmFyIHh0PXtVbmtub3duOiJVbmtub3duIixTY2FsYXI6IlNjYWxhciIsUkdCOiJSR0IiLFJHQkE6IlJHQkEiLE9mZnNldDoiT2Zmc2V0IixWZWN0b3I6IlZlY3RvciIsUG9pbnQ6IlBvaW50IixDb3ZhcmlhbnRWZWN0b3I6IkNvdmFyaWFudFZlY3RvciIsU3ltbWV0cmljU2Vjb25kUmFua1RlbnNvcjoiU3ltbWV0cmljU2Vjb25kUmFua1RlbnNvciIsRGlmZnVzaW9uVGVuc29yM0Q6IkRpZmZ1c2lvblRlbnNvcjNEIixDb21wbGV4OiJDb21wbGV4IixGaXhlZEFycmF5OiJGaXhlZEFycmF5IixBcnJheToiQXJyYXkiLE1hdHJpeDoiTWF0cml4IixWYXJpYWJsZUxlbmd0aFZlY3RvcjoiVmFyaWFibGVMZW5ndGhWZWN0b3IiLFZhcmlhYmxlU2l6ZU1hdHJpeDoiVmFyaWFibGVTaXplTWF0cml4In0sRz14dDt2YXIgVEE9Y2xhc3N7ZGltZW5zaW9uO2NvbXBvbmVudFR5cGU7cGl4ZWxUeXBlO2NvbXBvbmVudHM7Y29uc3RydWN0b3IoZT0yLHQ9eS5VSW50OCxyPUcuU2NhbGFyLG89MSl7dGhpcy5kaW1lbnNpb249ZSx0aGlzLmNvbXBvbmVudFR5cGU9dCx0aGlzLnBpeGVsVHlwZT1yLHRoaXMuY29tcG9uZW50cz1vfX0sdWU9VEE7ZnVuY3Rpb24gT3QoQSxlLHQscixvKXtBW3IrdCplXT1vfXZhciBmZT1PdDt2YXIgR0E9Y2xhc3N7aW1hZ2VUeXBlO25hbWU9IkltYWdlIjtvcmlnaW47c3BhY2luZztkaXJlY3Rpb247c2l6ZTttZXRhZGF0YTtkYXRhO2NvbnN0cnVjdG9yKGU9bmV3IHVlKXt0aGlzLmltYWdlVHlwZT1lO2xldCB0PWUuZGltZW5zaW9uO3RoaXMub3JpZ2luPW5ldyBBcnJheSh0KSx0aGlzLm9yaWdpbi5maWxsKDApLHRoaXMuc3BhY2luZz1uZXcgQXJyYXkodCksdGhpcy5zcGFjaW5nLmZpbGwoMSksdGhpcy5kaXJlY3Rpb249bmV3IEZsb2F0NjRBcnJheSh0KnQpLHRoaXMuZGlyZWN0aW9uLmZpbGwoMCk7Zm9yKGxldCByPTA7cjx0O3IrKylmZSh0aGlzLmRpcmVjdGlvbix0LHIsciwxKTt0aGlzLnNpemU9bmV3IEFycmF5KHQpLHRoaXMuc2l6ZS5maWxsKDApLHRoaXMubWV0YWRhdGE9bmV3IE1hcCx0aGlzLmRhdGE9bnVsbH19LFBBPUdBO3ZhciBMQT1jbGFzc3tkaW1lbnNpb247cG9pbnRDb21wb25lbnRUeXBlO3BvaW50UGl4ZWxDb21wb25lbnRUeXBlO3BvaW50UGl4ZWxUeXBlO3BvaW50UGl4ZWxDb21wb25lbnRzO2NlbGxDb21wb25lbnRUeXBlO2NlbGxQaXhlbENvbXBvbmVudFR5cGU7Y2VsbFBpeGVsVHlwZTtjZWxsUGl4ZWxDb21wb25lbnRzO2NvbnN0cnVjdG9yKGU9Mix0PWsuRmxvYXQzMixyPWsuRmxvYXQzMixvPUcuU2NhbGFyLG49MSxpPXkuSW50MzIsZz1rLkZsb2F0MzIsbD1HLlNjYWxhcixCPTEpe3RoaXMuZGltZW5zaW9uPWUsdGhpcy5wb2ludENvbXBvbmVudFR5cGU9dCx0aGlzLnBvaW50UGl4ZWxDb21wb25lbnRUeXBlPXIsdGhpcy5wb2ludFBpeGVsVHlwZT1vLHRoaXMucG9pbnRQaXhlbENvbXBvbmVudHM9bix0aGlzLmNlbGxDb21wb25lbnRUeXBlPWksdGhpcy5jZWxsUGl4ZWxDb21wb25lbnRUeXBlPWcsdGhpcy5jZWxsUGl4ZWxUeXBlPWwsdGhpcy5jZWxsUGl4ZWxDb21wb25lbnRzPUJ9fSxwZT1MQTt2YXIgeEE9Y2xhc3N7bWVzaFR5cGU7bmFtZT0iTWVzaCI7bnVtYmVyT2ZQb2ludHM7cG9pbnRzO251bWJlck9mUG9pbnRQaXhlbHM7cG9pbnREYXRhO251bWJlck9mQ2VsbHM7Y2VsbHM7Y2VsbEJ1ZmZlclNpemU7bnVtYmVyT2ZDZWxsUGl4ZWxzO2NlbGxEYXRhO2NvbnN0cnVjdG9yKGU9bmV3IHBlKXt0aGlzLm1lc2hUeXBlPWUsdGhpcy5uYW1lPSJNZXNoIix0aGlzLm51bWJlck9mUG9pbnRzPTAsdGhpcy5wb2ludHM9bnVsbCx0aGlzLm51bWJlck9mUG9pbnRQaXhlbHM9MCx0aGlzLnBvaW50RGF0YT1udWxsLHRoaXMubnVtYmVyT2ZDZWxscz0wLHRoaXMuY2VsbEJ1ZmZlclNpemU9MCx0aGlzLmNlbGxzPW51bGwsdGhpcy5udW1iZXJPZkNlbGxQaXhlbHM9MCx0aGlzLmNlbGxEYXRhPW51bGx9fSxPQT14QTt2YXIgSkE9Y2xhc3N7cG9pbnRQaXhlbENvbXBvbmVudFR5cGU7cG9pbnRQaXhlbFR5cGU7cG9pbnRQaXhlbENvbXBvbmVudHM7Y2VsbFBpeGVsQ29tcG9uZW50VHlwZTtjZWxsUGl4ZWxUeXBlO2NlbGxQaXhlbENvbXBvbmVudHM7Y29uc3RydWN0b3IoZT1rLkZsb2F0MzIsdD1HLlNjYWxhcixyPTEsbz1rLkZsb2F0MzIsbj1HLlNjYWxhcixpPTEpe3RoaXMucG9pbnRQaXhlbENvbXBvbmVudFR5cGU9ZSx0aGlzLnBvaW50UGl4ZWxUeXBlPXQsdGhpcy5wb2ludFBpeGVsQ29tcG9uZW50cz1yLHRoaXMuY2VsbFBpeGVsQ29tcG9uZW50VHlwZT1vLHRoaXMuY2VsbFBpeGVsVHlwZT1uLHRoaXMuY2VsbFBpeGVsQ29tcG9uZW50cz1pfX0sZGU9SkE7dmFyIE1BPWNsYXNze3BvbHlEYXRhVHlwZTtuYW1lPSJQb2x5RGF0YSI7bnVtYmVyT2ZQb2ludHM7cG9pbnRzO3ZlcnRpY2VzQnVmZmVyU2l6ZTt2ZXJ0aWNlcztsaW5lc0J1ZmZlclNpemU7bGluZXM7cG9seWdvbnNCdWZmZXJTaXplO3BvbHlnb25zO3RyaWFuZ2xlU3RyaXBzQnVmZmVyU2l6ZTt0cmlhbmdsZVN0cmlwcztudW1iZXJPZlBvaW50UGl4ZWxzO3BvaW50RGF0YTtudW1iZXJPZkNlbGxQaXhlbHM7Y2VsbERhdGE7Y29uc3RydWN0b3IoZT1uZXcgZGUpe3RoaXMucG9seURhdGFUeXBlPWUsdGhpcy5wb2x5RGF0YVR5cGU9ZSx0aGlzLm5hbWU9IlBvbHlEYXRhIix0aGlzLm51bWJlck9mUG9pbnRzPTAsdGhpcy5wb2ludHM9bmV3IEZsb2F0MzJBcnJheSx0aGlzLnZlcnRpY2VzQnVmZmVyU2l6ZT0wLHRoaXMudmVydGljZXM9bnVsbCx0aGlzLmxpbmVzQnVmZmVyU2l6ZT0wLHRoaXMubGluZXM9bnVsbCx0aGlzLnBvbHlnb25zQnVmZmVyU2l6ZT0wLHRoaXMucG9seWdvbnM9bnVsbCx0aGlzLnRyaWFuZ2xlU3RyaXBzQnVmZmVyU2l6ZT0wLHRoaXMudHJpYW5nbGVTdHJpcHM9bnVsbCx0aGlzLm51bWJlck9mUG9pbnRQaXhlbHM9MCx0aGlzLnBvaW50RGF0YT1udWxsLHRoaXMubnVtYmVyT2ZDZWxsUGl4ZWxzPTAsdGhpcy5jZWxsRGF0YT1udWxsfX0sSEE9TUE7dmFyIEp0PXtUZXh0RmlsZToiVGV4dEZpbGUiLEJpbmFyeUZpbGU6IkJpbmFyeUZpbGUiLFRleHRTdHJlYW06IlRleHRTdHJlYW0iLEJpbmFyeVN0cmVhbToiQmluYXJ5U3RyZWFtIixJbWFnZToiSW1hZ2UiLFBvaW50U2V0OiJQb2ludFNldCIsTWVzaDoiTWVzaCIsUG9seURhdGE6IlBvbHlEYXRhIixUcmFuc2Zvcm06IlRyYW5zZm9ybSIsSnNvbkNvbXBhdGlibGU6Ikpzb25Db21wYXRpYmxlIn0scD1KdDt2YXIgeWU9U3ltYm9sKCJDb21saW5rLnByb3h5IiksTXQ9U3ltYm9sKCJDb21saW5rLmVuZHBvaW50IiksS0E9U3ltYm9sKCJDb21saW5rLnJlbGVhc2VQcm94eSIpLFlBPVN5bWJvbCgiQ29tbGluay5maW5hbGl6ZXIiKSxJQT1TeW1ib2woIkNvbWxpbmsudGhyb3duIiksaGU9QT0+dHlwZW9mIEE9PSJvYmplY3QiJiZBIT09bnVsbHx8dHlwZW9mIEE9PSJmdW5jdGlvbiIsSHQ9e2NhbkhhbmRsZTpBPT5oZShBKSYmQVt5ZV0sc2VyaWFsaXplKEEpe2xldHtwb3J0MTplLHBvcnQyOnR9PW5ldyBNZXNzYWdlQ2hhbm5lbDtyZXR1cm4gRGUoQSxlKSxbdCxbdF1dfSxkZXNlcmlhbGl6ZShBKXtyZXR1cm4gQS5zdGFydCgpLFdBKEEpfX0sWXQ9e2NhbkhhbmRsZTpBPT5oZShBKSYmSUEgaW4gQSxzZXJpYWxpemUoe3ZhbHVlOkF9KXtsZXQgZTtyZXR1cm4gQSBpbnN0YW5jZW9mIEVycm9yP2U9e2lzRXJyb3I6ITAsdmFsdWU6e21lc3NhZ2U6QS5tZXNzYWdlLG5hbWU6QS5uYW1lLHN0YWNrOkEuc3RhY2t9fTplPXtpc0Vycm9yOiExLHZhbHVlOkF9LFtlLFtdXX0sZGVzZXJpYWxpemUoQSl7dGhyb3cgQS5pc0Vycm9yP09iamVjdC5hc3NpZ24obmV3IEVycm9yKEEudmFsdWUubWVzc2FnZSksQS52YWx1ZSk6QS52YWx1ZX19LHdlPW5ldyBNYXAoW1sicHJveHkiLEh0XSxbInRocm93IixZdF1dKTtmdW5jdGlvbiBxdChBLGUpe2ZvcihsZXQgdCBvZiBBKWlmKGU9PT10fHx0PT09IioifHx0IGluc3RhbmNlb2YgUmVnRXhwJiZ0LnRlc3QoZSkpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gRGUoQSxlPWdsb2JhbFRoaXMsdD1bIioiXSl7ZS5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbiByKG8pe2lmKCFvfHwhby5kYXRhKXJldHVybjtpZighcXQodCxvLm9yaWdpbikpe2NvbnNvbGUud2FybihgSW52YWxpZCBvcmlnaW4gJyR7by5vcmlnaW59JyBmb3IgY29tbGluayBwcm94eWApO3JldHVybn1sZXR7aWQ6bix0eXBlOmkscGF0aDpnfT1PYmplY3QuYXNzaWduKHtwYXRoOltdfSxvLmRhdGEpLGw9KG8uZGF0YS5hcmd1bWVudExpc3R8fFtdKS5tYXAoTyksQjt0cnl7bGV0IEk9Zy5zbGljZSgwLC0xKS5yZWR1Y2UoKFEsQyk9PlFbQ10sQSkscz1nLnJlZHVjZSgoUSxDKT0+UVtDXSxBKTtzd2l0Y2goaSl7Y2FzZSJHRVQiOkI9czticmVhaztjYXNlIlNFVCI6SVtnLnNsaWNlKC0xKVswXV09TyhvLmRhdGEudmFsdWUpLEI9ITA7YnJlYWs7Y2FzZSJBUFBMWSI6Qj1zLmFwcGx5KEksbCk7YnJlYWs7Y2FzZSJDT05TVFJVQ1QiOntsZXQgUT1uZXcgcyguLi5sKTtCPV90KFEpfWJyZWFrO2Nhc2UiRU5EUE9JTlQiOntsZXR7cG9ydDE6USxwb3J0MjpDfT1uZXcgTWVzc2FnZUNoYW5uZWw7RGUoQSxDKSxCPXZBKFEsW1FdKX1icmVhaztjYXNlIlJFTEVBU0UiOkI9dm9pZCAwO2JyZWFrO2RlZmF1bHQ6cmV0dXJufX1jYXRjaChJKXtCPXt2YWx1ZTpJLFtJQV06MH19UHJvbWlzZS5yZXNvbHZlKEIpLmNhdGNoKEk9Pih7dmFsdWU6SSxbSUFdOjB9KSkudGhlbihJPT57bGV0W3MsUV09QkEoSSk7ZS5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30scykse2lkOm59KSxRKSxpPT09IlJFTEVBU0UiJiYoZS5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixyKSxTZShlKSxZQSBpbiBBJiZ0eXBlb2YgQVtZQV09PSJmdW5jdGlvbiImJkFbWUFdKCkpfSkuY2F0Y2goST0+e2xldFtzLFFdPUJBKHt2YWx1ZTpuZXcgVHlwZUVycm9yKCJVbnNlcmlhbGl6YWJsZSByZXR1cm4gdmFsdWUiKSxbSUFdOjB9KTtlLnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxzKSx7aWQ6bn0pLFEpfSl9KSxlLnN0YXJ0JiZlLnN0YXJ0KCl9ZnVuY3Rpb24gS3QoQSl7cmV0dXJuIEEuY29uc3RydWN0b3IubmFtZT09PSJNZXNzYWdlUG9ydCJ9ZnVuY3Rpb24gU2UoQSl7S3QoQSkmJkEuY2xvc2UoKX1mdW5jdGlvbiBXQShBLGUpe3JldHVybiBxQShBLFtdLGUpfWZ1bmN0aW9uIGFBKEEpe2lmKEEpdGhyb3cgbmV3IEVycm9yKCJQcm94eSBoYXMgYmVlbiByZWxlYXNlZCBhbmQgaXMgbm90IHVzZWFibGUiKX1mdW5jdGlvbiBiZShBKXtyZXR1cm4gTShBLHt0eXBlOiJSRUxFQVNFIn0pLnRoZW4oKCk9PntTZShBKX0pfXZhciBnQT1uZXcgV2Vha01hcCxDQT0iRmluYWxpemF0aW9uUmVnaXN0cnkiaW4gZ2xvYmFsVGhpcyYmbmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KEE9PntsZXQgZT0oZ0EuZ2V0KEEpfHwwKS0xO2dBLnNldChBLGUpLGU9PT0wJiZiZShBKX0pO2Z1bmN0aW9uIFd0KEEsZSl7bGV0IHQ9KGdBLmdldChlKXx8MCkrMTtnQS5zZXQoZSx0KSxDQSYmQ0EucmVnaXN0ZXIoQSxlLEEpfWZ1bmN0aW9uIHZ0KEEpe0NBJiZDQS51bnJlZ2lzdGVyKEEpfWZ1bmN0aW9uIHFBKEEsZT1bXSx0PWZ1bmN0aW9uKCl7fSl7bGV0IHI9ITEsbz1uZXcgUHJveHkodCx7Z2V0KG4saSl7aWYoYUEociksaT09PUtBKXJldHVybigpPT57dnQobyksYmUoQSkscj0hMH07aWYoaT09PSJ0aGVuIil7aWYoZS5sZW5ndGg9PT0wKXJldHVybnt0aGVuOigpPT5vfTtsZXQgZz1NKEEse3R5cGU6IkdFVCIscGF0aDplLm1hcChsPT5sLnRvU3RyaW5nKCkpfSkudGhlbihPKTtyZXR1cm4gZy50aGVuLmJpbmQoZyl9cmV0dXJuIHFBKEEsWy4uLmUsaV0pfSxzZXQobixpLGcpe2FBKHIpO2xldFtsLEJdPUJBKGcpO3JldHVybiBNKEEse3R5cGU6IlNFVCIscGF0aDpbLi4uZSxpXS5tYXAoST0+SS50b1N0cmluZygpKSx2YWx1ZTpsfSxCKS50aGVuKE8pfSxhcHBseShuLGksZyl7YUEocik7bGV0IGw9ZVtlLmxlbmd0aC0xXTtpZihsPT09TXQpcmV0dXJuIE0oQSx7dHlwZToiRU5EUE9JTlQifSkudGhlbihPKTtpZihsPT09ImJpbmQiKXJldHVybiBxQShBLGUuc2xpY2UoMCwtMSkpO2xldFtCLEldPW1lKGcpO3JldHVybiBNKEEse3R5cGU6IkFQUExZIixwYXRoOmUubWFwKHM9PnMudG9TdHJpbmcoKSksYXJndW1lbnRMaXN0OkJ9LEkpLnRoZW4oTyl9LGNvbnN0cnVjdChuLGkpe2FBKHIpO2xldFtnLGxdPW1lKGkpO3JldHVybiBNKEEse3R5cGU6IkNPTlNUUlVDVCIscGF0aDplLm1hcChCPT5CLnRvU3RyaW5nKCkpLGFyZ3VtZW50TGlzdDpnfSxsKS50aGVuKE8pfX0pO3JldHVybiBXdChvLEEpLG99ZnVuY3Rpb24ganQoQSl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sQSl9ZnVuY3Rpb24gbWUoQSl7bGV0IGU9QS5tYXAoQkEpO3JldHVybltlLm1hcCh0PT50WzBdKSxqdChlLm1hcCh0PT50WzFdKSldfXZhciBrZT1uZXcgV2Vha01hcDtmdW5jdGlvbiB2QShBLGUpe3JldHVybiBrZS5zZXQoQSxlKSxBfWZ1bmN0aW9uIF90KEEpe3JldHVybiBPYmplY3QuYXNzaWduKEEse1t5ZV06ITB9KX1mdW5jdGlvbiBCQShBKXtmb3IobGV0W2UsdF1vZiB3ZSlpZih0LmNhbkhhbmRsZShBKSl7bGV0W3Isb109dC5zZXJpYWxpemUoQSk7cmV0dXJuW3t0eXBlOiJIQU5ETEVSIixuYW1lOmUsdmFsdWU6cn0sb119cmV0dXJuW3t0eXBlOiJSQVciLHZhbHVlOkF9LGtlLmdldChBKXx8W11dfWZ1bmN0aW9uIE8oQSl7c3dpdGNoKEEudHlwZSl7Y2FzZSJIQU5ETEVSIjpyZXR1cm4gd2UuZ2V0KEEubmFtZSkuZGVzZXJpYWxpemUoQS52YWx1ZSk7Y2FzZSJSQVciOnJldHVybiBBLnZhbHVlfX1mdW5jdGlvbiBNKEEsZSx0KXtyZXR1cm4gbmV3IFByb21pc2Uocj0+e2xldCBvPXp0KCk7QS5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbiBuKGkpeyFpLmRhdGF8fCFpLmRhdGEuaWR8fGkuZGF0YS5pZCE9PW98fChBLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG4pLHIoaS5kYXRhKSl9KSxBLnN0YXJ0JiZBLnN0YXJ0KCksQS5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKHtpZDpvfSxlKSx0KX0pfWZ1bmN0aW9uIHp0KCl7cmV0dXJuIG5ldyBBcnJheSg0KS5maWxsKDApLm1hcCgoKT0+TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKk51bWJlci5NQVhfU0FGRV9JTlRFR0VSKS50b1N0cmluZygxNikpLmpvaW4oIi0iKX1mdW5jdGlvbiBaKEEsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIEEuYXBwbHkoZSxhcmd1bWVudHMpfX12YXJ7dG9TdHJpbmc6VnR9PU9iamVjdC5wcm90b3R5cGUse2dldFByb3RvdHlwZU9mOnpBfT1PYmplY3QsY0E9KEE9PmU9PntsZXQgdD1WdC5jYWxsKGUpO3JldHVybiBBW3RdfHwoQVt0XT10LnNsaWNlKDgsLTEpLnRvTG93ZXJDYXNlKCkpfSkoT2JqZWN0LmNyZWF0ZShudWxsKSksTj1BPT4oQT1BLnRvTG93ZXJDYXNlKCksZT0+Y0EoZSk9PT1BKSxFQT1BPT5lPT50eXBlb2YgZT09PUEse2lzQXJyYXk6SH09QXJyYXksWD1FQSgidW5kZWZpbmVkIik7ZnVuY3Rpb24gWnQoQSl7cmV0dXJuIEEhPT1udWxsJiYhWChBKSYmQS5jb25zdHJ1Y3RvciE9PW51bGwmJiFYKEEuY29uc3RydWN0b3IpJiZSKEEuY29uc3RydWN0b3IuaXNCdWZmZXIpJiZBLmNvbnN0cnVjdG9yLmlzQnVmZmVyKEEpfXZhciBOZT1OKCJBcnJheUJ1ZmZlciIpO2Z1bmN0aW9uIFh0KEEpe2xldCBlO3JldHVybiB0eXBlb2YgQXJyYXlCdWZmZXI8InUiJiZBcnJheUJ1ZmZlci5pc1ZpZXc/ZT1BcnJheUJ1ZmZlci5pc1ZpZXcoQSk6ZT1BJiZBLmJ1ZmZlciYmTmUoQS5idWZmZXIpLGV9dmFyICR0PUVBKCJzdHJpbmciKSxSPUVBKCJmdW5jdGlvbiIpLFRlPUVBKCJudW1iZXIiKSxRQT1BPT5BIT09bnVsbCYmdHlwZW9mIEE9PSJvYmplY3QiLEFyPUE9PkE9PT0hMHx8QT09PSExLGxBPUE9PntpZihjQShBKSE9PSJvYmplY3QiKXJldHVybiExO2xldCBlPXpBKEEpO3JldHVybihlPT09bnVsbHx8ZT09PU9iamVjdC5wcm90b3R5cGV8fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKT09PW51bGwpJiYhKFN5bWJvbC50b1N0cmluZ1RhZyBpbiBBKSYmIShTeW1ib2wuaXRlcmF0b3IgaW4gQSl9LGVyPU4oIkRhdGUiKSx0cj1OKCJGaWxlIikscnI9TigiQmxvYiIpLG9yPU4oIkZpbGVMaXN0IiksbnI9QT0+UUEoQSkmJlIoQS5waXBlKSxpcj1BPT57bGV0IGU7cmV0dXJuIEEmJih0eXBlb2YgRm9ybURhdGE9PSJmdW5jdGlvbiImJkEgaW5zdGFuY2VvZiBGb3JtRGF0YXx8UihBLmFwcGVuZCkmJigoZT1jQShBKSk9PT0iZm9ybWRhdGEifHxlPT09Im9iamVjdCImJlIoQS50b1N0cmluZykmJkEudG9TdHJpbmcoKT09PSJbb2JqZWN0IEZvcm1EYXRhXSIpKX0sc3I9TigiVVJMU2VhcmNoUGFyYW1zIiksYXI9QT0+QS50cmltP0EudHJpbSgpOkEucmVwbGFjZSgvXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2csIiIpO2Z1bmN0aW9uICQoQSxlLHthbGxPd25LZXlzOnQ9ITF9PXt9KXtpZihBPT09bnVsbHx8dHlwZW9mIEE+InUiKXJldHVybjtsZXQgcixvO2lmKHR5cGVvZiBBIT0ib2JqZWN0IiYmKEE9W0FdKSxIKEEpKWZvcihyPTAsbz1BLmxlbmd0aDtyPG87cisrKWUuY2FsbChudWxsLEFbcl0scixBKTtlbHNle2xldCBuPXQ/T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoQSk6T2JqZWN0LmtleXMoQSksaT1uLmxlbmd0aCxnO2ZvcihyPTA7cjxpO3IrKylnPW5bcl0sZS5jYWxsKG51bGwsQVtnXSxnLEEpfX1mdW5jdGlvbiBHZShBLGUpe2U9ZS50b0xvd2VyQ2FzZSgpO2xldCB0PU9iamVjdC5rZXlzKEEpLHI9dC5sZW5ndGgsbztmb3IoO3ItLSA+MDspaWYobz10W3JdLGU9PT1vLnRvTG93ZXJDYXNlKCkpcmV0dXJuIG87cmV0dXJuIG51bGx9dmFyIFBlPXR5cGVvZiBnbG9iYWxUaGlzPCJ1Ij9nbG9iYWxUaGlzOnR5cGVvZiBzZWxmPCJ1Ij9zZWxmOnR5cGVvZiB3aW5kb3c8InUiP3dpbmRvdzpnbG9iYWwsTGU9QT0+IVgoQSkmJkEhPT1QZTtmdW5jdGlvbiBfQSgpe2xldHtjYXNlbGVzczpBfT1MZSh0aGlzKSYmdGhpc3x8e30sZT17fSx0PShyLG8pPT57bGV0IG49QSYmR2UoZSxvKXx8bztsQShlW25dKSYmbEEocik/ZVtuXT1fQShlW25dLHIpOmxBKHIpP2Vbbl09X0Eoe30scik6SChyKT9lW25dPXIuc2xpY2UoKTplW25dPXJ9O2ZvcihsZXQgcj0wLG89YXJndW1lbnRzLmxlbmd0aDtyPG87cisrKWFyZ3VtZW50c1tyXSYmJChhcmd1bWVudHNbcl0sdCk7cmV0dXJuIGV9dmFyIElyPShBLGUsdCx7YWxsT3duS2V5czpyfT17fSk9PigkKGUsKG8sbik9Pnt0JiZSKG8pP0Fbbl09WihvLHQpOkFbbl09b30se2FsbE93bktleXM6cn0pLEEpLGdyPUE9PihBLmNoYXJDb2RlQXQoMCk9PT02NTI3OSYmKEE9QS5zbGljZSgxKSksQSksQ3I9KEEsZSx0LHIpPT57QS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSxyKSxBLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1BLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBLCJzdXBlciIse3ZhbHVlOmUucHJvdG90eXBlfSksdCYmT2JqZWN0LmFzc2lnbihBLnByb3RvdHlwZSx0KX0sQnI9KEEsZSx0LHIpPT57bGV0IG8sbixpLGc9e307aWYoZT1lfHx7fSxBPT1udWxsKXJldHVybiBlO2Rve2ZvcihvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKEEpLG49by5sZW5ndGg7bi0tID4wOylpPW9bbl0sKCFyfHxyKGksQSxlKSkmJiFnW2ldJiYoZVtpXT1BW2ldLGdbaV09ITApO0E9dCE9PSExJiZ6QShBKX13aGlsZShBJiYoIXR8fHQoQSxlKSkmJkEhPT1PYmplY3QucHJvdG90eXBlKTtyZXR1cm4gZX0sbHI9KEEsZSx0KT0+e0E9U3RyaW5nKEEpLCh0PT09dm9pZCAwfHx0PkEubGVuZ3RoKSYmKHQ9QS5sZW5ndGgpLHQtPWUubGVuZ3RoO2xldCByPUEuaW5kZXhPZihlLHQpO3JldHVybiByIT09LTEmJnI9PT10fSxjcj1BPT57aWYoIUEpcmV0dXJuIG51bGw7aWYoSChBKSlyZXR1cm4gQTtsZXQgZT1BLmxlbmd0aDtpZighVGUoZSkpcmV0dXJuIG51bGw7bGV0IHQ9bmV3IEFycmF5KGUpO2Zvcig7ZS0tID4wOyl0W2VdPUFbZV07cmV0dXJuIHR9LEVyPShBPT5lPT5BJiZlIGluc3RhbmNlb2YgQSkodHlwZW9mIFVpbnQ4QXJyYXk8InUiJiZ6QShVaW50OEFycmF5KSksUXI9KEEsZSk9PntsZXQgcj0oQSYmQVtTeW1ib2wuaXRlcmF0b3JdKS5jYWxsKEEpLG87Zm9yKDsobz1yLm5leHQoKSkmJiFvLmRvbmU7KXtsZXQgbj1vLnZhbHVlO2UuY2FsbChBLG5bMF0sblsxXSl9fSx1cj0oQSxlKT0+e2xldCB0LHI9W107Zm9yKDsodD1BLmV4ZWMoZSkpIT09bnVsbDspci5wdXNoKHQpO3JldHVybiByfSxmcj1OKCJIVE1MRm9ybUVsZW1lbnQiKSxwcj1BPT5BLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy1fXHNdKFthLXpcZF0pKFx3KikvZyxmdW5jdGlvbih0LHIsbyl7cmV0dXJuIHIudG9VcHBlckNhc2UoKStvfSksRmU9KCh7aGFzT3duUHJvcGVydHk6QX0pPT4oZSx0KT0+QS5jYWxsKGUsdCkpKE9iamVjdC5wcm90b3R5cGUpLGRyPU4oIlJlZ0V4cCIpLHhlPShBLGUpPT57bGV0IHQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoQSkscj17fTskKHQsKG8sbik9PntsZXQgaTsoaT1lKG8sbixBKSkhPT0hMSYmKHJbbl09aXx8byl9KSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhBLHIpfSxtcj1BPT57eGUoQSwoZSx0KT0+e2lmKFIoQSkmJlsiYXJndW1lbnRzIiwiY2FsbGVyIiwiY2FsbGVlIl0uaW5kZXhPZih0KSE9PS0xKXJldHVybiExO2xldCByPUFbdF07aWYoUihyKSl7aWYoZS5lbnVtZXJhYmxlPSExLCJ3cml0YWJsZSJpbiBlKXtlLndyaXRhYmxlPSExO3JldHVybn1lLnNldHx8KGUuc2V0PSgpPT57dGhyb3cgRXJyb3IoIkNhbiBub3QgcmV3cml0ZSByZWFkLW9ubHkgbWV0aG9kICciK3QrIiciKX0pfX0pfSx5cj0oQSxlKT0+e2xldCB0PXt9LHI9bz0+e28uZm9yRWFjaChuPT57dFtuXT0hMH0pfTtyZXR1cm4gSChBKT9yKEEpOnIoU3RyaW5nKEEpLnNwbGl0KGUpKSx0fSxocj0oKT0+e30sd3I9KEEsZSk9PihBPStBLE51bWJlci5pc0Zpbml0ZShBKT9BOmUpLGpBPSJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIsVWU9IjAxMjM0NTY3ODkiLE9lPXtESUdJVDpVZSxBTFBIQTpqQSxBTFBIQV9ESUdJVDpqQStqQS50b1VwcGVyQ2FzZSgpK1VlfSxEcj0oQT0xNixlPU9lLkFMUEhBX0RJR0lUKT0+e2xldCB0PSIiLHtsZW5ndGg6cn09ZTtmb3IoO0EtLTspdCs9ZVtNYXRoLnJhbmRvbSgpKnJ8MF07cmV0dXJuIHR9O2Z1bmN0aW9uIFNyKEEpe3JldHVybiEhKEEmJlIoQS5hcHBlbmQpJiZBW1N5bWJvbC50b1N0cmluZ1RhZ109PT0iRm9ybURhdGEiJiZBW1N5bWJvbC5pdGVyYXRvcl0pfXZhciBicj1BPT57bGV0IGU9bmV3IEFycmF5KDEwKSx0PShyLG8pPT57aWYoUUEocikpe2lmKGUuaW5kZXhPZihyKT49MClyZXR1cm47aWYoISgidG9KU09OImluIHIpKXtlW29dPXI7bGV0IG49SChyKT9bXTp7fTtyZXR1cm4gJChyLChpLGcpPT57bGV0IGw9dChpLG8rMSk7IVgobCkmJihuW2ddPWwpfSksZVtvXT12b2lkIDAsbn19cmV0dXJuIHJ9O3JldHVybiB0KEEsMCl9LGtyPU4oIkFzeW5jRnVuY3Rpb24iKSxScj1BPT5BJiYoUUEoQSl8fFIoQSkpJiZSKEEudGhlbikmJlIoQS5jYXRjaCksYT17aXNBcnJheTpILGlzQXJyYXlCdWZmZXI6TmUsaXNCdWZmZXI6WnQsaXNGb3JtRGF0YTppcixpc0FycmF5QnVmZmVyVmlldzpYdCxpc1N0cmluZzokdCxpc051bWJlcjpUZSxpc0Jvb2xlYW46QXIsaXNPYmplY3Q6UUEsaXNQbGFpbk9iamVjdDpsQSxpc1VuZGVmaW5lZDpYLGlzRGF0ZTplcixpc0ZpbGU6dHIsaXNCbG9iOnJyLGlzUmVnRXhwOmRyLGlzRnVuY3Rpb246Uixpc1N0cmVhbTpucixpc1VSTFNlYXJjaFBhcmFtczpzcixpc1R5cGVkQXJyYXk6RXIsaXNGaWxlTGlzdDpvcixmb3JFYWNoOiQsbWVyZ2U6X0EsZXh0ZW5kOklyLHRyaW06YXIsc3RyaXBCT006Z3IsaW5oZXJpdHM6Q3IsdG9GbGF0T2JqZWN0OkJyLGtpbmRPZjpjQSxraW5kT2ZUZXN0Ok4sZW5kc1dpdGg6bHIsdG9BcnJheTpjcixmb3JFYWNoRW50cnk6UXIsbWF0Y2hBbGw6dXIsaXNIVE1MRm9ybTpmcixoYXNPd25Qcm9wZXJ0eTpGZSxoYXNPd25Qcm9wOkZlLHJlZHVjZURlc2NyaXB0b3JzOnhlLGZyZWV6ZU1ldGhvZHM6bXIsdG9PYmplY3RTZXQ6eXIsdG9DYW1lbENhc2U6cHIsbm9vcDpocix0b0Zpbml0ZU51bWJlcjp3cixmaW5kS2V5OkdlLGdsb2JhbDpQZSxpc0NvbnRleHREZWZpbmVkOkxlLEFMUEhBQkVUOk9lLGdlbmVyYXRlU3RyaW5nOkRyLGlzU3BlY0NvbXBsaWFudEZvcm06U3IsdG9KU09OT2JqZWN0OmJyLGlzQXN5bmNGbjprcixpc1RoZW5hYmxlOlJyfTtmdW5jdGlvbiBZKEEsZSx0LHIsbyl7RXJyb3IuY2FsbCh0aGlzKSxFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT9FcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLHRoaXMuY29uc3RydWN0b3IpOnRoaXMuc3RhY2s9bmV3IEVycm9yKCkuc3RhY2ssdGhpcy5tZXNzYWdlPUEsdGhpcy5uYW1lPSJBeGlvc0Vycm9yIixlJiYodGhpcy5jb2RlPWUpLHQmJih0aGlzLmNvbmZpZz10KSxyJiYodGhpcy5yZXF1ZXN0PXIpLG8mJih0aGlzLnJlc3BvbnNlPW8pfWEuaW5oZXJpdHMoWSxFcnJvcix7dG9KU09OOmZ1bmN0aW9uKCl7cmV0dXJue21lc3NhZ2U6dGhpcy5tZXNzYWdlLG5hbWU6dGhpcy5uYW1lLGRlc2NyaXB0aW9uOnRoaXMuZGVzY3JpcHRpb24sbnVtYmVyOnRoaXMubnVtYmVyLGZpbGVOYW1lOnRoaXMuZmlsZU5hbWUsbGluZU51bWJlcjp0aGlzLmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOnRoaXMuY29sdW1uTnVtYmVyLHN0YWNrOnRoaXMuc3RhY2ssY29uZmlnOmEudG9KU09OT2JqZWN0KHRoaXMuY29uZmlnKSxjb2RlOnRoaXMuY29kZSxzdGF0dXM6dGhpcy5yZXNwb25zZSYmdGhpcy5yZXNwb25zZS5zdGF0dXM/dGhpcy5yZXNwb25zZS5zdGF0dXM6bnVsbH19fSk7dmFyIEplPVkucHJvdG90eXBlLE1lPXt9O1siRVJSX0JBRF9PUFRJT05fVkFMVUUiLCJFUlJfQkFEX09QVElPTiIsIkVDT05OQUJPUlRFRCIsIkVUSU1FRE9VVCIsIkVSUl9ORVRXT1JLIiwiRVJSX0ZSX1RPT19NQU5ZX1JFRElSRUNUUyIsIkVSUl9ERVBSRUNBVEVEIiwiRVJSX0JBRF9SRVNQT05TRSIsIkVSUl9CQURfUkVRVUVTVCIsIkVSUl9DQU5DRUxFRCIsIkVSUl9OT1RfU1VQUE9SVCIsIkVSUl9JTlZBTElEX1VSTCJdLmZvckVhY2goQT0+e01lW0FdPXt2YWx1ZTpBfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFksTWUpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShKZSwiaXNBeGlvc0Vycm9yIix7dmFsdWU6ITB9KTtZLmZyb209KEEsZSx0LHIsbyxuKT0+e2xldCBpPU9iamVjdC5jcmVhdGUoSmUpO3JldHVybiBhLnRvRmxhdE9iamVjdChBLGksZnVuY3Rpb24obCl7cmV0dXJuIGwhPT1FcnJvci5wcm90b3R5cGV9LGc9PmchPT0iaXNBeGlvc0Vycm9yIiksWS5jYWxsKGksQS5tZXNzYWdlLGUsdCxyLG8pLGkuY2F1c2U9QSxpLm5hbWU9QS5uYW1lLG4mJk9iamVjdC5hc3NpZ24oaSxuKSxpfTt2YXIgZj1ZO3ZhciB1QT1udWxsO2Z1bmN0aW9uIFZBKEEpe3JldHVybiBhLmlzUGxhaW5PYmplY3QoQSl8fGEuaXNBcnJheShBKX1mdW5jdGlvbiBZZShBKXtyZXR1cm4gYS5lbmRzV2l0aChBLCJbXSIpP0Euc2xpY2UoMCwtMik6QX1mdW5jdGlvbiBIZShBLGUsdCl7cmV0dXJuIEE/QS5jb25jYXQoZSkubWFwKGZ1bmN0aW9uKG8sbil7cmV0dXJuIG89WWUobyksIXQmJm4/IlsiK28rIl0iOm99KS5qb2luKHQ/Ii4iOiIiKTplfWZ1bmN0aW9uIEZyKEEpe3JldHVybiBhLmlzQXJyYXkoQSkmJiFBLnNvbWUoVkEpfXZhciBVcj1hLnRvRmxhdE9iamVjdChhLHt9LG51bGwsZnVuY3Rpb24oZSl7cmV0dXJuL15pc1tBLVpdLy50ZXN0KGUpfSk7ZnVuY3Rpb24gTnIoQSxlLHQpe2lmKCFhLmlzT2JqZWN0KEEpKXRocm93IG5ldyBUeXBlRXJyb3IoInRhcmdldCBtdXN0IGJlIGFuIG9iamVjdCIpO2U9ZXx8bmV3KHVBfHxGb3JtRGF0YSksdD1hLnRvRmxhdE9iamVjdCh0LHttZXRhVG9rZW5zOiEwLGRvdHM6ITEsaW5kZXhlczohMX0sITEsZnVuY3Rpb24oRSx1KXtyZXR1cm4hYS5pc1VuZGVmaW5lZCh1W0VdKX0pO2xldCByPXQubWV0YVRva2VucyxvPXQudmlzaXRvcnx8SSxuPXQuZG90cyxpPXQuaW5kZXhlcyxsPSh0LkJsb2J8fHR5cGVvZiBCbG9iPCJ1IiYmQmxvYikmJmEuaXNTcGVjQ29tcGxpYW50Rm9ybShlKTtpZighYS5pc0Z1bmN0aW9uKG8pKXRocm93IG5ldyBUeXBlRXJyb3IoInZpc2l0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uIik7ZnVuY3Rpb24gQihjKXtpZihjPT09bnVsbClyZXR1cm4iIjtpZihhLmlzRGF0ZShjKSlyZXR1cm4gYy50b0lTT1N0cmluZygpO2lmKCFsJiZhLmlzQmxvYihjKSl0aHJvdyBuZXcgZigiQmxvYiBpcyBub3Qgc3VwcG9ydGVkLiBVc2UgYSBCdWZmZXIgaW5zdGVhZC4iKTtyZXR1cm4gYS5pc0FycmF5QnVmZmVyKGMpfHxhLmlzVHlwZWRBcnJheShjKT9sJiZ0eXBlb2YgQmxvYj09ImZ1bmN0aW9uIj9uZXcgQmxvYihbY10pOkJ1ZmZlci5mcm9tKGMpOmN9ZnVuY3Rpb24gSShjLEUsdSl7bGV0IGQ9YztpZihjJiYhdSYmdHlwZW9mIGM9PSJvYmplY3QiKXtpZihhLmVuZHNXaXRoKEUsInt9IikpRT1yP0U6RS5zbGljZSgwLC0yKSxjPUpTT04uc3RyaW5naWZ5KGMpO2Vsc2UgaWYoYS5pc0FycmF5KGMpJiZGcihjKXx8KGEuaXNGaWxlTGlzdChjKXx8YS5lbmRzV2l0aChFLCJbXSIpKSYmKGQ9YS50b0FycmF5KGMpKSlyZXR1cm4gRT1ZZShFKSxkLmZvckVhY2goZnVuY3Rpb24oVSxGdCl7IShhLmlzVW5kZWZpbmVkKFUpfHxVPT09bnVsbCkmJmUuYXBwZW5kKGk9PT0hMD9IZShbRV0sRnQsbik6aT09PW51bGw/RTpFKyJbXSIsQihVKSl9KSwhMX1yZXR1cm4gVkEoYyk/ITA6KGUuYXBwZW5kKEhlKHUsRSxuKSxCKGMpKSwhMSl9bGV0IHM9W10sUT1PYmplY3QuYXNzaWduKFVyLHtkZWZhdWx0VmlzaXRvcjpJLGNvbnZlcnRWYWx1ZTpCLGlzVmlzaXRhYmxlOlZBfSk7ZnVuY3Rpb24gQyhjLEUpe2lmKCFhLmlzVW5kZWZpbmVkKGMpKXtpZihzLmluZGV4T2YoYykhPT0tMSl0aHJvdyBFcnJvcigiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGluICIrRS5qb2luKCIuIikpO3MucHVzaChjKSxhLmZvckVhY2goYyxmdW5jdGlvbihkLEYpeyghKGEuaXNVbmRlZmluZWQoZCl8fGQ9PT1udWxsKSYmby5jYWxsKGUsZCxhLmlzU3RyaW5nKEYpP0YudHJpbSgpOkYsRSxRKSk9PT0hMCYmQyhkLEU/RS5jb25jYXQoRik6W0ZdKX0pLHMucG9wKCl9fWlmKCFhLmlzT2JqZWN0KEEpKXRocm93IG5ldyBUeXBlRXJyb3IoImRhdGEgbXVzdCBiZSBhbiBvYmplY3QiKTtyZXR1cm4gQyhBKSxlfXZhciBQPU5yO2Z1bmN0aW9uIHFlKEEpe2xldCBlPXsiISI6IiUyMSIsIiciOiIlMjciLCIoIjoiJTI4IiwiKSI6IiUyOSIsIn4iOiIlN0UiLCIlMjAiOiIrIiwiJTAwIjoiXDAifTtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEEpLnJlcGxhY2UoL1shJygpfl18JTIwfCUwMC9nLGZ1bmN0aW9uKHIpe3JldHVybiBlW3JdfSl9ZnVuY3Rpb24gS2UoQSxlKXt0aGlzLl9wYWlycz1bXSxBJiZQKEEsdGhpcyxlKX12YXIgV2U9S2UucHJvdG90eXBlO1dlLmFwcGVuZD1mdW5jdGlvbihlLHQpe3RoaXMuX3BhaXJzLnB1c2goW2UsdF0pfTtXZS50b1N0cmluZz1mdW5jdGlvbihlKXtsZXQgdD1lP2Z1bmN0aW9uKHIpe3JldHVybiBlLmNhbGwodGhpcyxyLHFlKX06cWU7cmV0dXJuIHRoaXMuX3BhaXJzLm1hcChmdW5jdGlvbihvKXtyZXR1cm4gdChvWzBdKSsiPSIrdChvWzFdKX0sIiIpLmpvaW4oIiYiKX07dmFyIGZBPUtlO2Z1bmN0aW9uIFRyKEEpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoQSkucmVwbGFjZSgvJTNBL2dpLCI6IikucmVwbGFjZSgvJTI0L2csIiQiKS5yZXBsYWNlKC8lMkMvZ2ksIiwiKS5yZXBsYWNlKC8lMjAvZywiKyIpLnJlcGxhY2UoLyU1Qi9naSwiWyIpLnJlcGxhY2UoLyU1RC9naSwiXSIpfWZ1bmN0aW9uIEFBKEEsZSx0KXtpZighZSlyZXR1cm4gQTtsZXQgcj10JiZ0LmVuY29kZXx8VHIsbz10JiZ0LnNlcmlhbGl6ZSxuO2lmKG8/bj1vKGUsdCk6bj1hLmlzVVJMU2VhcmNoUGFyYW1zKGUpP2UudG9TdHJpbmcoKTpuZXcgZkEoZSx0KS50b1N0cmluZyhyKSxuKXtsZXQgaT1BLmluZGV4T2YoIiMiKTtpIT09LTEmJihBPUEuc2xpY2UoMCxpKSksQSs9KEEuaW5kZXhPZigiPyIpPT09LTE/Ij8iOiImIikrbn1yZXR1cm4gQX12YXIgWkE9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmhhbmRsZXJzPVtdfXVzZShlLHQscil7cmV0dXJuIHRoaXMuaGFuZGxlcnMucHVzaCh7ZnVsZmlsbGVkOmUscmVqZWN0ZWQ6dCxzeW5jaHJvbm91czpyP3Iuc3luY2hyb25vdXM6ITEscnVuV2hlbjpyP3IucnVuV2hlbjpudWxsfSksdGhpcy5oYW5kbGVycy5sZW5ndGgtMX1lamVjdChlKXt0aGlzLmhhbmRsZXJzW2VdJiYodGhpcy5oYW5kbGVyc1tlXT1udWxsKX1jbGVhcigpe3RoaXMuaGFuZGxlcnMmJih0aGlzLmhhbmRsZXJzPVtdKX1mb3JFYWNoKGUpe2EuZm9yRWFjaCh0aGlzLmhhbmRsZXJzLGZ1bmN0aW9uKHIpe3IhPT1udWxsJiZlKHIpfSl9fSxYQT1aQTt2YXIgcEE9e3NpbGVudEpTT05QYXJzaW5nOiEwLGZvcmNlZEpTT05QYXJzaW5nOiEwLGNsYXJpZnlUaW1lb3V0RXJyb3I6ITF9O3ZhciB2ZT10eXBlb2YgVVJMU2VhcmNoUGFyYW1zPCJ1Ij9VUkxTZWFyY2hQYXJhbXM6ZkE7dmFyIGplPXR5cGVvZiBGb3JtRGF0YTwidSI/Rm9ybURhdGE6bnVsbDt2YXIgX2U9dHlwZW9mIEJsb2I8InUiP0Jsb2I6bnVsbDt2YXIgemU9e2lzQnJvd3NlcjohMCxjbGFzc2VzOntVUkxTZWFyY2hQYXJhbXM6dmUsRm9ybURhdGE6amUsQmxvYjpfZX0scHJvdG9jb2xzOlsiaHR0cCIsImh0dHBzIiwiZmlsZSIsImJsb2IiLCJ1cmwiLCJkYXRhIl19O3ZhciAkQT17fTtOdCgkQSx7aGFzQnJvd3NlckVudjooKT0+VmUsaGFzU3RhbmRhcmRCcm93c2VyRW52OigpPT5HcixoYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnY6KCk9PlByfSk7dmFyIFZlPXR5cGVvZiB3aW5kb3c8InUiJiZ0eXBlb2YgZG9jdW1lbnQ8InUiLEdyPShBPT5WZSYmWyJSZWFjdE5hdGl2ZSIsIk5hdGl2ZVNjcmlwdCIsIk5TIl0uaW5kZXhPZihBKTwwKSh0eXBlb2YgbmF2aWdhdG9yPCJ1IiYmbmF2aWdhdG9yLnByb2R1Y3QpLFByPXR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZTwidSImJnNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZSYmdHlwZW9mIHNlbGYuaW1wb3J0U2NyaXB0cz09ImZ1bmN0aW9uIjt2YXIgRD17Li4uJEEsLi4uemV9O2Z1bmN0aW9uIEFlKEEsZSl7cmV0dXJuIFAoQSxuZXcgRC5jbGFzc2VzLlVSTFNlYXJjaFBhcmFtcyxPYmplY3QuYXNzaWduKHt2aXNpdG9yOmZ1bmN0aW9uKHQscixvLG4pe3JldHVybiBELmlzTm9kZSYmYS5pc0J1ZmZlcih0KT8odGhpcy5hcHBlbmQocix0LnRvU3RyaW5nKCJiYXNlNjQiKSksITEpOm4uZGVmYXVsdFZpc2l0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0sZSkpfWZ1bmN0aW9uIExyKEEpe3JldHVybiBhLm1hdGNoQWxsKC9cdyt8XFsoXHcqKV0vZyxBKS5tYXAoZT0+ZVswXT09PSJbXSI/IiI6ZVsxXXx8ZVswXSl9ZnVuY3Rpb24geHIoQSl7bGV0IGU9e30sdD1PYmplY3Qua2V5cyhBKSxyLG89dC5sZW5ndGgsbjtmb3Iocj0wO3I8bztyKyspbj10W3JdLGVbbl09QVtuXTtyZXR1cm4gZX1mdW5jdGlvbiBPcihBKXtmdW5jdGlvbiBlKHQscixvLG4pe2xldCBpPXRbbisrXTtpZihpPT09Il9fcHJvdG9fXyIpcmV0dXJuITA7bGV0IGc9TnVtYmVyLmlzRmluaXRlKCtpKSxsPW4+PXQubGVuZ3RoO3JldHVybiBpPSFpJiZhLmlzQXJyYXkobyk/by5sZW5ndGg6aSxsPyhhLmhhc093blByb3AobyxpKT9vW2ldPVtvW2ldLHJdOm9baV09ciwhZyk6KCghb1tpXXx8IWEuaXNPYmplY3Qob1tpXSkpJiYob1tpXT1bXSksZSh0LHIsb1tpXSxuKSYmYS5pc0FycmF5KG9baV0pJiYob1tpXT14cihvW2ldKSksIWcpfWlmKGEuaXNGb3JtRGF0YShBKSYmYS5pc0Z1bmN0aW9uKEEuZW50cmllcykpe2xldCB0PXt9O3JldHVybiBhLmZvckVhY2hFbnRyeShBLChyLG8pPT57ZShMcihyKSxvLHQsMCl9KSx0fXJldHVybiBudWxsfXZhciBkQT1PcjtmdW5jdGlvbiBKcihBLGUsdCl7aWYoYS5pc1N0cmluZyhBKSl0cnl7cmV0dXJuKGV8fEpTT04ucGFyc2UpKEEpLGEudHJpbShBKX1jYXRjaChyKXtpZihyLm5hbWUhPT0iU3ludGF4RXJyb3IiKXRocm93IHJ9cmV0dXJuKHR8fEpTT04uc3RyaW5naWZ5KShBKX12YXIgZWU9e3RyYW5zaXRpb25hbDpwQSxhZGFwdGVyOlsieGhyIiwiaHR0cCJdLHRyYW5zZm9ybVJlcXVlc3Q6W2Z1bmN0aW9uKGUsdCl7bGV0IHI9dC5nZXRDb250ZW50VHlwZSgpfHwiIixvPXIuaW5kZXhPZigiYXBwbGljYXRpb24vanNvbiIpPi0xLG49YS5pc09iamVjdChlKTtpZihuJiZhLmlzSFRNTEZvcm0oZSkmJihlPW5ldyBGb3JtRGF0YShlKSksYS5pc0Zvcm1EYXRhKGUpKXJldHVybiBvP0pTT04uc3RyaW5naWZ5KGRBKGUpKTplO2lmKGEuaXNBcnJheUJ1ZmZlcihlKXx8YS5pc0J1ZmZlcihlKXx8YS5pc1N0cmVhbShlKXx8YS5pc0ZpbGUoZSl8fGEuaXNCbG9iKGUpKXJldHVybiBlO2lmKGEuaXNBcnJheUJ1ZmZlclZpZXcoZSkpcmV0dXJuIGUuYnVmZmVyO2lmKGEuaXNVUkxTZWFyY2hQYXJhbXMoZSkpcmV0dXJuIHQuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04IiwhMSksZS50b1N0cmluZygpO2xldCBnO2lmKG4pe2lmKHIuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik+LTEpcmV0dXJuIEFlKGUsdGhpcy5mb3JtU2VyaWFsaXplcikudG9TdHJpbmcoKTtpZigoZz1hLmlzRmlsZUxpc3QoZSkpfHxyLmluZGV4T2YoIm11bHRpcGFydC9mb3JtLWRhdGEiKT4tMSl7bGV0IGw9dGhpcy5lbnYmJnRoaXMuZW52LkZvcm1EYXRhO3JldHVybiBQKGc/eyJmaWxlc1tdIjplfTplLGwmJm5ldyBsLHRoaXMuZm9ybVNlcmlhbGl6ZXIpfX1yZXR1cm4gbnx8bz8odC5zZXRDb250ZW50VHlwZSgiYXBwbGljYXRpb24vanNvbiIsITEpLEpyKGUpKTplfV0sdHJhbnNmb3JtUmVzcG9uc2U6W2Z1bmN0aW9uKGUpe2xldCB0PXRoaXMudHJhbnNpdGlvbmFsfHxlZS50cmFuc2l0aW9uYWwscj10JiZ0LmZvcmNlZEpTT05QYXJzaW5nLG89dGhpcy5yZXNwb25zZVR5cGU9PT0ianNvbiI7aWYoZSYmYS5pc1N0cmluZyhlKSYmKHImJiF0aGlzLnJlc3BvbnNlVHlwZXx8bykpe2xldCBpPSEodCYmdC5zaWxlbnRKU09OUGFyc2luZykmJm87dHJ5e3JldHVybiBKU09OLnBhcnNlKGUpfWNhdGNoKGcpe2lmKGkpdGhyb3cgZy5uYW1lPT09IlN5bnRheEVycm9yIj9mLmZyb20oZyxmLkVSUl9CQURfUkVTUE9OU0UsdGhpcyxudWxsLHRoaXMucmVzcG9uc2UpOmd9fXJldHVybiBlfV0sdGltZW91dDowLHhzcmZDb29raWVOYW1lOiJYU1JGLVRPS0VOIix4c3JmSGVhZGVyTmFtZToiWC1YU1JGLVRPS0VOIixtYXhDb250ZW50TGVuZ3RoOi0xLG1heEJvZHlMZW5ndGg6LTEsZW52OntGb3JtRGF0YTpELmNsYXNzZXMuRm9ybURhdGEsQmxvYjpELmNsYXNzZXMuQmxvYn0sdmFsaWRhdGVTdGF0dXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU+PTIwMCYmZTwzMDB9LGhlYWRlcnM6e2NvbW1vbjp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyoiLCJDb250ZW50LVR5cGUiOnZvaWQgMH19fTthLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwicG9zdCIsInB1dCIsInBhdGNoIl0sQT0+e2VlLmhlYWRlcnNbQV09e319KTt2YXIgcT1lZTt2YXIgTXI9YS50b09iamVjdFNldChbImFnZSIsImF1dGhvcml6YXRpb24iLCJjb250ZW50LWxlbmd0aCIsImNvbnRlbnQtdHlwZSIsImV0YWciLCJleHBpcmVzIiwiZnJvbSIsImhvc3QiLCJpZi1tb2RpZmllZC1zaW5jZSIsImlmLXVubW9kaWZpZWQtc2luY2UiLCJsYXN0LW1vZGlmaWVkIiwibG9jYXRpb24iLCJtYXgtZm9yd2FyZHMiLCJwcm94eS1hdXRob3JpemF0aW9uIiwicmVmZXJlciIsInJldHJ5LWFmdGVyIiwidXNlci1hZ2VudCJdKSxaZT1BPT57bGV0IGU9e30sdCxyLG87cmV0dXJuIEEmJkEuc3BsaXQoYApgKS5mb3JFYWNoKGZ1bmN0aW9uKGkpe289aS5pbmRleE9mKCI6IiksdD1pLnN1YnN0cmluZygwLG8pLnRyaW0oKS50b0xvd2VyQ2FzZSgpLHI9aS5zdWJzdHJpbmcobysxKS50cmltKCksISghdHx8ZVt0XSYmTXJbdF0pJiYodD09PSJzZXQtY29va2llIj9lW3RdP2VbdF0ucHVzaChyKTplW3RdPVtyXTplW3RdPWVbdF0/ZVt0XSsiLCAiK3I6cil9KSxlfTt2YXIgWGU9U3ltYm9sKCJpbnRlcm5hbHMiKTtmdW5jdGlvbiBlQShBKXtyZXR1cm4gQSYmU3RyaW5nKEEpLnRyaW0oKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIG1BKEEpe3JldHVybiBBPT09ITF8fEE9PW51bGw/QTphLmlzQXJyYXkoQSk/QS5tYXAobUEpOlN0cmluZyhBKX1mdW5jdGlvbiBIcihBKXtsZXQgZT1PYmplY3QuY3JlYXRlKG51bGwpLHQ9LyhbXlxzLDs9XSspXHMqKD86PVxzKihbXiw7XSspKT8vZyxyO2Zvcig7cj10LmV4ZWMoQSk7KWVbclsxXV09clsyXTtyZXR1cm4gZX12YXIgWXI9QT0+L15bLV9hLXpBLVowLTleYHx+LCEjJCUmJyorLl0rJC8udGVzdChBLnRyaW0oKSk7ZnVuY3Rpb24gdGUoQSxlLHQscixvKXtpZihhLmlzRnVuY3Rpb24ocikpcmV0dXJuIHIuY2FsbCh0aGlzLGUsdCk7aWYobyYmKGU9dCksISFhLmlzU3RyaW5nKGUpKXtpZihhLmlzU3RyaW5nKHIpKXJldHVybiBlLmluZGV4T2YocikhPT0tMTtpZihhLmlzUmVnRXhwKHIpKXJldHVybiByLnRlc3QoZSl9fWZ1bmN0aW9uIHFyKEEpe3JldHVybiBBLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoLyhbYS16XGRdKShcdyopL2csKGUsdCxyKT0+dC50b1VwcGVyQ2FzZSgpK3IpfWZ1bmN0aW9uIEtyKEEsZSl7bGV0IHQ9YS50b0NhbWVsQ2FzZSgiICIrZSk7WyJnZXQiLCJzZXQiLCJoYXMiXS5mb3JFYWNoKHI9PntPYmplY3QuZGVmaW5lUHJvcGVydHkoQSxyK3Qse3ZhbHVlOmZ1bmN0aW9uKG8sbixpKXtyZXR1cm4gdGhpc1tyXS5jYWxsKHRoaXMsZSxvLG4saSl9LGNvbmZpZ3VyYWJsZTohMH0pfSl9dmFyIEs9Y2xhc3N7Y29uc3RydWN0b3IoZSl7ZSYmdGhpcy5zZXQoZSl9c2V0KGUsdCxyKXtsZXQgbz10aGlzO2Z1bmN0aW9uIG4oZyxsLEIpe2xldCBJPWVBKGwpO2lmKCFJKXRocm93IG5ldyBFcnJvcigiaGVhZGVyIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmciKTtsZXQgcz1hLmZpbmRLZXkobyxJKTsoIXN8fG9bc109PT12b2lkIDB8fEI9PT0hMHx8Qj09PXZvaWQgMCYmb1tzXSE9PSExKSYmKG9bc3x8bF09bUEoZykpfWxldCBpPShnLGwpPT5hLmZvckVhY2goZywoQixJKT0+bihCLEksbCkpO3JldHVybiBhLmlzUGxhaW5PYmplY3QoZSl8fGUgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yP2koZSx0KTphLmlzU3RyaW5nKGUpJiYoZT1lLnRyaW0oKSkmJiFZcihlKT9pKFplKGUpLHQpOmUhPW51bGwmJm4odCxlLHIpLHRoaXN9Z2V0KGUsdCl7aWYoZT1lQShlKSxlKXtsZXQgcj1hLmZpbmRLZXkodGhpcyxlKTtpZihyKXtsZXQgbz10aGlzW3JdO2lmKCF0KXJldHVybiBvO2lmKHQ9PT0hMClyZXR1cm4gSHIobyk7aWYoYS5pc0Z1bmN0aW9uKHQpKXJldHVybiB0LmNhbGwodGhpcyxvLHIpO2lmKGEuaXNSZWdFeHAodCkpcmV0dXJuIHQuZXhlYyhvKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJwYXJzZXIgbXVzdCBiZSBib29sZWFufHJlZ2V4cHxmdW5jdGlvbiIpfX19aGFzKGUsdCl7aWYoZT1lQShlKSxlKXtsZXQgcj1hLmZpbmRLZXkodGhpcyxlKTtyZXR1cm4hIShyJiZ0aGlzW3JdIT09dm9pZCAwJiYoIXR8fHRlKHRoaXMsdGhpc1tyXSxyLHQpKSl9cmV0dXJuITF9ZGVsZXRlKGUsdCl7bGV0IHI9dGhpcyxvPSExO2Z1bmN0aW9uIG4oaSl7aWYoaT1lQShpKSxpKXtsZXQgZz1hLmZpbmRLZXkocixpKTtnJiYoIXR8fHRlKHIscltnXSxnLHQpKSYmKGRlbGV0ZSByW2ddLG89ITApfX1yZXR1cm4gYS5pc0FycmF5KGUpP2UuZm9yRWFjaChuKTpuKGUpLG99Y2xlYXIoZSl7bGV0IHQ9T2JqZWN0LmtleXModGhpcykscj10Lmxlbmd0aCxvPSExO2Zvcig7ci0tOyl7bGV0IG49dFtyXTsoIWV8fHRlKHRoaXMsdGhpc1tuXSxuLGUsITApKSYmKGRlbGV0ZSB0aGlzW25dLG89ITApfXJldHVybiBvfW5vcm1hbGl6ZShlKXtsZXQgdD10aGlzLHI9e307cmV0dXJuIGEuZm9yRWFjaCh0aGlzLChvLG4pPT57bGV0IGk9YS5maW5kS2V5KHIsbik7aWYoaSl7dFtpXT1tQShvKSxkZWxldGUgdFtuXTtyZXR1cm59bGV0IGc9ZT9xcihuKTpTdHJpbmcobikudHJpbSgpO2chPT1uJiZkZWxldGUgdFtuXSx0W2ddPW1BKG8pLHJbZ109ITB9KSx0aGlzfWNvbmNhdCguLi5lKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5jb25jYXQodGhpcywuLi5lKX10b0pTT04oZSl7bGV0IHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gYS5mb3JFYWNoKHRoaXMsKHIsbyk9PntyIT1udWxsJiZyIT09ITEmJih0W29dPWUmJmEuaXNBcnJheShyKT9yLmpvaW4oIiwgIik6cil9KSx0fVtTeW1ib2wuaXRlcmF0b3JdKCl7cmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMudG9KU09OKCkpW1N5bWJvbC5pdGVyYXRvcl0oKX10b1N0cmluZygpe3JldHVybiBPYmplY3QuZW50cmllcyh0aGlzLnRvSlNPTigpKS5tYXAoKFtlLHRdKT0+ZSsiOiAiK3QpLmpvaW4oYApgKX1nZXRbU3ltYm9sLnRvU3RyaW5nVGFnXSgpe3JldHVybiJBeGlvc0hlYWRlcnMifXN0YXRpYyBmcm9tKGUpe3JldHVybiBlIGluc3RhbmNlb2YgdGhpcz9lOm5ldyB0aGlzKGUpfXN0YXRpYyBjb25jYXQoZSwuLi50KXtsZXQgcj1uZXcgdGhpcyhlKTtyZXR1cm4gdC5mb3JFYWNoKG89PnIuc2V0KG8pKSxyfXN0YXRpYyBhY2Nlc3NvcihlKXtsZXQgcj0odGhpc1tYZV09dGhpc1tYZV09e2FjY2Vzc29yczp7fX0pLmFjY2Vzc29ycyxvPXRoaXMucHJvdG90eXBlO2Z1bmN0aW9uIG4oaSl7bGV0IGc9ZUEoaSk7cltnXXx8KEtyKG8saSkscltnXT0hMCl9cmV0dXJuIGEuaXNBcnJheShlKT9lLmZvckVhY2gobik6bihlKSx0aGlzfX07Sy5hY2Nlc3NvcihbIkNvbnRlbnQtVHlwZSIsIkNvbnRlbnQtTGVuZ3RoIiwiQWNjZXB0IiwiQWNjZXB0LUVuY29kaW5nIiwiVXNlci1BZ2VudCIsIkF1dGhvcml6YXRpb24iXSk7YS5yZWR1Y2VEZXNjcmlwdG9ycyhLLnByb3RvdHlwZSwoe3ZhbHVlOkF9LGUpPT57bGV0IHQ9ZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSk7cmV0dXJue2dldDooKT0+QSxzZXQocil7dGhpc1t0XT1yfX19KTthLmZyZWV6ZU1ldGhvZHMoSyk7dmFyIFM9SztmdW5jdGlvbiB0QShBLGUpe2xldCB0PXRoaXN8fHEscj1lfHx0LG89Uy5mcm9tKHIuaGVhZGVycyksbj1yLmRhdGE7cmV0dXJuIGEuZm9yRWFjaChBLGZ1bmN0aW9uKGcpe249Zy5jYWxsKHQsbixvLm5vcm1hbGl6ZSgpLGU/ZS5zdGF0dXM6dm9pZCAwKX0pLG8ubm9ybWFsaXplKCksbn1mdW5jdGlvbiByQShBKXtyZXR1cm4hIShBJiZBLl9fQ0FOQ0VMX18pfWZ1bmN0aW9uICRlKEEsZSx0KXtmLmNhbGwodGhpcyxBPz8iY2FuY2VsZWQiLGYuRVJSX0NBTkNFTEVELGUsdCksdGhpcy5uYW1lPSJDYW5jZWxlZEVycm9yIn1hLmluaGVyaXRzKCRlLGYse19fQ0FOQ0VMX186ITB9KTt2YXIgTD0kZTtmdW5jdGlvbiByZShBLGUsdCl7bGV0IHI9dC5jb25maWcudmFsaWRhdGVTdGF0dXM7IXQuc3RhdHVzfHwhcnx8cih0LnN0YXR1cyk/QSh0KTplKG5ldyBmKCJSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICIrdC5zdGF0dXMsW2YuRVJSX0JBRF9SRVFVRVNULGYuRVJSX0JBRF9SRVNQT05TRV1bTWF0aC5mbG9vcih0LnN0YXR1cy8xMDApLTRdLHQuY29uZmlnLHQucmVxdWVzdCx0KSl9dmFyIEF0PUQuaGFzU3RhbmRhcmRCcm93c2VyRW52P3t3cml0ZShBLGUsdCxyLG8sbil7bGV0IGk9W0ErIj0iK2VuY29kZVVSSUNvbXBvbmVudChlKV07YS5pc051bWJlcih0KSYmaS5wdXNoKCJleHBpcmVzPSIrbmV3IERhdGUodCkudG9HTVRTdHJpbmcoKSksYS5pc1N0cmluZyhyKSYmaS5wdXNoKCJwYXRoPSIrciksYS5pc1N0cmluZyhvKSYmaS5wdXNoKCJkb21haW49IitvKSxuPT09ITAmJmkucHVzaCgic2VjdXJlIiksZG9jdW1lbnQuY29va2llPWkuam9pbigiOyAiKX0scmVhZChBKXtsZXQgZT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58O1xccyopKCIrQSsiKT0oW147XSopIikpO3JldHVybiBlP2RlY29kZVVSSUNvbXBvbmVudChlWzNdKTpudWxsfSxyZW1vdmUoQSl7dGhpcy53cml0ZShBLCIiLERhdGUubm93KCktODY0ZTUpfX06e3dyaXRlKCl7fSxyZWFkKCl7cmV0dXJuIG51bGx9LHJlbW92ZSgpe319O2Z1bmN0aW9uIG9lKEEpe3JldHVybi9eKFthLXpdW2EtelxkK1wtLl0qOik/XC9cLy9pLnRlc3QoQSl9ZnVuY3Rpb24gbmUoQSxlKXtyZXR1cm4gZT9BLnJlcGxhY2UoL1wvP1wvJC8sIiIpKyIvIitlLnJlcGxhY2UoL15cLysvLCIiKTpBfWZ1bmN0aW9uIG9BKEEsZSl7cmV0dXJuIEEmJiFvZShlKT9uZShBLGUpOmV9dmFyIGV0PUQuaGFzU3RhbmRhcmRCcm93c2VyRW52P2Z1bmN0aW9uKCl7bGV0IGU9Lyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSxyO2Z1bmN0aW9uIG8obil7bGV0IGk9bjtyZXR1cm4gZSYmKHQuc2V0QXR0cmlidXRlKCJocmVmIixpKSxpPXQuaHJlZiksdC5zZXRBdHRyaWJ1dGUoImhyZWYiLGkpLHtocmVmOnQuaHJlZixwcm90b2NvbDp0LnByb3RvY29sP3QucHJvdG9jb2wucmVwbGFjZSgvOiQvLCIiKToiIixob3N0OnQuaG9zdCxzZWFyY2g6dC5zZWFyY2g/dC5zZWFyY2gucmVwbGFjZSgvXlw/LywiIik6IiIsaGFzaDp0Lmhhc2g/dC5oYXNoLnJlcGxhY2UoL14jLywiIik6IiIsaG9zdG5hbWU6dC5ob3N0bmFtZSxwb3J0OnQucG9ydCxwYXRobmFtZTp0LnBhdGhuYW1lLmNoYXJBdCgwKT09PSIvIj90LnBhdGhuYW1lOiIvIit0LnBhdGhuYW1lfX1yZXR1cm4gcj1vKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSxmdW5jdGlvbihpKXtsZXQgZz1hLmlzU3RyaW5nKGkpP28oaSk6aTtyZXR1cm4gZy5wcm90b2NvbD09PXIucHJvdG9jb2wmJmcuaG9zdD09PXIuaG9zdH19KCk6ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4hMH19KCk7ZnVuY3Rpb24gaWUoQSl7bGV0IGU9L14oWy0rXHddezEsMjV9KSg6P1wvXC98OikvLmV4ZWMoQSk7cmV0dXJuIGUmJmVbMV18fCIifWZ1bmN0aW9uIFdyKEEsZSl7QT1BfHwxMDtsZXQgdD1uZXcgQXJyYXkoQSkscj1uZXcgQXJyYXkoQSksbz0wLG49MCxpO3JldHVybiBlPWUhPT12b2lkIDA/ZToxZTMsZnVuY3Rpb24obCl7bGV0IEI9RGF0ZS5ub3coKSxJPXJbbl07aXx8KGk9QiksdFtvXT1sLHJbb109QjtsZXQgcz1uLFE9MDtmb3IoO3MhPT1vOylRKz10W3MrK10scz1zJUE7aWYobz0obysxKSVBLG89PT1uJiYobj0obisxKSVBKSxCLWk8ZSlyZXR1cm47bGV0IEM9SSYmQi1JO3JldHVybiBDP01hdGgucm91bmQoUSoxZTMvQyk6dm9pZCAwfX12YXIgdHQ9V3I7ZnVuY3Rpb24gcnQoQSxlKXtsZXQgdD0wLHI9dHQoNTAsMjUwKTtyZXR1cm4gbz0+e2xldCBuPW8ubG9hZGVkLGk9by5sZW5ndGhDb21wdXRhYmxlP28udG90YWw6dm9pZCAwLGc9bi10LGw9cihnKSxCPW48PWk7dD1uO2xldCBJPXtsb2FkZWQ6bix0b3RhbDppLHByb2dyZXNzOmk/bi9pOnZvaWQgMCxieXRlczpnLHJhdGU6bHx8dm9pZCAwLGVzdGltYXRlZDpsJiZpJiZCPyhpLW4pL2w6dm9pZCAwLGV2ZW50Om99O0lbZT8iZG93bmxvYWQiOiJ1cGxvYWQiXT0hMCxBKEkpfX12YXIgdnI9dHlwZW9mIFhNTEh0dHBSZXF1ZXN0PCJ1IixvdD12ciYmZnVuY3Rpb24oQSl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHQscil7bGV0IG89QS5kYXRhLG49Uy5mcm9tKEEuaGVhZGVycykubm9ybWFsaXplKCkse3Jlc3BvbnNlVHlwZTppLHdpdGhYU1JGVG9rZW46Z309QSxsO2Z1bmN0aW9uIEIoKXtBLmNhbmNlbFRva2VuJiZBLmNhbmNlbFRva2VuLnVuc3Vic2NyaWJlKGwpLEEuc2lnbmFsJiZBLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsbCl9bGV0IEk7aWYoYS5pc0Zvcm1EYXRhKG8pKXtpZihELmhhc1N0YW5kYXJkQnJvd3NlckVudnx8RC5oYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnYpbi5zZXRDb250ZW50VHlwZSghMSk7ZWxzZSBpZigoST1uLmdldENvbnRlbnRUeXBlKCkpIT09ITEpe2xldFtFLC4uLnVdPUk/SS5zcGxpdCgiOyIpLm1hcChkPT5kLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pOltdO24uc2V0Q29udGVudFR5cGUoW0V8fCJtdWx0aXBhcnQvZm9ybS1kYXRhIiwuLi51XS5qb2luKCI7ICIpKX19bGV0IHM9bmV3IFhNTEh0dHBSZXF1ZXN0O2lmKEEuYXV0aCl7bGV0IEU9QS5hdXRoLnVzZXJuYW1lfHwiIix1PUEuYXV0aC5wYXNzd29yZD91bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoQS5hdXRoLnBhc3N3b3JkKSk6IiI7bi5zZXQoIkF1dGhvcml6YXRpb24iLCJCYXNpYyAiK2J0b2EoRSsiOiIrdSkpfWxldCBRPW9BKEEuYmFzZVVSTCxBLnVybCk7cy5vcGVuKEEubWV0aG9kLnRvVXBwZXJDYXNlKCksQUEoUSxBLnBhcmFtcyxBLnBhcmFtc1NlcmlhbGl6ZXIpLCEwKSxzLnRpbWVvdXQ9QS50aW1lb3V0O2Z1bmN0aW9uIEMoKXtpZighcylyZXR1cm47bGV0IEU9Uy5mcm9tKCJnZXRBbGxSZXNwb25zZUhlYWRlcnMiaW4gcyYmcy5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSksZD17ZGF0YTohaXx8aT09PSJ0ZXh0Inx8aT09PSJqc29uIj9zLnJlc3BvbnNlVGV4dDpzLnJlc3BvbnNlLHN0YXR1czpzLnN0YXR1cyxzdGF0dXNUZXh0OnMuc3RhdHVzVGV4dCxoZWFkZXJzOkUsY29uZmlnOkEscmVxdWVzdDpzfTtyZShmdW5jdGlvbihVKXt0KFUpLEIoKX0sZnVuY3Rpb24oVSl7cihVKSxCKCl9LGQpLHM9bnVsbH1pZigib25sb2FkZW5kImluIHM/cy5vbmxvYWRlbmQ9QzpzLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFzfHxzLnJlYWR5U3RhdGUhPT00fHxzLnN0YXR1cz09PTAmJiEocy5yZXNwb25zZVVSTCYmcy5yZXNwb25zZVVSTC5pbmRleE9mKCJmaWxlOiIpPT09MCl8fHNldFRpbWVvdXQoQyl9LHMub25hYm9ydD1mdW5jdGlvbigpe3MmJihyKG5ldyBmKCJSZXF1ZXN0IGFib3J0ZWQiLGYuRUNPTk5BQk9SVEVELEEscykpLHM9bnVsbCl9LHMub25lcnJvcj1mdW5jdGlvbigpe3IobmV3IGYoIk5ldHdvcmsgRXJyb3IiLGYuRVJSX05FVFdPUkssQSxzKSkscz1udWxsfSxzLm9udGltZW91dD1mdW5jdGlvbigpe2xldCB1PUEudGltZW91dD8idGltZW91dCBvZiAiK0EudGltZW91dCsibXMgZXhjZWVkZWQiOiJ0aW1lb3V0IGV4Y2VlZGVkIixkPUEudHJhbnNpdGlvbmFsfHxwQTtBLnRpbWVvdXRFcnJvck1lc3NhZ2UmJih1PUEudGltZW91dEVycm9yTWVzc2FnZSkscihuZXcgZih1LGQuY2xhcmlmeVRpbWVvdXRFcnJvcj9mLkVUSU1FRE9VVDpmLkVDT05OQUJPUlRFRCxBLHMpKSxzPW51bGx9LEQuaGFzU3RhbmRhcmRCcm93c2VyRW52JiYoZyYmYS5pc0Z1bmN0aW9uKGcpJiYoZz1nKEEpKSxnfHxnIT09ITEmJmV0KFEpKSl7bGV0IEU9QS54c3JmSGVhZGVyTmFtZSYmQS54c3JmQ29va2llTmFtZSYmQXQucmVhZChBLnhzcmZDb29raWVOYW1lKTtFJiZuLnNldChBLnhzcmZIZWFkZXJOYW1lLEUpfW89PT12b2lkIDAmJm4uc2V0Q29udGVudFR5cGUobnVsbCksInNldFJlcXVlc3RIZWFkZXIiaW4gcyYmYS5mb3JFYWNoKG4udG9KU09OKCksZnVuY3Rpb24odSxkKXtzLnNldFJlcXVlc3RIZWFkZXIoZCx1KX0pLGEuaXNVbmRlZmluZWQoQS53aXRoQ3JlZGVudGlhbHMpfHwocy53aXRoQ3JlZGVudGlhbHM9ISFBLndpdGhDcmVkZW50aWFscyksaSYmaSE9PSJqc29uIiYmKHMucmVzcG9uc2VUeXBlPUEucmVzcG9uc2VUeXBlKSx0eXBlb2YgQS5vbkRvd25sb2FkUHJvZ3Jlc3M9PSJmdW5jdGlvbiImJnMuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLHJ0KEEub25Eb3dubG9hZFByb2dyZXNzLCEwKSksdHlwZW9mIEEub25VcGxvYWRQcm9ncmVzcz09ImZ1bmN0aW9uIiYmcy51cGxvYWQmJnMudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixydChBLm9uVXBsb2FkUHJvZ3Jlc3MpKSwoQS5jYW5jZWxUb2tlbnx8QS5zaWduYWwpJiYobD1FPT57cyYmKHIoIUV8fEUudHlwZT9uZXcgTChudWxsLEEscyk6RSkscy5hYm9ydCgpLHM9bnVsbCl9LEEuY2FuY2VsVG9rZW4mJkEuY2FuY2VsVG9rZW4uc3Vic2NyaWJlKGwpLEEuc2lnbmFsJiYoQS5zaWduYWwuYWJvcnRlZD9sKCk6QS5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLGwpKSk7bGV0IGM9aWUoUSk7aWYoYyYmRC5wcm90b2NvbHMuaW5kZXhPZihjKT09PS0xKXtyKG5ldyBmKCJVbnN1cHBvcnRlZCBwcm90b2NvbCAiK2MrIjoiLGYuRVJSX0JBRF9SRVFVRVNULEEpKTtyZXR1cm59cy5zZW5kKG98fG51bGwpfSl9O3ZhciBzZT17aHR0cDp1QSx4aHI6b3R9O2EuZm9yRWFjaChzZSwoQSxlKT0+e2lmKEEpe3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkoQSwibmFtZSIse3ZhbHVlOmV9KX1jYXRjaHt9T2JqZWN0LmRlZmluZVByb3BlcnR5KEEsImFkYXB0ZXJOYW1lIix7dmFsdWU6ZX0pfX0pO3ZhciBudD1BPT5gLSAke0F9YCxqcj1BPT5hLmlzRnVuY3Rpb24oQSl8fEE9PT1udWxsfHxBPT09ITEseUE9e2dldEFkYXB0ZXI6QT0+e0E9YS5pc0FycmF5KEEpP0E6W0FdO2xldHtsZW5ndGg6ZX09QSx0LHIsbz17fTtmb3IobGV0IG49MDtuPGU7bisrKXt0PUFbbl07bGV0IGk7aWYocj10LCFqcih0KSYmKHI9c2VbKGk9U3RyaW5nKHQpKS50b0xvd2VyQ2FzZSgpXSxyPT09dm9pZCAwKSl0aHJvdyBuZXcgZihgVW5rbm93biBhZGFwdGVyICcke2l9J2ApO2lmKHIpYnJlYWs7b1tpfHwiIyIrbl09cn1pZighcil7bGV0IG49T2JqZWN0LmVudHJpZXMobykubWFwKChbZyxsXSk9PmBhZGFwdGVyICR7Z30gYCsobD09PSExPyJpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBlbnZpcm9ubWVudCI6ImlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGJ1aWxkIikpLGk9ZT9uLmxlbmd0aD4xP2BzaW5jZSA6CmArbi5tYXAobnQpLmpvaW4oYApgKToiICIrbnQoblswXSk6ImFzIG5vIGFkYXB0ZXIgc3BlY2lmaWVkIjt0aHJvdyBuZXcgZigiVGhlcmUgaXMgbm8gc3VpdGFibGUgYWRhcHRlciB0byBkaXNwYXRjaCB0aGUgcmVxdWVzdCAiK2ksIkVSUl9OT1RfU1VQUE9SVCIpfXJldHVybiByfSxhZGFwdGVyczpzZX07ZnVuY3Rpb24gYWUoQSl7aWYoQS5jYW5jZWxUb2tlbiYmQS5jYW5jZWxUb2tlbi50aHJvd0lmUmVxdWVzdGVkKCksQS5zaWduYWwmJkEuc2lnbmFsLmFib3J0ZWQpdGhyb3cgbmV3IEwobnVsbCxBKX1mdW5jdGlvbiBoQShBKXtyZXR1cm4gYWUoQSksQS5oZWFkZXJzPVMuZnJvbShBLmhlYWRlcnMpLEEuZGF0YT10QS5jYWxsKEEsQS50cmFuc2Zvcm1SZXF1ZXN0KSxbInBvc3QiLCJwdXQiLCJwYXRjaCJdLmluZGV4T2YoQS5tZXRob2QpIT09LTEmJkEuaGVhZGVycy5zZXRDb250ZW50VHlwZSgiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwhMSkseUEuZ2V0QWRhcHRlcihBLmFkYXB0ZXJ8fHEuYWRhcHRlcikoQSkudGhlbihmdW5jdGlvbihyKXtyZXR1cm4gYWUoQSksci5kYXRhPXRBLmNhbGwoQSxBLnRyYW5zZm9ybVJlc3BvbnNlLHIpLHIuaGVhZGVycz1TLmZyb20oci5oZWFkZXJzKSxyfSxmdW5jdGlvbihyKXtyZXR1cm4gckEocil8fChhZShBKSxyJiZyLnJlc3BvbnNlJiYoci5yZXNwb25zZS5kYXRhPXRBLmNhbGwoQSxBLnRyYW5zZm9ybVJlc3BvbnNlLHIucmVzcG9uc2UpLHIucmVzcG9uc2UuaGVhZGVycz1TLmZyb20oci5yZXNwb25zZS5oZWFkZXJzKSkpLFByb21pc2UucmVqZWN0KHIpfSl9dmFyIGl0PUE9PkEgaW5zdGFuY2VvZiBTP3suLi5BfTpBO2Z1bmN0aW9uIFQoQSxlKXtlPWV8fHt9O2xldCB0PXt9O2Z1bmN0aW9uIHIoQixJLHMpe3JldHVybiBhLmlzUGxhaW5PYmplY3QoQikmJmEuaXNQbGFpbk9iamVjdChJKT9hLm1lcmdlLmNhbGwoe2Nhc2VsZXNzOnN9LEIsSSk6YS5pc1BsYWluT2JqZWN0KEkpP2EubWVyZ2Uoe30sSSk6YS5pc0FycmF5KEkpP0kuc2xpY2UoKTpJfWZ1bmN0aW9uIG8oQixJLHMpe2lmKGEuaXNVbmRlZmluZWQoSSkpe2lmKCFhLmlzVW5kZWZpbmVkKEIpKXJldHVybiByKHZvaWQgMCxCLHMpfWVsc2UgcmV0dXJuIHIoQixJLHMpfWZ1bmN0aW9uIG4oQixJKXtpZighYS5pc1VuZGVmaW5lZChJKSlyZXR1cm4gcih2b2lkIDAsSSl9ZnVuY3Rpb24gaShCLEkpe2lmKGEuaXNVbmRlZmluZWQoSSkpe2lmKCFhLmlzVW5kZWZpbmVkKEIpKXJldHVybiByKHZvaWQgMCxCKX1lbHNlIHJldHVybiByKHZvaWQgMCxJKX1mdW5jdGlvbiBnKEIsSSxzKXtpZihzIGluIGUpcmV0dXJuIHIoQixJKTtpZihzIGluIEEpcmV0dXJuIHIodm9pZCAwLEIpfWxldCBsPXt1cmw6bixtZXRob2Q6bixkYXRhOm4sYmFzZVVSTDppLHRyYW5zZm9ybVJlcXVlc3Q6aSx0cmFuc2Zvcm1SZXNwb25zZTppLHBhcmFtc1NlcmlhbGl6ZXI6aSx0aW1lb3V0OmksdGltZW91dE1lc3NhZ2U6aSx3aXRoQ3JlZGVudGlhbHM6aSx3aXRoWFNSRlRva2VuOmksYWRhcHRlcjppLHJlc3BvbnNlVHlwZTppLHhzcmZDb29raWVOYW1lOmkseHNyZkhlYWRlck5hbWU6aSxvblVwbG9hZFByb2dyZXNzOmksb25Eb3dubG9hZFByb2dyZXNzOmksZGVjb21wcmVzczppLG1heENvbnRlbnRMZW5ndGg6aSxtYXhCb2R5TGVuZ3RoOmksYmVmb3JlUmVkaXJlY3Q6aSx0cmFuc3BvcnQ6aSxodHRwQWdlbnQ6aSxodHRwc0FnZW50OmksY2FuY2VsVG9rZW46aSxzb2NrZXRQYXRoOmkscmVzcG9uc2VFbmNvZGluZzppLHZhbGlkYXRlU3RhdHVzOmcsaGVhZGVyczooQixJKT0+byhpdChCKSxpdChJKSwhMCl9O3JldHVybiBhLmZvckVhY2goT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSxBLGUpKSxmdW5jdGlvbihJKXtsZXQgcz1sW0ldfHxvLFE9cyhBW0ldLGVbSV0sSSk7YS5pc1VuZGVmaW5lZChRKSYmcyE9PWd8fCh0W0ldPVEpfSksdH12YXIgd0E9IjEuNi44Ijt2YXIgSWU9e307WyJvYmplY3QiLCJib29sZWFuIiwibnVtYmVyIiwiZnVuY3Rpb24iLCJzdHJpbmciLCJzeW1ib2wiXS5mb3JFYWNoKChBLGUpPT57SWVbQV09ZnVuY3Rpb24ocil7cmV0dXJuIHR5cGVvZiByPT09QXx8ImEiKyhlPDE/Im4gIjoiICIpK0F9fSk7dmFyIHN0PXt9O0llLnRyYW5zaXRpb25hbD1mdW5jdGlvbihlLHQscil7ZnVuY3Rpb24gbyhuLGkpe3JldHVybiJbQXhpb3MgdiIrd0ErIl0gVHJhbnNpdGlvbmFsIG9wdGlvbiAnIituKyInIitpKyhyPyIuICIrcjoiIil9cmV0dXJuKG4saSxnKT0+e2lmKGU9PT0hMSl0aHJvdyBuZXcgZihvKGksIiBoYXMgYmVlbiByZW1vdmVkIisodD8iIGluICIrdDoiIikpLGYuRVJSX0RFUFJFQ0FURUQpO3JldHVybiB0JiYhc3RbaV0mJihzdFtpXT0hMCxjb25zb2xlLndhcm4obyhpLCIgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSB2Iit0KyIgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmVhciBmdXR1cmUiKSkpLGU/ZShuLGksZyk6ITB9fTtmdW5jdGlvbiBfcihBLGUsdCl7aWYodHlwZW9mIEEhPSJvYmplY3QiKXRocm93IG5ldyBmKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0IixmLkVSUl9CQURfT1BUSU9OX1ZBTFVFKTtsZXQgcj1PYmplY3Qua2V5cyhBKSxvPXIubGVuZ3RoO2Zvcig7by0tID4wOyl7bGV0IG49cltvXSxpPWVbbl07aWYoaSl7bGV0IGc9QVtuXSxsPWc9PT12b2lkIDB8fGkoZyxuLEEpO2lmKGwhPT0hMCl0aHJvdyBuZXcgZigib3B0aW9uICIrbisiIG11c3QgYmUgIitsLGYuRVJSX0JBRF9PUFRJT05fVkFMVUUpO2NvbnRpbnVlfWlmKHQhPT0hMCl0aHJvdyBuZXcgZigiVW5rbm93biBvcHRpb24gIituLGYuRVJSX0JBRF9PUFRJT04pfX12YXIgREE9e2Fzc2VydE9wdGlvbnM6X3IsdmFsaWRhdG9yczpJZX07dmFyIHg9REEudmFsaWRhdG9ycyxXPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuZGVmYXVsdHM9ZSx0aGlzLmludGVyY2VwdG9ycz17cmVxdWVzdDpuZXcgWEEscmVzcG9uc2U6bmV3IFhBfX1hc3luYyByZXF1ZXN0KGUsdCl7dHJ5e3JldHVybiBhd2FpdCB0aGlzLl9yZXF1ZXN0KGUsdCl9Y2F0Y2gocil7aWYociBpbnN0YW5jZW9mIEVycm9yKXtsZXQgbztFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT9FcnJvci5jYXB0dXJlU3RhY2tUcmFjZShvPXt9KTpvPW5ldyBFcnJvcjtsZXQgbj1vLnN0YWNrP28uc3RhY2sucmVwbGFjZSgvXi4rXG4vLCIiKToiIjtyLnN0YWNrP24mJiFTdHJpbmcoci5zdGFjaykuZW5kc1dpdGgobi5yZXBsYWNlKC9eLitcbi4rXG4vLCIiKSkmJihyLnN0YWNrKz1gCmArbik6ci5zdGFjaz1ufXRocm93IHJ9fV9yZXF1ZXN0KGUsdCl7dHlwZW9mIGU9PSJzdHJpbmciPyh0PXR8fHt9LHQudXJsPWUpOnQ9ZXx8e30sdD1UKHRoaXMuZGVmYXVsdHMsdCk7bGV0e3RyYW5zaXRpb25hbDpyLHBhcmFtc1NlcmlhbGl6ZXI6byxoZWFkZXJzOm59PXQ7ciE9PXZvaWQgMCYmREEuYXNzZXJ0T3B0aW9ucyhyLHtzaWxlbnRKU09OUGFyc2luZzp4LnRyYW5zaXRpb25hbCh4LmJvb2xlYW4pLGZvcmNlZEpTT05QYXJzaW5nOngudHJhbnNpdGlvbmFsKHguYm9vbGVhbiksY2xhcmlmeVRpbWVvdXRFcnJvcjp4LnRyYW5zaXRpb25hbCh4LmJvb2xlYW4pfSwhMSksbyE9bnVsbCYmKGEuaXNGdW5jdGlvbihvKT90LnBhcmFtc1NlcmlhbGl6ZXI9e3NlcmlhbGl6ZTpvfTpEQS5hc3NlcnRPcHRpb25zKG8se2VuY29kZTp4LmZ1bmN0aW9uLHNlcmlhbGl6ZTp4LmZ1bmN0aW9ufSwhMCkpLHQubWV0aG9kPSh0Lm1ldGhvZHx8dGhpcy5kZWZhdWx0cy5tZXRob2R8fCJnZXQiKS50b0xvd2VyQ2FzZSgpO2xldCBpPW4mJmEubWVyZ2Uobi5jb21tb24sblt0Lm1ldGhvZF0pO24mJmEuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiLCJwb3N0IiwicHV0IiwicGF0Y2giLCJjb21tb24iXSxjPT57ZGVsZXRlIG5bY119KSx0LmhlYWRlcnM9Uy5jb25jYXQoaSxuKTtsZXQgZz1bXSxsPSEwO3RoaXMuaW50ZXJjZXB0b3JzLnJlcXVlc3QuZm9yRWFjaChmdW5jdGlvbihFKXt0eXBlb2YgRS5ydW5XaGVuPT0iZnVuY3Rpb24iJiZFLnJ1bldoZW4odCk9PT0hMXx8KGw9bCYmRS5zeW5jaHJvbm91cyxnLnVuc2hpZnQoRS5mdWxmaWxsZWQsRS5yZWplY3RlZCkpfSk7bGV0IEI9W107dGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaChmdW5jdGlvbihFKXtCLnB1c2goRS5mdWxmaWxsZWQsRS5yZWplY3RlZCl9KTtsZXQgSSxzPTAsUTtpZighbCl7bGV0IGM9W2hBLmJpbmQodGhpcyksdm9pZCAwXTtmb3IoYy51bnNoaWZ0LmFwcGx5KGMsZyksYy5wdXNoLmFwcGx5KGMsQiksUT1jLmxlbmd0aCxJPVByb21pc2UucmVzb2x2ZSh0KTtzPFE7KUk9SS50aGVuKGNbcysrXSxjW3MrK10pO3JldHVybiBJfVE9Zy5sZW5ndGg7bGV0IEM9dDtmb3Iocz0wO3M8UTspe2xldCBjPWdbcysrXSxFPWdbcysrXTt0cnl7Qz1jKEMpfWNhdGNoKHUpe0UuY2FsbCh0aGlzLHUpO2JyZWFrfX10cnl7ST1oQS5jYWxsKHRoaXMsQyl9Y2F0Y2goYyl7cmV0dXJuIFByb21pc2UucmVqZWN0KGMpfWZvcihzPTAsUT1CLmxlbmd0aDtzPFE7KUk9SS50aGVuKEJbcysrXSxCW3MrK10pO3JldHVybiBJfWdldFVyaShlKXtlPVQodGhpcy5kZWZhdWx0cyxlKTtsZXQgdD1vQShlLmJhc2VVUkwsZS51cmwpO3JldHVybiBBQSh0LGUucGFyYW1zLGUucGFyYW1zU2VyaWFsaXplcil9fTthLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwib3B0aW9ucyJdLGZ1bmN0aW9uKGUpe1cucHJvdG90eXBlW2VdPWZ1bmN0aW9uKHQscil7cmV0dXJuIHRoaXMucmVxdWVzdChUKHJ8fHt9LHttZXRob2Q6ZSx1cmw6dCxkYXRhOihyfHx7fSkuZGF0YX0pKX19KTthLmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSxmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIpe3JldHVybiBmdW5jdGlvbihuLGksZyl7cmV0dXJuIHRoaXMucmVxdWVzdChUKGd8fHt9LHttZXRob2Q6ZSxoZWFkZXJzOnI/eyJDb250ZW50LVR5cGUiOiJtdWx0aXBhcnQvZm9ybS1kYXRhIn06e30sdXJsOm4sZGF0YTppfSkpfX1XLnByb3RvdHlwZVtlXT10KCksVy5wcm90b3R5cGVbZSsiRm9ybSJdPXQoITApfSk7dmFyIG5BPVc7dmFyIGdlPWNsYXNzIEF7Y29uc3RydWN0b3IoZSl7aWYodHlwZW9mIGUhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpO2xldCB0O3RoaXMucHJvbWlzZT1uZXcgUHJvbWlzZShmdW5jdGlvbihuKXt0PW59KTtsZXQgcj10aGlzO3RoaXMucHJvbWlzZS50aGVuKG89PntpZighci5fbGlzdGVuZXJzKXJldHVybjtsZXQgbj1yLl9saXN0ZW5lcnMubGVuZ3RoO2Zvcig7bi0tID4wOylyLl9saXN0ZW5lcnNbbl0obyk7ci5fbGlzdGVuZXJzPW51bGx9KSx0aGlzLnByb21pc2UudGhlbj1vPT57bGV0IG4saT1uZXcgUHJvbWlzZShnPT57ci5zdWJzY3JpYmUoZyksbj1nfSkudGhlbihvKTtyZXR1cm4gaS5jYW5jZWw9ZnVuY3Rpb24oKXtyLnVuc3Vic2NyaWJlKG4pfSxpfSxlKGZ1bmN0aW9uKG4saSxnKXtyLnJlYXNvbnx8KHIucmVhc29uPW5ldyBMKG4saSxnKSx0KHIucmVhc29uKSl9KX10aHJvd0lmUmVxdWVzdGVkKCl7aWYodGhpcy5yZWFzb24pdGhyb3cgdGhpcy5yZWFzb259c3Vic2NyaWJlKGUpe2lmKHRoaXMucmVhc29uKXtlKHRoaXMucmVhc29uKTtyZXR1cm59dGhpcy5fbGlzdGVuZXJzP3RoaXMuX2xpc3RlbmVycy5wdXNoKGUpOnRoaXMuX2xpc3RlbmVycz1bZV19dW5zdWJzY3JpYmUoZSl7aWYoIXRoaXMuX2xpc3RlbmVycylyZXR1cm47bGV0IHQ9dGhpcy5fbGlzdGVuZXJzLmluZGV4T2YoZSk7dCE9PS0xJiZ0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKHQsMSl9c3RhdGljIHNvdXJjZSgpe2xldCBlO3JldHVybnt0b2tlbjpuZXcgQShmdW5jdGlvbihvKXtlPW99KSxjYW5jZWw6ZX19fSxhdD1nZTtmdW5jdGlvbiBDZShBKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIEEuYXBwbHkobnVsbCx0KX19ZnVuY3Rpb24gQmUoQSl7cmV0dXJuIGEuaXNPYmplY3QoQSkmJkEuaXNBeGlvc0Vycm9yPT09ITB9dmFyIGxlPXtDb250aW51ZToxMDAsU3dpdGNoaW5nUHJvdG9jb2xzOjEwMSxQcm9jZXNzaW5nOjEwMixFYXJseUhpbnRzOjEwMyxPazoyMDAsQ3JlYXRlZDoyMDEsQWNjZXB0ZWQ6MjAyLE5vbkF1dGhvcml0YXRpdmVJbmZvcm1hdGlvbjoyMDMsTm9Db250ZW50OjIwNCxSZXNldENvbnRlbnQ6MjA1LFBhcnRpYWxDb250ZW50OjIwNixNdWx0aVN0YXR1czoyMDcsQWxyZWFkeVJlcG9ydGVkOjIwOCxJbVVzZWQ6MjI2LE11bHRpcGxlQ2hvaWNlczozMDAsTW92ZWRQZXJtYW5lbnRseTozMDEsRm91bmQ6MzAyLFNlZU90aGVyOjMwMyxOb3RNb2RpZmllZDozMDQsVXNlUHJveHk6MzA1LFVudXNlZDozMDYsVGVtcG9yYXJ5UmVkaXJlY3Q6MzA3LFBlcm1hbmVudFJlZGlyZWN0OjMwOCxCYWRSZXF1ZXN0OjQwMCxVbmF1dGhvcml6ZWQ6NDAxLFBheW1lbnRSZXF1aXJlZDo0MDIsRm9yYmlkZGVuOjQwMyxOb3RGb3VuZDo0MDQsTWV0aG9kTm90QWxsb3dlZDo0MDUsTm90QWNjZXB0YWJsZTo0MDYsUHJveHlBdXRoZW50aWNhdGlvblJlcXVpcmVkOjQwNyxSZXF1ZXN0VGltZW91dDo0MDgsQ29uZmxpY3Q6NDA5LEdvbmU6NDEwLExlbmd0aFJlcXVpcmVkOjQxMSxQcmVjb25kaXRpb25GYWlsZWQ6NDEyLFBheWxvYWRUb29MYXJnZTo0MTMsVXJpVG9vTG9uZzo0MTQsVW5zdXBwb3J0ZWRNZWRpYVR5cGU6NDE1LFJhbmdlTm90U2F0aXNmaWFibGU6NDE2LEV4cGVjdGF0aW9uRmFpbGVkOjQxNyxJbUFUZWFwb3Q6NDE4LE1pc2RpcmVjdGVkUmVxdWVzdDo0MjEsVW5wcm9jZXNzYWJsZUVudGl0eTo0MjIsTG9ja2VkOjQyMyxGYWlsZWREZXBlbmRlbmN5OjQyNCxUb29FYXJseTo0MjUsVXBncmFkZVJlcXVpcmVkOjQyNixQcmVjb25kaXRpb25SZXF1aXJlZDo0MjgsVG9vTWFueVJlcXVlc3RzOjQyOSxSZXF1ZXN0SGVhZGVyRmllbGRzVG9vTGFyZ2U6NDMxLFVuYXZhaWxhYmxlRm9yTGVnYWxSZWFzb25zOjQ1MSxJbnRlcm5hbFNlcnZlckVycm9yOjUwMCxOb3RJbXBsZW1lbnRlZDo1MDEsQmFkR2F0ZXdheTo1MDIsU2VydmljZVVuYXZhaWxhYmxlOjUwMyxHYXRld2F5VGltZW91dDo1MDQsSHR0cFZlcnNpb25Ob3RTdXBwb3J0ZWQ6NTA1LFZhcmlhbnRBbHNvTmVnb3RpYXRlczo1MDYsSW5zdWZmaWNpZW50U3RvcmFnZTo1MDcsTG9vcERldGVjdGVkOjUwOCxOb3RFeHRlbmRlZDo1MTAsTmV0d29ya0F1dGhlbnRpY2F0aW9uUmVxdWlyZWQ6NTExfTtPYmplY3QuZW50cmllcyhsZSkuZm9yRWFjaCgoW0EsZV0pPT57bGVbZV09QX0pO3ZhciBJdD1sZTtmdW5jdGlvbiBndChBKXtsZXQgZT1uZXcgbkEoQSksdD1aKG5BLnByb3RvdHlwZS5yZXF1ZXN0LGUpO3JldHVybiBhLmV4dGVuZCh0LG5BLnByb3RvdHlwZSxlLHthbGxPd25LZXlzOiEwfSksYS5leHRlbmQodCxlLG51bGwse2FsbE93bktleXM6ITB9KSx0LmNyZWF0ZT1mdW5jdGlvbihvKXtyZXR1cm4gZ3QoVChBLG8pKX0sdH12YXIgbT1ndChxKTttLkF4aW9zPW5BO20uQ2FuY2VsZWRFcnJvcj1MO20uQ2FuY2VsVG9rZW49YXQ7bS5pc0NhbmNlbD1yQTttLlZFUlNJT049d0E7bS50b0Zvcm1EYXRhPVA7bS5BeGlvc0Vycm9yPWY7bS5DYW5jZWw9bS5DYW5jZWxlZEVycm9yO20uYWxsPWZ1bmN0aW9uKGUpe3JldHVybiBQcm9taXNlLmFsbChlKX07bS5zcHJlYWQ9Q2U7bS5pc0F4aW9zRXJyb3I9QmU7bS5tZXJnZUNvbmZpZz1UO20uQXhpb3NIZWFkZXJzPVM7bS5mb3JtVG9KU09OPUE9PmRBKGEuaXNIVE1MRm9ybShBKT9uZXcgRm9ybURhdGEoQSk6QSk7bS5nZXRBZGFwdGVyPXlBLmdldEFkYXB0ZXI7bS5IdHRwU3RhdHVzQ29kZT1JdDttLmRlZmF1bHQ9bTt2YXIgdj1tO3ZhcntBeGlvczpNcyxBeGlvc0Vycm9yOkhzLENhbmNlbGVkRXJyb3I6WXMsaXNDYW5jZWw6cXMsQ2FuY2VsVG9rZW46S3MsVkVSU0lPTjpXcyxhbGw6dnMsQ2FuY2VsOmpzLGlzQXhpb3NFcnJvcjpfcyxzcHJlYWQ6enMsdG9Gb3JtRGF0YTpWcyxBeGlvc0hlYWRlcnM6WnMsSHR0cFN0YXR1c0NvZGU6WHMsZm9ybVRvSlNPTjokcyxnZXRBZGFwdGVyOkFhLG1lcmdlQ29uZmlnOmVhfT12O2FzeW5jIGZ1bmN0aW9uIHpyKEEsZSl7bGV0IHQ9QSxyPW51bGw7aWYodD09bnVsbClyPW5ldyBXb3JrZXIobmV3IFVSTCgiLi93ZWItd29ya2Vycy9pdGstd2FzbS1waXBlbGluZS53b3JrZXIuanMiLGltcG9ydC5tZXRhLnVybCkse3R5cGU6Im1vZHVsZSJ9KTtlbHNlIGlmKHQuc3RhcnRzV2l0aCgiaHR0cCIpKXtsZXQgbz1hd2FpdCB2LmdldCh0LHtyZXNwb25zZVR5cGU6ImJsb2IiLHBhcmFtczplfSksbj1VUkwuY3JlYXRlT2JqZWN0VVJMKG8uZGF0YSk7cj1uZXcgV29ya2VyKG4se3R5cGU6Im1vZHVsZSJ9KX1lbHNlIHI9bmV3IFdvcmtlcih0LHt0eXBlOiJtb2R1bGUifSk7cmV0dXJuIHJ9dmFyIGlBPXpyO2Z1bmN0aW9uIEN0KEEpe2xldCBlPVdBKEEpLHQ9QTtyZXR1cm4gdC50ZXJtaW5hdGVkPSExLHQud29ya2VyUHJveHk9ZSx0Lm9yaWdpbmFsVGVybWluYXRlPXQudGVybWluYXRlLHQudGVybWluYXRlPSgpPT57dC50ZXJtaW5hdGVkPSEwLHQud29ya2VyUHJveHlbS0FdKCksdC5vcmlnaW5hbFRlcm1pbmF0ZSgpfSx7d29ya2VyUHJveHk6ZSx3b3JrZXI6dH19YXN5bmMgZnVuY3Rpb24gVnIoQSxlLHQpe2xldCByO2lmKEEhPW51bGwpe2xldCBuPUE7cmV0dXJuIG4ud29ya2VyUHJveHkhPT12b2lkIDA/KHI9bi53b3JrZXJQcm94eSx7d29ya2VyUHJveHk6cix3b3JrZXI6bn0pOkN0KEEpfWxldCBvPWF3YWl0IGlBKGUsdCk7cmV0dXJuIEN0KG8pfXZhciBCdD1Wcjthc3luYyBmdW5jdGlvbiBacihBLGUsdCl7bGV0IHI9InVua25vd24iO3R5cGVvZiBBIT0ic3RyaW5nIj9yPUEuaHJlZjpBLnN0YXJ0c1dpdGgoImh0dHAiKT9yPUE6cj10eXBlb2YgZTwidSI/YCR7ZX0vJHtBfWA6QSxyLmVuZHNXaXRoKCIuanMiKSYmKHI9ci5zdWJzdHJpbmcoMCxyLmxlbmd0aC0zKSksci5lbmRzV2l0aCgiLndhc20iKSYmKHI9ci5zdWJzdHJpbmcoMCxyLmxlbmd0aC01KSk7bGV0IG89YCR7cn0ud2FzbWAsaT0oYXdhaXQgdi5nZXQobyx7cmVzcG9uc2VUeXBlOiJhcnJheWJ1ZmZlciIscGFyYW1zOnR9KSkuZGF0YTtyZXR1cm4oYXdhaXQgaW1wb3J0KGAke3J9LmpzYCkpLmRlZmF1bHQoe3dhc21CaW5hcnk6aX0pfXZhciBsdD1acjt2YXIgY3Q9YXN5bmMoKT0+V2ViQXNzZW1ibHkudmFsaWRhdGUobmV3IFVpbnQ4QXJyYXkoWzAsOTcsMTE1LDEwOSwxLDAsMCwwLDEsNSwxLDk2LDAsMSwxMjMsMywyLDEsMCwxMCwxMCwxLDgsMCw2NSwwLDI1MywxNSwyNTMsOTgsMTFdKSk7dmFyIHV0PXR5cGVvZiBnbG9iYWxUaGlzLlNoYXJlZEFycmF5QnVmZmVyPT0iZnVuY3Rpb24iLEV0PW5ldyBUZXh0RW5jb2RlcixRdD1uZXcgVGV4dERlY29kZXIoInV0Zi04Iik7ZnVuY3Rpb24gWHIoQSxlKXtsZXQgdD17ZmxhZ3M6InIiLGVuY29kaW5nOiJiaW5hcnkifSxyPUEuZnNfb3BlbihlLHQuZmxhZ3MpLG49QS5mc19zdGF0KGUpLnNpemUsaT1udWxsO3V0P2k9bmV3IFNoYXJlZEFycmF5QnVmZmVyKG4pOmk9bmV3IEFycmF5QnVmZmVyKG4pO2xldCBnPW5ldyBVaW50OEFycmF5KGkpO3JldHVybiBBLmZzX3JlYWQocixnLDAsbiwwKSxBLmZzX2Nsb3NlKHIpLGd9ZnVuY3Rpb24gZnQoQSxlLHQpe2xldCByPW51bGw7dXQ/cj1uZXcgU2hhcmVkQXJyYXlCdWZmZXIodCk6cj1uZXcgQXJyYXlCdWZmZXIodCk7bGV0IG89bmV3IFVpbnQ4QXJyYXkociksbj1uZXcgVWludDhBcnJheShBLkhFQVBVOC5idWZmZXIsZSx0KTtyZXR1cm4gby5zZXQobiksb31mdW5jdGlvbiBoKEEsZSx0LHIpe2xldCBvPTA7cmV0dXJuIGUhPT1udWxsJiYobz1BLmNjYWxsKCJpdGtfd2FzbV9pbnB1dF9hcnJheV9hbGxvYyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCx0LHIsZS5idWZmZXIuYnl0ZUxlbmd0aF0pLEEuSEVBUFU4LnNldChuZXcgVWludDhBcnJheShlLmJ1ZmZlciksbykpLG99ZnVuY3Rpb24gSihBLGUsdCl7bGV0IHI9SlNPTi5zdHJpbmdpZnkoZSksbz1BLmxlbmd0aEJ5dGVzVVRGOChyKSsxLG49QS5jY2FsbCgiaXRrX3dhc21faW5wdXRfanNvbl9hbGxvYyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCx0LG9dKTtBLnN0cmluZ1RvVVRGOChyLG4sbyl9ZnVuY3Rpb24gYihBLGUsdCxyKXtsZXQgbz1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfYWRkcmVzcyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxlLHRdKSxuPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9zaXplIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLGUsdF0pLGk9ZnQoQSxvLG4pO3JldHVybiB3KHIsaS5idWZmZXIpfWZ1bmN0aW9uIFNBKEEsZSl7bGV0IHQ9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2pzb25fYWRkcmVzcyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiXSxbMCxlXSkscj1BLlVURjhUb1N0cmluZyh0KTtyZXR1cm4gSlNPTi5wYXJzZShyKX1mdW5jdGlvbiAkcihBLGUsdCxyKXtyIT1udWxsJiZyLmxlbmd0aD4wJiZyLmZvckVhY2goZnVuY3Rpb24oQixJKXtzd2l0Y2goQi50eXBlKXtjYXNlIHAuVGV4dFN0cmVhbTp7bGV0IHM9RXQuZW5jb2RlKEIuZGF0YS5kYXRhKSxRPWgoQSxzLEksMCksQz17c2l6ZTpzLmJ1ZmZlci5ieXRlTGVuZ3RoLGRhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtRfWB9O0ooQSxDLEkpO2JyZWFrfWNhc2UgcC5Kc29uQ29tcGF0aWJsZTp7bGV0IHM9RXQuZW5jb2RlKEpTT04uc3RyaW5naWZ5KEIuZGF0YSkpLFE9aChBLHMsSSwwKSxDPXtzaXplOnMuYnVmZmVyLmJ5dGVMZW5ndGgsZGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke1F9YH07SihBLEMsSSk7YnJlYWt9Y2FzZSBwLkJpbmFyeVN0cmVhbTp7bGV0IHM9Qi5kYXRhLmRhdGEsUT1oKEEscyxJLDApLEM9e3NpemU6cy5idWZmZXIuYnl0ZUxlbmd0aCxkYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7UX1gfTtKKEEsQyxJKTticmVha31jYXNlIHAuVGV4dEZpbGU6e0EuZnNfd3JpdGVGaWxlKEIuZGF0YS5wYXRoLEIuZGF0YS5kYXRhKTticmVha31jYXNlIHAuQmluYXJ5RmlsZTp7QS5mc193cml0ZUZpbGUoQi5kYXRhLnBhdGgsQi5kYXRhLmRhdGEpO2JyZWFrfWNhc2UgcC5JbWFnZTp7bGV0IHM9Qi5kYXRhLFE9aChBLHMuZGF0YSxJLDApLEM9aChBLHMuZGlyZWN0aW9uLEksMSksYz10eXBlb2Ygcy5tZXRhZGF0YT8uZW50cmllczwidSI/QXJyYXkuZnJvbShzLm1ldGFkYXRhLmVudHJpZXMoKSk6W10sRT17aW1hZ2VUeXBlOnMuaW1hZ2VUeXBlLG5hbWU6cy5uYW1lLG9yaWdpbjpzLm9yaWdpbixzcGFjaW5nOnMuc3BhY2luZyxkaXJlY3Rpb246YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtDfWAsc2l6ZTpzLnNpemUsZGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke1F9YCxtZXRhZGF0YTpjfTtKKEEsRSxJKTticmVha31jYXNlIHAuTWVzaDp7bGV0IHM9Qi5kYXRhLFE9aChBLHMucG9pbnRzLEksMCksQz1oKEEscy5jZWxscyxJLDEpLGM9aChBLHMucG9pbnREYXRhLEksMiksRT1oKEEscy5jZWxsRGF0YSxJLDMpLHU9e21lc2hUeXBlOnMubWVzaFR5cGUsbmFtZTpzLm5hbWUsbnVtYmVyT2ZQb2ludHM6cy5udW1iZXJPZlBvaW50cyxwb2ludHM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtRfWAsbnVtYmVyT2ZDZWxsczpzLm51bWJlck9mQ2VsbHMsY2VsbHM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtDfWAsY2VsbEJ1ZmZlclNpemU6cy5jZWxsQnVmZmVyU2l6ZSxudW1iZXJPZlBvaW50UGl4ZWxzOnMubnVtYmVyT2ZQb2ludFBpeGVscyxwb2ludERhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtjfWAsbnVtYmVyT2ZDZWxsUGl4ZWxzOnMubnVtYmVyT2ZDZWxsUGl4ZWxzLGNlbGxEYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7RX1gfTtKKEEsdSxJKTticmVha31jYXNlIHAuUG9pbnRTZXQ6e2xldCBzPUIuZGF0YSxRPWgoQSxzLnBvaW50cyxJLDApLEM9aChBLHMucG9pbnREYXRhLEksMSksYz17cG9pbnRTZXRUeXBlOnMucG9pbnRTZXRUeXBlLG5hbWU6cy5uYW1lLG51bWJlck9mUG9pbnRzOnMubnVtYmVyT2ZQb2ludHMscG9pbnRzOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7UX1gLG51bWJlck9mUG9pbnRQaXhlbHM6cy5udW1iZXJPZlBvaW50UGl4ZWxzLHBvaW50RGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke0N9YH07SihBLGMsSSk7YnJlYWt9Y2FzZSBwLlBvbHlEYXRhOntsZXQgcz1CLmRhdGEsUT1oKEEscy5wb2ludHMsSSwwKSxDPWgoQSxzLnZlcnRpY2VzLEksMSksYz1oKEEscy5saW5lcyxJLDIpLEU9aChBLHMucG9seWdvbnMsSSwzKSx1PWgoQSxzLnRyaWFuZ2xlU3RyaXBzLEksNCksZD1oKEEscy5wb2ludERhdGEsSSw1KSxGPWgoQSxzLnBvaW50RGF0YSxJLDYpLFU9e3BvbHlEYXRhVHlwZTpzLnBvbHlEYXRhVHlwZSxuYW1lOnMubmFtZSxudW1iZXJPZlBvaW50czpzLm51bWJlck9mUG9pbnRzLHBvaW50czpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke1F9YCx2ZXJ0aWNlc0J1ZmZlclNpemU6cy52ZXJ0aWNlc0J1ZmZlclNpemUsdmVydGljZXM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtDfWAsbGluZXNCdWZmZXJTaXplOnMubGluZXNCdWZmZXJTaXplLGxpbmVzOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Y31gLHBvbHlnb25zQnVmZmVyU2l6ZTpzLnBvbHlnb25zQnVmZmVyU2l6ZSxwb2x5Z29uczpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke0V9YCx0cmlhbmdsZVN0cmlwc0J1ZmZlclNpemU6cy50cmlhbmdsZVN0cmlwc0J1ZmZlclNpemUsdHJpYW5nbGVTdHJpcHM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHt1fWAsbnVtYmVyT2ZQb2ludFBpeGVsczpzLm51bWJlck9mUG9pbnRQaXhlbHMscG9pbnREYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7ZH1gLG51bWJlck9mQ2VsbFBpeGVsczpzLm51bWJlck9mQ2VsbFBpeGVscyxjZWxsRGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke0Z9YH07SihBLFUsSSk7YnJlYWt9ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5zdXBwb3J0ZWQgaW5wdXQgSW50ZXJmYWNlVHlwZSIpfX0pLEEucmVzZXRNb2R1bGVTdGRvdXQoKSxBLnJlc2V0TW9kdWxlU3RkZXJyKCk7bGV0IG89QS5zdGFja1NhdmUoKSxuPTA7dHJ5e249QS5jYWxsTWFpbihlLnNsaWNlKCkpfWNhdGNoKEIpe3Rocm93IHR5cGVvZiBCPT0ibnVtYmVyIiYmKGNvbnNvbGUubG9nKCJFeGNlcHRpb24gd2hpbGUgcnVubmluZyBwaXBlbGluZToiKSxjb25zb2xlLmxvZygic3Rkb3V0OiIsQS5nZXRNb2R1bGVTdGRvdXQoKSksY29uc29sZS5lcnJvcigic3RkZXJyOiIsQS5nZXRNb2R1bGVTdGRlcnIoKSksdHlwZW9mIEEuZ2V0RXhjZXB0aW9uTWVzc2FnZTwidSI/Y29uc29sZS5lcnJvcigiZXhjZXB0aW9uOiIsQS5nZXRFeGNlcHRpb25NZXNzYWdlKEIpKTpjb25zb2xlLmVycm9yKCJCdWlsZCBtb2R1bGUgaW4gRGVidWcgbW9kZSBmb3IgZXhjZXB0aW9uIG1lc3NhZ2UgaW5mb3JtYXRpb24uIikpLEJ9ZmluYWxseXtBLnN0YWNrUmVzdG9yZShvKX1sZXQgaT1BLmdldE1vZHVsZVN0ZG91dCgpLGc9QS5nZXRNb2R1bGVTdGRlcnIoKSxsPVtdO3JldHVybiB0IT1udWxsJiZ0Lmxlbmd0aD4wJiZuPT09MCYmdC5mb3JFYWNoKGZ1bmN0aW9uKEIsSSl7bGV0IHM9bnVsbDtzd2l0Y2goQi50eXBlKXtjYXNlIHAuVGV4dFN0cmVhbTp7bGV0IEM9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X2FkZHJlc3MiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAsSSwwXSksYz1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfc2l6ZSIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxJLDBdKSxFPW5ldyBVaW50OEFycmF5KEEuSEVBUFU4LmJ1ZmZlcixDLGMpO3M9e2RhdGE6UXQuZGVjb2RlKEUpfTticmVha31jYXNlIHAuSnNvbkNvbXBhdGlibGU6e2xldCBDPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9hZGRyZXNzIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLEksMF0pLGM9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X3NpemUiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAsSSwwXSksRT1uZXcgVWludDhBcnJheShBLkhFQVBVOC5idWZmZXIsQyxjKTtzPUpTT04ucGFyc2UoUXQuZGVjb2RlKEUpKTticmVha31jYXNlIHAuQmluYXJ5U3RyZWFtOntsZXQgQz1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfYWRkcmVzcyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxJLDBdKSxjPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9zaXplIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLEksMF0pO3M9e2RhdGE6ZnQoQSxDLGMpfTticmVha31jYXNlIHAuVGV4dEZpbGU6e3M9e3BhdGg6Qi5kYXRhLnBhdGgsZGF0YTpBLmZzX3JlYWRGaWxlKEIuZGF0YS5wYXRoLHtlbmNvZGluZzoidXRmOCJ9KX07YnJlYWt9Y2FzZSBwLkJpbmFyeUZpbGU6e3M9e3BhdGg6Qi5kYXRhLnBhdGgsZGF0YTpYcihBLEIuZGF0YS5wYXRoKX07YnJlYWt9Y2FzZSBwLkltYWdlOntsZXQgQz1TQShBLEkpO0MuZGF0YT1iKEEsSSwwLEMuaW1hZ2VUeXBlLmNvbXBvbmVudFR5cGUpLEMuZGlyZWN0aW9uPWIoQSxJLDEsay5GbG9hdDY0KSxDLm1ldGFkYXRhPW5ldyBNYXAoQy5tZXRhZGF0YSkscz1DO2JyZWFrfWNhc2UgcC5NZXNoOntsZXQgQz1TQShBLEkpO0MubnVtYmVyT2ZQb2ludHM+MD9DLnBvaW50cz1iKEEsSSwwLEMubWVzaFR5cGUucG9pbnRDb21wb25lbnRUeXBlKTpDLnBvaW50cz13KEMubWVzaFR5cGUucG9pbnRDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSksQy5udW1iZXJPZkNlbGxzPjA/Qy5jZWxscz1iKEEsSSwxLEMubWVzaFR5cGUuY2VsbENvbXBvbmVudFR5cGUpOkMuY2VsbHM9dyhDLm1lc2hUeXBlLmNlbGxDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSksQy5udW1iZXJPZlBvaW50UGl4ZWxzPjA/Qy5wb2ludERhdGE9YihBLEksMixDLm1lc2hUeXBlLnBvaW50UGl4ZWxDb21wb25lbnRUeXBlKTpDLnBvaW50RGF0YT13KEMubWVzaFR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxDLm51bWJlck9mQ2VsbFBpeGVscz4wP0MuY2VsbERhdGE9YihBLEksMyxDLm1lc2hUeXBlLmNlbGxQaXhlbENvbXBvbmVudFR5cGUpOkMuY2VsbERhdGE9dyhDLm1lc2hUeXBlLmNlbGxQaXhlbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxzPUM7YnJlYWt9Y2FzZSBwLlBvaW50U2V0OntsZXQgQz1TQShBLEkpO0MubnVtYmVyT2ZQb2ludHM+MD9DLnBvaW50cz1iKEEsSSwwLEMucG9pbnRTZXRUeXBlLnBvaW50Q29tcG9uZW50VHlwZSk6Qy5wb2ludHM9dyhDLnBvaW50U2V0VHlwZS5wb2ludENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxDLm51bWJlck9mUG9pbnRQaXhlbHM+MD9DLnBvaW50RGF0YT1iKEEsSSwxLEMucG9pbnRTZXRUeXBlLnBvaW50UGl4ZWxDb21wb25lbnRUeXBlKTpDLnBvaW50RGF0YT13KEMucG9pbnRTZXRUeXBlLnBvaW50UGl4ZWxDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSkscz1DO2JyZWFrfWNhc2UgcC5Qb2x5RGF0YTp7bGV0IEM9U0EoQSxJKTtDLm51bWJlck9mUG9pbnRzPjA/Qy5wb2ludHM9YihBLEksMCxrLkZsb2F0MzIpOkMucG9pbnRzPW5ldyBGbG9hdDMyQXJyYXksQy52ZXJ0aWNlc0J1ZmZlclNpemU+MD9DLnZlcnRpY2VzPWIoQSxJLDEseS5VSW50MzIpOkMudmVydGljZXM9bmV3IFVpbnQzMkFycmF5LEMubGluZXNCdWZmZXJTaXplPjA/Qy5saW5lcz1iKEEsSSwyLHkuVUludDMyKTpDLmxpbmVzPW5ldyBVaW50MzJBcnJheSxDLnBvbHlnb25zQnVmZmVyU2l6ZT4wP0MucG9seWdvbnM9YihBLEksMyx5LlVJbnQzMik6Qy5wb2x5Z29ucz1uZXcgVWludDMyQXJyYXksQy50cmlhbmdsZVN0cmlwc0J1ZmZlclNpemU+MD9DLnRyaWFuZ2xlU3RyaXBzPWIoQSxJLDQseS5VSW50MzIpOkMudHJpYW5nbGVTdHJpcHM9bmV3IFVpbnQzMkFycmF5LEMubnVtYmVyT2ZQb2ludFBpeGVscz4wP0MucG9pbnREYXRhPWIoQSxJLDUsQy5wb2x5RGF0YVR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUpOkMucG9pbnREYXRhPXcoQy5wb2x5RGF0YVR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxDLm51bWJlck9mQ2VsbFBpeGVscz4wP0MuY2VsbERhdGE9YihBLEksNixDLnBvbHlEYXRhVHlwZS5jZWxsUGl4ZWxDb21wb25lbnRUeXBlKTpDLmNlbGxEYXRhPXcoQy5wb2x5RGF0YVR5cGUuY2VsbFBpeGVsQ29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLHM9QzticmVha31kZWZhdWx0OnRocm93IEVycm9yKCJVbnN1cHBvcnRlZCBvdXRwdXQgSW50ZXJmYWNlVHlwZSIpfWxldCBRPXt0eXBlOkIudHlwZSxkYXRhOnN9O2wucHVzaChRKX0pLHtyZXR1cm5WYWx1ZTpuLHN0ZG91dDppLHN0ZGVycjpnLG91dHB1dHM6bH19dmFyIHB0PSRyO3ZhciBBbz10eXBlb2YgZ2xvYmFsVGhpcy5TaGFyZWRBcnJheUJ1ZmZlcjwidSI7ZnVuY3Rpb24gZW8oQSxlKXtpZihBPT1udWxsKXJldHVybltdO2xldCB0PVtdO2ZvcihsZXQgcj0wO3I8QS5sZW5ndGg7cisrKXtsZXQgbz10byhBW3JdLGUpO28hPT1udWxsJiZ0LnB1c2gobyl9cmV0dXJuIHR9ZnVuY3Rpb24gdG8oQSxlKXtpZihBPT1udWxsKXJldHVybiBudWxsO2xldCB0PW51bGw7cmV0dXJuIEEuYnVmZmVyIT09dm9pZCAwP3Q9QS5idWZmZXI6QS5ieXRlTGVuZ3RoIT09dm9pZCAwJiYodD1BKSxBbyYmdCBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyP251bGw6ZT90OnQuc2xpY2UoMCl9dmFyIGR0PWVvO2Z1bmN0aW9uIHJvKEEpe3JldHVybltBLmRhdGEsQS5kaXJlY3Rpb25dfXZhciBtdD1ybztmdW5jdGlvbiBvbyhBKXtyZXR1cm5bQS5wb2ludHMsQS5wb2ludERhdGEsQS5jZWxscyxBLmNlbGxEYXRhXX12YXIgeXQ9b287ZnVuY3Rpb24gbm8oQSl7cmV0dXJuW0EucG9pbnRzLEEudmVydGljZXMsQS5saW5lcyxBLnBvbHlnb25zLEEudHJpYW5nbGVTdHJpcHMsQS5wb2ludERhdGEsQS5jZWxsRGF0YV19dmFyIGh0PW5vO3ZhciBpbztmdW5jdGlvbiBiQSgpe3JldHVybiBpb312YXIgc287ZnVuY3Rpb24gd3QoKXtyZXR1cm4gc299dmFyIGFvO2Z1bmN0aW9uIGtBKCl7cmV0dXJuIGFvfXZhciBjZT1uZXcgTWFwO2Z1bmN0aW9uIElvKCl7bGV0IEE9a0EoKTtyZXR1cm4gdHlwZW9mIEE+InUiJiYoQT1udWxsKSxBfWZ1bmN0aW9uIER0KCl7bGV0IEE9YkEoKTtyZXR1cm4gdHlwZW9mIEE+InUiJiYoQT1uZXcgVVJMKCIvcGlwZWxpbmVzIixkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW4pLmhyZWYpLEF9ZnVuY3Rpb24gUkEoKXtsZXQgQT13dCgpO3JldHVybiB0eXBlb2YgQT4idSImJihBPXt9KSxBfWFzeW5jIGZ1bmN0aW9uIGdvKEEsZSx0KXtsZXQgcj1BLG89QTtpZih0eXBlb2YgQSE9InN0cmluZyImJihyPW5ldyBVUkwoQS5ocmVmKSxvPXIuaHJlZiksY2UuaGFzKG8pKXJldHVybiBjZS5nZXQobyk7e2xldCBuPWF3YWl0IGx0KEEsZT8udG9TdHJpbmcoKT8/RHQoKSx0Pz9SQSgpKTtyZXR1cm4gY2Uuc2V0KG8sbiksbn19YXN5bmMgZnVuY3Rpb24gQ28oQSxlLHQscixvKXtpZighYXdhaXQgY3QoKSl7bGV0IHU9IldlYkFzc2VtYmx5IFNJTUQgc3VwcG9ydCBpcyByZXF1aXJlZCAtLSBwbGVhc2UgdXBkYXRlIHlvdXIgYnJvd3Nlci4iO3Rocm93IGFsZXJ0KHUpLG5ldyBFcnJvcih1KX1sZXQgbj1vPy53ZWJXb3JrZXI/P251bGw7aWYobj09PSExKXtsZXQgdT1hd2FpdCBnbyhBLnRvU3RyaW5nKCksbz8ucGlwZWxpbmVCYXNlVXJsLG8/LnBpcGVsaW5lUXVlcnlQYXJhbXM/P1JBKCkpO3JldHVybiBwdCh1LGUsdCxyKX1sZXQgaT1uLGc9bz8ucGlwZWxpbmVXb3JrZXJVcmw/P0lvKCksbD10eXBlb2YgZyE9InN0cmluZyImJnR5cGVvZiBnPy5ocmVmPCJ1Ij9nLmhyZWY6Zyx7d29ya2VyUHJveHk6Qix3b3JrZXI6SX09YXdhaXQgQnQoaSxsLG8/LnBpcGVsaW5lUXVlcnlQYXJhbXM/P1JBKCkpO2k9STtsZXQgcz1bXTtyIT1udWxsJiZyLmxlbmd0aD4wJiZyLmZvckVhY2goZnVuY3Rpb24odSl7aWYodS50eXBlPT09cC5CaW5hcnlTdHJlYW0pe2xldCBkPXUuZGF0YS5kYXRhO3MucHVzaChkKX1lbHNlIGlmKHUudHlwZT09PXAuQmluYXJ5RmlsZSl7bGV0IGQ9dS5kYXRhLmRhdGE7cy5wdXNoKGQpfWVsc2UgaWYodS50eXBlPT09cC5JbWFnZSl7bGV0IGQ9dS5kYXRhO2QuZGF0YSE9PW51bGwmJnMucHVzaCguLi5tdChkKSl9ZWxzZSBpZih1LnR5cGU9PT1wLk1lc2gpe2xldCBkPXUuZGF0YTtzLnB1c2goLi4ueXQoZCkpfWVsc2UgaWYodS50eXBlPT09cC5Qb2x5RGF0YSl7bGV0IGQ9dS5kYXRhO3MucHVzaCguLi5odChkKSl9fSk7bGV0IFE9bz8ucGlwZWxpbmVCYXNlVXJsPz9EdCgpLEM9dHlwZW9mIFEhPSJzdHJpbmciJiZ0eXBlb2YgUT8uaHJlZjwidSI/US5ocmVmOlEsYz1yIT1udWxsP3ZBKHIsZHQocyxvPy5ub0NvcHkpKTpudWxsLEU9YXdhaXQgQi5ydW5QaXBlbGluZShBLnRvU3RyaW5nKCksQyxlLHQsYyxvPy5waXBlbGluZVF1ZXJ5UGFyYW1zPz9SQSgpKTtyZXR1cm57cmV0dXJuVmFsdWU6RS5yZXR1cm5WYWx1ZSxzdGRvdXQ6RS5zdGRvdXQsc3RkZXJyOkUuc3RkZXJyLG91dHB1dHM6RS5vdXRwdXRzLHdlYldvcmtlcjppfX12YXIgc0E9Q287dmFyIEJvPW51bGw7ZnVuY3Rpb24gU3QoKXtyZXR1cm4gQm99dmFyIEVlLGxvPWBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BpdGstd2FzbS9jb21wcmVzcy1zdHJpbmdpZnlAJHtOQX0vZGlzdC9waXBlbGluZXNgO2Z1bmN0aW9uIFdhKEEpe0VlPUF9ZnVuY3Rpb24gRkEoKXtpZih0eXBlb2YgRWU8InUiKXJldHVybiBFZTtsZXQgQT1iQSgpO3JldHVybiB0eXBlb2YgQTwidSI/QTpsb312YXIgUWUsY289bnVsbDtmdW5jdGlvbiBidChBKXtRZT1BfWZ1bmN0aW9uIGooKXtpZih0eXBlb2YgUWU8InUiKXJldHVybiBRZTtsZXQgQT1rQSgpO3JldHVybiB0eXBlb2YgQTwidSI/QTpjb312YXIgXz1udWxsO2FzeW5jIGZ1bmN0aW9uIGt0KCl7bGV0IEE9aigpLGU9dHlwZW9mIEEhPSJzdHJpbmciJiZ0eXBlb2YgQT8uaHJlZjwidSI/QS5ocmVmOkE7Xz1hd2FpdCBpQShlKX1mdW5jdGlvbiBYYShBKXtfPUF9YXN5bmMgZnVuY3Rpb24gVUEoKXtpZihfIT09bnVsbClyZXR1cm4gXy50ZXJtaW5hdGVkJiZhd2FpdCBrdCgpLF87bGV0IEE9U3QoKTtyZXR1cm4gQSE9PW51bGw/QTooYXdhaXQga3QoKSxfKX1hc3luYyBmdW5jdGlvbiBFbyhBLGU9e30pe2xldCB0PVt7dHlwZTpwLkJpbmFyeVN0cmVhbX1dLHI9W3t0eXBlOnAuQmluYXJ5U3RyZWFtLGRhdGE6e2RhdGE6QX19XSxvPVtdO28ucHVzaCgiMCIpLG8ucHVzaCgiMCIpLG8ucHVzaCgiLS1tZW1vcnktaW8iKSxlLnN0cmluZ2lmeSYmZS5zdHJpbmdpZnkmJm8ucHVzaCgiLS1zdHJpbmdpZnkiKSxlLmNvbXByZXNzaW9uTGV2ZWwmJm8ucHVzaCgiLS1jb21wcmVzc2lvbi1sZXZlbCIsZS5jb21wcmVzc2lvbkxldmVsLnRvU3RyaW5nKCkpLGUuZGF0YVVybFByZWZpeCYmby5wdXNoKCItLWRhdGEtdXJsLXByZWZpeCIsZS5kYXRhVXJsUHJlZml4LnRvU3RyaW5nKCkpO2xldCBnPSJjb21wcmVzcy1zdHJpbmdpZnkiLGw9ZT8ud2ViV29ya2VyO2w9PT12b2lkIDAmJihsPWF3YWl0IFVBKCkpO2xldHt3ZWJXb3JrZXI6QixyZXR1cm5WYWx1ZTpJLHN0ZGVycjpzLG91dHB1dHM6UX09YXdhaXQgc0EoZyxvLHQscix7cGlwZWxpbmVCYXNlVXJsOkZBKCkscGlwZWxpbmVXb3JrZXJVcmw6aigpLHdlYldvcmtlcjpsLG5vQ29weTplPy5ub0NvcHl9KTtpZihJIT09MCYmcyE9PSIiKXRocm93IG5ldyBFcnJvcihzKTtyZXR1cm57d2ViV29ya2VyOkIsb3V0cHV0OihRWzBdPy5kYXRhKS5kYXRhfX12YXIgej1Fbzthc3luYyBmdW5jdGlvbiBRbyhBLGU9e30pe2xldCB0PVt7dHlwZTpwLkJpbmFyeVN0cmVhbX1dLHI9W3t0eXBlOnAuQmluYXJ5U3RyZWFtLGRhdGE6e2RhdGE6QX19XSxvPVtdO28ucHVzaCgiMCIpLG8ucHVzaCgiMCIpLG8ucHVzaCgiLS1tZW1vcnktaW8iKSxlLnBhcnNlU3RyaW5nJiZlLnBhcnNlU3RyaW5nJiZvLnB1c2goIi0tcGFyc2Utc3RyaW5nIik7bGV0IGc9InBhcnNlLXN0cmluZy1kZWNvbXByZXNzIixsPWU/LndlYldvcmtlcjtsPT09dm9pZCAwJiYobD1hd2FpdCBVQSgpKTtsZXR7d2ViV29ya2VyOkIscmV0dXJuVmFsdWU6SSxzdGRlcnI6cyxvdXRwdXRzOlF9PWF3YWl0IHNBKGcsbyx0LHIse3BpcGVsaW5lQmFzZVVybDpGQSgpLHBpcGVsaW5lV29ya2VyVXJsOmooKSx3ZWJXb3JrZXI6bCxub0NvcHk6ZT8ubm9Db3B5fSk7aWYoSSE9PTAmJnMhPT0iIil0aHJvdyBuZXcgRXJyb3Iocyk7cmV0dXJue3dlYldvcmtlcjpCLG91dHB1dDooUVswXT8uZGF0YSkuZGF0YX19dmFyIFY9UW87YXN5bmMgZnVuY3Rpb24gdW8oQSxlPXt9KXtsZXQgcj1uZXcgUEEoQS5pbWFnZVR5cGUpO3Iub3JpZ2luPUEub3JpZ2luLHIuc3BhY2luZz1BLnNwYWNpbmcsci5zaXplPUEuc2l6ZSxyLm1ldGFkYXRhPUEubWV0YWRhdGE7bGV0IG89bmV3IFRleHREZWNvZGVyKCJ1dGYtOCIpLG49bmV3IFVpbnQ4QXJyYXkoQS5kaXJlY3Rpb24uYnVmZmVyKSxpPWF3YWl0IHoobix7Y29tcHJlc3Npb25MZXZlbDo1LHN0cmluZ2lmeTohMCx3ZWJXb3JrZXI6ZS53ZWJXb3JrZXIsbm9Db3B5OmUubm9Db3B5fSksZz1pLndlYldvcmtlcjtpZihyLmRpcmVjdGlvbj1vLmRlY29kZShpLm91dHB1dC5idWZmZXIpLEEuZGF0YT09PW51bGwpci5kYXRhPW51bGw7ZWxzZXtsZXQgbD1uZXcgVWludDhBcnJheShBLmRhdGEuYnVmZmVyKSxCPWF3YWl0IHoobCx7Y29tcHJlc3Npb25MZXZlbDo1LHN0cmluZ2lmeTohMCx3ZWJXb3JrZXI6Zyxub0NvcHk6ZS5ub0NvcHl9KTtyLmRhdGE9by5kZWNvZGUoQi5vdXRwdXQuYnVmZmVyKX1yZXR1cm57ZW5jb2RlZDpyLHdlYldvcmtlcjpnfX1hc3luYyBmdW5jdGlvbiBmbyhBLGU9e30pe2xldCB0PUEscj1uZXcgVGV4dEVuY29kZXIsbz1uZXcgVWludDhBcnJheShyLmVuY29kZShBLmRpcmVjdGlvbikpLG49YXdhaXQgVihvLHtwYXJzZVN0cmluZzohMCx3ZWJXb3JrZXI6ZS53ZWJXb3JrZXIsbm9Db3B5OiEwfSksaT1uLndlYldvcmtlcjtpZih0LmRpcmVjdGlvbj1uZXcgRmxvYXQ2NEFycmF5KG4ub3V0cHV0LmJ1ZmZlciksIXQuZGF0YSl0LmRhdGE9bnVsbDtlbHNle2xldCBnPW5ldyBVaW50OEFycmF5KHIuZW5jb2RlKEEuZGF0YSkpLGw9YXdhaXQgVihnLHtwYXJzZVN0cmluZzohMCx3ZWJXb3JrZXI6aSxub0NvcHk6ITB9KTt0LmRhdGE9dyh0LmltYWdlVHlwZS5jb21wb25lbnRUeXBlLGwub3V0cHV0LmJ1ZmZlcil9cmV0dXJue2RlY29kZWQ6dCx3ZWJXb3JrZXI6aX19YXN5bmMgZnVuY3Rpb24gcG8oQSxlPXt9KXtsZXQgcj1uZXcgT0EoQS5tZXNoVHlwZSk7ci5uYW1lPUEubmFtZSxyLm51bWJlck9mUG9pbnRzPUEubnVtYmVyT2ZQb2ludHMsci5udW1iZXJPZkNlbGxzPUEubnVtYmVyT2ZDZWxscyxyLm51bWJlck9mUG9pbnRQaXhlbHM9QS5udW1iZXJPZlBvaW50UGl4ZWxzLHIubnVtYmVyT2ZDZWxsUGl4ZWxzPUEubnVtYmVyT2ZDZWxsUGl4ZWxzLHIuY2VsbEJ1ZmZlclNpemU9QS5jZWxsQnVmZmVyU2l6ZTtsZXQgbz1lLndlYldvcmtlcixuPW5ldyBUZXh0RGVjb2RlcigidXRmLTgiKTtmb3IobGV0IGkgb2ZbInBvaW50cyIsInBvaW50RGF0YSIsImNlbGxzIiwiY2VsbERhdGEiXSlpZihBW2ldPT09bnVsbClyW2ldPW51bGw7ZWxzZXtsZXQgZz1uZXcgVWludDhBcnJheShBW2ldLmJ1ZmZlciksbD1hd2FpdCB6KGcse2NvbXByZXNzaW9uTGV2ZWw6NSxzdHJpbmdpZnk6ITAsd2ViV29ya2VyOm8sbm9Db3B5OmUubm9Db3B5fSk7bz1sLndlYldvcmtlcixyW2ldPW4uZGVjb2RlKGwub3V0cHV0LmJ1ZmZlcil9cmV0dXJue2VuY29kZWQ6cix3ZWJXb3JrZXI6b319YXN5bmMgZnVuY3Rpb24gbW8oQSxlPXt9KXtsZXQgdD1BLHI9bmV3IE1hcChbWyJwb2ludHMiLCJwb2ludENvbXBvbmVudFR5cGUiXSxbInBvaW50RGF0YSIsInBvaW50UGl4ZWxDb21wb25lbnRUeXBlIl0sWyJjZWxscyIsImNlbGxDb21wb25lbnRUeXBlIl0sWyJjZWxsRGF0YSIsImNlbGxQaXhlbENvbXBvbmVudFR5cGUiXV0pLG89bmV3IFRleHRFbmNvZGVyLG49ZS53ZWJXb3JrZXI7Zm9yKGxldCBpIG9mWyJwb2ludHMiLCJwb2ludERhdGEiLCJjZWxscyIsImNlbGxEYXRhIl0paWYodFtpXT09PW51bGwpdFtpXT1udWxsO2Vsc2V7bGV0IGc9bmV3IFVpbnQ4QXJyYXkoby5lbmNvZGUodFtpXSkpLGw9YXdhaXQgVihnLHtwYXJzZVN0cmluZzohMCx3ZWJXb3JrZXI6bixub0NvcHk6ITB9KTtuPWwud2ViV29ya2VyLHRbaV09dyh0Lm1lc2hUeXBlW3IuZ2V0KGkpXSxsLm91dHB1dC5idWZmZXIpfXJldHVybntkZWNvZGVkOnQsd2ViV29ya2VyOm59fWFzeW5jIGZ1bmN0aW9uIHlvKEEsZT17fSl7bGV0IHI9bmV3IEhBKEEucG9seURhdGFUeXBlKTtyLm5hbWU9QS5uYW1lLHIubnVtYmVyT2ZQb2ludHM9QS5udW1iZXJPZlBvaW50cyxyLnZlcnRpY2VzQnVmZmVyU2l6ZT1BLnZlcnRpY2VzQnVmZmVyU2l6ZSxyLmxpbmVzQnVmZmVyU2l6ZT1BLmxpbmVzQnVmZmVyU2l6ZSxyLnBvbHlnb25zQnVmZmVyU2l6ZT1BLnBvbHlnb25zQnVmZmVyU2l6ZSxyLnRyaWFuZ2xlU3RyaXBzQnVmZmVyU2l6ZT1BLnRyaWFuZ2xlU3RyaXBzQnVmZmVyU2l6ZSxyLm51bWJlck9mUG9pbnRQaXhlbHM9QS5udW1iZXJPZlBvaW50UGl4ZWxzLHIubnVtYmVyT2ZDZWxsUGl4ZWxzPUEubnVtYmVyT2ZDZWxsUGl4ZWxzO2xldCBvPWUud2ViV29ya2VyLG49bmV3IFRleHREZWNvZGVyKCJ1dGYtOCIpO2ZvcihsZXQgaSBvZlsicG9pbnRzIiwidmVydGljZXMiLCJsaW5lcyIsInBvbHlnb25zIiwidHJpYW5nbGVTdHJpcHMiLCJwb2ludERhdGEiLCJjZWxsRGF0YSJdKWlmKEFbaV09PT1udWxsKXJbaV09bnVsbDtlbHNle2xldCBnPW5ldyBVaW50OEFycmF5KEFbaV0uYnVmZmVyKSxsPWF3YWl0IHooZyx7Y29tcHJlc3Npb25MZXZlbDo1LHN0cmluZ2lmeTohMCx3ZWJXb3JrZXI6byxub0NvcHk6ZS5ub0NvcHl9KTtvPWwud2ViV29ya2VyLHJbaV09bi5kZWNvZGUobC5vdXRwdXQuYnVmZmVyKX1yZXR1cm57ZW5jb2RlZDpyLHdlYldvcmtlcjpvfX1hc3luYyBmdW5jdGlvbiBobyhBLGU9e30pe2xldCB0PUEscj1uZXcgTWFwKFtbInBvaW50cyIsImZsb2F0MzIiXSxbInZlcnRpY2VzIiwidWludDMyIl0sWyJsaW5lcyIsInVpbnQzMiJdLFsicG9seWdvbnMiLCJ1aW50MzIiXSxbInRyaWFuZ2xlU3RyaXBzIiwidWludDMyIl0sWyJwb2ludERhdGEiLHQucG9seURhdGFUeXBlLnBvaW50UGl4ZWxDb21wb25lbnRUeXBlXSxbImNlbGxEYXRhIix0LnBvbHlEYXRhVHlwZS5jZWxsUGl4ZWxDb21wb25lbnRUeXBlXV0pLG89bmV3IFRleHRFbmNvZGVyLG49ZS53ZWJXb3JrZXI7Zm9yKGxldCBpIG9mWyJwb2ludHMiLCJ2ZXJ0aWNlcyIsImxpbmVzIiwicG9seWdvbnMiLCJ0cmlhbmdsZVN0cmlwcyIsInBvaW50RGF0YSIsImNlbGxEYXRhIl0paWYodFtpXT09PW51bGwpdFtpXT1udWxsO2Vsc2V7bGV0IGc9bmV3IFVpbnQ4QXJyYXkoby5lbmNvZGUodFtpXSkpLGw9YXdhaXQgVihnLHtwYXJzZVN0cmluZzohMCx3ZWJXb3JrZXI6bixub0NvcHk6ITB9KTtuPWwud2ViV29ya2VyLHRbaV09dyhyLmdldChpKSxsLm91dHB1dC5idWZmZXIpfXJldHVybntkZWNvZGVkOnQsd2ViV29ya2VyOm59fXZhciBSdD0nZGF0YTp0ZXh0L2phdmFzY3JpcHQ7Y2hhcnNldD11dGYtOCx2YXIgSUk9T2JqZWN0LmRlZmluZVByb3BlcnR5O3ZhciBlST0oQSx0KT0+e2Zvcih2YXIgSSBpbiB0KUlJKEEsSSx7Z2V0OnRbSV0sZW51bWVyYWJsZTohMH0pfTt2YXIgdkE9U3ltYm9sKCJDb21saW5rLnByb3h5IiksZ0k9U3ltYm9sKCJDb21saW5rLmVuZHBvaW50Iiksckk9U3ltYm9sKCJDb21saW5rLnJlbGVhc2VQcm94eSIpLHBBPVN5bWJvbCgiQ29tbGluay5maW5hbGl6ZXIiKSxlQT1TeW1ib2woIkNvbWxpbmsudGhyb3duIiksJEE9QT0+dHlwZW9mIEE9PSJvYmplY3QiJiZBIT09bnVsbHx8dHlwZW9mIEE9PSJmdW5jdGlvbiIsb0k9e2NhbkhhbmRsZTpBPT4kQShBKSYmQVt2QV0sc2VyaWFsaXplKEEpe2xldHtwb3J0MTp0LHBvcnQyOkl9PW5ldyBNZXNzYWdlQ2hhbm5lbDtyZXR1cm4gaUEoQSx0KSxbSSxbSV1dfSxkZXNlcmlhbGl6ZShBKXtyZXR1cm4gQS5zdGFydCgpLG5JKEEpfX0saUk9e2NhbkhhbmRsZTpBPT4kQShBKSYmZUEgaW4gQSxzZXJpYWxpemUoe3ZhbHVlOkF9KXtsZXQgdDtyZXR1cm4gQSBpbnN0YW5jZW9mIEVycm9yP3Q9e2lzRXJyb3I6ITAsdmFsdWU6e21lc3NhZ2U6QS5tZXNzYWdlLG5hbWU6QS5uYW1lLHN0YWNrOkEuc3RhY2t9fTp0PXtpc0Vycm9yOiExLHZhbHVlOkF9LFt0LFtdXX0sZGVzZXJpYWxpemUoQSl7dGhyb3cgQS5pc0Vycm9yP09iamVjdC5hc3NpZ24obmV3IEVycm9yKEEudmFsdWUubWVzc2FnZSksQS52YWx1ZSk6QS52YWx1ZX19LEF0PW5ldyBNYXAoW1sicHJveHkiLG9JXSxbInRocm93IixpSV1dKTtmdW5jdGlvbiBDSShBLHQpe2ZvcihsZXQgSSBvZiBBKWlmKHQ9PT1JfHxJPT09IioifHxJIGluc3RhbmNlb2YgUmVnRXhwJiZJLnRlc3QodCkpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gaUEoQSx0PWdsb2JhbFRoaXMsST1bIioiXSl7dC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbiBlKGcpe2lmKCFnfHwhZy5kYXRhKXJldHVybjtpZighQ0koSSxnLm9yaWdpbikpe2NvbnNvbGUud2FybihgSW52YWxpZCBvcmlnaW4gXCcke2cub3JpZ2lufVwnIGZvciBjb21saW5rIHByb3h5YCk7cmV0dXJufWxldHtpZDpyLHR5cGU6byxwYXRoOm59PU9iamVjdC5hc3NpZ24oe3BhdGg6W119LGcuZGF0YSksYT0oZy5kYXRhLmFyZ3VtZW50TGlzdHx8W10pLm1hcChiKSxRO3RyeXtsZXQgQj1uLnNsaWNlKDAsLTEpLnJlZHVjZSgoZixzKT0+ZltzXSxBKSxpPW4ucmVkdWNlKChmLHMpPT5mW3NdLEEpO3N3aXRjaChvKXtjYXNlIkdFVCI6UT1pO2JyZWFrO2Nhc2UiU0VUIjpCW24uc2xpY2UoLTEpWzBdXT1iKGcuZGF0YS52YWx1ZSksUT0hMDticmVhaztjYXNlIkFQUExZIjpRPWkuYXBwbHkoQixhKTticmVhaztjYXNlIkNPTlNUUlVDVCI6e2xldCBmPW5ldyBpKC4uLmEpO1E9YUkoZil9YnJlYWs7Y2FzZSJFTkRQT0lOVCI6e2xldHtwb3J0MTpmLHBvcnQyOnN9PW5ldyBNZXNzYWdlQ2hhbm5lbDtpQShBLHMpLFE9RkEoZixbZl0pfWJyZWFrO2Nhc2UiUkVMRUFTRSI6UT12b2lkIDA7YnJlYWs7ZGVmYXVsdDpyZXR1cm59fWNhdGNoKEIpe1E9e3ZhbHVlOkIsW2VBXTowfX1Qcm9taXNlLnJlc29sdmUoUSkuY2F0Y2goQj0+KHt2YWx1ZTpCLFtlQV06MH0pKS50aGVuKEI9PntsZXRbaSxmXT1vQShCKTt0LnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxpKSx7aWQ6cn0pLGYpLG89PT0iUkVMRUFTRSImJih0LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGUpLHR0KHQpLHBBIGluIEEmJnR5cGVvZiBBW3BBXT09ImZ1bmN0aW9uIiYmQVtwQV0oKSl9KS5jYXRjaChCPT57bGV0W2ksZl09b0Eoe3ZhbHVlOm5ldyBUeXBlRXJyb3IoIlVuc2VyaWFsaXphYmxlIHJldHVybiB2YWx1ZSIpLFtlQV06MH0pO3QucG9zdE1lc3NhZ2UoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGkpLHtpZDpyfSksZil9KX0pLHQuc3RhcnQmJnQuc3RhcnQoKX1mdW5jdGlvbiBCSShBKXtyZXR1cm4gQS5jb25zdHJ1Y3Rvci5uYW1lPT09Ik1lc3NhZ2VQb3J0In1mdW5jdGlvbiB0dChBKXtCSShBKSYmQS5jbG9zZSgpfWZ1bmN0aW9uIG5JKEEsdCl7cmV0dXJuIFNBKEEsW10sdCl9ZnVuY3Rpb24gSUEoQSl7aWYoQSl0aHJvdyBuZXcgRXJyb3IoIlByb3h5IGhhcyBiZWVuIHJlbGVhc2VkIGFuZCBpcyBub3QgdXNlYWJsZSIpfWZ1bmN0aW9uIEl0KEEpe3JldHVybiBxKEEse3R5cGU6IlJFTEVBU0UifSkudGhlbigoKT0+e3R0KEEpfSl9dmFyIGdBPW5ldyBXZWFrTWFwLHJBPSJGaW5hbGl6YXRpb25SZWdpc3RyeSJpbiBnbG9iYWxUaGlzJiZuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoQT0+e2xldCB0PShnQS5nZXQoQSl8fDApLTE7Z0Euc2V0KEEsdCksdD09PTAmJkl0KEEpfSk7ZnVuY3Rpb24gc0koQSx0KXtsZXQgST0oZ0EuZ2V0KHQpfHwwKSsxO2dBLnNldCh0LEkpLHJBJiZyQS5yZWdpc3RlcihBLHQsQSl9ZnVuY3Rpb24gUUkoQSl7ckEmJnJBLnVucmVnaXN0ZXIoQSl9ZnVuY3Rpb24gU0EoQSx0PVtdLEk9ZnVuY3Rpb24oKXt9KXtsZXQgZT0hMSxnPW5ldyBQcm94eShJLHtnZXQocixvKXtpZihJQShlKSxvPT09ckkpcmV0dXJuKCk9PntRSShnKSxJdChBKSxlPSEwfTtpZihvPT09InRoZW4iKXtpZih0Lmxlbmd0aD09PTApcmV0dXJue3RoZW46KCk9Pmd9O2xldCBuPXEoQSx7dHlwZToiR0VUIixwYXRoOnQubWFwKGE9PmEudG9TdHJpbmcoKSl9KS50aGVuKGIpO3JldHVybiBuLnRoZW4uYmluZChuKX1yZXR1cm4gU0EoQSxbLi4udCxvXSl9LHNldChyLG8sbil7SUEoZSk7bGV0W2EsUV09b0Eobik7cmV0dXJuIHEoQSx7dHlwZToiU0VUIixwYXRoOlsuLi50LG9dLm1hcChCPT5CLnRvU3RyaW5nKCkpLHZhbHVlOmF9LFEpLnRoZW4oYil9LGFwcGx5KHIsbyxuKXtJQShlKTtsZXQgYT10W3QubGVuZ3RoLTFdO2lmKGE9PT1nSSlyZXR1cm4gcShBLHt0eXBlOiJFTkRQT0lOVCJ9KS50aGVuKGIpO2lmKGE9PT0iYmluZCIpcmV0dXJuIFNBKEEsdC5zbGljZSgwLC0xKSk7bGV0W1EsQl09X0Eobik7cmV0dXJuIHEoQSx7dHlwZToiQVBQTFkiLHBhdGg6dC5tYXAoaT0+aS50b1N0cmluZygpKSxhcmd1bWVudExpc3Q6UX0sQikudGhlbihiKX0sY29uc3RydWN0KHIsbyl7SUEoZSk7bGV0W24sYV09X0Eobyk7cmV0dXJuIHEoQSx7dHlwZToiQ09OU1RSVUNUIixwYXRoOnQubWFwKFE9PlEudG9TdHJpbmcoKSksYXJndW1lbnRMaXN0Om59LGEpLnRoZW4oYil9fSk7cmV0dXJuIHNJKGcsQSksZ31mdW5jdGlvbiBFSShBKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSxBKX1mdW5jdGlvbiBfQShBKXtsZXQgdD1BLm1hcChvQSk7cmV0dXJuW3QubWFwKEk9PklbMF0pLEVJKHQubWFwKEk9PklbMV0pKV19dmFyIGV0PW5ldyBXZWFrTWFwO2Z1bmN0aW9uIEZBKEEsdCl7cmV0dXJuIGV0LnNldChBLHQpLEF9ZnVuY3Rpb24gYUkoQSl7cmV0dXJuIE9iamVjdC5hc3NpZ24oQSx7W3ZBXTohMH0pfWZ1bmN0aW9uIG9BKEEpe2ZvcihsZXRbdCxJXW9mIEF0KWlmKEkuY2FuSGFuZGxlKEEpKXtsZXRbZSxnXT1JLnNlcmlhbGl6ZShBKTtyZXR1cm5be3R5cGU6IkhBTkRMRVIiLG5hbWU6dCx2YWx1ZTplfSxnXX1yZXR1cm5be3R5cGU6IlJBVyIsdmFsdWU6QX0sZXQuZ2V0KEEpfHxbXV19ZnVuY3Rpb24gYihBKXtzd2l0Y2goQS50eXBlKXtjYXNlIkhBTkRMRVIiOnJldHVybiBBdC5nZXQoQS5uYW1lKS5kZXNlcmlhbGl6ZShBLnZhbHVlKTtjYXNlIlJBVyI6cmV0dXJuIEEudmFsdWV9fWZ1bmN0aW9uIHEoQSx0LEkpe3JldHVybiBuZXcgUHJvbWlzZShlPT57bGV0IGc9Y0koKTtBLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uIHIobyl7IW8uZGF0YXx8IW8uZGF0YS5pZHx8by5kYXRhLmlkIT09Z3x8KEEucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsciksZShvLmRhdGEpKX0pLEEuc3RhcnQmJkEuc3RhcnQoKSxBLnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oe2lkOmd9LHQpLEkpfSl9ZnVuY3Rpb24gY0koKXtyZXR1cm4gbmV3IEFycmF5KDQpLmZpbGwoMCkubWFwKCgpPT5NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLnRvU3RyaW5nKDE2KSkuam9pbigiLSIpfWZ1bmN0aW9uIFcoQSx0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gQS5hcHBseSh0LGFyZ3VtZW50cyl9fXZhcnt0b1N0cmluZzpmSX09T2JqZWN0LnByb3RvdHlwZSx7Z2V0UHJvdG90eXBlT2Y6VUF9PU9iamVjdCxCQT0oQT0+dD0+e2xldCBJPWZJLmNhbGwodCk7cmV0dXJuIEFbSV18fChBW0ldPUkuc2xpY2UoOCwtMSkudG9Mb3dlckNhc2UoKSl9KShPYmplY3QuY3JlYXRlKG51bGwpKSxVPUE9PihBPUEudG9Mb3dlckNhc2UoKSx0PT5CQSh0KT09PUEpLG5BPUE9PnQ9PnR5cGVvZiB0PT09QSx7aXNBcnJheTpLfT1BcnJheSxaPW5BKCJ1bmRlZmluZWQiKTtmdW5jdGlvbiBsSShBKXtyZXR1cm4gQSE9PW51bGwmJiFaKEEpJiZBLmNvbnN0cnVjdG9yIT09bnVsbCYmIVooQS5jb25zdHJ1Y3RvcikmJkYoQS5jb25zdHJ1Y3Rvci5pc0J1ZmZlcikmJkEuY29uc3RydWN0b3IuaXNCdWZmZXIoQSl9dmFyIGl0PVUoIkFycmF5QnVmZmVyIik7ZnVuY3Rpb24gREkoQSl7bGV0IHQ7cmV0dXJuIHR5cGVvZiBBcnJheUJ1ZmZlcjwidSImJkFycmF5QnVmZmVyLmlzVmlldz90PUFycmF5QnVmZmVyLmlzVmlldyhBKTp0PUEmJkEuYnVmZmVyJiZpdChBLmJ1ZmZlciksdH12YXIgdUk9bkEoInN0cmluZyIpLEY9bkEoImZ1bmN0aW9uIiksQ3Q9bkEoIm51bWJlciIpLHNBPUE9PkEhPT1udWxsJiZ0eXBlb2YgQT09Im9iamVjdCIsaEk9QT0+QT09PSEwfHxBPT09ITEsQ0E9QT0+e2lmKEJBKEEpIT09Im9iamVjdCIpcmV0dXJuITE7bGV0IHQ9VUEoQSk7cmV0dXJuKHQ9PT1udWxsfHx0PT09T2JqZWN0LnByb3RvdHlwZXx8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpPT09bnVsbCkmJiEoU3ltYm9sLnRvU3RyaW5nVGFnIGluIEEpJiYhKFN5bWJvbC5pdGVyYXRvciBpbiBBKX0sZEk9VSgiRGF0ZSIpLHlJPVUoIkZpbGUiKSx3ST1VKCJCbG9iIiksbUk9VSgiRmlsZUxpc3QiKSxwST1BPT5zQShBKSYmRihBLnBpcGUpLFNJPUE9PntsZXQgdDtyZXR1cm4gQSYmKHR5cGVvZiBGb3JtRGF0YT09ImZ1bmN0aW9uIiYmQSBpbnN0YW5jZW9mIEZvcm1EYXRhfHxGKEEuYXBwZW5kKSYmKCh0PUJBKEEpKT09PSJmb3JtZGF0YSJ8fHQ9PT0ib2JqZWN0IiYmRihBLnRvU3RyaW5nKSYmQS50b1N0cmluZygpPT09IltvYmplY3QgRm9ybURhdGFdIikpfSxGST1VKCJVUkxTZWFyY2hQYXJhbXMiKSxSST1BPT5BLnRyaW0/QS50cmltKCk6QS5yZXBsYWNlKC9eW1xcc1xcdUZFRkZcXHhBMF0rfFtcXHNcXHVGRUZGXFx4QTBdKyQvZywiIik7ZnVuY3Rpb24gVihBLHQse2FsbE93bktleXM6ST0hMX09e30pe2lmKEE9PT1udWxsfHx0eXBlb2YgQT4idSIpcmV0dXJuO2xldCBlLGc7aWYodHlwZW9mIEEhPSJvYmplY3QiJiYoQT1bQV0pLEsoQSkpZm9yKGU9MCxnPUEubGVuZ3RoO2U8ZztlKyspdC5jYWxsKG51bGwsQVtlXSxlLEEpO2Vsc2V7bGV0IHI9ST9PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhBKTpPYmplY3Qua2V5cyhBKSxvPXIubGVuZ3RoLG47Zm9yKGU9MDtlPG87ZSsrKW49cltlXSx0LmNhbGwobnVsbCxBW25dLG4sQSl9fWZ1bmN0aW9uIEJ0KEEsdCl7dD10LnRvTG93ZXJDYXNlKCk7bGV0IEk9T2JqZWN0LmtleXMoQSksZT1JLmxlbmd0aCxnO2Zvcig7ZS0tID4wOylpZihnPUlbZV0sdD09PWcudG9Mb3dlckNhc2UoKSlyZXR1cm4gZztyZXR1cm4gbnVsbH12YXIgbnQ9dHlwZW9mIGdsb2JhbFRoaXM8InUiP2dsb2JhbFRoaXM6dHlwZW9mIHNlbGY8InUiP3NlbGY6dHlwZW9mIHdpbmRvdzwidSI/d2luZG93Omdsb2JhbCxzdD1BPT4hWihBKSYmQSE9PW50O2Z1bmN0aW9uIE5BKCl7bGV0e2Nhc2VsZXNzOkF9PXN0KHRoaXMpJiZ0aGlzfHx7fSx0PXt9LEk9KGUsZyk9PntsZXQgcj1BJiZCdCh0LGcpfHxnO0NBKHRbcl0pJiZDQShlKT90W3JdPU5BKHRbcl0sZSk6Q0EoZSk/dFtyXT1OQSh7fSxlKTpLKGUpP3Rbcl09ZS5zbGljZSgpOnRbcl09ZX07Zm9yKGxldCBlPTAsZz1hcmd1bWVudHMubGVuZ3RoO2U8ZztlKyspYXJndW1lbnRzW2VdJiZWKGFyZ3VtZW50c1tlXSxJKTtyZXR1cm4gdH12YXIgTkk9KEEsdCxJLHthbGxPd25LZXlzOmV9PXt9KT0+KFYodCwoZyxyKT0+e0kmJkYoZyk/QVtyXT1XKGcsSSk6QVtyXT1nfSx7YWxsT3duS2V5czplfSksQSksVUk9QT0+KEEuY2hhckNvZGVBdCgwKT09PTY1Mjc5JiYoQT1BLnNsaWNlKDEpKSxBKSxHST0oQSx0LEksZSk9PntBLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlLGUpLEEucHJvdG90eXBlLmNvbnN0cnVjdG9yPUEsT2JqZWN0LmRlZmluZVByb3BlcnR5KEEsInN1cGVyIix7dmFsdWU6dC5wcm90b3R5cGV9KSxJJiZPYmplY3QuYXNzaWduKEEucHJvdG90eXBlLEkpfSxrST0oQSx0LEksZSk9PntsZXQgZyxyLG8sbj17fTtpZih0PXR8fHt9LEE9PW51bGwpcmV0dXJuIHQ7ZG97Zm9yKGc9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoQSkscj1nLmxlbmd0aDtyLS0gPjA7KW89Z1tyXSwoIWV8fGUobyxBLHQpKSYmIW5bb10mJih0W29dPUFbb10sbltvXT0hMCk7QT1JIT09ITEmJlVBKEEpfXdoaWxlKEEmJighSXx8SShBLHQpKSYmQSE9PU9iamVjdC5wcm90b3R5cGUpO3JldHVybiB0fSxMST0oQSx0LEkpPT57QT1TdHJpbmcoQSksKEk9PT12b2lkIDB8fEk+QS5sZW5ndGgpJiYoST1BLmxlbmd0aCksSS09dC5sZW5ndGg7bGV0IGU9QS5pbmRleE9mKHQsSSk7cmV0dXJuIGUhPT0tMSYmZT09PUl9LEpJPUE9PntpZighQSlyZXR1cm4gbnVsbDtpZihLKEEpKXJldHVybiBBO2xldCB0PUEubGVuZ3RoO2lmKCFDdCh0KSlyZXR1cm4gbnVsbDtsZXQgST1uZXcgQXJyYXkodCk7Zm9yKDt0LS0gPjA7KUlbdF09QVt0XTtyZXR1cm4gSX0sSEk9KEE9PnQ9PkEmJnQgaW5zdGFuY2VvZiBBKSh0eXBlb2YgVWludDhBcnJheTwidSImJlVBKFVpbnQ4QXJyYXkpKSxZST0oQSx0KT0+e2xldCBlPShBJiZBW1N5bWJvbC5pdGVyYXRvcl0pLmNhbGwoQSksZztmb3IoOyhnPWUubmV4dCgpKSYmIWcuZG9uZTspe2xldCByPWcudmFsdWU7dC5jYWxsKEEsclswXSxyWzFdKX19LGJJPShBLHQpPT57bGV0IEksZT1bXTtmb3IoOyhJPUEuZXhlYyh0KSkhPT1udWxsOyllLnB1c2goSSk7cmV0dXJuIGV9LE1JPVUoIkhUTUxGb3JtRWxlbWVudCIpLHFJPUE9PkEudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLV9cXHNdKFthLXpcXGRdKShcXHcqKS9nLGZ1bmN0aW9uKEksZSxnKXtyZXR1cm4gZS50b1VwcGVyQ2FzZSgpK2d9KSxydD0oKHtoYXNPd25Qcm9wZXJ0eTpBfSk9Pih0LEkpPT5BLmNhbGwodCxJKSkoT2JqZWN0LnByb3RvdHlwZSksS0k9VSgiUmVnRXhwIiksUXQ9KEEsdCk9PntsZXQgST1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhBKSxlPXt9O1YoSSwoZyxyKT0+e2xldCBvOyhvPXQoZyxyLEEpKSE9PSExJiYoZVtyXT1vfHxnKX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEEsZSl9LE9JPUE9PntRdChBLCh0LEkpPT57aWYoRihBKSYmWyJhcmd1bWVudHMiLCJjYWxsZXIiLCJjYWxsZWUiXS5pbmRleE9mKEkpIT09LTEpcmV0dXJuITE7bGV0IGU9QVtJXTtpZihGKGUpKXtpZih0LmVudW1lcmFibGU9ITEsIndyaXRhYmxlImluIHQpe3Qud3JpdGFibGU9ITE7cmV0dXJufXQuc2V0fHwodC5zZXQ9KCk9Pnt0aHJvdyBFcnJvcigiQ2FuIG5vdCByZXdyaXRlIHJlYWQtb25seSBtZXRob2QgXCciK0krIlwnIil9KX19KX0sVEk9KEEsdCk9PntsZXQgST17fSxlPWc9PntnLmZvckVhY2gocj0+e0lbcl09ITB9KX07cmV0dXJuIEsoQSk/ZShBKTplKFN0cmluZyhBKS5zcGxpdCh0KSksSX0sUEk9KCk9Pnt9LHhJPShBLHQpPT4oQT0rQSxOdW1iZXIuaXNGaW5pdGUoQSk/QTp0KSxSQT0iYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLG90PSIwMTIzNDU2Nzg5IixFdD17RElHSVQ6b3QsQUxQSEE6UkEsQUxQSEFfRElHSVQ6UkErUkEudG9VcHBlckNhc2UoKStvdH0sakk9KEE9MTYsdD1FdC5BTFBIQV9ESUdJVCk9PntsZXQgST0iIix7bGVuZ3RoOmV9PXQ7Zm9yKDtBLS07KUkrPXRbTWF0aC5yYW5kb20oKSplfDBdO3JldHVybiBJfTtmdW5jdGlvbiBXSShBKXtyZXR1cm4hIShBJiZGKEEuYXBwZW5kKSYmQVtTeW1ib2wudG9TdHJpbmdUYWddPT09IkZvcm1EYXRhIiYmQVtTeW1ib2wuaXRlcmF0b3JdKX12YXIgWkk9QT0+e2xldCB0PW5ldyBBcnJheSgxMCksST0oZSxnKT0+e2lmKHNBKGUpKXtpZih0LmluZGV4T2YoZSk+PTApcmV0dXJuO2lmKCEoInRvSlNPTiJpbiBlKSl7dFtnXT1lO2xldCByPUsoZSk/W106e307cmV0dXJuIFYoZSwobyxuKT0+e2xldCBhPUkobyxnKzEpOyFaKGEpJiYocltuXT1hKX0pLHRbZ109dm9pZCAwLHJ9fXJldHVybiBlfTtyZXR1cm4gSShBLDApfSxWST1VKCJBc3luY0Z1bmN0aW9uIiksWEk9QT0+QSYmKHNBKEEpfHxGKEEpKSYmRihBLnRoZW4pJiZGKEEuY2F0Y2gpLEM9e2lzQXJyYXk6Syxpc0FycmF5QnVmZmVyOml0LGlzQnVmZmVyOmxJLGlzRm9ybURhdGE6U0ksaXNBcnJheUJ1ZmZlclZpZXc6REksaXNTdHJpbmc6dUksaXNOdW1iZXI6Q3QsaXNCb29sZWFuOmhJLGlzT2JqZWN0OnNBLGlzUGxhaW5PYmplY3Q6Q0EsaXNVbmRlZmluZWQ6Wixpc0RhdGU6ZEksaXNGaWxlOnlJLGlzQmxvYjp3SSxpc1JlZ0V4cDpLSSxpc0Z1bmN0aW9uOkYsaXNTdHJlYW06cEksaXNVUkxTZWFyY2hQYXJhbXM6RkksaXNUeXBlZEFycmF5OkhJLGlzRmlsZUxpc3Q6bUksZm9yRWFjaDpWLG1lcmdlOk5BLGV4dGVuZDpOSSx0cmltOlJJLHN0cmlwQk9NOlVJLGluaGVyaXRzOkdJLHRvRmxhdE9iamVjdDprSSxraW5kT2Y6QkEsa2luZE9mVGVzdDpVLGVuZHNXaXRoOkxJLHRvQXJyYXk6SkksZm9yRWFjaEVudHJ5OllJLG1hdGNoQWxsOmJJLGlzSFRNTEZvcm06TUksaGFzT3duUHJvcGVydHk6cnQsaGFzT3duUHJvcDpydCxyZWR1Y2VEZXNjcmlwdG9yczpRdCxmcmVlemVNZXRob2RzOk9JLHRvT2JqZWN0U2V0OlRJLHRvQ2FtZWxDYXNlOnFJLG5vb3A6UEksdG9GaW5pdGVOdW1iZXI6eEksZmluZEtleTpCdCxnbG9iYWw6bnQsaXNDb250ZXh0RGVmaW5lZDpzdCxBTFBIQUJFVDpFdCxnZW5lcmF0ZVN0cmluZzpqSSxpc1NwZWNDb21wbGlhbnRGb3JtOldJLHRvSlNPTk9iamVjdDpaSSxpc0FzeW5jRm46VkksaXNUaGVuYWJsZTpYSX07ZnVuY3Rpb24gTyhBLHQsSSxlLGcpe0Vycm9yLmNhbGwodGhpcyksRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U/RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcyx0aGlzLmNvbnN0cnVjdG9yKTp0aGlzLnN0YWNrPW5ldyBFcnJvcigpLnN0YWNrLHRoaXMubWVzc2FnZT1BLHRoaXMubmFtZT0iQXhpb3NFcnJvciIsdCYmKHRoaXMuY29kZT10KSxJJiYodGhpcy5jb25maWc9SSksZSYmKHRoaXMucmVxdWVzdD1lKSxnJiYodGhpcy5yZXNwb25zZT1nKX1DLmluaGVyaXRzKE8sRXJyb3Ise3RvSlNPTjpmdW5jdGlvbigpe3JldHVybnttZXNzYWdlOnRoaXMubWVzc2FnZSxuYW1lOnRoaXMubmFtZSxkZXNjcmlwdGlvbjp0aGlzLmRlc2NyaXB0aW9uLG51bWJlcjp0aGlzLm51bWJlcixmaWxlTmFtZTp0aGlzLmZpbGVOYW1lLGxpbmVOdW1iZXI6dGhpcy5saW5lTnVtYmVyLGNvbHVtbk51bWJlcjp0aGlzLmNvbHVtbk51bWJlcixzdGFjazp0aGlzLnN0YWNrLGNvbmZpZzpDLnRvSlNPTk9iamVjdCh0aGlzLmNvbmZpZyksY29kZTp0aGlzLmNvZGUsc3RhdHVzOnRoaXMucmVzcG9uc2UmJnRoaXMucmVzcG9uc2Uuc3RhdHVzP3RoaXMucmVzcG9uc2Uuc3RhdHVzOm51bGx9fX0pO3ZhciBhdD1PLnByb3RvdHlwZSxjdD17fTtbIkVSUl9CQURfT1BUSU9OX1ZBTFVFIiwiRVJSX0JBRF9PUFRJT04iLCJFQ09OTkFCT1JURUQiLCJFVElNRURPVVQiLCJFUlJfTkVUV09SSyIsIkVSUl9GUl9UT09fTUFOWV9SRURJUkVDVFMiLCJFUlJfREVQUkVDQVRFRCIsIkVSUl9CQURfUkVTUE9OU0UiLCJFUlJfQkFEX1JFUVVFU1QiLCJFUlJfQ0FOQ0VMRUQiLCJFUlJfTk9UX1NVUFBPUlQiLCJFUlJfSU5WQUxJRF9VUkwiXS5mb3JFYWNoKEE9PntjdFtBXT17dmFsdWU6QX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhPLGN0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYXQsImlzQXhpb3NFcnJvciIse3ZhbHVlOiEwfSk7Ty5mcm9tPShBLHQsSSxlLGcscik9PntsZXQgbz1PYmplY3QuY3JlYXRlKGF0KTtyZXR1cm4gQy50b0ZsYXRPYmplY3QoQSxvLGZ1bmN0aW9uKGEpe3JldHVybiBhIT09RXJyb3IucHJvdG90eXBlfSxuPT5uIT09ImlzQXhpb3NFcnJvciIpLE8uY2FsbChvLEEubWVzc2FnZSx0LEksZSxnKSxvLmNhdXNlPUEsby5uYW1lPUEubmFtZSxyJiZPYmplY3QuYXNzaWduKG8sciksb307dmFyIGw9Tzt2YXIgUUE9bnVsbDtmdW5jdGlvbiBHQShBKXtyZXR1cm4gQy5pc1BsYWluT2JqZWN0KEEpfHxDLmlzQXJyYXkoQSl9ZnVuY3Rpb24gbHQoQSl7cmV0dXJuIEMuZW5kc1dpdGgoQSwiW10iKT9BLnNsaWNlKDAsLTIpOkF9ZnVuY3Rpb24gZnQoQSx0LEkpe3JldHVybiBBP0EuY29uY2F0KHQpLm1hcChmdW5jdGlvbihnLHIpe3JldHVybiBnPWx0KGcpLCFJJiZyPyJbIitnKyJdIjpnfSkuam9pbihJPyIuIjoiIik6dH1mdW5jdGlvbiB6SShBKXtyZXR1cm4gQy5pc0FycmF5KEEpJiYhQS5zb21lKEdBKX12YXIgX0k9Qy50b0ZsYXRPYmplY3QoQyx7fSxudWxsLGZ1bmN0aW9uKHQpe3JldHVybi9eaXNbQS1aXS8udGVzdCh0KX0pO2Z1bmN0aW9uIHZJKEEsdCxJKXtpZighQy5pc09iamVjdChBKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJ0YXJnZXQgbXVzdCBiZSBhbiBvYmplY3QiKTt0PXR8fG5ldyhRQXx8Rm9ybURhdGEpLEk9Qy50b0ZsYXRPYmplY3QoSSx7bWV0YVRva2VuczohMCxkb3RzOiExLGluZGV4ZXM6ITF9LCExLGZ1bmN0aW9uKGMsdSl7cmV0dXJuIUMuaXNVbmRlZmluZWQodVtjXSl9KTtsZXQgZT1JLm1ldGFUb2tlbnMsZz1JLnZpc2l0b3J8fEIscj1JLmRvdHMsbz1JLmluZGV4ZXMsYT0oSS5CbG9ifHx0eXBlb2YgQmxvYjwidSImJkJsb2IpJiZDLmlzU3BlY0NvbXBsaWFudEZvcm0odCk7aWYoIUMuaXNGdW5jdGlvbihnKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJ2aXNpdG9yIG11c3QgYmUgYSBmdW5jdGlvbiIpO2Z1bmN0aW9uIFEoRSl7aWYoRT09PW51bGwpcmV0dXJuIiI7aWYoQy5pc0RhdGUoRSkpcmV0dXJuIEUudG9JU09TdHJpbmcoKTtpZighYSYmQy5pc0Jsb2IoRSkpdGhyb3cgbmV3IGwoIkJsb2IgaXMgbm90IHN1cHBvcnRlZC4gVXNlIGEgQnVmZmVyIGluc3RlYWQuIik7cmV0dXJuIEMuaXNBcnJheUJ1ZmZlcihFKXx8Qy5pc1R5cGVkQXJyYXkoRSk/YSYmdHlwZW9mIEJsb2I9PSJmdW5jdGlvbiI/bmV3IEJsb2IoW0VdKTpCdWZmZXIuZnJvbShFKTpFfWZ1bmN0aW9uIEIoRSxjLHUpe2xldCB5PUU7aWYoRSYmIXUmJnR5cGVvZiBFPT0ib2JqZWN0Iil7aWYoQy5lbmRzV2l0aChjLCJ7fSIpKWM9ZT9jOmMuc2xpY2UoMCwtMiksRT1KU09OLnN0cmluZ2lmeShFKTtlbHNlIGlmKEMuaXNBcnJheShFKSYmekkoRSl8fChDLmlzRmlsZUxpc3QoRSl8fEMuZW5kc1dpdGgoYywiW10iKSkmJih5PUMudG9BcnJheShFKSkpcmV0dXJuIGM9bHQoYykseS5mb3JFYWNoKGZ1bmN0aW9uKE4sdEkpeyEoQy5pc1VuZGVmaW5lZChOKXx8Tj09PW51bGwpJiZ0LmFwcGVuZChvPT09ITA/ZnQoW2NdLHRJLHIpOm89PT1udWxsP2M6YysiW10iLFEoTikpfSksITF9cmV0dXJuIEdBKEUpPyEwOih0LmFwcGVuZChmdCh1LGMsciksUShFKSksITEpfWxldCBpPVtdLGY9T2JqZWN0LmFzc2lnbihfSSx7ZGVmYXVsdFZpc2l0b3I6Qixjb252ZXJ0VmFsdWU6USxpc1Zpc2l0YWJsZTpHQX0pO2Z1bmN0aW9uIHMoRSxjKXtpZighQy5pc1VuZGVmaW5lZChFKSl7aWYoaS5pbmRleE9mKEUpIT09LTEpdGhyb3cgRXJyb3IoIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBpbiAiK2Muam9pbigiLiIpKTtpLnB1c2goRSksQy5mb3JFYWNoKEUsZnVuY3Rpb24oeSxSKXsoIShDLmlzVW5kZWZpbmVkKHkpfHx5PT09bnVsbCkmJmcuY2FsbCh0LHksQy5pc1N0cmluZyhSKT9SLnRyaW0oKTpSLGMsZikpPT09ITAmJnMoeSxjP2MuY29uY2F0KFIpOltSXSl9KSxpLnBvcCgpfX1pZighQy5pc09iamVjdChBKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJkYXRhIG11c3QgYmUgYW4gb2JqZWN0Iik7cmV0dXJuIHMoQSksdH12YXIgSj12STtmdW5jdGlvbiBEdChBKXtsZXQgdD17IiEiOiIlMjUyMSIsIlwnIjoiJTI1MjciLCIoIjoiJTI1MjgiLCIpIjoiJTI1MjkiLCJ+IjoiJTI1N0UiLCIlMjUyMCI6IisiLCIlMjUwMCI6IlxcMCJ9O3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoQSkucmVwbGFjZSgvWyFcJygpfl18JTI1MjB8JTI1MDAvZyxmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0pfWZ1bmN0aW9uIHV0KEEsdCl7dGhpcy5fcGFpcnM9W10sQSYmSihBLHRoaXMsdCl9dmFyIGh0PXV0LnByb3RvdHlwZTtodC5hcHBlbmQ9ZnVuY3Rpb24odCxJKXt0aGlzLl9wYWlycy5wdXNoKFt0LEldKX07aHQudG9TdHJpbmc9ZnVuY3Rpb24odCl7bGV0IEk9dD9mdW5jdGlvbihlKXtyZXR1cm4gdC5jYWxsKHRoaXMsZSxEdCl9OkR0O3JldHVybiB0aGlzLl9wYWlycy5tYXAoZnVuY3Rpb24oZyl7cmV0dXJuIEkoZ1swXSkrIj0iK0koZ1sxXSl9LCIiKS5qb2luKCImIil9O3ZhciBFQT11dDtmdW5jdGlvbiAkSShBKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEEpLnJlcGxhY2UoLyUyNTNBL2dpLCI6IikucmVwbGFjZSgvJTI1MjQvZywiJCIpLnJlcGxhY2UoLyUyNTJDL2dpLCIsIikucmVwbGFjZSgvJTI1MjAvZywiKyIpLnJlcGxhY2UoLyUyNTVCL2dpLCJbIikucmVwbGFjZSgvJTI1NUQvZ2ksIl0iKX1mdW5jdGlvbiBYKEEsdCxJKXtpZighdClyZXR1cm4gQTtsZXQgZT1JJiZJLmVuY29kZXx8JEksZz1JJiZJLnNlcmlhbGl6ZSxyO2lmKGc/cj1nKHQsSSk6cj1DLmlzVVJMU2VhcmNoUGFyYW1zKHQpP3QudG9TdHJpbmcoKTpuZXcgRUEodCxJKS50b1N0cmluZyhlKSxyKXtsZXQgbz1BLmluZGV4T2YoIiUyMyIpO28hPT0tMSYmKEE9QS5zbGljZSgwLG8pKSxBKz0oQS5pbmRleE9mKCI/Iik9PT0tMT8iPyI6IiYiKStyfXJldHVybiBBfXZhciBrQT1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuaGFuZGxlcnM9W119dXNlKHQsSSxlKXtyZXR1cm4gdGhpcy5oYW5kbGVycy5wdXNoKHtmdWxmaWxsZWQ6dCxyZWplY3RlZDpJLHN5bmNocm9ub3VzOmU/ZS5zeW5jaHJvbm91czohMSxydW5XaGVuOmU/ZS5ydW5XaGVuOm51bGx9KSx0aGlzLmhhbmRsZXJzLmxlbmd0aC0xfWVqZWN0KHQpe3RoaXMuaGFuZGxlcnNbdF0mJih0aGlzLmhhbmRsZXJzW3RdPW51bGwpfWNsZWFyKCl7dGhpcy5oYW5kbGVycyYmKHRoaXMuaGFuZGxlcnM9W10pfWZvckVhY2godCl7Qy5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsZnVuY3Rpb24oZSl7ZSE9PW51bGwmJnQoZSl9KX19LExBPWtBO3ZhciBhQT17c2lsZW50SlNPTlBhcnNpbmc6ITAsZm9yY2VkSlNPTlBhcnNpbmc6ITAsY2xhcmlmeVRpbWVvdXRFcnJvcjohMX07dmFyIGR0PXR5cGVvZiBVUkxTZWFyY2hQYXJhbXM8InUiP1VSTFNlYXJjaFBhcmFtczpFQTt2YXIgeXQ9dHlwZW9mIEZvcm1EYXRhPCJ1Ij9Gb3JtRGF0YTpudWxsO3ZhciB3dD10eXBlb2YgQmxvYjwidSI/QmxvYjpudWxsO3ZhciBtdD17aXNCcm93c2VyOiEwLGNsYXNzZXM6e1VSTFNlYXJjaFBhcmFtczpkdCxGb3JtRGF0YTp5dCxCbG9iOnd0fSxwcm90b2NvbHM6WyJodHRwIiwiaHR0cHMiLCJmaWxlIiwiYmxvYiIsInVybCIsImRhdGEiXX07dmFyIEpBPXt9O2VJKEpBLHtoYXNCcm93c2VyRW52OigpPT5wdCxoYXNTdGFuZGFyZEJyb3dzZXJFbnY6KCk9PkFlLGhhc1N0YW5kYXJkQnJvd3NlcldlYldvcmtlckVudjooKT0+dGV9KTt2YXIgcHQ9dHlwZW9mIHdpbmRvdzwidSImJnR5cGVvZiBkb2N1bWVudDwidSIsQWU9KEE9PnB0JiZbIlJlYWN0TmF0aXZlIiwiTmF0aXZlU2NyaXB0IiwiTlMiXS5pbmRleE9mKEEpPDApKHR5cGVvZiBuYXZpZ2F0b3I8InUiJiZuYXZpZ2F0b3IucHJvZHVjdCksdGU9dHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlPCJ1IiYmc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlJiZ0eXBlb2Ygc2VsZi5pbXBvcnRTY3JpcHRzPT0iZnVuY3Rpb24iO3ZhciB3PXsuLi5KQSwuLi5tdH07ZnVuY3Rpb24gSEEoQSx0KXtyZXR1cm4gSihBLG5ldyB3LmNsYXNzZXMuVVJMU2VhcmNoUGFyYW1zLE9iamVjdC5hc3NpZ24oe3Zpc2l0b3I6ZnVuY3Rpb24oSSxlLGcscil7cmV0dXJuIHcuaXNOb2RlJiZDLmlzQnVmZmVyKEkpPyh0aGlzLmFwcGVuZChlLEkudG9TdHJpbmcoImJhc2U2NCIpKSwhMSk6ci5kZWZhdWx0VmlzaXRvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSx0KSl9ZnVuY3Rpb24gSWUoQSl7cmV0dXJuIEMubWF0Y2hBbGwoL1xcdyt8XFxbKFxcdyopXS9nLEEpLm1hcCh0PT50WzBdPT09IltdIj8iIjp0WzFdfHx0WzBdKX1mdW5jdGlvbiBlZShBKXtsZXQgdD17fSxJPU9iamVjdC5rZXlzKEEpLGUsZz1JLmxlbmd0aCxyO2ZvcihlPTA7ZTxnO2UrKylyPUlbZV0sdFtyXT1BW3JdO3JldHVybiB0fWZ1bmN0aW9uIGdlKEEpe2Z1bmN0aW9uIHQoSSxlLGcscil7bGV0IG89SVtyKytdO2lmKG89PT0iX19wcm90b19fIilyZXR1cm4hMDtsZXQgbj1OdW1iZXIuaXNGaW5pdGUoK28pLGE9cj49SS5sZW5ndGg7cmV0dXJuIG89IW8mJkMuaXNBcnJheShnKT9nLmxlbmd0aDpvLGE/KEMuaGFzT3duUHJvcChnLG8pP2dbb109W2dbb10sZV06Z1tvXT1lLCFuKTooKCFnW29dfHwhQy5pc09iamVjdChnW29dKSkmJihnW29dPVtdKSx0KEksZSxnW29dLHIpJiZDLmlzQXJyYXkoZ1tvXSkmJihnW29dPWVlKGdbb10pKSwhbil9aWYoQy5pc0Zvcm1EYXRhKEEpJiZDLmlzRnVuY3Rpb24oQS5lbnRyaWVzKSl7bGV0IEk9e307cmV0dXJuIEMuZm9yRWFjaEVudHJ5KEEsKGUsZyk9Pnt0KEllKGUpLGcsSSwwKX0pLEl9cmV0dXJuIG51bGx9dmFyIGNBPWdlO2Z1bmN0aW9uIHJlKEEsdCxJKXtpZihDLmlzU3RyaW5nKEEpKXRyeXtyZXR1cm4odHx8SlNPTi5wYXJzZSkoQSksQy50cmltKEEpfWNhdGNoKGUpe2lmKGUubmFtZSE9PSJTeW50YXhFcnJvciIpdGhyb3cgZX1yZXR1cm4oSXx8SlNPTi5zdHJpbmdpZnkpKEEpfXZhciBZQT17dHJhbnNpdGlvbmFsOmFBLGFkYXB0ZXI6WyJ4aHIiLCJodHRwIl0sdHJhbnNmb3JtUmVxdWVzdDpbZnVuY3Rpb24odCxJKXtsZXQgZT1JLmdldENvbnRlbnRUeXBlKCl8fCIiLGc9ZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qc29uIik+LTEscj1DLmlzT2JqZWN0KHQpO2lmKHImJkMuaXNIVE1MRm9ybSh0KSYmKHQ9bmV3IEZvcm1EYXRhKHQpKSxDLmlzRm9ybURhdGEodCkpcmV0dXJuIGc/SlNPTi5zdHJpbmdpZnkoY0EodCkpOnQ7aWYoQy5pc0FycmF5QnVmZmVyKHQpfHxDLmlzQnVmZmVyKHQpfHxDLmlzU3RyZWFtKHQpfHxDLmlzRmlsZSh0KXx8Qy5pc0Jsb2IodCkpcmV0dXJuIHQ7aWYoQy5pc0FycmF5QnVmZmVyVmlldyh0KSlyZXR1cm4gdC5idWZmZXI7aWYoQy5pc1VSTFNlYXJjaFBhcmFtcyh0KSlyZXR1cm4gSS5zZXRDb250ZW50VHlwZSgiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgiLCExKSx0LnRvU3RyaW5nKCk7bGV0IG47aWYocil7aWYoZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKT4tMSlyZXR1cm4gSEEodCx0aGlzLmZvcm1TZXJpYWxpemVyKS50b1N0cmluZygpO2lmKChuPUMuaXNGaWxlTGlzdCh0KSl8fGUuaW5kZXhPZigibXVsdGlwYXJ0L2Zvcm0tZGF0YSIpPi0xKXtsZXQgYT10aGlzLmVudiYmdGhpcy5lbnYuRm9ybURhdGE7cmV0dXJuIEoobj97ImZpbGVzW10iOnR9OnQsYSYmbmV3IGEsdGhpcy5mb3JtU2VyaWFsaXplcil9fXJldHVybiByfHxnPyhJLnNldENvbnRlbnRUeXBlKCJhcHBsaWNhdGlvbi9qc29uIiwhMSkscmUodCkpOnR9XSx0cmFuc2Zvcm1SZXNwb25zZTpbZnVuY3Rpb24odCl7bGV0IEk9dGhpcy50cmFuc2l0aW9uYWx8fFlBLnRyYW5zaXRpb25hbCxlPUkmJkkuZm9yY2VkSlNPTlBhcnNpbmcsZz10aGlzLnJlc3BvbnNlVHlwZT09PSJqc29uIjtpZih0JiZDLmlzU3RyaW5nKHQpJiYoZSYmIXRoaXMucmVzcG9uc2VUeXBlfHxnKSl7bGV0IG89IShJJiZJLnNpbGVudEpTT05QYXJzaW5nKSYmZzt0cnl7cmV0dXJuIEpTT04ucGFyc2UodCl9Y2F0Y2gobil7aWYobyl0aHJvdyBuLm5hbWU9PT0iU3ludGF4RXJyb3IiP2wuZnJvbShuLGwuRVJSX0JBRF9SRVNQT05TRSx0aGlzLG51bGwsdGhpcy5yZXNwb25zZSk6bn19cmV0dXJuIHR9XSx0aW1lb3V0OjAseHNyZkNvb2tpZU5hbWU6IlhTUkYtVE9LRU4iLHhzcmZIZWFkZXJOYW1lOiJYLVhTUkYtVE9LRU4iLG1heENvbnRlbnRMZW5ndGg6LTEsbWF4Qm9keUxlbmd0aDotMSxlbnY6e0Zvcm1EYXRhOncuY2xhc3Nlcy5Gb3JtRGF0YSxCbG9iOncuY2xhc3Nlcy5CbG9ifSx2YWxpZGF0ZVN0YXR1czpmdW5jdGlvbih0KXtyZXR1cm4gdD49MjAwJiZ0PDMwMH0saGVhZGVyczp7Y29tbW9uOntBY2NlcHQ6ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKiIsIkNvbnRlbnQtVHlwZSI6dm9pZCAwfX19O0MuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiLCJwb3N0IiwicHV0IiwicGF0Y2giXSxBPT57WUEuaGVhZGVyc1tBXT17fX0pO3ZhciBUPVlBO3ZhciBvZT1DLnRvT2JqZWN0U2V0KFsiYWdlIiwiYXV0aG9yaXphdGlvbiIsImNvbnRlbnQtbGVuZ3RoIiwiY29udGVudC10eXBlIiwiZXRhZyIsImV4cGlyZXMiLCJmcm9tIiwiaG9zdCIsImlmLW1vZGlmaWVkLXNpbmNlIiwiaWYtdW5tb2RpZmllZC1zaW5jZSIsImxhc3QtbW9kaWZpZWQiLCJsb2NhdGlvbiIsIm1heC1mb3J3YXJkcyIsInByb3h5LWF1dGhvcml6YXRpb24iLCJyZWZlcmVyIiwicmV0cnktYWZ0ZXIiLCJ1c2VyLWFnZW50Il0pLFN0PUE9PntsZXQgdD17fSxJLGUsZztyZXR1cm4gQSYmQS5zcGxpdChgJTBBYCkuZm9yRWFjaChmdW5jdGlvbihvKXtnPW8uaW5kZXhPZigiOiIpLEk9by5zdWJzdHJpbmcoMCxnKS50cmltKCkudG9Mb3dlckNhc2UoKSxlPW8uc3Vic3RyaW5nKGcrMSkudHJpbSgpLCEoIUl8fHRbSV0mJm9lW0ldKSYmKEk9PT0ic2V0LWNvb2tpZSI/dFtJXT90W0ldLnB1c2goZSk6dFtJXT1bZV06dFtJXT10W0ldP3RbSV0rIiwgIitlOmUpfSksdH07dmFyIEZ0PVN5bWJvbCgiaW50ZXJuYWxzIik7ZnVuY3Rpb24geihBKXtyZXR1cm4gQSYmU3RyaW5nKEEpLnRyaW0oKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIGZBKEEpe3JldHVybiBBPT09ITF8fEE9PW51bGw/QTpDLmlzQXJyYXkoQSk/QS5tYXAoZkEpOlN0cmluZyhBKX1mdW5jdGlvbiBpZShBKXtsZXQgdD1PYmplY3QuY3JlYXRlKG51bGwpLEk9LyhbXlxccyw7PV0rKVxccyooPzo9XFxzKihbXiw7XSspKT8vZyxlO2Zvcig7ZT1JLmV4ZWMoQSk7KXRbZVsxXV09ZVsyXTtyZXR1cm4gdH12YXIgQ2U9QT0+L15bLV9hLXpBLVowLTleYHx+LCElMjMkJSZcJyorLl0rJC8udGVzdChBLnRyaW0oKSk7ZnVuY3Rpb24gYkEoQSx0LEksZSxnKXtpZihDLmlzRnVuY3Rpb24oZSkpcmV0dXJuIGUuY2FsbCh0aGlzLHQsSSk7aWYoZyYmKHQ9SSksISFDLmlzU3RyaW5nKHQpKXtpZihDLmlzU3RyaW5nKGUpKXJldHVybiB0LmluZGV4T2YoZSkhPT0tMTtpZihDLmlzUmVnRXhwKGUpKXJldHVybiBlLnRlc3QodCl9fWZ1bmN0aW9uIEJlKEEpe3JldHVybiBBLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoLyhbYS16XFxkXSkoXFx3KikvZywodCxJLGUpPT5JLnRvVXBwZXJDYXNlKCkrZSl9ZnVuY3Rpb24gbmUoQSx0KXtsZXQgST1DLnRvQ2FtZWxDYXNlKCIgIit0KTtbImdldCIsInNldCIsImhhcyJdLmZvckVhY2goZT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eShBLGUrSSx7dmFsdWU6ZnVuY3Rpb24oZyxyLG8pe3JldHVybiB0aGlzW2VdLmNhbGwodGhpcyx0LGcscixvKX0sY29uZmlndXJhYmxlOiEwfSl9KX12YXIgUD1jbGFzc3tjb25zdHJ1Y3Rvcih0KXt0JiZ0aGlzLnNldCh0KX1zZXQodCxJLGUpe2xldCBnPXRoaXM7ZnVuY3Rpb24gcihuLGEsUSl7bGV0IEI9eihhKTtpZighQil0aHJvdyBuZXcgRXJyb3IoImhlYWRlciBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nIik7bGV0IGk9Qy5maW5kS2V5KGcsQik7KCFpfHxnW2ldPT09dm9pZCAwfHxRPT09ITB8fFE9PT12b2lkIDAmJmdbaV0hPT0hMSkmJihnW2l8fGFdPWZBKG4pKX1sZXQgbz0obixhKT0+Qy5mb3JFYWNoKG4sKFEsQik9PnIoUSxCLGEpKTtyZXR1cm4gQy5pc1BsYWluT2JqZWN0KHQpfHx0IGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9vKHQsSSk6Qy5pc1N0cmluZyh0KSYmKHQ9dC50cmltKCkpJiYhQ2UodCk/byhTdCh0KSxJKTp0IT1udWxsJiZyKEksdCxlKSx0aGlzfWdldCh0LEkpe2lmKHQ9eih0KSx0KXtsZXQgZT1DLmZpbmRLZXkodGhpcyx0KTtpZihlKXtsZXQgZz10aGlzW2VdO2lmKCFJKXJldHVybiBnO2lmKEk9PT0hMClyZXR1cm4gaWUoZyk7aWYoQy5pc0Z1bmN0aW9uKEkpKXJldHVybiBJLmNhbGwodGhpcyxnLGUpO2lmKEMuaXNSZWdFeHAoSSkpcmV0dXJuIEkuZXhlYyhnKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJwYXJzZXIgbXVzdCBiZSBib29sZWFufHJlZ2V4cHxmdW5jdGlvbiIpfX19aGFzKHQsSSl7aWYodD16KHQpLHQpe2xldCBlPUMuZmluZEtleSh0aGlzLHQpO3JldHVybiEhKGUmJnRoaXNbZV0hPT12b2lkIDAmJighSXx8YkEodGhpcyx0aGlzW2VdLGUsSSkpKX1yZXR1cm4hMX1kZWxldGUodCxJKXtsZXQgZT10aGlzLGc9ITE7ZnVuY3Rpb24gcihvKXtpZihvPXoobyksbyl7bGV0IG49Qy5maW5kS2V5KGUsbyk7biYmKCFJfHxiQShlLGVbbl0sbixJKSkmJihkZWxldGUgZVtuXSxnPSEwKX19cmV0dXJuIEMuaXNBcnJheSh0KT90LmZvckVhY2gocik6cih0KSxnfWNsZWFyKHQpe2xldCBJPU9iamVjdC5rZXlzKHRoaXMpLGU9SS5sZW5ndGgsZz0hMTtmb3IoO2UtLTspe2xldCByPUlbZV07KCF0fHxiQSh0aGlzLHRoaXNbcl0scix0LCEwKSkmJihkZWxldGUgdGhpc1tyXSxnPSEwKX1yZXR1cm4gZ31ub3JtYWxpemUodCl7bGV0IEk9dGhpcyxlPXt9O3JldHVybiBDLmZvckVhY2godGhpcywoZyxyKT0+e2xldCBvPUMuZmluZEtleShlLHIpO2lmKG8pe0lbb109ZkEoZyksZGVsZXRlIElbcl07cmV0dXJufWxldCBuPXQ/QmUocik6U3RyaW5nKHIpLnRyaW0oKTtuIT09ciYmZGVsZXRlIElbcl0sSVtuXT1mQShnKSxlW25dPSEwfSksdGhpc31jb25jYXQoLi4udCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IuY29uY2F0KHRoaXMsLi4udCl9dG9KU09OKHQpe2xldCBJPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIEMuZm9yRWFjaCh0aGlzLChlLGcpPT57ZSE9bnVsbCYmZSE9PSExJiYoSVtnXT10JiZDLmlzQXJyYXkoZSk/ZS5qb2luKCIsICIpOmUpfSksSX1bU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiBPYmplY3QuZW50cmllcyh0aGlzLnRvSlNPTigpKVtTeW1ib2wuaXRlcmF0b3JdKCl9dG9TdHJpbmcoKXtyZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy50b0pTT04oKSkubWFwKChbdCxJXSk9PnQrIjogIitJKS5qb2luKGAlMEFgKX1nZXRbU3ltYm9sLnRvU3RyaW5nVGFnXSgpe3JldHVybiJBeGlvc0hlYWRlcnMifXN0YXRpYyBmcm9tKHQpe3JldHVybiB0IGluc3RhbmNlb2YgdGhpcz90Om5ldyB0aGlzKHQpfXN0YXRpYyBjb25jYXQodCwuLi5JKXtsZXQgZT1uZXcgdGhpcyh0KTtyZXR1cm4gSS5mb3JFYWNoKGc9PmUuc2V0KGcpKSxlfXN0YXRpYyBhY2Nlc3Nvcih0KXtsZXQgZT0odGhpc1tGdF09dGhpc1tGdF09e2FjY2Vzc29yczp7fX0pLmFjY2Vzc29ycyxnPXRoaXMucHJvdG90eXBlO2Z1bmN0aW9uIHIobyl7bGV0IG49eihvKTtlW25dfHwobmUoZyxvKSxlW25dPSEwKX1yZXR1cm4gQy5pc0FycmF5KHQpP3QuZm9yRWFjaChyKTpyKHQpLHRoaXN9fTtQLmFjY2Vzc29yKFsiQ29udGVudC1UeXBlIiwiQ29udGVudC1MZW5ndGgiLCJBY2NlcHQiLCJBY2NlcHQtRW5jb2RpbmciLCJVc2VyLUFnZW50IiwiQXV0aG9yaXphdGlvbiJdKTtDLnJlZHVjZURlc2NyaXB0b3JzKFAucHJvdG90eXBlLCh7dmFsdWU6QX0sdCk9PntsZXQgST10WzBdLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKTtyZXR1cm57Z2V0OigpPT5BLHNldChlKXt0aGlzW0ldPWV9fX0pO0MuZnJlZXplTWV0aG9kcyhQKTt2YXIgbT1QO2Z1bmN0aW9uIF8oQSx0KXtsZXQgST10aGlzfHxULGU9dHx8SSxnPW0uZnJvbShlLmhlYWRlcnMpLHI9ZS5kYXRhO3JldHVybiBDLmZvckVhY2goQSxmdW5jdGlvbihuKXtyPW4uY2FsbChJLHIsZy5ub3JtYWxpemUoKSx0P3Quc3RhdHVzOnZvaWQgMCl9KSxnLm5vcm1hbGl6ZSgpLHJ9ZnVuY3Rpb24gdihBKXtyZXR1cm4hIShBJiZBLl9fQ0FOQ0VMX18pfWZ1bmN0aW9uIFJ0KEEsdCxJKXtsLmNhbGwodGhpcyxBPz8iY2FuY2VsZWQiLGwuRVJSX0NBTkNFTEVELHQsSSksdGhpcy5uYW1lPSJDYW5jZWxlZEVycm9yIn1DLmluaGVyaXRzKFJ0LGwse19fQ0FOQ0VMX186ITB9KTt2YXIgSD1SdDtmdW5jdGlvbiBNQShBLHQsSSl7bGV0IGU9SS5jb25maWcudmFsaWRhdGVTdGF0dXM7IUkuc3RhdHVzfHwhZXx8ZShJLnN0YXR1cyk/QShJKTp0KG5ldyBsKCJSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICIrSS5zdGF0dXMsW2wuRVJSX0JBRF9SRVFVRVNULGwuRVJSX0JBRF9SRVNQT05TRV1bTWF0aC5mbG9vcihJLnN0YXR1cy8xMDApLTRdLEkuY29uZmlnLEkucmVxdWVzdCxJKSl9dmFyIE50PXcuaGFzU3RhbmRhcmRCcm93c2VyRW52P3t3cml0ZShBLHQsSSxlLGcscil7bGV0IG89W0ErIj0iK2VuY29kZVVSSUNvbXBvbmVudCh0KV07Qy5pc051bWJlcihJKSYmby5wdXNoKCJleHBpcmVzPSIrbmV3IERhdGUoSSkudG9HTVRTdHJpbmcoKSksQy5pc1N0cmluZyhlKSYmby5wdXNoKCJwYXRoPSIrZSksQy5pc1N0cmluZyhnKSYmby5wdXNoKCJkb21haW49IitnKSxyPT09ITAmJm8ucHVzaCgic2VjdXJlIiksZG9jdW1lbnQuY29va2llPW8uam9pbigiOyAiKX0scmVhZChBKXtsZXQgdD1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58O1xcXFxzKikoIitBKyIpPShbXjtdKikiKSk7cmV0dXJuIHQ/ZGVjb2RlVVJJQ29tcG9uZW50KHRbM10pOm51bGx9LHJlbW92ZShBKXt0aGlzLndyaXRlKEEsIiIsRGF0ZS5ub3coKS04NjRlNSl9fTp7d3JpdGUoKXt9LHJlYWQoKXtyZXR1cm4gbnVsbH0scmVtb3ZlKCl7fX07ZnVuY3Rpb24gcUEoQSl7cmV0dXJuL14oW2Etel1bYS16XFxkK1xcLS5dKjopP1xcL1xcLy9pLnRlc3QoQSl9ZnVuY3Rpb24gS0EoQSx0KXtyZXR1cm4gdD9BLnJlcGxhY2UoL1xcLz9cXC8kLywiIikrIi8iK3QucmVwbGFjZSgvXlxcLysvLCIiKTpBfWZ1bmN0aW9uICQoQSx0KXtyZXR1cm4gQSYmIXFBKHQpP0tBKEEsdCk6dH12YXIgVXQ9dy5oYXNTdGFuZGFyZEJyb3dzZXJFbnY/ZnVuY3Rpb24oKXtsZXQgdD0vKG1zaWV8dHJpZGVudCkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLEk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpLGU7ZnVuY3Rpb24gZyhyKXtsZXQgbz1yO3JldHVybiB0JiYoSS5zZXRBdHRyaWJ1dGUoImhyZWYiLG8pLG89SS5ocmVmKSxJLnNldEF0dHJpYnV0ZSgiaHJlZiIsbykse2hyZWY6SS5ocmVmLHByb3RvY29sOkkucHJvdG9jb2w/SS5wcm90b2NvbC5yZXBsYWNlKC86JC8sIiIpOiIiLGhvc3Q6SS5ob3N0LHNlYXJjaDpJLnNlYXJjaD9JLnNlYXJjaC5yZXBsYWNlKC9eXFw/LywiIik6IiIsaGFzaDpJLmhhc2g/SS5oYXNoLnJlcGxhY2UoL14lMjMvLCIiKToiIixob3N0bmFtZTpJLmhvc3RuYW1lLHBvcnQ6SS5wb3J0LHBhdGhuYW1lOkkucGF0aG5hbWUuY2hhckF0KDApPT09Ii8iP0kucGF0aG5hbWU6Ii8iK0kucGF0aG5hbWV9fXJldHVybiBlPWcod2luZG93LmxvY2F0aW9uLmhyZWYpLGZ1bmN0aW9uKG8pe2xldCBuPUMuaXNTdHJpbmcobyk/ZyhvKTpvO3JldHVybiBuLnByb3RvY29sPT09ZS5wcm90b2NvbCYmbi5ob3N0PT09ZS5ob3N0fX0oKTpmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiEwfX0oKTtmdW5jdGlvbiBPQShBKXtsZXQgdD0vXihbLStcXHddezEsMjV9KSg6P1xcL1xcL3w6KS8uZXhlYyhBKTtyZXR1cm4gdCYmdFsxXXx8IiJ9ZnVuY3Rpb24gc2UoQSx0KXtBPUF8fDEwO2xldCBJPW5ldyBBcnJheShBKSxlPW5ldyBBcnJheShBKSxnPTAscj0wLG87cmV0dXJuIHQ9dCE9PXZvaWQgMD90OjFlMyxmdW5jdGlvbihhKXtsZXQgUT1EYXRlLm5vdygpLEI9ZVtyXTtvfHwobz1RKSxJW2ddPWEsZVtnXT1RO2xldCBpPXIsZj0wO2Zvcig7aSE9PWc7KWYrPUlbaSsrXSxpPWklQTtpZihnPShnKzEpJUEsZz09PXImJihyPShyKzEpJUEpLFEtbzx0KXJldHVybjtsZXQgcz1CJiZRLUI7cmV0dXJuIHM/TWF0aC5yb3VuZChmKjFlMy9zKTp2b2lkIDB9fXZhciBHdD1zZTtmdW5jdGlvbiBrdChBLHQpe2xldCBJPTAsZT1HdCg1MCwyNTApO3JldHVybiBnPT57bGV0IHI9Zy5sb2FkZWQsbz1nLmxlbmd0aENvbXB1dGFibGU/Zy50b3RhbDp2b2lkIDAsbj1yLUksYT1lKG4pLFE9cjw9bztJPXI7bGV0IEI9e2xvYWRlZDpyLHRvdGFsOm8scHJvZ3Jlc3M6bz9yL286dm9pZCAwLGJ5dGVzOm4scmF0ZTphfHx2b2lkIDAsZXN0aW1hdGVkOmEmJm8mJlE/KG8tcikvYTp2b2lkIDAsZXZlbnQ6Z307Qlt0PyJkb3dubG9hZCI6InVwbG9hZCJdPSEwLEEoQil9fXZhciBRZT10eXBlb2YgWE1MSHR0cFJlcXVlc3Q8InUiLEx0PVFlJiZmdW5jdGlvbihBKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oSSxlKXtsZXQgZz1BLmRhdGEscj1tLmZyb20oQS5oZWFkZXJzKS5ub3JtYWxpemUoKSx7cmVzcG9uc2VUeXBlOm8sd2l0aFhTUkZUb2tlbjpufT1BLGE7ZnVuY3Rpb24gUSgpe0EuY2FuY2VsVG9rZW4mJkEuY2FuY2VsVG9rZW4udW5zdWJzY3JpYmUoYSksQS5zaWduYWwmJkEuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IixhKX1sZXQgQjtpZihDLmlzRm9ybURhdGEoZykpe2lmKHcuaGFzU3RhbmRhcmRCcm93c2VyRW52fHx3Lmhhc1N0YW5kYXJkQnJvd3NlcldlYldvcmtlckVudilyLnNldENvbnRlbnRUeXBlKCExKTtlbHNlIGlmKChCPXIuZ2V0Q29udGVudFR5cGUoKSkhPT0hMSl7bGV0W2MsLi4udV09Qj9CLnNwbGl0KCI7IikubWFwKHk9PnkudHJpbSgpKS5maWx0ZXIoQm9vbGVhbik6W107ci5zZXRDb250ZW50VHlwZShbY3x8Im11bHRpcGFydC9mb3JtLWRhdGEiLC4uLnVdLmpvaW4oIjsgIikpfX1sZXQgaT1uZXcgWE1MSHR0cFJlcXVlc3Q7aWYoQS5hdXRoKXtsZXQgYz1BLmF1dGgudXNlcm5hbWV8fCIiLHU9QS5hdXRoLnBhc3N3b3JkP3VuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChBLmF1dGgucGFzc3dvcmQpKToiIjtyLnNldCgiQXV0aG9yaXphdGlvbiIsIkJhc2ljICIrYnRvYShjKyI6Iit1KSl9bGV0IGY9JChBLmJhc2VVUkwsQS51cmwpO2kub3BlbihBLm1ldGhvZC50b1VwcGVyQ2FzZSgpLFgoZixBLnBhcmFtcyxBLnBhcmFtc1NlcmlhbGl6ZXIpLCEwKSxpLnRpbWVvdXQ9QS50aW1lb3V0O2Z1bmN0aW9uIHMoKXtpZighaSlyZXR1cm47bGV0IGM9bS5mcm9tKCJnZXRBbGxSZXNwb25zZUhlYWRlcnMiaW4gaSYmaS5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkseT17ZGF0YTohb3x8bz09PSJ0ZXh0Inx8bz09PSJqc29uIj9pLnJlc3BvbnNlVGV4dDppLnJlc3BvbnNlLHN0YXR1czppLnN0YXR1cyxzdGF0dXNUZXh0Omkuc3RhdHVzVGV4dCxoZWFkZXJzOmMsY29uZmlnOkEscmVxdWVzdDppfTtNQShmdW5jdGlvbihOKXtJKE4pLFEoKX0sZnVuY3Rpb24oTil7ZShOKSxRKCl9LHkpLGk9bnVsbH1pZigib25sb2FkZW5kImluIGk/aS5vbmxvYWRlbmQ9czppLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFpfHxpLnJlYWR5U3RhdGUhPT00fHxpLnN0YXR1cz09PTAmJiEoaS5yZXNwb25zZVVSTCYmaS5yZXNwb25zZVVSTC5pbmRleE9mKCJmaWxlOiIpPT09MCl8fHNldFRpbWVvdXQocyl9LGkub25hYm9ydD1mdW5jdGlvbigpe2kmJihlKG5ldyBsKCJSZXF1ZXN0IGFib3J0ZWQiLGwuRUNPTk5BQk9SVEVELEEsaSkpLGk9bnVsbCl9LGkub25lcnJvcj1mdW5jdGlvbigpe2UobmV3IGwoIk5ldHdvcmsgRXJyb3IiLGwuRVJSX05FVFdPUkssQSxpKSksaT1udWxsfSxpLm9udGltZW91dD1mdW5jdGlvbigpe2xldCB1PUEudGltZW91dD8idGltZW91dCBvZiAiK0EudGltZW91dCsibXMgZXhjZWVkZWQiOiJ0aW1lb3V0IGV4Y2VlZGVkIix5PUEudHJhbnNpdGlvbmFsfHxhQTtBLnRpbWVvdXRFcnJvck1lc3NhZ2UmJih1PUEudGltZW91dEVycm9yTWVzc2FnZSksZShuZXcgbCh1LHkuY2xhcmlmeVRpbWVvdXRFcnJvcj9sLkVUSU1FRE9VVDpsLkVDT05OQUJPUlRFRCxBLGkpKSxpPW51bGx9LHcuaGFzU3RhbmRhcmRCcm93c2VyRW52JiYobiYmQy5pc0Z1bmN0aW9uKG4pJiYobj1uKEEpKSxufHxuIT09ITEmJlV0KGYpKSl7bGV0IGM9QS54c3JmSGVhZGVyTmFtZSYmQS54c3JmQ29va2llTmFtZSYmTnQucmVhZChBLnhzcmZDb29raWVOYW1lKTtjJiZyLnNldChBLnhzcmZIZWFkZXJOYW1lLGMpfWc9PT12b2lkIDAmJnIuc2V0Q29udGVudFR5cGUobnVsbCksInNldFJlcXVlc3RIZWFkZXIiaW4gaSYmQy5mb3JFYWNoKHIudG9KU09OKCksZnVuY3Rpb24odSx5KXtpLnNldFJlcXVlc3RIZWFkZXIoeSx1KX0pLEMuaXNVbmRlZmluZWQoQS53aXRoQ3JlZGVudGlhbHMpfHwoaS53aXRoQ3JlZGVudGlhbHM9ISFBLndpdGhDcmVkZW50aWFscyksbyYmbyE9PSJqc29uIiYmKGkucmVzcG9uc2VUeXBlPUEucmVzcG9uc2VUeXBlKSx0eXBlb2YgQS5vbkRvd25sb2FkUHJvZ3Jlc3M9PSJmdW5jdGlvbiImJmkuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGt0KEEub25Eb3dubG9hZFByb2dyZXNzLCEwKSksdHlwZW9mIEEub25VcGxvYWRQcm9ncmVzcz09ImZ1bmN0aW9uIiYmaS51cGxvYWQmJmkudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixrdChBLm9uVXBsb2FkUHJvZ3Jlc3MpKSwoQS5jYW5jZWxUb2tlbnx8QS5zaWduYWwpJiYoYT1jPT57aSYmKGUoIWN8fGMudHlwZT9uZXcgSChudWxsLEEsaSk6YyksaS5hYm9ydCgpLGk9bnVsbCl9LEEuY2FuY2VsVG9rZW4mJkEuY2FuY2VsVG9rZW4uc3Vic2NyaWJlKGEpLEEuc2lnbmFsJiYoQS5zaWduYWwuYWJvcnRlZD9hKCk6QS5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLGEpKSk7bGV0IEU9T0EoZik7aWYoRSYmdy5wcm90b2NvbHMuaW5kZXhPZihFKT09PS0xKXtlKG5ldyBsKCJVbnN1cHBvcnRlZCBwcm90b2NvbCAiK0UrIjoiLGwuRVJSX0JBRF9SRVFVRVNULEEpKTtyZXR1cm59aS5zZW5kKGd8fG51bGwpfSl9O3ZhciBUQT17aHR0cDpRQSx4aHI6THR9O0MuZm9yRWFjaChUQSwoQSx0KT0+e2lmKEEpe3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkoQSwibmFtZSIse3ZhbHVlOnR9KX1jYXRjaHt9T2JqZWN0LmRlZmluZVByb3BlcnR5KEEsImFkYXB0ZXJOYW1lIix7dmFsdWU6dH0pfX0pO3ZhciBKdD1BPT5gLSAke0F9YCxFZT1BPT5DLmlzRnVuY3Rpb24oQSl8fEE9PT1udWxsfHxBPT09ITEsbEE9e2dldEFkYXB0ZXI6QT0+e0E9Qy5pc0FycmF5KEEpP0E6W0FdO2xldHtsZW5ndGg6dH09QSxJLGUsZz17fTtmb3IobGV0IHI9MDtyPHQ7cisrKXtJPUFbcl07bGV0IG87aWYoZT1JLCFFZShJKSYmKGU9VEFbKG89U3RyaW5nKEkpKS50b0xvd2VyQ2FzZSgpXSxlPT09dm9pZCAwKSl0aHJvdyBuZXcgbChgVW5rbm93biBhZGFwdGVyIFwnJHtvfVwnYCk7aWYoZSlicmVhaztnW298fCIlMjMiK3JdPWV9aWYoIWUpe2xldCByPU9iamVjdC5lbnRyaWVzKGcpLm1hcCgoW24sYV0pPT5gYWRhcHRlciAke259IGArKGE9PT0hMT8iaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgZW52aXJvbm1lbnQiOiJpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBidWlsZCIpKSxvPXQ/ci5sZW5ndGg+MT9gc2luY2UgOiUwQWArci5tYXAoSnQpLmpvaW4oYCUwQWApOiIgIitKdChyWzBdKToiYXMgbm8gYWRhcHRlciBzcGVjaWZpZWQiO3Rocm93IG5ldyBsKCJUaGVyZSBpcyBubyBzdWl0YWJsZSBhZGFwdGVyIHRvIGRpc3BhdGNoIHRoZSByZXF1ZXN0ICIrbywiRVJSX05PVF9TVVBQT1JUIil9cmV0dXJuIGV9LGFkYXB0ZXJzOlRBfTtmdW5jdGlvbiBQQShBKXtpZihBLmNhbmNlbFRva2VuJiZBLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKSxBLnNpZ25hbCYmQS5zaWduYWwuYWJvcnRlZCl0aHJvdyBuZXcgSChudWxsLEEpfWZ1bmN0aW9uIERBKEEpe3JldHVybiBQQShBKSxBLmhlYWRlcnM9bS5mcm9tKEEuaGVhZGVycyksQS5kYXRhPV8uY2FsbChBLEEudHJhbnNmb3JtUmVxdWVzdCksWyJwb3N0IiwicHV0IiwicGF0Y2giXS5pbmRleE9mKEEubWV0aG9kKSE9PS0xJiZBLmhlYWRlcnMuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsITEpLGxBLmdldEFkYXB0ZXIoQS5hZGFwdGVyfHxULmFkYXB0ZXIpKEEpLnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuIFBBKEEpLGUuZGF0YT1fLmNhbGwoQSxBLnRyYW5zZm9ybVJlc3BvbnNlLGUpLGUuaGVhZGVycz1tLmZyb20oZS5oZWFkZXJzKSxlfSxmdW5jdGlvbihlKXtyZXR1cm4gdihlKXx8KFBBKEEpLGUmJmUucmVzcG9uc2UmJihlLnJlc3BvbnNlLmRhdGE9Xy5jYWxsKEEsQS50cmFuc2Zvcm1SZXNwb25zZSxlLnJlc3BvbnNlKSxlLnJlc3BvbnNlLmhlYWRlcnM9bS5mcm9tKGUucmVzcG9uc2UuaGVhZGVycykpKSxQcm9taXNlLnJlamVjdChlKX0pfXZhciBIdD1BPT5BIGluc3RhbmNlb2YgbT97Li4uQX06QTtmdW5jdGlvbiBrKEEsdCl7dD10fHx7fTtsZXQgST17fTtmdW5jdGlvbiBlKFEsQixpKXtyZXR1cm4gQy5pc1BsYWluT2JqZWN0KFEpJiZDLmlzUGxhaW5PYmplY3QoQik/Qy5tZXJnZS5jYWxsKHtjYXNlbGVzczppfSxRLEIpOkMuaXNQbGFpbk9iamVjdChCKT9DLm1lcmdlKHt9LEIpOkMuaXNBcnJheShCKT9CLnNsaWNlKCk6Qn1mdW5jdGlvbiBnKFEsQixpKXtpZihDLmlzVW5kZWZpbmVkKEIpKXtpZighQy5pc1VuZGVmaW5lZChRKSlyZXR1cm4gZSh2b2lkIDAsUSxpKX1lbHNlIHJldHVybiBlKFEsQixpKX1mdW5jdGlvbiByKFEsQil7aWYoIUMuaXNVbmRlZmluZWQoQikpcmV0dXJuIGUodm9pZCAwLEIpfWZ1bmN0aW9uIG8oUSxCKXtpZihDLmlzVW5kZWZpbmVkKEIpKXtpZighQy5pc1VuZGVmaW5lZChRKSlyZXR1cm4gZSh2b2lkIDAsUSl9ZWxzZSByZXR1cm4gZSh2b2lkIDAsQil9ZnVuY3Rpb24gbihRLEIsaSl7aWYoaSBpbiB0KXJldHVybiBlKFEsQik7aWYoaSBpbiBBKXJldHVybiBlKHZvaWQgMCxRKX1sZXQgYT17dXJsOnIsbWV0aG9kOnIsZGF0YTpyLGJhc2VVUkw6byx0cmFuc2Zvcm1SZXF1ZXN0Om8sdHJhbnNmb3JtUmVzcG9uc2U6byxwYXJhbXNTZXJpYWxpemVyOm8sdGltZW91dDpvLHRpbWVvdXRNZXNzYWdlOm8sd2l0aENyZWRlbnRpYWxzOm8sd2l0aFhTUkZUb2tlbjpvLGFkYXB0ZXI6byxyZXNwb25zZVR5cGU6byx4c3JmQ29va2llTmFtZTpvLHhzcmZIZWFkZXJOYW1lOm8sb25VcGxvYWRQcm9ncmVzczpvLG9uRG93bmxvYWRQcm9ncmVzczpvLGRlY29tcHJlc3M6byxtYXhDb250ZW50TGVuZ3RoOm8sbWF4Qm9keUxlbmd0aDpvLGJlZm9yZVJlZGlyZWN0Om8sdHJhbnNwb3J0Om8saHR0cEFnZW50Om8saHR0cHNBZ2VudDpvLGNhbmNlbFRva2VuOm8sc29ja2V0UGF0aDpvLHJlc3BvbnNlRW5jb2Rpbmc6byx2YWxpZGF0ZVN0YXR1czpuLGhlYWRlcnM6KFEsQik9PmcoSHQoUSksSHQoQiksITApfTtyZXR1cm4gQy5mb3JFYWNoKE9iamVjdC5rZXlzKE9iamVjdC5hc3NpZ24oe30sQSx0KSksZnVuY3Rpb24oQil7bGV0IGk9YVtCXXx8ZyxmPWkoQVtCXSx0W0JdLEIpO0MuaXNVbmRlZmluZWQoZikmJmkhPT1ufHwoSVtCXT1mKX0pLEl9dmFyIHVBPSIxLjYuOCI7dmFyIHhBPXt9O1sib2JqZWN0IiwiYm9vbGVhbiIsIm51bWJlciIsImZ1bmN0aW9uIiwic3RyaW5nIiwic3ltYm9sIl0uZm9yRWFjaCgoQSx0KT0+e3hBW0FdPWZ1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZT09PUF8fCJhIisodDwxPyJuICI6IiAiKStBfX0pO3ZhciBZdD17fTt4QS50cmFuc2l0aW9uYWw9ZnVuY3Rpb24odCxJLGUpe2Z1bmN0aW9uIGcocixvKXtyZXR1cm4iW0F4aW9zIHYiK3VBKyJdIFRyYW5zaXRpb25hbCBvcHRpb24gXCciK3IrIlwnIitvKyhlPyIuICIrZToiIil9cmV0dXJuKHIsbyxuKT0+e2lmKHQ9PT0hMSl0aHJvdyBuZXcgbChnKG8sIiBoYXMgYmVlbiByZW1vdmVkIisoST8iIGluICIrSToiIikpLGwuRVJSX0RFUFJFQ0FURUQpO3JldHVybiBJJiYhWXRbb10mJihZdFtvXT0hMCxjb25zb2xlLndhcm4oZyhvLCIgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSB2IitJKyIgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmVhciBmdXR1cmUiKSkpLHQ/dChyLG8sbik6ITB9fTtmdW5jdGlvbiBhZShBLHQsSSl7aWYodHlwZW9mIEEhPSJvYmplY3QiKXRocm93IG5ldyBsKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0IixsLkVSUl9CQURfT1BUSU9OX1ZBTFVFKTtsZXQgZT1PYmplY3Qua2V5cyhBKSxnPWUubGVuZ3RoO2Zvcig7Zy0tID4wOyl7bGV0IHI9ZVtnXSxvPXRbcl07aWYobyl7bGV0IG49QVtyXSxhPW49PT12b2lkIDB8fG8obixyLEEpO2lmKGEhPT0hMCl0aHJvdyBuZXcgbCgib3B0aW9uICIrcisiIG11c3QgYmUgIithLGwuRVJSX0JBRF9PUFRJT05fVkFMVUUpO2NvbnRpbnVlfWlmKEkhPT0hMCl0aHJvdyBuZXcgbCgiVW5rbm93biBvcHRpb24gIityLGwuRVJSX0JBRF9PUFRJT04pfX12YXIgaEE9e2Fzc2VydE9wdGlvbnM6YWUsdmFsaWRhdG9yczp4QX07dmFyIFk9aEEudmFsaWRhdG9ycyx4PWNsYXNze2NvbnN0cnVjdG9yKHQpe3RoaXMuZGVmYXVsdHM9dCx0aGlzLmludGVyY2VwdG9ycz17cmVxdWVzdDpuZXcgTEEscmVzcG9uc2U6bmV3IExBfX1hc3luYyByZXF1ZXN0KHQsSSl7dHJ5e3JldHVybiBhd2FpdCB0aGlzLl9yZXF1ZXN0KHQsSSl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIEVycm9yKXtsZXQgZztFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT9FcnJvci5jYXB0dXJlU3RhY2tUcmFjZShnPXt9KTpnPW5ldyBFcnJvcjtsZXQgcj1nLnN0YWNrP2cuc3RhY2sucmVwbGFjZSgvXi4rXFxuLywiIik6IiI7ZS5zdGFjaz9yJiYhU3RyaW5nKGUuc3RhY2spLmVuZHNXaXRoKHIucmVwbGFjZSgvXi4rXFxuLitcXG4vLCIiKSkmJihlLnN0YWNrKz1gJTBBYCtyKTplLnN0YWNrPXJ9dGhyb3cgZX19X3JlcXVlc3QodCxJKXt0eXBlb2YgdD09InN0cmluZyI/KEk9SXx8e30sSS51cmw9dCk6ST10fHx7fSxJPWsodGhpcy5kZWZhdWx0cyxJKTtsZXR7dHJhbnNpdGlvbmFsOmUscGFyYW1zU2VyaWFsaXplcjpnLGhlYWRlcnM6cn09STtlIT09dm9pZCAwJiZoQS5hc3NlcnRPcHRpb25zKGUse3NpbGVudEpTT05QYXJzaW5nOlkudHJhbnNpdGlvbmFsKFkuYm9vbGVhbiksZm9yY2VkSlNPTlBhcnNpbmc6WS50cmFuc2l0aW9uYWwoWS5ib29sZWFuKSxjbGFyaWZ5VGltZW91dEVycm9yOlkudHJhbnNpdGlvbmFsKFkuYm9vbGVhbil9LCExKSxnIT1udWxsJiYoQy5pc0Z1bmN0aW9uKGcpP0kucGFyYW1zU2VyaWFsaXplcj17c2VyaWFsaXplOmd9OmhBLmFzc2VydE9wdGlvbnMoZyx7ZW5jb2RlOlkuZnVuY3Rpb24sc2VyaWFsaXplOlkuZnVuY3Rpb259LCEwKSksSS5tZXRob2Q9KEkubWV0aG9kfHx0aGlzLmRlZmF1bHRzLm1ldGhvZHx8ImdldCIpLnRvTG93ZXJDYXNlKCk7bGV0IG89ciYmQy5tZXJnZShyLmNvbW1vbixyW0kubWV0aG9kXSk7ciYmQy5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsInBvc3QiLCJwdXQiLCJwYXRjaCIsImNvbW1vbiJdLEU9PntkZWxldGUgcltFXX0pLEkuaGVhZGVycz1tLmNvbmNhdChvLHIpO2xldCBuPVtdLGE9ITA7dGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uKGMpe3R5cGVvZiBjLnJ1bldoZW49PSJmdW5jdGlvbiImJmMucnVuV2hlbihJKT09PSExfHwoYT1hJiZjLnN5bmNocm9ub3VzLG4udW5zaGlmdChjLmZ1bGZpbGxlZCxjLnJlamVjdGVkKSl9KTtsZXQgUT1bXTt0aGlzLmludGVyY2VwdG9ycy5yZXNwb25zZS5mb3JFYWNoKGZ1bmN0aW9uKGMpe1EucHVzaChjLmZ1bGZpbGxlZCxjLnJlamVjdGVkKX0pO2xldCBCLGk9MCxmO2lmKCFhKXtsZXQgRT1bREEuYmluZCh0aGlzKSx2b2lkIDBdO2ZvcihFLnVuc2hpZnQuYXBwbHkoRSxuKSxFLnB1c2guYXBwbHkoRSxRKSxmPUUubGVuZ3RoLEI9UHJvbWlzZS5yZXNvbHZlKEkpO2k8ZjspQj1CLnRoZW4oRVtpKytdLEVbaSsrXSk7cmV0dXJuIEJ9Zj1uLmxlbmd0aDtsZXQgcz1JO2ZvcihpPTA7aTxmOyl7bGV0IEU9bltpKytdLGM9bltpKytdO3RyeXtzPUUocyl9Y2F0Y2godSl7Yy5jYWxsKHRoaXMsdSk7YnJlYWt9fXRyeXtCPURBLmNhbGwodGhpcyxzKX1jYXRjaChFKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoRSl9Zm9yKGk9MCxmPVEubGVuZ3RoO2k8ZjspQj1CLnRoZW4oUVtpKytdLFFbaSsrXSk7cmV0dXJuIEJ9Z2V0VXJpKHQpe3Q9ayh0aGlzLmRlZmF1bHRzLHQpO2xldCBJPSQodC5iYXNlVVJMLHQudXJsKTtyZXR1cm4gWChJLHQucGFyYW1zLHQucGFyYW1zU2VyaWFsaXplcil9fTtDLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwib3B0aW9ucyJdLGZ1bmN0aW9uKHQpe3gucHJvdG90eXBlW3RdPWZ1bmN0aW9uKEksZSl7cmV0dXJuIHRoaXMucmVxdWVzdChrKGV8fHt9LHttZXRob2Q6dCx1cmw6SSxkYXRhOihlfHx7fSkuZGF0YX0pKX19KTtDLmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSxmdW5jdGlvbih0KXtmdW5jdGlvbiBJKGUpe3JldHVybiBmdW5jdGlvbihyLG8sbil7cmV0dXJuIHRoaXMucmVxdWVzdChrKG58fHt9LHttZXRob2Q6dCxoZWFkZXJzOmU/eyJDb250ZW50LVR5cGUiOiJtdWx0aXBhcnQvZm9ybS1kYXRhIn06e30sdXJsOnIsZGF0YTpvfSkpfX14LnByb3RvdHlwZVt0XT1JKCkseC5wcm90b3R5cGVbdCsiRm9ybSJdPUkoITApfSk7dmFyIEFBPXg7dmFyIGpBPWNsYXNzIEF7Y29uc3RydWN0b3IodCl7aWYodHlwZW9mIHQhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpO2xldCBJO3RoaXMucHJvbWlzZT1uZXcgUHJvbWlzZShmdW5jdGlvbihyKXtJPXJ9KTtsZXQgZT10aGlzO3RoaXMucHJvbWlzZS50aGVuKGc9PntpZighZS5fbGlzdGVuZXJzKXJldHVybjtsZXQgcj1lLl9saXN0ZW5lcnMubGVuZ3RoO2Zvcig7ci0tID4wOyllLl9saXN0ZW5lcnNbcl0oZyk7ZS5fbGlzdGVuZXJzPW51bGx9KSx0aGlzLnByb21pc2UudGhlbj1nPT57bGV0IHIsbz1uZXcgUHJvbWlzZShuPT57ZS5zdWJzY3JpYmUobikscj1ufSkudGhlbihnKTtyZXR1cm4gby5jYW5jZWw9ZnVuY3Rpb24oKXtlLnVuc3Vic2NyaWJlKHIpfSxvfSx0KGZ1bmN0aW9uKHIsbyxuKXtlLnJlYXNvbnx8KGUucmVhc29uPW5ldyBIKHIsbyxuKSxJKGUucmVhc29uKSl9KX10aHJvd0lmUmVxdWVzdGVkKCl7aWYodGhpcy5yZWFzb24pdGhyb3cgdGhpcy5yZWFzb259c3Vic2NyaWJlKHQpe2lmKHRoaXMucmVhc29uKXt0KHRoaXMucmVhc29uKTtyZXR1cm59dGhpcy5fbGlzdGVuZXJzP3RoaXMuX2xpc3RlbmVycy5wdXNoKHQpOnRoaXMuX2xpc3RlbmVycz1bdF19dW5zdWJzY3JpYmUodCl7aWYoIXRoaXMuX2xpc3RlbmVycylyZXR1cm47bGV0IEk9dGhpcy5fbGlzdGVuZXJzLmluZGV4T2YodCk7SSE9PS0xJiZ0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKEksMSl9c3RhdGljIHNvdXJjZSgpe2xldCB0O3JldHVybnt0b2tlbjpuZXcgQShmdW5jdGlvbihnKXt0PWd9KSxjYW5jZWw6dH19fSxidD1qQTtmdW5jdGlvbiBXQShBKXtyZXR1cm4gZnVuY3Rpb24oSSl7cmV0dXJuIEEuYXBwbHkobnVsbCxJKX19ZnVuY3Rpb24gWkEoQSl7cmV0dXJuIEMuaXNPYmplY3QoQSkmJkEuaXNBeGlvc0Vycm9yPT09ITB9dmFyIFZBPXtDb250aW51ZToxMDAsU3dpdGNoaW5nUHJvdG9jb2xzOjEwMSxQcm9jZXNzaW5nOjEwMixFYXJseUhpbnRzOjEwMyxPazoyMDAsQ3JlYXRlZDoyMDEsQWNjZXB0ZWQ6MjAyLE5vbkF1dGhvcml0YXRpdmVJbmZvcm1hdGlvbjoyMDMsTm9Db250ZW50OjIwNCxSZXNldENvbnRlbnQ6MjA1LFBhcnRpYWxDb250ZW50OjIwNixNdWx0aVN0YXR1czoyMDcsQWxyZWFkeVJlcG9ydGVkOjIwOCxJbVVzZWQ6MjI2LE11bHRpcGxlQ2hvaWNlczozMDAsTW92ZWRQZXJtYW5lbnRseTozMDEsRm91bmQ6MzAyLFNlZU90aGVyOjMwMyxOb3RNb2RpZmllZDozMDQsVXNlUHJveHk6MzA1LFVudXNlZDozMDYsVGVtcG9yYXJ5UmVkaXJlY3Q6MzA3LFBlcm1hbmVudFJlZGlyZWN0OjMwOCxCYWRSZXF1ZXN0OjQwMCxVbmF1dGhvcml6ZWQ6NDAxLFBheW1lbnRSZXF1aXJlZDo0MDIsRm9yYmlkZGVuOjQwMyxOb3RGb3VuZDo0MDQsTWV0aG9kTm90QWxsb3dlZDo0MDUsTm90QWNjZXB0YWJsZTo0MDYsUHJveHlBdXRoZW50aWNhdGlvblJlcXVpcmVkOjQwNyxSZXF1ZXN0VGltZW91dDo0MDgsQ29uZmxpY3Q6NDA5LEdvbmU6NDEwLExlbmd0aFJlcXVpcmVkOjQxMSxQcmVjb25kaXRpb25GYWlsZWQ6NDEyLFBheWxvYWRUb29MYXJnZTo0MTMsVXJpVG9vTG9uZzo0MTQsVW5zdXBwb3J0ZWRNZWRpYVR5cGU6NDE1LFJhbmdlTm90U2F0aXNmaWFibGU6NDE2LEV4cGVjdGF0aW9uRmFpbGVkOjQxNyxJbUFUZWFwb3Q6NDE4LE1pc2RpcmVjdGVkUmVxdWVzdDo0MjEsVW5wcm9jZXNzYWJsZUVudGl0eTo0MjIsTG9ja2VkOjQyMyxGYWlsZWREZXBlbmRlbmN5OjQyNCxUb29FYXJseTo0MjUsVXBncmFkZVJlcXVpcmVkOjQyNixQcmVjb25kaXRpb25SZXF1aXJlZDo0MjgsVG9vTWFueVJlcXVlc3RzOjQyOSxSZXF1ZXN0SGVhZGVyRmllbGRzVG9vTGFyZ2U6NDMxLFVuYXZhaWxhYmxlRm9yTGVnYWxSZWFzb25zOjQ1MSxJbnRlcm5hbFNlcnZlckVycm9yOjUwMCxOb3RJbXBsZW1lbnRlZDo1MDEsQmFkR2F0ZXdheTo1MDIsU2VydmljZVVuYXZhaWxhYmxlOjUwMyxHYXRld2F5VGltZW91dDo1MDQsSHR0cFZlcnNpb25Ob3RTdXBwb3J0ZWQ6NTA1LFZhcmlhbnRBbHNvTmVnb3RpYXRlczo1MDYsSW5zdWZmaWNpZW50U3RvcmFnZTo1MDcsTG9vcERldGVjdGVkOjUwOCxOb3RFeHRlbmRlZDo1MTAsTmV0d29ya0F1dGhlbnRpY2F0aW9uUmVxdWlyZWQ6NTExfTtPYmplY3QuZW50cmllcyhWQSkuZm9yRWFjaCgoW0EsdF0pPT57VkFbdF09QX0pO3ZhciBNdD1WQTtmdW5jdGlvbiBxdChBKXtsZXQgdD1uZXcgQUEoQSksST1XKEFBLnByb3RvdHlwZS5yZXF1ZXN0LHQpO3JldHVybiBDLmV4dGVuZChJLEFBLnByb3RvdHlwZSx0LHthbGxPd25LZXlzOiEwfSksQy5leHRlbmQoSSx0LG51bGwse2FsbE93bktleXM6ITB9KSxJLmNyZWF0ZT1mdW5jdGlvbihnKXtyZXR1cm4gcXQoayhBLGcpKX0sSX12YXIgaD1xdChUKTtoLkF4aW9zPUFBO2guQ2FuY2VsZWRFcnJvcj1IO2guQ2FuY2VsVG9rZW49YnQ7aC5pc0NhbmNlbD12O2guVkVSU0lPTj11QTtoLnRvRm9ybURhdGE9SjtoLkF4aW9zRXJyb3I9bDtoLkNhbmNlbD1oLkNhbmNlbGVkRXJyb3I7aC5hbGw9ZnVuY3Rpb24odCl7cmV0dXJuIFByb21pc2UuYWxsKHQpfTtoLnNwcmVhZD1XQTtoLmlzQXhpb3NFcnJvcj1aQTtoLm1lcmdlQ29uZmlnPWs7aC5BeGlvc0hlYWRlcnM9bTtoLmZvcm1Ub0pTT049QT0+Y0EoQy5pc0hUTUxGb3JtKEEpP25ldyBGb3JtRGF0YShBKTpBKTtoLmdldEFkYXB0ZXI9bEEuZ2V0QWRhcHRlcjtoLkh0dHBTdGF0dXNDb2RlPU10O2guZGVmYXVsdD1oO3ZhciBkQT1oO3ZhcntBeGlvczppbyxBeGlvc0Vycm9yOkNvLENhbmNlbGVkRXJyb3I6Qm8saXNDYW5jZWw6bm8sQ2FuY2VsVG9rZW46c28sVkVSU0lPTjpRbyxhbGw6RW8sQ2FuY2VsOmFvLGlzQXhpb3NFcnJvcjpjbyxzcHJlYWQ6Zm8sdG9Gb3JtRGF0YTpsbyxBeGlvc0hlYWRlcnM6RG8sSHR0cFN0YXR1c0NvZGU6dW8sZm9ybVRvSlNPTjpobyxnZXRBZGFwdGVyOnlvLG1lcmdlQ29uZmlnOndvfT1kQTt2YXIgdEEsTCx6QSxYQT17ZW52OntlbXNjcmlwdGVuX25vdGlmeV9tZW1vcnlfZ3Jvd3RoOmZ1bmN0aW9uKEEpe3pBPW5ldyBVaW50OEFycmF5KEwuZXhwb3J0cy5tZW1vcnkuYnVmZmVyKX19fSx5QT1jbGFzc3tpbml0KCl7cmV0dXJuIHRBfHwodHlwZW9mIGZldGNoPCJ1Ij90QT1mZXRjaCgiZGF0YTphcHBsaWNhdGlvbi93YXNtO2Jhc2U2NCwiK0t0KS50aGVuKHQ9PnQuYXJyYXlCdWZmZXIoKSkudGhlbih0PT5XZWJBc3NlbWJseS5pbnN0YW50aWF0ZSh0LFhBKSkudGhlbih0aGlzLl9pbml0KTp0QT1XZWJBc3NlbWJseS5pbnN0YW50aWF0ZShCdWZmZXIuZnJvbShLdCwiYmFzZTY0IiksWEEpLnRoZW4odGhpcy5faW5pdCksdEEpfV9pbml0KHQpe0w9dC5pbnN0YW5jZSxYQS5lbnYuZW1zY3JpcHRlbl9ub3RpZnlfbWVtb3J5X2dyb3d0aCgwKX1kZWNvZGUodCxJPTApe2lmKCFMKXRocm93IG5ldyBFcnJvcigiWlNURERlY29kZXI6IEF3YWl0IC5pbml0KCkgYmVmb3JlIGRlY29kaW5nLiIpO2xldCBlPXQuYnl0ZUxlbmd0aCxnPUwuZXhwb3J0cy5tYWxsb2MoZSk7ekEuc2V0KHQsZyksST1JfHxOdW1iZXIoTC5leHBvcnRzLlpTVERfZmluZERlY29tcHJlc3NlZFNpemUoZyxlKSk7bGV0IHI9TC5leHBvcnRzLm1hbGxvYyhJKSxvPUwuZXhwb3J0cy5aU1REX2RlY29tcHJlc3MocixJLGcsZSksbj16QS5zbGljZShyLHIrbyk7cmV0dXJuIEwuZXhwb3J0cy5mcmVlKGcpLEwuZXhwb3J0cy5mcmVlKHIpLG59fSxLdD0iQUdGemJRRUFBQUFCYmc1Z0EzOS9md0YvWUFGL0FYOWdBbjkvQUdBQmZ3QmdCWDkvZjM5L0FYOWdBMzkvZndCZ0JIOS9mMzhCZjJBQUFYOWdBbjkvQVg5Z0IzOS9mMzkvZjM4QmYyQUNmMzhCZm1BSWYzOS9mMzkvZjM4QmYyQUZmMzkvZjM4QVlBNS9mMzkvZjM5L2YzOS9mMzkvZndGL0FpY0JBMlZ1ZGg5bGJYTmpjbWx3ZEdWdVgyNXZkR2xtZVY5dFpXMXZjbmxmWjNKdmQzUm9BQU1ESXlJSEFBQUJBUU1IQXdFQUNRUUFCUUVJQ0FFRkJnUUVCQU1HQUFBS0FBVUxEQTBHQkFVQmNBRUJBUVVIQVFHQUFvQ0FBZ1lJQVg4QlFZQ2pCQXNIcmdFTEJtMWxiVzl5ZVFJQUJtMWhiR3h2WXdBRkJHWnlaV1VBQmd4YVUxUkVYMmx6UlhKeWIzSUFFaGxhVTFSRVgyWnBibVJFWldOdmJYQnlaWE56WldSVGFYcGxBQndQV2xOVVJGOWtaV052YlhCeVpYTnpBQ0laWDE5cGJtUnBjbVZqZEY5bWRXNWpkR2x2Ymw5MFlXSnNaUUVBRUY5ZlpYSnlibTlmYkc5allYUnBiMjRBQVFsemRHRmphMU5oZG1VQUJ3eHpkR0ZqYTFKbGMzUnZjbVVBQ0FwemRHRmphMEZzYkc5akFBa0tpL0lCSWdVQVFZUWZDek1CQVg4Z0FnUkFJQUFoQXdOQUlBTWdBUzBBQURvQUFDQURRUUZxSVFNZ0FVRUJhaUVCSUFKQkFXc2lBZzBBQ3dzZ0FBc3BBUUYvSUFJRVFDQUFJUU1EUUNBRElBRTZBQUFnQTBFQmFpRURJQUpCQVdzaUFnMEFDd3NnQUF0c0FRSi9RWUFmS0FJQUlnRWdBRUVIYWtGNGNTSUNhaUVBQWtBZ0FrRUFJQUFnQVUwYkRRQWdBRDhBUVJCMFN3UkFJQUEvQUVFUWRHdEIvLzhEYWtFUWRrQUFRWDlHQkg5QkFBVkJBQkFBUVFFTFJRMEJDMEdBSHlBQU5nSUFJQUVQQzBHRUgwRXdOZ0lBUVg4THVTY0JDMzhqQUVFUWF5SUtKQUFDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUFCQjlBRk5CRUJCaUI4b0FnQWlCa0VRSUFCQkMycEJlSEVnQUVFTFNSc2lCVUVEZGlJQWRpSUJRUU54QkVBQ1FDQUJRWDl6UVFGeElBQnFJZ0pCQTNRaUFVR3dIMm9pQUNBQlFiZ2ZhaWdDQUNJQktBSUlJZ1JHQkVCQmlCOGdCa0YrSUFKM2NUWUNBQXdCQ3lBRUlBQTJBZ3dnQUNBRU5nSUlDeUFCUVFocUlRQWdBU0FDUVFOMElnSkJBM0kyQWdRZ0FTQUNhaUlCSUFFb0FnUkJBWEkyQWdRTUR3c2dCVUdRSHlnQ0FDSUhUUTBCSUFFRVFBSkFRUUlnQUhRaUFrRUFJQUpyY2lBQklBQjBjV2dpQVVFRGRDSUFRYkFmYWlJQ0lBQkJ1QjlxS0FJQUlnQW9BZ2dpQkVZRVFFR0lIeUFHUVg0Z0FYZHhJZ1kyQWdBTUFRc2dCQ0FDTmdJTUlBSWdCRFlDQ0FzZ0FDQUZRUU55TmdJRUlBQWdCV29pQ0NBQlFRTjBJZ0VnQldzaUJFRUJjallDQkNBQUlBRnFJQVEyQWdBZ0J3UkFJQWRCZUhGQnNCOXFJUUZCbkI4b0FnQWhBZ0ovSUFaQkFTQUhRUU4yZENJRGNVVUVRRUdJSHlBRElBWnlOZ0lBSUFFTUFRc2dBU2dDQ0FzaEF5QUJJQUkyQWdnZ0F5QUNOZ0lNSUFJZ0FUWUNEQ0FDSUFNMkFnZ0xJQUJCQ0dvaEFFR2NIeUFJTmdJQVFaQWZJQVEyQWdBTUR3dEJqQjhvQWdBaUMwVU5BU0FMYUVFQ2RFRzRJV29vQWdBaUFpZ0NCRUY0Y1NBRmF5RURJQUloQVFOQUFrQWdBU2dDRUNJQVJRUkFJQUVvQWhRaUFFVU5BUXNnQUNnQ0JFRjRjU0FGYXlJQklBTWdBU0FEU1NJQkd5RURJQUFnQWlBQkd5RUNJQUFoQVF3QkN3c2dBaWdDR0NFSklBSWdBaWdDRENJRVJ3UkFRWmdmS0FJQUdpQUNLQUlJSWdBZ0JEWUNEQ0FFSUFBMkFnZ01EZ3NnQWtFVWFpSUJLQUlBSWdCRkJFQWdBaWdDRUNJQVJRMERJQUpCRUdvaEFRc0RRQ0FCSVFnZ0FDSUVRUlJxSWdFb0FnQWlBQTBBSUFSQkVHb2hBU0FFS0FJUUlnQU5BQXNnQ0VFQU5nSUFEQTBMUVg4aEJTQUFRYjkvU3cwQUlBQkJDMm9pQUVGNGNTRUZRWXdmS0FJQUlnaEZEUUJCQUNBRmF5RURBa0FDUUFKQUFuOUJBQ0FGUVlBQ1NRMEFHa0VmSUFWQi8vLy9CMHNOQUJvZ0JVRW1JQUJCQ0habklnQnJka0VCY1NBQVFRRjBhMEUrYWdzaUIwRUNkRUc0SVdvb0FnQWlBVVVFUUVFQUlRQU1BUXRCQUNFQUlBVkJHU0FIUVFGMmEwRUFJQWRCSDBjYmRDRUNBMEFDUUNBQktBSUVRWGh4SUFWcklnWWdBMDhOQUNBQklRUWdCaUlERFFCQkFDRURJQUVoQUF3REN5QUFJQUVvQWhRaUJpQUdJQUVnQWtFZGRrRUVjV29vQWhBaUFVWWJJQUFnQmhzaEFDQUNRUUYwSVFJZ0FRMEFDd3NnQUNBRWNrVUVRRUVBSVFSQkFpQUhkQ0lBUVFBZ0FHdHlJQWh4SWdCRkRRTWdBR2hCQW5SQnVDRnFLQUlBSVFBTElBQkZEUUVMQTBBZ0FDZ0NCRUY0Y1NBRmF5SUNJQU5KSVFFZ0FpQURJQUViSVFNZ0FDQUVJQUViSVFRZ0FDZ0NFQ0lCQkg4Z0FRVWdBQ2dDRkFzaUFBMEFDd3NnQkVVTkFDQURRWkFmS0FJQUlBVnJUdzBBSUFRb0FoZ2hCeUFFSUFRb0Fnd2lBa2NFUUVHWUh5Z0NBQm9nQkNnQ0NDSUFJQUkyQWd3Z0FpQUFOZ0lJREF3TElBUkJGR29pQVNnQ0FDSUFSUVJBSUFRb0FoQWlBRVVOQXlBRVFSQnFJUUVMQTBBZ0FTRUdJQUFpQWtFVWFpSUJLQUlBSWdBTkFDQUNRUkJxSVFFZ0FpZ0NFQ0lBRFFBTElBWkJBRFlDQUF3TEN5QUZRWkFmS0FJQUlnUk5CRUJCbkI4b0FnQWhBQUpBSUFRZ0JXc2lBVUVRVHdSQUlBQWdCV29pQWlBQlFRRnlOZ0lFSUFBZ0JHb2dBVFlDQUNBQUlBVkJBM0kyQWdRTUFRc2dBQ0FFUVFOeU5nSUVJQUFnQkdvaUFTQUJLQUlFUVFGeU5nSUVRUUFoQWtFQUlRRUxRWkFmSUFFMkFnQkJuQjhnQWpZQ0FDQUFRUWhxSVFBTURRc2dCVUdVSHlnQ0FDSUNTUVJBUVpRZklBSWdCV3NpQVRZQ0FFR2dIMEdnSHlnQ0FDSUFJQVZxSWdJMkFnQWdBaUFCUVFGeU5nSUVJQUFnQlVFRGNqWUNCQ0FBUVFocUlRQU1EUXRCQUNFQUlBVkJMMm9pQXdKL1FlQWlLQUlBQkVCQjZDSW9BZ0FNQVF0QjdDSkNmemNDQUVIa0lrS0FvSUNBZ0lBRU53SUFRZUFpSUFwQkRHcEJjSEZCMktyVnFnVnpOZ0lBUWZRaVFRQTJBZ0JCeENKQkFEWUNBRUdBSUFzaUFXb2lCa0VBSUFGcklnaHhJZ0VnQlUwTkRFSEFJaWdDQUNJRUJFQkJ1Q0lvQWdBaUJ5QUJhaUlKSUFkTklBUWdDVWx5RFEwTEFrQkJ4Q0l0QUFCQkJIRkZCRUFDUUFKQUFrQUNRRUdnSHlnQ0FDSUVCRUJCeUNJaEFBTkFJQVFnQUNnQ0FDSUhUd1JBSUFjZ0FDZ0NCR29nQkVzTkF3c2dBQ2dDQ0NJQURRQUxDMEVBRUFRaUFrRi9SZzBESUFFaEJrSGtJaWdDQUNJQVFRRnJJZ1FnQW5FRVFDQUJJQUpySUFJZ0JHcEJBQ0FBYTNGcUlRWUxJQVVnQms4TkEwSEFJaWdDQUNJQUJFQkJ1Q0lvQWdBaUJDQUdhaUlJSUFSTklBQWdDRWx5RFFRTElBWVFCQ0lBSUFKSERRRU1CUXNnQmlBQ2F5QUljU0lHRUFRaUFpQUFLQUlBSUFBb0FnUnFSZzBCSUFJaEFBc2dBRUYvUmcwQklBVkJNR29nQmswRVFDQUFJUUlNQkF0QjZDSW9BZ0FpQWlBRElBWnJha0VBSUFKcmNTSUNFQVJCZjBZTkFTQUNJQVpxSVFZZ0FDRUNEQU1MSUFKQmYwY05BZ3RCeENKQnhDSW9BZ0JCQkhJMkFnQUxJQUVRQkNJQ1FYOUdRUUFRQkNJQVFYOUdjaUFBSUFKTmNnMEZJQUFnQW1zaUJpQUZRU2hxVFEwRkMwRzRJa0c0SWlnQ0FDQUdhaUlBTmdJQVFid2lLQUlBSUFCSkJFQkJ2Q0lnQURZQ0FBc0NRRUdnSHlnQ0FDSURCRUJCeUNJaEFBTkFJQUlnQUNnQ0FDSUJJQUFvQWdRaUJHcEdEUUlnQUNnQ0NDSUFEUUFMREFRTFFaZ2ZLQUlBSWdCQkFDQUFJQUpORzBVRVFFR1lIeUFDTmdJQUMwRUFJUUJCekNJZ0JqWUNBRUhJSWlBQ05nSUFRYWdmUVg4MkFnQkJyQjlCNENJb0FnQTJBZ0JCMUNKQkFEWUNBQU5BSUFCQkEzUWlBVUc0SDJvZ0FVR3dIMm9pQkRZQ0FDQUJRYndmYWlBRU5nSUFJQUJCQVdvaUFFRWdSdzBBQzBHVUh5QUdRU2hySWdCQmVDQUNhMEVIY1NJQmF5SUVOZ0lBUWFBZklBRWdBbW9pQVRZQ0FDQUJJQVJCQVhJMkFnUWdBQ0FDYWtFb05nSUVRYVFmUWZBaUtBSUFOZ0lBREFRTElBSWdBMDBnQVNBRFMzSU5BaUFBS0FJTVFRaHhEUUlnQUNBRUlBWnFOZ0lFUWFBZklBTkJlQ0FEYTBFSGNTSUFhaUlCTmdJQVFaUWZRWlFmS0FJQUlBWnFJZ0lnQUdzaUFEWUNBQ0FCSUFCQkFYSTJBZ1FnQWlBRGFrRW9OZ0lFUWFRZlFmQWlLQUlBTmdJQURBTUxRUUFoQkF3S0MwRUFJUUlNQ0F0Qm1COG9BZ0FnQWtzRVFFR1lIeUFDTmdJQUN5QUNJQVpxSVFGQnlDSWhBQUpBQWtBQ1FBTkFJQUVnQUNnQ0FFY0VRQ0FBS0FJSUlnQU5BUXdDQ3dzZ0FDMEFERUVJY1VVTkFRdEJ5Q0loQUFOQUlBTWdBQ2dDQUNJQlR3UkFJQUVnQUNnQ0JHb2lCQ0FEU3cwREN5QUFLQUlJSVFBTUFBc0FDeUFBSUFJMkFnQWdBQ0FBS0FJRUlBWnFOZ0lFSUFKQmVDQUNhMEVIY1dvaUJ5QUZRUU55TmdJRUlBRkJlQ0FCYTBFSGNXb2lCaUFGSUFkcUlnVnJJUUFnQXlBR1JnUkFRYUFmSUFVMkFnQkJsQjlCbEI4b0FnQWdBR29pQURZQ0FDQUZJQUJCQVhJMkFnUU1DQXRCbkI4b0FnQWdCa1lFUUVHY0h5QUZOZ0lBUVpBZlFaQWZLQUlBSUFCcUlnQTJBZ0FnQlNBQVFRRnlOZ0lFSUFBZ0JXb2dBRFlDQUF3SUN5QUdLQUlFSWdOQkEzRkJBVWNOQmlBRFFYaHhJUWtnQTBIL0FVMEVRQ0FHS0FJTUlnRWdCaWdDQ0NJQ1JnUkFRWWdmUVlnZktBSUFRWDRnQTBFRGRuZHhOZ0lBREFjTElBSWdBVFlDRENBQklBSTJBZ2dNQmdzZ0JpZ0NHQ0VJSUFZZ0JpZ0NEQ0lDUndSQUlBWW9BZ2dpQVNBQ05nSU1JQUlnQVRZQ0NBd0ZDeUFHUVJScUlnRW9BZ0FpQTBVRVFDQUdLQUlRSWdORkRRUWdCa0VRYWlFQkN3TkFJQUVoQkNBRElnSkJGR29pQVNnQ0FDSUREUUFnQWtFUWFpRUJJQUlvQWhBaUF3MEFDeUFFUVFBMkFnQU1CQXRCbEI4Z0JrRW9heUlBUVhnZ0FtdEJCM0VpQVdzaUNEWUNBRUdnSHlBQklBSnFJZ0UyQWdBZ0FTQUlRUUZ5TmdJRUlBQWdBbXBCS0RZQ0JFR2tIMEh3SWlnQ0FEWUNBQ0FESUFSQkp5QUVhMEVIY1dwQkwyc2lBQ0FBSUFOQkVHcEpHeUlCUVJzMkFnUWdBVUhRSWlrQ0FEY0NFQ0FCUWNnaUtRSUFOd0lJUWRBaUlBRkJDR28yQWdCQnpDSWdCallDQUVISUlpQUNOZ0lBUWRRaVFRQTJBZ0FnQVVFWWFpRUFBMEFnQUVFSE5nSUVJQUJCQ0dvZ0FFRUVhaUVBSUFSSkRRQUxJQUVnQTBZTkFDQUJJQUVvQWdSQmZuRTJBZ1FnQXlBQklBTnJJZ0pCQVhJMkFnUWdBU0FDTmdJQUlBSkIvd0ZOQkVBZ0FrRjRjVUd3SDJvaEFBSi9RWWdmS0FJQUlnRkJBU0FDUVFOMmRDSUNjVVVFUUVHSUh5QUJJQUp5TmdJQUlBQU1BUXNnQUNnQ0NBc2hBU0FBSUFNMkFnZ2dBU0FETmdJTUlBTWdBRFlDRENBRElBRTJBZ2dNQVF0Qkh5RUFJQUpCLy8vL0IwMEVRQ0FDUVNZZ0FrRUlkbWNpQUd0MlFRRnhJQUJCQVhSclFUNXFJUUFMSUFNZ0FEWUNIQ0FEUWdBM0FoQWdBRUVDZEVHNElXb2hBUUpBQWtCQmpCOG9BZ0FpQkVFQklBQjBJZ1p4UlFSQVFZd2ZJQVFnQm5JMkFnQWdBU0FETmdJQURBRUxJQUpCR1NBQVFRRjJhMEVBSUFCQkgwY2JkQ0VBSUFFb0FnQWhCQU5BSUFRaUFTZ0NCRUY0Y1NBQ1JnMENJQUJCSFhZaEJDQUFRUUYwSVFBZ0FTQUVRUVJ4YWlJR0tBSVFJZ1FOQUFzZ0JpQUROZ0lRQ3lBRElBRTJBaGdnQXlBRE5nSU1JQU1nQXpZQ0NBd0JDeUFCS0FJSUlnQWdBellDRENBQklBTTJBZ2dnQTBFQU5nSVlJQU1nQVRZQ0RDQURJQUEyQWdnTFFaUWZLQUlBSWdBZ0JVME5BRUdVSHlBQUlBVnJJZ0UyQWdCQm9COUJvQjhvQWdBaUFDQUZhaUlDTmdJQUlBSWdBVUVCY2pZQ0JDQUFJQVZCQTNJMkFnUWdBRUVJYWlFQURBZ0xRWVFmUVRBMkFnQkJBQ0VBREFjTFFRQWhBZ3NnQ0VVTkFBSkFJQVlvQWh3aUFVRUNkRUc0SVdvaUJDZ0NBQ0FHUmdSQUlBUWdBallDQUNBQ0RRRkJqQjlCakI4b0FnQkJmaUFCZDNFMkFnQU1BZ3NnQ0VFUVFSUWdDQ2dDRUNBR1JodHFJQUkyQWdBZ0FrVU5BUXNnQWlBSU5nSVlJQVlvQWhBaUFRUkFJQUlnQVRZQ0VDQUJJQUkyQWhnTElBWW9BaFFpQVVVTkFDQUNJQUUyQWhRZ0FTQUNOZ0lZQ3lBQUlBbHFJUUFnQmlBSmFpSUdLQUlFSVFNTElBWWdBMEYrY1RZQ0JDQUZJQUJCQVhJMkFnUWdBQ0FGYWlBQU5nSUFJQUJCL3dGTkJFQWdBRUY0Y1VHd0gyb2hBUUovUVlnZktBSUFJZ0pCQVNBQVFRTjJkQ0lBY1VVRVFFR0lIeUFBSUFKeU5nSUFJQUVNQVFzZ0FTZ0NDQXNoQUNBQklBVTJBZ2dnQUNBRk5nSU1JQVVnQVRZQ0RDQUZJQUEyQWdnTUFRdEJIeUVESUFCQi8vLy9CMDBFUUNBQVFTWWdBRUVJZG1jaUFXdDJRUUZ4SUFGQkFYUnJRVDVxSVFNTElBVWdBellDSENBRlFnQTNBaEFnQTBFQ2RFRzRJV29oQVFKQUFrQkJqQjhvQWdBaUFrRUJJQU4wSWdSeFJRUkFRWXdmSUFJZ0JISTJBZ0FnQVNBRk5nSUFEQUVMSUFCQkdTQURRUUYyYTBFQUlBTkJIMGNiZENFRElBRW9BZ0FoQWdOQUlBSWlBU2dDQkVGNGNTQUFSZzBDSUFOQkhYWWhBaUFEUVFGMElRTWdBU0FDUVFSeGFpSUVLQUlRSWdJTkFBc2dCQ0FGTmdJUUN5QUZJQUUyQWhnZ0JTQUZOZ0lNSUFVZ0JUWUNDQXdCQ3lBQktBSUlJZ0FnQlRZQ0RDQUJJQVUyQWdnZ0JVRUFOZ0lZSUFVZ0FUWUNEQ0FGSUFBMkFnZ0xJQWRCQ0dvaEFBd0NDd0pBSUFkRkRRQUNRQ0FFS0FJY0lnQkJBblJCdUNGcUlnRW9BZ0FnQkVZRVFDQUJJQUkyQWdBZ0FnMEJRWXdmSUFoQmZpQUFkM0VpQ0RZQ0FBd0NDeUFIUVJCQkZDQUhLQUlRSUFSR0cyb2dBallDQUNBQ1JRMEJDeUFDSUFjMkFoZ2dCQ2dDRUNJQUJFQWdBaUFBTmdJUUlBQWdBallDR0FzZ0JDZ0NGQ0lBUlEwQUlBSWdBRFlDRkNBQUlBSTJBaGdMQWtBZ0EwRVBUUVJBSUFRZ0F5QUZhaUlBUVFOeU5nSUVJQUFnQkdvaUFDQUFLQUlFUVFGeU5nSUVEQUVMSUFRZ0JVRURjallDQkNBRUlBVnFJZ0lnQTBFQmNqWUNCQ0FDSUFOcUlBTTJBZ0FnQTBIL0FVMEVRQ0FEUVhoeFFiQWZhaUVBQW45QmlCOG9BZ0FpQVVFQklBTkJBM1owSWdOeFJRUkFRWWdmSUFFZ0EzSTJBZ0FnQUF3QkN5QUFLQUlJQ3lFQklBQWdBallDQ0NBQklBSTJBZ3dnQWlBQU5nSU1JQUlnQVRZQ0NBd0JDMEVmSVFBZ0EwSC8vLzhIVFFSQUlBTkJKaUFEUVFoMlp5SUFhM1pCQVhFZ0FFRUJkR3RCUG1vaEFBc2dBaUFBTmdJY0lBSkNBRGNDRUNBQVFRSjBRYmdoYWlFQkFrQUNRQ0FJUVFFZ0FIUWlCbkZGQkVCQmpCOGdCaUFJY2pZQ0FDQUJJQUkyQWdBTUFRc2dBMEVaSUFCQkFYWnJRUUFnQUVFZlJ4dDBJUUFnQVNnQ0FDRUZBMEFnQlNJQktBSUVRWGh4SUFOR0RRSWdBRUVkZGlFR0lBQkJBWFFoQUNBQklBWkJCSEZxSWdZb0FoQWlCUTBBQ3lBR0lBSTJBaEFMSUFJZ0FUWUNHQ0FDSUFJMkFnd2dBaUFDTmdJSURBRUxJQUVvQWdnaUFDQUNOZ0lNSUFFZ0FqWUNDQ0FDUVFBMkFoZ2dBaUFCTmdJTUlBSWdBRFlDQ0FzZ0JFRUlhaUVBREFFTEFrQWdDVVVOQUFKQUlBSW9BaHdpQUVFQ2RFRzRJV29pQVNnQ0FDQUNSZ1JBSUFFZ0JEWUNBQ0FFRFFGQmpCOGdDMEYrSUFCM2NUWUNBQXdDQ3lBSlFSQkJGQ0FKS0FJUUlBSkdHMm9nQkRZQ0FDQUVSUTBCQ3lBRUlBazJBaGdnQWlnQ0VDSUFCRUFnQkNBQU5nSVFJQUFnQkRZQ0dBc2dBaWdDRkNJQVJRMEFJQVFnQURZQ0ZDQUFJQVEyQWhnTEFrQWdBMEVQVFFSQUlBSWdBeUFGYWlJQVFRTnlOZ0lFSUFBZ0Ftb2lBQ0FBS0FJRVFRRnlOZ0lFREFFTElBSWdCVUVEY2pZQ0JDQUNJQVZxSWdRZ0EwRUJjallDQkNBRElBUnFJQU0yQWdBZ0J3UkFJQWRCZUhGQnNCOXFJUUJCbkI4b0FnQWhBUUovUVFFZ0IwRURkblFpQlNBR2NVVUVRRUdJSHlBRklBWnlOZ0lBSUFBTUFRc2dBQ2dDQ0FzaEJpQUFJQUUyQWdnZ0JpQUJOZ0lNSUFFZ0FEWUNEQ0FCSUFZMkFnZ0xRWndmSUFRMkFnQkJrQjhnQXpZQ0FBc2dBa0VJYWlFQUN5QUtRUkJxSkFBZ0FBdlNDd0VIZndKQUlBQkZEUUFnQUVFSWF5SUNJQUJCQkdzb0FnQWlBVUY0Y1NJQWFpRUZBa0FnQVVFQmNRMEFJQUZCQTNGRkRRRWdBaUFDS0FJQUlnRnJJZ0pCbUI4b0FnQkpEUUVnQUNBQmFpRUFBa0FDUUVHY0h5Z0NBQ0FDUndSQUlBRkIvd0ZOQkVBZ0FVRURkaUVFSUFJb0Fnd2lBU0FDS0FJSUlnTkdCRUJCaUI5QmlCOG9BZ0JCZmlBRWQzRTJBZ0FNQlFzZ0F5QUJOZ0lNSUFFZ0F6WUNDQXdFQ3lBQ0tBSVlJUVlnQWlBQ0tBSU1JZ0ZIQkVBZ0FpZ0NDQ0lESUFFMkFnd2dBU0FETmdJSURBTUxJQUpCRkdvaUJDZ0NBQ0lEUlFSQUlBSW9BaEFpQTBVTkFpQUNRUkJxSVFRTEEwQWdCQ0VISUFNaUFVRVVhaUlFS0FJQUlnTU5BQ0FCUVJCcUlRUWdBU2dDRUNJRERRQUxJQWRCQURZQ0FBd0NDeUFGS0FJRUlnRkJBM0ZCQTBjTkFrR1FIeUFBTmdJQUlBVWdBVUYrY1RZQ0JDQUNJQUJCQVhJMkFnUWdCU0FBTmdJQUR3dEJBQ0VCQ3lBR1JRMEFBa0FnQWlnQ0hDSURRUUowUWJnaGFpSUVLQUlBSUFKR0JFQWdCQ0FCTmdJQUlBRU5BVUdNSDBHTUh5Z0NBRUYrSUFOM2NUWUNBQXdDQ3lBR1FSQkJGQ0FHS0FJUUlBSkdHMm9nQVRZQ0FDQUJSUTBCQ3lBQklBWTJBaGdnQWlnQ0VDSURCRUFnQVNBRE5nSVFJQU1nQVRZQ0dBc2dBaWdDRkNJRFJRMEFJQUVnQXpZQ0ZDQURJQUUyQWhnTElBSWdCVThOQUNBRktBSUVJZ0ZCQVhGRkRRQUNRQUpBQWtBQ1FDQUJRUUp4UlFSQVFhQWZLQUlBSUFWR0JFQkJvQjhnQWpZQ0FFR1VIMEdVSHlnQ0FDQUFhaUlBTmdJQUlBSWdBRUVCY2pZQ0JDQUNRWndmS0FJQVJ3MEdRWkFmUVFBMkFnQkJuQjlCQURZQ0FBOExRWndmS0FJQUlBVkdCRUJCbkI4Z0FqWUNBRUdRSDBHUUh5Z0NBQ0FBYWlJQU5nSUFJQUlnQUVFQmNqWUNCQ0FBSUFKcUlBQTJBZ0FQQ3lBQlFYaHhJQUJxSVFBZ0FVSC9BVTBFUUNBQlFRTjJJUVFnQlNnQ0RDSUJJQVVvQWdnaUEwWUVRRUdJSDBHSUh5Z0NBRUYrSUFSM2NUWUNBQXdGQ3lBRElBRTJBZ3dnQVNBRE5nSUlEQVFMSUFVb0FoZ2hCaUFGSUFVb0Fnd2lBVWNFUUVHWUh5Z0NBQm9nQlNnQ0NDSURJQUUyQWd3Z0FTQUROZ0lJREFNTElBVkJGR29pQkNnQ0FDSURSUVJBSUFVb0FoQWlBMFVOQWlBRlFSQnFJUVFMQTBBZ0JDRUhJQU1pQVVFVWFpSUVLQUlBSWdNTkFDQUJRUkJxSVFRZ0FTZ0NFQ0lERFFBTElBZEJBRFlDQUF3Q0N5QUZJQUZCZm5FMkFnUWdBaUFBUVFGeU5nSUVJQUFnQW1vZ0FEWUNBQXdEQzBFQUlRRUxJQVpGRFFBQ1FDQUZLQUljSWdOQkFuUkJ1Q0ZxSWdRb0FnQWdCVVlFUUNBRUlBRTJBZ0FnQVEwQlFZd2ZRWXdmS0FJQVFYNGdBM2R4TmdJQURBSUxJQVpCRUVFVUlBWW9BaEFnQlVZYmFpQUJOZ0lBSUFGRkRRRUxJQUVnQmpZQ0dDQUZLQUlRSWdNRVFDQUJJQU0yQWhBZ0F5QUJOZ0lZQ3lBRktBSVVJZ05GRFFBZ0FTQUROZ0lVSUFNZ0FUWUNHQXNnQWlBQVFRRnlOZ0lFSUFBZ0Ftb2dBRFlDQUNBQ1Fad2ZLQUlBUncwQVFaQWZJQUEyQWdBUEN5QUFRZjhCVFFSQUlBQkJlSEZCc0I5cUlRRUNmMEdJSHlnQ0FDSURRUUVnQUVFRGRuUWlBSEZGQkVCQmlCOGdBQ0FEY2pZQ0FDQUJEQUVMSUFFb0FnZ0xJUUFnQVNBQ05nSUlJQUFnQWpZQ0RDQUNJQUUyQWd3Z0FpQUFOZ0lJRHd0Qkh5RURJQUJCLy8vL0IwMEVRQ0FBUVNZZ0FFRUlkbWNpQVd0MlFRRnhJQUZCQVhSclFUNXFJUU1MSUFJZ0F6WUNIQ0FDUWdBM0FoQWdBMEVDZEVHNElXb2hBUUpBQWtBQ1FFR01IeWdDQUNJRVFRRWdBM1FpQjNGRkJFQkJqQjhnQkNBSGNqWUNBQ0FCSUFJMkFnQWdBaUFCTmdJWURBRUxJQUJCR1NBRFFRRjJhMEVBSUFOQkgwY2JkQ0VESUFFb0FnQWhBUU5BSUFFaUJDZ0NCRUY0Y1NBQVJnMENJQU5CSFhZaEFTQURRUUYwSVFNZ0JDQUJRUVJ4YWlJSFFSQnFLQUlBSWdFTkFBc2dCeUFDTmdJUUlBSWdCRFlDR0FzZ0FpQUNOZ0lNSUFJZ0FqWUNDQXdCQ3lBRUtBSUlJZ0FnQWpZQ0RDQUVJQUkyQWdnZ0FrRUFOZ0lZSUFJZ0JEWUNEQ0FDSUFBMkFnZ0xRYWdmUWFnZktBSUFRUUZySWdCQmZ5QUFHellDQUFzTEJBQWpBQXNHQUNBQUpBQUxFQUFqQUNBQWEwRndjU0lBSkFBZ0FBdEtBUUYvSUFBZ0FVa0VRQ0FBSUFFZ0FoQUNEd3NnQWdSQUlBQWdBbW9oQXlBQklBSnFJUUVEUUNBRFFRRnJJZ01nQVVFQmF5SUJMUUFBT2dBQUlBSkJBV3NpQWcwQUN3c2dBQXY5RGdJUmZ3RitJd0JCTUdzaUJ5UUFRYmgvSVFnQ1FDQUZSUTBBSUFRc0FBQWlDVUgvQVhFaEN3SkFJQWxCQUVnRVFDQUxRZjRBYTBFQmRpSUdJQVZQRFFKQmJDRUlJQXRCL3dCcklndEIvd0ZMRFFJZ0JFRUJhaUVJUVFBaEJRTkFJQVVnQzA4RVFDQUxJUWdnQmlFTERBTUZJQUFnQldvZ0NDQUZRUUYyYWlJRUxRQUFRUVIyT2dBQUlBQWdCVUVCY21vZ0JDMEFBRUVQY1RvQUFDQUZRUUpxSVFVTUFRc0FDd0FMSUFVZ0MwME5BU0FIUWY4Qk5nSUVJQVlnQjBFRWFpQUhRUWhxSUFSQkFXb2lEaUFMRUF3aUJFR0lmMHNFUUNBRUlRZ01BZ3RCVkNFSUlBY29BZ2dpRUVFR1N3MEJJQWNvQWdRaUVVRUJkQ0lKUVFKcXJVSUJJQkN0aGlJWVFRRWdFSFFpRFVFQmFpSUZyVUlDaG54OFFndDhRdnovLy8vLy8vLy8vd0NEUXVRQ1ZnMEJRVkloQ0NBUlFmOEJTdzBCSUExQmYzTkJBblJCNUFKcXJTQVJRUUZxSWhWQkFYU3RJQmg4UWdoOFZBMEJJQXNnQkdzaEZpQUVJQTVxSVJjZ0JrR0FCR29pRWlBRlFRSjBhaUlSSUFscVFRSnFJUTRnQmtHRUJHb2hFMEdBZ0FJZ0VIUkJFSFloQ1VFQUlRVkJBU0VQSUExQkFXc2lGQ0VLQTBBZ0JTQVZSa1VFUUFKQUlBWWdCVUVCZENJSWFpOEJBQ0lFUWYvL0EwWUVRQ0FUSUFwQkFuUnFJQVU2QUFJZ0NrRUJheUVLUVFFaEJBd0JDeUFQUVFBZ0NTQUV3VW9iSVE4TElBZ2dFV29nQkRzQkFDQUZRUUZxSVFVTUFRc0xJQVlnRHpzQmdnUWdCaUFRT3dHQUJBSkFJQW9nRkVZRVFDQU5RUU4ySVFoQ0FDRVlRUUFoRHdOQUlBd2dGVVlFUUNBSUlBMUJBWFpxUVFOcUlnbEJBWFFoQ0VFQUlRUkJBQ0VLQTBCQkFDRUZJQW9nRFU4TkJBTkFJQVZCQWtaRkJFQWdFeUFGSUFsc0lBUnFJQlJ4UVFKMGFpQU9JQVVnQ21wcUxRQUFPZ0FDSUFWQkFXb2hCUXdCQ3dzZ0NrRUNhaUVLSUFRZ0NHb2dGSEVoQkF3QUN3QUZJQVlnREVFQmRHb3VBUUFoQ1NBT0lBOXFJZ1FnR0RjQUFFRUlJUVVEUUNBRklBbE9SUVJBSUFRZ0JXb2dHRGNBQUNBRlFRaHFJUVVNQVFzTElCaENnWUtFaUpDZ3dJQUJmQ0VZSUF4QkFXb2hEQ0FKSUE5cUlROE1BUXNBQ3dBTElBMUJBM1lnRFVFQmRtcEJBMm9oQ0VFQUlRVURRQ0FNSUJWR1JRUkFRUUFoQ1NBR0lBeEJBWFJxTGdFQUlnUkJBQ0FFUVFCS0d5RUVBMEFnQkNBSlJrVUVRQ0FUSUFWQkFuUnFJQXc2QUFJRFFDQUZJQWhxSUJSeElnVWdDa3NOQUFzZ0NVRUJhaUVKREFFTEN5QU1RUUZxSVF3TUFRc0xRWDhoQ0NBRkRRSUxJQkJCQVdvaENFRUFJUVVEUUNBRklBMUdSUVJBSUJFZ0V5QUZRUUowYWlJT0xRQUNRUUYwYWlJRUlBUXZBUUFpQ1VFQmFqc0JBQ0FPSUFnZ0NXZEJZSE5xSWdRNkFBTWdEaUFKSUFSMElBMXJPd0VBSUFWQkFXb2hCUXdCQ3dzQ1FBSkFJQVl2QVlJRUJFQWdCMEVjYWlJRUlCY2dGaEFOSWdoQmlIOUxEUUlnQjBFVWFpQUVJQklRRGlBSFFReHFJQVFnRWhBT1FRQWhCUU5BSUFkQkhHb2lCQkFQSUFWQit3RkxjZzBDSUFBZ0JXb2lCaUFIUVJScUlBUVFFRG9BQUNBR0lBZEJER29nQkJBUU9nQUJJQVZCQW5JaEJDQUhRUnhxRUE4RVFDQUVJUVVNQXdVZ0FDQUVhaUFIUVJScUlBZEJIR29pQkJBUU9nQUFJQVlnQjBFTWFpQUVFQkE2QUFNZ0JVRUVhaUVGREFFTEFBc0FDeUFIUVJ4cUlnUWdGeUFXRUEwaUNFR0lmMHNOQVNBSFFSUnFJQVFnRWhBT0lBZEJER29nQkNBU0VBNUJBQ0VGQTBBZ0IwRWNhaUlFRUE4Z0JVSDdBVXR5UlFSQUlBQWdCV29pQmlBSFFSUnFJQVFRRVRvQUFDQUdJQWRCREdvZ0JCQVJPZ0FCSUFWQkFuSWhCQ0FIUVJ4cUVBOEVRQ0FFSVFVRklBQWdCR29nQjBFVWFpQUhRUnhxSWdRUUVUb0FBQ0FHSUFkQkRHb2dCQkFST2dBRElBVkJCR29oQlF3Q0N3c0xBbjhEUUVHNmZ5RUlJQVZCL1FGTERRTWdBQ0FGYWlJR0lBZEJGR29nQjBFY2FpSUpFQkU2QUFBZ0JrRUJhaUVFSUFrUUQwRURSZ1JBSUFkQkRHb2hDRUVDREFJTElBVkIvQUZMRFFNZ0JpQUhRUXhxSUFkQkhHb2lCQkFST2dBQklBVkJBbW9oQlNBRUVBOUJBMGNOQUFzZ0FDQUZhaUVFSUFkQkZHb2hDRUVEQ3lBRUlBZ2dCMEVjYWhBUk9nQUFJQVpxSUFCcklRZ01BUXNDZndOQVFicC9JUWdnQlVIOUFVc05BaUFBSUFWcUlnWWdCMEVVYWlBSFFSeHFJZ2tRRURvQUFDQUdRUUZxSVFRZ0NSQVBRUU5HQkVBZ0IwRU1haUVJUVFJTUFnc2dCVUg4QVVzTkFpQUdJQWRCREdvZ0IwRWNhaUlFRUJBNkFBRWdCVUVDYWlFRklBUVFEMEVEUncwQUN5QUFJQVZxSVFRZ0IwRVVhaUVJUVFNTElBUWdDQ0FIUVJ4cUVCQTZBQUFnQm1vZ0FHc2hDQXNnQ0VHSWYwc05BUXNnQ0NFRVFRQWhCU0FCUVFCQk5CQURJUWxCQUNFS0EwQWdCQ0FGUndSQUlBQWdCV29pQmkwQUFDSUJRUXRMQkVCQmJDRUlEQU1GSUFrZ0FVRUNkR29pQVNBQktBSUFRUUZxTmdJQUlBVkJBV29oQlVFQklBWXRBQUIwUVFGMUlBcHFJUW9NQWdzQUN3dEJiQ0VJSUFwRkRRQWdDbWNpQlVFZmN5SUJRUXRMRFFBZ0EwRWdJQVZyTmdJQVFRRkJBaUFCZENBS2F5SURaMEVmY3lJQmRDQURSdzBBSUFBZ0JHb2dBVUVCYWlJQU9nQUFJQWtnQUVFQ2RHb2lBQ0FBS0FJQVFRRnFOZ0lBSUFrb0FnUWlBRUVDU1NBQVFRRnhjZzBBSUFJZ0JFRUJhallDQUNBTFFRRnFJUWdMSUFkQk1Hb2tBQ0FJQzZBRkFReC9Jd0JCRUdzaURDUUFBbjhnQkVFSFRRUkFJQXhDQURjRENDQU1RUWhxSWdVZ0F5QUVFQUlhUVd3Z0FDQUJJQUlnQlVFSUVBd2lBQ0FBSUFSTEd5QUFJQUJCaVg5Skd3d0JDeUFBUVFBZ0FTZ0NBRUVCYWlJTlFRRjBFQU1oRDBGVUlBTW9BQUFpQmtFUGNTSUFRUXBMRFFBYUlBSWdBRUVGYWpZQ0FDQURJQVJxSWdKQkJHc2hCeUFDUVFkcklRc2dBRUVHYWlFT1FRUWhBaUFHUVFSMklRVkJJQ0FBZENJSVFRRnlJUWxCQUNFQVFRRWhCaUFESVFRRFFBSkFJQVpCQVhGRkJFQURRQ0FGUVg5elFZQ0FnSUI0Y21naUJrRVlTVVVFUUNBQVFTUnFJUUFnQkNBTFRRUi9JQVJCQTJvRklBUWdDMnRCQTNRZ0FtcEJIM0VoQWlBSEN5SUVLQUFBSUFKMklRVU1BUXNMSUFJZ0JrRWVjU0lLYWtFQ2FpRUNJQVpCQVhaQkEyd2dBR29nQlNBS2RrRURjV29pQUNBTlR3MEJBbjhnQkNBTFN5QUNRUU4ySUFScUlnVWdCMHR4UlFSQUlBSkJCM0VoQWlBRkRBRUxJQVFnQjJ0QkEzUWdBbXBCSDNFaEFpQUhDeUlFS0FBQUlBSjJJUVVMSUFVZ0NFRUJhM0VpQmlBSVFRRjBRUUZySWdvZ0NXc2lFRWtFZnlBT1FRRnJCU0FGSUFweElnVWdFRUVBSUFVZ0NFNGJheUVHSUE0TElRVWdEeUFBUVFGMGFpQUdRUUZySWdvN0FRQWdBRUVCYWlFQUlBSWdCV29oQWlBSVFRRWdCbXNnQ2lBR1FRQktHeUFKYWlJSlNnUkFJQWxCQWtnTkFVRWdJQWxuSWdWcklRNUJBU0FGUVI5emRDRUlDeUFBSUExUERRQWdDa0VBUnlFR0FuOGdCQ0FMU3lBQ1FRTjFJQVJxSWdVZ0IwdHhSUVJBSUFKQkIzRWhBaUFGREFFTElBSWdCQ0FIYTBFRGRHcEJIM0VoQWlBSEN5SUVLQUFBSUFKMklRVU1BUXNMUVd3Z0NVRUJSdzBBR2tGUUlBQWdEVXNOQUJwQmJDQUNRU0JLRFFBYUlBRWdBRUVCYXpZQ0FDQUVJQUpCQjJwQkEzVnFJQU5yQ3lBTVFSQnFKQUFMOGdFQkFYOGdBa1VFUUNBQVFnQTNBZ0FnQUVFQU5nSVFJQUJDQURjQ0NFRzRmdzhMSUFBZ0FUWUNEQ0FBSUFGQkJHbzJBaEFnQWtFRVR3UkFJQUFnQVNBQ2FpSUJRUVJySWdNMkFnZ2dBQ0FES0FBQU5nSUFJQUZCQVdzdEFBQWlBUVJBSUFBZ0FXZEJGMnMyQWdRZ0FnOExJQUJCQURZQ0JFRi9Ed3NnQUNBQk5nSUlJQUFnQVMwQUFDSUROZ0lBQWtBQ1FBSkFJQUpCQW1zT0FnRUFBZ3NnQUNBQkxRQUNRUkIwSUFOeUlnTTJBZ0FMSUFBZ0FTMEFBVUVJZENBRGFqWUNBQXNnQVNBQ2FrRUJheTBBQUNJQlJRUkFJQUJCQURZQ0JFRnNEd3NnQUNBQlp5QUNRUU4wYTBFSmFqWUNCQ0FDQzBRQkFuOGdBU0FDTHdFQUlnTWdBU2dDQkdvaUJEWUNCQ0FBSUFOQkFuUkJvQjFxS0FJQUlBRW9BZ0JCQUNBRWEzWnhOZ0lBSUFFUUR4b2dBQ0FDUVFScU5nSUVDNThCQVFSL1FRTWhBU0FBS0FJRUlnSkJJRTBFUUNBQUtBSUlJZ0VnQUNnQ0VFOEVRQ0FBSUFKQkIzRTJBZ1FnQUNBQklBSkJBM1pySWdJMkFnZ2dBQ0FDS0FBQU5nSUFRUUFQQ3lBQUtBSU1JZ01nQVVZRVFFRUJRUUlnQWtFZ1NSc1BDeUFBSUFFZ0FTQURheUFDUVFOMklnUWdBU0FFYXlBRFNTSUJHeUlEYXlJRU5nSUlJQUFnQWlBRFFRTjBhellDQkNBQUlBUW9BQUEyQWdBTElBRUxTQUVFZnlBQUtBSUVJQUFvQWdCQkFuUnFJZ0l0QUFJZ0FpOEJBQ0VFSUFFZ0FTZ0NCQ0lGSUFJdEFBTWlBbW8yQWdRZ0FDQUVJQUVvQWdBZ0JYUkJBQ0FDYTNacU5nSUFDMUlCQkg4Z0FDZ0NCQ0FBS0FJQVFRSjBhaUlDTFFBQ0lBSXZBUUFoQkNBQklBSXRBQU1pQWlBQktBSUVhaUlGTmdJRUlBQWdCQ0FDUVFKMFFhQWRhaWdDQUNBQktBSUFRUUFnQld0MmNXbzJBZ0FMQ0FBZ0FFR0lmMHNMR2dBZ0FBUkFJQUVFUUNBQ0lBQWdBUkVDQUE4TElBQVFCZ3NMcGdnQ0RYOEJmaU1BUVJCcklna2tBQ0FKUVFBMkFnd2dDVUVBTmdJSUFuOENRQ0FEUWVnSmFpQURJQWxCQ0dvZ0NVRU1haUFCSUFJZ0EwR0FBV29RQ3lJUFFZaC9TdzBBUVZRZ0NTZ0NEQ0lFSUFBb0FnQWlBVUgvQVhGQkFXcExEUUVhSUFCQkJHb2hDeUFBSUFGQi80R0FlSEVnQkVFUWRFR0FnUHdIY1hJMkFnQkJmeUFFSUFSQkFFZ2JRUUZxSVFCQkFDRUJJQWtvQWdnaEJVRUFJUUlEUUNBQUlBSkdCRUFnQlVFRGF5RUJRUUFoQUFOQUFrQkJBQ0VDSUFBZ0FVNEVRQU5BSUFBZ0JVNE5BaUFESUFBZ0EycEI2QWxxTFFBQVFRSjBha0ZBYXlJQklBRW9BZ0FpQVVFQmFqWUNBQ0FCSUFOcUlBQTZBT2dISUFCQkFXb2hBQXdBQ3dBRkEwQWdBa0VFUmtVRVFDQURJQU1nQUNBQ2FpSUhha0hvQ1dvdEFBQkJBblJxUVVCcklnZ2dDQ2dDQUNJSVFRRnFOZ0lBSUFNZ0NHb2dCem9BNkFjZ0FrRUJhaUVDREFFTEN5QUFRUVJxSVFBTUFnc0FDd3NnQkVFQmFpRU9JQU1vQWdBaEIwRUFJUUJCQVNFSUEwQWdDQ0FPUmcwRElBNGdDR3NoQkNBRElBaEJBblJxS0FJQUlRVUNRQUpBQWtBQ1FBSkFBa0JCQVNBSWRFRUJkU0lOUVFGckRnZ0FBUVFDQkFRRUF3UUxRUUFoQWlBRlFRQWdCVUVBU2hzaEJpQUFJUUVEUUNBQ0lBWkdEUVVnQXlBQ0lBZHFhaTBBNkFjaENpQUxJQUZCQVhScUlnd2dCRG9BQVNBTUlBbzZBQUFnQWtFQmFpRUNJQUZCQVdvaEFRd0FDd0FMUVFBaEFpQUZRUUFnQlVFQVNoc2hDaUFBSVFFRFFDQUNJQXBHRFFRZ0N5QUJRUUYwYWlJR0lBTWdBaUFIYW1vdEFPZ0hJZ3c2QUFJZ0JpQUVPZ0FCSUFZZ0REb0FBQ0FHSUFRNkFBTWdBa0VCYWlFQ0lBRkJBbW9oQVF3QUN3QUxRUUFoQWlBRlFRQWdCVUVBU2hzaEJpQUVRUWgwUVlEK0EzRWhCQ0FBSVFFRFFDQUNJQVpHRFFNZ0N5QUJRUUYwYWlBRUlBTWdBaUFIYW1vdEFPZ0hjcTFDZ1lDRWdKQ0F3QUIrTndBQUlBSkJBV29oQWlBQlFRUnFJUUVNQUFzQUMwRUFJUUlnQlVFQUlBVkJBRW9iSVFZZ0JFRUlkRUdBL2dOeElRUWdBQ0VCQTBBZ0FpQUdSZzBDSUFzZ0FVRUJkR29pQ2lBRUlBTWdBaUFIYW1vdEFPZ0hjcTFDZ1lDRWdKQ0F3QUIrSWhFM0FBZ2dDaUFSTndBQUlBSkJBV29oQWlBQlFRaHFJUUVNQUFzQUMwRUFJUUVnQlVFQUlBVkJBRW9iSVFvZ0JFRUlkRUdBL2dOeElRd2dBQ0VFQTBBZ0FTQUtSZzBCSUFzZ0JFRUJkR29oRUNBTUlBTWdBU0FIYW1vdEFPZ0hjcTFDZ1lDRWdKQ0F3QUIrSVJGQkFDRUNBMEFnQWlBTlRrVUVRQ0FRSUFKQkFYUnFJZ1lnRVRjQUdDQUdJQkUzQUJBZ0JpQVJOd0FJSUFZZ0VUY0FBQ0FDUVJCcUlRSU1BUXNMSUFGQkFXb2hBU0FFSUExcUlRUU1BQXNBQ3lBSVFRRnFJUWdnQlNBSGFpRUhJQVVnRFd3Z0FHb2hBQXdBQ3dBRklBTWdBa0VDZEdvaUIwRkFheUFCTmdJQUlBSkJBV29oQWlBSEtBSUFJQUZxSVFFTUFRc0FDd0FMSUE4TElBbEJFR29rQUF2eUFnRUdmeU1BUVNCcklnVWtBQ0FFS0FJQUlRWWdCVUVNYWlBQ0lBTVFEU0lEUVloL1RRUkFJQVJCQkdvaEFpQUFJQUZxSWdsQkEyc2hCRUVBSUFaQkVIWnJRUjl4SVFNRFFDQUZRUXhxRUE4Z0FDQUVUM0pGQkVBZ0FpQUZLQUlNSWdZZ0JTZ0NFQ0lIZENBRGRrRUJkR29pQ0MwQUFTRUtJQUFnQ0MwQUFEb0FBQ0FDSUFZZ0J5QUthaUlHZENBRGRrRUJkR29pQnkwQUFDRUlJQVVnQmlBSExRQUJhallDRUNBQUlBZzZBQUVnQUVFQ2FpRUFEQUVMQ3dOQUlBVkJER29RRHlFSElBVW9BZ3doQmlBRktBSVFJUVFnQUNBSlR5QUhja1VFUUNBQ0lBWWdCSFFnQTNaQkFYUnFJZ1l0QUFBaEJ5QUZJQVFnQmkwQUFXbzJBaEFnQUNBSE9nQUFJQUJCQVdvaEFBd0JDd3NEUUNBQUlBbFBSUVJBSUFJZ0JpQUVkQ0FEZGtFQmRHb2lCeTBBQVNFSUlBQWdCeTBBQURvQUFDQUFRUUZxSVFBZ0JDQUlhaUVFREFFTEMwRnNRV3dnQVNBRktBSVVJQVVvQWhoSEd5QUVRU0JIR3lFREN5QUZRU0JxSkFBZ0F3dlBGQUVqZnlNQVFkQUFheUlGSkFCQmJDRUpBa0FnQTBFS1NRMEFBa0FnQXlBQ0x3QUVJZ2NnQWk4QUFDSUlJQUl2QUFJaURXcHFRUVpxSWd4SkRRQWdCQzhCQWlFR0lBVkJQR29nQWtFR2FpSUNJQWdRRFNJSlFZaC9TdzBCSUFWQktHb2dBaUFJYWlJQ0lBMFFEU0lKUVloL1N3MEJJQVZCRkdvZ0FpQU5haUlDSUFjUURTSUpRWWgvU3cwQklBVWdBaUFIYWlBRElBeHJFQTBpQ1VHSWYwc05BU0FFUVFScUlRb2dBQ0FCYWlJZlFRTnJJU0JCQUNBR2EwRWZjU0VMSUFVb0FnZ2hFU0FGS0FJY0lSSWdCU2dDTUNFVElBVW9Ba1FoRkNBRktBSUVJUWtnQlNnQ0dDRU5JQVVvQWl3aERDQUZLQUpBSVFZZ0JTZ0NFQ0VoSUFVb0FpUWhJaUFGS0FJNElTTWdCU2dDVENFa0lBVW9BZ0FoRlNBRktBSVVJUllnQlNnQ0tDRVhJQVVvQWp3aEdFRUJJUThnQUNBQlFRTnFRUUoySWdScUlnTWdCR29pQWlBRWFpSVpJUVFnQWlFSUlBTWhCd05BSUE5QkFYRkZJQVFnSUU5eVJRUkFJQUFnQ2lBWUlBWjBJQXQyUVFKMGFpSU9Md0VBT3dBQUlBNHRBQUloR2lBT0xRQURJUkFnQnlBS0lCY2dESFFnQzNaQkFuUnFJZzR2QVFBN0FBQWdEaTBBQWlFYklBNHRBQU1oRHlBSUlBb2dGaUFOZENBTGRrRUNkR29pRGk4QkFEc0FBQ0FPTFFBQ0lSd2dEaTBBQXlFZElBUWdDaUFWSUFsMElBdDJRUUowYWlJT0x3RUFPd0FBSUE0dEFBSWhIaUFPTFFBRElRNGdBQ0FRYWlJbElBb2dHQ0FHSUJwcUlnWjBJQXQyUVFKMGFpSVFMd0VBT3dBQUlCQXRBQUlnRUMwQUF5RW1JQWNnRDJvaUp5QUtJQmNnRENBYmFpSWFkQ0FMZGtFQ2RHb2lCeThCQURzQUFDQUhMUUFDSVF3Z0J5MEFBeUVRSUFnZ0hXb2lHeUFLSUJZZ0RTQWNhaUlQZENBTGRrRUNkR29pQ0M4QkFEc0FBQ0FJTFFBQ0lRMGdDQzBBQXlFY0lBUWdEbW9pSFNBS0lCVWdDU0FlYWlJT2RDQUxka0VDZEdvaUNTOEJBRHNBQUNBR2FpRUFRUU1oQndKL0lCUWdKRWtFUUNBQUlRWkJBd3dCQ3lBQVFRZHhJUVlnRkNBQVFRTjJheUlVS0FBQUlSaEJBQXNnQ1MwQUF5RWVJQWt0QUFJaENDQU1JQnBxSVFBZ0V5QWpTUVIvSUFBRklCTWdBRUVEZG1zaUV5Z0FBQ0VYUVFBaEJ5QUFRUWR4Q3lFTUlBMGdEMm9oQUNBSGNpRUpRUU1oRHdKL0lCSWdJa2tFUUNBQUlRMUJBd3dCQ3lBQVFRZHhJUTBnRWlBQVFRTjJheUlTS0FBQUlSWkJBQXNnQ0NBT2FpRUFJQWx5SUJFZ0lVa0VmeUFBQlNBUklBQkJBM1pySWhFb0FBQWhGVUVBSVE4Z0FFRUhjUXNoQ1NBbElDWnFJUUFnRUNBbmFpRUhJQnNnSEdvaENDQWRJQjVxSVFRZ0QzSkZJUThNQVFzTElBVWdERFlDTENBRklBWTJBa0FnQlNBTk5nSVlJQVVnQ1RZQ0JDQUZJQlEyQWtRZ0JTQVROZ0l3SUFVZ0VqWUNIQ0FGSUJFMkFnZ2dCU0FZTmdJOElBVWdGellDS0NBRklCWTJBaFFnQlNBVk5nSUFJQUlnQjBrZ0FDQURTM0lOQUVGc0lRa2dDQ0FaU3cwQklBTkJBMnNoQ1FOQUlBVkJQR29RRDBVZ0FDQUpTWEVFUUNBQUlBb2dCU2dDUENJTklBVW9Ba0FpREhRZ0MzWkJBblJxSWc0dkFRQTdBQUFnQUNBT0xRQURhaUlHSUFvZ0RTQU1JQTR0QUFKcUlnQjBJQXQyUVFKMGFpSU1Md0VBT3dBQUlBVWdBQ0FNTFFBQ2FqWUNRQ0FHSUF3dEFBTnFJUUFNQVFVZ0EwRUNheUVNQTBBZ0JVRThhaEFQSVFZZ0JTZ0NQQ0VOSUFVb0FrQWhDU0FBSUF4TElBWnlSUVJBSUFBZ0NpQU5JQWwwSUF0MlFRSjBhaUlHTHdFQU93QUFJQVVnQ1NBR0xRQUNhallDUUNBQUlBWXRBQU5xSVFBTUFRc0xBMEFnQUNBTVMwVUVRQ0FBSUFvZ0RTQUpkQ0FMZGtFQ2RHb2lCaThCQURzQUFDQUFJQVl0QUFOcUlRQWdDU0FHTFFBQ2FpRUpEQUVMQ3dKQUlBQWdBMDhOQUNBQUlBb2dEU0FKZENBTGRpSUFRUUowYWlJRExRQUFPZ0FBSUFNdEFBTkJBVVlFUUNBSklBTXRBQUpxSVFrTUFRc2dDVUVmU3cwQVFTQWdDU0FLSUFCQkFuUnFMUUFDYWlJQUlBQkJJRThiSVFrTElBSkJBMnNoREFOQUlBVkJLR29RRDBVZ0J5QU1TWEVFUUNBSElBb2dCU2dDS0NJR0lBVW9BaXdpQUhRZ0MzWkJBblJxSWcwdkFRQTdBQUFnQnlBTkxRQURhaUlESUFvZ0JpQUFJQTB0QUFKcUlnQjBJQXQyUVFKMGFpSUdMd0VBT3dBQUlBVWdBQ0FHTFFBQ2FqWUNMQ0FESUFZdEFBTnFJUWNNQVFVZ0FrRUNheUVHQTBBZ0JVRW9haEFQSVFNZ0JTZ0NLQ0VNSUFVb0Fpd2hBQ0FHSUFkSklBTnlSUVJBSUFjZ0NpQU1JQUIwSUF0MlFRSjBhaUlETHdFQU93QUFJQVVnQUNBRExRQUNhallDTENBSElBTXRBQU5xSVFjTUFRc0xBMEFnQmlBSFNVVUVRQ0FISUFvZ0RDQUFkQ0FMZGtFQ2RHb2lBeThCQURzQUFDQUhJQU10QUFOcUlRY2dBQ0FETFFBQ2FpRUFEQUVMQ3dKQUlBSWdCMDBOQUNBSElBb2dEQ0FBZENBTGRpSUNRUUowYWlJRExRQUFPZ0FBSUFNdEFBTkJBVVlFUUNBQUlBTXRBQUpxSVFBTUFRc2dBRUVmU3cwQVFTQWdBQ0FLSUFKQkFuUnFMUUFDYWlJQUlBQkJJRThiSVFBTElCbEJBMnNoREFOQUlBVkJGR29RRDBVZ0NDQU1TWEVFUUNBSUlBb2dCU2dDRkNJR0lBVW9BaGdpQW5RZ0MzWkJBblJxSWcwdkFRQTdBQUFnQ0NBTkxRQURhaUlESUFvZ0JpQUNJQTB0QUFKcUlnSjBJQXQyUVFKMGFpSUdMd0VBT3dBQUlBVWdBaUFHTFFBQ2FqWUNHQ0FESUFZdEFBTnFJUWdNQVFVZ0dVRUNheUVEQTBBZ0JVRVVhaEFQSVFJZ0JTZ0NGQ0VHSUFVb0FoZ2hCeUFESUFoSklBSnlSUVJBSUFnZ0NpQUdJQWQwSUF0MlFRSjBhaUlDTHdFQU93QUFJQVVnQnlBQ0xRQUNhallDR0NBSUlBSXRBQU5xSVFnTUFRc0xBMEFnQXlBSVNVVUVRQ0FJSUFvZ0JpQUhkQ0FMZGtFQ2RHb2lBaThCQURzQUFDQUlJQUl0QUFOcUlRZ2dCeUFDTFFBQ2FpRUhEQUVMQ3dKQUlBZ2dHVThOQUNBSUlBb2dCaUFIZENBTGRpSUNRUUowYWlJRExRQUFPZ0FBSUFNdEFBTkJBVVlFUUNBSElBTXRBQUpxSVFjTUFRc2dCMEVmU3cwQVFTQWdCeUFLSUFKQkFuUnFMUUFDYWlJQ0lBSkJJRThiSVFjTEEwQWdCUkFQUlNBRUlDQkpjUVJBSUFRZ0NpQUZLQUlBSWdZZ0JTZ0NCQ0lDZENBTGRrRUNkR29pREM4QkFEc0FBQ0FFSUF3dEFBTnFJZ01nQ2lBR0lBSWdEQzBBQW1vaUFuUWdDM1pCQW5ScUlnUXZBUUE3QUFBZ0JTQUNJQVF0QUFKcU5nSUVJQU1nQkMwQUEyb2hCQXdCQlNBZlFRSnJJUU1EUUNBRkVBOGhBaUFGS0FJQUlRWWdCU2dDQkNFSUlBTWdCRWtnQW5KRkJFQWdCQ0FLSUFZZ0NIUWdDM1pCQW5ScUlnSXZBUUE3QUFBZ0JTQUlJQUl0QUFKcU5nSUVJQVFnQWkwQUEyb2hCQXdCQ3dzRFFDQURJQVJKUlFSQUlBUWdDaUFHSUFoMElBdDJRUUowYWlJQ0x3RUFPd0FBSUFRZ0FpMEFBMm9oQkNBSUlBSXRBQUpxSVFnTUFRc0xBa0FnQkNBZlR3MEFJQVFnQ2lBR0lBaDBJQXQySWdKQkFuUnFJZ010QUFBNkFBQWdBeTBBQTBFQlJnUkFJQWdnQXkwQUFtb2hDQXdCQ3lBSVFSOUxEUUJCSUNBSUlBb2dBa0VDZEdvdEFBSnFJZ0lnQWtFZ1R4c2hDQXRCYkVGc1FXeEJiRUZzUVd4QmJFRnNJQUVnQ0VFZ1J4c2dCU2dDQ0NBRktBSU1SeHNnQjBFZ1J4c2dCU2dDSENBRktBSWdSeHNnQUVFZ1J4c2dCU2dDTUNBRktBSTBSeHNnQ1VFZ1J4c2dCU2dDUkNBRktBSklSeHNoQ1F3SkN3QUxBQXNBQ3dBTEFBc0FDd0FMQUF0QmJDRUpDeUFGUWRBQWFpUUFJQWtMN0JBQkhuOGpBRUhRQUdzaUJTUUFRV3doQ1FKQUlBTkJDa2tOQUFKQUlBTWdBaThBQkNJR0lBSXZBQUFpQnlBQ0x3QUNJZ2hxYWtFR2FpSU9TUTBBSUFRdkFRSWhEeUFGUVR4cUlBSkJCbW9pQWlBSEVBMGlDVUdJZjBzTkFTQUZRU2hxSUFJZ0Iyb2lBaUFJRUEwaUNVR0lmMHNOQVNBRlFSUnFJQUlnQ0dvaUFpQUdFQTBpQ1VHSWYwc05BU0FGSUFJZ0Jtb2dBeUFPYXhBTklnbEJpSDlMRFFFZ0JFRUVhaUVLSUFBZ0FXb2lIRUVEYXlFZFFRQWdEMnRCSDNFaEN5QUZLQUlJSVJFZ0JTZ0NIQ0VTSUFVb0FqQWhFeUFGS0FKRUlSUWdCU2dDQkNFSklBVW9BaGdoQmlBRktBSXNJUWNnQlNnQ1FDRUlJQVVvQWhBaEhpQUZLQUlrSVI4Z0JTZ0NPQ0VnSUFVb0Frd2hJU0FGS0FJQUlSVWdCU2dDRkNFV0lBVW9BaWdoRnlBRktBSThJUmhCQVNFTklBQWdBVUVEYWtFQ2RpSUNhaUlPSUFKcUlnOGdBbW9pR1NFRUlBOGhBaUFPSVFNRFFDQU5SU0FFSUIxUGNrVUVRQ0FLSUJnZ0NIUWdDM1pCQVhScUlnd3RBQUVoRFNBQUlBd3RBQUE2QUFBZ0NpQVhJQWQwSUF0MlFRRjBhaUlNTFFBQklSQWdBeUFNTFFBQU9nQUFJQW9nRmlBR2RDQUxka0VCZEdvaURDMEFBU0VhSUFJZ0RDMEFBRG9BQUNBS0lCVWdDWFFnQzNaQkFYUnFJZ3d0QUFFaEd5QUVJQXd0QUFBNkFBQWdDaUFZSUFnZ0RXb2lDSFFnQzNaQkFYUnFJZ3d0QUFFaERTQUFJQXd0QUFBNkFBRWdDaUFYSUFjZ0VHb2lCM1FnQzNaQkFYUnFJZ3d0QUFFaEVDQURJQXd0QUFBNkFBRWdDaUFXSUFZZ0dtb2lESFFnQzNaQkFYUnFJZ1l0QUFFaEdpQUNJQVl0QUFBNkFBRWdDaUFWSUFrZ0cyb2lHM1FnQzNaQkFYUnFJZ2t0QUFFaElpQUVJQWt0QUFBNkFBRWdDQ0FOYWlFR1FRTWhDUUovSUJRZ0lVa0VRRUVESVEwZ0Jnd0JDeUFVSUFaQkEzWnJJaFFvQUFBaEdFRUFJUTBnQmtFSGNRc2hDQ0FISUJCcUlRWWdFeUFnU1FSL0lBWUZJQk1nQmtFRGRtc2lFeWdBQUNFWFFRQWhDU0FHUVFkeEN5RUhJQXdnR21vaERDQUpJQTF5SVJCQkF5RU5BbjhnRWlBZlNRUkFJQXdoQmtFRERBRUxJQXhCQjNFaEJpQVNJQXhCQTNackloSW9BQUFoRmtFQUN5QWJJQ0pxSVF3Z0VISWhFQ0FSSUI1SkJIOGdEQVVnRVNBTVFRTjJheUlSS0FBQUlSVkJBQ0VOSUF4QkIzRUxJUWtnQkVFQ2FpRUVJQUpCQW1vaEFpQURRUUpxSVFNZ0FFRUNhaUVBSUEwZ0VISkZJUTBNQVFzTElBVWdCellDTENBRklBZzJBa0FnQlNBR05nSVlJQVVnQ1RZQ0JDQUZJQlEyQWtRZ0JTQVROZ0l3SUFVZ0VqWUNIQ0FGSUJFMkFnZ2dCU0FZTmdJOElBVWdGellDS0NBRklCWTJBaFFnQlNBVk5nSUFJQUFnRGtzZ0F5QVBTM0lOQUVGc0lRa2dBaUFaU3cwQklBNUJBMnNoQ1FOQUlBVkJQR29RRHlBQUlBbFBja1VFUUNBS0lBVW9BandpQmlBRktBSkFJZ2QwSUF0MlFRRjBhaUlJTFFBQklRd2dBQ0FJTFFBQU9nQUFJQW9nQmlBSElBeHFJZ1owSUF0MlFRRjBhaUlITFFBQUlRZ2dCU0FHSUFjdEFBRnFOZ0pBSUFBZ0NEb0FBU0FBUVFKcUlRQU1BUXNMQTBBZ0JVRThhaEFQSVFjZ0JTZ0NQQ0VHSUFVb0FrQWhDU0FBSUE1UElBZHlSUVJBSUFvZ0JpQUpkQ0FMZGtFQmRHb2lCaTBBQUNFSElBVWdDU0FHTFFBQmFqWUNRQ0FBSUFjNkFBQWdBRUVCYWlFQURBRUxDd05BSUFBZ0RrOUZCRUFnQ2lBR0lBbDBJQXQyUVFGMGFpSUhMUUFCSUFBZ0J5MEFBRG9BQUNBQVFRRnFJUUFnQ1dvaENRd0JDd3NnRDBFRGF5RUFBMEFnQlVFb2FoQVBJQUFnQTAxeVJRUkFJQW9nQlNnQ0tDSUdJQVVvQWl3aUIzUWdDM1pCQVhScUlnZ3RBQUVoRGlBRElBZ3RBQUE2QUFBZ0NpQUdJQWNnRG1vaUJuUWdDM1pCQVhScUlnY3RBQUFoQ0NBRklBWWdCeTBBQVdvMkFpd2dBeUFJT2dBQklBTkJBbW9oQXd3QkN3c0RRQ0FGUVNocUVBOGhCeUFGS0FJb0lRWWdCU2dDTENFQUlBTWdEMDhnQjNKRkJFQWdDaUFHSUFCMElBdDJRUUYwYWlJR0xRQUFJUWNnQlNBQUlBWXRBQUZxTmdJc0lBTWdCem9BQUNBRFFRRnFJUU1NQVFzTEEwQWdBeUFQVDBVRVFDQUtJQVlnQUhRZ0MzWkJBWFJxSWdjdEFBRWhDQ0FESUFjdEFBQTZBQUFnQTBFQmFpRURJQUFnQ0dvaEFBd0JDd3NnR1VFRGF5RURBMEFnQlVFVWFoQVBJQUlnQTA5eVJRUkFJQW9nQlNnQ0ZDSUdJQVVvQWhnaUIzUWdDM1pCQVhScUlnZ3RBQUVoRGlBQ0lBZ3RBQUE2QUFBZ0NpQUdJQWNnRG1vaUJuUWdDM1pCQVhScUlnY3RBQUFoQ0NBRklBWWdCeTBBQVdvMkFoZ2dBaUFJT2dBQklBSkJBbW9oQWd3QkN3c0RRQ0FGUVJScUVBOGhCeUFGS0FJVUlRWWdCU2dDR0NFRElBSWdHVThnQjNKRkJFQWdDaUFHSUFOMElBdDJRUUYwYWlJR0xRQUFJUWNnQlNBRElBWXRBQUZxTmdJWUlBSWdCem9BQUNBQ1FRRnFJUUlNQVFzTEEwQWdBaUFaVDBVRVFDQUtJQVlnQTNRZ0MzWkJBWFJxSWdjdEFBRWhDQ0FDSUFjdEFBQTZBQUFnQWtFQmFpRUNJQU1nQ0dvaEF3d0JDd3NEUUNBRkVBOGdCQ0FkVDNKRkJFQWdDaUFGS0FJQUlnSWdCU2dDQkNJR2RDQUxka0VCZEdvaUJ5MEFBU0VJSUFRZ0J5MEFBRG9BQUNBS0lBSWdCaUFJYWlJQ2RDQUxka0VCZEdvaUJpMEFBQ0VISUFVZ0FpQUdMUUFCYWpZQ0JDQUVJQWM2QUFFZ0JFRUNhaUVFREFFTEN3TkFJQVVRRHlFSElBVW9BZ0FoQmlBRktBSUVJUUlnQkNBY1R5QUhja1VFUUNBS0lBWWdBblFnQzNaQkFYUnFJZ1l0QUFBaEJ5QUZJQUlnQmkwQUFXbzJBZ1FnQkNBSE9nQUFJQVJCQVdvaEJBd0JDd3NEUUNBRUlCeFBSUVJBSUFvZ0JpQUNkQ0FMZGtFQmRHb2lCeTBBQVNFSUlBUWdCeTBBQURvQUFDQUVRUUZxSVFRZ0FpQUlhaUVDREFFTEMwRnNRV3hCYkVGc1FXeEJiRUZzUVd3Z0FTQUNRU0JIR3lBRktBSUlJQVVvQWd4SEd5QURRU0JIR3lBRktBSWNJQVVvQWlCSEd5QUFRU0JIR3lBRktBSXdJQVVvQWpSSEd5QUpRU0JIR3lBRktBSkVJQVVvQWtoSEd5RUpEQUVMUVd3aENRc2dCVUhRQUdva0FDQUpDMWdCQTM4Q1FDQUFLQUtRNndFaUFVVU5BQ0FCS0FJQUlBRkJ0TlVCYWlnQ0FDSUNJQUZCdU5VQmFpZ0NBQ0lERUJNZ0FnUkFJQU1nQVNBQ0VRSUFEQUVMSUFFUUJnc2dBRUVBTmdLZzZ3RWdBRUlBTndPUTZ3RUw2UU1DQkg4Q2ZpQUFRUUJCS0JBRElRUWdBa0VCUVFVZ0F4c2lBRWtFUUNBQUR3c2dBVVVFUUVGL0R3dEJBU0VHQWtBQ1FDQURRUUZHRFFBZ0F5RUdJQUVvQUFBaUJVR282cjVwUmcwQVFYWWhBeUFGUVhCeFFkRFV0TUlCUncwQlFRZ2hBeUFDUVFoSkRRRWdBVFVBQkNFSUlBUkJBVFlDRkNBRUlBZzNBd0JCQUE4TElBRWdBaUFHRUJvaUF5QUNTdzBBSUFRZ0F6WUNHRUZ5SVFNZ0FDQUJhaUlGUVFGckxRQUFJZ0pCQ0hFTkFDQUNRU0J4SWdaRkJFQkJjQ0VESUFVdEFBQWlCVUduQVVzTkFTQUZRUWR4clVJQklBVkJBM1pCQ21xdGhpSUlRZ09JZmlBSWZDRUpJQUJCQVdvaEFBc2dBa0VHZGlFRklBSkJBblpCQUNFREFrQUNRQUpBQWtBZ0FrRURjVUVCYXc0REFBRUNBd3NnQUNBQmFpMEFBQ0VESUFCQkFXb2hBQXdDQ3lBQUlBRnFMd0FBSVFNZ0FFRUNhaUVBREFFTElBQWdBV29vQUFBaEF5QUFRUVJxSVFBTFFRRnhJUUlDZmdKQUFrQUNRQUpBSUFWQkFXc09Bd0VDQXdBTFFuOGdCa1VOQXhvZ0FDQUJhakVBQUF3REN5QUFJQUZxTXdBQVFvQUNmQXdDQ3lBQUlBRnFOUUFBREFFTElBQWdBV29wQUFBTElRZ2dCQ0FDTmdJZ0lBUWdBellDSENBRUlBZzNBd0JCQUNFRElBUkJBRFlDRkNBRUlBZ2dDU0FHR3lJSU53TUlJQVJDZ0lBSUlBZ2dDRUtBZ0FoYUd6NENFQXNnQXd0ZkFRRi9RYmgvSVFNZ0FVRUJRUVVnQWhzaUFrOEVmeUFBSUFKcVFRRnJMUUFBSWdCQkEzRkJBblJCb0I1cUtBSUFJQUpxSUFCQkJIWkJESEZCc0I1cUtBSUFhaUFBUVNCeElnRkZhaUFCUVFWMklBQkJ3QUJKY1dvRlFiaC9Dd3NNQUNBQUlBRWdBa0VBRUJrTGx3TUNCWDhDZmlNQVFVQnFJZ1FrQUFKQUEwQWdBVUVGVHdSQUFrQWdBQ2dBQUVGd2NVSFExTFRDQVVZRVFFSitJUWNnQVVFSVNRMEVJQUFvQUFRaUFrRjNTdzBFSUFKQkNHb2lBeUFCU3cwRUlBSkJnWDlKRFFFTUJBc2dCRUVZYWlBQUlBRVFHeUVDUW40Z0JDa0RHRUlBSUFRb0FpeEJBVWNiSUFJYklnZENmVllOQXlBSElBaDhJZ2dnQjFSQ2ZpRUhEUU1DUUFKQUlBRkJDRWtOQUNBQUtBQUFRWEJ4UWREVXRNSUJSdzBBSUFBb0FBUWlBa0YzU3cwRlFiaC9JQUpCQ0dvaUFpQUJJQUpKR3lFRERBRUxJQVJCR0dvZ0FDQUJFQnNpQWtHSWYwc0VRQ0FDSVFNTUFRdEJ1SDhoQXlBQ0RRQWdBU0FFS0FJd0lnSnJJUVVnQUNBQ2FpRUdBMEFnQmlBRklBUkJER29RSFNJRFFZaC9TdzBCSUFOQkEyb2lBaUFGU3dSQVFiaC9JUU1NQWdzZ0JTQUNheUVGSUFJZ0Jtb2hCaUFFS0FJUVJRMEFDeUFFS0FJNEJIOUJ1SDhoQXlBRlFRUkpEUUVnQmtFRWFnVWdCZ3NnQUdzaEF3c2dBMEdJZjBzTkF3c2dBU0FEYXlFQklBQWdBMm9oQUF3QkN3dENmaUFJSUFFYklRY0xJQVJCUUdza0FDQUhDMlFCQVg5QnVIOGhBd0pBSUFGQkEwa05BQ0FBTFFBQ0lRRWdBaUFBTHdBQUlnQkJBWEUyQWdRZ0FpQUFRUUYyUVFOeElnTTJBZ0FnQWlBQUlBRkJFSFJ5UVFOMklnQTJBZ2dDUUFKQUlBTkJBV3NPQXdJQkFBRUxRV3dQQ3lBQUlRTUxJQU1MUkFFQ2Z5QUJJQUlvQWdRaUF5QUJLQUlFYWlJRU5nSUVJQUFnQTBFQ2RFR2dIV29vQWdBZ0FTZ0NBRUVBSUFScmRuRTJBZ0FnQVJBUEdpQUFJQUpCQ0dvMkFnUUx6Z0VCQm45QnVuOGhDZ0pBSUFJb0FnUWlDQ0FDS0FJQUlnbHFJZzBnQVNBQWEwc05BRUZzSVFvZ0NTQUVJQU1vQWdBaUMydExEUUFnQUNBSmFpSUVJQUlvQWdnaURHc2hBaUFBSUFGQklHc2lBQ0FMSUFsQkFCQWdJQU1nQ1NBTGFqWUNBQUpBQWtBZ0JDQUZheUFNVHdSQUlBSWhCUXdCQ3lBTUlBUWdCbXRMRFFJZ0J5QUhJQUlnQldzaUFtb2lBU0FJYWs4RVFDQUVJQUVnQ0JBS0dnd0NDeUFDSUFocUlRZ2dCQ0FCUVFBZ0Ftc1FDaUFDYXlFRUN5QUVJQUFnQlNBSVFRRVFJQXNnRFNFS0N5QUtDOGNFQVFKL0lBQWdBMm9oQmdKQUlBTkJCMHdFUUFOQUlBQWdCazhOQWlBQUlBSXRBQUE2QUFBZ0FFRUJhaUVBSUFKQkFXb2hBZ3dBQ3dBTElBUkJBVVlFUUFKQUlBQWdBbXNpQlVFSFRRUkFJQUFnQWkwQUFEb0FBQ0FBSUFJdEFBRTZBQUVnQUNBQ0xRQUNPZ0FDSUFBZ0FpMEFBem9BQXlBQUlBSWdCVUVDZENJRlFjQWVhaWdDQUdvaUFpZ0FBRFlBQkNBQ0lBVkI0QjVxS0FJQWF5RUNEQUVMSUFBZ0Fpa0FBRGNBQUFzZ0FrRUlhaUVDSUFCQkNHb2hBQXNnQVNBR1R3UkFJQUFnQTJvaEFTQUVRUUZISUFBZ0FtdEJEMHB5UlFSQUEwQWdBQ0FDS1FBQU53QUFJQUpCQ0dvaEFpQUFRUWhxSWdBZ0FVa05BQXdEQ3dBTElBQWdBaWtBQURjQUFDQUFJQUlwQUFnM0FBZ2dBMEVSU1EwQklBQkJFR29oQUFOQUlBQWdBaWtBRURjQUFDQUFJQUlwQUJnM0FBZ2dBQ0FDS1FBZ053QVFJQUFnQWlrQUtEY0FHQ0FDUVNCcUlRSWdBRUVnYWlJQUlBRkpEUUFMREFFTEFrQWdBQ0FCU3dSQUlBQWhBUXdCQ3lBQklBQnJJUVVDUUNBRVFRRkhJQUFnQW10QkQwcHlSUVJBSUFJaEF3TkFJQUFnQXlrQUFEY0FBQ0FEUVFocUlRTWdBRUVJYWlJQUlBRkpEUUFMREFFTElBQWdBaWtBQURjQUFDQUFJQUlwQUFnM0FBZ2dCVUVSU0EwQUlBQkJFR29oQUNBQ0lRTURRQ0FBSUFNcEFCQTNBQUFnQUNBREtRQVlOd0FJSUFBZ0F5a0FJRGNBRUNBQUlBTXBBQ2czQUJnZ0EwRWdhaUVESUFCQklHb2lBQ0FCU1EwQUN3c2dBaUFGYWlFQ0N3TkFJQUVnQms4TkFTQUJJQUl0QUFBNkFBQWdBVUVCYWlFQklBSkJBV29oQWd3QUN3QUxDNjRIQWdWL0FYNGpBRUdBQVdzaUVTUUFJQkVnQXpZQ2ZFRi9JUThDUUFKQUFrQUNRQUpBSUFJT0JBRUFBd0lFQ3lBR1JRUkFRYmgvSVE4TUJBdEJiQ0VQSUFVdEFBQWlBaUFEU3cwRElBZ2dBa0VDZENJQ2FpZ0NBQ0VESUFJZ0Iyb29BZ0FoQWlBQVFRQTZBQXNnQUVJQU53SUFJQUFnQWpZQ0RDQUFJQU02QUFvZ0FFRUFPd0VJSUFFZ0FEWUNBRUVCSVE4TUF3c2dBU0FKTmdJQVFRQWhEd3dDQ3lBS1JRUkFRV3doRHd3Q0MwRUFJUThnQzBVZ0RFRVpTSElOQVVFSUlBUjBRUWhxSVFCQkFDRURBMEFnQUNBRFRRMENJQU5CUUdzaEF3d0FDd0FMUVd3aER5QVJJQkZCL0FCcUlCRkIrQUJxSUFVZ0JoQU1JZ05CaUg5TERRQWdFU2dDZUNJQ0lBUkxEUUFnRVNnQ2ZFRUJhaUVKSUFCQkNHb2hDMEdBZ0FJZ0FuUkJFSFVoQlVFQklSQkJBU0FDZENJUFFRRnJJZ29oRWdOQUlBa2dEa2NFUUFKQUlCRWdEa0VCZENJRWFpOEJBQ0lNUWYvL0EwWUVRQ0FMSUJKQkEzUnFJQTQyQWdRZ0VrRUJheUVTUVFFaERBd0JDeUFRUVFBZ0JTQU13VW9iSVJBTElBUWdEV29nRERzQkFDQU9RUUZxSVE0TUFRc0xJQUFnQWpZQ0JDQUFJQkEyQWdBQ1FDQUtJQkpHQkVBZ0RVSHFBR29oQmtFQUlSQkJBQ0VNQTBBZ0NTQVFSZ1JBSUE5QkEzWWdEMEVCZG1wQkEyb2lCVUVCZENFRVFRQWhERUVBSVJJRFFFRUFJUTRnRHlBU1RRMEVBMEFnRGtFQ1J3UkFJQXNnQlNBT2JDQU1haUFLY1VFRGRHb2dCaUFPSUJKcWFpMEFBRFlDQkNBT1FRRnFJUTRNQVFzTElCSkJBbW9oRWlBRUlBeHFJQXB4SVF3TUFBc0FCU0FSSUJCQkFYUnFMZ0VBSVFVZ0JpQU1haUlFSUJNM0FBQkJDQ0VPQTBBZ0JTQU9TZ1JBSUFRZ0Rtb2dFemNBQUNBT1FRaHFJUTRNQVFzTElCTkNnWUtFaUpDZ3dJQUJmQ0VUSUJCQkFXb2hFQ0FGSUF4cUlRd01BUXNBQ3dBTElBOUJBM1lnRDBFQmRtcEJBMm9oQlVFQUlSQkJBQ0VPQTBBZ0NTQVFSZzBCUVFBaERDQVJJQkJCQVhScUxnRUFJZ1JCQUNBRVFRQktHeUVFQTBBZ0JDQU1Sd1JBSUFzZ0RrRURkR29nRURZQ0JBTkFJQVVnRG1vZ0NuRWlEaUFTU3cwQUN5QU1RUUZxSVF3TUFRc0xJQkJCQVdvaEVBd0FDd0FMSUFKQkFXb2hCVUVBSVF3RFFDQU1JQTlIQkVBZ0RTQUxJQXhCQTNScUlna29BZ1FpQkVFQmRHb2lBaUFDTHdFQUlnWkJBV283QVFBZ0NTQUZJQVpuUVdCemFpSUNPZ0FESUFrZ0JpQUNkQ0FQYXpzQkFDQUpJQWdnQkVFQ2RDSUNhaWdDQURvQUFpQUpJQUlnQjJvb0FnQTJBZ1FnREVFQmFpRU1EQUVMQ3lBQklBQTJBZ0FnQXlFUEN5QVJRWUFCYWlRQUlBOEw3Vm9DTzM4R2ZpTUFRZUFCYXlJRUpBQUNRRUd3N0FrUUJTSUZSUVJBUVVBaEJ3d0JDeUFGUWdBM0F2VHFBU0FGUVFBMkFzVHJBU0FGUVFBMkFyVHJBU0FGUWdBM0FwenJBU0FGUVFBMkFyanBBU0FGUVFBMkFxenNDU0FGUWdBM0F0VHJBU0FGUWdBM0FxenJBU0FGUWdBM0E0anJBU0FGUWdBM0F1VHFBU0FGUWdBM0F1VHJBU0FGUVlHQWdNQUFOZ0s4NndFZ0JVSUFOd0trNndFZ0JVSDg2Z0ZxUVFBMkFnQWdCVUdRNndGcVFnQTNBd0FnQlJBWUlBVkJyTlVCYWlFVUlBVkIrT3NCYWlFY0lBVkJzT29CYWlFaUlBVkJvREJxSVNvZ0JVR1lJR29oS3lBRlFhalFBR29oSGlBRlFSQnFJU3dnQlVFSWFpRW9JQVZCQkdvaExTQUZRY0RwQVdvaEtTQUZRWWpyQVdvZ0JFR1VBV29oTHlBRVFZd0JhaUV3SUFSQmhBRnFJVEVnQkVIY0FHb2hNaUFFUWRRQWFpRXpJQVJCekFCcUlUUWdBQ0VkQWtBQ1FBSkFBa0FDUUFOQVFRRkJCU0FGS0FMazZnRWJJUVlDUUFOQUlBTWdCa2tOQVNBQ0tBQUFRWEJ4UWREVXRNSUJSZ1JBUWJoL0lRY2dBMEVJU1EwSUlBSW9BQVFpRGtGM1N3UkFRWEloQnd3SkN5QURJQTVCQ0dvaUNVa05DQ0FPUVlCL1N3UkFJQWtoQnd3SkN5QURJQWxySVFNZ0FpQUphaUVDREFFTEN5QUZRZ0EzQXF6cEFTQUZRZ0EzQStqcEFTQUZRUUEyQXBqckFTQUZRZ0EzQTREcUFTQUZRZ00zQS9qcEFTQUZRYlRwQVdwQ0FEY0NBQ0FGUWZEcEFXcENBRGNEQUNBRlFhalFBR29pQ1VHTWdJRGdBRFlDQUNBRlFhelFBV3BCNEJJcEFnQTNBZ0FnQlVHMDBBRnFRZWdTS0FJQU5nSUFJQVVnQlVFUWFqWUNBQ0FGSUFWQm9EQnFOZ0lFSUFVZ0JVR1lJR28yQWdnZ0JTQUpOZ0lNSUFWQkFVRUZJQVVvQXVUcUFSczJBcnpwQVFKQUlBRkZEUUFnQlNnQ3JPa0JJZ2tnSFVZTkFDQUZJQWsyQXJqcEFTQUZJQjAyQXF6cEFTQUZLQUt3NlFFaERpQUZJQjAyQXJEcEFTQUZJQjBnRGlBSmEybzJBclRwQVF0QnVIOGhDU0FEUVFWQkNTQUZLQUxrNmdFaUJodEpEUVVnQWtFQlFRVWdCaHNnQmhBYUlnNUJpSDlMQkVBZ0RpRUpEQVVMSUFNZ0RrRURha2tOQlNBcElBSWdEaUFHRUJraUJrR0lmMHNFUUNBR0lRa01CUXNnQmcwRkFrQUNRQ0FGS0FLbzZ3RkJBVWNOQUNBRktBS2s2d0VpQ1VVTkFDQUZLQUtVNndGRkRRQWdDU2dDQkVFQmF5SUhJQVVvQXR6cEFTSUtyVUtIbGErdm1MYmVtNTUvZmtMSno5bXk4ZVc2NmllRlFoZUpRcy9XMDc3U3g2dlpRbjVDK2ZQZDhabjJtYXNXZkNJL1FpR0lJRCtGUXMvVzA3N1N4NnZaUW40aVAwSWRpQ0EvaFVMNTg5M3htZmFacXhaK0lqOUNJSWdnUDRXbmNTRUdJQWtvQWdBaEZRTkFRUUFoQ0FKQUlCVWdCa0VDZEdvb0FnQWlDVVVOQUNBSktBSUlRUWhKRFFBZ0NTZ0NCQ0lTS0FBQVFiZkl3dUYrUncwQUlCSW9BQVFoQ0FzZ0NDQUtSd1JBSUFZZ0IzRkJBV29oQmlBSURRRUxDeUFKUlEwQUlBVVFHQ0FGUVg4MkFxRHJBU0FGSUFrMkFwVHJBU0FGSUFVb0F0enBBU0lJTmdLWTZ3RU1BUXNnQlNnQzNPa0JJUWdMQWtBZ0NFVU5BQ0FGS0FLWTZ3RWdDRVlOQUVGZ0lRa01CZ3NDUUNBRktBTGc2UUVFUUNBRklBVW9BdWpxQVNJSlJUWUM3T29CSUFrTkFTQUZRdm5xME5EbnlhSGs0UUEzQTZqcUFTQUZRZ0EzQTZEcUFTQUZRcy9XMDc3U3g2dlpRamNEbU9vQklBVkMxdXVDN3VyOWlmWGdBRGNEa09vQklBVkNBRGNEaU9vQklDSkJBRUVvRUFNYURBRUxJQVZCQURZQzdPb0JDeUFCSUIxcUlTVWdCU0FGS1FQbzZRRWdEcTE4TndQbzZRRWdBeUFPYXlFRElBSWdEbW9oQWlBZElRNERRQ0FDSUFNZ0JFRXNhaEFkSWhWQmlIOUxCRUFnRlNFSkRBWUxJQU5CQTJzaU5TQVZTUTBFSUFKQkEyb2hHMEZzSVFrQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FFS0FJc0RnTUNBUUFWQ3lBVlFmLy9CMHNORXlBVlFRTkpEUklnQlNrRHlPa0JJVDhDUUFKQUlCc3RBQUFpQ1VFRGNTSWFRUUZyRGdNR0FRQUhDeUFGS0FLQTZnRU5BRUZpSVFrTUZRc2dGVUVGU1EwU0lCc29BQUFoQXdKL0FrQUNRQUpBSUFsQkFuWkJBM0VpQ1VFQ2F3NENBUUlBQ3lBSlFRQkhJUWNnQTBFRWRrSC9CM0VoQzBFRElRWWdBMEVPZGtIL0IzRU1BZ3RCQkNFR0lBTkJCSFpCLy84QWNTRUxRUUVoQnlBRFFSSjJEQUVMSUFOQkJIWkIvLzhQY1NJTFFZQ0FDRXNORTBFQklRZEJCU0VHSUFJdEFBZEJDblFnQTBFV2RuSUxJZ2dnQm1vaUNTQVZTdzBTQWtBZ0MwR0JCa2tOQUNBRktBS2M2d0ZGRFFCQkFDRURBMEFnQTBHRGdBRkxEUUVnQTBGQWF5RUREQUFMQUFzZ0JpQWJhaUVQSUJwQkEwY05CaUFGS0FJTUlnSXRBQUZCQ0hRaEF5QUhEUWNnQTBVTkNDQUVRZkFBYWlBUElBZ1FEU0lEUVloL1N3MEpJQUpCQkdvaEJpQUxJQnhxSWhKQkEyc2hDa0VBSUFJdkFRSnJRUjl4SVFjZ0hDRURBMEFnQkVId0FHb1FEMFVnQXlBS1NYRUVRQ0FESUFZZ0JDZ0NjQ0lJSUFRb0FuUWlEM1FnQjNaQkFuUnFJZ0l2QVFBN0FBQWdBeUFDTFFBRGFpSURJQVlnQ0NBUElBSXRBQUpxSWdoMElBZDJRUUowYWlJQ0x3RUFPd0FBSUFRZ0NDQUNMUUFDYWpZQ2RDQURJQUl0QUFOcUlRTU1BUVVnRWtFQ2F5RUlBMEFnQkVId0FHb1FEeUVQSUFRb0FuQWhDaUFFS0FKMElRSWdBeUFJU3lBUGNrVUVRQ0FESUFZZ0NpQUNkQ0FIZGtFQ2RHb2lDaThCQURzQUFDQUVJQUlnQ2kwQUFtbzJBblFnQXlBS0xRQURhaUVEREFFTEN3TkFJQU1nQ0UwRVFDQURJQVlnQ2lBQ2RDQUhka0VDZEdvaUR5OEJBRHNBQUNBRElBOHRBQU5xSVFNZ0FpQVBMUUFDYWlFQ0RBRUxDd0pBSUFNZ0VrOE5BQ0FESUFZZ0NpQUNkQ0FIZGtFQ2RHb2lBeTBBQURvQUFDQURMUUFEUVFGR0JFQWdBaUFETFFBQ2FpRUNEQUVMSUFKQkgwc05BRUVnSUFJZ0F5MEFBbW9pQWlBQ1FTQlBHeUVDQzBGc1FXd2dDeUFFS0FKNElBUW9BbnhIR3lBQ1FTQkhHeUVEREFzTEFBc0FDeUFFS0FJMElnSWdKU0FPYTBzTkNpQU9SUVJBUVFBaENTQUNEUUlNRGdzZ0RpQWJMUUFBSUFJUUF4b2dBaUVKREF3TElCVWdKU0FPYTBzTkNTQU9EUUZCQUNFSklCVkZEUXdMUWJaL0lRa01FUXNnRGlBYklCVVFBaG9nRlNFSkRBb0xJQndnR3dKL0FrQUNRQUpBSUFsQkFuWkJBM0ZCQVdzT0F3RUFBZ0FMSUFsQkEzWWhBMEVCREFJTElCc3ZBQUJCQkhZaEEwRUNEQUVMSUJWQkJFa05EaUFDTHdBRElBSXRBQVZCRUhSeUlnSkJqNENBQVVzTkRpQUNRUVIySVFOQkF3c2lBbW90QUFBZ0EwRWdhaEFESVFrZ0JTQUROZ0tBNndFZ0JTQUpOZ0x3NmdFZ0FrRUJhaUVKREFVTElCVUNmd0pBQWtBQ1FDQUpRUUoyUVFOeFFRRnJEZ01CQUFJQUN5QUpRUU4ySVFOQkFRd0NDeUFiTHdBQVFRUjJJUU5CQWd3QkN5QUNMd0FESUFJdEFBVkJFSFJ5UVFSMklRTkJBd3NpQWlBRGFpSUpRU0JxU1FSQUlBa2dGVXNORFNBY0lBSWdHMm9nQXhBQ0lRSWdCU0FETmdLQTZ3RWdCU0FDTmdMdzZnRWdBaUFEYWlJQ1FnQTNBQmdnQWtJQU53QVFJQUpDQURjQUNDQUNRZ0EzQUFBTUJRc2dCU0FETmdLQTZ3RWdCU0FDSUJ0cU5nTHc2Z0VNQkFzZ0IwVUVRQ0FlSUE4Z0NDQVVFQlFpQWtHSWYwc2dBaUFJVDNJTkRDQWNJQXNnQWlBUGFpQUlJQUpySUI0UUZTRUREQU1MSUF0RklBaEZjZzBMSUF0QkNIWWlBeUFJSUF0SkJIOGdDRUVFZENBTGJnVkJEd3RCR0d3aUFrR01DR29vQWdCc0lBSkJpQWhxS0FJQWFpSUdRUU4ySUFacUlBSkJnQWhxS0FJQUlBSkJoQWhxS0FJQUlBTnNha2tFUUNNQVFSQnJJaEFrQUNBZUtBSUFJUU1nRkVId0JHcEJBRUhzQUJBRElRWkJWQ0VDQWtBZ0EwSC9BWEVpREVFTVN3MEFBa0FnRkVIY0NXb2dCaUFRUVFocUlCQkJER29nRHlBSUlCUkIzQXRxSWhjUUN5SVNRWWgvU3cwQUlCQW9BZ3dpQmlBTVN3MEJJQlJCcUFWcUlRMGdGRUdrQldvaE5pQWVRUVJxSVJFZ0EwR0FnSUI0Y1NFM0lBWkJBV29pRXlFQ0lBWWhBd05BSUFJaUIwRUJheUVDSUFNaUNrRUJheUVESUJRZ0NrRUNkR29vQXZBRVJRMEFDMEVCSUFjZ0IwRUJUUnNoRmtFQUlRZEJBU0VDQTBBZ0FpQVdSd1JBSUJRZ0FrRUNkQ0lEYWlnQzhBUWhHQ0FESUExcUlBYzJBZ0FnQWtFQmFpRUNJQWNnR0dvaEJ3d0JDd3NnRFNBSE5nSUFRUUFoQWlBUUtBSUlJUU1EUUNBQ0lBTkhCRUFnRFNBQ0lCUnFRZHdKYWkwQUFDSVlRUUowYWlJWklCa29BZ0FpR1VFQmFqWUNBQ0FVSUJsQkFYUnFJaGtnR0RvQTNRVWdHU0FDT2dEY0JTQUNRUUZxSVFJTUFRc0xRUUFoQXlBTlFRQTJBZ0FnRENBR1FYOXphaUVHUVFFaEFnTkFJQUlnRmtjRVFDQVVJQUpCQW5ScUlnMGdBellDQUNBTktBTHdCQ0FDSUFacWRDQURhaUVESUFKQkFXb2hBZ3dCQ3dzZ0RDQVRJQXBySWdaclFRRnFJUW9nQmlFREEwQWdBeUFLU1FSQUlCUWdBMEUwYkdvaERVRUJJUUlEUUNBQ0lCWkhCRUFnRFNBQ1FRSjBJaGhxSUJRZ0dHb29BZ0FnQTNZMkFnQWdBa0VCYWlFQ0RBRUxDeUFEUVFGcUlRTU1BUXNMSUJjZ0ZFRTBFQUloT0NBVVFaQU1haUU1SUJNZ0RHc2hPaUFVUWR3RmFpRVhRUUFoQ2dOQUFrQUNRQ0FISUFwSEJFQkJBU0FNSUJNZ0Z5QUtRUUYwYWlJQ0xRQUJJZzFySWdOckloaDBJUmtnQWkwQUFDRVdJRGdnRFVFQ2RHb2lIeWdDQUNFQ0lBWWdHRTBFUUNBMlFRRWdBeUE2YWlJTklBMUJBVXdiSWlCQkFuUWlKR29vQWdBaERTQTVJQlFnQTBFMGJHcEJOQkFDSVNFZ0RVRUJkQ0VtSUJFZ0FrRUNkR29oSXlBZ1FRRk5EUUlnQTBFUWRFR0FnUHdIY1NBV2NrR0FnSUFJY2lFZ0lDRWdKR29vQWdBaEpFRUFJUUlEUUNBQ0lDUkdEUU1nSXlBQ1FRSjBhaUFnTmdFQUlBSkJBV29oQWd3QUN3QUxJQUlnQWlBWmFpSU5JQUlnRFVzYklRMGdBMEVRZEVHQWdQd0hjU0FXY2tHQWdJQUljaUVEQTBBZ0FpQU5SZzBESUJFZ0FrRUNkR29nQXpZQkFDQUNRUUZxSVFJTUFBc0FDeUFlSUF4QkVIUWdOM0lnREhKQmdBSnlOZ0lBREFNTElBY2dEV3NoSkNBWElDWnFJU1pCQUNFTkEwQWdEU0FrUmcwQlFRRWdHQ0FUSUNZZ0RVRUJkR29pSnkwQUFTSUNheUk3YTNRaVBDQWhJQUpCQW5ScUlpQW9BZ0FpQW1vaFBTQURJRHRxUVJCMFFZQ0EvQWR4SUNjdEFBQkJDSFJ5SUJaeVFZQ0FnQkJ5SVNjRFFDQWpJQUpCQW5ScUlDYzJBUUFnQWtFQmFpSUNJRDFKRFFBTElDQWdJQ2dDQUNBOGFqWUNBQ0FOUVFGcUlRME1BQXNBQ3lBZklCOG9BZ0FnR1dvMkFnQWdDa0VCYWlFS0RBQUxBQXNnRWlFQ0N5QVFRUkJxSkFBZ0FrR0lmMHNnQWlBSVQzSU5EQ0FjSUFzZ0FpQVBhaUFJSUFKcklCNFFGaUVEREFNTElCNGdEeUFJSUJRUUZDSUNRWWgvU3lBQ0lBaFBjZzBMSUJ3Z0N5QUNJQTlxSUFnZ0Ftc2dIaEFYSVFNTUFnc2dBd1JBSUJ3Z0N5QVBJQWdnQWhBV0lRTU1BZ3NnSENBTElBOGdDQ0FDRUJjaEF3d0JDeUFjSUFzZ0R5QUlJQUlRRlNFREN5QURRWWgvU3cwSUlBVWdDellDZ09zQklBVWdIRFlDOE9vQklBVkJBVFlDZ09vQklCcEJBa1lFUUNBRklCNDJBZ3dMSUFzZ0hHb2lBa0lBTndBQUlBSkNBRGNBR0NBQ1FnQTNBQkFnQWtJQU53QUlJQWxCaUg5TERRb0xJQWtnRlVZTkNDQVZJQWxySVFZZ0JTZ0NuT3NCSVFvQ1FDQUpJQnRxSWdNdEFBQWlEMFVFUUVFQklRSkJBQ0VQUWJoL0lRa2dCa0VCUmcwQkRBc0xBbjhnQTBFQmFpQVB3Q0lDUVFCT0RRQWFJQUpCZjBZRVFDQUdRUU5JRFFzZ0F5OEFBVUdBL2dGcUlROGdBMEVEYWd3QkN5QUdRUUpJRFFvZ0F5MEFBU0FQUVFoMGNrR0FnQUpySVE4Z0EwRUNhZ3NoRWtHNGZ5RUpJQkpCQVdvaUFpQVZJQnRxSWdkTERRb2dMQ0FGSUJJdEFBQWlFa0VHZGtFalFRa2dBaUFISUFKclFjQVFRZEFSUWZBU0lBVW9Bb1RxQVNBS0lBOGdGQkFoSWdsQmlIOUxEUWdnS3lBb0lCSkJCSFpCQTNGQkgwRUlJQUlnQ1dvaUFpQUhJQUpyUVlBTFFZQU1RWUFYSUFVb0FvVHFBU0FGS0FLYzZ3RWdEeUFVRUNFaUNFR0lmMHNOQ0VGc0lRa2dLaUF0SUJKQkFuWkJBM0ZCTkVFSklBSWdDR29pQWlBSElBSnJRWUFOUWVBT1FaQVpJQVVvQW9UcUFTQUZLQUtjNndFZ0R5QVVFQ0VpQjBHSWYwc05DaUFDSUFkcUlBTnJJZ0loQ1NBQ1FZaC9TdzBLQ3lBT0lBOUJBRXh5RFFFTFFicC9JUWtNQ0FzZ0pTQU9heUVKSUFZZ0Ftc2hCaUFDSUFOcUlRY0NRQUpBQWtBZ0NrVUVRQ0FQUVFsSUlBVXBBOGpwQVVLQmdJQUlWSElOQWlBb0tBSUFJZ0pCQ0dvaEVpQUNLQUlFSVFwQkFDRURRUUFoQWdOQUlBTWdDblpGQkVBZ0FpQVNJQU5CQTNScUxRQUNRUlpMYWlFQ0lBTkJBV29oQXd3QkN3c2dCVUVBTmdLYzZ3RWdBa0VJSUFwcmRFRVVUdzBCREFNTElBVkJBRFlDbk9zQkN5QUVJQVVvQXZEcUFTSUROZ0xjQVNBSklBNXFJUllnQXlBRktBS0E2d0ZxSVJjQ1FDQVBSUVJBSUE0aEJ3d0JDeUFGS0FLNDZRRWhHaUFGS0FLMDZRRWhHQ0FGS0FLdzZRRWhFaUFGUVFFMkFvVHFBVUVBSVFNRFFDQURRUU5IQkVBZ0JDQURRUUowSWdKcUlBSWdCV3BCck5BQmFpZ0NBRFlDWkNBRFFRRnFJUU1NQVFzTFFXd2hDU0FFUVRocUlnSWdCeUFHRUExQmlIOUxEUU5CQ0NBUElBOUJDRTRiSVI4Z05DQUNJQVVvQWdBUUhpQXpJQUlnQlNnQ0NCQWVJRElnQWlBRktBSUVFQjRnRGlBU2F5RVpRUUFoQ0FOQUlBUkJPR29RRDBFRFJpQUlJQjlPY2tVRVFDQUVLQUpRSUFRb0FreEJBM1JxS1FJQUlrQ25JZ2RCRUhZaUVVSC9BWEVoQ3lBRUtBSmdJQVFvQWx4QkEzUnFLUUlBSWtHbklneEJFSFlpSVVIL0FYRWhFQ0FFS0FKWUlBUW9BbFJCQTNScUtRSUFJa0pDSUlpbklRWWdRVUlnaUNCQVFpQ0lweUVEQWtBZ1FrSVFpS2NpQ2tIL0FYRWlBa0VDVHdSQUFrQWdBa0VaU1NBL1FvR0FnQkJVY2tVRVFDQUVRU0FnQkNnQ1BDSUtheUlOSUFJZ0FpQU5TeHNpRXlBS2FqWUNQQ0FHSUFRb0FqZ2dDblJCQUNBVGEzWWdBaUFUYXlJVGRHb2hDaUFFUVRocUVBOGFJQUlnRFUwTkFTQUVJQVFvQWp3aUFpQVRhallDUENBRUtBSTRJQUowUVFBZ0UydDJJQXBxSVFvTUFRc2dCQ0FDSUFRb0Fqd2lEV28yQWp3Z0JDZ0NPQ0FOZEVFQUlBcHJkaUFHYWlFS0lBUkJPR29RRHhvTElBUXBBbVFoUkNBRUlBbzJBbVFnQkNCRU53Sm9EQUVMQWtBZ0FrVUVRQ0FEQkVBZ0JDZ0NaQ0VLREFNTElBUW9BbWdoQ2d3QkN5QUVJQVFvQWp3aUFrRUJhallDUEFKL0lBWWdBMFZxSUFRb0FqZ2dBblJCSDNacUlnSkJBMFlFUUNBRUtBSmtRUUZyREFFTElBSkJBblFnQkdvb0FtUUxJZ1pGSUFacUlRb2dBa0VCUndSQUlBUWdCQ2dDYURZQ2JBc0xJQVFnQkNnQ1pEWUNhQ0FFSUFvMkFtUUxweUVDSUVGQ2dJRDhCNE5RUlFSQUlBUWdCQ2dDUENJR0lCQnFOZ0k4SUFRb0FqZ2dCblJCQUNBaGEzWWdBbW9oQWdzZ0N5QVFha0VVVHdSQUlBUkJPR29RRHhvTElFQkNnSUQ4QjROUVJRUkFJQVFnQkNnQ1BDSUdJQXRxTmdJOElBUW9BamdnQm5SQkFDQVJhM1lnQTJvaEF3c2dCRUU0YWhBUEdpQUVJQVFvQWpnaUJrRUFJQWRCR0hZaUN5QUVLQUk4YWlJUWEzWWdDMEVDZEVHZ0hXb29BZ0J4SUFkQi8vOERjV28yQWt3Z0JDQVFJQXhCR0hZaUIyb2lDellDUENBRUlBZEJBblJCb0IxcUtBSUFJQVpCQUNBTGEzWnhJQXhCLy84RGNXbzJBbHdnQkVFNGFoQVBHaUFFSUVLbklnWkJHSFlpQnlBRUtBSThhaUlMTmdJOElBUWdCMEVDZEVHZ0hXb29BZ0FnQkNnQ09FRUFJQXRyZG5FZ0JrSC8vd054YWpZQ1ZDQUVRZkFBYWlBSVFReHNhaUlHSUFvMkFnZ2dCaUFDTmdJRUlBWWdBellDQUNBSVFRRnFJUWdnQXlBWmFpQUNhaUVaREFFTEN5QUlJQjlJRFFNZ0ZrRWdheUVoSUE0aEJ3TkFJQVJCT0dvUUQwRURSaUFJSUE5T2NrVUVRQ0FFS0FKUUlBUW9Ba3hCQTNScUtRSUFJa0NuSWdaQkVIWWlJMEgvQVhFaENpQUVLQUpnSUFRb0FseEJBM1JxS1FJQUlrR25JZzFCRUhZaUlFSC9BWEVoRXlBRUtBSllJQVFvQWxSQkEzUnFLUUlBSWtKQ0lJaW5JUU1nUVVJZ2lDQkFRaUNJcHlFTEFrQWdRa0lRaUtjaURFSC9BWEVpQWtFQ1R3UkFBa0FnQWtFWlNTQS9Rb0dBZ0JCVWNrVUVRQ0FFUVNBZ0JDZ0NQQ0lNYXlJUklBSWdBaUFSU3hzaUVDQU1hallDUENBRElBUW9BamdnREhSQkFDQVFhM1lnQWlBUWF5SU1kR29oRUNBRVFUaHFFQThhSUFJZ0VVME5BU0FFSUFRb0Fqd2lBaUFNYWpZQ1BDQUVLQUk0SUFKMFFRQWdER3QySUJCcUlSQU1BUXNnQkNBQ0lBUW9BandpRUdvMkFqd2dCQ2dDT0NBUWRFRUFJQXhyZGlBRGFpRVFJQVJCT0dvUUR4b0xJQVFwQW1RaFJDQUVJQkEyQW1RZ0JDQkVOd0pvREFFTEFrQWdBa1VFUUNBTEJFQWdCQ2dDWkNFUURBTUxJQVFvQW1naEVBd0JDeUFFSUFRb0Fqd2lBa0VCYWpZQ1BBSi9JQU1nQzBWcUlBUW9BamdnQW5SQkgzWnFJZ0pCQTBZRVFDQUVLQUprUVFGckRBRUxJQUpCQW5RZ0JHb29BbVFMSWdORklBTnFJUkFnQWtFQlJ3UkFJQVFnQkNnQ2FEWUNiQXNMSUFRZ0JDZ0NaRFlDYUNBRUlCQTJBbVFMcHlFTUlFRkNnSUQ4QjROUVJRUkFJQVFnQkNnQ1BDSUNJQk5xTmdJOElBUW9BamdnQW5SQkFDQWdhM1lnREdvaERBc2dDaUFUYWtFVVR3UkFJQVJCT0dvUUR4b0xJRUJDZ0lEOEI0TlFSUVJBSUFRZ0JDZ0NQQ0lDSUFwcU5nSThJQVFvQWpnZ0FuUkJBQ0FqYTNZZ0Myb2hDd3NnQkVFNGFoQVBHaUFFSUFRb0FqZ2lBa0VBSUFaQkdIWWlBeUFFS0FJOGFpSUthM1lnQTBFQ2RFR2dIV29vQWdCeElBWkIvLzhEY1dvMkFrd2dCQ0FLSUExQkdIWWlBMm9pQmpZQ1BDQUVJQU5CQW5SQm9CMXFLQUlBSUFKQkFDQUdhM1p4SUExQi8vOERjV28yQWx3Z0JFRTRhaEFQR2lBRUlFS25JZ0pCR0hZaUF5QUVLQUk4YWlJR05nSThJQVFnQTBFQ2RFR2dIV29vQWdBZ0JDZ0NPRUVBSUFacmRuRWdBa0gvL3dOeGFqWUNWQUpBQWtBQ1FDQUVLQUxjQVNJRElBUkI4QUJxSUFoQkIzRkJER3hxSWhNb0FnQWlFV29pSXlBWFN3MEFJQWNnRXlnQ0JDSU5JQkZxSWdwcUlDRkxEUUFnQ2tFZ2FpQVdJQWRyVFEwQkN5QUVJQk1vQWdnMkFoZ2dCQ0FUS1FJQU53TVFJQWNnRmlBRVFSQnFJQVJCM0FGcUlCY2dFaUFZSUJvUUh5RUtEQUVMSUFjZ0VXb2hBaUFUS0FJSUlRWWdCeUFES1FBQU53QUFJQWNnQXlrQUNEY0FDQUpBSUJGQkVVa05BQ0FISUFNcEFCQTNBQkFnQnlBREtRQVlOd0FZSUJGQkVHdEJFVWdOQUNBRFFSQnFJUU1nQjBFZ2FpRVJBMEFnRVNBREtRQVFOd0FBSUJFZ0F5a0FHRGNBQ0NBUklBTXBBQ0EzQUJBZ0VTQURLUUFvTndBWUlBTkJJR29oQXlBUlFTQnFJaEVnQWtrTkFBc0xJQUlnQm1zaEF5QUVJQ00yQXR3QklBSWdFbXNnQmtrRVFDQUdJQUlnR0d0TERRY2dHaUFhSUFNZ0Vtc2lBMm9pRVNBTmFrOEVRQ0FDSUJFZ0RSQUtHZ3dDQ3lBRElBMXFJUTBnQWlBUlFRQWdBMnNRQ2lBRGF5RUNJQkloQXdzZ0JrRVFUd1JBSUFJZ0F5a0FBRGNBQUNBQ0lBTXBBQWczQUFnZ0RVRVJTQTBCSUFJZ0RXb2hCaUFDUVJCcUlRSURRQ0FDSUFNcEFCQTNBQUFnQWlBREtRQVlOd0FJSUFJZ0F5a0FJRGNBRUNBQ0lBTXBBQ2czQUJnZ0EwRWdhaUVESUFKQklHb2lBaUFHU1EwQUN3d0JDd0pBSUFaQkIwMEVRQ0FDSUFNdEFBQTZBQUFnQWlBRExRQUJPZ0FCSUFJZ0F5MEFBam9BQWlBQ0lBTXRBQU02QUFNZ0FpQURJQVpCQW5RaUJrSEFIbW9vQWdCcUlnTW9BQUEyQUFRZ0F5QUdRZUFlYWlnQ0FHc2hBd3dCQ3lBQ0lBTXBBQUEzQUFBTElBMUJDVWtOQUNBQ0lBMXFJUkVnQWtFSWFpSUdJQU5CQ0dvaUEydEJEMHdFUUFOQUlBWWdBeWtBQURjQUFDQURRUWhxSVFNZ0JrRUlhaUlHSUJGSkRRQU1BZ3NBQ3lBR0lBTXBBQUEzQUFBZ0JpQURLUUFJTndBSUlBMUJHVWdOQUNBQ1FSaHFJUUlEUUNBQ0lBTXBBQkEzQUFBZ0FpQURLUUFZTndBSUlBSWdBeWtBSURjQUVDQUNJQU1wQUNnM0FCZ2dBMEVnYWlFRElBSkJJR29pQWlBUlNRMEFDd3NnQ2tHSWYwc0VRQ0FLSVFrTUJnVWdFeUFRTmdJSUlCTWdERFlDQkNBVElBczJBZ0FnQ0VFQmFpRUlJQWNnQ21vaEJ5QUxJQmxxSUF4cUlSa01BZ3NBQ3dzZ0NDQVBTQTBESUFnZ0gyc2hCZ05BQWtBZ0JpQVBUZ1JBUVFBaEF3TkFJQU5CQTBZTkFpQUZJQU5CQW5RaUFtcEJyTkFCYWlBQ0lBUnFLQUprTmdJQUlBTkJBV29oQXd3QUN3QUxBa0FDUUFKQUlBUW9BdHdCSWdNZ0JFSHdBR29nQmtFSGNVRU1iR29pQ0NnQ0FDSU1haUlRSUJkTERRQWdCeUFJS0FJRUlnc2dER29pQ21vZ0lVc05BQ0FLUVNCcUlCWWdCMnRORFFFTElBUWdDQ2dDQ0RZQ0tDQUVJQWdwQWdBM0F5QWdCeUFXSUFSQklHb2dCRUhjQVdvZ0Z5QVNJQmdnR2hBZklRb01BUXNnQnlBTWFpRUNJQWdvQWdnaENDQUhJQU1wQUFBM0FBQWdCeUFES1FBSU53QUlBa0FnREVFUlNRMEFJQWNnQXlrQUVEY0FFQ0FISUFNcEFCZzNBQmdnREVFUWEwRVJTQTBBSUFOQkVHb2hBeUFIUVNCcUlRd0RRQ0FNSUFNcEFCQTNBQUFnRENBREtRQVlOd0FJSUF3Z0F5a0FJRGNBRUNBTUlBTXBBQ2czQUJnZ0EwRWdhaUVESUF4QklHb2lEQ0FDU1EwQUN3c2dBaUFJYXlFRElBUWdFRFlDM0FFZ0FpQVNheUFJU1FSQUlBZ2dBaUFZYTBzTkJ5QWFJQm9nQXlBU2F5SURhaUlNSUF0cVR3UkFJQUlnRENBTEVBb2FEQUlMSUFNZ0Myb2hDeUFDSUF4QkFDQURheEFLSUFOcklRSWdFaUVEQ3lBSVFSQlBCRUFnQWlBREtRQUFOd0FBSUFJZ0F5a0FDRGNBQ0NBTFFSRklEUUVnQWlBTGFpRUlJQUpCRUdvaEFnTkFJQUlnQXlrQUVEY0FBQ0FDSUFNcEFCZzNBQWdnQWlBREtRQWdOd0FRSUFJZ0F5a0FLRGNBR0NBRFFTQnFJUU1nQWtFZ2FpSUNJQWhKRFFBTERBRUxBa0FnQ0VFSFRRUkFJQUlnQXkwQUFEb0FBQ0FDSUFNdEFBRTZBQUVnQWlBRExRQUNPZ0FDSUFJZ0F5MEFBem9BQXlBQ0lBTWdDRUVDZENJSVFjQWVhaWdDQUdvaUF5Z0FBRFlBQkNBRElBaEI0QjVxS0FJQWF5RUREQUVMSUFJZ0F5a0FBRGNBQUFzZ0MwRUpTUTBBSUFJZ0Myb2hEQ0FDUVFocUlnZ2dBMEVJYWlJRGEwRVBUQVJBQTBBZ0NDQURLUUFBTndBQUlBTkJDR29oQXlBSVFRaHFJZ2dnREVrTkFBd0NDd0FMSUFnZ0F5a0FBRGNBQUNBSUlBTXBBQWczQUFnZ0MwRVpTQTBBSUFKQkdHb2hBZ05BSUFJZ0F5a0FFRGNBQUNBQ0lBTXBBQmczQUFnZ0FpQURLUUFnTndBUUlBSWdBeWtBS0RjQUdDQURRU0JxSVFNZ0FrRWdhaUlDSUF4SkRRQUxDeUFLUVloL1N3UkFJQW9oQ1F3R0JTQUdRUUZxSVFZZ0J5QUthaUVIREFJTEFBc0xJQVFvQXR3QklRTUxRYnAvSVFrZ0Z5QURheUlDSUJZZ0IydExEUUlnQndSL0lBY2dBeUFDRUFJZ0Ftb0ZRUUFMSUE1cklRa01BZ3NnQlVFQU5nS2M2d0VMSUFRZ0JTZ0M4T29CSWdNMkF0d0JJQWtnRG1vaERDQURJQVVvQW9EckFXb2hFQUpBSUE5RkJFQWdEaUVHREFFTElBVW9BcmpwQVNFTklBVW9BclRwQVNFVElBVW9BckRwQVNFU0lBVkJBVFlDaE9vQlFRQWhBd05BSUFOQkEwY0VRQ0FFSUFOQkFuUWlBbW9nQWlBRmFrR3MwQUZxS0FJQU5nS2NBU0FEUVFGcUlRTU1BUXNMUVd3aENTQUVRZkFBYWlJQ0lBY2dCaEFOUVloL1N3MEJJREVnQWlBRktBSUFFQjRnTUNBQ0lBVW9BZ2dRSGlBdklBSWdCU2dDQkJBZUlBeEJJR3NoR0NBT0lRWURRQ0FFS0FLSUFTQUVLQUtFQVVFRGRHb3BBZ0FpUUtjaUNrRVFkaUlaUWY4QmNTRUxJQVFvQXBnQklBUW9BcFFCUVFOMGFpa0NBQ0pCcHlJV1FSQjJJaDlCL3dGeElSb2dCQ2dDa0FFZ0JDZ0NqQUZCQTNScUtRSUFJa0pDSUlpbklRY2dRVUlnaUNCQVFpQ0lweUVEQWtBZ1FrSVFpS2NpQ0VIL0FYRWlBa0VDVHdSQUFrQWdBa0VaU1NBL1FvR0FnQkJVY2tVRVFDQUVRU0FnQkNnQ2RDSUlheUlSSUFJZ0FpQVJTeHNpRnlBSWFqWUNkQ0FISUFRb0FuQWdDSFJCQUNBWGEzWWdBaUFYYXlJWGRHb2hDQ0FFUWZBQWFoQVBHaUFDSUJGTkRRRWdCQ0FFS0FKMElnSWdGMm8yQW5RZ0JDZ0NjQ0FDZEVFQUlCZHJkaUFJYWlFSURBRUxJQVFnQWlBRUtBSjBJaEZxTmdKMElBUW9BbkFnRVhSQkFDQUlhM1lnQjJvaENDQUVRZkFBYWhBUEdnc2dCQ2tDbkFFaFJDQUVJQWcyQXB3QklBUWdSRGNDb0FFTUFRc0NRQ0FDUlFSQUlBTUVRQ0FFS0FLY0FTRUlEQU1MSUFRb0FxQUJJUWdNQVFzZ0JDQUVLQUowSWdKQkFXbzJBblFDZnlBSElBTkZhaUFFS0FKd0lBSjBRUjkyYWlJQ1FRTkdCRUFnQkNnQ25BRkJBV3NNQVFzZ0FrRUNkQ0FFYWlnQ25BRUxJZ2RGSUFkcUlRZ2dBa0VCUndSQUlBUWdCQ2dDb0FFMkFxUUJDd3NnQkNBRUtBS2NBVFlDb0FFZ0JDQUlOZ0tjQVF1bklRSWdRVUtBZ1B3SGcxQkZCRUFnQkNBRUtBSjBJZ2NnR21vMkFuUWdCQ2dDY0NBSGRFRUFJQjlyZGlBQ2FpRUNDeUFMSUJwcVFSUlBCRUFnQkVId0FHb1FEeG9MSUVCQ2dJRDhCNE5RUlFSQUlBUWdCQ2dDZENJSElBdHFOZ0owSUFRb0FuQWdCM1JCQUNBWmEzWWdBMm9oQXdzZ0JFSHdBR29RRHhvZ0JDQUVLQUp3SWdkQkFDQUtRUmgySWdzZ0JDZ0NkR29pR210MklBdEJBblJCb0IxcUtBSUFjU0FLUWYvL0EzRnFOZ0tFQVNBRUlCb2dGa0VZZGlJS2FpSUxOZ0owSUFRZ0NrRUNkRUdnSFdvb0FnQWdCMEVBSUF0cmRuRWdGa0gvL3dOeGFqWUNsQUVnQkVId0FHb1FEeG9nQkNCQ3B5SUhRUmgySWdvZ0JDZ0NkR29pQ3pZQ2RDQUVJQXBCQW5SQm9CMXFLQUlBSUFRb0FuQkJBQ0FMYTNaeElBZEIvLzhEY1dvMkFvd0JJQVFnQXpZQ09DQUVJQUkyQWp3Z0JDQUlOZ0pBQWtBQ1FBSkFJQVFvQXR3Qklnc2dBMm9pRmlBUVN3MEFJQVlnQWlBRGFpSUthaUFZU3cwQUlBcEJJR29nRENBR2EwME5BUXNnQkNBRVFVQnJLQUlBTmdJSUlBUWdCQ2tET0RjREFDQUdJQXdnQkNBRVFkd0JhaUFRSUJJZ0V5QU5FQjhoQ2d3QkN5QURJQVpxSVFjZ0JpQUxLUUFBTndBQUlBWWdDeWtBQ0RjQUNBSkFJQU5CRVVrTkFDQUdJQXNwQUJBM0FCQWdCaUFMS1FBWU53QVlJQU5CRUd0QkVVZ05BQ0FMUVJCcUlRTWdCa0VnYWlFTEEwQWdDeUFES1FBUU53QUFJQXNnQXlrQUdEY0FDQ0FMSUFNcEFDQTNBQkFnQ3lBREtRQW9Od0FZSUFOQklHb2hBeUFMUVNCcUlnc2dCMGtOQUFzTElBY2dDR3NoQXlBRUlCWTJBdHdCSUFjZ0Vtc2dDRWtFUUNBSUlBY2dFMnRMRFFRZ0RTQU5JQU1nRW1zaUEyb2lDeUFDYWs4RVFDQUhJQXNnQWhBS0dnd0NDeUFISUF0QkFDQURheEFLSUFRZ0FpQURhaUlDTmdJOElBTnJJUWNnRWlFREN5QUlRUkJQQkVBZ0J5QURLUUFBTndBQUlBY2dBeWtBQ0RjQUNDQUNRUkZJRFFFZ0FpQUhhaUVJSUFkQkVHb2hBZ05BSUFJZ0F5a0FFRGNBQUNBQ0lBTXBBQmczQUFnZ0FpQURLUUFnTndBUUlBSWdBeWtBS0RjQUdDQURRU0JxSVFNZ0FrRWdhaUlDSUFoSkRRQUxEQUVMQWtBZ0NFRUhUUVJBSUFjZ0F5MEFBRG9BQUNBSElBTXRBQUU2QUFFZ0J5QURMUUFDT2dBQ0lBY2dBeTBBQXpvQUF5QUhJQU1nQ0VFQ2RDSUlRY0FlYWlnQ0FHb2lBeWdBQURZQUJDQURJQWhCNEI1cUtBSUFheUVEREFFTElBY2dBeWtBQURjQUFBc2dBa0VKU1EwQUlBSWdCMm9oQ3lBSFFRaHFJZ2dnQTBFSWFpSURhMEVQVEFSQUEwQWdDQ0FES1FBQU53QUFJQU5CQ0dvaEF5QUlRUWhxSWdnZ0Mwa05BQXdDQ3dBTElBZ2dBeWtBQURjQUFDQUlJQU1wQUFnM0FBZ2dBa0VaU0EwQUlBZEJHR29oQWdOQUlBSWdBeWtBRURjQUFDQUNJQU1wQUJnM0FBZ2dBaUFES1FBZ053QVFJQUlnQXlrQUtEY0FHQ0FEUVNCcUlRTWdBa0VnYWlJQ0lBdEpEUUFMQ3lBS1FZaC9Td1JBSUFvaENRd0RDeUFHSUFwcUlRWWdCRUh3QUdvUUR5RURJQTlCQVdzaUR3MEFDMEVBSVFJZ0EwRUNTUTBCQTBBZ0FrRURSd1JBSUFVZ0FrRUNkQ0lEYWtHczBBRnFJQU1nQkdvb0Fwd0JOZ0lBSUFKQkFXb2hBZ3dCQ3dzZ0JDZ0MzQUVoQXd0QnVuOGhDU0FRSUFOcklnSWdEQ0FHYTBzTkFDQUdCSDhnQmlBRElBSVFBaUFDYWdWQkFBc2dEbXNoQ1FzZ0NVR0lmMHNOQmdzQ1FDQUZLQUxzNmdGRkRRQWdCU0FGS1FPSTZnRWdDYTE4TndPSTZnRUNRQ0FGS0FMUTZnRWlBaUFKYWlJSVFSOU5CRUFnRGtVTkFTQUNJQ0pxSUE0Z0NSQUNHaUFGS0FMUTZnRWdDV29oQ0F3QkN5QU9JUU1nQWdSQUlBSWdJbW9nQTBFZ0lBSnJFQUlhSUFVb0F0RHFBU0VDSUFWQkFEWUMwT29CSUFVZ0JTa0RrT29CSUFVcEFMRHFBVUxQMXRPKzBzZXIyVUorZkVJZmlVS0hsYSt2bUxiZW01NS9mamNEa09vQklBVWdCU2tEbU9vQklBVXBBTGpxQVVMUDF0Tyswc2VyMlVKK2ZFSWZpVUtIbGErdm1MYmVtNTUvZmpjRG1Pb0JJQVVnQlNrRG9Pb0JJQVVwQU1EcUFVTFAxdE8rMHNlcjJVSitmRUlmaVVLSGxhK3ZtTGJlbTU1L2ZqY0RvT29CSUFVZ0JTa0RxT29CSUFVcEFNanFBVUxQMXRPKzBzZXIyVUorZkVJZmlVS0hsYSt2bUxiZW01NS9mamNEcU9vQklBTWdBbXRCSUdvaEF3c2dDU0FPYWlJQ0lBTkJJR3BQQkVBZ0FrRWdheUVHSUFVcEE2anFBU0UvSUFVcEE2RHFBU0ZBSUFVcEE1anFBU0ZCSUFVcEE1RHFBU0ZDQTBBZ0F5a0FHRUxQMXRPKzBzZXIyVUorSUQ5OFFoK0pRb2VWcjYrWXR0NmJubjkrSVQ4Z0F5a0FFRUxQMXRPKzBzZXIyVUorSUVCOFFoK0pRb2VWcjYrWXR0NmJubjkrSVVBZ0F5a0FDRUxQMXRPKzBzZXIyVUorSUVGOFFoK0pRb2VWcjYrWXR0NmJubjkrSVVFZ0F5a0FBRUxQMXRPKzBzZXIyVUorSUVKOFFoK0pRb2VWcjYrWXR0NmJubjkrSVVJZ0EwRWdhaUlESUFaTkRRQUxJQVVnUHpjRHFPb0JJQVVnUURjRG9Pb0JJQVVnUVRjRG1Pb0JJQVVnUWpjRGtPb0JDeUFDSUFOTkRRRWdJaUFESUFJZ0Eyc2lDQkFDR2dzZ0JTQUlOZ0xRNmdFTElEVWdGV3NoQXlBVklCdHFJUUlnQ1NBT2FpRU9JQVFvQWpCRkRRQUxJQ2twQXdBaVAwSi9VU0EvSUE0Z0hXdXNVWEpGQkVCQmJDRUpEQVlMSUFVb0F1RHBBUVJBUVdvaENTQURRUVJKRFFZZ0JTZ0M2T29CUlFSQUlDSWdCU2dDME9vQmFpRUtBbjRnQlNrRGlPb0JJajlDSUZvRVFDQUZLUU9ZNmdFaVFFSUhpU0FGS1FPUTZnRWlRVUlCaVh3Z0JTa0RvT29CSWtKQ0RJbDhJQVVwQTZqcUFTSkRRaEtKZkNCQlFzL1cwNzdTeDZ2WlFuNUNINGxDaDVXdnI1aTIzcHVlZjM2RlFvZVZyNitZdHQ2Ym5uOStRcDJqdGVxRHNZMksrZ0I5SUVCQ3o5YlR2dExIcTlsQ2ZrSWZpVUtIbGErdm1MYmVtNTUvZm9WQ2g1V3ZyNWkyM3B1ZWYzNUNuYU8xNm9PeGpZcjZBSDBnUWtMUDF0Tyswc2VyMlVKK1FoK0pRb2VWcjYrWXR0NmJubjkraFVLSGxhK3ZtTGJlbTU1L2ZrS2RvN1hxZzdHTml2b0FmU0JEUXMvVzA3N1N4NnZaUW41Q0g0bENoNVd2cjVpMjNwdWVmMzZGUW9lVnI2K1l0dDZibm45K1FwMmp0ZXFEc1kySytnQjlEQUVMSUFVcEE2RHFBVUxGejlteThlVzY2aWQ4Q3lBL2ZDRS9JQ0loQmdOQUlBb2dCa0VJYWlJSFR3UkFJQVlwQUFCQ3o5YlR2dExIcTlsQ2ZrSWZpVUtIbGErdm1MYmVtNTUvZmlBL2hVSWJpVUtIbGErdm1MYmVtNTUvZmtLZG83WHFnN0dOaXZvQWZTRS9JQWNoQmd3QkN3c0NRQ0FLSUFaQkJHb2lDRWtFUUNBR0lRZ01BUXNnQmpVQUFFS0hsYSt2bUxiZW01NS9maUEvaFVJWGlVTFAxdE8rMHNlcjJVSitRdm56M2ZHWjlwbXJGbndoUHdzRFFDQUlJQXBKQkVBZ0NERUFBRUxGejlteThlVzY2aWQrSUQrRlFndUpRb2VWcjYrWXR0NmJubjkrSVQ4Z0NFRUJhaUVJREFFTEN5QUNLQUFBSUQ5Q0lZZ2dQNFZDejliVHZ0TEhxOWxDZmlJL1FoMklJRCtGUXZuejNmR1o5cG1yRm40aVAwSWdpQ0EvaGFkSERRY0xJQU5CQkdzaEF5QUNRUVJxSVFJTElBNGdIV3NpQ1VHSmYwOE5CQ0FCSUFscklRRWdDU0FkYWlFZFFRRWhQZ3dCQ3d0QnVIOGhCeUFERFFRZ0hTQUFheUVIREFRTFFXd2hDUXdCQzBHNGZ5RUpDMEc0ZnlFSElBbEJka1lnUG5FTkFRc2dDU0VIQ3lnQ0FBMEFJQVZCL09vQmFpZ0NBQ0VCSUFWQitPb0JhaWdDQUNFQUlBVVFHQ0FGS0FLdzZ3RWdBQ0FCRUJNZ0JVRUFOZ0t3NndFZ0JTZ0NwT3NCSWdJRVFBSkFBa0FDUUFKQUlBSW9BZ0FpQXdSQUlBQkZEUUlnQVNBRElBQVJBZ0FNQVFzZ0FFVU5BZ3NnQVNBQ0lBQVJBZ0FNQWdzZ0F4QUdDeUFDRUFZTElBVkJBRFlDcE9zQkN5QUFCRUFnQVNBRklBQVJBZ0FNQVFzZ0JSQUdDeUFFUWVBQmFpUUFJQWNMQzZnVkNRQkJpQWdMRFFFQUFBQUJBQUFBQWdBQUFBSUFRYUFJQzdNR0FRQUFBQUVBQUFBQ0FBQUFBZ0FBQUNZQUFBQ0NBQUFBSVFVQUFFb0FBQUJuQ0FBQUpnQUFBTUFCQUFDQUFBQUFTUVVBQUVvQUFBQytDQUFBS1FBQUFDd0NBQUNBQUFBQVNRVUFBRW9BQUFDK0NBQUFMd0FBQU1vQ0FBQ0FBQUFBaWdVQUFFb0FBQUNFQ1FBQU5RQUFBSE1EQUFDQUFBQUFuUVVBQUVvQUFBQ2dDUUFBUFFBQUFJRURBQUNBQUFBQTZ3VUFBRXNBQUFBK0NnQUFSQUFBQUo0REFBQ0FBQUFBVFFZQUFFc0FBQUNxQ2dBQVN3QUFBTE1EQUFDQUFBQUF3UVlBQUUwQUFBQWZEUUFBVFFBQUFGTUVBQUNBQUFBQUl3Z0FBRkVBQUFDbUR3QUFWQUFBQUprRUFBQ0FBQUFBU3drQUFGY0FBQUN4RWdBQVdBQUFBTm9FQUFDQUFBQUFid2tBQUYwQUFBQWpGQUFBVkFBQUFFVUZBQUNBQUFBQVZBb0FBR29BQUFDTUZBQUFhZ0FBQUs4RkFBQ0FBQUFBZGdrQUFId0FBQUJPRUFBQWZBQUFBTklDQUFDQUFBQUFZd2NBQUpFQUFBQ1FCd0FBa2dBQUFBQUFBQUFCQUFBQUFRQUFBQVVBQUFBTkFBQUFIUUFBQUQwQUFBQjlBQUFBL1FBQUFQMEJBQUQ5QXdBQS9RY0FBUDBQQUFEOUh3QUEvVDhBQVAxL0FBRDkvd0FBL2Y4QkFQMy9Bd0Q5L3djQS9mOFBBUDMvSHdEOS96OEEvZjkvQVAzLy93RDkvLzhCL2YvL0EvMy8vd2Y5Ly84UC9mLy9ILzMvL3ovOS8vOS9BQUFBQUFFQUFBQUNBQUFBQXdBQUFBUUFBQUFGQUFBQUJnQUFBQWNBQUFBSUFBQUFDUUFBQUFvQUFBQUxBQUFBREFBQUFBMEFBQUFPQUFBQUR3QUFBQkFBQUFBUkFBQUFFZ0FBQUJNQUFBQVVBQUFBRlFBQUFCWUFBQUFYQUFBQUdBQUFBQmtBQUFBYUFBQUFHd0FBQUJ3QUFBQWRBQUFBSGdBQUFCOEFBQUFEQUFBQUJBQUFBQVVBQUFBR0FBQUFCd0FBQUFnQUFBQUpBQUFBQ2dBQUFBc0FBQUFNQUFBQURRQUFBQTRBQUFBUEFBQUFFQUFBQUJFQUFBQVNBQUFBRXdBQUFCUUFBQUFWQUFBQUZnQUFBQmNBQUFBWUFBQUFHUUFBQUJvQUFBQWJBQUFBSEFBQUFCMEFBQUFlQUFBQUh3QUFBQ0FBQUFBaEFBQUFJZ0FBQUNNQUFBQWxBQUFBSndBQUFDa0FBQUFyQUFBQUx3QUFBRE1BQUFBN0FBQUFRd0FBQUZNQUFBQmpBQUFBZ3dBQUFBTUJBQUFEQWdBQUF3UUFBQU1JQUFBREVBQUFBeUFBQUFOQUFBQURnQUFBQXdBQkFFSGdEd3RSQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUlBQUFBQ0FBQUFBd0FBQUFNQUFBQUVBQUFBQkFBQUFBVUFBQUFIQUFBQUNBQUFBQWtBQUFBS0FBQUFDd0FBQUF3QUFBQU5BQUFBRGdBQUFBOEFBQUFRQUVIRUVBdUxBUUVBQUFBQ0FBQUFBd0FBQUFRQUFBQUZBQUFBQmdBQUFBY0FBQUFJQUFBQUNRQUFBQW9BQUFBTEFBQUFEQUFBQUEwQUFBQU9BQUFBRHdBQUFCQUFBQUFTQUFBQUZBQUFBQllBQUFBWUFBQUFIQUFBQUNBQUFBQW9BQUFBTUFBQUFFQUFBQUNBQUFBQUFBRUFBQUFDQUFBQUJBQUFBQWdBQUFBUUFBQUFJQUFBQUVBQUFBQ0FBQUFBQUFFQVFaQVNDK1lFQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUlBQUFBQ0FBQUFBd0FBQUFNQUFBQUVBQUFBQmdBQUFBY0FBQUFJQUFBQUNRQUFBQW9BQUFBTEFBQUFEQUFBQUEwQUFBQU9BQUFBRHdBQUFCQUFBQUFCQUFBQUJBQUFBQWdBQUFBQUFBQUFBUUFCQVFZQUFBQUFBQUFFQUFBQUFCQUFBQVFBQUFBQUlBQUFCUUVBQUFBQUFBQUZBd0FBQUFBQUFBVUVBQUFBQUFBQUJRWUFBQUFBQUFBRkJ3QUFBQUFBQUFVSkFBQUFBQUFBQlFvQUFBQUFBQUFGREFBQUFBQUFBQVlPQUFBQUFBQUJCUkFBQUFBQUFBRUZGQUFBQUFBQUFRVVdBQUFBQUFBQ0JSd0FBQUFBQUFNRklBQUFBQUFBQkFVd0FBQUFJQUFHQlVBQUFBQUFBQWNGZ0FBQUFBQUFDQVlBQVFBQUFBQUtCZ0FFQUFBQUFBd0dBQkFBQUNBQUFBUUFBQUFBQUFBQUJBRUFBQUFBQUFBRkFnQUFBQ0FBQUFVRUFBQUFBQUFBQlFVQUFBQWdBQUFGQndBQUFBQUFBQVVJQUFBQUlBQUFCUW9BQUFBQUFBQUZDd0FBQUFBQUFBWU5BQUFBSUFBQkJSQUFBQUFBQUFFRkVnQUFBQ0FBQVFVV0FBQUFBQUFDQlJnQUFBQWdBQU1GSUFBQUFBQUFBd1VvQUFBQUFBQUdCRUFBQUFBUUFBWUVRQUFBQUNBQUJ3V0FBQUFBQUFBSkJnQUNBQUFBQUFzR0FBZ0FBREFBQUFRQUFBQUFFQUFBQkFFQUFBQWdBQUFGQWdBQUFDQUFBQVVEQUFBQUlBQUFCUVVBQUFBZ0FBQUZCZ0FBQUNBQUFBVUlBQUFBSUFBQUJRa0FBQUFnQUFBRkN3QUFBQ0FBQUFVTUFBQUFBQUFBQmc4QUFBQWdBQUVGRWdBQUFDQUFBUVVVQUFBQUlBQUNCUmdBQUFBZ0FBSUZIQUFBQUNBQUF3VW9BQUFBSUFBRUJUQUFBQUFBQUJBR0FBQUJBQUFBRHdZQWdBQUFBQUFPQmdCQUFBQUFBQTBHQUNBQVFZQVhDNGNDQVFBQkFRVUFBQUFBQUFBRkFBQUFBQUFBQmdROUFBQUFBQUFKQmYwQkFBQUFBQThGL1g4QUFBQUFGUVg5L3g4QUFBQURCUVVBQUFBQUFBY0VmUUFBQUFBQURBWDlEd0FBQUFBU0JmMy9Bd0FBQUJjRi9mOS9BQUFBQlFVZEFBQUFBQUFJQlAwQUFBQUFBQTRGL1Q4QUFBQUFGQVg5L3c4QUFBQUNCUUVBQUFBUUFBY0VmUUFBQUFBQUN3WDlCd0FBQUFBUkJmMy9BUUFBQUJZRi9mOC9BQUFBQkFVTkFBQUFFQUFJQlAwQUFBQUFBQTBGL1I4QUFBQUFFd1g5L3djQUFBQUJCUUVBQUFBUUFBWUVQUUFBQUFBQUNnWDlBd0FBQUFBUUJmMy9BQUFBQUJ3Ri9mLy9Ed0FBR3dYOS8vOEhBQUFhQmYzLy93TUFBQmtGL2YvL0FRQUFHQVg5Ly84QVFaQVpDNFlFQVFBQkFRWUFBQUFBQUFBR0F3QUFBQUFBQUFRRUFBQUFJQUFBQlFVQUFBQUFBQUFGQmdBQUFBQUFBQVVJQUFBQUFBQUFCUWtBQUFBQUFBQUZDd0FBQUFBQUFBWU5BQUFBQUFBQUJoQUFBQUFBQUFBR0V3QUFBQUFBQUFZV0FBQUFBQUFBQmhrQUFBQUFBQUFHSEFBQUFBQUFBQVlmQUFBQUFBQUFCaUlBQUFBQUFBRUdKUUFBQUFBQUFRWXBBQUFBQUFBQ0JpOEFBQUFBQUFNR093QUFBQUFBQkFaVEFBQUFBQUFIQm9NQUFBQUFBQWtHQXdJQUFCQUFBQVFFQUFBQUFBQUFCQVVBQUFBZ0FBQUZCZ0FBQUFBQUFBVUhBQUFBSUFBQUJRa0FBQUFBQUFBRkNnQUFBQUFBQUFZTUFBQUFBQUFBQmc4QUFBQUFBQUFHRWdBQUFBQUFBQVlWQUFBQUFBQUFCaGdBQUFBQUFBQUdHd0FBQUFBQUFBWWVBQUFBQUFBQUJpRUFBQUFBQUFFR0l3QUFBQUFBQVFZbkFBQUFBQUFDQmlzQUFBQUFBQU1HTXdBQUFBQUFCQVpEQUFBQUFBQUZCbU1BQUFBQUFBZ0dBd0VBQUNBQUFBUUVBQUFBTUFBQUJBUUFBQUFRQUFBRUJRQUFBQ0FBQUFVSEFBQUFJQUFBQlFnQUFBQWdBQUFGQ2dBQUFDQUFBQVVMQUFBQUFBQUFCZzRBQUFBQUFBQUdFUUFBQUFBQUFBWVVBQUFBQUFBQUJoY0FBQUFBQUFBR0dnQUFBQUFBQUFZZEFBQUFBQUFBQmlBQUFBQUFBQkFHQXdBQkFBQUFEd1lEZ0FBQUFBQU9CZ05BQUFBQUFBMEdBeUFBQUFBQURBWURFQUFBQUFBTEJnTUlBQUFBQUFvR0F3UUFRYVFkQzlrQkFRQUFBQU1BQUFBSEFBQUFEd0FBQUI4QUFBQS9BQUFBZndBQUFQOEFBQUQvQVFBQS93TUFBUDhIQUFEL0R3QUEveDhBQVA4L0FBRC9md0FBLy84QUFQLy9BUUQvL3dNQS8vOEhBUC8vRHdELy94OEEvLzgvQVAvL2Z3RC8vLzhBLy8vL0FmLy8vd1AvLy84SC8vLy9ELy8vL3gvLy8vOC8vLy8vZndBQUFBQUJBQUFBQWdBQUFBUUFBQUFBQUFBQUFnQUFBQVFBQUFBSUFBQUFBQUFBQUFFQUFBQUNBQUFBQVFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBSUFBQUFDQUFBQUFnQUFBQUhBQUFBQ0FBQUFBa0FBQUFLQUFBQUN3QkJnQjhMQTRBUkFRPT0iO3ZhciBPdD1uZXcgeUEsVHQ9ITE7YXN5bmMgZnVuY3Rpb24gY2UoQSx0LEkpe2xldCBlPW51bGw7dHlwZW9mIEEhPSJzdHJpbmciP2U9QS5ocmVmOkEuc3RhcnRzV2l0aCgiaHR0cCIpP2U9QTplPWAke3R9LyR7QX1gLGUuZW5kc1dpdGgoIi5qcyIpJiYoZT1lLnN1YnN0cmluZygwLGUubGVuZ3RoLTMpKSxlLmVuZHNXaXRoKCIud2FzbSIpJiYoZT1lLnN1YnN0cmluZygwLGUubGVuZ3RoLTUpKTtsZXQgZz1gJHtlfS53YXNtYCxyPWF3YWl0IGRBLmdldChgJHtnfS56c3RgLHtyZXNwb25zZVR5cGU6ImFycmF5YnVmZmVyIixwYXJhbXM6SX0pO1R0fHwoYXdhaXQgT3QuaW5pdCgpLFR0PSEwKTtsZXQgbj1PdC5kZWNvZGUobmV3IFVpbnQ4QXJyYXkoci5kYXRhKSkuYnVmZmVyO3JldHVybihhd2FpdCBpbXBvcnQoYCR7ZX0uanNgKSkuZGVmYXVsdCh7d2FzbUJpbmFyeTpufSl9dmFyIFB0PWNlO3ZhciB3QT1uZXcgTWFwO2FzeW5jIGZ1bmN0aW9uIGZlKEEsdCxJKXtsZXQgZT1BLGc9QSxyPW51bGw7cmV0dXJuIHR5cGVvZiBBIT0ic3RyaW5nIiYmKGU9bmV3IFVSTChBLmhyZWYpLGc9ZS5ocmVmKSx3QS5oYXMoZyk/cj1hd2FpdCB3QS5nZXQoZyk6KHdBLnNldChnLFB0KGUsdCxJKSkscj1hd2FpdCB3QS5nZXQoZykpLHJ9dmFyIHh0PWZlO3ZhciBsZT17VGV4dEZpbGU6IlRleHRGaWxlIixCaW5hcnlGaWxlOiJCaW5hcnlGaWxlIixUZXh0U3RyZWFtOiJUZXh0U3RyZWFtIixCaW5hcnlTdHJlYW06IkJpbmFyeVN0cmVhbSIsSW1hZ2U6IkltYWdlIixQb2ludFNldDoiUG9pbnRTZXQiLE1lc2g6Ik1lc2giLFBvbHlEYXRhOiJQb2x5RGF0YSIsVHJhbnNmb3JtOiJUcmFuc2Zvcm0iLEpzb25Db21wYXRpYmxlOiJKc29uQ29tcGF0aWJsZSJ9LEQ9bGU7dmFyIERlPXtJbnQ4OiJpbnQ4IixVSW50ODoidWludDgiLEludDE2OiJpbnQxNiIsVUludDE2OiJ1aW50MTYiLEludDMyOiJpbnQzMiIsVUludDMyOiJ1aW50MzIiLEludDY0OiJpbnQ2NCIsVUludDY0OiJ1aW50NjQiLFNpemVWYWx1ZVR5cGU6InVpbnQ2NCIsSWRlbnRpZmllclR5cGU6InVpbnQ2NCIsSW5kZXhWYWx1ZVR5cGU6ImludDY0IixPZmZzZXRWYWx1ZVR5cGU6ImludDY0In0sUz1EZTt2YXIgdWU9e0Zsb2F0MzI6ImZsb2F0MzIiLEZsb2F0NjQ6ImZsb2F0NjQiLFNwYWNlUHJlY2lzaW9uVHlwZToiZmxvYXQ2NCJ9LGo9dWU7ZnVuY3Rpb24gaGUoQSx0KXtsZXQgST1udWxsO3N3aXRjaChBKXtjYXNlIFMuVUludDg6e0k9bmV3IFVpbnQ4QXJyYXkodCk7YnJlYWt9Y2FzZSBTLkludDg6e0k9bmV3IEludDhBcnJheSh0KTticmVha31jYXNlIFMuVUludDE2OntJPW5ldyBVaW50MTZBcnJheSh0KTticmVha31jYXNlIFMuSW50MTY6e0k9bmV3IEludDE2QXJyYXkodCk7YnJlYWt9Y2FzZSBTLlVJbnQzMjp7ST1uZXcgVWludDMyQXJyYXkodCk7YnJlYWt9Y2FzZSBTLkludDMyOntJPW5ldyBJbnQzMkFycmF5KHQpO2JyZWFrfWNhc2UgUy5VSW50NjQ6e3R5cGVvZiBnbG9iYWxUaGlzLkJpZ1VpbnQ2NEFycmF5PT0iZnVuY3Rpb24iP0k9bmV3IEJpZ1VpbnQ2NEFycmF5KHQpOkk9bmV3IFVpbnQ4QXJyYXkodCk7YnJlYWt9Y2FzZSBTLkludDY0Ont0eXBlb2YgZ2xvYmFsVGhpcy5CaWdJbnQ2NEFycmF5PT0iZnVuY3Rpb24iP0k9bmV3IEJpZ0ludDY0QXJyYXkodCk6ST1uZXcgVWludDhBcnJheSh0KTticmVha31jYXNlIGouRmxvYXQzMjp7ST1uZXcgRmxvYXQzMkFycmF5KHQpO2JyZWFrfWNhc2Ugai5GbG9hdDY0OntJPW5ldyBGbG9hdDY0QXJyYXkodCk7YnJlYWt9Y2FzZSJudWxsIjp7ST1udWxsO2JyZWFrfWNhc2UgbnVsbDp7ST1udWxsO2JyZWFrfWRlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJUeXBlIGlzIG5vdCBzdXBwb3J0ZWQgYXMgYSBUeXBlZEFycmF5Iil9cmV0dXJuIEl9dmFyIEc9aGU7dmFyIFp0PXR5cGVvZiBnbG9iYWxUaGlzLlNoYXJlZEFycmF5QnVmZmVyPT0iZnVuY3Rpb24iLGp0PW5ldyBUZXh0RW5jb2RlcixXdD1uZXcgVGV4dERlY29kZXIoInV0Zi04Iik7ZnVuY3Rpb24gZGUoQSx0KXtsZXQgST17ZmxhZ3M6InIiLGVuY29kaW5nOiJiaW5hcnkifSxlPUEuZnNfb3Blbih0LEkuZmxhZ3MpLHI9QS5mc19zdGF0KHQpLnNpemUsbz1udWxsO1p0P289bmV3IFNoYXJlZEFycmF5QnVmZmVyKHIpOm89bmV3IEFycmF5QnVmZmVyKHIpO2xldCBuPW5ldyBVaW50OEFycmF5KG8pO3JldHVybiBBLmZzX3JlYWQoZSxuLDAsciwwKSxBLmZzX2Nsb3NlKGUpLG59ZnVuY3Rpb24gVnQoQSx0LEkpe2xldCBlPW51bGw7WnQ/ZT1uZXcgU2hhcmVkQXJyYXlCdWZmZXIoSSk6ZT1uZXcgQXJyYXlCdWZmZXIoSSk7bGV0IGc9bmV3IFVpbnQ4QXJyYXkoZSkscj1uZXcgVWludDhBcnJheShBLkhFQVBVOC5idWZmZXIsdCxJKTtyZXR1cm4gZy5zZXQociksZ31mdW5jdGlvbiBkKEEsdCxJLGUpe2xldCBnPTA7cmV0dXJuIHQhPT1udWxsJiYoZz1BLmNjYWxsKCJpdGtfd2FzbV9pbnB1dF9hcnJheV9hbGxvYyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxJLGUsdC5idWZmZXIuYnl0ZUxlbmd0aF0pLEEuSEVBUFU4LnNldChuZXcgVWludDhBcnJheSh0LmJ1ZmZlciksZykpLGd9ZnVuY3Rpb24gTShBLHQsSSl7bGV0IGU9SlNPTi5zdHJpbmdpZnkodCksZz1BLmxlbmd0aEJ5dGVzVVRGOChlKSsxLHI9QS5jY2FsbCgiaXRrX3dhc21faW5wdXRfanNvbl9hbGxvYyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxJLGddKTtBLnN0cmluZ1RvVVRGOChlLHIsZyl9ZnVuY3Rpb24gcChBLHQsSSxlKXtsZXQgZz1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfYWRkcmVzcyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCx0LEldKSxyPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9zaXplIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLHQsSV0pLG89VnQoQSxnLHIpO3JldHVybiBHKGUsby5idWZmZXIpfWZ1bmN0aW9uIG1BKEEsdCl7bGV0IEk9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2pzb25fYWRkcmVzcyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiXSxbMCx0XSksZT1BLlVURjhUb1N0cmluZyhJKTtyZXR1cm4gSlNPTi5wYXJzZShlKX1mdW5jdGlvbiB5ZShBLHQsSSxlKXtlIT1udWxsJiZlLmxlbmd0aD4wJiZlLmZvckVhY2goZnVuY3Rpb24oUSxCKXtzd2l0Y2goUS50eXBlKXtjYXNlIEQuVGV4dFN0cmVhbTp7bGV0IGk9anQuZW5jb2RlKFEuZGF0YS5kYXRhKSxmPWQoQSxpLEIsMCkscz17c2l6ZTppLmJ1ZmZlci5ieXRlTGVuZ3RoLGRhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtmfWB9O00oQSxzLEIpO2JyZWFrfWNhc2UgRC5Kc29uQ29tcGF0aWJsZTp7bGV0IGk9anQuZW5jb2RlKEpTT04uc3RyaW5naWZ5KFEuZGF0YSkpLGY9ZChBLGksQiwwKSxzPXtzaXplOmkuYnVmZmVyLmJ5dGVMZW5ndGgsZGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2Z9YH07TShBLHMsQik7YnJlYWt9Y2FzZSBELkJpbmFyeVN0cmVhbTp7bGV0IGk9US5kYXRhLmRhdGEsZj1kKEEsaSxCLDApLHM9e3NpemU6aS5idWZmZXIuYnl0ZUxlbmd0aCxkYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Zn1gfTtNKEEscyxCKTticmVha31jYXNlIEQuVGV4dEZpbGU6e0EuZnNfd3JpdGVGaWxlKFEuZGF0YS5wYXRoLFEuZGF0YS5kYXRhKTticmVha31jYXNlIEQuQmluYXJ5RmlsZTp7QS5mc193cml0ZUZpbGUoUS5kYXRhLnBhdGgsUS5kYXRhLmRhdGEpO2JyZWFrfWNhc2UgRC5JbWFnZTp7bGV0IGk9US5kYXRhLGY9ZChBLGkuZGF0YSxCLDApLHM9ZChBLGkuZGlyZWN0aW9uLEIsMSksRT10eXBlb2YgaS5tZXRhZGF0YT8uZW50cmllczwidSI/QXJyYXkuZnJvbShpLm1ldGFkYXRhLmVudHJpZXMoKSk6W10sYz17aW1hZ2VUeXBlOmkuaW1hZ2VUeXBlLG5hbWU6aS5uYW1lLG9yaWdpbjppLm9yaWdpbixzcGFjaW5nOmkuc3BhY2luZyxkaXJlY3Rpb246YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtzfWAsc2l6ZTppLnNpemUsZGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2Z9YCxtZXRhZGF0YTpFfTtNKEEsYyxCKTticmVha31jYXNlIEQuTWVzaDp7bGV0IGk9US5kYXRhLGY9ZChBLGkucG9pbnRzLEIsMCkscz1kKEEsaS5jZWxscyxCLDEpLEU9ZChBLGkucG9pbnREYXRhLEIsMiksYz1kKEEsaS5jZWxsRGF0YSxCLDMpLHU9e21lc2hUeXBlOmkubWVzaFR5cGUsbmFtZTppLm5hbWUsbnVtYmVyT2ZQb2ludHM6aS5udW1iZXJPZlBvaW50cyxwb2ludHM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtmfWAsbnVtYmVyT2ZDZWxsczppLm51bWJlck9mQ2VsbHMsY2VsbHM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtzfWAsY2VsbEJ1ZmZlclNpemU6aS5jZWxsQnVmZmVyU2l6ZSxudW1iZXJPZlBvaW50UGl4ZWxzOmkubnVtYmVyT2ZQb2ludFBpeGVscyxwb2ludERhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtFfWAsbnVtYmVyT2ZDZWxsUGl4ZWxzOmkubnVtYmVyT2ZDZWxsUGl4ZWxzLGNlbGxEYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Y31gfTtNKEEsdSxCKTticmVha31jYXNlIEQuUG9pbnRTZXQ6e2xldCBpPVEuZGF0YSxmPWQoQSxpLnBvaW50cyxCLDApLHM9ZChBLGkucG9pbnREYXRhLEIsMSksRT17cG9pbnRTZXRUeXBlOmkucG9pbnRTZXRUeXBlLG5hbWU6aS5uYW1lLG51bWJlck9mUG9pbnRzOmkubnVtYmVyT2ZQb2ludHMscG9pbnRzOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Zn1gLG51bWJlck9mUG9pbnRQaXhlbHM6aS5udW1iZXJPZlBvaW50UGl4ZWxzLHBvaW50RGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke3N9YH07TShBLEUsQik7YnJlYWt9Y2FzZSBELlBvbHlEYXRhOntsZXQgaT1RLmRhdGEsZj1kKEEsaS5wb2ludHMsQiwwKSxzPWQoQSxpLnZlcnRpY2VzLEIsMSksRT1kKEEsaS5saW5lcyxCLDIpLGM9ZChBLGkucG9seWdvbnMsQiwzKSx1PWQoQSxpLnRyaWFuZ2xlU3RyaXBzLEIsNCkseT1kKEEsaS5wb2ludERhdGEsQiw1KSxSPWQoQSxpLnBvaW50RGF0YSxCLDYpLE49e3BvbHlEYXRhVHlwZTppLnBvbHlEYXRhVHlwZSxuYW1lOmkubmFtZSxudW1iZXJPZlBvaW50czppLm51bWJlck9mUG9pbnRzLHBvaW50czpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2Z9YCx2ZXJ0aWNlc0J1ZmZlclNpemU6aS52ZXJ0aWNlc0J1ZmZlclNpemUsdmVydGljZXM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtzfWAsbGluZXNCdWZmZXJTaXplOmkubGluZXNCdWZmZXJTaXplLGxpbmVzOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7RX1gLHBvbHlnb25zQnVmZmVyU2l6ZTppLnBvbHlnb25zQnVmZmVyU2l6ZSxwb2x5Z29uczpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2N9YCx0cmlhbmdsZVN0cmlwc0J1ZmZlclNpemU6aS50cmlhbmdsZVN0cmlwc0J1ZmZlclNpemUsdHJpYW5nbGVTdHJpcHM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHt1fWAsbnVtYmVyT2ZQb2ludFBpeGVsczppLm51bWJlck9mUG9pbnRQaXhlbHMscG9pbnREYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7eX1gLG51bWJlck9mQ2VsbFBpeGVsczppLm51bWJlck9mQ2VsbFBpeGVscyxjZWxsRGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke1J9YH07TShBLE4sQik7YnJlYWt9ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5zdXBwb3J0ZWQgaW5wdXQgSW50ZXJmYWNlVHlwZSIpfX0pLEEucmVzZXRNb2R1bGVTdGRvdXQoKSxBLnJlc2V0TW9kdWxlU3RkZXJyKCk7bGV0IGc9QS5zdGFja1NhdmUoKSxyPTA7dHJ5e3I9QS5jYWxsTWFpbih0LnNsaWNlKCkpfWNhdGNoKFEpe3Rocm93IHR5cGVvZiBRPT0ibnVtYmVyIiYmKGNvbnNvbGUubG9nKCJFeGNlcHRpb24gd2hpbGUgcnVubmluZyBwaXBlbGluZToiKSxjb25zb2xlLmxvZygic3Rkb3V0OiIsQS5nZXRNb2R1bGVTdGRvdXQoKSksY29uc29sZS5lcnJvcigic3RkZXJyOiIsQS5nZXRNb2R1bGVTdGRlcnIoKSksdHlwZW9mIEEuZ2V0RXhjZXB0aW9uTWVzc2FnZTwidSI/Y29uc29sZS5lcnJvcigiZXhjZXB0aW9uOiIsQS5nZXRFeGNlcHRpb25NZXNzYWdlKFEpKTpjb25zb2xlLmVycm9yKCJCdWlsZCBtb2R1bGUgaW4gRGVidWcgbW9kZSBmb3IgZXhjZXB0aW9uIG1lc3NhZ2UgaW5mb3JtYXRpb24uIikpLFF9ZmluYWxseXtBLnN0YWNrUmVzdG9yZShnKX1sZXQgbz1BLmdldE1vZHVsZVN0ZG91dCgpLG49QS5nZXRNb2R1bGVTdGRlcnIoKSxhPVtdO3JldHVybiBJIT1udWxsJiZJLmxlbmd0aD4wJiZyPT09MCYmSS5mb3JFYWNoKGZ1bmN0aW9uKFEsQil7bGV0IGk9bnVsbDtzd2l0Y2goUS50eXBlKXtjYXNlIEQuVGV4dFN0cmVhbTp7bGV0IHM9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X2FkZHJlc3MiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAsQiwwXSksRT1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfc2l6ZSIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxCLDBdKSxjPW5ldyBVaW50OEFycmF5KEEuSEVBUFU4LmJ1ZmZlcixzLEUpO2k9e2RhdGE6V3QuZGVjb2RlKGMpfTticmVha31jYXNlIEQuSnNvbkNvbXBhdGlibGU6e2xldCBzPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9hZGRyZXNzIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLEIsMF0pLEU9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X3NpemUiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAsQiwwXSksYz1uZXcgVWludDhBcnJheShBLkhFQVBVOC5idWZmZXIscyxFKTtpPUpTT04ucGFyc2UoV3QuZGVjb2RlKGMpKTticmVha31jYXNlIEQuQmluYXJ5U3RyZWFtOntsZXQgcz1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfYWRkcmVzcyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxCLDBdKSxFPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9zaXplIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLEIsMF0pO2k9e2RhdGE6VnQoQSxzLEUpfTticmVha31jYXNlIEQuVGV4dEZpbGU6e2k9e3BhdGg6US5kYXRhLnBhdGgsZGF0YTpBLmZzX3JlYWRGaWxlKFEuZGF0YS5wYXRoLHtlbmNvZGluZzoidXRmOCJ9KX07YnJlYWt9Y2FzZSBELkJpbmFyeUZpbGU6e2k9e3BhdGg6US5kYXRhLnBhdGgsZGF0YTpkZShBLFEuZGF0YS5wYXRoKX07YnJlYWt9Y2FzZSBELkltYWdlOntsZXQgcz1tQShBLEIpO3MuZGF0YT1wKEEsQiwwLHMuaW1hZ2VUeXBlLmNvbXBvbmVudFR5cGUpLHMuZGlyZWN0aW9uPXAoQSxCLDEsai5GbG9hdDY0KSxzLm1ldGFkYXRhPW5ldyBNYXAocy5tZXRhZGF0YSksaT1zO2JyZWFrfWNhc2UgRC5NZXNoOntsZXQgcz1tQShBLEIpO3MubnVtYmVyT2ZQb2ludHM+MD9zLnBvaW50cz1wKEEsQiwwLHMubWVzaFR5cGUucG9pbnRDb21wb25lbnRUeXBlKTpzLnBvaW50cz1HKHMubWVzaFR5cGUucG9pbnRDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSkscy5udW1iZXJPZkNlbGxzPjA/cy5jZWxscz1wKEEsQiwxLHMubWVzaFR5cGUuY2VsbENvbXBvbmVudFR5cGUpOnMuY2VsbHM9RyhzLm1lc2hUeXBlLmNlbGxDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSkscy5udW1iZXJPZlBvaW50UGl4ZWxzPjA/cy5wb2ludERhdGE9cChBLEIsMixzLm1lc2hUeXBlLnBvaW50UGl4ZWxDb21wb25lbnRUeXBlKTpzLnBvaW50RGF0YT1HKHMubWVzaFR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxzLm51bWJlck9mQ2VsbFBpeGVscz4wP3MuY2VsbERhdGE9cChBLEIsMyxzLm1lc2hUeXBlLmNlbGxQaXhlbENvbXBvbmVudFR5cGUpOnMuY2VsbERhdGE9RyhzLm1lc2hUeXBlLmNlbGxQaXhlbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxpPXM7YnJlYWt9Y2FzZSBELlBvaW50U2V0OntsZXQgcz1tQShBLEIpO3MubnVtYmVyT2ZQb2ludHM+MD9zLnBvaW50cz1wKEEsQiwwLHMucG9pbnRTZXRUeXBlLnBvaW50Q29tcG9uZW50VHlwZSk6cy5wb2ludHM9RyhzLnBvaW50U2V0VHlwZS5wb2ludENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxzLm51bWJlck9mUG9pbnRQaXhlbHM+MD9zLnBvaW50RGF0YT1wKEEsQiwxLHMucG9pbnRTZXRUeXBlLnBvaW50UGl4ZWxDb21wb25lbnRUeXBlKTpzLnBvaW50RGF0YT1HKHMucG9pbnRTZXRUeXBlLnBvaW50UGl4ZWxDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSksaT1zO2JyZWFrfWNhc2UgRC5Qb2x5RGF0YTp7bGV0IHM9bUEoQSxCKTtzLm51bWJlck9mUG9pbnRzPjA/cy5wb2ludHM9cChBLEIsMCxqLkZsb2F0MzIpOnMucG9pbnRzPW5ldyBGbG9hdDMyQXJyYXkscy52ZXJ0aWNlc0J1ZmZlclNpemU+MD9zLnZlcnRpY2VzPXAoQSxCLDEsUy5VSW50MzIpOnMudmVydGljZXM9bmV3IFVpbnQzMkFycmF5LHMubGluZXNCdWZmZXJTaXplPjA/cy5saW5lcz1wKEEsQiwyLFMuVUludDMyKTpzLmxpbmVzPW5ldyBVaW50MzJBcnJheSxzLnBvbHlnb25zQnVmZmVyU2l6ZT4wP3MucG9seWdvbnM9cChBLEIsMyxTLlVJbnQzMik6cy5wb2x5Z29ucz1uZXcgVWludDMyQXJyYXkscy50cmlhbmdsZVN0cmlwc0J1ZmZlclNpemU+MD9zLnRyaWFuZ2xlU3RyaXBzPXAoQSxCLDQsUy5VSW50MzIpOnMudHJpYW5nbGVTdHJpcHM9bmV3IFVpbnQzMkFycmF5LHMubnVtYmVyT2ZQb2ludFBpeGVscz4wP3MucG9pbnREYXRhPXAoQSxCLDUscy5wb2x5RGF0YVR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUpOnMucG9pbnREYXRhPUcocy5wb2x5RGF0YVR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxzLm51bWJlck9mQ2VsbFBpeGVscz4wP3MuY2VsbERhdGE9cChBLEIsNixzLnBvbHlEYXRhVHlwZS5jZWxsUGl4ZWxDb21wb25lbnRUeXBlKTpzLmNlbGxEYXRhPUcocy5wb2x5RGF0YVR5cGUuY2VsbFBpeGVsQ29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLGk9czticmVha31kZWZhdWx0OnRocm93IEVycm9yKCJVbnN1cHBvcnRlZCBvdXRwdXQgSW50ZXJmYWNlVHlwZSIpfWxldCBmPXt0eXBlOlEudHlwZSxkYXRhOml9O2EucHVzaChmKX0pLHtyZXR1cm5WYWx1ZTpyLHN0ZG91dDpvLHN0ZGVycjpuLG91dHB1dHM6YX19dmFyIFh0PXllO3ZhciB3ZT10eXBlb2YgZ2xvYmFsVGhpcy5TaGFyZWRBcnJheUJ1ZmZlcjwidSI7ZnVuY3Rpb24gbWUoQSx0KXtpZihBPT1udWxsKXJldHVybltdO2xldCBJPVtdO2ZvcihsZXQgZT0wO2U8QS5sZW5ndGg7ZSsrKXtsZXQgZz1wZShBW2VdLHQpO2chPT1udWxsJiZJLnB1c2goZyl9cmV0dXJuIEl9ZnVuY3Rpb24gcGUoQSx0KXtpZihBPT1udWxsKXJldHVybiBudWxsO2xldCBJPW51bGw7cmV0dXJuIEEuYnVmZmVyIT09dm9pZCAwP0k9QS5idWZmZXI6QS5ieXRlTGVuZ3RoIT09dm9pZCAwJiYoST1BKSx3ZSYmSSBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyP251bGw6dD9JOkkuc2xpY2UoMCl9dmFyIHp0PW1lO2Z1bmN0aW9uIFNlKEEpe3JldHVybltBLmRhdGEsQS5kaXJlY3Rpb25dfXZhciBfdD1TZTtmdW5jdGlvbiBGZShBKXtyZXR1cm5bQS5wb2ludHMsQS5wb2ludERhdGEsQS5jZWxscyxBLmNlbGxEYXRhXX12YXIgdnQ9RmU7ZnVuY3Rpb24gUmUoQSl7cmV0dXJuW0EucG9pbnRzLEEudmVydGljZXMsQS5saW5lcyxBLnBvbHlnb25zLEEudHJpYW5nbGVTdHJpcHMsQS5wb2ludERhdGEsQS5jZWxsRGF0YV19dmFyICR0PVJlO2FzeW5jIGZ1bmN0aW9uIE5lKEEsdCxJLGUpe2xldCBnPVh0KEEsdCxJLGUpLHI9W107cmV0dXJuIGcub3V0cHV0cy5mb3JFYWNoKGZ1bmN0aW9uKG8pe2lmKG8udHlwZT09PUQuQmluYXJ5U3RyZWFtfHxvLnR5cGU9PT1ELkJpbmFyeUZpbGUpe2xldCBuPW8uZGF0YTtyLnB1c2gobil9ZWxzZSBpZihvLnR5cGU9PT1ELkltYWdlKXtsZXQgbj1vLmRhdGE7ci5wdXNoKC4uLl90KG4pKX1lbHNlIGlmKG8udHlwZT09PUQuTWVzaCl7bGV0IG49by5kYXRhO3IucHVzaCguLi52dChuKSl9ZWxzZSBpZihvLnR5cGU9PT1ELlBvbHlEYXRhKXtsZXQgbj1vLmRhdGE7ci5wdXNoKC4uLiR0KG4pKX19KSxGQShnLHp0KHIsITApKX12YXIgQUk9TmU7dmFyIFVlPXtydW5QaXBlbGluZTphc3luYyBmdW5jdGlvbihBLHQsSSxlLGcscil7bGV0IG89YXdhaXQgeHQoQSx0LHIpO3JldHVybiBhd2FpdCBBSShvLEksZSxnKX19O2lBKFVlKTslMEEvKiEgQnVuZGxlZCBsaWNlbnNlIGluZm9ybWF0aW9uOiUwQSUwQWNvbWxpbmsvZGlzdC9lc20vY29tbGluay5tanM6JTBBICAoKiolMEEgICAqIEBsaWNlbnNlJTBBICAgKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDJTBBICAgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCUwQSAgICopJTBBKi8lMEEnO2J0KFJ0KTtleHBvcnR7eiBhcyBjb21wcmVzc1N0cmluZ2lmeSxVQSBhcyBnZXREZWZhdWx0V2ViV29ya2VyLGogYXMgZ2V0UGlwZWxpbmVXb3JrZXJVcmwsRkEgYXMgZ2V0UGlwZWxpbmVzQmFzZVVybCx1byBhcyBpbWFnZVRvSnNvbixmbyBhcyBqc29uVG9JbWFnZSxtbyBhcyBqc29uVG9NZXNoLGhvIGFzIGpzb25Ub1BvbHlEYXRhLHBvIGFzIG1lc2hUb0pzb24sViBhcyBwYXJzZVN0cmluZ0RlY29tcHJlc3MseW8gYXMgcG9seURhdGFUb0pzb24sWGEgYXMgc2V0RGVmYXVsdFdlYldvcmtlcixidCBhcyBzZXRQaXBlbGluZVdvcmtlclVybCxXYSBhcyBzZXRQaXBlbGluZXNCYXNlVXJsLE5BIGFzIHZlcnNpb259OwovKiEgQnVuZGxlZCBsaWNlbnNlIGluZm9ybWF0aW9uOgoKY29tbGluay9kaXN0L2VzbS9jb21saW5rLm1qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMKICAgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAogICAqKQoqLwo=""" +default_js_module = """data:text/javascript;base64,dmFyIFV0PU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgTnQ9KEEsZSk9Pntmb3IodmFyIHQgaW4gZSlVdChBLHQse2dldDplW3RdLGVudW1lcmFibGU6ITB9KX07dmFyIFR0PSIzLjMuMSIsTkE9VHQ7dmFyIEd0PXtJbnQ4OiJpbnQ4IixVSW50ODoidWludDgiLEludDE2OiJpbnQxNiIsVUludDE2OiJ1aW50MTYiLEludDMyOiJpbnQzMiIsVUludDMyOiJ1aW50MzIiLEludDY0OiJpbnQ2NCIsVUludDY0OiJ1aW50NjQiLFNpemVWYWx1ZVR5cGU6InVpbnQ2NCIsSWRlbnRpZmllclR5cGU6InVpbnQ2NCIsSW5kZXhWYWx1ZVR5cGU6ImludDY0IixPZmZzZXRWYWx1ZVR5cGU6ImludDY0In0seT1HdDt2YXIgUHQ9e0Zsb2F0MzI6ImZsb2F0MzIiLEZsb2F0NjQ6ImZsb2F0NjQiLFNwYWNlUHJlY2lzaW9uVHlwZToiZmxvYXQ2NCJ9LGs9UHQ7ZnVuY3Rpb24gTHQoQSxlKXtsZXQgdD1udWxsO3N3aXRjaChBKXtjYXNlIHkuVUludDg6e3Q9bmV3IFVpbnQ4QXJyYXkoZSk7YnJlYWt9Y2FzZSB5LkludDg6e3Q9bmV3IEludDhBcnJheShlKTticmVha31jYXNlIHkuVUludDE2Ont0PW5ldyBVaW50MTZBcnJheShlKTticmVha31jYXNlIHkuSW50MTY6e3Q9bmV3IEludDE2QXJyYXkoZSk7YnJlYWt9Y2FzZSB5LlVJbnQzMjp7dD1uZXcgVWludDMyQXJyYXkoZSk7YnJlYWt9Y2FzZSB5LkludDMyOnt0PW5ldyBJbnQzMkFycmF5KGUpO2JyZWFrfWNhc2UgeS5VSW50NjQ6e3R5cGVvZiBnbG9iYWxUaGlzLkJpZ1VpbnQ2NEFycmF5PT0iZnVuY3Rpb24iP3Q9bmV3IEJpZ1VpbnQ2NEFycmF5KGUpOnQ9bmV3IFVpbnQ4QXJyYXkoZSk7YnJlYWt9Y2FzZSB5LkludDY0Ont0eXBlb2YgZ2xvYmFsVGhpcy5CaWdJbnQ2NEFycmF5PT0iZnVuY3Rpb24iP3Q9bmV3IEJpZ0ludDY0QXJyYXkoZSk6dD1uZXcgVWludDhBcnJheShlKTticmVha31jYXNlIGsuRmxvYXQzMjp7dD1uZXcgRmxvYXQzMkFycmF5KGUpO2JyZWFrfWNhc2Ugay5GbG9hdDY0Ont0PW5ldyBGbG9hdDY0QXJyYXkoZSk7YnJlYWt9Y2FzZSJudWxsIjp7dD1udWxsO2JyZWFrfWNhc2UgbnVsbDp7dD1udWxsO2JyZWFrfWRlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJUeXBlIGlzIG5vdCBzdXBwb3J0ZWQgYXMgYSBUeXBlZEFycmF5Iil9cmV0dXJuIHR9dmFyIHc9THQ7dmFyIHh0PXtVbmtub3duOiJVbmtub3duIixTY2FsYXI6IlNjYWxhciIsUkdCOiJSR0IiLFJHQkE6IlJHQkEiLE9mZnNldDoiT2Zmc2V0IixWZWN0b3I6IlZlY3RvciIsUG9pbnQ6IlBvaW50IixDb3ZhcmlhbnRWZWN0b3I6IkNvdmFyaWFudFZlY3RvciIsU3ltbWV0cmljU2Vjb25kUmFua1RlbnNvcjoiU3ltbWV0cmljU2Vjb25kUmFua1RlbnNvciIsRGlmZnVzaW9uVGVuc29yM0Q6IkRpZmZ1c2lvblRlbnNvcjNEIixDb21wbGV4OiJDb21wbGV4IixGaXhlZEFycmF5OiJGaXhlZEFycmF5IixBcnJheToiQXJyYXkiLE1hdHJpeDoiTWF0cml4IixWYXJpYWJsZUxlbmd0aFZlY3RvcjoiVmFyaWFibGVMZW5ndGhWZWN0b3IiLFZhcmlhYmxlU2l6ZU1hdHJpeDoiVmFyaWFibGVTaXplTWF0cml4In0sRz14dDt2YXIgVEE9Y2xhc3N7ZGltZW5zaW9uO2NvbXBvbmVudFR5cGU7cGl4ZWxUeXBlO2NvbXBvbmVudHM7Y29uc3RydWN0b3IoZT0yLHQ9eS5VSW50OCxyPUcuU2NhbGFyLG89MSl7dGhpcy5kaW1lbnNpb249ZSx0aGlzLmNvbXBvbmVudFR5cGU9dCx0aGlzLnBpeGVsVHlwZT1yLHRoaXMuY29tcG9uZW50cz1vfX0sdWU9VEE7ZnVuY3Rpb24gT3QoQSxlLHQscixvKXtBW3IrdCplXT1vfXZhciBmZT1PdDt2YXIgR0E9Y2xhc3N7aW1hZ2VUeXBlO25hbWU9IkltYWdlIjtvcmlnaW47c3BhY2luZztkaXJlY3Rpb247c2l6ZTttZXRhZGF0YTtkYXRhO2NvbnN0cnVjdG9yKGU9bmV3IHVlKXt0aGlzLmltYWdlVHlwZT1lO2xldCB0PWUuZGltZW5zaW9uO3RoaXMub3JpZ2luPW5ldyBBcnJheSh0KSx0aGlzLm9yaWdpbi5maWxsKDApLHRoaXMuc3BhY2luZz1uZXcgQXJyYXkodCksdGhpcy5zcGFjaW5nLmZpbGwoMSksdGhpcy5kaXJlY3Rpb249bmV3IEZsb2F0NjRBcnJheSh0KnQpLHRoaXMuZGlyZWN0aW9uLmZpbGwoMCk7Zm9yKGxldCByPTA7cjx0O3IrKylmZSh0aGlzLmRpcmVjdGlvbix0LHIsciwxKTt0aGlzLnNpemU9bmV3IEFycmF5KHQpLHRoaXMuc2l6ZS5maWxsKDApLHRoaXMubWV0YWRhdGE9bmV3IE1hcCx0aGlzLmRhdGE9bnVsbH19LFBBPUdBO3ZhciBMQT1jbGFzc3tkaW1lbnNpb247cG9pbnRDb21wb25lbnRUeXBlO3BvaW50UGl4ZWxDb21wb25lbnRUeXBlO3BvaW50UGl4ZWxUeXBlO3BvaW50UGl4ZWxDb21wb25lbnRzO2NlbGxDb21wb25lbnRUeXBlO2NlbGxQaXhlbENvbXBvbmVudFR5cGU7Y2VsbFBpeGVsVHlwZTtjZWxsUGl4ZWxDb21wb25lbnRzO2NvbnN0cnVjdG9yKGU9Mix0PWsuRmxvYXQzMixyPWsuRmxvYXQzMixvPUcuU2NhbGFyLG49MSxpPXkuSW50MzIsZz1rLkZsb2F0MzIsbD1HLlNjYWxhcixCPTEpe3RoaXMuZGltZW5zaW9uPWUsdGhpcy5wb2ludENvbXBvbmVudFR5cGU9dCx0aGlzLnBvaW50UGl4ZWxDb21wb25lbnRUeXBlPXIsdGhpcy5wb2ludFBpeGVsVHlwZT1vLHRoaXMucG9pbnRQaXhlbENvbXBvbmVudHM9bix0aGlzLmNlbGxDb21wb25lbnRUeXBlPWksdGhpcy5jZWxsUGl4ZWxDb21wb25lbnRUeXBlPWcsdGhpcy5jZWxsUGl4ZWxUeXBlPWwsdGhpcy5jZWxsUGl4ZWxDb21wb25lbnRzPUJ9fSxwZT1MQTt2YXIgeEE9Y2xhc3N7bWVzaFR5cGU7bmFtZT0iTWVzaCI7bnVtYmVyT2ZQb2ludHM7cG9pbnRzO251bWJlck9mUG9pbnRQaXhlbHM7cG9pbnREYXRhO251bWJlck9mQ2VsbHM7Y2VsbHM7Y2VsbEJ1ZmZlclNpemU7bnVtYmVyT2ZDZWxsUGl4ZWxzO2NlbGxEYXRhO2NvbnN0cnVjdG9yKGU9bmV3IHBlKXt0aGlzLm1lc2hUeXBlPWUsdGhpcy5uYW1lPSJNZXNoIix0aGlzLm51bWJlck9mUG9pbnRzPTAsdGhpcy5wb2ludHM9bnVsbCx0aGlzLm51bWJlck9mUG9pbnRQaXhlbHM9MCx0aGlzLnBvaW50RGF0YT1udWxsLHRoaXMubnVtYmVyT2ZDZWxscz0wLHRoaXMuY2VsbEJ1ZmZlclNpemU9MCx0aGlzLmNlbGxzPW51bGwsdGhpcy5udW1iZXJPZkNlbGxQaXhlbHM9MCx0aGlzLmNlbGxEYXRhPW51bGx9fSxPQT14QTt2YXIgSkE9Y2xhc3N7cG9pbnRQaXhlbENvbXBvbmVudFR5cGU7cG9pbnRQaXhlbFR5cGU7cG9pbnRQaXhlbENvbXBvbmVudHM7Y2VsbFBpeGVsQ29tcG9uZW50VHlwZTtjZWxsUGl4ZWxUeXBlO2NlbGxQaXhlbENvbXBvbmVudHM7Y29uc3RydWN0b3IoZT1rLkZsb2F0MzIsdD1HLlNjYWxhcixyPTEsbz1rLkZsb2F0MzIsbj1HLlNjYWxhcixpPTEpe3RoaXMucG9pbnRQaXhlbENvbXBvbmVudFR5cGU9ZSx0aGlzLnBvaW50UGl4ZWxUeXBlPXQsdGhpcy5wb2ludFBpeGVsQ29tcG9uZW50cz1yLHRoaXMuY2VsbFBpeGVsQ29tcG9uZW50VHlwZT1vLHRoaXMuY2VsbFBpeGVsVHlwZT1uLHRoaXMuY2VsbFBpeGVsQ29tcG9uZW50cz1pfX0sZGU9SkE7dmFyIE1BPWNsYXNze3BvbHlEYXRhVHlwZTtuYW1lPSJQb2x5RGF0YSI7bnVtYmVyT2ZQb2ludHM7cG9pbnRzO3ZlcnRpY2VzQnVmZmVyU2l6ZTt2ZXJ0aWNlcztsaW5lc0J1ZmZlclNpemU7bGluZXM7cG9seWdvbnNCdWZmZXJTaXplO3BvbHlnb25zO3RyaWFuZ2xlU3RyaXBzQnVmZmVyU2l6ZTt0cmlhbmdsZVN0cmlwcztudW1iZXJPZlBvaW50UGl4ZWxzO3BvaW50RGF0YTtudW1iZXJPZkNlbGxQaXhlbHM7Y2VsbERhdGE7Y29uc3RydWN0b3IoZT1uZXcgZGUpe3RoaXMucG9seURhdGFUeXBlPWUsdGhpcy5wb2x5RGF0YVR5cGU9ZSx0aGlzLm5hbWU9IlBvbHlEYXRhIix0aGlzLm51bWJlck9mUG9pbnRzPTAsdGhpcy5wb2ludHM9bmV3IEZsb2F0MzJBcnJheSx0aGlzLnZlcnRpY2VzQnVmZmVyU2l6ZT0wLHRoaXMudmVydGljZXM9bnVsbCx0aGlzLmxpbmVzQnVmZmVyU2l6ZT0wLHRoaXMubGluZXM9bnVsbCx0aGlzLnBvbHlnb25zQnVmZmVyU2l6ZT0wLHRoaXMucG9seWdvbnM9bnVsbCx0aGlzLnRyaWFuZ2xlU3RyaXBzQnVmZmVyU2l6ZT0wLHRoaXMudHJpYW5nbGVTdHJpcHM9bnVsbCx0aGlzLm51bWJlck9mUG9pbnRQaXhlbHM9MCx0aGlzLnBvaW50RGF0YT1udWxsLHRoaXMubnVtYmVyT2ZDZWxsUGl4ZWxzPTAsdGhpcy5jZWxsRGF0YT1udWxsfX0sSEE9TUE7dmFyIEp0PXtUZXh0RmlsZToiVGV4dEZpbGUiLEJpbmFyeUZpbGU6IkJpbmFyeUZpbGUiLFRleHRTdHJlYW06IlRleHRTdHJlYW0iLEJpbmFyeVN0cmVhbToiQmluYXJ5U3RyZWFtIixJbWFnZToiSW1hZ2UiLFBvaW50U2V0OiJQb2ludFNldCIsTWVzaDoiTWVzaCIsUG9seURhdGE6IlBvbHlEYXRhIixUcmFuc2Zvcm06IlRyYW5zZm9ybSIsSnNvbkNvbXBhdGlibGU6Ikpzb25Db21wYXRpYmxlIn0scD1KdDt2YXIgeWU9U3ltYm9sKCJDb21saW5rLnByb3h5IiksTXQ9U3ltYm9sKCJDb21saW5rLmVuZHBvaW50IiksS0E9U3ltYm9sKCJDb21saW5rLnJlbGVhc2VQcm94eSIpLFlBPVN5bWJvbCgiQ29tbGluay5maW5hbGl6ZXIiKSxJQT1TeW1ib2woIkNvbWxpbmsudGhyb3duIiksaGU9QT0+dHlwZW9mIEE9PSJvYmplY3QiJiZBIT09bnVsbHx8dHlwZW9mIEE9PSJmdW5jdGlvbiIsSHQ9e2NhbkhhbmRsZTpBPT5oZShBKSYmQVt5ZV0sc2VyaWFsaXplKEEpe2xldHtwb3J0MTplLHBvcnQyOnR9PW5ldyBNZXNzYWdlQ2hhbm5lbDtyZXR1cm4gRGUoQSxlKSxbdCxbdF1dfSxkZXNlcmlhbGl6ZShBKXtyZXR1cm4gQS5zdGFydCgpLFdBKEEpfX0sWXQ9e2NhbkhhbmRsZTpBPT5oZShBKSYmSUEgaW4gQSxzZXJpYWxpemUoe3ZhbHVlOkF9KXtsZXQgZTtyZXR1cm4gQSBpbnN0YW5jZW9mIEVycm9yP2U9e2lzRXJyb3I6ITAsdmFsdWU6e21lc3NhZ2U6QS5tZXNzYWdlLG5hbWU6QS5uYW1lLHN0YWNrOkEuc3RhY2t9fTplPXtpc0Vycm9yOiExLHZhbHVlOkF9LFtlLFtdXX0sZGVzZXJpYWxpemUoQSl7dGhyb3cgQS5pc0Vycm9yP09iamVjdC5hc3NpZ24obmV3IEVycm9yKEEudmFsdWUubWVzc2FnZSksQS52YWx1ZSk6QS52YWx1ZX19LHdlPW5ldyBNYXAoW1sicHJveHkiLEh0XSxbInRocm93IixZdF1dKTtmdW5jdGlvbiBxdChBLGUpe2ZvcihsZXQgdCBvZiBBKWlmKGU9PT10fHx0PT09IioifHx0IGluc3RhbmNlb2YgUmVnRXhwJiZ0LnRlc3QoZSkpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gRGUoQSxlPWdsb2JhbFRoaXMsdD1bIioiXSl7ZS5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbiByKG8pe2lmKCFvfHwhby5kYXRhKXJldHVybjtpZighcXQodCxvLm9yaWdpbikpe2NvbnNvbGUud2FybihgSW52YWxpZCBvcmlnaW4gJyR7by5vcmlnaW59JyBmb3IgY29tbGluayBwcm94eWApO3JldHVybn1sZXR7aWQ6bix0eXBlOmkscGF0aDpnfT1PYmplY3QuYXNzaWduKHtwYXRoOltdfSxvLmRhdGEpLGw9KG8uZGF0YS5hcmd1bWVudExpc3R8fFtdKS5tYXAoTyksQjt0cnl7bGV0IEk9Zy5zbGljZSgwLC0xKS5yZWR1Y2UoKFEsQyk9PlFbQ10sQSkscz1nLnJlZHVjZSgoUSxDKT0+UVtDXSxBKTtzd2l0Y2goaSl7Y2FzZSJHRVQiOkI9czticmVhaztjYXNlIlNFVCI6SVtnLnNsaWNlKC0xKVswXV09TyhvLmRhdGEudmFsdWUpLEI9ITA7YnJlYWs7Y2FzZSJBUFBMWSI6Qj1zLmFwcGx5KEksbCk7YnJlYWs7Y2FzZSJDT05TVFJVQ1QiOntsZXQgUT1uZXcgcyguLi5sKTtCPV90KFEpfWJyZWFrO2Nhc2UiRU5EUE9JTlQiOntsZXR7cG9ydDE6USxwb3J0MjpDfT1uZXcgTWVzc2FnZUNoYW5uZWw7RGUoQSxDKSxCPXZBKFEsW1FdKX1icmVhaztjYXNlIlJFTEVBU0UiOkI9dm9pZCAwO2JyZWFrO2RlZmF1bHQ6cmV0dXJufX1jYXRjaChJKXtCPXt2YWx1ZTpJLFtJQV06MH19UHJvbWlzZS5yZXNvbHZlKEIpLmNhdGNoKEk9Pih7dmFsdWU6SSxbSUFdOjB9KSkudGhlbihJPT57bGV0W3MsUV09QkEoSSk7ZS5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30scykse2lkOm59KSxRKSxpPT09IlJFTEVBU0UiJiYoZS5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixyKSxTZShlKSxZQSBpbiBBJiZ0eXBlb2YgQVtZQV09PSJmdW5jdGlvbiImJkFbWUFdKCkpfSkuY2F0Y2goST0+e2xldFtzLFFdPUJBKHt2YWx1ZTpuZXcgVHlwZUVycm9yKCJVbnNlcmlhbGl6YWJsZSByZXR1cm4gdmFsdWUiKSxbSUFdOjB9KTtlLnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxzKSx7aWQ6bn0pLFEpfSl9KSxlLnN0YXJ0JiZlLnN0YXJ0KCl9ZnVuY3Rpb24gS3QoQSl7cmV0dXJuIEEuY29uc3RydWN0b3IubmFtZT09PSJNZXNzYWdlUG9ydCJ9ZnVuY3Rpb24gU2UoQSl7S3QoQSkmJkEuY2xvc2UoKX1mdW5jdGlvbiBXQShBLGUpe3JldHVybiBxQShBLFtdLGUpfWZ1bmN0aW9uIGFBKEEpe2lmKEEpdGhyb3cgbmV3IEVycm9yKCJQcm94eSBoYXMgYmVlbiByZWxlYXNlZCBhbmQgaXMgbm90IHVzZWFibGUiKX1mdW5jdGlvbiBiZShBKXtyZXR1cm4gTShBLHt0eXBlOiJSRUxFQVNFIn0pLnRoZW4oKCk9PntTZShBKX0pfXZhciBnQT1uZXcgV2Vha01hcCxDQT0iRmluYWxpemF0aW9uUmVnaXN0cnkiaW4gZ2xvYmFsVGhpcyYmbmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KEE9PntsZXQgZT0oZ0EuZ2V0KEEpfHwwKS0xO2dBLnNldChBLGUpLGU9PT0wJiZiZShBKX0pO2Z1bmN0aW9uIFd0KEEsZSl7bGV0IHQ9KGdBLmdldChlKXx8MCkrMTtnQS5zZXQoZSx0KSxDQSYmQ0EucmVnaXN0ZXIoQSxlLEEpfWZ1bmN0aW9uIHZ0KEEpe0NBJiZDQS51bnJlZ2lzdGVyKEEpfWZ1bmN0aW9uIHFBKEEsZT1bXSx0PWZ1bmN0aW9uKCl7fSl7bGV0IHI9ITEsbz1uZXcgUHJveHkodCx7Z2V0KG4saSl7aWYoYUEociksaT09PUtBKXJldHVybigpPT57dnQobyksYmUoQSkscj0hMH07aWYoaT09PSJ0aGVuIil7aWYoZS5sZW5ndGg9PT0wKXJldHVybnt0aGVuOigpPT5vfTtsZXQgZz1NKEEse3R5cGU6IkdFVCIscGF0aDplLm1hcChsPT5sLnRvU3RyaW5nKCkpfSkudGhlbihPKTtyZXR1cm4gZy50aGVuLmJpbmQoZyl9cmV0dXJuIHFBKEEsWy4uLmUsaV0pfSxzZXQobixpLGcpe2FBKHIpO2xldFtsLEJdPUJBKGcpO3JldHVybiBNKEEse3R5cGU6IlNFVCIscGF0aDpbLi4uZSxpXS5tYXAoST0+SS50b1N0cmluZygpKSx2YWx1ZTpsfSxCKS50aGVuKE8pfSxhcHBseShuLGksZyl7YUEocik7bGV0IGw9ZVtlLmxlbmd0aC0xXTtpZihsPT09TXQpcmV0dXJuIE0oQSx7dHlwZToiRU5EUE9JTlQifSkudGhlbihPKTtpZihsPT09ImJpbmQiKXJldHVybiBxQShBLGUuc2xpY2UoMCwtMSkpO2xldFtCLEldPW1lKGcpO3JldHVybiBNKEEse3R5cGU6IkFQUExZIixwYXRoOmUubWFwKHM9PnMudG9TdHJpbmcoKSksYXJndW1lbnRMaXN0OkJ9LEkpLnRoZW4oTyl9LGNvbnN0cnVjdChuLGkpe2FBKHIpO2xldFtnLGxdPW1lKGkpO3JldHVybiBNKEEse3R5cGU6IkNPTlNUUlVDVCIscGF0aDplLm1hcChCPT5CLnRvU3RyaW5nKCkpLGFyZ3VtZW50TGlzdDpnfSxsKS50aGVuKE8pfX0pO3JldHVybiBXdChvLEEpLG99ZnVuY3Rpb24ganQoQSl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sQSl9ZnVuY3Rpb24gbWUoQSl7bGV0IGU9QS5tYXAoQkEpO3JldHVybltlLm1hcCh0PT50WzBdKSxqdChlLm1hcCh0PT50WzFdKSldfXZhciBrZT1uZXcgV2Vha01hcDtmdW5jdGlvbiB2QShBLGUpe3JldHVybiBrZS5zZXQoQSxlKSxBfWZ1bmN0aW9uIF90KEEpe3JldHVybiBPYmplY3QuYXNzaWduKEEse1t5ZV06ITB9KX1mdW5jdGlvbiBCQShBKXtmb3IobGV0W2UsdF1vZiB3ZSlpZih0LmNhbkhhbmRsZShBKSl7bGV0W3Isb109dC5zZXJpYWxpemUoQSk7cmV0dXJuW3t0eXBlOiJIQU5ETEVSIixuYW1lOmUsdmFsdWU6cn0sb119cmV0dXJuW3t0eXBlOiJSQVciLHZhbHVlOkF9LGtlLmdldChBKXx8W11dfWZ1bmN0aW9uIE8oQSl7c3dpdGNoKEEudHlwZSl7Y2FzZSJIQU5ETEVSIjpyZXR1cm4gd2UuZ2V0KEEubmFtZSkuZGVzZXJpYWxpemUoQS52YWx1ZSk7Y2FzZSJSQVciOnJldHVybiBBLnZhbHVlfX1mdW5jdGlvbiBNKEEsZSx0KXtyZXR1cm4gbmV3IFByb21pc2Uocj0+e2xldCBvPXp0KCk7QS5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbiBuKGkpeyFpLmRhdGF8fCFpLmRhdGEuaWR8fGkuZGF0YS5pZCE9PW98fChBLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG4pLHIoaS5kYXRhKSl9KSxBLnN0YXJ0JiZBLnN0YXJ0KCksQS5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKHtpZDpvfSxlKSx0KX0pfWZ1bmN0aW9uIHp0KCl7cmV0dXJuIG5ldyBBcnJheSg0KS5maWxsKDApLm1hcCgoKT0+TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKk51bWJlci5NQVhfU0FGRV9JTlRFR0VSKS50b1N0cmluZygxNikpLmpvaW4oIi0iKX1mdW5jdGlvbiBaKEEsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIEEuYXBwbHkoZSxhcmd1bWVudHMpfX12YXJ7dG9TdHJpbmc6VnR9PU9iamVjdC5wcm90b3R5cGUse2dldFByb3RvdHlwZU9mOnpBfT1PYmplY3QsY0E9KEE9PmU9PntsZXQgdD1WdC5jYWxsKGUpO3JldHVybiBBW3RdfHwoQVt0XT10LnNsaWNlKDgsLTEpLnRvTG93ZXJDYXNlKCkpfSkoT2JqZWN0LmNyZWF0ZShudWxsKSksTj1BPT4oQT1BLnRvTG93ZXJDYXNlKCksZT0+Y0EoZSk9PT1BKSxFQT1BPT5lPT50eXBlb2YgZT09PUEse2lzQXJyYXk6SH09QXJyYXksWD1FQSgidW5kZWZpbmVkIik7ZnVuY3Rpb24gWnQoQSl7cmV0dXJuIEEhPT1udWxsJiYhWChBKSYmQS5jb25zdHJ1Y3RvciE9PW51bGwmJiFYKEEuY29uc3RydWN0b3IpJiZSKEEuY29uc3RydWN0b3IuaXNCdWZmZXIpJiZBLmNvbnN0cnVjdG9yLmlzQnVmZmVyKEEpfXZhciBOZT1OKCJBcnJheUJ1ZmZlciIpO2Z1bmN0aW9uIFh0KEEpe2xldCBlO3JldHVybiB0eXBlb2YgQXJyYXlCdWZmZXI8InUiJiZBcnJheUJ1ZmZlci5pc1ZpZXc/ZT1BcnJheUJ1ZmZlci5pc1ZpZXcoQSk6ZT1BJiZBLmJ1ZmZlciYmTmUoQS5idWZmZXIpLGV9dmFyICR0PUVBKCJzdHJpbmciKSxSPUVBKCJmdW5jdGlvbiIpLFRlPUVBKCJudW1iZXIiKSxRQT1BPT5BIT09bnVsbCYmdHlwZW9mIEE9PSJvYmplY3QiLEFyPUE9PkE9PT0hMHx8QT09PSExLGxBPUE9PntpZihjQShBKSE9PSJvYmplY3QiKXJldHVybiExO2xldCBlPXpBKEEpO3JldHVybihlPT09bnVsbHx8ZT09PU9iamVjdC5wcm90b3R5cGV8fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKT09PW51bGwpJiYhKFN5bWJvbC50b1N0cmluZ1RhZyBpbiBBKSYmIShTeW1ib2wuaXRlcmF0b3IgaW4gQSl9LGVyPU4oIkRhdGUiKSx0cj1OKCJGaWxlIikscnI9TigiQmxvYiIpLG9yPU4oIkZpbGVMaXN0IiksbnI9QT0+UUEoQSkmJlIoQS5waXBlKSxpcj1BPT57bGV0IGU7cmV0dXJuIEEmJih0eXBlb2YgRm9ybURhdGE9PSJmdW5jdGlvbiImJkEgaW5zdGFuY2VvZiBGb3JtRGF0YXx8UihBLmFwcGVuZCkmJigoZT1jQShBKSk9PT0iZm9ybWRhdGEifHxlPT09Im9iamVjdCImJlIoQS50b1N0cmluZykmJkEudG9TdHJpbmcoKT09PSJbb2JqZWN0IEZvcm1EYXRhXSIpKX0sc3I9TigiVVJMU2VhcmNoUGFyYW1zIiksYXI9QT0+QS50cmltP0EudHJpbSgpOkEucmVwbGFjZSgvXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2csIiIpO2Z1bmN0aW9uICQoQSxlLHthbGxPd25LZXlzOnQ9ITF9PXt9KXtpZihBPT09bnVsbHx8dHlwZW9mIEE+InUiKXJldHVybjtsZXQgcixvO2lmKHR5cGVvZiBBIT0ib2JqZWN0IiYmKEE9W0FdKSxIKEEpKWZvcihyPTAsbz1BLmxlbmd0aDtyPG87cisrKWUuY2FsbChudWxsLEFbcl0scixBKTtlbHNle2xldCBuPXQ/T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoQSk6T2JqZWN0LmtleXMoQSksaT1uLmxlbmd0aCxnO2ZvcihyPTA7cjxpO3IrKylnPW5bcl0sZS5jYWxsKG51bGwsQVtnXSxnLEEpfX1mdW5jdGlvbiBHZShBLGUpe2U9ZS50b0xvd2VyQ2FzZSgpO2xldCB0PU9iamVjdC5rZXlzKEEpLHI9dC5sZW5ndGgsbztmb3IoO3ItLSA+MDspaWYobz10W3JdLGU9PT1vLnRvTG93ZXJDYXNlKCkpcmV0dXJuIG87cmV0dXJuIG51bGx9dmFyIFBlPXR5cGVvZiBnbG9iYWxUaGlzPCJ1Ij9nbG9iYWxUaGlzOnR5cGVvZiBzZWxmPCJ1Ij9zZWxmOnR5cGVvZiB3aW5kb3c8InUiP3dpbmRvdzpnbG9iYWwsTGU9QT0+IVgoQSkmJkEhPT1QZTtmdW5jdGlvbiBfQSgpe2xldHtjYXNlbGVzczpBfT1MZSh0aGlzKSYmdGhpc3x8e30sZT17fSx0PShyLG8pPT57bGV0IG49QSYmR2UoZSxvKXx8bztsQShlW25dKSYmbEEocik/ZVtuXT1fQShlW25dLHIpOmxBKHIpP2Vbbl09X0Eoe30scik6SChyKT9lW25dPXIuc2xpY2UoKTplW25dPXJ9O2ZvcihsZXQgcj0wLG89YXJndW1lbnRzLmxlbmd0aDtyPG87cisrKWFyZ3VtZW50c1tyXSYmJChhcmd1bWVudHNbcl0sdCk7cmV0dXJuIGV9dmFyIElyPShBLGUsdCx7YWxsT3duS2V5czpyfT17fSk9PigkKGUsKG8sbik9Pnt0JiZSKG8pP0Fbbl09WihvLHQpOkFbbl09b30se2FsbE93bktleXM6cn0pLEEpLGdyPUE9PihBLmNoYXJDb2RlQXQoMCk9PT02NTI3OSYmKEE9QS5zbGljZSgxKSksQSksQ3I9KEEsZSx0LHIpPT57QS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSxyKSxBLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1BLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBLCJzdXBlciIse3ZhbHVlOmUucHJvdG90eXBlfSksdCYmT2JqZWN0LmFzc2lnbihBLnByb3RvdHlwZSx0KX0sQnI9KEEsZSx0LHIpPT57bGV0IG8sbixpLGc9e307aWYoZT1lfHx7fSxBPT1udWxsKXJldHVybiBlO2Rve2ZvcihvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKEEpLG49by5sZW5ndGg7bi0tID4wOylpPW9bbl0sKCFyfHxyKGksQSxlKSkmJiFnW2ldJiYoZVtpXT1BW2ldLGdbaV09ITApO0E9dCE9PSExJiZ6QShBKX13aGlsZShBJiYoIXR8fHQoQSxlKSkmJkEhPT1PYmplY3QucHJvdG90eXBlKTtyZXR1cm4gZX0sbHI9KEEsZSx0KT0+e0E9U3RyaW5nKEEpLCh0PT09dm9pZCAwfHx0PkEubGVuZ3RoKSYmKHQ9QS5sZW5ndGgpLHQtPWUubGVuZ3RoO2xldCByPUEuaW5kZXhPZihlLHQpO3JldHVybiByIT09LTEmJnI9PT10fSxjcj1BPT57aWYoIUEpcmV0dXJuIG51bGw7aWYoSChBKSlyZXR1cm4gQTtsZXQgZT1BLmxlbmd0aDtpZighVGUoZSkpcmV0dXJuIG51bGw7bGV0IHQ9bmV3IEFycmF5KGUpO2Zvcig7ZS0tID4wOyl0W2VdPUFbZV07cmV0dXJuIHR9LEVyPShBPT5lPT5BJiZlIGluc3RhbmNlb2YgQSkodHlwZW9mIFVpbnQ4QXJyYXk8InUiJiZ6QShVaW50OEFycmF5KSksUXI9KEEsZSk9PntsZXQgcj0oQSYmQVtTeW1ib2wuaXRlcmF0b3JdKS5jYWxsKEEpLG87Zm9yKDsobz1yLm5leHQoKSkmJiFvLmRvbmU7KXtsZXQgbj1vLnZhbHVlO2UuY2FsbChBLG5bMF0sblsxXSl9fSx1cj0oQSxlKT0+e2xldCB0LHI9W107Zm9yKDsodD1BLmV4ZWMoZSkpIT09bnVsbDspci5wdXNoKHQpO3JldHVybiByfSxmcj1OKCJIVE1MRm9ybUVsZW1lbnQiKSxwcj1BPT5BLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy1fXHNdKFthLXpcZF0pKFx3KikvZyxmdW5jdGlvbih0LHIsbyl7cmV0dXJuIHIudG9VcHBlckNhc2UoKStvfSksRmU9KCh7aGFzT3duUHJvcGVydHk6QX0pPT4oZSx0KT0+QS5jYWxsKGUsdCkpKE9iamVjdC5wcm90b3R5cGUpLGRyPU4oIlJlZ0V4cCIpLHhlPShBLGUpPT57bGV0IHQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoQSkscj17fTskKHQsKG8sbik9PntsZXQgaTsoaT1lKG8sbixBKSkhPT0hMSYmKHJbbl09aXx8byl9KSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhBLHIpfSxtcj1BPT57eGUoQSwoZSx0KT0+e2lmKFIoQSkmJlsiYXJndW1lbnRzIiwiY2FsbGVyIiwiY2FsbGVlIl0uaW5kZXhPZih0KSE9PS0xKXJldHVybiExO2xldCByPUFbdF07aWYoUihyKSl7aWYoZS5lbnVtZXJhYmxlPSExLCJ3cml0YWJsZSJpbiBlKXtlLndyaXRhYmxlPSExO3JldHVybn1lLnNldHx8KGUuc2V0PSgpPT57dGhyb3cgRXJyb3IoIkNhbiBub3QgcmV3cml0ZSByZWFkLW9ubHkgbWV0aG9kICciK3QrIiciKX0pfX0pfSx5cj0oQSxlKT0+e2xldCB0PXt9LHI9bz0+e28uZm9yRWFjaChuPT57dFtuXT0hMH0pfTtyZXR1cm4gSChBKT9yKEEpOnIoU3RyaW5nKEEpLnNwbGl0KGUpKSx0fSxocj0oKT0+e30sd3I9KEEsZSk9PihBPStBLE51bWJlci5pc0Zpbml0ZShBKT9BOmUpLGpBPSJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIsVWU9IjAxMjM0NTY3ODkiLE9lPXtESUdJVDpVZSxBTFBIQTpqQSxBTFBIQV9ESUdJVDpqQStqQS50b1VwcGVyQ2FzZSgpK1VlfSxEcj0oQT0xNixlPU9lLkFMUEhBX0RJR0lUKT0+e2xldCB0PSIiLHtsZW5ndGg6cn09ZTtmb3IoO0EtLTspdCs9ZVtNYXRoLnJhbmRvbSgpKnJ8MF07cmV0dXJuIHR9O2Z1bmN0aW9uIFNyKEEpe3JldHVybiEhKEEmJlIoQS5hcHBlbmQpJiZBW1N5bWJvbC50b1N0cmluZ1RhZ109PT0iRm9ybURhdGEiJiZBW1N5bWJvbC5pdGVyYXRvcl0pfXZhciBicj1BPT57bGV0IGU9bmV3IEFycmF5KDEwKSx0PShyLG8pPT57aWYoUUEocikpe2lmKGUuaW5kZXhPZihyKT49MClyZXR1cm47aWYoISgidG9KU09OImluIHIpKXtlW29dPXI7bGV0IG49SChyKT9bXTp7fTtyZXR1cm4gJChyLChpLGcpPT57bGV0IGw9dChpLG8rMSk7IVgobCkmJihuW2ddPWwpfSksZVtvXT12b2lkIDAsbn19cmV0dXJuIHJ9O3JldHVybiB0KEEsMCl9LGtyPU4oIkFzeW5jRnVuY3Rpb24iKSxScj1BPT5BJiYoUUEoQSl8fFIoQSkpJiZSKEEudGhlbikmJlIoQS5jYXRjaCksYT17aXNBcnJheTpILGlzQXJyYXlCdWZmZXI6TmUsaXNCdWZmZXI6WnQsaXNGb3JtRGF0YTppcixpc0FycmF5QnVmZmVyVmlldzpYdCxpc1N0cmluZzokdCxpc051bWJlcjpUZSxpc0Jvb2xlYW46QXIsaXNPYmplY3Q6UUEsaXNQbGFpbk9iamVjdDpsQSxpc1VuZGVmaW5lZDpYLGlzRGF0ZTplcixpc0ZpbGU6dHIsaXNCbG9iOnJyLGlzUmVnRXhwOmRyLGlzRnVuY3Rpb246Uixpc1N0cmVhbTpucixpc1VSTFNlYXJjaFBhcmFtczpzcixpc1R5cGVkQXJyYXk6RXIsaXNGaWxlTGlzdDpvcixmb3JFYWNoOiQsbWVyZ2U6X0EsZXh0ZW5kOklyLHRyaW06YXIsc3RyaXBCT006Z3IsaW5oZXJpdHM6Q3IsdG9GbGF0T2JqZWN0OkJyLGtpbmRPZjpjQSxraW5kT2ZUZXN0Ok4sZW5kc1dpdGg6bHIsdG9BcnJheTpjcixmb3JFYWNoRW50cnk6UXIsbWF0Y2hBbGw6dXIsaXNIVE1MRm9ybTpmcixoYXNPd25Qcm9wZXJ0eTpGZSxoYXNPd25Qcm9wOkZlLHJlZHVjZURlc2NyaXB0b3JzOnhlLGZyZWV6ZU1ldGhvZHM6bXIsdG9PYmplY3RTZXQ6eXIsdG9DYW1lbENhc2U6cHIsbm9vcDpocix0b0Zpbml0ZU51bWJlcjp3cixmaW5kS2V5OkdlLGdsb2JhbDpQZSxpc0NvbnRleHREZWZpbmVkOkxlLEFMUEhBQkVUOk9lLGdlbmVyYXRlU3RyaW5nOkRyLGlzU3BlY0NvbXBsaWFudEZvcm06U3IsdG9KU09OT2JqZWN0OmJyLGlzQXN5bmNGbjprcixpc1RoZW5hYmxlOlJyfTtmdW5jdGlvbiBZKEEsZSx0LHIsbyl7RXJyb3IuY2FsbCh0aGlzKSxFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT9FcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLHRoaXMuY29uc3RydWN0b3IpOnRoaXMuc3RhY2s9bmV3IEVycm9yKCkuc3RhY2ssdGhpcy5tZXNzYWdlPUEsdGhpcy5uYW1lPSJBeGlvc0Vycm9yIixlJiYodGhpcy5jb2RlPWUpLHQmJih0aGlzLmNvbmZpZz10KSxyJiYodGhpcy5yZXF1ZXN0PXIpLG8mJih0aGlzLnJlc3BvbnNlPW8pfWEuaW5oZXJpdHMoWSxFcnJvcix7dG9KU09OOmZ1bmN0aW9uKCl7cmV0dXJue21lc3NhZ2U6dGhpcy5tZXNzYWdlLG5hbWU6dGhpcy5uYW1lLGRlc2NyaXB0aW9uOnRoaXMuZGVzY3JpcHRpb24sbnVtYmVyOnRoaXMubnVtYmVyLGZpbGVOYW1lOnRoaXMuZmlsZU5hbWUsbGluZU51bWJlcjp0aGlzLmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOnRoaXMuY29sdW1uTnVtYmVyLHN0YWNrOnRoaXMuc3RhY2ssY29uZmlnOmEudG9KU09OT2JqZWN0KHRoaXMuY29uZmlnKSxjb2RlOnRoaXMuY29kZSxzdGF0dXM6dGhpcy5yZXNwb25zZSYmdGhpcy5yZXNwb25zZS5zdGF0dXM/dGhpcy5yZXNwb25zZS5zdGF0dXM6bnVsbH19fSk7dmFyIEplPVkucHJvdG90eXBlLE1lPXt9O1siRVJSX0JBRF9PUFRJT05fVkFMVUUiLCJFUlJfQkFEX09QVElPTiIsIkVDT05OQUJPUlRFRCIsIkVUSU1FRE9VVCIsIkVSUl9ORVRXT1JLIiwiRVJSX0ZSX1RPT19NQU5ZX1JFRElSRUNUUyIsIkVSUl9ERVBSRUNBVEVEIiwiRVJSX0JBRF9SRVNQT05TRSIsIkVSUl9CQURfUkVRVUVTVCIsIkVSUl9DQU5DRUxFRCIsIkVSUl9OT1RfU1VQUE9SVCIsIkVSUl9JTlZBTElEX1VSTCJdLmZvckVhY2goQT0+e01lW0FdPXt2YWx1ZTpBfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFksTWUpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShKZSwiaXNBeGlvc0Vycm9yIix7dmFsdWU6ITB9KTtZLmZyb209KEEsZSx0LHIsbyxuKT0+e2xldCBpPU9iamVjdC5jcmVhdGUoSmUpO3JldHVybiBhLnRvRmxhdE9iamVjdChBLGksZnVuY3Rpb24obCl7cmV0dXJuIGwhPT1FcnJvci5wcm90b3R5cGV9LGc9PmchPT0iaXNBeGlvc0Vycm9yIiksWS5jYWxsKGksQS5tZXNzYWdlLGUsdCxyLG8pLGkuY2F1c2U9QSxpLm5hbWU9QS5uYW1lLG4mJk9iamVjdC5hc3NpZ24oaSxuKSxpfTt2YXIgZj1ZO3ZhciB1QT1udWxsO2Z1bmN0aW9uIFZBKEEpe3JldHVybiBhLmlzUGxhaW5PYmplY3QoQSl8fGEuaXNBcnJheShBKX1mdW5jdGlvbiBZZShBKXtyZXR1cm4gYS5lbmRzV2l0aChBLCJbXSIpP0Euc2xpY2UoMCwtMik6QX1mdW5jdGlvbiBIZShBLGUsdCl7cmV0dXJuIEE/QS5jb25jYXQoZSkubWFwKGZ1bmN0aW9uKG8sbil7cmV0dXJuIG89WWUobyksIXQmJm4/IlsiK28rIl0iOm99KS5qb2luKHQ/Ii4iOiIiKTplfWZ1bmN0aW9uIEZyKEEpe3JldHVybiBhLmlzQXJyYXkoQSkmJiFBLnNvbWUoVkEpfXZhciBVcj1hLnRvRmxhdE9iamVjdChhLHt9LG51bGwsZnVuY3Rpb24oZSl7cmV0dXJuL15pc1tBLVpdLy50ZXN0KGUpfSk7ZnVuY3Rpb24gTnIoQSxlLHQpe2lmKCFhLmlzT2JqZWN0KEEpKXRocm93IG5ldyBUeXBlRXJyb3IoInRhcmdldCBtdXN0IGJlIGFuIG9iamVjdCIpO2U9ZXx8bmV3KHVBfHxGb3JtRGF0YSksdD1hLnRvRmxhdE9iamVjdCh0LHttZXRhVG9rZW5zOiEwLGRvdHM6ITEsaW5kZXhlczohMX0sITEsZnVuY3Rpb24oRSx1KXtyZXR1cm4hYS5pc1VuZGVmaW5lZCh1W0VdKX0pO2xldCByPXQubWV0YVRva2VucyxvPXQudmlzaXRvcnx8SSxuPXQuZG90cyxpPXQuaW5kZXhlcyxsPSh0LkJsb2J8fHR5cGVvZiBCbG9iPCJ1IiYmQmxvYikmJmEuaXNTcGVjQ29tcGxpYW50Rm9ybShlKTtpZighYS5pc0Z1bmN0aW9uKG8pKXRocm93IG5ldyBUeXBlRXJyb3IoInZpc2l0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uIik7ZnVuY3Rpb24gQihjKXtpZihjPT09bnVsbClyZXR1cm4iIjtpZihhLmlzRGF0ZShjKSlyZXR1cm4gYy50b0lTT1N0cmluZygpO2lmKCFsJiZhLmlzQmxvYihjKSl0aHJvdyBuZXcgZigiQmxvYiBpcyBub3Qgc3VwcG9ydGVkLiBVc2UgYSBCdWZmZXIgaW5zdGVhZC4iKTtyZXR1cm4gYS5pc0FycmF5QnVmZmVyKGMpfHxhLmlzVHlwZWRBcnJheShjKT9sJiZ0eXBlb2YgQmxvYj09ImZ1bmN0aW9uIj9uZXcgQmxvYihbY10pOkJ1ZmZlci5mcm9tKGMpOmN9ZnVuY3Rpb24gSShjLEUsdSl7bGV0IGQ9YztpZihjJiYhdSYmdHlwZW9mIGM9PSJvYmplY3QiKXtpZihhLmVuZHNXaXRoKEUsInt9IikpRT1yP0U6RS5zbGljZSgwLC0yKSxjPUpTT04uc3RyaW5naWZ5KGMpO2Vsc2UgaWYoYS5pc0FycmF5KGMpJiZGcihjKXx8KGEuaXNGaWxlTGlzdChjKXx8YS5lbmRzV2l0aChFLCJbXSIpKSYmKGQ9YS50b0FycmF5KGMpKSlyZXR1cm4gRT1ZZShFKSxkLmZvckVhY2goZnVuY3Rpb24oVSxGdCl7IShhLmlzVW5kZWZpbmVkKFUpfHxVPT09bnVsbCkmJmUuYXBwZW5kKGk9PT0hMD9IZShbRV0sRnQsbik6aT09PW51bGw/RTpFKyJbXSIsQihVKSl9KSwhMX1yZXR1cm4gVkEoYyk/ITA6KGUuYXBwZW5kKEhlKHUsRSxuKSxCKGMpKSwhMSl9bGV0IHM9W10sUT1PYmplY3QuYXNzaWduKFVyLHtkZWZhdWx0VmlzaXRvcjpJLGNvbnZlcnRWYWx1ZTpCLGlzVmlzaXRhYmxlOlZBfSk7ZnVuY3Rpb24gQyhjLEUpe2lmKCFhLmlzVW5kZWZpbmVkKGMpKXtpZihzLmluZGV4T2YoYykhPT0tMSl0aHJvdyBFcnJvcigiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGluICIrRS5qb2luKCIuIikpO3MucHVzaChjKSxhLmZvckVhY2goYyxmdW5jdGlvbihkLEYpeyghKGEuaXNVbmRlZmluZWQoZCl8fGQ9PT1udWxsKSYmby5jYWxsKGUsZCxhLmlzU3RyaW5nKEYpP0YudHJpbSgpOkYsRSxRKSk9PT0hMCYmQyhkLEU/RS5jb25jYXQoRik6W0ZdKX0pLHMucG9wKCl9fWlmKCFhLmlzT2JqZWN0KEEpKXRocm93IG5ldyBUeXBlRXJyb3IoImRhdGEgbXVzdCBiZSBhbiBvYmplY3QiKTtyZXR1cm4gQyhBKSxlfXZhciBQPU5yO2Z1bmN0aW9uIHFlKEEpe2xldCBlPXsiISI6IiUyMSIsIiciOiIlMjciLCIoIjoiJTI4IiwiKSI6IiUyOSIsIn4iOiIlN0UiLCIlMjAiOiIrIiwiJTAwIjoiXDAifTtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEEpLnJlcGxhY2UoL1shJygpfl18JTIwfCUwMC9nLGZ1bmN0aW9uKHIpe3JldHVybiBlW3JdfSl9ZnVuY3Rpb24gS2UoQSxlKXt0aGlzLl9wYWlycz1bXSxBJiZQKEEsdGhpcyxlKX12YXIgV2U9S2UucHJvdG90eXBlO1dlLmFwcGVuZD1mdW5jdGlvbihlLHQpe3RoaXMuX3BhaXJzLnB1c2goW2UsdF0pfTtXZS50b1N0cmluZz1mdW5jdGlvbihlKXtsZXQgdD1lP2Z1bmN0aW9uKHIpe3JldHVybiBlLmNhbGwodGhpcyxyLHFlKX06cWU7cmV0dXJuIHRoaXMuX3BhaXJzLm1hcChmdW5jdGlvbihvKXtyZXR1cm4gdChvWzBdKSsiPSIrdChvWzFdKX0sIiIpLmpvaW4oIiYiKX07dmFyIGZBPUtlO2Z1bmN0aW9uIFRyKEEpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoQSkucmVwbGFjZSgvJTNBL2dpLCI6IikucmVwbGFjZSgvJTI0L2csIiQiKS5yZXBsYWNlKC8lMkMvZ2ksIiwiKS5yZXBsYWNlKC8lMjAvZywiKyIpLnJlcGxhY2UoLyU1Qi9naSwiWyIpLnJlcGxhY2UoLyU1RC9naSwiXSIpfWZ1bmN0aW9uIEFBKEEsZSx0KXtpZighZSlyZXR1cm4gQTtsZXQgcj10JiZ0LmVuY29kZXx8VHIsbz10JiZ0LnNlcmlhbGl6ZSxuO2lmKG8/bj1vKGUsdCk6bj1hLmlzVVJMU2VhcmNoUGFyYW1zKGUpP2UudG9TdHJpbmcoKTpuZXcgZkEoZSx0KS50b1N0cmluZyhyKSxuKXtsZXQgaT1BLmluZGV4T2YoIiMiKTtpIT09LTEmJihBPUEuc2xpY2UoMCxpKSksQSs9KEEuaW5kZXhPZigiPyIpPT09LTE/Ij8iOiImIikrbn1yZXR1cm4gQX12YXIgWkE9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmhhbmRsZXJzPVtdfXVzZShlLHQscil7cmV0dXJuIHRoaXMuaGFuZGxlcnMucHVzaCh7ZnVsZmlsbGVkOmUscmVqZWN0ZWQ6dCxzeW5jaHJvbm91czpyP3Iuc3luY2hyb25vdXM6ITEscnVuV2hlbjpyP3IucnVuV2hlbjpudWxsfSksdGhpcy5oYW5kbGVycy5sZW5ndGgtMX1lamVjdChlKXt0aGlzLmhhbmRsZXJzW2VdJiYodGhpcy5oYW5kbGVyc1tlXT1udWxsKX1jbGVhcigpe3RoaXMuaGFuZGxlcnMmJih0aGlzLmhhbmRsZXJzPVtdKX1mb3JFYWNoKGUpe2EuZm9yRWFjaCh0aGlzLmhhbmRsZXJzLGZ1bmN0aW9uKHIpe3IhPT1udWxsJiZlKHIpfSl9fSxYQT1aQTt2YXIgcEE9e3NpbGVudEpTT05QYXJzaW5nOiEwLGZvcmNlZEpTT05QYXJzaW5nOiEwLGNsYXJpZnlUaW1lb3V0RXJyb3I6ITF9O3ZhciB2ZT10eXBlb2YgVVJMU2VhcmNoUGFyYW1zPCJ1Ij9VUkxTZWFyY2hQYXJhbXM6ZkE7dmFyIGplPXR5cGVvZiBGb3JtRGF0YTwidSI/Rm9ybURhdGE6bnVsbDt2YXIgX2U9dHlwZW9mIEJsb2I8InUiP0Jsb2I6bnVsbDt2YXIgemU9e2lzQnJvd3NlcjohMCxjbGFzc2VzOntVUkxTZWFyY2hQYXJhbXM6dmUsRm9ybURhdGE6amUsQmxvYjpfZX0scHJvdG9jb2xzOlsiaHR0cCIsImh0dHBzIiwiZmlsZSIsImJsb2IiLCJ1cmwiLCJkYXRhIl19O3ZhciAkQT17fTtOdCgkQSx7aGFzQnJvd3NlckVudjooKT0+VmUsaGFzU3RhbmRhcmRCcm93c2VyRW52OigpPT5HcixoYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnY6KCk9PlByfSk7dmFyIFZlPXR5cGVvZiB3aW5kb3c8InUiJiZ0eXBlb2YgZG9jdW1lbnQ8InUiLEdyPShBPT5WZSYmWyJSZWFjdE5hdGl2ZSIsIk5hdGl2ZVNjcmlwdCIsIk5TIl0uaW5kZXhPZihBKTwwKSh0eXBlb2YgbmF2aWdhdG9yPCJ1IiYmbmF2aWdhdG9yLnByb2R1Y3QpLFByPXR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZTwidSImJnNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZSYmdHlwZW9mIHNlbGYuaW1wb3J0U2NyaXB0cz09ImZ1bmN0aW9uIjt2YXIgRD17Li4uJEEsLi4uemV9O2Z1bmN0aW9uIEFlKEEsZSl7cmV0dXJuIFAoQSxuZXcgRC5jbGFzc2VzLlVSTFNlYXJjaFBhcmFtcyxPYmplY3QuYXNzaWduKHt2aXNpdG9yOmZ1bmN0aW9uKHQscixvLG4pe3JldHVybiBELmlzTm9kZSYmYS5pc0J1ZmZlcih0KT8odGhpcy5hcHBlbmQocix0LnRvU3RyaW5nKCJiYXNlNjQiKSksITEpOm4uZGVmYXVsdFZpc2l0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0sZSkpfWZ1bmN0aW9uIExyKEEpe3JldHVybiBhLm1hdGNoQWxsKC9cdyt8XFsoXHcqKV0vZyxBKS5tYXAoZT0+ZVswXT09PSJbXSI/IiI6ZVsxXXx8ZVswXSl9ZnVuY3Rpb24geHIoQSl7bGV0IGU9e30sdD1PYmplY3Qua2V5cyhBKSxyLG89dC5sZW5ndGgsbjtmb3Iocj0wO3I8bztyKyspbj10W3JdLGVbbl09QVtuXTtyZXR1cm4gZX1mdW5jdGlvbiBPcihBKXtmdW5jdGlvbiBlKHQscixvLG4pe2xldCBpPXRbbisrXTtpZihpPT09Il9fcHJvdG9fXyIpcmV0dXJuITA7bGV0IGc9TnVtYmVyLmlzRmluaXRlKCtpKSxsPW4+PXQubGVuZ3RoO3JldHVybiBpPSFpJiZhLmlzQXJyYXkobyk/by5sZW5ndGg6aSxsPyhhLmhhc093blByb3AobyxpKT9vW2ldPVtvW2ldLHJdOm9baV09ciwhZyk6KCghb1tpXXx8IWEuaXNPYmplY3Qob1tpXSkpJiYob1tpXT1bXSksZSh0LHIsb1tpXSxuKSYmYS5pc0FycmF5KG9baV0pJiYob1tpXT14cihvW2ldKSksIWcpfWlmKGEuaXNGb3JtRGF0YShBKSYmYS5pc0Z1bmN0aW9uKEEuZW50cmllcykpe2xldCB0PXt9O3JldHVybiBhLmZvckVhY2hFbnRyeShBLChyLG8pPT57ZShMcihyKSxvLHQsMCl9KSx0fXJldHVybiBudWxsfXZhciBkQT1PcjtmdW5jdGlvbiBKcihBLGUsdCl7aWYoYS5pc1N0cmluZyhBKSl0cnl7cmV0dXJuKGV8fEpTT04ucGFyc2UpKEEpLGEudHJpbShBKX1jYXRjaChyKXtpZihyLm5hbWUhPT0iU3ludGF4RXJyb3IiKXRocm93IHJ9cmV0dXJuKHR8fEpTT04uc3RyaW5naWZ5KShBKX12YXIgZWU9e3RyYW5zaXRpb25hbDpwQSxhZGFwdGVyOlsieGhyIiwiaHR0cCJdLHRyYW5zZm9ybVJlcXVlc3Q6W2Z1bmN0aW9uKGUsdCl7bGV0IHI9dC5nZXRDb250ZW50VHlwZSgpfHwiIixvPXIuaW5kZXhPZigiYXBwbGljYXRpb24vanNvbiIpPi0xLG49YS5pc09iamVjdChlKTtpZihuJiZhLmlzSFRNTEZvcm0oZSkmJihlPW5ldyBGb3JtRGF0YShlKSksYS5pc0Zvcm1EYXRhKGUpKXJldHVybiBvP0pTT04uc3RyaW5naWZ5KGRBKGUpKTplO2lmKGEuaXNBcnJheUJ1ZmZlcihlKXx8YS5pc0J1ZmZlcihlKXx8YS5pc1N0cmVhbShlKXx8YS5pc0ZpbGUoZSl8fGEuaXNCbG9iKGUpKXJldHVybiBlO2lmKGEuaXNBcnJheUJ1ZmZlclZpZXcoZSkpcmV0dXJuIGUuYnVmZmVyO2lmKGEuaXNVUkxTZWFyY2hQYXJhbXMoZSkpcmV0dXJuIHQuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04IiwhMSksZS50b1N0cmluZygpO2xldCBnO2lmKG4pe2lmKHIuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik+LTEpcmV0dXJuIEFlKGUsdGhpcy5mb3JtU2VyaWFsaXplcikudG9TdHJpbmcoKTtpZigoZz1hLmlzRmlsZUxpc3QoZSkpfHxyLmluZGV4T2YoIm11bHRpcGFydC9mb3JtLWRhdGEiKT4tMSl7bGV0IGw9dGhpcy5lbnYmJnRoaXMuZW52LkZvcm1EYXRhO3JldHVybiBQKGc/eyJmaWxlc1tdIjplfTplLGwmJm5ldyBsLHRoaXMuZm9ybVNlcmlhbGl6ZXIpfX1yZXR1cm4gbnx8bz8odC5zZXRDb250ZW50VHlwZSgiYXBwbGljYXRpb24vanNvbiIsITEpLEpyKGUpKTplfV0sdHJhbnNmb3JtUmVzcG9uc2U6W2Z1bmN0aW9uKGUpe2xldCB0PXRoaXMudHJhbnNpdGlvbmFsfHxlZS50cmFuc2l0aW9uYWwscj10JiZ0LmZvcmNlZEpTT05QYXJzaW5nLG89dGhpcy5yZXNwb25zZVR5cGU9PT0ianNvbiI7aWYoZSYmYS5pc1N0cmluZyhlKSYmKHImJiF0aGlzLnJlc3BvbnNlVHlwZXx8bykpe2xldCBpPSEodCYmdC5zaWxlbnRKU09OUGFyc2luZykmJm87dHJ5e3JldHVybiBKU09OLnBhcnNlKGUpfWNhdGNoKGcpe2lmKGkpdGhyb3cgZy5uYW1lPT09IlN5bnRheEVycm9yIj9mLmZyb20oZyxmLkVSUl9CQURfUkVTUE9OU0UsdGhpcyxudWxsLHRoaXMucmVzcG9uc2UpOmd9fXJldHVybiBlfV0sdGltZW91dDowLHhzcmZDb29raWVOYW1lOiJYU1JGLVRPS0VOIix4c3JmSGVhZGVyTmFtZToiWC1YU1JGLVRPS0VOIixtYXhDb250ZW50TGVuZ3RoOi0xLG1heEJvZHlMZW5ndGg6LTEsZW52OntGb3JtRGF0YTpELmNsYXNzZXMuRm9ybURhdGEsQmxvYjpELmNsYXNzZXMuQmxvYn0sdmFsaWRhdGVTdGF0dXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU+PTIwMCYmZTwzMDB9LGhlYWRlcnM6e2NvbW1vbjp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyoiLCJDb250ZW50LVR5cGUiOnZvaWQgMH19fTthLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwicG9zdCIsInB1dCIsInBhdGNoIl0sQT0+e2VlLmhlYWRlcnNbQV09e319KTt2YXIgcT1lZTt2YXIgTXI9YS50b09iamVjdFNldChbImFnZSIsImF1dGhvcml6YXRpb24iLCJjb250ZW50LWxlbmd0aCIsImNvbnRlbnQtdHlwZSIsImV0YWciLCJleHBpcmVzIiwiZnJvbSIsImhvc3QiLCJpZi1tb2RpZmllZC1zaW5jZSIsImlmLXVubW9kaWZpZWQtc2luY2UiLCJsYXN0LW1vZGlmaWVkIiwibG9jYXRpb24iLCJtYXgtZm9yd2FyZHMiLCJwcm94eS1hdXRob3JpemF0aW9uIiwicmVmZXJlciIsInJldHJ5LWFmdGVyIiwidXNlci1hZ2VudCJdKSxaZT1BPT57bGV0IGU9e30sdCxyLG87cmV0dXJuIEEmJkEuc3BsaXQoYApgKS5mb3JFYWNoKGZ1bmN0aW9uKGkpe289aS5pbmRleE9mKCI6IiksdD1pLnN1YnN0cmluZygwLG8pLnRyaW0oKS50b0xvd2VyQ2FzZSgpLHI9aS5zdWJzdHJpbmcobysxKS50cmltKCksISghdHx8ZVt0XSYmTXJbdF0pJiYodD09PSJzZXQtY29va2llIj9lW3RdP2VbdF0ucHVzaChyKTplW3RdPVtyXTplW3RdPWVbdF0/ZVt0XSsiLCAiK3I6cil9KSxlfTt2YXIgWGU9U3ltYm9sKCJpbnRlcm5hbHMiKTtmdW5jdGlvbiBlQShBKXtyZXR1cm4gQSYmU3RyaW5nKEEpLnRyaW0oKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIG1BKEEpe3JldHVybiBBPT09ITF8fEE9PW51bGw/QTphLmlzQXJyYXkoQSk/QS5tYXAobUEpOlN0cmluZyhBKX1mdW5jdGlvbiBIcihBKXtsZXQgZT1PYmplY3QuY3JlYXRlKG51bGwpLHQ9LyhbXlxzLDs9XSspXHMqKD86PVxzKihbXiw7XSspKT8vZyxyO2Zvcig7cj10LmV4ZWMoQSk7KWVbclsxXV09clsyXTtyZXR1cm4gZX12YXIgWXI9QT0+L15bLV9hLXpBLVowLTleYHx+LCEjJCUmJyorLl0rJC8udGVzdChBLnRyaW0oKSk7ZnVuY3Rpb24gdGUoQSxlLHQscixvKXtpZihhLmlzRnVuY3Rpb24ocikpcmV0dXJuIHIuY2FsbCh0aGlzLGUsdCk7aWYobyYmKGU9dCksISFhLmlzU3RyaW5nKGUpKXtpZihhLmlzU3RyaW5nKHIpKXJldHVybiBlLmluZGV4T2YocikhPT0tMTtpZihhLmlzUmVnRXhwKHIpKXJldHVybiByLnRlc3QoZSl9fWZ1bmN0aW9uIHFyKEEpe3JldHVybiBBLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoLyhbYS16XGRdKShcdyopL2csKGUsdCxyKT0+dC50b1VwcGVyQ2FzZSgpK3IpfWZ1bmN0aW9uIEtyKEEsZSl7bGV0IHQ9YS50b0NhbWVsQ2FzZSgiICIrZSk7WyJnZXQiLCJzZXQiLCJoYXMiXS5mb3JFYWNoKHI9PntPYmplY3QuZGVmaW5lUHJvcGVydHkoQSxyK3Qse3ZhbHVlOmZ1bmN0aW9uKG8sbixpKXtyZXR1cm4gdGhpc1tyXS5jYWxsKHRoaXMsZSxvLG4saSl9LGNvbmZpZ3VyYWJsZTohMH0pfSl9dmFyIEs9Y2xhc3N7Y29uc3RydWN0b3IoZSl7ZSYmdGhpcy5zZXQoZSl9c2V0KGUsdCxyKXtsZXQgbz10aGlzO2Z1bmN0aW9uIG4oZyxsLEIpe2xldCBJPWVBKGwpO2lmKCFJKXRocm93IG5ldyBFcnJvcigiaGVhZGVyIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmciKTtsZXQgcz1hLmZpbmRLZXkobyxJKTsoIXN8fG9bc109PT12b2lkIDB8fEI9PT0hMHx8Qj09PXZvaWQgMCYmb1tzXSE9PSExKSYmKG9bc3x8bF09bUEoZykpfWxldCBpPShnLGwpPT5hLmZvckVhY2goZywoQixJKT0+bihCLEksbCkpO3JldHVybiBhLmlzUGxhaW5PYmplY3QoZSl8fGUgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yP2koZSx0KTphLmlzU3RyaW5nKGUpJiYoZT1lLnRyaW0oKSkmJiFZcihlKT9pKFplKGUpLHQpOmUhPW51bGwmJm4odCxlLHIpLHRoaXN9Z2V0KGUsdCl7aWYoZT1lQShlKSxlKXtsZXQgcj1hLmZpbmRLZXkodGhpcyxlKTtpZihyKXtsZXQgbz10aGlzW3JdO2lmKCF0KXJldHVybiBvO2lmKHQ9PT0hMClyZXR1cm4gSHIobyk7aWYoYS5pc0Z1bmN0aW9uKHQpKXJldHVybiB0LmNhbGwodGhpcyxvLHIpO2lmKGEuaXNSZWdFeHAodCkpcmV0dXJuIHQuZXhlYyhvKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJwYXJzZXIgbXVzdCBiZSBib29sZWFufHJlZ2V4cHxmdW5jdGlvbiIpfX19aGFzKGUsdCl7aWYoZT1lQShlKSxlKXtsZXQgcj1hLmZpbmRLZXkodGhpcyxlKTtyZXR1cm4hIShyJiZ0aGlzW3JdIT09dm9pZCAwJiYoIXR8fHRlKHRoaXMsdGhpc1tyXSxyLHQpKSl9cmV0dXJuITF9ZGVsZXRlKGUsdCl7bGV0IHI9dGhpcyxvPSExO2Z1bmN0aW9uIG4oaSl7aWYoaT1lQShpKSxpKXtsZXQgZz1hLmZpbmRLZXkocixpKTtnJiYoIXR8fHRlKHIscltnXSxnLHQpKSYmKGRlbGV0ZSByW2ddLG89ITApfX1yZXR1cm4gYS5pc0FycmF5KGUpP2UuZm9yRWFjaChuKTpuKGUpLG99Y2xlYXIoZSl7bGV0IHQ9T2JqZWN0LmtleXModGhpcykscj10Lmxlbmd0aCxvPSExO2Zvcig7ci0tOyl7bGV0IG49dFtyXTsoIWV8fHRlKHRoaXMsdGhpc1tuXSxuLGUsITApKSYmKGRlbGV0ZSB0aGlzW25dLG89ITApfXJldHVybiBvfW5vcm1hbGl6ZShlKXtsZXQgdD10aGlzLHI9e307cmV0dXJuIGEuZm9yRWFjaCh0aGlzLChvLG4pPT57bGV0IGk9YS5maW5kS2V5KHIsbik7aWYoaSl7dFtpXT1tQShvKSxkZWxldGUgdFtuXTtyZXR1cm59bGV0IGc9ZT9xcihuKTpTdHJpbmcobikudHJpbSgpO2chPT1uJiZkZWxldGUgdFtuXSx0W2ddPW1BKG8pLHJbZ109ITB9KSx0aGlzfWNvbmNhdCguLi5lKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5jb25jYXQodGhpcywuLi5lKX10b0pTT04oZSl7bGV0IHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gYS5mb3JFYWNoKHRoaXMsKHIsbyk9PntyIT1udWxsJiZyIT09ITEmJih0W29dPWUmJmEuaXNBcnJheShyKT9yLmpvaW4oIiwgIik6cil9KSx0fVtTeW1ib2wuaXRlcmF0b3JdKCl7cmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMudG9KU09OKCkpW1N5bWJvbC5pdGVyYXRvcl0oKX10b1N0cmluZygpe3JldHVybiBPYmplY3QuZW50cmllcyh0aGlzLnRvSlNPTigpKS5tYXAoKFtlLHRdKT0+ZSsiOiAiK3QpLmpvaW4oYApgKX1nZXRbU3ltYm9sLnRvU3RyaW5nVGFnXSgpe3JldHVybiJBeGlvc0hlYWRlcnMifXN0YXRpYyBmcm9tKGUpe3JldHVybiBlIGluc3RhbmNlb2YgdGhpcz9lOm5ldyB0aGlzKGUpfXN0YXRpYyBjb25jYXQoZSwuLi50KXtsZXQgcj1uZXcgdGhpcyhlKTtyZXR1cm4gdC5mb3JFYWNoKG89PnIuc2V0KG8pKSxyfXN0YXRpYyBhY2Nlc3NvcihlKXtsZXQgcj0odGhpc1tYZV09dGhpc1tYZV09e2FjY2Vzc29yczp7fX0pLmFjY2Vzc29ycyxvPXRoaXMucHJvdG90eXBlO2Z1bmN0aW9uIG4oaSl7bGV0IGc9ZUEoaSk7cltnXXx8KEtyKG8saSkscltnXT0hMCl9cmV0dXJuIGEuaXNBcnJheShlKT9lLmZvckVhY2gobik6bihlKSx0aGlzfX07Sy5hY2Nlc3NvcihbIkNvbnRlbnQtVHlwZSIsIkNvbnRlbnQtTGVuZ3RoIiwiQWNjZXB0IiwiQWNjZXB0LUVuY29kaW5nIiwiVXNlci1BZ2VudCIsIkF1dGhvcml6YXRpb24iXSk7YS5yZWR1Y2VEZXNjcmlwdG9ycyhLLnByb3RvdHlwZSwoe3ZhbHVlOkF9LGUpPT57bGV0IHQ9ZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSk7cmV0dXJue2dldDooKT0+QSxzZXQocil7dGhpc1t0XT1yfX19KTthLmZyZWV6ZU1ldGhvZHMoSyk7dmFyIFM9SztmdW5jdGlvbiB0QShBLGUpe2xldCB0PXRoaXN8fHEscj1lfHx0LG89Uy5mcm9tKHIuaGVhZGVycyksbj1yLmRhdGE7cmV0dXJuIGEuZm9yRWFjaChBLGZ1bmN0aW9uKGcpe249Zy5jYWxsKHQsbixvLm5vcm1hbGl6ZSgpLGU/ZS5zdGF0dXM6dm9pZCAwKX0pLG8ubm9ybWFsaXplKCksbn1mdW5jdGlvbiByQShBKXtyZXR1cm4hIShBJiZBLl9fQ0FOQ0VMX18pfWZ1bmN0aW9uICRlKEEsZSx0KXtmLmNhbGwodGhpcyxBPz8iY2FuY2VsZWQiLGYuRVJSX0NBTkNFTEVELGUsdCksdGhpcy5uYW1lPSJDYW5jZWxlZEVycm9yIn1hLmluaGVyaXRzKCRlLGYse19fQ0FOQ0VMX186ITB9KTt2YXIgTD0kZTtmdW5jdGlvbiByZShBLGUsdCl7bGV0IHI9dC5jb25maWcudmFsaWRhdGVTdGF0dXM7IXQuc3RhdHVzfHwhcnx8cih0LnN0YXR1cyk/QSh0KTplKG5ldyBmKCJSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICIrdC5zdGF0dXMsW2YuRVJSX0JBRF9SRVFVRVNULGYuRVJSX0JBRF9SRVNQT05TRV1bTWF0aC5mbG9vcih0LnN0YXR1cy8xMDApLTRdLHQuY29uZmlnLHQucmVxdWVzdCx0KSl9dmFyIEF0PUQuaGFzU3RhbmRhcmRCcm93c2VyRW52P3t3cml0ZShBLGUsdCxyLG8sbil7bGV0IGk9W0ErIj0iK2VuY29kZVVSSUNvbXBvbmVudChlKV07YS5pc051bWJlcih0KSYmaS5wdXNoKCJleHBpcmVzPSIrbmV3IERhdGUodCkudG9HTVRTdHJpbmcoKSksYS5pc1N0cmluZyhyKSYmaS5wdXNoKCJwYXRoPSIrciksYS5pc1N0cmluZyhvKSYmaS5wdXNoKCJkb21haW49IitvKSxuPT09ITAmJmkucHVzaCgic2VjdXJlIiksZG9jdW1lbnQuY29va2llPWkuam9pbigiOyAiKX0scmVhZChBKXtsZXQgZT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58O1xccyopKCIrQSsiKT0oW147XSopIikpO3JldHVybiBlP2RlY29kZVVSSUNvbXBvbmVudChlWzNdKTpudWxsfSxyZW1vdmUoQSl7dGhpcy53cml0ZShBLCIiLERhdGUubm93KCktODY0ZTUpfX06e3dyaXRlKCl7fSxyZWFkKCl7cmV0dXJuIG51bGx9LHJlbW92ZSgpe319O2Z1bmN0aW9uIG9lKEEpe3JldHVybi9eKFthLXpdW2EtelxkK1wtLl0qOik/XC9cLy9pLnRlc3QoQSl9ZnVuY3Rpb24gbmUoQSxlKXtyZXR1cm4gZT9BLnJlcGxhY2UoL1wvP1wvJC8sIiIpKyIvIitlLnJlcGxhY2UoL15cLysvLCIiKTpBfWZ1bmN0aW9uIG9BKEEsZSl7cmV0dXJuIEEmJiFvZShlKT9uZShBLGUpOmV9dmFyIGV0PUQuaGFzU3RhbmRhcmRCcm93c2VyRW52P2Z1bmN0aW9uKCl7bGV0IGU9Lyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSxyO2Z1bmN0aW9uIG8obil7bGV0IGk9bjtyZXR1cm4gZSYmKHQuc2V0QXR0cmlidXRlKCJocmVmIixpKSxpPXQuaHJlZiksdC5zZXRBdHRyaWJ1dGUoImhyZWYiLGkpLHtocmVmOnQuaHJlZixwcm90b2NvbDp0LnByb3RvY29sP3QucHJvdG9jb2wucmVwbGFjZSgvOiQvLCIiKToiIixob3N0OnQuaG9zdCxzZWFyY2g6dC5zZWFyY2g/dC5zZWFyY2gucmVwbGFjZSgvXlw/LywiIik6IiIsaGFzaDp0Lmhhc2g/dC5oYXNoLnJlcGxhY2UoL14jLywiIik6IiIsaG9zdG5hbWU6dC5ob3N0bmFtZSxwb3J0OnQucG9ydCxwYXRobmFtZTp0LnBhdGhuYW1lLmNoYXJBdCgwKT09PSIvIj90LnBhdGhuYW1lOiIvIit0LnBhdGhuYW1lfX1yZXR1cm4gcj1vKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSxmdW5jdGlvbihpKXtsZXQgZz1hLmlzU3RyaW5nKGkpP28oaSk6aTtyZXR1cm4gZy5wcm90b2NvbD09PXIucHJvdG9jb2wmJmcuaG9zdD09PXIuaG9zdH19KCk6ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4hMH19KCk7ZnVuY3Rpb24gaWUoQSl7bGV0IGU9L14oWy0rXHddezEsMjV9KSg6P1wvXC98OikvLmV4ZWMoQSk7cmV0dXJuIGUmJmVbMV18fCIifWZ1bmN0aW9uIFdyKEEsZSl7QT1BfHwxMDtsZXQgdD1uZXcgQXJyYXkoQSkscj1uZXcgQXJyYXkoQSksbz0wLG49MCxpO3JldHVybiBlPWUhPT12b2lkIDA/ZToxZTMsZnVuY3Rpb24obCl7bGV0IEI9RGF0ZS5ub3coKSxJPXJbbl07aXx8KGk9QiksdFtvXT1sLHJbb109QjtsZXQgcz1uLFE9MDtmb3IoO3MhPT1vOylRKz10W3MrK10scz1zJUE7aWYobz0obysxKSVBLG89PT1uJiYobj0obisxKSVBKSxCLWk8ZSlyZXR1cm47bGV0IEM9SSYmQi1JO3JldHVybiBDP01hdGgucm91bmQoUSoxZTMvQyk6dm9pZCAwfX12YXIgdHQ9V3I7ZnVuY3Rpb24gcnQoQSxlKXtsZXQgdD0wLHI9dHQoNTAsMjUwKTtyZXR1cm4gbz0+e2xldCBuPW8ubG9hZGVkLGk9by5sZW5ndGhDb21wdXRhYmxlP28udG90YWw6dm9pZCAwLGc9bi10LGw9cihnKSxCPW48PWk7dD1uO2xldCBJPXtsb2FkZWQ6bix0b3RhbDppLHByb2dyZXNzOmk/bi9pOnZvaWQgMCxieXRlczpnLHJhdGU6bHx8dm9pZCAwLGVzdGltYXRlZDpsJiZpJiZCPyhpLW4pL2w6dm9pZCAwLGV2ZW50Om99O0lbZT8iZG93bmxvYWQiOiJ1cGxvYWQiXT0hMCxBKEkpfX12YXIgdnI9dHlwZW9mIFhNTEh0dHBSZXF1ZXN0PCJ1IixvdD12ciYmZnVuY3Rpb24oQSl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHQscil7bGV0IG89QS5kYXRhLG49Uy5mcm9tKEEuaGVhZGVycykubm9ybWFsaXplKCkse3Jlc3BvbnNlVHlwZTppLHdpdGhYU1JGVG9rZW46Z309QSxsO2Z1bmN0aW9uIEIoKXtBLmNhbmNlbFRva2VuJiZBLmNhbmNlbFRva2VuLnVuc3Vic2NyaWJlKGwpLEEuc2lnbmFsJiZBLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsbCl9bGV0IEk7aWYoYS5pc0Zvcm1EYXRhKG8pKXtpZihELmhhc1N0YW5kYXJkQnJvd3NlckVudnx8RC5oYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnYpbi5zZXRDb250ZW50VHlwZSghMSk7ZWxzZSBpZigoST1uLmdldENvbnRlbnRUeXBlKCkpIT09ITEpe2xldFtFLC4uLnVdPUk/SS5zcGxpdCgiOyIpLm1hcChkPT5kLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pOltdO24uc2V0Q29udGVudFR5cGUoW0V8fCJtdWx0aXBhcnQvZm9ybS1kYXRhIiwuLi51XS5qb2luKCI7ICIpKX19bGV0IHM9bmV3IFhNTEh0dHBSZXF1ZXN0O2lmKEEuYXV0aCl7bGV0IEU9QS5hdXRoLnVzZXJuYW1lfHwiIix1PUEuYXV0aC5wYXNzd29yZD91bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoQS5hdXRoLnBhc3N3b3JkKSk6IiI7bi5zZXQoIkF1dGhvcml6YXRpb24iLCJCYXNpYyAiK2J0b2EoRSsiOiIrdSkpfWxldCBRPW9BKEEuYmFzZVVSTCxBLnVybCk7cy5vcGVuKEEubWV0aG9kLnRvVXBwZXJDYXNlKCksQUEoUSxBLnBhcmFtcyxBLnBhcmFtc1NlcmlhbGl6ZXIpLCEwKSxzLnRpbWVvdXQ9QS50aW1lb3V0O2Z1bmN0aW9uIEMoKXtpZighcylyZXR1cm47bGV0IEU9Uy5mcm9tKCJnZXRBbGxSZXNwb25zZUhlYWRlcnMiaW4gcyYmcy5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSksZD17ZGF0YTohaXx8aT09PSJ0ZXh0Inx8aT09PSJqc29uIj9zLnJlc3BvbnNlVGV4dDpzLnJlc3BvbnNlLHN0YXR1czpzLnN0YXR1cyxzdGF0dXNUZXh0OnMuc3RhdHVzVGV4dCxoZWFkZXJzOkUsY29uZmlnOkEscmVxdWVzdDpzfTtyZShmdW5jdGlvbihVKXt0KFUpLEIoKX0sZnVuY3Rpb24oVSl7cihVKSxCKCl9LGQpLHM9bnVsbH1pZigib25sb2FkZW5kImluIHM/cy5vbmxvYWRlbmQ9QzpzLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFzfHxzLnJlYWR5U3RhdGUhPT00fHxzLnN0YXR1cz09PTAmJiEocy5yZXNwb25zZVVSTCYmcy5yZXNwb25zZVVSTC5pbmRleE9mKCJmaWxlOiIpPT09MCl8fHNldFRpbWVvdXQoQyl9LHMub25hYm9ydD1mdW5jdGlvbigpe3MmJihyKG5ldyBmKCJSZXF1ZXN0IGFib3J0ZWQiLGYuRUNPTk5BQk9SVEVELEEscykpLHM9bnVsbCl9LHMub25lcnJvcj1mdW5jdGlvbigpe3IobmV3IGYoIk5ldHdvcmsgRXJyb3IiLGYuRVJSX05FVFdPUkssQSxzKSkscz1udWxsfSxzLm9udGltZW91dD1mdW5jdGlvbigpe2xldCB1PUEudGltZW91dD8idGltZW91dCBvZiAiK0EudGltZW91dCsibXMgZXhjZWVkZWQiOiJ0aW1lb3V0IGV4Y2VlZGVkIixkPUEudHJhbnNpdGlvbmFsfHxwQTtBLnRpbWVvdXRFcnJvck1lc3NhZ2UmJih1PUEudGltZW91dEVycm9yTWVzc2FnZSkscihuZXcgZih1LGQuY2xhcmlmeVRpbWVvdXRFcnJvcj9mLkVUSU1FRE9VVDpmLkVDT05OQUJPUlRFRCxBLHMpKSxzPW51bGx9LEQuaGFzU3RhbmRhcmRCcm93c2VyRW52JiYoZyYmYS5pc0Z1bmN0aW9uKGcpJiYoZz1nKEEpKSxnfHxnIT09ITEmJmV0KFEpKSl7bGV0IEU9QS54c3JmSGVhZGVyTmFtZSYmQS54c3JmQ29va2llTmFtZSYmQXQucmVhZChBLnhzcmZDb29raWVOYW1lKTtFJiZuLnNldChBLnhzcmZIZWFkZXJOYW1lLEUpfW89PT12b2lkIDAmJm4uc2V0Q29udGVudFR5cGUobnVsbCksInNldFJlcXVlc3RIZWFkZXIiaW4gcyYmYS5mb3JFYWNoKG4udG9KU09OKCksZnVuY3Rpb24odSxkKXtzLnNldFJlcXVlc3RIZWFkZXIoZCx1KX0pLGEuaXNVbmRlZmluZWQoQS53aXRoQ3JlZGVudGlhbHMpfHwocy53aXRoQ3JlZGVudGlhbHM9ISFBLndpdGhDcmVkZW50aWFscyksaSYmaSE9PSJqc29uIiYmKHMucmVzcG9uc2VUeXBlPUEucmVzcG9uc2VUeXBlKSx0eXBlb2YgQS5vbkRvd25sb2FkUHJvZ3Jlc3M9PSJmdW5jdGlvbiImJnMuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLHJ0KEEub25Eb3dubG9hZFByb2dyZXNzLCEwKSksdHlwZW9mIEEub25VcGxvYWRQcm9ncmVzcz09ImZ1bmN0aW9uIiYmcy51cGxvYWQmJnMudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixydChBLm9uVXBsb2FkUHJvZ3Jlc3MpKSwoQS5jYW5jZWxUb2tlbnx8QS5zaWduYWwpJiYobD1FPT57cyYmKHIoIUV8fEUudHlwZT9uZXcgTChudWxsLEEscyk6RSkscy5hYm9ydCgpLHM9bnVsbCl9LEEuY2FuY2VsVG9rZW4mJkEuY2FuY2VsVG9rZW4uc3Vic2NyaWJlKGwpLEEuc2lnbmFsJiYoQS5zaWduYWwuYWJvcnRlZD9sKCk6QS5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLGwpKSk7bGV0IGM9aWUoUSk7aWYoYyYmRC5wcm90b2NvbHMuaW5kZXhPZihjKT09PS0xKXtyKG5ldyBmKCJVbnN1cHBvcnRlZCBwcm90b2NvbCAiK2MrIjoiLGYuRVJSX0JBRF9SRVFVRVNULEEpKTtyZXR1cm59cy5zZW5kKG98fG51bGwpfSl9O3ZhciBzZT17aHR0cDp1QSx4aHI6b3R9O2EuZm9yRWFjaChzZSwoQSxlKT0+e2lmKEEpe3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkoQSwibmFtZSIse3ZhbHVlOmV9KX1jYXRjaHt9T2JqZWN0LmRlZmluZVByb3BlcnR5KEEsImFkYXB0ZXJOYW1lIix7dmFsdWU6ZX0pfX0pO3ZhciBudD1BPT5gLSAke0F9YCxqcj1BPT5hLmlzRnVuY3Rpb24oQSl8fEE9PT1udWxsfHxBPT09ITEseUE9e2dldEFkYXB0ZXI6QT0+e0E9YS5pc0FycmF5KEEpP0E6W0FdO2xldHtsZW5ndGg6ZX09QSx0LHIsbz17fTtmb3IobGV0IG49MDtuPGU7bisrKXt0PUFbbl07bGV0IGk7aWYocj10LCFqcih0KSYmKHI9c2VbKGk9U3RyaW5nKHQpKS50b0xvd2VyQ2FzZSgpXSxyPT09dm9pZCAwKSl0aHJvdyBuZXcgZihgVW5rbm93biBhZGFwdGVyICcke2l9J2ApO2lmKHIpYnJlYWs7b1tpfHwiIyIrbl09cn1pZighcil7bGV0IG49T2JqZWN0LmVudHJpZXMobykubWFwKChbZyxsXSk9PmBhZGFwdGVyICR7Z30gYCsobD09PSExPyJpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBlbnZpcm9ubWVudCI6ImlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGJ1aWxkIikpLGk9ZT9uLmxlbmd0aD4xP2BzaW5jZSA6CmArbi5tYXAobnQpLmpvaW4oYApgKToiICIrbnQoblswXSk6ImFzIG5vIGFkYXB0ZXIgc3BlY2lmaWVkIjt0aHJvdyBuZXcgZigiVGhlcmUgaXMgbm8gc3VpdGFibGUgYWRhcHRlciB0byBkaXNwYXRjaCB0aGUgcmVxdWVzdCAiK2ksIkVSUl9OT1RfU1VQUE9SVCIpfXJldHVybiByfSxhZGFwdGVyczpzZX07ZnVuY3Rpb24gYWUoQSl7aWYoQS5jYW5jZWxUb2tlbiYmQS5jYW5jZWxUb2tlbi50aHJvd0lmUmVxdWVzdGVkKCksQS5zaWduYWwmJkEuc2lnbmFsLmFib3J0ZWQpdGhyb3cgbmV3IEwobnVsbCxBKX1mdW5jdGlvbiBoQShBKXtyZXR1cm4gYWUoQSksQS5oZWFkZXJzPVMuZnJvbShBLmhlYWRlcnMpLEEuZGF0YT10QS5jYWxsKEEsQS50cmFuc2Zvcm1SZXF1ZXN0KSxbInBvc3QiLCJwdXQiLCJwYXRjaCJdLmluZGV4T2YoQS5tZXRob2QpIT09LTEmJkEuaGVhZGVycy5zZXRDb250ZW50VHlwZSgiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwhMSkseUEuZ2V0QWRhcHRlcihBLmFkYXB0ZXJ8fHEuYWRhcHRlcikoQSkudGhlbihmdW5jdGlvbihyKXtyZXR1cm4gYWUoQSksci5kYXRhPXRBLmNhbGwoQSxBLnRyYW5zZm9ybVJlc3BvbnNlLHIpLHIuaGVhZGVycz1TLmZyb20oci5oZWFkZXJzKSxyfSxmdW5jdGlvbihyKXtyZXR1cm4gckEocil8fChhZShBKSxyJiZyLnJlc3BvbnNlJiYoci5yZXNwb25zZS5kYXRhPXRBLmNhbGwoQSxBLnRyYW5zZm9ybVJlc3BvbnNlLHIucmVzcG9uc2UpLHIucmVzcG9uc2UuaGVhZGVycz1TLmZyb20oci5yZXNwb25zZS5oZWFkZXJzKSkpLFByb21pc2UucmVqZWN0KHIpfSl9dmFyIGl0PUE9PkEgaW5zdGFuY2VvZiBTP3suLi5BfTpBO2Z1bmN0aW9uIFQoQSxlKXtlPWV8fHt9O2xldCB0PXt9O2Z1bmN0aW9uIHIoQixJLHMpe3JldHVybiBhLmlzUGxhaW5PYmplY3QoQikmJmEuaXNQbGFpbk9iamVjdChJKT9hLm1lcmdlLmNhbGwoe2Nhc2VsZXNzOnN9LEIsSSk6YS5pc1BsYWluT2JqZWN0KEkpP2EubWVyZ2Uoe30sSSk6YS5pc0FycmF5KEkpP0kuc2xpY2UoKTpJfWZ1bmN0aW9uIG8oQixJLHMpe2lmKGEuaXNVbmRlZmluZWQoSSkpe2lmKCFhLmlzVW5kZWZpbmVkKEIpKXJldHVybiByKHZvaWQgMCxCLHMpfWVsc2UgcmV0dXJuIHIoQixJLHMpfWZ1bmN0aW9uIG4oQixJKXtpZighYS5pc1VuZGVmaW5lZChJKSlyZXR1cm4gcih2b2lkIDAsSSl9ZnVuY3Rpb24gaShCLEkpe2lmKGEuaXNVbmRlZmluZWQoSSkpe2lmKCFhLmlzVW5kZWZpbmVkKEIpKXJldHVybiByKHZvaWQgMCxCKX1lbHNlIHJldHVybiByKHZvaWQgMCxJKX1mdW5jdGlvbiBnKEIsSSxzKXtpZihzIGluIGUpcmV0dXJuIHIoQixJKTtpZihzIGluIEEpcmV0dXJuIHIodm9pZCAwLEIpfWxldCBsPXt1cmw6bixtZXRob2Q6bixkYXRhOm4sYmFzZVVSTDppLHRyYW5zZm9ybVJlcXVlc3Q6aSx0cmFuc2Zvcm1SZXNwb25zZTppLHBhcmFtc1NlcmlhbGl6ZXI6aSx0aW1lb3V0OmksdGltZW91dE1lc3NhZ2U6aSx3aXRoQ3JlZGVudGlhbHM6aSx3aXRoWFNSRlRva2VuOmksYWRhcHRlcjppLHJlc3BvbnNlVHlwZTppLHhzcmZDb29raWVOYW1lOmkseHNyZkhlYWRlck5hbWU6aSxvblVwbG9hZFByb2dyZXNzOmksb25Eb3dubG9hZFByb2dyZXNzOmksZGVjb21wcmVzczppLG1heENvbnRlbnRMZW5ndGg6aSxtYXhCb2R5TGVuZ3RoOmksYmVmb3JlUmVkaXJlY3Q6aSx0cmFuc3BvcnQ6aSxodHRwQWdlbnQ6aSxodHRwc0FnZW50OmksY2FuY2VsVG9rZW46aSxzb2NrZXRQYXRoOmkscmVzcG9uc2VFbmNvZGluZzppLHZhbGlkYXRlU3RhdHVzOmcsaGVhZGVyczooQixJKT0+byhpdChCKSxpdChJKSwhMCl9O3JldHVybiBhLmZvckVhY2goT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSxBLGUpKSxmdW5jdGlvbihJKXtsZXQgcz1sW0ldfHxvLFE9cyhBW0ldLGVbSV0sSSk7YS5pc1VuZGVmaW5lZChRKSYmcyE9PWd8fCh0W0ldPVEpfSksdH12YXIgd0E9IjEuNi44Ijt2YXIgSWU9e307WyJvYmplY3QiLCJib29sZWFuIiwibnVtYmVyIiwiZnVuY3Rpb24iLCJzdHJpbmciLCJzeW1ib2wiXS5mb3JFYWNoKChBLGUpPT57SWVbQV09ZnVuY3Rpb24ocil7cmV0dXJuIHR5cGVvZiByPT09QXx8ImEiKyhlPDE/Im4gIjoiICIpK0F9fSk7dmFyIHN0PXt9O0llLnRyYW5zaXRpb25hbD1mdW5jdGlvbihlLHQscil7ZnVuY3Rpb24gbyhuLGkpe3JldHVybiJbQXhpb3MgdiIrd0ErIl0gVHJhbnNpdGlvbmFsIG9wdGlvbiAnIituKyInIitpKyhyPyIuICIrcjoiIil9cmV0dXJuKG4saSxnKT0+e2lmKGU9PT0hMSl0aHJvdyBuZXcgZihvKGksIiBoYXMgYmVlbiByZW1vdmVkIisodD8iIGluICIrdDoiIikpLGYuRVJSX0RFUFJFQ0FURUQpO3JldHVybiB0JiYhc3RbaV0mJihzdFtpXT0hMCxjb25zb2xlLndhcm4obyhpLCIgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSB2Iit0KyIgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmVhciBmdXR1cmUiKSkpLGU/ZShuLGksZyk6ITB9fTtmdW5jdGlvbiBfcihBLGUsdCl7aWYodHlwZW9mIEEhPSJvYmplY3QiKXRocm93IG5ldyBmKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0IixmLkVSUl9CQURfT1BUSU9OX1ZBTFVFKTtsZXQgcj1PYmplY3Qua2V5cyhBKSxvPXIubGVuZ3RoO2Zvcig7by0tID4wOyl7bGV0IG49cltvXSxpPWVbbl07aWYoaSl7bGV0IGc9QVtuXSxsPWc9PT12b2lkIDB8fGkoZyxuLEEpO2lmKGwhPT0hMCl0aHJvdyBuZXcgZigib3B0aW9uICIrbisiIG11c3QgYmUgIitsLGYuRVJSX0JBRF9PUFRJT05fVkFMVUUpO2NvbnRpbnVlfWlmKHQhPT0hMCl0aHJvdyBuZXcgZigiVW5rbm93biBvcHRpb24gIituLGYuRVJSX0JBRF9PUFRJT04pfX12YXIgREE9e2Fzc2VydE9wdGlvbnM6X3IsdmFsaWRhdG9yczpJZX07dmFyIHg9REEudmFsaWRhdG9ycyxXPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuZGVmYXVsdHM9ZSx0aGlzLmludGVyY2VwdG9ycz17cmVxdWVzdDpuZXcgWEEscmVzcG9uc2U6bmV3IFhBfX1hc3luYyByZXF1ZXN0KGUsdCl7dHJ5e3JldHVybiBhd2FpdCB0aGlzLl9yZXF1ZXN0KGUsdCl9Y2F0Y2gocil7aWYociBpbnN0YW5jZW9mIEVycm9yKXtsZXQgbztFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT9FcnJvci5jYXB0dXJlU3RhY2tUcmFjZShvPXt9KTpvPW5ldyBFcnJvcjtsZXQgbj1vLnN0YWNrP28uc3RhY2sucmVwbGFjZSgvXi4rXG4vLCIiKToiIjtyLnN0YWNrP24mJiFTdHJpbmcoci5zdGFjaykuZW5kc1dpdGgobi5yZXBsYWNlKC9eLitcbi4rXG4vLCIiKSkmJihyLnN0YWNrKz1gCmArbik6ci5zdGFjaz1ufXRocm93IHJ9fV9yZXF1ZXN0KGUsdCl7dHlwZW9mIGU9PSJzdHJpbmciPyh0PXR8fHt9LHQudXJsPWUpOnQ9ZXx8e30sdD1UKHRoaXMuZGVmYXVsdHMsdCk7bGV0e3RyYW5zaXRpb25hbDpyLHBhcmFtc1NlcmlhbGl6ZXI6byxoZWFkZXJzOm59PXQ7ciE9PXZvaWQgMCYmREEuYXNzZXJ0T3B0aW9ucyhyLHtzaWxlbnRKU09OUGFyc2luZzp4LnRyYW5zaXRpb25hbCh4LmJvb2xlYW4pLGZvcmNlZEpTT05QYXJzaW5nOngudHJhbnNpdGlvbmFsKHguYm9vbGVhbiksY2xhcmlmeVRpbWVvdXRFcnJvcjp4LnRyYW5zaXRpb25hbCh4LmJvb2xlYW4pfSwhMSksbyE9bnVsbCYmKGEuaXNGdW5jdGlvbihvKT90LnBhcmFtc1NlcmlhbGl6ZXI9e3NlcmlhbGl6ZTpvfTpEQS5hc3NlcnRPcHRpb25zKG8se2VuY29kZTp4LmZ1bmN0aW9uLHNlcmlhbGl6ZTp4LmZ1bmN0aW9ufSwhMCkpLHQubWV0aG9kPSh0Lm1ldGhvZHx8dGhpcy5kZWZhdWx0cy5tZXRob2R8fCJnZXQiKS50b0xvd2VyQ2FzZSgpO2xldCBpPW4mJmEubWVyZ2Uobi5jb21tb24sblt0Lm1ldGhvZF0pO24mJmEuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiLCJwb3N0IiwicHV0IiwicGF0Y2giLCJjb21tb24iXSxjPT57ZGVsZXRlIG5bY119KSx0LmhlYWRlcnM9Uy5jb25jYXQoaSxuKTtsZXQgZz1bXSxsPSEwO3RoaXMuaW50ZXJjZXB0b3JzLnJlcXVlc3QuZm9yRWFjaChmdW5jdGlvbihFKXt0eXBlb2YgRS5ydW5XaGVuPT0iZnVuY3Rpb24iJiZFLnJ1bldoZW4odCk9PT0hMXx8KGw9bCYmRS5zeW5jaHJvbm91cyxnLnVuc2hpZnQoRS5mdWxmaWxsZWQsRS5yZWplY3RlZCkpfSk7bGV0IEI9W107dGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaChmdW5jdGlvbihFKXtCLnB1c2goRS5mdWxmaWxsZWQsRS5yZWplY3RlZCl9KTtsZXQgSSxzPTAsUTtpZighbCl7bGV0IGM9W2hBLmJpbmQodGhpcyksdm9pZCAwXTtmb3IoYy51bnNoaWZ0LmFwcGx5KGMsZyksYy5wdXNoLmFwcGx5KGMsQiksUT1jLmxlbmd0aCxJPVByb21pc2UucmVzb2x2ZSh0KTtzPFE7KUk9SS50aGVuKGNbcysrXSxjW3MrK10pO3JldHVybiBJfVE9Zy5sZW5ndGg7bGV0IEM9dDtmb3Iocz0wO3M8UTspe2xldCBjPWdbcysrXSxFPWdbcysrXTt0cnl7Qz1jKEMpfWNhdGNoKHUpe0UuY2FsbCh0aGlzLHUpO2JyZWFrfX10cnl7ST1oQS5jYWxsKHRoaXMsQyl9Y2F0Y2goYyl7cmV0dXJuIFByb21pc2UucmVqZWN0KGMpfWZvcihzPTAsUT1CLmxlbmd0aDtzPFE7KUk9SS50aGVuKEJbcysrXSxCW3MrK10pO3JldHVybiBJfWdldFVyaShlKXtlPVQodGhpcy5kZWZhdWx0cyxlKTtsZXQgdD1vQShlLmJhc2VVUkwsZS51cmwpO3JldHVybiBBQSh0LGUucGFyYW1zLGUucGFyYW1zU2VyaWFsaXplcil9fTthLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwib3B0aW9ucyJdLGZ1bmN0aW9uKGUpe1cucHJvdG90eXBlW2VdPWZ1bmN0aW9uKHQscil7cmV0dXJuIHRoaXMucmVxdWVzdChUKHJ8fHt9LHttZXRob2Q6ZSx1cmw6dCxkYXRhOihyfHx7fSkuZGF0YX0pKX19KTthLmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSxmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIpe3JldHVybiBmdW5jdGlvbihuLGksZyl7cmV0dXJuIHRoaXMucmVxdWVzdChUKGd8fHt9LHttZXRob2Q6ZSxoZWFkZXJzOnI/eyJDb250ZW50LVR5cGUiOiJtdWx0aXBhcnQvZm9ybS1kYXRhIn06e30sdXJsOm4sZGF0YTppfSkpfX1XLnByb3RvdHlwZVtlXT10KCksVy5wcm90b3R5cGVbZSsiRm9ybSJdPXQoITApfSk7dmFyIG5BPVc7dmFyIGdlPWNsYXNzIEF7Y29uc3RydWN0b3IoZSl7aWYodHlwZW9mIGUhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpO2xldCB0O3RoaXMucHJvbWlzZT1uZXcgUHJvbWlzZShmdW5jdGlvbihuKXt0PW59KTtsZXQgcj10aGlzO3RoaXMucHJvbWlzZS50aGVuKG89PntpZighci5fbGlzdGVuZXJzKXJldHVybjtsZXQgbj1yLl9saXN0ZW5lcnMubGVuZ3RoO2Zvcig7bi0tID4wOylyLl9saXN0ZW5lcnNbbl0obyk7ci5fbGlzdGVuZXJzPW51bGx9KSx0aGlzLnByb21pc2UudGhlbj1vPT57bGV0IG4saT1uZXcgUHJvbWlzZShnPT57ci5zdWJzY3JpYmUoZyksbj1nfSkudGhlbihvKTtyZXR1cm4gaS5jYW5jZWw9ZnVuY3Rpb24oKXtyLnVuc3Vic2NyaWJlKG4pfSxpfSxlKGZ1bmN0aW9uKG4saSxnKXtyLnJlYXNvbnx8KHIucmVhc29uPW5ldyBMKG4saSxnKSx0KHIucmVhc29uKSl9KX10aHJvd0lmUmVxdWVzdGVkKCl7aWYodGhpcy5yZWFzb24pdGhyb3cgdGhpcy5yZWFzb259c3Vic2NyaWJlKGUpe2lmKHRoaXMucmVhc29uKXtlKHRoaXMucmVhc29uKTtyZXR1cm59dGhpcy5fbGlzdGVuZXJzP3RoaXMuX2xpc3RlbmVycy5wdXNoKGUpOnRoaXMuX2xpc3RlbmVycz1bZV19dW5zdWJzY3JpYmUoZSl7aWYoIXRoaXMuX2xpc3RlbmVycylyZXR1cm47bGV0IHQ9dGhpcy5fbGlzdGVuZXJzLmluZGV4T2YoZSk7dCE9PS0xJiZ0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKHQsMSl9c3RhdGljIHNvdXJjZSgpe2xldCBlO3JldHVybnt0b2tlbjpuZXcgQShmdW5jdGlvbihvKXtlPW99KSxjYW5jZWw6ZX19fSxhdD1nZTtmdW5jdGlvbiBDZShBKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIEEuYXBwbHkobnVsbCx0KX19ZnVuY3Rpb24gQmUoQSl7cmV0dXJuIGEuaXNPYmplY3QoQSkmJkEuaXNBeGlvc0Vycm9yPT09ITB9dmFyIGxlPXtDb250aW51ZToxMDAsU3dpdGNoaW5nUHJvdG9jb2xzOjEwMSxQcm9jZXNzaW5nOjEwMixFYXJseUhpbnRzOjEwMyxPazoyMDAsQ3JlYXRlZDoyMDEsQWNjZXB0ZWQ6MjAyLE5vbkF1dGhvcml0YXRpdmVJbmZvcm1hdGlvbjoyMDMsTm9Db250ZW50OjIwNCxSZXNldENvbnRlbnQ6MjA1LFBhcnRpYWxDb250ZW50OjIwNixNdWx0aVN0YXR1czoyMDcsQWxyZWFkeVJlcG9ydGVkOjIwOCxJbVVzZWQ6MjI2LE11bHRpcGxlQ2hvaWNlczozMDAsTW92ZWRQZXJtYW5lbnRseTozMDEsRm91bmQ6MzAyLFNlZU90aGVyOjMwMyxOb3RNb2RpZmllZDozMDQsVXNlUHJveHk6MzA1LFVudXNlZDozMDYsVGVtcG9yYXJ5UmVkaXJlY3Q6MzA3LFBlcm1hbmVudFJlZGlyZWN0OjMwOCxCYWRSZXF1ZXN0OjQwMCxVbmF1dGhvcml6ZWQ6NDAxLFBheW1lbnRSZXF1aXJlZDo0MDIsRm9yYmlkZGVuOjQwMyxOb3RGb3VuZDo0MDQsTWV0aG9kTm90QWxsb3dlZDo0MDUsTm90QWNjZXB0YWJsZTo0MDYsUHJveHlBdXRoZW50aWNhdGlvblJlcXVpcmVkOjQwNyxSZXF1ZXN0VGltZW91dDo0MDgsQ29uZmxpY3Q6NDA5LEdvbmU6NDEwLExlbmd0aFJlcXVpcmVkOjQxMSxQcmVjb25kaXRpb25GYWlsZWQ6NDEyLFBheWxvYWRUb29MYXJnZTo0MTMsVXJpVG9vTG9uZzo0MTQsVW5zdXBwb3J0ZWRNZWRpYVR5cGU6NDE1LFJhbmdlTm90U2F0aXNmaWFibGU6NDE2LEV4cGVjdGF0aW9uRmFpbGVkOjQxNyxJbUFUZWFwb3Q6NDE4LE1pc2RpcmVjdGVkUmVxdWVzdDo0MjEsVW5wcm9jZXNzYWJsZUVudGl0eTo0MjIsTG9ja2VkOjQyMyxGYWlsZWREZXBlbmRlbmN5OjQyNCxUb29FYXJseTo0MjUsVXBncmFkZVJlcXVpcmVkOjQyNixQcmVjb25kaXRpb25SZXF1aXJlZDo0MjgsVG9vTWFueVJlcXVlc3RzOjQyOSxSZXF1ZXN0SGVhZGVyRmllbGRzVG9vTGFyZ2U6NDMxLFVuYXZhaWxhYmxlRm9yTGVnYWxSZWFzb25zOjQ1MSxJbnRlcm5hbFNlcnZlckVycm9yOjUwMCxOb3RJbXBsZW1lbnRlZDo1MDEsQmFkR2F0ZXdheTo1MDIsU2VydmljZVVuYXZhaWxhYmxlOjUwMyxHYXRld2F5VGltZW91dDo1MDQsSHR0cFZlcnNpb25Ob3RTdXBwb3J0ZWQ6NTA1LFZhcmlhbnRBbHNvTmVnb3RpYXRlczo1MDYsSW5zdWZmaWNpZW50U3RvcmFnZTo1MDcsTG9vcERldGVjdGVkOjUwOCxOb3RFeHRlbmRlZDo1MTAsTmV0d29ya0F1dGhlbnRpY2F0aW9uUmVxdWlyZWQ6NTExfTtPYmplY3QuZW50cmllcyhsZSkuZm9yRWFjaCgoW0EsZV0pPT57bGVbZV09QX0pO3ZhciBJdD1sZTtmdW5jdGlvbiBndChBKXtsZXQgZT1uZXcgbkEoQSksdD1aKG5BLnByb3RvdHlwZS5yZXF1ZXN0LGUpO3JldHVybiBhLmV4dGVuZCh0LG5BLnByb3RvdHlwZSxlLHthbGxPd25LZXlzOiEwfSksYS5leHRlbmQodCxlLG51bGwse2FsbE93bktleXM6ITB9KSx0LmNyZWF0ZT1mdW5jdGlvbihvKXtyZXR1cm4gZ3QoVChBLG8pKX0sdH12YXIgbT1ndChxKTttLkF4aW9zPW5BO20uQ2FuY2VsZWRFcnJvcj1MO20uQ2FuY2VsVG9rZW49YXQ7bS5pc0NhbmNlbD1yQTttLlZFUlNJT049d0E7bS50b0Zvcm1EYXRhPVA7bS5BeGlvc0Vycm9yPWY7bS5DYW5jZWw9bS5DYW5jZWxlZEVycm9yO20uYWxsPWZ1bmN0aW9uKGUpe3JldHVybiBQcm9taXNlLmFsbChlKX07bS5zcHJlYWQ9Q2U7bS5pc0F4aW9zRXJyb3I9QmU7bS5tZXJnZUNvbmZpZz1UO20uQXhpb3NIZWFkZXJzPVM7bS5mb3JtVG9KU09OPUE9PmRBKGEuaXNIVE1MRm9ybShBKT9uZXcgRm9ybURhdGEoQSk6QSk7bS5nZXRBZGFwdGVyPXlBLmdldEFkYXB0ZXI7bS5IdHRwU3RhdHVzQ29kZT1JdDttLmRlZmF1bHQ9bTt2YXIgdj1tO3ZhcntBeGlvczpNcyxBeGlvc0Vycm9yOkhzLENhbmNlbGVkRXJyb3I6WXMsaXNDYW5jZWw6cXMsQ2FuY2VsVG9rZW46S3MsVkVSU0lPTjpXcyxhbGw6dnMsQ2FuY2VsOmpzLGlzQXhpb3NFcnJvcjpfcyxzcHJlYWQ6enMsdG9Gb3JtRGF0YTpWcyxBeGlvc0hlYWRlcnM6WnMsSHR0cFN0YXR1c0NvZGU6WHMsZm9ybVRvSlNPTjokcyxnZXRBZGFwdGVyOkFhLG1lcmdlQ29uZmlnOmVhfT12O2FzeW5jIGZ1bmN0aW9uIHpyKEEsZSl7bGV0IHQ9QSxyPW51bGw7aWYodD09bnVsbClyPW5ldyBXb3JrZXIobmV3IFVSTCgiLi93ZWItd29ya2Vycy9pdGstd2FzbS1waXBlbGluZS53b3JrZXIuanMiLGltcG9ydC5tZXRhLnVybCkse3R5cGU6Im1vZHVsZSJ9KTtlbHNlIGlmKHQuc3RhcnRzV2l0aCgiaHR0cCIpKXtsZXQgbz1hd2FpdCB2LmdldCh0LHtyZXNwb25zZVR5cGU6ImJsb2IiLHBhcmFtczplfSksbj1VUkwuY3JlYXRlT2JqZWN0VVJMKG8uZGF0YSk7cj1uZXcgV29ya2VyKG4se3R5cGU6Im1vZHVsZSJ9KX1lbHNlIHI9bmV3IFdvcmtlcih0LHt0eXBlOiJtb2R1bGUifSk7cmV0dXJuIHJ9dmFyIGlBPXpyO2Z1bmN0aW9uIEN0KEEpe2xldCBlPVdBKEEpLHQ9QTtyZXR1cm4gdC50ZXJtaW5hdGVkPSExLHQud29ya2VyUHJveHk9ZSx0Lm9yaWdpbmFsVGVybWluYXRlPXQudGVybWluYXRlLHQudGVybWluYXRlPSgpPT57dC50ZXJtaW5hdGVkPSEwLHQud29ya2VyUHJveHlbS0FdKCksdC5vcmlnaW5hbFRlcm1pbmF0ZSgpfSx7d29ya2VyUHJveHk6ZSx3b3JrZXI6dH19YXN5bmMgZnVuY3Rpb24gVnIoQSxlLHQpe2xldCByO2lmKEEhPW51bGwpe2xldCBuPUE7cmV0dXJuIG4ud29ya2VyUHJveHkhPT12b2lkIDA/KHI9bi53b3JrZXJQcm94eSx7d29ya2VyUHJveHk6cix3b3JrZXI6bn0pOkN0KEEpfWxldCBvPWF3YWl0IGlBKGUsdCk7cmV0dXJuIEN0KG8pfXZhciBCdD1Wcjthc3luYyBmdW5jdGlvbiBacihBLGUsdCl7bGV0IHI9InVua25vd24iO3R5cGVvZiBBIT0ic3RyaW5nIj9yPUEuaHJlZjpBLnN0YXJ0c1dpdGgoImh0dHAiKT9yPUE6cj10eXBlb2YgZTwidSI/YCR7ZX0vJHtBfWA6QSxyLmVuZHNXaXRoKCIuanMiKSYmKHI9ci5zdWJzdHJpbmcoMCxyLmxlbmd0aC0zKSksci5lbmRzV2l0aCgiLndhc20iKSYmKHI9ci5zdWJzdHJpbmcoMCxyLmxlbmd0aC01KSk7bGV0IG89YCR7cn0ud2FzbWAsaT0oYXdhaXQgdi5nZXQobyx7cmVzcG9uc2VUeXBlOiJhcnJheWJ1ZmZlciIscGFyYW1zOnR9KSkuZGF0YTtyZXR1cm4oYXdhaXQgaW1wb3J0KGAke3J9LmpzYCkpLmRlZmF1bHQoe3dhc21CaW5hcnk6aX0pfXZhciBsdD1acjt2YXIgY3Q9YXN5bmMoKT0+V2ViQXNzZW1ibHkudmFsaWRhdGUobmV3IFVpbnQ4QXJyYXkoWzAsOTcsMTE1LDEwOSwxLDAsMCwwLDEsNSwxLDk2LDAsMSwxMjMsMywyLDEsMCwxMCwxMCwxLDgsMCw2NSwwLDI1MywxNSwyNTMsOTgsMTFdKSk7dmFyIHV0PXR5cGVvZiBnbG9iYWxUaGlzLlNoYXJlZEFycmF5QnVmZmVyPT0iZnVuY3Rpb24iLEV0PW5ldyBUZXh0RW5jb2RlcixRdD1uZXcgVGV4dERlY29kZXIoInV0Zi04Iik7ZnVuY3Rpb24gWHIoQSxlKXtsZXQgdD17ZmxhZ3M6InIiLGVuY29kaW5nOiJiaW5hcnkifSxyPUEuZnNfb3BlbihlLHQuZmxhZ3MpLG49QS5mc19zdGF0KGUpLnNpemUsaT1udWxsO3V0P2k9bmV3IFNoYXJlZEFycmF5QnVmZmVyKG4pOmk9bmV3IEFycmF5QnVmZmVyKG4pO2xldCBnPW5ldyBVaW50OEFycmF5KGkpO3JldHVybiBBLmZzX3JlYWQocixnLDAsbiwwKSxBLmZzX2Nsb3NlKHIpLGd9ZnVuY3Rpb24gZnQoQSxlLHQpe2xldCByPW51bGw7dXQ/cj1uZXcgU2hhcmVkQXJyYXlCdWZmZXIodCk6cj1uZXcgQXJyYXlCdWZmZXIodCk7bGV0IG89bmV3IFVpbnQ4QXJyYXkociksbj1uZXcgVWludDhBcnJheShBLkhFQVBVOC5idWZmZXIsZSx0KTtyZXR1cm4gby5zZXQobiksb31mdW5jdGlvbiBoKEEsZSx0LHIpe2xldCBvPTA7cmV0dXJuIGUhPT1udWxsJiYobz1BLmNjYWxsKCJpdGtfd2FzbV9pbnB1dF9hcnJheV9hbGxvYyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCx0LHIsZS5idWZmZXIuYnl0ZUxlbmd0aF0pLEEuSEVBUFU4LnNldChuZXcgVWludDhBcnJheShlLmJ1ZmZlciksbykpLG99ZnVuY3Rpb24gSihBLGUsdCl7bGV0IHI9SlNPTi5zdHJpbmdpZnkoZSksbz1BLmxlbmd0aEJ5dGVzVVRGOChyKSsxLG49QS5jY2FsbCgiaXRrX3dhc21faW5wdXRfanNvbl9hbGxvYyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCx0LG9dKTtBLnN0cmluZ1RvVVRGOChyLG4sbyl9ZnVuY3Rpb24gYihBLGUsdCxyKXtsZXQgbz1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfYWRkcmVzcyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxlLHRdKSxuPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9zaXplIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLGUsdF0pLGk9ZnQoQSxvLG4pO3JldHVybiB3KHIsaS5idWZmZXIpfWZ1bmN0aW9uIFNBKEEsZSl7bGV0IHQ9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2pzb25fYWRkcmVzcyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiXSxbMCxlXSkscj1BLlVURjhUb1N0cmluZyh0KTtyZXR1cm4gSlNPTi5wYXJzZShyKX1mdW5jdGlvbiAkcihBLGUsdCxyKXtyIT1udWxsJiZyLmxlbmd0aD4wJiZyLmZvckVhY2goZnVuY3Rpb24oQixJKXtzd2l0Y2goQi50eXBlKXtjYXNlIHAuVGV4dFN0cmVhbTp7bGV0IHM9RXQuZW5jb2RlKEIuZGF0YS5kYXRhKSxRPWgoQSxzLEksMCksQz17c2l6ZTpzLmJ1ZmZlci5ieXRlTGVuZ3RoLGRhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtRfWB9O0ooQSxDLEkpO2JyZWFrfWNhc2UgcC5Kc29uQ29tcGF0aWJsZTp7bGV0IHM9RXQuZW5jb2RlKEpTT04uc3RyaW5naWZ5KEIuZGF0YSkpLFE9aChBLHMsSSwwKSxDPXtzaXplOnMuYnVmZmVyLmJ5dGVMZW5ndGgsZGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke1F9YH07SihBLEMsSSk7YnJlYWt9Y2FzZSBwLkJpbmFyeVN0cmVhbTp7bGV0IHM9Qi5kYXRhLmRhdGEsUT1oKEEscyxJLDApLEM9e3NpemU6cy5idWZmZXIuYnl0ZUxlbmd0aCxkYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7UX1gfTtKKEEsQyxJKTticmVha31jYXNlIHAuVGV4dEZpbGU6e0EuZnNfd3JpdGVGaWxlKEIuZGF0YS5wYXRoLEIuZGF0YS5kYXRhKTticmVha31jYXNlIHAuQmluYXJ5RmlsZTp7QS5mc193cml0ZUZpbGUoQi5kYXRhLnBhdGgsQi5kYXRhLmRhdGEpO2JyZWFrfWNhc2UgcC5JbWFnZTp7bGV0IHM9Qi5kYXRhLFE9aChBLHMuZGF0YSxJLDApLEM9aChBLHMuZGlyZWN0aW9uLEksMSksYz10eXBlb2Ygcy5tZXRhZGF0YT8uZW50cmllczwidSI/QXJyYXkuZnJvbShzLm1ldGFkYXRhLmVudHJpZXMoKSk6W10sRT17aW1hZ2VUeXBlOnMuaW1hZ2VUeXBlLG5hbWU6cy5uYW1lLG9yaWdpbjpzLm9yaWdpbixzcGFjaW5nOnMuc3BhY2luZyxkaXJlY3Rpb246YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtDfWAsc2l6ZTpzLnNpemUsZGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke1F9YCxtZXRhZGF0YTpjfTtKKEEsRSxJKTticmVha31jYXNlIHAuTWVzaDp7bGV0IHM9Qi5kYXRhLFE9aChBLHMucG9pbnRzLEksMCksQz1oKEEscy5jZWxscyxJLDEpLGM9aChBLHMucG9pbnREYXRhLEksMiksRT1oKEEscy5jZWxsRGF0YSxJLDMpLHU9e21lc2hUeXBlOnMubWVzaFR5cGUsbmFtZTpzLm5hbWUsbnVtYmVyT2ZQb2ludHM6cy5udW1iZXJPZlBvaW50cyxwb2ludHM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtRfWAsbnVtYmVyT2ZDZWxsczpzLm51bWJlck9mQ2VsbHMsY2VsbHM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtDfWAsY2VsbEJ1ZmZlclNpemU6cy5jZWxsQnVmZmVyU2l6ZSxudW1iZXJPZlBvaW50UGl4ZWxzOnMubnVtYmVyT2ZQb2ludFBpeGVscyxwb2ludERhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtjfWAsbnVtYmVyT2ZDZWxsUGl4ZWxzOnMubnVtYmVyT2ZDZWxsUGl4ZWxzLGNlbGxEYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7RX1gfTtKKEEsdSxJKTticmVha31jYXNlIHAuUG9pbnRTZXQ6e2xldCBzPUIuZGF0YSxRPWgoQSxzLnBvaW50cyxJLDApLEM9aChBLHMucG9pbnREYXRhLEksMSksYz17cG9pbnRTZXRUeXBlOnMucG9pbnRTZXRUeXBlLG5hbWU6cy5uYW1lLG51bWJlck9mUG9pbnRzOnMubnVtYmVyT2ZQb2ludHMscG9pbnRzOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7UX1gLG51bWJlck9mUG9pbnRQaXhlbHM6cy5udW1iZXJPZlBvaW50UGl4ZWxzLHBvaW50RGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke0N9YH07SihBLGMsSSk7YnJlYWt9Y2FzZSBwLlBvbHlEYXRhOntsZXQgcz1CLmRhdGEsUT1oKEEscy5wb2ludHMsSSwwKSxDPWgoQSxzLnZlcnRpY2VzLEksMSksYz1oKEEscy5saW5lcyxJLDIpLEU9aChBLHMucG9seWdvbnMsSSwzKSx1PWgoQSxzLnRyaWFuZ2xlU3RyaXBzLEksNCksZD1oKEEscy5wb2ludERhdGEsSSw1KSxGPWgoQSxzLnBvaW50RGF0YSxJLDYpLFU9e3BvbHlEYXRhVHlwZTpzLnBvbHlEYXRhVHlwZSxuYW1lOnMubmFtZSxudW1iZXJPZlBvaW50czpzLm51bWJlck9mUG9pbnRzLHBvaW50czpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke1F9YCx2ZXJ0aWNlc0J1ZmZlclNpemU6cy52ZXJ0aWNlc0J1ZmZlclNpemUsdmVydGljZXM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtDfWAsbGluZXNCdWZmZXJTaXplOnMubGluZXNCdWZmZXJTaXplLGxpbmVzOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Y31gLHBvbHlnb25zQnVmZmVyU2l6ZTpzLnBvbHlnb25zQnVmZmVyU2l6ZSxwb2x5Z29uczpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke0V9YCx0cmlhbmdsZVN0cmlwc0J1ZmZlclNpemU6cy50cmlhbmdsZVN0cmlwc0J1ZmZlclNpemUsdHJpYW5nbGVTdHJpcHM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHt1fWAsbnVtYmVyT2ZQb2ludFBpeGVsczpzLm51bWJlck9mUG9pbnRQaXhlbHMscG9pbnREYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7ZH1gLG51bWJlck9mQ2VsbFBpeGVsczpzLm51bWJlck9mQ2VsbFBpeGVscyxjZWxsRGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke0Z9YH07SihBLFUsSSk7YnJlYWt9ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5zdXBwb3J0ZWQgaW5wdXQgSW50ZXJmYWNlVHlwZSIpfX0pLEEucmVzZXRNb2R1bGVTdGRvdXQoKSxBLnJlc2V0TW9kdWxlU3RkZXJyKCk7bGV0IG89QS5zdGFja1NhdmUoKSxuPTA7dHJ5e249QS5jYWxsTWFpbihlLnNsaWNlKCkpfWNhdGNoKEIpe3Rocm93IHR5cGVvZiBCPT0ibnVtYmVyIiYmKGNvbnNvbGUubG9nKCJFeGNlcHRpb24gd2hpbGUgcnVubmluZyBwaXBlbGluZToiKSxjb25zb2xlLmxvZygic3Rkb3V0OiIsQS5nZXRNb2R1bGVTdGRvdXQoKSksY29uc29sZS5lcnJvcigic3RkZXJyOiIsQS5nZXRNb2R1bGVTdGRlcnIoKSksdHlwZW9mIEEuZ2V0RXhjZXB0aW9uTWVzc2FnZTwidSI/Y29uc29sZS5lcnJvcigiZXhjZXB0aW9uOiIsQS5nZXRFeGNlcHRpb25NZXNzYWdlKEIpKTpjb25zb2xlLmVycm9yKCJCdWlsZCBtb2R1bGUgaW4gRGVidWcgbW9kZSBmb3IgZXhjZXB0aW9uIG1lc3NhZ2UgaW5mb3JtYXRpb24uIikpLEJ9ZmluYWxseXtBLnN0YWNrUmVzdG9yZShvKX1sZXQgaT1BLmdldE1vZHVsZVN0ZG91dCgpLGc9QS5nZXRNb2R1bGVTdGRlcnIoKSxsPVtdO3JldHVybiB0IT1udWxsJiZ0Lmxlbmd0aD4wJiZuPT09MCYmdC5mb3JFYWNoKGZ1bmN0aW9uKEIsSSl7bGV0IHM9bnVsbDtzd2l0Y2goQi50eXBlKXtjYXNlIHAuVGV4dFN0cmVhbTp7bGV0IEM9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X2FkZHJlc3MiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAsSSwwXSksYz1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfc2l6ZSIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxJLDBdKSxFPW5ldyBVaW50OEFycmF5KEEuSEVBUFU4LmJ1ZmZlcixDLGMpO3M9e2RhdGE6UXQuZGVjb2RlKEUpfTticmVha31jYXNlIHAuSnNvbkNvbXBhdGlibGU6e2xldCBDPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9hZGRyZXNzIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLEksMF0pLGM9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X3NpemUiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAsSSwwXSksRT1uZXcgVWludDhBcnJheShBLkhFQVBVOC5idWZmZXIsQyxjKTtzPUpTT04ucGFyc2UoUXQuZGVjb2RlKEUpKTticmVha31jYXNlIHAuQmluYXJ5U3RyZWFtOntsZXQgQz1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfYWRkcmVzcyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxJLDBdKSxjPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9zaXplIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLEksMF0pO3M9e2RhdGE6ZnQoQSxDLGMpfTticmVha31jYXNlIHAuVGV4dEZpbGU6e3M9e3BhdGg6Qi5kYXRhLnBhdGgsZGF0YTpBLmZzX3JlYWRGaWxlKEIuZGF0YS5wYXRoLHtlbmNvZGluZzoidXRmOCJ9KX07YnJlYWt9Y2FzZSBwLkJpbmFyeUZpbGU6e3M9e3BhdGg6Qi5kYXRhLnBhdGgsZGF0YTpYcihBLEIuZGF0YS5wYXRoKX07YnJlYWt9Y2FzZSBwLkltYWdlOntsZXQgQz1TQShBLEkpO0MuZGF0YT1iKEEsSSwwLEMuaW1hZ2VUeXBlLmNvbXBvbmVudFR5cGUpLEMuZGlyZWN0aW9uPWIoQSxJLDEsay5GbG9hdDY0KSxDLm1ldGFkYXRhPW5ldyBNYXAoQy5tZXRhZGF0YSkscz1DO2JyZWFrfWNhc2UgcC5NZXNoOntsZXQgQz1TQShBLEkpO0MubnVtYmVyT2ZQb2ludHM+MD9DLnBvaW50cz1iKEEsSSwwLEMubWVzaFR5cGUucG9pbnRDb21wb25lbnRUeXBlKTpDLnBvaW50cz13KEMubWVzaFR5cGUucG9pbnRDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSksQy5udW1iZXJPZkNlbGxzPjA/Qy5jZWxscz1iKEEsSSwxLEMubWVzaFR5cGUuY2VsbENvbXBvbmVudFR5cGUpOkMuY2VsbHM9dyhDLm1lc2hUeXBlLmNlbGxDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSksQy5udW1iZXJPZlBvaW50UGl4ZWxzPjA/Qy5wb2ludERhdGE9YihBLEksMixDLm1lc2hUeXBlLnBvaW50UGl4ZWxDb21wb25lbnRUeXBlKTpDLnBvaW50RGF0YT13KEMubWVzaFR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxDLm51bWJlck9mQ2VsbFBpeGVscz4wP0MuY2VsbERhdGE9YihBLEksMyxDLm1lc2hUeXBlLmNlbGxQaXhlbENvbXBvbmVudFR5cGUpOkMuY2VsbERhdGE9dyhDLm1lc2hUeXBlLmNlbGxQaXhlbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxzPUM7YnJlYWt9Y2FzZSBwLlBvaW50U2V0OntsZXQgQz1TQShBLEkpO0MubnVtYmVyT2ZQb2ludHM+MD9DLnBvaW50cz1iKEEsSSwwLEMucG9pbnRTZXRUeXBlLnBvaW50Q29tcG9uZW50VHlwZSk6Qy5wb2ludHM9dyhDLnBvaW50U2V0VHlwZS5wb2ludENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxDLm51bWJlck9mUG9pbnRQaXhlbHM+MD9DLnBvaW50RGF0YT1iKEEsSSwxLEMucG9pbnRTZXRUeXBlLnBvaW50UGl4ZWxDb21wb25lbnRUeXBlKTpDLnBvaW50RGF0YT13KEMucG9pbnRTZXRUeXBlLnBvaW50UGl4ZWxDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSkscz1DO2JyZWFrfWNhc2UgcC5Qb2x5RGF0YTp7bGV0IEM9U0EoQSxJKTtDLm51bWJlck9mUG9pbnRzPjA/Qy5wb2ludHM9YihBLEksMCxrLkZsb2F0MzIpOkMucG9pbnRzPW5ldyBGbG9hdDMyQXJyYXksQy52ZXJ0aWNlc0J1ZmZlclNpemU+MD9DLnZlcnRpY2VzPWIoQSxJLDEseS5VSW50MzIpOkMudmVydGljZXM9bmV3IFVpbnQzMkFycmF5LEMubGluZXNCdWZmZXJTaXplPjA/Qy5saW5lcz1iKEEsSSwyLHkuVUludDMyKTpDLmxpbmVzPW5ldyBVaW50MzJBcnJheSxDLnBvbHlnb25zQnVmZmVyU2l6ZT4wP0MucG9seWdvbnM9YihBLEksMyx5LlVJbnQzMik6Qy5wb2x5Z29ucz1uZXcgVWludDMyQXJyYXksQy50cmlhbmdsZVN0cmlwc0J1ZmZlclNpemU+MD9DLnRyaWFuZ2xlU3RyaXBzPWIoQSxJLDQseS5VSW50MzIpOkMudHJpYW5nbGVTdHJpcHM9bmV3IFVpbnQzMkFycmF5LEMubnVtYmVyT2ZQb2ludFBpeGVscz4wP0MucG9pbnREYXRhPWIoQSxJLDUsQy5wb2x5RGF0YVR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUpOkMucG9pbnREYXRhPXcoQy5wb2x5RGF0YVR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxDLm51bWJlck9mQ2VsbFBpeGVscz4wP0MuY2VsbERhdGE9YihBLEksNixDLnBvbHlEYXRhVHlwZS5jZWxsUGl4ZWxDb21wb25lbnRUeXBlKTpDLmNlbGxEYXRhPXcoQy5wb2x5RGF0YVR5cGUuY2VsbFBpeGVsQ29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLHM9QzticmVha31kZWZhdWx0OnRocm93IEVycm9yKCJVbnN1cHBvcnRlZCBvdXRwdXQgSW50ZXJmYWNlVHlwZSIpfWxldCBRPXt0eXBlOkIudHlwZSxkYXRhOnN9O2wucHVzaChRKX0pLHtyZXR1cm5WYWx1ZTpuLHN0ZG91dDppLHN0ZGVycjpnLG91dHB1dHM6bH19dmFyIHB0PSRyO3ZhciBBbz10eXBlb2YgZ2xvYmFsVGhpcy5TaGFyZWRBcnJheUJ1ZmZlcjwidSI7ZnVuY3Rpb24gZW8oQSxlKXtpZihBPT1udWxsKXJldHVybltdO2xldCB0PVtdO2ZvcihsZXQgcj0wO3I8QS5sZW5ndGg7cisrKXtsZXQgbz10byhBW3JdLGUpO28hPT1udWxsJiZ0LnB1c2gobyl9cmV0dXJuIHR9ZnVuY3Rpb24gdG8oQSxlKXtpZihBPT1udWxsKXJldHVybiBudWxsO2xldCB0PW51bGw7cmV0dXJuIEEuYnVmZmVyIT09dm9pZCAwP3Q9QS5idWZmZXI6QS5ieXRlTGVuZ3RoIT09dm9pZCAwJiYodD1BKSxBbyYmdCBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyP251bGw6ZT90OnQuc2xpY2UoMCl9dmFyIGR0PWVvO2Z1bmN0aW9uIHJvKEEpe3JldHVybltBLmRhdGEsQS5kaXJlY3Rpb25dfXZhciBtdD1ybztmdW5jdGlvbiBvbyhBKXtyZXR1cm5bQS5wb2ludHMsQS5wb2ludERhdGEsQS5jZWxscyxBLmNlbGxEYXRhXX12YXIgeXQ9b287ZnVuY3Rpb24gbm8oQSl7cmV0dXJuW0EucG9pbnRzLEEudmVydGljZXMsQS5saW5lcyxBLnBvbHlnb25zLEEudHJpYW5nbGVTdHJpcHMsQS5wb2ludERhdGEsQS5jZWxsRGF0YV19dmFyIGh0PW5vO3ZhciBpbztmdW5jdGlvbiBiQSgpe3JldHVybiBpb312YXIgc287ZnVuY3Rpb24gd3QoKXtyZXR1cm4gc299dmFyIGFvO2Z1bmN0aW9uIGtBKCl7cmV0dXJuIGFvfXZhciBjZT1uZXcgTWFwO2Z1bmN0aW9uIElvKCl7bGV0IEE9a0EoKTtyZXR1cm4gdHlwZW9mIEE+InUiJiYoQT1udWxsKSxBfWZ1bmN0aW9uIER0KCl7bGV0IEE9YkEoKTtyZXR1cm4gdHlwZW9mIEE+InUiJiYoQT1uZXcgVVJMKCIvcGlwZWxpbmVzIixkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW4pLmhyZWYpLEF9ZnVuY3Rpb24gUkEoKXtsZXQgQT13dCgpO3JldHVybiB0eXBlb2YgQT4idSImJihBPXt9KSxBfWFzeW5jIGZ1bmN0aW9uIGdvKEEsZSx0KXtsZXQgcj1BLG89QTtpZih0eXBlb2YgQSE9InN0cmluZyImJihyPW5ldyBVUkwoQS5ocmVmKSxvPXIuaHJlZiksY2UuaGFzKG8pKXJldHVybiBjZS5nZXQobyk7e2xldCBuPWF3YWl0IGx0KEEsZT8udG9TdHJpbmcoKT8/RHQoKSx0Pz9SQSgpKTtyZXR1cm4gY2Uuc2V0KG8sbiksbn19YXN5bmMgZnVuY3Rpb24gQ28oQSxlLHQscixvKXtpZighYXdhaXQgY3QoKSl7bGV0IHU9IldlYkFzc2VtYmx5IFNJTUQgc3VwcG9ydCBpcyByZXF1aXJlZCAtLSBwbGVhc2UgdXBkYXRlIHlvdXIgYnJvd3Nlci4iO3Rocm93IGFsZXJ0KHUpLG5ldyBFcnJvcih1KX1sZXQgbj1vPy53ZWJXb3JrZXI/P251bGw7aWYobj09PSExKXtsZXQgdT1hd2FpdCBnbyhBLnRvU3RyaW5nKCksbz8ucGlwZWxpbmVCYXNlVXJsLG8/LnBpcGVsaW5lUXVlcnlQYXJhbXM/P1JBKCkpO3JldHVybiBwdCh1LGUsdCxyKX1sZXQgaT1uLGc9bz8ucGlwZWxpbmVXb3JrZXJVcmw/P0lvKCksbD10eXBlb2YgZyE9InN0cmluZyImJnR5cGVvZiBnPy5ocmVmPCJ1Ij9nLmhyZWY6Zyx7d29ya2VyUHJveHk6Qix3b3JrZXI6SX09YXdhaXQgQnQoaSxsLG8/LnBpcGVsaW5lUXVlcnlQYXJhbXM/P1JBKCkpO2k9STtsZXQgcz1bXTtyIT1udWxsJiZyLmxlbmd0aD4wJiZyLmZvckVhY2goZnVuY3Rpb24odSl7aWYodS50eXBlPT09cC5CaW5hcnlTdHJlYW0pe2xldCBkPXUuZGF0YS5kYXRhO3MucHVzaChkKX1lbHNlIGlmKHUudHlwZT09PXAuQmluYXJ5RmlsZSl7bGV0IGQ9dS5kYXRhLmRhdGE7cy5wdXNoKGQpfWVsc2UgaWYodS50eXBlPT09cC5JbWFnZSl7bGV0IGQ9dS5kYXRhO2QuZGF0YSE9PW51bGwmJnMucHVzaCguLi5tdChkKSl9ZWxzZSBpZih1LnR5cGU9PT1wLk1lc2gpe2xldCBkPXUuZGF0YTtzLnB1c2goLi4ueXQoZCkpfWVsc2UgaWYodS50eXBlPT09cC5Qb2x5RGF0YSl7bGV0IGQ9dS5kYXRhO3MucHVzaCguLi5odChkKSl9fSk7bGV0IFE9bz8ucGlwZWxpbmVCYXNlVXJsPz9EdCgpLEM9dHlwZW9mIFEhPSJzdHJpbmciJiZ0eXBlb2YgUT8uaHJlZjwidSI/US5ocmVmOlEsYz1yIT1udWxsP3ZBKHIsZHQocyxvPy5ub0NvcHkpKTpudWxsLEU9YXdhaXQgQi5ydW5QaXBlbGluZShBLnRvU3RyaW5nKCksQyxlLHQsYyxvPy5waXBlbGluZVF1ZXJ5UGFyYW1zPz9SQSgpKTtyZXR1cm57cmV0dXJuVmFsdWU6RS5yZXR1cm5WYWx1ZSxzdGRvdXQ6RS5zdGRvdXQsc3RkZXJyOkUuc3RkZXJyLG91dHB1dHM6RS5vdXRwdXRzLHdlYldvcmtlcjppfX12YXIgc0E9Q287dmFyIEJvPW51bGw7ZnVuY3Rpb24gU3QoKXtyZXR1cm4gQm99dmFyIEVlLGxvPWBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BpdGstd2FzbS9jb21wcmVzcy1zdHJpbmdpZnlAJHtOQX0vZGlzdC9waXBlbGluZXNgO2Z1bmN0aW9uIFdhKEEpe0VlPUF9ZnVuY3Rpb24gRkEoKXtpZih0eXBlb2YgRWU8InUiKXJldHVybiBFZTtsZXQgQT1iQSgpO3JldHVybiB0eXBlb2YgQTwidSI/QTpsb312YXIgUWUsY289bnVsbDtmdW5jdGlvbiBidChBKXtRZT1BfWZ1bmN0aW9uIGooKXtpZih0eXBlb2YgUWU8InUiKXJldHVybiBRZTtsZXQgQT1rQSgpO3JldHVybiB0eXBlb2YgQTwidSI/QTpjb312YXIgXz1udWxsO2FzeW5jIGZ1bmN0aW9uIGt0KCl7bGV0IEE9aigpLGU9dHlwZW9mIEEhPSJzdHJpbmciJiZ0eXBlb2YgQT8uaHJlZjwidSI/QS5ocmVmOkE7Xz1hd2FpdCBpQShlKX1mdW5jdGlvbiBYYShBKXtfPUF9YXN5bmMgZnVuY3Rpb24gVUEoKXtpZihfIT09bnVsbClyZXR1cm4gXy50ZXJtaW5hdGVkJiZhd2FpdCBrdCgpLF87bGV0IEE9U3QoKTtyZXR1cm4gQSE9PW51bGw/QTooYXdhaXQga3QoKSxfKX1hc3luYyBmdW5jdGlvbiBFbyhBLGU9e30pe2xldCB0PVt7dHlwZTpwLkJpbmFyeVN0cmVhbX1dLHI9W3t0eXBlOnAuQmluYXJ5U3RyZWFtLGRhdGE6e2RhdGE6QX19XSxvPVtdO28ucHVzaCgiMCIpLG8ucHVzaCgiMCIpLG8ucHVzaCgiLS1tZW1vcnktaW8iKSxlLnN0cmluZ2lmeSYmZS5zdHJpbmdpZnkmJm8ucHVzaCgiLS1zdHJpbmdpZnkiKSxlLmNvbXByZXNzaW9uTGV2ZWwmJm8ucHVzaCgiLS1jb21wcmVzc2lvbi1sZXZlbCIsZS5jb21wcmVzc2lvbkxldmVsLnRvU3RyaW5nKCkpLGUuZGF0YVVybFByZWZpeCYmby5wdXNoKCItLWRhdGEtdXJsLXByZWZpeCIsZS5kYXRhVXJsUHJlZml4LnRvU3RyaW5nKCkpO2xldCBnPSJjb21wcmVzcy1zdHJpbmdpZnkiLGw9ZT8ud2ViV29ya2VyO2w9PT12b2lkIDAmJihsPWF3YWl0IFVBKCkpO2xldHt3ZWJXb3JrZXI6QixyZXR1cm5WYWx1ZTpJLHN0ZGVycjpzLG91dHB1dHM6UX09YXdhaXQgc0EoZyxvLHQscix7cGlwZWxpbmVCYXNlVXJsOkZBKCkscGlwZWxpbmVXb3JrZXJVcmw6aigpLHdlYldvcmtlcjpsLG5vQ29weTplPy5ub0NvcHl9KTtpZihJIT09MCYmcyE9PSIiKXRocm93IG5ldyBFcnJvcihzKTtyZXR1cm57d2ViV29ya2VyOkIsb3V0cHV0OihRWzBdPy5kYXRhKS5kYXRhfX12YXIgej1Fbzthc3luYyBmdW5jdGlvbiBRbyhBLGU9e30pe2xldCB0PVt7dHlwZTpwLkJpbmFyeVN0cmVhbX1dLHI9W3t0eXBlOnAuQmluYXJ5U3RyZWFtLGRhdGE6e2RhdGE6QX19XSxvPVtdO28ucHVzaCgiMCIpLG8ucHVzaCgiMCIpLG8ucHVzaCgiLS1tZW1vcnktaW8iKSxlLnBhcnNlU3RyaW5nJiZlLnBhcnNlU3RyaW5nJiZvLnB1c2goIi0tcGFyc2Utc3RyaW5nIik7bGV0IGc9InBhcnNlLXN0cmluZy1kZWNvbXByZXNzIixsPWU/LndlYldvcmtlcjtsPT09dm9pZCAwJiYobD1hd2FpdCBVQSgpKTtsZXR7d2ViV29ya2VyOkIscmV0dXJuVmFsdWU6SSxzdGRlcnI6cyxvdXRwdXRzOlF9PWF3YWl0IHNBKGcsbyx0LHIse3BpcGVsaW5lQmFzZVVybDpGQSgpLHBpcGVsaW5lV29ya2VyVXJsOmooKSx3ZWJXb3JrZXI6bCxub0NvcHk6ZT8ubm9Db3B5fSk7aWYoSSE9PTAmJnMhPT0iIil0aHJvdyBuZXcgRXJyb3Iocyk7cmV0dXJue3dlYldvcmtlcjpCLG91dHB1dDooUVswXT8uZGF0YSkuZGF0YX19dmFyIFY9UW87YXN5bmMgZnVuY3Rpb24gdW8oQSxlPXt9KXtsZXQgcj1uZXcgUEEoQS5pbWFnZVR5cGUpO3Iub3JpZ2luPUEub3JpZ2luLHIuc3BhY2luZz1BLnNwYWNpbmcsci5zaXplPUEuc2l6ZSxyLm1ldGFkYXRhPUEubWV0YWRhdGE7bGV0IG89bmV3IFRleHREZWNvZGVyKCJ1dGYtOCIpLG49bmV3IFVpbnQ4QXJyYXkoQS5kaXJlY3Rpb24uYnVmZmVyKSxpPWF3YWl0IHoobix7Y29tcHJlc3Npb25MZXZlbDo1LHN0cmluZ2lmeTohMCx3ZWJXb3JrZXI6ZS53ZWJXb3JrZXIsbm9Db3B5OmUubm9Db3B5fSksZz1pLndlYldvcmtlcjtpZihyLmRpcmVjdGlvbj1vLmRlY29kZShpLm91dHB1dC5idWZmZXIpLEEuZGF0YT09PW51bGwpci5kYXRhPW51bGw7ZWxzZXtsZXQgbD1uZXcgVWludDhBcnJheShBLmRhdGEuYnVmZmVyKSxCPWF3YWl0IHoobCx7Y29tcHJlc3Npb25MZXZlbDo1LHN0cmluZ2lmeTohMCx3ZWJXb3JrZXI6Zyxub0NvcHk6ZS5ub0NvcHl9KTtyLmRhdGE9by5kZWNvZGUoQi5vdXRwdXQuYnVmZmVyKX1yZXR1cm57ZW5jb2RlZDpyLHdlYldvcmtlcjpnfX1hc3luYyBmdW5jdGlvbiBmbyhBLGU9e30pe2xldCB0PUEscj1uZXcgVGV4dEVuY29kZXIsbz1uZXcgVWludDhBcnJheShyLmVuY29kZShBLmRpcmVjdGlvbikpLG49YXdhaXQgVihvLHtwYXJzZVN0cmluZzohMCx3ZWJXb3JrZXI6ZS53ZWJXb3JrZXIsbm9Db3B5OiEwfSksaT1uLndlYldvcmtlcjtpZih0LmRpcmVjdGlvbj1uZXcgRmxvYXQ2NEFycmF5KG4ub3V0cHV0LmJ1ZmZlciksIXQuZGF0YSl0LmRhdGE9bnVsbDtlbHNle2xldCBnPW5ldyBVaW50OEFycmF5KHIuZW5jb2RlKEEuZGF0YSkpLGw9YXdhaXQgVihnLHtwYXJzZVN0cmluZzohMCx3ZWJXb3JrZXI6aSxub0NvcHk6ITB9KTt0LmRhdGE9dyh0LmltYWdlVHlwZS5jb21wb25lbnRUeXBlLGwub3V0cHV0LmJ1ZmZlcil9cmV0dXJue2RlY29kZWQ6dCx3ZWJXb3JrZXI6aX19YXN5bmMgZnVuY3Rpb24gcG8oQSxlPXt9KXtsZXQgcj1uZXcgT0EoQS5tZXNoVHlwZSk7ci5uYW1lPUEubmFtZSxyLm51bWJlck9mUG9pbnRzPUEubnVtYmVyT2ZQb2ludHMsci5udW1iZXJPZkNlbGxzPUEubnVtYmVyT2ZDZWxscyxyLm51bWJlck9mUG9pbnRQaXhlbHM9QS5udW1iZXJPZlBvaW50UGl4ZWxzLHIubnVtYmVyT2ZDZWxsUGl4ZWxzPUEubnVtYmVyT2ZDZWxsUGl4ZWxzLHIuY2VsbEJ1ZmZlclNpemU9QS5jZWxsQnVmZmVyU2l6ZTtsZXQgbz1lLndlYldvcmtlcixuPW5ldyBUZXh0RGVjb2RlcigidXRmLTgiKTtmb3IobGV0IGkgb2ZbInBvaW50cyIsInBvaW50RGF0YSIsImNlbGxzIiwiY2VsbERhdGEiXSlpZihBW2ldPT09bnVsbClyW2ldPW51bGw7ZWxzZXtsZXQgZz1uZXcgVWludDhBcnJheShBW2ldLmJ1ZmZlciksbD1hd2FpdCB6KGcse2NvbXByZXNzaW9uTGV2ZWw6NSxzdHJpbmdpZnk6ITAsd2ViV29ya2VyOm8sbm9Db3B5OmUubm9Db3B5fSk7bz1sLndlYldvcmtlcixyW2ldPW4uZGVjb2RlKGwub3V0cHV0LmJ1ZmZlcil9cmV0dXJue2VuY29kZWQ6cix3ZWJXb3JrZXI6b319YXN5bmMgZnVuY3Rpb24gbW8oQSxlPXt9KXtsZXQgdD1BLHI9bmV3IE1hcChbWyJwb2ludHMiLCJwb2ludENvbXBvbmVudFR5cGUiXSxbInBvaW50RGF0YSIsInBvaW50UGl4ZWxDb21wb25lbnRUeXBlIl0sWyJjZWxscyIsImNlbGxDb21wb25lbnRUeXBlIl0sWyJjZWxsRGF0YSIsImNlbGxQaXhlbENvbXBvbmVudFR5cGUiXV0pLG89bmV3IFRleHRFbmNvZGVyLG49ZS53ZWJXb3JrZXI7Zm9yKGxldCBpIG9mWyJwb2ludHMiLCJwb2ludERhdGEiLCJjZWxscyIsImNlbGxEYXRhIl0paWYodFtpXT09PW51bGwpdFtpXT1udWxsO2Vsc2V7bGV0IGc9bmV3IFVpbnQ4QXJyYXkoby5lbmNvZGUodFtpXSkpLGw9YXdhaXQgVihnLHtwYXJzZVN0cmluZzohMCx3ZWJXb3JrZXI6bixub0NvcHk6ITB9KTtuPWwud2ViV29ya2VyLHRbaV09dyh0Lm1lc2hUeXBlW3IuZ2V0KGkpXSxsLm91dHB1dC5idWZmZXIpfXJldHVybntkZWNvZGVkOnQsd2ViV29ya2VyOm59fWFzeW5jIGZ1bmN0aW9uIHlvKEEsZT17fSl7bGV0IHI9bmV3IEhBKEEucG9seURhdGFUeXBlKTtyLm5hbWU9QS5uYW1lLHIubnVtYmVyT2ZQb2ludHM9QS5udW1iZXJPZlBvaW50cyxyLnZlcnRpY2VzQnVmZmVyU2l6ZT1BLnZlcnRpY2VzQnVmZmVyU2l6ZSxyLmxpbmVzQnVmZmVyU2l6ZT1BLmxpbmVzQnVmZmVyU2l6ZSxyLnBvbHlnb25zQnVmZmVyU2l6ZT1BLnBvbHlnb25zQnVmZmVyU2l6ZSxyLnRyaWFuZ2xlU3RyaXBzQnVmZmVyU2l6ZT1BLnRyaWFuZ2xlU3RyaXBzQnVmZmVyU2l6ZSxyLm51bWJlck9mUG9pbnRQaXhlbHM9QS5udW1iZXJPZlBvaW50UGl4ZWxzLHIubnVtYmVyT2ZDZWxsUGl4ZWxzPUEubnVtYmVyT2ZDZWxsUGl4ZWxzO2xldCBvPWUud2ViV29ya2VyLG49bmV3IFRleHREZWNvZGVyKCJ1dGYtOCIpO2ZvcihsZXQgaSBvZlsicG9pbnRzIiwidmVydGljZXMiLCJsaW5lcyIsInBvbHlnb25zIiwidHJpYW5nbGVTdHJpcHMiLCJwb2ludERhdGEiLCJjZWxsRGF0YSJdKWlmKEFbaV09PT1udWxsKXJbaV09bnVsbDtlbHNle2xldCBnPW5ldyBVaW50OEFycmF5KEFbaV0uYnVmZmVyKSxsPWF3YWl0IHooZyx7Y29tcHJlc3Npb25MZXZlbDo1LHN0cmluZ2lmeTohMCx3ZWJXb3JrZXI6byxub0NvcHk6ZS5ub0NvcHl9KTtvPWwud2ViV29ya2VyLHJbaV09bi5kZWNvZGUobC5vdXRwdXQuYnVmZmVyKX1yZXR1cm57ZW5jb2RlZDpyLHdlYldvcmtlcjpvfX1hc3luYyBmdW5jdGlvbiBobyhBLGU9e30pe2xldCB0PUEscj1uZXcgTWFwKFtbInBvaW50cyIsImZsb2F0MzIiXSxbInZlcnRpY2VzIiwidWludDMyIl0sWyJsaW5lcyIsInVpbnQzMiJdLFsicG9seWdvbnMiLCJ1aW50MzIiXSxbInRyaWFuZ2xlU3RyaXBzIiwidWludDMyIl0sWyJwb2ludERhdGEiLHQucG9seURhdGFUeXBlLnBvaW50UGl4ZWxDb21wb25lbnRUeXBlXSxbImNlbGxEYXRhIix0LnBvbHlEYXRhVHlwZS5jZWxsUGl4ZWxDb21wb25lbnRUeXBlXV0pLG89bmV3IFRleHRFbmNvZGVyLG49ZS53ZWJXb3JrZXI7Zm9yKGxldCBpIG9mWyJwb2ludHMiLCJ2ZXJ0aWNlcyIsImxpbmVzIiwicG9seWdvbnMiLCJ0cmlhbmdsZVN0cmlwcyIsInBvaW50RGF0YSIsImNlbGxEYXRhIl0paWYodFtpXT09PW51bGwpdFtpXT1udWxsO2Vsc2V7bGV0IGc9bmV3IFVpbnQ4QXJyYXkoby5lbmNvZGUodFtpXSkpLGw9YXdhaXQgVihnLHtwYXJzZVN0cmluZzohMCx3ZWJXb3JrZXI6bixub0NvcHk6ITB9KTtuPWwud2ViV29ya2VyLHRbaV09dyhyLmdldChpKSxsLm91dHB1dC5idWZmZXIpfXJldHVybntkZWNvZGVkOnQsd2ViV29ya2VyOm59fXZhciBSdD0nZGF0YTp0ZXh0L2phdmFzY3JpcHQ7Y2hhcnNldD11dGYtOCx2YXIgSUk9T2JqZWN0LmRlZmluZVByb3BlcnR5O3ZhciBlST0oQSx0KT0+e2Zvcih2YXIgSSBpbiB0KUlJKEEsSSx7Z2V0OnRbSV0sZW51bWVyYWJsZTohMH0pfTt2YXIgdkE9U3ltYm9sKCJDb21saW5rLnByb3h5IiksZ0k9U3ltYm9sKCJDb21saW5rLmVuZHBvaW50Iiksckk9U3ltYm9sKCJDb21saW5rLnJlbGVhc2VQcm94eSIpLHBBPVN5bWJvbCgiQ29tbGluay5maW5hbGl6ZXIiKSxlQT1TeW1ib2woIkNvbWxpbmsudGhyb3duIiksJEE9QT0+dHlwZW9mIEE9PSJvYmplY3QiJiZBIT09bnVsbHx8dHlwZW9mIEE9PSJmdW5jdGlvbiIsb0k9e2NhbkhhbmRsZTpBPT4kQShBKSYmQVt2QV0sc2VyaWFsaXplKEEpe2xldHtwb3J0MTp0LHBvcnQyOkl9PW5ldyBNZXNzYWdlQ2hhbm5lbDtyZXR1cm4gaUEoQSx0KSxbSSxbSV1dfSxkZXNlcmlhbGl6ZShBKXtyZXR1cm4gQS5zdGFydCgpLG5JKEEpfX0saUk9e2NhbkhhbmRsZTpBPT4kQShBKSYmZUEgaW4gQSxzZXJpYWxpemUoe3ZhbHVlOkF9KXtsZXQgdDtyZXR1cm4gQSBpbnN0YW5jZW9mIEVycm9yP3Q9e2lzRXJyb3I6ITAsdmFsdWU6e21lc3NhZ2U6QS5tZXNzYWdlLG5hbWU6QS5uYW1lLHN0YWNrOkEuc3RhY2t9fTp0PXtpc0Vycm9yOiExLHZhbHVlOkF9LFt0LFtdXX0sZGVzZXJpYWxpemUoQSl7dGhyb3cgQS5pc0Vycm9yP09iamVjdC5hc3NpZ24obmV3IEVycm9yKEEudmFsdWUubWVzc2FnZSksQS52YWx1ZSk6QS52YWx1ZX19LEF0PW5ldyBNYXAoW1sicHJveHkiLG9JXSxbInRocm93IixpSV1dKTtmdW5jdGlvbiBDSShBLHQpe2ZvcihsZXQgSSBvZiBBKWlmKHQ9PT1JfHxJPT09IioifHxJIGluc3RhbmNlb2YgUmVnRXhwJiZJLnRlc3QodCkpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gaUEoQSx0PWdsb2JhbFRoaXMsST1bIioiXSl7dC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbiBlKGcpe2lmKCFnfHwhZy5kYXRhKXJldHVybjtpZighQ0koSSxnLm9yaWdpbikpe2NvbnNvbGUud2FybihgSW52YWxpZCBvcmlnaW4gXCcke2cub3JpZ2lufVwnIGZvciBjb21saW5rIHByb3h5YCk7cmV0dXJufWxldHtpZDpyLHR5cGU6byxwYXRoOm59PU9iamVjdC5hc3NpZ24oe3BhdGg6W119LGcuZGF0YSksYT0oZy5kYXRhLmFyZ3VtZW50TGlzdHx8W10pLm1hcChiKSxRO3RyeXtsZXQgQj1uLnNsaWNlKDAsLTEpLnJlZHVjZSgoZixzKT0+ZltzXSxBKSxpPW4ucmVkdWNlKChmLHMpPT5mW3NdLEEpO3N3aXRjaChvKXtjYXNlIkdFVCI6UT1pO2JyZWFrO2Nhc2UiU0VUIjpCW24uc2xpY2UoLTEpWzBdXT1iKGcuZGF0YS52YWx1ZSksUT0hMDticmVhaztjYXNlIkFQUExZIjpRPWkuYXBwbHkoQixhKTticmVhaztjYXNlIkNPTlNUUlVDVCI6e2xldCBmPW5ldyBpKC4uLmEpO1E9YUkoZil9YnJlYWs7Y2FzZSJFTkRQT0lOVCI6e2xldHtwb3J0MTpmLHBvcnQyOnN9PW5ldyBNZXNzYWdlQ2hhbm5lbDtpQShBLHMpLFE9RkEoZixbZl0pfWJyZWFrO2Nhc2UiUkVMRUFTRSI6UT12b2lkIDA7YnJlYWs7ZGVmYXVsdDpyZXR1cm59fWNhdGNoKEIpe1E9e3ZhbHVlOkIsW2VBXTowfX1Qcm9taXNlLnJlc29sdmUoUSkuY2F0Y2goQj0+KHt2YWx1ZTpCLFtlQV06MH0pKS50aGVuKEI9PntsZXRbaSxmXT1vQShCKTt0LnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxpKSx7aWQ6cn0pLGYpLG89PT0iUkVMRUFTRSImJih0LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGUpLHR0KHQpLHBBIGluIEEmJnR5cGVvZiBBW3BBXT09ImZ1bmN0aW9uIiYmQVtwQV0oKSl9KS5jYXRjaChCPT57bGV0W2ksZl09b0Eoe3ZhbHVlOm5ldyBUeXBlRXJyb3IoIlVuc2VyaWFsaXphYmxlIHJldHVybiB2YWx1ZSIpLFtlQV06MH0pO3QucG9zdE1lc3NhZ2UoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGkpLHtpZDpyfSksZil9KX0pLHQuc3RhcnQmJnQuc3RhcnQoKX1mdW5jdGlvbiBCSShBKXtyZXR1cm4gQS5jb25zdHJ1Y3Rvci5uYW1lPT09Ik1lc3NhZ2VQb3J0In1mdW5jdGlvbiB0dChBKXtCSShBKSYmQS5jbG9zZSgpfWZ1bmN0aW9uIG5JKEEsdCl7cmV0dXJuIFNBKEEsW10sdCl9ZnVuY3Rpb24gSUEoQSl7aWYoQSl0aHJvdyBuZXcgRXJyb3IoIlByb3h5IGhhcyBiZWVuIHJlbGVhc2VkIGFuZCBpcyBub3QgdXNlYWJsZSIpfWZ1bmN0aW9uIEl0KEEpe3JldHVybiBxKEEse3R5cGU6IlJFTEVBU0UifSkudGhlbigoKT0+e3R0KEEpfSl9dmFyIGdBPW5ldyBXZWFrTWFwLHJBPSJGaW5hbGl6YXRpb25SZWdpc3RyeSJpbiBnbG9iYWxUaGlzJiZuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoQT0+e2xldCB0PShnQS5nZXQoQSl8fDApLTE7Z0Euc2V0KEEsdCksdD09PTAmJkl0KEEpfSk7ZnVuY3Rpb24gc0koQSx0KXtsZXQgST0oZ0EuZ2V0KHQpfHwwKSsxO2dBLnNldCh0LEkpLHJBJiZyQS5yZWdpc3RlcihBLHQsQSl9ZnVuY3Rpb24gUUkoQSl7ckEmJnJBLnVucmVnaXN0ZXIoQSl9ZnVuY3Rpb24gU0EoQSx0PVtdLEk9ZnVuY3Rpb24oKXt9KXtsZXQgZT0hMSxnPW5ldyBQcm94eShJLHtnZXQocixvKXtpZihJQShlKSxvPT09ckkpcmV0dXJuKCk9PntRSShnKSxJdChBKSxlPSEwfTtpZihvPT09InRoZW4iKXtpZih0Lmxlbmd0aD09PTApcmV0dXJue3RoZW46KCk9Pmd9O2xldCBuPXEoQSx7dHlwZToiR0VUIixwYXRoOnQubWFwKGE9PmEudG9TdHJpbmcoKSl9KS50aGVuKGIpO3JldHVybiBuLnRoZW4uYmluZChuKX1yZXR1cm4gU0EoQSxbLi4udCxvXSl9LHNldChyLG8sbil7SUEoZSk7bGV0W2EsUV09b0Eobik7cmV0dXJuIHEoQSx7dHlwZToiU0VUIixwYXRoOlsuLi50LG9dLm1hcChCPT5CLnRvU3RyaW5nKCkpLHZhbHVlOmF9LFEpLnRoZW4oYil9LGFwcGx5KHIsbyxuKXtJQShlKTtsZXQgYT10W3QubGVuZ3RoLTFdO2lmKGE9PT1nSSlyZXR1cm4gcShBLHt0eXBlOiJFTkRQT0lOVCJ9KS50aGVuKGIpO2lmKGE9PT0iYmluZCIpcmV0dXJuIFNBKEEsdC5zbGljZSgwLC0xKSk7bGV0W1EsQl09X0Eobik7cmV0dXJuIHEoQSx7dHlwZToiQVBQTFkiLHBhdGg6dC5tYXAoaT0+aS50b1N0cmluZygpKSxhcmd1bWVudExpc3Q6UX0sQikudGhlbihiKX0sY29uc3RydWN0KHIsbyl7SUEoZSk7bGV0W24sYV09X0Eobyk7cmV0dXJuIHEoQSx7dHlwZToiQ09OU1RSVUNUIixwYXRoOnQubWFwKFE9PlEudG9TdHJpbmcoKSksYXJndW1lbnRMaXN0Om59LGEpLnRoZW4oYil9fSk7cmV0dXJuIHNJKGcsQSksZ31mdW5jdGlvbiBFSShBKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSxBKX1mdW5jdGlvbiBfQShBKXtsZXQgdD1BLm1hcChvQSk7cmV0dXJuW3QubWFwKEk9PklbMF0pLEVJKHQubWFwKEk9PklbMV0pKV19dmFyIGV0PW5ldyBXZWFrTWFwO2Z1bmN0aW9uIEZBKEEsdCl7cmV0dXJuIGV0LnNldChBLHQpLEF9ZnVuY3Rpb24gYUkoQSl7cmV0dXJuIE9iamVjdC5hc3NpZ24oQSx7W3ZBXTohMH0pfWZ1bmN0aW9uIG9BKEEpe2ZvcihsZXRbdCxJXW9mIEF0KWlmKEkuY2FuSGFuZGxlKEEpKXtsZXRbZSxnXT1JLnNlcmlhbGl6ZShBKTtyZXR1cm5be3R5cGU6IkhBTkRMRVIiLG5hbWU6dCx2YWx1ZTplfSxnXX1yZXR1cm5be3R5cGU6IlJBVyIsdmFsdWU6QX0sZXQuZ2V0KEEpfHxbXV19ZnVuY3Rpb24gYihBKXtzd2l0Y2goQS50eXBlKXtjYXNlIkhBTkRMRVIiOnJldHVybiBBdC5nZXQoQS5uYW1lKS5kZXNlcmlhbGl6ZShBLnZhbHVlKTtjYXNlIlJBVyI6cmV0dXJuIEEudmFsdWV9fWZ1bmN0aW9uIHEoQSx0LEkpe3JldHVybiBuZXcgUHJvbWlzZShlPT57bGV0IGc9Y0koKTtBLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uIHIobyl7IW8uZGF0YXx8IW8uZGF0YS5pZHx8by5kYXRhLmlkIT09Z3x8KEEucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsciksZShvLmRhdGEpKX0pLEEuc3RhcnQmJkEuc3RhcnQoKSxBLnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oe2lkOmd9LHQpLEkpfSl9ZnVuY3Rpb24gY0koKXtyZXR1cm4gbmV3IEFycmF5KDQpLmZpbGwoMCkubWFwKCgpPT5NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLnRvU3RyaW5nKDE2KSkuam9pbigiLSIpfWZ1bmN0aW9uIFcoQSx0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gQS5hcHBseSh0LGFyZ3VtZW50cyl9fXZhcnt0b1N0cmluZzpmSX09T2JqZWN0LnByb3RvdHlwZSx7Z2V0UHJvdG90eXBlT2Y6VUF9PU9iamVjdCxCQT0oQT0+dD0+e2xldCBJPWZJLmNhbGwodCk7cmV0dXJuIEFbSV18fChBW0ldPUkuc2xpY2UoOCwtMSkudG9Mb3dlckNhc2UoKSl9KShPYmplY3QuY3JlYXRlKG51bGwpKSxVPUE9PihBPUEudG9Mb3dlckNhc2UoKSx0PT5CQSh0KT09PUEpLG5BPUE9PnQ9PnR5cGVvZiB0PT09QSx7aXNBcnJheTpLfT1BcnJheSxaPW5BKCJ1bmRlZmluZWQiKTtmdW5jdGlvbiBsSShBKXtyZXR1cm4gQSE9PW51bGwmJiFaKEEpJiZBLmNvbnN0cnVjdG9yIT09bnVsbCYmIVooQS5jb25zdHJ1Y3RvcikmJkYoQS5jb25zdHJ1Y3Rvci5pc0J1ZmZlcikmJkEuY29uc3RydWN0b3IuaXNCdWZmZXIoQSl9dmFyIGl0PVUoIkFycmF5QnVmZmVyIik7ZnVuY3Rpb24gREkoQSl7bGV0IHQ7cmV0dXJuIHR5cGVvZiBBcnJheUJ1ZmZlcjwidSImJkFycmF5QnVmZmVyLmlzVmlldz90PUFycmF5QnVmZmVyLmlzVmlldyhBKTp0PUEmJkEuYnVmZmVyJiZpdChBLmJ1ZmZlciksdH12YXIgdUk9bkEoInN0cmluZyIpLEY9bkEoImZ1bmN0aW9uIiksQ3Q9bkEoIm51bWJlciIpLHNBPUE9PkEhPT1udWxsJiZ0eXBlb2YgQT09Im9iamVjdCIsaEk9QT0+QT09PSEwfHxBPT09ITEsQ0E9QT0+e2lmKEJBKEEpIT09Im9iamVjdCIpcmV0dXJuITE7bGV0IHQ9VUEoQSk7cmV0dXJuKHQ9PT1udWxsfHx0PT09T2JqZWN0LnByb3RvdHlwZXx8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpPT09bnVsbCkmJiEoU3ltYm9sLnRvU3RyaW5nVGFnIGluIEEpJiYhKFN5bWJvbC5pdGVyYXRvciBpbiBBKX0sZEk9VSgiRGF0ZSIpLHlJPVUoIkZpbGUiKSx3ST1VKCJCbG9iIiksbUk9VSgiRmlsZUxpc3QiKSxwST1BPT5zQShBKSYmRihBLnBpcGUpLFNJPUE9PntsZXQgdDtyZXR1cm4gQSYmKHR5cGVvZiBGb3JtRGF0YT09ImZ1bmN0aW9uIiYmQSBpbnN0YW5jZW9mIEZvcm1EYXRhfHxGKEEuYXBwZW5kKSYmKCh0PUJBKEEpKT09PSJmb3JtZGF0YSJ8fHQ9PT0ib2JqZWN0IiYmRihBLnRvU3RyaW5nKSYmQS50b1N0cmluZygpPT09IltvYmplY3QgRm9ybURhdGFdIikpfSxGST1VKCJVUkxTZWFyY2hQYXJhbXMiKSxSST1BPT5BLnRyaW0/QS50cmltKCk6QS5yZXBsYWNlKC9eW1xcc1xcdUZFRkZcXHhBMF0rfFtcXHNcXHVGRUZGXFx4QTBdKyQvZywiIik7ZnVuY3Rpb24gVihBLHQse2FsbE93bktleXM6ST0hMX09e30pe2lmKEE9PT1udWxsfHx0eXBlb2YgQT4idSIpcmV0dXJuO2xldCBlLGc7aWYodHlwZW9mIEEhPSJvYmplY3QiJiYoQT1bQV0pLEsoQSkpZm9yKGU9MCxnPUEubGVuZ3RoO2U8ZztlKyspdC5jYWxsKG51bGwsQVtlXSxlLEEpO2Vsc2V7bGV0IHI9ST9PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhBKTpPYmplY3Qua2V5cyhBKSxvPXIubGVuZ3RoLG47Zm9yKGU9MDtlPG87ZSsrKW49cltlXSx0LmNhbGwobnVsbCxBW25dLG4sQSl9fWZ1bmN0aW9uIEJ0KEEsdCl7dD10LnRvTG93ZXJDYXNlKCk7bGV0IEk9T2JqZWN0LmtleXMoQSksZT1JLmxlbmd0aCxnO2Zvcig7ZS0tID4wOylpZihnPUlbZV0sdD09PWcudG9Mb3dlckNhc2UoKSlyZXR1cm4gZztyZXR1cm4gbnVsbH12YXIgbnQ9dHlwZW9mIGdsb2JhbFRoaXM8InUiP2dsb2JhbFRoaXM6dHlwZW9mIHNlbGY8InUiP3NlbGY6dHlwZW9mIHdpbmRvdzwidSI/d2luZG93Omdsb2JhbCxzdD1BPT4hWihBKSYmQSE9PW50O2Z1bmN0aW9uIE5BKCl7bGV0e2Nhc2VsZXNzOkF9PXN0KHRoaXMpJiZ0aGlzfHx7fSx0PXt9LEk9KGUsZyk9PntsZXQgcj1BJiZCdCh0LGcpfHxnO0NBKHRbcl0pJiZDQShlKT90W3JdPU5BKHRbcl0sZSk6Q0EoZSk/dFtyXT1OQSh7fSxlKTpLKGUpP3Rbcl09ZS5zbGljZSgpOnRbcl09ZX07Zm9yKGxldCBlPTAsZz1hcmd1bWVudHMubGVuZ3RoO2U8ZztlKyspYXJndW1lbnRzW2VdJiZWKGFyZ3VtZW50c1tlXSxJKTtyZXR1cm4gdH12YXIgTkk9KEEsdCxJLHthbGxPd25LZXlzOmV9PXt9KT0+KFYodCwoZyxyKT0+e0kmJkYoZyk/QVtyXT1XKGcsSSk6QVtyXT1nfSx7YWxsT3duS2V5czplfSksQSksVUk9QT0+KEEuY2hhckNvZGVBdCgwKT09PTY1Mjc5JiYoQT1BLnNsaWNlKDEpKSxBKSxHST0oQSx0LEksZSk9PntBLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlLGUpLEEucHJvdG90eXBlLmNvbnN0cnVjdG9yPUEsT2JqZWN0LmRlZmluZVByb3BlcnR5KEEsInN1cGVyIix7dmFsdWU6dC5wcm90b3R5cGV9KSxJJiZPYmplY3QuYXNzaWduKEEucHJvdG90eXBlLEkpfSxrST0oQSx0LEksZSk9PntsZXQgZyxyLG8sbj17fTtpZih0PXR8fHt9LEE9PW51bGwpcmV0dXJuIHQ7ZG97Zm9yKGc9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoQSkscj1nLmxlbmd0aDtyLS0gPjA7KW89Z1tyXSwoIWV8fGUobyxBLHQpKSYmIW5bb10mJih0W29dPUFbb10sbltvXT0hMCk7QT1JIT09ITEmJlVBKEEpfXdoaWxlKEEmJighSXx8SShBLHQpKSYmQSE9PU9iamVjdC5wcm90b3R5cGUpO3JldHVybiB0fSxMST0oQSx0LEkpPT57QT1TdHJpbmcoQSksKEk9PT12b2lkIDB8fEk+QS5sZW5ndGgpJiYoST1BLmxlbmd0aCksSS09dC5sZW5ndGg7bGV0IGU9QS5pbmRleE9mKHQsSSk7cmV0dXJuIGUhPT0tMSYmZT09PUl9LEpJPUE9PntpZighQSlyZXR1cm4gbnVsbDtpZihLKEEpKXJldHVybiBBO2xldCB0PUEubGVuZ3RoO2lmKCFDdCh0KSlyZXR1cm4gbnVsbDtsZXQgST1uZXcgQXJyYXkodCk7Zm9yKDt0LS0gPjA7KUlbdF09QVt0XTtyZXR1cm4gSX0sSEk9KEE9PnQ9PkEmJnQgaW5zdGFuY2VvZiBBKSh0eXBlb2YgVWludDhBcnJheTwidSImJlVBKFVpbnQ4QXJyYXkpKSxZST0oQSx0KT0+e2xldCBlPShBJiZBW1N5bWJvbC5pdGVyYXRvcl0pLmNhbGwoQSksZztmb3IoOyhnPWUubmV4dCgpKSYmIWcuZG9uZTspe2xldCByPWcudmFsdWU7dC5jYWxsKEEsclswXSxyWzFdKX19LGJJPShBLHQpPT57bGV0IEksZT1bXTtmb3IoOyhJPUEuZXhlYyh0KSkhPT1udWxsOyllLnB1c2goSSk7cmV0dXJuIGV9LE1JPVUoIkhUTUxGb3JtRWxlbWVudCIpLHFJPUE9PkEudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLV9cXHNdKFthLXpcXGRdKShcXHcqKS9nLGZ1bmN0aW9uKEksZSxnKXtyZXR1cm4gZS50b1VwcGVyQ2FzZSgpK2d9KSxydD0oKHtoYXNPd25Qcm9wZXJ0eTpBfSk9Pih0LEkpPT5BLmNhbGwodCxJKSkoT2JqZWN0LnByb3RvdHlwZSksS0k9VSgiUmVnRXhwIiksUXQ9KEEsdCk9PntsZXQgST1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhBKSxlPXt9O1YoSSwoZyxyKT0+e2xldCBvOyhvPXQoZyxyLEEpKSE9PSExJiYoZVtyXT1vfHxnKX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEEsZSl9LE9JPUE9PntRdChBLCh0LEkpPT57aWYoRihBKSYmWyJhcmd1bWVudHMiLCJjYWxsZXIiLCJjYWxsZWUiXS5pbmRleE9mKEkpIT09LTEpcmV0dXJuITE7bGV0IGU9QVtJXTtpZihGKGUpKXtpZih0LmVudW1lcmFibGU9ITEsIndyaXRhYmxlImluIHQpe3Qud3JpdGFibGU9ITE7cmV0dXJufXQuc2V0fHwodC5zZXQ9KCk9Pnt0aHJvdyBFcnJvcigiQ2FuIG5vdCByZXdyaXRlIHJlYWQtb25seSBtZXRob2QgXCciK0krIlwnIil9KX19KX0sVEk9KEEsdCk9PntsZXQgST17fSxlPWc9PntnLmZvckVhY2gocj0+e0lbcl09ITB9KX07cmV0dXJuIEsoQSk/ZShBKTplKFN0cmluZyhBKS5zcGxpdCh0KSksSX0sUEk9KCk9Pnt9LHhJPShBLHQpPT4oQT0rQSxOdW1iZXIuaXNGaW5pdGUoQSk/QTp0KSxSQT0iYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLG90PSIwMTIzNDU2Nzg5IixFdD17RElHSVQ6b3QsQUxQSEE6UkEsQUxQSEFfRElHSVQ6UkErUkEudG9VcHBlckNhc2UoKStvdH0sakk9KEE9MTYsdD1FdC5BTFBIQV9ESUdJVCk9PntsZXQgST0iIix7bGVuZ3RoOmV9PXQ7Zm9yKDtBLS07KUkrPXRbTWF0aC5yYW5kb20oKSplfDBdO3JldHVybiBJfTtmdW5jdGlvbiBXSShBKXtyZXR1cm4hIShBJiZGKEEuYXBwZW5kKSYmQVtTeW1ib2wudG9TdHJpbmdUYWddPT09IkZvcm1EYXRhIiYmQVtTeW1ib2wuaXRlcmF0b3JdKX12YXIgWkk9QT0+e2xldCB0PW5ldyBBcnJheSgxMCksST0oZSxnKT0+e2lmKHNBKGUpKXtpZih0LmluZGV4T2YoZSk+PTApcmV0dXJuO2lmKCEoInRvSlNPTiJpbiBlKSl7dFtnXT1lO2xldCByPUsoZSk/W106e307cmV0dXJuIFYoZSwobyxuKT0+e2xldCBhPUkobyxnKzEpOyFaKGEpJiYocltuXT1hKX0pLHRbZ109dm9pZCAwLHJ9fXJldHVybiBlfTtyZXR1cm4gSShBLDApfSxWST1VKCJBc3luY0Z1bmN0aW9uIiksWEk9QT0+QSYmKHNBKEEpfHxGKEEpKSYmRihBLnRoZW4pJiZGKEEuY2F0Y2gpLEM9e2lzQXJyYXk6Syxpc0FycmF5QnVmZmVyOml0LGlzQnVmZmVyOmxJLGlzRm9ybURhdGE6U0ksaXNBcnJheUJ1ZmZlclZpZXc6REksaXNTdHJpbmc6dUksaXNOdW1iZXI6Q3QsaXNCb29sZWFuOmhJLGlzT2JqZWN0OnNBLGlzUGxhaW5PYmplY3Q6Q0EsaXNVbmRlZmluZWQ6Wixpc0RhdGU6ZEksaXNGaWxlOnlJLGlzQmxvYjp3SSxpc1JlZ0V4cDpLSSxpc0Z1bmN0aW9uOkYsaXNTdHJlYW06cEksaXNVUkxTZWFyY2hQYXJhbXM6RkksaXNUeXBlZEFycmF5OkhJLGlzRmlsZUxpc3Q6bUksZm9yRWFjaDpWLG1lcmdlOk5BLGV4dGVuZDpOSSx0cmltOlJJLHN0cmlwQk9NOlVJLGluaGVyaXRzOkdJLHRvRmxhdE9iamVjdDprSSxraW5kT2Y6QkEsa2luZE9mVGVzdDpVLGVuZHNXaXRoOkxJLHRvQXJyYXk6SkksZm9yRWFjaEVudHJ5OllJLG1hdGNoQWxsOmJJLGlzSFRNTEZvcm06TUksaGFzT3duUHJvcGVydHk6cnQsaGFzT3duUHJvcDpydCxyZWR1Y2VEZXNjcmlwdG9yczpRdCxmcmVlemVNZXRob2RzOk9JLHRvT2JqZWN0U2V0OlRJLHRvQ2FtZWxDYXNlOnFJLG5vb3A6UEksdG9GaW5pdGVOdW1iZXI6eEksZmluZEtleTpCdCxnbG9iYWw6bnQsaXNDb250ZXh0RGVmaW5lZDpzdCxBTFBIQUJFVDpFdCxnZW5lcmF0ZVN0cmluZzpqSSxpc1NwZWNDb21wbGlhbnRGb3JtOldJLHRvSlNPTk9iamVjdDpaSSxpc0FzeW5jRm46VkksaXNUaGVuYWJsZTpYSX07ZnVuY3Rpb24gTyhBLHQsSSxlLGcpe0Vycm9yLmNhbGwodGhpcyksRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U/RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcyx0aGlzLmNvbnN0cnVjdG9yKTp0aGlzLnN0YWNrPW5ldyBFcnJvcigpLnN0YWNrLHRoaXMubWVzc2FnZT1BLHRoaXMubmFtZT0iQXhpb3NFcnJvciIsdCYmKHRoaXMuY29kZT10KSxJJiYodGhpcy5jb25maWc9SSksZSYmKHRoaXMucmVxdWVzdD1lKSxnJiYodGhpcy5yZXNwb25zZT1nKX1DLmluaGVyaXRzKE8sRXJyb3Ise3RvSlNPTjpmdW5jdGlvbigpe3JldHVybnttZXNzYWdlOnRoaXMubWVzc2FnZSxuYW1lOnRoaXMubmFtZSxkZXNjcmlwdGlvbjp0aGlzLmRlc2NyaXB0aW9uLG51bWJlcjp0aGlzLm51bWJlcixmaWxlTmFtZTp0aGlzLmZpbGVOYW1lLGxpbmVOdW1iZXI6dGhpcy5saW5lTnVtYmVyLGNvbHVtbk51bWJlcjp0aGlzLmNvbHVtbk51bWJlcixzdGFjazp0aGlzLnN0YWNrLGNvbmZpZzpDLnRvSlNPTk9iamVjdCh0aGlzLmNvbmZpZyksY29kZTp0aGlzLmNvZGUsc3RhdHVzOnRoaXMucmVzcG9uc2UmJnRoaXMucmVzcG9uc2Uuc3RhdHVzP3RoaXMucmVzcG9uc2Uuc3RhdHVzOm51bGx9fX0pO3ZhciBhdD1PLnByb3RvdHlwZSxjdD17fTtbIkVSUl9CQURfT1BUSU9OX1ZBTFVFIiwiRVJSX0JBRF9PUFRJT04iLCJFQ09OTkFCT1JURUQiLCJFVElNRURPVVQiLCJFUlJfTkVUV09SSyIsIkVSUl9GUl9UT09fTUFOWV9SRURJUkVDVFMiLCJFUlJfREVQUkVDQVRFRCIsIkVSUl9CQURfUkVTUE9OU0UiLCJFUlJfQkFEX1JFUVVFU1QiLCJFUlJfQ0FOQ0VMRUQiLCJFUlJfTk9UX1NVUFBPUlQiLCJFUlJfSU5WQUxJRF9VUkwiXS5mb3JFYWNoKEE9PntjdFtBXT17dmFsdWU6QX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhPLGN0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYXQsImlzQXhpb3NFcnJvciIse3ZhbHVlOiEwfSk7Ty5mcm9tPShBLHQsSSxlLGcscik9PntsZXQgbz1PYmplY3QuY3JlYXRlKGF0KTtyZXR1cm4gQy50b0ZsYXRPYmplY3QoQSxvLGZ1bmN0aW9uKGEpe3JldHVybiBhIT09RXJyb3IucHJvdG90eXBlfSxuPT5uIT09ImlzQXhpb3NFcnJvciIpLE8uY2FsbChvLEEubWVzc2FnZSx0LEksZSxnKSxvLmNhdXNlPUEsby5uYW1lPUEubmFtZSxyJiZPYmplY3QuYXNzaWduKG8sciksb307dmFyIGw9Tzt2YXIgUUE9bnVsbDtmdW5jdGlvbiBHQShBKXtyZXR1cm4gQy5pc1BsYWluT2JqZWN0KEEpfHxDLmlzQXJyYXkoQSl9ZnVuY3Rpb24gbHQoQSl7cmV0dXJuIEMuZW5kc1dpdGgoQSwiW10iKT9BLnNsaWNlKDAsLTIpOkF9ZnVuY3Rpb24gZnQoQSx0LEkpe3JldHVybiBBP0EuY29uY2F0KHQpLm1hcChmdW5jdGlvbihnLHIpe3JldHVybiBnPWx0KGcpLCFJJiZyPyJbIitnKyJdIjpnfSkuam9pbihJPyIuIjoiIik6dH1mdW5jdGlvbiB6SShBKXtyZXR1cm4gQy5pc0FycmF5KEEpJiYhQS5zb21lKEdBKX12YXIgX0k9Qy50b0ZsYXRPYmplY3QoQyx7fSxudWxsLGZ1bmN0aW9uKHQpe3JldHVybi9eaXNbQS1aXS8udGVzdCh0KX0pO2Z1bmN0aW9uIHZJKEEsdCxJKXtpZighQy5pc09iamVjdChBKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJ0YXJnZXQgbXVzdCBiZSBhbiBvYmplY3QiKTt0PXR8fG5ldyhRQXx8Rm9ybURhdGEpLEk9Qy50b0ZsYXRPYmplY3QoSSx7bWV0YVRva2VuczohMCxkb3RzOiExLGluZGV4ZXM6ITF9LCExLGZ1bmN0aW9uKGMsdSl7cmV0dXJuIUMuaXNVbmRlZmluZWQodVtjXSl9KTtsZXQgZT1JLm1ldGFUb2tlbnMsZz1JLnZpc2l0b3J8fEIscj1JLmRvdHMsbz1JLmluZGV4ZXMsYT0oSS5CbG9ifHx0eXBlb2YgQmxvYjwidSImJkJsb2IpJiZDLmlzU3BlY0NvbXBsaWFudEZvcm0odCk7aWYoIUMuaXNGdW5jdGlvbihnKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJ2aXNpdG9yIG11c3QgYmUgYSBmdW5jdGlvbiIpO2Z1bmN0aW9uIFEoRSl7aWYoRT09PW51bGwpcmV0dXJuIiI7aWYoQy5pc0RhdGUoRSkpcmV0dXJuIEUudG9JU09TdHJpbmcoKTtpZighYSYmQy5pc0Jsb2IoRSkpdGhyb3cgbmV3IGwoIkJsb2IgaXMgbm90IHN1cHBvcnRlZC4gVXNlIGEgQnVmZmVyIGluc3RlYWQuIik7cmV0dXJuIEMuaXNBcnJheUJ1ZmZlcihFKXx8Qy5pc1R5cGVkQXJyYXkoRSk/YSYmdHlwZW9mIEJsb2I9PSJmdW5jdGlvbiI/bmV3IEJsb2IoW0VdKTpCdWZmZXIuZnJvbShFKTpFfWZ1bmN0aW9uIEIoRSxjLHUpe2xldCB5PUU7aWYoRSYmIXUmJnR5cGVvZiBFPT0ib2JqZWN0Iil7aWYoQy5lbmRzV2l0aChjLCJ7fSIpKWM9ZT9jOmMuc2xpY2UoMCwtMiksRT1KU09OLnN0cmluZ2lmeShFKTtlbHNlIGlmKEMuaXNBcnJheShFKSYmekkoRSl8fChDLmlzRmlsZUxpc3QoRSl8fEMuZW5kc1dpdGgoYywiW10iKSkmJih5PUMudG9BcnJheShFKSkpcmV0dXJuIGM9bHQoYykseS5mb3JFYWNoKGZ1bmN0aW9uKE4sdEkpeyEoQy5pc1VuZGVmaW5lZChOKXx8Tj09PW51bGwpJiZ0LmFwcGVuZChvPT09ITA/ZnQoW2NdLHRJLHIpOm89PT1udWxsP2M6YysiW10iLFEoTikpfSksITF9cmV0dXJuIEdBKEUpPyEwOih0LmFwcGVuZChmdCh1LGMsciksUShFKSksITEpfWxldCBpPVtdLGY9T2JqZWN0LmFzc2lnbihfSSx7ZGVmYXVsdFZpc2l0b3I6Qixjb252ZXJ0VmFsdWU6USxpc1Zpc2l0YWJsZTpHQX0pO2Z1bmN0aW9uIHMoRSxjKXtpZighQy5pc1VuZGVmaW5lZChFKSl7aWYoaS5pbmRleE9mKEUpIT09LTEpdGhyb3cgRXJyb3IoIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBpbiAiK2Muam9pbigiLiIpKTtpLnB1c2goRSksQy5mb3JFYWNoKEUsZnVuY3Rpb24oeSxSKXsoIShDLmlzVW5kZWZpbmVkKHkpfHx5PT09bnVsbCkmJmcuY2FsbCh0LHksQy5pc1N0cmluZyhSKT9SLnRyaW0oKTpSLGMsZikpPT09ITAmJnMoeSxjP2MuY29uY2F0KFIpOltSXSl9KSxpLnBvcCgpfX1pZighQy5pc09iamVjdChBKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJkYXRhIG11c3QgYmUgYW4gb2JqZWN0Iik7cmV0dXJuIHMoQSksdH12YXIgSj12STtmdW5jdGlvbiBEdChBKXtsZXQgdD17IiEiOiIlMjUyMSIsIlwnIjoiJTI1MjciLCIoIjoiJTI1MjgiLCIpIjoiJTI1MjkiLCJ+IjoiJTI1N0UiLCIlMjUyMCI6IisiLCIlMjUwMCI6IlxcMCJ9O3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoQSkucmVwbGFjZSgvWyFcJygpfl18JTI1MjB8JTI1MDAvZyxmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0pfWZ1bmN0aW9uIHV0KEEsdCl7dGhpcy5fcGFpcnM9W10sQSYmSihBLHRoaXMsdCl9dmFyIGh0PXV0LnByb3RvdHlwZTtodC5hcHBlbmQ9ZnVuY3Rpb24odCxJKXt0aGlzLl9wYWlycy5wdXNoKFt0LEldKX07aHQudG9TdHJpbmc9ZnVuY3Rpb24odCl7bGV0IEk9dD9mdW5jdGlvbihlKXtyZXR1cm4gdC5jYWxsKHRoaXMsZSxEdCl9OkR0O3JldHVybiB0aGlzLl9wYWlycy5tYXAoZnVuY3Rpb24oZyl7cmV0dXJuIEkoZ1swXSkrIj0iK0koZ1sxXSl9LCIiKS5qb2luKCImIil9O3ZhciBFQT11dDtmdW5jdGlvbiAkSShBKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEEpLnJlcGxhY2UoLyUyNTNBL2dpLCI6IikucmVwbGFjZSgvJTI1MjQvZywiJCIpLnJlcGxhY2UoLyUyNTJDL2dpLCIsIikucmVwbGFjZSgvJTI1MjAvZywiKyIpLnJlcGxhY2UoLyUyNTVCL2dpLCJbIikucmVwbGFjZSgvJTI1NUQvZ2ksIl0iKX1mdW5jdGlvbiBYKEEsdCxJKXtpZighdClyZXR1cm4gQTtsZXQgZT1JJiZJLmVuY29kZXx8JEksZz1JJiZJLnNlcmlhbGl6ZSxyO2lmKGc/cj1nKHQsSSk6cj1DLmlzVVJMU2VhcmNoUGFyYW1zKHQpP3QudG9TdHJpbmcoKTpuZXcgRUEodCxJKS50b1N0cmluZyhlKSxyKXtsZXQgbz1BLmluZGV4T2YoIiUyMyIpO28hPT0tMSYmKEE9QS5zbGljZSgwLG8pKSxBKz0oQS5pbmRleE9mKCI/Iik9PT0tMT8iPyI6IiYiKStyfXJldHVybiBBfXZhciBrQT1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuaGFuZGxlcnM9W119dXNlKHQsSSxlKXtyZXR1cm4gdGhpcy5oYW5kbGVycy5wdXNoKHtmdWxmaWxsZWQ6dCxyZWplY3RlZDpJLHN5bmNocm9ub3VzOmU/ZS5zeW5jaHJvbm91czohMSxydW5XaGVuOmU/ZS5ydW5XaGVuOm51bGx9KSx0aGlzLmhhbmRsZXJzLmxlbmd0aC0xfWVqZWN0KHQpe3RoaXMuaGFuZGxlcnNbdF0mJih0aGlzLmhhbmRsZXJzW3RdPW51bGwpfWNsZWFyKCl7dGhpcy5oYW5kbGVycyYmKHRoaXMuaGFuZGxlcnM9W10pfWZvckVhY2godCl7Qy5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsZnVuY3Rpb24oZSl7ZSE9PW51bGwmJnQoZSl9KX19LExBPWtBO3ZhciBhQT17c2lsZW50SlNPTlBhcnNpbmc6ITAsZm9yY2VkSlNPTlBhcnNpbmc6ITAsY2xhcmlmeVRpbWVvdXRFcnJvcjohMX07dmFyIGR0PXR5cGVvZiBVUkxTZWFyY2hQYXJhbXM8InUiP1VSTFNlYXJjaFBhcmFtczpFQTt2YXIgeXQ9dHlwZW9mIEZvcm1EYXRhPCJ1Ij9Gb3JtRGF0YTpudWxsO3ZhciB3dD10eXBlb2YgQmxvYjwidSI/QmxvYjpudWxsO3ZhciBtdD17aXNCcm93c2VyOiEwLGNsYXNzZXM6e1VSTFNlYXJjaFBhcmFtczpkdCxGb3JtRGF0YTp5dCxCbG9iOnd0fSxwcm90b2NvbHM6WyJodHRwIiwiaHR0cHMiLCJmaWxlIiwiYmxvYiIsInVybCIsImRhdGEiXX07dmFyIEpBPXt9O2VJKEpBLHtoYXNCcm93c2VyRW52OigpPT5wdCxoYXNTdGFuZGFyZEJyb3dzZXJFbnY6KCk9PkFlLGhhc1N0YW5kYXJkQnJvd3NlcldlYldvcmtlckVudjooKT0+dGV9KTt2YXIgcHQ9dHlwZW9mIHdpbmRvdzwidSImJnR5cGVvZiBkb2N1bWVudDwidSIsQWU9KEE9PnB0JiZbIlJlYWN0TmF0aXZlIiwiTmF0aXZlU2NyaXB0IiwiTlMiXS5pbmRleE9mKEEpPDApKHR5cGVvZiBuYXZpZ2F0b3I8InUiJiZuYXZpZ2F0b3IucHJvZHVjdCksdGU9dHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlPCJ1IiYmc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlJiZ0eXBlb2Ygc2VsZi5pbXBvcnRTY3JpcHRzPT0iZnVuY3Rpb24iO3ZhciB3PXsuLi5KQSwuLi5tdH07ZnVuY3Rpb24gSEEoQSx0KXtyZXR1cm4gSihBLG5ldyB3LmNsYXNzZXMuVVJMU2VhcmNoUGFyYW1zLE9iamVjdC5hc3NpZ24oe3Zpc2l0b3I6ZnVuY3Rpb24oSSxlLGcscil7cmV0dXJuIHcuaXNOb2RlJiZDLmlzQnVmZmVyKEkpPyh0aGlzLmFwcGVuZChlLEkudG9TdHJpbmcoImJhc2U2NCIpKSwhMSk6ci5kZWZhdWx0VmlzaXRvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSx0KSl9ZnVuY3Rpb24gSWUoQSl7cmV0dXJuIEMubWF0Y2hBbGwoL1xcdyt8XFxbKFxcdyopXS9nLEEpLm1hcCh0PT50WzBdPT09IltdIj8iIjp0WzFdfHx0WzBdKX1mdW5jdGlvbiBlZShBKXtsZXQgdD17fSxJPU9iamVjdC5rZXlzKEEpLGUsZz1JLmxlbmd0aCxyO2ZvcihlPTA7ZTxnO2UrKylyPUlbZV0sdFtyXT1BW3JdO3JldHVybiB0fWZ1bmN0aW9uIGdlKEEpe2Z1bmN0aW9uIHQoSSxlLGcscil7bGV0IG89SVtyKytdO2lmKG89PT0iX19wcm90b19fIilyZXR1cm4hMDtsZXQgbj1OdW1iZXIuaXNGaW5pdGUoK28pLGE9cj49SS5sZW5ndGg7cmV0dXJuIG89IW8mJkMuaXNBcnJheShnKT9nLmxlbmd0aDpvLGE/KEMuaGFzT3duUHJvcChnLG8pP2dbb109W2dbb10sZV06Z1tvXT1lLCFuKTooKCFnW29dfHwhQy5pc09iamVjdChnW29dKSkmJihnW29dPVtdKSx0KEksZSxnW29dLHIpJiZDLmlzQXJyYXkoZ1tvXSkmJihnW29dPWVlKGdbb10pKSwhbil9aWYoQy5pc0Zvcm1EYXRhKEEpJiZDLmlzRnVuY3Rpb24oQS5lbnRyaWVzKSl7bGV0IEk9e307cmV0dXJuIEMuZm9yRWFjaEVudHJ5KEEsKGUsZyk9Pnt0KEllKGUpLGcsSSwwKX0pLEl9cmV0dXJuIG51bGx9dmFyIGNBPWdlO2Z1bmN0aW9uIHJlKEEsdCxJKXtpZihDLmlzU3RyaW5nKEEpKXRyeXtyZXR1cm4odHx8SlNPTi5wYXJzZSkoQSksQy50cmltKEEpfWNhdGNoKGUpe2lmKGUubmFtZSE9PSJTeW50YXhFcnJvciIpdGhyb3cgZX1yZXR1cm4oSXx8SlNPTi5zdHJpbmdpZnkpKEEpfXZhciBZQT17dHJhbnNpdGlvbmFsOmFBLGFkYXB0ZXI6WyJ4aHIiLCJodHRwIl0sdHJhbnNmb3JtUmVxdWVzdDpbZnVuY3Rpb24odCxJKXtsZXQgZT1JLmdldENvbnRlbnRUeXBlKCl8fCIiLGc9ZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qc29uIik+LTEscj1DLmlzT2JqZWN0KHQpO2lmKHImJkMuaXNIVE1MRm9ybSh0KSYmKHQ9bmV3IEZvcm1EYXRhKHQpKSxDLmlzRm9ybURhdGEodCkpcmV0dXJuIGc/SlNPTi5zdHJpbmdpZnkoY0EodCkpOnQ7aWYoQy5pc0FycmF5QnVmZmVyKHQpfHxDLmlzQnVmZmVyKHQpfHxDLmlzU3RyZWFtKHQpfHxDLmlzRmlsZSh0KXx8Qy5pc0Jsb2IodCkpcmV0dXJuIHQ7aWYoQy5pc0FycmF5QnVmZmVyVmlldyh0KSlyZXR1cm4gdC5idWZmZXI7aWYoQy5pc1VSTFNlYXJjaFBhcmFtcyh0KSlyZXR1cm4gSS5zZXRDb250ZW50VHlwZSgiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgiLCExKSx0LnRvU3RyaW5nKCk7bGV0IG47aWYocil7aWYoZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKT4tMSlyZXR1cm4gSEEodCx0aGlzLmZvcm1TZXJpYWxpemVyKS50b1N0cmluZygpO2lmKChuPUMuaXNGaWxlTGlzdCh0KSl8fGUuaW5kZXhPZigibXVsdGlwYXJ0L2Zvcm0tZGF0YSIpPi0xKXtsZXQgYT10aGlzLmVudiYmdGhpcy5lbnYuRm9ybURhdGE7cmV0dXJuIEoobj97ImZpbGVzW10iOnR9OnQsYSYmbmV3IGEsdGhpcy5mb3JtU2VyaWFsaXplcil9fXJldHVybiByfHxnPyhJLnNldENvbnRlbnRUeXBlKCJhcHBsaWNhdGlvbi9qc29uIiwhMSkscmUodCkpOnR9XSx0cmFuc2Zvcm1SZXNwb25zZTpbZnVuY3Rpb24odCl7bGV0IEk9dGhpcy50cmFuc2l0aW9uYWx8fFlBLnRyYW5zaXRpb25hbCxlPUkmJkkuZm9yY2VkSlNPTlBhcnNpbmcsZz10aGlzLnJlc3BvbnNlVHlwZT09PSJqc29uIjtpZih0JiZDLmlzU3RyaW5nKHQpJiYoZSYmIXRoaXMucmVzcG9uc2VUeXBlfHxnKSl7bGV0IG89IShJJiZJLnNpbGVudEpTT05QYXJzaW5nKSYmZzt0cnl7cmV0dXJuIEpTT04ucGFyc2UodCl9Y2F0Y2gobil7aWYobyl0aHJvdyBuLm5hbWU9PT0iU3ludGF4RXJyb3IiP2wuZnJvbShuLGwuRVJSX0JBRF9SRVNQT05TRSx0aGlzLG51bGwsdGhpcy5yZXNwb25zZSk6bn19cmV0dXJuIHR9XSx0aW1lb3V0OjAseHNyZkNvb2tpZU5hbWU6IlhTUkYtVE9LRU4iLHhzcmZIZWFkZXJOYW1lOiJYLVhTUkYtVE9LRU4iLG1heENvbnRlbnRMZW5ndGg6LTEsbWF4Qm9keUxlbmd0aDotMSxlbnY6e0Zvcm1EYXRhOncuY2xhc3Nlcy5Gb3JtRGF0YSxCbG9iOncuY2xhc3Nlcy5CbG9ifSx2YWxpZGF0ZVN0YXR1czpmdW5jdGlvbih0KXtyZXR1cm4gdD49MjAwJiZ0PDMwMH0saGVhZGVyczp7Y29tbW9uOntBY2NlcHQ6ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKiIsIkNvbnRlbnQtVHlwZSI6dm9pZCAwfX19O0MuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiLCJwb3N0IiwicHV0IiwicGF0Y2giXSxBPT57WUEuaGVhZGVyc1tBXT17fX0pO3ZhciBUPVlBO3ZhciBvZT1DLnRvT2JqZWN0U2V0KFsiYWdlIiwiYXV0aG9yaXphdGlvbiIsImNvbnRlbnQtbGVuZ3RoIiwiY29udGVudC10eXBlIiwiZXRhZyIsImV4cGlyZXMiLCJmcm9tIiwiaG9zdCIsImlmLW1vZGlmaWVkLXNpbmNlIiwiaWYtdW5tb2RpZmllZC1zaW5jZSIsImxhc3QtbW9kaWZpZWQiLCJsb2NhdGlvbiIsIm1heC1mb3J3YXJkcyIsInByb3h5LWF1dGhvcml6YXRpb24iLCJyZWZlcmVyIiwicmV0cnktYWZ0ZXIiLCJ1c2VyLWFnZW50Il0pLFN0PUE9PntsZXQgdD17fSxJLGUsZztyZXR1cm4gQSYmQS5zcGxpdChgJTBBYCkuZm9yRWFjaChmdW5jdGlvbihvKXtnPW8uaW5kZXhPZigiOiIpLEk9by5zdWJzdHJpbmcoMCxnKS50cmltKCkudG9Mb3dlckNhc2UoKSxlPW8uc3Vic3RyaW5nKGcrMSkudHJpbSgpLCEoIUl8fHRbSV0mJm9lW0ldKSYmKEk9PT0ic2V0LWNvb2tpZSI/dFtJXT90W0ldLnB1c2goZSk6dFtJXT1bZV06dFtJXT10W0ldP3RbSV0rIiwgIitlOmUpfSksdH07dmFyIEZ0PVN5bWJvbCgiaW50ZXJuYWxzIik7ZnVuY3Rpb24geihBKXtyZXR1cm4gQSYmU3RyaW5nKEEpLnRyaW0oKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIGZBKEEpe3JldHVybiBBPT09ITF8fEE9PW51bGw/QTpDLmlzQXJyYXkoQSk/QS5tYXAoZkEpOlN0cmluZyhBKX1mdW5jdGlvbiBpZShBKXtsZXQgdD1PYmplY3QuY3JlYXRlKG51bGwpLEk9LyhbXlxccyw7PV0rKVxccyooPzo9XFxzKihbXiw7XSspKT8vZyxlO2Zvcig7ZT1JLmV4ZWMoQSk7KXRbZVsxXV09ZVsyXTtyZXR1cm4gdH12YXIgQ2U9QT0+L15bLV9hLXpBLVowLTleYHx+LCElMjMkJSZcJyorLl0rJC8udGVzdChBLnRyaW0oKSk7ZnVuY3Rpb24gYkEoQSx0LEksZSxnKXtpZihDLmlzRnVuY3Rpb24oZSkpcmV0dXJuIGUuY2FsbCh0aGlzLHQsSSk7aWYoZyYmKHQ9SSksISFDLmlzU3RyaW5nKHQpKXtpZihDLmlzU3RyaW5nKGUpKXJldHVybiB0LmluZGV4T2YoZSkhPT0tMTtpZihDLmlzUmVnRXhwKGUpKXJldHVybiBlLnRlc3QodCl9fWZ1bmN0aW9uIEJlKEEpe3JldHVybiBBLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoLyhbYS16XFxkXSkoXFx3KikvZywodCxJLGUpPT5JLnRvVXBwZXJDYXNlKCkrZSl9ZnVuY3Rpb24gbmUoQSx0KXtsZXQgST1DLnRvQ2FtZWxDYXNlKCIgIit0KTtbImdldCIsInNldCIsImhhcyJdLmZvckVhY2goZT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eShBLGUrSSx7dmFsdWU6ZnVuY3Rpb24oZyxyLG8pe3JldHVybiB0aGlzW2VdLmNhbGwodGhpcyx0LGcscixvKX0sY29uZmlndXJhYmxlOiEwfSl9KX12YXIgUD1jbGFzc3tjb25zdHJ1Y3Rvcih0KXt0JiZ0aGlzLnNldCh0KX1zZXQodCxJLGUpe2xldCBnPXRoaXM7ZnVuY3Rpb24gcihuLGEsUSl7bGV0IEI9eihhKTtpZighQil0aHJvdyBuZXcgRXJyb3IoImhlYWRlciBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nIik7bGV0IGk9Qy5maW5kS2V5KGcsQik7KCFpfHxnW2ldPT09dm9pZCAwfHxRPT09ITB8fFE9PT12b2lkIDAmJmdbaV0hPT0hMSkmJihnW2l8fGFdPWZBKG4pKX1sZXQgbz0obixhKT0+Qy5mb3JFYWNoKG4sKFEsQik9PnIoUSxCLGEpKTtyZXR1cm4gQy5pc1BsYWluT2JqZWN0KHQpfHx0IGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9vKHQsSSk6Qy5pc1N0cmluZyh0KSYmKHQ9dC50cmltKCkpJiYhQ2UodCk/byhTdCh0KSxJKTp0IT1udWxsJiZyKEksdCxlKSx0aGlzfWdldCh0LEkpe2lmKHQ9eih0KSx0KXtsZXQgZT1DLmZpbmRLZXkodGhpcyx0KTtpZihlKXtsZXQgZz10aGlzW2VdO2lmKCFJKXJldHVybiBnO2lmKEk9PT0hMClyZXR1cm4gaWUoZyk7aWYoQy5pc0Z1bmN0aW9uKEkpKXJldHVybiBJLmNhbGwodGhpcyxnLGUpO2lmKEMuaXNSZWdFeHAoSSkpcmV0dXJuIEkuZXhlYyhnKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJwYXJzZXIgbXVzdCBiZSBib29sZWFufHJlZ2V4cHxmdW5jdGlvbiIpfX19aGFzKHQsSSl7aWYodD16KHQpLHQpe2xldCBlPUMuZmluZEtleSh0aGlzLHQpO3JldHVybiEhKGUmJnRoaXNbZV0hPT12b2lkIDAmJighSXx8YkEodGhpcyx0aGlzW2VdLGUsSSkpKX1yZXR1cm4hMX1kZWxldGUodCxJKXtsZXQgZT10aGlzLGc9ITE7ZnVuY3Rpb24gcihvKXtpZihvPXoobyksbyl7bGV0IG49Qy5maW5kS2V5KGUsbyk7biYmKCFJfHxiQShlLGVbbl0sbixJKSkmJihkZWxldGUgZVtuXSxnPSEwKX19cmV0dXJuIEMuaXNBcnJheSh0KT90LmZvckVhY2gocik6cih0KSxnfWNsZWFyKHQpe2xldCBJPU9iamVjdC5rZXlzKHRoaXMpLGU9SS5sZW5ndGgsZz0hMTtmb3IoO2UtLTspe2xldCByPUlbZV07KCF0fHxiQSh0aGlzLHRoaXNbcl0scix0LCEwKSkmJihkZWxldGUgdGhpc1tyXSxnPSEwKX1yZXR1cm4gZ31ub3JtYWxpemUodCl7bGV0IEk9dGhpcyxlPXt9O3JldHVybiBDLmZvckVhY2godGhpcywoZyxyKT0+e2xldCBvPUMuZmluZEtleShlLHIpO2lmKG8pe0lbb109ZkEoZyksZGVsZXRlIElbcl07cmV0dXJufWxldCBuPXQ/QmUocik6U3RyaW5nKHIpLnRyaW0oKTtuIT09ciYmZGVsZXRlIElbcl0sSVtuXT1mQShnKSxlW25dPSEwfSksdGhpc31jb25jYXQoLi4udCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IuY29uY2F0KHRoaXMsLi4udCl9dG9KU09OKHQpe2xldCBJPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIEMuZm9yRWFjaCh0aGlzLChlLGcpPT57ZSE9bnVsbCYmZSE9PSExJiYoSVtnXT10JiZDLmlzQXJyYXkoZSk/ZS5qb2luKCIsICIpOmUpfSksSX1bU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiBPYmplY3QuZW50cmllcyh0aGlzLnRvSlNPTigpKVtTeW1ib2wuaXRlcmF0b3JdKCl9dG9TdHJpbmcoKXtyZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy50b0pTT04oKSkubWFwKChbdCxJXSk9PnQrIjogIitJKS5qb2luKGAlMEFgKX1nZXRbU3ltYm9sLnRvU3RyaW5nVGFnXSgpe3JldHVybiJBeGlvc0hlYWRlcnMifXN0YXRpYyBmcm9tKHQpe3JldHVybiB0IGluc3RhbmNlb2YgdGhpcz90Om5ldyB0aGlzKHQpfXN0YXRpYyBjb25jYXQodCwuLi5JKXtsZXQgZT1uZXcgdGhpcyh0KTtyZXR1cm4gSS5mb3JFYWNoKGc9PmUuc2V0KGcpKSxlfXN0YXRpYyBhY2Nlc3Nvcih0KXtsZXQgZT0odGhpc1tGdF09dGhpc1tGdF09e2FjY2Vzc29yczp7fX0pLmFjY2Vzc29ycyxnPXRoaXMucHJvdG90eXBlO2Z1bmN0aW9uIHIobyl7bGV0IG49eihvKTtlW25dfHwobmUoZyxvKSxlW25dPSEwKX1yZXR1cm4gQy5pc0FycmF5KHQpP3QuZm9yRWFjaChyKTpyKHQpLHRoaXN9fTtQLmFjY2Vzc29yKFsiQ29udGVudC1UeXBlIiwiQ29udGVudC1MZW5ndGgiLCJBY2NlcHQiLCJBY2NlcHQtRW5jb2RpbmciLCJVc2VyLUFnZW50IiwiQXV0aG9yaXphdGlvbiJdKTtDLnJlZHVjZURlc2NyaXB0b3JzKFAucHJvdG90eXBlLCh7dmFsdWU6QX0sdCk9PntsZXQgST10WzBdLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKTtyZXR1cm57Z2V0OigpPT5BLHNldChlKXt0aGlzW0ldPWV9fX0pO0MuZnJlZXplTWV0aG9kcyhQKTt2YXIgbT1QO2Z1bmN0aW9uIF8oQSx0KXtsZXQgST10aGlzfHxULGU9dHx8SSxnPW0uZnJvbShlLmhlYWRlcnMpLHI9ZS5kYXRhO3JldHVybiBDLmZvckVhY2goQSxmdW5jdGlvbihuKXtyPW4uY2FsbChJLHIsZy5ub3JtYWxpemUoKSx0P3Quc3RhdHVzOnZvaWQgMCl9KSxnLm5vcm1hbGl6ZSgpLHJ9ZnVuY3Rpb24gdihBKXtyZXR1cm4hIShBJiZBLl9fQ0FOQ0VMX18pfWZ1bmN0aW9uIFJ0KEEsdCxJKXtsLmNhbGwodGhpcyxBPz8iY2FuY2VsZWQiLGwuRVJSX0NBTkNFTEVELHQsSSksdGhpcy5uYW1lPSJDYW5jZWxlZEVycm9yIn1DLmluaGVyaXRzKFJ0LGwse19fQ0FOQ0VMX186ITB9KTt2YXIgSD1SdDtmdW5jdGlvbiBNQShBLHQsSSl7bGV0IGU9SS5jb25maWcudmFsaWRhdGVTdGF0dXM7IUkuc3RhdHVzfHwhZXx8ZShJLnN0YXR1cyk/QShJKTp0KG5ldyBsKCJSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICIrSS5zdGF0dXMsW2wuRVJSX0JBRF9SRVFVRVNULGwuRVJSX0JBRF9SRVNQT05TRV1bTWF0aC5mbG9vcihJLnN0YXR1cy8xMDApLTRdLEkuY29uZmlnLEkucmVxdWVzdCxJKSl9dmFyIE50PXcuaGFzU3RhbmRhcmRCcm93c2VyRW52P3t3cml0ZShBLHQsSSxlLGcscil7bGV0IG89W0ErIj0iK2VuY29kZVVSSUNvbXBvbmVudCh0KV07Qy5pc051bWJlcihJKSYmby5wdXNoKCJleHBpcmVzPSIrbmV3IERhdGUoSSkudG9HTVRTdHJpbmcoKSksQy5pc1N0cmluZyhlKSYmby5wdXNoKCJwYXRoPSIrZSksQy5pc1N0cmluZyhnKSYmby5wdXNoKCJkb21haW49IitnKSxyPT09ITAmJm8ucHVzaCgic2VjdXJlIiksZG9jdW1lbnQuY29va2llPW8uam9pbigiOyAiKX0scmVhZChBKXtsZXQgdD1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58O1xcXFxzKikoIitBKyIpPShbXjtdKikiKSk7cmV0dXJuIHQ/ZGVjb2RlVVJJQ29tcG9uZW50KHRbM10pOm51bGx9LHJlbW92ZShBKXt0aGlzLndyaXRlKEEsIiIsRGF0ZS5ub3coKS04NjRlNSl9fTp7d3JpdGUoKXt9LHJlYWQoKXtyZXR1cm4gbnVsbH0scmVtb3ZlKCl7fX07ZnVuY3Rpb24gcUEoQSl7cmV0dXJuL14oW2Etel1bYS16XFxkK1xcLS5dKjopP1xcL1xcLy9pLnRlc3QoQSl9ZnVuY3Rpb24gS0EoQSx0KXtyZXR1cm4gdD9BLnJlcGxhY2UoL1xcLz9cXC8kLywiIikrIi8iK3QucmVwbGFjZSgvXlxcLysvLCIiKTpBfWZ1bmN0aW9uICQoQSx0KXtyZXR1cm4gQSYmIXFBKHQpP0tBKEEsdCk6dH12YXIgVXQ9dy5oYXNTdGFuZGFyZEJyb3dzZXJFbnY/ZnVuY3Rpb24oKXtsZXQgdD0vKG1zaWV8dHJpZGVudCkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLEk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpLGU7ZnVuY3Rpb24gZyhyKXtsZXQgbz1yO3JldHVybiB0JiYoSS5zZXRBdHRyaWJ1dGUoImhyZWYiLG8pLG89SS5ocmVmKSxJLnNldEF0dHJpYnV0ZSgiaHJlZiIsbykse2hyZWY6SS5ocmVmLHByb3RvY29sOkkucHJvdG9jb2w/SS5wcm90b2NvbC5yZXBsYWNlKC86JC8sIiIpOiIiLGhvc3Q6SS5ob3N0LHNlYXJjaDpJLnNlYXJjaD9JLnNlYXJjaC5yZXBsYWNlKC9eXFw/LywiIik6IiIsaGFzaDpJLmhhc2g/SS5oYXNoLnJlcGxhY2UoL14lMjMvLCIiKToiIixob3N0bmFtZTpJLmhvc3RuYW1lLHBvcnQ6SS5wb3J0LHBhdGhuYW1lOkkucGF0aG5hbWUuY2hhckF0KDApPT09Ii8iP0kucGF0aG5hbWU6Ii8iK0kucGF0aG5hbWV9fXJldHVybiBlPWcod2luZG93LmxvY2F0aW9uLmhyZWYpLGZ1bmN0aW9uKG8pe2xldCBuPUMuaXNTdHJpbmcobyk/ZyhvKTpvO3JldHVybiBuLnByb3RvY29sPT09ZS5wcm90b2NvbCYmbi5ob3N0PT09ZS5ob3N0fX0oKTpmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiEwfX0oKTtmdW5jdGlvbiBPQShBKXtsZXQgdD0vXihbLStcXHddezEsMjV9KSg6P1xcL1xcL3w6KS8uZXhlYyhBKTtyZXR1cm4gdCYmdFsxXXx8IiJ9ZnVuY3Rpb24gc2UoQSx0KXtBPUF8fDEwO2xldCBJPW5ldyBBcnJheShBKSxlPW5ldyBBcnJheShBKSxnPTAscj0wLG87cmV0dXJuIHQ9dCE9PXZvaWQgMD90OjFlMyxmdW5jdGlvbihhKXtsZXQgUT1EYXRlLm5vdygpLEI9ZVtyXTtvfHwobz1RKSxJW2ddPWEsZVtnXT1RO2xldCBpPXIsZj0wO2Zvcig7aSE9PWc7KWYrPUlbaSsrXSxpPWklQTtpZihnPShnKzEpJUEsZz09PXImJihyPShyKzEpJUEpLFEtbzx0KXJldHVybjtsZXQgcz1CJiZRLUI7cmV0dXJuIHM/TWF0aC5yb3VuZChmKjFlMy9zKTp2b2lkIDB9fXZhciBHdD1zZTtmdW5jdGlvbiBrdChBLHQpe2xldCBJPTAsZT1HdCg1MCwyNTApO3JldHVybiBnPT57bGV0IHI9Zy5sb2FkZWQsbz1nLmxlbmd0aENvbXB1dGFibGU/Zy50b3RhbDp2b2lkIDAsbj1yLUksYT1lKG4pLFE9cjw9bztJPXI7bGV0IEI9e2xvYWRlZDpyLHRvdGFsOm8scHJvZ3Jlc3M6bz9yL286dm9pZCAwLGJ5dGVzOm4scmF0ZTphfHx2b2lkIDAsZXN0aW1hdGVkOmEmJm8mJlE/KG8tcikvYTp2b2lkIDAsZXZlbnQ6Z307Qlt0PyJkb3dubG9hZCI6InVwbG9hZCJdPSEwLEEoQil9fXZhciBRZT10eXBlb2YgWE1MSHR0cFJlcXVlc3Q8InUiLEx0PVFlJiZmdW5jdGlvbihBKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oSSxlKXtsZXQgZz1BLmRhdGEscj1tLmZyb20oQS5oZWFkZXJzKS5ub3JtYWxpemUoKSx7cmVzcG9uc2VUeXBlOm8sd2l0aFhTUkZUb2tlbjpufT1BLGE7ZnVuY3Rpb24gUSgpe0EuY2FuY2VsVG9rZW4mJkEuY2FuY2VsVG9rZW4udW5zdWJzY3JpYmUoYSksQS5zaWduYWwmJkEuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IixhKX1sZXQgQjtpZihDLmlzRm9ybURhdGEoZykpe2lmKHcuaGFzU3RhbmRhcmRCcm93c2VyRW52fHx3Lmhhc1N0YW5kYXJkQnJvd3NlcldlYldvcmtlckVudilyLnNldENvbnRlbnRUeXBlKCExKTtlbHNlIGlmKChCPXIuZ2V0Q29udGVudFR5cGUoKSkhPT0hMSl7bGV0W2MsLi4udV09Qj9CLnNwbGl0KCI7IikubWFwKHk9PnkudHJpbSgpKS5maWx0ZXIoQm9vbGVhbik6W107ci5zZXRDb250ZW50VHlwZShbY3x8Im11bHRpcGFydC9mb3JtLWRhdGEiLC4uLnVdLmpvaW4oIjsgIikpfX1sZXQgaT1uZXcgWE1MSHR0cFJlcXVlc3Q7aWYoQS5hdXRoKXtsZXQgYz1BLmF1dGgudXNlcm5hbWV8fCIiLHU9QS5hdXRoLnBhc3N3b3JkP3VuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChBLmF1dGgucGFzc3dvcmQpKToiIjtyLnNldCgiQXV0aG9yaXphdGlvbiIsIkJhc2ljICIrYnRvYShjKyI6Iit1KSl9bGV0IGY9JChBLmJhc2VVUkwsQS51cmwpO2kub3BlbihBLm1ldGhvZC50b1VwcGVyQ2FzZSgpLFgoZixBLnBhcmFtcyxBLnBhcmFtc1NlcmlhbGl6ZXIpLCEwKSxpLnRpbWVvdXQ9QS50aW1lb3V0O2Z1bmN0aW9uIHMoKXtpZighaSlyZXR1cm47bGV0IGM9bS5mcm9tKCJnZXRBbGxSZXNwb25zZUhlYWRlcnMiaW4gaSYmaS5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkseT17ZGF0YTohb3x8bz09PSJ0ZXh0Inx8bz09PSJqc29uIj9pLnJlc3BvbnNlVGV4dDppLnJlc3BvbnNlLHN0YXR1czppLnN0YXR1cyxzdGF0dXNUZXh0Omkuc3RhdHVzVGV4dCxoZWFkZXJzOmMsY29uZmlnOkEscmVxdWVzdDppfTtNQShmdW5jdGlvbihOKXtJKE4pLFEoKX0sZnVuY3Rpb24oTil7ZShOKSxRKCl9LHkpLGk9bnVsbH1pZigib25sb2FkZW5kImluIGk/aS5vbmxvYWRlbmQ9czppLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFpfHxpLnJlYWR5U3RhdGUhPT00fHxpLnN0YXR1cz09PTAmJiEoaS5yZXNwb25zZVVSTCYmaS5yZXNwb25zZVVSTC5pbmRleE9mKCJmaWxlOiIpPT09MCl8fHNldFRpbWVvdXQocyl9LGkub25hYm9ydD1mdW5jdGlvbigpe2kmJihlKG5ldyBsKCJSZXF1ZXN0IGFib3J0ZWQiLGwuRUNPTk5BQk9SVEVELEEsaSkpLGk9bnVsbCl9LGkub25lcnJvcj1mdW5jdGlvbigpe2UobmV3IGwoIk5ldHdvcmsgRXJyb3IiLGwuRVJSX05FVFdPUkssQSxpKSksaT1udWxsfSxpLm9udGltZW91dD1mdW5jdGlvbigpe2xldCB1PUEudGltZW91dD8idGltZW91dCBvZiAiK0EudGltZW91dCsibXMgZXhjZWVkZWQiOiJ0aW1lb3V0IGV4Y2VlZGVkIix5PUEudHJhbnNpdGlvbmFsfHxhQTtBLnRpbWVvdXRFcnJvck1lc3NhZ2UmJih1PUEudGltZW91dEVycm9yTWVzc2FnZSksZShuZXcgbCh1LHkuY2xhcmlmeVRpbWVvdXRFcnJvcj9sLkVUSU1FRE9VVDpsLkVDT05OQUJPUlRFRCxBLGkpKSxpPW51bGx9LHcuaGFzU3RhbmRhcmRCcm93c2VyRW52JiYobiYmQy5pc0Z1bmN0aW9uKG4pJiYobj1uKEEpKSxufHxuIT09ITEmJlV0KGYpKSl7bGV0IGM9QS54c3JmSGVhZGVyTmFtZSYmQS54c3JmQ29va2llTmFtZSYmTnQucmVhZChBLnhzcmZDb29raWVOYW1lKTtjJiZyLnNldChBLnhzcmZIZWFkZXJOYW1lLGMpfWc9PT12b2lkIDAmJnIuc2V0Q29udGVudFR5cGUobnVsbCksInNldFJlcXVlc3RIZWFkZXIiaW4gaSYmQy5mb3JFYWNoKHIudG9KU09OKCksZnVuY3Rpb24odSx5KXtpLnNldFJlcXVlc3RIZWFkZXIoeSx1KX0pLEMuaXNVbmRlZmluZWQoQS53aXRoQ3JlZGVudGlhbHMpfHwoaS53aXRoQ3JlZGVudGlhbHM9ISFBLndpdGhDcmVkZW50aWFscyksbyYmbyE9PSJqc29uIiYmKGkucmVzcG9uc2VUeXBlPUEucmVzcG9uc2VUeXBlKSx0eXBlb2YgQS5vbkRvd25sb2FkUHJvZ3Jlc3M9PSJmdW5jdGlvbiImJmkuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGt0KEEub25Eb3dubG9hZFByb2dyZXNzLCEwKSksdHlwZW9mIEEub25VcGxvYWRQcm9ncmVzcz09ImZ1bmN0aW9uIiYmaS51cGxvYWQmJmkudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixrdChBLm9uVXBsb2FkUHJvZ3Jlc3MpKSwoQS5jYW5jZWxUb2tlbnx8QS5zaWduYWwpJiYoYT1jPT57aSYmKGUoIWN8fGMudHlwZT9uZXcgSChudWxsLEEsaSk6YyksaS5hYm9ydCgpLGk9bnVsbCl9LEEuY2FuY2VsVG9rZW4mJkEuY2FuY2VsVG9rZW4uc3Vic2NyaWJlKGEpLEEuc2lnbmFsJiYoQS5zaWduYWwuYWJvcnRlZD9hKCk6QS5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLGEpKSk7bGV0IEU9T0EoZik7aWYoRSYmdy5wcm90b2NvbHMuaW5kZXhPZihFKT09PS0xKXtlKG5ldyBsKCJVbnN1cHBvcnRlZCBwcm90b2NvbCAiK0UrIjoiLGwuRVJSX0JBRF9SRVFVRVNULEEpKTtyZXR1cm59aS5zZW5kKGd8fG51bGwpfSl9O3ZhciBUQT17aHR0cDpRQSx4aHI6THR9O0MuZm9yRWFjaChUQSwoQSx0KT0+e2lmKEEpe3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkoQSwibmFtZSIse3ZhbHVlOnR9KX1jYXRjaHt9T2JqZWN0LmRlZmluZVByb3BlcnR5KEEsImFkYXB0ZXJOYW1lIix7dmFsdWU6dH0pfX0pO3ZhciBKdD1BPT5gLSAke0F9YCxFZT1BPT5DLmlzRnVuY3Rpb24oQSl8fEE9PT1udWxsfHxBPT09ITEsbEE9e2dldEFkYXB0ZXI6QT0+e0E9Qy5pc0FycmF5KEEpP0E6W0FdO2xldHtsZW5ndGg6dH09QSxJLGUsZz17fTtmb3IobGV0IHI9MDtyPHQ7cisrKXtJPUFbcl07bGV0IG87aWYoZT1JLCFFZShJKSYmKGU9VEFbKG89U3RyaW5nKEkpKS50b0xvd2VyQ2FzZSgpXSxlPT09dm9pZCAwKSl0aHJvdyBuZXcgbChgVW5rbm93biBhZGFwdGVyIFwnJHtvfVwnYCk7aWYoZSlicmVhaztnW298fCIlMjMiK3JdPWV9aWYoIWUpe2xldCByPU9iamVjdC5lbnRyaWVzKGcpLm1hcCgoW24sYV0pPT5gYWRhcHRlciAke259IGArKGE9PT0hMT8iaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgZW52aXJvbm1lbnQiOiJpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBidWlsZCIpKSxvPXQ/ci5sZW5ndGg+MT9gc2luY2UgOiUwQWArci5tYXAoSnQpLmpvaW4oYCUwQWApOiIgIitKdChyWzBdKToiYXMgbm8gYWRhcHRlciBzcGVjaWZpZWQiO3Rocm93IG5ldyBsKCJUaGVyZSBpcyBubyBzdWl0YWJsZSBhZGFwdGVyIHRvIGRpc3BhdGNoIHRoZSByZXF1ZXN0ICIrbywiRVJSX05PVF9TVVBQT1JUIil9cmV0dXJuIGV9LGFkYXB0ZXJzOlRBfTtmdW5jdGlvbiBQQShBKXtpZihBLmNhbmNlbFRva2VuJiZBLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKSxBLnNpZ25hbCYmQS5zaWduYWwuYWJvcnRlZCl0aHJvdyBuZXcgSChudWxsLEEpfWZ1bmN0aW9uIERBKEEpe3JldHVybiBQQShBKSxBLmhlYWRlcnM9bS5mcm9tKEEuaGVhZGVycyksQS5kYXRhPV8uY2FsbChBLEEudHJhbnNmb3JtUmVxdWVzdCksWyJwb3N0IiwicHV0IiwicGF0Y2giXS5pbmRleE9mKEEubWV0aG9kKSE9PS0xJiZBLmhlYWRlcnMuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsITEpLGxBLmdldEFkYXB0ZXIoQS5hZGFwdGVyfHxULmFkYXB0ZXIpKEEpLnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuIFBBKEEpLGUuZGF0YT1fLmNhbGwoQSxBLnRyYW5zZm9ybVJlc3BvbnNlLGUpLGUuaGVhZGVycz1tLmZyb20oZS5oZWFkZXJzKSxlfSxmdW5jdGlvbihlKXtyZXR1cm4gdihlKXx8KFBBKEEpLGUmJmUucmVzcG9uc2UmJihlLnJlc3BvbnNlLmRhdGE9Xy5jYWxsKEEsQS50cmFuc2Zvcm1SZXNwb25zZSxlLnJlc3BvbnNlKSxlLnJlc3BvbnNlLmhlYWRlcnM9bS5mcm9tKGUucmVzcG9uc2UuaGVhZGVycykpKSxQcm9taXNlLnJlamVjdChlKX0pfXZhciBIdD1BPT5BIGluc3RhbmNlb2YgbT97Li4uQX06QTtmdW5jdGlvbiBrKEEsdCl7dD10fHx7fTtsZXQgST17fTtmdW5jdGlvbiBlKFEsQixpKXtyZXR1cm4gQy5pc1BsYWluT2JqZWN0KFEpJiZDLmlzUGxhaW5PYmplY3QoQik/Qy5tZXJnZS5jYWxsKHtjYXNlbGVzczppfSxRLEIpOkMuaXNQbGFpbk9iamVjdChCKT9DLm1lcmdlKHt9LEIpOkMuaXNBcnJheShCKT9CLnNsaWNlKCk6Qn1mdW5jdGlvbiBnKFEsQixpKXtpZihDLmlzVW5kZWZpbmVkKEIpKXtpZighQy5pc1VuZGVmaW5lZChRKSlyZXR1cm4gZSh2b2lkIDAsUSxpKX1lbHNlIHJldHVybiBlKFEsQixpKX1mdW5jdGlvbiByKFEsQil7aWYoIUMuaXNVbmRlZmluZWQoQikpcmV0dXJuIGUodm9pZCAwLEIpfWZ1bmN0aW9uIG8oUSxCKXtpZihDLmlzVW5kZWZpbmVkKEIpKXtpZighQy5pc1VuZGVmaW5lZChRKSlyZXR1cm4gZSh2b2lkIDAsUSl9ZWxzZSByZXR1cm4gZSh2b2lkIDAsQil9ZnVuY3Rpb24gbihRLEIsaSl7aWYoaSBpbiB0KXJldHVybiBlKFEsQik7aWYoaSBpbiBBKXJldHVybiBlKHZvaWQgMCxRKX1sZXQgYT17dXJsOnIsbWV0aG9kOnIsZGF0YTpyLGJhc2VVUkw6byx0cmFuc2Zvcm1SZXF1ZXN0Om8sdHJhbnNmb3JtUmVzcG9uc2U6byxwYXJhbXNTZXJpYWxpemVyOm8sdGltZW91dDpvLHRpbWVvdXRNZXNzYWdlOm8sd2l0aENyZWRlbnRpYWxzOm8sd2l0aFhTUkZUb2tlbjpvLGFkYXB0ZXI6byxyZXNwb25zZVR5cGU6byx4c3JmQ29va2llTmFtZTpvLHhzcmZIZWFkZXJOYW1lOm8sb25VcGxvYWRQcm9ncmVzczpvLG9uRG93bmxvYWRQcm9ncmVzczpvLGRlY29tcHJlc3M6byxtYXhDb250ZW50TGVuZ3RoOm8sbWF4Qm9keUxlbmd0aDpvLGJlZm9yZVJlZGlyZWN0Om8sdHJhbnNwb3J0Om8saHR0cEFnZW50Om8saHR0cHNBZ2VudDpvLGNhbmNlbFRva2VuOm8sc29ja2V0UGF0aDpvLHJlc3BvbnNlRW5jb2Rpbmc6byx2YWxpZGF0ZVN0YXR1czpuLGhlYWRlcnM6KFEsQik9PmcoSHQoUSksSHQoQiksITApfTtyZXR1cm4gQy5mb3JFYWNoKE9iamVjdC5rZXlzKE9iamVjdC5hc3NpZ24oe30sQSx0KSksZnVuY3Rpb24oQil7bGV0IGk9YVtCXXx8ZyxmPWkoQVtCXSx0W0JdLEIpO0MuaXNVbmRlZmluZWQoZikmJmkhPT1ufHwoSVtCXT1mKX0pLEl9dmFyIHVBPSIxLjYuOCI7dmFyIHhBPXt9O1sib2JqZWN0IiwiYm9vbGVhbiIsIm51bWJlciIsImZ1bmN0aW9uIiwic3RyaW5nIiwic3ltYm9sIl0uZm9yRWFjaCgoQSx0KT0+e3hBW0FdPWZ1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZT09PUF8fCJhIisodDwxPyJuICI6IiAiKStBfX0pO3ZhciBZdD17fTt4QS50cmFuc2l0aW9uYWw9ZnVuY3Rpb24odCxJLGUpe2Z1bmN0aW9uIGcocixvKXtyZXR1cm4iW0F4aW9zIHYiK3VBKyJdIFRyYW5zaXRpb25hbCBvcHRpb24gXCciK3IrIlwnIitvKyhlPyIuICIrZToiIil9cmV0dXJuKHIsbyxuKT0+e2lmKHQ9PT0hMSl0aHJvdyBuZXcgbChnKG8sIiBoYXMgYmVlbiByZW1vdmVkIisoST8iIGluICIrSToiIikpLGwuRVJSX0RFUFJFQ0FURUQpO3JldHVybiBJJiYhWXRbb10mJihZdFtvXT0hMCxjb25zb2xlLndhcm4oZyhvLCIgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSB2IitJKyIgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmVhciBmdXR1cmUiKSkpLHQ/dChyLG8sbik6ITB9fTtmdW5jdGlvbiBhZShBLHQsSSl7aWYodHlwZW9mIEEhPSJvYmplY3QiKXRocm93IG5ldyBsKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0IixsLkVSUl9CQURfT1BUSU9OX1ZBTFVFKTtsZXQgZT1PYmplY3Qua2V5cyhBKSxnPWUubGVuZ3RoO2Zvcig7Zy0tID4wOyl7bGV0IHI9ZVtnXSxvPXRbcl07aWYobyl7bGV0IG49QVtyXSxhPW49PT12b2lkIDB8fG8obixyLEEpO2lmKGEhPT0hMCl0aHJvdyBuZXcgbCgib3B0aW9uICIrcisiIG11c3QgYmUgIithLGwuRVJSX0JBRF9PUFRJT05fVkFMVUUpO2NvbnRpbnVlfWlmKEkhPT0hMCl0aHJvdyBuZXcgbCgiVW5rbm93biBvcHRpb24gIityLGwuRVJSX0JBRF9PUFRJT04pfX12YXIgaEE9e2Fzc2VydE9wdGlvbnM6YWUsdmFsaWRhdG9yczp4QX07dmFyIFk9aEEudmFsaWRhdG9ycyx4PWNsYXNze2NvbnN0cnVjdG9yKHQpe3RoaXMuZGVmYXVsdHM9dCx0aGlzLmludGVyY2VwdG9ycz17cmVxdWVzdDpuZXcgTEEscmVzcG9uc2U6bmV3IExBfX1hc3luYyByZXF1ZXN0KHQsSSl7dHJ5e3JldHVybiBhd2FpdCB0aGlzLl9yZXF1ZXN0KHQsSSl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIEVycm9yKXtsZXQgZztFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT9FcnJvci5jYXB0dXJlU3RhY2tUcmFjZShnPXt9KTpnPW5ldyBFcnJvcjtsZXQgcj1nLnN0YWNrP2cuc3RhY2sucmVwbGFjZSgvXi4rXFxuLywiIik6IiI7ZS5zdGFjaz9yJiYhU3RyaW5nKGUuc3RhY2spLmVuZHNXaXRoKHIucmVwbGFjZSgvXi4rXFxuLitcXG4vLCIiKSkmJihlLnN0YWNrKz1gJTBBYCtyKTplLnN0YWNrPXJ9dGhyb3cgZX19X3JlcXVlc3QodCxJKXt0eXBlb2YgdD09InN0cmluZyI/KEk9SXx8e30sSS51cmw9dCk6ST10fHx7fSxJPWsodGhpcy5kZWZhdWx0cyxJKTtsZXR7dHJhbnNpdGlvbmFsOmUscGFyYW1zU2VyaWFsaXplcjpnLGhlYWRlcnM6cn09STtlIT09dm9pZCAwJiZoQS5hc3NlcnRPcHRpb25zKGUse3NpbGVudEpTT05QYXJzaW5nOlkudHJhbnNpdGlvbmFsKFkuYm9vbGVhbiksZm9yY2VkSlNPTlBhcnNpbmc6WS50cmFuc2l0aW9uYWwoWS5ib29sZWFuKSxjbGFyaWZ5VGltZW91dEVycm9yOlkudHJhbnNpdGlvbmFsKFkuYm9vbGVhbil9LCExKSxnIT1udWxsJiYoQy5pc0Z1bmN0aW9uKGcpP0kucGFyYW1zU2VyaWFsaXplcj17c2VyaWFsaXplOmd9OmhBLmFzc2VydE9wdGlvbnMoZyx7ZW5jb2RlOlkuZnVuY3Rpb24sc2VyaWFsaXplOlkuZnVuY3Rpb259LCEwKSksSS5tZXRob2Q9KEkubWV0aG9kfHx0aGlzLmRlZmF1bHRzLm1ldGhvZHx8ImdldCIpLnRvTG93ZXJDYXNlKCk7bGV0IG89ciYmQy5tZXJnZShyLmNvbW1vbixyW0kubWV0aG9kXSk7ciYmQy5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsInBvc3QiLCJwdXQiLCJwYXRjaCIsImNvbW1vbiJdLEU9PntkZWxldGUgcltFXX0pLEkuaGVhZGVycz1tLmNvbmNhdChvLHIpO2xldCBuPVtdLGE9ITA7dGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uKGMpe3R5cGVvZiBjLnJ1bldoZW49PSJmdW5jdGlvbiImJmMucnVuV2hlbihJKT09PSExfHwoYT1hJiZjLnN5bmNocm9ub3VzLG4udW5zaGlmdChjLmZ1bGZpbGxlZCxjLnJlamVjdGVkKSl9KTtsZXQgUT1bXTt0aGlzLmludGVyY2VwdG9ycy5yZXNwb25zZS5mb3JFYWNoKGZ1bmN0aW9uKGMpe1EucHVzaChjLmZ1bGZpbGxlZCxjLnJlamVjdGVkKX0pO2xldCBCLGk9MCxmO2lmKCFhKXtsZXQgRT1bREEuYmluZCh0aGlzKSx2b2lkIDBdO2ZvcihFLnVuc2hpZnQuYXBwbHkoRSxuKSxFLnB1c2guYXBwbHkoRSxRKSxmPUUubGVuZ3RoLEI9UHJvbWlzZS5yZXNvbHZlKEkpO2k8ZjspQj1CLnRoZW4oRVtpKytdLEVbaSsrXSk7cmV0dXJuIEJ9Zj1uLmxlbmd0aDtsZXQgcz1JO2ZvcihpPTA7aTxmOyl7bGV0IEU9bltpKytdLGM9bltpKytdO3RyeXtzPUUocyl9Y2F0Y2godSl7Yy5jYWxsKHRoaXMsdSk7YnJlYWt9fXRyeXtCPURBLmNhbGwodGhpcyxzKX1jYXRjaChFKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoRSl9Zm9yKGk9MCxmPVEubGVuZ3RoO2k8ZjspQj1CLnRoZW4oUVtpKytdLFFbaSsrXSk7cmV0dXJuIEJ9Z2V0VXJpKHQpe3Q9ayh0aGlzLmRlZmF1bHRzLHQpO2xldCBJPSQodC5iYXNlVVJMLHQudXJsKTtyZXR1cm4gWChJLHQucGFyYW1zLHQucGFyYW1zU2VyaWFsaXplcil9fTtDLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwib3B0aW9ucyJdLGZ1bmN0aW9uKHQpe3gucHJvdG90eXBlW3RdPWZ1bmN0aW9uKEksZSl7cmV0dXJuIHRoaXMucmVxdWVzdChrKGV8fHt9LHttZXRob2Q6dCx1cmw6SSxkYXRhOihlfHx7fSkuZGF0YX0pKX19KTtDLmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSxmdW5jdGlvbih0KXtmdW5jdGlvbiBJKGUpe3JldHVybiBmdW5jdGlvbihyLG8sbil7cmV0dXJuIHRoaXMucmVxdWVzdChrKG58fHt9LHttZXRob2Q6dCxoZWFkZXJzOmU/eyJDb250ZW50LVR5cGUiOiJtdWx0aXBhcnQvZm9ybS1kYXRhIn06e30sdXJsOnIsZGF0YTpvfSkpfX14LnByb3RvdHlwZVt0XT1JKCkseC5wcm90b3R5cGVbdCsiRm9ybSJdPUkoITApfSk7dmFyIEFBPXg7dmFyIGpBPWNsYXNzIEF7Y29uc3RydWN0b3IodCl7aWYodHlwZW9mIHQhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpO2xldCBJO3RoaXMucHJvbWlzZT1uZXcgUHJvbWlzZShmdW5jdGlvbihyKXtJPXJ9KTtsZXQgZT10aGlzO3RoaXMucHJvbWlzZS50aGVuKGc9PntpZighZS5fbGlzdGVuZXJzKXJldHVybjtsZXQgcj1lLl9saXN0ZW5lcnMubGVuZ3RoO2Zvcig7ci0tID4wOyllLl9saXN0ZW5lcnNbcl0oZyk7ZS5fbGlzdGVuZXJzPW51bGx9KSx0aGlzLnByb21pc2UudGhlbj1nPT57bGV0IHIsbz1uZXcgUHJvbWlzZShuPT57ZS5zdWJzY3JpYmUobikscj1ufSkudGhlbihnKTtyZXR1cm4gby5jYW5jZWw9ZnVuY3Rpb24oKXtlLnVuc3Vic2NyaWJlKHIpfSxvfSx0KGZ1bmN0aW9uKHIsbyxuKXtlLnJlYXNvbnx8KGUucmVhc29uPW5ldyBIKHIsbyxuKSxJKGUucmVhc29uKSl9KX10aHJvd0lmUmVxdWVzdGVkKCl7aWYodGhpcy5yZWFzb24pdGhyb3cgdGhpcy5yZWFzb259c3Vic2NyaWJlKHQpe2lmKHRoaXMucmVhc29uKXt0KHRoaXMucmVhc29uKTtyZXR1cm59dGhpcy5fbGlzdGVuZXJzP3RoaXMuX2xpc3RlbmVycy5wdXNoKHQpOnRoaXMuX2xpc3RlbmVycz1bdF19dW5zdWJzY3JpYmUodCl7aWYoIXRoaXMuX2xpc3RlbmVycylyZXR1cm47bGV0IEk9dGhpcy5fbGlzdGVuZXJzLmluZGV4T2YodCk7SSE9PS0xJiZ0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKEksMSl9c3RhdGljIHNvdXJjZSgpe2xldCB0O3JldHVybnt0b2tlbjpuZXcgQShmdW5jdGlvbihnKXt0PWd9KSxjYW5jZWw6dH19fSxidD1qQTtmdW5jdGlvbiBXQShBKXtyZXR1cm4gZnVuY3Rpb24oSSl7cmV0dXJuIEEuYXBwbHkobnVsbCxJKX19ZnVuY3Rpb24gWkEoQSl7cmV0dXJuIEMuaXNPYmplY3QoQSkmJkEuaXNBeGlvc0Vycm9yPT09ITB9dmFyIFZBPXtDb250aW51ZToxMDAsU3dpdGNoaW5nUHJvdG9jb2xzOjEwMSxQcm9jZXNzaW5nOjEwMixFYXJseUhpbnRzOjEwMyxPazoyMDAsQ3JlYXRlZDoyMDEsQWNjZXB0ZWQ6MjAyLE5vbkF1dGhvcml0YXRpdmVJbmZvcm1hdGlvbjoyMDMsTm9Db250ZW50OjIwNCxSZXNldENvbnRlbnQ6MjA1LFBhcnRpYWxDb250ZW50OjIwNixNdWx0aVN0YXR1czoyMDcsQWxyZWFkeVJlcG9ydGVkOjIwOCxJbVVzZWQ6MjI2LE11bHRpcGxlQ2hvaWNlczozMDAsTW92ZWRQZXJtYW5lbnRseTozMDEsRm91bmQ6MzAyLFNlZU90aGVyOjMwMyxOb3RNb2RpZmllZDozMDQsVXNlUHJveHk6MzA1LFVudXNlZDozMDYsVGVtcG9yYXJ5UmVkaXJlY3Q6MzA3LFBlcm1hbmVudFJlZGlyZWN0OjMwOCxCYWRSZXF1ZXN0OjQwMCxVbmF1dGhvcml6ZWQ6NDAxLFBheW1lbnRSZXF1aXJlZDo0MDIsRm9yYmlkZGVuOjQwMyxOb3RGb3VuZDo0MDQsTWV0aG9kTm90QWxsb3dlZDo0MDUsTm90QWNjZXB0YWJsZTo0MDYsUHJveHlBdXRoZW50aWNhdGlvblJlcXVpcmVkOjQwNyxSZXF1ZXN0VGltZW91dDo0MDgsQ29uZmxpY3Q6NDA5LEdvbmU6NDEwLExlbmd0aFJlcXVpcmVkOjQxMSxQcmVjb25kaXRpb25GYWlsZWQ6NDEyLFBheWxvYWRUb29MYXJnZTo0MTMsVXJpVG9vTG9uZzo0MTQsVW5zdXBwb3J0ZWRNZWRpYVR5cGU6NDE1LFJhbmdlTm90U2F0aXNmaWFibGU6NDE2LEV4cGVjdGF0aW9uRmFpbGVkOjQxNyxJbUFUZWFwb3Q6NDE4LE1pc2RpcmVjdGVkUmVxdWVzdDo0MjEsVW5wcm9jZXNzYWJsZUVudGl0eTo0MjIsTG9ja2VkOjQyMyxGYWlsZWREZXBlbmRlbmN5OjQyNCxUb29FYXJseTo0MjUsVXBncmFkZVJlcXVpcmVkOjQyNixQcmVjb25kaXRpb25SZXF1aXJlZDo0MjgsVG9vTWFueVJlcXVlc3RzOjQyOSxSZXF1ZXN0SGVhZGVyRmllbGRzVG9vTGFyZ2U6NDMxLFVuYXZhaWxhYmxlRm9yTGVnYWxSZWFzb25zOjQ1MSxJbnRlcm5hbFNlcnZlckVycm9yOjUwMCxOb3RJbXBsZW1lbnRlZDo1MDEsQmFkR2F0ZXdheTo1MDIsU2VydmljZVVuYXZhaWxhYmxlOjUwMyxHYXRld2F5VGltZW91dDo1MDQsSHR0cFZlcnNpb25Ob3RTdXBwb3J0ZWQ6NTA1LFZhcmlhbnRBbHNvTmVnb3RpYXRlczo1MDYsSW5zdWZmaWNpZW50U3RvcmFnZTo1MDcsTG9vcERldGVjdGVkOjUwOCxOb3RFeHRlbmRlZDo1MTAsTmV0d29ya0F1dGhlbnRpY2F0aW9uUmVxdWlyZWQ6NTExfTtPYmplY3QuZW50cmllcyhWQSkuZm9yRWFjaCgoW0EsdF0pPT57VkFbdF09QX0pO3ZhciBNdD1WQTtmdW5jdGlvbiBxdChBKXtsZXQgdD1uZXcgQUEoQSksST1XKEFBLnByb3RvdHlwZS5yZXF1ZXN0LHQpO3JldHVybiBDLmV4dGVuZChJLEFBLnByb3RvdHlwZSx0LHthbGxPd25LZXlzOiEwfSksQy5leHRlbmQoSSx0LG51bGwse2FsbE93bktleXM6ITB9KSxJLmNyZWF0ZT1mdW5jdGlvbihnKXtyZXR1cm4gcXQoayhBLGcpKX0sSX12YXIgaD1xdChUKTtoLkF4aW9zPUFBO2guQ2FuY2VsZWRFcnJvcj1IO2guQ2FuY2VsVG9rZW49YnQ7aC5pc0NhbmNlbD12O2guVkVSU0lPTj11QTtoLnRvRm9ybURhdGE9SjtoLkF4aW9zRXJyb3I9bDtoLkNhbmNlbD1oLkNhbmNlbGVkRXJyb3I7aC5hbGw9ZnVuY3Rpb24odCl7cmV0dXJuIFByb21pc2UuYWxsKHQpfTtoLnNwcmVhZD1XQTtoLmlzQXhpb3NFcnJvcj1aQTtoLm1lcmdlQ29uZmlnPWs7aC5BeGlvc0hlYWRlcnM9bTtoLmZvcm1Ub0pTT049QT0+Y0EoQy5pc0hUTUxGb3JtKEEpP25ldyBGb3JtRGF0YShBKTpBKTtoLmdldEFkYXB0ZXI9bEEuZ2V0QWRhcHRlcjtoLkh0dHBTdGF0dXNDb2RlPU10O2guZGVmYXVsdD1oO3ZhciBkQT1oO3ZhcntBeGlvczppbyxBeGlvc0Vycm9yOkNvLENhbmNlbGVkRXJyb3I6Qm8saXNDYW5jZWw6bm8sQ2FuY2VsVG9rZW46c28sVkVSU0lPTjpRbyxhbGw6RW8sQ2FuY2VsOmFvLGlzQXhpb3NFcnJvcjpjbyxzcHJlYWQ6Zm8sdG9Gb3JtRGF0YTpsbyxBeGlvc0hlYWRlcnM6RG8sSHR0cFN0YXR1c0NvZGU6dW8sZm9ybVRvSlNPTjpobyxnZXRBZGFwdGVyOnlvLG1lcmdlQ29uZmlnOndvfT1kQTt2YXIgdEEsTCx6QSxYQT17ZW52OntlbXNjcmlwdGVuX25vdGlmeV9tZW1vcnlfZ3Jvd3RoOmZ1bmN0aW9uKEEpe3pBPW5ldyBVaW50OEFycmF5KEwuZXhwb3J0cy5tZW1vcnkuYnVmZmVyKX19fSx5QT1jbGFzc3tpbml0KCl7cmV0dXJuIHRBfHwodHlwZW9mIGZldGNoPCJ1Ij90QT1mZXRjaCgiZGF0YTphcHBsaWNhdGlvbi93YXNtO2Jhc2U2NCwiK0t0KS50aGVuKHQ9PnQuYXJyYXlCdWZmZXIoKSkudGhlbih0PT5XZWJBc3NlbWJseS5pbnN0YW50aWF0ZSh0LFhBKSkudGhlbih0aGlzLl9pbml0KTp0QT1XZWJBc3NlbWJseS5pbnN0YW50aWF0ZShCdWZmZXIuZnJvbShLdCwiYmFzZTY0IiksWEEpLnRoZW4odGhpcy5faW5pdCksdEEpfV9pbml0KHQpe0w9dC5pbnN0YW5jZSxYQS5lbnYuZW1zY3JpcHRlbl9ub3RpZnlfbWVtb3J5X2dyb3d0aCgwKX1kZWNvZGUodCxJPTApe2lmKCFMKXRocm93IG5ldyBFcnJvcigiWlNURERlY29kZXI6IEF3YWl0IC5pbml0KCkgYmVmb3JlIGRlY29kaW5nLiIpO2xldCBlPXQuYnl0ZUxlbmd0aCxnPUwuZXhwb3J0cy5tYWxsb2MoZSk7ekEuc2V0KHQsZyksST1JfHxOdW1iZXIoTC5leHBvcnRzLlpTVERfZmluZERlY29tcHJlc3NlZFNpemUoZyxlKSk7bGV0IHI9TC5leHBvcnRzLm1hbGxvYyhJKSxvPUwuZXhwb3J0cy5aU1REX2RlY29tcHJlc3MocixJLGcsZSksbj16QS5zbGljZShyLHIrbyk7cmV0dXJuIEwuZXhwb3J0cy5mcmVlKGcpLEwuZXhwb3J0cy5mcmVlKHIpLG59fSxLdD0iQUdGemJRRUFBQUFCYmc1Z0EzOS9md0YvWUFGL0FYOWdBbjkvQUdBQmZ3QmdCWDkvZjM5L0FYOWdBMzkvZndCZ0JIOS9mMzhCZjJBQUFYOWdBbjkvQVg5Z0IzOS9mMzkvZjM4QmYyQUNmMzhCZm1BSWYzOS9mMzkvZjM4QmYyQUZmMzkvZjM4QVlBNS9mMzkvZjM5L2YzOS9mMzkvZndGL0FpY0JBMlZ1ZGg5bGJYTmpjbWx3ZEdWdVgyNXZkR2xtZVY5dFpXMXZjbmxmWjNKdmQzUm9BQU1ESXlJSEFBQUJBUU1IQXdFQUNRUUFCUUVJQ0FFRkJnUUVCQU1HQUFBS0FBVUxEQTBHQkFVQmNBRUJBUVVIQVFHQUFvQ0FBZ1lJQVg4QlFZQ2pCQXNIcmdFTEJtMWxiVzl5ZVFJQUJtMWhiR3h2WXdBRkJHWnlaV1VBQmd4YVUxUkVYMmx6UlhKeWIzSUFFaGxhVTFSRVgyWnBibVJFWldOdmJYQnlaWE56WldSVGFYcGxBQndQV2xOVVJGOWtaV052YlhCeVpYTnpBQ0laWDE5cGJtUnBjbVZqZEY5bWRXNWpkR2x2Ymw5MFlXSnNaUUVBRUY5ZlpYSnlibTlmYkc5allYUnBiMjRBQVFsemRHRmphMU5oZG1VQUJ3eHpkR0ZqYTFKbGMzUnZjbVVBQ0FwemRHRmphMEZzYkc5akFBa0tpL0lCSWdVQVFZUWZDek1CQVg4Z0FnUkFJQUFoQXdOQUlBTWdBUzBBQURvQUFDQURRUUZxSVFNZ0FVRUJhaUVCSUFKQkFXc2lBZzBBQ3dzZ0FBc3BBUUYvSUFJRVFDQUFJUU1EUUNBRElBRTZBQUFnQTBFQmFpRURJQUpCQVdzaUFnMEFDd3NnQUF0c0FRSi9RWUFmS0FJQUlnRWdBRUVIYWtGNGNTSUNhaUVBQWtBZ0FrRUFJQUFnQVUwYkRRQWdBRDhBUVJCMFN3UkFJQUEvQUVFUWRHdEIvLzhEYWtFUWRrQUFRWDlHQkg5QkFBVkJBQkFBUVFFTFJRMEJDMEdBSHlBQU5nSUFJQUVQQzBHRUgwRXdOZ0lBUVg4THVTY0JDMzhqQUVFUWF5SUtKQUFDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUFCQjlBRk5CRUJCaUI4b0FnQWlCa0VRSUFCQkMycEJlSEVnQUVFTFNSc2lCVUVEZGlJQWRpSUJRUU54QkVBQ1FDQUJRWDl6UVFGeElBQnFJZ0pCQTNRaUFVR3dIMm9pQUNBQlFiZ2ZhaWdDQUNJQktBSUlJZ1JHQkVCQmlCOGdCa0YrSUFKM2NUWUNBQXdCQ3lBRUlBQTJBZ3dnQUNBRU5nSUlDeUFCUVFocUlRQWdBU0FDUVFOMElnSkJBM0kyQWdRZ0FTQUNhaUlCSUFFb0FnUkJBWEkyQWdRTUR3c2dCVUdRSHlnQ0FDSUhUUTBCSUFFRVFBSkFRUUlnQUhRaUFrRUFJQUpyY2lBQklBQjBjV2dpQVVFRGRDSUFRYkFmYWlJQ0lBQkJ1QjlxS0FJQUlnQW9BZ2dpQkVZRVFFR0lIeUFHUVg0Z0FYZHhJZ1kyQWdBTUFRc2dCQ0FDTmdJTUlBSWdCRFlDQ0FzZ0FDQUZRUU55TmdJRUlBQWdCV29pQ0NBQlFRTjBJZ0VnQldzaUJFRUJjallDQkNBQUlBRnFJQVEyQWdBZ0J3UkFJQWRCZUhGQnNCOXFJUUZCbkI4b0FnQWhBZ0ovSUFaQkFTQUhRUU4yZENJRGNVVUVRRUdJSHlBRElBWnlOZ0lBSUFFTUFRc2dBU2dDQ0FzaEF5QUJJQUkyQWdnZ0F5QUNOZ0lNSUFJZ0FUWUNEQ0FDSUFNMkFnZ0xJQUJCQ0dvaEFFR2NIeUFJTmdJQVFaQWZJQVEyQWdBTUR3dEJqQjhvQWdBaUMwVU5BU0FMYUVFQ2RFRzRJV29vQWdBaUFpZ0NCRUY0Y1NBRmF5RURJQUloQVFOQUFrQWdBU2dDRUNJQVJRUkFJQUVvQWhRaUFFVU5BUXNnQUNnQ0JFRjRjU0FGYXlJQklBTWdBU0FEU1NJQkd5RURJQUFnQWlBQkd5RUNJQUFoQVF3QkN3c2dBaWdDR0NFSklBSWdBaWdDRENJRVJ3UkFRWmdmS0FJQUdpQUNLQUlJSWdBZ0JEWUNEQ0FFSUFBMkFnZ01EZ3NnQWtFVWFpSUJLQUlBSWdCRkJFQWdBaWdDRUNJQVJRMERJQUpCRUdvaEFRc0RRQ0FCSVFnZ0FDSUVRUlJxSWdFb0FnQWlBQTBBSUFSQkVHb2hBU0FFS0FJUUlnQU5BQXNnQ0VFQU5nSUFEQTBMUVg4aEJTQUFRYjkvU3cwQUlBQkJDMm9pQUVGNGNTRUZRWXdmS0FJQUlnaEZEUUJCQUNBRmF5RURBa0FDUUFKQUFuOUJBQ0FGUVlBQ1NRMEFHa0VmSUFWQi8vLy9CMHNOQUJvZ0JVRW1JQUJCQ0habklnQnJka0VCY1NBQVFRRjBhMEUrYWdzaUIwRUNkRUc0SVdvb0FnQWlBVVVFUUVFQUlRQU1BUXRCQUNFQUlBVkJHU0FIUVFGMmEwRUFJQWRCSDBjYmRDRUNBMEFDUUNBQktBSUVRWGh4SUFWcklnWWdBMDhOQUNBQklRUWdCaUlERFFCQkFDRURJQUVoQUF3REN5QUFJQUVvQWhRaUJpQUdJQUVnQWtFZGRrRUVjV29vQWhBaUFVWWJJQUFnQmhzaEFDQUNRUUYwSVFJZ0FRMEFDd3NnQUNBRWNrVUVRRUVBSVFSQkFpQUhkQ0lBUVFBZ0FHdHlJQWh4SWdCRkRRTWdBR2hCQW5SQnVDRnFLQUlBSVFBTElBQkZEUUVMQTBBZ0FDZ0NCRUY0Y1NBRmF5SUNJQU5KSVFFZ0FpQURJQUViSVFNZ0FDQUVJQUViSVFRZ0FDZ0NFQ0lCQkg4Z0FRVWdBQ2dDRkFzaUFBMEFDd3NnQkVVTkFDQURRWkFmS0FJQUlBVnJUdzBBSUFRb0FoZ2hCeUFFSUFRb0Fnd2lBa2NFUUVHWUh5Z0NBQm9nQkNnQ0NDSUFJQUkyQWd3Z0FpQUFOZ0lJREF3TElBUkJGR29pQVNnQ0FDSUFSUVJBSUFRb0FoQWlBRVVOQXlBRVFSQnFJUUVMQTBBZ0FTRUdJQUFpQWtFVWFpSUJLQUlBSWdBTkFDQUNRUkJxSVFFZ0FpZ0NFQ0lBRFFBTElBWkJBRFlDQUF3TEN5QUZRWkFmS0FJQUlnUk5CRUJCbkI4b0FnQWhBQUpBSUFRZ0JXc2lBVUVRVHdSQUlBQWdCV29pQWlBQlFRRnlOZ0lFSUFBZ0JHb2dBVFlDQUNBQUlBVkJBM0kyQWdRTUFRc2dBQ0FFUVFOeU5nSUVJQUFnQkdvaUFTQUJLQUlFUVFGeU5nSUVRUUFoQWtFQUlRRUxRWkFmSUFFMkFnQkJuQjhnQWpZQ0FDQUFRUWhxSVFBTURRc2dCVUdVSHlnQ0FDSUNTUVJBUVpRZklBSWdCV3NpQVRZQ0FFR2dIMEdnSHlnQ0FDSUFJQVZxSWdJMkFnQWdBaUFCUVFGeU5nSUVJQUFnQlVFRGNqWUNCQ0FBUVFocUlRQU1EUXRCQUNFQUlBVkJMMm9pQXdKL1FlQWlLQUlBQkVCQjZDSW9BZ0FNQVF0QjdDSkNmemNDQUVIa0lrS0FvSUNBZ0lBRU53SUFRZUFpSUFwQkRHcEJjSEZCMktyVnFnVnpOZ0lBUWZRaVFRQTJBZ0JCeENKQkFEWUNBRUdBSUFzaUFXb2lCa0VBSUFGcklnaHhJZ0VnQlUwTkRFSEFJaWdDQUNJRUJFQkJ1Q0lvQWdBaUJ5QUJhaUlKSUFkTklBUWdDVWx5RFEwTEFrQkJ4Q0l0QUFCQkJIRkZCRUFDUUFKQUFrQUNRRUdnSHlnQ0FDSUVCRUJCeUNJaEFBTkFJQVFnQUNnQ0FDSUhUd1JBSUFjZ0FDZ0NCR29nQkVzTkF3c2dBQ2dDQ0NJQURRQUxDMEVBRUFRaUFrRi9SZzBESUFFaEJrSGtJaWdDQUNJQVFRRnJJZ1FnQW5FRVFDQUJJQUpySUFJZ0JHcEJBQ0FBYTNGcUlRWUxJQVVnQms4TkEwSEFJaWdDQUNJQUJFQkJ1Q0lvQWdBaUJDQUdhaUlJSUFSTklBQWdDRWx5RFFRTElBWVFCQ0lBSUFKSERRRU1CUXNnQmlBQ2F5QUljU0lHRUFRaUFpQUFLQUlBSUFBb0FnUnFSZzBCSUFJaEFBc2dBRUYvUmcwQklBVkJNR29nQmswRVFDQUFJUUlNQkF0QjZDSW9BZ0FpQWlBRElBWnJha0VBSUFKcmNTSUNFQVJCZjBZTkFTQUNJQVpxSVFZZ0FDRUNEQU1MSUFKQmYwY05BZ3RCeENKQnhDSW9BZ0JCQkhJMkFnQUxJQUVRQkNJQ1FYOUdRUUFRQkNJQVFYOUdjaUFBSUFKTmNnMEZJQUFnQW1zaUJpQUZRU2hxVFEwRkMwRzRJa0c0SWlnQ0FDQUdhaUlBTmdJQVFid2lLQUlBSUFCSkJFQkJ2Q0lnQURZQ0FBc0NRRUdnSHlnQ0FDSURCRUJCeUNJaEFBTkFJQUlnQUNnQ0FDSUJJQUFvQWdRaUJHcEdEUUlnQUNnQ0NDSUFEUUFMREFRTFFaZ2ZLQUlBSWdCQkFDQUFJQUpORzBVRVFFR1lIeUFDTmdJQUMwRUFJUUJCekNJZ0JqWUNBRUhJSWlBQ05nSUFRYWdmUVg4MkFnQkJyQjlCNENJb0FnQTJBZ0JCMUNKQkFEWUNBQU5BSUFCQkEzUWlBVUc0SDJvZ0FVR3dIMm9pQkRZQ0FDQUJRYndmYWlBRU5nSUFJQUJCQVdvaUFFRWdSdzBBQzBHVUh5QUdRU2hySWdCQmVDQUNhMEVIY1NJQmF5SUVOZ0lBUWFBZklBRWdBbW9pQVRZQ0FDQUJJQVJCQVhJMkFnUWdBQ0FDYWtFb05nSUVRYVFmUWZBaUtBSUFOZ0lBREFRTElBSWdBMDBnQVNBRFMzSU5BaUFBS0FJTVFRaHhEUUlnQUNBRUlBWnFOZ0lFUWFBZklBTkJlQ0FEYTBFSGNTSUFhaUlCTmdJQVFaUWZRWlFmS0FJQUlBWnFJZ0lnQUdzaUFEWUNBQ0FCSUFCQkFYSTJBZ1FnQWlBRGFrRW9OZ0lFUWFRZlFmQWlLQUlBTmdJQURBTUxRUUFoQkF3S0MwRUFJUUlNQ0F0Qm1COG9BZ0FnQWtzRVFFR1lIeUFDTmdJQUN5QUNJQVpxSVFGQnlDSWhBQUpBQWtBQ1FBTkFJQUVnQUNnQ0FFY0VRQ0FBS0FJSUlnQU5BUXdDQ3dzZ0FDMEFERUVJY1VVTkFRdEJ5Q0loQUFOQUlBTWdBQ2dDQUNJQlR3UkFJQUVnQUNnQ0JHb2lCQ0FEU3cwREN5QUFLQUlJSVFBTUFBc0FDeUFBSUFJMkFnQWdBQ0FBS0FJRUlBWnFOZ0lFSUFKQmVDQUNhMEVIY1dvaUJ5QUZRUU55TmdJRUlBRkJlQ0FCYTBFSGNXb2lCaUFGSUFkcUlnVnJJUUFnQXlBR1JnUkFRYUFmSUFVMkFnQkJsQjlCbEI4b0FnQWdBR29pQURZQ0FDQUZJQUJCQVhJMkFnUU1DQXRCbkI4b0FnQWdCa1lFUUVHY0h5QUZOZ0lBUVpBZlFaQWZLQUlBSUFCcUlnQTJBZ0FnQlNBQVFRRnlOZ0lFSUFBZ0JXb2dBRFlDQUF3SUN5QUdLQUlFSWdOQkEzRkJBVWNOQmlBRFFYaHhJUWtnQTBIL0FVMEVRQ0FHS0FJTUlnRWdCaWdDQ0NJQ1JnUkFRWWdmUVlnZktBSUFRWDRnQTBFRGRuZHhOZ0lBREFjTElBSWdBVFlDRENBQklBSTJBZ2dNQmdzZ0JpZ0NHQ0VJSUFZZ0JpZ0NEQ0lDUndSQUlBWW9BZ2dpQVNBQ05nSU1JQUlnQVRZQ0NBd0ZDeUFHUVJScUlnRW9BZ0FpQTBVRVFDQUdLQUlRSWdORkRRUWdCa0VRYWlFQkN3TkFJQUVoQkNBRElnSkJGR29pQVNnQ0FDSUREUUFnQWtFUWFpRUJJQUlvQWhBaUF3MEFDeUFFUVFBMkFnQU1CQXRCbEI4Z0JrRW9heUlBUVhnZ0FtdEJCM0VpQVdzaUNEWUNBRUdnSHlBQklBSnFJZ0UyQWdBZ0FTQUlRUUZ5TmdJRUlBQWdBbXBCS0RZQ0JFR2tIMEh3SWlnQ0FEWUNBQ0FESUFSQkp5QUVhMEVIY1dwQkwyc2lBQ0FBSUFOQkVHcEpHeUlCUVJzMkFnUWdBVUhRSWlrQ0FEY0NFQ0FCUWNnaUtRSUFOd0lJUWRBaUlBRkJDR28yQWdCQnpDSWdCallDQUVISUlpQUNOZ0lBUWRRaVFRQTJBZ0FnQVVFWWFpRUFBMEFnQUVFSE5nSUVJQUJCQ0dvZ0FFRUVhaUVBSUFSSkRRQUxJQUVnQTBZTkFDQUJJQUVvQWdSQmZuRTJBZ1FnQXlBQklBTnJJZ0pCQVhJMkFnUWdBU0FDTmdJQUlBSkIvd0ZOQkVBZ0FrRjRjVUd3SDJvaEFBSi9RWWdmS0FJQUlnRkJBU0FDUVFOMmRDSUNjVVVFUUVHSUh5QUJJQUp5TmdJQUlBQU1BUXNnQUNnQ0NBc2hBU0FBSUFNMkFnZ2dBU0FETmdJTUlBTWdBRFlDRENBRElBRTJBZ2dNQVF0Qkh5RUFJQUpCLy8vL0IwMEVRQ0FDUVNZZ0FrRUlkbWNpQUd0MlFRRnhJQUJCQVhSclFUNXFJUUFMSUFNZ0FEWUNIQ0FEUWdBM0FoQWdBRUVDZEVHNElXb2hBUUpBQWtCQmpCOG9BZ0FpQkVFQklBQjBJZ1p4UlFSQVFZd2ZJQVFnQm5JMkFnQWdBU0FETmdJQURBRUxJQUpCR1NBQVFRRjJhMEVBSUFCQkgwY2JkQ0VBSUFFb0FnQWhCQU5BSUFRaUFTZ0NCRUY0Y1NBQ1JnMENJQUJCSFhZaEJDQUFRUUYwSVFBZ0FTQUVRUVJ4YWlJR0tBSVFJZ1FOQUFzZ0JpQUROZ0lRQ3lBRElBRTJBaGdnQXlBRE5nSU1JQU1nQXpZQ0NBd0JDeUFCS0FJSUlnQWdBellDRENBQklBTTJBZ2dnQTBFQU5nSVlJQU1nQVRZQ0RDQURJQUEyQWdnTFFaUWZLQUlBSWdBZ0JVME5BRUdVSHlBQUlBVnJJZ0UyQWdCQm9COUJvQjhvQWdBaUFDQUZhaUlDTmdJQUlBSWdBVUVCY2pZQ0JDQUFJQVZCQTNJMkFnUWdBRUVJYWlFQURBZ0xRWVFmUVRBMkFnQkJBQ0VBREFjTFFRQWhBZ3NnQ0VVTkFBSkFJQVlvQWh3aUFVRUNkRUc0SVdvaUJDZ0NBQ0FHUmdSQUlBUWdBallDQUNBQ0RRRkJqQjlCakI4b0FnQkJmaUFCZDNFMkFnQU1BZ3NnQ0VFUVFSUWdDQ2dDRUNBR1JodHFJQUkyQWdBZ0FrVU5BUXNnQWlBSU5nSVlJQVlvQWhBaUFRUkFJQUlnQVRZQ0VDQUJJQUkyQWhnTElBWW9BaFFpQVVVTkFDQUNJQUUyQWhRZ0FTQUNOZ0lZQ3lBQUlBbHFJUUFnQmlBSmFpSUdLQUlFSVFNTElBWWdBMEYrY1RZQ0JDQUZJQUJCQVhJMkFnUWdBQ0FGYWlBQU5nSUFJQUJCL3dGTkJFQWdBRUY0Y1VHd0gyb2hBUUovUVlnZktBSUFJZ0pCQVNBQVFRTjJkQ0lBY1VVRVFFR0lIeUFBSUFKeU5nSUFJQUVNQVFzZ0FTZ0NDQXNoQUNBQklBVTJBZ2dnQUNBRk5nSU1JQVVnQVRZQ0RDQUZJQUEyQWdnTUFRdEJIeUVESUFCQi8vLy9CMDBFUUNBQVFTWWdBRUVJZG1jaUFXdDJRUUZ4SUFGQkFYUnJRVDVxSVFNTElBVWdBellDSENBRlFnQTNBaEFnQTBFQ2RFRzRJV29oQVFKQUFrQkJqQjhvQWdBaUFrRUJJQU4wSWdSeFJRUkFRWXdmSUFJZ0JISTJBZ0FnQVNBRk5nSUFEQUVMSUFCQkdTQURRUUYyYTBFQUlBTkJIMGNiZENFRElBRW9BZ0FoQWdOQUlBSWlBU2dDQkVGNGNTQUFSZzBDSUFOQkhYWWhBaUFEUVFGMElRTWdBU0FDUVFSeGFpSUVLQUlRSWdJTkFBc2dCQ0FGTmdJUUN5QUZJQUUyQWhnZ0JTQUZOZ0lNSUFVZ0JUWUNDQXdCQ3lBQktBSUlJZ0FnQlRZQ0RDQUJJQVUyQWdnZ0JVRUFOZ0lZSUFVZ0FUWUNEQ0FGSUFBMkFnZ0xJQWRCQ0dvaEFBd0NDd0pBSUFkRkRRQUNRQ0FFS0FJY0lnQkJBblJCdUNGcUlnRW9BZ0FnQkVZRVFDQUJJQUkyQWdBZ0FnMEJRWXdmSUFoQmZpQUFkM0VpQ0RZQ0FBd0NDeUFIUVJCQkZDQUhLQUlRSUFSR0cyb2dBallDQUNBQ1JRMEJDeUFDSUFjMkFoZ2dCQ2dDRUNJQUJFQWdBaUFBTmdJUUlBQWdBallDR0FzZ0JDZ0NGQ0lBUlEwQUlBSWdBRFlDRkNBQUlBSTJBaGdMQWtBZ0EwRVBUUVJBSUFRZ0F5QUZhaUlBUVFOeU5nSUVJQUFnQkdvaUFDQUFLQUlFUVFGeU5nSUVEQUVMSUFRZ0JVRURjallDQkNBRUlBVnFJZ0lnQTBFQmNqWUNCQ0FDSUFOcUlBTTJBZ0FnQTBIL0FVMEVRQ0FEUVhoeFFiQWZhaUVBQW45QmlCOG9BZ0FpQVVFQklBTkJBM1owSWdOeFJRUkFRWWdmSUFFZ0EzSTJBZ0FnQUF3QkN5QUFLQUlJQ3lFQklBQWdBallDQ0NBQklBSTJBZ3dnQWlBQU5nSU1JQUlnQVRZQ0NBd0JDMEVmSVFBZ0EwSC8vLzhIVFFSQUlBTkJKaUFEUVFoMlp5SUFhM1pCQVhFZ0FFRUJkR3RCUG1vaEFBc2dBaUFBTmdJY0lBSkNBRGNDRUNBQVFRSjBRYmdoYWlFQkFrQUNRQ0FJUVFFZ0FIUWlCbkZGQkVCQmpCOGdCaUFJY2pZQ0FDQUJJQUkyQWdBTUFRc2dBMEVaSUFCQkFYWnJRUUFnQUVFZlJ4dDBJUUFnQVNnQ0FDRUZBMEFnQlNJQktBSUVRWGh4SUFOR0RRSWdBRUVkZGlFR0lBQkJBWFFoQUNBQklBWkJCSEZxSWdZb0FoQWlCUTBBQ3lBR0lBSTJBaEFMSUFJZ0FUWUNHQ0FDSUFJMkFnd2dBaUFDTmdJSURBRUxJQUVvQWdnaUFDQUNOZ0lNSUFFZ0FqWUNDQ0FDUVFBMkFoZ2dBaUFCTmdJTUlBSWdBRFlDQ0FzZ0JFRUlhaUVBREFFTEFrQWdDVVVOQUFKQUlBSW9BaHdpQUVFQ2RFRzRJV29pQVNnQ0FDQUNSZ1JBSUFFZ0JEWUNBQ0FFRFFGQmpCOGdDMEYrSUFCM2NUWUNBQXdDQ3lBSlFSQkJGQ0FKS0FJUUlBSkdHMm9nQkRZQ0FDQUVSUTBCQ3lBRUlBazJBaGdnQWlnQ0VDSUFCRUFnQkNBQU5nSVFJQUFnQkRZQ0dBc2dBaWdDRkNJQVJRMEFJQVFnQURZQ0ZDQUFJQVEyQWhnTEFrQWdBMEVQVFFSQUlBSWdBeUFGYWlJQVFRTnlOZ0lFSUFBZ0Ftb2lBQ0FBS0FJRVFRRnlOZ0lFREFFTElBSWdCVUVEY2pZQ0JDQUNJQVZxSWdRZ0EwRUJjallDQkNBRElBUnFJQU0yQWdBZ0J3UkFJQWRCZUhGQnNCOXFJUUJCbkI4b0FnQWhBUUovUVFFZ0IwRURkblFpQlNBR2NVVUVRRUdJSHlBRklBWnlOZ0lBSUFBTUFRc2dBQ2dDQ0FzaEJpQUFJQUUyQWdnZ0JpQUJOZ0lNSUFFZ0FEWUNEQ0FCSUFZMkFnZ0xRWndmSUFRMkFnQkJrQjhnQXpZQ0FBc2dBa0VJYWlFQUN5QUtRUkJxSkFBZ0FBdlNDd0VIZndKQUlBQkZEUUFnQUVFSWF5SUNJQUJCQkdzb0FnQWlBVUY0Y1NJQWFpRUZBa0FnQVVFQmNRMEFJQUZCQTNGRkRRRWdBaUFDS0FJQUlnRnJJZ0pCbUI4b0FnQkpEUUVnQUNBQmFpRUFBa0FDUUVHY0h5Z0NBQ0FDUndSQUlBRkIvd0ZOQkVBZ0FVRURkaUVFSUFJb0Fnd2lBU0FDS0FJSUlnTkdCRUJCaUI5QmlCOG9BZ0JCZmlBRWQzRTJBZ0FNQlFzZ0F5QUJOZ0lNSUFFZ0F6WUNDQXdFQ3lBQ0tBSVlJUVlnQWlBQ0tBSU1JZ0ZIQkVBZ0FpZ0NDQ0lESUFFMkFnd2dBU0FETmdJSURBTUxJQUpCRkdvaUJDZ0NBQ0lEUlFSQUlBSW9BaEFpQTBVTkFpQUNRUkJxSVFRTEEwQWdCQ0VISUFNaUFVRVVhaUlFS0FJQUlnTU5BQ0FCUVJCcUlRUWdBU2dDRUNJRERRQUxJQWRCQURZQ0FBd0NDeUFGS0FJRUlnRkJBM0ZCQTBjTkFrR1FIeUFBTmdJQUlBVWdBVUYrY1RZQ0JDQUNJQUJCQVhJMkFnUWdCU0FBTmdJQUR3dEJBQ0VCQ3lBR1JRMEFBa0FnQWlnQ0hDSURRUUowUWJnaGFpSUVLQUlBSUFKR0JFQWdCQ0FCTmdJQUlBRU5BVUdNSDBHTUh5Z0NBRUYrSUFOM2NUWUNBQXdDQ3lBR1FSQkJGQ0FHS0FJUUlBSkdHMm9nQVRZQ0FDQUJSUTBCQ3lBQklBWTJBaGdnQWlnQ0VDSURCRUFnQVNBRE5nSVFJQU1nQVRZQ0dBc2dBaWdDRkNJRFJRMEFJQUVnQXpZQ0ZDQURJQUUyQWhnTElBSWdCVThOQUNBRktBSUVJZ0ZCQVhGRkRRQUNRQUpBQWtBQ1FDQUJRUUp4UlFSQVFhQWZLQUlBSUFWR0JFQkJvQjhnQWpZQ0FFR1VIMEdVSHlnQ0FDQUFhaUlBTmdJQUlBSWdBRUVCY2pZQ0JDQUNRWndmS0FJQVJ3MEdRWkFmUVFBMkFnQkJuQjlCQURZQ0FBOExRWndmS0FJQUlBVkdCRUJCbkI4Z0FqWUNBRUdRSDBHUUh5Z0NBQ0FBYWlJQU5nSUFJQUlnQUVFQmNqWUNCQ0FBSUFKcUlBQTJBZ0FQQ3lBQlFYaHhJQUJxSVFBZ0FVSC9BVTBFUUNBQlFRTjJJUVFnQlNnQ0RDSUJJQVVvQWdnaUEwWUVRRUdJSDBHSUh5Z0NBRUYrSUFSM2NUWUNBQXdGQ3lBRElBRTJBZ3dnQVNBRE5nSUlEQVFMSUFVb0FoZ2hCaUFGSUFVb0Fnd2lBVWNFUUVHWUh5Z0NBQm9nQlNnQ0NDSURJQUUyQWd3Z0FTQUROZ0lJREFNTElBVkJGR29pQkNnQ0FDSURSUVJBSUFVb0FoQWlBMFVOQWlBRlFSQnFJUVFMQTBBZ0JDRUhJQU1pQVVFVWFpSUVLQUlBSWdNTkFDQUJRUkJxSVFRZ0FTZ0NFQ0lERFFBTElBZEJBRFlDQUF3Q0N5QUZJQUZCZm5FMkFnUWdBaUFBUVFGeU5nSUVJQUFnQW1vZ0FEWUNBQXdEQzBFQUlRRUxJQVpGRFFBQ1FDQUZLQUljSWdOQkFuUkJ1Q0ZxSWdRb0FnQWdCVVlFUUNBRUlBRTJBZ0FnQVEwQlFZd2ZRWXdmS0FJQVFYNGdBM2R4TmdJQURBSUxJQVpCRUVFVUlBWW9BaEFnQlVZYmFpQUJOZ0lBSUFGRkRRRUxJQUVnQmpZQ0dDQUZLQUlRSWdNRVFDQUJJQU0yQWhBZ0F5QUJOZ0lZQ3lBRktBSVVJZ05GRFFBZ0FTQUROZ0lVSUFNZ0FUWUNHQXNnQWlBQVFRRnlOZ0lFSUFBZ0Ftb2dBRFlDQUNBQ1Fad2ZLQUlBUncwQVFaQWZJQUEyQWdBUEN5QUFRZjhCVFFSQUlBQkJlSEZCc0I5cUlRRUNmMEdJSHlnQ0FDSURRUUVnQUVFRGRuUWlBSEZGQkVCQmlCOGdBQ0FEY2pZQ0FDQUJEQUVMSUFFb0FnZ0xJUUFnQVNBQ05nSUlJQUFnQWpZQ0RDQUNJQUUyQWd3Z0FpQUFOZ0lJRHd0Qkh5RURJQUJCLy8vL0IwMEVRQ0FBUVNZZ0FFRUlkbWNpQVd0MlFRRnhJQUZCQVhSclFUNXFJUU1MSUFJZ0F6WUNIQ0FDUWdBM0FoQWdBMEVDZEVHNElXb2hBUUpBQWtBQ1FFR01IeWdDQUNJRVFRRWdBM1FpQjNGRkJFQkJqQjhnQkNBSGNqWUNBQ0FCSUFJMkFnQWdBaUFCTmdJWURBRUxJQUJCR1NBRFFRRjJhMEVBSUFOQkgwY2JkQ0VESUFFb0FnQWhBUU5BSUFFaUJDZ0NCRUY0Y1NBQVJnMENJQU5CSFhZaEFTQURRUUYwSVFNZ0JDQUJRUVJ4YWlJSFFSQnFLQUlBSWdFTkFBc2dCeUFDTmdJUUlBSWdCRFlDR0FzZ0FpQUNOZ0lNSUFJZ0FqWUNDQXdCQ3lBRUtBSUlJZ0FnQWpZQ0RDQUVJQUkyQWdnZ0FrRUFOZ0lZSUFJZ0JEWUNEQ0FDSUFBMkFnZ0xRYWdmUWFnZktBSUFRUUZySWdCQmZ5QUFHellDQUFzTEJBQWpBQXNHQUNBQUpBQUxFQUFqQUNBQWEwRndjU0lBSkFBZ0FBdEtBUUYvSUFBZ0FVa0VRQ0FBSUFFZ0FoQUNEd3NnQWdSQUlBQWdBbW9oQXlBQklBSnFJUUVEUUNBRFFRRnJJZ01nQVVFQmF5SUJMUUFBT2dBQUlBSkJBV3NpQWcwQUN3c2dBQXY5RGdJUmZ3RitJd0JCTUdzaUJ5UUFRYmgvSVFnQ1FDQUZSUTBBSUFRc0FBQWlDVUgvQVhFaEN3SkFJQWxCQUVnRVFDQUxRZjRBYTBFQmRpSUdJQVZQRFFKQmJDRUlJQXRCL3dCcklndEIvd0ZMRFFJZ0JFRUJhaUVJUVFBaEJRTkFJQVVnQzA4RVFDQUxJUWdnQmlFTERBTUZJQUFnQldvZ0NDQUZRUUYyYWlJRUxRQUFRUVIyT2dBQUlBQWdCVUVCY21vZ0JDMEFBRUVQY1RvQUFDQUZRUUpxSVFVTUFRc0FDd0FMSUFVZ0MwME5BU0FIUWY4Qk5nSUVJQVlnQjBFRWFpQUhRUWhxSUFSQkFXb2lEaUFMRUF3aUJFR0lmMHNFUUNBRUlRZ01BZ3RCVkNFSUlBY29BZ2dpRUVFR1N3MEJJQWNvQWdRaUVVRUJkQ0lKUVFKcXJVSUJJQkN0aGlJWVFRRWdFSFFpRFVFQmFpSUZyVUlDaG54OFFndDhRdnovLy8vLy8vLy8vd0NEUXVRQ1ZnMEJRVkloQ0NBUlFmOEJTdzBCSUExQmYzTkJBblJCNUFKcXJTQVJRUUZxSWhWQkFYU3RJQmg4UWdoOFZBMEJJQXNnQkdzaEZpQUVJQTVxSVJjZ0JrR0FCR29pRWlBRlFRSjBhaUlSSUFscVFRSnFJUTRnQmtHRUJHb2hFMEdBZ0FJZ0VIUkJFSFloQ1VFQUlRVkJBU0VQSUExQkFXc2lGQ0VLQTBBZ0JTQVZSa1VFUUFKQUlBWWdCVUVCZENJSWFpOEJBQ0lFUWYvL0EwWUVRQ0FUSUFwQkFuUnFJQVU2QUFJZ0NrRUJheUVLUVFFaEJBd0JDeUFQUVFBZ0NTQUV3VW9iSVE4TElBZ2dFV29nQkRzQkFDQUZRUUZxSVFVTUFRc0xJQVlnRHpzQmdnUWdCaUFRT3dHQUJBSkFJQW9nRkVZRVFDQU5RUU4ySVFoQ0FDRVlRUUFoRHdOQUlBd2dGVVlFUUNBSUlBMUJBWFpxUVFOcUlnbEJBWFFoQ0VFQUlRUkJBQ0VLQTBCQkFDRUZJQW9nRFU4TkJBTkFJQVZCQWtaRkJFQWdFeUFGSUFsc0lBUnFJQlJ4UVFKMGFpQU9JQVVnQ21wcUxRQUFPZ0FDSUFWQkFXb2hCUXdCQ3dzZ0NrRUNhaUVLSUFRZ0NHb2dGSEVoQkF3QUN3QUZJQVlnREVFQmRHb3VBUUFoQ1NBT0lBOXFJZ1FnR0RjQUFFRUlJUVVEUUNBRklBbE9SUVJBSUFRZ0JXb2dHRGNBQUNBRlFRaHFJUVVNQVFzTElCaENnWUtFaUpDZ3dJQUJmQ0VZSUF4QkFXb2hEQ0FKSUE5cUlROE1BUXNBQ3dBTElBMUJBM1lnRFVFQmRtcEJBMm9oQ0VFQUlRVURRQ0FNSUJWR1JRUkFRUUFoQ1NBR0lBeEJBWFJxTGdFQUlnUkJBQ0FFUVFCS0d5RUVBMEFnQkNBSlJrVUVRQ0FUSUFWQkFuUnFJQXc2QUFJRFFDQUZJQWhxSUJSeElnVWdDa3NOQUFzZ0NVRUJhaUVKREFFTEN5QU1RUUZxSVF3TUFRc0xRWDhoQ0NBRkRRSUxJQkJCQVdvaENFRUFJUVVEUUNBRklBMUdSUVJBSUJFZ0V5QUZRUUowYWlJT0xRQUNRUUYwYWlJRUlBUXZBUUFpQ1VFQmFqc0JBQ0FPSUFnZ0NXZEJZSE5xSWdRNkFBTWdEaUFKSUFSMElBMXJPd0VBSUFWQkFXb2hCUXdCQ3dzQ1FBSkFJQVl2QVlJRUJFQWdCMEVjYWlJRUlCY2dGaEFOSWdoQmlIOUxEUUlnQjBFVWFpQUVJQklRRGlBSFFReHFJQVFnRWhBT1FRQWhCUU5BSUFkQkhHb2lCQkFQSUFWQit3RkxjZzBDSUFBZ0JXb2lCaUFIUVJScUlBUVFFRG9BQUNBR0lBZEJER29nQkJBUU9nQUJJQVZCQW5JaEJDQUhRUnhxRUE4RVFDQUVJUVVNQXdVZ0FDQUVhaUFIUVJScUlBZEJIR29pQkJBUU9nQUFJQVlnQjBFTWFpQUVFQkE2QUFNZ0JVRUVhaUVGREFFTEFBc0FDeUFIUVJ4cUlnUWdGeUFXRUEwaUNFR0lmMHNOQVNBSFFSUnFJQVFnRWhBT0lBZEJER29nQkNBU0VBNUJBQ0VGQTBBZ0IwRWNhaUlFRUE4Z0JVSDdBVXR5UlFSQUlBQWdCV29pQmlBSFFSUnFJQVFRRVRvQUFDQUdJQWRCREdvZ0JCQVJPZ0FCSUFWQkFuSWhCQ0FIUVJ4cUVBOEVRQ0FFSVFVRklBQWdCR29nQjBFVWFpQUhRUnhxSWdRUUVUb0FBQ0FHSUFkQkRHb2dCQkFST2dBRElBVkJCR29oQlF3Q0N3c0xBbjhEUUVHNmZ5RUlJQVZCL1FGTERRTWdBQ0FGYWlJR0lBZEJGR29nQjBFY2FpSUpFQkU2QUFBZ0JrRUJhaUVFSUFrUUQwRURSZ1JBSUFkQkRHb2hDRUVDREFJTElBVkIvQUZMRFFNZ0JpQUhRUXhxSUFkQkhHb2lCQkFST2dBQklBVkJBbW9oQlNBRUVBOUJBMGNOQUFzZ0FDQUZhaUVFSUFkQkZHb2hDRUVEQ3lBRUlBZ2dCMEVjYWhBUk9nQUFJQVpxSUFCcklRZ01BUXNDZndOQVFicC9JUWdnQlVIOUFVc05BaUFBSUFWcUlnWWdCMEVVYWlBSFFSeHFJZ2tRRURvQUFDQUdRUUZxSVFRZ0NSQVBRUU5HQkVBZ0IwRU1haUVJUVFJTUFnc2dCVUg4QVVzTkFpQUdJQWRCREdvZ0IwRWNhaUlFRUJBNkFBRWdCVUVDYWlFRklBUVFEMEVEUncwQUN5QUFJQVZxSVFRZ0IwRVVhaUVJUVFNTElBUWdDQ0FIUVJ4cUVCQTZBQUFnQm1vZ0FHc2hDQXNnQ0VHSWYwc05BUXNnQ0NFRVFRQWhCU0FCUVFCQk5CQURJUWxCQUNFS0EwQWdCQ0FGUndSQUlBQWdCV29pQmkwQUFDSUJRUXRMQkVCQmJDRUlEQU1GSUFrZ0FVRUNkR29pQVNBQktBSUFRUUZxTmdJQUlBVkJBV29oQlVFQklBWXRBQUIwUVFGMUlBcHFJUW9NQWdzQUN3dEJiQ0VJSUFwRkRRQWdDbWNpQlVFZmN5SUJRUXRMRFFBZ0EwRWdJQVZyTmdJQVFRRkJBaUFCZENBS2F5SURaMEVmY3lJQmRDQURSdzBBSUFBZ0JHb2dBVUVCYWlJQU9nQUFJQWtnQUVFQ2RHb2lBQ0FBS0FJQVFRRnFOZ0lBSUFrb0FnUWlBRUVDU1NBQVFRRnhjZzBBSUFJZ0JFRUJhallDQUNBTFFRRnFJUWdMSUFkQk1Hb2tBQ0FJQzZBRkFReC9Jd0JCRUdzaURDUUFBbjhnQkVFSFRRUkFJQXhDQURjRENDQU1RUWhxSWdVZ0F5QUVFQUlhUVd3Z0FDQUJJQUlnQlVFSUVBd2lBQ0FBSUFSTEd5QUFJQUJCaVg5Skd3d0JDeUFBUVFBZ0FTZ0NBRUVCYWlJTlFRRjBFQU1oRDBGVUlBTW9BQUFpQmtFUGNTSUFRUXBMRFFBYUlBSWdBRUVGYWpZQ0FDQURJQVJxSWdKQkJHc2hCeUFDUVFkcklRc2dBRUVHYWlFT1FRUWhBaUFHUVFSMklRVkJJQ0FBZENJSVFRRnlJUWxCQUNFQVFRRWhCaUFESVFRRFFBSkFJQVpCQVhGRkJFQURRQ0FGUVg5elFZQ0FnSUI0Y21naUJrRVlTVVVFUUNBQVFTUnFJUUFnQkNBTFRRUi9JQVJCQTJvRklBUWdDMnRCQTNRZ0FtcEJIM0VoQWlBSEN5SUVLQUFBSUFKMklRVU1BUXNMSUFJZ0JrRWVjU0lLYWtFQ2FpRUNJQVpCQVhaQkEyd2dBR29nQlNBS2RrRURjV29pQUNBTlR3MEJBbjhnQkNBTFN5QUNRUU4ySUFScUlnVWdCMHR4UlFSQUlBSkJCM0VoQWlBRkRBRUxJQVFnQjJ0QkEzUWdBbXBCSDNFaEFpQUhDeUlFS0FBQUlBSjJJUVVMSUFVZ0NFRUJhM0VpQmlBSVFRRjBRUUZySWdvZ0NXc2lFRWtFZnlBT1FRRnJCU0FGSUFweElnVWdFRUVBSUFVZ0NFNGJheUVHSUE0TElRVWdEeUFBUVFGMGFpQUdRUUZySWdvN0FRQWdBRUVCYWlFQUlBSWdCV29oQWlBSVFRRWdCbXNnQ2lBR1FRQktHeUFKYWlJSlNnUkFJQWxCQWtnTkFVRWdJQWxuSWdWcklRNUJBU0FGUVI5emRDRUlDeUFBSUExUERRQWdDa0VBUnlFR0FuOGdCQ0FMU3lBQ1FRTjFJQVJxSWdVZ0IwdHhSUVJBSUFKQkIzRWhBaUFGREFFTElBSWdCQ0FIYTBFRGRHcEJIM0VoQWlBSEN5SUVLQUFBSUFKMklRVU1BUXNMUVd3Z0NVRUJSdzBBR2tGUUlBQWdEVXNOQUJwQmJDQUNRU0JLRFFBYUlBRWdBRUVCYXpZQ0FDQUVJQUpCQjJwQkEzVnFJQU5yQ3lBTVFSQnFKQUFMOGdFQkFYOGdBa1VFUUNBQVFnQTNBZ0FnQUVFQU5nSVFJQUJDQURjQ0NFRzRmdzhMSUFBZ0FUWUNEQ0FBSUFGQkJHbzJBaEFnQWtFRVR3UkFJQUFnQVNBQ2FpSUJRUVJySWdNMkFnZ2dBQ0FES0FBQU5nSUFJQUZCQVdzdEFBQWlBUVJBSUFBZ0FXZEJGMnMyQWdRZ0FnOExJQUJCQURZQ0JFRi9Ed3NnQUNBQk5nSUlJQUFnQVMwQUFDSUROZ0lBQWtBQ1FBSkFJQUpCQW1zT0FnRUFBZ3NnQUNBQkxRQUNRUkIwSUFOeUlnTTJBZ0FMSUFBZ0FTMEFBVUVJZENBRGFqWUNBQXNnQVNBQ2FrRUJheTBBQUNJQlJRUkFJQUJCQURZQ0JFRnNEd3NnQUNBQlp5QUNRUU4wYTBFSmFqWUNCQ0FDQzBRQkFuOGdBU0FDTHdFQUlnTWdBU2dDQkdvaUJEWUNCQ0FBSUFOQkFuUkJvQjFxS0FJQUlBRW9BZ0JCQUNBRWEzWnhOZ0lBSUFFUUR4b2dBQ0FDUVFScU5nSUVDNThCQVFSL1FRTWhBU0FBS0FJRUlnSkJJRTBFUUNBQUtBSUlJZ0VnQUNnQ0VFOEVRQ0FBSUFKQkIzRTJBZ1FnQUNBQklBSkJBM1pySWdJMkFnZ2dBQ0FDS0FBQU5nSUFRUUFQQ3lBQUtBSU1JZ01nQVVZRVFFRUJRUUlnQWtFZ1NSc1BDeUFBSUFFZ0FTQURheUFDUVFOMklnUWdBU0FFYXlBRFNTSUJHeUlEYXlJRU5nSUlJQUFnQWlBRFFRTjBhellDQkNBQUlBUW9BQUEyQWdBTElBRUxTQUVFZnlBQUtBSUVJQUFvQWdCQkFuUnFJZ0l0QUFJZ0FpOEJBQ0VFSUFFZ0FTZ0NCQ0lGSUFJdEFBTWlBbW8yQWdRZ0FDQUVJQUVvQWdBZ0JYUkJBQ0FDYTNacU5nSUFDMUlCQkg4Z0FDZ0NCQ0FBS0FJQVFRSjBhaUlDTFFBQ0lBSXZBUUFoQkNBQklBSXRBQU1pQWlBQktBSUVhaUlGTmdJRUlBQWdCQ0FDUVFKMFFhQWRhaWdDQUNBQktBSUFRUUFnQld0MmNXbzJBZ0FMQ0FBZ0FFR0lmMHNMR2dBZ0FBUkFJQUVFUUNBQ0lBQWdBUkVDQUE4TElBQVFCZ3NMcGdnQ0RYOEJmaU1BUVJCcklna2tBQ0FKUVFBMkFnd2dDVUVBTmdJSUFuOENRQ0FEUWVnSmFpQURJQWxCQ0dvZ0NVRU1haUFCSUFJZ0EwR0FBV29RQ3lJUFFZaC9TdzBBUVZRZ0NTZ0NEQ0lFSUFBb0FnQWlBVUgvQVhGQkFXcExEUUVhSUFCQkJHb2hDeUFBSUFGQi80R0FlSEVnQkVFUWRFR0FnUHdIY1hJMkFnQkJmeUFFSUFSQkFFZ2JRUUZxSVFCQkFDRUJJQWtvQWdnaEJVRUFJUUlEUUNBQUlBSkdCRUFnQlVFRGF5RUJRUUFoQUFOQUFrQkJBQ0VDSUFBZ0FVNEVRQU5BSUFBZ0JVNE5BaUFESUFBZ0EycEI2QWxxTFFBQVFRSjBha0ZBYXlJQklBRW9BZ0FpQVVFQmFqWUNBQ0FCSUFOcUlBQTZBT2dISUFCQkFXb2hBQXdBQ3dBRkEwQWdBa0VFUmtVRVFDQURJQU1nQUNBQ2FpSUhha0hvQ1dvdEFBQkJBblJxUVVCcklnZ2dDQ2dDQUNJSVFRRnFOZ0lBSUFNZ0NHb2dCem9BNkFjZ0FrRUJhaUVDREFFTEN5QUFRUVJxSVFBTUFnc0FDd3NnQkVFQmFpRU9JQU1vQWdBaEIwRUFJUUJCQVNFSUEwQWdDQ0FPUmcwRElBNGdDR3NoQkNBRElBaEJBblJxS0FJQUlRVUNRQUpBQWtBQ1FBSkFBa0JCQVNBSWRFRUJkU0lOUVFGckRnZ0FBUVFDQkFRRUF3UUxRUUFoQWlBRlFRQWdCVUVBU2hzaEJpQUFJUUVEUUNBQ0lBWkdEUVVnQXlBQ0lBZHFhaTBBNkFjaENpQUxJQUZCQVhScUlnd2dCRG9BQVNBTUlBbzZBQUFnQWtFQmFpRUNJQUZCQVdvaEFRd0FDd0FMUVFBaEFpQUZRUUFnQlVFQVNoc2hDaUFBSVFFRFFDQUNJQXBHRFFRZ0N5QUJRUUYwYWlJR0lBTWdBaUFIYW1vdEFPZ0hJZ3c2QUFJZ0JpQUVPZ0FCSUFZZ0REb0FBQ0FHSUFRNkFBTWdBa0VCYWlFQ0lBRkJBbW9oQVF3QUN3QUxRUUFoQWlBRlFRQWdCVUVBU2hzaEJpQUVRUWgwUVlEK0EzRWhCQ0FBSVFFRFFDQUNJQVpHRFFNZ0N5QUJRUUYwYWlBRUlBTWdBaUFIYW1vdEFPZ0hjcTFDZ1lDRWdKQ0F3QUIrTndBQUlBSkJBV29oQWlBQlFRUnFJUUVNQUFzQUMwRUFJUUlnQlVFQUlBVkJBRW9iSVFZZ0JFRUlkRUdBL2dOeElRUWdBQ0VCQTBBZ0FpQUdSZzBDSUFzZ0FVRUJkR29pQ2lBRUlBTWdBaUFIYW1vdEFPZ0hjcTFDZ1lDRWdKQ0F3QUIrSWhFM0FBZ2dDaUFSTndBQUlBSkJBV29oQWlBQlFRaHFJUUVNQUFzQUMwRUFJUUVnQlVFQUlBVkJBRW9iSVFvZ0JFRUlkRUdBL2dOeElRd2dBQ0VFQTBBZ0FTQUtSZzBCSUFzZ0JFRUJkR29oRUNBTUlBTWdBU0FIYW1vdEFPZ0hjcTFDZ1lDRWdKQ0F3QUIrSVJGQkFDRUNBMEFnQWlBTlRrVUVRQ0FRSUFKQkFYUnFJZ1lnRVRjQUdDQUdJQkUzQUJBZ0JpQVJOd0FJSUFZZ0VUY0FBQ0FDUVJCcUlRSU1BUXNMSUFGQkFXb2hBU0FFSUExcUlRUU1BQXNBQ3lBSVFRRnFJUWdnQlNBSGFpRUhJQVVnRFd3Z0FHb2hBQXdBQ3dBRklBTWdBa0VDZEdvaUIwRkFheUFCTmdJQUlBSkJBV29oQWlBSEtBSUFJQUZxSVFFTUFRc0FDd0FMSUE4TElBbEJFR29rQUF2eUFnRUdmeU1BUVNCcklnVWtBQ0FFS0FJQUlRWWdCVUVNYWlBQ0lBTVFEU0lEUVloL1RRUkFJQVJCQkdvaEFpQUFJQUZxSWdsQkEyc2hCRUVBSUFaQkVIWnJRUjl4SVFNRFFDQUZRUXhxRUE4Z0FDQUVUM0pGQkVBZ0FpQUZLQUlNSWdZZ0JTZ0NFQ0lIZENBRGRrRUJkR29pQ0MwQUFTRUtJQUFnQ0MwQUFEb0FBQ0FDSUFZZ0J5QUthaUlHZENBRGRrRUJkR29pQnkwQUFDRUlJQVVnQmlBSExRQUJhallDRUNBQUlBZzZBQUVnQUVFQ2FpRUFEQUVMQ3dOQUlBVkJER29RRHlFSElBVW9BZ3doQmlBRktBSVFJUVFnQUNBSlR5QUhja1VFUUNBQ0lBWWdCSFFnQTNaQkFYUnFJZ1l0QUFBaEJ5QUZJQVFnQmkwQUFXbzJBaEFnQUNBSE9nQUFJQUJCQVdvaEFBd0JDd3NEUUNBQUlBbFBSUVJBSUFJZ0JpQUVkQ0FEZGtFQmRHb2lCeTBBQVNFSUlBQWdCeTBBQURvQUFDQUFRUUZxSVFBZ0JDQUlhaUVFREFFTEMwRnNRV3dnQVNBRktBSVVJQVVvQWhoSEd5QUVRU0JIR3lFREN5QUZRU0JxSkFBZ0F3dlBGQUVqZnlNQVFkQUFheUlGSkFCQmJDRUpBa0FnQTBFS1NRMEFBa0FnQXlBQ0x3QUVJZ2NnQWk4QUFDSUlJQUl2QUFJaURXcHFRUVpxSWd4SkRRQWdCQzhCQWlFR0lBVkJQR29nQWtFR2FpSUNJQWdRRFNJSlFZaC9TdzBCSUFWQktHb2dBaUFJYWlJQ0lBMFFEU0lKUVloL1N3MEJJQVZCRkdvZ0FpQU5haUlDSUFjUURTSUpRWWgvU3cwQklBVWdBaUFIYWlBRElBeHJFQTBpQ1VHSWYwc05BU0FFUVFScUlRb2dBQ0FCYWlJZlFRTnJJU0JCQUNBR2EwRWZjU0VMSUFVb0FnZ2hFU0FGS0FJY0lSSWdCU2dDTUNFVElBVW9Ba1FoRkNBRktBSUVJUWtnQlNnQ0dDRU5JQVVvQWl3aERDQUZLQUpBSVFZZ0JTZ0NFQ0VoSUFVb0FpUWhJaUFGS0FJNElTTWdCU2dDVENFa0lBVW9BZ0FoRlNBRktBSVVJUllnQlNnQ0tDRVhJQVVvQWp3aEdFRUJJUThnQUNBQlFRTnFRUUoySWdScUlnTWdCR29pQWlBRWFpSVpJUVFnQWlFSUlBTWhCd05BSUE5QkFYRkZJQVFnSUU5eVJRUkFJQUFnQ2lBWUlBWjBJQXQyUVFKMGFpSU9Md0VBT3dBQUlBNHRBQUloR2lBT0xRQURJUkFnQnlBS0lCY2dESFFnQzNaQkFuUnFJZzR2QVFBN0FBQWdEaTBBQWlFYklBNHRBQU1oRHlBSUlBb2dGaUFOZENBTGRrRUNkR29pRGk4QkFEc0FBQ0FPTFFBQ0lSd2dEaTBBQXlFZElBUWdDaUFWSUFsMElBdDJRUUowYWlJT0x3RUFPd0FBSUE0dEFBSWhIaUFPTFFBRElRNGdBQ0FRYWlJbElBb2dHQ0FHSUJwcUlnWjBJQXQyUVFKMGFpSVFMd0VBT3dBQUlCQXRBQUlnRUMwQUF5RW1JQWNnRDJvaUp5QUtJQmNnRENBYmFpSWFkQ0FMZGtFQ2RHb2lCeThCQURzQUFDQUhMUUFDSVF3Z0J5MEFBeUVRSUFnZ0hXb2lHeUFLSUJZZ0RTQWNhaUlQZENBTGRrRUNkR29pQ0M4QkFEc0FBQ0FJTFFBQ0lRMGdDQzBBQXlFY0lBUWdEbW9pSFNBS0lCVWdDU0FlYWlJT2RDQUxka0VDZEdvaUNTOEJBRHNBQUNBR2FpRUFRUU1oQndKL0lCUWdKRWtFUUNBQUlRWkJBd3dCQ3lBQVFRZHhJUVlnRkNBQVFRTjJheUlVS0FBQUlSaEJBQXNnQ1MwQUF5RWVJQWt0QUFJaENDQU1JQnBxSVFBZ0V5QWpTUVIvSUFBRklCTWdBRUVEZG1zaUV5Z0FBQ0VYUVFBaEJ5QUFRUWR4Q3lFTUlBMGdEMm9oQUNBSGNpRUpRUU1oRHdKL0lCSWdJa2tFUUNBQUlRMUJBd3dCQ3lBQVFRZHhJUTBnRWlBQVFRTjJheUlTS0FBQUlSWkJBQXNnQ0NBT2FpRUFJQWx5SUJFZ0lVa0VmeUFBQlNBUklBQkJBM1pySWhFb0FBQWhGVUVBSVE4Z0FFRUhjUXNoQ1NBbElDWnFJUUFnRUNBbmFpRUhJQnNnSEdvaENDQWRJQjVxSVFRZ0QzSkZJUThNQVFzTElBVWdERFlDTENBRklBWTJBa0FnQlNBTk5nSVlJQVVnQ1RZQ0JDQUZJQlEyQWtRZ0JTQVROZ0l3SUFVZ0VqWUNIQ0FGSUJFMkFnZ2dCU0FZTmdJOElBVWdGellDS0NBRklCWTJBaFFnQlNBVk5nSUFJQUlnQjBrZ0FDQURTM0lOQUVGc0lRa2dDQ0FaU3cwQklBTkJBMnNoQ1FOQUlBVkJQR29RRDBVZ0FDQUpTWEVFUUNBQUlBb2dCU2dDUENJTklBVW9Ba0FpREhRZ0MzWkJBblJxSWc0dkFRQTdBQUFnQUNBT0xRQURhaUlHSUFvZ0RTQU1JQTR0QUFKcUlnQjBJQXQyUVFKMGFpSU1Md0VBT3dBQUlBVWdBQ0FNTFFBQ2FqWUNRQ0FHSUF3dEFBTnFJUUFNQVFVZ0EwRUNheUVNQTBBZ0JVRThhaEFQSVFZZ0JTZ0NQQ0VOSUFVb0FrQWhDU0FBSUF4TElBWnlSUVJBSUFBZ0NpQU5JQWwwSUF0MlFRSjBhaUlHTHdFQU93QUFJQVVnQ1NBR0xRQUNhallDUUNBQUlBWXRBQU5xSVFBTUFRc0xBMEFnQUNBTVMwVUVRQ0FBSUFvZ0RTQUpkQ0FMZGtFQ2RHb2lCaThCQURzQUFDQUFJQVl0QUFOcUlRQWdDU0FHTFFBQ2FpRUpEQUVMQ3dKQUlBQWdBMDhOQUNBQUlBb2dEU0FKZENBTGRpSUFRUUowYWlJRExRQUFPZ0FBSUFNdEFBTkJBVVlFUUNBSklBTXRBQUpxSVFrTUFRc2dDVUVmU3cwQVFTQWdDU0FLSUFCQkFuUnFMUUFDYWlJQUlBQkJJRThiSVFrTElBSkJBMnNoREFOQUlBVkJLR29RRDBVZ0J5QU1TWEVFUUNBSElBb2dCU2dDS0NJR0lBVW9BaXdpQUhRZ0MzWkJBblJxSWcwdkFRQTdBQUFnQnlBTkxRQURhaUlESUFvZ0JpQUFJQTB0QUFKcUlnQjBJQXQyUVFKMGFpSUdMd0VBT3dBQUlBVWdBQ0FHTFFBQ2FqWUNMQ0FESUFZdEFBTnFJUWNNQVFVZ0FrRUNheUVHQTBBZ0JVRW9haEFQSVFNZ0JTZ0NLQ0VNSUFVb0Fpd2hBQ0FHSUFkSklBTnlSUVJBSUFjZ0NpQU1JQUIwSUF0MlFRSjBhaUlETHdFQU93QUFJQVVnQUNBRExRQUNhallDTENBSElBTXRBQU5xSVFjTUFRc0xBMEFnQmlBSFNVVUVRQ0FISUFvZ0RDQUFkQ0FMZGtFQ2RHb2lBeThCQURzQUFDQUhJQU10QUFOcUlRY2dBQ0FETFFBQ2FpRUFEQUVMQ3dKQUlBSWdCMDBOQUNBSElBb2dEQ0FBZENBTGRpSUNRUUowYWlJRExRQUFPZ0FBSUFNdEFBTkJBVVlFUUNBQUlBTXRBQUpxSVFBTUFRc2dBRUVmU3cwQVFTQWdBQ0FLSUFKQkFuUnFMUUFDYWlJQUlBQkJJRThiSVFBTElCbEJBMnNoREFOQUlBVkJGR29RRDBVZ0NDQU1TWEVFUUNBSUlBb2dCU2dDRkNJR0lBVW9BaGdpQW5RZ0MzWkJBblJxSWcwdkFRQTdBQUFnQ0NBTkxRQURhaUlESUFvZ0JpQUNJQTB0QUFKcUlnSjBJQXQyUVFKMGFpSUdMd0VBT3dBQUlBVWdBaUFHTFFBQ2FqWUNHQ0FESUFZdEFBTnFJUWdNQVFVZ0dVRUNheUVEQTBBZ0JVRVVhaEFQSVFJZ0JTZ0NGQ0VHSUFVb0FoZ2hCeUFESUFoSklBSnlSUVJBSUFnZ0NpQUdJQWQwSUF0MlFRSjBhaUlDTHdFQU93QUFJQVVnQnlBQ0xRQUNhallDR0NBSUlBSXRBQU5xSVFnTUFRc0xBMEFnQXlBSVNVVUVRQ0FJSUFvZ0JpQUhkQ0FMZGtFQ2RHb2lBaThCQURzQUFDQUlJQUl0QUFOcUlRZ2dCeUFDTFFBQ2FpRUhEQUVMQ3dKQUlBZ2dHVThOQUNBSUlBb2dCaUFIZENBTGRpSUNRUUowYWlJRExRQUFPZ0FBSUFNdEFBTkJBVVlFUUNBSElBTXRBQUpxSVFjTUFRc2dCMEVmU3cwQVFTQWdCeUFLSUFKQkFuUnFMUUFDYWlJQ0lBSkJJRThiSVFjTEEwQWdCUkFQUlNBRUlDQkpjUVJBSUFRZ0NpQUZLQUlBSWdZZ0JTZ0NCQ0lDZENBTGRrRUNkR29pREM4QkFEc0FBQ0FFSUF3dEFBTnFJZ01nQ2lBR0lBSWdEQzBBQW1vaUFuUWdDM1pCQW5ScUlnUXZBUUE3QUFBZ0JTQUNJQVF0QUFKcU5nSUVJQU1nQkMwQUEyb2hCQXdCQlNBZlFRSnJJUU1EUUNBRkVBOGhBaUFGS0FJQUlRWWdCU2dDQkNFSUlBTWdCRWtnQW5KRkJFQWdCQ0FLSUFZZ0NIUWdDM1pCQW5ScUlnSXZBUUE3QUFBZ0JTQUlJQUl0QUFKcU5nSUVJQVFnQWkwQUEyb2hCQXdCQ3dzRFFDQURJQVJKUlFSQUlBUWdDaUFHSUFoMElBdDJRUUowYWlJQ0x3RUFPd0FBSUFRZ0FpMEFBMm9oQkNBSUlBSXRBQUpxSVFnTUFRc0xBa0FnQkNBZlR3MEFJQVFnQ2lBR0lBaDBJQXQySWdKQkFuUnFJZ010QUFBNkFBQWdBeTBBQTBFQlJnUkFJQWdnQXkwQUFtb2hDQXdCQ3lBSVFSOUxEUUJCSUNBSUlBb2dBa0VDZEdvdEFBSnFJZ0lnQWtFZ1R4c2hDQXRCYkVGc1FXeEJiRUZzUVd4QmJFRnNJQUVnQ0VFZ1J4c2dCU2dDQ0NBRktBSU1SeHNnQjBFZ1J4c2dCU2dDSENBRktBSWdSeHNnQUVFZ1J4c2dCU2dDTUNBRktBSTBSeHNnQ1VFZ1J4c2dCU2dDUkNBRktBSklSeHNoQ1F3SkN3QUxBQXNBQ3dBTEFBc0FDd0FMQUF0QmJDRUpDeUFGUWRBQWFpUUFJQWtMN0JBQkhuOGpBRUhRQUdzaUJTUUFRV3doQ1FKQUlBTkJDa2tOQUFKQUlBTWdBaThBQkNJR0lBSXZBQUFpQnlBQ0x3QUNJZ2hxYWtFR2FpSU9TUTBBSUFRdkFRSWhEeUFGUVR4cUlBSkJCbW9pQWlBSEVBMGlDVUdJZjBzTkFTQUZRU2hxSUFJZ0Iyb2lBaUFJRUEwaUNVR0lmMHNOQVNBRlFSUnFJQUlnQ0dvaUFpQUdFQTBpQ1VHSWYwc05BU0FGSUFJZ0Jtb2dBeUFPYXhBTklnbEJpSDlMRFFFZ0JFRUVhaUVLSUFBZ0FXb2lIRUVEYXlFZFFRQWdEMnRCSDNFaEN5QUZLQUlJSVJFZ0JTZ0NIQ0VTSUFVb0FqQWhFeUFGS0FKRUlSUWdCU2dDQkNFSklBVW9BaGdoQmlBRktBSXNJUWNnQlNnQ1FDRUlJQVVvQWhBaEhpQUZLQUlrSVI4Z0JTZ0NPQ0VnSUFVb0Frd2hJU0FGS0FJQUlSVWdCU2dDRkNFV0lBVW9BaWdoRnlBRktBSThJUmhCQVNFTklBQWdBVUVEYWtFQ2RpSUNhaUlPSUFKcUlnOGdBbW9pR1NFRUlBOGhBaUFPSVFNRFFDQU5SU0FFSUIxUGNrVUVRQ0FLSUJnZ0NIUWdDM1pCQVhScUlnd3RBQUVoRFNBQUlBd3RBQUE2QUFBZ0NpQVhJQWQwSUF0MlFRRjBhaUlNTFFBQklSQWdBeUFNTFFBQU9nQUFJQW9nRmlBR2RDQUxka0VCZEdvaURDMEFBU0VhSUFJZ0RDMEFBRG9BQUNBS0lCVWdDWFFnQzNaQkFYUnFJZ3d0QUFFaEd5QUVJQXd0QUFBNkFBQWdDaUFZSUFnZ0RXb2lDSFFnQzNaQkFYUnFJZ3d0QUFFaERTQUFJQXd0QUFBNkFBRWdDaUFYSUFjZ0VHb2lCM1FnQzNaQkFYUnFJZ3d0QUFFaEVDQURJQXd0QUFBNkFBRWdDaUFXSUFZZ0dtb2lESFFnQzNaQkFYUnFJZ1l0QUFFaEdpQUNJQVl0QUFBNkFBRWdDaUFWSUFrZ0cyb2lHM1FnQzNaQkFYUnFJZ2t0QUFFaElpQUVJQWt0QUFBNkFBRWdDQ0FOYWlFR1FRTWhDUUovSUJRZ0lVa0VRRUVESVEwZ0Jnd0JDeUFVSUFaQkEzWnJJaFFvQUFBaEdFRUFJUTBnQmtFSGNRc2hDQ0FISUJCcUlRWWdFeUFnU1FSL0lBWUZJQk1nQmtFRGRtc2lFeWdBQUNFWFFRQWhDU0FHUVFkeEN5RUhJQXdnR21vaERDQUpJQTF5SVJCQkF5RU5BbjhnRWlBZlNRUkFJQXdoQmtFRERBRUxJQXhCQjNFaEJpQVNJQXhCQTNackloSW9BQUFoRmtFQUN5QWJJQ0pxSVF3Z0VISWhFQ0FSSUI1SkJIOGdEQVVnRVNBTVFRTjJheUlSS0FBQUlSVkJBQ0VOSUF4QkIzRUxJUWtnQkVFQ2FpRUVJQUpCQW1vaEFpQURRUUpxSVFNZ0FFRUNhaUVBSUEwZ0VISkZJUTBNQVFzTElBVWdCellDTENBRklBZzJBa0FnQlNBR05nSVlJQVVnQ1RZQ0JDQUZJQlEyQWtRZ0JTQVROZ0l3SUFVZ0VqWUNIQ0FGSUJFMkFnZ2dCU0FZTmdJOElBVWdGellDS0NBRklCWTJBaFFnQlNBVk5nSUFJQUFnRGtzZ0F5QVBTM0lOQUVGc0lRa2dBaUFaU3cwQklBNUJBMnNoQ1FOQUlBVkJQR29RRHlBQUlBbFBja1VFUUNBS0lBVW9BandpQmlBRktBSkFJZ2QwSUF0MlFRRjBhaUlJTFFBQklRd2dBQ0FJTFFBQU9nQUFJQW9nQmlBSElBeHFJZ1owSUF0MlFRRjBhaUlITFFBQUlRZ2dCU0FHSUFjdEFBRnFOZ0pBSUFBZ0NEb0FBU0FBUVFKcUlRQU1BUXNMQTBBZ0JVRThhaEFQSVFjZ0JTZ0NQQ0VHSUFVb0FrQWhDU0FBSUE1UElBZHlSUVJBSUFvZ0JpQUpkQ0FMZGtFQmRHb2lCaTBBQUNFSElBVWdDU0FHTFFBQmFqWUNRQ0FBSUFjNkFBQWdBRUVCYWlFQURBRUxDd05BSUFBZ0RrOUZCRUFnQ2lBR0lBbDBJQXQyUVFGMGFpSUhMUUFCSUFBZ0J5MEFBRG9BQUNBQVFRRnFJUUFnQ1dvaENRd0JDd3NnRDBFRGF5RUFBMEFnQlVFb2FoQVBJQUFnQTAxeVJRUkFJQW9nQlNnQ0tDSUdJQVVvQWl3aUIzUWdDM1pCQVhScUlnZ3RBQUVoRGlBRElBZ3RBQUE2QUFBZ0NpQUdJQWNnRG1vaUJuUWdDM1pCQVhScUlnY3RBQUFoQ0NBRklBWWdCeTBBQVdvMkFpd2dBeUFJT2dBQklBTkJBbW9oQXd3QkN3c0RRQ0FGUVNocUVBOGhCeUFGS0FJb0lRWWdCU2dDTENFQUlBTWdEMDhnQjNKRkJFQWdDaUFHSUFCMElBdDJRUUYwYWlJR0xRQUFJUWNnQlNBQUlBWXRBQUZxTmdJc0lBTWdCem9BQUNBRFFRRnFJUU1NQVFzTEEwQWdBeUFQVDBVRVFDQUtJQVlnQUhRZ0MzWkJBWFJxSWdjdEFBRWhDQ0FESUFjdEFBQTZBQUFnQTBFQmFpRURJQUFnQ0dvaEFBd0JDd3NnR1VFRGF5RURBMEFnQlVFVWFoQVBJQUlnQTA5eVJRUkFJQW9nQlNnQ0ZDSUdJQVVvQWhnaUIzUWdDM1pCQVhScUlnZ3RBQUVoRGlBQ0lBZ3RBQUE2QUFBZ0NpQUdJQWNnRG1vaUJuUWdDM1pCQVhScUlnY3RBQUFoQ0NBRklBWWdCeTBBQVdvMkFoZ2dBaUFJT2dBQklBSkJBbW9oQWd3QkN3c0RRQ0FGUVJScUVBOGhCeUFGS0FJVUlRWWdCU2dDR0NFRElBSWdHVThnQjNKRkJFQWdDaUFHSUFOMElBdDJRUUYwYWlJR0xRQUFJUWNnQlNBRElBWXRBQUZxTmdJWUlBSWdCem9BQUNBQ1FRRnFJUUlNQVFzTEEwQWdBaUFaVDBVRVFDQUtJQVlnQTNRZ0MzWkJBWFJxSWdjdEFBRWhDQ0FDSUFjdEFBQTZBQUFnQWtFQmFpRUNJQU1nQ0dvaEF3d0JDd3NEUUNBRkVBOGdCQ0FkVDNKRkJFQWdDaUFGS0FJQUlnSWdCU2dDQkNJR2RDQUxka0VCZEdvaUJ5MEFBU0VJSUFRZ0J5MEFBRG9BQUNBS0lBSWdCaUFJYWlJQ2RDQUxka0VCZEdvaUJpMEFBQ0VISUFVZ0FpQUdMUUFCYWpZQ0JDQUVJQWM2QUFFZ0JFRUNhaUVFREFFTEN3TkFJQVVRRHlFSElBVW9BZ0FoQmlBRktBSUVJUUlnQkNBY1R5QUhja1VFUUNBS0lBWWdBblFnQzNaQkFYUnFJZ1l0QUFBaEJ5QUZJQUlnQmkwQUFXbzJBZ1FnQkNBSE9nQUFJQVJCQVdvaEJBd0JDd3NEUUNBRUlCeFBSUVJBSUFvZ0JpQUNkQ0FMZGtFQmRHb2lCeTBBQVNFSUlBUWdCeTBBQURvQUFDQUVRUUZxSVFRZ0FpQUlhaUVDREFFTEMwRnNRV3hCYkVGc1FXeEJiRUZzUVd3Z0FTQUNRU0JIR3lBRktBSUlJQVVvQWd4SEd5QURRU0JIR3lBRktBSWNJQVVvQWlCSEd5QUFRU0JIR3lBRktBSXdJQVVvQWpSSEd5QUpRU0JIR3lBRktBSkVJQVVvQWtoSEd5RUpEQUVMUVd3aENRc2dCVUhRQUdva0FDQUpDMWdCQTM4Q1FDQUFLQUtRNndFaUFVVU5BQ0FCS0FJQUlBRkJ0TlVCYWlnQ0FDSUNJQUZCdU5VQmFpZ0NBQ0lERUJNZ0FnUkFJQU1nQVNBQ0VRSUFEQUVMSUFFUUJnc2dBRUVBTmdLZzZ3RWdBRUlBTndPUTZ3RUw2UU1DQkg4Q2ZpQUFRUUJCS0JBRElRUWdBa0VCUVFVZ0F4c2lBRWtFUUNBQUR3c2dBVVVFUUVGL0R3dEJBU0VHQWtBQ1FDQURRUUZHRFFBZ0F5RUdJQUVvQUFBaUJVR282cjVwUmcwQVFYWWhBeUFGUVhCeFFkRFV0TUlCUncwQlFRZ2hBeUFDUVFoSkRRRWdBVFVBQkNFSUlBUkJBVFlDRkNBRUlBZzNBd0JCQUE4TElBRWdBaUFHRUJvaUF5QUNTdzBBSUFRZ0F6WUNHRUZ5SVFNZ0FDQUJhaUlGUVFGckxRQUFJZ0pCQ0hFTkFDQUNRU0J4SWdaRkJFQkJjQ0VESUFVdEFBQWlCVUduQVVzTkFTQUZRUWR4clVJQklBVkJBM1pCQ21xdGhpSUlRZ09JZmlBSWZDRUpJQUJCQVdvaEFBc2dBa0VHZGlFRklBSkJBblpCQUNFREFrQUNRQUpBQWtBZ0FrRURjVUVCYXc0REFBRUNBd3NnQUNBQmFpMEFBQ0VESUFCQkFXb2hBQXdDQ3lBQUlBRnFMd0FBSVFNZ0FFRUNhaUVBREFFTElBQWdBV29vQUFBaEF5QUFRUVJxSVFBTFFRRnhJUUlDZmdKQUFrQUNRQUpBSUFWQkFXc09Bd0VDQXdBTFFuOGdCa1VOQXhvZ0FDQUJhakVBQUF3REN5QUFJQUZxTXdBQVFvQUNmQXdDQ3lBQUlBRnFOUUFBREFFTElBQWdBV29wQUFBTElRZ2dCQ0FDTmdJZ0lBUWdBellDSENBRUlBZzNBd0JCQUNFRElBUkJBRFlDRkNBRUlBZ2dDU0FHR3lJSU53TUlJQVJDZ0lBSUlBZ2dDRUtBZ0FoYUd6NENFQXNnQXd0ZkFRRi9RYmgvSVFNZ0FVRUJRUVVnQWhzaUFrOEVmeUFBSUFKcVFRRnJMUUFBSWdCQkEzRkJBblJCb0I1cUtBSUFJQUpxSUFCQkJIWkJESEZCc0I1cUtBSUFhaUFBUVNCeElnRkZhaUFCUVFWMklBQkJ3QUJKY1dvRlFiaC9Dd3NNQUNBQUlBRWdBa0VBRUJrTGx3TUNCWDhDZmlNQVFVQnFJZ1FrQUFKQUEwQWdBVUVGVHdSQUFrQWdBQ2dBQUVGd2NVSFExTFRDQVVZRVFFSitJUWNnQVVFSVNRMEVJQUFvQUFRaUFrRjNTdzBFSUFKQkNHb2lBeUFCU3cwRUlBSkJnWDlKRFFFTUJBc2dCRUVZYWlBQUlBRVFHeUVDUW40Z0JDa0RHRUlBSUFRb0FpeEJBVWNiSUFJYklnZENmVllOQXlBSElBaDhJZ2dnQjFSQ2ZpRUhEUU1DUUFKQUlBRkJDRWtOQUNBQUtBQUFRWEJ4UWREVXRNSUJSdzBBSUFBb0FBUWlBa0YzU3cwRlFiaC9JQUpCQ0dvaUFpQUJJQUpKR3lFRERBRUxJQVJCR0dvZ0FDQUJFQnNpQWtHSWYwc0VRQ0FDSVFNTUFRdEJ1SDhoQXlBQ0RRQWdBU0FFS0FJd0lnSnJJUVVnQUNBQ2FpRUdBMEFnQmlBRklBUkJER29RSFNJRFFZaC9TdzBCSUFOQkEyb2lBaUFGU3dSQVFiaC9JUU1NQWdzZ0JTQUNheUVGSUFJZ0Jtb2hCaUFFS0FJUVJRMEFDeUFFS0FJNEJIOUJ1SDhoQXlBRlFRUkpEUUVnQmtFRWFnVWdCZ3NnQUdzaEF3c2dBMEdJZjBzTkF3c2dBU0FEYXlFQklBQWdBMm9oQUF3QkN3dENmaUFJSUFFYklRY0xJQVJCUUdza0FDQUhDMlFCQVg5QnVIOGhBd0pBSUFGQkEwa05BQ0FBTFFBQ0lRRWdBaUFBTHdBQUlnQkJBWEUyQWdRZ0FpQUFRUUYyUVFOeElnTTJBZ0FnQWlBQUlBRkJFSFJ5UVFOMklnQTJBZ2dDUUFKQUlBTkJBV3NPQXdJQkFBRUxRV3dQQ3lBQUlRTUxJQU1MUkFFQ2Z5QUJJQUlvQWdRaUF5QUJLQUlFYWlJRU5nSUVJQUFnQTBFQ2RFR2dIV29vQWdBZ0FTZ0NBRUVBSUFScmRuRTJBZ0FnQVJBUEdpQUFJQUpCQ0dvMkFnUUx6Z0VCQm45QnVuOGhDZ0pBSUFJb0FnUWlDQ0FDS0FJQUlnbHFJZzBnQVNBQWEwc05BRUZzSVFvZ0NTQUVJQU1vQWdBaUMydExEUUFnQUNBSmFpSUVJQUlvQWdnaURHc2hBaUFBSUFGQklHc2lBQ0FMSUFsQkFCQWdJQU1nQ1NBTGFqWUNBQUpBQWtBZ0JDQUZheUFNVHdSQUlBSWhCUXdCQ3lBTUlBUWdCbXRMRFFJZ0J5QUhJQUlnQldzaUFtb2lBU0FJYWs4RVFDQUVJQUVnQ0JBS0dnd0NDeUFDSUFocUlRZ2dCQ0FCUVFBZ0Ftc1FDaUFDYXlFRUN5QUVJQUFnQlNBSVFRRVFJQXNnRFNFS0N5QUtDOGNFQVFKL0lBQWdBMm9oQmdKQUlBTkJCMHdFUUFOQUlBQWdCazhOQWlBQUlBSXRBQUE2QUFBZ0FFRUJhaUVBSUFKQkFXb2hBZ3dBQ3dBTElBUkJBVVlFUUFKQUlBQWdBbXNpQlVFSFRRUkFJQUFnQWkwQUFEb0FBQ0FBSUFJdEFBRTZBQUVnQUNBQ0xRQUNPZ0FDSUFBZ0FpMEFBem9BQXlBQUlBSWdCVUVDZENJRlFjQWVhaWdDQUdvaUFpZ0FBRFlBQkNBQ0lBVkI0QjVxS0FJQWF5RUNEQUVMSUFBZ0Fpa0FBRGNBQUFzZ0FrRUlhaUVDSUFCQkNHb2hBQXNnQVNBR1R3UkFJQUFnQTJvaEFTQUVRUUZISUFBZ0FtdEJEMHB5UlFSQUEwQWdBQ0FDS1FBQU53QUFJQUpCQ0dvaEFpQUFRUWhxSWdBZ0FVa05BQXdEQ3dBTElBQWdBaWtBQURjQUFDQUFJQUlwQUFnM0FBZ2dBMEVSU1EwQklBQkJFR29oQUFOQUlBQWdBaWtBRURjQUFDQUFJQUlwQUJnM0FBZ2dBQ0FDS1FBZ053QVFJQUFnQWlrQUtEY0FHQ0FDUVNCcUlRSWdBRUVnYWlJQUlBRkpEUUFMREFFTEFrQWdBQ0FCU3dSQUlBQWhBUXdCQ3lBQklBQnJJUVVDUUNBRVFRRkhJQUFnQW10QkQwcHlSUVJBSUFJaEF3TkFJQUFnQXlrQUFEY0FBQ0FEUVFocUlRTWdBRUVJYWlJQUlBRkpEUUFMREFFTElBQWdBaWtBQURjQUFDQUFJQUlwQUFnM0FBZ2dCVUVSU0EwQUlBQkJFR29oQUNBQ0lRTURRQ0FBSUFNcEFCQTNBQUFnQUNBREtRQVlOd0FJSUFBZ0F5a0FJRGNBRUNBQUlBTXBBQ2czQUJnZ0EwRWdhaUVESUFCQklHb2lBQ0FCU1EwQUN3c2dBaUFGYWlFQ0N3TkFJQUVnQms4TkFTQUJJQUl0QUFBNkFBQWdBVUVCYWlFQklBSkJBV29oQWd3QUN3QUxDNjRIQWdWL0FYNGpBRUdBQVdzaUVTUUFJQkVnQXpZQ2ZFRi9JUThDUUFKQUFrQUNRQUpBSUFJT0JBRUFBd0lFQ3lBR1JRUkFRYmgvSVE4TUJBdEJiQ0VQSUFVdEFBQWlBaUFEU3cwRElBZ2dBa0VDZENJQ2FpZ0NBQ0VESUFJZ0Iyb29BZ0FoQWlBQVFRQTZBQXNnQUVJQU53SUFJQUFnQWpZQ0RDQUFJQU02QUFvZ0FFRUFPd0VJSUFFZ0FEWUNBRUVCSVE4TUF3c2dBU0FKTmdJQVFRQWhEd3dDQ3lBS1JRUkFRV3doRHd3Q0MwRUFJUThnQzBVZ0RFRVpTSElOQVVFSUlBUjBRUWhxSVFCQkFDRURBMEFnQUNBRFRRMENJQU5CUUdzaEF3d0FDd0FMUVd3aER5QVJJQkZCL0FCcUlCRkIrQUJxSUFVZ0JoQU1JZ05CaUg5TERRQWdFU2dDZUNJQ0lBUkxEUUFnRVNnQ2ZFRUJhaUVKSUFCQkNHb2hDMEdBZ0FJZ0FuUkJFSFVoQlVFQklSQkJBU0FDZENJUFFRRnJJZ29oRWdOQUlBa2dEa2NFUUFKQUlCRWdEa0VCZENJRWFpOEJBQ0lNUWYvL0EwWUVRQ0FMSUJKQkEzUnFJQTQyQWdRZ0VrRUJheUVTUVFFaERBd0JDeUFRUVFBZ0JTQU13VW9iSVJBTElBUWdEV29nRERzQkFDQU9RUUZxSVE0TUFRc0xJQUFnQWpZQ0JDQUFJQkEyQWdBQ1FDQUtJQkpHQkVBZ0RVSHFBR29oQmtFQUlSQkJBQ0VNQTBBZ0NTQVFSZ1JBSUE5QkEzWWdEMEVCZG1wQkEyb2lCVUVCZENFRVFRQWhERUVBSVJJRFFFRUFJUTRnRHlBU1RRMEVBMEFnRGtFQ1J3UkFJQXNnQlNBT2JDQU1haUFLY1VFRGRHb2dCaUFPSUJKcWFpMEFBRFlDQkNBT1FRRnFJUTRNQVFzTElCSkJBbW9oRWlBRUlBeHFJQXB4SVF3TUFBc0FCU0FSSUJCQkFYUnFMZ0VBSVFVZ0JpQU1haUlFSUJNM0FBQkJDQ0VPQTBBZ0JTQU9TZ1JBSUFRZ0Rtb2dFemNBQUNBT1FRaHFJUTRNQVFzTElCTkNnWUtFaUpDZ3dJQUJmQ0VUSUJCQkFXb2hFQ0FGSUF4cUlRd01BUXNBQ3dBTElBOUJBM1lnRDBFQmRtcEJBMm9oQlVFQUlSQkJBQ0VPQTBBZ0NTQVFSZzBCUVFBaERDQVJJQkJCQVhScUxnRUFJZ1JCQUNBRVFRQktHeUVFQTBBZ0JDQU1Sd1JBSUFzZ0RrRURkR29nRURZQ0JBTkFJQVVnRG1vZ0NuRWlEaUFTU3cwQUN5QU1RUUZxSVF3TUFRc0xJQkJCQVdvaEVBd0FDd0FMSUFKQkFXb2hCVUVBSVF3RFFDQU1JQTlIQkVBZ0RTQUxJQXhCQTNScUlna29BZ1FpQkVFQmRHb2lBaUFDTHdFQUlnWkJBV283QVFBZ0NTQUZJQVpuUVdCemFpSUNPZ0FESUFrZ0JpQUNkQ0FQYXpzQkFDQUpJQWdnQkVFQ2RDSUNhaWdDQURvQUFpQUpJQUlnQjJvb0FnQTJBZ1FnREVFQmFpRU1EQUVMQ3lBQklBQTJBZ0FnQXlFUEN5QVJRWUFCYWlRQUlBOEw3Vm9DTzM4R2ZpTUFRZUFCYXlJRUpBQUNRRUd3N0FrUUJTSUZSUVJBUVVBaEJ3d0JDeUFGUWdBM0F2VHFBU0FGUVFBMkFzVHJBU0FGUVFBMkFyVHJBU0FGUWdBM0FwenJBU0FGUVFBMkFyanBBU0FGUVFBMkFxenNDU0FGUWdBM0F0VHJBU0FGUWdBM0FxenJBU0FGUWdBM0E0anJBU0FGUWdBM0F1VHFBU0FGUWdBM0F1VHJBU0FGUVlHQWdNQUFOZ0s4NndFZ0JVSUFOd0trNndFZ0JVSDg2Z0ZxUVFBMkFnQWdCVUdRNndGcVFnQTNBd0FnQlJBWUlBVkJyTlVCYWlFVUlBVkIrT3NCYWlFY0lBVkJzT29CYWlFaUlBVkJvREJxSVNvZ0JVR1lJR29oS3lBRlFhalFBR29oSGlBRlFSQnFJU3dnQlVFSWFpRW9JQVZCQkdvaExTQUZRY0RwQVdvaEtTQUZRWWpyQVdvZ0JFR1VBV29oTHlBRVFZd0JhaUV3SUFSQmhBRnFJVEVnQkVIY0FHb2hNaUFFUWRRQWFpRXpJQVJCekFCcUlUUWdBQ0VkQWtBQ1FBSkFBa0FDUUFOQVFRRkJCU0FGS0FMazZnRWJJUVlDUUFOQUlBTWdCa2tOQVNBQ0tBQUFRWEJ4UWREVXRNSUJSZ1JBUWJoL0lRY2dBMEVJU1EwSUlBSW9BQVFpRGtGM1N3UkFRWEloQnd3SkN5QURJQTVCQ0dvaUNVa05DQ0FPUVlCL1N3UkFJQWtoQnd3SkN5QURJQWxySVFNZ0FpQUphaUVDREFFTEN5QUZRZ0EzQXF6cEFTQUZRZ0EzQStqcEFTQUZRUUEyQXBqckFTQUZRZ0EzQTREcUFTQUZRZ00zQS9qcEFTQUZRYlRwQVdwQ0FEY0NBQ0FGUWZEcEFXcENBRGNEQUNBRlFhalFBR29pQ1VHTWdJRGdBRFlDQUNBRlFhelFBV3BCNEJJcEFnQTNBZ0FnQlVHMDBBRnFRZWdTS0FJQU5nSUFJQVVnQlVFUWFqWUNBQ0FGSUFWQm9EQnFOZ0lFSUFVZ0JVR1lJR28yQWdnZ0JTQUpOZ0lNSUFWQkFVRUZJQVVvQXVUcUFSczJBcnpwQVFKQUlBRkZEUUFnQlNnQ3JPa0JJZ2tnSFVZTkFDQUZJQWsyQXJqcEFTQUZJQjAyQXF6cEFTQUZLQUt3NlFFaERpQUZJQjAyQXJEcEFTQUZJQjBnRGlBSmEybzJBclRwQVF0QnVIOGhDU0FEUVFWQkNTQUZLQUxrNmdFaUJodEpEUVVnQWtFQlFRVWdCaHNnQmhBYUlnNUJpSDlMQkVBZ0RpRUpEQVVMSUFNZ0RrRURha2tOQlNBcElBSWdEaUFHRUJraUJrR0lmMHNFUUNBR0lRa01CUXNnQmcwRkFrQUNRQ0FGS0FLbzZ3RkJBVWNOQUNBRktBS2s2d0VpQ1VVTkFDQUZLQUtVNndGRkRRQWdDU2dDQkVFQmF5SUhJQVVvQXR6cEFTSUtyVUtIbGErdm1MYmVtNTUvZmtMSno5bXk4ZVc2NmllRlFoZUpRcy9XMDc3U3g2dlpRbjVDK2ZQZDhabjJtYXNXZkNJL1FpR0lJRCtGUXMvVzA3N1N4NnZaUW40aVAwSWRpQ0EvaFVMNTg5M3htZmFacXhaK0lqOUNJSWdnUDRXbmNTRUdJQWtvQWdBaEZRTkFRUUFoQ0FKQUlCVWdCa0VDZEdvb0FnQWlDVVVOQUNBSktBSUlRUWhKRFFBZ0NTZ0NCQ0lTS0FBQVFiZkl3dUYrUncwQUlCSW9BQVFoQ0FzZ0NDQUtSd1JBSUFZZ0IzRkJBV29oQmlBSURRRUxDeUFKUlEwQUlBVVFHQ0FGUVg4MkFxRHJBU0FGSUFrMkFwVHJBU0FGSUFVb0F0enBBU0lJTmdLWTZ3RU1BUXNnQlNnQzNPa0JJUWdMQWtBZ0NFVU5BQ0FGS0FLWTZ3RWdDRVlOQUVGZ0lRa01CZ3NDUUNBRktBTGc2UUVFUUNBRklBVW9BdWpxQVNJSlJUWUM3T29CSUFrTkFTQUZRdm5xME5EbnlhSGs0UUEzQTZqcUFTQUZRZ0EzQTZEcUFTQUZRcy9XMDc3U3g2dlpRamNEbU9vQklBVkMxdXVDN3VyOWlmWGdBRGNEa09vQklBVkNBRGNEaU9vQklDSkJBRUVvRUFNYURBRUxJQVZCQURZQzdPb0JDeUFCSUIxcUlTVWdCU0FGS1FQbzZRRWdEcTE4TndQbzZRRWdBeUFPYXlFRElBSWdEbW9oQWlBZElRNERRQ0FDSUFNZ0JFRXNhaEFkSWhWQmlIOUxCRUFnRlNFSkRBWUxJQU5CQTJzaU5TQVZTUTBFSUFKQkEyb2hHMEZzSVFrQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FFS0FJc0RnTUNBUUFWQ3lBVlFmLy9CMHNORXlBVlFRTkpEUklnQlNrRHlPa0JJVDhDUUFKQUlCc3RBQUFpQ1VFRGNTSWFRUUZyRGdNR0FRQUhDeUFGS0FLQTZnRU5BRUZpSVFrTUZRc2dGVUVGU1EwU0lCc29BQUFoQXdKL0FrQUNRQUpBSUFsQkFuWkJBM0VpQ1VFQ2F3NENBUUlBQ3lBSlFRQkhJUWNnQTBFRWRrSC9CM0VoQzBFRElRWWdBMEVPZGtIL0IzRU1BZ3RCQkNFR0lBTkJCSFpCLy84QWNTRUxRUUVoQnlBRFFSSjJEQUVMSUFOQkJIWkIvLzhQY1NJTFFZQ0FDRXNORTBFQklRZEJCU0VHSUFJdEFBZEJDblFnQTBFV2RuSUxJZ2dnQm1vaUNTQVZTdzBTQWtBZ0MwR0JCa2tOQUNBRktBS2M2d0ZGRFFCQkFDRURBMEFnQTBHRGdBRkxEUUVnQTBGQWF5RUREQUFMQUFzZ0JpQWJhaUVQSUJwQkEwY05CaUFGS0FJTUlnSXRBQUZCQ0hRaEF5QUhEUWNnQTBVTkNDQUVRZkFBYWlBUElBZ1FEU0lEUVloL1N3MEpJQUpCQkdvaEJpQUxJQnhxSWhKQkEyc2hDa0VBSUFJdkFRSnJRUjl4SVFjZ0hDRURBMEFnQkVId0FHb1FEMFVnQXlBS1NYRUVRQ0FESUFZZ0JDZ0NjQ0lJSUFRb0FuUWlEM1FnQjNaQkFuUnFJZ0l2QVFBN0FBQWdBeUFDTFFBRGFpSURJQVlnQ0NBUElBSXRBQUpxSWdoMElBZDJRUUowYWlJQ0x3RUFPd0FBSUFRZ0NDQUNMUUFDYWpZQ2RDQURJQUl0QUFOcUlRTU1BUVVnRWtFQ2F5RUlBMEFnQkVId0FHb1FEeUVQSUFRb0FuQWhDaUFFS0FKMElRSWdBeUFJU3lBUGNrVUVRQ0FESUFZZ0NpQUNkQ0FIZGtFQ2RHb2lDaThCQURzQUFDQUVJQUlnQ2kwQUFtbzJBblFnQXlBS0xRQURhaUVEREFFTEN3TkFJQU1nQ0UwRVFDQURJQVlnQ2lBQ2RDQUhka0VDZEdvaUR5OEJBRHNBQUNBRElBOHRBQU5xSVFNZ0FpQVBMUUFDYWlFQ0RBRUxDd0pBSUFNZ0VrOE5BQ0FESUFZZ0NpQUNkQ0FIZGtFQ2RHb2lBeTBBQURvQUFDQURMUUFEUVFGR0JFQWdBaUFETFFBQ2FpRUNEQUVMSUFKQkgwc05BRUVnSUFJZ0F5MEFBbW9pQWlBQ1FTQlBHeUVDQzBGc1FXd2dDeUFFS0FKNElBUW9BbnhIR3lBQ1FTQkhHeUVEREFzTEFBc0FDeUFFS0FJMElnSWdKU0FPYTBzTkNpQU9SUVJBUVFBaENTQUNEUUlNRGdzZ0RpQWJMUUFBSUFJUUF4b2dBaUVKREF3TElCVWdKU0FPYTBzTkNTQU9EUUZCQUNFSklCVkZEUXdMUWJaL0lRa01FUXNnRGlBYklCVVFBaG9nRlNFSkRBb0xJQndnR3dKL0FrQUNRQUpBSUFsQkFuWkJBM0ZCQVdzT0F3RUFBZ0FMSUFsQkEzWWhBMEVCREFJTElCc3ZBQUJCQkhZaEEwRUNEQUVMSUJWQkJFa05EaUFDTHdBRElBSXRBQVZCRUhSeUlnSkJqNENBQVVzTkRpQUNRUVIySVFOQkF3c2lBbW90QUFBZ0EwRWdhaEFESVFrZ0JTQUROZ0tBNndFZ0JTQUpOZ0x3NmdFZ0FrRUJhaUVKREFVTElCVUNmd0pBQWtBQ1FDQUpRUUoyUVFOeFFRRnJEZ01CQUFJQUN5QUpRUU4ySVFOQkFRd0NDeUFiTHdBQVFRUjJJUU5CQWd3QkN5QUNMd0FESUFJdEFBVkJFSFJ5UVFSMklRTkJBd3NpQWlBRGFpSUpRU0JxU1FSQUlBa2dGVXNORFNBY0lBSWdHMm9nQXhBQ0lRSWdCU0FETmdLQTZ3RWdCU0FDTmdMdzZnRWdBaUFEYWlJQ1FnQTNBQmdnQWtJQU53QVFJQUpDQURjQUNDQUNRZ0EzQUFBTUJRc2dCU0FETmdLQTZ3RWdCU0FDSUJ0cU5nTHc2Z0VNQkFzZ0IwVUVRQ0FlSUE4Z0NDQVVFQlFpQWtHSWYwc2dBaUFJVDNJTkRDQWNJQXNnQWlBUGFpQUlJQUpySUI0UUZTRUREQU1MSUF0RklBaEZjZzBMSUF0QkNIWWlBeUFJSUF0SkJIOGdDRUVFZENBTGJnVkJEd3RCR0d3aUFrR01DR29vQWdCc0lBSkJpQWhxS0FJQWFpSUdRUU4ySUFacUlBSkJnQWhxS0FJQUlBSkJoQWhxS0FJQUlBTnNha2tFUUNNQVFSQnJJaEFrQUNBZUtBSUFJUU1nRkVId0JHcEJBRUhzQUJBRElRWkJWQ0VDQWtBZ0EwSC9BWEVpREVFTVN3MEFBa0FnRkVIY0NXb2dCaUFRUVFocUlCQkJER29nRHlBSUlCUkIzQXRxSWhjUUN5SVNRWWgvU3cwQUlCQW9BZ3dpQmlBTVN3MEJJQlJCcUFWcUlRMGdGRUdrQldvaE5pQWVRUVJxSVJFZ0EwR0FnSUI0Y1NFM0lBWkJBV29pRXlFQ0lBWWhBd05BSUFJaUIwRUJheUVDSUFNaUNrRUJheUVESUJRZ0NrRUNkR29vQXZBRVJRMEFDMEVCSUFjZ0IwRUJUUnNoRmtFQUlRZEJBU0VDQTBBZ0FpQVdSd1JBSUJRZ0FrRUNkQ0lEYWlnQzhBUWhHQ0FESUExcUlBYzJBZ0FnQWtFQmFpRUNJQWNnR0dvaEJ3d0JDd3NnRFNBSE5nSUFRUUFoQWlBUUtBSUlJUU1EUUNBQ0lBTkhCRUFnRFNBQ0lCUnFRZHdKYWkwQUFDSVlRUUowYWlJWklCa29BZ0FpR1VFQmFqWUNBQ0FVSUJsQkFYUnFJaGtnR0RvQTNRVWdHU0FDT2dEY0JTQUNRUUZxSVFJTUFRc0xRUUFoQXlBTlFRQTJBZ0FnRENBR1FYOXphaUVHUVFFaEFnTkFJQUlnRmtjRVFDQVVJQUpCQW5ScUlnMGdBellDQUNBTktBTHdCQ0FDSUFacWRDQURhaUVESUFKQkFXb2hBZ3dCQ3dzZ0RDQVRJQXBySWdaclFRRnFJUW9nQmlFREEwQWdBeUFLU1FSQUlCUWdBMEUwYkdvaERVRUJJUUlEUUNBQ0lCWkhCRUFnRFNBQ1FRSjBJaGhxSUJRZ0dHb29BZ0FnQTNZMkFnQWdBa0VCYWlFQ0RBRUxDeUFEUVFGcUlRTU1BUXNMSUJjZ0ZFRTBFQUloT0NBVVFaQU1haUU1SUJNZ0RHc2hPaUFVUWR3RmFpRVhRUUFoQ2dOQUFrQUNRQ0FISUFwSEJFQkJBU0FNSUJNZ0Z5QUtRUUYwYWlJQ0xRQUJJZzFySWdOckloaDBJUmtnQWkwQUFDRVdJRGdnRFVFQ2RHb2lIeWdDQUNFQ0lBWWdHRTBFUUNBMlFRRWdBeUE2YWlJTklBMUJBVXdiSWlCQkFuUWlKR29vQWdBaERTQTVJQlFnQTBFMGJHcEJOQkFDSVNFZ0RVRUJkQ0VtSUJFZ0FrRUNkR29oSXlBZ1FRRk5EUUlnQTBFUWRFR0FnUHdIY1NBV2NrR0FnSUFJY2lFZ0lDRWdKR29vQWdBaEpFRUFJUUlEUUNBQ0lDUkdEUU1nSXlBQ1FRSjBhaUFnTmdFQUlBSkJBV29oQWd3QUN3QUxJQUlnQWlBWmFpSU5JQUlnRFVzYklRMGdBMEVRZEVHQWdQd0hjU0FXY2tHQWdJQUljaUVEQTBBZ0FpQU5SZzBESUJFZ0FrRUNkR29nQXpZQkFDQUNRUUZxSVFJTUFBc0FDeUFlSUF4QkVIUWdOM0lnREhKQmdBSnlOZ0lBREFNTElBY2dEV3NoSkNBWElDWnFJU1pCQUNFTkEwQWdEU0FrUmcwQlFRRWdHQ0FUSUNZZ0RVRUJkR29pSnkwQUFTSUNheUk3YTNRaVBDQWhJQUpCQW5ScUlpQW9BZ0FpQW1vaFBTQURJRHRxUVJCMFFZQ0EvQWR4SUNjdEFBQkJDSFJ5SUJaeVFZQ0FnQkJ5SVNjRFFDQWpJQUpCQW5ScUlDYzJBUUFnQWtFQmFpSUNJRDFKRFFBTElDQWdJQ2dDQUNBOGFqWUNBQ0FOUVFGcUlRME1BQXNBQ3lBZklCOG9BZ0FnR1dvMkFnQWdDa0VCYWlFS0RBQUxBQXNnRWlFQ0N5QVFRUkJxSkFBZ0FrR0lmMHNnQWlBSVQzSU5EQ0FjSUFzZ0FpQVBhaUFJSUFKcklCNFFGaUVEREFNTElCNGdEeUFJSUJRUUZDSUNRWWgvU3lBQ0lBaFBjZzBMSUJ3Z0N5QUNJQTlxSUFnZ0Ftc2dIaEFYSVFNTUFnc2dBd1JBSUJ3Z0N5QVBJQWdnQWhBV0lRTU1BZ3NnSENBTElBOGdDQ0FDRUJjaEF3d0JDeUFjSUFzZ0R5QUlJQUlRRlNFREN5QURRWWgvU3cwSUlBVWdDellDZ09zQklBVWdIRFlDOE9vQklBVkJBVFlDZ09vQklCcEJBa1lFUUNBRklCNDJBZ3dMSUFzZ0hHb2lBa0lBTndBQUlBSkNBRGNBR0NBQ1FnQTNBQkFnQWtJQU53QUlJQWxCaUg5TERRb0xJQWtnRlVZTkNDQVZJQWxySVFZZ0JTZ0NuT3NCSVFvQ1FDQUpJQnRxSWdNdEFBQWlEMFVFUUVFQklRSkJBQ0VQUWJoL0lRa2dCa0VCUmcwQkRBc0xBbjhnQTBFQmFpQVB3Q0lDUVFCT0RRQWFJQUpCZjBZRVFDQUdRUU5JRFFzZ0F5OEFBVUdBL2dGcUlROGdBMEVEYWd3QkN5QUdRUUpJRFFvZ0F5MEFBU0FQUVFoMGNrR0FnQUpySVE4Z0EwRUNhZ3NoRWtHNGZ5RUpJQkpCQVdvaUFpQVZJQnRxSWdkTERRb2dMQ0FGSUJJdEFBQWlFa0VHZGtFalFRa2dBaUFISUFKclFjQVFRZEFSUWZBU0lBVW9Bb1RxQVNBS0lBOGdGQkFoSWdsQmlIOUxEUWdnS3lBb0lCSkJCSFpCQTNGQkgwRUlJQUlnQ1dvaUFpQUhJQUpyUVlBTFFZQU1RWUFYSUFVb0FvVHFBU0FGS0FLYzZ3RWdEeUFVRUNFaUNFR0lmMHNOQ0VGc0lRa2dLaUF0SUJKQkFuWkJBM0ZCTkVFSklBSWdDR29pQWlBSElBSnJRWUFOUWVBT1FaQVpJQVVvQW9UcUFTQUZLQUtjNndFZ0R5QVVFQ0VpQjBHSWYwc05DaUFDSUFkcUlBTnJJZ0loQ1NBQ1FZaC9TdzBLQ3lBT0lBOUJBRXh5RFFFTFFicC9JUWtNQ0FzZ0pTQU9heUVKSUFZZ0Ftc2hCaUFDSUFOcUlRY0NRQUpBQWtBZ0NrVUVRQ0FQUVFsSUlBVXBBOGpwQVVLQmdJQUlWSElOQWlBb0tBSUFJZ0pCQ0dvaEVpQUNLQUlFSVFwQkFDRURRUUFoQWdOQUlBTWdDblpGQkVBZ0FpQVNJQU5CQTNScUxRQUNRUlpMYWlFQ0lBTkJBV29oQXd3QkN3c2dCVUVBTmdLYzZ3RWdBa0VJSUFwcmRFRVVUdzBCREFNTElBVkJBRFlDbk9zQkN5QUVJQVVvQXZEcUFTSUROZ0xjQVNBSklBNXFJUllnQXlBRktBS0E2d0ZxSVJjQ1FDQVBSUVJBSUE0aEJ3d0JDeUFGS0FLNDZRRWhHaUFGS0FLMDZRRWhHQ0FGS0FLdzZRRWhFaUFGUVFFMkFvVHFBVUVBSVFNRFFDQURRUU5IQkVBZ0JDQURRUUowSWdKcUlBSWdCV3BCck5BQmFpZ0NBRFlDWkNBRFFRRnFJUU1NQVFzTFFXd2hDU0FFUVRocUlnSWdCeUFHRUExQmlIOUxEUU5CQ0NBUElBOUJDRTRiSVI4Z05DQUNJQVVvQWdBUUhpQXpJQUlnQlNnQ0NCQWVJRElnQWlBRktBSUVFQjRnRGlBU2F5RVpRUUFoQ0FOQUlBUkJPR29RRDBFRFJpQUlJQjlPY2tVRVFDQUVLQUpRSUFRb0FreEJBM1JxS1FJQUlrQ25JZ2RCRUhZaUVVSC9BWEVoQ3lBRUtBSmdJQVFvQWx4QkEzUnFLUUlBSWtHbklneEJFSFlpSVVIL0FYRWhFQ0FFS0FKWUlBUW9BbFJCQTNScUtRSUFJa0pDSUlpbklRWWdRVUlnaUNCQVFpQ0lweUVEQWtBZ1FrSVFpS2NpQ2tIL0FYRWlBa0VDVHdSQUFrQWdBa0VaU1NBL1FvR0FnQkJVY2tVRVFDQUVRU0FnQkNnQ1BDSUtheUlOSUFJZ0FpQU5TeHNpRXlBS2FqWUNQQ0FHSUFRb0FqZ2dDblJCQUNBVGEzWWdBaUFUYXlJVGRHb2hDaUFFUVRocUVBOGFJQUlnRFUwTkFTQUVJQVFvQWp3aUFpQVRhallDUENBRUtBSTRJQUowUVFBZ0UydDJJQXBxSVFvTUFRc2dCQ0FDSUFRb0Fqd2lEV28yQWp3Z0JDZ0NPQ0FOZEVFQUlBcHJkaUFHYWlFS0lBUkJPR29RRHhvTElBUXBBbVFoUkNBRUlBbzJBbVFnQkNCRU53Sm9EQUVMQWtBZ0FrVUVRQ0FEQkVBZ0JDZ0NaQ0VLREFNTElBUW9BbWdoQ2d3QkN5QUVJQVFvQWp3aUFrRUJhallDUEFKL0lBWWdBMFZxSUFRb0FqZ2dBblJCSDNacUlnSkJBMFlFUUNBRUtBSmtRUUZyREFFTElBSkJBblFnQkdvb0FtUUxJZ1pGSUFacUlRb2dBa0VCUndSQUlBUWdCQ2dDYURZQ2JBc0xJQVFnQkNnQ1pEWUNhQ0FFSUFvMkFtUUxweUVDSUVGQ2dJRDhCNE5RUlFSQUlBUWdCQ2dDUENJR0lCQnFOZ0k4SUFRb0FqZ2dCblJCQUNBaGEzWWdBbW9oQWdzZ0N5QVFha0VVVHdSQUlBUkJPR29RRHhvTElFQkNnSUQ4QjROUVJRUkFJQVFnQkNnQ1BDSUdJQXRxTmdJOElBUW9BamdnQm5SQkFDQVJhM1lnQTJvaEF3c2dCRUU0YWhBUEdpQUVJQVFvQWpnaUJrRUFJQWRCR0hZaUN5QUVLQUk4YWlJUWEzWWdDMEVDZEVHZ0hXb29BZ0J4SUFkQi8vOERjV28yQWt3Z0JDQVFJQXhCR0hZaUIyb2lDellDUENBRUlBZEJBblJCb0IxcUtBSUFJQVpCQUNBTGEzWnhJQXhCLy84RGNXbzJBbHdnQkVFNGFoQVBHaUFFSUVLbklnWkJHSFlpQnlBRUtBSThhaUlMTmdJOElBUWdCMEVDZEVHZ0hXb29BZ0FnQkNnQ09FRUFJQXRyZG5FZ0JrSC8vd054YWpZQ1ZDQUVRZkFBYWlBSVFReHNhaUlHSUFvMkFnZ2dCaUFDTmdJRUlBWWdBellDQUNBSVFRRnFJUWdnQXlBWmFpQUNhaUVaREFFTEN5QUlJQjlJRFFNZ0ZrRWdheUVoSUE0aEJ3TkFJQVJCT0dvUUQwRURSaUFJSUE5T2NrVUVRQ0FFS0FKUUlBUW9Ba3hCQTNScUtRSUFJa0NuSWdaQkVIWWlJMEgvQVhFaENpQUVLQUpnSUFRb0FseEJBM1JxS1FJQUlrR25JZzFCRUhZaUlFSC9BWEVoRXlBRUtBSllJQVFvQWxSQkEzUnFLUUlBSWtKQ0lJaW5JUU1nUVVJZ2lDQkFRaUNJcHlFTEFrQWdRa0lRaUtjaURFSC9BWEVpQWtFQ1R3UkFBa0FnQWtFWlNTQS9Rb0dBZ0JCVWNrVUVRQ0FFUVNBZ0JDZ0NQQ0lNYXlJUklBSWdBaUFSU3hzaUVDQU1hallDUENBRElBUW9BamdnREhSQkFDQVFhM1lnQWlBUWF5SU1kR29oRUNBRVFUaHFFQThhSUFJZ0VVME5BU0FFSUFRb0Fqd2lBaUFNYWpZQ1BDQUVLQUk0SUFKMFFRQWdER3QySUJCcUlSQU1BUXNnQkNBQ0lBUW9BandpRUdvMkFqd2dCQ2dDT0NBUWRFRUFJQXhyZGlBRGFpRVFJQVJCT0dvUUR4b0xJQVFwQW1RaFJDQUVJQkEyQW1RZ0JDQkVOd0pvREFFTEFrQWdBa1VFUUNBTEJFQWdCQ2dDWkNFUURBTUxJQVFvQW1naEVBd0JDeUFFSUFRb0Fqd2lBa0VCYWpZQ1BBSi9JQU1nQzBWcUlBUW9BamdnQW5SQkgzWnFJZ0pCQTBZRVFDQUVLQUprUVFGckRBRUxJQUpCQW5RZ0JHb29BbVFMSWdORklBTnFJUkFnQWtFQlJ3UkFJQVFnQkNnQ2FEWUNiQXNMSUFRZ0JDZ0NaRFlDYUNBRUlCQTJBbVFMcHlFTUlFRkNnSUQ4QjROUVJRUkFJQVFnQkNnQ1BDSUNJQk5xTmdJOElBUW9BamdnQW5SQkFDQWdhM1lnREdvaERBc2dDaUFUYWtFVVR3UkFJQVJCT0dvUUR4b0xJRUJDZ0lEOEI0TlFSUVJBSUFRZ0JDZ0NQQ0lDSUFwcU5nSThJQVFvQWpnZ0FuUkJBQ0FqYTNZZ0Myb2hDd3NnQkVFNGFoQVBHaUFFSUFRb0FqZ2lBa0VBSUFaQkdIWWlBeUFFS0FJOGFpSUthM1lnQTBFQ2RFR2dIV29vQWdCeElBWkIvLzhEY1dvMkFrd2dCQ0FLSUExQkdIWWlBMm9pQmpZQ1BDQUVJQU5CQW5SQm9CMXFLQUlBSUFKQkFDQUdhM1p4SUExQi8vOERjV28yQWx3Z0JFRTRhaEFQR2lBRUlFS25JZ0pCR0hZaUF5QUVLQUk4YWlJR05nSThJQVFnQTBFQ2RFR2dIV29vQWdBZ0JDZ0NPRUVBSUFacmRuRWdBa0gvL3dOeGFqWUNWQUpBQWtBQ1FDQUVLQUxjQVNJRElBUkI4QUJxSUFoQkIzRkJER3hxSWhNb0FnQWlFV29pSXlBWFN3MEFJQWNnRXlnQ0JDSU5JQkZxSWdwcUlDRkxEUUFnQ2tFZ2FpQVdJQWRyVFEwQkN5QUVJQk1vQWdnMkFoZ2dCQ0FUS1FJQU53TVFJQWNnRmlBRVFSQnFJQVJCM0FGcUlCY2dFaUFZSUJvUUh5RUtEQUVMSUFjZ0VXb2hBaUFUS0FJSUlRWWdCeUFES1FBQU53QUFJQWNnQXlrQUNEY0FDQUpBSUJGQkVVa05BQ0FISUFNcEFCQTNBQkFnQnlBREtRQVlOd0FZSUJGQkVHdEJFVWdOQUNBRFFSQnFJUU1nQjBFZ2FpRVJBMEFnRVNBREtRQVFOd0FBSUJFZ0F5a0FHRGNBQ0NBUklBTXBBQ0EzQUJBZ0VTQURLUUFvTndBWUlBTkJJR29oQXlBUlFTQnFJaEVnQWtrTkFBc0xJQUlnQm1zaEF5QUVJQ00yQXR3QklBSWdFbXNnQmtrRVFDQUdJQUlnR0d0TERRY2dHaUFhSUFNZ0Vtc2lBMm9pRVNBTmFrOEVRQ0FDSUJFZ0RSQUtHZ3dDQ3lBRElBMXFJUTBnQWlBUlFRQWdBMnNRQ2lBRGF5RUNJQkloQXdzZ0JrRVFUd1JBSUFJZ0F5a0FBRGNBQUNBQ0lBTXBBQWczQUFnZ0RVRVJTQTBCSUFJZ0RXb2hCaUFDUVJCcUlRSURRQ0FDSUFNcEFCQTNBQUFnQWlBREtRQVlOd0FJSUFJZ0F5a0FJRGNBRUNBQ0lBTXBBQ2czQUJnZ0EwRWdhaUVESUFKQklHb2lBaUFHU1EwQUN3d0JDd0pBSUFaQkIwMEVRQ0FDSUFNdEFBQTZBQUFnQWlBRExRQUJPZ0FCSUFJZ0F5MEFBam9BQWlBQ0lBTXRBQU02QUFNZ0FpQURJQVpCQW5RaUJrSEFIbW9vQWdCcUlnTW9BQUEyQUFRZ0F5QUdRZUFlYWlnQ0FHc2hBd3dCQ3lBQ0lBTXBBQUEzQUFBTElBMUJDVWtOQUNBQ0lBMXFJUkVnQWtFSWFpSUdJQU5CQ0dvaUEydEJEMHdFUUFOQUlBWWdBeWtBQURjQUFDQURRUWhxSVFNZ0JrRUlhaUlHSUJGSkRRQU1BZ3NBQ3lBR0lBTXBBQUEzQUFBZ0JpQURLUUFJTndBSUlBMUJHVWdOQUNBQ1FSaHFJUUlEUUNBQ0lBTXBBQkEzQUFBZ0FpQURLUUFZTndBSUlBSWdBeWtBSURjQUVDQUNJQU1wQUNnM0FCZ2dBMEVnYWlFRElBSkJJR29pQWlBUlNRMEFDd3NnQ2tHSWYwc0VRQ0FLSVFrTUJnVWdFeUFRTmdJSUlCTWdERFlDQkNBVElBczJBZ0FnQ0VFQmFpRUlJQWNnQ21vaEJ5QUxJQmxxSUF4cUlSa01BZ3NBQ3dzZ0NDQVBTQTBESUFnZ0gyc2hCZ05BQWtBZ0JpQVBUZ1JBUVFBaEF3TkFJQU5CQTBZTkFpQUZJQU5CQW5RaUFtcEJyTkFCYWlBQ0lBUnFLQUprTmdJQUlBTkJBV29oQXd3QUN3QUxBa0FDUUFKQUlBUW9BdHdCSWdNZ0JFSHdBR29nQmtFSGNVRU1iR29pQ0NnQ0FDSU1haUlRSUJkTERRQWdCeUFJS0FJRUlnc2dER29pQ21vZ0lVc05BQ0FLUVNCcUlCWWdCMnRORFFFTElBUWdDQ2dDQ0RZQ0tDQUVJQWdwQWdBM0F5QWdCeUFXSUFSQklHb2dCRUhjQVdvZ0Z5QVNJQmdnR2hBZklRb01BUXNnQnlBTWFpRUNJQWdvQWdnaENDQUhJQU1wQUFBM0FBQWdCeUFES1FBSU53QUlBa0FnREVFUlNRMEFJQWNnQXlrQUVEY0FFQ0FISUFNcEFCZzNBQmdnREVFUWEwRVJTQTBBSUFOQkVHb2hBeUFIUVNCcUlRd0RRQ0FNSUFNcEFCQTNBQUFnRENBREtRQVlOd0FJSUF3Z0F5a0FJRGNBRUNBTUlBTXBBQ2czQUJnZ0EwRWdhaUVESUF4QklHb2lEQ0FDU1EwQUN3c2dBaUFJYXlFRElBUWdFRFlDM0FFZ0FpQVNheUFJU1FSQUlBZ2dBaUFZYTBzTkJ5QWFJQm9nQXlBU2F5SURhaUlNSUF0cVR3UkFJQUlnRENBTEVBb2FEQUlMSUFNZ0Myb2hDeUFDSUF4QkFDQURheEFLSUFOcklRSWdFaUVEQ3lBSVFSQlBCRUFnQWlBREtRQUFOd0FBSUFJZ0F5a0FDRGNBQ0NBTFFSRklEUUVnQWlBTGFpRUlJQUpCRUdvaEFnTkFJQUlnQXlrQUVEY0FBQ0FDSUFNcEFCZzNBQWdnQWlBREtRQWdOd0FRSUFJZ0F5a0FLRGNBR0NBRFFTQnFJUU1nQWtFZ2FpSUNJQWhKRFFBTERBRUxBa0FnQ0VFSFRRUkFJQUlnQXkwQUFEb0FBQ0FDSUFNdEFBRTZBQUVnQWlBRExRQUNPZ0FDSUFJZ0F5MEFBem9BQXlBQ0lBTWdDRUVDZENJSVFjQWVhaWdDQUdvaUF5Z0FBRFlBQkNBRElBaEI0QjVxS0FJQWF5RUREQUVMSUFJZ0F5a0FBRGNBQUFzZ0MwRUpTUTBBSUFJZ0Myb2hEQ0FDUVFocUlnZ2dBMEVJYWlJRGEwRVBUQVJBQTBBZ0NDQURLUUFBTndBQUlBTkJDR29oQXlBSVFRaHFJZ2dnREVrTkFBd0NDd0FMSUFnZ0F5a0FBRGNBQUNBSUlBTXBBQWczQUFnZ0MwRVpTQTBBSUFKQkdHb2hBZ05BSUFJZ0F5a0FFRGNBQUNBQ0lBTXBBQmczQUFnZ0FpQURLUUFnTndBUUlBSWdBeWtBS0RjQUdDQURRU0JxSVFNZ0FrRWdhaUlDSUF4SkRRQUxDeUFLUVloL1N3UkFJQW9oQ1F3R0JTQUdRUUZxSVFZZ0J5QUthaUVIREFJTEFBc0xJQVFvQXR3QklRTUxRYnAvSVFrZ0Z5QURheUlDSUJZZ0IydExEUUlnQndSL0lBY2dBeUFDRUFJZ0Ftb0ZRUUFMSUE1cklRa01BZ3NnQlVFQU5nS2M2d0VMSUFRZ0JTZ0M4T29CSWdNMkF0d0JJQWtnRG1vaERDQURJQVVvQW9EckFXb2hFQUpBSUE5RkJFQWdEaUVHREFFTElBVW9BcmpwQVNFTklBVW9BclRwQVNFVElBVW9BckRwQVNFU0lBVkJBVFlDaE9vQlFRQWhBd05BSUFOQkEwY0VRQ0FFSUFOQkFuUWlBbW9nQWlBRmFrR3MwQUZxS0FJQU5nS2NBU0FEUVFGcUlRTU1BUXNMUVd3aENTQUVRZkFBYWlJQ0lBY2dCaEFOUVloL1N3MEJJREVnQWlBRktBSUFFQjRnTUNBQ0lBVW9BZ2dRSGlBdklBSWdCU2dDQkJBZUlBeEJJR3NoR0NBT0lRWURRQ0FFS0FLSUFTQUVLQUtFQVVFRGRHb3BBZ0FpUUtjaUNrRVFkaUlaUWY4QmNTRUxJQVFvQXBnQklBUW9BcFFCUVFOMGFpa0NBQ0pCcHlJV1FSQjJJaDlCL3dGeElSb2dCQ2dDa0FFZ0JDZ0NqQUZCQTNScUtRSUFJa0pDSUlpbklRY2dRVUlnaUNCQVFpQ0lweUVEQWtBZ1FrSVFpS2NpQ0VIL0FYRWlBa0VDVHdSQUFrQWdBa0VaU1NBL1FvR0FnQkJVY2tVRVFDQUVRU0FnQkNnQ2RDSUlheUlSSUFJZ0FpQVJTeHNpRnlBSWFqWUNkQ0FISUFRb0FuQWdDSFJCQUNBWGEzWWdBaUFYYXlJWGRHb2hDQ0FFUWZBQWFoQVBHaUFDSUJGTkRRRWdCQ0FFS0FKMElnSWdGMm8yQW5RZ0JDZ0NjQ0FDZEVFQUlCZHJkaUFJYWlFSURBRUxJQVFnQWlBRUtBSjBJaEZxTmdKMElBUW9BbkFnRVhSQkFDQUlhM1lnQjJvaENDQUVRZkFBYWhBUEdnc2dCQ2tDbkFFaFJDQUVJQWcyQXB3QklBUWdSRGNDb0FFTUFRc0NRQ0FDUlFSQUlBTUVRQ0FFS0FLY0FTRUlEQU1MSUFRb0FxQUJJUWdNQVFzZ0JDQUVLQUowSWdKQkFXbzJBblFDZnlBSElBTkZhaUFFS0FKd0lBSjBRUjkyYWlJQ1FRTkdCRUFnQkNnQ25BRkJBV3NNQVFzZ0FrRUNkQ0FFYWlnQ25BRUxJZ2RGSUFkcUlRZ2dBa0VCUndSQUlBUWdCQ2dDb0FFMkFxUUJDd3NnQkNBRUtBS2NBVFlDb0FFZ0JDQUlOZ0tjQVF1bklRSWdRVUtBZ1B3SGcxQkZCRUFnQkNBRUtBSjBJZ2NnR21vMkFuUWdCQ2dDY0NBSGRFRUFJQjlyZGlBQ2FpRUNDeUFMSUJwcVFSUlBCRUFnQkVId0FHb1FEeG9MSUVCQ2dJRDhCNE5RUlFSQUlBUWdCQ2dDZENJSElBdHFOZ0owSUFRb0FuQWdCM1JCQUNBWmEzWWdBMm9oQXdzZ0JFSHdBR29RRHhvZ0JDQUVLQUp3SWdkQkFDQUtRUmgySWdzZ0JDZ0NkR29pR210MklBdEJBblJCb0IxcUtBSUFjU0FLUWYvL0EzRnFOZ0tFQVNBRUlCb2dGa0VZZGlJS2FpSUxOZ0owSUFRZ0NrRUNkRUdnSFdvb0FnQWdCMEVBSUF0cmRuRWdGa0gvL3dOeGFqWUNsQUVnQkVId0FHb1FEeG9nQkNCQ3B5SUhRUmgySWdvZ0JDZ0NkR29pQ3pZQ2RDQUVJQXBCQW5SQm9CMXFLQUlBSUFRb0FuQkJBQ0FMYTNaeElBZEIvLzhEY1dvMkFvd0JJQVFnQXpZQ09DQUVJQUkyQWp3Z0JDQUlOZ0pBQWtBQ1FBSkFJQVFvQXR3Qklnc2dBMm9pRmlBUVN3MEFJQVlnQWlBRGFpSUthaUFZU3cwQUlBcEJJR29nRENBR2EwME5BUXNnQkNBRVFVQnJLQUlBTmdJSUlBUWdCQ2tET0RjREFDQUdJQXdnQkNBRVFkd0JhaUFRSUJJZ0V5QU5FQjhoQ2d3QkN5QURJQVpxSVFjZ0JpQUxLUUFBTndBQUlBWWdDeWtBQ0RjQUNBSkFJQU5CRVVrTkFDQUdJQXNwQUJBM0FCQWdCaUFMS1FBWU53QVlJQU5CRUd0QkVVZ05BQ0FMUVJCcUlRTWdCa0VnYWlFTEEwQWdDeUFES1FBUU53QUFJQXNnQXlrQUdEY0FDQ0FMSUFNcEFDQTNBQkFnQ3lBREtRQW9Od0FZSUFOQklHb2hBeUFMUVNCcUlnc2dCMGtOQUFzTElBY2dDR3NoQXlBRUlCWTJBdHdCSUFjZ0Vtc2dDRWtFUUNBSUlBY2dFMnRMRFFRZ0RTQU5JQU1nRW1zaUEyb2lDeUFDYWs4RVFDQUhJQXNnQWhBS0dnd0NDeUFISUF0QkFDQURheEFLSUFRZ0FpQURhaUlDTmdJOElBTnJJUWNnRWlFREN5QUlRUkJQQkVBZ0J5QURLUUFBTndBQUlBY2dBeWtBQ0RjQUNDQUNRUkZJRFFFZ0FpQUhhaUVJSUFkQkVHb2hBZ05BSUFJZ0F5a0FFRGNBQUNBQ0lBTXBBQmczQUFnZ0FpQURLUUFnTndBUUlBSWdBeWtBS0RjQUdDQURRU0JxSVFNZ0FrRWdhaUlDSUFoSkRRQUxEQUVMQWtBZ0NFRUhUUVJBSUFjZ0F5MEFBRG9BQUNBSElBTXRBQUU2QUFFZ0J5QURMUUFDT2dBQ0lBY2dBeTBBQXpvQUF5QUhJQU1nQ0VFQ2RDSUlRY0FlYWlnQ0FHb2lBeWdBQURZQUJDQURJQWhCNEI1cUtBSUFheUVEREFFTElBY2dBeWtBQURjQUFBc2dBa0VKU1EwQUlBSWdCMm9oQ3lBSFFRaHFJZ2dnQTBFSWFpSURhMEVQVEFSQUEwQWdDQ0FES1FBQU53QUFJQU5CQ0dvaEF5QUlRUWhxSWdnZ0Mwa05BQXdDQ3dBTElBZ2dBeWtBQURjQUFDQUlJQU1wQUFnM0FBZ2dBa0VaU0EwQUlBZEJHR29oQWdOQUlBSWdBeWtBRURjQUFDQUNJQU1wQUJnM0FBZ2dBaUFES1FBZ053QVFJQUlnQXlrQUtEY0FHQ0FEUVNCcUlRTWdBa0VnYWlJQ0lBdEpEUUFMQ3lBS1FZaC9Td1JBSUFvaENRd0RDeUFHSUFwcUlRWWdCRUh3QUdvUUR5RURJQTlCQVdzaUR3MEFDMEVBSVFJZ0EwRUNTUTBCQTBBZ0FrRURSd1JBSUFVZ0FrRUNkQ0lEYWtHczBBRnFJQU1nQkdvb0Fwd0JOZ0lBSUFKQkFXb2hBZ3dCQ3dzZ0JDZ0MzQUVoQXd0QnVuOGhDU0FRSUFOcklnSWdEQ0FHYTBzTkFDQUdCSDhnQmlBRElBSVFBaUFDYWdWQkFBc2dEbXNoQ1FzZ0NVR0lmMHNOQmdzQ1FDQUZLQUxzNmdGRkRRQWdCU0FGS1FPSTZnRWdDYTE4TndPSTZnRUNRQ0FGS0FMUTZnRWlBaUFKYWlJSVFSOU5CRUFnRGtVTkFTQUNJQ0pxSUE0Z0NSQUNHaUFGS0FMUTZnRWdDV29oQ0F3QkN5QU9JUU1nQWdSQUlBSWdJbW9nQTBFZ0lBSnJFQUlhSUFVb0F0RHFBU0VDSUFWQkFEWUMwT29CSUFVZ0JTa0RrT29CSUFVcEFMRHFBVUxQMXRPKzBzZXIyVUorZkVJZmlVS0hsYSt2bUxiZW01NS9mamNEa09vQklBVWdCU2tEbU9vQklBVXBBTGpxQVVMUDF0Tyswc2VyMlVKK2ZFSWZpVUtIbGErdm1MYmVtNTUvZmpjRG1Pb0JJQVVnQlNrRG9Pb0JJQVVwQU1EcUFVTFAxdE8rMHNlcjJVSitmRUlmaVVLSGxhK3ZtTGJlbTU1L2ZqY0RvT29CSUFVZ0JTa0RxT29CSUFVcEFNanFBVUxQMXRPKzBzZXIyVUorZkVJZmlVS0hsYSt2bUxiZW01NS9mamNEcU9vQklBTWdBbXRCSUdvaEF3c2dDU0FPYWlJQ0lBTkJJR3BQQkVBZ0FrRWdheUVHSUFVcEE2anFBU0UvSUFVcEE2RHFBU0ZBSUFVcEE1anFBU0ZCSUFVcEE1RHFBU0ZDQTBBZ0F5a0FHRUxQMXRPKzBzZXIyVUorSUQ5OFFoK0pRb2VWcjYrWXR0NmJubjkrSVQ4Z0F5a0FFRUxQMXRPKzBzZXIyVUorSUVCOFFoK0pRb2VWcjYrWXR0NmJubjkrSVVBZ0F5a0FDRUxQMXRPKzBzZXIyVUorSUVGOFFoK0pRb2VWcjYrWXR0NmJubjkrSVVFZ0F5a0FBRUxQMXRPKzBzZXIyVUorSUVKOFFoK0pRb2VWcjYrWXR0NmJubjkrSVVJZ0EwRWdhaUlESUFaTkRRQUxJQVVnUHpjRHFPb0JJQVVnUURjRG9Pb0JJQVVnUVRjRG1Pb0JJQVVnUWpjRGtPb0JDeUFDSUFOTkRRRWdJaUFESUFJZ0Eyc2lDQkFDR2dzZ0JTQUlOZ0xRNmdFTElEVWdGV3NoQXlBVklCdHFJUUlnQ1NBT2FpRU9JQVFvQWpCRkRRQUxJQ2twQXdBaVAwSi9VU0EvSUE0Z0hXdXNVWEpGQkVCQmJDRUpEQVlMSUFVb0F1RHBBUVJBUVdvaENTQURRUVJKRFFZZ0JTZ0M2T29CUlFSQUlDSWdCU2dDME9vQmFpRUtBbjRnQlNrRGlPb0JJajlDSUZvRVFDQUZLUU9ZNmdFaVFFSUhpU0FGS1FPUTZnRWlRVUlCaVh3Z0JTa0RvT29CSWtKQ0RJbDhJQVVwQTZqcUFTSkRRaEtKZkNCQlFzL1cwNzdTeDZ2WlFuNUNINGxDaDVXdnI1aTIzcHVlZjM2RlFvZVZyNitZdHQ2Ym5uOStRcDJqdGVxRHNZMksrZ0I5SUVCQ3o5YlR2dExIcTlsQ2ZrSWZpVUtIbGErdm1MYmVtNTUvZm9WQ2g1V3ZyNWkyM3B1ZWYzNUNuYU8xNm9PeGpZcjZBSDBnUWtMUDF0Tyswc2VyMlVKK1FoK0pRb2VWcjYrWXR0NmJubjkraFVLSGxhK3ZtTGJlbTU1L2ZrS2RvN1hxZzdHTml2b0FmU0JEUXMvVzA3N1N4NnZaUW41Q0g0bENoNVd2cjVpMjNwdWVmMzZGUW9lVnI2K1l0dDZibm45K1FwMmp0ZXFEc1kySytnQjlEQUVMSUFVcEE2RHFBVUxGejlteThlVzY2aWQ4Q3lBL2ZDRS9JQ0loQmdOQUlBb2dCa0VJYWlJSFR3UkFJQVlwQUFCQ3o5YlR2dExIcTlsQ2ZrSWZpVUtIbGErdm1MYmVtNTUvZmlBL2hVSWJpVUtIbGErdm1MYmVtNTUvZmtLZG83WHFnN0dOaXZvQWZTRS9JQWNoQmd3QkN3c0NRQ0FLSUFaQkJHb2lDRWtFUUNBR0lRZ01BUXNnQmpVQUFFS0hsYSt2bUxiZW01NS9maUEvaFVJWGlVTFAxdE8rMHNlcjJVSitRdm56M2ZHWjlwbXJGbndoUHdzRFFDQUlJQXBKQkVBZ0NERUFBRUxGejlteThlVzY2aWQrSUQrRlFndUpRb2VWcjYrWXR0NmJubjkrSVQ4Z0NFRUJhaUVJREFFTEN5QUNLQUFBSUQ5Q0lZZ2dQNFZDejliVHZ0TEhxOWxDZmlJL1FoMklJRCtGUXZuejNmR1o5cG1yRm40aVAwSWdpQ0EvaGFkSERRY0xJQU5CQkdzaEF5QUNRUVJxSVFJTElBNGdIV3NpQ1VHSmYwOE5CQ0FCSUFscklRRWdDU0FkYWlFZFFRRWhQZ3dCQ3d0QnVIOGhCeUFERFFRZ0hTQUFheUVIREFRTFFXd2hDUXdCQzBHNGZ5RUpDMEc0ZnlFSElBbEJka1lnUG5FTkFRc2dDU0VIQ3lnQ0FBMEFJQVZCL09vQmFpZ0NBQ0VCSUFWQitPb0JhaWdDQUNFQUlBVVFHQ0FGS0FLdzZ3RWdBQ0FCRUJNZ0JVRUFOZ0t3NndFZ0JTZ0NwT3NCSWdJRVFBSkFBa0FDUUFKQUlBSW9BZ0FpQXdSQUlBQkZEUUlnQVNBRElBQVJBZ0FNQVFzZ0FFVU5BZ3NnQVNBQ0lBQVJBZ0FNQWdzZ0F4QUdDeUFDRUFZTElBVkJBRFlDcE9zQkN5QUFCRUFnQVNBRklBQVJBZ0FNQVFzZ0JSQUdDeUFFUWVBQmFpUUFJQWNMQzZnVkNRQkJpQWdMRFFFQUFBQUJBQUFBQWdBQUFBSUFRYUFJQzdNR0FRQUFBQUVBQUFBQ0FBQUFBZ0FBQUNZQUFBQ0NBQUFBSVFVQUFFb0FBQUJuQ0FBQUpnQUFBTUFCQUFDQUFBQUFTUVVBQUVvQUFBQytDQUFBS1FBQUFDd0NBQUNBQUFBQVNRVUFBRW9BQUFDK0NBQUFMd0FBQU1vQ0FBQ0FBQUFBaWdVQUFFb0FBQUNFQ1FBQU5RQUFBSE1EQUFDQUFBQUFuUVVBQUVvQUFBQ2dDUUFBUFFBQUFJRURBQUNBQUFBQTZ3VUFBRXNBQUFBK0NnQUFSQUFBQUo0REFBQ0FBQUFBVFFZQUFFc0FBQUNxQ2dBQVN3QUFBTE1EQUFDQUFBQUF3UVlBQUUwQUFBQWZEUUFBVFFBQUFGTUVBQUNBQUFBQUl3Z0FBRkVBQUFDbUR3QUFWQUFBQUprRUFBQ0FBQUFBU3drQUFGY0FBQUN4RWdBQVdBQUFBTm9FQUFDQUFBQUFid2tBQUYwQUFBQWpGQUFBVkFBQUFFVUZBQUNBQUFBQVZBb0FBR29BQUFDTUZBQUFhZ0FBQUs4RkFBQ0FBQUFBZGdrQUFId0FBQUJPRUFBQWZBQUFBTklDQUFDQUFBQUFZd2NBQUpFQUFBQ1FCd0FBa2dBQUFBQUFBQUFCQUFBQUFRQUFBQVVBQUFBTkFBQUFIUUFBQUQwQUFBQjlBQUFBL1FBQUFQMEJBQUQ5QXdBQS9RY0FBUDBQQUFEOUh3QUEvVDhBQVAxL0FBRDkvd0FBL2Y4QkFQMy9Bd0Q5L3djQS9mOFBBUDMvSHdEOS96OEEvZjkvQVAzLy93RDkvLzhCL2YvL0EvMy8vd2Y5Ly84UC9mLy9ILzMvL3ovOS8vOS9BQUFBQUFFQUFBQUNBQUFBQXdBQUFBUUFBQUFGQUFBQUJnQUFBQWNBQUFBSUFBQUFDUUFBQUFvQUFBQUxBQUFBREFBQUFBMEFBQUFPQUFBQUR3QUFBQkFBQUFBUkFBQUFFZ0FBQUJNQUFBQVVBQUFBRlFBQUFCWUFBQUFYQUFBQUdBQUFBQmtBQUFBYUFBQUFHd0FBQUJ3QUFBQWRBQUFBSGdBQUFCOEFBQUFEQUFBQUJBQUFBQVVBQUFBR0FBQUFCd0FBQUFnQUFBQUpBQUFBQ2dBQUFBc0FBQUFNQUFBQURRQUFBQTRBQUFBUEFBQUFFQUFBQUJFQUFBQVNBQUFBRXdBQUFCUUFBQUFWQUFBQUZnQUFBQmNBQUFBWUFBQUFHUUFBQUJvQUFBQWJBQUFBSEFBQUFCMEFBQUFlQUFBQUh3QUFBQ0FBQUFBaEFBQUFJZ0FBQUNNQUFBQWxBQUFBSndBQUFDa0FBQUFyQUFBQUx3QUFBRE1BQUFBN0FBQUFRd0FBQUZNQUFBQmpBQUFBZ3dBQUFBTUJBQUFEQWdBQUF3UUFBQU1JQUFBREVBQUFBeUFBQUFOQUFBQURnQUFBQXdBQkFFSGdEd3RSQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUlBQUFBQ0FBQUFBd0FBQUFNQUFBQUVBQUFBQkFBQUFBVUFBQUFIQUFBQUNBQUFBQWtBQUFBS0FBQUFDd0FBQUF3QUFBQU5BQUFBRGdBQUFBOEFBQUFRQUVIRUVBdUxBUUVBQUFBQ0FBQUFBd0FBQUFRQUFBQUZBQUFBQmdBQUFBY0FBQUFJQUFBQUNRQUFBQW9BQUFBTEFBQUFEQUFBQUEwQUFBQU9BQUFBRHdBQUFCQUFBQUFTQUFBQUZBQUFBQllBQUFBWUFBQUFIQUFBQUNBQUFBQW9BQUFBTUFBQUFFQUFBQUNBQUFBQUFBRUFBQUFDQUFBQUJBQUFBQWdBQUFBUUFBQUFJQUFBQUVBQUFBQ0FBQUFBQUFFQVFaQVNDK1lFQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUlBQUFBQ0FBQUFBd0FBQUFNQUFBQUVBQUFBQmdBQUFBY0FBQUFJQUFBQUNRQUFBQW9BQUFBTEFBQUFEQUFBQUEwQUFBQU9BQUFBRHdBQUFCQUFBQUFCQUFBQUJBQUFBQWdBQUFBQUFBQUFBUUFCQVFZQUFBQUFBQUFFQUFBQUFCQUFBQVFBQUFBQUlBQUFCUUVBQUFBQUFBQUZBd0FBQUFBQUFBVUVBQUFBQUFBQUJRWUFBQUFBQUFBRkJ3QUFBQUFBQUFVSkFBQUFBQUFBQlFvQUFBQUFBQUFGREFBQUFBQUFBQVlPQUFBQUFBQUJCUkFBQUFBQUFBRUZGQUFBQUFBQUFRVVdBQUFBQUFBQ0JSd0FBQUFBQUFNRklBQUFBQUFBQkFVd0FBQUFJQUFHQlVBQUFBQUFBQWNGZ0FBQUFBQUFDQVlBQVFBQUFBQUtCZ0FFQUFBQUFBd0dBQkFBQUNBQUFBUUFBQUFBQUFBQUJBRUFBQUFBQUFBRkFnQUFBQ0FBQUFVRUFBQUFBQUFBQlFVQUFBQWdBQUFGQndBQUFBQUFBQVVJQUFBQUlBQUFCUW9BQUFBQUFBQUZDd0FBQUFBQUFBWU5BQUFBSUFBQkJSQUFBQUFBQUFFRkVnQUFBQ0FBQVFVV0FBQUFBQUFDQlJnQUFBQWdBQU1GSUFBQUFBQUFBd1VvQUFBQUFBQUdCRUFBQUFBUUFBWUVRQUFBQUNBQUJ3V0FBQUFBQUFBSkJnQUNBQUFBQUFzR0FBZ0FBREFBQUFRQUFBQUFFQUFBQkFFQUFBQWdBQUFGQWdBQUFDQUFBQVVEQUFBQUlBQUFCUVVBQUFBZ0FBQUZCZ0FBQUNBQUFBVUlBQUFBSUFBQUJRa0FBQUFnQUFBRkN3QUFBQ0FBQUFVTUFBQUFBQUFBQmc4QUFBQWdBQUVGRWdBQUFDQUFBUVVVQUFBQUlBQUNCUmdBQUFBZ0FBSUZIQUFBQUNBQUF3VW9BQUFBSUFBRUJUQUFBQUFBQUJBR0FBQUJBQUFBRHdZQWdBQUFBQUFPQmdCQUFBQUFBQTBHQUNBQVFZQVhDNGNDQVFBQkFRVUFBQUFBQUFBRkFBQUFBQUFBQmdROUFBQUFBQUFKQmYwQkFBQUFBQThGL1g4QUFBQUFGUVg5L3g4QUFBQURCUVVBQUFBQUFBY0VmUUFBQUFBQURBWDlEd0FBQUFBU0JmMy9Bd0FBQUJjRi9mOS9BQUFBQlFVZEFBQUFBQUFJQlAwQUFBQUFBQTRGL1Q4QUFBQUFGQVg5L3c4QUFBQUNCUUVBQUFBUUFBY0VmUUFBQUFBQUN3WDlCd0FBQUFBUkJmMy9BUUFBQUJZRi9mOC9BQUFBQkFVTkFBQUFFQUFJQlAwQUFBQUFBQTBGL1I4QUFBQUFFd1g5L3djQUFBQUJCUUVBQUFBUUFBWUVQUUFBQUFBQUNnWDlBd0FBQUFBUUJmMy9BQUFBQUJ3Ri9mLy9Ed0FBR3dYOS8vOEhBQUFhQmYzLy93TUFBQmtGL2YvL0FRQUFHQVg5Ly84QVFaQVpDNFlFQVFBQkFRWUFBQUFBQUFBR0F3QUFBQUFBQUFRRUFBQUFJQUFBQlFVQUFBQUFBQUFGQmdBQUFBQUFBQVVJQUFBQUFBQUFCUWtBQUFBQUFBQUZDd0FBQUFBQUFBWU5BQUFBQUFBQUJoQUFBQUFBQUFBR0V3QUFBQUFBQUFZV0FBQUFBQUFBQmhrQUFBQUFBQUFHSEFBQUFBQUFBQVlmQUFBQUFBQUFCaUlBQUFBQUFBRUdKUUFBQUFBQUFRWXBBQUFBQUFBQ0JpOEFBQUFBQUFNR093QUFBQUFBQkFaVEFBQUFBQUFIQm9NQUFBQUFBQWtHQXdJQUFCQUFBQVFFQUFBQUFBQUFCQVVBQUFBZ0FBQUZCZ0FBQUFBQUFBVUhBQUFBSUFBQUJRa0FBQUFBQUFBRkNnQUFBQUFBQUFZTUFBQUFBQUFBQmc4QUFBQUFBQUFHRWdBQUFBQUFBQVlWQUFBQUFBQUFCaGdBQUFBQUFBQUdHd0FBQUFBQUFBWWVBQUFBQUFBQUJpRUFBQUFBQUFFR0l3QUFBQUFBQVFZbkFBQUFBQUFDQmlzQUFBQUFBQU1HTXdBQUFBQUFCQVpEQUFBQUFBQUZCbU1BQUFBQUFBZ0dBd0VBQUNBQUFBUUVBQUFBTUFBQUJBUUFBQUFRQUFBRUJRQUFBQ0FBQUFVSEFBQUFJQUFBQlFnQUFBQWdBQUFGQ2dBQUFDQUFBQVVMQUFBQUFBQUFCZzRBQUFBQUFBQUdFUUFBQUFBQUFBWVVBQUFBQUFBQUJoY0FBQUFBQUFBR0dnQUFBQUFBQUFZZEFBQUFBQUFBQmlBQUFBQUFBQkFHQXdBQkFBQUFEd1lEZ0FBQUFBQU9CZ05BQUFBQUFBMEdBeUFBQUFBQURBWURFQUFBQUFBTEJnTUlBQUFBQUFvR0F3UUFRYVFkQzlrQkFRQUFBQU1BQUFBSEFBQUFEd0FBQUI4QUFBQS9BQUFBZndBQUFQOEFBQUQvQVFBQS93TUFBUDhIQUFEL0R3QUEveDhBQVA4L0FBRC9md0FBLy84QUFQLy9BUUQvL3dNQS8vOEhBUC8vRHdELy94OEEvLzgvQVAvL2Z3RC8vLzhBLy8vL0FmLy8vd1AvLy84SC8vLy9ELy8vL3gvLy8vOC8vLy8vZndBQUFBQUJBQUFBQWdBQUFBUUFBQUFBQUFBQUFnQUFBQVFBQUFBSUFBQUFBQUFBQUFFQUFBQUNBQUFBQVFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBSUFBQUFDQUFBQUFnQUFBQUhBQUFBQ0FBQUFBa0FBQUFLQUFBQUN3QkJnQjhMQTRBUkFRPT0iO3ZhciBPdD1uZXcgeUEsVHQ9ITE7YXN5bmMgZnVuY3Rpb24gY2UoQSx0LEkpe2xldCBlPW51bGw7dHlwZW9mIEEhPSJzdHJpbmciP2U9QS5ocmVmOkEuc3RhcnRzV2l0aCgiaHR0cCIpP2U9QTplPWAke3R9LyR7QX1gLGUuZW5kc1dpdGgoIi5qcyIpJiYoZT1lLnN1YnN0cmluZygwLGUubGVuZ3RoLTMpKSxlLmVuZHNXaXRoKCIud2FzbSIpJiYoZT1lLnN1YnN0cmluZygwLGUubGVuZ3RoLTUpKTtsZXQgZz1gJHtlfS53YXNtYCxyPWF3YWl0IGRBLmdldChgJHtnfS56c3RgLHtyZXNwb25zZVR5cGU6ImFycmF5YnVmZmVyIixwYXJhbXM6SX0pO1R0fHwoYXdhaXQgT3QuaW5pdCgpLFR0PSEwKTtsZXQgbj1PdC5kZWNvZGUobmV3IFVpbnQ4QXJyYXkoci5kYXRhKSkuYnVmZmVyO3JldHVybihhd2FpdCBpbXBvcnQoYCR7ZX0uanNgKSkuZGVmYXVsdCh7d2FzbUJpbmFyeTpufSl9dmFyIFB0PWNlO3ZhciB3QT1uZXcgTWFwO2FzeW5jIGZ1bmN0aW9uIGZlKEEsdCxJKXtsZXQgZT1BLGc9QSxyPW51bGw7cmV0dXJuIHR5cGVvZiBBIT0ic3RyaW5nIiYmKGU9bmV3IFVSTChBLmhyZWYpLGc9ZS5ocmVmKSx3QS5oYXMoZyk/cj1hd2FpdCB3QS5nZXQoZyk6KHdBLnNldChnLFB0KGUsdCxJKSkscj1hd2FpdCB3QS5nZXQoZykpLHJ9dmFyIHh0PWZlO3ZhciBsZT17VGV4dEZpbGU6IlRleHRGaWxlIixCaW5hcnlGaWxlOiJCaW5hcnlGaWxlIixUZXh0U3RyZWFtOiJUZXh0U3RyZWFtIixCaW5hcnlTdHJlYW06IkJpbmFyeVN0cmVhbSIsSW1hZ2U6IkltYWdlIixQb2ludFNldDoiUG9pbnRTZXQiLE1lc2g6Ik1lc2giLFBvbHlEYXRhOiJQb2x5RGF0YSIsVHJhbnNmb3JtOiJUcmFuc2Zvcm0iLEpzb25Db21wYXRpYmxlOiJKc29uQ29tcGF0aWJsZSJ9LEQ9bGU7dmFyIERlPXtJbnQ4OiJpbnQ4IixVSW50ODoidWludDgiLEludDE2OiJpbnQxNiIsVUludDE2OiJ1aW50MTYiLEludDMyOiJpbnQzMiIsVUludDMyOiJ1aW50MzIiLEludDY0OiJpbnQ2NCIsVUludDY0OiJ1aW50NjQiLFNpemVWYWx1ZVR5cGU6InVpbnQ2NCIsSWRlbnRpZmllclR5cGU6InVpbnQ2NCIsSW5kZXhWYWx1ZVR5cGU6ImludDY0IixPZmZzZXRWYWx1ZVR5cGU6ImludDY0In0sUz1EZTt2YXIgdWU9e0Zsb2F0MzI6ImZsb2F0MzIiLEZsb2F0NjQ6ImZsb2F0NjQiLFNwYWNlUHJlY2lzaW9uVHlwZToiZmxvYXQ2NCJ9LGo9dWU7ZnVuY3Rpb24gaGUoQSx0KXtsZXQgST1udWxsO3N3aXRjaChBKXtjYXNlIFMuVUludDg6e0k9bmV3IFVpbnQ4QXJyYXkodCk7YnJlYWt9Y2FzZSBTLkludDg6e0k9bmV3IEludDhBcnJheSh0KTticmVha31jYXNlIFMuVUludDE2OntJPW5ldyBVaW50MTZBcnJheSh0KTticmVha31jYXNlIFMuSW50MTY6e0k9bmV3IEludDE2QXJyYXkodCk7YnJlYWt9Y2FzZSBTLlVJbnQzMjp7ST1uZXcgVWludDMyQXJyYXkodCk7YnJlYWt9Y2FzZSBTLkludDMyOntJPW5ldyBJbnQzMkFycmF5KHQpO2JyZWFrfWNhc2UgUy5VSW50NjQ6e3R5cGVvZiBnbG9iYWxUaGlzLkJpZ1VpbnQ2NEFycmF5PT0iZnVuY3Rpb24iP0k9bmV3IEJpZ1VpbnQ2NEFycmF5KHQpOkk9bmV3IFVpbnQ4QXJyYXkodCk7YnJlYWt9Y2FzZSBTLkludDY0Ont0eXBlb2YgZ2xvYmFsVGhpcy5CaWdJbnQ2NEFycmF5PT0iZnVuY3Rpb24iP0k9bmV3IEJpZ0ludDY0QXJyYXkodCk6ST1uZXcgVWludDhBcnJheSh0KTticmVha31jYXNlIGouRmxvYXQzMjp7ST1uZXcgRmxvYXQzMkFycmF5KHQpO2JyZWFrfWNhc2Ugai5GbG9hdDY0OntJPW5ldyBGbG9hdDY0QXJyYXkodCk7YnJlYWt9Y2FzZSJudWxsIjp7ST1udWxsO2JyZWFrfWNhc2UgbnVsbDp7ST1udWxsO2JyZWFrfWRlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJUeXBlIGlzIG5vdCBzdXBwb3J0ZWQgYXMgYSBUeXBlZEFycmF5Iil9cmV0dXJuIEl9dmFyIEc9aGU7dmFyIFp0PXR5cGVvZiBnbG9iYWxUaGlzLlNoYXJlZEFycmF5QnVmZmVyPT0iZnVuY3Rpb24iLGp0PW5ldyBUZXh0RW5jb2RlcixXdD1uZXcgVGV4dERlY29kZXIoInV0Zi04Iik7ZnVuY3Rpb24gZGUoQSx0KXtsZXQgST17ZmxhZ3M6InIiLGVuY29kaW5nOiJiaW5hcnkifSxlPUEuZnNfb3Blbih0LEkuZmxhZ3MpLHI9QS5mc19zdGF0KHQpLnNpemUsbz1udWxsO1p0P289bmV3IFNoYXJlZEFycmF5QnVmZmVyKHIpOm89bmV3IEFycmF5QnVmZmVyKHIpO2xldCBuPW5ldyBVaW50OEFycmF5KG8pO3JldHVybiBBLmZzX3JlYWQoZSxuLDAsciwwKSxBLmZzX2Nsb3NlKGUpLG59ZnVuY3Rpb24gVnQoQSx0LEkpe2xldCBlPW51bGw7WnQ/ZT1uZXcgU2hhcmVkQXJyYXlCdWZmZXIoSSk6ZT1uZXcgQXJyYXlCdWZmZXIoSSk7bGV0IGc9bmV3IFVpbnQ4QXJyYXkoZSkscj1uZXcgVWludDhBcnJheShBLkhFQVBVOC5idWZmZXIsdCxJKTtyZXR1cm4gZy5zZXQociksZ31mdW5jdGlvbiBkKEEsdCxJLGUpe2xldCBnPTA7cmV0dXJuIHQhPT1udWxsJiYoZz1BLmNjYWxsKCJpdGtfd2FzbV9pbnB1dF9hcnJheV9hbGxvYyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxJLGUsdC5idWZmZXIuYnl0ZUxlbmd0aF0pLEEuSEVBUFU4LnNldChuZXcgVWludDhBcnJheSh0LmJ1ZmZlciksZykpLGd9ZnVuY3Rpb24gTShBLHQsSSl7bGV0IGU9SlNPTi5zdHJpbmdpZnkodCksZz1BLmxlbmd0aEJ5dGVzVVRGOChlKSsxLHI9QS5jY2FsbCgiaXRrX3dhc21faW5wdXRfanNvbl9hbGxvYyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxJLGddKTtBLnN0cmluZ1RvVVRGOChlLHIsZyl9ZnVuY3Rpb24gcChBLHQsSSxlKXtsZXQgZz1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfYWRkcmVzcyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCx0LEldKSxyPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9zaXplIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLHQsSV0pLG89VnQoQSxnLHIpO3JldHVybiBHKGUsby5idWZmZXIpfWZ1bmN0aW9uIG1BKEEsdCl7bGV0IEk9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2pzb25fYWRkcmVzcyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiXSxbMCx0XSksZT1BLlVURjhUb1N0cmluZyhJKTtyZXR1cm4gSlNPTi5wYXJzZShlKX1mdW5jdGlvbiB5ZShBLHQsSSxlKXtlIT1udWxsJiZlLmxlbmd0aD4wJiZlLmZvckVhY2goZnVuY3Rpb24oUSxCKXtzd2l0Y2goUS50eXBlKXtjYXNlIEQuVGV4dFN0cmVhbTp7bGV0IGk9anQuZW5jb2RlKFEuZGF0YS5kYXRhKSxmPWQoQSxpLEIsMCkscz17c2l6ZTppLmJ1ZmZlci5ieXRlTGVuZ3RoLGRhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtmfWB9O00oQSxzLEIpO2JyZWFrfWNhc2UgRC5Kc29uQ29tcGF0aWJsZTp7bGV0IGk9anQuZW5jb2RlKEpTT04uc3RyaW5naWZ5KFEuZGF0YSkpLGY9ZChBLGksQiwwKSxzPXtzaXplOmkuYnVmZmVyLmJ5dGVMZW5ndGgsZGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2Z9YH07TShBLHMsQik7YnJlYWt9Y2FzZSBELkJpbmFyeVN0cmVhbTp7bGV0IGk9US5kYXRhLmRhdGEsZj1kKEEsaSxCLDApLHM9e3NpemU6aS5idWZmZXIuYnl0ZUxlbmd0aCxkYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Zn1gfTtNKEEscyxCKTticmVha31jYXNlIEQuVGV4dEZpbGU6e0EuZnNfd3JpdGVGaWxlKFEuZGF0YS5wYXRoLFEuZGF0YS5kYXRhKTticmVha31jYXNlIEQuQmluYXJ5RmlsZTp7QS5mc193cml0ZUZpbGUoUS5kYXRhLnBhdGgsUS5kYXRhLmRhdGEpO2JyZWFrfWNhc2UgRC5JbWFnZTp7bGV0IGk9US5kYXRhLGY9ZChBLGkuZGF0YSxCLDApLHM9ZChBLGkuZGlyZWN0aW9uLEIsMSksRT10eXBlb2YgaS5tZXRhZGF0YT8uZW50cmllczwidSI/QXJyYXkuZnJvbShpLm1ldGFkYXRhLmVudHJpZXMoKSk6W10sYz17aW1hZ2VUeXBlOmkuaW1hZ2VUeXBlLG5hbWU6aS5uYW1lLG9yaWdpbjppLm9yaWdpbixzcGFjaW5nOmkuc3BhY2luZyxkaXJlY3Rpb246YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtzfWAsc2l6ZTppLnNpemUsZGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2Z9YCxtZXRhZGF0YTpFfTtNKEEsYyxCKTticmVha31jYXNlIEQuTWVzaDp7bGV0IGk9US5kYXRhLGY9ZChBLGkucG9pbnRzLEIsMCkscz1kKEEsaS5jZWxscyxCLDEpLEU9ZChBLGkucG9pbnREYXRhLEIsMiksYz1kKEEsaS5jZWxsRGF0YSxCLDMpLHU9e21lc2hUeXBlOmkubWVzaFR5cGUsbmFtZTppLm5hbWUsbnVtYmVyT2ZQb2ludHM6aS5udW1iZXJPZlBvaW50cyxwb2ludHM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtmfWAsbnVtYmVyT2ZDZWxsczppLm51bWJlck9mQ2VsbHMsY2VsbHM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtzfWAsY2VsbEJ1ZmZlclNpemU6aS5jZWxsQnVmZmVyU2l6ZSxudW1iZXJPZlBvaW50UGl4ZWxzOmkubnVtYmVyT2ZQb2ludFBpeGVscyxwb2ludERhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtFfWAsbnVtYmVyT2ZDZWxsUGl4ZWxzOmkubnVtYmVyT2ZDZWxsUGl4ZWxzLGNlbGxEYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Y31gfTtNKEEsdSxCKTticmVha31jYXNlIEQuUG9pbnRTZXQ6e2xldCBpPVEuZGF0YSxmPWQoQSxpLnBvaW50cyxCLDApLHM9ZChBLGkucG9pbnREYXRhLEIsMSksRT17cG9pbnRTZXRUeXBlOmkucG9pbnRTZXRUeXBlLG5hbWU6aS5uYW1lLG51bWJlck9mUG9pbnRzOmkubnVtYmVyT2ZQb2ludHMscG9pbnRzOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Zn1gLG51bWJlck9mUG9pbnRQaXhlbHM6aS5udW1iZXJPZlBvaW50UGl4ZWxzLHBvaW50RGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke3N9YH07TShBLEUsQik7YnJlYWt9Y2FzZSBELlBvbHlEYXRhOntsZXQgaT1RLmRhdGEsZj1kKEEsaS5wb2ludHMsQiwwKSxzPWQoQSxpLnZlcnRpY2VzLEIsMSksRT1kKEEsaS5saW5lcyxCLDIpLGM9ZChBLGkucG9seWdvbnMsQiwzKSx1PWQoQSxpLnRyaWFuZ2xlU3RyaXBzLEIsNCkseT1kKEEsaS5wb2ludERhdGEsQiw1KSxSPWQoQSxpLnBvaW50RGF0YSxCLDYpLE49e3BvbHlEYXRhVHlwZTppLnBvbHlEYXRhVHlwZSxuYW1lOmkubmFtZSxudW1iZXJPZlBvaW50czppLm51bWJlck9mUG9pbnRzLHBvaW50czpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2Z9YCx2ZXJ0aWNlc0J1ZmZlclNpemU6aS52ZXJ0aWNlc0J1ZmZlclNpemUsdmVydGljZXM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtzfWAsbGluZXNCdWZmZXJTaXplOmkubGluZXNCdWZmZXJTaXplLGxpbmVzOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7RX1gLHBvbHlnb25zQnVmZmVyU2l6ZTppLnBvbHlnb25zQnVmZmVyU2l6ZSxwb2x5Z29uczpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2N9YCx0cmlhbmdsZVN0cmlwc0J1ZmZlclNpemU6aS50cmlhbmdsZVN0cmlwc0J1ZmZlclNpemUsdHJpYW5nbGVTdHJpcHM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHt1fWAsbnVtYmVyT2ZQb2ludFBpeGVsczppLm51bWJlck9mUG9pbnRQaXhlbHMscG9pbnREYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7eX1gLG51bWJlck9mQ2VsbFBpeGVsczppLm51bWJlck9mQ2VsbFBpeGVscyxjZWxsRGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke1J9YH07TShBLE4sQik7YnJlYWt9ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5zdXBwb3J0ZWQgaW5wdXQgSW50ZXJmYWNlVHlwZSIpfX0pLEEucmVzZXRNb2R1bGVTdGRvdXQoKSxBLnJlc2V0TW9kdWxlU3RkZXJyKCk7bGV0IGc9QS5zdGFja1NhdmUoKSxyPTA7dHJ5e3I9QS5jYWxsTWFpbih0LnNsaWNlKCkpfWNhdGNoKFEpe3Rocm93IHR5cGVvZiBRPT0ibnVtYmVyIiYmKGNvbnNvbGUubG9nKCJFeGNlcHRpb24gd2hpbGUgcnVubmluZyBwaXBlbGluZToiKSxjb25zb2xlLmxvZygic3Rkb3V0OiIsQS5nZXRNb2R1bGVTdGRvdXQoKSksY29uc29sZS5lcnJvcigic3RkZXJyOiIsQS5nZXRNb2R1bGVTdGRlcnIoKSksdHlwZW9mIEEuZ2V0RXhjZXB0aW9uTWVzc2FnZTwidSI/Y29uc29sZS5lcnJvcigiZXhjZXB0aW9uOiIsQS5nZXRFeGNlcHRpb25NZXNzYWdlKFEpKTpjb25zb2xlLmVycm9yKCJCdWlsZCBtb2R1bGUgaW4gRGVidWcgbW9kZSBmb3IgZXhjZXB0aW9uIG1lc3NhZ2UgaW5mb3JtYXRpb24uIikpLFF9ZmluYWxseXtBLnN0YWNrUmVzdG9yZShnKX1sZXQgbz1BLmdldE1vZHVsZVN0ZG91dCgpLG49QS5nZXRNb2R1bGVTdGRlcnIoKSxhPVtdO3JldHVybiBJIT1udWxsJiZJLmxlbmd0aD4wJiZyPT09MCYmSS5mb3JFYWNoKGZ1bmN0aW9uKFEsQil7bGV0IGk9bnVsbDtzd2l0Y2goUS50eXBlKXtjYXNlIEQuVGV4dFN0cmVhbTp7bGV0IHM9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X2FkZHJlc3MiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAsQiwwXSksRT1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfc2l6ZSIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxCLDBdKSxjPW5ldyBVaW50OEFycmF5KEEuSEVBUFU4LmJ1ZmZlcixzLEUpO2k9e2RhdGE6V3QuZGVjb2RlKGMpfTticmVha31jYXNlIEQuSnNvbkNvbXBhdGlibGU6e2xldCBzPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9hZGRyZXNzIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLEIsMF0pLEU9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X3NpemUiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAsQiwwXSksYz1uZXcgVWludDhBcnJheShBLkhFQVBVOC5idWZmZXIscyxFKTtpPUpTT04ucGFyc2UoV3QuZGVjb2RlKGMpKTticmVha31jYXNlIEQuQmluYXJ5U3RyZWFtOntsZXQgcz1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfYWRkcmVzcyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxCLDBdKSxFPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9zaXplIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLEIsMF0pO2k9e2RhdGE6VnQoQSxzLEUpfTticmVha31jYXNlIEQuVGV4dEZpbGU6e2k9e3BhdGg6US5kYXRhLnBhdGgsZGF0YTpBLmZzX3JlYWRGaWxlKFEuZGF0YS5wYXRoLHtlbmNvZGluZzoidXRmOCJ9KX07YnJlYWt9Y2FzZSBELkJpbmFyeUZpbGU6e2k9e3BhdGg6US5kYXRhLnBhdGgsZGF0YTpkZShBLFEuZGF0YS5wYXRoKX07YnJlYWt9Y2FzZSBELkltYWdlOntsZXQgcz1tQShBLEIpO3MuZGF0YT1wKEEsQiwwLHMuaW1hZ2VUeXBlLmNvbXBvbmVudFR5cGUpLHMuZGlyZWN0aW9uPXAoQSxCLDEsai5GbG9hdDY0KSxzLm1ldGFkYXRhPW5ldyBNYXAocy5tZXRhZGF0YSksaT1zO2JyZWFrfWNhc2UgRC5NZXNoOntsZXQgcz1tQShBLEIpO3MubnVtYmVyT2ZQb2ludHM+MD9zLnBvaW50cz1wKEEsQiwwLHMubWVzaFR5cGUucG9pbnRDb21wb25lbnRUeXBlKTpzLnBvaW50cz1HKHMubWVzaFR5cGUucG9pbnRDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSkscy5udW1iZXJPZkNlbGxzPjA/cy5jZWxscz1wKEEsQiwxLHMubWVzaFR5cGUuY2VsbENvbXBvbmVudFR5cGUpOnMuY2VsbHM9RyhzLm1lc2hUeXBlLmNlbGxDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSkscy5udW1iZXJPZlBvaW50UGl4ZWxzPjA/cy5wb2ludERhdGE9cChBLEIsMixzLm1lc2hUeXBlLnBvaW50UGl4ZWxDb21wb25lbnRUeXBlKTpzLnBvaW50RGF0YT1HKHMubWVzaFR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxzLm51bWJlck9mQ2VsbFBpeGVscz4wP3MuY2VsbERhdGE9cChBLEIsMyxzLm1lc2hUeXBlLmNlbGxQaXhlbENvbXBvbmVudFR5cGUpOnMuY2VsbERhdGE9RyhzLm1lc2hUeXBlLmNlbGxQaXhlbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxpPXM7YnJlYWt9Y2FzZSBELlBvaW50U2V0OntsZXQgcz1tQShBLEIpO3MubnVtYmVyT2ZQb2ludHM+MD9zLnBvaW50cz1wKEEsQiwwLHMucG9pbnRTZXRUeXBlLnBvaW50Q29tcG9uZW50VHlwZSk6cy5wb2ludHM9RyhzLnBvaW50U2V0VHlwZS5wb2ludENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxzLm51bWJlck9mUG9pbnRQaXhlbHM+MD9zLnBvaW50RGF0YT1wKEEsQiwxLHMucG9pbnRTZXRUeXBlLnBvaW50UGl4ZWxDb21wb25lbnRUeXBlKTpzLnBvaW50RGF0YT1HKHMucG9pbnRTZXRUeXBlLnBvaW50UGl4ZWxDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSksaT1zO2JyZWFrfWNhc2UgRC5Qb2x5RGF0YTp7bGV0IHM9bUEoQSxCKTtzLm51bWJlck9mUG9pbnRzPjA/cy5wb2ludHM9cChBLEIsMCxqLkZsb2F0MzIpOnMucG9pbnRzPW5ldyBGbG9hdDMyQXJyYXkscy52ZXJ0aWNlc0J1ZmZlclNpemU+MD9zLnZlcnRpY2VzPXAoQSxCLDEsUy5VSW50MzIpOnMudmVydGljZXM9bmV3IFVpbnQzMkFycmF5LHMubGluZXNCdWZmZXJTaXplPjA/cy5saW5lcz1wKEEsQiwyLFMuVUludDMyKTpzLmxpbmVzPW5ldyBVaW50MzJBcnJheSxzLnBvbHlnb25zQnVmZmVyU2l6ZT4wP3MucG9seWdvbnM9cChBLEIsMyxTLlVJbnQzMik6cy5wb2x5Z29ucz1uZXcgVWludDMyQXJyYXkscy50cmlhbmdsZVN0cmlwc0J1ZmZlclNpemU+MD9zLnRyaWFuZ2xlU3RyaXBzPXAoQSxCLDQsUy5VSW50MzIpOnMudHJpYW5nbGVTdHJpcHM9bmV3IFVpbnQzMkFycmF5LHMubnVtYmVyT2ZQb2ludFBpeGVscz4wP3MucG9pbnREYXRhPXAoQSxCLDUscy5wb2x5RGF0YVR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUpOnMucG9pbnREYXRhPUcocy5wb2x5RGF0YVR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxzLm51bWJlck9mQ2VsbFBpeGVscz4wP3MuY2VsbERhdGE9cChBLEIsNixzLnBvbHlEYXRhVHlwZS5jZWxsUGl4ZWxDb21wb25lbnRUeXBlKTpzLmNlbGxEYXRhPUcocy5wb2x5RGF0YVR5cGUuY2VsbFBpeGVsQ29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLGk9czticmVha31kZWZhdWx0OnRocm93IEVycm9yKCJVbnN1cHBvcnRlZCBvdXRwdXQgSW50ZXJmYWNlVHlwZSIpfWxldCBmPXt0eXBlOlEudHlwZSxkYXRhOml9O2EucHVzaChmKX0pLHtyZXR1cm5WYWx1ZTpyLHN0ZG91dDpvLHN0ZGVycjpuLG91dHB1dHM6YX19dmFyIFh0PXllO3ZhciB3ZT10eXBlb2YgZ2xvYmFsVGhpcy5TaGFyZWRBcnJheUJ1ZmZlcjwidSI7ZnVuY3Rpb24gbWUoQSx0KXtpZihBPT1udWxsKXJldHVybltdO2xldCBJPVtdO2ZvcihsZXQgZT0wO2U8QS5sZW5ndGg7ZSsrKXtsZXQgZz1wZShBW2VdLHQpO2chPT1udWxsJiZJLnB1c2goZyl9cmV0dXJuIEl9ZnVuY3Rpb24gcGUoQSx0KXtpZihBPT1udWxsKXJldHVybiBudWxsO2xldCBJPW51bGw7cmV0dXJuIEEuYnVmZmVyIT09dm9pZCAwP0k9QS5idWZmZXI6QS5ieXRlTGVuZ3RoIT09dm9pZCAwJiYoST1BKSx3ZSYmSSBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyP251bGw6dD9JOkkuc2xpY2UoMCl9dmFyIHp0PW1lO2Z1bmN0aW9uIFNlKEEpe3JldHVybltBLmRhdGEsQS5kaXJlY3Rpb25dfXZhciBfdD1TZTtmdW5jdGlvbiBGZShBKXtyZXR1cm5bQS5wb2ludHMsQS5wb2ludERhdGEsQS5jZWxscyxBLmNlbGxEYXRhXX12YXIgdnQ9RmU7ZnVuY3Rpb24gUmUoQSl7cmV0dXJuW0EucG9pbnRzLEEudmVydGljZXMsQS5saW5lcyxBLnBvbHlnb25zLEEudHJpYW5nbGVTdHJpcHMsQS5wb2ludERhdGEsQS5jZWxsRGF0YV19dmFyICR0PVJlO2FzeW5jIGZ1bmN0aW9uIE5lKEEsdCxJLGUpe2xldCBnPVh0KEEsdCxJLGUpLHI9W107cmV0dXJuIGcub3V0cHV0cy5mb3JFYWNoKGZ1bmN0aW9uKG8pe2lmKG8udHlwZT09PUQuQmluYXJ5U3RyZWFtfHxvLnR5cGU9PT1ELkJpbmFyeUZpbGUpe2xldCBuPW8uZGF0YTtyLnB1c2gobil9ZWxzZSBpZihvLnR5cGU9PT1ELkltYWdlKXtsZXQgbj1vLmRhdGE7ci5wdXNoKC4uLl90KG4pKX1lbHNlIGlmKG8udHlwZT09PUQuTWVzaCl7bGV0IG49by5kYXRhO3IucHVzaCguLi52dChuKSl9ZWxzZSBpZihvLnR5cGU9PT1ELlBvbHlEYXRhKXtsZXQgbj1vLmRhdGE7ci5wdXNoKC4uLiR0KG4pKX19KSxGQShnLHp0KHIsITApKX12YXIgQUk9TmU7dmFyIFVlPXtydW5QaXBlbGluZTphc3luYyBmdW5jdGlvbihBLHQsSSxlLGcscil7bGV0IG89YXdhaXQgeHQoQSx0LHIpO3JldHVybiBhd2FpdCBBSShvLEksZSxnKX19O2lBKFVlKTslMEEvKiEgQnVuZGxlZCBsaWNlbnNlIGluZm9ybWF0aW9uOiUwQSUwQWNvbWxpbmsvZGlzdC9lc20vY29tbGluay5tanM6JTBBICAoKiolMEEgICAqIEBsaWNlbnNlJTBBICAgKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDJTBBICAgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCUwQSAgICopJTBBKi8lMEEnO2J0KFJ0KTtleHBvcnR7eiBhcyBjb21wcmVzc1N0cmluZ2lmeSxVQSBhcyBnZXREZWZhdWx0V2ViV29ya2VyLGogYXMgZ2V0UGlwZWxpbmVXb3JrZXJVcmwsRkEgYXMgZ2V0UGlwZWxpbmVzQmFzZVVybCx1byBhcyBpbWFnZVRvSnNvbixmbyBhcyBqc29uVG9JbWFnZSxtbyBhcyBqc29uVG9NZXNoLGhvIGFzIGpzb25Ub1BvbHlEYXRhLHBvIGFzIG1lc2hUb0pzb24sViBhcyBwYXJzZVN0cmluZ0RlY29tcHJlc3MseW8gYXMgcG9seURhdGFUb0pzb24sWGEgYXMgc2V0RGVmYXVsdFdlYldvcmtlcixidCBhcyBzZXRQaXBlbGluZVdvcmtlclVybCxXYSBhcyBzZXRQaXBlbGluZXNCYXNlVXJsLE5BIGFzIHZlcnNpb259OwovKiEgQnVuZGxlZCBsaWNlbnNlIGluZm9ybWF0aW9uOgoKY29tbGluay9kaXN0L2VzbS9jb21saW5rLm1qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMKICAgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAogICAqKQoqLwo=""" default_config = JsPackageConfig(default_js_module) js_package = JsPackage(default_config) diff --git a/packages/dicom/package.json b/packages/dicom/package.json index ffe86ecca..3ebcb152e 100644 --- a/packages/dicom/package.json +++ b/packages/dicom/package.json @@ -31,9 +31,9 @@ "test": "pnpm test:data:download && pnpm build:gen:python && pnpm test:python", "test:data:download": "dam download test/data test/data.tar.gz bafybeiaqmwshl3vrcp5soxvmsez4nfhugcv7p432k6ndmb3jecspnvvv6u https://data.kitware.com/api/v1/file/6706def5fb903c47575aa6cc/download", "test:data:pack": "dam pack test/data test/data.tar.gz", - "test:python:wasi": "pnpm test:data:download && pixi run test-wasi", - "test:python:emscripten": "pnpm test:data:download && pixi run test-emscripten", - "test:python:dispatch": "pnpm test:data:download && pixi run test-dispatch", + "test:python:wasi": "pnpm test:data:download && pixi run --manifest-path=./pixi.toml test-wasi", + "test:python:emscripten": "pnpm test:data:download && pixi run --manifest-path=./pixi.toml test-emscripten", + "test:python:dispatch": "pnpm test:data:download && pixi run --manifest-path=./pixi.toml test-dispatch", "test:python": "itk-wasm pnpm-script test:python", "test:wasi": "itk-wasm pnpm-script test:wasi" }, diff --git a/packages/dicom/pixi.toml b/packages/dicom/pixi.toml index 2ca77ea97..0eed442b6 100644 --- a/packages/dicom/pixi.toml +++ b/packages/dicom/pixi.toml @@ -6,8 +6,6 @@ name = "dicom" platforms = ["win-64", "linux-64", "linux-aarch64", "osx-arm64"] version = "0.1.0" -[tasks] - [dependencies] python = "3.12.*" pnpm = ">=9.12.1,<10" @@ -20,6 +18,14 @@ m2w64-jq = ">=1.6.0,<2" [target.unix.dependencies] jq = ">=1.7.1,<2" +[tasks.build] +cmd = "pnpm run build" +description = "Build the project" + +[tasks.test] +cmd = "pnpm run test" +description = "Run tests" + [tasks.version-sync-typescript] cmd = '''version=$(cat package.json | jq .version) && jq ".version = $version" typescript/package.json > typescript/package.json.tmp && diff --git a/packages/downsample/package.json b/packages/downsample/package.json index c665bd5d5..ce618acde 100644 --- a/packages/downsample/package.json +++ b/packages/downsample/package.json @@ -31,9 +31,9 @@ "test": "pnpm test:data:download && pnpm build:gen:python && pnpm test:python", "test:data:download": "dam download test/data test/data.tar.gz bafkreic7utwwa32sc7ekhouzdlnla4kffytphcwc7qwam5ndhixwjulydq https://github.com/InsightSoftwareConsortium/ITK-Wasm/releases/download/itk-wasm-v1.0.0-b.163/itkwasm-downsample-test-data.tar.gz https://w3s.link/ipfs/bafybeifwebok64osjl2i3zc6rkn3izgon333wsjotqzqlxorkkvrbldjcy/data.tar.gz", "test:data:pack": "dam pack test/data test/data.tar.gz", - "test:python:wasi": "pnpm test:data:download && pixi run test-wasi", - "test:python:emscripten": "pnpm test:data:download && pixi run test-emscripten", - "test:python:dispatch": "pnpm test:data:download && pixi run test-dispatch", + "test:python:wasi": "pnpm test:data:download && pixi run --manifest-path=./pixi.toml test-wasi", + "test:python:emscripten": "pnpm test:data:download && pixi run --manifest-path=./pixi.toml test-emscripten", + "test:python:dispatch": "pnpm test:data:download && pixi run --manifest-path=./pixi.toml test-dispatch", "test:python": "itk-wasm pnpm-script test:python", "test:wasi": "itk-wasm pnpm-script test:wasi -- -V" }, diff --git a/packages/downsample/pixi.toml b/packages/downsample/pixi.toml index 58c9c1e5a..f2411d30c 100644 --- a/packages/downsample/pixi.toml +++ b/packages/downsample/pixi.toml @@ -6,8 +6,6 @@ name = "downsample" platforms = ["win-64", "linux-64", "linux-aarch64", "osx-arm64"] version = "0.1.0" -[tasks] - [dependencies] python = "3.12.*" pnpm = ">=9.12.1,<10" @@ -17,6 +15,14 @@ pip = ">=24.2,<25" [target.win-64.dependencies] m2w64-jq = ">=1.6.0,<2" +[tasks.build] +cmd = "pnpm run build" +description = "Build the project" + +[tasks.test] +cmd = "pnpm run test" +description = "Run tests" + [target.unix.dependencies] jq = ">=1.7.1,<2" diff --git a/packages/image-io/package.json b/packages/image-io/package.json index b4cc94e61..7ceac5d75 100644 --- a/packages/image-io/package.json +++ b/packages/image-io/package.json @@ -26,9 +26,9 @@ "test": "pnpm test:data:download && pnpm build:gen:python && pnpm test:python", "test:data:download": "dam download test/data test/data.tar.gz bafybeibyjhkcrinl2lotw5g2vngjs23aaenv3tjzxssm35jxaci5ylsqia https://github.com/InsightSoftwareConsortium/ITK-Wasm/releases/download/itk-wasm-v1.0.0-b.155/image-io-test-data.tar.gz https://w3s.link/ipfs/bafybeiewe4rankwwe7nw7qm2g3qclflhci2e53wthn3gukdlhbff64pua4/data.tar.gz", "test:data:pack": "dam pack test/data test/data.tar.gz", - "test:python:wasi": "pnpm test:data:download && pixi run test-wasi", - "test:python:emscripten": "pnpm test:data:download && pixi run test-emscripten", - "test:python:dispatch": "pnpm test:data:download && pixi run test-dispatch", + "test:python:wasi": "pnpm test:data:download && pixi run --manifest-path=./pixi.toml test-wasi", + "test:python:emscripten": "pnpm test:data:download && pixi run --manifest-path=./pixi.toml test-emscripten", + "test:python:dispatch": "pnpm test:data:download && pixi run --manifest-path=./pixi.toml test-dispatch", "test:python": "itk-wasm pnpm-script test:python", "test:wasi": "itk-wasm pnpm-script test:wasi" }, diff --git a/packages/image-io/pixi.toml b/packages/image-io/pixi.toml index a6381f416..e40eed57c 100644 --- a/packages/image-io/pixi.toml +++ b/packages/image-io/pixi.toml @@ -6,8 +6,6 @@ name = "image-io" platforms = ["win-64", "linux-64", "linux-aarch64", "osx-arm64"] version = "0.1.0" -[tasks] - [dependencies] python = "3.12.*" pnpm = ">=9.12.1,<10" @@ -20,6 +18,14 @@ m2w64-jq = ">=1.6.0,<2" [target.unix.dependencies] jq = ">=1.7.1,<2" +[tasks.build] +cmd = "pnpm run build" +description = "Build the project" + +[tasks.test] +cmd = "pnpm run test" +description = "Run tests" + [tasks.version-sync-typescript] cmd = '''version=$(cat package.json | jq .version) && jq ".version = $version" typescript/package.json > typescript/package.json.tmp && diff --git a/packages/mesh-io/package.json b/packages/mesh-io/package.json index 877104118..280bc974c 100644 --- a/packages/mesh-io/package.json +++ b/packages/mesh-io/package.json @@ -30,9 +30,9 @@ "test": "pnpm test:data:download && pnpm build:gen:python && pnpm test:python", "test:data:download": "dam download test/data test/data.tar.gz bafkreiahocrgb3p4xrjozr7cg5wdpdt6wp77kolnqyupae6awkplb5p4he https://bafybeian677gvnngces3pbcv6zpzauf3yn5bedxdis4smwzwh5xeewazuq.ipfs.w3s.link/ipfs/bafybeian677gvnngces3pbcv6zpzauf3yn5bedxdis4smwzwh5xeewazuq/data.tar.gz", "test:data:pack": "dam pack test/data test/data.tar.gz", - "test:python:wasi": "pnpm test:data:download && pixi run test-wasi", - "test:python:emscripten": "pnpm test:data:download && pixi run test-emscripten", - "test:python:dispatch": "pnpm test:data:download && pixi run test-dispatch", + "test:python:wasi": "pnpm test:data:download && pixi run --manifest-path=./pixi.toml test-wasi", + "test:python:emscripten": "pnpm test:data:download && pixi run --manifest-path=./pixi.toml test-emscripten", + "test:python:dispatch": "pnpm test:data:download && pixi run --manifest-path=./pixi.toml test-dispatch", "test:python": "itk-wasm pnpm-script test:python", "test:wasi": "itk-wasm pnpm-script test:wasi" }, diff --git a/packages/mesh-io/pixi.toml b/packages/mesh-io/pixi.toml index f10a3f091..21d11abaa 100644 --- a/packages/mesh-io/pixi.toml +++ b/packages/mesh-io/pixi.toml @@ -6,14 +6,20 @@ name = "mesh-io" platforms = ["win-64", "linux-64", "linux-aarch64", "osx-arm64"] version = "0.1.0" -[tasks] - [dependencies] python = "3.12.*" pnpm = ">=9.12.1,<10" hatch = ">=1.13.0,<2" pip = ">=24.2,<25" +[tasks.build] +cmd = "pnpm run build" +description = "Build the project" + +[tasks.test] +cmd = "pnpm run test" +description = "Run tests" + [target.win-64.dependencies] m2w64-jq = ">=1.6.0,<2" diff --git a/packages/transform-io/.gitignore b/packages/transform-io/.gitignore index f0bb03c7f..201ef91f3 100644 --- a/packages/transform-io/.gitignore +++ b/packages/transform-io/.gitignore @@ -1,6 +1,6 @@ test/ emscripten-build/ -python/ wasi-build/ typescript/dist +typescript/src/version.ts pyodide/ diff --git a/packages/transform-io/package.json b/packages/transform-io/package.json index 79731c44c..d80c94ca1 100644 --- a/packages/transform-io/package.json +++ b/packages/transform-io/package.json @@ -5,6 +5,10 @@ "description": "scripts to generate @itk-wasm/transform-io itk-wasm artifacts.", "type": "module", "itk-wasm": { + "test-data-hash": "bafkreiahocrgb3p4xrjozr7cg5wdpdt6wp77kolnqyupae6awkplb5p4he", + "test-data-urls": [ + "https://bafybeian677gvnngces3pbcv6zpzauf3yn5bedxdis4smwzwh5xeewazuq.ipfs.w3s.link/ipfs/bafybeian677gvnngces3pbcv6zpzauf3yn5bedxdis4smwzwh5xeewazuq/data.tar.gz" + ], "emscripten-docker-image": "itkwasm/emscripten:latest", "wasi-docker-image": "itkwasm/wasi:latest", "typescript-package-name": "@itk-wasm/transform-io", @@ -23,13 +27,12 @@ "bindgen:python": "itk-wasm pnpm-script bindgen:python", "build:gen:typescript": "itk-wasm pnpm-script build:gen:typescript", "build:gen:python": "pnpm build:wasi && pnpm bindgen:python", - "publish:python": "itk-wasm pnpm-script publish:python", "test": "pnpm test:data:download && pnpm build:gen:python && pnpm test:python", "test:data:download": "dam download test/data test/data.tar.gz bafkreihranpzszz3q5bwgzsw6olqwh2e726wfnh4qblkjbng44yhqbfin4 https://bafybeihn3n52vhja45ds3d4wsch3i77rej2oylorjgevt55w3aqirgxzme.ipfs.w3s.link/ipfs/bafybeihn3n52vhja45ds3d4wsch3i77rej2oylorjgevt55w3aqirgxzme/data.tar.gz", "test:data:pack": "dam pack test/data test/data.tar.gz", - "test:python:wasi": "pnpm test:data:download && pixi run test-wasi", - "test:python:emscripten": "pnpm test:data:download && pixi run test-emscripten", - "test:python:dispatch": "pnpm test:data:download && pixi run test-dispatch", + "test:python:wasi": "pnpm test:data:download && pixi run --manifest-path=./pixi.toml test-wasi", + "test:python:emscripten": "pnpm test:data:download && pixi run --manifest-path=./pixi.toml test-emscripten", + "test:python:dispatch": "pnpm test:data:download && pixi run --manifest-path=./pixi.toml test-dispatch", "test:python": "itk-wasm pnpm-script test:python", "test:wasi": "itk-wasm pnpm-script test:wasi" }, diff --git a/packages/transform-io/pixi.lock b/packages/transform-io/pixi.lock index e9138399d..1b9d018fb 100644 --- a/packages/transform-io/pixi.lock +++ b/packages/transform-io/pixi.lock @@ -40,7 +40,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.8.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/jq-1.7.1-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.4.1-pyha804496_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.5.0-pyha804496_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.3-h5888daf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 @@ -50,7 +50,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda @@ -68,7 +68,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pnpm-9.12.2-h6417eb3_0.conda @@ -91,8 +91,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/userpath-1.7.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.4.26-h0f3a69f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.4.28-h0f3a69f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda @@ -134,7 +134,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.8.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/jq-1.7.1-h31becfc_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.4.1-pyha804496_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.5.0-pyha804496_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.3-h5ad3122_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.2-h3557bc0_5.tar.bz2 @@ -144,7 +144,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.17-h31becfc_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.47.0-hc4a20ef_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.47.0-hc4a20ef_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda @@ -162,7 +162,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.44-h070dd5b_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pnpm-9.12.2-hbf5023e_0.conda @@ -185,8 +185,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/userpath-1.7.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.4.26-h2016286_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.4.28-h2016286_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xz-5.2.6-h9cdd2b7_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda @@ -223,11 +223,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-5.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jq-1.7.1-h93a5062_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.4.1-pyh534df25_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.5.0-pyh534df25_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.2-ha82da77_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.3-hf9b8971_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.49.2-h7ab814d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda @@ -240,7 +240,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pnpm-9.12.2-hef028c3_0.conda @@ -262,8 +262,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/userpath-1.7.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/uv-0.4.26-h41fe3af_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/uv-0.4.28-h41fe3af_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda @@ -299,10 +299,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-5.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.4.1-pyh7428d3b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.5.0-pyh7428d3b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.3-he0c23c2_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.47.0-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.47.0-h2466b09_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libgfortran-5.3.0-6.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-5.3.0-7.tar.bz2 @@ -320,7 +320,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pnpm-9.12.2-haa868a1_0.conda @@ -343,10 +343,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/userpath-1.7.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/uv-0.4.26-ha08ef0e_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/uv-0.4.28-ha08ef0e_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-ha32ba9b_22.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.40.33810-hcc2c482_22.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.40.33810-h3bf8584_22.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 @@ -398,7 +398,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.8.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/jq-1.7.1-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.4.1-pyha804496_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.5.0-pyha804496_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 @@ -413,7 +413,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-he137b08_1.conda @@ -436,7 +436,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.0.0-py312h7b63e92_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pnpm-9.12.2-h6417eb3_0.conda @@ -461,8 +461,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/userpath-1.7.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.4.26-h0f3a69f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.4.28-h0f3a69f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda @@ -473,7 +473,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda - pypi: https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/66/033e58a50fd9ec9df00a8671c74f1f3a320564c6415a4ed82a1c651654ba/greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/4c/0b/682adf8c2455d68a3c08f14b20511b5513e810100b4f58dc50bd9bf85428/hypothesis-6.115.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/0e/3f934459c4aab461281ad24b01de08bd612118fbc70ecc7b0fa5ed156a94/hypothesis-6.115.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/14/577a2a26c81ab6e2db821d7a5da3c6ff8dbf27ab3d8ebe74a3d4f203ab38/itk-5.4.0-cp311-abi3-manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/f3/8a/6388ca285140894109b17f8ae912ce7d13f69c8216af0b5c0e45adca6676/itk_core-5.4.0-cp311-abi3-manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/bb/23/06d0a850a7e525ede537e3e37fd8efd7f5858e261d6170d6f0697cb663dd/itk_filtering-5.4.0-cp311-abi3-manylinux_2_28_x86_64.whl @@ -539,7 +539,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.8.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/jq-1.7.1-h31becfc_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.4.1-pyha804496_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.5.0-pyha804496_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.16-h922389a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-h4de3ea5_0.tar.bz2 @@ -554,7 +554,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.0.0-h31becfc_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.44-hc4a20ef_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.47.0-hc4a20ef_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.47.0-hc4a20ef_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.0-hec21d91_1.conda @@ -577,7 +577,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.44-h070dd5b_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-11.0.0-py312h5ab5af3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pnpm-9.12.2-hbf5023e_0.conda @@ -602,8 +602,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/userpath-1.7.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.4.26-h2016286_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.4.28-h2016286_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.11-h86ecc28_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-h57736b2_0.conda @@ -614,7 +614,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda - pypi: https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/66/d4/c8c04958870f482459ab5956c2942c4ec35cac7fe245527f1039837c17a9/greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/4c/0b/682adf8c2455d68a3c08f14b20511b5513e810100b4f58dc50bd9bf85428/hypothesis-6.115.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/0e/3f934459c4aab461281ad24b01de08bd612118fbc70ecc7b0fa5ed156a94/hypothesis-6.115.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/a0/732ddb5575a5be47d1088def8b1db91c799263a8d583181341271a4f6e6d/itk-5.4.0-cp311-abi3-manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/6e/5c/eeaa8d362f97ecbb832d6e88cab4d3c13afd602a01befb4d38712afacf4f/itk_core-5.4.0-cp311-abi3-manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/8d/f0/0fb8ad41cddcd0580689450d304757211a19f8e3426ae42d30577d10ac19/itk_filtering-5.4.0-cp311-abi3-manylinux_2_28_aarch64.whl @@ -675,7 +675,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-5.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jq-1.7.1-h93a5062_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.4.1-pyh534df25_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.5.0-pyh534df25_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.16-ha0e7c42_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.2-ha82da77_0.conda @@ -684,7 +684,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.44-hc14010f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-hfce79cd_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.49.2-h7ab814d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.4.0-h93a5062_0.conda @@ -702,7 +702,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.0.0-py312haf37ca6_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pnpm-9.12.2-hef028c3_0.conda @@ -726,8 +726,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/userpath-1.7.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/uv-0.4.26-h41fe3af_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/uv-0.4.28-h41fe3af_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.11-hd74edd7_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda @@ -738,7 +738,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda - pypi: https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7d/ec/bad1ac26764d26aa1353216fcbfa4670050f66d445448aafa227f8b16e80/greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl - - pypi: https://files.pythonhosted.org/packages/4c/0b/682adf8c2455d68a3c08f14b20511b5513e810100b4f58dc50bd9bf85428/hypothesis-6.115.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/0e/3f934459c4aab461281ad24b01de08bd612118fbc70ecc7b0fa5ed156a94/hypothesis-6.115.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0b/dc/c0c76414440ea1520b496801b9ee82f7cfbe5c4c1643e1e82c383897b3ae/itk-5.4.0-cp311-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/60/be/5e7d2f70bb03a8ef78ca076c22d0e3c633b330be1ca310a6dcebfefaaea3/itk_core-5.4.0-cp311-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/cb/49/098970cb18aa7f84c6d41ece00c8dd2072d3a890973ae4e2a069fe9d8cc2/itk_filtering-5.4.0-cp311-abi3-macosx_11_0_arm64.whl @@ -797,7 +797,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-5.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.4.1-pyh7428d3b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.5.0-pyh7428d3b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.16-h67d730c_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h63175ca_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.22-h2466b09_0.conda @@ -805,7 +805,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.0.0-hcfcfb64_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.44-h3ca93ac_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.47.0-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.47.0-h2466b09_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.0-hfc51747_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.4.0-hcfcfb64_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.16-h013a479_1.conda @@ -828,7 +828,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pillow-10.4.0-py312h381445a_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pnpm-9.12.2-haa868a1_0.conda @@ -853,10 +853,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/userpath-1.7.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/uv-0.4.26-ha08ef0e_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/uv-0.4.28-ha08ef0e_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-ha32ba9b_22.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.40.33810-hcc2c482_22.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.40.33810-h3bf8584_22.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.11-hcd874cb_0.conda @@ -867,7 +867,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.6-h0ea2cb4_0.conda - pypi: https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/21/a5d9df1d21514883333fc86584c07c2b49ba7c602e670b174bd73cfc9c7f/greenlet-3.1.1-cp312-cp312-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/4c/0b/682adf8c2455d68a3c08f14b20511b5513e810100b4f58dc50bd9bf85428/hypothesis-6.115.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/0e/3f934459c4aab461281ad24b01de08bd612118fbc70ecc7b0fa5ed156a94/hypothesis-6.115.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/05/b876851fc885a3e3cb85f4167bcbc35020da23b98d50da3947041fc82224/itk-5.4.0-cp311-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fd/35/1fbc801f430858f1054c6b64e5d8316b9a319c2eaca2b6723c98ee7a0358/itk_core-5.4.0-cp311-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/16/33/4d3617f48f853878750dc249d84bbfe4509469e82df58908a8612d469b2c/itk_filtering-5.4.0-cp311-abi3-win_amd64.whl @@ -2489,9 +2489,9 @@ packages: timestamp: 1610092261086 - kind: pypi name: hypothesis - version: 6.115.5 - url: https://files.pythonhosted.org/packages/4c/0b/682adf8c2455d68a3c08f14b20511b5513e810100b4f58dc50bd9bf85428/hypothesis-6.115.5-py3-none-any.whl - sha256: b7733459ae9a93020fac3b91b41473c9b85e975139a152a70d88f3a5caa3fa3f + version: 6.115.6 + url: https://files.pythonhosted.org/packages/13/0e/3f934459c4aab461281ad24b01de08bd612118fbc70ecc7b0fa5ed156a94/hypothesis-6.115.6-py3-none-any.whl + sha256: d7b7173934753b9624680b38a85749de4fce367c44acb36c08b62765cc0a7a19 requires_dist: - attrs>=22.2.0 - sortedcontainers<3.0.0,>=2.1.0 @@ -3313,13 +3313,13 @@ packages: timestamp: 1702500793203 - kind: conda name: keyring - version: 25.4.1 + version: 25.5.0 build: pyh534df25_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/keyring-25.4.1-pyh534df25_0.conda - sha256: 8d8fc7d67e9bd387403720447abb1b5539a6f6ca8e3aba8406e0987213bfa0ce - md5: 2099f34ea2f3534f7adc5c21cc199e1b + url: https://conda.anaconda.org/conda-forge/noarch/keyring-25.5.0-pyh534df25_0.conda + sha256: d4a5b92e82dfd1b60ea882618ecf9333ab0c2d6a16a36edbbe0d3102cc157081 + md5: a0ed4210b80d1c9b4737774c22e222a6 depends: - __osx - importlib-metadata >=4.11.4 @@ -3330,17 +3330,17 @@ packages: - python >=3.8 license: MIT license_family: MIT - size: 37045 - timestamp: 1726971145252 + size: 37437 + timestamp: 1730056689995 - kind: conda name: keyring - version: 25.4.1 + version: 25.5.0 build: pyh534df25_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/keyring-25.4.1-pyh534df25_0.conda - sha256: 8d8fc7d67e9bd387403720447abb1b5539a6f6ca8e3aba8406e0987213bfa0ce - md5: 2099f34ea2f3534f7adc5c21cc199e1b + url: https://conda.anaconda.org/conda-forge/noarch/keyring-25.5.0-pyh534df25_0.conda + sha256: d4a5b92e82dfd1b60ea882618ecf9333ab0c2d6a16a36edbbe0d3102cc157081 + md5: a0ed4210b80d1c9b4737774c22e222a6 depends: - __osx - importlib-metadata >=4.11.4 @@ -3353,17 +3353,17 @@ packages: license_family: MIT purls: - pkg:pypi/keyring?source=hash-mapping - size: 37045 - timestamp: 1726971145252 + size: 37437 + timestamp: 1730056689995 - kind: conda name: keyring - version: 25.4.1 + version: 25.5.0 build: pyh7428d3b_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/keyring-25.4.1-pyh7428d3b_0.conda - sha256: 69626899dfac975090032f7af782c143b569f7706e808a4eca67a9a5aa134a15 - md5: 1c74a03431815d5e091585bb04e86f12 + url: https://conda.anaconda.org/conda-forge/noarch/keyring-25.5.0-pyh7428d3b_0.conda + sha256: 9199708fb578b7150bfd7c37fbb6b876f0432e2514a623148be29b96b8705afe + md5: 872fd60cb5aef19f8c83dfc6753e0385 depends: - __win - importlib-metadata >=4.11.4 @@ -3375,17 +3375,17 @@ packages: - pywin32-ctypes >=0.2.0 license: MIT license_family: MIT - size: 37407 - timestamp: 1726971355676 + size: 37357 + timestamp: 1730056956899 - kind: conda name: keyring - version: 25.4.1 + version: 25.5.0 build: pyh7428d3b_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/keyring-25.4.1-pyh7428d3b_0.conda - sha256: 69626899dfac975090032f7af782c143b569f7706e808a4eca67a9a5aa134a15 - md5: 1c74a03431815d5e091585bb04e86f12 + url: https://conda.anaconda.org/conda-forge/noarch/keyring-25.5.0-pyh7428d3b_0.conda + sha256: 9199708fb578b7150bfd7c37fbb6b876f0432e2514a623148be29b96b8705afe + md5: 872fd60cb5aef19f8c83dfc6753e0385 depends: - __win - importlib-metadata >=4.11.4 @@ -3399,17 +3399,17 @@ packages: license_family: MIT purls: - pkg:pypi/keyring?source=hash-mapping - size: 37407 - timestamp: 1726971355676 + size: 37357 + timestamp: 1730056956899 - kind: conda name: keyring - version: 25.4.1 + version: 25.5.0 build: pyha804496_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/keyring-25.4.1-pyha804496_0.conda - sha256: 6deeb4fa0f01447a5e8bd7261044c45d139e27d36df769e5a3a16ce55607da14 - md5: ef6f2de3c8eef0ee9fd31f2267c27bf2 + url: https://conda.anaconda.org/conda-forge/noarch/keyring-25.5.0-pyha804496_0.conda + sha256: f9a0b7838db9366fba0b9917fe8d0654377ebf8959e904f963e12ff76a5cc9ba + md5: a36af57a05ceaed6827adc5e4ba81267 depends: - __linux - importlib-metadata >=4.11.4 @@ -3422,17 +3422,17 @@ packages: - secretstorage >=3.2 license: MIT license_family: MIT - size: 36717 - timestamp: 1726971094601 + size: 37056 + timestamp: 1730056658373 - kind: conda name: keyring - version: 25.4.1 + version: 25.5.0 build: pyha804496_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/keyring-25.4.1-pyha804496_0.conda - sha256: 6deeb4fa0f01447a5e8bd7261044c45d139e27d36df769e5a3a16ce55607da14 - md5: ef6f2de3c8eef0ee9fd31f2267c27bf2 + url: https://conda.anaconda.org/conda-forge/noarch/keyring-25.5.0-pyha804496_0.conda + sha256: f9a0b7838db9366fba0b9917fe8d0654377ebf8959e904f963e12ff76a5cc9ba + md5: a36af57a05ceaed6827adc5e4ba81267 depends: - __linux - importlib-metadata >=4.11.4 @@ -3447,8 +3447,8 @@ packages: license_family: MIT purls: - pkg:pypi/keyring?source=hash-mapping - size: 36717 - timestamp: 1726971094601 + size: 37056 + timestamp: 1730056658373 - kind: conda name: lcms2 version: '2.16' @@ -4525,123 +4525,131 @@ packages: - kind: conda name: libsqlite version: 3.47.0 - build: h2466b09_0 + build: h2466b09_1 + build_number: 1 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.47.0-h2466b09_0.conda - sha256: 4f3cd0477c831eab48fb7fa3ed91d918aeb644fad9b4014726d445339750cdcc - md5: 964bef59135d876c596ae67b3315e812 + url: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.47.0-h2466b09_1.conda + sha256: 3342d6fe787f5830f7e8466d9c65c914bfd8d67220fb5673041b338cbba47afe + md5: 5b1f36012cc3d09c4eb9f24ad0e2c379 depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: Unlicense - size: 884970 - timestamp: 1729592254351 + size: 892175 + timestamp: 1730208431651 - kind: conda name: libsqlite version: 3.47.0 - build: h2466b09_0 + build: h2466b09_1 + build_number: 1 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.47.0-h2466b09_0.conda - sha256: 4f3cd0477c831eab48fb7fa3ed91d918aeb644fad9b4014726d445339750cdcc - md5: 964bef59135d876c596ae67b3315e812 + url: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.47.0-h2466b09_1.conda + sha256: 3342d6fe787f5830f7e8466d9c65c914bfd8d67220fb5673041b338cbba47afe + md5: 5b1f36012cc3d09c4eb9f24ad0e2c379 depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: Unlicense purls: [] - size: 884970 - timestamp: 1729592254351 + size: 892175 + timestamp: 1730208431651 - kind: conda name: libsqlite version: 3.47.0 - build: hadc24fc_0 + build: hadc24fc_1 + build_number: 1 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_0.conda - sha256: 76ffc7a5823b51735c11d535f3666b3c9c7d1519f9fbb6fa9cdff79db01960b9 - md5: 540296f0ce9d3352188c15a89b30b9ac + url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_1.conda + sha256: 8a9aadf996a2399f65b679c6e7f29139d5059f699c63e6d7b50e20db10c00508 + md5: b6f02b52a174e612e89548f4663ce56a depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libzlib >=1.3.1,<2.0a0 license: Unlicense - size: 874704 - timestamp: 1729591931557 + size: 875349 + timestamp: 1730208050020 - kind: conda name: libsqlite version: 3.47.0 - build: hadc24fc_0 + build: hadc24fc_1 + build_number: 1 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_0.conda - sha256: 76ffc7a5823b51735c11d535f3666b3c9c7d1519f9fbb6fa9cdff79db01960b9 - md5: 540296f0ce9d3352188c15a89b30b9ac + url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_1.conda + sha256: 8a9aadf996a2399f65b679c6e7f29139d5059f699c63e6d7b50e20db10c00508 + md5: b6f02b52a174e612e89548f4663ce56a depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libzlib >=1.3.1,<2.0a0 license: Unlicense purls: [] - size: 874704 - timestamp: 1729591931557 + size: 875349 + timestamp: 1730208050020 - kind: conda name: libsqlite version: 3.47.0 - build: hbaaea75_0 + build: hbaaea75_1 + build_number: 1 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_0.conda - sha256: 76aa4bbbaa2334689b16048f04ac4c7406e9bfb1f225ac7107fd2a73f85329cf - md5: 5bbe4802d5460b80620411fe1da8fec3 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_1.conda + sha256: 5a96caa566c11e5a5ebdcdb86a0759a7fb27d3c5f42e6a0fd0d6023c1e935d9e + md5: 07a14fbe439eef078cc479deca321161 depends: - __osx >=11.0 - libzlib >=1.3.1,<2.0a0 license: Unlicense - size: 837789 - timestamp: 1729592072314 + size: 837683 + timestamp: 1730208293578 - kind: conda name: libsqlite version: 3.47.0 - build: hbaaea75_0 + build: hbaaea75_1 + build_number: 1 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_0.conda - sha256: 76aa4bbbaa2334689b16048f04ac4c7406e9bfb1f225ac7107fd2a73f85329cf - md5: 5bbe4802d5460b80620411fe1da8fec3 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_1.conda + sha256: 5a96caa566c11e5a5ebdcdb86a0759a7fb27d3c5f42e6a0fd0d6023c1e935d9e + md5: 07a14fbe439eef078cc479deca321161 depends: - __osx >=11.0 - libzlib >=1.3.1,<2.0a0 license: Unlicense purls: [] - size: 837789 - timestamp: 1729592072314 + size: 837683 + timestamp: 1730208293578 - kind: conda name: libsqlite version: 3.47.0 - build: hc4a20ef_0 + build: hc4a20ef_1 + build_number: 1 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.47.0-hc4a20ef_0.conda - sha256: 469ed05e9a1622b0204a2b6cf620c9054bf6904e2ed818a1f91ee96a7bc64517 - md5: ccbe261fb8c1f1cd1a3122592247d3c4 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.47.0-hc4a20ef_1.conda + sha256: 73e143fdb966b61cd25ab804d416d87dfce43ac684e0fac3ad8b1450796331ab + md5: a6b185aac10d08028340858f77231b23 depends: - libgcc >=13 - libzlib >=1.3.1,<2.0a0 license: Unlicense - size: 1042108 - timestamp: 1729592001716 + size: 1041855 + timestamp: 1730208187962 - kind: conda name: libsqlite version: 3.47.0 - build: hc4a20ef_0 + build: hc4a20ef_1 + build_number: 1 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.47.0-hc4a20ef_0.conda - sha256: 469ed05e9a1622b0204a2b6cf620c9054bf6904e2ed818a1f91ee96a7bc64517 - md5: ccbe261fb8c1f1cd1a3122592247d3c4 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.47.0-hc4a20ef_1.conda + sha256: 73e143fdb966b61cd25ab804d416d87dfce43ac684e0fac3ad8b1450796331ab + md5: a6b185aac10d08028340858f77231b23 depends: - libgcc >=13 - libzlib >=1.3.1,<2.0a0 license: Unlicense purls: [] - size: 1042108 - timestamp: 1729592001716 + size: 1041855 + timestamp: 1730208187962 - kind: conda name: libstdcxx version: 14.2.0 @@ -6534,32 +6542,30 @@ packages: timestamp: 1729065920347 - kind: conda name: pip - version: '24.2' - build: pyh8b19718_1 - build_number: 1 + version: 24.3.1 + build: pyh8b19718_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda - sha256: d820e5358bcb117fa6286e55d4550c60b0332443df62121df839eab2d11c890b - md5: 6c78fbb8ddfd64bcb55b5cbafd2d2c43 + url: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda + sha256: 499313e72e20225f84c2e9690bbaf5b952c8d7e0bf34b728278538f766b81628 + md5: 5dd546fe99b44fda83963d15f84263b7 depends: - python >=3.8,<3.13.0a0 - setuptools - wheel license: MIT license_family: MIT - size: 1237976 - timestamp: 1724954490262 + size: 1243168 + timestamp: 1730203795600 - kind: conda name: pip - version: '24.2' - build: pyh8b19718_1 - build_number: 1 + version: 24.3.1 + build: pyh8b19718_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda - sha256: d820e5358bcb117fa6286e55d4550c60b0332443df62121df839eab2d11c890b - md5: 6c78fbb8ddfd64bcb55b5cbafd2d2c43 + url: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda + sha256: 499313e72e20225f84c2e9690bbaf5b952c8d7e0bf34b728278538f766b81628 + md5: 5dd546fe99b44fda83963d15f84263b7 depends: - python >=3.8,<3.13.0a0 - setuptools @@ -6567,9 +6573,9 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pip?source=hash-mapping - size: 1237976 - timestamp: 1724954490262 + - pkg:pypi/pip?source=compressed-mapping + size: 1243168 + timestamp: 1730203795600 - kind: conda name: platformdirs version: 4.3.6 @@ -8199,12 +8205,12 @@ packages: timestamp: 1632758637093 - kind: conda name: uv - version: 0.4.26 + version: 0.4.28 build: h0f3a69f_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/uv-0.4.26-h0f3a69f_0.conda - sha256: 4f05a61c3c3127ce7e487001215d20f49da0563fa4335462b2f6cc0028bb265b - md5: c4316a4c2b47ae154259fa5caffd53f1 + url: https://conda.anaconda.org/conda-forge/linux-64/uv-0.4.28-h0f3a69f_0.conda + sha256: 9928463a50534c82ef8cc3c5ce115f5dcde9a57a798724ec8fe928f4b041e59b + md5: b43385748277fa93f06784b1739bd7c9 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 @@ -8212,16 +8218,16 @@ packages: constrains: - __glibc >=2.17 license: Apache-2.0 OR MIT - size: 9446110 - timestamp: 1729774270770 + size: 9606394 + timestamp: 1730222074009 - kind: conda name: uv - version: 0.4.26 + version: 0.4.28 build: h0f3a69f_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/uv-0.4.26-h0f3a69f_0.conda - sha256: 4f05a61c3c3127ce7e487001215d20f49da0563fa4335462b2f6cc0028bb265b - md5: c4316a4c2b47ae154259fa5caffd53f1 + url: https://conda.anaconda.org/conda-forge/linux-64/uv-0.4.28-h0f3a69f_0.conda + sha256: 9928463a50534c82ef8cc3c5ce115f5dcde9a57a798724ec8fe928f4b041e59b + md5: b43385748277fa93f06784b1739bd7c9 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 @@ -8230,32 +8236,32 @@ packages: - __glibc >=2.17 license: Apache-2.0 OR MIT purls: [] - size: 9446110 - timestamp: 1729774270770 + size: 9606394 + timestamp: 1730222074009 - kind: conda name: uv - version: 0.4.26 + version: 0.4.28 build: h2016286_0 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.4.26-h2016286_0.conda - sha256: f63f7ab9e410899daf66e7ff343020b4bb8cf5f52413acca0dcb95ae9b04f854 - md5: f3f6ad5ca3aca4e0e5fd0f7f5f156093 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.4.28-h2016286_0.conda + sha256: 7d4f65d351f7d849127a162e2b1e45b9b49ba7b30bfebcaa66b71a3cb0eff8e5 + md5: a05654692b0cbc6ba1986a66402c32a9 depends: - libgcc >=13 - libstdcxx >=13 constrains: - __glibc >=2.17 license: Apache-2.0 OR MIT - size: 8929757 - timestamp: 1729774724816 + size: 8927335 + timestamp: 1730222427196 - kind: conda name: uv - version: 0.4.26 + version: 0.4.28 build: h2016286_0 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.4.26-h2016286_0.conda - sha256: f63f7ab9e410899daf66e7ff343020b4bb8cf5f52413acca0dcb95ae9b04f854 - md5: f3f6ad5ca3aca4e0e5fd0f7f5f156093 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.4.28-h2016286_0.conda + sha256: 7d4f65d351f7d849127a162e2b1e45b9b49ba7b30bfebcaa66b71a3cb0eff8e5 + md5: a05654692b0cbc6ba1986a66402c32a9 depends: - libgcc >=13 - libstdcxx >=13 @@ -8263,32 +8269,32 @@ packages: - __glibc >=2.17 license: Apache-2.0 OR MIT purls: [] - size: 8929757 - timestamp: 1729774724816 + size: 8927335 + timestamp: 1730222427196 - kind: conda name: uv - version: 0.4.26 + version: 0.4.28 build: h41fe3af_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/uv-0.4.26-h41fe3af_0.conda - sha256: f9530088e0a7319946c0dbc51c2e82bfa964fa3cb548e986053c7d8b6698056d - md5: 8beaeac747a7887e458e7de7e3d9fd6d + url: https://conda.anaconda.org/conda-forge/osx-arm64/uv-0.4.28-h41fe3af_0.conda + sha256: 09f77918e14f6906481cc1c14dee3cfede9ed8972b65fd7e4b0dcf900898485c + md5: 29a1f76342d05aa2114e4ec0c5e6d789 depends: - __osx >=11.0 - libcxx >=17 constrains: - __osx >=11.0 license: Apache-2.0 OR MIT - size: 8421278 - timestamp: 1729775629422 + size: 8554321 + timestamp: 1730223578276 - kind: conda name: uv - version: 0.4.26 + version: 0.4.28 build: h41fe3af_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/uv-0.4.26-h41fe3af_0.conda - sha256: f9530088e0a7319946c0dbc51c2e82bfa964fa3cb548e986053c7d8b6698056d - md5: 8beaeac747a7887e458e7de7e3d9fd6d + url: https://conda.anaconda.org/conda-forge/osx-arm64/uv-0.4.28-h41fe3af_0.conda + sha256: 09f77918e14f6906481cc1c14dee3cfede9ed8972b65fd7e4b0dcf900898485c + md5: 29a1f76342d05aa2114e4ec0c5e6d789 depends: - __osx >=11.0 - libcxx >=17 @@ -8296,39 +8302,39 @@ packages: - __osx >=11.0 license: Apache-2.0 OR MIT purls: [] - size: 8421278 - timestamp: 1729775629422 + size: 8554321 + timestamp: 1730223578276 - kind: conda name: uv - version: 0.4.26 + version: 0.4.28 build: ha08ef0e_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/uv-0.4.26-ha08ef0e_0.conda - sha256: 57691a29d941ffbbae312c6dedccc303b6303e58487803e84db20a3304c0d269 - md5: a09f8193bdf8d1512340e8ec2432e82d + url: https://conda.anaconda.org/conda-forge/win-64/uv-0.4.28-ha08ef0e_0.conda + sha256: 3880653f6d1a95b9f44e7d4f1e42db29f5e40dcdaf9d4de1196900a90f1ee212 + md5: 4e87e88e662e10afb4a61824f4638961 depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: Apache-2.0 OR MIT - size: 10344775 - timestamp: 1729775595022 + size: 10514791 + timestamp: 1730223029541 - kind: conda name: uv - version: 0.4.26 + version: 0.4.28 build: ha08ef0e_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/uv-0.4.26-ha08ef0e_0.conda - sha256: 57691a29d941ffbbae312c6dedccc303b6303e58487803e84db20a3304c0d269 - md5: a09f8193bdf8d1512340e8ec2432e82d + url: https://conda.anaconda.org/conda-forge/win-64/uv-0.4.28-ha08ef0e_0.conda + sha256: 3880653f6d1a95b9f44e7d4f1e42db29f5e40dcdaf9d4de1196900a90f1ee212 + md5: 4e87e88e662e10afb4a61824f4638961 depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: Apache-2.0 OR MIT purls: [] - size: 10344775 - timestamp: 1729775595022 + size: 10514791 + timestamp: 1730223029541 - kind: conda name: vc version: '14.3' @@ -8401,13 +8407,13 @@ packages: timestamp: 1728401055788 - kind: conda name: virtualenv - version: 20.27.0 + version: 20.27.1 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.0-pyhd8ed1ab_0.conda - sha256: 18bae5ff9f02793ca56d295f0a5f1d4443623ee3be09a6805eb7d4b18245968c - md5: a6ed1227ba6ec37cfc2b25e6512f729f + url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.1-pyhd8ed1ab_0.conda + sha256: 189b935224732267df10dc116bce0835bd76fcdb20c30f560591c92028d513b0 + md5: dae21509d62aa7bf676279ced3edcb3f depends: - distlib <1,>=0.3.7 - filelock <4,>=3.12.2 @@ -8415,17 +8421,17 @@ packages: - python >=3.8 license: MIT license_family: MIT - size: 2952166 - timestamp: 1729243861344 + size: 2965442 + timestamp: 1730204927840 - kind: conda name: virtualenv - version: 20.27.0 + version: 20.27.1 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.0-pyhd8ed1ab_0.conda - sha256: 18bae5ff9f02793ca56d295f0a5f1d4443623ee3be09a6805eb7d4b18245968c - md5: a6ed1227ba6ec37cfc2b25e6512f729f + url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.1-pyhd8ed1ab_0.conda + sha256: 189b935224732267df10dc116bce0835bd76fcdb20c30f560591c92028d513b0 + md5: dae21509d62aa7bf676279ced3edcb3f depends: - distlib <1,>=0.3.7 - filelock <4,>=3.12.2 @@ -8435,8 +8441,8 @@ packages: license_family: MIT purls: - pkg:pypi/virtualenv?source=hash-mapping - size: 2952166 - timestamp: 1729243861344 + size: 2965442 + timestamp: 1730204927840 - kind: conda name: vs2015_runtime version: 14.40.33810 diff --git a/packages/transform-io/pixi.toml b/packages/transform-io/pixi.toml index 43bfb4253..c344a6e7b 100644 --- a/packages/transform-io/pixi.toml +++ b/packages/transform-io/pixi.toml @@ -6,8 +6,6 @@ name = "transform-io" platforms = ["win-64", "linux-64", "linux-aarch64", "osx-arm64"] version = "0.1.0" -[tasks] - [dependencies] python = "3.12.*" pnpm = ">=9.12.1,<10" @@ -20,6 +18,14 @@ m2w64-jq = ">=1.6.0,<2" [target.unix.dependencies] jq = ">=1.7.1,<2" +[tasks.build] +cmd = "pnpm run build" +description = "Build the project" + +[tasks.test] +cmd = "pnpm run test" +description = "Run tests" + [tasks.version-sync-typescript] cmd = '''version=$(cat package.json | jq .version) && jq ".version = $version" typescript/package.json > typescript/package.json.tmp && diff --git a/packages/transform-io/python/itkwasm-transform-io-emscripten/README.md b/packages/transform-io/python/itkwasm-transform-io-emscripten/README.md new file mode 100644 index 000000000..d86d0cf9e --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-emscripten/README.md @@ -0,0 +1,23 @@ +# itkwasm-transform-io-emscripten + +[![PyPI version](https://badge.fury.io/py/itkwasm-transform-io-emscripten.svg)](https://badge.fury.io/py/itkwasm-transform-io-emscripten) + +Input and output for scientific and medical coordinate transform file formats. Emscripten implementation. + +This package provides the Emscripten WebAssembly implementation. It is usually not called directly. Please use the [`itkwasm-transform-io`](https://pypi.org/project/itkwasm-transform-io/) instead. + + +## Installation + +```sh +import micropip +await micropip.install('itkwasm-transform-io-emscripten') +``` + +## Development + +```sh +pip install hatch +hatch run download-pyodide +hatch run test +``` diff --git a/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/__init__.py b/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/__init__.py new file mode 100644 index 000000000..73df3a55c --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/__init__.py @@ -0,0 +1,18 @@ +# Generated file. To retain edits, remove this comment. + +"""itkwasm-transform-io-emscripten: Input and output for scientific and medical coordinate transform file formats. Emscripten implementation.""" + +from .hdf5_read_transform_async import hdf5_read_transform_async +from .hdf5_write_transform_async import hdf5_write_transform_async +from .mat_read_transform_async import mat_read_transform_async +from .mat_write_transform_async import mat_write_transform_async +from .mnc_read_transform_async import mnc_read_transform_async +from .mnc_write_transform_async import mnc_write_transform_async +from .txt_read_transform_async import txt_read_transform_async +from .txt_write_transform_async import txt_write_transform_async +from .wasm_read_transform_async import wasm_read_transform_async +from .wasm_write_transform_async import wasm_write_transform_async +from .wasm_zstd_read_transform_async import wasm_zstd_read_transform_async +from .wasm_zstd_write_transform_async import wasm_zstd_write_transform_async + +from ._version import __version__ diff --git a/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/_version.py b/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/_version.py new file mode 100644 index 000000000..3dc1f76bc --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/_version.py @@ -0,0 +1 @@ +__version__ = "0.1.0" diff --git a/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/hdf5_read_transform_async.py b/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/hdf5_read_transform_async.py new file mode 100644 index 000000000..e352f3691 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/hdf5_read_transform_async.py @@ -0,0 +1,60 @@ +# Generated file. To retain edits, remove this comment. + +from pathlib import Path +import os +from typing import Dict, Tuple, Optional, List, Any + +from .js_package import js_package + +from itkwasm.pyodide import ( + to_js, + to_py, + js_resources +) +from itkwasm import ( + InterfaceTypes, + BinaryFile, + Transform, +) + +async def hdf5_read_transform_async( + serialized_transform: os.PathLike, + float_parameters: bool = False, +) -> Tuple[Any, Transform]: + """Read an transform file format and convert it to the ITK-Wasm transform file format + + :param serialized_transform: Input transform serialized in the file format + :type serialized_transform: os.PathLike + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :return: Whether the input could be read. If false, the output transform is not valid. + :rtype: Any + + :return: Output transform + :rtype: Transform + """ + js_module = await js_package.js_module + web_worker = js_resources.web_worker + + kwargs = {} + if float_parameters: + kwargs["floatParameters"] = to_js(float_parameters) + + outputs = await js_module.hdf5ReadTransform(to_js(BinaryFile(serialized_transform)), webWorker=web_worker, noCopy=True, **kwargs) + + output_web_worker = None + output_list = [] + outputs_object_map = outputs.as_object_map() + for output_name in outputs.object_keys(): + if output_name == 'webWorker': + output_web_worker = outputs_object_map[output_name] + else: + output_list.append(to_py(outputs_object_map[output_name])) + + js_resources.web_worker = output_web_worker + + if len(output_list) == 1: + return output_list[0] + return tuple(output_list) diff --git a/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/hdf5_write_transform_async.py b/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/hdf5_write_transform_async.py new file mode 100644 index 000000000..0e6fa6e39 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/hdf5_write_transform_async.py @@ -0,0 +1,67 @@ +# Generated file. To retain edits, remove this comment. + +from pathlib import Path +import os +from typing import Dict, Tuple, Optional, List, Any + +from .js_package import js_package + +from itkwasm.pyodide import ( + to_js, + to_py, + js_resources +) +from itkwasm import ( + InterfaceTypes, + Transform, + BinaryFile, +) + +async def hdf5_write_transform_async( + transform: Transform, + serialized_transform: str, + float_parameters: bool = False, + use_compression: bool = False, +) -> Tuple[Any]: + """Write an ITK-Wasm transform file format converted to a transform file format + + :param transform: Input transform + :type transform: Transform + + :param serialized_transform: Output transform serialized in the file format. + :type serialized_transform: str + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :param use_compression: Use compression in the written file + :type use_compression: bool + + :return: Whether the input could be written. If false, the output transform is not valid. + :rtype: Any + """ + js_module = await js_package.js_module + web_worker = js_resources.web_worker + + kwargs = {} + if float_parameters: + kwargs["floatParameters"] = to_js(float_parameters) + if use_compression: + kwargs["useCompression"] = to_js(use_compression) + + outputs = await js_module.hdf5WriteTransform(to_js(transform), to_js(serialized_transform), webWorker=web_worker, noCopy=True, **kwargs) + + output_web_worker = None + output_list = [] + outputs_object_map = outputs.as_object_map() + for output_name in outputs.object_keys(): + if output_name == 'webWorker': + output_web_worker = outputs_object_map[output_name] + else: + output_list.append(to_py(outputs_object_map[output_name])) + + js_resources.web_worker = output_web_worker + + if len(output_list) == 1: + return output_list[0] + return tuple(output_list) diff --git a/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/js_package.py b/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/js_package.py new file mode 100644 index 000000000..62e2f4d19 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/js_package.py @@ -0,0 +1,8 @@ +# Generated file. To retain edits, remove this comment. + +from itkwasm.pyodide import JsPackageConfig, JsPackage + +from ._version import __version__ +default_js_module = """data:text/javascript;base64,dmFyIGN0PU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgdXQ9KEEsZSk9Pntmb3IodmFyIHQgaW4gZSljdChBLHQse2dldDplW3RdLGVudW1lcmFibGU6ITB9KX07dmFyIEV0PSIwLjEuMSIsYkE9RXQ7dmFyIFF0PXtJbnQ4OiJpbnQ4IixVSW50ODoidWludDgiLEludDE2OiJpbnQxNiIsVUludDE2OiJ1aW50MTYiLEludDMyOiJpbnQzMiIsVUludDMyOiJ1aW50MzIiLEludDY0OiJpbnQ2NCIsVUludDY0OiJ1aW50NjQiLFNpemVWYWx1ZVR5cGU6InVpbnQ2NCIsSWRlbnRpZmllclR5cGU6InVpbnQ2NCIsSW5kZXhWYWx1ZVR5cGU6ImludDY0IixPZmZzZXRWYWx1ZVR5cGU6ImludDY0In0sRj1RdDt2YXIgcHQ9e0Zsb2F0MzI6ImZsb2F0MzIiLEZsb2F0NjQ6ImZsb2F0NjQiLFNwYWNlUHJlY2lzaW9uVHlwZToiZmxvYXQ2NCJ9LEg9cHQ7ZnVuY3Rpb24gbXQoQSxlKXtsZXQgdD1udWxsO3N3aXRjaChBKXtjYXNlIEYuVUludDg6e3Q9bmV3IFVpbnQ4QXJyYXkoZSk7YnJlYWt9Y2FzZSBGLkludDg6e3Q9bmV3IEludDhBcnJheShlKTticmVha31jYXNlIEYuVUludDE2Ont0PW5ldyBVaW50MTZBcnJheShlKTticmVha31jYXNlIEYuSW50MTY6e3Q9bmV3IEludDE2QXJyYXkoZSk7YnJlYWt9Y2FzZSBGLlVJbnQzMjp7dD1uZXcgVWludDMyQXJyYXkoZSk7YnJlYWt9Y2FzZSBGLkludDMyOnt0PW5ldyBJbnQzMkFycmF5KGUpO2JyZWFrfWNhc2UgRi5VSW50NjQ6e3R5cGVvZiBnbG9iYWxUaGlzLkJpZ1VpbnQ2NEFycmF5PT0iZnVuY3Rpb24iP3Q9bmV3IEJpZ1VpbnQ2NEFycmF5KGUpOnQ9bmV3IFVpbnQ4QXJyYXkoZSk7YnJlYWt9Y2FzZSBGLkludDY0Ont0eXBlb2YgZ2xvYmFsVGhpcy5CaWdJbnQ2NEFycmF5PT0iZnVuY3Rpb24iP3Q9bmV3IEJpZ0ludDY0QXJyYXkoZSk6dD1uZXcgVWludDhBcnJheShlKTticmVha31jYXNlIEguRmxvYXQzMjp7dD1uZXcgRmxvYXQzMkFycmF5KGUpO2JyZWFrfWNhc2UgSC5GbG9hdDY0Ont0PW5ldyBGbG9hdDY0QXJyYXkoZSk7YnJlYWt9Y2FzZSJudWxsIjp7dD1udWxsO2JyZWFrfWNhc2UgbnVsbDp7dD1udWxsO2JyZWFrfWRlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJUeXBlIGlzIG5vdCBzdXBwb3J0ZWQgYXMgYSBUeXBlZEFycmF5Iil9cmV0dXJuIHR9dmFyIEc9bXQ7dmFyIGR0PXtUZXh0RmlsZToiVGV4dEZpbGUiLEJpbmFyeUZpbGU6IkJpbmFyeUZpbGUiLFRleHRTdHJlYW06IlRleHRTdHJlYW0iLEJpbmFyeVN0cmVhbToiQmluYXJ5U3RyZWFtIixJbWFnZToiSW1hZ2UiLFBvaW50U2V0OiJQb2ludFNldCIsTWVzaDoiTWVzaCIsUG9seURhdGE6IlBvbHlEYXRhIixUcmFuc2Zvcm06IlRyYW5zZm9ybSIsSnNvbkNvbXBhdGlibGU6Ikpzb25Db21wYXRpYmxlIn0sRT1kdDt2YXIgaWU9U3ltYm9sKCJDb21saW5rLnByb3h5IikseXQ9U3ltYm9sKCJDb21saW5rLmVuZHBvaW50IiksTkE9U3ltYm9sKCJDb21saW5rLnJlbGVhc2VQcm94eSIpLEZBPVN5bWJvbCgiQ29tbGluay5maW5hbGl6ZXIiKSxzQT1TeW1ib2woIkNvbWxpbmsudGhyb3duIiksYWU9QT0+dHlwZW9mIEE9PSJvYmplY3QiJiZBIT09bnVsbHx8dHlwZW9mIEE9PSJmdW5jdGlvbiIsaHQ9e2NhbkhhbmRsZTpBPT5hZShBKSYmQVtpZV0sc2VyaWFsaXplKEEpe2xldHtwb3J0MTplLHBvcnQyOnR9PW5ldyBNZXNzYWdlQ2hhbm5lbDtyZXR1cm4gSWUoQSxlKSxbdCxbdF1dfSxkZXNlcmlhbGl6ZShBKXtyZXR1cm4gQS5zdGFydCgpLFRBKEEpfX0sd3Q9e2NhbkhhbmRsZTpBPT5hZShBKSYmc0EgaW4gQSxzZXJpYWxpemUoe3ZhbHVlOkF9KXtsZXQgZTtyZXR1cm4gQSBpbnN0YW5jZW9mIEVycm9yP2U9e2lzRXJyb3I6ITAsdmFsdWU6e21lc3NhZ2U6QS5tZXNzYWdlLG5hbWU6QS5uYW1lLHN0YWNrOkEuc3RhY2t9fTplPXtpc0Vycm9yOiExLHZhbHVlOkF9LFtlLFtdXX0sZGVzZXJpYWxpemUoQSl7dGhyb3cgQS5pc0Vycm9yP09iamVjdC5hc3NpZ24obmV3IEVycm9yKEEudmFsdWUubWVzc2FnZSksQS52YWx1ZSk6QS52YWx1ZX19LHNlPW5ldyBNYXAoW1sicHJveHkiLGh0XSxbInRocm93Iix3dF1dKTtmdW5jdGlvbiBEdChBLGUpe2ZvcihsZXQgdCBvZiBBKWlmKGU9PT10fHx0PT09IioifHx0IGluc3RhbmNlb2YgUmVnRXhwJiZ0LnRlc3QoZSkpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gSWUoQSxlPWdsb2JhbFRoaXMsdD1bIioiXSl7ZS5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbiByKG4pe2lmKCFufHwhbi5kYXRhKXJldHVybjtpZighRHQodCxuLm9yaWdpbikpe2NvbnNvbGUud2FybihgSW52YWxpZCBvcmlnaW4gJyR7bi5vcmlnaW59JyBmb3IgY29tbGluayBwcm94eWApO3JldHVybn1sZXR7aWQ6byx0eXBlOmkscGF0aDpCfT1PYmplY3QuYXNzaWduKHtwYXRoOltdfSxuLmRhdGEpLGY9KG4uZGF0YS5hcmd1bWVudExpc3R8fFtdKS5tYXAoVyksQzt0cnl7bGV0IHM9Qi5zbGljZSgwLC0xKS5yZWR1Y2UoKGMsSSk9PmNbSV0sQSksYT1CLnJlZHVjZSgoYyxJKT0+Y1tJXSxBKTtzd2l0Y2goaSl7Y2FzZSJHRVQiOkM9YTticmVhaztjYXNlIlNFVCI6c1tCLnNsaWNlKC0xKVswXV09VyhuLmRhdGEudmFsdWUpLEM9ITA7YnJlYWs7Y2FzZSJBUFBMWSI6Qz1hLmFwcGx5KHMsZik7YnJlYWs7Y2FzZSJDT05TVFJVQ1QiOntsZXQgYz1uZXcgYSguLi5mKTtDPUZ0KGMpfWJyZWFrO2Nhc2UiRU5EUE9JTlQiOntsZXR7cG9ydDE6Yyxwb3J0MjpJfT1uZXcgTWVzc2FnZUNoYW5uZWw7SWUoQSxJKSxDPUdBKGMsW2NdKX1icmVhaztjYXNlIlJFTEVBU0UiOkM9dm9pZCAwO2JyZWFrO2RlZmF1bHQ6cmV0dXJufX1jYXRjaChzKXtDPXt2YWx1ZTpzLFtzQV06MH19UHJvbWlzZS5yZXNvbHZlKEMpLmNhdGNoKHM9Pih7dmFsdWU6cyxbc0FdOjB9KSkudGhlbihzPT57bGV0W2EsY109QkEocyk7ZS5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2lkOm99KSxjKSxpPT09IlJFTEVBU0UiJiYoZS5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixyKSxnZShlKSxGQSBpbiBBJiZ0eXBlb2YgQVtGQV09PSJmdW5jdGlvbiImJkFbRkFdKCkpfSkuY2F0Y2gocz0+e2xldFthLGNdPUJBKHt2YWx1ZTpuZXcgVHlwZUVycm9yKCJVbnNlcmlhbGl6YWJsZSByZXR1cm4gdmFsdWUiKSxbc0FdOjB9KTtlLnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxhKSx7aWQ6b30pLGMpfSl9KSxlLnN0YXJ0JiZlLnN0YXJ0KCl9ZnVuY3Rpb24gU3QoQSl7cmV0dXJuIEEuY29uc3RydWN0b3IubmFtZT09PSJNZXNzYWdlUG9ydCJ9ZnVuY3Rpb24gZ2UoQSl7U3QoQSkmJkEuY2xvc2UoKX1mdW5jdGlvbiBUQShBLGUpe3JldHVybiBVQShBLFtdLGUpfWZ1bmN0aW9uIGFBKEEpe2lmKEEpdGhyb3cgbmV3IEVycm9yKCJQcm94eSBoYXMgYmVlbiByZWxlYXNlZCBhbmQgaXMgbm90IHVzZWFibGUiKX1mdW5jdGlvbiBCZShBKXtyZXR1cm4gWShBLHt0eXBlOiJSRUxFQVNFIn0pLnRoZW4oKCk9PntnZShBKX0pfXZhciBJQT1uZXcgV2Vha01hcCxnQT0iRmluYWxpemF0aW9uUmVnaXN0cnkiaW4gZ2xvYmFsVGhpcyYmbmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KEE9PntsZXQgZT0oSUEuZ2V0KEEpfHwwKS0xO0lBLnNldChBLGUpLGU9PT0wJiZCZShBKX0pO2Z1bmN0aW9uIFJ0KEEsZSl7bGV0IHQ9KElBLmdldChlKXx8MCkrMTtJQS5zZXQoZSx0KSxnQSYmZ0EucmVnaXN0ZXIoQSxlLEEpfWZ1bmN0aW9uIGt0KEEpe2dBJiZnQS51bnJlZ2lzdGVyKEEpfWZ1bmN0aW9uIFVBKEEsZT1bXSx0PWZ1bmN0aW9uKCl7fSl7bGV0IHI9ITEsbj1uZXcgUHJveHkodCx7Z2V0KG8saSl7aWYoYUEociksaT09PU5BKXJldHVybigpPT57a3QobiksQmUoQSkscj0hMH07aWYoaT09PSJ0aGVuIil7aWYoZS5sZW5ndGg9PT0wKXJldHVybnt0aGVuOigpPT5ufTtsZXQgQj1ZKEEse3R5cGU6IkdFVCIscGF0aDplLm1hcChmPT5mLnRvU3RyaW5nKCkpfSkudGhlbihXKTtyZXR1cm4gQi50aGVuLmJpbmQoQil9cmV0dXJuIFVBKEEsWy4uLmUsaV0pfSxzZXQobyxpLEIpe2FBKHIpO2xldFtmLENdPUJBKEIpO3JldHVybiBZKEEse3R5cGU6IlNFVCIscGF0aDpbLi4uZSxpXS5tYXAocz0+cy50b1N0cmluZygpKSx2YWx1ZTpmfSxDKS50aGVuKFcpfSxhcHBseShvLGksQil7YUEocik7bGV0IGY9ZVtlLmxlbmd0aC0xXTtpZihmPT09eXQpcmV0dXJuIFkoQSx7dHlwZToiRU5EUE9JTlQifSkudGhlbihXKTtpZihmPT09ImJpbmQiKXJldHVybiBVQShBLGUuc2xpY2UoMCwtMSkpO2xldFtDLHNdPW5lKEIpO3JldHVybiBZKEEse3R5cGU6IkFQUExZIixwYXRoOmUubWFwKGE9PmEudG9TdHJpbmcoKSksYXJndW1lbnRMaXN0OkN9LHMpLnRoZW4oVyl9LGNvbnN0cnVjdChvLGkpe2FBKHIpO2xldFtCLGZdPW5lKGkpO3JldHVybiBZKEEse3R5cGU6IkNPTlNUUlVDVCIscGF0aDplLm1hcChDPT5DLnRvU3RyaW5nKCkpLGFyZ3VtZW50TGlzdDpCfSxmKS50aGVuKFcpfX0pO3JldHVybiBSdChuLEEpLG59ZnVuY3Rpb24gYnQoQSl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sQSl9ZnVuY3Rpb24gbmUoQSl7bGV0IGU9QS5tYXAoQkEpO3JldHVybltlLm1hcCh0PT50WzBdKSxidChlLm1hcCh0PT50WzFdKSldfXZhciBDZT1uZXcgV2Vha01hcDtmdW5jdGlvbiBHQShBLGUpe3JldHVybiBDZS5zZXQoQSxlKSxBfWZ1bmN0aW9uIEZ0KEEpe3JldHVybiBPYmplY3QuYXNzaWduKEEse1tpZV06ITB9KX1mdW5jdGlvbiBCQShBKXtmb3IobGV0W2UsdF1vZiBzZSlpZih0LmNhbkhhbmRsZShBKSl7bGV0W3Isbl09dC5zZXJpYWxpemUoQSk7cmV0dXJuW3t0eXBlOiJIQU5ETEVSIixuYW1lOmUsdmFsdWU6cn0sbl19cmV0dXJuW3t0eXBlOiJSQVciLHZhbHVlOkF9LENlLmdldChBKXx8W11dfWZ1bmN0aW9uIFcoQSl7c3dpdGNoKEEudHlwZSl7Y2FzZSJIQU5ETEVSIjpyZXR1cm4gc2UuZ2V0KEEubmFtZSkuZGVzZXJpYWxpemUoQS52YWx1ZSk7Y2FzZSJSQVciOnJldHVybiBBLnZhbHVlfX1mdW5jdGlvbiBZKEEsZSx0KXtyZXR1cm4gbmV3IFByb21pc2Uocj0+e2xldCBuPVV0KCk7QS5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbiBvKGkpeyFpLmRhdGF8fCFpLmRhdGEuaWR8fGkuZGF0YS5pZCE9PW58fChBLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG8pLHIoaS5kYXRhKSl9KSxBLnN0YXJ0JiZBLnN0YXJ0KCksQS5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKHtpZDpufSxlKSx0KX0pfWZ1bmN0aW9uIFV0KCl7cmV0dXJuIG5ldyBBcnJheSg0KS5maWxsKDApLm1hcCgoKT0+TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKk51bWJlci5NQVhfU0FGRV9JTlRFR0VSKS50b1N0cmluZygxNikpLmpvaW4oIi0iKX1mdW5jdGlvbiBWKEEsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIEEuYXBwbHkoZSxhcmd1bWVudHMpfX12YXJ7dG9TdHJpbmc6TnR9PU9iamVjdC5wcm90b3R5cGUse2dldFByb3RvdHlwZU9mOk9BfT1PYmplY3QsbEE9KEE9PmU9PntsZXQgdD1OdC5jYWxsKGUpO3JldHVybiBBW3RdfHwoQVt0XT10LnNsaWNlKDgsLTEpLnRvTG93ZXJDYXNlKCkpfSkoT2JqZWN0LmNyZWF0ZShudWxsKSksUD1BPT4oQT1BLnRvTG93ZXJDYXNlKCksZT0+bEEoZSk9PT1BKSxmQT1BPT5lPT50eXBlb2YgZT09PUEse2lzQXJyYXk6cX09QXJyYXksWD1mQSgidW5kZWZpbmVkIik7ZnVuY3Rpb24gVHQoQSl7cmV0dXJuIEEhPT1udWxsJiYhWChBKSYmQS5jb25zdHJ1Y3RvciE9PW51bGwmJiFYKEEuY29uc3RydWN0b3IpJiZVKEEuY29uc3RydWN0b3IuaXNCdWZmZXIpJiZBLmNvbnN0cnVjdG9yLmlzQnVmZmVyKEEpfXZhciB1ZT1QKCJBcnJheUJ1ZmZlciIpO2Z1bmN0aW9uIEd0KEEpe2xldCBlO3JldHVybiB0eXBlb2YgQXJyYXlCdWZmZXI8InUiJiZBcnJheUJ1ZmZlci5pc1ZpZXc/ZT1BcnJheUJ1ZmZlci5pc1ZpZXcoQSk6ZT1BJiZBLmJ1ZmZlciYmdWUoQS5idWZmZXIpLGV9dmFyIFB0PWZBKCJzdHJpbmciKSxVPWZBKCJmdW5jdGlvbiIpLEVlPWZBKCJudW1iZXIiKSxjQT1BPT5BIT09bnVsbCYmdHlwZW9mIEE9PSJvYmplY3QiLEx0PUE9PkE9PT0hMHx8QT09PSExLENBPUE9PntpZihsQShBKSE9PSJvYmplY3QiKXJldHVybiExO2xldCBlPU9BKEEpO3JldHVybihlPT09bnVsbHx8ZT09PU9iamVjdC5wcm90b3R5cGV8fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKT09PW51bGwpJiYhKFN5bWJvbC50b1N0cmluZ1RhZyBpbiBBKSYmIShTeW1ib2wuaXRlcmF0b3IgaW4gQSl9LE90PVAoIkRhdGUiKSx4dD1QKCJGaWxlIiksSnQ9UCgiQmxvYiIpLFd0PVAoIkZpbGVMaXN0IiksTXQ9QT0+Y0EoQSkmJlUoQS5waXBlKSxIdD1BPT57bGV0IGU7cmV0dXJuIEEmJih0eXBlb2YgRm9ybURhdGE9PSJmdW5jdGlvbiImJkEgaW5zdGFuY2VvZiBGb3JtRGF0YXx8VShBLmFwcGVuZCkmJigoZT1sQShBKSk9PT0iZm9ybWRhdGEifHxlPT09Im9iamVjdCImJlUoQS50b1N0cmluZykmJkEudG9TdHJpbmcoKT09PSJbb2JqZWN0IEZvcm1EYXRhXSIpKX0sWXQ9UCgiVVJMU2VhcmNoUGFyYW1zIikscXQ9QT0+QS50cmltP0EudHJpbSgpOkEucmVwbGFjZSgvXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2csIiIpO2Z1bmN0aW9uICQoQSxlLHthbGxPd25LZXlzOnQ9ITF9PXt9KXtpZihBPT09bnVsbHx8dHlwZW9mIEE+InUiKXJldHVybjtsZXQgcixuO2lmKHR5cGVvZiBBIT0ib2JqZWN0IiYmKEE9W0FdKSxxKEEpKWZvcihyPTAsbj1BLmxlbmd0aDtyPG47cisrKWUuY2FsbChudWxsLEFbcl0scixBKTtlbHNle2xldCBvPXQ/T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoQSk6T2JqZWN0LmtleXMoQSksaT1vLmxlbmd0aCxCO2ZvcihyPTA7cjxpO3IrKylCPW9bcl0sZS5jYWxsKG51bGwsQVtCXSxCLEEpfX1mdW5jdGlvbiBRZShBLGUpe2U9ZS50b0xvd2VyQ2FzZSgpO2xldCB0PU9iamVjdC5rZXlzKEEpLHI9dC5sZW5ndGgsbjtmb3IoO3ItLSA+MDspaWYobj10W3JdLGU9PT1uLnRvTG93ZXJDYXNlKCkpcmV0dXJuIG47cmV0dXJuIG51bGx9dmFyIHBlPXR5cGVvZiBnbG9iYWxUaGlzPCJ1Ij9nbG9iYWxUaGlzOnR5cGVvZiBzZWxmPCJ1Ij9zZWxmOnR5cGVvZiB3aW5kb3c8InUiP3dpbmRvdzpnbG9iYWwsbWU9QT0+IVgoQSkmJkEhPT1wZTtmdW5jdGlvbiBMQSgpe2xldHtjYXNlbGVzczpBfT1tZSh0aGlzKSYmdGhpc3x8e30sZT17fSx0PShyLG4pPT57bGV0IG89QSYmUWUoZSxuKXx8bjtDQShlW29dKSYmQ0Eocik/ZVtvXT1MQShlW29dLHIpOkNBKHIpP2Vbb109TEEoe30scik6cShyKT9lW29dPXIuc2xpY2UoKTplW29dPXJ9O2ZvcihsZXQgcj0wLG49YXJndW1lbnRzLmxlbmd0aDtyPG47cisrKWFyZ3VtZW50c1tyXSYmJChhcmd1bWVudHNbcl0sdCk7cmV0dXJuIGV9dmFyIEt0PShBLGUsdCx7YWxsT3duS2V5czpyfT17fSk9PigkKGUsKG4sbyk9Pnt0JiZVKG4pP0Fbb109VihuLHQpOkFbb109bn0se2FsbE93bktleXM6cn0pLEEpLGp0PUE9PihBLmNoYXJDb2RlQXQoMCk9PT02NTI3OSYmKEE9QS5zbGljZSgxKSksQSksdnQ9KEEsZSx0LHIpPT57QS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSxyKSxBLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1BLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBLCJzdXBlciIse3ZhbHVlOmUucHJvdG90eXBlfSksdCYmT2JqZWN0LmFzc2lnbihBLnByb3RvdHlwZSx0KX0sX3Q9KEEsZSx0LHIpPT57bGV0IG4sbyxpLEI9e307aWYoZT1lfHx7fSxBPT1udWxsKXJldHVybiBlO2Rve2ZvcihuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKEEpLG89bi5sZW5ndGg7by0tID4wOylpPW5bb10sKCFyfHxyKGksQSxlKSkmJiFCW2ldJiYoZVtpXT1BW2ldLEJbaV09ITApO0E9dCE9PSExJiZPQShBKX13aGlsZShBJiYoIXR8fHQoQSxlKSkmJkEhPT1PYmplY3QucHJvdG90eXBlKTtyZXR1cm4gZX0senQ9KEEsZSx0KT0+e0E9U3RyaW5nKEEpLCh0PT09dm9pZCAwfHx0PkEubGVuZ3RoKSYmKHQ9QS5sZW5ndGgpLHQtPWUubGVuZ3RoO2xldCByPUEuaW5kZXhPZihlLHQpO3JldHVybiByIT09LTEmJnI9PT10fSxadD1BPT57aWYoIUEpcmV0dXJuIG51bGw7aWYocShBKSlyZXR1cm4gQTtsZXQgZT1BLmxlbmd0aDtpZighRWUoZSkpcmV0dXJuIG51bGw7bGV0IHQ9bmV3IEFycmF5KGUpO2Zvcig7ZS0tID4wOyl0W2VdPUFbZV07cmV0dXJuIHR9LFZ0PShBPT5lPT5BJiZlIGluc3RhbmNlb2YgQSkodHlwZW9mIFVpbnQ4QXJyYXk8InUiJiZPQShVaW50OEFycmF5KSksWHQ9KEEsZSk9PntsZXQgcj0oQSYmQVtTeW1ib2wuaXRlcmF0b3JdKS5jYWxsKEEpLG47Zm9yKDsobj1yLm5leHQoKSkmJiFuLmRvbmU7KXtsZXQgbz1uLnZhbHVlO2UuY2FsbChBLG9bMF0sb1sxXSl9fSwkdD0oQSxlKT0+e2xldCB0LHI9W107Zm9yKDsodD1BLmV4ZWMoZSkpIT09bnVsbDspci5wdXNoKHQpO3JldHVybiByfSxBcj1QKCJIVE1MRm9ybUVsZW1lbnQiKSxlcj1BPT5BLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy1fXHNdKFthLXpcZF0pKFx3KikvZyxmdW5jdGlvbih0LHIsbil7cmV0dXJuIHIudG9VcHBlckNhc2UoKStufSksZmU9KCh7aGFzT3duUHJvcGVydHk6QX0pPT4oZSx0KT0+QS5jYWxsKGUsdCkpKE9iamVjdC5wcm90b3R5cGUpLHRyPVAoIlJlZ0V4cCIpLGRlPShBLGUpPT57bGV0IHQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoQSkscj17fTskKHQsKG4sbyk9PntsZXQgaTsoaT1lKG4sbyxBKSkhPT0hMSYmKHJbb109aXx8bil9KSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhBLHIpfSxycj1BPT57ZGUoQSwoZSx0KT0+e2lmKFUoQSkmJlsiYXJndW1lbnRzIiwiY2FsbGVyIiwiY2FsbGVlIl0uaW5kZXhPZih0KSE9PS0xKXJldHVybiExO2xldCByPUFbdF07aWYoVShyKSl7aWYoZS5lbnVtZXJhYmxlPSExLCJ3cml0YWJsZSJpbiBlKXtlLndyaXRhYmxlPSExO3JldHVybn1lLnNldHx8KGUuc2V0PSgpPT57dGhyb3cgRXJyb3IoIkNhbiBub3QgcmV3cml0ZSByZWFkLW9ubHkgbWV0aG9kICciK3QrIiciKX0pfX0pfSxvcj0oQSxlKT0+e2xldCB0PXt9LHI9bj0+e24uZm9yRWFjaChvPT57dFtvXT0hMH0pfTtyZXR1cm4gcShBKT9yKEEpOnIoU3RyaW5nKEEpLnNwbGl0KGUpKSx0fSxucj0oKT0+e30saXI9KEEsZSk9PihBPStBLE51bWJlci5pc0Zpbml0ZShBKT9BOmUpLFBBPSJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIsY2U9IjAxMjM0NTY3ODkiLHllPXtESUdJVDpjZSxBTFBIQTpQQSxBTFBIQV9ESUdJVDpQQStQQS50b1VwcGVyQ2FzZSgpK2NlfSxhcj0oQT0xNixlPXllLkFMUEhBX0RJR0lUKT0+e2xldCB0PSIiLHtsZW5ndGg6cn09ZTtmb3IoO0EtLTspdCs9ZVtNYXRoLnJhbmRvbSgpKnJ8MF07cmV0dXJuIHR9O2Z1bmN0aW9uIHNyKEEpe3JldHVybiEhKEEmJlUoQS5hcHBlbmQpJiZBW1N5bWJvbC50b1N0cmluZ1RhZ109PT0iRm9ybURhdGEiJiZBW1N5bWJvbC5pdGVyYXRvcl0pfXZhciBJcj1BPT57bGV0IGU9bmV3IEFycmF5KDEwKSx0PShyLG4pPT57aWYoY0Eocikpe2lmKGUuaW5kZXhPZihyKT49MClyZXR1cm47aWYoISgidG9KU09OImluIHIpKXtlW25dPXI7bGV0IG89cShyKT9bXTp7fTtyZXR1cm4gJChyLChpLEIpPT57bGV0IGY9dChpLG4rMSk7IVgoZikmJihvW0JdPWYpfSksZVtuXT12b2lkIDAsb319cmV0dXJuIHJ9O3JldHVybiB0KEEsMCl9LGdyPVAoIkFzeW5jRnVuY3Rpb24iKSxCcj1BPT5BJiYoY0EoQSl8fFUoQSkpJiZVKEEudGhlbikmJlUoQS5jYXRjaCksZz17aXNBcnJheTpxLGlzQXJyYXlCdWZmZXI6dWUsaXNCdWZmZXI6VHQsaXNGb3JtRGF0YTpIdCxpc0FycmF5QnVmZmVyVmlldzpHdCxpc1N0cmluZzpQdCxpc051bWJlcjpFZSxpc0Jvb2xlYW46THQsaXNPYmplY3Q6Y0EsaXNQbGFpbk9iamVjdDpDQSxpc1VuZGVmaW5lZDpYLGlzRGF0ZTpPdCxpc0ZpbGU6eHQsaXNCbG9iOkp0LGlzUmVnRXhwOnRyLGlzRnVuY3Rpb246VSxpc1N0cmVhbTpNdCxpc1VSTFNlYXJjaFBhcmFtczpZdCxpc1R5cGVkQXJyYXk6VnQsaXNGaWxlTGlzdDpXdCxmb3JFYWNoOiQsbWVyZ2U6TEEsZXh0ZW5kOkt0LHRyaW06cXQsc3RyaXBCT006anQsaW5oZXJpdHM6dnQsdG9GbGF0T2JqZWN0Ol90LGtpbmRPZjpsQSxraW5kT2ZUZXN0OlAsZW5kc1dpdGg6enQsdG9BcnJheTpadCxmb3JFYWNoRW50cnk6WHQsbWF0Y2hBbGw6JHQsaXNIVE1MRm9ybTpBcixoYXNPd25Qcm9wZXJ0eTpmZSxoYXNPd25Qcm9wOmZlLHJlZHVjZURlc2NyaXB0b3JzOmRlLGZyZWV6ZU1ldGhvZHM6cnIsdG9PYmplY3RTZXQ6b3IsdG9DYW1lbENhc2U6ZXIsbm9vcDpucix0b0Zpbml0ZU51bWJlcjppcixmaW5kS2V5OlFlLGdsb2JhbDpwZSxpc0NvbnRleHREZWZpbmVkOm1lLEFMUEhBQkVUOnllLGdlbmVyYXRlU3RyaW5nOmFyLGlzU3BlY0NvbXBsaWFudEZvcm06c3IsdG9KU09OT2JqZWN0OklyLGlzQXN5bmNGbjpncixpc1RoZW5hYmxlOkJyfTtmdW5jdGlvbiBLKEEsZSx0LHIsbil7RXJyb3IuY2FsbCh0aGlzKSxFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT9FcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLHRoaXMuY29uc3RydWN0b3IpOnRoaXMuc3RhY2s9bmV3IEVycm9yKCkuc3RhY2ssdGhpcy5tZXNzYWdlPUEsdGhpcy5uYW1lPSJBeGlvc0Vycm9yIixlJiYodGhpcy5jb2RlPWUpLHQmJih0aGlzLmNvbmZpZz10KSxyJiYodGhpcy5yZXF1ZXN0PXIpLG4mJih0aGlzLnJlc3BvbnNlPW4pfWcuaW5oZXJpdHMoSyxFcnJvcix7dG9KU09OOmZ1bmN0aW9uKCl7cmV0dXJue21lc3NhZ2U6dGhpcy5tZXNzYWdlLG5hbWU6dGhpcy5uYW1lLGRlc2NyaXB0aW9uOnRoaXMuZGVzY3JpcHRpb24sbnVtYmVyOnRoaXMubnVtYmVyLGZpbGVOYW1lOnRoaXMuZmlsZU5hbWUsbGluZU51bWJlcjp0aGlzLmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOnRoaXMuY29sdW1uTnVtYmVyLHN0YWNrOnRoaXMuc3RhY2ssY29uZmlnOmcudG9KU09OT2JqZWN0KHRoaXMuY29uZmlnKSxjb2RlOnRoaXMuY29kZSxzdGF0dXM6dGhpcy5yZXNwb25zZSYmdGhpcy5yZXNwb25zZS5zdGF0dXM/dGhpcy5yZXNwb25zZS5zdGF0dXM6bnVsbH19fSk7dmFyIGhlPUsucHJvdG90eXBlLHdlPXt9O1siRVJSX0JBRF9PUFRJT05fVkFMVUUiLCJFUlJfQkFEX09QVElPTiIsIkVDT05OQUJPUlRFRCIsIkVUSU1FRE9VVCIsIkVSUl9ORVRXT1JLIiwiRVJSX0ZSX1RPT19NQU5ZX1JFRElSRUNUUyIsIkVSUl9ERVBSRUNBVEVEIiwiRVJSX0JBRF9SRVNQT05TRSIsIkVSUl9CQURfUkVRVUVTVCIsIkVSUl9DQU5DRUxFRCIsIkVSUl9OT1RfU1VQUE9SVCIsIkVSUl9JTlZBTElEX1VSTCJdLmZvckVhY2goQT0+e3dlW0FdPXt2YWx1ZTpBfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEssd2UpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShoZSwiaXNBeGlvc0Vycm9yIix7dmFsdWU6ITB9KTtLLmZyb209KEEsZSx0LHIsbixvKT0+e2xldCBpPU9iamVjdC5jcmVhdGUoaGUpO3JldHVybiBnLnRvRmxhdE9iamVjdChBLGksZnVuY3Rpb24oZil7cmV0dXJuIGYhPT1FcnJvci5wcm90b3R5cGV9LEI9PkIhPT0iaXNBeGlvc0Vycm9yIiksSy5jYWxsKGksQS5tZXNzYWdlLGUsdCxyLG4pLGkuY2F1c2U9QSxpLm5hbWU9QS5uYW1lLG8mJk9iamVjdC5hc3NpZ24oaSxvKSxpfTt2YXIgcD1LO3ZhciB1QT1udWxsO2Z1bmN0aW9uIHhBKEEpe3JldHVybiBnLmlzUGxhaW5PYmplY3QoQSl8fGcuaXNBcnJheShBKX1mdW5jdGlvbiBTZShBKXtyZXR1cm4gZy5lbmRzV2l0aChBLCJbXSIpP0Euc2xpY2UoMCwtMik6QX1mdW5jdGlvbiBEZShBLGUsdCl7cmV0dXJuIEE/QS5jb25jYXQoZSkubWFwKGZ1bmN0aW9uKG4sbyl7cmV0dXJuIG49U2UobiksIXQmJm8/IlsiK24rIl0iOm59KS5qb2luKHQ/Ii4iOiIiKTplfWZ1bmN0aW9uIENyKEEpe3JldHVybiBnLmlzQXJyYXkoQSkmJiFBLnNvbWUoeEEpfXZhciBscj1nLnRvRmxhdE9iamVjdChnLHt9LG51bGwsZnVuY3Rpb24oZSl7cmV0dXJuL15pc1tBLVpdLy50ZXN0KGUpfSk7ZnVuY3Rpb24gZnIoQSxlLHQpe2lmKCFnLmlzT2JqZWN0KEEpKXRocm93IG5ldyBUeXBlRXJyb3IoInRhcmdldCBtdXN0IGJlIGFuIG9iamVjdCIpO2U9ZXx8bmV3KHVBfHxGb3JtRGF0YSksdD1nLnRvRmxhdE9iamVjdCh0LHttZXRhVG9rZW5zOiEwLGRvdHM6ITEsaW5kZXhlczohMX0sITEsZnVuY3Rpb24odSxRKXtyZXR1cm4hZy5pc1VuZGVmaW5lZChRW3VdKX0pO2xldCByPXQubWV0YVRva2VucyxuPXQudmlzaXRvcnx8cyxvPXQuZG90cyxpPXQuaW5kZXhlcyxmPSh0LkJsb2J8fHR5cGVvZiBCbG9iPCJ1IiYmQmxvYikmJmcuaXNTcGVjQ29tcGxpYW50Rm9ybShlKTtpZighZy5pc0Z1bmN0aW9uKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoInZpc2l0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uIik7ZnVuY3Rpb24gQyhsKXtpZihsPT09bnVsbClyZXR1cm4iIjtpZihnLmlzRGF0ZShsKSlyZXR1cm4gbC50b0lTT1N0cmluZygpO2lmKCFmJiZnLmlzQmxvYihsKSl0aHJvdyBuZXcgcCgiQmxvYiBpcyBub3Qgc3VwcG9ydGVkLiBVc2UgYSBCdWZmZXIgaW5zdGVhZC4iKTtyZXR1cm4gZy5pc0FycmF5QnVmZmVyKGwpfHxnLmlzVHlwZWRBcnJheShsKT9mJiZ0eXBlb2YgQmxvYj09ImZ1bmN0aW9uIj9uZXcgQmxvYihbbF0pOkJ1ZmZlci5mcm9tKGwpOmx9ZnVuY3Rpb24gcyhsLHUsUSl7bGV0IG09bDtpZihsJiYhUSYmdHlwZW9mIGw9PSJvYmplY3QiKXtpZihnLmVuZHNXaXRoKHUsInt9IikpdT1yP3U6dS5zbGljZSgwLC0yKSxsPUpTT04uc3RyaW5naWZ5KGwpO2Vsc2UgaWYoZy5pc0FycmF5KGwpJiZDcihsKXx8KGcuaXNGaWxlTGlzdChsKXx8Zy5lbmRzV2l0aCh1LCJbXSIpKSYmKG09Zy50b0FycmF5KGwpKSlyZXR1cm4gdT1TZSh1KSxtLmZvckVhY2goZnVuY3Rpb24oVCxmdCl7IShnLmlzVW5kZWZpbmVkKFQpfHxUPT09bnVsbCkmJmUuYXBwZW5kKGk9PT0hMD9EZShbdV0sZnQsbyk6aT09PW51bGw/dTp1KyJbXSIsQyhUKSl9KSwhMX1yZXR1cm4geEEobCk/ITA6KGUuYXBwZW5kKERlKFEsdSxvKSxDKGwpKSwhMSl9bGV0IGE9W10sYz1PYmplY3QuYXNzaWduKGxyLHtkZWZhdWx0VmlzaXRvcjpzLGNvbnZlcnRWYWx1ZTpDLGlzVmlzaXRhYmxlOnhBfSk7ZnVuY3Rpb24gSShsLHUpe2lmKCFnLmlzVW5kZWZpbmVkKGwpKXtpZihhLmluZGV4T2YobCkhPT0tMSl0aHJvdyBFcnJvcigiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGluICIrdS5qb2luKCIuIikpO2EucHVzaChsKSxnLmZvckVhY2gobCxmdW5jdGlvbihtLE4peyghKGcuaXNVbmRlZmluZWQobSl8fG09PT1udWxsKSYmbi5jYWxsKGUsbSxnLmlzU3RyaW5nKE4pP04udHJpbSgpOk4sdSxjKSk9PT0hMCYmSShtLHU/dS5jb25jYXQoTik6W05dKX0pLGEucG9wKCl9fWlmKCFnLmlzT2JqZWN0KEEpKXRocm93IG5ldyBUeXBlRXJyb3IoImRhdGEgbXVzdCBiZSBhbiBvYmplY3QiKTtyZXR1cm4gSShBKSxlfXZhciBPPWZyO2Z1bmN0aW9uIFJlKEEpe2xldCBlPXsiISI6IiUyMSIsIiciOiIlMjciLCIoIjoiJTI4IiwiKSI6IiUyOSIsIn4iOiIlN0UiLCIlMjAiOiIrIiwiJTAwIjoiXDAifTtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEEpLnJlcGxhY2UoL1shJygpfl18JTIwfCUwMC9nLGZ1bmN0aW9uKHIpe3JldHVybiBlW3JdfSl9ZnVuY3Rpb24ga2UoQSxlKXt0aGlzLl9wYWlycz1bXSxBJiZPKEEsdGhpcyxlKX12YXIgYmU9a2UucHJvdG90eXBlO2JlLmFwcGVuZD1mdW5jdGlvbihlLHQpe3RoaXMuX3BhaXJzLnB1c2goW2UsdF0pfTtiZS50b1N0cmluZz1mdW5jdGlvbihlKXtsZXQgdD1lP2Z1bmN0aW9uKHIpe3JldHVybiBlLmNhbGwodGhpcyxyLFJlKX06UmU7cmV0dXJuIHRoaXMuX3BhaXJzLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gdChuWzBdKSsiPSIrdChuWzFdKX0sIiIpLmpvaW4oIiYiKX07dmFyIEVBPWtlO2Z1bmN0aW9uIGNyKEEpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoQSkucmVwbGFjZSgvJTNBL2dpLCI6IikucmVwbGFjZSgvJTI0L2csIiQiKS5yZXBsYWNlKC8lMkMvZ2ksIiwiKS5yZXBsYWNlKC8lMjAvZywiKyIpLnJlcGxhY2UoLyU1Qi9naSwiWyIpLnJlcGxhY2UoLyU1RC9naSwiXSIpfWZ1bmN0aW9uIEFBKEEsZSx0KXtpZighZSlyZXR1cm4gQTtsZXQgcj10JiZ0LmVuY29kZXx8Y3Isbj10JiZ0LnNlcmlhbGl6ZSxvO2lmKG4/bz1uKGUsdCk6bz1nLmlzVVJMU2VhcmNoUGFyYW1zKGUpP2UudG9TdHJpbmcoKTpuZXcgRUEoZSx0KS50b1N0cmluZyhyKSxvKXtsZXQgaT1BLmluZGV4T2YoIiMiKTtpIT09LTEmJihBPUEuc2xpY2UoMCxpKSksQSs9KEEuaW5kZXhPZigiPyIpPT09LTE/Ij8iOiImIikrb31yZXR1cm4gQX12YXIgSkE9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmhhbmRsZXJzPVtdfXVzZShlLHQscil7cmV0dXJuIHRoaXMuaGFuZGxlcnMucHVzaCh7ZnVsZmlsbGVkOmUscmVqZWN0ZWQ6dCxzeW5jaHJvbm91czpyP3Iuc3luY2hyb25vdXM6ITEscnVuV2hlbjpyP3IucnVuV2hlbjpudWxsfSksdGhpcy5oYW5kbGVycy5sZW5ndGgtMX1lamVjdChlKXt0aGlzLmhhbmRsZXJzW2VdJiYodGhpcy5oYW5kbGVyc1tlXT1udWxsKX1jbGVhcigpe3RoaXMuaGFuZGxlcnMmJih0aGlzLmhhbmRsZXJzPVtdKX1mb3JFYWNoKGUpe2cuZm9yRWFjaCh0aGlzLmhhbmRsZXJzLGZ1bmN0aW9uKHIpe3IhPT1udWxsJiZlKHIpfSl9fSxXQT1KQTt2YXIgUUE9e3NpbGVudEpTT05QYXJzaW5nOiEwLGZvcmNlZEpTT05QYXJzaW5nOiEwLGNsYXJpZnlUaW1lb3V0RXJyb3I6ITF9O3ZhciBGZT10eXBlb2YgVVJMU2VhcmNoUGFyYW1zPCJ1Ij9VUkxTZWFyY2hQYXJhbXM6RUE7dmFyIFVlPXR5cGVvZiBGb3JtRGF0YTwidSI/Rm9ybURhdGE6bnVsbDt2YXIgTmU9dHlwZW9mIEJsb2I8InUiP0Jsb2I6bnVsbDt2YXIgVGU9e2lzQnJvd3NlcjohMCxjbGFzc2VzOntVUkxTZWFyY2hQYXJhbXM6RmUsRm9ybURhdGE6VWUsQmxvYjpOZX0scHJvdG9jb2xzOlsiaHR0cCIsImh0dHBzIiwiZmlsZSIsImJsb2IiLCJ1cmwiLCJkYXRhIl19O3ZhciBNQT17fTt1dChNQSx7aGFzQnJvd3NlckVudjooKT0+R2UsaGFzU3RhbmRhcmRCcm93c2VyRW52OigpPT51cixoYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnY6KCk9PkVyfSk7dmFyIEdlPXR5cGVvZiB3aW5kb3c8InUiJiZ0eXBlb2YgZG9jdW1lbnQ8InUiLHVyPShBPT5HZSYmWyJSZWFjdE5hdGl2ZSIsIk5hdGl2ZVNjcmlwdCIsIk5TIl0uaW5kZXhPZihBKTwwKSh0eXBlb2YgbmF2aWdhdG9yPCJ1IiYmbmF2aWdhdG9yLnByb2R1Y3QpLEVyPXR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZTwidSImJnNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZSYmdHlwZW9mIHNlbGYuaW1wb3J0U2NyaXB0cz09ImZ1bmN0aW9uIjt2YXIgUj17Li4uTUEsLi4uVGV9O2Z1bmN0aW9uIEhBKEEsZSl7cmV0dXJuIE8oQSxuZXcgUi5jbGFzc2VzLlVSTFNlYXJjaFBhcmFtcyxPYmplY3QuYXNzaWduKHt2aXNpdG9yOmZ1bmN0aW9uKHQscixuLG8pe3JldHVybiBSLmlzTm9kZSYmZy5pc0J1ZmZlcih0KT8odGhpcy5hcHBlbmQocix0LnRvU3RyaW5nKCJiYXNlNjQiKSksITEpOm8uZGVmYXVsdFZpc2l0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0sZSkpfWZ1bmN0aW9uIFFyKEEpe3JldHVybiBnLm1hdGNoQWxsKC9cdyt8XFsoXHcqKV0vZyxBKS5tYXAoZT0+ZVswXT09PSJbXSI/IiI6ZVsxXXx8ZVswXSl9ZnVuY3Rpb24gcHIoQSl7bGV0IGU9e30sdD1PYmplY3Qua2V5cyhBKSxyLG49dC5sZW5ndGgsbztmb3Iocj0wO3I8bjtyKyspbz10W3JdLGVbb109QVtvXTtyZXR1cm4gZX1mdW5jdGlvbiBtcihBKXtmdW5jdGlvbiBlKHQscixuLG8pe2xldCBpPXRbbysrXTtpZihpPT09Il9fcHJvdG9fXyIpcmV0dXJuITA7bGV0IEI9TnVtYmVyLmlzRmluaXRlKCtpKSxmPW8+PXQubGVuZ3RoO3JldHVybiBpPSFpJiZnLmlzQXJyYXkobik/bi5sZW5ndGg6aSxmPyhnLmhhc093blByb3AobixpKT9uW2ldPVtuW2ldLHJdOm5baV09ciwhQik6KCghbltpXXx8IWcuaXNPYmplY3QobltpXSkpJiYobltpXT1bXSksZSh0LHIsbltpXSxvKSYmZy5pc0FycmF5KG5baV0pJiYobltpXT1wcihuW2ldKSksIUIpfWlmKGcuaXNGb3JtRGF0YShBKSYmZy5pc0Z1bmN0aW9uKEEuZW50cmllcykpe2xldCB0PXt9O3JldHVybiBnLmZvckVhY2hFbnRyeShBLChyLG4pPT57ZShRcihyKSxuLHQsMCl9KSx0fXJldHVybiBudWxsfXZhciBwQT1tcjtmdW5jdGlvbiBkcihBLGUsdCl7aWYoZy5pc1N0cmluZyhBKSl0cnl7cmV0dXJuKGV8fEpTT04ucGFyc2UpKEEpLGcudHJpbShBKX1jYXRjaChyKXtpZihyLm5hbWUhPT0iU3ludGF4RXJyb3IiKXRocm93IHJ9cmV0dXJuKHR8fEpTT04uc3RyaW5naWZ5KShBKX12YXIgWUE9e3RyYW5zaXRpb25hbDpRQSxhZGFwdGVyOlsieGhyIiwiaHR0cCJdLHRyYW5zZm9ybVJlcXVlc3Q6W2Z1bmN0aW9uKGUsdCl7bGV0IHI9dC5nZXRDb250ZW50VHlwZSgpfHwiIixuPXIuaW5kZXhPZigiYXBwbGljYXRpb24vanNvbiIpPi0xLG89Zy5pc09iamVjdChlKTtpZihvJiZnLmlzSFRNTEZvcm0oZSkmJihlPW5ldyBGb3JtRGF0YShlKSksZy5pc0Zvcm1EYXRhKGUpKXJldHVybiBuP0pTT04uc3RyaW5naWZ5KHBBKGUpKTplO2lmKGcuaXNBcnJheUJ1ZmZlcihlKXx8Zy5pc0J1ZmZlcihlKXx8Zy5pc1N0cmVhbShlKXx8Zy5pc0ZpbGUoZSl8fGcuaXNCbG9iKGUpKXJldHVybiBlO2lmKGcuaXNBcnJheUJ1ZmZlclZpZXcoZSkpcmV0dXJuIGUuYnVmZmVyO2lmKGcuaXNVUkxTZWFyY2hQYXJhbXMoZSkpcmV0dXJuIHQuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04IiwhMSksZS50b1N0cmluZygpO2xldCBCO2lmKG8pe2lmKHIuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik+LTEpcmV0dXJuIEhBKGUsdGhpcy5mb3JtU2VyaWFsaXplcikudG9TdHJpbmcoKTtpZigoQj1nLmlzRmlsZUxpc3QoZSkpfHxyLmluZGV4T2YoIm11bHRpcGFydC9mb3JtLWRhdGEiKT4tMSl7bGV0IGY9dGhpcy5lbnYmJnRoaXMuZW52LkZvcm1EYXRhO3JldHVybiBPKEI/eyJmaWxlc1tdIjplfTplLGYmJm5ldyBmLHRoaXMuZm9ybVNlcmlhbGl6ZXIpfX1yZXR1cm4gb3x8bj8odC5zZXRDb250ZW50VHlwZSgiYXBwbGljYXRpb24vanNvbiIsITEpLGRyKGUpKTplfV0sdHJhbnNmb3JtUmVzcG9uc2U6W2Z1bmN0aW9uKGUpe2xldCB0PXRoaXMudHJhbnNpdGlvbmFsfHxZQS50cmFuc2l0aW9uYWwscj10JiZ0LmZvcmNlZEpTT05QYXJzaW5nLG49dGhpcy5yZXNwb25zZVR5cGU9PT0ianNvbiI7aWYoZSYmZy5pc1N0cmluZyhlKSYmKHImJiF0aGlzLnJlc3BvbnNlVHlwZXx8bikpe2xldCBpPSEodCYmdC5zaWxlbnRKU09OUGFyc2luZykmJm47dHJ5e3JldHVybiBKU09OLnBhcnNlKGUpfWNhdGNoKEIpe2lmKGkpdGhyb3cgQi5uYW1lPT09IlN5bnRheEVycm9yIj9wLmZyb20oQixwLkVSUl9CQURfUkVTUE9OU0UsdGhpcyxudWxsLHRoaXMucmVzcG9uc2UpOkJ9fXJldHVybiBlfV0sdGltZW91dDowLHhzcmZDb29raWVOYW1lOiJYU1JGLVRPS0VOIix4c3JmSGVhZGVyTmFtZToiWC1YU1JGLVRPS0VOIixtYXhDb250ZW50TGVuZ3RoOi0xLG1heEJvZHlMZW5ndGg6LTEsZW52OntGb3JtRGF0YTpSLmNsYXNzZXMuRm9ybURhdGEsQmxvYjpSLmNsYXNzZXMuQmxvYn0sdmFsaWRhdGVTdGF0dXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU+PTIwMCYmZTwzMDB9LGhlYWRlcnM6e2NvbW1vbjp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyoiLCJDb250ZW50LVR5cGUiOnZvaWQgMH19fTtnLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwicG9zdCIsInB1dCIsInBhdGNoIl0sQT0+e1lBLmhlYWRlcnNbQV09e319KTt2YXIgaj1ZQTt2YXIgeXI9Zy50b09iamVjdFNldChbImFnZSIsImF1dGhvcml6YXRpb24iLCJjb250ZW50LWxlbmd0aCIsImNvbnRlbnQtdHlwZSIsImV0YWciLCJleHBpcmVzIiwiZnJvbSIsImhvc3QiLCJpZi1tb2RpZmllZC1zaW5jZSIsImlmLXVubW9kaWZpZWQtc2luY2UiLCJsYXN0LW1vZGlmaWVkIiwibG9jYXRpb24iLCJtYXgtZm9yd2FyZHMiLCJwcm94eS1hdXRob3JpemF0aW9uIiwicmVmZXJlciIsInJldHJ5LWFmdGVyIiwidXNlci1hZ2VudCJdKSxQZT1BPT57bGV0IGU9e30sdCxyLG47cmV0dXJuIEEmJkEuc3BsaXQoYApgKS5mb3JFYWNoKGZ1bmN0aW9uKGkpe249aS5pbmRleE9mKCI6IiksdD1pLnN1YnN0cmluZygwLG4pLnRyaW0oKS50b0xvd2VyQ2FzZSgpLHI9aS5zdWJzdHJpbmcobisxKS50cmltKCksISghdHx8ZVt0XSYmeXJbdF0pJiYodD09PSJzZXQtY29va2llIj9lW3RdP2VbdF0ucHVzaChyKTplW3RdPVtyXTplW3RdPWVbdF0/ZVt0XSsiLCAiK3I6cil9KSxlfTt2YXIgTGU9U3ltYm9sKCJpbnRlcm5hbHMiKTtmdW5jdGlvbiBlQShBKXtyZXR1cm4gQSYmU3RyaW5nKEEpLnRyaW0oKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIG1BKEEpe3JldHVybiBBPT09ITF8fEE9PW51bGw/QTpnLmlzQXJyYXkoQSk/QS5tYXAobUEpOlN0cmluZyhBKX1mdW5jdGlvbiBocihBKXtsZXQgZT1PYmplY3QuY3JlYXRlKG51bGwpLHQ9LyhbXlxzLDs9XSspXHMqKD86PVxzKihbXiw7XSspKT8vZyxyO2Zvcig7cj10LmV4ZWMoQSk7KWVbclsxXV09clsyXTtyZXR1cm4gZX12YXIgd3I9QT0+L15bLV9hLXpBLVowLTleYHx+LCEjJCUmJyorLl0rJC8udGVzdChBLnRyaW0oKSk7ZnVuY3Rpb24gcUEoQSxlLHQscixuKXtpZihnLmlzRnVuY3Rpb24ocikpcmV0dXJuIHIuY2FsbCh0aGlzLGUsdCk7aWYobiYmKGU9dCksISFnLmlzU3RyaW5nKGUpKXtpZihnLmlzU3RyaW5nKHIpKXJldHVybiBlLmluZGV4T2YocikhPT0tMTtpZihnLmlzUmVnRXhwKHIpKXJldHVybiByLnRlc3QoZSl9fWZ1bmN0aW9uIERyKEEpe3JldHVybiBBLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoLyhbYS16XGRdKShcdyopL2csKGUsdCxyKT0+dC50b1VwcGVyQ2FzZSgpK3IpfWZ1bmN0aW9uIFNyKEEsZSl7bGV0IHQ9Zy50b0NhbWVsQ2FzZSgiICIrZSk7WyJnZXQiLCJzZXQiLCJoYXMiXS5mb3JFYWNoKHI9PntPYmplY3QuZGVmaW5lUHJvcGVydHkoQSxyK3Qse3ZhbHVlOmZ1bmN0aW9uKG4sbyxpKXtyZXR1cm4gdGhpc1tyXS5jYWxsKHRoaXMsZSxuLG8saSl9LGNvbmZpZ3VyYWJsZTohMH0pfSl9dmFyIHY9Y2xhc3N7Y29uc3RydWN0b3IoZSl7ZSYmdGhpcy5zZXQoZSl9c2V0KGUsdCxyKXtsZXQgbj10aGlzO2Z1bmN0aW9uIG8oQixmLEMpe2xldCBzPWVBKGYpO2lmKCFzKXRocm93IG5ldyBFcnJvcigiaGVhZGVyIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmciKTtsZXQgYT1nLmZpbmRLZXkobixzKTsoIWF8fG5bYV09PT12b2lkIDB8fEM9PT0hMHx8Qz09PXZvaWQgMCYmblthXSE9PSExKSYmKG5bYXx8Zl09bUEoQikpfWxldCBpPShCLGYpPT5nLmZvckVhY2goQiwoQyxzKT0+byhDLHMsZikpO3JldHVybiBnLmlzUGxhaW5PYmplY3QoZSl8fGUgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yP2koZSx0KTpnLmlzU3RyaW5nKGUpJiYoZT1lLnRyaW0oKSkmJiF3cihlKT9pKFBlKGUpLHQpOmUhPW51bGwmJm8odCxlLHIpLHRoaXN9Z2V0KGUsdCl7aWYoZT1lQShlKSxlKXtsZXQgcj1nLmZpbmRLZXkodGhpcyxlKTtpZihyKXtsZXQgbj10aGlzW3JdO2lmKCF0KXJldHVybiBuO2lmKHQ9PT0hMClyZXR1cm4gaHIobik7aWYoZy5pc0Z1bmN0aW9uKHQpKXJldHVybiB0LmNhbGwodGhpcyxuLHIpO2lmKGcuaXNSZWdFeHAodCkpcmV0dXJuIHQuZXhlYyhuKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJwYXJzZXIgbXVzdCBiZSBib29sZWFufHJlZ2V4cHxmdW5jdGlvbiIpfX19aGFzKGUsdCl7aWYoZT1lQShlKSxlKXtsZXQgcj1nLmZpbmRLZXkodGhpcyxlKTtyZXR1cm4hIShyJiZ0aGlzW3JdIT09dm9pZCAwJiYoIXR8fHFBKHRoaXMsdGhpc1tyXSxyLHQpKSl9cmV0dXJuITF9ZGVsZXRlKGUsdCl7bGV0IHI9dGhpcyxuPSExO2Z1bmN0aW9uIG8oaSl7aWYoaT1lQShpKSxpKXtsZXQgQj1nLmZpbmRLZXkocixpKTtCJiYoIXR8fHFBKHIscltCXSxCLHQpKSYmKGRlbGV0ZSByW0JdLG49ITApfX1yZXR1cm4gZy5pc0FycmF5KGUpP2UuZm9yRWFjaChvKTpvKGUpLG59Y2xlYXIoZSl7bGV0IHQ9T2JqZWN0LmtleXModGhpcykscj10Lmxlbmd0aCxuPSExO2Zvcig7ci0tOyl7bGV0IG89dFtyXTsoIWV8fHFBKHRoaXMsdGhpc1tvXSxvLGUsITApKSYmKGRlbGV0ZSB0aGlzW29dLG49ITApfXJldHVybiBufW5vcm1hbGl6ZShlKXtsZXQgdD10aGlzLHI9e307cmV0dXJuIGcuZm9yRWFjaCh0aGlzLChuLG8pPT57bGV0IGk9Zy5maW5kS2V5KHIsbyk7aWYoaSl7dFtpXT1tQShuKSxkZWxldGUgdFtvXTtyZXR1cm59bGV0IEI9ZT9EcihvKTpTdHJpbmcobykudHJpbSgpO0IhPT1vJiZkZWxldGUgdFtvXSx0W0JdPW1BKG4pLHJbQl09ITB9KSx0aGlzfWNvbmNhdCguLi5lKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5jb25jYXQodGhpcywuLi5lKX10b0pTT04oZSl7bGV0IHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZy5mb3JFYWNoKHRoaXMsKHIsbik9PntyIT1udWxsJiZyIT09ITEmJih0W25dPWUmJmcuaXNBcnJheShyKT9yLmpvaW4oIiwgIik6cil9KSx0fVtTeW1ib2wuaXRlcmF0b3JdKCl7cmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMudG9KU09OKCkpW1N5bWJvbC5pdGVyYXRvcl0oKX10b1N0cmluZygpe3JldHVybiBPYmplY3QuZW50cmllcyh0aGlzLnRvSlNPTigpKS5tYXAoKFtlLHRdKT0+ZSsiOiAiK3QpLmpvaW4oYApgKX1nZXRbU3ltYm9sLnRvU3RyaW5nVGFnXSgpe3JldHVybiJBeGlvc0hlYWRlcnMifXN0YXRpYyBmcm9tKGUpe3JldHVybiBlIGluc3RhbmNlb2YgdGhpcz9lOm5ldyB0aGlzKGUpfXN0YXRpYyBjb25jYXQoZSwuLi50KXtsZXQgcj1uZXcgdGhpcyhlKTtyZXR1cm4gdC5mb3JFYWNoKG49PnIuc2V0KG4pKSxyfXN0YXRpYyBhY2Nlc3NvcihlKXtsZXQgcj0odGhpc1tMZV09dGhpc1tMZV09e2FjY2Vzc29yczp7fX0pLmFjY2Vzc29ycyxuPXRoaXMucHJvdG90eXBlO2Z1bmN0aW9uIG8oaSl7bGV0IEI9ZUEoaSk7cltCXXx8KFNyKG4saSkscltCXT0hMCl9cmV0dXJuIGcuaXNBcnJheShlKT9lLmZvckVhY2gobyk6byhlKSx0aGlzfX07di5hY2Nlc3NvcihbIkNvbnRlbnQtVHlwZSIsIkNvbnRlbnQtTGVuZ3RoIiwiQWNjZXB0IiwiQWNjZXB0LUVuY29kaW5nIiwiVXNlci1BZ2VudCIsIkF1dGhvcml6YXRpb24iXSk7Zy5yZWR1Y2VEZXNjcmlwdG9ycyh2LnByb3RvdHlwZSwoe3ZhbHVlOkF9LGUpPT57bGV0IHQ9ZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSk7cmV0dXJue2dldDooKT0+QSxzZXQocil7dGhpc1t0XT1yfX19KTtnLmZyZWV6ZU1ldGhvZHModik7dmFyIGs9djtmdW5jdGlvbiB0QShBLGUpe2xldCB0PXRoaXN8fGoscj1lfHx0LG49ay5mcm9tKHIuaGVhZGVycyksbz1yLmRhdGE7cmV0dXJuIGcuZm9yRWFjaChBLGZ1bmN0aW9uKEIpe289Qi5jYWxsKHQsbyxuLm5vcm1hbGl6ZSgpLGU/ZS5zdGF0dXM6dm9pZCAwKX0pLG4ubm9ybWFsaXplKCksb31mdW5jdGlvbiByQShBKXtyZXR1cm4hIShBJiZBLl9fQ0FOQ0VMX18pfWZ1bmN0aW9uIE9lKEEsZSx0KXtwLmNhbGwodGhpcyxBPz8iY2FuY2VsZWQiLHAuRVJSX0NBTkNFTEVELGUsdCksdGhpcy5uYW1lPSJDYW5jZWxlZEVycm9yIn1nLmluaGVyaXRzKE9lLHAse19fQ0FOQ0VMX186ITB9KTt2YXIgeD1PZTtmdW5jdGlvbiBLQShBLGUsdCl7bGV0IHI9dC5jb25maWcudmFsaWRhdGVTdGF0dXM7IXQuc3RhdHVzfHwhcnx8cih0LnN0YXR1cyk/QSh0KTplKG5ldyBwKCJSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICIrdC5zdGF0dXMsW3AuRVJSX0JBRF9SRVFVRVNULHAuRVJSX0JBRF9SRVNQT05TRV1bTWF0aC5mbG9vcih0LnN0YXR1cy8xMDApLTRdLHQuY29uZmlnLHQucmVxdWVzdCx0KSl9dmFyIHhlPVIuaGFzU3RhbmRhcmRCcm93c2VyRW52P3t3cml0ZShBLGUsdCxyLG4sbyl7bGV0IGk9W0ErIj0iK2VuY29kZVVSSUNvbXBvbmVudChlKV07Zy5pc051bWJlcih0KSYmaS5wdXNoKCJleHBpcmVzPSIrbmV3IERhdGUodCkudG9HTVRTdHJpbmcoKSksZy5pc1N0cmluZyhyKSYmaS5wdXNoKCJwYXRoPSIrciksZy5pc1N0cmluZyhuKSYmaS5wdXNoKCJkb21haW49IituKSxvPT09ITAmJmkucHVzaCgic2VjdXJlIiksZG9jdW1lbnQuY29va2llPWkuam9pbigiOyAiKX0scmVhZChBKXtsZXQgZT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58O1xccyopKCIrQSsiKT0oW147XSopIikpO3JldHVybiBlP2RlY29kZVVSSUNvbXBvbmVudChlWzNdKTpudWxsfSxyZW1vdmUoQSl7dGhpcy53cml0ZShBLCIiLERhdGUubm93KCktODY0ZTUpfX06e3dyaXRlKCl7fSxyZWFkKCl7cmV0dXJuIG51bGx9LHJlbW92ZSgpe319O2Z1bmN0aW9uIGpBKEEpe3JldHVybi9eKFthLXpdW2EtelxkK1wtLl0qOik/XC9cLy9pLnRlc3QoQSl9ZnVuY3Rpb24gdkEoQSxlKXtyZXR1cm4gZT9BLnJlcGxhY2UoL1wvP1wvJC8sIiIpKyIvIitlLnJlcGxhY2UoL15cLysvLCIiKTpBfWZ1bmN0aW9uIG9BKEEsZSl7cmV0dXJuIEEmJiFqQShlKT92QShBLGUpOmV9dmFyIEplPVIuaGFzU3RhbmRhcmRCcm93c2VyRW52P2Z1bmN0aW9uKCl7bGV0IGU9Lyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSxyO2Z1bmN0aW9uIG4obyl7bGV0IGk9bztyZXR1cm4gZSYmKHQuc2V0QXR0cmlidXRlKCJocmVmIixpKSxpPXQuaHJlZiksdC5zZXRBdHRyaWJ1dGUoImhyZWYiLGkpLHtocmVmOnQuaHJlZixwcm90b2NvbDp0LnByb3RvY29sP3QucHJvdG9jb2wucmVwbGFjZSgvOiQvLCIiKToiIixob3N0OnQuaG9zdCxzZWFyY2g6dC5zZWFyY2g/dC5zZWFyY2gucmVwbGFjZSgvXlw/LywiIik6IiIsaGFzaDp0Lmhhc2g/dC5oYXNoLnJlcGxhY2UoL14jLywiIik6IiIsaG9zdG5hbWU6dC5ob3N0bmFtZSxwb3J0OnQucG9ydCxwYXRobmFtZTp0LnBhdGhuYW1lLmNoYXJBdCgwKT09PSIvIj90LnBhdGhuYW1lOiIvIit0LnBhdGhuYW1lfX1yZXR1cm4gcj1uKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSxmdW5jdGlvbihpKXtsZXQgQj1nLmlzU3RyaW5nKGkpP24oaSk6aTtyZXR1cm4gQi5wcm90b2NvbD09PXIucHJvdG9jb2wmJkIuaG9zdD09PXIuaG9zdH19KCk6ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4hMH19KCk7ZnVuY3Rpb24gX0EoQSl7bGV0IGU9L14oWy0rXHddezEsMjV9KSg6P1wvXC98OikvLmV4ZWMoQSk7cmV0dXJuIGUmJmVbMV18fCIifWZ1bmN0aW9uIFJyKEEsZSl7QT1BfHwxMDtsZXQgdD1uZXcgQXJyYXkoQSkscj1uZXcgQXJyYXkoQSksbj0wLG89MCxpO3JldHVybiBlPWUhPT12b2lkIDA/ZToxZTMsZnVuY3Rpb24oZil7bGV0IEM9RGF0ZS5ub3coKSxzPXJbb107aXx8KGk9QyksdFtuXT1mLHJbbl09QztsZXQgYT1vLGM9MDtmb3IoO2EhPT1uOyljKz10W2ErK10sYT1hJUE7aWYobj0obisxKSVBLG49PT1vJiYobz0obysxKSVBKSxDLWk8ZSlyZXR1cm47bGV0IEk9cyYmQy1zO3JldHVybiBJP01hdGgucm91bmQoYyoxZTMvSSk6dm9pZCAwfX12YXIgV2U9UnI7ZnVuY3Rpb24gTWUoQSxlKXtsZXQgdD0wLHI9V2UoNTAsMjUwKTtyZXR1cm4gbj0+e2xldCBvPW4ubG9hZGVkLGk9bi5sZW5ndGhDb21wdXRhYmxlP24udG90YWw6dm9pZCAwLEI9by10LGY9cihCKSxDPW88PWk7dD1vO2xldCBzPXtsb2FkZWQ6byx0b3RhbDppLHByb2dyZXNzOmk/by9pOnZvaWQgMCxieXRlczpCLHJhdGU6Znx8dm9pZCAwLGVzdGltYXRlZDpmJiZpJiZDPyhpLW8pL2Y6dm9pZCAwLGV2ZW50Om59O3NbZT8iZG93bmxvYWQiOiJ1cGxvYWQiXT0hMCxBKHMpfX12YXIga3I9dHlwZW9mIFhNTEh0dHBSZXF1ZXN0PCJ1IixIZT1rciYmZnVuY3Rpb24oQSl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHQscil7bGV0IG49QS5kYXRhLG89ay5mcm9tKEEuaGVhZGVycykubm9ybWFsaXplKCkse3Jlc3BvbnNlVHlwZTppLHdpdGhYU1JGVG9rZW46Qn09QSxmO2Z1bmN0aW9uIEMoKXtBLmNhbmNlbFRva2VuJiZBLmNhbmNlbFRva2VuLnVuc3Vic2NyaWJlKGYpLEEuc2lnbmFsJiZBLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsZil9bGV0IHM7aWYoZy5pc0Zvcm1EYXRhKG4pKXtpZihSLmhhc1N0YW5kYXJkQnJvd3NlckVudnx8Ui5oYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnYpby5zZXRDb250ZW50VHlwZSghMSk7ZWxzZSBpZigocz1vLmdldENvbnRlbnRUeXBlKCkpIT09ITEpe2xldFt1LC4uLlFdPXM/cy5zcGxpdCgiOyIpLm1hcChtPT5tLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pOltdO28uc2V0Q29udGVudFR5cGUoW3V8fCJtdWx0aXBhcnQvZm9ybS1kYXRhIiwuLi5RXS5qb2luKCI7ICIpKX19bGV0IGE9bmV3IFhNTEh0dHBSZXF1ZXN0O2lmKEEuYXV0aCl7bGV0IHU9QS5hdXRoLnVzZXJuYW1lfHwiIixRPUEuYXV0aC5wYXNzd29yZD91bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoQS5hdXRoLnBhc3N3b3JkKSk6IiI7by5zZXQoIkF1dGhvcml6YXRpb24iLCJCYXNpYyAiK2J0b2EodSsiOiIrUSkpfWxldCBjPW9BKEEuYmFzZVVSTCxBLnVybCk7YS5vcGVuKEEubWV0aG9kLnRvVXBwZXJDYXNlKCksQUEoYyxBLnBhcmFtcyxBLnBhcmFtc1NlcmlhbGl6ZXIpLCEwKSxhLnRpbWVvdXQ9QS50aW1lb3V0O2Z1bmN0aW9uIEkoKXtpZighYSlyZXR1cm47bGV0IHU9ay5mcm9tKCJnZXRBbGxSZXNwb25zZUhlYWRlcnMiaW4gYSYmYS5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSksbT17ZGF0YTohaXx8aT09PSJ0ZXh0Inx8aT09PSJqc29uIj9hLnJlc3BvbnNlVGV4dDphLnJlc3BvbnNlLHN0YXR1czphLnN0YXR1cyxzdGF0dXNUZXh0OmEuc3RhdHVzVGV4dCxoZWFkZXJzOnUsY29uZmlnOkEscmVxdWVzdDphfTtLQShmdW5jdGlvbihUKXt0KFQpLEMoKX0sZnVuY3Rpb24oVCl7cihUKSxDKCl9LG0pLGE9bnVsbH1pZigib25sb2FkZW5kImluIGE/YS5vbmxvYWRlbmQ9STphLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFhfHxhLnJlYWR5U3RhdGUhPT00fHxhLnN0YXR1cz09PTAmJiEoYS5yZXNwb25zZVVSTCYmYS5yZXNwb25zZVVSTC5pbmRleE9mKCJmaWxlOiIpPT09MCl8fHNldFRpbWVvdXQoSSl9LGEub25hYm9ydD1mdW5jdGlvbigpe2EmJihyKG5ldyBwKCJSZXF1ZXN0IGFib3J0ZWQiLHAuRUNPTk5BQk9SVEVELEEsYSkpLGE9bnVsbCl9LGEub25lcnJvcj1mdW5jdGlvbigpe3IobmV3IHAoIk5ldHdvcmsgRXJyb3IiLHAuRVJSX05FVFdPUkssQSxhKSksYT1udWxsfSxhLm9udGltZW91dD1mdW5jdGlvbigpe2xldCBRPUEudGltZW91dD8idGltZW91dCBvZiAiK0EudGltZW91dCsibXMgZXhjZWVkZWQiOiJ0aW1lb3V0IGV4Y2VlZGVkIixtPUEudHJhbnNpdGlvbmFsfHxRQTtBLnRpbWVvdXRFcnJvck1lc3NhZ2UmJihRPUEudGltZW91dEVycm9yTWVzc2FnZSkscihuZXcgcChRLG0uY2xhcmlmeVRpbWVvdXRFcnJvcj9wLkVUSU1FRE9VVDpwLkVDT05OQUJPUlRFRCxBLGEpKSxhPW51bGx9LFIuaGFzU3RhbmRhcmRCcm93c2VyRW52JiYoQiYmZy5pc0Z1bmN0aW9uKEIpJiYoQj1CKEEpKSxCfHxCIT09ITEmJkplKGMpKSl7bGV0IHU9QS54c3JmSGVhZGVyTmFtZSYmQS54c3JmQ29va2llTmFtZSYmeGUucmVhZChBLnhzcmZDb29raWVOYW1lKTt1JiZvLnNldChBLnhzcmZIZWFkZXJOYW1lLHUpfW49PT12b2lkIDAmJm8uc2V0Q29udGVudFR5cGUobnVsbCksInNldFJlcXVlc3RIZWFkZXIiaW4gYSYmZy5mb3JFYWNoKG8udG9KU09OKCksZnVuY3Rpb24oUSxtKXthLnNldFJlcXVlc3RIZWFkZXIobSxRKX0pLGcuaXNVbmRlZmluZWQoQS53aXRoQ3JlZGVudGlhbHMpfHwoYS53aXRoQ3JlZGVudGlhbHM9ISFBLndpdGhDcmVkZW50aWFscyksaSYmaSE9PSJqc29uIiYmKGEucmVzcG9uc2VUeXBlPUEucmVzcG9uc2VUeXBlKSx0eXBlb2YgQS5vbkRvd25sb2FkUHJvZ3Jlc3M9PSJmdW5jdGlvbiImJmEuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLE1lKEEub25Eb3dubG9hZFByb2dyZXNzLCEwKSksdHlwZW9mIEEub25VcGxvYWRQcm9ncmVzcz09ImZ1bmN0aW9uIiYmYS51cGxvYWQmJmEudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixNZShBLm9uVXBsb2FkUHJvZ3Jlc3MpKSwoQS5jYW5jZWxUb2tlbnx8QS5zaWduYWwpJiYoZj11PT57YSYmKHIoIXV8fHUudHlwZT9uZXcgeChudWxsLEEsYSk6dSksYS5hYm9ydCgpLGE9bnVsbCl9LEEuY2FuY2VsVG9rZW4mJkEuY2FuY2VsVG9rZW4uc3Vic2NyaWJlKGYpLEEuc2lnbmFsJiYoQS5zaWduYWwuYWJvcnRlZD9mKCk6QS5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLGYpKSk7bGV0IGw9X0EoYyk7aWYobCYmUi5wcm90b2NvbHMuaW5kZXhPZihsKT09PS0xKXtyKG5ldyBwKCJVbnN1cHBvcnRlZCBwcm90b2NvbCAiK2wrIjoiLHAuRVJSX0JBRF9SRVFVRVNULEEpKTtyZXR1cm59YS5zZW5kKG58fG51bGwpfSl9O3ZhciB6QT17aHR0cDp1QSx4aHI6SGV9O2cuZm9yRWFjaCh6QSwoQSxlKT0+e2lmKEEpe3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkoQSwibmFtZSIse3ZhbHVlOmV9KX1jYXRjaHt9T2JqZWN0LmRlZmluZVByb3BlcnR5KEEsImFkYXB0ZXJOYW1lIix7dmFsdWU6ZX0pfX0pO3ZhciBZZT1BPT5gLSAke0F9YCxicj1BPT5nLmlzRnVuY3Rpb24oQSl8fEE9PT1udWxsfHxBPT09ITEsZEE9e2dldEFkYXB0ZXI6QT0+e0E9Zy5pc0FycmF5KEEpP0E6W0FdO2xldHtsZW5ndGg6ZX09QSx0LHIsbj17fTtmb3IobGV0IG89MDtvPGU7bysrKXt0PUFbb107bGV0IGk7aWYocj10LCFicih0KSYmKHI9ekFbKGk9U3RyaW5nKHQpKS50b0xvd2VyQ2FzZSgpXSxyPT09dm9pZCAwKSl0aHJvdyBuZXcgcChgVW5rbm93biBhZGFwdGVyICcke2l9J2ApO2lmKHIpYnJlYWs7bltpfHwiIyIrb109cn1pZighcil7bGV0IG89T2JqZWN0LmVudHJpZXMobikubWFwKChbQixmXSk9PmBhZGFwdGVyICR7Qn0gYCsoZj09PSExPyJpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBlbnZpcm9ubWVudCI6ImlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGJ1aWxkIikpLGk9ZT9vLmxlbmd0aD4xP2BzaW5jZSA6CmArby5tYXAoWWUpLmpvaW4oYApgKToiICIrWWUob1swXSk6ImFzIG5vIGFkYXB0ZXIgc3BlY2lmaWVkIjt0aHJvdyBuZXcgcCgiVGhlcmUgaXMgbm8gc3VpdGFibGUgYWRhcHRlciB0byBkaXNwYXRjaCB0aGUgcmVxdWVzdCAiK2ksIkVSUl9OT1RfU1VQUE9SVCIpfXJldHVybiByfSxhZGFwdGVyczp6QX07ZnVuY3Rpb24gWkEoQSl7aWYoQS5jYW5jZWxUb2tlbiYmQS5jYW5jZWxUb2tlbi50aHJvd0lmUmVxdWVzdGVkKCksQS5zaWduYWwmJkEuc2lnbmFsLmFib3J0ZWQpdGhyb3cgbmV3IHgobnVsbCxBKX1mdW5jdGlvbiB5QShBKXtyZXR1cm4gWkEoQSksQS5oZWFkZXJzPWsuZnJvbShBLmhlYWRlcnMpLEEuZGF0YT10QS5jYWxsKEEsQS50cmFuc2Zvcm1SZXF1ZXN0KSxbInBvc3QiLCJwdXQiLCJwYXRjaCJdLmluZGV4T2YoQS5tZXRob2QpIT09LTEmJkEuaGVhZGVycy5zZXRDb250ZW50VHlwZSgiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwhMSksZEEuZ2V0QWRhcHRlcihBLmFkYXB0ZXJ8fGouYWRhcHRlcikoQSkudGhlbihmdW5jdGlvbihyKXtyZXR1cm4gWkEoQSksci5kYXRhPXRBLmNhbGwoQSxBLnRyYW5zZm9ybVJlc3BvbnNlLHIpLHIuaGVhZGVycz1rLmZyb20oci5oZWFkZXJzKSxyfSxmdW5jdGlvbihyKXtyZXR1cm4gckEocil8fChaQShBKSxyJiZyLnJlc3BvbnNlJiYoci5yZXNwb25zZS5kYXRhPXRBLmNhbGwoQSxBLnRyYW5zZm9ybVJlc3BvbnNlLHIucmVzcG9uc2UpLHIucmVzcG9uc2UuaGVhZGVycz1rLmZyb20oci5yZXNwb25zZS5oZWFkZXJzKSkpLFByb21pc2UucmVqZWN0KHIpfSl9dmFyIHFlPUE9PkEgaW5zdGFuY2VvZiBrP3suLi5BfTpBO2Z1bmN0aW9uIEwoQSxlKXtlPWV8fHt9O2xldCB0PXt9O2Z1bmN0aW9uIHIoQyxzLGEpe3JldHVybiBnLmlzUGxhaW5PYmplY3QoQykmJmcuaXNQbGFpbk9iamVjdChzKT9nLm1lcmdlLmNhbGwoe2Nhc2VsZXNzOmF9LEMscyk6Zy5pc1BsYWluT2JqZWN0KHMpP2cubWVyZ2Uoe30scyk6Zy5pc0FycmF5KHMpP3Muc2xpY2UoKTpzfWZ1bmN0aW9uIG4oQyxzLGEpe2lmKGcuaXNVbmRlZmluZWQocykpe2lmKCFnLmlzVW5kZWZpbmVkKEMpKXJldHVybiByKHZvaWQgMCxDLGEpfWVsc2UgcmV0dXJuIHIoQyxzLGEpfWZ1bmN0aW9uIG8oQyxzKXtpZighZy5pc1VuZGVmaW5lZChzKSlyZXR1cm4gcih2b2lkIDAscyl9ZnVuY3Rpb24gaShDLHMpe2lmKGcuaXNVbmRlZmluZWQocykpe2lmKCFnLmlzVW5kZWZpbmVkKEMpKXJldHVybiByKHZvaWQgMCxDKX1lbHNlIHJldHVybiByKHZvaWQgMCxzKX1mdW5jdGlvbiBCKEMscyxhKXtpZihhIGluIGUpcmV0dXJuIHIoQyxzKTtpZihhIGluIEEpcmV0dXJuIHIodm9pZCAwLEMpfWxldCBmPXt1cmw6byxtZXRob2Q6byxkYXRhOm8sYmFzZVVSTDppLHRyYW5zZm9ybVJlcXVlc3Q6aSx0cmFuc2Zvcm1SZXNwb25zZTppLHBhcmFtc1NlcmlhbGl6ZXI6aSx0aW1lb3V0OmksdGltZW91dE1lc3NhZ2U6aSx3aXRoQ3JlZGVudGlhbHM6aSx3aXRoWFNSRlRva2VuOmksYWRhcHRlcjppLHJlc3BvbnNlVHlwZTppLHhzcmZDb29raWVOYW1lOmkseHNyZkhlYWRlck5hbWU6aSxvblVwbG9hZFByb2dyZXNzOmksb25Eb3dubG9hZFByb2dyZXNzOmksZGVjb21wcmVzczppLG1heENvbnRlbnRMZW5ndGg6aSxtYXhCb2R5TGVuZ3RoOmksYmVmb3JlUmVkaXJlY3Q6aSx0cmFuc3BvcnQ6aSxodHRwQWdlbnQ6aSxodHRwc0FnZW50OmksY2FuY2VsVG9rZW46aSxzb2NrZXRQYXRoOmkscmVzcG9uc2VFbmNvZGluZzppLHZhbGlkYXRlU3RhdHVzOkIsaGVhZGVyczooQyxzKT0+bihxZShDKSxxZShzKSwhMCl9O3JldHVybiBnLmZvckVhY2goT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSxBLGUpKSxmdW5jdGlvbihzKXtsZXQgYT1mW3NdfHxuLGM9YShBW3NdLGVbc10scyk7Zy5pc1VuZGVmaW5lZChjKSYmYSE9PUJ8fCh0W3NdPWMpfSksdH12YXIgaEE9IjEuNi44Ijt2YXIgVkE9e307WyJvYmplY3QiLCJib29sZWFuIiwibnVtYmVyIiwiZnVuY3Rpb24iLCJzdHJpbmciLCJzeW1ib2wiXS5mb3JFYWNoKChBLGUpPT57VkFbQV09ZnVuY3Rpb24ocil7cmV0dXJuIHR5cGVvZiByPT09QXx8ImEiKyhlPDE/Im4gIjoiICIpK0F9fSk7dmFyIEtlPXt9O1ZBLnRyYW5zaXRpb25hbD1mdW5jdGlvbihlLHQscil7ZnVuY3Rpb24gbihvLGkpe3JldHVybiJbQXhpb3MgdiIraEErIl0gVHJhbnNpdGlvbmFsIG9wdGlvbiAnIitvKyInIitpKyhyPyIuICIrcjoiIil9cmV0dXJuKG8saSxCKT0+e2lmKGU9PT0hMSl0aHJvdyBuZXcgcChuKGksIiBoYXMgYmVlbiByZW1vdmVkIisodD8iIGluICIrdDoiIikpLHAuRVJSX0RFUFJFQ0FURUQpO3JldHVybiB0JiYhS2VbaV0mJihLZVtpXT0hMCxjb25zb2xlLndhcm4obihpLCIgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSB2Iit0KyIgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmVhciBmdXR1cmUiKSkpLGU/ZShvLGksQik6ITB9fTtmdW5jdGlvbiBGcihBLGUsdCl7aWYodHlwZW9mIEEhPSJvYmplY3QiKXRocm93IG5ldyBwKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0IixwLkVSUl9CQURfT1BUSU9OX1ZBTFVFKTtsZXQgcj1PYmplY3Qua2V5cyhBKSxuPXIubGVuZ3RoO2Zvcig7bi0tID4wOyl7bGV0IG89cltuXSxpPWVbb107aWYoaSl7bGV0IEI9QVtvXSxmPUI9PT12b2lkIDB8fGkoQixvLEEpO2lmKGYhPT0hMCl0aHJvdyBuZXcgcCgib3B0aW9uICIrbysiIG11c3QgYmUgIitmLHAuRVJSX0JBRF9PUFRJT05fVkFMVUUpO2NvbnRpbnVlfWlmKHQhPT0hMCl0aHJvdyBuZXcgcCgiVW5rbm93biBvcHRpb24gIitvLHAuRVJSX0JBRF9PUFRJT04pfX12YXIgd0E9e2Fzc2VydE9wdGlvbnM6RnIsdmFsaWRhdG9yczpWQX07dmFyIEo9d0EudmFsaWRhdG9ycyxfPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuZGVmYXVsdHM9ZSx0aGlzLmludGVyY2VwdG9ycz17cmVxdWVzdDpuZXcgV0EscmVzcG9uc2U6bmV3IFdBfX1hc3luYyByZXF1ZXN0KGUsdCl7dHJ5e3JldHVybiBhd2FpdCB0aGlzLl9yZXF1ZXN0KGUsdCl9Y2F0Y2gocil7aWYociBpbnN0YW5jZW9mIEVycm9yKXtsZXQgbjtFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT9FcnJvci5jYXB0dXJlU3RhY2tUcmFjZShuPXt9KTpuPW5ldyBFcnJvcjtsZXQgbz1uLnN0YWNrP24uc3RhY2sucmVwbGFjZSgvXi4rXG4vLCIiKToiIjtyLnN0YWNrP28mJiFTdHJpbmcoci5zdGFjaykuZW5kc1dpdGgoby5yZXBsYWNlKC9eLitcbi4rXG4vLCIiKSkmJihyLnN0YWNrKz1gCmArbyk6ci5zdGFjaz1vfXRocm93IHJ9fV9yZXF1ZXN0KGUsdCl7dHlwZW9mIGU9PSJzdHJpbmciPyh0PXR8fHt9LHQudXJsPWUpOnQ9ZXx8e30sdD1MKHRoaXMuZGVmYXVsdHMsdCk7bGV0e3RyYW5zaXRpb25hbDpyLHBhcmFtc1NlcmlhbGl6ZXI6bixoZWFkZXJzOm99PXQ7ciE9PXZvaWQgMCYmd0EuYXNzZXJ0T3B0aW9ucyhyLHtzaWxlbnRKU09OUGFyc2luZzpKLnRyYW5zaXRpb25hbChKLmJvb2xlYW4pLGZvcmNlZEpTT05QYXJzaW5nOkoudHJhbnNpdGlvbmFsKEouYm9vbGVhbiksY2xhcmlmeVRpbWVvdXRFcnJvcjpKLnRyYW5zaXRpb25hbChKLmJvb2xlYW4pfSwhMSksbiE9bnVsbCYmKGcuaXNGdW5jdGlvbihuKT90LnBhcmFtc1NlcmlhbGl6ZXI9e3NlcmlhbGl6ZTpufTp3QS5hc3NlcnRPcHRpb25zKG4se2VuY29kZTpKLmZ1bmN0aW9uLHNlcmlhbGl6ZTpKLmZ1bmN0aW9ufSwhMCkpLHQubWV0aG9kPSh0Lm1ldGhvZHx8dGhpcy5kZWZhdWx0cy5tZXRob2R8fCJnZXQiKS50b0xvd2VyQ2FzZSgpO2xldCBpPW8mJmcubWVyZ2Uoby5jb21tb24sb1t0Lm1ldGhvZF0pO28mJmcuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiLCJwb3N0IiwicHV0IiwicGF0Y2giLCJjb21tb24iXSxsPT57ZGVsZXRlIG9bbF19KSx0LmhlYWRlcnM9ay5jb25jYXQoaSxvKTtsZXQgQj1bXSxmPSEwO3RoaXMuaW50ZXJjZXB0b3JzLnJlcXVlc3QuZm9yRWFjaChmdW5jdGlvbih1KXt0eXBlb2YgdS5ydW5XaGVuPT0iZnVuY3Rpb24iJiZ1LnJ1bldoZW4odCk9PT0hMXx8KGY9ZiYmdS5zeW5jaHJvbm91cyxCLnVuc2hpZnQodS5mdWxmaWxsZWQsdS5yZWplY3RlZCkpfSk7bGV0IEM9W107dGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaChmdW5jdGlvbih1KXtDLnB1c2godS5mdWxmaWxsZWQsdS5yZWplY3RlZCl9KTtsZXQgcyxhPTAsYztpZighZil7bGV0IGw9W3lBLmJpbmQodGhpcyksdm9pZCAwXTtmb3IobC51bnNoaWZ0LmFwcGx5KGwsQiksbC5wdXNoLmFwcGx5KGwsQyksYz1sLmxlbmd0aCxzPVByb21pc2UucmVzb2x2ZSh0KTthPGM7KXM9cy50aGVuKGxbYSsrXSxsW2ErK10pO3JldHVybiBzfWM9Qi5sZW5ndGg7bGV0IEk9dDtmb3IoYT0wO2E8Yzspe2xldCBsPUJbYSsrXSx1PUJbYSsrXTt0cnl7ST1sKEkpfWNhdGNoKFEpe3UuY2FsbCh0aGlzLFEpO2JyZWFrfX10cnl7cz15QS5jYWxsKHRoaXMsSSl9Y2F0Y2gobCl7cmV0dXJuIFByb21pc2UucmVqZWN0KGwpfWZvcihhPTAsYz1DLmxlbmd0aDthPGM7KXM9cy50aGVuKENbYSsrXSxDW2ErK10pO3JldHVybiBzfWdldFVyaShlKXtlPUwodGhpcy5kZWZhdWx0cyxlKTtsZXQgdD1vQShlLmJhc2VVUkwsZS51cmwpO3JldHVybiBBQSh0LGUucGFyYW1zLGUucGFyYW1zU2VyaWFsaXplcil9fTtnLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwib3B0aW9ucyJdLGZ1bmN0aW9uKGUpe18ucHJvdG90eXBlW2VdPWZ1bmN0aW9uKHQscil7cmV0dXJuIHRoaXMucmVxdWVzdChMKHJ8fHt9LHttZXRob2Q6ZSx1cmw6dCxkYXRhOihyfHx7fSkuZGF0YX0pKX19KTtnLmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSxmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIpe3JldHVybiBmdW5jdGlvbihvLGksQil7cmV0dXJuIHRoaXMucmVxdWVzdChMKEJ8fHt9LHttZXRob2Q6ZSxoZWFkZXJzOnI/eyJDb250ZW50LVR5cGUiOiJtdWx0aXBhcnQvZm9ybS1kYXRhIn06e30sdXJsOm8sZGF0YTppfSkpfX1fLnByb3RvdHlwZVtlXT10KCksXy5wcm90b3R5cGVbZSsiRm9ybSJdPXQoITApfSk7dmFyIG5BPV87dmFyIFhBPWNsYXNzIEF7Y29uc3RydWN0b3IoZSl7aWYodHlwZW9mIGUhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpO2xldCB0O3RoaXMucHJvbWlzZT1uZXcgUHJvbWlzZShmdW5jdGlvbihvKXt0PW99KTtsZXQgcj10aGlzO3RoaXMucHJvbWlzZS50aGVuKG49PntpZighci5fbGlzdGVuZXJzKXJldHVybjtsZXQgbz1yLl9saXN0ZW5lcnMubGVuZ3RoO2Zvcig7by0tID4wOylyLl9saXN0ZW5lcnNbb10obik7ci5fbGlzdGVuZXJzPW51bGx9KSx0aGlzLnByb21pc2UudGhlbj1uPT57bGV0IG8saT1uZXcgUHJvbWlzZShCPT57ci5zdWJzY3JpYmUoQiksbz1CfSkudGhlbihuKTtyZXR1cm4gaS5jYW5jZWw9ZnVuY3Rpb24oKXtyLnVuc3Vic2NyaWJlKG8pfSxpfSxlKGZ1bmN0aW9uKG8saSxCKXtyLnJlYXNvbnx8KHIucmVhc29uPW5ldyB4KG8saSxCKSx0KHIucmVhc29uKSl9KX10aHJvd0lmUmVxdWVzdGVkKCl7aWYodGhpcy5yZWFzb24pdGhyb3cgdGhpcy5yZWFzb259c3Vic2NyaWJlKGUpe2lmKHRoaXMucmVhc29uKXtlKHRoaXMucmVhc29uKTtyZXR1cm59dGhpcy5fbGlzdGVuZXJzP3RoaXMuX2xpc3RlbmVycy5wdXNoKGUpOnRoaXMuX2xpc3RlbmVycz1bZV19dW5zdWJzY3JpYmUoZSl7aWYoIXRoaXMuX2xpc3RlbmVycylyZXR1cm47bGV0IHQ9dGhpcy5fbGlzdGVuZXJzLmluZGV4T2YoZSk7dCE9PS0xJiZ0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKHQsMSl9c3RhdGljIHNvdXJjZSgpe2xldCBlO3JldHVybnt0b2tlbjpuZXcgQShmdW5jdGlvbihuKXtlPW59KSxjYW5jZWw6ZX19fSxqZT1YQTtmdW5jdGlvbiAkQShBKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIEEuYXBwbHkobnVsbCx0KX19ZnVuY3Rpb24gQWUoQSl7cmV0dXJuIGcuaXNPYmplY3QoQSkmJkEuaXNBeGlvc0Vycm9yPT09ITB9dmFyIGVlPXtDb250aW51ZToxMDAsU3dpdGNoaW5nUHJvdG9jb2xzOjEwMSxQcm9jZXNzaW5nOjEwMixFYXJseUhpbnRzOjEwMyxPazoyMDAsQ3JlYXRlZDoyMDEsQWNjZXB0ZWQ6MjAyLE5vbkF1dGhvcml0YXRpdmVJbmZvcm1hdGlvbjoyMDMsTm9Db250ZW50OjIwNCxSZXNldENvbnRlbnQ6MjA1LFBhcnRpYWxDb250ZW50OjIwNixNdWx0aVN0YXR1czoyMDcsQWxyZWFkeVJlcG9ydGVkOjIwOCxJbVVzZWQ6MjI2LE11bHRpcGxlQ2hvaWNlczozMDAsTW92ZWRQZXJtYW5lbnRseTozMDEsRm91bmQ6MzAyLFNlZU90aGVyOjMwMyxOb3RNb2RpZmllZDozMDQsVXNlUHJveHk6MzA1LFVudXNlZDozMDYsVGVtcG9yYXJ5UmVkaXJlY3Q6MzA3LFBlcm1hbmVudFJlZGlyZWN0OjMwOCxCYWRSZXF1ZXN0OjQwMCxVbmF1dGhvcml6ZWQ6NDAxLFBheW1lbnRSZXF1aXJlZDo0MDIsRm9yYmlkZGVuOjQwMyxOb3RGb3VuZDo0MDQsTWV0aG9kTm90QWxsb3dlZDo0MDUsTm90QWNjZXB0YWJsZTo0MDYsUHJveHlBdXRoZW50aWNhdGlvblJlcXVpcmVkOjQwNyxSZXF1ZXN0VGltZW91dDo0MDgsQ29uZmxpY3Q6NDA5LEdvbmU6NDEwLExlbmd0aFJlcXVpcmVkOjQxMSxQcmVjb25kaXRpb25GYWlsZWQ6NDEyLFBheWxvYWRUb29MYXJnZTo0MTMsVXJpVG9vTG9uZzo0MTQsVW5zdXBwb3J0ZWRNZWRpYVR5cGU6NDE1LFJhbmdlTm90U2F0aXNmaWFibGU6NDE2LEV4cGVjdGF0aW9uRmFpbGVkOjQxNyxJbUFUZWFwb3Q6NDE4LE1pc2RpcmVjdGVkUmVxdWVzdDo0MjEsVW5wcm9jZXNzYWJsZUVudGl0eTo0MjIsTG9ja2VkOjQyMyxGYWlsZWREZXBlbmRlbmN5OjQyNCxUb29FYXJseTo0MjUsVXBncmFkZVJlcXVpcmVkOjQyNixQcmVjb25kaXRpb25SZXF1aXJlZDo0MjgsVG9vTWFueVJlcXVlc3RzOjQyOSxSZXF1ZXN0SGVhZGVyRmllbGRzVG9vTGFyZ2U6NDMxLFVuYXZhaWxhYmxlRm9yTGVnYWxSZWFzb25zOjQ1MSxJbnRlcm5hbFNlcnZlckVycm9yOjUwMCxOb3RJbXBsZW1lbnRlZDo1MDEsQmFkR2F0ZXdheTo1MDIsU2VydmljZVVuYXZhaWxhYmxlOjUwMyxHYXRld2F5VGltZW91dDo1MDQsSHR0cFZlcnNpb25Ob3RTdXBwb3J0ZWQ6NTA1LFZhcmlhbnRBbHNvTmVnb3RpYXRlczo1MDYsSW5zdWZmaWNpZW50U3RvcmFnZTo1MDcsTG9vcERldGVjdGVkOjUwOCxOb3RFeHRlbmRlZDo1MTAsTmV0d29ya0F1dGhlbnRpY2F0aW9uUmVxdWlyZWQ6NTExfTtPYmplY3QuZW50cmllcyhlZSkuZm9yRWFjaCgoW0EsZV0pPT57ZWVbZV09QX0pO3ZhciB2ZT1lZTtmdW5jdGlvbiBfZShBKXtsZXQgZT1uZXcgbkEoQSksdD1WKG5BLnByb3RvdHlwZS5yZXF1ZXN0LGUpO3JldHVybiBnLmV4dGVuZCh0LG5BLnByb3RvdHlwZSxlLHthbGxPd25LZXlzOiEwfSksZy5leHRlbmQodCxlLG51bGwse2FsbE93bktleXM6ITB9KSx0LmNyZWF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gX2UoTChBLG4pKX0sdH12YXIgRD1fZShqKTtELkF4aW9zPW5BO0QuQ2FuY2VsZWRFcnJvcj14O0QuQ2FuY2VsVG9rZW49amU7RC5pc0NhbmNlbD1yQTtELlZFUlNJT049aEE7RC50b0Zvcm1EYXRhPU87RC5BeGlvc0Vycm9yPXA7RC5DYW5jZWw9RC5DYW5jZWxlZEVycm9yO0QuYWxsPWZ1bmN0aW9uKGUpe3JldHVybiBQcm9taXNlLmFsbChlKX07RC5zcHJlYWQ9JEE7RC5pc0F4aW9zRXJyb3I9QWU7RC5tZXJnZUNvbmZpZz1MO0QuQXhpb3NIZWFkZXJzPWs7RC5mb3JtVG9KU09OPUE9PnBBKGcuaXNIVE1MRm9ybShBKT9uZXcgRm9ybURhdGEoQSk6QSk7RC5nZXRBZGFwdGVyPWRBLmdldEFkYXB0ZXI7RC5IdHRwU3RhdHVzQ29kZT12ZTtELmRlZmF1bHQ9RDt2YXIgej1EO3ZhcntBeGlvczpCYSxBeGlvc0Vycm9yOkNhLENhbmNlbGVkRXJyb3I6bGEsaXNDYW5jZWw6ZmEsQ2FuY2VsVG9rZW46Y2EsVkVSU0lPTjp1YSxhbGw6RWEsQ2FuY2VsOlFhLGlzQXhpb3NFcnJvcjpwYSxzcHJlYWQ6bWEsdG9Gb3JtRGF0YTpkYSxBeGlvc0hlYWRlcnM6eWEsSHR0cFN0YXR1c0NvZGU6aGEsZm9ybVRvSlNPTjp3YSxnZXRBZGFwdGVyOkRhLG1lcmdlQ29uZmlnOlNhfT16O2FzeW5jIGZ1bmN0aW9uIFVyKEEsZSl7bGV0IHQ9QSxyPW51bGw7aWYodD09bnVsbClyPW5ldyBXb3JrZXIobmV3IFVSTCgiLi93ZWItd29ya2Vycy9pdGstd2FzbS1waXBlbGluZS53b3JrZXIuanMiLGltcG9ydC5tZXRhLnVybCkse3R5cGU6Im1vZHVsZSJ9KTtlbHNlIGlmKHQuc3RhcnRzV2l0aCgiaHR0cCIpKXtsZXQgbj1hd2FpdCB6LmdldCh0LHtyZXNwb25zZVR5cGU6ImJsb2IiLHBhcmFtczplfSksbz1VUkwuY3JlYXRlT2JqZWN0VVJMKG4uZGF0YSk7cj1uZXcgV29ya2VyKG8se3R5cGU6Im1vZHVsZSJ9KX1lbHNlIHI9bmV3IFdvcmtlcih0LHt0eXBlOiJtb2R1bGUifSk7cmV0dXJuIHJ9dmFyIGlBPVVyO2Z1bmN0aW9uIHplKEEpe2xldCBlPVRBKEEpLHQ9QTtyZXR1cm4gdC50ZXJtaW5hdGVkPSExLHQud29ya2VyUHJveHk9ZSx0Lm9yaWdpbmFsVGVybWluYXRlPXQudGVybWluYXRlLHQudGVybWluYXRlPSgpPT57dC50ZXJtaW5hdGVkPSEwLHQud29ya2VyUHJveHlbTkFdKCksdC5vcmlnaW5hbFRlcm1pbmF0ZSgpfSx7d29ya2VyUHJveHk6ZSx3b3JrZXI6dH19YXN5bmMgZnVuY3Rpb24gTnIoQSxlLHQpe2xldCByO2lmKEEhPW51bGwpe2xldCBvPUE7cmV0dXJuIG8ud29ya2VyUHJveHkhPT12b2lkIDA/KHI9by53b3JrZXJQcm94eSx7d29ya2VyUHJveHk6cix3b3JrZXI6b30pOnplKEEpfWxldCBuPWF3YWl0IGlBKGUsdCk7cmV0dXJuIHplKG4pfXZhciBaZT1Ocjthc3luYyBmdW5jdGlvbiBUcihBLGUsdCl7bGV0IHI9InVua25vd24iO3R5cGVvZiBBIT0ic3RyaW5nIj9yPUEuaHJlZjpBLnN0YXJ0c1dpdGgoImh0dHAiKT9yPUE6cj10eXBlb2YgZTwidSI/YCR7ZX0vJHtBfWA6QSxyLmVuZHNXaXRoKCIuanMiKSYmKHI9ci5zdWJzdHJpbmcoMCxyLmxlbmd0aC0zKSksci5lbmRzV2l0aCgiLndhc20iKSYmKHI9ci5zdWJzdHJpbmcoMCxyLmxlbmd0aC01KSk7bGV0IG49YCR7cn0ud2FzbWAsaT0oYXdhaXQgei5nZXQobix7cmVzcG9uc2VUeXBlOiJhcnJheWJ1ZmZlciIscGFyYW1zOnR9KSkuZGF0YTtyZXR1cm4oYXdhaXQgaW1wb3J0KGAke3J9LmpzYCkpLmRlZmF1bHQoe3dhc21CaW5hcnk6aX0pfXZhciBWZT1Ucjt2YXIgWGU9YXN5bmMoKT0+V2ViQXNzZW1ibHkudmFsaWRhdGUobmV3IFVpbnQ4QXJyYXkoWzAsOTcsMTE1LDEwOSwxLDAsMCwwLDEsNSwxLDk2LDAsMSwxMjMsMywyLDEsMCwxMCwxMCwxLDgsMCw2NSwwLDI1MywxNSwyNTMsOTgsMTFdKSk7dmFyIGV0PXR5cGVvZiBnbG9iYWxUaGlzLlNoYXJlZEFycmF5QnVmZmVyPT0iZnVuY3Rpb24iLCRlPW5ldyBUZXh0RW5jb2RlcixBdD1uZXcgVGV4dERlY29kZXIoInV0Zi04Iik7ZnVuY3Rpb24gR3IoQSxlKXtsZXQgdD17ZmxhZ3M6InIiLGVuY29kaW5nOiJiaW5hcnkifSxyPUEuZnNfb3BlbihlLHQuZmxhZ3MpLG89QS5mc19zdGF0KGUpLnNpemUsaT1udWxsO2V0P2k9bmV3IFNoYXJlZEFycmF5QnVmZmVyKG8pOmk9bmV3IEFycmF5QnVmZmVyKG8pO2xldCBCPW5ldyBVaW50OEFycmF5KGkpO3JldHVybiBBLmZzX3JlYWQocixCLDAsbywwKSxBLmZzX2Nsb3NlKHIpLEJ9ZnVuY3Rpb24gdHQoQSxlLHQpe2xldCByPW51bGw7ZXQ/cj1uZXcgU2hhcmVkQXJyYXlCdWZmZXIodCk6cj1uZXcgQXJyYXlCdWZmZXIodCk7bGV0IG49bmV3IFVpbnQ4QXJyYXkociksbz1uZXcgVWludDhBcnJheShBLkhFQVBVOC5idWZmZXIsZSx0KTtyZXR1cm4gbi5zZXQobyksbn1mdW5jdGlvbiBTKEEsZSx0LHIpe2xldCBuPTA7cmV0dXJuIGUhPT1udWxsJiYobj1BLmNjYWxsKCJpdGtfd2FzbV9pbnB1dF9hcnJheV9hbGxvYyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCx0LHIsZS5idWZmZXIuYnl0ZUxlbmd0aF0pLEEuSEVBUFU4LnNldChuZXcgVWludDhBcnJheShlLmJ1ZmZlciksbikpLG59ZnVuY3Rpb24gTShBLGUsdCl7bGV0IHI9SlNPTi5zdHJpbmdpZnkoZSksbj1BLmxlbmd0aEJ5dGVzVVRGOChyKSsxLG89QS5jY2FsbCgiaXRrX3dhc21faW5wdXRfanNvbl9hbGxvYyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCx0LG5dKTtBLnN0cmluZ1RvVVRGOChyLG8sbil9ZnVuY3Rpb24gYihBLGUsdCxyKXtsZXQgbj1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfYWRkcmVzcyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxlLHRdKSxvPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9zaXplIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLGUsdF0pLGk9dHQoQSxuLG8pO3JldHVybiBHKHIsaS5idWZmZXIpfWZ1bmN0aW9uIERBKEEsZSl7bGV0IHQ9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2pzb25fYWRkcmVzcyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiXSxbMCxlXSkscj1BLlVURjhUb1N0cmluZyh0KTtyZXR1cm4gSlNPTi5wYXJzZShyKX1mdW5jdGlvbiBQcihBLGUsdCxyKXtyIT1udWxsJiZyLmxlbmd0aD4wJiZyLmZvckVhY2goZnVuY3Rpb24oQyxzKXtzd2l0Y2goQy50eXBlKXtjYXNlIEUuVGV4dFN0cmVhbTp7bGV0IGE9JGUuZW5jb2RlKEMuZGF0YS5kYXRhKSxjPVMoQSxhLHMsMCksST17c2l6ZTphLmJ1ZmZlci5ieXRlTGVuZ3RoLGRhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtjfWB9O00oQSxJLHMpO2JyZWFrfWNhc2UgRS5Kc29uQ29tcGF0aWJsZTp7bGV0IGE9JGUuZW5jb2RlKEpTT04uc3RyaW5naWZ5KEMuZGF0YSkpLGM9UyhBLGEscywwKSxJPXtzaXplOmEuYnVmZmVyLmJ5dGVMZW5ndGgsZGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2N9YH07TShBLEkscyk7YnJlYWt9Y2FzZSBFLkJpbmFyeVN0cmVhbTp7bGV0IGE9Qy5kYXRhLmRhdGEsYz1TKEEsYSxzLDApLEk9e3NpemU6YS5idWZmZXIuYnl0ZUxlbmd0aCxkYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Y31gfTtNKEEsSSxzKTticmVha31jYXNlIEUuVGV4dEZpbGU6e0EuZnNfd3JpdGVGaWxlKEMuZGF0YS5wYXRoLEMuZGF0YS5kYXRhKTticmVha31jYXNlIEUuQmluYXJ5RmlsZTp7QS5mc193cml0ZUZpbGUoQy5kYXRhLnBhdGgsQy5kYXRhLmRhdGEpO2JyZWFrfWNhc2UgRS5JbWFnZTp7bGV0IGE9Qy5kYXRhLGM9UyhBLGEuZGF0YSxzLDApLEk9UyhBLGEuZGlyZWN0aW9uLHMsMSksbD10eXBlb2YgYS5tZXRhZGF0YT8uZW50cmllczwidSI/QXJyYXkuZnJvbShhLm1ldGFkYXRhLmVudHJpZXMoKSk6W10sdT17aW1hZ2VUeXBlOmEuaW1hZ2VUeXBlLG5hbWU6YS5uYW1lLG9yaWdpbjphLm9yaWdpbixzcGFjaW5nOmEuc3BhY2luZyxkaXJlY3Rpb246YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtJfWAsc2l6ZTphLnNpemUsZGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2N9YCxtZXRhZGF0YTpsfTtNKEEsdSxzKTticmVha31jYXNlIEUuTWVzaDp7bGV0IGE9Qy5kYXRhLGM9UyhBLGEucG9pbnRzLHMsMCksST1TKEEsYS5jZWxscyxzLDEpLGw9UyhBLGEucG9pbnREYXRhLHMsMiksdT1TKEEsYS5jZWxsRGF0YSxzLDMpLFE9e21lc2hUeXBlOmEubWVzaFR5cGUsbmFtZTphLm5hbWUsbnVtYmVyT2ZQb2ludHM6YS5udW1iZXJPZlBvaW50cyxwb2ludHM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtjfWAsbnVtYmVyT2ZDZWxsczphLm51bWJlck9mQ2VsbHMsY2VsbHM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtJfWAsY2VsbEJ1ZmZlclNpemU6YS5jZWxsQnVmZmVyU2l6ZSxudW1iZXJPZlBvaW50UGl4ZWxzOmEubnVtYmVyT2ZQb2ludFBpeGVscyxwb2ludERhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtsfWAsbnVtYmVyT2ZDZWxsUGl4ZWxzOmEubnVtYmVyT2ZDZWxsUGl4ZWxzLGNlbGxEYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7dX1gfTtNKEEsUSxzKTticmVha31jYXNlIEUuUG9pbnRTZXQ6e2xldCBhPUMuZGF0YSxjPVMoQSxhLnBvaW50cyxzLDApLEk9UyhBLGEucG9pbnREYXRhLHMsMSksbD17cG9pbnRTZXRUeXBlOmEucG9pbnRTZXRUeXBlLG5hbWU6YS5uYW1lLG51bWJlck9mUG9pbnRzOmEubnVtYmVyT2ZQb2ludHMscG9pbnRzOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Y31gLG51bWJlck9mUG9pbnRQaXhlbHM6YS5udW1iZXJPZlBvaW50UGl4ZWxzLHBvaW50RGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke0l9YH07TShBLGwscyk7YnJlYWt9Y2FzZSBFLlBvbHlEYXRhOntsZXQgYT1DLmRhdGEsYz1TKEEsYS5wb2ludHMscywwKSxJPVMoQSxhLnZlcnRpY2VzLHMsMSksbD1TKEEsYS5saW5lcyxzLDIpLHU9UyhBLGEucG9seWdvbnMscywzKSxRPVMoQSxhLnRyaWFuZ2xlU3RyaXBzLHMsNCksbT1TKEEsYS5wb2ludERhdGEscyw1KSxOPVMoQSxhLnBvaW50RGF0YSxzLDYpLFQ9e3BvbHlEYXRhVHlwZTphLnBvbHlEYXRhVHlwZSxuYW1lOmEubmFtZSxudW1iZXJPZlBvaW50czphLm51bWJlck9mUG9pbnRzLHBvaW50czpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2N9YCx2ZXJ0aWNlc0J1ZmZlclNpemU6YS52ZXJ0aWNlc0J1ZmZlclNpemUsdmVydGljZXM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtJfWAsbGluZXNCdWZmZXJTaXplOmEubGluZXNCdWZmZXJTaXplLGxpbmVzOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7bH1gLHBvbHlnb25zQnVmZmVyU2l6ZTphLnBvbHlnb25zQnVmZmVyU2l6ZSxwb2x5Z29uczpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke3V9YCx0cmlhbmdsZVN0cmlwc0J1ZmZlclNpemU6YS50cmlhbmdsZVN0cmlwc0J1ZmZlclNpemUsdHJpYW5nbGVTdHJpcHM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtRfWAsbnVtYmVyT2ZQb2ludFBpeGVsczphLm51bWJlck9mUG9pbnRQaXhlbHMscG9pbnREYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7bX1gLG51bWJlck9mQ2VsbFBpeGVsczphLm51bWJlck9mQ2VsbFBpeGVscyxjZWxsRGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke059YH07TShBLFQscyk7YnJlYWt9ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5zdXBwb3J0ZWQgaW5wdXQgSW50ZXJmYWNlVHlwZSIpfX0pLEEucmVzZXRNb2R1bGVTdGRvdXQoKSxBLnJlc2V0TW9kdWxlU3RkZXJyKCk7bGV0IG49QS5zdGFja1NhdmUoKSxvPTA7dHJ5e289QS5jYWxsTWFpbihlLnNsaWNlKCkpfWNhdGNoKEMpe3Rocm93IHR5cGVvZiBDPT0ibnVtYmVyIiYmKGNvbnNvbGUubG9nKCJFeGNlcHRpb24gd2hpbGUgcnVubmluZyBwaXBlbGluZToiKSxjb25zb2xlLmxvZygic3Rkb3V0OiIsQS5nZXRNb2R1bGVTdGRvdXQoKSksY29uc29sZS5lcnJvcigic3RkZXJyOiIsQS5nZXRNb2R1bGVTdGRlcnIoKSksdHlwZW9mIEEuZ2V0RXhjZXB0aW9uTWVzc2FnZTwidSI/Y29uc29sZS5lcnJvcigiZXhjZXB0aW9uOiIsQS5nZXRFeGNlcHRpb25NZXNzYWdlKEMpKTpjb25zb2xlLmVycm9yKCJCdWlsZCBtb2R1bGUgaW4gRGVidWcgbW9kZSBmb3IgZXhjZXB0aW9uIG1lc3NhZ2UgaW5mb3JtYXRpb24uIikpLEN9ZmluYWxseXtBLnN0YWNrUmVzdG9yZShuKX1sZXQgaT1BLmdldE1vZHVsZVN0ZG91dCgpLEI9QS5nZXRNb2R1bGVTdGRlcnIoKSxmPVtdO3JldHVybiB0IT1udWxsJiZ0Lmxlbmd0aD4wJiZvPT09MCYmdC5mb3JFYWNoKGZ1bmN0aW9uKEMscyl7bGV0IGE9bnVsbDtzd2l0Y2goQy50eXBlKXtjYXNlIEUuVGV4dFN0cmVhbTp7bGV0IEk9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X2FkZHJlc3MiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAscywwXSksbD1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfc2l6ZSIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxzLDBdKSx1PW5ldyBVaW50OEFycmF5KEEuSEVBUFU4LmJ1ZmZlcixJLGwpO2E9e2RhdGE6QXQuZGVjb2RlKHUpfTticmVha31jYXNlIEUuSnNvbkNvbXBhdGlibGU6e2xldCBJPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9hZGRyZXNzIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLHMsMF0pLGw9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X3NpemUiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAscywwXSksdT1uZXcgVWludDhBcnJheShBLkhFQVBVOC5idWZmZXIsSSxsKTthPUpTT04ucGFyc2UoQXQuZGVjb2RlKHUpKTticmVha31jYXNlIEUuQmluYXJ5U3RyZWFtOntsZXQgST1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfYWRkcmVzcyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxzLDBdKSxsPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9zaXplIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLHMsMF0pO2E9e2RhdGE6dHQoQSxJLGwpfTticmVha31jYXNlIEUuVGV4dEZpbGU6e2E9e3BhdGg6Qy5kYXRhLnBhdGgsZGF0YTpBLmZzX3JlYWRGaWxlKEMuZGF0YS5wYXRoLHtlbmNvZGluZzoidXRmOCJ9KX07YnJlYWt9Y2FzZSBFLkJpbmFyeUZpbGU6e2E9e3BhdGg6Qy5kYXRhLnBhdGgsZGF0YTpHcihBLEMuZGF0YS5wYXRoKX07YnJlYWt9Y2FzZSBFLkltYWdlOntsZXQgST1EQShBLHMpO0kuZGF0YT1iKEEscywwLEkuaW1hZ2VUeXBlLmNvbXBvbmVudFR5cGUpLEkuZGlyZWN0aW9uPWIoQSxzLDEsSC5GbG9hdDY0KSxJLm1ldGFkYXRhPW5ldyBNYXAoSS5tZXRhZGF0YSksYT1JO2JyZWFrfWNhc2UgRS5NZXNoOntsZXQgST1EQShBLHMpO0kubnVtYmVyT2ZQb2ludHM+MD9JLnBvaW50cz1iKEEscywwLEkubWVzaFR5cGUucG9pbnRDb21wb25lbnRUeXBlKTpJLnBvaW50cz1HKEkubWVzaFR5cGUucG9pbnRDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSksSS5udW1iZXJPZkNlbGxzPjA/SS5jZWxscz1iKEEscywxLEkubWVzaFR5cGUuY2VsbENvbXBvbmVudFR5cGUpOkkuY2VsbHM9RyhJLm1lc2hUeXBlLmNlbGxDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSksSS5udW1iZXJPZlBvaW50UGl4ZWxzPjA/SS5wb2ludERhdGE9YihBLHMsMixJLm1lc2hUeXBlLnBvaW50UGl4ZWxDb21wb25lbnRUeXBlKTpJLnBvaW50RGF0YT1HKEkubWVzaFR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxJLm51bWJlck9mQ2VsbFBpeGVscz4wP0kuY2VsbERhdGE9YihBLHMsMyxJLm1lc2hUeXBlLmNlbGxQaXhlbENvbXBvbmVudFR5cGUpOkkuY2VsbERhdGE9RyhJLm1lc2hUeXBlLmNlbGxQaXhlbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxhPUk7YnJlYWt9Y2FzZSBFLlBvaW50U2V0OntsZXQgST1EQShBLHMpO0kubnVtYmVyT2ZQb2ludHM+MD9JLnBvaW50cz1iKEEscywwLEkucG9pbnRTZXRUeXBlLnBvaW50Q29tcG9uZW50VHlwZSk6SS5wb2ludHM9RyhJLnBvaW50U2V0VHlwZS5wb2ludENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxJLm51bWJlck9mUG9pbnRQaXhlbHM+MD9JLnBvaW50RGF0YT1iKEEscywxLEkucG9pbnRTZXRUeXBlLnBvaW50UGl4ZWxDb21wb25lbnRUeXBlKTpJLnBvaW50RGF0YT1HKEkucG9pbnRTZXRUeXBlLnBvaW50UGl4ZWxDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSksYT1JO2JyZWFrfWNhc2UgRS5Qb2x5RGF0YTp7bGV0IEk9REEoQSxzKTtJLm51bWJlck9mUG9pbnRzPjA/SS5wb2ludHM9YihBLHMsMCxILkZsb2F0MzIpOkkucG9pbnRzPW5ldyBGbG9hdDMyQXJyYXksSS52ZXJ0aWNlc0J1ZmZlclNpemU+MD9JLnZlcnRpY2VzPWIoQSxzLDEsRi5VSW50MzIpOkkudmVydGljZXM9bmV3IFVpbnQzMkFycmF5LEkubGluZXNCdWZmZXJTaXplPjA/SS5saW5lcz1iKEEscywyLEYuVUludDMyKTpJLmxpbmVzPW5ldyBVaW50MzJBcnJheSxJLnBvbHlnb25zQnVmZmVyU2l6ZT4wP0kucG9seWdvbnM9YihBLHMsMyxGLlVJbnQzMik6SS5wb2x5Z29ucz1uZXcgVWludDMyQXJyYXksSS50cmlhbmdsZVN0cmlwc0J1ZmZlclNpemU+MD9JLnRyaWFuZ2xlU3RyaXBzPWIoQSxzLDQsRi5VSW50MzIpOkkudHJpYW5nbGVTdHJpcHM9bmV3IFVpbnQzMkFycmF5LEkubnVtYmVyT2ZQb2ludFBpeGVscz4wP0kucG9pbnREYXRhPWIoQSxzLDUsSS5wb2x5RGF0YVR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUpOkkucG9pbnREYXRhPUcoSS5wb2x5RGF0YVR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxJLm51bWJlck9mQ2VsbFBpeGVscz4wP0kuY2VsbERhdGE9YihBLHMsNixJLnBvbHlEYXRhVHlwZS5jZWxsUGl4ZWxDb21wb25lbnRUeXBlKTpJLmNlbGxEYXRhPUcoSS5wb2x5RGF0YVR5cGUuY2VsbFBpeGVsQ29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLGE9STticmVha31kZWZhdWx0OnRocm93IEVycm9yKCJVbnN1cHBvcnRlZCBvdXRwdXQgSW50ZXJmYWNlVHlwZSIpfWxldCBjPXt0eXBlOkMudHlwZSxkYXRhOmF9O2YucHVzaChjKX0pLHtyZXR1cm5WYWx1ZTpvLHN0ZG91dDppLHN0ZGVycjpCLG91dHB1dHM6Zn19dmFyIHJ0PVByO3ZhciBMcj10eXBlb2YgZ2xvYmFsVGhpcy5TaGFyZWRBcnJheUJ1ZmZlcjwidSI7ZnVuY3Rpb24gT3IoQSxlKXtpZihBPT1udWxsKXJldHVybltdO2xldCB0PVtdO2ZvcihsZXQgcj0wO3I8QS5sZW5ndGg7cisrKXtsZXQgbj14cihBW3JdLGUpO24hPT1udWxsJiZ0LnB1c2gobil9cmV0dXJuIHR9ZnVuY3Rpb24geHIoQSxlKXtpZihBPT1udWxsKXJldHVybiBudWxsO2xldCB0PW51bGw7cmV0dXJuIEEuYnVmZmVyIT09dm9pZCAwP3Q9QS5idWZmZXI6QS5ieXRlTGVuZ3RoIT09dm9pZCAwJiYodD1BKSxMciYmdCBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyP251bGw6ZT90OnQuc2xpY2UoMCl9dmFyIG90PU9yO2Z1bmN0aW9uIEpyKEEpe3JldHVybltBLmRhdGEsQS5kaXJlY3Rpb25dfXZhciBudD1KcjtmdW5jdGlvbiBXcihBKXtyZXR1cm5bQS5wb2ludHMsQS5wb2ludERhdGEsQS5jZWxscyxBLmNlbGxEYXRhXX12YXIgaXQ9V3I7ZnVuY3Rpb24gTXIoQSl7cmV0dXJuW0EucG9pbnRzLEEudmVydGljZXMsQS5saW5lcyxBLnBvbHlnb25zLEEudHJpYW5nbGVTdHJpcHMsQS5wb2ludERhdGEsQS5jZWxsRGF0YV19dmFyIGF0PU1yO3ZhciBIcjtmdW5jdGlvbiBTQSgpe3JldHVybiBIcn12YXIgWXI7ZnVuY3Rpb24gc3QoKXtyZXR1cm4gWXJ9dmFyIHFyO2Z1bmN0aW9uIFJBKCl7cmV0dXJuIHFyfXZhciB0ZT1uZXcgTWFwO2Z1bmN0aW9uIEtyKCl7bGV0IEE9UkEoKTtyZXR1cm4gdHlwZW9mIEE+InUiJiYoQT1udWxsKSxBfWZ1bmN0aW9uIEl0KCl7bGV0IEE9U0EoKTtyZXR1cm4gdHlwZW9mIEE+InUiJiYoQT1uZXcgVVJMKCIvcGlwZWxpbmVzIixkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW4pLmhyZWYpLEF9ZnVuY3Rpb24ga0EoKXtsZXQgQT1zdCgpO3JldHVybiB0eXBlb2YgQT4idSImJihBPXt9KSxBfWFzeW5jIGZ1bmN0aW9uIGpyKEEsZSx0KXtsZXQgcj1BLG49QTtpZih0eXBlb2YgQSE9InN0cmluZyImJihyPW5ldyBVUkwoQS5ocmVmKSxuPXIuaHJlZiksdGUuaGFzKG4pKXJldHVybiB0ZS5nZXQobik7e2xldCBvPWF3YWl0IFZlKEEsZT8udG9TdHJpbmcoKT8/SXQoKSx0Pz9rQSgpKTtyZXR1cm4gdGUuc2V0KG4sbyksb319YXN5bmMgZnVuY3Rpb24gdnIoQSxlLHQscixuKXtpZighYXdhaXQgWGUoKSl7bGV0IFE9IldlYkFzc2VtYmx5IFNJTUQgc3VwcG9ydCBpcyByZXF1aXJlZCAtLSBwbGVhc2UgdXBkYXRlIHlvdXIgYnJvd3Nlci4iO3Rocm93IGFsZXJ0KFEpLG5ldyBFcnJvcihRKX1sZXQgbz1uPy53ZWJXb3JrZXI/P251bGw7aWYobz09PSExKXtsZXQgUT1hd2FpdCBqcihBLnRvU3RyaW5nKCksbj8ucGlwZWxpbmVCYXNlVXJsLG4/LnBpcGVsaW5lUXVlcnlQYXJhbXM/P2tBKCkpO3JldHVybiBydChRLGUsdCxyKX1sZXQgaT1vLEI9bj8ucGlwZWxpbmVXb3JrZXJVcmw/P0tyKCksZj10eXBlb2YgQiE9InN0cmluZyImJnR5cGVvZiBCPy5ocmVmPCJ1Ij9CLmhyZWY6Qix7d29ya2VyUHJveHk6Qyx3b3JrZXI6c309YXdhaXQgWmUoaSxmLG4/LnBpcGVsaW5lUXVlcnlQYXJhbXM/P2tBKCkpO2k9cztsZXQgYT1bXTtyIT1udWxsJiZyLmxlbmd0aD4wJiZyLmZvckVhY2goZnVuY3Rpb24oUSl7aWYoUS50eXBlPT09RS5CaW5hcnlTdHJlYW0pe2xldCBtPVEuZGF0YS5kYXRhO2EucHVzaChtKX1lbHNlIGlmKFEudHlwZT09PUUuQmluYXJ5RmlsZSl7bGV0IG09US5kYXRhLmRhdGE7YS5wdXNoKG0pfWVsc2UgaWYoUS50eXBlPT09RS5JbWFnZSl7bGV0IG09US5kYXRhO20uZGF0YSE9PW51bGwmJmEucHVzaCguLi5udChtKSl9ZWxzZSBpZihRLnR5cGU9PT1FLk1lc2gpe2xldCBtPVEuZGF0YTthLnB1c2goLi4uaXQobSkpfWVsc2UgaWYoUS50eXBlPT09RS5Qb2x5RGF0YSl7bGV0IG09US5kYXRhO2EucHVzaCguLi5hdChtKSl9fSk7bGV0IGM9bj8ucGlwZWxpbmVCYXNlVXJsPz9JdCgpLEk9dHlwZW9mIGMhPSJzdHJpbmciJiZ0eXBlb2YgYz8uaHJlZjwidSI/Yy5ocmVmOmMsbD1yIT1udWxsP0dBKHIsb3QoYSxuPy5ub0NvcHkpKTpudWxsLHU9YXdhaXQgQy5ydW5QaXBlbGluZShBLnRvU3RyaW5nKCksSSxlLHQsbCxuPy5waXBlbGluZVF1ZXJ5UGFyYW1zPz9rQSgpKTtyZXR1cm57cmV0dXJuVmFsdWU6dS5yZXR1cm5WYWx1ZSxzdGRvdXQ6dS5zdGRvdXQsc3RkZXJyOnUuc3RkZXJyLG91dHB1dHM6dS5vdXRwdXRzLHdlYldvcmtlcjppfX12YXIgeT12cjt2YXIgX3I9bnVsbDtmdW5jdGlvbiBndCgpe3JldHVybiBfcn12YXIgcmUsenI9YGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQGl0ay13YXNtL3RyYW5zZm9ybS1pb0Ake2JBfS9kaXN0L3BpcGVsaW5lc2A7ZnVuY3Rpb24gdXMoQSl7cmU9QX1mdW5jdGlvbiBoKCl7aWYodHlwZW9mIHJlPCJ1IilyZXR1cm4gcmU7bGV0IEE9U0EoKTtyZXR1cm4gdHlwZW9mIEE8InUiP0E6enJ9dmFyIG9lLFpyPW51bGw7ZnVuY3Rpb24gQnQoQSl7b2U9QX1mdW5jdGlvbiBkKCl7aWYodHlwZW9mIG9lPCJ1IilyZXR1cm4gb2U7bGV0IEE9UkEoKTtyZXR1cm4gdHlwZW9mIEE8InUiP0E6WnJ9dmFyIFo9bnVsbDthc3luYyBmdW5jdGlvbiBDdCgpe2xldCBBPWQoKSxlPXR5cGVvZiBBIT0ic3RyaW5nIiYmdHlwZW9mIEE/LmhyZWY8InUiP0EuaHJlZjpBO1o9YXdhaXQgaUEoZSl9ZnVuY3Rpb24gaHMoQSl7Wj1BfWFzeW5jIGZ1bmN0aW9uIHcoKXtpZihaIT09bnVsbClyZXR1cm4gWi50ZXJtaW5hdGVkJiZhd2FpdCBDdCgpLFo7bGV0IEE9Z3QoKTtyZXR1cm4gQSE9PW51bGw/QTooYXdhaXQgQ3QoKSxaKX1hc3luYyBmdW5jdGlvbiBWcihBLGU9e30pe2xldCB0PVt7dHlwZTpFLkpzb25Db21wYXRpYmxlfSx7dHlwZTpFLlRyYW5zZm9ybX1dLHI9QTtpZihBIGluc3RhbmNlb2YgRmlsZSl7bGV0IFE9YXdhaXQgQS5hcnJheUJ1ZmZlcigpO3I9e3BhdGg6QS5uYW1lLGRhdGE6bmV3IFVpbnQ4QXJyYXkoUSl9fWxldCBuPVt7dHlwZTpFLkJpbmFyeUZpbGUsZGF0YTpyfV0sbz1bXSxpPXIucGF0aDtvLnB1c2goaSksby5wdXNoKCIwIiksby5wdXNoKCIxIiksby5wdXNoKCItLW1lbW9yeS1pbyIpLGUuZmxvYXRQYXJhbWV0ZXJzJiZlLmZsb2F0UGFyYW1ldGVycyYmby5wdXNoKCItLWZsb2F0LXBhcmFtZXRlcnMiKTtsZXQgQz0iaGRmNS1yZWFkLXRyYW5zZm9ybSIscz1lPy53ZWJXb3JrZXI7cz09PXZvaWQgMCYmKHM9YXdhaXQgdygpKTtsZXR7d2ViV29ya2VyOmEscmV0dXJuVmFsdWU6YyxzdGRlcnI6SSxvdXRwdXRzOmx9PWF3YWl0IHkoQyxvLHQsbix7cGlwZWxpbmVCYXNlVXJsOmgoKSxwaXBlbGluZVdvcmtlclVybDpkKCksd2ViV29ya2VyOnMsbm9Db3B5OmU/Lm5vQ29weX0pO2lmKGMhPT0wJiZJIT09IiIpdGhyb3cgbmV3IEVycm9yKEkpO3JldHVybnt3ZWJXb3JrZXI6YSxjb3VsZFJlYWQ6bFswXT8uZGF0YSx0cmFuc2Zvcm06bFsxXT8uZGF0YX19dmFyIFhyPVZyO2FzeW5jIGZ1bmN0aW9uICRyKEEsZSx0PXt9KXtsZXQgcj1be3R5cGU6RS5Kc29uQ29tcGF0aWJsZX0se3R5cGU6RS5CaW5hcnlGaWxlLGRhdGE6e3BhdGg6ZSxkYXRhOm5ldyBVaW50OEFycmF5fX1dLG49W3t0eXBlOkUuVHJhbnNmb3JtLGRhdGE6QX1dLG89W107by5wdXNoKCIwIiksby5wdXNoKCIwIik7bGV0IGY9ZTtvLnB1c2goZiksby5wdXNoKCItLW1lbW9yeS1pbyIpLHQuZmxvYXRQYXJhbWV0ZXJzJiZ0LmZsb2F0UGFyYW1ldGVycyYmby5wdXNoKCItLWZsb2F0LXBhcmFtZXRlcnMiKSx0LnVzZUNvbXByZXNzaW9uJiZ0LnVzZUNvbXByZXNzaW9uJiZvLnB1c2goIi0tdXNlLWNvbXByZXNzaW9uIik7bGV0IEM9ImhkZjUtd3JpdGUtdHJhbnNmb3JtIixzPXQ/LndlYldvcmtlcjtzPT09dm9pZCAwJiYocz1hd2FpdCB3KCkpO2xldHt3ZWJXb3JrZXI6YSxyZXR1cm5WYWx1ZTpjLHN0ZGVycjpJLG91dHB1dHM6bH09YXdhaXQgeShDLG8scixuLHtwaXBlbGluZUJhc2VVcmw6aCgpLHBpcGVsaW5lV29ya2VyVXJsOmQoKSx3ZWJXb3JrZXI6cyxub0NvcHk6dD8ubm9Db3B5fSk7aWYoYyE9PTAmJkkhPT0iIil0aHJvdyBuZXcgRXJyb3IoSSk7cmV0dXJue3dlYldvcmtlcjphLGNvdWxkV3JpdGU6bFswXT8uZGF0YSxzZXJpYWxpemVkVHJhbnNmb3JtOmxbMV0/LmRhdGF9fXZhciBBbz0kcjthc3luYyBmdW5jdGlvbiBlbyhBLGU9e30pe2xldCB0PVt7dHlwZTpFLkpzb25Db21wYXRpYmxlfSx7dHlwZTpFLlRyYW5zZm9ybX1dLHI9QTtpZihBIGluc3RhbmNlb2YgRmlsZSl7bGV0IFE9YXdhaXQgQS5hcnJheUJ1ZmZlcigpO3I9e3BhdGg6QS5uYW1lLGRhdGE6bmV3IFVpbnQ4QXJyYXkoUSl9fWxldCBuPVt7dHlwZTpFLkJpbmFyeUZpbGUsZGF0YTpyfV0sbz1bXSxpPXIucGF0aDtvLnB1c2goaSksby5wdXNoKCIwIiksby5wdXNoKCIxIiksby5wdXNoKCItLW1lbW9yeS1pbyIpLGUuZmxvYXRQYXJhbWV0ZXJzJiZlLmZsb2F0UGFyYW1ldGVycyYmby5wdXNoKCItLWZsb2F0LXBhcmFtZXRlcnMiKTtsZXQgQz0ibWF0LXJlYWQtdHJhbnNmb3JtIixzPWU/LndlYldvcmtlcjtzPT09dm9pZCAwJiYocz1hd2FpdCB3KCkpO2xldHt3ZWJXb3JrZXI6YSxyZXR1cm5WYWx1ZTpjLHN0ZGVycjpJLG91dHB1dHM6bH09YXdhaXQgeShDLG8sdCxuLHtwaXBlbGluZUJhc2VVcmw6aCgpLHBpcGVsaW5lV29ya2VyVXJsOmQoKSx3ZWJXb3JrZXI6cyxub0NvcHk6ZT8ubm9Db3B5fSk7aWYoYyE9PTAmJkkhPT0iIil0aHJvdyBuZXcgRXJyb3IoSSk7cmV0dXJue3dlYldvcmtlcjphLGNvdWxkUmVhZDpsWzBdPy5kYXRhLHRyYW5zZm9ybTpsWzFdPy5kYXRhfX12YXIgdG89ZW87YXN5bmMgZnVuY3Rpb24gcm8oQSxlLHQ9e30pe2xldCByPVt7dHlwZTpFLkpzb25Db21wYXRpYmxlfSx7dHlwZTpFLkJpbmFyeUZpbGUsZGF0YTp7cGF0aDplLGRhdGE6bmV3IFVpbnQ4QXJyYXl9fV0sbj1be3R5cGU6RS5UcmFuc2Zvcm0sZGF0YTpBfV0sbz1bXTtvLnB1c2goIjAiKSxvLnB1c2goIjAiKTtsZXQgZj1lO28ucHVzaChmKSxvLnB1c2goIi0tbWVtb3J5LWlvIiksdC5mbG9hdFBhcmFtZXRlcnMmJnQuZmxvYXRQYXJhbWV0ZXJzJiZvLnB1c2goIi0tZmxvYXQtcGFyYW1ldGVycyIpLHQudXNlQ29tcHJlc3Npb24mJnQudXNlQ29tcHJlc3Npb24mJm8ucHVzaCgiLS11c2UtY29tcHJlc3Npb24iKTtsZXQgQz0ibWF0LXdyaXRlLXRyYW5zZm9ybSIscz10Py53ZWJXb3JrZXI7cz09PXZvaWQgMCYmKHM9YXdhaXQgdygpKTtsZXR7d2ViV29ya2VyOmEscmV0dXJuVmFsdWU6YyxzdGRlcnI6SSxvdXRwdXRzOmx9PWF3YWl0IHkoQyxvLHIsbix7cGlwZWxpbmVCYXNlVXJsOmgoKSxwaXBlbGluZVdvcmtlclVybDpkKCksd2ViV29ya2VyOnMsbm9Db3B5OnQ/Lm5vQ29weX0pO2lmKGMhPT0wJiZJIT09IiIpdGhyb3cgbmV3IEVycm9yKEkpO3JldHVybnt3ZWJXb3JrZXI6YSxjb3VsZFdyaXRlOmxbMF0/LmRhdGEsc2VyaWFsaXplZFRyYW5zZm9ybTpsWzFdPy5kYXRhfX12YXIgb289cm87YXN5bmMgZnVuY3Rpb24gbm8oQSxlPXt9KXtsZXQgdD1be3R5cGU6RS5Kc29uQ29tcGF0aWJsZX0se3R5cGU6RS5UcmFuc2Zvcm19XSxyPUE7aWYoQSBpbnN0YW5jZW9mIEZpbGUpe2xldCBRPWF3YWl0IEEuYXJyYXlCdWZmZXIoKTtyPXtwYXRoOkEubmFtZSxkYXRhOm5ldyBVaW50OEFycmF5KFEpfX1sZXQgbj1be3R5cGU6RS5CaW5hcnlGaWxlLGRhdGE6cn1dLG89W10saT1yLnBhdGg7by5wdXNoKGkpLG8ucHVzaCgiMCIpLG8ucHVzaCgiMSIpLG8ucHVzaCgiLS1tZW1vcnktaW8iKSxlLmZsb2F0UGFyYW1ldGVycyYmZS5mbG9hdFBhcmFtZXRlcnMmJm8ucHVzaCgiLS1mbG9hdC1wYXJhbWV0ZXJzIik7bGV0IEM9Im1uYy1yZWFkLXRyYW5zZm9ybSIscz1lPy53ZWJXb3JrZXI7cz09PXZvaWQgMCYmKHM9YXdhaXQgdygpKTtsZXR7d2ViV29ya2VyOmEscmV0dXJuVmFsdWU6YyxzdGRlcnI6SSxvdXRwdXRzOmx9PWF3YWl0IHkoQyxvLHQsbix7cGlwZWxpbmVCYXNlVXJsOmgoKSxwaXBlbGluZVdvcmtlclVybDpkKCksd2ViV29ya2VyOnMsbm9Db3B5OmU/Lm5vQ29weX0pO2lmKGMhPT0wJiZJIT09IiIpdGhyb3cgbmV3IEVycm9yKEkpO3JldHVybnt3ZWJXb3JrZXI6YSxjb3VsZFJlYWQ6bFswXT8uZGF0YSx0cmFuc2Zvcm06bFsxXT8uZGF0YX19dmFyIGlvPW5vO2FzeW5jIGZ1bmN0aW9uIGFvKEEsZSx0PXt9KXtsZXQgcj1be3R5cGU6RS5Kc29uQ29tcGF0aWJsZX0se3R5cGU6RS5CaW5hcnlGaWxlLGRhdGE6e3BhdGg6ZSxkYXRhOm5ldyBVaW50OEFycmF5fX1dLG49W3t0eXBlOkUuVHJhbnNmb3JtLGRhdGE6QX1dLG89W107by5wdXNoKCIwIiksby5wdXNoKCIwIik7bGV0IGY9ZTtvLnB1c2goZiksby5wdXNoKCItLW1lbW9yeS1pbyIpLHQuZmxvYXRQYXJhbWV0ZXJzJiZ0LmZsb2F0UGFyYW1ldGVycyYmby5wdXNoKCItLWZsb2F0LXBhcmFtZXRlcnMiKSx0LnVzZUNvbXByZXNzaW9uJiZ0LnVzZUNvbXByZXNzaW9uJiZvLnB1c2goIi0tdXNlLWNvbXByZXNzaW9uIik7bGV0IEM9Im1uYy13cml0ZS10cmFuc2Zvcm0iLHM9dD8ud2ViV29ya2VyO3M9PT12b2lkIDAmJihzPWF3YWl0IHcoKSk7bGV0e3dlYldvcmtlcjphLHJldHVyblZhbHVlOmMsc3RkZXJyOkksb3V0cHV0czpsfT1hd2FpdCB5KEMsbyxyLG4se3BpcGVsaW5lQmFzZVVybDpoKCkscGlwZWxpbmVXb3JrZXJVcmw6ZCgpLHdlYldvcmtlcjpzLG5vQ29weTp0Py5ub0NvcHl9KTtpZihjIT09MCYmSSE9PSIiKXRocm93IG5ldyBFcnJvcihJKTtyZXR1cm57d2ViV29ya2VyOmEsY291bGRXcml0ZTpsWzBdPy5kYXRhLHNlcmlhbGl6ZWRUcmFuc2Zvcm06bFsxXT8uZGF0YX19dmFyIHNvPWFvO2FzeW5jIGZ1bmN0aW9uIElvKEEsZT17fSl7bGV0IHQ9W3t0eXBlOkUuSnNvbkNvbXBhdGlibGV9LHt0eXBlOkUuVHJhbnNmb3JtfV0scj1BO2lmKEEgaW5zdGFuY2VvZiBGaWxlKXtsZXQgUT1hd2FpdCBBLmFycmF5QnVmZmVyKCk7cj17cGF0aDpBLm5hbWUsZGF0YTpuZXcgVWludDhBcnJheShRKX19bGV0IG49W3t0eXBlOkUuQmluYXJ5RmlsZSxkYXRhOnJ9XSxvPVtdLGk9ci5wYXRoO28ucHVzaChpKSxvLnB1c2goIjAiKSxvLnB1c2goIjEiKSxvLnB1c2goIi0tbWVtb3J5LWlvIiksZS5mbG9hdFBhcmFtZXRlcnMmJmUuZmxvYXRQYXJhbWV0ZXJzJiZvLnB1c2goIi0tZmxvYXQtcGFyYW1ldGVycyIpO2xldCBDPSJ0eHQtcmVhZC10cmFuc2Zvcm0iLHM9ZT8ud2ViV29ya2VyO3M9PT12b2lkIDAmJihzPWF3YWl0IHcoKSk7bGV0e3dlYldvcmtlcjphLHJldHVyblZhbHVlOmMsc3RkZXJyOkksb3V0cHV0czpsfT1hd2FpdCB5KEMsbyx0LG4se3BpcGVsaW5lQmFzZVVybDpoKCkscGlwZWxpbmVXb3JrZXJVcmw6ZCgpLHdlYldvcmtlcjpzLG5vQ29weTplPy5ub0NvcHl9KTtpZihjIT09MCYmSSE9PSIiKXRocm93IG5ldyBFcnJvcihJKTtyZXR1cm57d2ViV29ya2VyOmEsY291bGRSZWFkOmxbMF0/LmRhdGEsdHJhbnNmb3JtOmxbMV0/LmRhdGF9fXZhciBnbz1Jbzthc3luYyBmdW5jdGlvbiBCbyhBLGUsdD17fSl7bGV0IHI9W3t0eXBlOkUuSnNvbkNvbXBhdGlibGV9LHt0eXBlOkUuQmluYXJ5RmlsZSxkYXRhOntwYXRoOmUsZGF0YTpuZXcgVWludDhBcnJheX19XSxuPVt7dHlwZTpFLlRyYW5zZm9ybSxkYXRhOkF9XSxvPVtdO28ucHVzaCgiMCIpLG8ucHVzaCgiMCIpO2xldCBmPWU7by5wdXNoKGYpLG8ucHVzaCgiLS1tZW1vcnktaW8iKSx0LmZsb2F0UGFyYW1ldGVycyYmdC5mbG9hdFBhcmFtZXRlcnMmJm8ucHVzaCgiLS1mbG9hdC1wYXJhbWV0ZXJzIiksdC51c2VDb21wcmVzc2lvbiYmdC51c2VDb21wcmVzc2lvbiYmby5wdXNoKCItLXVzZS1jb21wcmVzc2lvbiIpO2xldCBDPSJ0eHQtd3JpdGUtdHJhbnNmb3JtIixzPXQ/LndlYldvcmtlcjtzPT09dm9pZCAwJiYocz1hd2FpdCB3KCkpO2xldHt3ZWJXb3JrZXI6YSxyZXR1cm5WYWx1ZTpjLHN0ZGVycjpJLG91dHB1dHM6bH09YXdhaXQgeShDLG8scixuLHtwaXBlbGluZUJhc2VVcmw6aCgpLHBpcGVsaW5lV29ya2VyVXJsOmQoKSx3ZWJXb3JrZXI6cyxub0NvcHk6dD8ubm9Db3B5fSk7aWYoYyE9PTAmJkkhPT0iIil0aHJvdyBuZXcgRXJyb3IoSSk7cmV0dXJue3dlYldvcmtlcjphLGNvdWxkV3JpdGU6bFswXT8uZGF0YSxzZXJpYWxpemVkVHJhbnNmb3JtOmxbMV0/LmRhdGF9fXZhciBDbz1Cbzthc3luYyBmdW5jdGlvbiBsbyhBLGU9e30pe2xldCB0PVt7dHlwZTpFLkpzb25Db21wYXRpYmxlfSx7dHlwZTpFLlRyYW5zZm9ybX1dLHI9QTtpZihBIGluc3RhbmNlb2YgRmlsZSl7bGV0IFE9YXdhaXQgQS5hcnJheUJ1ZmZlcigpO3I9e3BhdGg6QS5uYW1lLGRhdGE6bmV3IFVpbnQ4QXJyYXkoUSl9fWxldCBuPVt7dHlwZTpFLkJpbmFyeUZpbGUsZGF0YTpyfV0sbz1bXSxpPXIucGF0aDtvLnB1c2goaSksby5wdXNoKCIwIiksby5wdXNoKCIxIiksby5wdXNoKCItLW1lbW9yeS1pbyIpLGUuZmxvYXRQYXJhbWV0ZXJzJiZlLmZsb2F0UGFyYW1ldGVycyYmby5wdXNoKCItLWZsb2F0LXBhcmFtZXRlcnMiKTtsZXQgQz0id2FzbS1yZWFkLXRyYW5zZm9ybSIscz1lPy53ZWJXb3JrZXI7cz09PXZvaWQgMCYmKHM9YXdhaXQgdygpKTtsZXR7d2ViV29ya2VyOmEscmV0dXJuVmFsdWU6YyxzdGRlcnI6SSxvdXRwdXRzOmx9PWF3YWl0IHkoQyxvLHQsbix7cGlwZWxpbmVCYXNlVXJsOmgoKSxwaXBlbGluZVdvcmtlclVybDpkKCksd2ViV29ya2VyOnMsbm9Db3B5OmU/Lm5vQ29weX0pO2lmKGMhPT0wJiZJIT09IiIpdGhyb3cgbmV3IEVycm9yKEkpO3JldHVybnt3ZWJXb3JrZXI6YSxjb3VsZFJlYWQ6bFswXT8uZGF0YSx0cmFuc2Zvcm06bFsxXT8uZGF0YX19dmFyIGZvPWxvO2FzeW5jIGZ1bmN0aW9uIGNvKEEsZSx0PXt9KXtsZXQgcj1be3R5cGU6RS5Kc29uQ29tcGF0aWJsZX0se3R5cGU6RS5CaW5hcnlGaWxlLGRhdGE6e3BhdGg6ZSxkYXRhOm5ldyBVaW50OEFycmF5fX1dLG49W3t0eXBlOkUuVHJhbnNmb3JtLGRhdGE6QX1dLG89W107by5wdXNoKCIwIiksby5wdXNoKCIwIik7bGV0IGY9ZTtvLnB1c2goZiksby5wdXNoKCItLW1lbW9yeS1pbyIpLHQuZmxvYXRQYXJhbWV0ZXJzJiZ0LmZsb2F0UGFyYW1ldGVycyYmby5wdXNoKCItLWZsb2F0LXBhcmFtZXRlcnMiKSx0LnVzZUNvbXByZXNzaW9uJiZ0LnVzZUNvbXByZXNzaW9uJiZvLnB1c2goIi0tdXNlLWNvbXByZXNzaW9uIik7bGV0IEM9Indhc20td3JpdGUtdHJhbnNmb3JtIixzPXQ/LndlYldvcmtlcjtzPT09dm9pZCAwJiYocz1hd2FpdCB3KCkpO2xldHt3ZWJXb3JrZXI6YSxyZXR1cm5WYWx1ZTpjLHN0ZGVycjpJLG91dHB1dHM6bH09YXdhaXQgeShDLG8scixuLHtwaXBlbGluZUJhc2VVcmw6aCgpLHBpcGVsaW5lV29ya2VyVXJsOmQoKSx3ZWJXb3JrZXI6cyxub0NvcHk6dD8ubm9Db3B5fSk7aWYoYyE9PTAmJkkhPT0iIil0aHJvdyBuZXcgRXJyb3IoSSk7cmV0dXJue3dlYldvcmtlcjphLGNvdWxkV3JpdGU6bFswXT8uZGF0YSxzZXJpYWxpemVkVHJhbnNmb3JtOmxbMV0/LmRhdGF9fXZhciB1bz1jbzthc3luYyBmdW5jdGlvbiBFbyhBLGU9e30pe2xldCB0PVt7dHlwZTpFLkpzb25Db21wYXRpYmxlfSx7dHlwZTpFLlRyYW5zZm9ybX1dLHI9QTtpZihBIGluc3RhbmNlb2YgRmlsZSl7bGV0IFE9YXdhaXQgQS5hcnJheUJ1ZmZlcigpO3I9e3BhdGg6QS5uYW1lLGRhdGE6bmV3IFVpbnQ4QXJyYXkoUSl9fWxldCBuPVt7dHlwZTpFLkJpbmFyeUZpbGUsZGF0YTpyfV0sbz1bXSxpPXIucGF0aDtvLnB1c2goaSksby5wdXNoKCIwIiksby5wdXNoKCIxIiksby5wdXNoKCItLW1lbW9yeS1pbyIpLGUuZmxvYXRQYXJhbWV0ZXJzJiZlLmZsb2F0UGFyYW1ldGVycyYmby5wdXNoKCItLWZsb2F0LXBhcmFtZXRlcnMiKTtsZXQgQz0id2FzbS16c3RkLXJlYWQtdHJhbnNmb3JtIixzPWU/LndlYldvcmtlcjtzPT09dm9pZCAwJiYocz1hd2FpdCB3KCkpO2xldHt3ZWJXb3JrZXI6YSxyZXR1cm5WYWx1ZTpjLHN0ZGVycjpJLG91dHB1dHM6bH09YXdhaXQgeShDLG8sdCxuLHtwaXBlbGluZUJhc2VVcmw6aCgpLHBpcGVsaW5lV29ya2VyVXJsOmQoKSx3ZWJXb3JrZXI6cyxub0NvcHk6ZT8ubm9Db3B5fSk7aWYoYyE9PTAmJkkhPT0iIil0aHJvdyBuZXcgRXJyb3IoSSk7cmV0dXJue3dlYldvcmtlcjphLGNvdWxkUmVhZDpsWzBdPy5kYXRhLHRyYW5zZm9ybTpsWzFdPy5kYXRhfX12YXIgUW89RW87YXN5bmMgZnVuY3Rpb24gcG8oQSxlLHQ9e30pe2xldCByPVt7dHlwZTpFLkpzb25Db21wYXRpYmxlfSx7dHlwZTpFLkJpbmFyeUZpbGUsZGF0YTp7cGF0aDplLGRhdGE6bmV3IFVpbnQ4QXJyYXl9fV0sbj1be3R5cGU6RS5UcmFuc2Zvcm0sZGF0YTpBfV0sbz1bXTtvLnB1c2goIjAiKSxvLnB1c2goIjAiKTtsZXQgZj1lO28ucHVzaChmKSxvLnB1c2goIi0tbWVtb3J5LWlvIiksdC5mbG9hdFBhcmFtZXRlcnMmJnQuZmxvYXRQYXJhbWV0ZXJzJiZvLnB1c2goIi0tZmxvYXQtcGFyYW1ldGVycyIpLHQudXNlQ29tcHJlc3Npb24mJnQudXNlQ29tcHJlc3Npb24mJm8ucHVzaCgiLS11c2UtY29tcHJlc3Npb24iKTtsZXQgQz0id2FzbS16c3RkLXdyaXRlLXRyYW5zZm9ybSIscz10Py53ZWJXb3JrZXI7cz09PXZvaWQgMCYmKHM9YXdhaXQgdygpKTtsZXR7d2ViV29ya2VyOmEscmV0dXJuVmFsdWU6YyxzdGRlcnI6SSxvdXRwdXRzOmx9PWF3YWl0IHkoQyxvLHIsbix7cGlwZWxpbmVCYXNlVXJsOmgoKSxwaXBlbGluZVdvcmtlclVybDpkKCksd2ViV29ya2VyOnMsbm9Db3B5OnQ/Lm5vQ29weX0pO2lmKGMhPT0wJiZJIT09IiIpdGhyb3cgbmV3IEVycm9yKEkpO3JldHVybnt3ZWJXb3JrZXI6YSxjb3VsZFdyaXRlOmxbMF0/LmRhdGEsc2VyaWFsaXplZFRyYW5zZm9ybTpsWzFdPy5kYXRhfX12YXIgbW89cG87dmFyIGx0PSdkYXRhOnRleHQvamF2YXNjcmlwdDtjaGFyc2V0PXV0Zi04LHZhciBJST1PYmplY3QuZGVmaW5lUHJvcGVydHk7dmFyIGVJPShBLHQpPT57Zm9yKHZhciBJIGluIHQpSUkoQSxJLHtnZXQ6dFtJXSxlbnVtZXJhYmxlOiEwfSl9O3ZhciB2QT1TeW1ib2woIkNvbWxpbmsucHJveHkiKSxnST1TeW1ib2woIkNvbWxpbmsuZW5kcG9pbnQiKSxyST1TeW1ib2woIkNvbWxpbmsucmVsZWFzZVByb3h5IikscEE9U3ltYm9sKCJDb21saW5rLmZpbmFsaXplciIpLGVBPVN5bWJvbCgiQ29tbGluay50aHJvd24iKSwkQT1BPT50eXBlb2YgQT09Im9iamVjdCImJkEhPT1udWxsfHx0eXBlb2YgQT09ImZ1bmN0aW9uIixvST17Y2FuSGFuZGxlOkE9PiRBKEEpJiZBW3ZBXSxzZXJpYWxpemUoQSl7bGV0e3BvcnQxOnQscG9ydDI6SX09bmV3IE1lc3NhZ2VDaGFubmVsO3JldHVybiBpQShBLHQpLFtJLFtJXV19LGRlc2VyaWFsaXplKEEpe3JldHVybiBBLnN0YXJ0KCksbkkoQSl9fSxpST17Y2FuSGFuZGxlOkE9PiRBKEEpJiZlQSBpbiBBLHNlcmlhbGl6ZSh7dmFsdWU6QX0pe2xldCB0O3JldHVybiBBIGluc3RhbmNlb2YgRXJyb3I/dD17aXNFcnJvcjohMCx2YWx1ZTp7bWVzc2FnZTpBLm1lc3NhZ2UsbmFtZTpBLm5hbWUsc3RhY2s6QS5zdGFja319OnQ9e2lzRXJyb3I6ITEsdmFsdWU6QX0sW3QsW11dfSxkZXNlcmlhbGl6ZShBKXt0aHJvdyBBLmlzRXJyb3I/T2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoQS52YWx1ZS5tZXNzYWdlKSxBLnZhbHVlKTpBLnZhbHVlfX0sQXQ9bmV3IE1hcChbWyJwcm94eSIsb0ldLFsidGhyb3ciLGlJXV0pO2Z1bmN0aW9uIENJKEEsdCl7Zm9yKGxldCBJIG9mIEEpaWYodD09PUl8fEk9PT0iKiJ8fEkgaW5zdGFuY2VvZiBSZWdFeHAmJkkudGVzdCh0KSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBpQShBLHQ9Z2xvYmFsVGhpcyxJPVsiKiJdKXt0LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uIGUoZyl7aWYoIWd8fCFnLmRhdGEpcmV0dXJuO2lmKCFDSShJLGcub3JpZ2luKSl7Y29uc29sZS53YXJuKGBJbnZhbGlkIG9yaWdpbiBcJyR7Zy5vcmlnaW59XCcgZm9yIGNvbWxpbmsgcHJveHlgKTtyZXR1cm59bGV0e2lkOnIsdHlwZTpvLHBhdGg6bn09T2JqZWN0LmFzc2lnbih7cGF0aDpbXX0sZy5kYXRhKSxhPShnLmRhdGEuYXJndW1lbnRMaXN0fHxbXSkubWFwKGIpLFE7dHJ5e2xldCBCPW4uc2xpY2UoMCwtMSkucmVkdWNlKChmLHMpPT5mW3NdLEEpLGk9bi5yZWR1Y2UoKGYscyk9PmZbc10sQSk7c3dpdGNoKG8pe2Nhc2UiR0VUIjpRPWk7YnJlYWs7Y2FzZSJTRVQiOkJbbi5zbGljZSgtMSlbMF1dPWIoZy5kYXRhLnZhbHVlKSxRPSEwO2JyZWFrO2Nhc2UiQVBQTFkiOlE9aS5hcHBseShCLGEpO2JyZWFrO2Nhc2UiQ09OU1RSVUNUIjp7bGV0IGY9bmV3IGkoLi4uYSk7UT1hSShmKX1icmVhaztjYXNlIkVORFBPSU5UIjp7bGV0e3BvcnQxOmYscG9ydDI6c309bmV3IE1lc3NhZ2VDaGFubmVsO2lBKEEscyksUT1GQShmLFtmXSl9YnJlYWs7Y2FzZSJSRUxFQVNFIjpRPXZvaWQgMDticmVhaztkZWZhdWx0OnJldHVybn19Y2F0Y2goQil7UT17dmFsdWU6QixbZUFdOjB9fVByb21pc2UucmVzb2x2ZShRKS5jYXRjaChCPT4oe3ZhbHVlOkIsW2VBXTowfSkpLnRoZW4oQj0+e2xldFtpLGZdPW9BKEIpO3QucG9zdE1lc3NhZ2UoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGkpLHtpZDpyfSksZiksbz09PSJSRUxFQVNFIiYmKHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZSksdHQodCkscEEgaW4gQSYmdHlwZW9mIEFbcEFdPT0iZnVuY3Rpb24iJiZBW3BBXSgpKX0pLmNhdGNoKEI9PntsZXRbaSxmXT1vQSh7dmFsdWU6bmV3IFR5cGVFcnJvcigiVW5zZXJpYWxpemFibGUgcmV0dXJuIHZhbHVlIiksW2VBXTowfSk7dC5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30saSkse2lkOnJ9KSxmKX0pfSksdC5zdGFydCYmdC5zdGFydCgpfWZ1bmN0aW9uIEJJKEEpe3JldHVybiBBLmNvbnN0cnVjdG9yLm5hbWU9PT0iTWVzc2FnZVBvcnQifWZ1bmN0aW9uIHR0KEEpe0JJKEEpJiZBLmNsb3NlKCl9ZnVuY3Rpb24gbkkoQSx0KXtyZXR1cm4gU0EoQSxbXSx0KX1mdW5jdGlvbiBJQShBKXtpZihBKXRocm93IG5ldyBFcnJvcigiUHJveHkgaGFzIGJlZW4gcmVsZWFzZWQgYW5kIGlzIG5vdCB1c2VhYmxlIil9ZnVuY3Rpb24gSXQoQSl7cmV0dXJuIHEoQSx7dHlwZToiUkVMRUFTRSJ9KS50aGVuKCgpPT57dHQoQSl9KX12YXIgZ0E9bmV3IFdlYWtNYXAsckE9IkZpbmFsaXphdGlvblJlZ2lzdHJ5ImluIGdsb2JhbFRoaXMmJm5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShBPT57bGV0IHQ9KGdBLmdldChBKXx8MCktMTtnQS5zZXQoQSx0KSx0PT09MCYmSXQoQSl9KTtmdW5jdGlvbiBzSShBLHQpe2xldCBJPShnQS5nZXQodCl8fDApKzE7Z0Euc2V0KHQsSSksckEmJnJBLnJlZ2lzdGVyKEEsdCxBKX1mdW5jdGlvbiBRSShBKXtyQSYmckEudW5yZWdpc3RlcihBKX1mdW5jdGlvbiBTQShBLHQ9W10sST1mdW5jdGlvbigpe30pe2xldCBlPSExLGc9bmV3IFByb3h5KEkse2dldChyLG8pe2lmKElBKGUpLG89PT1ySSlyZXR1cm4oKT0+e1FJKGcpLEl0KEEpLGU9ITB9O2lmKG89PT0idGhlbiIpe2lmKHQubGVuZ3RoPT09MClyZXR1cm57dGhlbjooKT0+Z307bGV0IG49cShBLHt0eXBlOiJHRVQiLHBhdGg6dC5tYXAoYT0+YS50b1N0cmluZygpKX0pLnRoZW4oYik7cmV0dXJuIG4udGhlbi5iaW5kKG4pfXJldHVybiBTQShBLFsuLi50LG9dKX0sc2V0KHIsbyxuKXtJQShlKTtsZXRbYSxRXT1vQShuKTtyZXR1cm4gcShBLHt0eXBlOiJTRVQiLHBhdGg6Wy4uLnQsb10ubWFwKEI9PkIudG9TdHJpbmcoKSksdmFsdWU6YX0sUSkudGhlbihiKX0sYXBwbHkocixvLG4pe0lBKGUpO2xldCBhPXRbdC5sZW5ndGgtMV07aWYoYT09PWdJKXJldHVybiBxKEEse3R5cGU6IkVORFBPSU5UIn0pLnRoZW4oYik7aWYoYT09PSJiaW5kIilyZXR1cm4gU0EoQSx0LnNsaWNlKDAsLTEpKTtsZXRbUSxCXT1fQShuKTtyZXR1cm4gcShBLHt0eXBlOiJBUFBMWSIscGF0aDp0Lm1hcChpPT5pLnRvU3RyaW5nKCkpLGFyZ3VtZW50TGlzdDpRfSxCKS50aGVuKGIpfSxjb25zdHJ1Y3QocixvKXtJQShlKTtsZXRbbixhXT1fQShvKTtyZXR1cm4gcShBLHt0eXBlOiJDT05TVFJVQ1QiLHBhdGg6dC5tYXAoUT0+US50b1N0cmluZygpKSxhcmd1bWVudExpc3Q6bn0sYSkudGhlbihiKX19KTtyZXR1cm4gc0koZyxBKSxnfWZ1bmN0aW9uIEVJKEEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLEEpfWZ1bmN0aW9uIF9BKEEpe2xldCB0PUEubWFwKG9BKTtyZXR1cm5bdC5tYXAoST0+SVswXSksRUkodC5tYXAoST0+SVsxXSkpXX12YXIgZXQ9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gRkEoQSx0KXtyZXR1cm4gZXQuc2V0KEEsdCksQX1mdW5jdGlvbiBhSShBKXtyZXR1cm4gT2JqZWN0LmFzc2lnbihBLHtbdkFdOiEwfSl9ZnVuY3Rpb24gb0EoQSl7Zm9yKGxldFt0LEldb2YgQXQpaWYoSS5jYW5IYW5kbGUoQSkpe2xldFtlLGddPUkuc2VyaWFsaXplKEEpO3JldHVyblt7dHlwZToiSEFORExFUiIsbmFtZTp0LHZhbHVlOmV9LGddfXJldHVyblt7dHlwZToiUkFXIix2YWx1ZTpBfSxldC5nZXQoQSl8fFtdXX1mdW5jdGlvbiBiKEEpe3N3aXRjaChBLnR5cGUpe2Nhc2UiSEFORExFUiI6cmV0dXJuIEF0LmdldChBLm5hbWUpLmRlc2VyaWFsaXplKEEudmFsdWUpO2Nhc2UiUkFXIjpyZXR1cm4gQS52YWx1ZX19ZnVuY3Rpb24gcShBLHQsSSl7cmV0dXJuIG5ldyBQcm9taXNlKGU9PntsZXQgZz1jSSgpO0EuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24gcihvKXshby5kYXRhfHwhby5kYXRhLmlkfHxvLmRhdGEuaWQhPT1nfHwoQS5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixyKSxlKG8uZGF0YSkpfSksQS5zdGFydCYmQS5zdGFydCgpLEEucG9zdE1lc3NhZ2UoT2JqZWN0LmFzc2lnbih7aWQ6Z30sdCksSSl9KX1mdW5jdGlvbiBjSSgpe3JldHVybiBuZXcgQXJyYXkoNCkuZmlsbCgwKS5tYXAoKCk9Pk1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikudG9TdHJpbmcoMTYpKS5qb2luKCItIil9ZnVuY3Rpb24gVyhBLHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBBLmFwcGx5KHQsYXJndW1lbnRzKX19dmFye3RvU3RyaW5nOmZJfT1PYmplY3QucHJvdG90eXBlLHtnZXRQcm90b3R5cGVPZjpVQX09T2JqZWN0LEJBPShBPT50PT57bGV0IEk9ZkkuY2FsbCh0KTtyZXR1cm4gQVtJXXx8KEFbSV09SS5zbGljZSg4LC0xKS50b0xvd2VyQ2FzZSgpKX0pKE9iamVjdC5jcmVhdGUobnVsbCkpLFU9QT0+KEE9QS50b0xvd2VyQ2FzZSgpLHQ9PkJBKHQpPT09QSksbkE9QT0+dD0+dHlwZW9mIHQ9PT1BLHtpc0FycmF5Okt9PUFycmF5LFo9bkEoInVuZGVmaW5lZCIpO2Z1bmN0aW9uIGxJKEEpe3JldHVybiBBIT09bnVsbCYmIVooQSkmJkEuY29uc3RydWN0b3IhPT1udWxsJiYhWihBLmNvbnN0cnVjdG9yKSYmRihBLmNvbnN0cnVjdG9yLmlzQnVmZmVyKSYmQS5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihBKX12YXIgaXQ9VSgiQXJyYXlCdWZmZXIiKTtmdW5jdGlvbiBESShBKXtsZXQgdDtyZXR1cm4gdHlwZW9mIEFycmF5QnVmZmVyPCJ1IiYmQXJyYXlCdWZmZXIuaXNWaWV3P3Q9QXJyYXlCdWZmZXIuaXNWaWV3KEEpOnQ9QSYmQS5idWZmZXImJml0KEEuYnVmZmVyKSx0fXZhciB1ST1uQSgic3RyaW5nIiksRj1uQSgiZnVuY3Rpb24iKSxDdD1uQSgibnVtYmVyIiksc0E9QT0+QSE9PW51bGwmJnR5cGVvZiBBPT0ib2JqZWN0IixoST1BPT5BPT09ITB8fEE9PT0hMSxDQT1BPT57aWYoQkEoQSkhPT0ib2JqZWN0IilyZXR1cm4hMTtsZXQgdD1VQShBKTtyZXR1cm4odD09PW51bGx8fHQ9PT1PYmplY3QucHJvdG90eXBlfHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCk9PT1udWxsKSYmIShTeW1ib2wudG9TdHJpbmdUYWcgaW4gQSkmJiEoU3ltYm9sLml0ZXJhdG9yIGluIEEpfSxkST1VKCJEYXRlIikseUk9VSgiRmlsZSIpLHdJPVUoIkJsb2IiKSxtST1VKCJGaWxlTGlzdCIpLHBJPUE9PnNBKEEpJiZGKEEucGlwZSksU0k9QT0+e2xldCB0O3JldHVybiBBJiYodHlwZW9mIEZvcm1EYXRhPT0iZnVuY3Rpb24iJiZBIGluc3RhbmNlb2YgRm9ybURhdGF8fEYoQS5hcHBlbmQpJiYoKHQ9QkEoQSkpPT09ImZvcm1kYXRhInx8dD09PSJvYmplY3QiJiZGKEEudG9TdHJpbmcpJiZBLnRvU3RyaW5nKCk9PT0iW29iamVjdCBGb3JtRGF0YV0iKSl9LEZJPVUoIlVSTFNlYXJjaFBhcmFtcyIpLFJJPUE9PkEudHJpbT9BLnRyaW0oKTpBLnJlcGxhY2UoL15bXFxzXFx1RkVGRlxceEEwXSt8W1xcc1xcdUZFRkZcXHhBMF0rJC9nLCIiKTtmdW5jdGlvbiBWKEEsdCx7YWxsT3duS2V5czpJPSExfT17fSl7aWYoQT09PW51bGx8fHR5cGVvZiBBPiJ1IilyZXR1cm47bGV0IGUsZztpZih0eXBlb2YgQSE9Im9iamVjdCImJihBPVtBXSksSyhBKSlmb3IoZT0wLGc9QS5sZW5ndGg7ZTxnO2UrKyl0LmNhbGwobnVsbCxBW2VdLGUsQSk7ZWxzZXtsZXQgcj1JP09iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKEEpOk9iamVjdC5rZXlzKEEpLG89ci5sZW5ndGgsbjtmb3IoZT0wO2U8bztlKyspbj1yW2VdLHQuY2FsbChudWxsLEFbbl0sbixBKX19ZnVuY3Rpb24gQnQoQSx0KXt0PXQudG9Mb3dlckNhc2UoKTtsZXQgST1PYmplY3Qua2V5cyhBKSxlPUkubGVuZ3RoLGc7Zm9yKDtlLS0gPjA7KWlmKGc9SVtlXSx0PT09Zy50b0xvd2VyQ2FzZSgpKXJldHVybiBnO3JldHVybiBudWxsfXZhciBudD10eXBlb2YgZ2xvYmFsVGhpczwidSI/Z2xvYmFsVGhpczp0eXBlb2Ygc2VsZjwidSI/c2VsZjp0eXBlb2Ygd2luZG93PCJ1Ij93aW5kb3c6Z2xvYmFsLHN0PUE9PiFaKEEpJiZBIT09bnQ7ZnVuY3Rpb24gTkEoKXtsZXR7Y2FzZWxlc3M6QX09c3QodGhpcykmJnRoaXN8fHt9LHQ9e30sST0oZSxnKT0+e2xldCByPUEmJkJ0KHQsZyl8fGc7Q0EodFtyXSkmJkNBKGUpP3Rbcl09TkEodFtyXSxlKTpDQShlKT90W3JdPU5BKHt9LGUpOksoZSk/dFtyXT1lLnNsaWNlKCk6dFtyXT1lfTtmb3IobGV0IGU9MCxnPWFyZ3VtZW50cy5sZW5ndGg7ZTxnO2UrKylhcmd1bWVudHNbZV0mJlYoYXJndW1lbnRzW2VdLEkpO3JldHVybiB0fXZhciBOST0oQSx0LEkse2FsbE93bktleXM6ZX09e30pPT4oVih0LChnLHIpPT57SSYmRihnKT9BW3JdPVcoZyxJKTpBW3JdPWd9LHthbGxPd25LZXlzOmV9KSxBKSxVST1BPT4oQS5jaGFyQ29kZUF0KDApPT09NjUyNzkmJihBPUEuc2xpY2UoMSkpLEEpLEdJPShBLHQsSSxlKT0+e0EucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUsZSksQS5wcm90b3R5cGUuY29uc3RydWN0b3I9QSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQSwic3VwZXIiLHt2YWx1ZTp0LnByb3RvdHlwZX0pLEkmJk9iamVjdC5hc3NpZ24oQS5wcm90b3R5cGUsSSl9LGtJPShBLHQsSSxlKT0+e2xldCBnLHIsbyxuPXt9O2lmKHQ9dHx8e30sQT09bnVsbClyZXR1cm4gdDtkb3tmb3IoZz1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhBKSxyPWcubGVuZ3RoO3ItLSA+MDspbz1nW3JdLCghZXx8ZShvLEEsdCkpJiYhbltvXSYmKHRbb109QVtvXSxuW29dPSEwKTtBPUkhPT0hMSYmVUEoQSl9d2hpbGUoQSYmKCFJfHxJKEEsdCkpJiZBIT09T2JqZWN0LnByb3RvdHlwZSk7cmV0dXJuIHR9LExJPShBLHQsSSk9PntBPVN0cmluZyhBKSwoST09PXZvaWQgMHx8ST5BLmxlbmd0aCkmJihJPUEubGVuZ3RoKSxJLT10Lmxlbmd0aDtsZXQgZT1BLmluZGV4T2YodCxJKTtyZXR1cm4gZSE9PS0xJiZlPT09SX0sSkk9QT0+e2lmKCFBKXJldHVybiBudWxsO2lmKEsoQSkpcmV0dXJuIEE7bGV0IHQ9QS5sZW5ndGg7aWYoIUN0KHQpKXJldHVybiBudWxsO2xldCBJPW5ldyBBcnJheSh0KTtmb3IoO3QtLSA+MDspSVt0XT1BW3RdO3JldHVybiBJfSxIST0oQT0+dD0+QSYmdCBpbnN0YW5jZW9mIEEpKHR5cGVvZiBVaW50OEFycmF5PCJ1IiYmVUEoVWludDhBcnJheSkpLFlJPShBLHQpPT57bGV0IGU9KEEmJkFbU3ltYm9sLml0ZXJhdG9yXSkuY2FsbChBKSxnO2Zvcig7KGc9ZS5uZXh0KCkpJiYhZy5kb25lOyl7bGV0IHI9Zy52YWx1ZTt0LmNhbGwoQSxyWzBdLHJbMV0pfX0sYkk9KEEsdCk9PntsZXQgSSxlPVtdO2Zvcig7KEk9QS5leGVjKHQpKSE9PW51bGw7KWUucHVzaChJKTtyZXR1cm4gZX0sTUk9VSgiSFRNTEZvcm1FbGVtZW50IikscUk9QT0+QS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1stX1xcc10oW2EtelxcZF0pKFxcdyopL2csZnVuY3Rpb24oSSxlLGcpe3JldHVybiBlLnRvVXBwZXJDYXNlKCkrZ30pLHJ0PSgoe2hhc093blByb3BlcnR5OkF9KT0+KHQsSSk9PkEuY2FsbCh0LEkpKShPYmplY3QucHJvdG90eXBlKSxLST1VKCJSZWdFeHAiKSxRdD0oQSx0KT0+e2xldCBJPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKEEpLGU9e307VihJLChnLHIpPT57bGV0IG87KG89dChnLHIsQSkpIT09ITEmJihlW3JdPW98fGcpfSksT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQSxlKX0sT0k9QT0+e1F0KEEsKHQsSSk9PntpZihGKEEpJiZbImFyZ3VtZW50cyIsImNhbGxlciIsImNhbGxlZSJdLmluZGV4T2YoSSkhPT0tMSlyZXR1cm4hMTtsZXQgZT1BW0ldO2lmKEYoZSkpe2lmKHQuZW51bWVyYWJsZT0hMSwid3JpdGFibGUiaW4gdCl7dC53cml0YWJsZT0hMTtyZXR1cm59dC5zZXR8fCh0LnNldD0oKT0+e3Rocm93IEVycm9yKCJDYW4gbm90IHJld3JpdGUgcmVhZC1vbmx5IG1ldGhvZCBcJyIrSSsiXCciKX0pfX0pfSxUST0oQSx0KT0+e2xldCBJPXt9LGU9Zz0+e2cuZm9yRWFjaChyPT57SVtyXT0hMH0pfTtyZXR1cm4gSyhBKT9lKEEpOmUoU3RyaW5nKEEpLnNwbGl0KHQpKSxJfSxQST0oKT0+e30seEk9KEEsdCk9PihBPStBLE51bWJlci5pc0Zpbml0ZShBKT9BOnQpLFJBPSJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIsb3Q9IjAxMjM0NTY3ODkiLEV0PXtESUdJVDpvdCxBTFBIQTpSQSxBTFBIQV9ESUdJVDpSQStSQS50b1VwcGVyQ2FzZSgpK290fSxqST0oQT0xNix0PUV0LkFMUEhBX0RJR0lUKT0+e2xldCBJPSIiLHtsZW5ndGg6ZX09dDtmb3IoO0EtLTspSSs9dFtNYXRoLnJhbmRvbSgpKmV8MF07cmV0dXJuIEl9O2Z1bmN0aW9uIFdJKEEpe3JldHVybiEhKEEmJkYoQS5hcHBlbmQpJiZBW1N5bWJvbC50b1N0cmluZ1RhZ109PT0iRm9ybURhdGEiJiZBW1N5bWJvbC5pdGVyYXRvcl0pfXZhciBaST1BPT57bGV0IHQ9bmV3IEFycmF5KDEwKSxJPShlLGcpPT57aWYoc0EoZSkpe2lmKHQuaW5kZXhPZihlKT49MClyZXR1cm47aWYoISgidG9KU09OImluIGUpKXt0W2ddPWU7bGV0IHI9SyhlKT9bXTp7fTtyZXR1cm4gVihlLChvLG4pPT57bGV0IGE9SShvLGcrMSk7IVooYSkmJihyW25dPWEpfSksdFtnXT12b2lkIDAscn19cmV0dXJuIGV9O3JldHVybiBJKEEsMCl9LFZJPVUoIkFzeW5jRnVuY3Rpb24iKSxYST1BPT5BJiYoc0EoQSl8fEYoQSkpJiZGKEEudGhlbikmJkYoQS5jYXRjaCksQz17aXNBcnJheTpLLGlzQXJyYXlCdWZmZXI6aXQsaXNCdWZmZXI6bEksaXNGb3JtRGF0YTpTSSxpc0FycmF5QnVmZmVyVmlldzpESSxpc1N0cmluZzp1SSxpc051bWJlcjpDdCxpc0Jvb2xlYW46aEksaXNPYmplY3Q6c0EsaXNQbGFpbk9iamVjdDpDQSxpc1VuZGVmaW5lZDpaLGlzRGF0ZTpkSSxpc0ZpbGU6eUksaXNCbG9iOndJLGlzUmVnRXhwOktJLGlzRnVuY3Rpb246Rixpc1N0cmVhbTpwSSxpc1VSTFNlYXJjaFBhcmFtczpGSSxpc1R5cGVkQXJyYXk6SEksaXNGaWxlTGlzdDptSSxmb3JFYWNoOlYsbWVyZ2U6TkEsZXh0ZW5kOk5JLHRyaW06Ukksc3RyaXBCT006VUksaW5oZXJpdHM6R0ksdG9GbGF0T2JqZWN0OmtJLGtpbmRPZjpCQSxraW5kT2ZUZXN0OlUsZW5kc1dpdGg6TEksdG9BcnJheTpKSSxmb3JFYWNoRW50cnk6WUksbWF0Y2hBbGw6YkksaXNIVE1MRm9ybTpNSSxoYXNPd25Qcm9wZXJ0eTpydCxoYXNPd25Qcm9wOnJ0LHJlZHVjZURlc2NyaXB0b3JzOlF0LGZyZWV6ZU1ldGhvZHM6T0ksdG9PYmplY3RTZXQ6VEksdG9DYW1lbENhc2U6cUksbm9vcDpQSSx0b0Zpbml0ZU51bWJlcjp4SSxmaW5kS2V5OkJ0LGdsb2JhbDpudCxpc0NvbnRleHREZWZpbmVkOnN0LEFMUEhBQkVUOkV0LGdlbmVyYXRlU3RyaW5nOmpJLGlzU3BlY0NvbXBsaWFudEZvcm06V0ksdG9KU09OT2JqZWN0OlpJLGlzQXN5bmNGbjpWSSxpc1RoZW5hYmxlOlhJfTtmdW5jdGlvbiBPKEEsdCxJLGUsZyl7RXJyb3IuY2FsbCh0aGlzKSxFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT9FcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLHRoaXMuY29uc3RydWN0b3IpOnRoaXMuc3RhY2s9bmV3IEVycm9yKCkuc3RhY2ssdGhpcy5tZXNzYWdlPUEsdGhpcy5uYW1lPSJBeGlvc0Vycm9yIix0JiYodGhpcy5jb2RlPXQpLEkmJih0aGlzLmNvbmZpZz1JKSxlJiYodGhpcy5yZXF1ZXN0PWUpLGcmJih0aGlzLnJlc3BvbnNlPWcpfUMuaW5oZXJpdHMoTyxFcnJvcix7dG9KU09OOmZ1bmN0aW9uKCl7cmV0dXJue21lc3NhZ2U6dGhpcy5tZXNzYWdlLG5hbWU6dGhpcy5uYW1lLGRlc2NyaXB0aW9uOnRoaXMuZGVzY3JpcHRpb24sbnVtYmVyOnRoaXMubnVtYmVyLGZpbGVOYW1lOnRoaXMuZmlsZU5hbWUsbGluZU51bWJlcjp0aGlzLmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOnRoaXMuY29sdW1uTnVtYmVyLHN0YWNrOnRoaXMuc3RhY2ssY29uZmlnOkMudG9KU09OT2JqZWN0KHRoaXMuY29uZmlnKSxjb2RlOnRoaXMuY29kZSxzdGF0dXM6dGhpcy5yZXNwb25zZSYmdGhpcy5yZXNwb25zZS5zdGF0dXM/dGhpcy5yZXNwb25zZS5zdGF0dXM6bnVsbH19fSk7dmFyIGF0PU8ucHJvdG90eXBlLGN0PXt9O1siRVJSX0JBRF9PUFRJT05fVkFMVUUiLCJFUlJfQkFEX09QVElPTiIsIkVDT05OQUJPUlRFRCIsIkVUSU1FRE9VVCIsIkVSUl9ORVRXT1JLIiwiRVJSX0ZSX1RPT19NQU5ZX1JFRElSRUNUUyIsIkVSUl9ERVBSRUNBVEVEIiwiRVJSX0JBRF9SRVNQT05TRSIsIkVSUl9CQURfUkVRVUVTVCIsIkVSUl9DQU5DRUxFRCIsIkVSUl9OT1RfU1VQUE9SVCIsIkVSUl9JTlZBTElEX1VSTCJdLmZvckVhY2goQT0+e2N0W0FdPXt2YWx1ZTpBfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE8sY3QpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhdCwiaXNBeGlvc0Vycm9yIix7dmFsdWU6ITB9KTtPLmZyb209KEEsdCxJLGUsZyxyKT0+e2xldCBvPU9iamVjdC5jcmVhdGUoYXQpO3JldHVybiBDLnRvRmxhdE9iamVjdChBLG8sZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT1FcnJvci5wcm90b3R5cGV9LG49Pm4hPT0iaXNBeGlvc0Vycm9yIiksTy5jYWxsKG8sQS5tZXNzYWdlLHQsSSxlLGcpLG8uY2F1c2U9QSxvLm5hbWU9QS5uYW1lLHImJk9iamVjdC5hc3NpZ24obyxyKSxvfTt2YXIgbD1PO3ZhciBRQT1udWxsO2Z1bmN0aW9uIEdBKEEpe3JldHVybiBDLmlzUGxhaW5PYmplY3QoQSl8fEMuaXNBcnJheShBKX1mdW5jdGlvbiBsdChBKXtyZXR1cm4gQy5lbmRzV2l0aChBLCJbXSIpP0Euc2xpY2UoMCwtMik6QX1mdW5jdGlvbiBmdChBLHQsSSl7cmV0dXJuIEE/QS5jb25jYXQodCkubWFwKGZ1bmN0aW9uKGcscil7cmV0dXJuIGc9bHQoZyksIUkmJnI/IlsiK2crIl0iOmd9KS5qb2luKEk/Ii4iOiIiKTp0fWZ1bmN0aW9uIHpJKEEpe3JldHVybiBDLmlzQXJyYXkoQSkmJiFBLnNvbWUoR0EpfXZhciBfST1DLnRvRmxhdE9iamVjdChDLHt9LG51bGwsZnVuY3Rpb24odCl7cmV0dXJuL15pc1tBLVpdLy50ZXN0KHQpfSk7ZnVuY3Rpb24gdkkoQSx0LEkpe2lmKCFDLmlzT2JqZWN0KEEpKXRocm93IG5ldyBUeXBlRXJyb3IoInRhcmdldCBtdXN0IGJlIGFuIG9iamVjdCIpO3Q9dHx8bmV3KFFBfHxGb3JtRGF0YSksST1DLnRvRmxhdE9iamVjdChJLHttZXRhVG9rZW5zOiEwLGRvdHM6ITEsaW5kZXhlczohMX0sITEsZnVuY3Rpb24oYyx1KXtyZXR1cm4hQy5pc1VuZGVmaW5lZCh1W2NdKX0pO2xldCBlPUkubWV0YVRva2VucyxnPUkudmlzaXRvcnx8QixyPUkuZG90cyxvPUkuaW5kZXhlcyxhPShJLkJsb2J8fHR5cGVvZiBCbG9iPCJ1IiYmQmxvYikmJkMuaXNTcGVjQ29tcGxpYW50Rm9ybSh0KTtpZighQy5pc0Z1bmN0aW9uKGcpKXRocm93IG5ldyBUeXBlRXJyb3IoInZpc2l0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uIik7ZnVuY3Rpb24gUShFKXtpZihFPT09bnVsbClyZXR1cm4iIjtpZihDLmlzRGF0ZShFKSlyZXR1cm4gRS50b0lTT1N0cmluZygpO2lmKCFhJiZDLmlzQmxvYihFKSl0aHJvdyBuZXcgbCgiQmxvYiBpcyBub3Qgc3VwcG9ydGVkLiBVc2UgYSBCdWZmZXIgaW5zdGVhZC4iKTtyZXR1cm4gQy5pc0FycmF5QnVmZmVyKEUpfHxDLmlzVHlwZWRBcnJheShFKT9hJiZ0eXBlb2YgQmxvYj09ImZ1bmN0aW9uIj9uZXcgQmxvYihbRV0pOkJ1ZmZlci5mcm9tKEUpOkV9ZnVuY3Rpb24gQihFLGMsdSl7bGV0IHk9RTtpZihFJiYhdSYmdHlwZW9mIEU9PSJvYmplY3QiKXtpZihDLmVuZHNXaXRoKGMsInt9IikpYz1lP2M6Yy5zbGljZSgwLC0yKSxFPUpTT04uc3RyaW5naWZ5KEUpO2Vsc2UgaWYoQy5pc0FycmF5KEUpJiZ6SShFKXx8KEMuaXNGaWxlTGlzdChFKXx8Qy5lbmRzV2l0aChjLCJbXSIpKSYmKHk9Qy50b0FycmF5KEUpKSlyZXR1cm4gYz1sdChjKSx5LmZvckVhY2goZnVuY3Rpb24oTix0SSl7IShDLmlzVW5kZWZpbmVkKE4pfHxOPT09bnVsbCkmJnQuYXBwZW5kKG89PT0hMD9mdChbY10sdEkscik6bz09PW51bGw/YzpjKyJbXSIsUShOKSl9KSwhMX1yZXR1cm4gR0EoRSk/ITA6KHQuYXBwZW5kKGZ0KHUsYyxyKSxRKEUpKSwhMSl9bGV0IGk9W10sZj1PYmplY3QuYXNzaWduKF9JLHtkZWZhdWx0VmlzaXRvcjpCLGNvbnZlcnRWYWx1ZTpRLGlzVmlzaXRhYmxlOkdBfSk7ZnVuY3Rpb24gcyhFLGMpe2lmKCFDLmlzVW5kZWZpbmVkKEUpKXtpZihpLmluZGV4T2YoRSkhPT0tMSl0aHJvdyBFcnJvcigiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGluICIrYy5qb2luKCIuIikpO2kucHVzaChFKSxDLmZvckVhY2goRSxmdW5jdGlvbih5LFIpeyghKEMuaXNVbmRlZmluZWQoeSl8fHk9PT1udWxsKSYmZy5jYWxsKHQseSxDLmlzU3RyaW5nKFIpP1IudHJpbSgpOlIsYyxmKSk9PT0hMCYmcyh5LGM/Yy5jb25jYXQoUik6W1JdKX0pLGkucG9wKCl9fWlmKCFDLmlzT2JqZWN0KEEpKXRocm93IG5ldyBUeXBlRXJyb3IoImRhdGEgbXVzdCBiZSBhbiBvYmplY3QiKTtyZXR1cm4gcyhBKSx0fXZhciBKPXZJO2Z1bmN0aW9uIER0KEEpe2xldCB0PXsiISI6IiUyNTIxIiwiXCciOiIlMjUyNyIsIigiOiIlMjUyOCIsIikiOiIlMjUyOSIsIn4iOiIlMjU3RSIsIiUyNTIwIjoiKyIsIiUyNTAwIjoiXFwwIn07cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChBKS5yZXBsYWNlKC9bIVwnKCl+XXwlMjUyMHwlMjUwMC9nLGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfSl9ZnVuY3Rpb24gdXQoQSx0KXt0aGlzLl9wYWlycz1bXSxBJiZKKEEsdGhpcyx0KX12YXIgaHQ9dXQucHJvdG90eXBlO2h0LmFwcGVuZD1mdW5jdGlvbih0LEkpe3RoaXMuX3BhaXJzLnB1c2goW3QsSV0pfTtodC50b1N0cmluZz1mdW5jdGlvbih0KXtsZXQgST10P2Z1bmN0aW9uKGUpe3JldHVybiB0LmNhbGwodGhpcyxlLER0KX06RHQ7cmV0dXJuIHRoaXMuX3BhaXJzLm1hcChmdW5jdGlvbihnKXtyZXR1cm4gSShnWzBdKSsiPSIrSShnWzFdKX0sIiIpLmpvaW4oIiYiKX07dmFyIEVBPXV0O2Z1bmN0aW9uICRJKEEpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoQSkucmVwbGFjZSgvJTI1M0EvZ2ksIjoiKS5yZXBsYWNlKC8lMjUyNC9nLCIkIikucmVwbGFjZSgvJTI1MkMvZ2ksIiwiKS5yZXBsYWNlKC8lMjUyMC9nLCIrIikucmVwbGFjZSgvJTI1NUIvZ2ksIlsiKS5yZXBsYWNlKC8lMjU1RC9naSwiXSIpfWZ1bmN0aW9uIFgoQSx0LEkpe2lmKCF0KXJldHVybiBBO2xldCBlPUkmJkkuZW5jb2RlfHwkSSxnPUkmJkkuc2VyaWFsaXplLHI7aWYoZz9yPWcodCxJKTpyPUMuaXNVUkxTZWFyY2hQYXJhbXModCk/dC50b1N0cmluZygpOm5ldyBFQSh0LEkpLnRvU3RyaW5nKGUpLHIpe2xldCBvPUEuaW5kZXhPZigiJTIzIik7byE9PS0xJiYoQT1BLnNsaWNlKDAsbykpLEErPShBLmluZGV4T2YoIj8iKT09PS0xPyI/IjoiJiIpK3J9cmV0dXJuIEF9dmFyIGtBPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5oYW5kbGVycz1bXX11c2UodCxJLGUpe3JldHVybiB0aGlzLmhhbmRsZXJzLnB1c2goe2Z1bGZpbGxlZDp0LHJlamVjdGVkOkksc3luY2hyb25vdXM6ZT9lLnN5bmNocm9ub3VzOiExLHJ1bldoZW46ZT9lLnJ1bldoZW46bnVsbH0pLHRoaXMuaGFuZGxlcnMubGVuZ3RoLTF9ZWplY3QodCl7dGhpcy5oYW5kbGVyc1t0XSYmKHRoaXMuaGFuZGxlcnNbdF09bnVsbCl9Y2xlYXIoKXt0aGlzLmhhbmRsZXJzJiYodGhpcy5oYW5kbGVycz1bXSl9Zm9yRWFjaCh0KXtDLmZvckVhY2godGhpcy5oYW5kbGVycyxmdW5jdGlvbihlKXtlIT09bnVsbCYmdChlKX0pfX0sTEE9a0E7dmFyIGFBPXtzaWxlbnRKU09OUGFyc2luZzohMCxmb3JjZWRKU09OUGFyc2luZzohMCxjbGFyaWZ5VGltZW91dEVycm9yOiExfTt2YXIgZHQ9dHlwZW9mIFVSTFNlYXJjaFBhcmFtczwidSI/VVJMU2VhcmNoUGFyYW1zOkVBO3ZhciB5dD10eXBlb2YgRm9ybURhdGE8InUiP0Zvcm1EYXRhOm51bGw7dmFyIHd0PXR5cGVvZiBCbG9iPCJ1Ij9CbG9iOm51bGw7dmFyIG10PXtpc0Jyb3dzZXI6ITAsY2xhc3Nlczp7VVJMU2VhcmNoUGFyYW1zOmR0LEZvcm1EYXRhOnl0LEJsb2I6d3R9LHByb3RvY29sczpbImh0dHAiLCJodHRwcyIsImZpbGUiLCJibG9iIiwidXJsIiwiZGF0YSJdfTt2YXIgSkE9e307ZUkoSkEse2hhc0Jyb3dzZXJFbnY6KCk9PnB0LGhhc1N0YW5kYXJkQnJvd3NlckVudjooKT0+QWUsaGFzU3RhbmRhcmRCcm93c2VyV2ViV29ya2VyRW52OigpPT50ZX0pO3ZhciBwdD10eXBlb2Ygd2luZG93PCJ1IiYmdHlwZW9mIGRvY3VtZW50PCJ1IixBZT0oQT0+cHQmJlsiUmVhY3ROYXRpdmUiLCJOYXRpdmVTY3JpcHQiLCJOUyJdLmluZGV4T2YoQSk8MCkodHlwZW9mIG5hdmlnYXRvcjwidSImJm5hdmlnYXRvci5wcm9kdWN0KSx0ZT10eXBlb2YgV29ya2VyR2xvYmFsU2NvcGU8InUiJiZzZWxmIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGUmJnR5cGVvZiBzZWxmLmltcG9ydFNjcmlwdHM9PSJmdW5jdGlvbiI7dmFyIHc9ey4uLkpBLC4uLm10fTtmdW5jdGlvbiBIQShBLHQpe3JldHVybiBKKEEsbmV3IHcuY2xhc3Nlcy5VUkxTZWFyY2hQYXJhbXMsT2JqZWN0LmFzc2lnbih7dmlzaXRvcjpmdW5jdGlvbihJLGUsZyxyKXtyZXR1cm4gdy5pc05vZGUmJkMuaXNCdWZmZXIoSSk/KHRoaXMuYXBwZW5kKGUsSS50b1N0cmluZygiYmFzZTY0IikpLCExKTpyLmRlZmF1bHRWaXNpdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19LHQpKX1mdW5jdGlvbiBJZShBKXtyZXR1cm4gQy5tYXRjaEFsbCgvXFx3K3xcXFsoXFx3KildL2csQSkubWFwKHQ9PnRbMF09PT0iW10iPyIiOnRbMV18fHRbMF0pfWZ1bmN0aW9uIGVlKEEpe2xldCB0PXt9LEk9T2JqZWN0LmtleXMoQSksZSxnPUkubGVuZ3RoLHI7Zm9yKGU9MDtlPGc7ZSsrKXI9SVtlXSx0W3JdPUFbcl07cmV0dXJuIHR9ZnVuY3Rpb24gZ2UoQSl7ZnVuY3Rpb24gdChJLGUsZyxyKXtsZXQgbz1JW3IrK107aWYobz09PSJfX3Byb3RvX18iKXJldHVybiEwO2xldCBuPU51bWJlci5pc0Zpbml0ZSgrbyksYT1yPj1JLmxlbmd0aDtyZXR1cm4gbz0hbyYmQy5pc0FycmF5KGcpP2cubGVuZ3RoOm8sYT8oQy5oYXNPd25Qcm9wKGcsbyk/Z1tvXT1bZ1tvXSxlXTpnW29dPWUsIW4pOigoIWdbb118fCFDLmlzT2JqZWN0KGdbb10pKSYmKGdbb109W10pLHQoSSxlLGdbb10scikmJkMuaXNBcnJheShnW29dKSYmKGdbb109ZWUoZ1tvXSkpLCFuKX1pZihDLmlzRm9ybURhdGEoQSkmJkMuaXNGdW5jdGlvbihBLmVudHJpZXMpKXtsZXQgST17fTtyZXR1cm4gQy5mb3JFYWNoRW50cnkoQSwoZSxnKT0+e3QoSWUoZSksZyxJLDApfSksSX1yZXR1cm4gbnVsbH12YXIgY0E9Z2U7ZnVuY3Rpb24gcmUoQSx0LEkpe2lmKEMuaXNTdHJpbmcoQSkpdHJ5e3JldHVybih0fHxKU09OLnBhcnNlKShBKSxDLnRyaW0oQSl9Y2F0Y2goZSl7aWYoZS5uYW1lIT09IlN5bnRheEVycm9yIil0aHJvdyBlfXJldHVybihJfHxKU09OLnN0cmluZ2lmeSkoQSl9dmFyIFlBPXt0cmFuc2l0aW9uYWw6YUEsYWRhcHRlcjpbInhociIsImh0dHAiXSx0cmFuc2Zvcm1SZXF1ZXN0OltmdW5jdGlvbih0LEkpe2xldCBlPUkuZ2V0Q29udGVudFR5cGUoKXx8IiIsZz1lLmluZGV4T2YoImFwcGxpY2F0aW9uL2pzb24iKT4tMSxyPUMuaXNPYmplY3QodCk7aWYociYmQy5pc0hUTUxGb3JtKHQpJiYodD1uZXcgRm9ybURhdGEodCkpLEMuaXNGb3JtRGF0YSh0KSlyZXR1cm4gZz9KU09OLnN0cmluZ2lmeShjQSh0KSk6dDtpZihDLmlzQXJyYXlCdWZmZXIodCl8fEMuaXNCdWZmZXIodCl8fEMuaXNTdHJlYW0odCl8fEMuaXNGaWxlKHQpfHxDLmlzQmxvYih0KSlyZXR1cm4gdDtpZihDLmlzQXJyYXlCdWZmZXJWaWV3KHQpKXJldHVybiB0LmJ1ZmZlcjtpZihDLmlzVVJMU2VhcmNoUGFyYW1zKHQpKXJldHVybiBJLnNldENvbnRlbnRUeXBlKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtOCIsITEpLHQudG9TdHJpbmcoKTtsZXQgbjtpZihyKXtpZihlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpPi0xKXJldHVybiBIQSh0LHRoaXMuZm9ybVNlcmlhbGl6ZXIpLnRvU3RyaW5nKCk7aWYoKG49Qy5pc0ZpbGVMaXN0KHQpKXx8ZS5pbmRleE9mKCJtdWx0aXBhcnQvZm9ybS1kYXRhIik+LTEpe2xldCBhPXRoaXMuZW52JiZ0aGlzLmVudi5Gb3JtRGF0YTtyZXR1cm4gSihuP3siZmlsZXNbXSI6dH06dCxhJiZuZXcgYSx0aGlzLmZvcm1TZXJpYWxpemVyKX19cmV0dXJuIHJ8fGc/KEkuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL2pzb24iLCExKSxyZSh0KSk6dH1dLHRyYW5zZm9ybVJlc3BvbnNlOltmdW5jdGlvbih0KXtsZXQgST10aGlzLnRyYW5zaXRpb25hbHx8WUEudHJhbnNpdGlvbmFsLGU9SSYmSS5mb3JjZWRKU09OUGFyc2luZyxnPXRoaXMucmVzcG9uc2VUeXBlPT09Impzb24iO2lmKHQmJkMuaXNTdHJpbmcodCkmJihlJiYhdGhpcy5yZXNwb25zZVR5cGV8fGcpKXtsZXQgbz0hKEkmJkkuc2lsZW50SlNPTlBhcnNpbmcpJiZnO3RyeXtyZXR1cm4gSlNPTi5wYXJzZSh0KX1jYXRjaChuKXtpZihvKXRocm93IG4ubmFtZT09PSJTeW50YXhFcnJvciI/bC5mcm9tKG4sbC5FUlJfQkFEX1JFU1BPTlNFLHRoaXMsbnVsbCx0aGlzLnJlc3BvbnNlKTpufX1yZXR1cm4gdH1dLHRpbWVvdXQ6MCx4c3JmQ29va2llTmFtZToiWFNSRi1UT0tFTiIseHNyZkhlYWRlck5hbWU6IlgtWFNSRi1UT0tFTiIsbWF4Q29udGVudExlbmd0aDotMSxtYXhCb2R5TGVuZ3RoOi0xLGVudjp7Rm9ybURhdGE6dy5jbGFzc2VzLkZvcm1EYXRhLEJsb2I6dy5jbGFzc2VzLkJsb2J9LHZhbGlkYXRlU3RhdHVzOmZ1bmN0aW9uKHQpe3JldHVybiB0Pj0yMDAmJnQ8MzAwfSxoZWFkZXJzOntjb21tb246e0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qIiwiQ29udGVudC1UeXBlIjp2b2lkIDB9fX07Qy5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsInBvc3QiLCJwdXQiLCJwYXRjaCJdLEE9PntZQS5oZWFkZXJzW0FdPXt9fSk7dmFyIFQ9WUE7dmFyIG9lPUMudG9PYmplY3RTZXQoWyJhZ2UiLCJhdXRob3JpemF0aW9uIiwiY29udGVudC1sZW5ndGgiLCJjb250ZW50LXR5cGUiLCJldGFnIiwiZXhwaXJlcyIsImZyb20iLCJob3N0IiwiaWYtbW9kaWZpZWQtc2luY2UiLCJpZi11bm1vZGlmaWVkLXNpbmNlIiwibGFzdC1tb2RpZmllZCIsImxvY2F0aW9uIiwibWF4LWZvcndhcmRzIiwicHJveHktYXV0aG9yaXphdGlvbiIsInJlZmVyZXIiLCJyZXRyeS1hZnRlciIsInVzZXItYWdlbnQiXSksU3Q9QT0+e2xldCB0PXt9LEksZSxnO3JldHVybiBBJiZBLnNwbGl0KGAlMEFgKS5mb3JFYWNoKGZ1bmN0aW9uKG8pe2c9by5pbmRleE9mKCI6IiksST1vLnN1YnN0cmluZygwLGcpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLGU9by5zdWJzdHJpbmcoZysxKS50cmltKCksISghSXx8dFtJXSYmb2VbSV0pJiYoST09PSJzZXQtY29va2llIj90W0ldP3RbSV0ucHVzaChlKTp0W0ldPVtlXTp0W0ldPXRbSV0/dFtJXSsiLCAiK2U6ZSl9KSx0fTt2YXIgRnQ9U3ltYm9sKCJpbnRlcm5hbHMiKTtmdW5jdGlvbiB6KEEpe3JldHVybiBBJiZTdHJpbmcoQSkudHJpbSgpLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gZkEoQSl7cmV0dXJuIEE9PT0hMXx8QT09bnVsbD9BOkMuaXNBcnJheShBKT9BLm1hcChmQSk6U3RyaW5nKEEpfWZ1bmN0aW9uIGllKEEpe2xldCB0PU9iamVjdC5jcmVhdGUobnVsbCksST0vKFteXFxzLDs9XSspXFxzKig/Oj1cXHMqKFteLDtdKykpPy9nLGU7Zm9yKDtlPUkuZXhlYyhBKTspdFtlWzFdXT1lWzJdO3JldHVybiB0fXZhciBDZT1BPT4vXlstX2EtekEtWjAtOV5gfH4sISUyMyQlJlwnKisuXSskLy50ZXN0KEEudHJpbSgpKTtmdW5jdGlvbiBiQShBLHQsSSxlLGcpe2lmKEMuaXNGdW5jdGlvbihlKSlyZXR1cm4gZS5jYWxsKHRoaXMsdCxJKTtpZihnJiYodD1JKSwhIUMuaXNTdHJpbmcodCkpe2lmKEMuaXNTdHJpbmcoZSkpcmV0dXJuIHQuaW5kZXhPZihlKSE9PS0xO2lmKEMuaXNSZWdFeHAoZSkpcmV0dXJuIGUudGVzdCh0KX19ZnVuY3Rpb24gQmUoQSl7cmV0dXJuIEEudHJpbSgpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvKFthLXpcXGRdKShcXHcqKS9nLCh0LEksZSk9PkkudG9VcHBlckNhc2UoKStlKX1mdW5jdGlvbiBuZShBLHQpe2xldCBJPUMudG9DYW1lbENhc2UoIiAiK3QpO1siZ2V0Iiwic2V0IiwiaGFzIl0uZm9yRWFjaChlPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KEEsZStJLHt2YWx1ZTpmdW5jdGlvbihnLHIsbyl7cmV0dXJuIHRoaXNbZV0uY2FsbCh0aGlzLHQsZyxyLG8pfSxjb25maWd1cmFibGU6ITB9KX0pfXZhciBQPWNsYXNze2NvbnN0cnVjdG9yKHQpe3QmJnRoaXMuc2V0KHQpfXNldCh0LEksZSl7bGV0IGc9dGhpcztmdW5jdGlvbiByKG4sYSxRKXtsZXQgQj16KGEpO2lmKCFCKXRocm93IG5ldyBFcnJvcigiaGVhZGVyIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmciKTtsZXQgaT1DLmZpbmRLZXkoZyxCKTsoIWl8fGdbaV09PT12b2lkIDB8fFE9PT0hMHx8UT09PXZvaWQgMCYmZ1tpXSE9PSExKSYmKGdbaXx8YV09ZkEobikpfWxldCBvPShuLGEpPT5DLmZvckVhY2gobiwoUSxCKT0+cihRLEIsYSkpO3JldHVybiBDLmlzUGxhaW5PYmplY3QodCl8fHQgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yP28odCxJKTpDLmlzU3RyaW5nKHQpJiYodD10LnRyaW0oKSkmJiFDZSh0KT9vKFN0KHQpLEkpOnQhPW51bGwmJnIoSSx0LGUpLHRoaXN9Z2V0KHQsSSl7aWYodD16KHQpLHQpe2xldCBlPUMuZmluZEtleSh0aGlzLHQpO2lmKGUpe2xldCBnPXRoaXNbZV07aWYoIUkpcmV0dXJuIGc7aWYoST09PSEwKXJldHVybiBpZShnKTtpZihDLmlzRnVuY3Rpb24oSSkpcmV0dXJuIEkuY2FsbCh0aGlzLGcsZSk7aWYoQy5pc1JlZ0V4cChJKSlyZXR1cm4gSS5leGVjKGcpO3Rocm93IG5ldyBUeXBlRXJyb3IoInBhcnNlciBtdXN0IGJlIGJvb2xlYW58cmVnZXhwfGZ1bmN0aW9uIil9fX1oYXModCxJKXtpZih0PXoodCksdCl7bGV0IGU9Qy5maW5kS2V5KHRoaXMsdCk7cmV0dXJuISEoZSYmdGhpc1tlXSE9PXZvaWQgMCYmKCFJfHxiQSh0aGlzLHRoaXNbZV0sZSxJKSkpfXJldHVybiExfWRlbGV0ZSh0LEkpe2xldCBlPXRoaXMsZz0hMTtmdW5jdGlvbiByKG8pe2lmKG89eihvKSxvKXtsZXQgbj1DLmZpbmRLZXkoZSxvKTtuJiYoIUl8fGJBKGUsZVtuXSxuLEkpKSYmKGRlbGV0ZSBlW25dLGc9ITApfX1yZXR1cm4gQy5pc0FycmF5KHQpP3QuZm9yRWFjaChyKTpyKHQpLGd9Y2xlYXIodCl7bGV0IEk9T2JqZWN0LmtleXModGhpcyksZT1JLmxlbmd0aCxnPSExO2Zvcig7ZS0tOyl7bGV0IHI9SVtlXTsoIXR8fGJBKHRoaXMsdGhpc1tyXSxyLHQsITApKSYmKGRlbGV0ZSB0aGlzW3JdLGc9ITApfXJldHVybiBnfW5vcm1hbGl6ZSh0KXtsZXQgST10aGlzLGU9e307cmV0dXJuIEMuZm9yRWFjaCh0aGlzLChnLHIpPT57bGV0IG89Qy5maW5kS2V5KGUscik7aWYobyl7SVtvXT1mQShnKSxkZWxldGUgSVtyXTtyZXR1cm59bGV0IG49dD9CZShyKTpTdHJpbmcocikudHJpbSgpO24hPT1yJiZkZWxldGUgSVtyXSxJW25dPWZBKGcpLGVbbl09ITB9KSx0aGlzfWNvbmNhdCguLi50KXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5jb25jYXQodGhpcywuLi50KX10b0pTT04odCl7bGV0IEk9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gQy5mb3JFYWNoKHRoaXMsKGUsZyk9PntlIT1udWxsJiZlIT09ITEmJihJW2ddPXQmJkMuaXNBcnJheShlKT9lLmpvaW4oIiwgIik6ZSl9KSxJfVtTeW1ib2wuaXRlcmF0b3JdKCl7cmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMudG9KU09OKCkpW1N5bWJvbC5pdGVyYXRvcl0oKX10b1N0cmluZygpe3JldHVybiBPYmplY3QuZW50cmllcyh0aGlzLnRvSlNPTigpKS5tYXAoKFt0LEldKT0+dCsiOiAiK0kpLmpvaW4oYCUwQWApfWdldFtTeW1ib2wudG9TdHJpbmdUYWddKCl7cmV0dXJuIkF4aW9zSGVhZGVycyJ9c3RhdGljIGZyb20odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiB0aGlzP3Q6bmV3IHRoaXModCl9c3RhdGljIGNvbmNhdCh0LC4uLkkpe2xldCBlPW5ldyB0aGlzKHQpO3JldHVybiBJLmZvckVhY2goZz0+ZS5zZXQoZykpLGV9c3RhdGljIGFjY2Vzc29yKHQpe2xldCBlPSh0aGlzW0Z0XT10aGlzW0Z0XT17YWNjZXNzb3JzOnt9fSkuYWNjZXNzb3JzLGc9dGhpcy5wcm90b3R5cGU7ZnVuY3Rpb24gcihvKXtsZXQgbj16KG8pO2Vbbl18fChuZShnLG8pLGVbbl09ITApfXJldHVybiBDLmlzQXJyYXkodCk/dC5mb3JFYWNoKHIpOnIodCksdGhpc319O1AuYWNjZXNzb3IoWyJDb250ZW50LVR5cGUiLCJDb250ZW50LUxlbmd0aCIsIkFjY2VwdCIsIkFjY2VwdC1FbmNvZGluZyIsIlVzZXItQWdlbnQiLCJBdXRob3JpemF0aW9uIl0pO0MucmVkdWNlRGVzY3JpcHRvcnMoUC5wcm90b3R5cGUsKHt2YWx1ZTpBfSx0KT0+e2xldCBJPXRbMF0udG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpO3JldHVybntnZXQ6KCk9PkEsc2V0KGUpe3RoaXNbSV09ZX19fSk7Qy5mcmVlemVNZXRob2RzKFApO3ZhciBtPVA7ZnVuY3Rpb24gXyhBLHQpe2xldCBJPXRoaXN8fFQsZT10fHxJLGc9bS5mcm9tKGUuaGVhZGVycykscj1lLmRhdGE7cmV0dXJuIEMuZm9yRWFjaChBLGZ1bmN0aW9uKG4pe3I9bi5jYWxsKEkscixnLm5vcm1hbGl6ZSgpLHQ/dC5zdGF0dXM6dm9pZCAwKX0pLGcubm9ybWFsaXplKCkscn1mdW5jdGlvbiB2KEEpe3JldHVybiEhKEEmJkEuX19DQU5DRUxfXyl9ZnVuY3Rpb24gUnQoQSx0LEkpe2wuY2FsbCh0aGlzLEE/PyJjYW5jZWxlZCIsbC5FUlJfQ0FOQ0VMRUQsdCxJKSx0aGlzLm5hbWU9IkNhbmNlbGVkRXJyb3IifUMuaW5oZXJpdHMoUnQsbCx7X19DQU5DRUxfXzohMH0pO3ZhciBIPVJ0O2Z1bmN0aW9uIE1BKEEsdCxJKXtsZXQgZT1JLmNvbmZpZy52YWxpZGF0ZVN0YXR1czshSS5zdGF0dXN8fCFlfHxlKEkuc3RhdHVzKT9BKEkpOnQobmV3IGwoIlJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgIitJLnN0YXR1cyxbbC5FUlJfQkFEX1JFUVVFU1QsbC5FUlJfQkFEX1JFU1BPTlNFXVtNYXRoLmZsb29yKEkuc3RhdHVzLzEwMCktNF0sSS5jb25maWcsSS5yZXF1ZXN0LEkpKX12YXIgTnQ9dy5oYXNTdGFuZGFyZEJyb3dzZXJFbnY/e3dyaXRlKEEsdCxJLGUsZyxyKXtsZXQgbz1bQSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KHQpXTtDLmlzTnVtYmVyKEkpJiZvLnB1c2goImV4cGlyZXM9IituZXcgRGF0ZShJKS50b0dNVFN0cmluZygpKSxDLmlzU3RyaW5nKGUpJiZvLnB1c2goInBhdGg9IitlKSxDLmlzU3RyaW5nKGcpJiZvLnB1c2goImRvbWFpbj0iK2cpLHI9PT0hMCYmby5wdXNoKCJzZWN1cmUiKSxkb2N1bWVudC5jb29raWU9by5qb2luKCI7ICIpfSxyZWFkKEEpe2xldCB0PWRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCIoXnw7XFxcXHMqKSgiK0ErIik9KFteO10qKSIpKTtyZXR1cm4gdD9kZWNvZGVVUklDb21wb25lbnQodFszXSk6bnVsbH0scmVtb3ZlKEEpe3RoaXMud3JpdGUoQSwiIixEYXRlLm5vdygpLTg2NGU1KX19Ont3cml0ZSgpe30scmVhZCgpe3JldHVybiBudWxsfSxyZW1vdmUoKXt9fTtmdW5jdGlvbiBxQShBKXtyZXR1cm4vXihbYS16XVthLXpcXGQrXFwtLl0qOik/XFwvXFwvL2kudGVzdChBKX1mdW5jdGlvbiBLQShBLHQpe3JldHVybiB0P0EucmVwbGFjZSgvXFwvP1xcLyQvLCIiKSsiLyIrdC5yZXBsYWNlKC9eXFwvKy8sIiIpOkF9ZnVuY3Rpb24gJChBLHQpe3JldHVybiBBJiYhcUEodCk/S0EoQSx0KTp0fXZhciBVdD13Lmhhc1N0YW5kYXJkQnJvd3NlckVudj9mdW5jdGlvbigpe2xldCB0PS8obXNpZXx0cmlkZW50KS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksST1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIiksZTtmdW5jdGlvbiBnKHIpe2xldCBvPXI7cmV0dXJuIHQmJihJLnNldEF0dHJpYnV0ZSgiaHJlZiIsbyksbz1JLmhyZWYpLEkuc2V0QXR0cmlidXRlKCJocmVmIixvKSx7aHJlZjpJLmhyZWYscHJvdG9jb2w6SS5wcm90b2NvbD9JLnByb3RvY29sLnJlcGxhY2UoLzokLywiIik6IiIsaG9zdDpJLmhvc3Qsc2VhcmNoOkkuc2VhcmNoP0kuc2VhcmNoLnJlcGxhY2UoL15cXD8vLCIiKToiIixoYXNoOkkuaGFzaD9JLmhhc2gucmVwbGFjZSgvXiUyMy8sIiIpOiIiLGhvc3RuYW1lOkkuaG9zdG5hbWUscG9ydDpJLnBvcnQscGF0aG5hbWU6SS5wYXRobmFtZS5jaGFyQXQoMCk9PT0iLyI/SS5wYXRobmFtZToiLyIrSS5wYXRobmFtZX19cmV0dXJuIGU9Zyh3aW5kb3cubG9jYXRpb24uaHJlZiksZnVuY3Rpb24obyl7bGV0IG49Qy5pc1N0cmluZyhvKT9nKG8pOm87cmV0dXJuIG4ucHJvdG9jb2w9PT1lLnByb3RvY29sJiZuLmhvc3Q9PT1lLmhvc3R9fSgpOmZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuITB9fSgpO2Z1bmN0aW9uIE9BKEEpe2xldCB0PS9eKFstK1xcd117MSwyNX0pKDo/XFwvXFwvfDopLy5leGVjKEEpO3JldHVybiB0JiZ0WzFdfHwiIn1mdW5jdGlvbiBzZShBLHQpe0E9QXx8MTA7bGV0IEk9bmV3IEFycmF5KEEpLGU9bmV3IEFycmF5KEEpLGc9MCxyPTAsbztyZXR1cm4gdD10IT09dm9pZCAwP3Q6MWUzLGZ1bmN0aW9uKGEpe2xldCBRPURhdGUubm93KCksQj1lW3JdO298fChvPVEpLElbZ109YSxlW2ddPVE7bGV0IGk9cixmPTA7Zm9yKDtpIT09ZzspZis9SVtpKytdLGk9aSVBO2lmKGc9KGcrMSklQSxnPT09ciYmKHI9KHIrMSklQSksUS1vPHQpcmV0dXJuO2xldCBzPUImJlEtQjtyZXR1cm4gcz9NYXRoLnJvdW5kKGYqMWUzL3MpOnZvaWQgMH19dmFyIEd0PXNlO2Z1bmN0aW9uIGt0KEEsdCl7bGV0IEk9MCxlPUd0KDUwLDI1MCk7cmV0dXJuIGc9PntsZXQgcj1nLmxvYWRlZCxvPWcubGVuZ3RoQ29tcHV0YWJsZT9nLnRvdGFsOnZvaWQgMCxuPXItSSxhPWUobiksUT1yPD1vO0k9cjtsZXQgQj17bG9hZGVkOnIsdG90YWw6byxwcm9ncmVzczpvP3Ivbzp2b2lkIDAsYnl0ZXM6bixyYXRlOmF8fHZvaWQgMCxlc3RpbWF0ZWQ6YSYmbyYmUT8oby1yKS9hOnZvaWQgMCxldmVudDpnfTtCW3Q/ImRvd25sb2FkIjoidXBsb2FkIl09ITAsQShCKX19dmFyIFFlPXR5cGVvZiBYTUxIdHRwUmVxdWVzdDwidSIsTHQ9UWUmJmZ1bmN0aW9uKEEpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihJLGUpe2xldCBnPUEuZGF0YSxyPW0uZnJvbShBLmhlYWRlcnMpLm5vcm1hbGl6ZSgpLHtyZXNwb25zZVR5cGU6byx3aXRoWFNSRlRva2VuOm59PUEsYTtmdW5jdGlvbiBRKCl7QS5jYW5jZWxUb2tlbiYmQS5jYW5jZWxUb2tlbi51bnN1YnNjcmliZShhKSxBLnNpZ25hbCYmQS5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYWJvcnQiLGEpfWxldCBCO2lmKEMuaXNGb3JtRGF0YShnKSl7aWYody5oYXNTdGFuZGFyZEJyb3dzZXJFbnZ8fHcuaGFzU3RhbmRhcmRCcm93c2VyV2ViV29ya2VyRW52KXIuc2V0Q29udGVudFR5cGUoITEpO2Vsc2UgaWYoKEI9ci5nZXRDb250ZW50VHlwZSgpKSE9PSExKXtsZXRbYywuLi51XT1CP0Iuc3BsaXQoIjsiKS5tYXAoeT0+eS50cmltKCkpLmZpbHRlcihCb29sZWFuKTpbXTtyLnNldENvbnRlbnRUeXBlKFtjfHwibXVsdGlwYXJ0L2Zvcm0tZGF0YSIsLi4udV0uam9pbigiOyAiKSl9fWxldCBpPW5ldyBYTUxIdHRwUmVxdWVzdDtpZihBLmF1dGgpe2xldCBjPUEuYXV0aC51c2VybmFtZXx8IiIsdT1BLmF1dGgucGFzc3dvcmQ/dW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEEuYXV0aC5wYXNzd29yZCkpOiIiO3Iuc2V0KCJBdXRob3JpemF0aW9uIiwiQmFzaWMgIitidG9hKGMrIjoiK3UpKX1sZXQgZj0kKEEuYmFzZVVSTCxBLnVybCk7aS5vcGVuKEEubWV0aG9kLnRvVXBwZXJDYXNlKCksWChmLEEucGFyYW1zLEEucGFyYW1zU2VyaWFsaXplciksITApLGkudGltZW91dD1BLnRpbWVvdXQ7ZnVuY3Rpb24gcygpe2lmKCFpKXJldHVybjtsZXQgYz1tLmZyb20oImdldEFsbFJlc3BvbnNlSGVhZGVycyJpbiBpJiZpLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSx5PXtkYXRhOiFvfHxvPT09InRleHQifHxvPT09Impzb24iP2kucmVzcG9uc2VUZXh0OmkucmVzcG9uc2Usc3RhdHVzOmkuc3RhdHVzLHN0YXR1c1RleHQ6aS5zdGF0dXNUZXh0LGhlYWRlcnM6Yyxjb25maWc6QSxyZXF1ZXN0Oml9O01BKGZ1bmN0aW9uKE4pe0koTiksUSgpfSxmdW5jdGlvbihOKXtlKE4pLFEoKX0seSksaT1udWxsfWlmKCJvbmxvYWRlbmQiaW4gaT9pLm9ubG9hZGVuZD1zOmkub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWl8fGkucmVhZHlTdGF0ZSE9PTR8fGkuc3RhdHVzPT09MCYmIShpLnJlc3BvbnNlVVJMJiZpLnJlc3BvbnNlVVJMLmluZGV4T2YoImZpbGU6Iik9PT0wKXx8c2V0VGltZW91dChzKX0saS5vbmFib3J0PWZ1bmN0aW9uKCl7aSYmKGUobmV3IGwoIlJlcXVlc3QgYWJvcnRlZCIsbC5FQ09OTkFCT1JURUQsQSxpKSksaT1udWxsKX0saS5vbmVycm9yPWZ1bmN0aW9uKCl7ZShuZXcgbCgiTmV0d29yayBFcnJvciIsbC5FUlJfTkVUV09SSyxBLGkpKSxpPW51bGx9LGkub250aW1lb3V0PWZ1bmN0aW9uKCl7bGV0IHU9QS50aW1lb3V0PyJ0aW1lb3V0IG9mICIrQS50aW1lb3V0KyJtcyBleGNlZWRlZCI6InRpbWVvdXQgZXhjZWVkZWQiLHk9QS50cmFuc2l0aW9uYWx8fGFBO0EudGltZW91dEVycm9yTWVzc2FnZSYmKHU9QS50aW1lb3V0RXJyb3JNZXNzYWdlKSxlKG5ldyBsKHUseS5jbGFyaWZ5VGltZW91dEVycm9yP2wuRVRJTUVET1VUOmwuRUNPTk5BQk9SVEVELEEsaSkpLGk9bnVsbH0sdy5oYXNTdGFuZGFyZEJyb3dzZXJFbnYmJihuJiZDLmlzRnVuY3Rpb24obikmJihuPW4oQSkpLG58fG4hPT0hMSYmVXQoZikpKXtsZXQgYz1BLnhzcmZIZWFkZXJOYW1lJiZBLnhzcmZDb29raWVOYW1lJiZOdC5yZWFkKEEueHNyZkNvb2tpZU5hbWUpO2MmJnIuc2V0KEEueHNyZkhlYWRlck5hbWUsYyl9Zz09PXZvaWQgMCYmci5zZXRDb250ZW50VHlwZShudWxsKSwic2V0UmVxdWVzdEhlYWRlciJpbiBpJiZDLmZvckVhY2goci50b0pTT04oKSxmdW5jdGlvbih1LHkpe2kuc2V0UmVxdWVzdEhlYWRlcih5LHUpfSksQy5pc1VuZGVmaW5lZChBLndpdGhDcmVkZW50aWFscyl8fChpLndpdGhDcmVkZW50aWFscz0hIUEud2l0aENyZWRlbnRpYWxzKSxvJiZvIT09Impzb24iJiYoaS5yZXNwb25zZVR5cGU9QS5yZXNwb25zZVR5cGUpLHR5cGVvZiBBLm9uRG93bmxvYWRQcm9ncmVzcz09ImZ1bmN0aW9uIiYmaS5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsa3QoQS5vbkRvd25sb2FkUHJvZ3Jlc3MsITApKSx0eXBlb2YgQS5vblVwbG9hZFByb2dyZXNzPT0iZnVuY3Rpb24iJiZpLnVwbG9hZCYmaS51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGt0KEEub25VcGxvYWRQcm9ncmVzcykpLChBLmNhbmNlbFRva2VufHxBLnNpZ25hbCkmJihhPWM9PntpJiYoZSghY3x8Yy50eXBlP25ldyBIKG51bGwsQSxpKTpjKSxpLmFib3J0KCksaT1udWxsKX0sQS5jYW5jZWxUb2tlbiYmQS5jYW5jZWxUb2tlbi5zdWJzY3JpYmUoYSksQS5zaWduYWwmJihBLnNpZ25hbC5hYm9ydGVkP2EoKTpBLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsYSkpKTtsZXQgRT1PQShmKTtpZihFJiZ3LnByb3RvY29scy5pbmRleE9mKEUpPT09LTEpe2UobmV3IGwoIlVuc3VwcG9ydGVkIHByb3RvY29sICIrRSsiOiIsbC5FUlJfQkFEX1JFUVVFU1QsQSkpO3JldHVybn1pLnNlbmQoZ3x8bnVsbCl9KX07dmFyIFRBPXtodHRwOlFBLHhocjpMdH07Qy5mb3JFYWNoKFRBLChBLHQpPT57aWYoQSl7dHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eShBLCJuYW1lIix7dmFsdWU6dH0pfWNhdGNoe31PYmplY3QuZGVmaW5lUHJvcGVydHkoQSwiYWRhcHRlck5hbWUiLHt2YWx1ZTp0fSl9fSk7dmFyIEp0PUE9PmAtICR7QX1gLEVlPUE9PkMuaXNGdW5jdGlvbihBKXx8QT09PW51bGx8fEE9PT0hMSxsQT17Z2V0QWRhcHRlcjpBPT57QT1DLmlzQXJyYXkoQSk/QTpbQV07bGV0e2xlbmd0aDp0fT1BLEksZSxnPXt9O2ZvcihsZXQgcj0wO3I8dDtyKyspe0k9QVtyXTtsZXQgbztpZihlPUksIUVlKEkpJiYoZT1UQVsobz1TdHJpbmcoSSkpLnRvTG93ZXJDYXNlKCldLGU9PT12b2lkIDApKXRocm93IG5ldyBsKGBVbmtub3duIGFkYXB0ZXIgXCcke299XCdgKTtpZihlKWJyZWFrO2dbb3x8IiUyMyIrcl09ZX1pZighZSl7bGV0IHI9T2JqZWN0LmVudHJpZXMoZykubWFwKChbbixhXSk9PmBhZGFwdGVyICR7bn0gYCsoYT09PSExPyJpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBlbnZpcm9ubWVudCI6ImlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGJ1aWxkIikpLG89dD9yLmxlbmd0aD4xP2BzaW5jZSA6JTBBYCtyLm1hcChKdCkuam9pbihgJTBBYCk6IiAiK0p0KHJbMF0pOiJhcyBubyBhZGFwdGVyIHNwZWNpZmllZCI7dGhyb3cgbmV3IGwoIlRoZXJlIGlzIG5vIHN1aXRhYmxlIGFkYXB0ZXIgdG8gZGlzcGF0Y2ggdGhlIHJlcXVlc3QgIitvLCJFUlJfTk9UX1NVUFBPUlQiKX1yZXR1cm4gZX0sYWRhcHRlcnM6VEF9O2Z1bmN0aW9uIFBBKEEpe2lmKEEuY2FuY2VsVG9rZW4mJkEuY2FuY2VsVG9rZW4udGhyb3dJZlJlcXVlc3RlZCgpLEEuc2lnbmFsJiZBLnNpZ25hbC5hYm9ydGVkKXRocm93IG5ldyBIKG51bGwsQSl9ZnVuY3Rpb24gREEoQSl7cmV0dXJuIFBBKEEpLEEuaGVhZGVycz1tLmZyb20oQS5oZWFkZXJzKSxBLmRhdGE9Xy5jYWxsKEEsQS50cmFuc2Zvcm1SZXF1ZXN0KSxbInBvc3QiLCJwdXQiLCJwYXRjaCJdLmluZGV4T2YoQS5tZXRob2QpIT09LTEmJkEuaGVhZGVycy5zZXRDb250ZW50VHlwZSgiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwhMSksbEEuZ2V0QWRhcHRlcihBLmFkYXB0ZXJ8fFQuYWRhcHRlcikoQSkudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gUEEoQSksZS5kYXRhPV8uY2FsbChBLEEudHJhbnNmb3JtUmVzcG9uc2UsZSksZS5oZWFkZXJzPW0uZnJvbShlLmhlYWRlcnMpLGV9LGZ1bmN0aW9uKGUpe3JldHVybiB2KGUpfHwoUEEoQSksZSYmZS5yZXNwb25zZSYmKGUucmVzcG9uc2UuZGF0YT1fLmNhbGwoQSxBLnRyYW5zZm9ybVJlc3BvbnNlLGUucmVzcG9uc2UpLGUucmVzcG9uc2UuaGVhZGVycz1tLmZyb20oZS5yZXNwb25zZS5oZWFkZXJzKSkpLFByb21pc2UucmVqZWN0KGUpfSl9dmFyIEh0PUE9PkEgaW5zdGFuY2VvZiBtP3suLi5BfTpBO2Z1bmN0aW9uIGsoQSx0KXt0PXR8fHt9O2xldCBJPXt9O2Z1bmN0aW9uIGUoUSxCLGkpe3JldHVybiBDLmlzUGxhaW5PYmplY3QoUSkmJkMuaXNQbGFpbk9iamVjdChCKT9DLm1lcmdlLmNhbGwoe2Nhc2VsZXNzOml9LFEsQik6Qy5pc1BsYWluT2JqZWN0KEIpP0MubWVyZ2Uoe30sQik6Qy5pc0FycmF5KEIpP0Iuc2xpY2UoKTpCfWZ1bmN0aW9uIGcoUSxCLGkpe2lmKEMuaXNVbmRlZmluZWQoQikpe2lmKCFDLmlzVW5kZWZpbmVkKFEpKXJldHVybiBlKHZvaWQgMCxRLGkpfWVsc2UgcmV0dXJuIGUoUSxCLGkpfWZ1bmN0aW9uIHIoUSxCKXtpZighQy5pc1VuZGVmaW5lZChCKSlyZXR1cm4gZSh2b2lkIDAsQil9ZnVuY3Rpb24gbyhRLEIpe2lmKEMuaXNVbmRlZmluZWQoQikpe2lmKCFDLmlzVW5kZWZpbmVkKFEpKXJldHVybiBlKHZvaWQgMCxRKX1lbHNlIHJldHVybiBlKHZvaWQgMCxCKX1mdW5jdGlvbiBuKFEsQixpKXtpZihpIGluIHQpcmV0dXJuIGUoUSxCKTtpZihpIGluIEEpcmV0dXJuIGUodm9pZCAwLFEpfWxldCBhPXt1cmw6cixtZXRob2Q6cixkYXRhOnIsYmFzZVVSTDpvLHRyYW5zZm9ybVJlcXVlc3Q6byx0cmFuc2Zvcm1SZXNwb25zZTpvLHBhcmFtc1NlcmlhbGl6ZXI6byx0aW1lb3V0Om8sdGltZW91dE1lc3NhZ2U6byx3aXRoQ3JlZGVudGlhbHM6byx3aXRoWFNSRlRva2VuOm8sYWRhcHRlcjpvLHJlc3BvbnNlVHlwZTpvLHhzcmZDb29raWVOYW1lOm8seHNyZkhlYWRlck5hbWU6byxvblVwbG9hZFByb2dyZXNzOm8sb25Eb3dubG9hZFByb2dyZXNzOm8sZGVjb21wcmVzczpvLG1heENvbnRlbnRMZW5ndGg6byxtYXhCb2R5TGVuZ3RoOm8sYmVmb3JlUmVkaXJlY3Q6byx0cmFuc3BvcnQ6byxodHRwQWdlbnQ6byxodHRwc0FnZW50Om8sY2FuY2VsVG9rZW46byxzb2NrZXRQYXRoOm8scmVzcG9uc2VFbmNvZGluZzpvLHZhbGlkYXRlU3RhdHVzOm4saGVhZGVyczooUSxCKT0+ZyhIdChRKSxIdChCKSwhMCl9O3JldHVybiBDLmZvckVhY2goT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSxBLHQpKSxmdW5jdGlvbihCKXtsZXQgaT1hW0JdfHxnLGY9aShBW0JdLHRbQl0sQik7Qy5pc1VuZGVmaW5lZChmKSYmaSE9PW58fChJW0JdPWYpfSksSX12YXIgdUE9IjEuNi44Ijt2YXIgeEE9e307WyJvYmplY3QiLCJib29sZWFuIiwibnVtYmVyIiwiZnVuY3Rpb24iLCJzdHJpbmciLCJzeW1ib2wiXS5mb3JFYWNoKChBLHQpPT57eEFbQV09ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlPT09QXx8ImEiKyh0PDE/Im4gIjoiICIpK0F9fSk7dmFyIFl0PXt9O3hBLnRyYW5zaXRpb25hbD1mdW5jdGlvbih0LEksZSl7ZnVuY3Rpb24gZyhyLG8pe3JldHVybiJbQXhpb3MgdiIrdUErIl0gVHJhbnNpdGlvbmFsIG9wdGlvbiBcJyIrcisiXCciK28rKGU/Ii4gIitlOiIiKX1yZXR1cm4ocixvLG4pPT57aWYodD09PSExKXRocm93IG5ldyBsKGcobywiIGhhcyBiZWVuIHJlbW92ZWQiKyhJPyIgaW4gIitJOiIiKSksbC5FUlJfREVQUkVDQVRFRCk7cmV0dXJuIEkmJiFZdFtvXSYmKFl0W29dPSEwLGNvbnNvbGUud2FybihnKG8sIiBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIHYiK0krIiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZSIpKSksdD90KHIsbyxuKTohMH19O2Z1bmN0aW9uIGFlKEEsdCxJKXtpZih0eXBlb2YgQSE9Im9iamVjdCIpdGhyb3cgbmV3IGwoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiLGwuRVJSX0JBRF9PUFRJT05fVkFMVUUpO2xldCBlPU9iamVjdC5rZXlzKEEpLGc9ZS5sZW5ndGg7Zm9yKDtnLS0gPjA7KXtsZXQgcj1lW2ddLG89dFtyXTtpZihvKXtsZXQgbj1BW3JdLGE9bj09PXZvaWQgMHx8byhuLHIsQSk7aWYoYSE9PSEwKXRocm93IG5ldyBsKCJvcHRpb24gIityKyIgbXVzdCBiZSAiK2EsbC5FUlJfQkFEX09QVElPTl9WQUxVRSk7Y29udGludWV9aWYoSSE9PSEwKXRocm93IG5ldyBsKCJVbmtub3duIG9wdGlvbiAiK3IsbC5FUlJfQkFEX09QVElPTil9fXZhciBoQT17YXNzZXJ0T3B0aW9uczphZSx2YWxpZGF0b3JzOnhBfTt2YXIgWT1oQS52YWxpZGF0b3JzLHg9Y2xhc3N7Y29uc3RydWN0b3IodCl7dGhpcy5kZWZhdWx0cz10LHRoaXMuaW50ZXJjZXB0b3JzPXtyZXF1ZXN0Om5ldyBMQSxyZXNwb25zZTpuZXcgTEF9fWFzeW5jIHJlcXVlc3QodCxJKXt0cnl7cmV0dXJuIGF3YWl0IHRoaXMuX3JlcXVlc3QodCxJKX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2YgRXJyb3Ipe2xldCBnO0Vycm9yLmNhcHR1cmVTdGFja1RyYWNlP0Vycm9yLmNhcHR1cmVTdGFja1RyYWNlKGc9e30pOmc9bmV3IEVycm9yO2xldCByPWcuc3RhY2s/Zy5zdGFjay5yZXBsYWNlKC9eLitcXG4vLCIiKToiIjtlLnN0YWNrP3ImJiFTdHJpbmcoZS5zdGFjaykuZW5kc1dpdGgoci5yZXBsYWNlKC9eLitcXG4uK1xcbi8sIiIpKSYmKGUuc3RhY2srPWAlMEFgK3IpOmUuc3RhY2s9cn10aHJvdyBlfX1fcmVxdWVzdCh0LEkpe3R5cGVvZiB0PT0ic3RyaW5nIj8oST1JfHx7fSxJLnVybD10KTpJPXR8fHt9LEk9ayh0aGlzLmRlZmF1bHRzLEkpO2xldHt0cmFuc2l0aW9uYWw6ZSxwYXJhbXNTZXJpYWxpemVyOmcsaGVhZGVyczpyfT1JO2UhPT12b2lkIDAmJmhBLmFzc2VydE9wdGlvbnMoZSx7c2lsZW50SlNPTlBhcnNpbmc6WS50cmFuc2l0aW9uYWwoWS5ib29sZWFuKSxmb3JjZWRKU09OUGFyc2luZzpZLnRyYW5zaXRpb25hbChZLmJvb2xlYW4pLGNsYXJpZnlUaW1lb3V0RXJyb3I6WS50cmFuc2l0aW9uYWwoWS5ib29sZWFuKX0sITEpLGchPW51bGwmJihDLmlzRnVuY3Rpb24oZyk/SS5wYXJhbXNTZXJpYWxpemVyPXtzZXJpYWxpemU6Z306aEEuYXNzZXJ0T3B0aW9ucyhnLHtlbmNvZGU6WS5mdW5jdGlvbixzZXJpYWxpemU6WS5mdW5jdGlvbn0sITApKSxJLm1ldGhvZD0oSS5tZXRob2R8fHRoaXMuZGVmYXVsdHMubWV0aG9kfHwiZ2V0IikudG9Mb3dlckNhc2UoKTtsZXQgbz1yJiZDLm1lcmdlKHIuY29tbW9uLHJbSS5tZXRob2RdKTtyJiZDLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwicG9zdCIsInB1dCIsInBhdGNoIiwiY29tbW9uIl0sRT0+e2RlbGV0ZSByW0VdfSksSS5oZWFkZXJzPW0uY29uY2F0KG8scik7bGV0IG49W10sYT0hMDt0aGlzLmludGVyY2VwdG9ycy5yZXF1ZXN0LmZvckVhY2goZnVuY3Rpb24oYyl7dHlwZW9mIGMucnVuV2hlbj09ImZ1bmN0aW9uIiYmYy5ydW5XaGVuKEkpPT09ITF8fChhPWEmJmMuc3luY2hyb25vdXMsbi51bnNoaWZ0KGMuZnVsZmlsbGVkLGMucmVqZWN0ZWQpKX0pO2xldCBRPVtdO3RoaXMuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLmZvckVhY2goZnVuY3Rpb24oYyl7US5wdXNoKGMuZnVsZmlsbGVkLGMucmVqZWN0ZWQpfSk7bGV0IEIsaT0wLGY7aWYoIWEpe2xldCBFPVtEQS5iaW5kKHRoaXMpLHZvaWQgMF07Zm9yKEUudW5zaGlmdC5hcHBseShFLG4pLEUucHVzaC5hcHBseShFLFEpLGY9RS5sZW5ndGgsQj1Qcm9taXNlLnJlc29sdmUoSSk7aTxmOylCPUIudGhlbihFW2krK10sRVtpKytdKTtyZXR1cm4gQn1mPW4ubGVuZ3RoO2xldCBzPUk7Zm9yKGk9MDtpPGY7KXtsZXQgRT1uW2krK10sYz1uW2krK107dHJ5e3M9RShzKX1jYXRjaCh1KXtjLmNhbGwodGhpcyx1KTticmVha319dHJ5e0I9REEuY2FsbCh0aGlzLHMpfWNhdGNoKEUpe3JldHVybiBQcm9taXNlLnJlamVjdChFKX1mb3IoaT0wLGY9US5sZW5ndGg7aTxmOylCPUIudGhlbihRW2krK10sUVtpKytdKTtyZXR1cm4gQn1nZXRVcmkodCl7dD1rKHRoaXMuZGVmYXVsdHMsdCk7bGV0IEk9JCh0LmJhc2VVUkwsdC51cmwpO3JldHVybiBYKEksdC5wYXJhbXMsdC5wYXJhbXNTZXJpYWxpemVyKX19O0MuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiLCJvcHRpb25zIl0sZnVuY3Rpb24odCl7eC5wcm90b3R5cGVbdF09ZnVuY3Rpb24oSSxlKXtyZXR1cm4gdGhpcy5yZXF1ZXN0KGsoZXx8e30se21ldGhvZDp0LHVybDpJLGRhdGE6KGV8fHt9KS5kYXRhfSkpfX0pO0MuZm9yRWFjaChbInBvc3QiLCJwdXQiLCJwYXRjaCJdLGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIEkoZSl7cmV0dXJuIGZ1bmN0aW9uKHIsbyxuKXtyZXR1cm4gdGhpcy5yZXF1ZXN0KGsobnx8e30se21ldGhvZDp0LGhlYWRlcnM6ZT97IkNvbnRlbnQtVHlwZSI6Im11bHRpcGFydC9mb3JtLWRhdGEifTp7fSx1cmw6cixkYXRhOm99KSl9fXgucHJvdG90eXBlW3RdPUkoKSx4LnByb3RvdHlwZVt0KyJGb3JtIl09SSghMCl9KTt2YXIgQUE9eDt2YXIgakE9Y2xhc3MgQXtjb25zdHJ1Y3Rvcih0KXtpZih0eXBlb2YgdCE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJleGVjdXRvciBtdXN0IGJlIGEgZnVuY3Rpb24uIik7bGV0IEk7dGhpcy5wcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKHIpe0k9cn0pO2xldCBlPXRoaXM7dGhpcy5wcm9taXNlLnRoZW4oZz0+e2lmKCFlLl9saXN0ZW5lcnMpcmV0dXJuO2xldCByPWUuX2xpc3RlbmVycy5sZW5ndGg7Zm9yKDtyLS0gPjA7KWUuX2xpc3RlbmVyc1tyXShnKTtlLl9saXN0ZW5lcnM9bnVsbH0pLHRoaXMucHJvbWlzZS50aGVuPWc9PntsZXQgcixvPW5ldyBQcm9taXNlKG49PntlLnN1YnNjcmliZShuKSxyPW59KS50aGVuKGcpO3JldHVybiBvLmNhbmNlbD1mdW5jdGlvbigpe2UudW5zdWJzY3JpYmUocil9LG99LHQoZnVuY3Rpb24ocixvLG4pe2UucmVhc29ufHwoZS5yZWFzb249bmV3IEgocixvLG4pLEkoZS5yZWFzb24pKX0pfXRocm93SWZSZXF1ZXN0ZWQoKXtpZih0aGlzLnJlYXNvbil0aHJvdyB0aGlzLnJlYXNvbn1zdWJzY3JpYmUodCl7aWYodGhpcy5yZWFzb24pe3QodGhpcy5yZWFzb24pO3JldHVybn10aGlzLl9saXN0ZW5lcnM/dGhpcy5fbGlzdGVuZXJzLnB1c2godCk6dGhpcy5fbGlzdGVuZXJzPVt0XX11bnN1YnNjcmliZSh0KXtpZighdGhpcy5fbGlzdGVuZXJzKXJldHVybjtsZXQgST10aGlzLl9saXN0ZW5lcnMuaW5kZXhPZih0KTtJIT09LTEmJnRoaXMuX2xpc3RlbmVycy5zcGxpY2UoSSwxKX1zdGF0aWMgc291cmNlKCl7bGV0IHQ7cmV0dXJue3Rva2VuOm5ldyBBKGZ1bmN0aW9uKGcpe3Q9Z30pLGNhbmNlbDp0fX19LGJ0PWpBO2Z1bmN0aW9uIFdBKEEpe3JldHVybiBmdW5jdGlvbihJKXtyZXR1cm4gQS5hcHBseShudWxsLEkpfX1mdW5jdGlvbiBaQShBKXtyZXR1cm4gQy5pc09iamVjdChBKSYmQS5pc0F4aW9zRXJyb3I9PT0hMH12YXIgVkE9e0NvbnRpbnVlOjEwMCxTd2l0Y2hpbmdQcm90b2NvbHM6MTAxLFByb2Nlc3Npbmc6MTAyLEVhcmx5SGludHM6MTAzLE9rOjIwMCxDcmVhdGVkOjIwMSxBY2NlcHRlZDoyMDIsTm9uQXV0aG9yaXRhdGl2ZUluZm9ybWF0aW9uOjIwMyxOb0NvbnRlbnQ6MjA0LFJlc2V0Q29udGVudDoyMDUsUGFydGlhbENvbnRlbnQ6MjA2LE11bHRpU3RhdHVzOjIwNyxBbHJlYWR5UmVwb3J0ZWQ6MjA4LEltVXNlZDoyMjYsTXVsdGlwbGVDaG9pY2VzOjMwMCxNb3ZlZFBlcm1hbmVudGx5OjMwMSxGb3VuZDozMDIsU2VlT3RoZXI6MzAzLE5vdE1vZGlmaWVkOjMwNCxVc2VQcm94eTozMDUsVW51c2VkOjMwNixUZW1wb3JhcnlSZWRpcmVjdDozMDcsUGVybWFuZW50UmVkaXJlY3Q6MzA4LEJhZFJlcXVlc3Q6NDAwLFVuYXV0aG9yaXplZDo0MDEsUGF5bWVudFJlcXVpcmVkOjQwMixGb3JiaWRkZW46NDAzLE5vdEZvdW5kOjQwNCxNZXRob2ROb3RBbGxvd2VkOjQwNSxOb3RBY2NlcHRhYmxlOjQwNixQcm94eUF1dGhlbnRpY2F0aW9uUmVxdWlyZWQ6NDA3LFJlcXVlc3RUaW1lb3V0OjQwOCxDb25mbGljdDo0MDksR29uZTo0MTAsTGVuZ3RoUmVxdWlyZWQ6NDExLFByZWNvbmRpdGlvbkZhaWxlZDo0MTIsUGF5bG9hZFRvb0xhcmdlOjQxMyxVcmlUb29Mb25nOjQxNCxVbnN1cHBvcnRlZE1lZGlhVHlwZTo0MTUsUmFuZ2VOb3RTYXRpc2ZpYWJsZTo0MTYsRXhwZWN0YXRpb25GYWlsZWQ6NDE3LEltQVRlYXBvdDo0MTgsTWlzZGlyZWN0ZWRSZXF1ZXN0OjQyMSxVbnByb2Nlc3NhYmxlRW50aXR5OjQyMixMb2NrZWQ6NDIzLEZhaWxlZERlcGVuZGVuY3k6NDI0LFRvb0Vhcmx5OjQyNSxVcGdyYWRlUmVxdWlyZWQ6NDI2LFByZWNvbmRpdGlvblJlcXVpcmVkOjQyOCxUb29NYW55UmVxdWVzdHM6NDI5LFJlcXVlc3RIZWFkZXJGaWVsZHNUb29MYXJnZTo0MzEsVW5hdmFpbGFibGVGb3JMZWdhbFJlYXNvbnM6NDUxLEludGVybmFsU2VydmVyRXJyb3I6NTAwLE5vdEltcGxlbWVudGVkOjUwMSxCYWRHYXRld2F5OjUwMixTZXJ2aWNlVW5hdmFpbGFibGU6NTAzLEdhdGV3YXlUaW1lb3V0OjUwNCxIdHRwVmVyc2lvbk5vdFN1cHBvcnRlZDo1MDUsVmFyaWFudEFsc29OZWdvdGlhdGVzOjUwNixJbnN1ZmZpY2llbnRTdG9yYWdlOjUwNyxMb29wRGV0ZWN0ZWQ6NTA4LE5vdEV4dGVuZGVkOjUxMCxOZXR3b3JrQXV0aGVudGljYXRpb25SZXF1aXJlZDo1MTF9O09iamVjdC5lbnRyaWVzKFZBKS5mb3JFYWNoKChbQSx0XSk9PntWQVt0XT1BfSk7dmFyIE10PVZBO2Z1bmN0aW9uIHF0KEEpe2xldCB0PW5ldyBBQShBKSxJPVcoQUEucHJvdG90eXBlLnJlcXVlc3QsdCk7cmV0dXJuIEMuZXh0ZW5kKEksQUEucHJvdG90eXBlLHQse2FsbE93bktleXM6ITB9KSxDLmV4dGVuZChJLHQsbnVsbCx7YWxsT3duS2V5czohMH0pLEkuY3JlYXRlPWZ1bmN0aW9uKGcpe3JldHVybiBxdChrKEEsZykpfSxJfXZhciBoPXF0KFQpO2guQXhpb3M9QUE7aC5DYW5jZWxlZEVycm9yPUg7aC5DYW5jZWxUb2tlbj1idDtoLmlzQ2FuY2VsPXY7aC5WRVJTSU9OPXVBO2gudG9Gb3JtRGF0YT1KO2guQXhpb3NFcnJvcj1sO2guQ2FuY2VsPWguQ2FuY2VsZWRFcnJvcjtoLmFsbD1mdW5jdGlvbih0KXtyZXR1cm4gUHJvbWlzZS5hbGwodCl9O2guc3ByZWFkPVdBO2guaXNBeGlvc0Vycm9yPVpBO2gubWVyZ2VDb25maWc9aztoLkF4aW9zSGVhZGVycz1tO2guZm9ybVRvSlNPTj1BPT5jQShDLmlzSFRNTEZvcm0oQSk/bmV3IEZvcm1EYXRhKEEpOkEpO2guZ2V0QWRhcHRlcj1sQS5nZXRBZGFwdGVyO2guSHR0cFN0YXR1c0NvZGU9TXQ7aC5kZWZhdWx0PWg7dmFyIGRBPWg7dmFye0F4aW9zOmlvLEF4aW9zRXJyb3I6Q28sQ2FuY2VsZWRFcnJvcjpCbyxpc0NhbmNlbDpubyxDYW5jZWxUb2tlbjpzbyxWRVJTSU9OOlFvLGFsbDpFbyxDYW5jZWw6YW8saXNBeGlvc0Vycm9yOmNvLHNwcmVhZDpmbyx0b0Zvcm1EYXRhOmxvLEF4aW9zSGVhZGVyczpEbyxIdHRwU3RhdHVzQ29kZTp1byxmb3JtVG9KU09OOmhvLGdldEFkYXB0ZXI6eW8sbWVyZ2VDb25maWc6d299PWRBO3ZhciB0QSxMLHpBLFhBPXtlbnY6e2Vtc2NyaXB0ZW5fbm90aWZ5X21lbW9yeV9ncm93dGg6ZnVuY3Rpb24oQSl7ekE9bmV3IFVpbnQ4QXJyYXkoTC5leHBvcnRzLm1lbW9yeS5idWZmZXIpfX19LHlBPWNsYXNze2luaXQoKXtyZXR1cm4gdEF8fCh0eXBlb2YgZmV0Y2g8InUiP3RBPWZldGNoKCJkYXRhOmFwcGxpY2F0aW9uL3dhc207YmFzZTY0LCIrS3QpLnRoZW4odD0+dC5hcnJheUJ1ZmZlcigpKS50aGVuKHQ9PldlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKHQsWEEpKS50aGVuKHRoaXMuX2luaXQpOnRBPVdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKEJ1ZmZlci5mcm9tKEt0LCJiYXNlNjQiKSxYQSkudGhlbih0aGlzLl9pbml0KSx0QSl9X2luaXQodCl7TD10Lmluc3RhbmNlLFhBLmVudi5lbXNjcmlwdGVuX25vdGlmeV9tZW1vcnlfZ3Jvd3RoKDApfWRlY29kZSh0LEk9MCl7aWYoIUwpdGhyb3cgbmV3IEVycm9yKCJaU1RERGVjb2RlcjogQXdhaXQgLmluaXQoKSBiZWZvcmUgZGVjb2RpbmcuIik7bGV0IGU9dC5ieXRlTGVuZ3RoLGc9TC5leHBvcnRzLm1hbGxvYyhlKTt6QS5zZXQodCxnKSxJPUl8fE51bWJlcihMLmV4cG9ydHMuWlNURF9maW5kRGVjb21wcmVzc2VkU2l6ZShnLGUpKTtsZXQgcj1MLmV4cG9ydHMubWFsbG9jKEkpLG89TC5leHBvcnRzLlpTVERfZGVjb21wcmVzcyhyLEksZyxlKSxuPXpBLnNsaWNlKHIscitvKTtyZXR1cm4gTC5leHBvcnRzLmZyZWUoZyksTC5leHBvcnRzLmZyZWUociksbn19LEt0PSJBR0Z6YlFFQUFBQUJiZzVnQTM5L2Z3Ri9ZQUYvQVg5Z0FuOS9BR0FCZndCZ0JYOS9mMzkvQVg5Z0EzOS9md0JnQkg5L2YzOEJmMkFBQVg5Z0FuOS9BWDlnQjM5L2YzOS9mMzhCZjJBQ2YzOEJmbUFJZjM5L2YzOS9mMzhCZjJBRmYzOS9mMzhBWUE1L2YzOS9mMzkvZjM5L2YzOS9md0YvQWljQkEyVnVkaDlsYlhOamNtbHdkR1Z1WDI1dmRHbG1lVjl0WlcxdmNubGZaM0p2ZDNSb0FBTURJeUlIQUFBQkFRTUhBd0VBQ1FRQUJRRUlDQUVGQmdRRUJBTUdBQUFLQUFVTERBMEdCQVVCY0FFQkFRVUhBUUdBQW9DQUFnWUlBWDhCUVlDakJBc0hyZ0VMQm0xbGJXOXllUUlBQm0xaGJHeHZZd0FGQkdaeVpXVUFCZ3hhVTFSRVgybHpSWEp5YjNJQUVobGFVMVJFWDJacGJtUkVaV052YlhCeVpYTnpaV1JUYVhwbEFCd1BXbE5VUkY5a1pXTnZiWEJ5WlhOekFDSVpYMTlwYm1ScGNtVmpkRjltZFc1amRHbHZibDkwWVdKc1pRRUFFRjlmWlhKeWJtOWZiRzlqWVhScGIyNEFBUWx6ZEdGamExTmhkbVVBQnd4emRHRmphMUpsYzNSdmNtVUFDQXB6ZEdGamEwRnNiRzlqQUFrS2kvSUJJZ1VBUVlRZkN6TUJBWDhnQWdSQUlBQWhBd05BSUFNZ0FTMEFBRG9BQUNBRFFRRnFJUU1nQVVFQmFpRUJJQUpCQVdzaUFnMEFDd3NnQUFzcEFRRi9JQUlFUUNBQUlRTURRQ0FESUFFNkFBQWdBMEVCYWlFRElBSkJBV3NpQWcwQUN3c2dBQXRzQVFKL1FZQWZLQUlBSWdFZ0FFRUhha0Y0Y1NJQ2FpRUFBa0FnQWtFQUlBQWdBVTBiRFFBZ0FEOEFRUkIwU3dSQUlBQS9BRUVRZEd0Qi8vOERha0VRZGtBQVFYOUdCSDlCQUFWQkFCQUFRUUVMUlEwQkMwR0FIeUFBTmdJQUlBRVBDMEdFSDBFd05nSUFRWDhMdVNjQkMzOGpBRUVRYXlJS0pBQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQUJCOUFGTkJFQkJpQjhvQWdBaUJrRVFJQUJCQzJwQmVIRWdBRUVMU1JzaUJVRURkaUlBZGlJQlFRTnhCRUFDUUNBQlFYOXpRUUZ4SUFCcUlnSkJBM1FpQVVHd0gyb2lBQ0FCUWJnZmFpZ0NBQ0lCS0FJSUlnUkdCRUJCaUI4Z0JrRitJQUozY1RZQ0FBd0JDeUFFSUFBMkFnd2dBQ0FFTmdJSUN5QUJRUWhxSVFBZ0FTQUNRUU4wSWdKQkEzSTJBZ1FnQVNBQ2FpSUJJQUVvQWdSQkFYSTJBZ1FNRHdzZ0JVR1FIeWdDQUNJSFRRMEJJQUVFUUFKQVFRSWdBSFFpQWtFQUlBSnJjaUFCSUFCMGNXZ2lBVUVEZENJQVFiQWZhaUlDSUFCQnVCOXFLQUlBSWdBb0FnZ2lCRVlFUUVHSUh5QUdRWDRnQVhkeElnWTJBZ0FNQVFzZ0JDQUNOZ0lNSUFJZ0JEWUNDQXNnQUNBRlFRTnlOZ0lFSUFBZ0JXb2lDQ0FCUVFOMElnRWdCV3NpQkVFQmNqWUNCQ0FBSUFGcUlBUTJBZ0FnQndSQUlBZEJlSEZCc0I5cUlRRkJuQjhvQWdBaEFnSi9JQVpCQVNBSFFRTjJkQ0lEY1VVRVFFR0lIeUFESUFaeU5nSUFJQUVNQVFzZ0FTZ0NDQXNoQXlBQklBSTJBZ2dnQXlBQ05nSU1JQUlnQVRZQ0RDQUNJQU0yQWdnTElBQkJDR29oQUVHY0h5QUlOZ0lBUVpBZklBUTJBZ0FNRHd0QmpCOG9BZ0FpQzBVTkFTQUxhRUVDZEVHNElXb29BZ0FpQWlnQ0JFRjRjU0FGYXlFRElBSWhBUU5BQWtBZ0FTZ0NFQ0lBUlFSQUlBRW9BaFFpQUVVTkFRc2dBQ2dDQkVGNGNTQUZheUlCSUFNZ0FTQURTU0lCR3lFRElBQWdBaUFCR3lFQ0lBQWhBUXdCQ3dzZ0FpZ0NHQ0VKSUFJZ0FpZ0NEQ0lFUndSQVFaZ2ZLQUlBR2lBQ0tBSUlJZ0FnQkRZQ0RDQUVJQUEyQWdnTURnc2dBa0VVYWlJQktBSUFJZ0JGQkVBZ0FpZ0NFQ0lBUlEwRElBSkJFR29oQVFzRFFDQUJJUWdnQUNJRVFSUnFJZ0VvQWdBaUFBMEFJQVJCRUdvaEFTQUVLQUlRSWdBTkFBc2dDRUVBTmdJQURBMExRWDhoQlNBQVFiOS9TdzBBSUFCQkMyb2lBRUY0Y1NFRlFZd2ZLQUlBSWdoRkRRQkJBQ0FGYXlFREFrQUNRQUpBQW45QkFDQUZRWUFDU1EwQUdrRWZJQVZCLy8vL0Iwc05BQm9nQlVFbUlBQkJDSFpuSWdCcmRrRUJjU0FBUVFGMGEwRSthZ3NpQjBFQ2RFRzRJV29vQWdBaUFVVUVRRUVBSVFBTUFRdEJBQ0VBSUFWQkdTQUhRUUYyYTBFQUlBZEJIMGNiZENFQ0EwQUNRQ0FCS0FJRVFYaHhJQVZySWdZZ0EwOE5BQ0FCSVFRZ0JpSUREUUJCQUNFRElBRWhBQXdEQ3lBQUlBRW9BaFFpQmlBR0lBRWdBa0VkZGtFRWNXb29BaEFpQVVZYklBQWdCaHNoQUNBQ1FRRjBJUUlnQVEwQUN3c2dBQ0FFY2tVRVFFRUFJUVJCQWlBSGRDSUFRUUFnQUd0eUlBaHhJZ0JGRFFNZ0FHaEJBblJCdUNGcUtBSUFJUUFMSUFCRkRRRUxBMEFnQUNnQ0JFRjRjU0FGYXlJQ0lBTkpJUUVnQWlBRElBRWJJUU1nQUNBRUlBRWJJUVFnQUNnQ0VDSUJCSDhnQVFVZ0FDZ0NGQXNpQUEwQUN3c2dCRVVOQUNBRFFaQWZLQUlBSUFWclR3MEFJQVFvQWhnaEJ5QUVJQVFvQWd3aUFrY0VRRUdZSHlnQ0FCb2dCQ2dDQ0NJQUlBSTJBZ3dnQWlBQU5nSUlEQXdMSUFSQkZHb2lBU2dDQUNJQVJRUkFJQVFvQWhBaUFFVU5BeUFFUVJCcUlRRUxBMEFnQVNFR0lBQWlBa0VVYWlJQktBSUFJZ0FOQUNBQ1FSQnFJUUVnQWlnQ0VDSUFEUUFMSUFaQkFEWUNBQXdMQ3lBRlFaQWZLQUlBSWdSTkJFQkJuQjhvQWdBaEFBSkFJQVFnQldzaUFVRVFUd1JBSUFBZ0JXb2lBaUFCUVFGeU5nSUVJQUFnQkdvZ0FUWUNBQ0FBSUFWQkEzSTJBZ1FNQVFzZ0FDQUVRUU55TmdJRUlBQWdCR29pQVNBQktBSUVRUUZ5TmdJRVFRQWhBa0VBSVFFTFFaQWZJQUUyQWdCQm5COGdBallDQUNBQVFRaHFJUUFNRFFzZ0JVR1VIeWdDQUNJQ1NRUkFRWlFmSUFJZ0JXc2lBVFlDQUVHZ0gwR2dIeWdDQUNJQUlBVnFJZ0kyQWdBZ0FpQUJRUUZ5TmdJRUlBQWdCVUVEY2pZQ0JDQUFRUWhxSVFBTURRdEJBQ0VBSUFWQkwyb2lBd0ovUWVBaUtBSUFCRUJCNkNJb0FnQU1BUXRCN0NKQ2Z6Y0NBRUhrSWtLQW9JQ0FnSUFFTndJQVFlQWlJQXBCREdwQmNIRkIyS3JWcWdWek5nSUFRZlFpUVFBMkFnQkJ4Q0pCQURZQ0FFR0FJQXNpQVdvaUJrRUFJQUZySWdoeElnRWdCVTBOREVIQUlpZ0NBQ0lFQkVCQnVDSW9BZ0FpQnlBQmFpSUpJQWROSUFRZ0NVbHlEUTBMQWtCQnhDSXRBQUJCQkhGRkJFQUNRQUpBQWtBQ1FFR2dIeWdDQUNJRUJFQkJ5Q0loQUFOQUlBUWdBQ2dDQUNJSFR3UkFJQWNnQUNnQ0JHb2dCRXNOQXdzZ0FDZ0NDQ0lBRFFBTEMwRUFFQVFpQWtGL1JnMERJQUVoQmtIa0lpZ0NBQ0lBUVFGcklnUWdBbkVFUUNBQklBSnJJQUlnQkdwQkFDQUFhM0ZxSVFZTElBVWdCazhOQTBIQUlpZ0NBQ0lBQkVCQnVDSW9BZ0FpQkNBR2FpSUlJQVJOSUFBZ0NFbHlEUVFMSUFZUUJDSUFJQUpIRFFFTUJRc2dCaUFDYXlBSWNTSUdFQVFpQWlBQUtBSUFJQUFvQWdScVJnMEJJQUloQUFzZ0FFRi9SZzBCSUFWQk1Hb2dCazBFUUNBQUlRSU1CQXRCNkNJb0FnQWlBaUFESUFacmFrRUFJQUpyY1NJQ0VBUkJmMFlOQVNBQ0lBWnFJUVlnQUNFQ0RBTUxJQUpCZjBjTkFndEJ4Q0pCeENJb0FnQkJCSEkyQWdBTElBRVFCQ0lDUVg5R1FRQVFCQ0lBUVg5R2NpQUFJQUpOY2cwRklBQWdBbXNpQmlBRlFTaHFUUTBGQzBHNElrRzRJaWdDQUNBR2FpSUFOZ0lBUWJ3aUtBSUFJQUJKQkVCQnZDSWdBRFlDQUFzQ1FFR2dIeWdDQUNJREJFQkJ5Q0loQUFOQUlBSWdBQ2dDQUNJQklBQW9BZ1FpQkdwR0RRSWdBQ2dDQ0NJQURRQUxEQVFMUVpnZktBSUFJZ0JCQUNBQUlBSk5HMFVFUUVHWUh5QUNOZ0lBQzBFQUlRQkJ6Q0lnQmpZQ0FFSElJaUFDTmdJQVFhZ2ZRWDgyQWdCQnJCOUI0Q0lvQWdBMkFnQkIxQ0pCQURZQ0FBTkFJQUJCQTNRaUFVRzRIMm9nQVVHd0gyb2lCRFlDQUNBQlFid2ZhaUFFTmdJQUlBQkJBV29pQUVFZ1J3MEFDMEdVSHlBR1FTaHJJZ0JCZUNBQ2EwRUhjU0lCYXlJRU5nSUFRYUFmSUFFZ0Ftb2lBVFlDQUNBQklBUkJBWEkyQWdRZ0FDQUNha0VvTmdJRVFhUWZRZkFpS0FJQU5nSUFEQVFMSUFJZ0EwMGdBU0FEUzNJTkFpQUFLQUlNUVFoeERRSWdBQ0FFSUFacU5nSUVRYUFmSUFOQmVDQURhMEVIY1NJQWFpSUJOZ0lBUVpRZlFaUWZLQUlBSUFacUlnSWdBR3NpQURZQ0FDQUJJQUJCQVhJMkFnUWdBaUFEYWtFb05nSUVRYVFmUWZBaUtBSUFOZ0lBREFNTFFRQWhCQXdLQzBFQUlRSU1DQXRCbUI4b0FnQWdBa3NFUUVHWUh5QUNOZ0lBQ3lBQ0lBWnFJUUZCeUNJaEFBSkFBa0FDUUFOQUlBRWdBQ2dDQUVjRVFDQUFLQUlJSWdBTkFRd0NDd3NnQUMwQURFRUljVVVOQVF0QnlDSWhBQU5BSUFNZ0FDZ0NBQ0lCVHdSQUlBRWdBQ2dDQkdvaUJDQURTdzBEQ3lBQUtBSUlJUUFNQUFzQUN5QUFJQUkyQWdBZ0FDQUFLQUlFSUFacU5nSUVJQUpCZUNBQ2EwRUhjV29pQnlBRlFRTnlOZ0lFSUFGQmVDQUJhMEVIY1dvaUJpQUZJQWRxSWdWcklRQWdBeUFHUmdSQVFhQWZJQVUyQWdCQmxCOUJsQjhvQWdBZ0FHb2lBRFlDQUNBRklBQkJBWEkyQWdRTUNBdEJuQjhvQWdBZ0JrWUVRRUdjSHlBRk5nSUFRWkFmUVpBZktBSUFJQUJxSWdBMkFnQWdCU0FBUVFGeU5nSUVJQUFnQldvZ0FEWUNBQXdJQ3lBR0tBSUVJZ05CQTNGQkFVY05CaUFEUVhoeElRa2dBMEgvQVUwRVFDQUdLQUlNSWdFZ0JpZ0NDQ0lDUmdSQVFZZ2ZRWWdmS0FJQVFYNGdBMEVEZG5keE5nSUFEQWNMSUFJZ0FUWUNEQ0FCSUFJMkFnZ01CZ3NnQmlnQ0dDRUlJQVlnQmlnQ0RDSUNSd1JBSUFZb0FnZ2lBU0FDTmdJTUlBSWdBVFlDQ0F3RkN5QUdRUlJxSWdFb0FnQWlBMFVFUUNBR0tBSVFJZ05GRFFRZ0JrRVFhaUVCQ3dOQUlBRWhCQ0FESWdKQkZHb2lBU2dDQUNJRERRQWdBa0VRYWlFQklBSW9BaEFpQXcwQUN5QUVRUUEyQWdBTUJBdEJsQjhnQmtFb2F5SUFRWGdnQW10QkIzRWlBV3NpQ0RZQ0FFR2dIeUFCSUFKcUlnRTJBZ0FnQVNBSVFRRnlOZ0lFSUFBZ0FtcEJLRFlDQkVHa0gwSHdJaWdDQURZQ0FDQURJQVJCSnlBRWEwRUhjV3BCTDJzaUFDQUFJQU5CRUdwSkd5SUJRUnMyQWdRZ0FVSFFJaWtDQURjQ0VDQUJRY2dpS1FJQU53SUlRZEFpSUFGQkNHbzJBZ0JCekNJZ0JqWUNBRUhJSWlBQ05nSUFRZFFpUVFBMkFnQWdBVUVZYWlFQUEwQWdBRUVITmdJRUlBQkJDR29nQUVFRWFpRUFJQVJKRFFBTElBRWdBMFlOQUNBQklBRW9BZ1JCZm5FMkFnUWdBeUFCSUFOcklnSkJBWEkyQWdRZ0FTQUNOZ0lBSUFKQi93Rk5CRUFnQWtGNGNVR3dIMm9oQUFKL1FZZ2ZLQUlBSWdGQkFTQUNRUU4yZENJQ2NVVUVRRUdJSHlBQklBSnlOZ0lBSUFBTUFRc2dBQ2dDQ0FzaEFTQUFJQU0yQWdnZ0FTQUROZ0lNSUFNZ0FEWUNEQ0FESUFFMkFnZ01BUXRCSHlFQUlBSkIvLy8vQjAwRVFDQUNRU1lnQWtFSWRtY2lBR3QyUVFGeElBQkJBWFJyUVQ1cUlRQUxJQU1nQURZQ0hDQURRZ0EzQWhBZ0FFRUNkRUc0SVdvaEFRSkFBa0JCakI4b0FnQWlCRUVCSUFCMElnWnhSUVJBUVl3ZklBUWdCbkkyQWdBZ0FTQUROZ0lBREFFTElBSkJHU0FBUVFGMmEwRUFJQUJCSDBjYmRDRUFJQUVvQWdBaEJBTkFJQVFpQVNnQ0JFRjRjU0FDUmcwQ0lBQkJIWFloQkNBQVFRRjBJUUFnQVNBRVFRUnhhaUlHS0FJUUlnUU5BQXNnQmlBRE5nSVFDeUFESUFFMkFoZ2dBeUFETmdJTUlBTWdBellDQ0F3QkN5QUJLQUlJSWdBZ0F6WUNEQ0FCSUFNMkFnZ2dBMEVBTmdJWUlBTWdBVFlDRENBRElBQTJBZ2dMUVpRZktBSUFJZ0FnQlUwTkFFR1VIeUFBSUFWcklnRTJBZ0JCb0I5Qm9COG9BZ0FpQUNBRmFpSUNOZ0lBSUFJZ0FVRUJjallDQkNBQUlBVkJBM0kyQWdRZ0FFRUlhaUVBREFnTFFZUWZRVEEyQWdCQkFDRUFEQWNMUVFBaEFnc2dDRVVOQUFKQUlBWW9BaHdpQVVFQ2RFRzRJV29pQkNnQ0FDQUdSZ1JBSUFRZ0FqWUNBQ0FDRFFGQmpCOUJqQjhvQWdCQmZpQUJkM0UyQWdBTUFnc2dDRUVRUVJRZ0NDZ0NFQ0FHUmh0cUlBSTJBZ0FnQWtVTkFRc2dBaUFJTmdJWUlBWW9BaEFpQVFSQUlBSWdBVFlDRUNBQklBSTJBaGdMSUFZb0FoUWlBVVVOQUNBQ0lBRTJBaFFnQVNBQ05nSVlDeUFBSUFscUlRQWdCaUFKYWlJR0tBSUVJUU1MSUFZZ0EwRitjVFlDQkNBRklBQkJBWEkyQWdRZ0FDQUZhaUFBTmdJQUlBQkIvd0ZOQkVBZ0FFRjRjVUd3SDJvaEFRSi9RWWdmS0FJQUlnSkJBU0FBUVFOMmRDSUFjVVVFUUVHSUh5QUFJQUp5TmdJQUlBRU1BUXNnQVNnQ0NBc2hBQ0FCSUFVMkFnZ2dBQ0FGTmdJTUlBVWdBVFlDRENBRklBQTJBZ2dNQVF0Qkh5RURJQUJCLy8vL0IwMEVRQ0FBUVNZZ0FFRUlkbWNpQVd0MlFRRnhJQUZCQVhSclFUNXFJUU1MSUFVZ0F6WUNIQ0FGUWdBM0FoQWdBMEVDZEVHNElXb2hBUUpBQWtCQmpCOG9BZ0FpQWtFQklBTjBJZ1J4UlFSQVFZd2ZJQUlnQkhJMkFnQWdBU0FGTmdJQURBRUxJQUJCR1NBRFFRRjJhMEVBSUFOQkgwY2JkQ0VESUFFb0FnQWhBZ05BSUFJaUFTZ0NCRUY0Y1NBQVJnMENJQU5CSFhZaEFpQURRUUYwSVFNZ0FTQUNRUVJ4YWlJRUtBSVFJZ0lOQUFzZ0JDQUZOZ0lRQ3lBRklBRTJBaGdnQlNBRk5nSU1JQVVnQlRZQ0NBd0JDeUFCS0FJSUlnQWdCVFlDRENBQklBVTJBZ2dnQlVFQU5nSVlJQVVnQVRZQ0RDQUZJQUEyQWdnTElBZEJDR29oQUF3Q0N3SkFJQWRGRFFBQ1FDQUVLQUljSWdCQkFuUkJ1Q0ZxSWdFb0FnQWdCRVlFUUNBQklBSTJBZ0FnQWcwQlFZd2ZJQWhCZmlBQWQzRWlDRFlDQUF3Q0N5QUhRUkJCRkNBSEtBSVFJQVJHRzJvZ0FqWUNBQ0FDUlEwQkN5QUNJQWMyQWhnZ0JDZ0NFQ0lBQkVBZ0FpQUFOZ0lRSUFBZ0FqWUNHQXNnQkNnQ0ZDSUFSUTBBSUFJZ0FEWUNGQ0FBSUFJMkFoZ0xBa0FnQTBFUFRRUkFJQVFnQXlBRmFpSUFRUU55TmdJRUlBQWdCR29pQUNBQUtBSUVRUUZ5TmdJRURBRUxJQVFnQlVFRGNqWUNCQ0FFSUFWcUlnSWdBMEVCY2pZQ0JDQUNJQU5xSUFNMkFnQWdBMEgvQVUwRVFDQURRWGh4UWJBZmFpRUFBbjlCaUI4b0FnQWlBVUVCSUFOQkEzWjBJZ054UlFSQVFZZ2ZJQUVnQTNJMkFnQWdBQXdCQ3lBQUtBSUlDeUVCSUFBZ0FqWUNDQ0FCSUFJMkFnd2dBaUFBTmdJTUlBSWdBVFlDQ0F3QkMwRWZJUUFnQTBILy8vOEhUUVJBSUFOQkppQURRUWgyWnlJQWEzWkJBWEVnQUVFQmRHdEJQbW9oQUFzZ0FpQUFOZ0ljSUFKQ0FEY0NFQ0FBUVFKMFFiZ2hhaUVCQWtBQ1FDQUlRUUVnQUhRaUJuRkZCRUJCakI4Z0JpQUljallDQUNBQklBSTJBZ0FNQVFzZ0EwRVpJQUJCQVhaclFRQWdBRUVmUnh0MElRQWdBU2dDQUNFRkEwQWdCU0lCS0FJRVFYaHhJQU5HRFFJZ0FFRWRkaUVHSUFCQkFYUWhBQ0FCSUFaQkJIRnFJZ1lvQWhBaUJRMEFDeUFHSUFJMkFoQUxJQUlnQVRZQ0dDQUNJQUkyQWd3Z0FpQUNOZ0lJREFFTElBRW9BZ2dpQUNBQ05nSU1JQUVnQWpZQ0NDQUNRUUEyQWhnZ0FpQUJOZ0lNSUFJZ0FEWUNDQXNnQkVFSWFpRUFEQUVMQWtBZ0NVVU5BQUpBSUFJb0Fod2lBRUVDZEVHNElXb2lBU2dDQUNBQ1JnUkFJQUVnQkRZQ0FDQUVEUUZCakI4Z0MwRitJQUIzY1RZQ0FBd0NDeUFKUVJCQkZDQUpLQUlRSUFKR0cyb2dCRFlDQUNBRVJRMEJDeUFFSUFrMkFoZ2dBaWdDRUNJQUJFQWdCQ0FBTmdJUUlBQWdCRFlDR0FzZ0FpZ0NGQ0lBUlEwQUlBUWdBRFlDRkNBQUlBUTJBaGdMQWtBZ0EwRVBUUVJBSUFJZ0F5QUZhaUlBUVFOeU5nSUVJQUFnQW1vaUFDQUFLQUlFUVFGeU5nSUVEQUVMSUFJZ0JVRURjallDQkNBQ0lBVnFJZ1FnQTBFQmNqWUNCQ0FESUFScUlBTTJBZ0FnQndSQUlBZEJlSEZCc0I5cUlRQkJuQjhvQWdBaEFRSi9RUUVnQjBFRGRuUWlCU0FHY1VVRVFFR0lIeUFGSUFaeU5nSUFJQUFNQVFzZ0FDZ0NDQXNoQmlBQUlBRTJBZ2dnQmlBQk5nSU1JQUVnQURZQ0RDQUJJQVkyQWdnTFFad2ZJQVEyQWdCQmtCOGdBellDQUFzZ0FrRUlhaUVBQ3lBS1FSQnFKQUFnQUF2U0N3RUhmd0pBSUFCRkRRQWdBRUVJYXlJQ0lBQkJCR3NvQWdBaUFVRjRjU0lBYWlFRkFrQWdBVUVCY1EwQUlBRkJBM0ZGRFFFZ0FpQUNLQUlBSWdGcklnSkJtQjhvQWdCSkRRRWdBQ0FCYWlFQUFrQUNRRUdjSHlnQ0FDQUNSd1JBSUFGQi93Rk5CRUFnQVVFRGRpRUVJQUlvQWd3aUFTQUNLQUlJSWdOR0JFQkJpQjlCaUI4b0FnQkJmaUFFZDNFMkFnQU1CUXNnQXlBQk5nSU1JQUVnQXpZQ0NBd0VDeUFDS0FJWUlRWWdBaUFDS0FJTUlnRkhCRUFnQWlnQ0NDSURJQUUyQWd3Z0FTQUROZ0lJREFNTElBSkJGR29pQkNnQ0FDSURSUVJBSUFJb0FoQWlBMFVOQWlBQ1FSQnFJUVFMQTBBZ0JDRUhJQU1pQVVFVWFpSUVLQUlBSWdNTkFDQUJRUkJxSVFRZ0FTZ0NFQ0lERFFBTElBZEJBRFlDQUF3Q0N5QUZLQUlFSWdGQkEzRkJBMGNOQWtHUUh5QUFOZ0lBSUFVZ0FVRitjVFlDQkNBQ0lBQkJBWEkyQWdRZ0JTQUFOZ0lBRHd0QkFDRUJDeUFHUlEwQUFrQWdBaWdDSENJRFFRSjBRYmdoYWlJRUtBSUFJQUpHQkVBZ0JDQUJOZ0lBSUFFTkFVR01IMEdNSHlnQ0FFRitJQU4zY1RZQ0FBd0NDeUFHUVJCQkZDQUdLQUlRSUFKR0cyb2dBVFlDQUNBQlJRMEJDeUFCSUFZMkFoZ2dBaWdDRUNJREJFQWdBU0FETmdJUUlBTWdBVFlDR0FzZ0FpZ0NGQ0lEUlEwQUlBRWdBellDRkNBRElBRTJBaGdMSUFJZ0JVOE5BQ0FGS0FJRUlnRkJBWEZGRFFBQ1FBSkFBa0FDUUNBQlFRSnhSUVJBUWFBZktBSUFJQVZHQkVCQm9COGdBallDQUVHVUgwR1VIeWdDQUNBQWFpSUFOZ0lBSUFJZ0FFRUJjallDQkNBQ1Fad2ZLQUlBUncwR1FaQWZRUUEyQWdCQm5COUJBRFlDQUE4TFFad2ZLQUlBSUFWR0JFQkJuQjhnQWpZQ0FFR1FIMEdRSHlnQ0FDQUFhaUlBTmdJQUlBSWdBRUVCY2pZQ0JDQUFJQUpxSUFBMkFnQVBDeUFCUVhoeElBQnFJUUFnQVVIL0FVMEVRQ0FCUVFOMklRUWdCU2dDRENJQklBVW9BZ2dpQTBZRVFFR0lIMEdJSHlnQ0FFRitJQVIzY1RZQ0FBd0ZDeUFESUFFMkFnd2dBU0FETmdJSURBUUxJQVVvQWhnaEJpQUZJQVVvQWd3aUFVY0VRRUdZSHlnQ0FCb2dCU2dDQ0NJRElBRTJBZ3dnQVNBRE5nSUlEQU1MSUFWQkZHb2lCQ2dDQUNJRFJRUkFJQVVvQWhBaUEwVU5BaUFGUVJCcUlRUUxBMEFnQkNFSElBTWlBVUVVYWlJRUtBSUFJZ01OQUNBQlFSQnFJUVFnQVNnQ0VDSUREUUFMSUFkQkFEWUNBQXdDQ3lBRklBRkJmbkUyQWdRZ0FpQUFRUUZ5TmdJRUlBQWdBbW9nQURZQ0FBd0RDMEVBSVFFTElBWkZEUUFDUUNBRktBSWNJZ05CQW5SQnVDRnFJZ1FvQWdBZ0JVWUVRQ0FFSUFFMkFnQWdBUTBCUVl3ZlFZd2ZLQUlBUVg0Z0EzZHhOZ0lBREFJTElBWkJFRUVVSUFZb0FoQWdCVVliYWlBQk5nSUFJQUZGRFFFTElBRWdCallDR0NBRktBSVFJZ01FUUNBQklBTTJBaEFnQXlBQk5nSVlDeUFGS0FJVUlnTkZEUUFnQVNBRE5nSVVJQU1nQVRZQ0dBc2dBaUFBUVFGeU5nSUVJQUFnQW1vZ0FEWUNBQ0FDUVp3ZktBSUFSdzBBUVpBZklBQTJBZ0FQQ3lBQVFmOEJUUVJBSUFCQmVIRkJzQjlxSVFFQ2YwR0lIeWdDQUNJRFFRRWdBRUVEZG5RaUFIRkZCRUJCaUI4Z0FDQURjallDQUNBQkRBRUxJQUVvQWdnTElRQWdBU0FDTmdJSUlBQWdBallDRENBQ0lBRTJBZ3dnQWlBQU5nSUlEd3RCSHlFRElBQkIvLy8vQjAwRVFDQUFRU1lnQUVFSWRtY2lBV3QyUVFGeElBRkJBWFJyUVQ1cUlRTUxJQUlnQXpZQ0hDQUNRZ0EzQWhBZ0EwRUNkRUc0SVdvaEFRSkFBa0FDUUVHTUh5Z0NBQ0lFUVFFZ0EzUWlCM0ZGQkVCQmpCOGdCQ0FIY2pZQ0FDQUJJQUkyQWdBZ0FpQUJOZ0lZREFFTElBQkJHU0FEUVFGMmEwRUFJQU5CSDBjYmRDRURJQUVvQWdBaEFRTkFJQUVpQkNnQ0JFRjRjU0FBUmcwQ0lBTkJIWFloQVNBRFFRRjBJUU1nQkNBQlFRUnhhaUlIUVJCcUtBSUFJZ0VOQUFzZ0J5QUNOZ0lRSUFJZ0JEWUNHQXNnQWlBQ05nSU1JQUlnQWpZQ0NBd0JDeUFFS0FJSUlnQWdBallDRENBRUlBSTJBZ2dnQWtFQU5nSVlJQUlnQkRZQ0RDQUNJQUEyQWdnTFFhZ2ZRYWdmS0FJQVFRRnJJZ0JCZnlBQUd6WUNBQXNMQkFBakFBc0dBQ0FBSkFBTEVBQWpBQ0FBYTBGd2NTSUFKQUFnQUF0S0FRRi9JQUFnQVVrRVFDQUFJQUVnQWhBQ0R3c2dBZ1JBSUFBZ0Ftb2hBeUFCSUFKcUlRRURRQ0FEUVFGcklnTWdBVUVCYXlJQkxRQUFPZ0FBSUFKQkFXc2lBZzBBQ3dzZ0FBdjlEZ0lSZndGK0l3QkJNR3NpQnlRQVFiaC9JUWdDUUNBRlJRMEFJQVFzQUFBaUNVSC9BWEVoQ3dKQUlBbEJBRWdFUUNBTFFmNEFhMEVCZGlJR0lBVlBEUUpCYkNFSUlBdEIvd0JySWd0Qi93RkxEUUlnQkVFQmFpRUlRUUFoQlFOQUlBVWdDMDhFUUNBTElRZ2dCaUVMREFNRklBQWdCV29nQ0NBRlFRRjJhaUlFTFFBQVFRUjJPZ0FBSUFBZ0JVRUJjbW9nQkMwQUFFRVBjVG9BQUNBRlFRSnFJUVVNQVFzQUN3QUxJQVVnQzAwTkFTQUhRZjhCTmdJRUlBWWdCMEVFYWlBSFFRaHFJQVJCQVdvaURpQUxFQXdpQkVHSWYwc0VRQ0FFSVFnTUFndEJWQ0VJSUFjb0FnZ2lFRUVHU3cwQklBY29BZ1FpRVVFQmRDSUpRUUpxclVJQklCQ3RoaUlZUVFFZ0VIUWlEVUVCYWlJRnJVSUNobng4UWd0OFF2ei8vLy8vLy8vLy93Q0RRdVFDVmcwQlFWSWhDQ0FSUWY4QlN3MEJJQTFCZjNOQkFuUkI1QUpxclNBUlFRRnFJaFZCQVhTdElCaDhRZ2g4VkEwQklBc2dCR3NoRmlBRUlBNXFJUmNnQmtHQUJHb2lFaUFGUVFKMGFpSVJJQWxxUVFKcUlRNGdCa0dFQkdvaEUwR0FnQUlnRUhSQkVIWWhDVUVBSVFWQkFTRVBJQTFCQVdzaUZDRUtBMEFnQlNBVlJrVUVRQUpBSUFZZ0JVRUJkQ0lJYWk4QkFDSUVRZi8vQTBZRVFDQVRJQXBCQW5ScUlBVTZBQUlnQ2tFQmF5RUtRUUVoQkF3QkN5QVBRUUFnQ1NBRXdVb2JJUThMSUFnZ0VXb2dCRHNCQUNBRlFRRnFJUVVNQVFzTElBWWdEenNCZ2dRZ0JpQVFPd0dBQkFKQUlBb2dGRVlFUUNBTlFRTjJJUWhDQUNFWVFRQWhEd05BSUF3Z0ZVWUVRQ0FJSUExQkFYWnFRUU5xSWdsQkFYUWhDRUVBSVFSQkFDRUtBMEJCQUNFRklBb2dEVThOQkFOQUlBVkJBa1pGQkVBZ0V5QUZJQWxzSUFScUlCUnhRUUowYWlBT0lBVWdDbXBxTFFBQU9nQUNJQVZCQVdvaEJRd0JDd3NnQ2tFQ2FpRUtJQVFnQ0dvZ0ZIRWhCQXdBQ3dBRklBWWdERUVCZEdvdUFRQWhDU0FPSUE5cUlnUWdHRGNBQUVFSUlRVURRQ0FGSUFsT1JRUkFJQVFnQldvZ0dEY0FBQ0FGUVFocUlRVU1BUXNMSUJoQ2dZS0VpSkNnd0lBQmZDRVlJQXhCQVdvaERDQUpJQTlxSVE4TUFRc0FDd0FMSUExQkEzWWdEVUVCZG1wQkEyb2hDRUVBSVFVRFFDQU1JQlZHUlFSQVFRQWhDU0FHSUF4QkFYUnFMZ0VBSWdSQkFDQUVRUUJLR3lFRUEwQWdCQ0FKUmtVRVFDQVRJQVZCQW5ScUlBdzZBQUlEUUNBRklBaHFJQlJ4SWdVZ0Nrc05BQXNnQ1VFQmFpRUpEQUVMQ3lBTVFRRnFJUXdNQVFzTFFYOGhDQ0FGRFFJTElCQkJBV29oQ0VFQUlRVURRQ0FGSUExR1JRUkFJQkVnRXlBRlFRSjBhaUlPTFFBQ1FRRjBhaUlFSUFRdkFRQWlDVUVCYWpzQkFDQU9JQWdnQ1dkQllITnFJZ1E2QUFNZ0RpQUpJQVIwSUExck93RUFJQVZCQVdvaEJRd0JDd3NDUUFKQUlBWXZBWUlFQkVBZ0IwRWNhaUlFSUJjZ0ZoQU5JZ2hCaUg5TERRSWdCMEVVYWlBRUlCSVFEaUFIUVF4cUlBUWdFaEFPUVFBaEJRTkFJQWRCSEdvaUJCQVBJQVZCK3dGTGNnMENJQUFnQldvaUJpQUhRUlJxSUFRUUVEb0FBQ0FHSUFkQkRHb2dCQkFRT2dBQklBVkJBbkloQkNBSFFSeHFFQThFUUNBRUlRVU1Bd1VnQUNBRWFpQUhRUlJxSUFkQkhHb2lCQkFRT2dBQUlBWWdCMEVNYWlBRUVCQTZBQU1nQlVFRWFpRUZEQUVMQUFzQUN5QUhRUnhxSWdRZ0Z5QVdFQTBpQ0VHSWYwc05BU0FIUVJScUlBUWdFaEFPSUFkQkRHb2dCQ0FTRUE1QkFDRUZBMEFnQjBFY2FpSUVFQThnQlVIN0FVdHlSUVJBSUFBZ0JXb2lCaUFIUVJScUlBUVFFVG9BQUNBR0lBZEJER29nQkJBUk9nQUJJQVZCQW5JaEJDQUhRUnhxRUE4RVFDQUVJUVVGSUFBZ0JHb2dCMEVVYWlBSFFSeHFJZ1FRRVRvQUFDQUdJQWRCREdvZ0JCQVJPZ0FESUFWQkJHb2hCUXdDQ3dzTEFuOERRRUc2ZnlFSUlBVkIvUUZMRFFNZ0FDQUZhaUlHSUFkQkZHb2dCMEVjYWlJSkVCRTZBQUFnQmtFQmFpRUVJQWtRRDBFRFJnUkFJQWRCREdvaENFRUNEQUlMSUFWQi9BRkxEUU1nQmlBSFFReHFJQWRCSEdvaUJCQVJPZ0FCSUFWQkFtb2hCU0FFRUE5QkEwY05BQXNnQUNBRmFpRUVJQWRCRkdvaENFRURDeUFFSUFnZ0IwRWNhaEFST2dBQUlBWnFJQUJySVFnTUFRc0Nmd05BUWJwL0lRZ2dCVUg5QVVzTkFpQUFJQVZxSWdZZ0IwRVVhaUFIUVJ4cUlna1FFRG9BQUNBR1FRRnFJUVFnQ1JBUFFRTkdCRUFnQjBFTWFpRUlRUUlNQWdzZ0JVSDhBVXNOQWlBR0lBZEJER29nQjBFY2FpSUVFQkE2QUFFZ0JVRUNhaUVGSUFRUUQwRURSdzBBQ3lBQUlBVnFJUVFnQjBFVWFpRUlRUU1MSUFRZ0NDQUhRUnhxRUJBNkFBQWdCbW9nQUdzaENBc2dDRUdJZjBzTkFRc2dDQ0VFUVFBaEJTQUJRUUJCTkJBRElRbEJBQ0VLQTBBZ0JDQUZSd1JBSUFBZ0JXb2lCaTBBQUNJQlFRdExCRUJCYkNFSURBTUZJQWtnQVVFQ2RHb2lBU0FCS0FJQVFRRnFOZ0lBSUFWQkFXb2hCVUVCSUFZdEFBQjBRUUYxSUFwcUlRb01BZ3NBQ3d0QmJDRUlJQXBGRFFBZ0NtY2lCVUVmY3lJQlFRdExEUUFnQTBFZ0lBVnJOZ0lBUVFGQkFpQUJkQ0FLYXlJRFowRWZjeUlCZENBRFJ3MEFJQUFnQkdvZ0FVRUJhaUlBT2dBQUlBa2dBRUVDZEdvaUFDQUFLQUlBUVFGcU5nSUFJQWtvQWdRaUFFRUNTU0FBUVFGeGNnMEFJQUlnQkVFQmFqWUNBQ0FMUVFGcUlRZ0xJQWRCTUdva0FDQUlDNkFGQVF4L0l3QkJFR3NpRENRQUFuOGdCRUVIVFFSQUlBeENBRGNEQ0NBTVFRaHFJZ1VnQXlBRUVBSWFRV3dnQUNBQklBSWdCVUVJRUF3aUFDQUFJQVJMR3lBQUlBQkJpWDlKR3d3QkN5QUFRUUFnQVNnQ0FFRUJhaUlOUVFGMEVBTWhEMEZVSUFNb0FBQWlCa0VQY1NJQVFRcExEUUFhSUFJZ0FFRUZhallDQUNBRElBUnFJZ0pCQkdzaEJ5QUNRUWRySVFzZ0FFRUdhaUVPUVFRaEFpQUdRUVIySVFWQklDQUFkQ0lJUVFGeUlRbEJBQ0VBUVFFaEJpQURJUVFEUUFKQUlBWkJBWEZGQkVBRFFDQUZRWDl6UVlDQWdJQjRjbWdpQmtFWVNVVUVRQ0FBUVNScUlRQWdCQ0FMVFFSL0lBUkJBMm9GSUFRZ0MydEJBM1FnQW1wQkgzRWhBaUFIQ3lJRUtBQUFJQUoySVFVTUFRc0xJQUlnQmtFZWNTSUtha0VDYWlFQ0lBWkJBWFpCQTJ3Z0FHb2dCU0FLZGtFRGNXb2lBQ0FOVHcwQkFuOGdCQ0FMU3lBQ1FRTjJJQVJxSWdVZ0IwdHhSUVJBSUFKQkIzRWhBaUFGREFFTElBUWdCMnRCQTNRZ0FtcEJIM0VoQWlBSEN5SUVLQUFBSUFKMklRVUxJQVVnQ0VFQmEzRWlCaUFJUVFGMFFRRnJJZ29nQ1dzaUVFa0VmeUFPUVFGckJTQUZJQXB4SWdVZ0VFRUFJQVVnQ0U0YmF5RUdJQTRMSVFVZ0R5QUFRUUYwYWlBR1FRRnJJZ283QVFBZ0FFRUJhaUVBSUFJZ0JXb2hBaUFJUVFFZ0Jtc2dDaUFHUVFCS0d5QUphaUlKU2dSQUlBbEJBa2dOQVVFZ0lBbG5JZ1ZySVE1QkFTQUZRUjl6ZENFSUN5QUFJQTFQRFFBZ0NrRUFSeUVHQW44Z0JDQUxTeUFDUVFOMUlBUnFJZ1VnQjB0eFJRUkFJQUpCQjNFaEFpQUZEQUVMSUFJZ0JDQUhhMEVEZEdwQkgzRWhBaUFIQ3lJRUtBQUFJQUoySVFVTUFRc0xRV3dnQ1VFQlJ3MEFHa0ZRSUFBZ0RVc05BQnBCYkNBQ1FTQktEUUFhSUFFZ0FFRUJhellDQUNBRUlBSkJCMnBCQTNWcUlBTnJDeUFNUVJCcUpBQUw4Z0VCQVg4Z0FrVUVRQ0FBUWdBM0FnQWdBRUVBTmdJUUlBQkNBRGNDQ0VHNGZ3OExJQUFnQVRZQ0RDQUFJQUZCQkdvMkFoQWdBa0VFVHdSQUlBQWdBU0FDYWlJQlFRUnJJZ00yQWdnZ0FDQURLQUFBTmdJQUlBRkJBV3N0QUFBaUFRUkFJQUFnQVdkQkYyczJBZ1FnQWc4TElBQkJBRFlDQkVGL0R3c2dBQ0FCTmdJSUlBQWdBUzBBQUNJRE5nSUFBa0FDUUFKQUlBSkJBbXNPQWdFQUFnc2dBQ0FCTFFBQ1FSQjBJQU55SWdNMkFnQUxJQUFnQVMwQUFVRUlkQ0FEYWpZQ0FBc2dBU0FDYWtFQmF5MEFBQ0lCUlFSQUlBQkJBRFlDQkVGc0R3c2dBQ0FCWnlBQ1FRTjBhMEVKYWpZQ0JDQUNDMFFCQW44Z0FTQUNMd0VBSWdNZ0FTZ0NCR29pQkRZQ0JDQUFJQU5CQW5SQm9CMXFLQUlBSUFFb0FnQkJBQ0FFYTNaeE5nSUFJQUVRRHhvZ0FDQUNRUVJxTmdJRUM1OEJBUVIvUVFNaEFTQUFLQUlFSWdKQklFMEVRQ0FBS0FJSUlnRWdBQ2dDRUU4RVFDQUFJQUpCQjNFMkFnUWdBQ0FCSUFKQkEzWnJJZ0kyQWdnZ0FDQUNLQUFBTmdJQVFRQVBDeUFBS0FJTUlnTWdBVVlFUUVFQlFRSWdBa0VnU1JzUEN5QUFJQUVnQVNBRGF5QUNRUU4ySWdRZ0FTQUVheUFEU1NJQkd5SURheUlFTmdJSUlBQWdBaUFEUVFOMGF6WUNCQ0FBSUFRb0FBQTJBZ0FMSUFFTFNBRUVmeUFBS0FJRUlBQW9BZ0JCQW5ScUlnSXRBQUlnQWk4QkFDRUVJQUVnQVNnQ0JDSUZJQUl0QUFNaUFtbzJBZ1FnQUNBRUlBRW9BZ0FnQlhSQkFDQUNhM1pxTmdJQUMxSUJCSDhnQUNnQ0JDQUFLQUlBUVFKMGFpSUNMUUFDSUFJdkFRQWhCQ0FCSUFJdEFBTWlBaUFCS0FJRWFpSUZOZ0lFSUFBZ0JDQUNRUUowUWFBZGFpZ0NBQ0FCS0FJQVFRQWdCV3QyY1dvMkFnQUxDQUFnQUVHSWYwc0xHZ0FnQUFSQUlBRUVRQ0FDSUFBZ0FSRUNBQThMSUFBUUJnc0xwZ2dDRFg4QmZpTUFRUkJySWdra0FDQUpRUUEyQWd3Z0NVRUFOZ0lJQW44Q1FDQURRZWdKYWlBRElBbEJDR29nQ1VFTWFpQUJJQUlnQTBHQUFXb1FDeUlQUVloL1N3MEFRVlFnQ1NnQ0RDSUVJQUFvQWdBaUFVSC9BWEZCQVdwTERRRWFJQUJCQkdvaEN5QUFJQUZCLzRHQWVIRWdCRUVRZEVHQWdQd0hjWEkyQWdCQmZ5QUVJQVJCQUVnYlFRRnFJUUJCQUNFQklBa29BZ2doQlVFQUlRSURRQ0FBSUFKR0JFQWdCVUVEYXlFQlFRQWhBQU5BQWtCQkFDRUNJQUFnQVU0RVFBTkFJQUFnQlU0TkFpQURJQUFnQTJwQjZBbHFMUUFBUVFKMGFrRkFheUlCSUFFb0FnQWlBVUVCYWpZQ0FDQUJJQU5xSUFBNkFPZ0hJQUJCQVdvaEFBd0FDd0FGQTBBZ0FrRUVSa1VFUUNBRElBTWdBQ0FDYWlJSGFrSG9DV290QUFCQkFuUnFRVUJySWdnZ0NDZ0NBQ0lJUVFGcU5nSUFJQU1nQ0dvZ0J6b0E2QWNnQWtFQmFpRUNEQUVMQ3lBQVFRUnFJUUFNQWdzQUN3c2dCRUVCYWlFT0lBTW9BZ0FoQjBFQUlRQkJBU0VJQTBBZ0NDQU9SZzBESUE0Z0NHc2hCQ0FESUFoQkFuUnFLQUlBSVFVQ1FBSkFBa0FDUUFKQUFrQkJBU0FJZEVFQmRTSU5RUUZyRGdnQUFRUUNCQVFFQXdRTFFRQWhBaUFGUVFBZ0JVRUFTaHNoQmlBQUlRRURRQ0FDSUFaR0RRVWdBeUFDSUFkcWFpMEE2QWNoQ2lBTElBRkJBWFJxSWd3Z0JEb0FBU0FNSUFvNkFBQWdBa0VCYWlFQ0lBRkJBV29oQVF3QUN3QUxRUUFoQWlBRlFRQWdCVUVBU2hzaENpQUFJUUVEUUNBQ0lBcEdEUVFnQ3lBQlFRRjBhaUlHSUFNZ0FpQUhhbW90QU9nSElndzZBQUlnQmlBRU9nQUJJQVlnRERvQUFDQUdJQVE2QUFNZ0FrRUJhaUVDSUFGQkFtb2hBUXdBQ3dBTFFRQWhBaUFGUVFBZ0JVRUFTaHNoQmlBRVFRaDBRWUQrQTNFaEJDQUFJUUVEUUNBQ0lBWkdEUU1nQ3lBQlFRRjBhaUFFSUFNZ0FpQUhhbW90QU9nSGNxMUNnWUNFZ0pDQXdBQitOd0FBSUFKQkFXb2hBaUFCUVFScUlRRU1BQXNBQzBFQUlRSWdCVUVBSUFWQkFFb2JJUVlnQkVFSWRFR0EvZ054SVFRZ0FDRUJBMEFnQWlBR1JnMENJQXNnQVVFQmRHb2lDaUFFSUFNZ0FpQUhhbW90QU9nSGNxMUNnWUNFZ0pDQXdBQitJaEUzQUFnZ0NpQVJOd0FBSUFKQkFXb2hBaUFCUVFocUlRRU1BQXNBQzBFQUlRRWdCVUVBSUFWQkFFb2JJUW9nQkVFSWRFR0EvZ054SVF3Z0FDRUVBMEFnQVNBS1JnMEJJQXNnQkVFQmRHb2hFQ0FNSUFNZ0FTQUhhbW90QU9nSGNxMUNnWUNFZ0pDQXdBQitJUkZCQUNFQ0EwQWdBaUFOVGtVRVFDQVFJQUpCQVhScUlnWWdFVGNBR0NBR0lCRTNBQkFnQmlBUk53QUlJQVlnRVRjQUFDQUNRUkJxSVFJTUFRc0xJQUZCQVdvaEFTQUVJQTFxSVFRTUFBc0FDeUFJUVFGcUlRZ2dCU0FIYWlFSElBVWdEV3dnQUdvaEFBd0FDd0FGSUFNZ0FrRUNkR29pQjBGQWF5QUJOZ0lBSUFKQkFXb2hBaUFIS0FJQUlBRnFJUUVNQVFzQUN3QUxJQThMSUFsQkVHb2tBQXZ5QWdFR2Z5TUFRU0JySWdVa0FDQUVLQUlBSVFZZ0JVRU1haUFDSUFNUURTSURRWWgvVFFSQUlBUkJCR29oQWlBQUlBRnFJZ2xCQTJzaEJFRUFJQVpCRUhaclFSOXhJUU1EUUNBRlFReHFFQThnQUNBRVQzSkZCRUFnQWlBRktBSU1JZ1lnQlNnQ0VDSUhkQ0FEZGtFQmRHb2lDQzBBQVNFS0lBQWdDQzBBQURvQUFDQUNJQVlnQnlBS2FpSUdkQ0FEZGtFQmRHb2lCeTBBQUNFSUlBVWdCaUFITFFBQmFqWUNFQ0FBSUFnNkFBRWdBRUVDYWlFQURBRUxDd05BSUFWQkRHb1FEeUVISUFVb0Fnd2hCaUFGS0FJUUlRUWdBQ0FKVHlBSGNrVUVRQ0FDSUFZZ0JIUWdBM1pCQVhScUlnWXRBQUFoQnlBRklBUWdCaTBBQVdvMkFoQWdBQ0FIT2dBQUlBQkJBV29oQUF3QkN3c0RRQ0FBSUFsUFJRUkFJQUlnQmlBRWRDQURka0VCZEdvaUJ5MEFBU0VJSUFBZ0J5MEFBRG9BQUNBQVFRRnFJUUFnQkNBSWFpRUVEQUVMQzBGc1FXd2dBU0FGS0FJVUlBVW9BaGhIR3lBRVFTQkhHeUVEQ3lBRlFTQnFKQUFnQXd2UEZBRWpmeU1BUWRBQWF5SUZKQUJCYkNFSkFrQWdBMEVLU1EwQUFrQWdBeUFDTHdBRUlnY2dBaThBQUNJSUlBSXZBQUlpRFdwcVFRWnFJZ3hKRFFBZ0JDOEJBaUVHSUFWQlBHb2dBa0VHYWlJQ0lBZ1FEU0lKUVloL1N3MEJJQVZCS0dvZ0FpQUlhaUlDSUEwUURTSUpRWWgvU3cwQklBVkJGR29nQWlBTmFpSUNJQWNRRFNJSlFZaC9TdzBCSUFVZ0FpQUhhaUFESUF4ckVBMGlDVUdJZjBzTkFTQUVRUVJxSVFvZ0FDQUJhaUlmUVFOcklTQkJBQ0FHYTBFZmNTRUxJQVVvQWdnaEVTQUZLQUljSVJJZ0JTZ0NNQ0VUSUFVb0FrUWhGQ0FGS0FJRUlRa2dCU2dDR0NFTklBVW9BaXdoRENBRktBSkFJUVlnQlNnQ0VDRWhJQVVvQWlRaElpQUZLQUk0SVNNZ0JTZ0NUQ0VrSUFVb0FnQWhGU0FGS0FJVUlSWWdCU2dDS0NFWElBVW9BandoR0VFQklROGdBQ0FCUVFOcVFRSjJJZ1JxSWdNZ0JHb2lBaUFFYWlJWklRUWdBaUVJSUFNaEJ3TkFJQTlCQVhGRklBUWdJRTl5UlFSQUlBQWdDaUFZSUFaMElBdDJRUUowYWlJT0x3RUFPd0FBSUE0dEFBSWhHaUFPTFFBRElSQWdCeUFLSUJjZ0RIUWdDM1pCQW5ScUlnNHZBUUE3QUFBZ0RpMEFBaUViSUE0dEFBTWhEeUFJSUFvZ0ZpQU5kQ0FMZGtFQ2RHb2lEaThCQURzQUFDQU9MUUFDSVJ3Z0RpMEFBeUVkSUFRZ0NpQVZJQWwwSUF0MlFRSjBhaUlPTHdFQU93QUFJQTR0QUFJaEhpQU9MUUFESVE0Z0FDQVFhaUlsSUFvZ0dDQUdJQnBxSWdaMElBdDJRUUowYWlJUUx3RUFPd0FBSUJBdEFBSWdFQzBBQXlFbUlBY2dEMm9pSnlBS0lCY2dEQ0FiYWlJYWRDQUxka0VDZEdvaUJ5OEJBRHNBQUNBSExRQUNJUXdnQnkwQUF5RVFJQWdnSFdvaUd5QUtJQllnRFNBY2FpSVBkQ0FMZGtFQ2RHb2lDQzhCQURzQUFDQUlMUUFDSVEwZ0NDMEFBeUVjSUFRZ0Rtb2lIU0FLSUJVZ0NTQWVhaUlPZENBTGRrRUNkR29pQ1M4QkFEc0FBQ0FHYWlFQVFRTWhCd0ovSUJRZ0pFa0VRQ0FBSVFaQkF3d0JDeUFBUVFkeElRWWdGQ0FBUVFOMmF5SVVLQUFBSVJoQkFBc2dDUzBBQXlFZUlBa3RBQUloQ0NBTUlCcHFJUUFnRXlBalNRUi9JQUFGSUJNZ0FFRURkbXNpRXlnQUFDRVhRUUFoQnlBQVFRZHhDeUVNSUEwZ0Qyb2hBQ0FIY2lFSlFRTWhEd0ovSUJJZ0lra0VRQ0FBSVExQkF3d0JDeUFBUVFkeElRMGdFaUFBUVFOMmF5SVNLQUFBSVJaQkFBc2dDQ0FPYWlFQUlBbHlJQkVnSVVrRWZ5QUFCU0FSSUFCQkEzWnJJaEVvQUFBaEZVRUFJUThnQUVFSGNRc2hDU0FsSUNacUlRQWdFQ0FuYWlFSElCc2dIR29oQ0NBZElCNXFJUVFnRDNKRklROE1BUXNMSUFVZ0REWUNMQ0FGSUFZMkFrQWdCU0FOTmdJWUlBVWdDVFlDQkNBRklCUTJBa1FnQlNBVE5nSXdJQVVnRWpZQ0hDQUZJQkUyQWdnZ0JTQVlOZ0k4SUFVZ0Z6WUNLQ0FGSUJZMkFoUWdCU0FWTmdJQUlBSWdCMGtnQUNBRFMzSU5BRUZzSVFrZ0NDQVpTdzBCSUFOQkEyc2hDUU5BSUFWQlBHb1FEMFVnQUNBSlNYRUVRQ0FBSUFvZ0JTZ0NQQ0lOSUFVb0FrQWlESFFnQzNaQkFuUnFJZzR2QVFBN0FBQWdBQ0FPTFFBRGFpSUdJQW9nRFNBTUlBNHRBQUpxSWdCMElBdDJRUUowYWlJTUx3RUFPd0FBSUFVZ0FDQU1MUUFDYWpZQ1FDQUdJQXd0QUFOcUlRQU1BUVVnQTBFQ2F5RU1BMEFnQlVFOGFoQVBJUVlnQlNnQ1BDRU5JQVVvQWtBaENTQUFJQXhMSUFaeVJRUkFJQUFnQ2lBTklBbDBJQXQyUVFKMGFpSUdMd0VBT3dBQUlBVWdDU0FHTFFBQ2FqWUNRQ0FBSUFZdEFBTnFJUUFNQVFzTEEwQWdBQ0FNUzBVRVFDQUFJQW9nRFNBSmRDQUxka0VDZEdvaUJpOEJBRHNBQUNBQUlBWXRBQU5xSVFBZ0NTQUdMUUFDYWlFSkRBRUxDd0pBSUFBZ0EwOE5BQ0FBSUFvZ0RTQUpkQ0FMZGlJQVFRSjBhaUlETFFBQU9nQUFJQU10QUFOQkFVWUVRQ0FKSUFNdEFBSnFJUWtNQVFzZ0NVRWZTdzBBUVNBZ0NTQUtJQUJCQW5ScUxRQUNhaUlBSUFCQklFOGJJUWtMSUFKQkEyc2hEQU5BSUFWQktHb1FEMFVnQnlBTVNYRUVRQ0FISUFvZ0JTZ0NLQ0lHSUFVb0Fpd2lBSFFnQzNaQkFuUnFJZzB2QVFBN0FBQWdCeUFOTFFBRGFpSURJQW9nQmlBQUlBMHRBQUpxSWdCMElBdDJRUUowYWlJR0x3RUFPd0FBSUFVZ0FDQUdMUUFDYWpZQ0xDQURJQVl0QUFOcUlRY01BUVVnQWtFQ2F5RUdBMEFnQlVFb2FoQVBJUU1nQlNnQ0tDRU1JQVVvQWl3aEFDQUdJQWRKSUFOeVJRUkFJQWNnQ2lBTUlBQjBJQXQyUVFKMGFpSURMd0VBT3dBQUlBVWdBQ0FETFFBQ2FqWUNMQ0FISUFNdEFBTnFJUWNNQVFzTEEwQWdCaUFIU1VVRVFDQUhJQW9nRENBQWRDQUxka0VDZEdvaUF5OEJBRHNBQUNBSElBTXRBQU5xSVFjZ0FDQURMUUFDYWlFQURBRUxDd0pBSUFJZ0IwME5BQ0FISUFvZ0RDQUFkQ0FMZGlJQ1FRSjBhaUlETFFBQU9nQUFJQU10QUFOQkFVWUVRQ0FBSUFNdEFBSnFJUUFNQVFzZ0FFRWZTdzBBUVNBZ0FDQUtJQUpCQW5ScUxRQUNhaUlBSUFCQklFOGJJUUFMSUJsQkEyc2hEQU5BSUFWQkZHb1FEMFVnQ0NBTVNYRUVRQ0FJSUFvZ0JTZ0NGQ0lHSUFVb0FoZ2lBblFnQzNaQkFuUnFJZzB2QVFBN0FBQWdDQ0FOTFFBRGFpSURJQW9nQmlBQ0lBMHRBQUpxSWdKMElBdDJRUUowYWlJR0x3RUFPd0FBSUFVZ0FpQUdMUUFDYWpZQ0dDQURJQVl0QUFOcUlRZ01BUVVnR1VFQ2F5RURBMEFnQlVFVWFoQVBJUUlnQlNnQ0ZDRUdJQVVvQWhnaEJ5QURJQWhKSUFKeVJRUkFJQWdnQ2lBR0lBZDBJQXQyUVFKMGFpSUNMd0VBT3dBQUlBVWdCeUFDTFFBQ2FqWUNHQ0FJSUFJdEFBTnFJUWdNQVFzTEEwQWdBeUFJU1VVRVFDQUlJQW9nQmlBSGRDQUxka0VDZEdvaUFpOEJBRHNBQUNBSUlBSXRBQU5xSVFnZ0J5QUNMUUFDYWlFSERBRUxDd0pBSUFnZ0dVOE5BQ0FJSUFvZ0JpQUhkQ0FMZGlJQ1FRSjBhaUlETFFBQU9nQUFJQU10QUFOQkFVWUVRQ0FISUFNdEFBSnFJUWNNQVFzZ0IwRWZTdzBBUVNBZ0J5QUtJQUpCQW5ScUxRQUNhaUlDSUFKQklFOGJJUWNMQTBBZ0JSQVBSU0FFSUNCSmNRUkFJQVFnQ2lBRktBSUFJZ1lnQlNnQ0JDSUNkQ0FMZGtFQ2RHb2lEQzhCQURzQUFDQUVJQXd0QUFOcUlnTWdDaUFHSUFJZ0RDMEFBbW9pQW5RZ0MzWkJBblJxSWdRdkFRQTdBQUFnQlNBQ0lBUXRBQUpxTmdJRUlBTWdCQzBBQTJvaEJBd0JCU0FmUVFKcklRTURRQ0FGRUE4aEFpQUZLQUlBSVFZZ0JTZ0NCQ0VJSUFNZ0JFa2dBbkpGQkVBZ0JDQUtJQVlnQ0hRZ0MzWkJBblJxSWdJdkFRQTdBQUFnQlNBSUlBSXRBQUpxTmdJRUlBUWdBaTBBQTJvaEJBd0JDd3NEUUNBRElBUkpSUVJBSUFRZ0NpQUdJQWgwSUF0MlFRSjBhaUlDTHdFQU93QUFJQVFnQWkwQUEyb2hCQ0FJSUFJdEFBSnFJUWdNQVFzTEFrQWdCQ0FmVHcwQUlBUWdDaUFHSUFoMElBdDJJZ0pCQW5ScUlnTXRBQUE2QUFBZ0F5MEFBMEVCUmdSQUlBZ2dBeTBBQW1vaENBd0JDeUFJUVI5TERRQkJJQ0FJSUFvZ0FrRUNkR290QUFKcUlnSWdBa0VnVHhzaENBdEJiRUZzUVd4QmJFRnNRV3hCYkVGc0lBRWdDRUVnUnhzZ0JTZ0NDQ0FGS0FJTVJ4c2dCMEVnUnhzZ0JTZ0NIQ0FGS0FJZ1J4c2dBRUVnUnhzZ0JTZ0NNQ0FGS0FJMFJ4c2dDVUVnUnhzZ0JTZ0NSQ0FGS0FKSVJ4c2hDUXdKQ3dBTEFBc0FDd0FMQUFzQUN3QUxBQXRCYkNFSkN5QUZRZEFBYWlRQUlBa0w3QkFCSG44akFFSFFBR3NpQlNRQVFXd2hDUUpBSUFOQkNra05BQUpBSUFNZ0FpOEFCQ0lHSUFJdkFBQWlCeUFDTHdBQ0lnaHFha0VHYWlJT1NRMEFJQVF2QVFJaER5QUZRVHhxSUFKQkJtb2lBaUFIRUEwaUNVR0lmMHNOQVNBRlFTaHFJQUlnQjJvaUFpQUlFQTBpQ1VHSWYwc05BU0FGUVJScUlBSWdDR29pQWlBR0VBMGlDVUdJZjBzTkFTQUZJQUlnQm1vZ0F5QU9heEFOSWdsQmlIOUxEUUVnQkVFRWFpRUtJQUFnQVdvaUhFRURheUVkUVFBZ0QydEJIM0VoQ3lBRktBSUlJUkVnQlNnQ0hDRVNJQVVvQWpBaEV5QUZLQUpFSVJRZ0JTZ0NCQ0VKSUFVb0FoZ2hCaUFGS0FJc0lRY2dCU2dDUUNFSUlBVW9BaEFoSGlBRktBSWtJUjhnQlNnQ09DRWdJQVVvQWt3aElTQUZLQUlBSVJVZ0JTZ0NGQ0VXSUFVb0FpZ2hGeUFGS0FJOElSaEJBU0VOSUFBZ0FVRURha0VDZGlJQ2FpSU9JQUpxSWc4Z0Ftb2lHU0VFSUE4aEFpQU9JUU1EUUNBTlJTQUVJQjFQY2tVRVFDQUtJQmdnQ0hRZ0MzWkJBWFJxSWd3dEFBRWhEU0FBSUF3dEFBQTZBQUFnQ2lBWElBZDBJQXQyUVFGMGFpSU1MUUFCSVJBZ0F5QU1MUUFBT2dBQUlBb2dGaUFHZENBTGRrRUJkR29pREMwQUFTRWFJQUlnREMwQUFEb0FBQ0FLSUJVZ0NYUWdDM1pCQVhScUlnd3RBQUVoR3lBRUlBd3RBQUE2QUFBZ0NpQVlJQWdnRFdvaUNIUWdDM1pCQVhScUlnd3RBQUVoRFNBQUlBd3RBQUE2QUFFZ0NpQVhJQWNnRUdvaUIzUWdDM1pCQVhScUlnd3RBQUVoRUNBRElBd3RBQUE2QUFFZ0NpQVdJQVlnR21vaURIUWdDM1pCQVhScUlnWXRBQUVoR2lBQ0lBWXRBQUE2QUFFZ0NpQVZJQWtnRzJvaUczUWdDM1pCQVhScUlna3RBQUVoSWlBRUlBa3RBQUE2QUFFZ0NDQU5haUVHUVFNaENRSi9JQlFnSVVrRVFFRURJUTBnQmd3QkN5QVVJQVpCQTNackloUW9BQUFoR0VFQUlRMGdCa0VIY1FzaENDQUhJQkJxSVFZZ0V5QWdTUVIvSUFZRklCTWdCa0VEZG1zaUV5Z0FBQ0VYUVFBaENTQUdRUWR4Q3lFSElBd2dHbW9oRENBSklBMXlJUkJCQXlFTkFuOGdFaUFmU1FSQUlBd2hCa0VEREFFTElBeEJCM0VoQmlBU0lBeEJBM1pySWhJb0FBQWhGa0VBQ3lBYklDSnFJUXdnRUhJaEVDQVJJQjVKQkg4Z0RBVWdFU0FNUVFOMmF5SVJLQUFBSVJWQkFDRU5JQXhCQjNFTElRa2dCRUVDYWlFRUlBSkJBbW9oQWlBRFFRSnFJUU1nQUVFQ2FpRUFJQTBnRUhKRklRME1BUXNMSUFVZ0J6WUNMQ0FGSUFnMkFrQWdCU0FHTmdJWUlBVWdDVFlDQkNBRklCUTJBa1FnQlNBVE5nSXdJQVVnRWpZQ0hDQUZJQkUyQWdnZ0JTQVlOZ0k4SUFVZ0Z6WUNLQ0FGSUJZMkFoUWdCU0FWTmdJQUlBQWdEa3NnQXlBUFMzSU5BRUZzSVFrZ0FpQVpTdzBCSUE1QkEyc2hDUU5BSUFWQlBHb1FEeUFBSUFsUGNrVUVRQ0FLSUFVb0Fqd2lCaUFGS0FKQUlnZDBJQXQyUVFGMGFpSUlMUUFCSVF3Z0FDQUlMUUFBT2dBQUlBb2dCaUFISUF4cUlnWjBJQXQyUVFGMGFpSUhMUUFBSVFnZ0JTQUdJQWN0QUFGcU5nSkFJQUFnQ0RvQUFTQUFRUUpxSVFBTUFRc0xBMEFnQlVFOGFoQVBJUWNnQlNnQ1BDRUdJQVVvQWtBaENTQUFJQTVQSUFkeVJRUkFJQW9nQmlBSmRDQUxka0VCZEdvaUJpMEFBQ0VISUFVZ0NTQUdMUUFCYWpZQ1FDQUFJQWM2QUFBZ0FFRUJhaUVBREFFTEN3TkFJQUFnRGs5RkJFQWdDaUFHSUFsMElBdDJRUUYwYWlJSExRQUJJQUFnQnkwQUFEb0FBQ0FBUVFGcUlRQWdDV29oQ1F3QkN3c2dEMEVEYXlFQUEwQWdCVUVvYWhBUElBQWdBMDF5UlFSQUlBb2dCU2dDS0NJR0lBVW9BaXdpQjNRZ0MzWkJBWFJxSWdndEFBRWhEaUFESUFndEFBQTZBQUFnQ2lBR0lBY2dEbW9pQm5RZ0MzWkJBWFJxSWdjdEFBQWhDQ0FGSUFZZ0J5MEFBV28yQWl3Z0F5QUlPZ0FCSUFOQkFtb2hBd3dCQ3dzRFFDQUZRU2hxRUE4aEJ5QUZLQUlvSVFZZ0JTZ0NMQ0VBSUFNZ0QwOGdCM0pGQkVBZ0NpQUdJQUIwSUF0MlFRRjBhaUlHTFFBQUlRY2dCU0FBSUFZdEFBRnFOZ0lzSUFNZ0J6b0FBQ0FEUVFGcUlRTU1BUXNMQTBBZ0F5QVBUMFVFUUNBS0lBWWdBSFFnQzNaQkFYUnFJZ2N0QUFFaENDQURJQWN0QUFBNkFBQWdBMEVCYWlFRElBQWdDR29oQUF3QkN3c2dHVUVEYXlFREEwQWdCVUVVYWhBUElBSWdBMDl5UlFSQUlBb2dCU2dDRkNJR0lBVW9BaGdpQjNRZ0MzWkJBWFJxSWdndEFBRWhEaUFDSUFndEFBQTZBQUFnQ2lBR0lBY2dEbW9pQm5RZ0MzWkJBWFJxSWdjdEFBQWhDQ0FGSUFZZ0J5MEFBV28yQWhnZ0FpQUlPZ0FCSUFKQkFtb2hBZ3dCQ3dzRFFDQUZRUlJxRUE4aEJ5QUZLQUlVSVFZZ0JTZ0NHQ0VESUFJZ0dVOGdCM0pGQkVBZ0NpQUdJQU4wSUF0MlFRRjBhaUlHTFFBQUlRY2dCU0FESUFZdEFBRnFOZ0lZSUFJZ0J6b0FBQ0FDUVFGcUlRSU1BUXNMQTBBZ0FpQVpUMFVFUUNBS0lBWWdBM1FnQzNaQkFYUnFJZ2N0QUFFaENDQUNJQWN0QUFBNkFBQWdBa0VCYWlFQ0lBTWdDR29oQXd3QkN3c0RRQ0FGRUE4Z0JDQWRUM0pGQkVBZ0NpQUZLQUlBSWdJZ0JTZ0NCQ0lHZENBTGRrRUJkR29pQnkwQUFTRUlJQVFnQnkwQUFEb0FBQ0FLSUFJZ0JpQUlhaUlDZENBTGRrRUJkR29pQmkwQUFDRUhJQVVnQWlBR0xRQUJhallDQkNBRUlBYzZBQUVnQkVFQ2FpRUVEQUVMQ3dOQUlBVVFEeUVISUFVb0FnQWhCaUFGS0FJRUlRSWdCQ0FjVHlBSGNrVUVRQ0FLSUFZZ0FuUWdDM1pCQVhScUlnWXRBQUFoQnlBRklBSWdCaTBBQVdvMkFnUWdCQ0FIT2dBQUlBUkJBV29oQkF3QkN3c0RRQ0FFSUJ4UFJRUkFJQW9nQmlBQ2RDQUxka0VCZEdvaUJ5MEFBU0VJSUFRZ0J5MEFBRG9BQUNBRVFRRnFJUVFnQWlBSWFpRUNEQUVMQzBGc1FXeEJiRUZzUVd4QmJFRnNRV3dnQVNBQ1FTQkhHeUFGS0FJSUlBVW9BZ3hIR3lBRFFTQkhHeUFGS0FJY0lBVW9BaUJIR3lBQVFTQkhHeUFGS0FJd0lBVW9BalJIR3lBSlFTQkhHeUFGS0FKRUlBVW9Ba2hIR3lFSkRBRUxRV3doQ1FzZ0JVSFFBR29rQUNBSkMxZ0JBMzhDUUNBQUtBS1E2d0VpQVVVTkFDQUJLQUlBSUFGQnROVUJhaWdDQUNJQ0lBRkJ1TlVCYWlnQ0FDSURFQk1nQWdSQUlBTWdBU0FDRVFJQURBRUxJQUVRQmdzZ0FFRUFOZ0tnNndFZ0FFSUFOd09RNndFTDZRTUNCSDhDZmlBQVFRQkJLQkFESVFRZ0FrRUJRUVVnQXhzaUFFa0VRQ0FBRHdzZ0FVVUVRRUYvRHd0QkFTRUdBa0FDUUNBRFFRRkdEUUFnQXlFR0lBRW9BQUFpQlVHbzZyNXBSZzBBUVhZaEF5QUZRWEJ4UWREVXRNSUJSdzBCUVFnaEF5QUNRUWhKRFFFZ0FUVUFCQ0VJSUFSQkFUWUNGQ0FFSUFnM0F3QkJBQThMSUFFZ0FpQUdFQm9pQXlBQ1N3MEFJQVFnQXpZQ0dFRnlJUU1nQUNBQmFpSUZRUUZyTFFBQUlnSkJDSEVOQUNBQ1FTQnhJZ1pGQkVCQmNDRURJQVV0QUFBaUJVR25BVXNOQVNBRlFRZHhyVUlCSUFWQkEzWkJDbXF0aGlJSVFnT0lmaUFJZkNFSklBQkJBV29oQUFzZ0FrRUdkaUVGSUFKQkFuWkJBQ0VEQWtBQ1FBSkFBa0FnQWtFRGNVRUJhdzREQUFFQ0F3c2dBQ0FCYWkwQUFDRURJQUJCQVdvaEFBd0NDeUFBSUFGcUx3QUFJUU1nQUVFQ2FpRUFEQUVMSUFBZ0FXb29BQUFoQXlBQVFRUnFJUUFMUVFGeElRSUNmZ0pBQWtBQ1FBSkFJQVZCQVdzT0F3RUNBd0FMUW44Z0JrVU5BeG9nQUNBQmFqRUFBQXdEQ3lBQUlBRnFNd0FBUW9BQ2ZBd0NDeUFBSUFGcU5RQUFEQUVMSUFBZ0FXb3BBQUFMSVFnZ0JDQUNOZ0lnSUFRZ0F6WUNIQ0FFSUFnM0F3QkJBQ0VESUFSQkFEWUNGQ0FFSUFnZ0NTQUdHeUlJTndNSUlBUkNnSUFJSUFnZ0NFS0FnQWhhR3o0Q0VBc2dBd3RmQVFGL1FiaC9JUU1nQVVFQlFRVWdBaHNpQWs4RWZ5QUFJQUpxUVFGckxRQUFJZ0JCQTNGQkFuUkJvQjVxS0FJQUlBSnFJQUJCQkhaQkRIRkJzQjVxS0FJQWFpQUFRU0J4SWdGRmFpQUJRUVYySUFCQndBQkpjV29GUWJoL0N3c01BQ0FBSUFFZ0FrRUFFQmtMbHdNQ0JYOENmaU1BUVVCcUlnUWtBQUpBQTBBZ0FVRUZUd1JBQWtBZ0FDZ0FBRUZ3Y1VIUTFMVENBVVlFUUVKK0lRY2dBVUVJU1EwRUlBQW9BQVFpQWtGM1N3MEVJQUpCQ0dvaUF5QUJTdzBFSUFKQmdYOUpEUUVNQkFzZ0JFRVlhaUFBSUFFUUd5RUNRbjRnQkNrREdFSUFJQVFvQWl4QkFVY2JJQUliSWdkQ2ZWWU5BeUFISUFoOElnZ2dCMVJDZmlFSERRTUNRQUpBSUFGQkNFa05BQ0FBS0FBQVFYQnhRZERVdE1JQlJ3MEFJQUFvQUFRaUFrRjNTdzBGUWJoL0lBSkJDR29pQWlBQklBSkpHeUVEREFFTElBUkJHR29nQUNBQkVCc2lBa0dJZjBzRVFDQUNJUU1NQVF0QnVIOGhBeUFDRFFBZ0FTQUVLQUl3SWdKcklRVWdBQ0FDYWlFR0EwQWdCaUFGSUFSQkRHb1FIU0lEUVloL1N3MEJJQU5CQTJvaUFpQUZTd1JBUWJoL0lRTU1BZ3NnQlNBQ2F5RUZJQUlnQm1vaEJpQUVLQUlRUlEwQUN5QUVLQUk0Qkg5QnVIOGhBeUFGUVFSSkRRRWdCa0VFYWdVZ0Jnc2dBR3NoQXdzZ0EwR0lmMHNOQXdzZ0FTQURheUVCSUFBZ0Eyb2hBQXdCQ3d0Q2ZpQUlJQUViSVFjTElBUkJRR3NrQUNBSEMyUUJBWDlCdUg4aEF3SkFJQUZCQTBrTkFDQUFMUUFDSVFFZ0FpQUFMd0FBSWdCQkFYRTJBZ1FnQWlBQVFRRjJRUU54SWdNMkFnQWdBaUFBSUFGQkVIUnlRUU4ySWdBMkFnZ0NRQUpBSUFOQkFXc09Bd0lCQUFFTFFXd1BDeUFBSVFNTElBTUxSQUVDZnlBQklBSW9BZ1FpQXlBQktBSUVhaUlFTmdJRUlBQWdBMEVDZEVHZ0hXb29BZ0FnQVNnQ0FFRUFJQVJyZG5FMkFnQWdBUkFQR2lBQUlBSkJDR28yQWdRTHpnRUJCbjlCdW44aENnSkFJQUlvQWdRaUNDQUNLQUlBSWdscUlnMGdBU0FBYTBzTkFFRnNJUW9nQ1NBRUlBTW9BZ0FpQzJ0TERRQWdBQ0FKYWlJRUlBSW9BZ2dpREdzaEFpQUFJQUZCSUdzaUFDQUxJQWxCQUJBZ0lBTWdDU0FMYWpZQ0FBSkFBa0FnQkNBRmF5QU1Ud1JBSUFJaEJRd0JDeUFNSUFRZ0JtdExEUUlnQnlBSElBSWdCV3NpQW1vaUFTQUlhazhFUUNBRUlBRWdDQkFLR2d3Q0N5QUNJQWhxSVFnZ0JDQUJRUUFnQW1zUUNpQUNheUVFQ3lBRUlBQWdCU0FJUVFFUUlBc2dEU0VLQ3lBS0M4Y0VBUUovSUFBZ0Eyb2hCZ0pBSUFOQkIwd0VRQU5BSUFBZ0JrOE5BaUFBSUFJdEFBQTZBQUFnQUVFQmFpRUFJQUpCQVdvaEFnd0FDd0FMSUFSQkFVWUVRQUpBSUFBZ0Ftc2lCVUVIVFFSQUlBQWdBaTBBQURvQUFDQUFJQUl0QUFFNkFBRWdBQ0FDTFFBQ09nQUNJQUFnQWkwQUF6b0FBeUFBSUFJZ0JVRUNkQ0lGUWNBZWFpZ0NBR29pQWlnQUFEWUFCQ0FDSUFWQjRCNXFLQUlBYXlFQ0RBRUxJQUFnQWlrQUFEY0FBQXNnQWtFSWFpRUNJQUJCQ0dvaEFBc2dBU0FHVHdSQUlBQWdBMm9oQVNBRVFRRkhJQUFnQW10QkQwcHlSUVJBQTBBZ0FDQUNLUUFBTndBQUlBSkJDR29oQWlBQVFRaHFJZ0FnQVVrTkFBd0RDd0FMSUFBZ0Fpa0FBRGNBQUNBQUlBSXBBQWczQUFnZ0EwRVJTUTBCSUFCQkVHb2hBQU5BSUFBZ0Fpa0FFRGNBQUNBQUlBSXBBQmczQUFnZ0FDQUNLUUFnTndBUUlBQWdBaWtBS0RjQUdDQUNRU0JxSVFJZ0FFRWdhaUlBSUFGSkRRQUxEQUVMQWtBZ0FDQUJTd1JBSUFBaEFRd0JDeUFCSUFCcklRVUNRQ0FFUVFGSElBQWdBbXRCRDBweVJRUkFJQUloQXdOQUlBQWdBeWtBQURjQUFDQURRUWhxSVFNZ0FFRUlhaUlBSUFGSkRRQUxEQUVMSUFBZ0Fpa0FBRGNBQUNBQUlBSXBBQWczQUFnZ0JVRVJTQTBBSUFCQkVHb2hBQ0FDSVFNRFFDQUFJQU1wQUJBM0FBQWdBQ0FES1FBWU53QUlJQUFnQXlrQUlEY0FFQ0FBSUFNcEFDZzNBQmdnQTBFZ2FpRURJQUJCSUdvaUFDQUJTUTBBQ3dzZ0FpQUZhaUVDQ3dOQUlBRWdCazhOQVNBQklBSXRBQUE2QUFBZ0FVRUJhaUVCSUFKQkFXb2hBZ3dBQ3dBTEM2NEhBZ1YvQVg0akFFR0FBV3NpRVNRQUlCRWdBellDZkVGL0lROENRQUpBQWtBQ1FBSkFJQUlPQkFFQUF3SUVDeUFHUlFSQVFiaC9JUThNQkF0QmJDRVBJQVV0QUFBaUFpQURTdzBESUFnZ0FrRUNkQ0lDYWlnQ0FDRURJQUlnQjJvb0FnQWhBaUFBUVFBNkFBc2dBRUlBTndJQUlBQWdBallDRENBQUlBTTZBQW9nQUVFQU93RUlJQUVnQURZQ0FFRUJJUThNQXdzZ0FTQUpOZ0lBUVFBaER3d0NDeUFLUlFSQVFXd2hEd3dDQzBFQUlROGdDMFVnREVFWlNISU5BVUVJSUFSMFFRaHFJUUJCQUNFREEwQWdBQ0FEVFEwQ0lBTkJRR3NoQXd3QUN3QUxRV3doRHlBUklCRkIvQUJxSUJGQitBQnFJQVVnQmhBTUlnTkJpSDlMRFFBZ0VTZ0NlQ0lDSUFSTERRQWdFU2dDZkVFQmFpRUpJQUJCQ0dvaEMwR0FnQUlnQW5SQkVIVWhCVUVCSVJCQkFTQUNkQ0lQUVFGcklnb2hFZ05BSUFrZ0RrY0VRQUpBSUJFZ0RrRUJkQ0lFYWk4QkFDSU1RZi8vQTBZRVFDQUxJQkpCQTNScUlBNDJBZ1FnRWtFQmF5RVNRUUVoREF3QkN5QVFRUUFnQlNBTXdVb2JJUkFMSUFRZ0RXb2dERHNCQUNBT1FRRnFJUTRNQVFzTElBQWdBallDQkNBQUlCQTJBZ0FDUUNBS0lCSkdCRUFnRFVIcUFHb2hCa0VBSVJCQkFDRU1BMEFnQ1NBUVJnUkFJQTlCQTNZZ0QwRUJkbXBCQTJvaUJVRUJkQ0VFUVFBaERFRUFJUklEUUVFQUlRNGdEeUFTVFEwRUEwQWdEa0VDUndSQUlBc2dCU0FPYkNBTWFpQUtjVUVEZEdvZ0JpQU9JQkpxYWkwQUFEWUNCQ0FPUVFGcUlRNE1BUXNMSUJKQkFtb2hFaUFFSUF4cUlBcHhJUXdNQUFzQUJTQVJJQkJCQVhScUxnRUFJUVVnQmlBTWFpSUVJQk0zQUFCQkNDRU9BMEFnQlNBT1NnUkFJQVFnRG1vZ0V6Y0FBQ0FPUVFocUlRNE1BUXNMSUJOQ2dZS0VpSkNnd0lBQmZDRVRJQkJCQVdvaEVDQUZJQXhxSVF3TUFRc0FDd0FMSUE5QkEzWWdEMEVCZG1wQkEyb2hCVUVBSVJCQkFDRU9BMEFnQ1NBUVJnMEJRUUFoRENBUklCQkJBWFJxTGdFQUlnUkJBQ0FFUVFCS0d5RUVBMEFnQkNBTVJ3UkFJQXNnRGtFRGRHb2dFRFlDQkFOQUlBVWdEbW9nQ25FaURpQVNTdzBBQ3lBTVFRRnFJUXdNQVFzTElCQkJBV29oRUF3QUN3QUxJQUpCQVdvaEJVRUFJUXdEUUNBTUlBOUhCRUFnRFNBTElBeEJBM1JxSWdrb0FnUWlCRUVCZEdvaUFpQUNMd0VBSWdaQkFXbzdBUUFnQ1NBRklBWm5RV0J6YWlJQ09nQURJQWtnQmlBQ2RDQVBhenNCQUNBSklBZ2dCRUVDZENJQ2FpZ0NBRG9BQWlBSklBSWdCMm9vQWdBMkFnUWdERUVCYWlFTURBRUxDeUFCSUFBMkFnQWdBeUVQQ3lBUlFZQUJhaVFBSUE4TDdWb0NPMzhHZmlNQVFlQUJheUlFSkFBQ1FFR3c3QWtRQlNJRlJRUkFRVUFoQnd3QkN5QUZRZ0EzQXZUcUFTQUZRUUEyQXNUckFTQUZRUUEyQXJUckFTQUZRZ0EzQXB6ckFTQUZRUUEyQXJqcEFTQUZRUUEyQXF6c0NTQUZRZ0EzQXRUckFTQUZRZ0EzQXF6ckFTQUZRZ0EzQTRqckFTQUZRZ0EzQXVUcUFTQUZRZ0EzQXVUckFTQUZRWUdBZ01BQU5nSzg2d0VnQlVJQU53S2s2d0VnQlVIODZnRnFRUUEyQWdBZ0JVR1E2d0ZxUWdBM0F3QWdCUkFZSUFWQnJOVUJhaUVVSUFWQitPc0JhaUVjSUFWQnNPb0JhaUVpSUFWQm9EQnFJU29nQlVHWUlHb2hLeUFGUWFqUUFHb2hIaUFGUVJCcUlTd2dCVUVJYWlFb0lBVkJCR29oTFNBRlFjRHBBV29oS1NBRlFZanJBV29nQkVHVUFXb2hMeUFFUVl3QmFpRXdJQVJCaEFGcUlURWdCRUhjQUdvaE1pQUVRZFFBYWlFeklBUkJ6QUJxSVRRZ0FDRWRBa0FDUUFKQUFrQUNRQU5BUVFGQkJTQUZLQUxrNmdFYklRWUNRQU5BSUFNZ0Jra05BU0FDS0FBQVFYQnhRZERVdE1JQlJnUkFRYmgvSVFjZ0EwRUlTUTBJSUFJb0FBUWlEa0YzU3dSQVFYSWhCd3dKQ3lBRElBNUJDR29pQ1VrTkNDQU9RWUIvU3dSQUlBa2hCd3dKQ3lBRElBbHJJUU1nQWlBSmFpRUNEQUVMQ3lBRlFnQTNBcXpwQVNBRlFnQTNBK2pwQVNBRlFRQTJBcGpyQVNBRlFnQTNBNERxQVNBRlFnTTNBL2pwQVNBRlFiVHBBV3BDQURjQ0FDQUZRZkRwQVdwQ0FEY0RBQ0FGUWFqUUFHb2lDVUdNZ0lEZ0FEWUNBQ0FGUWF6UUFXcEI0QklwQWdBM0FnQWdCVUcwMEFGcVFlZ1NLQUlBTmdJQUlBVWdCVUVRYWpZQ0FDQUZJQVZCb0RCcU5nSUVJQVVnQlVHWUlHbzJBZ2dnQlNBSk5nSU1JQVZCQVVFRklBVW9BdVRxQVJzMkFyenBBUUpBSUFGRkRRQWdCU2dDck9rQklna2dIVVlOQUNBRklBazJBcmpwQVNBRklCMDJBcXpwQVNBRktBS3c2UUVoRGlBRklCMDJBckRwQVNBRklCMGdEaUFKYTJvMkFyVHBBUXRCdUg4aENTQURRUVZCQ1NBRktBTGs2Z0VpQmh0SkRRVWdBa0VCUVFVZ0Joc2dCaEFhSWc1QmlIOUxCRUFnRGlFSkRBVUxJQU1nRGtFRGFra05CU0FwSUFJZ0RpQUdFQmtpQmtHSWYwc0VRQ0FHSVFrTUJRc2dCZzBGQWtBQ1FDQUZLQUtvNndGQkFVY05BQ0FGS0FLazZ3RWlDVVVOQUNBRktBS1U2d0ZGRFFBZ0NTZ0NCRUVCYXlJSElBVW9BdHpwQVNJS3JVS0hsYSt2bUxiZW01NS9ma0xKejlteThlVzY2aWVGUWhlSlFzL1cwNzdTeDZ2WlFuNUMrZlBkOFpuMm1hc1dmQ0kvUWlHSUlEK0ZRcy9XMDc3U3g2dlpRbjRpUDBJZGlDQS9oVUw1ODkzeG1mYVpxeForSWo5Q0lJZ2dQNFduY1NFR0lBa29BZ0FoRlFOQVFRQWhDQUpBSUJVZ0JrRUNkR29vQWdBaUNVVU5BQ0FKS0FJSVFRaEpEUUFnQ1NnQ0JDSVNLQUFBUWJmSXd1RitSdzBBSUJJb0FBUWhDQXNnQ0NBS1J3UkFJQVlnQjNGQkFXb2hCaUFJRFFFTEN5QUpSUTBBSUFVUUdDQUZRWDgyQXFEckFTQUZJQWsyQXBUckFTQUZJQVVvQXR6cEFTSUlOZ0tZNndFTUFRc2dCU2dDM09rQklRZ0xBa0FnQ0VVTkFDQUZLQUtZNndFZ0NFWU5BRUZnSVFrTUJnc0NRQ0FGS0FMZzZRRUVRQ0FGSUFVb0F1anFBU0lKUlRZQzdPb0JJQWtOQVNBRlF2bnEwTkRueWFIazRRQTNBNmpxQVNBRlFnQTNBNkRxQVNBRlFzL1cwNzdTeDZ2WlFqY0RtT29CSUFWQzF1dUM3dXI5aWZYZ0FEY0RrT29CSUFWQ0FEY0RpT29CSUNKQkFFRW9FQU1hREFFTElBVkJBRFlDN09vQkN5QUJJQjFxSVNVZ0JTQUZLUVBvNlFFZ0RxMThOd1BvNlFFZ0F5QU9heUVESUFJZ0Rtb2hBaUFkSVE0RFFDQUNJQU1nQkVFc2FoQWRJaFZCaUg5TEJFQWdGU0VKREFZTElBTkJBMnNpTlNBVlNRMEVJQUpCQTJvaEcwRnNJUWtDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUVLQUlzRGdNQ0FRQVZDeUFWUWYvL0Iwc05FeUFWUVFOSkRSSWdCU2tEeU9rQklUOENRQUpBSUJzdEFBQWlDVUVEY1NJYVFRRnJEZ01HQVFBSEN5QUZLQUtBNmdFTkFFRmlJUWtNRlFzZ0ZVRUZTUTBTSUJzb0FBQWhBd0ovQWtBQ1FBSkFJQWxCQW5aQkEzRWlDVUVDYXc0Q0FRSUFDeUFKUVFCSElRY2dBMEVFZGtIL0IzRWhDMEVESVFZZ0EwRU9ka0gvQjNFTUFndEJCQ0VHSUFOQkJIWkIvLzhBY1NFTFFRRWhCeUFEUVJKMkRBRUxJQU5CQkhaQi8vOFBjU0lMUVlDQUNFc05FMEVCSVFkQkJTRUdJQUl0QUFkQkNuUWdBMEVXZG5JTElnZ2dCbW9pQ1NBVlN3MFNBa0FnQzBHQkJra05BQ0FGS0FLYzZ3RkZEUUJCQUNFREEwQWdBMEdEZ0FGTERRRWdBMEZBYXlFRERBQUxBQXNnQmlBYmFpRVBJQnBCQTBjTkJpQUZLQUlNSWdJdEFBRkJDSFFoQXlBSERRY2dBMFVOQ0NBRVFmQUFhaUFQSUFnUURTSURRWWgvU3cwSklBSkJCR29oQmlBTElCeHFJaEpCQTJzaENrRUFJQUl2QVFKclFSOXhJUWNnSENFREEwQWdCRUh3QUdvUUQwVWdBeUFLU1hFRVFDQURJQVlnQkNnQ2NDSUlJQVFvQW5RaUQzUWdCM1pCQW5ScUlnSXZBUUE3QUFBZ0F5QUNMUUFEYWlJRElBWWdDQ0FQSUFJdEFBSnFJZ2gwSUFkMlFRSjBhaUlDTHdFQU93QUFJQVFnQ0NBQ0xRQUNhallDZENBRElBSXRBQU5xSVFNTUFRVWdFa0VDYXlFSUEwQWdCRUh3QUdvUUR5RVBJQVFvQW5BaENpQUVLQUowSVFJZ0F5QUlTeUFQY2tVRVFDQURJQVlnQ2lBQ2RDQUhka0VDZEdvaUNpOEJBRHNBQUNBRUlBSWdDaTBBQW1vMkFuUWdBeUFLTFFBRGFpRUREQUVMQ3dOQUlBTWdDRTBFUUNBRElBWWdDaUFDZENBSGRrRUNkR29pRHk4QkFEc0FBQ0FESUE4dEFBTnFJUU1nQWlBUExRQUNhaUVDREFFTEN3SkFJQU1nRWs4TkFDQURJQVlnQ2lBQ2RDQUhka0VDZEdvaUF5MEFBRG9BQUNBRExRQURRUUZHQkVBZ0FpQURMUUFDYWlFQ0RBRUxJQUpCSDBzTkFFRWdJQUlnQXkwQUFtb2lBaUFDUVNCUEd5RUNDMEZzUVd3Z0N5QUVLQUo0SUFRb0FueEhHeUFDUVNCSEd5RUREQXNMQUFzQUN5QUVLQUkwSWdJZ0pTQU9hMHNOQ2lBT1JRUkFRUUFoQ1NBQ0RRSU1EZ3NnRGlBYkxRQUFJQUlRQXhvZ0FpRUpEQXdMSUJVZ0pTQU9hMHNOQ1NBT0RRRkJBQ0VKSUJWRkRRd0xRYlovSVFrTUVRc2dEaUFiSUJVUUFob2dGU0VKREFvTElCd2dHd0ovQWtBQ1FBSkFJQWxCQW5aQkEzRkJBV3NPQXdFQUFnQUxJQWxCQTNZaEEwRUJEQUlMSUJzdkFBQkJCSFloQTBFQ0RBRUxJQlZCQkVrTkRpQUNMd0FESUFJdEFBVkJFSFJ5SWdKQmo0Q0FBVXNORGlBQ1FRUjJJUU5CQXdzaUFtb3RBQUFnQTBFZ2FoQURJUWtnQlNBRE5nS0E2d0VnQlNBSk5nTHc2Z0VnQWtFQmFpRUpEQVVMSUJVQ2Z3SkFBa0FDUUNBSlFRSjJRUU54UVFGckRnTUJBQUlBQ3lBSlFRTjJJUU5CQVF3Q0N5QWJMd0FBUVFSMklRTkJBZ3dCQ3lBQ0x3QURJQUl0QUFWQkVIUnlRUVIySVFOQkF3c2lBaUFEYWlJSlFTQnFTUVJBSUFrZ0ZVc05EU0FjSUFJZ0cyb2dBeEFDSVFJZ0JTQUROZ0tBNndFZ0JTQUNOZ0x3NmdFZ0FpQURhaUlDUWdBM0FCZ2dBa0lBTndBUUlBSkNBRGNBQ0NBQ1FnQTNBQUFNQlFzZ0JTQUROZ0tBNndFZ0JTQUNJQnRxTmdMdzZnRU1CQXNnQjBVRVFDQWVJQThnQ0NBVUVCUWlBa0dJZjBzZ0FpQUlUM0lORENBY0lBc2dBaUFQYWlBSUlBSnJJQjRRRlNFRERBTUxJQXRGSUFoRmNnMExJQXRCQ0hZaUF5QUlJQXRKQkg4Z0NFRUVkQ0FMYmdWQkR3dEJHR3dpQWtHTUNHb29BZ0JzSUFKQmlBaHFLQUlBYWlJR1FRTjJJQVpxSUFKQmdBaHFLQUlBSUFKQmhBaHFLQUlBSUFOc2Fra0VRQ01BUVJCckloQWtBQ0FlS0FJQUlRTWdGRUh3QkdwQkFFSHNBQkFESVFaQlZDRUNBa0FnQTBIL0FYRWlERUVNU3cwQUFrQWdGRUhjQ1dvZ0JpQVFRUWhxSUJCQkRHb2dEeUFJSUJSQjNBdHFJaGNRQ3lJU1FZaC9TdzBBSUJBb0Fnd2lCaUFNU3cwQklCUkJxQVZxSVEwZ0ZFR2tCV29oTmlBZVFRUnFJUkVnQTBHQWdJQjRjU0UzSUFaQkFXb2lFeUVDSUFZaEF3TkFJQUlpQjBFQmF5RUNJQU1pQ2tFQmF5RURJQlFnQ2tFQ2RHb29BdkFFUlEwQUMwRUJJQWNnQjBFQlRSc2hGa0VBSVFkQkFTRUNBMEFnQWlBV1J3UkFJQlFnQWtFQ2RDSURhaWdDOEFRaEdDQURJQTFxSUFjMkFnQWdBa0VCYWlFQ0lBY2dHR29oQnd3QkN3c2dEU0FITmdJQVFRQWhBaUFRS0FJSUlRTURRQ0FDSUFOSEJFQWdEU0FDSUJScVFkd0phaTBBQUNJWVFRSjBhaUlaSUJrb0FnQWlHVUVCYWpZQ0FDQVVJQmxCQVhScUloa2dHRG9BM1FVZ0dTQUNPZ0RjQlNBQ1FRRnFJUUlNQVFzTFFRQWhBeUFOUVFBMkFnQWdEQ0FHUVg5emFpRUdRUUVoQWdOQUlBSWdGa2NFUUNBVUlBSkJBblJxSWcwZ0F6WUNBQ0FOS0FMd0JDQUNJQVpxZENBRGFpRURJQUpCQVdvaEFnd0JDd3NnRENBVElBcHJJZ1pyUVFGcUlRb2dCaUVEQTBBZ0F5QUtTUVJBSUJRZ0EwRTBiR29oRFVFQklRSURRQ0FDSUJaSEJFQWdEU0FDUVFKMEloaHFJQlFnR0dvb0FnQWdBM1kyQWdBZ0FrRUJhaUVDREFFTEN5QURRUUZxSVFNTUFRc0xJQmNnRkVFMEVBSWhPQ0FVUVpBTWFpRTVJQk1nREdzaE9pQVVRZHdGYWlFWFFRQWhDZ05BQWtBQ1FDQUhJQXBIQkVCQkFTQU1JQk1nRnlBS1FRRjBhaUlDTFFBQklnMXJJZ05ySWhoMElSa2dBaTBBQUNFV0lEZ2dEVUVDZEdvaUh5Z0NBQ0VDSUFZZ0dFMEVRQ0EyUVFFZ0F5QTZhaUlOSUExQkFVd2JJaUJCQW5RaUpHb29BZ0FoRFNBNUlCUWdBMEUwYkdwQk5CQUNJU0VnRFVFQmRDRW1JQkVnQWtFQ2RHb2hJeUFnUVFGTkRRSWdBMEVRZEVHQWdQd0hjU0FXY2tHQWdJQUljaUVnSUNFZ0pHb29BZ0FoSkVFQUlRSURRQ0FDSUNSR0RRTWdJeUFDUVFKMGFpQWdOZ0VBSUFKQkFXb2hBZ3dBQ3dBTElBSWdBaUFaYWlJTklBSWdEVXNiSVEwZ0EwRVFkRUdBZ1B3SGNTQVdja0dBZ0lBSWNpRURBMEFnQWlBTlJnMERJQkVnQWtFQ2RHb2dBellCQUNBQ1FRRnFJUUlNQUFzQUN5QWVJQXhCRUhRZ04zSWdESEpCZ0FKeU5nSUFEQU1MSUFjZ0RXc2hKQ0FYSUNacUlTWkJBQ0VOQTBBZ0RTQWtSZzBCUVFFZ0dDQVRJQ1lnRFVFQmRHb2lKeTBBQVNJQ2F5STdhM1FpUENBaElBSkJBblJxSWlBb0FnQWlBbW9oUFNBRElEdHFRUkIwUVlDQS9BZHhJQ2N0QUFCQkNIUnlJQlp5UVlDQWdCQnlJU2NEUUNBaklBSkJBblJxSUNjMkFRQWdBa0VCYWlJQ0lEMUpEUUFMSUNBZ0lDZ0NBQ0E4YWpZQ0FDQU5RUUZxSVEwTUFBc0FDeUFmSUI4b0FnQWdHV28yQWdBZ0NrRUJhaUVLREFBTEFBc2dFaUVDQ3lBUVFSQnFKQUFnQWtHSWYwc2dBaUFJVDNJTkRDQWNJQXNnQWlBUGFpQUlJQUpySUI0UUZpRUREQU1MSUI0Z0R5QUlJQlFRRkNJQ1FZaC9TeUFDSUFoUGNnMExJQndnQ3lBQ0lBOXFJQWdnQW1zZ0hoQVhJUU1NQWdzZ0F3UkFJQndnQ3lBUElBZ2dBaEFXSVFNTUFnc2dIQ0FMSUE4Z0NDQUNFQmNoQXd3QkN5QWNJQXNnRHlBSUlBSVFGU0VEQ3lBRFFZaC9TdzBJSUFVZ0N6WUNnT3NCSUFVZ0hEWUM4T29CSUFWQkFUWUNnT29CSUJwQkFrWUVRQ0FGSUI0MkFnd0xJQXNnSEdvaUFrSUFOd0FBSUFKQ0FEY0FHQ0FDUWdBM0FCQWdBa0lBTndBSUlBbEJpSDlMRFFvTElBa2dGVVlOQ0NBVklBbHJJUVlnQlNnQ25Pc0JJUW9DUUNBSklCdHFJZ010QUFBaUQwVUVRRUVCSVFKQkFDRVBRYmgvSVFrZ0JrRUJSZzBCREFzTEFuOGdBMEVCYWlBUHdDSUNRUUJPRFFBYUlBSkJmMFlFUUNBR1FRTklEUXNnQXk4QUFVR0EvZ0ZxSVE4Z0EwRURhZ3dCQ3lBR1FRSklEUW9nQXkwQUFTQVBRUWgwY2tHQWdBSnJJUThnQTBFQ2Fnc2hFa0c0ZnlFSklCSkJBV29pQWlBVklCdHFJZ2RMRFFvZ0xDQUZJQkl0QUFBaUVrRUdka0VqUVFrZ0FpQUhJQUpyUWNBUVFkQVJRZkFTSUFVb0FvVHFBU0FLSUE4Z0ZCQWhJZ2xCaUg5TERRZ2dLeUFvSUJKQkJIWkJBM0ZCSDBFSUlBSWdDV29pQWlBSElBSnJRWUFMUVlBTVFZQVhJQVVvQW9UcUFTQUZLQUtjNndFZ0R5QVVFQ0VpQ0VHSWYwc05DRUZzSVFrZ0tpQXRJQkpCQW5aQkEzRkJORUVKSUFJZ0NHb2lBaUFISUFKclFZQU5RZUFPUVpBWklBVW9Bb1RxQVNBRktBS2M2d0VnRHlBVUVDRWlCMEdJZjBzTkNpQUNJQWRxSUFOcklnSWhDU0FDUVloL1N3MEtDeUFPSUE5QkFFeHlEUUVMUWJwL0lRa01DQXNnSlNBT2F5RUpJQVlnQW1zaEJpQUNJQU5xSVFjQ1FBSkFBa0FnQ2tVRVFDQVBRUWxJSUFVcEE4anBBVUtCZ0lBSVZISU5BaUFvS0FJQUlnSkJDR29oRWlBQ0tBSUVJUXBCQUNFRFFRQWhBZ05BSUFNZ0NuWkZCRUFnQWlBU0lBTkJBM1JxTFFBQ1FSWkxhaUVDSUFOQkFXb2hBd3dCQ3dzZ0JVRUFOZ0tjNndFZ0FrRUlJQXByZEVFVVR3MEJEQU1MSUFWQkFEWUNuT3NCQ3lBRUlBVW9BdkRxQVNJRE5nTGNBU0FKSUE1cUlSWWdBeUFGS0FLQTZ3RnFJUmNDUUNBUFJRUkFJQTRoQnd3QkN5QUZLQUs0NlFFaEdpQUZLQUswNlFFaEdDQUZLQUt3NlFFaEVpQUZRUUUyQW9UcUFVRUFJUU1EUUNBRFFRTkhCRUFnQkNBRFFRSjBJZ0pxSUFJZ0JXcEJyTkFCYWlnQ0FEWUNaQ0FEUVFGcUlRTU1BUXNMUVd3aENTQUVRVGhxSWdJZ0J5QUdFQTFCaUg5TERRTkJDQ0FQSUE5QkNFNGJJUjhnTkNBQ0lBVW9BZ0FRSGlBeklBSWdCU2dDQ0JBZUlESWdBaUFGS0FJRUVCNGdEaUFTYXlFWlFRQWhDQU5BSUFSQk9Hb1FEMEVEUmlBSUlCOU9ja1VFUUNBRUtBSlFJQVFvQWt4QkEzUnFLUUlBSWtDbklnZEJFSFlpRVVIL0FYRWhDeUFFS0FKZ0lBUW9BbHhCQTNScUtRSUFJa0duSWd4QkVIWWlJVUgvQVhFaEVDQUVLQUpZSUFRb0FsUkJBM1JxS1FJQUlrSkNJSWluSVFZZ1FVSWdpQ0JBUWlDSXB5RURBa0FnUWtJUWlLY2lDa0gvQVhFaUFrRUNUd1JBQWtBZ0FrRVpTU0EvUW9HQWdCQlVja1VFUUNBRVFTQWdCQ2dDUENJS2F5SU5JQUlnQWlBTlN4c2lFeUFLYWpZQ1BDQUdJQVFvQWpnZ0NuUkJBQ0FUYTNZZ0FpQVRheUlUZEdvaENpQUVRVGhxRUE4YUlBSWdEVTBOQVNBRUlBUW9BandpQWlBVGFqWUNQQ0FFS0FJNElBSjBRUUFnRTJ0MklBcHFJUW9NQVFzZ0JDQUNJQVFvQWp3aURXbzJBandnQkNnQ09DQU5kRUVBSUFwcmRpQUdhaUVLSUFSQk9Hb1FEeG9MSUFRcEFtUWhSQ0FFSUFvMkFtUWdCQ0JFTndKb0RBRUxBa0FnQWtVRVFDQURCRUFnQkNnQ1pDRUtEQU1MSUFRb0FtZ2hDZ3dCQ3lBRUlBUW9BandpQWtFQmFqWUNQQUovSUFZZ0EwVnFJQVFvQWpnZ0FuUkJIM1pxSWdKQkEwWUVRQ0FFS0FKa1FRRnJEQUVMSUFKQkFuUWdCR29vQW1RTElnWkZJQVpxSVFvZ0FrRUJSd1JBSUFRZ0JDZ0NhRFlDYkFzTElBUWdCQ2dDWkRZQ2FDQUVJQW8yQW1RTHB5RUNJRUZDZ0lEOEI0TlFSUVJBSUFRZ0JDZ0NQQ0lHSUJCcU5nSThJQVFvQWpnZ0JuUkJBQ0FoYTNZZ0Ftb2hBZ3NnQ3lBUWFrRVVUd1JBSUFSQk9Hb1FEeG9MSUVCQ2dJRDhCNE5RUlFSQUlBUWdCQ2dDUENJR0lBdHFOZ0k4SUFRb0FqZ2dCblJCQUNBUmEzWWdBMm9oQXdzZ0JFRTRhaEFQR2lBRUlBUW9BamdpQmtFQUlBZEJHSFlpQ3lBRUtBSThhaUlRYTNZZ0MwRUNkRUdnSFdvb0FnQnhJQWRCLy84RGNXbzJBa3dnQkNBUUlBeEJHSFlpQjJvaUN6WUNQQ0FFSUFkQkFuUkJvQjFxS0FJQUlBWkJBQ0FMYTNaeElBeEIvLzhEY1dvMkFsd2dCRUU0YWhBUEdpQUVJRUtuSWdaQkdIWWlCeUFFS0FJOGFpSUxOZ0k4SUFRZ0IwRUNkRUdnSFdvb0FnQWdCQ2dDT0VFQUlBdHJkbkVnQmtILy93TnhhallDVkNBRVFmQUFhaUFJUVF4c2FpSUdJQW8yQWdnZ0JpQUNOZ0lFSUFZZ0F6WUNBQ0FJUVFGcUlRZ2dBeUFaYWlBQ2FpRVpEQUVMQ3lBSUlCOUlEUU1nRmtFZ2F5RWhJQTRoQndOQUlBUkJPR29RRDBFRFJpQUlJQTlPY2tVRVFDQUVLQUpRSUFRb0FreEJBM1JxS1FJQUlrQ25JZ1pCRUhZaUkwSC9BWEVoQ2lBRUtBSmdJQVFvQWx4QkEzUnFLUUlBSWtHbklnMUJFSFlpSUVIL0FYRWhFeUFFS0FKWUlBUW9BbFJCQTNScUtRSUFJa0pDSUlpbklRTWdRVUlnaUNCQVFpQ0lweUVMQWtBZ1FrSVFpS2NpREVIL0FYRWlBa0VDVHdSQUFrQWdBa0VaU1NBL1FvR0FnQkJVY2tVRVFDQUVRU0FnQkNnQ1BDSU1heUlSSUFJZ0FpQVJTeHNpRUNBTWFqWUNQQ0FESUFRb0FqZ2dESFJCQUNBUWEzWWdBaUFRYXlJTWRHb2hFQ0FFUVRocUVBOGFJQUlnRVUwTkFTQUVJQVFvQWp3aUFpQU1hallDUENBRUtBSTRJQUowUVFBZ0RHdDJJQkJxSVJBTUFRc2dCQ0FDSUFRb0Fqd2lFR28yQWp3Z0JDZ0NPQ0FRZEVFQUlBeHJkaUFEYWlFUUlBUkJPR29RRHhvTElBUXBBbVFoUkNBRUlCQTJBbVFnQkNCRU53Sm9EQUVMQWtBZ0FrVUVRQ0FMQkVBZ0JDZ0NaQ0VRREFNTElBUW9BbWdoRUF3QkN5QUVJQVFvQWp3aUFrRUJhallDUEFKL0lBTWdDMFZxSUFRb0FqZ2dBblJCSDNacUlnSkJBMFlFUUNBRUtBSmtRUUZyREFFTElBSkJBblFnQkdvb0FtUUxJZ05GSUFOcUlSQWdBa0VCUndSQUlBUWdCQ2dDYURZQ2JBc0xJQVFnQkNnQ1pEWUNhQ0FFSUJBMkFtUUxweUVNSUVGQ2dJRDhCNE5RUlFSQUlBUWdCQ2dDUENJQ0lCTnFOZ0k4SUFRb0FqZ2dBblJCQUNBZ2EzWWdER29oREFzZ0NpQVRha0VVVHdSQUlBUkJPR29RRHhvTElFQkNnSUQ4QjROUVJRUkFJQVFnQkNnQ1BDSUNJQXBxTmdJOElBUW9BamdnQW5SQkFDQWphM1lnQzJvaEN3c2dCRUU0YWhBUEdpQUVJQVFvQWpnaUFrRUFJQVpCR0hZaUF5QUVLQUk4YWlJS2EzWWdBMEVDZEVHZ0hXb29BZ0J4SUFaQi8vOERjV28yQWt3Z0JDQUtJQTFCR0hZaUEyb2lCallDUENBRUlBTkJBblJCb0IxcUtBSUFJQUpCQUNBR2EzWnhJQTFCLy84RGNXbzJBbHdnQkVFNGFoQVBHaUFFSUVLbklnSkJHSFlpQXlBRUtBSThhaUlHTmdJOElBUWdBMEVDZEVHZ0hXb29BZ0FnQkNnQ09FRUFJQVpyZG5FZ0FrSC8vd054YWpZQ1ZBSkFBa0FDUUNBRUtBTGNBU0lESUFSQjhBQnFJQWhCQjNGQkRHeHFJaE1vQWdBaUVXb2lJeUFYU3cwQUlBY2dFeWdDQkNJTklCRnFJZ3BxSUNGTERRQWdDa0VnYWlBV0lBZHJUUTBCQ3lBRUlCTW9BZ2cyQWhnZ0JDQVRLUUlBTndNUUlBY2dGaUFFUVJCcUlBUkIzQUZxSUJjZ0VpQVlJQm9RSHlFS0RBRUxJQWNnRVdvaEFpQVRLQUlJSVFZZ0J5QURLUUFBTndBQUlBY2dBeWtBQ0RjQUNBSkFJQkZCRVVrTkFDQUhJQU1wQUJBM0FCQWdCeUFES1FBWU53QVlJQkZCRUd0QkVVZ05BQ0FEUVJCcUlRTWdCMEVnYWlFUkEwQWdFU0FES1FBUU53QUFJQkVnQXlrQUdEY0FDQ0FSSUFNcEFDQTNBQkFnRVNBREtRQW9Od0FZSUFOQklHb2hBeUFSUVNCcUloRWdBa2tOQUFzTElBSWdCbXNoQXlBRUlDTTJBdHdCSUFJZ0Vtc2dCa2tFUUNBR0lBSWdHR3RMRFFjZ0dpQWFJQU1nRW1zaUEyb2lFU0FOYWs4RVFDQUNJQkVnRFJBS0dnd0NDeUFESUExcUlRMGdBaUFSUVFBZ0Eyc1FDaUFEYXlFQ0lCSWhBd3NnQmtFUVR3UkFJQUlnQXlrQUFEY0FBQ0FDSUFNcEFBZzNBQWdnRFVFUlNBMEJJQUlnRFdvaEJpQUNRUkJxSVFJRFFDQUNJQU1wQUJBM0FBQWdBaUFES1FBWU53QUlJQUlnQXlrQUlEY0FFQ0FDSUFNcEFDZzNBQmdnQTBFZ2FpRURJQUpCSUdvaUFpQUdTUTBBQ3d3QkN3SkFJQVpCQjAwRVFDQUNJQU10QUFBNkFBQWdBaUFETFFBQk9nQUJJQUlnQXkwQUFqb0FBaUFDSUFNdEFBTTZBQU1nQWlBRElBWkJBblFpQmtIQUhtb29BZ0JxSWdNb0FBQTJBQVFnQXlBR1FlQWVhaWdDQUdzaEF3d0JDeUFDSUFNcEFBQTNBQUFMSUExQkNVa05BQ0FDSUExcUlSRWdBa0VJYWlJR0lBTkJDR29pQTJ0QkQwd0VRQU5BSUFZZ0F5a0FBRGNBQUNBRFFRaHFJUU1nQmtFSWFpSUdJQkZKRFFBTUFnc0FDeUFHSUFNcEFBQTNBQUFnQmlBREtRQUlOd0FJSUExQkdVZ05BQ0FDUVJocUlRSURRQ0FDSUFNcEFCQTNBQUFnQWlBREtRQVlOd0FJSUFJZ0F5a0FJRGNBRUNBQ0lBTXBBQ2czQUJnZ0EwRWdhaUVESUFKQklHb2lBaUFSU1EwQUN3c2dDa0dJZjBzRVFDQUtJUWtNQmdVZ0V5QVFOZ0lJSUJNZ0REWUNCQ0FUSUFzMkFnQWdDRUVCYWlFSUlBY2dDbW9oQnlBTElCbHFJQXhxSVJrTUFnc0FDd3NnQ0NBUFNBMERJQWdnSDJzaEJnTkFBa0FnQmlBUFRnUkFRUUFoQXdOQUlBTkJBMFlOQWlBRklBTkJBblFpQW1wQnJOQUJhaUFDSUFScUtBSmtOZ0lBSUFOQkFXb2hBd3dBQ3dBTEFrQUNRQUpBSUFRb0F0d0JJZ01nQkVId0FHb2dCa0VIY1VFTWJHb2lDQ2dDQUNJTWFpSVFJQmRMRFFBZ0J5QUlLQUlFSWdzZ0RHb2lDbW9nSVVzTkFDQUtRU0JxSUJZZ0IydE5EUUVMSUFRZ0NDZ0NDRFlDS0NBRUlBZ3BBZ0EzQXlBZ0J5QVdJQVJCSUdvZ0JFSGNBV29nRnlBU0lCZ2dHaEFmSVFvTUFRc2dCeUFNYWlFQ0lBZ29BZ2doQ0NBSElBTXBBQUEzQUFBZ0J5QURLUUFJTndBSUFrQWdERUVSU1EwQUlBY2dBeWtBRURjQUVDQUhJQU1wQUJnM0FCZ2dERUVRYTBFUlNBMEFJQU5CRUdvaEF5QUhRU0JxSVF3RFFDQU1JQU1wQUJBM0FBQWdEQ0FES1FBWU53QUlJQXdnQXlrQUlEY0FFQ0FNSUFNcEFDZzNBQmdnQTBFZ2FpRURJQXhCSUdvaURDQUNTUTBBQ3dzZ0FpQUlheUVESUFRZ0VEWUMzQUVnQWlBU2F5QUlTUVJBSUFnZ0FpQVlhMHNOQnlBYUlCb2dBeUFTYXlJRGFpSU1JQXRxVHdSQUlBSWdEQ0FMRUFvYURBSUxJQU1nQzJvaEN5QUNJQXhCQUNBRGF4QUtJQU5ySVFJZ0VpRURDeUFJUVJCUEJFQWdBaUFES1FBQU53QUFJQUlnQXlrQUNEY0FDQ0FMUVJGSURRRWdBaUFMYWlFSUlBSkJFR29oQWdOQUlBSWdBeWtBRURjQUFDQUNJQU1wQUJnM0FBZ2dBaUFES1FBZ053QVFJQUlnQXlrQUtEY0FHQ0FEUVNCcUlRTWdBa0VnYWlJQ0lBaEpEUUFMREFFTEFrQWdDRUVIVFFSQUlBSWdBeTBBQURvQUFDQUNJQU10QUFFNkFBRWdBaUFETFFBQ09nQUNJQUlnQXkwQUF6b0FBeUFDSUFNZ0NFRUNkQ0lJUWNBZWFpZ0NBR29pQXlnQUFEWUFCQ0FESUFoQjRCNXFLQUlBYXlFRERBRUxJQUlnQXlrQUFEY0FBQXNnQzBFSlNRMEFJQUlnQzJvaERDQUNRUWhxSWdnZ0EwRUlhaUlEYTBFUFRBUkFBMEFnQ0NBREtRQUFOd0FBSUFOQkNHb2hBeUFJUVFocUlnZ2dERWtOQUF3Q0N3QUxJQWdnQXlrQUFEY0FBQ0FJSUFNcEFBZzNBQWdnQzBFWlNBMEFJQUpCR0dvaEFnTkFJQUlnQXlrQUVEY0FBQ0FDSUFNcEFCZzNBQWdnQWlBREtRQWdOd0FRSUFJZ0F5a0FLRGNBR0NBRFFTQnFJUU1nQWtFZ2FpSUNJQXhKRFFBTEN5QUtRWWgvU3dSQUlBb2hDUXdHQlNBR1FRRnFJUVlnQnlBS2FpRUhEQUlMQUFzTElBUW9BdHdCSVFNTFFicC9JUWtnRnlBRGF5SUNJQllnQjJ0TERRSWdCd1IvSUFjZ0F5QUNFQUlnQW1vRlFRQUxJQTVySVFrTUFnc2dCVUVBTmdLYzZ3RUxJQVFnQlNnQzhPb0JJZ00yQXR3QklBa2dEbW9oRENBRElBVW9Bb0RyQVdvaEVBSkFJQTlGQkVBZ0RpRUdEQUVMSUFVb0FyanBBU0VOSUFVb0FyVHBBU0VUSUFVb0FyRHBBU0VTSUFWQkFUWUNoT29CUVFBaEF3TkFJQU5CQTBjRVFDQUVJQU5CQW5RaUFtb2dBaUFGYWtHczBBRnFLQUlBTmdLY0FTQURRUUZxSVFNTUFRc0xRV3doQ1NBRVFmQUFhaUlDSUFjZ0JoQU5RWWgvU3cwQklERWdBaUFGS0FJQUVCNGdNQ0FDSUFVb0FnZ1FIaUF2SUFJZ0JTZ0NCQkFlSUF4QklHc2hHQ0FPSVFZRFFDQUVLQUtJQVNBRUtBS0VBVUVEZEdvcEFnQWlRS2NpQ2tFUWRpSVpRZjhCY1NFTElBUW9BcGdCSUFRb0FwUUJRUU4wYWlrQ0FDSkJweUlXUVJCMkloOUIvd0Z4SVJvZ0JDZ0NrQUVnQkNnQ2pBRkJBM1JxS1FJQUlrSkNJSWluSVFjZ1FVSWdpQ0JBUWlDSXB5RURBa0FnUWtJUWlLY2lDRUgvQVhFaUFrRUNUd1JBQWtBZ0FrRVpTU0EvUW9HQWdCQlVja1VFUUNBRVFTQWdCQ2dDZENJSWF5SVJJQUlnQWlBUlN4c2lGeUFJYWpZQ2RDQUhJQVFvQW5BZ0NIUkJBQ0FYYTNZZ0FpQVhheUlYZEdvaENDQUVRZkFBYWhBUEdpQUNJQkZORFFFZ0JDQUVLQUowSWdJZ0YybzJBblFnQkNnQ2NDQUNkRUVBSUJkcmRpQUlhaUVJREFFTElBUWdBaUFFS0FKMEloRnFOZ0owSUFRb0FuQWdFWFJCQUNBSWEzWWdCMm9oQ0NBRVFmQUFhaEFQR2dzZ0JDa0NuQUVoUkNBRUlBZzJBcHdCSUFRZ1JEY0NvQUVNQVFzQ1FDQUNSUVJBSUFNRVFDQUVLQUtjQVNFSURBTUxJQVFvQXFBQklRZ01BUXNnQkNBRUtBSjBJZ0pCQVdvMkFuUUNmeUFISUFORmFpQUVLQUp3SUFKMFFSOTJhaUlDUVFOR0JFQWdCQ2dDbkFGQkFXc01BUXNnQWtFQ2RDQUVhaWdDbkFFTElnZEZJQWRxSVFnZ0FrRUJSd1JBSUFRZ0JDZ0NvQUUyQXFRQkN3c2dCQ0FFS0FLY0FUWUNvQUVnQkNBSU5nS2NBUXVuSVFJZ1FVS0FnUHdIZzFCRkJFQWdCQ0FFS0FKMElnY2dHbW8yQW5RZ0JDZ0NjQ0FIZEVFQUlCOXJkaUFDYWlFQ0N5QUxJQnBxUVJSUEJFQWdCRUh3QUdvUUR4b0xJRUJDZ0lEOEI0TlFSUVJBSUFRZ0JDZ0NkQ0lISUF0cU5nSjBJQVFvQW5BZ0IzUkJBQ0FaYTNZZ0Eyb2hBd3NnQkVId0FHb1FEeG9nQkNBRUtBSndJZ2RCQUNBS1FSaDJJZ3NnQkNnQ2RHb2lHbXQySUF0QkFuUkJvQjFxS0FJQWNTQUtRZi8vQTNGcU5nS0VBU0FFSUJvZ0ZrRVlkaUlLYWlJTE5nSjBJQVFnQ2tFQ2RFR2dIV29vQWdBZ0IwRUFJQXRyZG5FZ0ZrSC8vd054YWpZQ2xBRWdCRUh3QUdvUUR4b2dCQ0JDcHlJSFFSaDJJZ29nQkNnQ2RHb2lDellDZENBRUlBcEJBblJCb0IxcUtBSUFJQVFvQW5CQkFDQUxhM1p4SUFkQi8vOERjV28yQW93QklBUWdBellDT0NBRUlBSTJBandnQkNBSU5nSkFBa0FDUUFKQUlBUW9BdHdCSWdzZ0Eyb2lGaUFRU3cwQUlBWWdBaUFEYWlJS2FpQVlTdzBBSUFwQklHb2dEQ0FHYTAwTkFRc2dCQ0FFUVVCcktBSUFOZ0lJSUFRZ0JDa0RPRGNEQUNBR0lBd2dCQ0FFUWR3QmFpQVFJQklnRXlBTkVCOGhDZ3dCQ3lBRElBWnFJUWNnQmlBTEtRQUFOd0FBSUFZZ0N5a0FDRGNBQ0FKQUlBTkJFVWtOQUNBR0lBc3BBQkEzQUJBZ0JpQUxLUUFZTndBWUlBTkJFR3RCRVVnTkFDQUxRUkJxSVFNZ0JrRWdhaUVMQTBBZ0N5QURLUUFRTndBQUlBc2dBeWtBR0RjQUNDQUxJQU1wQUNBM0FCQWdDeUFES1FBb053QVlJQU5CSUdvaEF5QUxRU0JxSWdzZ0Iwa05BQXNMSUFjZ0NHc2hBeUFFSUJZMkF0d0JJQWNnRW1zZ0NFa0VRQ0FJSUFjZ0UydExEUVFnRFNBTklBTWdFbXNpQTJvaUN5QUNhazhFUUNBSElBc2dBaEFLR2d3Q0N5QUhJQXRCQUNBRGF4QUtJQVFnQWlBRGFpSUNOZ0k4SUFOcklRY2dFaUVEQ3lBSVFSQlBCRUFnQnlBREtRQUFOd0FBSUFjZ0F5a0FDRGNBQ0NBQ1FSRklEUUVnQWlBSGFpRUlJQWRCRUdvaEFnTkFJQUlnQXlrQUVEY0FBQ0FDSUFNcEFCZzNBQWdnQWlBREtRQWdOd0FRSUFJZ0F5a0FLRGNBR0NBRFFTQnFJUU1nQWtFZ2FpSUNJQWhKRFFBTERBRUxBa0FnQ0VFSFRRUkFJQWNnQXkwQUFEb0FBQ0FISUFNdEFBRTZBQUVnQnlBRExRQUNPZ0FDSUFjZ0F5MEFBem9BQXlBSElBTWdDRUVDZENJSVFjQWVhaWdDQUdvaUF5Z0FBRFlBQkNBRElBaEI0QjVxS0FJQWF5RUREQUVMSUFjZ0F5a0FBRGNBQUFzZ0FrRUpTUTBBSUFJZ0Iyb2hDeUFIUVFocUlnZ2dBMEVJYWlJRGEwRVBUQVJBQTBBZ0NDQURLUUFBTndBQUlBTkJDR29oQXlBSVFRaHFJZ2dnQzBrTkFBd0NDd0FMSUFnZ0F5a0FBRGNBQUNBSUlBTXBBQWczQUFnZ0FrRVpTQTBBSUFkQkdHb2hBZ05BSUFJZ0F5a0FFRGNBQUNBQ0lBTXBBQmczQUFnZ0FpQURLUUFnTndBUUlBSWdBeWtBS0RjQUdDQURRU0JxSVFNZ0FrRWdhaUlDSUF0SkRRQUxDeUFLUVloL1N3UkFJQW9oQ1F3REN5QUdJQXBxSVFZZ0JFSHdBR29RRHlFRElBOUJBV3NpRHcwQUMwRUFJUUlnQTBFQ1NRMEJBMEFnQWtFRFJ3UkFJQVVnQWtFQ2RDSURha0dzMEFGcUlBTWdCR29vQXB3Qk5nSUFJQUpCQVdvaEFnd0JDd3NnQkNnQzNBRWhBd3RCdW44aENTQVFJQU5ySWdJZ0RDQUdhMHNOQUNBR0JIOGdCaUFESUFJUUFpQUNhZ1ZCQUFzZ0Rtc2hDUXNnQ1VHSWYwc05CZ3NDUUNBRktBTHM2Z0ZGRFFBZ0JTQUZLUU9JNmdFZ0NhMThOd09JNmdFQ1FDQUZLQUxRNmdFaUFpQUphaUlJUVI5TkJFQWdEa1VOQVNBQ0lDSnFJQTRnQ1JBQ0dpQUZLQUxRNmdFZ0NXb2hDQXdCQ3lBT0lRTWdBZ1JBSUFJZ0ltb2dBMEVnSUFKckVBSWFJQVVvQXREcUFTRUNJQVZCQURZQzBPb0JJQVVnQlNrRGtPb0JJQVVwQUxEcUFVTFAxdE8rMHNlcjJVSitmRUlmaVVLSGxhK3ZtTGJlbTU1L2ZqY0RrT29CSUFVZ0JTa0RtT29CSUFVcEFManFBVUxQMXRPKzBzZXIyVUorZkVJZmlVS0hsYSt2bUxiZW01NS9mamNEbU9vQklBVWdCU2tEb09vQklBVXBBTURxQVVMUDF0Tyswc2VyMlVKK2ZFSWZpVUtIbGErdm1MYmVtNTUvZmpjRG9Pb0JJQVVnQlNrRHFPb0JJQVVwQU1qcUFVTFAxdE8rMHNlcjJVSitmRUlmaVVLSGxhK3ZtTGJlbTU1L2ZqY0RxT29CSUFNZ0FtdEJJR29oQXdzZ0NTQU9haUlDSUFOQklHcFBCRUFnQWtFZ2F5RUdJQVVwQTZqcUFTRS9JQVVwQTZEcUFTRkFJQVVwQTVqcUFTRkJJQVVwQTVEcUFTRkNBMEFnQXlrQUdFTFAxdE8rMHNlcjJVSitJRDk4UWgrSlFvZVZyNitZdHQ2Ym5uOStJVDhnQXlrQUVFTFAxdE8rMHNlcjJVSitJRUI4UWgrSlFvZVZyNitZdHQ2Ym5uOStJVUFnQXlrQUNFTFAxdE8rMHNlcjJVSitJRUY4UWgrSlFvZVZyNitZdHQ2Ym5uOStJVUVnQXlrQUFFTFAxdE8rMHNlcjJVSitJRUo4UWgrSlFvZVZyNitZdHQ2Ym5uOStJVUlnQTBFZ2FpSURJQVpORFFBTElBVWdQemNEcU9vQklBVWdRRGNEb09vQklBVWdRVGNEbU9vQklBVWdRamNEa09vQkN5QUNJQU5ORFFFZ0lpQURJQUlnQTJzaUNCQUNHZ3NnQlNBSU5nTFE2Z0VMSURVZ0ZXc2hBeUFWSUJ0cUlRSWdDU0FPYWlFT0lBUW9BakJGRFFBTElDa3BBd0FpUDBKL1VTQS9JQTRnSFd1c1VYSkZCRUJCYkNFSkRBWUxJQVVvQXVEcEFRUkFRV29oQ1NBRFFRUkpEUVlnQlNnQzZPb0JSUVJBSUNJZ0JTZ0MwT29CYWlFS0FuNGdCU2tEaU9vQklqOUNJRm9FUUNBRktRT1k2Z0VpUUVJSGlTQUZLUU9RNmdFaVFVSUJpWHdnQlNrRG9Pb0JJa0pDRElsOElBVXBBNmpxQVNKRFFoS0pmQ0JCUXMvVzA3N1N4NnZaUW41Q0g0bENoNVd2cjVpMjNwdWVmMzZGUW9lVnI2K1l0dDZibm45K1FwMmp0ZXFEc1kySytnQjlJRUJDejliVHZ0TEhxOWxDZmtJZmlVS0hsYSt2bUxiZW01NS9mb1ZDaDVXdnI1aTIzcHVlZjM1Q25hTzE2b094allyNkFIMGdRa0xQMXRPKzBzZXIyVUorUWgrSlFvZVZyNitZdHQ2Ym5uOStoVUtIbGErdm1MYmVtNTUvZmtLZG83WHFnN0dOaXZvQWZTQkRRcy9XMDc3U3g2dlpRbjVDSDRsQ2g1V3ZyNWkyM3B1ZWYzNkZRb2VWcjYrWXR0NmJubjkrUXAyanRlcURzWTJLK2dCOURBRUxJQVVwQTZEcUFVTEZ6OW15OGVXNjZpZDhDeUEvZkNFL0lDSWhCZ05BSUFvZ0JrRUlhaUlIVHdSQUlBWXBBQUJDejliVHZ0TEhxOWxDZmtJZmlVS0hsYSt2bUxiZW01NS9maUEvaFVJYmlVS0hsYSt2bUxiZW01NS9ma0tkbzdYcWc3R05pdm9BZlNFL0lBY2hCZ3dCQ3dzQ1FDQUtJQVpCQkdvaUNFa0VRQ0FHSVFnTUFRc2dCalVBQUVLSGxhK3ZtTGJlbTU1L2ZpQS9oVUlYaVVMUDF0Tyswc2VyMlVKK1F2bnozZkdaOXBtckZud2hQd3NEUUNBSUlBcEpCRUFnQ0RFQUFFTEZ6OW15OGVXNjZpZCtJRCtGUWd1SlFvZVZyNitZdHQ2Ym5uOStJVDhnQ0VFQmFpRUlEQUVMQ3lBQ0tBQUFJRDlDSVlnZ1A0VkN6OWJUdnRMSHE5bENmaUkvUWgySUlEK0ZRdm56M2ZHWjlwbXJGbjRpUDBJZ2lDQS9oYWRIRFFjTElBTkJCR3NoQXlBQ1FRUnFJUUlMSUE0Z0hXc2lDVUdKZjA4TkJDQUJJQWxySVFFZ0NTQWRhaUVkUVFFaFBnd0JDd3RCdUg4aEJ5QUREUVFnSFNBQWF5RUhEQVFMUVd3aENRd0JDMEc0ZnlFSkMwRzRmeUVISUFsQmRrWWdQbkVOQVFzZ0NTRUhDeWdDQUEwQUlBVkIvT29CYWlnQ0FDRUJJQVZCK09vQmFpZ0NBQ0VBSUFVUUdDQUZLQUt3NndFZ0FDQUJFQk1nQlVFQU5nS3c2d0VnQlNnQ3BPc0JJZ0lFUUFKQUFrQUNRQUpBSUFJb0FnQWlBd1JBSUFCRkRRSWdBU0FESUFBUkFnQU1BUXNnQUVVTkFnc2dBU0FDSUFBUkFnQU1BZ3NnQXhBR0N5QUNFQVlMSUFWQkFEWUNwT3NCQ3lBQUJFQWdBU0FGSUFBUkFnQU1BUXNnQlJBR0N5QUVRZUFCYWlRQUlBY0xDNmdWQ1FCQmlBZ0xEUUVBQUFBQkFBQUFBZ0FBQUFJQVFhQUlDN01HQVFBQUFBRUFBQUFDQUFBQUFnQUFBQ1lBQUFDQ0FBQUFJUVVBQUVvQUFBQm5DQUFBSmdBQUFNQUJBQUNBQUFBQVNRVUFBRW9BQUFDK0NBQUFLUUFBQUN3Q0FBQ0FBQUFBU1FVQUFFb0FBQUMrQ0FBQUx3QUFBTW9DQUFDQUFBQUFpZ1VBQUVvQUFBQ0VDUUFBTlFBQUFITURBQUNBQUFBQW5RVUFBRW9BQUFDZ0NRQUFQUUFBQUlFREFBQ0FBQUFBNndVQUFFc0FBQUErQ2dBQVJBQUFBSjREQUFDQUFBQUFUUVlBQUVzQUFBQ3FDZ0FBU3dBQUFMTURBQUNBQUFBQXdRWUFBRTBBQUFBZkRRQUFUUUFBQUZNRUFBQ0FBQUFBSXdnQUFGRUFBQUNtRHdBQVZBQUFBSmtFQUFDQUFBQUFTd2tBQUZjQUFBQ3hFZ0FBV0FBQUFOb0VBQUNBQUFBQWJ3a0FBRjBBQUFBakZBQUFWQUFBQUVVRkFBQ0FBQUFBVkFvQUFHb0FBQUNNRkFBQWFnQUFBSzhGQUFDQUFBQUFkZ2tBQUh3QUFBQk9FQUFBZkFBQUFOSUNBQUNBQUFBQVl3Y0FBSkVBQUFDUUJ3QUFrZ0FBQUFBQUFBQUJBQUFBQVFBQUFBVUFBQUFOQUFBQUhRQUFBRDBBQUFCOUFBQUEvUUFBQVAwQkFBRDlBd0FBL1FjQUFQMFBBQUQ5SHdBQS9UOEFBUDEvQUFEOS93QUEvZjhCQVAzL0F3RDkvd2NBL2Y4UEFQMy9Id0Q5L3o4QS9mOS9BUDMvL3dEOS8vOEIvZi8vQS8zLy93ZjkvLzhQL2YvL0gvMy8vei85Ly85L0FBQUFBQUVBQUFBQ0FBQUFBd0FBQUFRQUFBQUZBQUFBQmdBQUFBY0FBQUFJQUFBQUNRQUFBQW9BQUFBTEFBQUFEQUFBQUEwQUFBQU9BQUFBRHdBQUFCQUFBQUFSQUFBQUVnQUFBQk1BQUFBVUFBQUFGUUFBQUJZQUFBQVhBQUFBR0FBQUFCa0FBQUFhQUFBQUd3QUFBQndBQUFBZEFBQUFIZ0FBQUI4QUFBQURBQUFBQkFBQUFBVUFBQUFHQUFBQUJ3QUFBQWdBQUFBSkFBQUFDZ0FBQUFzQUFBQU1BQUFBRFFBQUFBNEFBQUFQQUFBQUVBQUFBQkVBQUFBU0FBQUFFd0FBQUJRQUFBQVZBQUFBRmdBQUFCY0FBQUFZQUFBQUdRQUFBQm9BQUFBYkFBQUFIQUFBQUIwQUFBQWVBQUFBSHdBQUFDQUFBQUFoQUFBQUlnQUFBQ01BQUFBbEFBQUFKd0FBQUNrQUFBQXJBQUFBTHdBQUFETUFBQUE3QUFBQVF3QUFBRk1BQUFCakFBQUFnd0FBQUFNQkFBQURBZ0FBQXdRQUFBTUlBQUFERUFBQUF5QUFBQU5BQUFBRGdBQUFBd0FCQUVIZ0R3dFJBUUFBQUFFQUFBQUJBQUFBQVFBQUFBSUFBQUFDQUFBQUF3QUFBQU1BQUFBRUFBQUFCQUFBQUFVQUFBQUhBQUFBQ0FBQUFBa0FBQUFLQUFBQUN3QUFBQXdBQUFBTkFBQUFEZ0FBQUE4QUFBQVFBRUhFRUF1TEFRRUFBQUFDQUFBQUF3QUFBQVFBQUFBRkFBQUFCZ0FBQUFjQUFBQUlBQUFBQ1FBQUFBb0FBQUFMQUFBQURBQUFBQTBBQUFBT0FBQUFEd0FBQUJBQUFBQVNBQUFBRkFBQUFCWUFBQUFZQUFBQUhBQUFBQ0FBQUFBb0FBQUFNQUFBQUVBQUFBQ0FBQUFBQUFFQUFBQUNBQUFBQkFBQUFBZ0FBQUFRQUFBQUlBQUFBRUFBQUFDQUFBQUFBQUVBUVpBU0MrWUVBUUFBQUFFQUFBQUJBQUFBQVFBQUFBSUFBQUFDQUFBQUF3QUFBQU1BQUFBRUFBQUFCZ0FBQUFjQUFBQUlBQUFBQ1FBQUFBb0FBQUFMQUFBQURBQUFBQTBBQUFBT0FBQUFEd0FBQUJBQUFBQUJBQUFBQkFBQUFBZ0FBQUFBQUFBQUFRQUJBUVlBQUFBQUFBQUVBQUFBQUJBQUFBUUFBQUFBSUFBQUJRRUFBQUFBQUFBRkF3QUFBQUFBQUFVRUFBQUFBQUFBQlFZQUFBQUFBQUFGQndBQUFBQUFBQVVKQUFBQUFBQUFCUW9BQUFBQUFBQUZEQUFBQUFBQUFBWU9BQUFBQUFBQkJSQUFBQUFBQUFFRkZBQUFBQUFBQVFVV0FBQUFBQUFDQlJ3QUFBQUFBQU1GSUFBQUFBQUFCQVV3QUFBQUlBQUdCVUFBQUFBQUFBY0ZnQUFBQUFBQUNBWUFBUUFBQUFBS0JnQUVBQUFBQUF3R0FCQUFBQ0FBQUFRQUFBQUFBQUFBQkFFQUFBQUFBQUFGQWdBQUFDQUFBQVVFQUFBQUFBQUFCUVVBQUFBZ0FBQUZCd0FBQUFBQUFBVUlBQUFBSUFBQUJRb0FBQUFBQUFBRkN3QUFBQUFBQUFZTkFBQUFJQUFCQlJBQUFBQUFBQUVGRWdBQUFDQUFBUVVXQUFBQUFBQUNCUmdBQUFBZ0FBTUZJQUFBQUFBQUF3VW9BQUFBQUFBR0JFQUFBQUFRQUFZRVFBQUFBQ0FBQndXQUFBQUFBQUFKQmdBQ0FBQUFBQXNHQUFnQUFEQUFBQVFBQUFBQUVBQUFCQUVBQUFBZ0FBQUZBZ0FBQUNBQUFBVURBQUFBSUFBQUJRVUFBQUFnQUFBRkJnQUFBQ0FBQUFVSUFBQUFJQUFBQlFrQUFBQWdBQUFGQ3dBQUFDQUFBQVVNQUFBQUFBQUFCZzhBQUFBZ0FBRUZFZ0FBQUNBQUFRVVVBQUFBSUFBQ0JSZ0FBQUFnQUFJRkhBQUFBQ0FBQXdVb0FBQUFJQUFFQlRBQUFBQUFBQkFHQUFBQkFBQUFEd1lBZ0FBQUFBQU9CZ0JBQUFBQUFBMEdBQ0FBUVlBWEM0Y0NBUUFCQVFVQUFBQUFBQUFGQUFBQUFBQUFCZ1E5QUFBQUFBQUpCZjBCQUFBQUFBOEYvWDhBQUFBQUZRWDkveDhBQUFBREJRVUFBQUFBQUFjRWZRQUFBQUFBREFYOUR3QUFBQUFTQmYzL0F3QUFBQmNGL2Y5L0FBQUFCUVVkQUFBQUFBQUlCUDBBQUFBQUFBNEYvVDhBQUFBQUZBWDkvdzhBQUFBQ0JRRUFBQUFRQUFjRWZRQUFBQUFBQ3dYOUJ3QUFBQUFSQmYzL0FRQUFBQllGL2Y4L0FBQUFCQVVOQUFBQUVBQUlCUDBBQUFBQUFBMEYvUjhBQUFBQUV3WDkvd2NBQUFBQkJRRUFBQUFRQUFZRVBRQUFBQUFBQ2dYOUF3QUFBQUFRQmYzL0FBQUFBQndGL2YvL0R3QUFHd1g5Ly84SEFBQWFCZjMvL3dNQUFCa0YvZi8vQVFBQUdBWDkvLzhBUVpBWkM0WUVBUUFCQVFZQUFBQUFBQUFHQXdBQUFBQUFBQVFFQUFBQUlBQUFCUVVBQUFBQUFBQUZCZ0FBQUFBQUFBVUlBQUFBQUFBQUJRa0FBQUFBQUFBRkN3QUFBQUFBQUFZTkFBQUFBQUFBQmhBQUFBQUFBQUFHRXdBQUFBQUFBQVlXQUFBQUFBQUFCaGtBQUFBQUFBQUdIQUFBQUFBQUFBWWZBQUFBQUFBQUJpSUFBQUFBQUFFR0pRQUFBQUFBQVFZcEFBQUFBQUFDQmk4QUFBQUFBQU1HT3dBQUFBQUFCQVpUQUFBQUFBQUhCb01BQUFBQUFBa0dBd0lBQUJBQUFBUUVBQUFBQUFBQUJBVUFBQUFnQUFBRkJnQUFBQUFBQUFVSEFBQUFJQUFBQlFrQUFBQUFBQUFGQ2dBQUFBQUFBQVlNQUFBQUFBQUFCZzhBQUFBQUFBQUdFZ0FBQUFBQUFBWVZBQUFBQUFBQUJoZ0FBQUFBQUFBR0d3QUFBQUFBQUFZZUFBQUFBQUFBQmlFQUFBQUFBQUVHSXdBQUFBQUFBUVluQUFBQUFBQUNCaXNBQUFBQUFBTUdNd0FBQUFBQUJBWkRBQUFBQUFBRkJtTUFBQUFBQUFnR0F3RUFBQ0FBQUFRRUFBQUFNQUFBQkFRQUFBQVFBQUFFQlFBQUFDQUFBQVVIQUFBQUlBQUFCUWdBQUFBZ0FBQUZDZ0FBQUNBQUFBVUxBQUFBQUFBQUJnNEFBQUFBQUFBR0VRQUFBQUFBQUFZVUFBQUFBQUFBQmhjQUFBQUFBQUFHR2dBQUFBQUFBQVlkQUFBQUFBQUFCaUFBQUFBQUFCQUdBd0FCQUFBQUR3WURnQUFBQUFBT0JnTkFBQUFBQUEwR0F5QUFBQUFBREFZREVBQUFBQUFMQmdNSUFBQUFBQW9HQXdRQVFhUWRDOWtCQVFBQUFBTUFBQUFIQUFBQUR3QUFBQjhBQUFBL0FBQUFmd0FBQVA4QUFBRC9BUUFBL3dNQUFQOEhBQUQvRHdBQS94OEFBUDgvQUFEL2Z3QUEvLzhBQVAvL0FRRC8vd01BLy84SEFQLy9Ed0QvL3g4QS8vOC9BUC8vZndELy8vOEEvLy8vQWYvLy93UC8vLzhILy8vL0QvLy8veC8vLy84Ly8vLy9md0FBQUFBQkFBQUFBZ0FBQUFRQUFBQUFBQUFBQWdBQUFBUUFBQUFJQUFBQUFBQUFBQUVBQUFBQ0FBQUFBUUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFJQUFBQUNBQUFBQWdBQUFBSEFBQUFDQUFBQUFrQUFBQUtBQUFBQ3dCQmdCOExBNEFSQVE9PSI7dmFyIE90PW5ldyB5QSxUdD0hMTthc3luYyBmdW5jdGlvbiBjZShBLHQsSSl7bGV0IGU9bnVsbDt0eXBlb2YgQSE9InN0cmluZyI/ZT1BLmhyZWY6QS5zdGFydHNXaXRoKCJodHRwIik/ZT1BOmU9YCR7dH0vJHtBfWAsZS5lbmRzV2l0aCgiLmpzIikmJihlPWUuc3Vic3RyaW5nKDAsZS5sZW5ndGgtMykpLGUuZW5kc1dpdGgoIi53YXNtIikmJihlPWUuc3Vic3RyaW5nKDAsZS5sZW5ndGgtNSkpO2xldCBnPWAke2V9Lndhc21gLHI9YXdhaXQgZEEuZ2V0KGAke2d9LnpzdGAse3Jlc3BvbnNlVHlwZToiYXJyYXlidWZmZXIiLHBhcmFtczpJfSk7VHR8fChhd2FpdCBPdC5pbml0KCksVHQ9ITApO2xldCBuPU90LmRlY29kZShuZXcgVWludDhBcnJheShyLmRhdGEpKS5idWZmZXI7cmV0dXJuKGF3YWl0IGltcG9ydChgJHtlfS5qc2ApKS5kZWZhdWx0KHt3YXNtQmluYXJ5Om59KX12YXIgUHQ9Y2U7dmFyIHdBPW5ldyBNYXA7YXN5bmMgZnVuY3Rpb24gZmUoQSx0LEkpe2xldCBlPUEsZz1BLHI9bnVsbDtyZXR1cm4gdHlwZW9mIEEhPSJzdHJpbmciJiYoZT1uZXcgVVJMKEEuaHJlZiksZz1lLmhyZWYpLHdBLmhhcyhnKT9yPWF3YWl0IHdBLmdldChnKTood0Euc2V0KGcsUHQoZSx0LEkpKSxyPWF3YWl0IHdBLmdldChnKSkscn12YXIgeHQ9ZmU7dmFyIGxlPXtUZXh0RmlsZToiVGV4dEZpbGUiLEJpbmFyeUZpbGU6IkJpbmFyeUZpbGUiLFRleHRTdHJlYW06IlRleHRTdHJlYW0iLEJpbmFyeVN0cmVhbToiQmluYXJ5U3RyZWFtIixJbWFnZToiSW1hZ2UiLFBvaW50U2V0OiJQb2ludFNldCIsTWVzaDoiTWVzaCIsUG9seURhdGE6IlBvbHlEYXRhIixUcmFuc2Zvcm06IlRyYW5zZm9ybSIsSnNvbkNvbXBhdGlibGU6Ikpzb25Db21wYXRpYmxlIn0sRD1sZTt2YXIgRGU9e0ludDg6ImludDgiLFVJbnQ4OiJ1aW50OCIsSW50MTY6ImludDE2IixVSW50MTY6InVpbnQxNiIsSW50MzI6ImludDMyIixVSW50MzI6InVpbnQzMiIsSW50NjQ6ImludDY0IixVSW50NjQ6InVpbnQ2NCIsU2l6ZVZhbHVlVHlwZToidWludDY0IixJZGVudGlmaWVyVHlwZToidWludDY0IixJbmRleFZhbHVlVHlwZToiaW50NjQiLE9mZnNldFZhbHVlVHlwZToiaW50NjQifSxTPURlO3ZhciB1ZT17RmxvYXQzMjoiZmxvYXQzMiIsRmxvYXQ2NDoiZmxvYXQ2NCIsU3BhY2VQcmVjaXNpb25UeXBlOiJmbG9hdDY0In0saj11ZTtmdW5jdGlvbiBoZShBLHQpe2xldCBJPW51bGw7c3dpdGNoKEEpe2Nhc2UgUy5VSW50ODp7ST1uZXcgVWludDhBcnJheSh0KTticmVha31jYXNlIFMuSW50ODp7ST1uZXcgSW50OEFycmF5KHQpO2JyZWFrfWNhc2UgUy5VSW50MTY6e0k9bmV3IFVpbnQxNkFycmF5KHQpO2JyZWFrfWNhc2UgUy5JbnQxNjp7ST1uZXcgSW50MTZBcnJheSh0KTticmVha31jYXNlIFMuVUludDMyOntJPW5ldyBVaW50MzJBcnJheSh0KTticmVha31jYXNlIFMuSW50MzI6e0k9bmV3IEludDMyQXJyYXkodCk7YnJlYWt9Y2FzZSBTLlVJbnQ2NDp7dHlwZW9mIGdsb2JhbFRoaXMuQmlnVWludDY0QXJyYXk9PSJmdW5jdGlvbiI/ST1uZXcgQmlnVWludDY0QXJyYXkodCk6ST1uZXcgVWludDhBcnJheSh0KTticmVha31jYXNlIFMuSW50NjQ6e3R5cGVvZiBnbG9iYWxUaGlzLkJpZ0ludDY0QXJyYXk9PSJmdW5jdGlvbiI/ST1uZXcgQmlnSW50NjRBcnJheSh0KTpJPW5ldyBVaW50OEFycmF5KHQpO2JyZWFrfWNhc2Ugai5GbG9hdDMyOntJPW5ldyBGbG9hdDMyQXJyYXkodCk7YnJlYWt9Y2FzZSBqLkZsb2F0NjQ6e0k9bmV3IEZsb2F0NjRBcnJheSh0KTticmVha31jYXNlIm51bGwiOntJPW51bGw7YnJlYWt9Y2FzZSBudWxsOntJPW51bGw7YnJlYWt9ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlR5cGUgaXMgbm90IHN1cHBvcnRlZCBhcyBhIFR5cGVkQXJyYXkiKX1yZXR1cm4gSX12YXIgRz1oZTt2YXIgWnQ9dHlwZW9mIGdsb2JhbFRoaXMuU2hhcmVkQXJyYXlCdWZmZXI9PSJmdW5jdGlvbiIsanQ9bmV3IFRleHRFbmNvZGVyLFd0PW5ldyBUZXh0RGVjb2RlcigidXRmLTgiKTtmdW5jdGlvbiBkZShBLHQpe2xldCBJPXtmbGFnczoiciIsZW5jb2Rpbmc6ImJpbmFyeSJ9LGU9QS5mc19vcGVuKHQsSS5mbGFncykscj1BLmZzX3N0YXQodCkuc2l6ZSxvPW51bGw7WnQ/bz1uZXcgU2hhcmVkQXJyYXlCdWZmZXIocik6bz1uZXcgQXJyYXlCdWZmZXIocik7bGV0IG49bmV3IFVpbnQ4QXJyYXkobyk7cmV0dXJuIEEuZnNfcmVhZChlLG4sMCxyLDApLEEuZnNfY2xvc2UoZSksbn1mdW5jdGlvbiBWdChBLHQsSSl7bGV0IGU9bnVsbDtadD9lPW5ldyBTaGFyZWRBcnJheUJ1ZmZlcihJKTplPW5ldyBBcnJheUJ1ZmZlcihJKTtsZXQgZz1uZXcgVWludDhBcnJheShlKSxyPW5ldyBVaW50OEFycmF5KEEuSEVBUFU4LmJ1ZmZlcix0LEkpO3JldHVybiBnLnNldChyKSxnfWZ1bmN0aW9uIGQoQSx0LEksZSl7bGV0IGc9MDtyZXR1cm4gdCE9PW51bGwmJihnPUEuY2NhbGwoIml0a193YXNtX2lucHV0X2FycmF5X2FsbG9jIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLEksZSx0LmJ1ZmZlci5ieXRlTGVuZ3RoXSksQS5IRUFQVTguc2V0KG5ldyBVaW50OEFycmF5KHQuYnVmZmVyKSxnKSksZ31mdW5jdGlvbiBNKEEsdCxJKXtsZXQgZT1KU09OLnN0cmluZ2lmeSh0KSxnPUEubGVuZ3RoQnl0ZXNVVEY4KGUpKzEscj1BLmNjYWxsKCJpdGtfd2FzbV9pbnB1dF9qc29uX2FsbG9jIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLEksZ10pO0Euc3RyaW5nVG9VVEY4KGUscixnKX1mdW5jdGlvbiBwKEEsdCxJLGUpe2xldCBnPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9hZGRyZXNzIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLHQsSV0pLHI9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X3NpemUiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAsdCxJXSksbz1WdChBLGcscik7cmV0dXJuIEcoZSxvLmJ1ZmZlcil9ZnVuY3Rpb24gbUEoQSx0KXtsZXQgST1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfanNvbl9hZGRyZXNzIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciJdLFswLHRdKSxlPUEuVVRGOFRvU3RyaW5nKEkpO3JldHVybiBKU09OLnBhcnNlKGUpfWZ1bmN0aW9uIHllKEEsdCxJLGUpe2UhPW51bGwmJmUubGVuZ3RoPjAmJmUuZm9yRWFjaChmdW5jdGlvbihRLEIpe3N3aXRjaChRLnR5cGUpe2Nhc2UgRC5UZXh0U3RyZWFtOntsZXQgaT1qdC5lbmNvZGUoUS5kYXRhLmRhdGEpLGY9ZChBLGksQiwwKSxzPXtzaXplOmkuYnVmZmVyLmJ5dGVMZW5ndGgsZGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2Z9YH07TShBLHMsQik7YnJlYWt9Y2FzZSBELkpzb25Db21wYXRpYmxlOntsZXQgaT1qdC5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoUS5kYXRhKSksZj1kKEEsaSxCLDApLHM9e3NpemU6aS5idWZmZXIuYnl0ZUxlbmd0aCxkYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Zn1gfTtNKEEscyxCKTticmVha31jYXNlIEQuQmluYXJ5U3RyZWFtOntsZXQgaT1RLmRhdGEuZGF0YSxmPWQoQSxpLEIsMCkscz17c2l6ZTppLmJ1ZmZlci5ieXRlTGVuZ3RoLGRhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtmfWB9O00oQSxzLEIpO2JyZWFrfWNhc2UgRC5UZXh0RmlsZTp7QS5mc193cml0ZUZpbGUoUS5kYXRhLnBhdGgsUS5kYXRhLmRhdGEpO2JyZWFrfWNhc2UgRC5CaW5hcnlGaWxlOntBLmZzX3dyaXRlRmlsZShRLmRhdGEucGF0aCxRLmRhdGEuZGF0YSk7YnJlYWt9Y2FzZSBELkltYWdlOntsZXQgaT1RLmRhdGEsZj1kKEEsaS5kYXRhLEIsMCkscz1kKEEsaS5kaXJlY3Rpb24sQiwxKSxFPXR5cGVvZiBpLm1ldGFkYXRhPy5lbnRyaWVzPCJ1Ij9BcnJheS5mcm9tKGkubWV0YWRhdGEuZW50cmllcygpKTpbXSxjPXtpbWFnZVR5cGU6aS5pbWFnZVR5cGUsbmFtZTppLm5hbWUsb3JpZ2luOmkub3JpZ2luLHNwYWNpbmc6aS5zcGFjaW5nLGRpcmVjdGlvbjpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke3N9YCxzaXplOmkuc2l6ZSxkYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Zn1gLG1ldGFkYXRhOkV9O00oQSxjLEIpO2JyZWFrfWNhc2UgRC5NZXNoOntsZXQgaT1RLmRhdGEsZj1kKEEsaS5wb2ludHMsQiwwKSxzPWQoQSxpLmNlbGxzLEIsMSksRT1kKEEsaS5wb2ludERhdGEsQiwyKSxjPWQoQSxpLmNlbGxEYXRhLEIsMyksdT17bWVzaFR5cGU6aS5tZXNoVHlwZSxuYW1lOmkubmFtZSxudW1iZXJPZlBvaW50czppLm51bWJlck9mUG9pbnRzLHBvaW50czpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2Z9YCxudW1iZXJPZkNlbGxzOmkubnVtYmVyT2ZDZWxscyxjZWxsczpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke3N9YCxjZWxsQnVmZmVyU2l6ZTppLmNlbGxCdWZmZXJTaXplLG51bWJlck9mUG9pbnRQaXhlbHM6aS5udW1iZXJPZlBvaW50UGl4ZWxzLHBvaW50RGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke0V9YCxudW1iZXJPZkNlbGxQaXhlbHM6aS5udW1iZXJPZkNlbGxQaXhlbHMsY2VsbERhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtjfWB9O00oQSx1LEIpO2JyZWFrfWNhc2UgRC5Qb2ludFNldDp7bGV0IGk9US5kYXRhLGY9ZChBLGkucG9pbnRzLEIsMCkscz1kKEEsaS5wb2ludERhdGEsQiwxKSxFPXtwb2ludFNldFR5cGU6aS5wb2ludFNldFR5cGUsbmFtZTppLm5hbWUsbnVtYmVyT2ZQb2ludHM6aS5udW1iZXJPZlBvaW50cyxwb2ludHM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtmfWAsbnVtYmVyT2ZQb2ludFBpeGVsczppLm51bWJlck9mUG9pbnRQaXhlbHMscG9pbnREYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7c31gfTtNKEEsRSxCKTticmVha31jYXNlIEQuUG9seURhdGE6e2xldCBpPVEuZGF0YSxmPWQoQSxpLnBvaW50cyxCLDApLHM9ZChBLGkudmVydGljZXMsQiwxKSxFPWQoQSxpLmxpbmVzLEIsMiksYz1kKEEsaS5wb2x5Z29ucyxCLDMpLHU9ZChBLGkudHJpYW5nbGVTdHJpcHMsQiw0KSx5PWQoQSxpLnBvaW50RGF0YSxCLDUpLFI9ZChBLGkucG9pbnREYXRhLEIsNiksTj17cG9seURhdGFUeXBlOmkucG9seURhdGFUeXBlLG5hbWU6aS5uYW1lLG51bWJlck9mUG9pbnRzOmkubnVtYmVyT2ZQb2ludHMscG9pbnRzOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Zn1gLHZlcnRpY2VzQnVmZmVyU2l6ZTppLnZlcnRpY2VzQnVmZmVyU2l6ZSx2ZXJ0aWNlczpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke3N9YCxsaW5lc0J1ZmZlclNpemU6aS5saW5lc0J1ZmZlclNpemUsbGluZXM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtFfWAscG9seWdvbnNCdWZmZXJTaXplOmkucG9seWdvbnNCdWZmZXJTaXplLHBvbHlnb25zOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Y31gLHRyaWFuZ2xlU3RyaXBzQnVmZmVyU2l6ZTppLnRyaWFuZ2xlU3RyaXBzQnVmZmVyU2l6ZSx0cmlhbmdsZVN0cmlwczpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke3V9YCxudW1iZXJPZlBvaW50UGl4ZWxzOmkubnVtYmVyT2ZQb2ludFBpeGVscyxwb2ludERhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHt5fWAsbnVtYmVyT2ZDZWxsUGl4ZWxzOmkubnVtYmVyT2ZDZWxsUGl4ZWxzLGNlbGxEYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Un1gfTtNKEEsTixCKTticmVha31kZWZhdWx0OnRocm93IEVycm9yKCJVbnN1cHBvcnRlZCBpbnB1dCBJbnRlcmZhY2VUeXBlIil9fSksQS5yZXNldE1vZHVsZVN0ZG91dCgpLEEucmVzZXRNb2R1bGVTdGRlcnIoKTtsZXQgZz1BLnN0YWNrU2F2ZSgpLHI9MDt0cnl7cj1BLmNhbGxNYWluKHQuc2xpY2UoKSl9Y2F0Y2goUSl7dGhyb3cgdHlwZW9mIFE9PSJudW1iZXIiJiYoY29uc29sZS5sb2coIkV4Y2VwdGlvbiB3aGlsZSBydW5uaW5nIHBpcGVsaW5lOiIpLGNvbnNvbGUubG9nKCJzdGRvdXQ6IixBLmdldE1vZHVsZVN0ZG91dCgpKSxjb25zb2xlLmVycm9yKCJzdGRlcnI6IixBLmdldE1vZHVsZVN0ZGVycigpKSx0eXBlb2YgQS5nZXRFeGNlcHRpb25NZXNzYWdlPCJ1Ij9jb25zb2xlLmVycm9yKCJleGNlcHRpb246IixBLmdldEV4Y2VwdGlvbk1lc3NhZ2UoUSkpOmNvbnNvbGUuZXJyb3IoIkJ1aWxkIG1vZHVsZSBpbiBEZWJ1ZyBtb2RlIGZvciBleGNlcHRpb24gbWVzc2FnZSBpbmZvcm1hdGlvbi4iKSksUX1maW5hbGx5e0Euc3RhY2tSZXN0b3JlKGcpfWxldCBvPUEuZ2V0TW9kdWxlU3Rkb3V0KCksbj1BLmdldE1vZHVsZVN0ZGVycigpLGE9W107cmV0dXJuIEkhPW51bGwmJkkubGVuZ3RoPjAmJnI9PT0wJiZJLmZvckVhY2goZnVuY3Rpb24oUSxCKXtsZXQgaT1udWxsO3N3aXRjaChRLnR5cGUpe2Nhc2UgRC5UZXh0U3RyZWFtOntsZXQgcz1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfYWRkcmVzcyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxCLDBdKSxFPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9zaXplIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLEIsMF0pLGM9bmV3IFVpbnQ4QXJyYXkoQS5IRUFQVTguYnVmZmVyLHMsRSk7aT17ZGF0YTpXdC5kZWNvZGUoYyl9O2JyZWFrfWNhc2UgRC5Kc29uQ29tcGF0aWJsZTp7bGV0IHM9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X2FkZHJlc3MiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAsQiwwXSksRT1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfc2l6ZSIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxCLDBdKSxjPW5ldyBVaW50OEFycmF5KEEuSEVBUFU4LmJ1ZmZlcixzLEUpO2k9SlNPTi5wYXJzZShXdC5kZWNvZGUoYykpO2JyZWFrfWNhc2UgRC5CaW5hcnlTdHJlYW06e2xldCBzPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9hZGRyZXNzIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLEIsMF0pLEU9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X3NpemUiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAsQiwwXSk7aT17ZGF0YTpWdChBLHMsRSl9O2JyZWFrfWNhc2UgRC5UZXh0RmlsZTp7aT17cGF0aDpRLmRhdGEucGF0aCxkYXRhOkEuZnNfcmVhZEZpbGUoUS5kYXRhLnBhdGgse2VuY29kaW5nOiJ1dGY4In0pfTticmVha31jYXNlIEQuQmluYXJ5RmlsZTp7aT17cGF0aDpRLmRhdGEucGF0aCxkYXRhOmRlKEEsUS5kYXRhLnBhdGgpfTticmVha31jYXNlIEQuSW1hZ2U6e2xldCBzPW1BKEEsQik7cy5kYXRhPXAoQSxCLDAscy5pbWFnZVR5cGUuY29tcG9uZW50VHlwZSkscy5kaXJlY3Rpb249cChBLEIsMSxqLkZsb2F0NjQpLHMubWV0YWRhdGE9bmV3IE1hcChzLm1ldGFkYXRhKSxpPXM7YnJlYWt9Y2FzZSBELk1lc2g6e2xldCBzPW1BKEEsQik7cy5udW1iZXJPZlBvaW50cz4wP3MucG9pbnRzPXAoQSxCLDAscy5tZXNoVHlwZS5wb2ludENvbXBvbmVudFR5cGUpOnMucG9pbnRzPUcocy5tZXNoVHlwZS5wb2ludENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxzLm51bWJlck9mQ2VsbHM+MD9zLmNlbGxzPXAoQSxCLDEscy5tZXNoVHlwZS5jZWxsQ29tcG9uZW50VHlwZSk6cy5jZWxscz1HKHMubWVzaFR5cGUuY2VsbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxzLm51bWJlck9mUG9pbnRQaXhlbHM+MD9zLnBvaW50RGF0YT1wKEEsQiwyLHMubWVzaFR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUpOnMucG9pbnREYXRhPUcocy5tZXNoVHlwZS5wb2ludFBpeGVsQ29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLHMubnVtYmVyT2ZDZWxsUGl4ZWxzPjA/cy5jZWxsRGF0YT1wKEEsQiwzLHMubWVzaFR5cGUuY2VsbFBpeGVsQ29tcG9uZW50VHlwZSk6cy5jZWxsRGF0YT1HKHMubWVzaFR5cGUuY2VsbFBpeGVsQ29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLGk9czticmVha31jYXNlIEQuUG9pbnRTZXQ6e2xldCBzPW1BKEEsQik7cy5udW1iZXJPZlBvaW50cz4wP3MucG9pbnRzPXAoQSxCLDAscy5wb2ludFNldFR5cGUucG9pbnRDb21wb25lbnRUeXBlKTpzLnBvaW50cz1HKHMucG9pbnRTZXRUeXBlLnBvaW50Q29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLHMubnVtYmVyT2ZQb2ludFBpeGVscz4wP3MucG9pbnREYXRhPXAoQSxCLDEscy5wb2ludFNldFR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUpOnMucG9pbnREYXRhPUcocy5wb2ludFNldFR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxpPXM7YnJlYWt9Y2FzZSBELlBvbHlEYXRhOntsZXQgcz1tQShBLEIpO3MubnVtYmVyT2ZQb2ludHM+MD9zLnBvaW50cz1wKEEsQiwwLGouRmxvYXQzMik6cy5wb2ludHM9bmV3IEZsb2F0MzJBcnJheSxzLnZlcnRpY2VzQnVmZmVyU2l6ZT4wP3MudmVydGljZXM9cChBLEIsMSxTLlVJbnQzMik6cy52ZXJ0aWNlcz1uZXcgVWludDMyQXJyYXkscy5saW5lc0J1ZmZlclNpemU+MD9zLmxpbmVzPXAoQSxCLDIsUy5VSW50MzIpOnMubGluZXM9bmV3IFVpbnQzMkFycmF5LHMucG9seWdvbnNCdWZmZXJTaXplPjA/cy5wb2x5Z29ucz1wKEEsQiwzLFMuVUludDMyKTpzLnBvbHlnb25zPW5ldyBVaW50MzJBcnJheSxzLnRyaWFuZ2xlU3RyaXBzQnVmZmVyU2l6ZT4wP3MudHJpYW5nbGVTdHJpcHM9cChBLEIsNCxTLlVJbnQzMik6cy50cmlhbmdsZVN0cmlwcz1uZXcgVWludDMyQXJyYXkscy5udW1iZXJPZlBvaW50UGl4ZWxzPjA/cy5wb2ludERhdGE9cChBLEIsNSxzLnBvbHlEYXRhVHlwZS5wb2ludFBpeGVsQ29tcG9uZW50VHlwZSk6cy5wb2ludERhdGE9RyhzLnBvbHlEYXRhVHlwZS5wb2ludFBpeGVsQ29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLHMubnVtYmVyT2ZDZWxsUGl4ZWxzPjA/cy5jZWxsRGF0YT1wKEEsQiw2LHMucG9seURhdGFUeXBlLmNlbGxQaXhlbENvbXBvbmVudFR5cGUpOnMuY2VsbERhdGE9RyhzLnBvbHlEYXRhVHlwZS5jZWxsUGl4ZWxDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSksaT1zO2JyZWFrfWRlZmF1bHQ6dGhyb3cgRXJyb3IoIlVuc3VwcG9ydGVkIG91dHB1dCBJbnRlcmZhY2VUeXBlIil9bGV0IGY9e3R5cGU6US50eXBlLGRhdGE6aX07YS5wdXNoKGYpfSkse3JldHVyblZhbHVlOnIsc3Rkb3V0Om8sc3RkZXJyOm4sb3V0cHV0czphfX12YXIgWHQ9eWU7dmFyIHdlPXR5cGVvZiBnbG9iYWxUaGlzLlNoYXJlZEFycmF5QnVmZmVyPCJ1IjtmdW5jdGlvbiBtZShBLHQpe2lmKEE9PW51bGwpcmV0dXJuW107bGV0IEk9W107Zm9yKGxldCBlPTA7ZTxBLmxlbmd0aDtlKyspe2xldCBnPXBlKEFbZV0sdCk7ZyE9PW51bGwmJkkucHVzaChnKX1yZXR1cm4gSX1mdW5jdGlvbiBwZShBLHQpe2lmKEE9PW51bGwpcmV0dXJuIG51bGw7bGV0IEk9bnVsbDtyZXR1cm4gQS5idWZmZXIhPT12b2lkIDA/ST1BLmJ1ZmZlcjpBLmJ5dGVMZW5ndGghPT12b2lkIDAmJihJPUEpLHdlJiZJIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXI/bnVsbDp0P0k6SS5zbGljZSgwKX12YXIgenQ9bWU7ZnVuY3Rpb24gU2UoQSl7cmV0dXJuW0EuZGF0YSxBLmRpcmVjdGlvbl19dmFyIF90PVNlO2Z1bmN0aW9uIEZlKEEpe3JldHVybltBLnBvaW50cyxBLnBvaW50RGF0YSxBLmNlbGxzLEEuY2VsbERhdGFdfXZhciB2dD1GZTtmdW5jdGlvbiBSZShBKXtyZXR1cm5bQS5wb2ludHMsQS52ZXJ0aWNlcyxBLmxpbmVzLEEucG9seWdvbnMsQS50cmlhbmdsZVN0cmlwcyxBLnBvaW50RGF0YSxBLmNlbGxEYXRhXX12YXIgJHQ9UmU7YXN5bmMgZnVuY3Rpb24gTmUoQSx0LEksZSl7bGV0IGc9WHQoQSx0LEksZSkscj1bXTtyZXR1cm4gZy5vdXRwdXRzLmZvckVhY2goZnVuY3Rpb24obyl7aWYoby50eXBlPT09RC5CaW5hcnlTdHJlYW18fG8udHlwZT09PUQuQmluYXJ5RmlsZSl7bGV0IG49by5kYXRhO3IucHVzaChuKX1lbHNlIGlmKG8udHlwZT09PUQuSW1hZ2Upe2xldCBuPW8uZGF0YTtyLnB1c2goLi4uX3QobikpfWVsc2UgaWYoby50eXBlPT09RC5NZXNoKXtsZXQgbj1vLmRhdGE7ci5wdXNoKC4uLnZ0KG4pKX1lbHNlIGlmKG8udHlwZT09PUQuUG9seURhdGEpe2xldCBuPW8uZGF0YTtyLnB1c2goLi4uJHQobikpfX0pLEZBKGcsenQociwhMCkpfXZhciBBST1OZTt2YXIgVWU9e3J1blBpcGVsaW5lOmFzeW5jIGZ1bmN0aW9uKEEsdCxJLGUsZyxyKXtsZXQgbz1hd2FpdCB4dChBLHQscik7cmV0dXJuIGF3YWl0IEFJKG8sSSxlLGcpfX07aUEoVWUpOyUwQS8qISBCdW5kbGVkIGxpY2Vuc2UgaW5mb3JtYXRpb246JTBBJTBBY29tbGluay9kaXN0L2VzbS9jb21saW5rLm1qczolMEEgICgqKiUwQSAgICogQGxpY2Vuc2UlMEEgICAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMlMEEgICAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wJTBBICAgKiklMEEqLyUwQSc7QnQobHQpO2V4cG9ydHt3IGFzIGdldERlZmF1bHRXZWJXb3JrZXIsZCBhcyBnZXRQaXBlbGluZVdvcmtlclVybCxoIGFzIGdldFBpcGVsaW5lc0Jhc2VVcmwsWHIgYXMgaGRmNVJlYWRUcmFuc2Zvcm0sQW8gYXMgaGRmNVdyaXRlVHJhbnNmb3JtLHRvIGFzIG1hdFJlYWRUcmFuc2Zvcm0sb28gYXMgbWF0V3JpdGVUcmFuc2Zvcm0saW8gYXMgbW5jUmVhZFRyYW5zZm9ybSxzbyBhcyBtbmNXcml0ZVRyYW5zZm9ybSxocyBhcyBzZXREZWZhdWx0V2ViV29ya2VyLEJ0IGFzIHNldFBpcGVsaW5lV29ya2VyVXJsLHVzIGFzIHNldFBpcGVsaW5lc0Jhc2VVcmwsZ28gYXMgdHh0UmVhZFRyYW5zZm9ybSxDbyBhcyB0eHRXcml0ZVRyYW5zZm9ybSxiQSBhcyB2ZXJzaW9uLGZvIGFzIHdhc21SZWFkVHJhbnNmb3JtLHVvIGFzIHdhc21Xcml0ZVRyYW5zZm9ybSxRbyBhcyB3YXNtWnN0ZFJlYWRUcmFuc2Zvcm0sbW8gYXMgd2FzbVpzdGRXcml0ZVRyYW5zZm9ybX07Ci8qISBCdW5kbGVkIGxpY2Vuc2UgaW5mb3JtYXRpb246Cgpjb21saW5rL2Rpc3QvZXNtL2NvbWxpbmsubWpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQwogICAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiAgICopCiovCg==""" +default_config = JsPackageConfig(default_js_module) +js_package = JsPackage(default_config) diff --git a/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/mat_read_transform_async.py b/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/mat_read_transform_async.py new file mode 100644 index 000000000..6e23089cd --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/mat_read_transform_async.py @@ -0,0 +1,60 @@ +# Generated file. To retain edits, remove this comment. + +from pathlib import Path +import os +from typing import Dict, Tuple, Optional, List, Any + +from .js_package import js_package + +from itkwasm.pyodide import ( + to_js, + to_py, + js_resources +) +from itkwasm import ( + InterfaceTypes, + BinaryFile, + Transform, +) + +async def mat_read_transform_async( + serialized_transform: os.PathLike, + float_parameters: bool = False, +) -> Tuple[Any, Transform]: + """Read an transform file format and convert it to the ITK-Wasm transform file format + + :param serialized_transform: Input transform serialized in the file format + :type serialized_transform: os.PathLike + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :return: Whether the input could be read. If false, the output transform is not valid. + :rtype: Any + + :return: Output transform + :rtype: Transform + """ + js_module = await js_package.js_module + web_worker = js_resources.web_worker + + kwargs = {} + if float_parameters: + kwargs["floatParameters"] = to_js(float_parameters) + + outputs = await js_module.matReadTransform(to_js(BinaryFile(serialized_transform)), webWorker=web_worker, noCopy=True, **kwargs) + + output_web_worker = None + output_list = [] + outputs_object_map = outputs.as_object_map() + for output_name in outputs.object_keys(): + if output_name == 'webWorker': + output_web_worker = outputs_object_map[output_name] + else: + output_list.append(to_py(outputs_object_map[output_name])) + + js_resources.web_worker = output_web_worker + + if len(output_list) == 1: + return output_list[0] + return tuple(output_list) diff --git a/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/mat_write_transform_async.py b/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/mat_write_transform_async.py new file mode 100644 index 000000000..87fbb2997 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/mat_write_transform_async.py @@ -0,0 +1,67 @@ +# Generated file. To retain edits, remove this comment. + +from pathlib import Path +import os +from typing import Dict, Tuple, Optional, List, Any + +from .js_package import js_package + +from itkwasm.pyodide import ( + to_js, + to_py, + js_resources +) +from itkwasm import ( + InterfaceTypes, + Transform, + BinaryFile, +) + +async def mat_write_transform_async( + transform: Transform, + serialized_transform: str, + float_parameters: bool = False, + use_compression: bool = False, +) -> Tuple[Any]: + """Write an ITK-Wasm transform file format converted to a transform file format + + :param transform: Input transform + :type transform: Transform + + :param serialized_transform: Output transform serialized in the file format. + :type serialized_transform: str + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :param use_compression: Use compression in the written file + :type use_compression: bool + + :return: Whether the input could be written. If false, the output transform is not valid. + :rtype: Any + """ + js_module = await js_package.js_module + web_worker = js_resources.web_worker + + kwargs = {} + if float_parameters: + kwargs["floatParameters"] = to_js(float_parameters) + if use_compression: + kwargs["useCompression"] = to_js(use_compression) + + outputs = await js_module.matWriteTransform(to_js(transform), to_js(serialized_transform), webWorker=web_worker, noCopy=True, **kwargs) + + output_web_worker = None + output_list = [] + outputs_object_map = outputs.as_object_map() + for output_name in outputs.object_keys(): + if output_name == 'webWorker': + output_web_worker = outputs_object_map[output_name] + else: + output_list.append(to_py(outputs_object_map[output_name])) + + js_resources.web_worker = output_web_worker + + if len(output_list) == 1: + return output_list[0] + return tuple(output_list) diff --git a/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/mnc_read_transform_async.py b/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/mnc_read_transform_async.py new file mode 100644 index 000000000..9caae4a7a --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/mnc_read_transform_async.py @@ -0,0 +1,60 @@ +# Generated file. To retain edits, remove this comment. + +from pathlib import Path +import os +from typing import Dict, Tuple, Optional, List, Any + +from .js_package import js_package + +from itkwasm.pyodide import ( + to_js, + to_py, + js_resources +) +from itkwasm import ( + InterfaceTypes, + BinaryFile, + Transform, +) + +async def mnc_read_transform_async( + serialized_transform: os.PathLike, + float_parameters: bool = False, +) -> Tuple[Any, Transform]: + """Read an transform file format and convert it to the ITK-Wasm transform file format + + :param serialized_transform: Input transform serialized in the file format + :type serialized_transform: os.PathLike + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :return: Whether the input could be read. If false, the output transform is not valid. + :rtype: Any + + :return: Output transform + :rtype: Transform + """ + js_module = await js_package.js_module + web_worker = js_resources.web_worker + + kwargs = {} + if float_parameters: + kwargs["floatParameters"] = to_js(float_parameters) + + outputs = await js_module.mncReadTransform(to_js(BinaryFile(serialized_transform)), webWorker=web_worker, noCopy=True, **kwargs) + + output_web_worker = None + output_list = [] + outputs_object_map = outputs.as_object_map() + for output_name in outputs.object_keys(): + if output_name == 'webWorker': + output_web_worker = outputs_object_map[output_name] + else: + output_list.append(to_py(outputs_object_map[output_name])) + + js_resources.web_worker = output_web_worker + + if len(output_list) == 1: + return output_list[0] + return tuple(output_list) diff --git a/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/mnc_write_transform_async.py b/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/mnc_write_transform_async.py new file mode 100644 index 000000000..bf8994af6 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/mnc_write_transform_async.py @@ -0,0 +1,67 @@ +# Generated file. To retain edits, remove this comment. + +from pathlib import Path +import os +from typing import Dict, Tuple, Optional, List, Any + +from .js_package import js_package + +from itkwasm.pyodide import ( + to_js, + to_py, + js_resources +) +from itkwasm import ( + InterfaceTypes, + Transform, + BinaryFile, +) + +async def mnc_write_transform_async( + transform: Transform, + serialized_transform: str, + float_parameters: bool = False, + use_compression: bool = False, +) -> Tuple[Any]: + """Write an ITK-Wasm transform file format converted to a transform file format + + :param transform: Input transform + :type transform: Transform + + :param serialized_transform: Output transform serialized in the file format. + :type serialized_transform: str + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :param use_compression: Use compression in the written file + :type use_compression: bool + + :return: Whether the input could be written. If false, the output transform is not valid. + :rtype: Any + """ + js_module = await js_package.js_module + web_worker = js_resources.web_worker + + kwargs = {} + if float_parameters: + kwargs["floatParameters"] = to_js(float_parameters) + if use_compression: + kwargs["useCompression"] = to_js(use_compression) + + outputs = await js_module.mncWriteTransform(to_js(transform), to_js(serialized_transform), webWorker=web_worker, noCopy=True, **kwargs) + + output_web_worker = None + output_list = [] + outputs_object_map = outputs.as_object_map() + for output_name in outputs.object_keys(): + if output_name == 'webWorker': + output_web_worker = outputs_object_map[output_name] + else: + output_list.append(to_py(outputs_object_map[output_name])) + + js_resources.web_worker = output_web_worker + + if len(output_list) == 1: + return output_list[0] + return tuple(output_list) diff --git a/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/txt_read_transform_async.py b/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/txt_read_transform_async.py new file mode 100644 index 000000000..f9a7e30fd --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/txt_read_transform_async.py @@ -0,0 +1,60 @@ +# Generated file. To retain edits, remove this comment. + +from pathlib import Path +import os +from typing import Dict, Tuple, Optional, List, Any + +from .js_package import js_package + +from itkwasm.pyodide import ( + to_js, + to_py, + js_resources +) +from itkwasm import ( + InterfaceTypes, + BinaryFile, + Transform, +) + +async def txt_read_transform_async( + serialized_transform: os.PathLike, + float_parameters: bool = False, +) -> Tuple[Any, Transform]: + """Read an transform file format and convert it to the ITK-Wasm transform file format + + :param serialized_transform: Input transform serialized in the file format + :type serialized_transform: os.PathLike + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :return: Whether the input could be read. If false, the output transform is not valid. + :rtype: Any + + :return: Output transform + :rtype: Transform + """ + js_module = await js_package.js_module + web_worker = js_resources.web_worker + + kwargs = {} + if float_parameters: + kwargs["floatParameters"] = to_js(float_parameters) + + outputs = await js_module.txtReadTransform(to_js(BinaryFile(serialized_transform)), webWorker=web_worker, noCopy=True, **kwargs) + + output_web_worker = None + output_list = [] + outputs_object_map = outputs.as_object_map() + for output_name in outputs.object_keys(): + if output_name == 'webWorker': + output_web_worker = outputs_object_map[output_name] + else: + output_list.append(to_py(outputs_object_map[output_name])) + + js_resources.web_worker = output_web_worker + + if len(output_list) == 1: + return output_list[0] + return tuple(output_list) diff --git a/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/txt_write_transform_async.py b/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/txt_write_transform_async.py new file mode 100644 index 000000000..6e772edae --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/txt_write_transform_async.py @@ -0,0 +1,67 @@ +# Generated file. To retain edits, remove this comment. + +from pathlib import Path +import os +from typing import Dict, Tuple, Optional, List, Any + +from .js_package import js_package + +from itkwasm.pyodide import ( + to_js, + to_py, + js_resources +) +from itkwasm import ( + InterfaceTypes, + Transform, + BinaryFile, +) + +async def txt_write_transform_async( + transform: Transform, + serialized_transform: str, + float_parameters: bool = False, + use_compression: bool = False, +) -> Tuple[Any]: + """Write an ITK-Wasm transform file format converted to a transform file format + + :param transform: Input transform + :type transform: Transform + + :param serialized_transform: Output transform serialized in the file format. + :type serialized_transform: str + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :param use_compression: Use compression in the written file + :type use_compression: bool + + :return: Whether the input could be written. If false, the output transform is not valid. + :rtype: Any + """ + js_module = await js_package.js_module + web_worker = js_resources.web_worker + + kwargs = {} + if float_parameters: + kwargs["floatParameters"] = to_js(float_parameters) + if use_compression: + kwargs["useCompression"] = to_js(use_compression) + + outputs = await js_module.txtWriteTransform(to_js(transform), to_js(serialized_transform), webWorker=web_worker, noCopy=True, **kwargs) + + output_web_worker = None + output_list = [] + outputs_object_map = outputs.as_object_map() + for output_name in outputs.object_keys(): + if output_name == 'webWorker': + output_web_worker = outputs_object_map[output_name] + else: + output_list.append(to_py(outputs_object_map[output_name])) + + js_resources.web_worker = output_web_worker + + if len(output_list) == 1: + return output_list[0] + return tuple(output_list) diff --git a/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/wasm_read_transform_async.py b/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/wasm_read_transform_async.py new file mode 100644 index 000000000..16474e99d --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/wasm_read_transform_async.py @@ -0,0 +1,60 @@ +# Generated file. To retain edits, remove this comment. + +from pathlib import Path +import os +from typing import Dict, Tuple, Optional, List, Any + +from .js_package import js_package + +from itkwasm.pyodide import ( + to_js, + to_py, + js_resources +) +from itkwasm import ( + InterfaceTypes, + BinaryFile, + Transform, +) + +async def wasm_read_transform_async( + serialized_transform: os.PathLike, + float_parameters: bool = False, +) -> Tuple[Any, Transform]: + """Read an transform file format and convert it to the ITK-Wasm transform file format + + :param serialized_transform: Input transform serialized in the file format + :type serialized_transform: os.PathLike + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :return: Whether the input could be read. If false, the output transform is not valid. + :rtype: Any + + :return: Output transform + :rtype: Transform + """ + js_module = await js_package.js_module + web_worker = js_resources.web_worker + + kwargs = {} + if float_parameters: + kwargs["floatParameters"] = to_js(float_parameters) + + outputs = await js_module.wasmReadTransform(to_js(BinaryFile(serialized_transform)), webWorker=web_worker, noCopy=True, **kwargs) + + output_web_worker = None + output_list = [] + outputs_object_map = outputs.as_object_map() + for output_name in outputs.object_keys(): + if output_name == 'webWorker': + output_web_worker = outputs_object_map[output_name] + else: + output_list.append(to_py(outputs_object_map[output_name])) + + js_resources.web_worker = output_web_worker + + if len(output_list) == 1: + return output_list[0] + return tuple(output_list) diff --git a/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/wasm_write_transform_async.py b/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/wasm_write_transform_async.py new file mode 100644 index 000000000..a0925e9e0 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/wasm_write_transform_async.py @@ -0,0 +1,67 @@ +# Generated file. To retain edits, remove this comment. + +from pathlib import Path +import os +from typing import Dict, Tuple, Optional, List, Any + +from .js_package import js_package + +from itkwasm.pyodide import ( + to_js, + to_py, + js_resources +) +from itkwasm import ( + InterfaceTypes, + Transform, + BinaryFile, +) + +async def wasm_write_transform_async( + transform: Transform, + serialized_transform: str, + float_parameters: bool = False, + use_compression: bool = False, +) -> Tuple[Any]: + """Write an ITK-Wasm transform file format converted to a transform file format + + :param transform: Input transform + :type transform: Transform + + :param serialized_transform: Output transform serialized in the file format. + :type serialized_transform: str + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :param use_compression: Use compression in the written file + :type use_compression: bool + + :return: Whether the input could be written. If false, the output transform is not valid. + :rtype: Any + """ + js_module = await js_package.js_module + web_worker = js_resources.web_worker + + kwargs = {} + if float_parameters: + kwargs["floatParameters"] = to_js(float_parameters) + if use_compression: + kwargs["useCompression"] = to_js(use_compression) + + outputs = await js_module.wasmWriteTransform(to_js(transform), to_js(serialized_transform), webWorker=web_worker, noCopy=True, **kwargs) + + output_web_worker = None + output_list = [] + outputs_object_map = outputs.as_object_map() + for output_name in outputs.object_keys(): + if output_name == 'webWorker': + output_web_worker = outputs_object_map[output_name] + else: + output_list.append(to_py(outputs_object_map[output_name])) + + js_resources.web_worker = output_web_worker + + if len(output_list) == 1: + return output_list[0] + return tuple(output_list) diff --git a/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/wasm_zstd_read_transform_async.py b/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/wasm_zstd_read_transform_async.py new file mode 100644 index 000000000..1174b84dd --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/wasm_zstd_read_transform_async.py @@ -0,0 +1,60 @@ +# Generated file. To retain edits, remove this comment. + +from pathlib import Path +import os +from typing import Dict, Tuple, Optional, List, Any + +from .js_package import js_package + +from itkwasm.pyodide import ( + to_js, + to_py, + js_resources +) +from itkwasm import ( + InterfaceTypes, + BinaryFile, + Transform, +) + +async def wasm_zstd_read_transform_async( + serialized_transform: os.PathLike, + float_parameters: bool = False, +) -> Tuple[Any, Transform]: + """Read an transform file format and convert it to the ITK-Wasm transform file format + + :param serialized_transform: Input transform serialized in the file format + :type serialized_transform: os.PathLike + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :return: Whether the input could be read. If false, the output transform is not valid. + :rtype: Any + + :return: Output transform + :rtype: Transform + """ + js_module = await js_package.js_module + web_worker = js_resources.web_worker + + kwargs = {} + if float_parameters: + kwargs["floatParameters"] = to_js(float_parameters) + + outputs = await js_module.wasmZstdReadTransform(to_js(BinaryFile(serialized_transform)), webWorker=web_worker, noCopy=True, **kwargs) + + output_web_worker = None + output_list = [] + outputs_object_map = outputs.as_object_map() + for output_name in outputs.object_keys(): + if output_name == 'webWorker': + output_web_worker = outputs_object_map[output_name] + else: + output_list.append(to_py(outputs_object_map[output_name])) + + js_resources.web_worker = output_web_worker + + if len(output_list) == 1: + return output_list[0] + return tuple(output_list) diff --git a/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/wasm_zstd_write_transform_async.py b/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/wasm_zstd_write_transform_async.py new file mode 100644 index 000000000..f97692c98 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-emscripten/itkwasm_transform_io_emscripten/wasm_zstd_write_transform_async.py @@ -0,0 +1,67 @@ +# Generated file. To retain edits, remove this comment. + +from pathlib import Path +import os +from typing import Dict, Tuple, Optional, List, Any + +from .js_package import js_package + +from itkwasm.pyodide import ( + to_js, + to_py, + js_resources +) +from itkwasm import ( + InterfaceTypes, + Transform, + BinaryFile, +) + +async def wasm_zstd_write_transform_async( + transform: Transform, + serialized_transform: str, + float_parameters: bool = False, + use_compression: bool = False, +) -> Tuple[Any]: + """Write an ITK-Wasm transform file format converted to a transform file format + + :param transform: Input transform + :type transform: Transform + + :param serialized_transform: Output transform serialized in the file format. + :type serialized_transform: str + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :param use_compression: Use compression in the written file + :type use_compression: bool + + :return: Whether the input could be written. If false, the output transform is not valid. + :rtype: Any + """ + js_module = await js_package.js_module + web_worker = js_resources.web_worker + + kwargs = {} + if float_parameters: + kwargs["floatParameters"] = to_js(float_parameters) + if use_compression: + kwargs["useCompression"] = to_js(use_compression) + + outputs = await js_module.wasmZstdWriteTransform(to_js(transform), to_js(serialized_transform), webWorker=web_worker, noCopy=True, **kwargs) + + output_web_worker = None + output_list = [] + outputs_object_map = outputs.as_object_map() + for output_name in outputs.object_keys(): + if output_name == 'webWorker': + output_web_worker = outputs_object_map[output_name] + else: + output_list.append(to_py(outputs_object_map[output_name])) + + js_resources.web_worker = output_web_worker + + if len(output_list) == 1: + return output_list[0] + return tuple(output_list) diff --git a/packages/transform-io/python/itkwasm-transform-io-emscripten/pyproject.toml b/packages/transform-io/python/itkwasm-transform-io-emscripten/pyproject.toml new file mode 100644 index 000000000..772c2d9ee --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-emscripten/pyproject.toml @@ -0,0 +1,74 @@ +[build-system] +requires = ["hatchling", "hatch-vcs"] +build-backend = "hatchling.build" + +[project] +name = "itkwasm-transform-io-emscripten" +readme = "README.md" +license = "Apache-2.0" +dynamic = ["version"] +description = "Input and output for scientific and medical coordinate transform file formats." +classifiers = [ + "License :: OSI Approved :: Apache Software License", + "Programming Language :: Python", + "Programming Language :: C++", + "Environment :: WebAssembly", + "Environment :: WebAssembly :: Emscripten", + "Environment :: WebAssembly :: WASI", + "Development Status :: 3 - Alpha", + "Intended Audience :: Developers", + "Intended Audience :: Science/Research", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", +] +keywords = [ + "itkwasm", + "webassembly", + "emscripten", +] + +requires-python = ">=3.8" +dependencies = [ + "itkwasm >= 1.0.b171", +] + +[tool.hatch.version] +path = "itkwasm_transform_io_emscripten/_version.py" + +[tool.hatch.envs.default] +dependencies = [ + "pytest", + "pytest-pyodide", +] + +[project.urls] +Home = "https://github.com/InsightSoftwareConsortium/ITK-Wasm" +Source = "https://github.com/InsightSoftwareConsortium/ITK-Wasm" + +[tool.hatch.envs.default.scripts] +test = [ + "hatch build -t wheel ./dist/pyodide/", + "pytest --dist-dir=./dist/pyodide --rt=chrome", +] +download-pyodide = [ + "curl -L https://github.com/pyodide/pyodide/releases/download/0.25.1/pyodide-0.25.1.tar.bz2 -o pyodide.tar.bz2", + "tar xjf pyodide.tar.bz2", + "rm -rf dist/pyodide pyodide.tar.bz2", + "mkdir -p dist", + "mv pyodide dist", +] +serve = [ + "hatch build -t wheel ./dist/pyodide/", + 'echo "Visit http://localhost:8877/console.html"', + "python -m http.server --directory=./dist/pyodide 8877", +] + + +[tool.hatch.build] +exclude = [ + "/examples", +] diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/README.md b/packages/transform-io/python/itkwasm-transform-io-wasi/README.md new file mode 100644 index 000000000..d01a7bf0a --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-wasi/README.md @@ -0,0 +1,26 @@ +# itkwasm-transform-io-wasi + +[![PyPI version](https://badge.fury.io/py/itkwasm-transform-io-wasi.svg)](https://badge.fury.io/py/itkwasm-transform-io-wasi) + +Input and output for scientific and medical coordinate transform file formats. WASI implementation. + +This package provides the WASI WebAssembly implementation. It is usually not called directly. Please use [`itkwasm-transform-io`](https://pypi.org/project/itkwasm-transform-io/) instead. + + +## Installation + +```sh +pip install itkwasm-transform-io-wasi +``` + +## Development + +```sh +pip install pytest +pip install -e . +pytest + +# or +pip install hatch +hatch run test +``` diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/__init__.py b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/__init__.py new file mode 100644 index 000000000..443124ad4 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/__init__.py @@ -0,0 +1,18 @@ +# Generated file. To retain edits, remove this comment. + +"""itkwasm-transform-io-wasi: Input and output for scientific and medical coordinate transform file formats. WASI implementation.""" + +from .hdf5_read_transform import hdf5_read_transform +from .hdf5_write_transform import hdf5_write_transform +from .mat_read_transform import mat_read_transform +from .mat_write_transform import mat_write_transform +from .mnc_read_transform import mnc_read_transform +from .mnc_write_transform import mnc_write_transform +from .txt_read_transform import txt_read_transform +from .txt_write_transform import txt_write_transform +from .wasm_read_transform import wasm_read_transform +from .wasm_write_transform import wasm_write_transform +from .wasm_zstd_read_transform import wasm_zstd_read_transform +from .wasm_zstd_write_transform import wasm_zstd_write_transform + +from ._version import __version__ diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/_version.py b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/_version.py new file mode 100644 index 000000000..3dc1f76bc --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/_version.py @@ -0,0 +1 @@ +__version__ = "0.1.0" diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/hdf5_read_transform.py b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/hdf5_read_transform.py new file mode 100644 index 000000000..4448f76dd --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/hdf5_read_transform.py @@ -0,0 +1,76 @@ +# Generated file. To retain edits, remove this comment. + +from pathlib import Path, PurePosixPath +import os +from typing import Dict, Tuple, Optional, List, Any + +from importlib_resources import files as file_resources + +_pipeline = None + +from itkwasm import ( + InterfaceTypes, + PipelineOutput, + PipelineInput, + Pipeline, + BinaryFile, + Transform, +) + +def hdf5_read_transform( + serialized_transform: os.PathLike, + float_parameters: bool = False, +) -> Tuple[Any, Transform]: + """Read an transform file format and convert it to the ITK-Wasm transform file format + + :param serialized_transform: Input transform serialized in the file format + :type serialized_transform: os.PathLike + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :return: Whether the input could be read. If false, the output transform is not valid. + :rtype: Any + + :return: Output transform + :rtype: Transform + """ + global _pipeline + if _pipeline is None: + _pipeline = Pipeline(file_resources('itkwasm_transform_io_wasi').joinpath(Path('wasm_modules') / Path('hdf5-read-transform.wasi.wasm'))) + + pipeline_outputs: List[PipelineOutput] = [ + PipelineOutput(InterfaceTypes.JsonCompatible), + PipelineOutput(InterfaceTypes.Transform), + ] + + pipeline_inputs: List[PipelineInput] = [ + PipelineInput(InterfaceTypes.BinaryFile, BinaryFile(PurePosixPath(serialized_transform))), + ] + + args: List[str] = ['--memory-io',] + # Inputs + if not Path(serialized_transform).exists(): + raise FileNotFoundError("serialized_transform does not exist") + args.append(str(PurePosixPath(serialized_transform))) + # Outputs + could_read_name = '0' + args.append(could_read_name) + + transform_name = '1' + args.append(transform_name) + + # Options + input_count = len(pipeline_inputs) + if float_parameters: + args.append('--float-parameters') + + + outputs = _pipeline.run(args, pipeline_outputs, pipeline_inputs) + + result = ( + outputs[0].data, + outputs[1].data, + ) + return result + diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/hdf5_write_transform.py b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/hdf5_write_transform.py new file mode 100644 index 000000000..96ee8b4ce --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/hdf5_write_transform.py @@ -0,0 +1,79 @@ +# Generated file. To retain edits, remove this comment. + +from pathlib import Path, PurePosixPath +import os +from typing import Dict, Tuple, Optional, List, Any + +from importlib_resources import files as file_resources + +_pipeline = None + +from itkwasm import ( + InterfaceTypes, + PipelineOutput, + PipelineInput, + Pipeline, + Transform, + BinaryFile, +) + +def hdf5_write_transform( + transform: Transform, + serialized_transform: str, + float_parameters: bool = False, + use_compression: bool = False, +) -> Tuple[Any]: + """Write an ITK-Wasm transform file format converted to a transform file format + + :param transform: Input transform + :type transform: Transform + + :param serialized_transform: Output transform serialized in the file format. + :type serialized_transform: str + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :param use_compression: Use compression in the written file + :type use_compression: bool + + :return: Whether the input could be written. If false, the output transform is not valid. + :rtype: Any + """ + global _pipeline + if _pipeline is None: + _pipeline = Pipeline(file_resources('itkwasm_transform_io_wasi').joinpath(Path('wasm_modules') / Path('hdf5-write-transform.wasi.wasm'))) + + pipeline_outputs: List[PipelineOutput] = [ + PipelineOutput(InterfaceTypes.JsonCompatible), + PipelineOutput(InterfaceTypes.BinaryFile, BinaryFile(PurePosixPath(serialized_transform))), + ] + + pipeline_inputs: List[PipelineInput] = [ + PipelineInput(InterfaceTypes.Transform, transform), + ] + + args: List[str] = ['--memory-io',] + # Inputs + args.append('0') + # Outputs + could_write_name = '0' + args.append(could_write_name) + + serialized_transform_name = str(PurePosixPath(serialized_transform)) + args.append(serialized_transform_name) + + # Options + input_count = len(pipeline_inputs) + if float_parameters: + args.append('--float-parameters') + + if use_compression: + args.append('--use-compression') + + + outputs = _pipeline.run(args, pipeline_outputs, pipeline_inputs) + + result = outputs[0].data + return result + diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/mat_read_transform.py b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/mat_read_transform.py new file mode 100644 index 000000000..cf6c8827a --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/mat_read_transform.py @@ -0,0 +1,76 @@ +# Generated file. To retain edits, remove this comment. + +from pathlib import Path, PurePosixPath +import os +from typing import Dict, Tuple, Optional, List, Any + +from importlib_resources import files as file_resources + +_pipeline = None + +from itkwasm import ( + InterfaceTypes, + PipelineOutput, + PipelineInput, + Pipeline, + BinaryFile, + Transform, +) + +def mat_read_transform( + serialized_transform: os.PathLike, + float_parameters: bool = False, +) -> Tuple[Any, Transform]: + """Read an transform file format and convert it to the ITK-Wasm transform file format + + :param serialized_transform: Input transform serialized in the file format + :type serialized_transform: os.PathLike + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :return: Whether the input could be read. If false, the output transform is not valid. + :rtype: Any + + :return: Output transform + :rtype: Transform + """ + global _pipeline + if _pipeline is None: + _pipeline = Pipeline(file_resources('itkwasm_transform_io_wasi').joinpath(Path('wasm_modules') / Path('mat-read-transform.wasi.wasm'))) + + pipeline_outputs: List[PipelineOutput] = [ + PipelineOutput(InterfaceTypes.JsonCompatible), + PipelineOutput(InterfaceTypes.Transform), + ] + + pipeline_inputs: List[PipelineInput] = [ + PipelineInput(InterfaceTypes.BinaryFile, BinaryFile(PurePosixPath(serialized_transform))), + ] + + args: List[str] = ['--memory-io',] + # Inputs + if not Path(serialized_transform).exists(): + raise FileNotFoundError("serialized_transform does not exist") + args.append(str(PurePosixPath(serialized_transform))) + # Outputs + could_read_name = '0' + args.append(could_read_name) + + transform_name = '1' + args.append(transform_name) + + # Options + input_count = len(pipeline_inputs) + if float_parameters: + args.append('--float-parameters') + + + outputs = _pipeline.run(args, pipeline_outputs, pipeline_inputs) + + result = ( + outputs[0].data, + outputs[1].data, + ) + return result + diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/mat_write_transform.py b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/mat_write_transform.py new file mode 100644 index 000000000..b3f8eddb3 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/mat_write_transform.py @@ -0,0 +1,79 @@ +# Generated file. To retain edits, remove this comment. + +from pathlib import Path, PurePosixPath +import os +from typing import Dict, Tuple, Optional, List, Any + +from importlib_resources import files as file_resources + +_pipeline = None + +from itkwasm import ( + InterfaceTypes, + PipelineOutput, + PipelineInput, + Pipeline, + Transform, + BinaryFile, +) + +def mat_write_transform( + transform: Transform, + serialized_transform: str, + float_parameters: bool = False, + use_compression: bool = False, +) -> Tuple[Any]: + """Write an ITK-Wasm transform file format converted to a transform file format + + :param transform: Input transform + :type transform: Transform + + :param serialized_transform: Output transform serialized in the file format. + :type serialized_transform: str + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :param use_compression: Use compression in the written file + :type use_compression: bool + + :return: Whether the input could be written. If false, the output transform is not valid. + :rtype: Any + """ + global _pipeline + if _pipeline is None: + _pipeline = Pipeline(file_resources('itkwasm_transform_io_wasi').joinpath(Path('wasm_modules') / Path('mat-write-transform.wasi.wasm'))) + + pipeline_outputs: List[PipelineOutput] = [ + PipelineOutput(InterfaceTypes.JsonCompatible), + PipelineOutput(InterfaceTypes.BinaryFile, BinaryFile(PurePosixPath(serialized_transform))), + ] + + pipeline_inputs: List[PipelineInput] = [ + PipelineInput(InterfaceTypes.Transform, transform), + ] + + args: List[str] = ['--memory-io',] + # Inputs + args.append('0') + # Outputs + could_write_name = '0' + args.append(could_write_name) + + serialized_transform_name = str(PurePosixPath(serialized_transform)) + args.append(serialized_transform_name) + + # Options + input_count = len(pipeline_inputs) + if float_parameters: + args.append('--float-parameters') + + if use_compression: + args.append('--use-compression') + + + outputs = _pipeline.run(args, pipeline_outputs, pipeline_inputs) + + result = outputs[0].data + return result + diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/mnc_read_transform.py b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/mnc_read_transform.py new file mode 100644 index 000000000..ddb4b056f --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/mnc_read_transform.py @@ -0,0 +1,76 @@ +# Generated file. To retain edits, remove this comment. + +from pathlib import Path, PurePosixPath +import os +from typing import Dict, Tuple, Optional, List, Any + +from importlib_resources import files as file_resources + +_pipeline = None + +from itkwasm import ( + InterfaceTypes, + PipelineOutput, + PipelineInput, + Pipeline, + BinaryFile, + Transform, +) + +def mnc_read_transform( + serialized_transform: os.PathLike, + float_parameters: bool = False, +) -> Tuple[Any, Transform]: + """Read an transform file format and convert it to the ITK-Wasm transform file format + + :param serialized_transform: Input transform serialized in the file format + :type serialized_transform: os.PathLike + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :return: Whether the input could be read. If false, the output transform is not valid. + :rtype: Any + + :return: Output transform + :rtype: Transform + """ + global _pipeline + if _pipeline is None: + _pipeline = Pipeline(file_resources('itkwasm_transform_io_wasi').joinpath(Path('wasm_modules') / Path('mnc-read-transform.wasi.wasm'))) + + pipeline_outputs: List[PipelineOutput] = [ + PipelineOutput(InterfaceTypes.JsonCompatible), + PipelineOutput(InterfaceTypes.Transform), + ] + + pipeline_inputs: List[PipelineInput] = [ + PipelineInput(InterfaceTypes.BinaryFile, BinaryFile(PurePosixPath(serialized_transform))), + ] + + args: List[str] = ['--memory-io',] + # Inputs + if not Path(serialized_transform).exists(): + raise FileNotFoundError("serialized_transform does not exist") + args.append(str(PurePosixPath(serialized_transform))) + # Outputs + could_read_name = '0' + args.append(could_read_name) + + transform_name = '1' + args.append(transform_name) + + # Options + input_count = len(pipeline_inputs) + if float_parameters: + args.append('--float-parameters') + + + outputs = _pipeline.run(args, pipeline_outputs, pipeline_inputs) + + result = ( + outputs[0].data, + outputs[1].data, + ) + return result + diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/mnc_write_transform.py b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/mnc_write_transform.py new file mode 100644 index 000000000..0a94c4978 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/mnc_write_transform.py @@ -0,0 +1,79 @@ +# Generated file. To retain edits, remove this comment. + +from pathlib import Path, PurePosixPath +import os +from typing import Dict, Tuple, Optional, List, Any + +from importlib_resources import files as file_resources + +_pipeline = None + +from itkwasm import ( + InterfaceTypes, + PipelineOutput, + PipelineInput, + Pipeline, + Transform, + BinaryFile, +) + +def mnc_write_transform( + transform: Transform, + serialized_transform: str, + float_parameters: bool = False, + use_compression: bool = False, +) -> Tuple[Any]: + """Write an ITK-Wasm transform file format converted to a transform file format + + :param transform: Input transform + :type transform: Transform + + :param serialized_transform: Output transform serialized in the file format. + :type serialized_transform: str + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :param use_compression: Use compression in the written file + :type use_compression: bool + + :return: Whether the input could be written. If false, the output transform is not valid. + :rtype: Any + """ + global _pipeline + if _pipeline is None: + _pipeline = Pipeline(file_resources('itkwasm_transform_io_wasi').joinpath(Path('wasm_modules') / Path('mnc-write-transform.wasi.wasm'))) + + pipeline_outputs: List[PipelineOutput] = [ + PipelineOutput(InterfaceTypes.JsonCompatible), + PipelineOutput(InterfaceTypes.BinaryFile, BinaryFile(PurePosixPath(serialized_transform))), + ] + + pipeline_inputs: List[PipelineInput] = [ + PipelineInput(InterfaceTypes.Transform, transform), + ] + + args: List[str] = ['--memory-io',] + # Inputs + args.append('0') + # Outputs + could_write_name = '0' + args.append(could_write_name) + + serialized_transform_name = str(PurePosixPath(serialized_transform)) + args.append(serialized_transform_name) + + # Options + input_count = len(pipeline_inputs) + if float_parameters: + args.append('--float-parameters') + + if use_compression: + args.append('--use-compression') + + + outputs = _pipeline.run(args, pipeline_outputs, pipeline_inputs) + + result = outputs[0].data + return result + diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/txt_read_transform.py b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/txt_read_transform.py new file mode 100644 index 000000000..2b3c2e880 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/txt_read_transform.py @@ -0,0 +1,76 @@ +# Generated file. To retain edits, remove this comment. + +from pathlib import Path, PurePosixPath +import os +from typing import Dict, Tuple, Optional, List, Any + +from importlib_resources import files as file_resources + +_pipeline = None + +from itkwasm import ( + InterfaceTypes, + PipelineOutput, + PipelineInput, + Pipeline, + BinaryFile, + Transform, +) + +def txt_read_transform( + serialized_transform: os.PathLike, + float_parameters: bool = False, +) -> Tuple[Any, Transform]: + """Read an transform file format and convert it to the ITK-Wasm transform file format + + :param serialized_transform: Input transform serialized in the file format + :type serialized_transform: os.PathLike + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :return: Whether the input could be read. If false, the output transform is not valid. + :rtype: Any + + :return: Output transform + :rtype: Transform + """ + global _pipeline + if _pipeline is None: + _pipeline = Pipeline(file_resources('itkwasm_transform_io_wasi').joinpath(Path('wasm_modules') / Path('txt-read-transform.wasi.wasm'))) + + pipeline_outputs: List[PipelineOutput] = [ + PipelineOutput(InterfaceTypes.JsonCompatible), + PipelineOutput(InterfaceTypes.Transform), + ] + + pipeline_inputs: List[PipelineInput] = [ + PipelineInput(InterfaceTypes.BinaryFile, BinaryFile(PurePosixPath(serialized_transform))), + ] + + args: List[str] = ['--memory-io',] + # Inputs + if not Path(serialized_transform).exists(): + raise FileNotFoundError("serialized_transform does not exist") + args.append(str(PurePosixPath(serialized_transform))) + # Outputs + could_read_name = '0' + args.append(could_read_name) + + transform_name = '1' + args.append(transform_name) + + # Options + input_count = len(pipeline_inputs) + if float_parameters: + args.append('--float-parameters') + + + outputs = _pipeline.run(args, pipeline_outputs, pipeline_inputs) + + result = ( + outputs[0].data, + outputs[1].data, + ) + return result + diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/txt_write_transform.py b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/txt_write_transform.py new file mode 100644 index 000000000..ac19e56e2 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/txt_write_transform.py @@ -0,0 +1,79 @@ +# Generated file. To retain edits, remove this comment. + +from pathlib import Path, PurePosixPath +import os +from typing import Dict, Tuple, Optional, List, Any + +from importlib_resources import files as file_resources + +_pipeline = None + +from itkwasm import ( + InterfaceTypes, + PipelineOutput, + PipelineInput, + Pipeline, + Transform, + BinaryFile, +) + +def txt_write_transform( + transform: Transform, + serialized_transform: str, + float_parameters: bool = False, + use_compression: bool = False, +) -> Tuple[Any]: + """Write an ITK-Wasm transform file format converted to a transform file format + + :param transform: Input transform + :type transform: Transform + + :param serialized_transform: Output transform serialized in the file format. + :type serialized_transform: str + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :param use_compression: Use compression in the written file + :type use_compression: bool + + :return: Whether the input could be written. If false, the output transform is not valid. + :rtype: Any + """ + global _pipeline + if _pipeline is None: + _pipeline = Pipeline(file_resources('itkwasm_transform_io_wasi').joinpath(Path('wasm_modules') / Path('txt-write-transform.wasi.wasm'))) + + pipeline_outputs: List[PipelineOutput] = [ + PipelineOutput(InterfaceTypes.JsonCompatible), + PipelineOutput(InterfaceTypes.BinaryFile, BinaryFile(PurePosixPath(serialized_transform))), + ] + + pipeline_inputs: List[PipelineInput] = [ + PipelineInput(InterfaceTypes.Transform, transform), + ] + + args: List[str] = ['--memory-io',] + # Inputs + args.append('0') + # Outputs + could_write_name = '0' + args.append(could_write_name) + + serialized_transform_name = str(PurePosixPath(serialized_transform)) + args.append(serialized_transform_name) + + # Options + input_count = len(pipeline_inputs) + if float_parameters: + args.append('--float-parameters') + + if use_compression: + args.append('--use-compression') + + + outputs = _pipeline.run(args, pipeline_outputs, pipeline_inputs) + + result = outputs[0].data + return result + diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/hdf5-read-transform.wasi.wasm b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/hdf5-read-transform.wasi.wasm new file mode 100755 index 000000000..8233213fc Binary files /dev/null and b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/hdf5-read-transform.wasi.wasm differ diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/hdf5-write-transform.wasi.wasm b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/hdf5-write-transform.wasi.wasm new file mode 100755 index 000000000..44c1e0646 Binary files /dev/null and b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/hdf5-write-transform.wasi.wasm differ diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/mat-read-transform.wasi.wasm b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/mat-read-transform.wasi.wasm new file mode 100755 index 000000000..07bb39600 Binary files /dev/null and b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/mat-read-transform.wasi.wasm differ diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/mat-write-transform.wasi.wasm b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/mat-write-transform.wasi.wasm new file mode 100755 index 000000000..4fceebd5a Binary files /dev/null and b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/mat-write-transform.wasi.wasm differ diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/mnc-read-transform.wasi.wasm b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/mnc-read-transform.wasi.wasm new file mode 100755 index 000000000..103a12e6d Binary files /dev/null and b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/mnc-read-transform.wasi.wasm differ diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/mnc-write-transform.wasi.wasm b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/mnc-write-transform.wasi.wasm new file mode 100755 index 000000000..7a2d08913 Binary files /dev/null and b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/mnc-write-transform.wasi.wasm differ diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/txt-read-transform.wasi.wasm b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/txt-read-transform.wasi.wasm new file mode 100755 index 000000000..1f17be8a8 Binary files /dev/null and b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/txt-read-transform.wasi.wasm differ diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/txt-write-transform.wasi.wasm b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/txt-write-transform.wasi.wasm new file mode 100755 index 000000000..702d5c889 Binary files /dev/null and b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/txt-write-transform.wasi.wasm differ diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/wasm-read-transform.wasi.wasm b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/wasm-read-transform.wasi.wasm new file mode 100755 index 000000000..2b890dc35 Binary files /dev/null and b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/wasm-read-transform.wasi.wasm differ diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/wasm-write-transform.wasi.wasm b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/wasm-write-transform.wasi.wasm new file mode 100755 index 000000000..754141b03 Binary files /dev/null and b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/wasm-write-transform.wasi.wasm differ diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/wasm-zstd-read-transform.wasi.wasm b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/wasm-zstd-read-transform.wasi.wasm new file mode 100755 index 000000000..ce1b004d2 Binary files /dev/null and b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/wasm-zstd-read-transform.wasi.wasm differ diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/wasm-zstd-write-transform.wasi.wasm b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/wasm-zstd-write-transform.wasi.wasm new file mode 100755 index 000000000..ad12e450c Binary files /dev/null and b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_modules/wasm-zstd-write-transform.wasi.wasm differ diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_read_transform.py b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_read_transform.py new file mode 100644 index 000000000..21f538b02 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_read_transform.py @@ -0,0 +1,76 @@ +# Generated file. To retain edits, remove this comment. + +from pathlib import Path, PurePosixPath +import os +from typing import Dict, Tuple, Optional, List, Any + +from importlib_resources import files as file_resources + +_pipeline = None + +from itkwasm import ( + InterfaceTypes, + PipelineOutput, + PipelineInput, + Pipeline, + BinaryFile, + Transform, +) + +def wasm_read_transform( + serialized_transform: os.PathLike, + float_parameters: bool = False, +) -> Tuple[Any, Transform]: + """Read an transform file format and convert it to the ITK-Wasm transform file format + + :param serialized_transform: Input transform serialized in the file format + :type serialized_transform: os.PathLike + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :return: Whether the input could be read. If false, the output transform is not valid. + :rtype: Any + + :return: Output transform + :rtype: Transform + """ + global _pipeline + if _pipeline is None: + _pipeline = Pipeline(file_resources('itkwasm_transform_io_wasi').joinpath(Path('wasm_modules') / Path('wasm-read-transform.wasi.wasm'))) + + pipeline_outputs: List[PipelineOutput] = [ + PipelineOutput(InterfaceTypes.JsonCompatible), + PipelineOutput(InterfaceTypes.Transform), + ] + + pipeline_inputs: List[PipelineInput] = [ + PipelineInput(InterfaceTypes.BinaryFile, BinaryFile(PurePosixPath(serialized_transform))), + ] + + args: List[str] = ['--memory-io',] + # Inputs + if not Path(serialized_transform).exists(): + raise FileNotFoundError("serialized_transform does not exist") + args.append(str(PurePosixPath(serialized_transform))) + # Outputs + could_read_name = '0' + args.append(could_read_name) + + transform_name = '1' + args.append(transform_name) + + # Options + input_count = len(pipeline_inputs) + if float_parameters: + args.append('--float-parameters') + + + outputs = _pipeline.run(args, pipeline_outputs, pipeline_inputs) + + result = ( + outputs[0].data, + outputs[1].data, + ) + return result + diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_write_transform.py b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_write_transform.py new file mode 100644 index 000000000..e553d1d80 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_write_transform.py @@ -0,0 +1,79 @@ +# Generated file. To retain edits, remove this comment. + +from pathlib import Path, PurePosixPath +import os +from typing import Dict, Tuple, Optional, List, Any + +from importlib_resources import files as file_resources + +_pipeline = None + +from itkwasm import ( + InterfaceTypes, + PipelineOutput, + PipelineInput, + Pipeline, + Transform, + BinaryFile, +) + +def wasm_write_transform( + transform: Transform, + serialized_transform: str, + float_parameters: bool = False, + use_compression: bool = False, +) -> Tuple[Any]: + """Write an ITK-Wasm transform file format converted to a transform file format + + :param transform: Input transform + :type transform: Transform + + :param serialized_transform: Output transform serialized in the file format. + :type serialized_transform: str + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :param use_compression: Use compression in the written file + :type use_compression: bool + + :return: Whether the input could be written. If false, the output transform is not valid. + :rtype: Any + """ + global _pipeline + if _pipeline is None: + _pipeline = Pipeline(file_resources('itkwasm_transform_io_wasi').joinpath(Path('wasm_modules') / Path('wasm-write-transform.wasi.wasm'))) + + pipeline_outputs: List[PipelineOutput] = [ + PipelineOutput(InterfaceTypes.JsonCompatible), + PipelineOutput(InterfaceTypes.BinaryFile, BinaryFile(PurePosixPath(serialized_transform))), + ] + + pipeline_inputs: List[PipelineInput] = [ + PipelineInput(InterfaceTypes.Transform, transform), + ] + + args: List[str] = ['--memory-io',] + # Inputs + args.append('0') + # Outputs + could_write_name = '0' + args.append(could_write_name) + + serialized_transform_name = str(PurePosixPath(serialized_transform)) + args.append(serialized_transform_name) + + # Options + input_count = len(pipeline_inputs) + if float_parameters: + args.append('--float-parameters') + + if use_compression: + args.append('--use-compression') + + + outputs = _pipeline.run(args, pipeline_outputs, pipeline_inputs) + + result = outputs[0].data + return result + diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_zstd_read_transform.py b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_zstd_read_transform.py new file mode 100644 index 000000000..d1ebd9bb3 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_zstd_read_transform.py @@ -0,0 +1,76 @@ +# Generated file. To retain edits, remove this comment. + +from pathlib import Path, PurePosixPath +import os +from typing import Dict, Tuple, Optional, List, Any + +from importlib_resources import files as file_resources + +_pipeline = None + +from itkwasm import ( + InterfaceTypes, + PipelineOutput, + PipelineInput, + Pipeline, + BinaryFile, + Transform, +) + +def wasm_zstd_read_transform( + serialized_transform: os.PathLike, + float_parameters: bool = False, +) -> Tuple[Any, Transform]: + """Read an transform file format and convert it to the ITK-Wasm transform file format + + :param serialized_transform: Input transform serialized in the file format + :type serialized_transform: os.PathLike + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :return: Whether the input could be read. If false, the output transform is not valid. + :rtype: Any + + :return: Output transform + :rtype: Transform + """ + global _pipeline + if _pipeline is None: + _pipeline = Pipeline(file_resources('itkwasm_transform_io_wasi').joinpath(Path('wasm_modules') / Path('wasm-zstd-read-transform.wasi.wasm'))) + + pipeline_outputs: List[PipelineOutput] = [ + PipelineOutput(InterfaceTypes.JsonCompatible), + PipelineOutput(InterfaceTypes.Transform), + ] + + pipeline_inputs: List[PipelineInput] = [ + PipelineInput(InterfaceTypes.BinaryFile, BinaryFile(PurePosixPath(serialized_transform))), + ] + + args: List[str] = ['--memory-io',] + # Inputs + if not Path(serialized_transform).exists(): + raise FileNotFoundError("serialized_transform does not exist") + args.append(str(PurePosixPath(serialized_transform))) + # Outputs + could_read_name = '0' + args.append(could_read_name) + + transform_name = '1' + args.append(transform_name) + + # Options + input_count = len(pipeline_inputs) + if float_parameters: + args.append('--float-parameters') + + + outputs = _pipeline.run(args, pipeline_outputs, pipeline_inputs) + + result = ( + outputs[0].data, + outputs[1].data, + ) + return result + diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_zstd_write_transform.py b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_zstd_write_transform.py new file mode 100644 index 000000000..b851b8ae1 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-wasi/itkwasm_transform_io_wasi/wasm_zstd_write_transform.py @@ -0,0 +1,79 @@ +# Generated file. To retain edits, remove this comment. + +from pathlib import Path, PurePosixPath +import os +from typing import Dict, Tuple, Optional, List, Any + +from importlib_resources import files as file_resources + +_pipeline = None + +from itkwasm import ( + InterfaceTypes, + PipelineOutput, + PipelineInput, + Pipeline, + Transform, + BinaryFile, +) + +def wasm_zstd_write_transform( + transform: Transform, + serialized_transform: str, + float_parameters: bool = False, + use_compression: bool = False, +) -> Tuple[Any]: + """Write an ITK-Wasm transform file format converted to a transform file format + + :param transform: Input transform + :type transform: Transform + + :param serialized_transform: Output transform serialized in the file format. + :type serialized_transform: str + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :param use_compression: Use compression in the written file + :type use_compression: bool + + :return: Whether the input could be written. If false, the output transform is not valid. + :rtype: Any + """ + global _pipeline + if _pipeline is None: + _pipeline = Pipeline(file_resources('itkwasm_transform_io_wasi').joinpath(Path('wasm_modules') / Path('wasm-zstd-write-transform.wasi.wasm'))) + + pipeline_outputs: List[PipelineOutput] = [ + PipelineOutput(InterfaceTypes.JsonCompatible), + PipelineOutput(InterfaceTypes.BinaryFile, BinaryFile(PurePosixPath(serialized_transform))), + ] + + pipeline_inputs: List[PipelineInput] = [ + PipelineInput(InterfaceTypes.Transform, transform), + ] + + args: List[str] = ['--memory-io',] + # Inputs + args.append('0') + # Outputs + could_write_name = '0' + args.append(could_write_name) + + serialized_transform_name = str(PurePosixPath(serialized_transform)) + args.append(serialized_transform_name) + + # Options + input_count = len(pipeline_inputs) + if float_parameters: + args.append('--float-parameters') + + if use_compression: + args.append('--use-compression') + + + outputs = _pipeline.run(args, pipeline_outputs, pipeline_inputs) + + result = outputs[0].data + return result + diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/pyproject.toml b/packages/transform-io/python/itkwasm-transform-io-wasi/pyproject.toml new file mode 100644 index 000000000..956bef031 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-wasi/pyproject.toml @@ -0,0 +1,60 @@ +[build-system] +requires = ["hatchling", "hatch-vcs"] +build-backend = "hatchling.build" + +[project] +name = "itkwasm-transform-io-wasi" +readme = "README.md" +license = "Apache-2.0" +dynamic = ["version"] +description = "Input and output for scientific and medical coordinate transform file formats." +classifiers = [ + "License :: OSI Approved :: Apache Software License", + "Programming Language :: Python", + "Programming Language :: C++", + "Environment :: WebAssembly", + "Environment :: WebAssembly :: Emscripten", + "Environment :: WebAssembly :: WASI", + "Development Status :: 3 - Alpha", + "Intended Audience :: Developers", + "Intended Audience :: Science/Research", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", +] +keywords = [ + "itkwasm", + "webassembly", + "wasi", +] + +requires-python = ">=3.8" +dependencies = [ + "itkwasm >= 1.0.b171", + "importlib_resources", + +] + +[tool.hatch.version] +path = "itkwasm_transform_io_wasi/_version.py" + +[tool.hatch.envs.default] +dependencies = [ + "pytest", +] + +[project.urls] +Home = "https://github.com/InsightSoftwareConsortium/ITK-Wasm" +Source = "https://github.com/InsightSoftwareConsortium/ITK-Wasm" + +[tool.hatch.envs.default.scripts] +test = "pytest" + + +[tool.hatch.build] +exclude = [ + "/examples", +] diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/tests/__init__.py b/packages/transform-io/python/itkwasm-transform-io-wasi/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/tests/common.py b/packages/transform-io/python/itkwasm-transform-io-wasi/tests/common.py new file mode 100644 index 000000000..3a182e694 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-wasi/tests/common.py @@ -0,0 +1,6 @@ +from pathlib import Path + +test_input_path = Path(__file__).parent / ".." / ".." / ".." / "test" / "data" / "input" +test_baseline_path = Path(__file__).parent / ".." / ".." / ".." / "test" / "data" / "baseline" +test_output_path = Path(__file__).parent / ".." / ".." / ".." / "test" / "data" / "output" / "python" +test_output_path.mkdir(parents=True, exist_ok=True) \ No newline at end of file diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_hdf5_read_transform.py b/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_hdf5_read_transform.py new file mode 100644 index 000000000..be2fc2f9f --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_hdf5_read_transform.py @@ -0,0 +1,8 @@ +# Generated file. To retain edits, remove this comment. + +from itkwasm_transform_io_wasi import hdf5_read_transform + +from .common import test_input_path, test_output_path + +def test_hdf5_read_transform(): + pass diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_hdf5_write_transform.py b/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_hdf5_write_transform.py new file mode 100644 index 000000000..9768c6f47 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_hdf5_write_transform.py @@ -0,0 +1,8 @@ +# Generated file. To retain edits, remove this comment. + +from itkwasm_transform_io_wasi import hdf5_write_transform + +from .common import test_input_path, test_output_path + +def test_hdf5_write_transform(): + pass diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_mat_read_transform.py b/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_mat_read_transform.py new file mode 100644 index 000000000..bdd4db8fa --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_mat_read_transform.py @@ -0,0 +1,8 @@ +# Generated file. To retain edits, remove this comment. + +from itkwasm_transform_io_wasi import mat_read_transform + +from .common import test_input_path, test_output_path + +def test_mat_read_transform(): + pass diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_mat_write_transform.py b/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_mat_write_transform.py new file mode 100644 index 000000000..bf9368a22 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_mat_write_transform.py @@ -0,0 +1,8 @@ +# Generated file. To retain edits, remove this comment. + +from itkwasm_transform_io_wasi import mat_write_transform + +from .common import test_input_path, test_output_path + +def test_mat_write_transform(): + pass diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_mnc_read_transform.py b/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_mnc_read_transform.py new file mode 100644 index 000000000..b43242ae9 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_mnc_read_transform.py @@ -0,0 +1,8 @@ +# Generated file. To retain edits, remove this comment. + +from itkwasm_transform_io_wasi import mnc_read_transform + +from .common import test_input_path, test_output_path + +def test_mnc_read_transform(): + pass diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_mnc_write_transform.py b/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_mnc_write_transform.py new file mode 100644 index 000000000..ffd9fb84b --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_mnc_write_transform.py @@ -0,0 +1,8 @@ +# Generated file. To retain edits, remove this comment. + +from itkwasm_transform_io_wasi import mnc_write_transform + +from .common import test_input_path, test_output_path + +def test_mnc_write_transform(): + pass diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_txt_read_transform.py b/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_txt_read_transform.py new file mode 100644 index 000000000..29bd598ea --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_txt_read_transform.py @@ -0,0 +1,8 @@ +# Generated file. To retain edits, remove this comment. + +from itkwasm_transform_io_wasi import txt_read_transform + +from .common import test_input_path, test_output_path + +def test_txt_read_transform(): + pass diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_txt_write_transform.py b/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_txt_write_transform.py new file mode 100644 index 000000000..c4428dca8 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_txt_write_transform.py @@ -0,0 +1,8 @@ +# Generated file. To retain edits, remove this comment. + +from itkwasm_transform_io_wasi import txt_write_transform + +from .common import test_input_path, test_output_path + +def test_txt_write_transform(): + pass diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_wasm_read_transform.py b/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_wasm_read_transform.py new file mode 100644 index 000000000..3d185a5c9 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_wasm_read_transform.py @@ -0,0 +1,8 @@ +# Generated file. To retain edits, remove this comment. + +from itkwasm_transform_io_wasi import wasm_read_transform + +from .common import test_input_path, test_output_path + +def test_wasm_read_transform(): + pass diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_wasm_write_transform.py b/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_wasm_write_transform.py new file mode 100644 index 000000000..ae66c2406 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_wasm_write_transform.py @@ -0,0 +1,8 @@ +# Generated file. To retain edits, remove this comment. + +from itkwasm_transform_io_wasi import wasm_write_transform + +from .common import test_input_path, test_output_path + +def test_wasm_write_transform(): + pass diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_wasm_zstd_read_transform.py b/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_wasm_zstd_read_transform.py new file mode 100644 index 000000000..9e94c4df1 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_wasm_zstd_read_transform.py @@ -0,0 +1,8 @@ +# Generated file. To retain edits, remove this comment. + +from itkwasm_transform_io_wasi import wasm_zstd_read_transform + +from .common import test_input_path, test_output_path + +def test_wasm_zstd_read_transform(): + pass diff --git a/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_wasm_zstd_write_transform.py b/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_wasm_zstd_write_transform.py new file mode 100644 index 000000000..40dcb4ae8 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io-wasi/tests/test_wasm_zstd_write_transform.py @@ -0,0 +1,8 @@ +# Generated file. To retain edits, remove this comment. + +from itkwasm_transform_io_wasi import wasm_zstd_write_transform + +from .common import test_input_path, test_output_path + +def test_wasm_zstd_write_transform(): + pass diff --git a/packages/transform-io/python/itkwasm-transform-io/README.md b/packages/transform-io/python/itkwasm-transform-io/README.md new file mode 100644 index 000000000..b67fbda02 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/README.md @@ -0,0 +1,11 @@ +# itkwasm-transform-io + +[![PyPI version](https://badge.fury.io/py/itkwasm-transform-io.svg)](https://badge.fury.io/py/itkwasm-transform-io) + +Input and output for scientific and medical coordinate transform file formats. + +## Installation + +```sh +pip install itkwasm-transform-io +``` diff --git a/packages/transform-io/python/itkwasm-transform-io/docs/Makefile b/packages/transform-io/python/itkwasm-transform-io/docs/Makefile new file mode 100644 index 000000000..d4bb2cbb9 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/packages/transform-io/python/itkwasm-transform-io/docs/_static/favicon.png b/packages/transform-io/python/itkwasm-transform-io/docs/_static/favicon.png new file mode 100644 index 000000000..bd1e535c6 Binary files /dev/null and b/packages/transform-io/python/itkwasm-transform-io/docs/_static/favicon.png differ diff --git a/packages/transform-io/python/itkwasm-transform-io/docs/_static/logo.svg b/packages/transform-io/python/itkwasm-transform-io/docs/_static/logo.svg new file mode 100644 index 000000000..669a445ed --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/docs/_static/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/transform-io/python/itkwasm-transform-io/docs/conf.py b/packages/transform-io/python/itkwasm-transform-io/docs/conf.py new file mode 100644 index 000000000..3067fb1a0 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/docs/conf.py @@ -0,0 +1,58 @@ +# Configuration file for the Sphinx documentation builder. +# +# For the full list of built-in configuration values, see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information + +from datetime import date +import os + +project = 'itkwasm-transform-io' +copyright = f'{date.today().year}, NumFOCUS' +author = 'Insight Software Consortium' + +extensions = [ + 'sphinx.ext.autosummary', + 'autodoc2', + 'myst_parser', + 'sphinx.ext.intersphinx', + 'sphinx_copybutton', + 'sphinxext.opengraph', + 'sphinx_design', +] + +myst_enable_extensions = ["colon_fence", "fieldlist"] + +templates_path = ['_templates'] +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +autodoc2_packages = [ + { + "path": "../itkwasm_transform_io", + "exclude_files": ["_version.py"], + }, +] +autodoc2_render_plugin = "myst" + +intersphinx_mapping = { + "python": ("https://docs.python.org/3/", None), + "numpy": ("https://numpy.org/doc/stable", None), + "itkwasm": ("https://itkwasm.readthedocs.io/en/latest/", None), +} + +html_theme = 'furo' +html_static_path = ['_static'] +html_logo = "_static/logo.svg" +html_favicon = "_static/favicon.png" +html_title = f"{project}" +html_baseurl = os.environ.get("SPHINX_BASE_URL", "") + +# Furo options +html_theme_options = { + "top_of_page_button": "edit", + "source_repository": "https://github.com/InsightSoftwareConsortium/ITK-Wasm", + "source_branch": "main", + "source_directory": "docs", +} \ No newline at end of file diff --git a/packages/transform-io/python/itkwasm-transform-io/docs/index.md b/packages/transform-io/python/itkwasm-transform-io/docs/index.md new file mode 100644 index 000000000..c115dae42 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/docs/index.md @@ -0,0 +1,35 @@ +itkwasm-transform-io +======= + +> Input and output for scientific and medical coordinate transform file formats. + +[![itkwasm-transform-io version](https://badge.fury.io/py/itkwasm_transform_io.svg)](https://pypi.org/project/itkwasm_transform_io/) + +## Installation + +::::{tab-set} + +:::{tab-item} System +```shell +pip install itkwasm-transform-io +``` +::: + +:::{tab-item} Browser +In Pyodide, e.g. the [Pyodide REPL](https://pyodide.org/en/stable/console.html) or [JupyterLite](https://jupyterlite.readthedocs.io/en/latest/try/lab), + +```python +import micropip +await micropip.install('itkwasm-transform-io') +::: + +:::: + +```{toctree} +:hidden: +:maxdepth: 3 +:caption: 📖 Reference + +apidocs/index.rst +itkwasm docs +``` \ No newline at end of file diff --git a/packages/transform-io/python/itkwasm-transform-io/docs/make.bat b/packages/transform-io/python/itkwasm-transform-io/docs/make.bat new file mode 100644 index 000000000..32bb24529 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "" goto help + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/packages/transform-io/python/itkwasm-transform-io/docs/requirements.txt b/packages/transform-io/python/itkwasm-transform-io/docs/requirements.txt new file mode 100644 index 000000000..c10181dd8 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/docs/requirements.txt @@ -0,0 +1,7 @@ +sphinx +furo +sphinx-autodoc2>=0.5.0 +myst-parser +sphinx-copybutton +sphinxext-opengraph +sphinx-design diff --git a/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/__init__.py b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/__init__.py new file mode 100644 index 000000000..2d82258a2 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/__init__.py @@ -0,0 +1,30 @@ +# Generated file. To retain edits, remove this comment. + +"""itkwasm-transform-io: Input and output for scientific and medical coordinate transform file formats.""" + +from .hdf5_read_transform_async import hdf5_read_transform_async +from .hdf5_read_transform import hdf5_read_transform +from .hdf5_write_transform_async import hdf5_write_transform_async +from .hdf5_write_transform import hdf5_write_transform +from .mat_read_transform_async import mat_read_transform_async +from .mat_read_transform import mat_read_transform +from .mat_write_transform_async import mat_write_transform_async +from .mat_write_transform import mat_write_transform +from .mnc_read_transform_async import mnc_read_transform_async +from .mnc_read_transform import mnc_read_transform +from .mnc_write_transform_async import mnc_write_transform_async +from .mnc_write_transform import mnc_write_transform +from .txt_read_transform_async import txt_read_transform_async +from .txt_read_transform import txt_read_transform +from .txt_write_transform_async import txt_write_transform_async +from .txt_write_transform import txt_write_transform +from .wasm_read_transform_async import wasm_read_transform_async +from .wasm_read_transform import wasm_read_transform +from .wasm_write_transform_async import wasm_write_transform_async +from .wasm_write_transform import wasm_write_transform +from .wasm_zstd_read_transform_async import wasm_zstd_read_transform_async +from .wasm_zstd_read_transform import wasm_zstd_read_transform +from .wasm_zstd_write_transform_async import wasm_zstd_write_transform_async +from .wasm_zstd_write_transform import wasm_zstd_write_transform + +from ._version import __version__ diff --git a/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/_version.py b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/_version.py new file mode 100644 index 000000000..3dc1f76bc --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/_version.py @@ -0,0 +1 @@ +__version__ = "0.1.0" diff --git a/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/hdf5_read_transform.py b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/hdf5_read_transform.py new file mode 100644 index 000000000..612b63888 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/hdf5_read_transform.py @@ -0,0 +1,32 @@ +# Generated file. Do not edit. + +import os +from typing import Dict, Tuple, Optional, List, Any + +from itkwasm import ( + environment_dispatch, + BinaryFile, + Transform, +) + +def hdf5_read_transform( + serialized_transform: os.PathLike, + float_parameters: bool = False, +) -> Tuple[Any, Transform]: + """Read an transform file format and convert it to the ITK-Wasm transform file format + + :param serialized_transform: Input transform serialized in the file format + :type serialized_transform: os.PathLike + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :return: Whether the input could be read. If false, the output transform is not valid. + :rtype: Any + + :return: Output transform + :rtype: Transform + """ + func = environment_dispatch("itkwasm_transform_io", "hdf5_read_transform") + output = func(serialized_transform, float_parameters=float_parameters) + return output diff --git a/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/hdf5_read_transform_async.py b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/hdf5_read_transform_async.py new file mode 100644 index 000000000..cd77a4fbc --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/hdf5_read_transform_async.py @@ -0,0 +1,32 @@ +# Generated file. Do not edit. + +import os +from typing import Dict, Tuple, Optional, List, Any + +from itkwasm import ( + environment_dispatch, + BinaryFile, + Transform, +) + +async def hdf5_read_transform_async( + serialized_transform: os.PathLike, + float_parameters: bool = False, +) -> Tuple[Any, Transform]: + """Read an transform file format and convert it to the ITK-Wasm transform file format + + :param serialized_transform: Input transform serialized in the file format + :type serialized_transform: os.PathLike + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :return: Whether the input could be read. If false, the output transform is not valid. + :rtype: Any + + :return: Output transform + :rtype: Transform + """ + func = environment_dispatch("itkwasm_transform_io", "hdf5_read_transform_async") + output = await func(serialized_transform, float_parameters=float_parameters) + return output diff --git a/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/hdf5_write_transform.py b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/hdf5_write_transform.py new file mode 100644 index 000000000..f4f3e1886 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/hdf5_write_transform.py @@ -0,0 +1,37 @@ +# Generated file. Do not edit. + +import os +from typing import Dict, Tuple, Optional, List, Any + +from itkwasm import ( + environment_dispatch, + Transform, + BinaryFile, +) + +def hdf5_write_transform( + transform: Transform, + serialized_transform: str, + float_parameters: bool = False, + use_compression: bool = False, +) -> Tuple[Any]: + """Write an ITK-Wasm transform file format converted to a transform file format + + :param transform: Input transform + :type transform: Transform + + :param serialized_transform: Output transform serialized in the file format. + :type serialized_transform: str + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :param use_compression: Use compression in the written file + :type use_compression: bool + + :return: Whether the input could be written. If false, the output transform is not valid. + :rtype: Any + """ + func = environment_dispatch("itkwasm_transform_io", "hdf5_write_transform") + output = func(transform, serialized_transform, float_parameters=float_parameters, use_compression=use_compression) + return output diff --git a/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/hdf5_write_transform_async.py b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/hdf5_write_transform_async.py new file mode 100644 index 000000000..b1facea94 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/hdf5_write_transform_async.py @@ -0,0 +1,37 @@ +# Generated file. Do not edit. + +import os +from typing import Dict, Tuple, Optional, List, Any + +from itkwasm import ( + environment_dispatch, + Transform, + BinaryFile, +) + +async def hdf5_write_transform_async( + transform: Transform, + serialized_transform: str, + float_parameters: bool = False, + use_compression: bool = False, +) -> Tuple[Any]: + """Write an ITK-Wasm transform file format converted to a transform file format + + :param transform: Input transform + :type transform: Transform + + :param serialized_transform: Output transform serialized in the file format. + :type serialized_transform: str + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :param use_compression: Use compression in the written file + :type use_compression: bool + + :return: Whether the input could be written. If false, the output transform is not valid. + :rtype: Any + """ + func = environment_dispatch("itkwasm_transform_io", "hdf5_write_transform_async") + output = await func(transform, serialized_transform, float_parameters=float_parameters, use_compression=use_compression) + return output diff --git a/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/mat_read_transform.py b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/mat_read_transform.py new file mode 100644 index 000000000..7d5cd4d44 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/mat_read_transform.py @@ -0,0 +1,32 @@ +# Generated file. Do not edit. + +import os +from typing import Dict, Tuple, Optional, List, Any + +from itkwasm import ( + environment_dispatch, + BinaryFile, + Transform, +) + +def mat_read_transform( + serialized_transform: os.PathLike, + float_parameters: bool = False, +) -> Tuple[Any, Transform]: + """Read an transform file format and convert it to the ITK-Wasm transform file format + + :param serialized_transform: Input transform serialized in the file format + :type serialized_transform: os.PathLike + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :return: Whether the input could be read. If false, the output transform is not valid. + :rtype: Any + + :return: Output transform + :rtype: Transform + """ + func = environment_dispatch("itkwasm_transform_io", "mat_read_transform") + output = func(serialized_transform, float_parameters=float_parameters) + return output diff --git a/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/mat_read_transform_async.py b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/mat_read_transform_async.py new file mode 100644 index 000000000..5076c89e3 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/mat_read_transform_async.py @@ -0,0 +1,32 @@ +# Generated file. Do not edit. + +import os +from typing import Dict, Tuple, Optional, List, Any + +from itkwasm import ( + environment_dispatch, + BinaryFile, + Transform, +) + +async def mat_read_transform_async( + serialized_transform: os.PathLike, + float_parameters: bool = False, +) -> Tuple[Any, Transform]: + """Read an transform file format and convert it to the ITK-Wasm transform file format + + :param serialized_transform: Input transform serialized in the file format + :type serialized_transform: os.PathLike + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :return: Whether the input could be read. If false, the output transform is not valid. + :rtype: Any + + :return: Output transform + :rtype: Transform + """ + func = environment_dispatch("itkwasm_transform_io", "mat_read_transform_async") + output = await func(serialized_transform, float_parameters=float_parameters) + return output diff --git a/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/mat_write_transform.py b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/mat_write_transform.py new file mode 100644 index 000000000..4d8fd6133 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/mat_write_transform.py @@ -0,0 +1,37 @@ +# Generated file. Do not edit. + +import os +from typing import Dict, Tuple, Optional, List, Any + +from itkwasm import ( + environment_dispatch, + Transform, + BinaryFile, +) + +def mat_write_transform( + transform: Transform, + serialized_transform: str, + float_parameters: bool = False, + use_compression: bool = False, +) -> Tuple[Any]: + """Write an ITK-Wasm transform file format converted to a transform file format + + :param transform: Input transform + :type transform: Transform + + :param serialized_transform: Output transform serialized in the file format. + :type serialized_transform: str + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :param use_compression: Use compression in the written file + :type use_compression: bool + + :return: Whether the input could be written. If false, the output transform is not valid. + :rtype: Any + """ + func = environment_dispatch("itkwasm_transform_io", "mat_write_transform") + output = func(transform, serialized_transform, float_parameters=float_parameters, use_compression=use_compression) + return output diff --git a/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/mat_write_transform_async.py b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/mat_write_transform_async.py new file mode 100644 index 000000000..015ddfc1f --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/mat_write_transform_async.py @@ -0,0 +1,37 @@ +# Generated file. Do not edit. + +import os +from typing import Dict, Tuple, Optional, List, Any + +from itkwasm import ( + environment_dispatch, + Transform, + BinaryFile, +) + +async def mat_write_transform_async( + transform: Transform, + serialized_transform: str, + float_parameters: bool = False, + use_compression: bool = False, +) -> Tuple[Any]: + """Write an ITK-Wasm transform file format converted to a transform file format + + :param transform: Input transform + :type transform: Transform + + :param serialized_transform: Output transform serialized in the file format. + :type serialized_transform: str + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :param use_compression: Use compression in the written file + :type use_compression: bool + + :return: Whether the input could be written. If false, the output transform is not valid. + :rtype: Any + """ + func = environment_dispatch("itkwasm_transform_io", "mat_write_transform_async") + output = await func(transform, serialized_transform, float_parameters=float_parameters, use_compression=use_compression) + return output diff --git a/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/mnc_read_transform.py b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/mnc_read_transform.py new file mode 100644 index 000000000..4bc9ca395 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/mnc_read_transform.py @@ -0,0 +1,32 @@ +# Generated file. Do not edit. + +import os +from typing import Dict, Tuple, Optional, List, Any + +from itkwasm import ( + environment_dispatch, + BinaryFile, + Transform, +) + +def mnc_read_transform( + serialized_transform: os.PathLike, + float_parameters: bool = False, +) -> Tuple[Any, Transform]: + """Read an transform file format and convert it to the ITK-Wasm transform file format + + :param serialized_transform: Input transform serialized in the file format + :type serialized_transform: os.PathLike + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :return: Whether the input could be read. If false, the output transform is not valid. + :rtype: Any + + :return: Output transform + :rtype: Transform + """ + func = environment_dispatch("itkwasm_transform_io", "mnc_read_transform") + output = func(serialized_transform, float_parameters=float_parameters) + return output diff --git a/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/mnc_read_transform_async.py b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/mnc_read_transform_async.py new file mode 100644 index 000000000..278f5d044 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/mnc_read_transform_async.py @@ -0,0 +1,32 @@ +# Generated file. Do not edit. + +import os +from typing import Dict, Tuple, Optional, List, Any + +from itkwasm import ( + environment_dispatch, + BinaryFile, + Transform, +) + +async def mnc_read_transform_async( + serialized_transform: os.PathLike, + float_parameters: bool = False, +) -> Tuple[Any, Transform]: + """Read an transform file format and convert it to the ITK-Wasm transform file format + + :param serialized_transform: Input transform serialized in the file format + :type serialized_transform: os.PathLike + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :return: Whether the input could be read. If false, the output transform is not valid. + :rtype: Any + + :return: Output transform + :rtype: Transform + """ + func = environment_dispatch("itkwasm_transform_io", "mnc_read_transform_async") + output = await func(serialized_transform, float_parameters=float_parameters) + return output diff --git a/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/mnc_write_transform.py b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/mnc_write_transform.py new file mode 100644 index 000000000..9feb9bac3 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/mnc_write_transform.py @@ -0,0 +1,37 @@ +# Generated file. Do not edit. + +import os +from typing import Dict, Tuple, Optional, List, Any + +from itkwasm import ( + environment_dispatch, + Transform, + BinaryFile, +) + +def mnc_write_transform( + transform: Transform, + serialized_transform: str, + float_parameters: bool = False, + use_compression: bool = False, +) -> Tuple[Any]: + """Write an ITK-Wasm transform file format converted to a transform file format + + :param transform: Input transform + :type transform: Transform + + :param serialized_transform: Output transform serialized in the file format. + :type serialized_transform: str + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :param use_compression: Use compression in the written file + :type use_compression: bool + + :return: Whether the input could be written. If false, the output transform is not valid. + :rtype: Any + """ + func = environment_dispatch("itkwasm_transform_io", "mnc_write_transform") + output = func(transform, serialized_transform, float_parameters=float_parameters, use_compression=use_compression) + return output diff --git a/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/mnc_write_transform_async.py b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/mnc_write_transform_async.py new file mode 100644 index 000000000..735efdc3f --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/mnc_write_transform_async.py @@ -0,0 +1,37 @@ +# Generated file. Do not edit. + +import os +from typing import Dict, Tuple, Optional, List, Any + +from itkwasm import ( + environment_dispatch, + Transform, + BinaryFile, +) + +async def mnc_write_transform_async( + transform: Transform, + serialized_transform: str, + float_parameters: bool = False, + use_compression: bool = False, +) -> Tuple[Any]: + """Write an ITK-Wasm transform file format converted to a transform file format + + :param transform: Input transform + :type transform: Transform + + :param serialized_transform: Output transform serialized in the file format. + :type serialized_transform: str + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :param use_compression: Use compression in the written file + :type use_compression: bool + + :return: Whether the input could be written. If false, the output transform is not valid. + :rtype: Any + """ + func = environment_dispatch("itkwasm_transform_io", "mnc_write_transform_async") + output = await func(transform, serialized_transform, float_parameters=float_parameters, use_compression=use_compression) + return output diff --git a/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/txt_read_transform.py b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/txt_read_transform.py new file mode 100644 index 000000000..043b02c04 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/txt_read_transform.py @@ -0,0 +1,32 @@ +# Generated file. Do not edit. + +import os +from typing import Dict, Tuple, Optional, List, Any + +from itkwasm import ( + environment_dispatch, + BinaryFile, + Transform, +) + +def txt_read_transform( + serialized_transform: os.PathLike, + float_parameters: bool = False, +) -> Tuple[Any, Transform]: + """Read an transform file format and convert it to the ITK-Wasm transform file format + + :param serialized_transform: Input transform serialized in the file format + :type serialized_transform: os.PathLike + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :return: Whether the input could be read. If false, the output transform is not valid. + :rtype: Any + + :return: Output transform + :rtype: Transform + """ + func = environment_dispatch("itkwasm_transform_io", "txt_read_transform") + output = func(serialized_transform, float_parameters=float_parameters) + return output diff --git a/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/txt_read_transform_async.py b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/txt_read_transform_async.py new file mode 100644 index 000000000..89725761f --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/txt_read_transform_async.py @@ -0,0 +1,32 @@ +# Generated file. Do not edit. + +import os +from typing import Dict, Tuple, Optional, List, Any + +from itkwasm import ( + environment_dispatch, + BinaryFile, + Transform, +) + +async def txt_read_transform_async( + serialized_transform: os.PathLike, + float_parameters: bool = False, +) -> Tuple[Any, Transform]: + """Read an transform file format and convert it to the ITK-Wasm transform file format + + :param serialized_transform: Input transform serialized in the file format + :type serialized_transform: os.PathLike + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :return: Whether the input could be read. If false, the output transform is not valid. + :rtype: Any + + :return: Output transform + :rtype: Transform + """ + func = environment_dispatch("itkwasm_transform_io", "txt_read_transform_async") + output = await func(serialized_transform, float_parameters=float_parameters) + return output diff --git a/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/txt_write_transform.py b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/txt_write_transform.py new file mode 100644 index 000000000..3164ba29b --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/txt_write_transform.py @@ -0,0 +1,37 @@ +# Generated file. Do not edit. + +import os +from typing import Dict, Tuple, Optional, List, Any + +from itkwasm import ( + environment_dispatch, + Transform, + BinaryFile, +) + +def txt_write_transform( + transform: Transform, + serialized_transform: str, + float_parameters: bool = False, + use_compression: bool = False, +) -> Tuple[Any]: + """Write an ITK-Wasm transform file format converted to a transform file format + + :param transform: Input transform + :type transform: Transform + + :param serialized_transform: Output transform serialized in the file format. + :type serialized_transform: str + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :param use_compression: Use compression in the written file + :type use_compression: bool + + :return: Whether the input could be written. If false, the output transform is not valid. + :rtype: Any + """ + func = environment_dispatch("itkwasm_transform_io", "txt_write_transform") + output = func(transform, serialized_transform, float_parameters=float_parameters, use_compression=use_compression) + return output diff --git a/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/txt_write_transform_async.py b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/txt_write_transform_async.py new file mode 100644 index 000000000..ba04ddf13 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/txt_write_transform_async.py @@ -0,0 +1,37 @@ +# Generated file. Do not edit. + +import os +from typing import Dict, Tuple, Optional, List, Any + +from itkwasm import ( + environment_dispatch, + Transform, + BinaryFile, +) + +async def txt_write_transform_async( + transform: Transform, + serialized_transform: str, + float_parameters: bool = False, + use_compression: bool = False, +) -> Tuple[Any]: + """Write an ITK-Wasm transform file format converted to a transform file format + + :param transform: Input transform + :type transform: Transform + + :param serialized_transform: Output transform serialized in the file format. + :type serialized_transform: str + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :param use_compression: Use compression in the written file + :type use_compression: bool + + :return: Whether the input could be written. If false, the output transform is not valid. + :rtype: Any + """ + func = environment_dispatch("itkwasm_transform_io", "txt_write_transform_async") + output = await func(transform, serialized_transform, float_parameters=float_parameters, use_compression=use_compression) + return output diff --git a/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/wasm_read_transform.py b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/wasm_read_transform.py new file mode 100644 index 000000000..9f737872a --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/wasm_read_transform.py @@ -0,0 +1,32 @@ +# Generated file. Do not edit. + +import os +from typing import Dict, Tuple, Optional, List, Any + +from itkwasm import ( + environment_dispatch, + BinaryFile, + Transform, +) + +def wasm_read_transform( + serialized_transform: os.PathLike, + float_parameters: bool = False, +) -> Tuple[Any, Transform]: + """Read an transform file format and convert it to the ITK-Wasm transform file format + + :param serialized_transform: Input transform serialized in the file format + :type serialized_transform: os.PathLike + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :return: Whether the input could be read. If false, the output transform is not valid. + :rtype: Any + + :return: Output transform + :rtype: Transform + """ + func = environment_dispatch("itkwasm_transform_io", "wasm_read_transform") + output = func(serialized_transform, float_parameters=float_parameters) + return output diff --git a/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/wasm_read_transform_async.py b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/wasm_read_transform_async.py new file mode 100644 index 000000000..8b8c7a4bc --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/wasm_read_transform_async.py @@ -0,0 +1,32 @@ +# Generated file. Do not edit. + +import os +from typing import Dict, Tuple, Optional, List, Any + +from itkwasm import ( + environment_dispatch, + BinaryFile, + Transform, +) + +async def wasm_read_transform_async( + serialized_transform: os.PathLike, + float_parameters: bool = False, +) -> Tuple[Any, Transform]: + """Read an transform file format and convert it to the ITK-Wasm transform file format + + :param serialized_transform: Input transform serialized in the file format + :type serialized_transform: os.PathLike + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :return: Whether the input could be read. If false, the output transform is not valid. + :rtype: Any + + :return: Output transform + :rtype: Transform + """ + func = environment_dispatch("itkwasm_transform_io", "wasm_read_transform_async") + output = await func(serialized_transform, float_parameters=float_parameters) + return output diff --git a/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/wasm_write_transform.py b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/wasm_write_transform.py new file mode 100644 index 000000000..b9e5b9dcd --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/wasm_write_transform.py @@ -0,0 +1,37 @@ +# Generated file. Do not edit. + +import os +from typing import Dict, Tuple, Optional, List, Any + +from itkwasm import ( + environment_dispatch, + Transform, + BinaryFile, +) + +def wasm_write_transform( + transform: Transform, + serialized_transform: str, + float_parameters: bool = False, + use_compression: bool = False, +) -> Tuple[Any]: + """Write an ITK-Wasm transform file format converted to a transform file format + + :param transform: Input transform + :type transform: Transform + + :param serialized_transform: Output transform serialized in the file format. + :type serialized_transform: str + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :param use_compression: Use compression in the written file + :type use_compression: bool + + :return: Whether the input could be written. If false, the output transform is not valid. + :rtype: Any + """ + func = environment_dispatch("itkwasm_transform_io", "wasm_write_transform") + output = func(transform, serialized_transform, float_parameters=float_parameters, use_compression=use_compression) + return output diff --git a/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/wasm_write_transform_async.py b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/wasm_write_transform_async.py new file mode 100644 index 000000000..4b9b0bc7f --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/wasm_write_transform_async.py @@ -0,0 +1,37 @@ +# Generated file. Do not edit. + +import os +from typing import Dict, Tuple, Optional, List, Any + +from itkwasm import ( + environment_dispatch, + Transform, + BinaryFile, +) + +async def wasm_write_transform_async( + transform: Transform, + serialized_transform: str, + float_parameters: bool = False, + use_compression: bool = False, +) -> Tuple[Any]: + """Write an ITK-Wasm transform file format converted to a transform file format + + :param transform: Input transform + :type transform: Transform + + :param serialized_transform: Output transform serialized in the file format. + :type serialized_transform: str + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :param use_compression: Use compression in the written file + :type use_compression: bool + + :return: Whether the input could be written. If false, the output transform is not valid. + :rtype: Any + """ + func = environment_dispatch("itkwasm_transform_io", "wasm_write_transform_async") + output = await func(transform, serialized_transform, float_parameters=float_parameters, use_compression=use_compression) + return output diff --git a/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/wasm_zstd_read_transform.py b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/wasm_zstd_read_transform.py new file mode 100644 index 000000000..bdcbf7bc9 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/wasm_zstd_read_transform.py @@ -0,0 +1,32 @@ +# Generated file. Do not edit. + +import os +from typing import Dict, Tuple, Optional, List, Any + +from itkwasm import ( + environment_dispatch, + BinaryFile, + Transform, +) + +def wasm_zstd_read_transform( + serialized_transform: os.PathLike, + float_parameters: bool = False, +) -> Tuple[Any, Transform]: + """Read an transform file format and convert it to the ITK-Wasm transform file format + + :param serialized_transform: Input transform serialized in the file format + :type serialized_transform: os.PathLike + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :return: Whether the input could be read. If false, the output transform is not valid. + :rtype: Any + + :return: Output transform + :rtype: Transform + """ + func = environment_dispatch("itkwasm_transform_io", "wasm_zstd_read_transform") + output = func(serialized_transform, float_parameters=float_parameters) + return output diff --git a/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/wasm_zstd_read_transform_async.py b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/wasm_zstd_read_transform_async.py new file mode 100644 index 000000000..e6d89216c --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/wasm_zstd_read_transform_async.py @@ -0,0 +1,32 @@ +# Generated file. Do not edit. + +import os +from typing import Dict, Tuple, Optional, List, Any + +from itkwasm import ( + environment_dispatch, + BinaryFile, + Transform, +) + +async def wasm_zstd_read_transform_async( + serialized_transform: os.PathLike, + float_parameters: bool = False, +) -> Tuple[Any, Transform]: + """Read an transform file format and convert it to the ITK-Wasm transform file format + + :param serialized_transform: Input transform serialized in the file format + :type serialized_transform: os.PathLike + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :return: Whether the input could be read. If false, the output transform is not valid. + :rtype: Any + + :return: Output transform + :rtype: Transform + """ + func = environment_dispatch("itkwasm_transform_io", "wasm_zstd_read_transform_async") + output = await func(serialized_transform, float_parameters=float_parameters) + return output diff --git a/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/wasm_zstd_write_transform.py b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/wasm_zstd_write_transform.py new file mode 100644 index 000000000..4c5f85141 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/wasm_zstd_write_transform.py @@ -0,0 +1,37 @@ +# Generated file. Do not edit. + +import os +from typing import Dict, Tuple, Optional, List, Any + +from itkwasm import ( + environment_dispatch, + Transform, + BinaryFile, +) + +def wasm_zstd_write_transform( + transform: Transform, + serialized_transform: str, + float_parameters: bool = False, + use_compression: bool = False, +) -> Tuple[Any]: + """Write an ITK-Wasm transform file format converted to a transform file format + + :param transform: Input transform + :type transform: Transform + + :param serialized_transform: Output transform serialized in the file format. + :type serialized_transform: str + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :param use_compression: Use compression in the written file + :type use_compression: bool + + :return: Whether the input could be written. If false, the output transform is not valid. + :rtype: Any + """ + func = environment_dispatch("itkwasm_transform_io", "wasm_zstd_write_transform") + output = func(transform, serialized_transform, float_parameters=float_parameters, use_compression=use_compression) + return output diff --git a/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/wasm_zstd_write_transform_async.py b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/wasm_zstd_write_transform_async.py new file mode 100644 index 000000000..474e7ccd9 --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/itkwasm_transform_io/wasm_zstd_write_transform_async.py @@ -0,0 +1,37 @@ +# Generated file. Do not edit. + +import os +from typing import Dict, Tuple, Optional, List, Any + +from itkwasm import ( + environment_dispatch, + Transform, + BinaryFile, +) + +async def wasm_zstd_write_transform_async( + transform: Transform, + serialized_transform: str, + float_parameters: bool = False, + use_compression: bool = False, +) -> Tuple[Any]: + """Write an ITK-Wasm transform file format converted to a transform file format + + :param transform: Input transform + :type transform: Transform + + :param serialized_transform: Output transform serialized in the file format. + :type serialized_transform: str + + :param float_parameters: Use float for the parameter value type. The default is double. + :type float_parameters: bool + + :param use_compression: Use compression in the written file + :type use_compression: bool + + :return: Whether the input could be written. If false, the output transform is not valid. + :rtype: Any + """ + func = environment_dispatch("itkwasm_transform_io", "wasm_zstd_write_transform_async") + output = await func(transform, serialized_transform, float_parameters=float_parameters, use_compression=use_compression) + return output diff --git a/packages/transform-io/python/itkwasm-transform-io/pyproject.toml b/packages/transform-io/python/itkwasm-transform-io/pyproject.toml new file mode 100644 index 000000000..e8e4d26ab --- /dev/null +++ b/packages/transform-io/python/itkwasm-transform-io/pyproject.toml @@ -0,0 +1,62 @@ +[build-system] +requires = ["hatchling", "hatch-vcs"] +build-backend = "hatchling.build" + +[project] +name = "itkwasm-transform-io" +readme = "README.md" +license = "Apache-2.0" +dynamic = ["version"] +description = "Input and output for scientific and medical coordinate transform file formats." +classifiers = [ + "License :: OSI Approved :: Apache Software License", + "Programming Language :: Python", + "Programming Language :: C++", + "Environment :: WebAssembly", + "Environment :: WebAssembly :: Emscripten", + "Environment :: WebAssembly :: WASI", + "Development Status :: 3 - Alpha", + "Intended Audience :: Developers", + "Intended Audience :: Science/Research", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", +] +keywords = [ + "itkwasm", + "webassembly", + "wasi", + "emscripten", +] + +requires-python = ">=3.8" +dependencies = [ + "itkwasm >= 1.0.b171", + "itkwasm-transform-io-wasi; sys_platform != \"emscripten\"", + "itkwasm-transform-io-emscripten; sys_platform == \"emscripten\"", + +] + +[tool.hatch.version] +path = "itkwasm_transform_io/_version.py" + +[tool.hatch.envs.default] +dependencies = [ + "pytest", +] + +[project.urls] +Home = "https://github.com/InsightSoftwareConsortium/ITK-Wasm" +Source = "https://github.com/InsightSoftwareConsortium/ITK-Wasm" + +[tool.hatch.envs.default.scripts] +test = "pytest" + + +[tool.hatch.build] +exclude = [ + "/examples", +] diff --git a/pixi.lock b/pixi.lock index 562f281c4..752af59ee 100644 --- a/pixi.lock +++ b/pixi.lock @@ -10,42 +10,46 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/jq-1.7.1-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-hc0a3c3a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.48.0-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nodejs-22.6.0-hc19f0b3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/oniguruma-6.9.9-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4bc722e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pnpm-9.7.1-hd01b415_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pnpm-9.12.2-h6417eb3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2024.7.4-hcefe29a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/jq-1.7.1-h31becfc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.1.0-he277a41_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.1.0-he277a41_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.1.0-h3f4de04_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.48.0-h31becfc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h68df207_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-22.6.0-h9de0dd0_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/oniguruma-6.9.9-h31becfc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.3.1-h68df207_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pnpm-9.7.1-hf3eb513_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pnpm-9.12.2-hbf5023e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h68df207_1.conda osx-arm64: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.7.4-hf0a4a13_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-73.2-hc8870d7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jq-1.7.1-h93a5062_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-18.1.8-h5a72898_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.48.0-h93a5062_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-hfb2fe0b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-22.6.0-h3fe1c63_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-22.9.0-h08fde81_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/oniguruma-6.9.9-h93a5062_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.1-hfb2fe0b_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pnpm-9.7.1-h9e09532_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.2-h8359307_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pnpm-9.12.2-hef028c3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-hfb2fe0b_1.conda win-64: - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libgfortran-5.3.0-6.tar.bz2 @@ -56,8 +60,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-oniguruma-6.9.5-h301d43c_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-22.6.0-h57928b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pnpm-9.7.1-haa868a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-22.9.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pnpm-9.12.2-haa868a1_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h8a93ad2_20.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.40.33810-ha82c5b3_20.conda @@ -94,14 +98,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-12.4.0-ha4f9413_100.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-12.4.0-h46f95d5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-12.4.0-ha4f9413_100.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-hc0a3c3a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.48.0-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda @@ -109,7 +115,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/nodejs-22.6.0-hc19f0b3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/oniguruma-6.9.9-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4bc722e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pnpm-9.7.1-hd01b415_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pnpm-9.12.2-h6417eb3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.4-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h4a8ded7_16.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda @@ -144,14 +150,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.2-h2f0025b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-12.4.0-h7b3af7c_100.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.1.0-he277a41_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.1.0-he277a41_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.58.0-hb0e430d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-12.4.0-h469570c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.0-h492db2e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-12.4.0-h7b3af7c_100.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.1.0-h3f4de04_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.48.0-h31becfc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h68df207_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-h0425590_0.conda @@ -159,7 +167,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-22.6.0-h9de0dd0_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/oniguruma-6.9.9-h31becfc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.3.1-h68df207_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pnpm-9.7.1-hf3eb513_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pnpm-9.12.2-hbf5023e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rhash-1.4.4-h31becfc_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.17-h5b4a56d_16.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda @@ -184,7 +192,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt-16.0.6-h3808999_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-arm64-16.0.6-h3808999_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cxx-compiler-1.7.0-h2ffa867_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-73.2-hc8870d7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jq-1.7.1-h93a5062_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-711-h634c8be_3.conda @@ -200,16 +208,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.58.0-ha4dd798_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.0-h7a5bd25_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.48.0-h93a5062_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.7-h9a80f22_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.7-h01dff8b_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-hfb2fe0b_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-18.1.8-hde57baf_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-16.0.6-haab561b_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.12.1-h420ef59_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-22.6.0-h3fe1c63_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-22.9.0-h08fde81_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/oniguruma-6.9.9-h93a5062_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.1-hfb2fe0b_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pnpm-9.7.1-h9e09532_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.2-h8359307_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pnpm-9.12.2-hef028c3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rhash-1.4.4-hb547adb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-0.1.3-h44b9a77_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1100.0.11-he4954df_0.tar.bz2 @@ -236,9 +244,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-oniguruma-6.9.5-h301d43c_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.12.1-hc790b64_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-22.6.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-22.9.0-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.1-h2466b09_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pnpm-9.7.1-haa868a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pnpm-9.12.2-haa868a1_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h8a93ad2_20.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.40.33810-ha82c5b3_20.conda @@ -1178,18 +1186,6 @@ packages: license_family: BSD size: 29952 timestamp: 1721141565277 -- kind: conda - name: icu - version: '73.2' - build: hc8870d7_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/icu-73.2-hc8870d7_0.conda - sha256: ff9cd0c6cd1349954c801fb443c94192b637e1b414514539f3c49c56a39f51b1 - md5: 8521bd47c0e11c5902535bb1a17c565f - license: MIT - license_family: MIT - size: 11997841 - timestamp: 1692902104771 - kind: conda name: icu version: '75.1' @@ -1221,6 +1217,20 @@ packages: license_family: MIT size: 12282786 timestamp: 1720853454991 +- kind: conda + name: icu + version: '75.1' + build: hfee45f7_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + sha256: 9ba12c93406f3df5ab0a43db8a4b4ef67a5871dfd401010fbe29b218b2cbe620 + md5: 5eb22c1d7b3fc4abb50d92d621583137 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 11857802 + timestamp: 1720853997952 - kind: conda name: jq version: 1.7.1 @@ -1736,6 +1746,43 @@ packages: license_family: MIT size: 63655 timestamp: 1710362424980 +- kind: conda + name: libgcc + version: 14.2.0 + build: h77fa898_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda + sha256: 53eb8a79365e58849e7b1a068d31f4f9e718dc938d6f2c03e960345739a03569 + md5: 3cb76c3f10d3bc7f1105b2fc9db984df + depends: + - _libgcc_mutex 0.1 conda_forge + - _openmp_mutex >=4.5 + constrains: + - libgomp 14.2.0 h77fa898_1 + - libgcc-ng ==14.2.0=*_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 848745 + timestamp: 1729027721139 +- kind: conda + name: libgcc + version: 14.2.0 + build: he277a41_1 + build_number: 1 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_1.conda + sha256: 5d56757ccad208c79214395b00d006d8d18929a4ba49c47bd9460789a7620943 + md5: 511b511c5445e324066c3377481bcab8 + depends: + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==14.2.0=*_1 + - libgomp 14.2.0 he277a41_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 535243 + timestamp: 1729089435134 - kind: conda name: libgcc-devel_linux-64 version: 12.4.0 @@ -1770,63 +1817,62 @@ packages: timestamp: 1719546505941 - kind: conda name: libgcc-ng - version: 14.1.0 - build: h77fa898_0 + version: 14.2.0 + build: h69a702a_1 + build_number: 1 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda - sha256: b8e869ac96591cda2704bf7e77a301025e405227791a0bddf14a3dac65125538 - md5: ca0fad6a41ddaef54a153b78eccb5037 + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda + sha256: 3a76969c80e9af8b6e7a55090088bc41da4cffcde9e2c71b17f44d37b7cb87f7 + md5: e39480b9ca41323497b05492a63bc35b depends: - - _libgcc_mutex 0.1 conda_forge - - _openmp_mutex >=4.5 - constrains: - - libgomp 14.1.0 h77fa898_0 + - libgcc 14.2.0 h77fa898_1 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 842109 - timestamp: 1719538896937 + size: 54142 + timestamp: 1729027726517 - kind: conda name: libgcc-ng - version: 14.1.0 - build: he277a41_0 + version: 14.2.0 + build: he9431aa_1 + build_number: 1 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.1.0-he277a41_0.conda - sha256: b9ca03216bc089c0c46f008bc6f447bc0df8dc826d9801fb4283e49fa89c877e - md5: 47ecd1292a3fd78b616640b35dd9632c + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_1.conda + sha256: 9b5cf168a6c7361cae869cb74b716766ee7c6d6b3f6172b32ba9bf91135efdc4 + md5: 0694c249c61469f2c0f7e2990782af21 depends: - - _openmp_mutex >=4.5 - constrains: - - libgomp 14.1.0 he277a41_0 + - libgcc 14.2.0 he277a41_1 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 532273 - timestamp: 1719547536460 + size: 54104 + timestamp: 1729089444587 - kind: conda name: libgomp - version: 14.1.0 - build: h77fa898_0 + version: 14.2.0 + build: h77fa898_1 + build_number: 1 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda - sha256: 7699df61a1f6c644b3576a40f54791561f2845983120477a16116b951c9cdb05 - md5: ae061a5ed5f05818acdf9adab72c146d + url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda + sha256: 1911c29975ec99b6b906904040c855772ccb265a1c79d5d75c8ceec4ed89cd63 + md5: cc3573974587f12dda90d96e3e55a702 depends: - _libgcc_mutex 0.1 conda_forge license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 456925 - timestamp: 1719538796073 + size: 460992 + timestamp: 1729027639220 - kind: conda name: libgomp - version: 14.1.0 - build: he277a41_0 + version: 14.2.0 + build: he277a41_1 + build_number: 1 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.1.0-he277a41_0.conda - sha256: 11f326e49e0fb92c2a52e870c029fc26b4b6d3eb9414fa4374cb8496b231a730 - md5: 434ccc943b843117e4cebc97265f2504 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_1.conda + sha256: 5aa53874a5e57a00f2e0c2e2910684eb674429cd5fcb803619b226a73e89aedf + md5: 376f0e73abbda6d23c0cb749adc195ef license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 459535 - timestamp: 1719547432949 + size: 463521 + timestamp: 1729089357313 - kind: conda name: libiconv version: '1.17' @@ -2015,6 +2061,36 @@ packages: license_family: BSD size: 266806 timestamp: 1685838242099 +- kind: conda + name: libstdcxx + version: 14.2.0 + build: h3f4de04_1 + build_number: 1 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_1.conda + sha256: 519556d2c93f1b487091ce046d62e762286177f4a670ec10e16005177d0bcab3 + md5: 37f489acd39e22b623d2d1e5ac6d195c + depends: + - libgcc 14.2.0 he277a41_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3816794 + timestamp: 1729089463404 +- kind: conda + name: libstdcxx + version: 14.2.0 + build: hc0a3c3a_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda + sha256: 4661af0eb9bdcbb5fb33e5d0023b001ad4be828fccdcc56500059d56f9869462 + md5: 234a5554c53625688d51062645337328 + depends: + - libgcc 14.2.0 h77fa898_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3893695 + timestamp: 1729027746910 - kind: conda name: libstdcxx-devel_linux-64 version: 12.4.0 @@ -2049,32 +2125,34 @@ packages: timestamp: 1719546598548 - kind: conda name: libstdcxx-ng - version: 14.1.0 - build: h3f4de04_0 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.1.0-h3f4de04_0.conda - sha256: 4f2f35b78258d1a1e56b1b0e61091862c10ec76bf67ca1b0ff99dd5e07e76271 - md5: 2f84852b723ac4389eb188db695526bb + version: 14.2.0 + build: h4852527_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda + sha256: 25bb30b827d4f6d6f0522cc0579e431695503822f144043b93c50237017fffd8 + md5: 8371ac6457591af2cf6159439c1fd051 depends: - - libgcc-ng 14.1.0 he277a41_0 + - libstdcxx 14.2.0 hc0a3c3a_1 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 3805250 - timestamp: 1719547563542 + size: 54105 + timestamp: 1729027780628 - kind: conda name: libstdcxx-ng - version: 14.1.0 - build: hc0a3c3a_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-hc0a3c3a_0.conda - sha256: 88c42b388202ffe16adaa337e36cf5022c63cf09b0405cf06fc6aeacccbe6146 - md5: 1cb187a157136398ddbaae90713e2498 + version: 14.2.0 + build: hf1166c9_1 + build_number: 1 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_1.conda + sha256: 9f97461bd55a2745a7a0941f3502a047f15bfe7bb2952dc7fb204b3202f866fd + md5: 0e75771b8a03afae5a2c6ce71bc733f5 depends: - - libgcc-ng 14.1.0 h77fa898_0 + - libstdcxx 14.2.0 h3f4de04_1 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 3881307 - timestamp: 1719538923443 + size: 54133 + timestamp: 1729089498541 - kind: conda name: libuv version: 1.48.0 @@ -2134,22 +2212,22 @@ packages: - kind: conda name: libxml2 version: 2.12.7 - build: h9a80f22_3 - build_number: 3 + build: h01dff8b_4 + build_number: 4 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.7-h9a80f22_3.conda - sha256: 760d05981dd32d55ee820a0f35f714a7af32c1c4cc209bf705a0ede93d5bd683 - md5: 705829a78a7ce3dff19a967f0f0f5ed3 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.7-h01dff8b_4.conda + sha256: a9a76cdc6e93c0182bc2ac58b1ea0152be1a16a5d23f4dc7b8df282a7aef8d20 + md5: 1265488dc5035457b729583119ad4a1b depends: - __osx >=11.0 - - icu >=73.2,<74.0a0 + - icu >=75.1,<76.0a0 - libiconv >=1.17,<2.0a0 - libzlib >=1.3.1,<2.0a0 - xz >=5.2.6,<6.0a0 license: MIT license_family: MIT - size: 588441 - timestamp: 1720772863811 + size: 588990 + timestamp: 1721031045514 - kind: conda name: libzlib version: 1.3.1 @@ -2475,38 +2553,6 @@ packages: license_family: Apache size: 285150 timestamp: 1715441052517 -- kind: conda - name: nodejs - version: 22.6.0 - build: h3fe1c63_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-22.6.0-h3fe1c63_0.conda - sha256: 5040a3eb5fbabffc4ede60bc9e5995f2ea9a8734cad1322d1a48f1caaccc2218 - md5: b10d3b0aff561dc9cbc1862b86c63dc9 - depends: - - __osx >=11.0 - - icu >=73.2,<74.0a0 - - libcxx >=16 - - libuv >=1.48.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.3.1,<4.0a0 - - zlib - license: MIT - license_family: MIT - size: 14979112 - timestamp: 1723459472040 -- kind: conda - name: nodejs - version: 22.6.0 - build: h57928b3_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/nodejs-22.6.0-h57928b3_0.conda - sha256: 25f9a918c46b8693f6d8d2bb762b4e7ac6a51ad52cb80d871ab1e03cad6e0be3 - md5: f12520282e58de634bd76364750204c3 - license: MIT - license_family: MIT - size: 26272873 - timestamp: 1723444186322 - kind: conda name: nodejs version: 22.6.0 @@ -2550,6 +2596,38 @@ packages: license_family: MIT size: 21337290 timestamp: 1723482049816 +- kind: conda + name: nodejs + version: 22.9.0 + build: h08fde81_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-22.9.0-h08fde81_0.conda + sha256: 736a4738aba32a03401aa25c8f740e4afe4aea02bc06651b59b06f0fdc024fdf + md5: 3771a3a6abe5a8db8910d5ebf144811b + depends: + - __osx >=11.0 + - icu >=75.1,<76.0a0 + - libcxx >=17 + - libuv >=1.48.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + - zlib + license: MIT + license_family: MIT + size: 14859715 + timestamp: 1726671037225 +- kind: conda + name: nodejs + version: 22.9.0 + build: h57928b3_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/nodejs-22.9.0-h57928b3_0.conda + sha256: 6d74f0dbb91eb2049199ba801a3db67965f990aef44084f9ae51a1f70c2996f6 + md5: 6aa54ed90a643a11a005491ff316b1c4 + license: MIT + license_family: MIT + size: 25378221 + timestamp: 1726657153171 - kind: conda name: oniguruma version: 6.9.9 @@ -2649,87 +2727,85 @@ packages: timestamp: 1721194625490 - kind: conda name: openssl - version: 3.3.1 - build: hfb2fe0b_2 - build_number: 2 + version: 3.3.2 + build: h8359307_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.1-hfb2fe0b_2.conda - sha256: dd7d988636f74473ebdfe15e05c5aabdb53a1d2a846c839d62289b0c37f81548 - md5: 9b551a504c1cc8f8b7b22c01814da8ba + url: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.2-h8359307_0.conda + sha256: 940fa01c4dc6152158fe8943e05e55a1544cab639df0994e3b35937839e4f4d1 + md5: 1773ebccdc13ec603356e8ff1db9e958 depends: - __osx >=11.0 - ca-certificates - constrains: - - pyopenssl >=22.1 license: Apache-2.0 license_family: Apache - size: 2899682 - timestamp: 1721194599446 + size: 2882450 + timestamp: 1725410638874 - kind: conda name: pnpm - version: 9.7.1 - build: h9e09532_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/pnpm-9.7.1-h9e09532_0.conda - sha256: 674e6da7af1b4cf0f077e8e6e2824816328c1d04806e944f9e32ae058ff5aaaf - md5: 853389609f0d27c9f273973febc7998f + version: 9.12.2 + build: h6417eb3_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pnpm-9.12.2-h6417eb3_0.conda + sha256: 0caf7ddacb1d8adb16144a93cfaf7a70bff2f83e22cbaae4d3d91b71f28f9caf + md5: 711bc7fb6b870f4b5b180c181786d710 depends: - - __osx >=11.0 - - libcxx >=16 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 - nodejs >=22.6.0,<23.0a0 license: MIT license_family: MIT - size: 3299153 - timestamp: 1723673752661 + size: 3466596 + timestamp: 1729713864150 - kind: conda name: pnpm - version: 9.7.1 + version: 9.12.2 build: haa868a1_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/pnpm-9.7.1-haa868a1_0.conda - sha256: 2baab9ecaf70ca38b966ad3924e1aaecf91b13f9eb529b74ae4ae73b08091d2d - md5: 907e76d62af51a70567a872673985488 + url: https://conda.anaconda.org/conda-forge/win-64/pnpm-9.12.2-haa868a1_0.conda + sha256: ce0c2e4268cd81308b8c069564b9f7885d9c21ddd8b83120f0fabc66d9ab58d3 + md5: c70ffc202c1f5d9223a13a12310c874d depends: - - nodejs >=22.6.0,<23.0a0 + - nodejs >=22.9.0,<23.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: MIT license_family: MIT - size: 3157775 - timestamp: 1723674598787 + size: 3319869 + timestamp: 1729714702980 - kind: conda name: pnpm - version: 9.7.1 - build: hd01b415_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pnpm-9.7.1-hd01b415_0.conda - sha256: 9a262ff56c0e9a0dcd2dbf57697afa23624bdd1d35998cde298e0face15f4979 - md5: 9dab4666f729e6e230548a22e1fa7951 + version: 9.12.2 + build: hbf5023e_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/pnpm-9.12.2-hbf5023e_0.conda + sha256: aa25e9d0085be78115c5104ff905f9930d8585901a7a8d7278083f87ff4f6d25 + md5: 15d1e168a06119b34c9bd39187ce2af3 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc-ng >=12 - - libstdcxx-ng >=12 + - libgcc >=13 + - libstdcxx >=13 - nodejs >=22.6.0,<23.0a0 license: MIT - size: 3279113 - timestamp: 1723673549711 + license_family: MIT + size: 3516854 + timestamp: 1729713906302 - kind: conda name: pnpm - version: 9.7.1 - build: hf3eb513_0 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/pnpm-9.7.1-hf3eb513_0.conda - sha256: f2361df1450f0219f876ca618c204a8ac31cafcfb682b0e43d4f5e7f2827d69f - md5: 644021aba5d0a8db61f064fbd785aded + version: 9.12.2 + build: hef028c3_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/pnpm-9.12.2-hef028c3_0.conda + sha256: 6fd70df2e5e5a25aede2dfadd17530b2e7ecc0c41da43af89efd09dbbda8ca38 + md5: 8a157c984a8e384507438d62275868d5 depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - nodejs >=22.6.0,<23.0a0 + - __osx >=11.0 + - libcxx >=17 + - nodejs >=22.9.0,<23.0a0 license: MIT license_family: MIT - size: 3193696 - timestamp: 1723673645383 + size: 3473615 + timestamp: 1729714099186 - kind: conda name: rhash version: 1.4.4 diff --git a/pixi.toml b/pixi.toml index 97eaa5b19..cfd90a192 100644 --- a/pixi.toml +++ b/pixi.toml @@ -11,9 +11,23 @@ readme = "README.md" [activation] scripts = ["itk_wasm_env.bash"] -[tasks] -clean = "git clean -fdx" -pnpm-install = { cmd = "pnpm install", description = "Install Node.js dependencies" } +[tasks.clean] +cmd = "git clean -fdx" +description = "Clean the workspace from build artifacts" + +[tasks.pnpm-install] +cmd = "pnpm install" +description = "Install Node.js dependencies" + +[tasks.build] +cmd = "pnpm run build" +description = "Build ITK-Wasm" +depends-on = ["pnpm-install", "build-itk-wasm", "build-native-compare-images", "build-native-compare-meshes", "build-native-compress-stringify", "build-native-dicom", "build-native-downsample", "build-native-mesh-io", "build-native-transform-io"] + +[tasks.test] +cmd = "pnpm run test" +description = "Test ITK-Wasm" +depends-on = ["test-itk-wasm", "test-native-compare-images", "test-native-compare-meshes", "test-native-compress-stringify", "test-native-dicom", "test-native-downsample", "test-native-mesh-io", "test-native-transform-io"] [tasks.compare-images-test-data-download] cmd = "npx dam download test/data test/data.tar.gz $ITK_WASM_COMPARE_IMAGES_TEST_DATA_HASH $ITK_WASM_COMPARE_IMAGES_TEST_DATA_URLS" @@ -57,6 +71,13 @@ depends-on = ["pnpm-install"] outputs = ["packages/mesh-io/test/data.tar.gz"] description = "Download mesh-io test data" +[tasks.transform-io-test-data-download] +cmd = "npx dam download test/data test/data.tar.gz $ITK_WASM_TRANSFORM_IO_TEST_DATA_HASH $ITK_WASM_TRANSFORM_IO_TEST_DATA_URLS" +cwd = "packages/transform-io" +depends-on = ["pnpm-install"] +outputs = ["packages/transform-io/test/data.tar.gz"] +description = "Download transform-io test data" + [tasks.export-itk-wasm-env-vars] cmd = "bash -c ./itk_wasm_env.bash && env | grep ITK_WASM | grep -v TEST > ./src/docker/itk-wasm-base/itk_wasm_env_vars.sh" outputs = ["src/docker/itk-wasm-base/itk_wasm_env_vars.*"] @@ -74,7 +95,7 @@ description = "Build the ITK-Wasm docker images" depends-on = ["clean", "export-itk-wasm-env-vars", "update-default-image-tag"] [dependencies] -pnpm = ">=9.7.1,<10" +pnpm = ">=9.12.2,<10" nodejs = ">=22.6.0,<23" [target.win-64.dependencies] @@ -130,7 +151,8 @@ cmd = '''cmake -B$ITK_WASM_ITK_BUILD_DIR -S$ITK_WASM_ITK_SOURCE_DIR -GNinja -DModule_TotalVariation:BOOL=ON -DModule_IOMeshSTL:BOOL=ON -DModule_GenericLabelInterpolator:BOOL=ON - -DModule_MeshToPolyData=ON + -DModule_MeshToPolyData:BOOL=ON + -DModule_ITKIOTransformMINC:BOOL=ON -DDO_NOT_BUILD_ITK_TEST_DRIVER:BOOL=ON -DOPJ_USE_THREAD:BOOL=OFF -DDCMTK_WITH_THREADS:BOOL=OFF @@ -289,6 +311,26 @@ cmd = "ctest --test-dir $ITK_WASM_NATIVE_WORKSPACE/mesh-io-build" depends-on = ["build-native-mesh-io"] description = "Test mesh-io native binaries" +[feature.native.tasks.configure-native-transform-io] +cmd = '''cmake -B$ITK_WASM_NATIVE_WORKSPACE/transform-io-build -Spackages/transform-io -GNinja + -DITK_DIR:PATH=$ITK_WASM_ITK_BUILD_DIR + -DBUILD_TESTING:BOOL=ON + -DCMAKE_CXX_STANDARD:STRING=20 + -DCMAKE_BUILD_TYPE:STRING=Debug''' +depends-on = ["build-itk-wasm", "transform-io-test-data-download"] +outputs = ["native/transform-io-build/CMakeFiles/"] +description = "Configure transform-io native binaries" + +[feature.native.tasks.build-native-transform-io] +cmd = "cmake --build $ITK_WASM_NATIVE_WORKSPACE/transform-io-build" +depends-on = ["configure-native-transform-io"] +description = "Build transform-io native binaries" + +[feature.native.tasks.test-native-transform-io] +cmd = "ctest --test-dir $ITK_WASM_NATIVE_WORKSPACE/transform-io-build" +depends-on = ["build-native-transform-io"] +description = "Test transform-io native binaries" + [feature.native.dependencies] cmake = ">=3.30.2,<4" cxx-compiler = ">=1.7.0,<2"